{
  "version": 3,
  "sources": ["../data.js", "../platform.js", "../asmCrypto.js", "../miiCrypto.js", "../node_modules/lodash/lodash.js", "../node_modules/jsqr/dist/jsQR.js", "webpack://QRCodeStyling/webpack/universalModuleDefinition", "webpack://QRCodeStyling/node_modules/qrcode-generator/qrcode.js", "webpack://QRCodeStyling/webpack/bootstrap", "webpack://QRCodeStyling/webpack/runtime/compat%20get%20default%20export", "webpack://QRCodeStyling/webpack/runtime/define%20property%20getters", "webpack://QRCodeStyling/webpack/runtime/hasOwnProperty%20shorthand", "webpack://QRCodeStyling/src/constants/modes.ts", "webpack://QRCodeStyling/src/tools/merge.ts", "webpack://QRCodeStyling/src/tools/downloadURI.ts", "webpack://QRCodeStyling/src/constants/errorCorrectionPercents.ts", "webpack://QRCodeStyling/src/figures/dot/QRDot.ts", "webpack://QRCodeStyling/src/constants/dotTypes.ts", "webpack://QRCodeStyling/src/constants/cornerSquareTypes.ts", "webpack://QRCodeStyling/src/figures/cornerSquare/QRCornerSquare.ts", "webpack://QRCodeStyling/src/constants/cornerDotTypes.ts", "webpack://QRCodeStyling/src/figures/cornerDot/QRCornerDot.ts", "webpack://QRCodeStyling/src/constants/gradientTypes.ts", "webpack://QRCodeStyling/src/constants/shapeTypes.ts", "webpack://QRCodeStyling/src/core/QRSVG.ts", "webpack://QRCodeStyling/src/tools/calculateImageSize.ts", "webpack://QRCodeStyling/src/tools/toDataUrl.ts", "webpack://QRCodeStyling/src/constants/drawTypes.ts", "webpack://QRCodeStyling/src/constants/qrTypes.ts", "webpack://QRCodeStyling/src/core/QROptions.ts", "webpack://QRCodeStyling/src/constants/errorCorrectionLevels.ts", "webpack://QRCodeStyling/src/tools/sanitizeOptions.ts", "webpack://QRCodeStyling/src/tools/getMimeType.ts", "webpack://QRCodeStyling/src/core/QRCodeStyling.ts", "webpack://QRCodeStyling/src/tools/getMode.ts", "webpack://QRCodeStyling/src/index.ts", "../node_modules/three/build/three.core.js", "../node_modules/three/build/three.module.js", "../node_modules/three/examples/jsm/animation/AnimationClipCreator.js", "../node_modules/three/examples/jsm/animation/CCDIKSolver.js", "../node_modules/three/examples/jsm/controls/ArcballControls.js", "../node_modules/three/examples/jsm/controls/DragControls.js", "../node_modules/three/examples/jsm/controls/FirstPersonControls.js", "../node_modules/three/examples/jsm/controls/FlyControls.js", "../node_modules/three/examples/jsm/controls/OrbitControls.js", "../node_modules/three/examples/jsm/controls/MapControls.js", "../node_modules/three/examples/jsm/controls/PointerLockControls.js", "../node_modules/three/examples/jsm/controls/TrackballControls.js", "../node_modules/three/examples/jsm/controls/TransformControls.js", "../node_modules/three/examples/jsm/csm/CSMFrustum.js", "../node_modules/three/examples/jsm/csm/CSMShader.js", "../node_modules/three/examples/jsm/csm/CSM.js", "../node_modules/three/examples/jsm/csm/CSMHelper.js", "../node_modules/three/examples/jsm/curves/CurveExtras.js", "../node_modules/three/examples/jsm/curves/NURBSUtils.js", "../node_modules/three/examples/jsm/curves/NURBSCurve.js", "../node_modules/three/examples/jsm/curves/NURBSSurface.js", "../node_modules/three/examples/jsm/curves/NURBSVolume.js", "../node_modules/three/examples/jsm/postprocessing/Pass.js", "../node_modules/three/examples/jsm/effects/AnaglyphEffect.js", "../node_modules/three/examples/jsm/effects/AsciiEffect.js", "../node_modules/three/examples/jsm/effects/OutlineEffect.js", "../node_modules/three/examples/jsm/effects/ParallaxBarrierEffect.js", "../node_modules/three/examples/jsm/effects/StereoEffect.js", "../node_modules/three/examples/jsm/environments/DebugEnvironment.js", "../node_modules/three/examples/jsm/environments/RoomEnvironment.js", "../node_modules/three/examples/jsm/exporters/DRACOExporter.js", "../node_modules/three/examples/jsm/exporters/EXRExporter.js", "../node_modules/three/examples/jsm/exporters/GLTFExporter.js", "../node_modules/three/examples/jsm/libs/ktx-parse.module.js", "../node_modules/three/examples/jsm/exporters/KTX2Exporter.js", "../node_modules/three/examples/jsm/exporters/OBJExporter.js", "../node_modules/three/examples/jsm/exporters/PLYExporter.js", "../node_modules/three/examples/jsm/exporters/STLExporter.js", "../node_modules/three/examples/jsm/exporters/USDZExporter.js", "../node_modules/three/examples/jsm/geometries/BoxLineGeometry.js", "../node_modules/three/examples/jsm/math/ConvexHull.js", "../node_modules/three/examples/jsm/geometries/ConvexGeometry.js", "../node_modules/three/examples/jsm/geometries/DecalGeometry.js", "../node_modules/three/examples/jsm/geometries/ParametricFunctions.js", "../node_modules/three/examples/jsm/geometries/ParametricGeometry.js", "../node_modules/three/examples/jsm/geometries/RoundedBoxGeometry.js", "../node_modules/three/examples/jsm/geometries/TeapotGeometry.js", "../node_modules/three/examples/jsm/geometries/TextGeometry.js", "../node_modules/three/examples/jsm/helpers/LightProbeHelper.js", "../node_modules/three/examples/jsm/helpers/OctreeHelper.js", "../node_modules/three/examples/jsm/helpers/PositionalAudioHelper.js", "../node_modules/three/examples/jsm/helpers/RectAreaLightHelper.js", "../node_modules/three/examples/jsm/utils/BufferGeometryUtils.js", "../node_modules/three/examples/jsm/helpers/TextureHelper.js", "../node_modules/three/examples/jsm/helpers/VertexNormalsHelper.js", "../node_modules/three/examples/jsm/helpers/VertexTangentsHelper.js", "../node_modules/three/examples/jsm/helpers/ViewHelper.js", "../node_modules/three/examples/jsm/interactive/HTMLMesh.js", "../node_modules/three/examples/jsm/interactive/InteractiveGroup.js", "../node_modules/three/examples/jsm/interactive/SelectionBox.js", "../node_modules/three/examples/jsm/interactive/SelectionHelper.js", "../node_modules/three/examples/jsm/lights/LightProbeGenerator.js", "../node_modules/three/examples/jsm/lights/RectAreaLightTexturesLib.js", "../node_modules/three/examples/jsm/lights/RectAreaLightUniformsLib.js", "../node_modules/three/examples/jsm/lines/LineSegmentsGeometry.js", "../node_modules/three/examples/jsm/lines/LineMaterial.js", "../node_modules/three/examples/jsm/lines/LineSegments2.js", "../node_modules/three/examples/jsm/lines/LineGeometry.js", "../node_modules/three/examples/jsm/lines/Line2.js", "../node_modules/three/examples/jsm/lines/Wireframe.js", "../node_modules/three/examples/jsm/lines/WireframeGeometry2.js", "../node_modules/three/examples/jsm/loaders/EXRLoader.js", "../node_modules/three/examples/jsm/loaders/3DMLoader.js", "../node_modules/three/examples/jsm/loaders/3MFLoader.js", "../node_modules/three/examples/jsm/loaders/AMFLoader.js", "../node_modules/three/examples/jsm/loaders/BVHLoader.js", "../node_modules/three/examples/jsm/loaders/TGALoader.js", "../node_modules/three/examples/jsm/loaders/ColladaLoader.js", "../node_modules/three/examples/jsm/loaders/DDSLoader.js", "../node_modules/three/examples/jsm/loaders/DRACOLoader.js", "../node_modules/three/examples/jsm/loaders/FBXLoader.js", "../node_modules/three/examples/jsm/loaders/FontLoader.js", "../node_modules/three/examples/jsm/loaders/GCodeLoader.js", "../node_modules/three/examples/jsm/loaders/GLTFLoader.js", "../node_modules/three/examples/jsm/loaders/HDRLoader.js", "../node_modules/three/examples/jsm/loaders/HDRCubeTextureLoader.js", "../node_modules/three/examples/jsm/loaders/IESLoader.js", "../node_modules/three/examples/jsm/loaders/KMZLoader.js", "../node_modules/three/examples/jsm/utils/WorkerPool.js", "../node_modules/three/examples/jsm/libs/zstddec.module.js", "../node_modules/three/examples/jsm/math/ColorSpaces.js", "../node_modules/three/examples/jsm/loaders/KTX2Loader.js", "../node_modules/three/examples/jsm/loaders/KTXLoader.js", "../node_modules/three/examples/jsm/loaders/LDrawLoader.js", "../node_modules/three/examples/jsm/loaders/LUT3dlLoader.js", "../node_modules/three/examples/jsm/loaders/LUTCubeLoader.js", "../node_modules/three/examples/jsm/loaders/LWOLoader.js", "../node_modules/three/examples/jsm/loaders/LottieLoader.js", "../node_modules/three/examples/jsm/loaders/MD2Loader.js", "../node_modules/three/examples/jsm/loaders/MDDLoader.js", "../node_modules/three/examples/jsm/loaders/MTLLoader.js", "../node_modules/three/examples/jsm/misc/VolumeSlice.js", "../node_modules/three/examples/jsm/misc/Volume.js", "../node_modules/three/examples/jsm/loaders/NRRDLoader.js", "../node_modules/three/examples/jsm/loaders/OBJLoader.js", "../node_modules/three/examples/jsm/loaders/PCDLoader.js", "../node_modules/three/examples/jsm/loaders/PDBLoader.js", "../node_modules/three/examples/jsm/loaders/PLYLoader.js", "../node_modules/three/examples/jsm/loaders/PVRLoader.js", "../node_modules/three/examples/jsm/loaders/RGBELoader.js", "../node_modules/three/examples/jsm/loaders/UltraHDRLoader.js", "../node_modules/three/examples/jsm/loaders/STLLoader.js", "../node_modules/three/examples/jsm/loaders/SVGLoader.js", "../node_modules/three/examples/jsm/loaders/TDSLoader.js", "../node_modules/three/examples/jsm/loaders/TIFFLoader.js", "../node_modules/three/examples/jsm/loaders/TTFLoader.js", "../node_modules/three/examples/jsm/loaders/USDLoader.js", "../node_modules/three/examples/jsm/loaders/VOXLoader.js", "../node_modules/three/examples/jsm/libs/chevrotain.module.min.js", "../node_modules/three/examples/jsm/loaders/VRMLLoader.js", "../node_modules/three/examples/jsm/loaders/VTKLoader.js", "../node_modules/three/examples/jsm/loaders/XYZLoader.js", "../node_modules/three/examples/jsm/materials/MeshGouraudMaterial.js", "../node_modules/three/examples/jsm/materials/LDrawConditionalLineMaterial.js", "../node_modules/three/examples/jsm/materials/MeshPostProcessingMaterial.js", "../node_modules/three/examples/jsm/math/Capsule.js", "../node_modules/three/examples/jsm/math/ColorConverter.js", "../node_modules/three/examples/jsm/math/ImprovedNoise.js", "../node_modules/three/examples/jsm/math/Lut.js", "../node_modules/three/examples/jsm/math/MeshSurfaceSampler.js", "../node_modules/three/examples/jsm/math/OBB.js", "../node_modules/three/examples/jsm/math/Octree.js", "../node_modules/three/examples/jsm/math/SimplexNoise.js", "../node_modules/three/examples/jsm/misc/ConvexObjectBreaker.js", "../node_modules/three/examples/jsm/misc/GPUComputationRenderer.js", "../node_modules/three/examples/jsm/misc/Gyroscope.js", "../node_modules/three/examples/jsm/misc/MD2Character.js", "../node_modules/three/examples/jsm/misc/MorphBlendMesh.js", "../node_modules/three/examples/jsm/misc/MD2CharacterComplex.js", "../node_modules/three/examples/jsm/misc/MorphAnimMesh.js", "../node_modules/three/examples/jsm/misc/ProgressiveLightMap.js", "../node_modules/three/examples/jsm/misc/RollerCoaster.js", "../node_modules/three/examples/jsm/misc/TubePainter.js", "../node_modules/three/examples/jsm/modifiers/CurveModifier.js", "../node_modules/three/examples/jsm/modifiers/EdgeSplitModifier.js", "../node_modules/three/examples/jsm/modifiers/SimplifyModifier.js", "../node_modules/three/examples/jsm/modifiers/TessellateModifier.js", "../node_modules/three/examples/jsm/objects/GroundedSkybox.js", "../node_modules/three/examples/jsm/objects/Lensflare.js", "../node_modules/three/examples/jsm/objects/MarchingCubes.js", "../node_modules/three/examples/jsm/objects/Reflector.js", "../node_modules/three/examples/jsm/objects/ReflectorForSSRPass.js", "../node_modules/three/examples/jsm/objects/Refractor.js", "../node_modules/three/examples/jsm/objects/ShadowMesh.js", "../node_modules/three/examples/jsm/objects/Sky.js", "../node_modules/three/examples/jsm/objects/Water.js", "../node_modules/three/examples/jsm/physics/AmmoPhysics.js", "../node_modules/three/examples/jsm/physics/RapierPhysics.js", "../node_modules/three/examples/jsm/shaders/CopyShader.js", "../node_modules/three/examples/jsm/shaders/AfterimageShader.js", "../node_modules/three/examples/jsm/postprocessing/AfterimagePass.js", "../node_modules/three/examples/jsm/shaders/ConvolutionShader.js", "../node_modules/three/examples/jsm/postprocessing/BloomPass.js", "../node_modules/three/examples/jsm/shaders/BokehShader.js", "../node_modules/three/examples/jsm/postprocessing/BokehPass.js", "../node_modules/three/examples/jsm/postprocessing/ClearPass.js", "../node_modules/three/examples/jsm/postprocessing/CubeTexturePass.js", "../node_modules/three/examples/jsm/shaders/DotScreenShader.js", "../node_modules/three/examples/jsm/postprocessing/DotScreenPass.js", "../node_modules/three/examples/jsm/postprocessing/ShaderPass.js", "../node_modules/three/examples/jsm/postprocessing/MaskPass.js", "../node_modules/three/examples/jsm/postprocessing/EffectComposer.js", "../node_modules/three/examples/jsm/shaders/FilmShader.js", "../node_modules/three/examples/jsm/postprocessing/FilmPass.js", "../node_modules/three/examples/jsm/shaders/DigitalGlitch.js", "../node_modules/three/examples/jsm/postprocessing/GlitchPass.js", "../node_modules/three/examples/jsm/shaders/GTAOShader.js", "../node_modules/three/examples/jsm/shaders/PoissonDenoiseShader.js", "../node_modules/three/examples/jsm/postprocessing/GTAOPass.js", "../node_modules/three/examples/jsm/shaders/HalftoneShader.js", "../node_modules/three/examples/jsm/postprocessing/HalftonePass.js", "../node_modules/three/examples/jsm/postprocessing/LUTPass.js", "../node_modules/three/examples/jsm/postprocessing/OutlinePass.js", "../node_modules/three/examples/jsm/shaders/OutputShader.js", "../node_modules/three/examples/jsm/postprocessing/OutputPass.js", "../node_modules/three/examples/jsm/postprocessing/RenderPass.js", "../node_modules/three/examples/jsm/postprocessing/RenderPixelatedPass.js", "../node_modules/three/examples/jsm/shaders/SAOShader.js", "../node_modules/three/examples/jsm/shaders/DepthLimitedBlurShader.js", "../node_modules/three/examples/jsm/postprocessing/SAOPass.js", "../node_modules/three/examples/jsm/shaders/SMAAShader.js", "../node_modules/three/examples/jsm/postprocessing/SMAAPass.js", "../node_modules/three/examples/jsm/postprocessing/SSAARenderPass.js", "../node_modules/three/examples/jsm/shaders/SSAOShader.js", "../node_modules/three/examples/jsm/postprocessing/SSAOPass.js", "../node_modules/three/examples/jsm/shaders/SSRShader.js", "../node_modules/three/examples/jsm/postprocessing/SSRPass.js", "../node_modules/three/examples/jsm/postprocessing/SavePass.js", "../node_modules/three/examples/jsm/postprocessing/TAARenderPass.js", "../node_modules/three/examples/jsm/postprocessing/TexturePass.js", "../node_modules/three/examples/jsm/shaders/LuminosityHighPassShader.js", "../node_modules/three/examples/jsm/postprocessing/UnrealBloomPass.js", "../node_modules/three/examples/jsm/renderers/CSS2DRenderer.js", "../node_modules/three/examples/jsm/renderers/CSS3DRenderer.js", "../node_modules/three/examples/jsm/renderers/Projector.js", "../node_modules/three/examples/jsm/renderers/SVGRenderer.js", "../node_modules/three/examples/jsm/shaders/ACESFilmicToneMappingShader.js", "../node_modules/three/examples/jsm/shaders/BasicShader.js", "../node_modules/three/examples/jsm/shaders/BleachBypassShader.js", "../node_modules/three/examples/jsm/shaders/BlendShader.js", "../node_modules/three/examples/jsm/shaders/BrightnessContrastShader.js", "../node_modules/three/examples/jsm/shaders/ColorCorrectionShader.js", "../node_modules/three/examples/jsm/shaders/ColorifyShader.js", "../node_modules/three/examples/jsm/shaders/DOFMipMapShader.js", "../node_modules/three/examples/jsm/shaders/ExposureShader.js", "../node_modules/three/examples/jsm/shaders/FXAAShader.js", "../node_modules/three/examples/jsm/shaders/FocusShader.js", "../node_modules/three/examples/jsm/shaders/FreiChenShader.js", "../node_modules/three/examples/jsm/shaders/GammaCorrectionShader.js", "../node_modules/three/examples/jsm/shaders/GodRaysShader.js", "../node_modules/three/examples/jsm/shaders/HorizontalBlurShader.js", "../node_modules/three/examples/jsm/shaders/HorizontalTiltShiftShader.js", "../node_modules/three/examples/jsm/shaders/HueSaturationShader.js", "../node_modules/three/examples/jsm/shaders/KaleidoShader.js", "../node_modules/three/examples/jsm/shaders/LuminosityShader.js", "../node_modules/three/examples/jsm/shaders/MirrorShader.js", "../node_modules/three/examples/jsm/shaders/NormalMapShader.js", "../node_modules/three/examples/jsm/shaders/RGBShiftShader.js", "../node_modules/three/examples/jsm/shaders/SepiaShader.js", "../node_modules/three/examples/jsm/shaders/SobelOperatorShader.js", "../node_modules/three/examples/jsm/shaders/SubsurfaceScatteringShader.js", "../node_modules/three/examples/jsm/shaders/TechnicolorShader.js", "../node_modules/three/examples/jsm/shaders/ToonShader.js", "../node_modules/three/examples/jsm/shaders/TriangleBlurShader.js", "../node_modules/three/examples/jsm/shaders/UnpackDepthRGBAShader.js", "../node_modules/three/examples/jsm/shaders/VelocityShader.js", "../node_modules/three/examples/jsm/shaders/VerticalBlurShader.js", "../node_modules/three/examples/jsm/shaders/VerticalTiltShiftShader.js", "../node_modules/three/examples/jsm/shaders/VignetteShader.js", "../node_modules/three/examples/jsm/shaders/VolumeShader.js", "../node_modules/three/examples/jsm/shaders/WaterRefractionShader.js", "../node_modules/three/examples/jsm/textures/FlakesTexture.js", "../node_modules/three/examples/jsm/utils/CameraUtils.js", "../node_modules/three/examples/jsm/utils/GeometryCompressionUtils.js", "../node_modules/three/examples/jsm/utils/GeometryUtils.js", "../node_modules/three/examples/jsm/utils/LDrawUtils.js", "../node_modules/three/examples/jsm/utils/SceneUtils.js", "../node_modules/three/examples/jsm/utils/ShadowMapViewer.js", "../node_modules/three/examples/jsm/utils/SkeletonUtils.js", "../node_modules/three/examples/jsm/utils/SortUtils.js", "../node_modules/three/examples/jsm/utils/WebGLTextureUtils.js", "../node_modules/three/examples/jsm/utils/UVsDebug.js", "../node_modules/three/examples/jsm/webxr/ARButton.js", "../node_modules/three/examples/jsm/webxr/XRHandMeshModel.js", "../node_modules/three/examples/jsm/webxr/OculusHandModel.js", "../node_modules/three/examples/jsm/webxr/OculusHandPointerModel.js", "../node_modules/three/examples/jsm/webxr/Text2D.js", "../node_modules/three/examples/jsm/webxr/VRButton.js", "../node_modules/three/examples/jsm/webxr/XRButton.js", "../node_modules/three/examples/jsm/webxr/XRControllerModelFactory.js", "../node_modules/three/examples/jsm/webxr/XREstimatedLight.js", "../node_modules/three/examples/jsm/webxr/XRHandPrimitiveModel.js", "../node_modules/three/examples/jsm/webxr/XRHandModelFactory.js", "../node_modules/three/examples/jsm/webxr/XRPlanes.js", "../node_modules/three/examples/jsm/Addons.js", "../node_modules/ffl.js/helpers/SkeletonScalingExtensions.js", "../node_modules/ffl.js/helpers/ModelScaleDesc.js", "../node_modules/ffl.js/helpers/BodyUtilities.js", "../node_modules/ffl.js/ffl.js", "../node_modules/three/build/three.webgpu.js", "../node_modules/three/build/three.tsl.js", "../node_modules/ffl.js/materials/TextureShaderNodeMaterial.js", "../node_modules/ffl.js/materials/FFLShaderMaterial.js", "../node_modules/ffl.js/materials/FFLShaderNodeMaterial.js", "../node_modules/ffl.js/examples/ffl-emscripten-single-file.cjs", "../node_modules/pngjs/lib/chunkstream.js", "../node_modules/pngjs/lib/interlace.js", "../node_modules/pngjs/lib/paeth-predictor.js", "../node_modules/pngjs/lib/filter-parse.js", "../node_modules/pngjs/lib/filter-parse-async.js", "../node_modules/pngjs/lib/constants.js", "../node_modules/pngjs/lib/crc.js", "../node_modules/pngjs/lib/parser.js", "../node_modules/pngjs/lib/bitmapper.js", "../node_modules/pngjs/lib/format-normaliser.js", "../node_modules/pngjs/lib/parser-async.js", "../node_modules/pngjs/lib/bitpacker.js", "../node_modules/pngjs/lib/filter-pack.js", "../node_modules/pngjs/lib/packer.js", "../node_modules/pngjs/lib/packer-async.js", "../node_modules/pngjs/lib/sync-inflate.js", "../node_modules/pngjs/lib/sync-reader.js", "../node_modules/pngjs/lib/filter-parse-sync.js", "../node_modules/pngjs/lib/parser-sync.js", "../node_modules/pngjs/lib/packer-sync.js", "../node_modules/pngjs/lib/png-sync.js", "../node_modules/pngjs/lib/png.js", "../node_modules/fetch/lib/cookiejar.js", "../node_modules/safer-buffer/safer.js", "../node_modules/fetch/node_modules/iconv-lite/lib/bom-handling.js", "../node_modules/fetch/node_modules/iconv-lite/encodings/internal.js", "../node_modules/fetch/node_modules/iconv-lite/encodings/utf16.js", "../node_modules/fetch/node_modules/iconv-lite/encodings/utf7.js", "../node_modules/fetch/node_modules/iconv-lite/encodings/sbcs-codec.js", "../node_modules/fetch/node_modules/iconv-lite/encodings/sbcs-data.js", "../node_modules/fetch/node_modules/iconv-lite/encodings/sbcs-data-generated.js", "../node_modules/fetch/node_modules/iconv-lite/encodings/dbcs-codec.js", "../node_modules/fetch/node_modules/iconv-lite/encodings/tables/shiftjis.json", "../node_modules/fetch/node_modules/iconv-lite/encodings/tables/eucjp.json", "../node_modules/fetch/node_modules/iconv-lite/encodings/tables/cp936.json", "../node_modules/fetch/node_modules/iconv-lite/encodings/tables/gbk-added.json", "../node_modules/fetch/node_modules/iconv-lite/encodings/tables/gb18030-ranges.json", "../node_modules/fetch/node_modules/iconv-lite/encodings/tables/cp949.json", "../node_modules/fetch/node_modules/iconv-lite/encodings/tables/cp950.json", "../node_modules/fetch/node_modules/iconv-lite/encodings/tables/big5-added.json", "../node_modules/fetch/node_modules/iconv-lite/encodings/dbcs-data.js", "../node_modules/fetch/node_modules/iconv-lite/encodings/index.js", "../node_modules/fetch/node_modules/iconv-lite/lib/streams.js", "../node_modules/fetch/node_modules/iconv-lite/lib/extend-node.js", "../node_modules/fetch/node_modules/iconv-lite/lib/index.js", "../node_modules/fetch/node_modules/encoding/lib/iconv-loader.js", "../node_modules/fetch/node_modules/encoding/lib/encoding.js", "../node_modules/fetch/lib/fetch.js", "../miiRendering.js", "../qrTools.js", "../miiProcess.js", "../amiiboHandler.js", "../formats.js", "../node_modules/is-extglob/index.js", "../node_modules/is-glob/index.js", "../node_modules/is-invalid-path/index.js", "../node_modules/is-valid-path/index.js", "../miiMeasureConversion.js", "../miiInstructions.js", "../miiBabies.js", "../index.js"],
  "sourcesContent": ["//This is a JS file exclusively because I want to have comments, it would be JSON otherwise.\r\nexport const backTables={\r\n    \"3ds\":{\r\n        //These are lossy, but as close as we can get to the original feature when backporting. \r\n        //Positions for eyes will be somewhat troublesome.\r\n        //There are a LOT of hairs to sort through. I am open to modifying this conversion.\r\n        \"hairs\":[\r\n            25,64,63,64,44,61,19,1,24,69,4,53,9,71,67,50,65,47,0,1,\r\n            2,4,13,12,7,9,63,16,14,71,71,18,19,12,12,33,58,9,27,28,\r\n            1,35,46,33,70,6,67,35,11,64,37,0,25,64,46,1,14,14,9,15\r\n        ],//If type>71 hairs[type-72]\r\n        \"faces\":[0,1,4,6],//If type>7 faces[type-8]\r\n        \"eyes\":[32,37,27,9,44,12,40,31,17,2,40,40],//If type>47 eyes[type-48]\r\n        \"noses\":[8,3,10,3,9,8],//If type>11 noses[type-12]\r\n        \"mouths\":[1,8,6,1,18,1,10,9,4,21,14,10],//If type>23 mouths[type-24]\r\n        \"features\": [//Because we need to merge features and makeups going from the 3DS to the Wii, if it's a string, prefer makeup. Otherwise prefer facial features.\r\n            \"0\",\"6\",5,\r\n            6,\"6\",4,\r\n            7,7,8,\r\n            10,\"6\",11\r\n        ],\r\n        \"makeups\": [\r\n            0,1,1,\r\n            2,1,1,\r\n            2,2,2,\r\n            3,9,9\r\n        ],\r\n    },\r\n    \"switch\":{\r\n        \"glassesTypes\":[4,2,2,3,6,8,6,7,8,6,6],\r\n        \"faceColors\":[0,1,2,3,4,5,3,2,4,5],\r\n\r\n        // Tables originally from MiiPort:\r\n        // https://github.com/Genwald/MiiPort/blob/4ee38bbb8aa68a2365e9c48d59d7709f760f9b5d/include/convert_mii.h#L18-L28\r\n        // Cross-referenced against Arian Kordi's notes:\r\n        // https://jsfiddle.net/arian_/n8fesLdj/3/\r\n        \"glassesColors\":[\r\n            0, 1, 1, 1, 5, 1, 1, 4, 0, 5, \r\n            1, 1, 3, 5, 1, 2, 3, 4, 5, 4, \r\n            2, 2, 4, 4, 2, 2, 2, 2, 2, 2, \r\n            2, 2, 2, 2, 2, 2, 2, 2, 3, 3, \r\n            3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\r\n            3, 3, 3, 3, 3, 3, 0, 0, 0, 5, \r\n            3, 5, 5, 5, 5, 0, 5, 5, 5, 5, \r\n            5, 5, 5, 5, 5, 5, 5, 4, 5, 5,\r\n            5, 5, 5, 1, 4, 4, 4, 4, 4, 4, \r\n            4, 4, 4, 4, 5, 5, 5, 5, 5, 5\r\n        ],\r\n        \"hairsColors\":[\r\n            0, 1, 2, 3, 4, 5, 6, 7, 0, 4, 3, 5, 4, 5, 6, 2, 0, 6, 4, 3, 2, 2, 7, 3, 2, 2,\r\n            2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 0, 0, 4, 4,\r\n            4, 4, 4, 4, 0, 0, 0, 5, 5, 4, 4, 4, 4, 5, 5, 5, 4, 4, 7, 4, 4, 4, 4, 5, 7, 5,\r\n            7, 7, 7, 7, 7, 6, 7, 7, 7, 7, 7, 3, 7, 7, 7, 7, 7, 0, 4, 4, 4, 4\r\n        ],\r\n        \"eyesColors\":[\r\n            0, 2, 2, 2, 1, 3, 2, 3, 0, 1, 2, 3, 4, 5, 2, 2, 4, 2, 1, 2, 2, 2, 2, 2, 2, 2,\r\n            2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 0, 0, 4, 4, 4, 4, 4, 4, 4, 1, 0, 4, 4, 4,\r\n            4, 4, 4, 4, 0, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 3, 3, 3,\r\n            3, 3, 3, 3, 3, 2, 2, 3, 3, 3, 3, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1\r\n        ],\r\n        \"mouthsColors\":[\r\n            4, 4, 4, 4, 4, 4, 4, 3, 4, 4, 4, 4, 4, 4, 4, 1, 4, 4, 4, 0, 1, 2, 3, 4, 4, 2,\r\n            3, 3, 4, 4, 4, 4, 1, 4, 4, 2, 3, 3, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 4, 4, 4, 3,\r\n            3, 3, 3, 3, 4, 4, 4, 4, 4, 3, 3, 3, 3, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 4, 3,\r\n            3, 3, 3, 3, 3, 4, 3, 3, 3, 3, 3, 4, 0, 3, 3, 3, 3, 4, 3, 3, 3, 3\r\n        ],\r\n    }\r\n};\r\nexport const lookupTables={\r\n    \"pages\":{\r\n        \"hair\":{\r\n            \"wii\":[\r\n                [//Page 1\r\n                    33, 40, 51, \r\n                    44, 39, 70, \r\n                    45, 49, 59, \r\n                    56, 68, 31\r\n                ],\r\n                [//Page 2\r\n                    32, 47, 37, \r\n                    48, 66, 52, \r\n                    58, 50, 55, \r\n                    64, 60, 62\r\n                ],\r\n                [//Page 3\r\n                    43, 38, 42, \r\n                    23, 67, 54, \r\n                    36, 41, 65, \r\n                    30, 57, 34\r\n                ],\r\n                [//Page 4\r\n                    12, 13, 69, \r\n                    26,  4, 25,  \r\n                    1, 19,  5,  \r\n                    8, 27,  7\r\n                ],\r\n                [//Page 5\r\n                    14,  3, 22, \r\n                    10,  6, 20, \r\n                    11, 63, 17, \r\n                    35, 21,  0\r\n                ],\r\n                [//Page 6\r\n                    61, 16, 46,  \r\n                    9, 18,  2, \r\n                    28, 53, 71, \r\n                    24, 15, 29\r\n                ]\r\n            ],\r\n            \"3ds\":[\r\n                [//Page 1\r\n                    33,47,40,\r\n                    37,32,107,\r\n                    48,51,55,\r\n                    70,44,66\r\n                ],\r\n                [//Page 2\r\n                    52,50,38,\r\n                    49,43,31,\r\n                    56,68,62,\r\n                    115,76,119\r\n                ],\r\n                [//Page 3\r\n                    64,81,116,\r\n                    121,22,58,\r\n                    60,87,125,\r\n                    117,73,75\r\n                ],\r\n                [//Page 4\r\n                    42,89,57,\r\n                    54,80,34,\r\n                    23,86,88,\r\n                    118,39,36\r\n                ],\r\n                [//Page 5\r\n                    45,67,59,\r\n                    65,41,30,\r\n                    12,16,10,\r\n                    82,128,129\r\n                ],\r\n                [//Page 6\r\n                    14,95,105,\r\n                    100,6,20,\r\n                    93,102,27,\r\n                    4,17,110\r\n                ],\r\n                [//Page 7\r\n                    123,8,106,\r\n                    72,3,21,\r\n                    0,98,63,\r\n                    90,11,120\r\n                ],\r\n                [//Page 8\r\n                    5,74,108,\r\n                    94,124,25,\r\n                    99,69,35,\r\n                    13,122,113\r\n                ],\r\n                [//Page 9\r\n                    53,24,85,\r\n                    83,71,131,\r\n                    96,101,29,\r\n                    7,15,112\r\n                ],\r\n                [//Page 10\r\n                    79,1,109,\r\n                    127,91,26,\r\n                    61,103,2,\r\n                    77,18,92\r\n                ],\r\n                [//Page 11\r\n                    84,9,19,\r\n                    130,97,104,\r\n                    46,78,28,\r\n                    114,126,111\r\n                ]\r\n            ]\r\n        },\r\n        \"faces\":[//Wii does not yet have 8-11 (3rd Column)\r\n            0,1,8,\r\n            2,3,9,\r\n            4,5,10,\r\n            6,7,11\r\n        ],\r\n        \"eyebrows\":[\r\n            [\r\n                6,0,12,\r\n                1,9,19,\r\n                7,21,8,\r\n                17,5,4\r\n            ],\r\n            [\r\n                11,10,2,\r\n                3,14,20,\r\n                15,13,22,\r\n                18,16,23\r\n            ]\r\n        ],\r\n        \"eyes\":[\r\n            [\r\n                2,4,0,\r\n                8,39,17,\r\n                1,26,16,\r\n                15,27,20\r\n            ],\r\n            [\r\n                33,11,19,\r\n                32,9,12,\r\n                23,34,21,\r\n                25,40,35\r\n            ],\r\n            [\r\n                5,41,13,\r\n                36,37,6,\r\n                24,30,31,\r\n                18,28,46\r\n            ],\r\n            [\r\n                7,44,38,\r\n                42,45,29,\r\n                3,43,22,\r\n                10,14,47\r\n            ],\r\n            [//Wii does not yet have\r\n                48,49,50,\r\n                53,59,56,\r\n                54,58,57,\r\n                55,51,52\r\n            ],\r\n        ],\r\n        \"noses\":[\r\n            [\r\n                1,10,2,\r\n                3,6,0,\r\n                5,4,8,\r\n                9,7,11\r\n            ],\r\n            [//Wii does not yet have\r\n                13,14,12,\r\n                17,16,15\r\n            ]\r\n        ],\r\n        \"mouths\":[\r\n            [\r\n                23,1,18,\r\n                21,22,5,\r\n                0,8,10,\r\n                16,6,13\r\n            ],\r\n            [\r\n                7,9,2,\r\n                11,3,4,\r\n                15,17,20,\r\n                19,14,12\r\n            ],\r\n            [\r\n                27,30,24,\r\n                25,29,28,\r\n                26,35,31,\r\n                34,33,32\r\n            ]\r\n        ]\r\n    },\r\n    \"favoriteColors\":[\"Red\",\"Orange\",\"Yellow\",\"Lime\",\"Green\",\"Blue\",\"Cyan\",\"Pink\",\"Purple\",\"Brown\",\"White\",\"Black\"],\r\n    \"switch\":{\r\n        \"faceColors\":[\r\n            0,2,7,6,3,\r\n            4,5,1,8,9\r\n        ]\r\n    },\r\n    \"grids\":{\r\n        \"colors\":[\r\n            [ 2,24,10,23,15,20,21,25,26,27],\r\n            [28,29,30,31,32,33,34,35,36,37],\r\n            [38,39,40,41,42,43,44,45,46,47],\r\n            [48,16,49,12,50,51,52,53,54,55],\r\n            [56,57,59,59,13,60,62,62,63,64],\r\n            [65,66,67,68,69,70,71,72,73,74],\r\n            [ 5,11,75,75,77,78,79,80,81,82],\r\n            [14,83, 6,17, 7,84,85,86,87,88],\r\n            [ 1, 3,89,19,90,91,22,92,93,94],\r\n            [ 8, 0,95, 9,18, 4,96,97,98,99]\r\n        ],\r\n        \"skinColors\":[\r\n            [0,7,1,4,5],\r\n            [6,3,2,8,9]\r\n        ],\r\n        \"hairs\":[\r\n            [33,47,40,37,32,107],\r\n            [48,51,55,70,44,66],\r\n            [52,50,38,49,43,31],\r\n            [56,68,62,115,76,119],\r\n            [64,81,116,121,22,58],\r\n            [60,87,125,117,73,75],\r\n            [42,89,57,54,80,34],\r\n            [23,86,88,118,39,36],\r\n            [45,67,59,65,41,30],\r\n            [12,16,10,82,128,129],\r\n            [14,95,105,100,6,20],\r\n            [93,102,27,4,17,110],\r\n            [123,8,106,72,3,21],\r\n            [0,98,63,90,11,120],\r\n            [5,74,108,94,124,25],\r\n            [99,69,35,13,122,113],\r\n            [53,24,85,83,71,131],\r\n            [96,101,29,7,15,112],\r\n            [79,1,109,127,91,26],\r\n            [61,103,2,77,18,92],\r\n            [84,9,19,130,97,104],\r\n            [46,78,28,114,126,111]\r\n        ],\r\n        \"noses\":[\r\n            [1,10,2,3,6,0],\r\n            [5,4,8,9,7,11],\r\n            [13,14,12,17,16,15]\r\n        ],\r\n        \"eyebrows\":[\r\n            [6,0,12,1,9,19],\r\n            [7,21,8,17,5,4],\r\n            [11,10,2,3,14,20],\r\n            [15,13,22,18,16,23]\r\n        ],\r\n        \"mouths\":[\r\n            [23,1,18,21,22,5],\r\n            [0,8,10,16,6,13],\r\n            [7,9,2,11,3,4],\r\n            [15,17,20,19,14,12],\r\n            [27,30,24,25,29,28],\r\n            [26,35,31,34,33,32]\r\n        ],\r\n        \"eyes\":[\r\n            [2,4,0,8,39,17],\r\n            [1,26,16,15,27,20],\r\n            [33,11,19,32,9,12],\r\n            [23,34,21,25,40,35],\r\n            [5,41,13,36,37,6],\r\n            [24,30,31,18,28,46],\r\n            [7,44,38,42,45,29],\r\n            [3,43,22,10,14,47],\r\n            [48,49,50,53,59,56],\r\n            [54,58,57,55,51,52]\r\n        ],\r\n        \"glasses\":[\r\n            [0,4,9,2,10],\r\n            [3,12,5,1,11],\r\n            [13,8,14,7,6],\r\n            [18,17,19,16,15]\r\n        ]\r\n    },\r\n    \"instrGrids\":{\r\n        twoBy:[\r\n            [0,1],\r\n            [2,3],\r\n            [4,5],\r\n            [6,7]\r\n        ],\r\n        threeBy:[\r\n            [0,1,2],\r\n            [3,4,5],\r\n            [6,7,8],\r\n            [9,10,11]\r\n        ],\r\n        fourBy:[\r\n            [0,1,2,3],\r\n            [4,5,6,7]\r\n        ]\r\n    },\r\n    \"glassesTypes\":[\r\n        0,8,3,\r\n        4,1,5,\r\n        14,13,11\r\n    ],\r\n    \"makeupsFeatures\":[\r\n        0,'1','6',\r\n        '9',5,2,\r\n        3,7,8,\r\n        '10',9,11\r\n    ]\r\n};\r\nexport const childGenTables={\r\n    \"hairStyleGroupMappings\": [\r\n        [\r\n            2,\r\n            8\r\n        ],\r\n        [\r\n            0,\r\n            6\r\n        ],\r\n        [\r\n            0,\r\n            6\r\n        ],\r\n        [\r\n            2,\r\n            8\r\n        ],\r\n        [\r\n            2,\r\n            5\r\n        ],\r\n        [\r\n            0,\r\n            4\r\n        ],\r\n        [\r\n            2,\r\n            8\r\n        ],\r\n        [\r\n            1,\r\n            9\r\n        ],\r\n        [\r\n            1,\r\n            9\r\n        ],\r\n        [\r\n            0,\r\n            6\r\n        ],\r\n        [\r\n            2,\r\n            8\r\n        ],\r\n        [\r\n            0,\r\n            4\r\n        ],\r\n        [\r\n            2,\r\n            7\r\n        ],\r\n        [\r\n            0,\r\n            4\r\n        ],\r\n        [\r\n            2,\r\n            8\r\n        ],\r\n        [\r\n            1,\r\n            9\r\n        ],\r\n        [\r\n            2,\r\n            8\r\n        ],\r\n        [\r\n            1,\r\n            9\r\n        ],\r\n        [\r\n            2,\r\n            8\r\n        ],\r\n        [\r\n            0,\r\n            6\r\n        ],\r\n        [\r\n            2,\r\n            5\r\n        ],\r\n        [\r\n            2,\r\n            5\r\n        ],\r\n        [\r\n            2,\r\n            7\r\n        ],\r\n        [\r\n            0,\r\n            5\r\n        ],\r\n        [\r\n            1,\r\n            9\r\n        ],\r\n        [\r\n            2,\r\n            5\r\n        ],\r\n        [\r\n            0,\r\n            6\r\n        ],\r\n        [\r\n            2,\r\n            7\r\n        ],\r\n        [\r\n            0,\r\n            6\r\n        ],\r\n        [\r\n            1,\r\n            9\r\n        ],\r\n        [\r\n            0,\r\n            4\r\n        ],\r\n        [\r\n            1,\r\n            6\r\n        ],\r\n        [\r\n            0,\r\n            4\r\n        ],\r\n        [\r\n            0,\r\n            4\r\n        ],\r\n        [\r\n            1,\r\n            5\r\n        ],\r\n        [\r\n            2,\r\n            5\r\n        ],\r\n        [\r\n            1,\r\n            5\r\n        ],\r\n        [\r\n            0,\r\n            4\r\n        ],\r\n        [\r\n            1,\r\n            6\r\n        ],\r\n        [\r\n            2,\r\n            5\r\n        ],\r\n        [\r\n            0,\r\n            4\r\n        ],\r\n        [\r\n            2,\r\n            5\r\n        ],\r\n        [\r\n            3,\r\n            9\r\n        ],\r\n        [\r\n            1,\r\n            6\r\n        ],\r\n        [\r\n            2,\r\n            7\r\n        ],\r\n        [\r\n            1,\r\n            8\r\n        ],\r\n        [\r\n            0,\r\n            6\r\n        ],\r\n        [\r\n            0,\r\n            4\r\n        ],\r\n        [\r\n            2,\r\n            7\r\n        ],\r\n        [\r\n            1,\r\n            6\r\n        ],\r\n        [\r\n            2,\r\n            7\r\n        ],\r\n        [\r\n            2,\r\n            4\r\n        ],\r\n        [\r\n            0,\r\n            4\r\n        ],\r\n        [\r\n            1,\r\n            9\r\n        ],\r\n        [\r\n            3,\r\n            9\r\n        ],\r\n        [\r\n            2,\r\n            7\r\n        ],\r\n        [\r\n            1,\r\n            6\r\n        ],\r\n        [\r\n            1,\r\n            8\r\n        ],\r\n        [\r\n            2,\r\n            7\r\n        ],\r\n        [\r\n            1,\r\n            8\r\n        ],\r\n        [\r\n            1,\r\n            6\r\n        ],\r\n        [\r\n            0,\r\n            6\r\n        ],\r\n        [\r\n            1,\r\n            4\r\n        ],\r\n        [\r\n            0,\r\n            4\r\n        ],\r\n        [\r\n            1,\r\n            6\r\n        ],\r\n        [\r\n            1,\r\n            8\r\n        ],\r\n        [\r\n            0,\r\n            4\r\n        ],\r\n        [\r\n            2,\r\n            8\r\n        ],\r\n        [\r\n            3,\r\n            9\r\n        ],\r\n        [\r\n            2,\r\n            8\r\n        ],\r\n        [\r\n            2,\r\n            7\r\n        ],\r\n        [\r\n            1,\r\n            9\r\n        ],\r\n        [\r\n            2,\r\n            5\r\n        ],\r\n        [\r\n            1,\r\n            6\r\n        ],\r\n        [\r\n            0,\r\n            4\r\n        ],\r\n        [\r\n            1,\r\n            6\r\n        ],\r\n        [\r\n            3,\r\n            9\r\n        ],\r\n        [\r\n            0,\r\n            6\r\n        ],\r\n        [\r\n            0,\r\n            6\r\n        ],\r\n        [\r\n            1,\r\n            9\r\n        ],\r\n        [\r\n            3,\r\n            9\r\n        ],\r\n        [\r\n            2,\r\n            7\r\n        ],\r\n        [\r\n            2,\r\n            7\r\n        ],\r\n        [\r\n            1,\r\n            9\r\n        ],\r\n        [\r\n            0,\r\n            6\r\n        ],\r\n        [\r\n            1,\r\n            9\r\n        ],\r\n        [\r\n            2,\r\n            8\r\n        ],\r\n        [\r\n            2,\r\n            7\r\n        ],\r\n        [\r\n            2,\r\n            8\r\n        ],\r\n        [\r\n            3,\r\n            9\r\n        ],\r\n        [\r\n            0,\r\n            4\r\n        ],\r\n        [\r\n            0,\r\n            6\r\n        ],\r\n        [\r\n            2,\r\n            5\r\n        ],\r\n        [\r\n            2,\r\n            7\r\n        ],\r\n        [\r\n            0,\r\n            4\r\n        ],\r\n        [\r\n            2,\r\n            7\r\n        ],\r\n        [\r\n            1,\r\n            9\r\n        ],\r\n        [\r\n            0,\r\n            6\r\n        ],\r\n        [\r\n            0,\r\n            4\r\n        ],\r\n        [\r\n            0,\r\n            4\r\n        ],\r\n        [\r\n            2,\r\n            5\r\n        ],\r\n        [\r\n            1,\r\n            9\r\n        ],\r\n        [\r\n            0,\r\n            4\r\n        ],\r\n        [\r\n            0,\r\n            6\r\n        ],\r\n        [\r\n            0,\r\n            6\r\n        ],\r\n        [\r\n            2,\r\n            7\r\n        ],\r\n        [\r\n            2,\r\n            7\r\n        ],\r\n        [\r\n            0,\r\n            4\r\n        ],\r\n        [\r\n            0,\r\n            4\r\n        ],\r\n        [\r\n            0,\r\n            6\r\n        ],\r\n        [\r\n            2,\r\n            7\r\n        ],\r\n        [\r\n            0,\r\n            6\r\n        ],\r\n        [\r\n            1,\r\n            9\r\n        ],\r\n        [\r\n            2,\r\n            5\r\n        ],\r\n        [\r\n            0,\r\n            6\r\n        ],\r\n        [\r\n            1,\r\n            6\r\n        ],\r\n        [\r\n            2,\r\n            7\r\n        ],\r\n        [\r\n            2,\r\n            7\r\n        ],\r\n        [\r\n            3,\r\n            9\r\n        ],\r\n        [\r\n            0,\r\n            9\r\n        ],\r\n        [\r\n            0,\r\n            4\r\n        ],\r\n        [\r\n            1,\r\n            6\r\n        ],\r\n        [\r\n            2,\r\n            5\r\n        ],\r\n        [\r\n            2,\r\n            8\r\n        ],\r\n        [\r\n            2,\r\n            5\r\n        ],\r\n        [\r\n            1,\r\n            6\r\n        ],\r\n        [\r\n            0,\r\n            6\r\n        ],\r\n        [\r\n            1,\r\n            9\r\n        ],\r\n        [\r\n            2,\r\n            7\r\n        ],\r\n        [\r\n            2,\r\n            7\r\n        ],\r\n        [\r\n            0,\r\n            6\r\n        ],\r\n        [\r\n            1,\r\n            9\r\n        ]\r\n    ],\r\n    \"hairStyleGroups\": [\r\n        [\r\n            [\r\n                30\r\n            ],\r\n            [\r\n                45,\r\n                47\r\n            ],\r\n            [\r\n                40,\r\n                33,\r\n                107\r\n            ],\r\n            [\r\n                32,\r\n                37,\r\n                66,\r\n                52\r\n            ]\r\n        ],\r\n        [\r\n            [\r\n                45\r\n            ],\r\n            [\r\n                56,\r\n                38,\r\n                43,\r\n                49\r\n            ],\r\n            [\r\n                115,\r\n                31,\r\n                87,\r\n                60\r\n            ],\r\n            [\r\n                64,\r\n                121,\r\n                125,\r\n                73,\r\n                75\r\n            ]\r\n        ],\r\n        [\r\n            [\r\n                51\r\n            ],\r\n            [\r\n                55,\r\n                48,\r\n                51\r\n            ],\r\n            [\r\n                44,\r\n                52\r\n            ],\r\n            [\r\n                70,\r\n                50,\r\n                116,\r\n                58,\r\n                117,\r\n                22,\r\n                81,\r\n                87\r\n            ]\r\n        ],\r\n        [\r\n            [\r\n                45\r\n            ],\r\n            [\r\n                68,\r\n                62\r\n            ],\r\n            [\r\n                76,\r\n                119,\r\n                118\r\n            ],\r\n            [\r\n                42,\r\n                54,\r\n                89,\r\n                80\r\n            ]\r\n        ],\r\n        [\r\n            [\r\n                30\r\n            ],\r\n            [\r\n                51,\r\n                62\r\n            ],\r\n            [\r\n                98,\r\n                11,\r\n                5,\r\n                94\r\n            ],\r\n            [\r\n                63,\r\n                120,\r\n                90,\r\n                99,\r\n                13,\r\n                74,\r\n                108,\r\n                102\r\n            ]\r\n        ],\r\n        [\r\n            [\r\n                45\r\n            ],\r\n            [\r\n                35,\r\n                122,\r\n                21\r\n            ],\r\n            [\r\n                113,\r\n                124,\r\n                25\r\n            ],\r\n            [\r\n                100,\r\n                20,\r\n                4,\r\n                72,\r\n                21,\r\n                92\r\n            ]\r\n        ],\r\n        [\r\n            [\r\n                45,\r\n                51\r\n            ],\r\n            [\r\n                11,\r\n                21\r\n            ],\r\n            [\r\n                46,\r\n                114,\r\n                61,\r\n                77\r\n            ],\r\n            [\r\n                19,\r\n                104,\r\n                28,\r\n                9,\r\n                126,\r\n                78,\r\n                111,\r\n                97,\r\n                2,\r\n                103,\r\n                84,\r\n                130,\r\n                109,\r\n                26,\r\n                1,\r\n                91\r\n            ]\r\n        ],\r\n        [\r\n            [\r\n                51\r\n            ],\r\n            [\r\n                62,\r\n                122\r\n            ],\r\n            [\r\n                106,\r\n                17,\r\n                12\r\n            ],\r\n            [\r\n                82,\r\n                128,\r\n                129,\r\n                27,\r\n                93,\r\n                95,\r\n                105,\r\n                110\r\n            ]\r\n        ],\r\n        [\r\n            [\r\n                45\r\n            ],\r\n            [\r\n                122,\r\n                21\r\n            ],\r\n            [\r\n                69,\r\n                16,\r\n                17\r\n            ],\r\n            [\r\n                123,\r\n                3,\r\n                0,\r\n                10,\r\n                18,\r\n                14,\r\n                6\r\n            ]\r\n        ],\r\n        [\r\n            [\r\n                30,\r\n                51\r\n            ],\r\n            [\r\n                62,\r\n                122,\r\n                11\r\n            ],\r\n            [\r\n                53,\r\n                83,\r\n                17\r\n            ],\r\n            [\r\n                96,\r\n                101,\r\n                29,\r\n                79,\r\n                7,\r\n                15,\r\n                112,\r\n                127,\r\n                71,\r\n                24,\r\n                131,\r\n                8,\r\n                85\r\n            ]\r\n        ]\r\n    ],\r\n    \"skinColorMixing\": [\r\n        [\r\n            [\r\n                0,\r\n                -1,\r\n                -1,\r\n                -1\r\n            ],\r\n            [\r\n                0,\r\n                1,\r\n                -1,\r\n                -1\r\n            ],\r\n            [\r\n                0,\r\n                1,\r\n                2,\r\n                3\r\n            ],\r\n            [\r\n                0,\r\n                3,\r\n                -1,\r\n                -1\r\n            ],\r\n            [\r\n                1,\r\n                2,\r\n                -1,\r\n                -1\r\n            ],\r\n            [\r\n                2,\r\n                4,\r\n                -1,\r\n                -1\r\n            ]\r\n        ],\r\n        [\r\n            [\r\n                -1,\r\n                -1,\r\n                -1,\r\n                -1\r\n            ],\r\n            [\r\n                1,\r\n                -1,\r\n                -1,\r\n                -1\r\n            ],\r\n            [\r\n                1,\r\n                2,\r\n                -1,\r\n                -1\r\n            ],\r\n            [\r\n                1,\r\n                3,\r\n                -1,\r\n                -1\r\n            ],\r\n            [\r\n                2,\r\n                -1,\r\n                -1,\r\n                -1\r\n            ],\r\n            [\r\n                2,\r\n                4,\r\n                -1,\r\n                -1\r\n            ]\r\n        ],\r\n        [\r\n            [\r\n                -1,\r\n                -1,\r\n                -1,\r\n                -1\r\n            ],\r\n            [\r\n                -1,\r\n                -1,\r\n                -1,\r\n                -1\r\n            ],\r\n            [\r\n                2,\r\n                -1,\r\n                -1,\r\n                -1\r\n            ],\r\n            [\r\n                2,\r\n                3,\r\n                -1,\r\n                -1\r\n            ],\r\n            [\r\n                2,\r\n                4,\r\n                -1,\r\n                -1\r\n            ],\r\n            [\r\n                4,\r\n                -1,\r\n                -1,\r\n                -1\r\n            ]\r\n        ],\r\n        [\r\n            [\r\n                -1,\r\n                -1,\r\n                -1,\r\n                -1\r\n            ],\r\n            [\r\n                -1,\r\n                -1,\r\n                -1,\r\n                -1\r\n            ],\r\n            [\r\n                -1,\r\n                -1,\r\n                -1,\r\n                -1\r\n            ],\r\n            [\r\n                3,\r\n                -1,\r\n                -1,\r\n                -1\r\n            ],\r\n            [\r\n                2,\r\n                -1,\r\n                -1,\r\n                -1\r\n            ],\r\n            [\r\n                2,\r\n                4,\r\n                -1,\r\n                -1\r\n            ]\r\n        ],\r\n        [\r\n            [\r\n                -1,\r\n                -1,\r\n                -1,\r\n                -1\r\n            ],\r\n            [\r\n                -1,\r\n                -1,\r\n                -1,\r\n                -1\r\n            ],\r\n            [\r\n                -1,\r\n                -1,\r\n                -1,\r\n                -1\r\n            ],\r\n            [\r\n                -1,\r\n                -1,\r\n                -1,\r\n                -1\r\n            ],\r\n            [\r\n                4,\r\n                -1,\r\n                -1,\r\n                -1\r\n            ],\r\n            [\r\n                4,\r\n                5,\r\n                -1,\r\n                -1\r\n            ]\r\n        ],\r\n        [\r\n            [\r\n                -1,\r\n                -1,\r\n                -1,\r\n                -1\r\n            ],\r\n            [\r\n                -1,\r\n                -1,\r\n                -1,\r\n                -1\r\n            ],\r\n            [\r\n                -1,\r\n                -1,\r\n                -1,\r\n                -1\r\n            ],\r\n            [\r\n                -1,\r\n                -1,\r\n                -1,\r\n                -1\r\n            ],\r\n            [\r\n                -1,\r\n                -1,\r\n                -1,\r\n                -1\r\n            ],\r\n            [\r\n                5,\r\n                -1,\r\n                -1,\r\n                -1\r\n            ]\r\n        ]\r\n    ],\r\n    \"names\": [\r\n        [\r\n            \"Aaron\",\r\n            \"Adam\",\r\n            \"Adrian\",\r\n            \"Aiden\",\r\n            \"Ayden\",\r\n            \"Alex\",\r\n            \"Alexander\",\r\n            \"Alfie\",\r\n            \"Andrew\",\r\n            \"Anthony\",\r\n            \"Archie\",\r\n            \"Austin\",\r\n            \"Ben\",\r\n            \"Benjamin\",\r\n            \"Bentley\",\r\n            \"Bill\",\r\n            \"Billy\",\r\n            \"Blake\",\r\n            \"Bradley\",\r\n            \"Brandon\",\r\n            \"Brayden\",\r\n            \"Brody\",\r\n            \"Bryson\",\r\n            \"Caleb\",\r\n            \"Callum\",\r\n            \"Cameron\",\r\n            \"Carlos\",\r\n            \"Charlie\",\r\n            \"Charles\",\r\n            \"Carson\",\r\n            \"Carter\",\r\n            \"Chase\",\r\n            \"Chris\",\r\n            \"Christian\",\r\n            \"Cody\",\r\n            \"Colton\",\r\n            \"Connor\",\r\n            \"Cooper\",\r\n            \"Damian\",\r\n            \"Daniel\",\r\n            \"David\",\r\n            \"Dexter\",\r\n            \"Dominic\",\r\n            \"Dylan\",\r\n            \"Easton\",\r\n            \"Edward\",\r\n            \"Eli\",\r\n            \"Elijah\",\r\n            \"Elliot\",\r\n            \"Ethan\",\r\n            \"Evan\",\r\n            \"Finlay\",\r\n            \"Frankie\",\r\n            \"Freddie\",\r\n            \"Gabriel\",\r\n            \"Gavin\",\r\n            \"George\",\r\n            \"Grayson\",\r\n            \"Harrison\",\r\n            \"Harvey\",\r\n            \"Henry\",\r\n            \"Hudson\",\r\n            \"Hugo\",\r\n            \"Hunter\",\r\n            \"Ian\",\r\n            \"Isaac\",\r\n            \"Isaiah\",\r\n            \"Jace\",\r\n            \"Jack\",\r\n            \"Jackson\",\r\n            \"Jaxon\",\r\n            \"Jacob\",\r\n            \"Jake\",\r\n            \"James\",\r\n            \"Jason\",\r\n            \"Jayden\",\r\n            \"Jenson\",\r\n            \"Jeremiah\",\r\n            \"John\",\r\n            \"Juan\",\r\n            \"Jonathan\",\r\n            \"Jordan\",\r\n            \"Jose\",\r\n            \"Joseph\",\r\n            \"Josiah\",\r\n            \"Joshua\",\r\n            \"Jude\",\r\n            \"Julian\",\r\n            \"Justin\",\r\n            \"Kai\",\r\n            \"Kayden\",\r\n            \"Kevin\",\r\n            \"Kian\",\r\n            \"Landon\",\r\n            \"Levi\",\r\n            \"Leo\",\r\n            \"Logan\",\r\n            \"Lucas\",\r\n            \"Luke\",\r\n            \"Luis\",\r\n            \"Lachlan\",\r\n            \"Mason\",\r\n            \"Matthew\",\r\n            \"Max\",\r\n            \"Michael\",\r\n            \"Miguel\",\r\n            \"Nathan\",\r\n            \"Nathaniel\",\r\n            \"Nicholas\",\r\n            \"Noah\",\r\n            \"Nolan\",\r\n            \"Olly\",\r\n            \"Oliver\",\r\n            \"Owen\",\r\n            \"Parker\",\r\n            \"Philip\",\r\n            \"Rhys\",\r\n            \"Reece\",\r\n            \"Rob\",\r\n            \"Robert\",\r\n            \"Ryan\",\r\n            \"Ryder\",\r\n            \"Samuel\",\r\n            \"Sebastian\",\r\n            \"Seth\",\r\n            \"Thomas\",\r\n            \"Tommy\",\r\n            \"Trent\",\r\n            \"Tristan\",\r\n            \"Tyler\",\r\n            \"William\",\r\n            \"Liam\",\r\n            \"Wyatt\",\r\n            \"Xavier\",\r\n            \"Zac\",\r\n            \"Zachary\",\r\n            \"Alex\",\r\n            \"Alexis\",\r\n            \"Angel\",\r\n            \"Bailey\",\r\n            \"Darcy\",\r\n            \"Darcey\",\r\n            \"Genesis\",\r\n            \"Kennedy\",\r\n            \"Mackenzie\",\r\n            \"Morgan\",\r\n            \"Peyton\",\r\n            \"Sam\",\r\n            \"Taylor\"\r\n        ],\r\n        [\r\n            \"Aaliyah\",\r\n            \"Abigail\",\r\n            \"Addison\",\r\n            \"Madison\",\r\n            \"Maddison\",\r\n            \"Alexa\",\r\n            \"Alexandra\",\r\n            \"Alison\",\r\n            \"Allison\",\r\n            \"Alyssa\",\r\n            \"Amelia\",\r\n            \"Amy\",\r\n            \"Andrea\",\r\n            \"Anna\",\r\n            \"Annabelle\",\r\n            \"Aria\",\r\n            \"Ariana\",\r\n            \"Arianna\",\r\n            \"Ashley\",\r\n            \"Aubree\",\r\n            \"Aubrey\",\r\n            \"Audrey\",\r\n            \"Autumn\",\r\n            \"Ava\",\r\n            \"Avery\",\r\n            \"Bella\",\r\n            \"Bethany\",\r\n            \"Brianna\",\r\n            \"Brooklyn\",\r\n            \"Camila\",\r\n            \"Caroline\",\r\n            \"Charlotte\",\r\n            \"Chloe\",\r\n            \"Khloe\",\r\n            \"Claire\",\r\n            \"Ella\",\r\n            \"Ellie\",\r\n            \"Elenor\",\r\n            \"Elizabeth\",\r\n            \"Lizabeth\",\r\n            \"Liza\",\r\n            \"Emily\",\r\n            \"Emma\",\r\n            \"Eva\",\r\n            \"Evie\",\r\n            \"Evelyn\",\r\n            \"Faith\",\r\n            \"Gabriella\",\r\n            \"Gianna\",\r\n            \"Grace\",\r\n            \"Hailey\",\r\n            \"Hannah\",\r\n            \"Harper\",\r\n            \"Heidi\",\r\n            \"Hollie\",\r\n            \"Holly\",\r\n            \"Isabella\",\r\n            \"Isobel\",\r\n            \"Jasmine\",\r\n            \"Jessica\",\r\n            \"Jocelyn\",\r\n            \"Julia\",\r\n            \"Katherine\",\r\n            \"Kayla\",\r\n            \"Kaylee\",\r\n            \"Kimberly\",\r\n            \"Kylie\",\r\n            \"Lacey\",\r\n            \"Lauren\",\r\n            \"Layla\",\r\n            \"Leah\",\r\n            \"Lexie\",\r\n            \"Lilian\",\r\n            \"Lily\",\r\n            \"Lola\",\r\n            \"London\",\r\n            \"Lucy\",\r\n            \"Lydia\",\r\n            \"Madeline\",\r\n            \"Madelyn\",\r\n            \"Maisie\",\r\n            \"Makayla\",\r\n            \"Maya\",\r\n            \"Mya\",\r\n            \"Megan\",\r\n            \"Melanie\",\r\n            \"Mia\",\r\n            \"Molly\",\r\n            \"Naomi\",\r\n            \"Natalie\",\r\n            \"Nevaeh\",\r\n            \"Olivia\",\r\n            \"Paige\",\r\n            \"Poppy\",\r\n            \"Piper\",\r\n            \"Reagan\",\r\n            \"Rebecca\",\r\n            \"Riley\",\r\n            \"Rosie\",\r\n            \"Samantha\",\r\n            \"Sarah\",\r\n            \"Savannah\",\r\n            \"Scarlett\",\r\n            \"Serenity\",\r\n            \"Skye\",\r\n            \"Skylar\",\r\n            \"Sofia\",\r\n            \"Sophia\",\r\n            \"Sophie\",\r\n            \"Spring\",\r\n            \"Stella\",\r\n            \"Summer\",\r\n            \"Sydney\",\r\n            \"Trinity\",\r\n            \"Vanessa\",\r\n            \"Victoria\",\r\n            \"Violet\",\r\n            \"Winter\",\r\n            \"Zara\",\r\n            \"Zoe\",\r\n            \"Zoey\",\r\n            \"Alex\",\r\n            \"Alexis\",\r\n            \"Angel\",\r\n            \"Bailey\",\r\n            \"Darcy\",\r\n            \"Darcey\",\r\n            \"Genesis\",\r\n            \"Kennedy\",\r\n            \"Mackenzie\",\r\n            \"Morgan\",\r\n            \"Peyton\",\r\n            \"Sam\",\r\n            \"Taylor\"\r\n        ]\r\n    ]\r\n};\r\n\r\nexport const islandAddresses=[\r\n  \"Ice-Cream Cone\",\r\n  \"Apple Pie\",\r\n  \"Strawberry\",\r\n  \"Prawn Salad\",\r\n  \"Sashimi\",\r\n  \"Orange Juice\",\r\n  \"Chocolate G\u00E2teau\",\r\n  \"Chewing Gum\",\r\n  \"Fried Chicken\",\r\n  \"Mushroom\",\r\n  \"Caviar\",\r\n  \"Gummy Candy\",\r\n  \"Gratin\",\r\n  \"Creamy Stew\",\r\n  \"Crepe\",\r\n  \"Grapefruit\",\r\n  \"Croissant\",\r\n  \"Coffee\",\r\n  \"Cheese\",\r\n  \"Rice\",\r\n  \"Cherries\",\r\n  \"Salad\",\r\n  \"Sandwich\",\r\n  \"Buttered Potato\",\r\n  \"Strawberry Shortcake\",\r\n  \"Watermelon\",\r\n  \"Steak\",\r\n  \"Sausage\",\r\n  \"Soft-Serve Ice Cream\",\r\n  \"Tacos\",\r\n  \"Roasted Chestnuts\",\r\n  \"Red Chili Pepper\",\r\n  \"Fried Tofu\",\r\n  \"Corn on the Cob\",\r\n  \"Doughnut\",\r\n  \"Banana\",\r\n  \"Cheeseburger\",\r\n  \"Salisbury Steak\",\r\n  \"Pizza\",\r\n  \"Cracker\",\r\n  \"Grapes\",\r\n  \"French Fries\",\r\n  \"Barbecue\",\r\n  \"Blue Cheese\",\r\n  \"French Toast\",\r\n  \"Potato Chips\",\r\n  \"Macadamia Nuts\",\r\n  \"Orange\",\r\n  \"Peach\",\r\n  \"Hard-Boiled Egg\",\r\n  \"Ramen\",\r\n  \"Apple\",\r\n  \"Tomato Juice\",\r\n  \"Avocado\",\r\n  \"Bacon\",\r\n  \"Broccoli\",\r\n  \"Calamari\",\r\n  \"Quiche\",\r\n  \"Cotton Candy\",\r\n  \"Cappuccino\",\r\n  \"Coconut\",\r\n  \"Cornflakes\",\r\n  \"Cheesecake\",\r\n  \"Kiwi\",\r\n  \"Lasagna\",\r\n  \"Macaron\",\r\n  \"Meatballs\",\r\n  \"Melon\",\r\n  \"Muffin\",\r\n  \"Paella\",\r\n  \"Peanuts\",\r\n  \"Pretzel\",\r\n  \"Risotto\",\r\n  \"Roast Beef\",\r\n  \"Salami\",\r\n  \"Escargot\",\r\n  \"Spaghetti Peperoncino\",\r\n  \"Tiramisu\",\r\n  \"Truffle\",\r\n  \"Waffle\",\r\n  \"Yogurt\",\r\n  \"Gelatin Snack\",\r\n  \"Soda\",\r\n  \"Pancakes\",\r\n  \"Instant Noodles\",\r\n  \"Stuffed Cabbage Roll\",\r\n  \"Tomato\",\r\n  \"Apple Juice\",\r\n  \"Mango\",\r\n  \"Hot Dog\",\r\n  \"Pineapple\",\r\n  \"Octopus\",\r\n  \"Green Pepper\",\r\n  \"Sushi\",\r\n  \"Pot-au-Feu\",\r\n  \"Celery\",\r\n  \"Popcorn\",\r\n  \"Durian\",\r\n  \"Garlic\",\r\n  \"Fried Egg\",\r\n];\r\n", "// platform.js (Node runtime)\r\n//\r\n// Browser bundles should alias `./platform.js` -> `./platform.browser.js`\r\n// so the rest of the codebase always imports from \"./platform.js\".\r\n\r\nimport { Buffer } from \"buffer\";\r\nimport { Buffer as NodeBuffer } from \"node:buffer\";\r\nimport * as nodeCrypto from \"node:crypto\";\r\nimport fs from \"fs\";\r\nimport util from \"node:util\";\r\n\r\nconst isNode=true;\r\nconst isBrowser=false;\r\n\r\nconst {\r\n  createCipheriv,\r\n  createDecipheriv,\r\n  randomBytes,\r\n  createHmac,\r\n  createHash,\r\n  timingSafeEqual,\r\n} = nodeCrypto;\r\nexport {\r\n  // Buffers\r\n  Buffer,\r\n  NodeBuffer,\r\n\r\n  // Crypto\r\n  createCipheriv,\r\n  createDecipheriv,\r\n  randomBytes,\r\n  createHmac,\r\n  createHash,\r\n  timingSafeEqual,\r\n\r\n  // FS / util\r\n  fs,\r\n  util,\r\n\r\n  isNode,\r\n  isBrowser\r\n};\r\n", "'use strict';\r\nimport {randomBytes} from \"./platform.js\";\r\n\r\nfunction string_to_bytes(str, utf8) {\r\n    if (utf8 === void 0) { utf8 = false; }\r\n    var len = str.length, bytes = new Uint8Array(utf8 ? 4 * len : len);\r\n    for (var i = 0, j = 0; i < len; i++) {\r\n        var c = str.charCodeAt(i);\r\n        if (utf8 && 0xd800 <= c && c <= 0xdbff) {\r\n            if (++i >= len)\r\n                throw new Error('Malformed string, low surrogate expected at position ' + i);\r\n            c = ((c ^ 0xd800) << 10) | 0x10000 | (str.charCodeAt(i) ^ 0xdc00);\r\n        }\r\n        else if (!utf8 && c >>> 8) {\r\n            throw new Error('Wide characters are not allowed.');\r\n        }\r\n        if (!utf8 || c <= 0x7f) {\r\n            bytes[j++] = c;\r\n        }\r\n        else if (c <= 0x7ff) {\r\n            bytes[j++] = 0xc0 | (c >> 6);\r\n            bytes[j++] = 0x80 | (c & 0x3f);\r\n        }\r\n        else if (c <= 0xffff) {\r\n            bytes[j++] = 0xe0 | (c >> 12);\r\n            bytes[j++] = 0x80 | ((c >> 6) & 0x3f);\r\n            bytes[j++] = 0x80 | (c & 0x3f);\r\n        }\r\n        else {\r\n            bytes[j++] = 0xf0 | (c >> 18);\r\n            bytes[j++] = 0x80 | ((c >> 12) & 0x3f);\r\n            bytes[j++] = 0x80 | ((c >> 6) & 0x3f);\r\n            bytes[j++] = 0x80 | (c & 0x3f);\r\n        }\r\n    }\r\n    return bytes.subarray(0, j);\r\n}\r\nfunction is_bytes(a) {\r\n    return a instanceof Uint8Array;\r\n}\r\nfunction _heap_init(heap, heapSize) {\r\n    var size = heap ? heap.byteLength : heapSize || 65536;\r\n    if (size & 0xfff || size <= 0)\r\n        throw new Error('heap size must be a positive integer and a multiple of 4096');\r\n    heap = heap || new Uint8Array(new ArrayBuffer(size));\r\n    return heap;\r\n}\r\nfunction _heap_write(heap, hpos, data, dpos, dlen) {\r\n    var hlen = heap.length - hpos;\r\n    var wlen = hlen < dlen ? hlen : dlen;\r\n    heap.set(data.subarray(dpos, dpos + wlen), hpos);\r\n    return wlen;\r\n}\r\n\r\n/**\r\n * Util exports\r\n */\r\n\r\nvar __extends = (undefined && undefined.__extends) || (function () {\r\n    var extendStatics = function (d, b) {\r\n        extendStatics = Object.setPrototypeOf ||\r\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n        return extendStatics(d, b);\r\n    };\r\n    return function (d, b) {\r\n        extendStatics(d, b);\r\n        function __() { this.constructor = d; }\r\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n    };\r\n})();\r\nvar IllegalStateError = /** @class */ (function (_super) {\r\n    __extends(IllegalStateError, _super);\r\n    function IllegalStateError() {\r\n        var args = [];\r\n        for (var _i = 0; _i < arguments.length; _i++) {\r\n            args[_i] = arguments[_i];\r\n        }\r\n        var _this = _super.apply(this, args) || this;\r\n        return _this;\r\n    }\r\n    return IllegalStateError;\r\n}(Error));\r\nvar IllegalArgumentError = /** @class */ (function (_super) {\r\n    __extends(IllegalArgumentError, _super);\r\n    function IllegalArgumentError() {\r\n        var args = [];\r\n        for (var _i = 0; _i < arguments.length; _i++) {\r\n            args[_i] = arguments[_i];\r\n        }\r\n        var _this = _super.apply(this, args) || this;\r\n        return _this;\r\n    }\r\n    return IllegalArgumentError;\r\n}(Error));\r\nvar SecurityError = /** @class */ (function (_super) {\r\n    __extends(SecurityError, _super);\r\n    function SecurityError() {\r\n        var args = [];\r\n        for (var _i = 0; _i < arguments.length; _i++) {\r\n            args[_i] = arguments[_i];\r\n        }\r\n        var _this = _super.apply(this, args) || this;\r\n        return _this;\r\n    }\r\n    return SecurityError;\r\n}(Error));\r\n\r\n/**\r\n * @file {@link http://asmjs.org Asm.js} implementation of the {@link https://en.wikipedia.org/wiki/Advanced_Encryption_Standard Advanced Encryption Standard}.\r\n * @author Artem S Vybornov <vybornov@gmail.com>\r\n * @license MIT\r\n */\r\nvar AES_asm = function () {\r\n\r\n    /**\r\n     * Galois Field stuff init flag\r\n     */\r\n    var ginit_done = false;\r\n\r\n    /**\r\n     * Galois Field exponentiation and logarithm tables for 3 (the generator)\r\n     */\r\n    var gexp3, glog3;\r\n\r\n    /**\r\n     * Init Galois Field tables\r\n     */\r\n    function ginit() {\r\n        gexp3 = [],\r\n            glog3 = [];\r\n\r\n        var a = 1, c, d;\r\n        for (c = 0; c < 255; c++) {\r\n            gexp3[c] = a;\r\n\r\n            // Multiply by three\r\n            d = a & 0x80, a <<= 1, a &= 255;\r\n            if (d === 0x80) a ^= 0x1b;\r\n            a ^= gexp3[c];\r\n\r\n            // Set the log table value\r\n            glog3[gexp3[c]] = c;\r\n        }\r\n        gexp3[255] = gexp3[0];\r\n        glog3[0] = 0;\r\n\r\n        ginit_done = true;\r\n    }\r\n\r\n    /**\r\n     * Galois Field multiplication\r\n     * @param {number} a\r\n     * @param {number} b\r\n     * @return {number}\r\n     */\r\n    function gmul(a, b) {\r\n        var c = gexp3[(glog3[a] + glog3[b]) % 255];\r\n        if (a === 0 || b === 0) c = 0;\r\n        return c;\r\n    }\r\n\r\n    /**\r\n     * Galois Field reciprocal\r\n     * @param {number} a\r\n     * @return {number}\r\n     */\r\n    function ginv(a) {\r\n        var i = gexp3[255 - glog3[a]];\r\n        if (a === 0) i = 0;\r\n        return i;\r\n    }\r\n\r\n    /**\r\n     * AES stuff init flag\r\n     */\r\n    var aes_init_done = false;\r\n\r\n    /**\r\n     * Encryption, Decryption, S-Box and KeyTransform tables\r\n     *\r\n     * @type {number[]}\r\n     */\r\n    var aes_sbox;\r\n\r\n    /**\r\n     * @type {number[]}\r\n     */\r\n    var aes_sinv;\r\n\r\n    /**\r\n     * @type {number[][]}\r\n     */\r\n    var aes_enc;\r\n\r\n    /**\r\n     * @type {number[][]}\r\n     */\r\n    var aes_dec;\r\n\r\n    /**\r\n     * Init AES tables\r\n     */\r\n    function aes_init() {\r\n        if (!ginit_done) ginit();\r\n\r\n        // Calculates AES S-Box value\r\n        function _s(a) {\r\n            var c, s, x;\r\n            s = x = ginv(a);\r\n            for (c = 0; c < 4; c++) {\r\n                s = ((s << 1) | (s >>> 7)) & 255;\r\n                x ^= s;\r\n            }\r\n            x ^= 99;\r\n            return x;\r\n        }\r\n\r\n        // Tables\r\n        aes_sbox = [],\r\n            aes_sinv = [],\r\n            aes_enc = [[], [], [], []],\r\n            aes_dec = [[], [], [], []];\r\n\r\n        for (var i = 0; i < 256; i++) {\r\n            var s = _s(i);\r\n\r\n            // S-Box and its inverse\r\n            aes_sbox[i] = s;\r\n            aes_sinv[s] = i;\r\n\r\n            // Ecryption and Decryption tables\r\n            aes_enc[0][i] = (gmul(2, s) << 24) | (s << 16) | (s << 8) | gmul(3, s);\r\n            aes_dec[0][s] = (gmul(14, i) << 24) | (gmul(9, i) << 16) | (gmul(13, i) << 8) | gmul(11, i);\r\n            // Rotate tables\r\n            for (var t = 1; t < 4; t++) {\r\n                aes_enc[t][i] = (aes_enc[t - 1][i] >>> 8) | (aes_enc[t - 1][i] << 24);\r\n                aes_dec[t][s] = (aes_dec[t - 1][s] >>> 8) | (aes_dec[t - 1][s] << 24);\r\n            }\r\n        }\r\n\r\n        aes_init_done = true;\r\n    }\r\n\r\n    /**\r\n     * Asm.js module constructor.\r\n     *\r\n     * <p>\r\n     * Heap buffer layout by offset:\r\n     * <pre>\r\n     * 0x0000   encryption key schedule\r\n     * 0x0400   decryption key schedule\r\n     * 0x0800   sbox\r\n     * 0x0c00   inv sbox\r\n     * 0x1000   encryption tables\r\n     * 0x2000   decryption tables\r\n     * 0x3000   reserved (future GCM multiplication lookup table)\r\n     * 0x4000   data\r\n     * </pre>\r\n     * Don't touch anything before <code>0x400</code>.\r\n     * </p>\r\n     *\r\n     * @alias AES_asm\r\n     * @class\r\n     * @param foreign - <i>ignored</i>\r\n     * @param buffer - heap buffer to link with\r\n     */\r\n    var wrapper = function (foreign, buffer) {\r\n        // Init AES stuff for the first time\r\n        if (!aes_init_done) aes_init();\r\n\r\n        // Fill up AES tables\r\n        var heap = new Uint32Array(buffer);\r\n        heap.set(aes_sbox, 0x0800 >> 2);\r\n        heap.set(aes_sinv, 0x0c00 >> 2);\r\n        for (var i = 0; i < 4; i++) {\r\n            heap.set(aes_enc[i], (0x1000 + 0x400 * i) >> 2);\r\n            heap.set(aes_dec[i], (0x2000 + 0x400 * i) >> 2);\r\n        }\r\n\r\n        /**\r\n         * Calculate AES key schedules.\r\n         * @instance\r\n         * @memberof AES_asm\r\n         * @param {number} ks - key size, 4/6/8 (for 128/192/256-bit key correspondingly)\r\n         * @param {number} k0 - key vector components\r\n         * @param {number} k1 - key vector components\r\n         * @param {number} k2 - key vector components\r\n         * @param {number} k3 - key vector components\r\n         * @param {number} k4 - key vector components\r\n         * @param {number} k5 - key vector components\r\n         * @param {number} k6 - key vector components\r\n         * @param {number} k7 - key vector components\r\n         */\r\n        function set_key(ks, k0, k1, k2, k3, k4, k5, k6, k7) {\r\n            var ekeys = heap.subarray(0x000, 60),\r\n                dkeys = heap.subarray(0x100, 0x100 + 60);\r\n\r\n            // Encryption key schedule\r\n            ekeys.set([k0, k1, k2, k3, k4, k5, k6, k7]);\r\n            for (var i = ks, rcon = 1; i < 4 * ks + 28; i++) {\r\n                var k = ekeys[i - 1];\r\n                if ((i % ks === 0) || (ks === 8 && i % ks === 4)) {\r\n                    k = aes_sbox[k >>> 24] << 24 ^ aes_sbox[k >>> 16 & 255] << 16 ^ aes_sbox[k >>> 8 & 255] << 8 ^ aes_sbox[k & 255];\r\n                }\r\n                if (i % ks === 0) {\r\n                    k = (k << 8) ^ (k >>> 24) ^ (rcon << 24);\r\n                    rcon = (rcon << 1) ^ ((rcon & 0x80) ? 0x1b : 0);\r\n                }\r\n                ekeys[i] = ekeys[i - ks] ^ k;\r\n            }\r\n\r\n            // Decryption key schedule\r\n            for (var j = 0; j < i; j += 4) {\r\n                for (var jj = 0; jj < 4; jj++) {\r\n                    var k = ekeys[i - (4 + j) + (4 - jj) % 4];\r\n                    if (j < 4 || j >= i - 4) {\r\n                        dkeys[j + jj] = k;\r\n                    } else {\r\n                        dkeys[j + jj] = aes_dec[0][aes_sbox[k >>> 24]]\r\n                            ^ aes_dec[1][aes_sbox[k >>> 16 & 255]]\r\n                            ^ aes_dec[2][aes_sbox[k >>> 8 & 255]]\r\n                            ^ aes_dec[3][aes_sbox[k & 255]];\r\n                    }\r\n                }\r\n            }\r\n\r\n            // Set rounds number\r\n            asm.set_rounds(ks + 5);\r\n        }\r\n\r\n        // create library object with necessary properties\r\n        var stdlib = { Uint8Array: Uint8Array, Uint32Array: Uint32Array };\r\n\r\n        var asm = function (stdlib, foreign, buffer) {\r\n            \"use asm\";\r\n\r\n            var S0 = 0, S1 = 0, S2 = 0, S3 = 0,\r\n                I0 = 0, I1 = 0, I2 = 0, I3 = 0,\r\n                N0 = 0, N1 = 0, N2 = 0, N3 = 0,\r\n                M0 = 0, M1 = 0, M2 = 0, M3 = 0,\r\n                H0 = 0, H1 = 0, H2 = 0, H3 = 0,\r\n                R = 0;\r\n\r\n            var HEAP = new stdlib.Uint32Array(buffer),\r\n                DATA = new stdlib.Uint8Array(buffer);\r\n\r\n            /**\r\n             * AES core\r\n             * @param {number} k - precomputed key schedule offset\r\n             * @param {number} s - precomputed sbox table offset\r\n             * @param {number} t - precomputed round table offset\r\n             * @param {number} r - number of inner rounds to perform\r\n             * @param {number} x0 - 128-bit input block vector\r\n             * @param {number} x1 - 128-bit input block vector\r\n             * @param {number} x2 - 128-bit input block vector\r\n             * @param {number} x3 - 128-bit input block vector\r\n             */\r\n            function _core(k, s, t, r, x0, x1, x2, x3) {\r\n                k = k | 0;\r\n                s = s | 0;\r\n                t = t | 0;\r\n                r = r | 0;\r\n                x0 = x0 | 0;\r\n                x1 = x1 | 0;\r\n                x2 = x2 | 0;\r\n                x3 = x3 | 0;\r\n\r\n                var t1 = 0, t2 = 0, t3 = 0,\r\n                    y0 = 0, y1 = 0, y2 = 0, y3 = 0,\r\n                    i = 0;\r\n\r\n                t1 = t | 0x400, t2 = t | 0x800, t3 = t | 0xc00;\r\n\r\n                // round 0\r\n                x0 = x0 ^ HEAP[(k | 0) >> 2],\r\n                    x1 = x1 ^ HEAP[(k | 4) >> 2],\r\n                    x2 = x2 ^ HEAP[(k | 8) >> 2],\r\n                    x3 = x3 ^ HEAP[(k | 12) >> 2];\r\n\r\n                // round 1..r\r\n                for (i = 16; (i | 0) <= (r << 4); i = (i + 16) | 0) {\r\n                    y0 = HEAP[(t | x0 >> 22 & 1020) >> 2] ^ HEAP[(t1 | x1 >> 14 & 1020) >> 2] ^ HEAP[(t2 | x2 >> 6 & 1020) >> 2] ^ HEAP[(t3 | x3 << 2 & 1020) >> 2] ^ HEAP[(k | i | 0) >> 2],\r\n                        y1 = HEAP[(t | x1 >> 22 & 1020) >> 2] ^ HEAP[(t1 | x2 >> 14 & 1020) >> 2] ^ HEAP[(t2 | x3 >> 6 & 1020) >> 2] ^ HEAP[(t3 | x0 << 2 & 1020) >> 2] ^ HEAP[(k | i | 4) >> 2],\r\n                        y2 = HEAP[(t | x2 >> 22 & 1020) >> 2] ^ HEAP[(t1 | x3 >> 14 & 1020) >> 2] ^ HEAP[(t2 | x0 >> 6 & 1020) >> 2] ^ HEAP[(t3 | x1 << 2 & 1020) >> 2] ^ HEAP[(k | i | 8) >> 2],\r\n                        y3 = HEAP[(t | x3 >> 22 & 1020) >> 2] ^ HEAP[(t1 | x0 >> 14 & 1020) >> 2] ^ HEAP[(t2 | x1 >> 6 & 1020) >> 2] ^ HEAP[(t3 | x2 << 2 & 1020) >> 2] ^ HEAP[(k | i | 12) >> 2];\r\n                    x0 = y0, x1 = y1, x2 = y2, x3 = y3;\r\n                }\r\n\r\n                // final round\r\n                S0 = HEAP[(s | x0 >> 22 & 1020) >> 2] << 24 ^ HEAP[(s | x1 >> 14 & 1020) >> 2] << 16 ^ HEAP[(s | x2 >> 6 & 1020) >> 2] << 8 ^ HEAP[(s | x3 << 2 & 1020) >> 2] ^ HEAP[(k | i | 0) >> 2],\r\n                    S1 = HEAP[(s | x1 >> 22 & 1020) >> 2] << 24 ^ HEAP[(s | x2 >> 14 & 1020) >> 2] << 16 ^ HEAP[(s | x3 >> 6 & 1020) >> 2] << 8 ^ HEAP[(s | x0 << 2 & 1020) >> 2] ^ HEAP[(k | i | 4) >> 2],\r\n                    S2 = HEAP[(s | x2 >> 22 & 1020) >> 2] << 24 ^ HEAP[(s | x3 >> 14 & 1020) >> 2] << 16 ^ HEAP[(s | x0 >> 6 & 1020) >> 2] << 8 ^ HEAP[(s | x1 << 2 & 1020) >> 2] ^ HEAP[(k | i | 8) >> 2],\r\n                    S3 = HEAP[(s | x3 >> 22 & 1020) >> 2] << 24 ^ HEAP[(s | x0 >> 14 & 1020) >> 2] << 16 ^ HEAP[(s | x1 >> 6 & 1020) >> 2] << 8 ^ HEAP[(s | x2 << 2 & 1020) >> 2] ^ HEAP[(k | i | 12) >> 2];\r\n            }\r\n\r\n            /**\r\n             * ECB mode encryption\r\n             * @param {number} x0 - 128-bit input block vector\r\n             * @param {number} x1 - 128-bit input block vector\r\n             * @param {number} x2 - 128-bit input block vector\r\n             * @param {number} x3 - 128-bit input block vector\r\n             */\r\n            function _ecb_enc(x0, x1, x2, x3) {\r\n                x0 = x0 | 0;\r\n                x1 = x1 | 0;\r\n                x2 = x2 | 0;\r\n                x3 = x3 | 0;\r\n\r\n                _core(\r\n                    0x0000, 0x0800, 0x1000,\r\n                    R,\r\n                    x0,\r\n                    x1,\r\n                    x2,\r\n                    x3\r\n                );\r\n            }\r\n\r\n            /**\r\n             * ECB mode decryption\r\n             * @param {number} x0 - 128-bit input block vector\r\n             * @param {number} x1 - 128-bit input block vector\r\n             * @param {number} x2 - 128-bit input block vector\r\n             * @param {number} x3 - 128-bit input block vector\r\n             */\r\n            function _ecb_dec(x0, x1, x2, x3) {\r\n                x0 = x0 | 0;\r\n                x1 = x1 | 0;\r\n                x2 = x2 | 0;\r\n                x3 = x3 | 0;\r\n\r\n                var t = 0;\r\n\r\n                _core(\r\n                    0x0400, 0x0c00, 0x2000,\r\n                    R,\r\n                    x0,\r\n                    x3,\r\n                    x2,\r\n                    x1\r\n                );\r\n\r\n                t = S1, S1 = S3, S3 = t;\r\n            }\r\n\r\n\r\n            /**\r\n             * CBC mode encryption\r\n             * @param {number} x0 - 128-bit input block vector\r\n             * @param {number} x1 - 128-bit input block vector\r\n             * @param {number} x2 - 128-bit input block vector\r\n             * @param {number} x3 - 128-bit input block vector\r\n             */\r\n            function _cbc_enc(x0, x1, x2, x3) {\r\n                x0 = x0 | 0;\r\n                x1 = x1 | 0;\r\n                x2 = x2 | 0;\r\n                x3 = x3 | 0;\r\n\r\n                _core(\r\n                    0x0000, 0x0800, 0x1000,\r\n                    R,\r\n                    I0 ^ x0,\r\n                    I1 ^ x1,\r\n                    I2 ^ x2,\r\n                    I3 ^ x3\r\n                );\r\n\r\n                I0 = S0,\r\n                    I1 = S1,\r\n                    I2 = S2,\r\n                    I3 = S3;\r\n            }\r\n\r\n            /**\r\n             * CBC mode decryption\r\n             * @param {number} x0 - 128-bit input block vector\r\n             * @param {number} x1 - 128-bit input block vector\r\n             * @param {number} x2 - 128-bit input block vector\r\n             * @param {number} x3 - 128-bit input block vector\r\n             */\r\n            function _cbc_dec(x0, x1, x2, x3) {\r\n                x0 = x0 | 0;\r\n                x1 = x1 | 0;\r\n                x2 = x2 | 0;\r\n                x3 = x3 | 0;\r\n\r\n                var t = 0;\r\n\r\n                _core(\r\n                    0x0400, 0x0c00, 0x2000,\r\n                    R,\r\n                    x0,\r\n                    x3,\r\n                    x2,\r\n                    x1\r\n                );\r\n\r\n                t = S1, S1 = S3, S3 = t;\r\n\r\n                S0 = S0 ^ I0,\r\n                    S1 = S1 ^ I1,\r\n                    S2 = S2 ^ I2,\r\n                    S3 = S3 ^ I3;\r\n\r\n                I0 = x0,\r\n                    I1 = x1,\r\n                    I2 = x2,\r\n                    I3 = x3;\r\n            }\r\n\r\n            /**\r\n             * CFB mode encryption\r\n             * @param {number} x0 - 128-bit input block vector\r\n             * @param {number} x1 - 128-bit input block vector\r\n             * @param {number} x2 - 128-bit input block vector\r\n             * @param {number} x3 - 128-bit input block vector\r\n             */\r\n            function _cfb_enc(x0, x1, x2, x3) {\r\n                x0 = x0 | 0;\r\n                x1 = x1 | 0;\r\n                x2 = x2 | 0;\r\n                x3 = x3 | 0;\r\n\r\n                _core(\r\n                    0x0000, 0x0800, 0x1000,\r\n                    R,\r\n                    I0,\r\n                    I1,\r\n                    I2,\r\n                    I3\r\n                );\r\n\r\n                I0 = S0 = S0 ^ x0,\r\n                    I1 = S1 = S1 ^ x1,\r\n                    I2 = S2 = S2 ^ x2,\r\n                    I3 = S3 = S3 ^ x3;\r\n            }\r\n\r\n\r\n            /**\r\n             * CFB mode decryption\r\n             * @param {number} x0 - 128-bit input block vector\r\n             * @param {number} x1 - 128-bit input block vector\r\n             * @param {number} x2 - 128-bit input block vector\r\n             * @param {number} x3 - 128-bit input block vector\r\n             */\r\n            function _cfb_dec(x0, x1, x2, x3) {\r\n                x0 = x0 | 0;\r\n                x1 = x1 | 0;\r\n                x2 = x2 | 0;\r\n                x3 = x3 | 0;\r\n\r\n                _core(\r\n                    0x0000, 0x0800, 0x1000,\r\n                    R,\r\n                    I0,\r\n                    I1,\r\n                    I2,\r\n                    I3\r\n                );\r\n\r\n                S0 = S0 ^ x0,\r\n                    S1 = S1 ^ x1,\r\n                    S2 = S2 ^ x2,\r\n                    S3 = S3 ^ x3;\r\n\r\n                I0 = x0,\r\n                    I1 = x1,\r\n                    I2 = x2,\r\n                    I3 = x3;\r\n            }\r\n\r\n            /**\r\n             * OFB mode encryption / decryption\r\n             * @param {number} x0 - 128-bit input block vector\r\n             * @param {number} x1 - 128-bit input block vector\r\n             * @param {number} x2 - 128-bit input block vector\r\n             * @param {number} x3 - 128-bit input block vector\r\n             */\r\n            function _ofb(x0, x1, x2, x3) {\r\n                x0 = x0 | 0;\r\n                x1 = x1 | 0;\r\n                x2 = x2 | 0;\r\n                x3 = x3 | 0;\r\n\r\n                _core(\r\n                    0x0000, 0x0800, 0x1000,\r\n                    R,\r\n                    I0,\r\n                    I1,\r\n                    I2,\r\n                    I3\r\n                );\r\n\r\n                I0 = S0,\r\n                    I1 = S1,\r\n                    I2 = S2,\r\n                    I3 = S3;\r\n\r\n                S0 = S0 ^ x0,\r\n                    S1 = S1 ^ x1,\r\n                    S2 = S2 ^ x2,\r\n                    S3 = S3 ^ x3;\r\n            }\r\n\r\n            /**\r\n             * CTR mode encryption / decryption\r\n             * @param {number} x0 - 128-bit input block vector\r\n             * @param {number} x1 - 128-bit input block vector\r\n             * @param {number} x2 - 128-bit input block vector\r\n             * @param {number} x3 - 128-bit input block vector\r\n             */\r\n            function _ctr(x0, x1, x2, x3) {\r\n                x0 = x0 | 0;\r\n                x1 = x1 | 0;\r\n                x2 = x2 | 0;\r\n                x3 = x3 | 0;\r\n\r\n                _core(\r\n                    0x0000, 0x0800, 0x1000,\r\n                    R,\r\n                    N0,\r\n                    N1,\r\n                    N2,\r\n                    N3\r\n                );\r\n\r\n                N3 = (~M3 & N3) | M3 & (N3 + 1);\r\n                N2 = (~M2 & N2) | M2 & (N2 + ((N3 | 0) == 0));\r\n                N1 = (~M1 & N1) | M1 & (N1 + ((N2 | 0) == 0));\r\n                N0 = (~M0 & N0) | M0 & (N0 + ((N1 | 0) == 0));\r\n\r\n                S0 = S0 ^ x0;\r\n                S1 = S1 ^ x1;\r\n                S2 = S2 ^ x2;\r\n                S3 = S3 ^ x3;\r\n            }\r\n\r\n            /**\r\n             * GCM mode MAC calculation\r\n             * @param {number} x0 - 128-bit input block vector\r\n             * @param {number} x1 - 128-bit input block vector\r\n             * @param {number} x2 - 128-bit input block vector\r\n             * @param {number} x3 - 128-bit input block vector\r\n             */\r\n            function _gcm_mac(x0, x1, x2, x3) {\r\n                x0 = x0 | 0;\r\n                x1 = x1 | 0;\r\n                x2 = x2 | 0;\r\n                x3 = x3 | 0;\r\n\r\n                var y0 = 0, y1 = 0, y2 = 0, y3 = 0,\r\n                    z0 = 0, z1 = 0, z2 = 0, z3 = 0,\r\n                    i = 0, c = 0;\r\n\r\n                x0 = x0 ^ I0,\r\n                    x1 = x1 ^ I1,\r\n                    x2 = x2 ^ I2,\r\n                    x3 = x3 ^ I3;\r\n\r\n                y0 = H0 | 0,\r\n                    y1 = H1 | 0,\r\n                    y2 = H2 | 0,\r\n                    y3 = H3 | 0;\r\n\r\n                for (; (i | 0) < 128; i = (i + 1) | 0) {\r\n                    if (y0 >>> 31) {\r\n                        z0 = z0 ^ x0,\r\n                            z1 = z1 ^ x1,\r\n                            z2 = z2 ^ x2,\r\n                            z3 = z3 ^ x3;\r\n                    }\r\n\r\n                    y0 = (y0 << 1) | (y1 >>> 31),\r\n                        y1 = (y1 << 1) | (y2 >>> 31),\r\n                        y2 = (y2 << 1) | (y3 >>> 31),\r\n                        y3 = (y3 << 1);\r\n\r\n                    c = x3 & 1;\r\n\r\n                    x3 = (x3 >>> 1) | (x2 << 31),\r\n                        x2 = (x2 >>> 1) | (x1 << 31),\r\n                        x1 = (x1 >>> 1) | (x0 << 31),\r\n                        x0 = (x0 >>> 1);\r\n\r\n                    if (c) x0 = x0 ^ 0xe1000000;\r\n                }\r\n\r\n                I0 = z0,\r\n                    I1 = z1,\r\n                    I2 = z2,\r\n                    I3 = z3;\r\n            }\r\n\r\n            /**\r\n             * Set the internal rounds number.\r\n             * @instance\r\n             * @memberof AES_asm\r\n             * @param {number} r - number if inner AES rounds\r\n             */\r\n            function set_rounds(r) {\r\n                r = r | 0;\r\n                R = r;\r\n            }\r\n\r\n            /**\r\n             * Populate the internal state of the module.\r\n             * @instance\r\n             * @memberof AES_asm\r\n             * @param {number} s0 - state vector\r\n             * @param {number} s1 - state vector\r\n             * @param {number} s2 - state vector\r\n             * @param {number} s3 - state vector\r\n             */\r\n            function set_state(s0, s1, s2, s3) {\r\n                s0 = s0 | 0;\r\n                s1 = s1 | 0;\r\n                s2 = s2 | 0;\r\n                s3 = s3 | 0;\r\n\r\n                S0 = s0,\r\n                    S1 = s1,\r\n                    S2 = s2,\r\n                    S3 = s3;\r\n            }\r\n\r\n            /**\r\n             * Populate the internal iv of the module.\r\n             * @instance\r\n             * @memberof AES_asm\r\n             * @param {number} i0 - iv vector\r\n             * @param {number} i1 - iv vector\r\n             * @param {number} i2 - iv vector\r\n             * @param {number} i3 - iv vector\r\n             */\r\n            function set_iv(i0, i1, i2, i3) {\r\n                i0 = i0 | 0;\r\n                i1 = i1 | 0;\r\n                i2 = i2 | 0;\r\n                i3 = i3 | 0;\r\n\r\n                I0 = i0,\r\n                    I1 = i1,\r\n                    I2 = i2,\r\n                    I3 = i3;\r\n            }\r\n\r\n            /**\r\n             * Set nonce for CTR-family modes.\r\n             * @instance\r\n             * @memberof AES_asm\r\n             * @param {number} n0 - nonce vector\r\n             * @param {number} n1 - nonce vector\r\n             * @param {number} n2 - nonce vector\r\n             * @param {number} n3 - nonce vector\r\n             */\r\n            function set_nonce(n0, n1, n2, n3) {\r\n                n0 = n0 | 0;\r\n                n1 = n1 | 0;\r\n                n2 = n2 | 0;\r\n                n3 = n3 | 0;\r\n\r\n                N0 = n0,\r\n                    N1 = n1,\r\n                    N2 = n2,\r\n                    N3 = n3;\r\n            }\r\n\r\n            /**\r\n             * Set counter mask for CTR-family modes.\r\n             * @instance\r\n             * @memberof AES_asm\r\n             * @param {number} m0 - counter mask vector\r\n             * @param {number} m1 - counter mask vector\r\n             * @param {number} m2 - counter mask vector\r\n             * @param {number} m3 - counter mask vector\r\n             */\r\n            function set_mask(m0, m1, m2, m3) {\r\n                m0 = m0 | 0;\r\n                m1 = m1 | 0;\r\n                m2 = m2 | 0;\r\n                m3 = m3 | 0;\r\n\r\n                M0 = m0,\r\n                    M1 = m1,\r\n                    M2 = m2,\r\n                    M3 = m3;\r\n            }\r\n\r\n            /**\r\n             * Set counter for CTR-family modes.\r\n             * @instance\r\n             * @memberof AES_asm\r\n             * @param {number} c0 - counter vector\r\n             * @param {number} c1 - counter vector\r\n             * @param {number} c2 - counter vector\r\n             * @param {number} c3 - counter vector\r\n             */\r\n            function set_counter(c0, c1, c2, c3) {\r\n                c0 = c0 | 0;\r\n                c1 = c1 | 0;\r\n                c2 = c2 | 0;\r\n                c3 = c3 | 0;\r\n\r\n                N3 = (~M3 & N3) | M3 & c3,\r\n                    N2 = (~M2 & N2) | M2 & c2,\r\n                    N1 = (~M1 & N1) | M1 & c1,\r\n                    N0 = (~M0 & N0) | M0 & c0;\r\n            }\r\n\r\n            /**\r\n             * Store the internal state vector into the heap.\r\n             * @instance\r\n             * @memberof AES_asm\r\n             * @param {number} pos - offset where to put the data\r\n             * @return {number} The number of bytes have been written into the heap, always 16.\r\n             */\r\n            function get_state(pos) {\r\n                pos = pos | 0;\r\n\r\n                if (pos & 15) return -1;\r\n\r\n                DATA[pos | 0] = S0 >>> 24,\r\n                    DATA[pos | 1] = S0 >>> 16 & 255,\r\n                    DATA[pos | 2] = S0 >>> 8 & 255,\r\n                    DATA[pos | 3] = S0 & 255,\r\n                    DATA[pos | 4] = S1 >>> 24,\r\n                    DATA[pos | 5] = S1 >>> 16 & 255,\r\n                    DATA[pos | 6] = S1 >>> 8 & 255,\r\n                    DATA[pos | 7] = S1 & 255,\r\n                    DATA[pos | 8] = S2 >>> 24,\r\n                    DATA[pos | 9] = S2 >>> 16 & 255,\r\n                    DATA[pos | 10] = S2 >>> 8 & 255,\r\n                    DATA[pos | 11] = S2 & 255,\r\n                    DATA[pos | 12] = S3 >>> 24,\r\n                    DATA[pos | 13] = S3 >>> 16 & 255,\r\n                    DATA[pos | 14] = S3 >>> 8 & 255,\r\n                    DATA[pos | 15] = S3 & 255;\r\n\r\n                return 16;\r\n            }\r\n\r\n            /**\r\n             * Store the internal iv vector into the heap.\r\n             * @instance\r\n             * @memberof AES_asm\r\n             * @param {number} pos - offset where to put the data\r\n             * @return {number} The number of bytes have been written into the heap, always 16.\r\n             */\r\n            function get_iv(pos) {\r\n                pos = pos | 0;\r\n\r\n                if (pos & 15) return -1;\r\n\r\n                DATA[pos | 0] = I0 >>> 24,\r\n                    DATA[pos | 1] = I0 >>> 16 & 255,\r\n                    DATA[pos | 2] = I0 >>> 8 & 255,\r\n                    DATA[pos | 3] = I0 & 255,\r\n                    DATA[pos | 4] = I1 >>> 24,\r\n                    DATA[pos | 5] = I1 >>> 16 & 255,\r\n                    DATA[pos | 6] = I1 >>> 8 & 255,\r\n                    DATA[pos | 7] = I1 & 255,\r\n                    DATA[pos | 8] = I2 >>> 24,\r\n                    DATA[pos | 9] = I2 >>> 16 & 255,\r\n                    DATA[pos | 10] = I2 >>> 8 & 255,\r\n                    DATA[pos | 11] = I2 & 255,\r\n                    DATA[pos | 12] = I3 >>> 24,\r\n                    DATA[pos | 13] = I3 >>> 16 & 255,\r\n                    DATA[pos | 14] = I3 >>> 8 & 255,\r\n                    DATA[pos | 15] = I3 & 255;\r\n\r\n                return 16;\r\n            }\r\n\r\n            /**\r\n             * GCM initialization.\r\n             * @instance\r\n             * @memberof AES_asm\r\n             */\r\n            function gcm_init() {\r\n                _ecb_enc(0, 0, 0, 0);\r\n                H0 = S0,\r\n                    H1 = S1,\r\n                    H2 = S2,\r\n                    H3 = S3;\r\n            }\r\n\r\n            /**\r\n             * Perform ciphering operation on the supplied data.\r\n             * @instance\r\n             * @memberof AES_asm\r\n             * @param {number} mode - block cipher mode (see {@link AES_asm} mode constants)\r\n             * @param {number} pos - offset of the data being processed\r\n             * @param {number} len - length of the data being processed\r\n             * @return {number} Actual amount of data have been processed.\r\n             */\r\n            function cipher(mode, pos, len) {\r\n                mode = mode | 0;\r\n                pos = pos | 0;\r\n                len = len | 0;\r\n\r\n                var ret = 0;\r\n\r\n                if (pos & 15) return -1;\r\n\r\n                while ((len | 0) >= 16) {\r\n                    _cipher_modes[mode & 7](\r\n                        DATA[pos | 0] << 24 | DATA[pos | 1] << 16 | DATA[pos | 2] << 8 | DATA[pos | 3],\r\n                        DATA[pos | 4] << 24 | DATA[pos | 5] << 16 | DATA[pos | 6] << 8 | DATA[pos | 7],\r\n                        DATA[pos | 8] << 24 | DATA[pos | 9] << 16 | DATA[pos | 10] << 8 | DATA[pos | 11],\r\n                        DATA[pos | 12] << 24 | DATA[pos | 13] << 16 | DATA[pos | 14] << 8 | DATA[pos | 15]\r\n                    );\r\n\r\n                    DATA[pos | 0] = S0 >>> 24,\r\n                        DATA[pos | 1] = S0 >>> 16 & 255,\r\n                        DATA[pos | 2] = S0 >>> 8 & 255,\r\n                        DATA[pos | 3] = S0 & 255,\r\n                        DATA[pos | 4] = S1 >>> 24,\r\n                        DATA[pos | 5] = S1 >>> 16 & 255,\r\n                        DATA[pos | 6] = S1 >>> 8 & 255,\r\n                        DATA[pos | 7] = S1 & 255,\r\n                        DATA[pos | 8] = S2 >>> 24,\r\n                        DATA[pos | 9] = S2 >>> 16 & 255,\r\n                        DATA[pos | 10] = S2 >>> 8 & 255,\r\n                        DATA[pos | 11] = S2 & 255,\r\n                        DATA[pos | 12] = S3 >>> 24,\r\n                        DATA[pos | 13] = S3 >>> 16 & 255,\r\n                        DATA[pos | 14] = S3 >>> 8 & 255,\r\n                        DATA[pos | 15] = S3 & 255;\r\n\r\n                    ret = (ret + 16) | 0,\r\n                        pos = (pos + 16) | 0,\r\n                        len = (len - 16) | 0;\r\n                }\r\n\r\n                return ret | 0;\r\n            }\r\n\r\n            /**\r\n             * Calculates MAC of the supplied data.\r\n             * @instance\r\n             * @memberof AES_asm\r\n             * @param {number} mode - block cipher mode (see {@link AES_asm} mode constants)\r\n             * @param {number} pos - offset of the data being processed\r\n             * @param {number} len - length of the data being processed\r\n             * @return {number} Actual amount of data have been processed.\r\n             */\r\n            function mac(mode, pos, len) {\r\n                mode = mode | 0;\r\n                pos = pos | 0;\r\n                len = len | 0;\r\n\r\n                var ret = 0;\r\n\r\n                if (pos & 15) return -1;\r\n\r\n                while ((len | 0) >= 16) {\r\n                    _mac_modes[mode & 1](\r\n                        DATA[pos | 0] << 24 | DATA[pos | 1] << 16 | DATA[pos | 2] << 8 | DATA[pos | 3],\r\n                        DATA[pos | 4] << 24 | DATA[pos | 5] << 16 | DATA[pos | 6] << 8 | DATA[pos | 7],\r\n                        DATA[pos | 8] << 24 | DATA[pos | 9] << 16 | DATA[pos | 10] << 8 | DATA[pos | 11],\r\n                        DATA[pos | 12] << 24 | DATA[pos | 13] << 16 | DATA[pos | 14] << 8 | DATA[pos | 15]\r\n                    );\r\n\r\n                    ret = (ret + 16) | 0,\r\n                        pos = (pos + 16) | 0,\r\n                        len = (len - 16) | 0;\r\n                }\r\n\r\n                return ret | 0;\r\n            }\r\n\r\n            /**\r\n             * AES cipher modes table (virual methods)\r\n             */\r\n            var _cipher_modes = [_ecb_enc, _ecb_dec, _cbc_enc, _cbc_dec, _cfb_enc, _cfb_dec, _ofb, _ctr];\r\n\r\n            /**\r\n             * AES MAC modes table (virual methods)\r\n             */\r\n            var _mac_modes = [_cbc_enc, _gcm_mac];\r\n\r\n            /**\r\n             * Asm.js module exports\r\n             */\r\n            return {\r\n                set_rounds: set_rounds,\r\n                set_state: set_state,\r\n                set_iv: set_iv,\r\n                set_nonce: set_nonce,\r\n                set_mask: set_mask,\r\n                set_counter: set_counter,\r\n                get_state: get_state,\r\n                get_iv: get_iv,\r\n                gcm_init: gcm_init,\r\n                cipher: cipher,\r\n                mac: mac,\r\n            };\r\n        }(stdlib, foreign, buffer);\r\n\r\n        asm.set_key = set_key;\r\n\r\n        return asm;\r\n    };\r\n\r\n    /**\r\n     * AES enciphering mode constants\r\n     * @enum {number}\r\n     * @const\r\n     */\r\n    wrapper.ENC = {\r\n        ECB: 0,\r\n        CBC: 2,\r\n        CFB: 4,\r\n        OFB: 6,\r\n        CTR: 7,\r\n    },\r\n\r\n        /**\r\n         * AES deciphering mode constants\r\n         * @enum {number}\r\n         * @const\r\n         */\r\n        wrapper.DEC = {\r\n            ECB: 1,\r\n            CBC: 3,\r\n            CFB: 5,\r\n            OFB: 6,\r\n            CTR: 7,\r\n        },\r\n\r\n        /**\r\n         * AES MAC mode constants\r\n         * @enum {number}\r\n         * @const\r\n         */\r\n        wrapper.MAC = {\r\n            CBC: 0,\r\n            GCM: 1,\r\n        };\r\n\r\n    /**\r\n     * Heap data offset\r\n     * @type {number}\r\n     * @const\r\n     */\r\n    wrapper.HEAP_DATA = 0x4000;\r\n\r\n    return wrapper;\r\n}();\r\n\r\nvar AES = /** @class */ (function () {\r\n    function AES(key, iv, padding, mode, heap, asm) {\r\n        if (padding === void 0) { padding = true; }\r\n        this.pos = 0;\r\n        this.len = 0;\r\n        this.mode = mode;\r\n        // The AES \"worker\"\r\n        this.heap = heap ? heap : _heap_init().subarray(AES_asm.HEAP_DATA);\r\n        this.asm = asm ? asm : new AES_asm(null, this.heap.buffer);\r\n        // The AES object state\r\n        this.pos = 0;\r\n        this.len = 0;\r\n        // Key\r\n        var keylen = key.length;\r\n        if (keylen !== 16 && keylen !== 24 && keylen !== 32)\r\n            throw new IllegalArgumentError('illegal key size');\r\n        var keyview = new DataView(key.buffer, key.byteOffset, key.byteLength);\r\n        this.asm.set_key(keylen >> 2, keyview.getUint32(0), keyview.getUint32(4), keyview.getUint32(8), keyview.getUint32(12), keylen > 16 ? keyview.getUint32(16) : 0, keylen > 16 ? keyview.getUint32(20) : 0, keylen > 24 ? keyview.getUint32(24) : 0, keylen > 24 ? keyview.getUint32(28) : 0);\r\n        // IV\r\n        if (iv !== undefined) {\r\n            if (iv.length !== 16)\r\n                throw new IllegalArgumentError('illegal iv size');\r\n            var ivview = new DataView(iv.buffer, iv.byteOffset, iv.byteLength);\r\n            this.asm.set_iv(ivview.getUint32(0), ivview.getUint32(4), ivview.getUint32(8), ivview.getUint32(12));\r\n        }\r\n        else {\r\n            this.asm.set_iv(0, 0, 0, 0);\r\n        }\r\n        this.padding = padding;\r\n    }\r\n    AES.prototype.AES_Encrypt_process = function (data) {\r\n        if (!is_bytes(data))\r\n            throw new TypeError(\"data isn't of expected type\");\r\n        var asm = this.asm;\r\n        var heap = this.heap;\r\n        var amode = AES_asm.ENC[this.mode];\r\n        var hpos = AES_asm.HEAP_DATA;\r\n        var pos = this.pos;\r\n        var len = this.len;\r\n        var dpos = 0;\r\n        var dlen = data.length || 0;\r\n        var rpos = 0;\r\n        var rlen = (len + dlen) & -16;\r\n        var wlen = 0;\r\n        var result = new Uint8Array(rlen);\r\n        while (dlen > 0) {\r\n            wlen = _heap_write(heap, pos + len, data, dpos, dlen);\r\n            len += wlen;\r\n            dpos += wlen;\r\n            dlen -= wlen;\r\n            wlen = asm.cipher(amode, hpos + pos, len);\r\n            if (wlen)\r\n                result.set(heap.subarray(pos, pos + wlen), rpos);\r\n            rpos += wlen;\r\n            if (wlen < len) {\r\n                pos += wlen;\r\n                len -= wlen;\r\n            }\r\n            else {\r\n                pos = 0;\r\n                len = 0;\r\n            }\r\n        }\r\n        this.pos = pos;\r\n        this.len = len;\r\n        return result;\r\n    };\r\n    AES.prototype.AES_Encrypt_finish = function () {\r\n        var asm = this.asm;\r\n        var heap = this.heap;\r\n        var amode = AES_asm.ENC[this.mode];\r\n        var hpos = AES_asm.HEAP_DATA;\r\n        var pos = this.pos;\r\n        var len = this.len;\r\n        var plen = 16 - (len % 16);\r\n        var rlen = len;\r\n        if (this.hasOwnProperty('padding')) {\r\n            if (this.padding) {\r\n                for (var p = 0; p < plen; ++p) {\r\n                    heap[pos + len + p] = plen;\r\n                }\r\n                len += plen;\r\n                rlen = len;\r\n            }\r\n            else if (len % 16) {\r\n                throw new IllegalArgumentError('data length must be a multiple of the block size');\r\n            }\r\n        }\r\n        else {\r\n            len += plen;\r\n        }\r\n        var result = new Uint8Array(rlen);\r\n        if (len)\r\n            asm.cipher(amode, hpos + pos, len);\r\n        if (rlen)\r\n            result.set(heap.subarray(pos, pos + rlen));\r\n        this.pos = 0;\r\n        this.len = 0;\r\n        return result;\r\n    };\r\n    AES.prototype.AES_Decrypt_process = function (data) {\r\n        if (!is_bytes(data))\r\n            throw new TypeError(\"data isn't of expected type\");\r\n        var asm = this.asm;\r\n        var heap = this.heap;\r\n        var amode = AES_asm.DEC[this.mode];\r\n        var hpos = AES_asm.HEAP_DATA;\r\n        var pos = this.pos;\r\n        var len = this.len;\r\n        var dpos = 0;\r\n        var dlen = data.length || 0;\r\n        var rpos = 0;\r\n        var rlen = (len + dlen) & -16;\r\n        var plen = 0;\r\n        var wlen = 0;\r\n        if (this.padding) {\r\n            plen = len + dlen - rlen || 16;\r\n            rlen -= plen;\r\n        }\r\n        var result = new Uint8Array(rlen);\r\n        while (dlen > 0) {\r\n            wlen = _heap_write(heap, pos + len, data, dpos, dlen);\r\n            len += wlen;\r\n            dpos += wlen;\r\n            dlen -= wlen;\r\n            wlen = asm.cipher(amode, hpos + pos, len - (!dlen ? plen : 0));\r\n            if (wlen)\r\n                result.set(heap.subarray(pos, pos + wlen), rpos);\r\n            rpos += wlen;\r\n            if (wlen < len) {\r\n                pos += wlen;\r\n                len -= wlen;\r\n            }\r\n            else {\r\n                pos = 0;\r\n                len = 0;\r\n            }\r\n        }\r\n        this.pos = pos;\r\n        this.len = len;\r\n        return result;\r\n    };\r\n    AES.prototype.AES_Decrypt_finish = function () {\r\n        var asm = this.asm;\r\n        var heap = this.heap;\r\n        var amode = AES_asm.DEC[this.mode];\r\n        var hpos = AES_asm.HEAP_DATA;\r\n        var pos = this.pos;\r\n        var len = this.len;\r\n        var rlen = len;\r\n        if (len > 0) {\r\n            if (len % 16) {\r\n                if (this.hasOwnProperty('padding')) {\r\n                    throw new IllegalArgumentError('data length must be a multiple of the block size');\r\n                }\r\n                else {\r\n                    len += 16 - (len % 16);\r\n                }\r\n            }\r\n            asm.cipher(amode, hpos + pos, len);\r\n            if (this.hasOwnProperty('padding') && this.padding) {\r\n                var pad = heap[pos + rlen - 1];\r\n                if (pad < 1 || pad > 16 || pad > rlen)\r\n                    throw new SecurityError('bad padding');\r\n                var pcheck = 0;\r\n                for (var i = pad; i > 1; i--)\r\n                    pcheck |= pad ^ heap[pos + rlen - i];\r\n                if (pcheck)\r\n                    throw new SecurityError('bad padding');\r\n                rlen -= pad;\r\n            }\r\n        }\r\n        var result = new Uint8Array(rlen);\r\n        if (rlen > 0) {\r\n            result.set(heap.subarray(pos, pos + rlen));\r\n        }\r\n        this.pos = 0;\r\n        this.len = 0;\r\n        return result;\r\n    };\r\n    return AES;\r\n}());\r\n\r\n/**\r\n * Counter with CBC-MAC (CCM)\r\n *\r\n * Due to JS limitations (52 bits of Number precision) maximum encrypted message length\r\n * is limited to ~4 PiB ( 2^52 - 16 ) per `nonce`-`key` pair.\r\n * That also limits `lengthSize` parameter maximum value to 7 (not 8 as described in RFC3610).\r\n *\r\n * Additional authenticated data `adata` maximum length is chosen to be no more than 65279 bytes ( 2^16 - 2^8 ),\r\n * which is considered enough for the most of use-cases.\r\n *\r\n * And one more important thing: in case of progressive ciphering of a data stream (in other\r\n * words when data can't be held in-memory at a whole and are ciphered chunk-by-chunk)\r\n * you have to know the `dataLength` in advance and pass that value to the cipher options.\r\n */\r\nvar _AES_CCM_adata_maxLength = 65279; // 2^16 - 2^8\r\nvar _AES_CCM_data_maxLength = 4503599627370480; // 2^52 - 2^4\r\nvar AES_CCM = /** @class */ (function () {\r\n    function AES_CCM(key, nonce, adata, tagSize, dataLength, aes) {\r\n        if (tagSize === void 0) { tagSize = 16; }\r\n        this.counter = 1;\r\n        this.dataLength = -1;\r\n        this.aes = aes ? aes : new AES(key, undefined, undefined, 'CCM');\r\n        // Tag size\r\n        if (tagSize < 4 || tagSize > 16 || tagSize & 1)\r\n            throw new IllegalArgumentError('illegal tagSize value');\r\n        this.tagSize = tagSize;\r\n        // Nonce\r\n        this.nonce = nonce;\r\n        if (nonce.length < 8 || nonce.length > 13)\r\n            throw new IllegalArgumentError('illegal nonce length');\r\n        this.lengthSize = 15 - nonce.length;\r\n        nonce = new Uint8Array(nonce.length + 1);\r\n        nonce[0] = this.lengthSize - 1;\r\n        nonce.set(this.nonce, 1);\r\n        if (dataLength < 0 || dataLength > _AES_CCM_data_maxLength || dataLength > Math.pow(2, 8 * this.lengthSize) - 16)\r\n            throw new IllegalArgumentError('illegal dataLength value');\r\n        if (adata !== undefined) {\r\n            if (adata.length > _AES_CCM_adata_maxLength)\r\n                throw new IllegalArgumentError('illegal adata length');\r\n            this.adata = adata.length ? adata : undefined;\r\n        }\r\n        this.dataLength = dataLength;\r\n        this.counter = 1;\r\n        this.AES_CCM_calculate_iv();\r\n        this.AES_CTR_set_options(nonce, this.counter, 8 * this.lengthSize);\r\n    }\r\n    AES_CCM.encrypt = function (clear, key, nonce, adata, tagsize) {\r\n        if (tagsize === void 0) { tagsize = 16; }\r\n        return new AES_CCM(key, nonce, adata, tagsize, clear.length).encrypt(clear);\r\n    };\r\n    AES_CCM.decrypt = function (cipher, key, nonce, adata, tagsize) {\r\n        if (tagsize === void 0) { tagsize = 16; }\r\n        return new AES_CCM(key, nonce, adata, tagsize, cipher.length - tagsize).decrypt(cipher);\r\n    };\r\n    AES_CCM.prototype.encrypt = function (data) {\r\n        this.dataLength = data.length || 0;\r\n        var result1 = this.AES_CCM_Encrypt_process(data);\r\n        var result2 = this.AES_CCM_Encrypt_finish();\r\n        var result = new Uint8Array(result1.length + result2.length);\r\n        if (result1.length)\r\n            result.set(result1);\r\n        if (result2.length)\r\n            result.set(result2, result1.length);\r\n        return result;\r\n    };\r\n    AES_CCM.prototype.decrypt = function (data) {\r\n        this.dataLength = data.length || 0;\r\n        var result1 = this.AES_CCM_Decrypt_process(data);\r\n        var result2 = this.AES_CCM_Decrypt_finish();\r\n        var result = new Uint8Array(result1.length + result2.length);\r\n        if (result1.length)\r\n            result.set(result1);\r\n        if (result2.length)\r\n            result.set(result2, result1.length);\r\n        return result;\r\n    };\r\n    AES_CCM.prototype.AES_CCM_calculate_iv = function () {\r\n        var nonce = this.nonce;\r\n        var adata = this.adata;\r\n        var tagSize = this.tagSize;\r\n        var lengthSize = this.lengthSize;\r\n        var dataLength = this.dataLength;\r\n        var data = new Uint8Array(16 + (adata ? 2 + adata.length : 0));\r\n        // B0: flags(adata?, M', L'), nonce, len(data)\r\n        data[0] = (adata ? 64 : 0) | ((tagSize - 2) << 2) | (lengthSize - 1);\r\n        data.set(nonce, 1);\r\n        if (lengthSize > 6)\r\n            data[9] = ((dataLength / 0x100000000) >>> 16) & 15;\r\n        if (lengthSize > 5)\r\n            data[10] = ((dataLength / 0x100000000) >>> 8) & 255;\r\n        if (lengthSize > 4)\r\n            data[11] = (dataLength / 0x100000000) & 255;\r\n        if (lengthSize > 3)\r\n            data[12] = dataLength >>> 24;\r\n        if (lengthSize > 2)\r\n            data[13] = (dataLength >>> 16) & 255;\r\n        data[14] = (dataLength >>> 8) & 255;\r\n        data[15] = dataLength & 255;\r\n        // B*: len(adata), adata\r\n        if (adata) {\r\n            data[16] = (adata.length >>> 8) & 255;\r\n            data[17] = adata.length & 255;\r\n            data.set(adata, 18);\r\n        }\r\n        this._cbc_mac_process(data);\r\n        this.aes.asm.get_state(AES_asm.HEAP_DATA);\r\n        var iv = new Uint8Array(this.aes.heap.subarray(0, 16));\r\n        var ivview = new DataView(iv.buffer, iv.byteOffset, iv.byteLength);\r\n        this.aes.asm.set_iv(ivview.getUint32(0), ivview.getUint32(4), ivview.getUint32(8), ivview.getUint32(12));\r\n    };\r\n    AES_CCM.prototype._cbc_mac_process = function (data) {\r\n        var heap = this.aes.heap;\r\n        var asm = this.aes.asm;\r\n        var dpos = 0;\r\n        var dlen = data.length || 0;\r\n        var wlen = 0;\r\n        while (dlen > 0) {\r\n            wlen = _heap_write(heap, 0, data, dpos, dlen);\r\n            while (wlen & 15)\r\n                heap[wlen++] = 0;\r\n            dpos += wlen;\r\n            dlen -= wlen;\r\n            asm.mac(AES_asm.MAC.CBC, AES_asm.HEAP_DATA, wlen);\r\n        }\r\n    };\r\n    AES_CCM.prototype.AES_CCM_Encrypt_process = function (data) {\r\n        var asm = this.aes.asm;\r\n        var heap = this.aes.heap;\r\n        var dpos = 0;\r\n        var dlen = data.length || 0;\r\n        var counter = this.counter;\r\n        var pos = this.aes.pos;\r\n        var len = this.aes.len;\r\n        var rlen = (len + dlen) & -16;\r\n        var rpos = 0;\r\n        var wlen = 0;\r\n        if (((counter - 1) << 4) + len + dlen > _AES_CCM_data_maxLength)\r\n            // ??? should check against lengthSize\r\n            throw new RangeError('counter overflow');\r\n        var result = new Uint8Array(rlen);\r\n        while (dlen > 0) {\r\n            wlen = _heap_write(heap, pos + len, data, dpos, dlen);\r\n            len += wlen;\r\n            dpos += wlen;\r\n            dlen -= wlen;\r\n            wlen = asm.mac(AES_asm.MAC.CBC, AES_asm.HEAP_DATA + pos, len);\r\n            wlen = asm.cipher(AES_asm.ENC.CTR, AES_asm.HEAP_DATA + pos, wlen);\r\n            if (wlen)\r\n                result.set(heap.subarray(pos, pos + wlen), rpos);\r\n            counter += wlen >>> 4;\r\n            rpos += wlen;\r\n            if (wlen < len) {\r\n                pos += wlen;\r\n                len -= wlen;\r\n            }\r\n            else {\r\n                pos = 0;\r\n                len = 0;\r\n            }\r\n        }\r\n        this.counter = counter;\r\n        this.aes.pos = pos;\r\n        this.aes.len = len;\r\n        return result;\r\n    };\r\n    AES_CCM.prototype.AES_CCM_Encrypt_finish = function () {\r\n        var asm = this.aes.asm;\r\n        var heap = this.aes.heap;\r\n        var tagSize = this.tagSize;\r\n        var pos = this.aes.pos;\r\n        var len = this.aes.len;\r\n        var result = new Uint8Array(len + tagSize);\r\n        var i = len;\r\n        for (; i & 15; i++)\r\n            heap[pos + i] = 0;\r\n        asm.mac(AES_asm.MAC.CBC, AES_asm.HEAP_DATA + pos, i);\r\n        asm.cipher(AES_asm.ENC.CTR, AES_asm.HEAP_DATA + pos, i);\r\n        if (len)\r\n            result.set(heap.subarray(pos, pos + len));\r\n        asm.set_counter(0, 0, 0, 0);\r\n        asm.get_iv(AES_asm.HEAP_DATA);\r\n        asm.cipher(AES_asm.ENC.CTR, AES_asm.HEAP_DATA, 16);\r\n        result.set(heap.subarray(0, tagSize), len);\r\n        this.counter = 1;\r\n        this.aes.pos = 0;\r\n        this.aes.len = 0;\r\n        return result;\r\n    };\r\n    AES_CCM.prototype.AES_CCM_Decrypt_process = function (data) {\r\n        var dpos = 0;\r\n        var dlen = data.length || 0;\r\n        var asm = this.aes.asm;\r\n        var heap = this.aes.heap;\r\n        var counter = this.counter;\r\n        var tagSize = this.tagSize;\r\n        var pos = this.aes.pos;\r\n        var len = this.aes.len;\r\n        var rpos = 0;\r\n        var rlen = len + dlen > tagSize ? (len + dlen - tagSize) & -16 : 0;\r\n        var tlen = len + dlen - rlen;\r\n        var wlen = 0;\r\n        if (((counter - 1) << 4) + len + dlen > _AES_CCM_data_maxLength)\r\n            throw new RangeError('counter overflow');\r\n        var result = new Uint8Array(rlen);\r\n        while (dlen > tlen) {\r\n            wlen = _heap_write(heap, pos + len, data, dpos, dlen - tlen);\r\n            len += wlen;\r\n            dpos += wlen;\r\n            dlen -= wlen;\r\n            wlen = asm.cipher(AES_asm.DEC.CTR, AES_asm.HEAP_DATA + pos, wlen);\r\n            wlen = asm.mac(AES_asm.MAC.CBC, AES_asm.HEAP_DATA + pos, wlen);\r\n            if (wlen)\r\n                result.set(heap.subarray(pos, pos + wlen), rpos);\r\n            counter += wlen >>> 4;\r\n            rpos += wlen;\r\n            pos = 0;\r\n            len = 0;\r\n        }\r\n        if (dlen > 0) {\r\n            len += _heap_write(heap, 0, data, dpos, dlen);\r\n        }\r\n        this.counter = counter;\r\n        this.aes.pos = pos;\r\n        this.aes.len = len;\r\n        return result;\r\n    };\r\n    AES_CCM.prototype.AES_CCM_Decrypt_finish = function () {\r\n        var asm = this.aes.asm;\r\n        var heap = this.aes.heap;\r\n        var tagSize = this.tagSize;\r\n        var pos = this.aes.pos;\r\n        var len = this.aes.len;\r\n        var rlen = len - tagSize;\r\n        if (len < tagSize)\r\n            throw new IllegalStateError('authentication tag not found');\r\n        var result = new Uint8Array(rlen);\r\n        var atag = new Uint8Array(heap.subarray(pos + rlen, pos + len));\r\n        asm.cipher(AES_asm.DEC.CTR, AES_asm.HEAP_DATA + pos, (rlen + 15) & -16);\r\n        result.set(heap.subarray(pos, pos + rlen));\r\n        var i = rlen;\r\n        for (; i & 15; i++)\r\n            heap[pos + i] = 0;\r\n        asm.mac(AES_asm.MAC.CBC, AES_asm.HEAP_DATA + pos, i);\r\n        asm.set_counter(0, 0, 0, 0);\r\n        asm.get_iv(AES_asm.HEAP_DATA);\r\n        asm.cipher(AES_asm.ENC.CTR, AES_asm.HEAP_DATA, 16);\r\n        var acheck = 0;\r\n        for (var j = 0; j < tagSize; ++j)\r\n            acheck |= atag[j] ^ heap[j];\r\n        /*if (acheck)\r\n            throw new SecurityError('data integrity check failed');*/\r\n        this.counter = 1;\r\n        this.aes.pos = 0;\r\n        this.aes.len = 0;\r\n        return result;\r\n    };\r\n    AES_CCM.prototype.AES_CTR_set_options = function (nonce, counter, size) {\r\n        if (size < 8 || size > 56)\r\n            throw new IllegalArgumentError('illegal counter size');\r\n        var mask = Math.pow(2, size) - 1;\r\n        this.aes.asm.set_mask(0, 0, (mask / 0x100000000) | 0, mask | 0);\r\n        var len = nonce.length;\r\n        if (!len || len > 16)\r\n            throw new IllegalArgumentError('illegal nonce size');\r\n        this.nonce = nonce;\r\n        var view = new DataView(new ArrayBuffer(16));\r\n        new Uint8Array(view.buffer).set(nonce);\r\n        this.aes.asm.set_nonce(view.getUint32(0), view.getUint32(4), view.getUint32(8), view.getUint32(12));\r\n        if (counter < 0 || counter >= Math.pow(2, size))\r\n            throw new IllegalArgumentError('illegal counter value');\r\n        this.counter = counter;\r\n        this.aes.asm.set_counter(0, 0, (counter / 0x100000000) | 0, counter | 0);\r\n    };\r\n    return AES_CCM;\r\n}());\r\n\r\n/**\r\n * Integers are represented as little endian array of 32-bit limbs.\r\n * Limbs number is a power of 2 and a multiple of 8 (256 bits).\r\n * Negative values use two's complement representation.\r\n */\r\nvar bigint_asm = function (stdlib, foreign, buffer) {\r\n    \"use asm\";\r\n\r\n    var SP = 0;\r\n\r\n    var HEAP32 = new stdlib.Uint32Array(buffer);\r\n\r\n    var imul = stdlib.Math.imul;\r\n\r\n    /**\r\n     * Simple stack memory allocator\r\n     *\r\n     * Methods:\r\n     *  sreset\r\n     *  salloc\r\n     *  sfree\r\n     */\r\n\r\n    function sreset(p) {\r\n        p = p | 0;\r\n        SP = p = (p + 31) & -32;\r\n        return p | 0;\r\n    }\r\n\r\n    function salloc(l) {\r\n        l = l | 0;\r\n        var p = 0; p = SP;\r\n        SP = p + ((l + 31) & -32) | 0;\r\n        return p | 0;\r\n    }\r\n\r\n    function sfree(l) {\r\n        l = l | 0;\r\n        SP = SP - ((l + 31) & -32) | 0;\r\n    }\r\n\r\n    /**\r\n     * Utility functions:\r\n     *  cp\r\n     *  z\r\n     */\r\n\r\n    function cp(l, A, B) {\r\n        l = l | 0;\r\n        A = A | 0;\r\n        B = B | 0;\r\n\r\n        var i = 0;\r\n\r\n        if ((A | 0) > (B | 0)) {\r\n            for (; (i | 0) < (l | 0); i = (i + 4) | 0) {\r\n                HEAP32[(B + i) >> 2] = HEAP32[(A + i) >> 2];\r\n            }\r\n        }\r\n        else {\r\n            for (i = (l - 4) | 0; (i | 0) >= 0; i = (i - 4) | 0) {\r\n                HEAP32[(B + i) >> 2] = HEAP32[(A + i) >> 2];\r\n            }\r\n        }\r\n    }\r\n\r\n    function z(l, z, A) {\r\n        l = l | 0;\r\n        z = z | 0;\r\n        A = A | 0;\r\n\r\n        var i = 0;\r\n\r\n        for (; (i | 0) < (l | 0); i = (i + 4) | 0) {\r\n            HEAP32[(A + i) >> 2] = z;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Negate the argument\r\n     *\r\n     * Perform two's complement transformation:\r\n     *\r\n     *  -A = ~A + 1\r\n     *\r\n     * @param A offset of the argment being negated, 32-byte aligned\r\n     * @param lA length of the argument, multiple of 32\r\n     *\r\n     * @param R offset where to place the result to, 32-byte aligned\r\n     * @param lR length to truncate the result to, multiple of 32\r\n     */\r\n    function neg(A, lA, R, lR) {\r\n        A = A | 0;\r\n        lA = lA | 0;\r\n        R = R | 0;\r\n        lR = lR | 0;\r\n\r\n        var a = 0, c = 0, t = 0, r = 0, i = 0;\r\n\r\n        if ((lR | 0) <= 0)\r\n            lR = lA;\r\n\r\n        if ((lR | 0) < (lA | 0))\r\n            lA = lR;\r\n\r\n        c = 1;\r\n        for (; (i | 0) < (lA | 0); i = (i + 4) | 0) {\r\n            a = ~HEAP32[(A + i) >> 2];\r\n            t = (a & 0xffff) + c | 0;\r\n            r = (a >>> 16) + (t >>> 16) | 0;\r\n            HEAP32[(R + i) >> 2] = (r << 16) | (t & 0xffff);\r\n            c = r >>> 16;\r\n        }\r\n\r\n        for (; (i | 0) < (lR | 0); i = (i + 4) | 0) {\r\n            HEAP32[(R + i) >> 2] = (c - 1) | 0;\r\n        }\r\n\r\n        return c | 0;\r\n    }\r\n\r\n    function cmp(A, lA, B, lB) {\r\n        A = A | 0;\r\n        lA = lA | 0;\r\n        B = B | 0;\r\n        lB = lB | 0;\r\n\r\n        var a = 0, b = 0, i = 0;\r\n\r\n        if ((lA | 0) > (lB | 0)) {\r\n            for (i = (lA - 4) | 0; (i | 0) >= (lB | 0); i = (i - 4) | 0) {\r\n                if (HEAP32[(A + i) >> 2] | 0) return 1;\r\n            }\r\n        }\r\n        else {\r\n            for (i = (lB - 4) | 0; (i | 0) >= (lA | 0); i = (i - 4) | 0) {\r\n                if (HEAP32[(B + i) >> 2] | 0) return -1;\r\n            }\r\n        }\r\n\r\n        for (; (i | 0) >= 0; i = (i - 4) | 0) {\r\n            a = HEAP32[(A + i) >> 2] | 0, b = HEAP32[(B + i) >> 2] | 0;\r\n            if ((a >>> 0) < (b >>> 0)) return -1;\r\n            if ((a >>> 0) > (b >>> 0)) return 1;\r\n        }\r\n\r\n        return 0;\r\n    }\r\n\r\n    /**\r\n     * Test the argument\r\n     *\r\n     * Same as `cmp` with zero.\r\n     */\r\n    function tst(A, lA) {\r\n        A = A | 0;\r\n        lA = lA | 0;\r\n\r\n        var i = 0;\r\n\r\n        for (i = (lA - 4) | 0; (i | 0) >= 0; i = (i - 4) | 0) {\r\n            if (HEAP32[(A + i) >> 2] | 0) return (i + 4) | 0;\r\n        }\r\n\r\n        return 0;\r\n    }\r\n\r\n    /**\r\n     * Conventional addition\r\n     *\r\n     * @param A offset of the first argument, 32-byte aligned\r\n     * @param lA length of the first argument, multiple of 32\r\n     *\r\n     * @param B offset of the second argument, 32-bit aligned\r\n     * @param lB length of the second argument, multiple of 32\r\n     *\r\n     * @param R offset where to place the result to, 32-byte aligned\r\n     * @param lR length to truncate the result to, multiple of 32\r\n     */\r\n    function add(A, lA, B, lB, R, lR) {\r\n        A = A | 0;\r\n        lA = lA | 0;\r\n        B = B | 0;\r\n        lB = lB | 0;\r\n        R = R | 0;\r\n        lR = lR | 0;\r\n\r\n        var a = 0, b = 0, c = 0, t = 0, r = 0, i = 0;\r\n\r\n        if ((lA | 0) < (lB | 0)) {\r\n            t = A, A = B, B = t;\r\n            t = lA, lA = lB, lB = t;\r\n        }\r\n\r\n        if ((lR | 0) <= 0)\r\n            lR = lA + 4 | 0;\r\n\r\n        if ((lR | 0) < (lB | 0))\r\n            lA = lB = lR;\r\n\r\n        for (; (i | 0) < (lB | 0); i = (i + 4) | 0) {\r\n            a = HEAP32[(A + i) >> 2] | 0;\r\n            b = HEAP32[(B + i) >> 2] | 0;\r\n            t = ((a & 0xffff) + (b & 0xffff) | 0) + c | 0;\r\n            r = ((a >>> 16) + (b >>> 16) | 0) + (t >>> 16) | 0;\r\n            HEAP32[(R + i) >> 2] = (t & 0xffff) | (r << 16);\r\n            c = r >>> 16;\r\n        }\r\n\r\n        for (; (i | 0) < (lA | 0); i = (i + 4) | 0) {\r\n            a = HEAP32[(A + i) >> 2] | 0;\r\n            t = (a & 0xffff) + c | 0;\r\n            r = (a >>> 16) + (t >>> 16) | 0;\r\n            HEAP32[(R + i) >> 2] = (t & 0xffff) | (r << 16);\r\n            c = r >>> 16;\r\n        }\r\n\r\n        for (; (i | 0) < (lR | 0); i = (i + 4) | 0) {\r\n            HEAP32[(R + i) >> 2] = c | 0;\r\n            c = 0;\r\n        }\r\n\r\n        return c | 0;\r\n    }\r\n\r\n    /**\r\n      * Conventional subtraction\r\n      *\r\n      * @param A offset of the first argument, 32-byte aligned\r\n      * @param lA length of the first argument, multiple of 32\r\n      *\r\n      * @param B offset of the second argument, 32-bit aligned\r\n      * @param lB length of the second argument, multiple of 32\r\n      *\r\n      * @param R offset where to place the result to, 32-byte aligned\r\n      * @param lR length to truncate the result to, multiple of 32\r\n      */\r\n    function sub(A, lA, B, lB, R, lR) {\r\n        A = A | 0;\r\n        lA = lA | 0;\r\n        B = B | 0;\r\n        lB = lB | 0;\r\n        R = R | 0;\r\n        lR = lR | 0;\r\n\r\n        var a = 0, b = 0, c = 0, t = 0, r = 0, i = 0;\r\n\r\n        if ((lR | 0) <= 0)\r\n            lR = (lA | 0) > (lB | 0) ? lA + 4 | 0 : lB + 4 | 0;\r\n\r\n        if ((lR | 0) < (lA | 0))\r\n            lA = lR;\r\n\r\n        if ((lR | 0) < (lB | 0))\r\n            lB = lR;\r\n\r\n        if ((lA | 0) < (lB | 0)) {\r\n            for (; (i | 0) < (lA | 0); i = (i + 4) | 0) {\r\n                a = HEAP32[(A + i) >> 2] | 0;\r\n                b = HEAP32[(B + i) >> 2] | 0;\r\n                t = ((a & 0xffff) - (b & 0xffff) | 0) + c | 0;\r\n                r = ((a >>> 16) - (b >>> 16) | 0) + (t >> 16) | 0;\r\n                HEAP32[(R + i) >> 2] = (t & 0xffff) | (r << 16);\r\n                c = r >> 16;\r\n            }\r\n\r\n            for (; (i | 0) < (lB | 0); i = (i + 4) | 0) {\r\n                b = HEAP32[(B + i) >> 2] | 0;\r\n                t = c - (b & 0xffff) | 0;\r\n                r = (t >> 16) - (b >>> 16) | 0;\r\n                HEAP32[(R + i) >> 2] = (t & 0xffff) | (r << 16);\r\n                c = r >> 16;\r\n            }\r\n        }\r\n        else {\r\n            for (; (i | 0) < (lB | 0); i = (i + 4) | 0) {\r\n                a = HEAP32[(A + i) >> 2] | 0;\r\n                b = HEAP32[(B + i) >> 2] | 0;\r\n                t = ((a & 0xffff) - (b & 0xffff) | 0) + c | 0;\r\n                r = ((a >>> 16) - (b >>> 16) | 0) + (t >> 16) | 0;\r\n                HEAP32[(R + i) >> 2] = (t & 0xffff) | (r << 16);\r\n                c = r >> 16;\r\n            }\r\n\r\n            for (; (i | 0) < (lA | 0); i = (i + 4) | 0) {\r\n                a = HEAP32[(A + i) >> 2] | 0;\r\n                t = (a & 0xffff) + c | 0;\r\n                r = (a >>> 16) + (t >> 16) | 0;\r\n                HEAP32[(R + i) >> 2] = (t & 0xffff) | (r << 16);\r\n                c = r >> 16;\r\n            }\r\n        }\r\n\r\n        for (; (i | 0) < (lR | 0); i = (i + 4) | 0) {\r\n            HEAP32[(R + i) >> 2] = c | 0;\r\n        }\r\n\r\n        return c | 0;\r\n    }\r\n\r\n    /**\r\n     * Conventional multiplication\r\n     *\r\n     * TODO implement Karatsuba algorithm for large multiplicands\r\n     *\r\n     * @param A offset of the first argument, 32-byte aligned\r\n     * @param lA length of the first argument, multiple of 32\r\n     *\r\n     * @param B offset of the second argument, 32-byte aligned\r\n     * @param lB length of the second argument, multiple of 32\r\n     *\r\n     * @param R offset where to place the result to, 32-byte aligned\r\n     * @param lR length to truncate the result to, multiple of 32\r\n     */\r\n    function mul(A, lA, B, lB, R, lR) {\r\n        A = A | 0;\r\n        lA = lA | 0;\r\n        B = B | 0;\r\n        lB = lB | 0;\r\n        R = R | 0;\r\n        lR = lR | 0;\r\n\r\n        var al0 = 0, al1 = 0, al2 = 0, al3 = 0, al4 = 0, al5 = 0, al6 = 0, al7 = 0, ah0 = 0, ah1 = 0, ah2 = 0, ah3 = 0, ah4 = 0, ah5 = 0, ah6 = 0, ah7 = 0,\r\n            bl0 = 0, bl1 = 0, bl2 = 0, bl3 = 0, bl4 = 0, bl5 = 0, bl6 = 0, bl7 = 0, bh0 = 0, bh1 = 0, bh2 = 0, bh3 = 0, bh4 = 0, bh5 = 0, bh6 = 0, bh7 = 0,\r\n            r0 = 0, r1 = 0, r2 = 0, r3 = 0, r4 = 0, r5 = 0, r6 = 0, r7 = 0, r8 = 0, r9 = 0, r10 = 0, r11 = 0, r12 = 0, r13 = 0, r14 = 0, r15 = 0,\r\n            u = 0, v = 0, w = 0, m = 0,\r\n            i = 0, Ai = 0, j = 0, Bj = 0, Rk = 0;\r\n\r\n        if ((lA | 0) > (lB | 0)) {\r\n            u = A, v = lA;\r\n            A = B, lA = lB;\r\n            B = u, lB = v;\r\n        }\r\n\r\n        m = (lA + lB) | 0;\r\n        if (((lR | 0) > (m | 0)) | ((lR | 0) <= 0))\r\n            lR = m;\r\n\r\n        if ((lR | 0) < (lA | 0))\r\n            lA = lR;\r\n\r\n        if ((lR | 0) < (lB | 0))\r\n            lB = lR;\r\n\r\n        for (; (i | 0) < (lA | 0); i = (i + 32) | 0) {\r\n            Ai = (A + i) | 0;\r\n\r\n            ah0 = HEAP32[(Ai | 0) >> 2] | 0,\r\n                ah1 = HEAP32[(Ai | 4) >> 2] | 0,\r\n                ah2 = HEAP32[(Ai | 8) >> 2] | 0,\r\n                ah3 = HEAP32[(Ai | 12) >> 2] | 0,\r\n                ah4 = HEAP32[(Ai | 16) >> 2] | 0,\r\n                ah5 = HEAP32[(Ai | 20) >> 2] | 0,\r\n                ah6 = HEAP32[(Ai | 24) >> 2] | 0,\r\n                ah7 = HEAP32[(Ai | 28) >> 2] | 0,\r\n                al0 = ah0 & 0xffff,\r\n                al1 = ah1 & 0xffff,\r\n                al2 = ah2 & 0xffff,\r\n                al3 = ah3 & 0xffff,\r\n                al4 = ah4 & 0xffff,\r\n                al5 = ah5 & 0xffff,\r\n                al6 = ah6 & 0xffff,\r\n                al7 = ah7 & 0xffff,\r\n                ah0 = ah0 >>> 16,\r\n                ah1 = ah1 >>> 16,\r\n                ah2 = ah2 >>> 16,\r\n                ah3 = ah3 >>> 16,\r\n                ah4 = ah4 >>> 16,\r\n                ah5 = ah5 >>> 16,\r\n                ah6 = ah6 >>> 16,\r\n                ah7 = ah7 >>> 16;\r\n\r\n            r8 = r9 = r10 = r11 = r12 = r13 = r14 = r15 = 0;\r\n\r\n            for (j = 0; (j | 0) < (lB | 0); j = (j + 32) | 0) {\r\n                Bj = (B + j) | 0;\r\n                Rk = (R + (i + j | 0)) | 0;\r\n\r\n                bh0 = HEAP32[(Bj | 0) >> 2] | 0,\r\n                    bh1 = HEAP32[(Bj | 4) >> 2] | 0,\r\n                    bh2 = HEAP32[(Bj | 8) >> 2] | 0,\r\n                    bh3 = HEAP32[(Bj | 12) >> 2] | 0,\r\n                    bh4 = HEAP32[(Bj | 16) >> 2] | 0,\r\n                    bh5 = HEAP32[(Bj | 20) >> 2] | 0,\r\n                    bh6 = HEAP32[(Bj | 24) >> 2] | 0,\r\n                    bh7 = HEAP32[(Bj | 28) >> 2] | 0,\r\n                    bl0 = bh0 & 0xffff,\r\n                    bl1 = bh1 & 0xffff,\r\n                    bl2 = bh2 & 0xffff,\r\n                    bl3 = bh3 & 0xffff,\r\n                    bl4 = bh4 & 0xffff,\r\n                    bl5 = bh5 & 0xffff,\r\n                    bl6 = bh6 & 0xffff,\r\n                    bl7 = bh7 & 0xffff,\r\n                    bh0 = bh0 >>> 16,\r\n                    bh1 = bh1 >>> 16,\r\n                    bh2 = bh2 >>> 16,\r\n                    bh3 = bh3 >>> 16,\r\n                    bh4 = bh4 >>> 16,\r\n                    bh5 = bh5 >>> 16,\r\n                    bh6 = bh6 >>> 16,\r\n                    bh7 = bh7 >>> 16;\r\n\r\n                r0 = HEAP32[(Rk | 0) >> 2] | 0,\r\n                    r1 = HEAP32[(Rk | 4) >> 2] | 0,\r\n                    r2 = HEAP32[(Rk | 8) >> 2] | 0,\r\n                    r3 = HEAP32[(Rk | 12) >> 2] | 0,\r\n                    r4 = HEAP32[(Rk | 16) >> 2] | 0,\r\n                    r5 = HEAP32[(Rk | 20) >> 2] | 0,\r\n                    r6 = HEAP32[(Rk | 24) >> 2] | 0,\r\n                    r7 = HEAP32[(Rk | 28) >> 2] | 0;\r\n\r\n                u = ((imul(al0, bl0) | 0) + (r8 & 0xffff) | 0) + (r0 & 0xffff) | 0;\r\n                v = ((imul(ah0, bl0) | 0) + (r8 >>> 16) | 0) + (r0 >>> 16) | 0;\r\n                w = ((imul(al0, bh0) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah0, bh0) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r0 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al0, bl1) | 0) + (m & 0xffff) | 0) + (r1 & 0xffff) | 0;\r\n                v = ((imul(ah0, bl1) | 0) + (m >>> 16) | 0) + (r1 >>> 16) | 0;\r\n                w = ((imul(al0, bh1) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah0, bh1) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r1 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al0, bl2) | 0) + (m & 0xffff) | 0) + (r2 & 0xffff) | 0;\r\n                v = ((imul(ah0, bl2) | 0) + (m >>> 16) | 0) + (r2 >>> 16) | 0;\r\n                w = ((imul(al0, bh2) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah0, bh2) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r2 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al0, bl3) | 0) + (m & 0xffff) | 0) + (r3 & 0xffff) | 0;\r\n                v = ((imul(ah0, bl3) | 0) + (m >>> 16) | 0) + (r3 >>> 16) | 0;\r\n                w = ((imul(al0, bh3) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah0, bh3) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r3 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al0, bl4) | 0) + (m & 0xffff) | 0) + (r4 & 0xffff) | 0;\r\n                v = ((imul(ah0, bl4) | 0) + (m >>> 16) | 0) + (r4 >>> 16) | 0;\r\n                w = ((imul(al0, bh4) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah0, bh4) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r4 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al0, bl5) | 0) + (m & 0xffff) | 0) + (r5 & 0xffff) | 0;\r\n                v = ((imul(ah0, bl5) | 0) + (m >>> 16) | 0) + (r5 >>> 16) | 0;\r\n                w = ((imul(al0, bh5) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah0, bh5) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r5 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al0, bl6) | 0) + (m & 0xffff) | 0) + (r6 & 0xffff) | 0;\r\n                v = ((imul(ah0, bl6) | 0) + (m >>> 16) | 0) + (r6 >>> 16) | 0;\r\n                w = ((imul(al0, bh6) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah0, bh6) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r6 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al0, bl7) | 0) + (m & 0xffff) | 0) + (r7 & 0xffff) | 0;\r\n                v = ((imul(ah0, bl7) | 0) + (m >>> 16) | 0) + (r7 >>> 16) | 0;\r\n                w = ((imul(al0, bh7) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah0, bh7) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r7 = (w << 16) | (u & 0xffff);\r\n\r\n                r8 = m;\r\n\r\n                u = ((imul(al1, bl0) | 0) + (r9 & 0xffff) | 0) + (r1 & 0xffff) | 0;\r\n                v = ((imul(ah1, bl0) | 0) + (r9 >>> 16) | 0) + (r1 >>> 16) | 0;\r\n                w = ((imul(al1, bh0) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah1, bh0) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r1 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al1, bl1) | 0) + (m & 0xffff) | 0) + (r2 & 0xffff) | 0;\r\n                v = ((imul(ah1, bl1) | 0) + (m >>> 16) | 0) + (r2 >>> 16) | 0;\r\n                w = ((imul(al1, bh1) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah1, bh1) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r2 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al1, bl2) | 0) + (m & 0xffff) | 0) + (r3 & 0xffff) | 0;\r\n                v = ((imul(ah1, bl2) | 0) + (m >>> 16) | 0) + (r3 >>> 16) | 0;\r\n                w = ((imul(al1, bh2) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah1, bh2) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r3 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al1, bl3) | 0) + (m & 0xffff) | 0) + (r4 & 0xffff) | 0;\r\n                v = ((imul(ah1, bl3) | 0) + (m >>> 16) | 0) + (r4 >>> 16) | 0;\r\n                w = ((imul(al1, bh3) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah1, bh3) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r4 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al1, bl4) | 0) + (m & 0xffff) | 0) + (r5 & 0xffff) | 0;\r\n                v = ((imul(ah1, bl4) | 0) + (m >>> 16) | 0) + (r5 >>> 16) | 0;\r\n                w = ((imul(al1, bh4) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah1, bh4) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r5 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al1, bl5) | 0) + (m & 0xffff) | 0) + (r6 & 0xffff) | 0;\r\n                v = ((imul(ah1, bl5) | 0) + (m >>> 16) | 0) + (r6 >>> 16) | 0;\r\n                w = ((imul(al1, bh5) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah1, bh5) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r6 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al1, bl6) | 0) + (m & 0xffff) | 0) + (r7 & 0xffff) | 0;\r\n                v = ((imul(ah1, bl6) | 0) + (m >>> 16) | 0) + (r7 >>> 16) | 0;\r\n                w = ((imul(al1, bh6) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah1, bh6) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r7 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al1, bl7) | 0) + (m & 0xffff) | 0) + (r8 & 0xffff) | 0;\r\n                v = ((imul(ah1, bl7) | 0) + (m >>> 16) | 0) + (r8 >>> 16) | 0;\r\n                w = ((imul(al1, bh7) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah1, bh7) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r8 = (w << 16) | (u & 0xffff);\r\n\r\n                r9 = m;\r\n\r\n                u = ((imul(al2, bl0) | 0) + (r10 & 0xffff) | 0) + (r2 & 0xffff) | 0;\r\n                v = ((imul(ah2, bl0) | 0) + (r10 >>> 16) | 0) + (r2 >>> 16) | 0;\r\n                w = ((imul(al2, bh0) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah2, bh0) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r2 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al2, bl1) | 0) + (m & 0xffff) | 0) + (r3 & 0xffff) | 0;\r\n                v = ((imul(ah2, bl1) | 0) + (m >>> 16) | 0) + (r3 >>> 16) | 0;\r\n                w = ((imul(al2, bh1) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah2, bh1) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r3 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al2, bl2) | 0) + (m & 0xffff) | 0) + (r4 & 0xffff) | 0;\r\n                v = ((imul(ah2, bl2) | 0) + (m >>> 16) | 0) + (r4 >>> 16) | 0;\r\n                w = ((imul(al2, bh2) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah2, bh2) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r4 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al2, bl3) | 0) + (m & 0xffff) | 0) + (r5 & 0xffff) | 0;\r\n                v = ((imul(ah2, bl3) | 0) + (m >>> 16) | 0) + (r5 >>> 16) | 0;\r\n                w = ((imul(al2, bh3) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah2, bh3) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r5 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al2, bl4) | 0) + (m & 0xffff) | 0) + (r6 & 0xffff) | 0;\r\n                v = ((imul(ah2, bl4) | 0) + (m >>> 16) | 0) + (r6 >>> 16) | 0;\r\n                w = ((imul(al2, bh4) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah2, bh4) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r6 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al2, bl5) | 0) + (m & 0xffff) | 0) + (r7 & 0xffff) | 0;\r\n                v = ((imul(ah2, bl5) | 0) + (m >>> 16) | 0) + (r7 >>> 16) | 0;\r\n                w = ((imul(al2, bh5) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah2, bh5) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r7 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al2, bl6) | 0) + (m & 0xffff) | 0) + (r8 & 0xffff) | 0;\r\n                v = ((imul(ah2, bl6) | 0) + (m >>> 16) | 0) + (r8 >>> 16) | 0;\r\n                w = ((imul(al2, bh6) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah2, bh6) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r8 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al2, bl7) | 0) + (m & 0xffff) | 0) + (r9 & 0xffff) | 0;\r\n                v = ((imul(ah2, bl7) | 0) + (m >>> 16) | 0) + (r9 >>> 16) | 0;\r\n                w = ((imul(al2, bh7) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah2, bh7) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r9 = (w << 16) | (u & 0xffff);\r\n\r\n                r10 = m;\r\n\r\n                u = ((imul(al3, bl0) | 0) + (r11 & 0xffff) | 0) + (r3 & 0xffff) | 0;\r\n                v = ((imul(ah3, bl0) | 0) + (r11 >>> 16) | 0) + (r3 >>> 16) | 0;\r\n                w = ((imul(al3, bh0) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah3, bh0) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r3 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al3, bl1) | 0) + (m & 0xffff) | 0) + (r4 & 0xffff) | 0;\r\n                v = ((imul(ah3, bl1) | 0) + (m >>> 16) | 0) + (r4 >>> 16) | 0;\r\n                w = ((imul(al3, bh1) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah3, bh1) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r4 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al3, bl2) | 0) + (m & 0xffff) | 0) + (r5 & 0xffff) | 0;\r\n                v = ((imul(ah3, bl2) | 0) + (m >>> 16) | 0) + (r5 >>> 16) | 0;\r\n                w = ((imul(al3, bh2) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah3, bh2) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r5 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al3, bl3) | 0) + (m & 0xffff) | 0) + (r6 & 0xffff) | 0;\r\n                v = ((imul(ah3, bl3) | 0) + (m >>> 16) | 0) + (r6 >>> 16) | 0;\r\n                w = ((imul(al3, bh3) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah3, bh3) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r6 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al3, bl4) | 0) + (m & 0xffff) | 0) + (r7 & 0xffff) | 0;\r\n                v = ((imul(ah3, bl4) | 0) + (m >>> 16) | 0) + (r7 >>> 16) | 0;\r\n                w = ((imul(al3, bh4) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah3, bh4) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r7 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al3, bl5) | 0) + (m & 0xffff) | 0) + (r8 & 0xffff) | 0;\r\n                v = ((imul(ah3, bl5) | 0) + (m >>> 16) | 0) + (r8 >>> 16) | 0;\r\n                w = ((imul(al3, bh5) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah3, bh5) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r8 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al3, bl6) | 0) + (m & 0xffff) | 0) + (r9 & 0xffff) | 0;\r\n                v = ((imul(ah3, bl6) | 0) + (m >>> 16) | 0) + (r9 >>> 16) | 0;\r\n                w = ((imul(al3, bh6) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah3, bh6) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r9 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al3, bl7) | 0) + (m & 0xffff) | 0) + (r10 & 0xffff) | 0;\r\n                v = ((imul(ah3, bl7) | 0) + (m >>> 16) | 0) + (r10 >>> 16) | 0;\r\n                w = ((imul(al3, bh7) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah3, bh7) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r10 = (w << 16) | (u & 0xffff);\r\n\r\n                r11 = m;\r\n\r\n                u = ((imul(al4, bl0) | 0) + (r12 & 0xffff) | 0) + (r4 & 0xffff) | 0;\r\n                v = ((imul(ah4, bl0) | 0) + (r12 >>> 16) | 0) + (r4 >>> 16) | 0;\r\n                w = ((imul(al4, bh0) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah4, bh0) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r4 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al4, bl1) | 0) + (m & 0xffff) | 0) + (r5 & 0xffff) | 0;\r\n                v = ((imul(ah4, bl1) | 0) + (m >>> 16) | 0) + (r5 >>> 16) | 0;\r\n                w = ((imul(al4, bh1) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah4, bh1) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r5 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al4, bl2) | 0) + (m & 0xffff) | 0) + (r6 & 0xffff) | 0;\r\n                v = ((imul(ah4, bl2) | 0) + (m >>> 16) | 0) + (r6 >>> 16) | 0;\r\n                w = ((imul(al4, bh2) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah4, bh2) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r6 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al4, bl3) | 0) + (m & 0xffff) | 0) + (r7 & 0xffff) | 0;\r\n                v = ((imul(ah4, bl3) | 0) + (m >>> 16) | 0) + (r7 >>> 16) | 0;\r\n                w = ((imul(al4, bh3) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah4, bh3) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r7 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al4, bl4) | 0) + (m & 0xffff) | 0) + (r8 & 0xffff) | 0;\r\n                v = ((imul(ah4, bl4) | 0) + (m >>> 16) | 0) + (r8 >>> 16) | 0;\r\n                w = ((imul(al4, bh4) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah4, bh4) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r8 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al4, bl5) | 0) + (m & 0xffff) | 0) + (r9 & 0xffff) | 0;\r\n                v = ((imul(ah4, bl5) | 0) + (m >>> 16) | 0) + (r9 >>> 16) | 0;\r\n                w = ((imul(al4, bh5) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah4, bh5) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r9 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al4, bl6) | 0) + (m & 0xffff) | 0) + (r10 & 0xffff) | 0;\r\n                v = ((imul(ah4, bl6) | 0) + (m >>> 16) | 0) + (r10 >>> 16) | 0;\r\n                w = ((imul(al4, bh6) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah4, bh6) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r10 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al4, bl7) | 0) + (m & 0xffff) | 0) + (r11 & 0xffff) | 0;\r\n                v = ((imul(ah4, bl7) | 0) + (m >>> 16) | 0) + (r11 >>> 16) | 0;\r\n                w = ((imul(al4, bh7) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah4, bh7) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r11 = (w << 16) | (u & 0xffff);\r\n\r\n                r12 = m;\r\n\r\n                u = ((imul(al5, bl0) | 0) + (r13 & 0xffff) | 0) + (r5 & 0xffff) | 0;\r\n                v = ((imul(ah5, bl0) | 0) + (r13 >>> 16) | 0) + (r5 >>> 16) | 0;\r\n                w = ((imul(al5, bh0) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah5, bh0) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r5 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al5, bl1) | 0) + (m & 0xffff) | 0) + (r6 & 0xffff) | 0;\r\n                v = ((imul(ah5, bl1) | 0) + (m >>> 16) | 0) + (r6 >>> 16) | 0;\r\n                w = ((imul(al5, bh1) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah5, bh1) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r6 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al5, bl2) | 0) + (m & 0xffff) | 0) + (r7 & 0xffff) | 0;\r\n                v = ((imul(ah5, bl2) | 0) + (m >>> 16) | 0) + (r7 >>> 16) | 0;\r\n                w = ((imul(al5, bh2) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah5, bh2) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r7 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al5, bl3) | 0) + (m & 0xffff) | 0) + (r8 & 0xffff) | 0;\r\n                v = ((imul(ah5, bl3) | 0) + (m >>> 16) | 0) + (r8 >>> 16) | 0;\r\n                w = ((imul(al5, bh3) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah5, bh3) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r8 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al5, bl4) | 0) + (m & 0xffff) | 0) + (r9 & 0xffff) | 0;\r\n                v = ((imul(ah5, bl4) | 0) + (m >>> 16) | 0) + (r9 >>> 16) | 0;\r\n                w = ((imul(al5, bh4) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah5, bh4) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r9 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al5, bl5) | 0) + (m & 0xffff) | 0) + (r10 & 0xffff) | 0;\r\n                v = ((imul(ah5, bl5) | 0) + (m >>> 16) | 0) + (r10 >>> 16) | 0;\r\n                w = ((imul(al5, bh5) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah5, bh5) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r10 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al5, bl6) | 0) + (m & 0xffff) | 0) + (r11 & 0xffff) | 0;\r\n                v = ((imul(ah5, bl6) | 0) + (m >>> 16) | 0) + (r11 >>> 16) | 0;\r\n                w = ((imul(al5, bh6) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah5, bh6) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r11 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al5, bl7) | 0) + (m & 0xffff) | 0) + (r12 & 0xffff) | 0;\r\n                v = ((imul(ah5, bl7) | 0) + (m >>> 16) | 0) + (r12 >>> 16) | 0;\r\n                w = ((imul(al5, bh7) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah5, bh7) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r12 = (w << 16) | (u & 0xffff);\r\n\r\n                r13 = m;\r\n\r\n                u = ((imul(al6, bl0) | 0) + (r14 & 0xffff) | 0) + (r6 & 0xffff) | 0;\r\n                v = ((imul(ah6, bl0) | 0) + (r14 >>> 16) | 0) + (r6 >>> 16) | 0;\r\n                w = ((imul(al6, bh0) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah6, bh0) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r6 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al6, bl1) | 0) + (m & 0xffff) | 0) + (r7 & 0xffff) | 0;\r\n                v = ((imul(ah6, bl1) | 0) + (m >>> 16) | 0) + (r7 >>> 16) | 0;\r\n                w = ((imul(al6, bh1) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah6, bh1) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r7 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al6, bl2) | 0) + (m & 0xffff) | 0) + (r8 & 0xffff) | 0;\r\n                v = ((imul(ah6, bl2) | 0) + (m >>> 16) | 0) + (r8 >>> 16) | 0;\r\n                w = ((imul(al6, bh2) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah6, bh2) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r8 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al6, bl3) | 0) + (m & 0xffff) | 0) + (r9 & 0xffff) | 0;\r\n                v = ((imul(ah6, bl3) | 0) + (m >>> 16) | 0) + (r9 >>> 16) | 0;\r\n                w = ((imul(al6, bh3) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah6, bh3) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r9 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al6, bl4) | 0) + (m & 0xffff) | 0) + (r10 & 0xffff) | 0;\r\n                v = ((imul(ah6, bl4) | 0) + (m >>> 16) | 0) + (r10 >>> 16) | 0;\r\n                w = ((imul(al6, bh4) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah6, bh4) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r10 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al6, bl5) | 0) + (m & 0xffff) | 0) + (r11 & 0xffff) | 0;\r\n                v = ((imul(ah6, bl5) | 0) + (m >>> 16) | 0) + (r11 >>> 16) | 0;\r\n                w = ((imul(al6, bh5) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah6, bh5) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r11 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al6, bl6) | 0) + (m & 0xffff) | 0) + (r12 & 0xffff) | 0;\r\n                v = ((imul(ah6, bl6) | 0) + (m >>> 16) | 0) + (r12 >>> 16) | 0;\r\n                w = ((imul(al6, bh6) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah6, bh6) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r12 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al6, bl7) | 0) + (m & 0xffff) | 0) + (r13 & 0xffff) | 0;\r\n                v = ((imul(ah6, bl7) | 0) + (m >>> 16) | 0) + (r13 >>> 16) | 0;\r\n                w = ((imul(al6, bh7) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah6, bh7) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r13 = (w << 16) | (u & 0xffff);\r\n\r\n                r14 = m;\r\n\r\n                u = ((imul(al7, bl0) | 0) + (r15 & 0xffff) | 0) + (r7 & 0xffff) | 0;\r\n                v = ((imul(ah7, bl0) | 0) + (r15 >>> 16) | 0) + (r7 >>> 16) | 0;\r\n                w = ((imul(al7, bh0) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah7, bh0) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r7 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al7, bl1) | 0) + (m & 0xffff) | 0) + (r8 & 0xffff) | 0;\r\n                v = ((imul(ah7, bl1) | 0) + (m >>> 16) | 0) + (r8 >>> 16) | 0;\r\n                w = ((imul(al7, bh1) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah7, bh1) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r8 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al7, bl2) | 0) + (m & 0xffff) | 0) + (r9 & 0xffff) | 0;\r\n                v = ((imul(ah7, bl2) | 0) + (m >>> 16) | 0) + (r9 >>> 16) | 0;\r\n                w = ((imul(al7, bh2) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah7, bh2) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r9 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al7, bl3) | 0) + (m & 0xffff) | 0) + (r10 & 0xffff) | 0;\r\n                v = ((imul(ah7, bl3) | 0) + (m >>> 16) | 0) + (r10 >>> 16) | 0;\r\n                w = ((imul(al7, bh3) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah7, bh3) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r10 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al7, bl4) | 0) + (m & 0xffff) | 0) + (r11 & 0xffff) | 0;\r\n                v = ((imul(ah7, bl4) | 0) + (m >>> 16) | 0) + (r11 >>> 16) | 0;\r\n                w = ((imul(al7, bh4) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah7, bh4) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r11 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al7, bl5) | 0) + (m & 0xffff) | 0) + (r12 & 0xffff) | 0;\r\n                v = ((imul(ah7, bl5) | 0) + (m >>> 16) | 0) + (r12 >>> 16) | 0;\r\n                w = ((imul(al7, bh5) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah7, bh5) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r12 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al7, bl6) | 0) + (m & 0xffff) | 0) + (r13 & 0xffff) | 0;\r\n                v = ((imul(ah7, bl6) | 0) + (m >>> 16) | 0) + (r13 >>> 16) | 0;\r\n                w = ((imul(al7, bh6) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah7, bh6) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r13 = (w << 16) | (u & 0xffff);\r\n\r\n                u = ((imul(al7, bl7) | 0) + (m & 0xffff) | 0) + (r14 & 0xffff) | 0;\r\n                v = ((imul(ah7, bl7) | 0) + (m >>> 16) | 0) + (r14 >>> 16) | 0;\r\n                w = ((imul(al7, bh7) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                m = ((imul(ah7, bh7) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                r14 = (w << 16) | (u & 0xffff);\r\n\r\n                r15 = m;\r\n\r\n                HEAP32[(Rk | 0) >> 2] = r0,\r\n                    HEAP32[(Rk | 4) >> 2] = r1,\r\n                    HEAP32[(Rk | 8) >> 2] = r2,\r\n                    HEAP32[(Rk | 12) >> 2] = r3,\r\n                    HEAP32[(Rk | 16) >> 2] = r4,\r\n                    HEAP32[(Rk | 20) >> 2] = r5,\r\n                    HEAP32[(Rk | 24) >> 2] = r6,\r\n                    HEAP32[(Rk | 28) >> 2] = r7;\r\n            }\r\n\r\n            Rk = (R + (i + j | 0)) | 0;\r\n            HEAP32[(Rk | 0) >> 2] = r8,\r\n                HEAP32[(Rk | 4) >> 2] = r9,\r\n                HEAP32[(Rk | 8) >> 2] = r10,\r\n                HEAP32[(Rk | 12) >> 2] = r11,\r\n                HEAP32[(Rk | 16) >> 2] = r12,\r\n                HEAP32[(Rk | 20) >> 2] = r13,\r\n                HEAP32[(Rk | 24) >> 2] = r14,\r\n                HEAP32[(Rk | 28) >> 2] = r15;\r\n        }\r\n        /*\r\n                for ( i = lA & -32; (i|0) < (lA|0); i = (i+4)|0 ) {\r\n                    Ai = (A+i)|0;\r\n    \r\n                    ah0 = HEAP32[Ai>>2]|0,\r\n                    al0 = ah0 & 0xffff,\r\n                    ah0 = ah0 >>> 16;\r\n    \r\n                    r1 = 0;\r\n    \r\n                    for ( j = 0; (j|0) < (lB|0); j = (j+4)|0 ) {\r\n                        Bj = (B+j)|0;\r\n                        Rk = (R+(i+j|0))|0;\r\n    \r\n                        bh0 = HEAP32[Bj>>2]|0,\r\n                        bl0 = bh0 & 0xffff,\r\n                        bh0 = bh0 >>> 16;\r\n    \r\n                        r0 = HEAP32[Rk>>2]|0;\r\n    \r\n                        u = ((imul(al0, bl0)|0) + (r1 & 0xffff)|0) + (r0 & 0xffff)|0;\r\n                        v = ((imul(ah0, bl0)|0) + (r1 >>> 16)|0) + (r0 >>> 16)|0;\r\n                        w = ((imul(al0, bh0)|0) + (v & 0xffff)|0) + (u >>> 16)|0;\r\n                        m = ((imul(ah0, bh0)|0) + (v >>> 16)|0) + (w >>> 16)|0;\r\n                        r0 = (w << 16) | (u & 0xffff);\r\n    \r\n                        r1 = m;\r\n    \r\n                        HEAP32[Rk>>2] = r0;\r\n                    }\r\n    \r\n                    Rk = (R+(i+j|0))|0;\r\n                    HEAP32[Rk>>2] = r1;\r\n                }\r\n        */\r\n    }\r\n\r\n    /**\r\n     * Fast squaring\r\n     *\r\n     * Exploits the fact:\r\n     *\r\n     *  X\u00B2 = ( X0 + X1*B )\u00B2 = X0\u00B2 + 2*X0*X1*B + X1\u00B2*B\u00B2,\r\n     *\r\n     * where B is a power of 2, so:\r\n     *\r\n     *  2*X0*X1*B = (X0*X1 << 1)*B\r\n     *\r\n     * @param A offset of the argument being squared, 32-byte aligned\r\n     * @param lA length of the argument, multiple of 32\r\n     *\r\n     * @param R offset where to place the result to, 32-byte aligned\r\n     */\r\n    function sqr(A, lA, R) {\r\n        A = A | 0;\r\n        lA = lA | 0;\r\n        R = R | 0;\r\n\r\n        var al0 = 0, al1 = 0, al2 = 0, al3 = 0, al4 = 0, al5 = 0, al6 = 0, al7 = 0, ah0 = 0, ah1 = 0, ah2 = 0, ah3 = 0, ah4 = 0, ah5 = 0, ah6 = 0, ah7 = 0,\r\n            bl0 = 0, bl1 = 0, bl2 = 0, bl3 = 0, bl4 = 0, bl5 = 0, bl6 = 0, bl7 = 0, bh0 = 0, bh1 = 0, bh2 = 0, bh3 = 0, bh4 = 0, bh5 = 0, bh6 = 0, bh7 = 0,\r\n            r0 = 0, r1 = 0, r2 = 0, r3 = 0, r4 = 0, r5 = 0, r6 = 0, r7 = 0, r8 = 0, r9 = 0, r10 = 0, r11 = 0, r12 = 0, r13 = 0, r14 = 0, r15 = 0,\r\n            u = 0, v = 0, w = 0, c = 0, h = 0, m = 0, r = 0,\r\n            d = 0, dd = 0, p = 0, i = 0, j = 0, k = 0, Ai = 0, Aj = 0, Rk = 0;\r\n\r\n        // prepare for iterations\r\n        for (; (i | 0) < (lA | 0); i = (i + 4) | 0) {\r\n            Rk = R + (i << 1) | 0;\r\n            ah0 = HEAP32[(A + i) >> 2] | 0, al0 = ah0 & 0xffff, ah0 = ah0 >>> 16;\r\n            u = imul(al0, al0) | 0;\r\n            v = (imul(al0, ah0) | 0) + (u >>> 17) | 0;\r\n            w = (imul(ah0, ah0) | 0) + (v >>> 15) | 0;\r\n            HEAP32[(Rk) >> 2] = (v << 17) | (u & 0x1ffff);\r\n            HEAP32[(Rk | 4) >> 2] = w;\r\n        }\r\n\r\n        // unrolled 1st iteration\r\n        for (p = 0; (p | 0) < (lA | 0); p = (p + 8) | 0) {\r\n            Ai = A + p | 0, Rk = R + (p << 1) | 0;\r\n\r\n            ah0 = HEAP32[(Ai) >> 2] | 0, al0 = ah0 & 0xffff, ah0 = ah0 >>> 16;\r\n\r\n            bh0 = HEAP32[(Ai | 4) >> 2] | 0, bl0 = bh0 & 0xffff, bh0 = bh0 >>> 16;\r\n\r\n            u = imul(al0, bl0) | 0;\r\n            v = (imul(al0, bh0) | 0) + (u >>> 16) | 0;\r\n            w = (imul(ah0, bl0) | 0) + (v & 0xffff) | 0;\r\n            m = ((imul(ah0, bh0) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n\r\n            r = HEAP32[(Rk | 4) >> 2] | 0;\r\n            u = (r & 0xffff) + ((u & 0xffff) << 1) | 0;\r\n            w = ((r >>> 16) + ((w & 0xffff) << 1) | 0) + (u >>> 16) | 0;\r\n            HEAP32[(Rk | 4) >> 2] = (w << 16) | (u & 0xffff);\r\n            c = w >>> 16;\r\n\r\n            r = HEAP32[(Rk | 8) >> 2] | 0;\r\n            u = ((r & 0xffff) + ((m & 0xffff) << 1) | 0) + c | 0;\r\n            w = ((r >>> 16) + ((m >>> 16) << 1) | 0) + (u >>> 16) | 0;\r\n            HEAP32[(Rk | 8) >> 2] = (w << 16) | (u & 0xffff);\r\n            c = w >>> 16;\r\n\r\n            if (c) {\r\n                r = HEAP32[(Rk | 12) >> 2] | 0;\r\n                u = (r & 0xffff) + c | 0;\r\n                w = (r >>> 16) + (u >>> 16) | 0;\r\n                HEAP32[(Rk | 12) >> 2] = (w << 16) | (u & 0xffff);\r\n            }\r\n        }\r\n\r\n        // unrolled 2nd iteration\r\n        for (p = 0; (p | 0) < (lA | 0); p = (p + 16) | 0) {\r\n            Ai = A + p | 0, Rk = R + (p << 1) | 0;\r\n\r\n            ah0 = HEAP32[(Ai) >> 2] | 0, al0 = ah0 & 0xffff, ah0 = ah0 >>> 16,\r\n                ah1 = HEAP32[(Ai | 4) >> 2] | 0, al1 = ah1 & 0xffff, ah1 = ah1 >>> 16;\r\n\r\n            bh0 = HEAP32[(Ai | 8) >> 2] | 0, bl0 = bh0 & 0xffff, bh0 = bh0 >>> 16,\r\n                bh1 = HEAP32[(Ai | 12) >> 2] | 0, bl1 = bh1 & 0xffff, bh1 = bh1 >>> 16;\r\n\r\n            u = imul(al0, bl0) | 0;\r\n            v = imul(ah0, bl0) | 0;\r\n            w = ((imul(al0, bh0) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n            m = ((imul(ah0, bh0) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n            r0 = (w << 16) | (u & 0xffff);\r\n\r\n            u = (imul(al0, bl1) | 0) + (m & 0xffff) | 0;\r\n            v = (imul(ah0, bl1) | 0) + (m >>> 16) | 0;\r\n            w = ((imul(al0, bh1) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n            m = ((imul(ah0, bh1) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n            r1 = (w << 16) | (u & 0xffff);\r\n\r\n            r2 = m;\r\n\r\n            u = (imul(al1, bl0) | 0) + (r1 & 0xffff) | 0;\r\n            v = (imul(ah1, bl0) | 0) + (r1 >>> 16) | 0;\r\n            w = ((imul(al1, bh0) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n            m = ((imul(ah1, bh0) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n            r1 = (w << 16) | (u & 0xffff);\r\n\r\n            u = ((imul(al1, bl1) | 0) + (r2 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n            v = ((imul(ah1, bl1) | 0) + (r2 >>> 16) | 0) + (m >>> 16) | 0;\r\n            w = ((imul(al1, bh1) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n            m = ((imul(ah1, bh1) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n            r2 = (w << 16) | (u & 0xffff);\r\n\r\n            r3 = m;\r\n\r\n            r = HEAP32[(Rk | 8) >> 2] | 0;\r\n            u = (r & 0xffff) + ((r0 & 0xffff) << 1) | 0;\r\n            w = ((r >>> 16) + ((r0 >>> 16) << 1) | 0) + (u >>> 16) | 0;\r\n            HEAP32[(Rk | 8) >> 2] = (w << 16) | (u & 0xffff);\r\n            c = w >>> 16;\r\n\r\n            r = HEAP32[(Rk | 12) >> 2] | 0;\r\n            u = ((r & 0xffff) + ((r1 & 0xffff) << 1) | 0) + c | 0;\r\n            w = ((r >>> 16) + ((r1 >>> 16) << 1) | 0) + (u >>> 16) | 0;\r\n            HEAP32[(Rk | 12) >> 2] = (w << 16) | (u & 0xffff);\r\n            c = w >>> 16;\r\n\r\n            r = HEAP32[(Rk | 16) >> 2] | 0;\r\n            u = ((r & 0xffff) + ((r2 & 0xffff) << 1) | 0) + c | 0;\r\n            w = ((r >>> 16) + ((r2 >>> 16) << 1) | 0) + (u >>> 16) | 0;\r\n            HEAP32[(Rk | 16) >> 2] = (w << 16) | (u & 0xffff);\r\n            c = w >>> 16;\r\n\r\n            r = HEAP32[(Rk | 20) >> 2] | 0;\r\n            u = ((r & 0xffff) + ((r3 & 0xffff) << 1) | 0) + c | 0;\r\n            w = ((r >>> 16) + ((r3 >>> 16) << 1) | 0) + (u >>> 16) | 0;\r\n            HEAP32[(Rk | 20) >> 2] = (w << 16) | (u & 0xffff);\r\n            c = w >>> 16;\r\n\r\n            for (k = 24; !!c & ((k | 0) < 32); k = (k + 4) | 0) {\r\n                r = HEAP32[(Rk | k) >> 2] | 0;\r\n                u = (r & 0xffff) + c | 0;\r\n                w = (r >>> 16) + (u >>> 16) | 0;\r\n                HEAP32[(Rk | k) >> 2] = (w << 16) | (u & 0xffff);\r\n                c = w >>> 16;\r\n            }\r\n        }\r\n\r\n        // unrolled 3rd iteration\r\n        for (p = 0; (p | 0) < (lA | 0); p = (p + 32) | 0) {\r\n            Ai = A + p | 0, Rk = R + (p << 1) | 0;\r\n\r\n            ah0 = HEAP32[(Ai) >> 2] | 0, al0 = ah0 & 0xffff, ah0 = ah0 >>> 16,\r\n                ah1 = HEAP32[(Ai | 4) >> 2] | 0, al1 = ah1 & 0xffff, ah1 = ah1 >>> 16,\r\n                ah2 = HEAP32[(Ai | 8) >> 2] | 0, al2 = ah2 & 0xffff, ah2 = ah2 >>> 16,\r\n                ah3 = HEAP32[(Ai | 12) >> 2] | 0, al3 = ah3 & 0xffff, ah3 = ah3 >>> 16;\r\n\r\n            bh0 = HEAP32[(Ai | 16) >> 2] | 0, bl0 = bh0 & 0xffff, bh0 = bh0 >>> 16,\r\n                bh1 = HEAP32[(Ai | 20) >> 2] | 0, bl1 = bh1 & 0xffff, bh1 = bh1 >>> 16,\r\n                bh2 = HEAP32[(Ai | 24) >> 2] | 0, bl2 = bh2 & 0xffff, bh2 = bh2 >>> 16,\r\n                bh3 = HEAP32[(Ai | 28) >> 2] | 0, bl3 = bh3 & 0xffff, bh3 = bh3 >>> 16;\r\n\r\n            u = imul(al0, bl0) | 0;\r\n            v = imul(ah0, bl0) | 0;\r\n            w = ((imul(al0, bh0) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n            m = ((imul(ah0, bh0) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n            r0 = (w << 16) | (u & 0xffff);\r\n\r\n            u = (imul(al0, bl1) | 0) + (m & 0xffff) | 0;\r\n            v = (imul(ah0, bl1) | 0) + (m >>> 16) | 0;\r\n            w = ((imul(al0, bh1) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n            m = ((imul(ah0, bh1) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n            r1 = (w << 16) | (u & 0xffff);\r\n\r\n            u = (imul(al0, bl2) | 0) + (m & 0xffff) | 0;\r\n            v = (imul(ah0, bl2) | 0) + (m >>> 16) | 0;\r\n            w = ((imul(al0, bh2) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n            m = ((imul(ah0, bh2) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n            r2 = (w << 16) | (u & 0xffff);\r\n\r\n            u = (imul(al0, bl3) | 0) + (m & 0xffff) | 0;\r\n            v = (imul(ah0, bl3) | 0) + (m >>> 16) | 0;\r\n            w = ((imul(al0, bh3) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n            m = ((imul(ah0, bh3) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n            r3 = (w << 16) | (u & 0xffff);\r\n\r\n            r4 = m;\r\n\r\n            u = (imul(al1, bl0) | 0) + (r1 & 0xffff) | 0;\r\n            v = (imul(ah1, bl0) | 0) + (r1 >>> 16) | 0;\r\n            w = ((imul(al1, bh0) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n            m = ((imul(ah1, bh0) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n            r1 = (w << 16) | (u & 0xffff);\r\n\r\n            u = ((imul(al1, bl1) | 0) + (r2 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n            v = ((imul(ah1, bl1) | 0) + (r2 >>> 16) | 0) + (m >>> 16) | 0;\r\n            w = ((imul(al1, bh1) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n            m = ((imul(ah1, bh1) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n            r2 = (w << 16) | (u & 0xffff);\r\n\r\n            u = ((imul(al1, bl2) | 0) + (r3 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n            v = ((imul(ah1, bl2) | 0) + (r3 >>> 16) | 0) + (m >>> 16) | 0;\r\n            w = ((imul(al1, bh2) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n            m = ((imul(ah1, bh2) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n            r3 = (w << 16) | (u & 0xffff);\r\n\r\n            u = ((imul(al1, bl3) | 0) + (r4 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n            v = ((imul(ah1, bl3) | 0) + (r4 >>> 16) | 0) + (m >>> 16) | 0;\r\n            w = ((imul(al1, bh3) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n            m = ((imul(ah1, bh3) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n            r4 = (w << 16) | (u & 0xffff);\r\n\r\n            r5 = m;\r\n\r\n            u = (imul(al2, bl0) | 0) + (r2 & 0xffff) | 0;\r\n            v = (imul(ah2, bl0) | 0) + (r2 >>> 16) | 0;\r\n            w = ((imul(al2, bh0) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n            m = ((imul(ah2, bh0) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n            r2 = (w << 16) | (u & 0xffff);\r\n\r\n            u = ((imul(al2, bl1) | 0) + (r3 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n            v = ((imul(ah2, bl1) | 0) + (r3 >>> 16) | 0) + (m >>> 16) | 0;\r\n            w = ((imul(al2, bh1) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n            m = ((imul(ah2, bh1) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n            r3 = (w << 16) | (u & 0xffff);\r\n\r\n            u = ((imul(al2, bl2) | 0) + (r4 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n            v = ((imul(ah2, bl2) | 0) + (r4 >>> 16) | 0) + (m >>> 16) | 0;\r\n            w = ((imul(al2, bh2) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n            m = ((imul(ah2, bh2) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n            r4 = (w << 16) | (u & 0xffff);\r\n\r\n            u = ((imul(al2, bl3) | 0) + (r5 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n            v = ((imul(ah2, bl3) | 0) + (r5 >>> 16) | 0) + (m >>> 16) | 0;\r\n            w = ((imul(al2, bh3) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n            m = ((imul(ah2, bh3) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n            r5 = (w << 16) | (u & 0xffff);\r\n\r\n            r6 = m;\r\n\r\n            u = (imul(al3, bl0) | 0) + (r3 & 0xffff) | 0;\r\n            v = (imul(ah3, bl0) | 0) + (r3 >>> 16) | 0;\r\n            w = ((imul(al3, bh0) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n            m = ((imul(ah3, bh0) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n            r3 = (w << 16) | (u & 0xffff);\r\n\r\n            u = ((imul(al3, bl1) | 0) + (r4 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n            v = ((imul(ah3, bl1) | 0) + (r4 >>> 16) | 0) + (m >>> 16) | 0;\r\n            w = ((imul(al3, bh1) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n            m = ((imul(ah3, bh1) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n            r4 = (w << 16) | (u & 0xffff);\r\n\r\n            u = ((imul(al3, bl2) | 0) + (r5 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n            v = ((imul(ah3, bl2) | 0) + (r5 >>> 16) | 0) + (m >>> 16) | 0;\r\n            w = ((imul(al3, bh2) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n            m = ((imul(ah3, bh2) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n            r5 = (w << 16) | (u & 0xffff);\r\n\r\n            u = ((imul(al3, bl3) | 0) + (r6 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n            v = ((imul(ah3, bl3) | 0) + (r6 >>> 16) | 0) + (m >>> 16) | 0;\r\n            w = ((imul(al3, bh3) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n            m = ((imul(ah3, bh3) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n            r6 = (w << 16) | (u & 0xffff);\r\n\r\n            r7 = m;\r\n\r\n            r = HEAP32[(Rk | 16) >> 2] | 0;\r\n            u = (r & 0xffff) + ((r0 & 0xffff) << 1) | 0;\r\n            w = ((r >>> 16) + ((r0 >>> 16) << 1) | 0) + (u >>> 16) | 0;\r\n            HEAP32[(Rk | 16) >> 2] = (w << 16) | (u & 0xffff);\r\n            c = w >>> 16;\r\n\r\n            r = HEAP32[(Rk | 20) >> 2] | 0;\r\n            u = ((r & 0xffff) + ((r1 & 0xffff) << 1) | 0) + c | 0;\r\n            w = ((r >>> 16) + ((r1 >>> 16) << 1) | 0) + (u >>> 16) | 0;\r\n            HEAP32[(Rk | 20) >> 2] = (w << 16) | (u & 0xffff);\r\n            c = w >>> 16;\r\n\r\n            r = HEAP32[(Rk | 24) >> 2] | 0;\r\n            u = ((r & 0xffff) + ((r2 & 0xffff) << 1) | 0) + c | 0;\r\n            w = ((r >>> 16) + ((r2 >>> 16) << 1) | 0) + (u >>> 16) | 0;\r\n            HEAP32[(Rk | 24) >> 2] = (w << 16) | (u & 0xffff);\r\n            c = w >>> 16;\r\n\r\n            r = HEAP32[(Rk | 28) >> 2] | 0;\r\n            u = ((r & 0xffff) + ((r3 & 0xffff) << 1) | 0) + c | 0;\r\n            w = ((r >>> 16) + ((r3 >>> 16) << 1) | 0) + (u >>> 16) | 0;\r\n            HEAP32[(Rk | 28) >> 2] = (w << 16) | (u & 0xffff);\r\n            c = w >>> 16;\r\n\r\n            r = HEAP32[(Rk + 32) >> 2] | 0;\r\n            u = ((r & 0xffff) + ((r4 & 0xffff) << 1) | 0) + c | 0;\r\n            w = ((r >>> 16) + ((r4 >>> 16) << 1) | 0) + (u >>> 16) | 0;\r\n            HEAP32[(Rk + 32) >> 2] = (w << 16) | (u & 0xffff);\r\n            c = w >>> 16;\r\n\r\n            r = HEAP32[(Rk + 36) >> 2] | 0;\r\n            u = ((r & 0xffff) + ((r5 & 0xffff) << 1) | 0) + c | 0;\r\n            w = ((r >>> 16) + ((r5 >>> 16) << 1) | 0) + (u >>> 16) | 0;\r\n            HEAP32[(Rk + 36) >> 2] = (w << 16) | (u & 0xffff);\r\n            c = w >>> 16;\r\n\r\n            r = HEAP32[(Rk + 40) >> 2] | 0;\r\n            u = ((r & 0xffff) + ((r6 & 0xffff) << 1) | 0) + c | 0;\r\n            w = ((r >>> 16) + ((r6 >>> 16) << 1) | 0) + (u >>> 16) | 0;\r\n            HEAP32[(Rk + 40) >> 2] = (w << 16) | (u & 0xffff);\r\n            c = w >>> 16;\r\n\r\n            r = HEAP32[(Rk + 44) >> 2] | 0;\r\n            u = ((r & 0xffff) + ((r7 & 0xffff) << 1) | 0) + c | 0;\r\n            w = ((r >>> 16) + ((r7 >>> 16) << 1) | 0) + (u >>> 16) | 0;\r\n            HEAP32[(Rk + 44) >> 2] = (w << 16) | (u & 0xffff);\r\n            c = w >>> 16;\r\n\r\n            for (k = 48; !!c & ((k | 0) < 64); k = (k + 4) | 0) {\r\n                r = HEAP32[(Rk + k) >> 2] | 0;\r\n                u = (r & 0xffff) + c | 0;\r\n                w = (r >>> 16) + (u >>> 16) | 0;\r\n                HEAP32[(Rk + k) >> 2] = (w << 16) | (u & 0xffff);\r\n                c = w >>> 16;\r\n            }\r\n        }\r\n\r\n        // perform iterations\r\n        for (d = 32; (d | 0) < (lA | 0); d = d << 1) { // depth loop\r\n            dd = d << 1;\r\n\r\n            for (p = 0; (p | 0) < (lA | 0); p = (p + dd) | 0) { // part loop\r\n                Rk = R + (p << 1) | 0;\r\n\r\n                h = 0;\r\n                for (i = 0; (i | 0) < (d | 0); i = (i + 32) | 0) { // multiply-and-add loop\r\n                    Ai = (A + p | 0) + i | 0;\r\n\r\n                    ah0 = HEAP32[(Ai) >> 2] | 0, al0 = ah0 & 0xffff, ah0 = ah0 >>> 16,\r\n                        ah1 = HEAP32[(Ai | 4) >> 2] | 0, al1 = ah1 & 0xffff, ah1 = ah1 >>> 16,\r\n                        ah2 = HEAP32[(Ai | 8) >> 2] | 0, al2 = ah2 & 0xffff, ah2 = ah2 >>> 16,\r\n                        ah3 = HEAP32[(Ai | 12) >> 2] | 0, al3 = ah3 & 0xffff, ah3 = ah3 >>> 16,\r\n                        ah4 = HEAP32[(Ai | 16) >> 2] | 0, al4 = ah4 & 0xffff, ah4 = ah4 >>> 16,\r\n                        ah5 = HEAP32[(Ai | 20) >> 2] | 0, al5 = ah5 & 0xffff, ah5 = ah5 >>> 16,\r\n                        ah6 = HEAP32[(Ai | 24) >> 2] | 0, al6 = ah6 & 0xffff, ah6 = ah6 >>> 16,\r\n                        ah7 = HEAP32[(Ai | 28) >> 2] | 0, al7 = ah7 & 0xffff, ah7 = ah7 >>> 16;\r\n\r\n                    r8 = r9 = r10 = r11 = r12 = r13 = r14 = r15 = c = 0;\r\n\r\n                    for (j = 0; (j | 0) < (d | 0); j = (j + 32) | 0) {\r\n                        Aj = ((A + p | 0) + d | 0) + j | 0;\r\n\r\n                        bh0 = HEAP32[(Aj) >> 2] | 0, bl0 = bh0 & 0xffff, bh0 = bh0 >>> 16,\r\n                            bh1 = HEAP32[(Aj | 4) >> 2] | 0, bl1 = bh1 & 0xffff, bh1 = bh1 >>> 16,\r\n                            bh2 = HEAP32[(Aj | 8) >> 2] | 0, bl2 = bh2 & 0xffff, bh2 = bh2 >>> 16,\r\n                            bh3 = HEAP32[(Aj | 12) >> 2] | 0, bl3 = bh3 & 0xffff, bh3 = bh3 >>> 16,\r\n                            bh4 = HEAP32[(Aj | 16) >> 2] | 0, bl4 = bh4 & 0xffff, bh4 = bh4 >>> 16,\r\n                            bh5 = HEAP32[(Aj | 20) >> 2] | 0, bl5 = bh5 & 0xffff, bh5 = bh5 >>> 16,\r\n                            bh6 = HEAP32[(Aj | 24) >> 2] | 0, bl6 = bh6 & 0xffff, bh6 = bh6 >>> 16,\r\n                            bh7 = HEAP32[(Aj | 28) >> 2] | 0, bl7 = bh7 & 0xffff, bh7 = bh7 >>> 16;\r\n\r\n                        r0 = r1 = r2 = r3 = r4 = r5 = r6 = r7 = 0;\r\n\r\n                        u = ((imul(al0, bl0) | 0) + (r0 & 0xffff) | 0) + (r8 & 0xffff) | 0;\r\n                        v = ((imul(ah0, bl0) | 0) + (r0 >>> 16) | 0) + (r8 >>> 16) | 0;\r\n                        w = ((imul(al0, bh0) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah0, bh0) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r0 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al0, bl1) | 0) + (r1 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah0, bl1) | 0) + (r1 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al0, bh1) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah0, bh1) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r1 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al0, bl2) | 0) + (r2 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah0, bl2) | 0) + (r2 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al0, bh2) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah0, bh2) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r2 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al0, bl3) | 0) + (r3 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah0, bl3) | 0) + (r3 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al0, bh3) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah0, bh3) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r3 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al0, bl4) | 0) + (r4 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah0, bl4) | 0) + (r4 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al0, bh4) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah0, bh4) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r4 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al0, bl5) | 0) + (r5 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah0, bl5) | 0) + (r5 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al0, bh5) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah0, bh5) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r5 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al0, bl6) | 0) + (r6 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah0, bl6) | 0) + (r6 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al0, bh6) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah0, bh6) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r6 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al0, bl7) | 0) + (r7 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah0, bl7) | 0) + (r7 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al0, bh7) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah0, bh7) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r7 = (w << 16) | (u & 0xffff);\r\n\r\n                        r8 = m;\r\n\r\n                        u = ((imul(al1, bl0) | 0) + (r1 & 0xffff) | 0) + (r9 & 0xffff) | 0;\r\n                        v = ((imul(ah1, bl0) | 0) + (r1 >>> 16) | 0) + (r9 >>> 16) | 0;\r\n                        w = ((imul(al1, bh0) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah1, bh0) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r1 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al1, bl1) | 0) + (r2 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah1, bl1) | 0) + (r2 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al1, bh1) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah1, bh1) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r2 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al1, bl2) | 0) + (r3 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah1, bl2) | 0) + (r3 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al1, bh2) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah1, bh2) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r3 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al1, bl3) | 0) + (r4 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah1, bl3) | 0) + (r4 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al1, bh3) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah1, bh3) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r4 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al1, bl4) | 0) + (r5 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah1, bl4) | 0) + (r5 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al1, bh4) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah1, bh4) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r5 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al1, bl5) | 0) + (r6 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah1, bl5) | 0) + (r6 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al1, bh5) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah1, bh5) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r6 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al1, bl6) | 0) + (r7 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah1, bl6) | 0) + (r7 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al1, bh6) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah1, bh6) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r7 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al1, bl7) | 0) + (r8 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah1, bl7) | 0) + (r8 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al1, bh7) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah1, bh7) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r8 = (w << 16) | (u & 0xffff);\r\n\r\n                        r9 = m;\r\n\r\n                        u = ((imul(al2, bl0) | 0) + (r2 & 0xffff) | 0) + (r10 & 0xffff) | 0;\r\n                        v = ((imul(ah2, bl0) | 0) + (r2 >>> 16) | 0) + (r10 >>> 16) | 0;\r\n                        w = ((imul(al2, bh0) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah2, bh0) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r2 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al2, bl1) | 0) + (r3 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah2, bl1) | 0) + (r3 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al2, bh1) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah2, bh1) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r3 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al2, bl2) | 0) + (r4 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah2, bl2) | 0) + (r4 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al2, bh2) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah2, bh2) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r4 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al2, bl3) | 0) + (r5 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah2, bl3) | 0) + (r5 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al2, bh3) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah2, bh3) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r5 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al2, bl4) | 0) + (r6 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah2, bl4) | 0) + (r6 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al2, bh4) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah2, bh4) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r6 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al2, bl5) | 0) + (r7 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah2, bl5) | 0) + (r7 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al2, bh5) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah2, bh5) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r7 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al2, bl6) | 0) + (r8 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah2, bl6) | 0) + (r8 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al2, bh6) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah2, bh6) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r8 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al2, bl7) | 0) + (r9 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah2, bl7) | 0) + (r9 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al2, bh7) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah2, bh7) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r9 = (w << 16) | (u & 0xffff);\r\n\r\n                        r10 = m;\r\n\r\n                        u = ((imul(al3, bl0) | 0) + (r3 & 0xffff) | 0) + (r11 & 0xffff) | 0;\r\n                        v = ((imul(ah3, bl0) | 0) + (r3 >>> 16) | 0) + (r11 >>> 16) | 0;\r\n                        w = ((imul(al3, bh0) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah3, bh0) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r3 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al3, bl1) | 0) + (r4 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah3, bl1) | 0) + (r4 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al3, bh1) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah3, bh1) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r4 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al3, bl2) | 0) + (r5 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah3, bl2) | 0) + (r5 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al3, bh2) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah3, bh2) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r5 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al3, bl3) | 0) + (r6 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah3, bl3) | 0) + (r6 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al3, bh3) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah3, bh3) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r6 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al3, bl4) | 0) + (r7 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah3, bl4) | 0) + (r7 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al3, bh4) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah3, bh4) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r7 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al3, bl5) | 0) + (r8 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah3, bl5) | 0) + (r8 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al3, bh5) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah3, bh5) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r8 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al3, bl6) | 0) + (r9 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah3, bl6) | 0) + (r9 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al3, bh6) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah3, bh6) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r9 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al3, bl7) | 0) + (r10 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah3, bl7) | 0) + (r10 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al3, bh7) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah3, bh7) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r10 = (w << 16) | (u & 0xffff);\r\n\r\n                        r11 = m;\r\n\r\n                        u = ((imul(al4, bl0) | 0) + (r4 & 0xffff) | 0) + (r12 & 0xffff) | 0;\r\n                        v = ((imul(ah4, bl0) | 0) + (r4 >>> 16) | 0) + (r12 >>> 16) | 0;\r\n                        w = ((imul(al4, bh0) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah4, bh0) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r4 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al4, bl1) | 0) + (r5 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah4, bl1) | 0) + (r5 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al4, bh1) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah4, bh1) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r5 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al4, bl2) | 0) + (r6 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah4, bl2) | 0) + (r6 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al4, bh2) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah4, bh2) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r6 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al4, bl3) | 0) + (r7 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah4, bl3) | 0) + (r7 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al4, bh3) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah4, bh3) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r7 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al4, bl4) | 0) + (r8 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah4, bl4) | 0) + (r8 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al4, bh4) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah4, bh4) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r8 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al4, bl5) | 0) + (r9 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah4, bl5) | 0) + (r9 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al4, bh5) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah4, bh5) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r9 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al4, bl6) | 0) + (r10 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah4, bl6) | 0) + (r10 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al4, bh6) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah4, bh6) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r10 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al4, bl7) | 0) + (r11 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah4, bl7) | 0) + (r11 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al4, bh7) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah4, bh7) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r11 = (w << 16) | (u & 0xffff);\r\n\r\n                        r12 = m;\r\n\r\n                        u = ((imul(al5, bl0) | 0) + (r5 & 0xffff) | 0) + (r13 & 0xffff) | 0;\r\n                        v = ((imul(ah5, bl0) | 0) + (r5 >>> 16) | 0) + (r13 >>> 16) | 0;\r\n                        w = ((imul(al5, bh0) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah5, bh0) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r5 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al5, bl1) | 0) + (r6 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah5, bl1) | 0) + (r6 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al5, bh1) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah5, bh1) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r6 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al5, bl2) | 0) + (r7 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah5, bl2) | 0) + (r7 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al5, bh2) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah5, bh2) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r7 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al5, bl3) | 0) + (r8 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah5, bl3) | 0) + (r8 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al5, bh3) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah5, bh3) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r8 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al5, bl4) | 0) + (r9 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah5, bl4) | 0) + (r9 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al5, bh4) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah5, bh4) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r9 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al5, bl5) | 0) + (r10 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah5, bl5) | 0) + (r10 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al5, bh5) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah5, bh5) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r10 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al5, bl6) | 0) + (r11 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah5, bl6) | 0) + (r11 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al5, bh6) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah5, bh6) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r11 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al5, bl7) | 0) + (r12 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah5, bl7) | 0) + (r12 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al5, bh7) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah5, bh7) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r12 = (w << 16) | (u & 0xffff);\r\n\r\n                        r13 = m;\r\n\r\n                        u = ((imul(al6, bl0) | 0) + (r6 & 0xffff) | 0) + (r14 & 0xffff) | 0;\r\n                        v = ((imul(ah6, bl0) | 0) + (r6 >>> 16) | 0) + (r14 >>> 16) | 0;\r\n                        w = ((imul(al6, bh0) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah6, bh0) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r6 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al6, bl1) | 0) + (r7 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah6, bl1) | 0) + (r7 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al6, bh1) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah6, bh1) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r7 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al6, bl2) | 0) + (r8 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah6, bl2) | 0) + (r8 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al6, bh2) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah6, bh2) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r8 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al6, bl3) | 0) + (r9 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah6, bl3) | 0) + (r9 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al6, bh3) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah6, bh3) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r9 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al6, bl4) | 0) + (r10 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah6, bl4) | 0) + (r10 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al6, bh4) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah6, bh4) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r10 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al6, bl5) | 0) + (r11 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah6, bl5) | 0) + (r11 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al6, bh5) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah6, bh5) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r11 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al6, bl6) | 0) + (r12 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah6, bl6) | 0) + (r12 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al6, bh6) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah6, bh6) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r12 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al6, bl7) | 0) + (r13 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah6, bl7) | 0) + (r13 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al6, bh7) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah6, bh7) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r13 = (w << 16) | (u & 0xffff);\r\n\r\n                        r14 = m;\r\n\r\n                        u = ((imul(al7, bl0) | 0) + (r7 & 0xffff) | 0) + (r15 & 0xffff) | 0;\r\n                        v = ((imul(ah7, bl0) | 0) + (r7 >>> 16) | 0) + (r15 >>> 16) | 0;\r\n                        w = ((imul(al7, bh0) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah7, bh0) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r7 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al7, bl1) | 0) + (r8 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah7, bl1) | 0) + (r8 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al7, bh1) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah7, bh1) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r8 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al7, bl2) | 0) + (r9 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah7, bl2) | 0) + (r9 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al7, bh2) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah7, bh2) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r9 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al7, bl3) | 0) + (r10 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah7, bl3) | 0) + (r10 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al7, bh3) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah7, bh3) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r10 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al7, bl4) | 0) + (r11 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah7, bl4) | 0) + (r11 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al7, bh4) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah7, bh4) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r11 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al7, bl5) | 0) + (r12 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah7, bl5) | 0) + (r12 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al7, bh5) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah7, bh5) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r12 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al7, bl6) | 0) + (r13 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah7, bl6) | 0) + (r13 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al7, bh6) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah7, bh6) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r13 = (w << 16) | (u & 0xffff);\r\n\r\n                        u = ((imul(al7, bl7) | 0) + (r14 & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                        v = ((imul(ah7, bl7) | 0) + (r14 >>> 16) | 0) + (m >>> 16) | 0;\r\n                        w = ((imul(al7, bh7) | 0) + (v & 0xffff) | 0) + (u >>> 16) | 0;\r\n                        m = ((imul(ah7, bh7) | 0) + (v >>> 16) | 0) + (w >>> 16) | 0;\r\n                        r14 = (w << 16) | (u & 0xffff);\r\n\r\n                        r15 = m;\r\n\r\n                        k = d + (i + j | 0) | 0;\r\n                        r = HEAP32[(Rk + k) >> 2] | 0;\r\n                        u = ((r & 0xffff) + ((r0 & 0xffff) << 1) | 0) + c | 0;\r\n                        w = ((r >>> 16) + ((r0 >>> 16) << 1) | 0) + (u >>> 16) | 0;\r\n                        HEAP32[(Rk + k) >> 2] = (w << 16) | (u & 0xffff);\r\n                        c = w >>> 16;\r\n\r\n                        k = k + 4 | 0;\r\n                        r = HEAP32[(Rk + k) >> 2] | 0;\r\n                        u = ((r & 0xffff) + ((r1 & 0xffff) << 1) | 0) + c | 0;\r\n                        w = ((r >>> 16) + ((r1 >>> 16) << 1) | 0) + (u >>> 16) | 0;\r\n                        HEAP32[(Rk + k) >> 2] = (w << 16) | (u & 0xffff);\r\n                        c = w >>> 16;\r\n\r\n                        k = k + 4 | 0;\r\n                        r = HEAP32[(Rk + k) >> 2] | 0;\r\n                        u = ((r & 0xffff) + ((r2 & 0xffff) << 1) | 0) + c | 0;\r\n                        w = ((r >>> 16) + ((r2 >>> 16) << 1) | 0) + (u >>> 16) | 0;\r\n                        HEAP32[(Rk + k) >> 2] = (w << 16) | (u & 0xffff);\r\n                        c = w >>> 16;\r\n\r\n                        k = k + 4 | 0;\r\n                        r = HEAP32[(Rk + k) >> 2] | 0;\r\n                        u = ((r & 0xffff) + ((r3 & 0xffff) << 1) | 0) + c | 0;\r\n                        w = ((r >>> 16) + ((r3 >>> 16) << 1) | 0) + (u >>> 16) | 0;\r\n                        HEAP32[(Rk + k) >> 2] = (w << 16) | (u & 0xffff);\r\n                        c = w >>> 16;\r\n\r\n                        k = k + 4 | 0;\r\n                        r = HEAP32[(Rk + k) >> 2] | 0;\r\n                        u = ((r & 0xffff) + ((r4 & 0xffff) << 1) | 0) + c | 0;\r\n                        w = ((r >>> 16) + ((r4 >>> 16) << 1) | 0) + (u >>> 16) | 0;\r\n                        HEAP32[(Rk + k) >> 2] = (w << 16) | (u & 0xffff);\r\n                        c = w >>> 16;\r\n\r\n                        k = k + 4 | 0;\r\n                        r = HEAP32[(Rk + k) >> 2] | 0;\r\n                        u = ((r & 0xffff) + ((r5 & 0xffff) << 1) | 0) + c | 0;\r\n                        w = ((r >>> 16) + ((r5 >>> 16) << 1) | 0) + (u >>> 16) | 0;\r\n                        HEAP32[(Rk + k) >> 2] = (w << 16) | (u & 0xffff);\r\n                        c = w >>> 16;\r\n\r\n                        k = k + 4 | 0;\r\n                        r = HEAP32[(Rk + k) >> 2] | 0;\r\n                        u = ((r & 0xffff) + ((r6 & 0xffff) << 1) | 0) + c | 0;\r\n                        w = ((r >>> 16) + ((r6 >>> 16) << 1) | 0) + (u >>> 16) | 0;\r\n                        HEAP32[(Rk + k) >> 2] = (w << 16) | (u & 0xffff);\r\n                        c = w >>> 16;\r\n\r\n                        k = k + 4 | 0;\r\n                        r = HEAP32[(Rk + k) >> 2] | 0;\r\n                        u = ((r & 0xffff) + ((r7 & 0xffff) << 1) | 0) + c | 0;\r\n                        w = ((r >>> 16) + ((r7 >>> 16) << 1) | 0) + (u >>> 16) | 0;\r\n                        HEAP32[(Rk + k) >> 2] = (w << 16) | (u & 0xffff);\r\n                        c = w >>> 16;\r\n                    }\r\n\r\n                    k = d + (i + j | 0) | 0;\r\n                    r = HEAP32[(Rk + k) >> 2] | 0;\r\n                    u = (((r & 0xffff) + ((r8 & 0xffff) << 1) | 0) + c | 0) + h | 0;\r\n                    w = ((r >>> 16) + ((r8 >>> 16) << 1) | 0) + (u >>> 16) | 0;\r\n                    HEAP32[(Rk + k) >> 2] = (w << 16) | (u & 0xffff);\r\n                    c = w >>> 16;\r\n\r\n                    k = k + 4 | 0;\r\n                    r = HEAP32[(Rk + k) >> 2] | 0;\r\n                    u = ((r & 0xffff) + ((r9 & 0xffff) << 1) | 0) + c | 0;\r\n                    w = ((r >>> 16) + ((r9 >>> 16) << 1) | 0) + (u >>> 16) | 0;\r\n                    HEAP32[(Rk + k) >> 2] = (w << 16) | (u & 0xffff);\r\n                    c = w >>> 16;\r\n\r\n                    k = k + 4 | 0;\r\n                    r = HEAP32[(Rk + k) >> 2] | 0;\r\n                    u = ((r & 0xffff) + ((r10 & 0xffff) << 1) | 0) + c | 0;\r\n                    w = ((r >>> 16) + ((r10 >>> 16) << 1) | 0) + (u >>> 16) | 0;\r\n                    HEAP32[(Rk + k) >> 2] = (w << 16) | (u & 0xffff);\r\n                    c = w >>> 16;\r\n\r\n                    k = k + 4 | 0;\r\n                    r = HEAP32[(Rk + k) >> 2] | 0;\r\n                    u = ((r & 0xffff) + ((r11 & 0xffff) << 1) | 0) + c | 0;\r\n                    w = ((r >>> 16) + ((r11 >>> 16) << 1) | 0) + (u >>> 16) | 0;\r\n                    HEAP32[(Rk + k) >> 2] = (w << 16) | (u & 0xffff);\r\n                    c = w >>> 16;\r\n\r\n                    k = k + 4 | 0;\r\n                    r = HEAP32[(Rk + k) >> 2] | 0;\r\n                    u = ((r & 0xffff) + ((r12 & 0xffff) << 1) | 0) + c | 0;\r\n                    w = ((r >>> 16) + ((r12 >>> 16) << 1) | 0) + (u >>> 16) | 0;\r\n                    HEAP32[(Rk + k) >> 2] = (w << 16) | (u & 0xffff);\r\n                    c = w >>> 16;\r\n\r\n                    k = k + 4 | 0;\r\n                    r = HEAP32[(Rk + k) >> 2] | 0;\r\n                    u = ((r & 0xffff) + ((r13 & 0xffff) << 1) | 0) + c | 0;\r\n                    w = ((r >>> 16) + ((r13 >>> 16) << 1) | 0) + (u >>> 16) | 0;\r\n                    HEAP32[(Rk + k) >> 2] = (w << 16) | (u & 0xffff);\r\n                    c = w >>> 16;\r\n\r\n                    k = k + 4 | 0;\r\n                    r = HEAP32[(Rk + k) >> 2] | 0;\r\n                    u = ((r & 0xffff) + ((r14 & 0xffff) << 1) | 0) + c | 0;\r\n                    w = ((r >>> 16) + ((r14 >>> 16) << 1) | 0) + (u >>> 16) | 0;\r\n                    HEAP32[(Rk + k) >> 2] = (w << 16) | (u & 0xffff);\r\n                    c = w >>> 16;\r\n\r\n                    k = k + 4 | 0;\r\n                    r = HEAP32[(Rk + k) >> 2] | 0;\r\n                    u = ((r & 0xffff) + ((r15 & 0xffff) << 1) | 0) + c | 0;\r\n                    w = ((r >>> 16) + ((r15 >>> 16) << 1) | 0) + (u >>> 16) | 0;\r\n                    HEAP32[(Rk + k) >> 2] = (w << 16) | (u & 0xffff);\r\n                    h = w >>> 16;\r\n                }\r\n\r\n                for (k = k + 4 | 0; !!h & ((k | 0) < (dd << 1)); k = (k + 4) | 0) { // carry propagation loop\r\n                    r = HEAP32[(Rk + k) >> 2] | 0;\r\n                    u = (r & 0xffff) + h | 0;\r\n                    w = (r >>> 16) + (u >>> 16) | 0;\r\n                    HEAP32[(Rk + k) >> 2] = (w << 16) | (u & 0xffff);\r\n                    h = w >>> 16;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Conventional division\r\n     *\r\n     * @param A offset of the numerator, 32-byte aligned\r\n     * @param lA length of the numerator, multiple of 32\r\n     *\r\n     * @param B offset of the divisor, 32-byte aligned\r\n     * @param lB length of the divisor, multiple of 32\r\n     *\r\n     * @param R offset where to place the remainder to, 32-byte aligned\r\n     *\r\n     * @param Q offser where to place the quotient to, 32-byte aligned\r\n     */\r\n\r\n    function div(N, lN, D, lD, Q) {\r\n        N = N | 0;\r\n        lN = lN | 0;\r\n        D = D | 0;\r\n        lD = lD | 0;\r\n        Q = Q | 0;\r\n\r\n        var n = 0, d = 0, e = 0,\r\n            u1 = 0, u0 = 0,\r\n            v0 = 0, vh = 0, vl = 0,\r\n            qh = 0, ql = 0, rh = 0, rl = 0,\r\n            t1 = 0, t2 = 0, m = 0, c = 0,\r\n            i = 0, j = 0, k = 0;\r\n\r\n        // number of significant limbs in `N` (multiplied by 4)\r\n        for (i = (lN - 1) & -4; (i | 0) >= 0; i = (i - 4) | 0) {\r\n            n = HEAP32[(N + i) >> 2] | 0;\r\n            if (n) {\r\n                lN = i;\r\n                break;\r\n            }\r\n        }\r\n\r\n        // number of significant limbs in `D` (multiplied by 4)\r\n        for (i = (lD - 1) & -4; (i | 0) >= 0; i = (i - 4) | 0) {\r\n            d = HEAP32[(D + i) >> 2] | 0;\r\n            if (d) {\r\n                lD = i;\r\n                break;\r\n            }\r\n        }\r\n\r\n        // `D` is zero? WTF?!\r\n\r\n        // calculate `e` \u2014 the power of 2 of the normalization factor\r\n        while ((d & 0x80000000) == 0) {\r\n            d = d << 1;\r\n            e = e + 1 | 0;\r\n        }\r\n\r\n        // normalize `N` in place\r\n        u0 = HEAP32[(N + lN) >> 2] | 0;\r\n        if (e) {\r\n            u1 = u0 >>> (32 - e | 0);\r\n            for (i = (lN - 4) | 0; (i | 0) >= 0; i = (i - 4) | 0) {\r\n                n = HEAP32[(N + i) >> 2] | 0;\r\n                HEAP32[(N + i + 4) >> 2] = (u0 << e) | (e ? n >>> (32 - e | 0) : 0);\r\n                u0 = n;\r\n            }\r\n            HEAP32[N >> 2] = u0 << e;\r\n        }\r\n\r\n        // normalize `D` in place\r\n        if (e) {\r\n            v0 = HEAP32[(D + lD) >> 2] | 0;\r\n            for (i = (lD - 4) | 0; (i | 0) >= 0; i = (i - 4) | 0) {\r\n                d = HEAP32[(D + i) >> 2] | 0;\r\n                HEAP32[(D + i + 4) >> 2] = (v0 << e) | (d >>> (32 - e | 0));\r\n                v0 = d;\r\n            }\r\n            HEAP32[D >> 2] = v0 << e;\r\n        }\r\n\r\n        // divisor parts won't change\r\n        v0 = HEAP32[(D + lD) >> 2] | 0;\r\n        vh = v0 >>> 16, vl = v0 & 0xffff;\r\n\r\n        // perform division\r\n        for (i = lN; (i | 0) >= (lD | 0); i = (i - 4) | 0) {\r\n            j = (i - lD) | 0;\r\n\r\n            // estimate high part of the quotient\r\n            u0 = HEAP32[(N + i) >> 2] | 0;\r\n            qh = ((u1 >>> 0) / (vh >>> 0)) | 0, rh = ((u1 >>> 0) % (vh >>> 0)) | 0, t1 = imul(qh, vl) | 0;\r\n            while (((qh | 0) == 0x10000) | ((t1 >>> 0) > (((rh << 16) | (u0 >>> 16)) >>> 0))) {\r\n                qh = (qh - 1) | 0, rh = (rh + vh) | 0, t1 = (t1 - vl) | 0;\r\n                if ((rh | 0) >= 0x10000) break;\r\n            }\r\n\r\n            // bulk multiply-and-subtract\r\n            // m - multiplication carry, c - subtraction carry\r\n            m = 0, c = 0;\r\n            for (k = 0; (k | 0) <= (lD | 0); k = (k + 4) | 0) {\r\n                d = HEAP32[(D + k) >> 2] | 0;\r\n                t1 = (imul(qh, d & 0xffff) | 0) + (m >>> 16) | 0;\r\n                t2 = (imul(qh, d >>> 16) | 0) + (t1 >>> 16) | 0;\r\n                d = (m & 0xffff) | (t1 << 16);\r\n                m = t2;\r\n                n = HEAP32[(N + j + k) >> 2] | 0;\r\n                t1 = ((n & 0xffff) - (d & 0xffff) | 0) + c | 0;\r\n                t2 = ((n >>> 16) - (d >>> 16) | 0) + (t1 >> 16) | 0;\r\n                HEAP32[(N + j + k) >> 2] = (t2 << 16) | (t1 & 0xffff);\r\n                c = t2 >> 16;\r\n            }\r\n            t1 = ((u1 & 0xffff) - (m & 0xffff) | 0) + c | 0;\r\n            t2 = ((u1 >>> 16) - (m >>> 16) | 0) + (t1 >> 16) | 0;\r\n            u1 = (t2 << 16) | (t1 & 0xffff);\r\n            c = t2 >> 16;\r\n\r\n            // add `D` back if got carry-out\r\n            if (c) {\r\n                qh = (qh - 1) | 0;\r\n                c = 0;\r\n                for (k = 0; (k | 0) <= (lD | 0); k = (k + 4) | 0) {\r\n                    d = HEAP32[(D + k) >> 2] | 0;\r\n                    n = HEAP32[(N + j + k) >> 2] | 0;\r\n                    t1 = (n & 0xffff) + c | 0;\r\n                    t2 = (n >>> 16) + d + (t1 >>> 16) | 0;\r\n                    HEAP32[(N + j + k) >> 2] = (t2 << 16) | (t1 & 0xffff);\r\n                    c = t2 >>> 16;\r\n                }\r\n                u1 = (u1 + c) | 0;\r\n            }\r\n\r\n            // estimate low part of the quotient\r\n            u0 = HEAP32[(N + i) >> 2] | 0;\r\n            n = (u1 << 16) | (u0 >>> 16);\r\n            ql = ((n >>> 0) / (vh >>> 0)) | 0, rl = ((n >>> 0) % (vh >>> 0)) | 0, t1 = imul(ql, vl) | 0;\r\n            while (((ql | 0) == 0x10000) | ((t1 >>> 0) > (((rl << 16) | (u0 & 0xffff)) >>> 0))) {\r\n                ql = (ql - 1) | 0, rl = (rl + vh) | 0, t1 = (t1 - vl) | 0;\r\n                if ((rl | 0) >= 0x10000) break;\r\n            }\r\n\r\n            // bulk multiply-and-subtract\r\n            // m - multiplication carry, c - subtraction carry\r\n            m = 0, c = 0;\r\n            for (k = 0; (k | 0) <= (lD | 0); k = (k + 4) | 0) {\r\n                d = HEAP32[(D + k) >> 2] | 0;\r\n                t1 = (imul(ql, d & 0xffff) | 0) + (m & 0xffff) | 0;\r\n                t2 = ((imul(ql, d >>> 16) | 0) + (t1 >>> 16) | 0) + (m >>> 16) | 0;\r\n                d = (t1 & 0xffff) | (t2 << 16);\r\n                m = t2 >>> 16;\r\n                n = HEAP32[(N + j + k) >> 2] | 0;\r\n                t1 = ((n & 0xffff) - (d & 0xffff) | 0) + c | 0;\r\n                t2 = ((n >>> 16) - (d >>> 16) | 0) + (t1 >> 16) | 0;\r\n                c = t2 >> 16;\r\n                HEAP32[(N + j + k) >> 2] = (t2 << 16) | (t1 & 0xffff);\r\n            }\r\n            t1 = ((u1 & 0xffff) - (m & 0xffff) | 0) + c | 0;\r\n            t2 = ((u1 >>> 16) - (m >>> 16) | 0) + (t1 >> 16) | 0;\r\n            c = t2 >> 16;\r\n\r\n            // add `D` back if got carry-out\r\n            if (c) {\r\n                ql = (ql - 1) | 0;\r\n                c = 0;\r\n                for (k = 0; (k | 0) <= (lD | 0); k = (k + 4) | 0) {\r\n                    d = HEAP32[(D + k) >> 2] | 0;\r\n                    n = HEAP32[(N + j + k) >> 2] | 0;\r\n                    t1 = ((n & 0xffff) + (d & 0xffff) | 0) + c | 0;\r\n                    t2 = ((n >>> 16) + (d >>> 16) | 0) + (t1 >>> 16) | 0;\r\n                    c = t2 >>> 16;\r\n                    HEAP32[(N + j + k) >> 2] = (t1 & 0xffff) | (t2 << 16);\r\n                }\r\n            }\r\n\r\n            // got quotient limb\r\n            HEAP32[(Q + j) >> 2] = (qh << 16) | ql;\r\n\r\n            u1 = HEAP32[(N + i) >> 2] | 0;\r\n        }\r\n\r\n        if (e) {\r\n            // TODO denormalize `D` in place\r\n\r\n            // denormalize `N` in place\r\n            u0 = HEAP32[N >> 2] | 0;\r\n            for (i = 4; (i | 0) <= (lD | 0); i = (i + 4) | 0) {\r\n                n = HEAP32[(N + i) >> 2] | 0;\r\n                HEAP32[(N + i - 4) >> 2] = (n << (32 - e | 0)) | (u0 >>> e);\r\n                u0 = n;\r\n            }\r\n            HEAP32[(N + lD) >> 2] = u0 >>> e;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Montgomery modular reduction\r\n     *\r\n     * Definition:\r\n     *\r\n     *  MREDC(A) = A \u00D7 X (mod N),\r\n     *  M \u00D7 X = N \u00D7 Y + 1,\r\n     *\r\n     * where M = 2^(32*m) such that N < M and A < N\u00D7M\r\n     *\r\n     * Numbers `X` and `Y` can be calculated using Extended Euclidean Algorithm.\r\n     */\r\n    function mredc(A, lA, N, lN, y, R) {\r\n        A = A | 0;\r\n        lA = lA | 0;\r\n        N = N | 0;\r\n        lN = lN | 0;\r\n        y = y | 0;\r\n        R = R | 0;\r\n\r\n        var T = 0,\r\n            c = 0, uh = 0, ul = 0, vl = 0, vh = 0, w0 = 0, w1 = 0, w2 = 0, r0 = 0, r1 = 0,\r\n            i = 0, j = 0, k = 0;\r\n\r\n        T = salloc(lN << 1) | 0;\r\n        z(lN << 1, 0, T);\r\n\r\n        cp(lA, A, T);\r\n\r\n        // HAC 14.32\r\n        for (i = 0; (i | 0) < (lN | 0); i = (i + 4) | 0) {\r\n            uh = HEAP32[(T + i) >> 2] | 0, ul = uh & 0xffff, uh = uh >>> 16;\r\n            vh = y >>> 16, vl = y & 0xffff;\r\n            w0 = imul(ul, vl) | 0, w1 = ((imul(ul, vh) | 0) + (imul(uh, vl) | 0) | 0) + (w0 >>> 16) | 0;\r\n            ul = w0 & 0xffff, uh = w1 & 0xffff;\r\n            r1 = 0;\r\n            for (j = 0; (j | 0) < (lN | 0); j = (j + 4) | 0) {\r\n                k = (i + j) | 0;\r\n                vh = HEAP32[(N + j) >> 2] | 0, vl = vh & 0xffff, vh = vh >>> 16;\r\n                r0 = HEAP32[(T + k) >> 2] | 0;\r\n                w0 = ((imul(ul, vl) | 0) + (r1 & 0xffff) | 0) + (r0 & 0xffff) | 0;\r\n                w1 = ((imul(ul, vh) | 0) + (r1 >>> 16) | 0) + (r0 >>> 16) | 0;\r\n                w2 = ((imul(uh, vl) | 0) + (w1 & 0xffff) | 0) + (w0 >>> 16) | 0;\r\n                r1 = ((imul(uh, vh) | 0) + (w2 >>> 16) | 0) + (w1 >>> 16) | 0;\r\n                r0 = (w2 << 16) | (w0 & 0xffff);\r\n                HEAP32[(T + k) >> 2] = r0;\r\n            }\r\n            k = (i + j) | 0;\r\n            r0 = HEAP32[(T + k) >> 2] | 0;\r\n            w0 = ((r0 & 0xffff) + (r1 & 0xffff) | 0) + c | 0;\r\n            w1 = ((r0 >>> 16) + (r1 >>> 16) | 0) + (w0 >>> 16) | 0;\r\n            HEAP32[(T + k) >> 2] = (w1 << 16) | (w0 & 0xffff);\r\n            c = w1 >>> 16;\r\n        }\r\n\r\n        cp(lN, (T + lN) | 0, R);\r\n\r\n        sfree(lN << 1);\r\n\r\n        if (c | ((cmp(N, lN, R, lN) | 0) <= 0)) {\r\n            sub(R, lN, N, lN, R, lN) | 0;\r\n        }\r\n    }\r\n\r\n    return {\r\n        sreset: sreset,\r\n        salloc: salloc,\r\n        sfree: sfree,\r\n        z: z,\r\n        tst: tst,\r\n        neg: neg,\r\n        cmp: cmp,\r\n        add: add,\r\n        sub: sub,\r\n        mul: mul,\r\n        sqr: sqr,\r\n        div: div,\r\n        mredc: mredc\r\n    };\r\n};\r\n\r\nfunction Number_extGCD(a, b) {\r\n    var sa = a < 0 ? -1 : 1, sb = b < 0 ? -1 : 1, xi = 1, xj = 0, yi = 0, yj = 1, r, q, t, a_cmp_b;\r\n    a *= sa;\r\n    b *= sb;\r\n    a_cmp_b = a < b;\r\n    if (a_cmp_b) {\r\n        t = a;\r\n        (a = b), (b = t);\r\n        t = sa;\r\n        sa = sb;\r\n        sb = t;\r\n    }\r\n    (q = Math.floor(a / b)), (r = a - q * b);\r\n    while (r) {\r\n        (t = xi - q * xj), (xi = xj), (xj = t);\r\n        (t = yi - q * yj), (yi = yj), (yj = t);\r\n        (a = b), (b = r);\r\n        (q = Math.floor(a / b)), (r = a - q * b);\r\n    }\r\n    xj *= sa;\r\n    yj *= sb;\r\n    if (a_cmp_b) {\r\n        t = xj;\r\n        (xj = yj), (yj = t);\r\n    }\r\n    return {\r\n        gcd: b,\r\n        x: xj,\r\n        y: yj,\r\n    };\r\n}\r\nfunction BigNumber_extGCD(a, b) {\r\n    var sa = a.sign;\r\n    var sb = b.sign;\r\n    if (sa < 0)\r\n        a = a.negate();\r\n    if (sb < 0)\r\n        b = b.negate();\r\n    var a_cmp_b = a.compare(b);\r\n    if (a_cmp_b < 0) {\r\n        var t = a;\r\n        (a = b), (b = t);\r\n        var t2 = sa;\r\n        sa = sb;\r\n        sb = t2;\r\n    }\r\n    var xi = BigNumber.ONE, xj = BigNumber.ZERO, lx = b.bitLength, yi = BigNumber.ZERO, yj = BigNumber.ONE, ly = a.bitLength, z, r, q;\r\n    z = a.divide(b);\r\n    while ((r = z.remainder) !== BigNumber.ZERO) {\r\n        q = z.quotient;\r\n        (z = xi.subtract(q.multiply(xj).clamp(lx)).clamp(lx)), (xi = xj), (xj = z);\r\n        (z = yi.subtract(q.multiply(yj).clamp(ly)).clamp(ly)), (yi = yj), (yj = z);\r\n        (a = b), (b = r);\r\n        z = a.divide(b);\r\n    }\r\n    if (sa < 0)\r\n        xj = xj.negate();\r\n    if (sb < 0)\r\n        yj = yj.negate();\r\n    if (a_cmp_b < 0) {\r\n        var t = xj;\r\n        (xj = yj), (yj = t);\r\n    }\r\n    return {\r\n        gcd: b,\r\n        x: xj,\r\n        y: yj,\r\n    };\r\n}\r\n\r\nfunction getRandomValues(buf) {\r\n    if (typeof process !== 'undefined' && typeof require === 'function') {\r\n        try {\r\n            var bytes = randomBytes(buf.length);\r\n            buf.set(bytes);\r\n            return;\r\n        } catch (e) {\r\n            // Fall through to browser methods\r\n        }\r\n    }\r\n    if (typeof window !== 'undefined' && window.crypto && window.crypto.getRandomValues) {\r\n        window.crypto.getRandomValues(buf);\r\n        return;\r\n    }\r\n    if (typeof self !== 'undefined' && self.crypto && self.crypto.getRandomValues) {\r\n        self.crypto.getRandomValues(buf);\r\n        return;\r\n    }\r\n    if (typeof globalThis !== 'undefined' && globalThis.crypto && globalThis.crypto.getRandomValues) {\r\n        globalThis.crypto.getRandomValues(buf);\r\n        return;\r\n    }\r\n    // @ts-ignore\r\n    if (typeof window !== 'undefined' && window.msCrypto && window.msCrypto.getRandomValues) {\r\n        // @ts-ignore\r\n        window.msCrypto.getRandomValues(buf);\r\n        return;\r\n    }\r\n    throw new Error('No secure random number generator available.');\r\n}\r\n\r\nvar __extends$1 = (undefined && undefined.__extends) || (function () {\r\n    var extendStatics = function (d, b) {\r\n        extendStatics = Object.setPrototypeOf ||\r\n            ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n            function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n        return extendStatics(d, b);\r\n    };\r\n    return function (d, b) {\r\n        extendStatics(d, b);\r\n        function __() { this.constructor = d; }\r\n        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n    };\r\n})();\r\n///////////////////////////////////////////////////////////////////////////////\r\nvar _bigint_stdlib = { Uint32Array: Uint32Array, Math: Math };\r\nvar _bigint_heap = new Uint32Array(0x100000);\r\nvar _bigint_asm;\r\nfunction _half_imul(a, b) {\r\n    return (a * b) | 0;\r\n}\r\nif (_bigint_stdlib.Math.imul === undefined) {\r\n    _bigint_stdlib.Math.imul = _half_imul;\r\n    _bigint_asm = bigint_asm(_bigint_stdlib, null, _bigint_heap.buffer);\r\n    delete _bigint_stdlib.Math.imul;\r\n}\r\nelse {\r\n    _bigint_asm = bigint_asm(_bigint_stdlib, null, _bigint_heap.buffer);\r\n}\r\n///////////////////////////////////////////////////////////////////////////////\r\nvar _BigNumber_ZERO_limbs = new Uint32Array(0);\r\nvar BigNumber = /** @class */ (function () {\r\n    function BigNumber(num) {\r\n        var limbs = _BigNumber_ZERO_limbs;\r\n        var bitlen = 0;\r\n        var sign = 0;\r\n        if (num === undefined);\r\n        else {\r\n            for (var i = 0; !num[i]; i++)\r\n                ;\r\n            bitlen = (num.length - i) * 8;\r\n            if (!bitlen)\r\n                return BigNumber.ZERO;\r\n            limbs = new Uint32Array((bitlen + 31) >> 5);\r\n            for (var j = num.length - 4; j >= i; j -= 4) {\r\n                limbs[(num.length - 4 - j) >> 2] = (num[j] << 24) | (num[j + 1] << 16) | (num[j + 2] << 8) | num[j + 3];\r\n            }\r\n            if (i - j === 3) {\r\n                limbs[limbs.length - 1] = num[i];\r\n            }\r\n            else if (i - j === 2) {\r\n                limbs[limbs.length - 1] = (num[i] << 8) | num[i + 1];\r\n            }\r\n            else if (i - j === 1) {\r\n                limbs[limbs.length - 1] = (num[i] << 16) | (num[i + 1] << 8) | num[i + 2];\r\n            }\r\n            sign = 1;\r\n        }\r\n        this.limbs = limbs;\r\n        this.bitLength = bitlen;\r\n        this.sign = sign;\r\n    }\r\n    BigNumber.fromString = function (str) {\r\n        var bytes = string_to_bytes(str);\r\n        return new BigNumber(bytes);\r\n    };\r\n    BigNumber.fromNumber = function (num) {\r\n        var limbs = _BigNumber_ZERO_limbs;\r\n        var bitlen = 0;\r\n        var sign = 0;\r\n        var absnum = Math.abs(num);\r\n        if (absnum > 0xffffffff) {\r\n            limbs = new Uint32Array(2);\r\n            limbs[0] = absnum | 0;\r\n            limbs[1] = (absnum / 0x100000000) | 0;\r\n            bitlen = 52;\r\n        }\r\n        else if (absnum > 0) {\r\n            limbs = new Uint32Array(1);\r\n            limbs[0] = absnum;\r\n            bitlen = 32;\r\n        }\r\n        else {\r\n            limbs = _BigNumber_ZERO_limbs;\r\n            bitlen = 0;\r\n        }\r\n        sign = num < 0 ? -1 : 1;\r\n        return BigNumber.fromConfig({ limbs: limbs, bitLength: bitlen, sign: sign });\r\n    };\r\n    BigNumber.fromArrayBuffer = function (buffer) {\r\n        return new BigNumber(new Uint8Array(buffer));\r\n    };\r\n    BigNumber.fromConfig = function (obj) {\r\n        var bn = new BigNumber();\r\n        bn.limbs = new Uint32Array(obj.limbs);\r\n        bn.bitLength = obj.bitLength;\r\n        bn.sign = obj.sign;\r\n        return bn;\r\n    };\r\n    BigNumber.prototype.toString = function (radix) {\r\n        radix = radix || 16;\r\n        var limbs = this.limbs;\r\n        var bitlen = this.bitLength;\r\n        var str = '';\r\n        if (radix === 16) {\r\n            // FIXME clamp last limb to (bitlen % 32)\r\n            for (var i = ((bitlen + 31) >> 5) - 1; i >= 0; i--) {\r\n                var h = limbs[i].toString(16);\r\n                str += '00000000'.substr(h.length);\r\n                str += h;\r\n            }\r\n            str = str.replace(/^0+/, '');\r\n            if (!str.length)\r\n                str = '0';\r\n        }\r\n        else {\r\n            throw new IllegalArgumentError('bad radix');\r\n        }\r\n        if (this.sign < 0)\r\n            str = '-' + str;\r\n        return str;\r\n    };\r\n    BigNumber.prototype.toBytes = function () {\r\n        var bitlen = this.bitLength;\r\n        var limbs = this.limbs;\r\n        if (bitlen === 0)\r\n            return new Uint8Array(0);\r\n        var bytelen = (bitlen + 7) >> 3;\r\n        var bytes = new Uint8Array(bytelen);\r\n        for (var i = 0; i < bytelen; i++) {\r\n            var j = bytelen - i - 1;\r\n            bytes[i] = limbs[j >> 2] >> ((j & 3) << 3);\r\n        }\r\n        return bytes;\r\n    };\r\n    /**\r\n     * Downgrade to Number\r\n     */\r\n    BigNumber.prototype.valueOf = function () {\r\n        var limbs = this.limbs;\r\n        var bits = this.bitLength;\r\n        var sign = this.sign;\r\n        if (!sign)\r\n            return 0;\r\n        if (bits <= 32)\r\n            return sign * (limbs[0] >>> 0);\r\n        if (bits <= 52)\r\n            return sign * (0x100000000 * (limbs[1] >>> 0) + (limbs[0] >>> 0));\r\n        // normalization\r\n        var i, l, e = 0;\r\n        for (i = limbs.length - 1; i >= 0; i--) {\r\n            if ((l = limbs[i]) === 0)\r\n                continue;\r\n            while (((l << e) & 0x80000000) === 0)\r\n                e++;\r\n            break;\r\n        }\r\n        if (i === 0)\r\n            return sign * (limbs[0] >>> 0);\r\n        return (sign *\r\n            (0x100000 * (((limbs[i] << e) | (e ? limbs[i - 1] >>> (32 - e) : 0)) >>> 0) +\r\n                (((limbs[i - 1] << e) | (e && i > 1 ? limbs[i - 2] >>> (32 - e) : 0)) >>> 12)) *\r\n            Math.pow(2, 32 * i - e - 52));\r\n    };\r\n    BigNumber.prototype.clamp = function (b) {\r\n        var limbs = this.limbs;\r\n        var bitlen = this.bitLength;\r\n        // FIXME check b is number and in a valid range\r\n        if (b >= bitlen)\r\n            return this;\r\n        var clamped = new BigNumber();\r\n        var n = (b + 31) >> 5;\r\n        var k = b % 32;\r\n        clamped.limbs = new Uint32Array(limbs.subarray(0, n));\r\n        clamped.bitLength = b;\r\n        clamped.sign = this.sign;\r\n        if (k)\r\n            clamped.limbs[n - 1] &= -1 >>> (32 - k);\r\n        return clamped;\r\n    };\r\n    BigNumber.prototype.slice = function (f, b) {\r\n        var limbs = this.limbs;\r\n        var bitlen = this.bitLength;\r\n        if (f < 0)\r\n            throw new RangeError('TODO');\r\n        if (f >= bitlen)\r\n            return BigNumber.ZERO;\r\n        if (b === undefined || b > bitlen - f)\r\n            b = bitlen - f;\r\n        var sliced = new BigNumber();\r\n        var n = f >> 5;\r\n        var m = (f + b + 31) >> 5;\r\n        var l = (b + 31) >> 5;\r\n        var t = f % 32;\r\n        var k = b % 32;\r\n        var slimbs = new Uint32Array(l);\r\n        if (t) {\r\n            for (var i = 0; i < m - n - 1; i++) {\r\n                slimbs[i] = (limbs[n + i] >>> t) | (limbs[n + i + 1] << (32 - t));\r\n            }\r\n            slimbs[i] = limbs[n + i] >>> t;\r\n        }\r\n        else {\r\n            slimbs.set(limbs.subarray(n, m));\r\n        }\r\n        if (k) {\r\n            slimbs[l - 1] &= -1 >>> (32 - k);\r\n        }\r\n        sliced.limbs = slimbs;\r\n        sliced.bitLength = b;\r\n        sliced.sign = this.sign;\r\n        return sliced;\r\n    };\r\n    BigNumber.prototype.negate = function () {\r\n        var negative = new BigNumber();\r\n        negative.limbs = this.limbs;\r\n        negative.bitLength = this.bitLength;\r\n        negative.sign = -1 * this.sign;\r\n        return negative;\r\n    };\r\n    BigNumber.prototype.compare = function (that) {\r\n        var alimbs = this.limbs, alimbcnt = alimbs.length, blimbs = that.limbs, blimbcnt = blimbs.length, z = 0;\r\n        if (this.sign < that.sign)\r\n            return -1;\r\n        if (this.sign > that.sign)\r\n            return 1;\r\n        _bigint_heap.set(alimbs, 0);\r\n        _bigint_heap.set(blimbs, alimbcnt);\r\n        z = _bigint_asm.cmp(0, alimbcnt << 2, alimbcnt << 2, blimbcnt << 2);\r\n        return z * this.sign;\r\n    };\r\n    BigNumber.prototype.add = function (that) {\r\n        if (!this.sign)\r\n            return that;\r\n        if (!that.sign)\r\n            return this;\r\n        var abitlen = this.bitLength, alimbs = this.limbs, alimbcnt = alimbs.length, asign = this.sign, bbitlen = that.bitLength, blimbs = that.limbs, blimbcnt = blimbs.length, bsign = that.sign, rbitlen, rlimbcnt, rsign, rof, result = new BigNumber();\r\n        rbitlen = (abitlen > bbitlen ? abitlen : bbitlen) + (asign * bsign > 0 ? 1 : 0);\r\n        rlimbcnt = (rbitlen + 31) >> 5;\r\n        _bigint_asm.sreset();\r\n        var pA = _bigint_asm.salloc(alimbcnt << 2), pB = _bigint_asm.salloc(blimbcnt << 2), pR = _bigint_asm.salloc(rlimbcnt << 2);\r\n        _bigint_asm.z(pR - pA + (rlimbcnt << 2), 0, pA);\r\n        _bigint_heap.set(alimbs, pA >> 2);\r\n        _bigint_heap.set(blimbs, pB >> 2);\r\n        if (asign * bsign > 0) {\r\n            _bigint_asm.add(pA, alimbcnt << 2, pB, blimbcnt << 2, pR, rlimbcnt << 2);\r\n            rsign = asign;\r\n        }\r\n        else if (asign > bsign) {\r\n            rof = _bigint_asm.sub(pA, alimbcnt << 2, pB, blimbcnt << 2, pR, rlimbcnt << 2);\r\n            rsign = rof ? bsign : asign;\r\n        }\r\n        else {\r\n            rof = _bigint_asm.sub(pB, blimbcnt << 2, pA, alimbcnt << 2, pR, rlimbcnt << 2);\r\n            rsign = rof ? asign : bsign;\r\n        }\r\n        if (rof)\r\n            _bigint_asm.neg(pR, rlimbcnt << 2, pR, rlimbcnt << 2);\r\n        if (_bigint_asm.tst(pR, rlimbcnt << 2) === 0)\r\n            return BigNumber.ZERO;\r\n        result.limbs = new Uint32Array(_bigint_heap.subarray(pR >> 2, (pR >> 2) + rlimbcnt));\r\n        result.bitLength = rbitlen;\r\n        result.sign = rsign;\r\n        return result;\r\n    };\r\n    BigNumber.prototype.subtract = function (that) {\r\n        return this.add(that.negate());\r\n    };\r\n    BigNumber.prototype.square = function () {\r\n        if (!this.sign)\r\n            return BigNumber.ZERO;\r\n        var abitlen = this.bitLength, alimbs = this.limbs, alimbcnt = alimbs.length, rbitlen, rlimbcnt, result = new BigNumber();\r\n        rbitlen = abitlen << 1;\r\n        rlimbcnt = (rbitlen + 31) >> 5;\r\n        _bigint_asm.sreset();\r\n        var pA = _bigint_asm.salloc(alimbcnt << 2), pR = _bigint_asm.salloc(rlimbcnt << 2);\r\n        _bigint_asm.z(pR - pA + (rlimbcnt << 2), 0, pA);\r\n        _bigint_heap.set(alimbs, pA >> 2);\r\n        _bigint_asm.sqr(pA, alimbcnt << 2, pR);\r\n        result.limbs = new Uint32Array(_bigint_heap.subarray(pR >> 2, (pR >> 2) + rlimbcnt));\r\n        result.bitLength = rbitlen;\r\n        result.sign = 1;\r\n        return result;\r\n    };\r\n    BigNumber.prototype.divide = function (that) {\r\n        var abitlen = this.bitLength, alimbs = this.limbs, alimbcnt = alimbs.length, bbitlen = that.bitLength, blimbs = that.limbs, blimbcnt = blimbs.length, qlimbcnt, rlimbcnt, quotient = BigNumber.ZERO, remainder = BigNumber.ZERO;\r\n        _bigint_asm.sreset();\r\n        var pA = _bigint_asm.salloc(alimbcnt << 2), pB = _bigint_asm.salloc(blimbcnt << 2), pQ = _bigint_asm.salloc(alimbcnt << 2);\r\n        _bigint_asm.z(pQ - pA + (alimbcnt << 2), 0, pA);\r\n        _bigint_heap.set(alimbs, pA >> 2);\r\n        _bigint_heap.set(blimbs, pB >> 2);\r\n        _bigint_asm.div(pA, alimbcnt << 2, pB, blimbcnt << 2, pQ);\r\n        qlimbcnt = _bigint_asm.tst(pQ, alimbcnt << 2) >> 2;\r\n        if (qlimbcnt) {\r\n            quotient = new BigNumber();\r\n            quotient.limbs = new Uint32Array(_bigint_heap.subarray(pQ >> 2, (pQ >> 2) + qlimbcnt));\r\n            quotient.bitLength = abitlen < qlimbcnt << 5 ? abitlen : qlimbcnt << 5;\r\n            quotient.sign = this.sign * that.sign;\r\n        }\r\n        rlimbcnt = _bigint_asm.tst(pA, blimbcnt << 2) >> 2;\r\n        if (rlimbcnt) {\r\n            remainder = new BigNumber();\r\n            remainder.limbs = new Uint32Array(_bigint_heap.subarray(pA >> 2, (pA >> 2) + rlimbcnt));\r\n            remainder.bitLength = bbitlen < rlimbcnt << 5 ? bbitlen : rlimbcnt << 5;\r\n            remainder.sign = this.sign;\r\n        }\r\n        return {\r\n            quotient: quotient,\r\n            remainder: remainder,\r\n        };\r\n    };\r\n    BigNumber.prototype.multiply = function (that) {\r\n        if (!this.sign || !that.sign)\r\n            return BigNumber.ZERO;\r\n        var abitlen = this.bitLength, alimbs = this.limbs, alimbcnt = alimbs.length, bbitlen = that.bitLength, blimbs = that.limbs, blimbcnt = blimbs.length, rbitlen, rlimbcnt, result = new BigNumber();\r\n        rbitlen = abitlen + bbitlen;\r\n        rlimbcnt = (rbitlen + 31) >> 5;\r\n        _bigint_asm.sreset();\r\n        var pA = _bigint_asm.salloc(alimbcnt << 2), pB = _bigint_asm.salloc(blimbcnt << 2), pR = _bigint_asm.salloc(rlimbcnt << 2);\r\n        _bigint_asm.z(pR - pA + (rlimbcnt << 2), 0, pA);\r\n        _bigint_heap.set(alimbs, pA >> 2);\r\n        _bigint_heap.set(blimbs, pB >> 2);\r\n        _bigint_asm.mul(pA, alimbcnt << 2, pB, blimbcnt << 2, pR, rlimbcnt << 2);\r\n        result.limbs = new Uint32Array(_bigint_heap.subarray(pR >> 2, (pR >> 2) + rlimbcnt));\r\n        result.sign = this.sign * that.sign;\r\n        result.bitLength = rbitlen;\r\n        return result;\r\n    };\r\n    BigNumber.prototype.isMillerRabinProbablePrime = function (rounds) {\r\n        var t = BigNumber.fromConfig(this), s = 0;\r\n        t.limbs[0] -= 1;\r\n        while (t.limbs[s >> 5] === 0)\r\n            s += 32;\r\n        while (((t.limbs[s >> 5] >> (s & 31)) & 1) === 0)\r\n            s++;\r\n        t = t.slice(s);\r\n        var m = new Modulus(this), m1 = this.subtract(BigNumber.ONE), a = BigNumber.fromConfig(this), l = this.limbs.length - 1;\r\n        while (a.limbs[l] === 0)\r\n            l--;\r\n        while (--rounds >= 0) {\r\n            getRandomValues(a.limbs);\r\n            if (a.limbs[0] < 2)\r\n                a.limbs[0] += 2;\r\n            while (a.compare(m1) >= 0)\r\n                a.limbs[l] >>>= 1;\r\n            var x = m.power(a, t);\r\n            if (x.compare(BigNumber.ONE) === 0)\r\n                continue;\r\n            if (x.compare(m1) === 0)\r\n                continue;\r\n            var c = s;\r\n            while (--c > 0) {\r\n                x = x.square().divide(m).remainder;\r\n                if (x.compare(BigNumber.ONE) === 0)\r\n                    return false;\r\n                if (x.compare(m1) === 0)\r\n                    break;\r\n            }\r\n            if (c === 0)\r\n                return false;\r\n        }\r\n        return true;\r\n    };\r\n    BigNumber.prototype.isProbablePrime = function (paranoia) {\r\n        if (paranoia === void 0) { paranoia = 80; }\r\n        var limbs = this.limbs;\r\n        var i = 0;\r\n        // Oddity test\r\n        // (50% false positive probability)\r\n        if ((limbs[0] & 1) === 0)\r\n            return false;\r\n        if (paranoia <= 1)\r\n            return true;\r\n        // Magic divisors (3, 5, 17) test\r\n        // (~25% false positive probability)\r\n        var s3 = 0, s5 = 0, s17 = 0;\r\n        for (i = 0; i < limbs.length; i++) {\r\n            var l3 = limbs[i];\r\n            while (l3) {\r\n                s3 += l3 & 3;\r\n                l3 >>>= 2;\r\n            }\r\n            var l5 = limbs[i];\r\n            while (l5) {\r\n                s5 += l5 & 3;\r\n                l5 >>>= 2;\r\n                s5 -= l5 & 3;\r\n                l5 >>>= 2;\r\n            }\r\n            var l17 = limbs[i];\r\n            while (l17) {\r\n                s17 += l17 & 15;\r\n                l17 >>>= 4;\r\n                s17 -= l17 & 15;\r\n                l17 >>>= 4;\r\n            }\r\n        }\r\n        if (!(s3 % 3) || !(s5 % 5) || !(s17 % 17))\r\n            return false;\r\n        if (paranoia <= 2)\r\n            return true;\r\n        // Miller-Rabin test\r\n        // (\u2264 4^(-k) false positive probability)\r\n        return this.isMillerRabinProbablePrime(paranoia >>> 1);\r\n    };\r\n    BigNumber.extGCD = BigNumber_extGCD;\r\n    BigNumber.ZERO = BigNumber.fromNumber(0);\r\n    BigNumber.ONE = BigNumber.fromNumber(1);\r\n    return BigNumber;\r\n}());\r\nvar Modulus = /** @class */ (function (_super) {\r\n    __extends$1(Modulus, _super);\r\n    function Modulus(number) {\r\n        var _this = _super.call(this) || this;\r\n        _this.limbs = number.limbs;\r\n        _this.bitLength = number.bitLength;\r\n        _this.sign = number.sign;\r\n        if (_this.valueOf() < 1)\r\n            throw new RangeError();\r\n        if (_this.bitLength <= 32)\r\n            return _this;\r\n        var comodulus;\r\n        if (_this.limbs[0] & 1) {\r\n            var bitlen = ((_this.bitLength + 31) & -32) + 1;\r\n            var limbs = new Uint32Array((bitlen + 31) >> 5);\r\n            limbs[limbs.length - 1] = 1;\r\n            comodulus = new BigNumber();\r\n            comodulus.sign = 1;\r\n            comodulus.bitLength = bitlen;\r\n            comodulus.limbs = limbs;\r\n            var k = Number_extGCD(0x100000000, _this.limbs[0]).y;\r\n            _this.coefficient = k < 0 ? -k : 0x100000000 - k;\r\n        }\r\n        else {\r\n            return _this;\r\n        }\r\n        _this.comodulus = comodulus;\r\n        _this.comodulusRemainder = comodulus.divide(_this).remainder;\r\n        _this.comodulusRemainderSquare = comodulus.square().divide(_this).remainder;\r\n        return _this;\r\n    }\r\n    /**\r\n     * Modular reduction\r\n     */\r\n    Modulus.prototype.reduce = function (a) {\r\n        if (a.bitLength <= 32 && this.bitLength <= 32)\r\n            return BigNumber.fromNumber(a.valueOf() % this.valueOf());\r\n        if (a.compare(this) < 0)\r\n            return a;\r\n        return a.divide(this).remainder;\r\n    };\r\n    /**\r\n     * Modular inverse\r\n     */\r\n    Modulus.prototype.inverse = function (a) {\r\n        a = this.reduce(a);\r\n        var r = BigNumber_extGCD(this, a);\r\n        if (r.gcd.valueOf() !== 1)\r\n            throw new Error('GCD is not 1');\r\n        if (r.y.sign < 0)\r\n            return r.y.add(this).clamp(this.bitLength);\r\n        return r.y;\r\n    };\r\n    /**\r\n     * Modular exponentiation\r\n     */\r\n    Modulus.prototype.power = function (g, e) {\r\n        // count exponent set bits\r\n        var c = 0;\r\n        for (var i = 0; i < e.limbs.length; i++) {\r\n            var t = e.limbs[i];\r\n            while (t) {\r\n                if (t & 1)\r\n                    c++;\r\n                t >>>= 1;\r\n            }\r\n        }\r\n        // window size parameter\r\n        var k = 8;\r\n        if (e.bitLength <= 4536)\r\n            k = 7;\r\n        if (e.bitLength <= 1736)\r\n            k = 6;\r\n        if (e.bitLength <= 630)\r\n            k = 5;\r\n        if (e.bitLength <= 210)\r\n            k = 4;\r\n        if (e.bitLength <= 60)\r\n            k = 3;\r\n        if (e.bitLength <= 12)\r\n            k = 2;\r\n        if (c <= 1 << (k - 1))\r\n            k = 1;\r\n        // montgomerize base\r\n        g = Modulus._Montgomery_reduce(this.reduce(g).multiply(this.comodulusRemainderSquare), this);\r\n        // precompute odd powers\r\n        var g2 = Modulus._Montgomery_reduce(g.square(), this), gn = new Array(1 << (k - 1));\r\n        gn[0] = g;\r\n        gn[1] = Modulus._Montgomery_reduce(g.multiply(g2), this);\r\n        for (var i = 2; i < 1 << (k - 1); i++) {\r\n            gn[i] = Modulus._Montgomery_reduce(gn[i - 1].multiply(g2), this);\r\n        }\r\n        // perform exponentiation\r\n        var u = this.comodulusRemainder;\r\n        var r = u;\r\n        for (var i = e.limbs.length - 1; i >= 0; i--) {\r\n            var t = e.limbs[i];\r\n            for (var j = 32; j > 0;) {\r\n                if (t & 0x80000000) {\r\n                    var n = t >>> (32 - k), l = k;\r\n                    while ((n & 1) === 0) {\r\n                        n >>>= 1;\r\n                        l--;\r\n                    }\r\n                    var m = gn[n >>> 1];\r\n                    while (n) {\r\n                        n >>>= 1;\r\n                        if (r !== u)\r\n                            r = Modulus._Montgomery_reduce(r.square(), this);\r\n                    }\r\n                    r = r !== u ? Modulus._Montgomery_reduce(r.multiply(m), this) : m;\r\n                    (t <<= l), (j -= l);\r\n                }\r\n                else {\r\n                    if (r !== u)\r\n                        r = Modulus._Montgomery_reduce(r.square(), this);\r\n                    (t <<= 1), j--;\r\n                }\r\n            }\r\n        }\r\n        // de-montgomerize result\r\n        return Modulus._Montgomery_reduce(r, this);\r\n    };\r\n    Modulus._Montgomery_reduce = function (a, n) {\r\n        var alimbs = a.limbs;\r\n        var alimbcnt = alimbs.length;\r\n        var nlimbs = n.limbs;\r\n        var nlimbcnt = nlimbs.length;\r\n        var y = n.coefficient;\r\n        _bigint_asm.sreset();\r\n        var pA = _bigint_asm.salloc(alimbcnt << 2), pN = _bigint_asm.salloc(nlimbcnt << 2), pR = _bigint_asm.salloc(nlimbcnt << 2);\r\n        _bigint_asm.z(pR - pA + (nlimbcnt << 2), 0, pA);\r\n        _bigint_heap.set(alimbs, pA >> 2);\r\n        _bigint_heap.set(nlimbs, pN >> 2);\r\n        _bigint_asm.mredc(pA, alimbcnt << 2, pN, nlimbcnt << 2, y, pR);\r\n        var result = new BigNumber();\r\n        result.limbs = new Uint32Array(_bigint_heap.subarray(pR >> 2, (pR >> 2) + nlimbcnt));\r\n        result.bitLength = n.bitLength;\r\n        result.sign = 1;\r\n        return result;\r\n    };\r\n    return Modulus;\r\n}(BigNumber));\r\n\r\n// ------------------------------\r\n// Minimal exports you need\r\n// ------------------------------\r\n\r\n// Node-style AES-128-CTR (counter is 16-byte big-endian block, incremented each block)\r\nfunction _incCounterBE16(counter) {\r\n  // increment full 128-bit big-endian counter in-place\r\n  for (let i = 15; i >= 0; i--) {\r\n    counter[i] = (counter[i] + 1) & 0xff;\r\n    if (counter[i] !== 0) break;\r\n  }\r\n}\r\n\r\nfunction _aes128CtrCrypt(data, key, iv) {\r\n  if (!(data instanceof Uint8Array)) data = new Uint8Array(data);\r\n  if (!(key instanceof Uint8Array)) key = new Uint8Array(key);\r\n  if (!(iv instanceof Uint8Array)) iv = new Uint8Array(iv);\r\n\r\n  if (key.length !== 16) throw new Error(\"AES_CTR: expected 16-byte key (aes-128-ctr)\");\r\n  if (iv.length !== 16) throw new Error(\"AES_CTR: expected 16-byte IV/counter block (16 bytes)\");\r\n\r\n  // Use AES core in ECB mode to generate keystream blocks\r\n  // Note: AES() sets up key schedule using AES_asm under the hood.\r\n  const heap = _heap_init().subarray(AES_asm.HEAP_DATA);\r\n  const asm = new AES_asm(null, heap.buffer);\r\n  // Create AES instance just to run set_key once (mode doesn't matter as long as we call ECB cipher)\r\n  // padding=false so it never tries to PKCS#7 anything (we won't use AES_Encrypt_finish anyway)\r\n  new AES(key, undefined, false, \"ECB\", heap, asm);\r\n\r\n  const out = new Uint8Array(data.length);\r\n  const ctr = new Uint8Array(16);\r\n  ctr.set(iv);\r\n\r\n  let off = 0;\r\n  while (off < data.length) {\r\n    // Write counter block into DATA[HEAP_DATA..HEAP_DATA+16)\r\n    heap.set(ctr, 0);\r\n\r\n    // Encrypt counter block with ECB to produce keystream\r\n    asm.cipher(AES_asm.ENC.ECB, AES_asm.HEAP_DATA, 16);\r\n\r\n    const blockLen = Math.min(16, data.length - off);\r\n    for (let i = 0; i < blockLen; i++) {\r\n      out[off + i] = data[off + i] ^ heap[i];\r\n    }\r\n\r\n    off += blockLen;\r\n    _incCounterBE16(ctr);\r\n  }\r\n\r\n  return out;\r\n}\r\n\r\nconst AES_CTR = {\r\n  encrypt(data, key, iv) {\r\n    return _aes128CtrCrypt(data, key, iv);\r\n  },\r\n  decrypt(data, key, iv) {\r\n    // CTR decrypt === encrypt\r\n    return _aes128CtrCrypt(data, key, iv);\r\n  }\r\n};\r\n\r\n// ------------------------------\r\n// SHA-256 (sync) + HMAC-SHA256 (sync)\r\n// ------------------------------\r\nfunction _rotr(x, n) { return (x >>> n) | (x << (32 - n)); }\r\n\r\nconst _K256 = new Uint32Array([\r\n  0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,\r\n  0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,\r\n  0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,\r\n  0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967,\r\n  0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,\r\n  0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,\r\n  0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,\r\n  0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2\r\n]);\r\n\r\nfunction _sha256Bytes(msg) {\r\n  if (!(msg instanceof Uint8Array)) msg = new Uint8Array(msg);\r\n\r\n  const ml = msg.length;\r\n  const bitLenHi = Math.floor((ml * 8) / 0x100000000);\r\n  const bitLenLo = (ml * 8) >>> 0;\r\n\r\n  // pad: 0x80 then zeros then 64-bit length\r\n  const padLen = (((ml + 9 + 63) >> 6) << 6) - ml; // bytes to reach next 64-byte block after adding 9 bytes\r\n  const buf = new Uint8Array(ml + padLen);\r\n  buf.set(msg, 0);\r\n  buf[ml] = 0x80;\r\n\r\n  const dv = new DataView(buf.buffer);\r\n  // write length in bits big-endian into last 8 bytes\r\n  dv.setUint32(buf.length - 8, bitLenHi, false);\r\n  dv.setUint32(buf.length - 4, bitLenLo, false);\r\n\r\n  let h0 = 0x6a09e667, h1 = 0xbb67ae85, h2 = 0x3c6ef372, h3 = 0xa54ff53a;\r\n  let h4 = 0x510e527f, h5 = 0x9b05688c, h6 = 0x1f83d9ab, h7 = 0x5be0cd19;\r\n\r\n  const W = new Uint32Array(64);\r\n\r\n  for (let off = 0; off < buf.length; off += 64) {\r\n    // message schedule\r\n    for (let i = 0; i < 16; i++) {\r\n      W[i] = dv.getUint32(off + (i << 2), false);\r\n    }\r\n    for (let i = 16; i < 64; i++) {\r\n      const s0 = (_rotr(W[i - 15], 7) ^ _rotr(W[i - 15], 18) ^ (W[i - 15] >>> 3)) >>> 0;\r\n      const s1 = (_rotr(W[i - 2], 17) ^ _rotr(W[i - 2], 19) ^ (W[i - 2] >>> 10)) >>> 0;\r\n      W[i] = (W[i - 16] + s0 + W[i - 7] + s1) >>> 0;\r\n    }\r\n\r\n    // compression\r\n    let a = h0, b = h1, c = h2, d = h3, e = h4, f = h5, g = h6, hh = h7;\r\n\r\n    for (let i = 0; i < 64; i++) {\r\n      const S1 = (_rotr(e, 6) ^ _rotr(e, 11) ^ _rotr(e, 25)) >>> 0;\r\n      const ch = ((e & f) ^ (~e & g)) >>> 0;\r\n      const t1 = (hh + S1 + ch + _K256[i] + W[i]) >>> 0;\r\n      const S0 = (_rotr(a, 2) ^ _rotr(a, 13) ^ _rotr(a, 22)) >>> 0;\r\n      const maj = ((a & b) ^ (a & c) ^ (b & c)) >>> 0;\r\n      const t2 = (S0 + maj) >>> 0;\r\n\r\n      hh = g;\r\n      g = f;\r\n      f = e;\r\n      e = (d + t1) >>> 0;\r\n      d = c;\r\n      c = b;\r\n      b = a;\r\n      a = (t1 + t2) >>> 0;\r\n    }\r\n\r\n    h0 = (h0 + a) >>> 0;\r\n    h1 = (h1 + b) >>> 0;\r\n    h2 = (h2 + c) >>> 0;\r\n    h3 = (h3 + d) >>> 0;\r\n    h4 = (h4 + e) >>> 0;\r\n    h5 = (h5 + f) >>> 0;\r\n    h6 = (h6 + g) >>> 0;\r\n    h7 = (h7 + hh) >>> 0;\r\n  }\r\n\r\n  const out = new Uint8Array(32);\r\n  const odv = new DataView(out.buffer);\r\n  odv.setUint32(0,  h0, false);\r\n  odv.setUint32(4,  h1, false);\r\n  odv.setUint32(8,  h2, false);\r\n  odv.setUint32(12, h3, false);\r\n  odv.setUint32(16, h4, false);\r\n  odv.setUint32(20, h5, false);\r\n  odv.setUint32(24, h6, false);\r\n  odv.setUint32(28, h7, false);\r\n  return out;\r\n}\r\n\r\nconst SHA256 = {\r\n  bytes(data) {\r\n    return _sha256Bytes(data);\r\n  }\r\n};\r\n\r\nfunction _hmacSha256Bytes(data, key) {\r\n  if (!(data instanceof Uint8Array)) data = new Uint8Array(data);\r\n  if (!(key instanceof Uint8Array)) key = new Uint8Array(key);\r\n\r\n  const blockSize = 64;\r\n\r\n  // If key > blockSize, key = sha256(key)\r\n  let k = key;\r\n  if (k.length > blockSize) k = _sha256Bytes(k);\r\n\r\n  // Pad key to blockSize\r\n  const keyBlock = new Uint8Array(blockSize);\r\n  keyBlock.set(k);\r\n\r\n  const oKeyPad = new Uint8Array(blockSize);\r\n  const iKeyPad = new Uint8Array(blockSize);\r\n  for (let i = 0; i < blockSize; i++) {\r\n    oKeyPad[i] = keyBlock[i] ^ 0x5c;\r\n    iKeyPad[i] = keyBlock[i] ^ 0x36;\r\n  }\r\n\r\n  const inner = new Uint8Array(iKeyPad.length + data.length);\r\n  inner.set(iKeyPad, 0);\r\n  inner.set(data, iKeyPad.length);\r\n\r\n  const innerHash = _sha256Bytes(inner);\r\n\r\n  const outer = new Uint8Array(oKeyPad.length + innerHash.length);\r\n  outer.set(oKeyPad, 0);\r\n  outer.set(innerHash, oKeyPad.length);\r\n\r\n  return _sha256Bytes(outer);\r\n}\r\n\r\nconst HMAC_SHA256 = {\r\n  bytes(data, key) {\r\n    return _hmacSha256Bytes(data, key);\r\n  }\r\n};\r\n\r\n// keep your existing AES_CCM export name\r\nconst _AES_CCM = AES_CCM;\r\n\r\n// Export the pieces your browser shim imports\r\nexport {\r\n  _AES_CCM as AES_CCM,\r\n  AES_asm,\r\n  getRandomValues,\r\n  AES_CTR,\r\n  SHA256,\r\n  HMAC_SHA256\r\n};\r\n", "import { AES_CCM } from \"./asmCrypto.js\";\r\nimport { createCipheriv, createDecipheriv, randomBytes } from \"./platform.js\";\r\n\r\n/** AES-128-CCM key used for encrypting/decrypting Mii QR code data. */\r\nconst AES_CCM_KEY = new Uint8Array([0x59, 0xFC, 0x81, 0x7E, 0x64, 0x46, 0xEA, 0x61, 0x90, 0x34, 0x7B, 0x20, 0xE9, 0xBD, 0xCE, 0x52]);\r\n\r\n/**\r\n* Key used for Miitomo/Tomodachi Life QR code encryption.\r\n* From Arian Kordi: https://github.com/ariankordi/my-jsfiddles/blob/c833be14f1674240e310453cdfa3db5ede53e059/mii-tomo-dachi-topia-qr-tool/script.js#L30\r\n*/\r\nconst AES_CTR_KEY = new Uint8Array([0x30, 0x81, 0x9F, 0x30, 0x0D, 0x06, 0x09, 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01]);\r\n\r\n// Below two functions are from: https://github.com/kazuki-4ys/kazuki-4ys.github.io/blob/148dc339974f8b7515bfdc1395ec1fc9becb68ab/web_apps/MiiInfoEditorCTR/encode.js#L20-L44\r\n\r\nconst WRAPPED_MII_DATA_LENGTH = 112;\r\nconst VER3_STORE_DATA_LENGTH = 96;\r\nconst WRAPPED_NONCE_LENGTH = 12;\r\nconst WRAPPED_TAG_LENGTH = 16;\r\nconst WRAPPED_ID_OFFSET = 12;\r\nconst WRAPPED_ID_LENGTH = 8;\r\nconst AES_IV_LENGTH = 16;\r\n\r\nfunction Uint8Cat(...arrays) {\r\n  const totalLength = arrays.reduce((sum, arr) => sum + arr.length, 0);\r\n  const result = new Uint8Array(totalLength);\r\n  let offset = 0;\r\n  for (const arr of arrays) {\r\n    result.set(arr, offset);\r\n    offset += arr.length;\r\n  }\r\n  return result;\r\n}\r\n\r\nfunction crc16(data, current = 0x0000) {\r\n  let crc = current;\r\n  for (let i = 0; i < data.length; i++) {\r\n    const byte = data[i];\r\n    for (let bit = 7; bit >= 0; bit--) {\r\n      crc = ((crc << 1) | ((byte >> bit) & 0x1)) & 0x1FFFF;\r\n      if (crc & 0x10000) {\r\n        crc ^= 0x1021;\r\n      }\r\n    }\r\n  }\r\n  for (let i = 0; i < 16; i++) {\r\n    crc = (crc << 1) & 0x1FFFF;\r\n    if (crc & 0x10000) {\r\n      crc ^= 0x1021;\r\n    }\r\n  }\r\n  return crc & 0xFFFF;\r\n}\r\n\r\n// https://github.com/ariankordi/my-jsfiddles/blob/c833be14f1674240e310453cdfa3db5ede53e059/mii-tomo-dachi-topia-qr-tool/script.js#L169-L207\r\nconst crc32CksumTable = new Uint32Array(256);\r\nfunction generateCrc32Table(table, poly = 0x04C11DB7) {\r\n  for (let i = 0; i < 256; i++) {\r\n    let crc = i << 24;\r\n    for (let j = 0; j < 8; j++) {\r\n      crc = (crc & 0x80000000) ? (crc << 1) ^ poly : crc << 1;\r\n    }\r\n    table[i] = crc >>> 0;\r\n  }\r\n}\r\ngenerateCrc32Table(crc32CksumTable);\r\n\r\nfunction crc32(input, table = crc32CksumTable) {\r\n  let crc = 0x00000000;\r\n  for (let i = 0; i < input.length; i++) {\r\n    const byte = (input[i] ^ (crc >>> 24)) & 0xFF;\r\n    crc = (table[byte] ^ (crc << 8)) >>> 0;\r\n  }\r\n  return (crc ^ 0xFFFFFFFF) >>> 0;\r\n}\r\n\r\n// https://github.com/ariankordi/my-jsfiddles/blob/c833be14f1674240e310453cdfa3db5ede53e059/mii-tomo-dachi-topia-qr-tool/script.js#L530-L559\r\nfunction encryptAesCtr(dataU8) {\r\n  const iv = randomBytes(AES_IV_LENGTH); // Buffer\r\n  const cipher = createCipheriv(\"aes-128-ctr\", Buffer.from(AES_CTR_KEY), iv);\r\n  const encrypted = Buffer.concat([cipher.update(Buffer.from(dataU8)), cipher.final()]);\r\n  return { encryptedData: new Uint8Array(encrypted), iv: new Uint8Array(iv) };\r\n}\r\n\r\nfunction decryptAesCtr(encryptedU8, ivU8) {\r\n  const decipher = createDecipheriv(\"aes-128-ctr\", Buffer.from(AES_CTR_KEY), Buffer.from(ivU8));\r\n  const decrypted = Buffer.concat([decipher.update(Buffer.from(encryptedU8)), decipher.final()]);\r\n  return new Uint8Array(decrypted);\r\n}\r\n\r\n// https://github.com/ariankordi/my-jsfiddles/blob/c833be14f1674240e310453cdfa3db5ede53e059/mii-tomo-dachi-topia-qr-tool/script.js#L51-L75\r\nfunction decryptAesCcm(encryptedData) {\r\n  // Source: https://github.com/ariankordi/my-jsfiddles/blob/c833be14f1674240e310453cdfa3db5ede53e059/mii-tomo-dachi-topia-qr-tool/script.js#L321\r\n  const nonce = Uint8Cat(encryptedData.subarray(0, WRAPPED_ID_LENGTH), new Uint8Array(4));\r\n  const ciphertext = encryptedData.subarray(WRAPPED_ID_LENGTH, encryptedData.length);\r\n  const plaintext = AES_CCM.decrypt(ciphertext, AES_CCM_KEY, nonce, undefined, 16);\r\n  const result = Uint8Cat(\r\n    plaintext.subarray(0, WRAPPED_NONCE_LENGTH),\r\n    encryptedData.subarray(0, WRAPPED_ID_LENGTH),\r\n    plaintext.subarray(WRAPPED_NONCE_LENGTH, WRAPPED_NONCE_LENGTH + 76),\r\n  );\r\n  return result;\r\n}\r\n\r\nfunction encryptAesCcm(storeData) {\r\n  // Source: https://github.com/ariankordi/my-jsfiddles/blob/c833be14f1674240e310453cdfa3db5ede53e059/mii-tomo-dachi-topia-qr-tool/script.js#L396\r\n  const idEndOffset = WRAPPED_ID_OFFSET + WRAPPED_ID_LENGTH;\r\n  const wrappedID = storeData.subarray(WRAPPED_ID_OFFSET, idEndOffset);\r\n  const content = new Uint8Array(VER3_STORE_DATA_LENGTH);\r\n  content.set(storeData.subarray(0, WRAPPED_ID_OFFSET));\r\n  content.set(storeData.subarray(idEndOffset), WRAPPED_ID_OFFSET);\r\n  const nonce = Uint8Cat(wrappedID, new Uint8Array(4));\r\n  const ciphertext = AES_CCM.encrypt(content, AES_CCM_KEY, nonce, undefined, 16);\r\n  const correctEncryptedContentLength = ciphertext.length - WRAPPED_ID_LENGTH - WRAPPED_TAG_LENGTH;\r\n  const encryptedContentCorrected = ciphertext.subarray(0, correctEncryptedContentLength);\r\n  const tag = ciphertext.subarray(ciphertext.length - WRAPPED_TAG_LENGTH);\r\n  return Uint8Cat(wrappedID, encryptedContentCorrected, tag);\r\n}\r\n\r\nfunction decryptMii(data) {\r\n  const uint8Data = data instanceof Uint8Array ? data : new Uint8Array(data);\r\n  \r\n  // Extra data present (Tomodachi Life etc.)\r\n  if (uint8Data.length > WRAPPED_MII_DATA_LENGTH) {\r\n    // https://github.com/ariankordi/my-jsfiddles/blob/c833be14f1674240e310453cdfa3db5ede53e059/mii-tomo-dachi-topia-qr-tool/script.js#L694\r\n    const storeData = decryptAesCcm(uint8Data.subarray(0, WRAPPED_MII_DATA_LENGTH));\r\n    const ivOffset = WRAPPED_MII_DATA_LENGTH + AES_IV_LENGTH;\r\n    const iv = uint8Data.subarray(WRAPPED_MII_DATA_LENGTH, ivOffset);\r\n    const encryptedExtra = uint8Data.subarray(ivOffset);\r\n    \r\n    try {\r\n      const decryptedExtra = decryptAesCtr(encryptedExtra, iv);\r\n      \r\n      const extraData = decryptedExtra.subarray(0, -4);\r\n      const crcOffset = decryptedExtra.length - 4;\r\n      const crcActual = new DataView(decryptedExtra.buffer, decryptedExtra.byteOffset, decryptedExtra.byteLength)\r\n      .getUint32(crcOffset, true);\r\n      \r\n      // CRC expected over (wrapped112 || extraData)\r\n      const encryptedForCrc = new Uint8Array(uint8Data.length); // copy\r\n      encryptedForCrc.set(uint8Data, 0);\r\n      encryptedForCrc.set(extraData, WRAPPED_MII_DATA_LENGTH);\r\n      const offsetForCrc = WRAPPED_MII_DATA_LENGTH + extraData.length;\r\n      const dataForCrc = encryptedForCrc.subarray(0, offsetForCrc);\r\n      \r\n      const crcExpected = crc32(dataForCrc);\r\n      return Buffer.from(Uint8Cat(storeData, extraData));\r\n    } catch {\r\n      return Buffer.from(storeData);\r\n    }\r\n  }\r\n  \r\n  return Buffer.from(decryptAesCcm(uint8Data));\r\n}\r\n\r\nfunction encryptMii(data) {\r\n  const uint8Data = data instanceof Uint8Array ? data : new Uint8Array(data);\r\n  \r\n  if (uint8Data.length > VER3_STORE_DATA_LENGTH) {\r\n    // https://github.com/ariankordi/my-jsfiddles/blob/c833be14f1674240e310453cdfa3db5ede53e059/mii-tomo-dachi-topia-qr-tool/script.js#L628\r\n    const storeData = uint8Data.subarray(0, VER3_STORE_DATA_LENGTH);\r\n    const extraData = uint8Data.subarray(VER3_STORE_DATA_LENGTH);\r\n    \r\n    const encryptedBase = encryptAesCcm(storeData);\r\n    \r\n    // CRC32 covers (wrapped112 + plaintext extraData)\r\n    const dataForCrc = new Uint8Array(WRAPPED_MII_DATA_LENGTH + extraData.length);\r\n    dataForCrc.set(encryptedBase, 0);\r\n    dataForCrc.set(extraData, WRAPPED_MII_DATA_LENGTH);\r\n    const crc = miiCrcCalc(dataForCrc, 32) >>> 0;\r\n    \r\n    const extraWithCrc = new Uint8Array(extraData.length + 4);\r\n    extraWithCrc.set(extraData, 0);\r\n    new DataView(extraWithCrc.buffer).setUint32(extraData.length, crc, true);\r\n    \r\n    const { encryptedData: encryptedExtra, iv } = encryptAesCtr(extraWithCrc);\r\n    \r\n    const encryptedBytes = new Uint8Array(WRAPPED_MII_DATA_LENGTH + AES_IV_LENGTH + encryptedExtra.length);\r\n    encryptedBytes.set(encryptedBase, 0);\r\n    encryptedBytes.set(iv, WRAPPED_MII_DATA_LENGTH);\r\n    encryptedBytes.set(encryptedExtra, WRAPPED_MII_DATA_LENGTH + AES_IV_LENGTH);\r\n    \r\n    return Buffer.from(encryptedBytes);\r\n  }\r\n  \r\n  return Buffer.from(encryptAesCcm(uint8Data));\r\n}\r\n\r\n\r\nfunction miiCrcCalc(dat, mode = 16) {\r\n  return mode === 32 ? crc32(dat) : crc16(dat);\r\n}\r\n\r\nconst STUDIO_MII_DATA_LENGTH = 0x2e;\nconst ENCRYPTED_STUDIO_MII_DATA_LENGTH = STUDIO_MII_DATA_LENGTH + 1;\n\nfunction studioBytes(data, label) {\n  if (typeof data === \"string\") {\n    const hex = data.trim().replace(/\\s+/g, \"\");\n    if (!/^[0-9a-f]*$/i.test(hex) || hex.length % 2 !== 0) {\n      throw new Error(`${label} must be bytes or an even-length hex string.`);\n    }\n    return Buffer.from(hex, \"hex\");\n  }\n  if (\n    data instanceof Uint8Array\n    || data instanceof ArrayBuffer\n    || (typeof SharedArrayBuffer !== \"undefined\" && data instanceof SharedArrayBuffer)\n  ) {\n    return Buffer.from(data);\n  }\n  throw new Error(`${label} must be bytes or an even-length hex string.`);\n}\n\nfunction assertStudioLength(bytes, expectedLength, label) {\n  if (bytes.length !== expectedLength) {\n    throw new Error(`${label} expected ${expectedLength} bytes, received ${bytes.length}.`);\n  }\n}\n\nfunction encryptStudio2(unencryptedMNMS, seed = 0) {\n  const bytes = studioBytes(unencryptedMNMS, \"MNMS data\");\n  assertStudioLength(bytes, STUDIO_MII_DATA_LENGTH, \"MNMS data\");\n\n  const encrypted = Buffer.alloc(ENCRYPTED_STUDIO_MII_DATA_LENGTH);\n  encrypted[0] = seed & 0xff;\n\n  for (let i = 0; i < bytes.length; i++) {\n    encrypted[i + 1] = (((encrypted[i] ^ bytes[i]) + 0x07) & 0xff);\n  }\n\n  return encrypted;\n}\nfunction decryptStudio2(encryptedMNMS) {\n  const encrypted = studioBytes(encryptedMNMS, \"EMNMS data\");\n  assertStudioLength(encrypted, ENCRYPTED_STUDIO_MII_DATA_LENGTH, \"EMNMS data\");\n\n  const decrypted = Buffer.alloc(STUDIO_MII_DATA_LENGTH);\n\n  for (let i = 1; i < encrypted.length; i++) {\n    decrypted[i - 1] = encrypted[i - 1] ^ ((encrypted[i] - 0x07) & 0xff);\n  }\n\n  return decrypted;\n}\n\r\nexport {\r\n  decryptMii,\r\n  encryptMii,\r\n  miiCrcCalc,\r\n  \r\n  encryptStudio2,\r\n  decryptStudio2\r\n};\r\n", "/**\n * @license\n * Lodash <https://lodash.com/>\n * Copyright OpenJS Foundation and other contributors <https://openjsf.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n;(function() {\n\n  /** Used as a safe reference for `undefined` in pre-ES5 environments. */\n  var undefined;\n\n  /** Used as the semantic version number. */\n  var VERSION = '4.17.23';\n\n  /** Used as the size to enable large array optimizations. */\n  var LARGE_ARRAY_SIZE = 200;\n\n  /** Error message constants. */\n  var CORE_ERROR_TEXT = 'Unsupported core-js use. Try https://npms.io/search?q=ponyfill.',\n      FUNC_ERROR_TEXT = 'Expected a function',\n      INVALID_TEMPL_VAR_ERROR_TEXT = 'Invalid `variable` option passed into `_.template`';\n\n  /** Used to stand-in for `undefined` hash values. */\n  var HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n  /** Used as the maximum memoize cache size. */\n  var MAX_MEMOIZE_SIZE = 500;\n\n  /** Used as the internal argument placeholder. */\n  var PLACEHOLDER = '__lodash_placeholder__';\n\n  /** Used to compose bitmasks for cloning. */\n  var CLONE_DEEP_FLAG = 1,\n      CLONE_FLAT_FLAG = 2,\n      CLONE_SYMBOLS_FLAG = 4;\n\n  /** Used to compose bitmasks for value comparisons. */\n  var COMPARE_PARTIAL_FLAG = 1,\n      COMPARE_UNORDERED_FLAG = 2;\n\n  /** Used to compose bitmasks for function metadata. */\n  var WRAP_BIND_FLAG = 1,\n      WRAP_BIND_KEY_FLAG = 2,\n      WRAP_CURRY_BOUND_FLAG = 4,\n      WRAP_CURRY_FLAG = 8,\n      WRAP_CURRY_RIGHT_FLAG = 16,\n      WRAP_PARTIAL_FLAG = 32,\n      WRAP_PARTIAL_RIGHT_FLAG = 64,\n      WRAP_ARY_FLAG = 128,\n      WRAP_REARG_FLAG = 256,\n      WRAP_FLIP_FLAG = 512;\n\n  /** Used as default options for `_.truncate`. */\n  var DEFAULT_TRUNC_LENGTH = 30,\n      DEFAULT_TRUNC_OMISSION = '...';\n\n  /** Used to detect hot functions by number of calls within a span of milliseconds. */\n  var HOT_COUNT = 800,\n      HOT_SPAN = 16;\n\n  /** Used to indicate the type of lazy iteratees. */\n  var LAZY_FILTER_FLAG = 1,\n      LAZY_MAP_FLAG = 2,\n      LAZY_WHILE_FLAG = 3;\n\n  /** Used as references for various `Number` constants. */\n  var INFINITY = 1 / 0,\n      MAX_SAFE_INTEGER = 9007199254740991,\n      MAX_INTEGER = 1.7976931348623157e+308,\n      NAN = 0 / 0;\n\n  /** Used as references for the maximum length and index of an array. */\n  var MAX_ARRAY_LENGTH = 4294967295,\n      MAX_ARRAY_INDEX = MAX_ARRAY_LENGTH - 1,\n      HALF_MAX_ARRAY_LENGTH = MAX_ARRAY_LENGTH >>> 1;\n\n  /** Used to associate wrap methods with their bit flags. */\n  var wrapFlags = [\n    ['ary', WRAP_ARY_FLAG],\n    ['bind', WRAP_BIND_FLAG],\n    ['bindKey', WRAP_BIND_KEY_FLAG],\n    ['curry', WRAP_CURRY_FLAG],\n    ['curryRight', WRAP_CURRY_RIGHT_FLAG],\n    ['flip', WRAP_FLIP_FLAG],\n    ['partial', WRAP_PARTIAL_FLAG],\n    ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\n    ['rearg', WRAP_REARG_FLAG]\n  ];\n\n  /** `Object#toString` result references. */\n  var argsTag = '[object Arguments]',\n      arrayTag = '[object Array]',\n      asyncTag = '[object AsyncFunction]',\n      boolTag = '[object Boolean]',\n      dateTag = '[object Date]',\n      domExcTag = '[object DOMException]',\n      errorTag = '[object Error]',\n      funcTag = '[object Function]',\n      genTag = '[object GeneratorFunction]',\n      mapTag = '[object Map]',\n      numberTag = '[object Number]',\n      nullTag = '[object Null]',\n      objectTag = '[object Object]',\n      promiseTag = '[object Promise]',\n      proxyTag = '[object Proxy]',\n      regexpTag = '[object RegExp]',\n      setTag = '[object Set]',\n      stringTag = '[object String]',\n      symbolTag = '[object Symbol]',\n      undefinedTag = '[object Undefined]',\n      weakMapTag = '[object WeakMap]',\n      weakSetTag = '[object WeakSet]';\n\n  var arrayBufferTag = '[object ArrayBuffer]',\n      dataViewTag = '[object DataView]',\n      float32Tag = '[object Float32Array]',\n      float64Tag = '[object Float64Array]',\n      int8Tag = '[object Int8Array]',\n      int16Tag = '[object Int16Array]',\n      int32Tag = '[object Int32Array]',\n      uint8Tag = '[object Uint8Array]',\n      uint8ClampedTag = '[object Uint8ClampedArray]',\n      uint16Tag = '[object Uint16Array]',\n      uint32Tag = '[object Uint32Array]';\n\n  /** Used to match empty string literals in compiled template source. */\n  var reEmptyStringLeading = /\\b__p \\+= '';/g,\n      reEmptyStringMiddle = /\\b(__p \\+=) '' \\+/g,\n      reEmptyStringTrailing = /(__e\\(.*?\\)|\\b__t\\)) \\+\\n'';/g;\n\n  /** Used to match HTML entities and HTML characters. */\n  var reEscapedHtml = /&(?:amp|lt|gt|quot|#39);/g,\n      reUnescapedHtml = /[&<>\"']/g,\n      reHasEscapedHtml = RegExp(reEscapedHtml.source),\n      reHasUnescapedHtml = RegExp(reUnescapedHtml.source);\n\n  /** Used to match template delimiters. */\n  var reEscape = /<%-([\\s\\S]+?)%>/g,\n      reEvaluate = /<%([\\s\\S]+?)%>/g,\n      reInterpolate = /<%=([\\s\\S]+?)%>/g;\n\n  /** Used to match property names within property paths. */\n  var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n      reIsPlainProp = /^\\w*$/,\n      rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n  /**\n   * Used to match `RegExp`\n   * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n   */\n  var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g,\n      reHasRegExpChar = RegExp(reRegExpChar.source);\n\n  /** Used to match leading whitespace. */\n  var reTrimStart = /^\\s+/;\n\n  /** Used to match a single whitespace character. */\n  var reWhitespace = /\\s/;\n\n  /** Used to match wrap detail comments. */\n  var reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/,\n      reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n      reSplitDetails = /,? & /;\n\n  /** Used to match words composed of alphanumeric characters. */\n  var reAsciiWord = /[^\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\x7f]+/g;\n\n  /**\n   * Used to validate the `validate` option in `_.template` variable.\n   *\n   * Forbids characters which could potentially change the meaning of the function argument definition:\n   * - \"(),\" (modification of function parameters)\n   * - \"=\" (default value)\n   * - \"[]{}\" (destructuring of function parameters)\n   * - \"/\" (beginning of a comment)\n   * - whitespace\n   */\n  var reForbiddenIdentifierChars = /[()=,{}\\[\\]\\/\\s]/;\n\n  /** Used to match backslashes in property paths. */\n  var reEscapeChar = /\\\\(\\\\)?/g;\n\n  /**\n   * Used to match\n   * [ES template delimiters](http://ecma-international.org/ecma-262/7.0/#sec-template-literal-lexical-components).\n   */\n  var reEsTemplate = /\\$\\{([^\\\\}]*(?:\\\\.[^\\\\}]*)*)\\}/g;\n\n  /** Used to match `RegExp` flags from their coerced string values. */\n  var reFlags = /\\w*$/;\n\n  /** Used to detect bad signed hexadecimal string values. */\n  var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n  /** Used to detect binary string values. */\n  var reIsBinary = /^0b[01]+$/i;\n\n  /** Used to detect host constructors (Safari). */\n  var reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n  /** Used to detect octal string values. */\n  var reIsOctal = /^0o[0-7]+$/i;\n\n  /** Used to detect unsigned integer values. */\n  var reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n  /** Used to match Latin Unicode letters (excluding mathematical operators). */\n  var reLatin = /[\\xc0-\\xd6\\xd8-\\xf6\\xf8-\\xff\\u0100-\\u017f]/g;\n\n  /** Used to ensure capturing order of template delimiters. */\n  var reNoMatch = /($^)/;\n\n  /** Used to match unescaped characters in compiled string literals. */\n  var reUnescapedString = /['\\n\\r\\u2028\\u2029\\\\]/g;\n\n  /** Used to compose unicode character classes. */\n  var rsAstralRange = '\\\\ud800-\\\\udfff',\n      rsComboMarksRange = '\\\\u0300-\\\\u036f',\n      reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n      rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n      rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n      rsDingbatRange = '\\\\u2700-\\\\u27bf',\n      rsLowerRange = 'a-z\\\\xdf-\\\\xf6\\\\xf8-\\\\xff',\n      rsMathOpRange = '\\\\xac\\\\xb1\\\\xd7\\\\xf7',\n      rsNonCharRange = '\\\\x00-\\\\x2f\\\\x3a-\\\\x40\\\\x5b-\\\\x60\\\\x7b-\\\\xbf',\n      rsPunctuationRange = '\\\\u2000-\\\\u206f',\n      rsSpaceRange = ' \\\\t\\\\x0b\\\\f\\\\xa0\\\\ufeff\\\\n\\\\r\\\\u2028\\\\u2029\\\\u1680\\\\u180e\\\\u2000\\\\u2001\\\\u2002\\\\u2003\\\\u2004\\\\u2005\\\\u2006\\\\u2007\\\\u2008\\\\u2009\\\\u200a\\\\u202f\\\\u205f\\\\u3000',\n      rsUpperRange = 'A-Z\\\\xc0-\\\\xd6\\\\xd8-\\\\xde',\n      rsVarRange = '\\\\ufe0e\\\\ufe0f',\n      rsBreakRange = rsMathOpRange + rsNonCharRange + rsPunctuationRange + rsSpaceRange;\n\n  /** Used to compose unicode capture groups. */\n  var rsApos = \"['\\u2019]\",\n      rsAstral = '[' + rsAstralRange + ']',\n      rsBreak = '[' + rsBreakRange + ']',\n      rsCombo = '[' + rsComboRange + ']',\n      rsDigits = '\\\\d+',\n      rsDingbat = '[' + rsDingbatRange + ']',\n      rsLower = '[' + rsLowerRange + ']',\n      rsMisc = '[^' + rsAstralRange + rsBreakRange + rsDigits + rsDingbatRange + rsLowerRange + rsUpperRange + ']',\n      rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n      rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n      rsNonAstral = '[^' + rsAstralRange + ']',\n      rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n      rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n      rsUpper = '[' + rsUpperRange + ']',\n      rsZWJ = '\\\\u200d';\n\n  /** Used to compose unicode regexes. */\n  var rsMiscLower = '(?:' + rsLower + '|' + rsMisc + ')',\n      rsMiscUpper = '(?:' + rsUpper + '|' + rsMisc + ')',\n      rsOptContrLower = '(?:' + rsApos + '(?:d|ll|m|re|s|t|ve))?',\n      rsOptContrUpper = '(?:' + rsApos + '(?:D|LL|M|RE|S|T|VE))?',\n      reOptMod = rsModifier + '?',\n      rsOptVar = '[' + rsVarRange + ']?',\n      rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n      rsOrdLower = '\\\\d*(?:1st|2nd|3rd|(?![123])\\\\dth)(?=\\\\b|[A-Z_])',\n      rsOrdUpper = '\\\\d*(?:1ST|2ND|3RD|(?![123])\\\\dTH)(?=\\\\b|[a-z_])',\n      rsSeq = rsOptVar + reOptMod + rsOptJoin,\n      rsEmoji = '(?:' + [rsDingbat, rsRegional, rsSurrPair].join('|') + ')' + rsSeq,\n      rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n  /** Used to match apostrophes. */\n  var reApos = RegExp(rsApos, 'g');\n\n  /**\n   * Used to match [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks) and\n   * [combining diacritical marks for symbols](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks_for_Symbols).\n   */\n  var reComboMark = RegExp(rsCombo, 'g');\n\n  /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\n  var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n  /** Used to match complex or compound words. */\n  var reUnicodeWord = RegExp([\n    rsUpper + '?' + rsLower + '+' + rsOptContrLower + '(?=' + [rsBreak, rsUpper, '$'].join('|') + ')',\n    rsMiscUpper + '+' + rsOptContrUpper + '(?=' + [rsBreak, rsUpper + rsMiscLower, '$'].join('|') + ')',\n    rsUpper + '?' + rsMiscLower + '+' + rsOptContrLower,\n    rsUpper + '+' + rsOptContrUpper,\n    rsOrdUpper,\n    rsOrdLower,\n    rsDigits,\n    rsEmoji\n  ].join('|'), 'g');\n\n  /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\n  var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboRange + rsVarRange + ']');\n\n  /** Used to detect strings that need a more robust regexp to match words. */\n  var reHasUnicodeWord = /[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;\n\n  /** Used to assign default `context` object properties. */\n  var contextProps = [\n    'Array', 'Buffer', 'DataView', 'Date', 'Error', 'Float32Array', 'Float64Array',\n    'Function', 'Int8Array', 'Int16Array', 'Int32Array', 'Map', 'Math', 'Object',\n    'Promise', 'RegExp', 'Set', 'String', 'Symbol', 'TypeError', 'Uint8Array',\n    'Uint8ClampedArray', 'Uint16Array', 'Uint32Array', 'WeakMap',\n    '_', 'clearTimeout', 'isFinite', 'parseInt', 'setTimeout'\n  ];\n\n  /** Used to make template sourceURLs easier to identify. */\n  var templateCounter = -1;\n\n  /** Used to identify `toStringTag` values of typed arrays. */\n  var typedArrayTags = {};\n  typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\n  typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\n  typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\n  typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\n  typedArrayTags[uint32Tag] = true;\n  typedArrayTags[argsTag] = typedArrayTags[arrayTag] =\n  typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\n  typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\n  typedArrayTags[errorTag] = typedArrayTags[funcTag] =\n  typedArrayTags[mapTag] = typedArrayTags[numberTag] =\n  typedArrayTags[objectTag] = typedArrayTags[regexpTag] =\n  typedArrayTags[setTag] = typedArrayTags[stringTag] =\n  typedArrayTags[weakMapTag] = false;\n\n  /** Used to identify `toStringTag` values supported by `_.clone`. */\n  var cloneableTags = {};\n  cloneableTags[argsTag] = cloneableTags[arrayTag] =\n  cloneableTags[arrayBufferTag] = cloneableTags[dataViewTag] =\n  cloneableTags[boolTag] = cloneableTags[dateTag] =\n  cloneableTags[float32Tag] = cloneableTags[float64Tag] =\n  cloneableTags[int8Tag] = cloneableTags[int16Tag] =\n  cloneableTags[int32Tag] = cloneableTags[mapTag] =\n  cloneableTags[numberTag] = cloneableTags[objectTag] =\n  cloneableTags[regexpTag] = cloneableTags[setTag] =\n  cloneableTags[stringTag] = cloneableTags[symbolTag] =\n  cloneableTags[uint8Tag] = cloneableTags[uint8ClampedTag] =\n  cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true;\n  cloneableTags[errorTag] = cloneableTags[funcTag] =\n  cloneableTags[weakMapTag] = false;\n\n  /** Used to map Latin Unicode letters to basic Latin letters. */\n  var deburredLetters = {\n    // Latin-1 Supplement block.\n    '\\xc0': 'A',  '\\xc1': 'A', '\\xc2': 'A', '\\xc3': 'A', '\\xc4': 'A', '\\xc5': 'A',\n    '\\xe0': 'a',  '\\xe1': 'a', '\\xe2': 'a', '\\xe3': 'a', '\\xe4': 'a', '\\xe5': 'a',\n    '\\xc7': 'C',  '\\xe7': 'c',\n    '\\xd0': 'D',  '\\xf0': 'd',\n    '\\xc8': 'E',  '\\xc9': 'E', '\\xca': 'E', '\\xcb': 'E',\n    '\\xe8': 'e',  '\\xe9': 'e', '\\xea': 'e', '\\xeb': 'e',\n    '\\xcc': 'I',  '\\xcd': 'I', '\\xce': 'I', '\\xcf': 'I',\n    '\\xec': 'i',  '\\xed': 'i', '\\xee': 'i', '\\xef': 'i',\n    '\\xd1': 'N',  '\\xf1': 'n',\n    '\\xd2': 'O',  '\\xd3': 'O', '\\xd4': 'O', '\\xd5': 'O', '\\xd6': 'O', '\\xd8': 'O',\n    '\\xf2': 'o',  '\\xf3': 'o', '\\xf4': 'o', '\\xf5': 'o', '\\xf6': 'o', '\\xf8': 'o',\n    '\\xd9': 'U',  '\\xda': 'U', '\\xdb': 'U', '\\xdc': 'U',\n    '\\xf9': 'u',  '\\xfa': 'u', '\\xfb': 'u', '\\xfc': 'u',\n    '\\xdd': 'Y',  '\\xfd': 'y', '\\xff': 'y',\n    '\\xc6': 'Ae', '\\xe6': 'ae',\n    '\\xde': 'Th', '\\xfe': 'th',\n    '\\xdf': 'ss',\n    // Latin Extended-A block.\n    '\\u0100': 'A',  '\\u0102': 'A', '\\u0104': 'A',\n    '\\u0101': 'a',  '\\u0103': 'a', '\\u0105': 'a',\n    '\\u0106': 'C',  '\\u0108': 'C', '\\u010a': 'C', '\\u010c': 'C',\n    '\\u0107': 'c',  '\\u0109': 'c', '\\u010b': 'c', '\\u010d': 'c',\n    '\\u010e': 'D',  '\\u0110': 'D', '\\u010f': 'd', '\\u0111': 'd',\n    '\\u0112': 'E',  '\\u0114': 'E', '\\u0116': 'E', '\\u0118': 'E', '\\u011a': 'E',\n    '\\u0113': 'e',  '\\u0115': 'e', '\\u0117': 'e', '\\u0119': 'e', '\\u011b': 'e',\n    '\\u011c': 'G',  '\\u011e': 'G', '\\u0120': 'G', '\\u0122': 'G',\n    '\\u011d': 'g',  '\\u011f': 'g', '\\u0121': 'g', '\\u0123': 'g',\n    '\\u0124': 'H',  '\\u0126': 'H', '\\u0125': 'h', '\\u0127': 'h',\n    '\\u0128': 'I',  '\\u012a': 'I', '\\u012c': 'I', '\\u012e': 'I', '\\u0130': 'I',\n    '\\u0129': 'i',  '\\u012b': 'i', '\\u012d': 'i', '\\u012f': 'i', '\\u0131': 'i',\n    '\\u0134': 'J',  '\\u0135': 'j',\n    '\\u0136': 'K',  '\\u0137': 'k', '\\u0138': 'k',\n    '\\u0139': 'L',  '\\u013b': 'L', '\\u013d': 'L', '\\u013f': 'L', '\\u0141': 'L',\n    '\\u013a': 'l',  '\\u013c': 'l', '\\u013e': 'l', '\\u0140': 'l', '\\u0142': 'l',\n    '\\u0143': 'N',  '\\u0145': 'N', '\\u0147': 'N', '\\u014a': 'N',\n    '\\u0144': 'n',  '\\u0146': 'n', '\\u0148': 'n', '\\u014b': 'n',\n    '\\u014c': 'O',  '\\u014e': 'O', '\\u0150': 'O',\n    '\\u014d': 'o',  '\\u014f': 'o', '\\u0151': 'o',\n    '\\u0154': 'R',  '\\u0156': 'R', '\\u0158': 'R',\n    '\\u0155': 'r',  '\\u0157': 'r', '\\u0159': 'r',\n    '\\u015a': 'S',  '\\u015c': 'S', '\\u015e': 'S', '\\u0160': 'S',\n    '\\u015b': 's',  '\\u015d': 's', '\\u015f': 's', '\\u0161': 's',\n    '\\u0162': 'T',  '\\u0164': 'T', '\\u0166': 'T',\n    '\\u0163': 't',  '\\u0165': 't', '\\u0167': 't',\n    '\\u0168': 'U',  '\\u016a': 'U', '\\u016c': 'U', '\\u016e': 'U', '\\u0170': 'U', '\\u0172': 'U',\n    '\\u0169': 'u',  '\\u016b': 'u', '\\u016d': 'u', '\\u016f': 'u', '\\u0171': 'u', '\\u0173': 'u',\n    '\\u0174': 'W',  '\\u0175': 'w',\n    '\\u0176': 'Y',  '\\u0177': 'y', '\\u0178': 'Y',\n    '\\u0179': 'Z',  '\\u017b': 'Z', '\\u017d': 'Z',\n    '\\u017a': 'z',  '\\u017c': 'z', '\\u017e': 'z',\n    '\\u0132': 'IJ', '\\u0133': 'ij',\n    '\\u0152': 'Oe', '\\u0153': 'oe',\n    '\\u0149': \"'n\", '\\u017f': 's'\n  };\n\n  /** Used to map characters to HTML entities. */\n  var htmlEscapes = {\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;',\n    '\"': '&quot;',\n    \"'\": '&#39;'\n  };\n\n  /** Used to map HTML entities to characters. */\n  var htmlUnescapes = {\n    '&amp;': '&',\n    '&lt;': '<',\n    '&gt;': '>',\n    '&quot;': '\"',\n    '&#39;': \"'\"\n  };\n\n  /** Used to escape characters for inclusion in compiled string literals. */\n  var stringEscapes = {\n    '\\\\': '\\\\',\n    \"'\": \"'\",\n    '\\n': 'n',\n    '\\r': 'r',\n    '\\u2028': 'u2028',\n    '\\u2029': 'u2029'\n  };\n\n  /** Built-in method references without a dependency on `root`. */\n  var freeParseFloat = parseFloat,\n      freeParseInt = parseInt;\n\n  /** Detect free variable `global` from Node.js. */\n  var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n  /** Detect free variable `self`. */\n  var freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n  /** Used as a reference to the global object. */\n  var root = freeGlobal || freeSelf || Function('return this')();\n\n  /** Detect free variable `exports`. */\n  var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n  /** Detect free variable `module`. */\n  var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n  /** Detect the popular CommonJS extension `module.exports`. */\n  var moduleExports = freeModule && freeModule.exports === freeExports;\n\n  /** Detect free variable `process` from Node.js. */\n  var freeProcess = moduleExports && freeGlobal.process;\n\n  /** Used to access faster Node.js helpers. */\n  var nodeUtil = (function() {\n    try {\n      // Use `util.types` for Node.js 10+.\n      var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n      if (types) {\n        return types;\n      }\n\n      // Legacy `process.binding('util')` for Node.js < 10.\n      return freeProcess && freeProcess.binding && freeProcess.binding('util');\n    } catch (e) {}\n  }());\n\n  /* Node.js helper references. */\n  var nodeIsArrayBuffer = nodeUtil && nodeUtil.isArrayBuffer,\n      nodeIsDate = nodeUtil && nodeUtil.isDate,\n      nodeIsMap = nodeUtil && nodeUtil.isMap,\n      nodeIsRegExp = nodeUtil && nodeUtil.isRegExp,\n      nodeIsSet = nodeUtil && nodeUtil.isSet,\n      nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * A faster alternative to `Function#apply`, this function invokes `func`\n   * with the `this` binding of `thisArg` and the arguments of `args`.\n   *\n   * @private\n   * @param {Function} func The function to invoke.\n   * @param {*} thisArg The `this` binding of `func`.\n   * @param {Array} args The arguments to invoke `func` with.\n   * @returns {*} Returns the result of `func`.\n   */\n  function apply(func, thisArg, args) {\n    switch (args.length) {\n      case 0: return func.call(thisArg);\n      case 1: return func.call(thisArg, args[0]);\n      case 2: return func.call(thisArg, args[0], args[1]);\n      case 3: return func.call(thisArg, args[0], args[1], args[2]);\n    }\n    return func.apply(thisArg, args);\n  }\n\n  /**\n   * A specialized version of `baseAggregator` for arrays.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} setter The function to set `accumulator` values.\n   * @param {Function} iteratee The iteratee to transform keys.\n   * @param {Object} accumulator The initial aggregated object.\n   * @returns {Function} Returns `accumulator`.\n   */\n  function arrayAggregator(array, setter, iteratee, accumulator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      var value = array[index];\n      setter(accumulator, value, iteratee(value), array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.forEach` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEach(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (iteratee(array[index], index, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.forEachRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEachRight(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n\n    while (length--) {\n      if (iteratee(array[length], length, array) === false) {\n        break;\n      }\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.every` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if all elements pass the predicate check,\n   *  else `false`.\n   */\n  function arrayEvery(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (!predicate(array[index], index, array)) {\n        return false;\n      }\n    }\n    return true;\n  }\n\n  /**\n   * A specialized version of `_.filter` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {Array} Returns the new filtered array.\n   */\n  function arrayFilter(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (predicate(value, index, array)) {\n        result[resIndex++] = value;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.includes` for arrays without support for\n   * specifying an index to search from.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludes(array, value) {\n    var length = array == null ? 0 : array.length;\n    return !!length && baseIndexOf(array, value, 0) > -1;\n  }\n\n  /**\n   * This function is like `arrayIncludes` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludesWith(array, value, comparator) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (comparator(value, array[index])) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * A specialized version of `_.map` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the new mapped array.\n   */\n  function arrayMap(array, iteratee) {\n    var index = -1,\n        length = array == null ? 0 : array.length,\n        result = Array(length);\n\n    while (++index < length) {\n      result[index] = iteratee(array[index], index, array);\n    }\n    return result;\n  }\n\n  /**\n   * Appends the elements of `values` to `array`.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {Array} values The values to append.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayPush(array, values) {\n    var index = -1,\n        length = values.length,\n        offset = array.length;\n\n    while (++index < length) {\n      array[offset + index] = values[index];\n    }\n    return array;\n  }\n\n  /**\n   * A specialized version of `_.reduce` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the first element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduce(array, iteratee, accumulator, initAccum) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    if (initAccum && length) {\n      accumulator = array[++index];\n    }\n    while (++index < length) {\n      accumulator = iteratee(accumulator, array[index], index, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.reduceRight` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the last element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduceRight(array, iteratee, accumulator, initAccum) {\n    var length = array == null ? 0 : array.length;\n    if (initAccum && length) {\n      accumulator = array[--length];\n    }\n    while (length--) {\n      accumulator = iteratee(accumulator, array[length], length, array);\n    }\n    return accumulator;\n  }\n\n  /**\n   * A specialized version of `_.some` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if any element passes the predicate check,\n   *  else `false`.\n   */\n  function arraySome(array, predicate) {\n    var index = -1,\n        length = array == null ? 0 : array.length;\n\n    while (++index < length) {\n      if (predicate(array[index], index, array)) {\n        return true;\n      }\n    }\n    return false;\n  }\n\n  /**\n   * Gets the size of an ASCII `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  var asciiSize = baseProperty('length');\n\n  /**\n   * Converts an ASCII `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function asciiToArray(string) {\n    return string.split('');\n  }\n\n  /**\n   * Splits an ASCII `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function asciiWords(string) {\n    return string.match(reAsciiWord) || [];\n  }\n\n  /**\n   * The base implementation of methods like `_.findKey` and `_.findLastKey`,\n   * without support for iteratee shorthands, which iterates over `collection`\n   * using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the found element or its key, else `undefined`.\n   */\n  function baseFindKey(collection, predicate, eachFunc) {\n    var result;\n    eachFunc(collection, function(value, key, collection) {\n      if (predicate(value, key, collection)) {\n        result = key;\n        return false;\n      }\n    });\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.findIndex` and `_.findLastIndex` without\n   * support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {number} fromIndex The index to search from.\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseFindIndex(array, predicate, fromIndex, fromRight) {\n    var length = array.length,\n        index = fromIndex + (fromRight ? 1 : -1);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (predicate(array[index], index, array)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOf(array, value, fromIndex) {\n    return value === value\n      ? strictIndexOf(array, value, fromIndex)\n      : baseFindIndex(array, baseIsNaN, fromIndex);\n  }\n\n  /**\n   * This function is like `baseIndexOf` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOfWith(array, value, fromIndex, comparator) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (comparator(array[index], value)) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * The base implementation of `_.isNaN` without support for number objects.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n   */\n  function baseIsNaN(value) {\n    return value !== value;\n  }\n\n  /**\n   * The base implementation of `_.mean` and `_.meanBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the mean.\n   */\n  function baseMean(array, iteratee) {\n    var length = array == null ? 0 : array.length;\n    return length ? (baseSum(array, iteratee) / length) : NAN;\n  }\n\n  /**\n   * The base implementation of `_.property` without support for deep paths.\n   *\n   * @private\n   * @param {string} key The key of the property to get.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function baseProperty(key) {\n    return function(object) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.propertyOf` without support for deep paths.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function basePropertyOf(object) {\n    return function(key) {\n      return object == null ? undefined : object[key];\n    };\n  }\n\n  /**\n   * The base implementation of `_.reduce` and `_.reduceRight`, without support\n   * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} accumulator The initial value.\n   * @param {boolean} initAccum Specify using the first or last element of\n   *  `collection` as the initial value.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the accumulated value.\n   */\n  function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n    eachFunc(collection, function(value, index, collection) {\n      accumulator = initAccum\n        ? (initAccum = false, value)\n        : iteratee(accumulator, value, index, collection);\n    });\n    return accumulator;\n  }\n\n  /**\n   * The base implementation of `_.sortBy` which uses `comparer` to define the\n   * sort order of `array` and replaces criteria objects with their corresponding\n   * values.\n   *\n   * @private\n   * @param {Array} array The array to sort.\n   * @param {Function} comparer The function to define sort order.\n   * @returns {Array} Returns `array`.\n   */\n  function baseSortBy(array, comparer) {\n    var length = array.length;\n\n    array.sort(comparer);\n    while (length--) {\n      array[length] = array[length].value;\n    }\n    return array;\n  }\n\n  /**\n   * The base implementation of `_.sum` and `_.sumBy` without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {number} Returns the sum.\n   */\n  function baseSum(array, iteratee) {\n    var result,\n        index = -1,\n        length = array.length;\n\n    while (++index < length) {\n      var current = iteratee(array[index]);\n      if (current !== undefined) {\n        result = result === undefined ? current : (result + current);\n      }\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.times` without support for iteratee shorthands\n   * or max array length checks.\n   *\n   * @private\n   * @param {number} n The number of times to invoke `iteratee`.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the array of results.\n   */\n  function baseTimes(n, iteratee) {\n    var index = -1,\n        result = Array(n);\n\n    while (++index < n) {\n      result[index] = iteratee(index);\n    }\n    return result;\n  }\n\n  /**\n   * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array\n   * of key-value pairs for `object` corresponding to the property names of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the key-value pairs.\n   */\n  function baseToPairs(object, props) {\n    return arrayMap(props, function(key) {\n      return [key, object[key]];\n    });\n  }\n\n  /**\n   * The base implementation of `_.trim`.\n   *\n   * @private\n   * @param {string} string The string to trim.\n   * @returns {string} Returns the trimmed string.\n   */\n  function baseTrim(string) {\n    return string\n      ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n      : string;\n  }\n\n  /**\n   * The base implementation of `_.unary` without support for storing metadata.\n   *\n   * @private\n   * @param {Function} func The function to cap arguments for.\n   * @returns {Function} Returns the new capped function.\n   */\n  function baseUnary(func) {\n    return function(value) {\n      return func(value);\n    };\n  }\n\n  /**\n   * The base implementation of `_.values` and `_.valuesIn` which creates an\n   * array of `object` property values corresponding to the property names\n   * of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the array of property values.\n   */\n  function baseValues(object, props) {\n    return arrayMap(props, function(key) {\n      return object[key];\n    });\n  }\n\n  /**\n   * Checks if a `cache` value for `key` exists.\n   *\n   * @private\n   * @param {Object} cache The cache to query.\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function cacheHas(cache, key) {\n    return cache.has(key);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimStart` to get the index of the first string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the first unmatched string symbol.\n   */\n  function charsStartIndex(strSymbols, chrSymbols) {\n    var index = -1,\n        length = strSymbols.length;\n\n    while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol\n   * that is not found in the character symbols.\n   *\n   * @private\n   * @param {Array} strSymbols The string symbols to inspect.\n   * @param {Array} chrSymbols The character symbols to find.\n   * @returns {number} Returns the index of the last unmatched string symbol.\n   */\n  function charsEndIndex(strSymbols, chrSymbols) {\n    var index = strSymbols.length;\n\n    while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}\n    return index;\n  }\n\n  /**\n   * Gets the number of `placeholder` occurrences in `array`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} placeholder The placeholder to search for.\n   * @returns {number} Returns the placeholder count.\n   */\n  function countHolders(array, placeholder) {\n    var length = array.length,\n        result = 0;\n\n    while (length--) {\n      if (array[length] === placeholder) {\n        ++result;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Used by `_.deburr` to convert Latin-1 Supplement and Latin Extended-A\n   * letters to basic Latin letters.\n   *\n   * @private\n   * @param {string} letter The matched letter to deburr.\n   * @returns {string} Returns the deburred letter.\n   */\n  var deburrLetter = basePropertyOf(deburredLetters);\n\n  /**\n   * Used by `_.escape` to convert characters to HTML entities.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  var escapeHtmlChar = basePropertyOf(htmlEscapes);\n\n  /**\n   * Used by `_.template` to escape characters for inclusion in compiled string literals.\n   *\n   * @private\n   * @param {string} chr The matched character to escape.\n   * @returns {string} Returns the escaped character.\n   */\n  function escapeStringChar(chr) {\n    return '\\\\' + stringEscapes[chr];\n  }\n\n  /**\n   * Gets the value at `key` of `object`.\n   *\n   * @private\n   * @param {Object} [object] The object to query.\n   * @param {string} key The key of the property to get.\n   * @returns {*} Returns the property value.\n   */\n  function getValue(object, key) {\n    return object == null ? undefined : object[key];\n  }\n\n  /**\n   * Checks if `string` contains Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n   */\n  function hasUnicode(string) {\n    return reHasUnicode.test(string);\n  }\n\n  /**\n   * Checks if `string` contains a word composed of Unicode symbols.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {boolean} Returns `true` if a word is found, else `false`.\n   */\n  function hasUnicodeWord(string) {\n    return reHasUnicodeWord.test(string);\n  }\n\n  /**\n   * Converts `iterator` to an array.\n   *\n   * @private\n   * @param {Object} iterator The iterator to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function iteratorToArray(iterator) {\n    var data,\n        result = [];\n\n    while (!(data = iterator.next()).done) {\n      result.push(data.value);\n    }\n    return result;\n  }\n\n  /**\n   * Converts `map` to its key-value pairs.\n   *\n   * @private\n   * @param {Object} map The map to convert.\n   * @returns {Array} Returns the key-value pairs.\n   */\n  function mapToArray(map) {\n    var index = -1,\n        result = Array(map.size);\n\n    map.forEach(function(value, key) {\n      result[++index] = [key, value];\n    });\n    return result;\n  }\n\n  /**\n   * Creates a unary function that invokes `func` with its argument transformed.\n   *\n   * @private\n   * @param {Function} func The function to wrap.\n   * @param {Function} transform The argument transform.\n   * @returns {Function} Returns the new function.\n   */\n  function overArg(func, transform) {\n    return function(arg) {\n      return func(transform(arg));\n    };\n  }\n\n  /**\n   * Replaces all `placeholder` elements in `array` with an internal placeholder\n   * and returns an array of their indexes.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {*} placeholder The placeholder to replace.\n   * @returns {Array} Returns the new array of placeholder indexes.\n   */\n  function replaceHolders(array, placeholder) {\n    var index = -1,\n        length = array.length,\n        resIndex = 0,\n        result = [];\n\n    while (++index < length) {\n      var value = array[index];\n      if (value === placeholder || value === PLACEHOLDER) {\n        array[index] = PLACEHOLDER;\n        result[resIndex++] = index;\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Converts `set` to an array of its values.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the values.\n   */\n  function setToArray(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = value;\n    });\n    return result;\n  }\n\n  /**\n   * Converts `set` to its value-value pairs.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the value-value pairs.\n   */\n  function setToPairs(set) {\n    var index = -1,\n        result = Array(set.size);\n\n    set.forEach(function(value) {\n      result[++index] = [value, value];\n    });\n    return result;\n  }\n\n  /**\n   * A specialized version of `_.indexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictIndexOf(array, value, fromIndex) {\n    var index = fromIndex - 1,\n        length = array.length;\n\n    while (++index < length) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return -1;\n  }\n\n  /**\n   * A specialized version of `_.lastIndexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictLastIndexOf(array, value, fromIndex) {\n    var index = fromIndex + 1;\n    while (index--) {\n      if (array[index] === value) {\n        return index;\n      }\n    }\n    return index;\n  }\n\n  /**\n   * Gets the number of symbols in `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the string size.\n   */\n  function stringSize(string) {\n    return hasUnicode(string)\n      ? unicodeSize(string)\n      : asciiSize(string);\n  }\n\n  /**\n   * Converts `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function stringToArray(string) {\n    return hasUnicode(string)\n      ? unicodeToArray(string)\n      : asciiToArray(string);\n  }\n\n  /**\n   * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n   * character of `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the index of the last non-whitespace character.\n   */\n  function trimmedEndIndex(string) {\n    var index = string.length;\n\n    while (index-- && reWhitespace.test(string.charAt(index))) {}\n    return index;\n  }\n\n  /**\n   * Used by `_.unescape` to convert HTML entities to characters.\n   *\n   * @private\n   * @param {string} chr The matched character to unescape.\n   * @returns {string} Returns the unescaped character.\n   */\n  var unescapeHtmlChar = basePropertyOf(htmlUnescapes);\n\n  /**\n   * Gets the size of a Unicode `string`.\n   *\n   * @private\n   * @param {string} string The string inspect.\n   * @returns {number} Returns the string size.\n   */\n  function unicodeSize(string) {\n    var result = reUnicode.lastIndex = 0;\n    while (reUnicode.test(string)) {\n      ++result;\n    }\n    return result;\n  }\n\n  /**\n   * Converts a Unicode `string` to an array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the converted array.\n   */\n  function unicodeToArray(string) {\n    return string.match(reUnicode) || [];\n  }\n\n  /**\n   * Splits a Unicode `string` into an array of its words.\n   *\n   * @private\n   * @param {string} The string to inspect.\n   * @returns {Array} Returns the words of `string`.\n   */\n  function unicodeWords(string) {\n    return string.match(reUnicodeWord) || [];\n  }\n\n  /*--------------------------------------------------------------------------*/\n\n  /**\n   * Create a new pristine `lodash` function using the `context` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 1.1.0\n   * @category Util\n   * @param {Object} [context=root] The context object.\n   * @returns {Function} Returns a new `lodash` function.\n   * @example\n   *\n   * _.mixin({ 'foo': _.constant('foo') });\n   *\n   * var lodash = _.runInContext();\n   * lodash.mixin({ 'bar': lodash.constant('bar') });\n   *\n   * _.isFunction(_.foo);\n   * // => true\n   * _.isFunction(_.bar);\n   * // => false\n   *\n   * lodash.isFunction(lodash.foo);\n   * // => false\n   * lodash.isFunction(lodash.bar);\n   * // => true\n   *\n   * // Create a suped-up `defer` in Node.js.\n   * var defer = _.runInContext({ 'setTimeout': setImmediate }).defer;\n   */\n  var runInContext = (function runInContext(context) {\n    context = context == null ? root : _.defaults(root.Object(), context, _.pick(root, contextProps));\n\n    /** Built-in constructor references. */\n    var Array = context.Array,\n        Date = context.Date,\n        Error = context.Error,\n        Function = context.Function,\n        Math = context.Math,\n        Object = context.Object,\n        RegExp = context.RegExp,\n        String = context.String,\n        TypeError = context.TypeError;\n\n    /** Used for built-in method references. */\n    var arrayProto = Array.prototype,\n        funcProto = Function.prototype,\n        objectProto = Object.prototype;\n\n    /** Used to detect overreaching core-js shims. */\n    var coreJsData = context['__core-js_shared__'];\n\n    /** Used to resolve the decompiled source of functions. */\n    var funcToString = funcProto.toString;\n\n    /** Used to check objects for own properties. */\n    var hasOwnProperty = objectProto.hasOwnProperty;\n\n    /** Used to generate unique IDs. */\n    var idCounter = 0;\n\n    /** Used to detect methods masquerading as native. */\n    var maskSrcKey = (function() {\n      var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n      return uid ? ('Symbol(src)_1.' + uid) : '';\n    }());\n\n    /**\n     * Used to resolve the\n     * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n     * of values.\n     */\n    var nativeObjectToString = objectProto.toString;\n\n    /** Used to infer the `Object` constructor. */\n    var objectCtorString = funcToString.call(Object);\n\n    /** Used to restore the original `_` reference in `_.noConflict`. */\n    var oldDash = root._;\n\n    /** Used to detect if a method is native. */\n    var reIsNative = RegExp('^' +\n      funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n      .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n    );\n\n    /** Built-in value references. */\n    var Buffer = moduleExports ? context.Buffer : undefined,\n        Symbol = context.Symbol,\n        Uint8Array = context.Uint8Array,\n        allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined,\n        getPrototype = overArg(Object.getPrototypeOf, Object),\n        objectCreate = Object.create,\n        propertyIsEnumerable = objectProto.propertyIsEnumerable,\n        splice = arrayProto.splice,\n        spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined,\n        symIterator = Symbol ? Symbol.iterator : undefined,\n        symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n    var defineProperty = (function() {\n      try {\n        var func = getNative(Object, 'defineProperty');\n        func({}, '', {});\n        return func;\n      } catch (e) {}\n    }());\n\n    /** Mocked built-ins. */\n    var ctxClearTimeout = context.clearTimeout !== root.clearTimeout && context.clearTimeout,\n        ctxNow = Date && Date.now !== root.Date.now && Date.now,\n        ctxSetTimeout = context.setTimeout !== root.setTimeout && context.setTimeout;\n\n    /* Built-in method references for those with the same name as other `lodash` methods. */\n    var nativeCeil = Math.ceil,\n        nativeFloor = Math.floor,\n        nativeGetSymbols = Object.getOwnPropertySymbols,\n        nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,\n        nativeIsFinite = context.isFinite,\n        nativeJoin = arrayProto.join,\n        nativeKeys = overArg(Object.keys, Object),\n        nativeMax = Math.max,\n        nativeMin = Math.min,\n        nativeNow = Date.now,\n        nativeParseInt = context.parseInt,\n        nativeRandom = Math.random,\n        nativeReverse = arrayProto.reverse;\n\n    /* Built-in method references that are verified to be native. */\n    var DataView = getNative(context, 'DataView'),\n        Map = getNative(context, 'Map'),\n        Promise = getNative(context, 'Promise'),\n        Set = getNative(context, 'Set'),\n        WeakMap = getNative(context, 'WeakMap'),\n        nativeCreate = getNative(Object, 'create');\n\n    /** Used to store function metadata. */\n    var metaMap = WeakMap && new WeakMap;\n\n    /** Used to lookup unminified function names. */\n    var realNames = {};\n\n    /** Used to detect maps, sets, and weakmaps. */\n    var dataViewCtorString = toSource(DataView),\n        mapCtorString = toSource(Map),\n        promiseCtorString = toSource(Promise),\n        setCtorString = toSource(Set),\n        weakMapCtorString = toSource(WeakMap);\n\n    /** Used to convert symbols to primitives and strings. */\n    var symbolProto = Symbol ? Symbol.prototype : undefined,\n        symbolValueOf = symbolProto ? symbolProto.valueOf : undefined,\n        symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` object which wraps `value` to enable implicit method\n     * chain sequences. Methods that operate on and return arrays, collections,\n     * and functions can be chained together. Methods that retrieve a single value\n     * or may return a primitive value will automatically end the chain sequence\n     * and return the unwrapped value. Otherwise, the value must be unwrapped\n     * with `_#value`.\n     *\n     * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n     * enabled using `_.chain`.\n     *\n     * The execution of chained methods is lazy, that is, it's deferred until\n     * `_#value` is implicitly or explicitly called.\n     *\n     * Lazy evaluation allows several methods to support shortcut fusion.\n     * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n     * the creation of intermediate arrays and can greatly reduce the number of\n     * iteratee executions. Sections of a chain sequence qualify for shortcut\n     * fusion if the section is applied to an array and iteratees accept only\n     * one argument. The heuristic for whether a section qualifies for shortcut\n     * fusion is subject to change.\n     *\n     * Chaining is supported in custom builds as long as the `_#value` method is\n     * directly or indirectly included in the build.\n     *\n     * In addition to lodash methods, wrappers have `Array` and `String` methods.\n     *\n     * The wrapper `Array` methods are:\n     * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n     *\n     * The wrapper `String` methods are:\n     * `replace` and `split`\n     *\n     * The wrapper methods that support shortcut fusion are:\n     * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n     * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n     * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n     *\n     * The chainable wrapper methods are:\n     * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n     * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n     * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n     * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n     * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n     * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n     * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n     * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n     * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n     * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n     * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n     * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n     * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n     * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n     * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n     * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n     * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n     * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n     * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n     * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n     * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n     * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n     * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n     * `zipObject`, `zipObjectDeep`, and `zipWith`\n     *\n     * The wrapper methods that are **not** chainable by default are:\n     * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n     * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n     * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n     * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n     * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n     * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n     * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n     * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n     * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n     * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n     * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n     * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n     * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n     * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n     * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n     * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n     * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n     * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n     * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n     * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n     * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n     * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n     * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n     * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n     * `upperFirst`, `value`, and `words`\n     *\n     * @name _\n     * @constructor\n     * @category Seq\n     * @param {*} value The value to wrap in a `lodash` instance.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2, 3]);\n     *\n     * // Returns an unwrapped value.\n     * wrapped.reduce(_.add);\n     * // => 6\n     *\n     * // Returns a wrapped value.\n     * var squares = wrapped.map(square);\n     *\n     * _.isArray(squares);\n     * // => false\n     *\n     * _.isArray(squares.value());\n     * // => true\n     */\n    function lodash(value) {\n      if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n        if (value instanceof LodashWrapper) {\n          return value;\n        }\n        if (hasOwnProperty.call(value, '__wrapped__')) {\n          return wrapperClone(value);\n        }\n      }\n      return new LodashWrapper(value);\n    }\n\n    /**\n     * The base implementation of `_.create` without support for assigning\n     * properties to the created object.\n     *\n     * @private\n     * @param {Object} proto The object to inherit from.\n     * @returns {Object} Returns the new object.\n     */\n    var baseCreate = (function() {\n      function object() {}\n      return function(proto) {\n        if (!isObject(proto)) {\n          return {};\n        }\n        if (objectCreate) {\n          return objectCreate(proto);\n        }\n        object.prototype = proto;\n        var result = new object;\n        object.prototype = undefined;\n        return result;\n      };\n    }());\n\n    /**\n     * The function whose prototype chain sequence wrappers inherit from.\n     *\n     * @private\n     */\n    function baseLodash() {\n      // No operation performed.\n    }\n\n    /**\n     * The base constructor for creating `lodash` wrapper objects.\n     *\n     * @private\n     * @param {*} value The value to wrap.\n     * @param {boolean} [chainAll] Enable explicit method chain sequences.\n     */\n    function LodashWrapper(value, chainAll) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__chain__ = !!chainAll;\n      this.__index__ = 0;\n      this.__values__ = undefined;\n    }\n\n    /**\n     * By default, the template delimiters used by lodash are like those in\n     * embedded Ruby (ERB) as well as ES2015 template strings. Change the\n     * following template settings to use alternative delimiters.\n     *\n     * @static\n     * @memberOf _\n     * @type {Object}\n     */\n    lodash.templateSettings = {\n\n      /**\n       * Used to detect `data` property values to be HTML-escaped.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'escape': reEscape,\n\n      /**\n       * Used to detect code to be evaluated.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'evaluate': reEvaluate,\n\n      /**\n       * Used to detect `data` property values to inject.\n       *\n       * @memberOf _.templateSettings\n       * @type {RegExp}\n       */\n      'interpolate': reInterpolate,\n\n      /**\n       * Used to reference the data object in the template text.\n       *\n       * @memberOf _.templateSettings\n       * @type {string}\n       */\n      'variable': '',\n\n      /**\n       * Used to import variables into the compiled template.\n       *\n       * @memberOf _.templateSettings\n       * @type {Object}\n       */\n      'imports': {\n\n        /**\n         * A reference to the `lodash` function.\n         *\n         * @memberOf _.templateSettings.imports\n         * @type {Function}\n         */\n        '_': lodash\n      }\n    };\n\n    // Ensure wrappers are instances of `baseLodash`.\n    lodash.prototype = baseLodash.prototype;\n    lodash.prototype.constructor = lodash;\n\n    LodashWrapper.prototype = baseCreate(baseLodash.prototype);\n    LodashWrapper.prototype.constructor = LodashWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n     *\n     * @private\n     * @constructor\n     * @param {*} value The value to wrap.\n     */\n    function LazyWrapper(value) {\n      this.__wrapped__ = value;\n      this.__actions__ = [];\n      this.__dir__ = 1;\n      this.__filtered__ = false;\n      this.__iteratees__ = [];\n      this.__takeCount__ = MAX_ARRAY_LENGTH;\n      this.__views__ = [];\n    }\n\n    /**\n     * Creates a clone of the lazy wrapper object.\n     *\n     * @private\n     * @name clone\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the cloned `LazyWrapper` object.\n     */\n    function lazyClone() {\n      var result = new LazyWrapper(this.__wrapped__);\n      result.__actions__ = copyArray(this.__actions__);\n      result.__dir__ = this.__dir__;\n      result.__filtered__ = this.__filtered__;\n      result.__iteratees__ = copyArray(this.__iteratees__);\n      result.__takeCount__ = this.__takeCount__;\n      result.__views__ = copyArray(this.__views__);\n      return result;\n    }\n\n    /**\n     * Reverses the direction of lazy iteration.\n     *\n     * @private\n     * @name reverse\n     * @memberOf LazyWrapper\n     * @returns {Object} Returns the new reversed `LazyWrapper` object.\n     */\n    function lazyReverse() {\n      if (this.__filtered__) {\n        var result = new LazyWrapper(this);\n        result.__dir__ = -1;\n        result.__filtered__ = true;\n      } else {\n        result = this.clone();\n        result.__dir__ *= -1;\n      }\n      return result;\n    }\n\n    /**\n     * Extracts the unwrapped value from its lazy wrapper.\n     *\n     * @private\n     * @name value\n     * @memberOf LazyWrapper\n     * @returns {*} Returns the unwrapped value.\n     */\n    function lazyValue() {\n      var array = this.__wrapped__.value(),\n          dir = this.__dir__,\n          isArr = isArray(array),\n          isRight = dir < 0,\n          arrLength = isArr ? array.length : 0,\n          view = getView(0, arrLength, this.__views__),\n          start = view.start,\n          end = view.end,\n          length = end - start,\n          index = isRight ? end : (start - 1),\n          iteratees = this.__iteratees__,\n          iterLength = iteratees.length,\n          resIndex = 0,\n          takeCount = nativeMin(length, this.__takeCount__);\n\n      if (!isArr || (!isRight && arrLength == length && takeCount == length)) {\n        return baseWrapperValue(array, this.__actions__);\n      }\n      var result = [];\n\n      outer:\n      while (length-- && resIndex < takeCount) {\n        index += dir;\n\n        var iterIndex = -1,\n            value = array[index];\n\n        while (++iterIndex < iterLength) {\n          var data = iteratees[iterIndex],\n              iteratee = data.iteratee,\n              type = data.type,\n              computed = iteratee(value);\n\n          if (type == LAZY_MAP_FLAG) {\n            value = computed;\n          } else if (!computed) {\n            if (type == LAZY_FILTER_FLAG) {\n              continue outer;\n            } else {\n              break outer;\n            }\n          }\n        }\n        result[resIndex++] = value;\n      }\n      return result;\n    }\n\n    // Ensure `LazyWrapper` is an instance of `baseLodash`.\n    LazyWrapper.prototype = baseCreate(baseLodash.prototype);\n    LazyWrapper.prototype.constructor = LazyWrapper;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a hash object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Hash(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the hash.\n     *\n     * @private\n     * @name clear\n     * @memberOf Hash\n     */\n    function hashClear() {\n      this.__data__ = nativeCreate ? nativeCreate(null) : {};\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the hash.\n     *\n     * @private\n     * @name delete\n     * @memberOf Hash\n     * @param {Object} hash The hash to modify.\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function hashDelete(key) {\n      var result = this.has(key) && delete this.__data__[key];\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the hash value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Hash\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function hashGet(key) {\n      var data = this.__data__;\n      if (nativeCreate) {\n        var result = data[key];\n        return result === HASH_UNDEFINED ? undefined : result;\n      }\n      return hasOwnProperty.call(data, key) ? data[key] : undefined;\n    }\n\n    /**\n     * Checks if a hash value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Hash\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function hashHas(key) {\n      var data = this.__data__;\n      return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n    }\n\n    /**\n     * Sets the hash `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Hash\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the hash instance.\n     */\n    function hashSet(key, value) {\n      var data = this.__data__;\n      this.size += this.has(key) ? 0 : 1;\n      data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n      return this;\n    }\n\n    // Add methods to `Hash`.\n    Hash.prototype.clear = hashClear;\n    Hash.prototype['delete'] = hashDelete;\n    Hash.prototype.get = hashGet;\n    Hash.prototype.has = hashHas;\n    Hash.prototype.set = hashSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an list cache object.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function ListCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the list cache.\n     *\n     * @private\n     * @name clear\n     * @memberOf ListCache\n     */\n    function listCacheClear() {\n      this.__data__ = [];\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the list cache.\n     *\n     * @private\n     * @name delete\n     * @memberOf ListCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function listCacheDelete(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        return false;\n      }\n      var lastIndex = data.length - 1;\n      if (index == lastIndex) {\n        data.pop();\n      } else {\n        splice.call(data, index, 1);\n      }\n      --this.size;\n      return true;\n    }\n\n    /**\n     * Gets the list cache value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf ListCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function listCacheGet(key) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      return index < 0 ? undefined : data[index][1];\n    }\n\n    /**\n     * Checks if a list cache value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf ListCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function listCacheHas(key) {\n      return assocIndexOf(this.__data__, key) > -1;\n    }\n\n    /**\n     * Sets the list cache `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf ListCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the list cache instance.\n     */\n    function listCacheSet(key, value) {\n      var data = this.__data__,\n          index = assocIndexOf(data, key);\n\n      if (index < 0) {\n        ++this.size;\n        data.push([key, value]);\n      } else {\n        data[index][1] = value;\n      }\n      return this;\n    }\n\n    // Add methods to `ListCache`.\n    ListCache.prototype.clear = listCacheClear;\n    ListCache.prototype['delete'] = listCacheDelete;\n    ListCache.prototype.get = listCacheGet;\n    ListCache.prototype.has = listCacheHas;\n    ListCache.prototype.set = listCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a map cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function MapCache(entries) {\n      var index = -1,\n          length = entries == null ? 0 : entries.length;\n\n      this.clear();\n      while (++index < length) {\n        var entry = entries[index];\n        this.set(entry[0], entry[1]);\n      }\n    }\n\n    /**\n     * Removes all key-value entries from the map.\n     *\n     * @private\n     * @name clear\n     * @memberOf MapCache\n     */\n    function mapCacheClear() {\n      this.size = 0;\n      this.__data__ = {\n        'hash': new Hash,\n        'map': new (Map || ListCache),\n        'string': new Hash\n      };\n    }\n\n    /**\n     * Removes `key` and its value from the map.\n     *\n     * @private\n     * @name delete\n     * @memberOf MapCache\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function mapCacheDelete(key) {\n      var result = getMapData(this, key)['delete'](key);\n      this.size -= result ? 1 : 0;\n      return result;\n    }\n\n    /**\n     * Gets the map value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf MapCache\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function mapCacheGet(key) {\n      return getMapData(this, key).get(key);\n    }\n\n    /**\n     * Checks if a map value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf MapCache\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function mapCacheHas(key) {\n      return getMapData(this, key).has(key);\n    }\n\n    /**\n     * Sets the map `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf MapCache\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the map cache instance.\n     */\n    function mapCacheSet(key, value) {\n      var data = getMapData(this, key),\n          size = data.size;\n\n      data.set(key, value);\n      this.size += data.size == size ? 0 : 1;\n      return this;\n    }\n\n    // Add methods to `MapCache`.\n    MapCache.prototype.clear = mapCacheClear;\n    MapCache.prototype['delete'] = mapCacheDelete;\n    MapCache.prototype.get = mapCacheGet;\n    MapCache.prototype.has = mapCacheHas;\n    MapCache.prototype.set = mapCacheSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     *\n     * Creates an array cache object to store unique values.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [values] The values to cache.\n     */\n    function SetCache(values) {\n      var index = -1,\n          length = values == null ? 0 : values.length;\n\n      this.__data__ = new MapCache;\n      while (++index < length) {\n        this.add(values[index]);\n      }\n    }\n\n    /**\n     * Adds `value` to the array cache.\n     *\n     * @private\n     * @name add\n     * @memberOf SetCache\n     * @alias push\n     * @param {*} value The value to cache.\n     * @returns {Object} Returns the cache instance.\n     */\n    function setCacheAdd(value) {\n      this.__data__.set(value, HASH_UNDEFINED);\n      return this;\n    }\n\n    /**\n     * Checks if `value` is in the array cache.\n     *\n     * @private\n     * @name has\n     * @memberOf SetCache\n     * @param {*} value The value to search for.\n     * @returns {number} Returns `true` if `value` is found, else `false`.\n     */\n    function setCacheHas(value) {\n      return this.__data__.has(value);\n    }\n\n    // Add methods to `SetCache`.\n    SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\n    SetCache.prototype.has = setCacheHas;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a stack cache object to store key-value pairs.\n     *\n     * @private\n     * @constructor\n     * @param {Array} [entries] The key-value pairs to cache.\n     */\n    function Stack(entries) {\n      var data = this.__data__ = new ListCache(entries);\n      this.size = data.size;\n    }\n\n    /**\n     * Removes all key-value entries from the stack.\n     *\n     * @private\n     * @name clear\n     * @memberOf Stack\n     */\n    function stackClear() {\n      this.__data__ = new ListCache;\n      this.size = 0;\n    }\n\n    /**\n     * Removes `key` and its value from the stack.\n     *\n     * @private\n     * @name delete\n     * @memberOf Stack\n     * @param {string} key The key of the value to remove.\n     * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n     */\n    function stackDelete(key) {\n      var data = this.__data__,\n          result = data['delete'](key);\n\n      this.size = data.size;\n      return result;\n    }\n\n    /**\n     * Gets the stack value for `key`.\n     *\n     * @private\n     * @name get\n     * @memberOf Stack\n     * @param {string} key The key of the value to get.\n     * @returns {*} Returns the entry value.\n     */\n    function stackGet(key) {\n      return this.__data__.get(key);\n    }\n\n    /**\n     * Checks if a stack value for `key` exists.\n     *\n     * @private\n     * @name has\n     * @memberOf Stack\n     * @param {string} key The key of the entry to check.\n     * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n     */\n    function stackHas(key) {\n      return this.__data__.has(key);\n    }\n\n    /**\n     * Sets the stack `key` to `value`.\n     *\n     * @private\n     * @name set\n     * @memberOf Stack\n     * @param {string} key The key of the value to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns the stack cache instance.\n     */\n    function stackSet(key, value) {\n      var data = this.__data__;\n      if (data instanceof ListCache) {\n        var pairs = data.__data__;\n        if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n          pairs.push([key, value]);\n          this.size = ++data.size;\n          return this;\n        }\n        data = this.__data__ = new MapCache(pairs);\n      }\n      data.set(key, value);\n      this.size = data.size;\n      return this;\n    }\n\n    // Add methods to `Stack`.\n    Stack.prototype.clear = stackClear;\n    Stack.prototype['delete'] = stackDelete;\n    Stack.prototype.get = stackGet;\n    Stack.prototype.has = stackHas;\n    Stack.prototype.set = stackSet;\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of the enumerable property names of the array-like `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @param {boolean} inherited Specify returning inherited property names.\n     * @returns {Array} Returns the array of property names.\n     */\n    function arrayLikeKeys(value, inherited) {\n      var isArr = isArray(value),\n          isArg = !isArr && isArguments(value),\n          isBuff = !isArr && !isArg && isBuffer(value),\n          isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n          skipIndexes = isArr || isArg || isBuff || isType,\n          result = skipIndexes ? baseTimes(value.length, String) : [],\n          length = result.length;\n\n      for (var key in value) {\n        if ((inherited || hasOwnProperty.call(value, key)) &&\n            !(skipIndexes && (\n               // Safari 9 has enumerable `arguments.length` in strict mode.\n               key == 'length' ||\n               // Node.js 0.10 has enumerable non-index properties on buffers.\n               (isBuff && (key == 'offset' || key == 'parent')) ||\n               // PhantomJS 2 has enumerable non-index properties on typed arrays.\n               (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n               // Skip index properties.\n               isIndex(key, length)\n            ))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `_.sample` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @returns {*} Returns the random element.\n     */\n    function arraySample(array) {\n      var length = array.length;\n      return length ? array[baseRandom(0, length - 1)] : undefined;\n    }\n\n    /**\n     * A specialized version of `_.sampleSize` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function arraySampleSize(array, n) {\n      return shuffleSelf(copyArray(array), baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * A specialized version of `_.shuffle` for arrays.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function arrayShuffle(array) {\n      return shuffleSelf(copyArray(array));\n    }\n\n    /**\n     * This function is like `assignValue` except that it doesn't assign\n     * `undefined` values.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignMergeValue(object, key, value) {\n      if ((value !== undefined && !eq(object[key], value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Assigns `value` to `key` of `object` if the existing value is not equivalent\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function assignValue(object, key, value) {\n      var objValue = object[key];\n      if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n          (value === undefined && !(key in object))) {\n        baseAssignValue(object, key, value);\n      }\n    }\n\n    /**\n     * Gets the index at which the `key` is found in `array` of key-value pairs.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {*} key The key to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     */\n    function assocIndexOf(array, key) {\n      var length = array.length;\n      while (length--) {\n        if (eq(array[length][0], key)) {\n          return length;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * Aggregates elements of `collection` on `accumulator` with keys transformed\n     * by `iteratee` and values set by `setter`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform keys.\n     * @param {Object} accumulator The initial aggregated object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseAggregator(collection, setter, iteratee, accumulator) {\n      baseEach(collection, function(value, key, collection) {\n        setter(accumulator, value, iteratee(value), collection);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.assign` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssign(object, source) {\n      return object && copyObject(source, keys(source), object);\n    }\n\n    /**\n     * The base implementation of `_.assignIn` without support for multiple sources\n     * or `customizer` functions.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @returns {Object} Returns `object`.\n     */\n    function baseAssignIn(object, source) {\n      return object && copyObject(source, keysIn(source), object);\n    }\n\n    /**\n     * The base implementation of `assignValue` and `assignMergeValue` without\n     * value checks.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {string} key The key of the property to assign.\n     * @param {*} value The value to assign.\n     */\n    function baseAssignValue(object, key, value) {\n      if (key == '__proto__' && defineProperty) {\n        defineProperty(object, key, {\n          'configurable': true,\n          'enumerable': true,\n          'value': value,\n          'writable': true\n        });\n      } else {\n        object[key] = value;\n      }\n    }\n\n    /**\n     * The base implementation of `_.at` without support for individual paths.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Array} Returns the picked elements.\n     */\n    function baseAt(object, paths) {\n      var index = -1,\n          length = paths.length,\n          result = Array(length),\n          skip = object == null;\n\n      while (++index < length) {\n        result[index] = skip ? undefined : get(object, paths[index]);\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.clamp` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     */\n    function baseClamp(number, lower, upper) {\n      if (number === number) {\n        if (upper !== undefined) {\n          number = number <= upper ? number : upper;\n        }\n        if (lower !== undefined) {\n          number = number >= lower ? number : lower;\n        }\n      }\n      return number;\n    }\n\n    /**\n     * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n     * traversed objects.\n     *\n     * @private\n     * @param {*} value The value to clone.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Deep clone\n     *  2 - Flatten inherited properties\n     *  4 - Clone symbols\n     * @param {Function} [customizer] The function to customize cloning.\n     * @param {string} [key] The key of `value`.\n     * @param {Object} [object] The parent object of `value`.\n     * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n     * @returns {*} Returns the cloned value.\n     */\n    function baseClone(value, bitmask, customizer, key, object, stack) {\n      var result,\n          isDeep = bitmask & CLONE_DEEP_FLAG,\n          isFlat = bitmask & CLONE_FLAT_FLAG,\n          isFull = bitmask & CLONE_SYMBOLS_FLAG;\n\n      if (customizer) {\n        result = object ? customizer(value, key, object, stack) : customizer(value);\n      }\n      if (result !== undefined) {\n        return result;\n      }\n      if (!isObject(value)) {\n        return value;\n      }\n      var isArr = isArray(value);\n      if (isArr) {\n        result = initCloneArray(value);\n        if (!isDeep) {\n          return copyArray(value, result);\n        }\n      } else {\n        var tag = getTag(value),\n            isFunc = tag == funcTag || tag == genTag;\n\n        if (isBuffer(value)) {\n          return cloneBuffer(value, isDeep);\n        }\n        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {\n          result = (isFlat || isFunc) ? {} : initCloneObject(value);\n          if (!isDeep) {\n            return isFlat\n              ? copySymbolsIn(value, baseAssignIn(result, value))\n              : copySymbols(value, baseAssign(result, value));\n          }\n        } else {\n          if (!cloneableTags[tag]) {\n            return object ? value : {};\n          }\n          result = initCloneByTag(value, tag, isDeep);\n        }\n      }\n      // Check for circular references and return its corresponding clone.\n      stack || (stack = new Stack);\n      var stacked = stack.get(value);\n      if (stacked) {\n        return stacked;\n      }\n      stack.set(value, result);\n\n      if (isSet(value)) {\n        value.forEach(function(subValue) {\n          result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));\n        });\n      } else if (isMap(value)) {\n        value.forEach(function(subValue, key) {\n          result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));\n        });\n      }\n\n      var keysFunc = isFull\n        ? (isFlat ? getAllKeysIn : getAllKeys)\n        : (isFlat ? keysIn : keys);\n\n      var props = isArr ? undefined : keysFunc(value);\n      arrayEach(props || value, function(subValue, key) {\n        if (props) {\n          key = subValue;\n          subValue = value[key];\n        }\n        // Recursively populate clone (susceptible to call stack limits).\n        assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.conforms` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseConforms(source) {\n      var props = keys(source);\n      return function(object) {\n        return baseConformsTo(object, source, props);\n      };\n    }\n\n    /**\n     * The base implementation of `_.conformsTo` which accepts `props` to check.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     */\n    function baseConformsTo(object, source, props) {\n      var length = props.length;\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (length--) {\n        var key = props[length],\n            predicate = source[key],\n            value = object[key];\n\n        if ((value === undefined && !(key in object)) || !predicate(value)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.delay` and `_.defer` which accepts `args`\n     * to provide to `func`.\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {Array} args The arguments to provide to `func`.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    function baseDelay(func, wait, args) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return setTimeout(function() { func.apply(undefined, args); }, wait);\n    }\n\n    /**\n     * The base implementation of methods like `_.difference` without support\n     * for excluding multiple arrays or iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Array} values The values to exclude.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     */\n    function baseDifference(array, values, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          isCommon = true,\n          length = array.length,\n          result = [],\n          valuesLength = values.length;\n\n      if (!length) {\n        return result;\n      }\n      if (iteratee) {\n        values = arrayMap(values, baseUnary(iteratee));\n      }\n      if (comparator) {\n        includes = arrayIncludesWith;\n        isCommon = false;\n      }\n      else if (values.length >= LARGE_ARRAY_SIZE) {\n        includes = cacheHas;\n        isCommon = false;\n        values = new SetCache(values);\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee == null ? value : iteratee(value);\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var valuesIndex = valuesLength;\n          while (valuesIndex--) {\n            if (values[valuesIndex] === computed) {\n              continue outer;\n            }\n          }\n          result.push(value);\n        }\n        else if (!includes(values, computed, comparator)) {\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.forEach` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEach = createBaseEach(baseForOwn);\n\n    /**\n     * The base implementation of `_.forEachRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     */\n    var baseEachRight = createBaseEach(baseForOwnRight, true);\n\n    /**\n     * The base implementation of `_.every` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`\n     */\n    function baseEvery(collection, predicate) {\n      var result = true;\n      baseEach(collection, function(value, index, collection) {\n        result = !!predicate(value, index, collection);\n        return result;\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of methods like `_.max` and `_.min` which accepts a\n     * `comparator` to determine the extremum value.\n     *\n     * @private\n     * @param {Array} array The array to iterate over.\n     * @param {Function} iteratee The iteratee invoked per iteration.\n     * @param {Function} comparator The comparator used to compare values.\n     * @returns {*} Returns the extremum value.\n     */\n    function baseExtremum(array, iteratee, comparator) {\n      var index = -1,\n          length = array.length;\n\n      while (++index < length) {\n        var value = array[index],\n            current = iteratee(value);\n\n        if (current != null && (computed === undefined\n              ? (current === current && !isSymbol(current))\n              : comparator(current, computed)\n            )) {\n          var computed = current,\n              result = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.fill` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     */\n    function baseFill(array, value, start, end) {\n      var length = array.length;\n\n      start = toInteger(start);\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = (end === undefined || end > length) ? length : toInteger(end);\n      if (end < 0) {\n        end += length;\n      }\n      end = start > end ? 0 : toLength(end);\n      while (start < end) {\n        array[start++] = value;\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.filter` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     */\n    function baseFilter(collection, predicate) {\n      var result = [];\n      baseEach(collection, function(value, index, collection) {\n        if (predicate(value, index, collection)) {\n          result.push(value);\n        }\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.flatten` with support for restricting flattening.\n     *\n     * @private\n     * @param {Array} array The array to flatten.\n     * @param {number} depth The maximum recursion depth.\n     * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n     * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n     * @param {Array} [result=[]] The initial result value.\n     * @returns {Array} Returns the new flattened array.\n     */\n    function baseFlatten(array, depth, predicate, isStrict, result) {\n      var index = -1,\n          length = array.length;\n\n      predicate || (predicate = isFlattenable);\n      result || (result = []);\n\n      while (++index < length) {\n        var value = array[index];\n        if (depth > 0 && predicate(value)) {\n          if (depth > 1) {\n            // Recursively flatten arrays (susceptible to call stack limits).\n            baseFlatten(value, depth - 1, predicate, isStrict, result);\n          } else {\n            arrayPush(result, value);\n          }\n        } else if (!isStrict) {\n          result[result.length] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `baseForOwn` which iterates over `object`\n     * properties returned by `keysFunc` and invokes `iteratee` for each property.\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseFor = createBaseFor();\n\n    /**\n     * This function is like `baseFor` except that it iterates over properties\n     * in the opposite order.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @returns {Object} Returns `object`.\n     */\n    var baseForRight = createBaseFor(true);\n\n    /**\n     * The base implementation of `_.forOwn` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwn(object, iteratee) {\n      return object && baseFor(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.forOwnRight` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     */\n    function baseForOwnRight(object, iteratee) {\n      return object && baseForRight(object, iteratee, keys);\n    }\n\n    /**\n     * The base implementation of `_.functions` which creates an array of\n     * `object` function property names filtered from `props`.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Array} props The property names to filter.\n     * @returns {Array} Returns the function names.\n     */\n    function baseFunctions(object, props) {\n      return arrayFilter(props, function(key) {\n        return isFunction(object[key]);\n      });\n    }\n\n    /**\n     * The base implementation of `_.get` without support for default values.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseGet(object, path) {\n      path = castPath(path, object);\n\n      var index = 0,\n          length = path.length;\n\n      while (object != null && index < length) {\n        object = object[toKey(path[index++])];\n      }\n      return (index && index == length) ? object : undefined;\n    }\n\n    /**\n     * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n     * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Function} keysFunc The function to get the keys of `object`.\n     * @param {Function} symbolsFunc The function to get the symbols of `object`.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n      var result = keysFunc(object);\n      return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n    }\n\n    /**\n     * The base implementation of `getTag` without fallbacks for buggy environments.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    function baseGetTag(value) {\n      if (value == null) {\n        return value === undefined ? undefinedTag : nullTag;\n      }\n      return (symToStringTag && symToStringTag in Object(value))\n        ? getRawTag(value)\n        : objectToString(value);\n    }\n\n    /**\n     * The base implementation of `_.gt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     */\n    function baseGt(value, other) {\n      return value > other;\n    }\n\n    /**\n     * The base implementation of `_.has` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHas(object, key) {\n      return object != null && hasOwnProperty.call(object, key);\n    }\n\n    /**\n     * The base implementation of `_.hasIn` without support for deep paths.\n     *\n     * @private\n     * @param {Object} [object] The object to query.\n     * @param {Array|string} key The key to check.\n     * @returns {boolean} Returns `true` if `key` exists, else `false`.\n     */\n    function baseHasIn(object, key) {\n      return object != null && key in Object(object);\n    }\n\n    /**\n     * The base implementation of `_.inRange` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {number} number The number to check.\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     */\n    function baseInRange(number, start, end) {\n      return number >= nativeMin(start, end) && number < nativeMax(start, end);\n    }\n\n    /**\n     * The base implementation of methods like `_.intersection`, without support\n     * for iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of shared values.\n     */\n    function baseIntersection(arrays, iteratee, comparator) {\n      var includes = comparator ? arrayIncludesWith : arrayIncludes,\n          length = arrays[0].length,\n          othLength = arrays.length,\n          othIndex = othLength,\n          caches = Array(othLength),\n          maxLength = Infinity,\n          result = [];\n\n      while (othIndex--) {\n        var array = arrays[othIndex];\n        if (othIndex && iteratee) {\n          array = arrayMap(array, baseUnary(iteratee));\n        }\n        maxLength = nativeMin(array.length, maxLength);\n        caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))\n          ? new SetCache(othIndex && array)\n          : undefined;\n      }\n      array = arrays[0];\n\n      var index = -1,\n          seen = caches[0];\n\n      outer:\n      while (++index < length && result.length < maxLength) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (!(seen\n              ? cacheHas(seen, computed)\n              : includes(result, computed, comparator)\n            )) {\n          othIndex = othLength;\n          while (--othIndex) {\n            var cache = caches[othIndex];\n            if (!(cache\n                  ? cacheHas(cache, computed)\n                  : includes(arrays[othIndex], computed, comparator))\n                ) {\n              continue outer;\n            }\n          }\n          if (seen) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.invert` and `_.invertBy` which inverts\n     * `object` with values transformed by `iteratee` and set by `setter`.\n     *\n     * @private\n     * @param {Object} object The object to iterate over.\n     * @param {Function} setter The function to set `accumulator` values.\n     * @param {Function} iteratee The iteratee to transform values.\n     * @param {Object} accumulator The initial inverted object.\n     * @returns {Function} Returns `accumulator`.\n     */\n    function baseInverter(object, setter, iteratee, accumulator) {\n      baseForOwn(object, function(value, key, object) {\n        setter(accumulator, iteratee(value), key, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * The base implementation of `_.invoke` without support for individual\n     * method arguments.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {Array} args The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     */\n    function baseInvoke(object, path, args) {\n      path = castPath(path, object);\n      object = parent(object, path);\n      var func = object == null ? object : object[toKey(last(path))];\n      return func == null ? undefined : apply(func, object, args);\n    }\n\n    /**\n     * The base implementation of `_.isArguments`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     */\n    function baseIsArguments(value) {\n      return isObjectLike(value) && baseGetTag(value) == argsTag;\n    }\n\n    /**\n     * The base implementation of `_.isArrayBuffer` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     */\n    function baseIsArrayBuffer(value) {\n      return isObjectLike(value) && baseGetTag(value) == arrayBufferTag;\n    }\n\n    /**\n     * The base implementation of `_.isDate` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     */\n    function baseIsDate(value) {\n      return isObjectLike(value) && baseGetTag(value) == dateTag;\n    }\n\n    /**\n     * The base implementation of `_.isEqual` which supports partial comparisons\n     * and tracks traversed objects.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {boolean} bitmask The bitmask flags.\n     *  1 - Unordered comparison\n     *  2 - Partial comparison\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     */\n    function baseIsEqual(value, other, bitmask, customizer, stack) {\n      if (value === other) {\n        return true;\n      }\n      if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n        return value !== value && other !== other;\n      }\n      return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n    }\n\n    /**\n     * A specialized version of `baseIsEqual` for arrays and objects which performs\n     * deep comparisons and tracks traversed objects enabling objects with circular\n     * references to be compared.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n      var objIsArr = isArray(object),\n          othIsArr = isArray(other),\n          objTag = objIsArr ? arrayTag : getTag(object),\n          othTag = othIsArr ? arrayTag : getTag(other);\n\n      objTag = objTag == argsTag ? objectTag : objTag;\n      othTag = othTag == argsTag ? objectTag : othTag;\n\n      var objIsObj = objTag == objectTag,\n          othIsObj = othTag == objectTag,\n          isSameTag = objTag == othTag;\n\n      if (isSameTag && isBuffer(object)) {\n        if (!isBuffer(other)) {\n          return false;\n        }\n        objIsArr = true;\n        objIsObj = false;\n      }\n      if (isSameTag && !objIsObj) {\n        stack || (stack = new Stack);\n        return (objIsArr || isTypedArray(object))\n          ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n          : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n      }\n      if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n        var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n            othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n        if (objIsWrapped || othIsWrapped) {\n          var objUnwrapped = objIsWrapped ? object.value() : object,\n              othUnwrapped = othIsWrapped ? other.value() : other;\n\n          stack || (stack = new Stack);\n          return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n        }\n      }\n      if (!isSameTag) {\n        return false;\n      }\n      stack || (stack = new Stack);\n      return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n    }\n\n    /**\n     * The base implementation of `_.isMap` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     */\n    function baseIsMap(value) {\n      return isObjectLike(value) && getTag(value) == mapTag;\n    }\n\n    /**\n     * The base implementation of `_.isMatch` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Array} matchData The property names, values, and compare flags to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     */\n    function baseIsMatch(object, source, matchData, customizer) {\n      var index = matchData.length,\n          length = index,\n          noCustomizer = !customizer;\n\n      if (object == null) {\n        return !length;\n      }\n      object = Object(object);\n      while (index--) {\n        var data = matchData[index];\n        if ((noCustomizer && data[2])\n              ? data[1] !== object[data[0]]\n              : !(data[0] in object)\n            ) {\n          return false;\n        }\n      }\n      while (++index < length) {\n        data = matchData[index];\n        var key = data[0],\n            objValue = object[key],\n            srcValue = data[1];\n\n        if (noCustomizer && data[2]) {\n          if (objValue === undefined && !(key in object)) {\n            return false;\n          }\n        } else {\n          var stack = new Stack;\n          if (customizer) {\n            var result = customizer(objValue, srcValue, key, object, source, stack);\n          }\n          if (!(result === undefined\n                ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n                : result\n              )) {\n            return false;\n          }\n        }\n      }\n      return true;\n    }\n\n    /**\n     * The base implementation of `_.isNative` without bad shim checks.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     */\n    function baseIsNative(value) {\n      if (!isObject(value) || isMasked(value)) {\n        return false;\n      }\n      var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n      return pattern.test(toSource(value));\n    }\n\n    /**\n     * The base implementation of `_.isRegExp` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     */\n    function baseIsRegExp(value) {\n      return isObjectLike(value) && baseGetTag(value) == regexpTag;\n    }\n\n    /**\n     * The base implementation of `_.isSet` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     */\n    function baseIsSet(value) {\n      return isObjectLike(value) && getTag(value) == setTag;\n    }\n\n    /**\n     * The base implementation of `_.isTypedArray` without Node.js optimizations.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     */\n    function baseIsTypedArray(value) {\n      return isObjectLike(value) &&\n        isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n    }\n\n    /**\n     * The base implementation of `_.iteratee`.\n     *\n     * @private\n     * @param {*} [value=_.identity] The value to convert to an iteratee.\n     * @returns {Function} Returns the iteratee.\n     */\n    function baseIteratee(value) {\n      // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n      // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n      if (typeof value == 'function') {\n        return value;\n      }\n      if (value == null) {\n        return identity;\n      }\n      if (typeof value == 'object') {\n        return isArray(value)\n          ? baseMatchesProperty(value[0], value[1])\n          : baseMatches(value);\n      }\n      return property(value);\n    }\n\n    /**\n     * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeys(object) {\n      if (!isPrototype(object)) {\n        return nativeKeys(object);\n      }\n      var result = [];\n      for (var key in Object(object)) {\n        if (hasOwnProperty.call(object, key) && key != 'constructor') {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function baseKeysIn(object) {\n      if (!isObject(object)) {\n        return nativeKeysIn(object);\n      }\n      var isProto = isPrototype(object),\n          result = [];\n\n      for (var key in object) {\n        if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.lt` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     */\n    function baseLt(value, other) {\n      return value < other;\n    }\n\n    /**\n     * The base implementation of `_.map` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} iteratee The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     */\n    function baseMap(collection, iteratee) {\n      var index = -1,\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value, key, collection) {\n        result[++index] = iteratee(value, key, collection);\n      });\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.matches` which doesn't clone `source`.\n     *\n     * @private\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatches(source) {\n      var matchData = getMatchData(source);\n      if (matchData.length == 1 && matchData[0][2]) {\n        return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n      }\n      return function(object) {\n        return object === source || baseIsMatch(object, source, matchData);\n      };\n    }\n\n    /**\n     * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n     *\n     * @private\n     * @param {string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function baseMatchesProperty(path, srcValue) {\n      if (isKey(path) && isStrictComparable(srcValue)) {\n        return matchesStrictComparable(toKey(path), srcValue);\n      }\n      return function(object) {\n        var objValue = get(object, path);\n        return (objValue === undefined && objValue === srcValue)\n          ? hasIn(object, path)\n          : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n      };\n    }\n\n    /**\n     * The base implementation of `_.merge` without support for multiple sources.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} [customizer] The function to customize merged values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMerge(object, source, srcIndex, customizer, stack) {\n      if (object === source) {\n        return;\n      }\n      baseFor(source, function(srcValue, key) {\n        stack || (stack = new Stack);\n        if (isObject(srcValue)) {\n          baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n        }\n        else {\n          var newValue = customizer\n            ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n            : undefined;\n\n          if (newValue === undefined) {\n            newValue = srcValue;\n          }\n          assignMergeValue(object, key, newValue);\n        }\n      }, keysIn);\n    }\n\n    /**\n     * A specialized version of `baseMerge` for arrays and objects which performs\n     * deep merges and tracks traversed objects enabling objects with circular\n     * references to be merged.\n     *\n     * @private\n     * @param {Object} object The destination object.\n     * @param {Object} source The source object.\n     * @param {string} key The key of the value to merge.\n     * @param {number} srcIndex The index of `source`.\n     * @param {Function} mergeFunc The function to merge values.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     */\n    function baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n      var objValue = safeGet(object, key),\n          srcValue = safeGet(source, key),\n          stacked = stack.get(srcValue);\n\n      if (stacked) {\n        assignMergeValue(object, key, stacked);\n        return;\n      }\n      var newValue = customizer\n        ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n        : undefined;\n\n      var isCommon = newValue === undefined;\n\n      if (isCommon) {\n        var isArr = isArray(srcValue),\n            isBuff = !isArr && isBuffer(srcValue),\n            isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n        newValue = srcValue;\n        if (isArr || isBuff || isTyped) {\n          if (isArray(objValue)) {\n            newValue = objValue;\n          }\n          else if (isArrayLikeObject(objValue)) {\n            newValue = copyArray(objValue);\n          }\n          else if (isBuff) {\n            isCommon = false;\n            newValue = cloneBuffer(srcValue, true);\n          }\n          else if (isTyped) {\n            isCommon = false;\n            newValue = cloneTypedArray(srcValue, true);\n          }\n          else {\n            newValue = [];\n          }\n        }\n        else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n          newValue = objValue;\n          if (isArguments(objValue)) {\n            newValue = toPlainObject(objValue);\n          }\n          else if (!isObject(objValue) || isFunction(objValue)) {\n            newValue = initCloneObject(srcValue);\n          }\n        }\n        else {\n          isCommon = false;\n        }\n      }\n      if (isCommon) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, newValue);\n        mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n        stack['delete'](srcValue);\n      }\n      assignMergeValue(object, key, newValue);\n    }\n\n    /**\n     * The base implementation of `_.nth` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {number} n The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     */\n    function baseNth(array, n) {\n      var length = array.length;\n      if (!length) {\n        return;\n      }\n      n += n < 0 ? length : 0;\n      return isIndex(n, length) ? array[n] : undefined;\n    }\n\n    /**\n     * The base implementation of `_.orderBy` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n     * @param {string[]} orders The sort orders of `iteratees`.\n     * @returns {Array} Returns the new sorted array.\n     */\n    function baseOrderBy(collection, iteratees, orders) {\n      if (iteratees.length) {\n        iteratees = arrayMap(iteratees, function(iteratee) {\n          if (isArray(iteratee)) {\n            return function(value) {\n              return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);\n            };\n          }\n          return iteratee;\n        });\n      } else {\n        iteratees = [identity];\n      }\n\n      var index = -1;\n      iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n\n      var result = baseMap(collection, function(value, key, collection) {\n        var criteria = arrayMap(iteratees, function(iteratee) {\n          return iteratee(value);\n        });\n        return { 'criteria': criteria, 'index': ++index, 'value': value };\n      });\n\n      return baseSortBy(result, function(object, other) {\n        return compareMultiple(object, other, orders);\n      });\n    }\n\n    /**\n     * The base implementation of `_.pick` without support for individual\n     * property identifiers.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @returns {Object} Returns the new object.\n     */\n    function basePick(object, paths) {\n      return basePickBy(object, paths, function(value, path) {\n        return hasIn(object, path);\n      });\n    }\n\n    /**\n     * The base implementation of  `_.pickBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Object} object The source object.\n     * @param {string[]} paths The property paths to pick.\n     * @param {Function} predicate The function invoked per property.\n     * @returns {Object} Returns the new object.\n     */\n    function basePickBy(object, paths, predicate) {\n      var index = -1,\n          length = paths.length,\n          result = {};\n\n      while (++index < length) {\n        var path = paths[index],\n            value = baseGet(object, path);\n\n        if (predicate(value, path)) {\n          baseSet(result, castPath(path, object), value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseProperty` which supports deep paths.\n     *\n     * @private\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     */\n    function basePropertyDeep(path) {\n      return function(object) {\n        return baseGet(object, path);\n      };\n    }\n\n    /**\n     * The base implementation of `_.pullAllBy` without support for iteratee\n     * shorthands.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAll(array, values, iteratee, comparator) {\n      var indexOf = comparator ? baseIndexOfWith : baseIndexOf,\n          index = -1,\n          length = values.length,\n          seen = array;\n\n      if (array === values) {\n        values = copyArray(values);\n      }\n      if (iteratee) {\n        seen = arrayMap(array, baseUnary(iteratee));\n      }\n      while (++index < length) {\n        var fromIndex = 0,\n            value = values[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {\n          if (seen !== array) {\n            splice.call(seen, fromIndex, 1);\n          }\n          splice.call(array, fromIndex, 1);\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.pullAt` without support for individual\n     * indexes or capturing the removed elements.\n     *\n     * @private\n     * @param {Array} array The array to modify.\n     * @param {number[]} indexes The indexes of elements to remove.\n     * @returns {Array} Returns `array`.\n     */\n    function basePullAt(array, indexes) {\n      var length = array ? indexes.length : 0,\n          lastIndex = length - 1;\n\n      while (length--) {\n        var index = indexes[length];\n        if (length == lastIndex || index !== previous) {\n          var previous = index;\n          if (isIndex(index)) {\n            splice.call(array, index, 1);\n          } else {\n            baseUnset(array, index);\n          }\n        }\n      }\n      return array;\n    }\n\n    /**\n     * The base implementation of `_.random` without support for returning\n     * floating-point numbers.\n     *\n     * @private\n     * @param {number} lower The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the random number.\n     */\n    function baseRandom(lower, upper) {\n      return lower + nativeFloor(nativeRandom() * (upper - lower + 1));\n    }\n\n    /**\n     * The base implementation of `_.range` and `_.rangeRight` which doesn't\n     * coerce arguments.\n     *\n     * @private\n     * @param {number} start The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} step The value to increment or decrement by.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the range of numbers.\n     */\n    function baseRange(start, end, step, fromRight) {\n      var index = -1,\n          length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n          result = Array(length);\n\n      while (length--) {\n        result[fromRight ? length : ++index] = start;\n        start += step;\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.repeat` which doesn't coerce arguments.\n     *\n     * @private\n     * @param {string} string The string to repeat.\n     * @param {number} n The number of times to repeat the string.\n     * @returns {string} Returns the repeated string.\n     */\n    function baseRepeat(string, n) {\n      var result = '';\n      if (!string || n < 1 || n > MAX_SAFE_INTEGER) {\n        return result;\n      }\n      // Leverage the exponentiation by squaring algorithm for a faster repeat.\n      // See https://en.wikipedia.org/wiki/Exponentiation_by_squaring for more details.\n      do {\n        if (n % 2) {\n          result += string;\n        }\n        n = nativeFloor(n / 2);\n        if (n) {\n          string += string;\n        }\n      } while (n);\n\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     */\n    function baseRest(func, start) {\n      return setToString(overRest(func, start, identity), func + '');\n    }\n\n    /**\n     * The base implementation of `_.sample`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     */\n    function baseSample(collection) {\n      return arraySample(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.sampleSize` without param guards.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} n The number of elements to sample.\n     * @returns {Array} Returns the random elements.\n     */\n    function baseSampleSize(collection, n) {\n      var array = values(collection);\n      return shuffleSelf(array, baseClamp(n, 0, array.length));\n    }\n\n    /**\n     * The base implementation of `_.set`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseSet(object, path, value, customizer) {\n      if (!isObject(object)) {\n        return object;\n      }\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          lastIndex = length - 1,\n          nested = object;\n\n      while (nested != null && ++index < length) {\n        var key = toKey(path[index]),\n            newValue = value;\n\n        if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n          return object;\n        }\n\n        if (index != lastIndex) {\n          var objValue = nested[key];\n          newValue = customizer ? customizer(objValue, key, nested) : undefined;\n          if (newValue === undefined) {\n            newValue = isObject(objValue)\n              ? objValue\n              : (isIndex(path[index + 1]) ? [] : {});\n          }\n        }\n        assignValue(nested, key, newValue);\n        nested = nested[key];\n      }\n      return object;\n    }\n\n    /**\n     * The base implementation of `setData` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetData = !metaMap ? identity : function(func, data) {\n      metaMap.set(func, data);\n      return func;\n    };\n\n    /**\n     * The base implementation of `setToString` without support for hot loop shorting.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var baseSetToString = !defineProperty ? identity : function(func, string) {\n      return defineProperty(func, 'toString', {\n        'configurable': true,\n        'enumerable': false,\n        'value': constant(string),\n        'writable': true\n      });\n    };\n\n    /**\n     * The base implementation of `_.shuffle`.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     */\n    function baseShuffle(collection) {\n      return shuffleSelf(values(collection));\n    }\n\n    /**\n     * The base implementation of `_.slice` without an iteratee call guard.\n     *\n     * @private\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseSlice(array, start, end) {\n      var index = -1,\n          length = array.length;\n\n      if (start < 0) {\n        start = -start > length ? 0 : (length + start);\n      }\n      end = end > length ? length : end;\n      if (end < 0) {\n        end += length;\n      }\n      length = start > end ? 0 : ((end - start) >>> 0);\n      start >>>= 0;\n\n      var result = Array(length);\n      while (++index < length) {\n        result[index] = array[index + start];\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.some` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} predicate The function invoked per iteration.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     */\n    function baseSome(collection, predicate) {\n      var result;\n\n      baseEach(collection, function(value, index, collection) {\n        result = predicate(value, index, collection);\n        return !result;\n      });\n      return !!result;\n    }\n\n    /**\n     * The base implementation of `_.sortedIndex` and `_.sortedLastIndex` which\n     * performs a binary search of `array` to determine the index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndex(array, value, retHighest) {\n      var low = 0,\n          high = array == null ? low : array.length;\n\n      if (typeof value == 'number' && value === value && high <= HALF_MAX_ARRAY_LENGTH) {\n        while (low < high) {\n          var mid = (low + high) >>> 1,\n              computed = array[mid];\n\n          if (computed !== null && !isSymbol(computed) &&\n              (retHighest ? (computed <= value) : (computed < value))) {\n            low = mid + 1;\n          } else {\n            high = mid;\n          }\n        }\n        return high;\n      }\n      return baseSortedIndexBy(array, value, identity, retHighest);\n    }\n\n    /**\n     * The base implementation of `_.sortedIndexBy` and `_.sortedLastIndexBy`\n     * which invokes `iteratee` for `value` and each element of `array` to compute\n     * their sort ranking. The iteratee is invoked with one argument; (value).\n     *\n     * @private\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} iteratee The iteratee invoked per element.\n     * @param {boolean} [retHighest] Specify returning the highest qualified index.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     */\n    function baseSortedIndexBy(array, value, iteratee, retHighest) {\n      var low = 0,\n          high = array == null ? 0 : array.length;\n      if (high === 0) {\n        return 0;\n      }\n\n      value = iteratee(value);\n      var valIsNaN = value !== value,\n          valIsNull = value === null,\n          valIsSymbol = isSymbol(value),\n          valIsUndefined = value === undefined;\n\n      while (low < high) {\n        var mid = nativeFloor((low + high) / 2),\n            computed = iteratee(array[mid]),\n            othIsDefined = computed !== undefined,\n            othIsNull = computed === null,\n            othIsReflexive = computed === computed,\n            othIsSymbol = isSymbol(computed);\n\n        if (valIsNaN) {\n          var setLow = retHighest || othIsReflexive;\n        } else if (valIsUndefined) {\n          setLow = othIsReflexive && (retHighest || othIsDefined);\n        } else if (valIsNull) {\n          setLow = othIsReflexive && othIsDefined && (retHighest || !othIsNull);\n        } else if (valIsSymbol) {\n          setLow = othIsReflexive && othIsDefined && !othIsNull && (retHighest || !othIsSymbol);\n        } else if (othIsNull || othIsSymbol) {\n          setLow = false;\n        } else {\n          setLow = retHighest ? (computed <= value) : (computed < value);\n        }\n        if (setLow) {\n          low = mid + 1;\n        } else {\n          high = mid;\n        }\n      }\n      return nativeMin(high, MAX_ARRAY_INDEX);\n    }\n\n    /**\n     * The base implementation of `_.sortedUniq` and `_.sortedUniqBy` without\n     * support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseSortedUniq(array, iteratee) {\n      var index = -1,\n          length = array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        if (!index || !eq(computed, seen)) {\n          var seen = computed;\n          result[resIndex++] = value === 0 ? 0 : value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.toNumber` which doesn't ensure correct\n     * conversions of binary, hexadecimal, or octal string values.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     */\n    function baseToNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      return +value;\n    }\n\n    /**\n     * The base implementation of `_.toString` which doesn't convert nullish\n     * values to empty strings.\n     *\n     * @private\n     * @param {*} value The value to process.\n     * @returns {string} Returns the string.\n     */\n    function baseToString(value) {\n      // Exit early for strings to avoid a performance hit in some environments.\n      if (typeof value == 'string') {\n        return value;\n      }\n      if (isArray(value)) {\n        // Recursively convert values (susceptible to call stack limits).\n        return arrayMap(value, baseToString) + '';\n      }\n      if (isSymbol(value)) {\n        return symbolToString ? symbolToString.call(value) : '';\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     */\n    function baseUniq(array, iteratee, comparator) {\n      var index = -1,\n          includes = arrayIncludes,\n          length = array.length,\n          isCommon = true,\n          result = [],\n          seen = result;\n\n      if (comparator) {\n        isCommon = false;\n        includes = arrayIncludesWith;\n      }\n      else if (length >= LARGE_ARRAY_SIZE) {\n        var set = iteratee ? null : createSet(array);\n        if (set) {\n          return setToArray(set);\n        }\n        isCommon = false;\n        includes = cacheHas;\n        seen = new SetCache;\n      }\n      else {\n        seen = iteratee ? [] : result;\n      }\n      outer:\n      while (++index < length) {\n        var value = array[index],\n            computed = iteratee ? iteratee(value) : value;\n\n        value = (comparator || value !== 0) ? value : 0;\n        if (isCommon && computed === computed) {\n          var seenIndex = seen.length;\n          while (seenIndex--) {\n            if (seen[seenIndex] === computed) {\n              continue outer;\n            }\n          }\n          if (iteratee) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n        else if (!includes(seen, computed, comparator)) {\n          if (seen !== result) {\n            seen.push(computed);\n          }\n          result.push(value);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * The base implementation of `_.unset`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The property path to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     */\n    function baseUnset(object, path) {\n      path = castPath(path, object);\n\n      // Prevent prototype pollution, see: https://github.com/lodash/lodash/security/advisories/GHSA-xxjr-mmjv-4gpg\n      var index = -1,\n          length = path.length;\n\n      if (!length) {\n        return true;\n      }\n\n      var isRootPrimitive = object == null || (typeof object !== 'object' && typeof object !== 'function');\n\n      while (++index < length) {\n        var key = path[index];\n\n        // skip non-string keys (e.g., Symbols, numbers)\n        if (typeof key !== 'string') {\n          continue;\n        }\n\n        // Always block \"__proto__\" anywhere in the path if it's not expected\n        if (key === '__proto__' && !hasOwnProperty.call(object, '__proto__')) {\n          return false;\n        }\n\n        // Block \"constructor.prototype\" chains\n        if (key === 'constructor' &&\n            (index + 1) < length &&\n            typeof path[index + 1] === 'string' &&\n            path[index + 1] === 'prototype') {\n\n          // Allow ONLY when the path starts at a primitive root, e.g., _.unset(0, 'constructor.prototype.a')\n          if (isRootPrimitive && index === 0) {\n            continue;\n          }\n\n          return false;\n        }\n      }\n\n      var obj = parent(object, path);\n      return obj == null || delete obj[toKey(last(path))];\n    }\n\n    /**\n     * The base implementation of `_.update`.\n     *\n     * @private\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to update.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize path creation.\n     * @returns {Object} Returns `object`.\n     */\n    function baseUpdate(object, path, updater, customizer) {\n      return baseSet(object, path, updater(baseGet(object, path)), customizer);\n    }\n\n    /**\n     * The base implementation of methods like `_.dropWhile` and `_.takeWhile`\n     * without support for iteratee shorthands.\n     *\n     * @private\n     * @param {Array} array The array to query.\n     * @param {Function} predicate The function invoked per iteration.\n     * @param {boolean} [isDrop] Specify dropping elements instead of taking them.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function baseWhile(array, predicate, isDrop, fromRight) {\n      var length = array.length,\n          index = fromRight ? length : -1;\n\n      while ((fromRight ? index-- : ++index < length) &&\n        predicate(array[index], index, array)) {}\n\n      return isDrop\n        ? baseSlice(array, (fromRight ? 0 : index), (fromRight ? index + 1 : length))\n        : baseSlice(array, (fromRight ? index + 1 : 0), (fromRight ? length : index));\n    }\n\n    /**\n     * The base implementation of `wrapperValue` which returns the result of\n     * performing a sequence of actions on the unwrapped `value`, where each\n     * successive action is supplied the return value of the previous.\n     *\n     * @private\n     * @param {*} value The unwrapped value.\n     * @param {Array} actions Actions to perform to resolve the unwrapped value.\n     * @returns {*} Returns the resolved value.\n     */\n    function baseWrapperValue(value, actions) {\n      var result = value;\n      if (result instanceof LazyWrapper) {\n        result = result.value();\n      }\n      return arrayReduce(actions, function(result, action) {\n        return action.func.apply(action.thisArg, arrayPush([result], action.args));\n      }, result);\n    }\n\n    /**\n     * The base implementation of methods like `_.xor`, without support for\n     * iteratee shorthands, that accepts an array of arrays to inspect.\n     *\n     * @private\n     * @param {Array} arrays The arrays to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of values.\n     */\n    function baseXor(arrays, iteratee, comparator) {\n      var length = arrays.length;\n      if (length < 2) {\n        return length ? baseUniq(arrays[0]) : [];\n      }\n      var index = -1,\n          result = Array(length);\n\n      while (++index < length) {\n        var array = arrays[index],\n            othIndex = -1;\n\n        while (++othIndex < length) {\n          if (othIndex != index) {\n            result[index] = baseDifference(result[index] || array, arrays[othIndex], iteratee, comparator);\n          }\n        }\n      }\n      return baseUniq(baseFlatten(result, 1), iteratee, comparator);\n    }\n\n    /**\n     * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\n     *\n     * @private\n     * @param {Array} props The property identifiers.\n     * @param {Array} values The property values.\n     * @param {Function} assignFunc The function to assign values.\n     * @returns {Object} Returns the new object.\n     */\n    function baseZipObject(props, values, assignFunc) {\n      var index = -1,\n          length = props.length,\n          valsLength = values.length,\n          result = {};\n\n      while (++index < length) {\n        var value = index < valsLength ? values[index] : undefined;\n        assignFunc(result, props[index], value);\n      }\n      return result;\n    }\n\n    /**\n     * Casts `value` to an empty array if it's not an array like object.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Array|Object} Returns the cast array-like object.\n     */\n    function castArrayLikeObject(value) {\n      return isArrayLikeObject(value) ? value : [];\n    }\n\n    /**\n     * Casts `value` to `identity` if it's not a function.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {Function} Returns cast function.\n     */\n    function castFunction(value) {\n      return typeof value == 'function' ? value : identity;\n    }\n\n    /**\n     * Casts `value` to a path array if it's not one.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {Array} Returns the cast property path array.\n     */\n    function castPath(value, object) {\n      if (isArray(value)) {\n        return value;\n      }\n      return isKey(value, object) ? [value] : stringToPath(toString(value));\n    }\n\n    /**\n     * A `baseRest` alias which can be replaced with `identity` by module\n     * replacement plugins.\n     *\n     * @private\n     * @type {Function}\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    var castRest = baseRest;\n\n    /**\n     * Casts `array` to a slice if it's needed.\n     *\n     * @private\n     * @param {Array} array The array to inspect.\n     * @param {number} start The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the cast slice.\n     */\n    function castSlice(array, start, end) {\n      var length = array.length;\n      end = end === undefined ? length : end;\n      return (!start && end >= length) ? array : baseSlice(array, start, end);\n    }\n\n    /**\n     * A simple wrapper around the global [`clearTimeout`](https://mdn.io/clearTimeout).\n     *\n     * @private\n     * @param {number|Object} id The timer id or timeout object of the timer to clear.\n     */\n    var clearTimeout = ctxClearTimeout || function(id) {\n      return root.clearTimeout(id);\n    };\n\n    /**\n     * Creates a clone of  `buffer`.\n     *\n     * @private\n     * @param {Buffer} buffer The buffer to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Buffer} Returns the cloned buffer.\n     */\n    function cloneBuffer(buffer, isDeep) {\n      if (isDeep) {\n        return buffer.slice();\n      }\n      var length = buffer.length,\n          result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n      buffer.copy(result);\n      return result;\n    }\n\n    /**\n     * Creates a clone of `arrayBuffer`.\n     *\n     * @private\n     * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n     * @returns {ArrayBuffer} Returns the cloned array buffer.\n     */\n    function cloneArrayBuffer(arrayBuffer) {\n      var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n      new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n      return result;\n    }\n\n    /**\n     * Creates a clone of `dataView`.\n     *\n     * @private\n     * @param {Object} dataView The data view to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned data view.\n     */\n    function cloneDataView(dataView, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;\n      return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);\n    }\n\n    /**\n     * Creates a clone of `regexp`.\n     *\n     * @private\n     * @param {Object} regexp The regexp to clone.\n     * @returns {Object} Returns the cloned regexp.\n     */\n    function cloneRegExp(regexp) {\n      var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));\n      result.lastIndex = regexp.lastIndex;\n      return result;\n    }\n\n    /**\n     * Creates a clone of the `symbol` object.\n     *\n     * @private\n     * @param {Object} symbol The symbol object to clone.\n     * @returns {Object} Returns the cloned symbol object.\n     */\n    function cloneSymbol(symbol) {\n      return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};\n    }\n\n    /**\n     * Creates a clone of `typedArray`.\n     *\n     * @private\n     * @param {Object} typedArray The typed array to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the cloned typed array.\n     */\n    function cloneTypedArray(typedArray, isDeep) {\n      var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n      return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n    }\n\n    /**\n     * Compares values to sort them in ascending order.\n     *\n     * @private\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {number} Returns the sort order indicator for `value`.\n     */\n    function compareAscending(value, other) {\n      if (value !== other) {\n        var valIsDefined = value !== undefined,\n            valIsNull = value === null,\n            valIsReflexive = value === value,\n            valIsSymbol = isSymbol(value);\n\n        var othIsDefined = other !== undefined,\n            othIsNull = other === null,\n            othIsReflexive = other === other,\n            othIsSymbol = isSymbol(other);\n\n        if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n            (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n            (valIsNull && othIsDefined && othIsReflexive) ||\n            (!valIsDefined && othIsReflexive) ||\n            !valIsReflexive) {\n          return 1;\n        }\n        if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n            (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n            (othIsNull && valIsDefined && valIsReflexive) ||\n            (!othIsDefined && valIsReflexive) ||\n            !othIsReflexive) {\n          return -1;\n        }\n      }\n      return 0;\n    }\n\n    /**\n     * Used by `_.orderBy` to compare multiple properties of a value to another\n     * and stable sort them.\n     *\n     * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n     * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n     * of corresponding values.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {boolean[]|string[]} orders The order to sort by for each property.\n     * @returns {number} Returns the sort order indicator for `object`.\n     */\n    function compareMultiple(object, other, orders) {\n      var index = -1,\n          objCriteria = object.criteria,\n          othCriteria = other.criteria,\n          length = objCriteria.length,\n          ordersLength = orders.length;\n\n      while (++index < length) {\n        var result = compareAscending(objCriteria[index], othCriteria[index]);\n        if (result) {\n          if (index >= ordersLength) {\n            return result;\n          }\n          var order = orders[index];\n          return result * (order == 'desc' ? -1 : 1);\n        }\n      }\n      // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n      // that causes it, under certain circumstances, to provide the same value for\n      // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n      // for more details.\n      //\n      // This also ensures a stable sort in V8 and other engines.\n      // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n      return object.index - other.index;\n    }\n\n    /**\n     * Creates an array that is the composition of partially applied arguments,\n     * placeholders, and provided arguments into a single array of arguments.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to prepend to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgs(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersLength = holders.length,\n          leftIndex = -1,\n          leftLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(leftLength + rangeLength),\n          isUncurried = !isCurried;\n\n      while (++leftIndex < leftLength) {\n        result[leftIndex] = partials[leftIndex];\n      }\n      while (++argsIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[holders[argsIndex]] = args[argsIndex];\n        }\n      }\n      while (rangeLength--) {\n        result[leftIndex++] = args[argsIndex++];\n      }\n      return result;\n    }\n\n    /**\n     * This function is like `composeArgs` except that the arguments composition\n     * is tailored for `_.partialRight`.\n     *\n     * @private\n     * @param {Array} args The provided arguments.\n     * @param {Array} partials The arguments to append to those provided.\n     * @param {Array} holders The `partials` placeholder indexes.\n     * @params {boolean} [isCurried] Specify composing for a curried function.\n     * @returns {Array} Returns the new array of composed arguments.\n     */\n    function composeArgsRight(args, partials, holders, isCurried) {\n      var argsIndex = -1,\n          argsLength = args.length,\n          holdersIndex = -1,\n          holdersLength = holders.length,\n          rightIndex = -1,\n          rightLength = partials.length,\n          rangeLength = nativeMax(argsLength - holdersLength, 0),\n          result = Array(rangeLength + rightLength),\n          isUncurried = !isCurried;\n\n      while (++argsIndex < rangeLength) {\n        result[argsIndex] = args[argsIndex];\n      }\n      var offset = argsIndex;\n      while (++rightIndex < rightLength) {\n        result[offset + rightIndex] = partials[rightIndex];\n      }\n      while (++holdersIndex < holdersLength) {\n        if (isUncurried || argsIndex < argsLength) {\n          result[offset + holders[holdersIndex]] = args[argsIndex++];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Copies the values of `source` to `array`.\n     *\n     * @private\n     * @param {Array} source The array to copy values from.\n     * @param {Array} [array=[]] The array to copy values to.\n     * @returns {Array} Returns `array`.\n     */\n    function copyArray(source, array) {\n      var index = -1,\n          length = source.length;\n\n      array || (array = Array(length));\n      while (++index < length) {\n        array[index] = source[index];\n      }\n      return array;\n    }\n\n    /**\n     * Copies properties of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy properties from.\n     * @param {Array} props The property identifiers to copy.\n     * @param {Object} [object={}] The object to copy properties to.\n     * @param {Function} [customizer] The function to customize copied values.\n     * @returns {Object} Returns `object`.\n     */\n    function copyObject(source, props, object, customizer) {\n      var isNew = !object;\n      object || (object = {});\n\n      var index = -1,\n          length = props.length;\n\n      while (++index < length) {\n        var key = props[index];\n\n        var newValue = customizer\n          ? customizer(object[key], source[key], key, object, source)\n          : undefined;\n\n        if (newValue === undefined) {\n          newValue = source[key];\n        }\n        if (isNew) {\n          baseAssignValue(object, key, newValue);\n        } else {\n          assignValue(object, key, newValue);\n        }\n      }\n      return object;\n    }\n\n    /**\n     * Copies own symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbols(source, object) {\n      return copyObject(source, getSymbols(source), object);\n    }\n\n    /**\n     * Copies own and inherited symbols of `source` to `object`.\n     *\n     * @private\n     * @param {Object} source The object to copy symbols from.\n     * @param {Object} [object={}] The object to copy symbols to.\n     * @returns {Object} Returns `object`.\n     */\n    function copySymbolsIn(source, object) {\n      return copyObject(source, getSymbolsIn(source), object);\n    }\n\n    /**\n     * Creates a function like `_.groupBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} [initializer] The accumulator object initializer.\n     * @returns {Function} Returns the new aggregator function.\n     */\n    function createAggregator(setter, initializer) {\n      return function(collection, iteratee) {\n        var func = isArray(collection) ? arrayAggregator : baseAggregator,\n            accumulator = initializer ? initializer() : {};\n\n        return func(collection, setter, getIteratee(iteratee, 2), accumulator);\n      };\n    }\n\n    /**\n     * Creates a function like `_.assign`.\n     *\n     * @private\n     * @param {Function} assigner The function to assign values.\n     * @returns {Function} Returns the new assigner function.\n     */\n    function createAssigner(assigner) {\n      return baseRest(function(object, sources) {\n        var index = -1,\n            length = sources.length,\n            customizer = length > 1 ? sources[length - 1] : undefined,\n            guard = length > 2 ? sources[2] : undefined;\n\n        customizer = (assigner.length > 3 && typeof customizer == 'function')\n          ? (length--, customizer)\n          : undefined;\n\n        if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n          customizer = length < 3 ? undefined : customizer;\n          length = 1;\n        }\n        object = Object(object);\n        while (++index < length) {\n          var source = sources[index];\n          if (source) {\n            assigner(object, source, index, customizer);\n          }\n        }\n        return object;\n      });\n    }\n\n    /**\n     * Creates a `baseEach` or `baseEachRight` function.\n     *\n     * @private\n     * @param {Function} eachFunc The function to iterate over a collection.\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseEach(eachFunc, fromRight) {\n      return function(collection, iteratee) {\n        if (collection == null) {\n          return collection;\n        }\n        if (!isArrayLike(collection)) {\n          return eachFunc(collection, iteratee);\n        }\n        var length = collection.length,\n            index = fromRight ? length : -1,\n            iterable = Object(collection);\n\n        while ((fromRight ? index-- : ++index < length)) {\n          if (iteratee(iterable[index], index, iterable) === false) {\n            break;\n          }\n        }\n        return collection;\n      };\n    }\n\n    /**\n     * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new base function.\n     */\n    function createBaseFor(fromRight) {\n      return function(object, iteratee, keysFunc) {\n        var index = -1,\n            iterable = Object(object),\n            props = keysFunc(object),\n            length = props.length;\n\n        while (length--) {\n          var key = props[fromRight ? length : ++index];\n          if (iteratee(iterable[key], key, iterable) === false) {\n            break;\n          }\n        }\n        return object;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the optional `this`\n     * binding of `thisArg`.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createBind(func, bitmask, thisArg) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return fn.apply(isBind ? thisArg : this, arguments);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.lowerFirst`.\n     *\n     * @private\n     * @param {string} methodName The name of the `String` case method to use.\n     * @returns {Function} Returns the new case function.\n     */\n    function createCaseFirst(methodName) {\n      return function(string) {\n        string = toString(string);\n\n        var strSymbols = hasUnicode(string)\n          ? stringToArray(string)\n          : undefined;\n\n        var chr = strSymbols\n          ? strSymbols[0]\n          : string.charAt(0);\n\n        var trailing = strSymbols\n          ? castSlice(strSymbols, 1).join('')\n          : string.slice(1);\n\n        return chr[methodName]() + trailing;\n      };\n    }\n\n    /**\n     * Creates a function like `_.camelCase`.\n     *\n     * @private\n     * @param {Function} callback The function to combine each word.\n     * @returns {Function} Returns the new compounder function.\n     */\n    function createCompounder(callback) {\n      return function(string) {\n        return arrayReduce(words(deburr(string).replace(reApos, '')), callback, '');\n      };\n    }\n\n    /**\n     * Creates a function that produces an instance of `Ctor` regardless of\n     * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n     *\n     * @private\n     * @param {Function} Ctor The constructor to wrap.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCtor(Ctor) {\n      return function() {\n        // Use a `switch` statement to work with class constructors. See\n        // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n        // for more details.\n        var args = arguments;\n        switch (args.length) {\n          case 0: return new Ctor;\n          case 1: return new Ctor(args[0]);\n          case 2: return new Ctor(args[0], args[1]);\n          case 3: return new Ctor(args[0], args[1], args[2]);\n          case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n          case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n          case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n          case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n        }\n        var thisBinding = baseCreate(Ctor.prototype),\n            result = Ctor.apply(thisBinding, args);\n\n        // Mimic the constructor's `return` behavior.\n        // See https://es5.github.io/#x13.2.2 for more details.\n        return isObject(result) ? result : thisBinding;\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to enable currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {number} arity The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createCurry(func, bitmask, arity) {\n      var Ctor = createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length,\n            placeholder = getHolder(wrapper);\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\n          ? []\n          : replaceHolders(args, placeholder);\n\n        length -= holders.length;\n        if (length < arity) {\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, undefined,\n            args, holders, undefined, undefined, arity - length);\n        }\n        var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n        return apply(fn, this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.find` or `_.findLast` function.\n     *\n     * @private\n     * @param {Function} findIndexFunc The function to find the collection index.\n     * @returns {Function} Returns the new find function.\n     */\n    function createFind(findIndexFunc) {\n      return function(collection, predicate, fromIndex) {\n        var iterable = Object(collection);\n        if (!isArrayLike(collection)) {\n          var iteratee = getIteratee(predicate, 3);\n          collection = keys(collection);\n          predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n        }\n        var index = findIndexFunc(collection, predicate, fromIndex);\n        return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n      };\n    }\n\n    /**\n     * Creates a `_.flow` or `_.flowRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new flow function.\n     */\n    function createFlow(fromRight) {\n      return flatRest(function(funcs) {\n        var length = funcs.length,\n            index = length,\n            prereq = LodashWrapper.prototype.thru;\n\n        if (fromRight) {\n          funcs.reverse();\n        }\n        while (index--) {\n          var func = funcs[index];\n          if (typeof func != 'function') {\n            throw new TypeError(FUNC_ERROR_TEXT);\n          }\n          if (prereq && !wrapper && getFuncName(func) == 'wrapper') {\n            var wrapper = new LodashWrapper([], true);\n          }\n        }\n        index = wrapper ? index : length;\n        while (++index < length) {\n          func = funcs[index];\n\n          var funcName = getFuncName(func),\n              data = funcName == 'wrapper' ? getData(func) : undefined;\n\n          if (data && isLaziable(data[0]) &&\n                data[1] == (WRAP_ARY_FLAG | WRAP_CURRY_FLAG | WRAP_PARTIAL_FLAG | WRAP_REARG_FLAG) &&\n                !data[4].length && data[9] == 1\n              ) {\n            wrapper = wrapper[getFuncName(data[0])].apply(wrapper, data[3]);\n          } else {\n            wrapper = (func.length == 1 && isLaziable(func))\n              ? wrapper[funcName]()\n              : wrapper.thru(func);\n          }\n        }\n        return function() {\n          var args = arguments,\n              value = args[0];\n\n          if (wrapper && args.length == 1 && isArray(value)) {\n            return wrapper.plant(value).value();\n          }\n          var index = 0,\n              result = length ? funcs[index].apply(this, args) : value;\n\n          while (++index < length) {\n            result = funcs[index].call(this, result);\n          }\n          return result;\n        };\n      });\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with optional `this`\n     * binding of `thisArg`, partial application, and currying.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [partialsRight] The arguments to append to those provided\n     *  to the new function.\n     * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n      var isAry = bitmask & WRAP_ARY_FLAG,\n          isBind = bitmask & WRAP_BIND_FLAG,\n          isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\n          isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\n          isFlip = bitmask & WRAP_FLIP_FLAG,\n          Ctor = isBindKey ? undefined : createCtor(func);\n\n      function wrapper() {\n        var length = arguments.length,\n            args = Array(length),\n            index = length;\n\n        while (index--) {\n          args[index] = arguments[index];\n        }\n        if (isCurried) {\n          var placeholder = getHolder(wrapper),\n              holdersCount = countHolders(args, placeholder);\n        }\n        if (partials) {\n          args = composeArgs(args, partials, holders, isCurried);\n        }\n        if (partialsRight) {\n          args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n        }\n        length -= holdersCount;\n        if (isCurried && length < arity) {\n          var newHolders = replaceHolders(args, placeholder);\n          return createRecurry(\n            func, bitmask, createHybrid, wrapper.placeholder, thisArg,\n            args, newHolders, argPos, ary, arity - length\n          );\n        }\n        var thisBinding = isBind ? thisArg : this,\n            fn = isBindKey ? thisBinding[func] : func;\n\n        length = args.length;\n        if (argPos) {\n          args = reorder(args, argPos);\n        } else if (isFlip && length > 1) {\n          args.reverse();\n        }\n        if (isAry && ary < length) {\n          args.length = ary;\n        }\n        if (this && this !== root && this instanceof wrapper) {\n          fn = Ctor || createCtor(fn);\n        }\n        return fn.apply(thisBinding, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a function like `_.invertBy`.\n     *\n     * @private\n     * @param {Function} setter The function to set accumulator values.\n     * @param {Function} toIteratee The function to resolve iteratees.\n     * @returns {Function} Returns the new inverter function.\n     */\n    function createInverter(setter, toIteratee) {\n      return function(object, iteratee) {\n        return baseInverter(object, setter, toIteratee(iteratee), {});\n      };\n    }\n\n    /**\n     * Creates a function that performs a mathematical operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @param {number} [defaultValue] The value used for `undefined` arguments.\n     * @returns {Function} Returns the new mathematical operation function.\n     */\n    function createMathOperation(operator, defaultValue) {\n      return function(value, other) {\n        var result;\n        if (value === undefined && other === undefined) {\n          return defaultValue;\n        }\n        if (value !== undefined) {\n          result = value;\n        }\n        if (other !== undefined) {\n          if (result === undefined) {\n            return other;\n          }\n          if (typeof value == 'string' || typeof other == 'string') {\n            value = baseToString(value);\n            other = baseToString(other);\n          } else {\n            value = baseToNumber(value);\n            other = baseToNumber(other);\n          }\n          result = operator(value, other);\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function like `_.over`.\n     *\n     * @private\n     * @param {Function} arrayFunc The function to iterate over iteratees.\n     * @returns {Function} Returns the new over function.\n     */\n    function createOver(arrayFunc) {\n      return flatRest(function(iteratees) {\n        iteratees = arrayMap(iteratees, baseUnary(getIteratee()));\n        return baseRest(function(args) {\n          var thisArg = this;\n          return arrayFunc(iteratees, function(iteratee) {\n            return apply(iteratee, thisArg, args);\n          });\n        });\n      });\n    }\n\n    /**\n     * Creates the padding for `string` based on `length`. The `chars` string\n     * is truncated if the number of characters exceeds `length`.\n     *\n     * @private\n     * @param {number} length The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padding for `string`.\n     */\n    function createPadding(length, chars) {\n      chars = chars === undefined ? ' ' : baseToString(chars);\n\n      var charsLength = chars.length;\n      if (charsLength < 2) {\n        return charsLength ? baseRepeat(chars, length) : chars;\n      }\n      var result = baseRepeat(chars, nativeCeil(length / stringSize(chars)));\n      return hasUnicode(chars)\n        ? castSlice(stringToArray(result), 0, length).join('')\n        : result.slice(0, length);\n    }\n\n    /**\n     * Creates a function that wraps `func` to invoke it with the `this` binding\n     * of `thisArg` and `partials` prepended to the arguments it receives.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {Array} partials The arguments to prepend to those provided to\n     *  the new function.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createPartial(func, bitmask, thisArg, partials) {\n      var isBind = bitmask & WRAP_BIND_FLAG,\n          Ctor = createCtor(func);\n\n      function wrapper() {\n        var argsIndex = -1,\n            argsLength = arguments.length,\n            leftIndex = -1,\n            leftLength = partials.length,\n            args = Array(leftLength + argsLength),\n            fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n\n        while (++leftIndex < leftLength) {\n          args[leftIndex] = partials[leftIndex];\n        }\n        while (argsLength--) {\n          args[leftIndex++] = arguments[++argsIndex];\n        }\n        return apply(fn, isBind ? thisArg : this, args);\n      }\n      return wrapper;\n    }\n\n    /**\n     * Creates a `_.range` or `_.rangeRight` function.\n     *\n     * @private\n     * @param {boolean} [fromRight] Specify iterating from right to left.\n     * @returns {Function} Returns the new range function.\n     */\n    function createRange(fromRight) {\n      return function(start, end, step) {\n        if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n          end = step = undefined;\n        }\n        // Ensure the sign of `-0` is preserved.\n        start = toFinite(start);\n        if (end === undefined) {\n          end = start;\n          start = 0;\n        } else {\n          end = toFinite(end);\n        }\n        step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n        return baseRange(start, end, step, fromRight);\n      };\n    }\n\n    /**\n     * Creates a function that performs a relational operation on two values.\n     *\n     * @private\n     * @param {Function} operator The function to perform the operation.\n     * @returns {Function} Returns the new relational operation function.\n     */\n    function createRelationalOperation(operator) {\n      return function(value, other) {\n        if (!(typeof value == 'string' && typeof other == 'string')) {\n          value = toNumber(value);\n          other = toNumber(other);\n        }\n        return operator(value, other);\n      };\n    }\n\n    /**\n     * Creates a function that wraps `func` to continue currying.\n     *\n     * @private\n     * @param {Function} func The function to wrap.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @param {Function} wrapFunc The function to create the `func` wrapper.\n     * @param {*} placeholder The placeholder value.\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to prepend to those provided to\n     *  the new function.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\n      var isCurry = bitmask & WRAP_CURRY_FLAG,\n          newHolders = isCurry ? holders : undefined,\n          newHoldersRight = isCurry ? undefined : holders,\n          newPartials = isCurry ? partials : undefined,\n          newPartialsRight = isCurry ? undefined : partials;\n\n      bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\n      bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\n\n      if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\n        bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\n      }\n      var newData = [\n        func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\n        newHoldersRight, argPos, ary, arity\n      ];\n\n      var result = wrapFunc.apply(undefined, newData);\n      if (isLaziable(func)) {\n        setData(result, newData);\n      }\n      result.placeholder = placeholder;\n      return setWrapToString(result, func, bitmask);\n    }\n\n    /**\n     * Creates a function like `_.round`.\n     *\n     * @private\n     * @param {string} methodName The name of the `Math` method to use when rounding.\n     * @returns {Function} Returns the new round function.\n     */\n    function createRound(methodName) {\n      var func = Math[methodName];\n      return function(number, precision) {\n        number = toNumber(number);\n        precision = precision == null ? 0 : nativeMin(toInteger(precision), 292);\n        if (precision && nativeIsFinite(number)) {\n          // Shift with exponential notation to avoid floating-point issues.\n          // See [MDN](https://mdn.io/round#Examples) for more details.\n          var pair = (toString(number) + 'e').split('e'),\n              value = func(pair[0] + 'e' + (+pair[1] + precision));\n\n          pair = (toString(value) + 'e').split('e');\n          return +(pair[0] + 'e' + (+pair[1] - precision));\n        }\n        return func(number);\n      };\n    }\n\n    /**\n     * Creates a set object of `values`.\n     *\n     * @private\n     * @param {Array} values The values to add to the set.\n     * @returns {Object} Returns the new set.\n     */\n    var createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n      return new Set(values);\n    };\n\n    /**\n     * Creates a `_.toPairs` or `_.toPairsIn` function.\n     *\n     * @private\n     * @param {Function} keysFunc The function to get the keys of a given object.\n     * @returns {Function} Returns the new pairs function.\n     */\n    function createToPairs(keysFunc) {\n      return function(object) {\n        var tag = getTag(object);\n        if (tag == mapTag) {\n          return mapToArray(object);\n        }\n        if (tag == setTag) {\n          return setToPairs(object);\n        }\n        return baseToPairs(object, keysFunc(object));\n      };\n    }\n\n    /**\n     * Creates a function that either curries or invokes `func` with optional\n     * `this` binding and partially applied arguments.\n     *\n     * @private\n     * @param {Function|string} func The function or method name to wrap.\n     * @param {number} bitmask The bitmask flags.\n     *    1 - `_.bind`\n     *    2 - `_.bindKey`\n     *    4 - `_.curry` or `_.curryRight` of a bound function\n     *    8 - `_.curry`\n     *   16 - `_.curryRight`\n     *   32 - `_.partial`\n     *   64 - `_.partialRight`\n     *  128 - `_.rearg`\n     *  256 - `_.ary`\n     *  512 - `_.flip`\n     * @param {*} [thisArg] The `this` binding of `func`.\n     * @param {Array} [partials] The arguments to be partially applied.\n     * @param {Array} [holders] The `partials` placeholder indexes.\n     * @param {Array} [argPos] The argument positions of the new function.\n     * @param {number} [ary] The arity cap of `func`.\n     * @param {number} [arity] The arity of `func`.\n     * @returns {Function} Returns the new wrapped function.\n     */\n    function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n      var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\n      if (!isBindKey && typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var length = partials ? partials.length : 0;\n      if (!length) {\n        bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\n        partials = holders = undefined;\n      }\n      ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\n      arity = arity === undefined ? arity : toInteger(arity);\n      length -= holders ? holders.length : 0;\n\n      if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\n        var partialsRight = partials,\n            holdersRight = holders;\n\n        partials = holders = undefined;\n      }\n      var data = isBindKey ? undefined : getData(func);\n\n      var newData = [\n        func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\n        argPos, ary, arity\n      ];\n\n      if (data) {\n        mergeData(newData, data);\n      }\n      func = newData[0];\n      bitmask = newData[1];\n      thisArg = newData[2];\n      partials = newData[3];\n      holders = newData[4];\n      arity = newData[9] = newData[9] === undefined\n        ? (isBindKey ? 0 : func.length)\n        : nativeMax(newData[9] - length, 0);\n\n      if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\n        bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\n      }\n      if (!bitmask || bitmask == WRAP_BIND_FLAG) {\n        var result = createBind(func, bitmask, thisArg);\n      } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\n        result = createCurry(func, bitmask, arity);\n      } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\n        result = createPartial(func, bitmask, thisArg, partials);\n      } else {\n        result = createHybrid.apply(undefined, newData);\n      }\n      var setter = data ? baseSetData : setData;\n      return setWrapToString(setter(result, newData), func, bitmask);\n    }\n\n    /**\n     * Used by `_.defaults` to customize its `_.assignIn` use to assign properties\n     * of source objects to the destination object for all destination properties\n     * that resolve to `undefined`.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to assign.\n     * @param {Object} object The parent object of `objValue`.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsAssignIn(objValue, srcValue, key, object) {\n      if (objValue === undefined ||\n          (eq(objValue, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n        return srcValue;\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.defaultsDeep` to customize its `_.merge` use to merge source\n     * objects into destination objects that are passed thru.\n     *\n     * @private\n     * @param {*} objValue The destination value.\n     * @param {*} srcValue The source value.\n     * @param {string} key The key of the property to merge.\n     * @param {Object} object The parent object of `objValue`.\n     * @param {Object} source The parent object of `srcValue`.\n     * @param {Object} [stack] Tracks traversed source values and their merged\n     *  counterparts.\n     * @returns {*} Returns the value to assign.\n     */\n    function customDefaultsMerge(objValue, srcValue, key, object, source, stack) {\n      if (isObject(objValue) && isObject(srcValue)) {\n        // Recursively merge objects and arrays (susceptible to call stack limits).\n        stack.set(srcValue, objValue);\n        baseMerge(objValue, srcValue, undefined, customDefaultsMerge, stack);\n        stack['delete'](srcValue);\n      }\n      return objValue;\n    }\n\n    /**\n     * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain\n     * objects.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @param {string} key The key of the property to inspect.\n     * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.\n     */\n    function customOmitClone(value) {\n      return isPlainObject(value) ? undefined : value;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for arrays with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Array} array The array to compare.\n     * @param {Array} other The other array to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `array` and `other` objects.\n     * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n     */\n    function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          arrLength = array.length,\n          othLength = other.length;\n\n      if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n        return false;\n      }\n      // Check that cyclic values are equal.\n      var arrStacked = stack.get(array);\n      var othStacked = stack.get(other);\n      if (arrStacked && othStacked) {\n        return arrStacked == other && othStacked == array;\n      }\n      var index = -1,\n          result = true,\n          seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n      stack.set(array, other);\n      stack.set(other, array);\n\n      // Ignore non-index properties.\n      while (++index < arrLength) {\n        var arrValue = array[index],\n            othValue = other[index];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, arrValue, index, other, array, stack)\n            : customizer(arrValue, othValue, index, array, other, stack);\n        }\n        if (compared !== undefined) {\n          if (compared) {\n            continue;\n          }\n          result = false;\n          break;\n        }\n        // Recursively compare arrays (susceptible to call stack limits).\n        if (seen) {\n          if (!arraySome(other, function(othValue, othIndex) {\n                if (!cacheHas(seen, othIndex) &&\n                    (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n                  return seen.push(othIndex);\n                }\n              })) {\n            result = false;\n            break;\n          }\n        } else if (!(\n              arrValue === othValue ||\n                equalFunc(arrValue, othValue, bitmask, customizer, stack)\n            )) {\n          result = false;\n          break;\n        }\n      }\n      stack['delete'](array);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for comparing objects of\n     * the same `toStringTag`.\n     *\n     * **Note:** This function only supports comparing values with tags of\n     * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {string} tag The `toStringTag` of the objects to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n      switch (tag) {\n        case dataViewTag:\n          if ((object.byteLength != other.byteLength) ||\n              (object.byteOffset != other.byteOffset)) {\n            return false;\n          }\n          object = object.buffer;\n          other = other.buffer;\n\n        case arrayBufferTag:\n          if ((object.byteLength != other.byteLength) ||\n              !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n            return false;\n          }\n          return true;\n\n        case boolTag:\n        case dateTag:\n        case numberTag:\n          // Coerce booleans to `1` or `0` and dates to milliseconds.\n          // Invalid dates are coerced to `NaN`.\n          return eq(+object, +other);\n\n        case errorTag:\n          return object.name == other.name && object.message == other.message;\n\n        case regexpTag:\n        case stringTag:\n          // Coerce regexes to strings and treat strings, primitives and objects,\n          // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n          // for more details.\n          return object == (other + '');\n\n        case mapTag:\n          var convert = mapToArray;\n\n        case setTag:\n          var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n          convert || (convert = setToArray);\n\n          if (object.size != other.size && !isPartial) {\n            return false;\n          }\n          // Assume cyclic values are equal.\n          var stacked = stack.get(object);\n          if (stacked) {\n            return stacked == other;\n          }\n          bitmask |= COMPARE_UNORDERED_FLAG;\n\n          // Recursively compare objects (susceptible to call stack limits).\n          stack.set(object, other);\n          var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n          stack['delete'](object);\n          return result;\n\n        case symbolTag:\n          if (symbolValueOf) {\n            return symbolValueOf.call(object) == symbolValueOf.call(other);\n          }\n      }\n      return false;\n    }\n\n    /**\n     * A specialized version of `baseIsEqualDeep` for objects with support for\n     * partial deep comparisons.\n     *\n     * @private\n     * @param {Object} object The object to compare.\n     * @param {Object} other The other object to compare.\n     * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n     * @param {Function} customizer The function to customize comparisons.\n     * @param {Function} equalFunc The function to determine equivalents of values.\n     * @param {Object} stack Tracks traversed `object` and `other` objects.\n     * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n     */\n    function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n          objProps = getAllKeys(object),\n          objLength = objProps.length,\n          othProps = getAllKeys(other),\n          othLength = othProps.length;\n\n      if (objLength != othLength && !isPartial) {\n        return false;\n      }\n      var index = objLength;\n      while (index--) {\n        var key = objProps[index];\n        if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n          return false;\n        }\n      }\n      // Check that cyclic values are equal.\n      var objStacked = stack.get(object);\n      var othStacked = stack.get(other);\n      if (objStacked && othStacked) {\n        return objStacked == other && othStacked == object;\n      }\n      var result = true;\n      stack.set(object, other);\n      stack.set(other, object);\n\n      var skipCtor = isPartial;\n      while (++index < objLength) {\n        key = objProps[index];\n        var objValue = object[key],\n            othValue = other[key];\n\n        if (customizer) {\n          var compared = isPartial\n            ? customizer(othValue, objValue, key, other, object, stack)\n            : customizer(objValue, othValue, key, object, other, stack);\n        }\n        // Recursively compare objects (susceptible to call stack limits).\n        if (!(compared === undefined\n              ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n              : compared\n            )) {\n          result = false;\n          break;\n        }\n        skipCtor || (skipCtor = key == 'constructor');\n      }\n      if (result && !skipCtor) {\n        var objCtor = object.constructor,\n            othCtor = other.constructor;\n\n        // Non `Object` object instances with different constructors are not equal.\n        if (objCtor != othCtor &&\n            ('constructor' in object && 'constructor' in other) &&\n            !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n              typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n          result = false;\n        }\n      }\n      stack['delete'](object);\n      stack['delete'](other);\n      return result;\n    }\n\n    /**\n     * A specialized version of `baseRest` which flattens the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @returns {Function} Returns the new function.\n     */\n    function flatRest(func) {\n      return setToString(overRest(func, undefined, flatten), func + '');\n    }\n\n    /**\n     * Creates an array of own enumerable property names and symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeys(object) {\n      return baseGetAllKeys(object, keys, getSymbols);\n    }\n\n    /**\n     * Creates an array of own and inherited enumerable property names and\n     * symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names and symbols.\n     */\n    function getAllKeysIn(object) {\n      return baseGetAllKeys(object, keysIn, getSymbolsIn);\n    }\n\n    /**\n     * Gets metadata for `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {*} Returns the metadata for `func`.\n     */\n    var getData = !metaMap ? noop : function(func) {\n      return metaMap.get(func);\n    };\n\n    /**\n     * Gets the name of `func`.\n     *\n     * @private\n     * @param {Function} func The function to query.\n     * @returns {string} Returns the function name.\n     */\n    function getFuncName(func) {\n      var result = (func.name + ''),\n          array = realNames[result],\n          length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n      while (length--) {\n        var data = array[length],\n            otherFunc = data.func;\n        if (otherFunc == null || otherFunc == func) {\n          return data.name;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Gets the argument placeholder value for `func`.\n     *\n     * @private\n     * @param {Function} func The function to inspect.\n     * @returns {*} Returns the placeholder value.\n     */\n    function getHolder(func) {\n      var object = hasOwnProperty.call(lodash, 'placeholder') ? lodash : func;\n      return object.placeholder;\n    }\n\n    /**\n     * Gets the appropriate \"iteratee\" function. If `_.iteratee` is customized,\n     * this function returns the custom method, otherwise it returns `baseIteratee`.\n     * If arguments are provided, the chosen function is invoked with them and\n     * its result is returned.\n     *\n     * @private\n     * @param {*} [value] The value to convert to an iteratee.\n     * @param {number} [arity] The arity of the created iteratee.\n     * @returns {Function} Returns the chosen function or its result.\n     */\n    function getIteratee() {\n      var result = lodash.iteratee || iteratee;\n      result = result === iteratee ? baseIteratee : result;\n      return arguments.length ? result(arguments[0], arguments[1]) : result;\n    }\n\n    /**\n     * Gets the data for `map`.\n     *\n     * @private\n     * @param {Object} map The map to query.\n     * @param {string} key The reference key.\n     * @returns {*} Returns the map data.\n     */\n    function getMapData(map, key) {\n      var data = map.__data__;\n      return isKeyable(key)\n        ? data[typeof key == 'string' ? 'string' : 'hash']\n        : data.map;\n    }\n\n    /**\n     * Gets the property names, values, and compare flags of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the match data of `object`.\n     */\n    function getMatchData(object) {\n      var result = keys(object),\n          length = result.length;\n\n      while (length--) {\n        var key = result[length],\n            value = object[key];\n\n        result[length] = [key, value, isStrictComparable(value)];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the native function at `key` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the method to get.\n     * @returns {*} Returns the function if it's native, else `undefined`.\n     */\n    function getNative(object, key) {\n      var value = getValue(object, key);\n      return baseIsNative(value) ? value : undefined;\n    }\n\n    /**\n     * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the raw `toStringTag`.\n     */\n    function getRawTag(value) {\n      var isOwn = hasOwnProperty.call(value, symToStringTag),\n          tag = value[symToStringTag];\n\n      try {\n        value[symToStringTag] = undefined;\n        var unmasked = true;\n      } catch (e) {}\n\n      var result = nativeObjectToString.call(value);\n      if (unmasked) {\n        if (isOwn) {\n          value[symToStringTag] = tag;\n        } else {\n          delete value[symToStringTag];\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array of the own enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n      if (object == null) {\n        return [];\n      }\n      object = Object(object);\n      return arrayFilter(nativeGetSymbols(object), function(symbol) {\n        return propertyIsEnumerable.call(object, symbol);\n      });\n    };\n\n    /**\n     * Creates an array of the own and inherited enumerable symbols of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of symbols.\n     */\n    var getSymbolsIn = !nativeGetSymbols ? stubArray : function(object) {\n      var result = [];\n      while (object) {\n        arrayPush(result, getSymbols(object));\n        object = getPrototype(object);\n      }\n      return result;\n    };\n\n    /**\n     * Gets the `toStringTag` of `value`.\n     *\n     * @private\n     * @param {*} value The value to query.\n     * @returns {string} Returns the `toStringTag`.\n     */\n    var getTag = baseGetTag;\n\n    // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n    if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n        (Map && getTag(new Map) != mapTag) ||\n        (Promise && getTag(Promise.resolve()) != promiseTag) ||\n        (Set && getTag(new Set) != setTag) ||\n        (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n      getTag = function(value) {\n        var result = baseGetTag(value),\n            Ctor = result == objectTag ? value.constructor : undefined,\n            ctorString = Ctor ? toSource(Ctor) : '';\n\n        if (ctorString) {\n          switch (ctorString) {\n            case dataViewCtorString: return dataViewTag;\n            case mapCtorString: return mapTag;\n            case promiseCtorString: return promiseTag;\n            case setCtorString: return setTag;\n            case weakMapCtorString: return weakMapTag;\n          }\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Gets the view, applying any `transforms` to the `start` and `end` positions.\n     *\n     * @private\n     * @param {number} start The start of the view.\n     * @param {number} end The end of the view.\n     * @param {Array} transforms The transformations to apply to the view.\n     * @returns {Object} Returns an object containing the `start` and `end`\n     *  positions of the view.\n     */\n    function getView(start, end, transforms) {\n      var index = -1,\n          length = transforms.length;\n\n      while (++index < length) {\n        var data = transforms[index],\n            size = data.size;\n\n        switch (data.type) {\n          case 'drop':      start += size; break;\n          case 'dropRight': end -= size; break;\n          case 'take':      end = nativeMin(end, start + size); break;\n          case 'takeRight': start = nativeMax(start, end - size); break;\n        }\n      }\n      return { 'start': start, 'end': end };\n    }\n\n    /**\n     * Extracts wrapper details from the `source` body comment.\n     *\n     * @private\n     * @param {string} source The source to inspect.\n     * @returns {Array} Returns the wrapper details.\n     */\n    function getWrapDetails(source) {\n      var match = source.match(reWrapDetails);\n      return match ? match[1].split(reSplitDetails) : [];\n    }\n\n    /**\n     * Checks if `path` exists on `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @param {Function} hasFunc The function to check properties.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     */\n    function hasPath(object, path, hasFunc) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length,\n          result = false;\n\n      while (++index < length) {\n        var key = toKey(path[index]);\n        if (!(result = object != null && hasFunc(object, key))) {\n          break;\n        }\n        object = object[key];\n      }\n      if (result || ++index != length) {\n        return result;\n      }\n      length = object == null ? 0 : object.length;\n      return !!length && isLength(length) && isIndex(key, length) &&\n        (isArray(object) || isArguments(object));\n    }\n\n    /**\n     * Initializes an array clone.\n     *\n     * @private\n     * @param {Array} array The array to clone.\n     * @returns {Array} Returns the initialized clone.\n     */\n    function initCloneArray(array) {\n      var length = array.length,\n          result = new array.constructor(length);\n\n      // Add properties assigned by `RegExp#exec`.\n      if (length && typeof array[0] == 'string' && hasOwnProperty.call(array, 'index')) {\n        result.index = array.index;\n        result.input = array.input;\n      }\n      return result;\n    }\n\n    /**\n     * Initializes an object clone.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneObject(object) {\n      return (typeof object.constructor == 'function' && !isPrototype(object))\n        ? baseCreate(getPrototype(object))\n        : {};\n    }\n\n    /**\n     * Initializes an object clone based on its `toStringTag`.\n     *\n     * **Note:** This function only supports cloning values with tags of\n     * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n     *\n     * @private\n     * @param {Object} object The object to clone.\n     * @param {string} tag The `toStringTag` of the object to clone.\n     * @param {boolean} [isDeep] Specify a deep clone.\n     * @returns {Object} Returns the initialized clone.\n     */\n    function initCloneByTag(object, tag, isDeep) {\n      var Ctor = object.constructor;\n      switch (tag) {\n        case arrayBufferTag:\n          return cloneArrayBuffer(object);\n\n        case boolTag:\n        case dateTag:\n          return new Ctor(+object);\n\n        case dataViewTag:\n          return cloneDataView(object, isDeep);\n\n        case float32Tag: case float64Tag:\n        case int8Tag: case int16Tag: case int32Tag:\n        case uint8Tag: case uint8ClampedTag: case uint16Tag: case uint32Tag:\n          return cloneTypedArray(object, isDeep);\n\n        case mapTag:\n          return new Ctor;\n\n        case numberTag:\n        case stringTag:\n          return new Ctor(object);\n\n        case regexpTag:\n          return cloneRegExp(object);\n\n        case setTag:\n          return new Ctor;\n\n        case symbolTag:\n          return cloneSymbol(object);\n      }\n    }\n\n    /**\n     * Inserts wrapper `details` in a comment at the top of the `source` body.\n     *\n     * @private\n     * @param {string} source The source to modify.\n     * @returns {Array} details The details to insert.\n     * @returns {string} Returns the modified source.\n     */\n    function insertWrapDetails(source, details) {\n      var length = details.length;\n      if (!length) {\n        return source;\n      }\n      var lastIndex = length - 1;\n      details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\n      details = details.join(length > 2 ? ', ' : ' ');\n      return source.replace(reWrapComment, '{\\n/* [wrapped with ' + details + '] */\\n');\n    }\n\n    /**\n     * Checks if `value` is a flattenable `arguments` object or array.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n     */\n    function isFlattenable(value) {\n      return isArray(value) || isArguments(value) ||\n        !!(spreadableSymbol && value && value[spreadableSymbol]);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like index.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n     * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n     */\n    function isIndex(value, length) {\n      var type = typeof value;\n      length = length == null ? MAX_SAFE_INTEGER : length;\n\n      return !!length &&\n        (type == 'number' ||\n          (type != 'symbol' && reIsUint.test(value))) &&\n            (value > -1 && value % 1 == 0 && value < length);\n    }\n\n    /**\n     * Checks if the given arguments are from an iteratee call.\n     *\n     * @private\n     * @param {*} value The potential iteratee value argument.\n     * @param {*} index The potential iteratee index or key argument.\n     * @param {*} object The potential iteratee object argument.\n     * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n     *  else `false`.\n     */\n    function isIterateeCall(value, index, object) {\n      if (!isObject(object)) {\n        return false;\n      }\n      var type = typeof index;\n      if (type == 'number'\n            ? (isArrayLike(object) && isIndex(index, object.length))\n            : (type == 'string' && index in object)\n          ) {\n        return eq(object[index], value);\n      }\n      return false;\n    }\n\n    /**\n     * Checks if `value` is a property name and not a property path.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @param {Object} [object] The object to query keys on.\n     * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n     */\n    function isKey(value, object) {\n      if (isArray(value)) {\n        return false;\n      }\n      var type = typeof value;\n      if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n          value == null || isSymbol(value)) {\n        return true;\n      }\n      return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n        (object != null && value in Object(object));\n    }\n\n    /**\n     * Checks if `value` is suitable for use as unique object key.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n     */\n    function isKeyable(value) {\n      var type = typeof value;\n      return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n        ? (value !== '__proto__')\n        : (value === null);\n    }\n\n    /**\n     * Checks if `func` has a lazy counterpart.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n     *  else `false`.\n     */\n    function isLaziable(func) {\n      var funcName = getFuncName(func),\n          other = lodash[funcName];\n\n      if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n        return false;\n      }\n      if (func === other) {\n        return true;\n      }\n      var data = getData(other);\n      return !!data && func === data[0];\n    }\n\n    /**\n     * Checks if `func` has its source masked.\n     *\n     * @private\n     * @param {Function} func The function to check.\n     * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n     */\n    function isMasked(func) {\n      return !!maskSrcKey && (maskSrcKey in func);\n    }\n\n    /**\n     * Checks if `func` is capable of being masked.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `func` is maskable, else `false`.\n     */\n    var isMaskable = coreJsData ? isFunction : stubFalse;\n\n    /**\n     * Checks if `value` is likely a prototype object.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n     */\n    function isPrototype(value) {\n      var Ctor = value && value.constructor,\n          proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n      return value === proto;\n    }\n\n    /**\n     * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` if suitable for strict\n     *  equality comparisons, else `false`.\n     */\n    function isStrictComparable(value) {\n      return value === value && !isObject(value);\n    }\n\n    /**\n     * A specialized version of `matchesProperty` for source values suitable\n     * for strict equality comparisons, i.e. `===`.\n     *\n     * @private\n     * @param {string} key The key of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     */\n    function matchesStrictComparable(key, srcValue) {\n      return function(object) {\n        if (object == null) {\n          return false;\n        }\n        return object[key] === srcValue &&\n          (srcValue !== undefined || (key in Object(object)));\n      };\n    }\n\n    /**\n     * A specialized version of `_.memoize` which clears the memoized function's\n     * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n     *\n     * @private\n     * @param {Function} func The function to have its output memoized.\n     * @returns {Function} Returns the new memoized function.\n     */\n    function memoizeCapped(func) {\n      var result = memoize(func, function(key) {\n        if (cache.size === MAX_MEMOIZE_SIZE) {\n          cache.clear();\n        }\n        return key;\n      });\n\n      var cache = result.cache;\n      return result;\n    }\n\n    /**\n     * Merges the function metadata of `source` into `data`.\n     *\n     * Merging metadata reduces the number of wrappers used to invoke a function.\n     * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n     * may be applied regardless of execution order. Methods like `_.ary` and\n     * `_.rearg` modify function arguments, making the order in which they are\n     * executed important, preventing the merging of metadata. However, we make\n     * an exception for a safe combined case where curried functions have `_.ary`\n     * and or `_.rearg` applied.\n     *\n     * @private\n     * @param {Array} data The destination metadata.\n     * @param {Array} source The source metadata.\n     * @returns {Array} Returns `data`.\n     */\n    function mergeData(data, source) {\n      var bitmask = data[1],\n          srcBitmask = source[1],\n          newBitmask = bitmask | srcBitmask,\n          isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\n\n      var isCombo =\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\n        ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\n        ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\n\n      // Exit early if metadata can't be merged.\n      if (!(isCommon || isCombo)) {\n        return data;\n      }\n      // Use source `thisArg` if available.\n      if (srcBitmask & WRAP_BIND_FLAG) {\n        data[2] = source[2];\n        // Set when currying a bound function.\n        newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\n      }\n      // Compose partial arguments.\n      var value = source[3];\n      if (value) {\n        var partials = data[3];\n        data[3] = partials ? composeArgs(partials, value, source[4]) : value;\n        data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\n      }\n      // Compose partial right arguments.\n      value = source[5];\n      if (value) {\n        partials = data[5];\n        data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\n        data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\n      }\n      // Use source `argPos` if available.\n      value = source[7];\n      if (value) {\n        data[7] = value;\n      }\n      // Use source `ary` if it's smaller.\n      if (srcBitmask & WRAP_ARY_FLAG) {\n        data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n      }\n      // Use source `arity` if one is not provided.\n      if (data[9] == null) {\n        data[9] = source[9];\n      }\n      // Use source `func` and merge bitmasks.\n      data[0] = source[0];\n      data[1] = newBitmask;\n\n      return data;\n    }\n\n    /**\n     * This function is like\n     * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * except that it includes inherited enumerable properties.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     */\n    function nativeKeysIn(object) {\n      var result = [];\n      if (object != null) {\n        for (var key in Object(object)) {\n          result.push(key);\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a string using `Object.prototype.toString`.\n     *\n     * @private\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     */\n    function objectToString(value) {\n      return nativeObjectToString.call(value);\n    }\n\n    /**\n     * A specialized version of `baseRest` which transforms the rest array.\n     *\n     * @private\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @param {Function} transform The rest array transform.\n     * @returns {Function} Returns the new function.\n     */\n    function overRest(func, start, transform) {\n      start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n      return function() {\n        var args = arguments,\n            index = -1,\n            length = nativeMax(args.length - start, 0),\n            array = Array(length);\n\n        while (++index < length) {\n          array[index] = args[start + index];\n        }\n        index = -1;\n        var otherArgs = Array(start + 1);\n        while (++index < start) {\n          otherArgs[index] = args[index];\n        }\n        otherArgs[start] = transform(array);\n        return apply(func, this, otherArgs);\n      };\n    }\n\n    /**\n     * Gets the parent value at `path` of `object`.\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {Array} path The path to get the parent value of.\n     * @returns {*} Returns the parent value.\n     */\n    function parent(object, path) {\n      return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));\n    }\n\n    /**\n     * Reorder `array` according to the specified indexes where the element at\n     * the first index is assigned as the first element, the element at\n     * the second index is assigned as the second element, and so on.\n     *\n     * @private\n     * @param {Array} array The array to reorder.\n     * @param {Array} indexes The arranged array indexes.\n     * @returns {Array} Returns `array`.\n     */\n    function reorder(array, indexes) {\n      var arrLength = array.length,\n          length = nativeMin(indexes.length, arrLength),\n          oldArray = copyArray(array);\n\n      while (length--) {\n        var index = indexes[length];\n        array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n      }\n      return array;\n    }\n\n    /**\n     * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n     *\n     * @private\n     * @param {Object} object The object to query.\n     * @param {string} key The key of the property to get.\n     * @returns {*} Returns the property value.\n     */\n    function safeGet(object, key) {\n      if (key === 'constructor' && typeof object[key] === 'function') {\n        return;\n      }\n\n      if (key == '__proto__') {\n        return;\n      }\n\n      return object[key];\n    }\n\n    /**\n     * Sets metadata for `func`.\n     *\n     * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n     * period of time, it will trip its breaker and transition to an identity\n     * function to avoid garbage collection pauses in V8. See\n     * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n     * for more details.\n     *\n     * @private\n     * @param {Function} func The function to associate metadata with.\n     * @param {*} data The metadata.\n     * @returns {Function} Returns `func`.\n     */\n    var setData = shortOut(baseSetData);\n\n    /**\n     * A simple wrapper around the global [`setTimeout`](https://mdn.io/setTimeout).\n     *\n     * @private\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @returns {number|Object} Returns the timer id or timeout object.\n     */\n    var setTimeout = ctxSetTimeout || function(func, wait) {\n      return root.setTimeout(func, wait);\n    };\n\n    /**\n     * Sets the `toString` method of `func` to return `string`.\n     *\n     * @private\n     * @param {Function} func The function to modify.\n     * @param {Function} string The `toString` result.\n     * @returns {Function} Returns `func`.\n     */\n    var setToString = shortOut(baseSetToString);\n\n    /**\n     * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n     * with wrapper details in a comment at the top of the source body.\n     *\n     * @private\n     * @param {Function} wrapper The function to modify.\n     * @param {Function} reference The reference function.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Function} Returns `wrapper`.\n     */\n    function setWrapToString(wrapper, reference, bitmask) {\n      var source = (reference + '');\n      return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\n    }\n\n    /**\n     * Creates a function that'll short out and invoke `identity` instead\n     * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n     * milliseconds.\n     *\n     * @private\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new shortable function.\n     */\n    function shortOut(func) {\n      var count = 0,\n          lastCalled = 0;\n\n      return function() {\n        var stamp = nativeNow(),\n            remaining = HOT_SPAN - (stamp - lastCalled);\n\n        lastCalled = stamp;\n        if (remaining > 0) {\n          if (++count >= HOT_COUNT) {\n            return arguments[0];\n          }\n        } else {\n          count = 0;\n        }\n        return func.apply(undefined, arguments);\n      };\n    }\n\n    /**\n     * A specialized version of `_.shuffle` which mutates and sets the size of `array`.\n     *\n     * @private\n     * @param {Array} array The array to shuffle.\n     * @param {number} [size=array.length] The size of `array`.\n     * @returns {Array} Returns `array`.\n     */\n    function shuffleSelf(array, size) {\n      var index = -1,\n          length = array.length,\n          lastIndex = length - 1;\n\n      size = size === undefined ? length : size;\n      while (++index < size) {\n        var rand = baseRandom(index, lastIndex),\n            value = array[rand];\n\n        array[rand] = array[index];\n        array[index] = value;\n      }\n      array.length = size;\n      return array;\n    }\n\n    /**\n     * Converts `string` to a property path array.\n     *\n     * @private\n     * @param {string} string The string to convert.\n     * @returns {Array} Returns the property path array.\n     */\n    var stringToPath = memoizeCapped(function(string) {\n      var result = [];\n      if (string.charCodeAt(0) === 46 /* . */) {\n        result.push('');\n      }\n      string.replace(rePropName, function(match, number, quote, subString) {\n        result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n      });\n      return result;\n    });\n\n    /**\n     * Converts `value` to a string key if it's not a string or symbol.\n     *\n     * @private\n     * @param {*} value The value to inspect.\n     * @returns {string|symbol} Returns the key.\n     */\n    function toKey(value) {\n      if (typeof value == 'string' || isSymbol(value)) {\n        return value;\n      }\n      var result = (value + '');\n      return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n    }\n\n    /**\n     * Converts `func` to its source code.\n     *\n     * @private\n     * @param {Function} func The function to convert.\n     * @returns {string} Returns the source code.\n     */\n    function toSource(func) {\n      if (func != null) {\n        try {\n          return funcToString.call(func);\n        } catch (e) {}\n        try {\n          return (func + '');\n        } catch (e) {}\n      }\n      return '';\n    }\n\n    /**\n     * Updates wrapper `details` based on `bitmask` flags.\n     *\n     * @private\n     * @returns {Array} details The details to modify.\n     * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n     * @returns {Array} Returns `details`.\n     */\n    function updateWrapDetails(details, bitmask) {\n      arrayEach(wrapFlags, function(pair) {\n        var value = '_.' + pair[0];\n        if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\n          details.push(value);\n        }\n      });\n      return details.sort();\n    }\n\n    /**\n     * Creates a clone of `wrapper`.\n     *\n     * @private\n     * @param {Object} wrapper The wrapper to clone.\n     * @returns {Object} Returns the cloned wrapper.\n     */\n    function wrapperClone(wrapper) {\n      if (wrapper instanceof LazyWrapper) {\n        return wrapper.clone();\n      }\n      var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n      result.__actions__ = copyArray(wrapper.__actions__);\n      result.__index__  = wrapper.__index__;\n      result.__values__ = wrapper.__values__;\n      return result;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an array of elements split into groups the length of `size`.\n     * If `array` can't be split evenly, the final chunk will be the remaining\n     * elements.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to process.\n     * @param {number} [size=1] The length of each chunk\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the new array of chunks.\n     * @example\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 2);\n     * // => [['a', 'b'], ['c', 'd']]\n     *\n     * _.chunk(['a', 'b', 'c', 'd'], 3);\n     * // => [['a', 'b', 'c'], ['d']]\n     */\n    function chunk(array, size, guard) {\n      if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {\n        size = 1;\n      } else {\n        size = nativeMax(toInteger(size), 0);\n      }\n      var length = array == null ? 0 : array.length;\n      if (!length || size < 1) {\n        return [];\n      }\n      var index = 0,\n          resIndex = 0,\n          result = Array(nativeCeil(length / size));\n\n      while (index < length) {\n        result[resIndex++] = baseSlice(array, index, (index += size));\n      }\n      return result;\n    }\n\n    /**\n     * Creates an array with all falsey values removed. The values `false`, `null`,\n     * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to compact.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.compact([0, 1, false, 2, '', 3]);\n     * // => [1, 2, 3]\n     */\n    function compact(array) {\n      var index = -1,\n          length = array == null ? 0 : array.length,\n          resIndex = 0,\n          result = [];\n\n      while (++index < length) {\n        var value = array[index];\n        if (value) {\n          result[resIndex++] = value;\n        }\n      }\n      return result;\n    }\n\n    /**\n     * Creates a new array concatenating `array` with any additional arrays\n     * and/or values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to concatenate.\n     * @param {...*} [values] The values to concatenate.\n     * @returns {Array} Returns the new concatenated array.\n     * @example\n     *\n     * var array = [1];\n     * var other = _.concat(array, 2, [3], [[4]]);\n     *\n     * console.log(other);\n     * // => [1, 2, 3, [4]]\n     *\n     * console.log(array);\n     * // => [1]\n     */\n    function concat() {\n      var length = arguments.length;\n      if (!length) {\n        return [];\n      }\n      var args = Array(length - 1),\n          array = arguments[0],\n          index = length;\n\n      while (index--) {\n        args[index - 1] = arguments[index];\n      }\n      return arrayPush(isArray(array) ? copyArray(array) : [array], baseFlatten(args, 1));\n    }\n\n    /**\n     * Creates an array of `array` values not included in the other given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * **Note:** Unlike `_.pullAll`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.without, _.xor\n     * @example\n     *\n     * _.difference([2, 1], [2, 3]);\n     * // => [1]\n     */\n    var difference = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `iteratee` which\n     * is invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * **Note:** Unlike `_.pullAllBy`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.differenceBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var differenceBy = baseRest(function(array, values) {\n      var iteratee = last(values);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.difference` except that it accepts `comparator`\n     * which is invoked to compare elements of `array` to `values`. The order and\n     * references of result values are determined by the first array. The comparator\n     * is invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.pullAllWith`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...Array} [values] The values to exclude.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     *\n     * _.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }]\n     */\n    var differenceWith = baseRest(function(array, values) {\n      var comparator = last(values);\n      if (isArrayLikeObject(comparator)) {\n        comparator = undefined;\n      }\n      return isArrayLikeObject(array)\n        ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true), undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.drop([1, 2, 3]);\n     * // => [2, 3]\n     *\n     * _.drop([1, 2, 3], 2);\n     * // => [3]\n     *\n     * _.drop([1, 2, 3], 5);\n     * // => []\n     *\n     * _.drop([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function drop(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements dropped from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to drop.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.dropRight([1, 2, 3]);\n     * // => [1, 2]\n     *\n     * _.dropRight([1, 2, 3], 2);\n     * // => [1]\n     *\n     * _.dropRight([1, 2, 3], 5);\n     * // => []\n     *\n     * _.dropRight([1, 2, 3], 0);\n     * // => [1, 2, 3]\n     */\n    function dropRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the end.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.dropRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropRightWhile(users, ['active', false]);\n     * // => objects for ['barney']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropRightWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` excluding elements dropped from the beginning.\n     * Elements are dropped until `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.dropWhile(users, function(o) { return !o.active; });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.dropWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.dropWhile(users, ['active', false]);\n     * // => objects for ['pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.dropWhile(users, 'active');\n     * // => objects for ['barney', 'fred', 'pebbles']\n     */\n    function dropWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), true)\n        : [];\n    }\n\n    /**\n     * Fills elements of `array` with `value` from `start` up to, but not\n     * including, `end`.\n     *\n     * **Note:** This method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Array\n     * @param {Array} array The array to fill.\n     * @param {*} value The value to fill `array` with.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.fill(array, 'a');\n     * console.log(array);\n     * // => ['a', 'a', 'a']\n     *\n     * _.fill(Array(3), 2);\n     * // => [2, 2, 2]\n     *\n     * _.fill([4, 6, 8, 10], '*', 1, 3);\n     * // => [4, '*', '*', 10]\n     */\n    function fill(array, value, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (start && typeof start != 'number' && isIterateeCall(array, value, start)) {\n        start = 0;\n        end = length;\n      }\n      return baseFill(array, value, start, end);\n    }\n\n    /**\n     * This method is like `_.find` except that it returns the index of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.findIndex(users, function(o) { return o.user == 'barney'; });\n     * // => 0\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findIndex(users, { 'user': 'fred', 'active': false });\n     * // => 1\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findIndex(users, ['active', false]);\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findIndex(users, 'active');\n     * // => 2\n     */\n    function findIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index);\n    }\n\n    /**\n     * This method is like `_.findIndex` except that it iterates over elements\n     * of `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the found element, else `-1`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.findLastIndex(users, function(o) { return o.user == 'pebbles'; });\n     * // => 2\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastIndex(users, { 'user': 'barney', 'active': true });\n     * // => 0\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastIndex(users, ['active', false]);\n     * // => 2\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastIndex(users, 'active');\n     * // => 0\n     */\n    function findLastIndex(array, predicate, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length - 1;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = fromIndex < 0\n          ? nativeMax(length + index, 0)\n          : nativeMin(index, length - 1);\n      }\n      return baseFindIndex(array, getIteratee(predicate, 3), index, true);\n    }\n\n    /**\n     * Flattens `array` a single level deep.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flatten([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, [3, [4]], 5]\n     */\n    function flatten(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, 1) : [];\n    }\n\n    /**\n     * Recursively flattens `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * _.flattenDeep([1, [2, [3, [4]], 5]]);\n     * // => [1, 2, 3, 4, 5]\n     */\n    function flattenDeep(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseFlatten(array, INFINITY) : [];\n    }\n\n    /**\n     * Recursively flatten `array` up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Array\n     * @param {Array} array The array to flatten.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * var array = [1, [2, [3, [4]], 5]];\n     *\n     * _.flattenDepth(array, 1);\n     * // => [1, 2, [3, [4]], 5]\n     *\n     * _.flattenDepth(array, 2);\n     * // => [1, 2, 3, [4], 5]\n     */\n    function flattenDepth(array, depth) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(array, depth);\n    }\n\n    /**\n     * The inverse of `_.toPairs`; this method returns an object composed\n     * from key-value `pairs`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} pairs The key-value pairs.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.fromPairs([['a', 1], ['b', 2]]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function fromPairs(pairs) {\n      var index = -1,\n          length = pairs == null ? 0 : pairs.length,\n          result = {};\n\n      while (++index < length) {\n        var pair = pairs[index];\n        result[pair[0]] = pair[1];\n      }\n      return result;\n    }\n\n    /**\n     * Gets the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias first\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the first element of `array`.\n     * @example\n     *\n     * _.head([1, 2, 3]);\n     * // => 1\n     *\n     * _.head([]);\n     * // => undefined\n     */\n    function head(array) {\n      return (array && array.length) ? array[0] : undefined;\n    }\n\n    /**\n     * Gets the index at which the first occurrence of `value` is found in `array`\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. If `fromIndex` is negative, it's used as the\n     * offset from the end of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.indexOf([1, 2, 1, 2], 2);\n     * // => 1\n     *\n     * // Search from the `fromIndex`.\n     * _.indexOf([1, 2, 1, 2], 2, 2);\n     * // => 3\n     */\n    function indexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = fromIndex == null ? 0 : toInteger(fromIndex);\n      if (index < 0) {\n        index = nativeMax(length + index, 0);\n      }\n      return baseIndexOf(array, value, index);\n    }\n\n    /**\n     * Gets all but the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.initial([1, 2, 3]);\n     * // => [1, 2]\n     */\n    function initial(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 0, -1) : [];\n    }\n\n    /**\n     * Creates an array of unique values that are included in all given arrays\n     * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons. The order and references of result values are\n     * determined by the first array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersection([2, 1], [2, 3]);\n     * // => [2]\n     */\n    var intersection = baseRest(function(arrays) {\n      var mapped = arrayMap(arrays, castArrayLikeObject);\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped)\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `iteratee`\n     * which is invoked for each element of each `arrays` to generate the criterion\n     * by which they're compared. The order and references of result values are\n     * determined by the first array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * _.intersectionBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [2.1]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }]\n     */\n    var intersectionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      if (iteratee === last(mapped)) {\n        iteratee = undefined;\n      } else {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, getIteratee(iteratee, 2))\n        : [];\n    });\n\n    /**\n     * This method is like `_.intersection` except that it accepts `comparator`\n     * which is invoked to compare elements of `arrays`. The order and references\n     * of result values are determined by the first array. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of intersecting values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.intersectionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }]\n     */\n    var intersectionWith = baseRest(function(arrays) {\n      var comparator = last(arrays),\n          mapped = arrayMap(arrays, castArrayLikeObject);\n\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      if (comparator) {\n        mapped.pop();\n      }\n      return (mapped.length && mapped[0] === arrays[0])\n        ? baseIntersection(mapped, undefined, comparator)\n        : [];\n    });\n\n    /**\n     * Converts all elements in `array` into a string separated by `separator`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to convert.\n     * @param {string} [separator=','] The element separator.\n     * @returns {string} Returns the joined string.\n     * @example\n     *\n     * _.join(['a', 'b', 'c'], '~');\n     * // => 'a~b~c'\n     */\n    function join(array, separator) {\n      return array == null ? '' : nativeJoin.call(array, separator);\n    }\n\n    /**\n     * Gets the last element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {*} Returns the last element of `array`.\n     * @example\n     *\n     * _.last([1, 2, 3]);\n     * // => 3\n     */\n    function last(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? array[length - 1] : undefined;\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it iterates over elements of\n     * `array` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=array.length-1] The index to search from.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.lastIndexOf([1, 2, 1, 2], 2);\n     * // => 3\n     *\n     * // Search from the `fromIndex`.\n     * _.lastIndexOf([1, 2, 1, 2], 2, 2);\n     * // => 1\n     */\n    function lastIndexOf(array, value, fromIndex) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return -1;\n      }\n      var index = length;\n      if (fromIndex !== undefined) {\n        index = toInteger(fromIndex);\n        index = index < 0 ? nativeMax(length + index, 0) : nativeMin(index, length - 1);\n      }\n      return value === value\n        ? strictLastIndexOf(array, value, index)\n        : baseFindIndex(array, baseIsNaN, index, true);\n    }\n\n    /**\n     * Gets the element at index `n` of `array`. If `n` is negative, the nth\n     * element from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.11.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=0] The index of the element to return.\n     * @returns {*} Returns the nth element of `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     *\n     * _.nth(array, 1);\n     * // => 'b'\n     *\n     * _.nth(array, -2);\n     * // => 'c';\n     */\n    function nth(array, n) {\n      return (array && array.length) ? baseNth(array, toInteger(n)) : undefined;\n    }\n\n    /**\n     * Removes all given values from `array` using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`\n     * to remove elements from an array by predicate.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...*} [values] The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pull(array, 'a', 'c');\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    var pull = baseRest(pullAll);\n\n    /**\n     * This method is like `_.pull` except that it accepts an array of values to remove.\n     *\n     * **Note:** Unlike `_.difference`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'a', 'b', 'c'];\n     *\n     * _.pullAll(array, ['a', 'c']);\n     * console.log(array);\n     * // => ['b', 'b']\n     */\n    function pullAll(array, values) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values)\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `iteratee` which is\n     * invoked for each element of `array` and `values` to generate the criterion\n     * by which they're compared. The iteratee is invoked with one argument: (value).\n     *\n     * **Note:** Unlike `_.differenceBy`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1 }, { 'x': 2 }, { 'x': 3 }, { 'x': 1 }];\n     *\n     * _.pullAllBy(array, [{ 'x': 1 }, { 'x': 3 }], 'x');\n     * console.log(array);\n     * // => [{ 'x': 2 }]\n     */\n    function pullAllBy(array, values, iteratee) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, getIteratee(iteratee, 2))\n        : array;\n    }\n\n    /**\n     * This method is like `_.pullAll` except that it accepts `comparator` which\n     * is invoked to compare elements of `array` to `values`. The comparator is\n     * invoked with two arguments: (arrVal, othVal).\n     *\n     * **Note:** Unlike `_.differenceWith`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Array} values The values to remove.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [{ 'x': 1, 'y': 2 }, { 'x': 3, 'y': 4 }, { 'x': 5, 'y': 6 }];\n     *\n     * _.pullAllWith(array, [{ 'x': 3, 'y': 4 }], _.isEqual);\n     * console.log(array);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 5, 'y': 6 }]\n     */\n    function pullAllWith(array, values, comparator) {\n      return (array && array.length && values && values.length)\n        ? basePullAll(array, values, undefined, comparator)\n        : array;\n    }\n\n    /**\n     * Removes elements from `array` corresponding to `indexes` and returns an\n     * array of removed elements.\n     *\n     * **Note:** Unlike `_.at`, this method mutates `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {...(number|number[])} [indexes] The indexes of elements to remove.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = ['a', 'b', 'c', 'd'];\n     * var pulled = _.pullAt(array, [1, 3]);\n     *\n     * console.log(array);\n     * // => ['a', 'c']\n     *\n     * console.log(pulled);\n     * // => ['b', 'd']\n     */\n    var pullAt = flatRest(function(array, indexes) {\n      var length = array == null ? 0 : array.length,\n          result = baseAt(array, indexes);\n\n      basePullAt(array, arrayMap(indexes, function(index) {\n        return isIndex(index, length) ? +index : index;\n      }).sort(compareAscending));\n\n      return result;\n    });\n\n    /**\n     * Removes all elements from `array` that `predicate` returns truthy for\n     * and returns an array of the removed elements. The predicate is invoked\n     * with three arguments: (value, index, array).\n     *\n     * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`\n     * to pull elements from an array by value.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new array of removed elements.\n     * @example\n     *\n     * var array = [1, 2, 3, 4];\n     * var evens = _.remove(array, function(n) {\n     *   return n % 2 == 0;\n     * });\n     *\n     * console.log(array);\n     * // => [1, 3]\n     *\n     * console.log(evens);\n     * // => [2, 4]\n     */\n    function remove(array, predicate) {\n      var result = [];\n      if (!(array && array.length)) {\n        return result;\n      }\n      var index = -1,\n          indexes = [],\n          length = array.length;\n\n      predicate = getIteratee(predicate, 3);\n      while (++index < length) {\n        var value = array[index];\n        if (predicate(value, index, array)) {\n          result.push(value);\n          indexes.push(index);\n        }\n      }\n      basePullAt(array, indexes);\n      return result;\n    }\n\n    /**\n     * Reverses `array` so that the first element becomes the last, the second\n     * element becomes the second to last, and so on.\n     *\n     * **Note:** This method mutates `array` and is based on\n     * [`Array#reverse`](https://mdn.io/Array/reverse).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to modify.\n     * @returns {Array} Returns `array`.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _.reverse(array);\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function reverse(array) {\n      return array == null ? array : nativeReverse.call(array);\n    }\n\n    /**\n     * Creates a slice of `array` from `start` up to, but not including, `end`.\n     *\n     * **Note:** This method is used instead of\n     * [`Array#slice`](https://mdn.io/Array/slice) to ensure dense arrays are\n     * returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to slice.\n     * @param {number} [start=0] The start position.\n     * @param {number} [end=array.length] The end position.\n     * @returns {Array} Returns the slice of `array`.\n     */\n    function slice(array, start, end) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      if (end && typeof end != 'number' && isIterateeCall(array, start, end)) {\n        start = 0;\n        end = length;\n      }\n      else {\n        start = start == null ? 0 : toInteger(start);\n        end = end === undefined ? length : toInteger(end);\n      }\n      return baseSlice(array, start, end);\n    }\n\n    /**\n     * Uses a binary search to determine the lowest index at which `value`\n     * should be inserted into `array` in order to maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedIndex([30, 50], 40);\n     * // => 1\n     */\n    function sortedIndex(array, value) {\n      return baseSortedIndex(array, value);\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 0\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 0\n     */\n    function sortedIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * This method is like `_.indexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 1\n     */\n    function sortedIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value);\n        if (index < length && eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.sortedIndex` except that it returns the highest\n     * index at which `value` should be inserted into `array` in order to\n     * maintain its sort order.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * _.sortedLastIndex([4, 5, 5, 5, 6], 5);\n     * // => 4\n     */\n    function sortedLastIndex(array, value) {\n      return baseSortedIndex(array, value, true);\n    }\n\n    /**\n     * This method is like `_.sortedLastIndex` except that it accepts `iteratee`\n     * which is invoked for `value` and each element of `array` to compute their\n     * sort ranking. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The sorted array to inspect.\n     * @param {*} value The value to evaluate.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the index at which `value` should be inserted\n     *  into `array`.\n     * @example\n     *\n     * var objects = [{ 'x': 4 }, { 'x': 5 }];\n     *\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, function(o) { return o.x; });\n     * // => 1\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sortedLastIndexBy(objects, { 'x': 4 }, 'x');\n     * // => 1\n     */\n    function sortedLastIndexBy(array, value, iteratee) {\n      return baseSortedIndexBy(array, value, getIteratee(iteratee, 2), true);\n    }\n\n    /**\n     * This method is like `_.lastIndexOf` except that it performs a binary\n     * search on a sorted `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {*} value The value to search for.\n     * @returns {number} Returns the index of the matched value, else `-1`.\n     * @example\n     *\n     * _.sortedLastIndexOf([4, 5, 5, 5, 6], 5);\n     * // => 3\n     */\n    function sortedLastIndexOf(array, value) {\n      var length = array == null ? 0 : array.length;\n      if (length) {\n        var index = baseSortedIndex(array, value, true) - 1;\n        if (eq(array[index], value)) {\n          return index;\n        }\n      }\n      return -1;\n    }\n\n    /**\n     * This method is like `_.uniq` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniq([1, 1, 2]);\n     * // => [1, 2]\n     */\n    function sortedUniq(array) {\n      return (array && array.length)\n        ? baseSortedUniq(array)\n        : [];\n    }\n\n    /**\n     * This method is like `_.uniqBy` except that it's designed and optimized\n     * for sorted arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.sortedUniqBy([1.1, 1.2, 2.3, 2.4], Math.floor);\n     * // => [1.1, 2.3]\n     */\n    function sortedUniqBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSortedUniq(array, getIteratee(iteratee, 2))\n        : [];\n    }\n\n    /**\n     * Gets all but the first element of `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.tail([1, 2, 3]);\n     * // => [2, 3]\n     */\n    function tail(array) {\n      var length = array == null ? 0 : array.length;\n      return length ? baseSlice(array, 1, length) : [];\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the beginning.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.take([1, 2, 3]);\n     * // => [1]\n     *\n     * _.take([1, 2, 3], 2);\n     * // => [1, 2]\n     *\n     * _.take([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.take([1, 2, 3], 0);\n     * // => []\n     */\n    function take(array, n, guard) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      return baseSlice(array, 0, n < 0 ? 0 : n);\n    }\n\n    /**\n     * Creates a slice of `array` with `n` elements taken from the end.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {number} [n=1] The number of elements to take.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * _.takeRight([1, 2, 3]);\n     * // => [3]\n     *\n     * _.takeRight([1, 2, 3], 2);\n     * // => [2, 3]\n     *\n     * _.takeRight([1, 2, 3], 5);\n     * // => [1, 2, 3]\n     *\n     * _.takeRight([1, 2, 3], 0);\n     * // => []\n     */\n    function takeRight(array, n, guard) {\n      var length = array == null ? 0 : array.length;\n      if (!length) {\n        return [];\n      }\n      n = (guard || n === undefined) ? 1 : toInteger(n);\n      n = length - n;\n      return baseSlice(array, n < 0 ? 0 : n, length);\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the end. Elements are\n     * taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': true },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': false }\n     * ];\n     *\n     * _.takeRightWhile(users, function(o) { return !o.active; });\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeRightWhile(users, { 'user': 'pebbles', 'active': false });\n     * // => objects for ['pebbles']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeRightWhile(users, ['active', false]);\n     * // => objects for ['fred', 'pebbles']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeRightWhile(users, 'active');\n     * // => []\n     */\n    function takeRightWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3), false, true)\n        : [];\n    }\n\n    /**\n     * Creates a slice of `array` with elements taken from the beginning. Elements\n     * are taken until `predicate` returns falsey. The predicate is invoked with\n     * three arguments: (value, index, array).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Array\n     * @param {Array} array The array to query.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the slice of `array`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'active': false },\n     *   { 'user': 'fred',    'active': false },\n     *   { 'user': 'pebbles', 'active': true }\n     * ];\n     *\n     * _.takeWhile(users, function(o) { return !o.active; });\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.takeWhile(users, { 'user': 'barney', 'active': false });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.takeWhile(users, ['active', false]);\n     * // => objects for ['barney', 'fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.takeWhile(users, 'active');\n     * // => []\n     */\n    function takeWhile(array, predicate) {\n      return (array && array.length)\n        ? baseWhile(array, getIteratee(predicate, 3))\n        : [];\n    }\n\n    /**\n     * Creates an array of unique values, in order, from all given arrays using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.union([2], [1, 2]);\n     * // => [2, 1]\n     */\n    var union = baseRest(function(arrays) {\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which uniqueness is computed. Result values are chosen from the first\n     * array in which the value occurs. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * _.unionBy([2.1], [1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    var unionBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.union` except that it accepts `comparator` which\n     * is invoked to compare elements of `arrays`. Result values are chosen from\n     * the first array in which the value occurs. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of combined values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.unionWith(objects, others, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var unionWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), undefined, comparator);\n    });\n\n    /**\n     * Creates a duplicate-free version of an array, using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons, in which only the first occurrence of each element\n     * is kept. The order of result values is determined by the order they occur\n     * in the array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniq([2, 1, 2]);\n     * // => [2, 1]\n     */\n    function uniq(array) {\n      return (array && array.length) ? baseUniq(array) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * uniqueness is computed. The order of result values is determined by the\n     * order they occur in the array. The iteratee is invoked with one argument:\n     * (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n     * // => [2.1, 1.2]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 1 }, { 'x': 2 }]\n     */\n    function uniqBy(array, iteratee) {\n      return (array && array.length) ? baseUniq(array, getIteratee(iteratee, 2)) : [];\n    }\n\n    /**\n     * This method is like `_.uniq` except that it accepts `comparator` which\n     * is invoked to compare elements of `array`. The order of result values is\n     * determined by the order they occur in the array.The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new duplicate free array.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.uniqWith(objects, _.isEqual);\n     * // => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }]\n     */\n    function uniqWith(array, comparator) {\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return (array && array.length) ? baseUniq(array, undefined, comparator) : [];\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts an array of grouped\n     * elements and creates an array regrouping the elements to their pre-zip\n     * configuration.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.2.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     *\n     * _.unzip(zipped);\n     * // => [['a', 'b'], [1, 2], [true, false]]\n     */\n    function unzip(array) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var length = 0;\n      array = arrayFilter(array, function(group) {\n        if (isArrayLikeObject(group)) {\n          length = nativeMax(group.length, length);\n          return true;\n        }\n      });\n      return baseTimes(length, function(index) {\n        return arrayMap(array, baseProperty(index));\n      });\n    }\n\n    /**\n     * This method is like `_.unzip` except that it accepts `iteratee` to specify\n     * how regrouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {Array} array The array of grouped elements to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  regrouped values.\n     * @returns {Array} Returns the new array of regrouped elements.\n     * @example\n     *\n     * var zipped = _.zip([1, 2], [10, 20], [100, 200]);\n     * // => [[1, 10, 100], [2, 20, 200]]\n     *\n     * _.unzipWith(zipped, _.add);\n     * // => [3, 30, 300]\n     */\n    function unzipWith(array, iteratee) {\n      if (!(array && array.length)) {\n        return [];\n      }\n      var result = unzip(array);\n      if (iteratee == null) {\n        return result;\n      }\n      return arrayMap(result, function(group) {\n        return apply(iteratee, undefined, group);\n      });\n    }\n\n    /**\n     * Creates an array excluding all given values using\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * for equality comparisons.\n     *\n     * **Note:** Unlike `_.pull`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {Array} array The array to inspect.\n     * @param {...*} [values] The values to exclude.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.xor\n     * @example\n     *\n     * _.without([2, 1, 2, 3], 1, 2);\n     * // => [3]\n     */\n    var without = baseRest(function(array, values) {\n      return isArrayLikeObject(array)\n        ? baseDifference(array, values)\n        : [];\n    });\n\n    /**\n     * Creates an array of unique values that is the\n     * [symmetric difference](https://en.wikipedia.org/wiki/Symmetric_difference)\n     * of the given arrays. The order of result values is determined by the order\n     * they occur in the arrays.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @returns {Array} Returns the new array of filtered values.\n     * @see _.difference, _.without\n     * @example\n     *\n     * _.xor([2, 1], [2, 3]);\n     * // => [1, 3]\n     */\n    var xor = baseRest(function(arrays) {\n      return baseXor(arrayFilter(arrays, isArrayLikeObject));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `iteratee` which is\n     * invoked for each element of each `arrays` to generate the criterion by\n     * which by which they're compared. The order of result values is determined\n     * by the order they occur in the arrays. The iteratee is invoked with one\n     * argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * _.xorBy([2.1, 1.2], [2.3, 3.4], Math.floor);\n     * // => [1.2, 3.4]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.xorBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');\n     * // => [{ 'x': 2 }]\n     */\n    var xorBy = baseRest(function(arrays) {\n      var iteratee = last(arrays);\n      if (isArrayLikeObject(iteratee)) {\n        iteratee = undefined;\n      }\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), getIteratee(iteratee, 2));\n    });\n\n    /**\n     * This method is like `_.xor` except that it accepts `comparator` which is\n     * invoked to compare elements of `arrays`. The order of result values is\n     * determined by the order they occur in the arrays. The comparator is invoked\n     * with two arguments: (arrVal, othVal).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to inspect.\n     * @param {Function} [comparator] The comparator invoked per element.\n     * @returns {Array} Returns the new array of filtered values.\n     * @example\n     *\n     * var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];\n     * var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];\n     *\n     * _.xorWith(objects, others, _.isEqual);\n     * // => [{ 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]\n     */\n    var xorWith = baseRest(function(arrays) {\n      var comparator = last(arrays);\n      comparator = typeof comparator == 'function' ? comparator : undefined;\n      return baseXor(arrayFilter(arrays, isArrayLikeObject), undefined, comparator);\n    });\n\n    /**\n     * Creates an array of grouped elements, the first of which contains the\n     * first elements of the given arrays, the second of which contains the\n     * second elements of the given arrays, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zip(['a', 'b'], [1, 2], [true, false]);\n     * // => [['a', 1, true], ['b', 2, false]]\n     */\n    var zip = baseRest(unzip);\n\n    /**\n     * This method is like `_.fromPairs` except that it accepts two arrays,\n     * one of property identifiers and one of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.4.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObject(['a', 'b'], [1, 2]);\n     * // => { 'a': 1, 'b': 2 }\n     */\n    function zipObject(props, values) {\n      return baseZipObject(props || [], values || [], assignValue);\n    }\n\n    /**\n     * This method is like `_.zipObject` except that it supports property paths.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Array\n     * @param {Array} [props=[]] The property identifiers.\n     * @param {Array} [values=[]] The property values.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * _.zipObjectDeep(['a.b[0].c', 'a.b[1].d'], [1, 2]);\n     * // => { 'a': { 'b': [{ 'c': 1 }, { 'd': 2 }] } }\n     */\n    function zipObjectDeep(props, values) {\n      return baseZipObject(props || [], values || [], baseSet);\n    }\n\n    /**\n     * This method is like `_.zip` except that it accepts `iteratee` to specify\n     * how grouped values should be combined. The iteratee is invoked with the\n     * elements of each group: (...group).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Array\n     * @param {...Array} [arrays] The arrays to process.\n     * @param {Function} [iteratee=_.identity] The function to combine\n     *  grouped values.\n     * @returns {Array} Returns the new array of grouped elements.\n     * @example\n     *\n     * _.zipWith([1, 2], [10, 20], [100, 200], function(a, b, c) {\n     *   return a + b + c;\n     * });\n     * // => [111, 222]\n     */\n    var zipWith = baseRest(function(arrays) {\n      var length = arrays.length,\n          iteratee = length > 1 ? arrays[length - 1] : undefined;\n\n      iteratee = typeof iteratee == 'function' ? (arrays.pop(), iteratee) : undefined;\n      return unzipWith(arrays, iteratee);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates a `lodash` wrapper instance that wraps `value` with explicit method\n     * chain sequences enabled. The result of such sequences must be unwrapped\n     * with `_#value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Seq\n     * @param {*} value The value to wrap.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36 },\n     *   { 'user': 'fred',    'age': 40 },\n     *   { 'user': 'pebbles', 'age': 1 }\n     * ];\n     *\n     * var youngest = _\n     *   .chain(users)\n     *   .sortBy('age')\n     *   .map(function(o) {\n     *     return o.user + ' is ' + o.age;\n     *   })\n     *   .head()\n     *   .value();\n     * // => 'pebbles is 1'\n     */\n    function chain(value) {\n      var result = lodash(value);\n      result.__chain__ = true;\n      return result;\n    }\n\n    /**\n     * This method invokes `interceptor` and returns `value`. The interceptor\n     * is invoked with one argument; (value). The purpose of this method is to\n     * \"tap into\" a method chain sequence in order to modify intermediate results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * _([1, 2, 3])\n     *  .tap(function(array) {\n     *    // Mutate input array.\n     *    array.pop();\n     *  })\n     *  .reverse()\n     *  .value();\n     * // => [2, 1]\n     */\n    function tap(value, interceptor) {\n      interceptor(value);\n      return value;\n    }\n\n    /**\n     * This method is like `_.tap` except that it returns the result of `interceptor`.\n     * The purpose of this method is to \"pass thru\" values replacing intermediate\n     * results in a method chain sequence.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Seq\n     * @param {*} value The value to provide to `interceptor`.\n     * @param {Function} interceptor The function to invoke.\n     * @returns {*} Returns the result of `interceptor`.\n     * @example\n     *\n     * _('  abc  ')\n     *  .chain()\n     *  .trim()\n     *  .thru(function(value) {\n     *    return [value];\n     *  })\n     *  .value();\n     * // => ['abc']\n     */\n    function thru(value, interceptor) {\n      return interceptor(value);\n    }\n\n    /**\n     * This method is the wrapper version of `_.at`.\n     *\n     * @name at\n     * @memberOf _\n     * @since 1.0.0\n     * @category Seq\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _(object).at(['a[0].b.c', 'a[1]']).value();\n     * // => [3, 4]\n     */\n    var wrapperAt = flatRest(function(paths) {\n      var length = paths.length,\n          start = length ? paths[0] : 0,\n          value = this.__wrapped__,\n          interceptor = function(object) { return baseAt(object, paths); };\n\n      if (length > 1 || this.__actions__.length ||\n          !(value instanceof LazyWrapper) || !isIndex(start)) {\n        return this.thru(interceptor);\n      }\n      value = value.slice(start, +start + (length ? 1 : 0));\n      value.__actions__.push({\n        'func': thru,\n        'args': [interceptor],\n        'thisArg': undefined\n      });\n      return new LodashWrapper(value, this.__chain__).thru(function(array) {\n        if (length && !array.length) {\n          array.push(undefined);\n        }\n        return array;\n      });\n    });\n\n    /**\n     * Creates a `lodash` wrapper instance with explicit method chain sequences enabled.\n     *\n     * @name chain\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 40 }\n     * ];\n     *\n     * // A sequence without explicit chaining.\n     * _(users).head();\n     * // => { 'user': 'barney', 'age': 36 }\n     *\n     * // A sequence with explicit chaining.\n     * _(users)\n     *   .chain()\n     *   .head()\n     *   .pick('user')\n     *   .value();\n     * // => { 'user': 'barney' }\n     */\n    function wrapperChain() {\n      return chain(this);\n    }\n\n    /**\n     * Executes the chain sequence and returns the wrapped result.\n     *\n     * @name commit\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2];\n     * var wrapped = _(array).push(3);\n     *\n     * console.log(array);\n     * // => [1, 2]\n     *\n     * wrapped = wrapped.commit();\n     * console.log(array);\n     * // => [1, 2, 3]\n     *\n     * wrapped.last();\n     * // => 3\n     *\n     * console.log(array);\n     * // => [1, 2, 3]\n     */\n    function wrapperCommit() {\n      return new LodashWrapper(this.value(), this.__chain__);\n    }\n\n    /**\n     * Gets the next value on a wrapped object following the\n     * [iterator protocol](https://mdn.io/iteration_protocols#iterator).\n     *\n     * @name next\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the next iterator value.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 1 }\n     *\n     * wrapped.next();\n     * // => { 'done': false, 'value': 2 }\n     *\n     * wrapped.next();\n     * // => { 'done': true, 'value': undefined }\n     */\n    function wrapperNext() {\n      if (this.__values__ === undefined) {\n        this.__values__ = toArray(this.value());\n      }\n      var done = this.__index__ >= this.__values__.length,\n          value = done ? undefined : this.__values__[this.__index__++];\n\n      return { 'done': done, 'value': value };\n    }\n\n    /**\n     * Enables the wrapper to be iterable.\n     *\n     * @name Symbol.iterator\n     * @memberOf _\n     * @since 4.0.0\n     * @category Seq\n     * @returns {Object} Returns the wrapper object.\n     * @example\n     *\n     * var wrapped = _([1, 2]);\n     *\n     * wrapped[Symbol.iterator]() === wrapped;\n     * // => true\n     *\n     * Array.from(wrapped);\n     * // => [1, 2]\n     */\n    function wrapperToIterator() {\n      return this;\n    }\n\n    /**\n     * Creates a clone of the chain sequence planting `value` as the wrapped value.\n     *\n     * @name plant\n     * @memberOf _\n     * @since 3.2.0\n     * @category Seq\n     * @param {*} value The value to plant.\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var wrapped = _([1, 2]).map(square);\n     * var other = wrapped.plant([3, 4]);\n     *\n     * other.value();\n     * // => [9, 16]\n     *\n     * wrapped.value();\n     * // => [1, 4]\n     */\n    function wrapperPlant(value) {\n      var result,\n          parent = this;\n\n      while (parent instanceof baseLodash) {\n        var clone = wrapperClone(parent);\n        clone.__index__ = 0;\n        clone.__values__ = undefined;\n        if (result) {\n          previous.__wrapped__ = clone;\n        } else {\n          result = clone;\n        }\n        var previous = clone;\n        parent = parent.__wrapped__;\n      }\n      previous.__wrapped__ = value;\n      return result;\n    }\n\n    /**\n     * This method is the wrapper version of `_.reverse`.\n     *\n     * **Note:** This method mutates the wrapped array.\n     *\n     * @name reverse\n     * @memberOf _\n     * @since 0.1.0\n     * @category Seq\n     * @returns {Object} Returns the new `lodash` wrapper instance.\n     * @example\n     *\n     * var array = [1, 2, 3];\n     *\n     * _(array).reverse().value()\n     * // => [3, 2, 1]\n     *\n     * console.log(array);\n     * // => [3, 2, 1]\n     */\n    function wrapperReverse() {\n      var value = this.__wrapped__;\n      if (value instanceof LazyWrapper) {\n        var wrapped = value;\n        if (this.__actions__.length) {\n          wrapped = new LazyWrapper(this);\n        }\n        wrapped = wrapped.reverse();\n        wrapped.__actions__.push({\n          'func': thru,\n          'args': [reverse],\n          'thisArg': undefined\n        });\n        return new LodashWrapper(wrapped, this.__chain__);\n      }\n      return this.thru(reverse);\n    }\n\n    /**\n     * Executes the chain sequence to resolve the unwrapped value.\n     *\n     * @name value\n     * @memberOf _\n     * @since 0.1.0\n     * @alias toJSON, valueOf\n     * @category Seq\n     * @returns {*} Returns the resolved unwrapped value.\n     * @example\n     *\n     * _([1, 2, 3]).value();\n     * // => [1, 2, 3]\n     */\n    function wrapperValue() {\n      return baseWrapperValue(this.__wrapped__, this.__actions__);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the number of times the key was returned by `iteratee`. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.countBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': 1, '6': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.countBy(['one', 'two', 'three'], 'length');\n     * // => { '3': 2, '5': 1 }\n     */\n    var countBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        ++result[key];\n      } else {\n        baseAssignValue(result, key, 1);\n      }\n    });\n\n    /**\n     * Checks if `predicate` returns truthy for **all** elements of `collection`.\n     * Iteration is stopped once `predicate` returns falsey. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * **Note:** This method returns `true` for\n     * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n     * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n     * elements of empty collections.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if all elements pass the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.every([true, 1, null, 'yes'], Boolean);\n     * // => false\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.every(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.every(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.every(users, 'active');\n     * // => false\n     */\n    function every(collection, predicate, guard) {\n      var func = isArray(collection) ? arrayEvery : baseEvery;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning an array of all elements\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * **Note:** Unlike `_.remove`, this method returns a new array.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.reject\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * _.filter(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, { 'age': 36, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.filter(users, 'active');\n     * // => objects for ['barney']\n     *\n     * // Combining several predicates using `_.overEvery` or `_.overSome`.\n     * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));\n     * // => objects for ['fred', 'barney']\n     */\n    function filter(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Iterates over elements of `collection`, returning the first element\n     * `predicate` returns truthy for. The predicate is invoked with three\n     * arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': true },\n     *   { 'user': 'fred',    'age': 40, 'active': false },\n     *   { 'user': 'pebbles', 'age': 1,  'active': true }\n     * ];\n     *\n     * _.find(users, function(o) { return o.age < 40; });\n     * // => object for 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.find(users, { 'age': 1, 'active': true });\n     * // => object for 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.find(users, ['active', false]);\n     * // => object for 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.find(users, 'active');\n     * // => object for 'barney'\n     */\n    var find = createFind(findIndex);\n\n    /**\n     * This method is like `_.find` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param {number} [fromIndex=collection.length-1] The index to search from.\n     * @returns {*} Returns the matched element, else `undefined`.\n     * @example\n     *\n     * _.findLast([1, 2, 3, 4], function(n) {\n     *   return n % 2 == 1;\n     * });\n     * // => 3\n     */\n    var findLast = createFind(findLastIndex);\n\n    /**\n     * Creates a flattened array of values by running each element in `collection`\n     * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n     * with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [n, n];\n     * }\n     *\n     * _.flatMap([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMap(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), 1);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDeep([1, 2], duplicate);\n     * // => [1, 1, 2, 2]\n     */\n    function flatMapDeep(collection, iteratee) {\n      return baseFlatten(map(collection, iteratee), INFINITY);\n    }\n\n    /**\n     * This method is like `_.flatMap` except that it recursively flattens the\n     * mapped results up to `depth` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {number} [depth=1] The maximum recursion depth.\n     * @returns {Array} Returns the new flattened array.\n     * @example\n     *\n     * function duplicate(n) {\n     *   return [[[n, n]]];\n     * }\n     *\n     * _.flatMapDepth([1, 2], duplicate, 2);\n     * // => [[1, 1], [2, 2]]\n     */\n    function flatMapDepth(collection, iteratee, depth) {\n      depth = depth === undefined ? 1 : toInteger(depth);\n      return baseFlatten(map(collection, iteratee), depth);\n    }\n\n    /**\n     * Iterates over elements of `collection` and invokes `iteratee` for each element.\n     * The iteratee is invoked with three arguments: (value, index|key, collection).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n     * property are iterated like arrays. To avoid this behavior use `_.forIn`\n     * or `_.forOwn` for object iteration.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @alias each\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEachRight\n     * @example\n     *\n     * _.forEach([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `1` then `2`.\n     *\n     * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forEach(collection, iteratee) {\n      var func = isArray(collection) ? arrayEach : baseEach;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forEach` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @alias eachRight\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array|Object} Returns `collection`.\n     * @see _.forEach\n     * @example\n     *\n     * _.forEachRight([1, 2], function(value) {\n     *   console.log(value);\n     * });\n     * // => Logs `2` then `1`.\n     */\n    function forEachRight(collection, iteratee) {\n      var func = isArray(collection) ? arrayEachRight : baseEachRight;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The order of grouped values\n     * is determined by the order they occur in `collection`. The corresponding\n     * value of each key is an array of elements responsible for generating the\n     * key. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n     * // => { '4': [4.2], '6': [6.1, 6.3] }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.groupBy(['one', 'two', 'three'], 'length');\n     * // => { '3': ['one', 'two'], '5': ['three'] }\n     */\n    var groupBy = createAggregator(function(result, value, key) {\n      if (hasOwnProperty.call(result, key)) {\n        result[key].push(value);\n      } else {\n        baseAssignValue(result, key, [value]);\n      }\n    });\n\n    /**\n     * Checks if `value` is in `collection`. If `collection` is a string, it's\n     * checked for a substring of `value`, otherwise\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * is used for equality comparisons. If `fromIndex` is negative, it's used as\n     * the offset from the end of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @param {*} value The value to search for.\n     * @param {number} [fromIndex=0] The index to search from.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {boolean} Returns `true` if `value` is found, else `false`.\n     * @example\n     *\n     * _.includes([1, 2, 3], 1);\n     * // => true\n     *\n     * _.includes([1, 2, 3], 1, 2);\n     * // => false\n     *\n     * _.includes({ 'a': 1, 'b': 2 }, 1);\n     * // => true\n     *\n     * _.includes('abcd', 'bc');\n     * // => true\n     */\n    function includes(collection, value, fromIndex, guard) {\n      collection = isArrayLike(collection) ? collection : values(collection);\n      fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n      var length = collection.length;\n      if (fromIndex < 0) {\n        fromIndex = nativeMax(length + fromIndex, 0);\n      }\n      return isString(collection)\n        ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n        : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n    }\n\n    /**\n     * Invokes the method at `path` of each element in `collection`, returning\n     * an array of the results of each invoked method. Any additional arguments\n     * are provided to each invoked method. If `path` is a function, it's invoked\n     * for, and `this` bound to, each element in `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array|Function|string} path The path of the method to invoke or\n     *  the function invoked per iteration.\n     * @param {...*} [args] The arguments to invoke each method with.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.invokeMap([[5, 1, 7], [3, 2, 1]], 'sort');\n     * // => [[1, 5, 7], [1, 2, 3]]\n     *\n     * _.invokeMap([123, 456], String.prototype.split, '');\n     * // => [['1', '2', '3'], ['4', '5', '6']]\n     */\n    var invokeMap = baseRest(function(collection, path, args) {\n      var index = -1,\n          isFunc = typeof path == 'function',\n          result = isArrayLike(collection) ? Array(collection.length) : [];\n\n      baseEach(collection, function(value) {\n        result[++index] = isFunc ? apply(path, value, args) : baseInvoke(value, path, args);\n      });\n      return result;\n    });\n\n    /**\n     * Creates an object composed of keys generated from the results of running\n     * each element of `collection` thru `iteratee`. The corresponding value of\n     * each key is the last element responsible for generating the key. The\n     * iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n     * @returns {Object} Returns the composed aggregate object.\n     * @example\n     *\n     * var array = [\n     *   { 'dir': 'left', 'code': 97 },\n     *   { 'dir': 'right', 'code': 100 }\n     * ];\n     *\n     * _.keyBy(array, function(o) {\n     *   return String.fromCharCode(o.code);\n     * });\n     * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n     *\n     * _.keyBy(array, 'dir');\n     * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n     */\n    var keyBy = createAggregator(function(result, value, key) {\n      baseAssignValue(result, key, value);\n    });\n\n    /**\n     * Creates an array of values by running each element in `collection` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n     *\n     * The guarded methods are:\n     * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n     * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n     * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n     * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new mapped array.\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * _.map([4, 8], square);\n     * // => [16, 64]\n     *\n     * _.map({ 'a': 4, 'b': 8 }, square);\n     * // => [16, 64] (iteration order is not guaranteed)\n     *\n     * var users = [\n     *   { 'user': 'barney' },\n     *   { 'user': 'fred' }\n     * ];\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, 'user');\n     * // => ['barney', 'fred']\n     */\n    function map(collection, iteratee) {\n      var func = isArray(collection) ? arrayMap : baseMap;\n      return func(collection, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.sortBy` except that it allows specifying the sort\n     * orders of the iteratees to sort by. If `orders` is unspecified, all values\n     * are sorted in ascending order. Otherwise, specify an order of \"desc\" for\n     * descending or \"asc\" for ascending sort order of corresponding values.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Array[]|Function[]|Object[]|string[]} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @param {string[]} [orders] The sort orders of `iteratees`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 34 },\n     *   { 'user': 'fred',   'age': 40 },\n     *   { 'user': 'barney', 'age': 36 }\n     * ];\n     *\n     * // Sort by `user` in ascending order and by `age` in descending order.\n     * _.orderBy(users, ['user', 'age'], ['asc', 'desc']);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 40]]\n     */\n    function orderBy(collection, iteratees, orders, guard) {\n      if (collection == null) {\n        return [];\n      }\n      if (!isArray(iteratees)) {\n        iteratees = iteratees == null ? [] : [iteratees];\n      }\n      orders = guard ? undefined : orders;\n      if (!isArray(orders)) {\n        orders = orders == null ? [] : [orders];\n      }\n      return baseOrderBy(collection, iteratees, orders);\n    }\n\n    /**\n     * Creates an array of elements split into two groups, the first of which\n     * contains elements `predicate` returns truthy for, the second of which\n     * contains elements `predicate` returns falsey for. The predicate is\n     * invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of grouped elements.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney',  'age': 36, 'active': false },\n     *   { 'user': 'fred',    'age': 40, 'active': true },\n     *   { 'user': 'pebbles', 'age': 1,  'active': false }\n     * ];\n     *\n     * _.partition(users, function(o) { return o.active; });\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.partition(users, { 'age': 1, 'active': false });\n     * // => objects for [['pebbles'], ['barney', 'fred']]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.partition(users, ['active', false]);\n     * // => objects for [['barney', 'pebbles'], ['fred']]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.partition(users, 'active');\n     * // => objects for [['fred'], ['barney', 'pebbles']]\n     */\n    var partition = createAggregator(function(result, value, key) {\n      result[key ? 0 : 1].push(value);\n    }, function() { return [[], []]; });\n\n    /**\n     * Reduces `collection` to a value which is the accumulated result of running\n     * each element in `collection` thru `iteratee`, where each successive\n     * invocation is supplied the return value of the previous. If `accumulator`\n     * is not given, the first element of `collection` is used as the initial\n     * value. The iteratee is invoked with four arguments:\n     * (accumulator, value, index|key, collection).\n     *\n     * Many lodash methods are guarded to work as iteratees for methods like\n     * `_.reduce`, `_.reduceRight`, and `_.transform`.\n     *\n     * The guarded methods are:\n     * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n     * and `sortBy`\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduceRight\n     * @example\n     *\n     * _.reduce([1, 2], function(sum, n) {\n     *   return sum + n;\n     * }, 0);\n     * // => 3\n     *\n     * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     *   return result;\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n     */\n    function reduce(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduce : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n    }\n\n    /**\n     * This method is like `_.reduce` except that it iterates over elements of\n     * `collection` from right to left.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The initial value.\n     * @returns {*} Returns the accumulated value.\n     * @see _.reduce\n     * @example\n     *\n     * var array = [[0, 1], [2, 3], [4, 5]];\n     *\n     * _.reduceRight(array, function(flattened, other) {\n     *   return flattened.concat(other);\n     * }, []);\n     * // => [4, 5, 2, 3, 0, 1]\n     */\n    function reduceRight(collection, iteratee, accumulator) {\n      var func = isArray(collection) ? arrayReduceRight : baseReduce,\n          initAccum = arguments.length < 3;\n\n      return func(collection, getIteratee(iteratee, 4), accumulator, initAccum, baseEachRight);\n    }\n\n    /**\n     * The opposite of `_.filter`; this method returns the elements of `collection`\n     * that `predicate` does **not** return truthy for.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the new filtered array.\n     * @see _.filter\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': false },\n     *   { 'user': 'fred',   'age': 40, 'active': true }\n     * ];\n     *\n     * _.reject(users, function(o) { return !o.active; });\n     * // => objects for ['fred']\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.reject(users, { 'age': 40, 'active': true });\n     * // => objects for ['barney']\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.reject(users, ['active', false]);\n     * // => objects for ['fred']\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.reject(users, 'active');\n     * // => objects for ['barney']\n     */\n    function reject(collection, predicate) {\n      var func = isArray(collection) ? arrayFilter : baseFilter;\n      return func(collection, negate(getIteratee(predicate, 3)));\n    }\n\n    /**\n     * Gets a random element from `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @returns {*} Returns the random element.\n     * @example\n     *\n     * _.sample([1, 2, 3, 4]);\n     * // => 2\n     */\n    function sample(collection) {\n      var func = isArray(collection) ? arraySample : baseSample;\n      return func(collection);\n    }\n\n    /**\n     * Gets `n` random elements at unique keys from `collection` up to the\n     * size of `collection`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to sample.\n     * @param {number} [n=1] The number of elements to sample.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the random elements.\n     * @example\n     *\n     * _.sampleSize([1, 2, 3], 2);\n     * // => [3, 1]\n     *\n     * _.sampleSize([1, 2, 3], 4);\n     * // => [2, 3, 1]\n     */\n    function sampleSize(collection, n, guard) {\n      if ((guard ? isIterateeCall(collection, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      var func = isArray(collection) ? arraySampleSize : baseSampleSize;\n      return func(collection, n);\n    }\n\n    /**\n     * Creates an array of shuffled values, using a version of the\n     * [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher-Yates_shuffle).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to shuffle.\n     * @returns {Array} Returns the new shuffled array.\n     * @example\n     *\n     * _.shuffle([1, 2, 3, 4]);\n     * // => [4, 1, 3, 2]\n     */\n    function shuffle(collection) {\n      var func = isArray(collection) ? arrayShuffle : baseShuffle;\n      return func(collection);\n    }\n\n    /**\n     * Gets the size of `collection` by returning its length for array-like\n     * values or the number of own enumerable string keyed properties for objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object|string} collection The collection to inspect.\n     * @returns {number} Returns the collection size.\n     * @example\n     *\n     * _.size([1, 2, 3]);\n     * // => 3\n     *\n     * _.size({ 'a': 1, 'b': 2 });\n     * // => 2\n     *\n     * _.size('pebbles');\n     * // => 7\n     */\n    function size(collection) {\n      if (collection == null) {\n        return 0;\n      }\n      if (isArrayLike(collection)) {\n        return isString(collection) ? stringSize(collection) : collection.length;\n      }\n      var tag = getTag(collection);\n      if (tag == mapTag || tag == setTag) {\n        return collection.size;\n      }\n      return baseKeys(collection).length;\n    }\n\n    /**\n     * Checks if `predicate` returns truthy for **any** element of `collection`.\n     * Iteration is stopped once `predicate` returns truthy. The predicate is\n     * invoked with three arguments: (value, index|key, collection).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {boolean} Returns `true` if any element passes the predicate check,\n     *  else `false`.\n     * @example\n     *\n     * _.some([null, 0, 'yes', false], Boolean);\n     * // => true\n     *\n     * var users = [\n     *   { 'user': 'barney', 'active': true },\n     *   { 'user': 'fred',   'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.some(users, { 'user': 'barney', 'active': false });\n     * // => false\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.some(users, ['active', false]);\n     * // => true\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.some(users, 'active');\n     * // => true\n     */\n    function some(collection, predicate, guard) {\n      var func = isArray(collection) ? arraySome : baseSome;\n      if (guard && isIterateeCall(collection, predicate, guard)) {\n        predicate = undefined;\n      }\n      return func(collection, getIteratee(predicate, 3));\n    }\n\n    /**\n     * Creates an array of elements, sorted in ascending order by the results of\n     * running each element in a collection thru each iteratee. This method\n     * performs a stable sort, that is, it preserves the original sort order of\n     * equal elements. The iteratees are invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Collection\n     * @param {Array|Object} collection The collection to iterate over.\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to sort by.\n     * @returns {Array} Returns the new sorted array.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'fred',   'age': 48 },\n     *   { 'user': 'barney', 'age': 36 },\n     *   { 'user': 'fred',   'age': 30 },\n     *   { 'user': 'barney', 'age': 34 }\n     * ];\n     *\n     * _.sortBy(users, [function(o) { return o.user; }]);\n     * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]\n     *\n     * _.sortBy(users, ['user', 'age']);\n     * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]\n     */\n    var sortBy = baseRest(function(collection, iteratees) {\n      if (collection == null) {\n        return [];\n      }\n      var length = iteratees.length;\n      if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n        iteratees = [];\n      } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n        iteratees = [iteratees[0]];\n      }\n      return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n    });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Gets the timestamp of the number of milliseconds that have elapsed since\n     * the Unix epoch (1 January 1970 00:00:00 UTC).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Date\n     * @returns {number} Returns the timestamp.\n     * @example\n     *\n     * _.defer(function(stamp) {\n     *   console.log(_.now() - stamp);\n     * }, _.now());\n     * // => Logs the number of milliseconds it took for the deferred invocation.\n     */\n    var now = ctxNow || function() {\n      return root.Date.now();\n    };\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The opposite of `_.before`; this method creates a function that invokes\n     * `func` once it's called `n` or more times.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {number} n The number of calls before `func` is invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var saves = ['profile', 'settings'];\n     *\n     * var done = _.after(saves.length, function() {\n     *   console.log('done saving!');\n     * });\n     *\n     * _.forEach(saves, function(type) {\n     *   asyncSave({ 'type': type, 'complete': done });\n     * });\n     * // => Logs 'done saving!' after the two async saves have completed.\n     */\n    function after(n, func) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n < 1) {\n          return func.apply(this, arguments);\n        }\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func`, with up to `n` arguments,\n     * ignoring any additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @param {number} [n=func.length] The arity cap.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.ary(parseInt, 1));\n     * // => [6, 8, 10]\n     */\n    function ary(func, n, guard) {\n      n = guard ? undefined : n;\n      n = (func && n == null) ? func.length : n;\n      return createWrap(func, WRAP_ARY_FLAG, undefined, undefined, undefined, undefined, n);\n    }\n\n    /**\n     * Creates a function that invokes `func`, with the `this` binding and arguments\n     * of the created function, while it's called less than `n` times. Subsequent\n     * calls to the created function return the result of the last `func` invocation.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {number} n The number of calls at which `func` is no longer invoked.\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * jQuery(element).on('click', _.before(5, addContactToList));\n     * // => Allows adding up to 4 contacts to the list.\n     */\n    function before(n, func) {\n      var result;\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      n = toInteger(n);\n      return function() {\n        if (--n > 0) {\n          result = func.apply(this, arguments);\n        }\n        if (n <= 1) {\n          func = undefined;\n        }\n        return result;\n      };\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of `thisArg`\n     * and `partials` prepended to the arguments it receives.\n     *\n     * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** Unlike native `Function#bind`, this method doesn't set the \"length\"\n     * property of bound functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to bind.\n     * @param {*} thisArg The `this` binding of `func`.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * function greet(greeting, punctuation) {\n     *   return greeting + ' ' + this.user + punctuation;\n     * }\n     *\n     * var object = { 'user': 'fred' };\n     *\n     * var bound = _.bind(greet, object, 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bind(greet, object, _, '!');\n     * bound('hi');\n     * // => 'hi fred!'\n     */\n    var bind = baseRest(function(func, thisArg, partials) {\n      var bitmask = WRAP_BIND_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bind));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(func, bitmask, thisArg, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes the method at `object[key]` with `partials`\n     * prepended to the arguments it receives.\n     *\n     * This method differs from `_.bind` by allowing bound functions to reference\n     * methods that may be redefined or don't yet exist. See\n     * [Peter Michaux's article](http://peter.michaux.ca/articles/lazy-function-definition-pattern)\n     * for more details.\n     *\n     * The `_.bindKey.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Function\n     * @param {Object} object The object to invoke the method on.\n     * @param {string} key The key of the method.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new bound function.\n     * @example\n     *\n     * var object = {\n     *   'user': 'fred',\n     *   'greet': function(greeting, punctuation) {\n     *     return greeting + ' ' + this.user + punctuation;\n     *   }\n     * };\n     *\n     * var bound = _.bindKey(object, 'greet', 'hi');\n     * bound('!');\n     * // => 'hi fred!'\n     *\n     * object.greet = function(greeting, punctuation) {\n     *   return greeting + 'ya ' + this.user + punctuation;\n     * };\n     *\n     * bound('!');\n     * // => 'hiya fred!'\n     *\n     * // Bound with placeholders.\n     * var bound = _.bindKey(object, 'greet', _, '!');\n     * bound('hi');\n     * // => 'hiya fred!'\n     */\n    var bindKey = baseRest(function(object, key, partials) {\n      var bitmask = WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG;\n      if (partials.length) {\n        var holders = replaceHolders(partials, getHolder(bindKey));\n        bitmask |= WRAP_PARTIAL_FLAG;\n      }\n      return createWrap(key, bitmask, object, partials, holders);\n    });\n\n    /**\n     * Creates a function that accepts arguments of `func` and either invokes\n     * `func` returning its result, if at least `arity` number of arguments have\n     * been provided, or returns a function that accepts the remaining `func`\n     * arguments, and so on. The arity of `func` may be specified if `func.length`\n     * is not sufficient.\n     *\n     * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds,\n     * may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curry(abc);\n     *\n     * curried(1)(2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2)(3);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(1)(_, 3)(2);\n     * // => [1, 2, 3]\n     */\n    function curry(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curry.placeholder;\n      return result;\n    }\n\n    /**\n     * This method is like `_.curry` except that arguments are applied to `func`\n     * in the manner of `_.partialRight` instead of `_.partial`.\n     *\n     * The `_.curryRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for provided arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of curried functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to curry.\n     * @param {number} [arity=func.length] The arity of `func`.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the new curried function.\n     * @example\n     *\n     * var abc = function(a, b, c) {\n     *   return [a, b, c];\n     * };\n     *\n     * var curried = _.curryRight(abc);\n     *\n     * curried(3)(2)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(2, 3)(1);\n     * // => [1, 2, 3]\n     *\n     * curried(1, 2, 3);\n     * // => [1, 2, 3]\n     *\n     * // Curried with placeholders.\n     * curried(3)(1, _)(2);\n     * // => [1, 2, 3]\n     */\n    function curryRight(func, arity, guard) {\n      arity = guard ? undefined : arity;\n      var result = createWrap(func, WRAP_CURRY_RIGHT_FLAG, undefined, undefined, undefined, undefined, undefined, arity);\n      result.placeholder = curryRight.placeholder;\n      return result;\n    }\n\n    /**\n     * Creates a debounced function that delays invoking `func` until after `wait`\n     * milliseconds have elapsed since the last time the debounced function was\n     * invoked. The debounced function comes with a `cancel` method to cancel\n     * delayed `func` invocations and a `flush` method to immediately invoke them.\n     * Provide `options` to indicate whether `func` should be invoked on the\n     * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n     * with the last arguments provided to the debounced function. Subsequent\n     * calls to the debounced function return the result of the last `func`\n     * invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the debounced function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.debounce` and `_.throttle`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to debounce.\n     * @param {number} [wait=0] The number of milliseconds to delay.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=false]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {number} [options.maxWait]\n     *  The maximum time `func` is allowed to be delayed before it's invoked.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new debounced function.\n     * @example\n     *\n     * // Avoid costly calculations while the window size is in flux.\n     * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n     *\n     * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n     * jQuery(element).on('click', _.debounce(sendMail, 300, {\n     *   'leading': true,\n     *   'trailing': false\n     * }));\n     *\n     * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n     * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n     * var source = new EventSource('/stream');\n     * jQuery(source).on('message', debounced);\n     *\n     * // Cancel the trailing debounced invocation.\n     * jQuery(window).on('popstate', debounced.cancel);\n     */\n    function debounce(func, wait, options) {\n      var lastArgs,\n          lastThis,\n          maxWait,\n          result,\n          timerId,\n          lastCallTime,\n          lastInvokeTime = 0,\n          leading = false,\n          maxing = false,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      wait = toNumber(wait) || 0;\n      if (isObject(options)) {\n        leading = !!options.leading;\n        maxing = 'maxWait' in options;\n        maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n\n      function invokeFunc(time) {\n        var args = lastArgs,\n            thisArg = lastThis;\n\n        lastArgs = lastThis = undefined;\n        lastInvokeTime = time;\n        result = func.apply(thisArg, args);\n        return result;\n      }\n\n      function leadingEdge(time) {\n        // Reset any `maxWait` timer.\n        lastInvokeTime = time;\n        // Start the timer for the trailing edge.\n        timerId = setTimeout(timerExpired, wait);\n        // Invoke the leading edge.\n        return leading ? invokeFunc(time) : result;\n      }\n\n      function remainingWait(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime,\n            timeWaiting = wait - timeSinceLastCall;\n\n        return maxing\n          ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n          : timeWaiting;\n      }\n\n      function shouldInvoke(time) {\n        var timeSinceLastCall = time - lastCallTime,\n            timeSinceLastInvoke = time - lastInvokeTime;\n\n        // Either this is the first call, activity has stopped and we're at the\n        // trailing edge, the system time has gone backwards and we're treating\n        // it as the trailing edge, or we've hit the `maxWait` limit.\n        return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n          (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n      }\n\n      function timerExpired() {\n        var time = now();\n        if (shouldInvoke(time)) {\n          return trailingEdge(time);\n        }\n        // Restart the timer.\n        timerId = setTimeout(timerExpired, remainingWait(time));\n      }\n\n      function trailingEdge(time) {\n        timerId = undefined;\n\n        // Only invoke if we have `lastArgs` which means `func` has been\n        // debounced at least once.\n        if (trailing && lastArgs) {\n          return invokeFunc(time);\n        }\n        lastArgs = lastThis = undefined;\n        return result;\n      }\n\n      function cancel() {\n        if (timerId !== undefined) {\n          clearTimeout(timerId);\n        }\n        lastInvokeTime = 0;\n        lastArgs = lastCallTime = lastThis = timerId = undefined;\n      }\n\n      function flush() {\n        return timerId === undefined ? result : trailingEdge(now());\n      }\n\n      function debounced() {\n        var time = now(),\n            isInvoking = shouldInvoke(time);\n\n        lastArgs = arguments;\n        lastThis = this;\n        lastCallTime = time;\n\n        if (isInvoking) {\n          if (timerId === undefined) {\n            return leadingEdge(lastCallTime);\n          }\n          if (maxing) {\n            // Handle invocations in a tight loop.\n            clearTimeout(timerId);\n            timerId = setTimeout(timerExpired, wait);\n            return invokeFunc(lastCallTime);\n          }\n        }\n        if (timerId === undefined) {\n          timerId = setTimeout(timerExpired, wait);\n        }\n        return result;\n      }\n      debounced.cancel = cancel;\n      debounced.flush = flush;\n      return debounced;\n    }\n\n    /**\n     * Defers invoking the `func` until the current call stack has cleared. Any\n     * additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to defer.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.defer(function(text) {\n     *   console.log(text);\n     * }, 'deferred');\n     * // => Logs 'deferred' after one millisecond.\n     */\n    var defer = baseRest(function(func, args) {\n      return baseDelay(func, 1, args);\n    });\n\n    /**\n     * Invokes `func` after `wait` milliseconds. Any additional arguments are\n     * provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to delay.\n     * @param {number} wait The number of milliseconds to delay invocation.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {number} Returns the timer id.\n     * @example\n     *\n     * _.delay(function(text) {\n     *   console.log(text);\n     * }, 1000, 'later');\n     * // => Logs 'later' after one second.\n     */\n    var delay = baseRest(function(func, wait, args) {\n      return baseDelay(func, toNumber(wait) || 0, args);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments reversed.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to flip arguments for.\n     * @returns {Function} Returns the new flipped function.\n     * @example\n     *\n     * var flipped = _.flip(function() {\n     *   return _.toArray(arguments);\n     * });\n     *\n     * flipped('a', 'b', 'c', 'd');\n     * // => ['d', 'c', 'b', 'a']\n     */\n    function flip(func) {\n      return createWrap(func, WRAP_FLIP_FLAG);\n    }\n\n    /**\n     * Creates a function that memoizes the result of `func`. If `resolver` is\n     * provided, it determines the cache key for storing the result based on the\n     * arguments provided to the memoized function. By default, the first argument\n     * provided to the memoized function is used as the map cache key. The `func`\n     * is invoked with the `this` binding of the memoized function.\n     *\n     * **Note:** The cache is exposed as the `cache` property on the memoized\n     * function. Its creation may be customized by replacing the `_.memoize.Cache`\n     * constructor with one whose instances implement the\n     * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n     * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to have its output memoized.\n     * @param {Function} [resolver] The function to resolve the cache key.\n     * @returns {Function} Returns the new memoized function.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     * var other = { 'c': 3, 'd': 4 };\n     *\n     * var values = _.memoize(_.values);\n     * values(object);\n     * // => [1, 2]\n     *\n     * values(other);\n     * // => [3, 4]\n     *\n     * object.a = 2;\n     * values(object);\n     * // => [1, 2]\n     *\n     * // Modify the result cache.\n     * values.cache.set(object, ['a', 'b']);\n     * values(object);\n     * // => ['a', 'b']\n     *\n     * // Replace `_.memoize.Cache`.\n     * _.memoize.Cache = WeakMap;\n     */\n    function memoize(func, resolver) {\n      if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      var memoized = function() {\n        var args = arguments,\n            key = resolver ? resolver.apply(this, args) : args[0],\n            cache = memoized.cache;\n\n        if (cache.has(key)) {\n          return cache.get(key);\n        }\n        var result = func.apply(this, args);\n        memoized.cache = cache.set(key, result) || cache;\n        return result;\n      };\n      memoized.cache = new (memoize.Cache || MapCache);\n      return memoized;\n    }\n\n    // Expose `MapCache`.\n    memoize.Cache = MapCache;\n\n    /**\n     * Creates a function that negates the result of the predicate `func`. The\n     * `func` predicate is invoked with the `this` binding and arguments of the\n     * created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} predicate The predicate to negate.\n     * @returns {Function} Returns the new negated function.\n     * @example\n     *\n     * function isEven(n) {\n     *   return n % 2 == 0;\n     * }\n     *\n     * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n     * // => [1, 3, 5]\n     */\n    function negate(predicate) {\n      if (typeof predicate != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      return function() {\n        var args = arguments;\n        switch (args.length) {\n          case 0: return !predicate.call(this);\n          case 1: return !predicate.call(this, args[0]);\n          case 2: return !predicate.call(this, args[0], args[1]);\n          case 3: return !predicate.call(this, args[0], args[1], args[2]);\n        }\n        return !predicate.apply(this, args);\n      };\n    }\n\n    /**\n     * Creates a function that is restricted to invoking `func` once. Repeat calls\n     * to the function return the value of the first invocation. The `func` is\n     * invoked with the `this` binding and arguments of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to restrict.\n     * @returns {Function} Returns the new restricted function.\n     * @example\n     *\n     * var initialize = _.once(createApplication);\n     * initialize();\n     * initialize();\n     * // => `createApplication` is invoked once\n     */\n    function once(func) {\n      return before(2, func);\n    }\n\n    /**\n     * Creates a function that invokes `func` with its arguments transformed.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Function\n     * @param {Function} func The function to wrap.\n     * @param {...(Function|Function[])} [transforms=[_.identity]]\n     *  The argument transforms.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * function doubled(n) {\n     *   return n * 2;\n     * }\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var func = _.overArgs(function(x, y) {\n     *   return [x, y];\n     * }, [square, doubled]);\n     *\n     * func(9, 3);\n     * // => [81, 6]\n     *\n     * func(10, 5);\n     * // => [100, 10]\n     */\n    var overArgs = castRest(function(func, transforms) {\n      transforms = (transforms.length == 1 && isArray(transforms[0]))\n        ? arrayMap(transforms[0], baseUnary(getIteratee()))\n        : arrayMap(baseFlatten(transforms, 1), baseUnary(getIteratee()));\n\n      var funcsLength = transforms.length;\n      return baseRest(function(args) {\n        var index = -1,\n            length = nativeMin(args.length, funcsLength);\n\n        while (++index < length) {\n          args[index] = transforms[index].call(this, args[index]);\n        }\n        return apply(func, this, args);\n      });\n    });\n\n    /**\n     * Creates a function that invokes `func` with `partials` prepended to the\n     * arguments it receives. This method is like `_.bind` except it does **not**\n     * alter the `this` binding.\n     *\n     * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.2.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var sayHelloTo = _.partial(greet, 'hello');\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     *\n     * // Partially applied with placeholders.\n     * var greetFred = _.partial(greet, _, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     */\n    var partial = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partial));\n      return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * This method is like `_.partial` except that partially applied arguments\n     * are appended to the arguments it receives.\n     *\n     * The `_.partialRight.placeholder` value, which defaults to `_` in monolithic\n     * builds, may be used as a placeholder for partially applied arguments.\n     *\n     * **Note:** This method doesn't set the \"length\" property of partially\n     * applied functions.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Function\n     * @param {Function} func The function to partially apply arguments to.\n     * @param {...*} [partials] The arguments to be partially applied.\n     * @returns {Function} Returns the new partially applied function.\n     * @example\n     *\n     * function greet(greeting, name) {\n     *   return greeting + ' ' + name;\n     * }\n     *\n     * var greetFred = _.partialRight(greet, 'fred');\n     * greetFred('hi');\n     * // => 'hi fred'\n     *\n     * // Partially applied with placeholders.\n     * var sayHelloTo = _.partialRight(greet, 'hello', _);\n     * sayHelloTo('fred');\n     * // => 'hello fred'\n     */\n    var partialRight = baseRest(function(func, partials) {\n      var holders = replaceHolders(partials, getHolder(partialRight));\n      return createWrap(func, WRAP_PARTIAL_RIGHT_FLAG, undefined, partials, holders);\n    });\n\n    /**\n     * Creates a function that invokes `func` with arguments arranged according\n     * to the specified `indexes` where the argument value at the first index is\n     * provided as the first argument, the argument value at the second index is\n     * provided as the second argument, and so on.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Function\n     * @param {Function} func The function to rearrange arguments for.\n     * @param {...(number|number[])} indexes The arranged argument indexes.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var rearged = _.rearg(function(a, b, c) {\n     *   return [a, b, c];\n     * }, [2, 0, 1]);\n     *\n     * rearged('b', 'c', 'a')\n     * // => ['a', 'b', 'c']\n     */\n    var rearg = flatRest(function(func, indexes) {\n      return createWrap(func, WRAP_REARG_FLAG, undefined, undefined, undefined, indexes);\n    });\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * created function and arguments from `start` and beyond provided as\n     * an array.\n     *\n     * **Note:** This method is based on the\n     * [rest parameter](https://mdn.io/rest_parameters).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to apply a rest parameter to.\n     * @param {number} [start=func.length-1] The start position of the rest parameter.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.rest(function(what, names) {\n     *   return what + ' ' + _.initial(names).join(', ') +\n     *     (_.size(names) > 1 ? ', & ' : '') + _.last(names);\n     * });\n     *\n     * say('hello', 'fred', 'barney', 'pebbles');\n     * // => 'hello fred, barney, & pebbles'\n     */\n    function rest(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start === undefined ? start : toInteger(start);\n      return baseRest(func, start);\n    }\n\n    /**\n     * Creates a function that invokes `func` with the `this` binding of the\n     * create function and an array of arguments much like\n     * [`Function#apply`](http://www.ecma-international.org/ecma-262/7.0/#sec-function.prototype.apply).\n     *\n     * **Note:** This method is based on the\n     * [spread operator](https://mdn.io/spread_operator).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Function\n     * @param {Function} func The function to spread arguments over.\n     * @param {number} [start=0] The start position of the spread.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var say = _.spread(function(who, what) {\n     *   return who + ' says ' + what;\n     * });\n     *\n     * say(['fred', 'hello']);\n     * // => 'fred says hello'\n     *\n     * var numbers = Promise.all([\n     *   Promise.resolve(40),\n     *   Promise.resolve(36)\n     * ]);\n     *\n     * numbers.then(_.spread(function(x, y) {\n     *   return x + y;\n     * }));\n     * // => a Promise of 76\n     */\n    function spread(func, start) {\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      start = start == null ? 0 : nativeMax(toInteger(start), 0);\n      return baseRest(function(args) {\n        var array = args[start],\n            otherArgs = castSlice(args, 0, start);\n\n        if (array) {\n          arrayPush(otherArgs, array);\n        }\n        return apply(func, this, otherArgs);\n      });\n    }\n\n    /**\n     * Creates a throttled function that only invokes `func` at most once per\n     * every `wait` milliseconds. The throttled function comes with a `cancel`\n     * method to cancel delayed `func` invocations and a `flush` method to\n     * immediately invoke them. Provide `options` to indicate whether `func`\n     * should be invoked on the leading and/or trailing edge of the `wait`\n     * timeout. The `func` is invoked with the last arguments provided to the\n     * throttled function. Subsequent calls to the throttled function return the\n     * result of the last `func` invocation.\n     *\n     * **Note:** If `leading` and `trailing` options are `true`, `func` is\n     * invoked on the trailing edge of the timeout only if the throttled function\n     * is invoked more than once during the `wait` timeout.\n     *\n     * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n     * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n     *\n     * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n     * for details over the differences between `_.throttle` and `_.debounce`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {Function} func The function to throttle.\n     * @param {number} [wait=0] The number of milliseconds to throttle invocations to.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.leading=true]\n     *  Specify invoking on the leading edge of the timeout.\n     * @param {boolean} [options.trailing=true]\n     *  Specify invoking on the trailing edge of the timeout.\n     * @returns {Function} Returns the new throttled function.\n     * @example\n     *\n     * // Avoid excessively updating the position while scrolling.\n     * jQuery(window).on('scroll', _.throttle(updatePosition, 100));\n     *\n     * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.\n     * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });\n     * jQuery(element).on('click', throttled);\n     *\n     * // Cancel the trailing throttled invocation.\n     * jQuery(window).on('popstate', throttled.cancel);\n     */\n    function throttle(func, wait, options) {\n      var leading = true,\n          trailing = true;\n\n      if (typeof func != 'function') {\n        throw new TypeError(FUNC_ERROR_TEXT);\n      }\n      if (isObject(options)) {\n        leading = 'leading' in options ? !!options.leading : leading;\n        trailing = 'trailing' in options ? !!options.trailing : trailing;\n      }\n      return debounce(func, wait, {\n        'leading': leading,\n        'maxWait': wait,\n        'trailing': trailing\n      });\n    }\n\n    /**\n     * Creates a function that accepts up to one argument, ignoring any\n     * additional arguments.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Function\n     * @param {Function} func The function to cap arguments for.\n     * @returns {Function} Returns the new capped function.\n     * @example\n     *\n     * _.map(['6', '8', '10'], _.unary(parseInt));\n     * // => [6, 8, 10]\n     */\n    function unary(func) {\n      return ary(func, 1);\n    }\n\n    /**\n     * Creates a function that provides `value` to `wrapper` as its first\n     * argument. Any additional arguments provided to the function are appended\n     * to those provided to the `wrapper`. The wrapper is invoked with the `this`\n     * binding of the created function.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Function\n     * @param {*} value The value to wrap.\n     * @param {Function} [wrapper=identity] The wrapper function.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var p = _.wrap(_.escape, function(func, text) {\n     *   return '<p>' + func(text) + '</p>';\n     * });\n     *\n     * p('fred, barney, & pebbles');\n     * // => '<p>fred, barney, &amp; pebbles</p>'\n     */\n    function wrap(value, wrapper) {\n      return partial(castFunction(wrapper), value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Casts `value` as an array if it's not one.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.4.0\n     * @category Lang\n     * @param {*} value The value to inspect.\n     * @returns {Array} Returns the cast array.\n     * @example\n     *\n     * _.castArray(1);\n     * // => [1]\n     *\n     * _.castArray({ 'a': 1 });\n     * // => [{ 'a': 1 }]\n     *\n     * _.castArray('abc');\n     * // => ['abc']\n     *\n     * _.castArray(null);\n     * // => [null]\n     *\n     * _.castArray(undefined);\n     * // => [undefined]\n     *\n     * _.castArray();\n     * // => []\n     *\n     * var array = [1, 2, 3];\n     * console.log(_.castArray(array) === array);\n     * // => true\n     */\n    function castArray() {\n      if (!arguments.length) {\n        return [];\n      }\n      var value = arguments[0];\n      return isArray(value) ? value : [value];\n    }\n\n    /**\n     * Creates a shallow clone of `value`.\n     *\n     * **Note:** This method is loosely based on the\n     * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n     * and supports cloning arrays, array buffers, booleans, date objects, maps,\n     * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n     * arrays. The own enumerable properties of `arguments` objects are cloned\n     * as plain objects. An empty object is returned for uncloneable values such\n     * as error objects, functions, DOM nodes, and WeakMaps.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeep\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var shallow = _.clone(objects);\n     * console.log(shallow[0] === objects[0]);\n     * // => true\n     */\n    function clone(value) {\n      return baseClone(value, CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.clone` except that it accepts `customizer` which\n     * is invoked to produce the cloned value. If `customizer` returns `undefined`,\n     * cloning is handled by the method instead. The `customizer` is invoked with\n     * up to four arguments; (value [, index|key, object, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the cloned value.\n     * @see _.cloneDeepWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(false);\n     *   }\n     * }\n     *\n     * var el = _.cloneWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 0\n     */\n    function cloneWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * This method is like `_.clone` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.clone\n     * @example\n     *\n     * var objects = [{ 'a': 1 }, { 'b': 2 }];\n     *\n     * var deep = _.cloneDeep(objects);\n     * console.log(deep[0] === objects[0]);\n     * // => false\n     */\n    function cloneDeep(value) {\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n    }\n\n    /**\n     * This method is like `_.cloneWith` except that it recursively clones `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to recursively clone.\n     * @param {Function} [customizer] The function to customize cloning.\n     * @returns {*} Returns the deep cloned value.\n     * @see _.cloneWith\n     * @example\n     *\n     * function customizer(value) {\n     *   if (_.isElement(value)) {\n     *     return value.cloneNode(true);\n     *   }\n     * }\n     *\n     * var el = _.cloneDeepWith(document.body, customizer);\n     *\n     * console.log(el === document.body);\n     * // => false\n     * console.log(el.nodeName);\n     * // => 'BODY'\n     * console.log(el.childNodes.length);\n     * // => 20\n     */\n    function cloneDeepWith(value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG, customizer);\n    }\n\n    /**\n     * Checks if `object` conforms to `source` by invoking the predicate\n     * properties of `source` with the corresponding property values of `object`.\n     *\n     * **Note:** This method is equivalent to `_.conforms` when `source` is\n     * partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {boolean} Returns `true` if `object` conforms, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 1; } });\n     * // => true\n     *\n     * _.conformsTo(object, { 'b': function(n) { return n > 2; } });\n     * // => false\n     */\n    function conformsTo(object, source) {\n      return source == null || baseConformsTo(object, source, keys(source));\n    }\n\n    /**\n     * Performs a\n     * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n     * comparison between two values to determine if they are equivalent.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.eq(object, object);\n     * // => true\n     *\n     * _.eq(object, other);\n     * // => false\n     *\n     * _.eq('a', 'a');\n     * // => true\n     *\n     * _.eq('a', Object('a'));\n     * // => false\n     *\n     * _.eq(NaN, NaN);\n     * // => true\n     */\n    function eq(value, other) {\n      return value === other || (value !== value && other !== other);\n    }\n\n    /**\n     * Checks if `value` is greater than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than `other`,\n     *  else `false`.\n     * @see _.lt\n     * @example\n     *\n     * _.gt(3, 1);\n     * // => true\n     *\n     * _.gt(3, 3);\n     * // => false\n     *\n     * _.gt(1, 3);\n     * // => false\n     */\n    var gt = createRelationalOperation(baseGt);\n\n    /**\n     * Checks if `value` is greater than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is greater than or equal to\n     *  `other`, else `false`.\n     * @see _.lte\n     * @example\n     *\n     * _.gte(3, 1);\n     * // => true\n     *\n     * _.gte(3, 3);\n     * // => true\n     *\n     * _.gte(1, 3);\n     * // => false\n     */\n    var gte = createRelationalOperation(function(value, other) {\n      return value >= other;\n    });\n\n    /**\n     * Checks if `value` is likely an `arguments` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArguments(function() { return arguments; }());\n     * // => true\n     *\n     * _.isArguments([1, 2, 3]);\n     * // => false\n     */\n    var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n      return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n        !propertyIsEnumerable.call(value, 'callee');\n    };\n\n    /**\n     * Checks if `value` is classified as an `Array` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n     * @example\n     *\n     * _.isArray([1, 2, 3]);\n     * // => true\n     *\n     * _.isArray(document.body.children);\n     * // => false\n     *\n     * _.isArray('abc');\n     * // => false\n     *\n     * _.isArray(_.noop);\n     * // => false\n     */\n    var isArray = Array.isArray;\n\n    /**\n     * Checks if `value` is classified as an `ArrayBuffer` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array buffer, else `false`.\n     * @example\n     *\n     * _.isArrayBuffer(new ArrayBuffer(2));\n     * // => true\n     *\n     * _.isArrayBuffer(new Array(2));\n     * // => false\n     */\n    var isArrayBuffer = nodeIsArrayBuffer ? baseUnary(nodeIsArrayBuffer) : baseIsArrayBuffer;\n\n    /**\n     * Checks if `value` is array-like. A value is considered array-like if it's\n     * not a function and has a `value.length` that's an integer greater than or\n     * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n     * @example\n     *\n     * _.isArrayLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLike(document.body.children);\n     * // => true\n     *\n     * _.isArrayLike('abc');\n     * // => true\n     *\n     * _.isArrayLike(_.noop);\n     * // => false\n     */\n    function isArrayLike(value) {\n      return value != null && isLength(value.length) && !isFunction(value);\n    }\n\n    /**\n     * This method is like `_.isArrayLike` except that it also checks if `value`\n     * is an object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an array-like object,\n     *  else `false`.\n     * @example\n     *\n     * _.isArrayLikeObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isArrayLikeObject(document.body.children);\n     * // => true\n     *\n     * _.isArrayLikeObject('abc');\n     * // => false\n     *\n     * _.isArrayLikeObject(_.noop);\n     * // => false\n     */\n    function isArrayLikeObject(value) {\n      return isObjectLike(value) && isArrayLike(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a boolean primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a boolean, else `false`.\n     * @example\n     *\n     * _.isBoolean(false);\n     * // => true\n     *\n     * _.isBoolean(null);\n     * // => false\n     */\n    function isBoolean(value) {\n      return value === true || value === false ||\n        (isObjectLike(value) && baseGetTag(value) == boolTag);\n    }\n\n    /**\n     * Checks if `value` is a buffer.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n     * @example\n     *\n     * _.isBuffer(new Buffer(2));\n     * // => true\n     *\n     * _.isBuffer(new Uint8Array(2));\n     * // => false\n     */\n    var isBuffer = nativeIsBuffer || stubFalse;\n\n    /**\n     * Checks if `value` is classified as a `Date` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a date object, else `false`.\n     * @example\n     *\n     * _.isDate(new Date);\n     * // => true\n     *\n     * _.isDate('Mon April 23 2012');\n     * // => false\n     */\n    var isDate = nodeIsDate ? baseUnary(nodeIsDate) : baseIsDate;\n\n    /**\n     * Checks if `value` is likely a DOM element.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a DOM element, else `false`.\n     * @example\n     *\n     * _.isElement(document.body);\n     * // => true\n     *\n     * _.isElement('<body>');\n     * // => false\n     */\n    function isElement(value) {\n      return isObjectLike(value) && value.nodeType === 1 && !isPlainObject(value);\n    }\n\n    /**\n     * Checks if `value` is an empty object, collection, map, or set.\n     *\n     * Objects are considered empty if they have no own enumerable string keyed\n     * properties.\n     *\n     * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n     * jQuery-like collections are considered empty if they have a `length` of `0`.\n     * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n     * @example\n     *\n     * _.isEmpty(null);\n     * // => true\n     *\n     * _.isEmpty(true);\n     * // => true\n     *\n     * _.isEmpty(1);\n     * // => true\n     *\n     * _.isEmpty([1, 2, 3]);\n     * // => false\n     *\n     * _.isEmpty({ 'a': 1 });\n     * // => false\n     */\n    function isEmpty(value) {\n      if (value == null) {\n        return true;\n      }\n      if (isArrayLike(value) &&\n          (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||\n            isBuffer(value) || isTypedArray(value) || isArguments(value))) {\n        return !value.length;\n      }\n      var tag = getTag(value);\n      if (tag == mapTag || tag == setTag) {\n        return !value.size;\n      }\n      if (isPrototype(value)) {\n        return !baseKeys(value).length;\n      }\n      for (var key in value) {\n        if (hasOwnProperty.call(value, key)) {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    /**\n     * Performs a deep comparison between two values to determine if they are\n     * equivalent.\n     *\n     * **Note:** This method supports comparing arrays, array buffers, booleans,\n     * date objects, error objects, maps, numbers, `Object` objects, regexes,\n     * sets, strings, symbols, and typed arrays. `Object` objects are compared\n     * by their own, not inherited, enumerable properties. Functions and DOM\n     * nodes are compared by strict equality, i.e. `===`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     * var other = { 'a': 1 };\n     *\n     * _.isEqual(object, other);\n     * // => true\n     *\n     * object === other;\n     * // => false\n     */\n    function isEqual(value, other) {\n      return baseIsEqual(value, other);\n    }\n\n    /**\n     * This method is like `_.isEqual` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with up to\n     * six arguments: (objValue, othValue [, index|key, object, other, stack]).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, othValue) {\n     *   if (isGreeting(objValue) && isGreeting(othValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var array = ['hello', 'goodbye'];\n     * var other = ['hi', 'goodbye'];\n     *\n     * _.isEqualWith(array, other, customizer);\n     * // => true\n     */\n    function isEqualWith(value, other, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      var result = customizer ? customizer(value, other) : undefined;\n      return result === undefined ? baseIsEqual(value, other, undefined, customizer) : !!result;\n    }\n\n    /**\n     * Checks if `value` is an `Error`, `EvalError`, `RangeError`, `ReferenceError`,\n     * `SyntaxError`, `TypeError`, or `URIError` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an error object, else `false`.\n     * @example\n     *\n     * _.isError(new Error);\n     * // => true\n     *\n     * _.isError(Error);\n     * // => false\n     */\n    function isError(value) {\n      if (!isObjectLike(value)) {\n        return false;\n      }\n      var tag = baseGetTag(value);\n      return tag == errorTag || tag == domExcTag ||\n        (typeof value.message == 'string' && typeof value.name == 'string' && !isPlainObject(value));\n    }\n\n    /**\n     * Checks if `value` is a finite primitive number.\n     *\n     * **Note:** This method is based on\n     * [`Number.isFinite`](https://mdn.io/Number/isFinite).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a finite number, else `false`.\n     * @example\n     *\n     * _.isFinite(3);\n     * // => true\n     *\n     * _.isFinite(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isFinite(Infinity);\n     * // => false\n     *\n     * _.isFinite('3');\n     * // => false\n     */\n    function isFinite(value) {\n      return typeof value == 'number' && nativeIsFinite(value);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Function` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n     * @example\n     *\n     * _.isFunction(_);\n     * // => true\n     *\n     * _.isFunction(/abc/);\n     * // => false\n     */\n    function isFunction(value) {\n      if (!isObject(value)) {\n        return false;\n      }\n      // The use of `Object#toString` avoids issues with the `typeof` operator\n      // in Safari 9 which returns 'object' for typed arrays and other constructors.\n      var tag = baseGetTag(value);\n      return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n    }\n\n    /**\n     * Checks if `value` is an integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isInteger`](https://mdn.io/Number/isInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an integer, else `false`.\n     * @example\n     *\n     * _.isInteger(3);\n     * // => true\n     *\n     * _.isInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isInteger(Infinity);\n     * // => false\n     *\n     * _.isInteger('3');\n     * // => false\n     */\n    function isInteger(value) {\n      return typeof value == 'number' && value == toInteger(value);\n    }\n\n    /**\n     * Checks if `value` is a valid array-like length.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n     * @example\n     *\n     * _.isLength(3);\n     * // => true\n     *\n     * _.isLength(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isLength(Infinity);\n     * // => false\n     *\n     * _.isLength('3');\n     * // => false\n     */\n    function isLength(value) {\n      return typeof value == 'number' &&\n        value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is the\n     * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n     * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n     * @example\n     *\n     * _.isObject({});\n     * // => true\n     *\n     * _.isObject([1, 2, 3]);\n     * // => true\n     *\n     * _.isObject(_.noop);\n     * // => true\n     *\n     * _.isObject(null);\n     * // => false\n     */\n    function isObject(value) {\n      var type = typeof value;\n      return value != null && (type == 'object' || type == 'function');\n    }\n\n    /**\n     * Checks if `value` is object-like. A value is object-like if it's not `null`\n     * and has a `typeof` result of \"object\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n     * @example\n     *\n     * _.isObjectLike({});\n     * // => true\n     *\n     * _.isObjectLike([1, 2, 3]);\n     * // => true\n     *\n     * _.isObjectLike(_.noop);\n     * // => false\n     *\n     * _.isObjectLike(null);\n     * // => false\n     */\n    function isObjectLike(value) {\n      return value != null && typeof value == 'object';\n    }\n\n    /**\n     * Checks if `value` is classified as a `Map` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n     * @example\n     *\n     * _.isMap(new Map);\n     * // => true\n     *\n     * _.isMap(new WeakMap);\n     * // => false\n     */\n    var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;\n\n    /**\n     * Performs a partial deep comparison between `object` and `source` to\n     * determine if `object` contains equivalent property values.\n     *\n     * **Note:** This method is equivalent to `_.matches` when `source` is\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2 };\n     *\n     * _.isMatch(object, { 'b': 2 });\n     * // => true\n     *\n     * _.isMatch(object, { 'b': 1 });\n     * // => false\n     */\n    function isMatch(object, source) {\n      return object === source || baseIsMatch(object, source, getMatchData(source));\n    }\n\n    /**\n     * This method is like `_.isMatch` except that it accepts `customizer` which\n     * is invoked to compare values. If `customizer` returns `undefined`, comparisons\n     * are handled by the method instead. The `customizer` is invoked with five\n     * arguments: (objValue, srcValue, index|key, object, source).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {Object} object The object to inspect.\n     * @param {Object} source The object of property values to match.\n     * @param {Function} [customizer] The function to customize comparisons.\n     * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n     * @example\n     *\n     * function isGreeting(value) {\n     *   return /^h(?:i|ello)$/.test(value);\n     * }\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (isGreeting(objValue) && isGreeting(srcValue)) {\n     *     return true;\n     *   }\n     * }\n     *\n     * var object = { 'greeting': 'hello' };\n     * var source = { 'greeting': 'hi' };\n     *\n     * _.isMatchWith(object, source, customizer);\n     * // => true\n     */\n    function isMatchWith(object, source, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return baseIsMatch(object, source, getMatchData(source), customizer);\n    }\n\n    /**\n     * Checks if `value` is `NaN`.\n     *\n     * **Note:** This method is based on\n     * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as\n     * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for\n     * `undefined` and other non-number values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n     * @example\n     *\n     * _.isNaN(NaN);\n     * // => true\n     *\n     * _.isNaN(new Number(NaN));\n     * // => true\n     *\n     * isNaN(undefined);\n     * // => true\n     *\n     * _.isNaN(undefined);\n     * // => false\n     */\n    function isNaN(value) {\n      // An `NaN` primitive is the only value that is not equal to itself.\n      // Perform the `toStringTag` check first to avoid errors with some\n      // ActiveX objects in IE.\n      return isNumber(value) && value != +value;\n    }\n\n    /**\n     * Checks if `value` is a pristine native function.\n     *\n     * **Note:** This method can't reliably detect native functions in the presence\n     * of the core-js package because core-js circumvents this kind of detection.\n     * Despite multiple requests, the core-js maintainer has made it clear: any\n     * attempt to fix the detection will be obstructed. As a result, we're left\n     * with little choice but to throw an error. Unfortunately, this also affects\n     * packages, like [babel-polyfill](https://www.npmjs.com/package/babel-polyfill),\n     * which rely on core-js.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a native function,\n     *  else `false`.\n     * @example\n     *\n     * _.isNative(Array.prototype.push);\n     * // => true\n     *\n     * _.isNative(_);\n     * // => false\n     */\n    function isNative(value) {\n      if (isMaskable(value)) {\n        throw new Error(CORE_ERROR_TEXT);\n      }\n      return baseIsNative(value);\n    }\n\n    /**\n     * Checks if `value` is `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `null`, else `false`.\n     * @example\n     *\n     * _.isNull(null);\n     * // => true\n     *\n     * _.isNull(void 0);\n     * // => false\n     */\n    function isNull(value) {\n      return value === null;\n    }\n\n    /**\n     * Checks if `value` is `null` or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is nullish, else `false`.\n     * @example\n     *\n     * _.isNil(null);\n     * // => true\n     *\n     * _.isNil(void 0);\n     * // => true\n     *\n     * _.isNil(NaN);\n     * // => false\n     */\n    function isNil(value) {\n      return value == null;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Number` primitive or object.\n     *\n     * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n     * classified as numbers, use the `_.isFinite` method.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n     * @example\n     *\n     * _.isNumber(3);\n     * // => true\n     *\n     * _.isNumber(Number.MIN_VALUE);\n     * // => true\n     *\n     * _.isNumber(Infinity);\n     * // => true\n     *\n     * _.isNumber('3');\n     * // => false\n     */\n    function isNumber(value) {\n      return typeof value == 'number' ||\n        (isObjectLike(value) && baseGetTag(value) == numberTag);\n    }\n\n    /**\n     * Checks if `value` is a plain object, that is, an object created by the\n     * `Object` constructor or one with a `[[Prototype]]` of `null`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.8.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * _.isPlainObject(new Foo);\n     * // => false\n     *\n     * _.isPlainObject([1, 2, 3]);\n     * // => false\n     *\n     * _.isPlainObject({ 'x': 0, 'y': 0 });\n     * // => true\n     *\n     * _.isPlainObject(Object.create(null));\n     * // => true\n     */\n    function isPlainObject(value) {\n      if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n        return false;\n      }\n      var proto = getPrototype(value);\n      if (proto === null) {\n        return true;\n      }\n      var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n      return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n        funcToString.call(Ctor) == objectCtorString;\n    }\n\n    /**\n     * Checks if `value` is classified as a `RegExp` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.1.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n     * @example\n     *\n     * _.isRegExp(/abc/);\n     * // => true\n     *\n     * _.isRegExp('/abc/');\n     * // => false\n     */\n    var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\n    /**\n     * Checks if `value` is a safe integer. An integer is safe if it's an IEEE-754\n     * double precision number which isn't the result of a rounded unsafe integer.\n     *\n     * **Note:** This method is based on\n     * [`Number.isSafeInteger`](https://mdn.io/Number/isSafeInteger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a safe integer, else `false`.\n     * @example\n     *\n     * _.isSafeInteger(3);\n     * // => true\n     *\n     * _.isSafeInteger(Number.MIN_VALUE);\n     * // => false\n     *\n     * _.isSafeInteger(Infinity);\n     * // => false\n     *\n     * _.isSafeInteger('3');\n     * // => false\n     */\n    function isSafeInteger(value) {\n      return isInteger(value) && value >= -MAX_SAFE_INTEGER && value <= MAX_SAFE_INTEGER;\n    }\n\n    /**\n     * Checks if `value` is classified as a `Set` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n     * @example\n     *\n     * _.isSet(new Set);\n     * // => true\n     *\n     * _.isSet(new WeakSet);\n     * // => false\n     */\n    var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;\n\n    /**\n     * Checks if `value` is classified as a `String` primitive or object.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n     * @example\n     *\n     * _.isString('abc');\n     * // => true\n     *\n     * _.isString(1);\n     * // => false\n     */\n    function isString(value) {\n      return typeof value == 'string' ||\n        (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a `Symbol` primitive or object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n     * @example\n     *\n     * _.isSymbol(Symbol.iterator);\n     * // => true\n     *\n     * _.isSymbol('abc');\n     * // => false\n     */\n    function isSymbol(value) {\n      return typeof value == 'symbol' ||\n        (isObjectLike(value) && baseGetTag(value) == symbolTag);\n    }\n\n    /**\n     * Checks if `value` is classified as a typed array.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n     * @example\n     *\n     * _.isTypedArray(new Uint8Array);\n     * // => true\n     *\n     * _.isTypedArray([]);\n     * // => false\n     */\n    var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\n    /**\n     * Checks if `value` is `undefined`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n     * @example\n     *\n     * _.isUndefined(void 0);\n     * // => true\n     *\n     * _.isUndefined(null);\n     * // => false\n     */\n    function isUndefined(value) {\n      return value === undefined;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakMap` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak map, else `false`.\n     * @example\n     *\n     * _.isWeakMap(new WeakMap);\n     * // => true\n     *\n     * _.isWeakMap(new Map);\n     * // => false\n     */\n    function isWeakMap(value) {\n      return isObjectLike(value) && getTag(value) == weakMapTag;\n    }\n\n    /**\n     * Checks if `value` is classified as a `WeakSet` object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.3.0\n     * @category Lang\n     * @param {*} value The value to check.\n     * @returns {boolean} Returns `true` if `value` is a weak set, else `false`.\n     * @example\n     *\n     * _.isWeakSet(new WeakSet);\n     * // => true\n     *\n     * _.isWeakSet(new Set);\n     * // => false\n     */\n    function isWeakSet(value) {\n      return isObjectLike(value) && baseGetTag(value) == weakSetTag;\n    }\n\n    /**\n     * Checks if `value` is less than `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than `other`,\n     *  else `false`.\n     * @see _.gt\n     * @example\n     *\n     * _.lt(1, 3);\n     * // => true\n     *\n     * _.lt(3, 3);\n     * // => false\n     *\n     * _.lt(3, 1);\n     * // => false\n     */\n    var lt = createRelationalOperation(baseLt);\n\n    /**\n     * Checks if `value` is less than or equal to `other`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.9.0\n     * @category Lang\n     * @param {*} value The value to compare.\n     * @param {*} other The other value to compare.\n     * @returns {boolean} Returns `true` if `value` is less than or equal to\n     *  `other`, else `false`.\n     * @see _.gte\n     * @example\n     *\n     * _.lte(1, 3);\n     * // => true\n     *\n     * _.lte(3, 3);\n     * // => true\n     *\n     * _.lte(3, 1);\n     * // => false\n     */\n    var lte = createRelationalOperation(function(value, other) {\n      return value <= other;\n    });\n\n    /**\n     * Converts `value` to an array.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the converted array.\n     * @example\n     *\n     * _.toArray({ 'a': 1, 'b': 2 });\n     * // => [1, 2]\n     *\n     * _.toArray('abc');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toArray(1);\n     * // => []\n     *\n     * _.toArray(null);\n     * // => []\n     */\n    function toArray(value) {\n      if (!value) {\n        return [];\n      }\n      if (isArrayLike(value)) {\n        return isString(value) ? stringToArray(value) : copyArray(value);\n      }\n      if (symIterator && value[symIterator]) {\n        return iteratorToArray(value[symIterator]());\n      }\n      var tag = getTag(value),\n          func = tag == mapTag ? mapToArray : (tag == setTag ? setToArray : values);\n\n      return func(value);\n    }\n\n    /**\n     * Converts `value` to a finite number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.12.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted number.\n     * @example\n     *\n     * _.toFinite(3.2);\n     * // => 3.2\n     *\n     * _.toFinite(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toFinite(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toFinite('3.2');\n     * // => 3.2\n     */\n    function toFinite(value) {\n      if (!value) {\n        return value === 0 ? value : 0;\n      }\n      value = toNumber(value);\n      if (value === INFINITY || value === -INFINITY) {\n        var sign = (value < 0 ? -1 : 1);\n        return sign * MAX_INTEGER;\n      }\n      return value === value ? value : 0;\n    }\n\n    /**\n     * Converts `value` to an integer.\n     *\n     * **Note:** This method is loosely based on\n     * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toInteger(3.2);\n     * // => 3\n     *\n     * _.toInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toInteger(Infinity);\n     * // => 1.7976931348623157e+308\n     *\n     * _.toInteger('3.2');\n     * // => 3\n     */\n    function toInteger(value) {\n      var result = toFinite(value),\n          remainder = result % 1;\n\n      return result === result ? (remainder ? result - remainder : result) : 0;\n    }\n\n    /**\n     * Converts `value` to an integer suitable for use as the length of an\n     * array-like object.\n     *\n     * **Note:** This method is based on\n     * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toLength(3.2);\n     * // => 3\n     *\n     * _.toLength(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toLength(Infinity);\n     * // => 4294967295\n     *\n     * _.toLength('3.2');\n     * // => 3\n     */\n    function toLength(value) {\n      return value ? baseClamp(toInteger(value), 0, MAX_ARRAY_LENGTH) : 0;\n    }\n\n    /**\n     * Converts `value` to a number.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to process.\n     * @returns {number} Returns the number.\n     * @example\n     *\n     * _.toNumber(3.2);\n     * // => 3.2\n     *\n     * _.toNumber(Number.MIN_VALUE);\n     * // => 5e-324\n     *\n     * _.toNumber(Infinity);\n     * // => Infinity\n     *\n     * _.toNumber('3.2');\n     * // => 3.2\n     */\n    function toNumber(value) {\n      if (typeof value == 'number') {\n        return value;\n      }\n      if (isSymbol(value)) {\n        return NAN;\n      }\n      if (isObject(value)) {\n        var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n        value = isObject(other) ? (other + '') : other;\n      }\n      if (typeof value != 'string') {\n        return value === 0 ? value : +value;\n      }\n      value = baseTrim(value);\n      var isBinary = reIsBinary.test(value);\n      return (isBinary || reIsOctal.test(value))\n        ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n        : (reIsBadHex.test(value) ? NAN : +value);\n    }\n\n    /**\n     * Converts `value` to a plain object flattening inherited enumerable string\n     * keyed properties of `value` to own properties of the plain object.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {Object} Returns the converted plain object.\n     * @example\n     *\n     * function Foo() {\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.assign({ 'a': 1 }, new Foo);\n     * // => { 'a': 1, 'b': 2 }\n     *\n     * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n     * // => { 'a': 1, 'b': 2, 'c': 3 }\n     */\n    function toPlainObject(value) {\n      return copyObject(value, keysIn(value));\n    }\n\n    /**\n     * Converts `value` to a safe integer. A safe integer can be compared and\n     * represented correctly.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.toSafeInteger(3.2);\n     * // => 3\n     *\n     * _.toSafeInteger(Number.MIN_VALUE);\n     * // => 0\n     *\n     * _.toSafeInteger(Infinity);\n     * // => 9007199254740991\n     *\n     * _.toSafeInteger('3.2');\n     * // => 3\n     */\n    function toSafeInteger(value) {\n      return value\n        ? baseClamp(toInteger(value), -MAX_SAFE_INTEGER, MAX_SAFE_INTEGER)\n        : (value === 0 ? value : 0);\n    }\n\n    /**\n     * Converts `value` to a string. An empty string is returned for `null`\n     * and `undefined` values. The sign of `-0` is preserved.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Lang\n     * @param {*} value The value to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.toString(null);\n     * // => ''\n     *\n     * _.toString(-0);\n     * // => '-0'\n     *\n     * _.toString([1, 2, 3]);\n     * // => '1,2,3'\n     */\n    function toString(value) {\n      return value == null ? '' : baseToString(value);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Assigns own enumerable string keyed properties of source objects to the\n     * destination object. Source objects are applied from left to right.\n     * Subsequent sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object` and is loosely based on\n     * [`Object.assign`](https://mdn.io/Object/assign).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assignIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assign({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var assign = createAssigner(function(object, source) {\n      if (isPrototype(source) || isArrayLike(source)) {\n        copyObject(source, keys(source), object);\n        return;\n      }\n      for (var key in source) {\n        if (hasOwnProperty.call(source, key)) {\n          assignValue(object, key, source[key]);\n        }\n      }\n    });\n\n    /**\n     * This method is like `_.assign` except that it iterates over own and\n     * inherited source properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extend\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.assign\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     * }\n     *\n     * function Bar() {\n     *   this.c = 3;\n     * }\n     *\n     * Foo.prototype.b = 2;\n     * Bar.prototype.d = 4;\n     *\n     * _.assignIn({ 'a': 0 }, new Foo, new Bar);\n     * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }\n     */\n    var assignIn = createAssigner(function(object, source) {\n      copyObject(source, keysIn(source), object);\n    });\n\n    /**\n     * This method is like `_.assignIn` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias extendWith\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignInWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignInWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keysIn(source), object, customizer);\n    });\n\n    /**\n     * This method is like `_.assign` except that it accepts `customizer`\n     * which is invoked to produce the assigned values. If `customizer` returns\n     * `undefined`, assignment is handled by the method instead. The `customizer`\n     * is invoked with five arguments: (objValue, srcValue, key, object, source).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @see _.assignInWith\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   return _.isUndefined(objValue) ? srcValue : objValue;\n     * }\n     *\n     * var defaults = _.partialRight(_.assignWith, customizer);\n     *\n     * defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var assignWith = createAssigner(function(object, source, srcIndex, customizer) {\n      copyObject(source, keys(source), object, customizer);\n    });\n\n    /**\n     * Creates an array of values corresponding to `paths` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Array} Returns the picked values.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }, 4] };\n     *\n     * _.at(object, ['a[0].b.c', 'a[1]']);\n     * // => [3, 4]\n     */\n    var at = flatRest(baseAt);\n\n    /**\n     * Creates an object that inherits from the `prototype` object. If a\n     * `properties` object is given, its own enumerable string keyed properties\n     * are assigned to the created object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Object\n     * @param {Object} prototype The object to inherit from.\n     * @param {Object} [properties] The properties to assign to the object.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * function Shape() {\n     *   this.x = 0;\n     *   this.y = 0;\n     * }\n     *\n     * function Circle() {\n     *   Shape.call(this);\n     * }\n     *\n     * Circle.prototype = _.create(Shape.prototype, {\n     *   'constructor': Circle\n     * });\n     *\n     * var circle = new Circle;\n     * circle instanceof Circle;\n     * // => true\n     *\n     * circle instanceof Shape;\n     * // => true\n     */\n    function create(prototype, properties) {\n      var result = baseCreate(prototype);\n      return properties == null ? result : baseAssign(result, properties);\n    }\n\n    /**\n     * Assigns own and inherited enumerable string keyed properties of source\n     * objects to the destination object for all destination properties that\n     * resolve to `undefined`. Source objects are applied from left to right.\n     * Once a property is set, additional values of the same property are ignored.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaultsDeep\n     * @example\n     *\n     * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n     * // => { 'a': 1, 'b': 2 }\n     */\n    var defaults = baseRest(function(object, sources) {\n      object = Object(object);\n\n      var index = -1;\n      var length = sources.length;\n      var guard = length > 2 ? sources[2] : undefined;\n\n      if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n        length = 1;\n      }\n\n      while (++index < length) {\n        var source = sources[index];\n        var props = keysIn(source);\n        var propsIndex = -1;\n        var propsLength = props.length;\n\n        while (++propsIndex < propsLength) {\n          var key = props[propsIndex];\n          var value = object[key];\n\n          if (value === undefined ||\n              (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n            object[key] = source[key];\n          }\n        }\n      }\n\n      return object;\n    });\n\n    /**\n     * This method is like `_.defaults` except that it recursively assigns\n     * default properties.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @see _.defaults\n     * @example\n     *\n     * _.defaultsDeep({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } });\n     * // => { 'a': { 'b': 2, 'c': 3 } }\n     */\n    var defaultsDeep = baseRest(function(args) {\n      args.push(undefined, customDefaultsMerge);\n      return apply(mergeWith, undefined, args);\n    });\n\n    /**\n     * This method is like `_.find` except that it returns the key of the first\n     * element `predicate` returns truthy for instead of the element itself.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findKey(users, function(o) { return o.age < 40; });\n     * // => 'barney' (iteration order is not guaranteed)\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findKey(users, { 'age': 1, 'active': true });\n     * // => 'pebbles'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findKey(users, 'active');\n     * // => 'barney'\n     */\n    function findKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwn);\n    }\n\n    /**\n     * This method is like `_.findKey` except that it iterates over elements of\n     * a collection in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @param {Function} [predicate=_.identity] The function invoked per iteration.\n     * @returns {string|undefined} Returns the key of the matched element,\n     *  else `undefined`.\n     * @example\n     *\n     * var users = {\n     *   'barney':  { 'age': 36, 'active': true },\n     *   'fred':    { 'age': 40, 'active': false },\n     *   'pebbles': { 'age': 1,  'active': true }\n     * };\n     *\n     * _.findLastKey(users, function(o) { return o.age < 40; });\n     * // => returns 'pebbles' assuming `_.findKey` returns 'barney'\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.findLastKey(users, { 'age': 36, 'active': true });\n     * // => 'barney'\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.findLastKey(users, ['active', false]);\n     * // => 'fred'\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.findLastKey(users, 'active');\n     * // => 'pebbles'\n     */\n    function findLastKey(object, predicate) {\n      return baseFindKey(object, getIteratee(predicate, 3), baseForOwnRight);\n    }\n\n    /**\n     * Iterates over own and inherited enumerable string keyed properties of an\n     * object and invokes `iteratee` for each property. The iteratee is invoked\n     * with three arguments: (value, key, object). Iteratee functions may exit\n     * iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forInRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forIn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n     */\n    function forIn(object, iteratee) {\n      return object == null\n        ? object\n        : baseFor(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * This method is like `_.forIn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forInRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'c', 'b', then 'a' assuming `_.forIn` logs 'a', 'b', then 'c'.\n     */\n    function forInRight(object, iteratee) {\n      return object == null\n        ? object\n        : baseForRight(object, getIteratee(iteratee, 3), keysIn);\n    }\n\n    /**\n     * Iterates over own enumerable string keyed properties of an object and\n     * invokes `iteratee` for each property. The iteratee is invoked with three\n     * arguments: (value, key, object). Iteratee functions may exit iteration\n     * early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwnRight\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwn(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n     */\n    function forOwn(object, iteratee) {\n      return object && baseForOwn(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * This method is like `_.forOwn` except that it iterates over properties of\n     * `object` in the opposite order.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.0.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns `object`.\n     * @see _.forOwn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.forOwnRight(new Foo, function(value, key) {\n     *   console.log(key);\n     * });\n     * // => Logs 'b' then 'a' assuming `_.forOwn` logs 'a' then 'b'.\n     */\n    function forOwnRight(object, iteratee) {\n      return object && baseForOwnRight(object, getIteratee(iteratee, 3));\n    }\n\n    /**\n     * Creates an array of function property names from own enumerable properties\n     * of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functionsIn\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functions(new Foo);\n     * // => ['a', 'b']\n     */\n    function functions(object) {\n      return object == null ? [] : baseFunctions(object, keys(object));\n    }\n\n    /**\n     * Creates an array of function property names from own and inherited\n     * enumerable properties of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to inspect.\n     * @returns {Array} Returns the function names.\n     * @see _.functions\n     * @example\n     *\n     * function Foo() {\n     *   this.a = _.constant('a');\n     *   this.b = _.constant('b');\n     * }\n     *\n     * Foo.prototype.c = _.constant('c');\n     *\n     * _.functionsIn(new Foo);\n     * // => ['a', 'b', 'c']\n     */\n    function functionsIn(object) {\n      return object == null ? [] : baseFunctions(object, keysIn(object));\n    }\n\n    /**\n     * Gets the value at `path` of `object`. If the resolved value is\n     * `undefined`, the `defaultValue` is returned in its place.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.get(object, 'a[0].b.c');\n     * // => 3\n     *\n     * _.get(object, ['a', '0', 'b', 'c']);\n     * // => 3\n     *\n     * _.get(object, 'a.b.c', 'default');\n     * // => 'default'\n     */\n    function get(object, path, defaultValue) {\n      var result = object == null ? undefined : baseGet(object, path);\n      return result === undefined ? defaultValue : result;\n    }\n\n    /**\n     * Checks if `path` is a direct property of `object`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = { 'a': { 'b': 2 } };\n     * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.has(object, 'a');\n     * // => true\n     *\n     * _.has(object, 'a.b');\n     * // => true\n     *\n     * _.has(object, ['a', 'b']);\n     * // => true\n     *\n     * _.has(other, 'a');\n     * // => false\n     */\n    function has(object, path) {\n      return object != null && hasPath(object, path, baseHas);\n    }\n\n    /**\n     * Checks if `path` is a direct or inherited property of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path to check.\n     * @returns {boolean} Returns `true` if `path` exists, else `false`.\n     * @example\n     *\n     * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n     *\n     * _.hasIn(object, 'a');\n     * // => true\n     *\n     * _.hasIn(object, 'a.b');\n     * // => true\n     *\n     * _.hasIn(object, ['a', 'b']);\n     * // => true\n     *\n     * _.hasIn(object, 'b');\n     * // => false\n     */\n    function hasIn(object, path) {\n      return object != null && hasPath(object, path, baseHasIn);\n    }\n\n    /**\n     * Creates an object composed of the inverted keys and values of `object`.\n     * If `object` contains duplicate values, subsequent values overwrite\n     * property assignments of previous values.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invert(object);\n     * // => { '1': 'c', '2': 'b' }\n     */\n    var invert = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      result[value] = key;\n    }, constant(identity));\n\n    /**\n     * This method is like `_.invert` except that the inverted object is generated\n     * from the results of running each element of `object` thru `iteratee`. The\n     * corresponding inverted value of each inverted key is an array of keys\n     * responsible for generating the inverted value. The iteratee is invoked\n     * with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.1.0\n     * @category Object\n     * @param {Object} object The object to invert.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {Object} Returns the new inverted object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': 2, 'c': 1 };\n     *\n     * _.invertBy(object);\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     *\n     * _.invertBy(object, function(value) {\n     *   return 'group' + value;\n     * });\n     * // => { 'group1': ['a', 'c'], 'group2': ['b'] }\n     */\n    var invertBy = createInverter(function(result, value, key) {\n      if (value != null &&\n          typeof value.toString != 'function') {\n        value = nativeObjectToString.call(value);\n      }\n\n      if (hasOwnProperty.call(result, value)) {\n        result[value].push(key);\n      } else {\n        result[value] = [key];\n      }\n    }, getIteratee);\n\n    /**\n     * Invokes the method at `path` of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {*} Returns the result of the invoked method.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': [1, 2, 3, 4] } }] };\n     *\n     * _.invoke(object, 'a[0].b.c.slice', 1, 3);\n     * // => [2, 3]\n     */\n    var invoke = baseRest(baseInvoke);\n\n    /**\n     * Creates an array of the own enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects. See the\n     * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n     * for more details.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keys(new Foo);\n     * // => ['a', 'b'] (iteration order is not guaranteed)\n     *\n     * _.keys('hi');\n     * // => ['0', '1']\n     */\n    function keys(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable property names of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property names.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.keysIn(new Foo);\n     * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n     */\n    function keysIn(object) {\n      return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n    }\n\n    /**\n     * The opposite of `_.mapValues`; this method creates an object with the\n     * same values as `object` and keys generated by running each own enumerable\n     * string keyed property of `object` thru `iteratee`. The iteratee is invoked\n     * with three arguments: (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.8.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapValues\n     * @example\n     *\n     * _.mapKeys({ 'a': 1, 'b': 2 }, function(value, key) {\n     *   return key + value;\n     * });\n     * // => { 'a1': 1, 'b2': 2 }\n     */\n    function mapKeys(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, iteratee(value, key, object), value);\n      });\n      return result;\n    }\n\n    /**\n     * Creates an object with the same keys as `object` and values generated\n     * by running each own enumerable string keyed property of `object` thru\n     * `iteratee`. The iteratee is invoked with three arguments:\n     * (value, key, object).\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Object} Returns the new mapped object.\n     * @see _.mapKeys\n     * @example\n     *\n     * var users = {\n     *   'fred':    { 'user': 'fred',    'age': 40 },\n     *   'pebbles': { 'user': 'pebbles', 'age': 1 }\n     * };\n     *\n     * _.mapValues(users, function(o) { return o.age; });\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.mapValues(users, 'age');\n     * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n     */\n    function mapValues(object, iteratee) {\n      var result = {};\n      iteratee = getIteratee(iteratee, 3);\n\n      baseForOwn(object, function(value, key, object) {\n        baseAssignValue(result, key, iteratee(value, key, object));\n      });\n      return result;\n    }\n\n    /**\n     * This method is like `_.assign` except that it recursively merges own and\n     * inherited enumerable string keyed properties of source objects into the\n     * destination object. Source properties that resolve to `undefined` are\n     * skipped if a destination value exists. Array and plain object properties\n     * are merged recursively. Other objects and value types are overridden by\n     * assignment. Source objects are applied from left to right. Subsequent\n     * sources overwrite property assignments of previous sources.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.5.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} [sources] The source objects.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {\n     *   'a': [{ 'b': 2 }, { 'd': 4 }]\n     * };\n     *\n     * var other = {\n     *   'a': [{ 'c': 3 }, { 'e': 5 }]\n     * };\n     *\n     * _.merge(object, other);\n     * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n     */\n    var merge = createAssigner(function(object, source, srcIndex) {\n      baseMerge(object, source, srcIndex);\n    });\n\n    /**\n     * This method is like `_.merge` except that it accepts `customizer` which\n     * is invoked to produce the merged values of the destination and source\n     * properties. If `customizer` returns `undefined`, merging is handled by the\n     * method instead. The `customizer` is invoked with six arguments:\n     * (objValue, srcValue, key, object, source, stack).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The destination object.\n     * @param {...Object} sources The source objects.\n     * @param {Function} customizer The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * function customizer(objValue, srcValue) {\n     *   if (_.isArray(objValue)) {\n     *     return objValue.concat(srcValue);\n     *   }\n     * }\n     *\n     * var object = { 'a': [1], 'b': [2] };\n     * var other = { 'a': [3], 'b': [4] };\n     *\n     * _.mergeWith(object, other, customizer);\n     * // => { 'a': [1, 3], 'b': [2, 4] }\n     */\n    var mergeWith = createAssigner(function(object, source, srcIndex, customizer) {\n      baseMerge(object, source, srcIndex, customizer);\n    });\n\n    /**\n     * The opposite of `_.pick`; this method creates an object composed of the\n     * own and inherited enumerable property paths of `object` that are not omitted.\n     *\n     * **Note:** This method is considerably slower than `_.pick`.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to omit.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omit(object, ['a', 'c']);\n     * // => { 'b': '2' }\n     */\n    var omit = flatRest(function(object, paths) {\n      var result = {};\n      if (object == null) {\n        return result;\n      }\n      var isDeep = false;\n      paths = arrayMap(paths, function(path) {\n        path = castPath(path, object);\n        isDeep || (isDeep = path.length > 1);\n        return path;\n      });\n      copyObject(object, getAllKeysIn(object), result);\n      if (isDeep) {\n        result = baseClone(result, CLONE_DEEP_FLAG | CLONE_FLAT_FLAG | CLONE_SYMBOLS_FLAG, customOmitClone);\n      }\n      var length = paths.length;\n      while (length--) {\n        baseUnset(result, paths[length]);\n      }\n      return result;\n    });\n\n    /**\n     * The opposite of `_.pickBy`; this method creates an object composed of\n     * the own and inherited enumerable string keyed properties of `object` that\n     * `predicate` doesn't return truthy for. The predicate is invoked with two\n     * arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.omitBy(object, _.isNumber);\n     * // => { 'b': '2' }\n     */\n    function omitBy(object, predicate) {\n      return pickBy(object, negate(getIteratee(predicate)));\n    }\n\n    /**\n     * Creates an object composed of the picked `object` properties.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {...(string|string[])} [paths] The property paths to pick.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pick(object, ['a', 'c']);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    var pick = flatRest(function(object, paths) {\n      return object == null ? {} : basePick(object, paths);\n    });\n\n    /**\n     * Creates an object composed of the `object` properties `predicate` returns\n     * truthy for. The predicate is invoked with two arguments: (value, key).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The source object.\n     * @param {Function} [predicate=_.identity] The function invoked per property.\n     * @returns {Object} Returns the new object.\n     * @example\n     *\n     * var object = { 'a': 1, 'b': '2', 'c': 3 };\n     *\n     * _.pickBy(object, _.isNumber);\n     * // => { 'a': 1, 'c': 3 }\n     */\n    function pickBy(object, predicate) {\n      if (object == null) {\n        return {};\n      }\n      var props = arrayMap(getAllKeysIn(object), function(prop) {\n        return [prop];\n      });\n      predicate = getIteratee(predicate);\n      return basePickBy(object, props, function(value, path) {\n        return predicate(value, path[0]);\n      });\n    }\n\n    /**\n     * This method is like `_.get` except that if the resolved value is a\n     * function it's invoked with the `this` binding of its parent object and\n     * its result is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @param {Array|string} path The path of the property to resolve.\n     * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c1': 3, 'c2': _.constant(4) } }] };\n     *\n     * _.result(object, 'a[0].b.c1');\n     * // => 3\n     *\n     * _.result(object, 'a[0].b.c2');\n     * // => 4\n     *\n     * _.result(object, 'a[0].b.c3', 'default');\n     * // => 'default'\n     *\n     * _.result(object, 'a[0].b.c3', _.constant('default'));\n     * // => 'default'\n     */\n    function result(object, path, defaultValue) {\n      path = castPath(path, object);\n\n      var index = -1,\n          length = path.length;\n\n      // Ensure the loop is entered when path is empty.\n      if (!length) {\n        length = 1;\n        object = undefined;\n      }\n      while (++index < length) {\n        var value = object == null ? undefined : object[toKey(path[index])];\n        if (value === undefined) {\n          index = length;\n          value = defaultValue;\n        }\n        object = isFunction(value) ? value.call(object) : value;\n      }\n      return object;\n    }\n\n    /**\n     * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n     * it's created. Arrays are created for missing index properties while objects\n     * are created for all other missing properties. Use `_.setWith` to customize\n     * `path` creation.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.set(object, 'a[0].b.c', 4);\n     * console.log(object.a[0].b.c);\n     * // => 4\n     *\n     * _.set(object, ['x', '0', 'y', 'z'], 5);\n     * console.log(object.x[0].y.z);\n     * // => 5\n     */\n    function set(object, path, value) {\n      return object == null ? object : baseSet(object, path, value);\n    }\n\n    /**\n     * This method is like `_.set` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {*} value The value to set.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.setWith(object, '[0][1]', 'a', Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function setWith(object, path, value, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseSet(object, path, value, customizer);\n    }\n\n    /**\n     * Creates an array of own enumerable string keyed-value pairs for `object`\n     * which can be consumed by `_.fromPairs`. If `object` is a map or set, its\n     * entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entries\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairs(new Foo);\n     * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)\n     */\n    var toPairs = createToPairs(keys);\n\n    /**\n     * Creates an array of own and inherited enumerable string keyed-value pairs\n     * for `object` which can be consumed by `_.fromPairs`. If `object` is a map\n     * or set, its entries are returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @alias entriesIn\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the key-value pairs.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.toPairsIn(new Foo);\n     * // => [['a', 1], ['b', 2], ['c', 3]] (iteration order is not guaranteed)\n     */\n    var toPairsIn = createToPairs(keysIn);\n\n    /**\n     * An alternative to `_.reduce`; this method transforms `object` to a new\n     * `accumulator` object which is the result of running each of its own\n     * enumerable string keyed properties thru `iteratee`, with each invocation\n     * potentially mutating the `accumulator` object. If `accumulator` is not\n     * provided, a new object with the same `[[Prototype]]` will be used. The\n     * iteratee is invoked with four arguments: (accumulator, value, key, object).\n     * Iteratee functions may exit iteration early by explicitly returning `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.3.0\n     * @category Object\n     * @param {Object} object The object to iterate over.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @param {*} [accumulator] The custom accumulator value.\n     * @returns {*} Returns the accumulated value.\n     * @example\n     *\n     * _.transform([2, 3, 4], function(result, n) {\n     *   result.push(n *= n);\n     *   return n % 2 == 0;\n     * }, []);\n     * // => [4, 9]\n     *\n     * _.transform({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n     *   (result[value] || (result[value] = [])).push(key);\n     * }, {});\n     * // => { '1': ['a', 'c'], '2': ['b'] }\n     */\n    function transform(object, iteratee, accumulator) {\n      var isArr = isArray(object),\n          isArrLike = isArr || isBuffer(object) || isTypedArray(object);\n\n      iteratee = getIteratee(iteratee, 4);\n      if (accumulator == null) {\n        var Ctor = object && object.constructor;\n        if (isArrLike) {\n          accumulator = isArr ? new Ctor : [];\n        }\n        else if (isObject(object)) {\n          accumulator = isFunction(Ctor) ? baseCreate(getPrototype(object)) : {};\n        }\n        else {\n          accumulator = {};\n        }\n      }\n      (isArrLike ? arrayEach : baseForOwn)(object, function(value, index, object) {\n        return iteratee(accumulator, value, index, object);\n      });\n      return accumulator;\n    }\n\n    /**\n     * Removes the property at `path` of `object`.\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to unset.\n     * @returns {boolean} Returns `true` if the property is deleted, else `false`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 7 } }] };\n     * _.unset(object, 'a[0].b.c');\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     *\n     * _.unset(object, ['a', '0', 'b', 'c']);\n     * // => true\n     *\n     * console.log(object);\n     * // => { 'a': [{ 'b': {} }] };\n     */\n    function unset(object, path) {\n      return object == null ? true : baseUnset(object, path);\n    }\n\n    /**\n     * This method is like `_.set` except that accepts `updater` to produce the\n     * value to set. Use `_.updateWith` to customize `path` creation. The `updater`\n     * is invoked with one argument: (value).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n     *\n     * _.update(object, 'a[0].b.c', function(n) { return n * n; });\n     * console.log(object.a[0].b.c);\n     * // => 9\n     *\n     * _.update(object, 'x[0].y.z', function(n) { return n ? n + 1 : 0; });\n     * console.log(object.x[0].y.z);\n     * // => 0\n     */\n    function update(object, path, updater) {\n      return object == null ? object : baseUpdate(object, path, castFunction(updater));\n    }\n\n    /**\n     * This method is like `_.update` except that it accepts `customizer` which is\n     * invoked to produce the objects of `path`.  If `customizer` returns `undefined`\n     * path creation is handled by the method instead. The `customizer` is invoked\n     * with three arguments: (nsValue, key, nsObject).\n     *\n     * **Note:** This method mutates `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.6.0\n     * @category Object\n     * @param {Object} object The object to modify.\n     * @param {Array|string} path The path of the property to set.\n     * @param {Function} updater The function to produce the updated value.\n     * @param {Function} [customizer] The function to customize assigned values.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var object = {};\n     *\n     * _.updateWith(object, '[0][1]', _.constant('a'), Object);\n     * // => { '0': { '1': 'a' } }\n     */\n    function updateWith(object, path, updater, customizer) {\n      customizer = typeof customizer == 'function' ? customizer : undefined;\n      return object == null ? object : baseUpdate(object, path, castFunction(updater), customizer);\n    }\n\n    /**\n     * Creates an array of the own enumerable string keyed property values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.values(new Foo);\n     * // => [1, 2] (iteration order is not guaranteed)\n     *\n     * _.values('hi');\n     * // => ['h', 'i']\n     */\n    function values(object) {\n      return object == null ? [] : baseValues(object, keys(object));\n    }\n\n    /**\n     * Creates an array of the own and inherited enumerable string keyed property\n     * values of `object`.\n     *\n     * **Note:** Non-object values are coerced to objects.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Object\n     * @param {Object} object The object to query.\n     * @returns {Array} Returns the array of property values.\n     * @example\n     *\n     * function Foo() {\n     *   this.a = 1;\n     *   this.b = 2;\n     * }\n     *\n     * Foo.prototype.c = 3;\n     *\n     * _.valuesIn(new Foo);\n     * // => [1, 2, 3] (iteration order is not guaranteed)\n     */\n    function valuesIn(object) {\n      return object == null ? [] : baseValues(object, keysIn(object));\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Clamps `number` within the inclusive `lower` and `upper` bounds.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Number\n     * @param {number} number The number to clamp.\n     * @param {number} [lower] The lower bound.\n     * @param {number} upper The upper bound.\n     * @returns {number} Returns the clamped number.\n     * @example\n     *\n     * _.clamp(-10, -5, 5);\n     * // => -5\n     *\n     * _.clamp(10, -5, 5);\n     * // => 5\n     */\n    function clamp(number, lower, upper) {\n      if (upper === undefined) {\n        upper = lower;\n        lower = undefined;\n      }\n      if (upper !== undefined) {\n        upper = toNumber(upper);\n        upper = upper === upper ? upper : 0;\n      }\n      if (lower !== undefined) {\n        lower = toNumber(lower);\n        lower = lower === lower ? lower : 0;\n      }\n      return baseClamp(toNumber(number), lower, upper);\n    }\n\n    /**\n     * Checks if `n` is between `start` and up to, but not including, `end`. If\n     * `end` is not specified, it's set to `start` with `start` then set to `0`.\n     * If `start` is greater than `end` the params are swapped to support\n     * negative ranges.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.3.0\n     * @category Number\n     * @param {number} number The number to check.\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @returns {boolean} Returns `true` if `number` is in the range, else `false`.\n     * @see _.range, _.rangeRight\n     * @example\n     *\n     * _.inRange(3, 2, 4);\n     * // => true\n     *\n     * _.inRange(4, 8);\n     * // => true\n     *\n     * _.inRange(4, 2);\n     * // => false\n     *\n     * _.inRange(2, 2);\n     * // => false\n     *\n     * _.inRange(1.2, 2);\n     * // => true\n     *\n     * _.inRange(5.2, 4);\n     * // => false\n     *\n     * _.inRange(-3, -2, -6);\n     * // => true\n     */\n    function inRange(number, start, end) {\n      start = toFinite(start);\n      if (end === undefined) {\n        end = start;\n        start = 0;\n      } else {\n        end = toFinite(end);\n      }\n      number = toNumber(number);\n      return baseInRange(number, start, end);\n    }\n\n    /**\n     * Produces a random number between the inclusive `lower` and `upper` bounds.\n     * If only one argument is provided a number between `0` and the given number\n     * is returned. If `floating` is `true`, or either `lower` or `upper` are\n     * floats, a floating-point number is returned instead of an integer.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @memberOf _\n     * @since 0.7.0\n     * @category Number\n     * @param {number} [lower=0] The lower bound.\n     * @param {number} [upper=1] The upper bound.\n     * @param {boolean} [floating] Specify returning a floating-point number.\n     * @returns {number} Returns the random number.\n     * @example\n     *\n     * _.random(0, 5);\n     * // => an integer between 0 and 5\n     *\n     * _.random(5);\n     * // => also an integer between 0 and 5\n     *\n     * _.random(5, true);\n     * // => a floating-point number between 0 and 5\n     *\n     * _.random(1.2, 5.2);\n     * // => a floating-point number between 1.2 and 5.2\n     */\n    function random(lower, upper, floating) {\n      if (floating && typeof floating != 'boolean' && isIterateeCall(lower, upper, floating)) {\n        upper = floating = undefined;\n      }\n      if (floating === undefined) {\n        if (typeof upper == 'boolean') {\n          floating = upper;\n          upper = undefined;\n        }\n        else if (typeof lower == 'boolean') {\n          floating = lower;\n          lower = undefined;\n        }\n      }\n      if (lower === undefined && upper === undefined) {\n        lower = 0;\n        upper = 1;\n      }\n      else {\n        lower = toFinite(lower);\n        if (upper === undefined) {\n          upper = lower;\n          lower = 0;\n        } else {\n          upper = toFinite(upper);\n        }\n      }\n      if (lower > upper) {\n        var temp = lower;\n        lower = upper;\n        upper = temp;\n      }\n      if (floating || lower % 1 || upper % 1) {\n        var rand = nativeRandom();\n        return nativeMin(lower + (rand * (upper - lower + freeParseFloat('1e-' + ((rand + '').length - 1)))), upper);\n      }\n      return baseRandom(lower, upper);\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Converts `string` to [camel case](https://en.wikipedia.org/wiki/CamelCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the camel cased string.\n     * @example\n     *\n     * _.camelCase('Foo Bar');\n     * // => 'fooBar'\n     *\n     * _.camelCase('--foo-bar--');\n     * // => 'fooBar'\n     *\n     * _.camelCase('__FOO_BAR__');\n     * // => 'fooBar'\n     */\n    var camelCase = createCompounder(function(result, word, index) {\n      word = word.toLowerCase();\n      return result + (index ? capitalize(word) : word);\n    });\n\n    /**\n     * Converts the first character of `string` to upper case and the remaining\n     * to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to capitalize.\n     * @returns {string} Returns the capitalized string.\n     * @example\n     *\n     * _.capitalize('FRED');\n     * // => 'Fred'\n     */\n    function capitalize(string) {\n      return upperFirst(toString(string).toLowerCase());\n    }\n\n    /**\n     * Deburrs `string` by converting\n     * [Latin-1 Supplement](https://en.wikipedia.org/wiki/Latin-1_Supplement_(Unicode_block)#Character_table)\n     * and [Latin Extended-A](https://en.wikipedia.org/wiki/Latin_Extended-A)\n     * letters to basic Latin letters and removing\n     * [combining diacritical marks](https://en.wikipedia.org/wiki/Combining_Diacritical_Marks).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to deburr.\n     * @returns {string} Returns the deburred string.\n     * @example\n     *\n     * _.deburr('d\u00E9j\u00E0 vu');\n     * // => 'deja vu'\n     */\n    function deburr(string) {\n      string = toString(string);\n      return string && string.replace(reLatin, deburrLetter).replace(reComboMark, '');\n    }\n\n    /**\n     * Checks if `string` ends with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=string.length] The position to search up to.\n     * @returns {boolean} Returns `true` if `string` ends with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.endsWith('abc', 'c');\n     * // => true\n     *\n     * _.endsWith('abc', 'b');\n     * // => false\n     *\n     * _.endsWith('abc', 'b', 2);\n     * // => true\n     */\n    function endsWith(string, target, position) {\n      string = toString(string);\n      target = baseToString(target);\n\n      var length = string.length;\n      position = position === undefined\n        ? length\n        : baseClamp(toInteger(position), 0, length);\n\n      var end = position;\n      position -= target.length;\n      return position >= 0 && string.slice(position, end) == target;\n    }\n\n    /**\n     * Converts the characters \"&\", \"<\", \">\", '\"', and \"'\" in `string` to their\n     * corresponding HTML entities.\n     *\n     * **Note:** No other characters are escaped. To escape additional\n     * characters use a third-party library like [_he_](https://mths.be/he).\n     *\n     * Though the \">\" character is escaped for symmetry, characters like\n     * \">\" and \"/\" don't need escaping in HTML and have no special meaning\n     * unless they're part of a tag or unquoted attribute value. See\n     * [Mathias Bynens's article](https://mathiasbynens.be/notes/ambiguous-ampersands)\n     * (under \"semi-related fun fact\") for more details.\n     *\n     * When working with HTML you should always\n     * [quote attribute values](http://wonko.com/post/html-escaping) to reduce\n     * XSS vectors.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escape('fred, barney, & pebbles');\n     * // => 'fred, barney, &amp; pebbles'\n     */\n    function escape(string) {\n      string = toString(string);\n      return (string && reHasUnescapedHtml.test(string))\n        ? string.replace(reUnescapedHtml, escapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Escapes the `RegExp` special characters \"^\", \"$\", \"\\\", \".\", \"*\", \"+\",\n     * \"?\", \"(\", \")\", \"[\", \"]\", \"{\", \"}\", and \"|\" in `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to escape.\n     * @returns {string} Returns the escaped string.\n     * @example\n     *\n     * _.escapeRegExp('[lodash](https://lodash.com/)');\n     * // => '\\[lodash\\]\\(https://lodash\\.com/\\)'\n     */\n    function escapeRegExp(string) {\n      string = toString(string);\n      return (string && reHasRegExpChar.test(string))\n        ? string.replace(reRegExpChar, '\\\\$&')\n        : string;\n    }\n\n    /**\n     * Converts `string` to\n     * [kebab case](https://en.wikipedia.org/wiki/Letter_case#Special_case_styles).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the kebab cased string.\n     * @example\n     *\n     * _.kebabCase('Foo Bar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('fooBar');\n     * // => 'foo-bar'\n     *\n     * _.kebabCase('__FOO_BAR__');\n     * // => 'foo-bar'\n     */\n    var kebabCase = createCompounder(function(result, word, index) {\n      return result + (index ? '-' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts `string`, as space separated words, to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.lowerCase('--Foo-Bar--');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('fooBar');\n     * // => 'foo bar'\n     *\n     * _.lowerCase('__FOO_BAR__');\n     * // => 'foo bar'\n     */\n    var lowerCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Converts the first character of `string` to lower case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.lowerFirst('Fred');\n     * // => 'fred'\n     *\n     * _.lowerFirst('FRED');\n     * // => 'fRED'\n     */\n    var lowerFirst = createCaseFirst('toLowerCase');\n\n    /**\n     * Pads `string` on the left and right sides if it's shorter than `length`.\n     * Padding characters are truncated if they can't be evenly divided by `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.pad('abc', 8);\n     * // => '  abc   '\n     *\n     * _.pad('abc', 8, '_-');\n     * // => '_-abc_-_'\n     *\n     * _.pad('abc', 3);\n     * // => 'abc'\n     */\n    function pad(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      if (!length || strLength >= length) {\n        return string;\n      }\n      var mid = (length - strLength) / 2;\n      return (\n        createPadding(nativeFloor(mid), chars) +\n        string +\n        createPadding(nativeCeil(mid), chars)\n      );\n    }\n\n    /**\n     * Pads `string` on the right side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padEnd('abc', 6);\n     * // => 'abc   '\n     *\n     * _.padEnd('abc', 6, '_-');\n     * // => 'abc_-_'\n     *\n     * _.padEnd('abc', 3);\n     * // => 'abc'\n     */\n    function padEnd(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (string + createPadding(length - strLength, chars))\n        : string;\n    }\n\n    /**\n     * Pads `string` on the left side if it's shorter than `length`. Padding\n     * characters are truncated if they exceed `length`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to pad.\n     * @param {number} [length=0] The padding length.\n     * @param {string} [chars=' '] The string used as padding.\n     * @returns {string} Returns the padded string.\n     * @example\n     *\n     * _.padStart('abc', 6);\n     * // => '   abc'\n     *\n     * _.padStart('abc', 6, '_-');\n     * // => '_-_abc'\n     *\n     * _.padStart('abc', 3);\n     * // => 'abc'\n     */\n    function padStart(string, length, chars) {\n      string = toString(string);\n      length = toInteger(length);\n\n      var strLength = length ? stringSize(string) : 0;\n      return (length && strLength < length)\n        ? (createPadding(length - strLength, chars) + string)\n        : string;\n    }\n\n    /**\n     * Converts `string` to an integer of the specified radix. If `radix` is\n     * `undefined` or `0`, a `radix` of `10` is used unless `value` is a\n     * hexadecimal, in which case a `radix` of `16` is used.\n     *\n     * **Note:** This method aligns with the\n     * [ES5 implementation](https://es5.github.io/#x15.1.2.2) of `parseInt`.\n     *\n     * @static\n     * @memberOf _\n     * @since 1.1.0\n     * @category String\n     * @param {string} string The string to convert.\n     * @param {number} [radix=10] The radix to interpret `value` by.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {number} Returns the converted integer.\n     * @example\n     *\n     * _.parseInt('08');\n     * // => 8\n     *\n     * _.map(['6', '08', '10'], _.parseInt);\n     * // => [6, 8, 10]\n     */\n    function parseInt(string, radix, guard) {\n      if (guard || radix == null) {\n        radix = 0;\n      } else if (radix) {\n        radix = +radix;\n      }\n      return nativeParseInt(toString(string).replace(reTrimStart, ''), radix || 0);\n    }\n\n    /**\n     * Repeats the given string `n` times.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to repeat.\n     * @param {number} [n=1] The number of times to repeat the string.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the repeated string.\n     * @example\n     *\n     * _.repeat('*', 3);\n     * // => '***'\n     *\n     * _.repeat('abc', 2);\n     * // => 'abcabc'\n     *\n     * _.repeat('abc', 0);\n     * // => ''\n     */\n    function repeat(string, n, guard) {\n      if ((guard ? isIterateeCall(string, n, guard) : n === undefined)) {\n        n = 1;\n      } else {\n        n = toInteger(n);\n      }\n      return baseRepeat(toString(string), n);\n    }\n\n    /**\n     * Replaces matches for `pattern` in `string` with `replacement`.\n     *\n     * **Note:** This method is based on\n     * [`String#replace`](https://mdn.io/String/replace).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to modify.\n     * @param {RegExp|string} pattern The pattern to replace.\n     * @param {Function|string} replacement The match replacement.\n     * @returns {string} Returns the modified string.\n     * @example\n     *\n     * _.replace('Hi Fred', 'Fred', 'Barney');\n     * // => 'Hi Barney'\n     */\n    function replace() {\n      var args = arguments,\n          string = toString(args[0]);\n\n      return args.length < 3 ? string : string.replace(args[1], args[2]);\n    }\n\n    /**\n     * Converts `string` to\n     * [snake case](https://en.wikipedia.org/wiki/Snake_case).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the snake cased string.\n     * @example\n     *\n     * _.snakeCase('Foo Bar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('fooBar');\n     * // => 'foo_bar'\n     *\n     * _.snakeCase('--FOO-BAR--');\n     * // => 'foo_bar'\n     */\n    var snakeCase = createCompounder(function(result, word, index) {\n      return result + (index ? '_' : '') + word.toLowerCase();\n    });\n\n    /**\n     * Splits `string` by `separator`.\n     *\n     * **Note:** This method is based on\n     * [`String#split`](https://mdn.io/String/split).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to split.\n     * @param {RegExp|string} separator The separator pattern to split by.\n     * @param {number} [limit] The length to truncate results to.\n     * @returns {Array} Returns the string segments.\n     * @example\n     *\n     * _.split('a-b-c', '-', 2);\n     * // => ['a', 'b']\n     */\n    function split(string, separator, limit) {\n      if (limit && typeof limit != 'number' && isIterateeCall(string, separator, limit)) {\n        separator = limit = undefined;\n      }\n      limit = limit === undefined ? MAX_ARRAY_LENGTH : limit >>> 0;\n      if (!limit) {\n        return [];\n      }\n      string = toString(string);\n      if (string && (\n            typeof separator == 'string' ||\n            (separator != null && !isRegExp(separator))\n          )) {\n        separator = baseToString(separator);\n        if (!separator && hasUnicode(string)) {\n          return castSlice(stringToArray(string), 0, limit);\n        }\n      }\n      return string.split(separator, limit);\n    }\n\n    /**\n     * Converts `string` to\n     * [start case](https://en.wikipedia.org/wiki/Letter_case#Stylistic_or_specialised_usage).\n     *\n     * @static\n     * @memberOf _\n     * @since 3.1.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the start cased string.\n     * @example\n     *\n     * _.startCase('--foo-bar--');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('fooBar');\n     * // => 'Foo Bar'\n     *\n     * _.startCase('__FOO_BAR__');\n     * // => 'FOO BAR'\n     */\n    var startCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + upperFirst(word);\n    });\n\n    /**\n     * Checks if `string` starts with the given target string.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {string} [target] The string to search for.\n     * @param {number} [position=0] The position to search from.\n     * @returns {boolean} Returns `true` if `string` starts with `target`,\n     *  else `false`.\n     * @example\n     *\n     * _.startsWith('abc', 'a');\n     * // => true\n     *\n     * _.startsWith('abc', 'b');\n     * // => false\n     *\n     * _.startsWith('abc', 'b', 1);\n     * // => true\n     */\n    function startsWith(string, target, position) {\n      string = toString(string);\n      position = position == null\n        ? 0\n        : baseClamp(toInteger(position), 0, string.length);\n\n      target = baseToString(target);\n      return string.slice(position, position + target.length) == target;\n    }\n\n    /**\n     * Creates a compiled template function that can interpolate data properties\n     * in \"interpolate\" delimiters, HTML-escape interpolated data properties in\n     * \"escape\" delimiters, and execute JavaScript in \"evaluate\" delimiters. Data\n     * properties may be accessed as free variables in the template. If a setting\n     * object is given, it takes precedence over `_.templateSettings` values.\n     *\n     * **Note:** In the development build `_.template` utilizes\n     * [sourceURLs](http://www.html5rocks.com/en/tutorials/developertools/sourcemaps/#toc-sourceurl)\n     * for easier debugging.\n     *\n     * For more information on precompiling templates see\n     * [lodash's custom builds documentation](https://lodash.com/custom-builds).\n     *\n     * For more information on Chrome extension sandboxes see\n     * [Chrome's extensions documentation](https://developer.chrome.com/extensions/sandboxingEval).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category String\n     * @param {string} [string=''] The template string.\n     * @param {Object} [options={}] The options object.\n     * @param {RegExp} [options.escape=_.templateSettings.escape]\n     *  The HTML \"escape\" delimiter.\n     * @param {RegExp} [options.evaluate=_.templateSettings.evaluate]\n     *  The \"evaluate\" delimiter.\n     * @param {Object} [options.imports=_.templateSettings.imports]\n     *  An object to import into the template as free variables.\n     * @param {RegExp} [options.interpolate=_.templateSettings.interpolate]\n     *  The \"interpolate\" delimiter.\n     * @param {string} [options.sourceURL='lodash.templateSources[n]']\n     *  The sourceURL of the compiled template.\n     * @param {string} [options.variable='obj']\n     *  The data object variable name.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Function} Returns the compiled template function.\n     * @example\n     *\n     * // Use the \"interpolate\" delimiter to create a compiled template.\n     * var compiled = _.template('hello <%= user %>!');\n     * compiled({ 'user': 'fred' });\n     * // => 'hello fred!'\n     *\n     * // Use the HTML \"escape\" delimiter to escape data property values.\n     * var compiled = _.template('<b><%- value %></b>');\n     * compiled({ 'value': '<script>' });\n     * // => '<b>&lt;script&gt;</b>'\n     *\n     * // Use the \"evaluate\" delimiter to execute JavaScript and generate HTML.\n     * var compiled = _.template('<% _.forEach(users, function(user) { %><li><%- user %></li><% }); %>');\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the internal `print` function in \"evaluate\" delimiters.\n     * var compiled = _.template('<% print(\"hello \" + user); %>!');\n     * compiled({ 'user': 'barney' });\n     * // => 'hello barney!'\n     *\n     * // Use the ES template literal delimiter as an \"interpolate\" delimiter.\n     * // Disable support by replacing the \"interpolate\" delimiter.\n     * var compiled = _.template('hello ${ user }!');\n     * compiled({ 'user': 'pebbles' });\n     * // => 'hello pebbles!'\n     *\n     * // Use backslashes to treat delimiters as plain text.\n     * var compiled = _.template('<%= \"\\\\<%- value %\\\\>\" %>');\n     * compiled({ 'value': 'ignored' });\n     * // => '<%- value %>'\n     *\n     * // Use the `imports` option to import `jQuery` as `jq`.\n     * var text = '<% jq.each(users, function(user) { %><li><%- user %></li><% }); %>';\n     * var compiled = _.template(text, { 'imports': { 'jq': jQuery } });\n     * compiled({ 'users': ['fred', 'barney'] });\n     * // => '<li>fred</li><li>barney</li>'\n     *\n     * // Use the `sourceURL` option to specify a custom sourceURL for the template.\n     * var compiled = _.template('hello <%= user %>!', { 'sourceURL': '/basic/greeting.jst' });\n     * compiled(data);\n     * // => Find the source of \"greeting.jst\" under the Sources tab or Resources panel of the web inspector.\n     *\n     * // Use the `variable` option to ensure a with-statement isn't used in the compiled template.\n     * var compiled = _.template('hi <%= data.user %>!', { 'variable': 'data' });\n     * compiled.source;\n     * // => function(data) {\n     * //   var __t, __p = '';\n     * //   __p += 'hi ' + ((__t = ( data.user )) == null ? '' : __t) + '!';\n     * //   return __p;\n     * // }\n     *\n     * // Use custom template delimiters.\n     * _.templateSettings.interpolate = /{{([\\s\\S]+?)}}/g;\n     * var compiled = _.template('hello {{ user }}!');\n     * compiled({ 'user': 'mustache' });\n     * // => 'hello mustache!'\n     *\n     * // Use the `source` property to inline compiled templates for meaningful\n     * // line numbers in error messages and stack traces.\n     * fs.writeFileSync(path.join(process.cwd(), 'jst.js'), '\\\n     *   var JST = {\\\n     *     \"main\": ' + _.template(mainText).source + '\\\n     *   };\\\n     * ');\n     */\n    function template(string, options, guard) {\n      // Based on John Resig's `tmpl` implementation\n      // (http://ejohn.org/blog/javascript-micro-templating/)\n      // and Laura Doktorova's doT.js (https://github.com/olado/doT).\n      var settings = lodash.templateSettings;\n\n      if (guard && isIterateeCall(string, options, guard)) {\n        options = undefined;\n      }\n      string = toString(string);\n      options = assignInWith({}, options, settings, customDefaultsAssignIn);\n\n      var imports = assignInWith({}, options.imports, settings.imports, customDefaultsAssignIn),\n          importsKeys = keys(imports),\n          importsValues = baseValues(imports, importsKeys);\n\n      var isEscaping,\n          isEvaluating,\n          index = 0,\n          interpolate = options.interpolate || reNoMatch,\n          source = \"__p += '\";\n\n      // Compile the regexp to match each delimiter.\n      var reDelimiters = RegExp(\n        (options.escape || reNoMatch).source + '|' +\n        interpolate.source + '|' +\n        (interpolate === reInterpolate ? reEsTemplate : reNoMatch).source + '|' +\n        (options.evaluate || reNoMatch).source + '|$'\n      , 'g');\n\n      // Use a sourceURL for easier debugging.\n      // The sourceURL gets injected into the source that's eval-ed, so be careful\n      // to normalize all kinds of whitespace, so e.g. newlines (and unicode versions of it) can't sneak in\n      // and escape the comment, thus injecting code that gets evaled.\n      var sourceURL = '//# sourceURL=' +\n        (hasOwnProperty.call(options, 'sourceURL')\n          ? (options.sourceURL + '').replace(/\\s/g, ' ')\n          : ('lodash.templateSources[' + (++templateCounter) + ']')\n        ) + '\\n';\n\n      string.replace(reDelimiters, function(match, escapeValue, interpolateValue, esTemplateValue, evaluateValue, offset) {\n        interpolateValue || (interpolateValue = esTemplateValue);\n\n        // Escape characters that can't be included in string literals.\n        source += string.slice(index, offset).replace(reUnescapedString, escapeStringChar);\n\n        // Replace delimiters with snippets.\n        if (escapeValue) {\n          isEscaping = true;\n          source += \"' +\\n__e(\" + escapeValue + \") +\\n'\";\n        }\n        if (evaluateValue) {\n          isEvaluating = true;\n          source += \"';\\n\" + evaluateValue + \";\\n__p += '\";\n        }\n        if (interpolateValue) {\n          source += \"' +\\n((__t = (\" + interpolateValue + \")) == null ? '' : __t) +\\n'\";\n        }\n        index = offset + match.length;\n\n        // The JS engine embedded in Adobe products needs `match` returned in\n        // order to produce the correct `offset` value.\n        return match;\n      });\n\n      source += \"';\\n\";\n\n      // If `variable` is not specified wrap a with-statement around the generated\n      // code to add the data object to the top of the scope chain.\n      var variable = hasOwnProperty.call(options, 'variable') && options.variable;\n      if (!variable) {\n        source = 'with (obj) {\\n' + source + '\\n}\\n';\n      }\n      // Throw an error if a forbidden character was found in `variable`, to prevent\n      // potential command injection attacks.\n      else if (reForbiddenIdentifierChars.test(variable)) {\n        throw new Error(INVALID_TEMPL_VAR_ERROR_TEXT);\n      }\n\n      // Cleanup code by stripping empty strings.\n      source = (isEvaluating ? source.replace(reEmptyStringLeading, '') : source)\n        .replace(reEmptyStringMiddle, '$1')\n        .replace(reEmptyStringTrailing, '$1;');\n\n      // Frame code as the function body.\n      source = 'function(' + (variable || 'obj') + ') {\\n' +\n        (variable\n          ? ''\n          : 'obj || (obj = {});\\n'\n        ) +\n        \"var __t, __p = ''\" +\n        (isEscaping\n           ? ', __e = _.escape'\n           : ''\n        ) +\n        (isEvaluating\n          ? ', __j = Array.prototype.join;\\n' +\n            \"function print() { __p += __j.call(arguments, '') }\\n\"\n          : ';\\n'\n        ) +\n        source +\n        'return __p\\n}';\n\n      var result = attempt(function() {\n        return Function(importsKeys, sourceURL + 'return ' + source)\n          .apply(undefined, importsValues);\n      });\n\n      // Provide the compiled function's source by its `toString` method or\n      // the `source` property as a convenience for inlining compiled templates.\n      result.source = source;\n      if (isError(result)) {\n        throw result;\n      }\n      return result;\n    }\n\n    /**\n     * Converts `string`, as a whole, to lower case just like\n     * [String#toLowerCase](https://mdn.io/toLowerCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the lower cased string.\n     * @example\n     *\n     * _.toLower('--Foo-Bar--');\n     * // => '--foo-bar--'\n     *\n     * _.toLower('fooBar');\n     * // => 'foobar'\n     *\n     * _.toLower('__FOO_BAR__');\n     * // => '__foo_bar__'\n     */\n    function toLower(value) {\n      return toString(value).toLowerCase();\n    }\n\n    /**\n     * Converts `string`, as a whole, to upper case just like\n     * [String#toUpperCase](https://mdn.io/toUpperCase).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.toUpper('--foo-bar--');\n     * // => '--FOO-BAR--'\n     *\n     * _.toUpper('fooBar');\n     * // => 'FOOBAR'\n     *\n     * _.toUpper('__foo_bar__');\n     * // => '__FOO_BAR__'\n     */\n    function toUpper(value) {\n      return toString(value).toUpperCase();\n    }\n\n    /**\n     * Removes leading and trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trim('  abc  ');\n     * // => 'abc'\n     *\n     * _.trim('-_-abc-_-', '_-');\n     * // => 'abc'\n     *\n     * _.map(['  foo  ', '  bar  '], _.trim);\n     * // => ['foo', 'bar']\n     */\n    function trim(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return baseTrim(string);\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          chrSymbols = stringToArray(chars),\n          start = charsStartIndex(strSymbols, chrSymbols),\n          end = charsEndIndex(strSymbols, chrSymbols) + 1;\n\n      return castSlice(strSymbols, start, end).join('');\n    }\n\n    /**\n     * Removes trailing whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimEnd('  abc  ');\n     * // => '  abc'\n     *\n     * _.trimEnd('-_-abc-_-', '_-');\n     * // => '-_-abc'\n     */\n    function trimEnd(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.slice(0, trimmedEndIndex(string) + 1);\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          end = charsEndIndex(strSymbols, stringToArray(chars)) + 1;\n\n      return castSlice(strSymbols, 0, end).join('');\n    }\n\n    /**\n     * Removes leading whitespace or specified characters from `string`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to trim.\n     * @param {string} [chars=whitespace] The characters to trim.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {string} Returns the trimmed string.\n     * @example\n     *\n     * _.trimStart('  abc  ');\n     * // => 'abc  '\n     *\n     * _.trimStart('-_-abc-_-', '_-');\n     * // => 'abc-_-'\n     */\n    function trimStart(string, chars, guard) {\n      string = toString(string);\n      if (string && (guard || chars === undefined)) {\n        return string.replace(reTrimStart, '');\n      }\n      if (!string || !(chars = baseToString(chars))) {\n        return string;\n      }\n      var strSymbols = stringToArray(string),\n          start = charsStartIndex(strSymbols, stringToArray(chars));\n\n      return castSlice(strSymbols, start).join('');\n    }\n\n    /**\n     * Truncates `string` if it's longer than the given maximum string length.\n     * The last characters of the truncated string are replaced with the omission\n     * string which defaults to \"...\".\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to truncate.\n     * @param {Object} [options={}] The options object.\n     * @param {number} [options.length=30] The maximum string length.\n     * @param {string} [options.omission='...'] The string to indicate text is omitted.\n     * @param {RegExp|string} [options.separator] The separator pattern to truncate to.\n     * @returns {string} Returns the truncated string.\n     * @example\n     *\n     * _.truncate('hi-diddly-ho there, neighborino');\n     * // => 'hi-diddly-ho there, neighbo...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': ' '\n     * });\n     * // => 'hi-diddly-ho there,...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'length': 24,\n     *   'separator': /,? +/\n     * });\n     * // => 'hi-diddly-ho there...'\n     *\n     * _.truncate('hi-diddly-ho there, neighborino', {\n     *   'omission': ' [...]'\n     * });\n     * // => 'hi-diddly-ho there, neig [...]'\n     */\n    function truncate(string, options) {\n      var length = DEFAULT_TRUNC_LENGTH,\n          omission = DEFAULT_TRUNC_OMISSION;\n\n      if (isObject(options)) {\n        var separator = 'separator' in options ? options.separator : separator;\n        length = 'length' in options ? toInteger(options.length) : length;\n        omission = 'omission' in options ? baseToString(options.omission) : omission;\n      }\n      string = toString(string);\n\n      var strLength = string.length;\n      if (hasUnicode(string)) {\n        var strSymbols = stringToArray(string);\n        strLength = strSymbols.length;\n      }\n      if (length >= strLength) {\n        return string;\n      }\n      var end = length - stringSize(omission);\n      if (end < 1) {\n        return omission;\n      }\n      var result = strSymbols\n        ? castSlice(strSymbols, 0, end).join('')\n        : string.slice(0, end);\n\n      if (separator === undefined) {\n        return result + omission;\n      }\n      if (strSymbols) {\n        end += (result.length - end);\n      }\n      if (isRegExp(separator)) {\n        if (string.slice(end).search(separator)) {\n          var match,\n              substring = result;\n\n          if (!separator.global) {\n            separator = RegExp(separator.source, toString(reFlags.exec(separator)) + 'g');\n          }\n          separator.lastIndex = 0;\n          while ((match = separator.exec(substring))) {\n            var newEnd = match.index;\n          }\n          result = result.slice(0, newEnd === undefined ? end : newEnd);\n        }\n      } else if (string.indexOf(baseToString(separator), end) != end) {\n        var index = result.lastIndexOf(separator);\n        if (index > -1) {\n          result = result.slice(0, index);\n        }\n      }\n      return result + omission;\n    }\n\n    /**\n     * The inverse of `_.escape`; this method converts the HTML entities\n     * `&amp;`, `&lt;`, `&gt;`, `&quot;`, and `&#39;` in `string` to\n     * their corresponding characters.\n     *\n     * **Note:** No other HTML entities are unescaped. To unescape additional\n     * HTML entities use a third-party library like [_he_](https://mths.be/he).\n     *\n     * @static\n     * @memberOf _\n     * @since 0.6.0\n     * @category String\n     * @param {string} [string=''] The string to unescape.\n     * @returns {string} Returns the unescaped string.\n     * @example\n     *\n     * _.unescape('fred, barney, &amp; pebbles');\n     * // => 'fred, barney, & pebbles'\n     */\n    function unescape(string) {\n      string = toString(string);\n      return (string && reHasEscapedHtml.test(string))\n        ? string.replace(reEscapedHtml, unescapeHtmlChar)\n        : string;\n    }\n\n    /**\n     * Converts `string`, as space separated words, to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the upper cased string.\n     * @example\n     *\n     * _.upperCase('--foo-bar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('fooBar');\n     * // => 'FOO BAR'\n     *\n     * _.upperCase('__foo_bar__');\n     * // => 'FOO BAR'\n     */\n    var upperCase = createCompounder(function(result, word, index) {\n      return result + (index ? ' ' : '') + word.toUpperCase();\n    });\n\n    /**\n     * Converts the first character of `string` to upper case.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category String\n     * @param {string} [string=''] The string to convert.\n     * @returns {string} Returns the converted string.\n     * @example\n     *\n     * _.upperFirst('fred');\n     * // => 'Fred'\n     *\n     * _.upperFirst('FRED');\n     * // => 'FRED'\n     */\n    var upperFirst = createCaseFirst('toUpperCase');\n\n    /**\n     * Splits `string` into an array of its words.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category String\n     * @param {string} [string=''] The string to inspect.\n     * @param {RegExp|string} [pattern] The pattern to match words.\n     * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n     * @returns {Array} Returns the words of `string`.\n     * @example\n     *\n     * _.words('fred, barney, & pebbles');\n     * // => ['fred', 'barney', 'pebbles']\n     *\n     * _.words('fred, barney, & pebbles', /[^, ]+/g);\n     * // => ['fred', 'barney', '&', 'pebbles']\n     */\n    function words(string, pattern, guard) {\n      string = toString(string);\n      pattern = guard ? undefined : pattern;\n\n      if (pattern === undefined) {\n        return hasUnicodeWord(string) ? unicodeWords(string) : asciiWords(string);\n      }\n      return string.match(pattern) || [];\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Attempts to invoke `func`, returning either the result or the caught error\n     * object. Any additional arguments are provided to `func` when it's invoked.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Function} func The function to attempt.\n     * @param {...*} [args] The arguments to invoke `func` with.\n     * @returns {*} Returns the `func` result or error object.\n     * @example\n     *\n     * // Avoid throwing errors for invalid selectors.\n     * var elements = _.attempt(function(selector) {\n     *   return document.querySelectorAll(selector);\n     * }, '>_>');\n     *\n     * if (_.isError(elements)) {\n     *   elements = [];\n     * }\n     */\n    var attempt = baseRest(function(func, args) {\n      try {\n        return apply(func, undefined, args);\n      } catch (e) {\n        return isError(e) ? e : new Error(e);\n      }\n    });\n\n    /**\n     * Binds methods of an object to the object itself, overwriting the existing\n     * method.\n     *\n     * **Note:** This method doesn't set the \"length\" property of bound functions.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Object} object The object to bind and assign the bound methods to.\n     * @param {...(string|string[])} methodNames The object method names to bind.\n     * @returns {Object} Returns `object`.\n     * @example\n     *\n     * var view = {\n     *   'label': 'docs',\n     *   'click': function() {\n     *     console.log('clicked ' + this.label);\n     *   }\n     * };\n     *\n     * _.bindAll(view, ['click']);\n     * jQuery(element).on('click', view.click);\n     * // => Logs 'clicked docs' when clicked.\n     */\n    var bindAll = flatRest(function(object, methodNames) {\n      arrayEach(methodNames, function(key) {\n        key = toKey(key);\n        baseAssignValue(object, key, bind(object[key], object));\n      });\n      return object;\n    });\n\n    /**\n     * Creates a function that iterates over `pairs` and invokes the corresponding\n     * function of the first predicate to return truthy. The predicate-function\n     * pairs are invoked with the `this` binding and arguments of the created\n     * function.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Array} pairs The predicate-function pairs.\n     * @returns {Function} Returns the new composite function.\n     * @example\n     *\n     * var func = _.cond([\n     *   [_.matches({ 'a': 1 }),           _.constant('matches A')],\n     *   [_.conforms({ 'b': _.isNumber }), _.constant('matches B')],\n     *   [_.stubTrue,                      _.constant('no match')]\n     * ]);\n     *\n     * func({ 'a': 1, 'b': 2 });\n     * // => 'matches A'\n     *\n     * func({ 'a': 0, 'b': 1 });\n     * // => 'matches B'\n     *\n     * func({ 'a': '1', 'b': '2' });\n     * // => 'no match'\n     */\n    function cond(pairs) {\n      var length = pairs == null ? 0 : pairs.length,\n          toIteratee = getIteratee();\n\n      pairs = !length ? [] : arrayMap(pairs, function(pair) {\n        if (typeof pair[1] != 'function') {\n          throw new TypeError(FUNC_ERROR_TEXT);\n        }\n        return [toIteratee(pair[0]), pair[1]];\n      });\n\n      return baseRest(function(args) {\n        var index = -1;\n        while (++index < length) {\n          var pair = pairs[index];\n          if (apply(pair[0], this, args)) {\n            return apply(pair[1], this, args);\n          }\n        }\n      });\n    }\n\n    /**\n     * Creates a function that invokes the predicate properties of `source` with\n     * the corresponding property values of a given object, returning `true` if\n     * all predicates return truthy, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.conformsTo` with\n     * `source` partially applied.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {Object} source The object of property predicates to conform to.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 2, 'b': 1 },\n     *   { 'a': 1, 'b': 2 }\n     * ];\n     *\n     * _.filter(objects, _.conforms({ 'b': function(n) { return n > 1; } }));\n     * // => [{ 'a': 1, 'b': 2 }]\n     */\n    function conforms(source) {\n      return baseConforms(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that returns `value`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {*} value The value to return from the new function.\n     * @returns {Function} Returns the new constant function.\n     * @example\n     *\n     * var objects = _.times(2, _.constant({ 'a': 1 }));\n     *\n     * console.log(objects);\n     * // => [{ 'a': 1 }, { 'a': 1 }]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => true\n     */\n    function constant(value) {\n      return function() {\n        return value;\n      };\n    }\n\n    /**\n     * Checks `value` to determine whether a default value should be returned in\n     * its place. The `defaultValue` is returned if `value` is `NaN`, `null`,\n     * or `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.14.0\n     * @category Util\n     * @param {*} value The value to check.\n     * @param {*} defaultValue The default value.\n     * @returns {*} Returns the resolved value.\n     * @example\n     *\n     * _.defaultTo(1, 10);\n     * // => 1\n     *\n     * _.defaultTo(undefined, 10);\n     * // => 10\n     */\n    function defaultTo(value, defaultValue) {\n      return (value == null || value !== value) ? defaultValue : value;\n    }\n\n    /**\n     * Creates a function that returns the result of invoking the given functions\n     * with the `this` binding of the created function, where each successive\n     * invocation is supplied the return value of the previous.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flowRight\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flow([_.add, square]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flow = createFlow();\n\n    /**\n     * This method is like `_.flow` except that it creates a function that\n     * invokes the given functions from right to left.\n     *\n     * @static\n     * @since 3.0.0\n     * @memberOf _\n     * @category Util\n     * @param {...(Function|Function[])} [funcs] The functions to invoke.\n     * @returns {Function} Returns the new composite function.\n     * @see _.flow\n     * @example\n     *\n     * function square(n) {\n     *   return n * n;\n     * }\n     *\n     * var addSquare = _.flowRight([square, _.add]);\n     * addSquare(1, 2);\n     * // => 9\n     */\n    var flowRight = createFlow(true);\n\n    /**\n     * This method returns the first argument it receives.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {*} value Any value.\n     * @returns {*} Returns `value`.\n     * @example\n     *\n     * var object = { 'a': 1 };\n     *\n     * console.log(_.identity(object) === object);\n     * // => true\n     */\n    function identity(value) {\n      return value;\n    }\n\n    /**\n     * Creates a function that invokes `func` with the arguments of the created\n     * function. If `func` is a property name, the created function returns the\n     * property value for a given element. If `func` is an array or object, the\n     * created function returns `true` for elements that contain the equivalent\n     * source properties, otherwise it returns `false`.\n     *\n     * @static\n     * @since 4.0.0\n     * @memberOf _\n     * @category Util\n     * @param {*} [func=_.identity] The value to convert to a callback.\n     * @returns {Function} Returns the callback.\n     * @example\n     *\n     * var users = [\n     *   { 'user': 'barney', 'age': 36, 'active': true },\n     *   { 'user': 'fred',   'age': 40, 'active': false }\n     * ];\n     *\n     * // The `_.matches` iteratee shorthand.\n     * _.filter(users, _.iteratee({ 'user': 'barney', 'active': true }));\n     * // => [{ 'user': 'barney', 'age': 36, 'active': true }]\n     *\n     * // The `_.matchesProperty` iteratee shorthand.\n     * _.filter(users, _.iteratee(['user', 'fred']));\n     * // => [{ 'user': 'fred', 'age': 40 }]\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.map(users, _.iteratee('user'));\n     * // => ['barney', 'fred']\n     *\n     * // Create custom iteratee shorthands.\n     * _.iteratee = _.wrap(_.iteratee, function(iteratee, func) {\n     *   return !_.isRegExp(func) ? iteratee(func) : function(string) {\n     *     return func.test(string);\n     *   };\n     * });\n     *\n     * _.filter(['abc', 'def'], /ef/);\n     * // => ['def']\n     */\n    function iteratee(func) {\n      return baseIteratee(typeof func == 'function' ? func : baseClone(func, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between a given\n     * object and `source`, returning `true` if the given object has equivalent\n     * property values, else `false`.\n     *\n     * **Note:** The created function is equivalent to `_.isMatch` with `source`\n     * partially applied.\n     *\n     * Partial comparisons will match empty array and empty object `source`\n     * values against any array or object value, respectively. See `_.isEqual`\n     * for a list of supported value comparisons.\n     *\n     * **Note:** Multiple values can be checked by combining several matchers\n     * using `_.overSome`\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} source The object of property values to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.filter(objects, _.matches({ 'a': 4, 'c': 6 }));\n     * // => [{ 'a': 4, 'b': 5, 'c': 6 }]\n     *\n     * // Checking for several possible values\n     * _.filter(objects, _.overSome([_.matches({ 'a': 1 }), _.matches({ 'a': 4 })]));\n     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n     */\n    function matches(source) {\n      return baseMatches(baseClone(source, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that performs a partial deep comparison between the\n     * value at `path` of a given object to `srcValue`, returning `true` if the\n     * object value is equivalent, else `false`.\n     *\n     * **Note:** Partial comparisons will match empty array and empty object\n     * `srcValue` values against any array or object value, respectively. See\n     * `_.isEqual` for a list of supported value comparisons.\n     *\n     * **Note:** Multiple values can be checked by combining several matchers\n     * using `_.overSome`\n     *\n     * @static\n     * @memberOf _\n     * @since 3.2.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @param {*} srcValue The value to match.\n     * @returns {Function} Returns the new spec function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': 1, 'b': 2, 'c': 3 },\n     *   { 'a': 4, 'b': 5, 'c': 6 }\n     * ];\n     *\n     * _.find(objects, _.matchesProperty('a', 4));\n     * // => { 'a': 4, 'b': 5, 'c': 6 }\n     *\n     * // Checking for several possible values\n     * _.filter(objects, _.overSome([_.matchesProperty('a', 1), _.matchesProperty('a', 4)]));\n     * // => [{ 'a': 1, 'b': 2, 'c': 3 }, { 'a': 4, 'b': 5, 'c': 6 }]\n     */\n    function matchesProperty(path, srcValue) {\n      return baseMatchesProperty(path, baseClone(srcValue, CLONE_DEEP_FLAG));\n    }\n\n    /**\n     * Creates a function that invokes the method at `path` of a given object.\n     * Any additional arguments are provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Array|string} path The path of the method to invoke.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': _.constant(2) } },\n     *   { 'a': { 'b': _.constant(1) } }\n     * ];\n     *\n     * _.map(objects, _.method('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(objects, _.method(['a', 'b']));\n     * // => [2, 1]\n     */\n    var method = baseRest(function(path, args) {\n      return function(object) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * The opposite of `_.method`; this method creates a function that invokes\n     * the method at a given path of `object`. Any additional arguments are\n     * provided to the invoked method.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.7.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @param {...*} [args] The arguments to invoke the method with.\n     * @returns {Function} Returns the new invoker function.\n     * @example\n     *\n     * var array = _.times(3, _.constant),\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.methodOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.methodOf(object));\n     * // => [2, 0]\n     */\n    var methodOf = baseRest(function(object, args) {\n      return function(path) {\n        return baseInvoke(object, path, args);\n      };\n    });\n\n    /**\n     * Adds all own enumerable string keyed function properties of a source\n     * object to the destination object. If `object` is a function, then methods\n     * are added to its prototype as well.\n     *\n     * **Note:** Use `_.runInContext` to create a pristine `lodash` function to\n     * avoid conflicts caused by modifying the original.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {Function|Object} [object=lodash] The destination object.\n     * @param {Object} source The object of functions to add.\n     * @param {Object} [options={}] The options object.\n     * @param {boolean} [options.chain=true] Specify whether mixins are chainable.\n     * @returns {Function|Object} Returns `object`.\n     * @example\n     *\n     * function vowels(string) {\n     *   return _.filter(string, function(v) {\n     *     return /[aeiou]/i.test(v);\n     *   });\n     * }\n     *\n     * _.mixin({ 'vowels': vowels });\n     * _.vowels('fred');\n     * // => ['e']\n     *\n     * _('fred').vowels().value();\n     * // => ['e']\n     *\n     * _.mixin({ 'vowels': vowels }, { 'chain': false });\n     * _('fred').vowels();\n     * // => ['e']\n     */\n    function mixin(object, source, options) {\n      var props = keys(source),\n          methodNames = baseFunctions(source, props);\n\n      if (options == null &&\n          !(isObject(source) && (methodNames.length || !props.length))) {\n        options = source;\n        source = object;\n        object = this;\n        methodNames = baseFunctions(source, keys(source));\n      }\n      var chain = !(isObject(options) && 'chain' in options) || !!options.chain,\n          isFunc = isFunction(object);\n\n      arrayEach(methodNames, function(methodName) {\n        var func = source[methodName];\n        object[methodName] = func;\n        if (isFunc) {\n          object.prototype[methodName] = function() {\n            var chainAll = this.__chain__;\n            if (chain || chainAll) {\n              var result = object(this.__wrapped__),\n                  actions = result.__actions__ = copyArray(this.__actions__);\n\n              actions.push({ 'func': func, 'args': arguments, 'thisArg': object });\n              result.__chain__ = chainAll;\n              return result;\n            }\n            return func.apply(object, arrayPush([this.value()], arguments));\n          };\n        }\n      });\n\n      return object;\n    }\n\n    /**\n     * Reverts the `_` variable to its previous value and returns a reference to\n     * the `lodash` function.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @returns {Function} Returns the `lodash` function.\n     * @example\n     *\n     * var lodash = _.noConflict();\n     */\n    function noConflict() {\n      if (root._ === this) {\n        root._ = oldDash;\n      }\n      return this;\n    }\n\n    /**\n     * This method returns `undefined`.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.3.0\n     * @category Util\n     * @example\n     *\n     * _.times(2, _.noop);\n     * // => [undefined, undefined]\n     */\n    function noop() {\n      // No operation performed.\n    }\n\n    /**\n     * Creates a function that gets the argument at index `n`. If `n` is negative,\n     * the nth argument from the end is returned.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [n=0] The index of the argument to return.\n     * @returns {Function} Returns the new pass-thru function.\n     * @example\n     *\n     * var func = _.nthArg(1);\n     * func('a', 'b', 'c', 'd');\n     * // => 'b'\n     *\n     * var func = _.nthArg(-2);\n     * func('a', 'b', 'c', 'd');\n     * // => 'c'\n     */\n    function nthArg(n) {\n      n = toInteger(n);\n      return baseRest(function(args) {\n        return baseNth(args, n);\n      });\n    }\n\n    /**\n     * Creates a function that invokes `iteratees` with the arguments it receives\n     * and returns their results.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [iteratees=[_.identity]]\n     *  The iteratees to invoke.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.over([Math.max, Math.min]);\n     *\n     * func(1, 2, 3, 4);\n     * // => [4, 1]\n     */\n    var over = createOver(arrayMap);\n\n    /**\n     * Creates a function that checks if **all** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * Following shorthands are possible for providing predicates.\n     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overEvery([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => false\n     *\n     * func(NaN);\n     * // => false\n     */\n    var overEvery = createOver(arrayEvery);\n\n    /**\n     * Creates a function that checks if **any** of the `predicates` return\n     * truthy when invoked with the arguments it receives.\n     *\n     * Following shorthands are possible for providing predicates.\n     * Pass an `Object` and it will be used as an parameter for `_.matches` to create the predicate.\n     * Pass an `Array` of parameters for `_.matchesProperty` and the predicate will be created using them.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {...(Function|Function[])} [predicates=[_.identity]]\n     *  The predicates to check.\n     * @returns {Function} Returns the new function.\n     * @example\n     *\n     * var func = _.overSome([Boolean, isFinite]);\n     *\n     * func('1');\n     * // => true\n     *\n     * func(null);\n     * // => true\n     *\n     * func(NaN);\n     * // => false\n     *\n     * var matchesFunc = _.overSome([{ 'a': 1 }, { 'a': 2 }])\n     * var matchesPropertyFunc = _.overSome([['a', 1], ['a', 2]])\n     */\n    var overSome = createOver(arraySome);\n\n    /**\n     * Creates a function that returns the value at `path` of a given object.\n     *\n     * @static\n     * @memberOf _\n     * @since 2.4.0\n     * @category Util\n     * @param {Array|string} path The path of the property to get.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var objects = [\n     *   { 'a': { 'b': 2 } },\n     *   { 'a': { 'b': 1 } }\n     * ];\n     *\n     * _.map(objects, _.property('a.b'));\n     * // => [2, 1]\n     *\n     * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n     * // => [1, 2]\n     */\n    function property(path) {\n      return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n    }\n\n    /**\n     * The opposite of `_.property`; this method creates a function that returns\n     * the value at a given path of `object`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.0.0\n     * @category Util\n     * @param {Object} object The object to query.\n     * @returns {Function} Returns the new accessor function.\n     * @example\n     *\n     * var array = [0, 1, 2],\n     *     object = { 'a': array, 'b': array, 'c': array };\n     *\n     * _.map(['a[2]', 'c[0]'], _.propertyOf(object));\n     * // => [2, 0]\n     *\n     * _.map([['a', '2'], ['c', '0']], _.propertyOf(object));\n     * // => [2, 0]\n     */\n    function propertyOf(object) {\n      return function(path) {\n        return object == null ? undefined : baseGet(object, path);\n      };\n    }\n\n    /**\n     * Creates an array of numbers (positive and/or negative) progressing from\n     * `start` up to, but not including, `end`. A step of `-1` is used if a negative\n     * `start` is specified without an `end` or `step`. If `end` is not specified,\n     * it's set to `start` with `start` then set to `0`.\n     *\n     * **Note:** JavaScript follows the IEEE-754 standard for resolving\n     * floating-point values which can produce unexpected results.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.rangeRight\n     * @example\n     *\n     * _.range(4);\n     * // => [0, 1, 2, 3]\n     *\n     * _.range(-4);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 5);\n     * // => [1, 2, 3, 4]\n     *\n     * _.range(0, 20, 5);\n     * // => [0, 5, 10, 15]\n     *\n     * _.range(0, -4, -1);\n     * // => [0, -1, -2, -3]\n     *\n     * _.range(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.range(0);\n     * // => []\n     */\n    var range = createRange();\n\n    /**\n     * This method is like `_.range` except that it populates values in\n     * descending order.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {number} [start=0] The start of the range.\n     * @param {number} end The end of the range.\n     * @param {number} [step=1] The value to increment or decrement by.\n     * @returns {Array} Returns the range of numbers.\n     * @see _.inRange, _.range\n     * @example\n     *\n     * _.rangeRight(4);\n     * // => [3, 2, 1, 0]\n     *\n     * _.rangeRight(-4);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 5);\n     * // => [4, 3, 2, 1]\n     *\n     * _.rangeRight(0, 20, 5);\n     * // => [15, 10, 5, 0]\n     *\n     * _.rangeRight(0, -4, -1);\n     * // => [-3, -2, -1, 0]\n     *\n     * _.rangeRight(1, 4, 0);\n     * // => [1, 1, 1]\n     *\n     * _.rangeRight(0);\n     * // => []\n     */\n    var rangeRight = createRange(true);\n\n    /**\n     * This method returns a new empty array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Array} Returns the new empty array.\n     * @example\n     *\n     * var arrays = _.times(2, _.stubArray);\n     *\n     * console.log(arrays);\n     * // => [[], []]\n     *\n     * console.log(arrays[0] === arrays[1]);\n     * // => false\n     */\n    function stubArray() {\n      return [];\n    }\n\n    /**\n     * This method returns `false`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `false`.\n     * @example\n     *\n     * _.times(2, _.stubFalse);\n     * // => [false, false]\n     */\n    function stubFalse() {\n      return false;\n    }\n\n    /**\n     * This method returns a new empty object.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {Object} Returns the new empty object.\n     * @example\n     *\n     * var objects = _.times(2, _.stubObject);\n     *\n     * console.log(objects);\n     * // => [{}, {}]\n     *\n     * console.log(objects[0] === objects[1]);\n     * // => false\n     */\n    function stubObject() {\n      return {};\n    }\n\n    /**\n     * This method returns an empty string.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {string} Returns the empty string.\n     * @example\n     *\n     * _.times(2, _.stubString);\n     * // => ['', '']\n     */\n    function stubString() {\n      return '';\n    }\n\n    /**\n     * This method returns `true`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.13.0\n     * @category Util\n     * @returns {boolean} Returns `true`.\n     * @example\n     *\n     * _.times(2, _.stubTrue);\n     * // => [true, true]\n     */\n    function stubTrue() {\n      return true;\n    }\n\n    /**\n     * Invokes the iteratee `n` times, returning an array of the results of\n     * each invocation. The iteratee is invoked with one argument; (index).\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {number} n The number of times to invoke `iteratee`.\n     * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n     * @returns {Array} Returns the array of results.\n     * @example\n     *\n     * _.times(3, String);\n     * // => ['0', '1', '2']\n     *\n     *  _.times(4, _.constant(0));\n     * // => [0, 0, 0, 0]\n     */\n    function times(n, iteratee) {\n      n = toInteger(n);\n      if (n < 1 || n > MAX_SAFE_INTEGER) {\n        return [];\n      }\n      var index = MAX_ARRAY_LENGTH,\n          length = nativeMin(n, MAX_ARRAY_LENGTH);\n\n      iteratee = getIteratee(iteratee);\n      n -= MAX_ARRAY_LENGTH;\n\n      var result = baseTimes(length, iteratee);\n      while (++index < n) {\n        iteratee(index);\n      }\n      return result;\n    }\n\n    /**\n     * Converts `value` to a property path array.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Util\n     * @param {*} value The value to convert.\n     * @returns {Array} Returns the new property path array.\n     * @example\n     *\n     * _.toPath('a.b.c');\n     * // => ['a', 'b', 'c']\n     *\n     * _.toPath('a[0].b.c');\n     * // => ['a', '0', 'b', 'c']\n     */\n    function toPath(value) {\n      if (isArray(value)) {\n        return arrayMap(value, toKey);\n      }\n      return isSymbol(value) ? [value] : copyArray(stringToPath(toString(value)));\n    }\n\n    /**\n     * Generates a unique ID. If `prefix` is given, the ID is appended to it.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Util\n     * @param {string} [prefix=''] The value to prefix the ID with.\n     * @returns {string} Returns the unique ID.\n     * @example\n     *\n     * _.uniqueId('contact_');\n     * // => 'contact_104'\n     *\n     * _.uniqueId();\n     * // => '105'\n     */\n    function uniqueId(prefix) {\n      var id = ++idCounter;\n      return toString(prefix) + id;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * Adds two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {number} augend The first number in an addition.\n     * @param {number} addend The second number in an addition.\n     * @returns {number} Returns the total.\n     * @example\n     *\n     * _.add(6, 4);\n     * // => 10\n     */\n    var add = createMathOperation(function(augend, addend) {\n      return augend + addend;\n    }, 0);\n\n    /**\n     * Computes `number` rounded up to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round up.\n     * @param {number} [precision=0] The precision to round up to.\n     * @returns {number} Returns the rounded up number.\n     * @example\n     *\n     * _.ceil(4.006);\n     * // => 5\n     *\n     * _.ceil(6.004, 2);\n     * // => 6.01\n     *\n     * _.ceil(6040, -2);\n     * // => 6100\n     */\n    var ceil = createRound('ceil');\n\n    /**\n     * Divide two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} dividend The first number in a division.\n     * @param {number} divisor The second number in a division.\n     * @returns {number} Returns the quotient.\n     * @example\n     *\n     * _.divide(6, 4);\n     * // => 1.5\n     */\n    var divide = createMathOperation(function(dividend, divisor) {\n      return dividend / divisor;\n    }, 1);\n\n    /**\n     * Computes `number` rounded down to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round down.\n     * @param {number} [precision=0] The precision to round down to.\n     * @returns {number} Returns the rounded down number.\n     * @example\n     *\n     * _.floor(4.006);\n     * // => 4\n     *\n     * _.floor(0.046, 2);\n     * // => 0.04\n     *\n     * _.floor(4060, -2);\n     * // => 4000\n     */\n    var floor = createRound('floor');\n\n    /**\n     * Computes the maximum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * _.max([4, 2, 8, 6]);\n     * // => 8\n     *\n     * _.max([]);\n     * // => undefined\n     */\n    function max(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseGt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.max` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the maximum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.maxBy(objects, function(o) { return o.n; });\n     * // => { 'n': 2 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.maxBy(objects, 'n');\n     * // => { 'n': 2 }\n     */\n    function maxBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseGt)\n        : undefined;\n    }\n\n    /**\n     * Computes the mean of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * _.mean([4, 2, 8, 6]);\n     * // => 5\n     */\n    function mean(array) {\n      return baseMean(array, identity);\n    }\n\n    /**\n     * This method is like `_.mean` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be averaged.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the mean.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.meanBy(objects, function(o) { return o.n; });\n     * // => 5\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.meanBy(objects, 'n');\n     * // => 5\n     */\n    function meanBy(array, iteratee) {\n      return baseMean(array, getIteratee(iteratee, 2));\n    }\n\n    /**\n     * Computes the minimum value of `array`. If `array` is empty or falsey,\n     * `undefined` is returned.\n     *\n     * @static\n     * @since 0.1.0\n     * @memberOf _\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * _.min([4, 2, 8, 6]);\n     * // => 2\n     *\n     * _.min([]);\n     * // => undefined\n     */\n    function min(array) {\n      return (array && array.length)\n        ? baseExtremum(array, identity, baseLt)\n        : undefined;\n    }\n\n    /**\n     * This method is like `_.min` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the criterion by which\n     * the value is ranked. The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {*} Returns the minimum value.\n     * @example\n     *\n     * var objects = [{ 'n': 1 }, { 'n': 2 }];\n     *\n     * _.minBy(objects, function(o) { return o.n; });\n     * // => { 'n': 1 }\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.minBy(objects, 'n');\n     * // => { 'n': 1 }\n     */\n    function minBy(array, iteratee) {\n      return (array && array.length)\n        ? baseExtremum(array, getIteratee(iteratee, 2), baseLt)\n        : undefined;\n    }\n\n    /**\n     * Multiply two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.7.0\n     * @category Math\n     * @param {number} multiplier The first number in a multiplication.\n     * @param {number} multiplicand The second number in a multiplication.\n     * @returns {number} Returns the product.\n     * @example\n     *\n     * _.multiply(6, 4);\n     * // => 24\n     */\n    var multiply = createMathOperation(function(multiplier, multiplicand) {\n      return multiplier * multiplicand;\n    }, 1);\n\n    /**\n     * Computes `number` rounded to `precision`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.10.0\n     * @category Math\n     * @param {number} number The number to round.\n     * @param {number} [precision=0] The precision to round to.\n     * @returns {number} Returns the rounded number.\n     * @example\n     *\n     * _.round(4.006);\n     * // => 4\n     *\n     * _.round(4.006, 2);\n     * // => 4.01\n     *\n     * _.round(4060, -2);\n     * // => 4100\n     */\n    var round = createRound('round');\n\n    /**\n     * Subtract two numbers.\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {number} minuend The first number in a subtraction.\n     * @param {number} subtrahend The second number in a subtraction.\n     * @returns {number} Returns the difference.\n     * @example\n     *\n     * _.subtract(6, 4);\n     * // => 2\n     */\n    var subtract = createMathOperation(function(minuend, subtrahend) {\n      return minuend - subtrahend;\n    }, 0);\n\n    /**\n     * Computes the sum of the values in `array`.\n     *\n     * @static\n     * @memberOf _\n     * @since 3.4.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * _.sum([4, 2, 8, 6]);\n     * // => 20\n     */\n    function sum(array) {\n      return (array && array.length)\n        ? baseSum(array, identity)\n        : 0;\n    }\n\n    /**\n     * This method is like `_.sum` except that it accepts `iteratee` which is\n     * invoked for each element in `array` to generate the value to be summed.\n     * The iteratee is invoked with one argument: (value).\n     *\n     * @static\n     * @memberOf _\n     * @since 4.0.0\n     * @category Math\n     * @param {Array} array The array to iterate over.\n     * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n     * @returns {number} Returns the sum.\n     * @example\n     *\n     * var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];\n     *\n     * _.sumBy(objects, function(o) { return o.n; });\n     * // => 20\n     *\n     * // The `_.property` iteratee shorthand.\n     * _.sumBy(objects, 'n');\n     * // => 20\n     */\n    function sumBy(array, iteratee) {\n      return (array && array.length)\n        ? baseSum(array, getIteratee(iteratee, 2))\n        : 0;\n    }\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return wrapped values in chain sequences.\n    lodash.after = after;\n    lodash.ary = ary;\n    lodash.assign = assign;\n    lodash.assignIn = assignIn;\n    lodash.assignInWith = assignInWith;\n    lodash.assignWith = assignWith;\n    lodash.at = at;\n    lodash.before = before;\n    lodash.bind = bind;\n    lodash.bindAll = bindAll;\n    lodash.bindKey = bindKey;\n    lodash.castArray = castArray;\n    lodash.chain = chain;\n    lodash.chunk = chunk;\n    lodash.compact = compact;\n    lodash.concat = concat;\n    lodash.cond = cond;\n    lodash.conforms = conforms;\n    lodash.constant = constant;\n    lodash.countBy = countBy;\n    lodash.create = create;\n    lodash.curry = curry;\n    lodash.curryRight = curryRight;\n    lodash.debounce = debounce;\n    lodash.defaults = defaults;\n    lodash.defaultsDeep = defaultsDeep;\n    lodash.defer = defer;\n    lodash.delay = delay;\n    lodash.difference = difference;\n    lodash.differenceBy = differenceBy;\n    lodash.differenceWith = differenceWith;\n    lodash.drop = drop;\n    lodash.dropRight = dropRight;\n    lodash.dropRightWhile = dropRightWhile;\n    lodash.dropWhile = dropWhile;\n    lodash.fill = fill;\n    lodash.filter = filter;\n    lodash.flatMap = flatMap;\n    lodash.flatMapDeep = flatMapDeep;\n    lodash.flatMapDepth = flatMapDepth;\n    lodash.flatten = flatten;\n    lodash.flattenDeep = flattenDeep;\n    lodash.flattenDepth = flattenDepth;\n    lodash.flip = flip;\n    lodash.flow = flow;\n    lodash.flowRight = flowRight;\n    lodash.fromPairs = fromPairs;\n    lodash.functions = functions;\n    lodash.functionsIn = functionsIn;\n    lodash.groupBy = groupBy;\n    lodash.initial = initial;\n    lodash.intersection = intersection;\n    lodash.intersectionBy = intersectionBy;\n    lodash.intersectionWith = intersectionWith;\n    lodash.invert = invert;\n    lodash.invertBy = invertBy;\n    lodash.invokeMap = invokeMap;\n    lodash.iteratee = iteratee;\n    lodash.keyBy = keyBy;\n    lodash.keys = keys;\n    lodash.keysIn = keysIn;\n    lodash.map = map;\n    lodash.mapKeys = mapKeys;\n    lodash.mapValues = mapValues;\n    lodash.matches = matches;\n    lodash.matchesProperty = matchesProperty;\n    lodash.memoize = memoize;\n    lodash.merge = merge;\n    lodash.mergeWith = mergeWith;\n    lodash.method = method;\n    lodash.methodOf = methodOf;\n    lodash.mixin = mixin;\n    lodash.negate = negate;\n    lodash.nthArg = nthArg;\n    lodash.omit = omit;\n    lodash.omitBy = omitBy;\n    lodash.once = once;\n    lodash.orderBy = orderBy;\n    lodash.over = over;\n    lodash.overArgs = overArgs;\n    lodash.overEvery = overEvery;\n    lodash.overSome = overSome;\n    lodash.partial = partial;\n    lodash.partialRight = partialRight;\n    lodash.partition = partition;\n    lodash.pick = pick;\n    lodash.pickBy = pickBy;\n    lodash.property = property;\n    lodash.propertyOf = propertyOf;\n    lodash.pull = pull;\n    lodash.pullAll = pullAll;\n    lodash.pullAllBy = pullAllBy;\n    lodash.pullAllWith = pullAllWith;\n    lodash.pullAt = pullAt;\n    lodash.range = range;\n    lodash.rangeRight = rangeRight;\n    lodash.rearg = rearg;\n    lodash.reject = reject;\n    lodash.remove = remove;\n    lodash.rest = rest;\n    lodash.reverse = reverse;\n    lodash.sampleSize = sampleSize;\n    lodash.set = set;\n    lodash.setWith = setWith;\n    lodash.shuffle = shuffle;\n    lodash.slice = slice;\n    lodash.sortBy = sortBy;\n    lodash.sortedUniq = sortedUniq;\n    lodash.sortedUniqBy = sortedUniqBy;\n    lodash.split = split;\n    lodash.spread = spread;\n    lodash.tail = tail;\n    lodash.take = take;\n    lodash.takeRight = takeRight;\n    lodash.takeRightWhile = takeRightWhile;\n    lodash.takeWhile = takeWhile;\n    lodash.tap = tap;\n    lodash.throttle = throttle;\n    lodash.thru = thru;\n    lodash.toArray = toArray;\n    lodash.toPairs = toPairs;\n    lodash.toPairsIn = toPairsIn;\n    lodash.toPath = toPath;\n    lodash.toPlainObject = toPlainObject;\n    lodash.transform = transform;\n    lodash.unary = unary;\n    lodash.union = union;\n    lodash.unionBy = unionBy;\n    lodash.unionWith = unionWith;\n    lodash.uniq = uniq;\n    lodash.uniqBy = uniqBy;\n    lodash.uniqWith = uniqWith;\n    lodash.unset = unset;\n    lodash.unzip = unzip;\n    lodash.unzipWith = unzipWith;\n    lodash.update = update;\n    lodash.updateWith = updateWith;\n    lodash.values = values;\n    lodash.valuesIn = valuesIn;\n    lodash.without = without;\n    lodash.words = words;\n    lodash.wrap = wrap;\n    lodash.xor = xor;\n    lodash.xorBy = xorBy;\n    lodash.xorWith = xorWith;\n    lodash.zip = zip;\n    lodash.zipObject = zipObject;\n    lodash.zipObjectDeep = zipObjectDeep;\n    lodash.zipWith = zipWith;\n\n    // Add aliases.\n    lodash.entries = toPairs;\n    lodash.entriesIn = toPairsIn;\n    lodash.extend = assignIn;\n    lodash.extendWith = assignInWith;\n\n    // Add methods to `lodash.prototype`.\n    mixin(lodash, lodash);\n\n    /*------------------------------------------------------------------------*/\n\n    // Add methods that return unwrapped values in chain sequences.\n    lodash.add = add;\n    lodash.attempt = attempt;\n    lodash.camelCase = camelCase;\n    lodash.capitalize = capitalize;\n    lodash.ceil = ceil;\n    lodash.clamp = clamp;\n    lodash.clone = clone;\n    lodash.cloneDeep = cloneDeep;\n    lodash.cloneDeepWith = cloneDeepWith;\n    lodash.cloneWith = cloneWith;\n    lodash.conformsTo = conformsTo;\n    lodash.deburr = deburr;\n    lodash.defaultTo = defaultTo;\n    lodash.divide = divide;\n    lodash.endsWith = endsWith;\n    lodash.eq = eq;\n    lodash.escape = escape;\n    lodash.escapeRegExp = escapeRegExp;\n    lodash.every = every;\n    lodash.find = find;\n    lodash.findIndex = findIndex;\n    lodash.findKey = findKey;\n    lodash.findLast = findLast;\n    lodash.findLastIndex = findLastIndex;\n    lodash.findLastKey = findLastKey;\n    lodash.floor = floor;\n    lodash.forEach = forEach;\n    lodash.forEachRight = forEachRight;\n    lodash.forIn = forIn;\n    lodash.forInRight = forInRight;\n    lodash.forOwn = forOwn;\n    lodash.forOwnRight = forOwnRight;\n    lodash.get = get;\n    lodash.gt = gt;\n    lodash.gte = gte;\n    lodash.has = has;\n    lodash.hasIn = hasIn;\n    lodash.head = head;\n    lodash.identity = identity;\n    lodash.includes = includes;\n    lodash.indexOf = indexOf;\n    lodash.inRange = inRange;\n    lodash.invoke = invoke;\n    lodash.isArguments = isArguments;\n    lodash.isArray = isArray;\n    lodash.isArrayBuffer = isArrayBuffer;\n    lodash.isArrayLike = isArrayLike;\n    lodash.isArrayLikeObject = isArrayLikeObject;\n    lodash.isBoolean = isBoolean;\n    lodash.isBuffer = isBuffer;\n    lodash.isDate = isDate;\n    lodash.isElement = isElement;\n    lodash.isEmpty = isEmpty;\n    lodash.isEqual = isEqual;\n    lodash.isEqualWith = isEqualWith;\n    lodash.isError = isError;\n    lodash.isFinite = isFinite;\n    lodash.isFunction = isFunction;\n    lodash.isInteger = isInteger;\n    lodash.isLength = isLength;\n    lodash.isMap = isMap;\n    lodash.isMatch = isMatch;\n    lodash.isMatchWith = isMatchWith;\n    lodash.isNaN = isNaN;\n    lodash.isNative = isNative;\n    lodash.isNil = isNil;\n    lodash.isNull = isNull;\n    lodash.isNumber = isNumber;\n    lodash.isObject = isObject;\n    lodash.isObjectLike = isObjectLike;\n    lodash.isPlainObject = isPlainObject;\n    lodash.isRegExp = isRegExp;\n    lodash.isSafeInteger = isSafeInteger;\n    lodash.isSet = isSet;\n    lodash.isString = isString;\n    lodash.isSymbol = isSymbol;\n    lodash.isTypedArray = isTypedArray;\n    lodash.isUndefined = isUndefined;\n    lodash.isWeakMap = isWeakMap;\n    lodash.isWeakSet = isWeakSet;\n    lodash.join = join;\n    lodash.kebabCase = kebabCase;\n    lodash.last = last;\n    lodash.lastIndexOf = lastIndexOf;\n    lodash.lowerCase = lowerCase;\n    lodash.lowerFirst = lowerFirst;\n    lodash.lt = lt;\n    lodash.lte = lte;\n    lodash.max = max;\n    lodash.maxBy = maxBy;\n    lodash.mean = mean;\n    lodash.meanBy = meanBy;\n    lodash.min = min;\n    lodash.minBy = minBy;\n    lodash.stubArray = stubArray;\n    lodash.stubFalse = stubFalse;\n    lodash.stubObject = stubObject;\n    lodash.stubString = stubString;\n    lodash.stubTrue = stubTrue;\n    lodash.multiply = multiply;\n    lodash.nth = nth;\n    lodash.noConflict = noConflict;\n    lodash.noop = noop;\n    lodash.now = now;\n    lodash.pad = pad;\n    lodash.padEnd = padEnd;\n    lodash.padStart = padStart;\n    lodash.parseInt = parseInt;\n    lodash.random = random;\n    lodash.reduce = reduce;\n    lodash.reduceRight = reduceRight;\n    lodash.repeat = repeat;\n    lodash.replace = replace;\n    lodash.result = result;\n    lodash.round = round;\n    lodash.runInContext = runInContext;\n    lodash.sample = sample;\n    lodash.size = size;\n    lodash.snakeCase = snakeCase;\n    lodash.some = some;\n    lodash.sortedIndex = sortedIndex;\n    lodash.sortedIndexBy = sortedIndexBy;\n    lodash.sortedIndexOf = sortedIndexOf;\n    lodash.sortedLastIndex = sortedLastIndex;\n    lodash.sortedLastIndexBy = sortedLastIndexBy;\n    lodash.sortedLastIndexOf = sortedLastIndexOf;\n    lodash.startCase = startCase;\n    lodash.startsWith = startsWith;\n    lodash.subtract = subtract;\n    lodash.sum = sum;\n    lodash.sumBy = sumBy;\n    lodash.template = template;\n    lodash.times = times;\n    lodash.toFinite = toFinite;\n    lodash.toInteger = toInteger;\n    lodash.toLength = toLength;\n    lodash.toLower = toLower;\n    lodash.toNumber = toNumber;\n    lodash.toSafeInteger = toSafeInteger;\n    lodash.toString = toString;\n    lodash.toUpper = toUpper;\n    lodash.trim = trim;\n    lodash.trimEnd = trimEnd;\n    lodash.trimStart = trimStart;\n    lodash.truncate = truncate;\n    lodash.unescape = unescape;\n    lodash.uniqueId = uniqueId;\n    lodash.upperCase = upperCase;\n    lodash.upperFirst = upperFirst;\n\n    // Add aliases.\n    lodash.each = forEach;\n    lodash.eachRight = forEachRight;\n    lodash.first = head;\n\n    mixin(lodash, (function() {\n      var source = {};\n      baseForOwn(lodash, function(func, methodName) {\n        if (!hasOwnProperty.call(lodash.prototype, methodName)) {\n          source[methodName] = func;\n        }\n      });\n      return source;\n    }()), { 'chain': false });\n\n    /*------------------------------------------------------------------------*/\n\n    /**\n     * The semantic version number.\n     *\n     * @static\n     * @memberOf _\n     * @type {string}\n     */\n    lodash.VERSION = VERSION;\n\n    // Assign default placeholders.\n    arrayEach(['bind', 'bindKey', 'curry', 'curryRight', 'partial', 'partialRight'], function(methodName) {\n      lodash[methodName].placeholder = lodash;\n    });\n\n    // Add `LazyWrapper` methods for `_.drop` and `_.take` variants.\n    arrayEach(['drop', 'take'], function(methodName, index) {\n      LazyWrapper.prototype[methodName] = function(n) {\n        n = n === undefined ? 1 : nativeMax(toInteger(n), 0);\n\n        var result = (this.__filtered__ && !index)\n          ? new LazyWrapper(this)\n          : this.clone();\n\n        if (result.__filtered__) {\n          result.__takeCount__ = nativeMin(n, result.__takeCount__);\n        } else {\n          result.__views__.push({\n            'size': nativeMin(n, MAX_ARRAY_LENGTH),\n            'type': methodName + (result.__dir__ < 0 ? 'Right' : '')\n          });\n        }\n        return result;\n      };\n\n      LazyWrapper.prototype[methodName + 'Right'] = function(n) {\n        return this.reverse()[methodName](n).reverse();\n      };\n    });\n\n    // Add `LazyWrapper` methods that accept an `iteratee` value.\n    arrayEach(['filter', 'map', 'takeWhile'], function(methodName, index) {\n      var type = index + 1,\n          isFilter = type == LAZY_FILTER_FLAG || type == LAZY_WHILE_FLAG;\n\n      LazyWrapper.prototype[methodName] = function(iteratee) {\n        var result = this.clone();\n        result.__iteratees__.push({\n          'iteratee': getIteratee(iteratee, 3),\n          'type': type\n        });\n        result.__filtered__ = result.__filtered__ || isFilter;\n        return result;\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.head` and `_.last`.\n    arrayEach(['head', 'last'], function(methodName, index) {\n      var takeName = 'take' + (index ? 'Right' : '');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this[takeName](1).value()[0];\n      };\n    });\n\n    // Add `LazyWrapper` methods for `_.initial` and `_.tail`.\n    arrayEach(['initial', 'tail'], function(methodName, index) {\n      var dropName = 'drop' + (index ? '' : 'Right');\n\n      LazyWrapper.prototype[methodName] = function() {\n        return this.__filtered__ ? new LazyWrapper(this) : this[dropName](1);\n      };\n    });\n\n    LazyWrapper.prototype.compact = function() {\n      return this.filter(identity);\n    };\n\n    LazyWrapper.prototype.find = function(predicate) {\n      return this.filter(predicate).head();\n    };\n\n    LazyWrapper.prototype.findLast = function(predicate) {\n      return this.reverse().find(predicate);\n    };\n\n    LazyWrapper.prototype.invokeMap = baseRest(function(path, args) {\n      if (typeof path == 'function') {\n        return new LazyWrapper(this);\n      }\n      return this.map(function(value) {\n        return baseInvoke(value, path, args);\n      });\n    });\n\n    LazyWrapper.prototype.reject = function(predicate) {\n      return this.filter(negate(getIteratee(predicate)));\n    };\n\n    LazyWrapper.prototype.slice = function(start, end) {\n      start = toInteger(start);\n\n      var result = this;\n      if (result.__filtered__ && (start > 0 || end < 0)) {\n        return new LazyWrapper(result);\n      }\n      if (start < 0) {\n        result = result.takeRight(-start);\n      } else if (start) {\n        result = result.drop(start);\n      }\n      if (end !== undefined) {\n        end = toInteger(end);\n        result = end < 0 ? result.dropRight(-end) : result.take(end - start);\n      }\n      return result;\n    };\n\n    LazyWrapper.prototype.takeRightWhile = function(predicate) {\n      return this.reverse().takeWhile(predicate).reverse();\n    };\n\n    LazyWrapper.prototype.toArray = function() {\n      return this.take(MAX_ARRAY_LENGTH);\n    };\n\n    // Add `LazyWrapper` methods to `lodash.prototype`.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var checkIteratee = /^(?:filter|find|map|reject)|While$/.test(methodName),\n          isTaker = /^(?:head|last)$/.test(methodName),\n          lodashFunc = lodash[isTaker ? ('take' + (methodName == 'last' ? 'Right' : '')) : methodName],\n          retUnwrapped = isTaker || /^find/.test(methodName);\n\n      if (!lodashFunc) {\n        return;\n      }\n      lodash.prototype[methodName] = function() {\n        var value = this.__wrapped__,\n            args = isTaker ? [1] : arguments,\n            isLazy = value instanceof LazyWrapper,\n            iteratee = args[0],\n            useLazy = isLazy || isArray(value);\n\n        var interceptor = function(value) {\n          var result = lodashFunc.apply(lodash, arrayPush([value], args));\n          return (isTaker && chainAll) ? result[0] : result;\n        };\n\n        if (useLazy && checkIteratee && typeof iteratee == 'function' && iteratee.length != 1) {\n          // Avoid lazy use if the iteratee has a \"length\" value other than `1`.\n          isLazy = useLazy = false;\n        }\n        var chainAll = this.__chain__,\n            isHybrid = !!this.__actions__.length,\n            isUnwrapped = retUnwrapped && !chainAll,\n            onlyLazy = isLazy && !isHybrid;\n\n        if (!retUnwrapped && useLazy) {\n          value = onlyLazy ? value : new LazyWrapper(this);\n          var result = func.apply(value, args);\n          result.__actions__.push({ 'func': thru, 'args': [interceptor], 'thisArg': undefined });\n          return new LodashWrapper(result, chainAll);\n        }\n        if (isUnwrapped && onlyLazy) {\n          return func.apply(this, args);\n        }\n        result = this.thru(interceptor);\n        return isUnwrapped ? (isTaker ? result.value()[0] : result.value()) : result;\n      };\n    });\n\n    // Add `Array` methods to `lodash.prototype`.\n    arrayEach(['pop', 'push', 'shift', 'sort', 'splice', 'unshift'], function(methodName) {\n      var func = arrayProto[methodName],\n          chainName = /^(?:push|sort|unshift)$/.test(methodName) ? 'tap' : 'thru',\n          retUnwrapped = /^(?:pop|shift)$/.test(methodName);\n\n      lodash.prototype[methodName] = function() {\n        var args = arguments;\n        if (retUnwrapped && !this.__chain__) {\n          var value = this.value();\n          return func.apply(isArray(value) ? value : [], args);\n        }\n        return this[chainName](function(value) {\n          return func.apply(isArray(value) ? value : [], args);\n        });\n      };\n    });\n\n    // Map minified method names to their real names.\n    baseForOwn(LazyWrapper.prototype, function(func, methodName) {\n      var lodashFunc = lodash[methodName];\n      if (lodashFunc) {\n        var key = lodashFunc.name + '';\n        if (!hasOwnProperty.call(realNames, key)) {\n          realNames[key] = [];\n        }\n        realNames[key].push({ 'name': methodName, 'func': lodashFunc });\n      }\n    });\n\n    realNames[createHybrid(undefined, WRAP_BIND_KEY_FLAG).name] = [{\n      'name': 'wrapper',\n      'func': undefined\n    }];\n\n    // Add methods to `LazyWrapper`.\n    LazyWrapper.prototype.clone = lazyClone;\n    LazyWrapper.prototype.reverse = lazyReverse;\n    LazyWrapper.prototype.value = lazyValue;\n\n    // Add chain sequence methods to the `lodash` wrapper.\n    lodash.prototype.at = wrapperAt;\n    lodash.prototype.chain = wrapperChain;\n    lodash.prototype.commit = wrapperCommit;\n    lodash.prototype.next = wrapperNext;\n    lodash.prototype.plant = wrapperPlant;\n    lodash.prototype.reverse = wrapperReverse;\n    lodash.prototype.toJSON = lodash.prototype.valueOf = lodash.prototype.value = wrapperValue;\n\n    // Add lazy aliases.\n    lodash.prototype.first = lodash.prototype.head;\n\n    if (symIterator) {\n      lodash.prototype[symIterator] = wrapperToIterator;\n    }\n    return lodash;\n  });\n\n  /*--------------------------------------------------------------------------*/\n\n  // Export lodash.\n  var _ = runInContext();\n\n  // Some AMD build optimizers, like r.js, check for condition patterns like:\n  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {\n    // Expose Lodash on the global object to prevent errors when Lodash is\n    // loaded by a script tag in the presence of an AMD loader.\n    // See http://requirejs.org/docs/errors.html#mismatch for more details.\n    // Use `_.noConflict` to remove Lodash from the global object.\n    root._ = _;\n\n    // Define as an anonymous module so, through path mapping, it can be\n    // referenced as the \"underscore\" module.\n    define(function() {\n      return _;\n    });\n  }\n  // Check for `exports` after `define` in case a build optimizer adds it.\n  else if (freeModule) {\n    // Export for Node.js.\n    (freeModule.exports = _)._ = _;\n    // Export for CommonJS support.\n    freeExports._ = _;\n  }\n  else {\n    // Export to the global object.\n    root._ = _;\n  }\n}.call(this));\n", "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"jsQR\"] = factory();\n\telse\n\t\troot[\"jsQR\"] = factory();\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 3);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar BitMatrix = /** @class */ (function () {\n    function BitMatrix(data, width) {\n        this.width = width;\n        this.height = data.length / width;\n        this.data = data;\n    }\n    BitMatrix.createEmpty = function (width, height) {\n        return new BitMatrix(new Uint8ClampedArray(width * height), width);\n    };\n    BitMatrix.prototype.get = function (x, y) {\n        if (x < 0 || x >= this.width || y < 0 || y >= this.height) {\n            return false;\n        }\n        return !!this.data[y * this.width + x];\n    };\n    BitMatrix.prototype.set = function (x, y, v) {\n        this.data[y * this.width + x] = v ? 1 : 0;\n    };\n    BitMatrix.prototype.setRegion = function (left, top, width, height, v) {\n        for (var y = top; y < top + height; y++) {\n            for (var x = left; x < left + width; x++) {\n                this.set(x, y, !!v);\n            }\n        }\n    };\n    return BitMatrix;\n}());\nexports.BitMatrix = BitMatrix;\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar GenericGFPoly_1 = __webpack_require__(2);\nfunction addOrSubtractGF(a, b) {\n    return a ^ b; // tslint:disable-line:no-bitwise\n}\nexports.addOrSubtractGF = addOrSubtractGF;\nvar GenericGF = /** @class */ (function () {\n    function GenericGF(primitive, size, genBase) {\n        this.primitive = primitive;\n        this.size = size;\n        this.generatorBase = genBase;\n        this.expTable = new Array(this.size);\n        this.logTable = new Array(this.size);\n        var x = 1;\n        for (var i = 0; i < this.size; i++) {\n            this.expTable[i] = x;\n            x = x * 2;\n            if (x >= this.size) {\n                x = (x ^ this.primitive) & (this.size - 1); // tslint:disable-line:no-bitwise\n            }\n        }\n        for (var i = 0; i < this.size - 1; i++) {\n            this.logTable[this.expTable[i]] = i;\n        }\n        this.zero = new GenericGFPoly_1.default(this, Uint8ClampedArray.from([0]));\n        this.one = new GenericGFPoly_1.default(this, Uint8ClampedArray.from([1]));\n    }\n    GenericGF.prototype.multiply = function (a, b) {\n        if (a === 0 || b === 0) {\n            return 0;\n        }\n        return this.expTable[(this.logTable[a] + this.logTable[b]) % (this.size - 1)];\n    };\n    GenericGF.prototype.inverse = function (a) {\n        if (a === 0) {\n            throw new Error(\"Can't invert 0\");\n        }\n        return this.expTable[this.size - this.logTable[a] - 1];\n    };\n    GenericGF.prototype.buildMonomial = function (degree, coefficient) {\n        if (degree < 0) {\n            throw new Error(\"Invalid monomial degree less than 0\");\n        }\n        if (coefficient === 0) {\n            return this.zero;\n        }\n        var coefficients = new Uint8ClampedArray(degree + 1);\n        coefficients[0] = coefficient;\n        return new GenericGFPoly_1.default(this, coefficients);\n    };\n    GenericGF.prototype.log = function (a) {\n        if (a === 0) {\n            throw new Error(\"Can't take log(0)\");\n        }\n        return this.logTable[a];\n    };\n    GenericGF.prototype.exp = function (a) {\n        return this.expTable[a];\n    };\n    return GenericGF;\n}());\nexports.default = GenericGF;\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar GenericGF_1 = __webpack_require__(1);\nvar GenericGFPoly = /** @class */ (function () {\n    function GenericGFPoly(field, coefficients) {\n        if (coefficients.length === 0) {\n            throw new Error(\"No coefficients.\");\n        }\n        this.field = field;\n        var coefficientsLength = coefficients.length;\n        if (coefficientsLength > 1 && coefficients[0] === 0) {\n            // Leading term must be non-zero for anything except the constant polynomial \"0\"\n            var firstNonZero = 1;\n            while (firstNonZero < coefficientsLength && coefficients[firstNonZero] === 0) {\n                firstNonZero++;\n            }\n            if (firstNonZero === coefficientsLength) {\n                this.coefficients = field.zero.coefficients;\n            }\n            else {\n                this.coefficients = new Uint8ClampedArray(coefficientsLength - firstNonZero);\n                for (var i = 0; i < this.coefficients.length; i++) {\n                    this.coefficients[i] = coefficients[firstNonZero + i];\n                }\n            }\n        }\n        else {\n            this.coefficients = coefficients;\n        }\n    }\n    GenericGFPoly.prototype.degree = function () {\n        return this.coefficients.length - 1;\n    };\n    GenericGFPoly.prototype.isZero = function () {\n        return this.coefficients[0] === 0;\n    };\n    GenericGFPoly.prototype.getCoefficient = function (degree) {\n        return this.coefficients[this.coefficients.length - 1 - degree];\n    };\n    GenericGFPoly.prototype.addOrSubtract = function (other) {\n        var _a;\n        if (this.isZero()) {\n            return other;\n        }\n        if (other.isZero()) {\n            return this;\n        }\n        var smallerCoefficients = this.coefficients;\n        var largerCoefficients = other.coefficients;\n        if (smallerCoefficients.length > largerCoefficients.length) {\n            _a = [largerCoefficients, smallerCoefficients], smallerCoefficients = _a[0], largerCoefficients = _a[1];\n        }\n        var sumDiff = new Uint8ClampedArray(largerCoefficients.length);\n        var lengthDiff = largerCoefficients.length - smallerCoefficients.length;\n        for (var i = 0; i < lengthDiff; i++) {\n            sumDiff[i] = largerCoefficients[i];\n        }\n        for (var i = lengthDiff; i < largerCoefficients.length; i++) {\n            sumDiff[i] = GenericGF_1.addOrSubtractGF(smallerCoefficients[i - lengthDiff], largerCoefficients[i]);\n        }\n        return new GenericGFPoly(this.field, sumDiff);\n    };\n    GenericGFPoly.prototype.multiply = function (scalar) {\n        if (scalar === 0) {\n            return this.field.zero;\n        }\n        if (scalar === 1) {\n            return this;\n        }\n        var size = this.coefficients.length;\n        var product = new Uint8ClampedArray(size);\n        for (var i = 0; i < size; i++) {\n            product[i] = this.field.multiply(this.coefficients[i], scalar);\n        }\n        return new GenericGFPoly(this.field, product);\n    };\n    GenericGFPoly.prototype.multiplyPoly = function (other) {\n        if (this.isZero() || other.isZero()) {\n            return this.field.zero;\n        }\n        var aCoefficients = this.coefficients;\n        var aLength = aCoefficients.length;\n        var bCoefficients = other.coefficients;\n        var bLength = bCoefficients.length;\n        var product = new Uint8ClampedArray(aLength + bLength - 1);\n        for (var i = 0; i < aLength; i++) {\n            var aCoeff = aCoefficients[i];\n            for (var j = 0; j < bLength; j++) {\n                product[i + j] = GenericGF_1.addOrSubtractGF(product[i + j], this.field.multiply(aCoeff, bCoefficients[j]));\n            }\n        }\n        return new GenericGFPoly(this.field, product);\n    };\n    GenericGFPoly.prototype.multiplyByMonomial = function (degree, coefficient) {\n        if (degree < 0) {\n            throw new Error(\"Invalid degree less than 0\");\n        }\n        if (coefficient === 0) {\n            return this.field.zero;\n        }\n        var size = this.coefficients.length;\n        var product = new Uint8ClampedArray(size + degree);\n        for (var i = 0; i < size; i++) {\n            product[i] = this.field.multiply(this.coefficients[i], coefficient);\n        }\n        return new GenericGFPoly(this.field, product);\n    };\n    GenericGFPoly.prototype.evaluateAt = function (a) {\n        var result = 0;\n        if (a === 0) {\n            // Just return the x^0 coefficient\n            return this.getCoefficient(0);\n        }\n        var size = this.coefficients.length;\n        if (a === 1) {\n            // Just the sum of the coefficients\n            this.coefficients.forEach(function (coefficient) {\n                result = GenericGF_1.addOrSubtractGF(result, coefficient);\n            });\n            return result;\n        }\n        result = this.coefficients[0];\n        for (var i = 1; i < size; i++) {\n            result = GenericGF_1.addOrSubtractGF(this.field.multiply(a, result), this.coefficients[i]);\n        }\n        return result;\n    };\n    return GenericGFPoly;\n}());\nexports.default = GenericGFPoly;\n\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar binarizer_1 = __webpack_require__(4);\nvar decoder_1 = __webpack_require__(5);\nvar extractor_1 = __webpack_require__(11);\nvar locator_1 = __webpack_require__(12);\nfunction scan(matrix) {\n    var locations = locator_1.locate(matrix);\n    if (!locations) {\n        return null;\n    }\n    for (var _i = 0, locations_1 = locations; _i < locations_1.length; _i++) {\n        var location_1 = locations_1[_i];\n        var extracted = extractor_1.extract(matrix, location_1);\n        var decoded = decoder_1.decode(extracted.matrix);\n        if (decoded) {\n            return {\n                binaryData: decoded.bytes,\n                data: decoded.text,\n                chunks: decoded.chunks,\n                version: decoded.version,\n                location: {\n                    topRightCorner: extracted.mappingFunction(location_1.dimension, 0),\n                    topLeftCorner: extracted.mappingFunction(0, 0),\n                    bottomRightCorner: extracted.mappingFunction(location_1.dimension, location_1.dimension),\n                    bottomLeftCorner: extracted.mappingFunction(0, location_1.dimension),\n                    topRightFinderPattern: location_1.topRight,\n                    topLeftFinderPattern: location_1.topLeft,\n                    bottomLeftFinderPattern: location_1.bottomLeft,\n                    bottomRightAlignmentPattern: location_1.alignmentPattern,\n                },\n            };\n        }\n    }\n    return null;\n}\nvar defaultOptions = {\n    inversionAttempts: \"attemptBoth\",\n};\nfunction jsQR(data, width, height, providedOptions) {\n    if (providedOptions === void 0) { providedOptions = {}; }\n    var options = defaultOptions;\n    Object.keys(options || {}).forEach(function (opt) {\n        options[opt] = providedOptions[opt] || options[opt];\n    });\n    var shouldInvert = options.inversionAttempts === \"attemptBoth\" || options.inversionAttempts === \"invertFirst\";\n    var tryInvertedFirst = options.inversionAttempts === \"onlyInvert\" || options.inversionAttempts === \"invertFirst\";\n    var _a = binarizer_1.binarize(data, width, height, shouldInvert), binarized = _a.binarized, inverted = _a.inverted;\n    var result = scan(tryInvertedFirst ? inverted : binarized);\n    if (!result && (options.inversionAttempts === \"attemptBoth\" || options.inversionAttempts === \"invertFirst\")) {\n        result = scan(tryInvertedFirst ? binarized : inverted);\n    }\n    return result;\n}\njsQR.default = jsQR;\nexports.default = jsQR;\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar BitMatrix_1 = __webpack_require__(0);\nvar REGION_SIZE = 8;\nvar MIN_DYNAMIC_RANGE = 24;\nfunction numBetween(value, min, max) {\n    return value < min ? min : value > max ? max : value;\n}\n// Like BitMatrix but accepts arbitry Uint8 values\nvar Matrix = /** @class */ (function () {\n    function Matrix(width, height) {\n        this.width = width;\n        this.data = new Uint8ClampedArray(width * height);\n    }\n    Matrix.prototype.get = function (x, y) {\n        return this.data[y * this.width + x];\n    };\n    Matrix.prototype.set = function (x, y, value) {\n        this.data[y * this.width + x] = value;\n    };\n    return Matrix;\n}());\nfunction binarize(data, width, height, returnInverted) {\n    if (data.length !== width * height * 4) {\n        throw new Error(\"Malformed data passed to binarizer.\");\n    }\n    // Convert image to greyscale\n    var greyscalePixels = new Matrix(width, height);\n    for (var x = 0; x < width; x++) {\n        for (var y = 0; y < height; y++) {\n            var r = data[((y * width + x) * 4) + 0];\n            var g = data[((y * width + x) * 4) + 1];\n            var b = data[((y * width + x) * 4) + 2];\n            greyscalePixels.set(x, y, 0.2126 * r + 0.7152 * g + 0.0722 * b);\n        }\n    }\n    var horizontalRegionCount = Math.ceil(width / REGION_SIZE);\n    var verticalRegionCount = Math.ceil(height / REGION_SIZE);\n    var blackPoints = new Matrix(horizontalRegionCount, verticalRegionCount);\n    for (var verticalRegion = 0; verticalRegion < verticalRegionCount; verticalRegion++) {\n        for (var hortizontalRegion = 0; hortizontalRegion < horizontalRegionCount; hortizontalRegion++) {\n            var sum = 0;\n            var min = Infinity;\n            var max = 0;\n            for (var y = 0; y < REGION_SIZE; y++) {\n                for (var x = 0; x < REGION_SIZE; x++) {\n                    var pixelLumosity = greyscalePixels.get(hortizontalRegion * REGION_SIZE + x, verticalRegion * REGION_SIZE + y);\n                    sum += pixelLumosity;\n                    min = Math.min(min, pixelLumosity);\n                    max = Math.max(max, pixelLumosity);\n                }\n            }\n            var average = sum / (Math.pow(REGION_SIZE, 2));\n            if (max - min <= MIN_DYNAMIC_RANGE) {\n                // If variation within the block is low, assume this is a block with only light or only\n                // dark pixels. In that case we do not want to use the average, as it would divide this\n                // low contrast area into black and white pixels, essentially creating data out of noise.\n                //\n                // Default the blackpoint for these blocks to be half the min - effectively white them out\n                average = min / 2;\n                if (verticalRegion > 0 && hortizontalRegion > 0) {\n                    // Correct the \"white background\" assumption for blocks that have neighbors by comparing\n                    // the pixels in this block to the previously calculated black points. This is based on\n                    // the fact that dark barcode symbology is always surrounded by some amount of light\n                    // background for which reasonable black point estimates were made. The bp estimated at\n                    // the boundaries is used for the interior.\n                    // The (min < bp) is arbitrary but works better than other heuristics that were tried.\n                    var averageNeighborBlackPoint = (blackPoints.get(hortizontalRegion, verticalRegion - 1) +\n                        (2 * blackPoints.get(hortizontalRegion - 1, verticalRegion)) +\n                        blackPoints.get(hortizontalRegion - 1, verticalRegion - 1)) / 4;\n                    if (min < averageNeighborBlackPoint) {\n                        average = averageNeighborBlackPoint;\n                    }\n                }\n            }\n            blackPoints.set(hortizontalRegion, verticalRegion, average);\n        }\n    }\n    var binarized = BitMatrix_1.BitMatrix.createEmpty(width, height);\n    var inverted = null;\n    if (returnInverted) {\n        inverted = BitMatrix_1.BitMatrix.createEmpty(width, height);\n    }\n    for (var verticalRegion = 0; verticalRegion < verticalRegionCount; verticalRegion++) {\n        for (var hortizontalRegion = 0; hortizontalRegion < horizontalRegionCount; hortizontalRegion++) {\n            var left = numBetween(hortizontalRegion, 2, horizontalRegionCount - 3);\n            var top_1 = numBetween(verticalRegion, 2, verticalRegionCount - 3);\n            var sum = 0;\n            for (var xRegion = -2; xRegion <= 2; xRegion++) {\n                for (var yRegion = -2; yRegion <= 2; yRegion++) {\n                    sum += blackPoints.get(left + xRegion, top_1 + yRegion);\n                }\n            }\n            var threshold = sum / 25;\n            for (var xRegion = 0; xRegion < REGION_SIZE; xRegion++) {\n                for (var yRegion = 0; yRegion < REGION_SIZE; yRegion++) {\n                    var x = hortizontalRegion * REGION_SIZE + xRegion;\n                    var y = verticalRegion * REGION_SIZE + yRegion;\n                    var lum = greyscalePixels.get(x, y);\n                    binarized.set(x, y, lum <= threshold);\n                    if (returnInverted) {\n                        inverted.set(x, y, !(lum <= threshold));\n                    }\n                }\n            }\n        }\n    }\n    if (returnInverted) {\n        return { binarized: binarized, inverted: inverted };\n    }\n    return { binarized: binarized };\n}\nexports.binarize = binarize;\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar BitMatrix_1 = __webpack_require__(0);\nvar decodeData_1 = __webpack_require__(6);\nvar reedsolomon_1 = __webpack_require__(9);\nvar version_1 = __webpack_require__(10);\n// tslint:disable:no-bitwise\nfunction numBitsDiffering(x, y) {\n    var z = x ^ y;\n    var bitCount = 0;\n    while (z) {\n        bitCount++;\n        z &= z - 1;\n    }\n    return bitCount;\n}\nfunction pushBit(bit, byte) {\n    return (byte << 1) | bit;\n}\n// tslint:enable:no-bitwise\nvar FORMAT_INFO_TABLE = [\n    { bits: 0x5412, formatInfo: { errorCorrectionLevel: 1, dataMask: 0 } },\n    { bits: 0x5125, formatInfo: { errorCorrectionLevel: 1, dataMask: 1 } },\n    { bits: 0x5E7C, formatInfo: { errorCorrectionLevel: 1, dataMask: 2 } },\n    { bits: 0x5B4B, formatInfo: { errorCorrectionLevel: 1, dataMask: 3 } },\n    { bits: 0x45F9, formatInfo: { errorCorrectionLevel: 1, dataMask: 4 } },\n    { bits: 0x40CE, formatInfo: { errorCorrectionLevel: 1, dataMask: 5 } },\n    { bits: 0x4F97, formatInfo: { errorCorrectionLevel: 1, dataMask: 6 } },\n    { bits: 0x4AA0, formatInfo: { errorCorrectionLevel: 1, dataMask: 7 } },\n    { bits: 0x77C4, formatInfo: { errorCorrectionLevel: 0, dataMask: 0 } },\n    { bits: 0x72F3, formatInfo: { errorCorrectionLevel: 0, dataMask: 1 } },\n    { bits: 0x7DAA, formatInfo: { errorCorrectionLevel: 0, dataMask: 2 } },\n    { bits: 0x789D, formatInfo: { errorCorrectionLevel: 0, dataMask: 3 } },\n    { bits: 0x662F, formatInfo: { errorCorrectionLevel: 0, dataMask: 4 } },\n    { bits: 0x6318, formatInfo: { errorCorrectionLevel: 0, dataMask: 5 } },\n    { bits: 0x6C41, formatInfo: { errorCorrectionLevel: 0, dataMask: 6 } },\n    { bits: 0x6976, formatInfo: { errorCorrectionLevel: 0, dataMask: 7 } },\n    { bits: 0x1689, formatInfo: { errorCorrectionLevel: 3, dataMask: 0 } },\n    { bits: 0x13BE, formatInfo: { errorCorrectionLevel: 3, dataMask: 1 } },\n    { bits: 0x1CE7, formatInfo: { errorCorrectionLevel: 3, dataMask: 2 } },\n    { bits: 0x19D0, formatInfo: { errorCorrectionLevel: 3, dataMask: 3 } },\n    { bits: 0x0762, formatInfo: { errorCorrectionLevel: 3, dataMask: 4 } },\n    { bits: 0x0255, formatInfo: { errorCorrectionLevel: 3, dataMask: 5 } },\n    { bits: 0x0D0C, formatInfo: { errorCorrectionLevel: 3, dataMask: 6 } },\n    { bits: 0x083B, formatInfo: { errorCorrectionLevel: 3, dataMask: 7 } },\n    { bits: 0x355F, formatInfo: { errorCorrectionLevel: 2, dataMask: 0 } },\n    { bits: 0x3068, formatInfo: { errorCorrectionLevel: 2, dataMask: 1 } },\n    { bits: 0x3F31, formatInfo: { errorCorrectionLevel: 2, dataMask: 2 } },\n    { bits: 0x3A06, formatInfo: { errorCorrectionLevel: 2, dataMask: 3 } },\n    { bits: 0x24B4, formatInfo: { errorCorrectionLevel: 2, dataMask: 4 } },\n    { bits: 0x2183, formatInfo: { errorCorrectionLevel: 2, dataMask: 5 } },\n    { bits: 0x2EDA, formatInfo: { errorCorrectionLevel: 2, dataMask: 6 } },\n    { bits: 0x2BED, formatInfo: { errorCorrectionLevel: 2, dataMask: 7 } },\n];\nvar DATA_MASKS = [\n    function (p) { return ((p.y + p.x) % 2) === 0; },\n    function (p) { return (p.y % 2) === 0; },\n    function (p) { return p.x % 3 === 0; },\n    function (p) { return (p.y + p.x) % 3 === 0; },\n    function (p) { return (Math.floor(p.y / 2) + Math.floor(p.x / 3)) % 2 === 0; },\n    function (p) { return ((p.x * p.y) % 2) + ((p.x * p.y) % 3) === 0; },\n    function (p) { return ((((p.y * p.x) % 2) + (p.y * p.x) % 3) % 2) === 0; },\n    function (p) { return ((((p.y + p.x) % 2) + (p.y * p.x) % 3) % 2) === 0; },\n];\nfunction buildFunctionPatternMask(version) {\n    var dimension = 17 + 4 * version.versionNumber;\n    var matrix = BitMatrix_1.BitMatrix.createEmpty(dimension, dimension);\n    matrix.setRegion(0, 0, 9, 9, true); // Top left finder pattern + separator + format\n    matrix.setRegion(dimension - 8, 0, 8, 9, true); // Top right finder pattern + separator + format\n    matrix.setRegion(0, dimension - 8, 9, 8, true); // Bottom left finder pattern + separator + format\n    // Alignment patterns\n    for (var _i = 0, _a = version.alignmentPatternCenters; _i < _a.length; _i++) {\n        var x = _a[_i];\n        for (var _b = 0, _c = version.alignmentPatternCenters; _b < _c.length; _b++) {\n            var y = _c[_b];\n            if (!(x === 6 && y === 6 || x === 6 && y === dimension - 7 || x === dimension - 7 && y === 6)) {\n                matrix.setRegion(x - 2, y - 2, 5, 5, true);\n            }\n        }\n    }\n    matrix.setRegion(6, 9, 1, dimension - 17, true); // Vertical timing pattern\n    matrix.setRegion(9, 6, dimension - 17, 1, true); // Horizontal timing pattern\n    if (version.versionNumber > 6) {\n        matrix.setRegion(dimension - 11, 0, 3, 6, true); // Version info, top right\n        matrix.setRegion(0, dimension - 11, 6, 3, true); // Version info, bottom left\n    }\n    return matrix;\n}\nfunction readCodewords(matrix, version, formatInfo) {\n    var dataMask = DATA_MASKS[formatInfo.dataMask];\n    var dimension = matrix.height;\n    var functionPatternMask = buildFunctionPatternMask(version);\n    var codewords = [];\n    var currentByte = 0;\n    var bitsRead = 0;\n    // Read columns in pairs, from right to left\n    var readingUp = true;\n    for (var columnIndex = dimension - 1; columnIndex > 0; columnIndex -= 2) {\n        if (columnIndex === 6) { // Skip whole column with vertical alignment pattern;\n            columnIndex--;\n        }\n        for (var i = 0; i < dimension; i++) {\n            var y = readingUp ? dimension - 1 - i : i;\n            for (var columnOffset = 0; columnOffset < 2; columnOffset++) {\n                var x = columnIndex - columnOffset;\n                if (!functionPatternMask.get(x, y)) {\n                    bitsRead++;\n                    var bit = matrix.get(x, y);\n                    if (dataMask({ y: y, x: x })) {\n                        bit = !bit;\n                    }\n                    currentByte = pushBit(bit, currentByte);\n                    if (bitsRead === 8) { // Whole bytes\n                        codewords.push(currentByte);\n                        bitsRead = 0;\n                        currentByte = 0;\n                    }\n                }\n            }\n        }\n        readingUp = !readingUp;\n    }\n    return codewords;\n}\nfunction readVersion(matrix) {\n    var dimension = matrix.height;\n    var provisionalVersion = Math.floor((dimension - 17) / 4);\n    if (provisionalVersion <= 6) { // 6 and under dont have version info in the QR code\n        return version_1.VERSIONS[provisionalVersion - 1];\n    }\n    var topRightVersionBits = 0;\n    for (var y = 5; y >= 0; y--) {\n        for (var x = dimension - 9; x >= dimension - 11; x--) {\n            topRightVersionBits = pushBit(matrix.get(x, y), topRightVersionBits);\n        }\n    }\n    var bottomLeftVersionBits = 0;\n    for (var x = 5; x >= 0; x--) {\n        for (var y = dimension - 9; y >= dimension - 11; y--) {\n            bottomLeftVersionBits = pushBit(matrix.get(x, y), bottomLeftVersionBits);\n        }\n    }\n    var bestDifference = Infinity;\n    var bestVersion;\n    for (var _i = 0, VERSIONS_1 = version_1.VERSIONS; _i < VERSIONS_1.length; _i++) {\n        var version = VERSIONS_1[_i];\n        if (version.infoBits === topRightVersionBits || version.infoBits === bottomLeftVersionBits) {\n            return version;\n        }\n        var difference = numBitsDiffering(topRightVersionBits, version.infoBits);\n        if (difference < bestDifference) {\n            bestVersion = version;\n            bestDifference = difference;\n        }\n        difference = numBitsDiffering(bottomLeftVersionBits, version.infoBits);\n        if (difference < bestDifference) {\n            bestVersion = version;\n            bestDifference = difference;\n        }\n    }\n    // We can tolerate up to 3 bits of error since no two version info codewords will\n    // differ in less than 8 bits.\n    if (bestDifference <= 3) {\n        return bestVersion;\n    }\n}\nfunction readFormatInformation(matrix) {\n    var topLeftFormatInfoBits = 0;\n    for (var x = 0; x <= 8; x++) {\n        if (x !== 6) { // Skip timing pattern bit\n            topLeftFormatInfoBits = pushBit(matrix.get(x, 8), topLeftFormatInfoBits);\n        }\n    }\n    for (var y = 7; y >= 0; y--) {\n        if (y !== 6) { // Skip timing pattern bit\n            topLeftFormatInfoBits = pushBit(matrix.get(8, y), topLeftFormatInfoBits);\n        }\n    }\n    var dimension = matrix.height;\n    var topRightBottomRightFormatInfoBits = 0;\n    for (var y = dimension - 1; y >= dimension - 7; y--) { // bottom left\n        topRightBottomRightFormatInfoBits = pushBit(matrix.get(8, y), topRightBottomRightFormatInfoBits);\n    }\n    for (var x = dimension - 8; x < dimension; x++) { // top right\n        topRightBottomRightFormatInfoBits = pushBit(matrix.get(x, 8), topRightBottomRightFormatInfoBits);\n    }\n    var bestDifference = Infinity;\n    var bestFormatInfo = null;\n    for (var _i = 0, FORMAT_INFO_TABLE_1 = FORMAT_INFO_TABLE; _i < FORMAT_INFO_TABLE_1.length; _i++) {\n        var _a = FORMAT_INFO_TABLE_1[_i], bits = _a.bits, formatInfo = _a.formatInfo;\n        if (bits === topLeftFormatInfoBits || bits === topRightBottomRightFormatInfoBits) {\n            return formatInfo;\n        }\n        var difference = numBitsDiffering(topLeftFormatInfoBits, bits);\n        if (difference < bestDifference) {\n            bestFormatInfo = formatInfo;\n            bestDifference = difference;\n        }\n        if (topLeftFormatInfoBits !== topRightBottomRightFormatInfoBits) { // also try the other option\n            difference = numBitsDiffering(topRightBottomRightFormatInfoBits, bits);\n            if (difference < bestDifference) {\n                bestFormatInfo = formatInfo;\n                bestDifference = difference;\n            }\n        }\n    }\n    // Hamming distance of the 32 masked codes is 7, by construction, so <= 3 bits differing means we found a match\n    if (bestDifference <= 3) {\n        return bestFormatInfo;\n    }\n    return null;\n}\nfunction getDataBlocks(codewords, version, ecLevel) {\n    var ecInfo = version.errorCorrectionLevels[ecLevel];\n    var dataBlocks = [];\n    var totalCodewords = 0;\n    ecInfo.ecBlocks.forEach(function (block) {\n        for (var i = 0; i < block.numBlocks; i++) {\n            dataBlocks.push({ numDataCodewords: block.dataCodewordsPerBlock, codewords: [] });\n            totalCodewords += block.dataCodewordsPerBlock + ecInfo.ecCodewordsPerBlock;\n        }\n    });\n    // In some cases the QR code will be malformed enough that we pull off more or less than we should.\n    // If we pull off less there's nothing we can do.\n    // If we pull off more we can safely truncate\n    if (codewords.length < totalCodewords) {\n        return null;\n    }\n    codewords = codewords.slice(0, totalCodewords);\n    var shortBlockSize = ecInfo.ecBlocks[0].dataCodewordsPerBlock;\n    // Pull codewords to fill the blocks up to the minimum size\n    for (var i = 0; i < shortBlockSize; i++) {\n        for (var _i = 0, dataBlocks_1 = dataBlocks; _i < dataBlocks_1.length; _i++) {\n            var dataBlock = dataBlocks_1[_i];\n            dataBlock.codewords.push(codewords.shift());\n        }\n    }\n    // If there are any large blocks, pull codewords to fill the last element of those\n    if (ecInfo.ecBlocks.length > 1) {\n        var smallBlockCount = ecInfo.ecBlocks[0].numBlocks;\n        var largeBlockCount = ecInfo.ecBlocks[1].numBlocks;\n        for (var i = 0; i < largeBlockCount; i++) {\n            dataBlocks[smallBlockCount + i].codewords.push(codewords.shift());\n        }\n    }\n    // Add the rest of the codewords to the blocks. These are the error correction codewords.\n    while (codewords.length > 0) {\n        for (var _a = 0, dataBlocks_2 = dataBlocks; _a < dataBlocks_2.length; _a++) {\n            var dataBlock = dataBlocks_2[_a];\n            dataBlock.codewords.push(codewords.shift());\n        }\n    }\n    return dataBlocks;\n}\nfunction decodeMatrix(matrix) {\n    var version = readVersion(matrix);\n    if (!version) {\n        return null;\n    }\n    var formatInfo = readFormatInformation(matrix);\n    if (!formatInfo) {\n        return null;\n    }\n    var codewords = readCodewords(matrix, version, formatInfo);\n    var dataBlocks = getDataBlocks(codewords, version, formatInfo.errorCorrectionLevel);\n    if (!dataBlocks) {\n        return null;\n    }\n    // Count total number of data bytes\n    var totalBytes = dataBlocks.reduce(function (a, b) { return a + b.numDataCodewords; }, 0);\n    var resultBytes = new Uint8ClampedArray(totalBytes);\n    var resultIndex = 0;\n    for (var _i = 0, dataBlocks_3 = dataBlocks; _i < dataBlocks_3.length; _i++) {\n        var dataBlock = dataBlocks_3[_i];\n        var correctedBytes = reedsolomon_1.decode(dataBlock.codewords, dataBlock.codewords.length - dataBlock.numDataCodewords);\n        if (!correctedBytes) {\n            return null;\n        }\n        for (var i = 0; i < dataBlock.numDataCodewords; i++) {\n            resultBytes[resultIndex++] = correctedBytes[i];\n        }\n    }\n    try {\n        return decodeData_1.decode(resultBytes, version.versionNumber);\n    }\n    catch (_a) {\n        return null;\n    }\n}\nfunction decode(matrix) {\n    if (matrix == null) {\n        return null;\n    }\n    var result = decodeMatrix(matrix);\n    if (result) {\n        return result;\n    }\n    // Decoding didn't work, try mirroring the QR across the topLeft -> bottomRight line.\n    for (var x = 0; x < matrix.width; x++) {\n        for (var y = x + 1; y < matrix.height; y++) {\n            if (matrix.get(x, y) !== matrix.get(y, x)) {\n                matrix.set(x, y, !matrix.get(x, y));\n                matrix.set(y, x, !matrix.get(y, x));\n            }\n        }\n    }\n    return decodeMatrix(matrix);\n}\nexports.decode = decode;\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\n// tslint:disable:no-bitwise\nvar BitStream_1 = __webpack_require__(7);\nvar shiftJISTable_1 = __webpack_require__(8);\nvar Mode;\n(function (Mode) {\n    Mode[\"Numeric\"] = \"numeric\";\n    Mode[\"Alphanumeric\"] = \"alphanumeric\";\n    Mode[\"Byte\"] = \"byte\";\n    Mode[\"Kanji\"] = \"kanji\";\n    Mode[\"ECI\"] = \"eci\";\n})(Mode = exports.Mode || (exports.Mode = {}));\nvar ModeByte;\n(function (ModeByte) {\n    ModeByte[ModeByte[\"Terminator\"] = 0] = \"Terminator\";\n    ModeByte[ModeByte[\"Numeric\"] = 1] = \"Numeric\";\n    ModeByte[ModeByte[\"Alphanumeric\"] = 2] = \"Alphanumeric\";\n    ModeByte[ModeByte[\"Byte\"] = 4] = \"Byte\";\n    ModeByte[ModeByte[\"Kanji\"] = 8] = \"Kanji\";\n    ModeByte[ModeByte[\"ECI\"] = 7] = \"ECI\";\n    // StructuredAppend = 0x3,\n    // FNC1FirstPosition = 0x5,\n    // FNC1SecondPosition = 0x9,\n})(ModeByte || (ModeByte = {}));\nfunction decodeNumeric(stream, size) {\n    var bytes = [];\n    var text = \"\";\n    var characterCountSize = [10, 12, 14][size];\n    var length = stream.readBits(characterCountSize);\n    // Read digits in groups of 3\n    while (length >= 3) {\n        var num = stream.readBits(10);\n        if (num >= 1000) {\n            throw new Error(\"Invalid numeric value above 999\");\n        }\n        var a = Math.floor(num / 100);\n        var b = Math.floor(num / 10) % 10;\n        var c = num % 10;\n        bytes.push(48 + a, 48 + b, 48 + c);\n        text += a.toString() + b.toString() + c.toString();\n        length -= 3;\n    }\n    // If the number of digits aren't a multiple of 3, the remaining digits are special cased.\n    if (length === 2) {\n        var num = stream.readBits(7);\n        if (num >= 100) {\n            throw new Error(\"Invalid numeric value above 99\");\n        }\n        var a = Math.floor(num / 10);\n        var b = num % 10;\n        bytes.push(48 + a, 48 + b);\n        text += a.toString() + b.toString();\n    }\n    else if (length === 1) {\n        var num = stream.readBits(4);\n        if (num >= 10) {\n            throw new Error(\"Invalid numeric value above 9\");\n        }\n        bytes.push(48 + num);\n        text += num.toString();\n    }\n    return { bytes: bytes, text: text };\n}\nvar AlphanumericCharacterCodes = [\n    \"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\",\n    \"9\", \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\",\n    \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\", \"P\", \"Q\",\n    \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\", \"Y\", \"Z\",\n    \" \", \"$\", \"%\", \"*\", \"+\", \"-\", \".\", \"/\", \":\",\n];\nfunction decodeAlphanumeric(stream, size) {\n    var bytes = [];\n    var text = \"\";\n    var characterCountSize = [9, 11, 13][size];\n    var length = stream.readBits(characterCountSize);\n    while (length >= 2) {\n        var v = stream.readBits(11);\n        var a = Math.floor(v / 45);\n        var b = v % 45;\n        bytes.push(AlphanumericCharacterCodes[a].charCodeAt(0), AlphanumericCharacterCodes[b].charCodeAt(0));\n        text += AlphanumericCharacterCodes[a] + AlphanumericCharacterCodes[b];\n        length -= 2;\n    }\n    if (length === 1) {\n        var a = stream.readBits(6);\n        bytes.push(AlphanumericCharacterCodes[a].charCodeAt(0));\n        text += AlphanumericCharacterCodes[a];\n    }\n    return { bytes: bytes, text: text };\n}\nfunction decodeByte(stream, size) {\n    var bytes = [];\n    var text = \"\";\n    var characterCountSize = [8, 16, 16][size];\n    var length = stream.readBits(characterCountSize);\n    for (var i = 0; i < length; i++) {\n        var b = stream.readBits(8);\n        bytes.push(b);\n    }\n    try {\n        text += decodeURIComponent(bytes.map(function (b) { return \"%\" + (\"0\" + b.toString(16)).substr(-2); }).join(\"\"));\n    }\n    catch (_a) {\n        // failed to decode\n    }\n    return { bytes: bytes, text: text };\n}\nfunction decodeKanji(stream, size) {\n    var bytes = [];\n    var text = \"\";\n    var characterCountSize = [8, 10, 12][size];\n    var length = stream.readBits(characterCountSize);\n    for (var i = 0; i < length; i++) {\n        var k = stream.readBits(13);\n        var c = (Math.floor(k / 0xC0) << 8) | (k % 0xC0);\n        if (c < 0x1F00) {\n            c += 0x8140;\n        }\n        else {\n            c += 0xC140;\n        }\n        bytes.push(c >> 8, c & 0xFF);\n        text += String.fromCharCode(shiftJISTable_1.shiftJISTable[c]);\n    }\n    return { bytes: bytes, text: text };\n}\nfunction decode(data, version) {\n    var _a, _b, _c, _d;\n    var stream = new BitStream_1.BitStream(data);\n    // There are 3 'sizes' based on the version. 1-9 is small (0), 10-26 is medium (1) and 27-40 is large (2).\n    var size = version <= 9 ? 0 : version <= 26 ? 1 : 2;\n    var result = {\n        text: \"\",\n        bytes: [],\n        chunks: [],\n        version: version,\n    };\n    while (stream.available() >= 4) {\n        var mode = stream.readBits(4);\n        if (mode === ModeByte.Terminator) {\n            return result;\n        }\n        else if (mode === ModeByte.ECI) {\n            if (stream.readBits(1) === 0) {\n                result.chunks.push({\n                    type: Mode.ECI,\n                    assignmentNumber: stream.readBits(7),\n                });\n            }\n            else if (stream.readBits(1) === 0) {\n                result.chunks.push({\n                    type: Mode.ECI,\n                    assignmentNumber: stream.readBits(14),\n                });\n            }\n            else if (stream.readBits(1) === 0) {\n                result.chunks.push({\n                    type: Mode.ECI,\n                    assignmentNumber: stream.readBits(21),\n                });\n            }\n            else {\n                // ECI data seems corrupted\n                result.chunks.push({\n                    type: Mode.ECI,\n                    assignmentNumber: -1,\n                });\n            }\n        }\n        else if (mode === ModeByte.Numeric) {\n            var numericResult = decodeNumeric(stream, size);\n            result.text += numericResult.text;\n            (_a = result.bytes).push.apply(_a, numericResult.bytes);\n            result.chunks.push({\n                type: Mode.Numeric,\n                text: numericResult.text,\n            });\n        }\n        else if (mode === ModeByte.Alphanumeric) {\n            var alphanumericResult = decodeAlphanumeric(stream, size);\n            result.text += alphanumericResult.text;\n            (_b = result.bytes).push.apply(_b, alphanumericResult.bytes);\n            result.chunks.push({\n                type: Mode.Alphanumeric,\n                text: alphanumericResult.text,\n            });\n        }\n        else if (mode === ModeByte.Byte) {\n            var byteResult = decodeByte(stream, size);\n            result.text += byteResult.text;\n            (_c = result.bytes).push.apply(_c, byteResult.bytes);\n            result.chunks.push({\n                type: Mode.Byte,\n                bytes: byteResult.bytes,\n                text: byteResult.text,\n            });\n        }\n        else if (mode === ModeByte.Kanji) {\n            var kanjiResult = decodeKanji(stream, size);\n            result.text += kanjiResult.text;\n            (_d = result.bytes).push.apply(_d, kanjiResult.bytes);\n            result.chunks.push({\n                type: Mode.Kanji,\n                bytes: kanjiResult.bytes,\n                text: kanjiResult.text,\n            });\n        }\n    }\n    // If there is no data left, or the remaining bits are all 0, then that counts as a termination marker\n    if (stream.available() === 0 || stream.readBits(stream.available()) === 0) {\n        return result;\n    }\n}\nexports.decode = decode;\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n// tslint:disable:no-bitwise\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar BitStream = /** @class */ (function () {\n    function BitStream(bytes) {\n        this.byteOffset = 0;\n        this.bitOffset = 0;\n        this.bytes = bytes;\n    }\n    BitStream.prototype.readBits = function (numBits) {\n        if (numBits < 1 || numBits > 32 || numBits > this.available()) {\n            throw new Error(\"Cannot read \" + numBits.toString() + \" bits\");\n        }\n        var result = 0;\n        // First, read remainder from current byte\n        if (this.bitOffset > 0) {\n            var bitsLeft = 8 - this.bitOffset;\n            var toRead = numBits < bitsLeft ? numBits : bitsLeft;\n            var bitsToNotRead = bitsLeft - toRead;\n            var mask = (0xFF >> (8 - toRead)) << bitsToNotRead;\n            result = (this.bytes[this.byteOffset] & mask) >> bitsToNotRead;\n            numBits -= toRead;\n            this.bitOffset += toRead;\n            if (this.bitOffset === 8) {\n                this.bitOffset = 0;\n                this.byteOffset++;\n            }\n        }\n        // Next read whole bytes\n        if (numBits > 0) {\n            while (numBits >= 8) {\n                result = (result << 8) | (this.bytes[this.byteOffset] & 0xFF);\n                this.byteOffset++;\n                numBits -= 8;\n            }\n            // Finally read a partial byte\n            if (numBits > 0) {\n                var bitsToNotRead = 8 - numBits;\n                var mask = (0xFF >> bitsToNotRead) << bitsToNotRead;\n                result = (result << numBits) | ((this.bytes[this.byteOffset] & mask) >> bitsToNotRead);\n                this.bitOffset += numBits;\n            }\n        }\n        return result;\n    };\n    BitStream.prototype.available = function () {\n        return 8 * (this.bytes.length - this.byteOffset) - this.bitOffset;\n    };\n    return BitStream;\n}());\nexports.BitStream = BitStream;\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.shiftJISTable = {\n    0x20: 0x0020,\n    0x21: 0x0021,\n    0x22: 0x0022,\n    0x23: 0x0023,\n    0x24: 0x0024,\n    0x25: 0x0025,\n    0x26: 0x0026,\n    0x27: 0x0027,\n    0x28: 0x0028,\n    0x29: 0x0029,\n    0x2A: 0x002A,\n    0x2B: 0x002B,\n    0x2C: 0x002C,\n    0x2D: 0x002D,\n    0x2E: 0x002E,\n    0x2F: 0x002F,\n    0x30: 0x0030,\n    0x31: 0x0031,\n    0x32: 0x0032,\n    0x33: 0x0033,\n    0x34: 0x0034,\n    0x35: 0x0035,\n    0x36: 0x0036,\n    0x37: 0x0037,\n    0x38: 0x0038,\n    0x39: 0x0039,\n    0x3A: 0x003A,\n    0x3B: 0x003B,\n    0x3C: 0x003C,\n    0x3D: 0x003D,\n    0x3E: 0x003E,\n    0x3F: 0x003F,\n    0x40: 0x0040,\n    0x41: 0x0041,\n    0x42: 0x0042,\n    0x43: 0x0043,\n    0x44: 0x0044,\n    0x45: 0x0045,\n    0x46: 0x0046,\n    0x47: 0x0047,\n    0x48: 0x0048,\n    0x49: 0x0049,\n    0x4A: 0x004A,\n    0x4B: 0x004B,\n    0x4C: 0x004C,\n    0x4D: 0x004D,\n    0x4E: 0x004E,\n    0x4F: 0x004F,\n    0x50: 0x0050,\n    0x51: 0x0051,\n    0x52: 0x0052,\n    0x53: 0x0053,\n    0x54: 0x0054,\n    0x55: 0x0055,\n    0x56: 0x0056,\n    0x57: 0x0057,\n    0x58: 0x0058,\n    0x59: 0x0059,\n    0x5A: 0x005A,\n    0x5B: 0x005B,\n    0x5C: 0x00A5,\n    0x5D: 0x005D,\n    0x5E: 0x005E,\n    0x5F: 0x005F,\n    0x60: 0x0060,\n    0x61: 0x0061,\n    0x62: 0x0062,\n    0x63: 0x0063,\n    0x64: 0x0064,\n    0x65: 0x0065,\n    0x66: 0x0066,\n    0x67: 0x0067,\n    0x68: 0x0068,\n    0x69: 0x0069,\n    0x6A: 0x006A,\n    0x6B: 0x006B,\n    0x6C: 0x006C,\n    0x6D: 0x006D,\n    0x6E: 0x006E,\n    0x6F: 0x006F,\n    0x70: 0x0070,\n    0x71: 0x0071,\n    0x72: 0x0072,\n    0x73: 0x0073,\n    0x74: 0x0074,\n    0x75: 0x0075,\n    0x76: 0x0076,\n    0x77: 0x0077,\n    0x78: 0x0078,\n    0x79: 0x0079,\n    0x7A: 0x007A,\n    0x7B: 0x007B,\n    0x7C: 0x007C,\n    0x7D: 0x007D,\n    0x7E: 0x203E,\n    0x8140: 0x3000,\n    0x8141: 0x3001,\n    0x8142: 0x3002,\n    0x8143: 0xFF0C,\n    0x8144: 0xFF0E,\n    0x8145: 0x30FB,\n    0x8146: 0xFF1A,\n    0x8147: 0xFF1B,\n    0x8148: 0xFF1F,\n    0x8149: 0xFF01,\n    0x814A: 0x309B,\n    0x814B: 0x309C,\n    0x814C: 0x00B4,\n    0x814D: 0xFF40,\n    0x814E: 0x00A8,\n    0x814F: 0xFF3E,\n    0x8150: 0xFFE3,\n    0x8151: 0xFF3F,\n    0x8152: 0x30FD,\n    0x8153: 0x30FE,\n    0x8154: 0x309D,\n    0x8155: 0x309E,\n    0x8156: 0x3003,\n    0x8157: 0x4EDD,\n    0x8158: 0x3005,\n    0x8159: 0x3006,\n    0x815A: 0x3007,\n    0x815B: 0x30FC,\n    0x815C: 0x2015,\n    0x815D: 0x2010,\n    0x815E: 0xFF0F,\n    0x815F: 0x005C,\n    0x8160: 0x301C,\n    0x8161: 0x2016,\n    0x8162: 0xFF5C,\n    0x8163: 0x2026,\n    0x8164: 0x2025,\n    0x8165: 0x2018,\n    0x8166: 0x2019,\n    0x8167: 0x201C,\n    0x8168: 0x201D,\n    0x8169: 0xFF08,\n    0x816A: 0xFF09,\n    0x816B: 0x3014,\n    0x816C: 0x3015,\n    0x816D: 0xFF3B,\n    0x816E: 0xFF3D,\n    0x816F: 0xFF5B,\n    0x8170: 0xFF5D,\n    0x8171: 0x3008,\n    0x8172: 0x3009,\n    0x8173: 0x300A,\n    0x8174: 0x300B,\n    0x8175: 0x300C,\n    0x8176: 0x300D,\n    0x8177: 0x300E,\n    0x8178: 0x300F,\n    0x8179: 0x3010,\n    0x817A: 0x3011,\n    0x817B: 0xFF0B,\n    0x817C: 0x2212,\n    0x817D: 0x00B1,\n    0x817E: 0x00D7,\n    0x8180: 0x00F7,\n    0x8181: 0xFF1D,\n    0x8182: 0x2260,\n    0x8183: 0xFF1C,\n    0x8184: 0xFF1E,\n    0x8185: 0x2266,\n    0x8186: 0x2267,\n    0x8187: 0x221E,\n    0x8188: 0x2234,\n    0x8189: 0x2642,\n    0x818A: 0x2640,\n    0x818B: 0x00B0,\n    0x818C: 0x2032,\n    0x818D: 0x2033,\n    0x818E: 0x2103,\n    0x818F: 0xFFE5,\n    0x8190: 0xFF04,\n    0x8191: 0x00A2,\n    0x8192: 0x00A3,\n    0x8193: 0xFF05,\n    0x8194: 0xFF03,\n    0x8195: 0xFF06,\n    0x8196: 0xFF0A,\n    0x8197: 0xFF20,\n    0x8198: 0x00A7,\n    0x8199: 0x2606,\n    0x819A: 0x2605,\n    0x819B: 0x25CB,\n    0x819C: 0x25CF,\n    0x819D: 0x25CE,\n    0x819E: 0x25C7,\n    0x819F: 0x25C6,\n    0x81A0: 0x25A1,\n    0x81A1: 0x25A0,\n    0x81A2: 0x25B3,\n    0x81A3: 0x25B2,\n    0x81A4: 0x25BD,\n    0x81A5: 0x25BC,\n    0x81A6: 0x203B,\n    0x81A7: 0x3012,\n    0x81A8: 0x2192,\n    0x81A9: 0x2190,\n    0x81AA: 0x2191,\n    0x81AB: 0x2193,\n    0x81AC: 0x3013,\n    0x81B8: 0x2208,\n    0x81B9: 0x220B,\n    0x81BA: 0x2286,\n    0x81BB: 0x2287,\n    0x81BC: 0x2282,\n    0x81BD: 0x2283,\n    0x81BE: 0x222A,\n    0x81BF: 0x2229,\n    0x81C8: 0x2227,\n    0x81C9: 0x2228,\n    0x81CA: 0x00AC,\n    0x81CB: 0x21D2,\n    0x81CC: 0x21D4,\n    0x81CD: 0x2200,\n    0x81CE: 0x2203,\n    0x81DA: 0x2220,\n    0x81DB: 0x22A5,\n    0x81DC: 0x2312,\n    0x81DD: 0x2202,\n    0x81DE: 0x2207,\n    0x81DF: 0x2261,\n    0x81E0: 0x2252,\n    0x81E1: 0x226A,\n    0x81E2: 0x226B,\n    0x81E3: 0x221A,\n    0x81E4: 0x223D,\n    0x81E5: 0x221D,\n    0x81E6: 0x2235,\n    0x81E7: 0x222B,\n    0x81E8: 0x222C,\n    0x81F0: 0x212B,\n    0x81F1: 0x2030,\n    0x81F2: 0x266F,\n    0x81F3: 0x266D,\n    0x81F4: 0x266A,\n    0x81F5: 0x2020,\n    0x81F6: 0x2021,\n    0x81F7: 0x00B6,\n    0x81FC: 0x25EF,\n    0x824F: 0xFF10,\n    0x8250: 0xFF11,\n    0x8251: 0xFF12,\n    0x8252: 0xFF13,\n    0x8253: 0xFF14,\n    0x8254: 0xFF15,\n    0x8255: 0xFF16,\n    0x8256: 0xFF17,\n    0x8257: 0xFF18,\n    0x8258: 0xFF19,\n    0x8260: 0xFF21,\n    0x8261: 0xFF22,\n    0x8262: 0xFF23,\n    0x8263: 0xFF24,\n    0x8264: 0xFF25,\n    0x8265: 0xFF26,\n    0x8266: 0xFF27,\n    0x8267: 0xFF28,\n    0x8268: 0xFF29,\n    0x8269: 0xFF2A,\n    0x826A: 0xFF2B,\n    0x826B: 0xFF2C,\n    0x826C: 0xFF2D,\n    0x826D: 0xFF2E,\n    0x826E: 0xFF2F,\n    0x826F: 0xFF30,\n    0x8270: 0xFF31,\n    0x8271: 0xFF32,\n    0x8272: 0xFF33,\n    0x8273: 0xFF34,\n    0x8274: 0xFF35,\n    0x8275: 0xFF36,\n    0x8276: 0xFF37,\n    0x8277: 0xFF38,\n    0x8278: 0xFF39,\n    0x8279: 0xFF3A,\n    0x8281: 0xFF41,\n    0x8282: 0xFF42,\n    0x8283: 0xFF43,\n    0x8284: 0xFF44,\n    0x8285: 0xFF45,\n    0x8286: 0xFF46,\n    0x8287: 0xFF47,\n    0x8288: 0xFF48,\n    0x8289: 0xFF49,\n    0x828A: 0xFF4A,\n    0x828B: 0xFF4B,\n    0x828C: 0xFF4C,\n    0x828D: 0xFF4D,\n    0x828E: 0xFF4E,\n    0x828F: 0xFF4F,\n    0x8290: 0xFF50,\n    0x8291: 0xFF51,\n    0x8292: 0xFF52,\n    0x8293: 0xFF53,\n    0x8294: 0xFF54,\n    0x8295: 0xFF55,\n    0x8296: 0xFF56,\n    0x8297: 0xFF57,\n    0x8298: 0xFF58,\n    0x8299: 0xFF59,\n    0x829A: 0xFF5A,\n    0x829F: 0x3041,\n    0x82A0: 0x3042,\n    0x82A1: 0x3043,\n    0x82A2: 0x3044,\n    0x82A3: 0x3045,\n    0x82A4: 0x3046,\n    0x82A5: 0x3047,\n    0x82A6: 0x3048,\n    0x82A7: 0x3049,\n    0x82A8: 0x304A,\n    0x82A9: 0x304B,\n    0x82AA: 0x304C,\n    0x82AB: 0x304D,\n    0x82AC: 0x304E,\n    0x82AD: 0x304F,\n    0x82AE: 0x3050,\n    0x82AF: 0x3051,\n    0x82B0: 0x3052,\n    0x82B1: 0x3053,\n    0x82B2: 0x3054,\n    0x82B3: 0x3055,\n    0x82B4: 0x3056,\n    0x82B5: 0x3057,\n    0x82B6: 0x3058,\n    0x82B7: 0x3059,\n    0x82B8: 0x305A,\n    0x82B9: 0x305B,\n    0x82BA: 0x305C,\n    0x82BB: 0x305D,\n    0x82BC: 0x305E,\n    0x82BD: 0x305F,\n    0x82BE: 0x3060,\n    0x82BF: 0x3061,\n    0x82C0: 0x3062,\n    0x82C1: 0x3063,\n    0x82C2: 0x3064,\n    0x82C3: 0x3065,\n    0x82C4: 0x3066,\n    0x82C5: 0x3067,\n    0x82C6: 0x3068,\n    0x82C7: 0x3069,\n    0x82C8: 0x306A,\n    0x82C9: 0x306B,\n    0x82CA: 0x306C,\n    0x82CB: 0x306D,\n    0x82CC: 0x306E,\n    0x82CD: 0x306F,\n    0x82CE: 0x3070,\n    0x82CF: 0x3071,\n    0x82D0: 0x3072,\n    0x82D1: 0x3073,\n    0x82D2: 0x3074,\n    0x82D3: 0x3075,\n    0x82D4: 0x3076,\n    0x82D5: 0x3077,\n    0x82D6: 0x3078,\n    0x82D7: 0x3079,\n    0x82D8: 0x307A,\n    0x82D9: 0x307B,\n    0x82DA: 0x307C,\n    0x82DB: 0x307D,\n    0x82DC: 0x307E,\n    0x82DD: 0x307F,\n    0x82DE: 0x3080,\n    0x82DF: 0x3081,\n    0x82E0: 0x3082,\n    0x82E1: 0x3083,\n    0x82E2: 0x3084,\n    0x82E3: 0x3085,\n    0x82E4: 0x3086,\n    0x82E5: 0x3087,\n    0x82E6: 0x3088,\n    0x82E7: 0x3089,\n    0x82E8: 0x308A,\n    0x82E9: 0x308B,\n    0x82EA: 0x308C,\n    0x82EB: 0x308D,\n    0x82EC: 0x308E,\n    0x82ED: 0x308F,\n    0x82EE: 0x3090,\n    0x82EF: 0x3091,\n    0x82F0: 0x3092,\n    0x82F1: 0x3093,\n    0x8340: 0x30A1,\n    0x8341: 0x30A2,\n    0x8342: 0x30A3,\n    0x8343: 0x30A4,\n    0x8344: 0x30A5,\n    0x8345: 0x30A6,\n    0x8346: 0x30A7,\n    0x8347: 0x30A8,\n    0x8348: 0x30A9,\n    0x8349: 0x30AA,\n    0x834A: 0x30AB,\n    0x834B: 0x30AC,\n    0x834C: 0x30AD,\n    0x834D: 0x30AE,\n    0x834E: 0x30AF,\n    0x834F: 0x30B0,\n    0x8350: 0x30B1,\n    0x8351: 0x30B2,\n    0x8352: 0x30B3,\n    0x8353: 0x30B4,\n    0x8354: 0x30B5,\n    0x8355: 0x30B6,\n    0x8356: 0x30B7,\n    0x8357: 0x30B8,\n    0x8358: 0x30B9,\n    0x8359: 0x30BA,\n    0x835A: 0x30BB,\n    0x835B: 0x30BC,\n    0x835C: 0x30BD,\n    0x835D: 0x30BE,\n    0x835E: 0x30BF,\n    0x835F: 0x30C0,\n    0x8360: 0x30C1,\n    0x8361: 0x30C2,\n    0x8362: 0x30C3,\n    0x8363: 0x30C4,\n    0x8364: 0x30C5,\n    0x8365: 0x30C6,\n    0x8366: 0x30C7,\n    0x8367: 0x30C8,\n    0x8368: 0x30C9,\n    0x8369: 0x30CA,\n    0x836A: 0x30CB,\n    0x836B: 0x30CC,\n    0x836C: 0x30CD,\n    0x836D: 0x30CE,\n    0x836E: 0x30CF,\n    0x836F: 0x30D0,\n    0x8370: 0x30D1,\n    0x8371: 0x30D2,\n    0x8372: 0x30D3,\n    0x8373: 0x30D4,\n    0x8374: 0x30D5,\n    0x8375: 0x30D6,\n    0x8376: 0x30D7,\n    0x8377: 0x30D8,\n    0x8378: 0x30D9,\n    0x8379: 0x30DA,\n    0x837A: 0x30DB,\n    0x837B: 0x30DC,\n    0x837C: 0x30DD,\n    0x837D: 0x30DE,\n    0x837E: 0x30DF,\n    0x8380: 0x30E0,\n    0x8381: 0x30E1,\n    0x8382: 0x30E2,\n    0x8383: 0x30E3,\n    0x8384: 0x30E4,\n    0x8385: 0x30E5,\n    0x8386: 0x30E6,\n    0x8387: 0x30E7,\n    0x8388: 0x30E8,\n    0x8389: 0x30E9,\n    0x838A: 0x30EA,\n    0x838B: 0x30EB,\n    0x838C: 0x30EC,\n    0x838D: 0x30ED,\n    0x838E: 0x30EE,\n    0x838F: 0x30EF,\n    0x8390: 0x30F0,\n    0x8391: 0x30F1,\n    0x8392: 0x30F2,\n    0x8393: 0x30F3,\n    0x8394: 0x30F4,\n    0x8395: 0x30F5,\n    0x8396: 0x30F6,\n    0x839F: 0x0391,\n    0x83A0: 0x0392,\n    0x83A1: 0x0393,\n    0x83A2: 0x0394,\n    0x83A3: 0x0395,\n    0x83A4: 0x0396,\n    0x83A5: 0x0397,\n    0x83A6: 0x0398,\n    0x83A7: 0x0399,\n    0x83A8: 0x039A,\n    0x83A9: 0x039B,\n    0x83AA: 0x039C,\n    0x83AB: 0x039D,\n    0x83AC: 0x039E,\n    0x83AD: 0x039F,\n    0x83AE: 0x03A0,\n    0x83AF: 0x03A1,\n    0x83B0: 0x03A3,\n    0x83B1: 0x03A4,\n    0x83B2: 0x03A5,\n    0x83B3: 0x03A6,\n    0x83B4: 0x03A7,\n    0x83B5: 0x03A8,\n    0x83B6: 0x03A9,\n    0x83BF: 0x03B1,\n    0x83C0: 0x03B2,\n    0x83C1: 0x03B3,\n    0x83C2: 0x03B4,\n    0x83C3: 0x03B5,\n    0x83C4: 0x03B6,\n    0x83C5: 0x03B7,\n    0x83C6: 0x03B8,\n    0x83C7: 0x03B9,\n    0x83C8: 0x03BA,\n    0x83C9: 0x03BB,\n    0x83CA: 0x03BC,\n    0x83CB: 0x03BD,\n    0x83CC: 0x03BE,\n    0x83CD: 0x03BF,\n    0x83CE: 0x03C0,\n    0x83CF: 0x03C1,\n    0x83D0: 0x03C3,\n    0x83D1: 0x03C4,\n    0x83D2: 0x03C5,\n    0x83D3: 0x03C6,\n    0x83D4: 0x03C7,\n    0x83D5: 0x03C8,\n    0x83D6: 0x03C9,\n    0x8440: 0x0410,\n    0x8441: 0x0411,\n    0x8442: 0x0412,\n    0x8443: 0x0413,\n    0x8444: 0x0414,\n    0x8445: 0x0415,\n    0x8446: 0x0401,\n    0x8447: 0x0416,\n    0x8448: 0x0417,\n    0x8449: 0x0418,\n    0x844A: 0x0419,\n    0x844B: 0x041A,\n    0x844C: 0x041B,\n    0x844D: 0x041C,\n    0x844E: 0x041D,\n    0x844F: 0x041E,\n    0x8450: 0x041F,\n    0x8451: 0x0420,\n    0x8452: 0x0421,\n    0x8453: 0x0422,\n    0x8454: 0x0423,\n    0x8455: 0x0424,\n    0x8456: 0x0425,\n    0x8457: 0x0426,\n    0x8458: 0x0427,\n    0x8459: 0x0428,\n    0x845A: 0x0429,\n    0x845B: 0x042A,\n    0x845C: 0x042B,\n    0x845D: 0x042C,\n    0x845E: 0x042D,\n    0x845F: 0x042E,\n    0x8460: 0x042F,\n    0x8470: 0x0430,\n    0x8471: 0x0431,\n    0x8472: 0x0432,\n    0x8473: 0x0433,\n    0x8474: 0x0434,\n    0x8475: 0x0435,\n    0x8476: 0x0451,\n    0x8477: 0x0436,\n    0x8478: 0x0437,\n    0x8479: 0x0438,\n    0x847A: 0x0439,\n    0x847B: 0x043A,\n    0x847C: 0x043B,\n    0x847D: 0x043C,\n    0x847E: 0x043D,\n    0x8480: 0x043E,\n    0x8481: 0x043F,\n    0x8482: 0x0440,\n    0x8483: 0x0441,\n    0x8484: 0x0442,\n    0x8485: 0x0443,\n    0x8486: 0x0444,\n    0x8487: 0x0445,\n    0x8488: 0x0446,\n    0x8489: 0x0447,\n    0x848A: 0x0448,\n    0x848B: 0x0449,\n    0x848C: 0x044A,\n    0x848D: 0x044B,\n    0x848E: 0x044C,\n    0x848F: 0x044D,\n    0x8490: 0x044E,\n    0x8491: 0x044F,\n    0x849F: 0x2500,\n    0x84A0: 0x2502,\n    0x84A1: 0x250C,\n    0x84A2: 0x2510,\n    0x84A3: 0x2518,\n    0x84A4: 0x2514,\n    0x84A5: 0x251C,\n    0x84A6: 0x252C,\n    0x84A7: 0x2524,\n    0x84A8: 0x2534,\n    0x84A9: 0x253C,\n    0x84AA: 0x2501,\n    0x84AB: 0x2503,\n    0x84AC: 0x250F,\n    0x84AD: 0x2513,\n    0x84AE: 0x251B,\n    0x84AF: 0x2517,\n    0x84B0: 0x2523,\n    0x84B1: 0x2533,\n    0x84B2: 0x252B,\n    0x84B3: 0x253B,\n    0x84B4: 0x254B,\n    0x84B5: 0x2520,\n    0x84B6: 0x252F,\n    0x84B7: 0x2528,\n    0x84B8: 0x2537,\n    0x84B9: 0x253F,\n    0x84BA: 0x251D,\n    0x84BB: 0x2530,\n    0x84BC: 0x2525,\n    0x84BD: 0x2538,\n    0x84BE: 0x2542,\n    0x889F: 0x4E9C,\n    0x88A0: 0x5516,\n    0x88A1: 0x5A03,\n    0x88A2: 0x963F,\n    0x88A3: 0x54C0,\n    0x88A4: 0x611B,\n    0x88A5: 0x6328,\n    0x88A6: 0x59F6,\n    0x88A7: 0x9022,\n    0x88A8: 0x8475,\n    0x88A9: 0x831C,\n    0x88AA: 0x7A50,\n    0x88AB: 0x60AA,\n    0x88AC: 0x63E1,\n    0x88AD: 0x6E25,\n    0x88AE: 0x65ED,\n    0x88AF: 0x8466,\n    0x88B0: 0x82A6,\n    0x88B1: 0x9BF5,\n    0x88B2: 0x6893,\n    0x88B3: 0x5727,\n    0x88B4: 0x65A1,\n    0x88B5: 0x6271,\n    0x88B6: 0x5B9B,\n    0x88B7: 0x59D0,\n    0x88B8: 0x867B,\n    0x88B9: 0x98F4,\n    0x88BA: 0x7D62,\n    0x88BB: 0x7DBE,\n    0x88BC: 0x9B8E,\n    0x88BD: 0x6216,\n    0x88BE: 0x7C9F,\n    0x88BF: 0x88B7,\n    0x88C0: 0x5B89,\n    0x88C1: 0x5EB5,\n    0x88C2: 0x6309,\n    0x88C3: 0x6697,\n    0x88C4: 0x6848,\n    0x88C5: 0x95C7,\n    0x88C6: 0x978D,\n    0x88C7: 0x674F,\n    0x88C8: 0x4EE5,\n    0x88C9: 0x4F0A,\n    0x88CA: 0x4F4D,\n    0x88CB: 0x4F9D,\n    0x88CC: 0x5049,\n    0x88CD: 0x56F2,\n    0x88CE: 0x5937,\n    0x88CF: 0x59D4,\n    0x88D0: 0x5A01,\n    0x88D1: 0x5C09,\n    0x88D2: 0x60DF,\n    0x88D3: 0x610F,\n    0x88D4: 0x6170,\n    0x88D5: 0x6613,\n    0x88D6: 0x6905,\n    0x88D7: 0x70BA,\n    0x88D8: 0x754F,\n    0x88D9: 0x7570,\n    0x88DA: 0x79FB,\n    0x88DB: 0x7DAD,\n    0x88DC: 0x7DEF,\n    0x88DD: 0x80C3,\n    0x88DE: 0x840E,\n    0x88DF: 0x8863,\n    0x88E0: 0x8B02,\n    0x88E1: 0x9055,\n    0x88E2: 0x907A,\n    0x88E3: 0x533B,\n    0x88E4: 0x4E95,\n    0x88E5: 0x4EA5,\n    0x88E6: 0x57DF,\n    0x88E7: 0x80B2,\n    0x88E8: 0x90C1,\n    0x88E9: 0x78EF,\n    0x88EA: 0x4E00,\n    0x88EB: 0x58F1,\n    0x88EC: 0x6EA2,\n    0x88ED: 0x9038,\n    0x88EE: 0x7A32,\n    0x88EF: 0x8328,\n    0x88F0: 0x828B,\n    0x88F1: 0x9C2F,\n    0x88F2: 0x5141,\n    0x88F3: 0x5370,\n    0x88F4: 0x54BD,\n    0x88F5: 0x54E1,\n    0x88F6: 0x56E0,\n    0x88F7: 0x59FB,\n    0x88F8: 0x5F15,\n    0x88F9: 0x98F2,\n    0x88FA: 0x6DEB,\n    0x88FB: 0x80E4,\n    0x88FC: 0x852D,\n    0x8940: 0x9662,\n    0x8941: 0x9670,\n    0x8942: 0x96A0,\n    0x8943: 0x97FB,\n    0x8944: 0x540B,\n    0x8945: 0x53F3,\n    0x8946: 0x5B87,\n    0x8947: 0x70CF,\n    0x8948: 0x7FBD,\n    0x8949: 0x8FC2,\n    0x894A: 0x96E8,\n    0x894B: 0x536F,\n    0x894C: 0x9D5C,\n    0x894D: 0x7ABA,\n    0x894E: 0x4E11,\n    0x894F: 0x7893,\n    0x8950: 0x81FC,\n    0x8951: 0x6E26,\n    0x8952: 0x5618,\n    0x8953: 0x5504,\n    0x8954: 0x6B1D,\n    0x8955: 0x851A,\n    0x8956: 0x9C3B,\n    0x8957: 0x59E5,\n    0x8958: 0x53A9,\n    0x8959: 0x6D66,\n    0x895A: 0x74DC,\n    0x895B: 0x958F,\n    0x895C: 0x5642,\n    0x895D: 0x4E91,\n    0x895E: 0x904B,\n    0x895F: 0x96F2,\n    0x8960: 0x834F,\n    0x8961: 0x990C,\n    0x8962: 0x53E1,\n    0x8963: 0x55B6,\n    0x8964: 0x5B30,\n    0x8965: 0x5F71,\n    0x8966: 0x6620,\n    0x8967: 0x66F3,\n    0x8968: 0x6804,\n    0x8969: 0x6C38,\n    0x896A: 0x6CF3,\n    0x896B: 0x6D29,\n    0x896C: 0x745B,\n    0x896D: 0x76C8,\n    0x896E: 0x7A4E,\n    0x896F: 0x9834,\n    0x8970: 0x82F1,\n    0x8971: 0x885B,\n    0x8972: 0x8A60,\n    0x8973: 0x92ED,\n    0x8974: 0x6DB2,\n    0x8975: 0x75AB,\n    0x8976: 0x76CA,\n    0x8977: 0x99C5,\n    0x8978: 0x60A6,\n    0x8979: 0x8B01,\n    0x897A: 0x8D8A,\n    0x897B: 0x95B2,\n    0x897C: 0x698E,\n    0x897D: 0x53AD,\n    0x897E: 0x5186,\n    0x8980: 0x5712,\n    0x8981: 0x5830,\n    0x8982: 0x5944,\n    0x8983: 0x5BB4,\n    0x8984: 0x5EF6,\n    0x8985: 0x6028,\n    0x8986: 0x63A9,\n    0x8987: 0x63F4,\n    0x8988: 0x6CBF,\n    0x8989: 0x6F14,\n    0x898A: 0x708E,\n    0x898B: 0x7114,\n    0x898C: 0x7159,\n    0x898D: 0x71D5,\n    0x898E: 0x733F,\n    0x898F: 0x7E01,\n    0x8990: 0x8276,\n    0x8991: 0x82D1,\n    0x8992: 0x8597,\n    0x8993: 0x9060,\n    0x8994: 0x925B,\n    0x8995: 0x9D1B,\n    0x8996: 0x5869,\n    0x8997: 0x65BC,\n    0x8998: 0x6C5A,\n    0x8999: 0x7525,\n    0x899A: 0x51F9,\n    0x899B: 0x592E,\n    0x899C: 0x5965,\n    0x899D: 0x5F80,\n    0x899E: 0x5FDC,\n    0x899F: 0x62BC,\n    0x89A0: 0x65FA,\n    0x89A1: 0x6A2A,\n    0x89A2: 0x6B27,\n    0x89A3: 0x6BB4,\n    0x89A4: 0x738B,\n    0x89A5: 0x7FC1,\n    0x89A6: 0x8956,\n    0x89A7: 0x9D2C,\n    0x89A8: 0x9D0E,\n    0x89A9: 0x9EC4,\n    0x89AA: 0x5CA1,\n    0x89AB: 0x6C96,\n    0x89AC: 0x837B,\n    0x89AD: 0x5104,\n    0x89AE: 0x5C4B,\n    0x89AF: 0x61B6,\n    0x89B0: 0x81C6,\n    0x89B1: 0x6876,\n    0x89B2: 0x7261,\n    0x89B3: 0x4E59,\n    0x89B4: 0x4FFA,\n    0x89B5: 0x5378,\n    0x89B6: 0x6069,\n    0x89B7: 0x6E29,\n    0x89B8: 0x7A4F,\n    0x89B9: 0x97F3,\n    0x89BA: 0x4E0B,\n    0x89BB: 0x5316,\n    0x89BC: 0x4EEE,\n    0x89BD: 0x4F55,\n    0x89BE: 0x4F3D,\n    0x89BF: 0x4FA1,\n    0x89C0: 0x4F73,\n    0x89C1: 0x52A0,\n    0x89C2: 0x53EF,\n    0x89C3: 0x5609,\n    0x89C4: 0x590F,\n    0x89C5: 0x5AC1,\n    0x89C6: 0x5BB6,\n    0x89C7: 0x5BE1,\n    0x89C8: 0x79D1,\n    0x89C9: 0x6687,\n    0x89CA: 0x679C,\n    0x89CB: 0x67B6,\n    0x89CC: 0x6B4C,\n    0x89CD: 0x6CB3,\n    0x89CE: 0x706B,\n    0x89CF: 0x73C2,\n    0x89D0: 0x798D,\n    0x89D1: 0x79BE,\n    0x89D2: 0x7A3C,\n    0x89D3: 0x7B87,\n    0x89D4: 0x82B1,\n    0x89D5: 0x82DB,\n    0x89D6: 0x8304,\n    0x89D7: 0x8377,\n    0x89D8: 0x83EF,\n    0x89D9: 0x83D3,\n    0x89DA: 0x8766,\n    0x89DB: 0x8AB2,\n    0x89DC: 0x5629,\n    0x89DD: 0x8CA8,\n    0x89DE: 0x8FE6,\n    0x89DF: 0x904E,\n    0x89E0: 0x971E,\n    0x89E1: 0x868A,\n    0x89E2: 0x4FC4,\n    0x89E3: 0x5CE8,\n    0x89E4: 0x6211,\n    0x89E5: 0x7259,\n    0x89E6: 0x753B,\n    0x89E7: 0x81E5,\n    0x89E8: 0x82BD,\n    0x89E9: 0x86FE,\n    0x89EA: 0x8CC0,\n    0x89EB: 0x96C5,\n    0x89EC: 0x9913,\n    0x89ED: 0x99D5,\n    0x89EE: 0x4ECB,\n    0x89EF: 0x4F1A,\n    0x89F0: 0x89E3,\n    0x89F1: 0x56DE,\n    0x89F2: 0x584A,\n    0x89F3: 0x58CA,\n    0x89F4: 0x5EFB,\n    0x89F5: 0x5FEB,\n    0x89F6: 0x602A,\n    0x89F7: 0x6094,\n    0x89F8: 0x6062,\n    0x89F9: 0x61D0,\n    0x89FA: 0x6212,\n    0x89FB: 0x62D0,\n    0x89FC: 0x6539,\n    0x8A40: 0x9B41,\n    0x8A41: 0x6666,\n    0x8A42: 0x68B0,\n    0x8A43: 0x6D77,\n    0x8A44: 0x7070,\n    0x8A45: 0x754C,\n    0x8A46: 0x7686,\n    0x8A47: 0x7D75,\n    0x8A48: 0x82A5,\n    0x8A49: 0x87F9,\n    0x8A4A: 0x958B,\n    0x8A4B: 0x968E,\n    0x8A4C: 0x8C9D,\n    0x8A4D: 0x51F1,\n    0x8A4E: 0x52BE,\n    0x8A4F: 0x5916,\n    0x8A50: 0x54B3,\n    0x8A51: 0x5BB3,\n    0x8A52: 0x5D16,\n    0x8A53: 0x6168,\n    0x8A54: 0x6982,\n    0x8A55: 0x6DAF,\n    0x8A56: 0x788D,\n    0x8A57: 0x84CB,\n    0x8A58: 0x8857,\n    0x8A59: 0x8A72,\n    0x8A5A: 0x93A7,\n    0x8A5B: 0x9AB8,\n    0x8A5C: 0x6D6C,\n    0x8A5D: 0x99A8,\n    0x8A5E: 0x86D9,\n    0x8A5F: 0x57A3,\n    0x8A60: 0x67FF,\n    0x8A61: 0x86CE,\n    0x8A62: 0x920E,\n    0x8A63: 0x5283,\n    0x8A64: 0x5687,\n    0x8A65: 0x5404,\n    0x8A66: 0x5ED3,\n    0x8A67: 0x62E1,\n    0x8A68: 0x64B9,\n    0x8A69: 0x683C,\n    0x8A6A: 0x6838,\n    0x8A6B: 0x6BBB,\n    0x8A6C: 0x7372,\n    0x8A6D: 0x78BA,\n    0x8A6E: 0x7A6B,\n    0x8A6F: 0x899A,\n    0x8A70: 0x89D2,\n    0x8A71: 0x8D6B,\n    0x8A72: 0x8F03,\n    0x8A73: 0x90ED,\n    0x8A74: 0x95A3,\n    0x8A75: 0x9694,\n    0x8A76: 0x9769,\n    0x8A77: 0x5B66,\n    0x8A78: 0x5CB3,\n    0x8A79: 0x697D,\n    0x8A7A: 0x984D,\n    0x8A7B: 0x984E,\n    0x8A7C: 0x639B,\n    0x8A7D: 0x7B20,\n    0x8A7E: 0x6A2B,\n    0x8A80: 0x6A7F,\n    0x8A81: 0x68B6,\n    0x8A82: 0x9C0D,\n    0x8A83: 0x6F5F,\n    0x8A84: 0x5272,\n    0x8A85: 0x559D,\n    0x8A86: 0x6070,\n    0x8A87: 0x62EC,\n    0x8A88: 0x6D3B,\n    0x8A89: 0x6E07,\n    0x8A8A: 0x6ED1,\n    0x8A8B: 0x845B,\n    0x8A8C: 0x8910,\n    0x8A8D: 0x8F44,\n    0x8A8E: 0x4E14,\n    0x8A8F: 0x9C39,\n    0x8A90: 0x53F6,\n    0x8A91: 0x691B,\n    0x8A92: 0x6A3A,\n    0x8A93: 0x9784,\n    0x8A94: 0x682A,\n    0x8A95: 0x515C,\n    0x8A96: 0x7AC3,\n    0x8A97: 0x84B2,\n    0x8A98: 0x91DC,\n    0x8A99: 0x938C,\n    0x8A9A: 0x565B,\n    0x8A9B: 0x9D28,\n    0x8A9C: 0x6822,\n    0x8A9D: 0x8305,\n    0x8A9E: 0x8431,\n    0x8A9F: 0x7CA5,\n    0x8AA0: 0x5208,\n    0x8AA1: 0x82C5,\n    0x8AA2: 0x74E6,\n    0x8AA3: 0x4E7E,\n    0x8AA4: 0x4F83,\n    0x8AA5: 0x51A0,\n    0x8AA6: 0x5BD2,\n    0x8AA7: 0x520A,\n    0x8AA8: 0x52D8,\n    0x8AA9: 0x52E7,\n    0x8AAA: 0x5DFB,\n    0x8AAB: 0x559A,\n    0x8AAC: 0x582A,\n    0x8AAD: 0x59E6,\n    0x8AAE: 0x5B8C,\n    0x8AAF: 0x5B98,\n    0x8AB0: 0x5BDB,\n    0x8AB1: 0x5E72,\n    0x8AB2: 0x5E79,\n    0x8AB3: 0x60A3,\n    0x8AB4: 0x611F,\n    0x8AB5: 0x6163,\n    0x8AB6: 0x61BE,\n    0x8AB7: 0x63DB,\n    0x8AB8: 0x6562,\n    0x8AB9: 0x67D1,\n    0x8ABA: 0x6853,\n    0x8ABB: 0x68FA,\n    0x8ABC: 0x6B3E,\n    0x8ABD: 0x6B53,\n    0x8ABE: 0x6C57,\n    0x8ABF: 0x6F22,\n    0x8AC0: 0x6F97,\n    0x8AC1: 0x6F45,\n    0x8AC2: 0x74B0,\n    0x8AC3: 0x7518,\n    0x8AC4: 0x76E3,\n    0x8AC5: 0x770B,\n    0x8AC6: 0x7AFF,\n    0x8AC7: 0x7BA1,\n    0x8AC8: 0x7C21,\n    0x8AC9: 0x7DE9,\n    0x8ACA: 0x7F36,\n    0x8ACB: 0x7FF0,\n    0x8ACC: 0x809D,\n    0x8ACD: 0x8266,\n    0x8ACE: 0x839E,\n    0x8ACF: 0x89B3,\n    0x8AD0: 0x8ACC,\n    0x8AD1: 0x8CAB,\n    0x8AD2: 0x9084,\n    0x8AD3: 0x9451,\n    0x8AD4: 0x9593,\n    0x8AD5: 0x9591,\n    0x8AD6: 0x95A2,\n    0x8AD7: 0x9665,\n    0x8AD8: 0x97D3,\n    0x8AD9: 0x9928,\n    0x8ADA: 0x8218,\n    0x8ADB: 0x4E38,\n    0x8ADC: 0x542B,\n    0x8ADD: 0x5CB8,\n    0x8ADE: 0x5DCC,\n    0x8ADF: 0x73A9,\n    0x8AE0: 0x764C,\n    0x8AE1: 0x773C,\n    0x8AE2: 0x5CA9,\n    0x8AE3: 0x7FEB,\n    0x8AE4: 0x8D0B,\n    0x8AE5: 0x96C1,\n    0x8AE6: 0x9811,\n    0x8AE7: 0x9854,\n    0x8AE8: 0x9858,\n    0x8AE9: 0x4F01,\n    0x8AEA: 0x4F0E,\n    0x8AEB: 0x5371,\n    0x8AEC: 0x559C,\n    0x8AED: 0x5668,\n    0x8AEE: 0x57FA,\n    0x8AEF: 0x5947,\n    0x8AF0: 0x5B09,\n    0x8AF1: 0x5BC4,\n    0x8AF2: 0x5C90,\n    0x8AF3: 0x5E0C,\n    0x8AF4: 0x5E7E,\n    0x8AF5: 0x5FCC,\n    0x8AF6: 0x63EE,\n    0x8AF7: 0x673A,\n    0x8AF8: 0x65D7,\n    0x8AF9: 0x65E2,\n    0x8AFA: 0x671F,\n    0x8AFB: 0x68CB,\n    0x8AFC: 0x68C4,\n    0x8B40: 0x6A5F,\n    0x8B41: 0x5E30,\n    0x8B42: 0x6BC5,\n    0x8B43: 0x6C17,\n    0x8B44: 0x6C7D,\n    0x8B45: 0x757F,\n    0x8B46: 0x7948,\n    0x8B47: 0x5B63,\n    0x8B48: 0x7A00,\n    0x8B49: 0x7D00,\n    0x8B4A: 0x5FBD,\n    0x8B4B: 0x898F,\n    0x8B4C: 0x8A18,\n    0x8B4D: 0x8CB4,\n    0x8B4E: 0x8D77,\n    0x8B4F: 0x8ECC,\n    0x8B50: 0x8F1D,\n    0x8B51: 0x98E2,\n    0x8B52: 0x9A0E,\n    0x8B53: 0x9B3C,\n    0x8B54: 0x4E80,\n    0x8B55: 0x507D,\n    0x8B56: 0x5100,\n    0x8B57: 0x5993,\n    0x8B58: 0x5B9C,\n    0x8B59: 0x622F,\n    0x8B5A: 0x6280,\n    0x8B5B: 0x64EC,\n    0x8B5C: 0x6B3A,\n    0x8B5D: 0x72A0,\n    0x8B5E: 0x7591,\n    0x8B5F: 0x7947,\n    0x8B60: 0x7FA9,\n    0x8B61: 0x87FB,\n    0x8B62: 0x8ABC,\n    0x8B63: 0x8B70,\n    0x8B64: 0x63AC,\n    0x8B65: 0x83CA,\n    0x8B66: 0x97A0,\n    0x8B67: 0x5409,\n    0x8B68: 0x5403,\n    0x8B69: 0x55AB,\n    0x8B6A: 0x6854,\n    0x8B6B: 0x6A58,\n    0x8B6C: 0x8A70,\n    0x8B6D: 0x7827,\n    0x8B6E: 0x6775,\n    0x8B6F: 0x9ECD,\n    0x8B70: 0x5374,\n    0x8B71: 0x5BA2,\n    0x8B72: 0x811A,\n    0x8B73: 0x8650,\n    0x8B74: 0x9006,\n    0x8B75: 0x4E18,\n    0x8B76: 0x4E45,\n    0x8B77: 0x4EC7,\n    0x8B78: 0x4F11,\n    0x8B79: 0x53CA,\n    0x8B7A: 0x5438,\n    0x8B7B: 0x5BAE,\n    0x8B7C: 0x5F13,\n    0x8B7D: 0x6025,\n    0x8B7E: 0x6551,\n    0x8B80: 0x673D,\n    0x8B81: 0x6C42,\n    0x8B82: 0x6C72,\n    0x8B83: 0x6CE3,\n    0x8B84: 0x7078,\n    0x8B85: 0x7403,\n    0x8B86: 0x7A76,\n    0x8B87: 0x7AAE,\n    0x8B88: 0x7B08,\n    0x8B89: 0x7D1A,\n    0x8B8A: 0x7CFE,\n    0x8B8B: 0x7D66,\n    0x8B8C: 0x65E7,\n    0x8B8D: 0x725B,\n    0x8B8E: 0x53BB,\n    0x8B8F: 0x5C45,\n    0x8B90: 0x5DE8,\n    0x8B91: 0x62D2,\n    0x8B92: 0x62E0,\n    0x8B93: 0x6319,\n    0x8B94: 0x6E20,\n    0x8B95: 0x865A,\n    0x8B96: 0x8A31,\n    0x8B97: 0x8DDD,\n    0x8B98: 0x92F8,\n    0x8B99: 0x6F01,\n    0x8B9A: 0x79A6,\n    0x8B9B: 0x9B5A,\n    0x8B9C: 0x4EA8,\n    0x8B9D: 0x4EAB,\n    0x8B9E: 0x4EAC,\n    0x8B9F: 0x4F9B,\n    0x8BA0: 0x4FA0,\n    0x8BA1: 0x50D1,\n    0x8BA2: 0x5147,\n    0x8BA3: 0x7AF6,\n    0x8BA4: 0x5171,\n    0x8BA5: 0x51F6,\n    0x8BA6: 0x5354,\n    0x8BA7: 0x5321,\n    0x8BA8: 0x537F,\n    0x8BA9: 0x53EB,\n    0x8BAA: 0x55AC,\n    0x8BAB: 0x5883,\n    0x8BAC: 0x5CE1,\n    0x8BAD: 0x5F37,\n    0x8BAE: 0x5F4A,\n    0x8BAF: 0x602F,\n    0x8BB0: 0x6050,\n    0x8BB1: 0x606D,\n    0x8BB2: 0x631F,\n    0x8BB3: 0x6559,\n    0x8BB4: 0x6A4B,\n    0x8BB5: 0x6CC1,\n    0x8BB6: 0x72C2,\n    0x8BB7: 0x72ED,\n    0x8BB8: 0x77EF,\n    0x8BB9: 0x80F8,\n    0x8BBA: 0x8105,\n    0x8BBB: 0x8208,\n    0x8BBC: 0x854E,\n    0x8BBD: 0x90F7,\n    0x8BBE: 0x93E1,\n    0x8BBF: 0x97FF,\n    0x8BC0: 0x9957,\n    0x8BC1: 0x9A5A,\n    0x8BC2: 0x4EF0,\n    0x8BC3: 0x51DD,\n    0x8BC4: 0x5C2D,\n    0x8BC5: 0x6681,\n    0x8BC6: 0x696D,\n    0x8BC7: 0x5C40,\n    0x8BC8: 0x66F2,\n    0x8BC9: 0x6975,\n    0x8BCA: 0x7389,\n    0x8BCB: 0x6850,\n    0x8BCC: 0x7C81,\n    0x8BCD: 0x50C5,\n    0x8BCE: 0x52E4,\n    0x8BCF: 0x5747,\n    0x8BD0: 0x5DFE,\n    0x8BD1: 0x9326,\n    0x8BD2: 0x65A4,\n    0x8BD3: 0x6B23,\n    0x8BD4: 0x6B3D,\n    0x8BD5: 0x7434,\n    0x8BD6: 0x7981,\n    0x8BD7: 0x79BD,\n    0x8BD8: 0x7B4B,\n    0x8BD9: 0x7DCA,\n    0x8BDA: 0x82B9,\n    0x8BDB: 0x83CC,\n    0x8BDC: 0x887F,\n    0x8BDD: 0x895F,\n    0x8BDE: 0x8B39,\n    0x8BDF: 0x8FD1,\n    0x8BE0: 0x91D1,\n    0x8BE1: 0x541F,\n    0x8BE2: 0x9280,\n    0x8BE3: 0x4E5D,\n    0x8BE4: 0x5036,\n    0x8BE5: 0x53E5,\n    0x8BE6: 0x533A,\n    0x8BE7: 0x72D7,\n    0x8BE8: 0x7396,\n    0x8BE9: 0x77E9,\n    0x8BEA: 0x82E6,\n    0x8BEB: 0x8EAF,\n    0x8BEC: 0x99C6,\n    0x8BED: 0x99C8,\n    0x8BEE: 0x99D2,\n    0x8BEF: 0x5177,\n    0x8BF0: 0x611A,\n    0x8BF1: 0x865E,\n    0x8BF2: 0x55B0,\n    0x8BF3: 0x7A7A,\n    0x8BF4: 0x5076,\n    0x8BF5: 0x5BD3,\n    0x8BF6: 0x9047,\n    0x8BF7: 0x9685,\n    0x8BF8: 0x4E32,\n    0x8BF9: 0x6ADB,\n    0x8BFA: 0x91E7,\n    0x8BFB: 0x5C51,\n    0x8BFC: 0x5C48,\n    0x8C40: 0x6398,\n    0x8C41: 0x7A9F,\n    0x8C42: 0x6C93,\n    0x8C43: 0x9774,\n    0x8C44: 0x8F61,\n    0x8C45: 0x7AAA,\n    0x8C46: 0x718A,\n    0x8C47: 0x9688,\n    0x8C48: 0x7C82,\n    0x8C49: 0x6817,\n    0x8C4A: 0x7E70,\n    0x8C4B: 0x6851,\n    0x8C4C: 0x936C,\n    0x8C4D: 0x52F2,\n    0x8C4E: 0x541B,\n    0x8C4F: 0x85AB,\n    0x8C50: 0x8A13,\n    0x8C51: 0x7FA4,\n    0x8C52: 0x8ECD,\n    0x8C53: 0x90E1,\n    0x8C54: 0x5366,\n    0x8C55: 0x8888,\n    0x8C56: 0x7941,\n    0x8C57: 0x4FC2,\n    0x8C58: 0x50BE,\n    0x8C59: 0x5211,\n    0x8C5A: 0x5144,\n    0x8C5B: 0x5553,\n    0x8C5C: 0x572D,\n    0x8C5D: 0x73EA,\n    0x8C5E: 0x578B,\n    0x8C5F: 0x5951,\n    0x8C60: 0x5F62,\n    0x8C61: 0x5F84,\n    0x8C62: 0x6075,\n    0x8C63: 0x6176,\n    0x8C64: 0x6167,\n    0x8C65: 0x61A9,\n    0x8C66: 0x63B2,\n    0x8C67: 0x643A,\n    0x8C68: 0x656C,\n    0x8C69: 0x666F,\n    0x8C6A: 0x6842,\n    0x8C6B: 0x6E13,\n    0x8C6C: 0x7566,\n    0x8C6D: 0x7A3D,\n    0x8C6E: 0x7CFB,\n    0x8C6F: 0x7D4C,\n    0x8C70: 0x7D99,\n    0x8C71: 0x7E4B,\n    0x8C72: 0x7F6B,\n    0x8C73: 0x830E,\n    0x8C74: 0x834A,\n    0x8C75: 0x86CD,\n    0x8C76: 0x8A08,\n    0x8C77: 0x8A63,\n    0x8C78: 0x8B66,\n    0x8C79: 0x8EFD,\n    0x8C7A: 0x981A,\n    0x8C7B: 0x9D8F,\n    0x8C7C: 0x82B8,\n    0x8C7D: 0x8FCE,\n    0x8C7E: 0x9BE8,\n    0x8C80: 0x5287,\n    0x8C81: 0x621F,\n    0x8C82: 0x6483,\n    0x8C83: 0x6FC0,\n    0x8C84: 0x9699,\n    0x8C85: 0x6841,\n    0x8C86: 0x5091,\n    0x8C87: 0x6B20,\n    0x8C88: 0x6C7A,\n    0x8C89: 0x6F54,\n    0x8C8A: 0x7A74,\n    0x8C8B: 0x7D50,\n    0x8C8C: 0x8840,\n    0x8C8D: 0x8A23,\n    0x8C8E: 0x6708,\n    0x8C8F: 0x4EF6,\n    0x8C90: 0x5039,\n    0x8C91: 0x5026,\n    0x8C92: 0x5065,\n    0x8C93: 0x517C,\n    0x8C94: 0x5238,\n    0x8C95: 0x5263,\n    0x8C96: 0x55A7,\n    0x8C97: 0x570F,\n    0x8C98: 0x5805,\n    0x8C99: 0x5ACC,\n    0x8C9A: 0x5EFA,\n    0x8C9B: 0x61B2,\n    0x8C9C: 0x61F8,\n    0x8C9D: 0x62F3,\n    0x8C9E: 0x6372,\n    0x8C9F: 0x691C,\n    0x8CA0: 0x6A29,\n    0x8CA1: 0x727D,\n    0x8CA2: 0x72AC,\n    0x8CA3: 0x732E,\n    0x8CA4: 0x7814,\n    0x8CA5: 0x786F,\n    0x8CA6: 0x7D79,\n    0x8CA7: 0x770C,\n    0x8CA8: 0x80A9,\n    0x8CA9: 0x898B,\n    0x8CAA: 0x8B19,\n    0x8CAB: 0x8CE2,\n    0x8CAC: 0x8ED2,\n    0x8CAD: 0x9063,\n    0x8CAE: 0x9375,\n    0x8CAF: 0x967A,\n    0x8CB0: 0x9855,\n    0x8CB1: 0x9A13,\n    0x8CB2: 0x9E78,\n    0x8CB3: 0x5143,\n    0x8CB4: 0x539F,\n    0x8CB5: 0x53B3,\n    0x8CB6: 0x5E7B,\n    0x8CB7: 0x5F26,\n    0x8CB8: 0x6E1B,\n    0x8CB9: 0x6E90,\n    0x8CBA: 0x7384,\n    0x8CBB: 0x73FE,\n    0x8CBC: 0x7D43,\n    0x8CBD: 0x8237,\n    0x8CBE: 0x8A00,\n    0x8CBF: 0x8AFA,\n    0x8CC0: 0x9650,\n    0x8CC1: 0x4E4E,\n    0x8CC2: 0x500B,\n    0x8CC3: 0x53E4,\n    0x8CC4: 0x547C,\n    0x8CC5: 0x56FA,\n    0x8CC6: 0x59D1,\n    0x8CC7: 0x5B64,\n    0x8CC8: 0x5DF1,\n    0x8CC9: 0x5EAB,\n    0x8CCA: 0x5F27,\n    0x8CCB: 0x6238,\n    0x8CCC: 0x6545,\n    0x8CCD: 0x67AF,\n    0x8CCE: 0x6E56,\n    0x8CCF: 0x72D0,\n    0x8CD0: 0x7CCA,\n    0x8CD1: 0x88B4,\n    0x8CD2: 0x80A1,\n    0x8CD3: 0x80E1,\n    0x8CD4: 0x83F0,\n    0x8CD5: 0x864E,\n    0x8CD6: 0x8A87,\n    0x8CD7: 0x8DE8,\n    0x8CD8: 0x9237,\n    0x8CD9: 0x96C7,\n    0x8CDA: 0x9867,\n    0x8CDB: 0x9F13,\n    0x8CDC: 0x4E94,\n    0x8CDD: 0x4E92,\n    0x8CDE: 0x4F0D,\n    0x8CDF: 0x5348,\n    0x8CE0: 0x5449,\n    0x8CE1: 0x543E,\n    0x8CE2: 0x5A2F,\n    0x8CE3: 0x5F8C,\n    0x8CE4: 0x5FA1,\n    0x8CE5: 0x609F,\n    0x8CE6: 0x68A7,\n    0x8CE7: 0x6A8E,\n    0x8CE8: 0x745A,\n    0x8CE9: 0x7881,\n    0x8CEA: 0x8A9E,\n    0x8CEB: 0x8AA4,\n    0x8CEC: 0x8B77,\n    0x8CED: 0x9190,\n    0x8CEE: 0x4E5E,\n    0x8CEF: 0x9BC9,\n    0x8CF0: 0x4EA4,\n    0x8CF1: 0x4F7C,\n    0x8CF2: 0x4FAF,\n    0x8CF3: 0x5019,\n    0x8CF4: 0x5016,\n    0x8CF5: 0x5149,\n    0x8CF6: 0x516C,\n    0x8CF7: 0x529F,\n    0x8CF8: 0x52B9,\n    0x8CF9: 0x52FE,\n    0x8CFA: 0x539A,\n    0x8CFB: 0x53E3,\n    0x8CFC: 0x5411,\n    0x8D40: 0x540E,\n    0x8D41: 0x5589,\n    0x8D42: 0x5751,\n    0x8D43: 0x57A2,\n    0x8D44: 0x597D,\n    0x8D45: 0x5B54,\n    0x8D46: 0x5B5D,\n    0x8D47: 0x5B8F,\n    0x8D48: 0x5DE5,\n    0x8D49: 0x5DE7,\n    0x8D4A: 0x5DF7,\n    0x8D4B: 0x5E78,\n    0x8D4C: 0x5E83,\n    0x8D4D: 0x5E9A,\n    0x8D4E: 0x5EB7,\n    0x8D4F: 0x5F18,\n    0x8D50: 0x6052,\n    0x8D51: 0x614C,\n    0x8D52: 0x6297,\n    0x8D53: 0x62D8,\n    0x8D54: 0x63A7,\n    0x8D55: 0x653B,\n    0x8D56: 0x6602,\n    0x8D57: 0x6643,\n    0x8D58: 0x66F4,\n    0x8D59: 0x676D,\n    0x8D5A: 0x6821,\n    0x8D5B: 0x6897,\n    0x8D5C: 0x69CB,\n    0x8D5D: 0x6C5F,\n    0x8D5E: 0x6D2A,\n    0x8D5F: 0x6D69,\n    0x8D60: 0x6E2F,\n    0x8D61: 0x6E9D,\n    0x8D62: 0x7532,\n    0x8D63: 0x7687,\n    0x8D64: 0x786C,\n    0x8D65: 0x7A3F,\n    0x8D66: 0x7CE0,\n    0x8D67: 0x7D05,\n    0x8D68: 0x7D18,\n    0x8D69: 0x7D5E,\n    0x8D6A: 0x7DB1,\n    0x8D6B: 0x8015,\n    0x8D6C: 0x8003,\n    0x8D6D: 0x80AF,\n    0x8D6E: 0x80B1,\n    0x8D6F: 0x8154,\n    0x8D70: 0x818F,\n    0x8D71: 0x822A,\n    0x8D72: 0x8352,\n    0x8D73: 0x884C,\n    0x8D74: 0x8861,\n    0x8D75: 0x8B1B,\n    0x8D76: 0x8CA2,\n    0x8D77: 0x8CFC,\n    0x8D78: 0x90CA,\n    0x8D79: 0x9175,\n    0x8D7A: 0x9271,\n    0x8D7B: 0x783F,\n    0x8D7C: 0x92FC,\n    0x8D7D: 0x95A4,\n    0x8D7E: 0x964D,\n    0x8D80: 0x9805,\n    0x8D81: 0x9999,\n    0x8D82: 0x9AD8,\n    0x8D83: 0x9D3B,\n    0x8D84: 0x525B,\n    0x8D85: 0x52AB,\n    0x8D86: 0x53F7,\n    0x8D87: 0x5408,\n    0x8D88: 0x58D5,\n    0x8D89: 0x62F7,\n    0x8D8A: 0x6FE0,\n    0x8D8B: 0x8C6A,\n    0x8D8C: 0x8F5F,\n    0x8D8D: 0x9EB9,\n    0x8D8E: 0x514B,\n    0x8D8F: 0x523B,\n    0x8D90: 0x544A,\n    0x8D91: 0x56FD,\n    0x8D92: 0x7A40,\n    0x8D93: 0x9177,\n    0x8D94: 0x9D60,\n    0x8D95: 0x9ED2,\n    0x8D96: 0x7344,\n    0x8D97: 0x6F09,\n    0x8D98: 0x8170,\n    0x8D99: 0x7511,\n    0x8D9A: 0x5FFD,\n    0x8D9B: 0x60DA,\n    0x8D9C: 0x9AA8,\n    0x8D9D: 0x72DB,\n    0x8D9E: 0x8FBC,\n    0x8D9F: 0x6B64,\n    0x8DA0: 0x9803,\n    0x8DA1: 0x4ECA,\n    0x8DA2: 0x56F0,\n    0x8DA3: 0x5764,\n    0x8DA4: 0x58BE,\n    0x8DA5: 0x5A5A,\n    0x8DA6: 0x6068,\n    0x8DA7: 0x61C7,\n    0x8DA8: 0x660F,\n    0x8DA9: 0x6606,\n    0x8DAA: 0x6839,\n    0x8DAB: 0x68B1,\n    0x8DAC: 0x6DF7,\n    0x8DAD: 0x75D5,\n    0x8DAE: 0x7D3A,\n    0x8DAF: 0x826E,\n    0x8DB0: 0x9B42,\n    0x8DB1: 0x4E9B,\n    0x8DB2: 0x4F50,\n    0x8DB3: 0x53C9,\n    0x8DB4: 0x5506,\n    0x8DB5: 0x5D6F,\n    0x8DB6: 0x5DE6,\n    0x8DB7: 0x5DEE,\n    0x8DB8: 0x67FB,\n    0x8DB9: 0x6C99,\n    0x8DBA: 0x7473,\n    0x8DBB: 0x7802,\n    0x8DBC: 0x8A50,\n    0x8DBD: 0x9396,\n    0x8DBE: 0x88DF,\n    0x8DBF: 0x5750,\n    0x8DC0: 0x5EA7,\n    0x8DC1: 0x632B,\n    0x8DC2: 0x50B5,\n    0x8DC3: 0x50AC,\n    0x8DC4: 0x518D,\n    0x8DC5: 0x6700,\n    0x8DC6: 0x54C9,\n    0x8DC7: 0x585E,\n    0x8DC8: 0x59BB,\n    0x8DC9: 0x5BB0,\n    0x8DCA: 0x5F69,\n    0x8DCB: 0x624D,\n    0x8DCC: 0x63A1,\n    0x8DCD: 0x683D,\n    0x8DCE: 0x6B73,\n    0x8DCF: 0x6E08,\n    0x8DD0: 0x707D,\n    0x8DD1: 0x91C7,\n    0x8DD2: 0x7280,\n    0x8DD3: 0x7815,\n    0x8DD4: 0x7826,\n    0x8DD5: 0x796D,\n    0x8DD6: 0x658E,\n    0x8DD7: 0x7D30,\n    0x8DD8: 0x83DC,\n    0x8DD9: 0x88C1,\n    0x8DDA: 0x8F09,\n    0x8DDB: 0x969B,\n    0x8DDC: 0x5264,\n    0x8DDD: 0x5728,\n    0x8DDE: 0x6750,\n    0x8DDF: 0x7F6A,\n    0x8DE0: 0x8CA1,\n    0x8DE1: 0x51B4,\n    0x8DE2: 0x5742,\n    0x8DE3: 0x962A,\n    0x8DE4: 0x583A,\n    0x8DE5: 0x698A,\n    0x8DE6: 0x80B4,\n    0x8DE7: 0x54B2,\n    0x8DE8: 0x5D0E,\n    0x8DE9: 0x57FC,\n    0x8DEA: 0x7895,\n    0x8DEB: 0x9DFA,\n    0x8DEC: 0x4F5C,\n    0x8DED: 0x524A,\n    0x8DEE: 0x548B,\n    0x8DEF: 0x643E,\n    0x8DF0: 0x6628,\n    0x8DF1: 0x6714,\n    0x8DF2: 0x67F5,\n    0x8DF3: 0x7A84,\n    0x8DF4: 0x7B56,\n    0x8DF5: 0x7D22,\n    0x8DF6: 0x932F,\n    0x8DF7: 0x685C,\n    0x8DF8: 0x9BAD,\n    0x8DF9: 0x7B39,\n    0x8DFA: 0x5319,\n    0x8DFB: 0x518A,\n    0x8DFC: 0x5237,\n    0x8E40: 0x5BDF,\n    0x8E41: 0x62F6,\n    0x8E42: 0x64AE,\n    0x8E43: 0x64E6,\n    0x8E44: 0x672D,\n    0x8E45: 0x6BBA,\n    0x8E46: 0x85A9,\n    0x8E47: 0x96D1,\n    0x8E48: 0x7690,\n    0x8E49: 0x9BD6,\n    0x8E4A: 0x634C,\n    0x8E4B: 0x9306,\n    0x8E4C: 0x9BAB,\n    0x8E4D: 0x76BF,\n    0x8E4E: 0x6652,\n    0x8E4F: 0x4E09,\n    0x8E50: 0x5098,\n    0x8E51: 0x53C2,\n    0x8E52: 0x5C71,\n    0x8E53: 0x60E8,\n    0x8E54: 0x6492,\n    0x8E55: 0x6563,\n    0x8E56: 0x685F,\n    0x8E57: 0x71E6,\n    0x8E58: 0x73CA,\n    0x8E59: 0x7523,\n    0x8E5A: 0x7B97,\n    0x8E5B: 0x7E82,\n    0x8E5C: 0x8695,\n    0x8E5D: 0x8B83,\n    0x8E5E: 0x8CDB,\n    0x8E5F: 0x9178,\n    0x8E60: 0x9910,\n    0x8E61: 0x65AC,\n    0x8E62: 0x66AB,\n    0x8E63: 0x6B8B,\n    0x8E64: 0x4ED5,\n    0x8E65: 0x4ED4,\n    0x8E66: 0x4F3A,\n    0x8E67: 0x4F7F,\n    0x8E68: 0x523A,\n    0x8E69: 0x53F8,\n    0x8E6A: 0x53F2,\n    0x8E6B: 0x55E3,\n    0x8E6C: 0x56DB,\n    0x8E6D: 0x58EB,\n    0x8E6E: 0x59CB,\n    0x8E6F: 0x59C9,\n    0x8E70: 0x59FF,\n    0x8E71: 0x5B50,\n    0x8E72: 0x5C4D,\n    0x8E73: 0x5E02,\n    0x8E74: 0x5E2B,\n    0x8E75: 0x5FD7,\n    0x8E76: 0x601D,\n    0x8E77: 0x6307,\n    0x8E78: 0x652F,\n    0x8E79: 0x5B5C,\n    0x8E7A: 0x65AF,\n    0x8E7B: 0x65BD,\n    0x8E7C: 0x65E8,\n    0x8E7D: 0x679D,\n    0x8E7E: 0x6B62,\n    0x8E80: 0x6B7B,\n    0x8E81: 0x6C0F,\n    0x8E82: 0x7345,\n    0x8E83: 0x7949,\n    0x8E84: 0x79C1,\n    0x8E85: 0x7CF8,\n    0x8E86: 0x7D19,\n    0x8E87: 0x7D2B,\n    0x8E88: 0x80A2,\n    0x8E89: 0x8102,\n    0x8E8A: 0x81F3,\n    0x8E8B: 0x8996,\n    0x8E8C: 0x8A5E,\n    0x8E8D: 0x8A69,\n    0x8E8E: 0x8A66,\n    0x8E8F: 0x8A8C,\n    0x8E90: 0x8AEE,\n    0x8E91: 0x8CC7,\n    0x8E92: 0x8CDC,\n    0x8E93: 0x96CC,\n    0x8E94: 0x98FC,\n    0x8E95: 0x6B6F,\n    0x8E96: 0x4E8B,\n    0x8E97: 0x4F3C,\n    0x8E98: 0x4F8D,\n    0x8E99: 0x5150,\n    0x8E9A: 0x5B57,\n    0x8E9B: 0x5BFA,\n    0x8E9C: 0x6148,\n    0x8E9D: 0x6301,\n    0x8E9E: 0x6642,\n    0x8E9F: 0x6B21,\n    0x8EA0: 0x6ECB,\n    0x8EA1: 0x6CBB,\n    0x8EA2: 0x723E,\n    0x8EA3: 0x74BD,\n    0x8EA4: 0x75D4,\n    0x8EA5: 0x78C1,\n    0x8EA6: 0x793A,\n    0x8EA7: 0x800C,\n    0x8EA8: 0x8033,\n    0x8EA9: 0x81EA,\n    0x8EAA: 0x8494,\n    0x8EAB: 0x8F9E,\n    0x8EAC: 0x6C50,\n    0x8EAD: 0x9E7F,\n    0x8EAE: 0x5F0F,\n    0x8EAF: 0x8B58,\n    0x8EB0: 0x9D2B,\n    0x8EB1: 0x7AFA,\n    0x8EB2: 0x8EF8,\n    0x8EB3: 0x5B8D,\n    0x8EB4: 0x96EB,\n    0x8EB5: 0x4E03,\n    0x8EB6: 0x53F1,\n    0x8EB7: 0x57F7,\n    0x8EB8: 0x5931,\n    0x8EB9: 0x5AC9,\n    0x8EBA: 0x5BA4,\n    0x8EBB: 0x6089,\n    0x8EBC: 0x6E7F,\n    0x8EBD: 0x6F06,\n    0x8EBE: 0x75BE,\n    0x8EBF: 0x8CEA,\n    0x8EC0: 0x5B9F,\n    0x8EC1: 0x8500,\n    0x8EC2: 0x7BE0,\n    0x8EC3: 0x5072,\n    0x8EC4: 0x67F4,\n    0x8EC5: 0x829D,\n    0x8EC6: 0x5C61,\n    0x8EC7: 0x854A,\n    0x8EC8: 0x7E1E,\n    0x8EC9: 0x820E,\n    0x8ECA: 0x5199,\n    0x8ECB: 0x5C04,\n    0x8ECC: 0x6368,\n    0x8ECD: 0x8D66,\n    0x8ECE: 0x659C,\n    0x8ECF: 0x716E,\n    0x8ED0: 0x793E,\n    0x8ED1: 0x7D17,\n    0x8ED2: 0x8005,\n    0x8ED3: 0x8B1D,\n    0x8ED4: 0x8ECA,\n    0x8ED5: 0x906E,\n    0x8ED6: 0x86C7,\n    0x8ED7: 0x90AA,\n    0x8ED8: 0x501F,\n    0x8ED9: 0x52FA,\n    0x8EDA: 0x5C3A,\n    0x8EDB: 0x6753,\n    0x8EDC: 0x707C,\n    0x8EDD: 0x7235,\n    0x8EDE: 0x914C,\n    0x8EDF: 0x91C8,\n    0x8EE0: 0x932B,\n    0x8EE1: 0x82E5,\n    0x8EE2: 0x5BC2,\n    0x8EE3: 0x5F31,\n    0x8EE4: 0x60F9,\n    0x8EE5: 0x4E3B,\n    0x8EE6: 0x53D6,\n    0x8EE7: 0x5B88,\n    0x8EE8: 0x624B,\n    0x8EE9: 0x6731,\n    0x8EEA: 0x6B8A,\n    0x8EEB: 0x72E9,\n    0x8EEC: 0x73E0,\n    0x8EED: 0x7A2E,\n    0x8EEE: 0x816B,\n    0x8EEF: 0x8DA3,\n    0x8EF0: 0x9152,\n    0x8EF1: 0x9996,\n    0x8EF2: 0x5112,\n    0x8EF3: 0x53D7,\n    0x8EF4: 0x546A,\n    0x8EF5: 0x5BFF,\n    0x8EF6: 0x6388,\n    0x8EF7: 0x6A39,\n    0x8EF8: 0x7DAC,\n    0x8EF9: 0x9700,\n    0x8EFA: 0x56DA,\n    0x8EFB: 0x53CE,\n    0x8EFC: 0x5468,\n    0x8F40: 0x5B97,\n    0x8F41: 0x5C31,\n    0x8F42: 0x5DDE,\n    0x8F43: 0x4FEE,\n    0x8F44: 0x6101,\n    0x8F45: 0x62FE,\n    0x8F46: 0x6D32,\n    0x8F47: 0x79C0,\n    0x8F48: 0x79CB,\n    0x8F49: 0x7D42,\n    0x8F4A: 0x7E4D,\n    0x8F4B: 0x7FD2,\n    0x8F4C: 0x81ED,\n    0x8F4D: 0x821F,\n    0x8F4E: 0x8490,\n    0x8F4F: 0x8846,\n    0x8F50: 0x8972,\n    0x8F51: 0x8B90,\n    0x8F52: 0x8E74,\n    0x8F53: 0x8F2F,\n    0x8F54: 0x9031,\n    0x8F55: 0x914B,\n    0x8F56: 0x916C,\n    0x8F57: 0x96C6,\n    0x8F58: 0x919C,\n    0x8F59: 0x4EC0,\n    0x8F5A: 0x4F4F,\n    0x8F5B: 0x5145,\n    0x8F5C: 0x5341,\n    0x8F5D: 0x5F93,\n    0x8F5E: 0x620E,\n    0x8F5F: 0x67D4,\n    0x8F60: 0x6C41,\n    0x8F61: 0x6E0B,\n    0x8F62: 0x7363,\n    0x8F63: 0x7E26,\n    0x8F64: 0x91CD,\n    0x8F65: 0x9283,\n    0x8F66: 0x53D4,\n    0x8F67: 0x5919,\n    0x8F68: 0x5BBF,\n    0x8F69: 0x6DD1,\n    0x8F6A: 0x795D,\n    0x8F6B: 0x7E2E,\n    0x8F6C: 0x7C9B,\n    0x8F6D: 0x587E,\n    0x8F6E: 0x719F,\n    0x8F6F: 0x51FA,\n    0x8F70: 0x8853,\n    0x8F71: 0x8FF0,\n    0x8F72: 0x4FCA,\n    0x8F73: 0x5CFB,\n    0x8F74: 0x6625,\n    0x8F75: 0x77AC,\n    0x8F76: 0x7AE3,\n    0x8F77: 0x821C,\n    0x8F78: 0x99FF,\n    0x8F79: 0x51C6,\n    0x8F7A: 0x5FAA,\n    0x8F7B: 0x65EC,\n    0x8F7C: 0x696F,\n    0x8F7D: 0x6B89,\n    0x8F7E: 0x6DF3,\n    0x8F80: 0x6E96,\n    0x8F81: 0x6F64,\n    0x8F82: 0x76FE,\n    0x8F83: 0x7D14,\n    0x8F84: 0x5DE1,\n    0x8F85: 0x9075,\n    0x8F86: 0x9187,\n    0x8F87: 0x9806,\n    0x8F88: 0x51E6,\n    0x8F89: 0x521D,\n    0x8F8A: 0x6240,\n    0x8F8B: 0x6691,\n    0x8F8C: 0x66D9,\n    0x8F8D: 0x6E1A,\n    0x8F8E: 0x5EB6,\n    0x8F8F: 0x7DD2,\n    0x8F90: 0x7F72,\n    0x8F91: 0x66F8,\n    0x8F92: 0x85AF,\n    0x8F93: 0x85F7,\n    0x8F94: 0x8AF8,\n    0x8F95: 0x52A9,\n    0x8F96: 0x53D9,\n    0x8F97: 0x5973,\n    0x8F98: 0x5E8F,\n    0x8F99: 0x5F90,\n    0x8F9A: 0x6055,\n    0x8F9B: 0x92E4,\n    0x8F9C: 0x9664,\n    0x8F9D: 0x50B7,\n    0x8F9E: 0x511F,\n    0x8F9F: 0x52DD,\n    0x8FA0: 0x5320,\n    0x8FA1: 0x5347,\n    0x8FA2: 0x53EC,\n    0x8FA3: 0x54E8,\n    0x8FA4: 0x5546,\n    0x8FA5: 0x5531,\n    0x8FA6: 0x5617,\n    0x8FA7: 0x5968,\n    0x8FA8: 0x59BE,\n    0x8FA9: 0x5A3C,\n    0x8FAA: 0x5BB5,\n    0x8FAB: 0x5C06,\n    0x8FAC: 0x5C0F,\n    0x8FAD: 0x5C11,\n    0x8FAE: 0x5C1A,\n    0x8FAF: 0x5E84,\n    0x8FB0: 0x5E8A,\n    0x8FB1: 0x5EE0,\n    0x8FB2: 0x5F70,\n    0x8FB3: 0x627F,\n    0x8FB4: 0x6284,\n    0x8FB5: 0x62DB,\n    0x8FB6: 0x638C,\n    0x8FB7: 0x6377,\n    0x8FB8: 0x6607,\n    0x8FB9: 0x660C,\n    0x8FBA: 0x662D,\n    0x8FBB: 0x6676,\n    0x8FBC: 0x677E,\n    0x8FBD: 0x68A2,\n    0x8FBE: 0x6A1F,\n    0x8FBF: 0x6A35,\n    0x8FC0: 0x6CBC,\n    0x8FC1: 0x6D88,\n    0x8FC2: 0x6E09,\n    0x8FC3: 0x6E58,\n    0x8FC4: 0x713C,\n    0x8FC5: 0x7126,\n    0x8FC6: 0x7167,\n    0x8FC7: 0x75C7,\n    0x8FC8: 0x7701,\n    0x8FC9: 0x785D,\n    0x8FCA: 0x7901,\n    0x8FCB: 0x7965,\n    0x8FCC: 0x79F0,\n    0x8FCD: 0x7AE0,\n    0x8FCE: 0x7B11,\n    0x8FCF: 0x7CA7,\n    0x8FD0: 0x7D39,\n    0x8FD1: 0x8096,\n    0x8FD2: 0x83D6,\n    0x8FD3: 0x848B,\n    0x8FD4: 0x8549,\n    0x8FD5: 0x885D,\n    0x8FD6: 0x88F3,\n    0x8FD7: 0x8A1F,\n    0x8FD8: 0x8A3C,\n    0x8FD9: 0x8A54,\n    0x8FDA: 0x8A73,\n    0x8FDB: 0x8C61,\n    0x8FDC: 0x8CDE,\n    0x8FDD: 0x91A4,\n    0x8FDE: 0x9266,\n    0x8FDF: 0x937E,\n    0x8FE0: 0x9418,\n    0x8FE1: 0x969C,\n    0x8FE2: 0x9798,\n    0x8FE3: 0x4E0A,\n    0x8FE4: 0x4E08,\n    0x8FE5: 0x4E1E,\n    0x8FE6: 0x4E57,\n    0x8FE7: 0x5197,\n    0x8FE8: 0x5270,\n    0x8FE9: 0x57CE,\n    0x8FEA: 0x5834,\n    0x8FEB: 0x58CC,\n    0x8FEC: 0x5B22,\n    0x8FED: 0x5E38,\n    0x8FEE: 0x60C5,\n    0x8FEF: 0x64FE,\n    0x8FF0: 0x6761,\n    0x8FF1: 0x6756,\n    0x8FF2: 0x6D44,\n    0x8FF3: 0x72B6,\n    0x8FF4: 0x7573,\n    0x8FF5: 0x7A63,\n    0x8FF6: 0x84B8,\n    0x8FF7: 0x8B72,\n    0x8FF8: 0x91B8,\n    0x8FF9: 0x9320,\n    0x8FFA: 0x5631,\n    0x8FFB: 0x57F4,\n    0x8FFC: 0x98FE,\n    0x9040: 0x62ED,\n    0x9041: 0x690D,\n    0x9042: 0x6B96,\n    0x9043: 0x71ED,\n    0x9044: 0x7E54,\n    0x9045: 0x8077,\n    0x9046: 0x8272,\n    0x9047: 0x89E6,\n    0x9048: 0x98DF,\n    0x9049: 0x8755,\n    0x904A: 0x8FB1,\n    0x904B: 0x5C3B,\n    0x904C: 0x4F38,\n    0x904D: 0x4FE1,\n    0x904E: 0x4FB5,\n    0x904F: 0x5507,\n    0x9050: 0x5A20,\n    0x9051: 0x5BDD,\n    0x9052: 0x5BE9,\n    0x9053: 0x5FC3,\n    0x9054: 0x614E,\n    0x9055: 0x632F,\n    0x9056: 0x65B0,\n    0x9057: 0x664B,\n    0x9058: 0x68EE,\n    0x9059: 0x699B,\n    0x905A: 0x6D78,\n    0x905B: 0x6DF1,\n    0x905C: 0x7533,\n    0x905D: 0x75B9,\n    0x905E: 0x771F,\n    0x905F: 0x795E,\n    0x9060: 0x79E6,\n    0x9061: 0x7D33,\n    0x9062: 0x81E3,\n    0x9063: 0x82AF,\n    0x9064: 0x85AA,\n    0x9065: 0x89AA,\n    0x9066: 0x8A3A,\n    0x9067: 0x8EAB,\n    0x9068: 0x8F9B,\n    0x9069: 0x9032,\n    0x906A: 0x91DD,\n    0x906B: 0x9707,\n    0x906C: 0x4EBA,\n    0x906D: 0x4EC1,\n    0x906E: 0x5203,\n    0x906F: 0x5875,\n    0x9070: 0x58EC,\n    0x9071: 0x5C0B,\n    0x9072: 0x751A,\n    0x9073: 0x5C3D,\n    0x9074: 0x814E,\n    0x9075: 0x8A0A,\n    0x9076: 0x8FC5,\n    0x9077: 0x9663,\n    0x9078: 0x976D,\n    0x9079: 0x7B25,\n    0x907A: 0x8ACF,\n    0x907B: 0x9808,\n    0x907C: 0x9162,\n    0x907D: 0x56F3,\n    0x907E: 0x53A8,\n    0x9080: 0x9017,\n    0x9081: 0x5439,\n    0x9082: 0x5782,\n    0x9083: 0x5E25,\n    0x9084: 0x63A8,\n    0x9085: 0x6C34,\n    0x9086: 0x708A,\n    0x9087: 0x7761,\n    0x9088: 0x7C8B,\n    0x9089: 0x7FE0,\n    0x908A: 0x8870,\n    0x908B: 0x9042,\n    0x908C: 0x9154,\n    0x908D: 0x9310,\n    0x908E: 0x9318,\n    0x908F: 0x968F,\n    0x9090: 0x745E,\n    0x9091: 0x9AC4,\n    0x9092: 0x5D07,\n    0x9093: 0x5D69,\n    0x9094: 0x6570,\n    0x9095: 0x67A2,\n    0x9096: 0x8DA8,\n    0x9097: 0x96DB,\n    0x9098: 0x636E,\n    0x9099: 0x6749,\n    0x909A: 0x6919,\n    0x909B: 0x83C5,\n    0x909C: 0x9817,\n    0x909D: 0x96C0,\n    0x909E: 0x88FE,\n    0x909F: 0x6F84,\n    0x90A0: 0x647A,\n    0x90A1: 0x5BF8,\n    0x90A2: 0x4E16,\n    0x90A3: 0x702C,\n    0x90A4: 0x755D,\n    0x90A5: 0x662F,\n    0x90A6: 0x51C4,\n    0x90A7: 0x5236,\n    0x90A8: 0x52E2,\n    0x90A9: 0x59D3,\n    0x90AA: 0x5F81,\n    0x90AB: 0x6027,\n    0x90AC: 0x6210,\n    0x90AD: 0x653F,\n    0x90AE: 0x6574,\n    0x90AF: 0x661F,\n    0x90B0: 0x6674,\n    0x90B1: 0x68F2,\n    0x90B2: 0x6816,\n    0x90B3: 0x6B63,\n    0x90B4: 0x6E05,\n    0x90B5: 0x7272,\n    0x90B6: 0x751F,\n    0x90B7: 0x76DB,\n    0x90B8: 0x7CBE,\n    0x90B9: 0x8056,\n    0x90BA: 0x58F0,\n    0x90BB: 0x88FD,\n    0x90BC: 0x897F,\n    0x90BD: 0x8AA0,\n    0x90BE: 0x8A93,\n    0x90BF: 0x8ACB,\n    0x90C0: 0x901D,\n    0x90C1: 0x9192,\n    0x90C2: 0x9752,\n    0x90C3: 0x9759,\n    0x90C4: 0x6589,\n    0x90C5: 0x7A0E,\n    0x90C6: 0x8106,\n    0x90C7: 0x96BB,\n    0x90C8: 0x5E2D,\n    0x90C9: 0x60DC,\n    0x90CA: 0x621A,\n    0x90CB: 0x65A5,\n    0x90CC: 0x6614,\n    0x90CD: 0x6790,\n    0x90CE: 0x77F3,\n    0x90CF: 0x7A4D,\n    0x90D0: 0x7C4D,\n    0x90D1: 0x7E3E,\n    0x90D2: 0x810A,\n    0x90D3: 0x8CAC,\n    0x90D4: 0x8D64,\n    0x90D5: 0x8DE1,\n    0x90D6: 0x8E5F,\n    0x90D7: 0x78A9,\n    0x90D8: 0x5207,\n    0x90D9: 0x62D9,\n    0x90DA: 0x63A5,\n    0x90DB: 0x6442,\n    0x90DC: 0x6298,\n    0x90DD: 0x8A2D,\n    0x90DE: 0x7A83,\n    0x90DF: 0x7BC0,\n    0x90E0: 0x8AAC,\n    0x90E1: 0x96EA,\n    0x90E2: 0x7D76,\n    0x90E3: 0x820C,\n    0x90E4: 0x8749,\n    0x90E5: 0x4ED9,\n    0x90E6: 0x5148,\n    0x90E7: 0x5343,\n    0x90E8: 0x5360,\n    0x90E9: 0x5BA3,\n    0x90EA: 0x5C02,\n    0x90EB: 0x5C16,\n    0x90EC: 0x5DDD,\n    0x90ED: 0x6226,\n    0x90EE: 0x6247,\n    0x90EF: 0x64B0,\n    0x90F0: 0x6813,\n    0x90F1: 0x6834,\n    0x90F2: 0x6CC9,\n    0x90F3: 0x6D45,\n    0x90F4: 0x6D17,\n    0x90F5: 0x67D3,\n    0x90F6: 0x6F5C,\n    0x90F7: 0x714E,\n    0x90F8: 0x717D,\n    0x90F9: 0x65CB,\n    0x90FA: 0x7A7F,\n    0x90FB: 0x7BAD,\n    0x90FC: 0x7DDA,\n    0x9140: 0x7E4A,\n    0x9141: 0x7FA8,\n    0x9142: 0x817A,\n    0x9143: 0x821B,\n    0x9144: 0x8239,\n    0x9145: 0x85A6,\n    0x9146: 0x8A6E,\n    0x9147: 0x8CCE,\n    0x9148: 0x8DF5,\n    0x9149: 0x9078,\n    0x914A: 0x9077,\n    0x914B: 0x92AD,\n    0x914C: 0x9291,\n    0x914D: 0x9583,\n    0x914E: 0x9BAE,\n    0x914F: 0x524D,\n    0x9150: 0x5584,\n    0x9151: 0x6F38,\n    0x9152: 0x7136,\n    0x9153: 0x5168,\n    0x9154: 0x7985,\n    0x9155: 0x7E55,\n    0x9156: 0x81B3,\n    0x9157: 0x7CCE,\n    0x9158: 0x564C,\n    0x9159: 0x5851,\n    0x915A: 0x5CA8,\n    0x915B: 0x63AA,\n    0x915C: 0x66FE,\n    0x915D: 0x66FD,\n    0x915E: 0x695A,\n    0x915F: 0x72D9,\n    0x9160: 0x758F,\n    0x9161: 0x758E,\n    0x9162: 0x790E,\n    0x9163: 0x7956,\n    0x9164: 0x79DF,\n    0x9165: 0x7C97,\n    0x9166: 0x7D20,\n    0x9167: 0x7D44,\n    0x9168: 0x8607,\n    0x9169: 0x8A34,\n    0x916A: 0x963B,\n    0x916B: 0x9061,\n    0x916C: 0x9F20,\n    0x916D: 0x50E7,\n    0x916E: 0x5275,\n    0x916F: 0x53CC,\n    0x9170: 0x53E2,\n    0x9171: 0x5009,\n    0x9172: 0x55AA,\n    0x9173: 0x58EE,\n    0x9174: 0x594F,\n    0x9175: 0x723D,\n    0x9176: 0x5B8B,\n    0x9177: 0x5C64,\n    0x9178: 0x531D,\n    0x9179: 0x60E3,\n    0x917A: 0x60F3,\n    0x917B: 0x635C,\n    0x917C: 0x6383,\n    0x917D: 0x633F,\n    0x917E: 0x63BB,\n    0x9180: 0x64CD,\n    0x9181: 0x65E9,\n    0x9182: 0x66F9,\n    0x9183: 0x5DE3,\n    0x9184: 0x69CD,\n    0x9185: 0x69FD,\n    0x9186: 0x6F15,\n    0x9187: 0x71E5,\n    0x9188: 0x4E89,\n    0x9189: 0x75E9,\n    0x918A: 0x76F8,\n    0x918B: 0x7A93,\n    0x918C: 0x7CDF,\n    0x918D: 0x7DCF,\n    0x918E: 0x7D9C,\n    0x918F: 0x8061,\n    0x9190: 0x8349,\n    0x9191: 0x8358,\n    0x9192: 0x846C,\n    0x9193: 0x84BC,\n    0x9194: 0x85FB,\n    0x9195: 0x88C5,\n    0x9196: 0x8D70,\n    0x9197: 0x9001,\n    0x9198: 0x906D,\n    0x9199: 0x9397,\n    0x919A: 0x971C,\n    0x919B: 0x9A12,\n    0x919C: 0x50CF,\n    0x919D: 0x5897,\n    0x919E: 0x618E,\n    0x919F: 0x81D3,\n    0x91A0: 0x8535,\n    0x91A1: 0x8D08,\n    0x91A2: 0x9020,\n    0x91A3: 0x4FC3,\n    0x91A4: 0x5074,\n    0x91A5: 0x5247,\n    0x91A6: 0x5373,\n    0x91A7: 0x606F,\n    0x91A8: 0x6349,\n    0x91A9: 0x675F,\n    0x91AA: 0x6E2C,\n    0x91AB: 0x8DB3,\n    0x91AC: 0x901F,\n    0x91AD: 0x4FD7,\n    0x91AE: 0x5C5E,\n    0x91AF: 0x8CCA,\n    0x91B0: 0x65CF,\n    0x91B1: 0x7D9A,\n    0x91B2: 0x5352,\n    0x91B3: 0x8896,\n    0x91B4: 0x5176,\n    0x91B5: 0x63C3,\n    0x91B6: 0x5B58,\n    0x91B7: 0x5B6B,\n    0x91B8: 0x5C0A,\n    0x91B9: 0x640D,\n    0x91BA: 0x6751,\n    0x91BB: 0x905C,\n    0x91BC: 0x4ED6,\n    0x91BD: 0x591A,\n    0x91BE: 0x592A,\n    0x91BF: 0x6C70,\n    0x91C0: 0x8A51,\n    0x91C1: 0x553E,\n    0x91C2: 0x5815,\n    0x91C3: 0x59A5,\n    0x91C4: 0x60F0,\n    0x91C5: 0x6253,\n    0x91C6: 0x67C1,\n    0x91C7: 0x8235,\n    0x91C8: 0x6955,\n    0x91C9: 0x9640,\n    0x91CA: 0x99C4,\n    0x91CB: 0x9A28,\n    0x91CC: 0x4F53,\n    0x91CD: 0x5806,\n    0x91CE: 0x5BFE,\n    0x91CF: 0x8010,\n    0x91D0: 0x5CB1,\n    0x91D1: 0x5E2F,\n    0x91D2: 0x5F85,\n    0x91D3: 0x6020,\n    0x91D4: 0x614B,\n    0x91D5: 0x6234,\n    0x91D6: 0x66FF,\n    0x91D7: 0x6CF0,\n    0x91D8: 0x6EDE,\n    0x91D9: 0x80CE,\n    0x91DA: 0x817F,\n    0x91DB: 0x82D4,\n    0x91DC: 0x888B,\n    0x91DD: 0x8CB8,\n    0x91DE: 0x9000,\n    0x91DF: 0x902E,\n    0x91E0: 0x968A,\n    0x91E1: 0x9EDB,\n    0x91E2: 0x9BDB,\n    0x91E3: 0x4EE3,\n    0x91E4: 0x53F0,\n    0x91E5: 0x5927,\n    0x91E6: 0x7B2C,\n    0x91E7: 0x918D,\n    0x91E8: 0x984C,\n    0x91E9: 0x9DF9,\n    0x91EA: 0x6EDD,\n    0x91EB: 0x7027,\n    0x91EC: 0x5353,\n    0x91ED: 0x5544,\n    0x91EE: 0x5B85,\n    0x91EF: 0x6258,\n    0x91F0: 0x629E,\n    0x91F1: 0x62D3,\n    0x91F2: 0x6CA2,\n    0x91F3: 0x6FEF,\n    0x91F4: 0x7422,\n    0x91F5: 0x8A17,\n    0x91F6: 0x9438,\n    0x91F7: 0x6FC1,\n    0x91F8: 0x8AFE,\n    0x91F9: 0x8338,\n    0x91FA: 0x51E7,\n    0x91FB: 0x86F8,\n    0x91FC: 0x53EA,\n    0x9240: 0x53E9,\n    0x9241: 0x4F46,\n    0x9242: 0x9054,\n    0x9243: 0x8FB0,\n    0x9244: 0x596A,\n    0x9245: 0x8131,\n    0x9246: 0x5DFD,\n    0x9247: 0x7AEA,\n    0x9248: 0x8FBF,\n    0x9249: 0x68DA,\n    0x924A: 0x8C37,\n    0x924B: 0x72F8,\n    0x924C: 0x9C48,\n    0x924D: 0x6A3D,\n    0x924E: 0x8AB0,\n    0x924F: 0x4E39,\n    0x9250: 0x5358,\n    0x9251: 0x5606,\n    0x9252: 0x5766,\n    0x9253: 0x62C5,\n    0x9254: 0x63A2,\n    0x9255: 0x65E6,\n    0x9256: 0x6B4E,\n    0x9257: 0x6DE1,\n    0x9258: 0x6E5B,\n    0x9259: 0x70AD,\n    0x925A: 0x77ED,\n    0x925B: 0x7AEF,\n    0x925C: 0x7BAA,\n    0x925D: 0x7DBB,\n    0x925E: 0x803D,\n    0x925F: 0x80C6,\n    0x9260: 0x86CB,\n    0x9261: 0x8A95,\n    0x9262: 0x935B,\n    0x9263: 0x56E3,\n    0x9264: 0x58C7,\n    0x9265: 0x5F3E,\n    0x9266: 0x65AD,\n    0x9267: 0x6696,\n    0x9268: 0x6A80,\n    0x9269: 0x6BB5,\n    0x926A: 0x7537,\n    0x926B: 0x8AC7,\n    0x926C: 0x5024,\n    0x926D: 0x77E5,\n    0x926E: 0x5730,\n    0x926F: 0x5F1B,\n    0x9270: 0x6065,\n    0x9271: 0x667A,\n    0x9272: 0x6C60,\n    0x9273: 0x75F4,\n    0x9274: 0x7A1A,\n    0x9275: 0x7F6E,\n    0x9276: 0x81F4,\n    0x9277: 0x8718,\n    0x9278: 0x9045,\n    0x9279: 0x99B3,\n    0x927A: 0x7BC9,\n    0x927B: 0x755C,\n    0x927C: 0x7AF9,\n    0x927D: 0x7B51,\n    0x927E: 0x84C4,\n    0x9280: 0x9010,\n    0x9281: 0x79E9,\n    0x9282: 0x7A92,\n    0x9283: 0x8336,\n    0x9284: 0x5AE1,\n    0x9285: 0x7740,\n    0x9286: 0x4E2D,\n    0x9287: 0x4EF2,\n    0x9288: 0x5B99,\n    0x9289: 0x5FE0,\n    0x928A: 0x62BD,\n    0x928B: 0x663C,\n    0x928C: 0x67F1,\n    0x928D: 0x6CE8,\n    0x928E: 0x866B,\n    0x928F: 0x8877,\n    0x9290: 0x8A3B,\n    0x9291: 0x914E,\n    0x9292: 0x92F3,\n    0x9293: 0x99D0,\n    0x9294: 0x6A17,\n    0x9295: 0x7026,\n    0x9296: 0x732A,\n    0x9297: 0x82E7,\n    0x9298: 0x8457,\n    0x9299: 0x8CAF,\n    0x929A: 0x4E01,\n    0x929B: 0x5146,\n    0x929C: 0x51CB,\n    0x929D: 0x558B,\n    0x929E: 0x5BF5,\n    0x929F: 0x5E16,\n    0x92A0: 0x5E33,\n    0x92A1: 0x5E81,\n    0x92A2: 0x5F14,\n    0x92A3: 0x5F35,\n    0x92A4: 0x5F6B,\n    0x92A5: 0x5FB4,\n    0x92A6: 0x61F2,\n    0x92A7: 0x6311,\n    0x92A8: 0x66A2,\n    0x92A9: 0x671D,\n    0x92AA: 0x6F6E,\n    0x92AB: 0x7252,\n    0x92AC: 0x753A,\n    0x92AD: 0x773A,\n    0x92AE: 0x8074,\n    0x92AF: 0x8139,\n    0x92B0: 0x8178,\n    0x92B1: 0x8776,\n    0x92B2: 0x8ABF,\n    0x92B3: 0x8ADC,\n    0x92B4: 0x8D85,\n    0x92B5: 0x8DF3,\n    0x92B6: 0x929A,\n    0x92B7: 0x9577,\n    0x92B8: 0x9802,\n    0x92B9: 0x9CE5,\n    0x92BA: 0x52C5,\n    0x92BB: 0x6357,\n    0x92BC: 0x76F4,\n    0x92BD: 0x6715,\n    0x92BE: 0x6C88,\n    0x92BF: 0x73CD,\n    0x92C0: 0x8CC3,\n    0x92C1: 0x93AE,\n    0x92C2: 0x9673,\n    0x92C3: 0x6D25,\n    0x92C4: 0x589C,\n    0x92C5: 0x690E,\n    0x92C6: 0x69CC,\n    0x92C7: 0x8FFD,\n    0x92C8: 0x939A,\n    0x92C9: 0x75DB,\n    0x92CA: 0x901A,\n    0x92CB: 0x585A,\n    0x92CC: 0x6802,\n    0x92CD: 0x63B4,\n    0x92CE: 0x69FB,\n    0x92CF: 0x4F43,\n    0x92D0: 0x6F2C,\n    0x92D1: 0x67D8,\n    0x92D2: 0x8FBB,\n    0x92D3: 0x8526,\n    0x92D4: 0x7DB4,\n    0x92D5: 0x9354,\n    0x92D6: 0x693F,\n    0x92D7: 0x6F70,\n    0x92D8: 0x576A,\n    0x92D9: 0x58F7,\n    0x92DA: 0x5B2C,\n    0x92DB: 0x7D2C,\n    0x92DC: 0x722A,\n    0x92DD: 0x540A,\n    0x92DE: 0x91E3,\n    0x92DF: 0x9DB4,\n    0x92E0: 0x4EAD,\n    0x92E1: 0x4F4E,\n    0x92E2: 0x505C,\n    0x92E3: 0x5075,\n    0x92E4: 0x5243,\n    0x92E5: 0x8C9E,\n    0x92E6: 0x5448,\n    0x92E7: 0x5824,\n    0x92E8: 0x5B9A,\n    0x92E9: 0x5E1D,\n    0x92EA: 0x5E95,\n    0x92EB: 0x5EAD,\n    0x92EC: 0x5EF7,\n    0x92ED: 0x5F1F,\n    0x92EE: 0x608C,\n    0x92EF: 0x62B5,\n    0x92F0: 0x633A,\n    0x92F1: 0x63D0,\n    0x92F2: 0x68AF,\n    0x92F3: 0x6C40,\n    0x92F4: 0x7887,\n    0x92F5: 0x798E,\n    0x92F6: 0x7A0B,\n    0x92F7: 0x7DE0,\n    0x92F8: 0x8247,\n    0x92F9: 0x8A02,\n    0x92FA: 0x8AE6,\n    0x92FB: 0x8E44,\n    0x92FC: 0x9013,\n    0x9340: 0x90B8,\n    0x9341: 0x912D,\n    0x9342: 0x91D8,\n    0x9343: 0x9F0E,\n    0x9344: 0x6CE5,\n    0x9345: 0x6458,\n    0x9346: 0x64E2,\n    0x9347: 0x6575,\n    0x9348: 0x6EF4,\n    0x9349: 0x7684,\n    0x934A: 0x7B1B,\n    0x934B: 0x9069,\n    0x934C: 0x93D1,\n    0x934D: 0x6EBA,\n    0x934E: 0x54F2,\n    0x934F: 0x5FB9,\n    0x9350: 0x64A4,\n    0x9351: 0x8F4D,\n    0x9352: 0x8FED,\n    0x9353: 0x9244,\n    0x9354: 0x5178,\n    0x9355: 0x586B,\n    0x9356: 0x5929,\n    0x9357: 0x5C55,\n    0x9358: 0x5E97,\n    0x9359: 0x6DFB,\n    0x935A: 0x7E8F,\n    0x935B: 0x751C,\n    0x935C: 0x8CBC,\n    0x935D: 0x8EE2,\n    0x935E: 0x985B,\n    0x935F: 0x70B9,\n    0x9360: 0x4F1D,\n    0x9361: 0x6BBF,\n    0x9362: 0x6FB1,\n    0x9363: 0x7530,\n    0x9364: 0x96FB,\n    0x9365: 0x514E,\n    0x9366: 0x5410,\n    0x9367: 0x5835,\n    0x9368: 0x5857,\n    0x9369: 0x59AC,\n    0x936A: 0x5C60,\n    0x936B: 0x5F92,\n    0x936C: 0x6597,\n    0x936D: 0x675C,\n    0x936E: 0x6E21,\n    0x936F: 0x767B,\n    0x9370: 0x83DF,\n    0x9371: 0x8CED,\n    0x9372: 0x9014,\n    0x9373: 0x90FD,\n    0x9374: 0x934D,\n    0x9375: 0x7825,\n    0x9376: 0x783A,\n    0x9377: 0x52AA,\n    0x9378: 0x5EA6,\n    0x9379: 0x571F,\n    0x937A: 0x5974,\n    0x937B: 0x6012,\n    0x937C: 0x5012,\n    0x937D: 0x515A,\n    0x937E: 0x51AC,\n    0x9380: 0x51CD,\n    0x9381: 0x5200,\n    0x9382: 0x5510,\n    0x9383: 0x5854,\n    0x9384: 0x5858,\n    0x9385: 0x5957,\n    0x9386: 0x5B95,\n    0x9387: 0x5CF6,\n    0x9388: 0x5D8B,\n    0x9389: 0x60BC,\n    0x938A: 0x6295,\n    0x938B: 0x642D,\n    0x938C: 0x6771,\n    0x938D: 0x6843,\n    0x938E: 0x68BC,\n    0x938F: 0x68DF,\n    0x9390: 0x76D7,\n    0x9391: 0x6DD8,\n    0x9392: 0x6E6F,\n    0x9393: 0x6D9B,\n    0x9394: 0x706F,\n    0x9395: 0x71C8,\n    0x9396: 0x5F53,\n    0x9397: 0x75D8,\n    0x9398: 0x7977,\n    0x9399: 0x7B49,\n    0x939A: 0x7B54,\n    0x939B: 0x7B52,\n    0x939C: 0x7CD6,\n    0x939D: 0x7D71,\n    0x939E: 0x5230,\n    0x939F: 0x8463,\n    0x93A0: 0x8569,\n    0x93A1: 0x85E4,\n    0x93A2: 0x8A0E,\n    0x93A3: 0x8B04,\n    0x93A4: 0x8C46,\n    0x93A5: 0x8E0F,\n    0x93A6: 0x9003,\n    0x93A7: 0x900F,\n    0x93A8: 0x9419,\n    0x93A9: 0x9676,\n    0x93AA: 0x982D,\n    0x93AB: 0x9A30,\n    0x93AC: 0x95D8,\n    0x93AD: 0x50CD,\n    0x93AE: 0x52D5,\n    0x93AF: 0x540C,\n    0x93B0: 0x5802,\n    0x93B1: 0x5C0E,\n    0x93B2: 0x61A7,\n    0x93B3: 0x649E,\n    0x93B4: 0x6D1E,\n    0x93B5: 0x77B3,\n    0x93B6: 0x7AE5,\n    0x93B7: 0x80F4,\n    0x93B8: 0x8404,\n    0x93B9: 0x9053,\n    0x93BA: 0x9285,\n    0x93BB: 0x5CE0,\n    0x93BC: 0x9D07,\n    0x93BD: 0x533F,\n    0x93BE: 0x5F97,\n    0x93BF: 0x5FB3,\n    0x93C0: 0x6D9C,\n    0x93C1: 0x7279,\n    0x93C2: 0x7763,\n    0x93C3: 0x79BF,\n    0x93C4: 0x7BE4,\n    0x93C5: 0x6BD2,\n    0x93C6: 0x72EC,\n    0x93C7: 0x8AAD,\n    0x93C8: 0x6803,\n    0x93C9: 0x6A61,\n    0x93CA: 0x51F8,\n    0x93CB: 0x7A81,\n    0x93CC: 0x6934,\n    0x93CD: 0x5C4A,\n    0x93CE: 0x9CF6,\n    0x93CF: 0x82EB,\n    0x93D0: 0x5BC5,\n    0x93D1: 0x9149,\n    0x93D2: 0x701E,\n    0x93D3: 0x5678,\n    0x93D4: 0x5C6F,\n    0x93D5: 0x60C7,\n    0x93D6: 0x6566,\n    0x93D7: 0x6C8C,\n    0x93D8: 0x8C5A,\n    0x93D9: 0x9041,\n    0x93DA: 0x9813,\n    0x93DB: 0x5451,\n    0x93DC: 0x66C7,\n    0x93DD: 0x920D,\n    0x93DE: 0x5948,\n    0x93DF: 0x90A3,\n    0x93E0: 0x5185,\n    0x93E1: 0x4E4D,\n    0x93E2: 0x51EA,\n    0x93E3: 0x8599,\n    0x93E4: 0x8B0E,\n    0x93E5: 0x7058,\n    0x93E6: 0x637A,\n    0x93E7: 0x934B,\n    0x93E8: 0x6962,\n    0x93E9: 0x99B4,\n    0x93EA: 0x7E04,\n    0x93EB: 0x7577,\n    0x93EC: 0x5357,\n    0x93ED: 0x6960,\n    0x93EE: 0x8EDF,\n    0x93EF: 0x96E3,\n    0x93F0: 0x6C5D,\n    0x93F1: 0x4E8C,\n    0x93F2: 0x5C3C,\n    0x93F3: 0x5F10,\n    0x93F4: 0x8FE9,\n    0x93F5: 0x5302,\n    0x93F6: 0x8CD1,\n    0x93F7: 0x8089,\n    0x93F8: 0x8679,\n    0x93F9: 0x5EFF,\n    0x93FA: 0x65E5,\n    0x93FB: 0x4E73,\n    0x93FC: 0x5165,\n    0x9440: 0x5982,\n    0x9441: 0x5C3F,\n    0x9442: 0x97EE,\n    0x9443: 0x4EFB,\n    0x9444: 0x598A,\n    0x9445: 0x5FCD,\n    0x9446: 0x8A8D,\n    0x9447: 0x6FE1,\n    0x9448: 0x79B0,\n    0x9449: 0x7962,\n    0x944A: 0x5BE7,\n    0x944B: 0x8471,\n    0x944C: 0x732B,\n    0x944D: 0x71B1,\n    0x944E: 0x5E74,\n    0x944F: 0x5FF5,\n    0x9450: 0x637B,\n    0x9451: 0x649A,\n    0x9452: 0x71C3,\n    0x9453: 0x7C98,\n    0x9454: 0x4E43,\n    0x9455: 0x5EFC,\n    0x9456: 0x4E4B,\n    0x9457: 0x57DC,\n    0x9458: 0x56A2,\n    0x9459: 0x60A9,\n    0x945A: 0x6FC3,\n    0x945B: 0x7D0D,\n    0x945C: 0x80FD,\n    0x945D: 0x8133,\n    0x945E: 0x81BF,\n    0x945F: 0x8FB2,\n    0x9460: 0x8997,\n    0x9461: 0x86A4,\n    0x9462: 0x5DF4,\n    0x9463: 0x628A,\n    0x9464: 0x64AD,\n    0x9465: 0x8987,\n    0x9466: 0x6777,\n    0x9467: 0x6CE2,\n    0x9468: 0x6D3E,\n    0x9469: 0x7436,\n    0x946A: 0x7834,\n    0x946B: 0x5A46,\n    0x946C: 0x7F75,\n    0x946D: 0x82AD,\n    0x946E: 0x99AC,\n    0x946F: 0x4FF3,\n    0x9470: 0x5EC3,\n    0x9471: 0x62DD,\n    0x9472: 0x6392,\n    0x9473: 0x6557,\n    0x9474: 0x676F,\n    0x9475: 0x76C3,\n    0x9476: 0x724C,\n    0x9477: 0x80CC,\n    0x9478: 0x80BA,\n    0x9479: 0x8F29,\n    0x947A: 0x914D,\n    0x947B: 0x500D,\n    0x947C: 0x57F9,\n    0x947D: 0x5A92,\n    0x947E: 0x6885,\n    0x9480: 0x6973,\n    0x9481: 0x7164,\n    0x9482: 0x72FD,\n    0x9483: 0x8CB7,\n    0x9484: 0x58F2,\n    0x9485: 0x8CE0,\n    0x9486: 0x966A,\n    0x9487: 0x9019,\n    0x9488: 0x877F,\n    0x9489: 0x79E4,\n    0x948A: 0x77E7,\n    0x948B: 0x8429,\n    0x948C: 0x4F2F,\n    0x948D: 0x5265,\n    0x948E: 0x535A,\n    0x948F: 0x62CD,\n    0x9490: 0x67CF,\n    0x9491: 0x6CCA,\n    0x9492: 0x767D,\n    0x9493: 0x7B94,\n    0x9494: 0x7C95,\n    0x9495: 0x8236,\n    0x9496: 0x8584,\n    0x9497: 0x8FEB,\n    0x9498: 0x66DD,\n    0x9499: 0x6F20,\n    0x949A: 0x7206,\n    0x949B: 0x7E1B,\n    0x949C: 0x83AB,\n    0x949D: 0x99C1,\n    0x949E: 0x9EA6,\n    0x949F: 0x51FD,\n    0x94A0: 0x7BB1,\n    0x94A1: 0x7872,\n    0x94A2: 0x7BB8,\n    0x94A3: 0x8087,\n    0x94A4: 0x7B48,\n    0x94A5: 0x6AE8,\n    0x94A6: 0x5E61,\n    0x94A7: 0x808C,\n    0x94A8: 0x7551,\n    0x94A9: 0x7560,\n    0x94AA: 0x516B,\n    0x94AB: 0x9262,\n    0x94AC: 0x6E8C,\n    0x94AD: 0x767A,\n    0x94AE: 0x9197,\n    0x94AF: 0x9AEA,\n    0x94B0: 0x4F10,\n    0x94B1: 0x7F70,\n    0x94B2: 0x629C,\n    0x94B3: 0x7B4F,\n    0x94B4: 0x95A5,\n    0x94B5: 0x9CE9,\n    0x94B6: 0x567A,\n    0x94B7: 0x5859,\n    0x94B8: 0x86E4,\n    0x94B9: 0x96BC,\n    0x94BA: 0x4F34,\n    0x94BB: 0x5224,\n    0x94BC: 0x534A,\n    0x94BD: 0x53CD,\n    0x94BE: 0x53DB,\n    0x94BF: 0x5E06,\n    0x94C0: 0x642C,\n    0x94C1: 0x6591,\n    0x94C2: 0x677F,\n    0x94C3: 0x6C3E,\n    0x94C4: 0x6C4E,\n    0x94C5: 0x7248,\n    0x94C6: 0x72AF,\n    0x94C7: 0x73ED,\n    0x94C8: 0x7554,\n    0x94C9: 0x7E41,\n    0x94CA: 0x822C,\n    0x94CB: 0x85E9,\n    0x94CC: 0x8CA9,\n    0x94CD: 0x7BC4,\n    0x94CE: 0x91C6,\n    0x94CF: 0x7169,\n    0x94D0: 0x9812,\n    0x94D1: 0x98EF,\n    0x94D2: 0x633D,\n    0x94D3: 0x6669,\n    0x94D4: 0x756A,\n    0x94D5: 0x76E4,\n    0x94D6: 0x78D0,\n    0x94D7: 0x8543,\n    0x94D8: 0x86EE,\n    0x94D9: 0x532A,\n    0x94DA: 0x5351,\n    0x94DB: 0x5426,\n    0x94DC: 0x5983,\n    0x94DD: 0x5E87,\n    0x94DE: 0x5F7C,\n    0x94DF: 0x60B2,\n    0x94E0: 0x6249,\n    0x94E1: 0x6279,\n    0x94E2: 0x62AB,\n    0x94E3: 0x6590,\n    0x94E4: 0x6BD4,\n    0x94E5: 0x6CCC,\n    0x94E6: 0x75B2,\n    0x94E7: 0x76AE,\n    0x94E8: 0x7891,\n    0x94E9: 0x79D8,\n    0x94EA: 0x7DCB,\n    0x94EB: 0x7F77,\n    0x94EC: 0x80A5,\n    0x94ED: 0x88AB,\n    0x94EE: 0x8AB9,\n    0x94EF: 0x8CBB,\n    0x94F0: 0x907F,\n    0x94F1: 0x975E,\n    0x94F2: 0x98DB,\n    0x94F3: 0x6A0B,\n    0x94F4: 0x7C38,\n    0x94F5: 0x5099,\n    0x94F6: 0x5C3E,\n    0x94F7: 0x5FAE,\n    0x94F8: 0x6787,\n    0x94F9: 0x6BD8,\n    0x94FA: 0x7435,\n    0x94FB: 0x7709,\n    0x94FC: 0x7F8E,\n    0x9540: 0x9F3B,\n    0x9541: 0x67CA,\n    0x9542: 0x7A17,\n    0x9543: 0x5339,\n    0x9544: 0x758B,\n    0x9545: 0x9AED,\n    0x9546: 0x5F66,\n    0x9547: 0x819D,\n    0x9548: 0x83F1,\n    0x9549: 0x8098,\n    0x954A: 0x5F3C,\n    0x954B: 0x5FC5,\n    0x954C: 0x7562,\n    0x954D: 0x7B46,\n    0x954E: 0x903C,\n    0x954F: 0x6867,\n    0x9550: 0x59EB,\n    0x9551: 0x5A9B,\n    0x9552: 0x7D10,\n    0x9553: 0x767E,\n    0x9554: 0x8B2C,\n    0x9555: 0x4FF5,\n    0x9556: 0x5F6A,\n    0x9557: 0x6A19,\n    0x9558: 0x6C37,\n    0x9559: 0x6F02,\n    0x955A: 0x74E2,\n    0x955B: 0x7968,\n    0x955C: 0x8868,\n    0x955D: 0x8A55,\n    0x955E: 0x8C79,\n    0x955F: 0x5EDF,\n    0x9560: 0x63CF,\n    0x9561: 0x75C5,\n    0x9562: 0x79D2,\n    0x9563: 0x82D7,\n    0x9564: 0x9328,\n    0x9565: 0x92F2,\n    0x9566: 0x849C,\n    0x9567: 0x86ED,\n    0x9568: 0x9C2D,\n    0x9569: 0x54C1,\n    0x956A: 0x5F6C,\n    0x956B: 0x658C,\n    0x956C: 0x6D5C,\n    0x956D: 0x7015,\n    0x956E: 0x8CA7,\n    0x956F: 0x8CD3,\n    0x9570: 0x983B,\n    0x9571: 0x654F,\n    0x9572: 0x74F6,\n    0x9573: 0x4E0D,\n    0x9574: 0x4ED8,\n    0x9575: 0x57E0,\n    0x9576: 0x592B,\n    0x9577: 0x5A66,\n    0x9578: 0x5BCC,\n    0x9579: 0x51A8,\n    0x957A: 0x5E03,\n    0x957B: 0x5E9C,\n    0x957C: 0x6016,\n    0x957D: 0x6276,\n    0x957E: 0x6577,\n    0x9580: 0x65A7,\n    0x9581: 0x666E,\n    0x9582: 0x6D6E,\n    0x9583: 0x7236,\n    0x9584: 0x7B26,\n    0x9585: 0x8150,\n    0x9586: 0x819A,\n    0x9587: 0x8299,\n    0x9588: 0x8B5C,\n    0x9589: 0x8CA0,\n    0x958A: 0x8CE6,\n    0x958B: 0x8D74,\n    0x958C: 0x961C,\n    0x958D: 0x9644,\n    0x958E: 0x4FAE,\n    0x958F: 0x64AB,\n    0x9590: 0x6B66,\n    0x9591: 0x821E,\n    0x9592: 0x8461,\n    0x9593: 0x856A,\n    0x9594: 0x90E8,\n    0x9595: 0x5C01,\n    0x9596: 0x6953,\n    0x9597: 0x98A8,\n    0x9598: 0x847A,\n    0x9599: 0x8557,\n    0x959A: 0x4F0F,\n    0x959B: 0x526F,\n    0x959C: 0x5FA9,\n    0x959D: 0x5E45,\n    0x959E: 0x670D,\n    0x959F: 0x798F,\n    0x95A0: 0x8179,\n    0x95A1: 0x8907,\n    0x95A2: 0x8986,\n    0x95A3: 0x6DF5,\n    0x95A4: 0x5F17,\n    0x95A5: 0x6255,\n    0x95A6: 0x6CB8,\n    0x95A7: 0x4ECF,\n    0x95A8: 0x7269,\n    0x95A9: 0x9B92,\n    0x95AA: 0x5206,\n    0x95AB: 0x543B,\n    0x95AC: 0x5674,\n    0x95AD: 0x58B3,\n    0x95AE: 0x61A4,\n    0x95AF: 0x626E,\n    0x95B0: 0x711A,\n    0x95B1: 0x596E,\n    0x95B2: 0x7C89,\n    0x95B3: 0x7CDE,\n    0x95B4: 0x7D1B,\n    0x95B5: 0x96F0,\n    0x95B6: 0x6587,\n    0x95B7: 0x805E,\n    0x95B8: 0x4E19,\n    0x95B9: 0x4F75,\n    0x95BA: 0x5175,\n    0x95BB: 0x5840,\n    0x95BC: 0x5E63,\n    0x95BD: 0x5E73,\n    0x95BE: 0x5F0A,\n    0x95BF: 0x67C4,\n    0x95C0: 0x4E26,\n    0x95C1: 0x853D,\n    0x95C2: 0x9589,\n    0x95C3: 0x965B,\n    0x95C4: 0x7C73,\n    0x95C5: 0x9801,\n    0x95C6: 0x50FB,\n    0x95C7: 0x58C1,\n    0x95C8: 0x7656,\n    0x95C9: 0x78A7,\n    0x95CA: 0x5225,\n    0x95CB: 0x77A5,\n    0x95CC: 0x8511,\n    0x95CD: 0x7B86,\n    0x95CE: 0x504F,\n    0x95CF: 0x5909,\n    0x95D0: 0x7247,\n    0x95D1: 0x7BC7,\n    0x95D2: 0x7DE8,\n    0x95D3: 0x8FBA,\n    0x95D4: 0x8FD4,\n    0x95D5: 0x904D,\n    0x95D6: 0x4FBF,\n    0x95D7: 0x52C9,\n    0x95D8: 0x5A29,\n    0x95D9: 0x5F01,\n    0x95DA: 0x97AD,\n    0x95DB: 0x4FDD,\n    0x95DC: 0x8217,\n    0x95DD: 0x92EA,\n    0x95DE: 0x5703,\n    0x95DF: 0x6355,\n    0x95E0: 0x6B69,\n    0x95E1: 0x752B,\n    0x95E2: 0x88DC,\n    0x95E3: 0x8F14,\n    0x95E4: 0x7A42,\n    0x95E5: 0x52DF,\n    0x95E6: 0x5893,\n    0x95E7: 0x6155,\n    0x95E8: 0x620A,\n    0x95E9: 0x66AE,\n    0x95EA: 0x6BCD,\n    0x95EB: 0x7C3F,\n    0x95EC: 0x83E9,\n    0x95ED: 0x5023,\n    0x95EE: 0x4FF8,\n    0x95EF: 0x5305,\n    0x95F0: 0x5446,\n    0x95F1: 0x5831,\n    0x95F2: 0x5949,\n    0x95F3: 0x5B9D,\n    0x95F4: 0x5CF0,\n    0x95F5: 0x5CEF,\n    0x95F6: 0x5D29,\n    0x95F7: 0x5E96,\n    0x95F8: 0x62B1,\n    0x95F9: 0x6367,\n    0x95FA: 0x653E,\n    0x95FB: 0x65B9,\n    0x95FC: 0x670B,\n    0x9640: 0x6CD5,\n    0x9641: 0x6CE1,\n    0x9642: 0x70F9,\n    0x9643: 0x7832,\n    0x9644: 0x7E2B,\n    0x9645: 0x80DE,\n    0x9646: 0x82B3,\n    0x9647: 0x840C,\n    0x9648: 0x84EC,\n    0x9649: 0x8702,\n    0x964A: 0x8912,\n    0x964B: 0x8A2A,\n    0x964C: 0x8C4A,\n    0x964D: 0x90A6,\n    0x964E: 0x92D2,\n    0x964F: 0x98FD,\n    0x9650: 0x9CF3,\n    0x9651: 0x9D6C,\n    0x9652: 0x4E4F,\n    0x9653: 0x4EA1,\n    0x9654: 0x508D,\n    0x9655: 0x5256,\n    0x9656: 0x574A,\n    0x9657: 0x59A8,\n    0x9658: 0x5E3D,\n    0x9659: 0x5FD8,\n    0x965A: 0x5FD9,\n    0x965B: 0x623F,\n    0x965C: 0x66B4,\n    0x965D: 0x671B,\n    0x965E: 0x67D0,\n    0x965F: 0x68D2,\n    0x9660: 0x5192,\n    0x9661: 0x7D21,\n    0x9662: 0x80AA,\n    0x9663: 0x81A8,\n    0x9664: 0x8B00,\n    0x9665: 0x8C8C,\n    0x9666: 0x8CBF,\n    0x9667: 0x927E,\n    0x9668: 0x9632,\n    0x9669: 0x5420,\n    0x966A: 0x982C,\n    0x966B: 0x5317,\n    0x966C: 0x50D5,\n    0x966D: 0x535C,\n    0x966E: 0x58A8,\n    0x966F: 0x64B2,\n    0x9670: 0x6734,\n    0x9671: 0x7267,\n    0x9672: 0x7766,\n    0x9673: 0x7A46,\n    0x9674: 0x91E6,\n    0x9675: 0x52C3,\n    0x9676: 0x6CA1,\n    0x9677: 0x6B86,\n    0x9678: 0x5800,\n    0x9679: 0x5E4C,\n    0x967A: 0x5954,\n    0x967B: 0x672C,\n    0x967C: 0x7FFB,\n    0x967D: 0x51E1,\n    0x967E: 0x76C6,\n    0x9680: 0x6469,\n    0x9681: 0x78E8,\n    0x9682: 0x9B54,\n    0x9683: 0x9EBB,\n    0x9684: 0x57CB,\n    0x9685: 0x59B9,\n    0x9686: 0x6627,\n    0x9687: 0x679A,\n    0x9688: 0x6BCE,\n    0x9689: 0x54E9,\n    0x968A: 0x69D9,\n    0x968B: 0x5E55,\n    0x968C: 0x819C,\n    0x968D: 0x6795,\n    0x968E: 0x9BAA,\n    0x968F: 0x67FE,\n    0x9690: 0x9C52,\n    0x9691: 0x685D,\n    0x9692: 0x4EA6,\n    0x9693: 0x4FE3,\n    0x9694: 0x53C8,\n    0x9695: 0x62B9,\n    0x9696: 0x672B,\n    0x9697: 0x6CAB,\n    0x9698: 0x8FC4,\n    0x9699: 0x4FAD,\n    0x969A: 0x7E6D,\n    0x969B: 0x9EBF,\n    0x969C: 0x4E07,\n    0x969D: 0x6162,\n    0x969E: 0x6E80,\n    0x969F: 0x6F2B,\n    0x96A0: 0x8513,\n    0x96A1: 0x5473,\n    0x96A2: 0x672A,\n    0x96A3: 0x9B45,\n    0x96A4: 0x5DF3,\n    0x96A5: 0x7B95,\n    0x96A6: 0x5CAC,\n    0x96A7: 0x5BC6,\n    0x96A8: 0x871C,\n    0x96A9: 0x6E4A,\n    0x96AA: 0x84D1,\n    0x96AB: 0x7A14,\n    0x96AC: 0x8108,\n    0x96AD: 0x5999,\n    0x96AE: 0x7C8D,\n    0x96AF: 0x6C11,\n    0x96B0: 0x7720,\n    0x96B1: 0x52D9,\n    0x96B2: 0x5922,\n    0x96B3: 0x7121,\n    0x96B4: 0x725F,\n    0x96B5: 0x77DB,\n    0x96B6: 0x9727,\n    0x96B7: 0x9D61,\n    0x96B8: 0x690B,\n    0x96B9: 0x5A7F,\n    0x96BA: 0x5A18,\n    0x96BB: 0x51A5,\n    0x96BC: 0x540D,\n    0x96BD: 0x547D,\n    0x96BE: 0x660E,\n    0x96BF: 0x76DF,\n    0x96C0: 0x8FF7,\n    0x96C1: 0x9298,\n    0x96C2: 0x9CF4,\n    0x96C3: 0x59EA,\n    0x96C4: 0x725D,\n    0x96C5: 0x6EC5,\n    0x96C6: 0x514D,\n    0x96C7: 0x68C9,\n    0x96C8: 0x7DBF,\n    0x96C9: 0x7DEC,\n    0x96CA: 0x9762,\n    0x96CB: 0x9EBA,\n    0x96CC: 0x6478,\n    0x96CD: 0x6A21,\n    0x96CE: 0x8302,\n    0x96CF: 0x5984,\n    0x96D0: 0x5B5F,\n    0x96D1: 0x6BDB,\n    0x96D2: 0x731B,\n    0x96D3: 0x76F2,\n    0x96D4: 0x7DB2,\n    0x96D5: 0x8017,\n    0x96D6: 0x8499,\n    0x96D7: 0x5132,\n    0x96D8: 0x6728,\n    0x96D9: 0x9ED9,\n    0x96DA: 0x76EE,\n    0x96DB: 0x6762,\n    0x96DC: 0x52FF,\n    0x96DD: 0x9905,\n    0x96DE: 0x5C24,\n    0x96DF: 0x623B,\n    0x96E0: 0x7C7E,\n    0x96E1: 0x8CB0,\n    0x96E2: 0x554F,\n    0x96E3: 0x60B6,\n    0x96E4: 0x7D0B,\n    0x96E5: 0x9580,\n    0x96E6: 0x5301,\n    0x96E7: 0x4E5F,\n    0x96E8: 0x51B6,\n    0x96E9: 0x591C,\n    0x96EA: 0x723A,\n    0x96EB: 0x8036,\n    0x96EC: 0x91CE,\n    0x96ED: 0x5F25,\n    0x96EE: 0x77E2,\n    0x96EF: 0x5384,\n    0x96F0: 0x5F79,\n    0x96F1: 0x7D04,\n    0x96F2: 0x85AC,\n    0x96F3: 0x8A33,\n    0x96F4: 0x8E8D,\n    0x96F5: 0x9756,\n    0x96F6: 0x67F3,\n    0x96F7: 0x85AE,\n    0x96F8: 0x9453,\n    0x96F9: 0x6109,\n    0x96FA: 0x6108,\n    0x96FB: 0x6CB9,\n    0x96FC: 0x7652,\n    0x9740: 0x8AED,\n    0x9741: 0x8F38,\n    0x9742: 0x552F,\n    0x9743: 0x4F51,\n    0x9744: 0x512A,\n    0x9745: 0x52C7,\n    0x9746: 0x53CB,\n    0x9747: 0x5BA5,\n    0x9748: 0x5E7D,\n    0x9749: 0x60A0,\n    0x974A: 0x6182,\n    0x974B: 0x63D6,\n    0x974C: 0x6709,\n    0x974D: 0x67DA,\n    0x974E: 0x6E67,\n    0x974F: 0x6D8C,\n    0x9750: 0x7336,\n    0x9751: 0x7337,\n    0x9752: 0x7531,\n    0x9753: 0x7950,\n    0x9754: 0x88D5,\n    0x9755: 0x8A98,\n    0x9756: 0x904A,\n    0x9757: 0x9091,\n    0x9758: 0x90F5,\n    0x9759: 0x96C4,\n    0x975A: 0x878D,\n    0x975B: 0x5915,\n    0x975C: 0x4E88,\n    0x975D: 0x4F59,\n    0x975E: 0x4E0E,\n    0x975F: 0x8A89,\n    0x9760: 0x8F3F,\n    0x9761: 0x9810,\n    0x9762: 0x50AD,\n    0x9763: 0x5E7C,\n    0x9764: 0x5996,\n    0x9765: 0x5BB9,\n    0x9766: 0x5EB8,\n    0x9767: 0x63DA,\n    0x9768: 0x63FA,\n    0x9769: 0x64C1,\n    0x976A: 0x66DC,\n    0x976B: 0x694A,\n    0x976C: 0x69D8,\n    0x976D: 0x6D0B,\n    0x976E: 0x6EB6,\n    0x976F: 0x7194,\n    0x9770: 0x7528,\n    0x9771: 0x7AAF,\n    0x9772: 0x7F8A,\n    0x9773: 0x8000,\n    0x9774: 0x8449,\n    0x9775: 0x84C9,\n    0x9776: 0x8981,\n    0x9777: 0x8B21,\n    0x9778: 0x8E0A,\n    0x9779: 0x9065,\n    0x977A: 0x967D,\n    0x977B: 0x990A,\n    0x977C: 0x617E,\n    0x977D: 0x6291,\n    0x977E: 0x6B32,\n    0x9780: 0x6C83,\n    0x9781: 0x6D74,\n    0x9782: 0x7FCC,\n    0x9783: 0x7FFC,\n    0x9784: 0x6DC0,\n    0x9785: 0x7F85,\n    0x9786: 0x87BA,\n    0x9787: 0x88F8,\n    0x9788: 0x6765,\n    0x9789: 0x83B1,\n    0x978A: 0x983C,\n    0x978B: 0x96F7,\n    0x978C: 0x6D1B,\n    0x978D: 0x7D61,\n    0x978E: 0x843D,\n    0x978F: 0x916A,\n    0x9790: 0x4E71,\n    0x9791: 0x5375,\n    0x9792: 0x5D50,\n    0x9793: 0x6B04,\n    0x9794: 0x6FEB,\n    0x9795: 0x85CD,\n    0x9796: 0x862D,\n    0x9797: 0x89A7,\n    0x9798: 0x5229,\n    0x9799: 0x540F,\n    0x979A: 0x5C65,\n    0x979B: 0x674E,\n    0x979C: 0x68A8,\n    0x979D: 0x7406,\n    0x979E: 0x7483,\n    0x979F: 0x75E2,\n    0x97A0: 0x88CF,\n    0x97A1: 0x88E1,\n    0x97A2: 0x91CC,\n    0x97A3: 0x96E2,\n    0x97A4: 0x9678,\n    0x97A5: 0x5F8B,\n    0x97A6: 0x7387,\n    0x97A7: 0x7ACB,\n    0x97A8: 0x844E,\n    0x97A9: 0x63A0,\n    0x97AA: 0x7565,\n    0x97AB: 0x5289,\n    0x97AC: 0x6D41,\n    0x97AD: 0x6E9C,\n    0x97AE: 0x7409,\n    0x97AF: 0x7559,\n    0x97B0: 0x786B,\n    0x97B1: 0x7C92,\n    0x97B2: 0x9686,\n    0x97B3: 0x7ADC,\n    0x97B4: 0x9F8D,\n    0x97B5: 0x4FB6,\n    0x97B6: 0x616E,\n    0x97B7: 0x65C5,\n    0x97B8: 0x865C,\n    0x97B9: 0x4E86,\n    0x97BA: 0x4EAE,\n    0x97BB: 0x50DA,\n    0x97BC: 0x4E21,\n    0x97BD: 0x51CC,\n    0x97BE: 0x5BEE,\n    0x97BF: 0x6599,\n    0x97C0: 0x6881,\n    0x97C1: 0x6DBC,\n    0x97C2: 0x731F,\n    0x97C3: 0x7642,\n    0x97C4: 0x77AD,\n    0x97C5: 0x7A1C,\n    0x97C6: 0x7CE7,\n    0x97C7: 0x826F,\n    0x97C8: 0x8AD2,\n    0x97C9: 0x907C,\n    0x97CA: 0x91CF,\n    0x97CB: 0x9675,\n    0x97CC: 0x9818,\n    0x97CD: 0x529B,\n    0x97CE: 0x7DD1,\n    0x97CF: 0x502B,\n    0x97D0: 0x5398,\n    0x97D1: 0x6797,\n    0x97D2: 0x6DCB,\n    0x97D3: 0x71D0,\n    0x97D4: 0x7433,\n    0x97D5: 0x81E8,\n    0x97D6: 0x8F2A,\n    0x97D7: 0x96A3,\n    0x97D8: 0x9C57,\n    0x97D9: 0x9E9F,\n    0x97DA: 0x7460,\n    0x97DB: 0x5841,\n    0x97DC: 0x6D99,\n    0x97DD: 0x7D2F,\n    0x97DE: 0x985E,\n    0x97DF: 0x4EE4,\n    0x97E0: 0x4F36,\n    0x97E1: 0x4F8B,\n    0x97E2: 0x51B7,\n    0x97E3: 0x52B1,\n    0x97E4: 0x5DBA,\n    0x97E5: 0x601C,\n    0x97E6: 0x73B2,\n    0x97E7: 0x793C,\n    0x97E8: 0x82D3,\n    0x97E9: 0x9234,\n    0x97EA: 0x96B7,\n    0x97EB: 0x96F6,\n    0x97EC: 0x970A,\n    0x97ED: 0x9E97,\n    0x97EE: 0x9F62,\n    0x97EF: 0x66A6,\n    0x97F0: 0x6B74,\n    0x97F1: 0x5217,\n    0x97F2: 0x52A3,\n    0x97F3: 0x70C8,\n    0x97F4: 0x88C2,\n    0x97F5: 0x5EC9,\n    0x97F6: 0x604B,\n    0x97F7: 0x6190,\n    0x97F8: 0x6F23,\n    0x97F9: 0x7149,\n    0x97FA: 0x7C3E,\n    0x97FB: 0x7DF4,\n    0x97FC: 0x806F,\n    0x9840: 0x84EE,\n    0x9841: 0x9023,\n    0x9842: 0x932C,\n    0x9843: 0x5442,\n    0x9844: 0x9B6F,\n    0x9845: 0x6AD3,\n    0x9846: 0x7089,\n    0x9847: 0x8CC2,\n    0x9848: 0x8DEF,\n    0x9849: 0x9732,\n    0x984A: 0x52B4,\n    0x984B: 0x5A41,\n    0x984C: 0x5ECA,\n    0x984D: 0x5F04,\n    0x984E: 0x6717,\n    0x984F: 0x697C,\n    0x9850: 0x6994,\n    0x9851: 0x6D6A,\n    0x9852: 0x6F0F,\n    0x9853: 0x7262,\n    0x9854: 0x72FC,\n    0x9855: 0x7BED,\n    0x9856: 0x8001,\n    0x9857: 0x807E,\n    0x9858: 0x874B,\n    0x9859: 0x90CE,\n    0x985A: 0x516D,\n    0x985B: 0x9E93,\n    0x985C: 0x7984,\n    0x985D: 0x808B,\n    0x985E: 0x9332,\n    0x985F: 0x8AD6,\n    0x9860: 0x502D,\n    0x9861: 0x548C,\n    0x9862: 0x8A71,\n    0x9863: 0x6B6A,\n    0x9864: 0x8CC4,\n    0x9865: 0x8107,\n    0x9866: 0x60D1,\n    0x9867: 0x67A0,\n    0x9868: 0x9DF2,\n    0x9869: 0x4E99,\n    0x986A: 0x4E98,\n    0x986B: 0x9C10,\n    0x986C: 0x8A6B,\n    0x986D: 0x85C1,\n    0x986E: 0x8568,\n    0x986F: 0x6900,\n    0x9870: 0x6E7E,\n    0x9871: 0x7897,\n    0x9872: 0x8155,\n    0x989F: 0x5F0C,\n    0x98A0: 0x4E10,\n    0x98A1: 0x4E15,\n    0x98A2: 0x4E2A,\n    0x98A3: 0x4E31,\n    0x98A4: 0x4E36,\n    0x98A5: 0x4E3C,\n    0x98A6: 0x4E3F,\n    0x98A7: 0x4E42,\n    0x98A8: 0x4E56,\n    0x98A9: 0x4E58,\n    0x98AA: 0x4E82,\n    0x98AB: 0x4E85,\n    0x98AC: 0x8C6B,\n    0x98AD: 0x4E8A,\n    0x98AE: 0x8212,\n    0x98AF: 0x5F0D,\n    0x98B0: 0x4E8E,\n    0x98B1: 0x4E9E,\n    0x98B2: 0x4E9F,\n    0x98B3: 0x4EA0,\n    0x98B4: 0x4EA2,\n    0x98B5: 0x4EB0,\n    0x98B6: 0x4EB3,\n    0x98B7: 0x4EB6,\n    0x98B8: 0x4ECE,\n    0x98B9: 0x4ECD,\n    0x98BA: 0x4EC4,\n    0x98BB: 0x4EC6,\n    0x98BC: 0x4EC2,\n    0x98BD: 0x4ED7,\n    0x98BE: 0x4EDE,\n    0x98BF: 0x4EED,\n    0x98C0: 0x4EDF,\n    0x98C1: 0x4EF7,\n    0x98C2: 0x4F09,\n    0x98C3: 0x4F5A,\n    0x98C4: 0x4F30,\n    0x98C5: 0x4F5B,\n    0x98C6: 0x4F5D,\n    0x98C7: 0x4F57,\n    0x98C8: 0x4F47,\n    0x98C9: 0x4F76,\n    0x98CA: 0x4F88,\n    0x98CB: 0x4F8F,\n    0x98CC: 0x4F98,\n    0x98CD: 0x4F7B,\n    0x98CE: 0x4F69,\n    0x98CF: 0x4F70,\n    0x98D0: 0x4F91,\n    0x98D1: 0x4F6F,\n    0x98D2: 0x4F86,\n    0x98D3: 0x4F96,\n    0x98D4: 0x5118,\n    0x98D5: 0x4FD4,\n    0x98D6: 0x4FDF,\n    0x98D7: 0x4FCE,\n    0x98D8: 0x4FD8,\n    0x98D9: 0x4FDB,\n    0x98DA: 0x4FD1,\n    0x98DB: 0x4FDA,\n    0x98DC: 0x4FD0,\n    0x98DD: 0x4FE4,\n    0x98DE: 0x4FE5,\n    0x98DF: 0x501A,\n    0x98E0: 0x5028,\n    0x98E1: 0x5014,\n    0x98E2: 0x502A,\n    0x98E3: 0x5025,\n    0x98E4: 0x5005,\n    0x98E5: 0x4F1C,\n    0x98E6: 0x4FF6,\n    0x98E7: 0x5021,\n    0x98E8: 0x5029,\n    0x98E9: 0x502C,\n    0x98EA: 0x4FFE,\n    0x98EB: 0x4FEF,\n    0x98EC: 0x5011,\n    0x98ED: 0x5006,\n    0x98EE: 0x5043,\n    0x98EF: 0x5047,\n    0x98F0: 0x6703,\n    0x98F1: 0x5055,\n    0x98F2: 0x5050,\n    0x98F3: 0x5048,\n    0x98F4: 0x505A,\n    0x98F5: 0x5056,\n    0x98F6: 0x506C,\n    0x98F7: 0x5078,\n    0x98F8: 0x5080,\n    0x98F9: 0x509A,\n    0x98FA: 0x5085,\n    0x98FB: 0x50B4,\n    0x98FC: 0x50B2,\n    0x9940: 0x50C9,\n    0x9941: 0x50CA,\n    0x9942: 0x50B3,\n    0x9943: 0x50C2,\n    0x9944: 0x50D6,\n    0x9945: 0x50DE,\n    0x9946: 0x50E5,\n    0x9947: 0x50ED,\n    0x9948: 0x50E3,\n    0x9949: 0x50EE,\n    0x994A: 0x50F9,\n    0x994B: 0x50F5,\n    0x994C: 0x5109,\n    0x994D: 0x5101,\n    0x994E: 0x5102,\n    0x994F: 0x5116,\n    0x9950: 0x5115,\n    0x9951: 0x5114,\n    0x9952: 0x511A,\n    0x9953: 0x5121,\n    0x9954: 0x513A,\n    0x9955: 0x5137,\n    0x9956: 0x513C,\n    0x9957: 0x513B,\n    0x9958: 0x513F,\n    0x9959: 0x5140,\n    0x995A: 0x5152,\n    0x995B: 0x514C,\n    0x995C: 0x5154,\n    0x995D: 0x5162,\n    0x995E: 0x7AF8,\n    0x995F: 0x5169,\n    0x9960: 0x516A,\n    0x9961: 0x516E,\n    0x9962: 0x5180,\n    0x9963: 0x5182,\n    0x9964: 0x56D8,\n    0x9965: 0x518C,\n    0x9966: 0x5189,\n    0x9967: 0x518F,\n    0x9968: 0x5191,\n    0x9969: 0x5193,\n    0x996A: 0x5195,\n    0x996B: 0x5196,\n    0x996C: 0x51A4,\n    0x996D: 0x51A6,\n    0x996E: 0x51A2,\n    0x996F: 0x51A9,\n    0x9970: 0x51AA,\n    0x9971: 0x51AB,\n    0x9972: 0x51B3,\n    0x9973: 0x51B1,\n    0x9974: 0x51B2,\n    0x9975: 0x51B0,\n    0x9976: 0x51B5,\n    0x9977: 0x51BD,\n    0x9978: 0x51C5,\n    0x9979: 0x51C9,\n    0x997A: 0x51DB,\n    0x997B: 0x51E0,\n    0x997C: 0x8655,\n    0x997D: 0x51E9,\n    0x997E: 0x51ED,\n    0x9980: 0x51F0,\n    0x9981: 0x51F5,\n    0x9982: 0x51FE,\n    0x9983: 0x5204,\n    0x9984: 0x520B,\n    0x9985: 0x5214,\n    0x9986: 0x520E,\n    0x9987: 0x5227,\n    0x9988: 0x522A,\n    0x9989: 0x522E,\n    0x998A: 0x5233,\n    0x998B: 0x5239,\n    0x998C: 0x524F,\n    0x998D: 0x5244,\n    0x998E: 0x524B,\n    0x998F: 0x524C,\n    0x9990: 0x525E,\n    0x9991: 0x5254,\n    0x9992: 0x526A,\n    0x9993: 0x5274,\n    0x9994: 0x5269,\n    0x9995: 0x5273,\n    0x9996: 0x527F,\n    0x9997: 0x527D,\n    0x9998: 0x528D,\n    0x9999: 0x5294,\n    0x999A: 0x5292,\n    0x999B: 0x5271,\n    0x999C: 0x5288,\n    0x999D: 0x5291,\n    0x999E: 0x8FA8,\n    0x999F: 0x8FA7,\n    0x99A0: 0x52AC,\n    0x99A1: 0x52AD,\n    0x99A2: 0x52BC,\n    0x99A3: 0x52B5,\n    0x99A4: 0x52C1,\n    0x99A5: 0x52CD,\n    0x99A6: 0x52D7,\n    0x99A7: 0x52DE,\n    0x99A8: 0x52E3,\n    0x99A9: 0x52E6,\n    0x99AA: 0x98ED,\n    0x99AB: 0x52E0,\n    0x99AC: 0x52F3,\n    0x99AD: 0x52F5,\n    0x99AE: 0x52F8,\n    0x99AF: 0x52F9,\n    0x99B0: 0x5306,\n    0x99B1: 0x5308,\n    0x99B2: 0x7538,\n    0x99B3: 0x530D,\n    0x99B4: 0x5310,\n    0x99B5: 0x530F,\n    0x99B6: 0x5315,\n    0x99B7: 0x531A,\n    0x99B8: 0x5323,\n    0x99B9: 0x532F,\n    0x99BA: 0x5331,\n    0x99BB: 0x5333,\n    0x99BC: 0x5338,\n    0x99BD: 0x5340,\n    0x99BE: 0x5346,\n    0x99BF: 0x5345,\n    0x99C0: 0x4E17,\n    0x99C1: 0x5349,\n    0x99C2: 0x534D,\n    0x99C3: 0x51D6,\n    0x99C4: 0x535E,\n    0x99C5: 0x5369,\n    0x99C6: 0x536E,\n    0x99C7: 0x5918,\n    0x99C8: 0x537B,\n    0x99C9: 0x5377,\n    0x99CA: 0x5382,\n    0x99CB: 0x5396,\n    0x99CC: 0x53A0,\n    0x99CD: 0x53A6,\n    0x99CE: 0x53A5,\n    0x99CF: 0x53AE,\n    0x99D0: 0x53B0,\n    0x99D1: 0x53B6,\n    0x99D2: 0x53C3,\n    0x99D3: 0x7C12,\n    0x99D4: 0x96D9,\n    0x99D5: 0x53DF,\n    0x99D6: 0x66FC,\n    0x99D7: 0x71EE,\n    0x99D8: 0x53EE,\n    0x99D9: 0x53E8,\n    0x99DA: 0x53ED,\n    0x99DB: 0x53FA,\n    0x99DC: 0x5401,\n    0x99DD: 0x543D,\n    0x99DE: 0x5440,\n    0x99DF: 0x542C,\n    0x99E0: 0x542D,\n    0x99E1: 0x543C,\n    0x99E2: 0x542E,\n    0x99E3: 0x5436,\n    0x99E4: 0x5429,\n    0x99E5: 0x541D,\n    0x99E6: 0x544E,\n    0x99E7: 0x548F,\n    0x99E8: 0x5475,\n    0x99E9: 0x548E,\n    0x99EA: 0x545F,\n    0x99EB: 0x5471,\n    0x99EC: 0x5477,\n    0x99ED: 0x5470,\n    0x99EE: 0x5492,\n    0x99EF: 0x547B,\n    0x99F0: 0x5480,\n    0x99F1: 0x5476,\n    0x99F2: 0x5484,\n    0x99F3: 0x5490,\n    0x99F4: 0x5486,\n    0x99F5: 0x54C7,\n    0x99F6: 0x54A2,\n    0x99F7: 0x54B8,\n    0x99F8: 0x54A5,\n    0x99F9: 0x54AC,\n    0x99FA: 0x54C4,\n    0x99FB: 0x54C8,\n    0x99FC: 0x54A8,\n    0x9A40: 0x54AB,\n    0x9A41: 0x54C2,\n    0x9A42: 0x54A4,\n    0x9A43: 0x54BE,\n    0x9A44: 0x54BC,\n    0x9A45: 0x54D8,\n    0x9A46: 0x54E5,\n    0x9A47: 0x54E6,\n    0x9A48: 0x550F,\n    0x9A49: 0x5514,\n    0x9A4A: 0x54FD,\n    0x9A4B: 0x54EE,\n    0x9A4C: 0x54ED,\n    0x9A4D: 0x54FA,\n    0x9A4E: 0x54E2,\n    0x9A4F: 0x5539,\n    0x9A50: 0x5540,\n    0x9A51: 0x5563,\n    0x9A52: 0x554C,\n    0x9A53: 0x552E,\n    0x9A54: 0x555C,\n    0x9A55: 0x5545,\n    0x9A56: 0x5556,\n    0x9A57: 0x5557,\n    0x9A58: 0x5538,\n    0x9A59: 0x5533,\n    0x9A5A: 0x555D,\n    0x9A5B: 0x5599,\n    0x9A5C: 0x5580,\n    0x9A5D: 0x54AF,\n    0x9A5E: 0x558A,\n    0x9A5F: 0x559F,\n    0x9A60: 0x557B,\n    0x9A61: 0x557E,\n    0x9A62: 0x5598,\n    0x9A63: 0x559E,\n    0x9A64: 0x55AE,\n    0x9A65: 0x557C,\n    0x9A66: 0x5583,\n    0x9A67: 0x55A9,\n    0x9A68: 0x5587,\n    0x9A69: 0x55A8,\n    0x9A6A: 0x55DA,\n    0x9A6B: 0x55C5,\n    0x9A6C: 0x55DF,\n    0x9A6D: 0x55C4,\n    0x9A6E: 0x55DC,\n    0x9A6F: 0x55E4,\n    0x9A70: 0x55D4,\n    0x9A71: 0x5614,\n    0x9A72: 0x55F7,\n    0x9A73: 0x5616,\n    0x9A74: 0x55FE,\n    0x9A75: 0x55FD,\n    0x9A76: 0x561B,\n    0x9A77: 0x55F9,\n    0x9A78: 0x564E,\n    0x9A79: 0x5650,\n    0x9A7A: 0x71DF,\n    0x9A7B: 0x5634,\n    0x9A7C: 0x5636,\n    0x9A7D: 0x5632,\n    0x9A7E: 0x5638,\n    0x9A80: 0x566B,\n    0x9A81: 0x5664,\n    0x9A82: 0x562F,\n    0x9A83: 0x566C,\n    0x9A84: 0x566A,\n    0x9A85: 0x5686,\n    0x9A86: 0x5680,\n    0x9A87: 0x568A,\n    0x9A88: 0x56A0,\n    0x9A89: 0x5694,\n    0x9A8A: 0x568F,\n    0x9A8B: 0x56A5,\n    0x9A8C: 0x56AE,\n    0x9A8D: 0x56B6,\n    0x9A8E: 0x56B4,\n    0x9A8F: 0x56C2,\n    0x9A90: 0x56BC,\n    0x9A91: 0x56C1,\n    0x9A92: 0x56C3,\n    0x9A93: 0x56C0,\n    0x9A94: 0x56C8,\n    0x9A95: 0x56CE,\n    0x9A96: 0x56D1,\n    0x9A97: 0x56D3,\n    0x9A98: 0x56D7,\n    0x9A99: 0x56EE,\n    0x9A9A: 0x56F9,\n    0x9A9B: 0x5700,\n    0x9A9C: 0x56FF,\n    0x9A9D: 0x5704,\n    0x9A9E: 0x5709,\n    0x9A9F: 0x5708,\n    0x9AA0: 0x570B,\n    0x9AA1: 0x570D,\n    0x9AA2: 0x5713,\n    0x9AA3: 0x5718,\n    0x9AA4: 0x5716,\n    0x9AA5: 0x55C7,\n    0x9AA6: 0x571C,\n    0x9AA7: 0x5726,\n    0x9AA8: 0x5737,\n    0x9AA9: 0x5738,\n    0x9AAA: 0x574E,\n    0x9AAB: 0x573B,\n    0x9AAC: 0x5740,\n    0x9AAD: 0x574F,\n    0x9AAE: 0x5769,\n    0x9AAF: 0x57C0,\n    0x9AB0: 0x5788,\n    0x9AB1: 0x5761,\n    0x9AB2: 0x577F,\n    0x9AB3: 0x5789,\n    0x9AB4: 0x5793,\n    0x9AB5: 0x57A0,\n    0x9AB6: 0x57B3,\n    0x9AB7: 0x57A4,\n    0x9AB8: 0x57AA,\n    0x9AB9: 0x57B0,\n    0x9ABA: 0x57C3,\n    0x9ABB: 0x57C6,\n    0x9ABC: 0x57D4,\n    0x9ABD: 0x57D2,\n    0x9ABE: 0x57D3,\n    0x9ABF: 0x580A,\n    0x9AC0: 0x57D6,\n    0x9AC1: 0x57E3,\n    0x9AC2: 0x580B,\n    0x9AC3: 0x5819,\n    0x9AC4: 0x581D,\n    0x9AC5: 0x5872,\n    0x9AC6: 0x5821,\n    0x9AC7: 0x5862,\n    0x9AC8: 0x584B,\n    0x9AC9: 0x5870,\n    0x9ACA: 0x6BC0,\n    0x9ACB: 0x5852,\n    0x9ACC: 0x583D,\n    0x9ACD: 0x5879,\n    0x9ACE: 0x5885,\n    0x9ACF: 0x58B9,\n    0x9AD0: 0x589F,\n    0x9AD1: 0x58AB,\n    0x9AD2: 0x58BA,\n    0x9AD3: 0x58DE,\n    0x9AD4: 0x58BB,\n    0x9AD5: 0x58B8,\n    0x9AD6: 0x58AE,\n    0x9AD7: 0x58C5,\n    0x9AD8: 0x58D3,\n    0x9AD9: 0x58D1,\n    0x9ADA: 0x58D7,\n    0x9ADB: 0x58D9,\n    0x9ADC: 0x58D8,\n    0x9ADD: 0x58E5,\n    0x9ADE: 0x58DC,\n    0x9ADF: 0x58E4,\n    0x9AE0: 0x58DF,\n    0x9AE1: 0x58EF,\n    0x9AE2: 0x58FA,\n    0x9AE3: 0x58F9,\n    0x9AE4: 0x58FB,\n    0x9AE5: 0x58FC,\n    0x9AE6: 0x58FD,\n    0x9AE7: 0x5902,\n    0x9AE8: 0x590A,\n    0x9AE9: 0x5910,\n    0x9AEA: 0x591B,\n    0x9AEB: 0x68A6,\n    0x9AEC: 0x5925,\n    0x9AED: 0x592C,\n    0x9AEE: 0x592D,\n    0x9AEF: 0x5932,\n    0x9AF0: 0x5938,\n    0x9AF1: 0x593E,\n    0x9AF2: 0x7AD2,\n    0x9AF3: 0x5955,\n    0x9AF4: 0x5950,\n    0x9AF5: 0x594E,\n    0x9AF6: 0x595A,\n    0x9AF7: 0x5958,\n    0x9AF8: 0x5962,\n    0x9AF9: 0x5960,\n    0x9AFA: 0x5967,\n    0x9AFB: 0x596C,\n    0x9AFC: 0x5969,\n    0x9B40: 0x5978,\n    0x9B41: 0x5981,\n    0x9B42: 0x599D,\n    0x9B43: 0x4F5E,\n    0x9B44: 0x4FAB,\n    0x9B45: 0x59A3,\n    0x9B46: 0x59B2,\n    0x9B47: 0x59C6,\n    0x9B48: 0x59E8,\n    0x9B49: 0x59DC,\n    0x9B4A: 0x598D,\n    0x9B4B: 0x59D9,\n    0x9B4C: 0x59DA,\n    0x9B4D: 0x5A25,\n    0x9B4E: 0x5A1F,\n    0x9B4F: 0x5A11,\n    0x9B50: 0x5A1C,\n    0x9B51: 0x5A09,\n    0x9B52: 0x5A1A,\n    0x9B53: 0x5A40,\n    0x9B54: 0x5A6C,\n    0x9B55: 0x5A49,\n    0x9B56: 0x5A35,\n    0x9B57: 0x5A36,\n    0x9B58: 0x5A62,\n    0x9B59: 0x5A6A,\n    0x9B5A: 0x5A9A,\n    0x9B5B: 0x5ABC,\n    0x9B5C: 0x5ABE,\n    0x9B5D: 0x5ACB,\n    0x9B5E: 0x5AC2,\n    0x9B5F: 0x5ABD,\n    0x9B60: 0x5AE3,\n    0x9B61: 0x5AD7,\n    0x9B62: 0x5AE6,\n    0x9B63: 0x5AE9,\n    0x9B64: 0x5AD6,\n    0x9B65: 0x5AFA,\n    0x9B66: 0x5AFB,\n    0x9B67: 0x5B0C,\n    0x9B68: 0x5B0B,\n    0x9B69: 0x5B16,\n    0x9B6A: 0x5B32,\n    0x9B6B: 0x5AD0,\n    0x9B6C: 0x5B2A,\n    0x9B6D: 0x5B36,\n    0x9B6E: 0x5B3E,\n    0x9B6F: 0x5B43,\n    0x9B70: 0x5B45,\n    0x9B71: 0x5B40,\n    0x9B72: 0x5B51,\n    0x9B73: 0x5B55,\n    0x9B74: 0x5B5A,\n    0x9B75: 0x5B5B,\n    0x9B76: 0x5B65,\n    0x9B77: 0x5B69,\n    0x9B78: 0x5B70,\n    0x9B79: 0x5B73,\n    0x9B7A: 0x5B75,\n    0x9B7B: 0x5B78,\n    0x9B7C: 0x6588,\n    0x9B7D: 0x5B7A,\n    0x9B7E: 0x5B80,\n    0x9B80: 0x5B83,\n    0x9B81: 0x5BA6,\n    0x9B82: 0x5BB8,\n    0x9B83: 0x5BC3,\n    0x9B84: 0x5BC7,\n    0x9B85: 0x5BC9,\n    0x9B86: 0x5BD4,\n    0x9B87: 0x5BD0,\n    0x9B88: 0x5BE4,\n    0x9B89: 0x5BE6,\n    0x9B8A: 0x5BE2,\n    0x9B8B: 0x5BDE,\n    0x9B8C: 0x5BE5,\n    0x9B8D: 0x5BEB,\n    0x9B8E: 0x5BF0,\n    0x9B8F: 0x5BF6,\n    0x9B90: 0x5BF3,\n    0x9B91: 0x5C05,\n    0x9B92: 0x5C07,\n    0x9B93: 0x5C08,\n    0x9B94: 0x5C0D,\n    0x9B95: 0x5C13,\n    0x9B96: 0x5C20,\n    0x9B97: 0x5C22,\n    0x9B98: 0x5C28,\n    0x9B99: 0x5C38,\n    0x9B9A: 0x5C39,\n    0x9B9B: 0x5C41,\n    0x9B9C: 0x5C46,\n    0x9B9D: 0x5C4E,\n    0x9B9E: 0x5C53,\n    0x9B9F: 0x5C50,\n    0x9BA0: 0x5C4F,\n    0x9BA1: 0x5B71,\n    0x9BA2: 0x5C6C,\n    0x9BA3: 0x5C6E,\n    0x9BA4: 0x4E62,\n    0x9BA5: 0x5C76,\n    0x9BA6: 0x5C79,\n    0x9BA7: 0x5C8C,\n    0x9BA8: 0x5C91,\n    0x9BA9: 0x5C94,\n    0x9BAA: 0x599B,\n    0x9BAB: 0x5CAB,\n    0x9BAC: 0x5CBB,\n    0x9BAD: 0x5CB6,\n    0x9BAE: 0x5CBC,\n    0x9BAF: 0x5CB7,\n    0x9BB0: 0x5CC5,\n    0x9BB1: 0x5CBE,\n    0x9BB2: 0x5CC7,\n    0x9BB3: 0x5CD9,\n    0x9BB4: 0x5CE9,\n    0x9BB5: 0x5CFD,\n    0x9BB6: 0x5CFA,\n    0x9BB7: 0x5CED,\n    0x9BB8: 0x5D8C,\n    0x9BB9: 0x5CEA,\n    0x9BBA: 0x5D0B,\n    0x9BBB: 0x5D15,\n    0x9BBC: 0x5D17,\n    0x9BBD: 0x5D5C,\n    0x9BBE: 0x5D1F,\n    0x9BBF: 0x5D1B,\n    0x9BC0: 0x5D11,\n    0x9BC1: 0x5D14,\n    0x9BC2: 0x5D22,\n    0x9BC3: 0x5D1A,\n    0x9BC4: 0x5D19,\n    0x9BC5: 0x5D18,\n    0x9BC6: 0x5D4C,\n    0x9BC7: 0x5D52,\n    0x9BC8: 0x5D4E,\n    0x9BC9: 0x5D4B,\n    0x9BCA: 0x5D6C,\n    0x9BCB: 0x5D73,\n    0x9BCC: 0x5D76,\n    0x9BCD: 0x5D87,\n    0x9BCE: 0x5D84,\n    0x9BCF: 0x5D82,\n    0x9BD0: 0x5DA2,\n    0x9BD1: 0x5D9D,\n    0x9BD2: 0x5DAC,\n    0x9BD3: 0x5DAE,\n    0x9BD4: 0x5DBD,\n    0x9BD5: 0x5D90,\n    0x9BD6: 0x5DB7,\n    0x9BD7: 0x5DBC,\n    0x9BD8: 0x5DC9,\n    0x9BD9: 0x5DCD,\n    0x9BDA: 0x5DD3,\n    0x9BDB: 0x5DD2,\n    0x9BDC: 0x5DD6,\n    0x9BDD: 0x5DDB,\n    0x9BDE: 0x5DEB,\n    0x9BDF: 0x5DF2,\n    0x9BE0: 0x5DF5,\n    0x9BE1: 0x5E0B,\n    0x9BE2: 0x5E1A,\n    0x9BE3: 0x5E19,\n    0x9BE4: 0x5E11,\n    0x9BE5: 0x5E1B,\n    0x9BE6: 0x5E36,\n    0x9BE7: 0x5E37,\n    0x9BE8: 0x5E44,\n    0x9BE9: 0x5E43,\n    0x9BEA: 0x5E40,\n    0x9BEB: 0x5E4E,\n    0x9BEC: 0x5E57,\n    0x9BED: 0x5E54,\n    0x9BEE: 0x5E5F,\n    0x9BEF: 0x5E62,\n    0x9BF0: 0x5E64,\n    0x9BF1: 0x5E47,\n    0x9BF2: 0x5E75,\n    0x9BF3: 0x5E76,\n    0x9BF4: 0x5E7A,\n    0x9BF5: 0x9EBC,\n    0x9BF6: 0x5E7F,\n    0x9BF7: 0x5EA0,\n    0x9BF8: 0x5EC1,\n    0x9BF9: 0x5EC2,\n    0x9BFA: 0x5EC8,\n    0x9BFB: 0x5ED0,\n    0x9BFC: 0x5ECF,\n    0x9C40: 0x5ED6,\n    0x9C41: 0x5EE3,\n    0x9C42: 0x5EDD,\n    0x9C43: 0x5EDA,\n    0x9C44: 0x5EDB,\n    0x9C45: 0x5EE2,\n    0x9C46: 0x5EE1,\n    0x9C47: 0x5EE8,\n    0x9C48: 0x5EE9,\n    0x9C49: 0x5EEC,\n    0x9C4A: 0x5EF1,\n    0x9C4B: 0x5EF3,\n    0x9C4C: 0x5EF0,\n    0x9C4D: 0x5EF4,\n    0x9C4E: 0x5EF8,\n    0x9C4F: 0x5EFE,\n    0x9C50: 0x5F03,\n    0x9C51: 0x5F09,\n    0x9C52: 0x5F5D,\n    0x9C53: 0x5F5C,\n    0x9C54: 0x5F0B,\n    0x9C55: 0x5F11,\n    0x9C56: 0x5F16,\n    0x9C57: 0x5F29,\n    0x9C58: 0x5F2D,\n    0x9C59: 0x5F38,\n    0x9C5A: 0x5F41,\n    0x9C5B: 0x5F48,\n    0x9C5C: 0x5F4C,\n    0x9C5D: 0x5F4E,\n    0x9C5E: 0x5F2F,\n    0x9C5F: 0x5F51,\n    0x9C60: 0x5F56,\n    0x9C61: 0x5F57,\n    0x9C62: 0x5F59,\n    0x9C63: 0x5F61,\n    0x9C64: 0x5F6D,\n    0x9C65: 0x5F73,\n    0x9C66: 0x5F77,\n    0x9C67: 0x5F83,\n    0x9C68: 0x5F82,\n    0x9C69: 0x5F7F,\n    0x9C6A: 0x5F8A,\n    0x9C6B: 0x5F88,\n    0x9C6C: 0x5F91,\n    0x9C6D: 0x5F87,\n    0x9C6E: 0x5F9E,\n    0x9C6F: 0x5F99,\n    0x9C70: 0x5F98,\n    0x9C71: 0x5FA0,\n    0x9C72: 0x5FA8,\n    0x9C73: 0x5FAD,\n    0x9C74: 0x5FBC,\n    0x9C75: 0x5FD6,\n    0x9C76: 0x5FFB,\n    0x9C77: 0x5FE4,\n    0x9C78: 0x5FF8,\n    0x9C79: 0x5FF1,\n    0x9C7A: 0x5FDD,\n    0x9C7B: 0x60B3,\n    0x9C7C: 0x5FFF,\n    0x9C7D: 0x6021,\n    0x9C7E: 0x6060,\n    0x9C80: 0x6019,\n    0x9C81: 0x6010,\n    0x9C82: 0x6029,\n    0x9C83: 0x600E,\n    0x9C84: 0x6031,\n    0x9C85: 0x601B,\n    0x9C86: 0x6015,\n    0x9C87: 0x602B,\n    0x9C88: 0x6026,\n    0x9C89: 0x600F,\n    0x9C8A: 0x603A,\n    0x9C8B: 0x605A,\n    0x9C8C: 0x6041,\n    0x9C8D: 0x606A,\n    0x9C8E: 0x6077,\n    0x9C8F: 0x605F,\n    0x9C90: 0x604A,\n    0x9C91: 0x6046,\n    0x9C92: 0x604D,\n    0x9C93: 0x6063,\n    0x9C94: 0x6043,\n    0x9C95: 0x6064,\n    0x9C96: 0x6042,\n    0x9C97: 0x606C,\n    0x9C98: 0x606B,\n    0x9C99: 0x6059,\n    0x9C9A: 0x6081,\n    0x9C9B: 0x608D,\n    0x9C9C: 0x60E7,\n    0x9C9D: 0x6083,\n    0x9C9E: 0x609A,\n    0x9C9F: 0x6084,\n    0x9CA0: 0x609B,\n    0x9CA1: 0x6096,\n    0x9CA2: 0x6097,\n    0x9CA3: 0x6092,\n    0x9CA4: 0x60A7,\n    0x9CA5: 0x608B,\n    0x9CA6: 0x60E1,\n    0x9CA7: 0x60B8,\n    0x9CA8: 0x60E0,\n    0x9CA9: 0x60D3,\n    0x9CAA: 0x60B4,\n    0x9CAB: 0x5FF0,\n    0x9CAC: 0x60BD,\n    0x9CAD: 0x60C6,\n    0x9CAE: 0x60B5,\n    0x9CAF: 0x60D8,\n    0x9CB0: 0x614D,\n    0x9CB1: 0x6115,\n    0x9CB2: 0x6106,\n    0x9CB3: 0x60F6,\n    0x9CB4: 0x60F7,\n    0x9CB5: 0x6100,\n    0x9CB6: 0x60F4,\n    0x9CB7: 0x60FA,\n    0x9CB8: 0x6103,\n    0x9CB9: 0x6121,\n    0x9CBA: 0x60FB,\n    0x9CBB: 0x60F1,\n    0x9CBC: 0x610D,\n    0x9CBD: 0x610E,\n    0x9CBE: 0x6147,\n    0x9CBF: 0x613E,\n    0x9CC0: 0x6128,\n    0x9CC1: 0x6127,\n    0x9CC2: 0x614A,\n    0x9CC3: 0x613F,\n    0x9CC4: 0x613C,\n    0x9CC5: 0x612C,\n    0x9CC6: 0x6134,\n    0x9CC7: 0x613D,\n    0x9CC8: 0x6142,\n    0x9CC9: 0x6144,\n    0x9CCA: 0x6173,\n    0x9CCB: 0x6177,\n    0x9CCC: 0x6158,\n    0x9CCD: 0x6159,\n    0x9CCE: 0x615A,\n    0x9CCF: 0x616B,\n    0x9CD0: 0x6174,\n    0x9CD1: 0x616F,\n    0x9CD2: 0x6165,\n    0x9CD3: 0x6171,\n    0x9CD4: 0x615F,\n    0x9CD5: 0x615D,\n    0x9CD6: 0x6153,\n    0x9CD7: 0x6175,\n    0x9CD8: 0x6199,\n    0x9CD9: 0x6196,\n    0x9CDA: 0x6187,\n    0x9CDB: 0x61AC,\n    0x9CDC: 0x6194,\n    0x9CDD: 0x619A,\n    0x9CDE: 0x618A,\n    0x9CDF: 0x6191,\n    0x9CE0: 0x61AB,\n    0x9CE1: 0x61AE,\n    0x9CE2: 0x61CC,\n    0x9CE3: 0x61CA,\n    0x9CE4: 0x61C9,\n    0x9CE5: 0x61F7,\n    0x9CE6: 0x61C8,\n    0x9CE7: 0x61C3,\n    0x9CE8: 0x61C6,\n    0x9CE9: 0x61BA,\n    0x9CEA: 0x61CB,\n    0x9CEB: 0x7F79,\n    0x9CEC: 0x61CD,\n    0x9CED: 0x61E6,\n    0x9CEE: 0x61E3,\n    0x9CEF: 0x61F6,\n    0x9CF0: 0x61FA,\n    0x9CF1: 0x61F4,\n    0x9CF2: 0x61FF,\n    0x9CF3: 0x61FD,\n    0x9CF4: 0x61FC,\n    0x9CF5: 0x61FE,\n    0x9CF6: 0x6200,\n    0x9CF7: 0x6208,\n    0x9CF8: 0x6209,\n    0x9CF9: 0x620D,\n    0x9CFA: 0x620C,\n    0x9CFB: 0x6214,\n    0x9CFC: 0x621B,\n    0x9D40: 0x621E,\n    0x9D41: 0x6221,\n    0x9D42: 0x622A,\n    0x9D43: 0x622E,\n    0x9D44: 0x6230,\n    0x9D45: 0x6232,\n    0x9D46: 0x6233,\n    0x9D47: 0x6241,\n    0x9D48: 0x624E,\n    0x9D49: 0x625E,\n    0x9D4A: 0x6263,\n    0x9D4B: 0x625B,\n    0x9D4C: 0x6260,\n    0x9D4D: 0x6268,\n    0x9D4E: 0x627C,\n    0x9D4F: 0x6282,\n    0x9D50: 0x6289,\n    0x9D51: 0x627E,\n    0x9D52: 0x6292,\n    0x9D53: 0x6293,\n    0x9D54: 0x6296,\n    0x9D55: 0x62D4,\n    0x9D56: 0x6283,\n    0x9D57: 0x6294,\n    0x9D58: 0x62D7,\n    0x9D59: 0x62D1,\n    0x9D5A: 0x62BB,\n    0x9D5B: 0x62CF,\n    0x9D5C: 0x62FF,\n    0x9D5D: 0x62C6,\n    0x9D5E: 0x64D4,\n    0x9D5F: 0x62C8,\n    0x9D60: 0x62DC,\n    0x9D61: 0x62CC,\n    0x9D62: 0x62CA,\n    0x9D63: 0x62C2,\n    0x9D64: 0x62C7,\n    0x9D65: 0x629B,\n    0x9D66: 0x62C9,\n    0x9D67: 0x630C,\n    0x9D68: 0x62EE,\n    0x9D69: 0x62F1,\n    0x9D6A: 0x6327,\n    0x9D6B: 0x6302,\n    0x9D6C: 0x6308,\n    0x9D6D: 0x62EF,\n    0x9D6E: 0x62F5,\n    0x9D6F: 0x6350,\n    0x9D70: 0x633E,\n    0x9D71: 0x634D,\n    0x9D72: 0x641C,\n    0x9D73: 0x634F,\n    0x9D74: 0x6396,\n    0x9D75: 0x638E,\n    0x9D76: 0x6380,\n    0x9D77: 0x63AB,\n    0x9D78: 0x6376,\n    0x9D79: 0x63A3,\n    0x9D7A: 0x638F,\n    0x9D7B: 0x6389,\n    0x9D7C: 0x639F,\n    0x9D7D: 0x63B5,\n    0x9D7E: 0x636B,\n    0x9D80: 0x6369,\n    0x9D81: 0x63BE,\n    0x9D82: 0x63E9,\n    0x9D83: 0x63C0,\n    0x9D84: 0x63C6,\n    0x9D85: 0x63E3,\n    0x9D86: 0x63C9,\n    0x9D87: 0x63D2,\n    0x9D88: 0x63F6,\n    0x9D89: 0x63C4,\n    0x9D8A: 0x6416,\n    0x9D8B: 0x6434,\n    0x9D8C: 0x6406,\n    0x9D8D: 0x6413,\n    0x9D8E: 0x6426,\n    0x9D8F: 0x6436,\n    0x9D90: 0x651D,\n    0x9D91: 0x6417,\n    0x9D92: 0x6428,\n    0x9D93: 0x640F,\n    0x9D94: 0x6467,\n    0x9D95: 0x646F,\n    0x9D96: 0x6476,\n    0x9D97: 0x644E,\n    0x9D98: 0x652A,\n    0x9D99: 0x6495,\n    0x9D9A: 0x6493,\n    0x9D9B: 0x64A5,\n    0x9D9C: 0x64A9,\n    0x9D9D: 0x6488,\n    0x9D9E: 0x64BC,\n    0x9D9F: 0x64DA,\n    0x9DA0: 0x64D2,\n    0x9DA1: 0x64C5,\n    0x9DA2: 0x64C7,\n    0x9DA3: 0x64BB,\n    0x9DA4: 0x64D8,\n    0x9DA5: 0x64C2,\n    0x9DA6: 0x64F1,\n    0x9DA7: 0x64E7,\n    0x9DA8: 0x8209,\n    0x9DA9: 0x64E0,\n    0x9DAA: 0x64E1,\n    0x9DAB: 0x62AC,\n    0x9DAC: 0x64E3,\n    0x9DAD: 0x64EF,\n    0x9DAE: 0x652C,\n    0x9DAF: 0x64F6,\n    0x9DB0: 0x64F4,\n    0x9DB1: 0x64F2,\n    0x9DB2: 0x64FA,\n    0x9DB3: 0x6500,\n    0x9DB4: 0x64FD,\n    0x9DB5: 0x6518,\n    0x9DB6: 0x651C,\n    0x9DB7: 0x6505,\n    0x9DB8: 0x6524,\n    0x9DB9: 0x6523,\n    0x9DBA: 0x652B,\n    0x9DBB: 0x6534,\n    0x9DBC: 0x6535,\n    0x9DBD: 0x6537,\n    0x9DBE: 0x6536,\n    0x9DBF: 0x6538,\n    0x9DC0: 0x754B,\n    0x9DC1: 0x6548,\n    0x9DC2: 0x6556,\n    0x9DC3: 0x6555,\n    0x9DC4: 0x654D,\n    0x9DC5: 0x6558,\n    0x9DC6: 0x655E,\n    0x9DC7: 0x655D,\n    0x9DC8: 0x6572,\n    0x9DC9: 0x6578,\n    0x9DCA: 0x6582,\n    0x9DCB: 0x6583,\n    0x9DCC: 0x8B8A,\n    0x9DCD: 0x659B,\n    0x9DCE: 0x659F,\n    0x9DCF: 0x65AB,\n    0x9DD0: 0x65B7,\n    0x9DD1: 0x65C3,\n    0x9DD2: 0x65C6,\n    0x9DD3: 0x65C1,\n    0x9DD4: 0x65C4,\n    0x9DD5: 0x65CC,\n    0x9DD6: 0x65D2,\n    0x9DD7: 0x65DB,\n    0x9DD8: 0x65D9,\n    0x9DD9: 0x65E0,\n    0x9DDA: 0x65E1,\n    0x9DDB: 0x65F1,\n    0x9DDC: 0x6772,\n    0x9DDD: 0x660A,\n    0x9DDE: 0x6603,\n    0x9DDF: 0x65FB,\n    0x9DE0: 0x6773,\n    0x9DE1: 0x6635,\n    0x9DE2: 0x6636,\n    0x9DE3: 0x6634,\n    0x9DE4: 0x661C,\n    0x9DE5: 0x664F,\n    0x9DE6: 0x6644,\n    0x9DE7: 0x6649,\n    0x9DE8: 0x6641,\n    0x9DE9: 0x665E,\n    0x9DEA: 0x665D,\n    0x9DEB: 0x6664,\n    0x9DEC: 0x6667,\n    0x9DED: 0x6668,\n    0x9DEE: 0x665F,\n    0x9DEF: 0x6662,\n    0x9DF0: 0x6670,\n    0x9DF1: 0x6683,\n    0x9DF2: 0x6688,\n    0x9DF3: 0x668E,\n    0x9DF4: 0x6689,\n    0x9DF5: 0x6684,\n    0x9DF6: 0x6698,\n    0x9DF7: 0x669D,\n    0x9DF8: 0x66C1,\n    0x9DF9: 0x66B9,\n    0x9DFA: 0x66C9,\n    0x9DFB: 0x66BE,\n    0x9DFC: 0x66BC,\n    0x9E40: 0x66C4,\n    0x9E41: 0x66B8,\n    0x9E42: 0x66D6,\n    0x9E43: 0x66DA,\n    0x9E44: 0x66E0,\n    0x9E45: 0x663F,\n    0x9E46: 0x66E6,\n    0x9E47: 0x66E9,\n    0x9E48: 0x66F0,\n    0x9E49: 0x66F5,\n    0x9E4A: 0x66F7,\n    0x9E4B: 0x670F,\n    0x9E4C: 0x6716,\n    0x9E4D: 0x671E,\n    0x9E4E: 0x6726,\n    0x9E4F: 0x6727,\n    0x9E50: 0x9738,\n    0x9E51: 0x672E,\n    0x9E52: 0x673F,\n    0x9E53: 0x6736,\n    0x9E54: 0x6741,\n    0x9E55: 0x6738,\n    0x9E56: 0x6737,\n    0x9E57: 0x6746,\n    0x9E58: 0x675E,\n    0x9E59: 0x6760,\n    0x9E5A: 0x6759,\n    0x9E5B: 0x6763,\n    0x9E5C: 0x6764,\n    0x9E5D: 0x6789,\n    0x9E5E: 0x6770,\n    0x9E5F: 0x67A9,\n    0x9E60: 0x677C,\n    0x9E61: 0x676A,\n    0x9E62: 0x678C,\n    0x9E63: 0x678B,\n    0x9E64: 0x67A6,\n    0x9E65: 0x67A1,\n    0x9E66: 0x6785,\n    0x9E67: 0x67B7,\n    0x9E68: 0x67EF,\n    0x9E69: 0x67B4,\n    0x9E6A: 0x67EC,\n    0x9E6B: 0x67B3,\n    0x9E6C: 0x67E9,\n    0x9E6D: 0x67B8,\n    0x9E6E: 0x67E4,\n    0x9E6F: 0x67DE,\n    0x9E70: 0x67DD,\n    0x9E71: 0x67E2,\n    0x9E72: 0x67EE,\n    0x9E73: 0x67B9,\n    0x9E74: 0x67CE,\n    0x9E75: 0x67C6,\n    0x9E76: 0x67E7,\n    0x9E77: 0x6A9C,\n    0x9E78: 0x681E,\n    0x9E79: 0x6846,\n    0x9E7A: 0x6829,\n    0x9E7B: 0x6840,\n    0x9E7C: 0x684D,\n    0x9E7D: 0x6832,\n    0x9E7E: 0x684E,\n    0x9E80: 0x68B3,\n    0x9E81: 0x682B,\n    0x9E82: 0x6859,\n    0x9E83: 0x6863,\n    0x9E84: 0x6877,\n    0x9E85: 0x687F,\n    0x9E86: 0x689F,\n    0x9E87: 0x688F,\n    0x9E88: 0x68AD,\n    0x9E89: 0x6894,\n    0x9E8A: 0x689D,\n    0x9E8B: 0x689B,\n    0x9E8C: 0x6883,\n    0x9E8D: 0x6AAE,\n    0x9E8E: 0x68B9,\n    0x9E8F: 0x6874,\n    0x9E90: 0x68B5,\n    0x9E91: 0x68A0,\n    0x9E92: 0x68BA,\n    0x9E93: 0x690F,\n    0x9E94: 0x688D,\n    0x9E95: 0x687E,\n    0x9E96: 0x6901,\n    0x9E97: 0x68CA,\n    0x9E98: 0x6908,\n    0x9E99: 0x68D8,\n    0x9E9A: 0x6922,\n    0x9E9B: 0x6926,\n    0x9E9C: 0x68E1,\n    0x9E9D: 0x690C,\n    0x9E9E: 0x68CD,\n    0x9E9F: 0x68D4,\n    0x9EA0: 0x68E7,\n    0x9EA1: 0x68D5,\n    0x9EA2: 0x6936,\n    0x9EA3: 0x6912,\n    0x9EA4: 0x6904,\n    0x9EA5: 0x68D7,\n    0x9EA6: 0x68E3,\n    0x9EA7: 0x6925,\n    0x9EA8: 0x68F9,\n    0x9EA9: 0x68E0,\n    0x9EAA: 0x68EF,\n    0x9EAB: 0x6928,\n    0x9EAC: 0x692A,\n    0x9EAD: 0x691A,\n    0x9EAE: 0x6923,\n    0x9EAF: 0x6921,\n    0x9EB0: 0x68C6,\n    0x9EB1: 0x6979,\n    0x9EB2: 0x6977,\n    0x9EB3: 0x695C,\n    0x9EB4: 0x6978,\n    0x9EB5: 0x696B,\n    0x9EB6: 0x6954,\n    0x9EB7: 0x697E,\n    0x9EB8: 0x696E,\n    0x9EB9: 0x6939,\n    0x9EBA: 0x6974,\n    0x9EBB: 0x693D,\n    0x9EBC: 0x6959,\n    0x9EBD: 0x6930,\n    0x9EBE: 0x6961,\n    0x9EBF: 0x695E,\n    0x9EC0: 0x695D,\n    0x9EC1: 0x6981,\n    0x9EC2: 0x696A,\n    0x9EC3: 0x69B2,\n    0x9EC4: 0x69AE,\n    0x9EC5: 0x69D0,\n    0x9EC6: 0x69BF,\n    0x9EC7: 0x69C1,\n    0x9EC8: 0x69D3,\n    0x9EC9: 0x69BE,\n    0x9ECA: 0x69CE,\n    0x9ECB: 0x5BE8,\n    0x9ECC: 0x69CA,\n    0x9ECD: 0x69DD,\n    0x9ECE: 0x69BB,\n    0x9ECF: 0x69C3,\n    0x9ED0: 0x69A7,\n    0x9ED1: 0x6A2E,\n    0x9ED2: 0x6991,\n    0x9ED3: 0x69A0,\n    0x9ED4: 0x699C,\n    0x9ED5: 0x6995,\n    0x9ED6: 0x69B4,\n    0x9ED7: 0x69DE,\n    0x9ED8: 0x69E8,\n    0x9ED9: 0x6A02,\n    0x9EDA: 0x6A1B,\n    0x9EDB: 0x69FF,\n    0x9EDC: 0x6B0A,\n    0x9EDD: 0x69F9,\n    0x9EDE: 0x69F2,\n    0x9EDF: 0x69E7,\n    0x9EE0: 0x6A05,\n    0x9EE1: 0x69B1,\n    0x9EE2: 0x6A1E,\n    0x9EE3: 0x69ED,\n    0x9EE4: 0x6A14,\n    0x9EE5: 0x69EB,\n    0x9EE6: 0x6A0A,\n    0x9EE7: 0x6A12,\n    0x9EE8: 0x6AC1,\n    0x9EE9: 0x6A23,\n    0x9EEA: 0x6A13,\n    0x9EEB: 0x6A44,\n    0x9EEC: 0x6A0C,\n    0x9EED: 0x6A72,\n    0x9EEE: 0x6A36,\n    0x9EEF: 0x6A78,\n    0x9EF0: 0x6A47,\n    0x9EF1: 0x6A62,\n    0x9EF2: 0x6A59,\n    0x9EF3: 0x6A66,\n    0x9EF4: 0x6A48,\n    0x9EF5: 0x6A38,\n    0x9EF6: 0x6A22,\n    0x9EF7: 0x6A90,\n    0x9EF8: 0x6A8D,\n    0x9EF9: 0x6AA0,\n    0x9EFA: 0x6A84,\n    0x9EFB: 0x6AA2,\n    0x9EFC: 0x6AA3,\n    0x9F40: 0x6A97,\n    0x9F41: 0x8617,\n    0x9F42: 0x6ABB,\n    0x9F43: 0x6AC3,\n    0x9F44: 0x6AC2,\n    0x9F45: 0x6AB8,\n    0x9F46: 0x6AB3,\n    0x9F47: 0x6AAC,\n    0x9F48: 0x6ADE,\n    0x9F49: 0x6AD1,\n    0x9F4A: 0x6ADF,\n    0x9F4B: 0x6AAA,\n    0x9F4C: 0x6ADA,\n    0x9F4D: 0x6AEA,\n    0x9F4E: 0x6AFB,\n    0x9F4F: 0x6B05,\n    0x9F50: 0x8616,\n    0x9F51: 0x6AFA,\n    0x9F52: 0x6B12,\n    0x9F53: 0x6B16,\n    0x9F54: 0x9B31,\n    0x9F55: 0x6B1F,\n    0x9F56: 0x6B38,\n    0x9F57: 0x6B37,\n    0x9F58: 0x76DC,\n    0x9F59: 0x6B39,\n    0x9F5A: 0x98EE,\n    0x9F5B: 0x6B47,\n    0x9F5C: 0x6B43,\n    0x9F5D: 0x6B49,\n    0x9F5E: 0x6B50,\n    0x9F5F: 0x6B59,\n    0x9F60: 0x6B54,\n    0x9F61: 0x6B5B,\n    0x9F62: 0x6B5F,\n    0x9F63: 0x6B61,\n    0x9F64: 0x6B78,\n    0x9F65: 0x6B79,\n    0x9F66: 0x6B7F,\n    0x9F67: 0x6B80,\n    0x9F68: 0x6B84,\n    0x9F69: 0x6B83,\n    0x9F6A: 0x6B8D,\n    0x9F6B: 0x6B98,\n    0x9F6C: 0x6B95,\n    0x9F6D: 0x6B9E,\n    0x9F6E: 0x6BA4,\n    0x9F6F: 0x6BAA,\n    0x9F70: 0x6BAB,\n    0x9F71: 0x6BAF,\n    0x9F72: 0x6BB2,\n    0x9F73: 0x6BB1,\n    0x9F74: 0x6BB3,\n    0x9F75: 0x6BB7,\n    0x9F76: 0x6BBC,\n    0x9F77: 0x6BC6,\n    0x9F78: 0x6BCB,\n    0x9F79: 0x6BD3,\n    0x9F7A: 0x6BDF,\n    0x9F7B: 0x6BEC,\n    0x9F7C: 0x6BEB,\n    0x9F7D: 0x6BF3,\n    0x9F7E: 0x6BEF,\n    0x9F80: 0x9EBE,\n    0x9F81: 0x6C08,\n    0x9F82: 0x6C13,\n    0x9F83: 0x6C14,\n    0x9F84: 0x6C1B,\n    0x9F85: 0x6C24,\n    0x9F86: 0x6C23,\n    0x9F87: 0x6C5E,\n    0x9F88: 0x6C55,\n    0x9F89: 0x6C62,\n    0x9F8A: 0x6C6A,\n    0x9F8B: 0x6C82,\n    0x9F8C: 0x6C8D,\n    0x9F8D: 0x6C9A,\n    0x9F8E: 0x6C81,\n    0x9F8F: 0x6C9B,\n    0x9F90: 0x6C7E,\n    0x9F91: 0x6C68,\n    0x9F92: 0x6C73,\n    0x9F93: 0x6C92,\n    0x9F94: 0x6C90,\n    0x9F95: 0x6CC4,\n    0x9F96: 0x6CF1,\n    0x9F97: 0x6CD3,\n    0x9F98: 0x6CBD,\n    0x9F99: 0x6CD7,\n    0x9F9A: 0x6CC5,\n    0x9F9B: 0x6CDD,\n    0x9F9C: 0x6CAE,\n    0x9F9D: 0x6CB1,\n    0x9F9E: 0x6CBE,\n    0x9F9F: 0x6CBA,\n    0x9FA0: 0x6CDB,\n    0x9FA1: 0x6CEF,\n    0x9FA2: 0x6CD9,\n    0x9FA3: 0x6CEA,\n    0x9FA4: 0x6D1F,\n    0x9FA5: 0x884D,\n    0x9FA6: 0x6D36,\n    0x9FA7: 0x6D2B,\n    0x9FA8: 0x6D3D,\n    0x9FA9: 0x6D38,\n    0x9FAA: 0x6D19,\n    0x9FAB: 0x6D35,\n    0x9FAC: 0x6D33,\n    0x9FAD: 0x6D12,\n    0x9FAE: 0x6D0C,\n    0x9FAF: 0x6D63,\n    0x9FB0: 0x6D93,\n    0x9FB1: 0x6D64,\n    0x9FB2: 0x6D5A,\n    0x9FB3: 0x6D79,\n    0x9FB4: 0x6D59,\n    0x9FB5: 0x6D8E,\n    0x9FB6: 0x6D95,\n    0x9FB7: 0x6FE4,\n    0x9FB8: 0x6D85,\n    0x9FB9: 0x6DF9,\n    0x9FBA: 0x6E15,\n    0x9FBB: 0x6E0A,\n    0x9FBC: 0x6DB5,\n    0x9FBD: 0x6DC7,\n    0x9FBE: 0x6DE6,\n    0x9FBF: 0x6DB8,\n    0x9FC0: 0x6DC6,\n    0x9FC1: 0x6DEC,\n    0x9FC2: 0x6DDE,\n    0x9FC3: 0x6DCC,\n    0x9FC4: 0x6DE8,\n    0x9FC5: 0x6DD2,\n    0x9FC6: 0x6DC5,\n    0x9FC7: 0x6DFA,\n    0x9FC8: 0x6DD9,\n    0x9FC9: 0x6DE4,\n    0x9FCA: 0x6DD5,\n    0x9FCB: 0x6DEA,\n    0x9FCC: 0x6DEE,\n    0x9FCD: 0x6E2D,\n    0x9FCE: 0x6E6E,\n    0x9FCF: 0x6E2E,\n    0x9FD0: 0x6E19,\n    0x9FD1: 0x6E72,\n    0x9FD2: 0x6E5F,\n    0x9FD3: 0x6E3E,\n    0x9FD4: 0x6E23,\n    0x9FD5: 0x6E6B,\n    0x9FD6: 0x6E2B,\n    0x9FD7: 0x6E76,\n    0x9FD8: 0x6E4D,\n    0x9FD9: 0x6E1F,\n    0x9FDA: 0x6E43,\n    0x9FDB: 0x6E3A,\n    0x9FDC: 0x6E4E,\n    0x9FDD: 0x6E24,\n    0x9FDE: 0x6EFF,\n    0x9FDF: 0x6E1D,\n    0x9FE0: 0x6E38,\n    0x9FE1: 0x6E82,\n    0x9FE2: 0x6EAA,\n    0x9FE3: 0x6E98,\n    0x9FE4: 0x6EC9,\n    0x9FE5: 0x6EB7,\n    0x9FE6: 0x6ED3,\n    0x9FE7: 0x6EBD,\n    0x9FE8: 0x6EAF,\n    0x9FE9: 0x6EC4,\n    0x9FEA: 0x6EB2,\n    0x9FEB: 0x6ED4,\n    0x9FEC: 0x6ED5,\n    0x9FED: 0x6E8F,\n    0x9FEE: 0x6EA5,\n    0x9FEF: 0x6EC2,\n    0x9FF0: 0x6E9F,\n    0x9FF1: 0x6F41,\n    0x9FF2: 0x6F11,\n    0x9FF3: 0x704C,\n    0x9FF4: 0x6EEC,\n    0x9FF5: 0x6EF8,\n    0x9FF6: 0x6EFE,\n    0x9FF7: 0x6F3F,\n    0x9FF8: 0x6EF2,\n    0x9FF9: 0x6F31,\n    0x9FFA: 0x6EEF,\n    0x9FFB: 0x6F32,\n    0x9FFC: 0x6ECC,\n    0xA1: 0xFF61,\n    0xA2: 0xFF62,\n    0xA3: 0xFF63,\n    0xA4: 0xFF64,\n    0xA5: 0xFF65,\n    0xA6: 0xFF66,\n    0xA7: 0xFF67,\n    0xA8: 0xFF68,\n    0xA9: 0xFF69,\n    0xAA: 0xFF6A,\n    0xAB: 0xFF6B,\n    0xAC: 0xFF6C,\n    0xAD: 0xFF6D,\n    0xAE: 0xFF6E,\n    0xAF: 0xFF6F,\n    0xB0: 0xFF70,\n    0xB1: 0xFF71,\n    0xB2: 0xFF72,\n    0xB3: 0xFF73,\n    0xB4: 0xFF74,\n    0xB5: 0xFF75,\n    0xB6: 0xFF76,\n    0xB7: 0xFF77,\n    0xB8: 0xFF78,\n    0xB9: 0xFF79,\n    0xBA: 0xFF7A,\n    0xBB: 0xFF7B,\n    0xBC: 0xFF7C,\n    0xBD: 0xFF7D,\n    0xBE: 0xFF7E,\n    0xBF: 0xFF7F,\n    0xC0: 0xFF80,\n    0xC1: 0xFF81,\n    0xC2: 0xFF82,\n    0xC3: 0xFF83,\n    0xC4: 0xFF84,\n    0xC5: 0xFF85,\n    0xC6: 0xFF86,\n    0xC7: 0xFF87,\n    0xC8: 0xFF88,\n    0xC9: 0xFF89,\n    0xCA: 0xFF8A,\n    0xCB: 0xFF8B,\n    0xCC: 0xFF8C,\n    0xCD: 0xFF8D,\n    0xCE: 0xFF8E,\n    0xCF: 0xFF8F,\n    0xD0: 0xFF90,\n    0xD1: 0xFF91,\n    0xD2: 0xFF92,\n    0xD3: 0xFF93,\n    0xD4: 0xFF94,\n    0xD5: 0xFF95,\n    0xD6: 0xFF96,\n    0xD7: 0xFF97,\n    0xD8: 0xFF98,\n    0xD9: 0xFF99,\n    0xDA: 0xFF9A,\n    0xDB: 0xFF9B,\n    0xDC: 0xFF9C,\n    0xDD: 0xFF9D,\n    0xDE: 0xFF9E,\n    0xDF: 0xFF9F,\n    0xE040: 0x6F3E,\n    0xE041: 0x6F13,\n    0xE042: 0x6EF7,\n    0xE043: 0x6F86,\n    0xE044: 0x6F7A,\n    0xE045: 0x6F78,\n    0xE046: 0x6F81,\n    0xE047: 0x6F80,\n    0xE048: 0x6F6F,\n    0xE049: 0x6F5B,\n    0xE04A: 0x6FF3,\n    0xE04B: 0x6F6D,\n    0xE04C: 0x6F82,\n    0xE04D: 0x6F7C,\n    0xE04E: 0x6F58,\n    0xE04F: 0x6F8E,\n    0xE050: 0x6F91,\n    0xE051: 0x6FC2,\n    0xE052: 0x6F66,\n    0xE053: 0x6FB3,\n    0xE054: 0x6FA3,\n    0xE055: 0x6FA1,\n    0xE056: 0x6FA4,\n    0xE057: 0x6FB9,\n    0xE058: 0x6FC6,\n    0xE059: 0x6FAA,\n    0xE05A: 0x6FDF,\n    0xE05B: 0x6FD5,\n    0xE05C: 0x6FEC,\n    0xE05D: 0x6FD4,\n    0xE05E: 0x6FD8,\n    0xE05F: 0x6FF1,\n    0xE060: 0x6FEE,\n    0xE061: 0x6FDB,\n    0xE062: 0x7009,\n    0xE063: 0x700B,\n    0xE064: 0x6FFA,\n    0xE065: 0x7011,\n    0xE066: 0x7001,\n    0xE067: 0x700F,\n    0xE068: 0x6FFE,\n    0xE069: 0x701B,\n    0xE06A: 0x701A,\n    0xE06B: 0x6F74,\n    0xE06C: 0x701D,\n    0xE06D: 0x7018,\n    0xE06E: 0x701F,\n    0xE06F: 0x7030,\n    0xE070: 0x703E,\n    0xE071: 0x7032,\n    0xE072: 0x7051,\n    0xE073: 0x7063,\n    0xE074: 0x7099,\n    0xE075: 0x7092,\n    0xE076: 0x70AF,\n    0xE077: 0x70F1,\n    0xE078: 0x70AC,\n    0xE079: 0x70B8,\n    0xE07A: 0x70B3,\n    0xE07B: 0x70AE,\n    0xE07C: 0x70DF,\n    0xE07D: 0x70CB,\n    0xE07E: 0x70DD,\n    0xE080: 0x70D9,\n    0xE081: 0x7109,\n    0xE082: 0x70FD,\n    0xE083: 0x711C,\n    0xE084: 0x7119,\n    0xE085: 0x7165,\n    0xE086: 0x7155,\n    0xE087: 0x7188,\n    0xE088: 0x7166,\n    0xE089: 0x7162,\n    0xE08A: 0x714C,\n    0xE08B: 0x7156,\n    0xE08C: 0x716C,\n    0xE08D: 0x718F,\n    0xE08E: 0x71FB,\n    0xE08F: 0x7184,\n    0xE090: 0x7195,\n    0xE091: 0x71A8,\n    0xE092: 0x71AC,\n    0xE093: 0x71D7,\n    0xE094: 0x71B9,\n    0xE095: 0x71BE,\n    0xE096: 0x71D2,\n    0xE097: 0x71C9,\n    0xE098: 0x71D4,\n    0xE099: 0x71CE,\n    0xE09A: 0x71E0,\n    0xE09B: 0x71EC,\n    0xE09C: 0x71E7,\n    0xE09D: 0x71F5,\n    0xE09E: 0x71FC,\n    0xE09F: 0x71F9,\n    0xE0A0: 0x71FF,\n    0xE0A1: 0x720D,\n    0xE0A2: 0x7210,\n    0xE0A3: 0x721B,\n    0xE0A4: 0x7228,\n    0xE0A5: 0x722D,\n    0xE0A6: 0x722C,\n    0xE0A7: 0x7230,\n    0xE0A8: 0x7232,\n    0xE0A9: 0x723B,\n    0xE0AA: 0x723C,\n    0xE0AB: 0x723F,\n    0xE0AC: 0x7240,\n    0xE0AD: 0x7246,\n    0xE0AE: 0x724B,\n    0xE0AF: 0x7258,\n    0xE0B0: 0x7274,\n    0xE0B1: 0x727E,\n    0xE0B2: 0x7282,\n    0xE0B3: 0x7281,\n    0xE0B4: 0x7287,\n    0xE0B5: 0x7292,\n    0xE0B6: 0x7296,\n    0xE0B7: 0x72A2,\n    0xE0B8: 0x72A7,\n    0xE0B9: 0x72B9,\n    0xE0BA: 0x72B2,\n    0xE0BB: 0x72C3,\n    0xE0BC: 0x72C6,\n    0xE0BD: 0x72C4,\n    0xE0BE: 0x72CE,\n    0xE0BF: 0x72D2,\n    0xE0C0: 0x72E2,\n    0xE0C1: 0x72E0,\n    0xE0C2: 0x72E1,\n    0xE0C3: 0x72F9,\n    0xE0C4: 0x72F7,\n    0xE0C5: 0x500F,\n    0xE0C6: 0x7317,\n    0xE0C7: 0x730A,\n    0xE0C8: 0x731C,\n    0xE0C9: 0x7316,\n    0xE0CA: 0x731D,\n    0xE0CB: 0x7334,\n    0xE0CC: 0x732F,\n    0xE0CD: 0x7329,\n    0xE0CE: 0x7325,\n    0xE0CF: 0x733E,\n    0xE0D0: 0x734E,\n    0xE0D1: 0x734F,\n    0xE0D2: 0x9ED8,\n    0xE0D3: 0x7357,\n    0xE0D4: 0x736A,\n    0xE0D5: 0x7368,\n    0xE0D6: 0x7370,\n    0xE0D7: 0x7378,\n    0xE0D8: 0x7375,\n    0xE0D9: 0x737B,\n    0xE0DA: 0x737A,\n    0xE0DB: 0x73C8,\n    0xE0DC: 0x73B3,\n    0xE0DD: 0x73CE,\n    0xE0DE: 0x73BB,\n    0xE0DF: 0x73C0,\n    0xE0E0: 0x73E5,\n    0xE0E1: 0x73EE,\n    0xE0E2: 0x73DE,\n    0xE0E3: 0x74A2,\n    0xE0E4: 0x7405,\n    0xE0E5: 0x746F,\n    0xE0E6: 0x7425,\n    0xE0E7: 0x73F8,\n    0xE0E8: 0x7432,\n    0xE0E9: 0x743A,\n    0xE0EA: 0x7455,\n    0xE0EB: 0x743F,\n    0xE0EC: 0x745F,\n    0xE0ED: 0x7459,\n    0xE0EE: 0x7441,\n    0xE0EF: 0x745C,\n    0xE0F0: 0x7469,\n    0xE0F1: 0x7470,\n    0xE0F2: 0x7463,\n    0xE0F3: 0x746A,\n    0xE0F4: 0x7476,\n    0xE0F5: 0x747E,\n    0xE0F6: 0x748B,\n    0xE0F7: 0x749E,\n    0xE0F8: 0x74A7,\n    0xE0F9: 0x74CA,\n    0xE0FA: 0x74CF,\n    0xE0FB: 0x74D4,\n    0xE0FC: 0x73F1,\n    0xE140: 0x74E0,\n    0xE141: 0x74E3,\n    0xE142: 0x74E7,\n    0xE143: 0x74E9,\n    0xE144: 0x74EE,\n    0xE145: 0x74F2,\n    0xE146: 0x74F0,\n    0xE147: 0x74F1,\n    0xE148: 0x74F8,\n    0xE149: 0x74F7,\n    0xE14A: 0x7504,\n    0xE14B: 0x7503,\n    0xE14C: 0x7505,\n    0xE14D: 0x750C,\n    0xE14E: 0x750E,\n    0xE14F: 0x750D,\n    0xE150: 0x7515,\n    0xE151: 0x7513,\n    0xE152: 0x751E,\n    0xE153: 0x7526,\n    0xE154: 0x752C,\n    0xE155: 0x753C,\n    0xE156: 0x7544,\n    0xE157: 0x754D,\n    0xE158: 0x754A,\n    0xE159: 0x7549,\n    0xE15A: 0x755B,\n    0xE15B: 0x7546,\n    0xE15C: 0x755A,\n    0xE15D: 0x7569,\n    0xE15E: 0x7564,\n    0xE15F: 0x7567,\n    0xE160: 0x756B,\n    0xE161: 0x756D,\n    0xE162: 0x7578,\n    0xE163: 0x7576,\n    0xE164: 0x7586,\n    0xE165: 0x7587,\n    0xE166: 0x7574,\n    0xE167: 0x758A,\n    0xE168: 0x7589,\n    0xE169: 0x7582,\n    0xE16A: 0x7594,\n    0xE16B: 0x759A,\n    0xE16C: 0x759D,\n    0xE16D: 0x75A5,\n    0xE16E: 0x75A3,\n    0xE16F: 0x75C2,\n    0xE170: 0x75B3,\n    0xE171: 0x75C3,\n    0xE172: 0x75B5,\n    0xE173: 0x75BD,\n    0xE174: 0x75B8,\n    0xE175: 0x75BC,\n    0xE176: 0x75B1,\n    0xE177: 0x75CD,\n    0xE178: 0x75CA,\n    0xE179: 0x75D2,\n    0xE17A: 0x75D9,\n    0xE17B: 0x75E3,\n    0xE17C: 0x75DE,\n    0xE17D: 0x75FE,\n    0xE17E: 0x75FF,\n    0xE180: 0x75FC,\n    0xE181: 0x7601,\n    0xE182: 0x75F0,\n    0xE183: 0x75FA,\n    0xE184: 0x75F2,\n    0xE185: 0x75F3,\n    0xE186: 0x760B,\n    0xE187: 0x760D,\n    0xE188: 0x7609,\n    0xE189: 0x761F,\n    0xE18A: 0x7627,\n    0xE18B: 0x7620,\n    0xE18C: 0x7621,\n    0xE18D: 0x7622,\n    0xE18E: 0x7624,\n    0xE18F: 0x7634,\n    0xE190: 0x7630,\n    0xE191: 0x763B,\n    0xE192: 0x7647,\n    0xE193: 0x7648,\n    0xE194: 0x7646,\n    0xE195: 0x765C,\n    0xE196: 0x7658,\n    0xE197: 0x7661,\n    0xE198: 0x7662,\n    0xE199: 0x7668,\n    0xE19A: 0x7669,\n    0xE19B: 0x766A,\n    0xE19C: 0x7667,\n    0xE19D: 0x766C,\n    0xE19E: 0x7670,\n    0xE19F: 0x7672,\n    0xE1A0: 0x7676,\n    0xE1A1: 0x7678,\n    0xE1A2: 0x767C,\n    0xE1A3: 0x7680,\n    0xE1A4: 0x7683,\n    0xE1A5: 0x7688,\n    0xE1A6: 0x768B,\n    0xE1A7: 0x768E,\n    0xE1A8: 0x7696,\n    0xE1A9: 0x7693,\n    0xE1AA: 0x7699,\n    0xE1AB: 0x769A,\n    0xE1AC: 0x76B0,\n    0xE1AD: 0x76B4,\n    0xE1AE: 0x76B8,\n    0xE1AF: 0x76B9,\n    0xE1B0: 0x76BA,\n    0xE1B1: 0x76C2,\n    0xE1B2: 0x76CD,\n    0xE1B3: 0x76D6,\n    0xE1B4: 0x76D2,\n    0xE1B5: 0x76DE,\n    0xE1B6: 0x76E1,\n    0xE1B7: 0x76E5,\n    0xE1B8: 0x76E7,\n    0xE1B9: 0x76EA,\n    0xE1BA: 0x862F,\n    0xE1BB: 0x76FB,\n    0xE1BC: 0x7708,\n    0xE1BD: 0x7707,\n    0xE1BE: 0x7704,\n    0xE1BF: 0x7729,\n    0xE1C0: 0x7724,\n    0xE1C1: 0x771E,\n    0xE1C2: 0x7725,\n    0xE1C3: 0x7726,\n    0xE1C4: 0x771B,\n    0xE1C5: 0x7737,\n    0xE1C6: 0x7738,\n    0xE1C7: 0x7747,\n    0xE1C8: 0x775A,\n    0xE1C9: 0x7768,\n    0xE1CA: 0x776B,\n    0xE1CB: 0x775B,\n    0xE1CC: 0x7765,\n    0xE1CD: 0x777F,\n    0xE1CE: 0x777E,\n    0xE1CF: 0x7779,\n    0xE1D0: 0x778E,\n    0xE1D1: 0x778B,\n    0xE1D2: 0x7791,\n    0xE1D3: 0x77A0,\n    0xE1D4: 0x779E,\n    0xE1D5: 0x77B0,\n    0xE1D6: 0x77B6,\n    0xE1D7: 0x77B9,\n    0xE1D8: 0x77BF,\n    0xE1D9: 0x77BC,\n    0xE1DA: 0x77BD,\n    0xE1DB: 0x77BB,\n    0xE1DC: 0x77C7,\n    0xE1DD: 0x77CD,\n    0xE1DE: 0x77D7,\n    0xE1DF: 0x77DA,\n    0xE1E0: 0x77DC,\n    0xE1E1: 0x77E3,\n    0xE1E2: 0x77EE,\n    0xE1E3: 0x77FC,\n    0xE1E4: 0x780C,\n    0xE1E5: 0x7812,\n    0xE1E6: 0x7926,\n    0xE1E7: 0x7820,\n    0xE1E8: 0x792A,\n    0xE1E9: 0x7845,\n    0xE1EA: 0x788E,\n    0xE1EB: 0x7874,\n    0xE1EC: 0x7886,\n    0xE1ED: 0x787C,\n    0xE1EE: 0x789A,\n    0xE1EF: 0x788C,\n    0xE1F0: 0x78A3,\n    0xE1F1: 0x78B5,\n    0xE1F2: 0x78AA,\n    0xE1F3: 0x78AF,\n    0xE1F4: 0x78D1,\n    0xE1F5: 0x78C6,\n    0xE1F6: 0x78CB,\n    0xE1F7: 0x78D4,\n    0xE1F8: 0x78BE,\n    0xE1F9: 0x78BC,\n    0xE1FA: 0x78C5,\n    0xE1FB: 0x78CA,\n    0xE1FC: 0x78EC,\n    0xE240: 0x78E7,\n    0xE241: 0x78DA,\n    0xE242: 0x78FD,\n    0xE243: 0x78F4,\n    0xE244: 0x7907,\n    0xE245: 0x7912,\n    0xE246: 0x7911,\n    0xE247: 0x7919,\n    0xE248: 0x792C,\n    0xE249: 0x792B,\n    0xE24A: 0x7940,\n    0xE24B: 0x7960,\n    0xE24C: 0x7957,\n    0xE24D: 0x795F,\n    0xE24E: 0x795A,\n    0xE24F: 0x7955,\n    0xE250: 0x7953,\n    0xE251: 0x797A,\n    0xE252: 0x797F,\n    0xE253: 0x798A,\n    0xE254: 0x799D,\n    0xE255: 0x79A7,\n    0xE256: 0x9F4B,\n    0xE257: 0x79AA,\n    0xE258: 0x79AE,\n    0xE259: 0x79B3,\n    0xE25A: 0x79B9,\n    0xE25B: 0x79BA,\n    0xE25C: 0x79C9,\n    0xE25D: 0x79D5,\n    0xE25E: 0x79E7,\n    0xE25F: 0x79EC,\n    0xE260: 0x79E1,\n    0xE261: 0x79E3,\n    0xE262: 0x7A08,\n    0xE263: 0x7A0D,\n    0xE264: 0x7A18,\n    0xE265: 0x7A19,\n    0xE266: 0x7A20,\n    0xE267: 0x7A1F,\n    0xE268: 0x7980,\n    0xE269: 0x7A31,\n    0xE26A: 0x7A3B,\n    0xE26B: 0x7A3E,\n    0xE26C: 0x7A37,\n    0xE26D: 0x7A43,\n    0xE26E: 0x7A57,\n    0xE26F: 0x7A49,\n    0xE270: 0x7A61,\n    0xE271: 0x7A62,\n    0xE272: 0x7A69,\n    0xE273: 0x9F9D,\n    0xE274: 0x7A70,\n    0xE275: 0x7A79,\n    0xE276: 0x7A7D,\n    0xE277: 0x7A88,\n    0xE278: 0x7A97,\n    0xE279: 0x7A95,\n    0xE27A: 0x7A98,\n    0xE27B: 0x7A96,\n    0xE27C: 0x7AA9,\n    0xE27D: 0x7AC8,\n    0xE27E: 0x7AB0,\n    0xE280: 0x7AB6,\n    0xE281: 0x7AC5,\n    0xE282: 0x7AC4,\n    0xE283: 0x7ABF,\n    0xE284: 0x9083,\n    0xE285: 0x7AC7,\n    0xE286: 0x7ACA,\n    0xE287: 0x7ACD,\n    0xE288: 0x7ACF,\n    0xE289: 0x7AD5,\n    0xE28A: 0x7AD3,\n    0xE28B: 0x7AD9,\n    0xE28C: 0x7ADA,\n    0xE28D: 0x7ADD,\n    0xE28E: 0x7AE1,\n    0xE28F: 0x7AE2,\n    0xE290: 0x7AE6,\n    0xE291: 0x7AED,\n    0xE292: 0x7AF0,\n    0xE293: 0x7B02,\n    0xE294: 0x7B0F,\n    0xE295: 0x7B0A,\n    0xE296: 0x7B06,\n    0xE297: 0x7B33,\n    0xE298: 0x7B18,\n    0xE299: 0x7B19,\n    0xE29A: 0x7B1E,\n    0xE29B: 0x7B35,\n    0xE29C: 0x7B28,\n    0xE29D: 0x7B36,\n    0xE29E: 0x7B50,\n    0xE29F: 0x7B7A,\n    0xE2A0: 0x7B04,\n    0xE2A1: 0x7B4D,\n    0xE2A2: 0x7B0B,\n    0xE2A3: 0x7B4C,\n    0xE2A4: 0x7B45,\n    0xE2A5: 0x7B75,\n    0xE2A6: 0x7B65,\n    0xE2A7: 0x7B74,\n    0xE2A8: 0x7B67,\n    0xE2A9: 0x7B70,\n    0xE2AA: 0x7B71,\n    0xE2AB: 0x7B6C,\n    0xE2AC: 0x7B6E,\n    0xE2AD: 0x7B9D,\n    0xE2AE: 0x7B98,\n    0xE2AF: 0x7B9F,\n    0xE2B0: 0x7B8D,\n    0xE2B1: 0x7B9C,\n    0xE2B2: 0x7B9A,\n    0xE2B3: 0x7B8B,\n    0xE2B4: 0x7B92,\n    0xE2B5: 0x7B8F,\n    0xE2B6: 0x7B5D,\n    0xE2B7: 0x7B99,\n    0xE2B8: 0x7BCB,\n    0xE2B9: 0x7BC1,\n    0xE2BA: 0x7BCC,\n    0xE2BB: 0x7BCF,\n    0xE2BC: 0x7BB4,\n    0xE2BD: 0x7BC6,\n    0xE2BE: 0x7BDD,\n    0xE2BF: 0x7BE9,\n    0xE2C0: 0x7C11,\n    0xE2C1: 0x7C14,\n    0xE2C2: 0x7BE6,\n    0xE2C3: 0x7BE5,\n    0xE2C4: 0x7C60,\n    0xE2C5: 0x7C00,\n    0xE2C6: 0x7C07,\n    0xE2C7: 0x7C13,\n    0xE2C8: 0x7BF3,\n    0xE2C9: 0x7BF7,\n    0xE2CA: 0x7C17,\n    0xE2CB: 0x7C0D,\n    0xE2CC: 0x7BF6,\n    0xE2CD: 0x7C23,\n    0xE2CE: 0x7C27,\n    0xE2CF: 0x7C2A,\n    0xE2D0: 0x7C1F,\n    0xE2D1: 0x7C37,\n    0xE2D2: 0x7C2B,\n    0xE2D3: 0x7C3D,\n    0xE2D4: 0x7C4C,\n    0xE2D5: 0x7C43,\n    0xE2D6: 0x7C54,\n    0xE2D7: 0x7C4F,\n    0xE2D8: 0x7C40,\n    0xE2D9: 0x7C50,\n    0xE2DA: 0x7C58,\n    0xE2DB: 0x7C5F,\n    0xE2DC: 0x7C64,\n    0xE2DD: 0x7C56,\n    0xE2DE: 0x7C65,\n    0xE2DF: 0x7C6C,\n    0xE2E0: 0x7C75,\n    0xE2E1: 0x7C83,\n    0xE2E2: 0x7C90,\n    0xE2E3: 0x7CA4,\n    0xE2E4: 0x7CAD,\n    0xE2E5: 0x7CA2,\n    0xE2E6: 0x7CAB,\n    0xE2E7: 0x7CA1,\n    0xE2E8: 0x7CA8,\n    0xE2E9: 0x7CB3,\n    0xE2EA: 0x7CB2,\n    0xE2EB: 0x7CB1,\n    0xE2EC: 0x7CAE,\n    0xE2ED: 0x7CB9,\n    0xE2EE: 0x7CBD,\n    0xE2EF: 0x7CC0,\n    0xE2F0: 0x7CC5,\n    0xE2F1: 0x7CC2,\n    0xE2F2: 0x7CD8,\n    0xE2F3: 0x7CD2,\n    0xE2F4: 0x7CDC,\n    0xE2F5: 0x7CE2,\n    0xE2F6: 0x9B3B,\n    0xE2F7: 0x7CEF,\n    0xE2F8: 0x7CF2,\n    0xE2F9: 0x7CF4,\n    0xE2FA: 0x7CF6,\n    0xE2FB: 0x7CFA,\n    0xE2FC: 0x7D06,\n    0xE340: 0x7D02,\n    0xE341: 0x7D1C,\n    0xE342: 0x7D15,\n    0xE343: 0x7D0A,\n    0xE344: 0x7D45,\n    0xE345: 0x7D4B,\n    0xE346: 0x7D2E,\n    0xE347: 0x7D32,\n    0xE348: 0x7D3F,\n    0xE349: 0x7D35,\n    0xE34A: 0x7D46,\n    0xE34B: 0x7D73,\n    0xE34C: 0x7D56,\n    0xE34D: 0x7D4E,\n    0xE34E: 0x7D72,\n    0xE34F: 0x7D68,\n    0xE350: 0x7D6E,\n    0xE351: 0x7D4F,\n    0xE352: 0x7D63,\n    0xE353: 0x7D93,\n    0xE354: 0x7D89,\n    0xE355: 0x7D5B,\n    0xE356: 0x7D8F,\n    0xE357: 0x7D7D,\n    0xE358: 0x7D9B,\n    0xE359: 0x7DBA,\n    0xE35A: 0x7DAE,\n    0xE35B: 0x7DA3,\n    0xE35C: 0x7DB5,\n    0xE35D: 0x7DC7,\n    0xE35E: 0x7DBD,\n    0xE35F: 0x7DAB,\n    0xE360: 0x7E3D,\n    0xE361: 0x7DA2,\n    0xE362: 0x7DAF,\n    0xE363: 0x7DDC,\n    0xE364: 0x7DB8,\n    0xE365: 0x7D9F,\n    0xE366: 0x7DB0,\n    0xE367: 0x7DD8,\n    0xE368: 0x7DDD,\n    0xE369: 0x7DE4,\n    0xE36A: 0x7DDE,\n    0xE36B: 0x7DFB,\n    0xE36C: 0x7DF2,\n    0xE36D: 0x7DE1,\n    0xE36E: 0x7E05,\n    0xE36F: 0x7E0A,\n    0xE370: 0x7E23,\n    0xE371: 0x7E21,\n    0xE372: 0x7E12,\n    0xE373: 0x7E31,\n    0xE374: 0x7E1F,\n    0xE375: 0x7E09,\n    0xE376: 0x7E0B,\n    0xE377: 0x7E22,\n    0xE378: 0x7E46,\n    0xE379: 0x7E66,\n    0xE37A: 0x7E3B,\n    0xE37B: 0x7E35,\n    0xE37C: 0x7E39,\n    0xE37D: 0x7E43,\n    0xE37E: 0x7E37,\n    0xE380: 0x7E32,\n    0xE381: 0x7E3A,\n    0xE382: 0x7E67,\n    0xE383: 0x7E5D,\n    0xE384: 0x7E56,\n    0xE385: 0x7E5E,\n    0xE386: 0x7E59,\n    0xE387: 0x7E5A,\n    0xE388: 0x7E79,\n    0xE389: 0x7E6A,\n    0xE38A: 0x7E69,\n    0xE38B: 0x7E7C,\n    0xE38C: 0x7E7B,\n    0xE38D: 0x7E83,\n    0xE38E: 0x7DD5,\n    0xE38F: 0x7E7D,\n    0xE390: 0x8FAE,\n    0xE391: 0x7E7F,\n    0xE392: 0x7E88,\n    0xE393: 0x7E89,\n    0xE394: 0x7E8C,\n    0xE395: 0x7E92,\n    0xE396: 0x7E90,\n    0xE397: 0x7E93,\n    0xE398: 0x7E94,\n    0xE399: 0x7E96,\n    0xE39A: 0x7E8E,\n    0xE39B: 0x7E9B,\n    0xE39C: 0x7E9C,\n    0xE39D: 0x7F38,\n    0xE39E: 0x7F3A,\n    0xE39F: 0x7F45,\n    0xE3A0: 0x7F4C,\n    0xE3A1: 0x7F4D,\n    0xE3A2: 0x7F4E,\n    0xE3A3: 0x7F50,\n    0xE3A4: 0x7F51,\n    0xE3A5: 0x7F55,\n    0xE3A6: 0x7F54,\n    0xE3A7: 0x7F58,\n    0xE3A8: 0x7F5F,\n    0xE3A9: 0x7F60,\n    0xE3AA: 0x7F68,\n    0xE3AB: 0x7F69,\n    0xE3AC: 0x7F67,\n    0xE3AD: 0x7F78,\n    0xE3AE: 0x7F82,\n    0xE3AF: 0x7F86,\n    0xE3B0: 0x7F83,\n    0xE3B1: 0x7F88,\n    0xE3B2: 0x7F87,\n    0xE3B3: 0x7F8C,\n    0xE3B4: 0x7F94,\n    0xE3B5: 0x7F9E,\n    0xE3B6: 0x7F9D,\n    0xE3B7: 0x7F9A,\n    0xE3B8: 0x7FA3,\n    0xE3B9: 0x7FAF,\n    0xE3BA: 0x7FB2,\n    0xE3BB: 0x7FB9,\n    0xE3BC: 0x7FAE,\n    0xE3BD: 0x7FB6,\n    0xE3BE: 0x7FB8,\n    0xE3BF: 0x8B71,\n    0xE3C0: 0x7FC5,\n    0xE3C1: 0x7FC6,\n    0xE3C2: 0x7FCA,\n    0xE3C3: 0x7FD5,\n    0xE3C4: 0x7FD4,\n    0xE3C5: 0x7FE1,\n    0xE3C6: 0x7FE6,\n    0xE3C7: 0x7FE9,\n    0xE3C8: 0x7FF3,\n    0xE3C9: 0x7FF9,\n    0xE3CA: 0x98DC,\n    0xE3CB: 0x8006,\n    0xE3CC: 0x8004,\n    0xE3CD: 0x800B,\n    0xE3CE: 0x8012,\n    0xE3CF: 0x8018,\n    0xE3D0: 0x8019,\n    0xE3D1: 0x801C,\n    0xE3D2: 0x8021,\n    0xE3D3: 0x8028,\n    0xE3D4: 0x803F,\n    0xE3D5: 0x803B,\n    0xE3D6: 0x804A,\n    0xE3D7: 0x8046,\n    0xE3D8: 0x8052,\n    0xE3D9: 0x8058,\n    0xE3DA: 0x805A,\n    0xE3DB: 0x805F,\n    0xE3DC: 0x8062,\n    0xE3DD: 0x8068,\n    0xE3DE: 0x8073,\n    0xE3DF: 0x8072,\n    0xE3E0: 0x8070,\n    0xE3E1: 0x8076,\n    0xE3E2: 0x8079,\n    0xE3E3: 0x807D,\n    0xE3E4: 0x807F,\n    0xE3E5: 0x8084,\n    0xE3E6: 0x8086,\n    0xE3E7: 0x8085,\n    0xE3E8: 0x809B,\n    0xE3E9: 0x8093,\n    0xE3EA: 0x809A,\n    0xE3EB: 0x80AD,\n    0xE3EC: 0x5190,\n    0xE3ED: 0x80AC,\n    0xE3EE: 0x80DB,\n    0xE3EF: 0x80E5,\n    0xE3F0: 0x80D9,\n    0xE3F1: 0x80DD,\n    0xE3F2: 0x80C4,\n    0xE3F3: 0x80DA,\n    0xE3F4: 0x80D6,\n    0xE3F5: 0x8109,\n    0xE3F6: 0x80EF,\n    0xE3F7: 0x80F1,\n    0xE3F8: 0x811B,\n    0xE3F9: 0x8129,\n    0xE3FA: 0x8123,\n    0xE3FB: 0x812F,\n    0xE3FC: 0x814B,\n    0xE440: 0x968B,\n    0xE441: 0x8146,\n    0xE442: 0x813E,\n    0xE443: 0x8153,\n    0xE444: 0x8151,\n    0xE445: 0x80FC,\n    0xE446: 0x8171,\n    0xE447: 0x816E,\n    0xE448: 0x8165,\n    0xE449: 0x8166,\n    0xE44A: 0x8174,\n    0xE44B: 0x8183,\n    0xE44C: 0x8188,\n    0xE44D: 0x818A,\n    0xE44E: 0x8180,\n    0xE44F: 0x8182,\n    0xE450: 0x81A0,\n    0xE451: 0x8195,\n    0xE452: 0x81A4,\n    0xE453: 0x81A3,\n    0xE454: 0x815F,\n    0xE455: 0x8193,\n    0xE456: 0x81A9,\n    0xE457: 0x81B0,\n    0xE458: 0x81B5,\n    0xE459: 0x81BE,\n    0xE45A: 0x81B8,\n    0xE45B: 0x81BD,\n    0xE45C: 0x81C0,\n    0xE45D: 0x81C2,\n    0xE45E: 0x81BA,\n    0xE45F: 0x81C9,\n    0xE460: 0x81CD,\n    0xE461: 0x81D1,\n    0xE462: 0x81D9,\n    0xE463: 0x81D8,\n    0xE464: 0x81C8,\n    0xE465: 0x81DA,\n    0xE466: 0x81DF,\n    0xE467: 0x81E0,\n    0xE468: 0x81E7,\n    0xE469: 0x81FA,\n    0xE46A: 0x81FB,\n    0xE46B: 0x81FE,\n    0xE46C: 0x8201,\n    0xE46D: 0x8202,\n    0xE46E: 0x8205,\n    0xE46F: 0x8207,\n    0xE470: 0x820A,\n    0xE471: 0x820D,\n    0xE472: 0x8210,\n    0xE473: 0x8216,\n    0xE474: 0x8229,\n    0xE475: 0x822B,\n    0xE476: 0x8238,\n    0xE477: 0x8233,\n    0xE478: 0x8240,\n    0xE479: 0x8259,\n    0xE47A: 0x8258,\n    0xE47B: 0x825D,\n    0xE47C: 0x825A,\n    0xE47D: 0x825F,\n    0xE47E: 0x8264,\n    0xE480: 0x8262,\n    0xE481: 0x8268,\n    0xE482: 0x826A,\n    0xE483: 0x826B,\n    0xE484: 0x822E,\n    0xE485: 0x8271,\n    0xE486: 0x8277,\n    0xE487: 0x8278,\n    0xE488: 0x827E,\n    0xE489: 0x828D,\n    0xE48A: 0x8292,\n    0xE48B: 0x82AB,\n    0xE48C: 0x829F,\n    0xE48D: 0x82BB,\n    0xE48E: 0x82AC,\n    0xE48F: 0x82E1,\n    0xE490: 0x82E3,\n    0xE491: 0x82DF,\n    0xE492: 0x82D2,\n    0xE493: 0x82F4,\n    0xE494: 0x82F3,\n    0xE495: 0x82FA,\n    0xE496: 0x8393,\n    0xE497: 0x8303,\n    0xE498: 0x82FB,\n    0xE499: 0x82F9,\n    0xE49A: 0x82DE,\n    0xE49B: 0x8306,\n    0xE49C: 0x82DC,\n    0xE49D: 0x8309,\n    0xE49E: 0x82D9,\n    0xE49F: 0x8335,\n    0xE4A0: 0x8334,\n    0xE4A1: 0x8316,\n    0xE4A2: 0x8332,\n    0xE4A3: 0x8331,\n    0xE4A4: 0x8340,\n    0xE4A5: 0x8339,\n    0xE4A6: 0x8350,\n    0xE4A7: 0x8345,\n    0xE4A8: 0x832F,\n    0xE4A9: 0x832B,\n    0xE4AA: 0x8317,\n    0xE4AB: 0x8318,\n    0xE4AC: 0x8385,\n    0xE4AD: 0x839A,\n    0xE4AE: 0x83AA,\n    0xE4AF: 0x839F,\n    0xE4B0: 0x83A2,\n    0xE4B1: 0x8396,\n    0xE4B2: 0x8323,\n    0xE4B3: 0x838E,\n    0xE4B4: 0x8387,\n    0xE4B5: 0x838A,\n    0xE4B6: 0x837C,\n    0xE4B7: 0x83B5,\n    0xE4B8: 0x8373,\n    0xE4B9: 0x8375,\n    0xE4BA: 0x83A0,\n    0xE4BB: 0x8389,\n    0xE4BC: 0x83A8,\n    0xE4BD: 0x83F4,\n    0xE4BE: 0x8413,\n    0xE4BF: 0x83EB,\n    0xE4C0: 0x83CE,\n    0xE4C1: 0x83FD,\n    0xE4C2: 0x8403,\n    0xE4C3: 0x83D8,\n    0xE4C4: 0x840B,\n    0xE4C5: 0x83C1,\n    0xE4C6: 0x83F7,\n    0xE4C7: 0x8407,\n    0xE4C8: 0x83E0,\n    0xE4C9: 0x83F2,\n    0xE4CA: 0x840D,\n    0xE4CB: 0x8422,\n    0xE4CC: 0x8420,\n    0xE4CD: 0x83BD,\n    0xE4CE: 0x8438,\n    0xE4CF: 0x8506,\n    0xE4D0: 0x83FB,\n    0xE4D1: 0x846D,\n    0xE4D2: 0x842A,\n    0xE4D3: 0x843C,\n    0xE4D4: 0x855A,\n    0xE4D5: 0x8484,\n    0xE4D6: 0x8477,\n    0xE4D7: 0x846B,\n    0xE4D8: 0x84AD,\n    0xE4D9: 0x846E,\n    0xE4DA: 0x8482,\n    0xE4DB: 0x8469,\n    0xE4DC: 0x8446,\n    0xE4DD: 0x842C,\n    0xE4DE: 0x846F,\n    0xE4DF: 0x8479,\n    0xE4E0: 0x8435,\n    0xE4E1: 0x84CA,\n    0xE4E2: 0x8462,\n    0xE4E3: 0x84B9,\n    0xE4E4: 0x84BF,\n    0xE4E5: 0x849F,\n    0xE4E6: 0x84D9,\n    0xE4E7: 0x84CD,\n    0xE4E8: 0x84BB,\n    0xE4E9: 0x84DA,\n    0xE4EA: 0x84D0,\n    0xE4EB: 0x84C1,\n    0xE4EC: 0x84C6,\n    0xE4ED: 0x84D6,\n    0xE4EE: 0x84A1,\n    0xE4EF: 0x8521,\n    0xE4F0: 0x84FF,\n    0xE4F1: 0x84F4,\n    0xE4F2: 0x8517,\n    0xE4F3: 0x8518,\n    0xE4F4: 0x852C,\n    0xE4F5: 0x851F,\n    0xE4F6: 0x8515,\n    0xE4F7: 0x8514,\n    0xE4F8: 0x84FC,\n    0xE4F9: 0x8540,\n    0xE4FA: 0x8563,\n    0xE4FB: 0x8558,\n    0xE4FC: 0x8548,\n    0xE540: 0x8541,\n    0xE541: 0x8602,\n    0xE542: 0x854B,\n    0xE543: 0x8555,\n    0xE544: 0x8580,\n    0xE545: 0x85A4,\n    0xE546: 0x8588,\n    0xE547: 0x8591,\n    0xE548: 0x858A,\n    0xE549: 0x85A8,\n    0xE54A: 0x856D,\n    0xE54B: 0x8594,\n    0xE54C: 0x859B,\n    0xE54D: 0x85EA,\n    0xE54E: 0x8587,\n    0xE54F: 0x859C,\n    0xE550: 0x8577,\n    0xE551: 0x857E,\n    0xE552: 0x8590,\n    0xE553: 0x85C9,\n    0xE554: 0x85BA,\n    0xE555: 0x85CF,\n    0xE556: 0x85B9,\n    0xE557: 0x85D0,\n    0xE558: 0x85D5,\n    0xE559: 0x85DD,\n    0xE55A: 0x85E5,\n    0xE55B: 0x85DC,\n    0xE55C: 0x85F9,\n    0xE55D: 0x860A,\n    0xE55E: 0x8613,\n    0xE55F: 0x860B,\n    0xE560: 0x85FE,\n    0xE561: 0x85FA,\n    0xE562: 0x8606,\n    0xE563: 0x8622,\n    0xE564: 0x861A,\n    0xE565: 0x8630,\n    0xE566: 0x863F,\n    0xE567: 0x864D,\n    0xE568: 0x4E55,\n    0xE569: 0x8654,\n    0xE56A: 0x865F,\n    0xE56B: 0x8667,\n    0xE56C: 0x8671,\n    0xE56D: 0x8693,\n    0xE56E: 0x86A3,\n    0xE56F: 0x86A9,\n    0xE570: 0x86AA,\n    0xE571: 0x868B,\n    0xE572: 0x868C,\n    0xE573: 0x86B6,\n    0xE574: 0x86AF,\n    0xE575: 0x86C4,\n    0xE576: 0x86C6,\n    0xE577: 0x86B0,\n    0xE578: 0x86C9,\n    0xE579: 0x8823,\n    0xE57A: 0x86AB,\n    0xE57B: 0x86D4,\n    0xE57C: 0x86DE,\n    0xE57D: 0x86E9,\n    0xE57E: 0x86EC,\n    0xE580: 0x86DF,\n    0xE581: 0x86DB,\n    0xE582: 0x86EF,\n    0xE583: 0x8712,\n    0xE584: 0x8706,\n    0xE585: 0x8708,\n    0xE586: 0x8700,\n    0xE587: 0x8703,\n    0xE588: 0x86FB,\n    0xE589: 0x8711,\n    0xE58A: 0x8709,\n    0xE58B: 0x870D,\n    0xE58C: 0x86F9,\n    0xE58D: 0x870A,\n    0xE58E: 0x8734,\n    0xE58F: 0x873F,\n    0xE590: 0x8737,\n    0xE591: 0x873B,\n    0xE592: 0x8725,\n    0xE593: 0x8729,\n    0xE594: 0x871A,\n    0xE595: 0x8760,\n    0xE596: 0x875F,\n    0xE597: 0x8778,\n    0xE598: 0x874C,\n    0xE599: 0x874E,\n    0xE59A: 0x8774,\n    0xE59B: 0x8757,\n    0xE59C: 0x8768,\n    0xE59D: 0x876E,\n    0xE59E: 0x8759,\n    0xE59F: 0x8753,\n    0xE5A0: 0x8763,\n    0xE5A1: 0x876A,\n    0xE5A2: 0x8805,\n    0xE5A3: 0x87A2,\n    0xE5A4: 0x879F,\n    0xE5A5: 0x8782,\n    0xE5A6: 0x87AF,\n    0xE5A7: 0x87CB,\n    0xE5A8: 0x87BD,\n    0xE5A9: 0x87C0,\n    0xE5AA: 0x87D0,\n    0xE5AB: 0x96D6,\n    0xE5AC: 0x87AB,\n    0xE5AD: 0x87C4,\n    0xE5AE: 0x87B3,\n    0xE5AF: 0x87C7,\n    0xE5B0: 0x87C6,\n    0xE5B1: 0x87BB,\n    0xE5B2: 0x87EF,\n    0xE5B3: 0x87F2,\n    0xE5B4: 0x87E0,\n    0xE5B5: 0x880F,\n    0xE5B6: 0x880D,\n    0xE5B7: 0x87FE,\n    0xE5B8: 0x87F6,\n    0xE5B9: 0x87F7,\n    0xE5BA: 0x880E,\n    0xE5BB: 0x87D2,\n    0xE5BC: 0x8811,\n    0xE5BD: 0x8816,\n    0xE5BE: 0x8815,\n    0xE5BF: 0x8822,\n    0xE5C0: 0x8821,\n    0xE5C1: 0x8831,\n    0xE5C2: 0x8836,\n    0xE5C3: 0x8839,\n    0xE5C4: 0x8827,\n    0xE5C5: 0x883B,\n    0xE5C6: 0x8844,\n    0xE5C7: 0x8842,\n    0xE5C8: 0x8852,\n    0xE5C9: 0x8859,\n    0xE5CA: 0x885E,\n    0xE5CB: 0x8862,\n    0xE5CC: 0x886B,\n    0xE5CD: 0x8881,\n    0xE5CE: 0x887E,\n    0xE5CF: 0x889E,\n    0xE5D0: 0x8875,\n    0xE5D1: 0x887D,\n    0xE5D2: 0x88B5,\n    0xE5D3: 0x8872,\n    0xE5D4: 0x8882,\n    0xE5D5: 0x8897,\n    0xE5D6: 0x8892,\n    0xE5D7: 0x88AE,\n    0xE5D8: 0x8899,\n    0xE5D9: 0x88A2,\n    0xE5DA: 0x888D,\n    0xE5DB: 0x88A4,\n    0xE5DC: 0x88B0,\n    0xE5DD: 0x88BF,\n    0xE5DE: 0x88B1,\n    0xE5DF: 0x88C3,\n    0xE5E0: 0x88C4,\n    0xE5E1: 0x88D4,\n    0xE5E2: 0x88D8,\n    0xE5E3: 0x88D9,\n    0xE5E4: 0x88DD,\n    0xE5E5: 0x88F9,\n    0xE5E6: 0x8902,\n    0xE5E7: 0x88FC,\n    0xE5E8: 0x88F4,\n    0xE5E9: 0x88E8,\n    0xE5EA: 0x88F2,\n    0xE5EB: 0x8904,\n    0xE5EC: 0x890C,\n    0xE5ED: 0x890A,\n    0xE5EE: 0x8913,\n    0xE5EF: 0x8943,\n    0xE5F0: 0x891E,\n    0xE5F1: 0x8925,\n    0xE5F2: 0x892A,\n    0xE5F3: 0x892B,\n    0xE5F4: 0x8941,\n    0xE5F5: 0x8944,\n    0xE5F6: 0x893B,\n    0xE5F7: 0x8936,\n    0xE5F8: 0x8938,\n    0xE5F9: 0x894C,\n    0xE5FA: 0x891D,\n    0xE5FB: 0x8960,\n    0xE5FC: 0x895E,\n    0xE640: 0x8966,\n    0xE641: 0x8964,\n    0xE642: 0x896D,\n    0xE643: 0x896A,\n    0xE644: 0x896F,\n    0xE645: 0x8974,\n    0xE646: 0x8977,\n    0xE647: 0x897E,\n    0xE648: 0x8983,\n    0xE649: 0x8988,\n    0xE64A: 0x898A,\n    0xE64B: 0x8993,\n    0xE64C: 0x8998,\n    0xE64D: 0x89A1,\n    0xE64E: 0x89A9,\n    0xE64F: 0x89A6,\n    0xE650: 0x89AC,\n    0xE651: 0x89AF,\n    0xE652: 0x89B2,\n    0xE653: 0x89BA,\n    0xE654: 0x89BD,\n    0xE655: 0x89BF,\n    0xE656: 0x89C0,\n    0xE657: 0x89DA,\n    0xE658: 0x89DC,\n    0xE659: 0x89DD,\n    0xE65A: 0x89E7,\n    0xE65B: 0x89F4,\n    0xE65C: 0x89F8,\n    0xE65D: 0x8A03,\n    0xE65E: 0x8A16,\n    0xE65F: 0x8A10,\n    0xE660: 0x8A0C,\n    0xE661: 0x8A1B,\n    0xE662: 0x8A1D,\n    0xE663: 0x8A25,\n    0xE664: 0x8A36,\n    0xE665: 0x8A41,\n    0xE666: 0x8A5B,\n    0xE667: 0x8A52,\n    0xE668: 0x8A46,\n    0xE669: 0x8A48,\n    0xE66A: 0x8A7C,\n    0xE66B: 0x8A6D,\n    0xE66C: 0x8A6C,\n    0xE66D: 0x8A62,\n    0xE66E: 0x8A85,\n    0xE66F: 0x8A82,\n    0xE670: 0x8A84,\n    0xE671: 0x8AA8,\n    0xE672: 0x8AA1,\n    0xE673: 0x8A91,\n    0xE674: 0x8AA5,\n    0xE675: 0x8AA6,\n    0xE676: 0x8A9A,\n    0xE677: 0x8AA3,\n    0xE678: 0x8AC4,\n    0xE679: 0x8ACD,\n    0xE67A: 0x8AC2,\n    0xE67B: 0x8ADA,\n    0xE67C: 0x8AEB,\n    0xE67D: 0x8AF3,\n    0xE67E: 0x8AE7,\n    0xE680: 0x8AE4,\n    0xE681: 0x8AF1,\n    0xE682: 0x8B14,\n    0xE683: 0x8AE0,\n    0xE684: 0x8AE2,\n    0xE685: 0x8AF7,\n    0xE686: 0x8ADE,\n    0xE687: 0x8ADB,\n    0xE688: 0x8B0C,\n    0xE689: 0x8B07,\n    0xE68A: 0x8B1A,\n    0xE68B: 0x8AE1,\n    0xE68C: 0x8B16,\n    0xE68D: 0x8B10,\n    0xE68E: 0x8B17,\n    0xE68F: 0x8B20,\n    0xE690: 0x8B33,\n    0xE691: 0x97AB,\n    0xE692: 0x8B26,\n    0xE693: 0x8B2B,\n    0xE694: 0x8B3E,\n    0xE695: 0x8B28,\n    0xE696: 0x8B41,\n    0xE697: 0x8B4C,\n    0xE698: 0x8B4F,\n    0xE699: 0x8B4E,\n    0xE69A: 0x8B49,\n    0xE69B: 0x8B56,\n    0xE69C: 0x8B5B,\n    0xE69D: 0x8B5A,\n    0xE69E: 0x8B6B,\n    0xE69F: 0x8B5F,\n    0xE6A0: 0x8B6C,\n    0xE6A1: 0x8B6F,\n    0xE6A2: 0x8B74,\n    0xE6A3: 0x8B7D,\n    0xE6A4: 0x8B80,\n    0xE6A5: 0x8B8C,\n    0xE6A6: 0x8B8E,\n    0xE6A7: 0x8B92,\n    0xE6A8: 0x8B93,\n    0xE6A9: 0x8B96,\n    0xE6AA: 0x8B99,\n    0xE6AB: 0x8B9A,\n    0xE6AC: 0x8C3A,\n    0xE6AD: 0x8C41,\n    0xE6AE: 0x8C3F,\n    0xE6AF: 0x8C48,\n    0xE6B0: 0x8C4C,\n    0xE6B1: 0x8C4E,\n    0xE6B2: 0x8C50,\n    0xE6B3: 0x8C55,\n    0xE6B4: 0x8C62,\n    0xE6B5: 0x8C6C,\n    0xE6B6: 0x8C78,\n    0xE6B7: 0x8C7A,\n    0xE6B8: 0x8C82,\n    0xE6B9: 0x8C89,\n    0xE6BA: 0x8C85,\n    0xE6BB: 0x8C8A,\n    0xE6BC: 0x8C8D,\n    0xE6BD: 0x8C8E,\n    0xE6BE: 0x8C94,\n    0xE6BF: 0x8C7C,\n    0xE6C0: 0x8C98,\n    0xE6C1: 0x621D,\n    0xE6C2: 0x8CAD,\n    0xE6C3: 0x8CAA,\n    0xE6C4: 0x8CBD,\n    0xE6C5: 0x8CB2,\n    0xE6C6: 0x8CB3,\n    0xE6C7: 0x8CAE,\n    0xE6C8: 0x8CB6,\n    0xE6C9: 0x8CC8,\n    0xE6CA: 0x8CC1,\n    0xE6CB: 0x8CE4,\n    0xE6CC: 0x8CE3,\n    0xE6CD: 0x8CDA,\n    0xE6CE: 0x8CFD,\n    0xE6CF: 0x8CFA,\n    0xE6D0: 0x8CFB,\n    0xE6D1: 0x8D04,\n    0xE6D2: 0x8D05,\n    0xE6D3: 0x8D0A,\n    0xE6D4: 0x8D07,\n    0xE6D5: 0x8D0F,\n    0xE6D6: 0x8D0D,\n    0xE6D7: 0x8D10,\n    0xE6D8: 0x9F4E,\n    0xE6D9: 0x8D13,\n    0xE6DA: 0x8CCD,\n    0xE6DB: 0x8D14,\n    0xE6DC: 0x8D16,\n    0xE6DD: 0x8D67,\n    0xE6DE: 0x8D6D,\n    0xE6DF: 0x8D71,\n    0xE6E0: 0x8D73,\n    0xE6E1: 0x8D81,\n    0xE6E2: 0x8D99,\n    0xE6E3: 0x8DC2,\n    0xE6E4: 0x8DBE,\n    0xE6E5: 0x8DBA,\n    0xE6E6: 0x8DCF,\n    0xE6E7: 0x8DDA,\n    0xE6E8: 0x8DD6,\n    0xE6E9: 0x8DCC,\n    0xE6EA: 0x8DDB,\n    0xE6EB: 0x8DCB,\n    0xE6EC: 0x8DEA,\n    0xE6ED: 0x8DEB,\n    0xE6EE: 0x8DDF,\n    0xE6EF: 0x8DE3,\n    0xE6F0: 0x8DFC,\n    0xE6F1: 0x8E08,\n    0xE6F2: 0x8E09,\n    0xE6F3: 0x8DFF,\n    0xE6F4: 0x8E1D,\n    0xE6F5: 0x8E1E,\n    0xE6F6: 0x8E10,\n    0xE6F7: 0x8E1F,\n    0xE6F8: 0x8E42,\n    0xE6F9: 0x8E35,\n    0xE6FA: 0x8E30,\n    0xE6FB: 0x8E34,\n    0xE6FC: 0x8E4A,\n    0xE740: 0x8E47,\n    0xE741: 0x8E49,\n    0xE742: 0x8E4C,\n    0xE743: 0x8E50,\n    0xE744: 0x8E48,\n    0xE745: 0x8E59,\n    0xE746: 0x8E64,\n    0xE747: 0x8E60,\n    0xE748: 0x8E2A,\n    0xE749: 0x8E63,\n    0xE74A: 0x8E55,\n    0xE74B: 0x8E76,\n    0xE74C: 0x8E72,\n    0xE74D: 0x8E7C,\n    0xE74E: 0x8E81,\n    0xE74F: 0x8E87,\n    0xE750: 0x8E85,\n    0xE751: 0x8E84,\n    0xE752: 0x8E8B,\n    0xE753: 0x8E8A,\n    0xE754: 0x8E93,\n    0xE755: 0x8E91,\n    0xE756: 0x8E94,\n    0xE757: 0x8E99,\n    0xE758: 0x8EAA,\n    0xE759: 0x8EA1,\n    0xE75A: 0x8EAC,\n    0xE75B: 0x8EB0,\n    0xE75C: 0x8EC6,\n    0xE75D: 0x8EB1,\n    0xE75E: 0x8EBE,\n    0xE75F: 0x8EC5,\n    0xE760: 0x8EC8,\n    0xE761: 0x8ECB,\n    0xE762: 0x8EDB,\n    0xE763: 0x8EE3,\n    0xE764: 0x8EFC,\n    0xE765: 0x8EFB,\n    0xE766: 0x8EEB,\n    0xE767: 0x8EFE,\n    0xE768: 0x8F0A,\n    0xE769: 0x8F05,\n    0xE76A: 0x8F15,\n    0xE76B: 0x8F12,\n    0xE76C: 0x8F19,\n    0xE76D: 0x8F13,\n    0xE76E: 0x8F1C,\n    0xE76F: 0x8F1F,\n    0xE770: 0x8F1B,\n    0xE771: 0x8F0C,\n    0xE772: 0x8F26,\n    0xE773: 0x8F33,\n    0xE774: 0x8F3B,\n    0xE775: 0x8F39,\n    0xE776: 0x8F45,\n    0xE777: 0x8F42,\n    0xE778: 0x8F3E,\n    0xE779: 0x8F4C,\n    0xE77A: 0x8F49,\n    0xE77B: 0x8F46,\n    0xE77C: 0x8F4E,\n    0xE77D: 0x8F57,\n    0xE77E: 0x8F5C,\n    0xE780: 0x8F62,\n    0xE781: 0x8F63,\n    0xE782: 0x8F64,\n    0xE783: 0x8F9C,\n    0xE784: 0x8F9F,\n    0xE785: 0x8FA3,\n    0xE786: 0x8FAD,\n    0xE787: 0x8FAF,\n    0xE788: 0x8FB7,\n    0xE789: 0x8FDA,\n    0xE78A: 0x8FE5,\n    0xE78B: 0x8FE2,\n    0xE78C: 0x8FEA,\n    0xE78D: 0x8FEF,\n    0xE78E: 0x9087,\n    0xE78F: 0x8FF4,\n    0xE790: 0x9005,\n    0xE791: 0x8FF9,\n    0xE792: 0x8FFA,\n    0xE793: 0x9011,\n    0xE794: 0x9015,\n    0xE795: 0x9021,\n    0xE796: 0x900D,\n    0xE797: 0x901E,\n    0xE798: 0x9016,\n    0xE799: 0x900B,\n    0xE79A: 0x9027,\n    0xE79B: 0x9036,\n    0xE79C: 0x9035,\n    0xE79D: 0x9039,\n    0xE79E: 0x8FF8,\n    0xE79F: 0x904F,\n    0xE7A0: 0x9050,\n    0xE7A1: 0x9051,\n    0xE7A2: 0x9052,\n    0xE7A3: 0x900E,\n    0xE7A4: 0x9049,\n    0xE7A5: 0x903E,\n    0xE7A6: 0x9056,\n    0xE7A7: 0x9058,\n    0xE7A8: 0x905E,\n    0xE7A9: 0x9068,\n    0xE7AA: 0x906F,\n    0xE7AB: 0x9076,\n    0xE7AC: 0x96A8,\n    0xE7AD: 0x9072,\n    0xE7AE: 0x9082,\n    0xE7AF: 0x907D,\n    0xE7B0: 0x9081,\n    0xE7B1: 0x9080,\n    0xE7B2: 0x908A,\n    0xE7B3: 0x9089,\n    0xE7B4: 0x908F,\n    0xE7B5: 0x90A8,\n    0xE7B6: 0x90AF,\n    0xE7B7: 0x90B1,\n    0xE7B8: 0x90B5,\n    0xE7B9: 0x90E2,\n    0xE7BA: 0x90E4,\n    0xE7BB: 0x6248,\n    0xE7BC: 0x90DB,\n    0xE7BD: 0x9102,\n    0xE7BE: 0x9112,\n    0xE7BF: 0x9119,\n    0xE7C0: 0x9132,\n    0xE7C1: 0x9130,\n    0xE7C2: 0x914A,\n    0xE7C3: 0x9156,\n    0xE7C4: 0x9158,\n    0xE7C5: 0x9163,\n    0xE7C6: 0x9165,\n    0xE7C7: 0x9169,\n    0xE7C8: 0x9173,\n    0xE7C9: 0x9172,\n    0xE7CA: 0x918B,\n    0xE7CB: 0x9189,\n    0xE7CC: 0x9182,\n    0xE7CD: 0x91A2,\n    0xE7CE: 0x91AB,\n    0xE7CF: 0x91AF,\n    0xE7D0: 0x91AA,\n    0xE7D1: 0x91B5,\n    0xE7D2: 0x91B4,\n    0xE7D3: 0x91BA,\n    0xE7D4: 0x91C0,\n    0xE7D5: 0x91C1,\n    0xE7D6: 0x91C9,\n    0xE7D7: 0x91CB,\n    0xE7D8: 0x91D0,\n    0xE7D9: 0x91D6,\n    0xE7DA: 0x91DF,\n    0xE7DB: 0x91E1,\n    0xE7DC: 0x91DB,\n    0xE7DD: 0x91FC,\n    0xE7DE: 0x91F5,\n    0xE7DF: 0x91F6,\n    0xE7E0: 0x921E,\n    0xE7E1: 0x91FF,\n    0xE7E2: 0x9214,\n    0xE7E3: 0x922C,\n    0xE7E4: 0x9215,\n    0xE7E5: 0x9211,\n    0xE7E6: 0x925E,\n    0xE7E7: 0x9257,\n    0xE7E8: 0x9245,\n    0xE7E9: 0x9249,\n    0xE7EA: 0x9264,\n    0xE7EB: 0x9248,\n    0xE7EC: 0x9295,\n    0xE7ED: 0x923F,\n    0xE7EE: 0x924B,\n    0xE7EF: 0x9250,\n    0xE7F0: 0x929C,\n    0xE7F1: 0x9296,\n    0xE7F2: 0x9293,\n    0xE7F3: 0x929B,\n    0xE7F4: 0x925A,\n    0xE7F5: 0x92CF,\n    0xE7F6: 0x92B9,\n    0xE7F7: 0x92B7,\n    0xE7F8: 0x92E9,\n    0xE7F9: 0x930F,\n    0xE7FA: 0x92FA,\n    0xE7FB: 0x9344,\n    0xE7FC: 0x932E,\n    0xE840: 0x9319,\n    0xE841: 0x9322,\n    0xE842: 0x931A,\n    0xE843: 0x9323,\n    0xE844: 0x933A,\n    0xE845: 0x9335,\n    0xE846: 0x933B,\n    0xE847: 0x935C,\n    0xE848: 0x9360,\n    0xE849: 0x937C,\n    0xE84A: 0x936E,\n    0xE84B: 0x9356,\n    0xE84C: 0x93B0,\n    0xE84D: 0x93AC,\n    0xE84E: 0x93AD,\n    0xE84F: 0x9394,\n    0xE850: 0x93B9,\n    0xE851: 0x93D6,\n    0xE852: 0x93D7,\n    0xE853: 0x93E8,\n    0xE854: 0x93E5,\n    0xE855: 0x93D8,\n    0xE856: 0x93C3,\n    0xE857: 0x93DD,\n    0xE858: 0x93D0,\n    0xE859: 0x93C8,\n    0xE85A: 0x93E4,\n    0xE85B: 0x941A,\n    0xE85C: 0x9414,\n    0xE85D: 0x9413,\n    0xE85E: 0x9403,\n    0xE85F: 0x9407,\n    0xE860: 0x9410,\n    0xE861: 0x9436,\n    0xE862: 0x942B,\n    0xE863: 0x9435,\n    0xE864: 0x9421,\n    0xE865: 0x943A,\n    0xE866: 0x9441,\n    0xE867: 0x9452,\n    0xE868: 0x9444,\n    0xE869: 0x945B,\n    0xE86A: 0x9460,\n    0xE86B: 0x9462,\n    0xE86C: 0x945E,\n    0xE86D: 0x946A,\n    0xE86E: 0x9229,\n    0xE86F: 0x9470,\n    0xE870: 0x9475,\n    0xE871: 0x9477,\n    0xE872: 0x947D,\n    0xE873: 0x945A,\n    0xE874: 0x947C,\n    0xE875: 0x947E,\n    0xE876: 0x9481,\n    0xE877: 0x947F,\n    0xE878: 0x9582,\n    0xE879: 0x9587,\n    0xE87A: 0x958A,\n    0xE87B: 0x9594,\n    0xE87C: 0x9596,\n    0xE87D: 0x9598,\n    0xE87E: 0x9599,\n    0xE880: 0x95A0,\n    0xE881: 0x95A8,\n    0xE882: 0x95A7,\n    0xE883: 0x95AD,\n    0xE884: 0x95BC,\n    0xE885: 0x95BB,\n    0xE886: 0x95B9,\n    0xE887: 0x95BE,\n    0xE888: 0x95CA,\n    0xE889: 0x6FF6,\n    0xE88A: 0x95C3,\n    0xE88B: 0x95CD,\n    0xE88C: 0x95CC,\n    0xE88D: 0x95D5,\n    0xE88E: 0x95D4,\n    0xE88F: 0x95D6,\n    0xE890: 0x95DC,\n    0xE891: 0x95E1,\n    0xE892: 0x95E5,\n    0xE893: 0x95E2,\n    0xE894: 0x9621,\n    0xE895: 0x9628,\n    0xE896: 0x962E,\n    0xE897: 0x962F,\n    0xE898: 0x9642,\n    0xE899: 0x964C,\n    0xE89A: 0x964F,\n    0xE89B: 0x964B,\n    0xE89C: 0x9677,\n    0xE89D: 0x965C,\n    0xE89E: 0x965E,\n    0xE89F: 0x965D,\n    0xE8A0: 0x965F,\n    0xE8A1: 0x9666,\n    0xE8A2: 0x9672,\n    0xE8A3: 0x966C,\n    0xE8A4: 0x968D,\n    0xE8A5: 0x9698,\n    0xE8A6: 0x9695,\n    0xE8A7: 0x9697,\n    0xE8A8: 0x96AA,\n    0xE8A9: 0x96A7,\n    0xE8AA: 0x96B1,\n    0xE8AB: 0x96B2,\n    0xE8AC: 0x96B0,\n    0xE8AD: 0x96B4,\n    0xE8AE: 0x96B6,\n    0xE8AF: 0x96B8,\n    0xE8B0: 0x96B9,\n    0xE8B1: 0x96CE,\n    0xE8B2: 0x96CB,\n    0xE8B3: 0x96C9,\n    0xE8B4: 0x96CD,\n    0xE8B5: 0x894D,\n    0xE8B6: 0x96DC,\n    0xE8B7: 0x970D,\n    0xE8B8: 0x96D5,\n    0xE8B9: 0x96F9,\n    0xE8BA: 0x9704,\n    0xE8BB: 0x9706,\n    0xE8BC: 0x9708,\n    0xE8BD: 0x9713,\n    0xE8BE: 0x970E,\n    0xE8BF: 0x9711,\n    0xE8C0: 0x970F,\n    0xE8C1: 0x9716,\n    0xE8C2: 0x9719,\n    0xE8C3: 0x9724,\n    0xE8C4: 0x972A,\n    0xE8C5: 0x9730,\n    0xE8C6: 0x9739,\n    0xE8C7: 0x973D,\n    0xE8C8: 0x973E,\n    0xE8C9: 0x9744,\n    0xE8CA: 0x9746,\n    0xE8CB: 0x9748,\n    0xE8CC: 0x9742,\n    0xE8CD: 0x9749,\n    0xE8CE: 0x975C,\n    0xE8CF: 0x9760,\n    0xE8D0: 0x9764,\n    0xE8D1: 0x9766,\n    0xE8D2: 0x9768,\n    0xE8D3: 0x52D2,\n    0xE8D4: 0x976B,\n    0xE8D5: 0x9771,\n    0xE8D6: 0x9779,\n    0xE8D7: 0x9785,\n    0xE8D8: 0x977C,\n    0xE8D9: 0x9781,\n    0xE8DA: 0x977A,\n    0xE8DB: 0x9786,\n    0xE8DC: 0x978B,\n    0xE8DD: 0x978F,\n    0xE8DE: 0x9790,\n    0xE8DF: 0x979C,\n    0xE8E0: 0x97A8,\n    0xE8E1: 0x97A6,\n    0xE8E2: 0x97A3,\n    0xE8E3: 0x97B3,\n    0xE8E4: 0x97B4,\n    0xE8E5: 0x97C3,\n    0xE8E6: 0x97C6,\n    0xE8E7: 0x97C8,\n    0xE8E8: 0x97CB,\n    0xE8E9: 0x97DC,\n    0xE8EA: 0x97ED,\n    0xE8EB: 0x9F4F,\n    0xE8EC: 0x97F2,\n    0xE8ED: 0x7ADF,\n    0xE8EE: 0x97F6,\n    0xE8EF: 0x97F5,\n    0xE8F0: 0x980F,\n    0xE8F1: 0x980C,\n    0xE8F2: 0x9838,\n    0xE8F3: 0x9824,\n    0xE8F4: 0x9821,\n    0xE8F5: 0x9837,\n    0xE8F6: 0x983D,\n    0xE8F7: 0x9846,\n    0xE8F8: 0x984F,\n    0xE8F9: 0x984B,\n    0xE8FA: 0x986B,\n    0xE8FB: 0x986F,\n    0xE8FC: 0x9870,\n    0xE940: 0x9871,\n    0xE941: 0x9874,\n    0xE942: 0x9873,\n    0xE943: 0x98AA,\n    0xE944: 0x98AF,\n    0xE945: 0x98B1,\n    0xE946: 0x98B6,\n    0xE947: 0x98C4,\n    0xE948: 0x98C3,\n    0xE949: 0x98C6,\n    0xE94A: 0x98E9,\n    0xE94B: 0x98EB,\n    0xE94C: 0x9903,\n    0xE94D: 0x9909,\n    0xE94E: 0x9912,\n    0xE94F: 0x9914,\n    0xE950: 0x9918,\n    0xE951: 0x9921,\n    0xE952: 0x991D,\n    0xE953: 0x991E,\n    0xE954: 0x9924,\n    0xE955: 0x9920,\n    0xE956: 0x992C,\n    0xE957: 0x992E,\n    0xE958: 0x993D,\n    0xE959: 0x993E,\n    0xE95A: 0x9942,\n    0xE95B: 0x9949,\n    0xE95C: 0x9945,\n    0xE95D: 0x9950,\n    0xE95E: 0x994B,\n    0xE95F: 0x9951,\n    0xE960: 0x9952,\n    0xE961: 0x994C,\n    0xE962: 0x9955,\n    0xE963: 0x9997,\n    0xE964: 0x9998,\n    0xE965: 0x99A5,\n    0xE966: 0x99AD,\n    0xE967: 0x99AE,\n    0xE968: 0x99BC,\n    0xE969: 0x99DF,\n    0xE96A: 0x99DB,\n    0xE96B: 0x99DD,\n    0xE96C: 0x99D8,\n    0xE96D: 0x99D1,\n    0xE96E: 0x99ED,\n    0xE96F: 0x99EE,\n    0xE970: 0x99F1,\n    0xE971: 0x99F2,\n    0xE972: 0x99FB,\n    0xE973: 0x99F8,\n    0xE974: 0x9A01,\n    0xE975: 0x9A0F,\n    0xE976: 0x9A05,\n    0xE977: 0x99E2,\n    0xE978: 0x9A19,\n    0xE979: 0x9A2B,\n    0xE97A: 0x9A37,\n    0xE97B: 0x9A45,\n    0xE97C: 0x9A42,\n    0xE97D: 0x9A40,\n    0xE97E: 0x9A43,\n    0xE980: 0x9A3E,\n    0xE981: 0x9A55,\n    0xE982: 0x9A4D,\n    0xE983: 0x9A5B,\n    0xE984: 0x9A57,\n    0xE985: 0x9A5F,\n    0xE986: 0x9A62,\n    0xE987: 0x9A65,\n    0xE988: 0x9A64,\n    0xE989: 0x9A69,\n    0xE98A: 0x9A6B,\n    0xE98B: 0x9A6A,\n    0xE98C: 0x9AAD,\n    0xE98D: 0x9AB0,\n    0xE98E: 0x9ABC,\n    0xE98F: 0x9AC0,\n    0xE990: 0x9ACF,\n    0xE991: 0x9AD1,\n    0xE992: 0x9AD3,\n    0xE993: 0x9AD4,\n    0xE994: 0x9ADE,\n    0xE995: 0x9ADF,\n    0xE996: 0x9AE2,\n    0xE997: 0x9AE3,\n    0xE998: 0x9AE6,\n    0xE999: 0x9AEF,\n    0xE99A: 0x9AEB,\n    0xE99B: 0x9AEE,\n    0xE99C: 0x9AF4,\n    0xE99D: 0x9AF1,\n    0xE99E: 0x9AF7,\n    0xE99F: 0x9AFB,\n    0xE9A0: 0x9B06,\n    0xE9A1: 0x9B18,\n    0xE9A2: 0x9B1A,\n    0xE9A3: 0x9B1F,\n    0xE9A4: 0x9B22,\n    0xE9A5: 0x9B23,\n    0xE9A6: 0x9B25,\n    0xE9A7: 0x9B27,\n    0xE9A8: 0x9B28,\n    0xE9A9: 0x9B29,\n    0xE9AA: 0x9B2A,\n    0xE9AB: 0x9B2E,\n    0xE9AC: 0x9B2F,\n    0xE9AD: 0x9B32,\n    0xE9AE: 0x9B44,\n    0xE9AF: 0x9B43,\n    0xE9B0: 0x9B4F,\n    0xE9B1: 0x9B4D,\n    0xE9B2: 0x9B4E,\n    0xE9B3: 0x9B51,\n    0xE9B4: 0x9B58,\n    0xE9B5: 0x9B74,\n    0xE9B6: 0x9B93,\n    0xE9B7: 0x9B83,\n    0xE9B8: 0x9B91,\n    0xE9B9: 0x9B96,\n    0xE9BA: 0x9B97,\n    0xE9BB: 0x9B9F,\n    0xE9BC: 0x9BA0,\n    0xE9BD: 0x9BA8,\n    0xE9BE: 0x9BB4,\n    0xE9BF: 0x9BC0,\n    0xE9C0: 0x9BCA,\n    0xE9C1: 0x9BB9,\n    0xE9C2: 0x9BC6,\n    0xE9C3: 0x9BCF,\n    0xE9C4: 0x9BD1,\n    0xE9C5: 0x9BD2,\n    0xE9C6: 0x9BE3,\n    0xE9C7: 0x9BE2,\n    0xE9C8: 0x9BE4,\n    0xE9C9: 0x9BD4,\n    0xE9CA: 0x9BE1,\n    0xE9CB: 0x9C3A,\n    0xE9CC: 0x9BF2,\n    0xE9CD: 0x9BF1,\n    0xE9CE: 0x9BF0,\n    0xE9CF: 0x9C15,\n    0xE9D0: 0x9C14,\n    0xE9D1: 0x9C09,\n    0xE9D2: 0x9C13,\n    0xE9D3: 0x9C0C,\n    0xE9D4: 0x9C06,\n    0xE9D5: 0x9C08,\n    0xE9D6: 0x9C12,\n    0xE9D7: 0x9C0A,\n    0xE9D8: 0x9C04,\n    0xE9D9: 0x9C2E,\n    0xE9DA: 0x9C1B,\n    0xE9DB: 0x9C25,\n    0xE9DC: 0x9C24,\n    0xE9DD: 0x9C21,\n    0xE9DE: 0x9C30,\n    0xE9DF: 0x9C47,\n    0xE9E0: 0x9C32,\n    0xE9E1: 0x9C46,\n    0xE9E2: 0x9C3E,\n    0xE9E3: 0x9C5A,\n    0xE9E4: 0x9C60,\n    0xE9E5: 0x9C67,\n    0xE9E6: 0x9C76,\n    0xE9E7: 0x9C78,\n    0xE9E8: 0x9CE7,\n    0xE9E9: 0x9CEC,\n    0xE9EA: 0x9CF0,\n    0xE9EB: 0x9D09,\n    0xE9EC: 0x9D08,\n    0xE9ED: 0x9CEB,\n    0xE9EE: 0x9D03,\n    0xE9EF: 0x9D06,\n    0xE9F0: 0x9D2A,\n    0xE9F1: 0x9D26,\n    0xE9F2: 0x9DAF,\n    0xE9F3: 0x9D23,\n    0xE9F4: 0x9D1F,\n    0xE9F5: 0x9D44,\n    0xE9F6: 0x9D15,\n    0xE9F7: 0x9D12,\n    0xE9F8: 0x9D41,\n    0xE9F9: 0x9D3F,\n    0xE9FA: 0x9D3E,\n    0xE9FB: 0x9D46,\n    0xE9FC: 0x9D48,\n    0xEA40: 0x9D5D,\n    0xEA41: 0x9D5E,\n    0xEA42: 0x9D64,\n    0xEA43: 0x9D51,\n    0xEA44: 0x9D50,\n    0xEA45: 0x9D59,\n    0xEA46: 0x9D72,\n    0xEA47: 0x9D89,\n    0xEA48: 0x9D87,\n    0xEA49: 0x9DAB,\n    0xEA4A: 0x9D6F,\n    0xEA4B: 0x9D7A,\n    0xEA4C: 0x9D9A,\n    0xEA4D: 0x9DA4,\n    0xEA4E: 0x9DA9,\n    0xEA4F: 0x9DB2,\n    0xEA50: 0x9DC4,\n    0xEA51: 0x9DC1,\n    0xEA52: 0x9DBB,\n    0xEA53: 0x9DB8,\n    0xEA54: 0x9DBA,\n    0xEA55: 0x9DC6,\n    0xEA56: 0x9DCF,\n    0xEA57: 0x9DC2,\n    0xEA58: 0x9DD9,\n    0xEA59: 0x9DD3,\n    0xEA5A: 0x9DF8,\n    0xEA5B: 0x9DE6,\n    0xEA5C: 0x9DED,\n    0xEA5D: 0x9DEF,\n    0xEA5E: 0x9DFD,\n    0xEA5F: 0x9E1A,\n    0xEA60: 0x9E1B,\n    0xEA61: 0x9E1E,\n    0xEA62: 0x9E75,\n    0xEA63: 0x9E79,\n    0xEA64: 0x9E7D,\n    0xEA65: 0x9E81,\n    0xEA66: 0x9E88,\n    0xEA67: 0x9E8B,\n    0xEA68: 0x9E8C,\n    0xEA69: 0x9E92,\n    0xEA6A: 0x9E95,\n    0xEA6B: 0x9E91,\n    0xEA6C: 0x9E9D,\n    0xEA6D: 0x9EA5,\n    0xEA6E: 0x9EA9,\n    0xEA6F: 0x9EB8,\n    0xEA70: 0x9EAA,\n    0xEA71: 0x9EAD,\n    0xEA72: 0x9761,\n    0xEA73: 0x9ECC,\n    0xEA74: 0x9ECE,\n    0xEA75: 0x9ECF,\n    0xEA76: 0x9ED0,\n    0xEA77: 0x9ED4,\n    0xEA78: 0x9EDC,\n    0xEA79: 0x9EDE,\n    0xEA7A: 0x9EDD,\n    0xEA7B: 0x9EE0,\n    0xEA7C: 0x9EE5,\n    0xEA7D: 0x9EE8,\n    0xEA7E: 0x9EEF,\n    0xEA80: 0x9EF4,\n    0xEA81: 0x9EF6,\n    0xEA82: 0x9EF7,\n    0xEA83: 0x9EF9,\n    0xEA84: 0x9EFB,\n    0xEA85: 0x9EFC,\n    0xEA86: 0x9EFD,\n    0xEA87: 0x9F07,\n    0xEA88: 0x9F08,\n    0xEA89: 0x76B7,\n    0xEA8A: 0x9F15,\n    0xEA8B: 0x9F21,\n    0xEA8C: 0x9F2C,\n    0xEA8D: 0x9F3E,\n    0xEA8E: 0x9F4A,\n    0xEA8F: 0x9F52,\n    0xEA90: 0x9F54,\n    0xEA91: 0x9F63,\n    0xEA92: 0x9F5F,\n    0xEA93: 0x9F60,\n    0xEA94: 0x9F61,\n    0xEA95: 0x9F66,\n    0xEA96: 0x9F67,\n    0xEA97: 0x9F6C,\n    0xEA98: 0x9F6A,\n    0xEA99: 0x9F77,\n    0xEA9A: 0x9F72,\n    0xEA9B: 0x9F76,\n    0xEA9C: 0x9F95,\n    0xEA9D: 0x9F9C,\n    0xEA9E: 0x9FA0,\n    0xEA9F: 0x582F,\n    0xEAA0: 0x69C7,\n    0xEAA1: 0x9059,\n    0xEAA2: 0x7464,\n    0xEAA3: 0x51DC,\n    0xEAA4: 0x7199,\n};\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar GenericGF_1 = __webpack_require__(1);\nvar GenericGFPoly_1 = __webpack_require__(2);\nfunction runEuclideanAlgorithm(field, a, b, R) {\n    var _a;\n    // Assume a's degree is >= b's\n    if (a.degree() < b.degree()) {\n        _a = [b, a], a = _a[0], b = _a[1];\n    }\n    var rLast = a;\n    var r = b;\n    var tLast = field.zero;\n    var t = field.one;\n    // Run Euclidean algorithm until r's degree is less than R/2\n    while (r.degree() >= R / 2) {\n        var rLastLast = rLast;\n        var tLastLast = tLast;\n        rLast = r;\n        tLast = t;\n        // Divide rLastLast by rLast, with quotient in q and remainder in r\n        if (rLast.isZero()) {\n            // Euclidean algorithm already terminated?\n            return null;\n        }\n        r = rLastLast;\n        var q = field.zero;\n        var denominatorLeadingTerm = rLast.getCoefficient(rLast.degree());\n        var dltInverse = field.inverse(denominatorLeadingTerm);\n        while (r.degree() >= rLast.degree() && !r.isZero()) {\n            var degreeDiff = r.degree() - rLast.degree();\n            var scale = field.multiply(r.getCoefficient(r.degree()), dltInverse);\n            q = q.addOrSubtract(field.buildMonomial(degreeDiff, scale));\n            r = r.addOrSubtract(rLast.multiplyByMonomial(degreeDiff, scale));\n        }\n        t = q.multiplyPoly(tLast).addOrSubtract(tLastLast);\n        if (r.degree() >= rLast.degree()) {\n            return null;\n        }\n    }\n    var sigmaTildeAtZero = t.getCoefficient(0);\n    if (sigmaTildeAtZero === 0) {\n        return null;\n    }\n    var inverse = field.inverse(sigmaTildeAtZero);\n    return [t.multiply(inverse), r.multiply(inverse)];\n}\nfunction findErrorLocations(field, errorLocator) {\n    // This is a direct application of Chien's search\n    var numErrors = errorLocator.degree();\n    if (numErrors === 1) {\n        return [errorLocator.getCoefficient(1)];\n    }\n    var result = new Array(numErrors);\n    var errorCount = 0;\n    for (var i = 1; i < field.size && errorCount < numErrors; i++) {\n        if (errorLocator.evaluateAt(i) === 0) {\n            result[errorCount] = field.inverse(i);\n            errorCount++;\n        }\n    }\n    if (errorCount !== numErrors) {\n        return null;\n    }\n    return result;\n}\nfunction findErrorMagnitudes(field, errorEvaluator, errorLocations) {\n    // This is directly applying Forney's Formula\n    var s = errorLocations.length;\n    var result = new Array(s);\n    for (var i = 0; i < s; i++) {\n        var xiInverse = field.inverse(errorLocations[i]);\n        var denominator = 1;\n        for (var j = 0; j < s; j++) {\n            if (i !== j) {\n                denominator = field.multiply(denominator, GenericGF_1.addOrSubtractGF(1, field.multiply(errorLocations[j], xiInverse)));\n            }\n        }\n        result[i] = field.multiply(errorEvaluator.evaluateAt(xiInverse), field.inverse(denominator));\n        if (field.generatorBase !== 0) {\n            result[i] = field.multiply(result[i], xiInverse);\n        }\n    }\n    return result;\n}\nfunction decode(bytes, twoS) {\n    var outputBytes = new Uint8ClampedArray(bytes.length);\n    outputBytes.set(bytes);\n    var field = new GenericGF_1.default(0x011D, 256, 0); // x^8 + x^4 + x^3 + x^2 + 1\n    var poly = new GenericGFPoly_1.default(field, outputBytes);\n    var syndromeCoefficients = new Uint8ClampedArray(twoS);\n    var error = false;\n    for (var s = 0; s < twoS; s++) {\n        var evaluation = poly.evaluateAt(field.exp(s + field.generatorBase));\n        syndromeCoefficients[syndromeCoefficients.length - 1 - s] = evaluation;\n        if (evaluation !== 0) {\n            error = true;\n        }\n    }\n    if (!error) {\n        return outputBytes;\n    }\n    var syndrome = new GenericGFPoly_1.default(field, syndromeCoefficients);\n    var sigmaOmega = runEuclideanAlgorithm(field, field.buildMonomial(twoS, 1), syndrome, twoS);\n    if (sigmaOmega === null) {\n        return null;\n    }\n    var errorLocations = findErrorLocations(field, sigmaOmega[0]);\n    if (errorLocations == null) {\n        return null;\n    }\n    var errorMagnitudes = findErrorMagnitudes(field, sigmaOmega[1], errorLocations);\n    for (var i = 0; i < errorLocations.length; i++) {\n        var position = outputBytes.length - 1 - field.log(errorLocations[i]);\n        if (position < 0) {\n            return null;\n        }\n        outputBytes[position] = GenericGF_1.addOrSubtractGF(outputBytes[position], errorMagnitudes[i]);\n    }\n    return outputBytes;\n}\nexports.decode = decode;\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.VERSIONS = [\n    {\n        infoBits: null,\n        versionNumber: 1,\n        alignmentPatternCenters: [],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 7,\n                ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 19 }],\n            },\n            {\n                ecCodewordsPerBlock: 10,\n                ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 16 }],\n            },\n            {\n                ecCodewordsPerBlock: 13,\n                ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 13 }],\n            },\n            {\n                ecCodewordsPerBlock: 17,\n                ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 9 }],\n            },\n        ],\n    },\n    {\n        infoBits: null,\n        versionNumber: 2,\n        alignmentPatternCenters: [6, 18],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 10,\n                ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 34 }],\n            },\n            {\n                ecCodewordsPerBlock: 16,\n                ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 28 }],\n            },\n            {\n                ecCodewordsPerBlock: 22,\n                ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 22 }],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 16 }],\n            },\n        ],\n    },\n    {\n        infoBits: null,\n        versionNumber: 3,\n        alignmentPatternCenters: [6, 22],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 15,\n                ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 55 }],\n            },\n            {\n                ecCodewordsPerBlock: 26,\n                ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 44 }],\n            },\n            {\n                ecCodewordsPerBlock: 18,\n                ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 17 }],\n            },\n            {\n                ecCodewordsPerBlock: 22,\n                ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 13 }],\n            },\n        ],\n    },\n    {\n        infoBits: null,\n        versionNumber: 4,\n        alignmentPatternCenters: [6, 26],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 20,\n                ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 80 }],\n            },\n            {\n                ecCodewordsPerBlock: 18,\n                ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 32 }],\n            },\n            {\n                ecCodewordsPerBlock: 26,\n                ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 24 }],\n            },\n            {\n                ecCodewordsPerBlock: 16,\n                ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 9 }],\n            },\n        ],\n    },\n    {\n        infoBits: null,\n        versionNumber: 5,\n        alignmentPatternCenters: [6, 30],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 26,\n                ecBlocks: [{ numBlocks: 1, dataCodewordsPerBlock: 108 }],\n            },\n            {\n                ecCodewordsPerBlock: 24,\n                ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 43 }],\n            },\n            {\n                ecCodewordsPerBlock: 18,\n                ecBlocks: [\n                    { numBlocks: 2, dataCodewordsPerBlock: 15 },\n                    { numBlocks: 2, dataCodewordsPerBlock: 16 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 22,\n                ecBlocks: [\n                    { numBlocks: 2, dataCodewordsPerBlock: 11 },\n                    { numBlocks: 2, dataCodewordsPerBlock: 12 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: null,\n        versionNumber: 6,\n        alignmentPatternCenters: [6, 34],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 18,\n                ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 68 }],\n            },\n            {\n                ecCodewordsPerBlock: 16,\n                ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 27 }],\n            },\n            {\n                ecCodewordsPerBlock: 24,\n                ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 19 }],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 15 }],\n            },\n        ],\n    },\n    {\n        infoBits: 0x07C94,\n        versionNumber: 7,\n        alignmentPatternCenters: [6, 22, 38],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 20,\n                ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 78 }],\n            },\n            {\n                ecCodewordsPerBlock: 18,\n                ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 31 }],\n            },\n            {\n                ecCodewordsPerBlock: 18,\n                ecBlocks: [\n                    { numBlocks: 2, dataCodewordsPerBlock: 14 },\n                    { numBlocks: 4, dataCodewordsPerBlock: 15 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 26,\n                ecBlocks: [\n                    { numBlocks: 4, dataCodewordsPerBlock: 13 },\n                    { numBlocks: 1, dataCodewordsPerBlock: 14 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x085BC,\n        versionNumber: 8,\n        alignmentPatternCenters: [6, 24, 42],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 24,\n                ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 97 }],\n            },\n            {\n                ecCodewordsPerBlock: 22,\n                ecBlocks: [\n                    { numBlocks: 2, dataCodewordsPerBlock: 38 },\n                    { numBlocks: 2, dataCodewordsPerBlock: 39 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 22,\n                ecBlocks: [\n                    { numBlocks: 4, dataCodewordsPerBlock: 18 },\n                    { numBlocks: 2, dataCodewordsPerBlock: 19 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 26,\n                ecBlocks: [\n                    { numBlocks: 4, dataCodewordsPerBlock: 14 },\n                    { numBlocks: 2, dataCodewordsPerBlock: 15 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x09A99,\n        versionNumber: 9,\n        alignmentPatternCenters: [6, 26, 46],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [{ numBlocks: 2, dataCodewordsPerBlock: 116 }],\n            },\n            {\n                ecCodewordsPerBlock: 22,\n                ecBlocks: [\n                    { numBlocks: 3, dataCodewordsPerBlock: 36 },\n                    { numBlocks: 2, dataCodewordsPerBlock: 37 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 20,\n                ecBlocks: [\n                    { numBlocks: 4, dataCodewordsPerBlock: 16 },\n                    { numBlocks: 4, dataCodewordsPerBlock: 17 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 24,\n                ecBlocks: [\n                    { numBlocks: 4, dataCodewordsPerBlock: 12 },\n                    { numBlocks: 4, dataCodewordsPerBlock: 13 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x0A4D3,\n        versionNumber: 10,\n        alignmentPatternCenters: [6, 28, 50],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 18,\n                ecBlocks: [\n                    { numBlocks: 2, dataCodewordsPerBlock: 68 },\n                    { numBlocks: 2, dataCodewordsPerBlock: 69 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 26,\n                ecBlocks: [\n                    { numBlocks: 4, dataCodewordsPerBlock: 43 },\n                    { numBlocks: 1, dataCodewordsPerBlock: 44 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 24,\n                ecBlocks: [\n                    { numBlocks: 6, dataCodewordsPerBlock: 19 },\n                    { numBlocks: 2, dataCodewordsPerBlock: 20 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 6, dataCodewordsPerBlock: 15 },\n                    { numBlocks: 2, dataCodewordsPerBlock: 16 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x0BBF6,\n        versionNumber: 11,\n        alignmentPatternCenters: [6, 30, 54],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 20,\n                ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 81 }],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 1, dataCodewordsPerBlock: 50 },\n                    { numBlocks: 4, dataCodewordsPerBlock: 51 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 4, dataCodewordsPerBlock: 22 },\n                    { numBlocks: 4, dataCodewordsPerBlock: 23 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 24,\n                ecBlocks: [\n                    { numBlocks: 3, dataCodewordsPerBlock: 12 },\n                    { numBlocks: 8, dataCodewordsPerBlock: 13 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x0C762,\n        versionNumber: 12,\n        alignmentPatternCenters: [6, 32, 58],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 24,\n                ecBlocks: [\n                    { numBlocks: 2, dataCodewordsPerBlock: 92 },\n                    { numBlocks: 2, dataCodewordsPerBlock: 93 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 22,\n                ecBlocks: [\n                    { numBlocks: 6, dataCodewordsPerBlock: 36 },\n                    { numBlocks: 2, dataCodewordsPerBlock: 37 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 26,\n                ecBlocks: [\n                    { numBlocks: 4, dataCodewordsPerBlock: 20 },\n                    { numBlocks: 6, dataCodewordsPerBlock: 21 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 7, dataCodewordsPerBlock: 14 },\n                    { numBlocks: 4, dataCodewordsPerBlock: 15 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x0D847,\n        versionNumber: 13,\n        alignmentPatternCenters: [6, 34, 62],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 26,\n                ecBlocks: [{ numBlocks: 4, dataCodewordsPerBlock: 107 }],\n            },\n            {\n                ecCodewordsPerBlock: 22,\n                ecBlocks: [\n                    { numBlocks: 8, dataCodewordsPerBlock: 37 },\n                    { numBlocks: 1, dataCodewordsPerBlock: 38 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 24,\n                ecBlocks: [\n                    { numBlocks: 8, dataCodewordsPerBlock: 20 },\n                    { numBlocks: 4, dataCodewordsPerBlock: 21 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 22,\n                ecBlocks: [\n                    { numBlocks: 12, dataCodewordsPerBlock: 11 },\n                    { numBlocks: 4, dataCodewordsPerBlock: 12 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x0E60D,\n        versionNumber: 14,\n        alignmentPatternCenters: [6, 26, 46, 66],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 3, dataCodewordsPerBlock: 115 },\n                    { numBlocks: 1, dataCodewordsPerBlock: 116 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 24,\n                ecBlocks: [\n                    { numBlocks: 4, dataCodewordsPerBlock: 40 },\n                    { numBlocks: 5, dataCodewordsPerBlock: 41 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 20,\n                ecBlocks: [\n                    { numBlocks: 11, dataCodewordsPerBlock: 16 },\n                    { numBlocks: 5, dataCodewordsPerBlock: 17 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 24,\n                ecBlocks: [\n                    { numBlocks: 11, dataCodewordsPerBlock: 12 },\n                    { numBlocks: 5, dataCodewordsPerBlock: 13 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x0F928,\n        versionNumber: 15,\n        alignmentPatternCenters: [6, 26, 48, 70],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 22,\n                ecBlocks: [\n                    { numBlocks: 5, dataCodewordsPerBlock: 87 },\n                    { numBlocks: 1, dataCodewordsPerBlock: 88 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 24,\n                ecBlocks: [\n                    { numBlocks: 5, dataCodewordsPerBlock: 41 },\n                    { numBlocks: 5, dataCodewordsPerBlock: 42 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 5, dataCodewordsPerBlock: 24 },\n                    { numBlocks: 7, dataCodewordsPerBlock: 25 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 24,\n                ecBlocks: [\n                    { numBlocks: 11, dataCodewordsPerBlock: 12 },\n                    { numBlocks: 7, dataCodewordsPerBlock: 13 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x10B78,\n        versionNumber: 16,\n        alignmentPatternCenters: [6, 26, 50, 74],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 24,\n                ecBlocks: [\n                    { numBlocks: 5, dataCodewordsPerBlock: 98 },\n                    { numBlocks: 1, dataCodewordsPerBlock: 99 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 7, dataCodewordsPerBlock: 45 },\n                    { numBlocks: 3, dataCodewordsPerBlock: 46 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 24,\n                ecBlocks: [\n                    { numBlocks: 15, dataCodewordsPerBlock: 19 },\n                    { numBlocks: 2, dataCodewordsPerBlock: 20 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 3, dataCodewordsPerBlock: 15 },\n                    { numBlocks: 13, dataCodewordsPerBlock: 16 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x1145D,\n        versionNumber: 17,\n        alignmentPatternCenters: [6, 30, 54, 78],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 1, dataCodewordsPerBlock: 107 },\n                    { numBlocks: 5, dataCodewordsPerBlock: 108 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 10, dataCodewordsPerBlock: 46 },\n                    { numBlocks: 1, dataCodewordsPerBlock: 47 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 1, dataCodewordsPerBlock: 22 },\n                    { numBlocks: 15, dataCodewordsPerBlock: 23 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 2, dataCodewordsPerBlock: 14 },\n                    { numBlocks: 17, dataCodewordsPerBlock: 15 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x12A17,\n        versionNumber: 18,\n        alignmentPatternCenters: [6, 30, 56, 82],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 5, dataCodewordsPerBlock: 120 },\n                    { numBlocks: 1, dataCodewordsPerBlock: 121 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 26,\n                ecBlocks: [\n                    { numBlocks: 9, dataCodewordsPerBlock: 43 },\n                    { numBlocks: 4, dataCodewordsPerBlock: 44 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 17, dataCodewordsPerBlock: 22 },\n                    { numBlocks: 1, dataCodewordsPerBlock: 23 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 2, dataCodewordsPerBlock: 14 },\n                    { numBlocks: 19, dataCodewordsPerBlock: 15 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x13532,\n        versionNumber: 19,\n        alignmentPatternCenters: [6, 30, 58, 86],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 3, dataCodewordsPerBlock: 113 },\n                    { numBlocks: 4, dataCodewordsPerBlock: 114 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 26,\n                ecBlocks: [\n                    { numBlocks: 3, dataCodewordsPerBlock: 44 },\n                    { numBlocks: 11, dataCodewordsPerBlock: 45 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 26,\n                ecBlocks: [\n                    { numBlocks: 17, dataCodewordsPerBlock: 21 },\n                    { numBlocks: 4, dataCodewordsPerBlock: 22 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 26,\n                ecBlocks: [\n                    { numBlocks: 9, dataCodewordsPerBlock: 13 },\n                    { numBlocks: 16, dataCodewordsPerBlock: 14 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x149A6,\n        versionNumber: 20,\n        alignmentPatternCenters: [6, 34, 62, 90],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 3, dataCodewordsPerBlock: 107 },\n                    { numBlocks: 5, dataCodewordsPerBlock: 108 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 26,\n                ecBlocks: [\n                    { numBlocks: 3, dataCodewordsPerBlock: 41 },\n                    { numBlocks: 13, dataCodewordsPerBlock: 42 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 15, dataCodewordsPerBlock: 24 },\n                    { numBlocks: 5, dataCodewordsPerBlock: 25 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 15, dataCodewordsPerBlock: 15 },\n                    { numBlocks: 10, dataCodewordsPerBlock: 16 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x15683,\n        versionNumber: 21,\n        alignmentPatternCenters: [6, 28, 50, 72, 94],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 4, dataCodewordsPerBlock: 116 },\n                    { numBlocks: 4, dataCodewordsPerBlock: 117 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 26,\n                ecBlocks: [{ numBlocks: 17, dataCodewordsPerBlock: 42 }],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 17, dataCodewordsPerBlock: 22 },\n                    { numBlocks: 6, dataCodewordsPerBlock: 23 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 19, dataCodewordsPerBlock: 16 },\n                    { numBlocks: 6, dataCodewordsPerBlock: 17 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x168C9,\n        versionNumber: 22,\n        alignmentPatternCenters: [6, 26, 50, 74, 98],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 2, dataCodewordsPerBlock: 111 },\n                    { numBlocks: 7, dataCodewordsPerBlock: 112 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [{ numBlocks: 17, dataCodewordsPerBlock: 46 }],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 7, dataCodewordsPerBlock: 24 },\n                    { numBlocks: 16, dataCodewordsPerBlock: 25 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 24,\n                ecBlocks: [{ numBlocks: 34, dataCodewordsPerBlock: 13 }],\n            },\n        ],\n    },\n    {\n        infoBits: 0x177EC,\n        versionNumber: 23,\n        alignmentPatternCenters: [6, 30, 54, 74, 102],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 4, dataCodewordsPerBlock: 121 },\n                    { numBlocks: 5, dataCodewordsPerBlock: 122 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 4, dataCodewordsPerBlock: 47 },\n                    { numBlocks: 14, dataCodewordsPerBlock: 48 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 11, dataCodewordsPerBlock: 24 },\n                    { numBlocks: 14, dataCodewordsPerBlock: 25 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 16, dataCodewordsPerBlock: 15 },\n                    { numBlocks: 14, dataCodewordsPerBlock: 16 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x18EC4,\n        versionNumber: 24,\n        alignmentPatternCenters: [6, 28, 54, 80, 106],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 6, dataCodewordsPerBlock: 117 },\n                    { numBlocks: 4, dataCodewordsPerBlock: 118 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 6, dataCodewordsPerBlock: 45 },\n                    { numBlocks: 14, dataCodewordsPerBlock: 46 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 11, dataCodewordsPerBlock: 24 },\n                    { numBlocks: 16, dataCodewordsPerBlock: 25 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 30, dataCodewordsPerBlock: 16 },\n                    { numBlocks: 2, dataCodewordsPerBlock: 17 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x191E1,\n        versionNumber: 25,\n        alignmentPatternCenters: [6, 32, 58, 84, 110],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 26,\n                ecBlocks: [\n                    { numBlocks: 8, dataCodewordsPerBlock: 106 },\n                    { numBlocks: 4, dataCodewordsPerBlock: 107 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 8, dataCodewordsPerBlock: 47 },\n                    { numBlocks: 13, dataCodewordsPerBlock: 48 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 7, dataCodewordsPerBlock: 24 },\n                    { numBlocks: 22, dataCodewordsPerBlock: 25 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 22, dataCodewordsPerBlock: 15 },\n                    { numBlocks: 13, dataCodewordsPerBlock: 16 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x1AFAB,\n        versionNumber: 26,\n        alignmentPatternCenters: [6, 30, 58, 86, 114],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 10, dataCodewordsPerBlock: 114 },\n                    { numBlocks: 2, dataCodewordsPerBlock: 115 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 19, dataCodewordsPerBlock: 46 },\n                    { numBlocks: 4, dataCodewordsPerBlock: 47 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 28, dataCodewordsPerBlock: 22 },\n                    { numBlocks: 6, dataCodewordsPerBlock: 23 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 33, dataCodewordsPerBlock: 16 },\n                    { numBlocks: 4, dataCodewordsPerBlock: 17 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x1B08E,\n        versionNumber: 27,\n        alignmentPatternCenters: [6, 34, 62, 90, 118],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 8, dataCodewordsPerBlock: 122 },\n                    { numBlocks: 4, dataCodewordsPerBlock: 123 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 22, dataCodewordsPerBlock: 45 },\n                    { numBlocks: 3, dataCodewordsPerBlock: 46 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 8, dataCodewordsPerBlock: 23 },\n                    { numBlocks: 26, dataCodewordsPerBlock: 24 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 12, dataCodewordsPerBlock: 15 },\n                    { numBlocks: 28, dataCodewordsPerBlock: 16 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x1CC1A,\n        versionNumber: 28,\n        alignmentPatternCenters: [6, 26, 50, 74, 98, 122],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 3, dataCodewordsPerBlock: 117 },\n                    { numBlocks: 10, dataCodewordsPerBlock: 118 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 3, dataCodewordsPerBlock: 45 },\n                    { numBlocks: 23, dataCodewordsPerBlock: 46 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 4, dataCodewordsPerBlock: 24 },\n                    { numBlocks: 31, dataCodewordsPerBlock: 25 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 11, dataCodewordsPerBlock: 15 },\n                    { numBlocks: 31, dataCodewordsPerBlock: 16 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x1D33F,\n        versionNumber: 29,\n        alignmentPatternCenters: [6, 30, 54, 78, 102, 126],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 7, dataCodewordsPerBlock: 116 },\n                    { numBlocks: 7, dataCodewordsPerBlock: 117 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 21, dataCodewordsPerBlock: 45 },\n                    { numBlocks: 7, dataCodewordsPerBlock: 46 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 1, dataCodewordsPerBlock: 23 },\n                    { numBlocks: 37, dataCodewordsPerBlock: 24 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 19, dataCodewordsPerBlock: 15 },\n                    { numBlocks: 26, dataCodewordsPerBlock: 16 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x1ED75,\n        versionNumber: 30,\n        alignmentPatternCenters: [6, 26, 52, 78, 104, 130],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 5, dataCodewordsPerBlock: 115 },\n                    { numBlocks: 10, dataCodewordsPerBlock: 116 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 19, dataCodewordsPerBlock: 47 },\n                    { numBlocks: 10, dataCodewordsPerBlock: 48 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 15, dataCodewordsPerBlock: 24 },\n                    { numBlocks: 25, dataCodewordsPerBlock: 25 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 23, dataCodewordsPerBlock: 15 },\n                    { numBlocks: 25, dataCodewordsPerBlock: 16 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x1F250,\n        versionNumber: 31,\n        alignmentPatternCenters: [6, 30, 56, 82, 108, 134],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 13, dataCodewordsPerBlock: 115 },\n                    { numBlocks: 3, dataCodewordsPerBlock: 116 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 2, dataCodewordsPerBlock: 46 },\n                    { numBlocks: 29, dataCodewordsPerBlock: 47 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 42, dataCodewordsPerBlock: 24 },\n                    { numBlocks: 1, dataCodewordsPerBlock: 25 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 23, dataCodewordsPerBlock: 15 },\n                    { numBlocks: 28, dataCodewordsPerBlock: 16 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x209D5,\n        versionNumber: 32,\n        alignmentPatternCenters: [6, 34, 60, 86, 112, 138],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [{ numBlocks: 17, dataCodewordsPerBlock: 115 }],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 10, dataCodewordsPerBlock: 46 },\n                    { numBlocks: 23, dataCodewordsPerBlock: 47 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 10, dataCodewordsPerBlock: 24 },\n                    { numBlocks: 35, dataCodewordsPerBlock: 25 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 19, dataCodewordsPerBlock: 15 },\n                    { numBlocks: 35, dataCodewordsPerBlock: 16 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x216F0,\n        versionNumber: 33,\n        alignmentPatternCenters: [6, 30, 58, 86, 114, 142],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 17, dataCodewordsPerBlock: 115 },\n                    { numBlocks: 1, dataCodewordsPerBlock: 116 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 14, dataCodewordsPerBlock: 46 },\n                    { numBlocks: 21, dataCodewordsPerBlock: 47 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 29, dataCodewordsPerBlock: 24 },\n                    { numBlocks: 19, dataCodewordsPerBlock: 25 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 11, dataCodewordsPerBlock: 15 },\n                    { numBlocks: 46, dataCodewordsPerBlock: 16 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x228BA,\n        versionNumber: 34,\n        alignmentPatternCenters: [6, 34, 62, 90, 118, 146],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 13, dataCodewordsPerBlock: 115 },\n                    { numBlocks: 6, dataCodewordsPerBlock: 116 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 14, dataCodewordsPerBlock: 46 },\n                    { numBlocks: 23, dataCodewordsPerBlock: 47 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 44, dataCodewordsPerBlock: 24 },\n                    { numBlocks: 7, dataCodewordsPerBlock: 25 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 59, dataCodewordsPerBlock: 16 },\n                    { numBlocks: 1, dataCodewordsPerBlock: 17 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x2379F,\n        versionNumber: 35,\n        alignmentPatternCenters: [6, 30, 54, 78, 102, 126, 150],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 12, dataCodewordsPerBlock: 121 },\n                    { numBlocks: 7, dataCodewordsPerBlock: 122 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 12, dataCodewordsPerBlock: 47 },\n                    { numBlocks: 26, dataCodewordsPerBlock: 48 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 39, dataCodewordsPerBlock: 24 },\n                    { numBlocks: 14, dataCodewordsPerBlock: 25 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 22, dataCodewordsPerBlock: 15 },\n                    { numBlocks: 41, dataCodewordsPerBlock: 16 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x24B0B,\n        versionNumber: 36,\n        alignmentPatternCenters: [6, 24, 50, 76, 102, 128, 154],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 6, dataCodewordsPerBlock: 121 },\n                    { numBlocks: 14, dataCodewordsPerBlock: 122 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 6, dataCodewordsPerBlock: 47 },\n                    { numBlocks: 34, dataCodewordsPerBlock: 48 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 46, dataCodewordsPerBlock: 24 },\n                    { numBlocks: 10, dataCodewordsPerBlock: 25 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 2, dataCodewordsPerBlock: 15 },\n                    { numBlocks: 64, dataCodewordsPerBlock: 16 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x2542E,\n        versionNumber: 37,\n        alignmentPatternCenters: [6, 28, 54, 80, 106, 132, 158],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 17, dataCodewordsPerBlock: 122 },\n                    { numBlocks: 4, dataCodewordsPerBlock: 123 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 29, dataCodewordsPerBlock: 46 },\n                    { numBlocks: 14, dataCodewordsPerBlock: 47 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 49, dataCodewordsPerBlock: 24 },\n                    { numBlocks: 10, dataCodewordsPerBlock: 25 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 24, dataCodewordsPerBlock: 15 },\n                    { numBlocks: 46, dataCodewordsPerBlock: 16 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x26A64,\n        versionNumber: 38,\n        alignmentPatternCenters: [6, 32, 58, 84, 110, 136, 162],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 4, dataCodewordsPerBlock: 122 },\n                    { numBlocks: 18, dataCodewordsPerBlock: 123 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 13, dataCodewordsPerBlock: 46 },\n                    { numBlocks: 32, dataCodewordsPerBlock: 47 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 48, dataCodewordsPerBlock: 24 },\n                    { numBlocks: 14, dataCodewordsPerBlock: 25 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 42, dataCodewordsPerBlock: 15 },\n                    { numBlocks: 32, dataCodewordsPerBlock: 16 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x27541,\n        versionNumber: 39,\n        alignmentPatternCenters: [6, 26, 54, 82, 110, 138, 166],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 20, dataCodewordsPerBlock: 117 },\n                    { numBlocks: 4, dataCodewordsPerBlock: 118 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 40, dataCodewordsPerBlock: 47 },\n                    { numBlocks: 7, dataCodewordsPerBlock: 48 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 43, dataCodewordsPerBlock: 24 },\n                    { numBlocks: 22, dataCodewordsPerBlock: 25 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 10, dataCodewordsPerBlock: 15 },\n                    { numBlocks: 67, dataCodewordsPerBlock: 16 },\n                ],\n            },\n        ],\n    },\n    {\n        infoBits: 0x28C69,\n        versionNumber: 40,\n        alignmentPatternCenters: [6, 30, 58, 86, 114, 142, 170],\n        errorCorrectionLevels: [\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 19, dataCodewordsPerBlock: 118 },\n                    { numBlocks: 6, dataCodewordsPerBlock: 119 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 28,\n                ecBlocks: [\n                    { numBlocks: 18, dataCodewordsPerBlock: 47 },\n                    { numBlocks: 31, dataCodewordsPerBlock: 48 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 34, dataCodewordsPerBlock: 24 },\n                    { numBlocks: 34, dataCodewordsPerBlock: 25 },\n                ],\n            },\n            {\n                ecCodewordsPerBlock: 30,\n                ecBlocks: [\n                    { numBlocks: 20, dataCodewordsPerBlock: 15 },\n                    { numBlocks: 61, dataCodewordsPerBlock: 16 },\n                ],\n            },\n        ],\n    },\n];\n\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar BitMatrix_1 = __webpack_require__(0);\nfunction squareToQuadrilateral(p1, p2, p3, p4) {\n    var dx3 = p1.x - p2.x + p3.x - p4.x;\n    var dy3 = p1.y - p2.y + p3.y - p4.y;\n    if (dx3 === 0 && dy3 === 0) { // Affine\n        return {\n            a11: p2.x - p1.x,\n            a12: p2.y - p1.y,\n            a13: 0,\n            a21: p3.x - p2.x,\n            a22: p3.y - p2.y,\n            a23: 0,\n            a31: p1.x,\n            a32: p1.y,\n            a33: 1,\n        };\n    }\n    else {\n        var dx1 = p2.x - p3.x;\n        var dx2 = p4.x - p3.x;\n        var dy1 = p2.y - p3.y;\n        var dy2 = p4.y - p3.y;\n        var denominator = dx1 * dy2 - dx2 * dy1;\n        var a13 = (dx3 * dy2 - dx2 * dy3) / denominator;\n        var a23 = (dx1 * dy3 - dx3 * dy1) / denominator;\n        return {\n            a11: p2.x - p1.x + a13 * p2.x,\n            a12: p2.y - p1.y + a13 * p2.y,\n            a13: a13,\n            a21: p4.x - p1.x + a23 * p4.x,\n            a22: p4.y - p1.y + a23 * p4.y,\n            a23: a23,\n            a31: p1.x,\n            a32: p1.y,\n            a33: 1,\n        };\n    }\n}\nfunction quadrilateralToSquare(p1, p2, p3, p4) {\n    // Here, the adjoint serves as the inverse:\n    var sToQ = squareToQuadrilateral(p1, p2, p3, p4);\n    return {\n        a11: sToQ.a22 * sToQ.a33 - sToQ.a23 * sToQ.a32,\n        a12: sToQ.a13 * sToQ.a32 - sToQ.a12 * sToQ.a33,\n        a13: sToQ.a12 * sToQ.a23 - sToQ.a13 * sToQ.a22,\n        a21: sToQ.a23 * sToQ.a31 - sToQ.a21 * sToQ.a33,\n        a22: sToQ.a11 * sToQ.a33 - sToQ.a13 * sToQ.a31,\n        a23: sToQ.a13 * sToQ.a21 - sToQ.a11 * sToQ.a23,\n        a31: sToQ.a21 * sToQ.a32 - sToQ.a22 * sToQ.a31,\n        a32: sToQ.a12 * sToQ.a31 - sToQ.a11 * sToQ.a32,\n        a33: sToQ.a11 * sToQ.a22 - sToQ.a12 * sToQ.a21,\n    };\n}\nfunction times(a, b) {\n    return {\n        a11: a.a11 * b.a11 + a.a21 * b.a12 + a.a31 * b.a13,\n        a12: a.a12 * b.a11 + a.a22 * b.a12 + a.a32 * b.a13,\n        a13: a.a13 * b.a11 + a.a23 * b.a12 + a.a33 * b.a13,\n        a21: a.a11 * b.a21 + a.a21 * b.a22 + a.a31 * b.a23,\n        a22: a.a12 * b.a21 + a.a22 * b.a22 + a.a32 * b.a23,\n        a23: a.a13 * b.a21 + a.a23 * b.a22 + a.a33 * b.a23,\n        a31: a.a11 * b.a31 + a.a21 * b.a32 + a.a31 * b.a33,\n        a32: a.a12 * b.a31 + a.a22 * b.a32 + a.a32 * b.a33,\n        a33: a.a13 * b.a31 + a.a23 * b.a32 + a.a33 * b.a33,\n    };\n}\nfunction extract(image, location) {\n    var qToS = quadrilateralToSquare({ x: 3.5, y: 3.5 }, { x: location.dimension - 3.5, y: 3.5 }, { x: location.dimension - 6.5, y: location.dimension - 6.5 }, { x: 3.5, y: location.dimension - 3.5 });\n    var sToQ = squareToQuadrilateral(location.topLeft, location.topRight, location.alignmentPattern, location.bottomLeft);\n    var transform = times(sToQ, qToS);\n    var matrix = BitMatrix_1.BitMatrix.createEmpty(location.dimension, location.dimension);\n    var mappingFunction = function (x, y) {\n        var denominator = transform.a13 * x + transform.a23 * y + transform.a33;\n        return {\n            x: (transform.a11 * x + transform.a21 * y + transform.a31) / denominator,\n            y: (transform.a12 * x + transform.a22 * y + transform.a32) / denominator,\n        };\n    };\n    for (var y = 0; y < location.dimension; y++) {\n        for (var x = 0; x < location.dimension; x++) {\n            var xValue = x + 0.5;\n            var yValue = y + 0.5;\n            var sourcePixel = mappingFunction(xValue, yValue);\n            matrix.set(x, y, image.get(Math.floor(sourcePixel.x), Math.floor(sourcePixel.y)));\n        }\n    }\n    return {\n        matrix: matrix,\n        mappingFunction: mappingFunction,\n    };\n}\nexports.extract = extract;\n\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", { value: true });\nvar MAX_FINDERPATTERNS_TO_SEARCH = 4;\nvar MIN_QUAD_RATIO = 0.5;\nvar MAX_QUAD_RATIO = 1.5;\nvar distance = function (a, b) { return Math.sqrt(Math.pow((b.x - a.x), 2) + Math.pow((b.y - a.y), 2)); };\nfunction sum(values) {\n    return values.reduce(function (a, b) { return a + b; });\n}\n// Takes three finder patterns and organizes them into topLeft, topRight, etc\nfunction reorderFinderPatterns(pattern1, pattern2, pattern3) {\n    var _a, _b, _c, _d;\n    // Find distances between pattern centers\n    var oneTwoDistance = distance(pattern1, pattern2);\n    var twoThreeDistance = distance(pattern2, pattern3);\n    var oneThreeDistance = distance(pattern1, pattern3);\n    var bottomLeft;\n    var topLeft;\n    var topRight;\n    // Assume one closest to other two is B; A and C will just be guesses at first\n    if (twoThreeDistance >= oneTwoDistance && twoThreeDistance >= oneThreeDistance) {\n        _a = [pattern2, pattern1, pattern3], bottomLeft = _a[0], topLeft = _a[1], topRight = _a[2];\n    }\n    else if (oneThreeDistance >= twoThreeDistance && oneThreeDistance >= oneTwoDistance) {\n        _b = [pattern1, pattern2, pattern3], bottomLeft = _b[0], topLeft = _b[1], topRight = _b[2];\n    }\n    else {\n        _c = [pattern1, pattern3, pattern2], bottomLeft = _c[0], topLeft = _c[1], topRight = _c[2];\n    }\n    // Use cross product to figure out whether bottomLeft (A) and topRight (C) are correct or flipped in relation to topLeft (B)\n    // This asks whether BC x BA has a positive z component, which is the arrangement we want. If it's negative, then\n    // we've got it flipped around and should swap topRight and bottomLeft.\n    if (((topRight.x - topLeft.x) * (bottomLeft.y - topLeft.y)) - ((topRight.y - topLeft.y) * (bottomLeft.x - topLeft.x)) < 0) {\n        _d = [topRight, bottomLeft], bottomLeft = _d[0], topRight = _d[1];\n    }\n    return { bottomLeft: bottomLeft, topLeft: topLeft, topRight: topRight };\n}\n// Computes the dimension (number of modules on a side) of the QR Code based on the position of the finder patterns\nfunction computeDimension(topLeft, topRight, bottomLeft, matrix) {\n    var moduleSize = (sum(countBlackWhiteRun(topLeft, bottomLeft, matrix, 5)) / 7 + // Divide by 7 since the ratio is 1:1:3:1:1\n        sum(countBlackWhiteRun(topLeft, topRight, matrix, 5)) / 7 +\n        sum(countBlackWhiteRun(bottomLeft, topLeft, matrix, 5)) / 7 +\n        sum(countBlackWhiteRun(topRight, topLeft, matrix, 5)) / 7) / 4;\n    if (moduleSize < 1) {\n        throw new Error(\"Invalid module size\");\n    }\n    var topDimension = Math.round(distance(topLeft, topRight) / moduleSize);\n    var sideDimension = Math.round(distance(topLeft, bottomLeft) / moduleSize);\n    var dimension = Math.floor((topDimension + sideDimension) / 2) + 7;\n    switch (dimension % 4) {\n        case 0:\n            dimension++;\n            break;\n        case 2:\n            dimension--;\n            break;\n    }\n    return { dimension: dimension, moduleSize: moduleSize };\n}\n// Takes an origin point and an end point and counts the sizes of the black white run from the origin towards the end point.\n// Returns an array of elements, representing the pixel size of the black white run.\n// Uses a variant of http://en.wikipedia.org/wiki/Bresenham's_line_algorithm\nfunction countBlackWhiteRunTowardsPoint(origin, end, matrix, length) {\n    var switchPoints = [{ x: Math.floor(origin.x), y: Math.floor(origin.y) }];\n    var steep = Math.abs(end.y - origin.y) > Math.abs(end.x - origin.x);\n    var fromX;\n    var fromY;\n    var toX;\n    var toY;\n    if (steep) {\n        fromX = Math.floor(origin.y);\n        fromY = Math.floor(origin.x);\n        toX = Math.floor(end.y);\n        toY = Math.floor(end.x);\n    }\n    else {\n        fromX = Math.floor(origin.x);\n        fromY = Math.floor(origin.y);\n        toX = Math.floor(end.x);\n        toY = Math.floor(end.y);\n    }\n    var dx = Math.abs(toX - fromX);\n    var dy = Math.abs(toY - fromY);\n    var error = Math.floor(-dx / 2);\n    var xStep = fromX < toX ? 1 : -1;\n    var yStep = fromY < toY ? 1 : -1;\n    var currentPixel = true;\n    // Loop up until x == toX, but not beyond\n    for (var x = fromX, y = fromY; x !== toX + xStep; x += xStep) {\n        // Does current pixel mean we have moved white to black or vice versa?\n        // Scanning black in state 0,2 and white in state 1, so if we find the wrong\n        // color, advance to next state or end if we are in state 2 already\n        var realX = steep ? y : x;\n        var realY = steep ? x : y;\n        if (matrix.get(realX, realY) !== currentPixel) {\n            currentPixel = !currentPixel;\n            switchPoints.push({ x: realX, y: realY });\n            if (switchPoints.length === length + 1) {\n                break;\n            }\n        }\n        error += dy;\n        if (error > 0) {\n            if (y === toY) {\n                break;\n            }\n            y += yStep;\n            error -= dx;\n        }\n    }\n    var distances = [];\n    for (var i = 0; i < length; i++) {\n        if (switchPoints[i] && switchPoints[i + 1]) {\n            distances.push(distance(switchPoints[i], switchPoints[i + 1]));\n        }\n        else {\n            distances.push(0);\n        }\n    }\n    return distances;\n}\n// Takes an origin point and an end point and counts the sizes of the black white run in the origin point\n// along the line that intersects with the end point. Returns an array of elements, representing the pixel sizes\n// of the black white run. Takes a length which represents the number of switches from black to white to look for.\nfunction countBlackWhiteRun(origin, end, matrix, length) {\n    var _a;\n    var rise = end.y - origin.y;\n    var run = end.x - origin.x;\n    var towardsEnd = countBlackWhiteRunTowardsPoint(origin, end, matrix, Math.ceil(length / 2));\n    var awayFromEnd = countBlackWhiteRunTowardsPoint(origin, { x: origin.x - run, y: origin.y - rise }, matrix, Math.ceil(length / 2));\n    var middleValue = towardsEnd.shift() + awayFromEnd.shift() - 1; // Substract one so we don't double count a pixel\n    return (_a = awayFromEnd.concat(middleValue)).concat.apply(_a, towardsEnd);\n}\n// Takes in a black white run and an array of expected ratios. Returns the average size of the run as well as the \"error\" -\n// that is the amount the run diverges from the expected ratio\nfunction scoreBlackWhiteRun(sequence, ratios) {\n    var averageSize = sum(sequence) / sum(ratios);\n    var error = 0;\n    ratios.forEach(function (ratio, i) {\n        error += Math.pow((sequence[i] - ratio * averageSize), 2);\n    });\n    return { averageSize: averageSize, error: error };\n}\n// Takes an X,Y point and an array of sizes and scores the point against those ratios.\n// For example for a finder pattern takes the ratio list of 1:1:3:1:1 and checks horizontal, vertical and diagonal ratios\n// against that.\nfunction scorePattern(point, ratios, matrix) {\n    try {\n        var horizontalRun = countBlackWhiteRun(point, { x: -1, y: point.y }, matrix, ratios.length);\n        var verticalRun = countBlackWhiteRun(point, { x: point.x, y: -1 }, matrix, ratios.length);\n        var topLeftPoint = {\n            x: Math.max(0, point.x - point.y) - 1,\n            y: Math.max(0, point.y - point.x) - 1,\n        };\n        var topLeftBottomRightRun = countBlackWhiteRun(point, topLeftPoint, matrix, ratios.length);\n        var bottomLeftPoint = {\n            x: Math.min(matrix.width, point.x + point.y) + 1,\n            y: Math.min(matrix.height, point.y + point.x) + 1,\n        };\n        var bottomLeftTopRightRun = countBlackWhiteRun(point, bottomLeftPoint, matrix, ratios.length);\n        var horzError = scoreBlackWhiteRun(horizontalRun, ratios);\n        var vertError = scoreBlackWhiteRun(verticalRun, ratios);\n        var diagDownError = scoreBlackWhiteRun(topLeftBottomRightRun, ratios);\n        var diagUpError = scoreBlackWhiteRun(bottomLeftTopRightRun, ratios);\n        var ratioError = Math.sqrt(horzError.error * horzError.error +\n            vertError.error * vertError.error +\n            diagDownError.error * diagDownError.error +\n            diagUpError.error * diagUpError.error);\n        var avgSize = (horzError.averageSize + vertError.averageSize + diagDownError.averageSize + diagUpError.averageSize) / 4;\n        var sizeError = (Math.pow((horzError.averageSize - avgSize), 2) +\n            Math.pow((vertError.averageSize - avgSize), 2) +\n            Math.pow((diagDownError.averageSize - avgSize), 2) +\n            Math.pow((diagUpError.averageSize - avgSize), 2)) / avgSize;\n        return ratioError + sizeError;\n    }\n    catch (_a) {\n        return Infinity;\n    }\n}\nfunction recenterLocation(matrix, p) {\n    var leftX = Math.round(p.x);\n    while (matrix.get(leftX, Math.round(p.y))) {\n        leftX--;\n    }\n    var rightX = Math.round(p.x);\n    while (matrix.get(rightX, Math.round(p.y))) {\n        rightX++;\n    }\n    var x = (leftX + rightX) / 2;\n    var topY = Math.round(p.y);\n    while (matrix.get(Math.round(x), topY)) {\n        topY--;\n    }\n    var bottomY = Math.round(p.y);\n    while (matrix.get(Math.round(x), bottomY)) {\n        bottomY++;\n    }\n    var y = (topY + bottomY) / 2;\n    return { x: x, y: y };\n}\nfunction locate(matrix) {\n    var finderPatternQuads = [];\n    var activeFinderPatternQuads = [];\n    var alignmentPatternQuads = [];\n    var activeAlignmentPatternQuads = [];\n    var _loop_1 = function (y) {\n        var length_1 = 0;\n        var lastBit = false;\n        var scans = [0, 0, 0, 0, 0];\n        var _loop_2 = function (x) {\n            var v = matrix.get(x, y);\n            if (v === lastBit) {\n                length_1++;\n            }\n            else {\n                scans = [scans[1], scans[2], scans[3], scans[4], length_1];\n                length_1 = 1;\n                lastBit = v;\n                // Do the last 5 color changes ~ match the expected ratio for a finder pattern? 1:1:3:1:1 of b:w:b:w:b\n                var averageFinderPatternBlocksize = sum(scans) / 7;\n                var validFinderPattern = Math.abs(scans[0] - averageFinderPatternBlocksize) < averageFinderPatternBlocksize &&\n                    Math.abs(scans[1] - averageFinderPatternBlocksize) < averageFinderPatternBlocksize &&\n                    Math.abs(scans[2] - 3 * averageFinderPatternBlocksize) < 3 * averageFinderPatternBlocksize &&\n                    Math.abs(scans[3] - averageFinderPatternBlocksize) < averageFinderPatternBlocksize &&\n                    Math.abs(scans[4] - averageFinderPatternBlocksize) < averageFinderPatternBlocksize &&\n                    !v; // And make sure the current pixel is white since finder patterns are bordered in white\n                // Do the last 3 color changes ~ match the expected ratio for an alignment pattern? 1:1:1 of w:b:w\n                var averageAlignmentPatternBlocksize = sum(scans.slice(-3)) / 3;\n                var validAlignmentPattern = Math.abs(scans[2] - averageAlignmentPatternBlocksize) < averageAlignmentPatternBlocksize &&\n                    Math.abs(scans[3] - averageAlignmentPatternBlocksize) < averageAlignmentPatternBlocksize &&\n                    Math.abs(scans[4] - averageAlignmentPatternBlocksize) < averageAlignmentPatternBlocksize &&\n                    v; // Is the current pixel black since alignment patterns are bordered in black\n                if (validFinderPattern) {\n                    // Compute the start and end x values of the large center black square\n                    var endX_1 = x - scans[3] - scans[4];\n                    var startX_1 = endX_1 - scans[2];\n                    var line = { startX: startX_1, endX: endX_1, y: y };\n                    // Is there a quad directly above the current spot? If so, extend it with the new line. Otherwise, create a new quad with\n                    // that line as the starting point.\n                    var matchingQuads = activeFinderPatternQuads.filter(function (q) {\n                        return (startX_1 >= q.bottom.startX && startX_1 <= q.bottom.endX) ||\n                            (endX_1 >= q.bottom.startX && startX_1 <= q.bottom.endX) ||\n                            (startX_1 <= q.bottom.startX && endX_1 >= q.bottom.endX && ((scans[2] / (q.bottom.endX - q.bottom.startX)) < MAX_QUAD_RATIO &&\n                                (scans[2] / (q.bottom.endX - q.bottom.startX)) > MIN_QUAD_RATIO));\n                    });\n                    if (matchingQuads.length > 0) {\n                        matchingQuads[0].bottom = line;\n                    }\n                    else {\n                        activeFinderPatternQuads.push({ top: line, bottom: line });\n                    }\n                }\n                if (validAlignmentPattern) {\n                    // Compute the start and end x values of the center black square\n                    var endX_2 = x - scans[4];\n                    var startX_2 = endX_2 - scans[3];\n                    var line = { startX: startX_2, y: y, endX: endX_2 };\n                    // Is there a quad directly above the current spot? If so, extend it with the new line. Otherwise, create a new quad with\n                    // that line as the starting point.\n                    var matchingQuads = activeAlignmentPatternQuads.filter(function (q) {\n                        return (startX_2 >= q.bottom.startX && startX_2 <= q.bottom.endX) ||\n                            (endX_2 >= q.bottom.startX && startX_2 <= q.bottom.endX) ||\n                            (startX_2 <= q.bottom.startX && endX_2 >= q.bottom.endX && ((scans[2] / (q.bottom.endX - q.bottom.startX)) < MAX_QUAD_RATIO &&\n                                (scans[2] / (q.bottom.endX - q.bottom.startX)) > MIN_QUAD_RATIO));\n                    });\n                    if (matchingQuads.length > 0) {\n                        matchingQuads[0].bottom = line;\n                    }\n                    else {\n                        activeAlignmentPatternQuads.push({ top: line, bottom: line });\n                    }\n                }\n            }\n        };\n        for (var x = -1; x <= matrix.width; x++) {\n            _loop_2(x);\n        }\n        finderPatternQuads.push.apply(finderPatternQuads, activeFinderPatternQuads.filter(function (q) { return q.bottom.y !== y && q.bottom.y - q.top.y >= 2; }));\n        activeFinderPatternQuads = activeFinderPatternQuads.filter(function (q) { return q.bottom.y === y; });\n        alignmentPatternQuads.push.apply(alignmentPatternQuads, activeAlignmentPatternQuads.filter(function (q) { return q.bottom.y !== y; }));\n        activeAlignmentPatternQuads = activeAlignmentPatternQuads.filter(function (q) { return q.bottom.y === y; });\n    };\n    for (var y = 0; y <= matrix.height; y++) {\n        _loop_1(y);\n    }\n    finderPatternQuads.push.apply(finderPatternQuads, activeFinderPatternQuads.filter(function (q) { return q.bottom.y - q.top.y >= 2; }));\n    alignmentPatternQuads.push.apply(alignmentPatternQuads, activeAlignmentPatternQuads);\n    var finderPatternGroups = finderPatternQuads\n        .filter(function (q) { return q.bottom.y - q.top.y >= 2; }) // All quads must be at least 2px tall since the center square is larger than a block\n        .map(function (q) {\n        var x = (q.top.startX + q.top.endX + q.bottom.startX + q.bottom.endX) / 4;\n        var y = (q.top.y + q.bottom.y + 1) / 2;\n        if (!matrix.get(Math.round(x), Math.round(y))) {\n            return;\n        }\n        var lengths = [q.top.endX - q.top.startX, q.bottom.endX - q.bottom.startX, q.bottom.y - q.top.y + 1];\n        var size = sum(lengths) / lengths.length;\n        var score = scorePattern({ x: Math.round(x), y: Math.round(y) }, [1, 1, 3, 1, 1], matrix);\n        return { score: score, x: x, y: y, size: size };\n    })\n        .filter(function (q) { return !!q; }) // Filter out any rejected quads from above\n        .sort(function (a, b) { return a.score - b.score; })\n        // Now take the top finder pattern options and try to find 2 other options with a similar size.\n        .map(function (point, i, finderPatterns) {\n        if (i > MAX_FINDERPATTERNS_TO_SEARCH) {\n            return null;\n        }\n        var otherPoints = finderPatterns\n            .filter(function (p, ii) { return i !== ii; })\n            .map(function (p) { return ({ x: p.x, y: p.y, score: p.score + (Math.pow((p.size - point.size), 2)) / point.size, size: p.size }); })\n            .sort(function (a, b) { return a.score - b.score; });\n        if (otherPoints.length < 2) {\n            return null;\n        }\n        var score = point.score + otherPoints[0].score + otherPoints[1].score;\n        return { points: [point].concat(otherPoints.slice(0, 2)), score: score };\n    })\n        .filter(function (q) { return !!q; }) // Filter out any rejected finder patterns from above\n        .sort(function (a, b) { return a.score - b.score; });\n    if (finderPatternGroups.length === 0) {\n        return null;\n    }\n    var _a = reorderFinderPatterns(finderPatternGroups[0].points[0], finderPatternGroups[0].points[1], finderPatternGroups[0].points[2]), topRight = _a.topRight, topLeft = _a.topLeft, bottomLeft = _a.bottomLeft;\n    var alignment = findAlignmentPattern(matrix, alignmentPatternQuads, topRight, topLeft, bottomLeft);\n    var result = [];\n    if (alignment) {\n        result.push({\n            alignmentPattern: { x: alignment.alignmentPattern.x, y: alignment.alignmentPattern.y },\n            bottomLeft: { x: bottomLeft.x, y: bottomLeft.y },\n            dimension: alignment.dimension,\n            topLeft: { x: topLeft.x, y: topLeft.y },\n            topRight: { x: topRight.x, y: topRight.y },\n        });\n    }\n    // We normally use the center of the quads as the location of the tracking points, which is optimal for most cases and will account\n    // for a skew in the image. However, In some cases, a slight skew might not be real and instead be caused by image compression\n    // errors and/or low resolution. For those cases, we'd be better off centering the point exactly in the middle of the black area. We\n    // compute and return the location data for the naively centered points as it is little additional work and allows for multiple\n    // attempts at decoding harder images.\n    var midTopRight = recenterLocation(matrix, topRight);\n    var midTopLeft = recenterLocation(matrix, topLeft);\n    var midBottomLeft = recenterLocation(matrix, bottomLeft);\n    var centeredAlignment = findAlignmentPattern(matrix, alignmentPatternQuads, midTopRight, midTopLeft, midBottomLeft);\n    if (centeredAlignment) {\n        result.push({\n            alignmentPattern: { x: centeredAlignment.alignmentPattern.x, y: centeredAlignment.alignmentPattern.y },\n            bottomLeft: { x: midBottomLeft.x, y: midBottomLeft.y },\n            topLeft: { x: midTopLeft.x, y: midTopLeft.y },\n            topRight: { x: midTopRight.x, y: midTopRight.y },\n            dimension: centeredAlignment.dimension,\n        });\n    }\n    if (result.length === 0) {\n        return null;\n    }\n    return result;\n}\nexports.locate = locate;\nfunction findAlignmentPattern(matrix, alignmentPatternQuads, topRight, topLeft, bottomLeft) {\n    var _a;\n    // Now that we've found the three finder patterns we can determine the blockSize and the size of the QR code.\n    // We'll use these to help find the alignment pattern but also later when we do the extraction.\n    var dimension;\n    var moduleSize;\n    try {\n        (_a = computeDimension(topLeft, topRight, bottomLeft, matrix), dimension = _a.dimension, moduleSize = _a.moduleSize);\n    }\n    catch (e) {\n        return null;\n    }\n    // Now find the alignment pattern\n    var bottomRightFinderPattern = {\n        x: topRight.x - topLeft.x + bottomLeft.x,\n        y: topRight.y - topLeft.y + bottomLeft.y,\n    };\n    var modulesBetweenFinderPatterns = ((distance(topLeft, bottomLeft) + distance(topLeft, topRight)) / 2 / moduleSize);\n    var correctionToTopLeft = 1 - (3 / modulesBetweenFinderPatterns);\n    var expectedAlignmentPattern = {\n        x: topLeft.x + correctionToTopLeft * (bottomRightFinderPattern.x - topLeft.x),\n        y: topLeft.y + correctionToTopLeft * (bottomRightFinderPattern.y - topLeft.y),\n    };\n    var alignmentPatterns = alignmentPatternQuads\n        .map(function (q) {\n        var x = (q.top.startX + q.top.endX + q.bottom.startX + q.bottom.endX) / 4;\n        var y = (q.top.y + q.bottom.y + 1) / 2;\n        if (!matrix.get(Math.floor(x), Math.floor(y))) {\n            return;\n        }\n        var lengths = [q.top.endX - q.top.startX, q.bottom.endX - q.bottom.startX, (q.bottom.y - q.top.y + 1)];\n        var size = sum(lengths) / lengths.length;\n        var sizeScore = scorePattern({ x: Math.floor(x), y: Math.floor(y) }, [1, 1, 1], matrix);\n        var score = sizeScore + distance({ x: x, y: y }, expectedAlignmentPattern);\n        return { x: x, y: y, score: score };\n    })\n        .filter(function (v) { return !!v; })\n        .sort(function (a, b) { return a.score - b.score; });\n    // If there are less than 15 modules between finder patterns it's a version 1 QR code and as such has no alignmemnt pattern\n    // so we can only use our best guess.\n    var alignmentPattern = modulesBetweenFinderPatterns >= 15 && alignmentPatterns.length ? alignmentPatterns[0] : expectedAlignmentPattern;\n    return { alignmentPattern: alignmentPattern, dimension: dimension };\n}\n\n\n/***/ })\n/******/ ])[\"default\"];\n});", "(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"QRCodeStyling\"] = factory();\n\telse\n\t\troot[\"QRCodeStyling\"] = factory();\n})(this, () => {\nreturn ", "//---------------------------------------------------------------------\n//\n// QR Code Generator for JavaScript\n//\n// Copyright (c) 2009 Kazuhiko Arase\n//\n// URL: http://www.d-project.com/\n//\n// Licensed under the MIT license:\n//  http://www.opensource.org/licenses/mit-license.php\n//\n// The word 'QR Code' is registered trademark of\n// DENSO WAVE INCORPORATED\n//  http://www.denso-wave.com/qrcode/faqpatent-e.html\n//\n//---------------------------------------------------------------------\n\nvar qrcode = function() {\n\n  //---------------------------------------------------------------------\n  // qrcode\n  //---------------------------------------------------------------------\n\n  /**\n   * qrcode\n   * @param typeNumber 1 to 40\n   * @param errorCorrectionLevel 'L','M','Q','H'\n   */\n  var qrcode = function(typeNumber, errorCorrectionLevel) {\n\n    var PAD0 = 0xEC;\n    var PAD1 = 0x11;\n\n    var _typeNumber = typeNumber;\n    var _errorCorrectionLevel = QRErrorCorrectionLevel[errorCorrectionLevel];\n    var _modules = null;\n    var _moduleCount = 0;\n    var _dataCache = null;\n    var _dataList = [];\n\n    var _this = {};\n\n    var makeImpl = function(test, maskPattern) {\n\n      _moduleCount = _typeNumber * 4 + 17;\n      _modules = function(moduleCount) {\n        var modules = new Array(moduleCount);\n        for (var row = 0; row < moduleCount; row += 1) {\n          modules[row] = new Array(moduleCount);\n          for (var col = 0; col < moduleCount; col += 1) {\n            modules[row][col] = null;\n          }\n        }\n        return modules;\n      }(_moduleCount);\n\n      setupPositionProbePattern(0, 0);\n      setupPositionProbePattern(_moduleCount - 7, 0);\n      setupPositionProbePattern(0, _moduleCount - 7);\n      setupPositionAdjustPattern();\n      setupTimingPattern();\n      setupTypeInfo(test, maskPattern);\n\n      if (_typeNumber >= 7) {\n        setupTypeNumber(test);\n      }\n\n      if (_dataCache == null) {\n        _dataCache = createData(_typeNumber, _errorCorrectionLevel, _dataList);\n      }\n\n      mapData(_dataCache, maskPattern);\n    };\n\n    var setupPositionProbePattern = function(row, col) {\n\n      for (var r = -1; r <= 7; r += 1) {\n\n        if (row + r <= -1 || _moduleCount <= row + r) continue;\n\n        for (var c = -1; c <= 7; c += 1) {\n\n          if (col + c <= -1 || _moduleCount <= col + c) continue;\n\n          if ( (0 <= r && r <= 6 && (c == 0 || c == 6) )\n              || (0 <= c && c <= 6 && (r == 0 || r == 6) )\n              || (2 <= r && r <= 4 && 2 <= c && c <= 4) ) {\n            _modules[row + r][col + c] = true;\n          } else {\n            _modules[row + r][col + c] = false;\n          }\n        }\n      }\n    };\n\n    var getBestMaskPattern = function() {\n\n      var minLostPoint = 0;\n      var pattern = 0;\n\n      for (var i = 0; i < 8; i += 1) {\n\n        makeImpl(true, i);\n\n        var lostPoint = QRUtil.getLostPoint(_this);\n\n        if (i == 0 || minLostPoint > lostPoint) {\n          minLostPoint = lostPoint;\n          pattern = i;\n        }\n      }\n\n      return pattern;\n    };\n\n    var setupTimingPattern = function() {\n\n      for (var r = 8; r < _moduleCount - 8; r += 1) {\n        if (_modules[r][6] != null) {\n          continue;\n        }\n        _modules[r][6] = (r % 2 == 0);\n      }\n\n      for (var c = 8; c < _moduleCount - 8; c += 1) {\n        if (_modules[6][c] != null) {\n          continue;\n        }\n        _modules[6][c] = (c % 2 == 0);\n      }\n    };\n\n    var setupPositionAdjustPattern = function() {\n\n      var pos = QRUtil.getPatternPosition(_typeNumber);\n\n      for (var i = 0; i < pos.length; i += 1) {\n\n        for (var j = 0; j < pos.length; j += 1) {\n\n          var row = pos[i];\n          var col = pos[j];\n\n          if (_modules[row][col] != null) {\n            continue;\n          }\n\n          for (var r = -2; r <= 2; r += 1) {\n\n            for (var c = -2; c <= 2; c += 1) {\n\n              if (r == -2 || r == 2 || c == -2 || c == 2\n                  || (r == 0 && c == 0) ) {\n                _modules[row + r][col + c] = true;\n              } else {\n                _modules[row + r][col + c] = false;\n              }\n            }\n          }\n        }\n      }\n    };\n\n    var setupTypeNumber = function(test) {\n\n      var bits = QRUtil.getBCHTypeNumber(_typeNumber);\n\n      for (var i = 0; i < 18; i += 1) {\n        var mod = (!test && ( (bits >> i) & 1) == 1);\n        _modules[Math.floor(i / 3)][i % 3 + _moduleCount - 8 - 3] = mod;\n      }\n\n      for (var i = 0; i < 18; i += 1) {\n        var mod = (!test && ( (bits >> i) & 1) == 1);\n        _modules[i % 3 + _moduleCount - 8 - 3][Math.floor(i / 3)] = mod;\n      }\n    };\n\n    var setupTypeInfo = function(test, maskPattern) {\n\n      var data = (_errorCorrectionLevel << 3) | maskPattern;\n      var bits = QRUtil.getBCHTypeInfo(data);\n\n      // vertical\n      for (var i = 0; i < 15; i += 1) {\n\n        var mod = (!test && ( (bits >> i) & 1) == 1);\n\n        if (i < 6) {\n          _modules[i][8] = mod;\n        } else if (i < 8) {\n          _modules[i + 1][8] = mod;\n        } else {\n          _modules[_moduleCount - 15 + i][8] = mod;\n        }\n      }\n\n      // horizontal\n      for (var i = 0; i < 15; i += 1) {\n\n        var mod = (!test && ( (bits >> i) & 1) == 1);\n\n        if (i < 8) {\n          _modules[8][_moduleCount - i - 1] = mod;\n        } else if (i < 9) {\n          _modules[8][15 - i - 1 + 1] = mod;\n        } else {\n          _modules[8][15 - i - 1] = mod;\n        }\n      }\n\n      // fixed module\n      _modules[_moduleCount - 8][8] = (!test);\n    };\n\n    var mapData = function(data, maskPattern) {\n\n      var inc = -1;\n      var row = _moduleCount - 1;\n      var bitIndex = 7;\n      var byteIndex = 0;\n      var maskFunc = QRUtil.getMaskFunction(maskPattern);\n\n      for (var col = _moduleCount - 1; col > 0; col -= 2) {\n\n        if (col == 6) col -= 1;\n\n        while (true) {\n\n          for (var c = 0; c < 2; c += 1) {\n\n            if (_modules[row][col - c] == null) {\n\n              var dark = false;\n\n              if (byteIndex < data.length) {\n                dark = ( ( (data[byteIndex] >>> bitIndex) & 1) == 1);\n              }\n\n              var mask = maskFunc(row, col - c);\n\n              if (mask) {\n                dark = !dark;\n              }\n\n              _modules[row][col - c] = dark;\n              bitIndex -= 1;\n\n              if (bitIndex == -1) {\n                byteIndex += 1;\n                bitIndex = 7;\n              }\n            }\n          }\n\n          row += inc;\n\n          if (row < 0 || _moduleCount <= row) {\n            row -= inc;\n            inc = -inc;\n            break;\n          }\n        }\n      }\n    };\n\n    var createBytes = function(buffer, rsBlocks) {\n\n      var offset = 0;\n\n      var maxDcCount = 0;\n      var maxEcCount = 0;\n\n      var dcdata = new Array(rsBlocks.length);\n      var ecdata = new Array(rsBlocks.length);\n\n      for (var r = 0; r < rsBlocks.length; r += 1) {\n\n        var dcCount = rsBlocks[r].dataCount;\n        var ecCount = rsBlocks[r].totalCount - dcCount;\n\n        maxDcCount = Math.max(maxDcCount, dcCount);\n        maxEcCount = Math.max(maxEcCount, ecCount);\n\n        dcdata[r] = new Array(dcCount);\n\n        for (var i = 0; i < dcdata[r].length; i += 1) {\n          dcdata[r][i] = 0xff & buffer.getBuffer()[i + offset];\n        }\n        offset += dcCount;\n\n        var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount);\n        var rawPoly = qrPolynomial(dcdata[r], rsPoly.getLength() - 1);\n\n        var modPoly = rawPoly.mod(rsPoly);\n        ecdata[r] = new Array(rsPoly.getLength() - 1);\n        for (var i = 0; i < ecdata[r].length; i += 1) {\n          var modIndex = i + modPoly.getLength() - ecdata[r].length;\n          ecdata[r][i] = (modIndex >= 0)? modPoly.getAt(modIndex) : 0;\n        }\n      }\n\n      var totalCodeCount = 0;\n      for (var i = 0; i < rsBlocks.length; i += 1) {\n        totalCodeCount += rsBlocks[i].totalCount;\n      }\n\n      var data = new Array(totalCodeCount);\n      var index = 0;\n\n      for (var i = 0; i < maxDcCount; i += 1) {\n        for (var r = 0; r < rsBlocks.length; r += 1) {\n          if (i < dcdata[r].length) {\n            data[index] = dcdata[r][i];\n            index += 1;\n          }\n        }\n      }\n\n      for (var i = 0; i < maxEcCount; i += 1) {\n        for (var r = 0; r < rsBlocks.length; r += 1) {\n          if (i < ecdata[r].length) {\n            data[index] = ecdata[r][i];\n            index += 1;\n          }\n        }\n      }\n\n      return data;\n    };\n\n    var createData = function(typeNumber, errorCorrectionLevel, dataList) {\n\n      var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectionLevel);\n\n      var buffer = qrBitBuffer();\n\n      for (var i = 0; i < dataList.length; i += 1) {\n        var data = dataList[i];\n        buffer.put(data.getMode(), 4);\n        buffer.put(data.getLength(), QRUtil.getLengthInBits(data.getMode(), typeNumber) );\n        data.write(buffer);\n      }\n\n      // calc num max data.\n      var totalDataCount = 0;\n      for (var i = 0; i < rsBlocks.length; i += 1) {\n        totalDataCount += rsBlocks[i].dataCount;\n      }\n\n      if (buffer.getLengthInBits() > totalDataCount * 8) {\n        throw 'code length overflow. ('\n          + buffer.getLengthInBits()\n          + '>'\n          + totalDataCount * 8\n          + ')';\n      }\n\n      // end code\n      if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) {\n        buffer.put(0, 4);\n      }\n\n      // padding\n      while (buffer.getLengthInBits() % 8 != 0) {\n        buffer.putBit(false);\n      }\n\n      // padding\n      while (true) {\n\n        if (buffer.getLengthInBits() >= totalDataCount * 8) {\n          break;\n        }\n        buffer.put(PAD0, 8);\n\n        if (buffer.getLengthInBits() >= totalDataCount * 8) {\n          break;\n        }\n        buffer.put(PAD1, 8);\n      }\n\n      return createBytes(buffer, rsBlocks);\n    };\n\n    _this.addData = function(data, mode) {\n\n      mode = mode || 'Byte';\n\n      var newData = null;\n\n      switch(mode) {\n      case 'Numeric' :\n        newData = qrNumber(data);\n        break;\n      case 'Alphanumeric' :\n        newData = qrAlphaNum(data);\n        break;\n      case 'Byte' :\n        newData = qr8BitByte(data);\n        break;\n      case 'Kanji' :\n        newData = qrKanji(data);\n        break;\n      default :\n        throw 'mode:' + mode;\n      }\n\n      _dataList.push(newData);\n      _dataCache = null;\n    };\n\n    _this.isDark = function(row, col) {\n      if (row < 0 || _moduleCount <= row || col < 0 || _moduleCount <= col) {\n        throw row + ',' + col;\n      }\n      return _modules[row][col];\n    };\n\n    _this.getModuleCount = function() {\n      return _moduleCount;\n    };\n\n    _this.make = function() {\n      if (_typeNumber < 1) {\n        var typeNumber = 1;\n\n        for (; typeNumber < 40; typeNumber++) {\n          var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, _errorCorrectionLevel);\n          var buffer = qrBitBuffer();\n\n          for (var i = 0; i < _dataList.length; i++) {\n            var data = _dataList[i];\n            buffer.put(data.getMode(), 4);\n            buffer.put(data.getLength(), QRUtil.getLengthInBits(data.getMode(), typeNumber) );\n            data.write(buffer);\n          }\n\n          var totalDataCount = 0;\n          for (var i = 0; i < rsBlocks.length; i++) {\n            totalDataCount += rsBlocks[i].dataCount;\n          }\n\n          if (buffer.getLengthInBits() <= totalDataCount * 8) {\n            break;\n          }\n        }\n\n        _typeNumber = typeNumber;\n      }\n\n      makeImpl(false, getBestMaskPattern() );\n    };\n\n    _this.createTableTag = function(cellSize, margin) {\n\n      cellSize = cellSize || 2;\n      margin = (typeof margin == 'undefined')? cellSize * 4 : margin;\n\n      var qrHtml = '';\n\n      qrHtml += '<table style=\"';\n      qrHtml += ' border-width: 0px; border-style: none;';\n      qrHtml += ' border-collapse: collapse;';\n      qrHtml += ' padding: 0px; margin: ' + margin + 'px;';\n      qrHtml += '\">';\n      qrHtml += '<tbody>';\n\n      for (var r = 0; r < _this.getModuleCount(); r += 1) {\n\n        qrHtml += '<tr>';\n\n        for (var c = 0; c < _this.getModuleCount(); c += 1) {\n          qrHtml += '<td style=\"';\n          qrHtml += ' border-width: 0px; border-style: none;';\n          qrHtml += ' border-collapse: collapse;';\n          qrHtml += ' padding: 0px; margin: 0px;';\n          qrHtml += ' width: ' + cellSize + 'px;';\n          qrHtml += ' height: ' + cellSize + 'px;';\n          qrHtml += ' background-color: ';\n          qrHtml += _this.isDark(r, c)? '#000000' : '#ffffff';\n          qrHtml += ';';\n          qrHtml += '\"/>';\n        }\n\n        qrHtml += '</tr>';\n      }\n\n      qrHtml += '</tbody>';\n      qrHtml += '</table>';\n\n      return qrHtml;\n    };\n\n    _this.createSvgTag = function(cellSize, margin, alt, title) {\n\n      var opts = {};\n      if (typeof arguments[0] == 'object') {\n        // Called by options.\n        opts = arguments[0];\n        // overwrite cellSize and margin.\n        cellSize = opts.cellSize;\n        margin = opts.margin;\n        alt = opts.alt;\n        title = opts.title;\n      }\n\n      cellSize = cellSize || 2;\n      margin = (typeof margin == 'undefined')? cellSize * 4 : margin;\n\n      // Compose alt property surrogate\n      alt = (typeof alt === 'string') ? {text: alt} : alt || {};\n      alt.text = alt.text || null;\n      alt.id = (alt.text) ? alt.id || 'qrcode-description' : null;\n\n      // Compose title property surrogate\n      title = (typeof title === 'string') ? {text: title} : title || {};\n      title.text = title.text || null;\n      title.id = (title.text) ? title.id || 'qrcode-title' : null;\n\n      var size = _this.getModuleCount() * cellSize + margin * 2;\n      var c, mc, r, mr, qrSvg='', rect;\n\n      rect = 'l' + cellSize + ',0 0,' + cellSize +\n        ' -' + cellSize + ',0 0,-' + cellSize + 'z ';\n\n      qrSvg += '<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"';\n      qrSvg += !opts.scalable ? ' width=\"' + size + 'px\" height=\"' + size + 'px\"' : '';\n      qrSvg += ' viewBox=\"0 0 ' + size + ' ' + size + '\" ';\n      qrSvg += ' preserveAspectRatio=\"xMinYMin meet\"';\n      qrSvg += (title.text || alt.text) ? ' role=\"img\" aria-labelledby=\"' +\n          escapeXml([title.id, alt.id].join(' ').trim() ) + '\"' : '';\n      qrSvg += '>';\n      qrSvg += (title.text) ? '<title id=\"' + escapeXml(title.id) + '\">' +\n          escapeXml(title.text) + '</title>' : '';\n      qrSvg += (alt.text) ? '<description id=\"' + escapeXml(alt.id) + '\">' +\n          escapeXml(alt.text) + '</description>' : '';\n      qrSvg += '<rect width=\"100%\" height=\"100%\" fill=\"white\" cx=\"0\" cy=\"0\"/>';\n      qrSvg += '<path d=\"';\n\n      for (r = 0; r < _this.getModuleCount(); r += 1) {\n        mr = r * cellSize + margin;\n        for (c = 0; c < _this.getModuleCount(); c += 1) {\n          if (_this.isDark(r, c) ) {\n            mc = c*cellSize+margin;\n            qrSvg += 'M' + mc + ',' + mr + rect;\n          }\n        }\n      }\n\n      qrSvg += '\" stroke=\"transparent\" fill=\"black\"/>';\n      qrSvg += '</svg>';\n\n      return qrSvg;\n    };\n\n    _this.createDataURL = function(cellSize, margin) {\n\n      cellSize = cellSize || 2;\n      margin = (typeof margin == 'undefined')? cellSize * 4 : margin;\n\n      var size = _this.getModuleCount() * cellSize + margin * 2;\n      var min = margin;\n      var max = size - margin;\n\n      return createDataURL(size, size, function(x, y) {\n        if (min <= x && x < max && min <= y && y < max) {\n          var c = Math.floor( (x - min) / cellSize);\n          var r = Math.floor( (y - min) / cellSize);\n          return _this.isDark(r, c)? 0 : 1;\n        } else {\n          return 1;\n        }\n      } );\n    };\n\n    _this.createImgTag = function(cellSize, margin, alt) {\n\n      cellSize = cellSize || 2;\n      margin = (typeof margin == 'undefined')? cellSize * 4 : margin;\n\n      var size = _this.getModuleCount() * cellSize + margin * 2;\n\n      var img = '';\n      img += '<img';\n      img += '\\u0020src=\"';\n      img += _this.createDataURL(cellSize, margin);\n      img += '\"';\n      img += '\\u0020width=\"';\n      img += size;\n      img += '\"';\n      img += '\\u0020height=\"';\n      img += size;\n      img += '\"';\n      if (alt) {\n        img += '\\u0020alt=\"';\n        img += escapeXml(alt);\n        img += '\"';\n      }\n      img += '/>';\n\n      return img;\n    };\n\n    var escapeXml = function(s) {\n      var escaped = '';\n      for (var i = 0; i < s.length; i += 1) {\n        var c = s.charAt(i);\n        switch(c) {\n        case '<': escaped += '&lt;'; break;\n        case '>': escaped += '&gt;'; break;\n        case '&': escaped += '&amp;'; break;\n        case '\"': escaped += '&quot;'; break;\n        default : escaped += c; break;\n        }\n      }\n      return escaped;\n    };\n\n    var _createHalfASCII = function(margin) {\n      var cellSize = 1;\n      margin = (typeof margin == 'undefined')? cellSize * 2 : margin;\n\n      var size = _this.getModuleCount() * cellSize + margin * 2;\n      var min = margin;\n      var max = size - margin;\n\n      var y, x, r1, r2, p;\n\n      var blocks = {\n        '██': '█',\n        '█ ': '▀',\n        ' █': '▄',\n        '  ': ' '\n      };\n\n      var blocksLastLineNoMargin = {\n        '██': '▀',\n        '█ ': '▀',\n        ' █': ' ',\n        '  ': ' '\n      };\n\n      var ascii = '';\n      for (y = 0; y < size; y += 2) {\n        r1 = Math.floor((y - min) / cellSize);\n        r2 = Math.floor((y + 1 - min) / cellSize);\n        for (x = 0; x < size; x += 1) {\n          p = '█';\n\n          if (min <= x && x < max && min <= y && y < max && _this.isDark(r1, Math.floor((x - min) / cellSize))) {\n            p = ' ';\n          }\n\n          if (min <= x && x < max && min <= y+1 && y+1 < max && _this.isDark(r2, Math.floor((x - min) / cellSize))) {\n            p += ' ';\n          }\n          else {\n            p += '█';\n          }\n\n          // Output 2 characters per pixel, to create full square. 1 character per pixels gives only half width of square.\n          ascii += (margin < 1 && y+1 >= max) ? blocksLastLineNoMargin[p] : blocks[p];\n        }\n\n        ascii += '\\n';\n      }\n\n      if (size % 2 && margin > 0) {\n        return ascii.substring(0, ascii.length - size - 1) + Array(size+1).join('▀');\n      }\n\n      return ascii.substring(0, ascii.length-1);\n    };\n\n    _this.createASCII = function(cellSize, margin) {\n      cellSize = cellSize || 1;\n\n      if (cellSize < 2) {\n        return _createHalfASCII(margin);\n      }\n\n      cellSize -= 1;\n      margin = (typeof margin == 'undefined')? cellSize * 2 : margin;\n\n      var size = _this.getModuleCount() * cellSize + margin * 2;\n      var min = margin;\n      var max = size - margin;\n\n      var y, x, r, p;\n\n      var white = Array(cellSize+1).join('██');\n      var black = Array(cellSize+1).join('  ');\n\n      var ascii = '';\n      var line = '';\n      for (y = 0; y < size; y += 1) {\n        r = Math.floor( (y - min) / cellSize);\n        line = '';\n        for (x = 0; x < size; x += 1) {\n          p = 1;\n\n          if (min <= x && x < max && min <= y && y < max && _this.isDark(r, Math.floor((x - min) / cellSize))) {\n            p = 0;\n          }\n\n          // Output 2 characters per pixel, to create full square. 1 character per pixels gives only half width of square.\n          line += p ? white : black;\n        }\n\n        for (r = 0; r < cellSize; r += 1) {\n          ascii += line + '\\n';\n        }\n      }\n\n      return ascii.substring(0, ascii.length-1);\n    };\n\n    _this.renderTo2dContext = function(context, cellSize) {\n      cellSize = cellSize || 2;\n      var length = _this.getModuleCount();\n      for (var row = 0; row < length; row++) {\n        for (var col = 0; col < length; col++) {\n          context.fillStyle = _this.isDark(row, col) ? 'black' : 'white';\n          context.fillRect(row * cellSize, col * cellSize, cellSize, cellSize);\n        }\n      }\n    }\n\n    return _this;\n  };\n\n  //---------------------------------------------------------------------\n  // qrcode.stringToBytes\n  //---------------------------------------------------------------------\n\n  qrcode.stringToBytesFuncs = {\n    'default' : function(s) {\n      var bytes = [];\n      for (var i = 0; i < s.length; i += 1) {\n        var c = s.charCodeAt(i);\n        bytes.push(c & 0xff);\n      }\n      return bytes;\n    }\n  };\n\n  qrcode.stringToBytes = qrcode.stringToBytesFuncs['default'];\n\n  //---------------------------------------------------------------------\n  // qrcode.createStringToBytes\n  //---------------------------------------------------------------------\n\n  /**\n   * @param unicodeData base64 string of byte array.\n   * [16bit Unicode],[16bit Bytes], ...\n   * @param numChars\n   */\n  qrcode.createStringToBytes = function(unicodeData, numChars) {\n\n    // create conversion map.\n\n    var unicodeMap = function() {\n\n      var bin = base64DecodeInputStream(unicodeData);\n      var read = function() {\n        var b = bin.read();\n        if (b == -1) throw 'eof';\n        return b;\n      };\n\n      var count = 0;\n      var unicodeMap = {};\n      while (true) {\n        var b0 = bin.read();\n        if (b0 == -1) break;\n        var b1 = read();\n        var b2 = read();\n        var b3 = read();\n        var k = String.fromCharCode( (b0 << 8) | b1);\n        var v = (b2 << 8) | b3;\n        unicodeMap[k] = v;\n        count += 1;\n      }\n      if (count != numChars) {\n        throw count + ' != ' + numChars;\n      }\n\n      return unicodeMap;\n    }();\n\n    var unknownChar = '?'.charCodeAt(0);\n\n    return function(s) {\n      var bytes = [];\n      for (var i = 0; i < s.length; i += 1) {\n        var c = s.charCodeAt(i);\n        if (c < 128) {\n          bytes.push(c);\n        } else {\n          var b = unicodeMap[s.charAt(i)];\n          if (typeof b == 'number') {\n            if ( (b & 0xff) == b) {\n              // 1byte\n              bytes.push(b);\n            } else {\n              // 2bytes\n              bytes.push(b >>> 8);\n              bytes.push(b & 0xff);\n            }\n          } else {\n            bytes.push(unknownChar);\n          }\n        }\n      }\n      return bytes;\n    };\n  };\n\n  //---------------------------------------------------------------------\n  // QRMode\n  //---------------------------------------------------------------------\n\n  var QRMode = {\n    MODE_NUMBER :    1 << 0,\n    MODE_ALPHA_NUM : 1 << 1,\n    MODE_8BIT_BYTE : 1 << 2,\n    MODE_KANJI :     1 << 3\n  };\n\n  //---------------------------------------------------------------------\n  // QRErrorCorrectionLevel\n  //---------------------------------------------------------------------\n\n  var QRErrorCorrectionLevel = {\n    L : 1,\n    M : 0,\n    Q : 3,\n    H : 2\n  };\n\n  //---------------------------------------------------------------------\n  // QRMaskPattern\n  //---------------------------------------------------------------------\n\n  var QRMaskPattern = {\n    PATTERN000 : 0,\n    PATTERN001 : 1,\n    PATTERN010 : 2,\n    PATTERN011 : 3,\n    PATTERN100 : 4,\n    PATTERN101 : 5,\n    PATTERN110 : 6,\n    PATTERN111 : 7\n  };\n\n  //---------------------------------------------------------------------\n  // QRUtil\n  //---------------------------------------------------------------------\n\n  var QRUtil = function() {\n\n    var PATTERN_POSITION_TABLE = [\n      [],\n      [6, 18],\n      [6, 22],\n      [6, 26],\n      [6, 30],\n      [6, 34],\n      [6, 22, 38],\n      [6, 24, 42],\n      [6, 26, 46],\n      [6, 28, 50],\n      [6, 30, 54],\n      [6, 32, 58],\n      [6, 34, 62],\n      [6, 26, 46, 66],\n      [6, 26, 48, 70],\n      [6, 26, 50, 74],\n      [6, 30, 54, 78],\n      [6, 30, 56, 82],\n      [6, 30, 58, 86],\n      [6, 34, 62, 90],\n      [6, 28, 50, 72, 94],\n      [6, 26, 50, 74, 98],\n      [6, 30, 54, 78, 102],\n      [6, 28, 54, 80, 106],\n      [6, 32, 58, 84, 110],\n      [6, 30, 58, 86, 114],\n      [6, 34, 62, 90, 118],\n      [6, 26, 50, 74, 98, 122],\n      [6, 30, 54, 78, 102, 126],\n      [6, 26, 52, 78, 104, 130],\n      [6, 30, 56, 82, 108, 134],\n      [6, 34, 60, 86, 112, 138],\n      [6, 30, 58, 86, 114, 142],\n      [6, 34, 62, 90, 118, 146],\n      [6, 30, 54, 78, 102, 126, 150],\n      [6, 24, 50, 76, 102, 128, 154],\n      [6, 28, 54, 80, 106, 132, 158],\n      [6, 32, 58, 84, 110, 136, 162],\n      [6, 26, 54, 82, 110, 138, 166],\n      [6, 30, 58, 86, 114, 142, 170]\n    ];\n    var G15 = (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0);\n    var G18 = (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0);\n    var G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1);\n\n    var _this = {};\n\n    var getBCHDigit = function(data) {\n      var digit = 0;\n      while (data != 0) {\n        digit += 1;\n        data >>>= 1;\n      }\n      return digit;\n    };\n\n    _this.getBCHTypeInfo = function(data) {\n      var d = data << 10;\n      while (getBCHDigit(d) - getBCHDigit(G15) >= 0) {\n        d ^= (G15 << (getBCHDigit(d) - getBCHDigit(G15) ) );\n      }\n      return ( (data << 10) | d) ^ G15_MASK;\n    };\n\n    _this.getBCHTypeNumber = function(data) {\n      var d = data << 12;\n      while (getBCHDigit(d) - getBCHDigit(G18) >= 0) {\n        d ^= (G18 << (getBCHDigit(d) - getBCHDigit(G18) ) );\n      }\n      return (data << 12) | d;\n    };\n\n    _this.getPatternPosition = function(typeNumber) {\n      return PATTERN_POSITION_TABLE[typeNumber - 1];\n    };\n\n    _this.getMaskFunction = function(maskPattern) {\n\n      switch (maskPattern) {\n\n      case QRMaskPattern.PATTERN000 :\n        return function(i, j) { return (i + j) % 2 == 0; };\n      case QRMaskPattern.PATTERN001 :\n        return function(i, j) { return i % 2 == 0; };\n      case QRMaskPattern.PATTERN010 :\n        return function(i, j) { return j % 3 == 0; };\n      case QRMaskPattern.PATTERN011 :\n        return function(i, j) { return (i + j) % 3 == 0; };\n      case QRMaskPattern.PATTERN100 :\n        return function(i, j) { return (Math.floor(i / 2) + Math.floor(j / 3) ) % 2 == 0; };\n      case QRMaskPattern.PATTERN101 :\n        return function(i, j) { return (i * j) % 2 + (i * j) % 3 == 0; };\n      case QRMaskPattern.PATTERN110 :\n        return function(i, j) { return ( (i * j) % 2 + (i * j) % 3) % 2 == 0; };\n      case QRMaskPattern.PATTERN111 :\n        return function(i, j) { return ( (i * j) % 3 + (i + j) % 2) % 2 == 0; };\n\n      default :\n        throw 'bad maskPattern:' + maskPattern;\n      }\n    };\n\n    _this.getErrorCorrectPolynomial = function(errorCorrectLength) {\n      var a = qrPolynomial([1], 0);\n      for (var i = 0; i < errorCorrectLength; i += 1) {\n        a = a.multiply(qrPolynomial([1, QRMath.gexp(i)], 0) );\n      }\n      return a;\n    };\n\n    _this.getLengthInBits = function(mode, type) {\n\n      if (1 <= type && type < 10) {\n\n        // 1 - 9\n\n        switch(mode) {\n        case QRMode.MODE_NUMBER    : return 10;\n        case QRMode.MODE_ALPHA_NUM : return 9;\n        case QRMode.MODE_8BIT_BYTE : return 8;\n        case QRMode.MODE_KANJI     : return 8;\n        default :\n          throw 'mode:' + mode;\n        }\n\n      } else if (type < 27) {\n\n        // 10 - 26\n\n        switch(mode) {\n        case QRMode.MODE_NUMBER    : return 12;\n        case QRMode.MODE_ALPHA_NUM : return 11;\n        case QRMode.MODE_8BIT_BYTE : return 16;\n        case QRMode.MODE_KANJI     : return 10;\n        default :\n          throw 'mode:' + mode;\n        }\n\n      } else if (type < 41) {\n\n        // 27 - 40\n\n        switch(mode) {\n        case QRMode.MODE_NUMBER    : return 14;\n        case QRMode.MODE_ALPHA_NUM : return 13;\n        case QRMode.MODE_8BIT_BYTE : return 16;\n        case QRMode.MODE_KANJI     : return 12;\n        default :\n          throw 'mode:' + mode;\n        }\n\n      } else {\n        throw 'type:' + type;\n      }\n    };\n\n    _this.getLostPoint = function(qrcode) {\n\n      var moduleCount = qrcode.getModuleCount();\n\n      var lostPoint = 0;\n\n      // LEVEL1\n\n      for (var row = 0; row < moduleCount; row += 1) {\n        for (var col = 0; col < moduleCount; col += 1) {\n\n          var sameCount = 0;\n          var dark = qrcode.isDark(row, col);\n\n          for (var r = -1; r <= 1; r += 1) {\n\n            if (row + r < 0 || moduleCount <= row + r) {\n              continue;\n            }\n\n            for (var c = -1; c <= 1; c += 1) {\n\n              if (col + c < 0 || moduleCount <= col + c) {\n                continue;\n              }\n\n              if (r == 0 && c == 0) {\n                continue;\n              }\n\n              if (dark == qrcode.isDark(row + r, col + c) ) {\n                sameCount += 1;\n              }\n            }\n          }\n\n          if (sameCount > 5) {\n            lostPoint += (3 + sameCount - 5);\n          }\n        }\n      };\n\n      // LEVEL2\n\n      for (var row = 0; row < moduleCount - 1; row += 1) {\n        for (var col = 0; col < moduleCount - 1; col += 1) {\n          var count = 0;\n          if (qrcode.isDark(row, col) ) count += 1;\n          if (qrcode.isDark(row + 1, col) ) count += 1;\n          if (qrcode.isDark(row, col + 1) ) count += 1;\n          if (qrcode.isDark(row + 1, col + 1) ) count += 1;\n          if (count == 0 || count == 4) {\n            lostPoint += 3;\n          }\n        }\n      }\n\n      // LEVEL3\n\n      for (var row = 0; row < moduleCount; row += 1) {\n        for (var col = 0; col < moduleCount - 6; col += 1) {\n          if (qrcode.isDark(row, col)\n              && !qrcode.isDark(row, col + 1)\n              &&  qrcode.isDark(row, col + 2)\n              &&  qrcode.isDark(row, col + 3)\n              &&  qrcode.isDark(row, col + 4)\n              && !qrcode.isDark(row, col + 5)\n              &&  qrcode.isDark(row, col + 6) ) {\n            lostPoint += 40;\n          }\n        }\n      }\n\n      for (var col = 0; col < moduleCount; col += 1) {\n        for (var row = 0; row < moduleCount - 6; row += 1) {\n          if (qrcode.isDark(row, col)\n              && !qrcode.isDark(row + 1, col)\n              &&  qrcode.isDark(row + 2, col)\n              &&  qrcode.isDark(row + 3, col)\n              &&  qrcode.isDark(row + 4, col)\n              && !qrcode.isDark(row + 5, col)\n              &&  qrcode.isDark(row + 6, col) ) {\n            lostPoint += 40;\n          }\n        }\n      }\n\n      // LEVEL4\n\n      var darkCount = 0;\n\n      for (var col = 0; col < moduleCount; col += 1) {\n        for (var row = 0; row < moduleCount; row += 1) {\n          if (qrcode.isDark(row, col) ) {\n            darkCount += 1;\n          }\n        }\n      }\n\n      var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;\n      lostPoint += ratio * 10;\n\n      return lostPoint;\n    };\n\n    return _this;\n  }();\n\n  //---------------------------------------------------------------------\n  // QRMath\n  //---------------------------------------------------------------------\n\n  var QRMath = function() {\n\n    var EXP_TABLE = new Array(256);\n    var LOG_TABLE = new Array(256);\n\n    // initialize tables\n    for (var i = 0; i < 8; i += 1) {\n      EXP_TABLE[i] = 1 << i;\n    }\n    for (var i = 8; i < 256; i += 1) {\n      EXP_TABLE[i] = EXP_TABLE[i - 4]\n        ^ EXP_TABLE[i - 5]\n        ^ EXP_TABLE[i - 6]\n        ^ EXP_TABLE[i - 8];\n    }\n    for (var i = 0; i < 255; i += 1) {\n      LOG_TABLE[EXP_TABLE[i] ] = i;\n    }\n\n    var _this = {};\n\n    _this.glog = function(n) {\n\n      if (n < 1) {\n        throw 'glog(' + n + ')';\n      }\n\n      return LOG_TABLE[n];\n    };\n\n    _this.gexp = function(n) {\n\n      while (n < 0) {\n        n += 255;\n      }\n\n      while (n >= 256) {\n        n -= 255;\n      }\n\n      return EXP_TABLE[n];\n    };\n\n    return _this;\n  }();\n\n  //---------------------------------------------------------------------\n  // qrPolynomial\n  //---------------------------------------------------------------------\n\n  function qrPolynomial(num, shift) {\n\n    if (typeof num.length == 'undefined') {\n      throw num.length + '/' + shift;\n    }\n\n    var _num = function() {\n      var offset = 0;\n      while (offset < num.length && num[offset] == 0) {\n        offset += 1;\n      }\n      var _num = new Array(num.length - offset + shift);\n      for (var i = 0; i < num.length - offset; i += 1) {\n        _num[i] = num[i + offset];\n      }\n      return _num;\n    }();\n\n    var _this = {};\n\n    _this.getAt = function(index) {\n      return _num[index];\n    };\n\n    _this.getLength = function() {\n      return _num.length;\n    };\n\n    _this.multiply = function(e) {\n\n      var num = new Array(_this.getLength() + e.getLength() - 1);\n\n      for (var i = 0; i < _this.getLength(); i += 1) {\n        for (var j = 0; j < e.getLength(); j += 1) {\n          num[i + j] ^= QRMath.gexp(QRMath.glog(_this.getAt(i) ) + QRMath.glog(e.getAt(j) ) );\n        }\n      }\n\n      return qrPolynomial(num, 0);\n    };\n\n    _this.mod = function(e) {\n\n      if (_this.getLength() - e.getLength() < 0) {\n        return _this;\n      }\n\n      var ratio = QRMath.glog(_this.getAt(0) ) - QRMath.glog(e.getAt(0) );\n\n      var num = new Array(_this.getLength() );\n      for (var i = 0; i < _this.getLength(); i += 1) {\n        num[i] = _this.getAt(i);\n      }\n\n      for (var i = 0; i < e.getLength(); i += 1) {\n        num[i] ^= QRMath.gexp(QRMath.glog(e.getAt(i) ) + ratio);\n      }\n\n      // recursive call\n      return qrPolynomial(num, 0).mod(e);\n    };\n\n    return _this;\n  };\n\n  //---------------------------------------------------------------------\n  // QRRSBlock\n  //---------------------------------------------------------------------\n\n  var QRRSBlock = function() {\n\n    var RS_BLOCK_TABLE = [\n\n      // L\n      // M\n      // Q\n      // H\n\n      // 1\n      [1, 26, 19],\n      [1, 26, 16],\n      [1, 26, 13],\n      [1, 26, 9],\n\n      // 2\n      [1, 44, 34],\n      [1, 44, 28],\n      [1, 44, 22],\n      [1, 44, 16],\n\n      // 3\n      [1, 70, 55],\n      [1, 70, 44],\n      [2, 35, 17],\n      [2, 35, 13],\n\n      // 4\n      [1, 100, 80],\n      [2, 50, 32],\n      [2, 50, 24],\n      [4, 25, 9],\n\n      // 5\n      [1, 134, 108],\n      [2, 67, 43],\n      [2, 33, 15, 2, 34, 16],\n      [2, 33, 11, 2, 34, 12],\n\n      // 6\n      [2, 86, 68],\n      [4, 43, 27],\n      [4, 43, 19],\n      [4, 43, 15],\n\n      // 7\n      [2, 98, 78],\n      [4, 49, 31],\n      [2, 32, 14, 4, 33, 15],\n      [4, 39, 13, 1, 40, 14],\n\n      // 8\n      [2, 121, 97],\n      [2, 60, 38, 2, 61, 39],\n      [4, 40, 18, 2, 41, 19],\n      [4, 40, 14, 2, 41, 15],\n\n      // 9\n      [2, 146, 116],\n      [3, 58, 36, 2, 59, 37],\n      [4, 36, 16, 4, 37, 17],\n      [4, 36, 12, 4, 37, 13],\n\n      // 10\n      [2, 86, 68, 2, 87, 69],\n      [4, 69, 43, 1, 70, 44],\n      [6, 43, 19, 2, 44, 20],\n      [6, 43, 15, 2, 44, 16],\n\n      // 11\n      [4, 101, 81],\n      [1, 80, 50, 4, 81, 51],\n      [4, 50, 22, 4, 51, 23],\n      [3, 36, 12, 8, 37, 13],\n\n      // 12\n      [2, 116, 92, 2, 117, 93],\n      [6, 58, 36, 2, 59, 37],\n      [4, 46, 20, 6, 47, 21],\n      [7, 42, 14, 4, 43, 15],\n\n      // 13\n      [4, 133, 107],\n      [8, 59, 37, 1, 60, 38],\n      [8, 44, 20, 4, 45, 21],\n      [12, 33, 11, 4, 34, 12],\n\n      // 14\n      [3, 145, 115, 1, 146, 116],\n      [4, 64, 40, 5, 65, 41],\n      [11, 36, 16, 5, 37, 17],\n      [11, 36, 12, 5, 37, 13],\n\n      // 15\n      [5, 109, 87, 1, 110, 88],\n      [5, 65, 41, 5, 66, 42],\n      [5, 54, 24, 7, 55, 25],\n      [11, 36, 12, 7, 37, 13],\n\n      // 16\n      [5, 122, 98, 1, 123, 99],\n      [7, 73, 45, 3, 74, 46],\n      [15, 43, 19, 2, 44, 20],\n      [3, 45, 15, 13, 46, 16],\n\n      // 17\n      [1, 135, 107, 5, 136, 108],\n      [10, 74, 46, 1, 75, 47],\n      [1, 50, 22, 15, 51, 23],\n      [2, 42, 14, 17, 43, 15],\n\n      // 18\n      [5, 150, 120, 1, 151, 121],\n      [9, 69, 43, 4, 70, 44],\n      [17, 50, 22, 1, 51, 23],\n      [2, 42, 14, 19, 43, 15],\n\n      // 19\n      [3, 141, 113, 4, 142, 114],\n      [3, 70, 44, 11, 71, 45],\n      [17, 47, 21, 4, 48, 22],\n      [9, 39, 13, 16, 40, 14],\n\n      // 20\n      [3, 135, 107, 5, 136, 108],\n      [3, 67, 41, 13, 68, 42],\n      [15, 54, 24, 5, 55, 25],\n      [15, 43, 15, 10, 44, 16],\n\n      // 21\n      [4, 144, 116, 4, 145, 117],\n      [17, 68, 42],\n      [17, 50, 22, 6, 51, 23],\n      [19, 46, 16, 6, 47, 17],\n\n      // 22\n      [2, 139, 111, 7, 140, 112],\n      [17, 74, 46],\n      [7, 54, 24, 16, 55, 25],\n      [34, 37, 13],\n\n      // 23\n      [4, 151, 121, 5, 152, 122],\n      [4, 75, 47, 14, 76, 48],\n      [11, 54, 24, 14, 55, 25],\n      [16, 45, 15, 14, 46, 16],\n\n      // 24\n      [6, 147, 117, 4, 148, 118],\n      [6, 73, 45, 14, 74, 46],\n      [11, 54, 24, 16, 55, 25],\n      [30, 46, 16, 2, 47, 17],\n\n      // 25\n      [8, 132, 106, 4, 133, 107],\n      [8, 75, 47, 13, 76, 48],\n      [7, 54, 24, 22, 55, 25],\n      [22, 45, 15, 13, 46, 16],\n\n      // 26\n      [10, 142, 114, 2, 143, 115],\n      [19, 74, 46, 4, 75, 47],\n      [28, 50, 22, 6, 51, 23],\n      [33, 46, 16, 4, 47, 17],\n\n      // 27\n      [8, 152, 122, 4, 153, 123],\n      [22, 73, 45, 3, 74, 46],\n      [8, 53, 23, 26, 54, 24],\n      [12, 45, 15, 28, 46, 16],\n\n      // 28\n      [3, 147, 117, 10, 148, 118],\n      [3, 73, 45, 23, 74, 46],\n      [4, 54, 24, 31, 55, 25],\n      [11, 45, 15, 31, 46, 16],\n\n      // 29\n      [7, 146, 116, 7, 147, 117],\n      [21, 73, 45, 7, 74, 46],\n      [1, 53, 23, 37, 54, 24],\n      [19, 45, 15, 26, 46, 16],\n\n      // 30\n      [5, 145, 115, 10, 146, 116],\n      [19, 75, 47, 10, 76, 48],\n      [15, 54, 24, 25, 55, 25],\n      [23, 45, 15, 25, 46, 16],\n\n      // 31\n      [13, 145, 115, 3, 146, 116],\n      [2, 74, 46, 29, 75, 47],\n      [42, 54, 24, 1, 55, 25],\n      [23, 45, 15, 28, 46, 16],\n\n      // 32\n      [17, 145, 115],\n      [10, 74, 46, 23, 75, 47],\n      [10, 54, 24, 35, 55, 25],\n      [19, 45, 15, 35, 46, 16],\n\n      // 33\n      [17, 145, 115, 1, 146, 116],\n      [14, 74, 46, 21, 75, 47],\n      [29, 54, 24, 19, 55, 25],\n      [11, 45, 15, 46, 46, 16],\n\n      // 34\n      [13, 145, 115, 6, 146, 116],\n      [14, 74, 46, 23, 75, 47],\n      [44, 54, 24, 7, 55, 25],\n      [59, 46, 16, 1, 47, 17],\n\n      // 35\n      [12, 151, 121, 7, 152, 122],\n      [12, 75, 47, 26, 76, 48],\n      [39, 54, 24, 14, 55, 25],\n      [22, 45, 15, 41, 46, 16],\n\n      // 36\n      [6, 151, 121, 14, 152, 122],\n      [6, 75, 47, 34, 76, 48],\n      [46, 54, 24, 10, 55, 25],\n      [2, 45, 15, 64, 46, 16],\n\n      // 37\n      [17, 152, 122, 4, 153, 123],\n      [29, 74, 46, 14, 75, 47],\n      [49, 54, 24, 10, 55, 25],\n      [24, 45, 15, 46, 46, 16],\n\n      // 38\n      [4, 152, 122, 18, 153, 123],\n      [13, 74, 46, 32, 75, 47],\n      [48, 54, 24, 14, 55, 25],\n      [42, 45, 15, 32, 46, 16],\n\n      // 39\n      [20, 147, 117, 4, 148, 118],\n      [40, 75, 47, 7, 76, 48],\n      [43, 54, 24, 22, 55, 25],\n      [10, 45, 15, 67, 46, 16],\n\n      // 40\n      [19, 148, 118, 6, 149, 119],\n      [18, 75, 47, 31, 76, 48],\n      [34, 54, 24, 34, 55, 25],\n      [20, 45, 15, 61, 46, 16]\n    ];\n\n    var qrRSBlock = function(totalCount, dataCount) {\n      var _this = {};\n      _this.totalCount = totalCount;\n      _this.dataCount = dataCount;\n      return _this;\n    };\n\n    var _this = {};\n\n    var getRsBlockTable = function(typeNumber, errorCorrectionLevel) {\n\n      switch(errorCorrectionLevel) {\n      case QRErrorCorrectionLevel.L :\n        return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0];\n      case QRErrorCorrectionLevel.M :\n        return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1];\n      case QRErrorCorrectionLevel.Q :\n        return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2];\n      case QRErrorCorrectionLevel.H :\n        return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3];\n      default :\n        return undefined;\n      }\n    };\n\n    _this.getRSBlocks = function(typeNumber, errorCorrectionLevel) {\n\n      var rsBlock = getRsBlockTable(typeNumber, errorCorrectionLevel);\n\n      if (typeof rsBlock == 'undefined') {\n        throw 'bad rs block @ typeNumber:' + typeNumber +\n            '/errorCorrectionLevel:' + errorCorrectionLevel;\n      }\n\n      var length = rsBlock.length / 3;\n\n      var list = [];\n\n      for (var i = 0; i < length; i += 1) {\n\n        var count = rsBlock[i * 3 + 0];\n        var totalCount = rsBlock[i * 3 + 1];\n        var dataCount = rsBlock[i * 3 + 2];\n\n        for (var j = 0; j < count; j += 1) {\n          list.push(qrRSBlock(totalCount, dataCount) );\n        }\n      }\n\n      return list;\n    };\n\n    return _this;\n  }();\n\n  //---------------------------------------------------------------------\n  // qrBitBuffer\n  //---------------------------------------------------------------------\n\n  var qrBitBuffer = function() {\n\n    var _buffer = [];\n    var _length = 0;\n\n    var _this = {};\n\n    _this.getBuffer = function() {\n      return _buffer;\n    };\n\n    _this.getAt = function(index) {\n      var bufIndex = Math.floor(index / 8);\n      return ( (_buffer[bufIndex] >>> (7 - index % 8) ) & 1) == 1;\n    };\n\n    _this.put = function(num, length) {\n      for (var i = 0; i < length; i += 1) {\n        _this.putBit( ( (num >>> (length - i - 1) ) & 1) == 1);\n      }\n    };\n\n    _this.getLengthInBits = function() {\n      return _length;\n    };\n\n    _this.putBit = function(bit) {\n\n      var bufIndex = Math.floor(_length / 8);\n      if (_buffer.length <= bufIndex) {\n        _buffer.push(0);\n      }\n\n      if (bit) {\n        _buffer[bufIndex] |= (0x80 >>> (_length % 8) );\n      }\n\n      _length += 1;\n    };\n\n    return _this;\n  };\n\n  //---------------------------------------------------------------------\n  // qrNumber\n  //---------------------------------------------------------------------\n\n  var qrNumber = function(data) {\n\n    var _mode = QRMode.MODE_NUMBER;\n    var _data = data;\n\n    var _this = {};\n\n    _this.getMode = function() {\n      return _mode;\n    };\n\n    _this.getLength = function(buffer) {\n      return _data.length;\n    };\n\n    _this.write = function(buffer) {\n\n      var data = _data;\n\n      var i = 0;\n\n      while (i + 2 < data.length) {\n        buffer.put(strToNum(data.substring(i, i + 3) ), 10);\n        i += 3;\n      }\n\n      if (i < data.length) {\n        if (data.length - i == 1) {\n          buffer.put(strToNum(data.substring(i, i + 1) ), 4);\n        } else if (data.length - i == 2) {\n          buffer.put(strToNum(data.substring(i, i + 2) ), 7);\n        }\n      }\n    };\n\n    var strToNum = function(s) {\n      var num = 0;\n      for (var i = 0; i < s.length; i += 1) {\n        num = num * 10 + chatToNum(s.charAt(i) );\n      }\n      return num;\n    };\n\n    var chatToNum = function(c) {\n      if ('0' <= c && c <= '9') {\n        return c.charCodeAt(0) - '0'.charCodeAt(0);\n      }\n      throw 'illegal char :' + c;\n    };\n\n    return _this;\n  };\n\n  //---------------------------------------------------------------------\n  // qrAlphaNum\n  //---------------------------------------------------------------------\n\n  var qrAlphaNum = function(data) {\n\n    var _mode = QRMode.MODE_ALPHA_NUM;\n    var _data = data;\n\n    var _this = {};\n\n    _this.getMode = function() {\n      return _mode;\n    };\n\n    _this.getLength = function(buffer) {\n      return _data.length;\n    };\n\n    _this.write = function(buffer) {\n\n      var s = _data;\n\n      var i = 0;\n\n      while (i + 1 < s.length) {\n        buffer.put(\n          getCode(s.charAt(i) ) * 45 +\n          getCode(s.charAt(i + 1) ), 11);\n        i += 2;\n      }\n\n      if (i < s.length) {\n        buffer.put(getCode(s.charAt(i) ), 6);\n      }\n    };\n\n    var getCode = function(c) {\n\n      if ('0' <= c && c <= '9') {\n        return c.charCodeAt(0) - '0'.charCodeAt(0);\n      } else if ('A' <= c && c <= 'Z') {\n        return c.charCodeAt(0) - 'A'.charCodeAt(0) + 10;\n      } else {\n        switch (c) {\n        case ' ' : return 36;\n        case '$' : return 37;\n        case '%' : return 38;\n        case '*' : return 39;\n        case '+' : return 40;\n        case '-' : return 41;\n        case '.' : return 42;\n        case '/' : return 43;\n        case ':' : return 44;\n        default :\n          throw 'illegal char :' + c;\n        }\n      }\n    };\n\n    return _this;\n  };\n\n  //---------------------------------------------------------------------\n  // qr8BitByte\n  //---------------------------------------------------------------------\n\n  var qr8BitByte = function(data) {\n\n    var _mode = QRMode.MODE_8BIT_BYTE;\n    var _data = data;\n    var _bytes = qrcode.stringToBytes(data);\n\n    var _this = {};\n\n    _this.getMode = function() {\n      return _mode;\n    };\n\n    _this.getLength = function(buffer) {\n      return _bytes.length;\n    };\n\n    _this.write = function(buffer) {\n      for (var i = 0; i < _bytes.length; i += 1) {\n        buffer.put(_bytes[i], 8);\n      }\n    };\n\n    return _this;\n  };\n\n  //---------------------------------------------------------------------\n  // qrKanji\n  //---------------------------------------------------------------------\n\n  var qrKanji = function(data) {\n\n    var _mode = QRMode.MODE_KANJI;\n    var _data = data;\n\n    var stringToBytes = qrcode.stringToBytesFuncs['SJIS'];\n    if (!stringToBytes) {\n      throw 'sjis not supported.';\n    }\n    !function(c, code) {\n      // self test for sjis support.\n      var test = stringToBytes(c);\n      if (test.length != 2 || ( (test[0] << 8) | test[1]) != code) {\n        throw 'sjis not supported.';\n      }\n    }('\\u53cb', 0x9746);\n\n    var _bytes = stringToBytes(data);\n\n    var _this = {};\n\n    _this.getMode = function() {\n      return _mode;\n    };\n\n    _this.getLength = function(buffer) {\n      return ~~(_bytes.length / 2);\n    };\n\n    _this.write = function(buffer) {\n\n      var data = _bytes;\n\n      var i = 0;\n\n      while (i + 1 < data.length) {\n\n        var c = ( (0xff & data[i]) << 8) | (0xff & data[i + 1]);\n\n        if (0x8140 <= c && c <= 0x9FFC) {\n          c -= 0x8140;\n        } else if (0xE040 <= c && c <= 0xEBBF) {\n          c -= 0xC140;\n        } else {\n          throw 'illegal char at ' + (i + 1) + '/' + c;\n        }\n\n        c = ( (c >>> 8) & 0xff) * 0xC0 + (c & 0xff);\n\n        buffer.put(c, 13);\n\n        i += 2;\n      }\n\n      if (i < data.length) {\n        throw 'illegal char at ' + (i + 1);\n      }\n    };\n\n    return _this;\n  };\n\n  //=====================================================================\n  // GIF Support etc.\n  //\n\n  //---------------------------------------------------------------------\n  // byteArrayOutputStream\n  //---------------------------------------------------------------------\n\n  var byteArrayOutputStream = function() {\n\n    var _bytes = [];\n\n    var _this = {};\n\n    _this.writeByte = function(b) {\n      _bytes.push(b & 0xff);\n    };\n\n    _this.writeShort = function(i) {\n      _this.writeByte(i);\n      _this.writeByte(i >>> 8);\n    };\n\n    _this.writeBytes = function(b, off, len) {\n      off = off || 0;\n      len = len || b.length;\n      for (var i = 0; i < len; i += 1) {\n        _this.writeByte(b[i + off]);\n      }\n    };\n\n    _this.writeString = function(s) {\n      for (var i = 0; i < s.length; i += 1) {\n        _this.writeByte(s.charCodeAt(i) );\n      }\n    };\n\n    _this.toByteArray = function() {\n      return _bytes;\n    };\n\n    _this.toString = function() {\n      var s = '';\n      s += '[';\n      for (var i = 0; i < _bytes.length; i += 1) {\n        if (i > 0) {\n          s += ',';\n        }\n        s += _bytes[i];\n      }\n      s += ']';\n      return s;\n    };\n\n    return _this;\n  };\n\n  //---------------------------------------------------------------------\n  // base64EncodeOutputStream\n  //---------------------------------------------------------------------\n\n  var base64EncodeOutputStream = function() {\n\n    var _buffer = 0;\n    var _buflen = 0;\n    var _length = 0;\n    var _base64 = '';\n\n    var _this = {};\n\n    var writeEncoded = function(b) {\n      _base64 += String.fromCharCode(encode(b & 0x3f) );\n    };\n\n    var encode = function(n) {\n      if (n < 0) {\n        // error.\n      } else if (n < 26) {\n        return 0x41 + n;\n      } else if (n < 52) {\n        return 0x61 + (n - 26);\n      } else if (n < 62) {\n        return 0x30 + (n - 52);\n      } else if (n == 62) {\n        return 0x2b;\n      } else if (n == 63) {\n        return 0x2f;\n      }\n      throw 'n:' + n;\n    };\n\n    _this.writeByte = function(n) {\n\n      _buffer = (_buffer << 8) | (n & 0xff);\n      _buflen += 8;\n      _length += 1;\n\n      while (_buflen >= 6) {\n        writeEncoded(_buffer >>> (_buflen - 6) );\n        _buflen -= 6;\n      }\n    };\n\n    _this.flush = function() {\n\n      if (_buflen > 0) {\n        writeEncoded(_buffer << (6 - _buflen) );\n        _buffer = 0;\n        _buflen = 0;\n      }\n\n      if (_length % 3 != 0) {\n        // padding\n        var padlen = 3 - _length % 3;\n        for (var i = 0; i < padlen; i += 1) {\n          _base64 += '=';\n        }\n      }\n    };\n\n    _this.toString = function() {\n      return _base64;\n    };\n\n    return _this;\n  };\n\n  //---------------------------------------------------------------------\n  // base64DecodeInputStream\n  //---------------------------------------------------------------------\n\n  var base64DecodeInputStream = function(str) {\n\n    var _str = str;\n    var _pos = 0;\n    var _buffer = 0;\n    var _buflen = 0;\n\n    var _this = {};\n\n    _this.read = function() {\n\n      while (_buflen < 8) {\n\n        if (_pos >= _str.length) {\n          if (_buflen == 0) {\n            return -1;\n          }\n          throw 'unexpected end of file./' + _buflen;\n        }\n\n        var c = _str.charAt(_pos);\n        _pos += 1;\n\n        if (c == '=') {\n          _buflen = 0;\n          return -1;\n        } else if (c.match(/^\\s$/) ) {\n          // ignore if whitespace.\n          continue;\n        }\n\n        _buffer = (_buffer << 6) | decode(c.charCodeAt(0) );\n        _buflen += 6;\n      }\n\n      var n = (_buffer >>> (_buflen - 8) ) & 0xff;\n      _buflen -= 8;\n      return n;\n    };\n\n    var decode = function(c) {\n      if (0x41 <= c && c <= 0x5a) {\n        return c - 0x41;\n      } else if (0x61 <= c && c <= 0x7a) {\n        return c - 0x61 + 26;\n      } else if (0x30 <= c && c <= 0x39) {\n        return c - 0x30 + 52;\n      } else if (c == 0x2b) {\n        return 62;\n      } else if (c == 0x2f) {\n        return 63;\n      } else {\n        throw 'c:' + c;\n      }\n    };\n\n    return _this;\n  };\n\n  //---------------------------------------------------------------------\n  // gifImage (B/W)\n  //---------------------------------------------------------------------\n\n  var gifImage = function(width, height) {\n\n    var _width = width;\n    var _height = height;\n    var _data = new Array(width * height);\n\n    var _this = {};\n\n    _this.setPixel = function(x, y, pixel) {\n      _data[y * _width + x] = pixel;\n    };\n\n    _this.write = function(out) {\n\n      //---------------------------------\n      // GIF Signature\n\n      out.writeString('GIF87a');\n\n      //---------------------------------\n      // Screen Descriptor\n\n      out.writeShort(_width);\n      out.writeShort(_height);\n\n      out.writeByte(0x80); // 2bit\n      out.writeByte(0);\n      out.writeByte(0);\n\n      //---------------------------------\n      // Global Color Map\n\n      // black\n      out.writeByte(0x00);\n      out.writeByte(0x00);\n      out.writeByte(0x00);\n\n      // white\n      out.writeByte(0xff);\n      out.writeByte(0xff);\n      out.writeByte(0xff);\n\n      //---------------------------------\n      // Image Descriptor\n\n      out.writeString(',');\n      out.writeShort(0);\n      out.writeShort(0);\n      out.writeShort(_width);\n      out.writeShort(_height);\n      out.writeByte(0);\n\n      //---------------------------------\n      // Local Color Map\n\n      //---------------------------------\n      // Raster Data\n\n      var lzwMinCodeSize = 2;\n      var raster = getLZWRaster(lzwMinCodeSize);\n\n      out.writeByte(lzwMinCodeSize);\n\n      var offset = 0;\n\n      while (raster.length - offset > 255) {\n        out.writeByte(255);\n        out.writeBytes(raster, offset, 255);\n        offset += 255;\n      }\n\n      out.writeByte(raster.length - offset);\n      out.writeBytes(raster, offset, raster.length - offset);\n      out.writeByte(0x00);\n\n      //---------------------------------\n      // GIF Terminator\n      out.writeString(';');\n    };\n\n    var bitOutputStream = function(out) {\n\n      var _out = out;\n      var _bitLength = 0;\n      var _bitBuffer = 0;\n\n      var _this = {};\n\n      _this.write = function(data, length) {\n\n        if ( (data >>> length) != 0) {\n          throw 'length over';\n        }\n\n        while (_bitLength + length >= 8) {\n          _out.writeByte(0xff & ( (data << _bitLength) | _bitBuffer) );\n          length -= (8 - _bitLength);\n          data >>>= (8 - _bitLength);\n          _bitBuffer = 0;\n          _bitLength = 0;\n        }\n\n        _bitBuffer = (data << _bitLength) | _bitBuffer;\n        _bitLength = _bitLength + length;\n      };\n\n      _this.flush = function() {\n        if (_bitLength > 0) {\n          _out.writeByte(_bitBuffer);\n        }\n      };\n\n      return _this;\n    };\n\n    var getLZWRaster = function(lzwMinCodeSize) {\n\n      var clearCode = 1 << lzwMinCodeSize;\n      var endCode = (1 << lzwMinCodeSize) + 1;\n      var bitLength = lzwMinCodeSize + 1;\n\n      // Setup LZWTable\n      var table = lzwTable();\n\n      for (var i = 0; i < clearCode; i += 1) {\n        table.add(String.fromCharCode(i) );\n      }\n      table.add(String.fromCharCode(clearCode) );\n      table.add(String.fromCharCode(endCode) );\n\n      var byteOut = byteArrayOutputStream();\n      var bitOut = bitOutputStream(byteOut);\n\n      // clear code\n      bitOut.write(clearCode, bitLength);\n\n      var dataIndex = 0;\n\n      var s = String.fromCharCode(_data[dataIndex]);\n      dataIndex += 1;\n\n      while (dataIndex < _data.length) {\n\n        var c = String.fromCharCode(_data[dataIndex]);\n        dataIndex += 1;\n\n        if (table.contains(s + c) ) {\n\n          s = s + c;\n\n        } else {\n\n          bitOut.write(table.indexOf(s), bitLength);\n\n          if (table.size() < 0xfff) {\n\n            if (table.size() == (1 << bitLength) ) {\n              bitLength += 1;\n            }\n\n            table.add(s + c);\n          }\n\n          s = c;\n        }\n      }\n\n      bitOut.write(table.indexOf(s), bitLength);\n\n      // end code\n      bitOut.write(endCode, bitLength);\n\n      bitOut.flush();\n\n      return byteOut.toByteArray();\n    };\n\n    var lzwTable = function() {\n\n      var _map = {};\n      var _size = 0;\n\n      var _this = {};\n\n      _this.add = function(key) {\n        if (_this.contains(key) ) {\n          throw 'dup key:' + key;\n        }\n        _map[key] = _size;\n        _size += 1;\n      };\n\n      _this.size = function() {\n        return _size;\n      };\n\n      _this.indexOf = function(key) {\n        return _map[key];\n      };\n\n      _this.contains = function(key) {\n        return typeof _map[key] != 'undefined';\n      };\n\n      return _this;\n    };\n\n    return _this;\n  };\n\n  var createDataURL = function(width, height, getPixel) {\n    var gif = gifImage(width, height);\n    for (var y = 0; y < height; y += 1) {\n      for (var x = 0; x < width; x += 1) {\n        gif.setPixel(x, y, getPixel(x, y) );\n      }\n    }\n\n    var b = byteArrayOutputStream();\n    gif.write(b);\n\n    var base64 = base64EncodeOutputStream();\n    var bytes = b.toByteArray();\n    for (var i = 0; i < bytes.length; i += 1) {\n      base64.writeByte(bytes[i]);\n    }\n    base64.flush();\n\n    return 'data:image/gif;base64,' + base64;\n  };\n\n  //---------------------------------------------------------------------\n  // returns qrcode function.\n\n  return qrcode;\n}();\n\n// multibyte support\n!function() {\n\n  qrcode.stringToBytesFuncs['UTF-8'] = function(s) {\n    // http://stackoverflow.com/questions/18729405/how-to-convert-utf8-string-to-byte-array\n    function toUTF8Array(str) {\n      var utf8 = [];\n      for (var i=0; i < str.length; i++) {\n        var charcode = str.charCodeAt(i);\n        if (charcode < 0x80) utf8.push(charcode);\n        else if (charcode < 0x800) {\n          utf8.push(0xc0 | (charcode >> 6),\n              0x80 | (charcode & 0x3f));\n        }\n        else if (charcode < 0xd800 || charcode >= 0xe000) {\n          utf8.push(0xe0 | (charcode >> 12),\n              0x80 | ((charcode>>6) & 0x3f),\n              0x80 | (charcode & 0x3f));\n        }\n        // surrogate pair\n        else {\n          i++;\n          // UTF-16 encodes 0x10000-0x10FFFF by\n          // subtracting 0x10000 and splitting the\n          // 20 bits of 0x0-0xFFFFF into two halves\n          charcode = 0x10000 + (((charcode & 0x3ff)<<10)\n            | (str.charCodeAt(i) & 0x3ff));\n          utf8.push(0xf0 | (charcode >>18),\n              0x80 | ((charcode>>12) & 0x3f),\n              0x80 | ((charcode>>6) & 0x3f),\n              0x80 | (charcode & 0x3f));\n        }\n      }\n      return utf8;\n    }\n    return toUTF8Array(s);\n  };\n\n}();\n\n(function (factory) {\n  if (typeof define === 'function' && define.amd) {\n      define([], factory);\n  } else if (typeof exports === 'object') {\n      module.exports = factory();\n  }\n}(function () {\n    return qrcode;\n}));\n", "// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n", "// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};", "// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};", "__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))", "import { Mode } from \"../types\";\n\ninterface Modes {\n  [key: string]: Mode;\n}\n\nexport default {\n  numeric: \"Numeric\",\n  alphanumeric: \"Alphanumeric\",\n  byte: \"Byte\",\n  kanji: \"Kanji\"\n} as Modes;\n", "import { UnknownObject } from \"../types\";\n\nconst isObject = (obj: Record<string, unknown>): boolean => !!obj && typeof obj === \"object\" && !Array.isArray(obj);\n\nexport default function mergeDeep(target: UnknownObject, ...sources: UnknownObject[]): UnknownObject {\n  if (!sources.length) return target;\n  const source = sources.shift();\n  if (source === undefined || !isObject(target) || !isObject(source)) return target;\n  target = { ...target };\n  Object.keys(source).forEach((key: string): void => {\n    const targetValue = target[key];\n    const sourceValue = source[key];\n\n    if (Array.isArray(targetValue) && Array.isArray(sourceValue)) {\n      target[key] = sourceValue;\n    } else if (isObject(targetValue) && isObject(sourceValue)) {\n      target[key] = mergeDeep(Object.assign({}, targetValue), sourceValue);\n    } else {\n      target[key] = sourceValue;\n    }\n  });\n\n  return mergeDeep(target, ...sources);\n}\n", "export default function downloadURI(uri: string, name: string): void {\n  const link = document.createElement(\"a\");\n  link.download = name;\n  link.href = uri;\n  document.body.appendChild(link);\n  link.click();\n  document.body.removeChild(link);\n}\n", "interface ErrorCorrectionPercents {\n  [key: string]: number;\n}\n\nexport default {\n  L: 0.07,\n  M: 0.15,\n  Q: 0.25,\n  H: 0.3\n} as ErrorCorrectionPercents;\n", "import dotTypes from \"../../constants/dotTypes\";\nimport { DotType, GetNeighbor, DrawArgs, BasicFigureDrawArgs, RotateFigureArgs, Window } from \"../../types\";\n\nexport default class QRDot {\n  _element?: SVGElement;\n  _svg: SVGElement;\n  _type: DotType;\n  _window: Window;\n\n  constructor({ svg, type, window }: { svg: SVGElement; type: DotType; window: Window }) {\n    this._svg = svg;\n    this._type = type;\n    this._window = window;\n  }\n\n  draw(x: number, y: number, size: number, getNeighbor: GetNeighbor): void {\n    const type = this._type;\n    let drawFunction;\n\n    switch (type) {\n      case dotTypes.dots:\n        drawFunction = this._drawDot;\n        break;\n      case dotTypes.classy:\n        drawFunction = this._drawClassy;\n        break;\n      case dotTypes.classyRounded:\n        drawFunction = this._drawClassyRounded;\n        break;\n      case dotTypes.rounded:\n        drawFunction = this._drawRounded;\n        break;\n      case dotTypes.extraRounded:\n        drawFunction = this._drawExtraRounded;\n        break;\n      case dotTypes.square:\n      default:\n        drawFunction = this._drawSquare;\n    }\n\n    drawFunction.call(this, { x, y, size, getNeighbor });\n  }\n\n  _rotateFigure({ x, y, size, rotation = 0, draw }: RotateFigureArgs): void {\n    const cx = x + size / 2;\n    const cy = y + size / 2;\n\n    draw();\n    this._element?.setAttribute(\"transform\", `rotate(${(180 * rotation) / Math.PI},${cx},${cy})`);\n  }\n\n  _basicDot(args: BasicFigureDrawArgs): void {\n    const { size, x, y } = args;\n\n    this._rotateFigure({\n      ...args,\n      draw: () => {\n        this._element = this._window.document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\n        this._element.setAttribute(\"cx\", String(x + size / 2));\n        this._element.setAttribute(\"cy\", String(y + size / 2));\n        this._element.setAttribute(\"r\", String(size / 2));\n      }\n    });\n  }\n\n  _basicSquare(args: BasicFigureDrawArgs): void {\n    const { size, x, y } = args;\n\n    this._rotateFigure({\n      ...args,\n      draw: () => {\n        this._element = this._window.document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n        this._element.setAttribute(\"x\", String(x));\n        this._element.setAttribute(\"y\", String(y));\n        this._element.setAttribute(\"width\", String(size));\n        this._element.setAttribute(\"height\", String(size));\n      }\n    });\n  }\n\n  //if rotation === 0 - right side is rounded\n  _basicSideRounded(args: BasicFigureDrawArgs): void {\n    const { size, x, y } = args;\n\n    this._rotateFigure({\n      ...args,\n      draw: () => {\n        this._element = this._window.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n        this._element.setAttribute(\n          \"d\",\n          `M ${x} ${y}` + //go to top left position\n            `v ${size}` + //draw line to left bottom corner\n            `h ${size / 2}` + //draw line to left bottom corner + half of size right\n            `a ${size / 2} ${size / 2}, 0, 0, 0, 0 ${-size}` // draw rounded corner\n        );\n      }\n    });\n  }\n\n  //if rotation === 0 - top right corner is rounded\n  _basicCornerRounded(args: BasicFigureDrawArgs): void {\n    const { size, x, y } = args;\n\n    this._rotateFigure({\n      ...args,\n      draw: () => {\n        this._element = this._window.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n        this._element.setAttribute(\n          \"d\",\n          `M ${x} ${y}` + //go to top left position\n            `v ${size}` + //draw line to left bottom corner\n            `h ${size}` + //draw line to right bottom corner\n            `v ${-size / 2}` + //draw line to right bottom corner + half of size top\n            `a ${size / 2} ${size / 2}, 0, 0, 0, ${-size / 2} ${-size / 2}` // draw rounded corner\n        );\n      }\n    });\n  }\n\n  //if rotation === 0 - top right corner is rounded\n  _basicCornerExtraRounded(args: BasicFigureDrawArgs): void {\n    const { size, x, y } = args;\n\n    this._rotateFigure({\n      ...args,\n      draw: () => {\n        this._element = this._window.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n        this._element.setAttribute(\n          \"d\",\n          `M ${x} ${y}` + //go to top left position\n            `v ${size}` + //draw line to left bottom corner\n            `h ${size}` + //draw line to right bottom corner\n            `a ${size} ${size}, 0, 0, 0, ${-size} ${-size}` // draw rounded top right corner\n        );\n      }\n    });\n  }\n\n  //if rotation === 0 - left bottom and right top corners are rounded\n  _basicCornersRounded(args: BasicFigureDrawArgs): void {\n    const { size, x, y } = args;\n\n    this._rotateFigure({\n      ...args,\n      draw: () => {\n        this._element = this._window.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n        this._element.setAttribute(\n          \"d\",\n          `M ${x} ${y}` + //go to left top position\n            `v ${size / 2}` + //draw line to left top corner + half of size bottom\n            `a ${size / 2} ${size / 2}, 0, 0, 0, ${size / 2} ${size / 2}` + // draw rounded left bottom corner\n            `h ${size / 2}` + //draw line to right bottom corner\n            `v ${-size / 2}` + //draw line to right bottom corner + half of size top\n            `a ${size / 2} ${size / 2}, 0, 0, 0, ${-size / 2} ${-size / 2}` // draw rounded right top corner\n        );\n      }\n    });\n  }\n\n  _drawDot({ x, y, size }: DrawArgs): void {\n    this._basicDot({ x, y, size, rotation: 0 });\n  }\n\n  _drawSquare({ x, y, size }: DrawArgs): void {\n    this._basicSquare({ x, y, size, rotation: 0 });\n  }\n\n  _drawRounded({ x, y, size, getNeighbor }: DrawArgs): void {\n    const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0;\n    const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0;\n    const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0;\n    const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0;\n\n    const neighborsCount = leftNeighbor + rightNeighbor + topNeighbor + bottomNeighbor;\n\n    if (neighborsCount === 0) {\n      this._basicDot({ x, y, size, rotation: 0 });\n      return;\n    }\n\n    if (neighborsCount > 2 || (leftNeighbor && rightNeighbor) || (topNeighbor && bottomNeighbor)) {\n      this._basicSquare({ x, y, size, rotation: 0 });\n      return;\n    }\n\n    if (neighborsCount === 2) {\n      let rotation = 0;\n\n      if (leftNeighbor && topNeighbor) {\n        rotation = Math.PI / 2;\n      } else if (topNeighbor && rightNeighbor) {\n        rotation = Math.PI;\n      } else if (rightNeighbor && bottomNeighbor) {\n        rotation = -Math.PI / 2;\n      }\n\n      this._basicCornerRounded({ x, y, size, rotation });\n      return;\n    }\n\n    if (neighborsCount === 1) {\n      let rotation = 0;\n\n      if (topNeighbor) {\n        rotation = Math.PI / 2;\n      } else if (rightNeighbor) {\n        rotation = Math.PI;\n      } else if (bottomNeighbor) {\n        rotation = -Math.PI / 2;\n      }\n\n      this._basicSideRounded({ x, y, size, rotation });\n      return;\n    }\n  }\n\n  _drawExtraRounded({ x, y, size, getNeighbor }: DrawArgs): void {\n    const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0;\n    const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0;\n    const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0;\n    const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0;\n\n    const neighborsCount = leftNeighbor + rightNeighbor + topNeighbor + bottomNeighbor;\n\n    if (neighborsCount === 0) {\n      this._basicDot({ x, y, size, rotation: 0 });\n      return;\n    }\n\n    if (neighborsCount > 2 || (leftNeighbor && rightNeighbor) || (topNeighbor && bottomNeighbor)) {\n      this._basicSquare({ x, y, size, rotation: 0 });\n      return;\n    }\n\n    if (neighborsCount === 2) {\n      let rotation = 0;\n\n      if (leftNeighbor && topNeighbor) {\n        rotation = Math.PI / 2;\n      } else if (topNeighbor && rightNeighbor) {\n        rotation = Math.PI;\n      } else if (rightNeighbor && bottomNeighbor) {\n        rotation = -Math.PI / 2;\n      }\n\n      this._basicCornerExtraRounded({ x, y, size, rotation });\n      return;\n    }\n\n    if (neighborsCount === 1) {\n      let rotation = 0;\n\n      if (topNeighbor) {\n        rotation = Math.PI / 2;\n      } else if (rightNeighbor) {\n        rotation = Math.PI;\n      } else if (bottomNeighbor) {\n        rotation = -Math.PI / 2;\n      }\n\n      this._basicSideRounded({ x, y, size, rotation });\n      return;\n    }\n  }\n\n  _drawClassy({ x, y, size, getNeighbor }: DrawArgs): void {\n    const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0;\n    const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0;\n    const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0;\n    const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0;\n\n    const neighborsCount = leftNeighbor + rightNeighbor + topNeighbor + bottomNeighbor;\n\n    if (neighborsCount === 0) {\n      this._basicCornersRounded({ x, y, size, rotation: Math.PI / 2 });\n      return;\n    }\n\n    if (!leftNeighbor && !topNeighbor) {\n      this._basicCornerRounded({ x, y, size, rotation: -Math.PI / 2 });\n      return;\n    }\n\n    if (!rightNeighbor && !bottomNeighbor) {\n      this._basicCornerRounded({ x, y, size, rotation: Math.PI / 2 });\n      return;\n    }\n\n    this._basicSquare({ x, y, size, rotation: 0 });\n  }\n\n  _drawClassyRounded({ x, y, size, getNeighbor }: DrawArgs): void {\n    const leftNeighbor = getNeighbor ? +getNeighbor(-1, 0) : 0;\n    const rightNeighbor = getNeighbor ? +getNeighbor(1, 0) : 0;\n    const topNeighbor = getNeighbor ? +getNeighbor(0, -1) : 0;\n    const bottomNeighbor = getNeighbor ? +getNeighbor(0, 1) : 0;\n\n    const neighborsCount = leftNeighbor + rightNeighbor + topNeighbor + bottomNeighbor;\n\n    if (neighborsCount === 0) {\n      this._basicCornersRounded({ x, y, size, rotation: Math.PI / 2 });\n      return;\n    }\n\n    if (!leftNeighbor && !topNeighbor) {\n      this._basicCornerExtraRounded({ x, y, size, rotation: -Math.PI / 2 });\n      return;\n    }\n\n    if (!rightNeighbor && !bottomNeighbor) {\n      this._basicCornerExtraRounded({ x, y, size, rotation: Math.PI / 2 });\n      return;\n    }\n\n    this._basicSquare({ x, y, size, rotation: 0 });\n  }\n}\n", "import { DotTypes } from \"../types\";\n\nexport default {\n  dots: \"dots\",\n  rounded: \"rounded\",\n  classy: \"classy\",\n  classyRounded: \"classy-rounded\",\n  square: \"square\",\n  extraRounded: \"extra-rounded\"\n} as DotTypes;\n", "import { CornerSquareTypes } from \"../types\";\n\nexport default {\n  dot: \"dot\",\n  square: \"square\",\n  extraRounded: \"extra-rounded\"\n} as CornerSquareTypes;\n", "import cornerSquareTypes from \"../../constants/cornerSquareTypes\";\nimport { CornerSquareType, DrawArgs, BasicFigureDrawArgs, RotateFigureArgs, Window } from \"../../types\";\n\nexport const availableCornerSquareTypes = Object.values(cornerSquareTypes);\n\nexport default class QRCornerSquare {\n  _element?: SVGElement;\n  _svg: SVGElement;\n  _type: CornerSquareType;\n  _window: Window;\n\n  constructor({ svg, type, window }: { svg: SVGElement; type: CornerSquareType; window: Window }) {\n    this._svg = svg;\n    this._type = type;\n    this._window = window;\n  }\n\n  draw(x: number, y: number, size: number, rotation: number): void {\n    const type = this._type;\n    let drawFunction;\n\n    switch (type) {\n      case cornerSquareTypes.square:\n        drawFunction = this._drawSquare;\n        break;\n      case cornerSquareTypes.extraRounded:\n        drawFunction = this._drawExtraRounded;\n        break;\n      case cornerSquareTypes.dot:\n      default:\n        drawFunction = this._drawDot;\n    }\n\n    drawFunction.call(this, { x, y, size, rotation });\n  }\n\n  _rotateFigure({ x, y, size, rotation = 0, draw }: RotateFigureArgs): void {\n    const cx = x + size / 2;\n    const cy = y + size / 2;\n\n    draw();\n    this._element?.setAttribute(\"transform\", `rotate(${(180 * rotation) / Math.PI},${cx},${cy})`);\n  }\n\n  _basicDot(args: BasicFigureDrawArgs): void {\n    const { size, x, y } = args;\n    const dotSize = size / 7;\n\n    this._rotateFigure({\n      ...args,\n      draw: () => {\n        this._element = this._window.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n        this._element.setAttribute(\"clip-rule\", \"evenodd\");\n        this._element.setAttribute(\n          \"d\",\n          `M ${x + size / 2} ${y}` + // M cx, y //  Move to top of ring\n            `a ${size / 2} ${size / 2} 0 1 0 0.1 0` + // a outerRadius, outerRadius, 0, 1, 0, 1, 0 // Draw outer arc, but don't close it\n            `z` + // Z // Close the outer shape\n            `m 0 ${dotSize}` + // m -1 outerRadius-innerRadius // Move to top point of inner radius\n            `a ${size / 2 - dotSize} ${size / 2 - dotSize} 0 1 1 -0.1 0` + // a innerRadius, innerRadius, 0, 1, 1, -1, 0 // Draw inner arc, but don't close it\n            `Z` // Z // Close the inner ring. Actually will still work without, but inner ring will have one unit missing in stroke\n        );\n      }\n    });\n  }\n\n  _basicSquare(args: BasicFigureDrawArgs): void {\n    const { size, x, y } = args;\n    const dotSize = size / 7;\n\n    this._rotateFigure({\n      ...args,\n      draw: () => {\n        this._element = this._window.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n        this._element.setAttribute(\"clip-rule\", \"evenodd\");\n        this._element.setAttribute(\n          \"d\",\n          `M ${x} ${y}` +\n            `v ${size}` +\n            `h ${size}` +\n            `v ${-size}` +\n            `z` +\n            `M ${x + dotSize} ${y + dotSize}` +\n            `h ${size - 2 * dotSize}` +\n            `v ${size - 2 * dotSize}` +\n            `h ${-size + 2 * dotSize}` +\n            `z`\n        );\n      }\n    });\n  }\n\n  _basicExtraRounded(args: BasicFigureDrawArgs): void {\n    const { size, x, y } = args;\n    const dotSize = size / 7;\n\n    this._rotateFigure({\n      ...args,\n      draw: () => {\n        this._element = this._window.document.createElementNS(\"http://www.w3.org/2000/svg\", \"path\");\n        this._element.setAttribute(\"clip-rule\", \"evenodd\");\n        this._element.setAttribute(\n          \"d\",\n          `M ${x} ${y + 2.5 * dotSize}` +\n            `v ${2 * dotSize}` +\n            `a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${dotSize * 2.5} ${dotSize * 2.5}` +\n            `h ${2 * dotSize}` +\n            `a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${dotSize * 2.5} ${-dotSize * 2.5}` +\n            `v ${-2 * dotSize}` +\n            `a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${-dotSize * 2.5} ${-dotSize * 2.5}` +\n            `h ${-2 * dotSize}` +\n            `a ${2.5 * dotSize} ${2.5 * dotSize}, 0, 0, 0, ${-dotSize * 2.5} ${dotSize * 2.5}` +\n            `M ${x + 2.5 * dotSize} ${y + dotSize}` +\n            `h ${2 * dotSize}` +\n            `a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${dotSize * 1.5} ${dotSize * 1.5}` +\n            `v ${2 * dotSize}` +\n            `a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${-dotSize * 1.5} ${dotSize * 1.5}` +\n            `h ${-2 * dotSize}` +\n            `a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${-dotSize * 1.5} ${-dotSize * 1.5}` +\n            `v ${-2 * dotSize}` +\n            `a ${1.5 * dotSize} ${1.5 * dotSize}, 0, 0, 1, ${dotSize * 1.5} ${-dotSize * 1.5}`\n        );\n      }\n    });\n  }\n\n  _drawDot({ x, y, size, rotation }: DrawArgs): void {\n    this._basicDot({ x, y, size, rotation });\n  }\n\n  _drawSquare({ x, y, size, rotation }: DrawArgs): void {\n    this._basicSquare({ x, y, size, rotation });\n  }\n\n  _drawExtraRounded({ x, y, size, rotation }: DrawArgs): void {\n    this._basicExtraRounded({ x, y, size, rotation });\n  }\n}\n", "import { CornerDotTypes } from \"../types\";\n\nexport default {\n  dot: \"dot\",\n  square: \"square\"\n} as CornerDotTypes;", "import cornerDotTypes from \"../../constants/cornerDotTypes\";\nimport { CornerDotType, RotateFigureArgs, BasicFigureDrawArgs, DrawArgs, Window } from \"../../types\";\n\nexport const availableCornerDotTypes = Object.values(cornerDotTypes);\n\nexport default class QRCornerDot {\n  _element?: SVGElement;\n  _svg: SVGElement;\n  _type: CornerDotType;\n  _window: Window;\n\n  constructor({ svg, type, window }: { svg: SVGElement; type: CornerDotType; window: Window }) {\n    this._svg = svg;\n    this._type = type;\n    this._window = window;\n  }\n\n  draw(x: number, y: number, size: number, rotation: number): void {\n    const type = this._type;\n    let drawFunction;\n\n    switch (type) {\n      case cornerDotTypes.square:\n        drawFunction = this._drawSquare;\n        break;\n      case cornerDotTypes.dot:\n      default:\n        drawFunction = this._drawDot;\n    }\n\n    drawFunction.call(this, { x, y, size, rotation });\n  }\n\n  _rotateFigure({ x, y, size, rotation = 0, draw }: RotateFigureArgs): void {\n    const cx = x + size / 2;\n    const cy = y + size / 2;\n\n    draw();\n    this._element?.setAttribute(\"transform\", `rotate(${(180 * rotation) / Math.PI},${cx},${cy})`);\n  }\n\n  _basicDot(args: BasicFigureDrawArgs): void {\n    const { size, x, y } = args;\n\n    this._rotateFigure({\n      ...args,\n      draw: () => {\n        this._element = this._window.document.createElementNS(\"http://www.w3.org/2000/svg\", \"circle\");\n        this._element.setAttribute(\"cx\", String(x + size / 2));\n        this._element.setAttribute(\"cy\", String(y + size / 2));\n        this._element.setAttribute(\"r\", String(size / 2));\n      }\n    });\n  }\n\n  _basicSquare(args: BasicFigureDrawArgs): void {\n    const { size, x, y } = args;\n\n    this._rotateFigure({\n      ...args,\n      draw: () => {\n        this._element = this._window.document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n        this._element.setAttribute(\"x\", String(x));\n        this._element.setAttribute(\"y\", String(y));\n        this._element.setAttribute(\"width\", String(size));\n        this._element.setAttribute(\"height\", String(size));\n      }\n    });\n  }\n\n  _drawDot({ x, y, size, rotation }: DrawArgs): void {\n    this._basicDot({ x, y, size, rotation });\n  }\n\n  _drawSquare({ x, y, size, rotation }: DrawArgs): void {\n    this._basicSquare({ x, y, size, rotation });\n  }\n}\n", "import { GradientTypes } from \"../types\";\n\nexport default {\n  radial: \"radial\",\n  linear: \"linear\"\n} as GradientTypes;\n", "import { ShapeTypes } from \"../types\";\n\nexport default {\n  square: \"square\",\n  circle: \"circle\"\n} as ShapeTypes;\n", "import calculateImageSize from \"../tools/calculateImageSize\";\nimport toDataUrl from \"../tools/toDataUrl\";\nimport errorCorrectionPercents from \"../constants/errorCorrectionPercents\";\nimport QRDot from \"../figures/dot/QRDot\";\nimport QRCornerSquare, { availableCornerSquareTypes } from \"../figures/cornerSquare/QRCornerSquare\";\nimport QRCornerDot, { availableCornerDotTypes } from \"../figures/cornerDot/QRCornerDot\";\nimport { RequiredOptions } from \"./QROptions\";\nimport gradientTypes from \"../constants/gradientTypes\";\nimport shapeTypes from \"../constants/shapeTypes\";\nimport { DotType, QRCode, FilterFunction, Gradient, Window } from \"../types\";\nimport { Image } from \"canvas\";\n\nconst squareMask = [\n  [1, 1, 1, 1, 1, 1, 1],\n  [1, 0, 0, 0, 0, 0, 1],\n  [1, 0, 0, 0, 0, 0, 1],\n  [1, 0, 0, 0, 0, 0, 1],\n  [1, 0, 0, 0, 0, 0, 1],\n  [1, 0, 0, 0, 0, 0, 1],\n  [1, 1, 1, 1, 1, 1, 1]\n];\n\nconst dotMask = [\n  [0, 0, 0, 0, 0, 0, 0],\n  [0, 0, 0, 0, 0, 0, 0],\n  [0, 0, 1, 1, 1, 0, 0],\n  [0, 0, 1, 1, 1, 0, 0],\n  [0, 0, 1, 1, 1, 0, 0],\n  [0, 0, 0, 0, 0, 0, 0],\n  [0, 0, 0, 0, 0, 0, 0]\n];\n\nexport default class QRSVG {\n  _window: Window;\n  _element: SVGElement;\n  _defs: SVGElement;\n  _backgroundClipPath?: SVGElement;\n  _dotsClipPath?: SVGElement;\n  _cornersSquareClipPath?: SVGElement;\n  _cornersDotClipPath?: SVGElement;\n  _options: RequiredOptions;\n  _qr?: QRCode;\n  _image?: HTMLImageElement | Image;\n  _imageUri?: string;\n  _instanceId: number;\n\n  static instanceCount = 0;\n\n  //TODO don't pass all options to this class\n  constructor(options: RequiredOptions, window: Window) {\n    this._window = window;\n    this._element = this._window.document.createElementNS(\"http://www.w3.org/2000/svg\", \"svg\");\n    this._element.setAttribute(\"width\", String(options.width));\n    this._element.setAttribute(\"height\", String(options.height));\n    this._element.setAttribute(\"xmlns:xlink\", \"http://www.w3.org/1999/xlink\");\n    if (!options.dotsOptions.roundSize) {\n      this._element.setAttribute(\"shape-rendering\", \"crispEdges\");\n    }\n    this._element.setAttribute(\"viewBox\", `0 0 ${options.width} ${options.height}`);\n    this._defs = this._window.document.createElementNS(\"http://www.w3.org/2000/svg\", \"defs\");\n    this._element.appendChild(this._defs);\n    this._imageUri = options.image;\n    this._instanceId = QRSVG.instanceCount++;\n    this._options = options;\n  }\n\n  get width(): number {\n    return this._options.width;\n  }\n\n  get height(): number {\n    return this._options.height;\n  }\n\n  getElement(): SVGElement {\n    return this._element;\n  }\n\n  async drawQR(qr: QRCode): Promise<void> {\n    const count = qr.getModuleCount();\n    const minSize = Math.min(this._options.width, this._options.height) - this._options.margin * 2;\n    const realQRSize = this._options.shape === shapeTypes.circle ? minSize / Math.sqrt(2) : minSize;\n    const dotSize = this._roundSize(realQRSize / count);\n    let drawImageSize = {\n      hideXDots: 0,\n      hideYDots: 0,\n      width: 0,\n      height: 0\n    };\n\n    this._qr = qr;\n\n    if (this._options.image) {\n      //We need it to get image size\n      await this.loadImage();\n      if (!this._image) return;\n      const { imageOptions, qrOptions } = this._options;\n      const coverLevel = imageOptions.imageSize * errorCorrectionPercents[qrOptions.errorCorrectionLevel];\n      const maxHiddenDots = Math.floor(coverLevel * count * count);\n\n      drawImageSize = calculateImageSize({\n        originalWidth: this._image.width,\n        originalHeight: this._image.height,\n        maxHiddenDots,\n        maxHiddenAxisDots: count - 14,\n        dotSize\n      });\n    }\n\n    this.drawBackground();\n    this.drawDots((row: number, col: number): boolean => {\n      if (this._options.imageOptions.hideBackgroundDots) {\n        if (\n          row >= (count - drawImageSize.hideYDots) / 2 &&\n          row < (count + drawImageSize.hideYDots) / 2 &&\n          col >= (count - drawImageSize.hideXDots) / 2 &&\n          col < (count + drawImageSize.hideXDots) / 2\n        ) {\n          return false;\n        }\n      }\n\n      if (squareMask[row]?.[col] || squareMask[row - count + 7]?.[col] || squareMask[row]?.[col - count + 7]) {\n        return false;\n      }\n\n      if (dotMask[row]?.[col] || dotMask[row - count + 7]?.[col] || dotMask[row]?.[col - count + 7]) {\n        return false;\n      }\n\n      return true;\n    });\n    this.drawCorners();\n\n    if (this._options.image) {\n      await this.drawImage({ width: drawImageSize.width, height: drawImageSize.height, count, dotSize });\n    }\n  }\n\n  drawBackground(): void {\n    const element = this._element;\n    const options = this._options;\n\n    if (element) {\n      const gradientOptions = options.backgroundOptions?.gradient;\n      const color = options.backgroundOptions?.color;\n      let height = options.height;\n      let width = options.width;\n\n      if (gradientOptions || color) {\n        const element = this._window.document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n        this._backgroundClipPath = this._window.document.createElementNS(\"http://www.w3.org/2000/svg\", \"clipPath\");\n        this._backgroundClipPath.setAttribute(\"id\", `clip-path-background-color-${this._instanceId}`);\n        this._defs.appendChild(this._backgroundClipPath);\n\n        if (options.backgroundOptions?.round) {\n          height = width = Math.min(options.width, options.height);\n          element.setAttribute(\"rx\", String((height / 2) * options.backgroundOptions.round));\n        }\n\n        element.setAttribute(\"x\", String(this._roundSize((options.width - width) / 2)));\n        element.setAttribute(\"y\", String(this._roundSize((options.height - height) / 2)));\n        element.setAttribute(\"width\", String(width));\n        element.setAttribute(\"height\", String(height));\n\n        this._backgroundClipPath.appendChild(element);\n\n        this._createColor({\n          options: gradientOptions,\n          color: color,\n          additionalRotation: 0,\n          x: 0,\n          y: 0,\n          height: options.height,\n          width: options.width,\n          name: `background-color-${this._instanceId}`\n        });\n      }\n    }\n  }\n\n  drawDots(filter?: FilterFunction): void {\n    if (!this._qr) {\n      throw \"QR code is not defined\";\n    }\n\n    const options = this._options;\n    const count = this._qr.getModuleCount();\n\n    if (count > options.width || count > options.height) {\n      throw \"The canvas is too small.\";\n    }\n\n    const minSize = Math.min(options.width, options.height) - options.margin * 2;\n    const realQRSize = options.shape === shapeTypes.circle ? minSize / Math.sqrt(2) : minSize;\n    const dotSize = this._roundSize(realQRSize / count);\n    const xBeginning = this._roundSize((options.width - count * dotSize) / 2);\n    const yBeginning = this._roundSize((options.height - count * dotSize) / 2);\n    const dot = new QRDot({\n      svg: this._element,\n      type: options.dotsOptions.type,\n      window: this._window\n    });\n\n    this._dotsClipPath = this._window.document.createElementNS(\"http://www.w3.org/2000/svg\", \"clipPath\");\n    this._dotsClipPath.setAttribute(\"id\", `clip-path-dot-color-${this._instanceId}`);\n    this._defs.appendChild(this._dotsClipPath);\n\n    this._createColor({\n      options: options.dotsOptions?.gradient,\n      color: options.dotsOptions.color,\n      additionalRotation: 0,\n      x: 0,\n      y: 0,\n      height: options.height,\n      width: options.width,\n      name: `dot-color-${this._instanceId}`\n    });\n\n    for (let row = 0; row < count; row++) {\n      for (let col = 0; col < count; col++) {\n        if (filter && !filter(row, col)) {\n          continue;\n        }\n        if (!this._qr?.isDark(row, col)) {\n          continue;\n        }\n\n        dot.draw(\n          xBeginning + col * dotSize,\n          yBeginning + row * dotSize,\n          dotSize,\n          (xOffset: number, yOffset: number): boolean => {\n            if (col + xOffset < 0 || row + yOffset < 0 || col + xOffset >= count || row + yOffset >= count) return false;\n            if (filter && !filter(row + yOffset, col + xOffset)) return false;\n            return !!this._qr && this._qr.isDark(row + yOffset, col + xOffset);\n          }\n        );\n\n        if (dot._element && this._dotsClipPath) {\n          this._dotsClipPath.appendChild(dot._element);\n        }\n      }\n    }\n\n    if (options.shape === shapeTypes.circle) {\n      const additionalDots = this._roundSize((minSize / dotSize - count) / 2);\n      const fakeCount = count + additionalDots * 2;\n      const xFakeBeginning = xBeginning - additionalDots * dotSize;\n      const yFakeBeginning = yBeginning - additionalDots * dotSize;\n      const fakeMatrix: number[][] = [];\n      const center = this._roundSize(fakeCount / 2);\n\n      for (let row = 0; row < fakeCount; row++) {\n        fakeMatrix[row] = [];\n        for (let col = 0; col < fakeCount; col++) {\n          if (\n            row >= additionalDots - 1 &&\n            row <= fakeCount - additionalDots &&\n            col >= additionalDots - 1 &&\n            col <= fakeCount - additionalDots\n          ) {\n            fakeMatrix[row][col] = 0;\n            continue;\n          }\n\n          if (Math.sqrt((row - center) * (row - center) + (col - center) * (col - center)) > center) {\n            fakeMatrix[row][col] = 0;\n            continue;\n          }\n\n          //Get random dots from QR code to show it outside of QR code\n          fakeMatrix[row][col] = this._qr.isDark(\n            col - 2 * additionalDots < 0 ? col : col >= count ? col - 2 * additionalDots : col - additionalDots,\n            row - 2 * additionalDots < 0 ? row : row >= count ? row - 2 * additionalDots : row - additionalDots\n          )\n            ? 1\n            : 0;\n        }\n      }\n\n      for (let row = 0; row < fakeCount; row++) {\n        for (let col = 0; col < fakeCount; col++) {\n          if (!fakeMatrix[row][col]) continue;\n\n          dot.draw(\n            xFakeBeginning + col * dotSize,\n            yFakeBeginning + row * dotSize,\n            dotSize,\n            (xOffset: number, yOffset: number): boolean => {\n              return !!fakeMatrix[row + yOffset]?.[col + xOffset];\n            }\n          );\n          if (dot._element && this._dotsClipPath) {\n            this._dotsClipPath.appendChild(dot._element);\n          }\n        }\n      }\n    }\n  }\n\n  drawCorners(): void {\n    if (!this._qr) {\n      throw \"QR code is not defined\";\n    }\n\n    const element = this._element;\n    const options = this._options;\n\n    if (!element) {\n      throw \"Element code is not defined\";\n    }\n\n    const count = this._qr.getModuleCount();\n    const minSize = Math.min(options.width, options.height) - options.margin * 2;\n    const realQRSize = options.shape === shapeTypes.circle ? minSize / Math.sqrt(2) : minSize;\n    const dotSize = this._roundSize(realQRSize / count);\n    const cornersSquareSize = dotSize * 7;\n    const cornersDotSize = dotSize * 3;\n    const xBeginning = this._roundSize((options.width - count * dotSize) / 2);\n    const yBeginning = this._roundSize((options.height - count * dotSize) / 2);\n\n    [\n      [0, 0, 0],\n      [1, 0, Math.PI / 2],\n      [0, 1, -Math.PI / 2]\n    ].forEach(([column, row, rotation]) => {\n      const x = xBeginning + column * dotSize * (count - 7);\n      const y = yBeginning + row * dotSize * (count - 7);\n      let cornersSquareClipPath = this._dotsClipPath;\n      let cornersDotClipPath = this._dotsClipPath;\n\n      if (options.cornersSquareOptions?.gradient || options.cornersSquareOptions?.color) {\n        cornersSquareClipPath = this._window.document.createElementNS(\"http://www.w3.org/2000/svg\", \"clipPath\");\n        cornersSquareClipPath.setAttribute(\"id\", `clip-path-corners-square-color-${column}-${row}-${this._instanceId}`);\n        this._defs.appendChild(cornersSquareClipPath);\n        this._cornersSquareClipPath = this._cornersDotClipPath = cornersDotClipPath = cornersSquareClipPath;\n\n        this._createColor({\n          options: options.cornersSquareOptions?.gradient,\n          color: options.cornersSquareOptions?.color,\n          additionalRotation: rotation,\n          x,\n          y,\n          height: cornersSquareSize,\n          width: cornersSquareSize,\n          name: `corners-square-color-${column}-${row}-${this._instanceId}`\n        });\n      }\n\n      if (options.cornersSquareOptions?.type && availableCornerSquareTypes.includes(options.cornersSquareOptions.type)) {\n        const cornersSquare = new QRCornerSquare({\n          svg: this._element,\n          type: options.cornersSquareOptions.type,\n          window: this._window\n        });\n\n        cornersSquare.draw(x, y, cornersSquareSize, rotation);\n\n        if (cornersSquare._element && cornersSquareClipPath) {\n          cornersSquareClipPath.appendChild(cornersSquare._element);\n        }\n      } else {\n        const dot = new QRDot({\n          svg: this._element,\n          type: (options.cornersSquareOptions?.type as DotType) || options.dotsOptions.type,\n          window: this._window\n        });\n\n        for (let row = 0; row < squareMask.length; row++) {\n          for (let col = 0; col < squareMask[row].length; col++) {\n            if (!squareMask[row]?.[col]) {\n              continue;\n            }\n\n            dot.draw(\n              x + col * dotSize,\n              y + row * dotSize,\n              dotSize,\n              (xOffset: number, yOffset: number): boolean => !!squareMask[row + yOffset]?.[col + xOffset]\n            );\n\n            if (dot._element && cornersSquareClipPath) {\n              cornersSquareClipPath.appendChild(dot._element);\n            }\n          }\n        }\n      }\n\n      if (options.cornersDotOptions?.gradient || options.cornersDotOptions?.color) {\n        cornersDotClipPath = this._window.document.createElementNS(\"http://www.w3.org/2000/svg\", \"clipPath\");\n        cornersDotClipPath.setAttribute(\"id\", `clip-path-corners-dot-color-${column}-${row}-${this._instanceId}`);\n        this._defs.appendChild(cornersDotClipPath);\n        this._cornersDotClipPath = cornersDotClipPath;\n\n        this._createColor({\n          options: options.cornersDotOptions?.gradient,\n          color: options.cornersDotOptions?.color,\n          additionalRotation: rotation,\n          x: x + dotSize * 2,\n          y: y + dotSize * 2,\n          height: cornersDotSize,\n          width: cornersDotSize,\n          name: `corners-dot-color-${column}-${row}-${this._instanceId}`\n        });\n      }\n\n      if (options.cornersDotOptions?.type && availableCornerDotTypes.includes(options.cornersDotOptions.type)) {\n        const cornersDot = new QRCornerDot({\n          svg: this._element,\n          type: options.cornersDotOptions.type,\n          window: this._window\n        });\n\n        cornersDot.draw(x + dotSize * 2, y + dotSize * 2, cornersDotSize, rotation);\n\n        if (cornersDot._element && cornersDotClipPath) {\n          cornersDotClipPath.appendChild(cornersDot._element);\n        }\n      } else {\n        const dot = new QRDot({\n          svg: this._element,\n          type: (options.cornersDotOptions?.type as DotType) || options.dotsOptions.type,\n          window: this._window\n        });\n\n        for (let row = 0; row < dotMask.length; row++) {\n          for (let col = 0; col < dotMask[row].length; col++) {\n            if (!dotMask[row]?.[col]) {\n              continue;\n            }\n\n            dot.draw(\n              x + col * dotSize,\n              y + row * dotSize,\n              dotSize,\n              (xOffset: number, yOffset: number): boolean => !!dotMask[row + yOffset]?.[col + xOffset]\n            );\n\n            if (dot._element && cornersDotClipPath) {\n              cornersDotClipPath.appendChild(dot._element);\n            }\n          }\n        }\n      }\n    });\n  }\n\n  loadImage(): Promise<void> {\n    return new Promise((resolve, reject) => {\n      const options = this._options;\n\n      if (!options.image) {\n        return reject(\"Image is not defined\");\n      }\n\n      if (options.nodeCanvas?.loadImage) {\n        options.nodeCanvas\n          .loadImage(options.image)\n          .then((image: Image) => {\n            this._image = image;\n            if (this._options.imageOptions.saveAsBlob) {\n              const canvas = options.nodeCanvas?.createCanvas( this._image.width,  this._image.height);\n              canvas?.getContext('2d')?.drawImage(image, 0, 0);\n              this._imageUri = canvas?.toDataURL();\n            }\n            resolve();\n          })\n          .catch(reject);\n      } else {\n        const image = new this._window.Image();\n\n        if (typeof options.imageOptions.crossOrigin === \"string\") {\n          image.crossOrigin = options.imageOptions.crossOrigin;\n        }\n\n        this._image = image;\n        image.onload = async () => {\n          if (this._options.imageOptions.saveAsBlob) {\n            this._imageUri = await toDataUrl(options.image || \"\", this._window);\n          }\n          resolve();\n        };\n        image.src = options.image;\n      }\n    });\n  }\n\n  async drawImage({\n    width,\n    height,\n    count,\n    dotSize\n  }: {\n    width: number;\n    height: number;\n    count: number;\n    dotSize: number;\n  }): Promise<void> {\n    const options = this._options;\n    const xBeginning = this._roundSize((options.width - count * dotSize) / 2);\n    const yBeginning = this._roundSize((options.height - count * dotSize) / 2);\n    const dx = xBeginning + this._roundSize(options.imageOptions.margin + (count * dotSize - width) / 2);\n    const dy = yBeginning + this._roundSize(options.imageOptions.margin + (count * dotSize - height) / 2);\n    const dw = width - options.imageOptions.margin * 2;\n    const dh = height - options.imageOptions.margin * 2;\n\n    const image = this._window.document.createElementNS(\"http://www.w3.org/2000/svg\", \"image\");\n    image.setAttribute(\"href\", this._imageUri || \"\");\n    image.setAttribute(\"xlink:href\", this._imageUri || \"\");\n    image.setAttribute(\"x\", String(dx));\n    image.setAttribute(\"y\", String(dy));\n    image.setAttribute(\"width\", `${dw}px`);\n    image.setAttribute(\"height\", `${dh}px`);\n\n    this._element.appendChild(image);\n  }\n\n  _createColor({\n    options,\n    color,\n    additionalRotation,\n    x,\n    y,\n    height,\n    width,\n    name\n  }: {\n    options?: Gradient;\n    color?: string;\n    additionalRotation: number;\n    x: number;\n    y: number;\n    height: number;\n    width: number;\n    name: string;\n  }): void {\n    const size = width > height ? width : height;\n    const rect = this._window.document.createElementNS(\"http://www.w3.org/2000/svg\", \"rect\");\n    rect.setAttribute(\"x\", String(x));\n    rect.setAttribute(\"y\", String(y));\n    rect.setAttribute(\"height\", String(height));\n    rect.setAttribute(\"width\", String(width));\n    rect.setAttribute(\"clip-path\", `url('#clip-path-${name}')`);\n\n    if (options) {\n      let gradient: SVGElement;\n      if (options.type === gradientTypes.radial) {\n        gradient = this._window.document.createElementNS(\"http://www.w3.org/2000/svg\", \"radialGradient\");\n        gradient.setAttribute(\"id\", name);\n        gradient.setAttribute(\"gradientUnits\", \"userSpaceOnUse\");\n        gradient.setAttribute(\"fx\", String(x + width / 2));\n        gradient.setAttribute(\"fy\", String(y + height / 2));\n        gradient.setAttribute(\"cx\", String(x + width / 2));\n        gradient.setAttribute(\"cy\", String(y + height / 2));\n        gradient.setAttribute(\"r\", String(size / 2));\n      } else {\n        const rotation = ((options.rotation || 0) + additionalRotation) % (2 * Math.PI);\n        const positiveRotation = (rotation + 2 * Math.PI) % (2 * Math.PI);\n        let x0 = x + width / 2;\n        let y0 = y + height / 2;\n        let x1 = x + width / 2;\n        let y1 = y + height / 2;\n\n        if (\n          (positiveRotation >= 0 && positiveRotation <= 0.25 * Math.PI) ||\n          (positiveRotation > 1.75 * Math.PI && positiveRotation <= 2 * Math.PI)\n        ) {\n          x0 = x0 - width / 2;\n          y0 = y0 - (height / 2) * Math.tan(rotation);\n          x1 = x1 + width / 2;\n          y1 = y1 + (height / 2) * Math.tan(rotation);\n        } else if (positiveRotation > 0.25 * Math.PI && positiveRotation <= 0.75 * Math.PI) {\n          y0 = y0 - height / 2;\n          x0 = x0 - width / 2 / Math.tan(rotation);\n          y1 = y1 + height / 2;\n          x1 = x1 + width / 2 / Math.tan(rotation);\n        } else if (positiveRotation > 0.75 * Math.PI && positiveRotation <= 1.25 * Math.PI) {\n          x0 = x0 + width / 2;\n          y0 = y0 + (height / 2) * Math.tan(rotation);\n          x1 = x1 - width / 2;\n          y1 = y1 - (height / 2) * Math.tan(rotation);\n        } else if (positiveRotation > 1.25 * Math.PI && positiveRotation <= 1.75 * Math.PI) {\n          y0 = y0 + height / 2;\n          x0 = x0 + width / 2 / Math.tan(rotation);\n          y1 = y1 - height / 2;\n          x1 = x1 - width / 2 / Math.tan(rotation);\n        }\n\n        gradient = this._window.document.createElementNS(\"http://www.w3.org/2000/svg\", \"linearGradient\");\n        gradient.setAttribute(\"id\", name);\n        gradient.setAttribute(\"gradientUnits\", \"userSpaceOnUse\");\n        gradient.setAttribute(\"x1\", String(Math.round(x0)));\n        gradient.setAttribute(\"y1\", String(Math.round(y0)));\n        gradient.setAttribute(\"x2\", String(Math.round(x1)));\n        gradient.setAttribute(\"y2\", String(Math.round(y1)));\n      }\n\n      options.colorStops.forEach(({ offset, color }: { offset: number; color: string }) => {\n        const stop = this._window.document.createElementNS(\"http://www.w3.org/2000/svg\", \"stop\");\n        stop.setAttribute(\"offset\", `${100 * offset}%`);\n        stop.setAttribute(\"stop-color\", color);\n        gradient.appendChild(stop);\n      });\n\n      rect.setAttribute(\"fill\", `url('#${name}')`);\n      this._defs.appendChild(gradient);\n    } else if (color) {\n      rect.setAttribute(\"fill\", color);\n    }\n\n    this._element.appendChild(rect);\n  }\n\n  _roundSize = (value: number) => {\n    if (this._options.dotsOptions.roundSize) {\n      return Math.floor(value);\n    }\n    return value;\n  }\n}\n", "interface ImageSizeOptions {\n  originalHeight: number;\n  originalWidth: number;\n  maxHiddenDots: number;\n  maxHiddenAxisDots?: number;\n  dotSize: number;\n}\n\ninterface ImageSizeResult {\n  height: number;\n  width: number;\n  hideYDots: number;\n  hideXDots: number;\n}\n\nexport default function calculateImageSize({\n  originalHeight,\n  originalWidth,\n  maxHiddenDots,\n  maxHiddenAxisDots,\n  dotSize\n}: ImageSizeOptions): ImageSizeResult {\n  const hideDots = { x: 0, y: 0 };\n  const imageSize = { x: 0, y: 0 };\n\n  if (originalHeight <= 0 || originalWidth <= 0 || maxHiddenDots <= 0 || dotSize <= 0) {\n    return {\n      height: 0,\n      width: 0,\n      hideYDots: 0,\n      hideXDots: 0\n    };\n  }\n\n  const k = originalHeight / originalWidth;\n\n  //Getting the maximum possible axis hidden dots\n  hideDots.x = Math.floor(Math.sqrt(maxHiddenDots / k));\n  //The count of hidden dot's can't be less than 1\n  if (hideDots.x <= 0) hideDots.x = 1;\n  //Check the limit of the maximum allowed axis hidden dots\n  if (maxHiddenAxisDots && maxHiddenAxisDots < hideDots.x) hideDots.x = maxHiddenAxisDots;\n  //The count of dots should be odd\n  if (hideDots.x % 2 === 0) hideDots.x--;\n  imageSize.x = hideDots.x * dotSize;\n  //Calculate opposite axis hidden dots based on axis value.\n  //The value will be odd.\n  //We use ceil to prevent dots covering by the image.\n  hideDots.y = 1 + 2 * Math.ceil((hideDots.x * k - 1) / 2);\n  imageSize.y = Math.round(imageSize.x * k);\n  //If the result dots count is bigger than max - then decrease size and calculate again\n  if (hideDots.y * hideDots.x > maxHiddenDots || (maxHiddenAxisDots && maxHiddenAxisDots < hideDots.y)) {\n    if (maxHiddenAxisDots && maxHiddenAxisDots < hideDots.y) {\n      hideDots.y = maxHiddenAxisDots;\n      if (hideDots.y % 2 === 0) hideDots.x--;\n    } else {\n      hideDots.y -= 2;\n    }\n    imageSize.y = hideDots.y * dotSize;\n    hideDots.x = 1 + 2 * Math.ceil((hideDots.y / k - 1) / 2);\n    imageSize.x = Math.round(imageSize.y / k);\n  }\n\n  return {\n    height: imageSize.y,\n    width: imageSize.x,\n    hideYDots: hideDots.y,\n    hideXDots: hideDots.x\n  };\n}\n", "import { Window } from \"../types\";\n\nexport default async function toDataURL(url: string, window: Window): Promise<string> {\n  return new Promise((resolve) => {\n    const xhr = new window.XMLHttpRequest();\n    xhr.onload = function () {\n      const reader = new window.FileReader();\n      reader.onloadend = function () {\n        resolve(reader.result as string);\n      };\n      reader.readAsDataURL(xhr.response);\n    };\n    xhr.open(\"GET\", url);\n    xhr.responseType = \"blob\";\n    xhr.send();\n  });\n}\n", "import { DrawTypes } from \"../types\";\n\nexport default {\n  canvas: \"canvas\",\n  svg: \"svg\"\n} as DrawTypes;\n", "import { TypeNumber } from \"../types\";\n\ninterface TypesMap {\n  [key: number]: TypeNumber;\n}\n\nconst qrTypes: TypesMap = {};\n\nfor (let type = 0; type <= 40; type++) {\n  qrTypes[type] = type as TypeNumber;\n}\n\n// 0 types is autodetect\n\n// types = {\n//     0: 0,\n//     1: 1,\n//     ...\n//     40: 40\n// }\n\nexport default qrTypes;\n", "import qrTypes from \"../constants/qrTypes\";\nimport drawTypes from \"../constants/drawTypes\";\nimport shapeTypes from \"../constants/shapeTypes\";\nimport errorCorrectionLevels from \"../constants/errorCorrectionLevels\";\nimport { ShapeType, DotType, Options, TypeNumber, ErrorCorrectionLevel, Mode, DrawType, Gradient } from \"../types\";\n\nexport interface RequiredOptions extends Options {\n  type: DrawType;\n  shape: ShapeType;\n  width: number;\n  height: number;\n  margin: number;\n  data: string;\n  qrOptions: {\n    typeNumber: TypeNumber;\n    mode?: Mode;\n    errorCorrectionLevel: ErrorCorrectionLevel;\n  };\n  imageOptions: {\n    saveAsBlob: boolean;\n    hideBackgroundDots: boolean;\n    imageSize: number;\n    crossOrigin?: string;\n    margin: number;\n  };\n  dotsOptions: {\n    type: DotType;\n    color: string;\n    gradient?: Gradient;\n    roundSize?: boolean;\n  };\n  backgroundOptions: {\n    round: number;\n    color: string;\n    gradient?: Gradient;\n  };\n}\n\nconst defaultOptions: RequiredOptions = {\n  type: drawTypes.canvas,\n  shape: shapeTypes.square,\n  width: 300,\n  height: 300,\n  data: \"\",\n  margin: 0,\n  qrOptions: {\n    typeNumber: qrTypes[0],\n    mode: undefined,\n    errorCorrectionLevel: errorCorrectionLevels.Q\n  },\n  imageOptions: {\n    saveAsBlob: true,\n    hideBackgroundDots: true,\n    imageSize: 0.4,\n    crossOrigin: undefined,\n    margin: 0\n  },\n  dotsOptions: {\n    type: \"square\",\n    color: \"#000\",\n    roundSize: true,\n  },\n  backgroundOptions: {\n    round: 0,\n    color: \"#fff\"\n  }\n};\n\nexport default defaultOptions;\n", "import { ErrorCorrectionLevel } from \"../types\";\n\ninterface ErrorCorrectionLevels {\n  [key: string]: ErrorCorrectionLevel;\n}\n\nexport default {\n  L: \"L\",\n  M: \"M\",\n  Q: \"Q\",\n  H: \"H\"\n} as ErrorCorrectionLevels;\n", "import { RequiredOptions } from \"../core/QROptions\";\nimport { Gradient } from \"../types\";\n\nfunction sanitizeGradient(gradient: Gradient): Gradient {\n  const newGradient = { ...gradient };\n\n  if (!newGradient.colorStops || !newGradient.colorStops.length) {\n    throw \"Field 'colorStops' is required in gradient\";\n  }\n\n  if (newGradient.rotation) {\n    newGradient.rotation = Number(newGradient.rotation);\n  } else {\n    newGradient.rotation = 0;\n  }\n\n  newGradient.colorStops = newGradient.colorStops.map((colorStop: { offset: number; color: string }) => ({\n    ...colorStop,\n    offset: Number(colorStop.offset)\n  }));\n\n  return newGradient;\n}\n\nexport default function sanitizeOptions(options: RequiredOptions): RequiredOptions {\n  const newOptions = { ...options };\n\n  newOptions.width = Number(newOptions.width);\n  newOptions.height = Number(newOptions.height);\n  newOptions.margin = Number(newOptions.margin);\n  newOptions.imageOptions = {\n    ...newOptions.imageOptions,\n    hideBackgroundDots: Boolean(newOptions.imageOptions.hideBackgroundDots),\n    imageSize: Number(newOptions.imageOptions.imageSize),\n    margin: Number(newOptions.imageOptions.margin)\n  };\n\n  if (newOptions.margin > Math.min(newOptions.width, newOptions.height)) {\n    newOptions.margin = Math.min(newOptions.width, newOptions.height);\n  }\n\n  newOptions.dotsOptions = {\n    ...newOptions.dotsOptions\n  };\n  if (newOptions.dotsOptions.gradient) {\n    newOptions.dotsOptions.gradient = sanitizeGradient(newOptions.dotsOptions.gradient);\n  }\n\n  if (newOptions.cornersSquareOptions) {\n    newOptions.cornersSquareOptions = {\n      ...newOptions.cornersSquareOptions\n    };\n    if (newOptions.cornersSquareOptions.gradient) {\n      newOptions.cornersSquareOptions.gradient = sanitizeGradient(newOptions.cornersSquareOptions.gradient);\n    }\n  }\n\n  if (newOptions.cornersDotOptions) {\n    newOptions.cornersDotOptions = {\n      ...newOptions.cornersDotOptions\n    };\n    if (newOptions.cornersDotOptions.gradient) {\n      newOptions.cornersDotOptions.gradient = sanitizeGradient(newOptions.cornersDotOptions.gradient);\n    }\n  }\n\n  if (newOptions.backgroundOptions) {\n    newOptions.backgroundOptions = {\n      ...newOptions.backgroundOptions\n    };\n    if (newOptions.backgroundOptions.gradient) {\n      newOptions.backgroundOptions.gradient = sanitizeGradient(newOptions.backgroundOptions.gradient);\n    }\n  }\n\n  return newOptions;\n}\n", "export default function getMimeType(extension: string) {\n  if (!extension) throw new Error('Extension must be defined');\n  if (extension[0] === \".\") {\n    extension = extension.substring(1);\n  }\n  const type = {\n    \"bmp\": \"image/bmp\",\n    \"gif\": \"image/gif\",\n    \"ico\": \"image/vnd.microsoft.icon\",\n    \"jpeg\": \"image/jpeg\",\n    \"jpg\": \"image/jpeg\",\n    \"png\": \"image/png\",\n    \"svg\": \"image/svg+xml\",\n    \"tif\": \"image/tiff\",\n    \"tiff\": \"image/tiff\",\n    \"webp\": \"image/webp\",\n    \"pdf\": \"application/pdf\",\n  }[extension.toLowerCase()]\n\n  if (!type) {\n    throw new Error(`Extension \"${extension}\" is not supported`);\n  }\n\n  return type;\n}", "import getMode from \"../tools/getMode\";\nimport mergeDeep from \"../tools/merge\";\nimport downloadURI from \"../tools/downloadURI\";\nimport QRSVG from \"./QRSVG\";\nimport drawTypes from \"../constants/drawTypes\";\n\nimport defaultOptions, { RequiredOptions } from \"./QROptions\";\nimport sanitizeOptions from \"../tools/sanitizeOptions\";\nimport { FileExtension, QRCode, Options, DownloadOptions, ExtensionFunction, Window } from \"../types\";\nimport qrcode from \"qrcode-generator\";\nimport getMimeType from \"../tools/getMimeType\";\nimport { Canvas as NodeCanvas, Image } from \"canvas\";\n\ndeclare const window: Window;\n\nexport default class QRCodeStyling {\n  _options: RequiredOptions;\n  _window: Window;\n  _container?: HTMLElement;\n  _domCanvas?: HTMLCanvasElement;\n  _nodeCanvas?: NodeCanvas;\n  _svg?: SVGElement;\n  _qr?: QRCode;\n  _extension?: ExtensionFunction;\n  _canvasDrawingPromise?: Promise<void>;\n  _svgDrawingPromise?: Promise<void>;\n\n  constructor(options?: Partial<Options>) {\n    if (options?.jsdom) {\n      this._window = new options.jsdom(\"\", { resources: \"usable\" }).window;\n    } else {\n      this._window = window;\n    }\n    this._options = options ? sanitizeOptions(mergeDeep(defaultOptions, options) as RequiredOptions) : defaultOptions;\n    this.update();\n  }\n\n  static _clearContainer(container?: HTMLElement): void {\n    if (container) {\n      container.innerHTML = \"\";\n    }\n  }\n\n  _setupSvg(): void {\n    if (!this._qr) {\n      return;\n    }\n    const qrSVG = new QRSVG(this._options, this._window);\n\n    this._svg = qrSVG.getElement();\n    this._svgDrawingPromise = qrSVG.drawQR(this._qr).then(() => {\n      if (!this._svg) return;\n      this._extension?.(qrSVG.getElement(), this._options);\n    });\n  }\n\n  _setupCanvas(): void {\n    if (!this._qr) {\n      return;\n    }\n\n    if (this._options.nodeCanvas?.createCanvas) {\n      this._nodeCanvas = this._options.nodeCanvas.createCanvas(this._options.width, this._options.height);\n      this._nodeCanvas.width = this._options.width;\n      this._nodeCanvas.height = this._options.height;\n    } else {\n      this._domCanvas = document.createElement(\"canvas\");\n      this._domCanvas.width = this._options.width;\n      this._domCanvas.height = this._options.height;\n    }\n\n    this._setupSvg();\n    this._canvasDrawingPromise = this._svgDrawingPromise?.then(() => {\n      if (!this._svg) return;\n\n      const svg = this._svg;\n      const xml = new this._window.XMLSerializer().serializeToString(svg);\n      const svg64 = btoa(xml);\n      const image64 = `data:${getMimeType('svg')};base64,${svg64}`;\n\n      if (this._options.nodeCanvas?.loadImage) {\n        return this._options.nodeCanvas.loadImage(image64).then((image: Image) => {\n          // fix blurry svg\n          image.width = this._options.width;\n          image.height = this._options.height;\n          this._nodeCanvas?.getContext(\"2d\")?.drawImage(image, 0, 0);\n        });\n      } else {\n        const image = new this._window.Image();\n\n        return new Promise((resolve) => {\n          image.onload = (): void => {\n            this._domCanvas?.getContext(\"2d\")?.drawImage(image, 0, 0);\n            resolve();\n          };\n\n          image.src = image64;\n        });\n      }\n    });\n  }\n\n  async _getElement(extension: FileExtension = \"png\") {\n    if (!this._qr) throw \"QR code is empty\";\n\n    if (extension.toLowerCase() === \"svg\") {\n      if (!this._svg || !this._svgDrawingPromise) {\n        this._setupSvg();\n      }\n      await this._svgDrawingPromise;\n      return this._svg;\n    } else {\n      if (!(this._domCanvas || this._nodeCanvas) || !this._canvasDrawingPromise) {\n        this._setupCanvas();\n      }\n      await this._canvasDrawingPromise;\n      return this._domCanvas || this._nodeCanvas;\n    }\n  }\n\n  update(options?: Partial<Options>): void {\n    QRCodeStyling._clearContainer(this._container);\n    this._options = options ? sanitizeOptions(mergeDeep(this._options, options) as RequiredOptions) : this._options;\n\n    if (!this._options.data) {\n      return;\n    }\n\n    this._qr = qrcode(this._options.qrOptions.typeNumber, this._options.qrOptions.errorCorrectionLevel);\n    this._qr.addData(this._options.data, this._options.qrOptions.mode || getMode(this._options.data));\n    this._qr.make();\n\n    if (this._options.type === drawTypes.canvas) {\n      this._setupCanvas();\n    } else {\n      this._setupSvg();\n    }\n\n    this.append(this._container);\n  }\n\n  append(container?: HTMLElement): void {\n    if (!container) {\n      return;\n    }\n\n    if (typeof container.appendChild !== \"function\") {\n      throw \"Container should be a single DOM node\";\n    }\n\n    if (this._options.type === drawTypes.canvas) {\n      if (this._domCanvas) {\n        container.appendChild(this._domCanvas);\n      }\n    } else {\n      if (this._svg) {\n        container.appendChild(this._svg);\n      }\n    }\n\n    this._container = container;\n  }\n\n  applyExtension(extension: ExtensionFunction): void {\n    if (!extension) {\n      throw \"Extension function should be defined.\";\n    }\n\n    this._extension = extension;\n    this.update();\n  }\n\n  deleteExtension(): void {\n    this._extension = undefined;\n    this.update();\n  }\n\n  async getRawData(extension: FileExtension = \"png\"): Promise<Blob | Buffer | null> {\n    if (!this._qr) throw \"QR code is empty\";\n    const element = await this._getElement(extension);\n    const mimeType = getMimeType(extension);\n\n    if (!element) {\n      return null;\n    }\n\n    if (extension.toLowerCase() === \"svg\") {\n      const serializer = new this._window.XMLSerializer();\n      const source = serializer.serializeToString(element as SVGElement);\n      const svgString = `<?xml version=\"1.0\" standalone=\"no\"?>\\r\\n${source}`;\n      if (typeof Blob !== \"undefined\" && !this._options.jsdom) {\n        return new Blob([svgString], { type: mimeType });\n      } else {\n        return Buffer.from(svgString);\n      }\n    } else {\n      return new Promise((resolve) => {\n        const canvas = element;\n        if ('toBuffer' in canvas) {\n          // Different call is needed to prevent error TS2769: No overload matches this call.\n          if (mimeType === \"image/png\") {\n            resolve(canvas.toBuffer(mimeType));\n          } else if (mimeType === \"image/jpeg\") {\n            resolve(canvas.toBuffer(mimeType));\n          } else if (mimeType === \"application/pdf\") {\n            resolve(canvas.toBuffer(mimeType));\n          } else {\n            throw Error(\"Unsupported extension\");\n          }\n        } else if ('toBlob' in canvas) {\n          (canvas).toBlob(resolve, mimeType, 1);\n        }\n      });\n    }\n  }\n\n  async download(downloadOptions?: Partial<DownloadOptions> | string): Promise<void> {\n    if (!this._qr) throw \"QR code is empty\";\n    if (typeof Blob === \"undefined\") throw \"Cannot download in Node.js, call getRawData instead.\";\n    let extension = \"png\" as FileExtension;\n    let name = \"qr\";\n\n    //TODO remove deprecated code in the v2\n    if (typeof downloadOptions === \"string\") {\n      extension = downloadOptions as FileExtension;\n      console.warn(\n        \"Extension is deprecated as argument for 'download' method, please pass object { name: '...', extension: '...' } as argument\"\n      );\n    } else if (typeof downloadOptions === \"object\" && downloadOptions !== null) {\n      if (downloadOptions.name) {\n        name = downloadOptions.name;\n      }\n      if (downloadOptions.extension) {\n        extension = downloadOptions.extension;\n      }\n    }\n\n    const element = await this._getElement(extension);\n\n    if (!element) {\n      return;\n    }\n\n    if (extension.toLowerCase() === \"svg\") {\n      const serializer = new XMLSerializer();\n      let source = serializer.serializeToString(element as SVGElement);\n\n      source = '<?xml version=\"1.0\" standalone=\"no\"?>\\r\\n' + source;\n      const url = `data:${getMimeType(extension)};charset=utf-8,${encodeURIComponent(source)}`;\n      downloadURI(url, `${name}.svg`);\n    } else {\n      const url = (element as HTMLCanvasElement).toDataURL(getMimeType(extension));\n      downloadURI(url, `${name}.${extension}`);\n    }\n  }\n}\n", "import modes from \"../constants/modes\";\nimport { Mode } from \"../types\";\n\nexport default function getMode(data: string): Mode {\n  switch (true) {\n    case /^[0-9]*$/.test(data):\n      return modes.numeric;\n    case /^[0-9A-Z $%*+\\-./:]*$/.test(data):\n      return modes.alphanumeric;\n    default:\n      return modes.byte;\n  }\n}\n", "import QRCodeStyling from \"./core/QRCodeStyling\";\nimport dotTypes from \"./constants/dotTypes\";\nimport cornerDotTypes from \"./constants/cornerDotTypes\";\nimport cornerSquareTypes from \"./constants/cornerSquareTypes\";\nimport errorCorrectionLevels from \"./constants/errorCorrectionLevels\";\nimport errorCorrectionPercents from \"./constants/errorCorrectionPercents\";\nimport modes from \"./constants/modes\";\nimport qrTypes from \"./constants/qrTypes\";\nimport drawTypes from \"./constants/drawTypes\";\nimport shapeTypes from \"./constants/shapeTypes\";\nimport gradientTypes from \"./constants/gradientTypes\";\n\nexport * from \"./types\";\n\nexport {\n  dotTypes,\n  cornerDotTypes,\n  cornerSquareTypes,\n  errorCorrectionLevels,\n  errorCorrectionPercents,\n  modes,\n  qrTypes,\n  drawTypes,\n  shapeTypes,\n  gradientTypes\n};\n\nexport default QRCodeStyling;\n", "/**\n * @license\n * Copyright 2010-2025 Three.js Authors\n * SPDX-License-Identifier: MIT\n */\nconst REVISION = '182';\n\n/**\n * Represents mouse buttons and interaction types in context of controls.\n *\n * @type {ConstantsMouse}\n * @constant\n */\nconst MOUSE = { LEFT: 0, MIDDLE: 1, RIGHT: 2, ROTATE: 0, DOLLY: 1, PAN: 2 };\n\n/**\n * Represents touch interaction types in context of controls.\n *\n * @type {ConstantsTouch}\n * @constant\n */\nconst TOUCH = { ROTATE: 0, PAN: 1, DOLLY_PAN: 2, DOLLY_ROTATE: 3 };\n\n/**\n * Disables face culling.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceNone = 0;\n\n/**\n * Culls back faces.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceBack = 1;\n\n/**\n * Culls front faces.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceFront = 2;\n\n/**\n * Culls both front and back faces.\n *\n * @type {number}\n * @constant\n */\nconst CullFaceFrontBack = 3;\n\n/**\n * Gives unfiltered shadow maps - fastest, but lowest quality.\n *\n * @type {number}\n * @constant\n */\nconst BasicShadowMap = 0;\n\n/**\n * Filters shadow maps using the Percentage-Closer Filtering (PCF) algorithm.\n *\n * @type {number}\n * @constant\n */\nconst PCFShadowMap = 1;\n\n/**\n * Filters shadow maps using the Percentage-Closer Filtering (PCF) algorithm with\n * better soft shadows especially when using low-resolution shadow maps.\n *\n * @type {number}\n * @constant\n */\nconst PCFSoftShadowMap = 2;\n\n/**\n * Filters shadow maps using the Variance Shadow Map (VSM) algorithm.\n * When using VSMShadowMap all shadow receivers will also cast shadows.\n *\n * @type {number}\n * @constant\n */\nconst VSMShadowMap = 3;\n\n/**\n * Only front faces are rendered.\n *\n * @type {number}\n * @constant\n */\nconst FrontSide = 0;\n\n/**\n * Only back faces are rendered.\n *\n * @type {number}\n * @constant\n */\nconst BackSide = 1;\n\n/**\n * Both front and back faces are rendered.\n *\n * @type {number}\n * @constant\n */\nconst DoubleSide = 2;\n\n/**\n * No blending is performed which effectively disables\n * alpha transparency.\n *\n * @type {number}\n * @constant\n */\nconst NoBlending = 0;\n\n/**\n * The default blending.\n *\n * @type {number}\n * @constant\n */\nconst NormalBlending = 1;\n\n/**\n * Represents additive blending.\n *\n * @type {number}\n * @constant\n */\nconst AdditiveBlending = 2;\n\n/**\n * Represents subtractive blending.\n *\n * @type {number}\n * @constant\n */\nconst SubtractiveBlending = 3;\n\n/**\n * Represents multiply blending.\n *\n * @type {number}\n * @constant\n */\nconst MultiplyBlending = 4;\n\n/**\n * Represents custom blending.\n *\n * @type {number}\n * @constant\n */\nconst CustomBlending = 5;\n\n/**\n * A `source + destination` blending equation.\n *\n * @type {number}\n * @constant\n */\nconst AddEquation = 100;\n\n/**\n * A `source - destination` blending equation.\n *\n * @type {number}\n * @constant\n */\nconst SubtractEquation = 101;\n\n/**\n * A `destination - source` blending equation.\n *\n * @type {number}\n * @constant\n */\nconst ReverseSubtractEquation = 102;\n\n/**\n * A blend equation that uses the minimum of source and destination.\n *\n * @type {number}\n * @constant\n */\nconst MinEquation = 103;\n\n/**\n * A blend equation that uses the maximum of source and destination.\n *\n * @type {number}\n * @constant\n */\nconst MaxEquation = 104;\n\n/**\n * Multiplies all colors by `0`.\n *\n * @type {number}\n * @constant\n */\nconst ZeroFactor = 200;\n\n/**\n * Multiplies all colors by `1`.\n *\n * @type {number}\n * @constant\n */\nconst OneFactor = 201;\n\n/**\n * Multiplies all colors by the source colors.\n *\n * @type {number}\n * @constant\n */\nconst SrcColorFactor = 202;\n\n/**\n * Multiplies all colors by `1` minus each source color.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusSrcColorFactor = 203;\n\n/**\n * Multiplies all colors by the source alpha value.\n *\n * @type {number}\n * @constant\n */\nconst SrcAlphaFactor = 204;\n\n/**\n * Multiplies all colors by 1 minus the source alpha value.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusSrcAlphaFactor = 205;\n\n/**\n * Multiplies all colors by the destination alpha value.\n *\n * @type {number}\n * @constant\n */\nconst DstAlphaFactor = 206;\n\n/**\n * Multiplies all colors by `1` minus the destination alpha value.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusDstAlphaFactor = 207;\n\n/**\n * Multiplies all colors by the destination color.\n *\n * @type {number}\n * @constant\n */\nconst DstColorFactor = 208;\n\n/**\n * Multiplies all colors by `1` minus each destination color.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusDstColorFactor = 209;\n\n/**\n * Multiplies the RGB colors by the smaller of either the source alpha\n * value or the value of `1` minus the destination alpha value. The alpha\n * value is multiplied by `1`.\n *\n * @type {number}\n * @constant\n */\nconst SrcAlphaSaturateFactor = 210;\n\n/**\n * Multiplies all colors by a constant color.\n *\n * @type {number}\n * @constant\n */\nconst ConstantColorFactor = 211;\n\n/**\n * Multiplies all colors by `1` minus a constant color.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusConstantColorFactor = 212;\n\n/**\n * Multiplies all colors by a constant alpha value.\n *\n * @type {number}\n * @constant\n */\nconst ConstantAlphaFactor = 213;\n\n/**\n * Multiplies all colors by 1 minus a constant alpha value.\n *\n * @type {number}\n * @constant\n */\nconst OneMinusConstantAlphaFactor = 214;\n\n/**\n * Never pass.\n *\n * @type {number}\n * @constant\n */\nconst NeverDepth = 0;\n\n/**\n * Always pass.\n *\n * @type {number}\n * @constant\n */\nconst AlwaysDepth = 1;\n\n/**\n * Pass if the incoming value is less than the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst LessDepth = 2;\n\n/**\n * Pass if the incoming value is less than or equal to the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst LessEqualDepth = 3;\n\n/**\n * Pass if the incoming value equals the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst EqualDepth = 4;\n\n/**\n * Pass if the incoming value is greater than or equal to the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterEqualDepth = 5;\n\n/**\n * Pass if the incoming value is greater than the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterDepth = 6;\n\n/**\n * Pass if the incoming value is not equal to the depth buffer value.\n *\n * @type {number}\n * @constant\n */\nconst NotEqualDepth = 7;\n\n/**\n * Multiplies the environment map color with the surface color.\n *\n * @type {number}\n * @constant\n */\nconst MultiplyOperation = 0;\n\n/**\n * Uses reflectivity to blend between the two colors.\n *\n * @type {number}\n * @constant\n */\nconst MixOperation = 1;\n\n/**\n * Adds the two colors.\n *\n * @type {number}\n * @constant\n */\nconst AddOperation = 2;\n\n/**\n * No tone mapping is applied.\n *\n * @type {number}\n * @constant\n */\nconst NoToneMapping = 0;\n\n/**\n * Linear tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst LinearToneMapping = 1;\n\n/**\n * Reinhard tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst ReinhardToneMapping = 2;\n\n/**\n * Cineon tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst CineonToneMapping = 3;\n\n/**\n * ACES Filmic tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst ACESFilmicToneMapping = 4;\n\n/**\n * Custom tone mapping.\n *\n * Expects a custom implementation by modifying shader code of the material's fragment shader.\n *\n * @type {number}\n * @constant\n */\nconst CustomToneMapping = 5;\n\n/**\n * AgX tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst AgXToneMapping = 6;\n\n/**\n * Neutral tone mapping.\n *\n * Implementation based on the Khronos 3D Commerce Group standard tone mapping.\n *\n * @type {number}\n * @constant\n */\nconst NeutralToneMapping = 7;\n\n/**\n * The skinned mesh shares the same world space as the skeleton.\n *\n * @type {string}\n * @constant\n */\nconst AttachedBindMode = 'attached';\n\n/**\n * The skinned mesh does not share the same world space as the skeleton.\n * This is useful when a skeleton is shared across multiple skinned meshes.\n *\n * @type {string}\n * @constant\n */\nconst DetachedBindMode = 'detached';\n\n/**\n * Maps textures using the geometry's UV coordinates.\n *\n * @type {number}\n * @constant\n */\nconst UVMapping = 300;\n\n/**\n * Reflection mapping for cube textures.\n *\n * @type {number}\n * @constant\n */\nconst CubeReflectionMapping = 301;\n\n/**\n * Refraction mapping for cube textures.\n *\n * @type {number}\n * @constant\n */\nconst CubeRefractionMapping = 302;\n\n/**\n * Reflection mapping for equirectangular textures.\n *\n * @type {number}\n * @constant\n */\nconst EquirectangularReflectionMapping = 303;\n\n/**\n * Refraction mapping for equirectangular textures.\n *\n * @type {number}\n * @constant\n */\nconst EquirectangularRefractionMapping = 304;\n\n/**\n * Reflection mapping for PMREM textures.\n *\n * @type {number}\n * @constant\n */\nconst CubeUVReflectionMapping = 306;\n\n/**\n * The texture will simply repeat to infinity.\n *\n * @type {number}\n * @constant\n */\nconst RepeatWrapping = 1000;\n\n/**\n * The last pixel of the texture stretches to the edge of the mesh.\n *\n * @type {number}\n * @constant\n */\nconst ClampToEdgeWrapping = 1001;\n\n/**\n * The texture will repeats to infinity, mirroring on each repeat.\n *\n * @type {number}\n * @constant\n */\nconst MirroredRepeatWrapping = 1002;\n\n/**\n * Returns the value of the texture element that is nearest (in Manhattan distance)\n * to the specified texture coordinates.\n *\n * @type {number}\n * @constant\n */\nconst NearestFilter = 1003;\n\n/**\n * Chooses the mipmap that most closely matches the size of the pixel being textured\n * and uses the `NearestFilter` criterion (the texel nearest to the center of the pixel)\n * to produce a texture value.\n *\n * @type {number}\n * @constant\n */\nconst NearestMipmapNearestFilter = 1004;\nconst NearestMipMapNearestFilter = 1004; // legacy\n\n/**\n * Chooses the two mipmaps that most closely match the size of the pixel being textured and\n * uses the `NearestFilter` criterion to produce a texture value from each mipmap.\n * The final texture value is a weighted average of those two values.\n *\n * @type {number}\n * @constant\n */\nconst NearestMipmapLinearFilter = 1005;\nconst NearestMipMapLinearFilter = 1005; // legacy\n\n/**\n * Returns the weighted average of the four texture elements that are closest to the specified\n * texture coordinates, and can include items wrapped or repeated from other parts of a texture,\n * depending on the values of `wrapS` and `wrapT`, and on the exact mapping.\n *\n * @type {number}\n * @constant\n */\nconst LinearFilter = 1006;\n\n/**\n * Chooses the mipmap that most closely matches the size of the pixel being textured and uses\n * the `LinearFilter` criterion (a weighted average of the four texels that are closest to the\n * center of the pixel) to produce a texture value.\n *\n * @type {number}\n * @constant\n */\nconst LinearMipmapNearestFilter = 1007;\nconst LinearMipMapNearestFilter = 1007; // legacy\n\n/**\n * Chooses the two mipmaps that most closely match the size of the pixel being textured and uses\n * the `LinearFilter` criterion to produce a texture value from each mipmap. The final texture value\n * is a weighted average of those two values.\n *\n * @type {number}\n * @constant\n */\nconst LinearMipmapLinearFilter = 1008;\nconst LinearMipMapLinearFilter = 1008; // legacy\n\n/**\n * An unsigned byte data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedByteType = 1009;\n\n/**\n * A byte data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst ByteType = 1010;\n\n/**\n * A short data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst ShortType = 1011;\n\n/**\n * An unsigned short data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedShortType = 1012;\n\n/**\n * An int data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst IntType = 1013;\n\n/**\n * An unsigned int data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedIntType = 1014;\n\n/**\n * A float data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst FloatType = 1015;\n\n/**\n * A half float data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst HalfFloatType = 1016;\n\n/**\n * An unsigned short 4_4_4_4 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedShort4444Type = 1017;\n\n/**\n * An unsigned short 5_5_5_1 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedShort5551Type = 1018;\n\n/**\n * An unsigned int 24_8 data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedInt248Type = 1020;\n\n/**\n * An unsigned int 5_9_9_9 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedInt5999Type = 35902;\n\n/**\n * An unsigned int 10_11_11 (packed) data type for textures.\n *\n * @type {number}\n * @constant\n */\nconst UnsignedInt101111Type = 35899;\n\n/**\n * Discards the red, green and blue components and reads just the alpha component.\n *\n * @type {number}\n * @constant\n */\nconst AlphaFormat = 1021;\n\n/**\n * Discards the alpha component and reads the red, green and blue component.\n *\n * @type {number}\n * @constant\n */\nconst RGBFormat = 1022;\n\n/**\n * Reads the red, green, blue and alpha components.\n *\n * @type {number}\n * @constant\n */\nconst RGBAFormat = 1023;\n\n/**\n * Reads each element as a single depth value, converts it to floating point, and clamps to the range `[0,1]`.\n *\n * @type {number}\n * @constant\n */\nconst DepthFormat = 1026;\n\n/**\n * Reads each element is a pair of depth and stencil values. The depth component of the pair is interpreted as\n * in `DepthFormat`. The stencil component is interpreted based on the depth + stencil internal format.\n *\n * @type {number}\n * @constant\n */\nconst DepthStencilFormat = 1027;\n\n/**\n * Discards the green, blue and alpha components and reads just the red component.\n *\n * @type {number}\n * @constant\n */\nconst RedFormat = 1028;\n\n/**\n * Discards the green, blue and alpha components and reads just the red component. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RedIntegerFormat = 1029;\n\n/**\n * Discards the alpha, and blue components and reads the red, and green components.\n *\n * @type {number}\n * @constant\n */\nconst RGFormat = 1030;\n\n/**\n * Discards the alpha, and blue components and reads the red, and green components. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RGIntegerFormat = 1031;\n\n/**\n * Discards the alpha component and reads the red, green and blue component. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RGBIntegerFormat = 1032;\n\n/**\n * Reads the red, green, blue and alpha components. The texels are read as integers instead of floating point.\n *\n * @type {number}\n * @constant\n */\nconst RGBAIntegerFormat = 1033;\n\n/**\n * A DXT1-compressed image in an RGB image format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_S3TC_DXT1_Format = 33776;\n\n/**\n * A DXT1-compressed image in an RGB image format with a simple on/off alpha value.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_S3TC_DXT1_Format = 33777;\n\n/**\n * A DXT3-compressed image in an RGBA image format. Compared to a 32-bit RGBA texture, it offers 4:1 compression.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_S3TC_DXT3_Format = 33778;\n\n/**\n * A DXT5-compressed image in an RGBA image format. It also provides a 4:1 compression, but differs to the DXT3\n * compression in how the alpha compression is done.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_S3TC_DXT5_Format = 33779;\n\n/**\n * PVRTC RGB compression in 4-bit mode. One block for each 4\u00D74 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGB_PVRTC_4BPPV1_Format = 35840;\n\n/**\n * PVRTC RGB compression in 2-bit mode. One block for each 8\u00D74 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGB_PVRTC_2BPPV1_Format = 35841;\n\n/**\n * PVRTC RGBA compression in 4-bit mode. One block for each 4\u00D74 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_PVRTC_4BPPV1_Format = 35842;\n\n/**\n * PVRTC RGBA compression in 2-bit mode. One block for each 8\u00D74 pixels.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_PVRTC_2BPPV1_Format = 35843;\n\n/**\n * ETC1 RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_ETC1_Format = 36196;\n\n/**\n * ETC2 RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_ETC2_Format = 37492;\n\n/**\n * ETC2 RGBA format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ETC2_EAC_Format = 37496;\n\n/**\n * EAC R11 UNORM format.\n *\n * @type {number}\n * @constant\n */\nconst R11_EAC_Format = 37488; // 0x9270\n\n/**\n * EAC R11 SNORM format.\n *\n * @type {number}\n * @constant\n */\nconst SIGNED_R11_EAC_Format = 37489; // 0x9271\n\n/**\n * EAC RG11 UNORM format.\n *\n * @type {number}\n * @constant\n */\nconst RG11_EAC_Format = 37490; // 0x9272\n\n/**\n * EAC RG11 SNORM format.\n *\n * @type {number}\n * @constant\n */\nconst SIGNED_RG11_EAC_Format = 37491; // 0x9273\n\n/**\n * ASTC RGBA 4x4 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_4x4_Format = 37808;\n\n/**\n * ASTC RGBA 5x4 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_5x4_Format = 37809;\n\n/**\n * ASTC RGBA 5x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_5x5_Format = 37810;\n\n/**\n * ASTC RGBA 6x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_6x5_Format = 37811;\n\n/**\n * ASTC RGBA 6x6 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_6x6_Format = 37812;\n\n/**\n * ASTC RGBA 8x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_8x5_Format = 37813;\n\n/**\n * ASTC RGBA 8x6 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_8x6_Format = 37814;\n\n/**\n * ASTC RGBA 8x8 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_8x8_Format = 37815;\n\n/**\n * ASTC RGBA 10x5 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x5_Format = 37816;\n\n/**\n * ASTC RGBA 10x6 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x6_Format = 37817;\n\n/**\n * ASTC RGBA 10x8 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x8_Format = 37818;\n\n/**\n * ASTC RGBA 10x10 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_10x10_Format = 37819;\n\n/**\n * ASTC RGBA 12x10 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_12x10_Format = 37820;\n\n/**\n * ASTC RGBA 12x12 format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_ASTC_12x12_Format = 37821;\n\n/**\n * BPTC RGBA format.\n *\n * @type {number}\n * @constant\n */\nconst RGBA_BPTC_Format = 36492;\n\n/**\n * BPTC Signed RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_BPTC_SIGNED_Format = 36494;\n\n/**\n * BPTC Unsigned RGB format.\n *\n * @type {number}\n * @constant\n */\nconst RGB_BPTC_UNSIGNED_Format = 36495;\n\n/**\n * RGTC1 Red format.\n *\n * @type {number}\n * @constant\n */\nconst RED_RGTC1_Format = 36283;\n\n/**\n * RGTC1 Signed Red format.\n *\n * @type {number}\n * @constant\n */\nconst SIGNED_RED_RGTC1_Format = 36284;\n\n/**\n * RGTC2 Red Green format.\n *\n * @type {number}\n * @constant\n */\nconst RED_GREEN_RGTC2_Format = 36285;\n\n/**\n * RGTC2 Signed Red Green format.\n *\n * @type {number}\n * @constant\n */\nconst SIGNED_RED_GREEN_RGTC2_Format = 36286;\n\n/**\n * Animations are played once.\n *\n * @type {number}\n * @constant\n */\nconst LoopOnce = 2200;\n\n/**\n * Animations are played with a chosen number of repetitions, each time jumping from\n * the end of the clip directly to its beginning.\n *\n * @type {number}\n * @constant\n */\nconst LoopRepeat = 2201;\n\n/**\n * Animations are played with a chosen number of repetitions, alternately playing forward\n * and backward.\n *\n * @type {number}\n * @constant\n */\nconst LoopPingPong = 2202;\n\n/**\n * Discrete interpolation mode for keyframe tracks.\n *\n * @type {number}\n * @constant\n */\nconst InterpolateDiscrete = 2300;\n\n/**\n * Linear interpolation mode for keyframe tracks.\n *\n * @type {number}\n * @constant\n */\nconst InterpolateLinear = 2301;\n\n/**\n * Smooth interpolation mode for keyframe tracks.\n *\n * @type {number}\n * @constant\n */\nconst InterpolateSmooth = 2302;\n\n/**\n * Zero curvature ending for animations.\n *\n * @type {number}\n * @constant\n */\nconst ZeroCurvatureEnding = 2400;\n\n/**\n * Zero slope ending for animations.\n *\n * @type {number}\n * @constant\n */\nconst ZeroSlopeEnding = 2401;\n\n/**\n * Wrap around ending for animations.\n *\n * @type {number}\n * @constant\n */\nconst WrapAroundEnding = 2402;\n\n/**\n * Default animation blend mode.\n *\n * @type {number}\n * @constant\n */\nconst NormalAnimationBlendMode = 2500;\n\n/**\n * Additive animation blend mode. Can be used to layer motions on top of\n * each other to build complex performances from smaller re-usable assets.\n *\n * @type {number}\n * @constant\n */\nconst AdditiveAnimationBlendMode = 2501;\n\n/**\n * For every three vertices draw a single triangle.\n *\n * @type {number}\n * @constant\n */\nconst TrianglesDrawMode = 0;\n\n/**\n * For each vertex draw a triangle from the last three vertices.\n *\n * @type {number}\n * @constant\n */\nconst TriangleStripDrawMode = 1;\n\n/**\n * For each vertex draw a triangle from the first vertex and the last two vertices.\n *\n * @type {number}\n * @constant\n */\nconst TriangleFanDrawMode = 2;\n\n/**\n * The depth value is inverted (1.0 - z) for visualization purposes.\n *\n * @type {number}\n * @constant\n */\nconst BasicDepthPacking = 3200;\n\n/**\n * The depth value is packed into 32 bit RGBA.\n *\n * @type {number}\n * @constant\n */\nconst RGBADepthPacking = 3201;\n\n/**\n * The depth value is packed into 24 bit RGB.\n *\n * @type {number}\n * @constant\n */\nconst RGBDepthPacking = 3202;\n\n/**\n * The depth value is packed into 16 bit RG.\n *\n * @type {number}\n * @constant\n */\nconst RGDepthPacking = 3203;\n\n/**\n * Normal information is relative to the underlying surface.\n *\n * @type {number}\n * @constant\n */\nconst TangentSpaceNormalMap = 0;\n\n/**\n * Normal information is relative to the object orientation.\n *\n * @type {number}\n * @constant\n */\nconst ObjectSpaceNormalMap = 1;\n\n// Color space string identifiers, matching CSS Color Module Level 4 and WebGPU names where available.\n\n/**\n * No color space.\n *\n * @type {string}\n * @constant\n */\nconst NoColorSpace = '';\n\n/**\n * sRGB color space.\n *\n * @type {string}\n * @constant\n */\nconst SRGBColorSpace = 'srgb';\n\n/**\n * sRGB-linear color space.\n *\n * @type {string}\n * @constant\n */\nconst LinearSRGBColorSpace = 'srgb-linear';\n\n/**\n * Linear transfer function.\n *\n * @type {string}\n * @constant\n */\nconst LinearTransfer = 'linear';\n\n/**\n * sRGB transfer function.\n *\n * @type {string}\n * @constant\n */\nconst SRGBTransfer = 'srgb';\n\n/**\n * No normal map packing.\n *\n * @type {string}\n * @constant\n */\nconst NoNormalPacking = '';\n\n/**\n * Normal RG packing.\n *\n * @type {string}\n * @constant\n */\nconst NormalRGPacking = 'rg';\n\n/**\n * Normal GA packing.\n *\n * @type {string}\n * @constant\n */\nconst NormalGAPacking = 'ga';\n\n/**\n * Sets the stencil buffer value to `0`.\n *\n * @type {number}\n * @constant\n */\nconst ZeroStencilOp = 0;\n\n/**\n * Keeps the current value.\n *\n * @type {number}\n * @constant\n */\nconst KeepStencilOp = 7680;\n\n/**\n * Sets the stencil buffer value to the specified reference value.\n *\n * @type {number}\n * @constant\n */\nconst ReplaceStencilOp = 7681;\n\n/**\n * Increments the current stencil buffer value. Clamps to the maximum representable unsigned value.\n *\n * @type {number}\n * @constant\n */\nconst IncrementStencilOp = 7682;\n\n/**\n * Decrements the current stencil buffer value. Clamps to `0`.\n *\n * @type {number}\n * @constant\n */\nconst DecrementStencilOp = 7683;\n\n/**\n * Increments the current stencil buffer value. Wraps stencil buffer value to zero when incrementing\n * the maximum representable unsigned value.\n *\n * @type {number}\n * @constant\n */\nconst IncrementWrapStencilOp = 34055;\n\n/**\n * Decrements the current stencil buffer value. Wraps stencil buffer value to the maximum representable\n * unsigned value when decrementing a stencil buffer value of `0`.\n *\n * @type {number}\n * @constant\n */\nconst DecrementWrapStencilOp = 34056;\n\n/**\n * Inverts the current stencil buffer value bitwise.\n *\n * @type {number}\n * @constant\n */\nconst InvertStencilOp = 5386;\n\n/**\n * Will never return true.\n *\n * @type {number}\n * @constant\n */\nconst NeverStencilFunc = 512;\n\n/**\n * Will return true if the stencil reference value is less than the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst LessStencilFunc = 513;\n\n/**\n * Will return true if the stencil reference value is equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst EqualStencilFunc = 514;\n\n/**\n * Will return true if the stencil reference value is less than or equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst LessEqualStencilFunc = 515;\n\n/**\n * Will return true if the stencil reference value is greater than the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterStencilFunc = 516;\n\n/**\n * Will return true if the stencil reference value is not equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst NotEqualStencilFunc = 517;\n\n/**\n * Will return true if the stencil reference value is greater than or equal to the current stencil value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterEqualStencilFunc = 518;\n\n/**\n * Will always return true.\n *\n * @type {number}\n * @constant\n */\nconst AlwaysStencilFunc = 519;\n\n/**\n * Never pass.\n *\n * @type {number}\n * @constant\n */\nconst NeverCompare = 512;\n\n/**\n * Pass if the incoming value is less than the texture value.\n *\n * @type {number}\n * @constant\n */\nconst LessCompare = 513;\n\n/**\n * Pass if the incoming value equals the texture value.\n *\n * @type {number}\n * @constant\n */\nconst EqualCompare = 514;\n\n/**\n * Pass if the incoming value is less than or equal to the texture value.\n *\n * @type {number}\n * @constant\n */\nconst LessEqualCompare = 515;\n\n/**\n * Pass if the incoming value is greater than the texture value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterCompare = 516;\n\n/**\n * Pass if the incoming value is not equal to the texture value.\n *\n * @type {number}\n * @constant\n */\nconst NotEqualCompare = 517;\n\n/**\n * Pass if the incoming value is greater than or equal to the texture value.\n *\n * @type {number}\n * @constant\n */\nconst GreaterEqualCompare = 518;\n\n/**\n * Always pass.\n *\n * @type {number}\n * @constant\n */\nconst AlwaysCompare = 519;\n\n/**\n * The contents are intended to be specified once by the application, and used many\n * times as the source for drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StaticDrawUsage = 35044;\n\n/**\n * The contents are intended to be respecified repeatedly by the application, and\n * used many times as the source for drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst DynamicDrawUsage = 35048;\n\n/**\n * The contents are intended to be specified once by the application, and used at most\n * a few times as the source for drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StreamDrawUsage = 35040;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and queried\n * many times by the application.\n *\n * @type {number}\n * @constant\n */\nconst StaticReadUsage = 35045;\n\n/**\n * The contents are intended to be respecified repeatedly by reading data from the 3D API, and queried\n * many times by the application.\n *\n * @type {number}\n * @constant\n */\nconst DynamicReadUsage = 35049;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and queried at most\n * a few times by the application\n *\n * @type {number}\n * @constant\n */\nconst StreamReadUsage = 35041;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and used many times as\n * the source for WebGL drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StaticCopyUsage = 35046;\n\n/**\n * The contents are intended to be respecified repeatedly by reading data from the 3D API, and used many times\n * as the source for WebGL drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst DynamicCopyUsage = 35050;\n\n/**\n * The contents are intended to be specified once by reading data from the 3D API, and used at most a few times\n * as the source for WebGL drawing and image specification commands.\n *\n * @type {number}\n * @constant\n */\nconst StreamCopyUsage = 35042;\n\n/**\n * GLSL 1 shader code.\n *\n * @type {string}\n * @constant\n */\nconst GLSL1 = '100';\n\n/**\n * GLSL 3 shader code.\n *\n * @type {string}\n * @constant\n */\nconst GLSL3 = '300 es';\n\n/**\n * WebGL coordinate system.\n *\n * @type {number}\n * @constant\n */\nconst WebGLCoordinateSystem = 2000;\n\n/**\n * WebGPU coordinate system.\n *\n * @type {number}\n * @constant\n */\nconst WebGPUCoordinateSystem = 2001;\n\n/**\n * Represents the different timestamp query types.\n *\n * @type {ConstantsTimestampQuery}\n * @constant\n */\nconst TimestampQuery = {\n\tCOMPUTE: 'compute',\n\tRENDER: 'render'\n};\n\n/**\n * Represents mouse buttons and interaction types in context of controls.\n *\n * @type {ConstantsInterpolationSamplingType}\n * @constant\n */\nconst InterpolationSamplingType = {\n\tPERSPECTIVE: 'perspective',\n\tLINEAR: 'linear',\n\tFLAT: 'flat'\n};\n\n/**\n * Represents the different interpolation sampling modes.\n *\n * @type {ConstantsInterpolationSamplingMode}\n * @constant\n */\nconst InterpolationSamplingMode = {\n\tNORMAL: 'normal',\n\tCENTROID: 'centroid',\n\tSAMPLE: 'sample',\n\tFIRST: 'first',\n\tEITHER: 'either'\n};\n\n/**\n * This type represents mouse buttons and interaction types in context of controls.\n *\n * @typedef {Object} ConstantsMouse\n * @property {number} MIDDLE - The left mouse button.\n * @property {number} LEFT - The middle mouse button.\n * @property {number} RIGHT - The right mouse button.\n * @property {number} ROTATE - A rotate interaction.\n * @property {number} DOLLY - A dolly interaction.\n * @property {number} PAN - A pan interaction.\n **/\n\n/**\n * This type represents touch interaction types in context of controls.\n *\n * @typedef {Object} ConstantsTouch\n * @property {number} ROTATE - A rotate interaction.\n * @property {number} PAN - A pan interaction.\n * @property {number} DOLLY_PAN - The dolly-pan interaction.\n * @property {number} DOLLY_ROTATE - A dolly-rotate interaction.\n **/\n\n/**\n * This type represents the different timestamp query types.\n *\n * @typedef {Object} ConstantsTimestampQuery\n * @property {string} COMPUTE - A `compute` timestamp query.\n * @property {string} RENDER - A `render` timestamp query.\n **/\n\n/**\n * Represents the different interpolation sampling types.\n *\n * @typedef {Object} ConstantsInterpolationSamplingType\n * @property {string} PERSPECTIVE - Perspective-correct interpolation.\n * @property {string} LINEAR - Linear interpolation.\n * @property {string} FLAT - Flat interpolation.\n */\n\n/**\n * Represents the different interpolation sampling modes.\n *\n * @typedef {Object} ConstantsInterpolationSamplingMode\n * @property {string} NORMAL - Normal sampling mode.\n * @property {string} CENTROID - Centroid sampling mode.\n * @property {string} SAMPLE - Sample-specific sampling mode.\n * @property {string} FIRST - Flat interpolation using the first vertex.\n * @property {string} EITHER - Flat interpolation using either vertex.\n */\n\nfunction arrayNeedsUint32( array ) {\n\n\t// assumes larger values usually on last\n\n\tfor ( let i = array.length - 1; i >= 0; -- i ) {\n\n\t\tif ( array[ i ] >= 65535 ) return true; // account for PRIMITIVE_RESTART_FIXED_INDEX, #24565\n\n\t}\n\n\treturn false;\n\n}\n\nconst TYPED_ARRAYS = {\n\tInt8Array: Int8Array,\n\tUint8Array: Uint8Array,\n\tUint8ClampedArray: Uint8ClampedArray,\n\tInt16Array: Int16Array,\n\tUint16Array: Uint16Array,\n\tInt32Array: Int32Array,\n\tUint32Array: Uint32Array,\n\tFloat32Array: Float32Array,\n\tFloat64Array: Float64Array\n};\n\nfunction getTypedArray( type, buffer ) {\n\n\treturn new TYPED_ARRAYS[ type ]( buffer );\n\n}\n\n/**\n * Returns `true` if the given object is a typed array.\n *\n * @param {any} array - The object to check.\n * @return {boolean} Whether the given object is a typed array.\n */\nfunction isTypedArray( array ) {\n\n\treturn ArrayBuffer.isView( array ) && ! ( array instanceof DataView );\n\n}\n\nfunction createElementNS( name ) {\n\n\treturn document.createElementNS( 'http://www.w3.org/1999/xhtml', name );\n\n}\n\nfunction createCanvasElement() {\n\n\tconst canvas = createElementNS( 'canvas' );\n\tcanvas.style.display = 'block';\n\treturn canvas;\n\n}\n\nconst _cache = {};\n\nlet _setConsoleFunction = null;\n\nfunction setConsoleFunction( fn ) {\n\n\t_setConsoleFunction = fn;\n\n}\n\nfunction getConsoleFunction() {\n\n\treturn _setConsoleFunction;\n\n}\n\nfunction log( ...params ) {\n\n\tconst message = 'THREE.' + params.shift();\n\n\tif ( _setConsoleFunction ) {\n\n\t\t_setConsoleFunction( 'log', message, ...params );\n\n\t} else {\n\n\t\tconsole.log( message, ...params );\n\n\t}\n\n}\n\nfunction warn( ...params ) {\n\n\tconst message = 'THREE.' + params.shift();\n\n\tif ( _setConsoleFunction ) {\n\n\t\t_setConsoleFunction( 'warn', message, ...params );\n\n\t} else {\n\n\t\tconsole.warn( message, ...params );\n\n\t}\n\n}\n\nfunction error( ...params ) {\n\n\tconst message = 'THREE.' + params.shift();\n\n\tif ( _setConsoleFunction ) {\n\n\t\t_setConsoleFunction( 'error', message, ...params );\n\n\t} else {\n\n\t\tconsole.error( message, ...params );\n\n\t}\n\n}\n\nfunction warnOnce( ...params ) {\n\n\tconst message = params.join( ' ' );\n\n\tif ( message in _cache ) return;\n\n\t_cache[ message ] = true;\n\n\twarn( ...params );\n\n}\n\nfunction probeAsync( gl, sync, interval ) {\n\n\treturn new Promise( function ( resolve, reject ) {\n\n\t\tfunction probe() {\n\n\t\t\tswitch ( gl.clientWaitSync( sync, gl.SYNC_FLUSH_COMMANDS_BIT, 0 ) ) {\n\n\t\t\t\tcase gl.WAIT_FAILED:\n\t\t\t\t\treject();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase gl.TIMEOUT_EXPIRED:\n\t\t\t\t\tsetTimeout( probe, interval );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tresolve();\n\n\t\t\t}\n\n\t\t}\n\n\t\tsetTimeout( probe, interval );\n\n\t} );\n\n}\n\n/**\n * This modules allows to dispatch event objects on custom JavaScript objects.\n *\n * Main repository: [eventdispatcher.js](https://github.com/mrdoob/eventdispatcher.js/)\n *\n * Code Example:\n * ```js\n * class Car extends EventDispatcher {\n * \tstart() {\n *\t\tthis.dispatchEvent( { type: 'start', message: 'vroom vroom!' } );\n *\t}\n *};\n *\n * // Using events with the custom object\n * const car = new Car();\n * car.addEventListener( 'start', function ( event ) {\n * \talert( event.message );\n * } );\n *\n * car.start();\n * ```\n */\nclass EventDispatcher {\n\n\t/**\n\t * Adds the given event listener to the given event type.\n\t *\n\t * @param {string} type - The type of event to listen to.\n\t * @param {Function} listener - The function that gets called when the event is fired.\n\t */\n\taddEventListener( type, listener ) {\n\n\t\tif ( this._listeners === undefined ) this._listeners = {};\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners[ type ] === undefined ) {\n\n\t\t\tlisteners[ type ] = [];\n\n\t\t}\n\n\t\tif ( listeners[ type ].indexOf( listener ) === -1 ) {\n\n\t\t\tlisteners[ type ].push( listener );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns `true` if the given event listener has been added to the given event type.\n\t *\n\t * @param {string} type - The type of event.\n\t * @param {Function} listener - The listener to check.\n\t * @return {boolean} Whether the given event listener has been added to the given event type.\n\t */\n\thasEventListener( type, listener ) {\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners === undefined ) return false;\n\n\t\treturn listeners[ type ] !== undefined && listeners[ type ].indexOf( listener ) !== -1;\n\n\t}\n\n\t/**\n\t * Removes the given event listener from the given event type.\n\t *\n\t * @param {string} type - The type of event.\n\t * @param {Function} listener - The listener to remove.\n\t */\n\tremoveEventListener( type, listener ) {\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners === undefined ) return;\n\n\t\tconst listenerArray = listeners[ type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tconst index = listenerArray.indexOf( listener );\n\n\t\t\tif ( index !== -1 ) {\n\n\t\t\t\tlistenerArray.splice( index, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Dispatches an event object.\n\t *\n\t * @param {Object} event - The event that gets fired.\n\t */\n\tdispatchEvent( event ) {\n\n\t\tconst listeners = this._listeners;\n\n\t\tif ( listeners === undefined ) return;\n\n\t\tconst listenerArray = listeners[ event.type ];\n\n\t\tif ( listenerArray !== undefined ) {\n\n\t\t\tevent.target = this;\n\n\t\t\t// Make a copy, in case listeners are removed while iterating.\n\t\t\tconst array = listenerArray.slice( 0 );\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ].call( this, event );\n\n\t\t\t}\n\n\t\t\tevent.target = null;\n\n\t\t}\n\n\t}\n\n}\n\nconst _lut = [ '00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '0a', '0b', '0c', '0d', '0e', '0f', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '1a', '1b', '1c', '1d', '1e', '1f', '20', '21', '22', '23', '24', '25', '26', '27', '28', '29', '2a', '2b', '2c', '2d', '2e', '2f', '30', '31', '32', '33', '34', '35', '36', '37', '38', '39', '3a', '3b', '3c', '3d', '3e', '3f', '40', '41', '42', '43', '44', '45', '46', '47', '48', '49', '4a', '4b', '4c', '4d', '4e', '4f', '50', '51', '52', '53', '54', '55', '56', '57', '58', '59', '5a', '5b', '5c', '5d', '5e', '5f', '60', '61', '62', '63', '64', '65', '66', '67', '68', '69', '6a', '6b', '6c', '6d', '6e', '6f', '70', '71', '72', '73', '74', '75', '76', '77', '78', '79', '7a', '7b', '7c', '7d', '7e', '7f', '80', '81', '82', '83', '84', '85', '86', '87', '88', '89', '8a', '8b', '8c', '8d', '8e', '8f', '90', '91', '92', '93', '94', '95', '96', '97', '98', '99', '9a', '9b', '9c', '9d', '9e', '9f', 'a0', 'a1', 'a2', 'a3', 'a4', 'a5', 'a6', 'a7', 'a8', 'a9', 'aa', 'ab', 'ac', 'ad', 'ae', 'af', 'b0', 'b1', 'b2', 'b3', 'b4', 'b5', 'b6', 'b7', 'b8', 'b9', 'ba', 'bb', 'bc', 'bd', 'be', 'bf', 'c0', 'c1', 'c2', 'c3', 'c4', 'c5', 'c6', 'c7', 'c8', 'c9', 'ca', 'cb', 'cc', 'cd', 'ce', 'cf', 'd0', 'd1', 'd2', 'd3', 'd4', 'd5', 'd6', 'd7', 'd8', 'd9', 'da', 'db', 'dc', 'dd', 'de', 'df', 'e0', 'e1', 'e2', 'e3', 'e4', 'e5', 'e6', 'e7', 'e8', 'e9', 'ea', 'eb', 'ec', 'ed', 'ee', 'ef', 'f0', 'f1', 'f2', 'f3', 'f4', 'f5', 'f6', 'f7', 'f8', 'f9', 'fa', 'fb', 'fc', 'fd', 'fe', 'ff' ];\n\nlet _seed = 1234567;\n\n\nconst DEG2RAD = Math.PI / 180;\nconst RAD2DEG = 180 / Math.PI;\n\n/**\n * Generate a [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier)\n * (universally unique identifier).\n *\n * @return {string} The UUID.\n */\nfunction generateUUID() {\n\n\t// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/21963136#21963136\n\n\tconst d0 = Math.random() * 0xffffffff | 0;\n\tconst d1 = Math.random() * 0xffffffff | 0;\n\tconst d2 = Math.random() * 0xffffffff | 0;\n\tconst d3 = Math.random() * 0xffffffff | 0;\n\tconst uuid = _lut[ d0 & 0xff ] + _lut[ d0 >> 8 & 0xff ] + _lut[ d0 >> 16 & 0xff ] + _lut[ d0 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d1 & 0xff ] + _lut[ d1 >> 8 & 0xff ] + '-' + _lut[ d1 >> 16 & 0x0f | 0x40 ] + _lut[ d1 >> 24 & 0xff ] + '-' +\n\t\t\t_lut[ d2 & 0x3f | 0x80 ] + _lut[ d2 >> 8 & 0xff ] + '-' + _lut[ d2 >> 16 & 0xff ] + _lut[ d2 >> 24 & 0xff ] +\n\t\t\t_lut[ d3 & 0xff ] + _lut[ d3 >> 8 & 0xff ] + _lut[ d3 >> 16 & 0xff ] + _lut[ d3 >> 24 & 0xff ];\n\n\t// .toLowerCase() here flattens concatenated strings to save heap memory space.\n\treturn uuid.toLowerCase();\n\n}\n\n/**\n * Clamps the given value between min and max.\n *\n * @param {number} value - The value to clamp.\n * @param {number} min - The min value.\n * @param {number} max - The max value.\n * @return {number} The clamped value.\n */\nfunction clamp( value, min, max ) {\n\n\treturn Math.max( min, Math.min( max, value ) );\n\n}\n\n/**\n * Computes the Euclidean modulo of the given parameters that\n * is `( ( n % m ) + m ) % m`.\n *\n * @param {number} n - The first parameter.\n * @param {number} m - The second parameter.\n * @return {number} The Euclidean modulo.\n */\nfunction euclideanModulo( n, m ) {\n\n\t// https://en.wikipedia.org/wiki/Modulo_operation\n\n\treturn ( ( n % m ) + m ) % m;\n\n}\n\n/**\n * Performs a linear mapping from range `<a1, a2>` to range `<b1, b2>`\n * for the given value.\n *\n * @param {number} x - The value to be mapped.\n * @param {number} a1 - Minimum value for range A.\n * @param {number} a2 - Maximum value for range A.\n * @param {number} b1 - Minimum value for range B.\n * @param {number} b2 - Maximum value for range B.\n * @return {number} The mapped value.\n */\nfunction mapLinear( x, a1, a2, b1, b2 ) {\n\n\treturn b1 + ( x - a1 ) * ( b2 - b1 ) / ( a2 - a1 );\n\n}\n\n/**\n * Returns the percentage in the closed interval `[0, 1]` of the given value\n * between the start and end point.\n *\n * @param {number} x - The start point\n * @param {number} y - The end point.\n * @param {number} value - A value between start and end.\n * @return {number} The interpolation factor.\n */\nfunction inverseLerp( x, y, value ) {\n\n\t// https://www.gamedev.net/tutorials/programming/general-and-gameplay-programming/inverse-lerp-a-super-useful-yet-often-overlooked-function-r5230/\n\n\tif ( x !== y ) {\n\n\t\treturn ( value - x ) / ( y - x );\n\n\t} else {\n\n\t\treturn 0;\n\n\t}\n\n}\n\n/**\n * Returns a value linearly interpolated from two known points based on the given interval -\n * `t = 0` will return `x` and `t = 1` will return `y`.\n *\n * @param {number} x - The start point\n * @param {number} y - The end point.\n * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n * @return {number} The interpolated value.\n */\nfunction lerp( x, y, t ) {\n\n\treturn ( 1 - t ) * x + t * y;\n\n}\n\n/**\n * Smoothly interpolate a number from `x` to `y` in  a spring-like manner using a delta\n * time to maintain frame rate independent movement. For details, see\n * [Frame rate independent damping using lerp](http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/).\n *\n * @param {number} x - The current point.\n * @param {number} y - The target point.\n * @param {number} lambda - A higher lambda value will make the movement more sudden,\n * and a lower value will make the movement more gradual.\n * @param {number} dt - Delta time in seconds.\n * @return {number} The interpolated value.\n */\nfunction damp( x, y, lambda, dt ) {\n\n\treturn lerp( x, y, 1 - Math.exp( - lambda * dt ) );\n\n}\n\n/**\n * Returns a value that alternates between `0` and the given `length` parameter.\n *\n * @param {number} x - The value to pingpong.\n * @param {number} [length=1] - The positive value the function will pingpong to.\n * @return {number} The alternated value.\n */\nfunction pingpong( x, length = 1 ) {\n\n\t// https://www.desmos.com/calculator/vcsjnyz7x4\n\n\treturn length - Math.abs( euclideanModulo( x, length * 2 ) - length );\n\n}\n\n/**\n * Returns a value in the range `[0,1]` that represents the percentage that `x` has\n * moved between `min` and `max`, but smoothed or slowed down the closer `x` is to\n * the `min` and `max`.\n *\n * See [Smoothstep](http://en.wikipedia.org/wiki/Smoothstep) for more details.\n *\n * @param {number} x - The value to evaluate based on its position between min and max.\n * @param {number} min - The min value. Any x value below min will be `0`.\n * @param {number} max - The max value. Any x value above max will be `1`.\n * @return {number} The alternated value.\n */\nfunction smoothstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * ( 3 - 2 * x );\n\n}\n\n/**\n * A [variation on smoothstep](https://en.wikipedia.org/wiki/Smoothstep#Variations)\n * that has zero 1st and 2nd order derivatives at x=0 and x=1.\n *\n * @param {number} x - The value to evaluate based on its position between min and max.\n * @param {number} min - The min value. Any x value below min will be `0`.\n * @param {number} max - The max value. Any x value above max will be `1`.\n * @return {number} The alternated value.\n */\nfunction smootherstep( x, min, max ) {\n\n\tif ( x <= min ) return 0;\n\tif ( x >= max ) return 1;\n\n\tx = ( x - min ) / ( max - min );\n\n\treturn x * x * x * ( x * ( x * 6 - 15 ) + 10 );\n\n}\n\n/**\n * Returns a random integer from `<low, high>` interval.\n *\n * @param {number} low - The lower value boundary.\n * @param {number} high - The upper value boundary\n * @return {number} A random integer.\n */\nfunction randInt( low, high ) {\n\n\treturn low + Math.floor( Math.random() * ( high - low + 1 ) );\n\n}\n\n/**\n * Returns a random float from `<low, high>` interval.\n *\n * @param {number} low - The lower value boundary.\n * @param {number} high - The upper value boundary\n * @return {number} A random float.\n */\nfunction randFloat( low, high ) {\n\n\treturn low + Math.random() * ( high - low );\n\n}\n\n/**\n * Returns a random integer from `<-range/2, range/2>` interval.\n *\n * @param {number} range - Defines the value range.\n * @return {number} A random float.\n */\nfunction randFloatSpread( range ) {\n\n\treturn range * ( 0.5 - Math.random() );\n\n}\n\n/**\n * Returns a deterministic pseudo-random float in the interval `[0, 1]`.\n *\n * @param {number} [s] - The integer seed.\n * @return {number} A random float.\n */\nfunction seededRandom( s ) {\n\n\tif ( s !== undefined ) _seed = s;\n\n\t// Mulberry32 generator\n\n\tlet t = _seed += 0x6D2B79F5;\n\n\tt = Math.imul( t ^ t >>> 15, t | 1 );\n\n\tt ^= t + Math.imul( t ^ t >>> 7, t | 61 );\n\n\treturn ( ( t ^ t >>> 14 ) >>> 0 ) / 4294967296;\n\n}\n\n/**\n * Converts degrees to radians.\n *\n * @param {number} degrees - A value in degrees.\n * @return {number} The converted value in radians.\n */\nfunction degToRad( degrees ) {\n\n\treturn degrees * DEG2RAD;\n\n}\n\n/**\n * Converts radians to degrees.\n *\n * @param {number} radians - A value in radians.\n * @return {number} The converted value in degrees.\n */\nfunction radToDeg( radians ) {\n\n\treturn radians * RAD2DEG;\n\n}\n\n/**\n * Returns `true` if the given number is a power of two.\n *\n * @param {number} value - The value to check.\n * @return {boolean} Whether the given number is a power of two or not.\n */\nfunction isPowerOfTwo( value ) {\n\n\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n}\n\n/**\n * Returns the smallest power of two that is greater than or equal to the given number.\n *\n * @param {number} value - The value to find a POT for.\n * @return {number} The smallest power of two that is greater than or equal to the given number.\n */\nfunction ceilPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.ceil( Math.log( value ) / Math.LN2 ) );\n\n}\n\n/**\n * Returns the largest power of two that is less than or equal to the given number.\n *\n * @param {number} value - The value to find a POT for.\n * @return {number} The largest power of two that is less than or equal to the given number.\n */\nfunction floorPowerOfTwo( value ) {\n\n\treturn Math.pow( 2, Math.floor( Math.log( value ) / Math.LN2 ) );\n\n}\n\n/**\n * Sets the given quaternion from the [Intrinsic Proper Euler Angles](https://en.wikipedia.org/wiki/Euler_angles)\n * defined by the given angles and order.\n *\n * Rotations are applied to the axes in the order specified by order:\n * rotation by angle `a` is applied first, then by angle `b`, then by angle `c`.\n *\n * @param {Quaternion} q - The quaternion to set.\n * @param {number} a - The rotation applied to the first axis, in radians.\n * @param {number} b - The rotation applied to the second axis, in radians.\n * @param {number} c - The rotation applied to the third axis, in radians.\n * @param {('XYX'|'XZX'|'YXY'|'YZY'|'ZXZ'|'ZYZ')} order - A string specifying the axes order.\n */\nfunction setQuaternionFromProperEuler( q, a, b, c, order ) {\n\n\tconst cos = Math.cos;\n\tconst sin = Math.sin;\n\n\tconst c2 = cos( b / 2 );\n\tconst s2 = sin( b / 2 );\n\n\tconst c13 = cos( ( a + c ) / 2 );\n\tconst s13 = sin( ( a + c ) / 2 );\n\n\tconst c1_3 = cos( ( a - c ) / 2 );\n\tconst s1_3 = sin( ( a - c ) / 2 );\n\n\tconst c3_1 = cos( ( c - a ) / 2 );\n\tconst s3_1 = sin( ( c - a ) / 2 );\n\n\tswitch ( order ) {\n\n\t\tcase 'XYX':\n\t\t\tq.set( c2 * s13, s2 * c1_3, s2 * s1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YZY':\n\t\t\tq.set( s2 * s1_3, c2 * s13, s2 * c1_3, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZXZ':\n\t\t\tq.set( s2 * c1_3, s2 * s1_3, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'XZX':\n\t\t\tq.set( c2 * s13, s2 * s3_1, s2 * c3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'YXY':\n\t\t\tq.set( s2 * c3_1, c2 * s13, s2 * s3_1, c2 * c13 );\n\t\t\tbreak;\n\n\t\tcase 'ZYZ':\n\t\t\tq.set( s2 * s3_1, s2 * c3_1, c2 * s13, c2 * c13 );\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\twarn( 'MathUtils: .setQuaternionFromProperEuler() encountered an unknown order: ' + order );\n\n\t}\n\n}\n\n/**\n * Denormalizes the given value according to the given typed array.\n *\n * @param {number} value - The value to denormalize.\n * @param {TypedArray} array - The typed array that defines the data type of the value.\n * @return {number} The denormalize (float) value in the range `[0,1]`.\n */\nfunction denormalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn value / 4294967295.0;\n\n\t\tcase Uint16Array:\n\n\t\t\treturn value / 65535.0;\n\n\t\tcase Uint8Array:\n\n\t\t\treturn value / 255.0;\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.max( value / 2147483647.0, -1 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.max( value / 32767.0, -1 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.max( value / 127.0, -1 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\n/**\n * Normalizes the given value according to the given typed array.\n *\n * @param {number} value - The float value in the range `[0,1]` to normalize.\n * @param {TypedArray} array - The typed array that defines the data type of the value.\n * @return {number} The normalize value.\n */\nfunction normalize( value, array ) {\n\n\tswitch ( array.constructor ) {\n\n\t\tcase Float32Array:\n\n\t\t\treturn value;\n\n\t\tcase Uint32Array:\n\n\t\t\treturn Math.round( value * 4294967295.0 );\n\n\t\tcase Uint16Array:\n\n\t\t\treturn Math.round( value * 65535.0 );\n\n\t\tcase Uint8Array:\n\n\t\t\treturn Math.round( value * 255.0 );\n\n\t\tcase Int32Array:\n\n\t\t\treturn Math.round( value * 2147483647.0 );\n\n\t\tcase Int16Array:\n\n\t\t\treturn Math.round( value * 32767.0 );\n\n\t\tcase Int8Array:\n\n\t\t\treturn Math.round( value * 127.0 );\n\n\t\tdefault:\n\n\t\t\tthrow new Error( 'Invalid component type.' );\n\n\t}\n\n}\n\n/**\n * @class\n * @classdesc A collection of math utility functions.\n * @hideconstructor\n */\nconst MathUtils = {\n\tDEG2RAD: DEG2RAD,\n\tRAD2DEG: RAD2DEG,\n\t/**\n\t * Generate a [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier)\n\t * (universally unique identifier).\n\t *\n\t * @static\n\t * @method\n\t * @return {string} The UUID.\n\t */\n\tgenerateUUID: generateUUID,\n\t/**\n\t * Clamps the given value between min and max.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to clamp.\n\t * @param {number} min - The min value.\n\t * @param {number} max - The max value.\n\t * @return {number} The clamped value.\n\t */\n\tclamp: clamp,\n\t/**\n\t * Computes the Euclidean modulo of the given parameters that\n\t * is `( ( n % m ) + m ) % m`.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} n - The first parameter.\n\t * @param {number} m - The second parameter.\n\t * @return {number} The Euclidean modulo.\n\t */\n\teuclideanModulo: euclideanModulo,\n\t/**\n\t * Performs a linear mapping from range `<a1, a2>` to range `<b1, b2>`\n\t * for the given value.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to be mapped.\n\t * @param {number} a1 - Minimum value for range A.\n\t * @param {number} a2 - Maximum value for range A.\n\t * @param {number} b1 - Minimum value for range B.\n\t * @param {number} b2 - Maximum value for range B.\n\t * @return {number} The mapped value.\n\t */\n\tmapLinear: mapLinear,\n\t/**\n\t * Returns the percentage in the closed interval `[0, 1]` of the given value\n\t * between the start and end point.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The start point\n\t * @param {number} y - The end point.\n\t * @param {number} value - A value between start and end.\n\t * @return {number} The interpolation factor.\n\t */\n\tinverseLerp: inverseLerp,\n\t/**\n\t * Returns a value linearly interpolated from two known points based on the given interval -\n\t * `t = 0` will return `x` and `t = 1` will return `y`.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The start point\n\t * @param {number} y - The end point.\n\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t * @return {number} The interpolated value.\n\t */\n\tlerp: lerp,\n\t/**\n\t * Smoothly interpolate a number from `x` to `y` in  a spring-like manner using a delta\n\t * time to maintain frame rate independent movement. For details, see\n\t * [Frame rate independent damping using lerp](http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/).\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The current point.\n\t * @param {number} y - The target point.\n\t * @param {number} lambda - A higher lambda value will make the movement more sudden,\n\t * and a lower value will make the movement more gradual.\n\t * @param {number} dt - Delta time in seconds.\n\t * @return {number} The interpolated value.\n\t */\n\tdamp: damp,\n\t/**\n\t * Returns a value that alternates between `0` and the given `length` parameter.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to pingpong.\n\t * @param {number} [length=1] - The positive value the function will pingpong to.\n\t * @return {number} The alternated value.\n\t */\n\tpingpong: pingpong,\n\t/**\n\t * Returns a value in the range `[0,1]` that represents the percentage that `x` has\n\t * moved between `min` and `max`, but smoothed or slowed down the closer `x` is to\n\t * the `min` and `max`.\n\t *\n\t * See [Smoothstep](http://en.wikipedia.org/wiki/Smoothstep) for more details.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to evaluate based on its position between min and max.\n\t * @param {number} min - The min value. Any x value below min will be `0`.\n\t * @param {number} max - The max value. Any x value above max will be `1`.\n\t * @return {number} The alternated value.\n\t */\n\tsmoothstep: smoothstep,\n\t/**\n\t * A [variation on smoothstep](https://en.wikipedia.org/wiki/Smoothstep#Variations)\n\t * that has zero 1st and 2nd order derivatives at x=0 and x=1.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} x - The value to evaluate based on its position between min and max.\n\t * @param {number} min - The min value. Any x value below min will be `0`.\n\t * @param {number} max - The max value. Any x value above max will be `1`.\n\t * @return {number} The alternated value.\n\t */\n\tsmootherstep: smootherstep,\n\t/**\n\t * Returns a random integer from `<low, high>` interval.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} low - The lower value boundary.\n\t * @param {number} high - The upper value boundary\n\t * @return {number} A random integer.\n\t */\n\trandInt: randInt,\n\t/**\n\t * Returns a random float from `<low, high>` interval.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} low - The lower value boundary.\n\t * @param {number} high - The upper value boundary\n\t * @return {number} A random float.\n\t */\n\trandFloat: randFloat,\n\t/**\n\t * Returns a random integer from `<-range/2, range/2>` interval.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} range - Defines the value range.\n\t * @return {number} A random float.\n\t */\n\trandFloatSpread: randFloatSpread,\n\t/**\n\t * Returns a deterministic pseudo-random float in the interval `[0, 1]`.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} [s] - The integer seed.\n\t * @return {number} A random float.\n\t */\n\tseededRandom: seededRandom,\n\t/**\n\t * Converts degrees to radians.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} degrees - A value in degrees.\n\t * @return {number} The converted value in radians.\n\t */\n\tdegToRad: degToRad,\n\t/**\n\t * Converts radians to degrees.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} radians - A value in radians.\n\t * @return {number} The converted value in degrees.\n\t */\n\tradToDeg: radToDeg,\n\t/**\n\t * Returns `true` if the given number is a power of two.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to check.\n\t * @return {boolean} Whether the given number is a power of two or not.\n\t */\n\tisPowerOfTwo: isPowerOfTwo,\n\t/**\n\t * Returns the smallest power of two that is greater than or equal to the given number.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to find a POT for.\n\t * @return {number} The smallest power of two that is greater than or equal to the given number.\n\t */\n\tceilPowerOfTwo: ceilPowerOfTwo,\n\t/**\n\t * Returns the largest power of two that is less than or equal to the given number.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to find a POT for.\n\t * @return {number} The largest power of two that is less than or equal to the given number.\n\t */\n\tfloorPowerOfTwo: floorPowerOfTwo,\n\t/**\n\t * Sets the given quaternion from the [Intrinsic Proper Euler Angles](https://en.wikipedia.org/wiki/Euler_angles)\n\t * defined by the given angles and order.\n\t *\n\t * Rotations are applied to the axes in the order specified by order:\n\t * rotation by angle `a` is applied first, then by angle `b`, then by angle `c`.\n\t *\n\t * @static\n\t * @method\n\t * @param {Quaternion} q - The quaternion to set.\n\t * @param {number} a - The rotation applied to the first axis, in radians.\n\t * @param {number} b - The rotation applied to the second axis, in radians.\n\t * @param {number} c - The rotation applied to the third axis, in radians.\n\t * @param {('XYX'|'XZX'|'YXY'|'YZY'|'ZXZ'|'ZYZ')} order - A string specifying the axes order.\n\t */\n\tsetQuaternionFromProperEuler: setQuaternionFromProperEuler,\n\t/**\n\t * Normalizes the given value according to the given typed array.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The float value in the range `[0,1]` to normalize.\n\t * @param {TypedArray} array - The typed array that defines the data type of the value.\n\t * @return {number} The normalize value.\n\t */\n\tnormalize: normalize,\n\t/**\n\t * Denormalizes the given value according to the given typed array.\n\t *\n\t * @static\n\t * @method\n\t * @param {number} value - The value to denormalize.\n\t * @param {TypedArray} array - The typed array that defines the data type of the value.\n\t * @return {number} The denormalize (float) value in the range `[0,1]`.\n\t */\n\tdenormalize: denormalize\n};\n\n/**\n * Class representing a 2D vector. A 2D vector is an ordered pair of numbers\n * (labeled x and y), which can be used to represent a number of things, such as:\n *\n * - A point in 2D space (i.e. a position on a plane).\n * - A direction and length across a plane. In three.js the length will\n * always be the Euclidean distance(straight-line distance) from `(0, 0)` to `(x, y)`\n * and the direction is also measured from `(0, 0)` towards `(x, y)`.\n * - Any arbitrary ordered pair of numbers.\n *\n * There are other things a 2D vector can be used to represent, such as\n * momentum vectors, complex numbers and so on, however these are the most\n * common uses in three.js.\n *\n * Iterating through a vector instance will yield its components `(x, y)` in\n * the corresponding order.\n * ```js\n * const a = new THREE.Vector2( 0, 1 );\n *\n * //no arguments; will be initialised to (0, 0)\n * const b = new THREE.Vector2( );\n *\n * const d = a.distanceTo( b );\n * ```\n */\nclass Vector2 {\n\n\t/**\n\t * Constructs a new 2D vector.\n\t *\n\t * @param {number} [x=0] - The x value of this vector.\n\t * @param {number} [y=0] - The y value of this vector.\n\t */\n\tconstructor( x = 0, y = 0 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tVector2.prototype.isVector2 = true;\n\n\t\t/**\n\t\t * The x value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.x = x;\n\n\t\t/**\n\t\t * The y value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.y = y;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector2#x}.\n\t *\n\t * @type {number}\n\t */\n\tget width() {\n\n\t\treturn this.x;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.x = value;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector2#y}.\n\t *\n\t * @type {number}\n\t */\n\tget height() {\n\n\t\treturn this.y;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.y = value;\n\n\t}\n\n\t/**\n\t * Sets the vector components.\n\t *\n\t * @param {number} x - The value of the x component.\n\t * @param {number} y - The value of the y component.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tset( x, y ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the same value.\n\t *\n\t * @param {number} scalar - The value to set for all vector components.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's x component to the given value\n\t *\n\t * @param {number} x - The value to set.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's y component to the given value\n\t *\n\t * @param {number} y - The value to set.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Allows to set a vector component with an index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y.\n\t * @param {number} value - The value to set.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the value of the vector component which matches the given index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y.\n\t * @return {number} A vector component value.\n\t */\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new vector with copied values from this instance.\n\t *\n\t * @return {Vector2} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y );\n\n\t}\n\n\t/**\n\t * Copies the values of the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to copy.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to add.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to all components of this instance.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector2} a - The first vector.\n\t * @param {Vector2} b - The second vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector scaled by the given factor to this instance.\n\t *\n\t * @param {Vector2} v - The vector.\n\t * @param {number} s - The factor that scales `v`.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vector from this instance.\n\t *\n\t * @param {Vector2} v - The vector to subtract.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given scalar value from all components of this instance.\n\t *\n\t * @param {number} s - The scalar to subtract.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector2} a - The first vector.\n\t * @param {Vector2} b - The second vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vector with this instance.\n\t *\n\t * @param {Vector2} v - The vector to multiply.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with all components of this instance.\n\t *\n\t * @param {number} scalar - The scalar to multiply.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this instance by the given vector.\n\t *\n\t * @param {Vector2} v - The vector to divide.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this vector by the given scalar.\n\t *\n\t * @param {number} scalar - The scalar to divide.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\t/**\n\t * Multiplies this vector (with an implicit 1 as the 3rd component) by\n\t * the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix to apply.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ];\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y value is greater than the given vector's x or y\n\t * value, replace that value with the corresponding min value.\n\t *\n\t * @param {Vector2} v - The vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y value is less than the given vector's x or y\n\t * value, replace that value with the corresponding max value.\n\t *\n\t * @param {Vector2} v - The vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y value is greater than the max vector's x or y\n\t * value, it is replaced by the corresponding value.\n\t * If this vector's x or y value is less than the min vector's x or y value,\n\t * it is replaced by the corresponding value.\n\t *\n\t * @param {Vector2} min - The minimum x and y values.\n\t * @param {Vector2} max - The maximum x and y values in the desired range.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = clamp( this.x, min.x, max.x );\n\t\tthis.y = clamp( this.y, min.y, max.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x or y values are greater than the max value, they are\n\t * replaced by the max value.\n\t * If this vector's x or y values are less than the min value, they are\n\t * replaced by the min value.\n\t *\n\t * @param {number} minVal - The minimum value the components will be clamped to.\n\t * @param {number} maxVal - The maximum value the components will be clamped to.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = clamp( this.x, minVal, maxVal );\n\t\tthis.y = clamp( this.y, minVal, maxVal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's length is greater than the max value, it is replaced by\n\t * the max value.\n\t * If this vector's length is less than the min value, it is replaced by the\n\t * min value.\n\t *\n\t * @param {number} min - The minimum value the vector length will be clamped to.\n\t * @param {number} max - The maximum value the vector length will be clamped to.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( clamp( length, min, max ) );\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded down to the nearest integer value.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded up to the nearest integer value.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded to the nearest integer value\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded towards zero (up if negative,\n\t * down if positive) to an integer value.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this vector - i.e. sets x = -x and y = -y.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of the given vector with this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y;\n\n\t}\n\n\t/**\n\t * Calculates the cross product of the given vector with this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the cross product with.\n\t * @return {number} The result of the cross product.\n\t */\n\tcross( v ) {\n\n\t\treturn this.x * v.y - this.y * v.x;\n\n\t}\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from\n\t * (0, 0) to (x, y). If you are comparing the lengths of vectors, you should\n\t * compare the length squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @return {number} The square length of this vector.\n\t */\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y;\n\n\t}\n\n\t/**\n\t * Computes the  Euclidean length (straight-line length) from (0, 0) to (x, y).\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y );\n\n\t}\n\n\t/**\n\t * Computes the Manhattan length of this vector.\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y );\n\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector\n\t * with the same direction as this one, but with a vector length of `1`.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\t/**\n\t * Computes the angle in radians of this vector with respect to the positive x-axis.\n\t *\n\t * @return {number} The angle in radians.\n\t */\n\tangle() {\n\n\t\tconst angle = Math.atan2( - this.y, - this.x ) + Math.PI;\n\n\t\treturn angle;\n\n\t}\n\n\t/**\n\t * Returns the angle between the given vector and this instance in radians.\n\t *\n\t * @param {Vector2} v - The vector to compute the angle with.\n\t * @return {number} The angle in radians.\n\t */\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( clamp( theta, -1, 1 ) );\n\n\t}\n\n\t/**\n\t * Computes the distance from the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the distance to.\n\t * @return {number} The distance.\n\t */\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\t/**\n\t * Computes the squared distance from the given vector to this instance.\n\t * If you are just comparing the distance with another distance, you should compare\n\t * the distance squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @param {Vector2} v - The vector to compute the squared distance to.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y;\n\t\treturn dx * dx + dy * dy;\n\n\t}\n\n\t/**\n\t * Computes the Manhattan distance from the given vector to this instance.\n\t *\n\t * @param {Vector2} v - The vector to compute the Manhattan distance to.\n\t * @return {number} The Manhattan distance.\n\t */\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y );\n\n\t}\n\n\t/**\n\t * Sets this vector to a vector with the same direction as this one, but\n\t * with the specified length.\n\t *\n\t * @param {number} length - The new length of this vector.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vector and this instance, where\n\t * alpha is the percent distance along the line - alpha = 0 will be this\n\t * vector, and alpha = 1 will be the given one.\n\t *\n\t * @param {Vector2} v - The vector to interpolate towards.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vectors, where alpha is the percent\n\t * distance along the line - alpha = 0 will be first vector, and alpha = 1 will\n\t * be the second one. The result is stored in this instance.\n\t *\n\t * @param {Vector2} v1 - The first vector.\n\t * @param {Vector2} v2 - The second vector.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this vector is equal with the given one.\n\t *\n\t * @param {Vector2} v - The vector to test for equality.\n\t * @return {boolean} Whether this vector is equal with the given one.\n\t */\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) );\n\n\t}\n\n\t/**\n\t * Sets this vector's x value to be `array[ offset ]` and y\n\t * value to be `array[ offset + 1 ]`.\n\t *\n\t * @param {Array<number>} array - An array holding the vector component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this vector to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array<number>} [array=[]] - The target array holding the vector components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array<number>} The vector components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this vector from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding vector data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates this vector around the given center by the given angle.\n\t *\n\t * @param {Vector2} center - The point around which to rotate.\n\t * @param {number} angle - The angle to rotate, in radians.\n\t * @return {Vector2} A reference to this vector.\n\t */\n\trotateAround( center, angle ) {\n\n\t\tconst c = Math.cos( angle ), s = Math.sin( angle );\n\n\t\tconst x = this.x - center.x;\n\t\tconst y = this.y - center.y;\n\n\t\tthis.x = x * c - y * s + center.x;\n\t\tthis.y = x * s + y * c + center.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets each component of this vector to a pseudo-random value between `0` and\n\t * `1`, excluding `1`.\n\t *\n\t * @return {Vector2} A reference to this vector.\n\t */\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\n\t}\n\n}\n\n/**\n * Class for representing a Quaternion. Quaternions are used in three.js to represent rotations.\n *\n * Iterating through a vector instance will yield its components `(x, y, z, w)` in\n * the corresponding order.\n *\n * Note that three.js expects Quaternions to be normalized.\n * ```js\n * const quaternion = new THREE.Quaternion();\n * quaternion.setFromAxisAngle( new THREE.Vector3( 0, 1, 0 ), Math.PI / 2 );\n *\n * const vector = new THREE.Vector3( 1, 0, 0 );\n * vector.applyQuaternion( quaternion );\n * ```\n */\nclass Quaternion {\n\n\t/**\n\t * Constructs a new quaternion.\n\t *\n\t * @param {number} [x=0] - The x value of this quaternion.\n\t * @param {number} [y=0] - The y value of this quaternion.\n\t * @param {number} [z=0] - The z value of this quaternion.\n\t * @param {number} [w=1] - The w value of this quaternion.\n\t */\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isQuaternion = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t}\n\n\t/**\n\t * Interpolates between two quaternions via SLERP. This implementation assumes the\n\t * quaternion data are managed in flat arrays.\n\t *\n\t * @param {Array<number>} dst - The destination array.\n\t * @param {number} dstOffset - An offset into the destination array.\n\t * @param {Array<number>} src0 - The source array of the first quaternion.\n\t * @param {number} srcOffset0 - An offset into the first source array.\n\t * @param {Array<number>} src1 -  The source array of the second quaternion.\n\t * @param {number} srcOffset1 - An offset into the second source array.\n\t * @param {number} t - The interpolation factor in the range `[0,1]`.\n\t * @see {@link Quaternion#slerp}\n\t */\n\tstatic slerpFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1, t ) {\n\n\t\tlet x0 = src0[ srcOffset0 + 0 ],\n\t\t\ty0 = src0[ srcOffset0 + 1 ],\n\t\t\tz0 = src0[ srcOffset0 + 2 ],\n\t\t\tw0 = src0[ srcOffset0 + 3 ];\n\n\t\tlet x1 = src1[ srcOffset1 + 0 ],\n\t\t\ty1 = src1[ srcOffset1 + 1 ],\n\t\t\tz1 = src1[ srcOffset1 + 2 ],\n\t\t\tw1 = src1[ srcOffset1 + 3 ];\n\n\t\tif ( t <= 0 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x0;\n\t\t\tdst[ dstOffset + 1 ] = y0;\n\t\t\tdst[ dstOffset + 2 ] = z0;\n\t\t\tdst[ dstOffset + 3 ] = w0;\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( t >= 1 ) {\n\n\t\t\tdst[ dstOffset + 0 ] = x1;\n\t\t\tdst[ dstOffset + 1 ] = y1;\n\t\t\tdst[ dstOffset + 2 ] = z1;\n\t\t\tdst[ dstOffset + 3 ] = w1;\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( w0 !== w1 || x0 !== x1 || y0 !== y1 || z0 !== z1 ) {\n\n\t\t\tlet dot = x0 * x1 + y0 * y1 + z0 * z1 + w0 * w1;\n\n\t\t\tif ( dot < 0 ) {\n\n\t\t\t\tx1 = - x1;\n\t\t\t\ty1 = - y1;\n\t\t\t\tz1 = - z1;\n\t\t\t\tw1 = - w1;\n\n\t\t\t\tdot = - dot;\n\n\t\t\t}\n\n\t\t\tlet s = 1 - t;\n\n\t\t\tif ( dot < 0.9995 ) {\n\n\t\t\t\t// slerp\n\n\t\t\t\tconst theta = Math.acos( dot );\n\t\t\t\tconst sin = Math.sin( theta );\n\n\t\t\t\ts = Math.sin( s * theta ) / sin;\n\t\t\t\tt = Math.sin( t * theta ) / sin;\n\n\t\t\t\tx0 = x0 * s + x1 * t;\n\t\t\t\ty0 = y0 * s + y1 * t;\n\t\t\t\tz0 = z0 * s + z1 * t;\n\t\t\t\tw0 = w0 * s + w1 * t;\n\n\t\t\t} else {\n\n\t\t\t\t// for small angles, lerp then normalize\n\n\t\t\t\tx0 = x0 * s + x1 * t;\n\t\t\t\ty0 = y0 * s + y1 * t;\n\t\t\t\tz0 = z0 * s + z1 * t;\n\t\t\t\tw0 = w0 * s + w1 * t;\n\n\t\t\t\tconst f = 1 / Math.sqrt( x0 * x0 + y0 * y0 + z0 * z0 + w0 * w0 );\n\n\t\t\t\tx0 *= f;\n\t\t\t\ty0 *= f;\n\t\t\t\tz0 *= f;\n\t\t\t\tw0 *= f;\n\n\t\t\t}\n\n\t\t}\n\n\t\tdst[ dstOffset ] = x0;\n\t\tdst[ dstOffset + 1 ] = y0;\n\t\tdst[ dstOffset + 2 ] = z0;\n\t\tdst[ dstOffset + 3 ] = w0;\n\n\t}\n\n\t/**\n\t * Multiplies two quaternions. This implementation assumes the quaternion data are managed\n\t * in flat arrays.\n\t *\n\t * @param {Array<number>} dst - The destination array.\n\t * @param {number} dstOffset - An offset into the destination array.\n\t * @param {Array<number>} src0 - The source array of the first quaternion.\n\t * @param {number} srcOffset0 - An offset into the first source array.\n\t * @param {Array<number>} src1 -  The source array of the second quaternion.\n\t * @param {number} srcOffset1 - An offset into the second source array.\n\t * @return {Array<number>} The destination array.\n\t * @see {@link Quaternion#multiplyQuaternions}.\n\t */\n\tstatic multiplyQuaternionsFlat( dst, dstOffset, src0, srcOffset0, src1, srcOffset1 ) {\n\n\t\tconst x0 = src0[ srcOffset0 ];\n\t\tconst y0 = src0[ srcOffset0 + 1 ];\n\t\tconst z0 = src0[ srcOffset0 + 2 ];\n\t\tconst w0 = src0[ srcOffset0 + 3 ];\n\n\t\tconst x1 = src1[ srcOffset1 ];\n\t\tconst y1 = src1[ srcOffset1 + 1 ];\n\t\tconst z1 = src1[ srcOffset1 + 2 ];\n\t\tconst w1 = src1[ srcOffset1 + 3 ];\n\n\t\tdst[ dstOffset ] = x0 * w1 + w0 * x1 + y0 * z1 - z0 * y1;\n\t\tdst[ dstOffset + 1 ] = y0 * w1 + w0 * y1 + z0 * x1 - x0 * z1;\n\t\tdst[ dstOffset + 2 ] = z0 * w1 + w0 * z1 + x0 * y1 - y0 * x1;\n\t\tdst[ dstOffset + 3 ] = w0 * w1 - x0 * x1 - y0 * y1 - z0 * z1;\n\n\t\treturn dst;\n\n\t}\n\n\t/**\n\t * The x value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The y value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The z value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The w value of this quaternion.\n\t *\n\t * @type {number}\n\t * @default 1\n\t */\n\tget w() {\n\n\t\treturn this._w;\n\n\t}\n\n\tset w( value ) {\n\n\t\tthis._w = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * Sets the quaternion components.\n\t *\n\t * @param {number} x - The x value of this quaternion.\n\t * @param {number} y - The y value of this quaternion.\n\t * @param {number} z - The z value of this quaternion.\n\t * @param {number} w - The w value of this quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tset( x, y, z, w ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._w = w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new quaternion with copied values from this instance.\n\t *\n\t * @return {Quaternion} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._w );\n\n\t}\n\n\t/**\n\t * Copies the values of the given quaternion to this instance.\n\t *\n\t * @param {Quaternion} quaternion - The quaternion to copy.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tcopy( quaternion ) {\n\n\t\tthis._x = quaternion.x;\n\t\tthis._y = quaternion.y;\n\t\tthis._z = quaternion.z;\n\t\tthis._w = quaternion.w;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion from the rotation specified by the given\n\t * Euler angles.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromEuler( euler, update = true ) {\n\n\t\tconst x = euler._x, y = euler._y, z = euler._z, order = euler._order;\n\n\t\t// http://www.mathworks.com/matlabcentral/fileexchange/\n\t\t// \t20696-function-to-convert-between-dcm-euler-angles-quaternions-and-euler-vectors/\n\t\t//\tcontent/SpinCalc.m\n\n\t\tconst cos = Math.cos;\n\t\tconst sin = Math.sin;\n\n\t\tconst c1 = cos( x / 2 );\n\t\tconst c2 = cos( y / 2 );\n\t\tconst c3 = cos( z / 2 );\n\n\t\tconst s1 = sin( x / 2 );\n\t\tconst s2 = sin( y / 2 );\n\t\tconst s3 = sin( z / 2 );\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\t\t\t\tthis._x = s1 * c2 * c3 + c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 + s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 - s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 - s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\t\t\t\tthis._x = s1 * c2 * c3 - c1 * s2 * s3;\n\t\t\t\tthis._y = c1 * s2 * c3 - s1 * c2 * s3;\n\t\t\t\tthis._z = c1 * c2 * s3 + s1 * s2 * c3;\n\t\t\t\tthis._w = c1 * c2 * c3 + s1 * s2 * s3;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\twarn( 'Quaternion: .setFromEuler() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion from the given axis and angle.\n\t *\n\t * @param {Vector3} axis - The normalized axis.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromAxisAngle( axis, angle ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/angleToQuaternion/index.htm\n\n\t\tconst halfAngle = angle / 2, s = Math.sin( halfAngle );\n\n\t\tthis._x = axis.x * s;\n\t\tthis._y = axis.y * s;\n\t\tthis._z = axis.z * s;\n\t\tthis._w = Math.cos( halfAngle );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion from the given rotation matrix.\n\t *\n\t * @param {Matrix4} m - A 4x4 matrix of which the upper 3x3 of matrix is a pure rotation matrix (i.e. unscaled).\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToQuaternion/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tconst te = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ],\n\n\t\t\ttrace = m11 + m22 + m33;\n\n\t\tif ( trace > 0 ) {\n\n\t\t\tconst s = 0.5 / Math.sqrt( trace + 1.0 );\n\n\t\t\tthis._w = 0.25 / s;\n\t\t\tthis._x = ( m32 - m23 ) * s;\n\t\t\tthis._y = ( m13 - m31 ) * s;\n\t\t\tthis._z = ( m21 - m12 ) * s;\n\n\t\t} else if ( m11 > m22 && m11 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m11 - m22 - m33 );\n\n\t\t\tthis._w = ( m32 - m23 ) / s;\n\t\t\tthis._x = 0.25 * s;\n\t\t\tthis._y = ( m12 + m21 ) / s;\n\t\t\tthis._z = ( m13 + m31 ) / s;\n\n\t\t} else if ( m22 > m33 ) {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m22 - m11 - m33 );\n\n\t\t\tthis._w = ( m13 - m31 ) / s;\n\t\t\tthis._x = ( m12 + m21 ) / s;\n\t\t\tthis._y = 0.25 * s;\n\t\t\tthis._z = ( m23 + m32 ) / s;\n\n\t\t} else {\n\n\t\t\tconst s = 2.0 * Math.sqrt( 1.0 + m33 - m11 - m22 );\n\n\t\t\tthis._w = ( m21 - m12 ) / s;\n\t\t\tthis._x = ( m13 + m31 ) / s;\n\t\t\tthis._y = ( m23 + m32 ) / s;\n\t\t\tthis._z = 0.25 * s;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion to the rotation required to rotate the direction vector\n\t * `vFrom` to the direction vector `vTo`.\n\t *\n\t * @param {Vector3} vFrom - The first (normalized) direction vector.\n\t * @param {Vector3} vTo - The second (normalized) direction vector.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tsetFromUnitVectors( vFrom, vTo ) {\n\n\t\t// assumes direction vectors vFrom and vTo are normalized\n\n\t\tlet r = vFrom.dot( vTo ) + 1;\n\n\t\tif ( r < 1e-8 ) { // the epsilon value has been discussed in #31286\n\n\t\t\t// vFrom and vTo point in opposite directions\n\n\t\t\tr = 0;\n\n\t\t\tif ( Math.abs( vFrom.x ) > Math.abs( vFrom.z ) ) {\n\n\t\t\t\tthis._x = - vFrom.y;\n\t\t\t\tthis._y = vFrom.x;\n\t\t\t\tthis._z = 0;\n\t\t\t\tthis._w = r;\n\n\t\t\t} else {\n\n\t\t\t\tthis._x = 0;\n\t\t\t\tthis._y = - vFrom.z;\n\t\t\t\tthis._z = vFrom.y;\n\t\t\t\tthis._w = r;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// crossVectors( vFrom, vTo ); // inlined to avoid cyclic dependency on Vector3\n\n\t\t\tthis._x = vFrom.y * vTo.z - vFrom.z * vTo.y;\n\t\t\tthis._y = vFrom.z * vTo.x - vFrom.x * vTo.z;\n\t\t\tthis._z = vFrom.x * vTo.y - vFrom.y * vTo.x;\n\t\t\tthis._w = r;\n\n\t\t}\n\n\t\treturn this.normalize();\n\n\t}\n\n\t/**\n\t * Returns the angle between this quaternion and the given one in radians.\n\t *\n\t * @param {Quaternion} q - The quaternion to compute the angle with.\n\t * @return {number} The angle in radians.\n\t */\n\tangleTo( q ) {\n\n\t\treturn 2 * Math.acos( Math.abs( clamp( this.dot( q ), -1, 1 ) ) );\n\n\t}\n\n\t/**\n\t * Rotates this quaternion by a given angular step to the given quaternion.\n\t * The method ensures that the final quaternion will not overshoot `q`.\n\t *\n\t * @param {Quaternion} q - The target quaternion.\n\t * @param {number} step - The angular step in radians.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\trotateTowards( q, step ) {\n\n\t\tconst angle = this.angleTo( q );\n\n\t\tif ( angle === 0 ) return this;\n\n\t\tconst t = Math.min( 1, step / angle );\n\n\t\tthis.slerp( q, t );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this quaternion to the identity quaternion; that is, to the\n\t * quaternion that represents \"no rotation\".\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tidentity() {\n\n\t\treturn this.set( 0, 0, 0, 1 );\n\n\t}\n\n\t/**\n\t * Inverts this quaternion via {@link Quaternion#conjugate}. The\n\t * quaternion is assumed to have unit length.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tinvert() {\n\n\t\treturn this.conjugate();\n\n\t}\n\n\t/**\n\t * Returns the rotational conjugate of this quaternion. The conjugate of a\n\t * quaternion represents the same rotation in the opposite direction about\n\t * the rotational axis.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tconjugate() {\n\n\t\tthis._x *= -1;\n\t\tthis._y *= -1;\n\t\tthis._z *= -1;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of this quaternion and the given one.\n\t *\n\t * @param {Quaternion} v - The quaternion to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this._x * v._x + this._y * v._y + this._z * v._z + this._w * v._w;\n\n\t}\n\n\t/**\n\t * Computes the squared Euclidean length (straight-line length) of this quaternion,\n\t * considered as a 4 dimensional vector. This can be useful if you are comparing the\n\t * lengths of two quaternions, as this is a slightly more efficient calculation than\n\t * {@link Quaternion#length}.\n\t *\n\t * @return {number} The squared Euclidean length.\n\t */\n\tlengthSq() {\n\n\t\treturn this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w;\n\n\t}\n\n\t/**\n\t * Computes the Euclidean length (straight-line length) of this quaternion,\n\t * considered as a 4 dimensional vector.\n\t *\n\t * @return {number} The Euclidean length.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this._x * this._x + this._y * this._y + this._z * this._z + this._w * this._w );\n\n\t}\n\n\t/**\n\t * Normalizes this quaternion - that is, calculated the quaternion that performs\n\t * the same rotation as this one, but has a length equal to `1`.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tnormalize() {\n\n\t\tlet l = this.length();\n\n\t\tif ( l === 0 ) {\n\n\t\t\tthis._x = 0;\n\t\t\tthis._y = 0;\n\t\t\tthis._z = 0;\n\t\t\tthis._w = 1;\n\n\t\t} else {\n\n\t\t\tl = 1 / l;\n\n\t\t\tthis._x = this._x * l;\n\t\t\tthis._y = this._y * l;\n\t\t\tthis._z = this._z * l;\n\t\t\tthis._w = this._w * l;\n\n\t\t}\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies this quaternion by the given one.\n\t *\n\t * @param {Quaternion} q - The quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tmultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( this, q );\n\n\t}\n\n\t/**\n\t * Pre-multiplies this quaternion by the given one.\n\t *\n\t * @param {Quaternion} q - The quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tpremultiply( q ) {\n\n\t\treturn this.multiplyQuaternions( q, this );\n\n\t}\n\n\t/**\n\t * Multiplies the given quaternions and stores the result in this instance.\n\t *\n\t * @param {Quaternion} a - The first quaternion.\n\t * @param {Quaternion} b - The second quaternion.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tmultiplyQuaternions( a, b ) {\n\n\t\t// from http://www.euclideanspace.com/maths/algebra/realNormedAlgebra/quaternions/code/index.htm\n\n\t\tconst qax = a._x, qay = a._y, qaz = a._z, qaw = a._w;\n\t\tconst qbx = b._x, qby = b._y, qbz = b._z, qbw = b._w;\n\n\t\tthis._x = qax * qbw + qaw * qbx + qay * qbz - qaz * qby;\n\t\tthis._y = qay * qbw + qaw * qby + qaz * qbx - qax * qbz;\n\t\tthis._z = qaz * qbw + qaw * qbz + qax * qby - qay * qbx;\n\t\tthis._w = qaw * qbw - qax * qbx - qay * qby - qaz * qbz;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs a spherical linear interpolation between quaternions.\n\t *\n\t * @param {Quaternion} qb - The target quaternion.\n\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tslerp( qb, t ) {\n\n\t\tif ( t <= 0 ) return this;\n\n\t\tif ( t >= 1 ) return this.copy( qb ); // copy calls _onChangeCallback()\n\n\t\tlet x = qb._x, y = qb._y, z = qb._z, w = qb._w;\n\n\t\tlet dot = this.dot( qb );\n\n\t\tif ( dot < 0 ) {\n\n\t\t\tx = - x;\n\t\t\ty = - y;\n\t\t\tz = - z;\n\t\t\tw = - w;\n\n\t\t\tdot = - dot;\n\n\t\t}\n\n\t\tlet s = 1 - t;\n\n\t\tif ( dot < 0.9995 ) {\n\n\t\t\t// slerp\n\n\t\t\tconst theta = Math.acos( dot );\n\t\t\tconst sin = Math.sin( theta );\n\n\t\t\ts = Math.sin( s * theta ) / sin;\n\t\t\tt = Math.sin( t * theta ) / sin;\n\n\t\t\tthis._x = this._x * s + x * t;\n\t\t\tthis._y = this._y * s + y * t;\n\t\t\tthis._z = this._z * s + z * t;\n\t\t\tthis._w = this._w * s + w * t;\n\n\t\t\tthis._onChangeCallback();\n\n\t\t} else {\n\n\t\t\t// for small angles, lerp then normalize\n\n\t\t\tthis._x = this._x * s + x * t;\n\t\t\tthis._y = this._y * s + y * t;\n\t\t\tthis._z = this._z * s + z * t;\n\t\t\tthis._w = this._w * s + w * t;\n\n\t\t\tthis.normalize(); // normalize calls _onChangeCallback()\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs a spherical linear interpolation between the given quaternions\n\t * and stores the result in this quaternion.\n\t *\n\t * @param {Quaternion} qa - The source quaternion.\n\t * @param {Quaternion} qb - The target quaternion.\n\t * @param {number} t - The interpolation factor in the closed interval `[0, 1]`.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tslerpQuaternions( qa, qb, t ) {\n\n\t\treturn this.copy( qa ).slerp( qb, t );\n\n\t}\n\n\t/**\n\t * Sets this quaternion to a uniformly random, normalized quaternion.\n\t *\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\trandom() {\n\n\t\t// Ken Shoemake\n\t\t// Uniform random rotations\n\t\t// D. Kirk, editor, Graphics Gems III, pages 124-132. Academic Press, New York, 1992.\n\n\t\tconst theta1 = 2 * Math.PI * Math.random();\n\t\tconst theta2 = 2 * Math.PI * Math.random();\n\n\t\tconst x0 = Math.random();\n\t\tconst r1 = Math.sqrt( 1 - x0 );\n\t\tconst r2 = Math.sqrt( x0 );\n\n\t\treturn this.set(\n\t\t\tr1 * Math.sin( theta1 ),\n\t\t\tr1 * Math.cos( theta1 ),\n\t\t\tr2 * Math.sin( theta2 ),\n\t\t\tr2 * Math.cos( theta2 ),\n\t\t);\n\n\t}\n\n\t/**\n\t * Returns `true` if this quaternion is equal with the given one.\n\t *\n\t * @param {Quaternion} quaternion - The quaternion to test for equality.\n\t * @return {boolean} Whether this quaternion is equal with the given one.\n\t */\n\tequals( quaternion ) {\n\n\t\treturn ( quaternion._x === this._x ) && ( quaternion._y === this._y ) && ( quaternion._z === this._z ) && ( quaternion._w === this._w );\n\n\t}\n\n\t/**\n\t * Sets this quaternion's components from the given array.\n\t *\n\t * @param {Array<number>} array - An array holding the quaternion component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis._x = array[ offset ];\n\t\tthis._y = array[ offset + 1 ];\n\t\tthis._z = array[ offset + 2 ];\n\t\tthis._w = array[ offset + 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this quaternion to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array<number>} [array=[]] - The target array holding the quaternion components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array<number>} The quaternion components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._w;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this quaternion from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding quaternion data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Quaternion} A reference to this quaternion.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis._x = attribute.getX( index );\n\t\tthis._y = attribute.getY( index );\n\t\tthis._z = attribute.getZ( index );\n\t\tthis._w = attribute.getW( index );\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This methods defines the serialization result of this class. Returns the\n\t * numerical elements of this quaternion in an array of format `[x, y, z, w]`.\n\t *\n\t * @return {Array<number>} The serialized quaternion.\n\t */\n\ttoJSON() {\n\n\t\treturn this.toArray();\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._w;\n\n\t}\n\n}\n\n/**\n * Class representing a 3D vector. A 3D vector is an ordered triplet of numbers\n * (labeled x, y and z), which can be used to represent a number of things, such as:\n *\n * - A point in 3D space.\n * - A direction and length in 3D space. In three.js the length will\n * always be the Euclidean distance(straight-line distance) from `(0, 0, 0)` to `(x, y, z)`\n * and the direction is also measured from `(0, 0, 0)` towards `(x, y, z)`.\n * - Any arbitrary ordered triplet of numbers.\n *\n * There are other things a 3D vector can be used to represent, such as\n * momentum vectors and so on, however these are the most\n * common uses in three.js.\n *\n * Iterating through a vector instance will yield its components `(x, y, z)` in\n * the corresponding order.\n * ```js\n * const a = new THREE.Vector3( 0, 1, 0 );\n *\n * //no arguments; will be initialised to (0, 0, 0)\n * const b = new THREE.Vector3( );\n *\n * const d = a.distanceTo( b );\n * ```\n */\nclass Vector3 {\n\n\t/**\n\t * Constructs a new 3D vector.\n\t *\n\t * @param {number} [x=0] - The x value of this vector.\n\t * @param {number} [y=0] - The y value of this vector.\n\t * @param {number} [z=0] - The z value of this vector.\n\t */\n\tconstructor( x = 0, y = 0, z = 0 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tVector3.prototype.isVector3 = true;\n\n\t\t/**\n\t\t * The x value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.x = x;\n\n\t\t/**\n\t\t * The y value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.y = y;\n\n\t\t/**\n\t\t * The z value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.z = z;\n\n\t}\n\n\t/**\n\t * Sets the vector components.\n\t *\n\t * @param {number} x - The value of the x component.\n\t * @param {number} y - The value of the y component.\n\t * @param {number} z - The value of the z component.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tset( x, y, z ) {\n\n\t\tif ( z === undefined ) z = this.z; // sprite.scale.set(x,y)\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the same value.\n\t *\n\t * @param {number} scalar - The value to set for all vector components.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's x component to the given value\n\t *\n\t * @param {number} x - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's y component to the given value\n\t *\n\t * @param {number} y - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's z component to the given value\n\t *\n\t * @param {number} z - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Allows to set a vector component with an index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y, `2` equals to z.\n\t * @param {number} value - The value to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the value of the vector component which matches the given index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y, `2` equals to z.\n\t * @return {number} A vector component value.\n\t */\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new vector with copied values from this instance.\n\t *\n\t * @return {Vector3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z );\n\n\t}\n\n\t/**\n\t * Copies the values of the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to copy.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to add.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to all components of this instance.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector scaled by the given factor to this instance.\n\t *\n\t * @param {Vector3|Vector4} v - The vector.\n\t * @param {number} s - The factor that scales `v`.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vector from this instance.\n\t *\n\t * @param {Vector3} v - The vector to subtract.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given scalar value from all components of this instance.\n\t *\n\t * @param {number} s - The scalar to subtract.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vector with this instance.\n\t *\n\t * @param {Vector3} v - The vector to multiply.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with all components of this instance.\n\t *\n\t * @param {number} scalar - The scalar to multiply.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmultiplyVectors( a, b ) {\n\n\t\tthis.x = a.x * b.x;\n\t\tthis.y = a.y * b.y;\n\t\tthis.z = a.z * b.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given Euler rotation to this vector.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyEuler( euler ) {\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromEuler( euler ) );\n\n\t}\n\n\t/**\n\t * Applies a rotation specified by an axis and an angle to this vector.\n\t *\n\t * @param {Vector3} axis - A normalized vector representing the rotation axis.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyAxisAngle( axis, angle ) {\n\n\t\treturn this.applyQuaternion( _quaternion$4.setFromAxisAngle( axis, angle ) );\n\n\t}\n\n\t/**\n\t * Multiplies this vector with the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The 3x3 matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 3 ] * y + e[ 6 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 4 ] * y + e[ 7 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 5 ] * y + e[ 8 ] * z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies this vector by the given normal matrix and normalizes\n\t * the result.\n\t *\n\t * @param {Matrix3} m - The normal matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyNormalMatrix( m ) {\n\n\t\treturn this.applyMatrix3( m ).normalize();\n\n\t}\n\n\t/**\n\t * Multiplies this vector (with an implicit 1 in the 4th dimension) by m, and\n\t * divides by perspective.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tconst w = 1 / ( e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] );\n\n\t\tthis.x = ( e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] ) * w;\n\t\tthis.y = ( e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] ) * w;\n\t\tthis.z = ( e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] ) * w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given Quaternion to this vector.\n\t *\n\t * @param {Quaternion} q - The Quaternion.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tapplyQuaternion( q ) {\n\n\t\t// quaternion q is assumed to have unit length\n\n\t\tconst vx = this.x, vy = this.y, vz = this.z;\n\t\tconst qx = q.x, qy = q.y, qz = q.z, qw = q.w;\n\n\t\t// t = 2 * cross( q.xyz, v );\n\t\tconst tx = 2 * ( qy * vz - qz * vy );\n\t\tconst ty = 2 * ( qz * vx - qx * vz );\n\t\tconst tz = 2 * ( qx * vy - qy * vx );\n\n\t\t// v + q.w * t + cross( q.xyz, t );\n\t\tthis.x = vx + qw * tx + qy * tz - qz * ty;\n\t\tthis.y = vy + qw * ty + qz * tx - qx * tz;\n\t\tthis.z = vz + qw * tz + qx * ty - qy * tx;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Projects this vector from world space into the camera's normalized\n\t * device coordinate (NDC) space.\n\t *\n\t * @param {Camera} camera - The camera.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.matrixWorldInverse ).applyMatrix4( camera.projectionMatrix );\n\n\t}\n\n\t/**\n\t * Unprojects this vector from the camera's normalized device coordinate (NDC)\n\t * space into world space.\n\t *\n\t * @param {Camera} camera - The camera.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tunproject( camera ) {\n\n\t\treturn this.applyMatrix4( camera.projectionMatrixInverse ).applyMatrix4( camera.matrixWorld );\n\n\t}\n\n\t/**\n\t * Transforms the direction of this vector by a matrix (the upper left 3 x 3\n\t * subset of the given 4x4 matrix and then normalizes the result.\n\t *\n\t * @param {Matrix4} m - The matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\ttransformDirection( m ) {\n\n\t\t// input: THREE.Matrix4 affine matrix\n\t\t// vector interpreted as a direction\n\n\t\tconst x = this.x, y = this.y, z = this.z;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\treturn this.normalize();\n\n\t}\n\n\t/**\n\t * Divides this instance by the given vector.\n\t *\n\t * @param {Vector3} v - The vector to divide.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this vector by the given scalar.\n\t *\n\t * @param {number} scalar - The scalar to divide.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z value is greater than the given vector's x, y or z\n\t * value, replace that value with the corresponding min value.\n\t *\n\t * @param {Vector3} v - The vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z value is less than the given vector's x, y or z\n\t * value, replace that value with the corresponding max value.\n\t *\n\t * @param {Vector3} v - The vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z value is greater than the max vector's x, y or z\n\t * value, it is replaced by the corresponding value.\n\t * If this vector's x, y or z value is less than the min vector's x, y or z value,\n\t * it is replaced by the corresponding value.\n\t *\n\t * @param {Vector3} min - The minimum x, y and z values.\n\t * @param {Vector3} max - The maximum x, y and z values in the desired range.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = clamp( this.x, min.x, max.x );\n\t\tthis.y = clamp( this.y, min.y, max.y );\n\t\tthis.z = clamp( this.z, min.z, max.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y or z values are greater than the max value, they are\n\t * replaced by the max value.\n\t * If this vector's x, y or z values are less than the min value, they are\n\t * replaced by the min value.\n\t *\n\t * @param {number} minVal - The minimum value the components will be clamped to.\n\t * @param {number} maxVal - The maximum value the components will be clamped to.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = clamp( this.x, minVal, maxVal );\n\t\tthis.y = clamp( this.y, minVal, maxVal );\n\t\tthis.z = clamp( this.z, minVal, maxVal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's length is greater than the max value, it is replaced by\n\t * the max value.\n\t * If this vector's length is less than the min value, it is replaced by the\n\t * min value.\n\t *\n\t * @param {number} min - The minimum value the vector length will be clamped to.\n\t * @param {number} max - The maximum value the vector length will be clamped to.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( clamp( length, min, max ) );\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded down to the nearest integer value.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded up to the nearest integer value.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded to the nearest integer value\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded towards zero (up if negative,\n\t * down if positive) to an integer value.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\t\tthis.z = Math.trunc( this.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this vector - i.e. sets x = -x, y = -y and z = -z.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of the given vector with this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z;\n\n\t}\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from\n\t * (0, 0, 0) to (x, y, z). If you are comparing the lengths of vectors, you should\n\t * compare the length squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @return {number} The square length of this vector.\n\t */\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z;\n\n\t}\n\n\t/**\n\t * Computes the  Euclidean length (straight-line length) from (0, 0, 0) to (x, y, z).\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z );\n\n\t}\n\n\t/**\n\t * Computes the Manhattan length of this vector.\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z );\n\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector\n\t * with the same direction as this one, but with a vector length of `1`.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\t/**\n\t * Sets this vector to a vector with the same direction as this one, but\n\t * with the specified length.\n\t *\n\t * @param {number} length - The new length of this vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vector and this instance, where\n\t * alpha is the percent distance along the line - alpha = 0 will be this\n\t * vector, and alpha = 1 will be the given one.\n\t *\n\t * @param {Vector3} v - The vector to interpolate towards.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vectors, where alpha is the percent\n\t * distance along the line - alpha = 0 will be first vector, and alpha = 1 will\n\t * be the second one. The result is stored in this instance.\n\t *\n\t * @param {Vector3} v1 - The first vector.\n\t * @param {Vector3} v2 - The second vector.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the cross product of the given vector with this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the cross product with.\n\t * @return {Vector3} The result of the cross product.\n\t */\n\tcross( v ) {\n\n\t\treturn this.crossVectors( this, v );\n\n\t}\n\n\t/**\n\t * Calculates the cross product of the given vectors and stores the result\n\t * in this instance.\n\t *\n\t * @param {Vector3} a - The first vector.\n\t * @param {Vector3} b - The second vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tcrossVectors( a, b ) {\n\n\t\tconst ax = a.x, ay = a.y, az = a.z;\n\t\tconst bx = b.x, by = b.y, bz = b.z;\n\n\t\tthis.x = ay * bz - az * by;\n\t\tthis.y = az * bx - ax * bz;\n\t\tthis.z = ax * by - ay * bx;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Projects this vector onto the given one.\n\t *\n\t * @param {Vector3} v - The vector to project to.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tprojectOnVector( v ) {\n\n\t\tconst denominator = v.lengthSq();\n\n\t\tif ( denominator === 0 ) return this.set( 0, 0, 0 );\n\n\t\tconst scalar = v.dot( this ) / denominator;\n\n\t\treturn this.copy( v ).multiplyScalar( scalar );\n\n\t}\n\n\t/**\n\t * Projects this vector onto a plane by subtracting this\n\t * vector projected onto the plane's normal from this vector.\n\t *\n\t * @param {Vector3} planeNormal - The plane normal.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tprojectOnPlane( planeNormal ) {\n\n\t\t_vector$c.copy( this ).projectOnVector( planeNormal );\n\n\t\treturn this.sub( _vector$c );\n\n\t}\n\n\t/**\n\t * Reflects this vector off a plane orthogonal to the given normal vector.\n\t *\n\t * @param {Vector3} normal - The (normalized) normal vector.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\treflect( normal ) {\n\n\t\treturn this.sub( _vector$c.copy( normal ).multiplyScalar( 2 * this.dot( normal ) ) );\n\n\t}\n\t/**\n\t * Returns the angle between the given vector and this instance in radians.\n\t *\n\t * @param {Vector3} v - The vector to compute the angle with.\n\t * @return {number} The angle in radians.\n\t */\n\tangleTo( v ) {\n\n\t\tconst denominator = Math.sqrt( this.lengthSq() * v.lengthSq() );\n\n\t\tif ( denominator === 0 ) return Math.PI / 2;\n\n\t\tconst theta = this.dot( v ) / denominator;\n\n\t\t// clamp, to handle numerical problems\n\n\t\treturn Math.acos( clamp( theta, -1, 1 ) );\n\n\t}\n\n\t/**\n\t * Computes the distance from the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the distance to.\n\t * @return {number} The distance.\n\t */\n\tdistanceTo( v ) {\n\n\t\treturn Math.sqrt( this.distanceToSquared( v ) );\n\n\t}\n\n\t/**\n\t * Computes the squared distance from the given vector to this instance.\n\t * If you are just comparing the distance with another distance, you should compare\n\t * the distance squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @param {Vector3} v - The vector to compute the squared distance to.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceToSquared( v ) {\n\n\t\tconst dx = this.x - v.x, dy = this.y - v.y, dz = this.z - v.z;\n\n\t\treturn dx * dx + dy * dy + dz * dz;\n\n\t}\n\n\t/**\n\t * Computes the Manhattan distance from the given vector to this instance.\n\t *\n\t * @param {Vector3} v - The vector to compute the Manhattan distance to.\n\t * @return {number} The Manhattan distance.\n\t */\n\tmanhattanDistanceTo( v ) {\n\n\t\treturn Math.abs( this.x - v.x ) + Math.abs( this.y - v.y ) + Math.abs( this.z - v.z );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given spherical coordinates.\n\t *\n\t * @param {Spherical} s - The spherical coordinates.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromSpherical( s ) {\n\n\t\treturn this.setFromSphericalCoords( s.radius, s.phi, s.theta );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given spherical coordinates.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} phi - The phi angle in radians.\n\t * @param {number} theta - The theta angle in radians.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromSphericalCoords( radius, phi, theta ) {\n\n\t\tconst sinPhiRadius = Math.sin( phi ) * radius;\n\n\t\tthis.x = sinPhiRadius * Math.sin( theta );\n\t\tthis.y = Math.cos( phi ) * radius;\n\t\tthis.z = sinPhiRadius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given cylindrical coordinates.\n\t *\n\t * @param {Cylindrical} c - The cylindrical coordinates.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromCylindrical( c ) {\n\n\t\treturn this.setFromCylindricalCoords( c.radius, c.theta, c.y );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given cylindrical coordinates.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} theta - The theta angle in radians.\n\t * @param {number} y - The y value.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromCylindricalCoords( radius, theta, y ) {\n\n\t\tthis.x = radius * Math.sin( theta );\n\t\tthis.y = y;\n\t\tthis.z = radius * Math.cos( theta );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the position elements of the\n\t * given transformation matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the scale elements of the\n\t * given transformation matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixScale( m ) {\n\n\t\tconst sx = this.setFromMatrixColumn( m, 0 ).length();\n\t\tconst sy = this.setFromMatrixColumn( m, 1 ).length();\n\t\tconst sz = this.setFromMatrixColumn( m, 2 ).length();\n\n\t\tthis.x = sx;\n\t\tthis.y = sy;\n\t\tthis.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components from the specified matrix column.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @param {number} index - The column index.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrixColumn( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 4 );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the specified matrix column.\n\t *\n\t * @param {Matrix3} m - The 3x3 matrix.\n\t * @param {number} index - The column index.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromMatrix3Column( m, index ) {\n\n\t\treturn this.fromArray( m.elements, index * 3 );\n\n\t}\n\n\t/**\n\t * Sets the vector components from the given Euler angles.\n\t *\n\t * @param {Euler} e - The Euler angles to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromEuler( e ) {\n\n\t\tthis.x = e._x;\n\t\tthis.y = e._y;\n\t\tthis.z = e._z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components from the RGB components of the\n\t * given color.\n\t *\n\t * @param {Color} c - The color to set.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tsetFromColor( c ) {\n\n\t\tthis.x = c.r;\n\t\tthis.y = c.g;\n\t\tthis.z = c.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this vector is equal with the given one.\n\t *\n\t * @param {Vector3} v - The vector to test for equality.\n\t * @return {boolean} Whether this vector is equal with the given one.\n\t */\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) );\n\n\t}\n\n\t/**\n\t * Sets this vector's x value to be `array[ offset ]`, y value to be `array[ offset + 1 ]`\n\t * and z value to be `array[ offset + 2 ]`.\n\t *\n\t * @param {Array<number>} array - An array holding the vector component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this vector to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array<number>} [array=[]] - The target array holding the vector components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array<number>} The vector components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this vector from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding vector data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Vector3} A reference to this vector.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets each component of this vector to a pseudo-random value between `0` and\n\t * `1`, excluding `1`.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this vector to a uniformly random point on a unit sphere.\n\t *\n\t * @return {Vector3} A reference to this vector.\n\t */\n\trandomDirection() {\n\n\t\t// https://mathworld.wolfram.com/SpherePointPicking.html\n\n\t\tconst theta = Math.random() * Math.PI * 2;\n\t\tconst u = Math.random() * 2 - 1;\n\t\tconst c = Math.sqrt( 1 - u * u );\n\n\t\tthis.x = c * Math.cos( theta );\n\t\tthis.y = u;\n\t\tthis.z = c * Math.sin( theta );\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\n\t}\n\n}\n\nconst _vector$c = /*@__PURE__*/ new Vector3();\nconst _quaternion$4 = /*@__PURE__*/ new Quaternion();\n\n/**\n * Represents a 3x3 matrix.\n *\n * A Note on Row-Major and Column-Major Ordering:\n *\n * The constructor and {@link Matrix3#set} method take arguments in\n * [row-major](https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order)\n * order, while internally they are stored in the {@link Matrix3#elements} array in column-major order.\n * This means that calling:\n * ```js\n * const m = new THREE.Matrix();\n * m.set( 11, 12, 13,\n *        21, 22, 23,\n *        31, 32, 33 );\n * ```\n * will result in the elements array containing:\n * ```js\n * m.elements = [ 11, 21, 31,\n *                12, 22, 32,\n *                13, 23, 33 ];\n * ```\n * and internally all calculations are performed using column-major ordering.\n * However, as the actual ordering makes no difference mathematically and\n * most people are used to thinking about matrices in row-major order, the\n * three.js documentation shows matrices in row-major order. Just bear in\n * mind that if you are reading the source code, you'll have to take the\n * transpose of any matrices outlined here to make sense of the calculations.\n */\nclass Matrix3 {\n\n\t/**\n\t * Constructs a new 3x3 matrix. The arguments are supposed to be\n\t * in row-major order. If no arguments are provided, the constructor\n\t * initializes the matrix as an identity matrix.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t */\n\tconstructor( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tMatrix3.prototype.isMatrix3 = true;\n\n\t\t/**\n\t\t * A column-major list of matrix values.\n\t\t *\n\t\t * @type {Array<number>}\n\t\t */\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n13, n21, n22, n23, n31, n32, n33 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix.The arguments are supposed to be\n\t * in row-major order.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tset( n11, n12, n13, n21, n22, n23, n31, n32, n33 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 1 ] = n21; te[ 2 ] = n31;\n\t\tte[ 3 ] = n12; te[ 4 ] = n22; te[ 5 ] = n32;\n\t\tte[ 6 ] = n13; te[ 7 ] = n23; te[ 8 ] = n33;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix to the 3x3 identity matrix.\n\t *\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0,\n\t\t\t0, 1, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given matrix to this instance.\n\t *\n\t * @param {Matrix3} m - The matrix to copy.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ];\n\t\tte[ 3 ] = me[ 3 ]; te[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ];\n\t\tte[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ]; te[ 8 ] = me[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Extracts the basis of this matrix into the three axis vectors provided.\n\t *\n\t * @param {Vector3} xAxis - The basis's x axis.\n\t * @param {Vector3} yAxis - The basis's y axis.\n\t * @param {Vector3} zAxis - The basis's z axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\txAxis.setFromMatrix3Column( this, 0 );\n\t\tyAxis.setFromMatrix3Column( this, 1 );\n\t\tzAxis.setFromMatrix3Column( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Set this matrix to the upper 3x3 matrix of the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tsetFromMatrix4( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 4 ], me[ 8 ],\n\t\t\tme[ 1 ], me[ 5 ], me[ 9 ],\n\t\t\tme[ 2 ], me[ 6 ], me[ 10 ]\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Post-multiplies this matrix by the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix to multiply with.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\t/**\n\t * Pre-multiplies this matrix by the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix to multiply with.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\t/**\n\t * Multiples the given 3x3 matrices and stores the result\n\t * in this matrix.\n\t *\n\t * @param {Matrix3} a - The first matrix.\n\t * @param {Matrix3} b - The second matrix.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 3 ], a13 = ae[ 6 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 4 ], a23 = ae[ 7 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 5 ], a33 = ae[ 8 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 3 ], b13 = be[ 6 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 4 ], b23 = be[ 7 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 5 ], b33 = be[ 8 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31;\n\t\tte[ 3 ] = a11 * b12 + a12 * b22 + a13 * b32;\n\t\tte[ 6 ] = a11 * b13 + a12 * b23 + a13 * b33;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31;\n\t\tte[ 4 ] = a21 * b12 + a22 * b22 + a23 * b32;\n\t\tte[ 7 ] = a21 * b13 + a22 * b23 + a23 * b33;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31;\n\t\tte[ 5 ] = a31 * b12 + a32 * b22 + a33 * b32;\n\t\tte[ 8 ] = a31 * b13 + a32 * b23 + a33 * b33;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies every component of the matrix by the given scalar.\n\t *\n\t * @param {number} s - The scalar.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 3 ] *= s; te[ 6 ] *= s;\n\t\tte[ 1 ] *= s; te[ 4 ] *= s; te[ 7 ] *= s;\n\t\tte[ 2 ] *= s; te[ 5 ] *= s; te[ 8 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes and returns the determinant of this matrix.\n\t *\n\t * @return {number} The determinant.\n\t */\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst a = te[ 0 ], b = te[ 1 ], c = te[ 2 ],\n\t\t\td = te[ 3 ], e = te[ 4 ], f = te[ 5 ],\n\t\t\tg = te[ 6 ], h = te[ 7 ], i = te[ 8 ];\n\n\t\treturn a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g;\n\n\t}\n\n\t/**\n\t * Inverts this matrix, using the [analytic method](https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution).\n\t * You can not invert with a determinant of zero. If you attempt this, the method produces\n\t * a zero matrix instead.\n\t *\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tinvert() {\n\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ],\n\t\t\tn12 = te[ 3 ], n22 = te[ 4 ], n32 = te[ 5 ],\n\t\t\tn13 = te[ 6 ], n23 = te[ 7 ], n33 = te[ 8 ],\n\n\t\t\tt11 = n33 * n22 - n32 * n23,\n\t\t\tt12 = n32 * n13 - n33 * n12,\n\t\t\tt13 = n23 * n12 - n22 * n13,\n\n\t\t\tdet = n11 * t11 + n21 * t12 + n31 * t13;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n31 * n23 - n33 * n21 ) * detInv;\n\t\tte[ 2 ] = ( n32 * n21 - n31 * n22 ) * detInv;\n\n\t\tte[ 3 ] = t12 * detInv;\n\t\tte[ 4 ] = ( n33 * n11 - n31 * n13 ) * detInv;\n\t\tte[ 5 ] = ( n31 * n12 - n32 * n11 ) * detInv;\n\n\t\tte[ 6 ] = t13 * detInv;\n\t\tte[ 7 ] = ( n21 * n13 - n23 * n11 ) * detInv;\n\t\tte[ 8 ] = ( n22 * n11 - n21 * n12 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Transposes this matrix in place.\n\t *\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\ttranspose() {\n\n\t\tlet tmp;\n\t\tconst m = this.elements;\n\n\t\ttmp = m[ 1 ]; m[ 1 ] = m[ 3 ]; m[ 3 ] = tmp;\n\t\ttmp = m[ 2 ]; m[ 2 ] = m[ 6 ]; m[ 6 ] = tmp;\n\t\ttmp = m[ 5 ]; m[ 5 ] = m[ 7 ]; m[ 7 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the normal matrix which is the inverse transpose of the upper\n\t * left 3x3 portion of the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} matrix4 - The 4x4 matrix.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tgetNormalMatrix( matrix4 ) {\n\n\t\treturn this.setFromMatrix4( matrix4 ).invert().transpose();\n\n\t}\n\n\t/**\n\t * Transposes this matrix into the supplied array, and returns itself unchanged.\n\t *\n\t * @param {Array<number>} r - An array to store the transposed matrix elements.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\ttransposeIntoArray( r ) {\n\n\t\tconst m = this.elements;\n\n\t\tr[ 0 ] = m[ 0 ];\n\t\tr[ 1 ] = m[ 3 ];\n\t\tr[ 2 ] = m[ 6 ];\n\t\tr[ 3 ] = m[ 1 ];\n\t\tr[ 4 ] = m[ 4 ];\n\t\tr[ 5 ] = m[ 7 ];\n\t\tr[ 6 ] = m[ 2 ];\n\t\tr[ 7 ] = m[ 5 ];\n\t\tr[ 8 ] = m[ 8 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the UV transform matrix from offset, repeat, rotation, and center.\n\t *\n\t * @param {number} tx - Offset x.\n\t * @param {number} ty - Offset y.\n\t * @param {number} sx - Repeat x.\n\t * @param {number} sy - Repeat y.\n\t * @param {number} rotation - Rotation, in radians. Positive values rotate counterclockwise.\n\t * @param {number} cx - Center x of rotation.\n\t * @param {number} cy - Center y of rotation\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tsetUvTransform( tx, ty, sx, sy, rotation, cx, cy ) {\n\n\t\tconst c = Math.cos( rotation );\n\t\tconst s = Math.sin( rotation );\n\n\t\tthis.set(\n\t\t\tsx * c, sx * s, - sx * ( c * cx + s * cy ) + cx + tx,\n\t\t\t- sy * s, sy * c, - sy * ( - s * cx + c * cy ) + cy + ty,\n\t\t\t0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scales this matrix with the given scalar values.\n\t *\n\t * @param {number} sx - The amount to scale in the X axis.\n\t * @param {number} sy - The amount to scale in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tscale( sx, sy ) {\n\n\t\tthis.premultiply( _m3.makeScale( sx, sy ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates this matrix by the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\trotate( theta ) {\n\n\t\tthis.premultiply( _m3.makeRotation( - theta ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates this matrix by the given scalar values.\n\t *\n\t * @param {number} tx - The amount to translate in the X axis.\n\t * @param {number} ty - The amount to translate in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\ttranslate( tx, ty ) {\n\n\t\tthis.premultiply( _m3.makeTranslation( tx, ty ) );\n\n\t\treturn this;\n\n\t}\n\n\t// for 2D Transforms\n\n\t/**\n\t * Sets this matrix as a 2D translation transform.\n\t *\n\t * @param {number|Vector2} x - The amount to translate in the X axis or alternatively a translation vector.\n\t * @param {number} y - The amount to translate in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmakeTranslation( x, y ) {\n\n\t\tif ( x.isVector2 ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, x.x,\n\t\t\t\t0, 1, x.y,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, x,\n\t\t\t\t0, 1, y,\n\t\t\t\t0, 0, 1\n\n\t\t\t);\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a 2D rotational transformation.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmakeRotation( theta ) {\n\n\t\t// counterclockwise\n\n\t\tconst c = Math.cos( theta );\n\t\tconst s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0,\n\t\t\ts, c, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a 2D scale transform.\n\t *\n\t * @param {number} x - The amount to scale in the X axis.\n\t * @param {number} y - The amount to scale in the Y axis.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tmakeScale( x, y ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0,\n\t\t\t0, y, 0,\n\t\t\t0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this matrix is equal with the given one.\n\t *\n\t * @param {Matrix3} matrix - The matrix to test for equality.\n\t * @return {boolean} Whether this matrix is equal with the given one.\n\t */\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix from the given array.\n\t *\n\t * @param {Array<number>} array - The matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Matrix3} A reference to this matrix.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the elements of this matrix to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array<number>} [array=[]] - The target array holding the matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array<number>} The matrix elements in column-major order.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Returns a matrix with copied values from this instance.\n\t *\n\t * @return {Matrix3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().fromArray( this.elements );\n\n\t}\n\n}\n\nconst _m3 = /*@__PURE__*/ new Matrix3();\n\nconst LINEAR_REC709_TO_XYZ = /*@__PURE__*/ new Matrix3().set(\n\t0.4123908, 0.3575843, 0.1804808,\n\t0.2126390, 0.7151687, 0.0721923,\n\t0.0193308, 0.1191948, 0.9505322\n);\n\nconst XYZ_TO_LINEAR_REC709 = /*@__PURE__*/ new Matrix3().set(\n\t3.2409699, -1.5373832, -0.4986108,\n\t-0.9692436, 1.8759675, 0.0415551,\n\t0.0556301, -0.203977, 1.0569715\n);\n\nfunction createColorManagement() {\n\n\tconst ColorManagement = {\n\n\t\tenabled: true,\n\n\t\tworkingColorSpace: LinearSRGBColorSpace,\n\n\t\t/**\n\t\t * Implementations of supported color spaces.\n\t\t *\n\t\t * Required:\n\t\t *\t- primaries: chromaticity coordinates [ rx ry gx gy bx by ]\n\t\t *\t- whitePoint: reference white [ x y ]\n\t\t *\t- transfer: transfer function (pre-defined)\n\t\t *\t- toXYZ: Matrix3 RGB to XYZ transform\n\t\t *\t- fromXYZ: Matrix3 XYZ to RGB transform\n\t\t *\t- luminanceCoefficients: RGB luminance coefficients\n\t\t *\n\t\t * Optional:\n\t\t *  - outputColorSpaceConfig: { drawingBufferColorSpace: ColorSpace, toneMappingMode: 'extended' | 'standard' }\n\t\t *  - workingColorSpaceConfig: { unpackColorSpace: ColorSpace }\n\t\t *\n\t\t * Reference:\n\t\t * - https://www.russellcottrell.com/photo/matrixCalculator.htm\n\t\t */\n\t\tspaces: {},\n\n\t\tconvert: function ( color, sourceColorSpace, targetColorSpace ) {\n\n\t\t\tif ( this.enabled === false || sourceColorSpace === targetColorSpace || ! sourceColorSpace || ! targetColorSpace ) {\n\n\t\t\t\treturn color;\n\n\t\t\t}\n\n\t\t\tif ( this.spaces[ sourceColorSpace ].transfer === SRGBTransfer ) {\n\n\t\t\t\tcolor.r = SRGBToLinear( color.r );\n\t\t\t\tcolor.g = SRGBToLinear( color.g );\n\t\t\t\tcolor.b = SRGBToLinear( color.b );\n\n\t\t\t}\n\n\t\t\tif ( this.spaces[ sourceColorSpace ].primaries !== this.spaces[ targetColorSpace ].primaries ) {\n\n\t\t\t\tcolor.applyMatrix3( this.spaces[ sourceColorSpace ].toXYZ );\n\t\t\t\tcolor.applyMatrix3( this.spaces[ targetColorSpace ].fromXYZ );\n\n\t\t\t}\n\n\t\t\tif ( this.spaces[ targetColorSpace ].transfer === SRGBTransfer ) {\n\n\t\t\t\tcolor.r = LinearToSRGB( color.r );\n\t\t\t\tcolor.g = LinearToSRGB( color.g );\n\t\t\t\tcolor.b = LinearToSRGB( color.b );\n\n\t\t\t}\n\n\t\t\treturn color;\n\n\t\t},\n\n\t\tworkingToColorSpace: function ( color, targetColorSpace ) {\n\n\t\t\treturn this.convert( color, this.workingColorSpace, targetColorSpace );\n\n\t\t},\n\n\t\tcolorSpaceToWorking: function ( color, sourceColorSpace ) {\n\n\t\t\treturn this.convert( color, sourceColorSpace, this.workingColorSpace );\n\n\t\t},\n\n\t\tgetPrimaries: function ( colorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].primaries;\n\n\t\t},\n\n\t\tgetTransfer: function ( colorSpace ) {\n\n\t\t\tif ( colorSpace === NoColorSpace ) return LinearTransfer;\n\n\t\t\treturn this.spaces[ colorSpace ].transfer;\n\n\t\t},\n\n\t\tgetToneMappingMode: function ( colorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].outputColorSpaceConfig.toneMappingMode || 'standard';\n\n\t\t},\n\n\t\tgetLuminanceCoefficients: function ( target, colorSpace = this.workingColorSpace ) {\n\n\t\t\treturn target.fromArray( this.spaces[ colorSpace ].luminanceCoefficients );\n\n\t\t},\n\n\t\tdefine: function ( colorSpaces ) {\n\n\t\t\tObject.assign( this.spaces, colorSpaces );\n\n\t\t},\n\n\t\t// Internal APIs\n\n\t\t_getMatrix: function ( targetMatrix, sourceColorSpace, targetColorSpace ) {\n\n\t\t\treturn targetMatrix\n\t\t\t\t.copy( this.spaces[ sourceColorSpace ].toXYZ )\n\t\t\t\t.multiply( this.spaces[ targetColorSpace ].fromXYZ );\n\n\t\t},\n\n\t\t_getDrawingBufferColorSpace: function ( colorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].outputColorSpaceConfig.drawingBufferColorSpace;\n\n\t\t},\n\n\t\t_getUnpackColorSpace: function ( colorSpace = this.workingColorSpace ) {\n\n\t\t\treturn this.spaces[ colorSpace ].workingColorSpaceConfig.unpackColorSpace;\n\n\t\t},\n\n\t\t// Deprecated\n\n\t\tfromWorkingColorSpace: function ( color, targetColorSpace ) {\n\n\t\t\twarnOnce( 'ColorManagement: .fromWorkingColorSpace() has been renamed to .workingToColorSpace().' ); // @deprecated, r177\n\n\t\t\treturn ColorManagement.workingToColorSpace( color, targetColorSpace );\n\n\t\t},\n\n\t\ttoWorkingColorSpace: function ( color, sourceColorSpace ) {\n\n\t\t\twarnOnce( 'ColorManagement: .toWorkingColorSpace() has been renamed to .colorSpaceToWorking().' ); // @deprecated, r177\n\n\t\t\treturn ColorManagement.colorSpaceToWorking( color, sourceColorSpace );\n\n\t\t},\n\n\t};\n\n\t/******************************************************************************\n\t * sRGB definitions\n\t */\n\n\tconst REC709_PRIMARIES = [ 0.640, 0.330, 0.300, 0.600, 0.150, 0.060 ];\n\tconst REC709_LUMINANCE_COEFFICIENTS = [ 0.2126, 0.7152, 0.0722 ];\n\tconst D65 = [ 0.3127, 0.3290 ];\n\n\tColorManagement.define( {\n\n\t\t[ LinearSRGBColorSpace ]: {\n\t\t\tprimaries: REC709_PRIMARIES,\n\t\t\twhitePoint: D65,\n\t\t\ttransfer: LinearTransfer,\n\t\t\ttoXYZ: LINEAR_REC709_TO_XYZ,\n\t\t\tfromXYZ: XYZ_TO_LINEAR_REC709,\n\t\t\tluminanceCoefficients: REC709_LUMINANCE_COEFFICIENTS,\n\t\t\tworkingColorSpaceConfig: { unpackColorSpace: SRGBColorSpace },\n\t\t\toutputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace }\n\t\t},\n\n\t\t[ SRGBColorSpace ]: {\n\t\t\tprimaries: REC709_PRIMARIES,\n\t\t\twhitePoint: D65,\n\t\t\ttransfer: SRGBTransfer,\n\t\t\ttoXYZ: LINEAR_REC709_TO_XYZ,\n\t\t\tfromXYZ: XYZ_TO_LINEAR_REC709,\n\t\t\tluminanceCoefficients: REC709_LUMINANCE_COEFFICIENTS,\n\t\t\toutputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace }\n\t\t},\n\n\t} );\n\n\treturn ColorManagement;\n\n}\n\nconst ColorManagement = /*@__PURE__*/ createColorManagement();\n\nfunction SRGBToLinear( c ) {\n\n\treturn ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 );\n\n}\n\nfunction LinearToSRGB( c ) {\n\n\treturn ( c < 0.0031308 ) ? c * 12.92 : 1.055 * ( Math.pow( c, 0.41666 ) ) - 0.055;\n\n}\n\nlet _canvas;\n\n/**\n * A class containing utility functions for images.\n *\n * @hideconstructor\n */\nclass ImageUtils {\n\n\t/**\n\t * Returns a data URI containing a representation of the given image.\n\t *\n\t * @param {(HTMLImageElement|HTMLCanvasElement)} image - The image object.\n\t * @param {string} [type='image/png'] - Indicates the image format.\n\t * @return {string} The data URI.\n\t */\n\tstatic getDataURL( image, type = 'image/png' ) {\n\n\t\tif ( /^data:/i.test( image.src ) ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tif ( typeof HTMLCanvasElement === 'undefined' ) {\n\n\t\t\treturn image.src;\n\n\t\t}\n\n\t\tlet canvas;\n\n\t\tif ( image instanceof HTMLCanvasElement ) {\n\n\t\t\tcanvas = image;\n\n\t\t} else {\n\n\t\t\tif ( _canvas === undefined ) _canvas = createElementNS( 'canvas' );\n\n\t\t\t_canvas.width = image.width;\n\t\t\t_canvas.height = image.height;\n\n\t\t\tconst context = _canvas.getContext( '2d' );\n\n\t\t\tif ( image instanceof ImageData ) {\n\n\t\t\t\tcontext.putImageData( image, 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\t}\n\n\t\t\tcanvas = _canvas;\n\n\t\t}\n\n\t\treturn canvas.toDataURL( type );\n\n\t}\n\n\t/**\n\t * Converts the given sRGB image data to linear color space.\n\t *\n\t * @param {(HTMLImageElement|HTMLCanvasElement|ImageBitmap|Object)} image - The image object.\n\t * @return {HTMLCanvasElement|Object} The converted image.\n\t */\n\tstatic sRGBToLinear( image ) {\n\n\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t\tconst canvas = createElementNS( 'canvas' );\n\n\t\t\tcanvas.width = image.width;\n\t\t\tcanvas.height = image.height;\n\n\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\tcontext.drawImage( image, 0, 0, image.width, image.height );\n\n\t\t\tconst imageData = context.getImageData( 0, 0, image.width, image.height );\n\t\t\tconst data = imageData.data;\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] / 255 ) * 255;\n\n\t\t\t}\n\n\t\t\tcontext.putImageData( imageData, 0, 0 );\n\n\t\t\treturn canvas;\n\n\t\t} else if ( image.data ) {\n\n\t\t\tconst data = image.data.slice( 0 );\n\n\t\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\t\tif ( data instanceof Uint8Array || data instanceof Uint8ClampedArray ) {\n\n\t\t\t\t\tdata[ i ] = Math.floor( SRGBToLinear( data[ i ] / 255 ) * 255 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// assuming float\n\n\t\t\t\t\tdata[ i ] = SRGBToLinear( data[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tdata: data,\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height\n\t\t\t};\n\n\t\t} else {\n\n\t\t\twarn( 'ImageUtils.sRGBToLinear(): Unsupported image type. No color space conversion applied.' );\n\t\t\treturn image;\n\n\t\t}\n\n\t}\n\n}\n\nlet _sourceId = 0;\n\n/**\n * Represents the data source of a texture.\n *\n * The main purpose of this class is to decouple the data definition from the texture\n * definition so the same data can be used with multiple texture instances.\n */\nclass Source {\n\n\t/**\n\t * Constructs a new video texture.\n\t *\n\t * @param {any} [data=null] - The data definition of a texture.\n\t */\n\tconstructor( data = null ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSource = true;\n\n\t\t/**\n\t\t * The ID of the source.\n\t\t *\n\t\t * @name Source#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _sourceId ++ } );\n\n\t\t/**\n\t\t * The UUID of the source.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The data definition of a texture.\n\t\t *\n\t\t * @type {any}\n\t\t */\n\t\tthis.data = data;\n\n\t\t/**\n\t\t * This property is only relevant when {@link Source#needsUpdate} is set to `true` and\n\t\t * provides more control on how texture data should be processed. When `dataReady` is set\n\t\t * to `false`, the engine performs the memory allocation (if necessary) but does not transfer\n\t\t * the data into the GPU memory.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.dataReady = true;\n\n\t\t/**\n\t\t * This starts at `0` and counts how many times {@link Source#needsUpdate} is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\n\t}\n\n\t/**\n\t * Returns the dimensions of the source into the given target vector.\n\t *\n\t * @param {(Vector2|Vector3)} target - The target object the result is written into.\n\t * @return {(Vector2|Vector3)} The dimensions of the source.\n\t */\n\tgetSize( target ) {\n\n\t\tconst data = this.data;\n\n\t\tif ( ( typeof HTMLVideoElement !== 'undefined' ) && ( data instanceof HTMLVideoElement ) ) {\n\n\t\t\ttarget.set( data.videoWidth, data.videoHeight, 0 );\n\n\t\t} else if ( ( typeof VideoFrame !== 'undefined' ) && ( data instanceof VideoFrame ) ) {\n\n\t\t\ttarget.set( data.displayHeight, data.displayWidth, 0 );\n\n\t\t} else if ( data !== null ) {\n\n\t\t\ttarget.set( data.width, data.height, data.depth || 0 );\n\n\t\t} else {\n\n\t\t\ttarget.set( 0, 0, 0 );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * When the property is set to `true`, the engine allocates the memory\n\t * for the texture (if necessary) and triggers the actual texture upload\n\t * to the GPU next time the source is used.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Serializes the source into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized source.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.images[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.images[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\t\t\tuuid: this.uuid,\n\t\t\turl: ''\n\t\t};\n\n\t\tconst data = this.data;\n\n\t\tif ( data !== null ) {\n\n\t\t\tlet url;\n\n\t\t\tif ( Array.isArray( data ) ) {\n\n\t\t\t\t// cube texture\n\n\t\t\t\turl = [];\n\n\t\t\t\tfor ( let i = 0, l = data.length; i < l; i ++ ) {\n\n\t\t\t\t\tif ( data[ i ].isDataTexture ) {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ i ].image ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\turl.push( serializeImage( data[ i ] ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// texture\n\n\t\t\t\turl = serializeImage( data );\n\n\t\t\t}\n\n\t\t\toutput.url = url;\n\n\t\t}\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.images[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n}\n\nfunction serializeImage( image ) {\n\n\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ) {\n\n\t\t// default images\n\n\t\treturn ImageUtils.getDataURL( image );\n\n\t} else {\n\n\t\tif ( image.data ) {\n\n\t\t\t// images of DataTexture\n\n\t\t\treturn {\n\t\t\t\tdata: Array.from( image.data ),\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height,\n\t\t\t\ttype: image.data.constructor.name\n\t\t\t};\n\n\t\t} else {\n\n\t\t\twarn( 'Texture: Unable to serialize Texture.' );\n\t\t\treturn {};\n\n\t\t}\n\n\t}\n\n}\n\nlet _textureId = 0;\n\nconst _tempVec3 = /*@__PURE__*/ new Vector3();\n\n/**\n * Base class for all textures.\n *\n * Note: After the initial use of a texture, its dimensions, format, and type\n * cannot be changed. Instead, call {@link Texture#dispose} on the texture and instantiate a new one.\n *\n * @augments EventDispatcher\n */\nclass Texture extends EventDispatcher {\n\n\t/**\n\t * Constructs a new texture.\n\t *\n\t * @param {?Object} [image=Texture.DEFAULT_IMAGE] - The image holding the texture data.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space.\n\t */\n\tconstructor( image = Texture.DEFAULT_IMAGE, mapping = Texture.DEFAULT_MAPPING, wrapS = ClampToEdgeWrapping, wrapT = ClampToEdgeWrapping, magFilter = LinearFilter, minFilter = LinearMipmapLinearFilter, format = RGBAFormat, type = UnsignedByteType, anisotropy = Texture.DEFAULT_ANISOTROPY, colorSpace = NoColorSpace ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isTexture = true;\n\n\t\t/**\n\t\t * The ID of the texture.\n\t\t *\n\t\t * @name Texture#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _textureId ++ } );\n\n\t\t/**\n\t\t * The UUID of the material.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the material.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The data definition of a texture. A reference to the data source can be\n\t\t * shared across textures. This is often useful in context of spritesheets\n\t\t * where multiple textures render the same data but with different texture\n\t\t * transformations.\n\t\t *\n\t\t * @type {Source}\n\t\t */\n\t\tthis.source = new Source( image );\n\n\t\t/**\n\t\t * An array holding user-defined mipmaps.\n\t\t *\n\t\t * @type {Array<Object>}\n\t\t */\n\t\tthis.mipmaps = [];\n\n\t\t/**\n\t\t * How the texture is applied to the object. The value `UVMapping`\n\t\t * is the default, where texture or uv coordinates are used to apply the map.\n\t\t *\n\t\t * @type {(UVMapping|CubeReflectionMapping|CubeRefractionMapping|EquirectangularReflectionMapping|EquirectangularRefractionMapping|CubeUVReflectionMapping)}\n\t\t * @default UVMapping\n\t\t*/\n\t\tthis.mapping = mapping;\n\n\t\t/**\n\t\t * Lets you select the uv attribute to map the texture to. `0` for `uv`,\n\t\t * `1` for `uv1`, `2` for `uv2` and `3` for `uv3`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.channel = 0;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped horizontally and corresponds to\n\t\t * *U* in UV mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapS = wrapS;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped horizontally and corresponds to\n\t\t * *V* in UV mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapT = wrapT;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default LinearFilter\n\t\t */\n\t\tthis.magFilter = magFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default LinearMipmapLinearFilter\n\t\t */\n\t\tthis.minFilter = minFilter;\n\n\t\t/**\n\t\t * The number of samples taken along the axis through the pixel that has the\n\t\t * highest density of texels. By default, this value is `1`. A higher value\n\t\t * gives a less blurry result than a basic mipmap, at the cost of more\n\t\t * texture samples being used.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Texture.DEFAULT_ANISOTROPY\n\t\t */\n\t\tthis.anisotropy = anisotropy;\n\n\t\t/**\n\t\t * The format of the texture.\n\t\t *\n\t\t * @type {number}\n\t\t * @default RGBAFormat\n\t\t */\n\t\tthis.format = format;\n\n\t\t/**\n\t\t * The default internal format is derived from {@link Texture#format} and {@link Texture#type} and\n\t\t * defines how the texture data is going to be stored on the GPU.\n\t\t *\n\t\t * This property allows to overwrite the default format.\n\t\t *\n\t\t * @type {?string}\n\t\t * @default null\n\t\t */\n\t\tthis.internalFormat = null;\n\n\t\t/**\n\t\t * The data type of the texture.\n\t\t *\n\t\t * @type {number}\n\t\t * @default UnsignedByteType\n\t\t */\n\t\tthis.type = type;\n\n\t\t/**\n\t\t * How much a single repetition of the texture is offset from the beginning,\n\t\t * in each direction U and V. Typical range is `0.0` to `1.0`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (0,0)\n\t\t */\n\t\tthis.offset = new Vector2( 0, 0 );\n\n\t\t/**\n\t\t * How many times the texture is repeated across the surface, in each\n\t\t * direction U and V. If repeat is set greater than `1` in either direction,\n\t\t * the corresponding wrap parameter should also be set to `RepeatWrapping`\n\t\t * or `MirroredRepeatWrapping` to achieve the desired tiling effect.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.repeat = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The point around which rotation occurs. A value of `(0.5, 0.5)` corresponds\n\t\t * to the center of the texture. Default is `(0, 0)`, the lower left.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (0,0)\n\t\t */\n\t\tthis.center = new Vector2( 0, 0 );\n\n\t\t/**\n\t\t * How much the texture is rotated around the center point, in radians.\n\t\t * Positive values are counter-clockwise.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.rotation = 0;\n\n\t\t/**\n\t\t * Whether to update the texture's uv-transformation {@link Texture#matrix}\n\t\t * from the properties {@link Texture#offset}, {@link Texture#repeat},\n\t\t * {@link Texture#rotation}, and {@link Texture#center}.\n\t\t *\n\t\t * Set this to `false` if you are specifying the uv-transform matrix directly.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixAutoUpdate = true;\n\n\t\t/**\n\t\t * The uv-transformation matrix of the texture.\n\t\t *\n\t\t * @type {Matrix3}\n\t\t */\n\t\tthis.matrix = new Matrix3();\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Set this to `false` if you are creating mipmaps manually.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.generateMipmaps = true;\n\n\t\t/**\n\t\t * If set to `true`, the alpha channel, if present, is multiplied into the\n\t\t * color channels when the texture is uploaded to the GPU.\n\t\t *\n\t\t * Note that this property has no effect when using `ImageBitmap`. You need to\n\t\t * configure premultiply alpha on bitmap creation instead.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.premultiplyAlpha = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Note that this property has no effect when using `ImageBitmap`. You need to\n\t\t * configure the flip on bitmap creation instead.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.flipY = true;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t * The allowable values are `1` (byte-alignment), `2` (rows aligned to even-numbered bytes),\n\t\t * `4` (word-alignment), and `8` (rows start on double-word boundaries).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 4\n\t\t */\n\t\tthis.unpackAlignment = 4;\t// valid values: 1, 2, 4, 8 (see http://www.khronos.org/opengles/sdk/docs/man/xhtml/glPixelStorei.xml)\n\n\t\t/**\n\t\t * Textures containing color data should be annotated with `SRGBColorSpace` or `LinearSRGBColorSpace`.\n\t\t *\n\t\t * @type {string}\n\t\t * @default NoColorSpace\n\t\t */\n\t\tthis.colorSpace = colorSpace;\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the texture. It\n\t\t * should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t\t/**\n\t\t * This can be used to only update a subregion or specific rows of the texture (for example, just the\n\t\t * first 3 rows). Use the `addUpdateRange()` function to add ranges to this array.\n\t\t *\n\t\t * @type {Array<Object>}\n\t\t */\n\t\tthis.updateRanges = [];\n\n\t\t/**\n\t\t * This starts at `0` and counts how many times {@link Texture#needsUpdate} is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\n\t\t/**\n\t\t * A callback function, called when the texture is updated (e.g., when\n\t\t * {@link Texture#needsUpdate} has been set to true and then the texture is used).\n\t\t *\n\t\t * @type {?Function}\n\t\t * @default null\n\t\t */\n\t\tthis.onUpdate = null;\n\n\t\t/**\n\t\t * An optional back reference to the textures render target.\n\t\t *\n\t\t * @type {?(RenderTarget|WebGLRenderTarget)}\n\t\t * @default null\n\t\t */\n\t\tthis.renderTarget = null;\n\n\t\t/**\n\t\t * Indicates whether a texture belongs to a render target or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isRenderTargetTexture = false;\n\n\t\t/**\n\t\t * Indicates if a texture should be handled like a texture array.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isArrayTexture = image && image.depth && image.depth > 1 ? true : false;\n\n\t\t/**\n\t\t * Indicates whether this texture should be processed by `PMREMGenerator` or not\n\t\t * (only relevant for render target textures).\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.pmremVersion = 0;\n\n\t}\n\n\t/**\n\t * The width of the texture in pixels.\n\t */\n\tget width() {\n\n\t\treturn this.source.getSize( _tempVec3 ).x;\n\n\t}\n\n\t/**\n\t * The height of the texture in pixels.\n\t */\n\tget height() {\n\n\t\treturn this.source.getSize( _tempVec3 ).y;\n\n\t}\n\n\t/**\n\t * The depth of the texture in pixels.\n\t */\n\tget depth() {\n\n\t\treturn this.source.getSize( _tempVec3 ).z;\n\n\t}\n\n\t/**\n\t * The image object holding the texture data.\n\t *\n\t * @type {?Object}\n\t */\n\tget image() {\n\n\t\treturn this.source.data;\n\n\t}\n\n\tset image( value = null ) {\n\n\t\tthis.source.data = value;\n\n\t}\n\n\t/**\n\t * Updates the texture transformation matrix from the from the properties {@link Texture#offset},\n\t * {@link Texture#repeat}, {@link Texture#rotation}, and {@link Texture#center}.\n\t */\n\tupdateMatrix() {\n\n\t\tthis.matrix.setUvTransform( this.offset.x, this.offset.y, this.repeat.x, this.repeat.y, this.rotation, this.center.x, this.center.y );\n\n\t}\n\n\t/**\n\t * Adds a range of data in the data texture to be updated on the GPU.\n\t *\n\t * @param {number} start - Position at which to start update.\n\t * @param {number} count - The number of components to update.\n\t */\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\t/**\n\t * Clears the update ranges.\n\t */\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\t/**\n\t * Returns a new texture with copied values from this instance.\n\t *\n\t * @return {Texture} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given texture to this instance.\n\t *\n\t * @param {Texture} source - The texture to copy.\n\t * @return {Texture} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.source = source.source;\n\t\tthis.mipmaps = source.mipmaps.slice( 0 );\n\n\t\tthis.mapping = source.mapping;\n\t\tthis.channel = source.channel;\n\n\t\tthis.wrapS = source.wrapS;\n\t\tthis.wrapT = source.wrapT;\n\n\t\tthis.magFilter = source.magFilter;\n\t\tthis.minFilter = source.minFilter;\n\n\t\tthis.anisotropy = source.anisotropy;\n\n\t\tthis.format = source.format;\n\t\tthis.internalFormat = source.internalFormat;\n\t\tthis.type = source.type;\n\n\t\tthis.offset.copy( source.offset );\n\t\tthis.repeat.copy( source.repeat );\n\t\tthis.center.copy( source.center );\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\t\tthis.matrix.copy( source.matrix );\n\n\t\tthis.generateMipmaps = source.generateMipmaps;\n\t\tthis.premultiplyAlpha = source.premultiplyAlpha;\n\t\tthis.flipY = source.flipY;\n\t\tthis.unpackAlignment = source.unpackAlignment;\n\t\tthis.colorSpace = source.colorSpace;\n\n\t\tthis.renderTarget = source.renderTarget;\n\t\tthis.isRenderTargetTexture = source.isRenderTargetTexture;\n\t\tthis.isArrayTexture = source.isArrayTexture;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tthis.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this texture's properties based on `values`.\n\t * @param {Object} values - A container with texture parameters.\n\t */\n\tsetValues( values ) {\n\n\t\tfor ( const key in values ) {\n\n\t\t\tconst newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\twarn( `Texture.setValues(): parameter '${ key }' has value of undefined.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\twarn( `Texture.setValues(): property '${ key }' does not exist.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( ( currentValue && newValue ) && ( currentValue.isVector2 && newValue.isVector2 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else if ( ( currentValue && newValue ) && ( currentValue.isVector3 && newValue.isVector3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else if ( ( currentValue && newValue ) && ( currentValue.isMatrix3 && newValue.isMatrix3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the texture into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized texture.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( ! isRootObject && meta.textures[ this.uuid ] !== undefined ) {\n\n\t\t\treturn meta.textures[ this.uuid ];\n\n\t\t}\n\n\t\tconst output = {\n\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Texture',\n\t\t\t\tgenerator: 'Texture.toJSON'\n\t\t\t},\n\n\t\t\tuuid: this.uuid,\n\t\t\tname: this.name,\n\n\t\t\timage: this.source.toJSON( meta ).uuid,\n\n\t\t\tmapping: this.mapping,\n\t\t\tchannel: this.channel,\n\n\t\t\trepeat: [ this.repeat.x, this.repeat.y ],\n\t\t\toffset: [ this.offset.x, this.offset.y ],\n\t\t\tcenter: [ this.center.x, this.center.y ],\n\t\t\trotation: this.rotation,\n\n\t\t\twrap: [ this.wrapS, this.wrapT ],\n\n\t\t\tformat: this.format,\n\t\t\tinternalFormat: this.internalFormat,\n\t\t\ttype: this.type,\n\t\t\tcolorSpace: this.colorSpace,\n\n\t\t\tminFilter: this.minFilter,\n\t\t\tmagFilter: this.magFilter,\n\t\t\tanisotropy: this.anisotropy,\n\n\t\t\tflipY: this.flipY,\n\n\t\t\tgenerateMipmaps: this.generateMipmaps,\n\t\t\tpremultiplyAlpha: this.premultiplyAlpha,\n\t\t\tunpackAlignment: this.unpackAlignment\n\n\t\t};\n\n\t\tif ( Object.keys( this.userData ).length > 0 ) output.userData = this.userData;\n\n\t\tif ( ! isRootObject ) {\n\n\t\t\tmeta.textures[ this.uuid ] = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires Texture#dispose\n\t */\n\tdispose() {\n\n\t\t/**\n\t\t * Fires when the texture has been disposed of.\n\t\t *\n\t\t * @event Texture#dispose\n\t\t * @type {Object}\n\t\t */\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\t/**\n\t * Transforms the given uv vector with the textures uv transformation matrix.\n\t *\n\t * @param {Vector2} uv - The uv vector.\n\t * @return {Vector2} The transformed uv vector.\n\t */\n\ttransformUv( uv ) {\n\n\t\tif ( this.mapping !== UVMapping ) return uv;\n\n\t\tuv.applyMatrix3( this.matrix );\n\n\t\tif ( uv.x < 0 || uv.x > 1 ) {\n\n\t\t\tswitch ( this.wrapS ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.x = uv.x < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.x ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.x = Math.ceil( uv.x ) - uv.x;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.x = uv.x - Math.floor( uv.x );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( uv.y < 0 || uv.y > 1 ) {\n\n\t\t\tswitch ( this.wrapT ) {\n\n\t\t\t\tcase RepeatWrapping:\n\n\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ClampToEdgeWrapping:\n\n\t\t\t\t\tuv.y = uv.y < 0 ? 0 : 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MirroredRepeatWrapping:\n\n\t\t\t\t\tif ( Math.abs( Math.floor( uv.y ) % 2 ) === 1 ) {\n\n\t\t\t\t\t\tuv.y = Math.ceil( uv.y ) - uv.y;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuv.y = uv.y - Math.floor( uv.y );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.flipY ) {\n\n\t\t\tuv.y = 1 - uv.y;\n\n\t\t}\n\n\t\treturn uv;\n\n\t}\n\n\t/**\n\t * Setting this property to `true` indicates the engine the texture\n\t * must be updated in the next render. This triggers a texture upload\n\t * to the GPU and ensures correct texture parameter configuration.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.version ++;\n\t\t\tthis.source.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Setting this property to `true` indicates the engine the PMREM\n\t * must be regenerated.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsPMREMUpdate( value ) {\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.pmremVersion ++;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * The default image for all textures.\n *\n * @static\n * @type {?Image}\n * @default null\n */\nTexture.DEFAULT_IMAGE = null;\n\n/**\n * The default mapping for all textures.\n *\n * @static\n * @type {number}\n * @default UVMapping\n */\nTexture.DEFAULT_MAPPING = UVMapping;\n\n/**\n * The default anisotropy value for all textures.\n *\n * @static\n * @type {number}\n * @default 1\n */\nTexture.DEFAULT_ANISOTROPY = 1;\n\n/**\n * Class representing a 4D vector. A 4D vector is an ordered quadruplet of numbers\n * (labeled x, y, z and w), which can be used to represent a number of things, such as:\n *\n * - A point in 4D space.\n * - A direction and length in 4D space. In three.js the length will\n * always be the Euclidean distance(straight-line distance) from `(0, 0, 0, 0)` to `(x, y, z, w)`\n * and the direction is also measured from `(0, 0, 0, 0)` towards `(x, y, z, w)`.\n * - Any arbitrary ordered quadruplet of numbers.\n *\n * There are other things a 4D vector can be used to represent, however these\n * are the most common uses in *three.js*.\n *\n * Iterating through a vector instance will yield its components `(x, y, z, w)` in\n * the corresponding order.\n * ```js\n * const a = new THREE.Vector4( 0, 1, 0, 0 );\n *\n * //no arguments; will be initialised to (0, 0, 0, 1)\n * const b = new THREE.Vector4( );\n *\n * const d = a.dot( b );\n * ```\n */\nclass Vector4 {\n\n\t/**\n\t * Constructs a new 4D vector.\n\t *\n\t * @param {number} [x=0] - The x value of this vector.\n\t * @param {number} [y=0] - The y value of this vector.\n\t * @param {number} [z=0] - The z value of this vector.\n\t * @param {number} [w=1] - The w value of this vector.\n\t */\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tVector4.prototype.isVector4 = true;\n\n\t\t/**\n\t\t * The x value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.x = x;\n\n\t\t/**\n\t\t * The y value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.y = y;\n\n\t\t/**\n\t\t * The z value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.z = z;\n\n\t\t/**\n\t\t * The w value of this vector.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.w = w;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector4#z}.\n\t *\n\t * @type {number}\n\t */\n\tget width() {\n\n\t\treturn this.z;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.z = value;\n\n\t}\n\n\t/**\n\t * Alias for {@link Vector4#w}.\n\t *\n\t * @type {number}\n\t */\n\tget height() {\n\n\t\treturn this.w;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.w = value;\n\n\t}\n\n\t/**\n\t * Sets the vector components.\n\t *\n\t * @param {number} x - The value of the x component.\n\t * @param {number} y - The value of the y component.\n\t * @param {number} z - The value of the z component.\n\t * @param {number} w - The value of the w component.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tset( x, y, z, w ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the same value.\n\t *\n\t * @param {number} scalar - The value to set for all vector components.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\t\tthis.w = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's x component to the given value\n\t *\n\t * @param {number} x - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's y component to the given value\n\t *\n\t * @param {number} y - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's z component to the given value\n\t *\n\t * @param {number} z - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector's w component to the given value\n\t *\n\t * @param {number} w - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetW( w ) {\n\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Allows to set a vector component with an index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y,\n\t * `2` equals to z, `3` equals to w.\n\t * @param {number} value - The value to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tcase 3: this.w = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the value of the vector component which matches the given index.\n\t *\n\t * @param {number} index - The component index. `0` equals to x, `1` equals to y,\n\t * `2` equals to z, `3` equals to w.\n\t * @return {number} A vector component value.\n\t */\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tcase 3: return this.w;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new vector with copied values from this instance.\n\t *\n\t * @return {Vector4} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t}\n\n\t/**\n\t * Copies the values of the given vector to this instance.\n\t *\n\t * @param {Vector3|Vector4} v - The vector to copy.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector to this instance.\n\t *\n\t * @param {Vector4} v - The vector to add.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\t\tthis.w += v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to all components of this instance.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\t\tthis.w += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector4} a - The first vector.\n\t * @param {Vector4} b - The second vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\t\tthis.w = a.w + b.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given vector scaled by the given factor to this instance.\n\t *\n\t * @param {Vector4} v - The vector.\n\t * @param {number} s - The factor that scales `v`.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\t\tthis.w += v.w * s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vector from this instance.\n\t *\n\t * @param {Vector4} v - The vector to subtract.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\t\tthis.w -= v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given scalar value from all components of this instance.\n\t *\n\t * @param {number} s - The scalar to subtract.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\t\tthis.w -= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the given vectors and stores the result in this instance.\n\t *\n\t * @param {Vector4} a - The first vector.\n\t * @param {Vector4} b - The second vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\t\tthis.w = a.w - b.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given vector with this instance.\n\t *\n\t * @param {Vector4} v - The vector to multiply.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\t\tthis.w *= v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with all components of this instance.\n\t *\n\t * @param {number} scalar - The scalar to multiply.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\t\tthis.w *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies this vector with the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z, w = this.w;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this instance by the given vector.\n\t *\n\t * @param {Vector4} v - The vector to divide.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\t\tthis.w /= v.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Divides this vector by the given scalar.\n\t *\n\t * @param {number} scalar - The scalar to divide.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\t/**\n\t * Sets the x, y and z components of this\n\t * vector to the quaternion's axis and w to the angle.\n\t *\n\t * @param {Quaternion} q - The Quaternion to set.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetAxisAngleFromQuaternion( q ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t// q is assumed to be normalized\n\n\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\tconst s = Math.sqrt( 1 - q.w * q.w );\n\n\t\tif ( s < 0.0001 ) {\n\n\t\t\tthis.x = 1;\n\t\t\tthis.y = 0;\n\t\t\tthis.z = 0;\n\n\t\t} else {\n\n\t\t\tthis.x = q.x / s;\n\t\t\tthis.y = q.y / s;\n\t\t\tthis.z = q.z / s;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y and z components of this\n\t * vector to the axis of rotation and w to the angle.\n\t *\n\t * @param {Matrix4} m - A 4x4 matrix of which the upper left 3x3 matrix is a pure rotation matrix.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetAxisAngleFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tlet angle, x, y, z; // variables for result\n\t\tconst epsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\tte = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t     ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t     ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t// singularity found\n\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t     ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t     ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t     ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t}\n\n\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\tangle = Math.PI;\n\n\t\t\tconst xx = ( m11 + 1 ) / 2;\n\t\t\tconst yy = ( m22 + 1 ) / 2;\n\t\t\tconst zz = ( m33 + 1 ) / 2;\n\t\t\tconst xy = ( m12 + m21 ) / 4;\n\t\t\tconst xz = ( m13 + m31 ) / 4;\n\t\t\tconst yz = ( m23 + m32 ) / 4;\n\n\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\tx = 0;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\ty = xy / x;\n\t\t\t\t\tz = xz / x;\n\n\t\t\t\t}\n\n\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\tx = xy / y;\n\t\t\t\t\tz = yz / y;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\tx = xz / z;\n\t\t\t\t\ty = yz / z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.set( x, y, z, angle );\n\n\t\t\treturn this; // return 180 deg rotation\n\n\t\t}\n\n\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\tlet s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t\t( m13 - m31 ) * ( m13 - m31 ) +\n\t\t\t( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\tthis.x = ( m32 - m23 ) / s;\n\t\tthis.y = ( m13 - m31 ) / s;\n\t\tthis.z = ( m21 - m12 ) / s;\n\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the vector components to the position elements of the\n\t * given transformation matrix.\n\t *\n\t * @param {Matrix4} m - The 4x4 matrix.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\t\tthis.w = e[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w value is greater than the given vector's x, y, z or w\n\t * value, replace that value with the corresponding min value.\n\t *\n\t * @param {Vector4} v - The vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\t\tthis.w = Math.min( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w value is less than the given vector's x, y, z or w\n\t * value, replace that value with the corresponding max value.\n\t *\n\t * @param {Vector4} v - The vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\t\tthis.w = Math.max( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w value is greater than the max vector's x, y, z or w\n\t * value, it is replaced by the corresponding value.\n\t * If this vector's x, y, z or w value is less than the min vector's x, y, z or w value,\n\t * it is replaced by the corresponding value.\n\t *\n\t * @param {Vector4} min - The minimum x, y and z values.\n\t * @param {Vector4} max - The maximum x, y and z values in the desired range.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = clamp( this.x, min.x, max.x );\n\t\tthis.y = clamp( this.y, min.y, max.y );\n\t\tthis.z = clamp( this.z, min.z, max.z );\n\t\tthis.w = clamp( this.w, min.w, max.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's x, y, z or w values are greater than the max value, they are\n\t * replaced by the max value.\n\t * If this vector's x, y, z or w values are less than the min value, they are\n\t * replaced by the min value.\n\t *\n\t * @param {number} minVal - The minimum value the components will be clamped to.\n\t * @param {number} maxVal - The maximum value the components will be clamped to.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = clamp( this.x, minVal, maxVal );\n\t\tthis.y = clamp( this.y, minVal, maxVal );\n\t\tthis.z = clamp( this.z, minVal, maxVal );\n\t\tthis.w = clamp( this.w, minVal, maxVal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * If this vector's length is greater than the max value, it is replaced by\n\t * the max value.\n\t * If this vector's length is less than the min value, it is replaced by the\n\t * min value.\n\t *\n\t * @param {number} min - The minimum value the vector length will be clamped to.\n\t * @param {number} max - The maximum value the vector length will be clamped to.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( clamp( length, min, max ) );\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded down to the nearest integer value.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\t\tthis.w = Math.floor( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded up to the nearest integer value.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\t\tthis.w = Math.ceil( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded to the nearest integer value\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\t\tthis.w = Math.round( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The components of this vector are rounded towards zero (up if negative,\n\t * down if positive) to an integer value.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\t\tthis.z = Math.trunc( this.z );\n\t\tthis.w = Math.trunc( this.w );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this vector - i.e. sets x = -x, y = -y, z = -z, w = -w.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\t\tthis.w = - this.w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calculates the dot product of the given vector with this instance.\n\t *\n\t * @param {Vector4} v - The vector to compute the dot product with.\n\t * @return {number} The result of the dot product.\n\t */\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t}\n\n\t/**\n\t * Computes the square of the Euclidean length (straight-line length) from\n\t * (0, 0, 0, 0) to (x, y, z, w). If you are comparing the lengths of vectors, you should\n\t * compare the length squared instead as it is slightly more efficient to calculate.\n\t *\n\t * @return {number} The square length of this vector.\n\t */\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t}\n\n\t/**\n\t * Computes the  Euclidean length (straight-line length) from (0, 0, 0, 0) to (x, y, z, w).\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t}\n\n\t/**\n\t * Computes the Manhattan length of this vector.\n\t *\n\t * @return {number} The length of this vector.\n\t */\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t}\n\n\t/**\n\t * Converts this vector to a unit vector - that is, sets it equal to a vector\n\t * with the same direction as this one, but with a vector length of `1`.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\t/**\n\t * Sets this vector to a vector with the same direction as this one, but\n\t * with the specified length.\n\t *\n\t * @param {number} length - The new length of this vector.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vector and this instance, where\n\t * alpha is the percent distance along the line - alpha = 0 will be this\n\t * vector, and alpha = 1 will be the given one.\n\t *\n\t * @param {Vector4} v - The vector to interpolate towards.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given vectors, where alpha is the percent\n\t * distance along the line - alpha = 0 will be first vector, and alpha = 1 will\n\t * be the second one. The result is stored in this instance.\n\t *\n\t * @param {Vector4} v1 - The first vector.\n\t * @param {Vector4} v2 - The second vector.\n\t * @param {number} alpha - The interpolation factor, typically in the closed interval `[0, 1]`.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\t\tthis.w = v1.w + ( v2.w - v1.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this vector is equal with the given one.\n\t *\n\t * @param {Vector4} v - The vector to test for equality.\n\t * @return {boolean} Whether this vector is equal with the given one.\n\t */\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t}\n\n\t/**\n\t * Sets this vector's x value to be `array[ offset ]`, y value to be `array[ offset + 1 ]`,\n\t * z value to be `array[ offset + 2 ]`, w value to be `array[ offset + 3 ]`.\n\t *\n\t * @param {Array<number>} array - An array holding the vector component values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\t\tthis.w = array[ offset + 3 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this vector to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array<number>} [array=[]] - The target array holding the vector components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array<number>} The vector components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\t\tarray[ offset + 3 ] = this.w;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this vector from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding vector data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Vector4} A reference to this vector.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\t\tthis.w = attribute.getW( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets each component of this vector to a pseudo-random value between `0` and\n\t * `1`, excluding `1`.\n\t *\n\t * @return {Vector4} A reference to this vector.\n\t */\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\t\tthis.w = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\t\tyield this.w;\n\n\t}\n\n}\n\n/**\n * A render target is a buffer where the video card draws pixels for a scene\n * that is being rendered in the background. It is used in different effects,\n * such as applying postprocessing to a rendered image before displaying it\n * on the screen.\n *\n * @augments EventDispatcher\n */\nclass RenderTarget extends EventDispatcher {\n\n\t/**\n\t * Render target options.\n\t *\n\t * @typedef {Object} RenderTarget~Options\n\t * @property {boolean} [generateMipmaps=false] - Whether to generate mipmaps or not.\n\t * @property {number} [magFilter=LinearFilter] - The mag filter.\n\t * @property {number} [minFilter=LinearFilter] - The min filter.\n\t * @property {number} [format=RGBAFormat] - The texture format.\n\t * @property {number} [type=UnsignedByteType] - The texture type.\n\t * @property {?string} [internalFormat=null] - The texture's internal format.\n\t * @property {number} [wrapS=ClampToEdgeWrapping] - The texture's uv wrapping mode.\n\t * @property {number} [wrapT=ClampToEdgeWrapping] - The texture's uv wrapping mode.\n\t * @property {number} [anisotropy=1] - The texture's anisotropy value.\n\t * @property {string} [colorSpace=NoColorSpace] - The texture's color space.\n\t * @property {boolean} [depthBuffer=true] - Whether to allocate a depth buffer or not.\n\t * @property {boolean} [stencilBuffer=false] - Whether to allocate a stencil buffer or not.\n\t * @property {boolean} [resolveDepthBuffer=true] - Whether to resolve the depth buffer or not.\n\t * @property {boolean} [resolveStencilBuffer=true] - Whether  to resolve the stencil buffer or not.\n\t * @property {?Texture} [depthTexture=null] - Reference to a depth texture.\n\t * @property {number} [samples=0] - The MSAA samples count.\n\t * @property {number} [count=1] - Defines the number of color attachments . Must be at least `1`.\n\t * @property {number} [depth=1] - The texture depth.\n\t * @property {boolean} [multiview=false] - Whether this target is used for multiview rendering.\n\t */\n\n\t/**\n\t * Constructs a new render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, options = {} ) {\n\n\t\tsuper();\n\n\t\toptions = Object.assign( {\n\t\t\tgenerateMipmaps: false,\n\t\t\tinternalFormat: null,\n\t\t\tminFilter: LinearFilter,\n\t\t\tdepthBuffer: true,\n\t\t\tstencilBuffer: false,\n\t\t\tresolveDepthBuffer: true,\n\t\t\tresolveStencilBuffer: true,\n\t\t\tdepthTexture: null,\n\t\t\tsamples: 0,\n\t\t\tcount: 1,\n\t\t\tdepth: 1,\n\t\t\tmultiview: false\n\t\t}, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRenderTarget = true;\n\n\t\t/**\n\t\t * The width of the render target.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.width = width;\n\n\t\t/**\n\t\t * The height of the render target.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.height = height;\n\n\t\t/**\n\t\t * The depth of the render target.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.depth = options.depth;\n\n\t\t/**\n\t\t * A rectangular area inside the render target's viewport. Fragments that are\n\t\t * outside the area will be discarded.\n\t\t *\n\t\t * @type {Vector4}\n\t\t * @default (0,0,width,height)\n\t\t */\n\t\tthis.scissor = new Vector4( 0, 0, width, height );\n\n\t\t/**\n\t\t * Indicates whether the scissor test should be enabled when rendering into\n\t\t * this render target or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.scissorTest = false;\n\n\t\t/**\n\t\t * A rectangular area representing the render target's viewport.\n\t\t *\n\t\t * @type {Vector4}\n\t\t * @default (0,0,width,height)\n\t\t */\n\t\tthis.viewport = new Vector4( 0, 0, width, height );\n\n\t\tconst image = { width: width, height: height, depth: options.depth };\n\n\t\tconst texture = new Texture( image );\n\n\t\t/**\n\t\t * An array of textures. Each color attachment is represented as a separate texture.\n\t\t * Has at least a single entry for the default color attachment.\n\t\t *\n\t\t * @type {Array<Texture>}\n\t\t */\n\t\tthis.textures = [];\n\n\t\tconst count = options.count;\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.textures[ i ] = texture.clone();\n\t\t\tthis.textures[ i ].isRenderTargetTexture = true;\n\t\t\tthis.textures[ i ].renderTarget = this;\n\n\t\t}\n\n\t\tthis._setTextureOptions( options );\n\n\t\t/**\n\t\t * Whether to allocate a depth buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depthBuffer = options.depthBuffer;\n\n\t\t/**\n\t\t * Whether to allocate a stencil buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.stencilBuffer = options.stencilBuffer;\n\n\t\t/**\n\t\t * Whether to resolve the depth buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.resolveDepthBuffer = options.resolveDepthBuffer;\n\n\t\t/**\n\t\t * Whether to resolve the stencil buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.resolveStencilBuffer = options.resolveStencilBuffer;\n\n\t\tthis._depthTexture = null;\n\t\tthis.depthTexture = options.depthTexture;\n\n\t\t/**\n\t\t * The number of MSAA samples.\n\t\t *\n\t\t * A value of `0` disables MSAA.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.samples = options.samples;\n\n\t\t/**\n\t\t * Whether to this target is used in multiview rendering.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.multiview = options.multiview;\n\n\t}\n\n\t_setTextureOptions( options = {} ) {\n\n\t\tconst values = {\n\t\t\tminFilter: LinearFilter,\n\t\t\tgenerateMipmaps: false,\n\t\t\tflipY: false,\n\t\t\tinternalFormat: null\n\t\t};\n\n\t\tif ( options.mapping !== undefined ) values.mapping = options.mapping;\n\t\tif ( options.wrapS !== undefined ) values.wrapS = options.wrapS;\n\t\tif ( options.wrapT !== undefined ) values.wrapT = options.wrapT;\n\t\tif ( options.wrapR !== undefined ) values.wrapR = options.wrapR;\n\t\tif ( options.magFilter !== undefined ) values.magFilter = options.magFilter;\n\t\tif ( options.minFilter !== undefined ) values.minFilter = options.minFilter;\n\t\tif ( options.format !== undefined ) values.format = options.format;\n\t\tif ( options.type !== undefined ) values.type = options.type;\n\t\tif ( options.anisotropy !== undefined ) values.anisotropy = options.anisotropy;\n\t\tif ( options.colorSpace !== undefined ) values.colorSpace = options.colorSpace;\n\t\tif ( options.flipY !== undefined ) values.flipY = options.flipY;\n\t\tif ( options.generateMipmaps !== undefined ) values.generateMipmaps = options.generateMipmaps;\n\t\tif ( options.internalFormat !== undefined ) values.internalFormat = options.internalFormat;\n\n\t\tfor ( let i = 0; i < this.textures.length; i ++ ) {\n\n\t\t\tconst texture = this.textures[ i ];\n\t\t\ttexture.setValues( values );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * The texture representing the default color attachment.\n\t *\n\t * @type {Texture}\n\t */\n\tget texture() {\n\n\t\treturn this.textures[ 0 ];\n\n\t}\n\n\tset texture( value ) {\n\n\t\tthis.textures[ 0 ] = value;\n\n\t}\n\n\tset depthTexture( current ) {\n\n\t\tif ( this._depthTexture !== null ) this._depthTexture.renderTarget = null;\n\t\tif ( current !== null ) current.renderTarget = this;\n\n\t\tthis._depthTexture = current;\n\n\t}\n\n\t/**\n\t * Instead of saving the depth in a renderbuffer, a texture\n\t * can be used instead which is useful for further processing\n\t * e.g. in context of post-processing.\n\t *\n\t * @type {?DepthTexture}\n\t * @default null\n\t */\n\tget depthTexture() {\n\n\t\treturn this._depthTexture;\n\n\t}\n\n\t/**\n\t * Sets the size of this render target.\n\t *\n\t * @param {number} width - The width.\n\t * @param {number} height - The height.\n\t * @param {number} [depth=1] - The depth.\n\t */\n\tsetSize( width, height, depth = 1 ) {\n\n\t\tif ( this.width !== width || this.height !== height || this.depth !== depth ) {\n\n\t\t\tthis.width = width;\n\t\t\tthis.height = height;\n\t\t\tthis.depth = depth;\n\n\t\t\tfor ( let i = 0, il = this.textures.length; i < il; i ++ ) {\n\n\t\t\t\tthis.textures[ i ].image.width = width;\n\t\t\t\tthis.textures[ i ].image.height = height;\n\t\t\t\tthis.textures[ i ].image.depth = depth;\n\n\t\t\t\tif ( this.textures[ i ].isData3DTexture !== true ) { // Fix for #31693\n\n\t\t\t\t\t// TODO: Reconsider setting isArrayTexture flag here and in the ctor of Texture.\n\t\t\t\t\t// Maybe a method `isArrayTexture()` or just a getter could replace a flag since\n\t\t\t\t\t// both are evaluated on each call?\n\n\t\t\t\t\tthis.textures[ i ].isArrayTexture = this.textures[ i ].image.depth > 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.dispose();\n\n\t\t}\n\n\t\tthis.viewport.set( 0, 0, width, height );\n\t\tthis.scissor.set( 0, 0, width, height );\n\n\t}\n\n\t/**\n\t * Returns a new render target with copied values from this instance.\n\t *\n\t * @return {RenderTarget} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the settings of the given render target. This is a structural copy so\n\t * no resources are shared between render targets after the copy. That includes\n\t * all MRT textures and the depth texture.\n\t *\n\t * @param {RenderTarget} source - The render target to copy.\n\t * @return {RenderTarget} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\t\tthis.depth = source.depth;\n\n\t\tthis.scissor.copy( source.scissor );\n\t\tthis.scissorTest = source.scissorTest;\n\n\t\tthis.viewport.copy( source.viewport );\n\n\t\tthis.textures.length = 0;\n\n\t\tfor ( let i = 0, il = source.textures.length; i < il; i ++ ) {\n\n\t\t\tthis.textures[ i ] = source.textures[ i ].clone();\n\t\t\tthis.textures[ i ].isRenderTargetTexture = true;\n\t\t\tthis.textures[ i ].renderTarget = this;\n\n\t\t\t// ensure image object is not shared, see #20328\n\n\t\t\tconst image = Object.assign( {}, source.textures[ i ].image );\n\t\t\tthis.textures[ i ].source = new Source( image );\n\n\t\t}\n\n\t\tthis.depthBuffer = source.depthBuffer;\n\t\tthis.stencilBuffer = source.stencilBuffer;\n\n\t\tthis.resolveDepthBuffer = source.resolveDepthBuffer;\n\t\tthis.resolveStencilBuffer = source.resolveStencilBuffer;\n\n\t\tif ( source.depthTexture !== null ) this.depthTexture = source.depthTexture.clone();\n\n\t\tthis.samples = source.samples;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires RenderTarget#dispose\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\n/**\n * A render target used in context of {@link WebGLRenderer}.\n *\n * @augments RenderTarget\n */\nclass WebGLRenderTarget extends RenderTarget {\n\n\t/**\n\t * Constructs a new 3D render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLRenderTarget = true;\n\n\t}\n\n}\n\n/**\n * Creates an array of textures directly from raw buffer data.\n *\n * @augments Texture\n */\nclass DataArrayTexture extends Texture {\n\n\t/**\n\t * Constructs a new data array texture.\n\t *\n\t * @param {?TypedArray} [data=null] - The buffer data.\n\t * @param {number} [width=1] - The width of the texture.\n\t * @param {number} [height=1] - The height of the texture.\n\t * @param {number} [depth=1] - The depth of the texture.\n\t */\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\tsuper( null );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDataArrayTexture = true;\n\n\t\t/**\n\t\t * The image definition of a data texture.\n\t\t *\n\t\t * @type {{data:TypedArray,width:number,height:number,depth:number}}\n\t\t */\n\t\tthis.image = { data, width, height, depth };\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.magFilter = NearestFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.minFilter = NearestFilter;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped in the depth and corresponds to\n\t\t * *W* in UVW mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t *\n\t\t * Overwritten and set to `1` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default 1\n\t\t */\n\t\tthis.unpackAlignment = 1;\n\n\t\t/**\n\t\t * A set of all layers which need to be updated in the texture.\n\t\t *\n\t\t * @type {Set<number>}\n\t\t */\n\t\tthis.layerUpdates = new Set();\n\n\t}\n\n\t/**\n\t * Describes that a specific layer of the texture needs to be updated.\n\t * Normally when {@link Texture#needsUpdate} is set to `true`, the\n\t * entire data texture array is sent to the GPU. Marking specific\n\t * layers will only transmit subsets of all mipmaps associated with a\n\t * specific depth in the array which is often much more performant.\n\t *\n\t * @param {number} layerIndex - The layer index that should be updated.\n\t */\n\taddLayerUpdate( layerIndex ) {\n\n\t\tthis.layerUpdates.add( layerIndex );\n\n\t}\n\n\t/**\n\t * Resets the layer updates registry.\n\t */\n\tclearLayerUpdates() {\n\n\t\tthis.layerUpdates.clear();\n\n\t}\n\n}\n\n/**\n * An array render target used in context of {@link WebGLRenderer}.\n *\n * @augments WebGLRenderTarget\n */\nclass WebGLArrayRenderTarget extends WebGLRenderTarget {\n\n\t/**\n\t * Constructs a new array render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {number} [depth=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLArrayRenderTarget = true;\n\n\t\tthis.depth = depth;\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {DataArrayTexture}\n\t\t */\n\t\tthis.texture = new DataArrayTexture( null, width, height, depth );\n\t\tthis._setTextureOptions( options );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\n/**\n * Creates a three-dimensional texture from raw data, with parameters to\n * divide it into width, height, and depth.\n *\n * @augments Texture\n */\nclass Data3DTexture extends Texture {\n\n\t/**\n\t * Constructs a new data array texture.\n\t *\n\t * @param {?TypedArray} [data=null] - The buffer data.\n\t * @param {number} [width=1] - The width of the texture.\n\t * @param {number} [height=1] - The height of the texture.\n\t * @param {number} [depth=1] - The depth of the texture.\n\t */\n\tconstructor( data = null, width = 1, height = 1, depth = 1 ) {\n\n\t\t// We're going to add .setXXX() methods for setting properties later.\n\t\t// Users can still set in Data3DTexture directly.\n\t\t//\n\t\t//\tconst texture = new THREE.Data3DTexture( data, width, height, depth );\n\t\t// \ttexture.anisotropy = 16;\n\t\t//\n\t\t// See #14839\n\n\t\tsuper( null );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isData3DTexture = true;\n\n\t\t/**\n\t\t * The image definition of a data texture.\n\t\t *\n\t\t * @type {{data:TypedArray,width:number,height:number,depth:number}}\n\t\t */\n\t\tthis.image = { data, width, height, depth };\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.magFilter = NearestFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.minFilter = NearestFilter;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped in the depth and corresponds to\n\t\t * *W* in UVW mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t *\n\t\t * Overwritten and set to `1` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default 1\n\t\t */\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\n/**\n * A 3D render target used in context of {@link WebGLRenderer}.\n *\n * @augments WebGLRenderTarget\n */\nclass WebGL3DRenderTarget extends WebGLRenderTarget {\n\n\t/**\n\t * Constructs a new 3D render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {number} [depth=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGL3DRenderTarget = true;\n\n\t\tthis.depth = depth;\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {Data3DTexture}\n\t\t */\n\t\tthis.texture = new Data3DTexture( null, width, height, depth );\n\t\tthis._setTextureOptions( options );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\n/**\n * Represents an axis-aligned bounding box (AABB) in 3D space.\n */\nclass Box3 {\n\n\t/**\n\t * Constructs a new bounding box.\n\t *\n\t * @param {Vector3} [min=(Infinity,Infinity,Infinity)] - A vector representing the lower boundary of the box.\n\t * @param {Vector3} [max=(-Infinity,-Infinity,-Infinity)] - A vector representing the upper boundary of the box.\n\t */\n\tconstructor( min = new Vector3( + Infinity, + Infinity, + Infinity ), max = new Vector3( - Infinity, - Infinity, - Infinity ) ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBox3 = true;\n\n\t\t/**\n\t\t * The lower boundary of the box.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.min = min;\n\n\t\t/**\n\t\t * The upper boundary of the box.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.max = max;\n\n\t}\n\n\t/**\n\t * Sets the lower and upper boundaries of this box.\n\t * Please note that this method only copies the values from the given objects.\n\t *\n\t * @param {Vector3} min - The lower boundary of the box.\n\t * @param {Vector3} max - The upper boundary of the box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given array.\n\t *\n\t * @param {Array<number>} array - An array holding 3D position data.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromArray( array ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = array.length; i < il; i += 3 ) {\n\n\t\t\tthis.expandByPoint( _vector$b.fromArray( array, i ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - A buffer attribute holding 3D position data.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromBufferAttribute( attribute ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = attribute.count; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( _vector$b.fromBufferAttribute( attribute, i ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given array.\n\t *\n\t * @param {Array<Vector3>} points - An array holding 3D position data as instances of {@link Vector3}.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Centers this box on the given center vector and sets this box's width, height and\n\t * depth to the given size values.\n\t *\n\t * @param {Vector3} center - The center of the box.\n\t * @param {Vector3} size - The x, y and z dimensions of the box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$b.copy( size ).multiplyScalar( 0.5 );\n\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the world-axis-aligned bounding box for the given 3D object\n\t * (including its children), accounting for the object's, and children's,\n\t * world transforms. The function may result in a larger box than strictly necessary.\n\t *\n\t * @param {Object3D} object - The 3D object to compute the bounding box for.\n\t * @param {boolean} [precise=false] - If set to `true`, the method computes the smallest\n\t * world-axis-aligned bounding box at the expense of more computation.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tsetFromObject( object, precise = false ) {\n\n\t\tthis.makeEmpty();\n\n\t\treturn this.expandByObject( object, precise );\n\n\t}\n\n\t/**\n\t * Returns a new box with copied values from this instance.\n\t *\n\t * @return {Box3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given box to this instance.\n\t *\n\t * @param {Box3} box - The box to copy.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Makes this box empty which means in encloses a zero space in 3D.\n\t *\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = this.min.z = + Infinity;\n\t\tthis.max.x = this.max.y = this.max.z = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns true if this box includes zero points within its bounds.\n\t * Note that a box with equal lower and upper bounds still includes one\n\t * point, the one both bounds share.\n\t *\n\t * @return {boolean} Whether this box is empty or not.\n\t */\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y ) || ( this.max.z < this.min.z );\n\n\t}\n\n\t/**\n\t * Returns the center point of this box.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The center point.\n\t */\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\t/**\n\t * Returns the dimensions of this box.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The size.\n\t */\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this box to include the given point.\n\t *\n\t * @param {Vector3} point - The point that should be included by the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands this box equilaterally by the given vector. The width of this\n\t * box will be expanded by the x component of the vector in both\n\t * directions. The height of this box will be expanded by the y component of\n\t * the vector in both directions. The depth of this box will be\n\t * expanded by the z component of the vector in both directions.\n\t *\n\t * @param {Vector3} vector - The vector that should expand the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands each dimension of the box by the given scalar. If negative, the\n\t * dimensions of the box will be contracted.\n\t *\n\t * @param {number} scalar - The scalar value that should expand the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this box to include the given 3D object and\n\t * its children, accounting for the object's, and children's, world\n\t * transforms. The function may result in a larger box than strictly\n\t * necessary (unless the precise parameter is set to true).\n\t *\n\t * @param {Object3D} object - The 3D object that should expand the bounding box.\n\t * @param {boolean} precise - If set to `true`, the method expands the bounding box\n\t * as little as necessary at the expense of more computation.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\texpandByObject( object, precise = false ) {\n\n\t\t// Computes the world-axis-aligned bounding box of an object (including its children),\n\t\t// accounting for both the object's, and children's, world transforms\n\n\t\tobject.updateWorldMatrix( false, false );\n\n\t\tconst geometry = object.geometry;\n\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\t\t// precise AABB computation based on vertex data requires at least a position attribute.\n\t\t\t// instancing isn't supported so far and uses the normal (conservative) code path.\n\n\t\t\tif ( precise === true && positionAttribute !== undefined && object.isInstancedMesh !== true ) {\n\n\t\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t\tif ( object.isMesh === true ) {\n\n\t\t\t\t\t\tobject.getVertexPosition( i, _vector$b );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_vector$b.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_vector$b.applyMatrix4( object.matrixWorld );\n\t\t\t\t\tthis.expandByPoint( _vector$b );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( object.boundingBox !== undefined ) {\n\n\t\t\t\t\t// object-level bounding box\n\n\t\t\t\t\tif ( object.boundingBox === null ) {\n\n\t\t\t\t\t\tobject.computeBoundingBox();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_box$4.copy( object.boundingBox );\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// geometry-level bounding box\n\n\t\t\t\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\t\t\t\tgeometry.computeBoundingBox();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_box$4.copy( geometry.boundingBox );\n\n\t\t\t\t}\n\n\t\t\t\t_box$4.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tthis.union( _box$4 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tthis.expandByObject( children[ i ], precise );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within or on the boundaries of this box.\n\t *\n\t * @param {Vector3} point - The point to test.\n\t * @return {boolean} Whether the bounding box contains the given point or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn point.x >= this.min.x && point.x <= this.max.x &&\n\t\t\tpoint.y >= this.min.y && point.y <= this.max.y &&\n\t\t\tpoint.z >= this.min.z && point.z <= this.max.z;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box includes the entirety of the given bounding box.\n\t * If this box and the given one are identical, this function also returns `true`.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the bounding box contains the given bounding box or not.\n\t */\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y &&\n\t\t\tthis.min.z <= box.min.z && box.max.z <= this.max.z;\n\n\t}\n\n\t/**\n\t * Returns a point as a proportion of this box's width, height and depth.\n\t *\n\t * @param {Vector3} point - A point in 3D space.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} A point as a proportion of this box's width, height and depth.\n\t */\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y ),\n\t\t\t( point.z - this.min.z ) / ( this.max.z - this.min.z )\n\t\t);\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box intersects with this bounding box.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the given bounding box intersects with this bounding box.\n\t */\n\tintersectsBox( box ) {\n\n\t\t// using 6 splitting planes to rule out intersections.\n\t\treturn box.max.x >= this.min.x && box.min.x <= this.max.x &&\n\t\t\tbox.max.y >= this.min.y && box.min.y <= this.max.y &&\n\t\t\tbox.max.z >= this.min.z && box.min.z <= this.max.z;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere intersects with this bounding box.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @return {boolean} Whether the given bounding sphere intersects with this bounding box.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\t// Find the point on the AABB closest to the sphere center.\n\t\tthis.clampPoint( sphere.center, _vector$b );\n\n\t\t// If that point is inside the sphere, the AABB and sphere intersect.\n\t\treturn _vector$b.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given plane intersects with this bounding box.\n\t *\n\t * @param {Plane} plane - The plane to test.\n\t * @return {boolean} Whether the given plane intersects with this bounding box.\n\t */\n\tintersectsPlane( plane ) {\n\n\t\t// We compute the minimum and maximum dot product values. If those values\n\t\t// are on the same side (back or front) of the plane, then there is no intersection.\n\n\t\tlet min, max;\n\n\t\tif ( plane.normal.x > 0 ) {\n\n\t\t\tmin = plane.normal.x * this.min.x;\n\t\t\tmax = plane.normal.x * this.max.x;\n\n\t\t} else {\n\n\t\t\tmin = plane.normal.x * this.max.x;\n\t\t\tmax = plane.normal.x * this.min.x;\n\n\t\t}\n\n\t\tif ( plane.normal.y > 0 ) {\n\n\t\t\tmin += plane.normal.y * this.min.y;\n\t\t\tmax += plane.normal.y * this.max.y;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.y * this.max.y;\n\t\t\tmax += plane.normal.y * this.min.y;\n\n\t\t}\n\n\t\tif ( plane.normal.z > 0 ) {\n\n\t\t\tmin += plane.normal.z * this.min.z;\n\t\t\tmax += plane.normal.z * this.max.z;\n\n\t\t} else {\n\n\t\t\tmin += plane.normal.z * this.max.z;\n\t\t\tmax += plane.normal.z * this.min.z;\n\n\t\t}\n\n\t\treturn ( min <= - plane.constant && max >= - plane.constant );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given triangle intersects with this bounding box.\n\t *\n\t * @param {Triangle} triangle - The triangle to test.\n\t * @return {boolean} Whether the given triangle intersects with this bounding box.\n\t */\n\tintersectsTriangle( triangle ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// compute box center and extents\n\t\tthis.getCenter( _center );\n\t\t_extents.subVectors( this.max, _center );\n\n\t\t// translate triangle to aabb origin\n\t\t_v0$2.subVectors( triangle.a, _center );\n\t\t_v1$7.subVectors( triangle.b, _center );\n\t\t_v2$4.subVectors( triangle.c, _center );\n\n\t\t// compute edge vectors for triangle\n\t\t_f0.subVectors( _v1$7, _v0$2 );\n\t\t_f1.subVectors( _v2$4, _v1$7 );\n\t\t_f2.subVectors( _v0$2, _v2$4 );\n\n\t\t// test against axes that are given by cross product combinations of the edges of the triangle and the edges of the aabb\n\t\t// make an axis testing of each of the 3 sides of the aabb against each of the 3 sides of the triangle = 9 axis of separation\n\t\t// axis_ij = u_i x f_j (u0, u1, u2 = face normals of aabb = x,y,z axes vectors since aabb is axis aligned)\n\t\tlet axes = [\n\t\t\t0, - _f0.z, _f0.y, 0, - _f1.z, _f1.y, 0, - _f2.z, _f2.y,\n\t\t\t_f0.z, 0, - _f0.x, _f1.z, 0, - _f1.x, _f2.z, 0, - _f2.x,\n\t\t\t- _f0.y, _f0.x, 0, - _f1.y, _f1.x, 0, - _f2.y, _f2.x, 0\n\t\t];\n\t\tif ( ! satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// test 3 face normals from the aabb\n\t\taxes = [ 1, 0, 0, 0, 1, 0, 0, 0, 1 ];\n\t\tif ( ! satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// finally testing the face normal of the triangle\n\t\t// use already existing triangle edge vectors here\n\t\t_triangleNormal.crossVectors( _f0, _f1 );\n\t\taxes = [ _triangleNormal.x, _triangleNormal.y, _triangleNormal.z ];\n\n\t\treturn satForAxes( axes, _v0$2, _v1$7, _v2$4, _extents );\n\n\t}\n\n\t/**\n\t * Clamps the given point within the bounds of this box.\n\t *\n\t * @param {Vector3} point - The point to clamp.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The clamped point.\n\t */\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\t/**\n\t * Returns the euclidean distance from any edge of this box to the specified point. If\n\t * the given point lies inside of this box, the distance will be `0`.\n\t *\n\t * @param {Vector3} point - The point to compute the distance to.\n\t * @return {number} The euclidean distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn this.clampPoint( point, _vector$b ).distanceTo( point );\n\n\t}\n\n\t/**\n\t * Returns a bounding sphere that encloses this bounding box.\n\t *\n\t * @param {Sphere} target - The target sphere that is used to store the method's result.\n\t * @return {Sphere} The bounding sphere that encloses this bounding box.\n\t */\n\tgetBoundingSphere( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\ttarget.makeEmpty();\n\n\t\t} else {\n\n\t\t\tthis.getCenter( target.center );\n\n\t\t\ttarget.radius = this.getSize( _vector$b ).length() * 0.5;\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Computes the intersection of this bounding box and the given one, setting the upper\n\t * bound of this box to the lesser of the two boxes' upper bounds and the\n\t * lower bound of this box to the greater of the two boxes' lower bounds. If\n\t * there's no overlap, makes this box empty.\n\t *\n\t * @param {Box3} box - The bounding box to intersect with.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\t// ensure that if there is no overlap, the result is fully empty, not slightly empty with non-inf/+inf values that will cause subsequence intersects to erroneously return valid values.\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the union of this box and another and the given one, setting the upper\n\t * bound of this box to the greater of the two boxes' upper bounds and the\n\t * lower bound of this box to the lesser of the two boxes' lower bounds.\n\t *\n\t * @param {Box3} box - The bounding box that will be unioned with this instance.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Transforms this bounding box by the given 4x4 transformation matrix.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\t// transform of empty box is an empty box.\n\t\tif ( this.isEmpty() ) return this;\n\n\t\t// NOTE: I am using a binary pattern to specify all 2^3 combinations below\n\t\t_points[ 0 ].set( this.min.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 000\n\t\t_points[ 1 ].set( this.min.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 001\n\t\t_points[ 2 ].set( this.min.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 010\n\t\t_points[ 3 ].set( this.min.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 011\n\t\t_points[ 4 ].set( this.max.x, this.min.y, this.min.z ).applyMatrix4( matrix ); // 100\n\t\t_points[ 5 ].set( this.max.x, this.min.y, this.max.z ).applyMatrix4( matrix ); // 101\n\t\t_points[ 6 ].set( this.max.x, this.max.y, this.min.z ).applyMatrix4( matrix ); // 110\n\t\t_points[ 7 ].set( this.max.x, this.max.y, this.max.z ).applyMatrix4( matrix ); // 111\n\n\t\tthis.setFromPoints( _points );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given offset to both the upper and lower bounds of this bounding box,\n\t * effectively moving it in 3D space.\n\t *\n\t * @param {Vector3} offset - The offset that should be used to translate the bounding box.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box is equal with the given one.\n\t *\n\t * @param {Box3} box - The box to test for equality.\n\t * @return {boolean} Whether this bounding box is equal with the given one.\n\t */\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding box.\n\t *\n\t * @return {Object} Serialized structure with fields representing the object state.\n\t */\n\ttoJSON() {\n\n\t\treturn {\n\t\t\tmin: this.min.toArray(),\n\t\t\tmax: this.max.toArray()\n\t\t};\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding box.\n\t *\n\t * @param {Object} json - The serialized json to set the box from.\n\t * @return {Box3} A reference to this bounding box.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.min.fromArray( json.min );\n\t\tthis.max.fromArray( json.max );\n\t\treturn this;\n\n\t}\n\n}\n\nconst _points = [\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3(),\n\t/*@__PURE__*/ new Vector3()\n];\n\nconst _vector$b = /*@__PURE__*/ new Vector3();\n\nconst _box$4 = /*@__PURE__*/ new Box3();\n\n// triangle centered vertices\n\nconst _v0$2 = /*@__PURE__*/ new Vector3();\nconst _v1$7 = /*@__PURE__*/ new Vector3();\nconst _v2$4 = /*@__PURE__*/ new Vector3();\n\n// triangle edge vectors\n\nconst _f0 = /*@__PURE__*/ new Vector3();\nconst _f1 = /*@__PURE__*/ new Vector3();\nconst _f2 = /*@__PURE__*/ new Vector3();\n\nconst _center = /*@__PURE__*/ new Vector3();\nconst _extents = /*@__PURE__*/ new Vector3();\nconst _triangleNormal = /*@__PURE__*/ new Vector3();\nconst _testAxis = /*@__PURE__*/ new Vector3();\n\nfunction satForAxes( axes, v0, v1, v2, extents ) {\n\n\tfor ( let i = 0, j = axes.length - 3; i <= j; i += 3 ) {\n\n\t\t_testAxis.fromArray( axes, i );\n\t\t// project the aabb onto the separating axis\n\t\tconst r = extents.x * Math.abs( _testAxis.x ) + extents.y * Math.abs( _testAxis.y ) + extents.z * Math.abs( _testAxis.z );\n\t\t// project all 3 vertices of the triangle onto the separating axis\n\t\tconst p0 = v0.dot( _testAxis );\n\t\tconst p1 = v1.dot( _testAxis );\n\t\tconst p2 = v2.dot( _testAxis );\n\t\t// actual test, basically see if either of the most extreme of the triangle points intersects r\n\t\tif ( Math.max( - Math.max( p0, p1, p2 ), Math.min( p0, p1, p2 ) ) > r ) {\n\n\t\t\t// points of the projected triangle are outside the projected half-length of the aabb\n\t\t\t// the axis is separating and we can exit\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\treturn true;\n\n}\n\nconst _box$3 = /*@__PURE__*/ new Box3();\nconst _v1$6 = /*@__PURE__*/ new Vector3();\nconst _v2$3 = /*@__PURE__*/ new Vector3();\n\n/**\n * An analytical 3D sphere defined by a center and radius. This class is mainly\n * used as a Bounding Sphere for 3D objects.\n */\nclass Sphere {\n\n\t/**\n\t * Constructs a new sphere.\n\t *\n\t * @param {Vector3} [center=(0,0,0)] - The center of the sphere\n\t * @param {number} [radius=-1] - The radius of the sphere.\n\t */\n\tconstructor( center = new Vector3(), radius = -1 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSphere = true;\n\n\t\t/**\n\t\t * The center of the sphere\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.center = center;\n\n\t\t/**\n\t\t * The radius of the sphere.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.radius = radius;\n\n\t}\n\n\t/**\n\t * Sets the sphere's components by copying the given values.\n\t *\n\t * @param {Vector3} center - The center.\n\t * @param {number} radius - The radius.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tset( center, radius ) {\n\n\t\tthis.center.copy( center );\n\t\tthis.radius = radius;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the minimum bounding sphere for list of points.\n\t * If the optional center point is given, it is used as the sphere's\n\t * center. Otherwise, the center of the axis-aligned bounding box\n\t * encompassing the points is calculated.\n\t *\n\t * @param {Array<Vector3>} points - A list of points in 3D space.\n\t * @param {Vector3} [optionalCenter] - The center of the sphere.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tsetFromPoints( points, optionalCenter ) {\n\n\t\tconst center = this.center;\n\n\t\tif ( optionalCenter !== undefined ) {\n\n\t\t\tcenter.copy( optionalCenter );\n\n\t\t} else {\n\n\t\t\t_box$3.setFromPoints( points ).getCenter( center );\n\n\t\t}\n\n\t\tlet maxRadiusSq = 0;\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( points[ i ] ) );\n\n\t\t}\n\n\t\tthis.radius = Math.sqrt( maxRadiusSq );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given sphere to this instance.\n\t *\n\t * @param {Sphere} sphere - The sphere to copy.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tcopy( sphere ) {\n\n\t\tthis.center.copy( sphere.center );\n\t\tthis.radius = sphere.radius;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the sphere is empty (the radius set to a negative number).\n\t *\n\t * Spheres with a radius of `0` contain only their center point and are not\n\t * considered to be empty.\n\t *\n\t * @return {boolean} Whether this sphere is empty or not.\n\t */\n\tisEmpty() {\n\n\t\treturn ( this.radius < 0 );\n\n\t}\n\n\t/**\n\t * Makes this sphere empty which means in encloses a zero space in 3D.\n\t *\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tmakeEmpty() {\n\n\t\tthis.center.set( 0, 0, 0 );\n\t\tthis.radius = -1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere contains the given point inclusive of\n\t * the surface of the sphere.\n\t *\n\t * @param {Vector3} point - The point to check.\n\t * @return {boolean} Whether this sphere contains the given point or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn ( point.distanceToSquared( this.center ) <= ( this.radius * this.radius ) );\n\n\t}\n\n\t/**\n\t * Returns the closest distance from the boundary of the sphere to the\n\t * given point. If the sphere contains the point, the distance will\n\t * be negative.\n\t *\n\t * @param {Vector3} point - The point to compute the distance to.\n\t * @return {number} The distance to the point.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn ( point.distanceTo( this.center ) - this.radius );\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere intersects with the given one.\n\t *\n\t * @param {Sphere} sphere - The sphere to test.\n\t * @return {boolean} Whether this sphere intersects with the given one or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\tconst radiusSum = this.radius + sphere.radius;\n\n\t\treturn sphere.center.distanceToSquared( this.center ) <= ( radiusSum * radiusSum );\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere intersects with the given box.\n\t *\n\t * @param {Box3} box - The box to test.\n\t * @return {boolean} Whether this sphere intersects with the given box or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsSphere( this );\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere intersects with the given plane.\n\t *\n\t * @param {Plane} plane - The plane to test.\n\t * @return {boolean} Whether this sphere intersects with the given plane or not.\n\t */\n\tintersectsPlane( plane ) {\n\n\t\treturn Math.abs( plane.distanceToPoint( this.center ) ) <= this.radius;\n\n\t}\n\n\t/**\n\t * Clamps a point within the sphere. If the point is outside the sphere, it\n\t * will clamp it to the closest point on the edge of the sphere. Points\n\t * already inside the sphere will not be affected.\n\t *\n\t * @param {Vector3} point - The plane to clamp.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The clamped point.\n\t */\n\tclampPoint( point, target ) {\n\n\t\tconst deltaLengthSq = this.center.distanceToSquared( point );\n\n\t\ttarget.copy( point );\n\n\t\tif ( deltaLengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\ttarget.sub( this.center ).normalize();\n\t\t\ttarget.multiplyScalar( this.radius ).add( this.center );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns a bounding box that encloses this sphere.\n\t *\n\t * @param {Box3} target - The target box that is used to store the method's result.\n\t * @return {Box3} The bounding box that encloses this sphere.\n\t */\n\tgetBoundingBox( target ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\t// Empty sphere produces empty bounding box\n\t\t\ttarget.makeEmpty();\n\t\t\treturn target;\n\n\t\t}\n\n\t\ttarget.set( this.center, this.center );\n\t\ttarget.expandByScalar( this.radius );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Transforms this sphere with the given 4x4 transformation matrix.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.center.applyMatrix4( matrix );\n\t\tthis.radius = this.radius * matrix.getMaxScaleOnAxis();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates the sphere's center by the given offset.\n\t *\n\t * @param {Vector3} offset - The offset.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.center.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this sphere to include the given point.\n\t *\n\t * @param {Vector3} point - The point to include.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\texpandByPoint( point ) {\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\tthis.center.copy( point );\n\n\t\t\tthis.radius = 0;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\t_v1$6.subVectors( point, this.center );\n\n\t\tconst lengthSq = _v1$6.lengthSq();\n\n\t\tif ( lengthSq > ( this.radius * this.radius ) ) {\n\n\t\t\t// calculate the minimal sphere\n\n\t\t\tconst length = Math.sqrt( lengthSq );\n\n\t\t\tconst delta = ( length - this.radius ) * 0.5;\n\n\t\t\tthis.center.addScaledVector( _v1$6, delta / length );\n\n\t\t\tthis.radius += delta;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands this sphere to enclose both the original sphere and the given sphere.\n\t *\n\t * @param {Sphere} sphere - The sphere to include.\n\t * @return {Sphere} A reference to this sphere.\n\t */\n\tunion( sphere ) {\n\n\t\tif ( sphere.isEmpty() ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( this.isEmpty() ) {\n\n\t\t\tthis.copy( sphere );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( this.center.equals( sphere.center ) === true ) {\n\n\t\t\t this.radius = Math.max( this.radius, sphere.radius );\n\n\t\t} else {\n\n\t\t\t_v2$3.subVectors( sphere.center, this.center ).setLength( sphere.radius );\n\n\t\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).add( _v2$3 ) );\n\n\t\t\tthis.expandByPoint( _v1$6.copy( sphere.center ).sub( _v2$3 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this sphere is equal with the given one.\n\t *\n\t * @param {Sphere} sphere - The sphere to test for equality.\n\t * @return {boolean} Whether this bounding sphere is equal with the given one.\n\t */\n\tequals( sphere ) {\n\n\t\treturn sphere.center.equals( this.center ) && ( sphere.radius === this.radius );\n\n\t}\n\n\t/**\n\t * Returns a new sphere with copied values from this instance.\n\t *\n\t * @return {Sphere} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding sphere.\n\t *\n\t * @return {Object} Serialized structure with fields representing the object state.\n\t */\n\ttoJSON() {\n\n\t\treturn {\n\t\t\tradius: this.radius,\n\t\t\tcenter: this.center.toArray()\n\t\t};\n\n\t}\n\n\t/**\n\t * Returns a serialized structure of the bounding sphere.\n\t *\n\t * @param {Object} json - The serialized json to set the sphere from.\n\t * @return {Sphere} A reference to this bounding sphere.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.radius = json.radius;\n\t\tthis.center.fromArray( json.center );\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vector$a = /*@__PURE__*/ new Vector3();\nconst _segCenter = /*@__PURE__*/ new Vector3();\nconst _segDir = /*@__PURE__*/ new Vector3();\nconst _diff = /*@__PURE__*/ new Vector3();\n\nconst _edge1 = /*@__PURE__*/ new Vector3();\nconst _edge2 = /*@__PURE__*/ new Vector3();\nconst _normal$1 = /*@__PURE__*/ new Vector3();\n\n/**\n * A ray that emits from an origin in a certain direction. The class is used by\n * {@link Raycaster} to assist with raycasting. Raycasting is used for\n * mouse picking (working out what objects in the 3D space the mouse is over)\n * amongst other things.\n */\nclass Ray {\n\n\t/**\n\t * Constructs a new ray.\n\t *\n\t * @param {Vector3} [origin=(0,0,0)] - The origin of the ray.\n\t * @param {Vector3} [direction=(0,0,-1)] - The (normalized) direction of the ray.\n\t */\n\tconstructor( origin = new Vector3(), direction = new Vector3( 0, 0, -1 ) ) {\n\n\t\t/**\n\t\t * The origin of the ray.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.origin = origin;\n\n\t\t/**\n\t\t * The (normalized) direction of the ray.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.direction = direction;\n\n\t}\n\n\t/**\n\t * Sets the ray's components by copying the given values.\n\t *\n\t * @param {Vector3} origin - The origin.\n\t * @param {Vector3} direction - The direction.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tset( origin, direction ) {\n\n\t\tthis.origin.copy( origin );\n\t\tthis.direction.copy( direction );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given ray to this instance.\n\t *\n\t * @param {Ray} ray - The ray to copy.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tcopy( ray ) {\n\n\t\tthis.origin.copy( ray.origin );\n\t\tthis.direction.copy( ray.direction );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a vector that is located at a given distance along this ray.\n\t *\n\t * @param {number} t - The distance along the ray to retrieve a position for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} A position on the ray.\n\t */\n\tat( t, target ) {\n\n\t\treturn target.copy( this.origin ).addScaledVector( this.direction, t );\n\n\t}\n\n\t/**\n\t * Adjusts the direction of the ray to point at the given vector in world space.\n\t *\n\t * @param {Vector3} v - The target position.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tlookAt( v ) {\n\n\t\tthis.direction.copy( v ).sub( this.origin ).normalize();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Shift the origin of this ray along its direction by the given distance.\n\t *\n\t * @param {number} t - The distance along the ray to interpolate.\n\t * @return {Ray} A reference to this ray.\n\t */\n\trecast( t ) {\n\n\t\tthis.origin.copy( this.at( t, _vector$a ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the point along this ray that is closest to the given point.\n\t *\n\t * @param {Vector3} point - A point in 3D space to get the closet location on the ray for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The closest point on this ray.\n\t */\n\tclosestPointToPoint( point, target ) {\n\n\t\ttarget.subVectors( point, this.origin );\n\n\t\tconst directionDistance = target.dot( this.direction );\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn target.copy( this.origin );\n\n\t\t}\n\n\t\treturn target.copy( this.origin ).addScaledVector( this.direction, directionDistance );\n\n\t}\n\n\t/**\n\t * Returns the distance of the closest approach between this ray and the given point.\n\t *\n\t * @param {Vector3} point - A point in 3D space to compute the distance to.\n\t * @return {number} The distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn Math.sqrt( this.distanceSqToPoint( point ) );\n\n\t}\n\n\t/**\n\t * Returns the squared distance of the closest approach between this ray and the given point.\n\t *\n\t * @param {Vector3} point - A point in 3D space to compute the distance to.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceSqToPoint( point ) {\n\n\t\tconst directionDistance = _vector$a.subVectors( point, this.origin ).dot( this.direction );\n\n\t\t// point behind the ray\n\n\t\tif ( directionDistance < 0 ) {\n\n\t\t\treturn this.origin.distanceToSquared( point );\n\n\t\t}\n\n\t\t_vector$a.copy( this.origin ).addScaledVector( this.direction, directionDistance );\n\n\t\treturn _vector$a.distanceToSquared( point );\n\n\t}\n\n\t/**\n\t * Returns the squared distance between this ray and the given line segment.\n\t *\n\t * @param {Vector3} v0 - The start point of the line segment.\n\t * @param {Vector3} v1 - The end point of the line segment.\n\t * @param {Vector3} [optionalPointOnRay] - When provided, it receives the point on this ray that is closest to the segment.\n\t * @param {Vector3} [optionalPointOnSegment] - When provided, it receives the point on the line segment that is closest to this ray.\n\t * @return {number} The squared distance.\n\t */\n\tdistanceSqToSegment( v0, v1, optionalPointOnRay, optionalPointOnSegment ) {\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteDistRaySegment.h\n\t\t// It returns the min distance between the ray and the segment\n\t\t// defined by v0 and v1\n\t\t// It can also set two optional targets :\n\t\t// - The closest point on the ray\n\t\t// - The closest point on the segment\n\n\t\t_segCenter.copy( v0 ).add( v1 ).multiplyScalar( 0.5 );\n\t\t_segDir.copy( v1 ).sub( v0 ).normalize();\n\t\t_diff.copy( this.origin ).sub( _segCenter );\n\n\t\tconst segExtent = v0.distanceTo( v1 ) * 0.5;\n\t\tconst a01 = - this.direction.dot( _segDir );\n\t\tconst b0 = _diff.dot( this.direction );\n\t\tconst b1 = - _diff.dot( _segDir );\n\t\tconst c = _diff.lengthSq();\n\t\tconst det = Math.abs( 1 - a01 * a01 );\n\t\tlet s0, s1, sqrDist, extDet;\n\n\t\tif ( det > 0 ) {\n\n\t\t\t// The ray and segment are not parallel.\n\n\t\t\ts0 = a01 * b1 - b0;\n\t\t\ts1 = a01 * b0 - b1;\n\t\t\textDet = segExtent * det;\n\n\t\t\tif ( s0 >= 0 ) {\n\n\t\t\t\tif ( s1 >= - extDet ) {\n\n\t\t\t\t\tif ( s1 <= extDet ) {\n\n\t\t\t\t\t\t// region 0\n\t\t\t\t\t\t// Minimum at interior points of ray and segment.\n\n\t\t\t\t\t\tconst invDet = 1 / det;\n\t\t\t\t\t\ts0 *= invDet;\n\t\t\t\t\t\ts1 *= invDet;\n\t\t\t\t\t\tsqrDist = s0 * ( s0 + a01 * s1 + 2 * b0 ) + s1 * ( a01 * s0 + s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// region 1\n\n\t\t\t\t\t\ts1 = segExtent;\n\t\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 5\n\n\t\t\t\t\ts1 = - segExtent;\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( s1 <= - extDet ) {\n\n\t\t\t\t\t// region 4\n\n\t\t\t\t\ts0 = Math.max( 0, - ( - a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? - segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else if ( s1 <= extDet ) {\n\n\t\t\t\t\t// region 3\n\n\t\t\t\t\ts0 = 0;\n\t\t\t\t\ts1 = Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// region 2\n\n\t\t\t\t\ts0 = Math.max( 0, - ( a01 * segExtent + b0 ) );\n\t\t\t\t\ts1 = ( s0 > 0 ) ? segExtent : Math.min( Math.max( - segExtent, - b1 ), segExtent );\n\t\t\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// Ray and segment are parallel.\n\n\t\t\ts1 = ( a01 > 0 ) ? - segExtent : segExtent;\n\t\t\ts0 = Math.max( 0, - ( a01 * s1 + b0 ) );\n\t\t\tsqrDist = - s0 * s0 + s1 * ( s1 + 2 * b1 ) + c;\n\n\t\t}\n\n\t\tif ( optionalPointOnRay ) {\n\n\t\t\toptionalPointOnRay.copy( this.origin ).addScaledVector( this.direction, s0 );\n\n\t\t}\n\n\t\tif ( optionalPointOnSegment ) {\n\n\t\t\toptionalPointOnSegment.copy( _segCenter ).addScaledVector( _segDir, s1 );\n\n\t\t}\n\n\t\treturn sqrDist;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given sphere, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Sphere} sphere - The sphere to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectSphere( sphere, target ) {\n\n\t\t_vector$a.subVectors( sphere.center, this.origin );\n\t\tconst tca = _vector$a.dot( this.direction );\n\t\tconst d2 = _vector$a.dot( _vector$a ) - tca * tca;\n\t\tconst radius2 = sphere.radius * sphere.radius;\n\n\t\tif ( d2 > radius2 ) return null;\n\n\t\tconst thc = Math.sqrt( radius2 - d2 );\n\n\t\t// t0 = first intersect point - entrance on front of sphere\n\t\tconst t0 = tca - thc;\n\n\t\t// t1 = second intersect point - exit point on back of sphere\n\t\tconst t1 = tca + thc;\n\n\t\t// test to see if t1 is behind the ray - if so, return null\n\t\tif ( t1 < 0 ) return null;\n\n\t\t// test to see if t0 is behind the ray:\n\t\t// if it is, the ray is inside the sphere, so return the second exit point scaled by t1,\n\t\t// in order to always return an intersect point that is in front of the ray.\n\t\tif ( t0 < 0 ) return this.at( t1, target );\n\n\t\t// else t0 is in front of the ray, so return the first collision point scaled by t0\n\t\treturn this.at( t0, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given sphere.\n\t *\n\t * @param {Sphere} sphere - The sphere to intersect.\n\t * @return {boolean} Whether this ray intersects with the given sphere or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\tif ( sphere.radius < 0 ) return false; // handle empty spheres, see #31187\n\n\t\treturn this.distanceSqToPoint( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\t/**\n\t * Computes the distance from the ray's origin to the given plane. Returns `null` if the ray\n\t * does not intersect with the plane.\n\t *\n\t * @param {Plane} plane - The plane to compute the distance to.\n\t * @return {?number} Whether this ray intersects with the given sphere or not.\n\t */\n\tdistanceToPlane( plane ) {\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( plane.distanceToPoint( this.origin ) === 0 ) {\n\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t\t// Null is preferable to undefined since undefined means.... it is undefined\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( this.origin.dot( plane.normal ) + plane.constant ) / denominator;\n\n\t\t// Return if the ray never intersects the plane\n\n\t\treturn t >= 0 ? t : null;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given plane, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Plane} plane - The plane to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectPlane( plane, target ) {\n\n\t\tconst t = this.distanceToPlane( plane );\n\n\t\tif ( t === null ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn this.at( t, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given plane.\n\t *\n\t * @param {Plane} plane - The plane to intersect.\n\t * @return {boolean} Whether this ray intersects with the given plane or not.\n\t */\n\tintersectsPlane( plane ) {\n\n\t\t// check if the ray lies on the plane first\n\n\t\tconst distToPoint = plane.distanceToPoint( this.origin );\n\n\t\tif ( distToPoint === 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tconst denominator = plane.normal.dot( this.direction );\n\n\t\tif ( denominator * distToPoint < 0 ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\t// ray origin is behind the plane (and is pointing behind it)\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given bounding box, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Box3} box - The box to intersect.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectBox( box, target ) {\n\n\t\tlet tmin, tmax, tymin, tymax, tzmin, tzmax;\n\n\t\tconst invdirx = 1 / this.direction.x,\n\t\t\tinvdiry = 1 / this.direction.y,\n\t\t\tinvdirz = 1 / this.direction.z;\n\n\t\tconst origin = this.origin;\n\n\t\tif ( invdirx >= 0 ) {\n\n\t\t\ttmin = ( box.min.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.max.x - origin.x ) * invdirx;\n\n\t\t} else {\n\n\t\t\ttmin = ( box.max.x - origin.x ) * invdirx;\n\t\t\ttmax = ( box.min.x - origin.x ) * invdirx;\n\n\t\t}\n\n\t\tif ( invdiry >= 0 ) {\n\n\t\t\ttymin = ( box.min.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.max.y - origin.y ) * invdiry;\n\n\t\t} else {\n\n\t\t\ttymin = ( box.max.y - origin.y ) * invdiry;\n\t\t\ttymax = ( box.min.y - origin.y ) * invdiry;\n\n\t\t}\n\n\t\tif ( ( tmin > tymax ) || ( tymin > tmax ) ) return null;\n\n\t\tif ( tymin > tmin || isNaN( tmin ) ) tmin = tymin;\n\n\t\tif ( tymax < tmax || isNaN( tmax ) ) tmax = tymax;\n\n\t\tif ( invdirz >= 0 ) {\n\n\t\t\ttzmin = ( box.min.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.max.z - origin.z ) * invdirz;\n\n\t\t} else {\n\n\t\t\ttzmin = ( box.max.z - origin.z ) * invdirz;\n\t\t\ttzmax = ( box.min.z - origin.z ) * invdirz;\n\n\t\t}\n\n\t\tif ( ( tmin > tzmax ) || ( tzmin > tmax ) ) return null;\n\n\t\tif ( tzmin > tmin || tmin !== tmin ) tmin = tzmin;\n\n\t\tif ( tzmax < tmax || tmax !== tmax ) tmax = tzmax;\n\n\t\t//return point closest to the ray (positive side)\n\n\t\tif ( tmax < 0 ) return null;\n\n\t\treturn this.at( tmin >= 0 ? tmin : tmax, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray intersects with the given box.\n\t *\n\t * @param {Box3} box - The box to intersect.\n\t * @return {boolean} Whether this ray intersects with the given box or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn this.intersectBox( box, _vector$a ) !== null;\n\n\t}\n\n\t/**\n\t * Intersects this ray with the given triangle, returning the intersection\n\t * point or `null` if there is no intersection.\n\t *\n\t * @param {Vector3} a - The first vertex of the triangle.\n\t * @param {Vector3} b - The second vertex of the triangle.\n\t * @param {Vector3} c - The third vertex of the triangle.\n\t * @param {boolean} backfaceCulling - Whether to use backface culling or not.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectTriangle( a, b, c, backfaceCulling, target ) {\n\n\t\t// Compute the offset origin, edges, and normal.\n\n\t\t// from https://github.com/pmjoniak/GeometricTools/blob/master/GTEngine/Include/Mathematics/GteIntrRay3Triangle3.h\n\n\t\t_edge1.subVectors( b, a );\n\t\t_edge2.subVectors( c, a );\n\t\t_normal$1.crossVectors( _edge1, _edge2 );\n\n\t\t// Solve Q + t*D = b1*E1 + b2*E2 (Q = kDiff, D = ray direction,\n\t\t// E1 = kEdge1, E2 = kEdge2, N = Cross(E1,E2)) by\n\t\t//   |Dot(D,N)|*b1 = sign(Dot(D,N))*Dot(D,Cross(Q,E2))\n\t\t//   |Dot(D,N)|*b2 = sign(Dot(D,N))*Dot(D,Cross(E1,Q))\n\t\t//   |Dot(D,N)|*t = -sign(Dot(D,N))*Dot(Q,N)\n\t\tlet DdN = this.direction.dot( _normal$1 );\n\t\tlet sign;\n\n\t\tif ( DdN > 0 ) {\n\n\t\t\tif ( backfaceCulling ) return null;\n\t\t\tsign = 1;\n\n\t\t} else if ( DdN < 0 ) {\n\n\t\t\tsign = -1;\n\t\t\tDdN = - DdN;\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t_diff.subVectors( this.origin, a );\n\t\tconst DdQxE2 = sign * this.direction.dot( _edge2.crossVectors( _diff, _edge2 ) );\n\n\t\t// b1 < 0, no intersection\n\t\tif ( DdQxE2 < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst DdE1xQ = sign * this.direction.dot( _edge1.cross( _diff ) );\n\n\t\t// b2 < 0, no intersection\n\t\tif ( DdE1xQ < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// b1+b2 > 1, no intersection\n\t\tif ( DdQxE2 + DdE1xQ > DdN ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Line intersects triangle, check if ray does.\n\t\tconst QdN = - sign * _diff.dot( _normal$1 );\n\n\t\t// t < 0, no intersection\n\t\tif ( QdN < 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// Ray intersects triangle.\n\t\treturn this.at( QdN / DdN, target );\n\n\t}\n\n\t/**\n\t * Transforms this ray with the given 4x4 transformation matrix.\n\t *\n\t * @param {Matrix4} matrix4 - The transformation matrix.\n\t * @return {Ray} A reference to this ray.\n\t */\n\tapplyMatrix4( matrix4 ) {\n\n\t\tthis.origin.applyMatrix4( matrix4 );\n\t\tthis.direction.transformDirection( matrix4 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this ray is equal with the given one.\n\t *\n\t * @param {Ray} ray - The ray to test for equality.\n\t * @return {boolean} Whether this ray is equal with the given one.\n\t */\n\tequals( ray ) {\n\n\t\treturn ray.origin.equals( this.origin ) && ray.direction.equals( this.direction );\n\n\t}\n\n\t/**\n\t * Returns a new ray with copied values from this instance.\n\t *\n\t * @return {Ray} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * Represents a 4x4 matrix.\n *\n * The most common use of a 4x4 matrix in 3D computer graphics is as a transformation matrix.\n * For an introduction to transformation matrices as used in WebGL, check out [this tutorial](https://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices)\n *\n * This allows a 3D vector representing a point in 3D space to undergo\n * transformations such as translation, rotation, shear, scale, reflection,\n * orthogonal or perspective projection and so on, by being multiplied by the\n * matrix. This is known as `applying` the matrix to the vector.\n *\n * A Note on Row-Major and Column-Major Ordering:\n *\n * The constructor and {@link Matrix3#set} method take arguments in\n * [row-major](https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order)\n * order, while internally they are stored in the {@link Matrix3#elements} array in column-major order.\n * This means that calling:\n * ```js\n * const m = new THREE.Matrix4();\n * m.set( 11, 12, 13, 14,\n *        21, 22, 23, 24,\n *        31, 32, 33, 34,\n *        41, 42, 43, 44 );\n * ```\n * will result in the elements array containing:\n * ```js\n * m.elements = [ 11, 21, 31, 41,\n *                12, 22, 32, 42,\n *                13, 23, 33, 43,\n *                14, 24, 34, 44 ];\n * ```\n * and internally all calculations are performed using column-major ordering.\n * However, as the actual ordering makes no difference mathematically and\n * most people are used to thinking about matrices in row-major order, the\n * three.js documentation shows matrices in row-major order. Just bear in\n * mind that if you are reading the source code, you'll have to take the\n * transpose of any matrices outlined here to make sense of the calculations.\n */\nclass Matrix4 {\n\n\t/**\n\t * Constructs a new 4x4 matrix. The arguments are supposed to be\n\t * in row-major order. If no arguments are provided, the constructor\n\t * initializes the matrix as an identity matrix.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n14] - 1-4 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n24] - 2-4 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t * @param {number} [n34] - 3-4 matrix element.\n\t * @param {number} [n41] - 4-1 matrix element.\n\t * @param {number} [n42] - 4-2 matrix element.\n\t * @param {number} [n43] - 4-3 matrix element.\n\t * @param {number} [n44] - 4-4 matrix element.\n\t */\n\tconstructor( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tMatrix4.prototype.isMatrix4 = true;\n\n\t\t/**\n\t\t * A column-major list of matrix values.\n\t\t *\n\t\t * @type {Array<number>}\n\t\t */\n\t\tthis.elements = [\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix.The arguments are supposed to be\n\t * in row-major order.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n13] - 1-3 matrix element.\n\t * @param {number} [n14] - 1-4 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t * @param {number} [n23] - 2-3 matrix element.\n\t * @param {number} [n24] - 2-4 matrix element.\n\t * @param {number} [n31] - 3-1 matrix element.\n\t * @param {number} [n32] - 3-2 matrix element.\n\t * @param {number} [n33] - 3-3 matrix element.\n\t * @param {number} [n34] - 3-4 matrix element.\n\t * @param {number} [n41] - 4-1 matrix element.\n\t * @param {number} [n42] - 4-2 matrix element.\n\t * @param {number} [n43] - 4-3 matrix element.\n\t * @param {number} [n44] - 4-4 matrix element.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tset( n11, n12, n13, n14, n21, n22, n23, n24, n31, n32, n33, n34, n41, n42, n43, n44 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 4 ] = n12; te[ 8 ] = n13; te[ 12 ] = n14;\n\t\tte[ 1 ] = n21; te[ 5 ] = n22; te[ 9 ] = n23; te[ 13 ] = n24;\n\t\tte[ 2 ] = n31; te[ 6 ] = n32; te[ 10 ] = n33; te[ 14 ] = n34;\n\t\tte[ 3 ] = n41; te[ 7 ] = n42; te[ 11 ] = n43; te[ 15 ] = n44;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix to the 4x4 identity matrix.\n\t *\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tidentity() {\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, 1, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a matrix with copied values from this instance.\n\t *\n\t * @return {Matrix4} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Matrix4().fromArray( this.elements );\n\n\t}\n\n\t/**\n\t * Copies the values of the given matrix to this instance.\n\t *\n\t * @param {Matrix4} m - The matrix to copy.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tcopy( m ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tte[ 0 ] = me[ 0 ]; te[ 1 ] = me[ 1 ]; te[ 2 ] = me[ 2 ]; te[ 3 ] = me[ 3 ];\n\t\tte[ 4 ] = me[ 4 ]; te[ 5 ] = me[ 5 ]; te[ 6 ] = me[ 6 ]; te[ 7 ] = me[ 7 ];\n\t\tte[ 8 ] = me[ 8 ]; te[ 9 ] = me[ 9 ]; te[ 10 ] = me[ 10 ]; te[ 11 ] = me[ 11 ];\n\t\tte[ 12 ] = me[ 12 ]; te[ 13 ] = me[ 13 ]; te[ 14 ] = me[ 14 ]; te[ 15 ] = me[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the translation component of the given matrix\n\t * into this matrix's translation component.\n\t *\n\t * @param {Matrix4} m - The matrix to copy the translation component.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tcopyPosition( m ) {\n\n\t\tconst te = this.elements, me = m.elements;\n\n\t\tte[ 12 ] = me[ 12 ];\n\t\tte[ 13 ] = me[ 13 ];\n\t\tte[ 14 ] = me[ 14 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Set the upper 3x3 elements of this matrix to the values of given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The 3x3 matrix.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tsetFromMatrix3( m ) {\n\n\t\tconst me = m.elements;\n\n\t\tthis.set(\n\n\t\t\tme[ 0 ], me[ 3 ], me[ 6 ], 0,\n\t\t\tme[ 1 ], me[ 4 ], me[ 7 ], 0,\n\t\t\tme[ 2 ], me[ 5 ], me[ 8 ], 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Extracts the basis of this matrix into the three axis vectors provided.\n\t *\n\t * @param {Vector3} xAxis - The basis's x axis.\n\t * @param {Vector3} yAxis - The basis's y axis.\n\t * @param {Vector3} zAxis - The basis's z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\textractBasis( xAxis, yAxis, zAxis ) {\n\n\t\tif ( this.determinant() === 0 ) {\n\n\t\t\txAxis.set( 1, 0, 0 );\n\t\t\tyAxis.set( 0, 1, 0 );\n\t\t\tzAxis.set( 0, 0, 1 );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\txAxis.setFromMatrixColumn( this, 0 );\n\t\tyAxis.setFromMatrixColumn( this, 1 );\n\t\tzAxis.setFromMatrixColumn( this, 2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given basis vectors to this matrix.\n\t *\n\t * @param {Vector3} xAxis - The basis's x axis.\n\t * @param {Vector3} yAxis - The basis's y axis.\n\t * @param {Vector3} zAxis - The basis's z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeBasis( xAxis, yAxis, zAxis ) {\n\n\t\tthis.set(\n\t\t\txAxis.x, yAxis.x, zAxis.x, 0,\n\t\t\txAxis.y, yAxis.y, zAxis.y, 0,\n\t\t\txAxis.z, yAxis.z, zAxis.z, 0,\n\t\t\t0, 0, 0, 1\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Extracts the rotation component of the given matrix\n\t * into this matrix's rotation component.\n\t *\n\t * Note: This method does not support reflection matrices.\n\t *\n\t * @param {Matrix4} m - The matrix.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\textractRotation( m ) {\n\n\t\tif ( m.determinant() === 0 ) {\n\n\t\t\treturn this.identity();\n\n\t\t}\n\n\t\tconst te = this.elements;\n\t\tconst me = m.elements;\n\n\t\tconst scaleX = 1 / _v1$5.setFromMatrixColumn( m, 0 ).length();\n\t\tconst scaleY = 1 / _v1$5.setFromMatrixColumn( m, 1 ).length();\n\t\tconst scaleZ = 1 / _v1$5.setFromMatrixColumn( m, 2 ).length();\n\n\t\tte[ 0 ] = me[ 0 ] * scaleX;\n\t\tte[ 1 ] = me[ 1 ] * scaleX;\n\t\tte[ 2 ] = me[ 2 ] * scaleX;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = me[ 4 ] * scaleY;\n\t\tte[ 5 ] = me[ 5 ] * scaleY;\n\t\tte[ 6 ] = me[ 6 ] * scaleY;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = me[ 8 ] * scaleZ;\n\t\tte[ 9 ] = me[ 9 ] * scaleZ;\n\t\tte[ 10 ] = me[ 10 ] * scaleZ;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the rotation component (the upper left 3x3 matrix) of this matrix to\n\t * the rotation specified by the given Euler angles. The rest of\n\t * the matrix is set to the identity. Depending on the {@link Euler#order},\n\t * there are six possible outcomes. See [this page](https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix)\n\t * for a complete list.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationFromEuler( euler ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = euler.x, y = euler.y, z = euler.z;\n\t\tconst a = Math.cos( x ), b = Math.sin( x );\n\t\tconst c = Math.cos( y ), d = Math.sin( y );\n\t\tconst e = Math.cos( z ), f = Math.sin( z );\n\n\t\tif ( euler.order === 'XYZ' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - c * f;\n\t\t\tte[ 8 ] = d;\n\n\t\t\tte[ 1 ] = af + be * d;\n\t\t\tte[ 5 ] = ae - bf * d;\n\t\t\tte[ 9 ] = - b * c;\n\n\t\t\tte[ 2 ] = bf - ae * d;\n\t\t\tte[ 6 ] = be + af * d;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YXZ' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce + df * b;\n\t\t\tte[ 4 ] = de * b - cf;\n\t\t\tte[ 8 ] = a * d;\n\n\t\t\tte[ 1 ] = a * f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b;\n\n\t\t\tte[ 2 ] = cf * b - de;\n\t\t\tte[ 6 ] = df + ce * b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZXY' ) {\n\n\t\t\tconst ce = c * e, cf = c * f, de = d * e, df = d * f;\n\n\t\t\tte[ 0 ] = ce - df * b;\n\t\t\tte[ 4 ] = - a * f;\n\t\t\tte[ 8 ] = de + cf * b;\n\n\t\t\tte[ 1 ] = cf + de * b;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = df - ce * b;\n\n\t\t\tte[ 2 ] = - a * d;\n\t\t\tte[ 6 ] = b;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'ZYX' ) {\n\n\t\t\tconst ae = a * e, af = a * f, be = b * e, bf = b * f;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = be * d - af;\n\t\t\tte[ 8 ] = ae * d + bf;\n\n\t\t\tte[ 1 ] = c * f;\n\t\t\tte[ 5 ] = bf * d + ae;\n\t\t\tte[ 9 ] = af * d - be;\n\n\t\t\tte[ 2 ] = - d;\n\t\t\tte[ 6 ] = b * c;\n\t\t\tte[ 10 ] = a * c;\n\n\t\t} else if ( euler.order === 'YZX' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = bd - ac * f;\n\t\t\tte[ 8 ] = bc * f + ad;\n\n\t\t\tte[ 1 ] = f;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = - b * e;\n\n\t\t\tte[ 2 ] = - d * e;\n\t\t\tte[ 6 ] = ad * f + bc;\n\t\t\tte[ 10 ] = ac - bd * f;\n\n\t\t} else if ( euler.order === 'XZY' ) {\n\n\t\t\tconst ac = a * c, ad = a * d, bc = b * c, bd = b * d;\n\n\t\t\tte[ 0 ] = c * e;\n\t\t\tte[ 4 ] = - f;\n\t\t\tte[ 8 ] = d * e;\n\n\t\t\tte[ 1 ] = ac * f + bd;\n\t\t\tte[ 5 ] = a * e;\n\t\t\tte[ 9 ] = ad * f - bc;\n\n\t\t\tte[ 2 ] = bc * f - ad;\n\t\t\tte[ 6 ] = b * e;\n\t\t\tte[ 10 ] = bd * f + ac;\n\n\t\t}\n\n\t\t// bottom row\n\t\tte[ 3 ] = 0;\n\t\tte[ 7 ] = 0;\n\t\tte[ 11 ] = 0;\n\n\t\t// last column\n\t\tte[ 12 ] = 0;\n\t\tte[ 13 ] = 0;\n\t\tte[ 14 ] = 0;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the rotation component of this matrix to the rotation specified by\n\t * the given Quaternion as outlined [here](https://en.wikipedia.org/wiki/Rotation_matrix#Quaternion)\n\t * The rest of the matrix is set to the identity.\n\t *\n\t * @param {Quaternion} q - The Quaternion.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationFromQuaternion( q ) {\n\n\t\treturn this.compose( _zero, q, _one );\n\n\t}\n\n\t/**\n\t * Sets the rotation component of the transformation matrix, looking from `eye` towards\n\t * `target`, and oriented by the up-direction.\n\t *\n\t * @param {Vector3} eye - The eye vector.\n\t * @param {Vector3} target - The target vector.\n\t * @param {Vector3} up - The up vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tlookAt( eye, target, up ) {\n\n\t\tconst te = this.elements;\n\n\t\t_z.subVectors( eye, target );\n\n\t\tif ( _z.lengthSq() === 0 ) {\n\n\t\t\t// eye and target are in the same position\n\n\t\t\t_z.z = 1;\n\n\t\t}\n\n\t\t_z.normalize();\n\t\t_x.crossVectors( up, _z );\n\n\t\tif ( _x.lengthSq() === 0 ) {\n\n\t\t\t// up and z are parallel\n\n\t\t\tif ( Math.abs( up.z ) === 1 ) {\n\n\t\t\t\t_z.x += 0.0001;\n\n\t\t\t} else {\n\n\t\t\t\t_z.z += 0.0001;\n\n\t\t\t}\n\n\t\t\t_z.normalize();\n\t\t\t_x.crossVectors( up, _z );\n\n\t\t}\n\n\t\t_x.normalize();\n\t\t_y.crossVectors( _z, _x );\n\n\t\tte[ 0 ] = _x.x; te[ 4 ] = _y.x; te[ 8 ] = _z.x;\n\t\tte[ 1 ] = _x.y; te[ 5 ] = _y.y; te[ 9 ] = _z.y;\n\t\tte[ 2 ] = _x.z; te[ 6 ] = _y.z; te[ 10 ] = _z.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Post-multiplies this matrix by the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The matrix to multiply with.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmultiply( m ) {\n\n\t\treturn this.multiplyMatrices( this, m );\n\n\t}\n\n\t/**\n\t * Pre-multiplies this matrix by the given 4x4 matrix.\n\t *\n\t * @param {Matrix4} m - The matrix to multiply with.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tpremultiply( m ) {\n\n\t\treturn this.multiplyMatrices( m, this );\n\n\t}\n\n\t/**\n\t * Multiples the given 4x4 matrices and stores the result\n\t * in this matrix.\n\t *\n\t * @param {Matrix4} a - The first matrix.\n\t * @param {Matrix4} b - The second matrix.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmultiplyMatrices( a, b ) {\n\n\t\tconst ae = a.elements;\n\t\tconst be = b.elements;\n\t\tconst te = this.elements;\n\n\t\tconst a11 = ae[ 0 ], a12 = ae[ 4 ], a13 = ae[ 8 ], a14 = ae[ 12 ];\n\t\tconst a21 = ae[ 1 ], a22 = ae[ 5 ], a23 = ae[ 9 ], a24 = ae[ 13 ];\n\t\tconst a31 = ae[ 2 ], a32 = ae[ 6 ], a33 = ae[ 10 ], a34 = ae[ 14 ];\n\t\tconst a41 = ae[ 3 ], a42 = ae[ 7 ], a43 = ae[ 11 ], a44 = ae[ 15 ];\n\n\t\tconst b11 = be[ 0 ], b12 = be[ 4 ], b13 = be[ 8 ], b14 = be[ 12 ];\n\t\tconst b21 = be[ 1 ], b22 = be[ 5 ], b23 = be[ 9 ], b24 = be[ 13 ];\n\t\tconst b31 = be[ 2 ], b32 = be[ 6 ], b33 = be[ 10 ], b34 = be[ 14 ];\n\t\tconst b41 = be[ 3 ], b42 = be[ 7 ], b43 = be[ 11 ], b44 = be[ 15 ];\n\n\t\tte[ 0 ] = a11 * b11 + a12 * b21 + a13 * b31 + a14 * b41;\n\t\tte[ 4 ] = a11 * b12 + a12 * b22 + a13 * b32 + a14 * b42;\n\t\tte[ 8 ] = a11 * b13 + a12 * b23 + a13 * b33 + a14 * b43;\n\t\tte[ 12 ] = a11 * b14 + a12 * b24 + a13 * b34 + a14 * b44;\n\n\t\tte[ 1 ] = a21 * b11 + a22 * b21 + a23 * b31 + a24 * b41;\n\t\tte[ 5 ] = a21 * b12 + a22 * b22 + a23 * b32 + a24 * b42;\n\t\tte[ 9 ] = a21 * b13 + a22 * b23 + a23 * b33 + a24 * b43;\n\t\tte[ 13 ] = a21 * b14 + a22 * b24 + a23 * b34 + a24 * b44;\n\n\t\tte[ 2 ] = a31 * b11 + a32 * b21 + a33 * b31 + a34 * b41;\n\t\tte[ 6 ] = a31 * b12 + a32 * b22 + a33 * b32 + a34 * b42;\n\t\tte[ 10 ] = a31 * b13 + a32 * b23 + a33 * b33 + a34 * b43;\n\t\tte[ 14 ] = a31 * b14 + a32 * b24 + a33 * b34 + a34 * b44;\n\n\t\tte[ 3 ] = a41 * b11 + a42 * b21 + a43 * b31 + a44 * b41;\n\t\tte[ 7 ] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42;\n\t\tte[ 11 ] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43;\n\t\tte[ 15 ] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies every component of the matrix by the given scalar.\n\t *\n\t * @param {number} s - The scalar.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmultiplyScalar( s ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] *= s; te[ 4 ] *= s; te[ 8 ] *= s; te[ 12 ] *= s;\n\t\tte[ 1 ] *= s; te[ 5 ] *= s; te[ 9 ] *= s; te[ 13 ] *= s;\n\t\tte[ 2 ] *= s; te[ 6 ] *= s; te[ 10 ] *= s; te[ 14 ] *= s;\n\t\tte[ 3 ] *= s; te[ 7 ] *= s; te[ 11 ] *= s; te[ 15 ] *= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes and returns the determinant of this matrix.\n\t *\n\t * Based on the method outlined [here](http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.html).\n\t *\n\t * @return {number} The determinant.\n\t */\n\tdeterminant() {\n\n\t\tconst te = this.elements;\n\n\t\tconst n11 = te[ 0 ], n12 = te[ 4 ], n13 = te[ 8 ], n14 = te[ 12 ];\n\t\tconst n21 = te[ 1 ], n22 = te[ 5 ], n23 = te[ 9 ], n24 = te[ 13 ];\n\t\tconst n31 = te[ 2 ], n32 = te[ 6 ], n33 = te[ 10 ], n34 = te[ 14 ];\n\t\tconst n41 = te[ 3 ], n42 = te[ 7 ], n43 = te[ 11 ], n44 = te[ 15 ];\n\n\t\tconst t11 = n23 * n34 - n24 * n33;\n\t\tconst t12 = n22 * n34 - n24 * n32;\n\t\tconst t13 = n22 * n33 - n23 * n32;\n\n\t\tconst t21 = n21 * n34 - n24 * n31;\n\t\tconst t22 = n21 * n33 - n23 * n31;\n\t\tconst t23 = n21 * n32 - n22 * n31;\n\n\t\treturn n11 * ( n42 * t11 - n43 * t12 + n44 * t13 ) -\n\t\t\tn12 * ( n41 * t11 - n43 * t21 + n44 * t22 ) +\n\t\t\tn13 * ( n41 * t12 - n42 * t21 + n44 * t23 ) -\n\t\t\tn14 * ( n41 * t13 - n42 * t22 + n43 * t23 );\n\n\t}\n\n\t/**\n\t * Transposes this matrix in place.\n\t *\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\ttranspose() {\n\n\t\tconst te = this.elements;\n\t\tlet tmp;\n\n\t\ttmp = te[ 1 ]; te[ 1 ] = te[ 4 ]; te[ 4 ] = tmp;\n\t\ttmp = te[ 2 ]; te[ 2 ] = te[ 8 ]; te[ 8 ] = tmp;\n\t\ttmp = te[ 6 ]; te[ 6 ] = te[ 9 ]; te[ 9 ] = tmp;\n\n\t\ttmp = te[ 3 ]; te[ 3 ] = te[ 12 ]; te[ 12 ] = tmp;\n\t\ttmp = te[ 7 ]; te[ 7 ] = te[ 13 ]; te[ 13 ] = tmp;\n\t\ttmp = te[ 11 ]; te[ 11 ] = te[ 14 ]; te[ 14 ] = tmp;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the position component for this matrix from the given vector,\n\t * without affecting the rest of the matrix.\n\t *\n\t * @param {number|Vector3} x - The x component of the vector or alternatively the vector object.\n\t * @param {number} y - The y component of the vector.\n\t * @param {number} z - The z component of the vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tsetPosition( x, y, z ) {\n\n\t\tconst te = this.elements;\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tte[ 12 ] = x.x;\n\t\t\tte[ 13 ] = x.y;\n\t\t\tte[ 14 ] = x.z;\n\n\t\t} else {\n\n\t\t\tte[ 12 ] = x;\n\t\t\tte[ 13 ] = y;\n\t\t\tte[ 14 ] = z;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inverts this matrix, using the [analytic method](https://en.wikipedia.org/wiki/Invertible_matrix#Analytic_solution).\n\t * You can not invert with a determinant of zero. If you attempt this, the method produces\n\t * a zero matrix instead.\n\t *\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tinvert() {\n\n\t\t// based on http://www.euclideanspace.com/maths/algebra/matrix/functions/inverse/fourD/index.htm\n\t\tconst te = this.elements,\n\n\t\t\tn11 = te[ 0 ], n21 = te[ 1 ], n31 = te[ 2 ], n41 = te[ 3 ],\n\t\t\tn12 = te[ 4 ], n22 = te[ 5 ], n32 = te[ 6 ], n42 = te[ 7 ],\n\t\t\tn13 = te[ 8 ], n23 = te[ 9 ], n33 = te[ 10 ], n43 = te[ 11 ],\n\t\t\tn14 = te[ 12 ], n24 = te[ 13 ], n34 = te[ 14 ], n44 = te[ 15 ],\n\n\t\t\tt11 = n23 * n34 * n42 - n24 * n33 * n42 + n24 * n32 * n43 - n22 * n34 * n43 - n23 * n32 * n44 + n22 * n33 * n44,\n\t\t\tt12 = n14 * n33 * n42 - n13 * n34 * n42 - n14 * n32 * n43 + n12 * n34 * n43 + n13 * n32 * n44 - n12 * n33 * n44,\n\t\t\tt13 = n13 * n24 * n42 - n14 * n23 * n42 + n14 * n22 * n43 - n12 * n24 * n43 - n13 * n22 * n44 + n12 * n23 * n44,\n\t\t\tt14 = n14 * n23 * n32 - n13 * n24 * n32 - n14 * n22 * n33 + n12 * n24 * n33 + n13 * n22 * n34 - n12 * n23 * n34;\n\n\t\tconst det = n11 * t11 + n21 * t12 + n31 * t13 + n41 * t14;\n\n\t\tif ( det === 0 ) return this.set( 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 );\n\n\t\tconst detInv = 1 / det;\n\n\t\tte[ 0 ] = t11 * detInv;\n\t\tte[ 1 ] = ( n24 * n33 * n41 - n23 * n34 * n41 - n24 * n31 * n43 + n21 * n34 * n43 + n23 * n31 * n44 - n21 * n33 * n44 ) * detInv;\n\t\tte[ 2 ] = ( n22 * n34 * n41 - n24 * n32 * n41 + n24 * n31 * n42 - n21 * n34 * n42 - n22 * n31 * n44 + n21 * n32 * n44 ) * detInv;\n\t\tte[ 3 ] = ( n23 * n32 * n41 - n22 * n33 * n41 - n23 * n31 * n42 + n21 * n33 * n42 + n22 * n31 * n43 - n21 * n32 * n43 ) * detInv;\n\n\t\tte[ 4 ] = t12 * detInv;\n\t\tte[ 5 ] = ( n13 * n34 * n41 - n14 * n33 * n41 + n14 * n31 * n43 - n11 * n34 * n43 - n13 * n31 * n44 + n11 * n33 * n44 ) * detInv;\n\t\tte[ 6 ] = ( n14 * n32 * n41 - n12 * n34 * n41 - n14 * n31 * n42 + n11 * n34 * n42 + n12 * n31 * n44 - n11 * n32 * n44 ) * detInv;\n\t\tte[ 7 ] = ( n12 * n33 * n41 - n13 * n32 * n41 + n13 * n31 * n42 - n11 * n33 * n42 - n12 * n31 * n43 + n11 * n32 * n43 ) * detInv;\n\n\t\tte[ 8 ] = t13 * detInv;\n\t\tte[ 9 ] = ( n14 * n23 * n41 - n13 * n24 * n41 - n14 * n21 * n43 + n11 * n24 * n43 + n13 * n21 * n44 - n11 * n23 * n44 ) * detInv;\n\t\tte[ 10 ] = ( n12 * n24 * n41 - n14 * n22 * n41 + n14 * n21 * n42 - n11 * n24 * n42 - n12 * n21 * n44 + n11 * n22 * n44 ) * detInv;\n\t\tte[ 11 ] = ( n13 * n22 * n41 - n12 * n23 * n41 - n13 * n21 * n42 + n11 * n23 * n42 + n12 * n21 * n43 - n11 * n22 * n43 ) * detInv;\n\n\t\tte[ 12 ] = t14 * detInv;\n\t\tte[ 13 ] = ( n13 * n24 * n31 - n14 * n23 * n31 + n14 * n21 * n33 - n11 * n24 * n33 - n13 * n21 * n34 + n11 * n23 * n34 ) * detInv;\n\t\tte[ 14 ] = ( n14 * n22 * n31 - n12 * n24 * n31 - n14 * n21 * n32 + n11 * n24 * n32 + n12 * n21 * n34 - n11 * n22 * n34 ) * detInv;\n\t\tte[ 15 ] = ( n12 * n23 * n31 - n13 * n22 * n31 + n13 * n21 * n32 - n11 * n23 * n32 - n12 * n21 * n33 + n11 * n22 * n33 ) * detInv;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the columns of this matrix by the given vector.\n\t *\n\t * @param {Vector3} v - The scale vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tscale( v ) {\n\n\t\tconst te = this.elements;\n\t\tconst x = v.x, y = v.y, z = v.z;\n\n\t\tte[ 0 ] *= x; te[ 4 ] *= y; te[ 8 ] *= z;\n\t\tte[ 1 ] *= x; te[ 5 ] *= y; te[ 9 ] *= z;\n\t\tte[ 2 ] *= x; te[ 6 ] *= y; te[ 10 ] *= z;\n\t\tte[ 3 ] *= x; te[ 7 ] *= y; te[ 11 ] *= z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Gets the maximum scale value of the three axes.\n\t *\n\t * @return {number} The maximum scale.\n\t */\n\tgetMaxScaleOnAxis() {\n\n\t\tconst te = this.elements;\n\n\t\tconst scaleXSq = te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] + te[ 2 ] * te[ 2 ];\n\t\tconst scaleYSq = te[ 4 ] * te[ 4 ] + te[ 5 ] * te[ 5 ] + te[ 6 ] * te[ 6 ];\n\t\tconst scaleZSq = te[ 8 ] * te[ 8 ] + te[ 9 ] * te[ 9 ] + te[ 10 ] * te[ 10 ];\n\n\t\treturn Math.sqrt( Math.max( scaleXSq, scaleYSq, scaleZSq ) );\n\n\t}\n\n\t/**\n\t * Sets this matrix as a translation transform from the given vector.\n\t *\n\t * @param {number|Vector3} x - The amount to translate in the X axis or alternatively a translation vector.\n\t * @param {number} y - The amount to translate in the Y axis.\n\t * @param {number} z - The amount to translate in the z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeTranslation( x, y, z ) {\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x.x,\n\t\t\t\t0, 1, 0, x.y,\n\t\t\t\t0, 0, 1, x.z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tthis.set(\n\n\t\t\t\t1, 0, 0, x,\n\t\t\t\t0, 1, 0, y,\n\t\t\t\t0, 0, 1, z,\n\t\t\t\t0, 0, 0, 1\n\n\t\t\t);\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the X axis by\n\t * the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationX( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t1, 0, 0, 0,\n\t\t\t0, c, - s, 0,\n\t\t\t0, s, c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the Y axis by\n\t * the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationY( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\t c, 0, s, 0,\n\t\t\t 0, 1, 0, 0,\n\t\t\t- s, 0, c, 0,\n\t\t\t 0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the Z axis by\n\t * the given angle.\n\t *\n\t * @param {number} theta - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationZ( theta ) {\n\n\t\tconst c = Math.cos( theta ), s = Math.sin( theta );\n\n\t\tthis.set(\n\n\t\t\tc, - s, 0, 0,\n\t\t\ts, c, 0, 0,\n\t\t\t0, 0, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a rotational transformation around the given axis by\n\t * the given angle.\n\t *\n\t * This is a somewhat controversial but mathematically sound alternative to\n\t * rotating via Quaternions. See the discussion [here](https://www.gamedev.net/articles/programming/math-and-physics/do-we-really-need-quaternions-r1199).\n\t *\n\t * @param {Vector3} axis - The normalized rotation axis.\n\t * @param {number} angle - The rotation in radians.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeRotationAxis( axis, angle ) {\n\n\t\t// Based on http://www.gamedev.net/reference/articles/article1199.asp\n\n\t\tconst c = Math.cos( angle );\n\t\tconst s = Math.sin( angle );\n\t\tconst t = 1 - c;\n\t\tconst x = axis.x, y = axis.y, z = axis.z;\n\t\tconst tx = t * x, ty = t * y;\n\n\t\tthis.set(\n\n\t\t\ttx * x + c, tx * y - s * z, tx * z + s * y, 0,\n\t\t\ttx * y + s * z, ty * y + c, ty * z - s * x, 0,\n\t\t\ttx * z - s * y, ty * z + s * x, t * z * z + c, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a scale transformation.\n\t *\n\t * @param {number} x - The amount to scale in the X axis.\n\t * @param {number} y - The amount to scale in the Y axis.\n\t * @param {number} z - The amount to scale in the Z axis.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeScale( x, y, z ) {\n\n\t\tthis.set(\n\n\t\t\tx, 0, 0, 0,\n\t\t\t0, y, 0, 0,\n\t\t\t0, 0, z, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix as a shear transformation.\n\t *\n\t * @param {number} xy - The amount to shear X by Y.\n\t * @param {number} xz - The amount to shear X by Z.\n\t * @param {number} yx - The amount to shear Y by X.\n\t * @param {number} yz - The amount to shear Y by Z.\n\t * @param {number} zx - The amount to shear Z by X.\n\t * @param {number} zy - The amount to shear Z by Y.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeShear( xy, xz, yx, yz, zx, zy ) {\n\n\t\tthis.set(\n\n\t\t\t1, yx, zx, 0,\n\t\t\txy, 1, zy, 0,\n\t\t\txz, yz, 1, 0,\n\t\t\t0, 0, 0, 1\n\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this matrix to the transformation composed of the given position,\n\t * rotation (Quaternion) and scale.\n\t *\n\t * @param {Vector3} position - The position vector.\n\t * @param {Quaternion} quaternion - The rotation as a Quaternion.\n\t * @param {Vector3} scale - The scale vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tcompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = quaternion._x, y = quaternion._y, z = quaternion._z, w = quaternion._w;\n\t\tconst x2 = x + x,\ty2 = y + y, z2 = z + z;\n\t\tconst xx = x * x2, xy = x * y2, xz = x * z2;\n\t\tconst yy = y * y2, yz = y * z2, zz = z * z2;\n\t\tconst wx = w * x2, wy = w * y2, wz = w * z2;\n\n\t\tconst sx = scale.x, sy = scale.y, sz = scale.z;\n\n\t\tte[ 0 ] = ( 1 - ( yy + zz ) ) * sx;\n\t\tte[ 1 ] = ( xy + wz ) * sx;\n\t\tte[ 2 ] = ( xz - wy ) * sx;\n\t\tte[ 3 ] = 0;\n\n\t\tte[ 4 ] = ( xy - wz ) * sy;\n\t\tte[ 5 ] = ( 1 - ( xx + zz ) ) * sy;\n\t\tte[ 6 ] = ( yz + wx ) * sy;\n\t\tte[ 7 ] = 0;\n\n\t\tte[ 8 ] = ( xz + wy ) * sz;\n\t\tte[ 9 ] = ( yz - wx ) * sz;\n\t\tte[ 10 ] = ( 1 - ( xx + yy ) ) * sz;\n\t\tte[ 11 ] = 0;\n\n\t\tte[ 12 ] = position.x;\n\t\tte[ 13 ] = position.y;\n\t\tte[ 14 ] = position.z;\n\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Decomposes this matrix into its position, rotation and scale components\n\t * and provides the result in the given objects.\n\t *\n\t * Note: Not all matrices are decomposable in this way. For example, if an\n\t * object has a non-uniformly scaled parent, then the object's world matrix\n\t * may not be decomposable, and this method may not be appropriate.\n\t *\n\t * @param {Vector3} position - The position vector.\n\t * @param {Quaternion} quaternion - The rotation as a Quaternion.\n\t * @param {Vector3} scale - The scale vector.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tdecompose( position, quaternion, scale ) {\n\n\t\tconst te = this.elements;\n\n\t\tposition.x = te[ 12 ];\n\t\tposition.y = te[ 13 ];\n\t\tposition.z = te[ 14 ];\n\n\t\tif ( this.determinant() === 0 ) {\n\n\t\t\tscale.set( 1, 1, 1 );\n\t\t\tquaternion.identity();\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tlet sx = _v1$5.set( te[ 0 ], te[ 1 ], te[ 2 ] ).length();\n\t\tconst sy = _v1$5.set( te[ 4 ], te[ 5 ], te[ 6 ] ).length();\n\t\tconst sz = _v1$5.set( te[ 8 ], te[ 9 ], te[ 10 ] ).length();\n\n\t\t// if determine is negative, we need to invert one scale\n\t\tconst det = this.determinant();\n\t\tif ( det < 0 ) sx = - sx;\n\n\t\t// scale the rotation part\n\t\t_m1$2.copy( this );\n\n\t\tconst invSX = 1 / sx;\n\t\tconst invSY = 1 / sy;\n\t\tconst invSZ = 1 / sz;\n\n\t\t_m1$2.elements[ 0 ] *= invSX;\n\t\t_m1$2.elements[ 1 ] *= invSX;\n\t\t_m1$2.elements[ 2 ] *= invSX;\n\n\t\t_m1$2.elements[ 4 ] *= invSY;\n\t\t_m1$2.elements[ 5 ] *= invSY;\n\t\t_m1$2.elements[ 6 ] *= invSY;\n\n\t\t_m1$2.elements[ 8 ] *= invSZ;\n\t\t_m1$2.elements[ 9 ] *= invSZ;\n\t\t_m1$2.elements[ 10 ] *= invSZ;\n\n\t\tquaternion.setFromRotationMatrix( _m1$2 );\n\n\t\tscale.x = sx;\n\t\tscale.y = sy;\n\t\tscale.z = sz;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a perspective projection matrix. This is used internally by\n\t * {@link PerspectiveCamera#updateProjectionMatrix}.\n\n\t * @param {number} left - Left boundary of the viewing frustum at the near plane.\n\t * @param {number} right - Right boundary of the viewing frustum at the near plane.\n\t * @param {number} top - Top boundary of the viewing frustum at the near plane.\n\t * @param {number} bottom - Bottom boundary of the viewing frustum at the near plane.\n\t * @param {number} near - The distance from the camera to the near plane.\n\t * @param {number} far - The distance from the camera to the far plane.\n\t * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} [coordinateSystem=WebGLCoordinateSystem] - The coordinate system.\n\t * @param {boolean} [reversedDepth=false] - Whether to use a reversed depth.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakePerspective( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem, reversedDepth = false ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = 2 * near / ( right - left );\n\t\tconst y = 2 * near / ( top - bottom );\n\n\t\tconst a = ( right + left ) / ( right - left );\n\t\tconst b = ( top + bottom ) / ( top - bottom );\n\n\t\tlet c, d;\n\n\t\tif ( reversedDepth ) {\n\n\t\t\tc = near / ( far - near );\n\t\t\td = ( far * near ) / ( far - near );\n\n\t\t} else {\n\n\t\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tc = - ( far + near ) / ( far - near );\n\t\t\t\td = ( -2 * far * near ) / ( far - near );\n\n\t\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tc = - far / ( far - near );\n\t\t\t\td = ( - far * near ) / ( far - near );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.Matrix4.makePerspective(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\t\tte[ 0 ] = x;\tte[ 4 ] = 0;\tte[ 8 ] = a; \tte[ 12 ] = 0;\n\t\tte[ 1 ] = 0;\tte[ 5 ] = y;\tte[ 9 ] = b; \tte[ 13 ] = 0;\n\t\tte[ 2 ] = 0;\tte[ 6 ] = 0;\tte[ 10 ] = c; \tte[ 14 ] = d;\n\t\tte[ 3 ] = 0;\tte[ 7 ] = 0;\tte[ 11 ] = -1;\tte[ 15 ] = 0;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a orthographic projection matrix. This is used internally by\n\t * {@link OrthographicCamera#updateProjectionMatrix}.\n\n\t * @param {number} left - Left boundary of the viewing frustum at the near plane.\n\t * @param {number} right - Right boundary of the viewing frustum at the near plane.\n\t * @param {number} top - Top boundary of the viewing frustum at the near plane.\n\t * @param {number} bottom - Bottom boundary of the viewing frustum at the near plane.\n\t * @param {number} near - The distance from the camera to the near plane.\n\t * @param {number} far - The distance from the camera to the far plane.\n\t * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} [coordinateSystem=WebGLCoordinateSystem] - The coordinate system.\n\t * @param {boolean} [reversedDepth=false] - Whether to use a reversed depth.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tmakeOrthographic( left, right, top, bottom, near, far, coordinateSystem = WebGLCoordinateSystem, reversedDepth = false ) {\n\n\t\tconst te = this.elements;\n\n\t\tconst x = 2 / ( right - left );\n\t\tconst y = 2 / ( top - bottom );\n\n\t\tconst a = - ( right + left ) / ( right - left );\n\t\tconst b = - ( top + bottom ) / ( top - bottom );\n\n\t\tlet c, d;\n\n\t\tif ( reversedDepth ) {\n\n\t\t\tc = 1 / ( far - near );\n\t\t\td = far / ( far - near );\n\n\t\t} else {\n\n\t\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tc = -2 / ( far - near );\n\t\t\t\td = - ( far + near ) / ( far - near );\n\n\t\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tc = -1 / ( far - near );\n\t\t\t\td = - near / ( far - near );\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.Matrix4.makeOrthographic(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\t\tte[ 0 ] = x;\t\tte[ 4 ] = 0;\t\tte[ 8 ] = 0; \t\tte[ 12 ] = a;\n\t\tte[ 1 ] = 0; \t\tte[ 5 ] = y;\t\tte[ 9 ] = 0; \t\tte[ 13 ] = b;\n\t\tte[ 2 ] = 0; \t\tte[ 6 ] = 0;\t\tte[ 10 ] = c;\t\tte[ 14 ] = d;\n\t\tte[ 3 ] = 0; \t\tte[ 7 ] = 0;\t\tte[ 11 ] = 0;\t\tte[ 15 ] = 1;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this matrix is equal with the given one.\n\t *\n\t * @param {Matrix4} matrix - The matrix to test for equality.\n\t * @return {boolean} Whether this matrix is equal with the given one.\n\t */\n\tequals( matrix ) {\n\n\t\tconst te = this.elements;\n\t\tconst me = matrix.elements;\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tif ( te[ i ] !== me[ i ] ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix from the given array.\n\t *\n\t * @param {Array<number>} array - The matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Matrix4} A reference to this matrix.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the elements of this matrix to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array<number>} [array=[]] - The target array holding the matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array<number>} The matrix elements in column-major order.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst te = this.elements;\n\n\t\tarray[ offset ] = te[ 0 ];\n\t\tarray[ offset + 1 ] = te[ 1 ];\n\t\tarray[ offset + 2 ] = te[ 2 ];\n\t\tarray[ offset + 3 ] = te[ 3 ];\n\n\t\tarray[ offset + 4 ] = te[ 4 ];\n\t\tarray[ offset + 5 ] = te[ 5 ];\n\t\tarray[ offset + 6 ] = te[ 6 ];\n\t\tarray[ offset + 7 ] = te[ 7 ];\n\n\t\tarray[ offset + 8 ] = te[ 8 ];\n\t\tarray[ offset + 9 ] = te[ 9 ];\n\t\tarray[ offset + 10 ] = te[ 10 ];\n\t\tarray[ offset + 11 ] = te[ 11 ];\n\n\t\tarray[ offset + 12 ] = te[ 12 ];\n\t\tarray[ offset + 13 ] = te[ 13 ];\n\t\tarray[ offset + 14 ] = te[ 14 ];\n\t\tarray[ offset + 15 ] = te[ 15 ];\n\n\t\treturn array;\n\n\t}\n\n}\n\nconst _v1$5 = /*@__PURE__*/ new Vector3();\nconst _m1$2 = /*@__PURE__*/ new Matrix4();\nconst _zero = /*@__PURE__*/ new Vector3( 0, 0, 0 );\nconst _one = /*@__PURE__*/ new Vector3( 1, 1, 1 );\nconst _x = /*@__PURE__*/ new Vector3();\nconst _y = /*@__PURE__*/ new Vector3();\nconst _z = /*@__PURE__*/ new Vector3();\n\nconst _matrix$2 = /*@__PURE__*/ new Matrix4();\nconst _quaternion$3 = /*@__PURE__*/ new Quaternion();\n\n/**\n * A class representing Euler angles.\n *\n * Euler angles describe a rotational transformation by rotating an object on\n * its various axes in specified amounts per axis, and a specified axis\n * order.\n *\n * Iterating through an instance will yield its components (x, y, z,\n * order) in the corresponding order.\n *\n * ```js\n * const a = new THREE.Euler( 0, 1, 1.57, 'XYZ' );\n * const b = new THREE.Vector3( 1, 0, 1 );\n * b.applyEuler(a);\n * ```\n */\nclass Euler {\n\n\t/**\n\t * Constructs a new euler instance.\n\t *\n\t * @param {number} [x=0] - The angle of the x axis in radians.\n\t * @param {number} [y=0] - The angle of the y axis in radians.\n\t * @param {number} [z=0] - The angle of the z axis in radians.\n\t * @param {string} [order=Euler.DEFAULT_ORDER] - A string representing the order that the rotations are applied.\n\t */\n\tconstructor( x = 0, y = 0, z = 0, order = Euler.DEFAULT_ORDER ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isEuler = true;\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t}\n\n\t/**\n\t * The angle of the x axis in radians.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget x() {\n\n\t\treturn this._x;\n\n\t}\n\n\tset x( value ) {\n\n\t\tthis._x = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The angle of the y axis in radians.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget y() {\n\n\t\treturn this._y;\n\n\t}\n\n\tset y( value ) {\n\n\t\tthis._y = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * The angle of the z axis in radians.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget z() {\n\n\t\treturn this._z;\n\n\t}\n\n\tset z( value ) {\n\n\t\tthis._z = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * A string representing the order that the rotations are applied.\n\t *\n\t * @type {string}\n\t * @default 'XYZ'\n\t */\n\tget order() {\n\n\t\treturn this._order;\n\n\t}\n\n\tset order( value ) {\n\n\t\tthis._order = value;\n\t\tthis._onChangeCallback();\n\n\t}\n\n\t/**\n\t * Sets the Euler components.\n\t *\n\t * @param {number} x - The angle of the x axis in radians.\n\t * @param {number} y - The angle of the y axis in radians.\n\t * @param {number} z - The angle of the z axis in radians.\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tset( x, y, z, order = this._order ) {\n\n\t\tthis._x = x;\n\t\tthis._y = y;\n\t\tthis._z = z;\n\t\tthis._order = order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new Euler instance with copied values from this instance.\n\t *\n\t * @return {Euler} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this._x, this._y, this._z, this._order );\n\n\t}\n\n\t/**\n\t * Copies the values of the given Euler instance to this instance.\n\t *\n\t * @param {Euler} euler - The Euler instance to copy.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tcopy( euler ) {\n\n\t\tthis._x = euler._x;\n\t\tthis._y = euler._y;\n\t\tthis._z = euler._z;\n\t\tthis._order = euler._order;\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the angles of this Euler instance from a pure rotation matrix.\n\t *\n\t * @param {Matrix4} m - A 4x4 matrix of which the upper 3x3 of matrix is a pure rotation matrix (i.e. unscaled).\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tsetFromRotationMatrix( m, order = this._order, update = true ) {\n\n\t\tconst te = m.elements;\n\t\tconst m11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ];\n\t\tconst m21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ];\n\t\tconst m31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tswitch ( order ) {\n\n\t\t\tcase 'XYZ':\n\n\t\t\t\tthis._y = Math.asin( clamp( m13, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m13 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YXZ':\n\n\t\t\t\tthis._x = Math.asin( - clamp( m23, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m23 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\t\t\t\t\tthis._z = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZXY':\n\n\t\t\t\tthis._x = Math.asin( clamp( m32, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m32 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._y = Math.atan2( - m31, m33 );\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._y = 0;\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZYX':\n\n\t\t\t\tthis._y = Math.asin( - clamp( m31, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m31 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m33 );\n\t\t\t\t\tthis._z = Math.atan2( m21, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._z = Math.atan2( - m12, m22 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'YZX':\n\n\t\t\t\tthis._z = Math.asin( clamp( m21, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m21 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m22 );\n\t\t\t\t\tthis._y = Math.atan2( - m31, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = 0;\n\t\t\t\t\tthis._y = Math.atan2( m13, m33 );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'XZY':\n\n\t\t\t\tthis._z = Math.asin( - clamp( m12, -1, 1 ) );\n\n\t\t\t\tif ( Math.abs( m12 ) < 0.9999999 ) {\n\n\t\t\t\t\tthis._x = Math.atan2( m32, m22 );\n\t\t\t\t\tthis._y = Math.atan2( m13, m11 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._x = Math.atan2( - m23, m33 );\n\t\t\t\t\tthis._y = 0;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\twarn( 'Euler: .setFromRotationMatrix() encountered an unknown order: ' + order );\n\n\t\t}\n\n\t\tthis._order = order;\n\n\t\tif ( update === true ) this._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the angles of this Euler instance from a normalized quaternion.\n\t *\n\t * @param {Quaternion} q - A normalized Quaternion.\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @param {boolean} [update=true] - Whether the internal `onChange` callback should be executed or not.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tsetFromQuaternion( q, order, update ) {\n\n\t\t_matrix$2.makeRotationFromQuaternion( q );\n\n\t\treturn this.setFromRotationMatrix( _matrix$2, order, update );\n\n\t}\n\n\t/**\n\t * Sets the angles of this Euler instance from the given vector.\n\t *\n\t * @param {Vector3} v - The vector.\n\t * @param {string} [order] - A string representing the order that the rotations are applied.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tsetFromVector3( v, order = this._order ) {\n\n\t\treturn this.set( v.x, v.y, v.z, order );\n\n\t}\n\n\t/**\n\t * Resets the euler angle with a new order by creating a quaternion from this\n\t * euler angle and then setting this euler angle with the quaternion and the\n\t * new order.\n\t *\n\t * Warning: This discards revolution information.\n\t *\n\t * @param {string} [newOrder] - A string representing the new order that the rotations are applied.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\treorder( newOrder ) {\n\n\t\t_quaternion$3.setFromEuler( this );\n\n\t\treturn this.setFromQuaternion( _quaternion$3, newOrder );\n\n\t}\n\n\t/**\n\t * Returns `true` if this Euler instance is equal with the given one.\n\t *\n\t * @param {Euler} euler - The Euler instance to test for equality.\n\t * @return {boolean} Whether this Euler instance is equal with the given one.\n\t */\n\tequals( euler ) {\n\n\t\treturn ( euler._x === this._x ) && ( euler._y === this._y ) && ( euler._z === this._z ) && ( euler._order === this._order );\n\n\t}\n\n\t/**\n\t * Sets this Euler instance's components to values from the given array. The first three\n\t * entries of the array are assign to the x,y and z components. An optional fourth entry\n\t * defines the Euler order.\n\t *\n\t * @param {Array<number,number,number,?string>} array - An array holding the Euler component values.\n\t * @return {Euler} A reference to this Euler instance.\n\t */\n\tfromArray( array ) {\n\n\t\tthis._x = array[ 0 ];\n\t\tthis._y = array[ 1 ];\n\t\tthis._z = array[ 2 ];\n\t\tif ( array[ 3 ] !== undefined ) this._order = array[ 3 ];\n\n\t\tthis._onChangeCallback();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the components of this Euler instance to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array<number,number,number,string>} [array=[]] - The target array holding the Euler components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array<number,number,number,string>} The Euler components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this._x;\n\t\tarray[ offset + 1 ] = this._y;\n\t\tarray[ offset + 2 ] = this._z;\n\t\tarray[ offset + 3 ] = this._order;\n\n\t\treturn array;\n\n\t}\n\n\t_onChange( callback ) {\n\n\t\tthis._onChangeCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t_onChangeCallback() {}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this._x;\n\t\tyield this._y;\n\t\tyield this._z;\n\t\tyield this._order;\n\n\t}\n\n}\n\n/**\n * The default Euler angle order.\n *\n * @static\n * @type {string}\n * @default 'XYZ'\n */\nEuler.DEFAULT_ORDER = 'XYZ';\n\n/**\n * A layers object assigns an 3D object to 1 or more of 32\n * layers numbered `0` to `31` - internally the layers are stored as a\n * bit mask], and by default all 3D objects are a member of layer `0`.\n *\n * This can be used to control visibility - an object must share a layer with\n * a camera to be visible when that camera's view is\n * rendered.\n *\n * All classes that inherit from {@link Object3D} have an `layers` property which\n * is an instance of this class.\n */\nclass Layers {\n\n\t/**\n\t * Constructs a new layers instance, with membership\n\t * initially set to layer `0`.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * A bit mask storing which of the 32 layers this layers object is currently\n\t\t * a member of.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.mask = 1 | 0;\n\n\t}\n\n\t/**\n\t * Sets membership to the given layer, and remove membership all other layers.\n\t *\n\t * @param {number} layer - The layer to set.\n\t */\n\tset( layer ) {\n\n\t\tthis.mask = ( 1 << layer | 0 ) >>> 0;\n\n\t}\n\n\t/**\n\t * Adds membership of the given layer.\n\t *\n\t * @param {number} layer - The layer to enable.\n\t */\n\tenable( layer ) {\n\n\t\tthis.mask |= 1 << layer | 0;\n\n\t}\n\n\t/**\n\t * Adds membership to all layers.\n\t */\n\tenableAll() {\n\n\t\tthis.mask = 0xffffffff | 0;\n\n\t}\n\n\t/**\n\t * Toggles the membership of the given layer.\n\t *\n\t * @param {number} layer - The layer to toggle.\n\t */\n\ttoggle( layer ) {\n\n\t\tthis.mask ^= 1 << layer | 0;\n\n\t}\n\n\t/**\n\t * Removes membership of the given layer.\n\t *\n\t * @param {number} layer - The layer to enable.\n\t */\n\tdisable( layer ) {\n\n\t\tthis.mask &= ~ ( 1 << layer | 0 );\n\n\t}\n\n\t/**\n\t * Removes the membership from all layers.\n\t */\n\tdisableAll() {\n\n\t\tthis.mask = 0;\n\n\t}\n\n\t/**\n\t * Returns `true` if this and the given layers object have at least one\n\t * layer in common.\n\t *\n\t * @param {Layers} layers - The layers to test.\n\t * @return {boolean } Whether this and the given layers object have at least one layer in common or not.\n\t */\n\ttest( layers ) {\n\n\t\treturn ( this.mask & layers.mask ) !== 0;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given layer is enabled.\n\t *\n\t * @param {number} layer - The layer to test.\n\t * @return {boolean } Whether the given layer is enabled or not.\n\t */\n\tisEnabled( layer ) {\n\n\t\treturn ( this.mask & ( 1 << layer | 0 ) ) !== 0;\n\n\t}\n\n}\n\nlet _object3DId = 0;\n\nconst _v1$4 = /*@__PURE__*/ new Vector3();\nconst _q1 = /*@__PURE__*/ new Quaternion();\nconst _m1$1 = /*@__PURE__*/ new Matrix4();\nconst _target = /*@__PURE__*/ new Vector3();\n\nconst _position$3 = /*@__PURE__*/ new Vector3();\nconst _scale$2 = /*@__PURE__*/ new Vector3();\nconst _quaternion$2 = /*@__PURE__*/ new Quaternion();\n\nconst _xAxis = /*@__PURE__*/ new Vector3( 1, 0, 0 );\nconst _yAxis = /*@__PURE__*/ new Vector3( 0, 1, 0 );\nconst _zAxis = /*@__PURE__*/ new Vector3( 0, 0, 1 );\n\n/**\n * Fires when the object has been added to its parent object.\n *\n * @event Object3D#added\n * @type {Object}\n */\nconst _addedEvent = { type: 'added' };\n\n/**\n * Fires when the object has been removed from its parent object.\n *\n * @event Object3D#removed\n * @type {Object}\n */\nconst _removedEvent = { type: 'removed' };\n\n/**\n * Fires when a new child object has been added.\n *\n * @event Object3D#childadded\n * @type {Object}\n */\nconst _childaddedEvent = { type: 'childadded', child: null };\n\n/**\n * Fires when a child object has been removed.\n *\n * @event Object3D#childremoved\n * @type {Object}\n */\nconst _childremovedEvent = { type: 'childremoved', child: null };\n\n/**\n * This is the base class for most objects in three.js and provides a set of\n * properties and methods for manipulating objects in 3D space.\n *\n * @augments EventDispatcher\n */\nclass Object3D extends EventDispatcher {\n\n\t/**\n\t * Constructs a new 3D object.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isObject3D = true;\n\n\t\t/**\n\t\t * The ID of the 3D object.\n\t\t *\n\t\t * @name Object3D#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _object3DId ++ } );\n\n\t\t/**\n\t\t * The UUID of the 3D object.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the 3D object.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'Object3D';\n\n\t\t/**\n\t\t * A reference to the parent object.\n\t\t *\n\t\t * @type {?Object3D}\n\t\t * @default null\n\t\t */\n\t\tthis.parent = null;\n\n\t\t/**\n\t\t * An array holding the child 3D objects of this instance.\n\t\t *\n\t\t * @type {Array<Object3D>}\n\t\t */\n\t\tthis.children = [];\n\n\t\t/**\n\t\t * Defines the `up` direction of the 3D object which influences\n\t\t * the orientation via methods like {@link Object3D#lookAt}.\n\t\t *\n\t\t * The default values for all 3D objects is defined by `Object3D.DEFAULT_UP`.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.up = Object3D.DEFAULT_UP.clone();\n\n\t\tconst position = new Vector3();\n\t\tconst rotation = new Euler();\n\t\tconst quaternion = new Quaternion();\n\t\tconst scale = new Vector3( 1, 1, 1 );\n\n\t\tfunction onRotationChange() {\n\n\t\t\tquaternion.setFromEuler( rotation, false );\n\n\t\t}\n\n\t\tfunction onQuaternionChange() {\n\n\t\t\trotation.setFromQuaternion( quaternion, undefined, false );\n\n\t\t}\n\n\t\trotation._onChange( onRotationChange );\n\t\tquaternion._onChange( onQuaternionChange );\n\n\t\tObject.defineProperties( this, {\n\t\t\t/**\n\t\t\t * Represents the object's local position.\n\t\t\t *\n\t\t\t * @name Object3D#position\n\t\t\t * @type {Vector3}\n\t\t\t * @default (0,0,0)\n\t\t\t */\n\t\t\tposition: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: position\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's local rotation as Euler angles, in radians.\n\t\t\t *\n\t\t\t * @name Object3D#rotation\n\t\t\t * @type {Euler}\n\t\t\t * @default (0,0,0)\n\t\t\t */\n\t\t\trotation: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: rotation\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's local rotation as Quaternions.\n\t\t\t *\n\t\t\t * @name Object3D#quaternion\n\t\t\t * @type {Quaternion}\n\t\t\t */\n\t\t\tquaternion: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: quaternion\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's local scale.\n\t\t\t *\n\t\t\t * @name Object3D#scale\n\t\t\t * @type {Vector3}\n\t\t\t * @default (1,1,1)\n\t\t\t */\n\t\t\tscale: {\n\t\t\t\tconfigurable: true,\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: scale\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's model-view matrix.\n\t\t\t *\n\t\t\t * @name Object3D#modelViewMatrix\n\t\t\t * @type {Matrix4}\n\t\t\t */\n\t\t\tmodelViewMatrix: {\n\t\t\t\tvalue: new Matrix4()\n\t\t\t},\n\t\t\t/**\n\t\t\t * Represents the object's normal matrix.\n\t\t\t *\n\t\t\t * @name Object3D#normalMatrix\n\t\t\t * @type {Matrix3}\n\t\t\t */\n\t\t\tnormalMatrix: {\n\t\t\t\tvalue: new Matrix3()\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * Represents the object's transformation matrix in local space.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrix = new Matrix4();\n\n\t\t/**\n\t\t * Represents the object's transformation matrix in world space.\n\t\t * If the 3D object has no parent, then it's identical to the local transformation matrix\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrixWorld = new Matrix4();\n\n\t\t/**\n\t\t * When set to `true`, the engine automatically computes the local matrix from position,\n\t\t * rotation and scale every frame.\n\t\t *\n\t\t * The default values for all 3D objects is defined by `Object3D.DEFAULT_MATRIX_AUTO_UPDATE`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixAutoUpdate = Object3D.DEFAULT_MATRIX_AUTO_UPDATE;\n\n\t\t/**\n\t\t * When set to `true`, the engine automatically computes the world matrix from the current local\n\t\t * matrix and the object's transformation hierarchy.\n\t\t *\n\t\t * The default values for all 3D objects is defined by `Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.matrixWorldAutoUpdate = Object3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE; // checked by the renderer\n\n\t\t/**\n\t\t * When set to `true`, it calculates the world matrix in that frame and resets this property\n\t\t * to `false`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t/**\n\t\t * The layer membership of the 3D object. The 3D object is only visible if it has\n\t\t * at least one layer in common with the camera in use. This property can also be\n\t\t * used to filter out unwanted objects in ray-intersection tests when using {@link Raycaster}.\n\t\t *\n\t\t * @type {Layers}\n\t\t */\n\t\tthis.layers = new Layers();\n\n\t\t/**\n\t\t * When set to `true`, the 3D object gets rendered.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.visible = true;\n\n\t\t/**\n\t\t * When set to `true`, the 3D object gets rendered into shadow maps.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.castShadow = false;\n\n\t\t/**\n\t\t * When set to `true`, the 3D object is affected by shadows in the scene.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.receiveShadow = false;\n\n\t\t/**\n\t\t * When set to `true`, the 3D object is honored by view frustum culling.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.frustumCulled = true;\n\n\t\t/**\n\t\t * This value allows the default rendering order of scene graph objects to be\n\t\t * overridden although opaque and transparent objects remain sorted independently.\n\t\t * When this property is set for an instance of {@link Group},all descendants\n\t\t * objects will be sorted and rendered together. Sorting is from lowest to highest\n\t\t * render order.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.renderOrder = 0;\n\n\t\t/**\n\t\t * An array holding the animation clips of the 3D object.\n\t\t *\n\t\t * @type {Array<AnimationClip>}\n\t\t */\n\t\tthis.animations = [];\n\n\t\t/**\n\t\t * Custom depth material to be used when rendering to the depth map. Can only be used\n\t\t * in context of meshes. When shadow-casting with a {@link DirectionalLight} or {@link SpotLight},\n\t\t * if you are modifying vertex positions in the vertex shader you must specify a custom depth\n\t\t * material for proper shadows.\n\t\t *\n\t\t * Only relevant in context of {@link WebGLRenderer}.\n\t\t *\n\t\t * @type {(Material|undefined)}\n\t\t * @default undefined\n\t\t */\n\t\tthis.customDepthMaterial = undefined;\n\n\t\t/**\n\t\t * Same as {@link Object3D#customDepthMaterial}, but used with {@link PointLight}.\n\t\t *\n\t\t * Only relevant in context of {@link WebGLRenderer}.\n\t\t *\n\t\t * @type {(Material|undefined)}\n\t\t * @default undefined\n\t\t */\n\t\tthis.customDistanceMaterial = undefined;\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the 3D object. It\n\t\t * should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t}\n\n\t/**\n\t * A callback that is executed immediately before a 3D object is rendered to a shadow map.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {Camera} shadowCamera - The shadow camera.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} depthMaterial - The depth material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonBeforeShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {}\n\n\t/**\n\t * A callback that is executed immediately after a 3D object is rendered to a shadow map.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {Camera} shadowCamera - The shadow camera.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} depthMaterial - The depth material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonAfterShadow( /* renderer, object, camera, shadowCamera, geometry, depthMaterial, group */ ) {}\n\n\t/**\n\t * A callback that is executed immediately before a 3D object is rendered.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} material - The 3D object's material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonBeforeRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\t/**\n\t * A callback that is executed immediately after a 3D object is rendered.\n\t *\n\t * @param {Renderer|WebGLRenderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} material - The 3D object's material.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonAfterRender( /* renderer, scene, camera, geometry, material, group */ ) {}\n\n\t/**\n\t * Applies the given transformation matrix to the object and updates the object's position,\n\t * rotation and scale.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tthis.matrix.premultiply( matrix );\n\n\t\tthis.matrix.decompose( this.position, this.quaternion, this.scale );\n\n\t}\n\n\t/**\n\t * Applies a rotation represented by given the quaternion to the 3D object.\n\t *\n\t * @param {Quaternion} q - The quaternion.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tapplyQuaternion( q ) {\n\n\t\tthis.quaternion.premultiply( q );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as an axis/angle couple to the 3D object.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} angle - The angle in radians.\n\t */\n\tsetRotationFromAxisAngle( axis, angle ) {\n\n\t\t// assumes axis is normalized\n\n\t\tthis.quaternion.setFromAxisAngle( axis, angle );\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as Euler angles to the 3D object.\n\t *\n\t * @param {Euler} euler - The Euler angles.\n\t */\n\tsetRotationFromEuler( euler ) {\n\n\t\tthis.quaternion.setFromEuler( euler, true );\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as rotation matrix to the 3D object.\n\t *\n\t * @param {Matrix4} m - Although a 4x4 matrix is expected, the upper 3x3 portion must be\n\t * a pure rotation matrix (i.e, unscaled).\n\t */\n\tsetRotationFromMatrix( m ) {\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tthis.quaternion.setFromRotationMatrix( m );\n\n\t}\n\n\t/**\n\t * Sets the given rotation represented as a Quaternion to the 3D object.\n\t *\n\t * @param {Quaternion} q - The Quaternion\n\t */\n\tsetRotationFromQuaternion( q ) {\n\n\t\t// assumes q is normalized\n\n\t\tthis.quaternion.copy( q );\n\n\t}\n\n\t/**\n\t * Rotates the 3D object along an axis in local space.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateOnAxis( axis, angle ) {\n\n\t\t// rotate object on axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.multiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the 3D object along an axis in world space.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateOnWorldAxis( axis, angle ) {\n\n\t\t// rotate object on axis in world space\n\t\t// axis is assumed to be normalized\n\t\t// method assumes no rotated parent\n\n\t\t_q1.setFromAxisAngle( axis, angle );\n\n\t\tthis.quaternion.premultiply( _q1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the 3D object around its X axis in local space.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateX( angle ) {\n\n\t\treturn this.rotateOnAxis( _xAxis, angle );\n\n\t}\n\n\t/**\n\t * Rotates the 3D object around its Y axis in local space.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateY( angle ) {\n\n\t\treturn this.rotateOnAxis( _yAxis, angle );\n\n\t}\n\n\t/**\n\t * Rotates the 3D object around its Z axis in local space.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\trotateZ( angle ) {\n\n\t\treturn this.rotateOnAxis( _zAxis, angle );\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along the given axis in local space.\n\t *\n\t * @param {Vector3} axis - The (normalized) axis vector.\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateOnAxis( axis, distance ) {\n\n\t\t// translate object by distance along axis in object space\n\t\t// axis is assumed to be normalized\n\n\t\t_v1$4.copy( axis ).applyQuaternion( this.quaternion );\n\n\t\tthis.position.add( _v1$4.multiplyScalar( distance ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along its X-axis in local space.\n\t *\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateX( distance ) {\n\n\t\treturn this.translateOnAxis( _xAxis, distance );\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along its Y-axis in local space.\n\t *\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateY( distance ) {\n\n\t\treturn this.translateOnAxis( _yAxis, distance );\n\n\t}\n\n\t/**\n\t * Translate the 3D object by a distance along its Z-axis in local space.\n\t *\n\t * @param {number} distance - The distance in world units.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\ttranslateZ( distance ) {\n\n\t\treturn this.translateOnAxis( _zAxis, distance );\n\n\t}\n\n\t/**\n\t * Converts the given vector from this 3D object's local space to world space.\n\t *\n\t * @param {Vector3} vector - The vector to convert.\n\t * @return {Vector3} The converted vector.\n\t */\n\tlocalToWorld( vector ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn vector.applyMatrix4( this.matrixWorld );\n\n\t}\n\n\t/**\n\t * Converts the given vector from this 3D object's word space to local space.\n\t *\n\t * @param {Vector3} vector - The vector to convert.\n\t * @return {Vector3} The converted vector.\n\t */\n\tworldToLocal( vector ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn vector.applyMatrix4( _m1$1.copy( this.matrixWorld ).invert() );\n\n\t}\n\n\t/**\n\t * Rotates the object to face a point in world space.\n\t *\n\t * This method does not support objects having non-uniformly-scaled parent(s).\n\t *\n\t * @param {number|Vector3} x - The x coordinate in world space. Alternatively, a vector representing a position in world space\n\t * @param {number} [y] - The y coordinate in world space.\n\t * @param {number} [z] - The z coordinate in world space.\n\t */\n\tlookAt( x, y, z ) {\n\n\t\t// This method does not support objects having non-uniformly-scaled parent(s)\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\t_target.copy( x );\n\n\t\t} else {\n\n\t\t\t_target.set( x, y, z );\n\n\t\t}\n\n\t\tconst parent = this.parent;\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_position$3.setFromMatrixPosition( this.matrixWorld );\n\n\t\tif ( this.isCamera || this.isLight ) {\n\n\t\t\t_m1$1.lookAt( _position$3, _target, this.up );\n\n\t\t} else {\n\n\t\t\t_m1$1.lookAt( _target, _position$3, this.up );\n\n\t\t}\n\n\t\tthis.quaternion.setFromRotationMatrix( _m1$1 );\n\n\t\tif ( parent ) {\n\n\t\t\t_m1$1.extractRotation( parent.matrixWorld );\n\t\t\t_q1.setFromRotationMatrix( _m1$1 );\n\t\t\tthis.quaternion.premultiply( _q1.invert() );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Adds the given 3D object as a child to this 3D object. An arbitrary number of\n\t * objects may be added. Any current parent on an object passed in here will be\n\t * removed, since an object can have at most one parent.\n\t *\n\t * @fires Object3D#added\n\t * @fires Object3D#childadded\n\t * @param {Object3D} object - The 3D object to add.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tadd( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.add( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object === this ) {\n\n\t\t\terror( 'Object3D.add: object can\\'t be added as a child of itself.', object );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tif ( object && object.isObject3D ) {\n\n\t\t\tobject.removeFromParent();\n\t\t\tobject.parent = this;\n\t\t\tthis.children.push( object );\n\n\t\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t\t_childaddedEvent.child = object;\n\t\t\tthis.dispatchEvent( _childaddedEvent );\n\t\t\t_childaddedEvent.child = null;\n\n\t\t} else {\n\n\t\t\terror( 'Object3D.add: object not an instance of THREE.Object3D.', object );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes the given 3D object as child from this 3D object.\n\t * An arbitrary number of objects may be removed.\n\t *\n\t * @fires Object3D#removed\n\t * @fires Object3D#childremoved\n\t * @param {Object3D} object - The 3D object to remove.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tremove( object ) {\n\n\t\tif ( arguments.length > 1 ) {\n\n\t\t\tfor ( let i = 0; i < arguments.length; i ++ ) {\n\n\t\t\t\tthis.remove( arguments[ i ] );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst index = this.children.indexOf( object );\n\n\t\tif ( index !== -1 ) {\n\n\t\t\tobject.parent = null;\n\t\t\tthis.children.splice( index, 1 );\n\n\t\t\tobject.dispatchEvent( _removedEvent );\n\n\t\t\t_childremovedEvent.child = object;\n\t\t\tthis.dispatchEvent( _childremovedEvent );\n\t\t\t_childremovedEvent.child = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes this 3D object from its current parent.\n\t *\n\t * @fires Object3D#removed\n\t * @fires Object3D#childremoved\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tremoveFromParent() {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tparent.remove( this );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes all child objects.\n\t *\n\t * @fires Object3D#removed\n\t * @fires Object3D#childremoved\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tclear() {\n\n\t\treturn this.remove( ... this.children );\n\n\t}\n\n\t/**\n\t * Adds the given 3D object as a child of this 3D object, while maintaining the object's world\n\t * transform. This method does not support scene graphs having non-uniformly-scaled nodes(s).\n\t *\n\t * @fires Object3D#added\n\t * @fires Object3D#childadded\n\t * @param {Object3D} object - The 3D object to attach.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tattach( object ) {\n\n\t\t// adds object as a child of this, while maintaining the object's world transform\n\n\t\t// Note: This method does not support scene graphs having non-uniformly-scaled nodes(s)\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\t_m1$1.copy( this.matrixWorld ).invert();\n\n\t\tif ( object.parent !== null ) {\n\n\t\t\tobject.parent.updateWorldMatrix( true, false );\n\n\t\t\t_m1$1.multiply( object.parent.matrixWorld );\n\n\t\t}\n\n\t\tobject.applyMatrix4( _m1$1 );\n\n\t\tobject.removeFromParent();\n\t\tobject.parent = this;\n\t\tthis.children.push( object );\n\n\t\tobject.updateWorldMatrix( false, true );\n\n\t\tobject.dispatchEvent( _addedEvent );\n\n\t\t_childaddedEvent.child = object;\n\t\tthis.dispatchEvent( _childaddedEvent );\n\t\t_childaddedEvent.child = null;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns the first with a matching ID.\n\t *\n\t * @param {number} id - The id.\n\t * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found.\n\t */\n\tgetObjectById( id ) {\n\n\t\treturn this.getObjectByProperty( 'id', id );\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns the first with a matching name.\n\t *\n\t * @param {string} name - The name.\n\t * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found.\n\t */\n\tgetObjectByName( name ) {\n\n\t\treturn this.getObjectByProperty( 'name', name );\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns the first with a matching property value.\n\t *\n\t * @param {string} name - The name of the property.\n\t * @param {any} value - The value.\n\t * @return {Object3D|undefined} The found 3D object. Returns `undefined` if no 3D object has been found.\n\t */\n\tgetObjectByProperty( name, value ) {\n\n\t\tif ( this[ name ] === value ) return this;\n\n\t\tfor ( let i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\tconst child = this.children[ i ];\n\t\t\tconst object = child.getObjectByProperty( name, value );\n\n\t\t\tif ( object !== undefined ) {\n\n\t\t\t\treturn object;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\t/**\n\t * Searches through the 3D object and its children, starting with the 3D object\n\t * itself, and returns all 3D objects with a matching property value.\n\t *\n\t * @param {string} name - The name of the property.\n\t * @param {any} value - The value.\n\t * @param {Array<Object3D>} result - The method stores the result in this array.\n\t * @return {Array<Object3D>} The found 3D objects.\n\t */\n\tgetObjectsByProperty( name, value, result = [] ) {\n\n\t\tif ( this[ name ] === value ) result.push( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].getObjectsByProperty( name, value, result );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the position of the 3D object in world space.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's position in world space.\n\t */\n\tgetWorldPosition( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\treturn target.setFromMatrixPosition( this.matrixWorld );\n\n\t}\n\n\t/**\n\t * Returns a Quaternion representing the position of the 3D object in world space.\n\t *\n\t * @param {Quaternion} target - The target Quaternion the result is stored to.\n\t * @return {Quaternion} The 3D object's rotation in world space.\n\t */\n\tgetWorldQuaternion( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, target, _scale$2 );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the scale of the 3D object in world space.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's scale in world space.\n\t */\n\tgetWorldScale( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tthis.matrixWorld.decompose( _position$3, _quaternion$2, target );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the (\"look\") direction of the 3D object in world space.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's direction in world space.\n\t */\n\tgetWorldDirection( target ) {\n\n\t\tthis.updateWorldMatrix( true, false );\n\n\t\tconst e = this.matrixWorld.elements;\n\n\t\treturn target.set( e[ 8 ], e[ 9 ], e[ 10 ] ).normalize();\n\n\t}\n\n\t/**\n\t * Abstract method to get intersections between a casted ray and this\n\t * 3D object. Renderable 3D objects such as {@link Mesh}, {@link Line} or {@link Points}\n\t * implement this method in order to use raycasting.\n\t *\n\t * @abstract\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array<Object>} intersects - An array holding the result of the method.\n\t */\n\traycast( /* raycaster, intersects */ ) {}\n\n\t/**\n\t * Executes the callback on this 3D object and all descendants.\n\t *\n\t * Note: Modifying the scene graph inside the callback is discouraged.\n\t *\n\t * @param {Function} callback - A callback function that allows to process the current 3D object.\n\t */\n\ttraverse( callback ) {\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverse( callback );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Like {@link Object3D#traverse}, but the callback will only be executed for visible 3D objects.\n\t * Descendants of invisible 3D objects are not traversed.\n\t *\n\t * Note: Modifying the scene graph inside the callback is discouraged.\n\t *\n\t * @param {Function} callback - A callback function that allows to process the current 3D object.\n\t */\n\ttraverseVisible( callback ) {\n\n\t\tif ( this.visible === false ) return;\n\n\t\tcallback( this );\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tchildren[ i ].traverseVisible( callback );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Like {@link Object3D#traverse}, but the callback will only be executed for all ancestors.\n\t *\n\t * Note: Modifying the scene graph inside the callback is discouraged.\n\t *\n\t * @param {Function} callback - A callback function that allows to process the current 3D object.\n\t */\n\ttraverseAncestors( callback ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( parent !== null ) {\n\n\t\t\tcallback( parent );\n\n\t\t\tparent.traverseAncestors( callback );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the transformation matrix in local space by computing it from the current\n\t * position, rotation and scale values.\n\t */\n\tupdateMatrix() {\n\n\t\tthis.matrix.compose( this.position, this.quaternion, this.scale );\n\n\t\tthis.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t/**\n\t * Updates the transformation matrix in world space of this 3D objects and its descendants.\n\t *\n\t * To ensure correct results, this method also recomputes the 3D object's transformation matrix in\n\t * local space. The computation of the local and world matrix can be controlled with the\n\t * {@link Object3D#matrixAutoUpdate} and {@link Object3D#matrixWorldAutoUpdate} flags which are both\n\t * `true` by default.  Set these flags to `false` if you need more control over the update matrix process.\n\t *\n\t * @param {boolean} [force=false] - When set to `true`, a recomputation of world matrices is forced even\n\t * when {@link Object3D#matrixWorldAutoUpdate} is set to `false`.\n\t */\n\tupdateMatrixWorld( force ) {\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldNeedsUpdate || force ) {\n\n\t\t\tif ( this.matrixWorldAutoUpdate === true ) {\n\n\t\t\t\tif ( this.parent === null ) {\n\n\t\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\tforce = true;\n\n\t\t}\n\n\t\t// make sure descendants are updated if required\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tconst child = children[ i ];\n\n\t\t\tchild.updateMatrixWorld( force );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * An alternative version of {@link Object3D#updateMatrixWorld} with more control over the\n\t * update of ancestor and descendant nodes.\n\t *\n\t * @param {boolean} [updateParents=false] Whether ancestor nodes should be updated or not.\n\t * @param {boolean} [updateChildren=false] Whether descendant nodes should be updated or not.\n\t */\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tconst parent = this.parent;\n\n\t\tif ( updateParents === true && parent !== null ) {\n\n\t\t\tparent.updateWorldMatrix( true, false );\n\n\t\t}\n\n\t\tif ( this.matrixAutoUpdate ) this.updateMatrix();\n\n\t\tif ( this.matrixWorldAutoUpdate === true ) {\n\n\t\t\tif ( this.parent === null ) {\n\n\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// make sure descendants are updated\n\n\t\tif ( updateChildren === true ) {\n\n\t\t\tconst children = this.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = children[ i ];\n\n\t\t\t\tchild.updateWorldMatrix( false, true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the 3D object into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized 3D object.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\t// meta is a string when called from JSON.stringify\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tconst output = {};\n\n\t\t// meta is a hash used to collect geometries, materials.\n\t\t// not providing it implies that this is the root object\n\t\t// being serialized.\n\t\tif ( isRootObject ) {\n\n\t\t\t// initialize meta obj\n\t\t\tmeta = {\n\t\t\t\tgeometries: {},\n\t\t\t\tmaterials: {},\n\t\t\t\ttextures: {},\n\t\t\t\timages: {},\n\t\t\t\tshapes: {},\n\t\t\t\tskeletons: {},\n\t\t\t\tanimations: {},\n\t\t\t\tnodes: {}\n\t\t\t};\n\n\t\t\toutput.metadata = {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Object',\n\t\t\t\tgenerator: 'Object3D.toJSON'\n\t\t\t};\n\n\t\t}\n\n\t\t// standard Object3D serialization\n\n\t\tconst object = {};\n\n\t\tobject.uuid = this.uuid;\n\t\tobject.type = this.type;\n\n\t\tif ( this.name !== '' ) object.name = this.name;\n\t\tif ( this.castShadow === true ) object.castShadow = true;\n\t\tif ( this.receiveShadow === true ) object.receiveShadow = true;\n\t\tif ( this.visible === false ) object.visible = false;\n\t\tif ( this.frustumCulled === false ) object.frustumCulled = false;\n\t\tif ( this.renderOrder !== 0 ) object.renderOrder = this.renderOrder;\n\t\tif ( Object.keys( this.userData ).length > 0 ) object.userData = this.userData;\n\n\t\tobject.layers = this.layers.mask;\n\t\tobject.matrix = this.matrix.toArray();\n\t\tobject.up = this.up.toArray();\n\n\t\tif ( this.matrixAutoUpdate === false ) object.matrixAutoUpdate = false;\n\n\t\t// object specific properties\n\n\t\tif ( this.isInstancedMesh ) {\n\n\t\t\tobject.type = 'InstancedMesh';\n\t\t\tobject.count = this.count;\n\t\t\tobject.instanceMatrix = this.instanceMatrix.toJSON();\n\t\t\tif ( this.instanceColor !== null ) object.instanceColor = this.instanceColor.toJSON();\n\n\t\t}\n\n\t\tif ( this.isBatchedMesh ) {\n\n\t\t\tobject.type = 'BatchedMesh';\n\t\t\tobject.perObjectFrustumCulled = this.perObjectFrustumCulled;\n\t\t\tobject.sortObjects = this.sortObjects;\n\n\t\t\tobject.drawRanges = this._drawRanges;\n\t\t\tobject.reservedRanges = this._reservedRanges;\n\n\t\t\tobject.geometryInfo = this._geometryInfo.map( info => ( {\n\t\t\t\t...info,\n\t\t\t\tboundingBox: info.boundingBox ? info.boundingBox.toJSON() : undefined,\n\t\t\t\tboundingSphere: info.boundingSphere ? info.boundingSphere.toJSON() : undefined\n\t\t\t} ) );\n\t\t\tobject.instanceInfo = this._instanceInfo.map( info => ( { ...info } ) );\n\n\t\t\tobject.availableInstanceIds = this._availableInstanceIds.slice();\n\t\t\tobject.availableGeometryIds = this._availableGeometryIds.slice();\n\n\t\t\tobject.nextIndexStart = this._nextIndexStart;\n\t\t\tobject.nextVertexStart = this._nextVertexStart;\n\t\t\tobject.geometryCount = this._geometryCount;\n\n\t\t\tobject.maxInstanceCount = this._maxInstanceCount;\n\t\t\tobject.maxVertexCount = this._maxVertexCount;\n\t\t\tobject.maxIndexCount = this._maxIndexCount;\n\n\t\t\tobject.geometryInitialized = this._geometryInitialized;\n\n\t\t\tobject.matricesTexture = this._matricesTexture.toJSON( meta );\n\n\t\t\tobject.indirectTexture = this._indirectTexture.toJSON( meta );\n\n\t\t\tif ( this._colorsTexture !== null ) {\n\n\t\t\t\tobject.colorsTexture = this._colorsTexture.toJSON( meta );\n\n\t\t\t}\n\n\t\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\t\tobject.boundingSphere = this.boundingSphere.toJSON();\n\n\t\t\t}\n\n\t\t\tif ( this.boundingBox !== null ) {\n\n\t\t\t\tobject.boundingBox = this.boundingBox.toJSON();\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tfunction serialize( library, element ) {\n\n\t\t\tif ( library[ element.uuid ] === undefined ) {\n\n\t\t\t\tlibrary[ element.uuid ] = element.toJSON( meta );\n\n\t\t\t}\n\n\t\t\treturn element.uuid;\n\n\t\t}\n\n\t\tif ( this.isScene ) {\n\n\t\t\tif ( this.background ) {\n\n\t\t\t\tif ( this.background.isColor ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON();\n\n\t\t\t\t} else if ( this.background.isTexture ) {\n\n\t\t\t\t\tobject.background = this.background.toJSON( meta ).uuid;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.environment && this.environment.isTexture && this.environment.isRenderTargetTexture !== true ) {\n\n\t\t\t\tobject.environment = this.environment.toJSON( meta ).uuid;\n\n\t\t\t}\n\n\t\t} else if ( this.isMesh || this.isLine || this.isPoints ) {\n\n\t\t\tobject.geometry = serialize( meta.geometries, this.geometry );\n\n\t\t\tconst parameters = this.geometry.parameters;\n\n\t\t\tif ( parameters !== undefined && parameters.shapes !== undefined ) {\n\n\t\t\t\tconst shapes = parameters.shapes;\n\n\t\t\t\tif ( Array.isArray( shapes ) ) {\n\n\t\t\t\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst shape = shapes[ i ];\n\n\t\t\t\t\t\tserialize( meta.shapes, shape );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tserialize( meta.shapes, shapes );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.isSkinnedMesh ) {\n\n\t\t\tobject.bindMode = this.bindMode;\n\t\t\tobject.bindMatrix = this.bindMatrix.toArray();\n\n\t\t\tif ( this.skeleton !== undefined ) {\n\n\t\t\t\tserialize( meta.skeletons, this.skeleton );\n\n\t\t\t\tobject.skeleton = this.skeleton.uuid;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.material !== undefined ) {\n\n\t\t\tif ( Array.isArray( this.material ) ) {\n\n\t\t\t\tconst uuids = [];\n\n\t\t\t\tfor ( let i = 0, l = this.material.length; i < l; i ++ ) {\n\n\t\t\t\t\tuuids.push( serialize( meta.materials, this.material[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tobject.material = uuids;\n\n\t\t\t} else {\n\n\t\t\t\tobject.material = serialize( meta.materials, this.material );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.children.length > 0 ) {\n\n\t\t\tobject.children = [];\n\n\t\t\tfor ( let i = 0; i < this.children.length; i ++ ) {\n\n\t\t\t\tobject.children.push( this.children[ i ].toJSON( meta ).object );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.animations.length > 0 ) {\n\n\t\t\tobject.animations = [];\n\n\t\t\tfor ( let i = 0; i < this.animations.length; i ++ ) {\n\n\t\t\t\tconst animation = this.animations[ i ];\n\n\t\t\t\tobject.animations.push( serialize( meta.animations, animation ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst geometries = extractFromCache( meta.geometries );\n\t\t\tconst materials = extractFromCache( meta.materials );\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\t\t\tconst shapes = extractFromCache( meta.shapes );\n\t\t\tconst skeletons = extractFromCache( meta.skeletons );\n\t\t\tconst animations = extractFromCache( meta.animations );\n\t\t\tconst nodes = extractFromCache( meta.nodes );\n\n\t\t\tif ( geometries.length > 0 ) output.geometries = geometries;\n\t\t\tif ( materials.length > 0 ) output.materials = materials;\n\t\t\tif ( textures.length > 0 ) output.textures = textures;\n\t\t\tif ( images.length > 0 ) output.images = images;\n\t\t\tif ( shapes.length > 0 ) output.shapes = shapes;\n\t\t\tif ( skeletons.length > 0 ) output.skeletons = skeletons;\n\t\t\tif ( animations.length > 0 ) output.animations = animations;\n\t\t\tif ( nodes.length > 0 ) output.nodes = nodes;\n\n\t\t}\n\n\t\toutput.object = object;\n\n\t\treturn output;\n\n\t\t// extract data from the cache hash\n\t\t// remove metadata on each item\n\t\t// and return as array\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new 3D object with copied values from this instance.\n\t *\n\t * @param {boolean} [recursive=true] - When set to `true`, descendants of the 3D object are also cloned.\n\t * @return {Object3D} A clone of this instance.\n\t */\n\tclone( recursive ) {\n\n\t\treturn new this.constructor().copy( this, recursive );\n\n\t}\n\n\t/**\n\t * Copies the values of the given 3D object to this instance.\n\t *\n\t * @param {Object3D} source - The 3D object to copy.\n\t * @param {boolean} [recursive=true] - When set to `true`, descendants of the 3D object are cloned.\n\t * @return {Object3D} A reference to this instance.\n\t */\n\tcopy( source, recursive = true ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.up.copy( source.up );\n\n\t\tthis.position.copy( source.position );\n\t\tthis.rotation.order = source.rotation.order;\n\t\tthis.quaternion.copy( source.quaternion );\n\t\tthis.scale.copy( source.scale );\n\n\t\tthis.matrix.copy( source.matrix );\n\t\tthis.matrixWorld.copy( source.matrixWorld );\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\tthis.matrixWorldAutoUpdate = source.matrixWorldAutoUpdate;\n\t\tthis.matrixWorldNeedsUpdate = source.matrixWorldNeedsUpdate;\n\n\t\tthis.layers.mask = source.layers.mask;\n\t\tthis.visible = source.visible;\n\n\t\tthis.castShadow = source.castShadow;\n\t\tthis.receiveShadow = source.receiveShadow;\n\n\t\tthis.frustumCulled = source.frustumCulled;\n\t\tthis.renderOrder = source.renderOrder;\n\n\t\tthis.animations = source.animations.slice();\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\tif ( recursive === true ) {\n\n\t\t\tfor ( let i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\tconst child = source.children[ i ];\n\t\t\t\tthis.add( child.clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * The default up direction for objects, also used as the default\n * position for {@link DirectionalLight} and {@link HemisphereLight}.\n *\n * @static\n * @type {Vector3}\n * @default (0,1,0)\n */\nObject3D.DEFAULT_UP = /*@__PURE__*/ new Vector3( 0, 1, 0 );\n\n/**\n * The default setting for {@link Object3D#matrixAutoUpdate} for\n * newly created 3D objects.\n *\n * @static\n * @type {boolean}\n * @default true\n */\nObject3D.DEFAULT_MATRIX_AUTO_UPDATE = true;\n\n/**\n * The default setting for {@link Object3D#matrixWorldAutoUpdate} for\n * newly created 3D objects.\n *\n * @static\n * @type {boolean}\n * @default true\n */\nObject3D.DEFAULT_MATRIX_WORLD_AUTO_UPDATE = true;\n\nconst _v0$1 = /*@__PURE__*/ new Vector3();\nconst _v1$3 = /*@__PURE__*/ new Vector3();\nconst _v2$2 = /*@__PURE__*/ new Vector3();\nconst _v3$2 = /*@__PURE__*/ new Vector3();\n\nconst _vab = /*@__PURE__*/ new Vector3();\nconst _vac = /*@__PURE__*/ new Vector3();\nconst _vbc = /*@__PURE__*/ new Vector3();\nconst _vap = /*@__PURE__*/ new Vector3();\nconst _vbp = /*@__PURE__*/ new Vector3();\nconst _vcp = /*@__PURE__*/ new Vector3();\n\nconst _v40 = /*@__PURE__*/ new Vector4();\nconst _v41 = /*@__PURE__*/ new Vector4();\nconst _v42 = /*@__PURE__*/ new Vector4();\n\n/**\n * A geometric triangle as defined by three vectors representing its three corners.\n */\nclass Triangle {\n\n\t/**\n\t * Constructs a new triangle.\n\t *\n\t * @param {Vector3} [a=(0,0,0)] - The first corner of the triangle.\n\t * @param {Vector3} [b=(0,0,0)] - The second corner of the triangle.\n\t * @param {Vector3} [c=(0,0,0)] - The third corner of the triangle.\n\t */\n\tconstructor( a = new Vector3(), b = new Vector3(), c = new Vector3() ) {\n\n\t\t/**\n\t\t * The first corner of the triangle.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.a = a;\n\n\t\t/**\n\t\t * The second corner of the triangle.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.b = b;\n\n\t\t/**\n\t\t * The third corner of the triangle.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.c = c;\n\n\t}\n\n\t/**\n\t * Computes the normal vector of a triangle.\n\t *\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The triangle's normal.\n\t */\n\tstatic getNormal( a, b, c, target ) {\n\n\t\ttarget.subVectors( c, b );\n\t\t_v0$1.subVectors( a, b );\n\t\ttarget.cross( _v0$1 );\n\n\t\tconst targetLengthSq = target.lengthSq();\n\t\tif ( targetLengthSq > 0 ) {\n\n\t\t\treturn target.multiplyScalar( 1 / Math.sqrt( targetLengthSq ) );\n\n\t\t}\n\n\t\treturn target.set( 0, 0, 0 );\n\n\t}\n\n\t/**\n\t * Computes a barycentric coordinates from the given vector.\n\t * Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - A point in 3D space.\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The barycentric coordinates for the given point\n\t */\n\tstatic getBarycoord( point, a, b, c, target ) {\n\n\t\t// based on: http://www.blackpawn.com/texts/pointinpoly/default.html\n\n\t\t_v0$1.subVectors( c, a );\n\t\t_v1$3.subVectors( b, a );\n\t\t_v2$2.subVectors( point, a );\n\n\t\tconst dot00 = _v0$1.dot( _v0$1 );\n\t\tconst dot01 = _v0$1.dot( _v1$3 );\n\t\tconst dot02 = _v0$1.dot( _v2$2 );\n\t\tconst dot11 = _v1$3.dot( _v1$3 );\n\t\tconst dot12 = _v1$3.dot( _v2$2 );\n\n\t\tconst denom = ( dot00 * dot11 - dot01 * dot01 );\n\n\t\t// collinear or singular triangle\n\t\tif ( denom === 0 ) {\n\n\t\t\ttarget.set( 0, 0, 0 );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst invDenom = 1 / denom;\n\t\tconst u = ( dot11 * dot02 - dot01 * dot12 ) * invDenom;\n\t\tconst v = ( dot00 * dot12 - dot01 * dot02 ) * invDenom;\n\n\t\t// barycentric coordinates must always sum to 1\n\t\treturn target.set( 1 - u - v, v, u );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle.\n\t *\n\t * @param {Vector3} point - The point in 3D space to test.\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @return {boolean} Whether the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle or not.\n\t */\n\tstatic containsPoint( point, a, b, c ) {\n\n\t\t// if the triangle is degenerate then we can't contain a point\n\t\tif ( this.getBarycoord( point, a, b, c, _v3$2 ) === null ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn ( _v3$2.x >= 0 ) && ( _v3$2.y >= 0 ) && ( ( _v3$2.x + _v3$2.y ) <= 1 );\n\n\t}\n\n\t/**\n\t * Computes the value barycentrically interpolated for the given point on the\n\t * triangle. Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - Position of interpolated point.\n\t * @param {Vector3} p1 - The first corner of the triangle.\n\t * @param {Vector3} p2 - The second corner of the triangle.\n\t * @param {Vector3} p3 - The third corner of the triangle.\n\t * @param {Vector3} v1 - Value to interpolate of first vertex.\n\t * @param {Vector3} v2 - Value to interpolate of second vertex.\n\t * @param {Vector3} v3 - Value to interpolate of third vertex.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The interpolated value.\n\t */\n\tstatic getInterpolation( point, p1, p2, p3, v1, v2, v3, target ) {\n\n\t\tif ( this.getBarycoord( point, p1, p2, p3, _v3$2 ) === null ) {\n\n\t\t\ttarget.x = 0;\n\t\t\ttarget.y = 0;\n\t\t\tif ( 'z' in target ) target.z = 0;\n\t\t\tif ( 'w' in target ) target.w = 0;\n\t\t\treturn null;\n\n\t\t}\n\n\t\ttarget.setScalar( 0 );\n\t\ttarget.addScaledVector( v1, _v3$2.x );\n\t\ttarget.addScaledVector( v2, _v3$2.y );\n\t\ttarget.addScaledVector( v3, _v3$2.z );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Computes the value barycentrically interpolated for the given attribute and indices.\n\t *\n\t * @param {BufferAttribute} attr - The attribute to interpolate.\n\t * @param {number} i1 - Index of first vertex.\n\t * @param {number} i2 - Index of second vertex.\n\t * @param {number} i3 - Index of third vertex.\n\t * @param {Vector3} barycoord - The barycoordinate value to use to interpolate.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The interpolated attribute value.\n\t */\n\tstatic getInterpolatedAttribute( attr, i1, i2, i3, barycoord, target ) {\n\n\t\t_v40.setScalar( 0 );\n\t\t_v41.setScalar( 0 );\n\t\t_v42.setScalar( 0 );\n\n\t\t_v40.fromBufferAttribute( attr, i1 );\n\t\t_v41.fromBufferAttribute( attr, i2 );\n\t\t_v42.fromBufferAttribute( attr, i3 );\n\n\t\ttarget.setScalar( 0 );\n\t\ttarget.addScaledVector( _v40, barycoord.x );\n\t\ttarget.addScaledVector( _v41, barycoord.y );\n\t\ttarget.addScaledVector( _v42, barycoord.z );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns `true` if the triangle is oriented towards the given direction.\n\t *\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @param {Vector3} direction - The (normalized) direction vector.\n\t * @return {boolean} Whether the triangle is oriented towards the given direction or not.\n\t */\n\tstatic isFrontFacing( a, b, c, direction ) {\n\n\t\t_v0$1.subVectors( c, b );\n\t\t_v1$3.subVectors( a, b );\n\n\t\t// strictly front facing\n\t\treturn ( _v0$1.cross( _v1$3 ).dot( direction ) < 0 ) ? true : false;\n\n\t}\n\n\t/**\n\t * Sets the triangle's vertices by copying the given values.\n\t *\n\t * @param {Vector3} a - The first corner of the triangle.\n\t * @param {Vector3} b - The second corner of the triangle.\n\t * @param {Vector3} c - The third corner of the triangle.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tset( a, b, c ) {\n\n\t\tthis.a.copy( a );\n\t\tthis.b.copy( b );\n\t\tthis.c.copy( c );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the triangle's vertices by copying the given array values.\n\t *\n\t * @param {Array<Vector3>} points - An array with 3D points.\n\t * @param {number} i0 - The array index representing the first corner of the triangle.\n\t * @param {number} i1 - The array index representing the second corner of the triangle.\n\t * @param {number} i2 - The array index representing the third corner of the triangle.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tsetFromPointsAndIndices( points, i0, i1, i2 ) {\n\n\t\tthis.a.copy( points[ i0 ] );\n\t\tthis.b.copy( points[ i1 ] );\n\t\tthis.c.copy( points[ i2 ] );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the triangle's vertices by copying the given attribute values.\n\t *\n\t * @param {BufferAttribute} attribute - A buffer attribute with 3D points data.\n\t * @param {number} i0 - The attribute index representing the first corner of the triangle.\n\t * @param {number} i1 - The attribute index representing the second corner of the triangle.\n\t * @param {number} i2 - The attribute index representing the third corner of the triangle.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tsetFromAttributeAndIndices( attribute, i0, i1, i2 ) {\n\n\t\tthis.a.fromBufferAttribute( attribute, i0 );\n\t\tthis.b.fromBufferAttribute( attribute, i1 );\n\t\tthis.c.fromBufferAttribute( attribute, i2 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new triangle with copied values from this instance.\n\t *\n\t * @return {Triangle} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given triangle to this instance.\n\t *\n\t * @param {Triangle} triangle - The triangle to copy.\n\t * @return {Triangle} A reference to this triangle.\n\t */\n\tcopy( triangle ) {\n\n\t\tthis.a.copy( triangle.a );\n\t\tthis.b.copy( triangle.b );\n\t\tthis.c.copy( triangle.c );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the area of the triangle.\n\t *\n\t * @return {number} The triangle's area.\n\t */\n\tgetArea() {\n\n\t\t_v0$1.subVectors( this.c, this.b );\n\t\t_v1$3.subVectors( this.a, this.b );\n\n\t\treturn _v0$1.cross( _v1$3 ).length() * 0.5;\n\n\t}\n\n\t/**\n\t * Computes the midpoint of the triangle.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The triangle's midpoint.\n\t */\n\tgetMidpoint( target ) {\n\n\t\treturn target.addVectors( this.a, this.b ).add( this.c ).multiplyScalar( 1 / 3 );\n\n\t}\n\n\t/**\n\t * Computes the normal of the triangle.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The triangle's normal.\n\t */\n\tgetNormal( target ) {\n\n\t\treturn Triangle.getNormal( this.a, this.b, this.c, target );\n\n\t}\n\n\t/**\n\t * Computes a plane the triangle lies within.\n\t *\n\t * @param {Plane} target - The target vector that is used to store the method's result.\n\t * @return {Plane} The plane the triangle lies within.\n\t */\n\tgetPlane( target ) {\n\n\t\treturn target.setFromCoplanarPoints( this.a, this.b, this.c );\n\n\t}\n\n\t/**\n\t * Computes a barycentric coordinates from the given vector.\n\t * Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - A point in 3D space.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The barycentric coordinates for the given point\n\t */\n\tgetBarycoord( point, target ) {\n\n\t\treturn Triangle.getBarycoord( point, this.a, this.b, this.c, target );\n\n\t}\n\n\t/**\n\t * Computes the value barycentrically interpolated for the given point on the\n\t * triangle. Returns `null` if the triangle is degenerate.\n\t *\n\t * @param {Vector3} point - Position of interpolated point.\n\t * @param {Vector3} v1 - Value to interpolate of first vertex.\n\t * @param {Vector3} v2 - Value to interpolate of second vertex.\n\t * @param {Vector3} v3 - Value to interpolate of third vertex.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The interpolated value.\n\t */\n\tgetInterpolation( point, v1, v2, v3, target ) {\n\n\t\treturn Triangle.getInterpolation( point, this.a, this.b, this.c, v1, v2, v3, target );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle.\n\t *\n\t * @param {Vector3} point - The point in 3D space to test.\n\t * @return {boolean} Whether the given point, when projected onto the plane of the\n\t * triangle, lies within the triangle or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn Triangle.containsPoint( point, this.a, this.b, this.c );\n\n\t}\n\n\t/**\n\t * Returns `true` if the triangle is oriented towards the given direction.\n\t *\n\t * @param {Vector3} direction - The (normalized) direction vector.\n\t * @return {boolean} Whether the triangle is oriented towards the given direction or not.\n\t */\n\tisFrontFacing( direction ) {\n\n\t\treturn Triangle.isFrontFacing( this.a, this.b, this.c, direction );\n\n\t}\n\n\t/**\n\t * Returns `true` if this triangle intersects with the given box.\n\t *\n\t * @param {Box3} box - The box to intersect.\n\t * @return {boolean} Whether this triangle intersects with the given box or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsTriangle( this );\n\n\t}\n\n\t/**\n\t * Returns the closest point on the triangle to the given point.\n\t *\n\t * @param {Vector3} p - The point to compute the closest point for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The closest point on the triangle.\n\t */\n\tclosestPointToPoint( p, target ) {\n\n\t\tconst a = this.a, b = this.b, c = this.c;\n\t\tlet v, w;\n\n\t\t// algorithm thanks to Real-Time Collision Detection by Christer Ericson,\n\t\t// published by Morgan Kaufmann Publishers, (c) 2005 Elsevier Inc.,\n\t\t// under the accompanying license; see chapter 5.1.5 for detailed explanation.\n\t\t// basically, we're distinguishing which of the voronoi regions of the triangle\n\t\t// the point lies in with the minimum amount of redundant computation.\n\n\t\t_vab.subVectors( b, a );\n\t\t_vac.subVectors( c, a );\n\t\t_vap.subVectors( p, a );\n\t\tconst d1 = _vab.dot( _vap );\n\t\tconst d2 = _vac.dot( _vap );\n\t\tif ( d1 <= 0 && d2 <= 0 ) {\n\n\t\t\t// vertex region of A; barycentric coords (1, 0, 0)\n\t\t\treturn target.copy( a );\n\n\t\t}\n\n\t\t_vbp.subVectors( p, b );\n\t\tconst d3 = _vab.dot( _vbp );\n\t\tconst d4 = _vac.dot( _vbp );\n\t\tif ( d3 >= 0 && d4 <= d3 ) {\n\n\t\t\t// vertex region of B; barycentric coords (0, 1, 0)\n\t\t\treturn target.copy( b );\n\n\t\t}\n\n\t\tconst vc = d1 * d4 - d3 * d2;\n\t\tif ( vc <= 0 && d1 >= 0 && d3 <= 0 ) {\n\n\t\t\tv = d1 / ( d1 - d3 );\n\t\t\t// edge region of AB; barycentric coords (1-v, v, 0)\n\t\t\treturn target.copy( a ).addScaledVector( _vab, v );\n\n\t\t}\n\n\t\t_vcp.subVectors( p, c );\n\t\tconst d5 = _vab.dot( _vcp );\n\t\tconst d6 = _vac.dot( _vcp );\n\t\tif ( d6 >= 0 && d5 <= d6 ) {\n\n\t\t\t// vertex region of C; barycentric coords (0, 0, 1)\n\t\t\treturn target.copy( c );\n\n\t\t}\n\n\t\tconst vb = d5 * d2 - d1 * d6;\n\t\tif ( vb <= 0 && d2 >= 0 && d6 <= 0 ) {\n\n\t\t\tw = d2 / ( d2 - d6 );\n\t\t\t// edge region of AC; barycentric coords (1-w, 0, w)\n\t\t\treturn target.copy( a ).addScaledVector( _vac, w );\n\n\t\t}\n\n\t\tconst va = d3 * d6 - d5 * d4;\n\t\tif ( va <= 0 && ( d4 - d3 ) >= 0 && ( d5 - d6 ) >= 0 ) {\n\n\t\t\t_vbc.subVectors( c, b );\n\t\t\tw = ( d4 - d3 ) / ( ( d4 - d3 ) + ( d5 - d6 ) );\n\t\t\t// edge region of BC; barycentric coords (0, 1-w, w)\n\t\t\treturn target.copy( b ).addScaledVector( _vbc, w ); // edge region of BC\n\n\t\t}\n\n\t\t// face region\n\t\tconst denom = 1 / ( va + vb + vc );\n\t\t// u = va * denom\n\t\tv = vb * denom;\n\t\tw = vc * denom;\n\n\t\treturn target.copy( a ).addScaledVector( _vab, v ).addScaledVector( _vac, w );\n\n\t}\n\n\t/**\n\t * Returns `true` if this triangle is equal with the given one.\n\t *\n\t * @param {Triangle} triangle - The triangle to test for equality.\n\t * @return {boolean} Whether this triangle is equal with the given one.\n\t */\n\tequals( triangle ) {\n\n\t\treturn triangle.a.equals( this.a ) && triangle.b.equals( this.b ) && triangle.c.equals( this.c );\n\n\t}\n\n}\n\nconst _colorKeywords = { 'aliceblue': 0xF0F8FF, 'antiquewhite': 0xFAEBD7, 'aqua': 0x00FFFF, 'aquamarine': 0x7FFFD4, 'azure': 0xF0FFFF,\n\t'beige': 0xF5F5DC, 'bisque': 0xFFE4C4, 'black': 0x000000, 'blanchedalmond': 0xFFEBCD, 'blue': 0x0000FF, 'blueviolet': 0x8A2BE2,\n\t'brown': 0xA52A2A, 'burlywood': 0xDEB887, 'cadetblue': 0x5F9EA0, 'chartreuse': 0x7FFF00, 'chocolate': 0xD2691E, 'coral': 0xFF7F50,\n\t'cornflowerblue': 0x6495ED, 'cornsilk': 0xFFF8DC, 'crimson': 0xDC143C, 'cyan': 0x00FFFF, 'darkblue': 0x00008B, 'darkcyan': 0x008B8B,\n\t'darkgoldenrod': 0xB8860B, 'darkgray': 0xA9A9A9, 'darkgreen': 0x006400, 'darkgrey': 0xA9A9A9, 'darkkhaki': 0xBDB76B, 'darkmagenta': 0x8B008B,\n\t'darkolivegreen': 0x556B2F, 'darkorange': 0xFF8C00, 'darkorchid': 0x9932CC, 'darkred': 0x8B0000, 'darksalmon': 0xE9967A, 'darkseagreen': 0x8FBC8F,\n\t'darkslateblue': 0x483D8B, 'darkslategray': 0x2F4F4F, 'darkslategrey': 0x2F4F4F, 'darkturquoise': 0x00CED1, 'darkviolet': 0x9400D3,\n\t'deeppink': 0xFF1493, 'deepskyblue': 0x00BFFF, 'dimgray': 0x696969, 'dimgrey': 0x696969, 'dodgerblue': 0x1E90FF, 'firebrick': 0xB22222,\n\t'floralwhite': 0xFFFAF0, 'forestgreen': 0x228B22, 'fuchsia': 0xFF00FF, 'gainsboro': 0xDCDCDC, 'ghostwhite': 0xF8F8FF, 'gold': 0xFFD700,\n\t'goldenrod': 0xDAA520, 'gray': 0x808080, 'green': 0x008000, 'greenyellow': 0xADFF2F, 'grey': 0x808080, 'honeydew': 0xF0FFF0, 'hotpink': 0xFF69B4,\n\t'indianred': 0xCD5C5C, 'indigo': 0x4B0082, 'ivory': 0xFFFFF0, 'khaki': 0xF0E68C, 'lavender': 0xE6E6FA, 'lavenderblush': 0xFFF0F5, 'lawngreen': 0x7CFC00,\n\t'lemonchiffon': 0xFFFACD, 'lightblue': 0xADD8E6, 'lightcoral': 0xF08080, 'lightcyan': 0xE0FFFF, 'lightgoldenrodyellow': 0xFAFAD2, 'lightgray': 0xD3D3D3,\n\t'lightgreen': 0x90EE90, 'lightgrey': 0xD3D3D3, 'lightpink': 0xFFB6C1, 'lightsalmon': 0xFFA07A, 'lightseagreen': 0x20B2AA, 'lightskyblue': 0x87CEFA,\n\t'lightslategray': 0x778899, 'lightslategrey': 0x778899, 'lightsteelblue': 0xB0C4DE, 'lightyellow': 0xFFFFE0, 'lime': 0x00FF00, 'limegreen': 0x32CD32,\n\t'linen': 0xFAF0E6, 'magenta': 0xFF00FF, 'maroon': 0x800000, 'mediumaquamarine': 0x66CDAA, 'mediumblue': 0x0000CD, 'mediumorchid': 0xBA55D3,\n\t'mediumpurple': 0x9370DB, 'mediumseagreen': 0x3CB371, 'mediumslateblue': 0x7B68EE, 'mediumspringgreen': 0x00FA9A, 'mediumturquoise': 0x48D1CC,\n\t'mediumvioletred': 0xC71585, 'midnightblue': 0x191970, 'mintcream': 0xF5FFFA, 'mistyrose': 0xFFE4E1, 'moccasin': 0xFFE4B5, 'navajowhite': 0xFFDEAD,\n\t'navy': 0x000080, 'oldlace': 0xFDF5E6, 'olive': 0x808000, 'olivedrab': 0x6B8E23, 'orange': 0xFFA500, 'orangered': 0xFF4500, 'orchid': 0xDA70D6,\n\t'palegoldenrod': 0xEEE8AA, 'palegreen': 0x98FB98, 'paleturquoise': 0xAFEEEE, 'palevioletred': 0xDB7093, 'papayawhip': 0xFFEFD5, 'peachpuff': 0xFFDAB9,\n\t'peru': 0xCD853F, 'pink': 0xFFC0CB, 'plum': 0xDDA0DD, 'powderblue': 0xB0E0E6, 'purple': 0x800080, 'rebeccapurple': 0x663399, 'red': 0xFF0000, 'rosybrown': 0xBC8F8F,\n\t'royalblue': 0x4169E1, 'saddlebrown': 0x8B4513, 'salmon': 0xFA8072, 'sandybrown': 0xF4A460, 'seagreen': 0x2E8B57, 'seashell': 0xFFF5EE,\n\t'sienna': 0xA0522D, 'silver': 0xC0C0C0, 'skyblue': 0x87CEEB, 'slateblue': 0x6A5ACD, 'slategray': 0x708090, 'slategrey': 0x708090, 'snow': 0xFFFAFA,\n\t'springgreen': 0x00FF7F, 'steelblue': 0x4682B4, 'tan': 0xD2B48C, 'teal': 0x008080, 'thistle': 0xD8BFD8, 'tomato': 0xFF6347, 'turquoise': 0x40E0D0,\n\t'violet': 0xEE82EE, 'wheat': 0xF5DEB3, 'white': 0xFFFFFF, 'whitesmoke': 0xF5F5F5, 'yellow': 0xFFFF00, 'yellowgreen': 0x9ACD32 };\n\nconst _hslA = { h: 0, s: 0, l: 0 };\nconst _hslB = { h: 0, s: 0, l: 0 };\n\nfunction hue2rgb( p, q, t ) {\n\n\tif ( t < 0 ) t += 1;\n\tif ( t > 1 ) t -= 1;\n\tif ( t < 1 / 6 ) return p + ( q - p ) * 6 * t;\n\tif ( t < 1 / 2 ) return q;\n\tif ( t < 2 / 3 ) return p + ( q - p ) * 6 * ( 2 / 3 - t );\n\treturn p;\n\n}\n\n/**\n * A Color instance is represented by RGB components in the linear <i>working\n * color space</i>, which defaults to `LinearSRGBColorSpace`. Inputs\n * conventionally using `SRGBColorSpace` (such as hexadecimals and CSS\n * strings) are converted to the working color space automatically.\n *\n * ```js\n * // converted automatically from SRGBColorSpace to LinearSRGBColorSpace\n * const color = new THREE.Color().setHex( 0x112233 );\n * ```\n * Source color spaces may be specified explicitly, to ensure correct conversions.\n * ```js\n * // assumed already LinearSRGBColorSpace; no conversion\n * const color = new THREE.Color().setRGB( 0.5, 0.5, 0.5 );\n *\n * // converted explicitly from SRGBColorSpace to LinearSRGBColorSpace\n * const color = new THREE.Color().setRGB( 0.5, 0.5, 0.5, SRGBColorSpace );\n * ```\n * If THREE.ColorManagement is disabled, no conversions occur. For details,\n * see <i>Color management</i>. Iterating through a Color instance will yield\n * its components (r, g, b) in the corresponding order. A Color can be initialised\n * in any of the following ways:\n * ```js\n * //empty constructor - will default white\n * const color1 = new THREE.Color();\n *\n * //Hexadecimal color (recommended)\n * const color2 = new THREE.Color( 0xff0000 );\n *\n * //RGB string\n * const color3 = new THREE.Color(\"rgb(255, 0, 0)\");\n * const color4 = new THREE.Color(\"rgb(100%, 0%, 0%)\");\n *\n * //X11 color name - all 140 color names are supported.\n * //Note the lack of CamelCase in the name\n * const color5 = new THREE.Color( 'skyblue' );\n * //HSL string\n * const color6 = new THREE.Color(\"hsl(0, 100%, 50%)\");\n *\n * //Separate RGB values between 0 and 1\n * const color7 = new THREE.Color( 1, 0, 0 );\n * ```\n */\nclass Color {\n\n\t/**\n\t * Constructs a new color.\n\t *\n\t * Note that standard method of specifying color in three.js is with a hexadecimal triplet,\n\t * and that method is used throughout the rest of the documentation.\n\t *\n\t * @param {(number|string|Color)} [r] - The red component of the color. If `g` and `b` are\n\t * not provided, it can be hexadecimal triplet, a CSS-style string or another `Color` instance.\n\t * @param {number} [g] - The green component.\n\t * @param {number} [b] - The blue component.\n\t */\n\tconstructor( r, g, b ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isColor = true;\n\n\t\t/**\n\t\t * The red component.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.r = 1;\n\n\t\t/**\n\t\t * The green component.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.g = 1;\n\n\t\t/**\n\t\t * The blue component.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.b = 1;\n\n\t\treturn this.set( r, g, b );\n\n\t}\n\n\t/**\n\t * Sets the colors's components from the given values.\n\t *\n\t * @param {(number|string|Color)} [r] - The red component of the color. If `g` and `b` are\n\t * not provided, it can be hexadecimal triplet, a CSS-style string or another `Color` instance.\n\t * @param {number} [g] - The green component.\n\t * @param {number} [b] - The blue component.\n\t * @return {Color} A reference to this color.\n\t */\n\tset( r, g, b ) {\n\n\t\tif ( g === undefined && b === undefined ) {\n\n\t\t\t// r is THREE.Color, hex or string\n\n\t\t\tconst value = r;\n\n\t\t\tif ( value && value.isColor ) {\n\n\t\t\t\tthis.copy( value );\n\n\t\t\t} else if ( typeof value === 'number' ) {\n\n\t\t\t\tthis.setHex( value );\n\n\t\t\t} else if ( typeof value === 'string' ) {\n\n\t\t\t\tthis.setStyle( value );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.setRGB( r, g, b );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the colors's components to the given scalar value.\n\t *\n\t * @param {number} scalar - The scalar value.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetScalar( scalar ) {\n\n\t\tthis.r = scalar;\n\t\tthis.g = scalar;\n\t\tthis.b = scalar;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from a hexadecimal value.\n\t *\n\t * @param {number} hex - The hexadecimal value.\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetHex( hex, colorSpace = SRGBColorSpace ) {\n\n\t\thex = Math.floor( hex );\n\n\t\tthis.r = ( hex >> 16 & 255 ) / 255;\n\t\tthis.g = ( hex >> 8 & 255 ) / 255;\n\t\tthis.b = ( hex & 255 ) / 255;\n\n\t\tColorManagement.colorSpaceToWorking( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from RGB values.\n\t *\n\t * @param {number} r - Red channel value between `0.0` and `1.0`.\n\t * @param {number} g - Green channel value between `0.0` and `1.0`.\n\t * @param {number} b - Blue channel value between `0.0` and `1.0`.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetRGB( r, g, b, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\tthis.r = r;\n\t\tthis.g = g;\n\t\tthis.b = b;\n\n\t\tColorManagement.colorSpaceToWorking( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from RGB values.\n\t *\n\t * @param {number} h - Hue value between `0.0` and `1.0`.\n\t * @param {number} s - Saturation value between `0.0` and `1.0`.\n\t * @param {number} l - Lightness value between `0.0` and `1.0`.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetHSL( h, s, l, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\t\th = euclideanModulo( h, 1 );\n\t\ts = clamp( s, 0, 1 );\n\t\tl = clamp( l, 0, 1 );\n\n\t\tif ( s === 0 ) {\n\n\t\t\tthis.r = this.g = this.b = l;\n\n\t\t} else {\n\n\t\t\tconst p = l <= 0.5 ? l * ( 1 + s ) : l + s - ( l * s );\n\t\t\tconst q = ( 2 * l ) - p;\n\n\t\t\tthis.r = hue2rgb( q, p, h + 1 / 3 );\n\t\t\tthis.g = hue2rgb( q, p, h );\n\t\t\tthis.b = hue2rgb( q, p, h - 1 / 3 );\n\n\t\t}\n\n\t\tColorManagement.colorSpaceToWorking( this, colorSpace );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from a CSS-style string. For example, `rgb(250, 0,0)`,\n\t * `rgb(100%, 0%, 0%)`, `hsl(0, 100%, 50%)`, `#ff0000`, `#f00`, or `red` ( or\n\t * any [X11 color name](https://en.wikipedia.org/wiki/X11_color_names#Color_name_chart) -\n\t * all 140 color names are supported).\n\t *\n\t * @param {string} style - Color as a CSS-style string.\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetStyle( style, colorSpace = SRGBColorSpace ) {\n\n\t\tfunction handleAlpha( string ) {\n\n\t\t\tif ( string === undefined ) return;\n\n\t\t\tif ( parseFloat( string ) < 1 ) {\n\n\t\t\t\twarn( 'Color: Alpha component of ' + style + ' will be ignored.' );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tlet m;\n\n\t\tif ( m = /^(\\w+)\\(([^\\)]*)\\)/.exec( style ) ) {\n\n\t\t\t// rgb / hsl\n\n\t\t\tlet color;\n\t\t\tconst name = m[ 1 ];\n\t\t\tconst components = m[ 2 ];\n\n\t\t\tswitch ( name ) {\n\n\t\t\t\tcase 'rgb':\n\t\t\t\tcase 'rgba':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(255,0,0) rgba(255,0,0,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setRGB(\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 1 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 2 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tMath.min( 255, parseInt( color[ 3 ], 10 ) ) / 255,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( color = /^\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*,\\s*(\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// rgb(100%,0%,0%) rgba(100%,0%,0%,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setRGB(\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 1 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 2 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tMath.min( 100, parseInt( color[ 3 ], 10 ) ) / 100,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'hsl':\n\t\t\t\tcase 'hsla':\n\n\t\t\t\t\tif ( color = /^\\s*(\\d*\\.?\\d+)\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*,\\s*(\\d*\\.?\\d+)\\%\\s*(?:,\\s*(\\d*\\.?\\d+)\\s*)?$/.exec( components ) ) {\n\n\t\t\t\t\t\t// hsl(120,50%,50%) hsla(120,50%,50%,0.5)\n\n\t\t\t\t\t\thandleAlpha( color[ 4 ] );\n\n\t\t\t\t\t\treturn this.setHSL(\n\t\t\t\t\t\t\tparseFloat( color[ 1 ] ) / 360,\n\t\t\t\t\t\t\tparseFloat( color[ 2 ] ) / 100,\n\t\t\t\t\t\t\tparseFloat( color[ 3 ] ) / 100,\n\t\t\t\t\t\t\tcolorSpace\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\twarn( 'Color: Unknown color model ' + style );\n\n\t\t\t}\n\n\t\t} else if ( m = /^\\#([A-Fa-f\\d]+)$/.exec( style ) ) {\n\n\t\t\t// hex color\n\n\t\t\tconst hex = m[ 1 ];\n\t\t\tconst size = hex.length;\n\n\t\t\tif ( size === 3 ) {\n\n\t\t\t\t// #ff0\n\t\t\t\treturn this.setRGB(\n\t\t\t\t\tparseInt( hex.charAt( 0 ), 16 ) / 15,\n\t\t\t\t\tparseInt( hex.charAt( 1 ), 16 ) / 15,\n\t\t\t\t\tparseInt( hex.charAt( 2 ), 16 ) / 15,\n\t\t\t\t\tcolorSpace\n\t\t\t\t);\n\n\t\t\t} else if ( size === 6 ) {\n\n\t\t\t\t// #ff0000\n\t\t\t\treturn this.setHex( parseInt( hex, 16 ), colorSpace );\n\n\t\t\t} else {\n\n\t\t\t\twarn( 'Color: Invalid hex color ' + style );\n\n\t\t\t}\n\n\t\t} else if ( style && style.length > 0 ) {\n\n\t\t\treturn this.setColorName( style, colorSpace );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets this color from a color name. Faster than {@link Color#setStyle} if\n\t * you don't need the other CSS-style formats.\n\t *\n\t * For convenience, the list of names is exposed in `Color.NAMES` as a hash.\n\t * ```js\n\t * Color.NAMES.aliceblue // returns 0xF0F8FF\n\t * ```\n\t *\n\t * @param {string} style - The color name.\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetColorName( style, colorSpace = SRGBColorSpace ) {\n\n\t\t// color keywords\n\t\tconst hex = _colorKeywords[ style.toLowerCase() ];\n\n\t\tif ( hex !== undefined ) {\n\n\t\t\t// red\n\t\t\tthis.setHex( hex, colorSpace );\n\n\t\t} else {\n\n\t\t\t// unknown color\n\t\t\twarn( 'Color: Unknown color ' + style );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new color with copied values from this instance.\n\t *\n\t * @return {Color} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.r, this.g, this.b );\n\n\t}\n\n\t/**\n\t * Copies the values of the given color to this instance.\n\t *\n\t * @param {Color} color - The color to copy.\n\t * @return {Color} A reference to this color.\n\t */\n\tcopy( color ) {\n\n\t\tthis.r = color.r;\n\t\tthis.g = color.g;\n\t\tthis.b = color.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the given color into this color, and then converts this color from\n\t * `SRGBColorSpace` to `LinearSRGBColorSpace`.\n\t *\n\t * @param {Color} color - The color to copy/convert.\n\t * @return {Color} A reference to this color.\n\t */\n\tcopySRGBToLinear( color ) {\n\n\t\tthis.r = SRGBToLinear( color.r );\n\t\tthis.g = SRGBToLinear( color.g );\n\t\tthis.b = SRGBToLinear( color.b );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the given color into this color, and then converts this color from\n\t * `LinearSRGBColorSpace` to `SRGBColorSpace`.\n\t *\n\t * @param {Color} color - The color to copy/convert.\n\t * @return {Color} A reference to this color.\n\t */\n\tcopyLinearToSRGB( color ) {\n\n\t\tthis.r = LinearToSRGB( color.r );\n\t\tthis.g = LinearToSRGB( color.g );\n\t\tthis.b = LinearToSRGB( color.b );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Converts this color from `SRGBColorSpace` to `LinearSRGBColorSpace`.\n\t *\n\t * @return {Color} A reference to this color.\n\t */\n\tconvertSRGBToLinear() {\n\n\t\tthis.copySRGBToLinear( this );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Converts this color from `LinearSRGBColorSpace` to `SRGBColorSpace`.\n\t *\n\t * @return {Color} A reference to this color.\n\t */\n\tconvertLinearToSRGB() {\n\n\t\tthis.copyLinearToSRGB( this );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the hexadecimal value of this color.\n\t *\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {number} The hexadecimal value.\n\t */\n\tgetHex( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\treturn Math.round( clamp( _color.r * 255, 0, 255 ) ) * 65536 + Math.round( clamp( _color.g * 255, 0, 255 ) ) * 256 + Math.round( clamp( _color.b * 255, 0, 255 ) );\n\n\t}\n\n\t/**\n\t * Returns the hexadecimal value of this color as a string (for example, 'FFFFFF').\n\t *\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {string} The hexadecimal value as a string.\n\t */\n\tgetHexString( colorSpace = SRGBColorSpace ) {\n\n\t\treturn ( '000000' + this.getHex( colorSpace ).toString( 16 ) ).slice( -6 );\n\n\t}\n\n\t/**\n\t * Converts the colors RGB values into the HSL format and stores them into the\n\t * given target object.\n\t *\n\t * @param {{h:number,s:number,l:number}} target - The target object that is used to store the method's result.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {{h:number,s:number,l:number}} The HSL representation of this color.\n\t */\n\tgetHSL( target, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\t// h,s,l ranges are in 0.0 - 1.0\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\tconst r = _color.r, g = _color.g, b = _color.b;\n\n\t\tconst max = Math.max( r, g, b );\n\t\tconst min = Math.min( r, g, b );\n\n\t\tlet hue, saturation;\n\t\tconst lightness = ( min + max ) / 2.0;\n\n\t\tif ( min === max ) {\n\n\t\t\thue = 0;\n\t\t\tsaturation = 0;\n\n\t\t} else {\n\n\t\t\tconst delta = max - min;\n\n\t\t\tsaturation = lightness <= 0.5 ? delta / ( max + min ) : delta / ( 2 - max - min );\n\n\t\t\tswitch ( max ) {\n\n\t\t\t\tcase r: hue = ( g - b ) / delta + ( g < b ? 6 : 0 ); break;\n\t\t\t\tcase g: hue = ( b - r ) / delta + 2; break;\n\t\t\t\tcase b: hue = ( r - g ) / delta + 4; break;\n\n\t\t\t}\n\n\t\t\thue /= 6;\n\n\t\t}\n\n\t\ttarget.h = hue;\n\t\ttarget.s = saturation;\n\t\ttarget.l = lightness;\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the RGB values of this color and stores them into the given target object.\n\t *\n\t * @param {Color} target - The target color that is used to store the method's result.\n\t * @param {string} [colorSpace=ColorManagement.workingColorSpace] - The color space.\n\t * @return {Color} The RGB representation of this color.\n\t */\n\tgetRGB( target, colorSpace = ColorManagement.workingColorSpace ) {\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\ttarget.r = _color.r;\n\t\ttarget.g = _color.g;\n\t\ttarget.b = _color.b;\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the value of this color as a CSS style string. Example: `rgb(255,0,0)`.\n\t *\n\t * @param {string} [colorSpace=SRGBColorSpace] - The color space.\n\t * @return {string} The CSS representation of this color.\n\t */\n\tgetStyle( colorSpace = SRGBColorSpace ) {\n\n\t\tColorManagement.workingToColorSpace( _color.copy( this ), colorSpace );\n\n\t\tconst r = _color.r, g = _color.g, b = _color.b;\n\n\t\tif ( colorSpace !== SRGBColorSpace ) {\n\n\t\t\t// Requires CSS Color Module Level 4 (https://www.w3.org/TR/css-color-4/).\n\t\t\treturn `color(${ colorSpace } ${ r.toFixed( 3 ) } ${ g.toFixed( 3 ) } ${ b.toFixed( 3 ) })`;\n\n\t\t}\n\n\t\treturn `rgb(${ Math.round( r * 255 ) },${ Math.round( g * 255 ) },${ Math.round( b * 255 ) })`;\n\n\t}\n\n\t/**\n\t * Adds the given HSL values to this color's values.\n\t * Internally, this converts the color's RGB values to HSL, adds HSL\n\t * and then converts the color back to RGB.\n\t *\n\t * @param {number} h - Hue value between `0.0` and `1.0`.\n\t * @param {number} s - Saturation value between `0.0` and `1.0`.\n\t * @param {number} l - Lightness value between `0.0` and `1.0`.\n\t * @return {Color} A reference to this color.\n\t */\n\toffsetHSL( h, s, l ) {\n\n\t\tthis.getHSL( _hslA );\n\n\t\treturn this.setHSL( _hslA.h + h, _hslA.s + s, _hslA.l + l );\n\n\t}\n\n\t/**\n\t * Adds the RGB values of the given color to the RGB values of this color.\n\t *\n\t * @param {Color} color - The color to add.\n\t * @return {Color} A reference to this color.\n\t */\n\tadd( color ) {\n\n\t\tthis.r += color.r;\n\t\tthis.g += color.g;\n\t\tthis.b += color.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the RGB values of the given colors and stores the result in this instance.\n\t *\n\t * @param {Color} color1 - The first color.\n\t * @param {Color} color2 - The second color.\n\t * @return {Color} A reference to this color.\n\t */\n\taddColors( color1, color2 ) {\n\n\t\tthis.r = color1.r + color2.r;\n\t\tthis.g = color1.g + color2.g;\n\t\tthis.b = color1.b + color2.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given scalar value to the RGB values of this color.\n\t *\n\t * @param {number} s - The scalar to add.\n\t * @return {Color} A reference to this color.\n\t */\n\taddScalar( s ) {\n\n\t\tthis.r += s;\n\t\tthis.g += s;\n\t\tthis.b += s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Subtracts the RGB values of the given color from the RGB values of this color.\n\t *\n\t * @param {Color} color - The color to subtract.\n\t * @return {Color} A reference to this color.\n\t */\n\tsub( color ) {\n\n\t\tthis.r = Math.max( 0, this.r - color.r );\n\t\tthis.g = Math.max( 0, this.g - color.g );\n\t\tthis.b = Math.max( 0, this.b - color.b );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the RGB values of the given color with the RGB values of this color.\n\t *\n\t * @param {Color} color - The color to multiply.\n\t * @return {Color} A reference to this color.\n\t */\n\tmultiply( color ) {\n\n\t\tthis.r *= color.r;\n\t\tthis.g *= color.g;\n\t\tthis.b *= color.b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Multiplies the given scalar value with the RGB values of this color.\n\t *\n\t * @param {number} s - The scalar to multiply.\n\t * @return {Color} A reference to this color.\n\t */\n\tmultiplyScalar( s ) {\n\n\t\tthis.r *= s;\n\t\tthis.g *= s;\n\t\tthis.b *= s;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates this color's RGB values toward the RGB values of the\n\t * given color. The alpha argument can be thought of as the ratio between\n\t * the two colors, where `0.0` is this color and `1.0` is the first argument.\n\t *\n\t * @param {Color} color - The color to converge on.\n\t * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`.\n\t * @return {Color} A reference to this color.\n\t */\n\tlerp( color, alpha ) {\n\n\t\tthis.r += ( color.r - this.r ) * alpha;\n\t\tthis.g += ( color.g - this.g ) * alpha;\n\t\tthis.b += ( color.b - this.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates between the given colors and stores the result in this instance.\n\t * The alpha argument can be thought of as the ratio between the two colors, where `0.0`\n\t * is the first and `1.0` is the second color.\n\t *\n\t * @param {Color} color1 - The first color.\n\t * @param {Color} color2 - The second color.\n\t * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`.\n\t * @return {Color} A reference to this color.\n\t */\n\tlerpColors( color1, color2, alpha ) {\n\n\t\tthis.r = color1.r + ( color2.r - color1.r ) * alpha;\n\t\tthis.g = color1.g + ( color2.g - color1.g ) * alpha;\n\t\tthis.b = color1.b + ( color2.b - color1.b ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linearly interpolates this color's HSL values toward the HSL values of the\n\t * given color. It differs from {@link Color#lerp} by not interpolating straight\n\t * from one color to the other, but instead going through all the hues in between\n\t * those two colors. The alpha argument can be thought of as the ratio between\n\t * the two colors, where 0.0 is this color and 1.0 is the first argument.\n\t *\n\t * @param {Color} color - The color to converge on.\n\t * @param {number} alpha - The interpolation factor in the closed interval `[0,1]`.\n\t * @return {Color} A reference to this color.\n\t */\n\tlerpHSL( color, alpha ) {\n\n\t\tthis.getHSL( _hslA );\n\t\tcolor.getHSL( _hslB );\n\n\t\tconst h = lerp( _hslA.h, _hslB.h, alpha );\n\t\tconst s = lerp( _hslA.s, _hslB.s, alpha );\n\t\tconst l = lerp( _hslA.l, _hslB.l, alpha );\n\n\t\tthis.setHSL( h, s, l );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the color's RGB components from the given 3D vector.\n\t *\n\t * @param {Vector3} v - The vector to set.\n\t * @return {Color} A reference to this color.\n\t */\n\tsetFromVector3( v ) {\n\n\t\tthis.r = v.x;\n\t\tthis.g = v.y;\n\t\tthis.b = v.z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Transforms this color with the given 3x3 matrix.\n\t *\n\t * @param {Matrix3} m - The matrix.\n\t * @return {Color} A reference to this color.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tconst r = this.r, g = this.g, b = this.b;\n\t\tconst e = m.elements;\n\n\t\tthis.r = e[ 0 ] * r + e[ 3 ] * g + e[ 6 ] * b;\n\t\tthis.g = e[ 1 ] * r + e[ 4 ] * g + e[ 7 ] * b;\n\t\tthis.b = e[ 2 ] * r + e[ 5 ] * g + e[ 8 ] * b;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this color is equal with the given one.\n\t *\n\t * @param {Color} c - The color to test for equality.\n\t * @return {boolean} Whether this bounding color is equal with the given one.\n\t */\n\tequals( c ) {\n\n\t\treturn ( c.r === this.r ) && ( c.g === this.g ) && ( c.b === this.b );\n\n\t}\n\n\t/**\n\t * Sets this color's RGB components from the given array.\n\t *\n\t * @param {Array<number>} array - An array holding the RGB values.\n\t * @param {number} [offset=0] - The offset into the array.\n\t * @return {Color} A reference to this color.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.r = array[ offset ];\n\t\tthis.g = array[ offset + 1 ];\n\t\tthis.b = array[ offset + 2 ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Writes the RGB components of this color to the given array. If no array is provided,\n\t * the method returns a new instance.\n\t *\n\t * @param {Array<number>} [array=[]] - The target array holding the color components.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Array<number>} The color components.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.r;\n\t\tarray[ offset + 1 ] = this.g;\n\t\tarray[ offset + 2 ] = this.b;\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Sets the components of this color from the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute holding color data.\n\t * @param {number} index - The index into the attribute.\n\t * @return {Color} A reference to this color.\n\t */\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.r = attribute.getX( index );\n\t\tthis.g = attribute.getY( index );\n\t\tthis.b = attribute.getZ( index );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This methods defines the serialization result of this class. Returns the color\n\t * as a hexadecimal value.\n\t *\n\t * @return {number} The hexadecimal value.\n\t */\n\ttoJSON() {\n\n\t\treturn this.getHex();\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.r;\n\t\tyield this.g;\n\t\tyield this.b;\n\n\t}\n\n}\n\nconst _color = /*@__PURE__*/ new Color();\n\n/**\n * A dictionary with X11 color names.\n *\n * Note that multiple words such as Dark Orange become the string 'darkorange'.\n *\n * @static\n * @type {Object}\n */\nColor.NAMES = _colorKeywords;\n\nlet _materialId = 0;\n\n/**\n * Abstract base class for materials.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * @abstract\n * @augments EventDispatcher\n */\nclass Material extends EventDispatcher {\n\n\t/**\n\t * Constructs a new material.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMaterial = true;\n\n\t\t/**\n\t\t * The ID of the material.\n\t\t *\n\t\t * @name Material#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _materialId ++ } );\n\n\t\t/**\n\t\t * The UUID of the material.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the material.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'Material';\n\n\t\t/**\n\t\t * Defines the blending type of the material.\n\t\t *\n\t\t * It must be set to `CustomBlending` if custom blending properties like\n\t\t * {@link Material#blendSrc}, {@link Material#blendDst} or {@link Material#blendEquation}\n\t\t * should have any effect.\n\t\t *\n\t\t * @type {(NoBlending|NormalBlending|AdditiveBlending|SubtractiveBlending|MultiplyBlending|CustomBlending)}\n\t\t * @default NormalBlending\n\t\t */\n\t\tthis.blending = NormalBlending;\n\n\t\t/**\n\t\t * Defines which side of faces will be rendered - front, back or both.\n\t\t *\n\t\t * @type {(FrontSide|BackSide|DoubleSide)}\n\t\t * @default FrontSide\n\t\t */\n\t\tthis.side = FrontSide;\n\n\t\t/**\n\t\t * If set to `true`, vertex colors should be used.\n\t\t *\n\t\t * The engine supports RGB and RGBA vertex colors depending on whether a three (RGB) or\n\t\t * four (RGBA) component color buffer attribute is used.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.vertexColors = false;\n\n\t\t/**\n\t\t * Defines how transparent the material is.\n\t\t * A value of `0.0` indicates fully transparent, `1.0` is fully opaque.\n\t\t *\n\t\t * If the {@link Material#transparent} is not set to `true`,\n\t\t * the material will remain fully opaque and this value will only affect its color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.opacity = 1;\n\n\t\t/**\n\t\t * Defines whether this material is transparent. This has an effect on\n\t\t * rendering as transparent objects need special treatment and are rendered\n\t\t * after non-transparent objects.\n\t\t *\n\t\t * When set to true, the extent to which the material is transparent is\n\t\t * controlled by {@link Material#opacity}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.transparent = false;\n\n\t\t/**\n\t\t * Enables alpha hashed transparency, an alternative to {@link Material#transparent} or\n\t\t * {@link Material#alphaTest}. The material will not be rendered if opacity is lower than\n\t\t * a random threshold. Randomization introduces some grain or noise, but approximates alpha\n\t\t * blending without the associated problems of sorting. Using TAA can reduce the resulting noise.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.alphaHash = false;\n\n\t\t/**\n\t\t * Defines the blending source factor.\n\t\t *\n\t\t * @type {(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default SrcAlphaFactor\n\t\t */\n\t\tthis.blendSrc = SrcAlphaFactor;\n\n\t\t/**\n\t\t * Defines the blending destination factor.\n\t\t *\n\t\t * @type {(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default OneMinusSrcAlphaFactor\n\t\t */\n\t\tthis.blendDst = OneMinusSrcAlphaFactor;\n\n\t\t/**\n\t\t * Defines the blending equation.\n\t\t *\n\t\t * @type {(AddEquation|SubtractEquation|ReverseSubtractEquation|MinEquation|MaxEquation)}\n\t\t * @default AddEquation\n\t\t */\n\t\tthis.blendEquation = AddEquation;\n\n\t\t/**\n\t\t * Defines the blending source alpha factor.\n\t\t *\n\t\t * @type {?(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default null\n\t\t */\n\t\tthis.blendSrcAlpha = null;\n\n\t\t/**\n\t\t * Defines the blending destination alpha factor.\n\t\t *\n\t\t * @type {?(ZeroFactor|OneFactor|SrcColorFactor|OneMinusSrcColorFactor|SrcAlphaFactor|OneMinusSrcAlphaFactor|DstAlphaFactor|OneMinusDstAlphaFactor|DstColorFactor|OneMinusDstColorFactor|SrcAlphaSaturateFactor|ConstantColorFactor|OneMinusConstantColorFactor|ConstantAlphaFactor|OneMinusConstantAlphaFactor)}\n\t\t * @default null\n\t\t */\n\t\tthis.blendDstAlpha = null;\n\n\t\t/**\n\t\t * Defines the blending equation of the alpha channel.\n\t\t *\n\t\t * @type {?(AddEquation|SubtractEquation|ReverseSubtractEquation|MinEquation|MaxEquation)}\n\t\t * @default null\n\t\t */\n\t\tthis.blendEquationAlpha = null;\n\n\t\t/**\n\t\t * Represents the RGB values of the constant blend color.\n\t\t *\n\t\t * This property has only an effect when using custom blending with `ConstantColor` or `OneMinusConstantColor`.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.blendColor = new Color( 0, 0, 0 );\n\n\t\t/**\n\t\t * Represents the alpha value of the constant blend color.\n\t\t *\n\t\t * This property has only an effect when using custom blending with `ConstantAlpha` or `OneMinusConstantAlpha`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.blendAlpha = 0;\n\n\t\t/**\n\t\t * Defines the depth function.\n\t\t *\n\t\t * @type {(NeverDepth|AlwaysDepth|LessDepth|LessEqualDepth|EqualDepth|GreaterEqualDepth|GreaterDepth|NotEqualDepth)}\n\t\t * @default LessEqualDepth\n\t\t */\n\t\tthis.depthFunc = LessEqualDepth;\n\n\t\t/**\n\t\t * Whether to have depth test enabled when rendering this material.\n\t\t * When the depth test is disabled, the depth write will also be implicitly disabled.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depthTest = true;\n\n\t\t/**\n\t\t * Whether rendering this material has any effect on the depth buffer.\n\t\t *\n\t\t * When drawing 2D overlays it can be useful to disable the depth writing in\n\t\t * order to layer several things together without creating z-index artifacts.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depthWrite = true;\n\n\t\t/**\n\t\t * The bit mask to use when writing to the stencil buffer.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0xff\n\t\t */\n\t\tthis.stencilWriteMask = 0xff;\n\n\t\t/**\n\t\t * The stencil comparison function to use.\n\t\t *\n\t\t * @type {NeverStencilFunc|LessStencilFunc|EqualStencilFunc|LessEqualStencilFunc|GreaterStencilFunc|NotEqualStencilFunc|GreaterEqualStencilFunc|AlwaysStencilFunc}\n\t\t * @default AlwaysStencilFunc\n\t\t */\n\t\tthis.stencilFunc = AlwaysStencilFunc;\n\n\t\t/**\n\t\t * The value to use when performing stencil comparisons or stencil operations.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.stencilRef = 0;\n\n\t\t/**\n\t\t * The bit mask to use when comparing against the stencil buffer.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0xff\n\t\t */\n\t\tthis.stencilFuncMask = 0xff;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns `false`.\n\t\t *\n\t\t * @type {ZeroStencilOp|KeepStencilOp|ReplaceStencilOp|IncrementStencilOp|DecrementStencilOp|IncrementWrapStencilOp|DecrementWrapStencilOp|InvertStencilOp}\n\t\t * @default KeepStencilOp\n\t\t */\n\t\tthis.stencilFail = KeepStencilOp;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns\n\t\t * `true` but the depth test fails.\n\t\t *\n\t\t * @type {ZeroStencilOp|KeepStencilOp|ReplaceStencilOp|IncrementStencilOp|DecrementStencilOp|IncrementWrapStencilOp|DecrementWrapStencilOp|InvertStencilOp}\n\t\t * @default KeepStencilOp\n\t\t */\n\t\tthis.stencilZFail = KeepStencilOp;\n\n\t\t/**\n\t\t * Which stencil operation to perform when the comparison function returns\n\t\t * `true` and the depth test passes.\n\t\t *\n\t\t * @type {ZeroStencilOp|KeepStencilOp|ReplaceStencilOp|IncrementStencilOp|DecrementStencilOp|IncrementWrapStencilOp|DecrementWrapStencilOp|InvertStencilOp}\n\t\t * @default KeepStencilOp\n\t\t */\n\t\tthis.stencilZPass = KeepStencilOp;\n\n\t\t/**\n\t\t * Whether stencil operations are performed against the stencil buffer. In\n\t\t * order to perform writes or comparisons against the stencil buffer this\n\t\t * value must be `true`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.stencilWrite = false;\n\n\t\t/**\n\t\t * User-defined clipping planes specified as THREE.Plane objects in world\n\t\t * space. These planes apply to the objects this material is attached to.\n\t\t * Points in space whose signed distance to the plane is negative are clipped\n\t\t * (not rendered). This requires {@link WebGLRenderer#localClippingEnabled} to\n\t\t * be `true`.\n\t\t *\n\t\t * @type {?Array<Plane>}\n\t\t * @default null\n\t\t */\n\t\tthis.clippingPlanes = null;\n\n\t\t/**\n\t\t * Changes the behavior of clipping planes so that only their intersection is\n\t\t * clipped, rather than their union.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clipIntersection = false;\n\n\t\t/**\n\t\t * Defines whether to clip shadows according to the clipping planes specified\n\t\t * on this material.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clipShadows = false;\n\n\t\t/**\n\t\t * Defines which side of faces cast shadows. If `null`, the side casting shadows\n\t\t * is determined as follows:\n\t\t *\n\t\t * - When {@link Material#side} is set to `FrontSide`, the back side cast shadows.\n\t\t * - When {@link Material#side} is set to `BackSide`, the front side cast shadows.\n\t\t * - When {@link Material#side} is set to `DoubleSide`, both sides cast shadows.\n\t\t *\n\t\t * @type {?(FrontSide|BackSide|DoubleSide)}\n\t\t * @default null\n\t\t */\n\t\tthis.shadowSide = null;\n\n\t\t/**\n\t\t * Whether to render the material's color.\n\t\t *\n\t\t * This can be used in conjunction with {@link Object3D#renderOder} to create invisible\n\t\t * objects that occlude other objects.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.colorWrite = true;\n\n\t\t/**\n\t\t * Override the renderer's default precision for this material.\n\t\t *\n\t\t * @type {?('highp'|'mediump'|'lowp')}\n\t\t * @default null\n\t\t */\n\t\tthis.precision = null;\n\n\t\t/**\n\t\t * Whether to use polygon offset or not. When enabled, each fragment's depth value will\n\t\t * be offset after it is interpolated from the depth values of the appropriate vertices.\n\t\t * The offset is added before the depth test is performed and before the value is written\n\t\t * into the depth buffer.\n\t\t *\n\t\t * Can be useful for rendering hidden-line images, for applying decals to surfaces, and for\n\t\t * rendering solids with highlighted edges.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.polygonOffset = false;\n\n\t\t/**\n\t\t * Specifies a scale factor that is used to create a variable depth offset for each polygon.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.polygonOffsetFactor = 0;\n\n\t\t/**\n\t\t * Is multiplied by an implementation-specific value to create a constant depth offset.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.polygonOffsetUnits = 0;\n\n\t\t/**\n\t\t * Whether to apply dithering to the color to remove the appearance of banding.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.dithering = false;\n\n\t\t/**\n\t\t * Whether alpha to coverage should be enabled or not. Can only be used with MSAA-enabled contexts\n\t\t * (meaning when the renderer was created with *antialias* parameter set to `true`). Enabling this\n\t\t * will smooth aliasing on clip plane edges and alphaTest-clipped edges.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.alphaToCoverage = false;\n\n\t\t/**\n\t\t * Whether to premultiply the alpha (transparency) value.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.premultipliedAlpha = false;\n\n\t\t/**\n\t\t * Whether double-sided, transparent objects should be rendered with a single pass or not.\n\t\t *\n\t\t * The engine renders double-sided, transparent objects with two draw calls (back faces first,\n\t\t * then front faces) to mitigate transparency artifacts. There are scenarios however where this\n\t\t * approach produces no quality gains but still doubles draw calls e.g. when rendering flat\n\t\t * vegetation like grass sprites. In these cases, set the `forceSinglePass` flag to `true` to\n\t\t * disable the two pass rendering to avoid performance issues.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.forceSinglePass = false;\n\n\t\t/**\n\t\t * Whether it's possible to override the material with {@link Scene#overrideMaterial} or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.allowOverride = true;\n\n\t\t/**\n\t\t * Defines whether 3D objects using this material are visible.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.visible = true;\n\n\t\t/**\n\t\t * Defines whether this material is tone mapped according to the renderer's tone mapping setting.\n\t\t *\n\t\t * It is ignored when rendering to a render target or using post processing or when using\n\t\t * `WebGPURenderer`. In all these cases, all materials are honored by tone mapping.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.toneMapped = true;\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the Material. It\n\t\t * should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t\t/**\n\t\t * This starts at `0` and counts how many times {@link Material#needsUpdate} is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\n\t\tthis._alphaTest = 0;\n\n\t}\n\n\t/**\n\t * Sets the alpha value to be used when running an alpha test. The material\n\t * will not be rendered if the opacity is lower than this value.\n\t *\n\t * @type {number}\n\t * @readonly\n\t * @default 0\n\t */\n\tget alphaTest() {\n\n\t\treturn this._alphaTest;\n\n\t}\n\n\tset alphaTest( value ) {\n\n\t\tif ( this._alphaTest > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._alphaTest = value;\n\n\t}\n\n\t/**\n\t * An optional callback that is executed immediately before the material is used to render a 3D object.\n\t *\n\t * This method can only be used when rendering with {@link WebGLRenderer}.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {Scene} scene - The scene.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Object} group - The geometry group data.\n\t */\n\tonBeforeRender( /* renderer, scene, camera, geometry, object, group */ ) {}\n\n\t/**\n\t * An optional callback that is executed immediately before the shader\n\t * program is compiled. This function is called with the shader source code\n\t * as a parameter. Useful for the modification of built-in materials.\n\t *\n\t * This method can only be used when rendering with {@link WebGLRenderer}. The\n\t * recommended approach when customizing materials is to use `WebGPURenderer` with the new\n\t * Node Material system and [TSL](https://github.com/mrdoob/three.js/wiki/Three.js-Shading-Language).\n\t *\n\t * @param {{vertexShader:string,fragmentShader:string,uniforms:Object}} shaderobject - The object holds the uniforms and the vertex and fragment shader source.\n\t * @param {WebGLRenderer} renderer - A reference to the renderer.\n\t */\n\tonBeforeCompile( /* shaderobject, renderer */ ) {}\n\n\t/**\n\t * In case {@link Material#onBeforeCompile} is used, this callback can be used to identify\n\t * values of settings used in `onBeforeCompile()`, so three.js can reuse a cached\n\t * shader or recompile the shader for this material as needed.\n\t *\n\t * This method can only be used when rendering with {@link WebGLRenderer}.\n\t *\n\t * @return {string} The custom program cache key.\n\t */\n\tcustomProgramCacheKey() {\n\n\t\treturn this.onBeforeCompile.toString();\n\n\t}\n\n\t/**\n\t * This method can be used to set default values from parameter objects.\n\t * It is a generic implementation so it can be used with different types\n\t * of materials.\n\t *\n\t * @param {Object} [values] - The material values to set.\n\t */\n\tsetValues( values ) {\n\n\t\tif ( values === undefined ) return;\n\n\t\tfor ( const key in values ) {\n\n\t\t\tconst newValue = values[ key ];\n\n\t\t\tif ( newValue === undefined ) {\n\n\t\t\t\twarn( `Material: parameter '${ key }' has value of undefined.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValue = this[ key ];\n\n\t\t\tif ( currentValue === undefined ) {\n\n\t\t\t\twarn( `Material: '${ key }' is not a property of THREE.${ this.type }.` );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( currentValue && currentValue.isColor ) {\n\n\t\t\t\tcurrentValue.set( newValue );\n\n\t\t\t} else if ( ( currentValue && currentValue.isVector3 ) && ( newValue && newValue.isVector3 ) ) {\n\n\t\t\t\tcurrentValue.copy( newValue );\n\n\t\t\t} else {\n\n\t\t\t\tthis[ key ] = newValue;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the material into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized material.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON( meta ) {\n\n\t\tconst isRootObject = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( isRootObject ) {\n\n\t\t\tmeta = {\n\t\t\t\ttextures: {},\n\t\t\t\timages: {}\n\t\t\t};\n\n\t\t}\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Material',\n\t\t\t\tgenerator: 'Material.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard Material serialization\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\n\t\tif ( this.color && this.color.isColor ) data.color = this.color.getHex();\n\n\t\tif ( this.roughness !== undefined ) data.roughness = this.roughness;\n\t\tif ( this.metalness !== undefined ) data.metalness = this.metalness;\n\n\t\tif ( this.sheen !== undefined ) data.sheen = this.sheen;\n\t\tif ( this.sheenColor && this.sheenColor.isColor ) data.sheenColor = this.sheenColor.getHex();\n\t\tif ( this.sheenRoughness !== undefined ) data.sheenRoughness = this.sheenRoughness;\n\t\tif ( this.emissive && this.emissive.isColor ) data.emissive = this.emissive.getHex();\n\t\tif ( this.emissiveIntensity !== undefined && this.emissiveIntensity !== 1 ) data.emissiveIntensity = this.emissiveIntensity;\n\n\t\tif ( this.specular && this.specular.isColor ) data.specular = this.specular.getHex();\n\t\tif ( this.specularIntensity !== undefined ) data.specularIntensity = this.specularIntensity;\n\t\tif ( this.specularColor && this.specularColor.isColor ) data.specularColor = this.specularColor.getHex();\n\t\tif ( this.shininess !== undefined ) data.shininess = this.shininess;\n\t\tif ( this.clearcoat !== undefined ) data.clearcoat = this.clearcoat;\n\t\tif ( this.clearcoatRoughness !== undefined ) data.clearcoatRoughness = this.clearcoatRoughness;\n\n\t\tif ( this.clearcoatMap && this.clearcoatMap.isTexture ) {\n\n\t\t\tdata.clearcoatMap = this.clearcoatMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatRoughnessMap && this.clearcoatRoughnessMap.isTexture ) {\n\n\t\t\tdata.clearcoatRoughnessMap = this.clearcoatRoughnessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.clearcoatNormalMap && this.clearcoatNormalMap.isTexture ) {\n\n\t\t\tdata.clearcoatNormalMap = this.clearcoatNormalMap.toJSON( meta ).uuid;\n\t\t\tdata.clearcoatNormalScale = this.clearcoatNormalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.sheenColorMap && this.sheenColorMap.isTexture ) {\n\n\t\t\tdata.sheenColorMap = this.sheenColorMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.sheenRoughnessMap && this.sheenRoughnessMap.isTexture ) {\n\n\t\t\tdata.sheenRoughnessMap = this.sheenRoughnessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.dispersion !== undefined ) data.dispersion = this.dispersion;\n\n\t\tif ( this.iridescence !== undefined ) data.iridescence = this.iridescence;\n\t\tif ( this.iridescenceIOR !== undefined ) data.iridescenceIOR = this.iridescenceIOR;\n\t\tif ( this.iridescenceThicknessRange !== undefined ) data.iridescenceThicknessRange = this.iridescenceThicknessRange;\n\n\t\tif ( this.iridescenceMap && this.iridescenceMap.isTexture ) {\n\n\t\t\tdata.iridescenceMap = this.iridescenceMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.iridescenceThicknessMap && this.iridescenceThicknessMap.isTexture ) {\n\n\t\t\tdata.iridescenceThicknessMap = this.iridescenceThicknessMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.anisotropy !== undefined ) data.anisotropy = this.anisotropy;\n\t\tif ( this.anisotropyRotation !== undefined ) data.anisotropyRotation = this.anisotropyRotation;\n\n\t\tif ( this.anisotropyMap && this.anisotropyMap.isTexture ) {\n\n\t\t\tdata.anisotropyMap = this.anisotropyMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.map && this.map.isTexture ) data.map = this.map.toJSON( meta ).uuid;\n\t\tif ( this.matcap && this.matcap.isTexture ) data.matcap = this.matcap.toJSON( meta ).uuid;\n\t\tif ( this.alphaMap && this.alphaMap.isTexture ) data.alphaMap = this.alphaMap.toJSON( meta ).uuid;\n\n\t\tif ( this.lightMap && this.lightMap.isTexture ) {\n\n\t\t\tdata.lightMap = this.lightMap.toJSON( meta ).uuid;\n\t\t\tdata.lightMapIntensity = this.lightMapIntensity;\n\n\t\t}\n\n\t\tif ( this.aoMap && this.aoMap.isTexture ) {\n\n\t\t\tdata.aoMap = this.aoMap.toJSON( meta ).uuid;\n\t\t\tdata.aoMapIntensity = this.aoMapIntensity;\n\n\t\t}\n\n\t\tif ( this.bumpMap && this.bumpMap.isTexture ) {\n\n\t\t\tdata.bumpMap = this.bumpMap.toJSON( meta ).uuid;\n\t\t\tdata.bumpScale = this.bumpScale;\n\n\t\t}\n\n\t\tif ( this.normalMap && this.normalMap.isTexture ) {\n\n\t\t\tdata.normalMap = this.normalMap.toJSON( meta ).uuid;\n\t\t\tdata.normalMapType = this.normalMapType;\n\t\t\tdata.normalScale = this.normalScale.toArray();\n\n\t\t}\n\n\t\tif ( this.displacementMap && this.displacementMap.isTexture ) {\n\n\t\t\tdata.displacementMap = this.displacementMap.toJSON( meta ).uuid;\n\t\t\tdata.displacementScale = this.displacementScale;\n\t\t\tdata.displacementBias = this.displacementBias;\n\n\t\t}\n\n\t\tif ( this.roughnessMap && this.roughnessMap.isTexture ) data.roughnessMap = this.roughnessMap.toJSON( meta ).uuid;\n\t\tif ( this.metalnessMap && this.metalnessMap.isTexture ) data.metalnessMap = this.metalnessMap.toJSON( meta ).uuid;\n\n\t\tif ( this.emissiveMap && this.emissiveMap.isTexture ) data.emissiveMap = this.emissiveMap.toJSON( meta ).uuid;\n\t\tif ( this.specularMap && this.specularMap.isTexture ) data.specularMap = this.specularMap.toJSON( meta ).uuid;\n\t\tif ( this.specularIntensityMap && this.specularIntensityMap.isTexture ) data.specularIntensityMap = this.specularIntensityMap.toJSON( meta ).uuid;\n\t\tif ( this.specularColorMap && this.specularColorMap.isTexture ) data.specularColorMap = this.specularColorMap.toJSON( meta ).uuid;\n\n\t\tif ( this.envMap && this.envMap.isTexture ) {\n\n\t\t\tdata.envMap = this.envMap.toJSON( meta ).uuid;\n\n\t\t\tif ( this.combine !== undefined ) data.combine = this.combine;\n\n\t\t}\n\n\t\tif ( this.envMapRotation !== undefined ) data.envMapRotation = this.envMapRotation.toArray();\n\t\tif ( this.envMapIntensity !== undefined ) data.envMapIntensity = this.envMapIntensity;\n\t\tif ( this.reflectivity !== undefined ) data.reflectivity = this.reflectivity;\n\t\tif ( this.refractionRatio !== undefined ) data.refractionRatio = this.refractionRatio;\n\n\t\tif ( this.gradientMap && this.gradientMap.isTexture ) {\n\n\t\t\tdata.gradientMap = this.gradientMap.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\tif ( this.transmission !== undefined ) data.transmission = this.transmission;\n\t\tif ( this.transmissionMap && this.transmissionMap.isTexture ) data.transmissionMap = this.transmissionMap.toJSON( meta ).uuid;\n\t\tif ( this.thickness !== undefined ) data.thickness = this.thickness;\n\t\tif ( this.thicknessMap && this.thicknessMap.isTexture ) data.thicknessMap = this.thicknessMap.toJSON( meta ).uuid;\n\t\tif ( this.attenuationDistance !== undefined && this.attenuationDistance !== Infinity ) data.attenuationDistance = this.attenuationDistance;\n\t\tif ( this.attenuationColor !== undefined ) data.attenuationColor = this.attenuationColor.getHex();\n\n\t\tif ( this.size !== undefined ) data.size = this.size;\n\t\tif ( this.shadowSide !== null ) data.shadowSide = this.shadowSide;\n\t\tif ( this.sizeAttenuation !== undefined ) data.sizeAttenuation = this.sizeAttenuation;\n\n\t\tif ( this.blending !== NormalBlending ) data.blending = this.blending;\n\t\tif ( this.side !== FrontSide ) data.side = this.side;\n\t\tif ( this.vertexColors === true ) data.vertexColors = true;\n\n\t\tif ( this.opacity < 1 ) data.opacity = this.opacity;\n\t\tif ( this.transparent === true ) data.transparent = true;\n\n\t\tif ( this.blendSrc !== SrcAlphaFactor ) data.blendSrc = this.blendSrc;\n\t\tif ( this.blendDst !== OneMinusSrcAlphaFactor ) data.blendDst = this.blendDst;\n\t\tif ( this.blendEquation !== AddEquation ) data.blendEquation = this.blendEquation;\n\t\tif ( this.blendSrcAlpha !== null ) data.blendSrcAlpha = this.blendSrcAlpha;\n\t\tif ( this.blendDstAlpha !== null ) data.blendDstAlpha = this.blendDstAlpha;\n\t\tif ( this.blendEquationAlpha !== null ) data.blendEquationAlpha = this.blendEquationAlpha;\n\t\tif ( this.blendColor && this.blendColor.isColor ) data.blendColor = this.blendColor.getHex();\n\t\tif ( this.blendAlpha !== 0 ) data.blendAlpha = this.blendAlpha;\n\n\t\tif ( this.depthFunc !== LessEqualDepth ) data.depthFunc = this.depthFunc;\n\t\tif ( this.depthTest === false ) data.depthTest = this.depthTest;\n\t\tif ( this.depthWrite === false ) data.depthWrite = this.depthWrite;\n\t\tif ( this.colorWrite === false ) data.colorWrite = this.colorWrite;\n\n\t\tif ( this.stencilWriteMask !== 0xff ) data.stencilWriteMask = this.stencilWriteMask;\n\t\tif ( this.stencilFunc !== AlwaysStencilFunc ) data.stencilFunc = this.stencilFunc;\n\t\tif ( this.stencilRef !== 0 ) data.stencilRef = this.stencilRef;\n\t\tif ( this.stencilFuncMask !== 0xff ) data.stencilFuncMask = this.stencilFuncMask;\n\t\tif ( this.stencilFail !== KeepStencilOp ) data.stencilFail = this.stencilFail;\n\t\tif ( this.stencilZFail !== KeepStencilOp ) data.stencilZFail = this.stencilZFail;\n\t\tif ( this.stencilZPass !== KeepStencilOp ) data.stencilZPass = this.stencilZPass;\n\t\tif ( this.stencilWrite === true ) data.stencilWrite = this.stencilWrite;\n\n\t\t// rotation (SpriteMaterial)\n\t\tif ( this.rotation !== undefined && this.rotation !== 0 ) data.rotation = this.rotation;\n\n\t\tif ( this.polygonOffset === true ) data.polygonOffset = true;\n\t\tif ( this.polygonOffsetFactor !== 0 ) data.polygonOffsetFactor = this.polygonOffsetFactor;\n\t\tif ( this.polygonOffsetUnits !== 0 ) data.polygonOffsetUnits = this.polygonOffsetUnits;\n\n\t\tif ( this.linewidth !== undefined && this.linewidth !== 1 ) data.linewidth = this.linewidth;\n\t\tif ( this.dashSize !== undefined ) data.dashSize = this.dashSize;\n\t\tif ( this.gapSize !== undefined ) data.gapSize = this.gapSize;\n\t\tif ( this.scale !== undefined ) data.scale = this.scale;\n\n\t\tif ( this.dithering === true ) data.dithering = true;\n\n\t\tif ( this.alphaTest > 0 ) data.alphaTest = this.alphaTest;\n\t\tif ( this.alphaHash === true ) data.alphaHash = true;\n\t\tif ( this.alphaToCoverage === true ) data.alphaToCoverage = true;\n\t\tif ( this.premultipliedAlpha === true ) data.premultipliedAlpha = true;\n\t\tif ( this.forceSinglePass === true ) data.forceSinglePass = true;\n\t\tif ( this.allowOverride === false ) data.allowOverride = false;\n\n\t\tif ( this.wireframe === true ) data.wireframe = true;\n\t\tif ( this.wireframeLinewidth > 1 ) data.wireframeLinewidth = this.wireframeLinewidth;\n\t\tif ( this.wireframeLinecap !== 'round' ) data.wireframeLinecap = this.wireframeLinecap;\n\t\tif ( this.wireframeLinejoin !== 'round' ) data.wireframeLinejoin = this.wireframeLinejoin;\n\n\t\tif ( this.flatShading === true ) data.flatShading = true;\n\n\t\tif ( this.visible === false ) data.visible = false;\n\n\t\tif ( this.toneMapped === false ) data.toneMapped = false;\n\n\t\tif ( this.fog === false ) data.fog = false;\n\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\t// TODO: Copied from Object3D.toJSON\n\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t\tif ( isRootObject ) {\n\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\n\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\tif ( images.length > 0 ) data.images = images;\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Returns a new material with copied values from this instance.\n\t *\n\t * @return {Material} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given material to this instance.\n\t *\n\t * @param {Material} source - The material to copy.\n\t * @return {Material} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\n\t\tthis.blending = source.blending;\n\t\tthis.side = source.side;\n\t\tthis.vertexColors = source.vertexColors;\n\n\t\tthis.opacity = source.opacity;\n\t\tthis.transparent = source.transparent;\n\n\t\tthis.blendSrc = source.blendSrc;\n\t\tthis.blendDst = source.blendDst;\n\t\tthis.blendEquation = source.blendEquation;\n\t\tthis.blendSrcAlpha = source.blendSrcAlpha;\n\t\tthis.blendDstAlpha = source.blendDstAlpha;\n\t\tthis.blendEquationAlpha = source.blendEquationAlpha;\n\t\tthis.blendColor.copy( source.blendColor );\n\t\tthis.blendAlpha = source.blendAlpha;\n\n\t\tthis.depthFunc = source.depthFunc;\n\t\tthis.depthTest = source.depthTest;\n\t\tthis.depthWrite = source.depthWrite;\n\n\t\tthis.stencilWriteMask = source.stencilWriteMask;\n\t\tthis.stencilFunc = source.stencilFunc;\n\t\tthis.stencilRef = source.stencilRef;\n\t\tthis.stencilFuncMask = source.stencilFuncMask;\n\t\tthis.stencilFail = source.stencilFail;\n\t\tthis.stencilZFail = source.stencilZFail;\n\t\tthis.stencilZPass = source.stencilZPass;\n\t\tthis.stencilWrite = source.stencilWrite;\n\n\t\tconst srcPlanes = source.clippingPlanes;\n\t\tlet dstPlanes = null;\n\n\t\tif ( srcPlanes !== null ) {\n\n\t\t\tconst n = srcPlanes.length;\n\t\t\tdstPlanes = new Array( n );\n\n\t\t\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\t\t\tdstPlanes[ i ] = srcPlanes[ i ].clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.clippingPlanes = dstPlanes;\n\t\tthis.clipIntersection = source.clipIntersection;\n\t\tthis.clipShadows = source.clipShadows;\n\n\t\tthis.shadowSide = source.shadowSide;\n\n\t\tthis.colorWrite = source.colorWrite;\n\n\t\tthis.precision = source.precision;\n\n\t\tthis.polygonOffset = source.polygonOffset;\n\t\tthis.polygonOffsetFactor = source.polygonOffsetFactor;\n\t\tthis.polygonOffsetUnits = source.polygonOffsetUnits;\n\n\t\tthis.dithering = source.dithering;\n\n\t\tthis.alphaTest = source.alphaTest;\n\t\tthis.alphaHash = source.alphaHash;\n\t\tthis.alphaToCoverage = source.alphaToCoverage;\n\t\tthis.premultipliedAlpha = source.premultipliedAlpha;\n\t\tthis.forceSinglePass = source.forceSinglePass;\n\t\tthis.allowOverride = source.allowOverride;\n\n\t\tthis.visible = source.visible;\n\n\t\tthis.toneMapped = source.toneMapped;\n\n\t\tthis.userData = JSON.parse( JSON.stringify( source.userData ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires Material#dispose\n\t */\n\tdispose() {\n\n\t\t/**\n\t\t * Fires when the material has been disposed of.\n\t\t *\n\t\t * @event Material#dispose\n\t\t * @type {Object}\n\t\t */\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\t/**\n\t * Setting this property to `true` indicates the engine the material\n\t * needs to be recompiled.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n}\n\n/**\n * A material for drawing geometries in a simple shaded (flat or wireframe) way.\n *\n * This material is not affected by lights.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshBasicMaterial\n */\nclass MeshBasicMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh basic material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshBasicMaterial = true;\n\n\t\tthis.type = 'MeshBasicMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Specular map used by the material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * How to combine the result of the surface's color with the environment map, if any.\n\t\t *\n\t\t * When set to `MixOperation`, the {@link MeshBasicMaterial#reflectivity} is used to\n\t\t * blend between the two colors.\n\t\t *\n\t\t * @type {(MultiplyOperation|MixOperation|AddOperation)}\n\t\t * @default MultiplyOperation\n\t\t */\n\t\tthis.combine = MultiplyOperation;\n\n\t\t/**\n\t\t * How much the environment map affects the surface.\n\t\t * The valid range is between `0` (no reflections) and `1` (full reflections).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.reflectivity = 1;\n\n\t\t/**\n\t\t * The index of refraction (IOR) of air (approximately 1) divided by the\n\t\t * index of refraction of the material. It is used with environment mapping\n\t\t * modes {@link CubeRefractionMapping} and {@link EquirectangularRefractionMapping}.\n\t\t * The refraction ratio should not exceed `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.98\n\t\t */\n\t\tthis.refractionRatio = 0.98;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n// Fast Half Float Conversions, http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n\nconst _tables = /*@__PURE__*/ _generateTables();\n\nfunction _generateTables() {\n\n\t// float32 to float16 helpers\n\n\tconst buffer = new ArrayBuffer( 4 );\n\tconst floatView = new Float32Array( buffer );\n\tconst uint32View = new Uint32Array( buffer );\n\n\tconst baseTable = new Uint32Array( 512 );\n\tconst shiftTable = new Uint32Array( 512 );\n\n\tfor ( let i = 0; i < 256; ++ i ) {\n\n\t\tconst e = i - 127;\n\n\t\t// very small number (0, -0)\n\n\t\tif ( e < -27 ) {\n\n\t\t\tbaseTable[ i ] = 0x0000;\n\t\t\tbaseTable[ i | 0x100 ] = 0x8000;\n\t\t\tshiftTable[ i ] = 24;\n\t\t\tshiftTable[ i | 0x100 ] = 24;\n\n\t\t\t// small number (denorm)\n\n\t\t} else if ( e < -14 ) {\n\n\t\t\tbaseTable[ i ] = 0x0400 >> ( - e - 14 );\n\t\t\tbaseTable[ i | 0x100 ] = ( 0x0400 >> ( - e - 14 ) ) | 0x8000;\n\t\t\tshiftTable[ i ] = - e - 1;\n\t\t\tshiftTable[ i | 0x100 ] = - e - 1;\n\n\t\t\t// normal number\n\n\t\t} else if ( e <= 15 ) {\n\n\t\t\tbaseTable[ i ] = ( e + 15 ) << 10;\n\t\t\tbaseTable[ i | 0x100 ] = ( ( e + 15 ) << 10 ) | 0x8000;\n\t\t\tshiftTable[ i ] = 13;\n\t\t\tshiftTable[ i | 0x100 ] = 13;\n\n\t\t\t// large number (Infinity, -Infinity)\n\n\t\t} else if ( e < 128 ) {\n\n\t\t\tbaseTable[ i ] = 0x7c00;\n\t\t\tbaseTable[ i | 0x100 ] = 0xfc00;\n\t\t\tshiftTable[ i ] = 24;\n\t\t\tshiftTable[ i | 0x100 ] = 24;\n\n\t\t\t// stay (NaN, Infinity, -Infinity)\n\n\t\t} else {\n\n\t\t\tbaseTable[ i ] = 0x7c00;\n\t\t\tbaseTable[ i | 0x100 ] = 0xfc00;\n\t\t\tshiftTable[ i ] = 13;\n\t\t\tshiftTable[ i | 0x100 ] = 13;\n\n\t\t}\n\n\t}\n\n\t// float16 to float32 helpers\n\n\tconst mantissaTable = new Uint32Array( 2048 );\n\tconst exponentTable = new Uint32Array( 64 );\n\tconst offsetTable = new Uint32Array( 64 );\n\n\tfor ( let i = 1; i < 1024; ++ i ) {\n\n\t\tlet m = i << 13; // zero pad mantissa bits\n\t\tlet e = 0; // zero exponent\n\n\t\t// normalized\n\t\twhile ( ( m & 0x00800000 ) === 0 ) {\n\n\t\t\tm <<= 1;\n\t\t\te -= 0x00800000; // decrement exponent\n\n\t\t}\n\n\t\tm &= -8388609; // clear leading 1 bit\n\t\te += 0x38800000; // adjust bias\n\n\t\tmantissaTable[ i ] = m | e;\n\n\t}\n\n\tfor ( let i = 1024; i < 2048; ++ i ) {\n\n\t\tmantissaTable[ i ] = 0x38000000 + ( ( i - 1024 ) << 13 );\n\n\t}\n\n\tfor ( let i = 1; i < 31; ++ i ) {\n\n\t\texponentTable[ i ] = i << 23;\n\n\t}\n\n\texponentTable[ 31 ] = 0x47800000;\n\texponentTable[ 32 ] = 0x80000000;\n\n\tfor ( let i = 33; i < 63; ++ i ) {\n\n\t\texponentTable[ i ] = 0x80000000 + ( ( i - 32 ) << 23 );\n\n\t}\n\n\texponentTable[ 63 ] = 0xc7800000;\n\n\tfor ( let i = 1; i < 64; ++ i ) {\n\n\t\tif ( i !== 32 ) {\n\n\t\t\toffsetTable[ i ] = 1024;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tfloatView: floatView,\n\t\tuint32View: uint32View,\n\t\tbaseTable: baseTable,\n\t\tshiftTable: shiftTable,\n\t\tmantissaTable: mantissaTable,\n\t\texponentTable: exponentTable,\n\t\toffsetTable: offsetTable\n\t};\n\n}\n\n/**\n * Returns a half precision floating point value (FP16) from the given single\n * precision floating point value (FP32).\n *\n * @param {number} val - A single precision floating point value.\n * @return {number} The FP16 value.\n */\nfunction toHalfFloat( val ) {\n\n\tif ( Math.abs( val ) > 65504 ) warn( 'DataUtils.toHalfFloat(): Value out of range.' );\n\n\tval = clamp( val, -65504, 65504 );\n\n\t_tables.floatView[ 0 ] = val;\n\tconst f = _tables.uint32View[ 0 ];\n\tconst e = ( f >> 23 ) & 0x1ff;\n\treturn _tables.baseTable[ e ] + ( ( f & 0x007fffff ) >> _tables.shiftTable[ e ] );\n\n}\n\n/**\n * Returns a single precision floating point value (FP32) from the given half\n * precision floating point value (FP16).\n *\n * @param {number} val - A half precision floating point value.\n * @return {number} The FP32 value.\n */\nfunction fromHalfFloat( val ) {\n\n\tconst m = val >> 10;\n\t_tables.uint32View[ 0 ] = _tables.mantissaTable[ _tables.offsetTable[ m ] + ( val & 0x3ff ) ] + _tables.exponentTable[ m ];\n\treturn _tables.floatView[ 0 ];\n\n}\n\n/**\n * A class containing utility functions for data.\n *\n * @hideconstructor\n */\nclass DataUtils {\n\n\t/**\n\t * Returns a half precision floating point value (FP16) from the given single\n\t * precision floating point value (FP32).\n\t *\n\t * @param {number} val - A single precision floating point value.\n\t * @return {number} The FP16 value.\n\t */\n\tstatic toHalfFloat( val ) {\n\n\t\treturn toHalfFloat( val );\n\n\t}\n\n\t/**\n\t * Returns a single precision floating point value (FP32) from the given half\n\t * precision floating point value (FP16).\n\t *\n\t * @param {number} val - A half precision floating point value.\n\t * @return {number} The FP32 value.\n\t */\n\tstatic fromHalfFloat( val ) {\n\n\t\treturn fromHalfFloat( val );\n\n\t}\n\n}\n\nconst _vector$9 = /*@__PURE__*/ new Vector3();\nconst _vector2$1 = /*@__PURE__*/ new Vector2();\n\nlet _id$2 = 0;\n\n/**\n * This class stores data for an attribute (such as vertex positions, face\n * indices, normals, colors, UVs, and any custom attributes ) associated with\n * a geometry, which allows for more efficient passing of data to the GPU.\n *\n * When working with vector-like data, the `fromBufferAttribute( attribute, index )`\n * helper methods on vector and color class might be helpful. E.g. {@link Vector3#fromBufferAttribute}.\n */\nclass BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {TypedArray} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized = false ) {\n\n\t\tif ( Array.isArray( array ) ) {\n\n\t\t\tthrow new TypeError( 'THREE.BufferAttribute: array should be a Typed Array.' );\n\n\t\t}\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBufferAttribute = true;\n\n\t\t/**\n\t\t * The ID of the buffer attribute.\n\t\t *\n\t\t * @name BufferAttribute#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _id$2 ++ } );\n\n\t\t/**\n\t\t * The name of the buffer attribute.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The array holding the attribute data. It should have `itemSize * numVertices`\n\t\t * elements, where `numVertices` is the number of vertices in the associated geometry.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.array = array;\n\n\t\t/**\n\t\t * The number of values of the array that should be associated with a particular vertex.\n\t\t * For instance, if this attribute is storing a 3-component vector (such as a position,\n\t\t * normal, or color), then the value should be `3`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.itemSize = itemSize;\n\n\t\t/**\n\t\t * Represents the number of items this buffer attribute stores. It is internally computed\n\t\t * by dividing the `array` length by the `itemSize`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tthis.count = array !== undefined ? array.length / itemSize : 0;\n\n\t\t/**\n\t\t * Applies to integer data only. Indicates how the underlying data in the buffer maps to\n\t\t * the values in the GLSL code. For instance, if `array` is an instance of `UInt16Array`,\n\t\t * and `normalized` is `true`, the values `0 - +65535` in the array data will be mapped to\n\t\t * `0.0f - +1.0f` in the GLSL attribute. If `normalized` is `false`, the values will be converted\n\t\t * to floats unmodified, i.e. `65535` becomes `65535.0f`.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.normalized = normalized;\n\n\t\t/**\n\t\t * Defines the intended usage pattern of the data store for optimization purposes.\n\t\t *\n\t\t * Note: After the initial use of a buffer, its usage cannot be changed. Instead,\n\t\t * instantiate a new one and set the desired usage before the next render.\n\t\t *\n\t\t * @type {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)}\n\t\t * @default StaticDrawUsage\n\t\t */\n\t\tthis.usage = StaticDrawUsage;\n\n\t\t/**\n\t\t * This can be used to only update some components of stored vectors (for example, just the\n\t\t * component related to color). Use the `addUpdateRange()` function to add ranges to this array.\n\t\t *\n\t\t * @type {Array<Object>}\n\t\t */\n\t\tthis.updateRanges = [];\n\n\t\t/**\n\t\t * Configures the bound GPU type for use in shaders.\n\t\t *\n\t\t * Note: this only has an effect for integer arrays and is not configurable for float arrays.\n\t\t * For lower precision float types, use `Float16BufferAttribute`.\n\t\t *\n\t\t * @type {(FloatType|IntType)}\n\t\t * @default FloatType\n\t\t */\n\t\tthis.gpuType = FloatType;\n\n\t\t/**\n\t\t * A version number, incremented every time the `needsUpdate` is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.version = 0;\n\n\t}\n\n\t/**\n\t * A callback function that is executed after the renderer has transferred the attribute\n\t * array data to the GPU.\n\t */\n\tonUploadCallback() {}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Sets the usage of this buffer attribute.\n\t *\n\t * @param {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)} value - The usage to set.\n\t * @return {BufferAttribute} A reference to this buffer attribute.\n\t */\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds a range of data in the data array to be updated on the GPU.\n\t *\n\t * @param {number} start - Position at which to start update.\n\t * @param {number} count - The number of components to update.\n\t */\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\t/**\n\t * Clears the update ranges.\n\t */\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\t/**\n\t * Copies the values of the given buffer attribute to this instance.\n\t *\n\t * @param {BufferAttribute} source - The buffer attribute to copy.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.itemSize = source.itemSize;\n\t\tthis.count = source.count;\n\t\tthis.normalized = source.normalized;\n\n\t\tthis.usage = source.usage;\n\t\tthis.gpuType = source.gpuType;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies a vector from the given buffer attribute to this one. The start\n\t * and destination position in the attribute buffers are represented by the\n\t * given indices.\n\t *\n\t * @param {number} index1 - The destination index into this buffer attribute.\n\t * @param {BufferAttribute} attribute - The buffer attribute to copy from.\n\t * @param {number} index2 - The source index into the given buffer attribute.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tcopyAt( index1, attribute, index2 ) {\n\n\t\tindex1 *= this.itemSize;\n\t\tindex2 *= attribute.itemSize;\n\n\t\tfor ( let i = 0, l = this.itemSize; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = attribute.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the given array data into this buffer attribute.\n\t *\n\t * @param {(TypedArray|Array)} array - The array to copy.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tcopyArray( array ) {\n\n\t\tthis.array.set( array );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 3x3 matrix to the given attribute. Works with\n\t * item size `2` and `3`.\n\t *\n\t * @param {Matrix3} m - The matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tapplyMatrix3( m ) {\n\n\t\tif ( this.itemSize === 2 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector2$1.fromBufferAttribute( this, i );\n\t\t\t\t_vector2$1.applyMatrix3( m );\n\n\t\t\t\tthis.setXY( i, _vector2$1.x, _vector2$1.y );\n\n\t\t\t}\n\n\t\t} else if ( this.itemSize === 3 ) {\n\n\t\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t\t_vector$9.fromBufferAttribute( this, i );\n\t\t\t\t_vector$9.applyMatrix3( m );\n\n\t\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 3x3 normal matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix3} m - The normal matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3` and with direction vectors.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$9.fromBufferAttribute( this, i );\n\n\t\t\t_vector$9.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$9.x, _vector$9.y, _vector$9.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given array data in the buffer attribute.\n\t *\n\t * @param {(TypedArray|Array)} value - The array data to set.\n\t * @param {number} [offset=0] - The offset in this buffer attribute's array.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tset( value, offset = 0 ) {\n\n\t\t// Matching BufferAttribute constructor, do not normalize the array.\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @return {number} The returned value.\n\t */\n\tgetComponent( index, component ) {\n\n\t\tlet value = this.array[ index * this.itemSize + component ];\n\n\t\tif ( this.normalized ) value = denormalize( value, this.array );\n\n\t\treturn value;\n\n\t}\n\n\t/**\n\t * Sets the given value to the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @param {number} value - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetComponent( index, component, value ) {\n\n\t\tif ( this.normalized ) value = normalize( value, this.array );\n\n\t\tthis.array[ index * this.itemSize + component ] = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The x component.\n\t */\n\tgetX( index ) {\n\n\t\tlet x = this.array[ index * this.itemSize ];\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\t/**\n\t * Sets the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.array[ index * this.itemSize ] = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The y component.\n\t */\n\tgetY( index ) {\n\n\t\tlet y = this.array[ index * this.itemSize + 1 ];\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\t/**\n\t * Sets the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} y - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.array[ index * this.itemSize + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The z component.\n\t */\n\tgetZ( index ) {\n\n\t\tlet z = this.array[ index * this.itemSize + 2 ];\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\t/**\n\t * Sets the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} z - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.array[ index * this.itemSize + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The w component.\n\t */\n\tgetW( index ) {\n\n\t\tlet w = this.array[ index * this.itemSize + 3 ];\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\t/**\n\t * Sets the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} w - The value to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.array[ index * this.itemSize + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x and y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y and z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y, z and w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @param {number} w - The value for the w component to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = x;\n\t\tthis.array[ index + 1 ] = y;\n\t\tthis.array[ index + 2 ] = z;\n\t\tthis.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given callback function that is executed after the Renderer has transferred\n\t * the attribute array data to the GPU. Can be used to perform clean-up operations after\n\t * the upload when attribute data are not needed anymore on the CPU side.\n\t *\n\t * @param {Function} callback - The `onUpload()` callback.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new buffer attribute with copied values from this instance.\n\t *\n\t * @return {BufferAttribute} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.array, this.itemSize ).copy( this );\n\n\t}\n\n\t/**\n\t * Serializes the buffer attribute into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized buffer attribute.\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\titemSize: this.itemSize,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tarray: Array.from( this.array ),\n\t\t\tnormalized: this.normalized\n\t\t};\n\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( this.usage !== StaticDrawUsage ) data.usage = this.usage;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Int8` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Int8BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array<number>|Int8Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt8` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint8BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array<number>|Uint8Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt8Clamped` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint8ClampedBufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array<number>|Uint8ClampedArray)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint8ClampedArray( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Int16` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Int16BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array<number>|Int16Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt16` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint16BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array<number>|Uint16Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Int32` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Int32BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array<number>|Int32Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Int32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `UInt32` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Uint32BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array<number>|Uint32Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Float16` buffer attribute with\n * a plain `Array` instance.\n *\n * This class automatically converts to and from FP16 via `Uint16Array` since `Float16Array`\n * browser support is still problematic.\n *\n * @augments BufferAttribute\n */\nclass Float16BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array<number>|Uint16Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Uint16Array( array ), itemSize, normalized );\n\n\t\tthis.isFloat16BufferAttribute = true;\n\n\t}\n\n\tgetX( index ) {\n\n\t\tlet x = fromHalfFloat( this.array[ index * this.itemSize ] );\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.array[ index * this.itemSize ] = toHalfFloat( x );\n\n\t\treturn this;\n\n\t}\n\n\tgetY( index ) {\n\n\t\tlet y = fromHalfFloat( this.array[ index * this.itemSize + 1 ] );\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.array[ index * this.itemSize + 1 ] = toHalfFloat( y );\n\n\t\treturn this;\n\n\t}\n\n\tgetZ( index ) {\n\n\t\tlet z = fromHalfFloat( this.array[ index * this.itemSize + 2 ] );\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.array[ index * this.itemSize + 2 ] = toHalfFloat( z );\n\n\t\treturn this;\n\n\t}\n\n\tgetW( index ) {\n\n\t\tlet w = fromHalfFloat( this.array[ index * this.itemSize + 3 ] );\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.array[ index * this.itemSize + 3 ] = toHalfFloat( w );\n\n\t\treturn this;\n\n\t}\n\n\tsetXY( index, x, y ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\t\tthis.array[ index + 2 ] = toHalfFloat( z );\n\n\t\treturn this;\n\n\t}\n\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex *= this.itemSize;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.array[ index + 0 ] = toHalfFloat( x );\n\t\tthis.array[ index + 1 ] = toHalfFloat( y );\n\t\tthis.array[ index + 2 ] = toHalfFloat( z );\n\t\tthis.array[ index + 3 ] = toHalfFloat( w );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Convenient class that can be used when creating a `Float32` buffer attribute with\n * a plain `Array` instance.\n *\n * @augments BufferAttribute\n */\nclass Float32BufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new buffer attribute.\n\t *\n\t * @param {(Array<number>|Float32Array)} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( array, itemSize, normalized ) {\n\n\t\tsuper( new Float32Array( array ), itemSize, normalized );\n\n\t}\n\n}\n\nlet _id$1 = 0;\n\nconst _m1 = /*@__PURE__*/ new Matrix4();\nconst _obj = /*@__PURE__*/ new Object3D();\nconst _offset = /*@__PURE__*/ new Vector3();\nconst _box$2 = /*@__PURE__*/ new Box3();\nconst _boxMorphTargets = /*@__PURE__*/ new Box3();\nconst _vector$8 = /*@__PURE__*/ new Vector3();\n\n/**\n * A representation of mesh, line, or point geometry. Includes vertex\n * positions, face indices, normals, colors, UVs, and custom attributes\n * within buffers, reducing the cost of passing all this data to the GPU.\n *\n * ```js\n * const geometry = new THREE.BufferGeometry();\n * // create a simple square shape. We duplicate the top left and bottom right\n * // vertices because each vertex needs to appear once per triangle.\n * const vertices = new Float32Array( [\n * \t-1.0, -1.0,  1.0, // v0\n * \t 1.0, -1.0,  1.0, // v1\n * \t 1.0,  1.0,  1.0, // v2\n *\n * \t 1.0,  1.0,  1.0, // v3\n * \t-1.0,  1.0,  1.0, // v4\n * \t-1.0, -1.0,  1.0  // v5\n * ] );\n * // itemSize = 3 because there are 3 values (components) per vertex\n * geometry.setAttribute( 'position', new THREE.BufferAttribute( vertices, 3 ) );\n * const material = new THREE.MeshBasicMaterial( { color: 0xff0000 } );\n * const mesh = new THREE.Mesh( geometry, material );\n * ```\n *\n * @augments EventDispatcher\n */\nclass BufferGeometry extends EventDispatcher {\n\n\t/**\n\t * Constructs a new geometry.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBufferGeometry = true;\n\n\t\t/**\n\t\t * The ID of the geometry.\n\t\t *\n\t\t * @name BufferGeometry#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _id$1 ++ } );\n\n\t\t/**\n\t\t * The UUID of the geometry.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * The name of the geometry.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\t\tthis.type = 'BufferGeometry';\n\n\t\t/**\n\t\t * Allows for vertices to be re-used across multiple triangles; this is\n\t\t * called using \"indexed triangles\". Each triangle is associated with the\n\t\t * indices of three vertices. This attribute therefore stores the index of\n\t\t * each vertex for each triangular face. If this attribute is not set, the\n\t\t * renderer assumes that each three contiguous positions represent a single triangle.\n\t\t *\n\t\t * @type {?BufferAttribute}\n\t\t * @default null\n\t\t */\n\t\tthis.index = null;\n\n\t\t/**\n\t\t * A (storage) buffer attribute which was generated with a compute shader and\n\t\t * now defines indirect draw calls.\n\t\t *\n\t\t * Can only be used with {@link WebGPURenderer} and a WebGPU backend.\n\t\t *\n\t\t * @type {?BufferAttribute}\n\t\t * @default null\n\t\t */\n\t\tthis.indirect = null;\n\n\t\t/**\n\t\t * The offset, in bytes, into the indirect drawing buffer where the value data begins. If an array is provided, multiple indirect draw calls will be made for each offset.\n\t\t *\n\t\t * Can only be used with {@link WebGPURenderer} and a WebGPU backend.\n\t\t *\n\t\t * @type {number|Array<number>}\n\t\t * @default 0\n\t\t */\n\t\tthis.indirectOffset = 0;\n\n\t\t/**\n\t\t * This dictionary has as id the name of the attribute to be set and as value\n\t\t * the buffer attribute to set it to. Rather than accessing this property directly,\n\t\t * use `setAttribute()` and `getAttribute()` to access attributes of this geometry.\n\t\t *\n\t\t * @type {Object<string,(BufferAttribute|InterleavedBufferAttribute)>}\n\t\t */\n\t\tthis.attributes = {};\n\n\t\t/**\n\t\t * This dictionary holds the morph targets of the geometry.\n\t\t *\n\t\t * Note: Once the geometry has been rendered, the morph attribute data cannot\n\t\t * be changed. You will have to call `dispose()`, and create a new geometry instance.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.morphAttributes = {};\n\n\t\t/**\n\t\t * Used to control the morph target behavior; when set to `true`, the morph\n\t\t * target data is treated as relative offsets, rather than as absolute\n\t\t * positions/normals.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.morphTargetsRelative = false;\n\n\t\t/**\n\t\t * Split the geometry into groups, each of which will be rendered in a\n\t\t * separate draw call. This allows an array of materials to be used with the geometry.\n\t\t *\n\t\t * Use `addGroup()` and `clearGroups()` to edit groups, rather than modifying this array directly.\n\t\t *\n\t\t * Every vertex and index must belong to exactly one group \u2014 groups must not share vertices or\n\t\t * indices, and must not leave vertices or indices unused.\n\t\t *\n\t\t * @type {Array<Object>}\n\t\t */\n\t\tthis.groups = [];\n\n\t\t/**\n\t\t * Bounding box for the geometry which can be calculated with `computeBoundingBox()`.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * Bounding sphere for the geometry which can be calculated with `computeBoundingSphere()`.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t\t/**\n\t\t * Determines the part of the geometry to render. This should not be set directly,\n\t\t * instead use `setDrawRange()`.\n\t\t *\n\t\t * @type {{start:number,count:number}}\n\t\t */\n\t\tthis.drawRange = { start: 0, count: Infinity };\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the geometry.\n\t\t * It should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t}\n\n\t/**\n\t * Returns the index of this geometry.\n\t *\n\t * @return {?BufferAttribute} The index. Returns `null` if no index is defined.\n\t */\n\tgetIndex() {\n\n\t\treturn this.index;\n\n\t}\n\n\t/**\n\t * Sets the given index to this geometry.\n\t *\n\t * @param {Array<number>|BufferAttribute} index - The index to set.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetIndex( index ) {\n\n\t\tif ( Array.isArray( index ) ) {\n\n\t\t\tthis.index = new ( arrayNeedsUint32( index ) ? Uint32BufferAttribute : Uint16BufferAttribute )( index, 1 );\n\n\t\t} else {\n\n\t\t\tthis.index = index;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given indirect attribute to this geometry.\n\t *\n\t * @param {BufferAttribute} indirect - The attribute holding indirect draw calls.\n\t * @param {number|Array<number>} [indirectOffset=0] - The offset, in bytes, into the indirect drawing buffer where the value data begins. If an array is provided, multiple indirect draw calls will be made for each offset.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetIndirect( indirect, indirectOffset = 0 ) {\n\n\t\tthis.indirect = indirect;\n\t\tthis.indirectOffset = indirectOffset;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the indirect attribute of this geometry.\n\t *\n\t * @return {?BufferAttribute} The indirect attribute. Returns `null` if no indirect attribute is defined.\n\t */\n\tgetIndirect() {\n\n\t\treturn this.indirect;\n\n\t}\n\n\t/**\n\t * Returns the buffer attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name.\n\t * @return {BufferAttribute|InterleavedBufferAttribute|undefined} The buffer attribute.\n\t * Returns `undefined` if not attribute has been found.\n\t */\n\tgetAttribute( name ) {\n\n\t\treturn this.attributes[ name ];\n\n\t}\n\n\t/**\n\t * Sets the given attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name.\n\t * @param {BufferAttribute|InterleavedBufferAttribute} attribute - The attribute to set.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetAttribute( name, attribute ) {\n\n\t\tthis.attributes[ name ] = attribute;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Deletes the attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name to delete.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tdeleteAttribute( name ) {\n\n\t\tdelete this.attributes[ name ];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this geometry has an attribute for the given name.\n\t *\n\t * @param {string} name - The attribute name.\n\t * @return {boolean} Whether this geometry has an attribute for the given name or not.\n\t */\n\thasAttribute( name ) {\n\n\t\treturn this.attributes[ name ] !== undefined;\n\n\t}\n\n\t/**\n\t * Adds a group to this geometry.\n\t *\n\t * @param {number} start - The first element in this draw call. That is the first\n\t * vertex for non-indexed geometry, otherwise the first triangle index.\n\t * @param {number} count - Specifies how many vertices (or indices) are part of this group.\n\t * @param {number} [materialIndex=0] - The material array index to use.\n\t */\n\taddGroup( start, count, materialIndex = 0 ) {\n\n\t\tthis.groups.push( {\n\n\t\t\tstart: start,\n\t\t\tcount: count,\n\t\t\tmaterialIndex: materialIndex\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Clears all groups.\n\t */\n\tclearGroups() {\n\n\t\tthis.groups = [];\n\n\t}\n\n\t/**\n\t * Sets the draw range for this geometry.\n\t *\n\t * @param {number} start - The first vertex for non-indexed geometry, otherwise the first triangle index.\n\t * @param {number} count - For non-indexed BufferGeometry, `count` is the number of vertices to render.\n\t * For indexed BufferGeometry, `count` is the number of indices to render.\n\t */\n\tsetDrawRange( start, count ) {\n\n\t\tthis.drawRange.start = start;\n\t\tthis.drawRange.count = count;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 transformation matrix to the geometry.\n\t *\n\t * @param {Matrix4} matrix - The matrix to apply.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tconst position = this.attributes.position;\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tposition.applyMatrix4( matrix );\n\n\t\t\tposition.needsUpdate = true;\n\n\t\t}\n\n\t\tconst normal = this.attributes.normal;\n\n\t\tif ( normal !== undefined ) {\n\n\t\t\tconst normalMatrix = new Matrix3().getNormalMatrix( matrix );\n\n\t\t\tnormal.applyNormalMatrix( normalMatrix );\n\n\t\t\tnormal.needsUpdate = true;\n\n\t\t}\n\n\t\tconst tangent = this.attributes.tangent;\n\n\t\tif ( tangent !== undefined ) {\n\n\t\t\ttangent.transformDirection( matrix );\n\n\t\t\ttangent.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the rotation represented by the Quaternion to the geometry.\n\t *\n\t * @param {Quaternion} q - The Quaternion to apply.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tapplyQuaternion( q ) {\n\n\t\t_m1.makeRotationFromQuaternion( q );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry about the X axis. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#rotation} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\trotateX( angle ) {\n\n\t\t// rotate geometry around world x-axis\n\n\t\t_m1.makeRotationX( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry about the Y axis. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#rotation} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\trotateY( angle ) {\n\n\t\t// rotate geometry around world y-axis\n\n\t\t_m1.makeRotationY( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry about the Z axis. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#rotation} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} angle - The angle in radians.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\trotateZ( angle ) {\n\n\t\t// rotate geometry around world z-axis\n\n\t\t_m1.makeRotationZ( angle );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates the geometry. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#position} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} x - The x offset.\n\t * @param {number} y - The y offset.\n\t * @param {number} z - The z offset.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\ttranslate( x, y, z ) {\n\n\t\t// translate geometry\n\n\t\t_m1.makeTranslation( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scales the geometry. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#scale} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {number} x - The x scale.\n\t * @param {number} y - The y scale.\n\t * @param {number} z - The z scale.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tscale( x, y, z ) {\n\n\t\t// scale geometry\n\n\t\t_m1.makeScale( x, y, z );\n\n\t\tthis.applyMatrix4( _m1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Rotates the geometry to face a point in 3D space. This is typically done as a one time\n\t * operation, and not during a loop. Use {@link Object3D#lookAt} for typical\n\t * real-time mesh rotation.\n\t *\n\t * @param {Vector3} vector - The target point.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tlookAt( vector ) {\n\n\t\t_obj.lookAt( vector );\n\n\t\t_obj.updateMatrix();\n\n\t\tthis.applyMatrix4( _obj.matrix );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Center the geometry based on its bounding box.\n\t *\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tcenter() {\n\n\t\tthis.computeBoundingBox();\n\n\t\tthis.boundingBox.getCenter( _offset ).negate();\n\n\t\tthis.translate( _offset.x, _offset.y, _offset.z );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Defines a geometry by creating a `position` attribute based on the given array of points. The array\n\t * can hold 2D or 3D vectors. When using two-dimensional data, the `z` coordinate for all vertices is\n\t * set to `0`.\n\t *\n\t * If the method is used with an existing `position` attribute, the vertex data are overwritten with the\n\t * data from the array. The length of the array must match the vertex count.\n\t *\n\t * @param {Array<Vector2>|Array<Vector3>} points - The points.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tconst positionAttribute = this.getAttribute( 'position' );\n\n\t\tif ( positionAttribute === undefined ) {\n\n\t\t\tconst position = [];\n\n\t\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\tconst point = points[ i ];\n\t\t\t\tposition.push( point.x, point.y, point.z || 0 );\n\n\t\t\t}\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) );\n\n\t\t} else {\n\n\t\t\tconst l = Math.min( points.length, positionAttribute.count ); // make sure data do not exceed buffer size\n\n\t\t\tfor ( let i = 0; i < l; i ++ ) {\n\n\t\t\t\tconst point = points[ i ];\n\t\t\t\tpositionAttribute.setXYZ( i, point.x, point.y, point.z || 0 );\n\n\t\t\t}\n\n\t\t\tif ( points.length > positionAttribute.count ) {\n\n\t\t\t\twarn( 'BufferGeometry: Buffer size too small for points data. Use .dispose() and create a new geometry.' );\n\n\t\t\t}\n\n\t\t\tpositionAttribute.needsUpdate = true;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the bounding box of the geometry, and updates the `boundingBox` member.\n\t * The bounding box is not computed by the engine; it must be computed by your app.\n\t * You may need to recompute the bounding box if the geometry vertices are modified.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\terror( 'BufferGeometry.computeBoundingBox(): GLBufferAttribute requires a manual bounding box.', this );\n\n\t\t\tthis.boundingBox.set(\n\t\t\t\tnew Vector3( - Infinity, - Infinity, - Infinity ),\n\t\t\t\tnew Vector3( + Infinity, + Infinity, + Infinity )\n\t\t\t);\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tthis.boundingBox.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_box$2.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$8.addVectors( this.boundingBox.min, _box$2.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$8 );\n\n\t\t\t\t\t\t_vector$8.addVectors( this.boundingBox.max, _box$2.max );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _vector$8 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$2.min );\n\t\t\t\t\t\tthis.boundingBox.expandByPoint( _box$2.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.boundingBox.makeEmpty();\n\n\t\t}\n\n\t\tif ( isNaN( this.boundingBox.min.x ) || isNaN( this.boundingBox.min.y ) || isNaN( this.boundingBox.min.z ) ) {\n\n\t\t\terror( 'BufferGeometry.computeBoundingBox(): Computed min/max have NaN values. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere of the geometry, and updates the `boundingSphere` member.\n\t * The engine automatically computes the bounding sphere when it is needed, e.g., for ray casting or view frustum culling.\n\t * You may need to recompute the bounding sphere if the geometry vertices are modified.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst position = this.attributes.position;\n\t\tconst morphAttributesPosition = this.morphAttributes.position;\n\n\t\tif ( position && position.isGLBufferAttribute ) {\n\n\t\t\terror( 'BufferGeometry.computeBoundingSphere(): GLBufferAttribute requires a manual bounding sphere.', this );\n\n\t\t\tthis.boundingSphere.set( new Vector3(), Infinity );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( position ) {\n\n\t\t\t// first, find the center of the bounding sphere\n\n\t\t\tconst center = this.boundingSphere.center;\n\n\t\t\t_box$2.setFromBufferAttribute( position );\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\t_boxMorphTargets.setFromBufferAttribute( morphAttribute );\n\n\t\t\t\t\tif ( this.morphTargetsRelative ) {\n\n\t\t\t\t\t\t_vector$8.addVectors( _box$2.min, _boxMorphTargets.min );\n\t\t\t\t\t\t_box$2.expandByPoint( _vector$8 );\n\n\t\t\t\t\t\t_vector$8.addVectors( _box$2.max, _boxMorphTargets.max );\n\t\t\t\t\t\t_box$2.expandByPoint( _vector$8 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_box$2.expandByPoint( _boxMorphTargets.min );\n\t\t\t\t\t\t_box$2.expandByPoint( _boxMorphTargets.max );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_box$2.getCenter( center );\n\n\t\t\t// second, try to find a boundingSphere with a radius smaller than the\n\t\t\t// boundingSphere of the boundingBox: sqrt(3) smaller in the best case\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor ( let i = 0, il = position.count; i < il; i ++ ) {\n\n\t\t\t\t_vector$8.fromBufferAttribute( position, i );\n\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) );\n\n\t\t\t}\n\n\t\t\t// process morph attributes if present\n\n\t\t\tif ( morphAttributesPosition ) {\n\n\t\t\t\tfor ( let i = 0, il = morphAttributesPosition.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst morphAttribute = morphAttributesPosition[ i ];\n\t\t\t\t\tconst morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t\t\t\tfor ( let j = 0, jl = morphAttribute.count; j < jl; j ++ ) {\n\n\t\t\t\t\t\t_vector$8.fromBufferAttribute( morphAttribute, j );\n\n\t\t\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t\t\t_offset.fromBufferAttribute( position, j );\n\t\t\t\t\t\t\t_vector$8.add( _offset );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector$8 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\terror( 'BufferGeometry.computeBoundingSphere(): Computed radius is NaN. The \"position\" attribute is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Calculates and adds a tangent attribute to this geometry.\n\t *\n\t * The computation is only supported for indexed geometries and if position, normal, and uv attributes\n\t * are defined. When using a tangent space normal map, prefer the MikkTSpace algorithm provided by\n\t * {@link BufferGeometryUtils#computeMikkTSpaceTangents} instead.\n\t */\n\tcomputeTangents() {\n\n\t\tconst index = this.index;\n\t\tconst attributes = this.attributes;\n\n\t\t// based on http://www.terathon.com/code/tangent.html\n\t\t// (per vertex tangents)\n\n\t\tif ( index === null ||\n\t\t\t attributes.position === undefined ||\n\t\t\t attributes.normal === undefined ||\n\t\t\t attributes.uv === undefined ) {\n\n\t\t\terror( 'BufferGeometry: .computeTangents() failed. Missing required attributes (index, position, normal or uv)' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst positionAttribute = attributes.position;\n\t\tconst normalAttribute = attributes.normal;\n\t\tconst uvAttribute = attributes.uv;\n\n\t\tif ( this.hasAttribute( 'tangent' ) === false ) {\n\n\t\t\tthis.setAttribute( 'tangent', new BufferAttribute( new Float32Array( 4 * positionAttribute.count ), 4 ) );\n\n\t\t}\n\n\t\tconst tangentAttribute = this.getAttribute( 'tangent' );\n\n\t\tconst tan1 = [], tan2 = [];\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\ttan1[ i ] = new Vector3();\n\t\t\ttan2[ i ] = new Vector3();\n\n\t\t}\n\n\t\tconst vA = new Vector3(),\n\t\t\tvB = new Vector3(),\n\t\t\tvC = new Vector3(),\n\n\t\t\tuvA = new Vector2(),\n\t\t\tuvB = new Vector2(),\n\t\t\tuvC = new Vector2(),\n\n\t\t\tsdir = new Vector3(),\n\t\t\ttdir = new Vector3();\n\n\t\tfunction handleTriangle( a, b, c ) {\n\n\t\t\tvA.fromBufferAttribute( positionAttribute, a );\n\t\t\tvB.fromBufferAttribute( positionAttribute, b );\n\t\t\tvC.fromBufferAttribute( positionAttribute, c );\n\n\t\t\tuvA.fromBufferAttribute( uvAttribute, a );\n\t\t\tuvB.fromBufferAttribute( uvAttribute, b );\n\t\t\tuvC.fromBufferAttribute( uvAttribute, c );\n\n\t\t\tvB.sub( vA );\n\t\t\tvC.sub( vA );\n\n\t\t\tuvB.sub( uvA );\n\t\t\tuvC.sub( uvA );\n\n\t\t\tconst r = 1.0 / ( uvB.x * uvC.y - uvC.x * uvB.y );\n\n\t\t\t// silently ignore degenerate uv triangles having coincident or colinear vertices\n\n\t\t\tif ( ! isFinite( r ) ) return;\n\n\t\t\tsdir.copy( vB ).multiplyScalar( uvC.y ).addScaledVector( vC, - uvB.y ).multiplyScalar( r );\n\t\t\ttdir.copy( vC ).multiplyScalar( uvB.x ).addScaledVector( vB, - uvC.x ).multiplyScalar( r );\n\n\t\t\ttan1[ a ].add( sdir );\n\t\t\ttan1[ b ].add( sdir );\n\t\t\ttan1[ c ].add( sdir );\n\n\t\t\ttan2[ a ].add( tdir );\n\t\t\ttan2[ b ].add( tdir );\n\t\t\ttan2[ c ].add( tdir );\n\n\t\t}\n\n\t\tlet groups = this.groups;\n\n\t\tif ( groups.length === 0 ) {\n\n\t\t\tgroups = [ {\n\t\t\t\tstart: 0,\n\t\t\t\tcount: index.count\n\t\t\t} ];\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleTriangle(\n\t\t\t\t\tindex.getX( j + 0 ),\n\t\t\t\t\tindex.getX( j + 1 ),\n\t\t\t\t\tindex.getX( j + 2 )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst tmp = new Vector3(), tmp2 = new Vector3();\n\t\tconst n = new Vector3(), n2 = new Vector3();\n\n\t\tfunction handleVertex( v ) {\n\n\t\t\tn.fromBufferAttribute( normalAttribute, v );\n\t\t\tn2.copy( n );\n\n\t\t\tconst t = tan1[ v ];\n\n\t\t\t// Gram-Schmidt orthogonalize\n\n\t\t\ttmp.copy( t );\n\t\t\ttmp.sub( n.multiplyScalar( n.dot( t ) ) ).normalize();\n\n\t\t\t// Calculate handedness\n\n\t\t\ttmp2.crossVectors( n2, t );\n\t\t\tconst test = tmp2.dot( tan2[ v ] );\n\t\t\tconst w = ( test < 0.0 ) ? -1 : 1.0;\n\n\t\t\ttangentAttribute.setXYZW( v, tmp.x, tmp.y, tmp.z, w );\n\n\t\t}\n\n\t\tfor ( let i = 0, il = groups.length; i < il; ++ i ) {\n\n\t\t\tconst group = groups[ i ];\n\n\t\t\tconst start = group.start;\n\t\t\tconst count = group.count;\n\n\t\t\tfor ( let j = start, jl = start + count; j < jl; j += 3 ) {\n\n\t\t\t\thandleVertex( index.getX( j + 0 ) );\n\t\t\t\thandleVertex( index.getX( j + 1 ) );\n\t\t\t\thandleVertex( index.getX( j + 2 ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes vertex normals for the given vertex data. For indexed geometries, the method sets\n\t * each vertex normal to be the average of the face normals of the faces that share that vertex.\n\t * For non-indexed geometries, vertices are not shared, and the method sets each vertex normal\n\t * to be the same as the face normal.\n\t */\n\tcomputeVertexNormals() {\n\n\t\tconst index = this.index;\n\t\tconst positionAttribute = this.getAttribute( 'position' );\n\n\t\tif ( positionAttribute !== undefined ) {\n\n\t\t\tlet normalAttribute = this.getAttribute( 'normal' );\n\n\t\t\tif ( normalAttribute === undefined ) {\n\n\t\t\t\tnormalAttribute = new BufferAttribute( new Float32Array( positionAttribute.count * 3 ), 3 );\n\t\t\t\tthis.setAttribute( 'normal', normalAttribute );\n\n\t\t\t} else {\n\n\t\t\t\t// reset existing normals to zero\n\n\t\t\t\tfor ( let i = 0, il = normalAttribute.count; i < il; i ++ ) {\n\n\t\t\t\t\tnormalAttribute.setXYZ( i, 0, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst pA = new Vector3(), pB = new Vector3(), pC = new Vector3();\n\t\t\tconst nA = new Vector3(), nB = new Vector3(), nC = new Vector3();\n\t\t\tconst cb = new Vector3(), ab = new Vector3();\n\n\t\t\t// indexed elements\n\n\t\t\tif ( index ) {\n\n\t\t\t\tfor ( let i = 0, il = index.count; i < il; i += 3 ) {\n\n\t\t\t\t\tconst vA = index.getX( i + 0 );\n\t\t\t\t\tconst vB = index.getX( i + 1 );\n\t\t\t\t\tconst vC = index.getX( i + 2 );\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, vA );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, vB );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, vC );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnA.fromBufferAttribute( normalAttribute, vA );\n\t\t\t\t\tnB.fromBufferAttribute( normalAttribute, vB );\n\t\t\t\t\tnC.fromBufferAttribute( normalAttribute, vC );\n\n\t\t\t\t\tnA.add( cb );\n\t\t\t\t\tnB.add( cb );\n\t\t\t\t\tnC.add( cb );\n\n\t\t\t\t\tnormalAttribute.setXYZ( vA, nA.x, nA.y, nA.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vB, nB.x, nB.y, nB.z );\n\t\t\t\t\tnormalAttribute.setXYZ( vC, nC.x, nC.y, nC.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed elements (unconnected triangle soup)\n\n\t\t\t\tfor ( let i = 0, il = positionAttribute.count; i < il; i += 3 ) {\n\n\t\t\t\t\tpA.fromBufferAttribute( positionAttribute, i + 0 );\n\t\t\t\t\tpB.fromBufferAttribute( positionAttribute, i + 1 );\n\t\t\t\t\tpC.fromBufferAttribute( positionAttribute, i + 2 );\n\n\t\t\t\t\tcb.subVectors( pC, pB );\n\t\t\t\t\tab.subVectors( pA, pB );\n\t\t\t\t\tcb.cross( ab );\n\n\t\t\t\t\tnormalAttribute.setXYZ( i + 0, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 1, cb.x, cb.y, cb.z );\n\t\t\t\t\tnormalAttribute.setXYZ( i + 2, cb.x, cb.y, cb.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.normalizeNormals();\n\n\t\t\tnormalAttribute.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Ensures every normal vector in a geometry will have a magnitude of `1`. This will\n\t * correct lighting on the geometry surfaces.\n\t */\n\tnormalizeNormals() {\n\n\t\tconst normals = this.attributes.normal;\n\n\t\tfor ( let i = 0, il = normals.count; i < il; i ++ ) {\n\n\t\t\t_vector$8.fromBufferAttribute( normals, i );\n\n\t\t\t_vector$8.normalize();\n\n\t\t\tnormals.setXYZ( i, _vector$8.x, _vector$8.y, _vector$8.z );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Return a new non-index version of this indexed geometry. If the geometry\n\t * is already non-indexed, the method is a NOOP.\n\t *\n\t * @return {BufferGeometry} The non-indexed version of this indexed geometry.\n\t */\n\ttoNonIndexed() {\n\n\t\tfunction convertBufferAttribute( attribute, indices ) {\n\n\t\t\tconst array = attribute.array;\n\t\t\tconst itemSize = attribute.itemSize;\n\t\t\tconst normalized = attribute.normalized;\n\n\t\t\tconst array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\tlet index = 0, index2 = 0;\n\n\t\t\tfor ( let i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\tindex = indices[ i ] * attribute.data.stride + attribute.offset;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( array2, itemSize, normalized );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.index === null ) {\n\n\t\t\twarn( 'BufferGeometry.toNonIndexed(): BufferGeometry is already non-indexed.' );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tconst geometry2 = new BufferGeometry();\n\n\t\tconst indices = this.index.array;\n\t\tconst attributes = this.attributes;\n\n\t\t// attributes\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\n\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\tgeometry2.setAttribute( name, newAttribute );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = this.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst morphArray = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = morphAttribute[ i ];\n\n\t\t\t\tconst newAttribute = convertBufferAttribute( attribute, indices );\n\n\t\t\t\tmorphArray.push( newAttribute );\n\n\t\t\t}\n\n\t\t\tgeometry2.morphAttributes[ name ] = morphArray;\n\n\t\t}\n\n\t\tgeometry2.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = this.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tgeometry2.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\treturn geometry2;\n\n\t}\n\n\t/**\n\t * Serializes the geometry into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized geometry.\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'BufferGeometry',\n\t\t\t\tgenerator: 'BufferGeometry.toJSON'\n\t\t\t}\n\t\t};\n\n\t\t// standard BufferGeometry serialization\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.type = this.type;\n\t\tif ( this.name !== '' ) data.name = this.name;\n\t\tif ( Object.keys( this.userData ).length > 0 ) data.userData = this.userData;\n\n\t\tif ( this.parameters !== undefined ) {\n\n\t\t\tconst parameters = this.parameters;\n\n\t\t\tfor ( const key in parameters ) {\n\n\t\t\t\tif ( parameters[ key ] !== undefined ) data[ key ] = parameters[ key ];\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\t// for simplicity the code assumes attributes are not shared across geometries, see #15811\n\n\t\tdata.data = { attributes: {} };\n\n\t\tconst index = this.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tdata.data.index = {\n\t\t\t\ttype: index.array.constructor.name,\n\t\t\t\tarray: Array.prototype.slice.call( index.array )\n\t\t\t};\n\n\t\t}\n\n\t\tconst attributes = this.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\n\t\t\tdata.data.attributes[ key ] = attribute.toJSON( data.data );\n\n\t\t}\n\n\t\tconst morphAttributes = {};\n\t\tlet hasMorphAttributes = false;\n\n\t\tfor ( const key in this.morphAttributes ) {\n\n\t\t\tconst attributeArray = this.morphAttributes[ key ];\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\tconst attribute = attributeArray[ i ];\n\n\t\t\t\tarray.push( attribute.toJSON( data.data ) );\n\n\t\t\t}\n\n\t\t\tif ( array.length > 0 ) {\n\n\t\t\t\tmorphAttributes[ key ] = array;\n\n\t\t\t\thasMorphAttributes = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( hasMorphAttributes ) {\n\n\t\t\tdata.data.morphAttributes = morphAttributes;\n\t\t\tdata.data.morphTargetsRelative = this.morphTargetsRelative;\n\n\t\t}\n\n\t\tconst groups = this.groups;\n\n\t\tif ( groups.length > 0 ) {\n\n\t\t\tdata.data.groups = JSON.parse( JSON.stringify( groups ) );\n\n\t\t}\n\n\t\tconst boundingSphere = this.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tdata.data.boundingSphere = boundingSphere.toJSON();\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Returns a new geometry with copied values from this instance.\n\t *\n\t * @return {BufferGeometry} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given geometry to this instance.\n\t *\n\t * @param {BufferGeometry} source - The geometry to copy.\n\t * @return {BufferGeometry} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\t// reset\n\n\t\tthis.index = null;\n\t\tthis.attributes = {};\n\t\tthis.morphAttributes = {};\n\t\tthis.groups = [];\n\t\tthis.boundingBox = null;\n\t\tthis.boundingSphere = null;\n\n\t\t// used for storing cloned, shared data\n\n\t\tconst data = {};\n\n\t\t// name\n\n\t\tthis.name = source.name;\n\n\t\t// index\n\n\t\tconst index = source.index;\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.setIndex( index.clone() );\n\n\t\t}\n\n\t\t// attributes\n\n\t\tconst attributes = source.attributes;\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\t\t\tthis.setAttribute( name, attribute.clone( data ) );\n\n\t\t}\n\n\t\t// morph attributes\n\n\t\tconst morphAttributes = source.morphAttributes;\n\n\t\tfor ( const name in morphAttributes ) {\n\n\t\t\tconst array = [];\n\t\t\tconst morphAttribute = morphAttributes[ name ]; // morphAttribute: array of Float32BufferAttributes\n\n\t\t\tfor ( let i = 0, l = morphAttribute.length; i < l; i ++ ) {\n\n\t\t\t\tarray.push( morphAttribute[ i ].clone( data ) );\n\n\t\t\t}\n\n\t\t\tthis.morphAttributes[ name ] = array;\n\n\t\t}\n\n\t\tthis.morphTargetsRelative = source.morphTargetsRelative;\n\n\t\t// groups\n\n\t\tconst groups = source.groups;\n\n\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\tconst group = groups[ i ];\n\t\t\tthis.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t}\n\n\t\t// bounding box\n\n\t\tconst boundingBox = source.boundingBox;\n\n\t\tif ( boundingBox !== null ) {\n\n\t\t\tthis.boundingBox = boundingBox.clone();\n\n\t\t}\n\n\t\t// bounding sphere\n\n\t\tconst boundingSphere = source.boundingSphere;\n\n\t\tif ( boundingSphere !== null ) {\n\n\t\t\tthis.boundingSphere = boundingSphere.clone();\n\n\t\t}\n\n\t\t// draw range\n\n\t\tthis.drawRange.start = source.drawRange.start;\n\t\tthis.drawRange.count = source.drawRange.count;\n\n\t\t// user data\n\n\t\tthis.userData = source.userData;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires BufferGeometry#dispose\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nconst _inverseMatrix$3 = /*@__PURE__*/ new Matrix4();\nconst _ray$3 = /*@__PURE__*/ new Ray();\nconst _sphere$6 = /*@__PURE__*/ new Sphere();\nconst _sphereHitAt = /*@__PURE__*/ new Vector3();\n\nconst _vA$1 = /*@__PURE__*/ new Vector3();\nconst _vB$1 = /*@__PURE__*/ new Vector3();\nconst _vC$1 = /*@__PURE__*/ new Vector3();\n\nconst _tempA = /*@__PURE__*/ new Vector3();\nconst _morphA = /*@__PURE__*/ new Vector3();\n\nconst _intersectionPoint = /*@__PURE__*/ new Vector3();\nconst _intersectionPointWorld = /*@__PURE__*/ new Vector3();\n\n/**\n * Class representing triangular polygon mesh based objects.\n *\n * ```js\n * const geometry = new THREE.BoxGeometry( 1, 1, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n * ```\n *\n * @augments Object3D\n */\nclass Mesh extends Object3D {\n\n\t/**\n\t * Constructs a new mesh.\n\t *\n\t * @param {BufferGeometry} [geometry] - The mesh geometry.\n\t * @param {Material|Array<Material>} [material] - The mesh material.\n\t */\n\tconstructor( geometry = new BufferGeometry(), material = new MeshBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMesh = true;\n\n\t\tthis.type = 'Mesh';\n\n\t\t/**\n\t\t * The mesh geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = geometry;\n\n\t\t/**\n\t\t * The mesh material.\n\t\t *\n\t\t * @type {Material|Array<Material>}\n\t\t * @default MeshBasicMaterial\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * A dictionary representing the morph targets in the geometry. The key is the\n\t\t * morph targets name, the value its attribute index. This member is `undefined`\n\t\t * by default and only set when morph targets are detected in the geometry.\n\t\t *\n\t\t * @type {Object<string,number>|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetDictionary = undefined;\n\n\t\t/**\n\t\t * An array of weights typically in the range `[0,1]` that specify how much of the morph\n\t\t * is applied. This member is `undefined` by default and only set when morph targets are\n\t\t * detected in the geometry.\n\t\t *\n\t\t * @type {Array<number>|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetInfluences = undefined;\n\n\t\t/**\n\t\t * The number of instances of this mesh.\n\t\t * Can only be used with {@link WebGPURenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.count = 1;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.morphTargetInfluences !== undefined ) {\n\n\t\t\tthis.morphTargetInfluences = source.morphTargetInfluences.slice();\n\n\t\t}\n\n\t\tif ( source.morphTargetDictionary !== undefined ) {\n\n\t\t\tthis.morphTargetDictionary = Object.assign( {}, source.morphTargetDictionary );\n\n\t\t}\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the values of {@link Mesh#morphTargetDictionary} and {@link Mesh#morphTargetInfluences}\n\t * to make sure existing morph targets can influence this 3D object.\n\t */\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the local-space position of the vertex at the given index, taking into\n\t * account the current animation state of both morph targets and skinning.\n\t *\n\t * @param {number} index - The vertex index.\n\t * @param {Vector3} target - The target object that is used to store the method's result.\n\t * @return {Vector3} The vertex position in local space.\n\t */\n\tgetVertexPosition( index, target ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.attributes.position;\n\t\tconst morphPosition = geometry.morphAttributes.position;\n\t\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\n\t\ttarget.fromBufferAttribute( position, index );\n\n\t\tconst morphInfluences = this.morphTargetInfluences;\n\n\t\tif ( morphPosition && morphInfluences ) {\n\n\t\t\t_morphA.set( 0, 0, 0 );\n\n\t\t\tfor ( let i = 0, il = morphPosition.length; i < il; i ++ ) {\n\n\t\t\t\tconst influence = morphInfluences[ i ];\n\t\t\t\tconst morphAttribute = morphPosition[ i ];\n\n\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t_tempA.fromBufferAttribute( morphAttribute, index );\n\n\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA.sub( target ), influence );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttarget.add( _morphA );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this line.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array<Object>} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// test with bounding sphere in world space\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$6.copy( geometry.boundingSphere );\n\t\t_sphere$6.applyMatrix4( matrixWorld );\n\n\t\t// check distance from ray origin to bounding sphere\n\n\t\t_ray$3.copy( raycaster.ray ).recast( raycaster.near );\n\n\t\tif ( _sphere$6.containsPoint( _ray$3.origin ) === false ) {\n\n\t\t\tif ( _ray$3.intersectSphere( _sphere$6, _sphereHitAt ) === null ) return;\n\n\t\t\tif ( _ray$3.origin.distanceToSquared( _sphereHitAt ) > ( raycaster.far - raycaster.near ) ** 2 ) return;\n\n\t\t}\n\n\t\t// convert ray to local space of mesh\n\n\t\t_inverseMatrix$3.copy( matrixWorld ).invert();\n\t\t_ray$3.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$3 );\n\n\t\t// test with bounding box in local space\n\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tif ( _ray$3.intersectsBox( geometry.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\t// test for intersections with geometry\n\n\t\tthis._computeIntersections( raycaster, intersects, _ray$3 );\n\n\t}\n\n\t_computeIntersections( raycaster, intersects, rayLocalSpace ) {\n\n\t\tlet intersection;\n\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\n\t\tconst index = geometry.index;\n\t\tconst position = geometry.attributes.position;\n\t\tconst uv = geometry.attributes.uv;\n\t\tconst uv1 = geometry.attributes.uv1;\n\t\tconst normal = geometry.attributes.normal;\n\t\tconst groups = geometry.groups;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\tif ( index !== null ) {\n\n\t\t\t// indexed buffer geometry\n\n\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\tconst end = Math.min( index.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\tconst a = index.getX( j );\n\t\t\t\t\t\tconst b = index.getX( j + 1 );\n\t\t\t\t\t\tconst c = index.getX( j + 2 );\n\n\t\t\t\t\t\tintersection = checkGeometryIntersection( this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\tconst a = index.getX( i );\n\t\t\t\t\tconst b = index.getX( i + 1 );\n\t\t\t\t\tconst c = index.getX( i + 2 );\n\n\t\t\t\t\tintersection = checkGeometryIntersection( this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in indexed buffer semantics\n\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( position !== undefined ) {\n\n\t\t\t// non-indexed buffer geometry\n\n\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\tconst start = Math.max( group.start, drawRange.start );\n\t\t\t\t\tconst end = Math.min( position.count, Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) ) );\n\n\t\t\t\t\tfor ( let j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\t\tconst a = j;\n\t\t\t\t\t\tconst b = j + 1;\n\t\t\t\t\t\tconst c = j + 2;\n\n\t\t\t\t\t\tintersection = checkGeometryIntersection( this, groupMaterial, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\t\tintersection.faceIndex = Math.floor( j / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\t\tintersection.face.materialIndex = group.materialIndex;\n\t\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\t\tconst end = Math.min( position.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( let i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\t\tconst a = i;\n\t\t\t\t\tconst b = i + 1;\n\t\t\t\t\tconst c = i + 2;\n\n\t\t\t\t\tintersection = checkGeometryIntersection( this, material, raycaster, rayLocalSpace, uv, uv1, normal, a, b, c );\n\n\t\t\t\t\tif ( intersection ) {\n\n\t\t\t\t\t\tintersection.faceIndex = Math.floor( i / 3 ); // triangle number in non-indexed buffer semantics\n\t\t\t\t\t\tintersects.push( intersection );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction checkIntersection$1( object, material, raycaster, ray, pA, pB, pC, point ) {\n\n\tlet intersect;\n\n\tif ( material.side === BackSide ) {\n\n\t\tintersect = ray.intersectTriangle( pC, pB, pA, true, point );\n\n\t} else {\n\n\t\tintersect = ray.intersectTriangle( pA, pB, pC, ( material.side === FrontSide ), point );\n\n\t}\n\n\tif ( intersect === null ) return null;\n\n\t_intersectionPointWorld.copy( point );\n\t_intersectionPointWorld.applyMatrix4( object.matrixWorld );\n\n\tconst distance = raycaster.ray.origin.distanceTo( _intersectionPointWorld );\n\n\tif ( distance < raycaster.near || distance > raycaster.far ) return null;\n\n\treturn {\n\t\tdistance: distance,\n\t\tpoint: _intersectionPointWorld.clone(),\n\t\tobject: object\n\t};\n\n}\n\nfunction checkGeometryIntersection( object, material, raycaster, ray, uv, uv1, normal, a, b, c ) {\n\n\tobject.getVertexPosition( a, _vA$1 );\n\tobject.getVertexPosition( b, _vB$1 );\n\tobject.getVertexPosition( c, _vC$1 );\n\n\tconst intersection = checkIntersection$1( object, material, raycaster, ray, _vA$1, _vB$1, _vC$1, _intersectionPoint );\n\n\tif ( intersection ) {\n\n\t\tconst barycoord = new Vector3();\n\t\tTriangle.getBarycoord( _intersectionPoint, _vA$1, _vB$1, _vC$1, barycoord );\n\n\t\tif ( uv ) {\n\n\t\t\tintersection.uv = Triangle.getInterpolatedAttribute( uv, a, b, c, barycoord, new Vector2() );\n\n\t\t}\n\n\t\tif ( uv1 ) {\n\n\t\t\tintersection.uv1 = Triangle.getInterpolatedAttribute( uv1, a, b, c, barycoord, new Vector2() );\n\n\t\t}\n\n\t\tif ( normal ) {\n\n\t\t\tintersection.normal = Triangle.getInterpolatedAttribute( normal, a, b, c, barycoord, new Vector3() );\n\n\t\t\tif ( intersection.normal.dot( ray.direction ) > 0 ) {\n\n\t\t\t\tintersection.normal.multiplyScalar( -1 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst face = {\n\t\t\ta: a,\n\t\t\tb: b,\n\t\t\tc: c,\n\t\t\tnormal: new Vector3(),\n\t\t\tmaterialIndex: 0\n\t\t};\n\n\t\tTriangle.getNormal( _vA$1, _vB$1, _vC$1, face.normal );\n\n\t\tintersection.face = face;\n\t\tintersection.barycoord = barycoord;\n\n\t}\n\n\treturn intersection;\n\n}\n\n/**\n * A geometry class for a rectangular cuboid with a given width, height, and depth.\n * On creation, the cuboid is centred on the origin, with each edge parallel to one\n * of the axes.\n *\n * ```js\n * const geometry = new THREE.BoxGeometry( 1, 1, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const cube = new THREE.Mesh( geometry, material );\n * scene.add( cube );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#BoxGeometry\n */\nclass BoxGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new box geometry.\n\t *\n\t * @param {number} [width=1] - The width. That is, the length of the edges parallel to the X axis.\n\t * @param {number} [height=1] - The height. That is, the length of the edges parallel to the Y axis.\n\t * @param {number} [depth=1] - The depth. That is, the length of the edges parallel to the Z axis.\n\t * @param {number} [widthSegments=1] - Number of segmented rectangular faces along the width of the sides.\n\t * @param {number} [heightSegments=1] - Number of segmented rectangular faces along the height of the sides.\n\t * @param {number} [depthSegments=1] - Number of segmented rectangular faces along the depth of the sides.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'BoxGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tdepthSegments: depthSegments\n\t\t};\n\n\t\tconst scope = this;\n\n\t\t// segments\n\n\t\twidthSegments = Math.floor( widthSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\t\tdepthSegments = Math.floor( depthSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet numberOfVertices = 0;\n\t\tlet groupStart = 0;\n\n\t\t// build each side of the box geometry\n\n\t\tbuildPlane( 'z', 'y', 'x', -1, -1, depth, height, width, depthSegments, heightSegments, 0 ); // px\n\t\tbuildPlane( 'z', 'y', 'x', 1, -1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx\n\t\tbuildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py\n\t\tbuildPlane( 'x', 'z', 'y', 1, -1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny\n\t\tbuildPlane( 'x', 'y', 'z', 1, -1, width, height, depth, widthSegments, heightSegments, 4 ); // pz\n\t\tbuildPlane( 'x', 'y', 'z', -1, -1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {\n\n\t\t\tconst segmentWidth = width / gridX;\n\t\t\tconst segmentHeight = height / gridY;\n\n\t\t\tconst widthHalf = width / 2;\n\t\t\tconst heightHalf = height / 2;\n\t\t\tconst depthHalf = depth / 2;\n\n\t\t\tconst gridX1 = gridX + 1;\n\t\t\tconst gridY1 = gridY + 1;\n\n\t\t\tlet vertexCounter = 0;\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst vector = new Vector3();\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\t\tconst y = iy * segmentHeight - heightHalf;\n\n\t\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\t\tconst x = ix * segmentWidth - widthHalf;\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = x * udir;\n\t\t\t\t\tvector[ v ] = y * vdir;\n\t\t\t\t\tvector[ w ] = depthHalf;\n\n\t\t\t\t\t// now apply vector to vertex buffer\n\n\t\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// set values to correct vector component\n\n\t\t\t\t\tvector[ u ] = 0;\n\t\t\t\t\tvector[ v ] = 0;\n\t\t\t\t\tvector[ w ] = depth > 0 ? 1 : -1;\n\n\t\t\t\t\t// now apply vector to normal buffer\n\n\t\t\t\t\tnormals.push( vector.x, vector.y, vector.z );\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t\t\t// counters\n\n\t\t\t\t\tvertexCounter += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\t// 1. you need three indices to draw a single face\n\t\t\t// 2. a single segment consists of two faces\n\t\t\t// 3. so we need to generate six (2*3) indices per segment\n\n\t\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\t\tconst a = numberOfVertices + ix + gridX1 * iy;\n\t\t\t\t\tconst b = numberOfVertices + ix + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\t\tconst d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t\t// increase counter\n\n\t\t\t\t\tgroupCount += 6;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, materialIndex );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t\t// update total number of vertices\n\n\t\t\tnumberOfVertices += vertexCounter;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {BoxGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new BoxGeometry( data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments );\n\n\t}\n\n}\n\n/**\n * Provides utility functions for managing uniforms.\n *\n * @module UniformsUtils\n */\n\n/**\n * Clones the given uniform definitions by performing a deep-copy. That means\n * if the value of a uniform refers to an object like a Vector3 or Texture,\n * the cloned uniform will refer to a new object reference.\n *\n * @param {Object} src - An object representing uniform definitions.\n * @return {Object} The cloned uniforms.\n */\nfunction cloneUniforms( src ) {\n\n\tconst dst = {};\n\n\tfor ( const u in src ) {\n\n\t\tdst[ u ] = {};\n\n\t\tfor ( const p in src[ u ] ) {\n\n\t\t\tconst property = src[ u ][ p ];\n\n\t\t\tif ( property && ( property.isColor ||\n\t\t\t\tproperty.isMatrix3 || property.isMatrix4 ||\n\t\t\t\tproperty.isVector2 || property.isVector3 || property.isVector4 ||\n\t\t\t\tproperty.isTexture || property.isQuaternion ) ) {\n\n\t\t\t\tif ( property.isRenderTargetTexture ) {\n\n\t\t\t\t\twarn( 'UniformsUtils: Textures of render targets cannot be cloned via cloneUniforms() or mergeUniforms().' );\n\t\t\t\t\tdst[ u ][ p ] = null;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdst[ u ][ p ] = property.clone();\n\n\t\t\t\t}\n\n\t\t\t} else if ( Array.isArray( property ) ) {\n\n\t\t\t\tdst[ u ][ p ] = property.slice();\n\n\t\t\t} else {\n\n\t\t\t\tdst[ u ][ p ] = property;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn dst;\n\n}\n\n/**\n * Merges the given uniform definitions into a single object. Since the\n * method internally uses cloneUniforms(), it performs a deep-copy when\n * producing the merged uniform definitions.\n *\n * @param {Array} uniforms - An array of objects containing uniform definitions.\n * @return {Object} The merged uniforms.\n */\nfunction mergeUniforms( uniforms ) {\n\n\tconst merged = {};\n\n\tfor ( let u = 0; u < uniforms.length; u ++ ) {\n\n\t\tconst tmp = cloneUniforms( uniforms[ u ] );\n\n\t\tfor ( const p in tmp ) {\n\n\t\t\tmerged[ p ] = tmp[ p ];\n\n\t\t}\n\n\t}\n\n\treturn merged;\n\n}\n\nfunction cloneUniformsGroups( src ) {\n\n\tconst dst = [];\n\n\tfor ( let u = 0; u < src.length; u ++ ) {\n\n\t\tdst.push( src[ u ].clone() );\n\n\t}\n\n\treturn dst;\n\n}\n\nfunction getUnlitUniformColorSpace( renderer ) {\n\n\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\tif ( currentRenderTarget === null ) {\n\n\t\t// https://github.com/mrdoob/three.js/pull/23937#issuecomment-1111067398\n\t\treturn renderer.outputColorSpace;\n\n\t}\n\n\t// https://github.com/mrdoob/three.js/issues/27868\n\tif ( currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\treturn currentRenderTarget.texture.colorSpace;\n\n\t}\n\n\treturn ColorManagement.workingColorSpace;\n\n}\n\n// Legacy\n\nconst UniformsUtils = { clone: cloneUniforms, merge: mergeUniforms };\n\nvar default_vertex = \"void main() {\\n\\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\\n}\";\n\nvar default_fragment = \"void main() {\\n\\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 1.0 );\\n}\";\n\n/**\n * A material rendered with custom shaders. A shader is a small program written in GLSL.\n * that runs on the GPU. You may want to use a custom shader if you need to implement an\n * effect not included with any of the built-in materials.\n *\n * There are the following notes to bear in mind when using a `ShaderMaterial`:\n *\n * - `ShaderMaterial` can only be used with {@link WebGLRenderer}.\n * - Built in attributes and uniforms are passed to the shaders along with your code. If\n * you don't want that, use {@link RawShaderMaterial} instead.\n * - You can use the directive `#pragma unroll_loop_start` and `#pragma unroll_loop_end`\n * in order to unroll a `for` loop in GLSL by the shader preprocessor. The directive has\n * to be placed right above the loop. The loop formatting has to correspond to a defined standard.\n *   - The loop has to be [normalized](https://en.wikipedia.org/wiki/Normalized_loop).\n *   - The loop variable has to be *i*.\n *   - The value `UNROLLED_LOOP_INDEX` will be replaced with the explicitly\n * value of *i* for the given iteration and can be used in preprocessor\n * statements.\n *\n * ```js\n * const material = new THREE.ShaderMaterial( {\n * \tuniforms: {\n * \t\ttime: { value: 1.0 },\n * \t\tresolution: { value: new THREE.Vector2() }\n * \t},\n * \tvertexShader: document.getElementById( 'vertexShader' ).textContent,\n * \tfragmentShader: document.getElementById( 'fragmentShader' ).textContent\n * } );\n * ```\n *\n * @augments Material\n */\nclass ShaderMaterial extends Material {\n\n\t/**\n\t * Constructs a new shader material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isShaderMaterial = true;\n\n\t\tthis.type = 'ShaderMaterial';\n\n\t\t/**\n\t\t * Defines custom constants using `#define` directives within the GLSL code\n\t\t * for both the vertex shader and the fragment shader; each key/value pair\n\t\t * yields another directive.\n\t\t * ```js\n\t\t * defines: {\n\t\t * \tFOO: 15,\n\t\t * \tBAR: true\n\t\t * }\n\t\t * ```\n\t\t * Yields the lines:\n\t\t * ```\n\t\t * #define FOO 15\n\t\t * #define BAR true\n\t\t * ```\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.defines = {};\n\n\t\t/**\n\t\t * An object of the form:\n\t\t * ```js\n\t\t * {\n\t\t * \t\"uniform1\": { value: 1.0 },\n\t\t * \t\"uniform2\": { value: 2 }\n\t\t * }\n\t\t * ```\n\t\t * specifying the uniforms to be passed to the shader code; keys are uniform\n\t\t * names, values are definitions of the form\n\t\t * ```\n\t\t * {\n\t\t * \tvalue: 1.0\n\t\t * }\n\t\t * ```\n\t\t * where `value` is the value of the uniform. Names must match the name of\n\t\t * the uniform, as defined in the GLSL code. Note that uniforms are refreshed\n\t\t * on every frame, so updating the value of the uniform will immediately\n\t\t * update the value available to the GLSL code.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.uniforms = {};\n\n\t\t/**\n\t\t * An array holding uniforms groups for configuring UBOs.\n\t\t *\n\t\t * @type {Array<UniformsGroup>}\n\t\t */\n\t\tthis.uniformsGroups = [];\n\n\t\t/**\n\t\t * Vertex shader GLSL code. This is the actual code for the shader.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.vertexShader = default_vertex;\n\n\t\t/**\n\t\t * Fragment shader GLSL code. This is the actual code for the shader.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.fragmentShader = default_fragment;\n\n\t\t/**\n\t\t * Controls line thickness or lines.\n\t\t *\n\t\t * WebGL and WebGPU ignore this setting and always render line primitives with a\n\t\t * width of one pixel.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.linewidth = 1;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * WebGL and WebGPU ignore this property and always render\n\t\t * 1 pixel wide lines.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines whether the material color is affected by global fog settings; `true`\n\t\t * to pass fog uniforms to the shader.\n\t\t *\n\t\t * Setting this property to `true` requires the definition of fog uniforms. It is\n\t\t * recommended to use `UniformsUtils.merge()` to combine the custom shader uniforms\n\t\t * with predefined fog uniforms.\n\t\t *\n\t\t * ```js\n\t\t * const material = new ShaderMaterial( {\n\t\t *     uniforms: UniformsUtils.merge( [ UniformsLib[ 'fog' ], shaderUniforms ] );\n\t\t *     vertexShader: vertexShader,\n\t\t *     fragmentShader: fragmentShader,\n\t\t *     fog: true\n\t\t * } );\n\t\t * ```\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.fog = false;\n\n\t\t/**\n\t\t * Defines whether this material uses lighting; `true` to pass uniform data\n\t\t * related to lighting to this shader.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.lights = false;\n\n\t\t/**\n\t\t * Defines whether this material supports clipping; `true` to let the renderer\n\t\t * pass the clippingPlanes uniform.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clipping = false;\n\n\t\t/**\n\t\t * Overwritten and set to `true` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.forceSinglePass = true;\n\n\t\t/**\n\t\t * This object allows to enable certain WebGL 2 extensions.\n\t\t *\n\t\t * - clipCullDistance: set to `true` to use vertex shader clipping\n\t\t * - multiDraw: set to `true` to use vertex shader multi_draw / enable gl_DrawID\n\t\t *\n\t\t * @type {{clipCullDistance:false,multiDraw:false}}\n\t\t */\n\t\tthis.extensions = {\n\t\t\tclipCullDistance: false, // set to use vertex shader clipping\n\t\t\tmultiDraw: false // set to use vertex shader multi_draw / enable gl_DrawID\n\t\t};\n\n\t\t/**\n\t\t * When the rendered geometry doesn't include these attributes but the\n\t\t * material does, these default values will be passed to the shaders. This\n\t\t * avoids errors when buffer data is missing.\n\t\t *\n\t\t * - color: [ 1, 1, 1 ]\n\t\t * - uv: [ 0, 0 ]\n\t\t * - uv1: [ 0, 0 ]\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.defaultAttributeValues = {\n\t\t\t'color': [ 1, 1, 1 ],\n\t\t\t'uv': [ 0, 0 ],\n\t\t\t'uv1': [ 0, 0 ]\n\t\t};\n\n\t\t/**\n\t\t * If set, this calls [gl.bindAttribLocation](https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/bindAttribLocation)\n\t\t * to bind a generic vertex index to an attribute variable.\n\t\t *\n\t\t * @type {string|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.index0AttributeName = undefined;\n\n\t\t/**\n\t\t * Can be used to force a uniform update while changing uniforms in\n\t\t * {@link Object3D#onBeforeRender}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.uniformsNeedUpdate = false;\n\n\t\t/**\n\t\t * Defines the GLSL version of custom shader code.\n\t\t *\n\t\t * @type {?(GLSL1|GLSL3)}\n\t\t * @default null\n\t\t */\n\t\tthis.glslVersion = null;\n\n\t\tif ( parameters !== undefined ) {\n\n\t\t\tthis.setValues( parameters );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.fragmentShader = source.fragmentShader;\n\t\tthis.vertexShader = source.vertexShader;\n\n\t\tthis.uniforms = cloneUniforms( source.uniforms );\n\t\tthis.uniformsGroups = cloneUniformsGroups( source.uniformsGroups );\n\n\t\tthis.defines = Object.assign( {}, source.defines );\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.fog = source.fog;\n\t\tthis.lights = source.lights;\n\t\tthis.clipping = source.clipping;\n\n\t\tthis.extensions = Object.assign( {}, source.extensions );\n\n\t\tthis.glslVersion = source.glslVersion;\n\n\t\tthis.defaultAttributeValues = Object.assign( {}, source.defaultAttributeValues );\n\n\t\tthis.index0AttributeName = source.index0AttributeName;\n\n\t\tthis.uniformsNeedUpdate = source.uniformsNeedUpdate;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.glslVersion = this.glslVersion;\n\t\tdata.uniforms = {};\n\n\t\tfor ( const name in this.uniforms ) {\n\n\t\t\tconst uniform = this.uniforms[ name ];\n\t\t\tconst value = uniform.value;\n\n\t\t\tif ( value && value.isTexture ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 't',\n\t\t\t\t\tvalue: value.toJSON( meta ).uuid\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isColor ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'c',\n\t\t\t\t\tvalue: value.getHex()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector2 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v2',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isVector4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'v4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix3 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm3',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else if ( value && value.isMatrix4 ) {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\ttype: 'm4',\n\t\t\t\t\tvalue: value.toArray()\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tdata.uniforms[ name ] = {\n\t\t\t\t\tvalue: value\n\t\t\t\t};\n\n\t\t\t\t// note: the array variants v2v, v3v, v4v, m4v and tv are not supported so far\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( Object.keys( this.defines ).length > 0 ) data.defines = this.defines;\n\n\t\tdata.vertexShader = this.vertexShader;\n\t\tdata.fragmentShader = this.fragmentShader;\n\n\t\tdata.lights = this.lights;\n\t\tdata.clipping = this.clipping;\n\n\t\tconst extensions = {};\n\n\t\tfor ( const key in this.extensions ) {\n\n\t\t\tif ( this.extensions[ key ] === true ) extensions[ key ] = true;\n\n\t\t}\n\n\t\tif ( Object.keys( extensions ).length > 0 ) data.extensions = extensions;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Abstract base class for cameras. This class should always be inherited\n * when you build a new camera.\n *\n * @abstract\n * @augments Object3D\n */\nclass Camera extends Object3D {\n\n\t/**\n\t * Constructs a new camera.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCamera = true;\n\n\t\tthis.type = 'Camera';\n\n\t\t/**\n\t\t * The inverse of the camera's world matrix.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrixWorldInverse = new Matrix4();\n\n\t\t/**\n\t\t * The camera's projection matrix.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.projectionMatrix = new Matrix4();\n\n\t\t/**\n\t\t * The inverse of the camera's projection matrix.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.projectionMatrixInverse = new Matrix4();\n\n\t\t/**\n\t\t * The coordinate system in which the camera is used.\n\t\t *\n\t\t * @type {(WebGLCoordinateSystem|WebGPUCoordinateSystem)}\n\t\t */\n\t\tthis.coordinateSystem = WebGLCoordinateSystem;\n\n\t\tthis._reversedDepth = false;\n\n\t}\n\n\t/**\n\t * The flag that indicates whether the camera uses a reversed depth buffer.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t */\n\tget reversedDepth() {\n\n\t\treturn this._reversedDepth;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\t\tthis.projectionMatrixInverse.copy( source.projectionMatrixInverse );\n\n\t\tthis.coordinateSystem = source.coordinateSystem;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a vector representing the (\"look\") direction of the 3D object in world space.\n\t *\n\t * This method is overwritten since cameras have a different forward vector compared to other\n\t * 3D objects. A camera looks down its local, negative z-axis by default.\n\t *\n\t * @param {Vector3} target - The target vector the result is stored to.\n\t * @return {Vector3} The 3D object's direction in world space.\n\t */\n\tgetWorldDirection( target ) {\n\n\t\treturn super.getWorldDirection( target ).negate();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tsuper.updateWorldMatrix( updateParents, updateChildren );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _v3$1 = /*@__PURE__*/ new Vector3();\nconst _minTarget = /*@__PURE__*/ new Vector2();\nconst _maxTarget = /*@__PURE__*/ new Vector2();\n\n/**\n * Camera that uses [perspective projection](https://en.wikipedia.org/wiki/Perspective_(graphical)).\n *\n * This projection mode is designed to mimic the way the human eye sees. It\n * is the most common projection mode used for rendering a 3D scene.\n *\n * ```js\n * const camera = new THREE.PerspectiveCamera( 45, width / height, 1, 1000 );\n * scene.add( camera );\n * ```\n *\n * @augments Camera\n */\nclass PerspectiveCamera extends Camera {\n\n\t/**\n\t * Constructs a new perspective camera.\n\t *\n\t * @param {number} [fov=50] - The vertical field of view.\n\t * @param {number} [aspect=1] - The aspect ratio.\n\t * @param {number} [near=0.1] - The camera's near plane.\n\t * @param {number} [far=2000] - The camera's far plane.\n\t */\n\tconstructor( fov = 50, aspect = 1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPerspectiveCamera = true;\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\t/**\n\t\t * The vertical field of view, from bottom to top of view,\n\t\t * in degrees.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 50\n\t\t */\n\t\tthis.fov = fov;\n\n\t\t/**\n\t\t * The zoom factor of the camera.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.zoom = 1;\n\n\t\t/**\n\t\t * The camera's near plane. The valid range is greater than `0`\n\t\t * and less than the current value of {@link PerspectiveCamera#far}.\n\t\t *\n\t\t * Note that, unlike for the {@link OrthographicCamera}, `0` is <em>not</em> a\n\t\t * valid value for a perspective camera's near plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.1\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * The camera's far plane. Must be greater than the\n\t\t * current value of {@link PerspectiveCamera#near}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2000\n\t\t */\n\t\tthis.far = far;\n\n\t\t/**\n\t\t * Object distance used for stereoscopy and depth-of-field effects. This\n\t\t * parameter does not influence the projection matrix unless a\n\t\t * {@link StereoCamera} is being used.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.focus = 10;\n\n\t\t/**\n\t\t * The aspect ratio, usually the canvas width / canvas height.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aspect = aspect;\n\n\t\t/**\n\t\t * Represents the frustum window specification. This property should not be edited\n\t\t * directly but via {@link PerspectiveCamera#setViewOffset} and {@link PerspectiveCamera#clearViewOffset}.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.view = null;\n\n\t\t/**\n\t\t * Film size used for the larger axis. Default is `35` (millimeters). This\n\t\t * parameter does not influence the projection matrix unless {@link PerspectiveCamera#filmOffset}\n\t\t * is set to a nonzero value.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 35\n\t\t */\n\t\tthis.filmGauge = 35;\n\n\t\t/**\n\t\t * Horizontal off-center offset in the same unit as {@link PerspectiveCamera#filmGauge}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.filmOffset = 0;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.fov = source.fov;\n\t\tthis.zoom = source.zoom;\n\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\t\tthis.focus = source.focus;\n\n\t\tthis.aspect = source.aspect;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\tthis.filmGauge = source.filmGauge;\n\t\tthis.filmOffset = source.filmOffset;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the FOV by focal length in respect to the current {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * The default film gauge is 35, so that the focal length can be specified for\n\t * a 35mm (full frame) camera.\n\t *\n\t * @param {number} focalLength - Values for focal length and film gauge must have the same unit.\n\t */\n\tsetFocalLength( focalLength ) {\n\n\t\t/** see {@link http://www.bobatkins.com/photography/technical/field_of_view.html} */\n\t\tconst vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\tthis.fov = RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Returns the focal length from the current {@link PerspectiveCamera#fov} and\n\t * {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * @return {number} The computed focal length.\n\t */\n\tgetFocalLength() {\n\n\t\tconst vExtentSlope = Math.tan( DEG2RAD * 0.5 * this.fov );\n\n\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t}\n\n\t/**\n\t * Returns the current vertical field of view angle in degrees considering {@link PerspectiveCamera#zoom}.\n\t *\n\t * @return {number} The effective FOV.\n\t */\n\tgetEffectiveFOV() {\n\n\t\treturn RAD2DEG * 2 * Math.atan(\n\t\t\tMath.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t}\n\n\t/**\n\t * Returns the width of the image on the film. If {@link PerspectiveCamera#aspect} is greater than or\n\t * equal to one (landscape format), the result equals {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * @return {number} The film width.\n\t */\n\tgetFilmWidth() {\n\n\t\t// film not completely covered in portrait format (aspect < 1)\n\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t}\n\n\t/**\n\t * Returns the height of the image on the film. If {@link PerspectiveCamera#aspect} is greater than or\n\t * equal to one (landscape format), the result equals {@link PerspectiveCamera#filmGauge}.\n\t *\n\t * @return {number} The film width.\n\t */\n\tgetFilmHeight() {\n\n\t\t// film not completely covered in landscape format (aspect > 1)\n\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t}\n\n\t/**\n\t * Computes the 2D bounds of the camera's viewable rectangle at a given distance along the viewing direction.\n\t * Sets `minTarget` and `maxTarget` to the coordinates of the lower-left and upper-right corners of the view rectangle.\n\t *\n\t * @param {number} distance - The viewing distance.\n\t * @param {Vector2} minTarget - The lower-left corner of the view rectangle is written into this vector.\n\t * @param {Vector2} maxTarget - The upper-right corner of the view rectangle is written into this vector.\n\t */\n\tgetViewBounds( distance, minTarget, maxTarget ) {\n\n\t\t_v3$1.set( -1, -1, 0.5 ).applyMatrix4( this.projectionMatrixInverse );\n\n\t\tminTarget.set( _v3$1.x, _v3$1.y ).multiplyScalar( - distance / _v3$1.z );\n\n\t\t_v3$1.set( 1, 1, 0.5 ).applyMatrix4( this.projectionMatrixInverse );\n\n\t\tmaxTarget.set( _v3$1.x, _v3$1.y ).multiplyScalar( - distance / _v3$1.z );\n\n\t}\n\n\t/**\n\t * Computes the width and height of the camera's viewable rectangle at a given distance along the viewing direction.\n\t *\n\t * @param {number} distance - The viewing distance.\n\t * @param {Vector2} target - The target vector that is used to store result where x is width and y is height.\n\t * @returns {Vector2} The view size.\n\t */\n\tgetViewSize( distance, target ) {\n\n\t\tthis.getViewBounds( distance, _minTarget, _maxTarget );\n\n\t\treturn target.subVectors( _maxTarget, _minTarget );\n\n\t}\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t * the monitors are in grid like this\n\t *```\n\t *   +---+---+---+\n\t *   | A | B | C |\n\t *   +---+---+---+\n\t *   | D | E | F |\n\t *   +---+---+---+\n\t *```\n\t * then for each monitor you would call it like this:\n\t *```js\n\t * const w = 1920;\n\t * const h = 1080;\n\t * const fullWidth = w * 3;\n\t * const fullHeight = h * 2;\n\t *\n\t * // --A--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t * // --B--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t * // --C--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t * // --D--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t * // --E--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t * // --F--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t * ```\n\t *\n\t * Note there is no reason monitors have to be the same size or in a grid.\n\t *\n\t * @param {number} fullWidth - The full width of multiview setup.\n\t * @param {number} fullHeight - The full height of multiview setup.\n\t * @param {number} x - The horizontal offset of the subcamera.\n\t * @param {number} y - The vertical offset of the subcamera.\n\t * @param {number} width - The width of subcamera.\n\t * @param {number} height - The height of subcamera.\n\t */\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Removes the view offset from the projection matrix.\n\t */\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Updates the camera's projection matrix. Must be called after any change of\n\t * camera properties.\n\t */\n\tupdateProjectionMatrix() {\n\n\t\tconst near = this.near;\n\t\tlet top = near * Math.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom;\n\t\tlet height = 2 * top;\n\t\tlet width = this.aspect * height;\n\t\tlet left = -0.5 * width;\n\t\tconst view = this.view;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst fullWidth = view.fullWidth,\n\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\twidth *= view.width / fullWidth;\n\t\t\theight *= view.height / fullHeight;\n\n\t\t}\n\n\t\tconst skew = this.filmOffset;\n\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far, this.coordinateSystem, this.reversedDepth );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.fov = this.fov;\n\t\tdata.object.zoom = this.zoom;\n\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\t\tdata.object.focus = this.focus;\n\n\t\tdata.object.aspect = this.aspect;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\tdata.object.filmGauge = this.filmGauge;\n\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst fov = -90; // negative fov is not an error\nconst aspect = 1;\n\n/**\n * A special type of camera that is positioned in 3D space to render its surroundings into a\n * cube render target. The render target can then be used as an environment map for rendering\n * realtime reflections in your scene.\n *\n * ```js\n * // Create cube render target\n * const cubeRenderTarget = new THREE.WebGLCubeRenderTarget( 256, { generateMipmaps: true, minFilter: THREE.LinearMipmapLinearFilter } );\n *\n * // Create cube camera\n * const cubeCamera = new THREE.CubeCamera( 1, 100000, cubeRenderTarget );\n * scene.add( cubeCamera );\n *\n * // Create car\n * const chromeMaterial = new THREE.MeshLambertMaterial( { color: 0xffffff, envMap: cubeRenderTarget.texture } );\n * const car = new THREE.Mesh( carGeometry, chromeMaterial );\n * scene.add( car );\n *\n * // Update the render target cube\n * car.visible = false;\n * cubeCamera.position.copy( car.position );\n * cubeCamera.update( renderer, scene );\n *\n * // Render the scene\n * car.visible = true;\n * renderer.render( scene, camera );\n * ```\n *\n * @augments Object3D\n */\nclass CubeCamera extends Object3D {\n\n\t/**\n\t * Constructs a new cube camera.\n\t *\n\t * @param {number} near - The camera's near plane.\n\t * @param {number} far - The camera's far plane.\n\t * @param {WebGLCubeRenderTarget} renderTarget - The cube render target.\n\t */\n\tconstructor( near, far, renderTarget ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CubeCamera';\n\n\t\t/**\n\t\t * A reference to the cube render target.\n\t\t *\n\t\t * @type {WebGLCubeRenderTarget}\n\t\t */\n\t\tthis.renderTarget = renderTarget;\n\n\t\t/**\n\t\t * The current active coordinate system.\n\t\t *\n\t\t * @type {?(WebGLCoordinateSystem|WebGPUCoordinateSystem)}\n\t\t * @default null\n\t\t */\n\t\tthis.coordinateSystem = null;\n\n\t\t/**\n\t\t * The current active mipmap level\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.activeMipmapLevel = 0;\n\n\t\tconst cameraPX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPX.layers = this.layers;\n\t\tthis.add( cameraPX );\n\n\t\tconst cameraNX = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNX.layers = this.layers;\n\t\tthis.add( cameraNX );\n\n\t\tconst cameraPY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPY.layers = this.layers;\n\t\tthis.add( cameraPY );\n\n\t\tconst cameraNY = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNY.layers = this.layers;\n\t\tthis.add( cameraNY );\n\n\t\tconst cameraPZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraPZ.layers = this.layers;\n\t\tthis.add( cameraPZ );\n\n\t\tconst cameraNZ = new PerspectiveCamera( fov, aspect, near, far );\n\t\tcameraNZ.layers = this.layers;\n\t\tthis.add( cameraNZ );\n\n\t}\n\n\t/**\n\t * Must be called when the coordinate system of the cube camera is changed.\n\t */\n\tupdateCoordinateSystem() {\n\n\t\tconst coordinateSystem = this.coordinateSystem;\n\n\t\tconst cameras = this.children.concat();\n\n\t\tconst [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = cameras;\n\n\t\tfor ( const camera of cameras ) this.remove( camera );\n\n\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\tcameraPX.up.set( 0, 1, 0 );\n\t\t\tcameraPX.lookAt( 1, 0, 0 );\n\n\t\t\tcameraNX.up.set( 0, 1, 0 );\n\t\t\tcameraNX.lookAt( -1, 0, 0 );\n\n\t\t\tcameraPY.up.set( 0, 0, -1 );\n\t\t\tcameraPY.lookAt( 0, 1, 0 );\n\n\t\t\tcameraNY.up.set( 0, 0, 1 );\n\t\t\tcameraNY.lookAt( 0, -1, 0 );\n\n\t\t\tcameraPZ.up.set( 0, 1, 0 );\n\t\t\tcameraPZ.lookAt( 0, 0, 1 );\n\n\t\t\tcameraNZ.up.set( 0, 1, 0 );\n\t\t\tcameraNZ.lookAt( 0, 0, -1 );\n\n\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\tcameraPX.up.set( 0, -1, 0 );\n\t\t\tcameraPX.lookAt( -1, 0, 0 );\n\n\t\t\tcameraNX.up.set( 0, -1, 0 );\n\t\t\tcameraNX.lookAt( 1, 0, 0 );\n\n\t\t\tcameraPY.up.set( 0, 0, 1 );\n\t\t\tcameraPY.lookAt( 0, 1, 0 );\n\n\t\t\tcameraNY.up.set( 0, 0, -1 );\n\t\t\tcameraNY.lookAt( 0, -1, 0 );\n\n\t\t\tcameraPZ.up.set( 0, -1, 0 );\n\t\t\tcameraPZ.lookAt( 0, 0, 1 );\n\n\t\t\tcameraNZ.up.set( 0, -1, 0 );\n\t\t\tcameraNZ.lookAt( 0, 0, -1 );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.CubeCamera.updateCoordinateSystem(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t}\n\n\t\tfor ( const camera of cameras ) {\n\n\t\t\tthis.add( camera );\n\n\t\t\tcamera.updateMatrixWorld();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Calling this method will render the given scene with the given renderer\n\t * into the cube render target of the camera.\n\t *\n\t * @param {(Renderer|WebGLRenderer)} renderer - The renderer.\n\t * @param {Scene} scene - The scene to render.\n\t */\n\tupdate( renderer, scene ) {\n\n\t\tif ( this.parent === null ) this.updateMatrixWorld();\n\n\t\tconst { renderTarget, activeMipmapLevel } = this;\n\n\t\tif ( this.coordinateSystem !== renderer.coordinateSystem ) {\n\n\t\t\tthis.coordinateSystem = renderer.coordinateSystem;\n\n\t\t\tthis.updateCoordinateSystem();\n\n\t\t}\n\n\t\tconst [ cameraPX, cameraNX, cameraPY, cameraNY, cameraPZ, cameraNZ ] = this.children;\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst currentActiveCubeFace = renderer.getActiveCubeFace();\n\t\tconst currentActiveMipmapLevel = renderer.getActiveMipmapLevel();\n\n\t\tconst currentXrEnabled = renderer.xr.enabled;\n\n\t\trenderer.xr.enabled = false;\n\n\t\tconst generateMipmaps = renderTarget.texture.generateMipmaps;\n\n\t\trenderTarget.texture.generateMipmaps = false;\n\n\t\trenderer.setRenderTarget( renderTarget, 0, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPX );\n\n\t\trenderer.setRenderTarget( renderTarget, 1, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNX );\n\n\t\trenderer.setRenderTarget( renderTarget, 2, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPY );\n\n\t\trenderer.setRenderTarget( renderTarget, 3, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNY );\n\n\t\trenderer.setRenderTarget( renderTarget, 4, activeMipmapLevel );\n\t\trenderer.render( scene, cameraPZ );\n\n\t\t// mipmaps are generated during the last call of render()\n\t\t// at this point, all sides of the cube render target are defined\n\n\t\trenderTarget.texture.generateMipmaps = generateMipmaps;\n\n\t\trenderer.setRenderTarget( renderTarget, 5, activeMipmapLevel );\n\t\trenderer.render( scene, cameraNZ );\n\n\t\trenderer.setRenderTarget( currentRenderTarget, currentActiveCubeFace, currentActiveMipmapLevel );\n\n\t\trenderer.xr.enabled = currentXrEnabled;\n\n\t\trenderTarget.texture.needsPMREMUpdate = true;\n\n\t}\n\n}\n\n/**\n * Creates a cube texture made up of six images.\n *\n * ```js\n * const loader = new THREE.CubeTextureLoader();\n * loader.setPath( 'textures/cube/pisa/' );\n *\n * const textureCube = loader.load( [\n * \t'px.png', 'nx.png', 'py.png', 'ny.png', 'pz.png', 'nz.png'\n * ] );\n *\n * const material = new THREE.MeshBasicMaterial( { color: 0xffffff, envMap: textureCube } );\n * ```\n *\n * @augments Texture\n */\nclass CubeTexture extends Texture {\n\n\t/**\n\t * Constructs a new cube texture.\n\t *\n\t * @param {Array<Image>} [images=[]] - An array holding a image for each side of a cube.\n\t * @param {number} [mapping=CubeReflectionMapping] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space value.\n\t */\n\tconstructor( images = [], mapping = CubeReflectionMapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace ) {\n\n\t\tsuper( images, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubeTexture = true;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t}\n\n\t/**\n\t * Alias for {@link CubeTexture#image}.\n\t *\n\t * @type {Array<Image>}\n\t */\n\tget images() {\n\n\t\treturn this.image;\n\n\t}\n\n\tset images( value ) {\n\n\t\tthis.image = value;\n\n\t}\n\n}\n\n/**\n * A cube render target used in context of {@link WebGLRenderer}.\n *\n * @augments WebGLRenderTarget\n */\nclass WebGLCubeRenderTarget extends WebGLRenderTarget {\n\n\t/**\n\t * Constructs a new cube render target.\n\t *\n\t * @param {number} [size=1] - The size of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( size = 1, options = {} ) {\n\n\t\tsuper( size, size, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLCubeRenderTarget = true;\n\n\t\tconst image = { width: size, height: size, depth: 1 };\n\t\tconst images = [ image, image, image, image, image, image ];\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {DataArrayTexture}\n\t\t */\n\t\tthis.texture = new CubeTexture( images );\n\t\tthis._setTextureOptions( options );\n\n\t\t// By convention -- likely based on the RenderMan spec from the 1990's -- cube maps are specified by WebGL (and three.js)\n\t\t// in a coordinate system in which positive-x is to the right when looking up the positive-z axis -- in other words,\n\t\t// in a left-handed coordinate system. By continuing this convention, preexisting cube maps continued to render correctly.\n\n\t\t// three.js uses a right-handed coordinate system. So environment maps used in three.js appear to have px and nx swapped\n\t\t// and the flag isRenderTargetTexture controls this conversion. The flip is not required when using WebGLCubeRenderTarget.texture\n\t\t// as a cube texture (this is detected when isRenderTargetTexture is set to true for cube textures).\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n\t/**\n\t * Converts the given equirectangular texture to a cube map.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {Texture} texture - The equirectangular texture.\n\t * @return {WebGLCubeRenderTarget} A reference to this cube render target.\n\t */\n\tfromEquirectangularTexture( renderer, texture ) {\n\n\t\tthis.texture.type = texture.type;\n\t\tthis.texture.colorSpace = texture.colorSpace;\n\n\t\tthis.texture.generateMipmaps = texture.generateMipmaps;\n\t\tthis.texture.minFilter = texture.minFilter;\n\t\tthis.texture.magFilter = texture.magFilter;\n\n\t\tconst shader = {\n\n\t\t\tuniforms: {\n\t\t\t\ttEquirect: { value: null },\n\t\t\t},\n\n\t\t\tvertexShader: /* glsl */`\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\tvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\n\n\t\t\t\t\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvWorldDirection = transformDirection( position, modelMatrix );\n\n\t\t\t\t\t#include <begin_vertex>\n\t\t\t\t\t#include <project_vertex>\n\n\t\t\t\t}\n\t\t\t`,\n\n\t\t\tfragmentShader: /* glsl */`\n\n\t\t\t\tuniform sampler2D tEquirect;\n\n\t\t\t\tvarying vec3 vWorldDirection;\n\n\t\t\t\t#include <common>\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 direction = normalize( vWorldDirection );\n\n\t\t\t\t\tvec2 sampleUV = equirectUv( direction );\n\n\t\t\t\t\tgl_FragColor = texture2D( tEquirect, sampleUV );\n\n\t\t\t\t}\n\t\t\t`\n\t\t};\n\n\t\tconst geometry = new BoxGeometry( 5, 5, 5 );\n\n\t\tconst material = new ShaderMaterial( {\n\n\t\t\tname: 'CubemapFromEquirect',\n\n\t\t\tuniforms: cloneUniforms( shader.uniforms ),\n\t\t\tvertexShader: shader.vertexShader,\n\t\t\tfragmentShader: shader.fragmentShader,\n\t\t\tside: BackSide,\n\t\t\tblending: NoBlending\n\n\t\t} );\n\n\t\tmaterial.uniforms.tEquirect.value = texture;\n\n\t\tconst mesh = new Mesh( geometry, material );\n\n\t\tconst currentMinFilter = texture.minFilter;\n\n\t\t// Avoid blurred poles\n\t\tif ( texture.minFilter === LinearMipmapLinearFilter ) texture.minFilter = LinearFilter;\n\n\t\tconst camera = new CubeCamera( 1, 10, this );\n\t\tcamera.update( renderer, mesh );\n\n\t\ttexture.minFilter = currentMinFilter;\n\n\t\tmesh.geometry.dispose();\n\t\tmesh.material.dispose();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Clears this cube render target.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {boolean} [color=true] - Whether the color buffer should be cleared or not.\n\t * @param {boolean} [depth=true] - Whether the depth buffer should be cleared or not.\n\t * @param {boolean} [stencil=true] - Whether the stencil buffer should be cleared or not.\n\t */\n\tclear( renderer, color = true, depth = true, stencil = true ) {\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\trenderer.setRenderTarget( this, i );\n\n\t\t\trenderer.clear( color, depth, stencil );\n\n\t\t}\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t}\n\n}\n\n/**\n * This is almost identical to an {@link Object3D}. Its purpose is to\n * make working with groups of objects syntactically clearer.\n *\n * ```js\n * // Create a group and add the two cubes.\n * // These cubes can now be rotated / scaled etc as a group.\n * const group = new THREE.Group();\n *\n * group.add( meshA );\n * group.add( meshB );\n *\n * scene.add( group );\n * ```\n *\n * @augments Object3D\n */\nclass Group extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isGroup = true;\n\n\t\tthis.type = 'Group';\n\n\t}\n\n}\n\nconst _moveEvent = { type: 'move' };\n\n/**\n * Class for representing a XR controller with its\n * different coordinate systems.\n *\n * @private\n */\nclass WebXRController {\n\n\t/**\n\t * Constructs a new XR controller.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * A group representing the target ray space\n\t\t * of the XR controller.\n\t\t *\n\t\t * @private\n\t\t * @type {?Group}\n\t\t * @default null\n\t\t */\n\t\tthis._targetRay = null;\n\n\t\t/**\n\t\t * A group representing the grip space\n\t\t * of the XR controller.\n\t\t *\n\t\t * @private\n\t\t * @type {?Group}\n\t\t * @default null\n\t\t */\n\t\tthis._grip = null;\n\n\t\t/**\n\t\t * A group representing the hand space\n\t\t * of the XR controller.\n\t\t *\n\t\t * @private\n\t\t * @type {?Group}\n\t\t * @default null\n\t\t */\n\t\tthis._hand = null;\n\n\t}\n\n\t/**\n\t * Returns a group representing the hand space of the XR controller.\n\t *\n\t * @return {Group} A group representing the hand space of the XR controller.\n\t */\n\tgetHandSpace() {\n\n\t\tif ( this._hand === null ) {\n\n\t\t\tthis._hand = new Group();\n\t\t\tthis._hand.matrixAutoUpdate = false;\n\t\t\tthis._hand.visible = false;\n\n\t\t\tthis._hand.joints = {};\n\t\t\tthis._hand.inputState = { pinching: false };\n\n\t\t}\n\n\t\treturn this._hand;\n\n\t}\n\n\t/**\n\t * Returns a group representing the target ray space of the XR controller.\n\t *\n\t * @return {Group} A group representing the target ray space of the XR controller.\n\t */\n\tgetTargetRaySpace() {\n\n\t\tif ( this._targetRay === null ) {\n\n\t\t\tthis._targetRay = new Group();\n\t\t\tthis._targetRay.matrixAutoUpdate = false;\n\t\t\tthis._targetRay.visible = false;\n\t\t\tthis._targetRay.hasLinearVelocity = false;\n\t\t\tthis._targetRay.linearVelocity = new Vector3();\n\t\t\tthis._targetRay.hasAngularVelocity = false;\n\t\t\tthis._targetRay.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._targetRay;\n\n\t}\n\n\t/**\n\t * Returns a group representing the grip space of the XR controller.\n\t *\n\t * @return {Group} A group representing the grip space of the XR controller.\n\t */\n\tgetGripSpace() {\n\n\t\tif ( this._grip === null ) {\n\n\t\t\tthis._grip = new Group();\n\t\t\tthis._grip.matrixAutoUpdate = false;\n\t\t\tthis._grip.visible = false;\n\t\t\tthis._grip.hasLinearVelocity = false;\n\t\t\tthis._grip.linearVelocity = new Vector3();\n\t\t\tthis._grip.hasAngularVelocity = false;\n\t\t\tthis._grip.angularVelocity = new Vector3();\n\n\t\t}\n\n\t\treturn this._grip;\n\n\t}\n\n\t/**\n\t * Dispatches the given event to the groups representing\n\t * the different coordinate spaces of the XR controller.\n\t *\n\t * @param {Object} event - The event to dispatch.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tdispatchEvent( event ) {\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.dispatchEvent( event );\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.dispatchEvent( event );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Connects the controller with the given XR input source.\n\t *\n\t * @param {XRInputSource} inputSource - The input source.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tconnect( inputSource ) {\n\n\t\tif ( inputSource && inputSource.hand ) {\n\n\t\t\tconst hand = this._hand;\n\n\t\t\tif ( hand ) {\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Initialize hand with joints when connected\n\t\t\t\t\tthis._getHandJoint( hand, inputjoint );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.dispatchEvent( { type: 'connected', data: inputSource } );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Disconnects the controller from the given XR input source.\n\t *\n\t * @param {XRInputSource} inputSource - The input source.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tdisconnect( inputSource ) {\n\n\t\tthis.dispatchEvent( { type: 'disconnected', data: inputSource } );\n\n\t\tif ( this._targetRay !== null ) {\n\n\t\t\tthis._targetRay.visible = false;\n\n\t\t}\n\n\t\tif ( this._grip !== null ) {\n\n\t\t\tthis._grip.visible = false;\n\n\t\t}\n\n\t\tif ( this._hand !== null ) {\n\n\t\t\tthis._hand.visible = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Updates the controller with the given input source, XR frame and reference space.\n\t * This updates the transformations of the groups that represent the different\n\t * coordinate systems of the controller.\n\t *\n\t * @param {XRInputSource} inputSource - The input source.\n\t * @param {XRFrame} frame - The XR frame.\n\t * @param {XRReferenceSpace} referenceSpace - The reference space.\n\t * @return {WebXRController} A reference to this instance.\n\t */\n\tupdate( inputSource, frame, referenceSpace ) {\n\n\t\tlet inputPose = null;\n\t\tlet gripPose = null;\n\t\tlet handPose = null;\n\n\t\tconst targetRay = this._targetRay;\n\t\tconst grip = this._grip;\n\t\tconst hand = this._hand;\n\n\t\tif ( inputSource && frame.session.visibilityState !== 'visible-blurred' ) {\n\n\t\t\tif ( hand && inputSource.hand ) {\n\n\t\t\t\thandPose = true;\n\n\t\t\t\tfor ( const inputjoint of inputSource.hand.values() ) {\n\n\t\t\t\t\t// Update the joints groups with the XRJoint poses\n\t\t\t\t\tconst jointPose = frame.getJointPose( inputjoint, referenceSpace );\n\n\t\t\t\t\t// The transform of this joint will be updated with the joint pose on each frame\n\t\t\t\t\tconst joint = this._getHandJoint( hand, inputjoint );\n\n\t\t\t\t\tif ( jointPose !== null ) {\n\n\t\t\t\t\t\tjoint.matrix.fromArray( jointPose.transform.matrix );\n\t\t\t\t\t\tjoint.matrix.decompose( joint.position, joint.rotation, joint.scale );\n\t\t\t\t\t\tjoint.matrixWorldNeedsUpdate = true;\n\t\t\t\t\t\tjoint.jointRadius = jointPose.radius;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tjoint.visible = jointPose !== null;\n\n\t\t\t\t}\n\n\t\t\t\t// Custom events\n\n\t\t\t\t// Check pinchz\n\t\t\t\tconst indexTip = hand.joints[ 'index-finger-tip' ];\n\t\t\t\tconst thumbTip = hand.joints[ 'thumb-tip' ];\n\t\t\t\tconst distance = indexTip.position.distanceTo( thumbTip.position );\n\n\t\t\t\tconst distanceToPinch = 0.02;\n\t\t\t\tconst threshold = 0.005;\n\n\t\t\t\tif ( hand.inputState.pinching && distance > distanceToPinch + threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = false;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchend',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t} else if ( ! hand.inputState.pinching && distance <= distanceToPinch - threshold ) {\n\n\t\t\t\t\thand.inputState.pinching = true;\n\t\t\t\t\tthis.dispatchEvent( {\n\t\t\t\t\t\ttype: 'pinchstart',\n\t\t\t\t\t\thandedness: inputSource.handedness,\n\t\t\t\t\t\ttarget: this\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( grip !== null && inputSource.gripSpace ) {\n\n\t\t\t\t\tgripPose = frame.getPose( inputSource.gripSpace, referenceSpace );\n\n\t\t\t\t\tif ( gripPose !== null ) {\n\n\t\t\t\t\t\tgrip.matrix.fromArray( gripPose.transform.matrix );\n\t\t\t\t\t\tgrip.matrix.decompose( grip.position, grip.rotation, grip.scale );\n\t\t\t\t\t\tgrip.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t\t\tif ( gripPose.linearVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = true;\n\t\t\t\t\t\t\tgrip.linearVelocity.copy( gripPose.linearVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasLinearVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( gripPose.angularVelocity ) {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = true;\n\t\t\t\t\t\t\tgrip.angularVelocity.copy( gripPose.angularVelocity );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgrip.hasAngularVelocity = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( targetRay !== null ) {\n\n\t\t\t\tinputPose = frame.getPose( inputSource.targetRaySpace, referenceSpace );\n\n\t\t\t\t// Some runtimes (namely Vive Cosmos with Vive OpenXR Runtime) have only grip space and ray space is equal to it\n\t\t\t\tif ( inputPose === null && gripPose !== null ) {\n\n\t\t\t\t\tinputPose = gripPose;\n\n\t\t\t\t}\n\n\t\t\t\tif ( inputPose !== null ) {\n\n\t\t\t\t\ttargetRay.matrix.fromArray( inputPose.transform.matrix );\n\t\t\t\t\ttargetRay.matrix.decompose( targetRay.position, targetRay.rotation, targetRay.scale );\n\t\t\t\t\ttargetRay.matrixWorldNeedsUpdate = true;\n\n\t\t\t\t\tif ( inputPose.linearVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = true;\n\t\t\t\t\t\ttargetRay.linearVelocity.copy( inputPose.linearVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasLinearVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( inputPose.angularVelocity ) {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = true;\n\t\t\t\t\t\ttargetRay.angularVelocity.copy( inputPose.angularVelocity );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttargetRay.hasAngularVelocity = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.dispatchEvent( _moveEvent );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t}\n\n\t\tif ( targetRay !== null ) {\n\n\t\t\ttargetRay.visible = ( inputPose !== null );\n\n\t\t}\n\n\t\tif ( grip !== null ) {\n\n\t\t\tgrip.visible = ( gripPose !== null );\n\n\t\t}\n\n\t\tif ( hand !== null ) {\n\n\t\t\thand.visible = ( handPose !== null );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a group representing the hand joint for the given input joint.\n\t *\n\t * @private\n\t * @param {Group} hand - The group representing the hand space.\n\t * @param {XRJointSpace} inputjoint - The hand joint data.\n\t * @return {Group} A group representing the hand joint for the given input joint.\n\t */\n\t_getHandJoint( hand, inputjoint ) {\n\n\t\tif ( hand.joints[ inputjoint.jointName ] === undefined ) {\n\n\t\t\tconst joint = new Group();\n\t\t\tjoint.matrixAutoUpdate = false;\n\t\t\tjoint.visible = false;\n\t\t\thand.joints[ inputjoint.jointName ] = joint;\n\n\t\t\thand.add( joint );\n\n\t\t}\n\n\t\treturn hand.joints[ inputjoint.jointName ];\n\n\t}\n\n}\n\n/**\n * This class can be used to define an exponential squared fog,\n * which gives a clear view near the camera and a faster than exponentially\n * densening fog farther from the camera.\n *\n * ```js\n * const scene = new THREE.Scene();\n * scene.fog = new THREE.FogExp2( 0xcccccc, 0.002 );\n * ```\n */\nclass FogExp2 {\n\n\t/**\n\t * Constructs a new fog.\n\t *\n\t * @param {number|Color} color - The fog's color.\n\t * @param {number} [density=0.00025] - Defines how fast the fog will grow dense.\n\t */\n\tconstructor( color, density = 0.00025 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isFogExp2 = true;\n\n\t\t/**\n\t\t * The name of the fog.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The fog's color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color( color );\n\n\t\t/**\n\t\t *  Defines how fast the fog will grow dense.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.00025\n\t\t */\n\t\tthis.density = density;\n\n\t}\n\n\t/**\n\t * Returns a new fog with copied values from this instance.\n\t *\n\t * @return {FogExp2} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new FogExp2( this.color, this.density );\n\n\t}\n\n\t/**\n\t * Serializes the fog into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized fog\n\t */\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'FogExp2',\n\t\t\tname: this.name,\n\t\t\tcolor: this.color.getHex(),\n\t\t\tdensity: this.density\n\t\t};\n\n\t}\n\n}\n\n/**\n * This class can be used to define a linear fog that grows linearly denser\n * with the distance.\n *\n * ```js\n * const scene = new THREE.Scene();\n * scene.fog = new THREE.Fog( 0xcccccc, 10, 15 );\n * ```\n */\nclass Fog {\n\n\t/**\n\t * Constructs a new fog.\n\t *\n\t * @param {number|Color} color - The fog's color.\n\t * @param {number} [near=1] - The minimum distance to start applying fog.\n\t * @param {number} [far=1000] - The maximum distance at which fog stops being calculated and applied.\n\t */\n\tconstructor( color, near = 1, far = 1000 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isFog = true;\n\n\t\t/**\n\t\t * The name of the fog.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The fog's color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color( color );\n\n\t\t/**\n\t\t * The minimum distance to start applying fog. Objects that are less than\n\t\t * `near` units from the active camera won't be affected by fog.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * The maximum distance at which fog stops being calculated and applied.\n\t\t * Objects that are more than `far` units away from the active camera won't\n\t\t * be affected by fog.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1000\n\t\t */\n\t\tthis.far = far;\n\n\t}\n\n\t/**\n\t * Returns a new fog with copied values from this instance.\n\t *\n\t * @return {Fog} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Fog( this.color, this.near, this.far );\n\n\t}\n\n\t/**\n\t * Serializes the fog into JSON.\n\t *\n\t * @param {?(Object|string)} meta - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized fog\n\t */\n\ttoJSON( /* meta */ ) {\n\n\t\treturn {\n\t\t\ttype: 'Fog',\n\t\t\tname: this.name,\n\t\t\tcolor: this.color.getHex(),\n\t\t\tnear: this.near,\n\t\t\tfar: this.far\n\t\t};\n\n\t}\n\n}\n\n/**\n * Scenes allow you to set up what is to be rendered and where by three.js.\n * This is where you place 3D objects like meshes, lines or lights.\n *\n * @augments Object3D\n */\nclass Scene extends Object3D {\n\n\t/**\n\t * Constructs a new scene.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isScene = true;\n\n\t\tthis.type = 'Scene';\n\n\t\t/**\n\t\t * Defines the background of the scene. Valid inputs are:\n\t\t *\n\t\t * - A color for defining a uniform colored background.\n\t\t * - A texture for defining a (flat) textured background.\n\t\t * - Cube textures or equirectangular textures for defining a skybox.\n\t\t *\n\t\t * @type {?(Color|Texture)}\n\t\t * @default null\n\t\t */\n\t\tthis.background = null;\n\n\t\t/**\n\t\t * Sets the environment map for all physical materials in the scene. However,\n\t\t * it's not possible to overwrite an existing texture assigned to the `envMap`\n\t\t * material property.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.environment = null;\n\n\t\t/**\n\t\t * A fog instance defining the type of fog that affects everything\n\t\t * rendered in the scene.\n\t\t *\n\t\t * @type {?(Fog|FogExp2)}\n\t\t * @default null\n\t\t */\n\t\tthis.fog = null;\n\n\t\t/**\n\t\t * Sets the blurriness of the background. Only influences environment maps\n\t\t * assigned to {@link Scene#background}. Valid input is a float between `0`\n\t\t * and `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.backgroundBlurriness = 0;\n\n\t\t/**\n\t\t * Attenuates the color of the background. Only applies to background textures.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.backgroundIntensity = 1;\n\n\t\t/**\n\t\t * The rotation of the background in radians. Only influences environment maps\n\t\t * assigned to {@link Scene#background}.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.backgroundRotation = new Euler();\n\n\t\t/**\n\t\t * Attenuates the color of the environment. Only influences environment maps\n\t\t * assigned to {@link Scene#environment}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.environmentIntensity = 1;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians. Only influences physical materials\n\t\t * in the scene when {@link Scene#environment} is used.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.environmentRotation = new Euler();\n\n\t\t/**\n\t\t * Forces everything in the scene to be rendered with the defined material. It is possible\n\t\t * to exclude materials from override by setting {@link Material#allowOverride} to `false`.\n\t\t *\n\t\t * @type {?Material}\n\t\t * @default null\n\t\t */\n\t\tthis.overrideMaterial = null;\n\n\t\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.background !== null ) this.background = source.background.clone();\n\t\tif ( source.environment !== null ) this.environment = source.environment.clone();\n\t\tif ( source.fog !== null ) this.fog = source.fog.clone();\n\n\t\tthis.backgroundBlurriness = source.backgroundBlurriness;\n\t\tthis.backgroundIntensity = source.backgroundIntensity;\n\t\tthis.backgroundRotation.copy( source.backgroundRotation );\n\n\t\tthis.environmentIntensity = source.environmentIntensity;\n\t\tthis.environmentRotation.copy( source.environmentRotation );\n\n\t\tif ( source.overrideMaterial !== null ) this.overrideMaterial = source.overrideMaterial.clone();\n\n\t\tthis.matrixAutoUpdate = source.matrixAutoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.fog !== null ) data.object.fog = this.fog.toJSON();\n\n\t\tif ( this.backgroundBlurriness > 0 ) data.object.backgroundBlurriness = this.backgroundBlurriness;\n\t\tif ( this.backgroundIntensity !== 1 ) data.object.backgroundIntensity = this.backgroundIntensity;\n\t\tdata.object.backgroundRotation = this.backgroundRotation.toArray();\n\n\t\tif ( this.environmentIntensity !== 1 ) data.object.environmentIntensity = this.environmentIntensity;\n\t\tdata.object.environmentRotation = this.environmentRotation.toArray();\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * \"Interleaved\" means that multiple attributes, possibly of different types,\n * (e.g., position, normal, uv, color) are packed into a single array buffer.\n *\n * An introduction into interleaved arrays can be found here: [Interleaved array basics](https://blog.tojicode.com/2011/05/interleaved-array-basics.html)\n */\nclass InterleavedBuffer {\n\n\t/**\n\t * Constructs a new interleaved buffer.\n\t *\n\t * @param {TypedArray} array - A typed array with a shared buffer storing attribute data.\n\t * @param {number} stride - The number of typed-array elements per vertex.\n\t */\n\tconstructor( array, stride ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInterleavedBuffer = true;\n\n\t\t/**\n\t\t * A typed array with a shared buffer storing attribute data.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.array = array;\n\n\t\t/**\n\t\t * The number of typed-array elements per vertex.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.stride = stride;\n\n\t\t/**\n\t\t * The total number of elements in the array\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tthis.count = array !== undefined ? array.length / stride : 0;\n\n\t\t/**\n\t\t * Defines the intended usage pattern of the data store for optimization purposes.\n\t\t *\n\t\t * Note: After the initial use of a buffer, its usage cannot be changed. Instead,\n\t\t * instantiate a new one and set the desired usage before the next render.\n\t\t *\n\t\t * @type {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)}\n\t\t * @default StaticDrawUsage\n\t\t */\n\t\tthis.usage = StaticDrawUsage;\n\n\t\t/**\n\t\t * This can be used to only update some components of stored vectors (for example, just the\n\t\t * component related to color). Use the `addUpdateRange()` function to add ranges to this array.\n\t\t *\n\t\t * @type {Array<Object>}\n\t\t */\n\t\tthis.updateRanges = [];\n\n\t\t/**\n\t\t * A version number, incremented every time the `needsUpdate` is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.version = 0;\n\n\t\t/**\n\t\t * The UUID of the interleaved buffer.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t}\n\n\t/**\n\t * A callback function that is executed after the renderer has transferred the attribute array\n\t * data to the GPU.\n\t */\n\tonUploadCallback() {}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Sets the usage of this interleaved buffer.\n\t *\n\t * @param {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)} value - The usage to set.\n\t * @return {InterleavedBuffer} A reference to this interleaved buffer.\n\t */\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds a range of data in the data array to be updated on the GPU.\n\t *\n\t * @param {number} start - Position at which to start update.\n\t * @param {number} count - The number of components to update.\n\t */\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\t/**\n\t * Clears the update ranges.\n\t */\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\t/**\n\t * Copies the values of the given interleaved buffer to this instance.\n\t *\n\t * @param {InterleavedBuffer} source - The interleaved buffer to copy.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.array = new source.array.constructor( source.array );\n\t\tthis.count = source.count;\n\t\tthis.stride = source.stride;\n\t\tthis.usage = source.usage;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies a vector from the given interleaved buffer to this one. The start\n\t * and destination position in the attribute buffers are represented by the\n\t * given indices.\n\t *\n\t * @param {number} index1 - The destination index into this interleaved buffer.\n\t * @param {InterleavedBuffer} interleavedBuffer - The interleaved buffer to copy from.\n\t * @param {number} index2 - The source index into the given interleaved buffer.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tcopyAt( index1, interleavedBuffer, index2 ) {\n\n\t\tindex1 *= this.stride;\n\t\tindex2 *= interleavedBuffer.stride;\n\n\t\tfor ( let i = 0, l = this.stride; i < l; i ++ ) {\n\n\t\t\tthis.array[ index1 + i ] = interleavedBuffer.array[ index2 + i ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given array data in the interleaved buffer.\n\t *\n\t * @param {(TypedArray|Array)} value - The array data to set.\n\t * @param {number} [offset=0] - The offset in this interleaved buffer's array.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tset( value, offset = 0 ) {\n\n\t\tthis.array.set( value, offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new interleaved buffer with copied values from this instance.\n\t *\n\t * @param {Object} [data] - An object with shared array buffers that allows to retain shared structures.\n\t * @return {InterleavedBuffer} A clone of this instance.\n\t */\n\tclone( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = this.array.slice( 0 ).buffer;\n\n\t\t}\n\n\t\tconst array = new this.array.constructor( data.arrayBuffers[ this.array.buffer._uuid ] );\n\n\t\tconst ib = new this.constructor( array, this.stride );\n\t\tib.setUsage( this.usage );\n\n\t\treturn ib;\n\n\t}\n\n\t/**\n\t * Sets the given callback function that is executed after the Renderer has transferred\n\t * the array data to the GPU. Can be used to perform clean-up operations after\n\t * the upload when data are not needed anymore on the CPU side.\n\t *\n\t * @param {Function} callback - The `onUpload()` callback.\n\t * @return {InterleavedBuffer} A reference to this instance.\n\t */\n\tonUpload( callback ) {\n\n\t\tthis.onUploadCallback = callback;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Serializes the interleaved buffer into JSON.\n\t *\n\t * @param {Object} [data] - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized interleaved buffer.\n\t */\n\ttoJSON( data ) {\n\n\t\tif ( data.arrayBuffers === undefined ) {\n\n\t\t\tdata.arrayBuffers = {};\n\n\t\t}\n\n\t\t// generate UUID for array buffer if necessary\n\n\t\tif ( this.array.buffer._uuid === undefined ) {\n\n\t\t\tthis.array.buffer._uuid = generateUUID();\n\n\t\t}\n\n\t\tif ( data.arrayBuffers[ this.array.buffer._uuid ] === undefined ) {\n\n\t\t\tdata.arrayBuffers[ this.array.buffer._uuid ] = Array.from( new Uint32Array( this.array.buffer ) );\n\n\t\t}\n\n\t\t//\n\n\t\treturn {\n\t\t\tuuid: this.uuid,\n\t\t\tbuffer: this.array.buffer._uuid,\n\t\t\ttype: this.array.constructor.name,\n\t\t\tstride: this.stride\n\t\t};\n\n\t}\n\n}\n\nconst _vector$7 = /*@__PURE__*/ new Vector3();\n\n/**\n * An alternative version of a buffer attribute with interleaved data. Interleaved\n * attributes share a common interleaved data storage ({@link InterleavedBuffer}) and refer with\n * different offsets into the buffer.\n */\nclass InterleavedBufferAttribute {\n\n\t/**\n\t * Constructs a new interleaved buffer attribute.\n\t *\n\t * @param {InterleavedBuffer} interleavedBuffer - The buffer holding the interleaved data.\n\t * @param {number} itemSize - The item size.\n\t * @param {number} offset - The attribute offset into the buffer.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( interleavedBuffer, itemSize, offset, normalized = false ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInterleavedBufferAttribute = true;\n\n\t\t/**\n\t\t * The name of the buffer attribute.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The buffer holding the interleaved data.\n\t\t *\n\t\t * @type {InterleavedBuffer}\n\t\t */\n\t\tthis.data = interleavedBuffer;\n\n\t\t/**\n\t\t * The item size, see {@link BufferAttribute#itemSize}.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.itemSize = itemSize;\n\n\t\t/**\n\t\t * The attribute offset into the buffer.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.offset = offset;\n\n\t\t/**\n\t\t * Whether the data are normalized or not, see {@link BufferAttribute#normalized}\n\t\t *\n\t\t * @type {InterleavedBuffer}\n\t\t */\n\t\tthis.normalized = normalized;\n\n\t}\n\n\t/**\n\t * The item count of this buffer attribute.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget count() {\n\n\t\treturn this.data.count;\n\n\t}\n\n\t/**\n\t * The array holding the interleaved buffer attribute data.\n\t *\n\t * @type {TypedArray}\n\t */\n\tget array() {\n\n\t\treturn this.data.array;\n\n\t}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tthis.data.needsUpdate = value;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tapplyMatrix4( m ) {\n\n\t\tfor ( let i = 0, l = this.data.count; i < l; i ++ ) {\n\n\t\t\t_vector$7.fromBufferAttribute( this, i );\n\n\t\t\t_vector$7.applyMatrix4( m );\n\n\t\t\tthis.setXYZ( i, _vector$7.x, _vector$7.y, _vector$7.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 3x3 normal matrix to the given attribute. Only works with\n\t * item size `3`.\n\t *\n\t * @param {Matrix3} m - The normal matrix to apply.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tapplyNormalMatrix( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$7.fromBufferAttribute( this, i );\n\n\t\t\t_vector$7.applyNormalMatrix( m );\n\n\t\t\tthis.setXYZ( i, _vector$7.x, _vector$7.y, _vector$7.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 matrix to the given attribute. Only works with\n\t * item size `3` and with direction vectors.\n\t *\n\t * @param {Matrix4} m - The matrix to apply.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\ttransformDirection( m ) {\n\n\t\tfor ( let i = 0, l = this.count; i < l; i ++ ) {\n\n\t\t\t_vector$7.fromBufferAttribute( this, i );\n\n\t\t\t_vector$7.transformDirection( m );\n\n\t\t\tthis.setXYZ( i, _vector$7.x, _vector$7.y, _vector$7.z );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @return {number} The returned value.\n\t */\n\tgetComponent( index, component ) {\n\n\t\tlet value = this.array[ index * this.data.stride + this.offset + component ];\n\n\t\tif ( this.normalized ) value = denormalize( value, this.array );\n\n\t\treturn value;\n\n\t}\n\n\t/**\n\t * Sets the given value to the given component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} component - The component index.\n\t * @param {number} value - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetComponent( index, component, value ) {\n\n\t\tif ( this.normalized ) value = normalize( value, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + component ] = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetX( index, x ) {\n\n\t\tif ( this.normalized ) x = normalize( x, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset ] = x;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} y - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetY( index, y ) {\n\n\t\tif ( this.normalized ) y = normalize( y, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} z - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetZ( index, z ) {\n\n\t\tif ( this.normalized ) z = normalize( z, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} w - The value to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetW( index, w ) {\n\n\t\tif ( this.normalized ) w = normalize( w, this.array );\n\n\t\tthis.data.array[ index * this.data.stride + this.offset + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the x component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The x component.\n\t */\n\tgetX( index ) {\n\n\t\tlet x = this.data.array[ index * this.data.stride + this.offset ];\n\n\t\tif ( this.normalized ) x = denormalize( x, this.array );\n\n\t\treturn x;\n\n\t}\n\n\t/**\n\t * Returns the y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The y component.\n\t */\n\tgetY( index ) {\n\n\t\tlet y = this.data.array[ index * this.data.stride + this.offset + 1 ];\n\n\t\tif ( this.normalized ) y = denormalize( y, this.array );\n\n\t\treturn y;\n\n\t}\n\n\t/**\n\t * Returns the z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The z component.\n\t */\n\tgetZ( index ) {\n\n\t\tlet z = this.data.array[ index * this.data.stride + this.offset + 2 ];\n\n\t\tif ( this.normalized ) z = denormalize( z, this.array );\n\n\t\treturn z;\n\n\t}\n\n\t/**\n\t * Returns the w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @return {number} The w component.\n\t */\n\tgetW( index ) {\n\n\t\tlet w = this.data.array[ index * this.data.stride + this.offset + 3 ];\n\n\t\tif ( this.normalized ) w = denormalize( w, this.array );\n\n\t\treturn w;\n\n\t}\n\n\t/**\n\t * Sets the x and y component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetXY( index, x, y ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y and z component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetXYZ( index, x, y, z ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the x, y, z and w component of the vector at the given index.\n\t *\n\t * @param {number} index - The index into the buffer attribute.\n\t * @param {number} x - The value for the x component to set.\n\t * @param {number} y - The value for the y component to set.\n\t * @param {number} z - The value for the z component to set.\n\t * @param {number} w - The value for the w component to set.\n\t * @return {InterleavedBufferAttribute} A reference to this instance.\n\t */\n\tsetXYZW( index, x, y, z, w ) {\n\n\t\tindex = index * this.data.stride + this.offset;\n\n\t\tif ( this.normalized ) {\n\n\t\t\tx = normalize( x, this.array );\n\t\t\ty = normalize( y, this.array );\n\t\t\tz = normalize( z, this.array );\n\t\t\tw = normalize( w, this.array );\n\n\t\t}\n\n\t\tthis.data.array[ index + 0 ] = x;\n\t\tthis.data.array[ index + 1 ] = y;\n\t\tthis.data.array[ index + 2 ] = z;\n\t\tthis.data.array[ index + 3 ] = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new buffer attribute with copied values from this instance.\n\t *\n\t * If no parameter is provided, cloning an interleaved buffer attribute will de-interleave buffer data.\n\t *\n\t * @param {Object} [data] - An object with interleaved buffers that allows to retain the interleaved property.\n\t * @return {BufferAttribute|InterleavedBufferAttribute} A clone of this instance.\n\t */\n\tclone( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tlog( 'InterleavedBufferAttribute.clone(): Cloning an interleaved buffer attribute will de-interleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new BufferAttribute( new this.array.constructor( array ), this.itemSize, this.normalized );\n\n\t\t} else {\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.clone( data );\n\n\t\t\t}\n\n\t\t\treturn new InterleavedBufferAttribute( data.interleavedBuffers[ this.data.uuid ], this.itemSize, this.offset, this.normalized );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the buffer attribute into JSON.\n\t *\n\t * If no parameter is provided, cloning an interleaved buffer attribute will de-interleave buffer data.\n\t *\n\t * @param {Object} [data] - An optional value holding meta information about the serialization.\n\t * @return {Object} A JSON object representing the serialized buffer attribute.\n\t */\n\ttoJSON( data ) {\n\n\t\tif ( data === undefined ) {\n\n\t\t\tlog( 'InterleavedBufferAttribute.toJSON(): Serializing an interleaved buffer attribute will de-interleave buffer data.' );\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0; i < this.count; i ++ ) {\n\n\t\t\t\tconst index = i * this.data.stride + this.offset;\n\n\t\t\t\tfor ( let j = 0; j < this.itemSize; j ++ ) {\n\n\t\t\t\t\tarray.push( this.data.array[ index + j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// de-interleave data and save it as an ordinary buffer attribute for now\n\n\t\t\treturn {\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\ttype: this.array.constructor.name,\n\t\t\t\tarray: array,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t} else {\n\n\t\t\t// save as true interleaved attribute\n\n\t\t\tif ( data.interleavedBuffers === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers = {};\n\n\t\t\t}\n\n\t\t\tif ( data.interleavedBuffers[ this.data.uuid ] === undefined ) {\n\n\t\t\t\tdata.interleavedBuffers[ this.data.uuid ] = this.data.toJSON( data );\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tisInterleavedBufferAttribute: true,\n\t\t\t\titemSize: this.itemSize,\n\t\t\t\tdata: this.data.uuid,\n\t\t\t\toffset: this.offset,\n\t\t\t\tnormalized: this.normalized\n\t\t\t};\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * A material for rendering instances of {@link Sprite}.\n *\n * ```js\n * const map = new THREE.TextureLoader().load( 'textures/sprite.png' );\n * const material = new THREE.SpriteMaterial( { map: map, color: 0xffffff } );\n *\n * const sprite = new THREE.Sprite( material );\n * sprite.scale.set(200, 200, 1)\n * scene.add( sprite );\n * ```\n *\n * @augments Material\n */\nclass SpriteMaterial extends Material {\n\n\t/**\n\t * Constructs a new sprite material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSpriteMaterial = true;\n\n\t\tthis.type = 'SpriteMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The rotation of the sprite in radians.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.rotation = 0;\n\n\t\t/**\n\t\t * Specifies whether size of the sprite is attenuated by the camera depth (perspective camera only).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sizeAttenuation = true;\n\n\t\t/**\n\t\t * Overwritten since sprite materials are transparent\n\t\t * by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.transparent = true;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.rotation = source.rotation;\n\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nlet _geometry;\n\nconst _intersectPoint = /*@__PURE__*/ new Vector3();\nconst _worldScale = /*@__PURE__*/ new Vector3();\nconst _mvPosition = /*@__PURE__*/ new Vector3();\n\nconst _alignedPosition = /*@__PURE__*/ new Vector2();\nconst _rotatedPosition = /*@__PURE__*/ new Vector2();\nconst _viewWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _vA = /*@__PURE__*/ new Vector3();\nconst _vB = /*@__PURE__*/ new Vector3();\nconst _vC = /*@__PURE__*/ new Vector3();\n\nconst _uvA = /*@__PURE__*/ new Vector2();\nconst _uvB = /*@__PURE__*/ new Vector2();\nconst _uvC = /*@__PURE__*/ new Vector2();\n\n/**\n * A sprite is a plane that always faces towards the camera, generally with a\n * partially transparent texture applied.\n *\n * Sprites do not cast shadows, setting {@link Object3D#castShadow} to `true` will\n * have no effect.\n *\n * ```js\n * const map = new THREE.TextureLoader().load( 'sprite.png' );\n * const material = new THREE.SpriteMaterial( { map: map } );\n *\n * const sprite = new THREE.Sprite( material );\n * scene.add( sprite );\n * ```\n *\n * @augments Object3D\n */\nclass Sprite extends Object3D {\n\n\t/**\n\t * Constructs a new sprite.\n\t *\n\t * @param {(SpriteMaterial|SpriteNodeMaterial)} [material] - The sprite material.\n\t */\n\tconstructor( material = new SpriteMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSprite = true;\n\n\t\tthis.type = 'Sprite';\n\n\t\tif ( _geometry === undefined ) {\n\n\t\t\t_geometry = new BufferGeometry();\n\n\t\t\tconst float32Array = new Float32Array( [\n\t\t\t\t-0.5, -0.5, 0, 0, 0,\n\t\t\t\t0.5, -0.5, 0, 1, 0,\n\t\t\t\t0.5, 0.5, 0, 1, 1,\n\t\t\t\t-0.5, 0.5, 0, 0, 1\n\t\t\t] );\n\n\t\t\tconst interleavedBuffer = new InterleavedBuffer( float32Array, 5 );\n\n\t\t\t_geometry.setIndex( [ 0, 1, 2,\t0, 2, 3 ] );\n\t\t\t_geometry.setAttribute( 'position', new InterleavedBufferAttribute( interleavedBuffer, 3, 0, false ) );\n\t\t\t_geometry.setAttribute( 'uv', new InterleavedBufferAttribute( interleavedBuffer, 2, 3, false ) );\n\n\t\t}\n\n\t\t/**\n\t\t * The sprite geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = _geometry;\n\n\t\t/**\n\t\t * The sprite material.\n\t\t *\n\t\t * @type {(SpriteMaterial|SpriteNodeMaterial)}\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * The sprite's anchor point, and the point around which the sprite rotates.\n\t\t * A value of `(0.5, 0.5)` corresponds to the midpoint of the sprite. A value\n\t\t * of `(0, 0)` corresponds to the lower left corner of the sprite.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (0.5,0.5)\n\t\t */\n\t\tthis.center = new Vector2( 0.5, 0.5 );\n\n\t\t/**\n\t\t * The number of instances of this sprite.\n\t\t * Can only be used with {@link WebGPURenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.count = 1;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this sprite.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array<Object>} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tif ( raycaster.camera === null ) {\n\n\t\t\terror( 'Sprite: \"Raycaster.camera\" needs to be set in order to raycast against sprites.' );\n\n\t\t}\n\n\t\t_worldScale.setFromMatrixScale( this.matrixWorld );\n\n\t\t_viewWorldMatrix.copy( raycaster.camera.matrixWorld );\n\t\tthis.modelViewMatrix.multiplyMatrices( raycaster.camera.matrixWorldInverse, this.matrixWorld );\n\n\t\t_mvPosition.setFromMatrixPosition( this.modelViewMatrix );\n\n\t\tif ( raycaster.camera.isPerspectiveCamera && this.material.sizeAttenuation === false ) {\n\n\t\t\t_worldScale.multiplyScalar( - _mvPosition.z );\n\n\t\t}\n\n\t\tconst rotation = this.material.rotation;\n\t\tlet sin, cos;\n\n\t\tif ( rotation !== 0 ) {\n\n\t\t\tcos = Math.cos( rotation );\n\t\t\tsin = Math.sin( rotation );\n\n\t\t}\n\n\t\tconst center = this.center;\n\n\t\ttransformVertex( _vA.set( -0.5, -0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vB.set( 0.5, -0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\ttransformVertex( _vC.set( 0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\n\t\t_uvA.set( 0, 0 );\n\t\t_uvB.set( 1, 0 );\n\t\t_uvC.set( 1, 1 );\n\n\t\t// check first triangle\n\t\tlet intersect = raycaster.ray.intersectTriangle( _vA, _vB, _vC, false, _intersectPoint );\n\n\t\tif ( intersect === null ) {\n\n\t\t\t// check second triangle\n\t\t\ttransformVertex( _vB.set( -0.5, 0.5, 0 ), _mvPosition, center, _worldScale, sin, cos );\n\t\t\t_uvB.set( 0, 1 );\n\n\t\t\tintersect = raycaster.ray.intersectTriangle( _vA, _vC, _vB, false, _intersectPoint );\n\t\t\tif ( intersect === null ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( _intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tpoint: _intersectPoint.clone(),\n\t\t\tuv: Triangle.getInterpolation( _intersectPoint, _vA, _vB, _vC, _uvA, _uvB, _uvC, new Vector2() ),\n\t\t\tface: null,\n\t\t\tobject: this\n\n\t\t} );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.center !== undefined ) this.center.copy( source.center );\n\n\t\tthis.material = source.material;\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction transformVertex( vertexPosition, mvPosition, center, scale, sin, cos ) {\n\n\t// compute position in camera space\n\t_alignedPosition.subVectors( vertexPosition, center ).addScalar( 0.5 ).multiply( scale );\n\n\t// to check if rotation is not zero\n\tif ( sin !== undefined ) {\n\n\t\t_rotatedPosition.x = ( cos * _alignedPosition.x ) - ( sin * _alignedPosition.y );\n\t\t_rotatedPosition.y = ( sin * _alignedPosition.x ) + ( cos * _alignedPosition.y );\n\n\t} else {\n\n\t\t_rotatedPosition.copy( _alignedPosition );\n\n\t}\n\n\n\tvertexPosition.copy( mvPosition );\n\tvertexPosition.x += _rotatedPosition.x;\n\tvertexPosition.y += _rotatedPosition.y;\n\n\t// transform to world space\n\tvertexPosition.applyMatrix4( _viewWorldMatrix );\n\n}\n\nconst _v1$2 = /*@__PURE__*/ new Vector3();\nconst _v2$1 = /*@__PURE__*/ new Vector3();\n\n/**\n * A component for providing a basic Level of Detail (LOD) mechanism.\n *\n * Every LOD level is associated with an object, and rendering can be switched\n * between them at the distances specified. Typically you would create, say,\n * three meshes, one for far away (low detail), one for mid range (medium\n * detail) and one for close up (high detail).\n *\n * ```js\n * const lod = new THREE.LOD();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n *\n * //Create spheres with 3 levels of detail and create new LOD levels for them\n * for( let i = 0; i < 3; i++ ) {\n *\n * \tconst geometry = new THREE.IcosahedronGeometry( 10, 3 - i );\n * \tconst mesh = new THREE.Mesh( geometry, material );\n * \tlod.addLevel( mesh, i * 75 );\n *\n * }\n *\n * scene.add( lod );\n * ```\n *\n * @augments Object3D\n */\nclass LOD extends Object3D {\n\n\t/**\n\t * Constructs a new LOD.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLOD = true;\n\n\t\t/**\n\t\t * The current LOD index.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis._currentLevel = 0;\n\n\t\tthis.type = 'LOD';\n\n\t\tObject.defineProperties( this, {\n\t\t\t/**\n\t\t\t * This array holds the LOD levels.\n\t\t\t *\n\t\t\t * @name LOD#levels\n\t\t\t * @type {Array<{object:Object3D,distance:number,hysteresis:number}>}\n\t\t\t */\n\t\t\tlevels: {\n\t\t\t\tenumerable: true,\n\t\t\t\tvalue: []\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * Whether the LOD object is updated automatically by the renderer per frame\n\t\t * or not. If set to `false`, you have to call {@link LOD#update} in the\n\t\t * render loop by yourself.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoUpdate = true;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tconst levels = source.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tthis.addLevel( level.object.clone(), level.distance, level.hysteresis );\n\n\t\t}\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds a mesh that will display at a certain distance and greater. Typically\n\t * the further away the distance, the lower the detail on the mesh.\n\t *\n\t * @param {Object3D} object - The 3D object to display at this level.\n\t * @param {number} [distance=0] - The distance at which to display this level of detail.\n\t * @param {number} [hysteresis=0] - Threshold used to avoid flickering at LOD boundaries, as a fraction of distance.\n\t * @return {LOD} A reference to this instance.\n\t */\n\taddLevel( object, distance = 0, hysteresis = 0 ) {\n\n\t\tdistance = Math.abs( distance );\n\n\t\tconst levels = this.levels;\n\n\t\tlet l;\n\n\t\tfor ( l = 0; l < levels.length; l ++ ) {\n\n\t\t\tif ( distance < levels[ l ].distance ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlevels.splice( l, 0, { distance: distance, hysteresis: hysteresis, object: object } );\n\n\t\tthis.add( object );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes an existing level, based on the distance from the camera.\n\t * Returns `true` when the level has been removed. Otherwise `false`.\n\t *\n\t * @param {number} distance - Distance of the level to remove.\n\t * @return {boolean} Whether the level has been removed or not.\n\t */\n\tremoveLevel( distance ) {\n\n\t\tconst levels = this.levels;\n\n\t\tfor ( let i = 0; i < levels.length; i ++ ) {\n\n\t\t\tif ( levels[ i ].distance === distance ) {\n\n\t\t\t\tconst removedElements = levels.splice( i, 1 );\n\t\t\t\tthis.remove( removedElements[ 0 ].object );\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Returns the currently active LOD level index.\n\t *\n\t * @return {number} The current active LOD level index.\n\t */\n\tgetCurrentLevel() {\n\n\t\treturn this._currentLevel;\n\n\t}\n\n\t/**\n\t * Returns a reference to the first 3D object that is greater than\n\t * the given distance.\n\t *\n\t * @param {number} distance - The LOD distance.\n\t * @return {?Object3D} The found 3D object. `null` if no 3D object has been found.\n\t */\n\tgetObjectForDistance( distance ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tlet levelDistance = levels[ i ].distance;\n\n\t\t\t\tif ( levels[ i ].object.visible ) {\n\n\t\t\t\t\tlevelDistance -= levelDistance * levels[ i ].hysteresis;\n\n\t\t\t\t}\n\n\t\t\t\tif ( distance < levelDistance ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn levels[ i - 1 ].object;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this LOD.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array<Object>} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 0 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = raycaster.ray.origin.distanceTo( _v1$2 );\n\n\t\t\tthis.getObjectForDistance( distance ).raycast( raycaster, intersects );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the LOD by computing which LOD level should be visible according\n\t * to the current distance of the given camera.\n\t *\n\t * @param {Camera} camera - The camera the scene is rendered with.\n\t */\n\tupdate( camera ) {\n\n\t\tconst levels = this.levels;\n\n\t\tif ( levels.length > 1 ) {\n\n\t\t\t_v1$2.setFromMatrixPosition( camera.matrixWorld );\n\t\t\t_v2$1.setFromMatrixPosition( this.matrixWorld );\n\n\t\t\tconst distance = _v1$2.distanceTo( _v2$1 ) / camera.zoom;\n\n\t\t\tlevels[ 0 ].object.visible = true;\n\n\t\t\tlet i, l;\n\n\t\t\tfor ( i = 1, l = levels.length; i < l; i ++ ) {\n\n\t\t\t\tlet levelDistance = levels[ i ].distance;\n\n\t\t\t\tif ( levels[ i ].object.visible ) {\n\n\t\t\t\t\tlevelDistance -= levelDistance * levels[ i ].hysteresis;\n\n\t\t\t\t}\n\n\t\t\t\tif ( distance >= levelDistance ) {\n\n\t\t\t\t\tlevels[ i - 1 ].object.visible = false;\n\t\t\t\t\tlevels[ i ].object.visible = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._currentLevel = i - 1;\n\n\t\t\tfor ( ; i < l; i ++ ) {\n\n\t\t\t\tlevels[ i ].object.visible = false;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.autoUpdate === false ) data.object.autoUpdate = false;\n\n\t\tdata.object.levels = [];\n\n\t\tconst levels = this.levels;\n\n\t\tfor ( let i = 0, l = levels.length; i < l; i ++ ) {\n\n\t\t\tconst level = levels[ i ];\n\n\t\t\tdata.object.levels.push( {\n\t\t\t\tobject: level.object.uuid,\n\t\t\t\tdistance: level.distance,\n\t\t\t\thysteresis: level.hysteresis\n\t\t\t} );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _basePosition = /*@__PURE__*/ new Vector3();\n\nconst _skinIndex = /*@__PURE__*/ new Vector4();\nconst _skinWeight = /*@__PURE__*/ new Vector4();\n\nconst _vector3 = /*@__PURE__*/ new Vector3();\nconst _matrix4 = /*@__PURE__*/ new Matrix4();\nconst _vertex = /*@__PURE__*/ new Vector3();\n\nconst _sphere$5 = /*@__PURE__*/ new Sphere();\nconst _inverseMatrix$2 = /*@__PURE__*/ new Matrix4();\nconst _ray$2 = /*@__PURE__*/ new Ray();\n\n/**\n * A mesh that has a {@link Skeleton} that can then be used to animate the\n * vertices of the geometry with skinning/skeleton animation.\n *\n * Next to a valid skeleton, the skinned mesh requires skin indices and weights\n * as buffer attributes in its geometry. These attribute define which bones affect a single\n * vertex to a certain extend.\n *\n * Typically skinned meshes are not created manually but loaders like {@link GLTFLoader}\n * or {@link FBXLoader } import respective models.\n *\n * @augments Mesh\n * @demo scenes/bones-browser.html\n */\nclass SkinnedMesh extends Mesh {\n\n\t/**\n\t * Constructs a new skinned mesh.\n\t *\n\t * @param {BufferGeometry} [geometry] - The mesh geometry.\n\t * @param {Material|Array<Material>} [material] - The mesh material.\n\t */\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSkinnedMesh = true;\n\n\t\tthis.type = 'SkinnedMesh';\n\n\t\t/**\n\t\t * `AttachedBindMode` means the skinned mesh shares the same world space as the skeleton.\n\t\t * This is not true when using `DetachedBindMode` which is useful when sharing a skeleton\n\t\t * across multiple skinned meshes.\n\t\t *\n\t\t * @type {(AttachedBindMode|DetachedBindMode)}\n\t\t * @default AttachedBindMode\n\t\t */\n\t\tthis.bindMode = AttachedBindMode;\n\n\t\t/**\n\t\t * The base matrix that is used for the bound bone transforms.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.bindMatrix = new Matrix4();\n\n\t\t/**\n\t\t * The base matrix that is used for resetting the bound bone transforms.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.bindMatrixInverse = new Matrix4();\n\n\t\t/**\n\t\t * The bounding box of the skinned mesh. Can be computed via {@link SkinnedMesh#computeBoundingBox}.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * The bounding sphere of the skinned mesh. Can be computed via {@link SkinnedMesh#computeBoundingSphere}.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t}\n\n\t/**\n\t * Computes the bounding box of the skinned mesh, and updates {@link SkinnedMesh#boundingBox}.\n\t * The bounding box is not automatically computed by the engine; this method must be called by your app.\n\t * If the skinned mesh is animated, the bounding box should be recomputed per frame in order to reflect\n\t * the current animation state.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tthis.boundingBox.makeEmpty();\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\tthis.getVertexPosition( i, _vertex );\n\t\t\tthis.boundingBox.expandByPoint( _vertex );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere of the skinned mesh, and updates {@link SkinnedMesh#boundingSphere}.\n\t * The bounding sphere is automatically computed by the engine once when it is needed, e.g., for ray casting\n\t * and view frustum culling. If the skinned mesh is animated, the bounding sphere should be recomputed\n\t * per frame in order to reflect the current animation state.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tthis.boundingSphere.makeEmpty();\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\tthis.getVertexPosition( i, _vertex );\n\t\t\tthis.boundingSphere.expandByPoint( _vertex );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.bindMode = source.bindMode;\n\t\tthis.bindMatrix.copy( source.bindMatrix );\n\t\tthis.bindMatrixInverse.copy( source.bindMatrixInverse );\n\n\t\tthis.skeleton = source.skeleton;\n\n\t\tif ( source.boundingBox !== null ) this.boundingBox = source.boundingBox.clone();\n\t\tif ( source.boundingSphere !== null ) this.boundingSphere = source.boundingSphere.clone();\n\n\t\treturn this;\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst material = this.material;\n\t\tconst matrixWorld = this.matrixWorld;\n\n\t\tif ( material === undefined ) return;\n\n\t\t// test with bounding sphere in world space\n\n\t\tif ( this.boundingSphere === null ) this.computeBoundingSphere();\n\n\t\t_sphere$5.copy( this.boundingSphere );\n\t\t_sphere$5.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$5 ) === false ) return;\n\n\t\t// convert ray to local space of skinned mesh\n\n\t\t_inverseMatrix$2.copy( matrixWorld ).invert();\n\t\t_ray$2.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$2 );\n\n\t\t// test with bounding box in local space\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tif ( _ray$2.intersectsBox( this.boundingBox ) === false ) return;\n\n\t\t}\n\n\t\t// test for intersections with geometry\n\n\t\tthis._computeIntersections( raycaster, intersects, _ray$2 );\n\n\t}\n\n\tgetVertexPosition( index, target ) {\n\n\t\tsuper.getVertexPosition( index, target );\n\n\t\tthis.applyBoneTransform( index, target );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Binds the given skeleton to the skinned mesh.\n\t *\n\t * @param {Skeleton} skeleton - The skeleton to bind.\n\t * @param {Matrix4} [bindMatrix] - The bind matrix. If no bind matrix is provided,\n\t * the skinned mesh's world matrix will be used instead.\n\t */\n\tbind( skeleton, bindMatrix ) {\n\n\t\tthis.skeleton = skeleton;\n\n\t\tif ( bindMatrix === undefined ) {\n\n\t\t\tthis.updateMatrixWorld( true );\n\n\t\t\tthis.skeleton.calculateInverses();\n\n\t\t\tbindMatrix = this.matrixWorld;\n\n\t\t}\n\n\t\tthis.bindMatrix.copy( bindMatrix );\n\t\tthis.bindMatrixInverse.copy( bindMatrix ).invert();\n\n\t}\n\n\t/**\n\t * This method sets the skinned mesh in the rest pose).\n\t */\n\tpose() {\n\n\t\tthis.skeleton.pose();\n\n\t}\n\n\t/**\n\t * Normalizes the skin weights which are defined as a buffer attribute\n\t * in the skinned mesh's geometry.\n\t */\n\tnormalizeSkinWeights() {\n\n\t\tconst vector = new Vector4();\n\n\t\tconst skinWeight = this.geometry.attributes.skinWeight;\n\n\t\tfor ( let i = 0, l = skinWeight.count; i < l; i ++ ) {\n\n\t\t\tvector.fromBufferAttribute( skinWeight, i );\n\n\t\t\tconst scale = 1.0 / vector.manhattanLength();\n\n\t\t\tif ( scale !== Infinity ) {\n\n\t\t\t\tvector.multiplyScalar( scale );\n\n\t\t\t} else {\n\n\t\t\t\tvector.set( 1, 0, 0, 0 ); // do something reasonable\n\n\t\t\t}\n\n\t\t\tskinWeight.setXYZW( i, vector.x, vector.y, vector.z, vector.w );\n\n\t\t}\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.bindMode === AttachedBindMode ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.matrixWorld ).invert();\n\n\t\t} else if ( this.bindMode === DetachedBindMode ) {\n\n\t\t\tthis.bindMatrixInverse.copy( this.bindMatrix ).invert();\n\n\t\t} else {\n\n\t\t\twarn( 'SkinnedMesh: Unrecognized bindMode: ' + this.bindMode );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Applies the bone transform associated with the given index to the given\n\t * vertex position. Returns the updated vector.\n\t *\n\t * @param {number} index - The vertex index.\n\t * @param {Vector3} target - The target object that is used to store the method's result.\n\t * the skinned mesh's world matrix will be used instead.\n\t * @return {Vector3} The updated vertex position.\n\t */\n\tapplyBoneTransform( index, target ) {\n\n\t\tconst skeleton = this.skeleton;\n\t\tconst geometry = this.geometry;\n\n\t\t_skinIndex.fromBufferAttribute( geometry.attributes.skinIndex, index );\n\t\t_skinWeight.fromBufferAttribute( geometry.attributes.skinWeight, index );\n\n\t\t_basePosition.copy( target ).applyMatrix4( this.bindMatrix );\n\n\t\ttarget.set( 0, 0, 0 );\n\n\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\tconst weight = _skinWeight.getComponent( i );\n\n\t\t\tif ( weight !== 0 ) {\n\n\t\t\t\tconst boneIndex = _skinIndex.getComponent( i );\n\n\t\t\t\t_matrix4.multiplyMatrices( skeleton.bones[ boneIndex ].matrixWorld, skeleton.boneInverses[ boneIndex ] );\n\n\t\t\t\ttarget.addScaledVector( _vector3.copy( _basePosition ).applyMatrix4( _matrix4 ), weight );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn target.applyMatrix4( this.bindMatrixInverse );\n\n\t}\n\n}\n\n/**\n * A bone which is part of a {@link Skeleton}. The skeleton in turn is used by\n * the {@link SkinnedMesh}.\n *\n * ```js\n * const root = new THREE.Bone();\n * const child = new THREE.Bone();\n *\n * root.add( child );\n * child.position.y = 5;\n * ```\n *\n * @augments Object3D\n */\nclass Bone extends Object3D {\n\n\t/**\n\t * Constructs a new bone.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBone = true;\n\n\t\tthis.type = 'Bone';\n\n\t}\n\n}\n\n/**\n * Creates a texture directly from raw buffer data.\n *\n * The interpretation of the data depends on type and format: If the type is\n * `UnsignedByteType`, a `Uint8Array` will be useful for addressing the\n * texel data. If the format is `RGBAFormat`, data needs four values for\n * one texel; Red, Green, Blue and Alpha (typically the opacity).\n *\n * @augments Texture\n */\nclass DataTexture extends Texture {\n\n\t/**\n\t * Constructs a new data texture.\n\t *\n\t * @param {?TypedArray} [data=null] - The buffer data.\n\t * @param {number} [width=1] - The width of the texture.\n\t * @param {number} [height=1] - The height of the texture.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=NearestFilter] - The mag filter value.\n\t * @param {number} [minFilter=NearestFilter] - The min filter value.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space.\n\t */\n\tconstructor( data = null, width = 1, height = 1, format, type, mapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, colorSpace ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDataTexture = true;\n\n\t\t/**\n\t\t * The image definition of a data texture.\n\t\t *\n\t\t * @type {{data:TypedArray,width:number,height:number}}\n\t\t */\n\t\tthis.image = { data: data, width: width, height: height };\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Specifies the alignment requirements for the start of each pixel row in memory.\n\t\t *\n\t\t * Overwritten and set to `1` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default 1\n\t\t */\n\t\tthis.unpackAlignment = 1;\n\n\t}\n\n}\n\nconst _offsetMatrix = /*@__PURE__*/ new Matrix4();\nconst _identityMatrix = /*@__PURE__*/ new Matrix4();\n\n/**\n * Class for representing the armatures in `three.js`. The skeleton\n * is defined by a hierarchy of bones.\n *\n * ```js\n * const bones = [];\n *\n * const shoulder = new THREE.Bone();\n * const elbow = new THREE.Bone();\n * const hand = new THREE.Bone();\n *\n * shoulder.add( elbow );\n * elbow.add( hand );\n *\n * bones.push( shoulder , elbow, hand);\n *\n * shoulder.position.y = -5;\n * elbow.position.y = 0;\n * hand.position.y = 5;\n *\n * const armSkeleton = new THREE.Skeleton( bones );\n * ```\n */\nclass Skeleton {\n\n\t/**\n\t * Constructs a new skeleton.\n\t *\n\t * @param {Array<Bone>} [bones] - An array of bones.\n\t * @param {Array<Matrix4>} [boneInverses] - An array of bone inverse matrices.\n\t * If not provided, these matrices will be computed automatically via {@link Skeleton#calculateInverses}.\n\t */\n\tconstructor( bones = [], boneInverses = [] ) {\n\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * An array of bones defining the skeleton.\n\t\t *\n\t\t * @type {Array<Bone>}\n\t\t */\n\t\tthis.bones = bones.slice( 0 );\n\n\t\t/**\n\t\t * An array of bone inverse matrices.\n\t\t *\n\t\t * @type {Array<Matrix4>}\n\t\t */\n\t\tthis.boneInverses = boneInverses;\n\n\t\t/**\n\t\t * An array buffer holding the bone data.\n\t\t * Input data for {@link Skeleton#boneTexture}.\n\t\t *\n\t\t * @type {?Float32Array}\n\t\t * @default null\n\t\t */\n\t\tthis.boneMatrices = null;\n\n\t\t/**\n\t\t * An array buffer holding the bone data of the previous frame.\n\t\t * Required for computing velocity. Maintained in {@link SkinningNode}.\n\t\t *\n\t\t * @type {?Float32Array}\n\t\t * @default null\n\t\t */\n\t\tthis.previousBoneMatrices = null;\n\n\t\t/**\n\t\t * A texture holding the bone data for use\n\t\t * in the vertex shader.\n\t\t *\n\t\t * @type {?DataTexture}\n\t\t * @default null\n\t\t */\n\t\tthis.boneTexture = null;\n\n\t\tthis.init();\n\n\t}\n\n\t/**\n\t * Initializes the skeleton. This method gets automatically called by the constructor\n\t * but depending on how the skeleton is created it might be necessary to call this method\n\t * manually.\n\t */\n\tinit() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tthis.boneMatrices = new Float32Array( bones.length * 16 );\n\n\t\t// calculate inverse bone matrices if necessary\n\n\t\tif ( boneInverses.length === 0 ) {\n\n\t\t\tthis.calculateInverses();\n\n\t\t} else {\n\n\t\t\t// handle special case\n\n\t\t\tif ( bones.length !== boneInverses.length ) {\n\n\t\t\t\twarn( 'Skeleton: Number of inverse bone matrices does not match amount of bones.' );\n\n\t\t\t\tthis.boneInverses = [];\n\n\t\t\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\t\t\tthis.boneInverses.push( new Matrix4() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bone inverse matrices. This method resets {@link Skeleton#boneInverses}\n\t * and fills it with new matrices.\n\t */\n\tcalculateInverses() {\n\n\t\tthis.boneInverses.length = 0;\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst inverse = new Matrix4();\n\n\t\t\tif ( this.bones[ i ] ) {\n\n\t\t\t\tinverse.copy( this.bones[ i ].matrixWorld ).invert();\n\n\t\t\t}\n\n\t\t\tthis.boneInverses.push( inverse );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Resets the skeleton to the base pose.\n\t */\n\tpose() {\n\n\t\t// recover the bind-time world matrices\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tbone.matrixWorld.copy( this.boneInverses[ i ] ).invert();\n\n\t\t\t}\n\n\t\t}\n\n\t\t// compute the local matrices, positions, rotations and scales\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t\tbone.matrix.copy( bone.parent.matrixWorld ).invert();\n\t\t\t\t\tbone.matrix.multiply( bone.matrixWorld );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbone.matrix.copy( bone.matrixWorld );\n\n\t\t\t\t}\n\n\t\t\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Resets the skeleton to the base pose.\n\t */\n\tupdate() {\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\t\tconst boneMatrices = this.boneMatrices;\n\t\tconst boneTexture = this.boneTexture;\n\n\t\t// flatten bone matrices to array\n\n\t\tfor ( let i = 0, il = bones.length; i < il; i ++ ) {\n\n\t\t\t// compute the offset between the current and the original transform\n\n\t\t\tconst matrix = bones[ i ] ? bones[ i ].matrixWorld : _identityMatrix;\n\n\t\t\t_offsetMatrix.multiplyMatrices( matrix, boneInverses[ i ] );\n\t\t\t_offsetMatrix.toArray( boneMatrices, i * 16 );\n\n\t\t}\n\n\t\tif ( boneTexture !== null ) {\n\n\t\t\tboneTexture.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a new skeleton with copied values from this instance.\n\t *\n\t * @return {Skeleton} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Skeleton( this.bones, this.boneInverses );\n\n\t}\n\n\t/**\n\t * Computes a data texture for passing bone data to the vertex shader.\n\t *\n\t * @return {Skeleton} A reference of this instance.\n\t */\n\tcomputeBoneTexture() {\n\n\t\t// layout (1 matrix = 4 pixels)\n\t\t//      RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t//  with  8x8  pixel texture max   16 bones * 4 pixels =  (8 * 8)\n\t\t//       16x16 pixel texture max   64 bones * 4 pixels = (16 * 16)\n\t\t//       32x32 pixel texture max  256 bones * 4 pixels = (32 * 32)\n\t\t//       64x64 pixel texture max 1024 bones * 4 pixels = (64 * 64)\n\n\t\tlet size = Math.sqrt( this.bones.length * 4 ); // 4 pixels needed for 1 matrix\n\t\tsize = Math.ceil( size / 4 ) * 4;\n\t\tsize = Math.max( size, 4 );\n\n\t\tconst boneMatrices = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\tboneMatrices.set( this.boneMatrices ); // copy current values\n\n\t\tconst boneTexture = new DataTexture( boneMatrices, size, size, RGBAFormat, FloatType );\n\t\tboneTexture.needsUpdate = true;\n\n\t\tthis.boneMatrices = boneMatrices;\n\t\tthis.boneTexture = boneTexture;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Searches through the skeleton's bone array and returns the first with a\n\t * matching name.\n\t *\n\t * @param {string} name - The name of the bone.\n\t * @return {Bone|undefined} The found bone. `undefined` if no bone has been found.\n\t */\n\tgetBoneByName( name ) {\n\n\t\tfor ( let i = 0, il = this.bones.length; i < il; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone.name === name ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn undefined;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose( ) {\n\n\t\tif ( this.boneTexture !== null ) {\n\n\t\t\tthis.boneTexture.dispose();\n\n\t\t\tthis.boneTexture = null;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Setups the skeleton by the given JSON and bones.\n\t *\n\t * @param {Object} json - The skeleton as serialized JSON.\n\t * @param {Object<string, Bone>} bones - An array of bones.\n\t * @return {Skeleton} A reference of this instance.\n\t */\n\tfromJSON( json, bones ) {\n\n\t\tthis.uuid = json.uuid;\n\n\t\tfor ( let i = 0, l = json.bones.length; i < l; i ++ ) {\n\n\t\t\tconst uuid = json.bones[ i ];\n\t\t\tlet bone = bones[ uuid ];\n\n\t\t\tif ( bone === undefined ) {\n\n\t\t\t\twarn( 'Skeleton: No bone found with UUID:', uuid );\n\t\t\t\tbone = new Bone();\n\n\t\t\t}\n\n\t\t\tthis.bones.push( bone );\n\t\t\tthis.boneInverses.push( new Matrix4().fromArray( json.boneInverses[ i ] ) );\n\n\t\t}\n\n\t\tthis.init();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Serializes the skeleton into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized skeleton.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Skeleton',\n\t\t\t\tgenerator: 'Skeleton.toJSON'\n\t\t\t},\n\t\t\tbones: [],\n\t\t\tboneInverses: []\n\t\t};\n\n\t\tdata.uuid = this.uuid;\n\n\t\tconst bones = this.bones;\n\t\tconst boneInverses = this.boneInverses;\n\n\t\tfor ( let i = 0, l = bones.length; i < l; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\t\t\tdata.bones.push( bone.uuid );\n\n\t\t\tconst boneInverse = boneInverses[ i ];\n\t\t\tdata.boneInverses.push( boneInverse.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * An instanced version of a buffer attribute.\n *\n * @augments BufferAttribute\n */\nclass InstancedBufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new instanced buffer attribute.\n\t *\n\t * @param {TypedArray} array - The array holding the attribute data.\n\t * @param {number} itemSize - The item size.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t * @param {number} [meshPerAttribute=1] - How often a value of this buffer attribute should be repeated.\n\t */\n\tconstructor( array, itemSize, normalized, meshPerAttribute = 1 ) {\n\n\t\tsuper( array, itemSize, normalized );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedBufferAttribute = true;\n\n\t\t/**\n\t\t * Defines how often a value of this buffer attribute should be repeated. A\n\t\t * value of one means that each value of the instanced attribute is used for\n\t\t * a single instance. A value of two means that each value is used for two\n\t\t * consecutive instances (and so on).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.meshPerAttribute = this.meshPerAttribute;\n\n\t\tdata.isInstancedBufferAttribute = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _instanceLocalMatrix = /*@__PURE__*/ new Matrix4();\nconst _instanceWorldMatrix = /*@__PURE__*/ new Matrix4();\n\nconst _instanceIntersects = [];\n\nconst _box3 = /*@__PURE__*/ new Box3();\nconst _identity = /*@__PURE__*/ new Matrix4();\nconst _mesh$1 = /*@__PURE__*/ new Mesh();\nconst _sphere$4 = /*@__PURE__*/ new Sphere();\n\n/**\n * A special version of a mesh with instanced rendering support. Use\n * this class if you have to render a large number of objects with the same\n * geometry and material(s) but with different world transformations. The usage\n * of 'InstancedMesh' will help you to reduce the number of draw calls and thus\n * improve the overall rendering performance in your application.\n *\n * @augments Mesh\n */\nclass InstancedMesh extends Mesh {\n\n\t/**\n\t * Constructs a new instanced mesh.\n\t *\n\t * @param {BufferGeometry} [geometry] - The mesh geometry.\n\t * @param {Material|Array<Material>} [material] - The mesh material.\n\t * @param {number} count - The number of instances.\n\t */\n\tconstructor( geometry, material, count ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedMesh = true;\n\n\t\t/**\n\t\t * Represents the local transformation of all instances. You have to set its\n\t\t * {@link BufferAttribute#needsUpdate} flag to true if you modify instanced data\n\t\t * via {@link InstancedMesh#setMatrixAt}.\n\t\t *\n\t\t * @type {InstancedBufferAttribute}\n\t\t */\n\t\tthis.instanceMatrix = new InstancedBufferAttribute( new Float32Array( count * 16 ), 16 );\n\n\t\t/**\n\t\t * Represents the color of all instances. You have to set its\n\t\t * {@link BufferAttribute#needsUpdate} flag to true if you modify instanced data\n\t\t * via {@link InstancedMesh#setColorAt}.\n\t\t *\n\t\t * @type {?InstancedBufferAttribute}\n\t\t * @default null\n\t\t */\n\t\tthis.instanceColor = null;\n\n\t\t/**\n\t\t * Represents the morph target weights of all instances. You have to set its\n\t\t * {@link Texture#needsUpdate} flag to true if you modify instanced data\n\t\t * via {@link InstancedMesh#setMorphAt}.\n\t\t *\n\t\t * @type {?DataTexture}\n\t\t * @default null\n\t\t */\n\t\tthis.morphTexture = null;\n\n\t\t/**\n\t\t * The number of instances.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.count = count;\n\n\t\t/**\n\t\t * The bounding box of the instanced mesh. Can be computed via {@link InstancedMesh#computeBoundingBox}.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * The bounding sphere of the instanced mesh. Can be computed via {@link InstancedMesh#computeBoundingSphere}.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.setMatrixAt( i, _identity );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding box of the instanced mesh, and updates {@link InstancedMesh#boundingBox}.\n\t * The bounding box is not automatically computed by the engine; this method must be called by your app.\n\t * You may need to recompute the bounding box if an instance is transformed via {@link InstancedMesh#setMatrixAt}.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst count = this.count;\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\tgeometry.computeBoundingBox();\n\n\t\t}\n\n\t\tthis.boundingBox.makeEmpty();\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.getMatrixAt( i, _instanceLocalMatrix );\n\n\t\t\t_box3.copy( geometry.boundingBox ).applyMatrix4( _instanceLocalMatrix );\n\n\t\t\tthis.boundingBox.union( _box3 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere of the instanced mesh, and updates {@link InstancedMesh#boundingSphere}\n\t * The engine automatically computes the bounding sphere when it is needed, e.g., for ray casting or view frustum culling.\n\t * You may need to recompute the bounding sphere if an instance is transformed via {@link InstancedMesh#setMatrixAt}.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst count = this.count;\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tif ( geometry.boundingSphere === null ) {\n\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t}\n\n\t\tthis.boundingSphere.makeEmpty();\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tthis.getMatrixAt( i, _instanceLocalMatrix );\n\n\t\t\t_sphere$4.copy( geometry.boundingSphere ).applyMatrix4( _instanceLocalMatrix );\n\n\t\t\tthis.boundingSphere.union( _sphere$4 );\n\n\t\t}\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.instanceMatrix.copy( source.instanceMatrix );\n\n\t\tif ( source.morphTexture !== null ) this.morphTexture = source.morphTexture.clone();\n\t\tif ( source.instanceColor !== null ) this.instanceColor = source.instanceColor.clone();\n\n\t\tthis.count = source.count;\n\n\t\tif ( source.boundingBox !== null ) this.boundingBox = source.boundingBox.clone();\n\t\tif ( source.boundingSphere !== null ) this.boundingSphere = source.boundingSphere.clone();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Gets the color of the defined instance.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Color} color - The target object that is used to store the method's result.\n\t */\n\tgetColorAt( index, color ) {\n\n\t\tcolor.fromArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\t/**\n\t * Gets the local transformation matrix of the defined instance.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Matrix4} matrix - The target object that is used to store the method's result.\n\t */\n\tgetMatrixAt( index, matrix ) {\n\n\t\tmatrix.fromArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\t/**\n\t * Gets the morph target weights of the defined instance.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Mesh} object - The target object that is used to store the method's result.\n\t */\n\tgetMorphAt( index, object ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tconst array = this.morphTexture.source.data.data;\n\n\t\tconst len = objectInfluences.length + 1; // All influences + the baseInfluenceSum\n\n\t\tconst dataIndex = index * len + 1; // Skip the baseInfluenceSum at the beginning\n\n\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\tobjectInfluences[ i ] = array[ dataIndex + i ];\n\n\t\t}\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst raycastTimes = this.count;\n\n\t\t_mesh$1.geometry = this.geometry;\n\t\t_mesh$1.material = this.material;\n\n\t\tif ( _mesh$1.material === undefined ) return;\n\n\t\t// test with bounding sphere first\n\n\t\tif ( this.boundingSphere === null ) this.computeBoundingSphere();\n\n\t\t_sphere$4.copy( this.boundingSphere );\n\t\t_sphere$4.applyMatrix4( matrixWorld );\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$4 ) === false ) return;\n\n\t\t// now test each instance\n\n\t\tfor ( let instanceId = 0; instanceId < raycastTimes; instanceId ++ ) {\n\n\t\t\t// calculate the world matrix for each instance\n\n\t\t\tthis.getMatrixAt( instanceId, _instanceLocalMatrix );\n\n\t\t\t_instanceWorldMatrix.multiplyMatrices( matrixWorld, _instanceLocalMatrix );\n\n\t\t\t// the mesh represents this single instance\n\n\t\t\t_mesh$1.matrixWorld = _instanceWorldMatrix;\n\n\t\t\t_mesh$1.raycast( raycaster, _instanceIntersects );\n\n\t\t\t// process the result of raycast\n\n\t\t\tfor ( let i = 0, l = _instanceIntersects.length; i < l; i ++ ) {\n\n\t\t\t\tconst intersect = _instanceIntersects[ i ];\n\t\t\t\tintersect.instanceId = instanceId;\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_instanceIntersects.length = 0;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the given color to the defined instance. Make sure you set the `needsUpdate` flag of\n\t * {@link InstancedMesh#instanceColor} to `true` after updating all the colors.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Color} color - The instance color.\n\t */\n\tsetColorAt( index, color ) {\n\n\t\tif ( this.instanceColor === null ) {\n\n\t\t\tthis.instanceColor = new InstancedBufferAttribute( new Float32Array( this.instanceMatrix.count * 3 ).fill( 1 ), 3 );\n\n\t\t}\n\n\t\tcolor.toArray( this.instanceColor.array, index * 3 );\n\n\t}\n\n\t/**\n\t * Sets the given local transformation matrix to the defined instance. Make sure you set the `needsUpdate` flag of\n\t * {@link InstancedMesh#instanceMatrix} to `true` after updating all the colors.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Matrix4} matrix - The local transformation.\n\t */\n\tsetMatrixAt( index, matrix ) {\n\n\t\tmatrix.toArray( this.instanceMatrix.array, index * 16 );\n\n\t}\n\n\t/**\n\t * Sets the morph target weights to the defined instance. Make sure you set the `needsUpdate` flag of\n\t * {@link InstancedMesh#morphTexture} to `true` after updating all the influences.\n\t *\n\t * @param {number} index - The instance index.\n\t * @param {Mesh} object -  A mesh which `morphTargetInfluences` property containing the morph target weights\n\t * of a single instance.\n\t */\n\tsetMorphAt( index, object ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\tconst len = objectInfluences.length + 1; // morphBaseInfluence + all influences\n\n\t\tif ( this.morphTexture === null ) {\n\n\t\t\tthis.morphTexture = new DataTexture( new Float32Array( len * this.count ), len, this.count, RedFormat, FloatType );\n\n\t\t}\n\n\t\tconst array = this.morphTexture.source.data.data;\n\n\t\tlet morphInfluencesSum = 0;\n\n\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\tmorphInfluencesSum += objectInfluences[ i ];\n\n\t\t}\n\n\t\tconst morphBaseInfluence = this.geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\t\tconst dataIndex = len * index;\n\n\t\tarray[ dataIndex ] = morphBaseInfluence;\n\n\t\tarray.set( objectInfluences, dataIndex + 1 );\n\n\t}\n\n\tupdateMorphTargets() {\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t\tif ( this.morphTexture !== null ) {\n\n\t\t\tthis.morphTexture.dispose();\n\t\t\tthis.morphTexture = null;\n\n\t\t}\n\n\t}\n\n}\n\nconst _vector1 = /*@__PURE__*/ new Vector3();\nconst _vector2 = /*@__PURE__*/ new Vector3();\nconst _normalMatrix = /*@__PURE__*/ new Matrix3();\n\n/**\n * A two dimensional surface that extends infinitely in 3D space, represented\n * in [Hessian normal form](http://mathworld.wolfram.com/HessianNormalForm.html)\n * by a unit length normal vector and a constant.\n */\nclass Plane {\n\n\t/**\n\t * Constructs a new plane.\n\t *\n\t * @param {Vector3} [normal=(1,0,0)] - A unit length vector defining the normal of the plane.\n\t * @param {number} [constant=0] - The signed distance from the origin to the plane.\n\t */\n\tconstructor( normal = new Vector3( 1, 0, 0 ), constant = 0 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPlane = true;\n\n\t\t/**\n\t\t * A unit length vector defining the normal of the plane.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.normal = normal;\n\n\t\t/**\n\t\t * The signed distance from the origin to the plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.constant = constant;\n\n\t}\n\n\t/**\n\t * Sets the plane components by copying the given values.\n\t *\n\t * @param {Vector3} normal - The normal.\n\t * @param {number} constant - The constant.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tset( normal, constant ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = constant;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the plane components by defining `x`, `y`, `z` as the\n\t * plane normal and `w` as the constant.\n\t *\n\t * @param {number} x - The value for the normal's x component.\n\t * @param {number} y - The value for the normal's y component.\n\t * @param {number} z - The value for the normal's z component.\n\t * @param {number} w - The constant value.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tsetComponents( x, y, z, w ) {\n\n\t\tthis.normal.set( x, y, z );\n\t\tthis.constant = w;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the plane from the given normal and coplanar point (that is a point\n\t * that lies onto the plane).\n\t *\n\t * @param {Vector3} normal - The normal.\n\t * @param {Vector3} point - A coplanar point.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tsetFromNormalAndCoplanarPoint( normal, point ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = - point.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the plane from three coplanar points. The winding order is\n\t * assumed to be counter-clockwise, and determines the direction of\n\t * the plane normal.\n\t *\n\t * @param {Vector3} a - The first coplanar point.\n\t * @param {Vector3} b - The second coplanar point.\n\t * @param {Vector3} c - The third coplanar point.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tsetFromCoplanarPoints( a, b, c ) {\n\n\t\tconst normal = _vector1.subVectors( c, b ).cross( _vector2.subVectors( a, b ) ).normalize();\n\n\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given plane to this instance.\n\t *\n\t * @param {Plane} plane - The plane to copy.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tcopy( plane ) {\n\n\t\tthis.normal.copy( plane.normal );\n\t\tthis.constant = plane.constant;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Normalizes the plane normal and adjusts the constant accordingly.\n\t *\n\t * @return {Plane} A reference to this plane.\n\t */\n\tnormalize() {\n\n\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\tconst inverseNormalLength = 1.0 / this.normal.length();\n\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\tthis.constant *= inverseNormalLength;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Negates both the plane normal and the constant.\n\t *\n\t * @return {Plane} A reference to this plane.\n\t */\n\tnegate() {\n\n\t\tthis.constant *= -1;\n\t\tthis.normal.negate();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the signed distance from the given point to this plane.\n\t *\n\t * @param {Vector3} point - The point to compute the distance for.\n\t * @return {number} The signed distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn this.normal.dot( point ) + this.constant;\n\n\t}\n\n\t/**\n\t * Returns the signed distance from the given sphere to this plane.\n\t *\n\t * @param {Sphere} sphere - The sphere to compute the distance for.\n\t * @return {number} The signed distance.\n\t */\n\tdistanceToSphere( sphere ) {\n\n\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t}\n\n\t/**\n\t * Projects a the given point onto the plane.\n\t *\n\t * @param {Vector3} point - The point to project.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The projected point on the plane.\n\t */\n\tprojectPoint( point, target ) {\n\n\t\treturn target.copy( point ).addScaledVector( this.normal, - this.distanceToPoint( point ) );\n\n\t}\n\n\t/**\n\t * Returns the intersection point of the passed line and the plane. Returns\n\t * `null` if the line does not intersect. Returns the line's starting point if\n\t * the line is coplanar with the plane.\n\t *\n\t * @param {Line3} line - The line to compute the intersection for.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point.\n\t */\n\tintersectLine( line, target ) {\n\n\t\tconst direction = line.delta( _vector1 );\n\n\t\tconst denominator = this.normal.dot( direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\treturn target.copy( line.start );\n\n\t\t\t}\n\n\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn target.copy( line.start ).addScaledVector( direction, t );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given line segment intersects with (passes through) the plane.\n\t *\n\t * @param {Line3} line - The line to test.\n\t * @return {boolean} Whether the given line segment intersects with the plane or not.\n\t */\n\tintersectsLine( line ) {\n\n\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\tconst startSign = this.distanceToPoint( line.start );\n\t\tconst endSign = this.distanceToPoint( line.end );\n\n\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box intersects with the plane.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the given bounding box intersects with the plane or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsPlane( this );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere intersects with the plane.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @return {boolean} Whether the given bounding sphere intersects with the plane or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\treturn sphere.intersectsPlane( this );\n\n\t}\n\n\t/**\n\t * Returns a coplanar vector to the plane, by calculating the\n\t * projection of the normal at the origin onto the plane.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The coplanar point.\n\t */\n\tcoplanarPoint( target ) {\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t}\n\n\t/**\n\t * Apply a 4x4 matrix to the plane. The matrix must be an affine, homogeneous transform.\n\t *\n\t * The optional normal matrix can be pre-computed like so:\n\t * ```js\n\t * const optionalNormalMatrix = new THREE.Matrix3().getNormalMatrix( matrix );\n\t * ```\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @param {Matrix4} [optionalNormalMatrix] - A pre-computed normal matrix.\n\t * @return {Plane} A reference to this plane.\n\t */\n\tapplyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\tconst normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix( matrix );\n\n\t\tconst referencePoint = this.coplanarPoint( _vector1 ).applyMatrix4( matrix );\n\n\t\tconst normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Translates the plane by the distance defined by the given offset vector.\n\t * Note that this only affects the plane constant and will not affect the normal vector.\n\t *\n\t * @param {Vector3} offset - The offset vector.\n\t * @return {Plane} A reference to this plane.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.constant -= offset.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this plane is equal with the given one.\n\t *\n\t * @param {Plane} plane - The plane to test for equality.\n\t * @return {boolean} Whether this plane is equal with the given one.\n\t */\n\tequals( plane ) {\n\n\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t}\n\n\t/**\n\t * Returns a new plane with copied values from this instance.\n\t *\n\t * @return {Plane} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _sphere$3 = /*@__PURE__*/ new Sphere();\nconst _defaultSpriteCenter = /*@__PURE__*/ new Vector2( 0.5, 0.5 );\nconst _vector$6 = /*@__PURE__*/ new Vector3();\n\n/**\n * Frustums are used to determine what is inside the camera's field of view.\n * They help speed up the rendering process - objects which lie outside a camera's\n * frustum can safely be excluded from rendering.\n *\n * This class is mainly intended for use internally by a renderer.\n */\nclass Frustum {\n\n\t/**\n\t * Constructs a new frustum.\n\t *\n\t * @param {Plane} [p0] - The first plane that encloses the frustum.\n\t * @param {Plane} [p1] - The second plane that encloses the frustum.\n\t * @param {Plane} [p2] - The third plane that encloses the frustum.\n\t * @param {Plane} [p3] - The fourth plane that encloses the frustum.\n\t * @param {Plane} [p4] - The fifth plane that encloses the frustum.\n\t * @param {Plane} [p5] - The sixth plane that encloses the frustum.\n\t */\n\tconstructor( p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane() ) {\n\n\t\t/**\n\t\t * This array holds the planes that enclose the frustum.\n\t\t *\n\t\t * @type {Array<Plane>}\n\t\t */\n\t\tthis.planes = [ p0, p1, p2, p3, p4, p5 ];\n\n\t}\n\n\t/**\n\t * Sets the frustum planes by copying the given planes.\n\t *\n\t * @param {Plane} [p0] - The first plane that encloses the frustum.\n\t * @param {Plane} [p1] - The second plane that encloses the frustum.\n\t * @param {Plane} [p2] - The third plane that encloses the frustum.\n\t * @param {Plane} [p3] - The fourth plane that encloses the frustum.\n\t * @param {Plane} [p4] - The fifth plane that encloses the frustum.\n\t * @param {Plane} [p5] - The sixth plane that encloses the frustum.\n\t * @return {Frustum} A reference to this frustum.\n\t */\n\tset( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tconst planes = this.planes;\n\n\t\tplanes[ 0 ].copy( p0 );\n\t\tplanes[ 1 ].copy( p1 );\n\t\tplanes[ 2 ].copy( p2 );\n\t\tplanes[ 3 ].copy( p3 );\n\t\tplanes[ 4 ].copy( p4 );\n\t\tplanes[ 5 ].copy( p5 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given frustum to this instance.\n\t *\n\t * @param {Frustum} frustum - The frustum to copy.\n\t * @return {Frustum} A reference to this frustum.\n\t */\n\tcopy( frustum ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the frustum planes from the given projection matrix.\n\t *\n\t * @param {Matrix4} m - The projection matrix.\n\t * @param {(WebGLCoordinateSystem|WebGPUCoordinateSystem)} coordinateSystem - The coordinate system.\n\t * @param {boolean} [reversedDepth=false] - Whether to use a reversed depth.\n\t * @return {Frustum} A reference to this frustum.\n\t */\n\tsetFromProjectionMatrix( m, coordinateSystem = WebGLCoordinateSystem, reversedDepth = false ) {\n\n\t\tconst planes = this.planes;\n\t\tconst me = m.elements;\n\t\tconst me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\tconst me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\tconst me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\tconst me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\n\t\tif ( reversedDepth ) {\n\n\t\t\tplanes[ 4 ].setComponents( me2, me6, me10, me14 ).normalize(); // far\n\t\t\tplanes[ 5 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); // near\n\n\t\t} else {\n\n\t\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize(); // far\n\n\t\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize(); // near\n\n\t\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tplanes[ 5 ].setComponents( me2, me6, me10, me14 ).normalize(); // near\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the 3D object's bounding sphere is intersecting this frustum.\n\t *\n\t * Note that the 3D object must have a geometry so that the bounding sphere can be calculated.\n\t *\n\t * @param {Object3D} object - The 3D object to test.\n\t * @return {boolean} Whether the 3D object's bounding sphere is intersecting this frustum or not.\n\t */\n\tintersectsObject( object ) {\n\n\t\tif ( object.boundingSphere !== undefined ) {\n\n\t\t\tif ( object.boundingSphere === null ) object.computeBoundingSphere();\n\n\t\t\t_sphere$3.copy( object.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\t} else {\n\n\t\t\tconst geometry = object.geometry;\n\n\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t_sphere$3.copy( geometry.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\t}\n\n\t\treturn this.intersectsSphere( _sphere$3 );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given sprite is intersecting this frustum.\n\t *\n\t * @param {Sprite} sprite - The sprite to test.\n\t * @return {boolean} Whether the sprite is intersecting this frustum or not.\n\t */\n\tintersectsSprite( sprite ) {\n\n\t\t_sphere$3.center.set( 0, 0, 0 );\n\n\t\tconst offset = _defaultSpriteCenter.distanceTo( sprite.center );\n\n\t\t_sphere$3.radius = 0.7071067811865476 + offset;\n\t\t_sphere$3.applyMatrix4( sprite.matrixWorld );\n\n\t\treturn this.intersectsSphere( _sphere$3 );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere is intersecting this frustum.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @return {boolean} Whether the bounding sphere is intersecting this frustum or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\tconst planes = this.planes;\n\t\tconst center = sphere.center;\n\t\tconst negRadius = - sphere.radius;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst distance = planes[ i ].distanceToPoint( center );\n\n\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box is intersecting this frustum.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the bounding box is intersecting this frustum or not.\n\t */\n\tintersectsBox( box ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst plane = planes[ i ];\n\n\t\t\t// corner at max distance\n\n\t\t\t_vector$6.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t_vector$6.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t_vector$6.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\tif ( plane.distanceToPoint( _vector$6 ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within the frustum.\n\t *\n\t * @param {Vector3} point - The point to test.\n\t * @return {boolean} Whether the point lies within this frustum or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Returns a new frustum with copied values from this instance.\n\t *\n\t * @return {Frustum} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _projScreenMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _frustum$1 = /*@__PURE__*/ new Frustum();\n\n/**\n * FrustumArray is used to determine if an object is visible in at least one camera\n * from an array of cameras. This is particularly useful for multi-view renderers.\n*/\nclass FrustumArray {\n\n\t/**\n\t * Constructs a new frustum array.\n\t *\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The coordinate system to use.\n\t\t *\n\t\t * @type {WebGLCoordinateSystem|WebGPUCoordinateSystem}\n\t\t * @default WebGLCoordinateSystem\n\t\t */\n\t\tthis.coordinateSystem = WebGLCoordinateSystem;\n\n\t}\n\n\t/**\n\t * Returns `true` if the 3D object's bounding sphere is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Object3D} object - The 3D object to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the 3D object is visible in any camera.\n\t */\n\tintersectsObject( object, cameraArray ) {\n\n\t\tif ( ! cameraArray.isArrayCamera || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$1.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$1,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsObject( object ) ) {\n\n\t\t\t\treturn true; // Object is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given sprite is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Sprite} sprite - The sprite to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the sprite is visible in any camera.\n\t */\n\tintersectsSprite( sprite, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$1.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$1,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsSprite( sprite ) ) {\n\n\t\t\t\treturn true; // Sprite is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the sphere is visible in any camera.\n\t */\n\tintersectsSphere( sphere, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$1.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$1,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsSphere( sphere ) ) {\n\n\t\t\t\treturn true; // Sphere is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box is intersecting any frustum\n\t * from the camera array.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the box is visible in any camera.\n\t */\n\tintersectsBox( box, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$1.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$1,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.intersectsBox( box ) ) {\n\n\t\t\t\treturn true; // Box is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within any frustum\n\t * from the camera array.\n\t *\n\t * @param {Vector3} point - The point to test.\n\t * @param {Object} cameraArray - An object with a cameras property containing an array of cameras.\n\t * @return {boolean} Whether the point is visible in any camera.\n\t */\n\tcontainsPoint( point, cameraArray ) {\n\n\t\tif ( ! cameraArray || ! cameraArray.cameras || cameraArray.cameras.length === 0 ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameraArray.cameras.length; i ++ ) {\n\n\t\t\tconst camera = cameraArray.cameras[ i ];\n\n\t\t\t_projScreenMatrix$1.multiplyMatrices(\n\t\t\t\tcamera.projectionMatrix,\n\t\t\t\tcamera.matrixWorldInverse\n\t\t\t);\n\n\t\t\t_frustum$1.setFromProjectionMatrix(\n\t\t\t\t_projScreenMatrix$1,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t\tif ( _frustum$1.containsPoint( point ) ) {\n\n\t\t\t\treturn true; // Point is visible in at least one camera\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false; // Not visible in any camera\n\n\t}\n\n\t/**\n\t * Returns a new frustum array with copied values from this instance.\n\t *\n\t * @return {FrustumArray} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new FrustumArray();\n\n\t}\n\n}\n\nfunction ascIdSort( a, b ) {\n\n\treturn a - b;\n\n}\n\nfunction sortOpaque( a, b ) {\n\n\treturn a.z - b.z;\n\n}\n\nfunction sortTransparent( a, b ) {\n\n\treturn b.z - a.z;\n\n}\n\nclass MultiDrawRenderList {\n\n\tconstructor() {\n\n\t\tthis.index = 0;\n\t\tthis.pool = [];\n\t\tthis.list = [];\n\n\t}\n\n\tpush( start, count, z, index ) {\n\n\t\tconst pool = this.pool;\n\t\tconst list = this.list;\n\t\tif ( this.index >= pool.length ) {\n\n\t\t\tpool.push( {\n\n\t\t\t\tstart: -1,\n\t\t\t\tcount: -1,\n\t\t\t\tz: -1,\n\t\t\t\tindex: -1,\n\n\t\t\t} );\n\n\t\t}\n\n\t\tconst item = pool[ this.index ];\n\t\tlist.push( item );\n\t\tthis.index ++;\n\n\t\titem.start = start;\n\t\titem.count = count;\n\t\titem.z = z;\n\t\titem.index = index;\n\n\t}\n\n\treset() {\n\n\t\tthis.list.length = 0;\n\t\tthis.index = 0;\n\n\t}\n\n}\n\nconst _matrix$1 = /*@__PURE__*/ new Matrix4();\nconst _whiteColor = /*@__PURE__*/ new Color( 1, 1, 1 );\nconst _frustum = /*@__PURE__*/ new Frustum();\nconst _frustumArray = /*@__PURE__*/ new FrustumArray();\nconst _box$1 = /*@__PURE__*/ new Box3();\nconst _sphere$2 = /*@__PURE__*/ new Sphere();\nconst _vector$5 = /*@__PURE__*/ new Vector3();\nconst _forward$1 = /*@__PURE__*/ new Vector3();\nconst _temp = /*@__PURE__*/ new Vector3();\nconst _renderList = /*@__PURE__*/ new MultiDrawRenderList();\nconst _mesh = /*@__PURE__*/ new Mesh();\nconst _batchIntersects = [];\n\n// copies data from attribute \"src\" into \"target\" starting at \"targetOffset\"\nfunction copyAttributeData( src, target, targetOffset = 0 ) {\n\n\tconst itemSize = target.itemSize;\n\tif ( src.isInterleavedBufferAttribute || src.array.constructor !== target.array.constructor ) {\n\n\t\t// use the component getters and setters if the array data cannot\n\t\t// be copied directly\n\t\tconst vertexCount = src.count;\n\t\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\ttarget.setComponent( i + targetOffset, c, src.getComponent( i, c ) );\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\t// faster copy approach using typed array set function\n\t\ttarget.array.set( src.array, targetOffset * itemSize );\n\n\t}\n\n\ttarget.needsUpdate = true;\n\n}\n\n// safely copies array contents to a potentially smaller array\nfunction copyArrayContents( src, target ) {\n\n\tif ( src.constructor !== target.constructor ) {\n\n\t\t// if arrays are of a different type (eg due to index size increasing) then data must be per-element copied\n\t\tconst len = Math.min( src.length, target.length );\n\t\tfor ( let i = 0; i < len; i ++ ) {\n\n\t\t\ttarget[ i ] = src[ i ];\n\n\t\t}\n\n\t} else {\n\n\t\t// if the arrays use the same data layout we can use a fast block copy\n\t\tconst len = Math.min( src.length, target.length );\n\t\ttarget.set( new src.constructor( src.buffer, 0, len ) );\n\n\t}\n\n}\n\n/**\n * A special version of a mesh with multi draw batch rendering support. Use\n * this class if you have to render a large number of objects with the same\n * material but with different geometries or world transformations. The usage of\n * `BatchedMesh` will help you to reduce the number of draw calls and thus improve the overall\n * rendering performance in your application.\n *\n * ```js\n * const box = new THREE.BoxGeometry( 1, 1, 1 );\n * const sphere = new THREE.SphereGeometry( 1, 12, 12 );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n *\n * // initialize and add geometries into the batched mesh\n * const batchedMesh = new BatchedMesh( 10, 5000, 10000, material );\n * const boxGeometryId = batchedMesh.addGeometry( box );\n * const sphereGeometryId = batchedMesh.addGeometry( sphere );\n *\n * // create instances of those geometries\n * const boxInstancedId1 = batchedMesh.addInstance( boxGeometryId );\n * const boxInstancedId2 = batchedMesh.addInstance( boxGeometryId );\n *\n * const sphereInstancedId1 = batchedMesh.addInstance( sphereGeometryId );\n * const sphereInstancedId2 = batchedMesh.addInstance( sphereGeometryId );\n *\n * // position the geometries\n * batchedMesh.setMatrixAt( boxInstancedId1, boxMatrix1 );\n * batchedMesh.setMatrixAt( boxInstancedId2, boxMatrix2 );\n *\n * batchedMesh.setMatrixAt( sphereInstancedId1, sphereMatrix1 );\n * batchedMesh.setMatrixAt( sphereInstancedId2, sphereMatrix2 );\n *\n * scene.add( batchedMesh );\n * ```\n *\n * @augments Mesh\n */\nclass BatchedMesh extends Mesh {\n\n\t/**\n\t * Constructs a new batched mesh.\n\t *\n\t * @param {number} maxInstanceCount - The maximum number of individual instances planned to be added and rendered.\n\t * @param {number} maxVertexCount - The maximum number of vertices to be used by all unique geometries.\n\t * @param {number} [maxIndexCount=maxVertexCount*2] - The maximum number of indices to be used by all unique geometries\n\t * @param {Material|Array<Material>} [material] - The mesh material.\n\t */\n\tconstructor( maxInstanceCount, maxVertexCount, maxIndexCount = maxVertexCount * 2, material ) {\n\n\t\tsuper( new BufferGeometry(), material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBatchedMesh = true;\n\n\t\t/**\n\t\t * When set ot `true`, the individual objects of a batch are frustum culled.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.perObjectFrustumCulled = true;\n\n\t\t/**\n\t\t * When set to `true`, the individual objects of a batch are sorted to improve overdraw-related artifacts.\n\t\t * If the material is marked as \"transparent\" objects are rendered back to front and if not then they are\n\t\t * rendered front to back.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sortObjects = true;\n\n\t\t/**\n\t\t * The bounding box of the batched mesh. Can be computed via {@link BatchedMesh#computeBoundingBox}.\n\t\t *\n\t\t * @type {?Box3}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingBox = null;\n\n\t\t/**\n\t\t * The bounding sphere of the batched mesh. Can be computed via {@link BatchedMesh#computeBoundingSphere}.\n\t\t *\n\t\t * @type {?Sphere}\n\t\t * @default null\n\t\t */\n\t\tthis.boundingSphere = null;\n\n\t\t/**\n\t\t * Takes a sort a function that is run before render. The function takes a list of instances to\n\t\t * sort and a camera. The objects in the list include a \"z\" field to perform a depth-ordered\n\t\t * sort with.\n\t\t *\n\t\t * @type {?Function}\n\t\t * @default null\n\t\t */\n\t\tthis.customSort = null;\n\n\t\t// stores visible, active, and geometry id per instance and reserved buffer ranges for geometries\n\t\tthis._instanceInfo = [];\n\t\tthis._geometryInfo = [];\n\n\t\t// instance, geometry ids that have been set as inactive, and are available to be overwritten\n\t\tthis._availableInstanceIds = [];\n\t\tthis._availableGeometryIds = [];\n\n\t\t// used to track where the next point is that geometry should be inserted\n\t\tthis._nextIndexStart = 0;\n\t\tthis._nextVertexStart = 0;\n\t\tthis._geometryCount = 0;\n\n\t\t// flags\n\t\tthis._visibilityChanged = true;\n\t\tthis._geometryInitialized = false;\n\n\t\t// cached user options\n\t\tthis._maxInstanceCount = maxInstanceCount;\n\t\tthis._maxVertexCount = maxVertexCount;\n\t\tthis._maxIndexCount = maxIndexCount;\n\n\t\t// buffers for multi draw\n\t\tthis._multiDrawCounts = new Int32Array( maxInstanceCount );\n\t\tthis._multiDrawStarts = new Int32Array( maxInstanceCount );\n\t\tthis._multiDrawCount = 0;\n\t\tthis._multiDrawInstances = null;\n\n\t\t// Local matrix per geometry by using data texture\n\t\tthis._matricesTexture = null;\n\t\tthis._indirectTexture = null;\n\t\tthis._colorsTexture = null;\n\n\t\tthis._initMatricesTexture();\n\t\tthis._initIndirectTexture();\n\n\t}\n\n\t/**\n\t * The maximum number of individual instances that can be stored in the batch.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget maxInstanceCount() {\n\n\t\treturn this._maxInstanceCount;\n\n\t}\n\n\t/**\n\t * The instance count.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget instanceCount() {\n\n\t\treturn this._instanceInfo.length - this._availableInstanceIds.length;\n\n\t}\n\n\t/**\n\t * The number of unused vertices.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget unusedVertexCount() {\n\n\t\treturn this._maxVertexCount - this._nextVertexStart;\n\n\t}\n\n\t/**\n\t * The number of unused indices.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget unusedIndexCount() {\n\n\t\treturn this._maxIndexCount - this._nextIndexStart;\n\n\t}\n\n\t_initMatricesTexture() {\n\n\t\t// layout (1 matrix = 4 pixels)\n\t\t//      RGBA RGBA RGBA RGBA (=> column1, column2, column3, column4)\n\t\t//  with  8x8  pixel texture max   16 matrices * 4 pixels =  (8 * 8)\n\t\t//       16x16 pixel texture max   64 matrices * 4 pixels = (16 * 16)\n\t\t//       32x32 pixel texture max  256 matrices * 4 pixels = (32 * 32)\n\t\t//       64x64 pixel texture max 1024 matrices * 4 pixels = (64 * 64)\n\n\t\tlet size = Math.sqrt( this._maxInstanceCount * 4 ); // 4 pixels needed for 1 matrix\n\t\tsize = Math.ceil( size / 4 ) * 4;\n\t\tsize = Math.max( size, 4 );\n\n\t\tconst matricesArray = new Float32Array( size * size * 4 ); // 4 floats per RGBA pixel\n\t\tconst matricesTexture = new DataTexture( matricesArray, size, size, RGBAFormat, FloatType );\n\n\t\tthis._matricesTexture = matricesTexture;\n\n\t}\n\n\t_initIndirectTexture() {\n\n\t\tlet size = Math.sqrt( this._maxInstanceCount );\n\t\tsize = Math.ceil( size );\n\n\t\tconst indirectArray = new Uint32Array( size * size );\n\t\tconst indirectTexture = new DataTexture( indirectArray, size, size, RedIntegerFormat, UnsignedIntType );\n\n\t\tthis._indirectTexture = indirectTexture;\n\n\t}\n\n\t_initColorsTexture() {\n\n\t\tlet size = Math.sqrt( this._maxInstanceCount );\n\t\tsize = Math.ceil( size );\n\n\t\t// 4 floats per RGBA pixel initialized to white\n\t\tconst colorsArray = new Float32Array( size * size * 4 ).fill( 1 );\n\t\tconst colorsTexture = new DataTexture( colorsArray, size, size, RGBAFormat, FloatType );\n\t\tcolorsTexture.colorSpace = ColorManagement.workingColorSpace;\n\n\t\tthis._colorsTexture = colorsTexture;\n\n\t}\n\n\t_initializeGeometry( reference ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst maxVertexCount = this._maxVertexCount;\n\t\tconst maxIndexCount = this._maxIndexCount;\n\t\tif ( this._geometryInitialized === false ) {\n\n\t\t\tfor ( const attributeName in reference.attributes ) {\n\n\t\t\t\tconst srcAttribute = reference.getAttribute( attributeName );\n\t\t\t\tconst { array, itemSize, normalized } = srcAttribute;\n\n\t\t\t\tconst dstArray = new array.constructor( maxVertexCount * itemSize );\n\t\t\t\tconst dstAttribute = new BufferAttribute( dstArray, itemSize, normalized );\n\n\t\t\t\tgeometry.setAttribute( attributeName, dstAttribute );\n\n\t\t\t}\n\n\t\t\tif ( reference.getIndex() !== null ) {\n\n\t\t\t\t// Reserve last u16 index for primitive restart.\n\t\t\t\tconst indexArray = maxVertexCount > 65535\n\t\t\t\t\t? new Uint32Array( maxIndexCount )\n\t\t\t\t\t: new Uint16Array( maxIndexCount );\n\n\t\t\t\tgeometry.setIndex( new BufferAttribute( indexArray, 1 ) );\n\n\t\t\t}\n\n\t\t\tthis._geometryInitialized = true;\n\n\t\t}\n\n\t}\n\n\t// Make sure the geometry is compatible with the existing combined geometry attributes\n\t_validateGeometry( geometry ) {\n\n\t\t// check to ensure the geometries are using consistent attributes and indices\n\t\tconst batchGeometry = this.geometry;\n\t\tif ( Boolean( geometry.getIndex() ) !== Boolean( batchGeometry.getIndex() ) ) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: All geometries must consistently have \"index\".' );\n\n\t\t}\n\n\t\tfor ( const attributeName in batchGeometry.attributes ) {\n\n\t\t\tif ( ! geometry.hasAttribute( attributeName ) ) {\n\n\t\t\t\tthrow new Error( `THREE.BatchedMesh: Added geometry missing \"${ attributeName }\". All geometries must have consistent attributes.` );\n\n\t\t\t}\n\n\t\t\tconst srcAttribute = geometry.getAttribute( attributeName );\n\t\t\tconst dstAttribute = batchGeometry.getAttribute( attributeName );\n\t\t\tif ( srcAttribute.itemSize !== dstAttribute.itemSize || srcAttribute.normalized !== dstAttribute.normalized ) {\n\n\t\t\t\tthrow new Error( 'THREE.BatchedMesh: All attributes must have a consistent itemSize and normalized value.' );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Validates the instance defined by the given ID.\n\t *\n\t * @param {number} instanceId - The instance to validate.\n\t */\n\tvalidateInstanceId( instanceId ) {\n\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tif ( instanceId < 0 || instanceId >= instanceInfo.length || instanceInfo[ instanceId ].active === false ) {\n\n\t\t\tthrow new Error( `THREE.BatchedMesh: Invalid instanceId ${instanceId}. Instance is either out of range or has been deleted.` );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Validates the geometry defined by the given ID.\n\t *\n\t * @param {number} geometryId - The geometry to validate.\n\t */\n\tvalidateGeometryId( geometryId ) {\n\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tif ( geometryId < 0 || geometryId >= geometryInfoList.length || geometryInfoList[ geometryId ].active === false ) {\n\n\t\t\tthrow new Error( `THREE.BatchedMesh: Invalid geometryId ${geometryId}. Geometry is either out of range or has been deleted.` );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Takes a sort a function that is run before render. The function takes a list of instances to\n\t * sort and a camera. The objects in the list include a \"z\" field to perform a depth-ordered sort with.\n\t *\n\t * @param {Function} func - The custom sort function.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetCustomSort( func ) {\n\n\t\tthis.customSort = func;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the bounding box, updating {@link BatchedMesh#boundingBox}.\n\t * Bounding boxes aren't computed by default. They need to be explicitly computed,\n\t * otherwise they are `null`.\n\t */\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst boundingBox = this.boundingBox;\n\t\tconst instanceInfo = this._instanceInfo;\n\n\t\tboundingBox.makeEmpty();\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( instanceInfo[ i ].active === false ) continue;\n\n\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\tthis.getBoundingBoxAt( geometryId, _box$1 ).applyMatrix4( _matrix$1 );\n\t\t\tboundingBox.union( _box$1 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the bounding sphere, updating {@link BatchedMesh#boundingSphere}.\n\t * Bounding spheres aren't computed by default. They need to be explicitly computed,\n\t * otherwise they are `null`.\n\t */\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tconst boundingSphere = this.boundingSphere;\n\t\tconst instanceInfo = this._instanceInfo;\n\n\t\tboundingSphere.makeEmpty();\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( instanceInfo[ i ].active === false ) continue;\n\n\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\tthis.getBoundingSphereAt( geometryId, _sphere$2 ).applyMatrix4( _matrix$1 );\n\t\t\tboundingSphere.union( _sphere$2 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Adds a new instance to the batch using the geometry of the given ID and returns\n\t * a new id referring to the new instance to be used by other functions.\n\t *\n\t * @param {number} geometryId - The ID of a previously added geometry via {@link BatchedMesh#addGeometry}.\n\t * @return {number} The instance ID.\n\t */\n\taddInstance( geometryId ) {\n\n\t\tconst atCapacity = this._instanceInfo.length >= this.maxInstanceCount;\n\n\t\t// ensure we're not over geometry\n\t\tif ( atCapacity && this._availableInstanceIds.length === 0 ) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Maximum item count reached.' );\n\n\t\t}\n\n\t\tconst instanceInfo = {\n\t\t\tvisible: true,\n\t\t\tactive: true,\n\t\t\tgeometryIndex: geometryId,\n\t\t};\n\n\t\tlet drawId = null;\n\n\t\t// Prioritize using previously freed instance ids\n\t\tif ( this._availableInstanceIds.length > 0 ) {\n\n\t\t\tthis._availableInstanceIds.sort( ascIdSort );\n\n\t\t\tdrawId = this._availableInstanceIds.shift();\n\t\t\tthis._instanceInfo[ drawId ] = instanceInfo;\n\n\t\t} else {\n\n\t\t\tdrawId = this._instanceInfo.length;\n\t\t\tthis._instanceInfo.push( instanceInfo );\n\n\t\t}\n\n\t\tconst matricesTexture = this._matricesTexture;\n\t\t_matrix$1.identity().toArray( matricesTexture.image.data, drawId * 16 );\n\t\tmatricesTexture.needsUpdate = true;\n\n\t\tconst colorsTexture = this._colorsTexture;\n\t\tif ( colorsTexture ) {\n\n\t\t\t_whiteColor.toArray( colorsTexture.image.data, drawId * 4 );\n\t\t\tcolorsTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tthis._visibilityChanged = true;\n\t\treturn drawId;\n\n\t}\n\n\t/**\n\t * Adds the given geometry to the batch and returns the associated\n\t * geometry id referring to it to be used in other functions.\n\t *\n\t * @param {BufferGeometry} geometry - The geometry to add.\n\t * @param {number} [reservedVertexCount=-1] - Optional parameter specifying the amount of\n\t * vertex buffer space to reserve for the added geometry. This is necessary if it is planned\n\t * to set a new geometry at this index at a later time that is larger than the original geometry.\n\t * Defaults to the length of the given geometry vertex buffer.\n\t * @param {number} [reservedIndexCount=-1] - Optional parameter specifying the amount of index\n\t * buffer space to reserve for the added geometry. This is necessary if it is planned to set a\n\t * new geometry at this index at a later time that is larger than the original geometry. Defaults to\n\t * the length of the given geometry index buffer.\n\t * @return {number} The geometry ID.\n\t */\n\taddGeometry( geometry, reservedVertexCount = -1, reservedIndexCount = -1 ) {\n\n\t\tthis._initializeGeometry( geometry );\n\n\t\tthis._validateGeometry( geometry );\n\n\t\tconst geometryInfo = {\n\t\t\t// geometry information\n\t\t\tvertexStart: -1,\n\t\t\tvertexCount: -1,\n\t\t\treservedVertexCount: -1,\n\n\t\t\tindexStart: -1,\n\t\t\tindexCount: -1,\n\t\t\treservedIndexCount: -1,\n\n\t\t\t// draw range information\n\t\t\tstart: -1,\n\t\t\tcount: -1,\n\n\t\t\t// state\n\t\t\tboundingBox: null,\n\t\t\tboundingSphere: null,\n\t\t\tactive: true,\n\t\t};\n\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tgeometryInfo.vertexStart = this._nextVertexStart;\n\t\tgeometryInfo.reservedVertexCount = reservedVertexCount === -1 ? geometry.getAttribute( 'position' ).count : reservedVertexCount;\n\n\t\tconst index = geometry.getIndex();\n\t\tconst hasIndex = index !== null;\n\t\tif ( hasIndex ) {\n\n\t\t\tgeometryInfo.indexStart = this._nextIndexStart;\n\t\t\tgeometryInfo.reservedIndexCount = reservedIndexCount === -1 ? index.count : reservedIndexCount;\n\n\t\t}\n\n\t\tif (\n\t\t\tgeometryInfo.indexStart !== -1 &&\n\t\t\tgeometryInfo.indexStart + geometryInfo.reservedIndexCount > this._maxIndexCount ||\n\t\t\tgeometryInfo.vertexStart + geometryInfo.reservedVertexCount > this._maxVertexCount\n\t\t) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Reserved space request exceeds the maximum buffer size.' );\n\n\t\t}\n\n\t\t// update id\n\t\tlet geometryId;\n\t\tif ( this._availableGeometryIds.length > 0 ) {\n\n\t\t\tthis._availableGeometryIds.sort( ascIdSort );\n\n\t\t\tgeometryId = this._availableGeometryIds.shift();\n\t\t\tgeometryInfoList[ geometryId ] = geometryInfo;\n\n\n\t\t} else {\n\n\t\t\tgeometryId = this._geometryCount;\n\t\t\tthis._geometryCount ++;\n\t\t\tgeometryInfoList.push( geometryInfo );\n\n\t\t}\n\n\t\t// update the geometry\n\t\tthis.setGeometryAt( geometryId, geometry );\n\n\t\t// increment the next geometry position\n\t\tthis._nextIndexStart = geometryInfo.indexStart + geometryInfo.reservedIndexCount;\n\t\tthis._nextVertexStart = geometryInfo.vertexStart + geometryInfo.reservedVertexCount;\n\n\t\treturn geometryId;\n\n\t}\n\n\t/**\n\t * Replaces the geometry at the given ID with the provided geometry. Throws an error if there\n\t * is not enough space reserved for geometry. Calling this will change all instances that are\n\t * rendering that geometry.\n\t *\n\t * @param {number} geometryId - The ID of the geometry that should be replaced with the given geometry.\n\t * @param {BufferGeometry} geometry - The new geometry.\n\t * @return {number} The geometry ID.\n\t */\n\tsetGeometryAt( geometryId, geometry ) {\n\n\t\tif ( geometryId >= this._geometryCount ) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Maximum geometry count reached.' );\n\n\t\t}\n\n\t\tthis._validateGeometry( geometry );\n\n\t\tconst batchGeometry = this.geometry;\n\t\tconst hasIndex = batchGeometry.getIndex() !== null;\n\t\tconst dstIndex = batchGeometry.getIndex();\n\t\tconst srcIndex = geometry.getIndex();\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\tif (\n\t\t\thasIndex &&\n\t\t\tsrcIndex.count > geometryInfo.reservedIndexCount ||\n\t\t\tgeometry.attributes.position.count > geometryInfo.reservedVertexCount\n\t\t) {\n\n\t\t\tthrow new Error( 'THREE.BatchedMesh: Reserved space not large enough for provided geometry.' );\n\n\t\t}\n\n\t\t// copy geometry buffer data over\n\t\tconst vertexStart = geometryInfo.vertexStart;\n\t\tconst reservedVertexCount = geometryInfo.reservedVertexCount;\n\t\tgeometryInfo.vertexCount = geometry.getAttribute( 'position' ).count;\n\n\t\tfor ( const attributeName in batchGeometry.attributes ) {\n\n\t\t\t// copy attribute data\n\t\t\tconst srcAttribute = geometry.getAttribute( attributeName );\n\t\t\tconst dstAttribute = batchGeometry.getAttribute( attributeName );\n\t\t\tcopyAttributeData( srcAttribute, dstAttribute, vertexStart );\n\n\t\t\t// fill the rest in with zeroes\n\t\t\tconst itemSize = srcAttribute.itemSize;\n\t\t\tfor ( let i = srcAttribute.count, l = reservedVertexCount; i < l; i ++ ) {\n\n\t\t\t\tconst index = vertexStart + i;\n\t\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\t\tdstAttribute.setComponent( index, c, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tdstAttribute.needsUpdate = true;\n\t\t\tdstAttribute.addUpdateRange( vertexStart * itemSize, reservedVertexCount * itemSize );\n\n\t\t}\n\n\t\t// copy index\n\t\tif ( hasIndex ) {\n\n\t\t\tconst indexStart = geometryInfo.indexStart;\n\t\t\tconst reservedIndexCount = geometryInfo.reservedIndexCount;\n\t\t\tgeometryInfo.indexCount = geometry.getIndex().count;\n\n\t\t\t// copy index data over\n\t\t\tfor ( let i = 0; i < srcIndex.count; i ++ ) {\n\n\t\t\t\tdstIndex.setX( indexStart + i, vertexStart + srcIndex.getX( i ) );\n\n\t\t\t}\n\n\t\t\t// fill the rest in with zeroes\n\t\t\tfor ( let i = srcIndex.count, l = reservedIndexCount; i < l; i ++ ) {\n\n\t\t\t\tdstIndex.setX( indexStart + i, vertexStart );\n\n\t\t\t}\n\n\t\t\tdstIndex.needsUpdate = true;\n\t\t\tdstIndex.addUpdateRange( indexStart, geometryInfo.reservedIndexCount );\n\n\t\t}\n\n\t\t// update the draw range\n\t\tgeometryInfo.start = hasIndex ? geometryInfo.indexStart : geometryInfo.vertexStart;\n\t\tgeometryInfo.count = hasIndex ? geometryInfo.indexCount : geometryInfo.vertexCount;\n\n\t\t// store the bounding boxes\n\t\tgeometryInfo.boundingBox = null;\n\t\tif ( geometry.boundingBox !== null ) {\n\n\t\t\tgeometryInfo.boundingBox = geometry.boundingBox.clone();\n\n\t\t}\n\n\t\tgeometryInfo.boundingSphere = null;\n\t\tif ( geometry.boundingSphere !== null ) {\n\n\t\t\tgeometryInfo.boundingSphere = geometry.boundingSphere.clone();\n\n\t\t}\n\n\t\tthis._visibilityChanged = true;\n\t\treturn geometryId;\n\n\t}\n\n\t/**\n\t * Deletes the geometry defined by the given ID from this batch. Any instances referencing\n\t * this geometry will also be removed as a side effect.\n\t *\n\t * @param {number} geometryId - The ID of the geometry to remove from the batch.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tdeleteGeometry( geometryId ) {\n\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tif ( geometryId >= geometryInfoList.length || geometryInfoList[ geometryId ].active === false ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\t// delete any instances associated with this geometry\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( instanceInfo[ i ].active && instanceInfo[ i ].geometryIndex === geometryId ) {\n\n\t\t\t\tthis.deleteInstance( i );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometryInfoList[ geometryId ].active = false;\n\t\tthis._availableGeometryIds.push( geometryId );\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Deletes an existing instance from the batch using the given ID.\n\t *\n\t * @param {number} instanceId - The ID of the instance to remove from the batch.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tdeleteInstance( instanceId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tthis._instanceInfo[ instanceId ].active = false;\n\t\tthis._availableInstanceIds.push( instanceId );\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Repacks the sub geometries in BatchedMesh to remove any unused space remaining from\n\t * previously deleted geometry, freeing up space to add new geometry.\n\t *\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\toptimize() {\n\n\t\t// track the next indices to copy data to\n\t\tlet nextVertexStart = 0;\n\t\tlet nextIndexStart = 0;\n\n\t\t// Iterate over all geometry ranges in order sorted from earliest in the geometry buffer to latest\n\t\t// in the geometry buffer. Because draw range objects can be reused there is no guarantee of their order.\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tconst indices = geometryInfoList\n\t\t\t.map( ( e, i ) => i )\n\t\t\t.sort( ( a, b ) => {\n\n\t\t\t\treturn geometryInfoList[ a ].vertexStart - geometryInfoList[ b ].vertexStart;\n\n\t\t\t} );\n\n\t\tconst geometry = this.geometry;\n\t\tfor ( let i = 0, l = geometryInfoList.length; i < l; i ++ ) {\n\n\t\t\t// if a geometry range is inactive then don't copy anything\n\t\t\tconst index = indices[ i ];\n\t\t\tconst geometryInfo = geometryInfoList[ index ];\n\t\t\tif ( geometryInfo.active === false ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// if a geometry contains an index buffer then shift it, as well\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\tif ( geometryInfo.indexStart !== nextIndexStart ) {\n\n\t\t\t\t\tconst { indexStart, vertexStart, reservedIndexCount } = geometryInfo;\n\t\t\t\t\tconst index = geometry.index;\n\t\t\t\t\tconst array = index.array;\n\n\t\t\t\t\t// shift the index pointers based on how the vertex data will shift\n\t\t\t\t\t// adjusting the index must happen first so the original vertex start value is available\n\t\t\t\t\tconst elementDelta = nextVertexStart - vertexStart;\n\t\t\t\t\tfor ( let j = indexStart; j < indexStart + reservedIndexCount; j ++ ) {\n\n\t\t\t\t\t\tarray[ j ] = array[ j ] + elementDelta;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tindex.array.copyWithin( nextIndexStart, indexStart, indexStart + reservedIndexCount );\n\t\t\t\t\tindex.addUpdateRange( nextIndexStart, reservedIndexCount );\n\t\t\t\t\tindex.needsUpdate = true;\n\n\t\t\t\t\tgeometryInfo.indexStart = nextIndexStart;\n\n\t\t\t\t}\n\n\t\t\t\tnextIndexStart += geometryInfo.reservedIndexCount;\n\n\t\t\t}\n\n\t\t\t// if a geometry needs to be moved then copy attribute data to overwrite unused space\n\t\t\tif ( geometryInfo.vertexStart !== nextVertexStart ) {\n\n\t\t\t\tconst { vertexStart, reservedVertexCount } = geometryInfo;\n\t\t\t\tconst attributes = geometry.attributes;\n\t\t\t\tfor ( const key in attributes ) {\n\n\t\t\t\t\tconst attribute = attributes[ key ];\n\t\t\t\t\tconst { array, itemSize } = attribute;\n\t\t\t\t\tarray.copyWithin( nextVertexStart * itemSize, vertexStart * itemSize, ( vertexStart + reservedVertexCount ) * itemSize );\n\t\t\t\t\tattribute.addUpdateRange( nextVertexStart * itemSize, reservedVertexCount * itemSize );\n\t\t\t\t\tattribute.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tgeometryInfo.vertexStart = nextVertexStart;\n\n\t\t\t}\n\n\t\t\tnextVertexStart += geometryInfo.reservedVertexCount;\n\t\t\tgeometryInfo.start = geometry.index ? geometryInfo.indexStart : geometryInfo.vertexStart;\n\n\t\t\t// step the next geometry points to the shifted position\n\t\t\tthis._nextIndexStart = geometry.index ? geometryInfo.indexStart + geometryInfo.reservedIndexCount : 0;\n\t\t\tthis._nextVertexStart = geometryInfo.vertexStart + geometryInfo.reservedVertexCount;\n\n\t\t}\n\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the bounding box for the given geometry.\n\t *\n\t * @param {number} geometryId - The ID of the geometry to return the bounding box for.\n\t * @param {Box3} target - The target object that is used to store the method's result.\n\t * @return {?Box3} The geometry's bounding box. Returns `null` if no geometry has been found for the given ID.\n\t */\n\tgetBoundingBoxAt( geometryId, target ) {\n\n\t\tif ( geometryId >= this._geometryCount ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// compute bounding box\n\t\tconst geometry = this.geometry;\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\tif ( geometryInfo.boundingBox === null ) {\n\n\t\t\tconst box = new Box3();\n\t\t\tconst index = geometry.index;\n\t\t\tconst position = geometry.attributes.position;\n\t\t\tfor ( let i = geometryInfo.start, l = geometryInfo.start + geometryInfo.count; i < l; i ++ ) {\n\n\t\t\t\tlet iv = i;\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tiv = index.getX( iv );\n\n\t\t\t\t}\n\n\t\t\t\tbox.expandByPoint( _vector$5.fromBufferAttribute( position, iv ) );\n\n\t\t\t}\n\n\t\t\tgeometryInfo.boundingBox = box;\n\n\t\t}\n\n\t\ttarget.copy( geometryInfo.boundingBox );\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the bounding sphere for the given geometry.\n\t *\n\t * @param {number} geometryId - The ID of the geometry to return the bounding sphere for.\n\t * @param {Sphere} target - The target object that is used to store the method's result.\n\t * @return {?Sphere} The geometry's bounding sphere. Returns `null` if no geometry has been found for the given ID.\n\t */\n\tgetBoundingSphereAt( geometryId, target ) {\n\n\t\tif ( geometryId >= this._geometryCount ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// compute bounding sphere\n\t\tconst geometry = this.geometry;\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\tif ( geometryInfo.boundingSphere === null ) {\n\n\t\t\tconst sphere = new Sphere();\n\t\t\tthis.getBoundingBoxAt( geometryId, _box$1 );\n\t\t\t_box$1.getCenter( sphere.center );\n\n\t\t\tconst index = geometry.index;\n\t\t\tconst position = geometry.attributes.position;\n\n\t\t\tlet maxRadiusSq = 0;\n\t\t\tfor ( let i = geometryInfo.start, l = geometryInfo.start + geometryInfo.count; i < l; i ++ ) {\n\n\t\t\t\tlet iv = i;\n\t\t\t\tif ( index ) {\n\n\t\t\t\t\tiv = index.getX( iv );\n\n\t\t\t\t}\n\n\t\t\t\t_vector$5.fromBufferAttribute( position, iv );\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, sphere.center.distanceToSquared( _vector$5 ) );\n\n\t\t\t}\n\n\t\t\tsphere.radius = Math.sqrt( maxRadiusSq );\n\t\t\tgeometryInfo.boundingSphere = sphere;\n\n\t\t}\n\n\t\ttarget.copy( geometryInfo.boundingSphere );\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Sets the given local transformation matrix to the defined instance.\n\t * Negatively scaled matrices are not supported.\n\t *\n\t * @param {number} instanceId - The ID of an instance to set the matrix of.\n\t * @param {Matrix4} matrix - A 4x4 matrix representing the local transformation of a single instance.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetMatrixAt( instanceId, matrix ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tconst matricesTexture = this._matricesTexture;\n\t\tconst matricesArray = this._matricesTexture.image.data;\n\t\tmatrix.toArray( matricesArray, instanceId * 16 );\n\t\tmatricesTexture.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the local transformation matrix of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the matrix of.\n\t * @param {Matrix4} matrix - The target object that is used to store the method's result.\n\t * @return {Matrix4} The instance's local transformation matrix.\n\t */\n\tgetMatrixAt( instanceId, matrix ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\t\treturn matrix.fromArray( this._matricesTexture.image.data, instanceId * 16 );\n\n\t}\n\n\t/**\n\t * Sets the given color to the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to set the color of.\n\t * @param {Color} color - The color to set the instance to.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetColorAt( instanceId, color ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tif ( this._colorsTexture === null ) {\n\n\t\t\tthis._initColorsTexture();\n\n\t\t}\n\n\t\tcolor.toArray( this._colorsTexture.image.data, instanceId * 4 );\n\t\tthis._colorsTexture.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the color of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the color of.\n\t * @param {Color} color - The target object that is used to store the method's result.\n\t * @return {Color} The instance's color.\n\t */\n\tgetColorAt( instanceId, color ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\t\treturn color.fromArray( this._colorsTexture.image.data, instanceId * 4 );\n\n\t}\n\n\t/**\n\t * Sets the visibility of the instance.\n\t *\n\t * @param {number} instanceId - The id of the instance to set the visibility of.\n\t * @param {boolean} visible - Whether the instance is visible or not.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetVisibleAt( instanceId, visible ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\tif ( this._instanceInfo[ instanceId ].visible === visible ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis._instanceInfo[ instanceId ].visible = visible;\n\t\tthis._visibilityChanged = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the visibility state of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the visibility state of.\n\t * @return {boolean} Whether the instance is visible or not.\n\t */\n\tgetVisibleAt( instanceId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\treturn this._instanceInfo[ instanceId ].visible;\n\n\t}\n\n\t/**\n\t * Sets the geometry ID of the instance at the given index.\n\t *\n\t * @param {number} instanceId - The ID of the instance to set the geometry ID of.\n\t * @param {number} geometryId - The geometry ID to be use by the instance.\n\t * @return {BatchedMesh} A reference to this batched mesh.\n\t */\n\tsetGeometryIdAt( instanceId, geometryId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\t\tthis.validateGeometryId( geometryId );\n\n\t\tthis._instanceInfo[ instanceId ].geometryIndex = geometryId;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the geometry ID of the defined instance.\n\t *\n\t * @param {number} instanceId - The ID of an instance to get the geometry ID of.\n\t * @return {number} The instance's geometry ID.\n\t */\n\tgetGeometryIdAt( instanceId ) {\n\n\t\tthis.validateInstanceId( instanceId );\n\n\t\treturn this._instanceInfo[ instanceId ].geometryIndex;\n\n\t}\n\n\t/**\n\t * Get the range representing the subset of triangles related to the attached geometry,\n\t * indicating the starting offset and count, or `null` if invalid.\n\t *\n\t * @param {number} geometryId - The id of the geometry to get the range of.\n\t * @param {Object} [target] - The target object that is used to store the method's result.\n\t * @return {{\n\t * \tvertexStart:number,vertexCount:number,reservedVertexCount:number,\n\t * \tindexStart:number,indexCount:number,reservedIndexCount:number,\n\t * \tstart:number,count:number\n\t * }} The result object with range data.\n\t */\n\tgetGeometryRangeAt( geometryId, target = {} ) {\n\n\t\tthis.validateGeometryId( geometryId );\n\n\t\tconst geometryInfo = this._geometryInfo[ geometryId ];\n\t\ttarget.vertexStart = geometryInfo.vertexStart;\n\t\ttarget.vertexCount = geometryInfo.vertexCount;\n\t\ttarget.reservedVertexCount = geometryInfo.reservedVertexCount;\n\n\t\ttarget.indexStart = geometryInfo.indexStart;\n\t\ttarget.indexCount = geometryInfo.indexCount;\n\t\ttarget.reservedIndexCount = geometryInfo.reservedIndexCount;\n\n\t\ttarget.start = geometryInfo.start;\n\t\ttarget.count = geometryInfo.count;\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Resizes the necessary buffers to support the provided number of instances.\n\t * If the provided arguments shrink the number of instances but there are not enough\n\t * unused Ids at the end of the list then an error is thrown.\n\t *\n\t * @param {number} maxInstanceCount - The max number of individual instances that can be added and rendered by the batch.\n\t*/\n\tsetInstanceCount( maxInstanceCount ) {\n\n\t\t// shrink the available instances as much as possible\n\t\tconst availableInstanceIds = this._availableInstanceIds;\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tavailableInstanceIds.sort( ascIdSort );\n\t\twhile ( availableInstanceIds[ availableInstanceIds.length - 1 ] === instanceInfo.length - 1 ) {\n\n\t\t\tinstanceInfo.pop();\n\t\t\tavailableInstanceIds.pop();\n\n\t\t}\n\n\t\t// throw an error if it can't be shrunk to the desired size\n\t\tif ( maxInstanceCount < instanceInfo.length ) {\n\n\t\t\tthrow new Error( `BatchedMesh: Instance ids outside the range ${ maxInstanceCount } are being used. Cannot shrink instance count.` );\n\n\t\t}\n\n\t\t// copy the multi draw counts\n\t\tconst multiDrawCounts = new Int32Array( maxInstanceCount );\n\t\tconst multiDrawStarts = new Int32Array( maxInstanceCount );\n\t\tcopyArrayContents( this._multiDrawCounts, multiDrawCounts );\n\t\tcopyArrayContents( this._multiDrawStarts, multiDrawStarts );\n\n\t\tthis._multiDrawCounts = multiDrawCounts;\n\t\tthis._multiDrawStarts = multiDrawStarts;\n\t\tthis._maxInstanceCount = maxInstanceCount;\n\n\t\t// update texture data for instance sampling\n\t\tconst indirectTexture = this._indirectTexture;\n\t\tconst matricesTexture = this._matricesTexture;\n\t\tconst colorsTexture = this._colorsTexture;\n\n\t\tindirectTexture.dispose();\n\t\tthis._initIndirectTexture();\n\t\tcopyArrayContents( indirectTexture.image.data, this._indirectTexture.image.data );\n\n\t\tmatricesTexture.dispose();\n\t\tthis._initMatricesTexture();\n\t\tcopyArrayContents( matricesTexture.image.data, this._matricesTexture.image.data );\n\n\t\tif ( colorsTexture ) {\n\n\t\t\tcolorsTexture.dispose();\n\t\t\tthis._initColorsTexture();\n\t\t\tcopyArrayContents( colorsTexture.image.data, this._colorsTexture.image.data );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Resizes the available space in the batch's vertex and index buffer attributes to the provided sizes.\n\t * If the provided arguments shrink the geometry buffers but there is not enough unused space at the\n\t * end of the geometry attributes then an error is thrown.\n\t *\n\t * @param {number} maxVertexCount - The maximum number of vertices to be used by all unique geometries to resize to.\n\t * @param {number} maxIndexCount - The maximum number of indices to be used by all unique geometries to resize to.\n\t*/\n\tsetGeometrySize( maxVertexCount, maxIndexCount ) {\n\n\t\t// Check if we can shrink to the requested vertex attribute size\n\t\tconst validRanges = [ ...this._geometryInfo ].filter( info => info.active );\n\t\tconst requiredVertexLength = Math.max( ...validRanges.map( range => range.vertexStart + range.reservedVertexCount ) );\n\t\tif ( requiredVertexLength > maxVertexCount ) {\n\n\t\t\tthrow new Error( `BatchedMesh: Geometry vertex values are being used outside the range ${ maxIndexCount }. Cannot shrink further.` );\n\n\t\t}\n\n\t\t// Check if we can shrink to the requested index attribute size\n\t\tif ( this.geometry.index ) {\n\n\t\t\tconst requiredIndexLength = Math.max( ...validRanges.map( range => range.indexStart + range.reservedIndexCount ) );\n\t\t\tif ( requiredIndexLength > maxIndexCount ) {\n\n\t\t\t\tthrow new Error( `BatchedMesh: Geometry index values are being used outside the range ${ maxIndexCount }. Cannot shrink further.` );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\t// dispose of the previous geometry\n\t\tconst oldGeometry = this.geometry;\n\t\toldGeometry.dispose();\n\n\t\t// recreate the geometry needed based on the previous variant\n\t\tthis._maxVertexCount = maxVertexCount;\n\t\tthis._maxIndexCount = maxIndexCount;\n\n\t\tif ( this._geometryInitialized ) {\n\n\t\t\tthis._geometryInitialized = false;\n\t\t\tthis.geometry = new BufferGeometry();\n\t\t\tthis._initializeGeometry( oldGeometry );\n\n\t\t}\n\n\t\t// copy data from the previous geometry\n\t\tconst geometry = this.geometry;\n\t\tif ( oldGeometry.index ) {\n\n\t\t\tcopyArrayContents( oldGeometry.index.array, geometry.index.array );\n\n\t\t}\n\n\t\tfor ( const key in oldGeometry.attributes ) {\n\n\t\t\tcopyArrayContents( oldGeometry.attributes[ key ].array, geometry.attributes[ key ].array );\n\n\t\t}\n\n\t}\n\n\traycast( raycaster, intersects ) {\n\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst batchGeometry = this.geometry;\n\n\t\t// iterate over each geometry\n\t\t_mesh.material = this.material;\n\t\t_mesh.geometry.index = batchGeometry.index;\n\t\t_mesh.geometry.attributes = batchGeometry.attributes;\n\t\tif ( _mesh.geometry.boundingBox === null ) {\n\n\t\t\t_mesh.geometry.boundingBox = new Box3();\n\n\t\t}\n\n\t\tif ( _mesh.geometry.boundingSphere === null ) {\n\n\t\t\t_mesh.geometry.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\tif ( ! instanceInfo[ i ].visible || ! instanceInfo[ i ].active ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\t\t\tconst geometryInfo = geometryInfoList[ geometryId ];\n\t\t\t_mesh.geometry.setDrawRange( geometryInfo.start, geometryInfo.count );\n\n\t\t\t// get the intersects\n\t\t\tthis.getMatrixAt( i, _mesh.matrixWorld ).premultiply( matrixWorld );\n\t\t\tthis.getBoundingBoxAt( geometryId, _mesh.geometry.boundingBox );\n\t\t\tthis.getBoundingSphereAt( geometryId, _mesh.geometry.boundingSphere );\n\t\t\t_mesh.raycast( raycaster, _batchIntersects );\n\n\t\t\t// add batch id to the intersects\n\t\t\tfor ( let j = 0, l = _batchIntersects.length; j < l; j ++ ) {\n\n\t\t\t\tconst intersect = _batchIntersects[ j ];\n\t\t\t\tintersect.object = this;\n\t\t\t\tintersect.batchId = i;\n\t\t\t\tintersects.push( intersect );\n\n\t\t\t}\n\n\t\t\t_batchIntersects.length = 0;\n\n\t\t}\n\n\t\t_mesh.material = null;\n\t\t_mesh.geometry.index = null;\n\t\t_mesh.geometry.attributes = {};\n\t\t_mesh.geometry.setDrawRange( 0, Infinity );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.geometry = source.geometry.clone();\n\t\tthis.perObjectFrustumCulled = source.perObjectFrustumCulled;\n\t\tthis.sortObjects = source.sortObjects;\n\t\tthis.boundingBox = source.boundingBox !== null ? source.boundingBox.clone() : null;\n\t\tthis.boundingSphere = source.boundingSphere !== null ? source.boundingSphere.clone() : null;\n\n\t\tthis._geometryInfo = source._geometryInfo.map( info => ( {\n\t\t\t...info,\n\n\t\t\tboundingBox: info.boundingBox !== null ? info.boundingBox.clone() : null,\n\t\t\tboundingSphere: info.boundingSphere !== null ? info.boundingSphere.clone() : null,\n\t\t} ) );\n\t\tthis._instanceInfo = source._instanceInfo.map( info => ( { ...info } ) );\n\n\t\tthis._availableInstanceIds = source._availableInstanceIds.slice();\n\t\tthis._availableGeometryIds = source._availableGeometryIds.slice();\n\n\t\tthis._nextIndexStart = source._nextIndexStart;\n\t\tthis._nextVertexStart = source._nextVertexStart;\n\t\tthis._geometryCount = source._geometryCount;\n\n\t\tthis._maxInstanceCount = source._maxInstanceCount;\n\t\tthis._maxVertexCount = source._maxVertexCount;\n\t\tthis._maxIndexCount = source._maxIndexCount;\n\n\t\tthis._geometryInitialized = source._geometryInitialized;\n\t\tthis._multiDrawCounts = source._multiDrawCounts.slice();\n\t\tthis._multiDrawStarts = source._multiDrawStarts.slice();\n\n\t\tthis._indirectTexture = source._indirectTexture.clone();\n\t\tthis._indirectTexture.image.data = this._indirectTexture.image.data.slice();\n\n\t\tthis._matricesTexture = source._matricesTexture.clone();\n\t\tthis._matricesTexture.image.data = this._matricesTexture.image.data.slice();\n\n\t\tif ( this._colorsTexture !== null ) {\n\n\t\t\tthis._colorsTexture = source._colorsTexture.clone();\n\t\t\tthis._colorsTexture.image.data = this._colorsTexture.image.data.slice();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\t// Assuming the geometry is not shared with other meshes\n\t\tthis.geometry.dispose();\n\n\t\tthis._matricesTexture.dispose();\n\t\tthis._matricesTexture = null;\n\n\t\tthis._indirectTexture.dispose();\n\t\tthis._indirectTexture = null;\n\n\t\tif ( this._colorsTexture !== null ) {\n\n\t\t\tthis._colorsTexture.dispose();\n\t\t\tthis._colorsTexture = null;\n\n\t\t}\n\n\t}\n\n\tonBeforeRender( renderer, scene, camera, geometry, material/*, _group*/ ) {\n\n\t\t// if visibility has not changed and frustum culling and object sorting is not required\n\t\t// then skip iterating over all items\n\t\tif ( ! this._visibilityChanged && ! this.perObjectFrustumCulled && ! this.sortObjects ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// the indexed version of the multi draw function requires specifying the start\n\t\t// offset in bytes.\n\t\tconst index = geometry.getIndex();\n\t\tconst bytesPerElement = index === null ? 1 : index.array.BYTES_PER_ELEMENT;\n\n\t\tconst instanceInfo = this._instanceInfo;\n\t\tconst multiDrawStarts = this._multiDrawStarts;\n\t\tconst multiDrawCounts = this._multiDrawCounts;\n\t\tconst geometryInfoList = this._geometryInfo;\n\t\tconst perObjectFrustumCulled = this.perObjectFrustumCulled;\n\t\tconst indirectTexture = this._indirectTexture;\n\t\tconst indirectArray = indirectTexture.image.data;\n\n\t\tconst frustum = camera.isArrayCamera ? _frustumArray : _frustum;\n\t\t// prepare the frustum in the local frame\n\t\tif ( perObjectFrustumCulled && ! camera.isArrayCamera ) {\n\n\t\t\t_matrix$1\n\t\t\t\t.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse )\n\t\t\t\t.multiply( this.matrixWorld );\n\n\t\t\t_frustum.setFromProjectionMatrix(\n\t\t\t\t_matrix$1,\n\t\t\t\tcamera.coordinateSystem,\n\t\t\t\tcamera.reversedDepth\n\t\t\t);\n\n\t\t}\n\n\t\tlet multiDrawCount = 0;\n\t\tif ( this.sortObjects ) {\n\n\t\t\t// get the camera position in the local frame\n\t\t\t_matrix$1.copy( this.matrixWorld ).invert();\n\t\t\t_vector$5.setFromMatrixPosition( camera.matrixWorld ).applyMatrix4( _matrix$1 );\n\t\t\t_forward$1.set( 0, 0, -1 ).transformDirection( camera.matrixWorld ).transformDirection( _matrix$1 );\n\n\t\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\t\tif ( instanceInfo[ i ].visible && instanceInfo[ i ].active ) {\n\n\t\t\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\n\t\t\t\t\t// get the bounds in world space\n\t\t\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\t\t\tthis.getBoundingSphereAt( geometryId, _sphere$2 ).applyMatrix4( _matrix$1 );\n\n\t\t\t\t\t// determine whether the batched geometry is within the frustum\n\t\t\t\t\tlet culled = false;\n\t\t\t\t\tif ( perObjectFrustumCulled ) {\n\n\t\t\t\t\t\tculled = ! frustum.intersectsSphere( _sphere$2, camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! culled ) {\n\n\t\t\t\t\t\t// get the distance from camera used for sorting\n\t\t\t\t\t\tconst geometryInfo = geometryInfoList[ geometryId ];\n\t\t\t\t\t\tconst z = _temp.subVectors( _sphere$2.center, _vector$5 ).dot( _forward$1 );\n\t\t\t\t\t\t_renderList.push( geometryInfo.start, geometryInfo.count, z, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Sort the draw ranges and prep for rendering\n\t\t\tconst list = _renderList.list;\n\t\t\tconst customSort = this.customSort;\n\t\t\tif ( customSort === null ) {\n\n\t\t\t\tlist.sort( material.transparent ? sortTransparent : sortOpaque );\n\n\t\t\t} else {\n\n\t\t\t\tcustomSort.call( this, list, camera );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = list.length; i < l; i ++ ) {\n\n\t\t\t\tconst item = list[ i ];\n\t\t\t\tmultiDrawStarts[ multiDrawCount ] = item.start * bytesPerElement;\n\t\t\t\tmultiDrawCounts[ multiDrawCount ] = item.count;\n\t\t\t\tindirectArray[ multiDrawCount ] = item.index;\n\t\t\t\tmultiDrawCount ++;\n\n\t\t\t}\n\n\t\t\t_renderList.reset();\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0, l = instanceInfo.length; i < l; i ++ ) {\n\n\t\t\t\tif ( instanceInfo[ i ].visible && instanceInfo[ i ].active ) {\n\n\t\t\t\t\tconst geometryId = instanceInfo[ i ].geometryIndex;\n\n\t\t\t\t\t// determine whether the batched geometry is within the frustum\n\t\t\t\t\tlet culled = false;\n\t\t\t\t\tif ( perObjectFrustumCulled ) {\n\n\t\t\t\t\t\t// get the bounds in world space\n\t\t\t\t\t\tthis.getMatrixAt( i, _matrix$1 );\n\t\t\t\t\t\tthis.getBoundingSphereAt( geometryId, _sphere$2 ).applyMatrix4( _matrix$1 );\n\t\t\t\t\t\tculled = ! frustum.intersectsSphere( _sphere$2, camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! culled ) {\n\n\t\t\t\t\t\tconst geometryInfo = geometryInfoList[ geometryId ];\n\t\t\t\t\t\tmultiDrawStarts[ multiDrawCount ] = geometryInfo.start * bytesPerElement;\n\t\t\t\t\t\tmultiDrawCounts[ multiDrawCount ] = geometryInfo.count;\n\t\t\t\t\t\tindirectArray[ multiDrawCount ] = i;\n\t\t\t\t\t\tmultiDrawCount ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tindirectTexture.needsUpdate = true;\n\t\tthis._multiDrawCount = multiDrawCount;\n\t\tthis._visibilityChanged = false;\n\n\t}\n\n\tonBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial/* , group */ ) {\n\n\t\tthis.onBeforeRender( renderer, null, shadowCamera, geometry, depthMaterial );\n\n\t}\n\n}\n\n/**\n * A material for rendering line primitives.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * ```js\n * const material = new THREE.LineBasicMaterial( { color: 0xffffff } );\n * ```\n *\n * @augments Material\n */\nclass LineBasicMaterial extends Material {\n\n\t/**\n\t * Constructs a new line basic material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineBasicMaterial = true;\n\n\t\tthis.type = 'LineBasicMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * Sets the color of the lines using data from a texture. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * Controls line thickness or lines.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}. WebGL and WebGPU\n\t\t * ignore this setting and always render line primitives with a\n\t\t * width of one pixel.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.linewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of line ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('butt'|'round'|'square')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.linecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of line joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.linejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.linewidth = source.linewidth;\n\t\tthis.linecap = source.linecap;\n\t\tthis.linejoin = source.linejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vStart = /*@__PURE__*/ new Vector3();\nconst _vEnd = /*@__PURE__*/ new Vector3();\n\nconst _inverseMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _ray$1 = /*@__PURE__*/ new Ray();\nconst _sphere$1 = /*@__PURE__*/ new Sphere();\n\nconst _intersectPointOnRay = /*@__PURE__*/ new Vector3();\nconst _intersectPointOnSegment = /*@__PURE__*/ new Vector3();\n\n/**\n * A continuous line. The line are rendered by connecting consecutive\n * vertices with straight lines.\n *\n * ```js\n * const material = new THREE.LineBasicMaterial( { color: 0x0000ff } );\n *\n * const points = [];\n * points.push( new THREE.Vector3( - 10, 0, 0 ) );\n * points.push( new THREE.Vector3( 0, 10, 0 ) );\n * points.push( new THREE.Vector3( 10, 0, 0 ) );\n *\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const line = new THREE.Line( geometry, material );\n * scene.add( line );\n * ```\n *\n * @augments Object3D\n */\nclass Line extends Object3D {\n\n\t/**\n\t * Constructs a new line.\n\t *\n\t * @param {BufferGeometry} [geometry] - The line geometry.\n\t * @param {Material|Array<Material>} [material] - The line material.\n\t */\n\tconstructor( geometry = new BufferGeometry(), material = new LineBasicMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLine = true;\n\n\t\tthis.type = 'Line';\n\n\t\t/**\n\t\t * The line geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = geometry;\n\n\t\t/**\n\t\t * The line material.\n\t\t *\n\t\t * @type {Material|Array<Material>}\n\t\t * @default LineBasicMaterial\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * A dictionary representing the morph targets in the geometry. The key is the\n\t\t * morph targets name, the value its attribute index. This member is `undefined`\n\t\t * by default and only set when morph targets are detected in the geometry.\n\t\t *\n\t\t * @type {Object<string,number>|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetDictionary = undefined;\n\n\t\t/**\n\t\t * An array of weights typically in the range `[0,1]` that specify how much of the morph\n\t\t * is applied. This member is `undefined` by default and only set when morph targets are\n\t\t * detected in the geometry.\n\t\t *\n\t\t * @type {Array<number>|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetInfluences = undefined;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes an array of distance values which are necessary for rendering dashed lines.\n\t * For each vertex in the geometry, the method calculates the cumulative length from the\n\t * current point to the very beginning of the line.\n\t *\n\t * @return {Line} A reference to this line.\n\t */\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\t// we assume non-indexed geometry\n\n\t\tif ( geometry.index === null ) {\n\n\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\tconst lineDistances = [ 0 ];\n\n\t\t\tfor ( let i = 1, l = positionAttribute.count; i < l; i ++ ) {\n\n\t\t\t\t_vStart.fromBufferAttribute( positionAttribute, i - 1 );\n\t\t\t\t_vEnd.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\tlineDistances[ i ] = lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i ] += _vStart.distanceTo( _vEnd );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t} else {\n\n\t\t\twarn( 'Line.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this line.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array<Object>} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Line.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere$1.copy( geometry.boundingSphere );\n\t\t_sphere$1.applyMatrix4( matrixWorld );\n\t\t_sphere$1.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere$1 ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix$1.copy( matrixWorld ).invert();\n\t\t_ray$1.copy( raycaster.ray ).applyMatrix4( _inverseMatrix$1 );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst step = this.isLineSegments ? 2 : 1;\n\n\t\tconst index = geometry.index;\n\t\tconst attributes = geometry.attributes;\n\t\tconst positionAttribute = attributes.position;\n\n\t\tif ( index !== null ) {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\tconst a = index.getX( i );\n\t\t\t\tconst b = index.getX( i + 1 );\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, a, b, i );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.isLineLoop ) {\n\n\t\t\t\tconst a = index.getX( end - 1 );\n\t\t\t\tconst b = index.getX( start );\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, a, b, end - 1 );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end - 1; i < l; i += step ) {\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, i, i + 1, i );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.isLineLoop ) {\n\n\t\t\t\tconst intersect = checkIntersection( this, raycaster, _ray$1, localThresholdSq, end - 1, start, end - 1 );\n\n\t\t\t\tif ( intersect ) {\n\n\t\t\t\t\tintersects.push( intersect );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the values of {@link Line#morphTargetDictionary} and {@link Line#morphTargetInfluences}\n\t * to make sure existing morph targets can influence this 3D object.\n\t */\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction checkIntersection( object, raycaster, ray, thresholdSq, a, b, i ) {\n\n\tconst positionAttribute = object.geometry.attributes.position;\n\n\t_vStart.fromBufferAttribute( positionAttribute, a );\n\t_vEnd.fromBufferAttribute( positionAttribute, b );\n\n\tconst distSq = ray.distanceSqToSegment( _vStart, _vEnd, _intersectPointOnRay, _intersectPointOnSegment );\n\n\tif ( distSq > thresholdSq ) return;\n\n\t_intersectPointOnRay.applyMatrix4( object.matrixWorld ); // Move back to world space for distance calculation\n\n\tconst distance = raycaster.ray.origin.distanceTo( _intersectPointOnRay );\n\n\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\treturn {\n\n\t\tdistance: distance,\n\t\t// What do we want? intersection point on the ray or on the segment??\n\t\t// point: raycaster.ray.at( distance ),\n\t\tpoint: _intersectPointOnSegment.clone().applyMatrix4( object.matrixWorld ),\n\t\tindex: i,\n\t\tface: null,\n\t\tfaceIndex: null,\n\t\tbarycoord: null,\n\t\tobject: object\n\n\t};\n\n}\n\nconst _start = /*@__PURE__*/ new Vector3();\nconst _end = /*@__PURE__*/ new Vector3();\n\n/**\n * A series of lines drawn between pairs of vertices.\n *\n * @augments Line\n */\nclass LineSegments extends Line {\n\n\t/**\n\t * Constructs a new line segments.\n\t *\n\t * @param {BufferGeometry} [geometry] - The line geometry.\n\t * @param {Material|Array<Material>} [material] - The line material.\n\t */\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineSegments = true;\n\n\t\tthis.type = 'LineSegments';\n\n\t}\n\n\tcomputeLineDistances() {\n\n\t\tconst geometry = this.geometry;\n\n\t\t// we assume non-indexed geometry\n\n\t\tif ( geometry.index === null ) {\n\n\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\tconst lineDistances = [];\n\n\t\t\tfor ( let i = 0, l = positionAttribute.count; i < l; i += 2 ) {\n\n\t\t\t\t_start.fromBufferAttribute( positionAttribute, i );\n\t\t\t\t_end.fromBufferAttribute( positionAttribute, i + 1 );\n\n\t\t\t\tlineDistances[ i ] = ( i === 0 ) ? 0 : lineDistances[ i - 1 ];\n\t\t\t\tlineDistances[ i + 1 ] = lineDistances[ i ] + _start.distanceTo( _end );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'lineDistance', new Float32BufferAttribute( lineDistances, 1 ) );\n\n\t\t} else {\n\n\t\t\twarn( 'LineSegments.computeLineDistances(): Computation only possible with non-indexed BufferGeometry.' );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A continuous line. This is nearly the same as {@link Line} the only difference\n * is that the last vertex is connected with the first vertex in order to close\n * the line to form a loop.\n *\n * @augments Line\n */\nclass LineLoop extends Line {\n\n\t/**\n\t * Constructs a new line loop.\n\t *\n\t * @param {BufferGeometry} [geometry] - The line geometry.\n\t * @param {Material|Array<Material>} [material] - The line material.\n\t */\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineLoop = true;\n\n\t\tthis.type = 'LineLoop';\n\n\t}\n\n}\n\n/**\n * A material for rendering point primitives.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * ```js\n * const vertices = [];\n *\n * for ( let i = 0; i < 10000; i ++ ) {\n * \tconst x = THREE.MathUtils.randFloatSpread( 2000 );\n * \tconst y = THREE.MathUtils.randFloatSpread( 2000 );\n * \tconst z = THREE.MathUtils.randFloatSpread( 2000 );\n *\n * \tvertices.push( x, y, z );\n * }\n *\n * const geometry = new THREE.BufferGeometry();\n * geometry.setAttribute( 'position', new THREE.Float32BufferAttribute( vertices, 3 ) );\n * const material = new THREE.PointsMaterial( { color: 0x888888 } );\n * const points = new THREE.Points( geometry, material );\n * scene.add( points );\n * ```\n *\n * @augments Material\n */\nclass PointsMaterial extends Material {\n\n\t/**\n\t * Constructs a new points material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPointsMaterial = true;\n\n\t\tthis.type = 'PointsMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * Defines the size of the points in pixels.\n\t\t *\n\t\t * Might be capped if the value exceeds hardware dependent parameters like [gl.ALIASED_POINT_SIZE_RANGE](https://developer.mozilla.org/en-US/docs/Web/API/WebGLRenderingContext/getParamete).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.size = 1;\n\n\t\t/**\n\t\t * Specifies whether size of individual points is attenuated by the camera depth (perspective camera only).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sizeAttenuation = true;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.size = source.size;\n\t\tthis.sizeAttenuation = source.sizeAttenuation;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _inverseMatrix = /*@__PURE__*/ new Matrix4();\nconst _ray = /*@__PURE__*/ new Ray();\nconst _sphere = /*@__PURE__*/ new Sphere();\nconst _position$2 = /*@__PURE__*/ new Vector3();\n\n/**\n * A class for displaying points or point clouds.\n *\n * @augments Object3D\n */\nclass Points extends Object3D {\n\n\t/**\n\t * Constructs a new point cloud.\n\t *\n\t * @param {BufferGeometry} [geometry] - The points geometry.\n\t * @param {Material|Array<Material>} [material] - The points material.\n\t */\n\tconstructor( geometry = new BufferGeometry(), material = new PointsMaterial() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPoints = true;\n\n\t\tthis.type = 'Points';\n\n\t\t/**\n\t\t * The points geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = geometry;\n\n\t\t/**\n\t\t * The line material.\n\t\t *\n\t\t * @type {Material|Array<Material>}\n\t\t * @default PointsMaterial\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * A dictionary representing the morph targets in the geometry. The key is the\n\t\t * morph targets name, the value its attribute index. This member is `undefined`\n\t\t * by default and only set when morph targets are detected in the geometry.\n\t\t *\n\t\t * @type {Object<string,number>|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetDictionary = undefined;\n\n\t\t/**\n\t\t * An array of weights typically in the range `[0,1]` that specify how much of the morph\n\t\t * is applied. This member is `undefined` by default and only set when morph targets are\n\t\t * detected in the geometry.\n\t\t *\n\t\t * @type {Array<number>|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.morphTargetInfluences = undefined;\n\n\t\tthis.updateMorphTargets();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.material = Array.isArray( source.material ) ? source.material.slice() : source.material;\n\t\tthis.geometry = source.geometry;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this point cloud.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array<Object>} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst threshold = raycaster.params.Points.threshold;\n\t\tconst drawRange = geometry.drawRange;\n\n\t\t// Checking boundingSphere distance to ray\n\n\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t_sphere.copy( geometry.boundingSphere );\n\t\t_sphere.applyMatrix4( matrixWorld );\n\t\t_sphere.radius += threshold;\n\n\t\tif ( raycaster.ray.intersectsSphere( _sphere ) === false ) return;\n\n\t\t//\n\n\t\t_inverseMatrix.copy( matrixWorld ).invert();\n\t\t_ray.copy( raycaster.ray ).applyMatrix4( _inverseMatrix );\n\n\t\tconst localThreshold = threshold / ( ( this.scale.x + this.scale.y + this.scale.z ) / 3 );\n\t\tconst localThresholdSq = localThreshold * localThreshold;\n\n\t\tconst index = geometry.index;\n\t\tconst attributes = geometry.attributes;\n\t\tconst positionAttribute = attributes.position;\n\n\t\tif ( index !== null ) {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, il = end; i < il; i ++ ) {\n\n\t\t\t\tconst a = index.getX( i );\n\n\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, a );\n\n\t\t\t\ttestPoint( _position$2, a, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst start = Math.max( 0, drawRange.start );\n\t\t\tconst end = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( let i = start, l = end; i < l; i ++ ) {\n\n\t\t\t\t_position$2.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\ttestPoint( _position$2, i, localThresholdSq, matrixWorld, raycaster, intersects, this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the values of {@link Points#morphTargetDictionary} and {@link Points#morphTargetInfluences}\n\t * to make sure existing morph targets can influence this 3D object.\n\t */\n\tupdateMorphTargets() {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst morphAttributes = geometry.morphAttributes;\n\t\tconst keys = Object.keys( morphAttributes );\n\n\t\tif ( keys.length > 0 ) {\n\n\t\t\tconst morphAttribute = morphAttributes[ keys[ 0 ] ];\n\n\t\t\tif ( morphAttribute !== undefined ) {\n\n\t\t\t\tthis.morphTargetInfluences = [];\n\t\t\t\tthis.morphTargetDictionary = {};\n\n\t\t\t\tfor ( let m = 0, ml = morphAttribute.length; m < ml; m ++ ) {\n\n\t\t\t\t\tconst name = morphAttribute[ m ].name || String( m );\n\n\t\t\t\t\tthis.morphTargetInfluences.push( 0 );\n\t\t\t\t\tthis.morphTargetDictionary[ name ] = m;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction testPoint( point, index, localThresholdSq, matrixWorld, raycaster, intersects, object ) {\n\n\tconst rayPointDistanceSq = _ray.distanceSqToPoint( point );\n\n\tif ( rayPointDistanceSq < localThresholdSq ) {\n\n\t\tconst intersectPoint = new Vector3();\n\n\t\t_ray.closestPointToPoint( point, intersectPoint );\n\t\tintersectPoint.applyMatrix4( matrixWorld );\n\n\t\tconst distance = raycaster.ray.origin.distanceTo( intersectPoint );\n\n\t\tif ( distance < raycaster.near || distance > raycaster.far ) return;\n\n\t\tintersects.push( {\n\n\t\t\tdistance: distance,\n\t\t\tdistanceToRay: Math.sqrt( rayPointDistanceSq ),\n\t\t\tpoint: intersectPoint,\n\t\t\tindex: index,\n\t\t\tface: null,\n\t\t\tfaceIndex: null,\n\t\t\tbarycoord: null,\n\t\t\tobject: object\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * A texture for use with a video.\n *\n * ```js\n * // assuming you have created a HTML video element with id=\"video\"\n * const video = document.getElementById( 'video' );\n * const texture = new THREE.VideoTexture( video );\n * ```\n *\n * Note: When using video textures with {@link WebGPURenderer}, {@link Texture#colorSpace} must be\n * set to THREE.SRGBColorSpace.\n *\n * Note: After the initial use of a texture, its dimensions, format, and type\n * cannot be changed. Instead, call {@link Texture#dispose} on the texture and instantiate a new one.\n *\n * @augments Texture\n */\nclass VideoTexture extends Texture {\n\n\t/**\n\t * Constructs a new video texture.\n\t *\n\t * @param {HTMLVideoElement} video - The video element to use as a data source for the texture.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t */\n\tconstructor( video, mapping, wrapS, wrapT, magFilter = LinearFilter, minFilter = LinearFilter, format, type, anisotropy ) {\n\n\t\tsuper( video, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isVideoTexture = true;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * The video frame request callback identifier, which is a positive integer.\n\t\t *\n\t\t * Value of 0 represents no scheduled rVFC.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t */\n\t\tthis._requestVideoFrameCallbackId = 0;\n\n\t\tconst scope = this;\n\n\t\tfunction updateVideo() {\n\n\t\t\tscope.needsUpdate = true;\n\t\t\tscope._requestVideoFrameCallbackId = video.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t\tif ( 'requestVideoFrameCallback' in video ) {\n\n\t\t\tthis._requestVideoFrameCallbackId = video.requestVideoFrameCallback( updateVideo );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.image ).copy( this );\n\n\t}\n\n\t/**\n\t * This method is called automatically by the renderer and sets {@link Texture#needsUpdate}\n\t * to `true` every time a new frame is available.\n\t *\n\t * Only relevant if `requestVideoFrameCallback` is not supported in the browser.\n\t */\n\tupdate() {\n\n\t\tconst video = this.image;\n\t\tconst hasVideoFrameCallback = 'requestVideoFrameCallback' in video;\n\n\t\tif ( hasVideoFrameCallback === false && video.readyState >= video.HAVE_CURRENT_DATA ) {\n\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\tdispose() {\n\n\t\tif ( this._requestVideoFrameCallbackId !== 0 ) {\n\n\t\t\tthis.source.data.cancelVideoFrameCallback( this._requestVideoFrameCallbackId );\n\n\t\t\tthis._requestVideoFrameCallbackId = 0;\n\n\t\t}\n\n\t\tsuper.dispose();\n\n\t}\n\n}\n\n/**\n * This class can be used as an alternative way to define video data. Instead of using\n * an instance of `HTMLVideoElement` like with `VideoTexture`, `VideoFrameTexture` expects each frame is\n * defined manually via {@link VideoFrameTexture#setFrame}. A typical use case for this module is when\n * video frames are decoded with the WebCodecs API.\n *\n * ```js\n * const texture = new THREE.VideoFrameTexture();\n * texture.setFrame( frame );\n * ```\n *\n * @augments VideoTexture\n */\nclass VideoFrameTexture extends VideoTexture {\n\n\t/**\n\t * Constructs a new video frame texture.\n\t *\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t */\n\tconstructor( mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( {}, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isVideoFrameTexture = true;\n\n\t}\n\n\t/**\n\t * This method overwritten with an empty implementation since\n\t * this type of texture is updated via `setFrame()`.\n\t */\n\tupdate() {}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this ); // restoring Texture.clone()\n\n\t}\n\n\t/**\n\t * Sets the current frame of the video. This will automatically update the texture\n\t * so the data can be used for rendering.\n\t *\n\t * @param {VideoFrame} frame - The video frame.\n\t */\n\tsetFrame( frame ) {\n\n\t\tthis.image = frame;\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\n/**\n * This class can only be used in combination with `copyFramebufferToTexture()` methods\n * of renderers. It extracts the contents of the current bound framebuffer and provides it\n * as a texture for further usage.\n *\n * ```js\n * const pixelRatio = window.devicePixelRatio;\n * const textureSize = 128 * pixelRatio;\n *\n * const frameTexture = new FramebufferTexture( textureSize, textureSize );\n *\n * // calculate start position for copying part of the frame data\n * const vector = new Vector2();\n * vector.x = ( window.innerWidth * pixelRatio / 2 ) - ( textureSize / 2 );\n * vector.y = ( window.innerHeight * pixelRatio / 2 ) - ( textureSize / 2 );\n *\n * renderer.render( scene, camera );\n *\n * // copy part of the rendered frame into the framebuffer texture\n * renderer.copyFramebufferToTexture( frameTexture, vector );\n * ```\n *\n * @augments Texture\n */\nclass FramebufferTexture extends Texture {\n\n\t/**\n\t * Constructs a new framebuffer texture.\n\t *\n\t * @param {number} [width] - The width of the texture.\n\t * @param {number} [height] - The height of the texture.\n\t */\n\tconstructor( width, height ) {\n\n\t\tsuper( { width, height } );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isFramebufferTexture = true;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers more than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default to disable filtering.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.magFilter = NearestFilter;\n\n\t\t/**\n\t\t * How the texture is sampled when a texel covers less than one pixel.\n\t\t *\n\t\t * Overwritten and set to `NearestFilter` by default to disable filtering.\n\t\t *\n\t\t * @type {(NearestFilter|NearestMipmapNearestFilter|NearestMipmapLinearFilter|LinearFilter|LinearMipmapNearestFilter|LinearMipmapLinearFilter)}\n\t\t * @default NearestFilter\n\t\t */\n\t\tthis.minFilter = NearestFilter;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\n/**\n * Creates a texture based on data in compressed form.\n *\n * These texture are usually loaded with {@link CompressedTextureLoader}.\n *\n * @augments Texture\n */\nclass CompressedTexture extends Texture {\n\n\t/**\n\t * Constructs a new compressed texture.\n\t *\n\t * @param {Array<Object>} mipmaps - This array holds for all mipmaps (including the bases mip)\n\t * the data and dimensions.\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space.\n\t */\n\tconstructor( mipmaps, width, height, format, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, colorSpace ) {\n\n\t\tsuper( null, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy, colorSpace );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCompressedTexture = true;\n\n\t\t/**\n\t\t * The image property of a compressed texture just defines its dimensions.\n\t\t *\n\t\t * @type {{width:number,height:number}}\n\t\t */\n\t\tthis.image = { width: width, height: height };\n\n\t\t/**\n\t\t * This array holds for all mipmaps (including the bases mip) the data and dimensions.\n\t\t *\n\t\t * @type {Array<Object>}\n\t\t */\n\t\tthis.mipmaps = mipmaps;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default since it is not possible to\n\t\t * flip compressed textures.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t * @readonly\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default since it is not\n\t\t * possible to generate mipmaps for compressed data. Mipmaps\n\t\t * must be embedded in the compressed texture file.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t * @readonly\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t}\n\n}\n\n/**\n * Creates a texture 2D array based on data in compressed form.\n *\n * These texture are usually loaded with {@link CompressedTextureLoader}.\n *\n * @augments CompressedTexture\n */\nclass CompressedArrayTexture extends CompressedTexture {\n\n\t/**\n\t * Constructs a new compressed array texture.\n\t *\n\t * @param {Array<Object>} mipmaps - This array holds for all mipmaps (including the bases mip)\n\t * the data and dimensions.\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} depth - The depth of the texture.\n\t * @param {number} [format=RGBAFormat] - The min filter value.\n\t * @param {number} [type=UnsignedByteType] - The min filter value.\n\t */\n\tconstructor( mipmaps, width, height, depth, format, type ) {\n\n\t\tsuper( mipmaps, width, height, format, type );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCompressedArrayTexture = true;\n\n\t\t/**\n\t\t * The image property of a compressed texture just defines its dimensions.\n\t\t *\n\t\t * @name CompressedArrayTexture#image\n\t\t * @type {{width:number,height:number,depth:number}}\n\t\t */\n\t\tthis.image.depth = depth;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped in the depth and corresponds to\n\t\t * *W* in UVW mapping.\n\t\t *\n\t\t * @type {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)}\n\t\t * @default ClampToEdgeWrapping\n\t\t */\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\t/**\n\t\t * A set of all layers which need to be updated in the texture.\n\t\t *\n\t\t * @type {Set<number>}\n\t\t */\n\t\tthis.layerUpdates = new Set();\n\n\t}\n\n\t/**\n\t * Describes that a specific layer of the texture needs to be updated.\n\t * Normally when {@link Texture#needsUpdate} is set to `true`, the\n\t * entire compressed texture array is sent to the GPU. Marking specific\n\t * layers will only transmit subsets of all mipmaps associated with a\n\t * specific depth in the array which is often much more performant.\n\t *\n\t * @param {number} layerIndex - The layer index that should be updated.\n\t */\n\taddLayerUpdate( layerIndex ) {\n\n\t\tthis.layerUpdates.add( layerIndex );\n\n\t}\n\n\t/**\n\t * Resets the layer updates registry.\n\t */\n\tclearLayerUpdates() {\n\n\t\tthis.layerUpdates.clear();\n\n\t}\n\n}\n\n/**\n * Creates a cube texture based on data in compressed form.\n *\n * These texture are usually loaded with {@link CompressedTextureLoader}.\n *\n * @augments CompressedTexture\n */\nclass CompressedCubeTexture extends CompressedTexture {\n\n\t/**\n\t * Constructs a new compressed texture.\n\t *\n\t * @param {Array<CompressedTexture>} images - An array of compressed textures.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t */\n\tconstructor( images, format, type ) {\n\n\t\tsuper( undefined, images[ 0 ].width, images[ 0 ].height, format, type, CubeReflectionMapping );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCompressedCubeTexture = true;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubeTexture = true;\n\n\t\tthis.image = images;\n\n\t}\n\n}\n\n/**\n * Creates a texture from a canvas element.\n *\n * This is almost the same as the base texture class, except that it sets {@link Texture#needsUpdate}\n * to `true` immediately since a canvas can directly be used for rendering.\n *\n * @augments Texture\n */\nclass CanvasTexture extends Texture {\n\n\t/**\n\t * Constructs a new texture.\n\t *\n\t * @param {HTMLCanvasElement} [canvas] - The HTML canvas element.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearMipmapLinearFilter] - The min filter value.\n\t * @param {number} [format=RGBAFormat] - The texture format.\n\t * @param {number} [type=UnsignedByteType] - The texture type.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t */\n\tconstructor( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy ) {\n\n\t\tsuper( canvas, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCanvasTexture = true;\n\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\n/**\n * This class can be used to automatically save the depth information of a\n * rendering into a texture.\n *\n * @augments Texture\n */\nclass DepthTexture extends Texture {\n\n\t/**\n\t * Constructs a new depth texture.\n\t *\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} [type=UnsignedIntType] - The texture type.\n\t * @param {number} [mapping=Texture.DEFAULT_MAPPING] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=LinearFilter] - The mag filter value.\n\t * @param {number} [minFilter=LinearFilter] - The min filter value.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {number} [format=DepthFormat] - The texture format.\n\t * @param {number} [depth=1] - The depth of the texture.\n\t */\n\tconstructor( width, height, type = UnsignedIntType, mapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, format = DepthFormat, depth = 1 ) {\n\n\t\tif ( format !== DepthFormat && format !== DepthStencilFormat ) {\n\n\t\t\tthrow new Error( 'DepthTexture format must be either THREE.DepthFormat or THREE.DepthStencilFormat' );\n\n\t\t}\n\n\t\tconst image = { width: width, height: height, depth: depth };\n\n\t\tsuper( image, mapping, wrapS, wrapT, magFilter, minFilter, format, type, anisotropy );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDepthTexture = true;\n\n\t\t/**\n\t\t * If set to `true`, the texture is flipped along the vertical axis when\n\t\t * uploaded to the GPU.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flipY = false;\n\n\t\t/**\n\t\t * Whether to generate mipmaps (if possible) for a texture.\n\t\t *\n\t\t * Overwritten and set to `false` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * Code corresponding to the depth compare function.\n\t\t *\n\t\t * @type {?(NeverCompare|LessCompare|EqualCompare|LessEqualCompare|GreaterCompare|NotEqualCompare|GreaterEqualCompare|AlwaysCompare)}\n\t\t * @default null\n\t\t */\n\t\tthis.compareFunction = null;\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.source = new Source( Object.assign( {}, source.image ) ); // see #30540\n\t\tthis.compareFunction = source.compareFunction;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tif ( this.compareFunction !== null ) data.compareFunction = this.compareFunction;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * This class can be used to automatically save the depth information of a\n * cube rendering into a cube texture with depth format. Used for PointLight shadows.\n *\n * @augments DepthTexture\n */\nclass CubeDepthTexture extends DepthTexture {\n\n\t/**\n\t * Constructs a new cube depth texture.\n\t *\n\t * @param {number} size - The size (width and height) of each cube face.\n\t * @param {number} [type=UnsignedIntType] - The texture type.\n\t * @param {number} [mapping=CubeReflectionMapping] - The texture mapping.\n\t * @param {number} [wrapS=ClampToEdgeWrapping] - The wrapS value.\n\t * @param {number} [wrapT=ClampToEdgeWrapping] - The wrapT value.\n\t * @param {number} [magFilter=NearestFilter] - The mag filter value.\n\t * @param {number} [minFilter=NearestFilter] - The min filter value.\n\t * @param {number} [anisotropy=Texture.DEFAULT_ANISOTROPY] - The anisotropy value.\n\t * @param {number} [format=DepthFormat] - The texture format.\n\t */\n\tconstructor( size, type = UnsignedIntType, mapping = CubeReflectionMapping, wrapS, wrapT, magFilter = NearestFilter, minFilter = NearestFilter, anisotropy, format = DepthFormat ) {\n\n\t\t// Create 6 identical image descriptors for the cube faces\n\t\tconst image = { width: size, height: size, depth: 1 };\n\t\tconst images = [ image, image, image, image, image, image ];\n\n\t\t// Call DepthTexture constructor with width, height\n\t\tsuper( size, size, type, mapping, wrapS, wrapT, magFilter, minFilter, anisotropy, format );\n\n\t\t// Replace the single image with the array of 6 images\n\t\tthis.image = images;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubeDepthTexture = true;\n\n\t\t/**\n\t\t * Set to true for cube texture handling in WebGLTextures.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubeTexture = true;\n\n\t}\n\n\t/**\n\t * Alias for {@link CubeDepthTexture#image}.\n\t *\n\t * @type {Array<Image>}\n\t */\n\tget images() {\n\n\t\treturn this.image;\n\n\t}\n\n\tset images( value ) {\n\n\t\tthis.image = value;\n\n\t}\n\n}\n\n/**\n * Represents a texture created externally with the same renderer context.\n *\n * This may be a texture from a protected media stream, device camera feed,\n * or other data feeds like a depth sensor.\n *\n * Note that this class is only supported in {@link WebGLRenderer}, and in\n * the {@link WebGPURenderer} WebGPU backend.\n *\n * @augments Texture\n */\nclass ExternalTexture extends Texture {\n\n\t/**\n\t * Creates a new raw texture.\n\t *\n\t * @param {?(WebGLTexture|GPUTexture)} [sourceTexture=null] - The external texture.\n\t */\n\tconstructor( sourceTexture = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The external source texture.\n\t\t *\n\t\t * @type {?(WebGLTexture|GPUTexture)}\n\t\t * @default null\n\t\t */\n\t\tthis.sourceTexture = sourceTexture;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isExternalTexture = true;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.sourceTexture = source.sourceTexture;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a capsule.\n *\n * ```js\n * const geometry = new THREE.CapsuleGeometry( 1, 1, 4, 8, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const capsule = new THREE.Mesh( geometry, material );\n * scene.add( capsule );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#CapsuleGeometry\n */\nclass CapsuleGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new capsule geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the capsule.\n\t * @param {number} [height=1] - Height of the middle section.\n\t * @param {number} [capSegments=4] - Number of curve segments used to build each cap.\n\t * @param {number} [radialSegments=8] - Number of segmented faces around the circumference of the capsule. Must be an integer >= 3.\n\t * @param {number} [heightSegments=1] - Number of rows of faces along the height of the middle section. Must be an integer >= 1.\n\t */\n\tconstructor( radius = 1, height = 1, capSegments = 4, radialSegments = 8, heightSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CapsuleGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tcapSegments: capSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t};\n\n\t\theight = Math.max( 0, height );\n\t\tcapSegments = Math.max( 1, Math.floor( capSegments ) );\n\t\tradialSegments = Math.max( 3, Math.floor( radialSegments ) );\n\t\theightSegments = Math.max( 1, Math.floor( heightSegments ) );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst halfHeight = height / 2;\n\t\tconst capArcLength = ( Math.PI / 2 ) * radius;\n\t\tconst cylinderPartLength = height;\n\t\tconst totalArcLength = 2 * capArcLength + cylinderPartLength;\n\n\t\tconst numVerticalSegments = capSegments * 2 + heightSegments;\n\t\tconst verticesPerRow = radialSegments + 1;\n\n\t\tconst normal = new Vector3();\n\t\tconst vertex = new Vector3();\n\n\t\t// generate vertices, normals, and uvs\n\n\t\tfor ( let iy = 0; iy <= numVerticalSegments; iy ++ ) {\n\n\t\t\tlet currentArcLength = 0;\n\t\t\tlet profileY = 0;\n\t\t\tlet profileRadius = 0;\n\t\t\tlet normalYComponent = 0;\n\n\t\t\tif ( iy <= capSegments ) {\n\n\t\t\t\t// bottom cap\n\t\t\t\tconst segmentProgress = iy / capSegments;\n\t\t\t\tconst angle = ( segmentProgress * Math.PI ) / 2;\n\t\t\t\tprofileY = - halfHeight - radius * Math.cos( angle );\n\t\t\t\tprofileRadius = radius * Math.sin( angle );\n\t\t\t\tnormalYComponent = - radius * Math.cos( angle );\n\t\t\t\tcurrentArcLength = segmentProgress * capArcLength;\n\n\t\t\t} else if ( iy <= capSegments + heightSegments ) {\n\n\t\t\t\t// middle section\n\t\t\t\tconst segmentProgress = ( iy - capSegments ) / heightSegments;\n\t\t\t\tprofileY = - halfHeight + segmentProgress * height;\n\t\t\t\tprofileRadius = radius;\n\t\t\t\tnormalYComponent = 0;\n\t\t\t\tcurrentArcLength = capArcLength + segmentProgress * cylinderPartLength;\n\n\t\t\t} else {\n\n\t\t\t\t// top cap\n\t\t\t\tconst segmentProgress =\n\t\t\t\t\t( iy - capSegments - heightSegments ) / capSegments;\n\t\t\t\tconst angle = ( segmentProgress * Math.PI ) / 2;\n\t\t\t\tprofileY = halfHeight + radius * Math.sin( angle );\n\t\t\t\tprofileRadius = radius * Math.cos( angle );\n\t\t\t\tnormalYComponent = radius * Math.sin( angle );\n\t\t\t\tcurrentArcLength =\n\t\t\t\t\tcapArcLength + cylinderPartLength + segmentProgress * capArcLength;\n\n\t\t\t}\n\n\t\t\tconst v = Math.max( 0, Math.min( 1, currentArcLength / totalArcLength ) );\n\n\n\t\t\t// special case for the poles\n\n\t\t\tlet uOffset = 0;\n\n\t\t\tif ( iy === 0 ) {\n\n\t\t\t\tuOffset = 0.5 / radialSegments;\n\n\t\t\t} else if ( iy === numVerticalSegments ) {\n\n\t\t\t\tuOffset = -0.5 / radialSegments;\n\n\t\t\t}\n\n\t\t\tfor ( let ix = 0; ix <= radialSegments; ix ++ ) {\n\n\t\t\t\tconst u = ix / radialSegments;\n\t\t\t\tconst theta = u * Math.PI * 2;\n\n\t\t\t\tconst sinTheta = Math.sin( theta );\n\t\t\t\tconst cosTheta = Math.cos( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - profileRadius * cosTheta;\n\t\t\t\tvertex.y = profileY;\n\t\t\t\tvertex.z = profileRadius * sinTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.set(\n\t\t\t\t\t- profileRadius * cosTheta,\n\t\t\t\t\tnormalYComponent,\n\t\t\t\t\tprofileRadius * sinTheta\n\t\t\t\t);\n\t\t\t\tnormal.normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u + uOffset, v );\n\n\t\t\t}\n\n\t\t\tif ( iy > 0 ) {\n\n\t\t\t\tconst prevIndexRow = ( iy - 1 ) * verticesPerRow;\n\t\t\t\tfor ( let ix = 0; ix < radialSegments; ix ++ ) {\n\n\t\t\t\t\tconst i1 = prevIndexRow + ix;\n\t\t\t\t\tconst i2 = prevIndexRow + ix + 1;\n\t\t\t\t\tconst i3 = iy * verticesPerRow + ix;\n\t\t\t\t\tconst i4 = iy * verticesPerRow + ix + 1;\n\n\t\t\t\t\tindices.push( i1, i2, i3 );\n\t\t\t\t\tindices.push( i2, i4, i3 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {CapsuleGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new CapsuleGeometry( data.radius, data.height, data.capSegments, data.radialSegments, data.heightSegments );\n\n\t}\n\n}\n\n/**\n * A simple shape of Euclidean geometry. It is constructed from a\n * number of triangular segments that are oriented around a central point and\n * extend as far out as a given radius. It is built counter-clockwise from a\n * start angle and a given central angle. It can also be used to create\n * regular polygons, where the number of segments determines the number of\n * sides.\n *\n * ```js\n * const geometry = new THREE.CircleGeometry( 5, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const circle = new THREE.Mesh( geometry, material );\n * scene.add( circle )\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#CircleGeometry\n */\nclass CircleGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new circle geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the circle.\n\t * @param {number} [segments=32] - Number of segments (triangles), minimum = `3`.\n\t * @param {number} [thetaStart=0] - Start angle for first segment in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - The central angle, often called theta,\n\t * of the circular sector in radians. The default value results in a complete circle.\n\t */\n\tconstructor( radius = 1, segments = 32, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CircleGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tsegments: segments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tsegments = Math.max( 3, segments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// center point\n\n\t\tvertices.push( 0, 0, 0 );\n\t\tnormals.push( 0, 0, 1 );\n\t\tuvs.push( 0.5, 0.5 );\n\n\t\tfor ( let s = 0, i = 3; s <= segments; s ++, i += 3 ) {\n\n\t\t\tconst segment = thetaStart + s / segments * thetaLength;\n\n\t\t\t// vertex\n\n\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t// normal\n\n\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t// uvs\n\n\t\t\tuv.x = ( vertices[ i ] / radius + 1 ) / 2;\n\t\t\tuv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;\n\n\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tindices.push( i, i + 1, 0 );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {CircleGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new CircleGeometry( data.radius, data.segments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a cylinder.\n *\n * ```js\n * const geometry = new THREE.CylinderGeometry( 5, 5, 20, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const cylinder = new THREE.Mesh( geometry, material );\n * scene.add( cylinder );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#CylinderGeometry\n */\nclass CylinderGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new cylinder geometry.\n\t *\n\t * @param {number} [radiusTop=1] - Radius of the cylinder at the top.\n\t * @param {number} [radiusBottom=1] - Radius of the cylinder at the bottom.\n\t * @param {number} [height=1] - Height of the cylinder.\n\t * @param {number} [radialSegments=32] - Number of segmented faces around the circumference of the cylinder.\n\t * @param {number} [heightSegments=1] - Number of rows of faces along the height of the cylinder.\n\t * @param {boolean} [openEnded=false] - Whether the base of the cylinder is open or capped.\n\t * @param {number} [thetaStart=0] - Start angle for first segment, in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - The central angle, often called theta, of the circular sector, in radians.\n\t * The default value results in a complete cylinder.\n\t */\n\tconstructor( radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'CylinderGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradiusTop: radiusTop,\n\t\t\tradiusBottom: radiusBottom,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tconst scope = this;\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet index = 0;\n\t\tconst indexArray = [];\n\t\tconst halfHeight = height / 2;\n\t\tlet groupStart = 0;\n\n\t\t// generate geometry\n\n\t\tgenerateTorso();\n\n\t\tif ( openEnded === false ) {\n\n\t\t\tif ( radiusTop > 0 ) generateCap( true );\n\t\t\tif ( radiusBottom > 0 ) generateCap( false );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tfunction generateTorso() {\n\n\t\t\tconst normal = new Vector3();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\t// this will be used to calculate the normal\n\t\t\tconst slope = ( radiusBottom - radiusTop ) / height;\n\n\t\t\t// generate vertices, normals and uvs\n\n\t\t\tfor ( let y = 0; y <= heightSegments; y ++ ) {\n\n\t\t\t\tconst indexRow = [];\n\n\t\t\t\tconst v = y / heightSegments;\n\n\t\t\t\t// calculate the radius of the current row\n\n\t\t\t\tconst radius = v * ( radiusBottom - radiusTop ) + radiusTop;\n\n\t\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\t\tconst u = x / radialSegments;\n\n\t\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\t\tconst sinTheta = Math.sin( theta );\n\t\t\t\t\tconst cosTheta = Math.cos( theta );\n\n\t\t\t\t\t// vertex\n\n\t\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\t\tvertex.y = - v * height + halfHeight;\n\t\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t\t// normal\n\n\t\t\t\t\tnormal.set( sinTheta, slope, cosTheta ).normalize();\n\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\t// uv\n\n\t\t\t\t\tuvs.push( u, 1 - v );\n\n\t\t\t\t\t// save index of vertex in respective row\n\n\t\t\t\t\tindexRow.push( index ++ );\n\n\t\t\t\t}\n\n\t\t\t\t// now save vertices of the row in our index array\n\n\t\t\t\tindexArray.push( indexRow );\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tfor ( let y = 0; y < heightSegments; y ++ ) {\n\n\t\t\t\t\t// we use the index array to access the correct indices\n\n\t\t\t\t\tconst a = indexArray[ y ][ x ];\n\t\t\t\t\tconst b = indexArray[ y + 1 ][ x ];\n\t\t\t\t\tconst c = indexArray[ y + 1 ][ x + 1 ];\n\t\t\t\t\tconst d = indexArray[ y ][ x + 1 ];\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tif ( radiusTop > 0 || y !== 0 ) {\n\n\t\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\t\tgroupCount += 3;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( radiusBottom > 0 || y !== heightSegments - 1 ) {\n\n\t\t\t\t\t\tindices.push( b, c, d );\n\t\t\t\t\t\tgroupCount += 3;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, 0 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t\tfunction generateCap( top ) {\n\n\t\t\t// save the index of the first center vertex\n\t\t\tconst centerIndexStart = index;\n\n\t\t\tconst uv = new Vector2();\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tlet groupCount = 0;\n\n\t\t\tconst radius = ( top === true ) ? radiusTop : radiusBottom;\n\t\t\tconst sign = ( top === true ) ? 1 : -1;\n\n\t\t\t// first we generate the center vertex data of the cap.\n\t\t\t// because the geometry needs one set of uvs per face,\n\t\t\t// we must generate a center vertex per face/segment\n\n\t\t\tfor ( let x = 1; x <= radialSegments; x ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertices.push( 0, halfHeight * sign, 0 );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( 0.5, 0.5 );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// save the index of the last center vertex\n\t\t\tconst centerIndexEnd = index;\n\n\t\t\t// now we generate the surrounding vertices, normals and uvs\n\n\t\t\tfor ( let x = 0; x <= radialSegments; x ++ ) {\n\n\t\t\t\tconst u = x / radialSegments;\n\t\t\t\tconst theta = u * thetaLength + thetaStart;\n\n\t\t\t\tconst cosTheta = Math.cos( theta );\n\t\t\t\tconst sinTheta = Math.sin( theta );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * sinTheta;\n\t\t\t\tvertex.y = halfHeight * sign;\n\t\t\t\tvertex.z = radius * cosTheta;\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, sign, 0 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( cosTheta * 0.5 ) + 0.5;\n\t\t\t\tuv.y = ( sinTheta * 0.5 * sign ) + 0.5;\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// increase index\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\t// generate indices\n\n\t\t\tfor ( let x = 0; x < radialSegments; x ++ ) {\n\n\t\t\t\tconst c = centerIndexStart + x;\n\t\t\t\tconst i = centerIndexEnd + x;\n\n\t\t\t\tif ( top === true ) {\n\n\t\t\t\t\t// face top\n\n\t\t\t\t\tindices.push( i, i + 1, c );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// face bottom\n\n\t\t\t\t\tindices.push( i + 1, i, c );\n\n\t\t\t\t}\n\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t\t// add a group to the geometry. this will ensure multi material support\n\n\t\t\tscope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );\n\n\t\t\t// calculate new start value for groups\n\n\t\t\tgroupStart += groupCount;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {CylinderGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new CylinderGeometry( data.radiusTop, data.radiusBottom, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a cone.\n *\n * ```js\n * const geometry = new THREE.ConeGeometry( 5, 20, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const cone = new THREE.Mesh(geometry, material );\n * scene.add( cone );\n * ```\n *\n * @augments CylinderGeometry\n * @demo scenes/geometry-browser.html#ConeGeometry\n */\nclass ConeGeometry extends CylinderGeometry {\n\n\t/**\n\t * Constructs a new cone geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the cone base.\n\t * @param {number} [height=1] - Height of the cone.\n\t * @param {number} [radialSegments=32] - Number of segmented faces around the circumference of the cone.\n\t * @param {number} [heightSegments=1] - Number of rows of faces along the height of the cone.\n\t * @param {boolean} [openEnded=false] - Whether the base of the cone is open or capped.\n\t * @param {number} [thetaStart=0] - Start angle for first segment, in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - The central angle, often called theta, of the circular sector, in radians.\n\t * The default value results in a complete cone.\n\t */\n\tconstructor( radius = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper( 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );\n\n\t\tthis.type = 'ConeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\theight: height,\n\t\t\tradialSegments: radialSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\topenEnded: openEnded,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {ConeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new ConeGeometry( data.radius, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A polyhedron is a solid in three dimensions with flat faces. This class\n * will take an array of vertices, project them onto a sphere, and then\n * divide them up to the desired level of detail.\n *\n * @augments BufferGeometry\n */\nclass PolyhedronGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new polyhedron geometry.\n\t *\n\t * @param {Array<number>} [vertices] - A flat array of vertices describing the base shape.\n\t * @param {Array<number>} [indices] - A flat array of indices describing the base shape.\n\t * @param {number} [radius=1] - The radius of the shape.\n\t * @param {number} [detail=0] - How many levels to subdivide the geometry. The more detail, the smoother the shape.\n\t */\n\tconstructor( vertices = [], indices = [], radius = 1, detail = 0 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PolyhedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tvertices: vertices,\n\t\t\tindices: indices,\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t\t// default buffer data\n\n\t\tconst vertexBuffer = [];\n\t\tconst uvBuffer = [];\n\n\t\t// the subdivision creates the vertex buffer data\n\n\t\tsubdivide( detail );\n\n\t\t// all vertices should lie on a conceptual sphere with a given radius\n\n\t\tapplyRadius( radius );\n\n\t\t// finally, create the uv data\n\n\t\tgenerateUVs();\n\n\t\t// build non-indexed geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );\n\n\t\tif ( detail === 0 ) {\n\n\t\t\tthis.computeVertexNormals(); // flat normals\n\n\t\t} else {\n\n\t\t\tthis.normalizeNormals(); // smooth normals\n\n\t\t}\n\n\t\t// helper functions\n\n\t\tfunction subdivide( detail ) {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\t// iterate over all faces and apply a subdivision with the given detail value\n\n\t\t\tfor ( let i = 0; i < indices.length; i += 3 ) {\n\n\t\t\t\t// get the vertices of the face\n\n\t\t\t\tgetVertexByIndex( indices[ i + 0 ], a );\n\t\t\t\tgetVertexByIndex( indices[ i + 1 ], b );\n\t\t\t\tgetVertexByIndex( indices[ i + 2 ], c );\n\n\t\t\t\t// perform subdivision\n\n\t\t\t\tsubdivideFace( a, b, c, detail );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction subdivideFace( a, b, c, detail ) {\n\n\t\t\tconst cols = detail + 1;\n\n\t\t\t// we use this multidimensional array as a data structure for creating the subdivision\n\n\t\t\tconst v = [];\n\n\t\t\t// construct all of the vertices for this subdivision\n\n\t\t\tfor ( let i = 0; i <= cols; i ++ ) {\n\n\t\t\t\tv[ i ] = [];\n\n\t\t\t\tconst aj = a.clone().lerp( c, i / cols );\n\t\t\t\tconst bj = b.clone().lerp( c, i / cols );\n\n\t\t\t\tconst rows = cols - i;\n\n\t\t\t\tfor ( let j = 0; j <= rows; j ++ ) {\n\n\t\t\t\t\tif ( j === 0 && i === cols ) {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv[ i ][ j ] = aj.clone().lerp( bj, j / rows );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// construct all of the faces\n\n\t\t\tfor ( let i = 0; i < cols; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {\n\n\t\t\t\t\tconst k = Math.floor( j / 2 );\n\n\t\t\t\t\tif ( j % 2 === 0 ) {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\t\t\t\t\t\tpushVertex( v[ i ][ k ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpushVertex( v[ i ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k + 1 ] );\n\t\t\t\t\t\tpushVertex( v[ i + 1 ][ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction applyRadius( radius ) {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\t// iterate over the entire buffer and apply the radius to each vertex\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tvertex.normalize().multiplyScalar( radius );\n\n\t\t\t\tvertexBuffer[ i + 0 ] = vertex.x;\n\t\t\t\tvertexBuffer[ i + 1 ] = vertex.y;\n\t\t\t\tvertexBuffer[ i + 2 ] = vertex.z;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tconst vertex = new Vector3();\n\n\t\t\tfor ( let i = 0; i < vertexBuffer.length; i += 3 ) {\n\n\t\t\t\tvertex.x = vertexBuffer[ i + 0 ];\n\t\t\t\tvertex.y = vertexBuffer[ i + 1 ];\n\t\t\t\tvertex.z = vertexBuffer[ i + 2 ];\n\n\t\t\t\tconst u = azimuth( vertex ) / 2 / Math.PI + 0.5;\n\t\t\t\tconst v = inclination( vertex ) / Math.PI + 0.5;\n\t\t\t\tuvBuffer.push( u, 1 - v );\n\n\t\t\t}\n\n\t\t\tcorrectUVs();\n\n\t\t\tcorrectSeam();\n\n\t\t}\n\n\t\tfunction correctSeam() {\n\n\t\t\t// handle case when face straddles the seam, see #3269\n\n\t\t\tfor ( let i = 0; i < uvBuffer.length; i += 6 ) {\n\n\t\t\t\t// uv data of a single face\n\n\t\t\t\tconst x0 = uvBuffer[ i + 0 ];\n\t\t\t\tconst x1 = uvBuffer[ i + 2 ];\n\t\t\t\tconst x2 = uvBuffer[ i + 4 ];\n\n\t\t\t\tconst max = Math.max( x0, x1, x2 );\n\t\t\t\tconst min = Math.min( x0, x1, x2 );\n\n\t\t\t\t// 0.9 is somewhat arbitrary\n\n\t\t\t\tif ( max > 0.9 && min < 0.1 ) {\n\n\t\t\t\t\tif ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;\n\t\t\t\t\tif ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;\n\t\t\t\t\tif ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction pushVertex( vertex ) {\n\n\t\t\tvertexBuffer.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\tfunction getVertexByIndex( index, vertex ) {\n\n\t\t\tconst stride = index * 3;\n\n\t\t\tvertex.x = vertices[ stride + 0 ];\n\t\t\tvertex.y = vertices[ stride + 1 ];\n\t\t\tvertex.z = vertices[ stride + 2 ];\n\n\t\t}\n\n\t\tfunction correctUVs() {\n\n\t\t\tconst a = new Vector3();\n\t\t\tconst b = new Vector3();\n\t\t\tconst c = new Vector3();\n\n\t\t\tconst centroid = new Vector3();\n\n\t\t\tconst uvA = new Vector2();\n\t\t\tconst uvB = new Vector2();\n\t\t\tconst uvC = new Vector2();\n\n\t\t\tfor ( let i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {\n\n\t\t\t\ta.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );\n\t\t\t\tb.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );\n\t\t\t\tc.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );\n\n\t\t\t\tuvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );\n\t\t\t\tuvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );\n\t\t\t\tuvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );\n\n\t\t\t\tcentroid.copy( a ).add( b ).add( c ).divideScalar( 3 );\n\n\t\t\t\tconst azi = azimuth( centroid );\n\n\t\t\t\tcorrectUV( uvA, j + 0, a, azi );\n\t\t\t\tcorrectUV( uvB, j + 2, b, azi );\n\t\t\t\tcorrectUV( uvC, j + 4, c, azi );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction correctUV( uv, stride, vector, azimuth ) {\n\n\t\t\tif ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = uv.x - 1;\n\n\t\t\t}\n\n\t\t\tif ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {\n\n\t\t\t\tuvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Angle around the Y axis, counter-clockwise when looking from above.\n\n\t\tfunction azimuth( vector ) {\n\n\t\t\treturn Math.atan2( vector.z, - vector.x );\n\n\t\t}\n\n\n\t\t// Angle above the XZ plane.\n\n\t\tfunction inclination( vector ) {\n\n\t\t\treturn Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {PolyhedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new PolyhedronGeometry( data.vertices, data.indices, data.radius, data.detail );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a dodecahedron.\n *\n * ```js\n * const geometry = new THREE.DodecahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const dodecahedron = new THREE.Mesh( geometry, material );\n * scene.add( dodecahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#DodecahedronGeometry\n */\nclass DodecahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new dodecahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the dodecahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a dodecahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\t\tconst r = 1 / t;\n\n\t\tconst vertices = [\n\n\t\t\t// (\u00B11, \u00B11, \u00B11)\n\t\t\t-1, -1, -1,\t-1, -1, 1,\n\t\t\t-1, 1, -1, -1, 1, 1,\n\t\t\t1, -1, -1, 1, -1, 1,\n\t\t\t1, 1, -1, 1, 1, 1,\n\n\t\t\t// (0, \u00B11/\u03C6, \u00B1\u03C6)\n\t\t\t0, - r, - t, 0, - r, t,\n\t\t\t0, r, - t, 0, r, t,\n\n\t\t\t// (\u00B11/\u03C6, \u00B1\u03C6, 0)\n\t\t\t- r, - t, 0, - r, t, 0,\n\t\t\tr, - t, 0, r, t, 0,\n\n\t\t\t// (\u00B1\u03C6, 0, \u00B11/\u03C6)\n\t\t\t- t, 0, - r, t, 0, - r,\n\t\t\t- t, 0, r, t, 0, r\n\t\t];\n\n\t\tconst indices = [\n\t\t\t3, 11, 7, \t3, 7, 15, \t3, 15, 13,\n\t\t\t7, 19, 17, \t7, 17, 6, \t7, 6, 15,\n\t\t\t17, 4, 8, \t17, 8, 10, \t17, 10, 6,\n\t\t\t8, 0, 16, \t8, 16, 2, \t8, 2, 10,\n\t\t\t0, 12, 1, \t0, 1, 18, \t0, 18, 16,\n\t\t\t6, 10, 2, \t6, 2, 13, \t6, 13, 15,\n\t\t\t2, 16, 18, \t2, 18, 3, \t2, 3, 13,\n\t\t\t18, 1, 9, \t18, 9, 11, \t18, 11, 3,\n\t\t\t4, 14, 12, \t4, 12, 0, \t4, 0, 8,\n\t\t\t11, 9, 5, \t11, 5, 19, \t11, 19, 7,\n\t\t\t19, 5, 14, \t19, 14, 4, \t19, 4, 17,\n\t\t\t1, 12, 14, \t1, 14, 5, \t1, 5, 9\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'DodecahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {DodecahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new DodecahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\nconst _v0 = /*@__PURE__*/ new Vector3();\nconst _v1$1 = /*@__PURE__*/ new Vector3();\nconst _normal = /*@__PURE__*/ new Vector3();\nconst _triangle = /*@__PURE__*/ new Triangle();\n\n/**\n * Can be used as a helper object to view the edges of a geometry.\n *\n * ```js\n * const geometry = new THREE.BoxGeometry();\n * const edges = new THREE.EdgesGeometry( geometry );\n * const line = new THREE.LineSegments( edges );\n * scene.add( line );\n * ```\n *\n * Note: It is not yet possible to serialize/deserialize instances of this class.\n *\n * @augments BufferGeometry\n */\nclass EdgesGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new edges geometry.\n\t *\n\t * @param {?BufferGeometry} [geometry=null] - The geometry.\n\t * @param {number} [thresholdAngle=1] - An edge is only rendered if the angle (in degrees)\n\t * between the face normals of the adjoining faces exceeds this value.\n\t */\n\tconstructor( geometry = null, thresholdAngle = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'EdgesGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry,\n\t\t\tthresholdAngle: thresholdAngle\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\tconst precisionPoints = 4;\n\t\t\tconst precision = Math.pow( 10, precisionPoints );\n\t\t\tconst thresholdDot = Math.cos( DEG2RAD * thresholdAngle );\n\n\t\t\tconst indexAttr = geometry.getIndex();\n\t\t\tconst positionAttr = geometry.getAttribute( 'position' );\n\t\t\tconst indexCount = indexAttr ? indexAttr.count : positionAttr.count;\n\n\t\t\tconst indexArr = [ 0, 0, 0 ];\n\t\t\tconst vertKeys = [ 'a', 'b', 'c' ];\n\t\t\tconst hashes = new Array( 3 );\n\n\t\t\tconst edgeData = {};\n\t\t\tconst vertices = [];\n\t\t\tfor ( let i = 0; i < indexCount; i += 3 ) {\n\n\t\t\t\tif ( indexAttr ) {\n\n\t\t\t\t\tindexArr[ 0 ] = indexAttr.getX( i );\n\t\t\t\t\tindexArr[ 1 ] = indexAttr.getX( i + 1 );\n\t\t\t\t\tindexArr[ 2 ] = indexAttr.getX( i + 2 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tindexArr[ 0 ] = i;\n\t\t\t\t\tindexArr[ 1 ] = i + 1;\n\t\t\t\t\tindexArr[ 2 ] = i + 2;\n\n\t\t\t\t}\n\n\t\t\t\tconst { a, b, c } = _triangle;\n\t\t\t\ta.fromBufferAttribute( positionAttr, indexArr[ 0 ] );\n\t\t\t\tb.fromBufferAttribute( positionAttr, indexArr[ 1 ] );\n\t\t\t\tc.fromBufferAttribute( positionAttr, indexArr[ 2 ] );\n\t\t\t\t_triangle.getNormal( _normal );\n\n\t\t\t\t// create hashes for the edge from the vertices\n\t\t\t\thashes[ 0 ] = `${ Math.round( a.x * precision ) },${ Math.round( a.y * precision ) },${ Math.round( a.z * precision ) }`;\n\t\t\t\thashes[ 1 ] = `${ Math.round( b.x * precision ) },${ Math.round( b.y * precision ) },${ Math.round( b.z * precision ) }`;\n\t\t\t\thashes[ 2 ] = `${ Math.round( c.x * precision ) },${ Math.round( c.y * precision ) },${ Math.round( c.z * precision ) }`;\n\n\t\t\t\t// skip degenerate triangles\n\t\t\t\tif ( hashes[ 0 ] === hashes[ 1 ] || hashes[ 1 ] === hashes[ 2 ] || hashes[ 2 ] === hashes[ 0 ] ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// iterate over every edge\n\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t// get the first and next vertex making up the edge\n\t\t\t\t\tconst jNext = ( j + 1 ) % 3;\n\t\t\t\t\tconst vecHash0 = hashes[ j ];\n\t\t\t\t\tconst vecHash1 = hashes[ jNext ];\n\t\t\t\t\tconst v0 = _triangle[ vertKeys[ j ] ];\n\t\t\t\t\tconst v1 = _triangle[ vertKeys[ jNext ] ];\n\n\t\t\t\t\tconst hash = `${ vecHash0 }_${ vecHash1 }`;\n\t\t\t\t\tconst reverseHash = `${ vecHash1 }_${ vecHash0 }`;\n\n\t\t\t\t\tif ( reverseHash in edgeData && edgeData[ reverseHash ] ) {\n\n\t\t\t\t\t\t// if we found a sibling edge add it into the vertex array if\n\t\t\t\t\t\t// it meets the angle threshold and delete the edge from the map.\n\t\t\t\t\t\tif ( _normal.dot( edgeData[ reverseHash ].normal ) <= thresholdDot ) {\n\n\t\t\t\t\t\t\tvertices.push( v0.x, v0.y, v0.z );\n\t\t\t\t\t\t\tvertices.push( v1.x, v1.y, v1.z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tedgeData[ reverseHash ] = null;\n\n\t\t\t\t\t} else if ( ! ( hash in edgeData ) ) {\n\n\t\t\t\t\t\t// if we've already got an edge here then skip adding a new one\n\t\t\t\t\t\tedgeData[ hash ] = {\n\n\t\t\t\t\t\t\tindex0: indexArr[ j ],\n\t\t\t\t\t\t\tindex1: indexArr[ jNext ],\n\t\t\t\t\t\t\tnormal: _normal.clone(),\n\n\t\t\t\t\t\t};\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// iterate over all remaining, unmatched edges and add them to the vertex array\n\t\t\tfor ( const key in edgeData ) {\n\n\t\t\t\tif ( edgeData[ key ] ) {\n\n\t\t\t\t\tconst { index0, index1 } = edgeData[ key ];\n\t\t\t\t\t_v0.fromBufferAttribute( positionAttr, index0 );\n\t\t\t\t\t_v1$1.fromBufferAttribute( positionAttr, index1 );\n\n\t\t\t\t\tvertices.push( _v0.x, _v0.y, _v0.z );\n\t\t\t\t\tvertices.push( _v1$1.x, _v1$1.y, _v1$1.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * An abstract base class for creating an analytic curve object that contains methods\n * for interpolation.\n *\n * @abstract\n */\nclass Curve {\n\n\t/**\n\t * Constructs a new curve.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'Curve';\n\n\t\t/**\n\t\t * This value determines the amount of divisions when calculating the\n\t\t * cumulative segment lengths of a curve via {@link Curve#getLengths}. To ensure\n\t\t * precision when using methods like {@link Curve#getSpacedPoints}, it is\n\t\t * recommended to increase the value of this property if the curve is very large.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 200\n\t\t */\n\t\tthis.arcLengthDivisions = 200;\n\n\t\t/**\n\t\t * Must be set to `true` if the curve parameters have changed.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsUpdate = false;\n\n\t\t/**\n\t\t * An internal cache that holds precomputed curve length values.\n\t\t *\n\t\t * @private\n\t\t * @type {?Array<number>}\n\t\t * @default null\n\t\t */\n\t\tthis.cacheArcLengths = null;\n\n\t}\n\n\t/**\n\t * This method returns a vector in 2D or 3D space (depending on the curve definition)\n\t * for the given interpolation factor.\n\t *\n\t * @abstract\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition.\n\t */\n\tgetPoint( /* t, optionalTarget */ ) {\n\n\t\twarn( 'Curve: .getPoint() not implemented.' );\n\n\t}\n\n\t/**\n\t * This method returns a vector in 2D or 3D space (depending on the curve definition)\n\t * for the given interpolation factor. Unlike {@link Curve#getPoint}, this method honors the length\n\t * of the curve which equidistant samples.\n\t *\n\t * @param {number} u - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition.\n\t */\n\tgetPointAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getPoint( t, optionalTarget );\n\n\t}\n\n\t/**\n\t * This method samples the curve via {@link Curve#getPoint} and returns an array of points representing\n\t * the curve shape.\n\t *\n\t * @param {number} [divisions=5] - The number of divisions.\n\t * @return {Array<(Vector2|Vector3)>} An array holding the sampled curve values. The number of points is `divisions + 1`.\n\t */\n\tgetPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPoint( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t// Get sequence of points using getPointAt( u )\n\n\t/**\n\t * This method samples the curve via {@link Curve#getPointAt} and returns an array of points representing\n\t * the curve shape. Unlike {@link Curve#getPoints}, this method returns equi-spaced points across the entire\n\t * curve.\n\t *\n\t * @param {number} [divisions=5] - The number of divisions.\n\t * @return {Array<(Vector2|Vector3)>} An array holding the sampled curve values. The number of points is `divisions + 1`.\n\t */\n\tgetSpacedPoints( divisions = 5 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let d = 0; d <= divisions; d ++ ) {\n\n\t\t\tpoints.push( this.getPointAt( d / divisions ) );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\t/**\n\t * Returns the total arc length of the curve.\n\t *\n\t * @return {number} The length of the curve.\n\t */\n\tgetLength() {\n\n\t\tconst lengths = this.getLengths();\n\t\treturn lengths[ lengths.length - 1 ];\n\n\t}\n\n\t/**\n\t * Returns an array of cumulative segment lengths of the curve.\n\t *\n\t * @param {number} [divisions=this.arcLengthDivisions] - The number of divisions.\n\t * @return {Array<number>} An array holding the cumulative segment lengths.\n\t */\n\tgetLengths( divisions = this.arcLengthDivisions ) {\n\n\t\tif ( this.cacheArcLengths &&\n\t\t\t( this.cacheArcLengths.length === divisions + 1 ) &&\n\t\t\t! this.needsUpdate ) {\n\n\t\t\treturn this.cacheArcLengths;\n\n\t\t}\n\n\t\tthis.needsUpdate = false;\n\n\t\tconst cache = [];\n\t\tlet current, last = this.getPoint( 0 );\n\t\tlet sum = 0;\n\n\t\tcache.push( 0 );\n\n\t\tfor ( let p = 1; p <= divisions; p ++ ) {\n\n\t\t\tcurrent = this.getPoint( p / divisions );\n\t\t\tsum += current.distanceTo( last );\n\t\t\tcache.push( sum );\n\t\t\tlast = current;\n\n\t\t}\n\n\t\tthis.cacheArcLengths = cache;\n\n\t\treturn cache; // { sums: cache, sum: sum }; Sum is in the last element.\n\n\t}\n\n\t/**\n\t * Update the cumulative segment distance cache. The method must be called\n\t * every time curve parameters are changed. If an updated curve is part of a\n\t * composed curve like {@link CurvePath}, this method must be called on the\n\t * composed curve, too.\n\t */\n\tupdateArcLengths() {\n\n\t\tthis.needsUpdate = true;\n\t\tthis.getLengths();\n\n\t}\n\n\t/**\n\t * Given an interpolation factor in the range `[0,1]`, this method returns an updated\n\t * interpolation factor in the same range that can be ued to sample equidistant points\n\t * from a curve.\n\t *\n\t * @param {number} u - The interpolation factor.\n\t * @param {?number} distance - An optional distance on the curve.\n\t * @return {number} The updated interpolation factor.\n\t */\n\tgetUtoTmapping( u, distance = null ) {\n\n\t\tconst arcLengths = this.getLengths();\n\n\t\tlet i = 0;\n\t\tconst il = arcLengths.length;\n\n\t\tlet targetArcLength; // The targeted u distance value to get\n\n\t\tif ( distance ) {\n\n\t\t\ttargetArcLength = distance;\n\n\t\t} else {\n\n\t\t\ttargetArcLength = u * arcLengths[ il - 1 ];\n\n\t\t}\n\n\t\t// binary search for the index with largest value smaller than target u distance\n\n\t\tlet low = 0, high = il - 1, comparison;\n\n\t\twhile ( low <= high ) {\n\n\t\t\ti = Math.floor( low + ( high - low ) / 2 ); // less likely to overflow, though probably not issue here, JS doesn't really have integers, all numbers are floats\n\n\t\t\tcomparison = arcLengths[ i ] - targetArcLength;\n\n\t\t\tif ( comparison < 0 ) {\n\n\t\t\t\tlow = i + 1;\n\n\t\t\t} else if ( comparison > 0 ) {\n\n\t\t\t\thigh = i - 1;\n\n\t\t\t} else {\n\n\t\t\t\thigh = i;\n\t\t\t\tbreak;\n\n\t\t\t\t// DONE\n\n\t\t\t}\n\n\t\t}\n\n\t\ti = high;\n\n\t\tif ( arcLengths[ i ] === targetArcLength ) {\n\n\t\t\treturn i / ( il - 1 );\n\n\t\t}\n\n\t\t// we could get finer grain at lengths, or use simple interpolation between two points\n\n\t\tconst lengthBefore = arcLengths[ i ];\n\t\tconst lengthAfter = arcLengths[ i + 1 ];\n\n\t\tconst segmentLength = lengthAfter - lengthBefore;\n\n\t\t// determine where we are between the 'before' and 'after' points\n\n\t\tconst segmentFraction = ( targetArcLength - lengthBefore ) / segmentLength;\n\n\t\t// add that fractional amount to t\n\n\t\tconst t = ( i + segmentFraction ) / ( il - 1 );\n\n\t\treturn t;\n\n\t}\n\n\t/**\n\t * Returns a unit vector tangent for the given interpolation factor.\n\t * If the derived curve does not implement its tangent derivation,\n\t * two points a small delta apart will be used to find its gradient\n\t * which seems to give a reasonable approximation.\n\t *\n\t * @param {number} t - The interpolation factor.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The tangent vector.\n\t */\n\tgetTangent( t, optionalTarget ) {\n\n\t\tconst delta = 0.0001;\n\t\tlet t1 = t - delta;\n\t\tlet t2 = t + delta;\n\n\t\t// Capping in case of danger\n\n\t\tif ( t1 < 0 ) t1 = 0;\n\t\tif ( t2 > 1 ) t2 = 1;\n\n\t\tconst pt1 = this.getPoint( t1 );\n\t\tconst pt2 = this.getPoint( t2 );\n\n\t\tconst tangent = optionalTarget || ( ( pt1.isVector2 ) ? new Vector2() : new Vector3() );\n\n\t\ttangent.copy( pt2 ).sub( pt1 ).normalize();\n\n\t\treturn tangent;\n\n\t}\n\n\t/**\n\t * Same as {@link Curve#getTangent} but with equidistant samples.\n\t *\n\t * @param {number} u - The interpolation factor.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {(Vector2|Vector3)} The tangent vector.\n\t * @see {@link Curve#getPointAt}\n\t */\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\tconst t = this.getUtoTmapping( u );\n\t\treturn this.getTangent( t, optionalTarget );\n\n\t}\n\n\t/**\n\t * Generates the Frenet Frames. Requires a curve definition in 3D space. Used\n\t * in geometries like {@link TubeGeometry} or {@link ExtrudeGeometry}.\n\t *\n\t * @param {number} segments - The number of segments.\n\t * @param {boolean} [closed=false] - Whether the curve is closed or not.\n\t * @return {{tangents: Array<Vector3>, normals: Array<Vector3>, binormals: Array<Vector3>}} The Frenet Frames.\n\t */\n\tcomputeFrenetFrames( segments, closed = false ) {\n\n\t\t// see http://www.cs.indiana.edu/pub/techreports/TR425.pdf\n\n\t\tconst normal = new Vector3();\n\n\t\tconst tangents = [];\n\t\tconst normals = [];\n\t\tconst binormals = [];\n\n\t\tconst vec = new Vector3();\n\t\tconst mat = new Matrix4();\n\n\t\t// compute the tangent vectors for each segment on the curve\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst u = i / segments;\n\n\t\t\ttangents[ i ] = this.getTangentAt( u, new Vector3() );\n\n\t\t}\n\n\t\t// select an initial normal vector perpendicular to the first tangent vector,\n\t\t// and in the direction of the minimum tangent xyz component\n\n\t\tnormals[ 0 ] = new Vector3();\n\t\tbinormals[ 0 ] = new Vector3();\n\t\tlet min = Number.MAX_VALUE;\n\t\tconst tx = Math.abs( tangents[ 0 ].x );\n\t\tconst ty = Math.abs( tangents[ 0 ].y );\n\t\tconst tz = Math.abs( tangents[ 0 ].z );\n\n\t\tif ( tx <= min ) {\n\n\t\t\tmin = tx;\n\t\t\tnormal.set( 1, 0, 0 );\n\n\t\t}\n\n\t\tif ( ty <= min ) {\n\n\t\t\tmin = ty;\n\t\t\tnormal.set( 0, 1, 0 );\n\n\t\t}\n\n\t\tif ( tz <= min ) {\n\n\t\t\tnormal.set( 0, 0, 1 );\n\n\t\t}\n\n\t\tvec.crossVectors( tangents[ 0 ], normal ).normalize();\n\n\t\tnormals[ 0 ].crossVectors( tangents[ 0 ], vec );\n\t\tbinormals[ 0 ].crossVectors( tangents[ 0 ], normals[ 0 ] );\n\n\n\t\t// compute the slowly-varying normal and binormal vectors for each segment on the curve\n\n\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\tnormals[ i ] = normals[ i - 1 ].clone();\n\n\t\t\tbinormals[ i ] = binormals[ i - 1 ].clone();\n\n\t\t\tvec.crossVectors( tangents[ i - 1 ], tangents[ i ] );\n\n\t\t\tif ( vec.length() > Number.EPSILON ) {\n\n\t\t\t\tvec.normalize();\n\n\t\t\t\tconst theta = Math.acos( clamp( tangents[ i - 1 ].dot( tangents[ i ] ), -1, 1 ) ); // clamp for floating pt errors\n\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( vec, theta ) );\n\n\t\t\t}\n\n\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t}\n\n\t\t// if the curve is closed, postprocess the vectors so the first and last normal vectors are the same\n\n\t\tif ( closed === true ) {\n\n\t\t\tlet theta = Math.acos( clamp( normals[ 0 ].dot( normals[ segments ] ), -1, 1 ) );\n\t\t\ttheta /= segments;\n\n\t\t\tif ( tangents[ 0 ].dot( vec.crossVectors( normals[ 0 ], normals[ segments ] ) ) > 0 ) {\n\n\t\t\t\ttheta = - theta;\n\n\t\t\t}\n\n\t\t\tfor ( let i = 1; i <= segments; i ++ ) {\n\n\t\t\t\t// twist a little...\n\t\t\t\tnormals[ i ].applyMatrix4( mat.makeRotationAxis( tangents[ i ], theta * i ) );\n\t\t\t\tbinormals[ i ].crossVectors( tangents[ i ], normals[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\ttangents: tangents,\n\t\t\tnormals: normals,\n\t\t\tbinormals: binormals\n\t\t};\n\n\t}\n\n\t/**\n\t * Returns a new curve with copied values from this instance.\n\t *\n\t * @return {Curve} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given curve to this instance.\n\t *\n\t * @param {Curve} source - The curve to copy.\n\t * @return {Curve} A reference to this curve.\n\t */\n\tcopy( source ) {\n\n\t\tthis.arcLengthDivisions = source.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Serializes the curve into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized curve.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON() {\n\n\t\tconst data = {\n\t\t\tmetadata: {\n\t\t\t\tversion: 4.7,\n\t\t\t\ttype: 'Curve',\n\t\t\t\tgenerator: 'Curve.toJSON'\n\t\t\t}\n\t\t};\n\n\t\tdata.arcLengthDivisions = this.arcLengthDivisions;\n\t\tdata.type = this.type;\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Deserializes the curve from the given JSON.\n\t *\n\t * @param {Object} json - The JSON holding the serialized curve.\n\t * @return {Curve} A reference to this curve.\n\t */\n\tfromJSON( json ) {\n\n\t\tthis.arcLengthDivisions = json.arcLengthDivisions;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing an ellipse.\n *\n * ```js\n * const curve = new THREE.EllipseCurve(\n * \t0, 0,\n * \t10, 10,\n * \t0, 2 * Math.PI,\n * \tfalse,\n * \t0\n * );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const ellipse = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass EllipseCurve extends Curve {\n\n\t/**\n\t * Constructs a new ellipse curve.\n\t *\n\t * @param {number} [aX=0] - The X center of the ellipse.\n\t * @param {number} [aY=0] - The Y center of the ellipse.\n\t * @param {number} [xRadius=1] - The radius of the ellipse in the x direction.\n\t * @param {number} [yRadius=1] - The radius of the ellipse in the y direction.\n\t * @param {number} [aStartAngle=0] - The start angle of the curve in radians starting from the positive X axis.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle of the curve in radians starting from the positive X axis.\n\t * @param {boolean} [aClockwise=false] - Whether the ellipse is drawn clockwise or not.\n\t * @param {number} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t */\n\tconstructor( aX = 0, aY = 0, xRadius = 1, yRadius = 1, aStartAngle = 0, aEndAngle = Math.PI * 2, aClockwise = false, aRotation = 0 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isEllipseCurve = true;\n\n\t\tthis.type = 'EllipseCurve';\n\n\t\t/**\n\t\t * The X center of the ellipse.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aX = aX;\n\n\t\t/**\n\t\t * The Y center of the ellipse.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aY = aY;\n\n\t\t/**\n\t\t * The radius of the ellipse in the x direction.\n\t\t * Setting the this value equal to the {@link EllipseCurve#yRadius} will result in a circle.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.xRadius = xRadius;\n\n\t\t/**\n\t\t * The radius of the ellipse in the y direction.\n\t\t * Setting the this value equal to the {@link EllipseCurve#xRadius} will result in a circle.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.yRadius = yRadius;\n\n\t\t/**\n\t\t * The start angle of the curve in radians starting from the positive X axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aStartAngle = aStartAngle;\n\n\t\t/**\n\t\t * The end angle of the curve in radians starting from the positive X axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Math.PI*2\n\t\t */\n\t\tthis.aEndAngle = aEndAngle;\n\n\t\t/**\n\t\t * Whether the ellipse is drawn clockwise or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.aClockwise = aClockwise;\n\n\t\t/**\n\t\t * The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.aRotation = aRotation;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst twoPi = Math.PI * 2;\n\t\tlet deltaAngle = this.aEndAngle - this.aStartAngle;\n\t\tconst samePoints = Math.abs( deltaAngle ) < Number.EPSILON;\n\n\t\t// ensures that deltaAngle is 0 .. 2 PI\n\t\twhile ( deltaAngle < 0 ) deltaAngle += twoPi;\n\t\twhile ( deltaAngle > twoPi ) deltaAngle -= twoPi;\n\n\t\tif ( deltaAngle < Number.EPSILON ) {\n\n\t\t\tif ( samePoints ) {\n\n\t\t\t\tdeltaAngle = 0;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.aClockwise === true && ! samePoints ) {\n\n\t\t\tif ( deltaAngle === twoPi ) {\n\n\t\t\t\tdeltaAngle = - twoPi;\n\n\t\t\t} else {\n\n\t\t\t\tdeltaAngle = deltaAngle - twoPi;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst angle = this.aStartAngle + t * deltaAngle;\n\t\tlet x = this.aX + this.xRadius * Math.cos( angle );\n\t\tlet y = this.aY + this.yRadius * Math.sin( angle );\n\n\t\tif ( this.aRotation !== 0 ) {\n\n\t\t\tconst cos = Math.cos( this.aRotation );\n\t\t\tconst sin = Math.sin( this.aRotation );\n\n\t\t\tconst tx = x - this.aX;\n\t\t\tconst ty = y - this.aY;\n\n\t\t\t// Rotate the point about the center of the ellipse.\n\t\t\tx = tx * cos - ty * sin + this.aX;\n\t\t\ty = tx * sin + ty * cos + this.aY;\n\n\t\t}\n\n\t\treturn point.set( x, y );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.aX = source.aX;\n\t\tthis.aY = source.aY;\n\n\t\tthis.xRadius = source.xRadius;\n\t\tthis.yRadius = source.yRadius;\n\n\t\tthis.aStartAngle = source.aStartAngle;\n\t\tthis.aEndAngle = source.aEndAngle;\n\n\t\tthis.aClockwise = source.aClockwise;\n\n\t\tthis.aRotation = source.aRotation;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.aX = this.aX;\n\t\tdata.aY = this.aY;\n\n\t\tdata.xRadius = this.xRadius;\n\t\tdata.yRadius = this.yRadius;\n\n\t\tdata.aStartAngle = this.aStartAngle;\n\t\tdata.aEndAngle = this.aEndAngle;\n\n\t\tdata.aClockwise = this.aClockwise;\n\n\t\tdata.aRotation = this.aRotation;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.aX = json.aX;\n\t\tthis.aY = json.aY;\n\n\t\tthis.xRadius = json.xRadius;\n\t\tthis.yRadius = json.yRadius;\n\n\t\tthis.aStartAngle = json.aStartAngle;\n\t\tthis.aEndAngle = json.aEndAngle;\n\n\t\tthis.aClockwise = json.aClockwise;\n\n\t\tthis.aRotation = json.aRotation;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing an arc.\n *\n * @augments EllipseCurve\n */\nclass ArcCurve extends EllipseCurve {\n\n\t/**\n\t * Constructs a new arc curve.\n\t *\n\t * @param {number} [aX=0] - The X center of the ellipse.\n\t * @param {number} [aY=0] - The Y center of the ellipse.\n\t * @param {number} [aRadius=1] - The radius of the ellipse in the x direction.\n\t * @param {number} [aStartAngle=0] - The start angle of the curve in radians starting from the positive X axis.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle of the curve in radians starting from the positive X axis.\n\t * @param {boolean} [aClockwise=false] - Whether the ellipse is drawn clockwise or not.\n\t */\n\tconstructor( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tsuper( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isArcCurve = true;\n\n\t\tthis.type = 'ArcCurve';\n\n\t}\n\n}\n\nfunction CubicPoly() {\n\n\t/**\n\t * Centripetal CatmullRom Curve - which is useful for avoiding\n\t* cusps and self-intersections in non-uniform catmull rom curves.\n\t* http://www.cemyuksel.com/research/catmullrom_param/catmullrom.pdf\n\t*\n\t* curve.type accepts centripetal(default), chordal and catmullrom\n\t* curve.tension is used for catmullrom which defaults to 0.5\n\t*/\n\n\t/*\n\tBased on an optimized c++ solution in\n\t- http://stackoverflow.com/questions/9489736/catmull-rom-curve-with-no-cusps-and-no-self-intersections/\n\t- http://ideone.com/NoEbVM\n\n\tThis CubicPoly class could be used for reusing some variables and calculations,\n\tbut for three.js curve use, it could be possible inlined and flatten into a single function call\n\twhich can be placed in CurveUtils.\n\t*/\n\n\tlet c0 = 0, c1 = 0, c2 = 0, c3 = 0;\n\n\t/*\n\t * Compute coefficients for a cubic polynomial\n\t *   p(s) = c0 + c1*s + c2*s^2 + c3*s^3\n\t * such that\n\t *   p(0) = x0, p(1) = x1\n\t *  and\n\t *   p'(0) = t0, p'(1) = t1.\n\t */\n\tfunction init( x0, x1, t0, t1 ) {\n\n\t\tc0 = x0;\n\t\tc1 = t0;\n\t\tc2 = -3 * x0 + 3 * x1 - 2 * t0 - t1;\n\t\tc3 = 2 * x0 - 2 * x1 + t0 + t1;\n\n\t}\n\n\treturn {\n\n\t\tinitCatmullRom: function ( x0, x1, x2, x3, tension ) {\n\n\t\t\tinit( x1, x2, tension * ( x2 - x0 ), tension * ( x3 - x1 ) );\n\n\t\t},\n\n\t\tinitNonuniformCatmullRom: function ( x0, x1, x2, x3, dt0, dt1, dt2 ) {\n\n\t\t\t// compute tangents when parameterized in [t1,t2]\n\t\t\tlet t1 = ( x1 - x0 ) / dt0 - ( x2 - x0 ) / ( dt0 + dt1 ) + ( x2 - x1 ) / dt1;\n\t\t\tlet t2 = ( x2 - x1 ) / dt1 - ( x3 - x1 ) / ( dt1 + dt2 ) + ( x3 - x2 ) / dt2;\n\n\t\t\t// rescale tangents for parametrization in [0,1]\n\t\t\tt1 *= dt1;\n\t\t\tt2 *= dt1;\n\n\t\t\tinit( x1, x2, t1, t2 );\n\n\t\t},\n\n\t\tcalc: function ( t ) {\n\n\t\t\tconst t2 = t * t;\n\t\t\tconst t3 = t2 * t;\n\t\t\treturn c0 + c1 * t + c2 * t2 + c3 * t3;\n\n\t\t}\n\n\t};\n\n}\n\n//\n\nconst tmp = /*@__PURE__*/ new Vector3();\nconst px = /*@__PURE__*/ new CubicPoly();\nconst py = /*@__PURE__*/ new CubicPoly();\nconst pz = /*@__PURE__*/ new CubicPoly();\n\n/**\n * A curve representing a Catmull-Rom spline.\n *\n * ```js\n * //Create a closed wavey loop\n * const curve = new THREE.CatmullRomCurve3( [\n * \tnew THREE.Vector3( -10, 0, 10 ),\n * \tnew THREE.Vector3( -5, 5, 5 ),\n * \tnew THREE.Vector3( 0, 0, 0 ),\n * \tnew THREE.Vector3( 5, -5, 5 ),\n * \tnew THREE.Vector3( 10, 0, 10 )\n * ] );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const curveObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass CatmullRomCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new Catmull-Rom curve.\n\t *\n\t * @param {Array<Vector3>} [points] - An array of 3D points defining the curve.\n\t * @param {boolean} [closed=false] - Whether the curve is closed or not.\n\t * @param {('centripetal'|'chordal'|'catmullrom')} [curveType='centripetal'] - The curve type.\n\t * @param {number} [tension=0.5] - Tension of the curve.\n\t */\n\tconstructor( points = [], closed = false, curveType = 'centripetal', tension = 0.5 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCatmullRomCurve3 = true;\n\n\t\tthis.type = 'CatmullRomCurve3';\n\n\t\t/**\n\t\t * An array of 3D points defining the curve.\n\t\t *\n\t\t * @type {Array<Vector3>}\n\t\t */\n\t\tthis.points = points;\n\n\t\t/**\n\t\t * Whether the curve is closed or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.closed = closed;\n\n\t\t/**\n\t\t * The curve type.\n\t\t *\n\t\t * @type {('centripetal'|'chordal'|'catmullrom')}\n\t\t * @default 'centripetal'\n\t\t */\n\t\tthis.curveType = curveType;\n\n\t\t/**\n\t\t * Tension of the curve.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.5\n\t\t */\n\t\tthis.tension = tension;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst l = points.length;\n\n\t\tconst p = ( l - ( this.closed ? 0 : 1 ) ) * t;\n\t\tlet intPoint = Math.floor( p );\n\t\tlet weight = p - intPoint;\n\n\t\tif ( this.closed ) {\n\n\t\t\tintPoint += intPoint > 0 ? 0 : ( Math.floor( Math.abs( intPoint ) / l ) + 1 ) * l;\n\n\t\t} else if ( weight === 0 && intPoint === l - 1 ) {\n\n\t\t\tintPoint = l - 2;\n\t\t\tweight = 1;\n\n\t\t}\n\n\t\tlet p0, p3; // 4 points (p1 & p2 defined below)\n\n\t\tif ( this.closed || intPoint > 0 ) {\n\n\t\t\tp0 = points[ ( intPoint - 1 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate first point\n\t\t\ttmp.subVectors( points[ 0 ], points[ 1 ] ).add( points[ 0 ] );\n\t\t\tp0 = tmp;\n\n\t\t}\n\n\t\tconst p1 = points[ intPoint % l ];\n\t\tconst p2 = points[ ( intPoint + 1 ) % l ];\n\n\t\tif ( this.closed || intPoint + 2 < l ) {\n\n\t\t\tp3 = points[ ( intPoint + 2 ) % l ];\n\n\t\t} else {\n\n\t\t\t// extrapolate last point\n\t\t\ttmp.subVectors( points[ l - 1 ], points[ l - 2 ] ).add( points[ l - 1 ] );\n\t\t\tp3 = tmp;\n\n\t\t}\n\n\t\tif ( this.curveType === 'centripetal' || this.curveType === 'chordal' ) {\n\n\t\t\t// init Centripetal / Chordal Catmull-Rom\n\t\t\tconst pow = this.curveType === 'chordal' ? 0.5 : 0.25;\n\t\t\tlet dt0 = Math.pow( p0.distanceToSquared( p1 ), pow );\n\t\t\tlet dt1 = Math.pow( p1.distanceToSquared( p2 ), pow );\n\t\t\tlet dt2 = Math.pow( p2.distanceToSquared( p3 ), pow );\n\n\t\t\t// safety check for repeated points\n\t\t\tif ( dt1 < 1e-4 ) dt1 = 1.0;\n\t\t\tif ( dt0 < 1e-4 ) dt0 = dt1;\n\t\t\tif ( dt2 < 1e-4 ) dt2 = dt1;\n\n\t\t\tpx.initNonuniformCatmullRom( p0.x, p1.x, p2.x, p3.x, dt0, dt1, dt2 );\n\t\t\tpy.initNonuniformCatmullRom( p0.y, p1.y, p2.y, p3.y, dt0, dt1, dt2 );\n\t\t\tpz.initNonuniformCatmullRom( p0.z, p1.z, p2.z, p3.z, dt0, dt1, dt2 );\n\n\t\t} else if ( this.curveType === 'catmullrom' ) {\n\n\t\t\tpx.initCatmullRom( p0.x, p1.x, p2.x, p3.x, this.tension );\n\t\t\tpy.initCatmullRom( p0.y, p1.y, p2.y, p3.y, this.tension );\n\t\t\tpz.initCatmullRom( p0.z, p1.z, p2.z, p3.z, this.tension );\n\n\t\t}\n\n\t\tpoint.set(\n\t\t\tpx.calc( weight ),\n\t\t\tpy.calc( weight ),\n\t\t\tpz.calc( weight )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\tthis.closed = source.closed;\n\t\tthis.curveType = source.curveType;\n\t\tthis.tension = source.tension;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\tdata.closed = this.closed;\n\t\tdata.curveType = this.curveType;\n\t\tdata.tension = this.tension;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector3().fromArray( point ) );\n\n\t\t}\n\n\t\tthis.closed = json.closed;\n\t\tthis.curveType = json.curveType;\n\t\tthis.tension = json.tension;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Interpolations contains spline and B\u00E9zier functions internally used by concrete curve classes.\n *\n * Bezier Curves formulas obtained from: https://en.wikipedia.org/wiki/B%C3%A9zier_curve\n *\n * @module Interpolations\n */\n\n/**\n * Computes a point on a Catmull-Rom spline.\n *\n * @param {number} t - The interpolation factor.\n * @param {number} p0 - The first control point.\n * @param {number} p1 - The second control point.\n * @param {number} p2 - The third control point.\n * @param {number} p3 - The fourth control point.\n * @return {number} The calculated point on a Catmull-Rom spline.\n */\nfunction CatmullRom( t, p0, p1, p2, p3 ) {\n\n\tconst v0 = ( p2 - p0 ) * 0.5;\n\tconst v1 = ( p3 - p1 ) * 0.5;\n\tconst t2 = t * t;\n\tconst t3 = t * t2;\n\treturn ( 2 * p1 - 2 * p2 + v0 + v1 ) * t3 + ( -3 * p1 + 3 * p2 - 2 * v0 - v1 ) * t2 + v0 * t + p1;\n\n}\n\n//\n\nfunction QuadraticBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * p;\n\n}\n\nfunction QuadraticBezierP1( t, p ) {\n\n\treturn 2 * ( 1 - t ) * t * p;\n\n}\n\nfunction QuadraticBezierP2( t, p ) {\n\n\treturn t * t * p;\n\n}\n\n/**\n * Computes a point on a Quadratic Bezier curve.\n *\n * @param {number} t - The interpolation factor.\n * @param {number} p0 - The first control point.\n * @param {number} p1 - The second control point.\n * @param {number} p2 - The third control point.\n * @return {number} The calculated point on a Quadratic Bezier curve.\n */\nfunction QuadraticBezier( t, p0, p1, p2 ) {\n\n\treturn QuadraticBezierP0( t, p0 ) + QuadraticBezierP1( t, p1 ) +\n\t\tQuadraticBezierP2( t, p2 );\n\n}\n\n//\n\nfunction CubicBezierP0( t, p ) {\n\n\tconst k = 1 - t;\n\treturn k * k * k * p;\n\n}\n\nfunction CubicBezierP1( t, p ) {\n\n\tconst k = 1 - t;\n\treturn 3 * k * k * t * p;\n\n}\n\nfunction CubicBezierP2( t, p ) {\n\n\treturn 3 * ( 1 - t ) * t * t * p;\n\n}\n\nfunction CubicBezierP3( t, p ) {\n\n\treturn t * t * t * p;\n\n}\n\n/**\n * Computes a point on a Cubic Bezier curve.\n *\n * @param {number} t - The interpolation factor.\n * @param {number} p0 - The first control point.\n * @param {number} p1 - The second control point.\n * @param {number} p2 - The third control point.\n * @param {number} p3 - The fourth control point.\n * @return {number} The calculated point on a Cubic Bezier curve.\n */\nfunction CubicBezier( t, p0, p1, p2, p3 ) {\n\n\treturn CubicBezierP0( t, p0 ) + CubicBezierP1( t, p1 ) + CubicBezierP2( t, p2 ) +\n\t\tCubicBezierP3( t, p3 );\n\n}\n\n/**\n * A curve representing a 2D Cubic Bezier curve.\n *\n * ```js\n * const curve = new THREE.CubicBezierCurve(\n * \tnew THREE.Vector2( - 0, 0 ),\n * \tnew THREE.Vector2( - 5, 15 ),\n * \tnew THREE.Vector2( 20, 15 ),\n * \tnew THREE.Vector2( 10, 0 )\n * );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const curveObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass CubicBezierCurve extends Curve {\n\n\t/**\n\t * Constructs a new Cubic Bezier curve.\n\t *\n\t * @param {Vector2} [v0] - The start point.\n\t * @param {Vector2} [v1] - The first control point.\n\t * @param {Vector2} [v2] - The second control point.\n\t * @param {Vector2} [v3] - The end point.\n\t */\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2(), v3 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubicBezierCurve = true;\n\n\t\tthis.type = 'CubicBezierCurve';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The first control point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The second control point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v3 = v3;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 3D Cubic Bezier curve.\n *\n * @augments Curve\n */\nclass CubicBezierCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new Cubic Bezier curve.\n\t *\n\t * @param {Vector3} [v0] - The start point.\n\t * @param {Vector3} [v1] - The first control point.\n\t * @param {Vector3} [v2] - The second control point.\n\t * @param {Vector3} [v3] - The end point.\n\t */\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3(), v3 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubicBezierCurve3 = true;\n\n\t\tthis.type = 'CubicBezierCurve3';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The first control point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The second control point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v3 = v3;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2, v3 = this.v3;\n\n\t\tpoint.set(\n\t\t\tCubicBezier( t, v0.x, v1.x, v2.x, v3.x ),\n\t\t\tCubicBezier( t, v0.y, v1.y, v2.y, v3.y ),\n\t\t\tCubicBezier( t, v0.z, v1.z, v2.z, v3.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\t\tthis.v3.copy( source.v3 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\t\tdata.v3 = this.v3.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\t\tthis.v3.fromArray( json.v3 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 2D line segment.\n *\n * @augments Curve\n */\nclass LineCurve extends Curve {\n\n\t/**\n\t * Constructs a new line curve.\n\t *\n\t * @param {Vector2} [v1] - The start point.\n\t * @param {Vector2} [v2] - The end point.\n\t */\n\tconstructor( v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineCurve = true;\n\n\t\tthis.type = 'LineCurve';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the line.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the line. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the line.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\n\tgetTangent( t, optionalTarget = new Vector2() ) {\n\n\t\treturn optionalTarget.subVectors( this.v2, this.v1 ).normalize();\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\treturn this.getTangent( u, optionalTarget );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 3D line segment.\n *\n * @augments Curve\n */\nclass LineCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new line curve.\n\t *\n\t * @param {Vector3} [v1] - The start point.\n\t * @param {Vector3} [v2] - The end point.\n\t */\n\tconstructor( v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineCurve3 = true;\n\n\t\tthis.type = 'LineCurve3';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the line.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the line. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the line.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tif ( t === 1 ) {\n\n\t\t\tpoint.copy( this.v2 );\n\n\t\t} else {\n\n\t\t\tpoint.copy( this.v2 ).sub( this.v1 );\n\t\t\tpoint.multiplyScalar( t ).add( this.v1 );\n\n\t\t}\n\n\t\treturn point;\n\n\t}\n\n\t// Line curve is linear, so we can overwrite default getPointAt\n\tgetPointAt( u, optionalTarget ) {\n\n\t\treturn this.getPoint( u, optionalTarget );\n\n\t}\n\n\tgetTangent( t, optionalTarget = new Vector3() ) {\n\n\t\treturn optionalTarget.subVectors( this.v2, this.v1 ).normalize();\n\n\t}\n\n\tgetTangentAt( u, optionalTarget ) {\n\n\t\treturn this.getTangent( u, optionalTarget );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 2D Quadratic Bezier curve.\n *\n * ```js\n * const curve = new THREE.QuadraticBezierCurve(\n * \tnew THREE.Vector2( - 10, 0 ),\n * \tnew THREE.Vector2( 20, 15 ),\n * \tnew THREE.Vector2( 10, 0 )\n * )\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const curveObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass QuadraticBezierCurve extends Curve {\n\n\t/**\n\t * Constructs a new Quadratic Bezier curve.\n\t *\n\t * @param {Vector2} [v0] - The start point.\n\t * @param {Vector2} [v1] - The control point.\n\t * @param {Vector2} [v2] - The end point.\n\t */\n\tconstructor( v0 = new Vector2(), v1 = new Vector2(), v2 = new Vector2() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isQuadraticBezierCurve = true;\n\n\t\tthis.type = 'QuadraticBezierCurve';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The control point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 3D Quadratic Bezier curve.\n *\n * @augments Curve\n */\nclass QuadraticBezierCurve3 extends Curve {\n\n\t/**\n\t * Constructs a new Quadratic Bezier curve.\n\t *\n\t * @param {Vector3} [v0] - The start point.\n\t * @param {Vector3} [v1] - The control point.\n\t * @param {Vector3} [v2] - The end point.\n\t */\n\tconstructor( v0 = new Vector3(), v1 = new Vector3(), v2 = new Vector3() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isQuadraticBezierCurve3 = true;\n\n\t\tthis.type = 'QuadraticBezierCurve3';\n\n\t\t/**\n\t\t * The start point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v0 = v0;\n\n\t\t/**\n\t\t * The control point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v1 = v1;\n\n\t\t/**\n\t\t * The end point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.v2 = v2;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst v0 = this.v0, v1 = this.v1, v2 = this.v2;\n\n\t\tpoint.set(\n\t\t\tQuadraticBezier( t, v0.x, v1.x, v2.x ),\n\t\t\tQuadraticBezier( t, v0.y, v1.y, v2.y ),\n\t\t\tQuadraticBezier( t, v0.z, v1.z, v2.z )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.v0.copy( source.v0 );\n\t\tthis.v1.copy( source.v1 );\n\t\tthis.v2.copy( source.v2 );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.v0 = this.v0.toArray();\n\t\tdata.v1 = this.v1.toArray();\n\t\tdata.v2 = this.v2.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.v0.fromArray( json.v0 );\n\t\tthis.v1.fromArray( json.v1 );\n\t\tthis.v2.fromArray( json.v2 );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A curve representing a 2D spline curve.\n *\n * ```js\n * // Create a sine-like wave\n * const curve = new THREE.SplineCurve( [\n * \tnew THREE.Vector2( -10, 0 ),\n * \tnew THREE.Vector2( -5, 5 ),\n * \tnew THREE.Vector2( 0, 0 ),\n * \tnew THREE.Vector2( 5, -5 ),\n * \tnew THREE.Vector2( 10, 0 )\n * ] );\n *\n * const points = curve.getPoints( 50 );\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n *\n * const material = new THREE.LineBasicMaterial( { color: 0xff0000 } );\n *\n * // Create the final object to add to the scene\n * const splineObject = new THREE.Line( geometry, material );\n * ```\n *\n * @augments Curve\n */\nclass SplineCurve extends Curve {\n\n\t/**\n\t * Constructs a new 2D spline curve.\n\t *\n\t * @param {Array<Vector2>} [points] -  An array of 2D points defining the curve.\n\t */\n\tconstructor( points = [] ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSplineCurve = true;\n\n\t\tthis.type = 'SplineCurve';\n\n\t\t/**\n\t\t * An array of 2D points defining the curve.\n\t\t *\n\t\t * @type {Array<Vector2>}\n\t\t */\n\t\tthis.points = points;\n\n\t}\n\n\t/**\n\t * Returns a point on the curve.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector2} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector2} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector2() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst points = this.points;\n\t\tconst p = ( points.length - 1 ) * t;\n\n\t\tconst intPoint = Math.floor( p );\n\t\tconst weight = p - intPoint;\n\n\t\tconst p0 = points[ intPoint === 0 ? intPoint : intPoint - 1 ];\n\t\tconst p1 = points[ intPoint ];\n\t\tconst p2 = points[ intPoint > points.length - 2 ? points.length - 1 : intPoint + 1 ];\n\t\tconst p3 = points[ intPoint > points.length - 3 ? points.length - 1 : intPoint + 2 ];\n\n\t\tpoint.set(\n\t\t\tCatmullRom( weight, p0.x, p1.x, p2.x, p3.x ),\n\t\t\tCatmullRom( weight, p0.y, p1.y, p2.y, p3.y )\n\t\t);\n\n\t\treturn point;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = source.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = source.points[ i ];\n\n\t\t\tthis.points.push( point.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.points = [];\n\n\t\tfor ( let i = 0, l = this.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = this.points[ i ];\n\t\t\tdata.points.push( point.toArray() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.points = [];\n\n\t\tfor ( let i = 0, l = json.points.length; i < l; i ++ ) {\n\n\t\t\tconst point = json.points[ i ];\n\t\t\tthis.points.push( new Vector2().fromArray( point ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nvar Curves = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tArcCurve: ArcCurve,\n\tCatmullRomCurve3: CatmullRomCurve3,\n\tCubicBezierCurve: CubicBezierCurve,\n\tCubicBezierCurve3: CubicBezierCurve3,\n\tEllipseCurve: EllipseCurve,\n\tLineCurve: LineCurve,\n\tLineCurve3: LineCurve3,\n\tQuadraticBezierCurve: QuadraticBezierCurve,\n\tQuadraticBezierCurve3: QuadraticBezierCurve3,\n\tSplineCurve: SplineCurve\n});\n\n/**\n * A base class extending {@link Curve}. `CurvePath` is simply an\n * array of connected curves, but retains the API of a curve.\n *\n * @augments Curve\n */\nclass CurvePath extends Curve {\n\n\t/**\n\t * Constructs a new curve path.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'CurvePath';\n\n\t\t/**\n\t\t * An array of curves defining the\n\t\t * path.\n\t\t *\n\t\t * @type {Array<Curve>}\n\t\t */\n\t\tthis.curves = [];\n\n\t\t/**\n\t\t * Whether the path should automatically be closed\n\t\t * by a line curve.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.autoClose = false;\n\n\t}\n\n\t/**\n\t * Adds a curve to this curve path.\n\t *\n\t * @param {Curve} curve - The curve to add.\n\t */\n\tadd( curve ) {\n\n\t\tthis.curves.push( curve );\n\n\t}\n\n\t/**\n\t * Adds a line curve to close the path.\n\t *\n\t * @return {CurvePath} A reference to this curve path.\n\t */\n\tclosePath() {\n\n\t\t// Add a line curve if start and end of lines are not connected\n\t\tconst startPoint = this.curves[ 0 ].getPoint( 0 );\n\t\tconst endPoint = this.curves[ this.curves.length - 1 ].getPoint( 1 );\n\n\t\tif ( ! startPoint.equals( endPoint ) ) {\n\n\t\t\tconst lineType = ( startPoint.isVector2 === true ) ? 'LineCurve' : 'LineCurve3';\n\t\t\tthis.curves.push( new Curves[ lineType ]( endPoint, startPoint ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This method returns a vector in 2D or 3D space (depending on the curve definitions)\n\t * for the given interpolation factor.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {(Vector2|Vector3)} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {?(Vector2|Vector3)} The position on the curve. It can be a 2D or 3D vector depending on the curve definition.\n\t */\n\tgetPoint( t, optionalTarget ) {\n\n\t\t// To get accurate point with reference to\n\t\t// entire path distance at time t,\n\t\t// following has to be done:\n\n\t\t// 1. Length of each sub path have to be known\n\t\t// 2. Locate and identify type of curve\n\t\t// 3. Get t for the curve\n\t\t// 4. Return curve.getPointAt(t')\n\n\t\tconst d = t * this.getLength();\n\t\tconst curveLengths = this.getCurveLengths();\n\t\tlet i = 0;\n\n\t\t// To think about boundaries points.\n\n\t\twhile ( i < curveLengths.length ) {\n\n\t\t\tif ( curveLengths[ i ] >= d ) {\n\n\t\t\t\tconst diff = curveLengths[ i ] - d;\n\t\t\t\tconst curve = this.curves[ i ];\n\n\t\t\t\tconst segmentLength = curve.getLength();\n\t\t\t\tconst u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;\n\n\t\t\t\treturn curve.getPointAt( u, optionalTarget );\n\n\t\t\t}\n\n\t\t\ti ++;\n\n\t\t}\n\n\t\treturn null;\n\n\t\t// loop where sum != 0, sum > d , sum+1 <d\n\n\t}\n\n\tgetLength() {\n\n\t\t// We cannot use the default THREE.Curve getPoint() with getLength() because in\n\t\t// THREE.Curve, getLength() depends on getPoint() but in THREE.CurvePath\n\t\t// getPoint() depends on getLength\n\n\t\tconst lens = this.getCurveLengths();\n\t\treturn lens[ lens.length - 1 ];\n\n\t}\n\n\tupdateArcLengths() {\n\n\t\t// cacheLengths must be recalculated.\n\n\t\tthis.needsUpdate = true;\n\t\tthis.cacheLengths = null;\n\t\tthis.getCurveLengths();\n\n\t}\n\n\t/**\n\t * Returns list of cumulative curve lengths of the defined curves.\n\t *\n\t * @return {Array<number>} The curve lengths.\n\t */\n\tgetCurveLengths() {\n\n\t\t// Compute lengths and cache them\n\t\t// We cannot overwrite getLengths() because UtoT mapping uses it.\n\t\t// We use cache values if curves and cache array are same length\n\n\t\tif ( this.cacheLengths && this.cacheLengths.length === this.curves.length ) {\n\n\t\t\treturn this.cacheLengths;\n\n\t\t}\n\n\t\t// Get length of sub-curve\n\t\t// Push sums into cached array\n\n\t\tconst lengths = [];\n\t\tlet sums = 0;\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tsums += this.curves[ i ].getLength();\n\t\t\tlengths.push( sums );\n\n\t\t}\n\n\t\tthis.cacheLengths = lengths;\n\n\t\treturn lengths;\n\n\t}\n\n\tgetSpacedPoints( divisions = 40 ) {\n\n\t\tconst points = [];\n\n\t\tfor ( let i = 0; i <= divisions; i ++ ) {\n\n\t\t\tpoints.push( this.getPoint( i / divisions ) );\n\n\t\t}\n\n\t\tif ( this.autoClose ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\tgetPoints( divisions = 12 ) {\n\n\t\tconst points = [];\n\t\tlet last;\n\n\t\tfor ( let i = 0, curves = this.curves; i < curves.length; i ++ ) {\n\n\t\t\tconst curve = curves[ i ];\n\t\t\tconst resolution = curve.isEllipseCurve ? divisions * 2\n\t\t\t\t: ( curve.isLineCurve || curve.isLineCurve3 ) ? 1\n\t\t\t\t\t: curve.isSplineCurve ? divisions * curve.points.length\n\t\t\t\t\t\t: divisions;\n\n\t\t\tconst pts = curve.getPoints( resolution );\n\n\t\t\tfor ( let j = 0; j < pts.length; j ++ ) {\n\n\t\t\t\tconst point = pts[ j ];\n\n\t\t\t\tif ( last && last.equals( point ) ) continue; // ensures no consecutive points are duplicates\n\n\t\t\t\tpoints.push( point );\n\t\t\t\tlast = point;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.autoClose && points.length > 1 && ! points[ points.length - 1 ].equals( points[ 0 ] ) ) {\n\n\t\t\tpoints.push( points[ 0 ] );\n\n\t\t}\n\n\t\treturn points;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = source.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = source.curves[ i ];\n\n\t\t\tthis.curves.push( curve.clone() );\n\n\t\t}\n\n\t\tthis.autoClose = source.autoClose;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.autoClose = this.autoClose;\n\t\tdata.curves = [];\n\n\t\tfor ( let i = 0, l = this.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = this.curves[ i ];\n\t\t\tdata.curves.push( curve.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.autoClose = json.autoClose;\n\t\tthis.curves = [];\n\n\t\tfor ( let i = 0, l = json.curves.length; i < l; i ++ ) {\n\n\t\t\tconst curve = json.curves[ i ];\n\t\t\tthis.curves.push( new Curves[ curve.type ]().fromJSON( curve ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A 2D path representation. The class provides methods for creating paths\n * and contours of 2D shapes similar to the 2D Canvas API.\n *\n * ```js\n * const path = new THREE.Path();\n *\n * path.lineTo( 0, 0.8 );\n * path.quadraticCurveTo( 0, 1, 0.2, 1 );\n * path.lineTo( 1, 1 );\n *\n * const points = path.getPoints();\n *\n * const geometry = new THREE.BufferGeometry().setFromPoints( points );\n * const material = new THREE.LineBasicMaterial( { color: 0xffffff } );\n *\n * const line = new THREE.Line( geometry, material );\n * scene.add( line );\n * ```\n *\n * @augments CurvePath\n */\nclass Path extends CurvePath {\n\n\t/**\n\t * Constructs a new path.\n\t *\n\t * @param {Array<Vector2>} [points] - An array of 2D points defining the path.\n\t */\n\tconstructor( points ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Path';\n\n\t\t/**\n\t\t * The current offset of the path. Any new curve added will start here.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.currentPoint = new Vector2();\n\n\t\tif ( points ) {\n\n\t\t\tthis.setFromPoints( points );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Creates a path from the given list of points. The points are added\n\t * to the path as instances of {@link LineCurve}.\n\t *\n\t * @param {Array<Vector2>} points - An array of 2D points.\n\t * @return {Path} A reference to this path.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tthis.moveTo( points[ 0 ].x, points[ 0 ].y );\n\n\t\tfor ( let i = 1, l = points.length; i < l; i ++ ) {\n\n\t\t\tthis.lineTo( points[ i ].x, points[ i ].y );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Moves {@link Path#currentPoint} to the given point.\n\t *\n\t * @param {number} x - The x coordinate.\n\t * @param {number} y - The y coordinate.\n\t * @return {Path} A reference to this path.\n\t */\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPoint.set( x, y ); // TODO consider referencing vectors instead of copying?\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link LineCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} x - The x coordinate of the end point.\n\t * @param {number} y - The y coordinate of the end point.\n\t * @return {Path} A reference to this path.\n\t */\n\tlineTo( x, y ) {\n\n\t\tconst curve = new LineCurve( this.currentPoint.clone(), new Vector2( x, y ) );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( x, y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link QuadraticBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCPx - The x coordinate of the control point.\n\t * @param {number} aCPy - The y coordinate of the control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {Path} A reference to this path.\n\t */\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tconst curve = new QuadraticBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCPx, aCPy ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link CubicBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCP1x - The x coordinate of the first control point.\n\t * @param {number} aCP1y - The y coordinate of the first control point.\n\t * @param {number} aCP2x - The x coordinate of the second control point.\n\t * @param {number} aCP2y - The y coordinate of the second control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {Path} A reference to this path.\n\t */\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tconst curve = new CubicBezierCurve(\n\t\t\tthis.currentPoint.clone(),\n\t\t\tnew Vector2( aCP1x, aCP1y ),\n\t\t\tnew Vector2( aCP2x, aCP2y ),\n\t\t\tnew Vector2( aX, aY )\n\t\t);\n\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.set( aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link SplineCurve} to the path by connecting\n\t * the current point with the given list of points.\n\t *\n\t * @param {Array<Vector2>} pts - An array of points in 2D space.\n\t * @return {Path} A reference to this path.\n\t */\n\tsplineThru( pts ) {\n\n\t\tconst npts = [ this.currentPoint.clone() ].concat( pts );\n\n\t\tconst curve = new SplineCurve( npts );\n\t\tthis.curves.push( curve );\n\n\t\tthis.currentPoint.copy( pts[ pts.length - 1 ] );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an arc as an instance of {@link EllipseCurve} to the path, positioned relative\n\t * to the current point.\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the center of the arc offsetted from the previous curve.\n\t * @param {number} [aY=0] - The y coordinate of the center of the arc offsetted from the previous curve.\n\t * @param {number} [aRadius=1] - The radius of the arc.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the arc clockwise or not.\n\t * @return {Path} A reference to this path.\n\t */\n\tarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absarc( aX + x0, aY + y0, aRadius,\n\t\t\taStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an absolutely positioned arc as an instance of {@link EllipseCurve} to the path.\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the center of the arc.\n\t * @param {number} [aY=0] - The y coordinate of the center of the arc.\n\t * @param {number} [aRadius=1] - The radius of the arc.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the arc clockwise or not.\n\t * @return {Path} A reference to this path.\n\t */\n\tabsarc( aX, aY, aRadius, aStartAngle, aEndAngle, aClockwise ) {\n\n\t\tthis.absellipse( aX, aY, aRadius, aRadius, aStartAngle, aEndAngle, aClockwise );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an ellipse as an instance of {@link EllipseCurve} to the path, positioned relative\n\t * to the current point\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the center of the ellipse offsetted from the previous curve.\n\t * @param {number} [aY=0] - The y coordinate of the center of the ellipse offsetted from the previous curve.\n\t * @param {number} [xRadius=1] - The radius of the ellipse in the x axis.\n\t * @param {number} [yRadius=1] - The radius of the ellipse in the y axis.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the ellipse clockwise or not.\n\t * @param {number} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t * @return {Path} A reference to this path.\n\t */\n\tellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst x0 = this.currentPoint.x;\n\t\tconst y0 = this.currentPoint.y;\n\n\t\tthis.absellipse( aX + x0, aY + y0, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an absolutely positioned ellipse as an instance of {@link EllipseCurve} to the path.\n\t *\n\t * @param {number} [aX=0] - The x coordinate of the absolute center of the ellipse.\n\t * @param {number} [aY=0] - The y coordinate of the absolute center of the ellipse.\n\t * @param {number} [xRadius=1] - The radius of the ellipse in the x axis.\n\t * @param {number} [yRadius=1] - The radius of the ellipse in the y axis.\n\t * @param {number} [aStartAngle=0] - The start angle in radians.\n\t * @param {number} [aEndAngle=Math.PI*2] - The end angle in radians.\n\t * @param {boolean} [aClockwise=false] - Whether to sweep the ellipse clockwise or not.\n\t * @param {number} [aRotation=0] - The rotation angle of the ellipse in radians, counterclockwise from the positive X axis.\n\t * @return {Path} A reference to this path.\n\t */\n\tabsellipse( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation ) {\n\n\t\tconst curve = new EllipseCurve( aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation );\n\n\t\tif ( this.curves.length > 0 ) {\n\n\t\t\t// if a previous curve is present, attempt to join\n\t\t\tconst firstPoint = curve.getPoint( 0 );\n\n\t\t\tif ( ! firstPoint.equals( this.currentPoint ) ) {\n\n\t\t\t\tthis.lineTo( firstPoint.x, firstPoint.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.curves.push( curve );\n\n\t\tconst lastPoint = curve.getPoint( 1 );\n\t\tthis.currentPoint.copy( lastPoint );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.currentPoint.copy( source.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.currentPoint = this.currentPoint.toArray();\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.currentPoint.fromArray( json.currentPoint );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Defines an arbitrary 2d shape plane using paths with optional holes. It\n * can be used with {@link ExtrudeGeometry}, {@link ShapeGeometry}, to get\n * points, or to get triangulated faces.\n *\n * ```js\n * const heartShape = new THREE.Shape();\n *\n * heartShape.moveTo( 25, 25 );\n * heartShape.bezierCurveTo( 25, 25, 20, 0, 0, 0 );\n * heartShape.bezierCurveTo( - 30, 0, - 30, 35, - 30, 35 );\n * heartShape.bezierCurveTo( - 30, 55, - 10, 77, 25, 95 );\n * heartShape.bezierCurveTo( 60, 77, 80, 55, 80, 35 );\n * heartShape.bezierCurveTo( 80, 35, 80, 0, 50, 0 );\n * heartShape.bezierCurveTo( 35, 0, 25, 25, 25, 25 );\n *\n * const extrudeSettings = {\n * \tdepth: 8,\n * \tbevelEnabled: true,\n * \tbevelSegments: 2,\n * \tsteps: 2,\n * \tbevelSize: 1,\n * \tbevelThickness: 1\n * };\n *\n * const geometry = new THREE.ExtrudeGeometry( heartShape, extrudeSettings );\n * const mesh = new THREE.Mesh( geometry, new THREE.MeshBasicMaterial() );\n * ```\n *\n * @augments Path\n */\nclass Shape extends Path {\n\n\t/**\n\t * Constructs a new shape.\n\t *\n\t * @param {Array<Vector2>} [points] - An array of 2D points defining the shape.\n\t */\n\tconstructor( points ) {\n\n\t\tsuper( points );\n\n\t\t/**\n\t\t * The UUID of the shape.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\tthis.type = 'Shape';\n\n\t\t/**\n\t\t * Defines the holes in the shape. Hole definitions must use the\n\t\t * opposite winding order (CW/CCW) than the outer shape.\n\t\t *\n\t\t * @type {Array<Path>}\n\t\t * @readonly\n\t\t */\n\t\tthis.holes = [];\n\n\t}\n\n\t/**\n\t * Returns an array representing each contour of the holes\n\t * as a list of 2D points.\n\t *\n\t * @param {number} divisions - The fineness of the result.\n\t * @return {Array<Array<Vector2>>} The holes as a series of 2D points.\n\t */\n\tgetPointsHoles( divisions ) {\n\n\t\tconst holesPts = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tholesPts[ i ] = this.holes[ i ].getPoints( divisions );\n\n\t\t}\n\n\t\treturn holesPts;\n\n\t}\n\n\t// get points of shape and holes (keypoints based on segments parameter)\n\n\t/**\n\t * Returns an object that holds contour data for the shape and its holes as\n\t * arrays of 2D points.\n\t *\n\t * @param {number} divisions - The fineness of the result.\n\t * @return {{shape:Array<Vector2>,holes:Array<Array<Vector2>>}} An object with contour data.\n\t */\n\textractPoints( divisions ) {\n\n\t\treturn {\n\n\t\t\tshape: this.getPoints( divisions ),\n\t\t\tholes: this.getPointsHoles( divisions )\n\n\t\t};\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = source.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = source.holes[ i ];\n\n\t\t\tthis.holes.push( hole.clone() );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.uuid = this.uuid;\n\t\tdata.holes = [];\n\n\t\tfor ( let i = 0, l = this.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = this.holes[ i ];\n\t\t\tdata.holes.push( hole.toJSON() );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.uuid = json.uuid;\n\t\tthis.holes = [];\n\n\t\tfor ( let i = 0, l = json.holes.length; i < l; i ++ ) {\n\n\t\t\tconst hole = json.holes[ i ];\n\t\t\tthis.holes.push( new Path().fromJSON( hole ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/* eslint-disable */\n// copy of mapbox/earcut version 3.0.2\n// https://github.com/mapbox/earcut/tree/v3.0.2\n\nfunction earcut(data, holeIndices, dim = 2) {\n\n    const hasHoles = holeIndices && holeIndices.length;\n    const outerLen = hasHoles ? holeIndices[0] * dim : data.length;\n    let outerNode = linkedList(data, 0, outerLen, dim, true);\n    const triangles = [];\n\n    if (!outerNode || outerNode.next === outerNode.prev) return triangles;\n\n    let minX, minY, invSize;\n\n    if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim);\n\n    // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox\n    if (data.length > 80 * dim) {\n        minX = data[0];\n        minY = data[1];\n        let maxX = minX;\n        let maxY = minY;\n\n        for (let i = dim; i < outerLen; i += dim) {\n            const x = data[i];\n            const y = data[i + 1];\n            if (x < minX) minX = x;\n            if (y < minY) minY = y;\n            if (x > maxX) maxX = x;\n            if (y > maxY) maxY = y;\n        }\n\n        // minX, minY and invSize are later used to transform coords into integers for z-order calculation\n        invSize = Math.max(maxX - minX, maxY - minY);\n        invSize = invSize !== 0 ? 32767 / invSize : 0;\n    }\n\n    earcutLinked(outerNode, triangles, dim, minX, minY, invSize, 0);\n\n    return triangles;\n}\n\n// create a circular doubly linked list from polygon points in the specified winding order\nfunction linkedList(data, start, end, dim, clockwise) {\n    let last;\n\n    if (clockwise === (signedArea(data, start, end, dim) > 0)) {\n        for (let i = start; i < end; i += dim) last = insertNode(i / dim | 0, data[i], data[i + 1], last);\n    } else {\n        for (let i = end - dim; i >= start; i -= dim) last = insertNode(i / dim | 0, data[i], data[i + 1], last);\n    }\n\n    if (last && equals(last, last.next)) {\n        removeNode(last);\n        last = last.next;\n    }\n\n    return last;\n}\n\n// eliminate colinear or duplicate points\nfunction filterPoints(start, end) {\n    if (!start) return start;\n    if (!end) end = start;\n\n    let p = start,\n        again;\n    do {\n        again = false;\n\n        if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) {\n            removeNode(p);\n            p = end = p.prev;\n            if (p === p.next) break;\n            again = true;\n\n        } else {\n            p = p.next;\n        }\n    } while (again || p !== end);\n\n    return end;\n}\n\n// main ear slicing loop which triangulates a polygon (given as a linked list)\nfunction earcutLinked(ear, triangles, dim, minX, minY, invSize, pass) {\n    if (!ear) return;\n\n    // interlink polygon nodes in z-order\n    if (!pass && invSize) indexCurve(ear, minX, minY, invSize);\n\n    let stop = ear;\n\n    // iterate through ears, slicing them one by one\n    while (ear.prev !== ear.next) {\n        const prev = ear.prev;\n        const next = ear.next;\n\n        if (invSize ? isEarHashed(ear, minX, minY, invSize) : isEar(ear)) {\n            triangles.push(prev.i, ear.i, next.i); // cut off the triangle\n\n            removeNode(ear);\n\n            // skipping the next vertex leads to less sliver triangles\n            ear = next.next;\n            stop = next.next;\n\n            continue;\n        }\n\n        ear = next;\n\n        // if we looped through the whole remaining polygon and can't find any more ears\n        if (ear === stop) {\n            // try filtering points and slicing again\n            if (!pass) {\n                earcutLinked(filterPoints(ear), triangles, dim, minX, minY, invSize, 1);\n\n            // if this didn't work, try curing all small self-intersections locally\n            } else if (pass === 1) {\n                ear = cureLocalIntersections(filterPoints(ear), triangles);\n                earcutLinked(ear, triangles, dim, minX, minY, invSize, 2);\n\n            // as a last resort, try splitting the remaining polygon into two\n            } else if (pass === 2) {\n                splitEarcut(ear, triangles, dim, minX, minY, invSize);\n            }\n\n            break;\n        }\n    }\n}\n\n// check whether a polygon node forms a valid ear with adjacent nodes\nfunction isEar(ear) {\n    const a = ear.prev,\n        b = ear,\n        c = ear.next;\n\n    if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n    // now make sure we don't have other points inside the potential ear\n    const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n    // triangle bbox\n    const x0 = Math.min(ax, bx, cx),\n        y0 = Math.min(ay, by, cy),\n        x1 = Math.max(ax, bx, cx),\n        y1 = Math.max(ay, by, cy);\n\n    let p = c.next;\n    while (p !== a) {\n        if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 &&\n            pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) &&\n            area(p.prev, p, p.next) >= 0) return false;\n        p = p.next;\n    }\n\n    return true;\n}\n\nfunction isEarHashed(ear, minX, minY, invSize) {\n    const a = ear.prev,\n        b = ear,\n        c = ear.next;\n\n    if (area(a, b, c) >= 0) return false; // reflex, can't be an ear\n\n    const ax = a.x, bx = b.x, cx = c.x, ay = a.y, by = b.y, cy = c.y;\n\n    // triangle bbox\n    const x0 = Math.min(ax, bx, cx),\n        y0 = Math.min(ay, by, cy),\n        x1 = Math.max(ax, bx, cx),\n        y1 = Math.max(ay, by, cy);\n\n    // z-order range for the current triangle bbox;\n    const minZ = zOrder(x0, y0, minX, minY, invSize),\n        maxZ = zOrder(x1, y1, minX, minY, invSize);\n\n    let p = ear.prevZ,\n        n = ear.nextZ;\n\n    // look for points inside the triangle in both directions\n    while (p && p.z >= minZ && n && n.z <= maxZ) {\n        if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n            pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n        p = p.prevZ;\n\n        if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n            pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n        n = n.nextZ;\n    }\n\n    // look for remaining points in decreasing z-order\n    while (p && p.z >= minZ) {\n        if (p.x >= x0 && p.x <= x1 && p.y >= y0 && p.y <= y1 && p !== a && p !== c &&\n            pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, p.x, p.y) && area(p.prev, p, p.next) >= 0) return false;\n        p = p.prevZ;\n    }\n\n    // look for remaining points in increasing z-order\n    while (n && n.z <= maxZ) {\n        if (n.x >= x0 && n.x <= x1 && n.y >= y0 && n.y <= y1 && n !== a && n !== c &&\n            pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, n.x, n.y) && area(n.prev, n, n.next) >= 0) return false;\n        n = n.nextZ;\n    }\n\n    return true;\n}\n\n// go through all polygon nodes and cure small local self-intersections\nfunction cureLocalIntersections(start, triangles) {\n    let p = start;\n    do {\n        const a = p.prev,\n            b = p.next.next;\n\n        if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) {\n\n            triangles.push(a.i, p.i, b.i);\n\n            // remove two nodes involved\n            removeNode(p);\n            removeNode(p.next);\n\n            p = start = b;\n        }\n        p = p.next;\n    } while (p !== start);\n\n    return filterPoints(p);\n}\n\n// try splitting polygon into two and triangulate them independently\nfunction splitEarcut(start, triangles, dim, minX, minY, invSize) {\n    // look for a valid diagonal that divides the polygon into two\n    let a = start;\n    do {\n        let b = a.next.next;\n        while (b !== a.prev) {\n            if (a.i !== b.i && isValidDiagonal(a, b)) {\n                // split the polygon in two by the diagonal\n                let c = splitPolygon(a, b);\n\n                // filter colinear points around the cuts\n                a = filterPoints(a, a.next);\n                c = filterPoints(c, c.next);\n\n                // run earcut on each half\n                earcutLinked(a, triangles, dim, minX, minY, invSize, 0);\n                earcutLinked(c, triangles, dim, minX, minY, invSize, 0);\n                return;\n            }\n            b = b.next;\n        }\n        a = a.next;\n    } while (a !== start);\n}\n\n// link every hole into the outer loop, producing a single-ring polygon without holes\nfunction eliminateHoles(data, holeIndices, outerNode, dim) {\n    const queue = [];\n\n    for (let i = 0, len = holeIndices.length; i < len; i++) {\n        const start = holeIndices[i] * dim;\n        const end = i < len - 1 ? holeIndices[i + 1] * dim : data.length;\n        const list = linkedList(data, start, end, dim, false);\n        if (list === list.next) list.steiner = true;\n        queue.push(getLeftmost(list));\n    }\n\n    queue.sort(compareXYSlope);\n\n    // process holes from left to right\n    for (let i = 0; i < queue.length; i++) {\n        outerNode = eliminateHole(queue[i], outerNode);\n    }\n\n    return outerNode;\n}\n\nfunction compareXYSlope(a, b) {\n    let result = a.x - b.x;\n    // when the left-most point of 2 holes meet at a vertex, sort the holes counterclockwise so that when we find\n    // the bridge to the outer shell is always the point that they meet at.\n    if (result === 0) {\n        result = a.y - b.y;\n        if (result === 0) {\n            const aSlope = (a.next.y - a.y) / (a.next.x - a.x);\n            const bSlope = (b.next.y - b.y) / (b.next.x - b.x);\n            result = aSlope - bSlope;\n        }\n    }\n    return result;\n}\n\n// find a bridge between vertices that connects hole with an outer ring and link it\nfunction eliminateHole(hole, outerNode) {\n    const bridge = findHoleBridge(hole, outerNode);\n    if (!bridge) {\n        return outerNode;\n    }\n\n    const bridgeReverse = splitPolygon(bridge, hole);\n\n    // filter collinear points around the cuts\n    filterPoints(bridgeReverse, bridgeReverse.next);\n    return filterPoints(bridge, bridge.next);\n}\n\n// David Eberly's algorithm for finding a bridge between hole and outer polygon\nfunction findHoleBridge(hole, outerNode) {\n    let p = outerNode;\n    const hx = hole.x;\n    const hy = hole.y;\n    let qx = -Infinity;\n    let m;\n\n    // find a segment intersected by a ray from the hole's leftmost point to the left;\n    // segment's endpoint with lesser x will be potential connection point\n    // unless they intersect at a vertex, then choose the vertex\n    if (equals(hole, p)) return p;\n    do {\n        if (equals(hole, p.next)) return p.next;\n        else if (hy <= p.y && hy >= p.next.y && p.next.y !== p.y) {\n            const x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y);\n            if (x <= hx && x > qx) {\n                qx = x;\n                m = p.x < p.next.x ? p : p.next;\n                if (x === hx) return m; // hole touches outer segment; pick leftmost endpoint\n            }\n        }\n        p = p.next;\n    } while (p !== outerNode);\n\n    if (!m) return null;\n\n    // look for points inside the triangle of hole point, segment intersection and endpoint;\n    // if there are no points found, we have a valid connection;\n    // otherwise choose the point of the minimum angle with the ray as connection point\n\n    const stop = m;\n    const mx = m.x;\n    const my = m.y;\n    let tanMin = Infinity;\n\n    p = m;\n\n    do {\n        if (hx >= p.x && p.x >= mx && hx !== p.x &&\n                pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) {\n\n            const tan = Math.abs(hy - p.y) / (hx - p.x); // tangential\n\n            if (locallyInside(p, hole) &&\n                (tan < tanMin || (tan === tanMin && (p.x > m.x || (p.x === m.x && sectorContainsSector(m, p)))))) {\n                m = p;\n                tanMin = tan;\n            }\n        }\n\n        p = p.next;\n    } while (p !== stop);\n\n    return m;\n}\n\n// whether sector in vertex m contains sector in vertex p in the same coordinates\nfunction sectorContainsSector(m, p) {\n    return area(m.prev, m, p.prev) < 0 && area(p.next, m, m.next) < 0;\n}\n\n// interlink polygon nodes in z-order\nfunction indexCurve(start, minX, minY, invSize) {\n    let p = start;\n    do {\n        if (p.z === 0) p.z = zOrder(p.x, p.y, minX, minY, invSize);\n        p.prevZ = p.prev;\n        p.nextZ = p.next;\n        p = p.next;\n    } while (p !== start);\n\n    p.prevZ.nextZ = null;\n    p.prevZ = null;\n\n    sortLinked(p);\n}\n\n// Simon Tatham's linked list merge sort algorithm\n// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html\nfunction sortLinked(list) {\n    let numMerges;\n    let inSize = 1;\n\n    do {\n        let p = list;\n        let e;\n        list = null;\n        let tail = null;\n        numMerges = 0;\n\n        while (p) {\n            numMerges++;\n            let q = p;\n            let pSize = 0;\n            for (let i = 0; i < inSize; i++) {\n                pSize++;\n                q = q.nextZ;\n                if (!q) break;\n            }\n            let qSize = inSize;\n\n            while (pSize > 0 || (qSize > 0 && q)) {\n\n                if (pSize !== 0 && (qSize === 0 || !q || p.z <= q.z)) {\n                    e = p;\n                    p = p.nextZ;\n                    pSize--;\n                } else {\n                    e = q;\n                    q = q.nextZ;\n                    qSize--;\n                }\n\n                if (tail) tail.nextZ = e;\n                else list = e;\n\n                e.prevZ = tail;\n                tail = e;\n            }\n\n            p = q;\n        }\n\n        tail.nextZ = null;\n        inSize *= 2;\n\n    } while (numMerges > 1);\n\n    return list;\n}\n\n// z-order of a point given coords and inverse of the longer side of data bbox\nfunction zOrder(x, y, minX, minY, invSize) {\n    // coords are transformed into non-negative 15-bit integer range\n    x = (x - minX) * invSize | 0;\n    y = (y - minY) * invSize | 0;\n\n    x = (x | (x << 8)) & 0x00FF00FF;\n    x = (x | (x << 4)) & 0x0F0F0F0F;\n    x = (x | (x << 2)) & 0x33333333;\n    x = (x | (x << 1)) & 0x55555555;\n\n    y = (y | (y << 8)) & 0x00FF00FF;\n    y = (y | (y << 4)) & 0x0F0F0F0F;\n    y = (y | (y << 2)) & 0x33333333;\n    y = (y | (y << 1)) & 0x55555555;\n\n    return x | (y << 1);\n}\n\n// find the leftmost node of a polygon ring\nfunction getLeftmost(start) {\n    let p = start,\n        leftmost = start;\n    do {\n        if (p.x < leftmost.x || (p.x === leftmost.x && p.y < leftmost.y)) leftmost = p;\n        p = p.next;\n    } while (p !== start);\n\n    return leftmost;\n}\n\n// check if a point lies within a convex triangle\nfunction pointInTriangle(ax, ay, bx, by, cx, cy, px, py) {\n    return (cx - px) * (ay - py) >= (ax - px) * (cy - py) &&\n           (ax - px) * (by - py) >= (bx - px) * (ay - py) &&\n           (bx - px) * (cy - py) >= (cx - px) * (by - py);\n}\n\n// check if a point lies within a convex triangle but false if its equal to the first point of the triangle\nfunction pointInTriangleExceptFirst(ax, ay, bx, by, cx, cy, px, py) {\n    return !(ax === px && ay === py) && pointInTriangle(ax, ay, bx, by, cx, cy, px, py);\n}\n\n// check if a diagonal between two polygon nodes is valid (lies in polygon interior)\nfunction isValidDiagonal(a, b) {\n    return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && // doesn't intersect other edges\n           (locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b) && // locally visible\n            (area(a.prev, a, b.prev) || area(a, b.prev, b)) || // does not create opposite-facing sectors\n            equals(a, b) && area(a.prev, a, a.next) > 0 && area(b.prev, b, b.next) > 0); // special zero-length case\n}\n\n// signed area of a triangle\nfunction area(p, q, r) {\n    return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);\n}\n\n// check if two points are equal\nfunction equals(p1, p2) {\n    return p1.x === p2.x && p1.y === p2.y;\n}\n\n// check if two segments intersect\nfunction intersects(p1, q1, p2, q2) {\n    const o1 = sign(area(p1, q1, p2));\n    const o2 = sign(area(p1, q1, q2));\n    const o3 = sign(area(p2, q2, p1));\n    const o4 = sign(area(p2, q2, q1));\n\n    if (o1 !== o2 && o3 !== o4) return true; // general case\n\n    if (o1 === 0 && onSegment(p1, p2, q1)) return true; // p1, q1 and p2 are collinear and p2 lies on p1q1\n    if (o2 === 0 && onSegment(p1, q2, q1)) return true; // p1, q1 and q2 are collinear and q2 lies on p1q1\n    if (o3 === 0 && onSegment(p2, p1, q2)) return true; // p2, q2 and p1 are collinear and p1 lies on p2q2\n    if (o4 === 0 && onSegment(p2, q1, q2)) return true; // p2, q2 and q1 are collinear and q1 lies on p2q2\n\n    return false;\n}\n\n// for collinear points p, q, r, check if point q lies on segment pr\nfunction onSegment(p, q, r) {\n    return q.x <= Math.max(p.x, r.x) && q.x >= Math.min(p.x, r.x) && q.y <= Math.max(p.y, r.y) && q.y >= Math.min(p.y, r.y);\n}\n\nfunction sign(num) {\n    return num > 0 ? 1 : num < 0 ? -1 : 0;\n}\n\n// check if a polygon diagonal intersects any polygon segments\nfunction intersectsPolygon(a, b) {\n    let p = a;\n    do {\n        if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i &&\n                intersects(p, p.next, a, b)) return true;\n        p = p.next;\n    } while (p !== a);\n\n    return false;\n}\n\n// check if a polygon diagonal is locally inside the polygon\nfunction locallyInside(a, b) {\n    return area(a.prev, a, a.next) < 0 ?\n        area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 :\n        area(a, b, a.prev) < 0 || area(a, a.next, b) < 0;\n}\n\n// check if the middle point of a polygon diagonal is inside the polygon\nfunction middleInside(a, b) {\n    let p = a;\n    let inside = false;\n    const px = (a.x + b.x) / 2;\n    const py = (a.y + b.y) / 2;\n    do {\n        if (((p.y > py) !== (p.next.y > py)) && p.next.y !== p.y &&\n                (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x))\n            inside = !inside;\n        p = p.next;\n    } while (p !== a);\n\n    return inside;\n}\n\n// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two;\n// if one belongs to the outer ring and another to a hole, it merges it into a single ring\nfunction splitPolygon(a, b) {\n    const a2 = createNode(a.i, a.x, a.y),\n        b2 = createNode(b.i, b.x, b.y),\n        an = a.next,\n        bp = b.prev;\n\n    a.next = b;\n    b.prev = a;\n\n    a2.next = an;\n    an.prev = a2;\n\n    b2.next = a2;\n    a2.prev = b2;\n\n    bp.next = b2;\n    b2.prev = bp;\n\n    return b2;\n}\n\n// create a node and optionally link it with previous one (in a circular doubly linked list)\nfunction insertNode(i, x, y, last) {\n    const p = createNode(i, x, y);\n\n    if (!last) {\n        p.prev = p;\n        p.next = p;\n\n    } else {\n        p.next = last.next;\n        p.prev = last;\n        last.next.prev = p;\n        last.next = p;\n    }\n    return p;\n}\n\nfunction removeNode(p) {\n    p.next.prev = p.prev;\n    p.prev.next = p.next;\n\n    if (p.prevZ) p.prevZ.nextZ = p.nextZ;\n    if (p.nextZ) p.nextZ.prevZ = p.prevZ;\n}\n\nfunction createNode(i, x, y) {\n    return {\n        i, // vertex index in coordinates array\n        x, y, // vertex coordinates\n        prev: null, // previous and next vertex nodes in a polygon ring\n        next: null,\n        z: 0, // z-order curve value\n        prevZ: null, // previous and next nodes in z-order\n        nextZ: null,\n        steiner: false // indicates whether this is a steiner point\n    };\n}\n\nfunction signedArea(data, start, end, dim) {\n    let sum = 0;\n    for (let i = start, j = end - dim; i < end; i += dim) {\n        sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]);\n        j = i;\n    }\n    return sum;\n}\n\n/**\n * An implementation of the earcut polygon triangulation algorithm.\n * The code is a port of [mapbox/earcut](https://github.com/mapbox/earcut).\n *\n * @see https://github.com/mapbox/earcut\n */\nclass Earcut {\n\n\t/**\n\t * Triangulates the given shape definition by returning an array of triangles.\n\t *\n\t * @param {Array<number>} data - An array with 2D points.\n\t * @param {Array<number>} holeIndices - An array with indices defining holes.\n\t * @param {number} [dim=2] - The number of coordinates per vertex in the input array.\n\t * @return {Array<number>} An array representing the triangulated faces. Each face is defined by three consecutive numbers\n\t * representing vertex indices.\n\t */\n\tstatic triangulate( data, holeIndices, dim = 2 ) {\n\n\t\treturn earcut( data, holeIndices, dim );\n\n\t}\n\n}\n\n/**\n * A class containing utility functions for shapes.\n *\n * @hideconstructor\n */\nclass ShapeUtils {\n\n\t/**\n\t * Calculate area of a ( 2D ) contour polygon.\n\t *\n\t * @param {Array<Vector2>} contour - An array of 2D points.\n\t * @return {number} The area.\n\t */\n\tstatic area( contour ) {\n\n\t\tconst n = contour.length;\n\t\tlet a = 0.0;\n\n\t\tfor ( let p = n - 1, q = 0; q < n; p = q ++ ) {\n\n\t\t\ta += contour[ p ].x * contour[ q ].y - contour[ q ].x * contour[ p ].y;\n\n\t\t}\n\n\t\treturn a * 0.5;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given contour uses a clockwise winding order.\n\t *\n\t * @param {Array<Vector2>} pts - An array of 2D points defining a polygon.\n\t * @return {boolean} Whether the given contour uses a clockwise winding order or not.\n\t */\n\tstatic isClockWise( pts ) {\n\n\t\treturn ShapeUtils.area( pts ) < 0;\n\n\t}\n\n\t/**\n\t * Triangulates the given shape definition.\n\t *\n\t * @param {Array<Vector2>} contour - An array of 2D points defining the contour.\n\t * @param {Array<Array<Vector2>>} holes - An array that holds arrays of 2D points defining the holes.\n\t * @return {Array<Array<number>>} An array that holds for each face definition an array with three indices.\n\t */\n\tstatic triangulateShape( contour, holes ) {\n\n\t\tconst vertices = []; // flat array of vertices like [ x0,y0, x1,y1, x2,y2, ... ]\n\t\tconst holeIndices = []; // array of hole indices\n\t\tconst faces = []; // final array of vertex indices like [ [ a,b,d ], [ b,c,d ] ]\n\n\t\tremoveDupEndPts( contour );\n\t\taddContour( vertices, contour );\n\n\t\t//\n\n\t\tlet holeIndex = contour.length;\n\n\t\tholes.forEach( removeDupEndPts );\n\n\t\tfor ( let i = 0; i < holes.length; i ++ ) {\n\n\t\t\tholeIndices.push( holeIndex );\n\t\t\tholeIndex += holes[ i ].length;\n\t\t\taddContour( vertices, holes[ i ] );\n\n\t\t}\n\n\t\t//\n\n\t\tconst triangles = Earcut.triangulate( vertices, holeIndices );\n\n\t\t//\n\n\t\tfor ( let i = 0; i < triangles.length; i += 3 ) {\n\n\t\t\tfaces.push( triangles.slice( i, i + 3 ) );\n\n\t\t}\n\n\t\treturn faces;\n\n\t}\n\n}\n\nfunction removeDupEndPts( points ) {\n\n\tconst l = points.length;\n\n\tif ( l > 2 && points[ l - 1 ].equals( points[ 0 ] ) ) {\n\n\t\tpoints.pop();\n\n\t}\n\n}\n\nfunction addContour( vertices, contour ) {\n\n\tfor ( let i = 0; i < contour.length; i ++ ) {\n\n\t\tvertices.push( contour[ i ].x );\n\t\tvertices.push( contour[ i ].y );\n\n\t}\n\n}\n\n/**\n * Creates extruded geometry from a path shape.\n *\n * ```js\n * const length = 12, width = 8;\n *\n * const shape = new THREE.Shape();\n * shape.moveTo( 0,0 );\n * shape.lineTo( 0, width );\n * shape.lineTo( length, width );\n * shape.lineTo( length, 0 );\n * shape.lineTo( 0, 0 );\n *\n * const geometry = new THREE.ExtrudeGeometry( shape );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const mesh = new THREE.Mesh( geometry, material ) ;\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#ExtrudeGeometry\n */\nclass ExtrudeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new extrude geometry.\n\t *\n\t * @param {Shape|Array<Shape>} [shapes] - A shape or an array of shapes.\n\t * @param {ExtrudeGeometry~Options} [options] - The extrude settings.\n\t */\n\tconstructor( shapes = new Shape( [ new Vector2( 0.5, 0.5 ), new Vector2( -0.5, 0.5 ), new Vector2( -0.5, -0.5 ), new Vector2( 0.5, -0.5 ) ] ), options = {} ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ExtrudeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\toptions: options\n\t\t};\n\n\t\tshapes = Array.isArray( shapes ) ? shapes : [ shapes ];\n\n\t\tconst scope = this;\n\n\t\tconst verticesArray = [];\n\t\tconst uvArray = [];\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\t\t\taddShape( shape );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) );\n\n\t\tthis.computeVertexNormals();\n\n\t\t// functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst placeholder = [];\n\n\t\t\t// options\n\n\t\t\tconst curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;\n\t\t\tconst steps = options.steps !== undefined ? options.steps : 1;\n\t\t\tconst depth = options.depth !== undefined ? options.depth : 1;\n\n\t\t\tlet bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true;\n\t\t\tlet bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 0.2;\n\t\t\tlet bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 0.1;\n\t\t\tlet bevelOffset = options.bevelOffset !== undefined ? options.bevelOffset : 0;\n\t\t\tlet bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;\n\n\t\t\tconst extrudePath = options.extrudePath;\n\n\t\t\tconst uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator;\n\n\t\t\t//\n\n\t\t\tlet extrudePts, extrudeByPath = false;\n\t\t\tlet splineTube, binormal, normal, position2;\n\n\t\t\tif ( extrudePath ) {\n\n\t\t\t\textrudePts = extrudePath.getSpacedPoints( steps );\n\n\t\t\t\textrudeByPath = true;\n\t\t\t\tbevelEnabled = false; // bevels not supported for path extrusion\n\n\t\t\t\t// SETUP TNB variables\n\n\t\t\t\tconst isClosed = extrudePath.isCatmullRomCurve3 ? extrudePath.closed : false;\n\n\t\t\t\tsplineTube = extrudePath.computeFrenetFrames( steps, isClosed );\n\n\t\t\t\t// log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);\n\n\t\t\t\tbinormal = new Vector3();\n\t\t\t\tnormal = new Vector3();\n\t\t\t\tposition2 = new Vector3();\n\n\t\t\t}\n\n\t\t\t// Safeguards if bevels are not enabled\n\n\t\t\tif ( ! bevelEnabled ) {\n\n\t\t\t\tbevelSegments = 0;\n\t\t\t\tbevelThickness = 0;\n\t\t\t\tbevelSize = 0;\n\t\t\t\tbevelOffset = 0;\n\n\t\t\t}\n\n\t\t\t// Variables initialization\n\n\t\t\tconst shapePoints = shape.extractPoints( curveSegments );\n\n\t\t\tlet vertices = shapePoints.shape;\n\t\t\tconst holes = shapePoints.holes;\n\n\t\t\tconst reverse = ! ShapeUtils.isClockWise( vertices );\n\n\t\t\tif ( reverse ) {\n\n\t\t\t\tvertices = vertices.reverse();\n\n\t\t\t\t// Maybe we should also check if holes are in the opposite direction, just to be safe ...\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\t\tif ( ShapeUtils.isClockWise( ahole ) ) {\n\n\t\t\t\t\t\tholes[ h ] = ahole.reverse();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t/**Merges index-adjacent points that are within a threshold distance of each other. Array is modified in-place. Threshold distance is empirical, and scaled based on the magnitude of point coordinates.\n\t\t\t * @param {Array<Vector2>} points\n\t\t\t*/\n\t\t\tfunction mergeOverlappingPoints( points ) {\n\n\t\t\t\tconst THRESHOLD = 1e-10;\n\t\t\t\tconst THRESHOLD_SQ = THRESHOLD * THRESHOLD;\n\t\t\t\tlet prevPos = points[ 0 ];\n\t\t\t\tfor ( let i = 1; i <= points.length; i ++ ) {\n\n\t\t\t\t\tconst currentIndex = i % points.length;\n\t\t\t\t\tconst currentPos = points[ currentIndex ];\n\t\t\t\t\tconst dx = currentPos.x - prevPos.x;\n\t\t\t\t\tconst dy = currentPos.y - prevPos.y;\n\t\t\t\t\tconst distSq = dx * dx + dy * dy;\n\n\t\t\t\t\tconst scalingFactorSqrt = Math.max(\n\t\t\t\t\t\tMath.abs( currentPos.x ),\n\t\t\t\t\t\tMath.abs( currentPos.y ),\n\t\t\t\t\t\tMath.abs( prevPos.x ),\n\t\t\t\t\t\tMath.abs( prevPos.y )\n\t\t\t\t\t);\n\t\t\t\t\tconst thresholdSqScaled = THRESHOLD_SQ * scalingFactorSqrt * scalingFactorSqrt;\n\t\t\t\t\tif ( distSq <= thresholdSqScaled ) {\n\n\t\t\t\t\t\tpoints.splice( currentIndex, 1 );\n\t\t\t\t\t\ti --;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tprevPos = currentPos;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tmergeOverlappingPoints( vertices );\n\t\t\tholes.forEach( mergeOverlappingPoints );\n\n\t\t\tconst numHoles = holes.length;\n\n\t\t\t/* Vertices */\n\n\t\t\tconst contour = vertices; // vertices has all points but contour has only points of circumference\n\n\t\t\tfor ( let h = 0; h < numHoles; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\tvertices = vertices.concat( ahole );\n\n\t\t\t}\n\n\n\t\t\tfunction scalePt2( pt, vec, size ) {\n\n\t\t\t\tif ( ! vec ) error( 'ExtrudeGeometry: vec does not exist' );\n\n\t\t\t\treturn pt.clone().addScaledVector( vec, size );\n\n\t\t\t}\n\n\t\t\tconst vlen = vertices.length;\n\n\n\t\t\t// Find directions for point movement\n\n\n\t\t\tfunction getBevelVec( inPt, inPrev, inNext ) {\n\n\t\t\t\t// computes for inPt the corresponding point inPt' on a new contour\n\t\t\t\t//   shifted by 1 unit (length of normalized vector) to the left\n\t\t\t\t// if we walk along contour clockwise, this new contour is outside the old one\n\t\t\t\t//\n\t\t\t\t// inPt' is the intersection of the two lines parallel to the two\n\t\t\t\t//  adjacent edges of inPt at a distance of 1 unit on the left side.\n\n\t\t\t\tlet v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt\n\n\t\t\t\t// good reading for geometry algorithms (here: line-line intersection)\n\t\t\t\t// http://geomalgorithms.com/a05-_intersect-1.html\n\n\t\t\t\tconst v_prev_x = inPt.x - inPrev.x,\n\t\t\t\t\tv_prev_y = inPt.y - inPrev.y;\n\t\t\t\tconst v_next_x = inNext.x - inPt.x,\n\t\t\t\t\tv_next_y = inNext.y - inPt.y;\n\n\t\t\t\tconst v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );\n\n\t\t\t\t// check for collinear edges\n\t\t\t\tconst collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\tif ( Math.abs( collinear0 ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not collinear\n\n\t\t\t\t\t// length of vectors for normalizing\n\n\t\t\t\t\tconst v_prev_len = Math.sqrt( v_prev_lensq );\n\t\t\t\t\tconst v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );\n\n\t\t\t\t\t// shift adjacent points by unit vectors to the left\n\n\t\t\t\t\tconst ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );\n\t\t\t\t\tconst ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );\n\n\t\t\t\t\tconst ptNextShift_x = ( inNext.x - v_next_y / v_next_len );\n\t\t\t\t\tconst ptNextShift_y = ( inNext.y + v_next_x / v_next_len );\n\n\t\t\t\t\t// scaling factor for v_prev to intersection point\n\n\t\t\t\t\tconst sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -\n\t\t\t\t\t\t\t( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /\n\t\t\t\t\t\t( v_prev_x * v_next_y - v_prev_y * v_next_x );\n\n\t\t\t\t\t// vector from inPt to intersection point\n\n\t\t\t\t\tv_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );\n\t\t\t\t\tv_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );\n\n\t\t\t\t\t// Don't normalize!, otherwise sharp corners become ugly\n\t\t\t\t\t//  but prevent crazy spikes\n\t\t\t\t\tconst v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );\n\t\t\t\t\tif ( v_trans_lensq <= 2 ) {\n\n\t\t\t\t\t\treturn new Vector2( v_trans_x, v_trans_y );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_trans_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// handle special case of collinear edges\n\n\t\t\t\t\tlet direction_eq = false; // assumes: opposite\n\n\t\t\t\t\tif ( v_prev_x > Number.EPSILON ) {\n\n\t\t\t\t\t\tif ( v_next_x > Number.EPSILON ) {\n\n\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( v_prev_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\tif ( v_next_x < - Number.EPSILON ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {\n\n\t\t\t\t\t\t\t\tdirection_eq = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( direction_eq ) {\n\n\t\t\t\t\t\t// log(\"Warning: lines are a straight sequence\");\n\t\t\t\t\t\tv_trans_x = - v_prev_y;\n\t\t\t\t\t\tv_trans_y = v_prev_x;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// log(\"Warning: lines are a straight spike\");\n\t\t\t\t\t\tv_trans_x = v_prev_x;\n\t\t\t\t\t\tv_trans_y = v_prev_y;\n\t\t\t\t\t\tshrink_by = Math.sqrt( v_prev_lensq / 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );\n\n\t\t\t}\n\n\n\t\t\tconst contourMovements = [];\n\n\t\t\tfor ( let i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t//  (j)---(i)---(k)\n\t\t\t\t// log('i,j,k', i, j , k)\n\n\t\t\t\tcontourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );\n\n\t\t\t}\n\n\t\t\tconst holesMovements = [];\n\t\t\tlet oneHoleMovements, verticesMovements = contourMovements.concat();\n\n\t\t\tfor ( let h = 0, hl = numHoles; h < hl; h ++ ) {\n\n\t\t\t\tconst ahole = holes[ h ];\n\n\t\t\t\toneHoleMovements = [];\n\n\t\t\t\tfor ( let i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {\n\n\t\t\t\t\tif ( j === il ) j = 0;\n\t\t\t\t\tif ( k === il ) k = 0;\n\n\t\t\t\t\t//  (j)---(i)---(k)\n\t\t\t\t\toneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );\n\n\t\t\t\t}\n\n\t\t\t\tholesMovements.push( oneHoleMovements );\n\t\t\t\tverticesMovements = verticesMovements.concat( oneHoleMovements );\n\n\t\t\t}\n\n\t\t\tlet faces;\n\n\t\t\tif ( bevelSegments === 0 ) {\n\n\t\t\t\tfaces = ShapeUtils.triangulateShape( contour, holes );\n\n\t\t\t} else {\n\n\t\t\t\tconst contractedContourVertices = [];\n\t\t\t\tconst expandedHoleVertices = [];\n\n\t\t\t\t// Loop bevelSegments, 1 for the front, 1 for the back\n\n\t\t\t\tfor ( let b = 0; b < bevelSegments; b ++ ) {\n\n\t\t\t\t\t//for ( b = bevelSegments; b > 0; b -- ) {\n\n\t\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t\t// contract shape\n\n\t\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\n\t\t\t\t\t\tv( vert.x, vert.y, - z );\n\t\t\t\t\t\tif ( t === 0 ) contractedContourVertices.push( vert );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// expand holes\n\n\t\t\t\t\tfor ( let h = 0, hl = numHoles; h < hl; h ++ ) {\n\n\t\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\t\t\t\t\t\tconst oneHoleVertices = [];\n\t\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\t\tv( vert.x, vert.y, - z );\n\t\t\t\t\t\t\tif ( t === 0 ) oneHoleVertices.push( vert );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( t === 0 ) expandedHoleVertices.push( oneHoleVertices );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfaces = ShapeUtils.triangulateShape( contractedContourVertices, expandedHoleVertices );\n\n\t\t\t}\n\n\t\t\tconst flen = faces.length;\n\n\t\t\tconst bs = bevelSize + bevelOffset;\n\n\t\t\t// Back facing vertices\n\n\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\tv( vert.x, vert.y, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );\n\n\t\t\t\t\tnormal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );\n\t\t\t\t\tbinormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\tposition2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );\n\n\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Add stepped vertices...\n\t\t\t// Including front facing vertices\n\n\t\t\tfor ( let s = 1; s <= steps; s ++ ) {\n\n\t\t\t\tfor ( let i = 0; i < vlen; i ++ ) {\n\n\t\t\t\t\tconst vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];\n\n\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\tv( vert.x, vert.y, depth / steps * s );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );\n\n\t\t\t\t\t\tnormal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );\n\t\t\t\t\t\tbinormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );\n\n\t\t\t\t\t\tposition2.copy( extrudePts[ s ] ).add( normal ).add( binormal );\n\n\t\t\t\t\t\tv( position2.x, position2.y, position2.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\t// Add bevel segments planes\n\n\t\t\t//for ( b = 1; b <= bevelSegments; b ++ ) {\n\t\t\tfor ( let b = bevelSegments - 1; b >= 0; b -- ) {\n\n\t\t\t\tconst t = b / bevelSegments;\n\t\t\t\tconst z = bevelThickness * Math.cos( t * Math.PI / 2 );\n\t\t\t\tconst bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;\n\n\t\t\t\t// contract shape\n\n\t\t\t\tfor ( let i = 0, il = contour.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst vert = scalePt2( contour[ i ], contourMovements[ i ], bs );\n\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t}\n\n\t\t\t\t// expand holes\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\toneHoleMovements = holesMovements[ h ];\n\n\t\t\t\t\tfor ( let i = 0, il = ahole.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tconst vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );\n\n\t\t\t\t\t\tif ( ! extrudeByPath ) {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y, depth + z );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tv( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t/* Faces */\n\n\t\t\t// Top and bottom faces\n\n\t\t\tbuildLidFaces();\n\n\t\t\t// Sides faces\n\n\t\t\tbuildSideFaces();\n\n\n\t\t\t/////  Internal functions\n\n\t\t\tfunction buildLidFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\n\t\t\t\tif ( bevelEnabled ) {\n\n\t\t\t\t\tlet layer = 0; // steps + 1\n\t\t\t\t\tlet offset = vlen * layer;\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlayer = steps + bevelSegments * 2;\n\t\t\t\t\toffset = vlen * layer;\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Bottom faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 2 ], face[ 1 ], face[ 0 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Top faces\n\n\t\t\t\t\tfor ( let i = 0; i < flen; i ++ ) {\n\n\t\t\t\t\t\tconst face = faces[ i ];\n\t\t\t\t\t\tf3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 0 );\n\n\t\t\t}\n\n\t\t\t// Create faces for the z-sides of the shape\n\n\t\t\tfunction buildSideFaces() {\n\n\t\t\t\tconst start = verticesArray.length / 3;\n\t\t\t\tlet layeroffset = 0;\n\t\t\t\tsidewalls( contour, layeroffset );\n\t\t\t\tlayeroffset += contour.length;\n\n\t\t\t\tfor ( let h = 0, hl = holes.length; h < hl; h ++ ) {\n\n\t\t\t\t\tconst ahole = holes[ h ];\n\t\t\t\t\tsidewalls( ahole, layeroffset );\n\n\t\t\t\t\t//, true\n\t\t\t\t\tlayeroffset += ahole.length;\n\n\t\t\t\t}\n\n\n\t\t\t\tscope.addGroup( start, verticesArray.length / 3 - start, 1 );\n\n\n\t\t\t}\n\n\t\t\tfunction sidewalls( contour, layeroffset ) {\n\n\t\t\t\tlet i = contour.length;\n\n\t\t\t\twhile ( -- i >= 0 ) {\n\n\t\t\t\t\tconst j = i;\n\t\t\t\t\tlet k = i - 1;\n\t\t\t\t\tif ( k < 0 ) k = contour.length - 1;\n\n\t\t\t\t\t//log('b', i,j, i-1, k,vertices.length);\n\n\t\t\t\t\tfor ( let s = 0, sl = ( steps + bevelSegments * 2 ); s < sl; s ++ ) {\n\n\t\t\t\t\t\tconst slen1 = vlen * s;\n\t\t\t\t\t\tconst slen2 = vlen * ( s + 1 );\n\n\t\t\t\t\t\tconst a = layeroffset + j + slen1,\n\t\t\t\t\t\t\tb = layeroffset + k + slen1,\n\t\t\t\t\t\t\tc = layeroffset + k + slen2,\n\t\t\t\t\t\t\td = layeroffset + j + slen2;\n\n\t\t\t\t\t\tf4( a, b, c, d );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction v( x, y, z ) {\n\n\t\t\t\tplaceholder.push( x );\n\t\t\t\tplaceholder.push( y );\n\t\t\t\tplaceholder.push( z );\n\n\t\t\t}\n\n\n\t\t\tfunction f3( a, b, c ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\n\t\t\t}\n\n\t\t\tfunction f4( a, b, c, d ) {\n\n\t\t\t\taddVertex( a );\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( d );\n\n\t\t\t\taddVertex( b );\n\t\t\t\taddVertex( c );\n\t\t\t\taddVertex( d );\n\n\n\t\t\t\tconst nextIndex = verticesArray.length / 3;\n\t\t\t\tconst uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 );\n\n\t\t\t\taddUV( uvs[ 0 ] );\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t\taddUV( uvs[ 1 ] );\n\t\t\t\taddUV( uvs[ 2 ] );\n\t\t\t\taddUV( uvs[ 3 ] );\n\n\t\t\t}\n\n\t\t\tfunction addVertex( index ) {\n\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 0 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 1 ] );\n\t\t\t\tverticesArray.push( placeholder[ index * 3 + 2 ] );\n\n\t\t\t}\n\n\n\t\t\tfunction addUV( vector2 ) {\n\n\t\t\t\tuvArray.push( vector2.x );\n\t\t\t\tuvArray.push( vector2.y );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\t\tconst options = this.parameters.options;\n\n\t\treturn toJSON$1( shapes, options, data );\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @param {Array<Shape>} shapes - An array of shapes.\n\t * @return {ExtrudeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\tconst extrudePath = data.options.extrudePath;\n\n\t\tif ( extrudePath !== undefined ) {\n\n\t\t\tdata.options.extrudePath = new Curves[ extrudePath.type ]().fromJSON( extrudePath );\n\n\t\t}\n\n\t\treturn new ExtrudeGeometry( geometryShapes, data.options );\n\n\t}\n\n}\n\nconst WorldUVGenerator = {\n\n\tgenerateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\n\t\treturn [\n\t\t\tnew Vector2( a_x, a_y ),\n\t\t\tnew Vector2( b_x, b_y ),\n\t\t\tnew Vector2( c_x, c_y )\n\t\t];\n\n\t},\n\n\tgenerateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) {\n\n\t\tconst a_x = vertices[ indexA * 3 ];\n\t\tconst a_y = vertices[ indexA * 3 + 1 ];\n\t\tconst a_z = vertices[ indexA * 3 + 2 ];\n\t\tconst b_x = vertices[ indexB * 3 ];\n\t\tconst b_y = vertices[ indexB * 3 + 1 ];\n\t\tconst b_z = vertices[ indexB * 3 + 2 ];\n\t\tconst c_x = vertices[ indexC * 3 ];\n\t\tconst c_y = vertices[ indexC * 3 + 1 ];\n\t\tconst c_z = vertices[ indexC * 3 + 2 ];\n\t\tconst d_x = vertices[ indexD * 3 ];\n\t\tconst d_y = vertices[ indexD * 3 + 1 ];\n\t\tconst d_z = vertices[ indexD * 3 + 2 ];\n\n\t\tif ( Math.abs( a_y - b_y ) < Math.abs( a_x - b_x ) ) {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_x, 1 - a_z ),\n\t\t\t\tnew Vector2( b_x, 1 - b_z ),\n\t\t\t\tnew Vector2( c_x, 1 - c_z ),\n\t\t\t\tnew Vector2( d_x, 1 - d_z )\n\t\t\t];\n\n\t\t} else {\n\n\t\t\treturn [\n\t\t\t\tnew Vector2( a_y, 1 - a_z ),\n\t\t\t\tnew Vector2( b_y, 1 - b_z ),\n\t\t\t\tnew Vector2( c_y, 1 - c_z ),\n\t\t\t\tnew Vector2( d_y, 1 - d_z )\n\t\t\t];\n\n\t\t}\n\n\t}\n\n};\n\nfunction toJSON$1( shapes, options, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\tdata.options = Object.assign( {}, options );\n\n\tif ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON();\n\n\treturn data;\n\n}\n\n/**\n * A geometry class for representing an icosahedron.\n *\n * ```js\n * const geometry = new THREE.IcosahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const icosahedron = new THREE.Mesh( geometry, material );\n * scene.add( icosahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#IcosahedronGeometry\n */\nclass IcosahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new icosahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the icosahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a icosahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst t = ( 1 + Math.sqrt( 5 ) ) / 2;\n\n\t\tconst vertices = [\n\t\t\t-1, t, 0, \t1, t, 0, \t-1, - t, 0, \t1, - t, 0,\n\t\t\t0, -1, t, \t0, 1, t,\t0, -1, - t, \t0, 1, - t,\n\t\t\tt, 0, -1, \tt, 0, 1, \t- t, 0, -1, \t- t, 0, 1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 11, 5, \t0, 5, 1, \t0, 1, 7, \t0, 7, 10, \t0, 10, 11,\n\t\t\t1, 5, 9, \t5, 11, 4,\t11, 10, 2,\t10, 7, 6,\t7, 1, 8,\n\t\t\t3, 9, 4, \t3, 4, 2,\t3, 2, 6,\t3, 6, 8,\t3, 8, 9,\n\t\t\t4, 9, 5, \t2, 4, 11,\t6, 2, 10,\t8, 6, 7,\t9, 8, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'IcosahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {IcosahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new IcosahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\n/**\n * Creates meshes with axial symmetry like vases. The lathe rotates around the Y axis.\n *\n * ```js\n * const points = [];\n * for ( let i = 0; i < 10; i ++ ) {\n * \tpoints.push( new THREE.Vector2( Math.sin( i * 0.2 ) * 10 + 5, ( i - 5 ) * 2 ) );\n * }\n * const geometry = new THREE.LatheGeometry( points );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const lathe = new THREE.Mesh( geometry, material );\n * scene.add( lathe );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#LatheGeometry\n */\nclass LatheGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new lathe geometry.\n\t *\n\t * @param {Array<Vector2|Vector3>} [points] - An array of points in 2D space. The x-coordinate of each point\n\t * must be greater than zero.\n\t * @param {number} [segments=12] - The number of circumference segments to generate.\n\t * @param {number} [phiStart=0] - The starting angle in radians.\n\t * @param {number} [phiLength=Math.PI*2] - The radian (0 to 2PI) range of the lathed section 2PI is a\n\t * closed lathe, less than 2PI is a portion.\n\t */\n\tconstructor( points = [ new Vector2( 0, -0.5 ), new Vector2( 0.5, 0 ), new Vector2( 0, 0.5 ) ], segments = 12, phiStart = 0, phiLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'LatheGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tpoints: points,\n\t\t\tsegments: segments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength\n\t\t};\n\n\t\tsegments = Math.floor( segments );\n\n\t\t// clamp phiLength so it's in range of [ 0, 2PI ]\n\n\t\tphiLength = clamp( phiLength, 0, Math.PI * 2 );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst uvs = [];\n\t\tconst initNormals = [];\n\t\tconst normals = [];\n\n\t\t// helper variables\n\n\t\tconst inverseSegments = 1.0 / segments;\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tconst normal = new Vector3();\n\t\tconst curNormal = new Vector3();\n\t\tconst prevNormal = new Vector3();\n\t\tlet dx = 0;\n\t\tlet dy = 0;\n\n\t\t// pre-compute normals for initial \"meridian\"\n\n\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\tswitch ( j ) {\n\n\t\t\t\tcase 0:\t\t\t\t// special handling for 1st vertex on path\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tprevNormal.copy( normal );\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase ( points.length - 1 ):\t// special handling for last Vertex on path\n\n\t\t\t\t\tinitNormals.push( prevNormal.x, prevNormal.y, prevNormal.z );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\t\t\t// default handling for all vertices in between\n\n\t\t\t\t\tdx = points[ j + 1 ].x - points[ j ].x;\n\t\t\t\t\tdy = points[ j + 1 ].y - points[ j ].y;\n\n\t\t\t\t\tnormal.x = dy * 1.0;\n\t\t\t\t\tnormal.y = - dx;\n\t\t\t\t\tnormal.z = dy * 0.0;\n\n\t\t\t\t\tcurNormal.copy( normal );\n\n\t\t\t\t\tnormal.x += prevNormal.x;\n\t\t\t\t\tnormal.y += prevNormal.y;\n\t\t\t\t\tnormal.z += prevNormal.z;\n\n\t\t\t\t\tnormal.normalize();\n\n\t\t\t\t\tinitNormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t\tprevNormal.copy( curNormal );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate vertices, uvs and normals\n\n\t\tfor ( let i = 0; i <= segments; i ++ ) {\n\n\t\t\tconst phi = phiStart + i * inverseSegments * phiLength;\n\n\t\t\tconst sin = Math.sin( phi );\n\t\t\tconst cos = Math.cos( phi );\n\n\t\t\tfor ( let j = 0; j <= ( points.length - 1 ); j ++ ) {\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = points[ j ].x * sin;\n\t\t\t\tvertex.y = points[ j ].y;\n\t\t\t\tvertex.z = points[ j ].x * cos;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = i / segments;\n\t\t\t\tuv.y = j / ( points.length - 1 );\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t// normal\n\n\t\t\t\tconst x = initNormals[ 3 * j + 0 ] * sin;\n\t\t\t\tconst y = initNormals[ 3 * j + 1 ];\n\t\t\t\tconst z = initNormals[ 3 * j + 0 ] * cos;\n\n\t\t\t\tnormals.push( x, y, z );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let i = 0; i < segments; i ++ ) {\n\n\t\t\tfor ( let j = 0; j < ( points.length - 1 ); j ++ ) {\n\n\t\t\t\tconst base = j + i * points.length;\n\n\t\t\t\tconst a = base;\n\t\t\t\tconst b = base + points.length;\n\t\t\t\tconst c = base + points.length + 1;\n\t\t\t\tconst d = base + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( c, d, b );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {LatheGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new LatheGeometry( data.points, data.segments, data.phiStart, data.phiLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing an octahedron.\n *\n * ```js\n * const geometry = new THREE.OctahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const octahedron = new THREE.Mesh( geometry, material );\n * scene.add( octahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#OctahedronGeometry\n */\nclass OctahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new octahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the octahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a octahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 0, 0, \t-1, 0, 0,\t0, 1, 0,\n\t\t\t0, -1, 0, \t0, 0, 1,\t0, 0, -1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t0, 2, 4,\t0, 4, 3,\t0, 3, 5,\n\t\t\t0, 5, 2,\t1, 2, 5,\t1, 5, 3,\n\t\t\t1, 3, 4,\t1, 4, 2\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'OctahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {OctahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new OctahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing a plane.\n *\n * ```js\n * const geometry = new THREE.PlaneGeometry( 1, 1 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00, side: THREE.DoubleSide } );\n * const plane = new THREE.Mesh( geometry, material );\n * scene.add( plane );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#PlaneGeometry\n */\nclass PlaneGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new plane geometry.\n\t *\n\t * @param {number} [width=1] - The width along the X axis.\n\t * @param {number} [height=1] - The height along the Y axis\n\t * @param {number} [widthSegments=1] - The number of segments along the X axis.\n\t * @param {number} [heightSegments=1] - The number of segments along the Y axis.\n\t */\n\tconstructor( width = 1, height = 1, widthSegments = 1, heightSegments = 1 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'PlaneGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tconst width_half = width / 2;\n\t\tconst height_half = height / 2;\n\n\t\tconst gridX = Math.floor( widthSegments );\n\t\tconst gridY = Math.floor( heightSegments );\n\n\t\tconst gridX1 = gridX + 1;\n\t\tconst gridY1 = gridY + 1;\n\n\t\tconst segment_width = width / gridX;\n\t\tconst segment_height = height / gridY;\n\n\t\t//\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tfor ( let iy = 0; iy < gridY1; iy ++ ) {\n\n\t\t\tconst y = iy * segment_height - height_half;\n\n\t\t\tfor ( let ix = 0; ix < gridX1; ix ++ ) {\n\n\t\t\t\tconst x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push( x, - y, 0 );\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\tuvs.push( ix / gridX );\n\t\t\t\tuvs.push( 1 - ( iy / gridY ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let iy = 0; iy < gridY; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < gridX; ix ++ ) {\n\n\t\t\t\tconst a = ix + gridX1 * iy;\n\t\t\t\tconst b = ix + gridX1 * ( iy + 1 );\n\t\t\t\tconst c = ( ix + 1 ) + gridX1 * ( iy + 1 );\n\t\t\t\tconst d = ( ix + 1 ) + gridX1 * iy;\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {PlaneGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new PlaneGeometry( data.width, data.height, data.widthSegments, data.heightSegments );\n\n\t}\n\n}\n\n/**\n * A class for generating a two-dimensional ring geometry.\n *\n * ```js\n * const geometry = new THREE.RingGeometry( 1, 5, 32 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00, side: THREE.DoubleSide } );\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#RingGeometry\n */\nclass RingGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new ring geometry.\n\t *\n\t * @param {number} [innerRadius=0.5] - The inner radius of the ring.\n\t * @param {number} [outerRadius=1] - The outer radius of the ring.\n\t * @param {number} [thetaSegments=32] - Number of segments. A higher number means the ring will be more round. Minimum is `3`.\n\t * @param {number} [phiSegments=1] - Number of segments per ring segment. Minimum is `1`.\n\t * @param {number} [thetaStart=0] - Starting angle in radians.\n\t * @param {number} [thetaLength=Math.PI*2] - Central angle in radians.\n\t */\n\tconstructor( innerRadius = 0.5, outerRadius = 1, thetaSegments = 32, phiSegments = 1, thetaStart = 0, thetaLength = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'RingGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tinnerRadius: innerRadius,\n\t\t\touterRadius: outerRadius,\n\t\t\tthetaSegments: thetaSegments,\n\t\t\tphiSegments: phiSegments,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\tthetaSegments = Math.max( 3, thetaSegments );\n\t\tphiSegments = Math.max( 1, phiSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// some helper variables\n\n\t\tlet radius = innerRadius;\n\t\tconst radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );\n\t\tconst vertex = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= phiSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= thetaSegments; i ++ ) {\n\n\t\t\t\t// values are generate from the inside of the ring to the outside\n\n\t\t\t\tconst segment = thetaStart + i / thetaSegments * thetaLength;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = radius * Math.cos( segment );\n\t\t\t\tvertex.y = radius * Math.sin( segment );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormals.push( 0, 0, 1 );\n\n\t\t\t\t// uv\n\n\t\t\t\tuv.x = ( vertex.x / outerRadius + 1 ) / 2;\n\t\t\t\tuv.y = ( vertex.y / outerRadius + 1 ) / 2;\n\n\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t}\n\n\t\t\t// increase the radius for next row of vertices\n\n\t\t\tradius += radiusStep;\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let j = 0; j < phiSegments; j ++ ) {\n\n\t\t\tconst thetaSegmentLevel = j * ( thetaSegments + 1 );\n\n\t\t\tfor ( let i = 0; i < thetaSegments; i ++ ) {\n\n\t\t\t\tconst segment = i + thetaSegmentLevel;\n\n\t\t\t\tconst a = segment;\n\t\t\t\tconst b = segment + thetaSegments + 1;\n\t\t\t\tconst c = segment + thetaSegments + 2;\n\t\t\t\tconst d = segment + 1;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {RingGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new RingGeometry( data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * Creates an one-sided polygonal geometry from one or more path shapes.\n *\n * ```js\n * const arcShape = new THREE.Shape()\n *\t.moveTo( 5, 1 )\n *\t.absarc( 1, 1, 4, 0, Math.PI * 2, false );\n *\n * const geometry = new THREE.ShapeGeometry( arcShape );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00, side: THREE.DoubleSide } );\n * const mesh = new THREE.Mesh( geometry, material ) ;\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#ShapeGeometry\n */\nclass ShapeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new shape geometry.\n\t *\n\t * @param {Shape|Array<Shape>} [shapes] - A shape or an array of shapes.\n\t * @param {number} [curveSegments=12] - Number of segments per shape.\n\t */\n\tconstructor( shapes = new Shape( [ new Vector2( 0, 0.5 ), new Vector2( -0.5, -0.5 ), new Vector2( 0.5, -0.5 ) ] ), curveSegments = 12 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ShapeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tshapes: shapes,\n\t\t\tcurveSegments: curveSegments\n\t\t};\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tlet groupStart = 0;\n\t\tlet groupCount = 0;\n\n\t\t// allow single and array values for \"shapes\" parameter\n\n\t\tif ( Array.isArray( shapes ) === false ) {\n\n\t\t\taddShape( shapes );\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0; i < shapes.length; i ++ ) {\n\n\t\t\t\taddShape( shapes[ i ] );\n\n\t\t\t\tthis.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support\n\n\t\t\t\tgroupStart += groupCount;\n\t\t\t\tgroupCount = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\n\t\t// helper functions\n\n\t\tfunction addShape( shape ) {\n\n\t\t\tconst indexOffset = vertices.length / 3;\n\t\t\tconst points = shape.extractPoints( curveSegments );\n\n\t\t\tlet shapeVertices = points.shape;\n\t\t\tconst shapeHoles = points.holes;\n\n\t\t\t// check direction of vertices\n\n\t\t\tif ( ShapeUtils.isClockWise( shapeVertices ) === false ) {\n\n\t\t\t\tshapeVertices = shapeVertices.reverse();\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\n\t\t\t\tif ( ShapeUtils.isClockWise( shapeHole ) === true ) {\n\n\t\t\t\t\tshapeHoles[ i ] = shapeHole.reverse();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );\n\n\t\t\t// join vertices of inner and outer paths to a single array\n\n\t\t\tfor ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {\n\n\t\t\t\tconst shapeHole = shapeHoles[ i ];\n\t\t\t\tshapeVertices = shapeVertices.concat( shapeHole );\n\n\t\t\t}\n\n\t\t\t// vertices, normals, uvs\n\n\t\t\tfor ( let i = 0, l = shapeVertices.length; i < l; i ++ ) {\n\n\t\t\t\tconst vertex = shapeVertices[ i ];\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, 0 );\n\t\t\t\tnormals.push( 0, 0, 1 );\n\t\t\t\tuvs.push( vertex.x, vertex.y ); // world uvs\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tconst face = faces[ i ];\n\n\t\t\t\tconst a = face[ 0 ] + indexOffset;\n\t\t\t\tconst b = face[ 1 ] + indexOffset;\n\t\t\t\tconst c = face[ 2 ] + indexOffset;\n\n\t\t\t\tindices.push( a, b, c );\n\t\t\t\tgroupCount += 3;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tconst shapes = this.parameters.shapes;\n\n\t\treturn toJSON( shapes, data );\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @param {Array<Shape>} shapes - An array of shapes.\n\t * @return {ShapeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data, shapes ) {\n\n\t\tconst geometryShapes = [];\n\n\t\tfor ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {\n\n\t\t\tconst shape = shapes[ data.shapes[ j ] ];\n\n\t\t\tgeometryShapes.push( shape );\n\n\t\t}\n\n\t\treturn new ShapeGeometry( geometryShapes, data.curveSegments );\n\n\t}\n\n}\n\nfunction toJSON( shapes, data ) {\n\n\tdata.shapes = [];\n\n\tif ( Array.isArray( shapes ) ) {\n\n\t\tfor ( let i = 0, l = shapes.length; i < l; i ++ ) {\n\n\t\t\tconst shape = shapes[ i ];\n\n\t\t\tdata.shapes.push( shape.uuid );\n\n\t\t}\n\n\t} else {\n\n\t\tdata.shapes.push( shapes.uuid );\n\n\t}\n\n\treturn data;\n\n}\n\n/**\n * A class for generating a sphere geometry.\n *\n * ```js\n * const geometry = new THREE.SphereGeometry( 15, 32, 16 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const sphere = new THREE.Mesh( geometry, material );\n * scene.add( sphere );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#SphereGeometry\n */\nclass SphereGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new sphere geometry.\n\t *\n\t * @param {number} [radius=1] - The sphere radius.\n\t * @param {number} [widthSegments=32] - The number of horizontal segments. Minimum value is `3`.\n\t * @param {number} [heightSegments=16] - The number of vertical segments. Minimum value is `2`.\n\t * @param {number} [phiStart=0] - The horizontal starting angle in radians.\n\t * @param {number} [phiLength=Math.PI*2] - The horizontal sweep angle size.\n\t * @param {number} [thetaStart=0] - The vertical starting angle in radians.\n\t * @param {number} [thetaLength=Math.PI] - The vertical sweep angle size.\n\t */\n\tconstructor( radius = 1, widthSegments = 32, heightSegments = 16, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'SphereGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments,\n\t\t\tphiStart: phiStart,\n\t\t\tphiLength: phiLength,\n\t\t\tthetaStart: thetaStart,\n\t\t\tthetaLength: thetaLength\n\t\t};\n\n\t\twidthSegments = Math.max( 3, Math.floor( widthSegments ) );\n\t\theightSegments = Math.max( 2, Math.floor( heightSegments ) );\n\n\t\tconst thetaEnd = Math.min( thetaStart + thetaLength, Math.PI );\n\n\t\tlet index = 0;\n\t\tconst grid = [];\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let iy = 0; iy <= heightSegments; iy ++ ) {\n\n\t\t\tconst verticesRow = [];\n\n\t\t\tconst v = iy / heightSegments;\n\n\t\t\t// special case for the poles\n\n\t\t\tlet uOffset = 0;\n\n\t\t\tif ( iy === 0 && thetaStart === 0 ) {\n\n\t\t\t\tuOffset = 0.5 / widthSegments;\n\n\t\t\t} else if ( iy === heightSegments && thetaEnd === Math.PI ) {\n\n\t\t\t\tuOffset = -0.5 / widthSegments;\n\n\t\t\t}\n\n\t\t\tfor ( let ix = 0; ix <= widthSegments; ix ++ ) {\n\n\t\t\t\tconst u = ix / widthSegments;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\t\t\t\tvertex.y = radius * Math.cos( thetaStart + v * thetaLength );\n\t\t\t\tvertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.copy( vertex ).normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u + uOffset, 1 - v );\n\n\t\t\t\tverticesRow.push( index ++ );\n\n\t\t\t}\n\n\t\t\tgrid.push( verticesRow );\n\n\t\t}\n\n\t\t// indices\n\n\t\tfor ( let iy = 0; iy < heightSegments; iy ++ ) {\n\n\t\t\tfor ( let ix = 0; ix < widthSegments; ix ++ ) {\n\n\t\t\t\tconst a = grid[ iy ][ ix + 1 ];\n\t\t\t\tconst b = grid[ iy ][ ix ];\n\t\t\t\tconst c = grid[ iy + 1 ][ ix ];\n\t\t\t\tconst d = grid[ iy + 1 ][ ix + 1 ];\n\n\t\t\t\tif ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );\n\t\t\t\tif ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {SphereGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new SphereGeometry( data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing an tetrahedron.\n *\n * ```js\n * const geometry = new THREE.TetrahedronGeometry();\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const tetrahedron = new THREE.Mesh( geometry, material );\n * scene.add( tetrahedron );\n * ```\n *\n * @augments PolyhedronGeometry\n * @demo scenes/geometry-browser.html#TetrahedronGeometry\n */\nclass TetrahedronGeometry extends PolyhedronGeometry {\n\n\t/**\n\t * Constructs a new tetrahedron geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the tetrahedron.\n\t * @param {number} [detail=0] - Setting this to a value greater than `0` adds vertices making it no longer a tetrahedron.\n\t */\n\tconstructor( radius = 1, detail = 0 ) {\n\n\t\tconst vertices = [\n\t\t\t1, 1, 1, \t-1, -1, 1, \t-1, 1, -1, \t1, -1, -1\n\t\t];\n\n\t\tconst indices = [\n\t\t\t2, 1, 0, \t0, 3, 2,\t1, 3, 0,\t2, 3, 1\n\t\t];\n\n\t\tsuper( vertices, indices, radius, detail );\n\n\t\tthis.type = 'TetrahedronGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\tdetail: detail\n\t\t};\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TetrahedronGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new TetrahedronGeometry( data.radius, data.detail );\n\n\t}\n\n}\n\n/**\n * A geometry class for representing an torus.\n *\n * ```js\n * const geometry = new THREE.TorusGeometry( 10, 3, 16, 100 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const torus = new THREE.Mesh( geometry, material );\n * scene.add( torus );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#TorusGeometry\n */\nclass TorusGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new torus geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the torus, from the center of the torus to the center of the tube.\n\t * @param {number} [tube=0.4] - Radius of the tube. Must be smaller than `radius`.\n\t * @param {number} [radialSegments=12] - The number of radial segments.\n\t * @param {number} [tubularSegments=48] - The number of tubular segments.\n\t * @param {number} [arc=Math.PI*2] - Central angle in radians.\n\t */\n\tconstructor( radius = 1, tube = 0.4, radialSegments = 12, tubularSegments = 48, arc = Math.PI * 2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TorusGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\tradialSegments: radialSegments,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tarc: arc\n\t\t};\n\n\t\tradialSegments = Math.floor( radialSegments );\n\t\ttubularSegments = Math.floor( tubularSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst center = new Vector3();\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tconst u = i / tubularSegments * arc;\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );\n\t\t\t\tvertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );\n\t\t\t\tvertex.z = tube * Math.sin( v );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal\n\n\t\t\t\tcenter.x = radius * Math.cos( u );\n\t\t\t\tcenter.y = radius * Math.sin( u );\n\t\t\t\tnormal.subVectors( vertex, center ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= radialSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= tubularSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( tubularSegments + 1 ) * j + i - 1;\n\t\t\t\tconst b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;\n\t\t\t\tconst c = ( tubularSegments + 1 ) * ( j - 1 ) + i;\n\t\t\t\tconst d = ( tubularSegments + 1 ) * j + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TorusGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusGeometry( data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc );\n\n\t}\n\n}\n\n/**\n * Creates a torus knot, the particular shape of which is defined by a pair\n * of coprime integers, p and q. If p and q are not coprime, the result will\n * be a torus link.\n *\n * ```js\n * const geometry = new THREE.TorusKnotGeometry( 10, 3, 100, 16 );\n * const material = new THREE.MeshBasicMaterial( { color: 0xffff00 } );\n * const torusKnot = new THREE.Mesh( geometry, material );\n * scene.add( torusKnot );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#TorusKnotGeometry\n */\nclass TorusKnotGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new torus knot geometry.\n\t *\n\t * @param {number} [radius=1] - Radius of the torus knot.\n\t * @param {number} [tube=0.4] - Radius of the tube.\n\t * @param {number} [tubularSegments=64] - The number of tubular segments.\n\t * @param {number} [radialSegments=8] - The number of radial segments.\n\t * @param {number} [p=2] - This value determines, how many times the geometry winds around its axis of rotational symmetry.\n\t * @param {number} [q=3] - This value determines, how many times the geometry winds around a circle in the interior of the torus.\n\t */\n\tconstructor( radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TorusKnotGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tradius: radius,\n\t\t\ttube: tube,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradialSegments: radialSegments,\n\t\t\tp: p,\n\t\t\tq: q\n\t\t};\n\n\t\ttubularSegments = Math.floor( tubularSegments );\n\t\tradialSegments = Math.floor( radialSegments );\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\tconst P1 = new Vector3();\n\t\tconst P2 = new Vector3();\n\n\t\tconst B = new Vector3();\n\t\tconst T = new Vector3();\n\t\tconst N = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tfor ( let i = 0; i <= tubularSegments; ++ i ) {\n\n\t\t\t// the radian \"u\" is used to calculate the position on the torus curve of the current tubular segment\n\n\t\t\tconst u = i / tubularSegments * p * Math.PI * 2;\n\n\t\t\t// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.\n\t\t\t// these points are used to create a special \"coordinate space\", which is necessary to calculate the correct vertex positions\n\n\t\t\tcalculatePositionOnCurve( u, p, q, radius, P1 );\n\t\t\tcalculatePositionOnCurve( u + 0.01, p, q, radius, P2 );\n\n\t\t\t// calculate orthonormal basis\n\n\t\t\tT.subVectors( P2, P1 );\n\t\t\tN.addVectors( P2, P1 );\n\t\t\tB.crossVectors( T, N );\n\t\t\tN.crossVectors( B, T );\n\n\t\t\t// normalize B, N. T can be ignored, we don't use it\n\n\t\t\tB.normalize();\n\t\t\tN.normalize();\n\n\t\t\tfor ( let j = 0; j <= radialSegments; ++ j ) {\n\n\t\t\t\t// now calculate the vertices. they are nothing more than an extrusion of the torus curve.\n\t\t\t\t// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\t\t\t\tconst cx = - tube * Math.cos( v );\n\t\t\t\tconst cy = tube * Math.sin( v );\n\n\t\t\t\t// now calculate the final vertex position.\n\t\t\t\t// first we orient the extrusion with our basis vectors, then we add it to the current position on the curve\n\n\t\t\t\tvertex.x = P1.x + ( cx * N.x + cy * B.x );\n\t\t\t\tvertex.y = P1.y + ( cx * N.y + cy * B.y );\n\t\t\t\tvertex.z = P1.z + ( cx * N.z + cy * B.z );\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)\n\n\t\t\t\tnormal.subVectors( vertex, P1 ).normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( i / tubularSegments );\n\t\t\t\tuvs.push( j / radialSegments );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t// indices\n\n\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t// faces\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// this function calculates the current position on the torus curve\n\n\t\tfunction calculatePositionOnCurve( u, p, q, radius, position ) {\n\n\t\t\tconst cu = Math.cos( u );\n\t\t\tconst su = Math.sin( u );\n\t\t\tconst quOverP = q / p * u;\n\t\t\tconst cs = Math.cos( quOverP );\n\n\t\t\tposition.x = radius * ( 2 + cs ) * 0.5 * cu;\n\t\t\tposition.y = radius * ( 2 + cs ) * su * 0.5;\n\t\t\tposition.z = radius * Math.sin( quOverP ) * 0.5;\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TorusKnotGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new TorusKnotGeometry( data.radius, data.tube, data.tubularSegments, data.radialSegments, data.p, data.q );\n\n\t}\n\n}\n\n/**\n * Creates a tube that extrudes along a 3D curve.\n *\n * ```js\n * class CustomSinCurve extends THREE.Curve {\n *\n * \tgetPoint( t, optionalTarget = new THREE.Vector3() ) {\n *\n * \t\tconst tx = t * 3 - 1.5;\n * \t\tconst ty = Math.sin( 2 * Math.PI * t );\n * \t\tconst tz = 0;\n *\n * \t\treturn optionalTarget.set( tx, ty, tz );\n * \t}\n *\n * }\n *\n * const path = new CustomSinCurve( 10 );\n * const geometry = new THREE.TubeGeometry( path, 20, 2, 8, false );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @demo scenes/geometry-browser.html#TubeGeometry\n */\nclass TubeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new tube geometry.\n\t *\n\t * @param {Curve} [path=QuadraticBezierCurve3] - A 3D curve defining the path of the tube.\n\t * @param {number} [tubularSegments=64] - The number of segments that make up the tube.\n\t * @param {number} [radius=1] -The radius of the tube.\n\t * @param {number} [radialSegments=8] - The number of segments that make up the cross-section.\n\t * @param {boolean} [closed=false] - Whether the tube is closed or not.\n\t */\n\tconstructor( path = new QuadraticBezierCurve3( new Vector3( -1, -1, 0 ), new Vector3( -1, 1, 0 ), new Vector3( 1, 1, 0 ) ), tubularSegments = 64, radius = 1, radialSegments = 8, closed = false ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'TubeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tpath: path,\n\t\t\ttubularSegments: tubularSegments,\n\t\t\tradius: radius,\n\t\t\tradialSegments: radialSegments,\n\t\t\tclosed: closed\n\t\t};\n\n\t\tconst frames = path.computeFrenetFrames( tubularSegments, closed );\n\n\t\t// expose internals\n\n\t\tthis.tangents = frames.tangents;\n\t\tthis.normals = frames.normals;\n\t\tthis.binormals = frames.binormals;\n\n\t\t// helper variables\n\n\t\tconst vertex = new Vector3();\n\t\tconst normal = new Vector3();\n\t\tconst uv = new Vector2();\n\t\tlet P = new Vector3();\n\n\t\t// buffer\n\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\t\tconst indices = [];\n\n\t\t// create buffer data\n\n\t\tgenerateBufferData();\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// functions\n\n\t\tfunction generateBufferData() {\n\n\t\t\tfor ( let i = 0; i < tubularSegments; i ++ ) {\n\n\t\t\t\tgenerateSegment( i );\n\n\t\t\t}\n\n\t\t\t// if the geometry is not closed, generate the last row of vertices and normals\n\t\t\t// at the regular position on the given path\n\t\t\t//\n\t\t\t// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)\n\n\t\t\tgenerateSegment( ( closed === false ) ? tubularSegments : 0 );\n\n\t\t\t// uvs are generated in a separate function.\n\t\t\t// this makes it easy compute correct values for closed geometries\n\n\t\t\tgenerateUVs();\n\n\t\t\t// finally create faces\n\n\t\t\tgenerateIndices();\n\n\t\t}\n\n\t\tfunction generateSegment( i ) {\n\n\t\t\t// we use getPointAt to sample evenly distributed points from the given path\n\n\t\t\tP = path.getPointAt( i / tubularSegments, P );\n\n\t\t\t// retrieve corresponding normal and binormal\n\n\t\t\tconst N = frames.normals[ i ];\n\t\t\tconst B = frames.binormals[ i ];\n\n\t\t\t// generate normals and vertices for the current segment\n\n\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\tconst v = j / radialSegments * Math.PI * 2;\n\n\t\t\t\tconst sin = Math.sin( v );\n\t\t\t\tconst cos = - Math.cos( v );\n\n\t\t\t\t// normal\n\n\t\t\t\tnormal.x = ( cos * N.x + sin * B.x );\n\t\t\t\tnormal.y = ( cos * N.y + sin * B.y );\n\t\t\t\tnormal.z = ( cos * N.z + sin * B.z );\n\t\t\t\tnormal.normalize();\n\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// vertex\n\n\t\t\t\tvertex.x = P.x + radius * normal.x;\n\t\t\t\tvertex.y = P.y + radius * normal.y;\n\t\t\t\tvertex.z = P.z + radius * normal.z;\n\n\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateIndices() {\n\n\t\t\tfor ( let j = 1; j <= tubularSegments; j ++ ) {\n\n\t\t\t\tfor ( let i = 1; i <= radialSegments; i ++ ) {\n\n\t\t\t\t\tconst a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );\n\t\t\t\t\tconst b = ( radialSegments + 1 ) * j + ( i - 1 );\n\t\t\t\t\tconst c = ( radialSegments + 1 ) * j + i;\n\t\t\t\t\tconst d = ( radialSegments + 1 ) * ( j - 1 ) + i;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tindices.push( a, b, d );\n\t\t\t\t\tindices.push( b, c, d );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction generateUVs() {\n\n\t\t\tfor ( let i = 0; i <= tubularSegments; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j <= radialSegments; j ++ ) {\n\n\t\t\t\t\tuv.x = i / tubularSegments;\n\t\t\t\t\tuv.y = j / radialSegments;\n\n\t\t\t\t\tuvs.push( uv.x, uv.y );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.path = this.parameters.path.toJSON();\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @return {TubeGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\t// This only works for built-in curves (e.g. CatmullRomCurve3).\n\t\t// User defined curves or instances of CurvePath will not be deserialized.\n\t\treturn new TubeGeometry(\n\t\t\tnew Curves[ data.path.type ]().fromJSON( data.path ),\n\t\t\tdata.tubularSegments,\n\t\t\tdata.radius,\n\t\t\tdata.radialSegments,\n\t\t\tdata.closed\n\t\t);\n\n\t}\n\n}\n\n/**\n * Can be used as a helper object to visualize a geometry as a wireframe.\n *\n * ```js\n * const geometry = new THREE.SphereGeometry();\n *\n * const wireframe = new THREE.WireframeGeometry( geometry );\n *\n * const line = new THREE.LineSegments( wireframe );\n * line.material.depthWrite = false;\n * line.material.opacity = 0.25;\n * line.material.transparent = true;\n *\n * scene.add( line );\n * ```\n *\n * Note: It is not yet possible to serialize/deserialize instances of this class.\n *\n * @augments BufferGeometry\n */\nclass WireframeGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new wireframe geometry.\n\t *\n\t * @param {?BufferGeometry} [geometry=null] - The geometry.\n\t */\n\tconstructor( geometry = null ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'WireframeGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tgeometry: geometry\n\t\t};\n\n\t\tif ( geometry !== null ) {\n\n\t\t\t// buffer\n\n\t\t\tconst vertices = [];\n\t\t\tconst edges = new Set();\n\n\t\t\t// helper variables\n\n\t\t\tconst start = new Vector3();\n\t\t\tconst end = new Vector3();\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\t\t\t\tconst indices = geometry.index;\n\t\t\t\tlet groups = geometry.groups;\n\n\t\t\t\tif ( groups.length === 0 ) {\n\n\t\t\t\t\tgroups = [ { start: 0, count: indices.count, materialIndex: 0 } ];\n\n\t\t\t\t}\n\n\t\t\t\t// create a data structure that contains all edges without duplicates\n\n\t\t\t\tfor ( let o = 0, ol = groups.length; o < ol; ++ o ) {\n\n\t\t\t\t\tconst group = groups[ o ];\n\n\t\t\t\t\tconst groupStart = group.start;\n\t\t\t\t\tconst groupCount = group.count;\n\n\t\t\t\t\tfor ( let i = groupStart, l = ( groupStart + groupCount ); i < l; i += 3 ) {\n\n\t\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tconst index1 = indices.getX( i + j );\n\t\t\t\t\t\t\tconst index2 = indices.getX( i + ( j + 1 ) % 3 );\n\n\t\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tconst position = geometry.attributes.position;\n\n\t\t\t\tfor ( let i = 0, l = ( position.count / 3 ); i < l; i ++ ) {\n\n\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t// three edges per triangle, an edge is represented as (index1, index2)\n\t\t\t\t\t\t// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)\n\n\t\t\t\t\t\tconst index1 = 3 * i + j;\n\t\t\t\t\t\tconst index2 = 3 * i + ( ( j + 1 ) % 3 );\n\n\t\t\t\t\t\tstart.fromBufferAttribute( position, index1 );\n\t\t\t\t\t\tend.fromBufferAttribute( position, index2 );\n\n\t\t\t\t\t\tif ( isUniqueEdge( start, end, edges ) === true ) {\n\n\t\t\t\t\t\t\tvertices.push( start.x, start.y, start.z );\n\t\t\t\t\t\t\tvertices.push( end.x, end.y, end.z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// build geometry\n\n\t\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction isUniqueEdge( start, end, edges ) {\n\n\tconst hash1 = `${start.x},${start.y},${start.z}-${end.x},${end.y},${end.z}`;\n\tconst hash2 = `${end.x},${end.y},${end.z}-${start.x},${start.y},${start.z}`; // coincident edge\n\n\tif ( edges.has( hash1 ) === true || edges.has( hash2 ) === true ) {\n\n\t\treturn false;\n\n\t} else {\n\n\t\tedges.add( hash1 );\n\t\tedges.add( hash2 );\n\t\treturn true;\n\n\t}\n\n}\n\nvar Geometries = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tBoxGeometry: BoxGeometry,\n\tCapsuleGeometry: CapsuleGeometry,\n\tCircleGeometry: CircleGeometry,\n\tConeGeometry: ConeGeometry,\n\tCylinderGeometry: CylinderGeometry,\n\tDodecahedronGeometry: DodecahedronGeometry,\n\tEdgesGeometry: EdgesGeometry,\n\tExtrudeGeometry: ExtrudeGeometry,\n\tIcosahedronGeometry: IcosahedronGeometry,\n\tLatheGeometry: LatheGeometry,\n\tOctahedronGeometry: OctahedronGeometry,\n\tPlaneGeometry: PlaneGeometry,\n\tPolyhedronGeometry: PolyhedronGeometry,\n\tRingGeometry: RingGeometry,\n\tShapeGeometry: ShapeGeometry,\n\tSphereGeometry: SphereGeometry,\n\tTetrahedronGeometry: TetrahedronGeometry,\n\tTorusGeometry: TorusGeometry,\n\tTorusKnotGeometry: TorusKnotGeometry,\n\tTubeGeometry: TubeGeometry,\n\tWireframeGeometry: WireframeGeometry\n});\n\n/**\n * This material can receive shadows, but otherwise is completely transparent.\n *\n * ```js\n * const geometry = new THREE.PlaneGeometry( 2000, 2000 );\n * geometry.rotateX( - Math.PI / 2 );\n *\n * const material = new THREE.ShadowMaterial();\n * material.opacity = 0.2;\n *\n * const plane = new THREE.Mesh( geometry, material );\n * plane.position.y = -200;\n * plane.receiveShadow = true;\n * scene.add( plane );\n * ```\n *\n * @augments Material\n */\nclass ShadowMaterial extends Material {\n\n\t/**\n\t * Constructs a new shadow material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isShadowMaterial = true;\n\n\t\tthis.type = 'ShadowMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.color = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Overwritten since shadow materials are transparent\n\t\t * by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.transparent = true;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This class works just like {@link ShaderMaterial}, except that definitions\n * of built-in uniforms and attributes are not automatically prepended to the\n * GLSL shader code.\n *\n * `RawShaderMaterial` can only be used with {@link WebGLRenderer}.\n *\n * @augments ShaderMaterial\n */\nclass RawShaderMaterial extends ShaderMaterial {\n\n\t/**\n\t * Constructs a new raw shader material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper( parameters );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRawShaderMaterial = true;\n\n\t\tthis.type = 'RawShaderMaterial';\n\n\t}\n\n}\n\n/**\n * A standard physically based material, using Metallic-Roughness workflow.\n *\n * Physically based rendering (PBR) has recently become the standard in many\n * 3D applications, such as [Unity](https://blogs.unity3d.com/2014/10/29/physically-based-shading-in-unity-5-a-primer/),\n * [Unreal](https://docs.unrealengine.com/latest/INT/Engine/Rendering/Materials/PhysicallyBased/) and\n * [3D Studio Max](http://area.autodesk.com/blogs/the-3ds-max-blog/what039s-new-for-rendering-in-3ds-max-2017).\n *\n * This approach differs from older approaches in that instead of using\n * approximations for the way in which light interacts with a surface, a\n * physically correct model is used. The idea is that, instead of tweaking\n * materials to look good under specific lighting, a material can be created\n * that will react 'correctly' under all lighting scenarios.\n *\n * In practice this gives a more accurate and realistic looking result than\n * the {@link MeshLambertMaterial} or {@link MeshPhongMaterial}, at the cost of\n * being somewhat more computationally expensive. `MeshStandardMaterial` uses per-fragment\n * shading.\n *\n * Note that for best results you should always specify an environment map when using this material.\n *\n * For a non-technical introduction to the concept of PBR and how to set up a\n * PBR material, check out these articles by the people at [marmoset](https://www.marmoset.co):\n *\n * - [Basic Theory of Physically Based Rendering](https://www.marmoset.co/posts/basic-theory-of-physically-based-rendering/)\n * - [Physically Based Rendering and You Can Too](https://www.marmoset.co/posts/physically-based-rendering-and-you-can-too/)\n *\n * Technical details of the approach used in three.js (and most other PBR systems) can be found is this\n * [paper from Disney](https://media.disneyanimation.com/uploads/production/publication_asset/48/asset/s2012_pbs_disney_brdf_notes_v3.pdf)\n * (pdf), by Brent Burley.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshStandardMaterial\n */\nclass MeshStandardMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh standard material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshStandardMaterial = true;\n\n\t\tthis.type = 'MeshStandardMaterial';\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * How rough the material appears. `0.0` means a smooth mirror reflection, `1.0`\n\t\t * means fully diffuse. If `roughnessMap` is also provided,\n\t\t * both values are multiplied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.roughness = 1.0;\n\n\t\t/**\n\t\t * How much the material is like a metal. Non-metallic materials such as wood\n\t\t * or stone use `0.0`, metallic use `1.0`, with nothing (usually) in between.\n\t\t * A value between `0.0` and `1.0` could be used for a rusty metal look.\n\t\t * If `metalnessMap` is also provided, both values are multiplied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.metalness = 0.0;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The green channel of this texture is used to alter the roughness of the\n\t\t * material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.roughnessMap = null;\n\n\t\t/**\n\t\t * The blue channel of this texture is used to alter the metalness of the\n\t\t * material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.metalnessMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map. To ensure a physically correct rendering, environment maps\n\t\t * are internally pre-processed with {@link PMREMGenerator}.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * Scales the effect of the environment map by multiplying its color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.envMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = { 'STANDARD': '' };\n\n\t\tthis.color.copy( source.color );\n\t\tthis.roughness = source.roughness;\n\t\tthis.metalness = source.metalness;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.roughnessMap = source.roughnessMap;\n\n\t\tthis.metalnessMap = source.metalnessMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.envMapIntensity = source.envMapIntensity;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * An extension of the {@link MeshStandardMaterial}, providing more advanced\n * physically-based rendering properties:\n *\n * - Anisotropy: Ability to represent the anisotropic property of materials\n * as observable with brushed metals.\n * - Clearcoat: Some materials \u2014 like car paints, carbon fiber, and wet surfaces \u2014 require\n * a clear, reflective layer on top of another layer that may be irregular or rough.\n * Clearcoat approximates this effect, without the need for a separate transparent surface.\n * - Iridescence: Allows to render the effect where hue varies  depending on the viewing\n * angle and illumination angle. This can be seen on soap bubbles, oil films, or on the\n * wings of many insects.\n * - Physically-based transparency: One limitation of {@link Material#opacity} is that highly\n * transparent materials are less reflective. Physically-based transmission provides a more\n * realistic option for thin, transparent surfaces like glass.\n * - Advanced reflectivity: More flexible reflectivity for non-metallic materials.\n * - Sheen: Can be used for representing cloth and fabric materials.\n *\n * As a result of these complex shading features, `MeshPhysicalMaterial` has a\n * higher performance cost, per pixel, than other three.js materials. Most\n * effects are disabled by default, and add cost as they are enabled. For\n * best results, always specify an environment map when using this material.\n *\n * @augments MeshStandardMaterial\n * @demo scenes/material-browser.html#MeshPhysicalMaterial\n */\nclass MeshPhysicalMaterial extends MeshStandardMaterial {\n\n\t/**\n\t * Constructs a new mesh physical material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshPhysicalMaterial = true;\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.type = 'MeshPhysicalMaterial';\n\n\t\t/**\n\t\t * The rotation of the anisotropy in tangent, bitangent space, measured in radians\n\t\t * counter-clockwise from the tangent. When `anisotropyMap` is present, this\n\t\t * property provides additional rotation to the vectors in the texture.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.anisotropyRotation = 0;\n\n\t\t/**\n\t\t * Red and green channels represent the anisotropy direction in `[-1, 1]` tangent,\n\t\t * bitangent space, to be rotated by `anisotropyRotation`. The blue channel\n\t\t * contains strength as `[0, 1]` to be multiplied by `anisotropy`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.anisotropyMap = null;\n\n\t\t/**\n\t\t * The red channel of this texture is multiplied against `clearcoat`,\n\t\t * for per-pixel control over a coating's intensity.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatMap = null;\n\n\t\t/**\n\t\t * Roughness of the clear coat layer, from `0.0` to `1.0`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.clearcoatRoughness = 0.0;\n\n\t\t/**\n\t\t * The green channel of this texture is multiplied against\n\t\t * `clearcoatRoughness`, for per-pixel control over a coating's roughness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatRoughnessMap = null;\n\n\t\t/**\n\t\t * How much `clearcoatNormalMap` affects the clear coat layer, from\n\t\t * `(0,0)` to `(1,1)`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.clearcoatNormalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * Can be used to enable independent normals for the clear coat layer.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatNormalMap = null;\n\n\t\t/**\n\t\t * Index-of-refraction for non-metallic materials, from `1.0` to `2.333`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1.5\n\t\t */\n\t\tthis.ior = 1.5;\n\n\t\t/**\n\t\t * Degree of reflectivity, from `0.0` to `1.0`. Default is `0.5`, which\n\t\t * corresponds to an index-of-refraction of `1.5`.\n\t\t *\n\t\t * This models the reflectivity of non-metallic materials. It has no effect\n\t\t * when `metalness` is `1.0`\n\t\t *\n\t\t * @name MeshPhysicalMaterial#reflectivity\n\t\t * @type {number}\n\t\t * @default 0.5\n\t\t */\n\t\tObject.defineProperty( this, 'reflectivity', {\n\t\t\tget: function () {\n\n\t\t\t\treturn ( clamp( 2.5 * ( this.ior - 1 ) / ( this.ior + 1 ), 0, 1 ) );\n\n\t\t\t},\n\t\t\tset: function ( reflectivity ) {\n\n\t\t\t\tthis.ior = ( 1 + 0.4 * reflectivity ) / ( 1 - 0.4 * reflectivity );\n\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * The red channel of this texture is multiplied against `iridescence`, for per-pixel\n\t\t * control over iridescence.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.iridescenceMap = null;\n\n\t\t/**\n\t\t * Strength of the iridescence RGB color shift effect, represented by an index-of-refraction.\n\t\t * Between `1.0` to `2.333`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1.3\n\t\t */\n\t\tthis.iridescenceIOR = 1.3;\n\n\t\t/**\n\t\t *Array of exactly 2 elements, specifying minimum and maximum thickness of the iridescence layer.\n\t\t Thickness of iridescence layer has an equivalent effect of the one `thickness` has on `ior`.\n\t\t *\n\t\t * @type {Array<number,number>}\n\t\t * @default [100,400]\n\t\t */\n\t\tthis.iridescenceThicknessRange = [ 100, 400 ];\n\n\t\t/**\n\t\t * A texture that defines the thickness of the iridescence layer, stored in the green channel.\n\t\t * Minimum and maximum values of thickness are defined by `iridescenceThicknessRange` array:\n\t\t * - `0.0` in the green channel will result in thickness equal to first element of the array.\n\t\t * - `1.0` in the green channel will result in thickness equal to second element of the array.\n\t\t * - Values in-between will linearly interpolate between the elements of the array.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.iridescenceThicknessMap = null;\n\n\t\t/**\n\t\t * The sheen tint.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.sheenColor = new Color( 0x000000 );\n\n\t\t/**\n\t\t * The RGB channels of this texture are multiplied against  `sheenColor`, for per-pixel control\n\t\t * over sheen tint.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.sheenColorMap = null;\n\n\t\t/**\n\t\t * Roughness of the sheen layer, from `0.0` to `1.0`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.sheenRoughness = 1.0;\n\n\t\t/**\n\t\t * The alpha channel of this texture is multiplied against `sheenRoughness`, for per-pixel control\n\t\t * over sheen roughness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.sheenRoughnessMap = null;\n\n\t\t/**\n\t\t * The red channel of this texture is multiplied against `transmission`, for per-pixel control over\n\t\t * optical transparency.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.transmissionMap = null;\n\n\t\t/**\n\t\t * The thickness of the volume beneath the surface. The value is given in the\n\t\t * coordinate space of the mesh. If the value is `0` the material is\n\t\t * thin-walled. Otherwise the material is a volume boundary.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.thickness = 0;\n\n\t\t/**\n\t\t * A texture that defines the thickness, stored in the green channel. This will\n\t\t * be multiplied by `thickness`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.thicknessMap = null;\n\n\t\t/**\n\t\t * Density of the medium given as the average distance that light travels in\n\t\t * the medium before interacting with a particle. The value is given in world\n\t\t * space units, and must be greater than zero.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.attenuationDistance = Infinity;\n\n\t\t/**\n\t\t * The color that white light turns into due to absorption when reaching the\n\t\t * attenuation distance.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.attenuationColor = new Color( 1, 1, 1 );\n\n\t\t/**\n\t\t * A float that scales the amount of specular reflection for non-metals only.\n\t\t * When set to zero, the model is effectively Lambertian. From `0.0` to `1.0`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.specularIntensity = 1.0;\n\n\t\t/**\n\t\t * The alpha channel of this texture is multiplied against `specularIntensity`,\n\t\t * for per-pixel control over specular intensity.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularIntensityMap = null;\n\n\t\t/**\n\t\t * Tints the specular reflection at normal incidence for non-metals only.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.specularColor = new Color( 1, 1, 1 );\n\n\t\t/**\n\t\t * The RGB channels of this texture are multiplied against `specularColor`,\n\t\t * for per-pixel control over specular color.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularColorMap = null;\n\n\t\tthis._anisotropy = 0;\n\t\tthis._clearcoat = 0;\n\t\tthis._dispersion = 0;\n\t\tthis._iridescence = 0;\n\t\tthis._sheen = 0.0;\n\t\tthis._transmission = 0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\t/**\n\t * The anisotropy strength, from `0.0` to `1.0`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget anisotropy() {\n\n\t\treturn this._anisotropy;\n\n\t}\n\n\tset anisotropy( value ) {\n\n\t\tif ( this._anisotropy > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._anisotropy = value;\n\n\t}\n\n\t/**\n\t * Represents the intensity of the clear coat layer, from `0.0` to `1.0`. Use\n\t * clear coat related properties to enable multilayer materials that have a\n\t * thin translucent layer over the base layer.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget clearcoat() {\n\n\t\treturn this._clearcoat;\n\n\t}\n\n\tset clearcoat( value ) {\n\n\t\tif ( this._clearcoat > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._clearcoat = value;\n\n\t}\n\t/**\n\t * The intensity of the iridescence layer, simulating RGB color shift based on the angle between\n\t * the surface and the viewer, from `0.0` to `1.0`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget iridescence() {\n\n\t\treturn this._iridescence;\n\n\t}\n\n\tset iridescence( value ) {\n\n\t\tif ( this._iridescence > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._iridescence = value;\n\n\t}\n\n\t/**\n\t * Defines the strength of the angular separation of colors (chromatic aberration) transmitting\n\t * through a relatively clear volume. Any value zero or larger is valid, the typical range of\n\t * realistic values is `[0, 1]`. This property can be only be used with transmissive objects.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget dispersion() {\n\n\t\treturn this._dispersion;\n\n\t}\n\n\tset dispersion( value ) {\n\n\t\tif ( this._dispersion > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._dispersion = value;\n\n\t}\n\n\t/**\n\t * The intensity of the sheen layer, from `0.0` to `1.0`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget sheen() {\n\n\t\treturn this._sheen;\n\n\t}\n\n\tset sheen( value ) {\n\n\t\tif ( this._sheen > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._sheen = value;\n\n\t}\n\n\t/**\n\t * Degree of transmission (or optical transparency), from `0.0` to `1.0`.\n\t *\n\t * Thin, transparent or semitransparent, plastic or glass materials remain\n\t * largely reflective even if they are fully transmissive. The transmission\n\t * property can be used to model these materials.\n\t *\n\t * When transmission is non-zero, `opacity` should be  set to `1`.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget transmission() {\n\n\t\treturn this._transmission;\n\n\t}\n\n\tset transmission( value ) {\n\n\t\tif ( this._transmission > 0 !== value > 0 ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t\tthis._transmission = value;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = {\n\n\t\t\t'STANDARD': '',\n\t\t\t'PHYSICAL': ''\n\n\t\t};\n\n\t\tthis.anisotropy = source.anisotropy;\n\t\tthis.anisotropyRotation = source.anisotropyRotation;\n\t\tthis.anisotropyMap = source.anisotropyMap;\n\n\t\tthis.clearcoat = source.clearcoat;\n\t\tthis.clearcoatMap = source.clearcoatMap;\n\t\tthis.clearcoatRoughness = source.clearcoatRoughness;\n\t\tthis.clearcoatRoughnessMap = source.clearcoatRoughnessMap;\n\t\tthis.clearcoatNormalMap = source.clearcoatNormalMap;\n\t\tthis.clearcoatNormalScale.copy( source.clearcoatNormalScale );\n\n\t\tthis.dispersion = source.dispersion;\n\t\tthis.ior = source.ior;\n\n\t\tthis.iridescence = source.iridescence;\n\t\tthis.iridescenceMap = source.iridescenceMap;\n\t\tthis.iridescenceIOR = source.iridescenceIOR;\n\t\tthis.iridescenceThicknessRange = [ ...source.iridescenceThicknessRange ];\n\t\tthis.iridescenceThicknessMap = source.iridescenceThicknessMap;\n\n\t\tthis.sheen = source.sheen;\n\t\tthis.sheenColor.copy( source.sheenColor );\n\t\tthis.sheenColorMap = source.sheenColorMap;\n\t\tthis.sheenRoughness = source.sheenRoughness;\n\t\tthis.sheenRoughnessMap = source.sheenRoughnessMap;\n\n\t\tthis.transmission = source.transmission;\n\t\tthis.transmissionMap = source.transmissionMap;\n\n\t\tthis.thickness = source.thickness;\n\t\tthis.thicknessMap = source.thicknessMap;\n\t\tthis.attenuationDistance = source.attenuationDistance;\n\t\tthis.attenuationColor.copy( source.attenuationColor );\n\n\t\tthis.specularIntensity = source.specularIntensity;\n\t\tthis.specularIntensityMap = source.specularIntensityMap;\n\t\tthis.specularColor.copy( source.specularColor );\n\t\tthis.specularColorMap = source.specularColorMap;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for shiny surfaces with specular highlights.\n *\n * The material uses a non-physically based [Blinn-Phong](https://en.wikipedia.org/wiki/Blinn-Phong_shading_model)\n * model for calculating reflectance. Unlike the Lambertian model used in the\n * {@link MeshLambertMaterial} this can simulate shiny surfaces with specular\n * highlights (such as varnished wood). `MeshPhongMaterial` uses per-fragment shading.\n *\n * Performance will generally be greater when using this material over the\n * {@link MeshStandardMaterial} or {@link MeshPhysicalMaterial}, at the cost of\n * some graphical accuracy.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshPhongMaterial\n */\nclass MeshPhongMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh phong material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshPhongMaterial = true;\n\n\t\tthis.type = 'MeshPhongMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * Specular color of the material. The default color is set to `0x111111` (very dark grey)\n\t\t *\n\t\t * This defines how shiny the material is and the color of its shine.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.specular = new Color( 0x111111 );\n\n\t\t/**\n\t\t * How shiny the specular highlight is; a higher value gives a sharper highlight.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 30\n\t\t */\n\t\tthis.shininess = 30;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The specular map value affects both how much the specular surface\n\t\t * highlight contributes and how much of the environment map affects the\n\t\t * surface.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * How to combine the result of the surface's color with the environment map, if any.\n\t\t *\n\t\t * When set to `MixOperation`, the {@link MeshBasicMaterial#reflectivity} is used to\n\t\t * blend between the two colors.\n\t\t *\n\t\t * @type {(MultiplyOperation|MixOperation|AddOperation)}\n\t\t * @default MultiplyOperation\n\t\t */\n\t\tthis.combine = MultiplyOperation;\n\n\t\t/**\n\t\t * How much the environment map affects the surface.\n\t\t * The valid range is between `0` (no reflections) and `1` (full reflections).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.reflectivity = 1;\n\n\t\t/**\n\t\t * The index of refraction (IOR) of air (approximately 1) divided by the\n\t\t * index of refraction of the material. It is used with environment mapping\n\t\t * modes {@link CubeRefractionMapping} and {@link EquirectangularRefractionMapping}.\n\t\t * The refraction ratio should not exceed `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.98\n\t\t */\n\t\tthis.refractionRatio = 0.98;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.specular.copy( source.specular );\n\t\tthis.shininess = source.shininess;\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material implementing toon shading.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshToonMaterial\n */\nclass MeshToonMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh toon material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshToonMaterial = true;\n\n\t\tthis.defines = { 'TOON': '' };\n\n\t\tthis.type = 'MeshToonMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff );\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * Gradient map for toon shading. It's required to set\n\t\t * {@link Texture#minFilter} and {@link Texture#magFilter} to {@linkNearestFilter}\n\t\t * when using this type of texture.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.gradientMap = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\t\tthis.gradientMap = source.gradientMap;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material that maps the normal vectors to RGB colors.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshNormalMaterial\n */\nclass MeshNormalMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh normal material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshNormalMaterial = true;\n\n\t\tthis.type = 'MeshNormalMaterial';\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * WebGL and WebGPU ignore this property and always render\n\t\t * 1 pixel wide lines.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for non-shiny surfaces, without specular highlights.\n *\n * The material uses a non-physically based [Lambertian](https://en.wikipedia.org/wiki/Lambertian_reflectance)\n * model for calculating reflectance. This can simulate some surfaces (such\n * as untreated wood or stone) well, but cannot simulate shiny surfaces with\n * specular highlights (such as varnished wood). `MeshLambertMaterial` uses per-fragment\n * shading.\n *\n * Due to the simplicity of the reflectance and illumination models,\n * performance will be greater when using this material over the\n * {@link MeshPhongMaterial}, {@link MeshStandardMaterial} or\n * {@link MeshPhysicalMaterial}, at the cost of some graphical accuracy.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshLambertMaterial\n */\nclass MeshLambertMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh lambert material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshLambertMaterial = true;\n\n\t\tthis.type = 'MeshLambertMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The light map. Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.lightMap = null;\n\n\t\t/**\n\t\t * Intensity of the baked light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightMapIntensity = 1.0;\n\n\t\t/**\n\t\t * The red channel of this texture is used as the ambient occlusion map.\n\t\t * Requires a second set of UVs.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.aoMap = null;\n\n\t\t/**\n\t\t * Intensity of the ambient occlusion effect. Range is `[0,1]`, where `0`\n\t\t * disables ambient occlusion. Where intensity is `1` and the AO map's\n\t\t * red channel is also `1`, ambient light is fully occluded on a surface.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoMapIntensity = 1.0;\n\n\t\t/**\n\t\t * Emissive (light) color of the material, essentially a solid color\n\t\t * unaffected by other lighting.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.emissive = new Color( 0x000000 );\n\n\t\t/**\n\t\t * Intensity of the emissive light. Modulates the emissive color.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.emissiveIntensity = 1.0;\n\n\t\t/**\n\t\t * Set emissive (glow) map. The emissive map color is modulated by the\n\t\t * emissive color and the emissive intensity. If you have an emissive map,\n\t\t * be sure to set the emissive color to something other than black.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveMap = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * Specular map used by the material.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.specularMap = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The environment map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The rotation of the environment map in radians.\n\t\t *\n\t\t * @type {Euler}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.envMapRotation = new Euler();\n\n\t\t/**\n\t\t * How to combine the result of the surface's color with the environment map, if any.\n\t\t *\n\t\t * When set to `MixOperation`, the {@link MeshBasicMaterial#reflectivity} is used to\n\t\t * blend between the two colors.\n\t\t *\n\t\t * @type {(MultiplyOperation|MixOperation|AddOperation)}\n\t\t * @default MultiplyOperation\n\t\t */\n\t\tthis.combine = MultiplyOperation;\n\n\t\t/**\n\t\t * How much the environment map affects the surface.\n\t\t * The valid range is between `0` (no reflections) and `1` (full reflections).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.reflectivity = 1;\n\n\t\t/**\n\t\t * The index of refraction (IOR) of air (approximately 1) divided by the\n\t\t * index of refraction of the material. It is used with environment mapping\n\t\t * modes {@link CubeRefractionMapping} and {@link EquirectangularRefractionMapping}.\n\t\t * The refraction ratio should not exceed `1`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.98\n\t\t */\n\t\tthis.refractionRatio = 0.98;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Defines appearance of wireframe ends.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinecap = 'round';\n\n\t\t/**\n\t\t * Defines appearance of wireframe joints.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {('round'|'bevel'|'miter')}\n\t\t * @default 'round'\n\t\t */\n\t\tthis.wireframeLinejoin = 'round';\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.envMapRotation.copy( source.envMapRotation );\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for drawing geometry by depth. Depth is based off of the camera\n * near and far plane. White is nearest, black is farthest.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshDepthMaterial\n */\nclass MeshDepthMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh depth material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshDepthMaterial = true;\n\n\t\tthis.type = 'MeshDepthMaterial';\n\n\t\t/**\n\t\t * Type for depth packing.\n\t\t *\n\t\t * @type {(BasicDepthPacking|RGBADepthPacking|RGBDepthPacking|RGDepthPacking)}\n\t\t * @default BasicDepthPacking\n\t\t */\n\t\tthis.depthPacking = BasicDepthPacking;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * WebGL and WebGPU ignore this property and always render\n\t\t * 1 pixel wide lines.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.depthPacking = source.depthPacking;\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material used internally for implementing shadow mapping with\n * point lights.\n *\n * Can also be used to customize the shadow casting of an object by assigning\n * an instance of `MeshDistanceMaterial` to {@link Object3D#customDistanceMaterial}.\n * The following examples demonstrates this approach in order to ensure\n * transparent parts of objects do not cast shadows.\n *\n * @augments Material\n */\nclass MeshDistanceMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh distance material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshDistanceMaterial = true;\n\n\t\tthis.type = 'MeshDistanceMaterial';\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.map = source.map;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This material is defined by a MatCap (or Lit Sphere) texture, which encodes the\n * material color and shading.\n *\n * `MeshMatcapMaterial` does not respond to lights since the matcap image file encodes\n * baked lighting. It will cast a shadow onto an object that receives shadows\n * (and shadow clipping works), but it will not self-shadow or receive\n * shadows.\n *\n * @augments Material\n * @demo scenes/material-browser.html#MeshMatcapMaterial\n */\nclass MeshMatcapMaterial extends Material {\n\n\t/**\n\t * Constructs a new mesh matcap material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshMatcapMaterial = true;\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.type = 'MeshMatcapMaterial';\n\n\t\t/**\n\t\t * Color of the material.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = new Color( 0xffffff ); // diffuse\n\n\t\t/**\n\t\t * The matcap map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.matcap = null;\n\n\t\t/**\n\t\t * The color map. May optionally include an alpha channel, typically combined\n\t\t * with {@link Material#transparent} or {@link Material#alphaTest}. The texture map\n\t\t * color is modulated by the diffuse `color`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The texture to create a bump map. The black and white values map to the\n\t\t * perceived depth in relation to the lights. Bump doesn't actually affect\n\t\t * the geometry of the object, only the lighting. If a normal map is defined\n\t\t * this will be ignored.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.bumpMap = null;\n\n\t\t/**\n\t\t * How much the bump map affects the material. Typical range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.bumpScale = 1;\n\n\t\t/**\n\t\t * The texture to create a normal map. The RGB values affect the surface\n\t\t * normal for each pixel fragment and change the way the color is lit. Normal\n\t\t * maps do not change the actual shape of the surface, only the lighting. In\n\t\t * case the material has a normal map authored using the left handed\n\t\t * convention, the `y` component of `normalScale` should be negated to compensate\n\t\t * for the different handedness.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.normalMap = null;\n\n\t\t/**\n\t\t * The type of normal map.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * How much the normal map affects the material. Typical value range is `[0,1]`.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (1,1)\n\t\t */\n\t\tthis.normalScale = new Vector2( 1, 1 );\n\n\t\t/**\n\t\t * The displacement map affects the position of the mesh's vertices. Unlike\n\t\t * other maps which only affect the light and shade of the material the\n\t\t * displaced vertices can cast shadows, block other objects, and otherwise\n\t\t * act as real geometry. The displacement texture is an image where the value\n\t\t * of each pixel (white being the highest) is mapped against, and\n\t\t * repositions, the vertices of the mesh.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.displacementMap = null;\n\n\t\t/**\n\t\t * How much the displacement map affects the mesh (where black is no\n\t\t * displacement, and white is maximum displacement). Without a displacement\n\t\t * map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementScale = 1;\n\n\t\t/**\n\t\t * The offset of the displacement map's values on the mesh's vertices.\n\t\t * The bias is added to the scaled sample of the displacement map.\n\t\t * Without a displacement map set, this value is not applied.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.displacementBias = 0;\n\n\t\t/**\n\t\t * The alpha map is a grayscale texture that controls the opacity across the\n\t\t * surface (black: fully transparent; white: fully opaque).\n\t\t *\n\t\t * Only the color of the texture is used, ignoring the alpha channel if one\n\t\t * exists. For RGB and RGBA textures, the renderer will use the green channel\n\t\t * when sampling this texture due to the extra bit of precision provided for\n\t\t * green in DXT-compressed and uncompressed RGB 565 formats. Luminance-only and\n\t\t * luminance/alpha textures will also still work as expected.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaMap = null;\n\n\t\t/**\n\t\t * Renders the geometry as a wireframe.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.wireframe = false;\n\n\t\t/**\n\t\t * Controls the thickness of the wireframe.\n\t\t *\n\t\t * Can only be used with {@link SVGRenderer}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.wireframeLinewidth = 1;\n\n\t\t/**\n\t\t * Whether the material is rendered with flat shading or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.flatShading = false;\n\n\t\t/**\n\t\t * Whether the material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.defines = { 'MATCAP': '' };\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.matcap = source.matcap;\n\n\t\tthis.map = source.map;\n\n\t\tthis.bumpMap = source.bumpMap;\n\t\tthis.bumpScale = source.bumpScale;\n\n\t\tthis.normalMap = source.normalMap;\n\t\tthis.normalMapType = source.normalMapType;\n\t\tthis.normalScale.copy( source.normalScale );\n\n\t\tthis.displacementMap = source.displacementMap;\n\t\tthis.displacementScale = source.displacementScale;\n\t\tthis.displacementBias = source.displacementBias;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\n\t\tthis.flatShading = source.flatShading;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A material for rendering line primitives.\n *\n * Materials define the appearance of renderable 3D objects.\n *\n * ```js\n * const material = new THREE.LineDashedMaterial( {\n * \tcolor: 0xffffff,\n * \tscale: 1,\n * \tdashSize: 3,\n * \tgapSize: 1,\n * } );\n * ```\n *\n * @augments LineBasicMaterial\n */\nclass LineDashedMaterial extends LineBasicMaterial {\n\n\t/**\n\t * Constructs a new line dashed material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineDashedMaterial = true;\n\t\tthis.type = 'LineDashedMaterial';\n\n\t\t/**\n\t\t * The scale of the dashed part of a line.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.scale = 1;\n\n\t\t/**\n\t\t * The size of the dash. This is both the gap with the stroke.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 3\n\t\t */\n\t\tthis.dashSize = 3;\n\n\t\t/**\n\t\t * The size of the gap.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.gapSize = 1;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.scale = source.scale;\n\t\tthis.dashSize = source.dashSize;\n\t\tthis.gapSize = source.gapSize;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Converts an array to a specific type.\n *\n * @param {TypedArray|Array} array - The array to convert.\n * @param {TypedArray.constructor} type - The constructor of a typed array that defines the new type.\n * @return {TypedArray} The converted array.\n */\nfunction convertArray( array, type ) {\n\n\tif ( ! array || array.constructor === type ) return array;\n\n\tif ( typeof type.BYTES_PER_ELEMENT === 'number' ) {\n\n\t\treturn new type( array ); // create typed array\n\n\t}\n\n\treturn Array.prototype.slice.call( array ); // create Array\n\n}\n\n/**\n * Returns an array by which times and values can be sorted.\n *\n * @param {Array<number>} times - The keyframe time values.\n * @return {Array<number>} The array.\n */\nfunction getKeyframeOrder( times ) {\n\n\tfunction compareTime( i, j ) {\n\n\t\treturn times[ i ] - times[ j ];\n\n\t}\n\n\tconst n = times.length;\n\tconst result = new Array( n );\n\tfor ( let i = 0; i !== n; ++ i ) result[ i ] = i;\n\n\tresult.sort( compareTime );\n\n\treturn result;\n\n}\n\n/**\n * Sorts the given array by the previously computed order via `getKeyframeOrder()`.\n *\n * @param {Array<number>} values - The values to sort.\n * @param {number} stride - The stride.\n * @param {Array<number>} order - The sort order.\n * @return {Array<number>} The sorted values.\n */\nfunction sortedArray( values, stride, order ) {\n\n\tconst nValues = values.length;\n\tconst result = new values.constructor( nValues );\n\n\tfor ( let i = 0, dstOffset = 0; dstOffset !== nValues; ++ i ) {\n\n\t\tconst srcOffset = order[ i ] * stride;\n\n\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\tresult[ dstOffset ++ ] = values[ srcOffset + j ];\n\n\t\t}\n\n\t}\n\n\treturn result;\n\n}\n\n/**\n * Used for parsing AOS keyframe formats.\n *\n * @param {Array<number>} jsonKeys - A list of JSON keyframes.\n * @param {Array<number>} times - This array will be filled with keyframe times by this function.\n * @param {Array<number>} values - This array will be filled with keyframe values by this function.\n * @param {string} valuePropertyName - The name of the property to use.\n */\nfunction flattenJSON( jsonKeys, times, values, valuePropertyName ) {\n\n\tlet i = 1, key = jsonKeys[ 0 ];\n\n\twhile ( key !== undefined && key[ valuePropertyName ] === undefined ) {\n\n\t\tkey = jsonKeys[ i ++ ];\n\n\t}\n\n\tif ( key === undefined ) return; // no data\n\n\tlet value = key[ valuePropertyName ];\n\tif ( value === undefined ) return; // no data\n\n\tif ( Array.isArray( value ) ) {\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalues.push( ...value ); // push all elements\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t} else if ( value.toArray !== undefined ) {\n\n\t\t// ...assume THREE.Math-ish\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalue.toArray( values, values.length );\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t} else {\n\n\t\t// otherwise push as-is\n\n\t\tdo {\n\n\t\t\tvalue = key[ valuePropertyName ];\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\ttimes.push( key.time );\n\t\t\t\tvalues.push( value );\n\n\t\t\t}\n\n\t\t\tkey = jsonKeys[ i ++ ];\n\n\t\t} while ( key !== undefined );\n\n\t}\n\n}\n\n/**\n * Creates a new clip, containing only the segment of the original clip between the given frames.\n *\n * @param {AnimationClip} sourceClip - The values to sort.\n * @param {string} name - The name of the clip.\n * @param {number} startFrame - The start frame.\n * @param {number} endFrame - The end frame.\n * @param {number} [fps=30] - The FPS.\n * @return {AnimationClip} The new sub clip.\n */\nfunction subclip( sourceClip, name, startFrame, endFrame, fps = 30 ) {\n\n\tconst clip = sourceClip.clone();\n\n\tclip.name = name;\n\n\tconst tracks = [];\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tconst track = clip.tracks[ i ];\n\t\tconst valueSize = track.getValueSize();\n\n\t\tconst times = [];\n\t\tconst values = [];\n\n\t\tfor ( let j = 0; j < track.times.length; ++ j ) {\n\n\t\t\tconst frame = track.times[ j ] * fps;\n\n\t\t\tif ( frame < startFrame || frame >= endFrame ) continue;\n\n\t\t\ttimes.push( track.times[ j ] );\n\n\t\t\tfor ( let k = 0; k < valueSize; ++ k ) {\n\n\t\t\t\tvalues.push( track.values[ j * valueSize + k ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( times.length === 0 ) continue;\n\n\t\ttrack.times = convertArray( times, track.times.constructor );\n\t\ttrack.values = convertArray( values, track.values.constructor );\n\n\t\ttracks.push( track );\n\n\t}\n\n\tclip.tracks = tracks;\n\n\t// find minimum .times value across all tracks in the trimmed clip\n\n\tlet minStartTime = Infinity;\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tif ( minStartTime > clip.tracks[ i ].times[ 0 ] ) {\n\n\t\t\tminStartTime = clip.tracks[ i ].times[ 0 ];\n\n\t\t}\n\n\t}\n\n\t// shift all tracks such that clip begins at t=0\n\n\tfor ( let i = 0; i < clip.tracks.length; ++ i ) {\n\n\t\tclip.tracks[ i ].shift( -1 * minStartTime );\n\n\t}\n\n\tclip.resetDuration();\n\n\treturn clip;\n\n}\n\n/**\n * Converts the keyframes of the given animation clip to an additive format.\n *\n * @param {AnimationClip} targetClip - The clip to make additive.\n * @param {number} [referenceFrame=0] - The reference frame.\n * @param {AnimationClip} [referenceClip=targetClip] - The reference clip.\n * @param {number} [fps=30] - The FPS.\n * @return {AnimationClip} The updated clip which is now additive.\n */\nfunction makeClipAdditive( targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30 ) {\n\n\tif ( fps <= 0 ) fps = 30;\n\n\tconst numTracks = referenceClip.tracks.length;\n\tconst referenceTime = referenceFrame / fps;\n\n\t// Make each track's values relative to the values at the reference frame\n\tfor ( let i = 0; i < numTracks; ++ i ) {\n\n\t\tconst referenceTrack = referenceClip.tracks[ i ];\n\t\tconst referenceTrackType = referenceTrack.ValueTypeName;\n\n\t\t// Skip this track if it's non-numeric\n\t\tif ( referenceTrackType === 'bool' || referenceTrackType === 'string' ) continue;\n\n\t\t// Find the track in the target clip whose name and type matches the reference track\n\t\tconst targetTrack = targetClip.tracks.find( function ( track ) {\n\n\t\t\treturn track.name === referenceTrack.name\n\t\t\t\t&& track.ValueTypeName === referenceTrackType;\n\n\t\t} );\n\n\t\tif ( targetTrack === undefined ) continue;\n\n\t\tlet referenceOffset = 0;\n\t\tconst referenceValueSize = referenceTrack.getValueSize();\n\n\t\tif ( referenceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\treferenceOffset = referenceValueSize / 3;\n\n\t\t}\n\n\t\tlet targetOffset = 0;\n\t\tconst targetValueSize = targetTrack.getValueSize();\n\n\t\tif ( targetTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\ttargetOffset = targetValueSize / 3;\n\n\t\t}\n\n\t\tconst lastIndex = referenceTrack.times.length - 1;\n\t\tlet referenceValue;\n\n\t\t// Find the value to subtract out of the track\n\t\tif ( referenceTime <= referenceTrack.times[ 0 ] ) {\n\n\t\t\t// Reference frame is earlier than the first keyframe, so just use the first keyframe\n\t\t\tconst startIndex = referenceOffset;\n\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\treferenceValue = referenceTrack.values.slice( startIndex, endIndex );\n\n\t\t} else if ( referenceTime >= referenceTrack.times[ lastIndex ] ) {\n\n\t\t\t// Reference frame is after the last keyframe, so just use the last keyframe\n\t\t\tconst startIndex = lastIndex * referenceValueSize + referenceOffset;\n\t\t\tconst endIndex = startIndex + referenceValueSize - referenceOffset;\n\t\t\treferenceValue = referenceTrack.values.slice( startIndex, endIndex );\n\n\t\t} else {\n\n\t\t\t// Interpolate to the reference value\n\t\t\tconst interpolant = referenceTrack.createInterpolant();\n\t\t\tconst startIndex = referenceOffset;\n\t\t\tconst endIndex = referenceValueSize - referenceOffset;\n\t\t\tinterpolant.evaluate( referenceTime );\n\t\t\treferenceValue = interpolant.resultBuffer.slice( startIndex, endIndex );\n\n\t\t}\n\n\t\t// Conjugate the quaternion\n\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\tconst referenceQuat = new Quaternion().fromArray( referenceValue ).normalize().conjugate();\n\t\t\treferenceQuat.toArray( referenceValue );\n\n\t\t}\n\n\t\t// Subtract the reference value from all of the track values\n\n\t\tconst numTimes = targetTrack.times.length;\n\t\tfor ( let j = 0; j < numTimes; ++ j ) {\n\n\t\t\tconst valueStart = j * targetValueSize + targetOffset;\n\n\t\t\tif ( referenceTrackType === 'quaternion' ) {\n\n\t\t\t\t// Multiply the conjugate for quaternion track types\n\t\t\t\tQuaternion.multiplyQuaternionsFlat(\n\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\tvalueStart,\n\t\t\t\t\treferenceValue,\n\t\t\t\t\t0,\n\t\t\t\t\ttargetTrack.values,\n\t\t\t\t\tvalueStart\n\t\t\t\t);\n\n\t\t\t} else {\n\n\t\t\t\tconst valueEnd = targetValueSize - targetOffset * 2;\n\n\t\t\t\t// Subtract each value for all other numeric track types\n\t\t\t\tfor ( let k = 0; k < valueEnd; ++ k ) {\n\n\t\t\t\t\ttargetTrack.values[ valueStart + k ] -= referenceValue[ k ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttargetClip.blendMode = AdditiveAnimationBlendMode;\n\n\treturn targetClip;\n\n}\n\n/**\n * A class with various methods to assist with animations.\n *\n * @hideconstructor\n */\nclass AnimationUtils {\n\n\t/**\n\t * Converts an array to a specific type\n\t *\n\t * @static\n\t * @param {TypedArray|Array} array - The array to convert.\n\t * @param {TypedArray.constructor} type - The constructor of a type array.\n\t * @return {TypedArray} The converted array\n\t */\n\tstatic convertArray( array, type ) {\n\n\t\treturn convertArray( array, type );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given object is a typed array.\n\t *\n\t * @static\n\t * @param {any} object - The object to check.\n\t * @return {boolean} Whether the given object is a typed array.\n\t */\n\tstatic isTypedArray( object ) {\n\n\t\treturn isTypedArray( object );\n\n\t}\n\n\t/**\n\t * Returns an array by which times and values can be sorted.\n\t *\n\t * @static\n\t * @param {Array<number>} times - The keyframe time values.\n\t * @return {Array<number>} The array.\n\t */\n\tstatic getKeyframeOrder( times ) {\n\n\t\treturn getKeyframeOrder( times );\n\n\t}\n\n\t/**\n\t * Sorts the given array by the previously computed order via `getKeyframeOrder()`.\n\t *\n\t * @static\n\t * @param {Array<number>} values - The values to sort.\n\t * @param {number} stride - The stride.\n\t * @param {Array<number>} order - The sort order.\n\t * @return {Array<number>} The sorted values.\n\t */\n\tstatic sortedArray( values, stride, order ) {\n\n\t\treturn sortedArray( values, stride, order );\n\n\t}\n\n\t/**\n\t * Used for parsing AOS keyframe formats.\n\t *\n\t * @static\n\t * @param {Array<number>} jsonKeys - A list of JSON keyframes.\n\t * @param {Array<number>} times - This array will be filled with keyframe times by this method.\n\t * @param {Array<number>} values - This array will be filled with keyframe values by this method.\n\t * @param {string} valuePropertyName - The name of the property to use.\n\t */\n\tstatic flattenJSON( jsonKeys, times, values, valuePropertyName ) {\n\n\t\tflattenJSON( jsonKeys, times, values, valuePropertyName );\n\n\t}\n\n\t/**\n\t * Creates a new clip, containing only the segment of the original clip between the given frames.\n\t *\n\t * @static\n\t * @param {AnimationClip} sourceClip - The values to sort.\n\t * @param {string} name - The name of the clip.\n\t * @param {number} startFrame - The start frame.\n\t * @param {number} endFrame - The end frame.\n\t * @param {number} [fps=30] - The FPS.\n\t * @return {AnimationClip} The new sub clip.\n\t */\n\tstatic subclip( sourceClip, name, startFrame, endFrame, fps = 30 ) {\n\n\t\treturn subclip( sourceClip, name, startFrame, endFrame, fps );\n\n\t}\n\n\t/**\n\t * Converts the keyframes of the given animation clip to an additive format.\n\t *\n\t * @static\n\t * @param {AnimationClip} targetClip - The clip to make additive.\n\t * @param {number} [referenceFrame=0] - The reference frame.\n\t * @param {AnimationClip} [referenceClip=targetClip] - The reference clip.\n\t * @param {number} [fps=30] - The FPS.\n\t * @return {AnimationClip} The updated clip which is now additive.\n\t */\n\tstatic makeClipAdditive( targetClip, referenceFrame = 0, referenceClip = targetClip, fps = 30 ) {\n\n\t\treturn makeClipAdditive( targetClip, referenceFrame, referenceClip, fps );\n\n\t}\n\n}\n\n/**\n * Abstract base class of interpolants over parametric samples.\n *\n * The parameter domain is one dimensional, typically the time or a path\n * along a curve defined by the data.\n *\n * The sample values can have any dimensionality and derived classes may\n * apply special interpretations to the data.\n *\n * This class provides the interval seek in a Template Method, deferring\n * the actual interpolation to derived classes.\n *\n * Time complexity is O(1) for linear access crossing at most two points\n * and O(log N) for random access, where N is the number of positions.\n *\n * References: {@link http://www.oodesign.com/template-method-pattern.html}\n *\n * @abstract\n */\nclass Interpolant {\n\n\t/**\n\t * Constructs a new interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\t/**\n\t\t * The parameter positions.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.parameterPositions = parameterPositions;\n\n\t\t/**\n\t\t * A cache index.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis._cachedIndex = 0;\n\n\t\t/**\n\t\t * The result buffer.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.resultBuffer = resultBuffer !== undefined ? resultBuffer : new sampleValues.constructor( sampleSize );\n\n\t\t/**\n\t\t * The sample values.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.sampleValues = sampleValues;\n\n\t\t/**\n\t\t * The value size.\n\t\t *\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis.valueSize = sampleSize;\n\n\t\t/**\n\t\t * The interpolation settings.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.settings = null;\n\n\t\t/**\n\t\t * The default settings object.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.DefaultSettings_ = {};\n\n\t}\n\n\t/**\n\t * Evaluate the interpolant at position `t`.\n\t *\n\t * @param {number} t - The interpolation factor.\n\t * @return {TypedArray} The result buffer.\n\t */\n\tevaluate( t ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet i1 = this._cachedIndex,\n\t\t\tt1 = pp[ i1 ],\n\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\tvalidate_interval: {\n\n\t\t\tseek: {\n\n\t\t\t\tlet right;\n\n\t\t\t\tlinear_scan: {\n\n\t\t\t\t\t//- See http://jsperf.com/comparison-to-undefined/3\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\n\t\t\t\t\t//- \t\t\t\tif ( t >= t1 || t1 === undefined ) {\n\t\t\t\t\tforward_scan: if ( ! ( t < t1 ) ) {\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 + 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\t\t\t\tif ( t < t0 ) break forward_scan;\n\n\t\t\t\t\t\t\t\t// after end\n\n\t\t\t\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\t\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt0 = t1;\n\t\t\t\t\t\t\tt1 = pp[ ++ i1 ];\n\n\t\t\t\t\t\t\tif ( t < t1 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the right side of the index\n\t\t\t\t\t\tright = pp.length;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t//- slower code:\n\t\t\t\t\t//-\t\t\t\t\tif ( t < t0 || t0 === undefined ) {\n\t\t\t\t\tif ( ! ( t >= t0 ) ) {\n\n\t\t\t\t\t\t// looping?\n\n\t\t\t\t\t\tconst t1global = pp[ 1 ];\n\n\t\t\t\t\t\tif ( t < t1global ) {\n\n\t\t\t\t\t\t\ti1 = 2; // + 1, using the scan for the details\n\t\t\t\t\t\t\tt0 = t1global;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// linear reverse scan\n\n\t\t\t\t\t\tfor ( let giveUpAt = i1 - 2; ; ) {\n\n\t\t\t\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\t\t\t\t// before start\n\n\t\t\t\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\t\t\t\treturn this.copySampleValue_( 0 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( i1 === giveUpAt ) break; // this loop\n\n\t\t\t\t\t\t\tt1 = t0;\n\t\t\t\t\t\t\tt0 = pp[ -- i1 - 1 ];\n\n\t\t\t\t\t\t\tif ( t >= t0 ) {\n\n\t\t\t\t\t\t\t\t// we have arrived at the sought interval\n\t\t\t\t\t\t\t\tbreak seek;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// prepare binary search on the left side of the index\n\t\t\t\t\t\tright = i1;\n\t\t\t\t\t\ti1 = 0;\n\t\t\t\t\t\tbreak linear_scan;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the interval is valid\n\n\t\t\t\t\tbreak validate_interval;\n\n\t\t\t\t} // linear scan\n\n\t\t\t\t// binary search\n\n\t\t\t\twhile ( i1 < right ) {\n\n\t\t\t\t\tconst mid = ( i1 + right ) >>> 1;\n\n\t\t\t\t\tif ( t < pp[ mid ] ) {\n\n\t\t\t\t\t\tright = mid;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ti1 = mid + 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tt1 = pp[ i1 ];\n\t\t\t\tt0 = pp[ i1 - 1 ];\n\n\t\t\t\t// check boundary cases, again\n\n\t\t\t\tif ( t0 === undefined ) {\n\n\t\t\t\t\tthis._cachedIndex = 0;\n\t\t\t\t\treturn this.copySampleValue_( 0 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( t1 === undefined ) {\n\n\t\t\t\t\ti1 = pp.length;\n\t\t\t\t\tthis._cachedIndex = i1;\n\t\t\t\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t\t\t\t}\n\n\t\t\t} // seek\n\n\t\t\tthis._cachedIndex = i1;\n\n\t\t\tthis.intervalChanged_( i1, t0, t1 );\n\n\t\t} // validate_interval\n\n\t\treturn this.interpolate_( i1, t0, t, t1 );\n\n\t}\n\n\t/**\n\t * Returns the interpolation settings.\n\t *\n\t * @return {Object} The interpolation settings.\n\t */\n\tgetSettings_() {\n\n\t\treturn this.settings || this.DefaultSettings_;\n\n\t}\n\n\t/**\n\t * Copies a sample value to the result buffer.\n\t *\n\t * @param {number} index - An index into the sample value buffer.\n\t * @return {TypedArray} The result buffer.\n\t */\n\tcopySampleValue_( index ) {\n\n\t\t// copies a sample value to the result buffer\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = index * stride;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\t/**\n\t * Copies a sample value to the result buffer.\n\t *\n\t * @abstract\n\t * @param {number} i1 - An index into the sample value buffer.\n\t * @param {number} t0 - The previous interpolation factor.\n\t * @param {number} t - The current interpolation factor.\n\t * @param {number} t1 - The next interpolation factor.\n\t * @return {TypedArray} The result buffer.\n\t */\n\tinterpolate_( /* i1, t0, t, t1 */ ) {\n\n\t\tthrow new Error( 'call to abstract method' );\n\t\t// implementations shall return this.resultBuffer\n\n\t}\n\n\t/**\n\t * Optional method that is executed when the interval has changed.\n\t *\n\t * @param {number} i1 - An index into the sample value buffer.\n\t * @param {number} t0 - The previous interpolation factor.\n\t * @param {number} t - The current interpolation factor.\n\t */\n\tintervalChanged_( /* i1, t0, t1 */ ) {\n\n\t\t// empty\n\n\t}\n\n}\n\n/**\n * Fast and simple cubic spline interpolant.\n *\n * It was derived from a Hermitian construction setting the first derivative\n * at each sample position to the linear slope between neighboring positions\n * over their parameter interval.\n *\n * @augments Interpolant\n */\nclass CubicInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new cubic interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t\tthis._weightPrev = -0;\n\t\tthis._offsetPrev = -0;\n\t\tthis._weightNext = -0;\n\t\tthis._offsetNext = -0;\n\n\t\tthis.DefaultSettings_ = {\n\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\n\t\t};\n\n\t}\n\n\tintervalChanged_( i1, t0, t1 ) {\n\n\t\tconst pp = this.parameterPositions;\n\t\tlet iPrev = i1 - 2,\n\t\t\tiNext = i1 + 1,\n\n\t\t\ttPrev = pp[ iPrev ],\n\t\t\ttNext = pp[ iNext ];\n\n\t\tif ( tPrev === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingStart ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(t0) = 0\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = 2 * t0 - t1;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiPrev = pp.length - 2;\n\t\t\t\t\ttPrev = t0 + pp[ iPrev ] - pp[ iPrev + 1 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(t0) = 0 a.k.a. Natural Spline\n\t\t\t\t\tiPrev = i1;\n\t\t\t\t\ttPrev = t1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tNext === undefined ) {\n\n\t\t\tswitch ( this.getSettings_().endingEnd ) {\n\n\t\t\t\tcase ZeroSlopeEnding:\n\n\t\t\t\t\t// f'(tN) = 0\n\t\t\t\t\tiNext = i1;\n\t\t\t\t\ttNext = 2 * t1 - t0;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase WrapAroundEnding:\n\n\t\t\t\t\t// use the other end of the curve\n\t\t\t\t\tiNext = 1;\n\t\t\t\t\ttNext = t1 + pp[ 1 ] - pp[ 0 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault: // ZeroCurvatureEnding\n\n\t\t\t\t\t// f''(tN) = 0, a.k.a. Natural Spline\n\t\t\t\t\tiNext = i1 - 1;\n\t\t\t\t\ttNext = t0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst halfDt = ( t1 - t0 ) * 0.5,\n\t\t\tstride = this.valueSize;\n\n\t\tthis._weightPrev = halfDt / ( t0 - tPrev );\n\t\tthis._weightNext = halfDt / ( tNext - t1 );\n\t\tthis._offsetPrev = iPrev * stride;\n\t\tthis._offsetNext = iNext * stride;\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\to1 = i1 * stride,\t\to0 = o1 - stride,\n\t\t\toP = this._offsetPrev, \toN = this._offsetNext,\n\t\t\twP = this._weightPrev,\twN = this._weightNext,\n\n\t\t\tp = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tpp = p * p,\n\t\t\tppp = pp * p;\n\n\t\t// evaluate polynomials\n\n\t\tconst sP = - wP * ppp + 2 * wP * pp - wP * p;\n\t\tconst s0 = ( 1 + wP ) * ppp + ( -1.5 - 2 * wP ) * pp + ( -0.5 + wP ) * p + 1;\n\t\tconst s1 = ( -1 - wN ) * ppp + ( 1.5 + wN ) * pp + 0.5 * p;\n\t\tconst sN = wN * ppp - wN * pp;\n\n\t\t// combine data linearly\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tsP * values[ oP + i ] +\n\t\t\t\t\ts0 * values[ o0 + i ] +\n\t\t\t\t\ts1 * values[ o1 + i ] +\n\t\t\t\t\tsN * values[ oN + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * A basic linear interpolant.\n *\n * @augments Interpolant\n */\nclass LinearInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new linear interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\toffset1 = i1 * stride,\n\t\t\toffset0 = offset1 - stride,\n\n\t\t\tweight1 = ( t - t0 ) / ( t1 - t0 ),\n\t\t\tweight0 = 1 - weight1;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tresult[ i ] =\n\t\t\t\t\tvalues[ offset0 + i ] * weight0 +\n\t\t\t\t\tvalues[ offset1 + i ] * weight1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * Interpolant that evaluates to the sample value at the position preceding\n * the parameter.\n *\n * @augments Interpolant\n */\nclass DiscreteInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new discrete interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1 /*, t0, t, t1 */ ) {\n\n\t\treturn this.copySampleValue_( i1 - 1 );\n\n\t}\n\n}\n\n/**\n * Represents s a timed sequence of keyframes, which are composed of lists of\n * times and related values, and which are used to animate a specific property\n * of an object.\n */\nclass KeyframeTrack {\n\n\t/**\n\t * Constructs a new keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array<number>} times - A list of keyframe times.\n\t * @param {Array<number|string|boolean>} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tif ( name === undefined ) throw new Error( 'THREE.KeyframeTrack: track name is undefined' );\n\t\tif ( times === undefined || times.length === 0 ) throw new Error( 'THREE.KeyframeTrack: no keyframes in track named ' + name );\n\n\t\t/**\n\t\t * The track's name can refer to morph targets or bones or\n\t\t * possibly other values within an animated object. See {@link PropertyBinding#parseTrackName}\n\t\t * for the forms of strings that can be parsed for property binding.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * The keyframe times.\n\t\t *\n\t\t * @type {Float32Array}\n\t\t */\n\t\tthis.times = convertArray( times, this.TimeBufferType );\n\n\t\t/**\n\t\t * The keyframe values.\n\t\t *\n\t\t * @type {Float32Array}\n\t\t */\n\t\tthis.values = convertArray( values, this.ValueBufferType );\n\n\t\tthis.setInterpolation( interpolation || this.DefaultInterpolation );\n\n\t}\n\n\t/**\n\t * Converts the keyframe track to JSON.\n\t *\n\t * @static\n\t * @param {KeyframeTrack} track - The keyframe track to serialize.\n\t * @return {Object} The serialized keyframe track as JSON.\n\t */\n\tstatic toJSON( track ) {\n\n\t\tconst trackType = track.constructor;\n\n\t\tlet json;\n\n\t\t// derived classes can define a static toJSON method\n\t\tif ( trackType.toJSON !== this.toJSON ) {\n\n\t\t\tjson = trackType.toJSON( track );\n\n\t\t} else {\n\n\t\t\t// by default, we assume the data can be serialized as-is\n\t\t\tjson = {\n\n\t\t\t\t'name': track.name,\n\t\t\t\t'times': convertArray( track.times, Array ),\n\t\t\t\t'values': convertArray( track.values, Array )\n\n\t\t\t};\n\n\t\t\tconst interpolation = track.getInterpolation();\n\n\t\t\tif ( interpolation !== track.DefaultInterpolation ) {\n\n\t\t\t\tjson.interpolation = interpolation;\n\n\t\t\t}\n\n\t\t}\n\n\t\tjson.type = track.ValueTypeName; // mandatory\n\n\t\treturn json;\n\n\t}\n\n\t/**\n\t * Factory method for creating a new discrete interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {DiscreteInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodDiscrete( result ) {\n\n\t\treturn new DiscreteInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\t/**\n\t * Factory method for creating a new linear interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {LinearInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new LinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\t/**\n\t * Factory method for creating a new smooth interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {CubicInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodSmooth( result ) {\n\n\t\treturn new CubicInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n\t/**\n\t * Defines the interpolation factor method for this keyframe track.\n\t *\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} interpolation - The interpolation type.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\tsetInterpolation( interpolation ) {\n\n\t\tlet factoryMethod;\n\n\t\tswitch ( interpolation ) {\n\n\t\t\tcase InterpolateDiscrete:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodDiscrete;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateLinear:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodLinear;\n\n\t\t\t\tbreak;\n\n\t\t\tcase InterpolateSmooth:\n\n\t\t\t\tfactoryMethod = this.InterpolantFactoryMethodSmooth;\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( factoryMethod === undefined ) {\n\n\t\t\tconst message = 'unsupported interpolation for ' +\n\t\t\t\tthis.ValueTypeName + ' keyframe track named ' + this.name;\n\n\t\t\tif ( this.createInterpolant === undefined ) {\n\n\t\t\t\t// fall back to default, unless the default itself is messed up\n\t\t\t\tif ( interpolation !== this.DefaultInterpolation ) {\n\n\t\t\t\t\tthis.setInterpolation( this.DefaultInterpolation );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( message ); // fatal, in this case\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\twarn( 'KeyframeTrack:', message );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.createInterpolant = factoryMethod;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current interpolation type.\n\t *\n\t * @return {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} The interpolation type.\n\t */\n\tgetInterpolation() {\n\n\t\tswitch ( this.createInterpolant ) {\n\n\t\t\tcase this.InterpolantFactoryMethodDiscrete:\n\n\t\t\t\treturn InterpolateDiscrete;\n\n\t\t\tcase this.InterpolantFactoryMethodLinear:\n\n\t\t\t\treturn InterpolateLinear;\n\n\t\t\tcase this.InterpolantFactoryMethodSmooth:\n\n\t\t\t\treturn InterpolateSmooth;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the value size.\n\t *\n\t * @return {number} The value size.\n\t */\n\tgetValueSize() {\n\n\t\treturn this.values.length / this.times.length;\n\n\t}\n\n\t/**\n\t * Moves all keyframes either forward or backward in time.\n\t *\n\t * @param {number} timeOffset - The offset to move the time values.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\tshift( timeOffset ) {\n\n\t\tif ( timeOffset !== 0.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] += timeOffset;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scale all keyframe times by a factor (useful for frame - seconds conversions).\n\t *\n\t * @param {number} timeScale - The time scale.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\tscale( timeScale ) {\n\n\t\tif ( timeScale !== 1.0 ) {\n\n\t\t\tconst times = this.times;\n\n\t\t\tfor ( let i = 0, n = times.length; i !== n; ++ i ) {\n\n\t\t\t\ttimes[ i ] *= timeScale;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes keyframes before and after animation without changing any values within the defined time range.\n\t *\n\t * Note: The method does not shift around keys to the start of the track time, because for interpolated\n\t * keys this will change their values\n\t *\n\t * @param {number} startTime - The start time.\n\t * @param {number} endTime - The end time.\n\t * @return {KeyframeTrack} A reference to this keyframe track.\n\t */\n\ttrim( startTime, endTime ) {\n\n\t\tconst times = this.times,\n\t\t\tnKeys = times.length;\n\n\t\tlet from = 0,\n\t\t\tto = nKeys - 1;\n\n\t\twhile ( from !== nKeys && times[ from ] < startTime ) {\n\n\t\t\t++ from;\n\n\t\t}\n\n\t\twhile ( to !== -1 && times[ to ] > endTime ) {\n\n\t\t\t-- to;\n\n\t\t}\n\n\t\t++ to; // inclusive -> exclusive bound\n\n\t\tif ( from !== 0 || to !== nKeys ) {\n\n\t\t\t// empty tracks are forbidden, so keep at least one keyframe\n\t\t\tif ( from >= to ) {\n\n\t\t\t\tto = Math.max( to, 1 );\n\t\t\t\tfrom = to - 1;\n\n\t\t\t}\n\n\t\t\tconst stride = this.getValueSize();\n\t\t\tthis.times = times.slice( from, to );\n\t\t\tthis.values = this.values.slice( from * stride, to * stride );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs minimal validation on the keyframe track. Returns `true` if the values\n\t * are valid.\n\t *\n\t * @return {boolean} Whether the keyframes are valid or not.\n\t */\n\tvalidate() {\n\n\t\tlet valid = true;\n\n\t\tconst valueSize = this.getValueSize();\n\t\tif ( valueSize - Math.floor( valueSize ) !== 0 ) {\n\n\t\t\terror( 'KeyframeTrack: Invalid value size in track.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tconst times = this.times,\n\t\t\tvalues = this.values,\n\n\t\t\tnKeys = times.length;\n\n\t\tif ( nKeys === 0 ) {\n\n\t\t\terror( 'KeyframeTrack: Track is empty.', this );\n\t\t\tvalid = false;\n\n\t\t}\n\n\t\tlet prevTime = null;\n\n\t\tfor ( let i = 0; i !== nKeys; i ++ ) {\n\n\t\t\tconst currTime = times[ i ];\n\n\t\t\tif ( typeof currTime === 'number' && isNaN( currTime ) ) {\n\n\t\t\t\terror( 'KeyframeTrack: Time is not a valid number.', this, i, currTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( prevTime !== null && prevTime > currTime ) {\n\n\t\t\t\terror( 'KeyframeTrack: Out of order keys.', this, i, currTime, prevTime );\n\t\t\t\tvalid = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tprevTime = currTime;\n\n\t\t}\n\n\t\tif ( values !== undefined ) {\n\n\t\t\tif ( isTypedArray( values ) ) {\n\n\t\t\t\tfor ( let i = 0, n = values.length; i !== n; ++ i ) {\n\n\t\t\t\t\tconst value = values[ i ];\n\n\t\t\t\t\tif ( isNaN( value ) ) {\n\n\t\t\t\t\t\terror( 'KeyframeTrack: Value is not a valid number.', this, i, value );\n\t\t\t\t\t\tvalid = false;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn valid;\n\n\t}\n\n\t/**\n\t * Optimizes this keyframe track by removing equivalent sequential keys (which are\n\t * common in morph target sequences).\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\toptimize() {\n\n\t\t// (0,0,0,0,1,1,1,0,0,0,0,0,0,0) --> (0,0,1,1,0,0)\n\n\t\t// times or values may be shared with other tracks, so overwriting is unsafe\n\t\tconst times = this.times.slice(),\n\t\t\tvalues = this.values.slice(),\n\t\t\tstride = this.getValueSize(),\n\n\t\t\tsmoothInterpolation = this.getInterpolation() === InterpolateSmooth,\n\n\t\t\tlastIndex = times.length - 1;\n\n\t\tlet writeIndex = 1;\n\n\t\tfor ( let i = 1; i < lastIndex; ++ i ) {\n\n\t\t\tlet keep = false;\n\n\t\t\tconst time = times[ i ];\n\t\t\tconst timeNext = times[ i + 1 ];\n\n\t\t\t// remove adjacent keyframes scheduled at the same time\n\n\t\t\tif ( time !== timeNext && ( i !== 1 || time !== times[ 0 ] ) ) {\n\n\t\t\t\tif ( ! smoothInterpolation ) {\n\n\t\t\t\t\t// remove unnecessary keyframes same as their neighbors\n\n\t\t\t\t\tconst offset = i * stride,\n\t\t\t\t\t\toffsetP = offset - stride,\n\t\t\t\t\t\toffsetN = offset + stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tconst value = values[ offset + j ];\n\n\t\t\t\t\t\tif ( value !== values[ offsetP + j ] ||\n\t\t\t\t\t\t\tvalue !== values[ offsetN + j ] ) {\n\n\t\t\t\t\t\t\tkeep = true;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tkeep = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// in-place compaction\n\n\t\t\tif ( keep ) {\n\n\t\t\t\tif ( i !== writeIndex ) {\n\n\t\t\t\t\ttimes[ writeIndex ] = times[ i ];\n\n\t\t\t\t\tconst readOffset = i * stride,\n\t\t\t\t\t\twriteOffset = writeIndex * stride;\n\n\t\t\t\t\tfor ( let j = 0; j !== stride; ++ j ) {\n\n\t\t\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t++ writeIndex;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// flush last keyframe (compaction looks ahead)\n\n\t\tif ( lastIndex > 0 ) {\n\n\t\t\ttimes[ writeIndex ] = times[ lastIndex ];\n\n\t\t\tfor ( let readOffset = lastIndex * stride, writeOffset = writeIndex * stride, j = 0; j !== stride; ++ j ) {\n\n\t\t\t\tvalues[ writeOffset + j ] = values[ readOffset + j ];\n\n\t\t\t}\n\n\t\t\t++ writeIndex;\n\n\t\t}\n\n\t\tif ( writeIndex !== times.length ) {\n\n\t\t\tthis.times = times.slice( 0, writeIndex );\n\t\t\tthis.values = values.slice( 0, writeIndex * stride );\n\n\t\t} else {\n\n\t\t\tthis.times = times;\n\t\t\tthis.values = values;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new keyframe track with copied values from this instance.\n\t *\n\t * @return {KeyframeTrack} A clone of this instance.\n\t */\n\tclone() {\n\n\t\tconst times = this.times.slice();\n\t\tconst values = this.values.slice();\n\n\t\tconst TypedKeyframeTrack = this.constructor;\n\t\tconst track = new TypedKeyframeTrack( this.name, times, values );\n\n\t\t// Interpolant argument to constructor is not saved, so copy the factory method directly.\n\t\ttrack.createInterpolant = this.createInterpolant;\n\n\t\treturn track;\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {string}\n * @default ''\n */\nKeyframeTrack.prototype.ValueTypeName = '';\n\n/**\n * The time buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Float32Array.constructor\n */\nKeyframeTrack.prototype.TimeBufferType = Float32Array;\n\n/**\n * The value buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Float32Array.constructor\n */\nKeyframeTrack.prototype.ValueBufferType = Float32Array;\n\n/**\n * The default interpolation type of this keyframe track.\n *\n * @type {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)}\n * @default InterpolateLinear\n */\nKeyframeTrack.prototype.DefaultInterpolation = InterpolateLinear;\n\n/**\n * A track for boolean keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass BooleanKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new boolean keyframe track.\n\t *\n\t * This keyframe track type has no `interpolation` parameter because the\n\t * interpolation is always discrete.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array<number>} times - A list of keyframe times.\n\t * @param {Array<boolean>} values - A list of keyframe values.\n\t */\n\tconstructor( name, times, values ) {\n\n\t\tsuper( name, times, values );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {string}\n * @default 'bool'\n */\nBooleanKeyframeTrack.prototype.ValueTypeName = 'bool';\n\n/**\n * The value buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Array.constructor\n */\nBooleanKeyframeTrack.prototype.ValueBufferType = Array;\n\n/**\n * The default interpolation type of this keyframe track.\n *\n * @type {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)}\n * @default InterpolateDiscrete\n */\nBooleanKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nBooleanKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A track for color keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass ColorKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new color keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array<number>} times - A list of keyframe times.\n\t * @param {Array<number>} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {string}\n * @default 'color'\n */\nColorKeyframeTrack.prototype.ValueTypeName = 'color';\n\n/**\n * A track for numeric keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass NumberKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new number keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array<number>} times - A list of keyframe times.\n\t * @param {Array<number>} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {string}\n * @default 'number'\n */\nNumberKeyframeTrack.prototype.ValueTypeName = 'number';\n\n/**\n * Spherical linear unit quaternion interpolant.\n *\n * @augments Interpolant\n */\nclass QuaternionLinearInterpolant extends Interpolant {\n\n\t/**\n\t * Constructs a new SLERP interpolant.\n\t *\n\t * @param {TypedArray} parameterPositions - The parameter positions hold the interpolation factors.\n\t * @param {TypedArray} sampleValues - The sample values.\n\t * @param {number} sampleSize - The sample size\n\t * @param {TypedArray} [resultBuffer] - The result buffer.\n\t */\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tstride = this.valueSize,\n\n\t\t\talpha = ( t - t0 ) / ( t1 - t0 );\n\n\t\tlet offset = i1 * stride;\n\n\t\tfor ( let end = offset + stride; offset !== end; offset += 4 ) {\n\n\t\t\tQuaternion.slerpFlat( result, 0, values, offset - stride, values, offset, alpha );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * A track for Quaternion keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass QuaternionKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new Quaternion keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array<number>} times - A list of keyframe times.\n\t * @param {Array<number>} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n\t/**\n\t * Overwritten so the method returns Quaternion based interpolant.\n\t *\n\t * @static\n\t * @param {TypedArray} [result] - The result buffer.\n\t * @return {QuaternionLinearInterpolant} The new interpolant.\n\t */\n\tInterpolantFactoryMethodLinear( result ) {\n\n\t\treturn new QuaternionLinearInterpolant( this.times, this.values, this.getValueSize(), result );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {string}\n * @default 'quaternion'\n */\nQuaternionKeyframeTrack.prototype.ValueTypeName = 'quaternion';\n// ValueBufferType is inherited\n// DefaultInterpolation is inherited;\nQuaternionKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A track for string keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass StringKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new string keyframe track.\n\t *\n\t * This keyframe track type has no `interpolation` parameter because the\n\t * interpolation is always discrete.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array<number>} times - A list of keyframe times.\n\t * @param {Array<string>} values - A list of keyframe values.\n\t */\n\tconstructor( name, times, values ) {\n\n\t\tsuper( name, times, values );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {string}\n * @default 'string'\n */\nStringKeyframeTrack.prototype.ValueTypeName = 'string';\n\n/**\n * The value buffer type of this keyframe track.\n *\n * @type {TypedArray|Array}\n * @default Array.constructor\n */\nStringKeyframeTrack.prototype.ValueBufferType = Array;\n\n/**\n * The default interpolation type of this keyframe track.\n *\n * @type {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)}\n * @default InterpolateDiscrete\n */\nStringKeyframeTrack.prototype.DefaultInterpolation = InterpolateDiscrete;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodLinear = undefined;\nStringKeyframeTrack.prototype.InterpolantFactoryMethodSmooth = undefined;\n\n/**\n * A track for vector keyframe values.\n *\n * @augments KeyframeTrack\n */\nclass VectorKeyframeTrack extends KeyframeTrack {\n\n\t/**\n\t * Constructs a new vector keyframe track.\n\t *\n\t * @param {string} name - The keyframe track's name.\n\t * @param {Array<number>} times - A list of keyframe times.\n\t * @param {Array<number>} values - A list of keyframe values.\n\t * @param {(InterpolateLinear|InterpolateDiscrete|InterpolateSmooth)} [interpolation] - The interpolation type.\n\t */\n\tconstructor( name, times, values, interpolation ) {\n\n\t\tsuper( name, times, values, interpolation );\n\n\t}\n\n}\n\n/**\n * The value type name.\n *\n * @type {string}\n * @default 'vector'\n */\nVectorKeyframeTrack.prototype.ValueTypeName = 'vector';\n\n/**\n * A reusable set of keyframe tracks which represent an animation.\n */\nclass AnimationClip {\n\n\t/**\n\t * Constructs a new animation clip.\n\t *\n\t * Note: Instead of instantiating an AnimationClip directly with the constructor, you can\n\t * use the static interface of this class for creating clips. In most cases though, animation clips\n\t * will automatically be created by loaders when importing animated 3D assets.\n\t *\n\t * @param {string} [name=''] - The clip's name.\n\t * @param {number} [duration=-1] - The clip's duration in seconds. If a negative value is passed,\n\t * the duration will be calculated from the passed keyframes.\n\t * @param {Array<KeyframeTrack>} tracks - An array of keyframe tracks.\n\t * @param {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)} [blendMode=NormalAnimationBlendMode] - Defines how the animation\n\t * is blended/combined when two or more animations are simultaneously played.\n\t */\n\tconstructor( name = '', duration = -1, tracks = [], blendMode = NormalAnimationBlendMode ) {\n\n\t\t/**\n\t\t * The clip's name.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t *  An array of keyframe tracks.\n\t\t *\n\t\t * @type {Array<KeyframeTrack>}\n\t\t */\n\t\tthis.tracks = tracks;\n\n\t\t/**\n\t\t * The clip's duration in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.duration = duration;\n\n\t\t/**\n\t\t * Defines how the animation is blended/combined when two or more animations\n\t\t * are simultaneously played.\n\t\t *\n\t\t * @type {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)}\n\t\t */\n\t\tthis.blendMode = blendMode;\n\n\t\t/**\n\t\t * The UUID of the animation clip.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t/**\n\t\t * An object that can be used to store custom data about the animation clip.\n\t\t * It should not hold references to functions as these will not be cloned.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.userData = {};\n\n\t\t// this means it should figure out its duration by scanning the tracks\n\t\tif ( this.duration < 0 ) {\n\n\t\t\tthis.resetDuration();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Factory method for creating an animation clip from the given JSON.\n\t *\n\t * @static\n\t * @param {Object} json - The serialized animation clip.\n\t * @return {AnimationClip} The new animation clip.\n\t */\n\tstatic parse( json ) {\n\n\t\tconst tracks = [],\n\t\t\tjsonTracks = json.tracks,\n\t\t\tframeTime = 1.0 / ( json.fps || 1.0 );\n\n\t\tfor ( let i = 0, n = jsonTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( parseKeyframeTrack( jsonTracks[ i ] ).scale( frameTime ) );\n\n\t\t}\n\n\t\tconst clip = new this( json.name, json.duration, tracks, json.blendMode );\n\t\tclip.uuid = json.uuid;\n\n\t\tclip.userData = JSON.parse( json.userData || '{}' );\n\n\t\treturn clip;\n\n\t}\n\n\t/**\n\t * Serializes the given animation clip into JSON.\n\t *\n\t * @static\n\t * @param {AnimationClip} clip - The animation clip to serialize.\n\t * @return {Object} The JSON object.\n\t */\n\tstatic toJSON( clip ) {\n\n\t\tconst tracks = [],\n\t\t\tclipTracks = clip.tracks;\n\n\t\tconst json = {\n\n\t\t\t'name': clip.name,\n\t\t\t'duration': clip.duration,\n\t\t\t'tracks': tracks,\n\t\t\t'uuid': clip.uuid,\n\t\t\t'blendMode': clip.blendMode,\n\t\t\t'userData': JSON.stringify( clip.userData ),\n\n\t\t};\n\n\t\tfor ( let i = 0, n = clipTracks.length; i !== n; ++ i ) {\n\n\t\t\ttracks.push( KeyframeTrack.toJSON( clipTracks[ i ] ) );\n\n\t\t}\n\n\t\treturn json;\n\n\t}\n\n\t/**\n\t * Returns a new animation clip from the passed morph targets array of a\n\t * geometry, taking a name and the number of frames per second.\n\t *\n\t * Note: The fps parameter is required, but the animation speed can be\n\t * overridden via {@link AnimationAction#setDuration}.\n\t *\n\t * @static\n\t * @param {string} name - The name of the animation clip.\n\t * @param {Array<Object>} morphTargetSequence - A sequence of morph targets.\n\t * @param {number} fps - The Frames-Per-Second value.\n\t * @param {boolean} noLoop - Whether the clip should be no loop or not.\n\t * @return {AnimationClip} The new animation clip.\n\t */\n\tstatic CreateFromMorphTargetSequence( name, morphTargetSequence, fps, noLoop ) {\n\n\t\tconst numMorphTargets = morphTargetSequence.length;\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; i ++ ) {\n\n\t\t\tlet times = [];\n\t\t\tlet values = [];\n\n\t\t\ttimes.push(\n\t\t\t\t( i + numMorphTargets - 1 ) % numMorphTargets,\n\t\t\t\ti,\n\t\t\t\t( i + 1 ) % numMorphTargets );\n\n\t\t\tvalues.push( 0, 1, 0 );\n\n\t\t\tconst order = getKeyframeOrder( times );\n\t\t\ttimes = sortedArray( times, 1, order );\n\t\t\tvalues = sortedArray( values, 1, order );\n\n\t\t\t// if there is a key at the first frame, duplicate it as the\n\t\t\t// last frame as well for perfect loop.\n\t\t\tif ( ! noLoop && times[ 0 ] === 0 ) {\n\n\t\t\t\ttimes.push( numMorphTargets );\n\t\t\t\tvalues.push( values[ 0 ] );\n\n\t\t\t}\n\n\t\t\ttracks.push(\n\t\t\t\tnew NumberKeyframeTrack(\n\t\t\t\t\t'.morphTargetInfluences[' + morphTargetSequence[ i ].name + ']',\n\t\t\t\t\ttimes, values\n\t\t\t\t).scale( 1.0 / fps ) );\n\n\t\t}\n\n\t\treturn new this( name, -1, tracks );\n\n\t}\n\n\t/**\n\t * Searches for an animation clip by name, taking as its first parameter\n\t * either an array of clips, or a mesh or geometry that contains an\n\t * array named \"animations\" property.\n\t *\n\t * @static\n\t * @param {(Array<AnimationClip>|Object3D)} objectOrClipArray - The array or object to search through.\n\t * @param {string} name - The name to search for.\n\t * @return {?AnimationClip} The found animation clip. Returns `null` if no clip has been found.\n\t */\n\tstatic findByName( objectOrClipArray, name ) {\n\n\t\tlet clipArray = objectOrClipArray;\n\n\t\tif ( ! Array.isArray( objectOrClipArray ) ) {\n\n\t\t\tconst o = objectOrClipArray;\n\t\t\tclipArray = o.geometry && o.geometry.animations || o.animations;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < clipArray.length; i ++ ) {\n\n\t\t\tif ( clipArray[ i ].name === name ) {\n\n\t\t\t\treturn clipArray[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Returns an array of new AnimationClips created from the morph target\n\t * sequences of a geometry, trying to sort morph target names into\n\t * animation-group-based patterns like \"Walk_001, Walk_002, Run_001, Run_002...\".\n\t *\n\t * See {@link MD2Loader#parse} as an example for how the method should be used.\n\t *\n\t * @static\n\t * @param {Array<Object>} morphTargets - A sequence of morph targets.\n\t * @param {number} fps - The Frames-Per-Second value.\n\t * @param {boolean} noLoop - Whether the clip should be no loop or not.\n\t * @return {Array<AnimationClip>} An array of new animation clips.\n\t */\n\tstatic CreateClipsFromMorphTargetSequences( morphTargets, fps, noLoop ) {\n\n\t\tconst animationToMorphTargets = {};\n\n\t\t// tested with https://regex101.com/ on trick sequences\n\t\t// such flamingo_flyA_003, flamingo_run1_003, crdeath0059\n\t\tconst pattern = /^([\\w-]*?)([\\d]+)$/;\n\n\t\t// sort morph target names into animation groups based\n\t\t// patterns like Walk_001, Walk_002, Run_001, Run_002\n\t\tfor ( let i = 0, il = morphTargets.length; i < il; i ++ ) {\n\n\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\tconst parts = morphTarget.name.match( pattern );\n\n\t\t\tif ( parts && parts.length > 1 ) {\n\n\t\t\t\tconst name = parts[ 1 ];\n\n\t\t\t\tlet animationMorphTargets = animationToMorphTargets[ name ];\n\n\t\t\t\tif ( ! animationMorphTargets ) {\n\n\t\t\t\t\tanimationToMorphTargets[ name ] = animationMorphTargets = [];\n\n\t\t\t\t}\n\n\t\t\t\tanimationMorphTargets.push( morphTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst clips = [];\n\n\t\tfor ( const name in animationToMorphTargets ) {\n\n\t\t\tclips.push( this.CreateFromMorphTargetSequence( name, animationToMorphTargets[ name ], fps, noLoop ) );\n\n\t\t}\n\n\t\treturn clips;\n\n\t}\n\n\t/**\n\t * Parses the `animation.hierarchy` format and returns a new animation clip.\n\t *\n\t * @static\n\t * @deprecated since r175.\n\t * @param {Object} animation - A serialized animation clip as JSON.\n\t * @param {Array<Bones>} bones - An array of bones.\n\t * @return {?AnimationClip} The new animation clip.\n\t */\n\tstatic parseAnimation( animation, bones ) {\n\n\t\twarn( 'AnimationClip: parseAnimation() is deprecated and will be removed with r185' );\n\n\t\tif ( ! animation ) {\n\n\t\t\terror( 'AnimationClip: No animation in JSONLoader data.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst addNonemptyTrack = function ( trackType, trackName, animationKeys, propertyName, destTracks ) {\n\n\t\t\t// only return track if there are actually keys.\n\t\t\tif ( animationKeys.length !== 0 ) {\n\n\t\t\t\tconst times = [];\n\t\t\t\tconst values = [];\n\n\t\t\t\tflattenJSON( animationKeys, times, values, propertyName );\n\n\t\t\t\t// empty keys are filtered out, so check again\n\t\t\t\tif ( times.length !== 0 ) {\n\n\t\t\t\t\tdestTracks.push( new trackType( trackName, times, values ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tconst tracks = [];\n\n\t\tconst clipName = animation.name || 'default';\n\t\tconst fps = animation.fps || 30;\n\t\tconst blendMode = animation.blendMode;\n\n\t\t// automatic length determination in AnimationClip.\n\t\tlet duration = animation.length || -1;\n\n\t\tconst hierarchyTracks = animation.hierarchy || [];\n\n\t\tfor ( let h = 0; h < hierarchyTracks.length; h ++ ) {\n\n\t\t\tconst animationKeys = hierarchyTracks[ h ].keys;\n\n\t\t\t// skip empty tracks\n\t\t\tif ( ! animationKeys || animationKeys.length === 0 ) continue;\n\n\t\t\t// process morph targets\n\t\t\tif ( animationKeys[ 0 ].morphTargets ) {\n\n\t\t\t\t// figure out all morph targets used in this track\n\t\t\t\tconst morphTargetNames = {};\n\n\t\t\t\tlet k;\n\n\t\t\t\tfor ( k = 0; k < animationKeys.length; k ++ ) {\n\n\t\t\t\t\tif ( animationKeys[ k ].morphTargets ) {\n\n\t\t\t\t\t\tfor ( let m = 0; m < animationKeys[ k ].morphTargets.length; m ++ ) {\n\n\t\t\t\t\t\t\tmorphTargetNames[ animationKeys[ k ].morphTargets[ m ] ] = -1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// create a track for each morph target with all zero\n\t\t\t\t// morphTargetInfluences except for the keys in which\n\t\t\t\t// the morphTarget is named.\n\t\t\t\tfor ( const morphTargetName in morphTargetNames ) {\n\n\t\t\t\t\tconst times = [];\n\t\t\t\t\tconst values = [];\n\n\t\t\t\t\tfor ( let m = 0; m !== animationKeys[ k ].morphTargets.length; ++ m ) {\n\n\t\t\t\t\t\tconst animationKey = animationKeys[ k ];\n\n\t\t\t\t\t\ttimes.push( animationKey.time );\n\t\t\t\t\t\tvalues.push( ( animationKey.morphTarget === morphTargetName ) ? 1 : 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttracks.push( new NumberKeyframeTrack( '.morphTargetInfluence[' + morphTargetName + ']', times, values ) );\n\n\t\t\t\t}\n\n\t\t\t\tduration = morphTargetNames.length * fps;\n\n\t\t\t} else {\n\n\t\t\t\t// ...assume skeletal animation\n\n\t\t\t\tconst boneName = '.bones[' + bones[ h ].name + ']';\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.position',\n\t\t\t\t\tanimationKeys, 'pos', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tQuaternionKeyframeTrack, boneName + '.quaternion',\n\t\t\t\t\tanimationKeys, 'rot', tracks );\n\n\t\t\t\taddNonemptyTrack(\n\t\t\t\t\tVectorKeyframeTrack, boneName + '.scale',\n\t\t\t\t\tanimationKeys, 'scl', tracks );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( tracks.length === 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst clip = new this( clipName, duration, tracks, blendMode );\n\n\t\treturn clip;\n\n\t}\n\n\t/**\n\t * Sets the duration of this clip to the duration of its longest keyframe track.\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\tresetDuration() {\n\n\t\tconst tracks = this.tracks;\n\t\tlet duration = 0;\n\n\t\tfor ( let i = 0, n = tracks.length; i !== n; ++ i ) {\n\n\t\t\tconst track = this.tracks[ i ];\n\n\t\t\tduration = Math.max( duration, track.times[ track.times.length - 1 ] );\n\n\t\t}\n\n\t\tthis.duration = duration;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Trims all tracks to the clip's duration.\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\ttrim() {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].trim( 0, this.duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Performs minimal validation on each track in the clip. Returns `true` if all\n\t * tracks are valid.\n\t *\n\t * @return {boolean} Whether the clip's keyframes are valid or not.\n\t */\n\tvalidate() {\n\n\t\tlet valid = true;\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tvalid = valid && this.tracks[ i ].validate();\n\n\t\t}\n\n\t\treturn valid;\n\n\t}\n\n\t/**\n\t * Optimizes each track by removing equivalent sequential keys (which are\n\t * common in morph target sequences).\n\t *\n\t * @return {AnimationClip} A reference to this animation clip.\n\t */\n\toptimize() {\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\tthis.tracks[ i ].optimize();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new animation clip with copied values from this instance.\n\t *\n\t * @return {AnimationClip} A clone of this instance.\n\t */\n\tclone() {\n\n\t\tconst tracks = [];\n\n\t\tfor ( let i = 0; i < this.tracks.length; i ++ ) {\n\n\t\t\ttracks.push( this.tracks[ i ].clone() );\n\n\t\t}\n\n\t\tconst clip = new this.constructor( this.name, this.duration, tracks, this.blendMode );\n\n\t\tclip.userData = JSON.parse( JSON.stringify( this.userData ) );\n\n\t\treturn clip;\n\n\t}\n\n\t/**\n\t * Serializes this animation clip into JSON.\n\t *\n\t * @return {Object} The JSON object.\n\t */\n\ttoJSON() {\n\n\t\treturn this.constructor.toJSON( this );\n\n\t}\n\n}\n\nfunction getTrackTypeForValueTypeName( typeName ) {\n\n\tswitch ( typeName.toLowerCase() ) {\n\n\t\tcase 'scalar':\n\t\tcase 'double':\n\t\tcase 'float':\n\t\tcase 'number':\n\t\tcase 'integer':\n\n\t\t\treturn NumberKeyframeTrack;\n\n\t\tcase 'vector':\n\t\tcase 'vector2':\n\t\tcase 'vector3':\n\t\tcase 'vector4':\n\n\t\t\treturn VectorKeyframeTrack;\n\n\t\tcase 'color':\n\n\t\t\treturn ColorKeyframeTrack;\n\n\t\tcase 'quaternion':\n\n\t\t\treturn QuaternionKeyframeTrack;\n\n\t\tcase 'bool':\n\t\tcase 'boolean':\n\n\t\t\treturn BooleanKeyframeTrack;\n\n\t\tcase 'string':\n\n\t\t\treturn StringKeyframeTrack;\n\n\t}\n\n\tthrow new Error( 'THREE.KeyframeTrack: Unsupported typeName: ' + typeName );\n\n}\n\nfunction parseKeyframeTrack( json ) {\n\n\tif ( json.type === undefined ) {\n\n\t\tthrow new Error( 'THREE.KeyframeTrack: track type undefined, can not parse' );\n\n\t}\n\n\tconst trackType = getTrackTypeForValueTypeName( json.type );\n\n\tif ( json.times === undefined ) {\n\n\t\tconst times = [], values = [];\n\n\t\tflattenJSON( json.keys, times, values, 'value' );\n\n\t\tjson.times = times;\n\t\tjson.values = values;\n\n\t}\n\n\t// derived classes can define a static parse method\n\tif ( trackType.parse !== undefined ) {\n\n\t\treturn trackType.parse( json );\n\n\t} else {\n\n\t\t// by default, we assume a constructor compatible with the base\n\t\treturn new trackType( json.name, json.times, json.values, json.interpolation );\n\n\t}\n\n}\n\n/**\n * @class\n * @classdesc A simple caching system, used internally by {@link FileLoader}.\n * To enable caching across all loaders that use {@link FileLoader}, add `THREE.Cache.enabled = true.` once in your app.\n * @hideconstructor\n */\nconst Cache = {\n\n\t/**\n\t * Whether caching is enabled or not.\n\t *\n\t * @static\n\t * @type {boolean}\n\t * @default false\n\t */\n\tenabled: false,\n\n\t/**\n\t * A dictionary that holds cached files.\n\t *\n\t * @static\n\t * @type {Object<string,Object>}\n\t */\n\tfiles: {},\n\n\t/**\n\t * Adds a cache entry with a key to reference the file. If this key already\n\t * holds a file, it is overwritten.\n\t *\n\t * @static\n\t * @param {string} key - The key to reference the cached file.\n\t * @param {Object} file -  The file to be cached.\n\t */\n\tadd: function ( key, file ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// log( 'Cache', 'Adding key:', key );\n\n\t\tthis.files[ key ] = file;\n\n\t},\n\n\t/**\n\t * Gets the cached value for the given key.\n\t *\n\t * @static\n\t * @param {string} key - The key to reference the cached file.\n\t * @return {Object|undefined} The cached file. If the key does not exist `undefined` is returned.\n\t */\n\tget: function ( key ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// log( 'Cache', 'Checking key:', key );\n\n\t\treturn this.files[ key ];\n\n\t},\n\n\t/**\n\t * Removes the cached file associated with the given key.\n\t *\n\t * @static\n\t * @param {string} key - The key to reference the cached file.\n\t */\n\tremove: function ( key ) {\n\n\t\tdelete this.files[ key ];\n\n\t},\n\n\t/**\n\t * Remove all values from the cache.\n\t *\n\t * @static\n\t */\n\tclear: function () {\n\n\t\tthis.files = {};\n\n\t}\n\n};\n\n/**\n * Handles and keeps track of loaded and pending data. A default global\n * instance of this class is created and used by loaders if not supplied\n * manually.\n *\n * In general that should be sufficient, however there are times when it can\n * be useful to have separate loaders - for example if you want to show\n * separate loading bars for objects and textures.\n *\n * ```js\n * const manager = new THREE.LoadingManager();\n * manager.onLoad = () => console.log( 'Loading complete!' );\n *\n * const loader1 = new OBJLoader( manager );\n * const loader2 = new ColladaLoader( manager );\n * ```\n */\nclass LoadingManager {\n\n\t/**\n\t * Constructs a new loading manager.\n\t *\n\t * @param {Function} [onLoad] - Executes when all items have been loaded.\n\t * @param {Function} [onProgress] - Executes when single items have been loaded.\n\t * @param {Function} [onError] - Executes when an error occurs.\n\t */\n\tconstructor( onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tlet isLoading = false;\n\t\tlet itemsLoaded = 0;\n\t\tlet itemsTotal = 0;\n\t\tlet urlModifier = undefined;\n\t\tconst handlers = [];\n\n\t\t// Refer to #5689 for the reason why we don't set .onStart\n\t\t// in the constructor\n\n\t\t/**\n\t\t * Executes when an item starts loading.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onStart = undefined;\n\n\t\t/**\n\t\t * Executes when all items have been loaded.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onLoad = onLoad;\n\n\t\t/**\n\t\t * Executes when single items have been loaded.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onProgress = onProgress;\n\n\t\t/**\n\t\t * Executes when an error occurs.\n\t\t *\n\t\t * @type {Function|undefined}\n\t\t * @default undefined\n\t\t */\n\t\tthis.onError = onError;\n\n\t\t/**\n\t\t * Used for aborting ongoing requests in loaders using this manager.\n\t\t *\n\t\t * @private\n\t\t * @type {AbortController | null}\n\t\t */\n\t\tthis._abortController = null;\n\n\t\t/**\n\t\t * This should be called by any loader using the manager when the loader\n\t\t * starts loading an item.\n\t\t *\n\t\t * @param {string} url - The URL to load.\n\t\t */\n\t\tthis.itemStart = function ( url ) {\n\n\t\t\titemsTotal ++;\n\n\t\t\tif ( isLoading === false ) {\n\n\t\t\t\tif ( scope.onStart !== undefined ) {\n\n\t\t\t\t\tscope.onStart( url, itemsLoaded, itemsTotal );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tisLoading = true;\n\n\t\t};\n\n\t\t/**\n\t\t * This should be called by any loader using the manager when the loader\n\t\t * ended loading an item.\n\t\t *\n\t\t * @param {string} url - The URL of the loaded item.\n\t\t */\n\t\tthis.itemEnd = function ( url ) {\n\n\t\t\titemsLoaded ++;\n\n\t\t\tif ( scope.onProgress !== undefined ) {\n\n\t\t\t\tscope.onProgress( url, itemsLoaded, itemsTotal );\n\n\t\t\t}\n\n\t\t\tif ( itemsLoaded === itemsTotal ) {\n\n\t\t\t\tisLoading = false;\n\n\t\t\t\tif ( scope.onLoad !== undefined ) {\n\n\t\t\t\t\tscope.onLoad();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * This should be called by any loader using the manager when the loader\n\t\t * encounters an error when loading an item.\n\t\t *\n\t\t * @param {string} url - The URL of the item that produces an error.\n\t\t */\n\t\tthis.itemError = function ( url ) {\n\n\t\t\tif ( scope.onError !== undefined ) {\n\n\t\t\t\tscope.onError( url );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Given a URL, uses the URL modifier callback (if any) and returns a\n\t\t * resolved URL. If no URL modifier is set, returns the original URL.\n\t\t *\n\t\t * @param {string} url - The URL to load.\n\t\t * @return {string} The resolved URL.\n\t\t */\n\t\tthis.resolveURL = function ( url ) {\n\n\t\t\tif ( urlModifier ) {\n\n\t\t\t\treturn urlModifier( url );\n\n\t\t\t}\n\n\t\t\treturn url;\n\n\t\t};\n\n\t\t/**\n\t\t * If provided, the callback will be passed each resource URL before a\n\t\t * request is sent. The callback may return the original URL, or a new URL to\n\t\t * override loading behavior. This behavior can be used to load assets from\n\t\t * .ZIP files, drag-and-drop APIs, and Data URIs.\n\t\t *\n\t\t * ```js\n\t\t * const blobs = {'fish.gltf': blob1, 'diffuse.png': blob2, 'normal.png': blob3};\n\t\t *\n\t\t * const manager = new THREE.LoadingManager();\n\t\t *\n\t\t * // Initialize loading manager with URL callback.\n\t\t * const objectURLs = [];\n\t\t * manager.setURLModifier( ( url ) => {\n\t\t *\n\t\t * \turl = URL.createObjectURL( blobs[ url ] );\n\t\t * \tobjectURLs.push( url );\n\t\t * \treturn url;\n\t\t *\n\t\t * } );\n\t\t *\n\t\t * // Load as usual, then revoke the blob URLs.\n\t\t * const loader = new GLTFLoader( manager );\n\t\t * loader.load( 'fish.gltf', (gltf) => {\n\t\t *\n\t\t * \tscene.add( gltf.scene );\n\t\t * \tobjectURLs.forEach( ( url ) => URL.revokeObjectURL( url ) );\n\t\t *\n\t\t * } );\n\t\t * ```\n\t\t *\n\t\t * @param {function(string):string} transform - URL modifier callback. Called with an URL and must return a resolved URL.\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.setURLModifier = function ( transform ) {\n\n\t\t\turlModifier = transform;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\t/**\n\t\t * Registers a loader with the given regular expression. Can be used to\n\t\t * define what loader should be used in order to load specific files. A\n\t\t * typical use case is to overwrite the default loader for textures.\n\t\t *\n\t\t * ```js\n\t\t * // add handler for TGA textures\n\t\t * manager.addHandler( /\\.tga$/i, new TGALoader() );\n\t\t * ```\n\t\t *\n\t\t * @param {string} regex - A regular expression.\n\t\t * @param {Loader} loader - A loader that should handle matched cases.\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.addHandler = function ( regex, loader ) {\n\n\t\t\thandlers.push( regex, loader );\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\t/**\n\t\t * Removes the loader for the given regular expression.\n\t\t *\n\t\t * @param {string} regex - A regular expression.\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.removeHandler = function ( regex ) {\n\n\t\t\tconst index = handlers.indexOf( regex );\n\n\t\t\tif ( index !== -1 ) {\n\n\t\t\t\thandlers.splice( index, 2 );\n\n\t\t\t}\n\n\t\t\treturn this;\n\n\t\t};\n\n\t\t/**\n\t\t * Can be used to retrieve the registered loader for the given file path.\n\t\t *\n\t\t * @param {string} file - The file path.\n\t\t * @return {?Loader} The registered loader. Returns `null` if no loader was found.\n\t\t */\n\t\tthis.getHandler = function ( file ) {\n\n\t\t\tfor ( let i = 0, l = handlers.length; i < l; i += 2 ) {\n\n\t\t\t\tconst regex = handlers[ i ];\n\t\t\t\tconst loader = handlers[ i + 1 ];\n\n\t\t\t\tif ( regex.global ) regex.lastIndex = 0; // see #17920\n\n\t\t\t\tif ( regex.test( file ) ) {\n\n\t\t\t\t\treturn loader;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t};\n\n\t\t/**\n\t\t * Can be used to abort ongoing loading requests in loaders using this manager.\n\t\t * The abort only works if the loaders implement {@link Loader#abort} and `AbortSignal.any()`\n\t\t * is supported in the browser.\n\t\t *\n\t\t * @return {LoadingManager} A reference to this loading manager.\n\t\t */\n\t\tthis.abort = function () {\n\n\n\t\t\tthis.abortController.abort();\n\t\t\tthis._abortController = null;\n\n\t\t\treturn this;\n\n\t\t};\n\n\t}\n\n\t// TODO: Revert this back to a single member variable once this issue has been fixed\n\t// https://github.com/cloudflare/workerd/issues/3657\n\n\t/**\n\t * Used for aborting ongoing requests in loaders using this manager.\n\t *\n\t * @type {AbortController}\n\t */\n\tget abortController() {\n\n\t\tif ( ! this._abortController ) {\n\n\t\t\tthis._abortController = new AbortController();\n\n\t\t}\n\n\t\treturn this._abortController;\n\n\t}\n\n}\n\n/**\n * The global default loading manager.\n *\n * @constant\n * @type {LoadingManager}\n */\nconst DefaultLoadingManager = /*@__PURE__*/ new LoadingManager();\n\n/**\n * Abstract base class for loaders.\n *\n * @abstract\n */\nclass Loader {\n\n\t/**\n\t * Constructs a new loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\t/**\n\t\t * The loading manager.\n\t\t *\n\t\t * @type {LoadingManager}\n\t\t * @default DefaultLoadingManager\n\t\t */\n\t\tthis.manager = ( manager !== undefined ) ? manager : DefaultLoadingManager;\n\n\t\t/**\n\t\t * The crossOrigin string to implement CORS for loading the url from a\n\t\t * different domain that allows CORS.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'anonymous'\n\t\t */\n\t\tthis.crossOrigin = 'anonymous';\n\n\t\t/**\n\t\t * Whether the XMLHttpRequest uses credentials.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.withCredentials = false;\n\n\t\t/**\n\t\t * The base path from which the asset will be loaded.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.path = '';\n\n\t\t/**\n\t\t * The base path from which additional resources like textures will be loaded.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.resourcePath = '';\n\n\t\t/**\n\t\t * The [request header](https://developer.mozilla.org/en-US/docs/Glossary/Request_header)\n\t\t * used in HTTP request.\n\t\t *\n\t\t * @type {Object<string, any>}\n\t\t */\n\t\tthis.requestHeader = {};\n\n\t}\n\n\t/**\n\t * This method needs to be implemented by all concrete loaders. It holds the\n\t * logic for loading assets from the backend.\n\t *\n\t * @abstract\n\t * @param {string} url - The path/URL of the file to be loaded.\n\t * @param {Function} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress.\n\t * @param {onErrorCallback} [onError] - Executed when errors occur.\n\t */\n\tload( /* url, onLoad, onProgress, onError */ ) {}\n\n\t/**\n\t * A async version of {@link Loader#load}.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded.\n\t * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress.\n\t * @return {Promise} A Promise that resolves when the asset has been loaded.\n\t */\n\tloadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.load( url, resolve, onProgress, reject );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * This method needs to be implemented by all concrete loaders. It holds the\n\t * logic for parsing the asset into three.js entities.\n\t *\n\t * @abstract\n\t * @param {any} data - The data to parse.\n\t */\n\tparse( /* data */ ) {}\n\n\t/**\n\t * Sets the `crossOrigin` String to implement CORS for loading the URL\n\t * from a different domain that allows CORS.\n\t *\n\t * @param {string} crossOrigin - The `crossOrigin` value.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetCrossOrigin( crossOrigin ) {\n\n\t\tthis.crossOrigin = crossOrigin;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Whether the XMLHttpRequest uses credentials such as cookies, authorization\n\t * headers or TLS client certificates, see [XMLHttpRequest.withCredentials](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/withCredentials).\n\t *\n\t * Note: This setting has no effect if you are loading files locally or from the same domain.\n\t *\n\t * @param {boolean} value - The `withCredentials` value.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetWithCredentials( value ) {\n\n\t\tthis.withCredentials = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the base path for the asset.\n\t *\n\t * @param {string} path - The base path.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetPath( path ) {\n\n\t\tthis.path = path;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the base path for dependent resources like textures.\n\t *\n\t * @param {string} resourcePath - The resource path.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetResourcePath( resourcePath ) {\n\n\t\tthis.resourcePath = resourcePath;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given request header.\n\t *\n\t * @param {Object} requestHeader - A [request header](https://developer.mozilla.org/en-US/docs/Glossary/Request_header)\n\t * for configuring the HTTP request.\n\t * @return {Loader} A reference to this instance.\n\t */\n\tsetRequestHeader( requestHeader ) {\n\n\t\tthis.requestHeader = requestHeader;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This method can be implemented in loaders for aborting ongoing requests.\n\t *\n\t * @abstract\n\t * @return {Loader} A reference to this instance.\n\t */\n\tabort() {\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Callback for onProgress in loaders.\n *\n * @callback onProgressCallback\n * @param {ProgressEvent} event - An instance of `ProgressEvent` that represents the current loading status.\n */\n\n/**\n * Callback for onError in loaders.\n *\n * @callback onErrorCallback\n * @param {Error} error - The error which occurred during the loading process.\n */\n\n/**\n * The default material name that is used by loaders\n * when creating materials for loaded 3D objects.\n *\n * Note: Not all loaders might honor this setting.\n *\n * @static\n * @type {string}\n * @default '__DEFAULT'\n */\nLoader.DEFAULT_MATERIAL_NAME = '__DEFAULT';\n\nconst loading = {};\n\nclass HttpError extends Error {\n\n\tconstructor( message, response ) {\n\n\t\tsuper( message );\n\t\tthis.response = response;\n\n\t}\n\n}\n\n/**\n * A low level class for loading resources with the Fetch API, used internally by\n * most loaders. It can also be used directly to load any file type that does\n * not have a loader.\n *\n * This loader supports caching. If you want to use it, add `THREE.Cache.enabled = true;`\n * once to your application.\n *\n * ```js\n * const loader = new THREE.FileLoader();\n * const data = await loader.loadAsync( 'example.txt' );\n * ```\n *\n * @augments Loader\n */\nclass FileLoader extends Loader {\n\n\t/**\n\t * Constructs a new file loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * The expected mime type. Valid values can be found\n\t\t * [here](hhttps://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString#mimetype)\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.mimeType = '';\n\n\t\t/**\n\t\t * The expected response type.\n\t\t *\n\t\t * @type {('arraybuffer'|'blob'|'document'|'json'|'')}\n\t\t * @default ''\n\t\t */\n\t\tthis.responseType = '';\n\n\t\t/**\n\t\t * Used for aborting requests.\n\t\t *\n\t\t * @private\n\t\t * @type {AbortController}\n\t\t */\n\t\tthis._abortController = new AbortController();\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded response to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(any)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress.\n\t * @param {onErrorCallback} [onError] - Executed when errors occur.\n\t * @return {any|undefined} The cached resource if available.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst cached = Cache.get( `file:${url}` );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tthis.manager.itemStart( url );\n\n\t\t\tsetTimeout( () => {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tthis.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\t// Check if request is duplicate\n\n\t\tif ( loading[ url ] !== undefined ) {\n\n\t\t\tloading[ url ].push( {\n\n\t\t\t\tonLoad: onLoad,\n\t\t\t\tonProgress: onProgress,\n\t\t\t\tonError: onError\n\n\t\t\t} );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// Initialise array for duplicate requests\n\t\tloading[ url ] = [];\n\n\t\tloading[ url ].push( {\n\t\t\tonLoad: onLoad,\n\t\t\tonProgress: onProgress,\n\t\t\tonError: onError,\n\t\t} );\n\n\t\t// create request\n\t\tconst req = new Request( url, {\n\t\t\theaders: new Headers( this.requestHeader ),\n\t\t\tcredentials: this.withCredentials ? 'include' : 'same-origin',\n\t\t\tsignal: ( typeof AbortSignal.any === 'function' ) ? AbortSignal.any( [ this._abortController.signal, this.manager.abortController.signal ] ) : this._abortController.signal\n\t\t} );\n\n\t\t// record states ( avoid data race )\n\t\tconst mimeType = this.mimeType;\n\t\tconst responseType = this.responseType;\n\n\t\t// start the fetch\n\t\tfetch( req )\n\t\t\t.then( response => {\n\n\t\t\t\tif ( response.status === 200 || response.status === 0 ) {\n\n\t\t\t\t\t// Some browsers return HTTP Status 0 when using non-http protocol\n\t\t\t\t\t// e.g. 'file://' or 'data://'. Handle as success.\n\n\t\t\t\t\tif ( response.status === 0 ) {\n\n\t\t\t\t\t\twarn( 'FileLoader: HTTP Status 0 received.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Workaround: Checking if response.body === undefined for Alipay browser #23548\n\n\t\t\t\t\tif ( typeof ReadableStream === 'undefined' || response.body === undefined || response.body.getReader === undefined ) {\n\n\t\t\t\t\t\treturn response;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\t\tconst reader = response.body.getReader();\n\n\t\t\t\t\t// Nginx needs X-File-Size check\n\t\t\t\t\t// https://serverfault.com/questions/482875/why-does-nginx-remove-content-length-header-for-chunked-content\n\t\t\t\t\tconst contentLength = response.headers.get( 'X-File-Size' ) || response.headers.get( 'Content-Length' );\n\t\t\t\t\tconst total = contentLength ? parseInt( contentLength ) : 0;\n\t\t\t\t\tconst lengthComputable = total !== 0;\n\t\t\t\t\tlet loaded = 0;\n\n\t\t\t\t\t// periodically read data into the new stream tracking while download progress\n\t\t\t\t\tconst stream = new ReadableStream( {\n\t\t\t\t\t\tstart( controller ) {\n\n\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\tfunction readData() {\n\n\t\t\t\t\t\t\t\treader.read().then( ( { done, value } ) => {\n\n\t\t\t\t\t\t\t\t\tif ( done ) {\n\n\t\t\t\t\t\t\t\t\t\tcontroller.close();\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tloaded += value.byteLength;\n\n\t\t\t\t\t\t\t\t\t\tconst event = new ProgressEvent( 'progress', { lengthComputable, loaded, total } );\n\t\t\t\t\t\t\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\t\t\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\t\t\t\t\t\t\tif ( callback.onProgress ) callback.onProgress( event );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tcontroller.enqueue( value );\n\t\t\t\t\t\t\t\t\t\treadData();\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}, ( e ) => {\n\n\t\t\t\t\t\t\t\t\tcontroller.error( e );\n\n\t\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\treturn new Response( stream );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new HttpError( `fetch for \"${response.url}\" responded with ${response.status}: ${response.statusText}`, response );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( response => {\n\n\t\t\t\tswitch ( responseType ) {\n\n\t\t\t\t\tcase 'arraybuffer':\n\n\t\t\t\t\t\treturn response.arrayBuffer();\n\n\t\t\t\t\tcase 'blob':\n\n\t\t\t\t\t\treturn response.blob();\n\n\t\t\t\t\tcase 'document':\n\n\t\t\t\t\t\treturn response.text()\n\t\t\t\t\t\t\t.then( text => {\n\n\t\t\t\t\t\t\t\tconst parser = new DOMParser();\n\t\t\t\t\t\t\t\treturn parser.parseFromString( text, mimeType );\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\tcase 'json':\n\n\t\t\t\t\t\treturn response.json();\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( mimeType === '' ) {\n\n\t\t\t\t\t\t\treturn response.text();\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// sniff encoding\n\t\t\t\t\t\t\tconst re = /charset=\"?([^;\"\\s]*)\"?/i;\n\t\t\t\t\t\t\tconst exec = re.exec( mimeType );\n\t\t\t\t\t\t\tconst label = exec && exec[ 1 ] ? exec[ 1 ].toLowerCase() : undefined;\n\t\t\t\t\t\t\tconst decoder = new TextDecoder( label );\n\t\t\t\t\t\t\treturn response.arrayBuffer().then( ab => decoder.decode( ab ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.then( data => {\n\n\t\t\t\t// Add to cache only on HTTP success, so that we do not cache\n\t\t\t\t// error response bodies as proper responses to requests.\n\t\t\t\tCache.add( `file:${url}`, data );\n\n\t\t\t\tconst callbacks = loading[ url ];\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onLoad ) callback.onLoad( data );\n\n\t\t\t\t}\n\n\t\t\t} )\n\t\t\t.catch( err => {\n\n\t\t\t\t// Abort errors and other errors are handled the same\n\n\t\t\t\tconst callbacks = loading[ url ];\n\n\t\t\t\tif ( callbacks === undefined ) {\n\n\t\t\t\t\t// When onLoad was called and url was deleted in `loading`\n\t\t\t\t\tthis.manager.itemError( url );\n\t\t\t\t\tthrow err;\n\n\t\t\t\t}\n\n\t\t\t\tdelete loading[ url ];\n\n\t\t\t\tfor ( let i = 0, il = callbacks.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\t\tif ( callback.onError ) callback.onError( err );\n\n\t\t\t\t}\n\n\t\t\t\tthis.manager.itemError( url );\n\n\t\t\t} )\n\t\t\t.finally( () => {\n\n\t\t\t\tthis.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\tthis.manager.itemStart( url );\n\n\t}\n\n\t/**\n\t * Sets the expected response type.\n\t *\n\t * @param {('arraybuffer'|'blob'|'document'|'json'|'')} value - The response type.\n\t * @return {FileLoader} A reference to this file loader.\n\t */\n\tsetResponseType( value ) {\n\n\t\tthis.responseType = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the expected mime type of the loaded file.\n\t *\n\t * @param {string} value - The mime type.\n\t * @return {FileLoader} A reference to this file loader.\n\t */\n\tsetMimeType( value ) {\n\n\t\tthis.mimeType = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Aborts ongoing fetch requests.\n\t *\n\t * @return {FileLoader} A reference to this instance.\n\t */\n\tabort() {\n\n\t\tthis._abortController.abort();\n\t\tthis._abortController = new AbortController();\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Class for loading animation clips in the JSON format. The files are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.AnimationLoader();\n * const animations = await loader.loadAsync( 'animations/animation.js' );\n * ```\n *\n * @augments Loader\n */\nclass AnimationLoader extends Loader {\n\n\t/**\n\t * Constructs a new animation loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded animations as an array\n\t * holding instances of {@link AnimationClip} to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Array<AnimationClip>)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given JSON object and returns an array of animation clips.\n\t *\n\t * @param {Object} json - The serialized animation clips.\n\t * @return {Array<AnimationClip>} The parsed animation clips.\n\t */\n\tparse( json ) {\n\n\t\tconst animations = [];\n\n\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\tconst clip = AnimationClip.parse( json[ i ] );\n\n\t\t\tanimations.push( clip );\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n}\n\n/**\n * Abstract base class for loading compressed texture formats S3TC, ASTC or ETC.\n * Textures are internally loaded via {@link FileLoader}.\n *\n * Derived classes have to implement the `parse()` method which holds the parsing\n * for the respective format.\n *\n * @abstract\n * @augments Loader\n */\nclass CompressedTextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new compressed texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded compressed texture\n\t * to the `onLoad()` callback. The method also returns a new texture object which can\n\t * directly be used for material creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(CompressedTexture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {CompressedTexture} The compressed texture.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst images = [];\n\n\t\tconst texture = new CompressedTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( url[ i ], function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\timages[ i ] = {\n\t\t\t\t\twidth: texDatas.width,\n\t\t\t\t\theight: texDatas.height,\n\t\t\t\t\tformat: texDatas.format,\n\t\t\t\t\tmipmaps: texDatas.mipmaps\n\t\t\t\t};\n\n\t\t\t\tloaded += 1;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\tif ( texDatas.mipmapCount === 1 ) texture.minFilter = LinearFilter;\n\n\t\t\t\t\ttexture.image = images;\n\t\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\tif ( Array.isArray( url ) ) {\n\n\t\t\tfor ( let i = 0, il = url.length; i < il; ++ i ) {\n\n\t\t\t\tloadTexture( i );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// compressed cubemap texture stored in a single DDS file\n\n\t\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t\tconst texDatas = scope.parse( buffer, true );\n\n\t\t\t\tif ( texDatas.isCubemap ) {\n\n\t\t\t\t\tconst faces = texDatas.mipmaps.length / texDatas.mipmapCount;\n\n\t\t\t\t\tfor ( let f = 0; f < faces; f ++ ) {\n\n\t\t\t\t\t\timages[ f ] = { mipmaps: [] };\n\n\t\t\t\t\t\tfor ( let i = 0; i < texDatas.mipmapCount; i ++ ) {\n\n\t\t\t\t\t\t\timages[ f ].mipmaps.push( texDatas.mipmaps[ f * texDatas.mipmapCount + i ] );\n\t\t\t\t\t\t\timages[ f ].format = texDatas.format;\n\t\t\t\t\t\t\timages[ f ].width = texDatas.width;\n\t\t\t\t\t\t\timages[ f ].height = texDatas.height;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.image = images;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture.image.width = texDatas.width;\n\t\t\t\t\ttexture.image.height = texDatas.height;\n\t\t\t\t\ttexture.mipmaps = texDatas.mipmaps;\n\n\t\t\t\t}\n\n\t\t\t\tif ( texDatas.mipmapCount === 1 ) {\n\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\ttexture.format = texDatas.format;\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n}\n\nconst _loading = new WeakMap();\n\n/**\n * A loader for loading images. The class loads images with the HTML `Image` API.\n *\n * ```js\n * const loader = new THREE.ImageLoader();\n * const image = await loader.loadAsync( 'image.png' );\n * ```\n * Please note that `ImageLoader` has dropped support for progress\n * events in `r84`. For an `ImageLoader` that supports progress events, see\n * [this thread](https://github.com/mrdoob/three.js/issues/10439#issuecomment-275785639).\n *\n * @augments Loader\n */\nclass ImageLoader extends Loader {\n\n\t/**\n\t * Constructs a new image loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded image\n\t * to the `onLoad()` callback. The method also returns a new `Image` object which can\n\t * directly be used for texture creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Image)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {Image} The image.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( `image:${url}` );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tif ( cached.complete === true ) {\n\n\t\t\t\tscope.manager.itemStart( url );\n\n\t\t\t\tsetTimeout( function () {\n\n\t\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tlet arr = _loading.get( cached );\n\n\t\t\t\tif ( arr === undefined ) {\n\n\t\t\t\t\tarr = [];\n\t\t\t\t\t_loading.set( cached, arr );\n\n\t\t\t\t}\n\n\t\t\t\tarr.push( { onLoad, onError } );\n\n\t\t\t}\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst image = createElementNS( 'img' );\n\n\t\tfunction onImageLoad() {\n\n\t\t\tremoveEventListeners();\n\n\t\t\tif ( onLoad ) onLoad( this );\n\n\t\t\t//\n\n\t\t\tconst callbacks = _loading.get( this ) || [];\n\n\t\t\tfor ( let i = 0; i < callbacks.length; i ++ ) {\n\n\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\tif ( callback.onLoad ) callback.onLoad( this );\n\n\t\t\t}\n\n\t\t\t_loading.delete( this );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction onImageError( event ) {\n\n\t\t\tremoveEventListeners();\n\n\t\t\tif ( onError ) onError( event );\n\n\t\t\tCache.remove( `image:${url}` );\n\n\t\t\t//\n\n\t\t\tconst callbacks = _loading.get( this ) || [];\n\n\t\t\tfor ( let i = 0; i < callbacks.length; i ++ ) {\n\n\t\t\t\tconst callback = callbacks[ i ];\n\t\t\t\tif ( callback.onError ) callback.onError( event );\n\n\t\t\t}\n\n\t\t\t_loading.delete( this );\n\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t}\n\n\t\tfunction removeEventListeners() {\n\n\t\t\timage.removeEventListener( 'load', onImageLoad, false );\n\t\t\timage.removeEventListener( 'error', onImageError, false );\n\n\t\t}\n\n\t\timage.addEventListener( 'load', onImageLoad, false );\n\t\timage.addEventListener( 'error', onImageError, false );\n\n\t\tif ( url.slice( 0, 5 ) !== 'data:' ) {\n\n\t\t\tif ( this.crossOrigin !== undefined ) image.crossOrigin = this.crossOrigin;\n\n\t\t}\n\n\t\tCache.add( `image:${url}`, image );\n\t\tscope.manager.itemStart( url );\n\n\t\timage.src = url;\n\n\t\treturn image;\n\n\t}\n\n}\n\n/**\n * Class for loading cube textures. Images are internally loaded via {@link ImageLoader}.\n *\n * The loader returns an instance of {@link CubeTexture} and expects the cube map to\n * be defined as six separate images representing the sides of a cube. Other cube map definitions\n * like vertical and horizontal cross, column and row layouts are not supported.\n *\n * Note that, by convention, cube maps are specified in a coordinate system\n * in which positive-x is to the right when looking up the positive-z axis --\n * in other words, using a left-handed coordinate system. Since three.js uses\n * a right-handed coordinate system, environment maps used in three.js will\n * have pos-x and neg-x swapped.\n *\n * The loaded cube texture is in sRGB color space. Meaning {@link Texture#colorSpace}\n * is set to `SRGBColorSpace` by default.\n *\n * ```js\n * const loader = new THREE.CubeTextureLoader().setPath( 'textures/cubeMaps/' );\n * const cubeTexture = await loader.loadAsync( [\n * \t'px.png', 'nx.png', 'py.png', 'ny.png', 'pz.png', 'nz.png'\n * ] );\n * scene.background = cubeTexture;\n * ```\n *\n * @augments Loader\n */\nclass CubeTextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new cube texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the fully loaded cube texture\n\t * to the `onLoad()` callback. The method also returns a new cube texture object which can\n\t * directly be used for material creation. If you do it this way, the cube texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {Array<string>} urls - Array of 6 URLs to images, one for each side of the\n\t * cube texture. The urls should be specified in the following order: pos-x,\n\t * neg-x, pos-y, neg-y, pos-z, neg-z. An array of data URIs are allowed as well.\n\t * @param {function(CubeTexture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {CubeTexture} The cube texture.\n\t */\n\tload( urls, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new CubeTexture();\n\t\ttexture.colorSpace = SRGBColorSpace;\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadTexture( i ) {\n\n\t\t\tloader.load( urls[ i ], function ( image ) {\n\n\t\t\t\ttexture.images[ i ] = image;\n\n\t\t\t\tloaded ++;\n\n\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t}\n\n\t\t\t}, undefined, onError );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < urls.length; ++ i ) {\n\n\t\t\tloadTexture( i );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Abstract base class for loading binary texture formats RGBE, EXR or TGA.\n * Textures are internally loaded via {@link FileLoader}.\n *\n * Derived classes have to implement the `parse()` method which holds the parsing\n * for the respective format.\n *\n * @abstract\n * @augments Loader\n */\nclass DataTextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new data texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded data texture\n\t * to the `onLoad()` callback. The method also returns a new texture object which can\n\t * directly be used for material creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(DataTexture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {DataTexture} The data texture.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst texture = new DataTexture();\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setPath( this.path );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\tlet texData;\n\n\t\t\ttry {\n\n\t\t\t\ttexData = scope.parse( buffer );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) {\n\n\t\t\t\t\tonError( error );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( error );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texData.image !== undefined ) {\n\n\t\t\t\ttexture.image = texData.image;\n\n\t\t\t} else if ( texData.data !== undefined ) {\n\n\t\t\t\ttexture.image.width = texData.width;\n\t\t\t\ttexture.image.height = texData.height;\n\t\t\t\ttexture.image.data = texData.data;\n\n\t\t\t}\n\n\t\t\ttexture.wrapS = texData.wrapS !== undefined ? texData.wrapS : ClampToEdgeWrapping;\n\t\t\ttexture.wrapT = texData.wrapT !== undefined ? texData.wrapT : ClampToEdgeWrapping;\n\n\t\t\ttexture.magFilter = texData.magFilter !== undefined ? texData.magFilter : LinearFilter;\n\t\t\ttexture.minFilter = texData.minFilter !== undefined ? texData.minFilter : LinearFilter;\n\n\t\t\ttexture.anisotropy = texData.anisotropy !== undefined ? texData.anisotropy : 1;\n\n\t\t\tif ( texData.colorSpace !== undefined ) {\n\n\t\t\t\ttexture.colorSpace = texData.colorSpace;\n\n\t\t\t}\n\n\t\t\tif ( texData.flipY !== undefined ) {\n\n\t\t\t\ttexture.flipY = texData.flipY;\n\n\t\t\t}\n\n\t\t\tif ( texData.format !== undefined ) {\n\n\t\t\t\ttexture.format = texData.format;\n\n\t\t\t}\n\n\t\t\tif ( texData.type !== undefined ) {\n\n\t\t\t\ttexture.type = texData.type;\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmaps !== undefined ) {\n\n\t\t\t\ttexture.mipmaps = texData.mipmaps;\n\t\t\t\ttexture.minFilter = LinearMipmapLinearFilter; // presumably...\n\n\t\t\t}\n\n\t\t\tif ( texData.mipmapCount === 1 ) {\n\n\t\t\t\ttexture.minFilter = LinearFilter;\n\n\t\t\t}\n\n\t\t\tif ( texData.generateMipmaps !== undefined ) {\n\n\t\t\t\ttexture.generateMipmaps = texData.generateMipmaps;\n\n\t\t\t}\n\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}, onProgress, onError );\n\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Class for loading textures. Images are internally\n * loaded via {@link ImageLoader}.\n *\n * ```js\n * const loader = new THREE.TextureLoader();\n * const texture = await loader.loadAsync( 'textures/land_ocean_ice_cloud_2048.jpg' );\n *\n * const material = new THREE.MeshBasicMaterial( { map:texture } );\n * ```\n * Please note that `TextureLoader` has dropped support for progress\n * events in `r84`. For a `TextureLoader` that supports progress events, see\n * [this thread](https://github.com/mrdoob/three.js/issues/10439#issuecomment-293260145).\n *\n * @augments Loader\n */\nclass TextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the fully loaded texture\n\t * to the `onLoad()` callback. The method also returns a new texture object which can\n\t * directly be used for material creation. If you do it this way, the texture\n\t * may pop up in your scene once the respective loading process is finished.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Texture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {Texture} The texture.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new Texture();\n\n\t\tconst loader = new ImageLoader( this.manager );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setPath( this.path );\n\n\t\tloader.load( url, function ( image ) {\n\n\t\t\ttexture.image = image;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\tonLoad( texture );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Abstract base class for lights - all other light types inherit the\n * properties and methods described here.\n *\n * @abstract\n * @augments Object3D\n */\nclass Light extends Object3D {\n\n\t/**\n\t * Constructs a new light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( color, intensity = 1 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLight = true;\n\n\t\tthis.type = 'Light';\n\n\t\t/**\n\t\t * The light's color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color( color );\n\n\t\t/**\n\t\t * The light's intensity.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.intensity = intensity;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.color.copy( source.color );\n\t\tthis.intensity = source.intensity;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.color = this.color.getHex();\n\t\tdata.object.intensity = this.intensity;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * A light source positioned directly above the scene, with color fading from\n * the sky color to the ground color.\n *\n * This light cannot be used to cast shadows.\n *\n * ```js\n * const light = new THREE.HemisphereLight( 0xffffbb, 0x080820, 1 );\n * scene.add( light );\n * ```\n *\n * @augments Light\n */\nclass HemisphereLight extends Light {\n\n\t/**\n\t * Constructs a new hemisphere light.\n\t *\n\t * @param {(number|Color|string)} [skyColor=0xffffff] - The light's sky color.\n\t * @param {(number|Color|string)} [groundColor=0xffffff] - The light's ground color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( skyColor, groundColor, intensity ) {\n\n\t\tsuper( skyColor, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isHemisphereLight = true;\n\n\t\tthis.type = 'HemisphereLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\t/**\n\t\t * The light's ground color.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.groundColor = new Color( groundColor );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.groundColor.copy( source.groundColor );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.groundColor = this.groundColor.getHex();\n\n\t\treturn data;\n\n\t}\n\n}\n\nconst _projScreenMatrix = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld = /*@__PURE__*/ new Vector3();\nconst _lookTarget = /*@__PURE__*/ new Vector3();\n\n/**\n * Abstract base class for light shadow classes. These classes\n * represent the shadow configuration for different light types.\n *\n * @abstract\n */\nclass LightShadow {\n\n\t/**\n\t * Constructs a new light shadow.\n\t *\n\t * @param {Camera} camera - The light's view of the world.\n\t */\n\tconstructor( camera ) {\n\n\t\t/**\n\t\t * The light's view of the world.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = camera;\n\n\t\t/**\n\t\t * The intensity of the shadow. The default is `1`.\n\t\t * Valid values are in the range `[0, 1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.intensity = 1;\n\n\t\t/**\n\t\t * Shadow map bias, how much to add or subtract from the normalized depth\n\t\t * when deciding whether a surface is in shadow.\n\t\t *\n\t\t * The default is `0`. Very tiny adjustments here (in the order of `0.0001`)\n\t\t * may help reduce artifacts in shadows.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.bias = 0;\n\n\t\t/**\n\t\t * Defines how much the position used to query the shadow map is offset along\n\t\t * the object normal. The default is `0`. Increasing this value can be used to\n\t\t * reduce shadow acne especially in large scenes where light shines onto\n\t\t * geometry at a shallow angle. The cost is that shadows may appear distorted.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.normalBias = 0;\n\n\t\t/**\n\t\t * Setting this to values greater than 1 will blur the edges of the shadow.\n\t\t * High values will cause unwanted banding effects in the shadows - a greater\n\t\t * map size will allow for a higher value to be used here before these effects\n\t\t * become visible.\n\t\t *\n\t\t * The property has no effect when the shadow map type is `BasicShadowMap`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.radius = 1;\n\n\t\t/**\n\t\t * The amount of samples to use when blurring a VSM shadow map.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 8\n\t\t */\n\t\tthis.blurSamples = 8;\n\n\t\t/**\n\t\t * Defines the width and height of the shadow map. Higher values give better quality\n\t\t * shadows at the cost of computation time. Values must be powers of two.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (512,512)\n\t\t */\n\t\tthis.mapSize = new Vector2( 512, 512 );\n\n\t\t/**\n\t\t * The type of shadow texture. The default is `UnsignedByteType`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default UnsignedByteType\n\t\t */\n\t\tthis.mapType = UnsignedByteType;\n\n\t\t/**\n\t\t * The depth map generated using the internal camera; a location beyond a\n\t\t * pixel's depth is in shadow. Computed internally during rendering.\n\t\t *\n\t\t * @type {?RenderTarget}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * The distribution map generated using the internal camera; an occlusion is\n\t\t * calculated based on the distribution of depths. Computed internally during\n\t\t * rendering.\n\t\t *\n\t\t * @type {?RenderTarget}\n\t\t * @default null\n\t\t */\n\t\tthis.mapPass = null;\n\n\t\t/**\n\t\t * Model to shadow camera space, to compute location and depth in shadow map.\n\t\t * This is computed internally during rendering.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.matrix = new Matrix4();\n\n\t\t/**\n\t\t * Enables automatic updates of the light's shadow. If you do not require dynamic\n\t\t * lighting / shadows, you may set this to `false`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoUpdate = true;\n\n\t\t/**\n\t\t * When set to `true`, shadow maps will be updated in the next `render` call.\n\t\t * If you have set {@link LightShadow#autoUpdate} to `false`, you will need to\n\t\t * set this property to `true` and then make a render call to update the light's shadow.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsUpdate = false;\n\n\t\tthis._frustum = new Frustum();\n\t\tthis._frameExtents = new Vector2( 1, 1 );\n\n\t\tthis._viewportCount = 1;\n\n\t\tthis._viewports = [\n\n\t\t\tnew Vector4( 0, 0, 1, 1 )\n\n\t\t];\n\n\t}\n\n\t/**\n\t * Used internally by the renderer to get the number of viewports that need\n\t * to be rendered for this shadow.\n\t *\n\t * @return {number} The viewport count.\n\t */\n\tgetViewportCount() {\n\n\t\treturn this._viewportCount;\n\n\t}\n\n\t/**\n\t * Gets the shadow cameras frustum. Used internally by the renderer to cull objects.\n\t *\n\t * @return {Frustum} The shadow camera frustum.\n\t */\n\tgetFrustum() {\n\n\t\treturn this._frustum;\n\n\t}\n\n\t/**\n\t * Update the matrices for the camera and shadow, used internally by the renderer.\n\t *\n\t * @param {Light} light - The light for which the shadow is being rendered.\n\t */\n\tupdateMatrices( light ) {\n\n\t\tconst shadowCamera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\tshadowCamera.position.copy( _lightPositionWorld );\n\n\t\t_lookTarget.setFromMatrixPosition( light.target.matrixWorld );\n\t\tshadowCamera.lookAt( _lookTarget );\n\t\tshadowCamera.updateMatrixWorld();\n\n\t\t_projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix, shadowCamera.coordinateSystem, shadowCamera.reversedDepth );\n\n\t\tif ( shadowCamera.reversedDepth ) {\n\n\t\t\tshadowMatrix.set(\n\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t0.0, 0.0, 1.0, 0.0,\n\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tshadowMatrix.set(\n\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t);\n\n\t\t}\n\n\t\tshadowMatrix.multiply( _projScreenMatrix );\n\n\t}\n\n\t/**\n\t * Returns a viewport definition for the given viewport index.\n\t *\n\t * @param {number} viewportIndex - The viewport index.\n\t * @return {Vector4} The viewport.\n\t */\n\tgetViewport( viewportIndex ) {\n\n\t\treturn this._viewports[ viewportIndex ];\n\n\t}\n\n\t/**\n\t * Returns the frame extends.\n\t *\n\t * @return {Vector2} The frame extends.\n\t */\n\tgetFrameExtents() {\n\n\t\treturn this._frameExtents;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tif ( this.map ) {\n\n\t\t\tthis.map.dispose();\n\n\t\t}\n\n\t\tif ( this.mapPass ) {\n\n\t\t\tthis.mapPass.dispose();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Copies the values of the given light shadow instance to this instance.\n\t *\n\t * @param {LightShadow} source - The light shadow to copy.\n\t * @return {LightShadow} A reference to this light shadow instance.\n\t */\n\tcopy( source ) {\n\n\t\tthis.camera = source.camera.clone();\n\n\t\tthis.intensity = source.intensity;\n\n\t\tthis.bias = source.bias;\n\t\tthis.radius = source.radius;\n\n\t\tthis.autoUpdate = source.autoUpdate;\n\t\tthis.needsUpdate = source.needsUpdate;\n\t\tthis.normalBias = source.normalBias;\n\t\tthis.blurSamples = source.blurSamples;\n\n\t\tthis.mapSize.copy( source.mapSize );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new light shadow instance with copied values from this instance.\n\t *\n\t * @return {LightShadow} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Serializes the light shadow into JSON.\n\t *\n\t * @return {Object} A JSON object representing the serialized light shadow.\n\t * @see {@link ObjectLoader#parse}\n\t */\n\ttoJSON() {\n\n\t\tconst object = {};\n\n\t\tif ( this.intensity !== 1 ) object.intensity = this.intensity;\n\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\tif ( this.normalBias !== 0 ) object.normalBias = this.normalBias;\n\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\tdelete object.camera.matrix;\n\n\t\treturn object;\n\n\t}\n\n}\n\n/**\n * Represents the shadow configuration of directional lights.\n *\n * @augments LightShadow\n */\nclass SpotLightShadow extends LightShadow {\n\n\t/**\n\t * Constructs a new spot light shadow.\n\t */\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 50, 1, 0.5, 500 ) );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSpotLightShadow = true;\n\n\t\t/**\n\t\t * Used to focus the shadow camera. The camera's field of view is set as a\n\t\t * percentage of the spotlight's field-of-view. Range is `[0, 1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.focus = 1;\n\n\t\t/**\n\t\t * Texture aspect ratio.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aspect = 1;\n\n\t}\n\n\tupdateMatrices( light ) {\n\n\t\tconst camera = this.camera;\n\n\t\tconst fov = RAD2DEG * 2 * light.angle * this.focus;\n\t\tconst aspect = ( this.mapSize.width / this.mapSize.height ) * this.aspect;\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( fov !== camera.fov || aspect !== camera.aspect || far !== camera.far ) {\n\n\t\t\tcamera.fov = fov;\n\t\t\tcamera.aspect = aspect;\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\tsuper.updateMatrices( light );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.focus = source.focus;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This light gets emitted from a single point in one direction, along a cone\n * that increases in size the further from the light it gets.\n *\n * This light can cast shadows - see the {@link SpotLightShadow} for details.\n *\n * ```js\n * // white spotlight shining from the side, modulated by a texture\n * const spotLight = new THREE.SpotLight( 0xffffff );\n * spotLight.position.set( 100, 1000, 100 );\n * spotLight.map = new THREE.TextureLoader().load( url );\n *\n * spotLight.castShadow = true;\n * spotLight.shadow.mapSize.width = 1024;\n * spotLight.shadow.mapSize.height = 1024;\n * spotLight.shadow.camera.near = 500;\n * spotLight.shadow.camera.far = 4000;\n * spotLight.shadow.camera.fov = 30;s\n * ```\n *\n * @augments Light\n */\nclass SpotLight extends Light {\n\n\t/**\n\t * Constructs a new spot light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity measured in candela (cd).\n\t * @param {number} [distance=0] - Maximum range of the light. `0` means no limit.\n\t * @param {number} [angle=Math.PI/3] - Maximum angle of light dispersion from its direction whose upper bound is `Math.PI/2`.\n\t * @param {number} [penumbra=0] - Percent of the spotlight cone that is attenuated due to penumbra. Value range is `[0,1]`.\n\t * @param {number} [decay=2] - The amount the light dims along the distance of the light.\n\t */\n\tconstructor( color, intensity, distance = 0, angle = Math.PI / 3, penumbra = 0, decay = 2 ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSpotLight = true;\n\n\t\tthis.type = 'SpotLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\t/**\n\t\t * The spot light points from its position to the\n\t\t * target's position.\n\t\t *\n\t\t * For the target's position to be changed to anything other\n\t\t * than the default, it must be added to the scene.\n\t\t *\n\t\t * It is also possible to set the target to be another 3D object\n\t\t * in the scene. The light will now track the target object.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.target = new Object3D();\n\n\t\t/**\n\t\t * Maximum range of the light. `0` means no limit.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.distance = distance;\n\n\t\t/**\n\t\t * Maximum angle of light dispersion from its direction whose upper bound is `Math.PI/2`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Math.PI/3\n\t\t */\n\t\tthis.angle = angle;\n\n\t\t/**\n\t\t * Percent of the spotlight cone that is attenuated due to penumbra.\n\t\t * Value range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.penumbra = penumbra;\n\n\t\t/**\n\t\t * The amount the light dims along the distance of the light. In context of\n\t\t * physically-correct rendering the default value should not be changed.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2\n\t\t */\n\t\tthis.decay = decay;\n\n\t\t/**\n\t\t * A texture used to modulate the color of the light. The spot light\n\t\t * color is mixed with the RGB value of this texture, with a ratio\n\t\t * corresponding to its alpha value. The cookie-like masking effect is\n\t\t * reproduced using pixel values (0, 0, 0, 1-cookie_value).\n\t\t *\n\t\t * *Warning*: This property is disabled if {@link Object3D#castShadow} is set to `false`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.map = null;\n\n\t\t/**\n\t\t * This property holds the light's shadow configuration.\n\t\t *\n\t\t * @type {SpotLightShadow}\n\t\t */\n\t\tthis.shadow = new SpotLightShadow();\n\n\t}\n\n\t/**\n\t * The light's power. Power is the luminous power of the light measured in lumens (lm).\n\t *  Changing the power will also change the light's intensity.\n\t *\n\t * @type {number}\n\t */\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// by convention for a spotlight, luminous power (lm) = \u03C0 * luminous intensity (cd)\n\t\treturn this.intensity * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / Math.PI;\n\n\t}\n\n\tdispose() {\n\n\t\tsuper.dispose();\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.distance = source.distance;\n\t\tthis.angle = source.angle;\n\t\tthis.penumbra = source.penumbra;\n\t\tthis.decay = source.decay;\n\n\t\tthis.target = source.target.clone();\n\t\tthis.map = source.map;\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.distance = this.distance;\n\t\tdata.object.angle = this.angle;\n\t\tdata.object.decay = this.decay;\n\t\tdata.object.penumbra = this.penumbra;\n\n\t\tdata.object.target = this.target.uuid;\n\n\t\tif ( this.map && this.map.isTexture ) data.object.map = this.map.toJSON( meta ).uuid;\n\n\t\tdata.object.shadow = this.shadow.toJSON();\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Represents the shadow configuration of point lights.\n *\n * @augments LightShadow\n */\nclass PointLightShadow extends LightShadow {\n\n\t/**\n\t * Constructs a new point light shadow.\n\t */\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPointLightShadow = true;\n\n\t}\n\n}\n\n/**\n * A light that gets emitted from a single point in all directions. A common\n * use case for this is to replicate the light emitted from a bare\n * lightbulb.\n *\n * This light can cast shadows - see the {@link PointLightShadow} for details.\n *\n * ```js\n * const light = new THREE.PointLight( 0xff0000, 1, 100 );\n * light.position.set( 50, 50, 50 );\n * scene.add( light );\n * ```\n *\n * @augments Light\n */\nclass PointLight extends Light {\n\n\t/**\n\t * Constructs a new point light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity measured in candela (cd).\n\t * @param {number} [distance=0] - Maximum range of the light. `0` means no limit.\n\t * @param {number} [decay=2] - The amount the light dims along the distance of the light.\n\t */\n\tconstructor( color, intensity, distance = 0, decay = 2 ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPointLight = true;\n\n\t\tthis.type = 'PointLight';\n\n\t\t/**\n\t\t * When distance is zero, light will attenuate according to inverse-square\n\t\t * law to infinite distance. When distance is non-zero, light will attenuate\n\t\t * according to inverse-square law until near the distance cutoff, where it\n\t\t * will then attenuate quickly and smoothly to 0. Inherently, cutoffs are not\n\t\t * physically correct.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.distance = distance;\n\n\t\t/**\n\t\t * The amount the light dims along the distance of the light. In context of\n\t\t * physically-correct rendering the default value should not be changed.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2\n\t\t */\n\t\tthis.decay = decay;\n\n\t\t/**\n\t\t * This property holds the light's shadow configuration.\n\t\t *\n\t\t * @type {PointLightShadow}\n\t\t */\n\t\tthis.shadow = new PointLightShadow();\n\n\t}\n\n\t/**\n\t * The light's power. Power is the luminous power of the light measured in lumens (lm).\n\t * Changing the power will also change the light's intensity.\n\t *\n\t * @type {number}\n\t */\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in candela)\n\t\t// for an isotropic light source, luminous power (lm) = 4 \u03C0 luminous intensity (cd)\n\t\treturn this.intensity * 4 * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in candela) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( 4 * Math.PI );\n\n\t}\n\n\tdispose() {\n\n\t\tsuper.dispose();\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.distance = source.distance;\n\t\tthis.decay = source.decay;\n\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.distance = this.distance;\n\t\tdata.object.decay = this.decay;\n\n\t\tdata.object.shadow = this.shadow.toJSON();\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Camera that uses [orthographic projection](https://en.wikipedia.org/wiki/Orthographic_projection).\n *\n * In this projection mode, an object's size in the rendered image stays\n * constant regardless of its distance from the camera. This can be useful\n * for rendering 2D scenes and UI elements, amongst other things.\n *\n * ```js\n * const camera = new THREE.OrthographicCamera( width / - 2, width / 2, height / 2, height / - 2, 1, 1000 );\n * scene.add( camera );\n * ```\n *\n * @augments Camera\n */\nclass OrthographicCamera extends Camera {\n\n\t/**\n\t * Constructs a new orthographic camera.\n\t *\n\t * @param {number} [left=-1] - The left plane of the camera's frustum.\n\t * @param {number} [right=1] - The right plane of the camera's frustum.\n\t * @param {number} [top=1] - The top plane of the camera's frustum.\n\t * @param {number} [bottom=-1] - The bottom plane of the camera's frustum.\n\t * @param {number} [near=0.1] - The camera's near plane.\n\t * @param {number} [far=2000] - The camera's far plane.\n\t */\n\tconstructor( left = -1, right = 1, top = 1, bottom = -1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isOrthographicCamera = true;\n\n\t\tthis.type = 'OrthographicCamera';\n\n\t\t/**\n\t\t * The zoom factor of the camera.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.zoom = 1;\n\n\t\t/**\n\t\t * Represents the frustum window specification. This property should not be edited\n\t\t * directly but via {@link PerspectiveCamera#setViewOffset} and {@link PerspectiveCamera#clearViewOffset}.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.view = null;\n\n\t\t/**\n\t\t * The left plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.left = left;\n\n\t\t/**\n\t\t * The right plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.right = right;\n\n\t\t/**\n\t\t * The top plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.top = top;\n\n\t\t/**\n\t\t * The bottom plane of the camera's frustum.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.bottom = bottom;\n\n\t\t/**\n\t\t * The camera's near plane. The valid range is greater than `0`\n\t\t * and less than the current value of {@link OrthographicCamera#far}.\n\t\t *\n\t\t * Note that, unlike for the {@link PerspectiveCamera}, `0` is a\n\t\t * valid value for an orthographic camera's near plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.1\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * The camera's far plane. Must be greater than the\n\t\t * current value of {@link OrthographicCamera#near}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2000\n\t\t */\n\t\tthis.far = far;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.left = source.left;\n\t\tthis.right = source.right;\n\t\tthis.top = source.top;\n\t\tthis.bottom = source.bottom;\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\n\t\tthis.zoom = source.zoom;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * @param {number} fullWidth - The full width of multiview setup.\n\t * @param {number} fullHeight - The full height of multiview setup.\n\t * @param {number} x - The horizontal offset of the subcamera.\n\t * @param {number} y - The vertical offset of the subcamera.\n\t * @param {number} width - The width of subcamera.\n\t * @param {number} height - The height of subcamera.\n\t * @see {@link PerspectiveCamera#setViewOffset}\n\t */\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Removes the view offset from the projection matrix.\n\t */\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Updates the camera's projection matrix. Must be called after any change of\n\t * camera properties.\n\t */\n\tupdateProjectionMatrix() {\n\n\t\tconst dx = ( this.right - this.left ) / ( 2 * this.zoom );\n\t\tconst dy = ( this.top - this.bottom ) / ( 2 * this.zoom );\n\t\tconst cx = ( this.right + this.left ) / 2;\n\t\tconst cy = ( this.top + this.bottom ) / 2;\n\n\t\tlet left = cx - dx;\n\t\tlet right = cx + dx;\n\t\tlet top = cy + dy;\n\t\tlet bottom = cy - dy;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst scaleW = ( this.right - this.left ) / this.view.fullWidth / this.zoom;\n\t\t\tconst scaleH = ( this.top - this.bottom ) / this.view.fullHeight / this.zoom;\n\n\t\t\tleft += scaleW * this.view.offsetX;\n\t\t\tright = left + scaleW * this.view.width;\n\t\t\ttop -= scaleH * this.view.offsetY;\n\t\t\tbottom = top - scaleH * this.view.height;\n\n\t\t}\n\n\t\tthis.projectionMatrix.makeOrthographic( left, right, top, bottom, this.near, this.far, this.coordinateSystem, this.reversedDepth );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.zoom = this.zoom;\n\t\tdata.object.left = this.left;\n\t\tdata.object.right = this.right;\n\t\tdata.object.top = this.top;\n\t\tdata.object.bottom = this.bottom;\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Represents the shadow configuration of directional lights.\n *\n * @augments LightShadow\n */\nclass DirectionalLightShadow extends LightShadow {\n\n\t/**\n\t * Constructs a new directional light shadow.\n\t */\n\tconstructor() {\n\n\t\tsuper( new OrthographicCamera( -5, 5, 5, -5, 0.5, 500 ) );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDirectionalLightShadow = true;\n\n\t}\n\n}\n\n/**\n * A light that gets emitted in a specific direction. This light will behave\n * as though it is infinitely far away and the rays produced from it are all\n * parallel. The common use case for this is to simulate daylight; the sun is\n * far enough away that its position can be considered to be infinite, and\n * all light rays coming from it are parallel.\n *\n * A common point of confusion for directional lights is that setting the\n * rotation has no effect. This is because three.js's DirectionalLight is the\n * equivalent to what is often called a 'Target Direct Light' in other\n * applications.\n *\n * This means that its direction is calculated as pointing from the light's\n * {@link Object3D#position} to the {@link DirectionalLight#target} position\n * (as opposed to a 'Free Direct Light' that just has a rotation\n * component).\n *\n * This light can cast shadows - see the {@link DirectionalLightShadow} for details.\n *\n * ```js\n * // White directional light at half intensity shining from the top.\n * const directionalLight = new THREE.DirectionalLight( 0xffffff, 0.5 );\n * scene.add( directionalLight );\n * ```\n *\n * @augments Light\n */\nclass DirectionalLight extends Light {\n\n\t/**\n\t * Constructs a new directional light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isDirectionalLight = true;\n\n\t\tthis.type = 'DirectionalLight';\n\n\t\tthis.position.copy( Object3D.DEFAULT_UP );\n\t\tthis.updateMatrix();\n\n\t\t/**\n\t\t * The directional light points from its position to the\n\t\t * target's position.\n\t\t *\n\t\t * For the target's position to be changed to anything other\n\t\t * than the default, it must be added to the scene.\n\t\t *\n\t\t * It is also possible to set the target to be another 3D object\n\t\t * in the scene. The light will now track the target object.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.target = new Object3D();\n\n\t\t/**\n\t\t * This property holds the light's shadow configuration.\n\t\t *\n\t\t * @type {DirectionalLightShadow}\n\t\t */\n\t\tthis.shadow = new DirectionalLightShadow();\n\n\t}\n\n\tdispose() {\n\n\t\tsuper.dispose();\n\n\t\tthis.shadow.dispose();\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.target = source.target.clone();\n\t\tthis.shadow = source.shadow.clone();\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.shadow = this.shadow.toJSON();\n\t\tdata.object.target = this.target.uuid;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * This light globally illuminates all objects in the scene equally.\n *\n * It cannot be used to cast shadows as it does not have a direction.\n *\n * ```js\n * const light = new THREE.AmbientLight( 0x404040 ); // soft white light\n * scene.add( light );\n * ```\n *\n * @augments Light\n */\nclass AmbientLight extends Light {\n\n\t/**\n\t * Constructs a new ambient light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( color, intensity ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isAmbientLight = true;\n\n\t\tthis.type = 'AmbientLight';\n\n\t}\n\n}\n\n/**\n * This class emits light uniformly across the face a rectangular plane.\n * This light type can be used to simulate light sources such as bright\n * windows or strip lighting.\n *\n * Important Notes:\n *\n * - There is no shadow support.\n * - Only PBR materials are supported.\n * - You have to include `RectAreaLightUniformsLib` (`WebGLRenderer`) or `RectAreaLightTexturesLib` (`WebGPURenderer`)\n * into your app and init the uniforms/textures.\n *\n * ```js\n * RectAreaLightUniformsLib.init(); // only relevant for WebGLRenderer\n * THREE.RectAreaLightNode.setLTC( RectAreaLightTexturesLib.init() ); //  only relevant for WebGPURenderer\n *\n * const intensity = 1; const width = 10; const height = 10;\n * const rectLight = new THREE.RectAreaLight( 0xffffff, intensity, width, height );\n * rectLight.position.set( 5, 5, 0 );\n * rectLight.lookAt( 0, 0, 0 );\n * scene.add( rectLight )\n * ```\n *\n * @augments Light\n */\nclass RectAreaLight extends Light {\n\n\t/**\n\t * Constructs a new area light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t * @param {number} [width=10] - The width of the light.\n\t * @param {number} [height=10] - The height of the light.\n\t */\n\tconstructor( color, intensity, width = 10, height = 10 ) {\n\n\t\tsuper( color, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRectAreaLight = true;\n\n\t\tthis.type = 'RectAreaLight';\n\n\t\t/**\n\t\t * The width of the light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.width = width;\n\n\t\t/**\n\t\t * The height of the light.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.height = height;\n\n\t}\n\n\t/**\n\t * The light's power. Power is the luminous power of the light measured in lumens (lm).\n\t * Changing the power will also change the light's intensity.\n\t *\n\t * @type {number}\n\t */\n\tget power() {\n\n\t\t// compute the light's luminous power (in lumens) from its intensity (in nits)\n\t\treturn this.intensity * this.width * this.height * Math.PI;\n\n\t}\n\n\tset power( power ) {\n\n\t\t// set the light's intensity (in nits) from the desired luminous power (in lumens)\n\t\tthis.intensity = power / ( this.width * this.height * Math.PI );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.width = source.width;\n\t\tthis.height = source.height;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.width = this.width;\n\t\tdata.object.height = this.height;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Represents a third-order spherical harmonics (SH). Light probes use this class\n * to encode lighting information.\n *\n * - Primary reference: {@link https://graphics.stanford.edu/papers/envmap/envmap.pdf}\n * - Secondary reference: {@link https://www.ppsloan.org/publications/StupidSH36.pdf}\n */\nclass SphericalHarmonics3 {\n\n\t/**\n\t * Constructs a new spherical harmonics.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSphericalHarmonics3 = true;\n\n\t\t/**\n\t\t * An array holding the (9) SH coefficients.\n\t\t *\n\t\t * @type {Array<Vector3>}\n\t\t */\n\t\tthis.coefficients = [];\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients.push( new Vector3() );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the given SH coefficients to this instance by copying\n\t * the values.\n\t *\n\t * @param {Array<Vector3>} coefficients - The SH coefficients.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tset( coefficients ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].copy( coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets all SH coefficients to `0`.\n\t *\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tzero() {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].set( 0, 0, 0 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the radiance in the direction of the given normal.\n\t *\n\t * @param {Vector3} normal - The normal vector (assumed to be unit length)\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The radiance.\n\t */\n\tgetAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.282095 );\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 0.488603 * y );\n\t\ttarget.addScaledVector( coeff[ 2 ], 0.488603 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 0.488603 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 1.092548 * ( x * y ) );\n\t\ttarget.addScaledVector( coeff[ 5 ], 1.092548 * ( y * z ) );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.315392 * ( 3.0 * z * z - 1.0 ) );\n\t\ttarget.addScaledVector( coeff[ 7 ], 1.092548 * ( x * z ) );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.546274 * ( x * x - y * y ) );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns the irradiance (radiance convolved with cosine lobe) in the\n\t * direction of the given normal.\n\t *\n\t * @param {Vector3} normal - The normal vector (assumed to be unit length)\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The irradiance.\n\t */\n\tgetIrradianceAt( normal, target ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\tconst coeff = this.coefficients;\n\n\t\t// band 0\n\t\ttarget.copy( coeff[ 0 ] ).multiplyScalar( 0.886227 ); // \u03C0 * 0.282095\n\n\t\t// band 1\n\t\ttarget.addScaledVector( coeff[ 1 ], 2.0 * 0.511664 * y ); // ( 2 * \u03C0 / 3 ) * 0.488603\n\t\ttarget.addScaledVector( coeff[ 2 ], 2.0 * 0.511664 * z );\n\t\ttarget.addScaledVector( coeff[ 3 ], 2.0 * 0.511664 * x );\n\n\t\t// band 2\n\t\ttarget.addScaledVector( coeff[ 4 ], 2.0 * 0.429043 * x * y ); // ( \u03C0 / 4 ) * 1.092548\n\t\ttarget.addScaledVector( coeff[ 5 ], 2.0 * 0.429043 * y * z );\n\t\ttarget.addScaledVector( coeff[ 6 ], 0.743125 * z * z - 0.247708 ); // ( \u03C0 / 4 ) * 0.315392 * 3\n\t\ttarget.addScaledVector( coeff[ 7 ], 2.0 * 0.429043 * x * z );\n\t\ttarget.addScaledVector( coeff[ 8 ], 0.429043 * ( x * x - y * y ) ); // ( \u03C0 / 4 ) * 0.546274\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Adds the given SH to this instance.\n\t *\n\t * @param {SphericalHarmonics3} sh - The SH to add.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tadd( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].add( sh.coefficients[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * A convenience method for performing {@link SphericalHarmonics3#add} and\n\t * {@link SphericalHarmonics3#scale} at once.\n\t *\n\t * @param {SphericalHarmonics3} sh - The SH to add.\n\t * @param {number} s - The scale factor.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\taddScaledSH( sh, s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].addScaledVector( sh.coefficients[ i ], s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Scales this SH by the given scale factor.\n\t *\n\t * @param {number} s - The scale factor.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tscale( s ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].multiplyScalar( s );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Linear interpolates between the given SH and this instance by the given\n\t * alpha factor.\n\t *\n\t * @param {SphericalHarmonics3} sh - The SH to interpolate with.\n\t * @param {number} alpha - The alpha factor.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tlerp( sh, alpha ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.coefficients[ i ].lerp( sh.coefficients[ i ], alpha );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this spherical harmonics is equal with the given one.\n\t *\n\t * @param {SphericalHarmonics3} sh - The spherical harmonics to test for equality.\n\t * @return {boolean} Whether this spherical harmonics is equal with the given one.\n\t */\n\tequals( sh ) {\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tif ( ! this.coefficients[ i ].equals( sh.coefficients[ i ] ) ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Copies the values of the given spherical harmonics to this instance.\n\t *\n\t * @param {SphericalHarmonics3} sh - The spherical harmonics to copy.\n\t * @return {SphericalHarmonics3} A reference to this spherical harmonics.\n\t */\n\tcopy( sh ) {\n\n\t\treturn this.set( sh.coefficients );\n\n\t}\n\n\t/**\n\t * Returns a new spherical harmonics with copied values from this instance.\n\t *\n\t * @return {SphericalHarmonics3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Sets the SH coefficients of this instance from the given array.\n\t *\n\t * @param {Array<number>} array - An array holding the SH coefficients.\n\t * @param {number} [offset=0] - The array offset where to start copying.\n\t * @return {SphericalHarmonics3} A clone of this instance.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].fromArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns an array with the SH coefficients, or copies them into the provided\n\t * array. The coefficients are represented as numbers.\n\t *\n\t * @param {Array<number>} [array=[]] - The target array.\n\t * @param {number} [offset=0] - The array offset where to start copying.\n\t * @return {Array<number>} An array with flat SH coefficients.\n\t */\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tconst coefficients = this.coefficients;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tcoefficients[ i ].toArray( array, offset + ( i * 3 ) );\n\n\t\t}\n\n\t\treturn array;\n\n\t}\n\n\t/**\n\t * Computes the SH basis for the given normal vector.\n\t *\n\t * @param {Vector3} normal - The normal.\n\t * @param {Array<number>} shBasis - The target array holding the SH basis.\n\t */\n\tstatic getBasisAt( normal, shBasis ) {\n\n\t\t// normal is assumed to be unit length\n\n\t\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t\t// band 0\n\t\tshBasis[ 0 ] = 0.282095;\n\n\t\t// band 1\n\t\tshBasis[ 1 ] = 0.488603 * y;\n\t\tshBasis[ 2 ] = 0.488603 * z;\n\t\tshBasis[ 3 ] = 0.488603 * x;\n\n\t\t// band 2\n\t\tshBasis[ 4 ] = 1.092548 * x * y;\n\t\tshBasis[ 5 ] = 1.092548 * y * z;\n\t\tshBasis[ 6 ] = 0.315392 * ( 3 * z * z - 1 );\n\t\tshBasis[ 7 ] = 1.092548 * x * z;\n\t\tshBasis[ 8 ] = 0.546274 * ( x * x - y * y );\n\n\t}\n\n}\n\n/**\n * Light probes are an alternative way of adding light to a 3D scene. Unlike\n * classical light sources (e.g. directional, point or spot lights), light\n * probes do not emit light. Instead they store information about light\n * passing through 3D space. During rendering, the light that hits a 3D\n * object is approximated by using the data from the light probe.\n *\n * Light probes are usually created from (radiance) environment maps. The\n * class {@link LightProbeGenerator} can be used to create light probes from\n * cube textures or render targets. However, light estimation data could also\n * be provided in other forms e.g. by WebXR. This enables the rendering of\n * augmented reality content that reacts to real world lighting.\n *\n * The current probe implementation in three.js supports so-called diffuse\n * light probes. This type of light probe is functionally equivalent to an\n * irradiance environment map.\n *\n * @augments Light\n */\nclass LightProbe extends Light {\n\n\t/**\n\t * Constructs a new light probe.\n\t *\n\t * @param {SphericalHarmonics3} sh - The spherical harmonics which represents encoded lighting information.\n\t * @param {number} [intensity=1] - The light's strength/intensity.\n\t */\n\tconstructor( sh = new SphericalHarmonics3(), intensity = 1 ) {\n\n\t\tsuper( undefined, intensity );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLightProbe = true;\n\n\t\t/**\n\t\t * A light probe uses spherical harmonics to encode lighting information.\n\t\t *\n\t\t * @type {SphericalHarmonics3}\n\t\t */\n\t\tthis.sh = sh;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.sh.copy( source.sh );\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.sh = this.sh.toArray();\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Class for loading materials. The files are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.MaterialLoader();\n * const material = await loader.loadAsync( 'material.json' );\n * ```\n * This loader does not support node materials. Use {@link NodeMaterialLoader} instead.\n *\n * @augments Loader\n */\nclass MaterialLoader extends Loader {\n\n\t/**\n\t * Constructs a new material loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * A dictionary holding textures used by the material.\n\t\t *\n\t\t * @type {Object<string,Texture>}\n\t\t */\n\t\tthis.textures = {};\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded material to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Material)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given JSON object and returns a material.\n\t *\n\t * @param {Object} json - The serialized material.\n\t * @return {Material} The parsed material.\n\t */\n\tparse( json ) {\n\n\t\tconst textures = this.textures;\n\n\t\tfunction getTexture( name ) {\n\n\t\t\tif ( textures[ name ] === undefined ) {\n\n\t\t\t\twarn( 'MaterialLoader: Undefined texture', name );\n\n\t\t\t}\n\n\t\t\treturn textures[ name ];\n\n\t\t}\n\n\t\tconst material = this.createMaterialFromType( json.type );\n\n\t\tif ( json.uuid !== undefined ) material.uuid = json.uuid;\n\t\tif ( json.name !== undefined ) material.name = json.name;\n\t\tif ( json.color !== undefined && material.color !== undefined ) material.color.setHex( json.color );\n\t\tif ( json.roughness !== undefined ) material.roughness = json.roughness;\n\t\tif ( json.metalness !== undefined ) material.metalness = json.metalness;\n\t\tif ( json.sheen !== undefined ) material.sheen = json.sheen;\n\t\tif ( json.sheenColor !== undefined ) material.sheenColor = new Color().setHex( json.sheenColor );\n\t\tif ( json.sheenRoughness !== undefined ) material.sheenRoughness = json.sheenRoughness;\n\t\tif ( json.emissive !== undefined && material.emissive !== undefined ) material.emissive.setHex( json.emissive );\n\t\tif ( json.specular !== undefined && material.specular !== undefined ) material.specular.setHex( json.specular );\n\t\tif ( json.specularIntensity !== undefined ) material.specularIntensity = json.specularIntensity;\n\t\tif ( json.specularColor !== undefined && material.specularColor !== undefined ) material.specularColor.setHex( json.specularColor );\n\t\tif ( json.shininess !== undefined ) material.shininess = json.shininess;\n\t\tif ( json.clearcoat !== undefined ) material.clearcoat = json.clearcoat;\n\t\tif ( json.clearcoatRoughness !== undefined ) material.clearcoatRoughness = json.clearcoatRoughness;\n\t\tif ( json.dispersion !== undefined ) material.dispersion = json.dispersion;\n\t\tif ( json.iridescence !== undefined ) material.iridescence = json.iridescence;\n\t\tif ( json.iridescenceIOR !== undefined ) material.iridescenceIOR = json.iridescenceIOR;\n\t\tif ( json.iridescenceThicknessRange !== undefined ) material.iridescenceThicknessRange = json.iridescenceThicknessRange;\n\t\tif ( json.transmission !== undefined ) material.transmission = json.transmission;\n\t\tif ( json.thickness !== undefined ) material.thickness = json.thickness;\n\t\tif ( json.attenuationDistance !== undefined ) material.attenuationDistance = json.attenuationDistance;\n\t\tif ( json.attenuationColor !== undefined && material.attenuationColor !== undefined ) material.attenuationColor.setHex( json.attenuationColor );\n\t\tif ( json.anisotropy !== undefined ) material.anisotropy = json.anisotropy;\n\t\tif ( json.anisotropyRotation !== undefined ) material.anisotropyRotation = json.anisotropyRotation;\n\t\tif ( json.fog !== undefined ) material.fog = json.fog;\n\t\tif ( json.flatShading !== undefined ) material.flatShading = json.flatShading;\n\t\tif ( json.blending !== undefined ) material.blending = json.blending;\n\t\tif ( json.combine !== undefined ) material.combine = json.combine;\n\t\tif ( json.side !== undefined ) material.side = json.side;\n\t\tif ( json.shadowSide !== undefined ) material.shadowSide = json.shadowSide;\n\t\tif ( json.opacity !== undefined ) material.opacity = json.opacity;\n\t\tif ( json.transparent !== undefined ) material.transparent = json.transparent;\n\t\tif ( json.alphaTest !== undefined ) material.alphaTest = json.alphaTest;\n\t\tif ( json.alphaHash !== undefined ) material.alphaHash = json.alphaHash;\n\t\tif ( json.depthFunc !== undefined ) material.depthFunc = json.depthFunc;\n\t\tif ( json.depthTest !== undefined ) material.depthTest = json.depthTest;\n\t\tif ( json.depthWrite !== undefined ) material.depthWrite = json.depthWrite;\n\t\tif ( json.colorWrite !== undefined ) material.colorWrite = json.colorWrite;\n\t\tif ( json.blendSrc !== undefined ) material.blendSrc = json.blendSrc;\n\t\tif ( json.blendDst !== undefined ) material.blendDst = json.blendDst;\n\t\tif ( json.blendEquation !== undefined ) material.blendEquation = json.blendEquation;\n\t\tif ( json.blendSrcAlpha !== undefined ) material.blendSrcAlpha = json.blendSrcAlpha;\n\t\tif ( json.blendDstAlpha !== undefined ) material.blendDstAlpha = json.blendDstAlpha;\n\t\tif ( json.blendEquationAlpha !== undefined ) material.blendEquationAlpha = json.blendEquationAlpha;\n\t\tif ( json.blendColor !== undefined && material.blendColor !== undefined ) material.blendColor.setHex( json.blendColor );\n\t\tif ( json.blendAlpha !== undefined ) material.blendAlpha = json.blendAlpha;\n\t\tif ( json.stencilWriteMask !== undefined ) material.stencilWriteMask = json.stencilWriteMask;\n\t\tif ( json.stencilFunc !== undefined ) material.stencilFunc = json.stencilFunc;\n\t\tif ( json.stencilRef !== undefined ) material.stencilRef = json.stencilRef;\n\t\tif ( json.stencilFuncMask !== undefined ) material.stencilFuncMask = json.stencilFuncMask;\n\t\tif ( json.stencilFail !== undefined ) material.stencilFail = json.stencilFail;\n\t\tif ( json.stencilZFail !== undefined ) material.stencilZFail = json.stencilZFail;\n\t\tif ( json.stencilZPass !== undefined ) material.stencilZPass = json.stencilZPass;\n\t\tif ( json.stencilWrite !== undefined ) material.stencilWrite = json.stencilWrite;\n\n\t\tif ( json.wireframe !== undefined ) material.wireframe = json.wireframe;\n\t\tif ( json.wireframeLinewidth !== undefined ) material.wireframeLinewidth = json.wireframeLinewidth;\n\t\tif ( json.wireframeLinecap !== undefined ) material.wireframeLinecap = json.wireframeLinecap;\n\t\tif ( json.wireframeLinejoin !== undefined ) material.wireframeLinejoin = json.wireframeLinejoin;\n\n\t\tif ( json.rotation !== undefined ) material.rotation = json.rotation;\n\n\t\tif ( json.linewidth !== undefined ) material.linewidth = json.linewidth;\n\t\tif ( json.dashSize !== undefined ) material.dashSize = json.dashSize;\n\t\tif ( json.gapSize !== undefined ) material.gapSize = json.gapSize;\n\t\tif ( json.scale !== undefined ) material.scale = json.scale;\n\n\t\tif ( json.polygonOffset !== undefined ) material.polygonOffset = json.polygonOffset;\n\t\tif ( json.polygonOffsetFactor !== undefined ) material.polygonOffsetFactor = json.polygonOffsetFactor;\n\t\tif ( json.polygonOffsetUnits !== undefined ) material.polygonOffsetUnits = json.polygonOffsetUnits;\n\n\t\tif ( json.dithering !== undefined ) material.dithering = json.dithering;\n\n\t\tif ( json.alphaToCoverage !== undefined ) material.alphaToCoverage = json.alphaToCoverage;\n\t\tif ( json.premultipliedAlpha !== undefined ) material.premultipliedAlpha = json.premultipliedAlpha;\n\t\tif ( json.forceSinglePass !== undefined ) material.forceSinglePass = json.forceSinglePass;\n\t\tif ( json.allowOverride !== undefined ) material.allowOverride = json.allowOverride;\n\n\t\tif ( json.visible !== undefined ) material.visible = json.visible;\n\n\t\tif ( json.toneMapped !== undefined ) material.toneMapped = json.toneMapped;\n\n\t\tif ( json.userData !== undefined ) material.userData = json.userData;\n\n\t\tif ( json.vertexColors !== undefined ) {\n\n\t\t\tif ( typeof json.vertexColors === 'number' ) {\n\n\t\t\t\tmaterial.vertexColors = ( json.vertexColors > 0 ) ? true : false;\n\n\t\t\t} else {\n\n\t\t\t\tmaterial.vertexColors = json.vertexColors;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Shader Material\n\n\t\tif ( json.uniforms !== undefined ) {\n\n\t\t\tfor ( const name in json.uniforms ) {\n\n\t\t\t\tconst uniform = json.uniforms[ name ];\n\n\t\t\t\tmaterial.uniforms[ name ] = {};\n\n\t\t\t\tswitch ( uniform.type ) {\n\n\t\t\t\t\tcase 't':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = getTexture( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'c':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Color().setHex( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v2':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector2().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Vector4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm3':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix3().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm4':\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = new Matrix4().fromArray( uniform.value );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tmaterial.uniforms[ name ].value = uniform.value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json.defines !== undefined ) material.defines = json.defines;\n\t\tif ( json.vertexShader !== undefined ) material.vertexShader = json.vertexShader;\n\t\tif ( json.fragmentShader !== undefined ) material.fragmentShader = json.fragmentShader;\n\t\tif ( json.glslVersion !== undefined ) material.glslVersion = json.glslVersion;\n\n\t\tif ( json.extensions !== undefined ) {\n\n\t\t\tfor ( const key in json.extensions ) {\n\n\t\t\t\tmaterial.extensions[ key ] = json.extensions[ key ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json.lights !== undefined ) material.lights = json.lights;\n\t\tif ( json.clipping !== undefined ) material.clipping = json.clipping;\n\n\t\t// for PointsMaterial\n\n\t\tif ( json.size !== undefined ) material.size = json.size;\n\t\tif ( json.sizeAttenuation !== undefined ) material.sizeAttenuation = json.sizeAttenuation;\n\n\t\t// maps\n\n\t\tif ( json.map !== undefined ) material.map = getTexture( json.map );\n\t\tif ( json.matcap !== undefined ) material.matcap = getTexture( json.matcap );\n\n\t\tif ( json.alphaMap !== undefined ) material.alphaMap = getTexture( json.alphaMap );\n\n\t\tif ( json.bumpMap !== undefined ) material.bumpMap = getTexture( json.bumpMap );\n\t\tif ( json.bumpScale !== undefined ) material.bumpScale = json.bumpScale;\n\n\t\tif ( json.normalMap !== undefined ) material.normalMap = getTexture( json.normalMap );\n\t\tif ( json.normalMapType !== undefined ) material.normalMapType = json.normalMapType;\n\t\tif ( json.normalScale !== undefined ) {\n\n\t\t\tlet normalScale = json.normalScale;\n\n\t\t\tif ( Array.isArray( normalScale ) === false ) {\n\n\t\t\t\t// Blender exporter used to export a scalar. See #7459\n\n\t\t\t\tnormalScale = [ normalScale, normalScale ];\n\n\t\t\t}\n\n\t\t\tmaterial.normalScale = new Vector2().fromArray( normalScale );\n\n\t\t}\n\n\t\tif ( json.displacementMap !== undefined ) material.displacementMap = getTexture( json.displacementMap );\n\t\tif ( json.displacementScale !== undefined ) material.displacementScale = json.displacementScale;\n\t\tif ( json.displacementBias !== undefined ) material.displacementBias = json.displacementBias;\n\n\t\tif ( json.roughnessMap !== undefined ) material.roughnessMap = getTexture( json.roughnessMap );\n\t\tif ( json.metalnessMap !== undefined ) material.metalnessMap = getTexture( json.metalnessMap );\n\n\t\tif ( json.emissiveMap !== undefined ) material.emissiveMap = getTexture( json.emissiveMap );\n\t\tif ( json.emissiveIntensity !== undefined ) material.emissiveIntensity = json.emissiveIntensity;\n\n\t\tif ( json.specularMap !== undefined ) material.specularMap = getTexture( json.specularMap );\n\t\tif ( json.specularIntensityMap !== undefined ) material.specularIntensityMap = getTexture( json.specularIntensityMap );\n\t\tif ( json.specularColorMap !== undefined ) material.specularColorMap = getTexture( json.specularColorMap );\n\n\t\tif ( json.envMap !== undefined ) material.envMap = getTexture( json.envMap );\n\t\tif ( json.envMapRotation !== undefined ) material.envMapRotation.fromArray( json.envMapRotation );\n\t\tif ( json.envMapIntensity !== undefined ) material.envMapIntensity = json.envMapIntensity;\n\n\t\tif ( json.reflectivity !== undefined ) material.reflectivity = json.reflectivity;\n\t\tif ( json.refractionRatio !== undefined ) material.refractionRatio = json.refractionRatio;\n\n\t\tif ( json.lightMap !== undefined ) material.lightMap = getTexture( json.lightMap );\n\t\tif ( json.lightMapIntensity !== undefined ) material.lightMapIntensity = json.lightMapIntensity;\n\n\t\tif ( json.aoMap !== undefined ) material.aoMap = getTexture( json.aoMap );\n\t\tif ( json.aoMapIntensity !== undefined ) material.aoMapIntensity = json.aoMapIntensity;\n\n\t\tif ( json.gradientMap !== undefined ) material.gradientMap = getTexture( json.gradientMap );\n\n\t\tif ( json.clearcoatMap !== undefined ) material.clearcoatMap = getTexture( json.clearcoatMap );\n\t\tif ( json.clearcoatRoughnessMap !== undefined ) material.clearcoatRoughnessMap = getTexture( json.clearcoatRoughnessMap );\n\t\tif ( json.clearcoatNormalMap !== undefined ) material.clearcoatNormalMap = getTexture( json.clearcoatNormalMap );\n\t\tif ( json.clearcoatNormalScale !== undefined ) material.clearcoatNormalScale = new Vector2().fromArray( json.clearcoatNormalScale );\n\n\t\tif ( json.iridescenceMap !== undefined ) material.iridescenceMap = getTexture( json.iridescenceMap );\n\t\tif ( json.iridescenceThicknessMap !== undefined ) material.iridescenceThicknessMap = getTexture( json.iridescenceThicknessMap );\n\n\t\tif ( json.transmissionMap !== undefined ) material.transmissionMap = getTexture( json.transmissionMap );\n\t\tif ( json.thicknessMap !== undefined ) material.thicknessMap = getTexture( json.thicknessMap );\n\n\t\tif ( json.anisotropyMap !== undefined ) material.anisotropyMap = getTexture( json.anisotropyMap );\n\n\t\tif ( json.sheenColorMap !== undefined ) material.sheenColorMap = getTexture( json.sheenColorMap );\n\t\tif ( json.sheenRoughnessMap !== undefined ) material.sheenRoughnessMap = getTexture( json.sheenRoughnessMap );\n\n\t\treturn material;\n\n\t}\n\n\t/**\n\t * Textures are not embedded in the material JSON so they have\n\t * to be injected before the loading process starts.\n\t *\n\t * @param {Object} value - A dictionary holding textures for material properties.\n\t * @return {MaterialLoader} A reference to this material loader.\n\t */\n\tsetTextures( value ) {\n\n\t\tthis.textures = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a material for the given type.\n\t *\n\t * @param {string} type - The material type.\n\t * @return {Material} The new material.\n\t */\n\tcreateMaterialFromType( type ) {\n\n\t\treturn MaterialLoader.createMaterialFromType( type );\n\n\t}\n\n\t/**\n\t * Creates a material for the given type.\n\t *\n\t * @static\n\t * @param {string} type - The material type.\n\t * @return {Material} The new material.\n\t */\n\tstatic createMaterialFromType( type ) {\n\n\t\tconst materialLib = {\n\t\t\tShadowMaterial,\n\t\t\tSpriteMaterial,\n\t\t\tRawShaderMaterial,\n\t\t\tShaderMaterial,\n\t\t\tPointsMaterial,\n\t\t\tMeshPhysicalMaterial,\n\t\t\tMeshStandardMaterial,\n\t\t\tMeshPhongMaterial,\n\t\t\tMeshToonMaterial,\n\t\t\tMeshNormalMaterial,\n\t\t\tMeshLambertMaterial,\n\t\t\tMeshDepthMaterial,\n\t\t\tMeshDistanceMaterial,\n\t\t\tMeshBasicMaterial,\n\t\t\tMeshMatcapMaterial,\n\t\t\tLineDashedMaterial,\n\t\t\tLineBasicMaterial,\n\t\t\tMaterial\n\t\t};\n\n\t\treturn new materialLib[ type ]();\n\n\t}\n\n}\n\n/**\n * A class with loader utility functions.\n */\nclass LoaderUtils {\n\n\t/**\n\t * Extracts the base URL from the given URL.\n\t *\n\t * @param {string} url -The URL to extract the base URL from.\n\t * @return {string} The extracted base URL.\n\t */\n\tstatic extractUrlBase( url ) {\n\n\t\tconst index = url.lastIndexOf( '/' );\n\n\t\tif ( index === -1 ) return './';\n\n\t\treturn url.slice( 0, index + 1 );\n\n\t}\n\n\t/**\n\t * Resolves relative URLs against the given path. Absolute paths, data urls,\n\t * and blob URLs will be returned as is. Invalid URLs will return an empty\n\t * string.\n\t *\n\t * @param {string} url -The URL to resolve.\n\t * @param {string} path - The base path for relative URLs to be resolved against.\n\t * @return {string} The resolved URL.\n\t */\n\tstatic resolveURL( url, path ) {\n\n\t\t// Invalid URL\n\t\tif ( typeof url !== 'string' || url === '' ) return '';\n\n\t\t// Host Relative URL\n\t\tif ( /^https?:\\/\\//i.test( path ) && /^\\//.test( url ) ) {\n\n\t\t\tpath = path.replace( /(^https?:\\/\\/[^\\/]+).*/i, '$1' );\n\n\t\t}\n\n\t\t// Absolute URL http://,https://,//\n\t\tif ( /^(https?:)?\\/\\//i.test( url ) ) return url;\n\n\t\t// Data URI\n\t\tif ( /^data:.*,.*$/i.test( url ) ) return url;\n\n\t\t// Blob URL\n\t\tif ( /^blob:.*$/i.test( url ) ) return url;\n\n\t\t// Relative URL\n\t\treturn path + url;\n\n\t}\n\n}\n\n/**\n * An instanced version of a geometry.\n */\nclass InstancedBufferGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new instanced buffer geometry.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedBufferGeometry = true;\n\n\t\tthis.type = 'InstancedBufferGeometry';\n\n\t\t/**\n\t\t * The instance count.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.instanceCount = Infinity;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.instanceCount = source.instanceCount;\n\n\t\treturn this;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.instanceCount = this.instanceCount;\n\n\t\tdata.isInstancedBufferGeometry = true;\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Class for loading geometries. The files are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.BufferGeometryLoader();\n * const geometry = await loader.loadAsync( 'models/json/pressure.json' );\n *\n * const material = new THREE.MeshBasicMaterial( { color: 0xF5F5F5 } );\n * const object = new THREE.Mesh( geometry, material );\n * scene.add( object );\n * ```\n *\n * @augments Loader\n */\nclass BufferGeometryLoader extends Loader {\n\n\t/**\n\t * Constructs a new geometry loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded geometry to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(BufferGeometry)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given JSON object and returns a geometry.\n\t *\n\t * @param {Object} json - The serialized geometry.\n\t * @return {BufferGeometry} The parsed geometry.\n\t */\n\tparse( json ) {\n\n\t\tconst interleavedBufferMap = {};\n\t\tconst arrayBufferMap = {};\n\n\t\tfunction getInterleavedBuffer( json, uuid ) {\n\n\t\t\tif ( interleavedBufferMap[ uuid ] !== undefined ) return interleavedBufferMap[ uuid ];\n\n\t\t\tconst interleavedBuffers = json.interleavedBuffers;\n\t\t\tconst interleavedBuffer = interleavedBuffers[ uuid ];\n\n\t\t\tconst buffer = getArrayBuffer( json, interleavedBuffer.buffer );\n\n\t\t\tconst array = getTypedArray( interleavedBuffer.type, buffer );\n\t\t\tconst ib = new InterleavedBuffer( array, interleavedBuffer.stride );\n\t\t\tib.uuid = interleavedBuffer.uuid;\n\n\t\t\tinterleavedBufferMap[ uuid ] = ib;\n\n\t\t\treturn ib;\n\n\t\t}\n\n\t\tfunction getArrayBuffer( json, uuid ) {\n\n\t\t\tif ( arrayBufferMap[ uuid ] !== undefined ) return arrayBufferMap[ uuid ];\n\n\t\t\tconst arrayBuffers = json.arrayBuffers;\n\t\t\tconst arrayBuffer = arrayBuffers[ uuid ];\n\n\t\t\tconst ab = new Uint32Array( arrayBuffer ).buffer;\n\n\t\t\tarrayBufferMap[ uuid ] = ab;\n\n\t\t\treturn ab;\n\n\t\t}\n\n\t\tconst geometry = json.isInstancedBufferGeometry ? new InstancedBufferGeometry() : new BufferGeometry();\n\n\t\tconst index = json.data.index;\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst typedArray = getTypedArray( index.type, index.array );\n\t\t\tgeometry.setIndex( new BufferAttribute( typedArray, 1 ) );\n\n\t\t}\n\n\t\tconst attributes = json.data.attributes;\n\n\t\tfor ( const key in attributes ) {\n\n\t\t\tconst attribute = attributes[ key ];\n\t\t\tlet bufferAttribute;\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t} else {\n\n\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\tconst bufferAttributeConstr = attribute.isInstancedBufferAttribute ? InstancedBufferAttribute : BufferAttribute;\n\t\t\t\tbufferAttribute = new bufferAttributeConstr( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t}\n\n\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\tif ( attribute.usage !== undefined ) bufferAttribute.setUsage( attribute.usage );\n\n\t\t\tgeometry.setAttribute( key, bufferAttribute );\n\n\t\t}\n\n\t\tconst morphAttributes = json.data.morphAttributes;\n\n\t\tif ( morphAttributes ) {\n\n\t\t\tfor ( const key in morphAttributes ) {\n\n\t\t\t\tconst attributeArray = morphAttributes[ key ];\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, il = attributeArray.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst attribute = attributeArray[ i ];\n\t\t\t\t\tlet bufferAttribute;\n\n\t\t\t\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst interleavedBuffer = getInterleavedBuffer( json.data, attribute.data );\n\t\t\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( interleavedBuffer, attribute.itemSize, attribute.offset, attribute.normalized );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst typedArray = getTypedArray( attribute.type, attribute.array );\n\t\t\t\t\t\tbufferAttribute = new BufferAttribute( typedArray, attribute.itemSize, attribute.normalized );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attribute.name !== undefined ) bufferAttribute.name = attribute.name;\n\t\t\t\t\tarray.push( bufferAttribute );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.morphAttributes[ key ] = array;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst morphTargetsRelative = json.data.morphTargetsRelative;\n\n\t\tif ( morphTargetsRelative ) {\n\n\t\t\tgeometry.morphTargetsRelative = true;\n\n\t\t}\n\n\t\tconst groups = json.data.groups || json.data.drawcalls || json.data.offsets;\n\n\t\tif ( groups !== undefined ) {\n\n\t\t\tfor ( let i = 0, n = groups.length; i !== n; ++ i ) {\n\n\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\tgeometry.addGroup( group.start, group.count, group.materialIndex );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst boundingSphere = json.data.boundingSphere;\n\n\t\tif ( boundingSphere !== undefined ) {\n\n\t\t\tgeometry.boundingSphere = new Sphere().fromJSON( boundingSphere );\n\n\t\t}\n\n\t\tif ( json.name ) geometry.name = json.name;\n\t\tif ( json.userData ) geometry.userData = json.userData;\n\n\t\treturn geometry;\n\n\t}\n\n}\n\n/**\n * A loader for loading a JSON resource in the [JSON Object/Scene format](https://github.com/mrdoob/three.js/wiki/JSON-Object-Scene-format-4).\n * The files are internally loaded via {@link FileLoader}.\n *\n * ```js\n * const loader = new THREE.ObjectLoader();\n * const obj = await loader.loadAsync( 'models/json/example.json' );\n * scene.add( obj );\n *\n * // Alternatively, to parse a previously loaded JSON structure\n * const object = await loader.parseAsync( a_json_object );\n * scene.add( object );\n * ```\n *\n * @augments Loader\n */\nclass ObjectLoader extends Loader {\n\n\t/**\n\t * Constructs a new object loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded 3D object to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Object3D)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tlet json = null;\n\n\t\t\ttry {\n\n\t\t\t\tjson = JSON.parse( text );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( error );\n\n\t\t\t\terror( 'ObjectLoader: Can\\'t parse ' + url + '.', error.message );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst metadata = json.metadata;\n\n\t\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\t\tif ( onError !== undefined ) onError( new Error( 'THREE.ObjectLoader: Can\\'t load ' + url ) );\n\n\t\t\t\terror( 'ObjectLoader: Can\\'t load ' + url );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tscope.parse( json, onLoad );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Async version of {@link ObjectLoader#load}.\n\t *\n\t * @async\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @return {Promise<Object3D>} A Promise that resolves with the loaded 3D object.\n\t */\n\tasync loadAsync( url, onProgress ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\t\tthis.resourcePath = this.resourcePath || path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tconst text = await loader.loadAsync( url, onProgress );\n\n\t\tconst json = JSON.parse( text );\n\n\t\tconst metadata = json.metadata;\n\n\t\tif ( metadata === undefined || metadata.type === undefined || metadata.type.toLowerCase() === 'geometry' ) {\n\n\t\t\tthrow new Error( 'THREE.ObjectLoader: Can\\'t load ' + url );\n\n\t\t}\n\n\t\treturn await scope.parseAsync( json );\n\n\t}\n\n\t/**\n\t * Parses the given JSON. This is used internally by {@link ObjectLoader#load}\n\t * but can also be used directly to parse a previously loaded JSON structure.\n\t *\n\t * @param {Object} json - The serialized 3D object.\n\t * @param {onLoad} onLoad - Executed when all resources (e.g. textures) have been fully loaded.\n\t * @return {Object3D} The parsed 3D object.\n\t */\n\tparse( json, onLoad ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = this.parseImages( json.images, function () {\n\n\t\t\tif ( onLoad !== undefined ) onLoad( object );\n\n\t\t} );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\t\tthis.bindLightTargets( object );\n\n\t\t//\n\n\t\tif ( onLoad !== undefined ) {\n\n\t\t\tlet hasImages = false;\n\n\t\t\tfor ( const uuid in images ) {\n\n\t\t\t\tif ( images[ uuid ].data instanceof HTMLImageElement ) {\n\n\t\t\t\t\thasImages = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hasImages === false ) onLoad( object );\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\t/**\n\t * Async version of {@link ObjectLoader#parse}.\n\t *\n\t * @param {Object} json - The serialized 3D object.\n\t * @return {Promise<Object3D>} A Promise that resolves with the parsed 3D object.\n\t */\n\tasync parseAsync( json ) {\n\n\t\tconst animations = this.parseAnimations( json.animations );\n\t\tconst shapes = this.parseShapes( json.shapes );\n\t\tconst geometries = this.parseGeometries( json.geometries, shapes );\n\n\t\tconst images = await this.parseImagesAsync( json.images );\n\n\t\tconst textures = this.parseTextures( json.textures, images );\n\t\tconst materials = this.parseMaterials( json.materials, textures );\n\n\t\tconst object = this.parseObject( json.object, geometries, materials, textures, animations );\n\t\tconst skeletons = this.parseSkeletons( json.skeletons, object );\n\n\t\tthis.bindSkeletons( object, skeletons );\n\t\tthis.bindLightTargets( object );\n\n\t\treturn object;\n\n\t}\n\n\t// internals\n\n\tparseShapes( json ) {\n\n\t\tconst shapes = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst shape = new Shape().fromJSON( json[ i ] );\n\n\t\t\t\tshapes[ shape.uuid ] = shape;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn shapes;\n\n\t}\n\n\tparseSkeletons( json, object ) {\n\n\t\tconst skeletons = {};\n\t\tconst bones = {};\n\n\t\t// generate bone lookup table\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isBone ) bones[ child.uuid ] = child;\n\n\t\t} );\n\n\t\t// create skeletons\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst skeleton = new Skeleton().fromJSON( json[ i ], bones );\n\n\t\t\t\tskeletons[ skeleton.uuid ] = skeleton;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn skeletons;\n\n\t}\n\n\tparseGeometries( json, shapes ) {\n\n\t\tconst geometries = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst bufferGeometryLoader = new BufferGeometryLoader();\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tlet geometry;\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tswitch ( data.type ) {\n\n\t\t\t\t\tcase 'BufferGeometry':\n\t\t\t\t\tcase 'InstancedBufferGeometry':\n\n\t\t\t\t\t\tgeometry = bufferGeometryLoader.parse( data );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( data.type in Geometries ) {\n\n\t\t\t\t\t\t\tgeometry = Geometries[ data.type ].fromJSON( data, shapes );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\twarn( `ObjectLoader: Unsupported geometry type \"${ data.type }\"` );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) geometry.name = data.name;\n\t\t\t\tif ( data.userData !== undefined ) geometry.userData = data.userData;\n\n\t\t\t\tgeometries[ data.uuid ] = geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn geometries;\n\n\t}\n\n\tparseMaterials( json, textures ) {\n\n\t\tconst cache = {}; // MultiMaterial\n\t\tconst materials = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst loader = new MaterialLoader();\n\t\t\tloader.setTextures( textures );\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( cache[ data.uuid ] === undefined ) {\n\n\t\t\t\t\tcache[ data.uuid ] = loader.parse( data );\n\n\t\t\t\t}\n\n\t\t\t\tmaterials[ data.uuid ] = cache[ data.uuid ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn materials;\n\n\t}\n\n\tparseAnimations( json ) {\n\n\t\tconst animations = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0; i < json.length; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tconst clip = AnimationClip.parse( data );\n\n\t\t\t\tanimations[ clip.uuid ] = clip;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn animations;\n\n\t}\n\n\tparseImages( json, onLoad ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tfunction loadImage( url ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\treturn loader.load( url, function () {\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, undefined, function () {\n\n\t\t\t\tscope.manager.itemError( url );\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tfunction deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn loadImage( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tconst manager = new LoadingManager( onLoad );\n\n\t\t\tloader = new ImageLoader( manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tasync parseImagesAsync( json ) {\n\n\t\tconst scope = this;\n\t\tconst images = {};\n\n\t\tlet loader;\n\n\t\tasync function deserializeImage( image ) {\n\n\t\t\tif ( typeof image === 'string' ) {\n\n\t\t\t\tconst url = image;\n\n\t\t\t\tconst path = /^(\\/\\/)|([a-z]+:(\\/\\/)?)/i.test( url ) ? url : scope.resourcePath + url;\n\n\t\t\t\treturn await loader.loadAsync( path );\n\n\t\t\t} else {\n\n\t\t\t\tif ( image.data ) {\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tdata: getTypedArray( image.type, image.data ),\n\t\t\t\t\t\twidth: image.width,\n\t\t\t\t\t\theight: image.height\n\t\t\t\t\t};\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( json !== undefined && json.length > 0 ) {\n\n\t\t\tloader = new ImageLoader( this.manager );\n\t\t\tloader.setCrossOrigin( this.crossOrigin );\n\n\t\t\tfor ( let i = 0, il = json.length; i < il; i ++ ) {\n\n\t\t\t\tconst image = json[ i ];\n\t\t\t\tconst url = image.url;\n\n\t\t\t\tif ( Array.isArray( url ) ) {\n\n\t\t\t\t\t// load array of images e.g CubeTexture\n\n\t\t\t\t\tconst imageArray = [];\n\n\t\t\t\t\tfor ( let j = 0, jl = url.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tconst currentUrl = url[ j ];\n\n\t\t\t\t\t\tconst deserializedImage = await deserializeImage( currentUrl );\n\n\t\t\t\t\t\tif ( deserializedImage !== null ) {\n\n\t\t\t\t\t\t\tif ( deserializedImage instanceof HTMLImageElement ) {\n\n\t\t\t\t\t\t\t\timageArray.push( deserializedImage );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// special case: handle array of data textures for cube textures\n\n\t\t\t\t\t\t\t\timageArray.push( new DataTexture( deserializedImage.data, deserializedImage.width, deserializedImage.height ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\timages[ image.uuid ] = new Source( imageArray );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// load single image\n\n\t\t\t\t\tconst deserializedImage = await deserializeImage( image.url );\n\t\t\t\t\timages[ image.uuid ] = new Source( deserializedImage );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\tparseTextures( json, images ) {\n\n\t\tfunction parseConstant( value, type ) {\n\n\t\t\tif ( typeof value === 'number' ) return value;\n\n\t\t\twarn( 'ObjectLoader.parseTexture: Constant should be in numeric form.', value );\n\n\t\t\treturn type[ value ];\n\n\t\t}\n\n\t\tconst textures = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tif ( data.image === undefined ) {\n\n\t\t\t\t\twarn( 'ObjectLoader: No \"image\" specified for', data.uuid );\n\n\t\t\t\t}\n\n\t\t\t\tif ( images[ data.image ] === undefined ) {\n\n\t\t\t\t\twarn( 'ObjectLoader: Undefined image', data.image );\n\n\t\t\t\t}\n\n\t\t\t\tconst source = images[ data.image ];\n\t\t\t\tconst image = source.data;\n\n\t\t\t\tlet texture;\n\n\t\t\t\tif ( Array.isArray( image ) ) {\n\n\t\t\t\t\ttexture = new CubeTexture();\n\n\t\t\t\t\tif ( image.length === 6 ) texture.needsUpdate = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( image && image.data ) {\n\n\t\t\t\t\t\ttexture = new DataTexture();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttexture = new Texture();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( image ) texture.needsUpdate = true; // textures can have undefined image data\n\n\t\t\t\t}\n\n\t\t\t\ttexture.source = source;\n\n\t\t\t\ttexture.uuid = data.uuid;\n\n\t\t\t\tif ( data.name !== undefined ) texture.name = data.name;\n\n\t\t\t\tif ( data.mapping !== undefined ) texture.mapping = parseConstant( data.mapping, TEXTURE_MAPPING );\n\t\t\t\tif ( data.channel !== undefined ) texture.channel = data.channel;\n\n\t\t\t\tif ( data.offset !== undefined ) texture.offset.fromArray( data.offset );\n\t\t\t\tif ( data.repeat !== undefined ) texture.repeat.fromArray( data.repeat );\n\t\t\t\tif ( data.center !== undefined ) texture.center.fromArray( data.center );\n\t\t\t\tif ( data.rotation !== undefined ) texture.rotation = data.rotation;\n\n\t\t\t\tif ( data.wrap !== undefined ) {\n\n\t\t\t\t\ttexture.wrapS = parseConstant( data.wrap[ 0 ], TEXTURE_WRAPPING );\n\t\t\t\t\ttexture.wrapT = parseConstant( data.wrap[ 1 ], TEXTURE_WRAPPING );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.format !== undefined ) texture.format = data.format;\n\t\t\t\tif ( data.internalFormat !== undefined ) texture.internalFormat = data.internalFormat;\n\t\t\t\tif ( data.type !== undefined ) texture.type = data.type;\n\t\t\t\tif ( data.colorSpace !== undefined ) texture.colorSpace = data.colorSpace;\n\n\t\t\t\tif ( data.minFilter !== undefined ) texture.minFilter = parseConstant( data.minFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.magFilter !== undefined ) texture.magFilter = parseConstant( data.magFilter, TEXTURE_FILTER );\n\t\t\t\tif ( data.anisotropy !== undefined ) texture.anisotropy = data.anisotropy;\n\n\t\t\t\tif ( data.flipY !== undefined ) texture.flipY = data.flipY;\n\n\t\t\t\tif ( data.generateMipmaps !== undefined ) texture.generateMipmaps = data.generateMipmaps;\n\t\t\t\tif ( data.premultiplyAlpha !== undefined ) texture.premultiplyAlpha = data.premultiplyAlpha;\n\t\t\t\tif ( data.unpackAlignment !== undefined ) texture.unpackAlignment = data.unpackAlignment;\n\t\t\t\tif ( data.compareFunction !== undefined ) texture.compareFunction = data.compareFunction;\n\n\t\t\t\tif ( data.userData !== undefined ) texture.userData = data.userData;\n\n\t\t\t\ttextures[ data.uuid ] = texture;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn textures;\n\n\t}\n\n\tparseObject( data, geometries, materials, textures, animations ) {\n\n\t\tlet object;\n\n\t\tfunction getGeometry( name ) {\n\n\t\t\tif ( geometries[ name ] === undefined ) {\n\n\t\t\t\twarn( 'ObjectLoader: Undefined geometry', name );\n\n\t\t\t}\n\n\t\t\treturn geometries[ name ];\n\n\t\t}\n\n\t\tfunction getMaterial( name ) {\n\n\t\t\tif ( name === undefined ) return undefined;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\n\t\t\t\tconst array = [];\n\n\t\t\t\tfor ( let i = 0, l = name.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst uuid = name[ i ];\n\n\t\t\t\t\tif ( materials[ uuid ] === undefined ) {\n\n\t\t\t\t\t\twarn( 'ObjectLoader: Undefined material', uuid );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tarray.push( materials[ uuid ] );\n\n\t\t\t\t}\n\n\t\t\t\treturn array;\n\n\t\t\t}\n\n\t\t\tif ( materials[ name ] === undefined ) {\n\n\t\t\t\twarn( 'ObjectLoader: Undefined material', name );\n\n\t\t\t}\n\n\t\t\treturn materials[ name ];\n\n\t\t}\n\n\t\tfunction getTexture( uuid ) {\n\n\t\t\tif ( textures[ uuid ] === undefined ) {\n\n\t\t\t\twarn( 'ObjectLoader: Undefined texture', uuid );\n\n\t\t\t}\n\n\t\t\treturn textures[ uuid ];\n\n\t\t}\n\n\t\tlet geometry, material;\n\n\t\tswitch ( data.type ) {\n\n\t\t\tcase 'Scene':\n\n\t\t\t\tobject = new Scene();\n\n\t\t\t\tif ( data.background !== undefined ) {\n\n\t\t\t\t\tif ( Number.isInteger( data.background ) ) {\n\n\t\t\t\t\t\tobject.background = new Color( data.background );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tobject.background = getTexture( data.background );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.environment !== undefined ) {\n\n\t\t\t\t\tobject.environment = getTexture( data.environment );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.fog !== undefined ) {\n\n\t\t\t\t\tif ( data.fog.type === 'Fog' ) {\n\n\t\t\t\t\t\tobject.fog = new Fog( data.fog.color, data.fog.near, data.fog.far );\n\n\t\t\t\t\t} else if ( data.fog.type === 'FogExp2' ) {\n\n\t\t\t\t\t\tobject.fog = new FogExp2( data.fog.color, data.fog.density );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( data.fog.name !== '' ) {\n\n\t\t\t\t\t\tobject.fog.name = data.fog.name;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.backgroundBlurriness !== undefined ) object.backgroundBlurriness = data.backgroundBlurriness;\n\t\t\t\tif ( data.backgroundIntensity !== undefined ) object.backgroundIntensity = data.backgroundIntensity;\n\t\t\t\tif ( data.backgroundRotation !== undefined ) object.backgroundRotation.fromArray( data.backgroundRotation );\n\n\t\t\t\tif ( data.environmentIntensity !== undefined ) object.environmentIntensity = data.environmentIntensity;\n\t\t\t\tif ( data.environmentRotation !== undefined ) object.environmentRotation.fromArray( data.environmentRotation );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PerspectiveCamera':\n\n\t\t\t\tobject = new PerspectiveCamera( data.fov, data.aspect, data.near, data.far );\n\n\t\t\t\tif ( data.focus !== undefined ) object.focus = data.focus;\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.filmGauge !== undefined ) object.filmGauge = data.filmGauge;\n\t\t\t\tif ( data.filmOffset !== undefined ) object.filmOffset = data.filmOffset;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'OrthographicCamera':\n\n\t\t\t\tobject = new OrthographicCamera( data.left, data.right, data.top, data.bottom, data.near, data.far );\n\n\t\t\t\tif ( data.zoom !== undefined ) object.zoom = data.zoom;\n\t\t\t\tif ( data.view !== undefined ) object.view = Object.assign( {}, data.view );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'AmbientLight':\n\n\t\t\t\tobject = new AmbientLight( data.color, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'DirectionalLight':\n\n\t\t\t\tobject = new DirectionalLight( data.color, data.intensity );\n\t\t\t\tobject.target = data.target || '';\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointLight':\n\n\t\t\t\tobject = new PointLight( data.color, data.intensity, data.distance, data.decay );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'RectAreaLight':\n\n\t\t\t\tobject = new RectAreaLight( data.color, data.intensity, data.width, data.height );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SpotLight':\n\n\t\t\t\tobject = new SpotLight( data.color, data.intensity, data.distance, data.angle, data.penumbra, data.decay );\n\t\t\t\tobject.target = data.target || '';\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'HemisphereLight':\n\n\t\t\t\tobject = new HemisphereLight( data.color, data.groundColor, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LightProbe':\n\n\t\t\t\tconst sh = new SphericalHarmonics3().fromArray( data.sh );\n\t\t\t\tobject = new LightProbe( sh, data.intensity );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'SkinnedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t \tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new SkinnedMesh( geometry, material );\n\n\t\t\t\tif ( data.bindMode !== undefined ) object.bindMode = data.bindMode;\n\t\t\t\tif ( data.bindMatrix !== undefined ) object.bindMatrix.fromArray( data.bindMatrix );\n\t\t\t\tif ( data.skeleton !== undefined ) object.skeleton = data.skeleton;\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Mesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'InstancedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\t\t\t\tconst count = data.count;\n\t\t\t\tconst instanceMatrix = data.instanceMatrix;\n\t\t\t\tconst instanceColor = data.instanceColor;\n\n\t\t\t\tobject = new InstancedMesh( geometry, material, count );\n\t\t\t\tobject.instanceMatrix = new InstancedBufferAttribute( new Float32Array( instanceMatrix.array ), 16 );\n\t\t\t\tif ( instanceColor !== undefined ) object.instanceColor = new InstancedBufferAttribute( new Float32Array( instanceColor.array ), instanceColor.itemSize );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'BatchedMesh':\n\n\t\t\t\tgeometry = getGeometry( data.geometry );\n\t\t\t\tmaterial = getMaterial( data.material );\n\n\t\t\t\tobject = new BatchedMesh( data.maxInstanceCount, data.maxVertexCount, data.maxIndexCount, material );\n\t\t\t\tobject.geometry = geometry;\n\t\t\t\tobject.perObjectFrustumCulled = data.perObjectFrustumCulled;\n\t\t\t\tobject.sortObjects = data.sortObjects;\n\n\t\t\t\tobject._drawRanges = data.drawRanges;\n\t\t\t\tobject._reservedRanges = data.reservedRanges;\n\n\t\t\t\tobject._geometryInfo = data.geometryInfo.map( info => {\n\n\t\t\t\t\tlet box = null;\n\t\t\t\t\tlet sphere = null;\n\t\t\t\t\tif ( info.boundingBox !== undefined ) {\n\n\t\t\t\t\t\tbox = new Box3().fromJSON( info.boundingBox );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( info.boundingSphere !== undefined ) {\n\n\t\t\t\t\t\tsphere = new Sphere().fromJSON( info.boundingSphere );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...info,\n\t\t\t\t\t\tboundingBox: box,\n\t\t\t\t\t\tboundingSphere: sphere\n\t\t\t\t\t};\n\n\t\t\t\t} );\n\t\t\t\tobject._instanceInfo = data.instanceInfo;\n\n\t\t\t\tobject._availableInstanceIds = data._availableInstanceIds;\n\t\t\t\tobject._availableGeometryIds = data._availableGeometryIds;\n\n\t\t\t\tobject._nextIndexStart = data.nextIndexStart;\n\t\t\t\tobject._nextVertexStart = data.nextVertexStart;\n\t\t\t\tobject._geometryCount = data.geometryCount;\n\n\t\t\t\tobject._maxInstanceCount = data.maxInstanceCount;\n\t\t\t\tobject._maxVertexCount = data.maxVertexCount;\n\t\t\t\tobject._maxIndexCount = data.maxIndexCount;\n\n\t\t\t\tobject._geometryInitialized = data.geometryInitialized;\n\n\t\t\t\tobject._matricesTexture = getTexture( data.matricesTexture.uuid );\n\n\t\t\t\tobject._indirectTexture = getTexture( data.indirectTexture.uuid );\n\n\t\t\t\tif ( data.colorsTexture !== undefined ) {\n\n\t\t\t\t\tobject._colorsTexture = getTexture( data.colorsTexture.uuid );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.boundingSphere !== undefined ) {\n\n\t\t\t\t\tobject.boundingSphere = new Sphere().fromJSON( data.boundingSphere );\n\n\t\t\t\t}\n\n\t\t\t\tif ( data.boundingBox !== undefined ) {\n\n\t\t\t\t\tobject.boundingBox = new Box3().fromJSON( data.boundingBox );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LOD':\n\n\t\t\t\tobject = new LOD();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Line':\n\n\t\t\t\tobject = new Line( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineLoop':\n\n\t\t\t\tobject = new LineLoop( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'LineSegments':\n\n\t\t\t\tobject = new LineSegments( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'PointCloud':\n\t\t\tcase 'Points':\n\n\t\t\t\tobject = new Points( getGeometry( data.geometry ), getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Sprite':\n\n\t\t\t\tobject = new Sprite( getMaterial( data.material ) );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Group':\n\n\t\t\t\tobject = new Group();\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'Bone':\n\n\t\t\t\tobject = new Bone();\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tobject = new Object3D();\n\n\t\t}\n\n\t\tobject.uuid = data.uuid;\n\n\t\tif ( data.name !== undefined ) object.name = data.name;\n\n\t\tif ( data.matrix !== undefined ) {\n\n\t\t\tobject.matrix.fromArray( data.matrix );\n\n\t\t\tif ( data.matrixAutoUpdate !== undefined ) object.matrixAutoUpdate = data.matrixAutoUpdate;\n\t\t\tif ( object.matrixAutoUpdate ) object.matrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t} else {\n\n\t\t\tif ( data.position !== undefined ) object.position.fromArray( data.position );\n\t\t\tif ( data.rotation !== undefined ) object.rotation.fromArray( data.rotation );\n\t\t\tif ( data.quaternion !== undefined ) object.quaternion.fromArray( data.quaternion );\n\t\t\tif ( data.scale !== undefined ) object.scale.fromArray( data.scale );\n\n\t\t}\n\n\t\tif ( data.up !== undefined ) object.up.fromArray( data.up );\n\n\t\tif ( data.castShadow !== undefined ) object.castShadow = data.castShadow;\n\t\tif ( data.receiveShadow !== undefined ) object.receiveShadow = data.receiveShadow;\n\n\t\tif ( data.shadow ) {\n\n\t\t\tif ( data.shadow.intensity !== undefined ) object.shadow.intensity = data.shadow.intensity;\n\t\t\tif ( data.shadow.bias !== undefined ) object.shadow.bias = data.shadow.bias;\n\t\t\tif ( data.shadow.normalBias !== undefined ) object.shadow.normalBias = data.shadow.normalBias;\n\t\t\tif ( data.shadow.radius !== undefined ) object.shadow.radius = data.shadow.radius;\n\t\t\tif ( data.shadow.mapSize !== undefined ) object.shadow.mapSize.fromArray( data.shadow.mapSize );\n\t\t\tif ( data.shadow.camera !== undefined ) object.shadow.camera = this.parseObject( data.shadow.camera );\n\n\t\t}\n\n\t\tif ( data.visible !== undefined ) object.visible = data.visible;\n\t\tif ( data.frustumCulled !== undefined ) object.frustumCulled = data.frustumCulled;\n\t\tif ( data.renderOrder !== undefined ) object.renderOrder = data.renderOrder;\n\t\tif ( data.userData !== undefined ) object.userData = data.userData;\n\t\tif ( data.layers !== undefined ) object.layers.mask = data.layers;\n\n\t\tif ( data.children !== undefined ) {\n\n\t\t\tconst children = data.children;\n\n\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\tobject.add( this.parseObject( children[ i ], geometries, materials, textures, animations ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.animations !== undefined ) {\n\n\t\t\tconst objectAnimations = data.animations;\n\n\t\t\tfor ( let i = 0; i < objectAnimations.length; i ++ ) {\n\n\t\t\t\tconst uuid = objectAnimations[ i ];\n\n\t\t\t\tobject.animations.push( animations[ uuid ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( data.type === 'LOD' ) {\n\n\t\t\tif ( data.autoUpdate !== undefined ) object.autoUpdate = data.autoUpdate;\n\n\t\t\tconst levels = data.levels;\n\n\t\t\tfor ( let l = 0; l < levels.length; l ++ ) {\n\n\t\t\t\tconst level = levels[ l ];\n\t\t\t\tconst child = object.getObjectByProperty( 'uuid', level.object );\n\n\t\t\t\tif ( child !== undefined ) {\n\n\t\t\t\t\tobject.addLevel( child, level.distance, level.hysteresis );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn object;\n\n\t}\n\n\tbindSkeletons( object, skeletons ) {\n\n\t\tif ( Object.keys( skeletons ).length === 0 ) return;\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isSkinnedMesh === true && child.skeleton !== undefined ) {\n\n\t\t\t\tconst skeleton = skeletons[ child.skeleton ];\n\n\t\t\t\tif ( skeleton === undefined ) {\n\n\t\t\t\t\twarn( 'ObjectLoader: No skeleton found with UUID:', child.skeleton );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tchild.bind( skeleton, child.bindMatrix );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tbindLightTargets( object ) {\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isDirectionalLight || child.isSpotLight ) {\n\n\t\t\t\tconst uuid = child.target;\n\n\t\t\t\tconst target = object.getObjectByProperty( 'uuid', uuid );\n\n\t\t\t\tif ( target !== undefined ) {\n\n\t\t\t\t\tchild.target = target;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tchild.target = new Object3D();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n}\n\nconst TEXTURE_MAPPING = {\n\tUVMapping: UVMapping,\n\tCubeReflectionMapping: CubeReflectionMapping,\n\tCubeRefractionMapping: CubeRefractionMapping,\n\tEquirectangularReflectionMapping: EquirectangularReflectionMapping,\n\tEquirectangularRefractionMapping: EquirectangularRefractionMapping,\n\tCubeUVReflectionMapping: CubeUVReflectionMapping\n};\n\nconst TEXTURE_WRAPPING = {\n\tRepeatWrapping: RepeatWrapping,\n\tClampToEdgeWrapping: ClampToEdgeWrapping,\n\tMirroredRepeatWrapping: MirroredRepeatWrapping\n};\n\nconst TEXTURE_FILTER = {\n\tNearestFilter: NearestFilter,\n\tNearestMipmapNearestFilter: NearestMipmapNearestFilter,\n\tNearestMipmapLinearFilter: NearestMipmapLinearFilter,\n\tLinearFilter: LinearFilter,\n\tLinearMipmapNearestFilter: LinearMipmapNearestFilter,\n\tLinearMipmapLinearFilter: LinearMipmapLinearFilter\n};\n\nconst _errorMap = new WeakMap();\n\n/**\n * A loader for loading images as an [ImageBitmap](https://developer.mozilla.org/en-US/docs/Web/API/ImageBitmap).\n * An `ImageBitmap` provides an asynchronous and resource efficient pathway to prepare\n * textures for rendering.\n *\n * Note that {@link Texture#flipY} and {@link Texture#premultiplyAlpha} are ignored with image bitmaps.\n * They needs these configuration on bitmap creation unlike regular images need them on uploading to GPU.\n *\n * You need to set the equivalent options via {@link ImageBitmapLoader#setOptions} instead.\n *\n * Also note that unlike {@link FileLoader}, this loader avoids multiple concurrent requests to the same URL only if `Cache` is enabled.\n *\n * ```js\n * const loader = new THREE.ImageBitmapLoader();\n * loader.setOptions( { imageOrientation: 'flipY' } ); // set options if needed\n * const imageBitmap = await loader.loadAsync( 'image.png' );\n *\n * const texture = new THREE.Texture( imageBitmap );\n * texture.needsUpdate = true;\n * ```\n *\n * @augments Loader\n */\nclass ImageBitmapLoader extends Loader {\n\n\t/**\n\t * Constructs a new image bitmap loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isImageBitmapLoader = true;\n\n\t\tif ( typeof createImageBitmap === 'undefined' ) {\n\n\t\t\twarn( 'ImageBitmapLoader: createImageBitmap() not supported.' );\n\n\t\t}\n\n\t\tif ( typeof fetch === 'undefined' ) {\n\n\t\t\twarn( 'ImageBitmapLoader: fetch() not supported.' );\n\n\t\t}\n\n\t\t/**\n\t\t * Represents the loader options.\n\t\t *\n\t\t * @type {Object}\n\t\t * @default {premultiplyAlpha:'none'}\n\t\t */\n\t\tthis.options = { premultiplyAlpha: 'none' };\n\n\t\t/**\n\t\t * Used for aborting requests.\n\t\t *\n\t\t * @private\n\t\t * @type {AbortController}\n\t\t */\n\t\tthis._abortController = new AbortController();\n\n\t}\n\n\t/**\n\t * Sets the given loader options. The structure of the object must match the `options` parameter of\n\t * [createImageBitmap](https://developer.mozilla.org/en-US/docs/Web/API/Window/createImageBitmap).\n\t *\n\t * @param {Object} options - The loader options to set.\n\t * @return {ImageBitmapLoader} A reference to this image bitmap loader.\n\t */\n\tsetOptions( options ) {\n\n\t\tthis.options = options;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and pass the loaded image bitmap to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(ImageBitmap)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Unsupported in this loader.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {ImageBitmap|undefined} The image bitmap.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( url === undefined ) url = '';\n\n\t\tif ( this.path !== undefined ) url = this.path + url;\n\n\t\turl = this.manager.resolveURL( url );\n\n\t\tconst scope = this;\n\n\t\tconst cached = Cache.get( `image-bitmap:${url}` );\n\n\t\tif ( cached !== undefined ) {\n\n\t\t\tscope.manager.itemStart( url );\n\n\t\t\t// If cached is a promise, wait for it to resolve\n\t\t\tif ( cached.then ) {\n\n\t\t\t\tcached.then( imageBitmap => {\n\n\t\t\t\t\t// check if there is an error for the cached promise\n\n\t\t\t\t\tif ( _errorMap.has( cached ) === true ) {\n\n\t\t\t\t\t\tif ( onError ) onError( _errorMap.get( cached ) );\n\n\t\t\t\t\t\tscope.manager.itemError( url );\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( imageBitmap );\n\n\t\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t\t\treturn imageBitmap;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t// If cached is not a promise (i.e., it's already an imageBitmap)\n\t\t\tsetTimeout( function () {\n\n\t\t\t\tif ( onLoad ) onLoad( cached );\n\n\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t}, 0 );\n\n\t\t\treturn cached;\n\n\t\t}\n\n\t\tconst fetchOptions = {};\n\t\tfetchOptions.credentials = ( this.crossOrigin === 'anonymous' ) ? 'same-origin' : 'include';\n\t\tfetchOptions.headers = this.requestHeader;\n\t\tfetchOptions.signal = ( typeof AbortSignal.any === 'function' ) ? AbortSignal.any( [ this._abortController.signal, this.manager.abortController.signal ] ) : this._abortController.signal;\n\n\t\tconst promise = fetch( url, fetchOptions ).then( function ( res ) {\n\n\t\t\treturn res.blob();\n\n\t\t} ).then( function ( blob ) {\n\n\t\t\treturn createImageBitmap( blob, Object.assign( scope.options, { colorSpaceConversion: 'none' } ) );\n\n\t\t} ).then( function ( imageBitmap ) {\n\n\t\t\tCache.add( `image-bitmap:${url}`, imageBitmap );\n\n\t\t\tif ( onLoad ) onLoad( imageBitmap );\n\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t\treturn imageBitmap;\n\n\t\t} ).catch( function ( e ) {\n\n\t\t\tif ( onError ) onError( e );\n\n\t\t\t_errorMap.set( promise, e );\n\n\t\t\tCache.remove( `image-bitmap:${url}` );\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t} );\n\n\t\tCache.add( `image-bitmap:${url}`, promise );\n\t\tscope.manager.itemStart( url );\n\n\t}\n\n\t/**\n\t * Aborts ongoing fetch requests.\n\t *\n\t * @return {ImageBitmapLoader} A reference to this instance.\n\t */\n\tabort() {\n\n\t\tthis._abortController.abort();\n\t\tthis._abortController = new AbortController();\n\n\t\treturn this;\n\n\t}\n\n}\n\nlet _context;\n\n/**\n * Manages the global audio context in the engine.\n *\n * @hideconstructor\n */\nclass AudioContext {\n\n\t/**\n\t * Returns the global native audio context.\n\t *\n\t * @return {AudioContext} The native audio context.\n\t */\n\tstatic getContext() {\n\n\t\tif ( _context === undefined ) {\n\n\t\t\t_context = new ( window.AudioContext || window.webkitAudioContext )();\n\n\t\t}\n\n\t\treturn _context;\n\n\t}\n\n\t/**\n\t * Allows to set the global native audio context from outside.\n\t *\n\t * @param {AudioContext} value - The native context to set.\n\t */\n\tstatic setContext( value ) {\n\n\t\t_context = value;\n\n\t}\n\n}\n\n/**\n * Class for loading audio buffers. Audios are internally\n * loaded via {@link FileLoader}.\n *\n * ```js\n * const audioListener = new THREE.AudioListener();\n * const ambientSound = new THREE.Audio( audioListener );\n *\n * const loader = new THREE.AudioLoader();\n * const audioBuffer = await loader.loadAsync( 'audio/ambient_ocean.ogg' );\n *\n * ambientSound.setBuffer( audioBuffer );\n * ambientSound.play();\n * ```\n *\n * @augments Loader\n */\nclass AudioLoader extends Loader {\n\n\t/**\n\t * Constructs a new audio loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded audio buffer\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(AudioBuffer)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\ttry {\n\n\t\t\t\t// Create a copy of the buffer. The `decodeAudioData` method\n\t\t\t\t// detaches the buffer when complete, preventing reuse.\n\t\t\t\tconst bufferCopy = buffer.slice( 0 );\n\n\t\t\t\tconst context = AudioContext.getContext();\n\t\t\t\tcontext.decodeAudioData( bufferCopy, function ( audioBuffer ) {\n\n\t\t\t\t\tonLoad( audioBuffer );\n\n\t\t\t\t} ).catch( handleError );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\thandleError( e );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\tfunction handleError( e ) {\n\n\t\t\tif ( onError ) {\n\n\t\t\t\tonError( e );\n\n\t\t\t} else {\n\n\t\t\t\terror( e );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemError( url );\n\n\t\t}\n\n\t}\n\n}\n\nconst _eyeRight = /*@__PURE__*/ new Matrix4();\nconst _eyeLeft = /*@__PURE__*/ new Matrix4();\nconst _projectionMatrix = /*@__PURE__*/ new Matrix4();\n\n/**\n * A special type of camera that uses two perspective cameras with\n * stereoscopic projection. Can be used for rendering stereo effects\n * like [3D Anaglyph](https://en.wikipedia.org/wiki/Anaglyph_3D) or\n * [Parallax Barrier](https://en.wikipedia.org/wiki/parallax_barrier).\n */\nclass StereoCamera {\n\n\t/**\n\t * Constructs a new stereo camera.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The type property is used for detecting the object type\n\t\t * in context of serialization/deserialization.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.type = 'StereoCamera';\n\n\t\t/**\n\t\t * The aspect.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aspect = 1;\n\n\t\t/**\n\t\t * The eye separation which represents the distance\n\t\t * between the left and right camera.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.064\n\t\t */\n\t\tthis.eyeSep = 0.064;\n\n\t\t/**\n\t\t * The camera representing the left eye. This is added to layer `1` so objects to be\n\t\t * rendered by the left camera must also be added to this layer.\n\t\t *\n\t\t * @type {PerspectiveCamera}\n\t\t */\n\t\tthis.cameraL = new PerspectiveCamera();\n\t\tthis.cameraL.layers.enable( 1 );\n\t\tthis.cameraL.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The camera representing the right eye. This is added to layer `2` so objects to be\n\t\t * rendered by the right camera must also be added to this layer.\n\t\t *\n\t\t * @type {PerspectiveCamera}\n\t\t */\n\t\tthis.cameraR = new PerspectiveCamera();\n\t\tthis.cameraR.layers.enable( 2 );\n\t\tthis.cameraR.matrixAutoUpdate = false;\n\n\t\tthis._cache = {\n\t\t\tfocus: null,\n\t\t\tfov: null,\n\t\t\taspect: null,\n\t\t\tnear: null,\n\t\t\tfar: null,\n\t\t\tzoom: null,\n\t\t\teyeSep: null\n\t\t};\n\n\t}\n\n\t/**\n\t * Updates the stereo camera based on the given perspective camera.\n\t *\n\t * @param {PerspectiveCamera} camera - The perspective camera.\n\t */\n\tupdate( camera ) {\n\n\t\tconst cache = this._cache;\n\n\t\tconst needsUpdate = cache.focus !== camera.focus || cache.fov !== camera.fov ||\n\t\t\tcache.aspect !== camera.aspect * this.aspect || cache.near !== camera.near ||\n\t\t\tcache.far !== camera.far || cache.zoom !== camera.zoom || cache.eyeSep !== this.eyeSep;\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tcache.focus = camera.focus;\n\t\t\tcache.fov = camera.fov;\n\t\t\tcache.aspect = camera.aspect * this.aspect;\n\t\t\tcache.near = camera.near;\n\t\t\tcache.far = camera.far;\n\t\t\tcache.zoom = camera.zoom;\n\t\t\tcache.eyeSep = this.eyeSep;\n\n\t\t\t// Off-axis stereoscopic effect based on\n\t\t\t// http://paulbourke.net/stereographics/stereorender/\n\n\t\t\t_projectionMatrix.copy( camera.projectionMatrix );\n\t\t\tconst eyeSepHalf = cache.eyeSep / 2;\n\t\t\tconst eyeSepOnProjection = eyeSepHalf * cache.near / cache.focus;\n\t\t\tconst ymax = ( cache.near * Math.tan( DEG2RAD * cache.fov * 0.5 ) ) / cache.zoom;\n\t\t\tlet xmin, xmax;\n\n\t\t\t// translate xOffset\n\n\t\t\t_eyeLeft.elements[ 12 ] = - eyeSepHalf;\n\t\t\t_eyeRight.elements[ 12 ] = eyeSepHalf;\n\n\t\t\t// for left eye\n\n\t\t\txmin = - ymax * cache.aspect + eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect + eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraL.projectionMatrix.copy( _projectionMatrix );\n\n\t\t\t// for right eye\n\n\t\t\txmin = - ymax * cache.aspect - eyeSepOnProjection;\n\t\t\txmax = ymax * cache.aspect - eyeSepOnProjection;\n\n\t\t\t_projectionMatrix.elements[ 0 ] = 2 * cache.near / ( xmax - xmin );\n\t\t\t_projectionMatrix.elements[ 8 ] = ( xmax + xmin ) / ( xmax - xmin );\n\n\t\t\tthis.cameraR.projectionMatrix.copy( _projectionMatrix );\n\n\t\t}\n\n\t\tthis.cameraL.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeLeft );\n\t\tthis.cameraR.matrixWorld.copy( camera.matrixWorld ).multiply( _eyeRight );\n\n\t}\n\n}\n\n/**\n * This type of camera can be used in order to efficiently render a scene with a\n * predefined set of cameras. This is an important performance aspect for\n * rendering VR scenes.\n *\n * An instance of `ArrayCamera` always has an array of sub cameras. It's mandatory\n * to define for each sub camera the `viewport` property which determines the\n * part of the viewport that is rendered with this camera.\n *\n * @augments PerspectiveCamera\n */\nclass ArrayCamera extends PerspectiveCamera {\n\n\t/**\n\t * Constructs a new array camera.\n\t *\n\t * @param {Array<PerspectiveCamera>} [array=[]] - An array of perspective sub cameras.\n\t */\n\tconstructor( array = [] ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isArrayCamera = true;\n\n\t\t/**\n\t\t * Whether this camera is used with multiview rendering or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isMultiViewCamera = false;\n\n\t\t/**\n\t\t * An array of perspective sub cameras.\n\t\t *\n\t\t * @type {Array<PerspectiveCamera>}\n\t\t */\n\t\tthis.cameras = array;\n\n\t}\n\n}\n\n/**\n * Class for keeping track of time.\n */\nclass Clock {\n\n\t/**\n\t * Constructs a new clock.\n\t *\n\t * @param {boolean} [autoStart=true] - Whether to automatically start the clock when\n\t * `getDelta()` is called for the first time.\n\t */\n\tconstructor( autoStart = true ) {\n\n\t\t/**\n\t\t * If set to `true`, the clock starts automatically when `getDelta()` is called\n\t\t * for the first time.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoStart = autoStart;\n\n\t\t/**\n\t\t * Holds the time at which the clock's `start()` method was last called.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.startTime = 0;\n\n\t\t/**\n\t\t * Holds the time at which the clock's `start()`, `getElapsedTime()` or\n\t\t * `getDelta()` methods were last called.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.oldTime = 0;\n\n\t\t/**\n\t\t * Keeps track of the total time that the clock has been running.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.elapsedTime = 0;\n\n\t\t/**\n\t\t * Whether the clock is running or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.running = false;\n\n\t}\n\n\t/**\n\t * Starts the clock. When `autoStart` is set to `true`, the method is automatically\n\t * called by the class.\n\t */\n\tstart() {\n\n\t\tthis.startTime = performance.now();\n\n\t\tthis.oldTime = this.startTime;\n\t\tthis.elapsedTime = 0;\n\t\tthis.running = true;\n\n\t}\n\n\t/**\n\t * Stops the clock.\n\t */\n\tstop() {\n\n\t\tthis.getElapsedTime();\n\t\tthis.running = false;\n\t\tthis.autoStart = false;\n\n\t}\n\n\t/**\n\t * Returns the elapsed time in seconds.\n\t *\n\t * @return {number} The elapsed time.\n\t */\n\tgetElapsedTime() {\n\n\t\tthis.getDelta();\n\t\treturn this.elapsedTime;\n\n\t}\n\n\t/**\n\t * Returns the delta time in seconds.\n\t *\n\t * @return {number} The delta time.\n\t */\n\tgetDelta() {\n\n\t\tlet diff = 0;\n\n\t\tif ( this.autoStart && ! this.running ) {\n\n\t\t\tthis.start();\n\t\t\treturn 0;\n\n\t\t}\n\n\t\tif ( this.running ) {\n\n\t\t\tconst newTime = performance.now();\n\n\t\t\tdiff = ( newTime - this.oldTime ) / 1000;\n\t\t\tthis.oldTime = newTime;\n\n\t\t\tthis.elapsedTime += diff;\n\n\t\t}\n\n\t\treturn diff;\n\n\t}\n\n}\n\nconst _position$1 = /*@__PURE__*/ new Vector3();\nconst _quaternion$1 = /*@__PURE__*/ new Quaternion();\nconst _scale$1 = /*@__PURE__*/ new Vector3();\n\nconst _forward = /*@__PURE__*/ new Vector3();\nconst _up = /*@__PURE__*/ new Vector3();\n\n/**\n * The class represents a virtual listener of the all positional and non-positional audio effects\n * in the scene. A three.js application usually creates a single listener. It is a mandatory\n * constructor parameter for audios entities like {@link Audio} and {@link PositionalAudio}.\n *\n * In most cases, the listener object is a child of the camera. So the 3D transformation of the\n * camera represents the 3D transformation of the listener.\n *\n * @augments Object3D\n */\nclass AudioListener extends Object3D {\n\n\t/**\n\t * Constructs a new audio listener.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.type = 'AudioListener';\n\n\t\t/**\n\t\t * The native audio context.\n\t\t *\n\t\t * @type {AudioContext}\n\t\t * @readonly\n\t\t */\n\t\tthis.context = AudioContext.getContext();\n\n\t\t/**\n\t\t * The gain node used for volume control.\n\t\t *\n\t\t * @type {GainNode}\n\t\t * @readonly\n\t\t */\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( this.context.destination );\n\n\t\t/**\n\t\t * An optional filter.\n\t\t *\n\t\t * Defined via {@link AudioListener#setFilter}.\n\t\t *\n\t\t * @type {?AudioNode}\n\t\t * @default null\n\t\t * @readonly\n\t\t */\n\t\tthis.filter = null;\n\n\t\t/**\n\t\t * Time delta values required for `linearRampToValueAtTime()` usage.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t * @readonly\n\t\t */\n\t\tthis.timeDelta = 0;\n\n\t\t// private\n\n\t\tthis._clock = new Clock();\n\n\t}\n\n\t/**\n\t * Returns the listener's input node.\n\t *\n\t * This method is used by other audio nodes to connect to this listener.\n\t *\n\t * @return {GainNode} The input node.\n\t */\n\tgetInput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\t/**\n\t * Removes the current filter from this listener.\n\t *\n\t * @return {AudioListener} A reference to this listener.\n\t */\n\tremoveFilter() {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\t\t\tthis.gain.connect( this.context.destination );\n\t\t\tthis.filter = null;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current set filter.\n\t *\n\t * @return {?AudioNode} The filter.\n\t */\n\tgetFilter() {\n\n\t\treturn this.filter;\n\n\t}\n\n\t/**\n\t * Sets the given filter to this listener.\n\t *\n\t * @param {AudioNode} value - The filter to set.\n\t * @return {AudioListener} A reference to this listener.\n\t */\n\tsetFilter( value ) {\n\n\t\tif ( this.filter !== null ) {\n\n\t\t\tthis.gain.disconnect( this.filter );\n\t\t\tthis.filter.disconnect( this.context.destination );\n\n\t\t} else {\n\n\t\t\tthis.gain.disconnect( this.context.destination );\n\n\t\t}\n\n\t\tthis.filter = value;\n\t\tthis.gain.connect( this.filter );\n\t\tthis.filter.connect( this.context.destination );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the applications master volume.\n\t *\n\t * @return {number} The master volume.\n\t */\n\tgetMasterVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\t/**\n\t * Sets the applications master volume. This volume setting affects\n\t * all audio nodes in the scene.\n\t *\n\t * @param {number} value - The master volume to set.\n\t * @return {AudioListener} A reference to this listener.\n\t */\n\tsetMasterVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tconst listener = this.context.listener;\n\n\t\tthis.timeDelta = this._clock.getDelta();\n\n\t\tthis.matrixWorld.decompose( _position$1, _quaternion$1, _scale$1 );\n\n\t\t// the initial forward and up directions must be orthogonal\n\t\t_forward.set( 0, 0, -1 ).applyQuaternion( _quaternion$1 );\n\t\t_up.set( 0, 1, 0 ).applyQuaternion( _quaternion$1 );\n\n\t\tif ( listener.positionX ) {\n\n\t\t\t// code path for Chrome (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.timeDelta;\n\n\t\t\tlistener.positionX.linearRampToValueAtTime( _position$1.x, endTime );\n\t\t\tlistener.positionY.linearRampToValueAtTime( _position$1.y, endTime );\n\t\t\tlistener.positionZ.linearRampToValueAtTime( _position$1.z, endTime );\n\t\t\tlistener.forwardX.linearRampToValueAtTime( _forward.x, endTime );\n\t\t\tlistener.forwardY.linearRampToValueAtTime( _forward.y, endTime );\n\t\t\tlistener.forwardZ.linearRampToValueAtTime( _forward.z, endTime );\n\t\t\tlistener.upX.linearRampToValueAtTime( _up.x, endTime );\n\t\t\tlistener.upY.linearRampToValueAtTime( _up.y, endTime );\n\t\t\tlistener.upZ.linearRampToValueAtTime( _up.z, endTime );\n\n\t\t} else {\n\n\t\t\tlistener.setPosition( _position$1.x, _position$1.y, _position$1.z );\n\t\t\tlistener.setOrientation( _forward.x, _forward.y, _forward.z, _up.x, _up.y, _up.z );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Represents a non-positional ( global ) audio object.\n *\n * This and related audio modules make use of the [Web Audio API](https://www.w3.org/TR/webaudio-1.1/).\n *\n * ```js\n * // create an AudioListener and add it to the camera\n * const listener = new THREE.AudioListener();\n * camera.add( listener );\n *\n * // create a global audio source\n * const sound = new THREE.Audio( listener );\n *\n * // load a sound and set it as the Audio object's buffer\n * const audioLoader = new THREE.AudioLoader();\n * audioLoader.load( 'sounds/ambient.ogg', function( buffer ) {\n * \tsound.setBuffer( buffer );\n * \tsound.setLoop( true );\n * \tsound.setVolume( 0.5 );\n * \tsound.play();\n * });\n * ```\n *\n * @augments Object3D\n */\nclass Audio extends Object3D {\n\n\t/**\n\t * Constructs a new audio.\n\t *\n\t * @param {AudioListener} listener - The global audio listener.\n\t */\n\tconstructor( listener ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'Audio';\n\n\t\t/**\n\t\t * The global audio listener.\n\t\t *\n\t\t * @type {AudioListener}\n\t\t * @readonly\n\t\t */\n\t\tthis.listener = listener;\n\n\t\t/**\n\t\t * The audio context.\n\t\t *\n\t\t * @type {AudioContext}\n\t\t * @readonly\n\t\t */\n\t\tthis.context = listener.context;\n\n\t\t/**\n\t\t * The gain node used for volume control.\n\t\t *\n\t\t * @type {GainNode}\n\t\t * @readonly\n\t\t */\n\t\tthis.gain = this.context.createGain();\n\t\tthis.gain.connect( listener.getInput() );\n\n\t\t/**\n\t\t * Whether to start playback automatically or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.autoplay = false;\n\n\t\t/**\n\t\t * A reference to an audio buffer.\n\t\t *\n\t\t * Defined via {@link Audio#setBuffer}.\n\t\t *\n\t\t * @type {?AudioBuffer}\n\t\t * @default null\n\t\t * @readonly\n\t\t */\n\t\tthis.buffer = null;\n\n\t\t/**\n\t\t * Modify pitch, measured in cents. +/- 100 is a semitone.\n\t\t * +/- 1200 is an octave.\n\t\t *\n\t\t * Defined via {@link Audio#setDetune}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t * @readonly\n\t\t */\n\t\tthis.detune = 0;\n\n\t\t/**\n\t\t * Whether the audio should loop or not.\n\t\t *\n\t\t * Defined via {@link Audio#setLoop}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t * @readonly\n\t\t */\n\t\tthis.loop = false;\n\n\t\t/**\n\t\t * Defines where in the audio buffer the replay should\n\t\t * start, in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.loopStart = 0;\n\n\t\t/**\n\t\t * Defines where in the audio buffer the replay should\n\t\t * stop, in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.loopEnd = 0;\n\n\t\t/**\n\t\t * An offset to the time within the audio buffer the playback\n\t\t * should begin, in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.offset = 0;\n\n\t\t/**\n\t\t * Overrides the default duration of the audio.\n\t\t *\n\t\t * @type {undefined|number}\n\t\t * @default undefined\n\t\t */\n\t\tthis.duration = undefined;\n\n\t\t/**\n\t\t * The playback speed.\n\t\t *\n\t\t * Defined via {@link Audio#setPlaybackRate}.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 1\n\t\t */\n\t\tthis.playbackRate = 1;\n\n\t\t/**\n\t\t * Indicates whether the audio is playing or not.\n\t\t *\n\t\t * This flag will be automatically set when using {@link Audio#play},\n\t\t * {@link Audio#pause}, {@link Audio#stop}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isPlaying = false;\n\n\t\t/**\n\t\t * Indicates whether the audio playback can be controlled\n\t\t * with method like {@link Audio#play} or {@link Audio#pause}.\n\t\t *\n\t\t * This flag will be automatically set when audio sources are\n\t\t * defined.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.hasPlaybackControl = true;\n\n\t\t/**\n\t\t * Holds a reference to the current audio source.\n\t\t *\n\t\t * The property is automatically by one of the `set*()` methods.\n\t\t *\n\t\t * @type {?AudioNode}\n\t\t * @readonly\n\t\t * @default null\n\t\t */\n\t\tthis.source = null;\n\n\t\t/**\n\t\t * Defines the source type.\n\t\t *\n\t\t * The property is automatically by one of the `set*()` methods.\n\t\t *\n\t\t * @type {('empty'|'audioNode'|'mediaNode'|'mediaStreamNode'|'buffer')}\n\t\t * @readonly\n\t\t * @default 'empty'\n\t\t */\n\t\tthis.sourceType = 'empty';\n\n\t\tthis._startedAt = 0;\n\t\tthis._progress = 0;\n\t\tthis._connected = false;\n\n\t\t/**\n\t\t * Can be used to apply a variety of low-order filters to create\n\t\t * more complex sound effects e.g. via `BiquadFilterNode`.\n\t\t *\n\t\t * The property is automatically set by {@link Audio#setFilters}.\n\t\t *\n\t\t * @type {Array<AudioNode>}\n\t\t * @readonly\n\t\t */\n\t\tthis.filters = [];\n\n\t}\n\n\t/**\n\t * Returns the output audio node.\n\t *\n\t * @return {GainNode} The output node.\n\t */\n\tgetOutput() {\n\n\t\treturn this.gain;\n\n\t}\n\n\t/**\n\t * Sets the given audio node as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `audioNode` and {@link Audio#hasPlaybackControl} to `false`.\n\t *\n\t * @param {AudioNode} audioNode - The audio node like an instance of `OscillatorNode`.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetNodeSource( audioNode ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'audioNode';\n\t\tthis.source = audioNode;\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given media element as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `mediaNode` and {@link Audio#hasPlaybackControl} to `false`.\n\t *\n\t * @param {HTMLMediaElement} mediaElement - The media element.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetMediaElementSource( mediaElement ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaNode';\n\t\tthis.source = this.context.createMediaElementSource( mediaElement );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given media stream as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `mediaStreamNode` and {@link Audio#hasPlaybackControl} to `false`.\n\t *\n\t * @param {MediaStream} mediaStream - The media stream.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetMediaStreamSource( mediaStream ) {\n\n\t\tthis.hasPlaybackControl = false;\n\t\tthis.sourceType = 'mediaStreamNode';\n\t\tthis.source = this.context.createMediaStreamSource( mediaStream );\n\t\tthis.connect();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given audio buffer as the source of this instance.\n\t *\n\t * {@link Audio#sourceType} is set to `buffer` and {@link Audio#hasPlaybackControl} to `true`.\n\t *\n\t * @param {AudioBuffer} audioBuffer - The audio buffer.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetBuffer( audioBuffer ) {\n\n\t\tthis.buffer = audioBuffer;\n\t\tthis.sourceType = 'buffer';\n\n\t\tif ( this.autoplay ) this.play();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Starts the playback of the audio.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {number} [delay=0] - The delay, in seconds, at which the audio should start playing.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tplay( delay = 0 ) {\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\twarn( 'Audio: Audio is already playing.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._startedAt = this.context.currentTime + delay;\n\n\t\tconst source = this.context.createBufferSource();\n\t\tsource.buffer = this.buffer;\n\t\tsource.loop = this.loop;\n\t\tsource.loopStart = this.loopStart;\n\t\tsource.loopEnd = this.loopEnd;\n\t\tsource.onended = this.onEnded.bind( this );\n\t\tsource.start( this._startedAt, this._progress + this.offset, this.duration );\n\n\t\tthis.isPlaying = true;\n\n\t\tthis.source = source;\n\n\t\tthis.setDetune( this.detune );\n\t\tthis.setPlaybackRate( this.playbackRate );\n\n\t\treturn this.connect();\n\n\t}\n\n\t/**\n\t * Pauses the playback of the audio.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tpause() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\t// update current progress\n\n\t\t\tthis._progress += Math.max( this.context.currentTime - this._startedAt, 0 ) * this.playbackRate;\n\n\t\t\tif ( this.loop === true ) {\n\n\t\t\t\t// ensure _progress does not exceed duration with looped audios\n\n\t\t\t\tthis._progress = this._progress % ( this.duration || this.buffer.duration );\n\n\t\t\t}\n\n\t\t\tthis.source.stop();\n\t\t\tthis.source.onended = null;\n\n\t\t\tthis.isPlaying = false;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Stops the playback of the audio.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {number} [delay=0] - The delay, in seconds, at which the audio should stop playing.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tstop( delay = 0 ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._progress = 0;\n\n\t\tif ( this.source !== null ) {\n\n\t\t\tthis.source.stop( this.context.currentTime + delay );\n\t\t\tthis.source.onended = null;\n\n\t\t}\n\n\t\tthis.isPlaying = false;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Connects to the audio source. This is used internally on\n\t * initialisation and when setting / removing filters.\n\t *\n\t * @return {Audio} A reference to this instance.\n\t */\n\tconnect() {\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.connect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].connect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].connect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.connect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Disconnects to the audio source. This is used internally on\n\t * initialisation and when setting / removing filters.\n\t *\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tdisconnect() {\n\n\t\tif ( this._connected === false ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.filters.length > 0 ) {\n\n\t\t\tthis.source.disconnect( this.filters[ 0 ] );\n\n\t\t\tfor ( let i = 1, l = this.filters.length; i < l; i ++ ) {\n\n\t\t\t\tthis.filters[ i - 1 ].disconnect( this.filters[ i ] );\n\n\t\t\t}\n\n\t\t\tthis.filters[ this.filters.length - 1 ].disconnect( this.getOutput() );\n\n\t\t} else {\n\n\t\t\tthis.source.disconnect( this.getOutput() );\n\n\t\t}\n\n\t\tthis._connected = false;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current set filters.\n\t *\n\t * @return {Array<AudioNode>} The list of filters.\n\t */\n\tgetFilters() {\n\n\t\treturn this.filters;\n\n\t}\n\n\t/**\n\t * Sets an array of filters and connects them with the audio source.\n\t *\n\t * @param {Array<AudioNode>} [value] - A list of filters.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetFilters( value ) {\n\n\t\tif ( ! value ) value = [];\n\n\t\tif ( this._connected === true ) {\n\n\t\t\tthis.disconnect();\n\t\t\tthis.filters = value.slice();\n\t\t\tthis.connect();\n\n\t\t} else {\n\n\t\t\tthis.filters = value.slice();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Defines the detuning of oscillation in cents.\n\t *\n\t * @param {number} value - The detuning of oscillation in cents.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetDetune( value ) {\n\n\t\tthis.detune = value;\n\n\t\tif ( this.isPlaying === true && this.source.detune !== undefined ) {\n\n\t\t\tthis.source.detune.setTargetAtTime( this.detune, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the detuning of oscillation in cents.\n\t *\n\t * @return {number} The detuning of oscillation in cents.\n\t */\n\tgetDetune() {\n\n\t\treturn this.detune;\n\n\t}\n\n\t/**\n\t * Returns the first filter in the list of filters.\n\t *\n\t * @return {AudioNode|undefined} The first filter in the list of filters.\n\t */\n\tgetFilter() {\n\n\t\treturn this.getFilters()[ 0 ];\n\n\t}\n\n\t/**\n\t * Applies a single filter node to the audio.\n\t *\n\t * @param {AudioNode} [filter] - The filter to set.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetFilter( filter ) {\n\n\t\treturn this.setFilters( filter ? [ filter ] : [] );\n\n\t}\n\n\t/**\n\t * Sets the playback rate.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {number} [value] - The playback rate to set.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tsetPlaybackRate( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.playbackRate = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.playbackRate.setTargetAtTime( this.playbackRate, this.context.currentTime, 0.01 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current playback rate.\n\n\t * @return {number} The playback rate.\n\t */\n\tgetPlaybackRate() {\n\n\t\treturn this.playbackRate;\n\n\t}\n\n\t/**\n\t * Automatically called when playback finished.\n\t */\n\tonEnded() {\n\n\t\tthis.isPlaying = false;\n\t\tthis._progress = 0;\n\n\t}\n\n\t/**\n\t * Returns the loop flag.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @return {boolean} Whether the audio should loop or not.\n\t */\n\tgetLoop() {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn this.loop;\n\n\t}\n\n\t/**\n\t * Sets the loop flag.\n\t *\n\t * Can only be used with compatible audio sources that allow playback control.\n\t *\n\t * @param {boolean} value - Whether the audio should loop or not.\n\t * @return {Audio|undefined} A reference to this instance.\n\t */\n\tsetLoop( value ) {\n\n\t\tif ( this.hasPlaybackControl === false ) {\n\n\t\t\twarn( 'Audio: this Audio has no playback control.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.loop = value;\n\n\t\tif ( this.isPlaying === true ) {\n\n\t\t\tthis.source.loop = this.loop;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the loop start value which defines where in the audio buffer the replay should\n\t * start, in seconds.\n\t *\n\t * @param {number} value - The loop start value.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetLoopStart( value ) {\n\n\t\tthis.loopStart = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the loop end value which defines where in the audio buffer the replay should\n\t * stop, in seconds.\n\t *\n\t * @param {number} value - The loop end value.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetLoopEnd( value ) {\n\n\t\tthis.loopEnd = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the volume.\n\t *\n\t * @return {number} The volume.\n\t */\n\tgetVolume() {\n\n\t\treturn this.gain.gain.value;\n\n\t}\n\n\t/**\n\t * Sets the volume.\n\t *\n\t * @param {number} value - The volume to set.\n\t * @return {Audio} A reference to this instance.\n\t */\n\tsetVolume( value ) {\n\n\t\tthis.gain.gain.setTargetAtTime( value, this.context.currentTime, 0.01 );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tif ( source.sourceType !== 'buffer' ) {\n\n\t\t\twarn( 'Audio: Audio source type cannot be copied.' );\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.autoplay = source.autoplay;\n\n\t\tthis.buffer = source.buffer;\n\t\tthis.detune = source.detune;\n\t\tthis.loop = source.loop;\n\t\tthis.loopStart = source.loopStart;\n\t\tthis.loopEnd = source.loopEnd;\n\t\tthis.offset = source.offset;\n\t\tthis.duration = source.duration;\n\t\tthis.playbackRate = source.playbackRate;\n\t\tthis.hasPlaybackControl = source.hasPlaybackControl;\n\t\tthis.sourceType = source.sourceType;\n\n\t\tthis.filters = source.filters.slice();\n\n\t\treturn this;\n\n\t}\n\n\tclone( recursive ) {\n\n\t\treturn new this.constructor( this.listener ).copy( this, recursive );\n\n\t}\n\n}\n\nconst _position = /*@__PURE__*/ new Vector3();\nconst _quaternion = /*@__PURE__*/ new Quaternion();\nconst _scale = /*@__PURE__*/ new Vector3();\nconst _orientation = /*@__PURE__*/ new Vector3();\n\n/**\n * Represents a positional audio object.\n *\n * ```js\n * // create an AudioListener and add it to the camera\n * const listener = new THREE.AudioListener();\n * camera.add( listener );\n *\n * // create the PositionalAudio object (passing in the listener)\n * const sound = new THREE.PositionalAudio( listener );\n *\n * // load a sound and set it as the PositionalAudio object's buffer\n * const audioLoader = new THREE.AudioLoader();\n * audioLoader.load( 'sounds/song.ogg', function( buffer ) {\n * \tsound.setBuffer( buffer );\n * \tsound.setRefDistance( 20 );\n * \tsound.play();\n * });\n *\n * // create an object for the sound to play from\n * const sphere = new THREE.SphereGeometry( 20, 32, 16 );\n * const material = new THREE.MeshPhongMaterial( { color: 0xff2200 } );\n * const mesh = new THREE.Mesh( sphere, material );\n * scene.add( mesh );\n *\n * // finally add the sound to the mesh\n * mesh.add( sound );\n *\n * @augments Audio\n */\nclass PositionalAudio extends Audio {\n\n\t/**\n\t * Constructs a positional audio.\n\t *\n\t * @param {AudioListener} listener - The global audio listener.\n\t */\n\tconstructor( listener ) {\n\n\t\tsuper( listener );\n\n\t\t/**\n\t\t * The panner node represents the location, direction, and behavior of an audio\n\t\t * source in 3D space.\n\t\t *\n\t\t * @type {PannerNode}\n\t\t * @readonly\n\t\t */\n\t\tthis.panner = this.context.createPanner();\n\t\tthis.panner.panningModel = 'HRTF';\n\t\tthis.panner.connect( this.gain );\n\n\t}\n\n\tconnect() {\n\n\t\tsuper.connect();\n\n\t\tthis.panner.connect( this.gain );\n\n\t\treturn this;\n\n\t}\n\n\tdisconnect() {\n\n\t\tsuper.disconnect();\n\n\t\tthis.panner.disconnect( this.gain );\n\n\t\treturn this;\n\n\t}\n\n\tgetOutput() {\n\n\t\treturn this.panner;\n\n\t}\n\n\t/**\n\t * Returns the current reference distance.\n\t *\n\t * @return {number} The reference distance.\n\t */\n\tgetRefDistance() {\n\n\t\treturn this.panner.refDistance;\n\n\t}\n\n\t/**\n\t * Defines the reference distance for reducing volume as the audio source moves\n\t * further from the listener \u2013 i.e. the distance at which the volume reduction\n\t * starts taking effect.\n\t *\n\t * @param {number} value - The reference distance to set.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetRefDistance( value ) {\n\n\t\tthis.panner.refDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current rolloff factor.\n\t *\n\t * @return {number} The rolloff factor.\n\t */\n\tgetRolloffFactor() {\n\n\t\treturn this.panner.rolloffFactor;\n\n\t}\n\n\t/**\n\t * Defines how quickly the volume is reduced as the source moves away from the listener.\n\t *\n\t * @param {number} value - The rolloff factor.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetRolloffFactor( value ) {\n\n\t\tthis.panner.rolloffFactor = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current distance model.\n\t *\n\t * @return {('linear'|'inverse'|'exponential')} The distance model.\n\t */\n\tgetDistanceModel() {\n\n\t\treturn this.panner.distanceModel;\n\n\t}\n\n\t/**\n\t * Defines which algorithm to use to reduce the volume of the audio source\n\t * as it moves away from the listener.\n\t *\n\t * Read [the spec](https://www.w3.org/TR/webaudio-1.1/#enumdef-distancemodeltype)\n\t * for more details.\n\t *\n\t * @param {('linear'|'inverse'|'exponential')} value - The distance model to set.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetDistanceModel( value ) {\n\n\t\tthis.panner.distanceModel = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current max distance.\n\t *\n\t * @return {number} The max distance.\n\t */\n\tgetMaxDistance() {\n\n\t\treturn this.panner.maxDistance;\n\n\t}\n\n\t/**\n\t * Defines the maximum distance between the audio source and the listener,\n\t * after which the volume is not reduced any further.\n\t *\n\t * This value is used only by the `linear` distance model.\n\t *\n\t * @param {number} value - The max distance.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetMaxDistance( value ) {\n\n\t\tthis.panner.maxDistance = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the directional cone in which the audio can be listened.\n\t *\n\t * @param {number} coneInnerAngle - An angle, in degrees, of a cone inside of which there will be no volume reduction.\n\t * @param {number} coneOuterAngle - An angle, in degrees, of a cone outside of which the volume will be reduced by a constant value, defined by the `coneOuterGain` parameter.\n\t * @param {number} coneOuterGain - The amount of volume reduction outside the cone defined by the `coneOuterAngle`. When set to `0`, no sound can be heard.\n\t * @return {PositionalAudio} A reference to this instance.\n\t */\n\tsetDirectionalCone( coneInnerAngle, coneOuterAngle, coneOuterGain ) {\n\n\t\tthis.panner.coneInnerAngle = coneInnerAngle;\n\t\tthis.panner.coneOuterAngle = coneOuterAngle;\n\t\tthis.panner.coneOuterGain = coneOuterGain;\n\n\t\treturn this;\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.hasPlaybackControl === true && this.isPlaying === false ) return;\n\n\t\tthis.matrixWorld.decompose( _position, _quaternion, _scale );\n\n\t\t_orientation.set( 0, 0, 1 ).applyQuaternion( _quaternion );\n\n\t\tconst panner = this.panner;\n\n\t\tif ( panner.positionX ) {\n\n\t\t\t// code path for Chrome and Firefox (see #14393)\n\n\t\t\tconst endTime = this.context.currentTime + this.listener.timeDelta;\n\n\t\t\tpanner.positionX.linearRampToValueAtTime( _position.x, endTime );\n\t\t\tpanner.positionY.linearRampToValueAtTime( _position.y, endTime );\n\t\t\tpanner.positionZ.linearRampToValueAtTime( _position.z, endTime );\n\t\t\tpanner.orientationX.linearRampToValueAtTime( _orientation.x, endTime );\n\t\t\tpanner.orientationY.linearRampToValueAtTime( _orientation.y, endTime );\n\t\t\tpanner.orientationZ.linearRampToValueAtTime( _orientation.z, endTime );\n\n\t\t} else {\n\n\t\t\tpanner.setPosition( _position.x, _position.y, _position.z );\n\t\t\tpanner.setOrientation( _orientation.x, _orientation.y, _orientation.z );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * This class can be used to analyse audio data.\n *\n * ```js\n * // create an AudioListener and add it to the camera\n * const listener = new THREE.AudioListener();\n * camera.add( listener );\n *\n * // create an Audio source\n * const sound = new THREE.Audio( listener );\n *\n * // load a sound and set it as the Audio object's buffer\n * const audioLoader = new THREE.AudioLoader();\n * audioLoader.load( 'sounds/ambient.ogg', function( buffer ) {\n * \tsound.setBuffer( buffer );\n * \tsound.setLoop(true);\n * \tsound.setVolume(0.5);\n * \tsound.play();\n * });\n *\n * // create an AudioAnalyser, passing in the sound and desired fftSize\n * const analyser = new THREE.AudioAnalyser( sound, 32 );\n *\n * // get the average frequency of the sound\n * const data = analyser.getAverageFrequency();\n * ```\n */\nclass AudioAnalyser {\n\n\t/**\n\t * Constructs a new audio analyzer.\n\t *\n\t * @param {Audio} audio - The audio to analyze.\n\t * @param {number} [fftSize=2048] - The window size in samples that is used when performing a Fast Fourier Transform (FFT) to get frequency domain data.\n\t */\n\tconstructor( audio, fftSize = 2048 ) {\n\n\t\t/**\n\t\t * The global audio listener.\n\t\t *\n\t\t * @type {AnalyserNode}\n\t\t */\n\t\tthis.analyser = audio.context.createAnalyser();\n\t\tthis.analyser.fftSize = fftSize;\n\n\t\t/**\n\t\t * Holds the analyzed data.\n\t\t *\n\t\t * @type {Uint8Array}\n\t\t */\n\t\tthis.data = new Uint8Array( this.analyser.frequencyBinCount );\n\n\t\taudio.getOutput().connect( this.analyser );\n\n\t}\n\n\t/**\n\t * Returns an array with frequency data of the audio.\n\t *\n\t * Each item in the array represents the decibel value for a specific frequency.\n\t * The frequencies are spread linearly from 0 to 1/2 of the sample rate.\n\t * For example, for 48000 sample rate, the last item of the array will represent\n\t * the decibel value for 24000 Hz.\n\t *\n\t * @return {Uint8Array} The frequency data.\n\t */\n\tgetFrequencyData() {\n\n\t\tthis.analyser.getByteFrequencyData( this.data );\n\n\t\treturn this.data;\n\n\t}\n\n\t/**\n\t * Returns the average of the frequencies returned by {@link AudioAnalyser#getFrequencyData}.\n\t *\n\t * @return {number} The average frequency.\n\t */\n\tgetAverageFrequency() {\n\n\t\tlet value = 0;\n\t\tconst data = this.getFrequencyData();\n\n\t\tfor ( let i = 0; i < data.length; i ++ ) {\n\n\t\t\tvalue += data[ i ];\n\n\t\t}\n\n\t\treturn value / data.length;\n\n\t}\n\n}\n\n/**\n * Buffered scene graph property that allows weighted accumulation; used internally.\n */\nclass PropertyMixer {\n\n\t/**\n\t * Constructs a new property mixer.\n\t *\n\t * @param {PropertyBinding} binding - The property binding.\n\t * @param {string} typeName - The keyframe track type name.\n\t * @param {number} valueSize - The keyframe track value size.\n\t */\n\tconstructor( binding, typeName, valueSize ) {\n\n\t\t/**\n\t\t * The property binding.\n\t\t *\n\t\t * @type {PropertyBinding}\n\t\t */\n\t\tthis.binding = binding;\n\n\t\t/**\n\t\t * The keyframe track value size.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.valueSize = valueSize;\n\n\t\tlet mixFunction,\n\t\t\tmixFunctionAdditive,\n\t\t\tsetIdentity;\n\n\t\t// buffer layout: [ incoming | accu0 | accu1 | orig | addAccu | (optional work) ]\n\t\t//\n\t\t// interpolators can use .buffer as their .result\n\t\t// the data then goes to 'incoming'\n\t\t//\n\t\t// 'accu0' and 'accu1' are used frame-interleaved for\n\t\t// the cumulative result and are compared to detect\n\t\t// changes\n\t\t//\n\t\t// 'orig' stores the original state of the property\n\t\t//\n\t\t// 'add' is used for additive cumulative results\n\t\t//\n\t\t// 'work' is optional and is only present for quaternion types. It is used\n\t\t// to store intermediate quaternion multiplication results\n\n\t\tswitch ( typeName ) {\n\n\t\t\tcase 'quaternion':\n\t\t\t\tmixFunction = this._slerp;\n\t\t\t\tmixFunctionAdditive = this._slerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityQuaternion;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 6 );\n\t\t\t\tthis._workIndex = 5;\n\t\t\t\tbreak;\n\n\t\t\tcase 'string':\n\t\t\tcase 'bool':\n\t\t\t\tmixFunction = this._select;\n\n\t\t\t\t// Use the regular mix function and for additive on these types,\n\t\t\t\t// additive is not relevant for non-numeric types\n\t\t\t\tmixFunctionAdditive = this._select;\n\n\t\t\t\tsetIdentity = this._setAdditiveIdentityOther;\n\n\t\t\t\tthis.buffer = new Array( valueSize * 5 );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tmixFunction = this._lerp;\n\t\t\t\tmixFunctionAdditive = this._lerpAdditive;\n\t\t\t\tsetIdentity = this._setAdditiveIdentityNumeric;\n\n\t\t\t\tthis.buffer = new Float64Array( valueSize * 5 );\n\n\t\t}\n\n\t\tthis._mixBufferRegion = mixFunction;\n\t\tthis._mixBufferRegionAdditive = mixFunctionAdditive;\n\t\tthis._setIdentity = setIdentity;\n\t\tthis._origIndex = 3;\n\t\tthis._addIndex = 4;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.cumulativeWeight = 0;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.useCount = 0;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.referenceCount = 0;\n\n\t}\n\n\t/**\n\t * Accumulates data in the `incoming` region into `accu<i>`.\n\t *\n\t * @param {number} accuIndex - The accumulation index.\n\t * @param {number} weight - The weight.\n\t */\n\taccumulate( accuIndex, weight ) {\n\n\t\t// note: happily accumulating nothing when weight = 0, the caller knows\n\t\t// the weight and shouldn't have made the call in the first place\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = accuIndex * stride + stride;\n\n\t\tlet currentWeight = this.cumulativeWeight;\n\n\t\tif ( currentWeight === 0 ) {\n\n\t\t\t// accuN := incoming * weight\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ offset + i ] = buffer[ i ];\n\n\t\t\t}\n\n\t\t\tcurrentWeight = weight;\n\n\t\t} else {\n\n\t\t\t// accuN := accuN + incoming * weight\n\n\t\t\tcurrentWeight += weight;\n\t\t\tconst mix = weight / currentWeight;\n\t\t\tthis._mixBufferRegion( buffer, offset, 0, mix, stride );\n\n\t\t}\n\n\t\tthis.cumulativeWeight = currentWeight;\n\n\t}\n\n\t/**\n\t * Accumulates data in the `incoming` region into `add`.\n\t *\n\t * @param {number} weight - The weight.\n\t */\n\taccumulateAdditive( weight ) {\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\t\t\toffset = stride * this._addIndex;\n\n\t\tif ( this.cumulativeWeightAdditive === 0 ) {\n\n\t\t\t// add = identity\n\n\t\t\tthis._setIdentity();\n\n\t\t}\n\n\t\t// add := add + incoming * weight\n\n\t\tthis._mixBufferRegionAdditive( buffer, offset, 0, weight, stride );\n\t\tthis.cumulativeWeightAdditive += weight;\n\n\t}\n\n\t/**\n\t * Applies the state of `accu<i>` to the binding when accus differ.\n\t *\n\t * @param {number} accuIndex - The accumulation index.\n\t */\n\tapply( accuIndex ) {\n\n\t\tconst stride = this.valueSize,\n\t\t\tbuffer = this.buffer,\n\t\t\toffset = accuIndex * stride + stride,\n\n\t\t\tweight = this.cumulativeWeight,\n\t\t\tweightAdditive = this.cumulativeWeightAdditive,\n\n\t\t\tbinding = this.binding;\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t\tif ( weight < 1 ) {\n\n\t\t\t// accuN := accuN + original * ( 1 - cumulativeWeight )\n\n\t\t\tconst originalValueOffset = stride * this._origIndex;\n\n\t\t\tthis._mixBufferRegion(\n\t\t\t\tbuffer, offset, originalValueOffset, 1 - weight, stride );\n\n\t\t}\n\n\t\tif ( weightAdditive > 0 ) {\n\n\t\t\t// accuN := accuN + additive accuN\n\n\t\t\tthis._mixBufferRegionAdditive( buffer, offset, this._addIndex * stride, 1, stride );\n\n\t\t}\n\n\t\tfor ( let i = stride, e = stride + stride; i !== e; ++ i ) {\n\n\t\t\tif ( buffer[ i ] !== buffer[ i + stride ] ) {\n\n\t\t\t\t// value has changed -> update scene graph\n\n\t\t\t\tbinding.setValue( buffer, offset );\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\n\t/**\n\t * Remembers the state of the bound property and copy it to both accus.\n\t */\n\tsaveOriginalState() {\n\n\t\tconst binding = this.binding;\n\n\t\tconst buffer = this.buffer,\n\t\t\tstride = this.valueSize,\n\n\t\t\toriginalValueOffset = stride * this._origIndex;\n\n\t\tbinding.getValue( buffer, originalValueOffset );\n\n\t\t// accu[0..1] := orig -- initially detect changes against the original\n\t\tfor ( let i = stride, e = originalValueOffset; i !== e; ++ i ) {\n\n\t\t\tbuffer[ i ] = buffer[ originalValueOffset + ( i % stride ) ];\n\n\t\t}\n\n\t\t// Add to identity for additive\n\t\tthis._setIdentity();\n\n\t\tthis.cumulativeWeight = 0;\n\t\tthis.cumulativeWeightAdditive = 0;\n\n\t}\n\n\t/**\n\t * Applies the state previously taken via {@link PropertyMixer#saveOriginalState} to the binding.\n\t */\n\trestoreOriginalState() {\n\n\t\tconst originalValueOffset = this.valueSize * 3;\n\t\tthis.binding.setValue( this.buffer, originalValueOffset );\n\n\t}\n\n\t// internals\n\n\t_setAdditiveIdentityNumeric() {\n\n\t\tconst startIndex = this._addIndex * this.valueSize;\n\t\tconst endIndex = startIndex + this.valueSize;\n\n\t\tfor ( let i = startIndex; i < endIndex; i ++ ) {\n\n\t\t\tthis.buffer[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\t_setAdditiveIdentityQuaternion() {\n\n\t\tthis._setAdditiveIdentityNumeric();\n\t\tthis.buffer[ this._addIndex * this.valueSize + 3 ] = 1;\n\n\t}\n\n\t_setAdditiveIdentityOther() {\n\n\t\tconst startIndex = this._origIndex * this.valueSize;\n\t\tconst targetIndex = this._addIndex * this.valueSize;\n\n\t\tfor ( let i = 0; i < this.valueSize; i ++ ) {\n\n\t\t\tthis.buffer[ targetIndex + i ] = this.buffer[ startIndex + i ];\n\n\t\t}\n\n\t}\n\n\n\t// mix functions\n\n\t_select( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tif ( t >= 0.5 ) {\n\n\t\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\t\tbuffer[ dstOffset + i ] = buffer[ srcOffset + i ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_slerp( buffer, dstOffset, srcOffset, t ) {\n\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, srcOffset, t );\n\n\t}\n\n\t_slerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst workOffset = this._workIndex * stride;\n\n\t\t// Store result in intermediate buffer offset\n\t\tQuaternion.multiplyQuaternionsFlat( buffer, workOffset, buffer, dstOffset, buffer, srcOffset );\n\n\t\t// Slerp to the intermediate result\n\t\tQuaternion.slerpFlat( buffer, dstOffset, buffer, dstOffset, buffer, workOffset, t );\n\n\t}\n\n\t_lerp( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tconst s = 1 - t;\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] * s + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n\t_lerpAdditive( buffer, dstOffset, srcOffset, t, stride ) {\n\n\t\tfor ( let i = 0; i !== stride; ++ i ) {\n\n\t\t\tconst j = dstOffset + i;\n\n\t\t\tbuffer[ j ] = buffer[ j ] + buffer[ srcOffset + i ] * t;\n\n\t\t}\n\n\t}\n\n}\n\n// Characters [].:/ are reserved for track binding syntax.\nconst _RESERVED_CHARS_RE = '\\\\[\\\\]\\\\.:\\\\/';\nconst _reservedRe = new RegExp( '[' + _RESERVED_CHARS_RE + ']', 'g' );\n\n// Attempts to allow node names from any language. ES5's `\\w` regexp matches\n// only latin characters, and the unicode \\p{L} is not yet supported. So\n// instead, we exclude reserved characters and match everything else.\nconst _wordChar = '[^' + _RESERVED_CHARS_RE + ']';\nconst _wordCharOrDot = '[^' + _RESERVED_CHARS_RE.replace( '\\\\.', '' ) + ']';\n\n// Parent directories, delimited by '/' or ':'. Currently unused, but must\n// be matched to parse the rest of the track name.\nconst _directoryRe = /*@__PURE__*/ /((?:WC+[\\/:])*)/.source.replace( 'WC', _wordChar );\n\n// Target node. May contain word characters (a-zA-Z0-9_) and '.' or '-'.\nconst _nodeRe = /*@__PURE__*/ /(WCOD+)?/.source.replace( 'WCOD', _wordCharOrDot );\n\n// Object on target node, and accessor. May not contain reserved\n// characters. Accessor may contain any character except closing bracket.\nconst _objectRe = /*@__PURE__*/ /(?:\\.(WC+)(?:\\[(.+)\\])?)?/.source.replace( 'WC', _wordChar );\n\n// Property and accessor. May not contain reserved characters. Accessor may\n// contain any non-bracket characters.\nconst _propertyRe = /*@__PURE__*/ /\\.(WC+)(?:\\[(.+)\\])?/.source.replace( 'WC', _wordChar );\n\nconst _trackRe = new RegExp( ''\n\t+ '^'\n\t+ _directoryRe\n\t+ _nodeRe\n\t+ _objectRe\n\t+ _propertyRe\n\t+ '$'\n);\n\nconst _supportedObjectNames = [ 'material', 'materials', 'bones', 'map' ];\n\nclass Composite {\n\n\tconstructor( targetGroup, path, optionalParsedPath ) {\n\n\t\tconst parsedPath = optionalParsedPath || PropertyBinding.parseTrackName( path );\n\n\t\tthis._targetGroup = targetGroup;\n\t\tthis._bindings = targetGroup.subscribe_( path, parsedPath );\n\n\t}\n\n\tgetValue( array, offset ) {\n\n\t\tthis.bind(); // bind all binding\n\n\t\tconst firstValidIndex = this._targetGroup.nCachedObjects_,\n\t\t\tbinding = this._bindings[ firstValidIndex ];\n\n\t\t// and only call .getValue on the first\n\t\tif ( binding !== undefined ) binding.getValue( array, offset );\n\n\t}\n\n\tsetValue( array, offset ) {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].setValue( array, offset );\n\n\t\t}\n\n\t}\n\n\tbind() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].bind();\n\n\t\t}\n\n\t}\n\n\tunbind() {\n\n\t\tconst bindings = this._bindings;\n\n\t\tfor ( let i = this._targetGroup.nCachedObjects_, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tbindings[ i ].unbind();\n\n\t\t}\n\n\t}\n\n}\n\n// Note: This class uses a State pattern on a per-method basis:\n// 'bind' sets 'this.getValue' / 'setValue' and shadows the\n// prototype version of these methods with one that represents\n// the bound state. When the property is not found, the methods\n// become no-ops.\n\n\n/**\n * This holds a reference to a real property in the scene graph; used internally.\n */\nclass PropertyBinding {\n\n\t/**\n\t * Constructs a new property binding.\n\t *\n\t * @param {Object} rootNode - The root node.\n\t * @param {string} path - The path.\n\t * @param {?Object} [parsedPath] - The parsed path.\n\t */\n\tconstructor( rootNode, path, parsedPath ) {\n\n\t\t/**\n\t\t * The object path to the animated property.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.path = path;\n\n\t\t/**\n\t\t * An object holding information about the path.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parsedPath = parsedPath || PropertyBinding.parseTrackName( path );\n\n\t\t/**\n\t\t * The object owns the animated property.\n\t\t *\n\t\t * @type {?Object}\n\t\t */\n\t\tthis.node = PropertyBinding.findNode( rootNode, this.parsedPath.nodeName );\n\n\t\t/**\n\t\t * The root node.\n\t\t *\n\t\t * @type {Object3D|Skeleton}\n\t\t */\n\t\tthis.rootNode = rootNode;\n\n\t\t// initial state of these methods that calls 'bind'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n\n\t/**\n\t * Factory method for creating a property binding from the given parameters.\n\t *\n\t * @static\n\t * @param {Object} root - The root node.\n\t * @param {string} path - The path.\n\t * @param {?Object} [parsedPath] - The parsed path.\n\t * @return {PropertyBinding|Composite} The created property binding or composite.\n\t */\n\tstatic create( root, path, parsedPath ) {\n\n\t\tif ( ! ( root && root.isAnimationObjectGroup ) ) {\n\n\t\t\treturn new PropertyBinding( root, path, parsedPath );\n\n\t\t} else {\n\n\t\t\treturn new PropertyBinding.Composite( root, path, parsedPath );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Replaces spaces with underscores and removes unsupported characters from\n\t * node names, to ensure compatibility with parseTrackName().\n\t *\n\t * @param {string} name - Node name to be sanitized.\n\t * @return {string} The sanitized node name.\n\t */\n\tstatic sanitizeNodeName( name ) {\n\n\t\treturn name.replace( /\\s/g, '_' ).replace( _reservedRe, '' );\n\n\t}\n\n\t/**\n\t * Parses the given track name (an object path to an animated property) and\n\t * returns an object with information about the path. Matches strings in the following forms:\n\t *\n\t * - nodeName.property\n\t * - nodeName.property[accessor]\n\t * - nodeName.material.property[accessor]\n\t * - uuid.property[accessor]\n\t * - uuid.objectName[objectIndex].propertyName[propertyIndex]\n\t * - parentName/nodeName.property\n\t * - parentName/parentName/nodeName.property[index]\n\t * - .bone[Armature.DEF_cog].position\n\t * - scene:helium_balloon_model:helium_balloon_model.position\n\t *\n\t * @static\n\t * @param {string} trackName - The track name to parse.\n\t * @return {Object} The parsed track name as an object.\n\t */\n\tstatic parseTrackName( trackName ) {\n\n\t\tconst matches = _trackRe.exec( trackName );\n\n\t\tif ( matches === null ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: Cannot parse trackName: ' + trackName );\n\n\t\t}\n\n\t\tconst results = {\n\t\t\t// directoryName: matches[ 1 ], // (tschw) currently unused\n\t\t\tnodeName: matches[ 2 ],\n\t\t\tobjectName: matches[ 3 ],\n\t\t\tobjectIndex: matches[ 4 ],\n\t\t\tpropertyName: matches[ 5 ], // required\n\t\t\tpropertyIndex: matches[ 6 ]\n\t\t};\n\n\t\tconst lastDot = results.nodeName && results.nodeName.lastIndexOf( '.' );\n\n\t\tif ( lastDot !== undefined && lastDot !== -1 ) {\n\n\t\t\tconst objectName = results.nodeName.substring( lastDot + 1 );\n\n\t\t\t// Object names must be checked against an allowlist. Otherwise, there\n\t\t\t// is no way to parse 'foo.bar.baz': 'baz' must be a property, but\n\t\t\t// 'bar' could be the objectName, or part of a nodeName (which can\n\t\t\t// include '.' characters).\n\t\t\tif ( _supportedObjectNames.indexOf( objectName ) !== -1 ) {\n\n\t\t\t\tresults.nodeName = results.nodeName.substring( 0, lastDot );\n\t\t\t\tresults.objectName = objectName;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( results.propertyName === null || results.propertyName.length === 0 ) {\n\n\t\t\tthrow new Error( 'PropertyBinding: can not parse propertyName from trackName: ' + trackName );\n\n\t\t}\n\n\t\treturn results;\n\n\t}\n\n\t/**\n\t * Searches for a node in the hierarchy of the given root object by the given\n\t * node name.\n\t *\n\t * @static\n\t * @param {Object} root - The root object.\n\t * @param {string|number} nodeName - The name of the node.\n\t * @return {?Object} The found node. Returns `null` if no object was found.\n\t */\n\tstatic findNode( root, nodeName ) {\n\n\t\tif ( nodeName === undefined || nodeName === '' || nodeName === '.' || nodeName === -1 || nodeName === root.name || nodeName === root.uuid ) {\n\n\t\t\treturn root;\n\n\t\t}\n\n\t\t// search into skeleton bones.\n\t\tif ( root.skeleton ) {\n\n\t\t\tconst bone = root.skeleton.getBoneByName( nodeName );\n\n\t\t\tif ( bone !== undefined ) {\n\n\t\t\t\treturn bone;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// search into node subtree.\n\t\tif ( root.children ) {\n\n\t\t\tconst searchNodeSubtree = function ( children ) {\n\n\t\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\t\tconst childNode = children[ i ];\n\n\t\t\t\t\tif ( childNode.name === nodeName || childNode.uuid === nodeName ) {\n\n\t\t\t\t\t\treturn childNode;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst result = searchNodeSubtree( childNode.children );\n\n\t\t\t\t\tif ( result ) return result;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t};\n\n\t\t\tconst subTreeNode = searchNodeSubtree( root.children );\n\n\t\t\tif ( subTreeNode ) {\n\n\t\t\t\treturn subTreeNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t// these are used to \"bind\" a nonexistent property\n\t_getValue_unavailable() {}\n\t_setValue_unavailable() {}\n\n\t// Getters\n\n\t_getValue_direct( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.targetObject[ this.propertyName ];\n\n\t}\n\n\t_getValue_array( buffer, offset ) {\n\n\t\tconst source = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = source.length; i !== n; ++ i ) {\n\n\t\t\tbuffer[ offset ++ ] = source[ i ];\n\n\t\t}\n\n\t}\n\n\t_getValue_arrayElement( buffer, offset ) {\n\n\t\tbuffer[ offset ] = this.resolvedProperty[ this.propertyIndex ];\n\n\t}\n\n\t_getValue_toArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.toArray( buffer, offset );\n\n\t}\n\n\t// Direct\n\n\t_setValue_direct( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_direct_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_direct_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.targetObject[ this.propertyName ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// EntireArray\n\n\t_setValue_array( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t}\n\n\t_setValue_array_setNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_array_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tconst dest = this.resolvedProperty;\n\n\t\tfor ( let i = 0, n = dest.length; i !== n; ++ i ) {\n\n\t\t\tdest[ i ] = buffer[ offset ++ ];\n\n\t\t}\n\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// ArrayElement\n\n\t_setValue_arrayElement( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\n\t}\n\n\t_setValue_arrayElement_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_arrayElement_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty[ this.propertyIndex ] = buffer[ offset ];\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t// HasToFromArray\n\n\t_setValue_fromArray( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\n\t}\n\n\t_setValue_fromArray_setNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.needsUpdate = true;\n\n\t}\n\n\t_setValue_fromArray_setMatrixWorldNeedsUpdate( buffer, offset ) {\n\n\t\tthis.resolvedProperty.fromArray( buffer, offset );\n\t\tthis.targetObject.matrixWorldNeedsUpdate = true;\n\n\t}\n\n\t_getValue_unbound( targetArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.getValue( targetArray, offset );\n\n\t}\n\n\t_setValue_unbound( sourceArray, offset ) {\n\n\t\tthis.bind();\n\t\tthis.setValue( sourceArray, offset );\n\n\t}\n\n\t/**\n\t * Creates a getter / setter pair for the property tracked by this binding.\n\t */\n\tbind() {\n\n\t\tlet targetObject = this.node;\n\t\tconst parsedPath = this.parsedPath;\n\n\t\tconst objectName = parsedPath.objectName;\n\t\tconst propertyName = parsedPath.propertyName;\n\t\tlet propertyIndex = parsedPath.propertyIndex;\n\n\t\tif ( ! targetObject ) {\n\n\t\t\ttargetObject = PropertyBinding.findNode( this.rootNode, parsedPath.nodeName );\n\n\t\t\tthis.node = targetObject;\n\n\t\t}\n\n\t\t// set fail state so we can just 'return' on error\n\t\tthis.getValue = this._getValue_unavailable;\n\t\tthis.setValue = this._setValue_unavailable;\n\n\t\t// ensure there is a value node\n\t\tif ( ! targetObject ) {\n\n\t\t\twarn( 'PropertyBinding: No target node found for track: ' + this.path + '.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( objectName ) {\n\n\t\t\tlet objectIndex = parsedPath.objectIndex;\n\n\t\t\t// special cases were we need to reach deeper into the hierarchy to get the face materials....\n\t\t\tswitch ( objectName ) {\n\n\t\t\t\tcase 'materials':\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.materials ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material.materials as node.material does not have a materials array.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.materials;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bones':\n\n\t\t\t\t\tif ( ! targetObject.skeleton ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to bones as node does not have a skeleton.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// potential future optimization: skip this if propertyIndex is already an integer\n\t\t\t\t\t// and convert the integer string to a true integer.\n\n\t\t\t\t\ttargetObject = targetObject.skeleton.bones;\n\n\t\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\t\tfor ( let i = 0; i < targetObject.length; i ++ ) {\n\n\t\t\t\t\t\tif ( targetObject[ i ].name === objectIndex ) {\n\n\t\t\t\t\t\t\tobjectIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'map':\n\n\t\t\t\t\tif ( 'map' in targetObject ) {\n\n\t\t\t\t\t\ttargetObject = targetObject.map;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material as node does not have a material.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! targetObject.material.map ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to material.map as node.material does not have a map.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject.material.map;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tif ( targetObject[ objectName ] === undefined ) {\n\n\t\t\t\t\t\terror( 'PropertyBinding: Can not bind to objectName of node undefined.', this );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttargetObject = targetObject[ objectName ];\n\n\t\t\t}\n\n\n\t\t\tif ( objectIndex !== undefined ) {\n\n\t\t\t\tif ( targetObject[ objectIndex ] === undefined ) {\n\n\t\t\t\t\terror( 'PropertyBinding: Trying to bind to objectIndex of objectName, but is undefined.', this, targetObject );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\ttargetObject = targetObject[ objectIndex ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// resolve property\n\t\tconst nodeProperty = targetObject[ propertyName ];\n\n\t\tif ( nodeProperty === undefined ) {\n\n\t\t\tconst nodeName = parsedPath.nodeName;\n\n\t\t\terror( 'PropertyBinding: Trying to update property for track: ' + nodeName +\n\t\t\t\t'.' + propertyName + ' but it wasn\\'t found.', targetObject );\n\t\t\treturn;\n\n\t\t}\n\n\t\t// determine versioning scheme\n\t\tlet versioning = this.Versioning.None;\n\n\t\tthis.targetObject = targetObject;\n\n\t\tif ( targetObject.isMaterial === true ) {\n\n\t\t\tversioning = this.Versioning.NeedsUpdate;\n\n\t\t} else if ( targetObject.isObject3D === true ) {\n\n\t\t\tversioning = this.Versioning.MatrixWorldNeedsUpdate;\n\n\t\t}\n\n\t\t// determine how the property gets bound\n\t\tlet bindingType = this.BindingType.Direct;\n\n\t\tif ( propertyIndex !== undefined ) {\n\n\t\t\t// access a sub element of the property array (only primitives are supported right now)\n\n\t\t\tif ( propertyName === 'morphTargetInfluences' ) {\n\n\t\t\t\t// potential optimization, skip this if propertyIndex is already an integer, and convert the integer string to a true integer.\n\n\t\t\t\t// support resolving morphTarget names into indices.\n\t\t\t\tif ( ! targetObject.geometry ) {\n\n\t\t\t\t\terror( 'PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! targetObject.geometry.morphAttributes ) {\n\n\t\t\t\t\terror( 'PropertyBinding: Can not bind to morphTargetInfluences because node does not have a geometry.morphAttributes.', this );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( targetObject.morphTargetDictionary[ propertyIndex ] !== undefined ) {\n\n\t\t\t\t\tpropertyIndex = targetObject.morphTargetDictionary[ propertyIndex ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tbindingType = this.BindingType.ArrayElement;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\t\t\tthis.propertyIndex = propertyIndex;\n\n\t\t} else if ( nodeProperty.fromArray !== undefined && nodeProperty.toArray !== undefined ) {\n\n\t\t\t// must use copy for Object3D.Euler/Quaternion\n\n\t\t\tbindingType = this.BindingType.HasFromToArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else if ( Array.isArray( nodeProperty ) ) {\n\n\t\t\tbindingType = this.BindingType.EntireArray;\n\n\t\t\tthis.resolvedProperty = nodeProperty;\n\n\t\t} else {\n\n\t\t\tthis.propertyName = propertyName;\n\n\t\t}\n\n\t\t// select getter / setter\n\t\tthis.getValue = this.GetterByBindingType[ bindingType ];\n\t\tthis.setValue = this.SetterByBindingTypeAndVersioning[ bindingType ][ versioning ];\n\n\t}\n\n\t/**\n\t * Unbinds the property.\n\t */\n\tunbind() {\n\n\t\tthis.node = null;\n\n\t\t// back to the prototype version of getValue / setValue\n\t\t// note: avoiding to mutate the shape of 'this' via 'delete'\n\t\tthis.getValue = this._getValue_unbound;\n\t\tthis.setValue = this._setValue_unbound;\n\n\t}\n\n}\n\nPropertyBinding.Composite = Composite;\n\nPropertyBinding.prototype.BindingType = {\n\tDirect: 0,\n\tEntireArray: 1,\n\tArrayElement: 2,\n\tHasFromToArray: 3\n};\n\nPropertyBinding.prototype.Versioning = {\n\tNone: 0,\n\tNeedsUpdate: 1,\n\tMatrixWorldNeedsUpdate: 2\n};\n\nPropertyBinding.prototype.GetterByBindingType = [\n\n\tPropertyBinding.prototype._getValue_direct,\n\tPropertyBinding.prototype._getValue_array,\n\tPropertyBinding.prototype._getValue_arrayElement,\n\tPropertyBinding.prototype._getValue_toArray,\n\n];\n\nPropertyBinding.prototype.SetterByBindingTypeAndVersioning = [\n\n\t[\n\t\t// Direct\n\t\tPropertyBinding.prototype._setValue_direct,\n\t\tPropertyBinding.prototype._setValue_direct_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_direct_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// EntireArray\n\n\t\tPropertyBinding.prototype._setValue_array,\n\t\tPropertyBinding.prototype._setValue_array_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_array_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// ArrayElement\n\t\tPropertyBinding.prototype._setValue_arrayElement,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_arrayElement_setMatrixWorldNeedsUpdate,\n\n\t], [\n\n\t\t// HasToFromArray\n\t\tPropertyBinding.prototype._setValue_fromArray,\n\t\tPropertyBinding.prototype._setValue_fromArray_setNeedsUpdate,\n\t\tPropertyBinding.prototype._setValue_fromArray_setMatrixWorldNeedsUpdate,\n\n\t]\n\n];\n\n/**\n * A group of objects that receives a shared animation state.\n *\n * Usage:\n *\n * - Add objects you would otherwise pass as 'root' to the\n * constructor or the .clipAction method of AnimationMixer.\n * - Instead pass this object as 'root'.\n * - You can also add and remove objects later when the mixer is running.\n *\n * Note:\n *\n * - Objects of this class appear as one object to the mixer,\n * so cache control of the individual objects must be done on the group.\n *\n * Limitation:\n *\n * - The animated properties must be compatible among the all objects in the group.\n * - A single property can either be controlled through a target group or directly, but not both.\n */\nclass AnimationObjectGroup {\n\n\t/**\n\t * Constructs a new animation group.\n\t *\n\t * @param {...Object3D} arguments - An arbitrary number of 3D objects that share the same animation state.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isAnimationObjectGroup = true;\n\n\t\t/**\n\t\t * The UUID of the 3D object.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = generateUUID();\n\n\t\t// cached objects followed by the active ones\n\t\tthis._objects = Array.prototype.slice.call( arguments );\n\n\t\tthis.nCachedObjects_ = 0; // threshold\n\t\t// note: read by PropertyBinding.Composite\n\n\t\tconst indices = {};\n\t\tthis._indicesByUUID = indices; // for bookkeeping\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tindices[ arguments[ i ].uuid ] = i;\n\n\t\t}\n\n\t\tthis._paths = []; // inside: string\n\t\tthis._parsedPaths = []; // inside: { we don't care, here }\n\t\tthis._bindings = []; // inside: Array< PropertyBinding >\n\t\tthis._bindingsIndicesByPath = {}; // inside: indices in these arrays\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tobjects: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._objects.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn this.total - scope.nCachedObjects_;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tget bindingsPerObject() {\n\n\t\t\t\treturn scope._bindings.length;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t/**\n\t * Adds an arbitrary number of objects to this animation group.\n\t *\n\t * @param {...Object3D} arguments - The 3D objects to add.\n\t */\n\tadd() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tpaths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet knownObject = undefined,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid;\n\t\t\tlet index = indicesByUUID[ uuid ];\n\n\t\t\tif ( index === undefined ) {\n\n\t\t\t\t// unknown object -> add it to the ACTIVE region\n\n\t\t\t\tindex = nObjects ++;\n\t\t\t\tindicesByUUID[ uuid ] = index;\n\t\t\t\tobjects.push( object );\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tbindings[ j ].push( new PropertyBinding( object, paths[ j ], parsedPaths[ j ] ) );\n\n\t\t\t\t}\n\n\t\t\t} else if ( index < nCachedObjects ) {\n\n\t\t\t\tknownObject = objects[ index ];\n\n\t\t\t\t// move existing object to the ACTIVE region\n\n\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ];\n\n\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = firstActiveIndex;\n\t\t\t\tobjects[ firstActiveIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ];\n\n\t\t\t\t\tlet binding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\n\t\t\t\t\tif ( binding === undefined ) {\n\n\t\t\t\t\t\t// since we do not bother to create new bindings\n\t\t\t\t\t\t// for objects that are cached, the binding may\n\t\t\t\t\t\t// or may not exist\n\n\t\t\t\t\t\tbinding = new PropertyBinding( object, paths[ j ], parsedPaths[ j ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t} else if ( objects[ index ] !== knownObject ) {\n\n\t\t\t\terror( 'AnimationObjectGroup: Different objects with the same UUID ' +\n\t\t\t\t\t'detected. Clean the caches or recreate your infrastructure when reloading scenes.' );\n\n\t\t\t} // else the object is already where we want it to be\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t/**\n\t * Removes an arbitrary number of objects to this animation group\n\t *\n\t * @param {...Object3D} arguments - The 3D objects to remove.\n\t */\n\tremove() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined && index >= nCachedObjects ) {\n\n\t\t\t\t// move existing object into the CACHED region\n\n\t\t\t\tconst lastCachedIndex = nCachedObjects ++,\n\t\t\t\t\tfirstActiveObject = objects[ lastCachedIndex ];\n\n\t\t\t\tindicesByUUID[ firstActiveObject.uuid ] = index;\n\t\t\t\tobjects[ index ] = firstActiveObject;\n\n\t\t\t\tindicesByUUID[ uuid ] = lastCachedIndex;\n\t\t\t\tobjects[ lastCachedIndex ] = object;\n\n\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\tfirstActive = bindingsForPath[ lastCachedIndex ],\n\t\t\t\t\t\tbinding = bindingsForPath[ index ];\n\n\t\t\t\t\tbindingsForPath[ index ] = firstActive;\n\t\t\t\t\tbindingsForPath[ lastCachedIndex ] = binding;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for the passed 3D objects of this animation group.\n\t *\n\t * @param {...Object3D} arguments - The 3D objects to uncache.\n\t */\n\tuncache() {\n\n\t\tconst objects = this._objects,\n\t\t\tindicesByUUID = this._indicesByUUID,\n\t\t\tbindings = this._bindings,\n\t\t\tnBindings = bindings.length;\n\n\t\tlet nCachedObjects = this.nCachedObjects_,\n\t\t\tnObjects = objects.length;\n\n\t\tfor ( let i = 0, n = arguments.length; i !== n; ++ i ) {\n\n\t\t\tconst object = arguments[ i ],\n\t\t\t\tuuid = object.uuid,\n\t\t\t\tindex = indicesByUUID[ uuid ];\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tdelete indicesByUUID[ uuid ];\n\n\t\t\t\tif ( index < nCachedObjects ) {\n\n\t\t\t\t\t// object is cached, shrink the CACHED region\n\n\t\t\t\t\tconst firstActiveIndex = -- nCachedObjects,\n\t\t\t\t\t\tlastCachedObject = objects[ firstActiveIndex ],\n\t\t\t\t\t\tlastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\t// last cached object takes this object's place\n\t\t\t\t\tindicesByUUID[ lastCachedObject.uuid ] = index;\n\t\t\t\t\tobjects[ index ] = lastCachedObject;\n\n\t\t\t\t\t// last object goes to the activated slot and pop\n\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = firstActiveIndex;\n\t\t\t\t\tobjects[ firstActiveIndex ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ],\n\t\t\t\t\t\t\tlastCached = bindingsForPath[ firstActiveIndex ],\n\t\t\t\t\t\t\tlast = bindingsForPath[ lastIndex ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = lastCached;\n\t\t\t\t\t\tbindingsForPath[ firstActiveIndex ] = last;\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// object is active, just swap with the last and pop\n\n\t\t\t\t\tconst lastIndex = -- nObjects,\n\t\t\t\t\t\tlastObject = objects[ lastIndex ];\n\n\t\t\t\t\tif ( lastIndex > 0 ) {\n\n\t\t\t\t\t\tindicesByUUID[ lastObject.uuid ] = index;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobjects[ index ] = lastObject;\n\t\t\t\t\tobjects.pop();\n\n\t\t\t\t\t// accounting is done, now do the same for all bindings\n\n\t\t\t\t\tfor ( let j = 0, m = nBindings; j !== m; ++ j ) {\n\n\t\t\t\t\t\tconst bindingsForPath = bindings[ j ];\n\n\t\t\t\t\t\tbindingsForPath[ index ] = bindingsForPath[ lastIndex ];\n\t\t\t\t\t\tbindingsForPath.pop();\n\n\t\t\t\t\t}\n\n\t\t\t\t} // cached or active\n\n\t\t\t} // if object is known\n\n\t\t} // for arguments\n\n\t\tthis.nCachedObjects_ = nCachedObjects;\n\n\t}\n\n\t// Internal interface used by befriended PropertyBinding.Composite:\n\n\tsubscribe_( path, parsedPath ) {\n\n\t\t// returns an array of bindings for the given path that is changed\n\t\t// according to the contained objects in the group\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath;\n\t\tlet index = indicesByPath[ path ];\n\t\tconst bindings = this._bindings;\n\n\t\tif ( index !== undefined ) return bindings[ index ];\n\n\t\tconst paths = this._paths,\n\t\t\tparsedPaths = this._parsedPaths,\n\t\t\tobjects = this._objects,\n\t\t\tnObjects = objects.length,\n\t\t\tnCachedObjects = this.nCachedObjects_,\n\t\t\tbindingsForPath = new Array( nObjects );\n\n\t\tindex = bindings.length;\n\n\t\tindicesByPath[ path ] = index;\n\n\t\tpaths.push( path );\n\t\tparsedPaths.push( parsedPath );\n\t\tbindings.push( bindingsForPath );\n\n\t\tfor ( let i = nCachedObjects, n = objects.length; i !== n; ++ i ) {\n\n\t\t\tconst object = objects[ i ];\n\t\t\tbindingsForPath[ i ] = new PropertyBinding( object, path, parsedPath );\n\n\t\t}\n\n\t\treturn bindingsForPath;\n\n\t}\n\n\tunsubscribe_( path ) {\n\n\t\t// tells the group to forget about a property path and no longer\n\t\t// update the array previously obtained with 'subscribe_'\n\n\t\tconst indicesByPath = this._bindingsIndicesByPath,\n\t\t\tindex = indicesByPath[ path ];\n\n\t\tif ( index !== undefined ) {\n\n\t\t\tconst paths = this._paths,\n\t\t\t\tparsedPaths = this._parsedPaths,\n\t\t\t\tbindings = this._bindings,\n\t\t\t\tlastBindingsIndex = bindings.length - 1,\n\t\t\t\tlastBindings = bindings[ lastBindingsIndex ],\n\t\t\t\tlastBindingsPath = path[ lastBindingsIndex ];\n\n\t\t\tindicesByPath[ lastBindingsPath ] = index;\n\n\t\t\tbindings[ index ] = lastBindings;\n\t\t\tbindings.pop();\n\n\t\t\tparsedPaths[ index ] = parsedPaths[ lastBindingsIndex ];\n\t\t\tparsedPaths.pop();\n\n\t\t\tpaths[ index ] = paths[ lastBindingsIndex ];\n\t\t\tpaths.pop();\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * An instance of `AnimationAction` schedules the playback of an animation which is\n * stored in {@link AnimationClip}.\n */\nclass AnimationAction {\n\n\t/**\n\t * Constructs a new animation action.\n\t *\n\t * @param {AnimationMixer} mixer - The mixer that is controlled by this action.\n\t * @param {AnimationClip} clip - The animation clip that holds the actual keyframes.\n\t * @param {?Object3D} [localRoot=null] - The root object on which this action is performed.\n\t * @param {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)} [blendMode] - The blend mode.\n\t */\n\tconstructor( mixer, clip, localRoot = null, blendMode = clip.blendMode ) {\n\n\t\tthis._mixer = mixer;\n\t\tthis._clip = clip;\n\t\tthis._localRoot = localRoot;\n\n\t\t/**\n\t\t * Defines how the animation is blended/combined when two or more animations\n\t\t * are simultaneously played.\n\t\t *\n\t\t * @type {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)}\n\t\t */\n\t\tthis.blendMode = blendMode;\n\n\t\tconst tracks = clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tinterpolants = new Array( nTracks );\n\n\t\tconst interpolantSettings = {\n\t\t\tendingStart: ZeroCurvatureEnding,\n\t\t\tendingEnd: ZeroCurvatureEnding\n\t\t};\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst interpolant = tracks[ i ].createInterpolant( null );\n\t\t\tinterpolants[ i ] = interpolant;\n\t\t\tinterpolant.settings = interpolantSettings;\n\n\t\t}\n\n\t\tthis._interpolantSettings = interpolantSettings;\n\n\t\tthis._interpolants = interpolants; // bound by the mixer\n\n\t\t// inside: PropertyMixer (managed by the mixer)\n\t\tthis._propertyBindings = new Array( nTracks );\n\n\t\tthis._cacheIndex = null; // for the memory manager\n\t\tthis._byClipCacheIndex = null; // for the memory manager\n\n\t\tthis._timeScaleInterpolant = null;\n\t\tthis._weightInterpolant = null;\n\n\t\t/**\n\t\t * The loop mode, set via {@link AnimationAction#setLoop}.\n\t\t *\n\t\t * @type {(LoopRepeat|LoopOnce|LoopPingPong)}\n\t\t * @default LoopRepeat\n\t\t */\n\t\tthis.loop = LoopRepeat;\n\t\tthis._loopCount = -1;\n\n\t\t// global mixer time when the action is to be started\n\t\t// it's set back to 'null' upon start of the action\n\t\tthis._startTime = null;\n\n\t\t/**\n\t\t * The local time of this action (in seconds, starting with `0`).\n\t\t *\n\t\t * The value gets clamped or wrapped to `[0,clip.duration]` (according to the\n\t\t * loop state).\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.time = 0;\n\n\t\t/**\n\t\t * Scaling factor for the {@link AnimationAction#time}. A value of `0` causes the\n\t\t * animation to pause. Negative values cause the animation to play backwards.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.timeScale = 1;\n\t\tthis._effectiveTimeScale = 1;\n\n\t\t/**\n\t\t * The degree of influence of this action (in the interval `[0, 1]`). Values\n\t\t * between `0` (no impact) and `1` (full impact) can be used to blend between\n\t\t * several actions.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.weight = 1;\n\t\tthis._effectiveWeight = 1;\n\n\t\t/**\n\t\t * The number of repetitions of the performed clip over the course of this action.\n\t\t * Can be set via {@link AnimationAction#setLoop}.\n\t\t *\n\t\t * Setting this number has no effect if {@link AnimationAction#loop} is set to\n\t\t * `THREE:LoopOnce`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.repetitions = Infinity;\n\n\t\t/**\n\t\t * If set to `true`, the playback of the action is paused.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.paused = false;\n\n\t\t/**\n\t\t * If set to `false`, the action is disabled so it has no impact.\n\t\t *\n\t\t * When the action is re-enabled, the animation continues from its current\n\t\t * time (setting `enabled` to `false` doesn't reset the action).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enabled = true;\n\n\t\t/**\n\t\t * If set to true the animation will automatically be paused on its last frame.\n\t\t *\n\t\t * If set to false, {@link AnimationAction#enabled} will automatically be switched\n\t\t * to `false` when the last loop of the action has finished, so that this action has\n\t\t * no further impact.\n\t\t *\n\t\t * Note: This member has no impact if the action is interrupted (it\n\t\t * has only an effect if its last loop has really finished).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clampWhenFinished = false;\n\n\t\t/**\n\t\t * Enables smooth interpolation without separate clips for start, loop and end.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.zeroSlopeAtStart = true;\n\n\t\t/**\n\t\t * Enables smooth interpolation without separate clips for start, loop and end.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.zeroSlopeAtEnd = true;\n\n\t}\n\n\t/**\n\t * Starts the playback of the animation.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tplay() {\n\n\t\tthis._mixer._activateAction( this );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Stops the playback of the animation.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstop() {\n\n\t\tthis._mixer._deactivateAction( this );\n\n\t\treturn this.reset();\n\n\t}\n\n\t/**\n\t * Resets the playback of the animation.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\treset() {\n\n\t\tthis.paused = false;\n\t\tthis.enabled = true;\n\n\t\tthis.time = 0; // restart clip\n\t\tthis._loopCount = -1;// forget previous loops\n\t\tthis._startTime = null;// forget scheduling\n\n\t\treturn this.stopFading().stopWarping();\n\n\t}\n\n\t/**\n\t * Returns `true` if the animation is running.\n\t *\n\t * @return {boolean} Whether the animation is running or not.\n\t */\n\tisRunning() {\n\n\t\treturn this.enabled && ! this.paused && this.timeScale !== 0 &&\n\t\t\tthis._startTime === null && this._mixer._isActiveAction( this );\n\n\t}\n\n\t/**\n\t * Returns `true` when {@link AnimationAction#play} has been called.\n\t *\n\t * @return {boolean} Whether the animation is scheduled or not.\n\t */\n\tisScheduled() {\n\n\t\treturn this._mixer._isActiveAction( this );\n\n\t}\n\n\t/**\n\t * Defines the time when the animation should start.\n\t *\n\t * @param {number} time - The start time in seconds.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstartAt( time ) {\n\n\t\tthis._startTime = time;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Configures the loop settings for this action.\n\t *\n\t * @param {(LoopRepeat|LoopOnce|LoopPingPong)} mode - The loop mode.\n\t * @param {number} repetitions - The number of repetitions.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetLoop( mode, repetitions ) {\n\n\t\tthis.loop = mode;\n\t\tthis.repetitions = repetitions;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the effective weight of this action.\n\t *\n\t * An action has no effect and thus an effective weight of zero when the\n\t * action is disabled.\n\t *\n\t * @param {number} weight - The weight to set.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetEffectiveWeight( weight ) {\n\n\t\tthis.weight = weight;\n\n\t\t// note: same logic as when updated at runtime\n\t\tthis._effectiveWeight = this.enabled ? weight : 0;\n\n\t\treturn this.stopFading();\n\n\t}\n\n\t/**\n\t * Returns the effective weight of this action.\n\t *\n\t * @return {number} The effective weight.\n\t */\n\tgetEffectiveWeight() {\n\n\t\treturn this._effectiveWeight;\n\n\t}\n\n\t/**\n\t * Fades the animation in by increasing its weight gradually from `0` to `1`,\n\t * within the passed time interval.\n\t *\n\t * @param {number} duration - The duration of the fade.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tfadeIn( duration ) {\n\n\t\treturn this._scheduleFading( duration, 0, 1 );\n\n\t}\n\n\t/**\n\t * Fades the animation out by decreasing its weight gradually from `1` to `0`,\n\t * within the passed time interval.\n\t *\n\t * @param {number} duration - The duration of the fade.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tfadeOut( duration ) {\n\n\t\treturn this._scheduleFading( duration, 1, 0 );\n\n\t}\n\n\t/**\n\t * Causes this action to fade in and the given action to fade out,\n\t * within the passed time interval.\n\t *\n\t * @param {AnimationAction} fadeOutAction - The animation action to fade out.\n\t * @param {number} duration - The duration of the fade.\n\t * @param {boolean} [warp=false] - Whether warping should be used or not.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tcrossFadeFrom( fadeOutAction, duration, warp = false ) {\n\n\t\tfadeOutAction.fadeOut( duration );\n\t\tthis.fadeIn( duration );\n\n\t\tif ( warp === true ) {\n\n\t\t\tconst fadeInDuration = this._clip.duration,\n\t\t\t\tfadeOutDuration = fadeOutAction._clip.duration,\n\n\t\t\t\tstartEndRatio = fadeOutDuration / fadeInDuration,\n\t\t\t\tendStartRatio = fadeInDuration / fadeOutDuration;\n\n\t\t\tfadeOutAction.warp( 1.0, startEndRatio, duration );\n\t\t\tthis.warp( endStartRatio, 1.0, duration );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Causes this action to fade out and the given action to fade in,\n\t * within the passed time interval.\n\t *\n\t * @param {AnimationAction} fadeInAction - The animation action to fade in.\n\t * @param {number} duration - The duration of the fade.\n\t * @param {boolean} [warp=false] - Whether warping should be used or not.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tcrossFadeTo( fadeInAction, duration, warp = false ) {\n\n\t\treturn fadeInAction.crossFadeFrom( this, duration, warp );\n\n\t}\n\n\t/**\n\t * Stops any fading which is applied to this action.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstopFading() {\n\n\t\tconst weightInterpolant = this._weightInterpolant;\n\n\t\tif ( weightInterpolant !== null ) {\n\n\t\t\tthis._weightInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( weightInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the effective time scale of this action.\n\t *\n\t * An action has no effect and thus an effective time scale of zero when the\n\t * action is paused.\n\t *\n\t * @param {number} timeScale - The time scale to set.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetEffectiveTimeScale( timeScale ) {\n\n\t\tthis.timeScale = timeScale;\n\t\tthis._effectiveTimeScale = this.paused ? 0 : timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t/**\n\t * Returns the effective time scale of this action.\n\t *\n\t * @return {number} The effective time scale.\n\t */\n\tgetEffectiveTimeScale() {\n\n\t\treturn this._effectiveTimeScale;\n\n\t}\n\n\t/**\n\t * Sets the duration for a single loop of this action.\n\t *\n\t * @param {number} duration - The duration to set.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsetDuration( duration ) {\n\n\t\tthis.timeScale = this._clip.duration / duration;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t/**\n\t * Synchronizes this action with the passed other action.\n\t *\n\t * @param {AnimationAction} action - The action to sync with.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tsyncWith( action ) {\n\n\t\tthis.time = action.time;\n\t\tthis.timeScale = action.timeScale;\n\n\t\treturn this.stopWarping();\n\n\t}\n\n\t/**\n\t * Decelerates this animation's speed to `0` within the passed time interval.\n\t *\n\t * @param {number} duration - The duration.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\thalt( duration ) {\n\n\t\treturn this.warp( this._effectiveTimeScale, 0, duration );\n\n\t}\n\n\t/**\n\t * Changes the playback speed, within the passed time interval, by modifying\n\t * {@link AnimationAction#timeScale} gradually from `startTimeScale` to\n\t * `endTimeScale`.\n\t *\n\t * @param {number} startTimeScale - The start time scale.\n\t * @param {number} endTimeScale - The end time scale.\n\t * @param {number} duration - The duration.\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\twarp( startTimeScale, endTimeScale, duration ) {\n\n\t\tconst mixer = this._mixer,\n\t\t\tnow = mixer.time,\n\t\t\ttimeScale = this.timeScale;\n\n\t\tlet interpolant = this._timeScaleInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._timeScaleInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\ttimes[ 1 ] = now + duration;\n\n\t\tvalues[ 0 ] = startTimeScale / timeScale;\n\t\tvalues[ 1 ] = endTimeScale / timeScale;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Stops any scheduled warping which is applied to this action.\n\t *\n\t * @return {AnimationAction} A reference to this animation action.\n\t */\n\tstopWarping() {\n\n\t\tconst timeScaleInterpolant = this._timeScaleInterpolant;\n\n\t\tif ( timeScaleInterpolant !== null ) {\n\n\t\t\tthis._timeScaleInterpolant = null;\n\t\t\tthis._mixer._takeBackControlInterpolant( timeScaleInterpolant );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the animation mixer of this animation action.\n\t *\n\t * @return {AnimationMixer} The animation mixer.\n\t */\n\tgetMixer() {\n\n\t\treturn this._mixer;\n\n\t}\n\n\t/**\n\t * Returns the animation clip of this animation action.\n\t *\n\t * @return {AnimationClip} The animation clip.\n\t */\n\tgetClip() {\n\n\t\treturn this._clip;\n\n\t}\n\n\t/**\n\t * Returns the root object of this animation action.\n\t *\n\t * @return {Object3D} The root object.\n\t */\n\tgetRoot() {\n\n\t\treturn this._localRoot || this._mixer._root;\n\n\t}\n\n\t// Interna\n\n\t_update( time, deltaTime, timeDirection, accuIndex ) {\n\n\t\t// called by the mixer\n\n\t\tif ( ! this.enabled ) {\n\n\t\t\t// call ._updateWeight() to update ._effectiveWeight\n\n\t\t\tthis._updateWeight( time );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst startTime = this._startTime;\n\n\t\tif ( startTime !== null ) {\n\n\t\t\t// check for scheduled start of action\n\n\t\t\tconst timeRunning = ( time - startTime ) * timeDirection;\n\t\t\tif ( timeRunning < 0 || timeDirection === 0 ) {\n\n\t\t\t\tdeltaTime = 0;\n\n\t\t\t} else {\n\n\n\t\t\t\tthis._startTime = null; // unschedule\n\t\t\t\tdeltaTime = timeDirection * timeRunning;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// apply time scale and advance time\n\n\t\tdeltaTime *= this._updateTimeScale( time );\n\t\tconst clipTime = this._updateTime( deltaTime );\n\n\t\t// note: _updateTime may disable the action resulting in\n\t\t// an effective weight of 0\n\n\t\tconst weight = this._updateWeight( time );\n\n\t\tif ( weight > 0 ) {\n\n\t\t\tconst interpolants = this._interpolants;\n\t\t\tconst propertyMixers = this._propertyBindings;\n\n\t\t\tswitch ( this.blendMode ) {\n\n\t\t\t\tcase AdditiveAnimationBlendMode:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulateAdditive( weight );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase NormalAnimationBlendMode:\n\t\t\t\tdefault:\n\n\t\t\t\t\tfor ( let j = 0, m = interpolants.length; j !== m; ++ j ) {\n\n\t\t\t\t\t\tinterpolants[ j ].evaluate( clipTime );\n\t\t\t\t\t\tpropertyMixers[ j ].accumulate( accuIndex, weight );\n\n\t\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_updateWeight( time ) {\n\n\t\tlet weight = 0;\n\n\t\tif ( this.enabled ) {\n\n\t\t\tweight = this.weight;\n\t\t\tconst interpolant = this._weightInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\tweight *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopFading();\n\n\t\t\t\t\tif ( interpolantValue === 0 ) {\n\n\t\t\t\t\t\t// faded out, disable\n\t\t\t\t\t\tthis.enabled = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveWeight = weight;\n\t\treturn weight;\n\n\t}\n\n\t_updateTimeScale( time ) {\n\n\t\tlet timeScale = 0;\n\n\t\tif ( ! this.paused ) {\n\n\t\t\ttimeScale = this.timeScale;\n\n\t\t\tconst interpolant = this._timeScaleInterpolant;\n\n\t\t\tif ( interpolant !== null ) {\n\n\t\t\t\tconst interpolantValue = interpolant.evaluate( time )[ 0 ];\n\n\t\t\t\ttimeScale *= interpolantValue;\n\n\t\t\t\tif ( time > interpolant.parameterPositions[ 1 ] ) {\n\n\t\t\t\t\tthis.stopWarping();\n\n\t\t\t\t\tif ( timeScale === 0 ) {\n\n\t\t\t\t\t\t// motion has halted, pause\n\t\t\t\t\t\tthis.paused = true;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// warp done - apply final time scale\n\t\t\t\t\t\tthis.timeScale = timeScale;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._effectiveTimeScale = timeScale;\n\t\treturn timeScale;\n\n\t}\n\n\t_updateTime( deltaTime ) {\n\n\t\tconst duration = this._clip.duration;\n\t\tconst loop = this.loop;\n\n\t\tlet time = this.time + deltaTime;\n\t\tlet loopCount = this._loopCount;\n\n\t\tconst pingPong = ( loop === LoopPingPong );\n\n\t\tif ( deltaTime === 0 ) {\n\n\t\t\tif ( loopCount === -1 ) return time;\n\n\t\t\treturn ( pingPong && ( loopCount & 1 ) === 1 ) ? duration - time : time;\n\n\t\t}\n\n\t\tif ( loop === LoopOnce ) {\n\n\t\t\tif ( loopCount === -1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tthis._loopCount = 0;\n\t\t\t\tthis._setEndings( true, true, false );\n\n\t\t\t}\n\n\t\t\thandle_stop: {\n\n\t\t\t\tif ( time >= duration ) {\n\n\t\t\t\t\ttime = duration;\n\n\t\t\t\t} else if ( time < 0 ) {\n\n\t\t\t\t\ttime = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tbreak handle_stop;\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\telse this.enabled = false;\n\n\t\t\t\tthis.time = time;\n\n\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\tdirection: deltaTime < 0 ? -1 : 1\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} else { // repetitive Repeat or PingPong\n\n\t\t\tif ( loopCount === -1 ) {\n\n\t\t\t\t// just started\n\n\t\t\t\tif ( deltaTime >= 0 ) {\n\n\t\t\t\t\tloopCount = 0;\n\n\t\t\t\t\tthis._setEndings( true, this.repetitions === 0, pingPong );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// when looping in reverse direction, the initial\n\t\t\t\t\t// transition through zero counts as a repetition,\n\t\t\t\t\t// so leave loopCount at -1\n\n\t\t\t\t\tthis._setEndings( this.repetitions === 0, true, pingPong );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( time >= duration || time < 0 ) {\n\n\t\t\t\t// wrap around\n\n\t\t\t\tconst loopDelta = Math.floor( time / duration ); // signed\n\t\t\t\ttime -= duration * loopDelta;\n\n\t\t\t\tloopCount += Math.abs( loopDelta );\n\n\t\t\t\tconst pending = this.repetitions - loopCount;\n\n\t\t\t\tif ( pending <= 0 ) {\n\n\t\t\t\t\t// have to stop (switch state, clamp time, fire event)\n\n\t\t\t\t\tif ( this.clampWhenFinished ) this.paused = true;\n\t\t\t\t\telse this.enabled = false;\n\n\t\t\t\t\ttime = deltaTime > 0 ? duration : 0;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'finished', action: this,\n\t\t\t\t\t\tdirection: deltaTime > 0 ? 1 : -1\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// keep running\n\n\t\t\t\t\tif ( pending === 1 ) {\n\n\t\t\t\t\t\t// entering the last round\n\n\t\t\t\t\t\tconst atStart = deltaTime < 0;\n\t\t\t\t\t\tthis._setEndings( atStart, ! atStart, pingPong );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis._setEndings( false, false, pingPong );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis._loopCount = loopCount;\n\n\t\t\t\t\tthis.time = time;\n\n\t\t\t\t\tthis._mixer.dispatchEvent( {\n\t\t\t\t\t\ttype: 'loop', action: this, loopDelta: loopDelta\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.time = time;\n\n\t\t\t}\n\n\t\t\tif ( pingPong && ( loopCount & 1 ) === 1 ) {\n\n\t\t\t\t// invert time for the \"pong round\"\n\n\t\t\t\treturn duration - time;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn time;\n\n\t}\n\n\t_setEndings( atStart, atEnd, pingPong ) {\n\n\t\tconst settings = this._interpolantSettings;\n\n\t\tif ( pingPong ) {\n\n\t\t\tsettings.endingStart = ZeroSlopeEnding;\n\t\t\tsettings.endingEnd = ZeroSlopeEnding;\n\n\t\t} else {\n\n\t\t\t// assuming for LoopOnce atStart == atEnd == true\n\n\t\t\tif ( atStart ) {\n\n\t\t\t\tsettings.endingStart = this.zeroSlopeAtStart ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingStart = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t\tif ( atEnd ) {\n\n\t\t\t\tsettings.endingEnd = this.zeroSlopeAtEnd ? ZeroSlopeEnding : ZeroCurvatureEnding;\n\n\t\t\t} else {\n\n\t\t\t\tsettings.endingEnd \t = WrapAroundEnding;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_scheduleFading( duration, weightNow, weightThen ) {\n\n\t\tconst mixer = this._mixer, now = mixer.time;\n\t\tlet interpolant = this._weightInterpolant;\n\n\t\tif ( interpolant === null ) {\n\n\t\t\tinterpolant = mixer._lendControlInterpolant();\n\t\t\tthis._weightInterpolant = interpolant;\n\n\t\t}\n\n\t\tconst times = interpolant.parameterPositions,\n\t\t\tvalues = interpolant.sampleValues;\n\n\t\ttimes[ 0 ] = now;\n\t\tvalues[ 0 ] = weightNow;\n\t\ttimes[ 1 ] = now + duration;\n\t\tvalues[ 1 ] = weightThen;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _controlInterpolantsResultBuffer = new Float32Array( 1 );\n\n/**\n * `AnimationMixer` is a player for animations on a particular object in\n * the scene. When multiple objects in the scene are animated independently,\n * one `AnimationMixer` may be used for each object.\n */\nclass AnimationMixer extends EventDispatcher {\n\n\t/**\n\t * Constructs a new animation mixer.\n\t *\n\t * @param {Object3D} root - The object whose animations shall be played by this mixer.\n\t */\n\tconstructor( root ) {\n\n\t\tsuper();\n\n\t\tthis._root = root;\n\t\tthis._initMemoryManager();\n\t\tthis._accuIndex = 0;\n\n\t\t/**\n\t\t * The global mixer time (in seconds; starting with `0` on the mixer's creation).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.time = 0;\n\n\t\t/**\n\t\t * A scaling factor for the global time.\n\t\t *\n\t\t * Note: Setting this member to `0` and later back to `1` is a\n\t\t * possibility to pause/unpause all actions that are controlled by this\n\t\t * mixer.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.timeScale = 1.0;\n\n\t}\n\n\t_bindAction( action, prototypeAction ) {\n\n\t\tconst root = action._localRoot || this._root,\n\t\t\ttracks = action._clip.tracks,\n\t\t\tnTracks = tracks.length,\n\t\t\tbindings = action._propertyBindings,\n\t\t\tinterpolants = action._interpolants,\n\t\t\trootUuid = root.uuid,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName;\n\n\t\tlet bindingsByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingsByName === undefined ) {\n\n\t\t\tbindingsByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingsByName;\n\n\t\t}\n\n\t\tfor ( let i = 0; i !== nTracks; ++ i ) {\n\n\t\t\tconst track = tracks[ i ],\n\t\t\t\ttrackName = track.name;\n\n\t\t\tlet binding = bindingsByName[ trackName ];\n\n\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t} else {\n\n\t\t\t\tbinding = bindings[ i ];\n\n\t\t\t\tif ( binding !== undefined ) {\n\n\t\t\t\t\t// existing binding, make sure the cache knows\n\n\t\t\t\t\tif ( binding._cacheIndex === null ) {\n\n\t\t\t\t\t\t++ binding.referenceCount;\n\t\t\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tconst path = prototypeAction && prototypeAction.\n\t\t\t\t\t_propertyBindings[ i ].binding.parsedPath;\n\n\t\t\t\tbinding = new PropertyMixer(\n\t\t\t\t\tPropertyBinding.create( root, trackName, path ),\n\t\t\t\t\ttrack.ValueTypeName, track.getValueSize() );\n\n\t\t\t\t++ binding.referenceCount;\n\t\t\t\tthis._addInactiveBinding( binding, rootUuid, trackName );\n\n\t\t\t\tbindings[ i ] = binding;\n\n\t\t\t}\n\n\t\t\tinterpolants[ i ].resultBuffer = binding.buffer;\n\n\t\t}\n\n\t}\n\n\t_activateAction( action ) {\n\n\t\tif ( ! this._isActiveAction( action ) ) {\n\n\t\t\tif ( action._cacheIndex === null ) {\n\n\t\t\t\t// this action has been forgotten by the cache, but the user\n\t\t\t\t// appears to be still using it -> rebind\n\n\t\t\t\tconst rootUuid = ( action._localRoot || this._root ).uuid,\n\t\t\t\t\tclipUuid = action._clip.uuid,\n\t\t\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\t\t\tthis._bindAction( action,\n\t\t\t\t\tactionsForClip && actionsForClip.knownActions[ 0 ] );\n\n\t\t\t\tthis._addInactiveAction( action, clipUuid, rootUuid );\n\n\t\t\t}\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// increment reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( binding.useCount ++ === 0 ) {\n\n\t\t\t\t\tthis._lendBinding( binding );\n\t\t\t\t\tbinding.saveOriginalState();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._lendAction( action );\n\n\t\t}\n\n\t}\n\n\t_deactivateAction( action ) {\n\n\t\tif ( this._isActiveAction( action ) ) {\n\n\t\t\tconst bindings = action._propertyBindings;\n\n\t\t\t// decrement reference counts / sort out state\n\t\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\t\tconst binding = bindings[ i ];\n\n\t\t\t\tif ( -- binding.useCount === 0 ) {\n\n\t\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\t\tthis._takeBackBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._takeBackAction( action );\n\n\t\t}\n\n\t}\n\n\t// Memory manager\n\n\t_initMemoryManager() {\n\n\t\tthis._actions = []; // 'nActiveActions' followed by inactive ones\n\t\tthis._nActiveActions = 0;\n\n\t\tthis._actionsByClip = {};\n\t\t// inside:\n\t\t// {\n\t\t// \tknownActions: Array< AnimationAction > - used as prototypes\n\t\t// \tactionByRoot: AnimationAction - lookup\n\t\t// }\n\n\n\t\tthis._bindings = []; // 'nActiveBindings' followed by inactive ones\n\t\tthis._nActiveBindings = 0;\n\n\t\tthis._bindingsByRootAndName = {}; // inside: Map< name, PropertyMixer >\n\n\n\t\tthis._controlInterpolants = []; // same game as above\n\t\tthis._nActiveControlInterpolants = 0;\n\n\t\tconst scope = this;\n\n\t\tthis.stats = {\n\n\t\t\tactions: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._actions.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveActions;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tbindings: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._bindings.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveBindings;\n\n\t\t\t\t}\n\t\t\t},\n\t\t\tcontrolInterpolants: {\n\t\t\t\tget total() {\n\n\t\t\t\t\treturn scope._controlInterpolants.length;\n\n\t\t\t\t},\n\t\t\t\tget inUse() {\n\n\t\t\t\t\treturn scope._nActiveControlInterpolants;\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t// Memory management for AnimationAction objects\n\n\t_isActiveAction( action ) {\n\n\t\tconst index = action._cacheIndex;\n\t\treturn index !== null && index < this._nActiveActions;\n\n\t}\n\n\t_addInactiveAction( action, clipUuid, rootUuid ) {\n\n\t\tconst actions = this._actions,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tlet actionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip === undefined ) {\n\n\t\t\tactionsForClip = {\n\n\t\t\t\tknownActions: [ action ],\n\t\t\t\tactionByRoot: {}\n\n\t\t\t};\n\n\t\t\taction._byClipCacheIndex = 0;\n\n\t\t\tactionsByClip[ clipUuid ] = actionsForClip;\n\n\t\t} else {\n\n\t\t\tconst knownActions = actionsForClip.knownActions;\n\n\t\t\taction._byClipCacheIndex = knownActions.length;\n\t\t\tknownActions.push( action );\n\n\t\t}\n\n\t\taction._cacheIndex = actions.length;\n\t\tactions.push( action );\n\n\t\tactionsForClip.actionByRoot[ rootUuid ] = action;\n\n\t}\n\n\t_removeInactiveAction( action ) {\n\n\t\tconst actions = this._actions,\n\t\t\tlastInactiveAction = actions[ actions.length - 1 ],\n\t\t\tcacheIndex = action._cacheIndex;\n\n\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\tactions.pop();\n\n\t\taction._cacheIndex = null;\n\n\n\t\tconst clipUuid = action._clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ],\n\t\t\tknownActionsForClip = actionsForClip.knownActions,\n\n\t\t\tlastKnownAction =\n\t\t\t\tknownActionsForClip[ knownActionsForClip.length - 1 ],\n\n\t\t\tbyClipCacheIndex = action._byClipCacheIndex;\n\n\t\tlastKnownAction._byClipCacheIndex = byClipCacheIndex;\n\t\tknownActionsForClip[ byClipCacheIndex ] = lastKnownAction;\n\t\tknownActionsForClip.pop();\n\n\t\taction._byClipCacheIndex = null;\n\n\n\t\tconst actionByRoot = actionsForClip.actionByRoot,\n\t\t\trootUuid = ( action._localRoot || this._root ).uuid;\n\n\t\tdelete actionByRoot[ rootUuid ];\n\n\t\tif ( knownActionsForClip.length === 0 ) {\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t\tthis._removeInactiveBindingsForAction( action );\n\n\t}\n\n\t_removeInactiveBindingsForAction( action ) {\n\n\t\tconst bindings = action._propertyBindings;\n\n\t\tfor ( let i = 0, n = bindings.length; i !== n; ++ i ) {\n\n\t\t\tconst binding = bindings[ i ];\n\n\t\t\tif ( -- binding.referenceCount === 0 ) {\n\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_lendAction( action ) {\n\n\t\t// [ active actions |  inactive actions  ]\n\t\t// [  active actions >| inactive actions ]\n\t\t//                 s        a\n\t\t//                  <-swap->\n\t\t//                 a        s\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveActions ++,\n\n\t\t\tfirstInactiveAction = actions[ lastActiveIndex ];\n\n\t\taction._cacheIndex = lastActiveIndex;\n\t\tactions[ lastActiveIndex ] = action;\n\n\t\tfirstInactiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = firstInactiveAction;\n\n\t}\n\n\t_takeBackAction( action ) {\n\n\t\t// [  active actions  | inactive actions ]\n\t\t// [ active actions |< inactive actions  ]\n\t\t//        a        s\n\t\t//         <-swap->\n\t\t//        s        a\n\n\t\tconst actions = this._actions,\n\t\t\tprevIndex = action._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveActions,\n\n\t\t\tlastActiveAction = actions[ firstInactiveIndex ];\n\n\t\taction._cacheIndex = firstInactiveIndex;\n\t\tactions[ firstInactiveIndex ] = action;\n\n\t\tlastActiveAction._cacheIndex = prevIndex;\n\t\tactions[ prevIndex ] = lastActiveAction;\n\n\t}\n\n\t// Memory management for PropertyMixer objects\n\n\t_addInactiveBinding( binding, rootUuid, trackName ) {\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindings = this._bindings;\n\n\t\tlet bindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName === undefined ) {\n\n\t\t\tbindingByName = {};\n\t\t\tbindingsByRoot[ rootUuid ] = bindingByName;\n\n\t\t}\n\n\t\tbindingByName[ trackName ] = binding;\n\n\t\tbinding._cacheIndex = bindings.length;\n\t\tbindings.push( binding );\n\n\t}\n\n\t_removeInactiveBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tpropBinding = binding.binding,\n\t\t\trootUuid = propBinding.rootNode.uuid,\n\t\t\ttrackName = propBinding.path,\n\t\t\tbindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ],\n\n\t\t\tlastInactiveBinding = bindings[ bindings.length - 1 ],\n\t\t\tcacheIndex = binding._cacheIndex;\n\n\t\tlastInactiveBinding._cacheIndex = cacheIndex;\n\t\tbindings[ cacheIndex ] = lastInactiveBinding;\n\t\tbindings.pop();\n\n\t\tdelete bindingByName[ trackName ];\n\n\t\tif ( Object.keys( bindingByName ).length === 0 ) {\n\n\t\t\tdelete bindingsByRoot[ rootUuid ];\n\n\t\t}\n\n\t}\n\n\t_lendBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tlastActiveIndex = this._nActiveBindings ++,\n\n\t\t\tfirstInactiveBinding = bindings[ lastActiveIndex ];\n\n\t\tbinding._cacheIndex = lastActiveIndex;\n\t\tbindings[ lastActiveIndex ] = binding;\n\n\t\tfirstInactiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = firstInactiveBinding;\n\n\t}\n\n\t_takeBackBinding( binding ) {\n\n\t\tconst bindings = this._bindings,\n\t\t\tprevIndex = binding._cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveBindings,\n\n\t\t\tlastActiveBinding = bindings[ firstInactiveIndex ];\n\n\t\tbinding._cacheIndex = firstInactiveIndex;\n\t\tbindings[ firstInactiveIndex ] = binding;\n\n\t\tlastActiveBinding._cacheIndex = prevIndex;\n\t\tbindings[ prevIndex ] = lastActiveBinding;\n\n\t}\n\n\n\t// Memory management of Interpolants for weight and time scale\n\n\t_lendControlInterpolant() {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tlastActiveIndex = this._nActiveControlInterpolants ++;\n\n\t\tlet interpolant = interpolants[ lastActiveIndex ];\n\n\t\tif ( interpolant === undefined ) {\n\n\t\t\tinterpolant = new LinearInterpolant(\n\t\t\t\tnew Float32Array( 2 ), new Float32Array( 2 ),\n\t\t\t\t1, _controlInterpolantsResultBuffer );\n\n\t\t\tinterpolant.__cacheIndex = lastActiveIndex;\n\t\t\tinterpolants[ lastActiveIndex ] = interpolant;\n\n\t\t}\n\n\t\treturn interpolant;\n\n\t}\n\n\t_takeBackControlInterpolant( interpolant ) {\n\n\t\tconst interpolants = this._controlInterpolants,\n\t\t\tprevIndex = interpolant.__cacheIndex,\n\n\t\t\tfirstInactiveIndex = -- this._nActiveControlInterpolants,\n\n\t\t\tlastActiveInterpolant = interpolants[ firstInactiveIndex ];\n\n\t\tinterpolant.__cacheIndex = firstInactiveIndex;\n\t\tinterpolants[ firstInactiveIndex ] = interpolant;\n\n\t\tlastActiveInterpolant.__cacheIndex = prevIndex;\n\t\tinterpolants[ prevIndex ] = lastActiveInterpolant;\n\n\t}\n\n\t/**\n\t * Returns an instance of {@link AnimationAction} for the passed clip.\n\t *\n\t * If an action fitting the clip and root parameters doesn't yet exist, it\n\t * will be created by this method. Calling this method several times with the\n\t * same clip and root parameters always returns the same action.\n\t *\n\t * @param {AnimationClip|string} clip - An animation clip or alternatively the name of the animation clip.\n\t * @param {Object3D} [optionalRoot] - An alternative root object.\n\t * @param {(NormalAnimationBlendMode|AdditiveAnimationBlendMode)} [blendMode] - The blend mode.\n\t * @return {?AnimationAction} The animation action.\n\t */\n\tclipAction( clip, optionalRoot, blendMode ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid;\n\n\t\tlet clipObject = typeof clip === 'string' ? AnimationClip.findByName( root, clip ) : clip;\n\n\t\tconst clipUuid = clipObject !== null ? clipObject.uuid : clip;\n\n\t\tconst actionsForClip = this._actionsByClip[ clipUuid ];\n\t\tlet prototypeAction = null;\n\n\t\tif ( blendMode === undefined ) {\n\n\t\t\tif ( clipObject !== null ) {\n\n\t\t\t\tblendMode = clipObject.blendMode;\n\n\t\t\t} else {\n\n\t\t\t\tblendMode = NormalAnimationBlendMode;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\tconst existingAction = actionsForClip.actionByRoot[ rootUuid ];\n\n\t\t\tif ( existingAction !== undefined && existingAction.blendMode === blendMode ) {\n\n\t\t\t\treturn existingAction;\n\n\t\t\t}\n\n\t\t\t// we know the clip, so we don't have to parse all\n\t\t\t// the bindings again but can just copy\n\t\t\tprototypeAction = actionsForClip.knownActions[ 0 ];\n\n\t\t\t// also, take the clip from the prototype action\n\t\t\tif ( clipObject === null )\n\t\t\t\tclipObject = prototypeAction._clip;\n\n\t\t}\n\n\t\t// clip must be known when specified via string\n\t\tif ( clipObject === null ) return null;\n\n\t\t// allocate all resources required to run it\n\t\tconst newAction = new AnimationAction( this, clipObject, optionalRoot, blendMode );\n\n\t\tthis._bindAction( newAction, prototypeAction );\n\n\t\t// and make the action known to the memory manager\n\t\tthis._addInactiveAction( newAction, clipUuid, rootUuid );\n\n\t\treturn newAction;\n\n\t}\n\n\t/**\n\t * Returns an existing animation action for the passed clip.\n\t *\n\t * @param {AnimationClip|string} clip - An animation clip or alternatively the name of the animation clip.\n\t * @param {Object3D} [optionalRoot] - An alternative root object.\n\t * @return {?AnimationAction} The animation action. Returns `null` if no action was found.\n\t */\n\texistingAction( clip, optionalRoot ) {\n\n\t\tconst root = optionalRoot || this._root,\n\t\t\trootUuid = root.uuid,\n\n\t\t\tclipObject = typeof clip === 'string' ?\n\t\t\t\tAnimationClip.findByName( root, clip ) : clip,\n\n\t\t\tclipUuid = clipObject ? clipObject.uuid : clip,\n\n\t\t\tactionsForClip = this._actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\treturn actionsForClip.actionByRoot[ rootUuid ] || null;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Deactivates all previously scheduled actions on this mixer.\n\t *\n\t * @return {AnimationMixer} A reference to this animation mixer.\n\t */\n\tstopAllAction() {\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions;\n\n\t\tfor ( let i = nActions - 1; i >= 0; -- i ) {\n\n\t\t\tactions[ i ].stop();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Advances the global mixer time and updates the animation.\n\t *\n\t * This is usually done in the render loop by passing the delta\n\t * time from {@link Clock} or {@link Timer}.\n\t *\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @return {AnimationMixer} A reference to this animation mixer.\n\t */\n\tupdate( deltaTime ) {\n\n\t\tdeltaTime *= this.timeScale;\n\n\t\tconst actions = this._actions,\n\t\t\tnActions = this._nActiveActions,\n\n\t\t\ttime = this.time += deltaTime,\n\t\t\ttimeDirection = Math.sign( deltaTime ),\n\n\t\t\taccuIndex = this._accuIndex ^= 1;\n\n\t\t// run active actions\n\n\t\tfor ( let i = 0; i !== nActions; ++ i ) {\n\n\t\t\tconst action = actions[ i ];\n\n\t\t\taction._update( time, deltaTime, timeDirection, accuIndex );\n\n\t\t}\n\n\t\t// update scene graph\n\n\t\tconst bindings = this._bindings,\n\t\t\tnBindings = this._nActiveBindings;\n\n\t\tfor ( let i = 0; i !== nBindings; ++ i ) {\n\n\t\t\tbindings[ i ].apply( accuIndex );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the global mixer to a specific time and updates the animation accordingly.\n\t *\n\t * This is useful when you need to jump to an exact time in an animation. The\n\t * input parameter will be scaled by {@link AnimationMixer#timeScale}\n\t *\n\t * @param {number} time - The time to set in seconds.\n\t * @return {AnimationMixer} A reference to this animation mixer.\n\t */\n\tsetTime( time ) {\n\n\t\tthis.time = 0; // Zero out time attribute for AnimationMixer object;\n\t\tfor ( let i = 0; i < this._actions.length; i ++ ) {\n\n\t\t\tthis._actions[ i ].time = 0; // Zero out time attribute for all associated AnimationAction objects.\n\n\t\t}\n\n\t\treturn this.update( time ); // Update used to set exact time. Returns \"this\" AnimationMixer object.\n\n\t}\n\n\t/**\n\t * Returns this mixer's root object.\n\t *\n\t * @return {Object3D} The mixer's root object.\n\t */\n\tgetRoot() {\n\n\t\treturn this._root;\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for a clip. Before using this method make\n\t * sure to call {@link AnimationAction#stop} for all related actions.\n\t *\n\t * @param {AnimationClip} clip - The clip to uncache.\n\t */\n\tuncacheClip( clip ) {\n\n\t\tconst actions = this._actions,\n\t\t\tclipUuid = clip.uuid,\n\t\t\tactionsByClip = this._actionsByClip,\n\t\t\tactionsForClip = actionsByClip[ clipUuid ];\n\n\t\tif ( actionsForClip !== undefined ) {\n\n\t\t\t// note: just calling _removeInactiveAction would mess up the\n\t\t\t// iteration state and also require updating the state we can\n\t\t\t// just throw away\n\n\t\t\tconst actionsToRemove = actionsForClip.knownActions;\n\n\t\t\tfor ( let i = 0, n = actionsToRemove.length; i !== n; ++ i ) {\n\n\t\t\t\tconst action = actionsToRemove[ i ];\n\n\t\t\t\tthis._deactivateAction( action );\n\n\t\t\t\tconst cacheIndex = action._cacheIndex,\n\t\t\t\t\tlastInactiveAction = actions[ actions.length - 1 ];\n\n\t\t\t\taction._cacheIndex = null;\n\t\t\t\taction._byClipCacheIndex = null;\n\n\t\t\t\tlastInactiveAction._cacheIndex = cacheIndex;\n\t\t\t\tactions[ cacheIndex ] = lastInactiveAction;\n\t\t\t\tactions.pop();\n\n\t\t\t\tthis._removeInactiveBindingsForAction( action );\n\n\t\t\t}\n\n\t\t\tdelete actionsByClip[ clipUuid ];\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for a root object. Before using this\n\t * method make sure to call {@link AnimationAction#stop} for all related\n\t * actions or alternatively {@link AnimationMixer#stopAllAction} when the\n\t * mixer operates on a single root.\n\t *\n\t * @param {Object3D} root - The root object to uncache.\n\t */\n\tuncacheRoot( root ) {\n\n\t\tconst rootUuid = root.uuid,\n\t\t\tactionsByClip = this._actionsByClip;\n\n\t\tfor ( const clipUuid in actionsByClip ) {\n\n\t\t\tconst actionByRoot = actionsByClip[ clipUuid ].actionByRoot,\n\t\t\t\taction = actionByRoot[ rootUuid ];\n\n\t\t\tif ( action !== undefined ) {\n\n\t\t\t\tthis._deactivateAction( action );\n\t\t\t\tthis._removeInactiveAction( action );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst bindingsByRoot = this._bindingsByRootAndName,\n\t\t\tbindingByName = bindingsByRoot[ rootUuid ];\n\n\t\tif ( bindingByName !== undefined ) {\n\n\t\t\tfor ( const trackName in bindingByName ) {\n\n\t\t\t\tconst binding = bindingByName[ trackName ];\n\t\t\t\tbinding.restoreOriginalState();\n\t\t\t\tthis._removeInactiveBinding( binding );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Deallocates all memory resources for an action. The action is identified by the\n\t * given clip and an optional root object. Before using this method make\n\t * sure to call {@link AnimationAction#stop} to deactivate the action.\n\t *\n\t * @param {AnimationClip|string} clip - An animation clip or alternatively the name of the animation clip.\n\t * @param {Object3D} [optionalRoot] - An alternative root object.\n\t */\n\tuncacheAction( clip, optionalRoot ) {\n\n\t\tconst action = this.existingAction( clip, optionalRoot );\n\n\t\tif ( action !== null ) {\n\n\t\t\tthis._deactivateAction( action );\n\t\t\tthis._removeInactiveAction( action );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Represents a 3D render target.\n *\n * @augments RenderTarget\n */\nclass RenderTarget3D extends RenderTarget {\n\n\t/**\n\t * Constructs a new 3D render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {number} [depth=1] - The height of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRenderTarget3D = true;\n\n\t\tthis.depth = depth;\n\n\t\t/**\n\t\t * Overwritten with a different texture type.\n\t\t *\n\t\t * @type {Data3DTexture}\n\t\t */\n\t\tthis.texture = new Data3DTexture( null, width, height, depth );\n\t\tthis._setTextureOptions( options );\n\n\t\tthis.texture.isRenderTargetTexture = true;\n\n\t}\n\n}\n\n/**\n * Represents a uniform which is a global shader variable. They are passed to shader programs.\n *\n * When declaring a uniform of a {@link ShaderMaterial}, it is declared by value or by object.\n * ```js\n * uniforms: {\n * \ttime: { value: 1.0 },\n * \tresolution: new Uniform( new Vector2() )\n * };\n * ```\n * Since this class can only be used in context of {@link ShaderMaterial}, it is only supported\n * in {@link WebGLRenderer}.\n */\nclass Uniform {\n\n\t/**\n\t * Constructs a new uniform.\n\t *\n\t * @param {any} value - The uniform value.\n\t */\n\tconstructor( value ) {\n\n\t\t/**\n\t\t * The uniform value.\n\t\t *\n\t\t * @type {any}\n\t\t */\n\t\tthis.value = value;\n\n\t}\n\n\t/**\n\t * Returns a new uniform with copied values from this instance.\n\t * If the value has a `clone()` method, the value is cloned as well.\n\t *\n\t * @return {Uniform} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new Uniform( this.value.clone === undefined ? this.value : this.value.clone() );\n\n\t}\n\n}\n\nlet _id = 0;\n\n/**\n * A class for managing multiple uniforms in a single group. The renderer will process\n * such a definition as a single UBO.\n *\n * Since this class can only be used in context of {@link ShaderMaterial}, it is only supported\n * in {@link WebGLRenderer}.\n *\n * @augments EventDispatcher\n */\nclass UniformsGroup extends EventDispatcher {\n\n\t/**\n\t * Constructs a new uniforms group.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isUniformsGroup = true;\n\n\t\t/**\n\t\t * The ID of the 3D object.\n\t\t *\n\t\t * @name UniformsGroup#id\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tObject.defineProperty( this, 'id', { value: _id ++ } );\n\n\t\t/**\n\t\t * The name of the uniforms group.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The buffer usage.\n\t\t *\n\t\t * @type {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)}\n\t\t * @default StaticDrawUsage\n\t\t */\n\t\tthis.usage = StaticDrawUsage;\n\n\t\t/**\n\t\t * An array holding the uniforms.\n\t\t *\n\t\t * @type {Array<Uniform>}\n\t\t */\n\t\tthis.uniforms = [];\n\n\t}\n\n\t/**\n\t * Adds the given uniform to this uniforms group.\n\t *\n\t * @param {Uniform} uniform - The uniform to add.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tadd( uniform ) {\n\n\t\tthis.uniforms.push( uniform );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes the given uniform from this uniforms group.\n\t *\n\t * @param {Uniform} uniform - The uniform to remove.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tremove( uniform ) {\n\n\t\tconst index = this.uniforms.indexOf( uniform );\n\n\t\tif ( index !== -1 ) this.uniforms.splice( index, 1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the name of this uniforms group.\n\t *\n\t * @param {string} name - The name to set.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tsetName( name ) {\n\n\t\tthis.name = name;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the usage of this uniforms group.\n\t *\n\t * @param {(StaticDrawUsage|DynamicDrawUsage|StreamDrawUsage|StaticReadUsage|DynamicReadUsage|StreamReadUsage|StaticCopyUsage|DynamicCopyUsage|StreamCopyUsage)} value - The usage to set.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires Texture#dispose\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\t/**\n\t * Copies the values of the given uniforms group to this instance.\n\t *\n\t * @param {UniformsGroup} source - The uniforms group to copy.\n\t * @return {UniformsGroup} A reference to this uniforms group.\n\t */\n\tcopy( source ) {\n\n\t\tthis.name = source.name;\n\t\tthis.usage = source.usage;\n\n\t\tconst uniformsSource = source.uniforms;\n\n\t\tthis.uniforms.length = 0;\n\n\t\tfor ( let i = 0, l = uniformsSource.length; i < l; i ++ ) {\n\n\t\t\tconst uniforms = Array.isArray( uniformsSource[ i ] ) ? uniformsSource[ i ] : [ uniformsSource[ i ] ];\n\n\t\t\tfor ( let j = 0; j < uniforms.length; j ++ ) {\n\n\t\t\t\tthis.uniforms.push( uniforms[ j ].clone() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new uniforms group with copied values from this instance.\n\t *\n\t * @return {UniformsGroup} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * An instanced version of an interleaved buffer.\n *\n * @augments InterleavedBuffer\n */\nclass InstancedInterleavedBuffer extends InterleavedBuffer {\n\n\t/**\n\t * Constructs a new instanced interleaved buffer.\n\t *\n\t * @param {TypedArray} array - A typed array with a shared buffer storing attribute data.\n\t * @param {number} stride - The number of typed-array elements per vertex.\n\t * @param {number} [meshPerAttribute=1] - Defines how often a value of this interleaved buffer should be repeated.\n\t */\n\tconstructor( array, stride, meshPerAttribute = 1 ) {\n\n\t\tsuper( array, stride );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInstancedInterleavedBuffer = true;\n\n\t\t/**\n\t\t * Defines how often a value of this buffer attribute should be repeated,\n\t\t * see {@link InstancedBufferAttribute#meshPerAttribute}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.meshPerAttribute = meshPerAttribute;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.meshPerAttribute = source.meshPerAttribute;\n\n\t\treturn this;\n\n\t}\n\n\tclone( data ) {\n\n\t\tconst ib = super.clone( data );\n\n\t\tib.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn ib;\n\n\t}\n\n\ttoJSON( data ) {\n\n\t\tconst json = super.toJSON( data );\n\n\t\tjson.isInstancedInterleavedBuffer = true;\n\t\tjson.meshPerAttribute = this.meshPerAttribute;\n\n\t\treturn json;\n\n\t}\n\n}\n\n/**\n * An alternative version of a buffer attribute with more control over the VBO.\n *\n * The renderer does not construct a VBO for this kind of attribute. Instead, it uses\n * whatever VBO is passed in constructor and can later be altered via the `buffer` property.\n *\n * The most common use case for this class is when some kind of GPGPU calculation interferes\n * or even produces the VBOs in question.\n *\n * Notice that this class can only be used with {@link WebGLRenderer}.\n */\nclass GLBufferAttribute {\n\n\t/**\n\t * Constructs a new GL buffer attribute.\n\t *\n\t * @param {WebGLBuffer} buffer - The native WebGL buffer.\n\t * @param {number} type - The native data type (e.g. `gl.FLOAT`).\n\t * @param {number} itemSize - The item size.\n\t * @param {number} elementSize - The corresponding size (in bytes) for the given `type` parameter.\n\t * @param {number} count - The expected number of vertices in VBO.\n\t * @param {boolean} [normalized=false] - Whether the data are normalized or not.\n\t */\n\tconstructor( buffer, type, itemSize, elementSize, count, normalized = false ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isGLBufferAttribute = true;\n\n\t\t/**\n\t\t * The name of the buffer attribute.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The native WebGL buffer.\n\t\t *\n\t\t * @type {WebGLBuffer}\n\t\t */\n\t\tthis.buffer = buffer;\n\n\t\t/**\n\t\t * The native data type.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.type = type;\n\n\t\t/**\n\t\t * The item size, see {@link BufferAttribute#itemSize}.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.itemSize = itemSize;\n\n\t\t/**\n\t\t * The corresponding size (in bytes) for the given `type` parameter.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.elementSize = elementSize;\n\n\t\t/**\n\t\t * The expected number of vertices in VBO.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.count = count;\n\n\t\t/**\n\t\t * Applies to integer data only. Indicates how the underlying data in the buffer maps to\n\t\t * the values in the GLSL code. For instance, if `buffer` contains data of `gl.UNSIGNED_SHORT`,\n\t\t * and `normalized` is `true`, the values `0 - +65535` in the buffer data will be mapped to\n\t\t * `0.0f - +1.0f` in the GLSL attribute. If `normalized` is `false`, the values will be converted\n\t\t * to floats unmodified, i.e. `65535` becomes `65535.0f`.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.normalized = normalized;\n\n\t\t/**\n\t\t * A version number, incremented every time the `needsUpdate` is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.version = 0;\n\n\t}\n\n\t/**\n\t * Flag to indicate that this attribute has changed and should be re-sent to\n\t * the GPU. Set this to `true` when you modify the value of the array.\n\t *\n\t * @type {number}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n\t/**\n\t * Sets the given native WebGL buffer.\n\t *\n\t * @param {WebGLBuffer} buffer - The buffer to set.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetBuffer( buffer ) {\n\n\t\tthis.buffer = buffer;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given native data type and element size.\n\t *\n\t * @param {number} type - The native data type (e.g. `gl.FLOAT`).\n\t * @param {number} elementSize - The corresponding size (in bytes) for the given `type` parameter.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetType( type, elementSize ) {\n\n\t\tthis.type = type;\n\t\tthis.elementSize = elementSize;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the item size.\n\t *\n\t * @param {number} itemSize - The item size.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetItemSize( itemSize ) {\n\n\t\tthis.itemSize = itemSize;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the count (the expected number of vertices in VBO).\n\t *\n\t * @param {number} count - The count.\n\t * @return {BufferAttribute} A reference to this instance.\n\t */\n\tsetCount( count ) {\n\n\t\tthis.count = count;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _matrix = /*@__PURE__*/ new Matrix4();\n\n/**\n * This class is designed to assist with raycasting. Raycasting is used for\n * mouse picking (working out what objects in the 3d space the mouse is over)\n * amongst other things.\n */\nclass Raycaster {\n\n\t/**\n\t * Constructs a new raycaster.\n\t *\n\t * @param {Vector3} origin - The origin vector where the ray casts from.\n\t * @param {Vector3} direction - The (normalized) direction vector that gives direction to the ray.\n\t * @param {number} [near=0] - All results returned are further away than near. Near can't be negative.\n\t * @param {number} [far=Infinity] - All results returned are closer than far. Far can't be lower than near.\n\t */\n\tconstructor( origin, direction, near = 0, far = Infinity ) {\n\n\t\t/**\n\t\t * The ray used for raycasting.\n\t\t *\n\t\t * @type {Ray}\n\t\t */\n\t\tthis.ray = new Ray( origin, direction );\n\n\t\t/**\n\t\t * All results returned are further away than near. Near can't be negative.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.near = near;\n\n\t\t/**\n\t\t * All results returned are closer than far. Far can't be lower than near.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.far = far;\n\n\t\t/**\n\t\t * The camera to use when raycasting against view-dependent objects such as\n\t\t * billboarded objects like sprites. This field can be set manually or\n\t\t * is set when calling `setFromCamera()`.\n\t\t *\n\t\t * @type {?Camera}\n\t\t * @default null\n\t\t */\n\t\tthis.camera = null;\n\n\t\t/**\n\t\t * Allows to selectively ignore 3D objects when performing intersection tests.\n\t\t * The following code example ensures that only 3D objects on layer `1` will be\n\t\t * honored by raycaster.\n\t\t * ```js\n\t\t * raycaster.layers.set( 1 );\n\t\t * object.layers.enable( 1 );\n\t\t * ```\n\t\t *\n\t\t * @type {Layers}\n\t\t */\n\t\tthis.layers = new Layers();\n\n\n\t\t/**\n\t\t * A parameter object that configures the raycasting. It has the structure:\n\t\t *\n\t\t * ```\n\t\t * {\n\t\t * \tMesh: {},\n\t\t * \tLine: { threshold: 1 },\n\t\t * \tLOD: {},\n\t\t * \tPoints: { threshold: 1 },\n\t\t * \tSprite: {}\n\t\t * }\n\t\t * ```\n\t\t * Where `threshold` is the precision of the raycaster when intersecting objects, in world units.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.params = {\n\t\t\tMesh: {},\n\t\t\tLine: { threshold: 1 },\n\t\t\tLOD: {},\n\t\t\tPoints: { threshold: 1 },\n\t\t\tSprite: {}\n\t\t};\n\n\t}\n\n\t/**\n\t * Updates the ray with a new origin and direction by copying the values from the arguments.\n\t *\n\t * @param {Vector3} origin - The origin vector where the ray casts from.\n\t * @param {Vector3} direction - The (normalized) direction vector that gives direction to the ray.\n\t */\n\tset( origin, direction ) {\n\n\t\t// direction is assumed to be normalized (for accurate distance calculations)\n\n\t\tthis.ray.set( origin, direction );\n\n\t}\n\n\t/**\n\t * Uses the given coordinates and camera to compute a new origin and direction for the internal ray.\n\t *\n\t * @param {Vector2} coords - 2D coordinates of the mouse, in normalized device coordinates (NDC).\n\t * X and Y components should be between `-1` and `1`.\n\t * @param {Camera} camera - The camera from which the ray should originate.\n\t */\n\tsetFromCamera( coords, camera ) {\n\n\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\tthis.ray.origin.setFromMatrixPosition( camera.matrixWorld );\n\t\t\tthis.ray.direction.set( coords.x, coords.y, 0.5 ).unproject( camera ).sub( this.ray.origin ).normalize();\n\t\t\tthis.camera = camera;\n\n\t\t} else if ( camera.isOrthographicCamera ) {\n\n\t\t\tthis.ray.origin.set( coords.x, coords.y, ( camera.near + camera.far ) / ( camera.near - camera.far ) ).unproject( camera ); // set origin in plane of camera\n\t\t\tthis.ray.direction.set( 0, 0, -1 ).transformDirection( camera.matrixWorld );\n\t\t\tthis.camera = camera;\n\n\t\t} else {\n\n\t\t\terror( 'Raycaster: Unsupported camera type: ' + camera.type );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Uses the given WebXR controller to compute a new origin and direction for the internal ray.\n\t *\n\t * @param {WebXRController} controller - The controller to copy the position and direction from.\n\t * @return {Raycaster} A reference to this raycaster.\n\t */\n\tsetFromXRController( controller ) {\n\n\t\t_matrix.identity().extractRotation( controller.matrixWorld );\n\n\t\tthis.ray.origin.setFromMatrixPosition( controller.matrixWorld );\n\t\tthis.ray.direction.set( 0, 0, -1 ).applyMatrix4( _matrix );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The intersection point of a raycaster intersection test.\n\t * @typedef {Object} Raycaster~Intersection\n\t * @property {number} distance - The distance from the ray's origin to the intersection point.\n\t * @property {number} distanceToRay -  Some 3D objects e.g. {@link Points} provide the distance of the\n\t * intersection to the nearest point on the ray. For other objects it will be `undefined`.\n\t * @property {Vector3} point - The intersection point, in world coordinates.\n\t * @property {Object} face - The face that has been intersected.\n\t * @property {number} faceIndex - The face index.\n\t * @property {Object3D} object - The 3D object that has been intersected.\n\t * @property {Vector2} uv - U,V coordinates at point of intersection.\n\t * @property {Vector2} uv1 - Second set of U,V coordinates at point of intersection.\n\t * @property {Vector3} normal - Interpolated normal vector at point of intersection.\n\t * @property {number} instanceId - The index number of the instance where the ray\n\t * intersects the {@link InstancedMesh}.\n\t */\n\n\t/**\n\t * Checks all intersection between the ray and the object with or without the\n\t * descendants. Intersections are returned sorted by distance, closest first.\n\t *\n\t * `Raycaster` delegates to the `raycast()` method of the passed 3D object, when\n\t * evaluating whether the ray intersects the object or not. This allows meshes to respond\n\t * differently to ray casting than lines or points.\n\t *\n\t * Note that for meshes, faces must be pointed towards the origin of the ray in order\n\t * to be detected; intersections of the ray passing through the back of a face will not\n\t * be detected. To raycast against both faces of an object, you'll want to set  {@link Material#side}\n\t * to `THREE.DoubleSide`.\n\t *\n\t * @param {Object3D} object - The 3D object to check for intersection with the ray.\n\t * @param {boolean} [recursive=true] - If set to `true`, it also checks all descendants.\n\t * Otherwise it only checks intersection with the object.\n\t * @param {Array<Raycaster~Intersection>} [intersects=[]] The target array that holds the result of the method.\n\t * @return {Array<Raycaster~Intersection>} An array holding the intersection points.\n\t */\n\tintersectObject( object, recursive = true, intersects = [] ) {\n\n\t\tintersect( object, this, intersects, recursive );\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n\t/**\n\t * Checks all intersection between the ray and the objects with or without\n\t * the descendants. Intersections are returned sorted by distance, closest first.\n\t *\n\t * @param {Array<Object3D>} objects - The 3D objects to check for intersection with the ray.\n\t * @param {boolean} [recursive=true] - If set to `true`, it also checks all descendants.\n\t * Otherwise it only checks intersection with the object.\n\t * @param {Array<Raycaster~Intersection>} [intersects=[]] The target array that holds the result of the method.\n\t * @return {Array<Raycaster~Intersection>} An array holding the intersection points.\n\t */\n\tintersectObjects( objects, recursive = true, intersects = [] ) {\n\n\t\tfor ( let i = 0, l = objects.length; i < l; i ++ ) {\n\n\t\t\tintersect( objects[ i ], this, intersects, recursive );\n\n\t\t}\n\n\t\tintersects.sort( ascSort );\n\n\t\treturn intersects;\n\n\t}\n\n}\n\nfunction ascSort( a, b ) {\n\n\treturn a.distance - b.distance;\n\n}\n\nfunction intersect( object, raycaster, intersects, recursive ) {\n\n\tlet propagate = true;\n\n\tif ( object.layers.test( raycaster.layers ) ) {\n\n\t\tconst result = object.raycast( raycaster, intersects );\n\n\t\tif ( result === false ) propagate = false;\n\n\t}\n\n\tif ( propagate === true && recursive === true ) {\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tintersect( children[ i ], raycaster, intersects, true );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * This class is an alternative to {@link Clock} with a different API design and behavior.\n * The goal is to avoid the conceptual flaws that became apparent in `Clock` over time.\n *\n * - `Timer` has an `update()` method that updates its internal state. That makes it possible to\n * call `getDelta()` and `getElapsed()` multiple times per simulation step without getting different values.\n * - The class can make use of the Page Visibility API to avoid large time delta values when the app\n * is inactive (e.g. tab switched or browser hidden).\n *\n * ```js\n * const timer = new Timer();\n * timer.connect( document ); // use Page Visibility API\n * ```\n */\nclass Timer {\n\n\t/**\n\t * Constructs a new timer.\n\t */\n\tconstructor() {\n\n\t\tthis._previousTime = 0;\n\t\tthis._currentTime = 0;\n\t\tthis._startTime = performance.now();\n\n\t\tthis._delta = 0;\n\t\tthis._elapsed = 0;\n\n\t\tthis._timescale = 1;\n\n\t\tthis._document = null;\n\t\tthis._pageVisibilityHandler = null;\n\n\t}\n\n\t/**\n\t * Connect the timer to the given document.Calling this method is not mandatory to\n\t * use the timer but enables the usage of the Page Visibility API to avoid large time\n\t * delta values.\n\t *\n\t * @param {Document} document - The document.\n\t */\n\tconnect( document ) {\n\n\t\tthis._document = document;\n\n\t\t// use Page Visibility API to avoid large time delta values\n\n\t\tif ( document.hidden !== undefined ) {\n\n\t\t\tthis._pageVisibilityHandler = handleVisibilityChange.bind( this );\n\n\t\t\tdocument.addEventListener( 'visibilitychange', this._pageVisibilityHandler, false );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disconnects the timer from the DOM and also disables the usage of the Page Visibility API.\n\t */\n\tdisconnect() {\n\n\t\tif ( this._pageVisibilityHandler !== null ) {\n\n\t\t\tthis._document.removeEventListener( 'visibilitychange', this._pageVisibilityHandler );\n\t\t\tthis._pageVisibilityHandler = null;\n\n\t\t}\n\n\t\tthis._document = null;\n\n\t}\n\n\t/**\n\t * Returns the time delta in seconds.\n\t *\n\t * @return {number} The time delta in second.\n\t */\n\tgetDelta() {\n\n\t\treturn this._delta / 1000;\n\n\t}\n\n\t/**\n\t * Returns the elapsed time in seconds.\n\t *\n\t * @return {number} The elapsed time in second.\n\t */\n\tgetElapsed() {\n\n\t\treturn this._elapsed / 1000;\n\n\t}\n\n\t/**\n\t * Returns the timescale.\n\t *\n\t * @return {number} The timescale.\n\t */\n\tgetTimescale() {\n\n\t\treturn this._timescale;\n\n\t}\n\n\t/**\n\t * Sets the given timescale which scale the time delta computation\n\t * in `update()`.\n\t *\n\t * @param {number} timescale - The timescale to set.\n\t * @return {Timer} A reference to this timer.\n\t */\n\tsetTimescale( timescale ) {\n\n\t\tthis._timescale = timescale;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Resets the time computation for the current simulation step.\n\t *\n\t * @return {Timer} A reference to this timer.\n\t */\n\treset() {\n\n\t\tthis._currentTime = performance.now() - this._startTime;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Can be used to free all internal resources. Usually called when\n\t * the timer instance isn't required anymore.\n\t */\n\tdispose() {\n\n\t\tthis.disconnect();\n\n\t}\n\n\t/**\n\t * Updates the internal state of the timer. This method should be called\n\t * once per simulation step and before you perform queries against the timer\n\t * (e.g. via `getDelta()`).\n\t *\n\t * @param {number} timestamp - The current time in milliseconds. Can be obtained\n\t * from the `requestAnimationFrame` callback argument. If not provided, the current\n\t * time will be determined with `performance.now`.\n\t * @return {Timer} A reference to this timer.\n\t */\n\tupdate( timestamp ) {\n\n\t\tif ( this._pageVisibilityHandler !== null && this._document.hidden === true ) {\n\n\t\t\tthis._delta = 0;\n\n\t\t} else {\n\n\t\t\tthis._previousTime = this._currentTime;\n\t\t\tthis._currentTime = ( timestamp !== undefined ? timestamp : performance.now() ) - this._startTime;\n\n\t\t\tthis._delta = ( this._currentTime - this._previousTime ) * this._timescale;\n\t\t\tthis._elapsed += this._delta; // _elapsed is the accumulation of all previous deltas\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nfunction handleVisibilityChange() {\n\n\tif ( this._document.hidden === false ) this.reset();\n\n}\n\n/**\n * This class can be used to represent points in 3D space as\n * [Spherical coordinates](https://en.wikipedia.org/wiki/Spherical_coordinate_system).\n */\nclass Spherical {\n\n\t/**\n\t * Constructs a new spherical.\n\t *\n\t * @param {number} [radius=1] - The radius, or the Euclidean distance (straight-line distance) from the point to the origin.\n\t * @param {number} [phi=0] - The polar angle in radians from the y (up) axis.\n\t * @param {number} [theta=0] - The equator/azimuthal angle in radians around the y (up) axis.\n\t */\n\tconstructor( radius = 1, phi = 0, theta = 0 ) {\n\n\t\t/**\n\t\t * The radius, or the Euclidean distance (straight-line distance) from the point to the origin.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.radius = radius;\n\n\t\t/**\n\t\t * The polar angle in radians from the y (up) axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.phi = phi;\n\n\t\t/**\n\t\t * The equator/azimuthal angle in radians around the y (up) axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.theta = theta;\n\n\t}\n\n\t/**\n\t * Sets the spherical components by copying the given values.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} phi - The polar angle.\n\t * @param {number} theta - The azimuthal angle.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tset( radius, phi, theta ) {\n\n\t\tthis.radius = radius;\n\t\tthis.phi = phi;\n\t\tthis.theta = theta;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given spherical to this instance.\n\t *\n\t * @param {Spherical} other - The spherical to copy.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.phi = other.phi;\n\t\tthis.theta = other.theta;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Restricts the polar angle [page:.phi phi] to be between `0.000001` and pi -\n\t * `0.000001`.\n\t *\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tmakeSafe() {\n\n\t\tconst EPS = 0.000001;\n\t\tthis.phi = clamp( this.phi, EPS, Math.PI - EPS );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the spherical components from the given vector which is assumed to hold\n\t * Cartesian coordinates.\n\t *\n\t * @param {Vector3} v - The vector to set.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\t/**\n\t * Sets the spherical components from the given Cartesian coordinates.\n\t *\n\t * @param {number} x - The x value.\n\t * @param {number} y - The y value.\n\t * @param {number} z - The z value.\n\t * @return {Spherical} A reference to this spherical.\n\t */\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + y * y + z * z );\n\n\t\tif ( this.radius === 0 ) {\n\n\t\t\tthis.theta = 0;\n\t\t\tthis.phi = 0;\n\n\t\t} else {\n\n\t\t\tthis.theta = Math.atan2( x, z );\n\t\t\tthis.phi = Math.acos( clamp( y / this.radius, -1, 1 ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new spherical with copied values from this instance.\n\t *\n\t * @return {Spherical} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * This class can be used to represent points in 3D space as\n * [Cylindrical coordinates](https://en.wikipedia.org/wiki/Cylindrical_coordinate_system).\n */\nclass Cylindrical {\n\n\t/**\n\t * Constructs a new cylindrical.\n\t *\n\t * @param {number} [radius=1] - The distance from the origin to a point in the x-z plane.\n\t * @param {number} [theta=0] - A counterclockwise angle in the x-z plane measured in radians from the positive z-axis.\n\t * @param {number} [y=0] - The height above the x-z plane.\n\t */\n\tconstructor( radius = 1, theta = 0, y = 0 ) {\n\n\t\t/**\n\t\t * The distance from the origin to a point in the x-z plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.radius = radius;\n\n\t\t/**\n\t\t * A counterclockwise angle in the x-z plane measured in radians from the positive z-axis.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.theta = theta;\n\n\t\t/**\n\t\t * The height above the x-z plane.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.y = y;\n\n\t}\n\n\t/**\n\t * Sets the cylindrical components by copying the given values.\n\t *\n\t * @param {number} radius - The radius.\n\t * @param {number} theta - The theta angle.\n\t * @param {number} y - The height value.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tset( radius, theta, y ) {\n\n\t\tthis.radius = radius;\n\t\tthis.theta = theta;\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given cylindrical to this instance.\n\t *\n\t * @param {Cylindrical} other - The cylindrical to copy.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tcopy( other ) {\n\n\t\tthis.radius = other.radius;\n\t\tthis.theta = other.theta;\n\t\tthis.y = other.y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the cylindrical components from the given vector which is assumed to hold\n\t * Cartesian coordinates.\n\t *\n\t * @param {Vector3} v - The vector to set.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tsetFromVector3( v ) {\n\n\t\treturn this.setFromCartesianCoords( v.x, v.y, v.z );\n\n\t}\n\n\t/**\n\t * Sets the cylindrical components from the given Cartesian coordinates.\n\t *\n\t * @param {number} x - The x value.\n\t * @param {number} y - The x value.\n\t * @param {number} z - The x value.\n\t * @return {Cylindrical} A reference to this cylindrical.\n\t */\n\tsetFromCartesianCoords( x, y, z ) {\n\n\t\tthis.radius = Math.sqrt( x * x + z * z );\n\t\tthis.theta = Math.atan2( x, z );\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new cylindrical with copied values from this instance.\n\t *\n\t * @return {Cylindrical} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n/**\n * Represents a 2x2 matrix.\n *\n * A Note on Row-Major and Column-Major Ordering:\n *\n * The constructor and {@link Matrix2#set} method take arguments in\n * [row-major](https://en.wikipedia.org/wiki/Row-_and_column-major_order#Column-major_order)\n * order, while internally they are stored in the {@link Matrix2#elements} array in column-major order.\n * This means that calling:\n * ```js\n * const m = new THREE.Matrix2();\n * m.set( 11, 12,\n *        21, 22 );\n * ```\n * will result in the elements array containing:\n * ```js\n * m.elements = [ 11, 21,\n *                12, 22 ];\n * ```\n * and internally all calculations are performed using column-major ordering.\n * However, as the actual ordering makes no difference mathematically and\n * most people are used to thinking about matrices in row-major order, the\n * three.js documentation shows matrices in row-major order. Just bear in\n * mind that if you are reading the source code, you'll have to take the\n * transpose of any matrices outlined here to make sense of the calculations.\n */\nclass Matrix2 {\n\n\t/**\n\t * Constructs a new 2x2 matrix. The arguments are supposed to be\n\t * in row-major order. If no arguments are provided, the constructor\n\t * initializes the matrix as an identity matrix.\n\t *\n\t * @param {number} [n11] - 1-1 matrix element.\n\t * @param {number} [n12] - 1-2 matrix element.\n\t * @param {number} [n21] - 2-1 matrix element.\n\t * @param {number} [n22] - 2-2 matrix element.\n\t */\n\tconstructor( n11, n12, n21, n22 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tMatrix2.prototype.isMatrix2 = true;\n\n\t\t/**\n\t\t * A column-major list of matrix values.\n\t\t *\n\t\t * @type {Array<number>}\n\t\t */\n\t\tthis.elements = [\n\t\t\t1, 0,\n\t\t\t0, 1,\n\t\t];\n\n\t\tif ( n11 !== undefined ) {\n\n\t\t\tthis.set( n11, n12, n21, n22 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets this matrix to the 2x2 identity matrix.\n\t *\n\t * @return {Matrix2} A reference to this matrix.\n\t */\n\tidentity() {\n\n\t\tthis.set(\n\t\t\t1, 0,\n\t\t\t0, 1,\n\t\t);\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix from the given array.\n\t *\n\t * @param {Array<number>} array - The matrix elements in column-major order.\n\t * @param {number} [offset=0] - Index of the first element in the array.\n\t * @return {Matrix2} A reference to this matrix.\n\t */\n\tfromArray( array, offset = 0 ) {\n\n\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\tthis.elements[ i ] = array[ i + offset ];\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the elements of the matrix.The arguments are supposed to be\n\t * in row-major order.\n\t *\n\t * @param {number} n11 - 1-1 matrix element.\n\t * @param {number} n12 - 1-2 matrix element.\n\t * @param {number} n21 - 2-1 matrix element.\n\t * @param {number} n22 - 2-2 matrix element.\n\t * @return {Matrix2} A reference to this matrix.\n\t */\n\tset( n11, n12, n21, n22 ) {\n\n\t\tconst te = this.elements;\n\n\t\tte[ 0 ] = n11; te[ 2 ] = n12;\n\t\tte[ 1 ] = n21; te[ 3 ] = n22;\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _vector$4 = /*@__PURE__*/ new Vector2();\n\n/**\n * Represents an axis-aligned bounding box (AABB) in 2D space.\n */\nclass Box2 {\n\n\t/**\n\t * Constructs a new bounding box.\n\t *\n\t * @param {Vector2} [min=(Infinity,Infinity)] - A vector representing the lower boundary of the box.\n\t * @param {Vector2} [max=(-Infinity,-Infinity)] - A vector representing the upper boundary of the box.\n\t */\n\tconstructor( min = new Vector2( + Infinity, + Infinity ), max = new Vector2( - Infinity, - Infinity ) ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBox2 = true;\n\n\t\t/**\n\t\t * The lower boundary of the box.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.min = min;\n\n\t\t/**\n\t\t * The upper boundary of the box.\n\t\t *\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis.max = max;\n\n\t}\n\n\t/**\n\t * Sets the lower and upper boundaries of this box.\n\t * Please note that this method only copies the values from the given objects.\n\t *\n\t * @param {Vector2} min - The lower boundary of the box.\n\t * @param {Vector2} max - The upper boundary of the box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tset( min, max ) {\n\n\t\tthis.min.copy( min );\n\t\tthis.max.copy( max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the upper and lower bounds of this box so it encloses the position data\n\t * in the given array.\n\t *\n\t * @param {Array<Vector2>} points - An array holding 2D position data as instances of {@link Vector2}.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tsetFromPoints( points ) {\n\n\t\tthis.makeEmpty();\n\n\t\tfor ( let i = 0, il = points.length; i < il; i ++ ) {\n\n\t\t\tthis.expandByPoint( points[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Centers this box on the given center vector and sets this box's width, height and\n\t * depth to the given size values.\n\t *\n\t * @param {Vector2} center - The center of the box.\n\t * @param {Vector2} size - The x and y dimensions of the box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tsetFromCenterAndSize( center, size ) {\n\n\t\tconst halfSize = _vector$4.copy( size ).multiplyScalar( 0.5 );\n\t\tthis.min.copy( center ).sub( halfSize );\n\t\tthis.max.copy( center ).add( halfSize );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new box with copied values from this instance.\n\t *\n\t * @return {Box2} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Copies the values of the given box to this instance.\n\t *\n\t * @param {Box2} box - The box to copy.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tcopy( box ) {\n\n\t\tthis.min.copy( box.min );\n\t\tthis.max.copy( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Makes this box empty which means in encloses a zero space in 2D.\n\t *\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tmakeEmpty() {\n\n\t\tthis.min.x = this.min.y = + Infinity;\n\t\tthis.max.x = this.max.y = - Infinity;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns true if this box includes zero points within its bounds.\n\t * Note that a box with equal lower and upper bounds still includes one\n\t * point, the one both bounds share.\n\t *\n\t * @return {boolean} Whether this box is empty or not.\n\t */\n\tisEmpty() {\n\n\t\t// this is a more robust check for empty than ( volume <= 0 ) because volume can get positive with two negative axes\n\n\t\treturn ( this.max.x < this.min.x ) || ( this.max.y < this.min.y );\n\n\t}\n\n\t/**\n\t * Returns the center point of this box.\n\t *\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} The center point.\n\t */\n\tgetCenter( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.addVectors( this.min, this.max ).multiplyScalar( 0.5 );\n\n\t}\n\n\t/**\n\t * Returns the dimensions of this box.\n\t *\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} The size.\n\t */\n\tgetSize( target ) {\n\n\t\treturn this.isEmpty() ? target.set( 0, 0 ) : target.subVectors( this.max, this.min );\n\n\t}\n\n\t/**\n\t * Expands the boundaries of this box to include the given point.\n\t *\n\t * @param {Vector2} point - The point that should be included by the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\texpandByPoint( point ) {\n\n\t\tthis.min.min( point );\n\t\tthis.max.max( point );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands this box equilaterally by the given vector. The width of this\n\t * box will be expanded by the x component of the vector in both\n\t * directions. The height of this box will be expanded by the y component of\n\t * the vector in both directions.\n\t *\n\t * @param {Vector2} vector - The vector that should expand the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\texpandByVector( vector ) {\n\n\t\tthis.min.sub( vector );\n\t\tthis.max.add( vector );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Expands each dimension of the box by the given scalar. If negative, the\n\t * dimensions of the box will be contracted.\n\t *\n\t * @param {number} scalar - The scalar value that should expand the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\texpandByScalar( scalar ) {\n\n\t\tthis.min.addScalar( - scalar );\n\t\tthis.max.addScalar( scalar );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within or on the boundaries of this box.\n\t *\n\t * @param {Vector2} point - The point to test.\n\t * @return {boolean} Whether the bounding box contains the given point or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\treturn point.x >= this.min.x && point.x <= this.max.x &&\n\t\t\tpoint.y >= this.min.y && point.y <= this.max.y;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box includes the entirety of the given bounding box.\n\t * If this box and the given one are identical, this function also returns `true`.\n\t *\n\t * @param {Box2} box - The bounding box to test.\n\t * @return {boolean} Whether the bounding box contains the given bounding box or not.\n\t */\n\tcontainsBox( box ) {\n\n\t\treturn this.min.x <= box.min.x && box.max.x <= this.max.x &&\n\t\t\tthis.min.y <= box.min.y && box.max.y <= this.max.y;\n\n\t}\n\n\t/**\n\t * Returns a point as a proportion of this box's width and height.\n\t *\n\t * @param {Vector2} point - A point in 2D space.\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} A point as a proportion of this box's width and height.\n\t */\n\tgetParameter( point, target ) {\n\n\t\t// This can potentially have a divide by zero if the box\n\t\t// has a size dimension of 0.\n\n\t\treturn target.set(\n\t\t\t( point.x - this.min.x ) / ( this.max.x - this.min.x ),\n\t\t\t( point.y - this.min.y ) / ( this.max.y - this.min.y )\n\t\t);\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box intersects with this bounding box.\n\t *\n\t * @param {Box2} box - The bounding box to test.\n\t * @return {boolean} Whether the given bounding box intersects with this bounding box.\n\t */\n\tintersectsBox( box ) {\n\n\t\t// using 4 splitting planes to rule out intersections\n\n\t\treturn box.max.x >= this.min.x && box.min.x <= this.max.x &&\n\t\t\tbox.max.y >= this.min.y && box.min.y <= this.max.y;\n\n\t}\n\n\t/**\n\t * Clamps the given point within the bounds of this box.\n\t *\n\t * @param {Vector2} point - The point to clamp.\n\t * @param {Vector2} target - The target vector that is used to store the method's result.\n\t * @return {Vector2} The clamped point.\n\t */\n\tclampPoint( point, target ) {\n\n\t\treturn target.copy( point ).clamp( this.min, this.max );\n\n\t}\n\n\t/**\n\t * Returns the euclidean distance from any edge of this box to the specified point. If\n\t * the given point lies inside of this box, the distance will be `0`.\n\t *\n\t * @param {Vector2} point - The point to compute the distance to.\n\t * @return {number} The euclidean distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn this.clampPoint( point, _vector$4 ).distanceTo( point );\n\n\t}\n\n\t/**\n\t * Computes the intersection of this bounding box and the given one, setting the upper\n\t * bound of this box to the lesser of the two boxes' upper bounds and the\n\t * lower bound of this box to the greater of the two boxes' lower bounds. If\n\t * there's no overlap, makes this box empty.\n\t *\n\t * @param {Box2} box - The bounding box to intersect with.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tintersect( box ) {\n\n\t\tthis.min.max( box.min );\n\t\tthis.max.min( box.max );\n\n\t\tif ( this.isEmpty() ) this.makeEmpty();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the union of this box and another and the given one, setting the upper\n\t * bound of this box to the greater of the two boxes' upper bounds and the\n\t * lower bound of this box to the lesser of the two boxes' lower bounds.\n\t *\n\t * @param {Box2} box - The bounding box that will be unioned with this instance.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\tunion( box ) {\n\n\t\tthis.min.min( box.min );\n\t\tthis.max.max( box.max );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds the given offset to both the upper and lower bounds of this bounding box,\n\t * effectively moving it in 2D space.\n\t *\n\t * @param {Vector2} offset - The offset that should be used to translate the bounding box.\n\t * @return {Box2} A reference to this bounding box.\n\t */\n\ttranslate( offset ) {\n\n\t\tthis.min.add( offset );\n\t\tthis.max.add( offset );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this bounding box is equal with the given one.\n\t *\n\t * @param {Box2} box - The box to test for equality.\n\t * @return {boolean} Whether this bounding box is equal with the given one.\n\t */\n\tequals( box ) {\n\n\t\treturn box.min.equals( this.min ) && box.max.equals( this.max );\n\n\t}\n\n}\n\nconst _startP = /*@__PURE__*/ new Vector3();\nconst _startEnd = /*@__PURE__*/ new Vector3();\n\nconst _d1 = /*@__PURE__*/ new Vector3();\nconst _d2 = /*@__PURE__*/ new Vector3();\nconst _r = /*@__PURE__*/ new Vector3();\nconst _c1 = /*@__PURE__*/ new Vector3();\nconst _c2 = /*@__PURE__*/ new Vector3();\n\n/**\n * An analytical line segment in 3D space represented by a start and end point.\n */\nclass Line3 {\n\n\t/**\n\t * Constructs a new line segment.\n\t *\n\t * @param {Vector3} [start=(0,0,0)] - Start of the line segment.\n\t * @param {Vector3} [end=(0,0,0)] - End of the line segment.\n\t */\n\tconstructor( start = new Vector3(), end = new Vector3() ) {\n\n\t\t/**\n\t\t * Start of the line segment.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.start = start;\n\n\t\t/**\n\t\t * End of the line segment.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.end = end;\n\n\t}\n\n\t/**\n\t * Sets the start and end values by copying the given vectors.\n\t *\n\t * @param {Vector3} start - The start point.\n\t * @param {Vector3} end - The end point.\n\t * @return {Line3} A reference to this line segment.\n\t */\n\tset( start, end ) {\n\n\t\tthis.start.copy( start );\n\t\tthis.end.copy( end );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given line segment to this instance.\n\t *\n\t * @param {Line3} line - The line segment to copy.\n\t * @return {Line3} A reference to this line segment.\n\t */\n\tcopy( line ) {\n\n\t\tthis.start.copy( line.start );\n\t\tthis.end.copy( line.end );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the center of the line segment.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The center point.\n\t */\n\tgetCenter( target ) {\n\n\t\treturn target.addVectors( this.start, this.end ).multiplyScalar( 0.5 );\n\n\t}\n\n\t/**\n\t * Returns the delta vector of the line segment's start and end point.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The delta vector.\n\t */\n\tdelta( target ) {\n\n\t\treturn target.subVectors( this.end, this.start );\n\n\t}\n\n\t/**\n\t * Returns the squared Euclidean distance between the line' start and end point.\n\t *\n\t * @return {number} The squared Euclidean distance.\n\t */\n\tdistanceSq() {\n\n\t\treturn this.start.distanceToSquared( this.end );\n\n\t}\n\n\t/**\n\t * Returns the Euclidean distance between the line' start and end point.\n\t *\n\t * @return {number} The Euclidean distance.\n\t */\n\tdistance() {\n\n\t\treturn this.start.distanceTo( this.end );\n\n\t}\n\n\t/**\n\t * Returns a vector at a certain position along the line segment.\n\t *\n\t * @param {number} t - A value between `[0,1]` to represent a position along the line segment.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The delta vector.\n\t */\n\tat( t, target ) {\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\t/**\n\t * Returns a point parameter based on the closest point as projected on the line segment.\n\t *\n\t * @param {Vector3} point - The point for which to return a point parameter.\n\t * @param {boolean} clampToLine - Whether to clamp the result to the range `[0,1]` or not.\n\t * @return {number} The point parameter.\n\t */\n\tclosestPointToPointParameter( point, clampToLine ) {\n\n\t\t_startP.subVectors( point, this.start );\n\t\t_startEnd.subVectors( this.end, this.start );\n\n\t\tconst startEnd2 = _startEnd.dot( _startEnd );\n\t\tconst startEnd_startP = _startEnd.dot( _startP );\n\n\t\tlet t = startEnd_startP / startEnd2;\n\n\t\tif ( clampToLine ) {\n\n\t\t\tt = clamp( t, 0, 1 );\n\n\t\t}\n\n\t\treturn t;\n\n\t}\n\n\t/**\n\t * Returns the closest point on the line for a given point.\n\t *\n\t * @param {Vector3} point - The point to compute the closest point on the line for.\n\t * @param {boolean} clampToLine - Whether to clamp the result to the range `[0,1]` or not.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The closest point on the line.\n\t */\n\tclosestPointToPoint( point, clampToLine, target ) {\n\n\t\tconst t = this.closestPointToPointParameter( point, clampToLine );\n\n\t\treturn this.delta( target ).multiplyScalar( t ).add( this.start );\n\n\t}\n\n\t/**\n\t * Returns the closest squared distance between this line segment and the given one.\n\t *\n\t * @param {Line3} line - The line segment to compute the closest squared distance to.\n\t * @param {Vector3} [c1] - The closest point on this line segment.\n\t * @param {Vector3} [c2] - The closest point on the given line segment.\n\t * @return {number} The squared distance between this line segment and the given one.\n\t */\n\tdistanceSqToLine3( line, c1 = _c1, c2 = _c2 ) {\n\n\t\t// from Real-Time Collision Detection by Christer Ericson, chapter 5.1.9\n\n\t\t// Computes closest points C1 and C2 of S1(s)=P1+s*(Q1-P1) and\n\t\t// S2(t)=P2+t*(Q2-P2), returning s and t. Function result is squared\n\t\t// distance between between S1(s) and S2(t)\n\n\t\tconst EPSILON = 1e-8 * 1e-8; // must be squared since we compare squared length\n\t\tlet s, t;\n\n\t\tconst p1 = this.start;\n\t\tconst p2 = line.start;\n\t\tconst q1 = this.end;\n\t\tconst q2 = line.end;\n\n\t\t_d1.subVectors( q1, p1 ); // Direction vector of segment S1\n\t\t_d2.subVectors( q2, p2 ); // Direction vector of segment S2\n\t\t_r.subVectors( p1, p2 );\n\n\t\tconst a = _d1.dot( _d1 ); // Squared length of segment S1, always nonnegative\n\t\tconst e = _d2.dot( _d2 ); // Squared length of segment S2, always nonnegative\n\t\tconst f = _d2.dot( _r );\n\n\t\t// Check if either or both segments degenerate into points\n\n\t\tif ( a <= EPSILON && e <= EPSILON ) {\n\n\t\t\t// Both segments degenerate into points\n\n\t\t\tc1.copy( p1 );\n\t\t\tc2.copy( p2 );\n\n\t\t\tc1.sub( c2 );\n\n\t\t\treturn c1.dot( c1 );\n\n\t\t}\n\n\t\tif ( a <= EPSILON ) {\n\n\t\t\t// First segment degenerates into a point\n\n\t\t\ts = 0;\n\t\t\tt = f / e; // s = 0 => t = (b*s + f) / e = f / e\n\t\t\tt = clamp( t, 0, 1 );\n\n\n\t\t} else {\n\n\t\t\tconst c = _d1.dot( _r );\n\n\t\t\tif ( e <= EPSILON ) {\n\n\t\t\t\t// Second segment degenerates into a point\n\n\t\t\t\tt = 0;\n\t\t\t\ts = clamp( - c / a, 0, 1 ); // t = 0 => s = (b*t - c) / a = -c / a\n\n\t\t\t} else {\n\n\t\t\t\t// The general nondegenerate case starts here\n\n\t\t\t\tconst b = _d1.dot( _d2 );\n\t\t\t\tconst denom = a * e - b * b; // Always nonnegative\n\n\t\t\t\t// If segments not parallel, compute closest point on L1 to L2 and\n\t\t\t\t// clamp to segment S1. Else pick arbitrary s (here 0)\n\n\t\t\t\tif ( denom !== 0 ) {\n\n\t\t\t\t\ts = clamp( ( b * f - c * e ) / denom, 0, 1 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ts = 0;\n\n\t\t\t\t}\n\n\t\t\t\t// Compute point on L2 closest to S1(s) using\n\t\t\t\t// t = Dot((P1 + D1*s) - P2,D2) / Dot(D2,D2) = (b*s + f) / e\n\n\t\t\t\tt = ( b * s + f ) / e;\n\n\t\t\t\t// If t in [0,1] done. Else clamp t, recompute s for the new value\n\t\t\t\t// of t using s = Dot((P2 + D2*t) - P1,D1) / Dot(D1,D1)= (t*b - c) / a\n\t\t\t\t// and clamp s to [0, 1]\n\n\t\t\t\tif ( t < 0 ) {\n\n\t\t\t\t\tt = 0.;\n\t\t\t\t\ts = clamp( - c / a, 0, 1 );\n\n\t\t\t\t} else if ( t > 1 ) {\n\n\t\t\t\t\tt = 1;\n\t\t\t\t\ts = clamp( ( b - c ) / a, 0, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tc1.copy( p1 ).add( _d1.multiplyScalar( s ) );\n\t\tc2.copy( p2 ).add( _d2.multiplyScalar( t ) );\n\n\t\tc1.sub( c2 );\n\n\t\treturn c1.dot( c1 );\n\n\t}\n\n\t/**\n\t * Applies a 4x4 transformation matrix to this line segment.\n\t *\n\t * @param {Matrix4} matrix - The transformation matrix.\n\t * @return {Line3} A reference to this line segment.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tthis.start.applyMatrix4( matrix );\n\t\tthis.end.applyMatrix4( matrix );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if this line segment is equal with the given one.\n\t *\n\t * @param {Line3} line - The line segment to test for equality.\n\t * @return {boolean} Whether this line segment is equal with the given one.\n\t */\n\tequals( line ) {\n\n\t\treturn line.start.equals( this.start ) && line.end.equals( this.end );\n\n\t}\n\n\t/**\n\t * Returns a new line segment with copied values from this instance.\n\t *\n\t * @return {Line3} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nconst _vector$3 = /*@__PURE__*/ new Vector3();\n\n/**\n * This displays a cone shaped helper object for a {@link SpotLight}.\n *\n * ```js\n * const spotLight = new THREE.SpotLight( 0xffffff );\n * spotLight.position.set( 10, 10, 10 );\n * scene.add( spotLight );\n *\n * const spotLightHelper = new THREE.SpotLightHelper( spotLight );\n * scene.add( spotLightHelper );\n * ```\n *\n * @augments Object3D\n */\nclass SpotLightHelper extends Object3D {\n\n\t/**\n\t * Constructs a new spot light helper.\n\t *\n\t * @param {HemisphereLight} light - The light to be visualized.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, color ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {SpotLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'SpotLightHelper';\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst positions = [\n\t\t\t0, 0, 0, \t0, 0, 1,\n\t\t\t0, 0, 0, \t1, 0, 1,\n\t\t\t0, 0, 0,\t-1, 0, 1,\n\t\t\t0, 0, 0, \t0, 1, 1,\n\t\t\t0, 0, 0, \t0, -1, 1\n\t\t];\n\n\t\tfor ( let i = 0, j = 1, l = 32; i < l; i ++, j ++ ) {\n\n\t\t\tconst p1 = ( i / l ) * Math.PI * 2;\n\t\t\tconst p2 = ( j / l ) * Math.PI * 2;\n\n\t\t\tpositions.push(\n\t\t\t\tMath.cos( p1 ), Math.sin( p1 ), 1,\n\t\t\t\tMath.cos( p2 ), Math.sin( p2 ), 1\n\t\t\t);\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\tthis.cone = new LineSegments( geometry, material );\n\t\tthis.add( this.cone );\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\t\tthis.light.target.updateWorldMatrix( true, false );\n\n\t\t// update the local matrix based on the parent and light target transforms\n\t\tif ( this.parent ) {\n\n\t\t\tthis.parent.updateWorldMatrix( true );\n\n\t\t\tthis.matrix\n\t\t\t\t.copy( this.parent.matrixWorld )\n\t\t\t\t.invert()\n\t\t\t\t.multiply( this.light.matrixWorld );\n\n\t\t} else {\n\n\t\t\tthis.matrix.copy( this.light.matrixWorld );\n\n\t\t}\n\n\t\tthis.matrixWorld.copy( this.light.matrixWorld );\n\n\t\tconst coneLength = this.light.distance ? this.light.distance : 1000;\n\t\tconst coneWidth = coneLength * Math.tan( this.light.angle );\n\n\t\tthis.cone.scale.set( coneWidth, coneWidth, coneLength );\n\n\t\t_vector$3.setFromMatrixPosition( this.light.target.matrixWorld );\n\n\t\tthis.cone.lookAt( _vector$3 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.cone.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.cone.material.color.copy( this.light.color );\n\n\t\t}\n\n\t}\n\n}\n\nconst _vector$2 = /*@__PURE__*/ new Vector3();\nconst _boneMatrix = /*@__PURE__*/ new Matrix4();\nconst _matrixWorldInv = /*@__PURE__*/ new Matrix4();\n\n/**\n * A helper object to assist with visualizing a {@link Skeleton}.\n *\n * ```js\n * const helper = new THREE.SkeletonHelper( skinnedMesh );\n * scene.add( helper );\n * ```\n *\n * @augments LineSegments\n */\nclass SkeletonHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new skeleton helper.\n\t *\n\t * @param {Object3D} object -  Usually an instance of {@link SkinnedMesh}. However, any 3D object\n\t * can be used if it represents a hierarchy of bones (see {@link Bone}).\n\t */\n\tconstructor( object ) {\n\n\t\tconst bones = getBoneList( object );\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tfor ( let i = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tcolors.push( 0, 0, 0 );\n\t\t\t\tcolors.push( 0, 0, 0 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, depthTest: false, depthWrite: false, toneMapped: false, transparent: true } );\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSkeletonHelper = true;\n\n\t\tthis.type = 'SkeletonHelper';\n\n\t\t/**\n\t\t * The object being visualized.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.root = object;\n\n\t\t/**\n\t\t * The list of bones that the helper visualizes.\n\t\t *\n\t\t * @type {Array<Bone>}\n\t\t */\n\t\tthis.bones = bones;\n\n\t\tthis.matrix = object.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t// colors\n\n\t\tconst color1 = new Color( 0x0000ff );\n\t\tconst color2 = new Color( 0x00ff00 );\n\n\t\tthis.setColors( color1, color2 );\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst bones = this.bones;\n\n\t\tconst geometry = this.geometry;\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t_matrixWorldInv.copy( this.root.matrixWorld ).invert();\n\n\t\tfor ( let i = 0, j = 0; i < bones.length; i ++ ) {\n\n\t\t\tconst bone = bones[ i ];\n\n\t\t\tif ( bone.parent && bone.parent.isBone ) {\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j, _vector$2.x, _vector$2.y, _vector$2.z );\n\n\t\t\t\t_boneMatrix.multiplyMatrices( _matrixWorldInv, bone.parent.matrixWorld );\n\t\t\t\t_vector$2.setFromMatrixPosition( _boneMatrix );\n\t\t\t\tposition.setXYZ( j + 1, _vector$2.x, _vector$2.y, _vector$2.z );\n\n\t\t\t\tj += 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\t/**\n\t * Defines the colors of the helper.\n\t *\n\t * @param {Color} color1 - The first line color for each bone.\n\t * @param {Color} color2 - The second line color for each bone.\n\t * @return {SkeletonHelper} A reference to this helper.\n\t */\n\tsetColors( color1, color2 ) {\n\n\t\tconst geometry = this.geometry;\n\t\tconst colorAttribute = geometry.getAttribute( 'color' );\n\n\t\tfor ( let i = 0; i < colorAttribute.count; i += 2 ) {\n\n\t\t\tcolorAttribute.setXYZ( i, color1.r, color1.g, color1.b );\n\t\t\tcolorAttribute.setXYZ( i + 1, color2.r, color2.g, color2.b );\n\n\t\t}\n\n\t\tcolorAttribute.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n\nfunction getBoneList( object ) {\n\n\tconst boneList = [];\n\n\tif ( object.isBone === true ) {\n\n\t\tboneList.push( object );\n\n\t}\n\n\tfor ( let i = 0; i < object.children.length; i ++ ) {\n\n\t\tboneList.push( ...getBoneList( object.children[ i ] ) );\n\n\t}\n\n\treturn boneList;\n\n}\n\n/**\n * This displays a helper object consisting of a spherical mesh for\n * visualizing an instance of {@link PointLight}.\n *\n * ```js\n * const pointLight = new THREE.PointLight( 0xff0000, 1, 100 );\n * pointLight.position.set( 10, 10, 10 );\n * scene.add( pointLight );\n *\n * const sphereSize = 1;\n * const pointLightHelper = new THREE.PointLightHelper( pointLight, sphereSize );\n * scene.add( pointLightHelper );\n * ```\n *\n * @augments Mesh\n */\nclass PointLightHelper extends Mesh {\n\n\t/**\n\t * Constructs a new point light helper.\n\t *\n\t * @param {PointLight} light - The light to be visualized.\n\t * @param {number} [sphereSize=1] - The size of the sphere helper.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, sphereSize, color ) {\n\n\t\tconst geometry = new SphereGeometry( sphereSize, 4, 2 );\n\t\tconst material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {PointLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'PointLightHelper';\n\n\t\tthis.matrix = this.light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\n\t\t/*\n\t// TODO: delete this comment?\n\tconst distanceGeometry = new THREE.IcosahedronGeometry( 1, 2 );\n\tconst distanceMaterial = new THREE.MeshBasicMaterial( { color: hexColor, fog: false, wireframe: true, opacity: 0.1, transparent: true } );\n\n\tthis.lightSphere = new THREE.Mesh( bulbGeometry, bulbMaterial );\n\tthis.lightDistance = new THREE.Mesh( distanceGeometry, distanceMaterial );\n\n\tconst d = light.distance;\n\n\tif ( d === 0.0 ) {\n\n\t\tthis.lightDistance.visible = false;\n\n\t} else {\n\n\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t}\n\n\tthis.add( this.lightDistance );\n\t*/\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\t/*\n\t\tconst d = this.light.distance;\n\n\t\tif ( d === 0.0 ) {\n\n\t\t\tthis.lightDistance.visible = false;\n\n\t\t} else {\n\n\t\t\tthis.lightDistance.visible = true;\n\t\t\tthis.lightDistance.scale.set( d, d, d );\n\n\t\t}\n\t\t*/\n\n\t}\n\n}\n\nconst _vector$1 = /*@__PURE__*/ new Vector3();\nconst _color1 = /*@__PURE__*/ new Color();\nconst _color2 = /*@__PURE__*/ new Color();\n\n/**\n * Creates a visual aid consisting of a spherical mesh for a\n * given {@link HemisphereLight}.\n *\n * ```js\n * const light = new THREE.HemisphereLight( 0xffffbb, 0x080820, 1 );\n * const helper = new THREE.HemisphereLightHelper( light, 5 );\n * scene.add( helper );\n * ```\n *\n * @augments Object3D\n */\nclass HemisphereLightHelper extends Object3D {\n\n\t/**\n\t * Constructs a new hemisphere light helper.\n\t *\n\t * @param {HemisphereLight} light - The light to be visualized.\n\t * @param {number} [size=1] - The size of the mesh used to visualize the light.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {HemisphereLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'HemisphereLightHelper';\n\n\t\tconst geometry = new OctahedronGeometry( size );\n\t\tgeometry.rotateY( Math.PI * 0.5 );\n\n\t\tthis.material = new MeshBasicMaterial( { wireframe: true, fog: false, toneMapped: false } );\n\t\tif ( this.color === undefined ) this.material.vertexColors = true;\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\t\tconst colors = new Float32Array( position.count * 3 );\n\n\t\tgeometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\n\t\tthis.add( new Mesh( geometry, this.material ) );\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tconst mesh = this.children[ 0 ];\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tconst colors = mesh.geometry.getAttribute( 'color' );\n\n\t\t\t_color1.copy( this.light.color );\n\t\t\t_color2.copy( this.light.groundColor );\n\n\t\t\tfor ( let i = 0, l = colors.count; i < l; i ++ ) {\n\n\t\t\t\tconst color = ( i < ( l / 2 ) ) ? _color1 : _color2;\n\n\t\t\t\tcolors.setXYZ( i, color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t\tcolors.needsUpdate = true;\n\n\t\t}\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\n\t\tmesh.lookAt( _vector$1.setFromMatrixPosition( this.light.matrixWorld ).negate() );\n\n\t}\n\n}\n\n/**\n * The helper is an object to define grids. Grids are two-dimensional\n * arrays of lines.\n *\n * ```js\n * const size = 10;\n * const divisions = 10;\n *\n * const gridHelper = new THREE.GridHelper( size, divisions );\n * scene.add( gridHelper );\n * ```\n *\n * @augments LineSegments\n */\nclass GridHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new grid helper.\n\t *\n\t * @param {number} [size=10] - The size of the grid.\n\t * @param {number} [divisions=10] - The number of divisions across the grid.\n\t * @param {number|Color|string} [color1=0x444444] - The color of the center line.\n\t * @param {number|Color|string} [color2=0x888888] - The color of the lines of the grid.\n\t */\n\tconstructor( size = 10, divisions = 10, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst center = divisions / 2;\n\t\tconst step = size / divisions;\n\t\tconst halfSize = size / 2;\n\n\t\tconst vertices = [], colors = [];\n\n\t\tfor ( let i = 0, j = 0, k = - halfSize; i <= divisions; i ++, k += step ) {\n\n\t\t\tvertices.push( - halfSize, 0, k, halfSize, 0, k );\n\t\t\tvertices.push( k, 0, - halfSize, k, 0, halfSize );\n\n\t\t\tconst color = i === center ? color1 : color2;\n\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\t\t\tcolor.toArray( colors, j ); j += 3;\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'GridHelper';\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * This helper is an object to define polar grids. Grids are\n * two-dimensional arrays of lines.\n *\n * ```js\n * const radius = 10;\n * const sectors = 16;\n * const rings = 8;\n * const divisions = 64;\n *\n * const helper = new THREE.PolarGridHelper( radius, sectors, rings, divisions );\n * scene.add( helper );\n * ```\n *\n * @augments LineSegments\n */\nclass PolarGridHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new polar grid helper.\n\t *\n\t * @param {number} [radius=10] - The radius of the polar grid. This can be any positive number.\n\t * @param {number} [sectors=16] - The number of sectors the grid will be divided into. This can be any positive integer.\n\t * @param {number} [rings=16] - The number of rings. This can be any positive integer.\n\t * @param {number} [divisions=64] - The number of line segments used for each circle. This can be any positive integer.\n\t * @param {number|Color|string} [color1=0x444444] - The first color used for grid elements.\n\t * @param {number|Color|string} [color2=0x888888] -  The second color used for grid elements.\n\t */\n\tconstructor( radius = 10, sectors = 16, rings = 8, divisions = 64, color1 = 0x444444, color2 = 0x888888 ) {\n\n\t\tcolor1 = new Color( color1 );\n\t\tcolor2 = new Color( color2 );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\t// create the sectors\n\n\t\tif ( sectors > 1 ) {\n\n\t\t\tfor ( let i = 0; i < sectors; i ++ ) {\n\n\t\t\t\tconst v = ( i / sectors ) * ( Math.PI * 2 );\n\n\t\t\t\tconst x = Math.sin( v ) * radius;\n\t\t\t\tconst z = Math.cos( v ) * radius;\n\n\t\t\t\tvertices.push( 0, 0, 0 );\n\t\t\t\tvertices.push( x, 0, z );\n\n\t\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// create the rings\n\n\t\tfor ( let i = 0; i < rings; i ++ ) {\n\n\t\t\tconst color = ( i & 1 ) ? color1 : color2;\n\n\t\t\tconst r = radius - ( radius / rings * i );\n\n\t\t\tfor ( let j = 0; j < divisions; j ++ ) {\n\n\t\t\t\t// first vertex\n\n\t\t\t\tlet v = ( j / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tlet x = Math.sin( v ) * r;\n\t\t\t\tlet z = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t\t// second vertex\n\n\t\t\t\tv = ( ( j + 1 ) / divisions ) * ( Math.PI * 2 );\n\n\t\t\t\tx = Math.sin( v ) * r;\n\t\t\t\tz = Math.cos( v ) * r;\n\n\t\t\t\tvertices.push( x, 0, z );\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'PolarGridHelper';\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nconst _v1 = /*@__PURE__*/ new Vector3();\nconst _v2 = /*@__PURE__*/ new Vector3();\nconst _v3 = /*@__PURE__*/ new Vector3();\n\n/**\n * Helper object to assist with visualizing a {@link DirectionalLight}'s\n * effect on the scene. This consists of plane and a line representing the\n * light's position and direction.\n *\n * ```js\n * const light = new THREE.DirectionalLight( 0xFFFFFF );\n * scene.add( light );\n *\n * const helper = new THREE.DirectionalLightHelper( light, 5 );\n * scene.add( helper );\n * ```\n *\n * @augments Object3D\n */\nclass DirectionalLightHelper extends Object3D {\n\n\t/**\n\t * Constructs a new directional light helper.\n\t *\n\t * @param {DirectionalLight} light - The light to be visualized.\n\t * @param {number} [size=1] - The dimensions of the plane.\n\t * @param {number|Color|string} [color] - The helper's color. If not set, the helper will take\n\t * the color of the light.\n\t */\n\tconstructor( light, size, color ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The light being visualized.\n\t\t *\n\t\t * @type {DirectionalLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\tthis.matrix = light.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The color parameter passed in the constructor.\n\t\t * If not set, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'DirectionalLightHelper';\n\n\t\tif ( size === undefined ) size = 1;\n\n\t\tlet geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [\n\t\t\t- size, size, 0,\n\t\t\tsize, size, 0,\n\t\t\tsize, - size, 0,\n\t\t\t- size, - size, 0,\n\t\t\t- size, size, 0\n\t\t], 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { fog: false, toneMapped: false } );\n\n\t\t/**\n\t\t * Contains the line showing the location of the directional light.\n\t\t *\n\t\t * @type {Line}\n\t\t */\n\t\tthis.lightPlane = new Line( geometry, material );\n\t\tthis.add( this.lightPlane );\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 0, 1 ], 3 ) );\n\n\t\t/**\n\t\t * Represents the target line of the directional light.\n\t\t *\n\t\t * @type {Line}\n\t\t */\n\t\tthis.targetLine = new Line( geometry, material );\n\t\tthis.add( this.targetLine );\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.lightPlane.geometry.dispose();\n\t\tthis.lightPlane.material.dispose();\n\t\tthis.targetLine.geometry.dispose();\n\t\tthis.targetLine.material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tupdate() {\n\n\t\tthis.light.updateWorldMatrix( true, false );\n\t\tthis.light.target.updateWorldMatrix( true, false );\n\n\t\t_v1.setFromMatrixPosition( this.light.matrixWorld );\n\t\t_v2.setFromMatrixPosition( this.light.target.matrixWorld );\n\t\t_v3.subVectors( _v2, _v1 );\n\n\t\tthis.lightPlane.lookAt( _v2 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.lightPlane.material.color.set( this.color );\n\t\t\tthis.targetLine.material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.lightPlane.material.color.copy( this.light.color );\n\t\t\tthis.targetLine.material.color.copy( this.light.color );\n\n\t\t}\n\n\t\tthis.targetLine.lookAt( _v2 );\n\t\tthis.targetLine.scale.z = _v3.length();\n\n\t}\n\n}\n\nconst _vector = /*@__PURE__*/ new Vector3();\nconst _camera = /*@__PURE__*/ new Camera();\n\n/**\n * This helps with visualizing what a camera contains in its frustum. It\n * visualizes the frustum of a camera using a line segments.\n *\n * Based on frustum visualization in [lightgl.js shadowmap example](https://github.com/evanw/lightgl.js/blob/master/tests/shadowmap.html).\n *\n * `CameraHelper` must be a child of the scene.\n *\n * ```js\n * const camera = new THREE.PerspectiveCamera( 75, window.innerWidth / window.innerHeight, 0.1, 1000 );\n * const helper = new THREE.CameraHelper( camera );\n * scene.add( helper );\n * ```\n *\n * @augments LineSegments\n */\nclass CameraHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new arrow helper.\n\t *\n\t * @param {Camera} camera - The camera to visualize.\n\t */\n\tconstructor( camera ) {\n\n\t\tconst geometry = new BufferGeometry();\n\t\tconst material = new LineBasicMaterial( { color: 0xffffff, vertexColors: true, toneMapped: false } );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tconst pointMap = {};\n\n\t\t// near\n\n\t\taddLine( 'n1', 'n2' );\n\t\taddLine( 'n2', 'n4' );\n\t\taddLine( 'n4', 'n3' );\n\t\taddLine( 'n3', 'n1' );\n\n\t\t// far\n\n\t\taddLine( 'f1', 'f2' );\n\t\taddLine( 'f2', 'f4' );\n\t\taddLine( 'f4', 'f3' );\n\t\taddLine( 'f3', 'f1' );\n\n\t\t// sides\n\n\t\taddLine( 'n1', 'f1' );\n\t\taddLine( 'n2', 'f2' );\n\t\taddLine( 'n3', 'f3' );\n\t\taddLine( 'n4', 'f4' );\n\n\t\t// cone\n\n\t\taddLine( 'p', 'n1' );\n\t\taddLine( 'p', 'n2' );\n\t\taddLine( 'p', 'n3' );\n\t\taddLine( 'p', 'n4' );\n\n\t\t// up\n\n\t\taddLine( 'u1', 'u2' );\n\t\taddLine( 'u2', 'u3' );\n\t\taddLine( 'u3', 'u1' );\n\n\t\t// target\n\n\t\taddLine( 'c', 't' );\n\t\taddLine( 'p', 'c' );\n\n\t\t// cross\n\n\t\taddLine( 'cn1', 'cn2' );\n\t\taddLine( 'cn3', 'cn4' );\n\n\t\taddLine( 'cf1', 'cf2' );\n\t\taddLine( 'cf3', 'cf4' );\n\n\t\tfunction addLine( a, b ) {\n\n\t\t\taddPoint( a );\n\t\t\taddPoint( b );\n\n\t\t}\n\n\t\tfunction addPoint( id ) {\n\n\t\t\tvertices.push( 0, 0, 0 );\n\t\t\tcolors.push( 0, 0, 0 );\n\n\t\t\tif ( pointMap[ id ] === undefined ) {\n\n\t\t\t\tpointMap[ id ] = [];\n\n\t\t\t}\n\n\t\t\tpointMap[ id ].push( ( vertices.length / 3 ) - 1 );\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'CameraHelper';\n\n\t\t/**\n\t\t * The camera being visualized.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = camera;\n\t\tif ( this.camera.updateProjectionMatrix ) this.camera.updateProjectionMatrix();\n\n\t\tthis.matrix = camera.matrixWorld;\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * This contains the points used to visualize the camera.\n\t\t *\n\t\t * @type {Object<string,Array<number>>}\n\t\t */\n\t\tthis.pointMap = pointMap;\n\n\t\tthis.update();\n\n\t\t// colors\n\n\t\tconst colorFrustum = new Color( 0xffaa00 );\n\t\tconst colorCone = new Color( 0xff0000 );\n\t\tconst colorUp = new Color( 0x00aaff );\n\t\tconst colorTarget = new Color( 0xffffff );\n\t\tconst colorCross = new Color( 0x333333 );\n\n\t\tthis.setColors( colorFrustum, colorCone, colorUp, colorTarget, colorCross );\n\n\t}\n\n\t/**\n\t * Defines the colors of the helper.\n\t *\n\t * @param {Color} frustum - The frustum line color.\n\t * @param {Color} cone - The cone line color.\n\t * @param {Color} up - The up line color.\n\t * @param {Color} target - The target line color.\n\t * @param {Color} cross - The cross line color.\n\t * @return {CameraHelper} A reference to this helper.\n\t */\n\tsetColors( frustum, cone, up, target, cross ) {\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst colorAttribute = geometry.getAttribute( 'color' );\n\n\t\t// near\n\n\t\tcolorAttribute.setXYZ( 0, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 1, frustum.r, frustum.g, frustum.b ); // n1, n2\n\t\tcolorAttribute.setXYZ( 2, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 3, frustum.r, frustum.g, frustum.b ); // n2, n4\n\t\tcolorAttribute.setXYZ( 4, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 5, frustum.r, frustum.g, frustum.b ); // n4, n3\n\t\tcolorAttribute.setXYZ( 6, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 7, frustum.r, frustum.g, frustum.b ); // n3, n1\n\n\t\t// far\n\n\t\tcolorAttribute.setXYZ( 8, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 9, frustum.r, frustum.g, frustum.b ); // f1, f2\n\t\tcolorAttribute.setXYZ( 10, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 11, frustum.r, frustum.g, frustum.b ); // f2, f4\n\t\tcolorAttribute.setXYZ( 12, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 13, frustum.r, frustum.g, frustum.b ); // f4, f3\n\t\tcolorAttribute.setXYZ( 14, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 15, frustum.r, frustum.g, frustum.b ); // f3, f1\n\n\t\t// sides\n\n\t\tcolorAttribute.setXYZ( 16, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 17, frustum.r, frustum.g, frustum.b ); // n1, f1\n\t\tcolorAttribute.setXYZ( 18, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 19, frustum.r, frustum.g, frustum.b ); // n2, f2\n\t\tcolorAttribute.setXYZ( 20, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 21, frustum.r, frustum.g, frustum.b ); // n3, f3\n\t\tcolorAttribute.setXYZ( 22, frustum.r, frustum.g, frustum.b ); colorAttribute.setXYZ( 23, frustum.r, frustum.g, frustum.b ); // n4, f4\n\n\t\t// cone\n\n\t\tcolorAttribute.setXYZ( 24, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 25, cone.r, cone.g, cone.b ); // p, n1\n\t\tcolorAttribute.setXYZ( 26, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 27, cone.r, cone.g, cone.b ); // p, n2\n\t\tcolorAttribute.setXYZ( 28, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 29, cone.r, cone.g, cone.b ); // p, n3\n\t\tcolorAttribute.setXYZ( 30, cone.r, cone.g, cone.b ); colorAttribute.setXYZ( 31, cone.r, cone.g, cone.b ); // p, n4\n\n\t\t// up\n\n\t\tcolorAttribute.setXYZ( 32, up.r, up.g, up.b ); colorAttribute.setXYZ( 33, up.r, up.g, up.b ); // u1, u2\n\t\tcolorAttribute.setXYZ( 34, up.r, up.g, up.b ); colorAttribute.setXYZ( 35, up.r, up.g, up.b ); // u2, u3\n\t\tcolorAttribute.setXYZ( 36, up.r, up.g, up.b ); colorAttribute.setXYZ( 37, up.r, up.g, up.b ); // u3, u1\n\n\t\t// target\n\n\t\tcolorAttribute.setXYZ( 38, target.r, target.g, target.b ); colorAttribute.setXYZ( 39, target.r, target.g, target.b ); // c, t\n\t\tcolorAttribute.setXYZ( 40, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 41, cross.r, cross.g, cross.b ); // p, c\n\n\t\t// cross\n\n\t\tcolorAttribute.setXYZ( 42, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 43, cross.r, cross.g, cross.b ); // cn1, cn2\n\t\tcolorAttribute.setXYZ( 44, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 45, cross.r, cross.g, cross.b ); // cn3, cn4\n\n\t\tcolorAttribute.setXYZ( 46, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 47, cross.r, cross.g, cross.b ); // cf1, cf2\n\t\tcolorAttribute.setXYZ( 48, cross.r, cross.g, cross.b ); colorAttribute.setXYZ( 49, cross.r, cross.g, cross.b ); // cf3, cf4\n\n\t\tcolorAttribute.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Updates the helper based on the projection matrix of the camera.\n\t */\n\tupdate() {\n\n\t\tconst geometry = this.geometry;\n\t\tconst pointMap = this.pointMap;\n\n\t\tconst w = 1, h = 1;\n\n\t\tlet nearZ, farZ;\n\n\t\t// we need just camera projection matrix inverse\n\t\t// world matrix must be identity\n\n\t\t_camera.projectionMatrixInverse.copy( this.camera.projectionMatrixInverse );\n\n\t\t// Adjust z values based on coordinate system\n\n\t\tif ( this.camera.reversedDepth === true ) {\n\n\t\t\tnearZ = 1;\n\t\t\tfarZ = 0;\n\n\t\t} else {\n\n\t\t\tif ( this.camera.coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\t\tnearZ = -1;\n\t\t\t\tfarZ = 1;\n\n\t\t\t} else if ( this.camera.coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tnearZ = 0;\n\t\t\t\tfarZ = 1;\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'THREE.CameraHelper.update(): Invalid coordinate system: ' + this.camera.coordinateSystem );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// center / target\n\t\tsetPoint( 'c', pointMap, geometry, _camera, 0, 0, nearZ );\n\t\tsetPoint( 't', pointMap, geometry, _camera, 0, 0, farZ );\n\n\t\t// near\n\n\t\tsetPoint( 'n1', pointMap, geometry, _camera, - w, - h, nearZ );\n\t\tsetPoint( 'n2', pointMap, geometry, _camera, w, - h, nearZ );\n\t\tsetPoint( 'n3', pointMap, geometry, _camera, - w, h, nearZ );\n\t\tsetPoint( 'n4', pointMap, geometry, _camera, w, h, nearZ );\n\n\t\t// far\n\n\t\tsetPoint( 'f1', pointMap, geometry, _camera, - w, - h, farZ );\n\t\tsetPoint( 'f2', pointMap, geometry, _camera, w, - h, farZ );\n\t\tsetPoint( 'f3', pointMap, geometry, _camera, - w, h, farZ );\n\t\tsetPoint( 'f4', pointMap, geometry, _camera, w, h, farZ );\n\n\t\t// up\n\n\t\tsetPoint( 'u1', pointMap, geometry, _camera, w * 0.7, h * 1.1, nearZ );\n\t\tsetPoint( 'u2', pointMap, geometry, _camera, - w * 0.7, h * 1.1, nearZ );\n\t\tsetPoint( 'u3', pointMap, geometry, _camera, 0, h * 2, nearZ );\n\n\t\t// cross\n\n\t\tsetPoint( 'cf1', pointMap, geometry, _camera, - w, 0, farZ );\n\t\tsetPoint( 'cf2', pointMap, geometry, _camera, w, 0, farZ );\n\t\tsetPoint( 'cf3', pointMap, geometry, _camera, 0, - h, farZ );\n\t\tsetPoint( 'cf4', pointMap, geometry, _camera, 0, h, farZ );\n\n\t\tsetPoint( 'cn1', pointMap, geometry, _camera, - w, 0, nearZ );\n\t\tsetPoint( 'cn2', pointMap, geometry, _camera, w, 0, nearZ );\n\t\tsetPoint( 'cn3', pointMap, geometry, _camera, 0, - h, nearZ );\n\t\tsetPoint( 'cn4', pointMap, geometry, _camera, 0, h, nearZ );\n\n\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n\nfunction setPoint( point, pointMap, geometry, camera, x, y, z ) {\n\n\t_vector.set( x, y, z ).unproject( camera );\n\n\tconst points = pointMap[ point ];\n\n\tif ( points !== undefined ) {\n\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\tposition.setXYZ( points[ i ], _vector.x, _vector.y, _vector.z );\n\n\t\t}\n\n\t}\n\n}\n\nconst _box = /*@__PURE__*/ new Box3();\n\n/**\n * Helper object to graphically show the world-axis-aligned bounding box\n * around an object. The actual bounding box is handled with {@link Box3},\n * this is just a visual helper for debugging. It can be automatically\n * resized with {@link BoxHelper#update} when the object it's created from\n * is transformed. Note that the object must have a geometry for this to work,\n * so it won't work with sprites.\n *\n * ```js\n * const sphere = new THREE.SphereGeometry();\n * const object = new THREE.Mesh( sphere, new THREE.MeshBasicMaterial( 0xff0000 ) );\n * const box = new THREE.BoxHelper( object, 0xffff00 );\n * scene.add( box );\n * ```\n *\n * @augments LineSegments\n */\nclass BoxHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new box helper.\n\t *\n\t * @param {Object3D} [object] - The 3D object to show the world-axis-aligned bounding box.\n\t * @param {number|Color|string} [color=0xffff00] - The box's color.\n\t */\n\tconstructor( object, color = 0xffff00 ) {\n\n\t\tconst indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\t\tconst positions = new Float32Array( 8 * 3 );\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tgeometry.setAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\t/**\n\t\t * The 3D object being visualized.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.object = object;\n\t\tthis.type = 'BoxHelper';\n\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Updates the helper's geometry to match the dimensions of the object,\n\t * including any children.\n\t */\n\tupdate() {\n\n\t\tif ( this.object !== undefined ) {\n\n\t\t\t_box.setFromObject( this.object );\n\n\t\t}\n\n\t\tif ( _box.isEmpty() ) return;\n\n\t\tconst min = _box.min;\n\t\tconst max = _box.max;\n\n\t\t/*\n\t\t\t5____4\n\t\t1/___0/|\n\t\t| 6__|_7\n\t\t2/___3/\n\n\t\t0: max.x, max.y, max.z\n\t\t1: min.x, max.y, max.z\n\t\t2: min.x, min.y, max.z\n\t\t3: max.x, min.y, max.z\n\t\t4: max.x, max.y, min.z\n\t\t5: min.x, max.y, min.z\n\t\t6: min.x, min.y, min.z\n\t\t7: max.x, min.y, min.z\n\t\t*/\n\n\t\tconst position = this.geometry.attributes.position;\n\t\tconst array = position.array;\n\n\t\tarray[ 0 ] = max.x; array[ 1 ] = max.y; array[ 2 ] = max.z;\n\t\tarray[ 3 ] = min.x; array[ 4 ] = max.y; array[ 5 ] = max.z;\n\t\tarray[ 6 ] = min.x; array[ 7 ] = min.y; array[ 8 ] = max.z;\n\t\tarray[ 9 ] = max.x; array[ 10 ] = min.y; array[ 11 ] = max.z;\n\t\tarray[ 12 ] = max.x; array[ 13 ] = max.y; array[ 14 ] = min.z;\n\t\tarray[ 15 ] = min.x; array[ 16 ] = max.y; array[ 17 ] = min.z;\n\t\tarray[ 18 ] = min.x; array[ 19 ] = min.y; array[ 20 ] = min.z;\n\t\tarray[ 21 ] = max.x; array[ 22 ] = min.y; array[ 23 ] = min.z;\n\n\t\tposition.needsUpdate = true;\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t}\n\n\t/**\n\t * Updates the wireframe box for the passed object.\n\t *\n\t * @param {Object3D} object - The 3D object to create the helper for.\n\t * @return {BoxHelper} A reference to this instance.\n\t */\n\tsetFromObject( object ) {\n\n\t\tthis.object = object;\n\t\tthis.update();\n\n\t\treturn this;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.object = source.object;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * A helper object to visualize an instance of {@link Box3}.\n *\n * ```js\n * const box = new THREE.Box3();\n * box.setFromCenterAndSize( new THREE.Vector3( 1, 1, 1 ), new THREE.Vector3( 2, 1, 3 ) );\n *\n * const helper = new THREE.Box3Helper( box, 0xffff00 );\n * scene.add( helper )\n * ```\n *\n * @augments LineSegments\n */\nclass Box3Helper extends LineSegments {\n\n\t/**\n\t * Constructs a new box3 helper.\n\t *\n\t * @param {Box3} box - The box to visualize.\n\t * @param {number|Color|string} [color=0xffff00] - The box's color.\n\t */\n\tconstructor( box, color = 0xffff00 ) {\n\n\t\tconst indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\n\t\tconst positions = [ 1, 1, 1, -1, 1, 1, -1, -1, 1, 1, -1, 1, 1, 1, -1, -1, 1, -1, -1, -1, -1, 1, -1, -1 ];\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\t/**\n\t\t * The box being visualized.\n\t\t *\n\t\t * @type {Box3}\n\t\t */\n\t\tthis.box = box;\n\n\t\tthis.type = 'Box3Helper';\n\n\t\tthis.geometry.computeBoundingSphere();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst box = this.box;\n\n\t\tif ( box.isEmpty() ) return;\n\n\t\tbox.getCenter( this.position );\n\n\t\tbox.getSize( this.scale );\n\n\t\tthis.scale.multiplyScalar( 0.5 );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * A helper object to visualize an instance of {@link Plane}.\n *\n * ```js\n * const plane = new THREE.Plane( new THREE.Vector3( 1, 1, 0.2 ), 3 );\n * const helper = new THREE.PlaneHelper( plane, 1, 0xffff00 );\n * scene.add( helper );\n * ```\n *\n * @augments Line\n */\nclass PlaneHelper extends Line {\n\n\t/**\n\t * Constructs a new plane helper.\n\t *\n\t * @param {Plane} plane - The plane to be visualized.\n\t * @param {number} [size=1] - The side length of plane helper.\n\t * @param {number|Color|string} [hex=0xffff00] - The helper's color.\n\t */\n\tconstructor( plane, size = 1, hex = 0xffff00 ) {\n\n\t\tconst color = hex;\n\n\t\tconst positions = [ 1, -1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, 1, 0, -1, -1, 0, 1, -1, 0, 1, 1, 0 ];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\t\tgeometry.computeBoundingSphere();\n\n\t\tsuper( geometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\tthis.type = 'PlaneHelper';\n\n\t\t/**\n\t\t * The plane being visualized.\n\t\t *\n\t\t * @type {Plane}\n\t\t */\n\t\tthis.plane = plane;\n\n\t\t/**\n\t\t * The side length of plane helper.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.size = size;\n\n\t\tconst positions2 = [ 1, 1, 0, -1, 1, 0, -1, -1, 0, 1, 1, 0, -1, -1, 0, 1, -1, 0 ];\n\n\t\tconst geometry2 = new BufferGeometry();\n\t\tgeometry2.setAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );\n\t\tgeometry2.computeBoundingSphere();\n\n\t\tthis.add( new Mesh( geometry2, new MeshBasicMaterial( { color: color, opacity: 0.2, transparent: true, depthWrite: false, toneMapped: false } ) ) );\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tthis.position.set( 0, 0, 0 );\n\n\t\tthis.scale.set( 0.5 * this.size, 0.5 * this.size, 1 );\n\n\t\tthis.lookAt( this.plane.normal );\n\n\t\tthis.translateZ( - this.plane.constant );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\t/**\n\t * Updates the helper to match the position and direction of the\n\t * light being visualized.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n}\n\nconst _axis = /*@__PURE__*/ new Vector3();\nlet _lineGeometry, _coneGeometry;\n\n/**\n * An 3D arrow object for visualizing directions.\n *\n * ```js\n * const dir = new THREE.Vector3( 1, 2, 0 );\n *\n * //normalize the direction vector (convert to vector of length 1)\n * dir.normalize();\n *\n * const origin = new THREE.Vector3( 0, 0, 0 );\n * const length = 1;\n * const hex = 0xffff00;\n *\n * const arrowHelper = new THREE.ArrowHelper( dir, origin, length, hex );\n * scene.add( arrowHelper );\n * ```\n *\n * @augments Object3D\n */\nclass ArrowHelper extends Object3D {\n\n\t/**\n\t * Constructs a new arrow helper.\n\t *\n\t * @param {Vector3} [dir=(0, 0, 1)] - The (normalized) direction vector.\n\t * @param {Vector3} [origin=(0, 0, 0)] - Point at which the arrow starts.\n\t * @param {number} [length=1] - Length of the arrow in world units.\n\t * @param {(number|Color|string)} [color=0xffff00] - Color of the arrow.\n\t * @param {number} [headLength=length*0.2] - The length of the head of the arrow.\n\t * @param {number} [headWidth=headLength*0.2] - The width of the head of the arrow.\n\t */\n\tconstructor( dir = new Vector3( 0, 0, 1 ), origin = new Vector3( 0, 0, 0 ), length = 1, color = 0xffff00, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ArrowHelper';\n\n\t\tif ( _lineGeometry === undefined ) {\n\n\t\t\t_lineGeometry = new BufferGeometry();\n\t\t\t_lineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 0, 1, 0 ], 3 ) );\n\n\t\t\t_coneGeometry = new ConeGeometry( 0.5, 1, 5, 1 );\n\t\t\t_coneGeometry.translate( 0, -0.5, 0 );\n\n\t\t}\n\n\t\tthis.position.copy( origin );\n\n\t\t/**\n\t\t * The line part of the arrow helper.\n\t\t *\n\t\t * @type {Line}\n\t\t */\n\t\tthis.line = new Line( _lineGeometry, new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.line.matrixAutoUpdate = false;\n\t\tthis.add( this.line );\n\n\t\t/**\n\t\t * The cone part of the arrow helper.\n\t\t *\n\t\t * @type {Mesh}\n\t\t */\n\t\tthis.cone = new Mesh( _coneGeometry, new MeshBasicMaterial( { color: color, toneMapped: false } ) );\n\t\tthis.cone.matrixAutoUpdate = false;\n\t\tthis.add( this.cone );\n\n\t\tthis.setDirection( dir );\n\t\tthis.setLength( length, headLength, headWidth );\n\n\t}\n\n\t/**\n\t * Sets the direction of the helper.\n\t *\n\t * @param {Vector3} dir - The normalized direction vector.\n\t */\n\tsetDirection( dir ) {\n\n\t\t// dir is assumed to be normalized\n\n\t\tif ( dir.y > 0.99999 ) {\n\n\t\t\tthis.quaternion.set( 0, 0, 0, 1 );\n\n\t\t} else if ( dir.y < -0.99999 ) {\n\n\t\t\tthis.quaternion.set( 1, 0, 0, 0 );\n\n\t\t} else {\n\n\t\t\t_axis.set( dir.z, 0, - dir.x ).normalize();\n\n\t\t\tconst radians = Math.acos( dir.y );\n\n\t\t\tthis.quaternion.setFromAxisAngle( _axis, radians );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the length of the helper.\n\t *\n\t * @param {number} length - Length of the arrow in world units.\n\t * @param {number} [headLength=length*0.2] - The length of the head of the arrow.\n\t * @param {number} [headWidth=headLength*0.2] - The width of the head of the arrow.\n\t */\n\tsetLength( length, headLength = length * 0.2, headWidth = headLength * 0.2 ) {\n\n\t\tthis.line.scale.set( 1, Math.max( 0.0001, length - headLength ), 1 ); // see #17458\n\t\tthis.line.updateMatrix();\n\n\t\tthis.cone.scale.set( headWidth, headLength, headWidth );\n\t\tthis.cone.position.y = length;\n\t\tthis.cone.updateMatrix();\n\n\t}\n\n\t/**\n\t * Sets the color of the helper.\n\t *\n\t * @param {number|Color|string} color - The color to set.\n\t */\n\tsetColor( color ) {\n\n\t\tthis.line.material.color.set( color );\n\t\tthis.cone.material.color.set( color );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source, false );\n\n\t\tthis.line.copy( source.line );\n\t\tthis.cone.copy( source.cone );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.line.geometry.dispose();\n\t\tthis.line.material.dispose();\n\t\tthis.cone.geometry.dispose();\n\t\tthis.cone.material.dispose();\n\n\t}\n\n}\n\n/**\n * An axis object to visualize the 3 axes in a simple way.\n * The X axis is red. The Y axis is green. The Z axis is blue.\n *\n * ```js\n * const axesHelper = new THREE.AxesHelper( 5 );\n * scene.add( axesHelper );\n * ```\n *\n * @augments LineSegments\n */\nclass AxesHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new axes helper.\n\t *\n\t * @param {number} [size=1] - Size of the lines representing the axes.\n\t */\n\tconstructor( size = 1 ) {\n\n\t\tconst vertices = [\n\t\t\t0, 0, 0,\tsize, 0, 0,\n\t\t\t0, 0, 0,\t0, size, 0,\n\t\t\t0, 0, 0,\t0, 0, size\n\t\t];\n\n\t\tconst colors = [\n\t\t\t1, 0, 0,\t1, 0.6, 0,\n\t\t\t0, 1, 0,\t0.6, 1, 0,\n\t\t\t0, 0, 1,\t0, 0.6, 1\n\t\t];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\tconst material = new LineBasicMaterial( { vertexColors: true, toneMapped: false } );\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'AxesHelper';\n\n\t}\n\n\t/**\n\t * Defines the colors of the axes helper.\n\t *\n\t * @param {number|Color|string} xAxisColor - The color for the x axis.\n\t * @param {number|Color|string} yAxisColor - The color for the y axis.\n\t * @param {number|Color|string} zAxisColor - The color for the z axis.\n\t * @return {AxesHelper} A reference to this axes helper.\n\t */\n\tsetColors( xAxisColor, yAxisColor, zAxisColor ) {\n\n\t\tconst color = new Color();\n\t\tconst array = this.geometry.attributes.color.array;\n\n\t\tcolor.set( xAxisColor );\n\t\tcolor.toArray( array, 0 );\n\t\tcolor.toArray( array, 3 );\n\n\t\tcolor.set( yAxisColor );\n\t\tcolor.toArray( array, 6 );\n\t\tcolor.toArray( array, 9 );\n\n\t\tcolor.set( zAxisColor );\n\t\tcolor.toArray( array, 12 );\n\t\tcolor.toArray( array, 15 );\n\n\t\tthis.geometry.attributes.color.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\n/**\n * This class is used to convert a series of paths to an array of\n * shapes. It is specifically used in context of fonts and SVG.\n */\nclass ShapePath {\n\n\t/**\n\t * Constructs a new shape path.\n\t */\n\tconstructor() {\n\n\t\tthis.type = 'ShapePath';\n\n\t\t/**\n\t\t * The color of the shape.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color();\n\n\t\t/**\n\t\t * The paths that have been generated for this shape.\n\t\t *\n\t\t * @type {Array<Path>}\n\t\t * @default null\n\t\t */\n\t\tthis.subPaths = [];\n\n\t\t/**\n\t\t * The current path that is being generated.\n\t\t *\n\t\t * @type {?Path}\n\t\t * @default null\n\t\t */\n\t\tthis.currentPath = null;\n\n\t}\n\n\t/**\n\t * Creates a new path and moves it current point to the given one.\n\t *\n\t * @param {number} x - The x coordinate.\n\t * @param {number} y - The y coordinate.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tmoveTo( x, y ) {\n\n\t\tthis.currentPath = new Path();\n\t\tthis.subPaths.push( this.currentPath );\n\t\tthis.currentPath.moveTo( x, y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link LineCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} x - The x coordinate of the end point.\n\t * @param {number} y - The y coordinate of the end point.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tlineTo( x, y ) {\n\n\t\tthis.currentPath.lineTo( x, y );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link QuadraticBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCPx - The x coordinate of the control point.\n\t * @param {number} aCPy - The y coordinate of the control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tquadraticCurveTo( aCPx, aCPy, aX, aY ) {\n\n\t\tthis.currentPath.quadraticCurveTo( aCPx, aCPy, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link CubicBezierCurve} to the path by connecting\n\t * the current point with the given one.\n\t *\n\t * @param {number} aCP1x - The x coordinate of the first control point.\n\t * @param {number} aCP1y - The y coordinate of the first control point.\n\t * @param {number} aCP2x - The x coordinate of the second control point.\n\t * @param {number} aCP2y - The y coordinate of the second control point.\n\t * @param {number} aX - The x coordinate of the end point.\n\t * @param {number} aY - The y coordinate of the end point.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tbezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY ) {\n\n\t\tthis.currentPath.bezierCurveTo( aCP1x, aCP1y, aCP2x, aCP2y, aX, aY );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds an instance of {@link SplineCurve} to the path by connecting\n\t * the current point with the given list of points.\n\t *\n\t * @param {Array<Vector2>} pts - An array of points in 2D space.\n\t * @return {ShapePath} A reference to this shape path.\n\t */\n\tsplineThru( pts ) {\n\n\t\tthis.currentPath.splineThru( pts );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Converts the paths into an array of shapes.\n\t *\n\t * @param {boolean} isCCW - By default solid shapes are  defined clockwise (CW) and holes are defined counterclockwise (CCW).\n\t * If this flag is set to `true`, then those are flipped.\n\t * @return {Array<Shape>} An array of shapes.\n\t */\n\ttoShapes( isCCW ) {\n\n\t\tfunction toShapesNoHoles( inSubpaths ) {\n\n\t\t\tconst shapes = [];\n\n\t\t\tfor ( let i = 0, l = inSubpaths.length; i < l; i ++ ) {\n\n\t\t\t\tconst tmpPath = inSubpaths[ i ];\n\n\t\t\t\tconst tmpShape = new Shape();\n\t\t\t\ttmpShape.curves = tmpPath.curves;\n\n\t\t\t\tshapes.push( tmpShape );\n\n\t\t\t}\n\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tfunction isPointInsidePolygon( inPt, inPolygon ) {\n\n\t\t\tconst polyLen = inPolygon.length;\n\n\t\t\t// inPt on polygon contour => immediate success    or\n\t\t\t// toggling of inside/outside at every single! intersection point of an edge\n\t\t\t//  with the horizontal line through inPt, left of inPt\n\t\t\t//  not counting lowerY endpoints of edges and whole edges on that line\n\t\t\tlet inside = false;\n\t\t\tfor ( let p = polyLen - 1, q = 0; q < polyLen; p = q ++ ) {\n\n\t\t\t\tlet edgeLowPt = inPolygon[ p ];\n\t\t\t\tlet edgeHighPt = inPolygon[ q ];\n\n\t\t\t\tlet edgeDx = edgeHighPt.x - edgeLowPt.x;\n\t\t\t\tlet edgeDy = edgeHighPt.y - edgeLowPt.y;\n\n\t\t\t\tif ( Math.abs( edgeDy ) > Number.EPSILON ) {\n\n\t\t\t\t\t// not parallel\n\t\t\t\t\tif ( edgeDy < 0 ) {\n\n\t\t\t\t\t\tedgeLowPt = inPolygon[ q ]; edgeDx = - edgeDx;\n\t\t\t\t\t\tedgeHighPt = inPolygon[ p ]; edgeDy = - edgeDy;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ( inPt.y < edgeLowPt.y ) || ( inPt.y > edgeHighPt.y ) ) \t\tcontinue;\n\n\t\t\t\t\tif ( inPt.y === edgeLowPt.y ) {\n\n\t\t\t\t\t\tif ( inPt.x === edgeLowPt.x )\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\t// continue;\t\t\t\t// no intersection or edgeLowPt => doesn't count !!!\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst perpEdge = edgeDy * ( inPt.x - edgeLowPt.x ) - edgeDx * ( inPt.y - edgeLowPt.y );\n\t\t\t\t\t\tif ( perpEdge === 0 )\t\t\t\treturn\ttrue;\t\t// inPt is on contour ?\n\t\t\t\t\t\tif ( perpEdge < 0 ) \t\t\t\tcontinue;\n\t\t\t\t\t\tinside = ! inside;\t\t// true intersection left of inPt\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// parallel or collinear\n\t\t\t\t\tif ( inPt.y !== edgeLowPt.y ) \t\tcontinue;\t\t\t// parallel\n\t\t\t\t\t// edge lies on the same horizontal line as inPt\n\t\t\t\t\tif ( ( ( edgeHighPt.x <= inPt.x ) && ( inPt.x <= edgeLowPt.x ) ) ||\n\t\t\t\t\t\t ( ( edgeLowPt.x <= inPt.x ) && ( inPt.x <= edgeHighPt.x ) ) )\t\treturn\ttrue;\t// inPt: Point on contour !\n\t\t\t\t\t// continue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn\tinside;\n\n\t\t}\n\n\t\tconst isClockWise = ShapeUtils.isClockWise;\n\n\t\tconst subPaths = this.subPaths;\n\t\tif ( subPaths.length === 0 ) return [];\n\n\t\tlet solid, tmpPath, tmpShape;\n\t\tconst shapes = [];\n\n\t\tif ( subPaths.length === 1 ) {\n\n\t\t\ttmpPath = subPaths[ 0 ];\n\t\t\ttmpShape = new Shape();\n\t\t\ttmpShape.curves = tmpPath.curves;\n\t\t\tshapes.push( tmpShape );\n\t\t\treturn shapes;\n\n\t\t}\n\n\t\tlet holesFirst = ! isClockWise( subPaths[ 0 ].getPoints() );\n\t\tholesFirst = isCCW ? ! holesFirst : holesFirst;\n\n\t\t// log(\"Holes first\", holesFirst);\n\n\t\tconst betterShapeHoles = [];\n\t\tconst newShapes = [];\n\t\tlet newShapeHoles = [];\n\t\tlet mainIdx = 0;\n\t\tlet tmpPoints;\n\n\t\tnewShapes[ mainIdx ] = undefined;\n\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\tfor ( let i = 0, l = subPaths.length; i < l; i ++ ) {\n\n\t\t\ttmpPath = subPaths[ i ];\n\t\t\ttmpPoints = tmpPath.getPoints();\n\t\t\tsolid = isClockWise( tmpPoints );\n\t\t\tsolid = isCCW ? ! solid : solid;\n\n\t\t\tif ( solid ) {\n\n\t\t\t\tif ( ( ! holesFirst ) && ( newShapes[ mainIdx ] ) )\tmainIdx ++;\n\n\t\t\t\tnewShapes[ mainIdx ] = { s: new Shape(), p: tmpPoints };\n\t\t\t\tnewShapes[ mainIdx ].s.curves = tmpPath.curves;\n\n\t\t\t\tif ( holesFirst )\tmainIdx ++;\n\t\t\t\tnewShapeHoles[ mainIdx ] = [];\n\n\t\t\t\t//log('cw', i);\n\n\t\t\t} else {\n\n\t\t\t\tnewShapeHoles[ mainIdx ].push( { h: tmpPath, p: tmpPoints[ 0 ] } );\n\n\t\t\t\t//log('ccw', i);\n\n\t\t\t}\n\n\t\t}\n\n\t\t// only Holes? -> probably all Shapes with wrong orientation\n\t\tif ( ! newShapes[ 0 ] )\treturn\ttoShapesNoHoles( subPaths );\n\n\n\t\tif ( newShapes.length > 1 ) {\n\n\t\t\tlet ambiguous = false;\n\t\t\tlet toChange = 0;\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tbetterShapeHoles[ sIdx ] = [];\n\n\t\t\t}\n\n\t\t\tfor ( let sIdx = 0, sLen = newShapes.length; sIdx < sLen; sIdx ++ ) {\n\n\t\t\t\tconst sho = newShapeHoles[ sIdx ];\n\n\t\t\t\tfor ( let hIdx = 0; hIdx < sho.length; hIdx ++ ) {\n\n\t\t\t\t\tconst ho = sho[ hIdx ];\n\t\t\t\t\tlet hole_unassigned = true;\n\n\t\t\t\t\tfor ( let s2Idx = 0; s2Idx < newShapes.length; s2Idx ++ ) {\n\n\t\t\t\t\t\tif ( isPointInsidePolygon( ho.p, newShapes[ s2Idx ].p ) ) {\n\n\t\t\t\t\t\t\tif ( sIdx !== s2Idx )\ttoChange ++;\n\n\t\t\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\t\t\thole_unassigned = false;\n\t\t\t\t\t\t\t\tbetterShapeHoles[ s2Idx ].push( ho );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tambiguous = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hole_unassigned ) {\n\n\t\t\t\t\t\tbetterShapeHoles[ sIdx ].push( ho );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( toChange > 0 && ambiguous === false ) {\n\n\t\t\t\tnewShapeHoles = betterShapeHoles;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet tmpHoles;\n\n\t\tfor ( let i = 0, il = newShapes.length; i < il; i ++ ) {\n\n\t\t\ttmpShape = newShapes[ i ].s;\n\t\t\tshapes.push( tmpShape );\n\t\t\ttmpHoles = newShapeHoles[ i ];\n\n\t\t\tfor ( let j = 0, jl = tmpHoles.length; j < jl; j ++ ) {\n\n\t\t\t\ttmpShape.holes.push( tmpHoles[ j ].h );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//log(\"shape\", shapes);\n\n\t\treturn shapes;\n\n\t}\n\n}\n\n/**\n * Abstract base class for controls.\n *\n * @abstract\n * @augments EventDispatcher\n */\nclass Controls extends EventDispatcher {\n\n\t/**\n\t * Constructs a new controls instance.\n\t *\n\t * @param {Object3D} object - The object that is managed by the controls.\n\t * @param {?HTMLElement} domElement - The HTML element used for event listeners.\n\t */\n\tconstructor( object, domElement = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The object that is managed by the controls.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.object = object;\n\n\t\t/**\n\t\t * The HTML element used for event listeners.\n\t\t *\n\t\t * @type {?HTMLElement}\n\t\t * @default null\n\t\t */\n\t\tthis.domElement = domElement;\n\n\t\t/**\n\t\t * Whether the controls responds to user input or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enabled = true;\n\n\t\t/**\n\t\t * The internal state of the controls.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.state = -1;\n\n\t\t/**\n\t\t * This object defines the keyboard input of the controls.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.keys = {};\n\n\t\t/**\n\t\t * This object defines what type of actions are assigned to the available mouse buttons.\n\t\t * It depends on the control implementation what kind of mouse buttons and actions are supported.\n\t\t *\n\t\t * @type {{LEFT: ?number, MIDDLE: ?number, RIGHT: ?number}}\n\t\t */\n\t\tthis.mouseButtons = { LEFT: null, MIDDLE: null, RIGHT: null };\n\n\t\t/**\n\t\t * This object defines what type of actions are assigned to what kind of touch interaction.\n\t\t * It depends on the control implementation what kind of touch interaction and actions are supported.\n\t\t *\n\t\t * @type {{ONE: ?number, TWO: ?number}}\n\t\t */\n\t\tthis.touches = { ONE: null, TWO: null };\n\n\t}\n\n\t/**\n\t * Connects the controls to the DOM. This method has so called \"side effects\" since\n\t * it adds the module's event listeners to the DOM.\n\t *\n\t * @param {HTMLElement} element - The DOM element to connect to.\n\t */\n\tconnect( element ) {\n\n\t\tif ( element === undefined ) {\n\n\t\t\twarn( 'Controls: connect() now requires an element.' ); // @deprecated, the warning can be removed with r185\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.domElement !== null ) this.disconnect();\n\n\t\tthis.domElement = element;\n\n\t}\n\n\t/**\n\t * Disconnects the controls from the DOM.\n\t */\n\tdisconnect() {}\n\n\t/**\n\t * Call this method if you no longer want use to the controls. It frees all internal\n\t * resources and removes all event listeners.\n\t */\n\tdispose() {}\n\n\t/**\n\t * Controls should implement this method if they have to update their internal state\n\t * per simulation step.\n\t *\n\t * @param {number} [delta] - The time delta in seconds.\n\t */\n\tupdate( /* delta */ ) {}\n\n}\n\n/**\n * Scales the texture as large as possible within its surface without cropping\n * or stretching the texture. The method preserves the original aspect ratio of\n * the texture. Akin to CSS `object-fit: contain`\n *\n * @param {Texture} texture - The texture.\n * @param {number} aspect - The texture's aspect ratio.\n * @return {Texture} The updated texture.\n */\nfunction contain( texture, aspect ) {\n\n\tconst imageAspect = ( texture.image && texture.image.width ) ? texture.image.width / texture.image.height : 1;\n\n\tif ( imageAspect > aspect ) {\n\n\t\ttexture.repeat.x = 1;\n\t\ttexture.repeat.y = imageAspect / aspect;\n\n\t\ttexture.offset.x = 0;\n\t\ttexture.offset.y = ( 1 - texture.repeat.y ) / 2;\n\n\t} else {\n\n\t\ttexture.repeat.x = aspect / imageAspect;\n\t\ttexture.repeat.y = 1;\n\n\t\ttexture.offset.x = ( 1 - texture.repeat.x ) / 2;\n\t\ttexture.offset.y = 0;\n\n\t}\n\n\treturn texture;\n\n}\n\n/**\n * Scales the texture to the smallest possible size to fill the surface, leaving\n * no empty space. The method preserves the original aspect ratio of the texture.\n * Akin to CSS `object-fit: cover`.\n *\n * @param {Texture} texture - The texture.\n * @param {number} aspect - The texture's aspect ratio.\n * @return {Texture} The updated texture.\n */\nfunction cover( texture, aspect ) {\n\n\tconst imageAspect = ( texture.image && texture.image.width ) ? texture.image.width / texture.image.height : 1;\n\n\tif ( imageAspect > aspect ) {\n\n\t\ttexture.repeat.x = aspect / imageAspect;\n\t\ttexture.repeat.y = 1;\n\n\t\ttexture.offset.x = ( 1 - texture.repeat.x ) / 2;\n\t\ttexture.offset.y = 0;\n\n\t} else {\n\n\t\ttexture.repeat.x = 1;\n\t\ttexture.repeat.y = imageAspect / aspect;\n\n\t\ttexture.offset.x = 0;\n\t\ttexture.offset.y = ( 1 - texture.repeat.y ) / 2;\n\n\t}\n\n\treturn texture;\n\n}\n\n/**\n * Configures the texture to the default transformation. Akin to CSS `object-fit: fill`.\n *\n * @param {Texture} texture - The texture.\n * @return {Texture} The updated texture.\n */\nfunction fill( texture ) {\n\n\ttexture.repeat.x = 1;\n\ttexture.repeat.y = 1;\n\n\ttexture.offset.x = 0;\n\ttexture.offset.y = 0;\n\n\treturn texture;\n\n}\n\n/**\n * Determines how many bytes must be used to represent the texture.\n *\n * @param {number} width - The width of the texture.\n * @param {number} height - The height of the texture.\n * @param {number} format - The texture's format.\n * @param {number} type - The texture's type.\n * @return {number} The byte length.\n */\nfunction getByteLength( width, height, format, type ) {\n\n\tconst typeByteLength = getTextureTypeByteLength( type );\n\n\tswitch ( format ) {\n\n\t\t// https://registry.khronos.org/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml\n\t\tcase AlphaFormat:\n\t\t\treturn width * height;\n\t\tcase RedFormat:\n\t\t\treturn ( ( width * height ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RedIntegerFormat:\n\t\t\treturn ( ( width * height ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGFormat:\n\t\t\treturn ( ( width * height * 2 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGIntegerFormat:\n\t\t\treturn ( ( width * height * 2 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGBFormat:\n\t\t\treturn ( ( width * height * 3 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGBAFormat:\n\t\t\treturn ( ( width * height * 4 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\t\tcase RGBAIntegerFormat:\n\t\t\treturn ( ( width * height * 4 ) / typeByteLength.components ) * typeByteLength.byteLength;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_s3tc_srgb/\n\t\tcase RGB_S3TC_DXT1_Format:\n\t\tcase RGBA_S3TC_DXT1_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 8;\n\t\tcase RGBA_S3TC_DXT3_Format:\n\t\tcase RGBA_S3TC_DXT5_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_pvrtc/\n\t\tcase RGB_PVRTC_2BPPV1_Format:\n\t\tcase RGBA_PVRTC_2BPPV1_Format:\n\t\t\treturn ( Math.max( width, 16 ) * Math.max( height, 8 ) ) / 4;\n\t\tcase RGB_PVRTC_4BPPV1_Format:\n\t\tcase RGBA_PVRTC_4BPPV1_Format:\n\t\t\treturn ( Math.max( width, 8 ) * Math.max( height, 8 ) ) / 2;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_etc/\n\t\tcase RGB_ETC1_Format:\n\t\tcase RGB_ETC2_Format:\n\t\tcase R11_EAC_Format:\n\t\tcase SIGNED_R11_EAC_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 8;\n\t\tcase RGBA_ETC2_EAC_Format:\n\t\tcase RG11_EAC_Format:\n\t\tcase SIGNED_RG11_EAC_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/WEBGL_compressed_texture_astc/\n\t\tcase RGBA_ASTC_4x4_Format:\n\t\t\treturn Math.floor( ( width + 3 ) / 4 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\t\tcase RGBA_ASTC_5x4_Format:\n\t\t\treturn Math.floor( ( width + 4 ) / 5 ) * Math.floor( ( height + 3 ) / 4 ) * 16;\n\t\tcase RGBA_ASTC_5x5_Format:\n\t\t\treturn Math.floor( ( width + 4 ) / 5 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_6x5_Format:\n\t\t\treturn Math.floor( ( width + 5 ) / 6 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_6x6_Format:\n\t\t\treturn Math.floor( ( width + 5 ) / 6 ) * Math.floor( ( height + 5 ) / 6 ) * 16;\n\t\tcase RGBA_ASTC_8x5_Format:\n\t\t\treturn Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_8x6_Format:\n\t\t\treturn Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 5 ) / 6 ) * 16;\n\t\tcase RGBA_ASTC_8x8_Format:\n\t\t\treturn Math.floor( ( width + 7 ) / 8 ) * Math.floor( ( height + 7 ) / 8 ) * 16;\n\t\tcase RGBA_ASTC_10x5_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 4 ) / 5 ) * 16;\n\t\tcase RGBA_ASTC_10x6_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 5 ) / 6 ) * 16;\n\t\tcase RGBA_ASTC_10x8_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 7 ) / 8 ) * 16;\n\t\tcase RGBA_ASTC_10x10_Format:\n\t\t\treturn Math.floor( ( width + 9 ) / 10 ) * Math.floor( ( height + 9 ) / 10 ) * 16;\n\t\tcase RGBA_ASTC_12x10_Format:\n\t\t\treturn Math.floor( ( width + 11 ) / 12 ) * Math.floor( ( height + 9 ) / 10 ) * 16;\n\t\tcase RGBA_ASTC_12x12_Format:\n\t\t\treturn Math.floor( ( width + 11 ) / 12 ) * Math.floor( ( height + 11 ) / 12 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/EXT_texture_compression_bptc/\n\t\tcase RGBA_BPTC_Format:\n\t\tcase RGB_BPTC_SIGNED_Format:\n\t\tcase RGB_BPTC_UNSIGNED_Format:\n\t\t\treturn Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 16;\n\n\t\t// https://registry.khronos.org/webgl/extensions/EXT_texture_compression_rgtc/\n\t\tcase RED_RGTC1_Format:\n\t\tcase SIGNED_RED_RGTC1_Format:\n\t\t\treturn Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 8;\n\t\tcase RED_GREEN_RGTC2_Format:\n\t\tcase SIGNED_RED_GREEN_RGTC2_Format:\n\t\t\treturn Math.ceil( width / 4 ) * Math.ceil( height / 4 ) * 16;\n\n\t}\n\n\tthrow new Error(\n\t\t`Unable to determine texture byte length for ${format} format.`,\n\t);\n\n}\n\nfunction getTextureTypeByteLength( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase UnsignedByteType:\n\t\tcase ByteType:\n\t\t\treturn { byteLength: 1, components: 1 };\n\t\tcase UnsignedShortType:\n\t\tcase ShortType:\n\t\tcase HalfFloatType:\n\t\t\treturn { byteLength: 2, components: 1 };\n\t\tcase UnsignedShort4444Type:\n\t\tcase UnsignedShort5551Type:\n\t\t\treturn { byteLength: 2, components: 4 };\n\t\tcase UnsignedIntType:\n\t\tcase IntType:\n\t\tcase FloatType:\n\t\t\treturn { byteLength: 4, components: 1 };\n\t\tcase UnsignedInt5999Type:\n\t\tcase UnsignedInt101111Type:\n\t\t\treturn { byteLength: 4, components: 3 };\n\n\t}\n\n\tthrow new Error( `Unknown texture type ${type}.` );\n\n}\n\n/**\n * A class containing utility functions for textures.\n *\n * @hideconstructor\n */\nclass TextureUtils {\n\n\t/**\n\t * Scales the texture as large as possible within its surface without cropping\n\t * or stretching the texture. The method preserves the original aspect ratio of\n\t * the texture. Akin to CSS `object-fit: contain`\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {number} aspect - The texture's aspect ratio.\n\t * @return {Texture} The updated texture.\n\t */\n\tstatic contain( texture, aspect ) {\n\n\t\treturn contain( texture, aspect );\n\n\t}\n\n\t/**\n\t * Scales the texture to the smallest possible size to fill the surface, leaving\n\t * no empty space. The method preserves the original aspect ratio of the texture.\n\t * Akin to CSS `object-fit: cover`.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {number} aspect - The texture's aspect ratio.\n\t * @return {Texture} The updated texture.\n\t */\n\tstatic cover( texture, aspect ) {\n\n\t\treturn cover( texture, aspect );\n\n\t}\n\n\t/**\n\t * Configures the texture to the default transformation. Akin to CSS `object-fit: fill`.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @return {Texture} The updated texture.\n\t */\n\tstatic fill( texture ) {\n\n\t\treturn fill( texture );\n\n\t}\n\n\t/**\n\t * Determines how many bytes must be used to represent the texture.\n\t *\n\t * @param {number} width - The width of the texture.\n\t * @param {number} height - The height of the texture.\n\t * @param {number} format - The texture's format.\n\t * @param {number} type - The texture's type.\n\t * @return {number} The byte length.\n\t */\n\tstatic getByteLength( width, height, format, type ) {\n\n\t\treturn getByteLength( width, height, format, type );\n\n\t}\n\n}\n\nif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'register', { detail: {\n\t\trevision: REVISION,\n\t} } ) );\n\n}\n\nif ( typeof window !== 'undefined' ) {\n\n\tif ( window.__THREE__ ) {\n\n\t\twarn( 'WARNING: Multiple instances of Three.js being imported.' );\n\n\t} else {\n\n\t\twindow.__THREE__ = REVISION;\n\n\t}\n\n}\n\nexport { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveAnimationBlendMode, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AnimationAction, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrayCamera, ArrowHelper, AttachedBindMode, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BackSide, BasicDepthPacking, BasicShadowMap, BatchedMesh, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxGeometry, BoxHelper, BufferAttribute, BufferGeometry, BufferGeometryLoader, ByteType, Cache, Camera, CameraHelper, CanvasTexture, CapsuleGeometry, CatmullRomCurve3, CineonToneMapping, CircleGeometry, ClampToEdgeWrapping, Clock, Color, ColorKeyframeTrack, ColorManagement, CompressedArrayTexture, CompressedCubeTexture, CompressedTexture, CompressedTextureLoader, ConeGeometry, ConstantAlphaFactor, ConstantColorFactor, Controls, CubeCamera, CubeDepthTexture, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureLoader, CubeUVReflectionMapping, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceBack, CullFaceFront, CullFaceFrontBack, CullFaceNone, Curve, CurvePath, CustomBlending, CustomToneMapping, CylinderGeometry, Cylindrical, Data3DTexture, DataArrayTexture, DataTexture, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DepthFormat, DepthStencilFormat, DepthTexture, DetachedBindMode, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DodecahedronGeometry, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, EqualCompare, EqualDepth, EqualStencilFunc, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExternalTexture, ExtrudeGeometry, FileLoader, Float16BufferAttribute, Float32BufferAttribute, FloatType, Fog, FogExp2, FramebufferTexture, FrontSide, Frustum, FrustumArray, GLBufferAttribute, GLSL1, GLSL3, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HalfFloatType, HemisphereLight, HemisphereLightHelper, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16BufferAttribute, Int32BufferAttribute, Int8BufferAttribute, IntType, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InterpolationSamplingMode, InterpolationSamplingType, InvertStencilOp, KeepStencilOp, KeyframeTrack, LOD, LatheGeometry, Layers, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LineSegments, LinearFilter, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, Loader, LoaderUtils, LoadingManager, LoopOnce, LoopPingPong, LoopRepeat, MOUSE, Material, MaterialLoader, MathUtils, Matrix2, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoNormalPacking, NoToneMapping, NormalAnimationBlendMode, NormalBlending, NormalGAPacking, NormalRGPacking, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, ObjectSpaceNormalMap, OctahedronGeometry, OneFactor, OneMinusConstantAlphaFactor, OneMinusConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, PCFShadowMap, PCFSoftShadowMap, Path, PerspectiveCamera, Plane, PlaneGeometry, PlaneHelper, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, R11_EAC_Format, RAD2DEG, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RG11_EAC_Format, RGBADepthPacking, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBDepthPacking, RGBFormat, RGBIntegerFormat, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGDepthPacking, RGFormat, RGIntegerFormat, RawShaderMaterial, Ray, Raycaster, RectAreaLight, RedFormat, RedIntegerFormat, ReinhardToneMapping, RenderTarget, RenderTarget3D, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RingGeometry, SIGNED_R11_EAC_Format, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SIGNED_RG11_EAC_Format, SRGBColorSpace, SRGBTransfer, Scene, ShaderMaterial, ShadowMaterial, Shape, ShapeGeometry, ShapePath, ShapeUtils, ShortType, Skeleton, SkeletonHelper, SkinnedMesh, Source, Sphere, SphereGeometry, Spherical, SphericalHarmonics3, SplineCurve, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, SubtractEquation, SubtractiveBlending, TOUCH, TangentSpaceNormalMap, TetrahedronGeometry, Texture, TextureLoader, TextureUtils, Timer, TimestampQuery, TorusGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsGroup, UniformsUtils, UnsignedByteType, UnsignedInt101111Type, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, VectorKeyframeTrack, VideoFrameTexture, VideoTexture, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGLRenderTarget, WebGPUCoordinateSystem, WebXRController, WireframeGeometry, WrapAroundEnding, ZeroCurvatureEnding, ZeroFactor, ZeroSlopeEnding, ZeroStencilOp, arrayNeedsUint32, cloneUniforms, createCanvasElement, createElementNS, error, getByteLength, getConsoleFunction, getUnlitUniformColorSpace, isTypedArray, log, mergeUniforms, probeAsync, setConsoleFunction, warn, warnOnce };\n", "/**\n * @license\n * Copyright 2010-2025 Three.js Authors\n * SPDX-License-Identifier: MIT\n */\nimport { Matrix3, Vector2, Color, mergeUniforms, Vector3, CubeUVReflectionMapping, Mesh, BoxGeometry, ShaderMaterial, BackSide, cloneUniforms, Euler, Matrix4, ColorManagement, SRGBTransfer, PlaneGeometry, FrontSide, getUnlitUniformColorSpace, IntType, warn, HalfFloatType, UnsignedByteType, FloatType, RGBAFormat, Plane, EquirectangularReflectionMapping, EquirectangularRefractionMapping, WebGLCubeRenderTarget, CubeReflectionMapping, CubeRefractionMapping, BufferGeometry, OrthographicCamera, PerspectiveCamera, NoToneMapping, MeshBasicMaterial, error, NoBlending, WebGLRenderTarget, BufferAttribute, LinearSRGBColorSpace, LinearFilter, warnOnce, Uint32BufferAttribute, Uint16BufferAttribute, arrayNeedsUint32, Vector4, DataArrayTexture, Float32BufferAttribute, RawShaderMaterial, CustomToneMapping, NeutralToneMapping, AgXToneMapping, ACESFilmicToneMapping, CineonToneMapping, ReinhardToneMapping, LinearToneMapping, CubeTexture, Data3DTexture, GreaterEqualCompare, LessEqualCompare, DepthTexture, Texture, GLSL3, VSMShadowMap, PCFShadowMap, AddOperation, MixOperation, MultiplyOperation, LinearTransfer, UniformsUtils, DoubleSide, NormalBlending, TangentSpaceNormalMap, ObjectSpaceNormalMap, Layers, RGFormat, Frustum, MeshDepthMaterial, MeshDistanceMaterial, PCFSoftShadowMap, DepthFormat, NearestFilter, CubeDepthTexture, UnsignedIntType, LessEqualDepth, ReverseSubtractEquation, SubtractEquation, AddEquation, OneMinusConstantAlphaFactor, ConstantAlphaFactor, OneMinusConstantColorFactor, ConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, DstAlphaFactor, DstColorFactor, SrcAlphaSaturateFactor, SrcAlphaFactor, SrcColorFactor, OneFactor, ZeroFactor, NotEqualDepth, GreaterDepth, GreaterEqualDepth, EqualDepth, LessDepth, AlwaysDepth, NeverDepth, CullFaceNone, CullFaceBack, CullFaceFront, CustomBlending, MultiplyBlending, SubtractiveBlending, AdditiveBlending, MinEquation, MaxEquation, MirroredRepeatWrapping, ClampToEdgeWrapping, RepeatWrapping, LinearMipmapLinearFilter, LinearMipmapNearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NotEqualCompare, GreaterCompare, EqualCompare, LessCompare, AlwaysCompare, NeverCompare, NoColorSpace, DepthStencilFormat, getByteLength, UnsignedInt248Type, UnsignedShortType, createElementNS, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedInt5999Type, UnsignedInt101111Type, ByteType, ShortType, AlphaFormat, RGBFormat, RedFormat, RedIntegerFormat, RGIntegerFormat, RGBAIntegerFormat, RGB_S3TC_DXT1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGB_PVRTC_4BPPV1_Format, RGB_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_PVRTC_2BPPV1_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGBA_ETC2_EAC_Format, R11_EAC_Format, SIGNED_R11_EAC_Format, RG11_EAC_Format, SIGNED_RG11_EAC_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_BPTC_Format, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RED_RGTC1_Format, SIGNED_RED_RGTC1_Format, RED_GREEN_RGTC2_Format, SIGNED_RED_GREEN_RGTC2_Format, ExternalTexture, EventDispatcher, ArrayCamera, WebXRController, RAD2DEG, DataTexture, createCanvasElement, SRGBColorSpace, REVISION, log, WebGLCoordinateSystem, probeAsync } from './three.core.js';\nexport { AdditiveAnimationBlendMode, AlwaysStencilFunc, AmbientLight, AnimationAction, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrowHelper, AttachedBindMode, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BasicDepthPacking, BasicShadowMap, BatchedMesh, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxHelper, BufferGeometryLoader, Cache, Camera, CameraHelper, CanvasTexture, CapsuleGeometry, CatmullRomCurve3, CircleGeometry, Clock, ColorKeyframeTrack, CompressedArrayTexture, CompressedCubeTexture, CompressedTexture, CompressedTextureLoader, ConeGeometry, Controls, CubeCamera, CubeTextureLoader, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceFrontBack, Curve, CurvePath, CylinderGeometry, Cylindrical, DataTextureLoader, DataUtils, DecrementStencilOp, DecrementWrapStencilOp, DefaultLoadingManager, DetachedBindMode, DirectionalLight, DirectionalLightHelper, DiscreteInterpolant, DodecahedronGeometry, DynamicCopyUsage, DynamicDrawUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, EqualStencilFunc, ExtrudeGeometry, FileLoader, Float16BufferAttribute, Fog, FogExp2, FramebufferTexture, FrustumArray, GLBufferAttribute, GLSL1, GreaterEqualStencilFunc, GreaterStencilFunc, GridHelper, Group, HemisphereLight, HemisphereLightHelper, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, IncrementStencilOp, IncrementWrapStencilOp, InstancedBufferAttribute, InstancedBufferGeometry, InstancedInterleavedBuffer, InstancedMesh, Int16BufferAttribute, Int32BufferAttribute, Int8BufferAttribute, InterleavedBuffer, InterleavedBufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InterpolationSamplingMode, InterpolationSamplingType, InvertStencilOp, KeepStencilOp, KeyframeTrack, LOD, LatheGeometry, LessEqualStencilFunc, LessStencilFunc, Light, LightProbe, Line, Line3, LineBasicMaterial, LineCurve, LineCurve3, LineDashedMaterial, LineLoop, LineSegments, LinearInterpolant, LinearMipMapLinearFilter, LinearMipMapNearestFilter, Loader, LoaderUtils, LoadingManager, LoopOnce, LoopPingPong, LoopRepeat, MOUSE, Material, MaterialLoader, MathUtils, Matrix2, MeshLambertMaterial, MeshMatcapMaterial, MeshNormalMaterial, MeshPhongMaterial, MeshPhysicalMaterial, MeshStandardMaterial, MeshToonMaterial, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NeverStencilFunc, NoNormalPacking, NormalAnimationBlendMode, NormalGAPacking, NormalRGPacking, NotEqualStencilFunc, NumberKeyframeTrack, Object3D, ObjectLoader, OctahedronGeometry, Path, PlaneHelper, PointLight, PointLightHelper, Points, PointsMaterial, PolarGridHelper, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, Quaternion, QuaternionKeyframeTrack, QuaternionLinearInterpolant, RGBADepthPacking, RGBDepthPacking, RGBIntegerFormat, RGDepthPacking, Ray, Raycaster, RectAreaLight, RenderTarget, RenderTarget3D, ReplaceStencilOp, RingGeometry, Scene, ShadowMaterial, Shape, ShapeGeometry, ShapePath, ShapeUtils, Skeleton, SkeletonHelper, SkinnedMesh, Source, Sphere, SphereGeometry, Spherical, SphericalHarmonics3, SplineCurve, SpotLight, SpotLightHelper, Sprite, SpriteMaterial, StaticCopyUsage, StaticDrawUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, TOUCH, TetrahedronGeometry, TextureLoader, TextureUtils, Timer, TimestampQuery, TorusGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry, UVMapping, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsGroup, VectorKeyframeTrack, VideoFrameTexture, VideoTexture, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGPUCoordinateSystem, WireframeGeometry, WrapAroundEnding, ZeroCurvatureEnding, ZeroSlopeEnding, ZeroStencilOp, getConsoleFunction, setConsoleFunction } from './three.core.js';\n\nfunction WebGLAnimation() {\n\n\tlet context = null;\n\tlet isAnimating = false;\n\tlet animationLoop = null;\n\tlet requestId = null;\n\n\tfunction onAnimationFrame( time, frame ) {\n\n\t\tanimationLoop( time, frame );\n\n\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t}\n\n\treturn {\n\n\t\tstart: function () {\n\n\t\t\tif ( isAnimating === true ) return;\n\t\t\tif ( animationLoop === null ) return;\n\n\t\t\trequestId = context.requestAnimationFrame( onAnimationFrame );\n\n\t\t\tisAnimating = true;\n\n\t\t},\n\n\t\tstop: function () {\n\n\t\t\tcontext.cancelAnimationFrame( requestId );\n\n\t\t\tisAnimating = false;\n\n\t\t},\n\n\t\tsetAnimationLoop: function ( callback ) {\n\n\t\t\tanimationLoop = callback;\n\n\t\t},\n\n\t\tsetContext: function ( value ) {\n\n\t\t\tcontext = value;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLAttributes( gl ) {\n\n\tconst buffers = new WeakMap();\n\n\tfunction createBuffer( attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst usage = attribute.usage;\n\t\tconst size = array.byteLength;\n\n\t\tconst buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\t\tgl.bufferData( bufferType, array, usage );\n\n\t\tattribute.onUploadCallback();\n\n\t\tlet type;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\ttype = gl.FLOAT;\n\n\t\t} else if ( typeof Float16Array !== 'undefined' && array instanceof Float16Array ) {\n\n\t\t\ttype = gl.HALF_FLOAT;\n\n\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\tif ( attribute.isFloat16BufferAttribute ) {\n\n\t\t\t\ttype = gl.HALF_FLOAT;\n\n\t\t\t} else {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\n\t\t\t}\n\n\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\ttype = gl.SHORT;\n\n\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\ttype = gl.UNSIGNED_INT;\n\n\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\ttype = gl.INT;\n\n\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\ttype = gl.BYTE;\n\n\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t} else if ( array instanceof Uint8ClampedArray ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.WebGLAttributes: Unsupported buffer data format: ' + array );\n\n\t\t}\n\n\t\treturn {\n\t\t\tbuffer: buffer,\n\t\t\ttype: type,\n\t\t\tbytesPerElement: array.BYTES_PER_ELEMENT,\n\t\t\tversion: attribute.version,\n\t\t\tsize: size\n\t\t};\n\n\t}\n\n\tfunction updateBuffer( buffer, attribute, bufferType ) {\n\n\t\tconst array = attribute.array;\n\t\tconst updateRanges = attribute.updateRanges;\n\n\t\tgl.bindBuffer( bufferType, buffer );\n\n\t\tif ( updateRanges.length === 0 ) {\n\n\t\t\t// Not using update ranges\n\t\t\tgl.bufferSubData( bufferType, 0, array );\n\n\t\t} else {\n\n\t\t\t// Before applying update ranges, we merge any adjacent / overlapping\n\t\t\t// ranges to reduce load on `gl.bufferSubData`. Empirically, this has led\n\t\t\t// to performance improvements for applications which make heavy use of\n\t\t\t// update ranges. Likely due to GPU command overhead.\n\t\t\t//\n\t\t\t// Note that to reduce garbage collection between frames, we merge the\n\t\t\t// update ranges in-place. This is safe because this method will clear the\n\t\t\t// update ranges once updated.\n\n\t\t\tupdateRanges.sort( ( a, b ) => a.start - b.start );\n\n\t\t\t// To merge the update ranges in-place, we work from left to right in the\n\t\t\t// existing updateRanges array, merging ranges. This may result in a final\n\t\t\t// array which is smaller than the original. This index tracks the last\n\t\t\t// index representing a merged range, any data after this index can be\n\t\t\t// trimmed once the merge algorithm is completed.\n\t\t\tlet mergeIndex = 0;\n\n\t\t\tfor ( let i = 1; i < updateRanges.length; i ++ ) {\n\n\t\t\t\tconst previousRange = updateRanges[ mergeIndex ];\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\t// We add one here to merge adjacent ranges. This is safe because ranges\n\t\t\t\t// operate over positive integers.\n\t\t\t\tif ( range.start <= previousRange.start + previousRange.count + 1 ) {\n\n\t\t\t\t\tpreviousRange.count = Math.max(\n\t\t\t\t\t\tpreviousRange.count,\n\t\t\t\t\t\trange.start + range.count - previousRange.start\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\t++ mergeIndex;\n\t\t\t\t\tupdateRanges[ mergeIndex ] = range;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Trim the array to only contain the merged ranges.\n\t\t\tupdateRanges.length = mergeIndex + 1;\n\n\t\t\tfor ( let i = 0, l = updateRanges.length; i < l; i ++ ) {\n\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\tgl.bufferSubData( bufferType, range.start * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray, range.start, range.count );\n\n\t\t\t}\n\n\t\t\tattribute.clearUpdateRanges();\n\n\t\t}\n\n\t\tattribute.onUploadCallback();\n\n\t}\n\n\t//\n\n\tfunction get( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\treturn buffers.get( attribute );\n\n\t}\n\n\tfunction remove( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data ) {\n\n\t\t\tgl.deleteBuffer( data.buffer );\n\n\t\t\tbuffers.delete( attribute );\n\n\t\t}\n\n\t}\n\n\tfunction update( attribute, bufferType ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\tif ( attribute.isGLBufferAttribute ) {\n\n\t\t\tconst cached = buffers.get( attribute );\n\n\t\t\tif ( ! cached || cached.version < attribute.version ) {\n\n\t\t\t\tbuffers.set( attribute, {\n\t\t\t\t\tbuffer: attribute.buffer,\n\t\t\t\t\ttype: attribute.type,\n\t\t\t\t\tbytesPerElement: attribute.elementSize,\n\t\t\t\t\tversion: attribute.version\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst data = buffers.get( attribute );\n\n\t\tif ( data === undefined ) {\n\n\t\t\tbuffers.set( attribute, createBuffer( attribute, bufferType ) );\n\n\t\t} else if ( data.version < attribute.version ) {\n\n\t\t\tif ( data.size !== attribute.array.byteLength ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLAttributes: The size of the buffer attribute\\'s array buffer does not match the original size. Resizing buffer attributes is not supported.' );\n\n\t\t\t}\n\n\t\t\tupdateBuffer( data.buffer, attribute, bufferType );\n\n\t\t\tdata.version = attribute.version;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update\n\n\t};\n\n}\n\nvar alphahash_fragment = \"#ifdef USE_ALPHAHASH\\n\\tif ( diffuseColor.a < getAlphaHashThreshold( vPosition ) ) discard;\\n#endif\";\n\nvar alphahash_pars_fragment = \"#ifdef USE_ALPHAHASH\\n\\tconst float ALPHA_HASH_SCALE = 0.05;\\n\\tfloat hash2D( vec2 value ) {\\n\\t\\treturn fract( 1.0e4 * sin( 17.0 * value.x + 0.1 * value.y ) * ( 0.1 + abs( sin( 13.0 * value.y + value.x ) ) ) );\\n\\t}\\n\\tfloat hash3D( vec3 value ) {\\n\\t\\treturn hash2D( vec2( hash2D( value.xy ), value.z ) );\\n\\t}\\n\\tfloat getAlphaHashThreshold( vec3 position ) {\\n\\t\\tfloat maxDeriv = max(\\n\\t\\t\\tlength( dFdx( position.xyz ) ),\\n\\t\\t\\tlength( dFdy( position.xyz ) )\\n\\t\\t);\\n\\t\\tfloat pixScale = 1.0 / ( ALPHA_HASH_SCALE * maxDeriv );\\n\\t\\tvec2 pixScales = vec2(\\n\\t\\t\\texp2( floor( log2( pixScale ) ) ),\\n\\t\\t\\texp2( ceil( log2( pixScale ) ) )\\n\\t\\t);\\n\\t\\tvec2 alpha = vec2(\\n\\t\\t\\thash3D( floor( pixScales.x * position.xyz ) ),\\n\\t\\t\\thash3D( floor( pixScales.y * position.xyz ) )\\n\\t\\t);\\n\\t\\tfloat lerpFactor = fract( log2( pixScale ) );\\n\\t\\tfloat x = ( 1.0 - lerpFactor ) * alpha.x + lerpFactor * alpha.y;\\n\\t\\tfloat a = min( lerpFactor, 1.0 - lerpFactor );\\n\\t\\tvec3 cases = vec3(\\n\\t\\t\\tx * x / ( 2.0 * a * ( 1.0 - a ) ),\\n\\t\\t\\t( x - 0.5 * a ) / ( 1.0 - a ),\\n\\t\\t\\t1.0 - ( ( 1.0 - x ) * ( 1.0 - x ) / ( 2.0 * a * ( 1.0 - a ) ) )\\n\\t\\t);\\n\\t\\tfloat threshold = ( x < ( 1.0 - a ) )\\n\\t\\t\\t? ( ( x < a ) ? cases.x : cases.y )\\n\\t\\t\\t: cases.z;\\n\\t\\treturn clamp( threshold , 1.0e-6, 1.0 );\\n\\t}\\n#endif\";\n\nvar alphamap_fragment = \"#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, vAlphaMapUv ).g;\\n#endif\";\n\nvar alphamap_pars_fragment = \"#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar alphatest_fragment = \"#ifdef USE_ALPHATEST\\n\\t#ifdef ALPHA_TO_COVERAGE\\n\\tdiffuseColor.a = smoothstep( alphaTest, alphaTest + fwidth( diffuseColor.a ), diffuseColor.a );\\n\\tif ( diffuseColor.a == 0.0 ) discard;\\n\\t#else\\n\\tif ( diffuseColor.a < alphaTest ) discard;\\n\\t#endif\\n#endif\";\n\nvar alphatest_pars_fragment = \"#ifdef USE_ALPHATEST\\n\\tuniform float alphaTest;\\n#endif\";\n\nvar aomap_fragment = \"#ifdef USE_AOMAP\\n\\tfloat ambientOcclusion = ( texture2D( aoMap, vAoMapUv ).r - 1.0 ) * aoMapIntensity + 1.0;\\n\\treflectedLight.indirectDiffuse *= ambientOcclusion;\\n\\t#if defined( USE_CLEARCOAT ) \\n\\t\\tclearcoatSpecularIndirect *= ambientOcclusion;\\n\\t#endif\\n\\t#if defined( USE_SHEEN ) \\n\\t\\tsheenSpecularIndirect *= ambientOcclusion;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD )\\n\\t\\tfloat dotNV = saturate( dot( geometryNormal, geometryViewDir ) );\\n\\t\\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\\n\\t#endif\\n#endif\";\n\nvar aomap_pars_fragment = \"#ifdef USE_AOMAP\\n\\tuniform sampler2D aoMap;\\n\\tuniform float aoMapIntensity;\\n#endif\";\n\nvar batching_pars_vertex = \"#ifdef USE_BATCHING\\n\\t#if ! defined( GL_ANGLE_multi_draw )\\n\\t#define gl_DrawID _gl_DrawID\\n\\tuniform int _gl_DrawID;\\n\\t#endif\\n\\tuniform highp sampler2D batchingTexture;\\n\\tuniform highp usampler2D batchingIdTexture;\\n\\tmat4 getBatchingMatrix( const in float i ) {\\n\\t\\tint size = textureSize( batchingTexture, 0 ).x;\\n\\t\\tint j = int( i ) * 4;\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\tvec4 v1 = texelFetch( batchingTexture, ivec2( x, y ), 0 );\\n\\t\\tvec4 v2 = texelFetch( batchingTexture, ivec2( x + 1, y ), 0 );\\n\\t\\tvec4 v3 = texelFetch( batchingTexture, ivec2( x + 2, y ), 0 );\\n\\t\\tvec4 v4 = texelFetch( batchingTexture, ivec2( x + 3, y ), 0 );\\n\\t\\treturn mat4( v1, v2, v3, v4 );\\n\\t}\\n\\tfloat getIndirectIndex( const in int i ) {\\n\\t\\tint size = textureSize( batchingIdTexture, 0 ).x;\\n\\t\\tint x = i % size;\\n\\t\\tint y = i / size;\\n\\t\\treturn float( texelFetch( batchingIdTexture, ivec2( x, y ), 0 ).r );\\n\\t}\\n#endif\\n#ifdef USE_BATCHING_COLOR\\n\\tuniform sampler2D batchingColorTexture;\\n\\tvec3 getBatchingColor( const in float i ) {\\n\\t\\tint size = textureSize( batchingColorTexture, 0 ).x;\\n\\t\\tint j = int( i );\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\treturn texelFetch( batchingColorTexture, ivec2( x, y ), 0 ).rgb;\\n\\t}\\n#endif\";\n\nvar batching_vertex = \"#ifdef USE_BATCHING\\n\\tmat4 batchingMatrix = getBatchingMatrix( getIndirectIndex( gl_DrawID ) );\\n#endif\";\n\nvar begin_vertex = \"vec3 transformed = vec3( position );\\n#ifdef USE_ALPHAHASH\\n\\tvPosition = vec3( position );\\n#endif\";\n\nvar beginnormal_vertex = \"vec3 objectNormal = vec3( normal );\\n#ifdef USE_TANGENT\\n\\tvec3 objectTangent = vec3( tangent.xyz );\\n#endif\";\n\nvar bsdfs = \"float G_BlinnPhong_Implicit( ) {\\n\\treturn 0.25;\\n}\\nfloat D_BlinnPhong( const in float shininess, const in float dotNH ) {\\n\\treturn RECIPROCAL_PI * ( shininess * 0.5 + 1.0 ) * pow( dotNH, shininess );\\n}\\nvec3 BRDF_BlinnPhong( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in vec3 specularColor, const in float shininess ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( specularColor, 1.0, dotVH );\\n\\tfloat G = G_BlinnPhong_Implicit( );\\n\\tfloat D = D_BlinnPhong( shininess, dotNH );\\n\\treturn F * ( G * D );\\n} // validated\";\n\nvar iridescence_fragment = \"#ifdef USE_IRIDESCENCE\\n\\tconst mat3 XYZ_TO_REC709 = mat3(\\n\\t\\t 3.2404542, -0.9692660,  0.0556434,\\n\\t\\t-1.5371385,  1.8760108, -0.2040259,\\n\\t\\t-0.4985314,  0.0415560,  1.0572252\\n\\t);\\n\\tvec3 Fresnel0ToIor( vec3 fresnel0 ) {\\n\\t\\tvec3 sqrtF0 = sqrt( fresnel0 );\\n\\t\\treturn ( vec3( 1.0 ) + sqrtF0 ) / ( vec3( 1.0 ) - sqrtF0 );\\n\\t}\\n\\tvec3 IorToFresnel0( vec3 transmittedIor, float incidentIor ) {\\n\\t\\treturn pow2( ( transmittedIor - vec3( incidentIor ) ) / ( transmittedIor + vec3( incidentIor ) ) );\\n\\t}\\n\\tfloat IorToFresnel0( float transmittedIor, float incidentIor ) {\\n\\t\\treturn pow2( ( transmittedIor - incidentIor ) / ( transmittedIor + incidentIor ));\\n\\t}\\n\\tvec3 evalSensitivity( float OPD, vec3 shift ) {\\n\\t\\tfloat phase = 2.0 * PI * OPD * 1.0e-9;\\n\\t\\tvec3 val = vec3( 5.4856e-13, 4.4201e-13, 5.2481e-13 );\\n\\t\\tvec3 pos = vec3( 1.6810e+06, 1.7953e+06, 2.2084e+06 );\\n\\t\\tvec3 var = vec3( 4.3278e+09, 9.3046e+09, 6.6121e+09 );\\n\\t\\tvec3 xyz = val * sqrt( 2.0 * PI * var ) * cos( pos * phase + shift ) * exp( - pow2( phase ) * var );\\n\\t\\txyz.x += 9.7470e-14 * sqrt( 2.0 * PI * 4.5282e+09 ) * cos( 2.2399e+06 * phase + shift[ 0 ] ) * exp( - 4.5282e+09 * pow2( phase ) );\\n\\t\\txyz /= 1.0685e-7;\\n\\t\\tvec3 rgb = XYZ_TO_REC709 * xyz;\\n\\t\\treturn rgb;\\n\\t}\\n\\tvec3 evalIridescence( float outsideIOR, float eta2, float cosTheta1, float thinFilmThickness, vec3 baseF0 ) {\\n\\t\\tvec3 I;\\n\\t\\tfloat iridescenceIOR = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, thinFilmThickness ) );\\n\\t\\tfloat sinTheta2Sq = pow2( outsideIOR / iridescenceIOR ) * ( 1.0 - pow2( cosTheta1 ) );\\n\\t\\tfloat cosTheta2Sq = 1.0 - sinTheta2Sq;\\n\\t\\tif ( cosTheta2Sq < 0.0 ) {\\n\\t\\t\\treturn vec3( 1.0 );\\n\\t\\t}\\n\\t\\tfloat cosTheta2 = sqrt( cosTheta2Sq );\\n\\t\\tfloat R0 = IorToFresnel0( iridescenceIOR, outsideIOR );\\n\\t\\tfloat R12 = F_Schlick( R0, 1.0, cosTheta1 );\\n\\t\\tfloat T121 = 1.0 - R12;\\n\\t\\tfloat phi12 = 0.0;\\n\\t\\tif ( iridescenceIOR < outsideIOR ) phi12 = PI;\\n\\t\\tfloat phi21 = PI - phi12;\\n\\t\\tvec3 baseIOR = Fresnel0ToIor( clamp( baseF0, 0.0, 0.9999 ) );\\t\\tvec3 R1 = IorToFresnel0( baseIOR, iridescenceIOR );\\n\\t\\tvec3 R23 = F_Schlick( R1, 1.0, cosTheta2 );\\n\\t\\tvec3 phi23 = vec3( 0.0 );\\n\\t\\tif ( baseIOR[ 0 ] < iridescenceIOR ) phi23[ 0 ] = PI;\\n\\t\\tif ( baseIOR[ 1 ] < iridescenceIOR ) phi23[ 1 ] = PI;\\n\\t\\tif ( baseIOR[ 2 ] < iridescenceIOR ) phi23[ 2 ] = PI;\\n\\t\\tfloat OPD = 2.0 * iridescenceIOR * thinFilmThickness * cosTheta2;\\n\\t\\tvec3 phi = vec3( phi21 ) + phi23;\\n\\t\\tvec3 R123 = clamp( R12 * R23, 1e-5, 0.9999 );\\n\\t\\tvec3 r123 = sqrt( R123 );\\n\\t\\tvec3 Rs = pow2( T121 ) * R23 / ( vec3( 1.0 ) - R123 );\\n\\t\\tvec3 C0 = R12 + Rs;\\n\\t\\tI = C0;\\n\\t\\tvec3 Cm = Rs - T121;\\n\\t\\tfor ( int m = 1; m <= 2; ++ m ) {\\n\\t\\t\\tCm *= r123;\\n\\t\\t\\tvec3 Sm = 2.0 * evalSensitivity( float( m ) * OPD, float( m ) * phi );\\n\\t\\t\\tI += Cm * Sm;\\n\\t\\t}\\n\\t\\treturn max( I, vec3( 0.0 ) );\\n\\t}\\n#endif\";\n\nvar bumpmap_pars_fragment = \"#ifdef USE_BUMPMAP\\n\\tuniform sampler2D bumpMap;\\n\\tuniform float bumpScale;\\n\\tvec2 dHdxy_fwd() {\\n\\t\\tvec2 dSTdx = dFdx( vBumpMapUv );\\n\\t\\tvec2 dSTdy = dFdy( vBumpMapUv );\\n\\t\\tfloat Hll = bumpScale * texture2D( bumpMap, vBumpMapUv ).x;\\n\\t\\tfloat dBx = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdx ).x - Hll;\\n\\t\\tfloat dBy = bumpScale * texture2D( bumpMap, vBumpMapUv + dSTdy ).x - Hll;\\n\\t\\treturn vec2( dBx, dBy );\\n\\t}\\n\\tvec3 perturbNormalArb( vec3 surf_pos, vec3 surf_norm, vec2 dHdxy, float faceDirection ) {\\n\\t\\tvec3 vSigmaX = normalize( dFdx( surf_pos.xyz ) );\\n\\t\\tvec3 vSigmaY = normalize( dFdy( surf_pos.xyz ) );\\n\\t\\tvec3 vN = surf_norm;\\n\\t\\tvec3 R1 = cross( vSigmaY, vN );\\n\\t\\tvec3 R2 = cross( vN, vSigmaX );\\n\\t\\tfloat fDet = dot( vSigmaX, R1 ) * faceDirection;\\n\\t\\tvec3 vGrad = sign( fDet ) * ( dHdxy.x * R1 + dHdxy.y * R2 );\\n\\t\\treturn normalize( abs( fDet ) * surf_norm - vGrad );\\n\\t}\\n#endif\";\n\nvar clipping_planes_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvec4 plane;\\n\\t#ifdef ALPHA_TO_COVERAGE\\n\\t\\tfloat distanceToPlane, distanceGradient;\\n\\t\\tfloat clipOpacity = 1.0;\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\\n\\t\\t\\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\\n\\t\\t\\tclipOpacity *= smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\\n\\t\\t\\tif ( clipOpacity == 0.0 ) discard;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\t\\tfloat unionClipOpacity = 1.0;\\n\\t\\t\\t#pragma unroll_loop_start\\n\\t\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\t\\tdistanceToPlane = - dot( vClipPosition, plane.xyz ) + plane.w;\\n\\t\\t\\t\\tdistanceGradient = fwidth( distanceToPlane ) / 2.0;\\n\\t\\t\\t\\tunionClipOpacity *= 1.0 - smoothstep( - distanceGradient, distanceGradient, distanceToPlane );\\n\\t\\t\\t}\\n\\t\\t\\t#pragma unroll_loop_end\\n\\t\\t\\tclipOpacity *= 1.0 - unionClipOpacity;\\n\\t\\t#endif\\n\\t\\tdiffuseColor.a *= clipOpacity;\\n\\t\\tif ( diffuseColor.a == 0.0 ) discard;\\n\\t#else\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < UNION_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\tif ( dot( vClipPosition, plane.xyz ) > plane.w ) discard;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t\\t#if UNION_CLIPPING_PLANES < NUM_CLIPPING_PLANES\\n\\t\\t\\tbool clipped = true;\\n\\t\\t\\t#pragma unroll_loop_start\\n\\t\\t\\tfor ( int i = UNION_CLIPPING_PLANES; i < NUM_CLIPPING_PLANES; i ++ ) {\\n\\t\\t\\t\\tplane = clippingPlanes[ i ];\\n\\t\\t\\t\\tclipped = ( dot( vClipPosition, plane.xyz ) > plane.w ) && clipped;\\n\\t\\t\\t}\\n\\t\\t\\t#pragma unroll_loop_end\\n\\t\\t\\tif ( clipped ) discard;\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar clipping_planes_pars_fragment = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n\\tuniform vec4 clippingPlanes[ NUM_CLIPPING_PLANES ];\\n#endif\";\n\nvar clipping_planes_pars_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvarying vec3 vClipPosition;\\n#endif\";\n\nvar clipping_planes_vertex = \"#if NUM_CLIPPING_PLANES > 0\\n\\tvClipPosition = - mvPosition.xyz;\\n#endif\";\n\nvar color_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tdiffuseColor *= vColor;\\n#elif defined( USE_COLOR )\\n\\tdiffuseColor.rgb *= vColor;\\n#endif\";\n\nvar color_pars_fragment = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_pars_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvarying vec4 vColor;\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\\n\\tvarying vec3 vColor;\\n#endif\";\n\nvar color_vertex = \"#if defined( USE_COLOR_ALPHA )\\n\\tvColor = vec4( 1.0 );\\n#elif defined( USE_COLOR ) || defined( USE_INSTANCING_COLOR ) || defined( USE_BATCHING_COLOR )\\n\\tvColor = vec3( 1.0 );\\n#endif\\n#ifdef USE_COLOR\\n\\tvColor *= color;\\n#endif\\n#ifdef USE_INSTANCING_COLOR\\n\\tvColor.xyz *= instanceColor.xyz;\\n#endif\\n#ifdef USE_BATCHING_COLOR\\n\\tvec3 batchingColor = getBatchingColor( getIndirectIndex( gl_DrawID ) );\\n\\tvColor.xyz *= batchingColor.xyz;\\n#endif\";\n\nvar common = \"#define PI 3.141592653589793\\n#define PI2 6.283185307179586\\n#define PI_HALF 1.5707963267948966\\n#define RECIPROCAL_PI 0.3183098861837907\\n#define RECIPROCAL_PI2 0.15915494309189535\\n#define EPSILON 1e-6\\n#ifndef saturate\\n#define saturate( a ) clamp( a, 0.0, 1.0 )\\n#endif\\n#define whiteComplement( a ) ( 1.0 - saturate( a ) )\\nfloat pow2( const in float x ) { return x*x; }\\nvec3 pow2( const in vec3 x ) { return x*x; }\\nfloat pow3( const in float x ) { return x*x*x; }\\nfloat pow4( const in float x ) { float x2 = x*x; return x2*x2; }\\nfloat max3( const in vec3 v ) { return max( max( v.x, v.y ), v.z ); }\\nfloat average( const in vec3 v ) { return dot( v, vec3( 0.3333333 ) ); }\\nhighp float rand( const in vec2 uv ) {\\n\\tconst highp float a = 12.9898, b = 78.233, c = 43758.5453;\\n\\thighp float dt = dot( uv.xy, vec2( a,b ) ), sn = mod( dt, PI );\\n\\treturn fract( sin( sn ) * c );\\n}\\n#ifdef HIGH_PRECISION\\n\\tfloat precisionSafeLength( vec3 v ) { return length( v ); }\\n#else\\n\\tfloat precisionSafeLength( vec3 v ) {\\n\\t\\tfloat maxComponent = max3( abs( v ) );\\n\\t\\treturn length( v / maxComponent ) * maxComponent;\\n\\t}\\n#endif\\nstruct IncidentLight {\\n\\tvec3 color;\\n\\tvec3 direction;\\n\\tbool visible;\\n};\\nstruct ReflectedLight {\\n\\tvec3 directDiffuse;\\n\\tvec3 directSpecular;\\n\\tvec3 indirectDiffuse;\\n\\tvec3 indirectSpecular;\\n};\\n#ifdef USE_ALPHAHASH\\n\\tvarying vec3 vPosition;\\n#endif\\nvec3 transformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( matrix * vec4( dir, 0.0 ) ).xyz );\\n}\\nvec3 inverseTransformDirection( in vec3 dir, in mat4 matrix ) {\\n\\treturn normalize( ( vec4( dir, 0.0 ) * matrix ).xyz );\\n}\\nbool isPerspectiveMatrix( mat4 m ) {\\n\\treturn m[ 2 ][ 3 ] == - 1.0;\\n}\\nvec2 equirectUv( in vec3 dir ) {\\n\\tfloat u = atan( dir.z, dir.x ) * RECIPROCAL_PI2 + 0.5;\\n\\tfloat v = asin( clamp( dir.y, - 1.0, 1.0 ) ) * RECIPROCAL_PI + 0.5;\\n\\treturn vec2( u, v );\\n}\\nvec3 BRDF_Lambert( const in vec3 diffuseColor ) {\\n\\treturn RECIPROCAL_PI * diffuseColor;\\n}\\nvec3 F_Schlick( const in vec3 f0, const in float f90, const in float dotVH ) {\\n\\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\\n\\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\\n}\\nfloat F_Schlick( const in float f0, const in float f90, const in float dotVH ) {\\n\\tfloat fresnel = exp2( ( - 5.55473 * dotVH - 6.98316 ) * dotVH );\\n\\treturn f0 * ( 1.0 - fresnel ) + ( f90 * fresnel );\\n} // validated\";\n\nvar cube_uv_reflection_fragment = \"#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t#define cubeUV_minMipLevel 4.0\\n\\t#define cubeUV_minTileSize 16.0\\n\\tfloat getFace( vec3 direction ) {\\n\\t\\tvec3 absDirection = abs( direction );\\n\\t\\tfloat face = - 1.0;\\n\\t\\tif ( absDirection.x > absDirection.z ) {\\n\\t\\t\\tif ( absDirection.x > absDirection.y )\\n\\t\\t\\t\\tface = direction.x > 0.0 ? 0.0 : 3.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t} else {\\n\\t\\t\\tif ( absDirection.z > absDirection.y )\\n\\t\\t\\t\\tface = direction.z > 0.0 ? 2.0 : 5.0;\\n\\t\\t\\telse\\n\\t\\t\\t\\tface = direction.y > 0.0 ? 1.0 : 4.0;\\n\\t\\t}\\n\\t\\treturn face;\\n\\t}\\n\\tvec2 getUV( vec3 direction, float face ) {\\n\\t\\tvec2 uv;\\n\\t\\tif ( face == 0.0 ) {\\n\\t\\t\\tuv = vec2( direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 1.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, - direction.z ) / abs( direction.y );\\n\\t\\t} else if ( face == 2.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.y ) / abs( direction.z );\\n\\t\\t} else if ( face == 3.0 ) {\\n\\t\\t\\tuv = vec2( - direction.z, direction.y ) / abs( direction.x );\\n\\t\\t} else if ( face == 4.0 ) {\\n\\t\\t\\tuv = vec2( - direction.x, direction.z ) / abs( direction.y );\\n\\t\\t} else {\\n\\t\\t\\tuv = vec2( direction.x, direction.y ) / abs( direction.z );\\n\\t\\t}\\n\\t\\treturn 0.5 * ( uv + 1.0 );\\n\\t}\\n\\tvec3 bilinearCubeUV( sampler2D envMap, vec3 direction, float mipInt ) {\\n\\t\\tfloat face = getFace( direction );\\n\\t\\tfloat filterInt = max( cubeUV_minMipLevel - mipInt, 0.0 );\\n\\t\\tmipInt = max( mipInt, cubeUV_minMipLevel );\\n\\t\\tfloat faceSize = exp2( mipInt );\\n\\t\\thighp vec2 uv = getUV( direction, face ) * ( faceSize - 2.0 ) + 1.0;\\n\\t\\tif ( face > 2.0 ) {\\n\\t\\t\\tuv.y += faceSize;\\n\\t\\t\\tface -= 3.0;\\n\\t\\t}\\n\\t\\tuv.x += face * faceSize;\\n\\t\\tuv.x += filterInt * 3.0 * cubeUV_minTileSize;\\n\\t\\tuv.y += 4.0 * ( exp2( CUBEUV_MAX_MIP ) - faceSize );\\n\\t\\tuv.x *= CUBEUV_TEXEL_WIDTH;\\n\\t\\tuv.y *= CUBEUV_TEXEL_HEIGHT;\\n\\t\\t#ifdef texture2DGradEXT\\n\\t\\t\\treturn texture2DGradEXT( envMap, uv, vec2( 0.0 ), vec2( 0.0 ) ).rgb;\\n\\t\\t#else\\n\\t\\t\\treturn texture2D( envMap, uv ).rgb;\\n\\t\\t#endif\\n\\t}\\n\\t#define cubeUV_r0 1.0\\n\\t#define cubeUV_m0 - 2.0\\n\\t#define cubeUV_r1 0.8\\n\\t#define cubeUV_m1 - 1.0\\n\\t#define cubeUV_r4 0.4\\n\\t#define cubeUV_m4 2.0\\n\\t#define cubeUV_r5 0.305\\n\\t#define cubeUV_m5 3.0\\n\\t#define cubeUV_r6 0.21\\n\\t#define cubeUV_m6 4.0\\n\\tfloat roughnessToMip( float roughness ) {\\n\\t\\tfloat mip = 0.0;\\n\\t\\tif ( roughness >= cubeUV_r1 ) {\\n\\t\\t\\tmip = ( cubeUV_r0 - roughness ) * ( cubeUV_m1 - cubeUV_m0 ) / ( cubeUV_r0 - cubeUV_r1 ) + cubeUV_m0;\\n\\t\\t} else if ( roughness >= cubeUV_r4 ) {\\n\\t\\t\\tmip = ( cubeUV_r1 - roughness ) * ( cubeUV_m4 - cubeUV_m1 ) / ( cubeUV_r1 - cubeUV_r4 ) + cubeUV_m1;\\n\\t\\t} else if ( roughness >= cubeUV_r5 ) {\\n\\t\\t\\tmip = ( cubeUV_r4 - roughness ) * ( cubeUV_m5 - cubeUV_m4 ) / ( cubeUV_r4 - cubeUV_r5 ) + cubeUV_m4;\\n\\t\\t} else if ( roughness >= cubeUV_r6 ) {\\n\\t\\t\\tmip = ( cubeUV_r5 - roughness ) * ( cubeUV_m6 - cubeUV_m5 ) / ( cubeUV_r5 - cubeUV_r6 ) + cubeUV_m5;\\n\\t\\t} else {\\n\\t\\t\\tmip = - 2.0 * log2( 1.16 * roughness );\\t\\t}\\n\\t\\treturn mip;\\n\\t}\\n\\tvec4 textureCubeUV( sampler2D envMap, vec3 sampleDir, float roughness ) {\\n\\t\\tfloat mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\\n\\t\\tfloat mipF = fract( mip );\\n\\t\\tfloat mipInt = floor( mip );\\n\\t\\tvec3 color0 = bilinearCubeUV( envMap, sampleDir, mipInt );\\n\\t\\tif ( mipF == 0.0 ) {\\n\\t\\t\\treturn vec4( color0, 1.0 );\\n\\t\\t} else {\\n\\t\\t\\tvec3 color1 = bilinearCubeUV( envMap, sampleDir, mipInt + 1.0 );\\n\\t\\t\\treturn vec4( mix( color0, color1, mipF ), 1.0 );\\n\\t\\t}\\n\\t}\\n#endif\";\n\nvar defaultnormal_vertex = \"vec3 transformedNormal = objectNormal;\\n#ifdef USE_TANGENT\\n\\tvec3 transformedTangent = objectTangent;\\n#endif\\n#ifdef USE_BATCHING\\n\\tmat3 bm = mat3( batchingMatrix );\\n\\ttransformedNormal /= vec3( dot( bm[ 0 ], bm[ 0 ] ), dot( bm[ 1 ], bm[ 1 ] ), dot( bm[ 2 ], bm[ 2 ] ) );\\n\\ttransformedNormal = bm * transformedNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\ttransformedTangent = bm * transformedTangent;\\n\\t#endif\\n#endif\\n#ifdef USE_INSTANCING\\n\\tmat3 im = mat3( instanceMatrix );\\n\\ttransformedNormal /= vec3( dot( im[ 0 ], im[ 0 ] ), dot( im[ 1 ], im[ 1 ] ), dot( im[ 2 ], im[ 2 ] ) );\\n\\ttransformedNormal = im * transformedNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\ttransformedTangent = im * transformedTangent;\\n\\t#endif\\n#endif\\ntransformedNormal = normalMatrix * transformedNormal;\\n#ifdef FLIP_SIDED\\n\\ttransformedNormal = - transformedNormal;\\n#endif\\n#ifdef USE_TANGENT\\n\\ttransformedTangent = ( modelViewMatrix * vec4( transformedTangent, 0.0 ) ).xyz;\\n\\t#ifdef FLIP_SIDED\\n\\t\\ttransformedTangent = - transformedTangent;\\n\\t#endif\\n#endif\";\n\nvar displacementmap_pars_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\tuniform sampler2D displacementMap;\\n\\tuniform float displacementScale;\\n\\tuniform float displacementBias;\\n#endif\";\n\nvar displacementmap_vertex = \"#ifdef USE_DISPLACEMENTMAP\\n\\ttransformed += normalize( objectNormal ) * ( texture2D( displacementMap, vDisplacementMapUv ).x * displacementScale + displacementBias );\\n#endif\";\n\nvar emissivemap_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tvec4 emissiveColor = texture2D( emissiveMap, vEmissiveMapUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE_EMISSIVE\\n\\t\\temissiveColor = sRGBTransferEOTF( emissiveColor );\\n\\t#endif\\n\\ttotalEmissiveRadiance *= emissiveColor.rgb;\\n#endif\";\n\nvar emissivemap_pars_fragment = \"#ifdef USE_EMISSIVEMAP\\n\\tuniform sampler2D emissiveMap;\\n#endif\";\n\nvar colorspace_fragment = \"gl_FragColor = linearToOutputTexel( gl_FragColor );\";\n\nvar colorspace_pars_fragment = \"vec4 LinearTransferOETF( in vec4 value ) {\\n\\treturn value;\\n}\\nvec4 sRGBTransferEOTF( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), value.rgb * 0.0773993808, vec3( lessThanEqual( value.rgb, vec3( 0.04045 ) ) ) ), value.a );\\n}\\nvec4 sRGBTransferOETF( in vec4 value ) {\\n\\treturn vec4( mix( pow( value.rgb, vec3( 0.41666 ) ) * 1.055 - vec3( 0.055 ), value.rgb * 12.92, vec3( lessThanEqual( value.rgb, vec3( 0.0031308 ) ) ) ), value.a );\\n}\";\n\nvar envmap_fragment = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvec3 cameraToFrag;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToFrag = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToFrag = normalize( vWorldPosition - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvec3 reflectVec = reflect( cameraToFrag, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvec3 reflectVec = refract( cameraToFrag, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#else\\n\\t\\tvec3 reflectVec = vReflect;\\n\\t#endif\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 envColor = textureCube( envMap, envMapRotation * vec3( flipEnvMap * reflectVec.x, reflectVec.yz ) );\\n\\t#else\\n\\t\\tvec4 envColor = vec4( 0.0 );\\n\\t#endif\\n\\t#ifdef ENVMAP_BLENDING_MULTIPLY\\n\\t\\toutgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_MIX )\\n\\t\\toutgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );\\n\\t#elif defined( ENVMAP_BLENDING_ADD )\\n\\t\\toutgoingLight += envColor.xyz * specularStrength * reflectivity;\\n\\t#endif\\n#endif\";\n\nvar envmap_common_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float envMapIntensity;\\n\\tuniform float flipEnvMap;\\n\\tuniform mat3 envMapRotation;\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tuniform samplerCube envMap;\\n\\t#else\\n\\t\\tuniform sampler2D envMap;\\n\\t#endif\\n#endif\";\n\nvar envmap_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tuniform float reflectivity;\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t\\tuniform float refractionRatio;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t#endif\\n#endif\";\n\nvar envmap_pars_vertex = \"#ifdef USE_ENVMAP\\n\\t#if defined( USE_BUMPMAP ) || defined( USE_NORMALMAP ) || defined( PHONG ) || defined( LAMBERT )\\n\\t\\t#define ENV_WORLDPOS\\n\\t#endif\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\t\\n\\t\\tvarying vec3 vWorldPosition;\\n\\t#else\\n\\t\\tvarying vec3 vReflect;\\n\\t\\tuniform float refractionRatio;\\n\\t#endif\\n#endif\";\n\nvar envmap_vertex = \"#ifdef USE_ENVMAP\\n\\t#ifdef ENV_WORLDPOS\\n\\t\\tvWorldPosition = worldPosition.xyz;\\n\\t#else\\n\\t\\tvec3 cameraToVertex;\\n\\t\\tif ( isOrthographic ) {\\n\\t\\t\\tcameraToVertex = normalize( vec3( - viewMatrix[ 0 ][ 2 ], - viewMatrix[ 1 ][ 2 ], - viewMatrix[ 2 ][ 2 ] ) );\\n\\t\\t} else {\\n\\t\\t\\tcameraToVertex = normalize( worldPosition.xyz - cameraPosition );\\n\\t\\t}\\n\\t\\tvec3 worldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\t\\t#ifdef ENVMAP_MODE_REFLECTION\\n\\t\\t\\tvReflect = reflect( cameraToVertex, worldNormal );\\n\\t\\t#else\\n\\t\\t\\tvReflect = refract( cameraToVertex, worldNormal, refractionRatio );\\n\\t\\t#endif\\n\\t#endif\\n#endif\";\n\nvar fog_vertex = \"#ifdef USE_FOG\\n\\tvFogDepth = - mvPosition.z;\\n#endif\";\n\nvar fog_pars_vertex = \"#ifdef USE_FOG\\n\\tvarying float vFogDepth;\\n#endif\";\n\nvar fog_fragment = \"#ifdef USE_FOG\\n\\t#ifdef FOG_EXP2\\n\\t\\tfloat fogFactor = 1.0 - exp( - fogDensity * fogDensity * vFogDepth * vFogDepth );\\n\\t#else\\n\\t\\tfloat fogFactor = smoothstep( fogNear, fogFar, vFogDepth );\\n\\t#endif\\n\\tgl_FragColor.rgb = mix( gl_FragColor.rgb, fogColor, fogFactor );\\n#endif\";\n\nvar fog_pars_fragment = \"#ifdef USE_FOG\\n\\tuniform vec3 fogColor;\\n\\tvarying float vFogDepth;\\n\\t#ifdef FOG_EXP2\\n\\t\\tuniform float fogDensity;\\n\\t#else\\n\\t\\tuniform float fogNear;\\n\\t\\tuniform float fogFar;\\n\\t#endif\\n#endif\";\n\nvar gradientmap_pars_fragment = \"#ifdef USE_GRADIENTMAP\\n\\tuniform sampler2D gradientMap;\\n#endif\\nvec3 getGradientIrradiance( vec3 normal, vec3 lightDirection ) {\\n\\tfloat dotNL = dot( normal, lightDirection );\\n\\tvec2 coord = vec2( dotNL * 0.5 + 0.5, 0.0 );\\n\\t#ifdef USE_GRADIENTMAP\\n\\t\\treturn vec3( texture2D( gradientMap, coord ).r );\\n\\t#else\\n\\t\\tvec2 fw = fwidth( coord ) * 0.5;\\n\\t\\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( 0.7 - fw.x, 0.7 + fw.x, coord.x ) );\\n\\t#endif\\n}\";\n\nvar lightmap_pars_fragment = \"#ifdef USE_LIGHTMAP\\n\\tuniform sampler2D lightMap;\\n\\tuniform float lightMapIntensity;\\n#endif\";\n\nvar lights_lambert_fragment = \"LambertMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_lambert_pars_fragment = \"varying vec3 vViewPosition;\\nstruct LambertMaterial {\\n\\tvec3 diffuseColor;\\n\\tfloat specularStrength;\\n};\\nvoid RE_Direct_Lambert( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Lambert( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in LambertMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Lambert\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Lambert\";\n\nvar lights_pars_begin = \"uniform bool receiveShadow;\\nuniform vec3 ambientLightColor;\\n#if defined( USE_LIGHT_PROBES )\\n\\tuniform vec3 lightProbe[ 9 ];\\n#endif\\nvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\\n\\tfloat x = normal.x, y = normal.y, z = normal.z;\\n\\tvec3 result = shCoefficients[ 0 ] * 0.886227;\\n\\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\\n\\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\\n\\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\\n\\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\\n\\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\\n\\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\\n\\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\\n\\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\\n\\treturn result;\\n}\\nvec3 getLightProbeIrradiance( const in vec3 lightProbe[ 9 ], const in vec3 normal ) {\\n\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\tvec3 irradiance = shGetIrradianceAt( worldNormal, lightProbe );\\n\\treturn irradiance;\\n}\\nvec3 getAmbientLightIrradiance( const in vec3 ambientLightColor ) {\\n\\tvec3 irradiance = ambientLightColor;\\n\\treturn irradiance;\\n}\\nfloat getDistanceAttenuation( const in float lightDistance, const in float cutoffDistance, const in float decayExponent ) {\\n\\tfloat distanceFalloff = 1.0 / max( pow( lightDistance, decayExponent ), 0.01 );\\n\\tif ( cutoffDistance > 0.0 ) {\\n\\t\\tdistanceFalloff *= pow2( saturate( 1.0 - pow4( lightDistance / cutoffDistance ) ) );\\n\\t}\\n\\treturn distanceFalloff;\\n}\\nfloat getSpotAttenuation( const in float coneCosine, const in float penumbraCosine, const in float angleCosine ) {\\n\\treturn smoothstep( coneCosine, penumbraCosine, angleCosine );\\n}\\n#if NUM_DIR_LIGHTS > 0\\n\\tstruct DirectionalLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t};\\n\\tuniform DirectionalLight directionalLights[ NUM_DIR_LIGHTS ];\\n\\tvoid getDirectionalLightInfo( const in DirectionalLight directionalLight, out IncidentLight light ) {\\n\\t\\tlight.color = directionalLight.color;\\n\\t\\tlight.direction = directionalLight.direction;\\n\\t\\tlight.visible = true;\\n\\t}\\n#endif\\n#if NUM_POINT_LIGHTS > 0\\n\\tstruct PointLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t};\\n\\tuniform PointLight pointLights[ NUM_POINT_LIGHTS ];\\n\\tvoid getPointLightInfo( const in PointLight pointLight, const in vec3 geometryPosition, out IncidentLight light ) {\\n\\t\\tvec3 lVector = pointLight.position - geometryPosition;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat lightDistance = length( lVector );\\n\\t\\tlight.color = pointLight.color;\\n\\t\\tlight.color *= getDistanceAttenuation( lightDistance, pointLight.distance, pointLight.decay );\\n\\t\\tlight.visible = ( light.color != vec3( 0.0 ) );\\n\\t}\\n#endif\\n#if NUM_SPOT_LIGHTS > 0\\n\\tstruct SpotLight {\\n\\t\\tvec3 position;\\n\\t\\tvec3 direction;\\n\\t\\tvec3 color;\\n\\t\\tfloat distance;\\n\\t\\tfloat decay;\\n\\t\\tfloat coneCos;\\n\\t\\tfloat penumbraCos;\\n\\t};\\n\\tuniform SpotLight spotLights[ NUM_SPOT_LIGHTS ];\\n\\tvoid getSpotLightInfo( const in SpotLight spotLight, const in vec3 geometryPosition, out IncidentLight light ) {\\n\\t\\tvec3 lVector = spotLight.position - geometryPosition;\\n\\t\\tlight.direction = normalize( lVector );\\n\\t\\tfloat angleCos = dot( light.direction, spotLight.direction );\\n\\t\\tfloat spotAttenuation = getSpotAttenuation( spotLight.coneCos, spotLight.penumbraCos, angleCos );\\n\\t\\tif ( spotAttenuation > 0.0 ) {\\n\\t\\t\\tfloat lightDistance = length( lVector );\\n\\t\\t\\tlight.color = spotLight.color * spotAttenuation;\\n\\t\\t\\tlight.color *= getDistanceAttenuation( lightDistance, spotLight.distance, spotLight.decay );\\n\\t\\t\\tlight.visible = ( light.color != vec3( 0.0 ) );\\n\\t\\t} else {\\n\\t\\t\\tlight.color = vec3( 0.0 );\\n\\t\\t\\tlight.visible = false;\\n\\t\\t}\\n\\t}\\n#endif\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tstruct RectAreaLight {\\n\\t\\tvec3 color;\\n\\t\\tvec3 position;\\n\\t\\tvec3 halfWidth;\\n\\t\\tvec3 halfHeight;\\n\\t};\\n\\tuniform sampler2D ltc_1;\\tuniform sampler2D ltc_2;\\n\\tuniform RectAreaLight rectAreaLights[ NUM_RECT_AREA_LIGHTS ];\\n#endif\\n#if NUM_HEMI_LIGHTS > 0\\n\\tstruct HemisphereLight {\\n\\t\\tvec3 direction;\\n\\t\\tvec3 skyColor;\\n\\t\\tvec3 groundColor;\\n\\t};\\n\\tuniform HemisphereLight hemisphereLights[ NUM_HEMI_LIGHTS ];\\n\\tvec3 getHemisphereLightIrradiance( const in HemisphereLight hemiLight, const in vec3 normal ) {\\n\\t\\tfloat dotNL = dot( normal, hemiLight.direction );\\n\\t\\tfloat hemiDiffuseWeight = 0.5 * dotNL + 0.5;\\n\\t\\tvec3 irradiance = mix( hemiLight.groundColor, hemiLight.skyColor, hemiDiffuseWeight );\\n\\t\\treturn irradiance;\\n\\t}\\n#endif\";\n\nvar envmap_physical_pars_fragment = \"#ifdef USE_ENVMAP\\n\\tvec3 getIBLIrradiance( const in vec3 normal ) {\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * worldNormal, 1.0 );\\n\\t\\t\\treturn PI * envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n\\tvec3 getIBLRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness ) {\\n\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\tvec3 reflectVec = reflect( - viewDir, normal );\\n\\t\\t\\treflectVec = normalize( mix( reflectVec, normal, pow4( roughness ) ) );\\n\\t\\t\\treflectVec = inverseTransformDirection( reflectVec, viewMatrix );\\n\\t\\t\\tvec4 envMapColor = textureCubeUV( envMap, envMapRotation * reflectVec, roughness );\\n\\t\\t\\treturn envMapColor.rgb * envMapIntensity;\\n\\t\\t#else\\n\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t#endif\\n\\t}\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tvec3 getIBLAnisotropyRadiance( const in vec3 viewDir, const in vec3 normal, const in float roughness, const in vec3 bitangent, const in float anisotropy ) {\\n\\t\\t\\t#ifdef ENVMAP_TYPE_CUBE_UV\\n\\t\\t\\t\\tvec3 bentNormal = cross( bitangent, viewDir );\\n\\t\\t\\t\\tbentNormal = normalize( cross( bentNormal, bitangent ) );\\n\\t\\t\\t\\tbentNormal = normalize( mix( bentNormal, normal, pow2( pow2( 1.0 - anisotropy * ( 1.0 - roughness ) ) ) ) );\\n\\t\\t\\t\\treturn getIBLRadiance( viewDir, bentNormal, roughness );\\n\\t\\t\\t#else\\n\\t\\t\\t\\treturn vec3( 0.0 );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\t#endif\\n#endif\";\n\nvar lights_toon_fragment = \"ToonMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\";\n\nvar lights_toon_pars_fragment = \"varying vec3 vViewPosition;\\nstruct ToonMaterial {\\n\\tvec3 diffuseColor;\\n};\\nvoid RE_Direct_Toon( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tvec3 irradiance = getGradientIrradiance( geometryNormal, directLight.direction ) * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\nvoid RE_IndirectDiffuse_Toon( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in ToonMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Toon\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Toon\";\n\nvar lights_phong_fragment = \"BlinnPhongMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.specularColor = specular;\\nmaterial.specularShininess = shininess;\\nmaterial.specularStrength = specularStrength;\";\n\nvar lights_phong_pars_fragment = \"varying vec3 vViewPosition;\\nstruct BlinnPhongMaterial {\\n\\tvec3 diffuseColor;\\n\\tvec3 specularColor;\\n\\tfloat specularShininess;\\n\\tfloat specularStrength;\\n};\\nvoid RE_Direct_BlinnPhong( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n\\treflectedLight.directSpecular += irradiance * BRDF_BlinnPhong( directLight.direction, geometryViewDir, geometryNormal, material.specularColor, material.specularShininess ) * material.specularStrength;\\n}\\nvoid RE_IndirectDiffuse_BlinnPhong( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in BlinnPhongMaterial material, inout ReflectedLight reflectedLight ) {\\n\\treflectedLight.indirectDiffuse += irradiance * BRDF_Lambert( material.diffuseColor );\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_BlinnPhong\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_BlinnPhong\";\n\nvar lights_physical_fragment = \"PhysicalMaterial material;\\nmaterial.diffuseColor = diffuseColor.rgb;\\nmaterial.diffuseContribution = diffuseColor.rgb * ( 1.0 - metalnessFactor );\\nmaterial.metalness = metalnessFactor;\\nvec3 dxy = max( abs( dFdx( nonPerturbedNormal ) ), abs( dFdy( nonPerturbedNormal ) ) );\\nfloat geometryRoughness = max( max( dxy.x, dxy.y ), dxy.z );\\nmaterial.roughness = max( roughnessFactor, 0.0525 );material.roughness += geometryRoughness;\\nmaterial.roughness = min( material.roughness, 1.0 );\\n#ifdef IOR\\n\\tmaterial.ior = ior;\\n\\t#ifdef USE_SPECULAR\\n\\t\\tfloat specularIntensityFactor = specularIntensity;\\n\\t\\tvec3 specularColorFactor = specularColor;\\n\\t\\t#ifdef USE_SPECULAR_COLORMAP\\n\\t\\t\\tspecularColorFactor *= texture2D( specularColorMap, vSpecularColorMapUv ).rgb;\\n\\t\\t#endif\\n\\t\\t#ifdef USE_SPECULAR_INTENSITYMAP\\n\\t\\t\\tspecularIntensityFactor *= texture2D( specularIntensityMap, vSpecularIntensityMapUv ).a;\\n\\t\\t#endif\\n\\t\\tmaterial.specularF90 = mix( specularIntensityFactor, 1.0, metalnessFactor );\\n\\t#else\\n\\t\\tfloat specularIntensityFactor = 1.0;\\n\\t\\tvec3 specularColorFactor = vec3( 1.0 );\\n\\t\\tmaterial.specularF90 = 1.0;\\n\\t#endif\\n\\tmaterial.specularColor = min( pow2( ( material.ior - 1.0 ) / ( material.ior + 1.0 ) ) * specularColorFactor, vec3( 1.0 ) ) * specularIntensityFactor;\\n\\tmaterial.specularColorBlended = mix( material.specularColor, diffuseColor.rgb, metalnessFactor );\\n#else\\n\\tmaterial.specularColor = vec3( 0.04 );\\n\\tmaterial.specularColorBlended = mix( material.specularColor, diffuseColor.rgb, metalnessFactor );\\n\\tmaterial.specularF90 = 1.0;\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tmaterial.clearcoat = clearcoat;\\n\\tmaterial.clearcoatRoughness = clearcoatRoughness;\\n\\tmaterial.clearcoatF0 = vec3( 0.04 );\\n\\tmaterial.clearcoatF90 = 1.0;\\n\\t#ifdef USE_CLEARCOATMAP\\n\\t\\tmaterial.clearcoat *= texture2D( clearcoatMap, vClearcoatMapUv ).x;\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\t\\tmaterial.clearcoatRoughness *= texture2D( clearcoatRoughnessMap, vClearcoatRoughnessMapUv ).y;\\n\\t#endif\\n\\tmaterial.clearcoat = saturate( material.clearcoat );\\tmaterial.clearcoatRoughness = max( material.clearcoatRoughness, 0.0525 );\\n\\tmaterial.clearcoatRoughness += geometryRoughness;\\n\\tmaterial.clearcoatRoughness = min( material.clearcoatRoughness, 1.0 );\\n#endif\\n#ifdef USE_DISPERSION\\n\\tmaterial.dispersion = dispersion;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tmaterial.iridescence = iridescence;\\n\\tmaterial.iridescenceIOR = iridescenceIOR;\\n\\t#ifdef USE_IRIDESCENCEMAP\\n\\t\\tmaterial.iridescence *= texture2D( iridescenceMap, vIridescenceMapUv ).r;\\n\\t#endif\\n\\t#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\t\\tmaterial.iridescenceThickness = (iridescenceThicknessMaximum - iridescenceThicknessMinimum) * texture2D( iridescenceThicknessMap, vIridescenceThicknessMapUv ).g + iridescenceThicknessMinimum;\\n\\t#else\\n\\t\\tmaterial.iridescenceThickness = iridescenceThicknessMaximum;\\n\\t#endif\\n#endif\\n#ifdef USE_SHEEN\\n\\tmaterial.sheenColor = sheenColor;\\n\\t#ifdef USE_SHEEN_COLORMAP\\n\\t\\tmaterial.sheenColor *= texture2D( sheenColorMap, vSheenColorMapUv ).rgb;\\n\\t#endif\\n\\tmaterial.sheenRoughness = clamp( sheenRoughness, 0.0001, 1.0 );\\n\\t#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\t\\tmaterial.sheenRoughness *= texture2D( sheenRoughnessMap, vSheenRoughnessMapUv ).a;\\n\\t#endif\\n#endif\\n#ifdef USE_ANISOTROPY\\n\\t#ifdef USE_ANISOTROPYMAP\\n\\t\\tmat2 anisotropyMat = mat2( anisotropyVector.x, anisotropyVector.y, - anisotropyVector.y, anisotropyVector.x );\\n\\t\\tvec3 anisotropyPolar = texture2D( anisotropyMap, vAnisotropyMapUv ).rgb;\\n\\t\\tvec2 anisotropyV = anisotropyMat * normalize( 2.0 * anisotropyPolar.rg - vec2( 1.0 ) ) * anisotropyPolar.b;\\n\\t#else\\n\\t\\tvec2 anisotropyV = anisotropyVector;\\n\\t#endif\\n\\tmaterial.anisotropy = length( anisotropyV );\\n\\tif( material.anisotropy == 0.0 ) {\\n\\t\\tanisotropyV = vec2( 1.0, 0.0 );\\n\\t} else {\\n\\t\\tanisotropyV /= material.anisotropy;\\n\\t\\tmaterial.anisotropy = saturate( material.anisotropy );\\n\\t}\\n\\tmaterial.alphaT = mix( pow2( material.roughness ), 1.0, pow2( material.anisotropy ) );\\n\\tmaterial.anisotropyT = tbn[ 0 ] * anisotropyV.x + tbn[ 1 ] * anisotropyV.y;\\n\\tmaterial.anisotropyB = tbn[ 1 ] * anisotropyV.x - tbn[ 0 ] * anisotropyV.y;\\n#endif\";\n\nvar lights_physical_pars_fragment = \"uniform sampler2D dfgLUT;\\nstruct PhysicalMaterial {\\n\\tvec3 diffuseColor;\\n\\tvec3 diffuseContribution;\\n\\tvec3 specularColor;\\n\\tvec3 specularColorBlended;\\n\\tfloat roughness;\\n\\tfloat metalness;\\n\\tfloat specularF90;\\n\\tfloat dispersion;\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat clearcoat;\\n\\t\\tfloat clearcoatRoughness;\\n\\t\\tvec3 clearcoatF0;\\n\\t\\tfloat clearcoatF90;\\n\\t#endif\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tfloat iridescence;\\n\\t\\tfloat iridescenceIOR;\\n\\t\\tfloat iridescenceThickness;\\n\\t\\tvec3 iridescenceFresnel;\\n\\t\\tvec3 iridescenceF0;\\n\\t\\tvec3 iridescenceFresnelDielectric;\\n\\t\\tvec3 iridescenceFresnelMetallic;\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tvec3 sheenColor;\\n\\t\\tfloat sheenRoughness;\\n\\t#endif\\n\\t#ifdef IOR\\n\\t\\tfloat ior;\\n\\t#endif\\n\\t#ifdef USE_TRANSMISSION\\n\\t\\tfloat transmission;\\n\\t\\tfloat transmissionAlpha;\\n\\t\\tfloat thickness;\\n\\t\\tfloat attenuationDistance;\\n\\t\\tvec3 attenuationColor;\\n\\t#endif\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tfloat anisotropy;\\n\\t\\tfloat alphaT;\\n\\t\\tvec3 anisotropyT;\\n\\t\\tvec3 anisotropyB;\\n\\t#endif\\n};\\nvec3 clearcoatSpecularDirect = vec3( 0.0 );\\nvec3 clearcoatSpecularIndirect = vec3( 0.0 );\\nvec3 sheenSpecularDirect = vec3( 0.0 );\\nvec3 sheenSpecularIndirect = vec3(0.0 );\\nvec3 Schlick_to_F0( const in vec3 f, const in float f90, const in float dotVH ) {\\n    float x = clamp( 1.0 - dotVH, 0.0, 1.0 );\\n    float x2 = x * x;\\n    float x5 = clamp( x * x2 * x2, 0.0, 0.9999 );\\n    return ( f - vec3( f90 ) * x5 ) / ( 1.0 - x5 );\\n}\\nfloat V_GGX_SmithCorrelated( const in float alpha, const in float dotNL, const in float dotNV ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat gv = dotNL * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNV ) );\\n\\tfloat gl = dotNV * sqrt( a2 + ( 1.0 - a2 ) * pow2( dotNL ) );\\n\\treturn 0.5 / max( gv + gl, EPSILON );\\n}\\nfloat D_GGX( const in float alpha, const in float dotNH ) {\\n\\tfloat a2 = pow2( alpha );\\n\\tfloat denom = pow2( dotNH ) * ( a2 - 1.0 ) + 1.0;\\n\\treturn RECIPROCAL_PI * a2 / pow2( denom );\\n}\\n#ifdef USE_ANISOTROPY\\n\\tfloat V_GGX_SmithCorrelated_Anisotropic( const in float alphaT, const in float alphaB, const in float dotTV, const in float dotBV, const in float dotTL, const in float dotBL, const in float dotNV, const in float dotNL ) {\\n\\t\\tfloat gv = dotNL * length( vec3( alphaT * dotTV, alphaB * dotBV, dotNV ) );\\n\\t\\tfloat gl = dotNV * length( vec3( alphaT * dotTL, alphaB * dotBL, dotNL ) );\\n\\t\\tfloat v = 0.5 / ( gv + gl );\\n\\t\\treturn v;\\n\\t}\\n\\tfloat D_GGX_Anisotropic( const in float alphaT, const in float alphaB, const in float dotNH, const in float dotTH, const in float dotBH ) {\\n\\t\\tfloat a2 = alphaT * alphaB;\\n\\t\\thighp vec3 v = vec3( alphaB * dotTH, alphaT * dotBH, a2 * dotNH );\\n\\t\\thighp float v2 = dot( v, v );\\n\\t\\tfloat w2 = a2 / v2;\\n\\t\\treturn RECIPROCAL_PI * a2 * pow2 ( w2 );\\n\\t}\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tvec3 BRDF_GGX_Clearcoat( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material) {\\n\\t\\tvec3 f0 = material.clearcoatF0;\\n\\t\\tfloat f90 = material.clearcoatF90;\\n\\t\\tfloat roughness = material.clearcoatRoughness;\\n\\t\\tfloat alpha = pow2( roughness );\\n\\t\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\t\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\t\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\t\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\t\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\t\\tvec3 F = F_Schlick( f0, f90, dotVH );\\n\\t\\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\t\\tfloat D = D_GGX( alpha, dotNH );\\n\\t\\treturn F * ( V * D );\\n\\t}\\n#endif\\nvec3 BRDF_GGX( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\\n\\tvec3 f0 = material.specularColorBlended;\\n\\tfloat f90 = material.specularF90;\\n\\tfloat roughness = material.roughness;\\n\\tfloat alpha = pow2( roughness );\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat dotVH = saturate( dot( viewDir, halfDir ) );\\n\\tvec3 F = F_Schlick( f0, f90, dotVH );\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tF = mix( F, material.iridescenceFresnel, material.iridescence );\\n\\t#endif\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tfloat dotTL = dot( material.anisotropyT, lightDir );\\n\\t\\tfloat dotTV = dot( material.anisotropyT, viewDir );\\n\\t\\tfloat dotTH = dot( material.anisotropyT, halfDir );\\n\\t\\tfloat dotBL = dot( material.anisotropyB, lightDir );\\n\\t\\tfloat dotBV = dot( material.anisotropyB, viewDir );\\n\\t\\tfloat dotBH = dot( material.anisotropyB, halfDir );\\n\\t\\tfloat V = V_GGX_SmithCorrelated_Anisotropic( material.alphaT, alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL );\\n\\t\\tfloat D = D_GGX_Anisotropic( material.alphaT, alpha, dotNH, dotTH, dotBH );\\n\\t#else\\n\\t\\tfloat V = V_GGX_SmithCorrelated( alpha, dotNL, dotNV );\\n\\t\\tfloat D = D_GGX( alpha, dotNH );\\n\\t#endif\\n\\treturn F * ( V * D );\\n}\\nvec2 LTC_Uv( const in vec3 N, const in vec3 V, const in float roughness ) {\\n\\tconst float LUT_SIZE = 64.0;\\n\\tconst float LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\\n\\tconst float LUT_BIAS = 0.5 / LUT_SIZE;\\n\\tfloat dotNV = saturate( dot( N, V ) );\\n\\tvec2 uv = vec2( roughness, sqrt( 1.0 - dotNV ) );\\n\\tuv = uv * LUT_SCALE + LUT_BIAS;\\n\\treturn uv;\\n}\\nfloat LTC_ClippedSphereFormFactor( const in vec3 f ) {\\n\\tfloat l = length( f );\\n\\treturn max( ( l * l + f.z ) / ( l + 1.0 ), 0.0 );\\n}\\nvec3 LTC_EdgeVectorFormFactor( const in vec3 v1, const in vec3 v2 ) {\\n\\tfloat x = dot( v1, v2 );\\n\\tfloat y = abs( x );\\n\\tfloat a = 0.8543985 + ( 0.4965155 + 0.0145206 * y ) * y;\\n\\tfloat b = 3.4175940 + ( 4.1616724 + y ) * y;\\n\\tfloat v = a / b;\\n\\tfloat theta_sintheta = ( x > 0.0 ) ? v : 0.5 * inversesqrt( max( 1.0 - x * x, 1e-7 ) ) - v;\\n\\treturn cross( v1, v2 ) * theta_sintheta;\\n}\\nvec3 LTC_Evaluate( const in vec3 N, const in vec3 V, const in vec3 P, const in mat3 mInv, const in vec3 rectCoords[ 4 ] ) {\\n\\tvec3 v1 = rectCoords[ 1 ] - rectCoords[ 0 ];\\n\\tvec3 v2 = rectCoords[ 3 ] - rectCoords[ 0 ];\\n\\tvec3 lightNormal = cross( v1, v2 );\\n\\tif( dot( lightNormal, P - rectCoords[ 0 ] ) < 0.0 ) return vec3( 0.0 );\\n\\tvec3 T1, T2;\\n\\tT1 = normalize( V - N * dot( V, N ) );\\n\\tT2 = - cross( N, T1 );\\n\\tmat3 mat = mInv * transpose( mat3( T1, T2, N ) );\\n\\tvec3 coords[ 4 ];\\n\\tcoords[ 0 ] = mat * ( rectCoords[ 0 ] - P );\\n\\tcoords[ 1 ] = mat * ( rectCoords[ 1 ] - P );\\n\\tcoords[ 2 ] = mat * ( rectCoords[ 2 ] - P );\\n\\tcoords[ 3 ] = mat * ( rectCoords[ 3 ] - P );\\n\\tcoords[ 0 ] = normalize( coords[ 0 ] );\\n\\tcoords[ 1 ] = normalize( coords[ 1 ] );\\n\\tcoords[ 2 ] = normalize( coords[ 2 ] );\\n\\tcoords[ 3 ] = normalize( coords[ 3 ] );\\n\\tvec3 vectorFormFactor = vec3( 0.0 );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 0 ], coords[ 1 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 1 ], coords[ 2 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 2 ], coords[ 3 ] );\\n\\tvectorFormFactor += LTC_EdgeVectorFormFactor( coords[ 3 ], coords[ 0 ] );\\n\\tfloat result = LTC_ClippedSphereFormFactor( vectorFormFactor );\\n\\treturn vec3( result );\\n}\\n#if defined( USE_SHEEN )\\nfloat D_Charlie( float roughness, float dotNH ) {\\n\\tfloat alpha = pow2( roughness );\\n\\tfloat invAlpha = 1.0 / alpha;\\n\\tfloat cos2h = dotNH * dotNH;\\n\\tfloat sin2h = max( 1.0 - cos2h, 0.0078125 );\\n\\treturn ( 2.0 + invAlpha ) * pow( sin2h, invAlpha * 0.5 ) / ( 2.0 * PI );\\n}\\nfloat V_Neubelt( float dotNV, float dotNL ) {\\n\\treturn saturate( 1.0 / ( 4.0 * ( dotNL + dotNV - dotNL * dotNV ) ) );\\n}\\nvec3 BRDF_Sheen( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, vec3 sheenColor, const in float sheenRoughness ) {\\n\\tvec3 halfDir = normalize( lightDir + viewDir );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat dotNH = saturate( dot( normal, halfDir ) );\\n\\tfloat D = D_Charlie( sheenRoughness, dotNH );\\n\\tfloat V = V_Neubelt( dotNV, dotNL );\\n\\treturn sheenColor * ( D * V );\\n}\\n#endif\\nfloat IBLSheenBRDF( const in vec3 normal, const in vec3 viewDir, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tfloat r2 = roughness * roughness;\\n\\tfloat rInv = 1.0 / ( roughness + 0.1 );\\n\\tfloat a = -1.9362 + 1.0678 * roughness + 0.4573 * r2 - 0.8469 * rInv;\\n\\tfloat b = -0.6014 + 0.5538 * roughness - 0.4670 * r2 - 0.1255 * rInv;\\n\\tfloat DG = exp( a * dotNV + b );\\n\\treturn saturate( DG );\\n}\\nvec3 EnvironmentBRDF( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness ) {\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tvec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;\\n\\treturn specularColor * fab.x + specularF90 * fab.y;\\n}\\n#ifdef USE_IRIDESCENCE\\nvoid computeMultiscatteringIridescence( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float iridescence, const in vec3 iridescenceF0, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n#else\\nvoid computeMultiscattering( const in vec3 normal, const in vec3 viewDir, const in vec3 specularColor, const in float specularF90, const in float roughness, inout vec3 singleScatter, inout vec3 multiScatter ) {\\n#endif\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tvec2 fab = texture2D( dfgLUT, vec2( roughness, dotNV ) ).rg;\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tvec3 Fr = mix( specularColor, iridescenceF0, iridescence );\\n\\t#else\\n\\t\\tvec3 Fr = specularColor;\\n\\t#endif\\n\\tvec3 FssEss = Fr * fab.x + specularF90 * fab.y;\\n\\tfloat Ess = fab.x + fab.y;\\n\\tfloat Ems = 1.0 - Ess;\\n\\tvec3 Favg = Fr + ( 1.0 - Fr ) * 0.047619;\\tvec3 Fms = FssEss * Favg / ( 1.0 - Ems * Favg );\\n\\tsingleScatter += FssEss;\\n\\tmultiScatter += Fms * Ems;\\n}\\nvec3 BRDF_GGX_Multiscatter( const in vec3 lightDir, const in vec3 viewDir, const in vec3 normal, const in PhysicalMaterial material ) {\\n\\tvec3 singleScatter = BRDF_GGX( lightDir, viewDir, normal, material );\\n\\tfloat dotNL = saturate( dot( normal, lightDir ) );\\n\\tfloat dotNV = saturate( dot( normal, viewDir ) );\\n\\tvec2 dfgV = texture2D( dfgLUT, vec2( material.roughness, dotNV ) ).rg;\\n\\tvec2 dfgL = texture2D( dfgLUT, vec2( material.roughness, dotNL ) ).rg;\\n\\tvec3 FssEss_V = material.specularColorBlended * dfgV.x + material.specularF90 * dfgV.y;\\n\\tvec3 FssEss_L = material.specularColorBlended * dfgL.x + material.specularF90 * dfgL.y;\\n\\tfloat Ess_V = dfgV.x + dfgV.y;\\n\\tfloat Ess_L = dfgL.x + dfgL.y;\\n\\tfloat Ems_V = 1.0 - Ess_V;\\n\\tfloat Ems_L = 1.0 - Ess_L;\\n\\tvec3 Favg = material.specularColorBlended + ( 1.0 - material.specularColorBlended ) * 0.047619;\\n\\tvec3 Fms = FssEss_V * FssEss_L * Favg / ( 1.0 - Ems_V * Ems_L * Favg + EPSILON );\\n\\tfloat compensationFactor = Ems_V * Ems_L;\\n\\tvec3 multiScatter = Fms * compensationFactor;\\n\\treturn singleScatter + multiScatter;\\n}\\n#if NUM_RECT_AREA_LIGHTS > 0\\n\\tvoid RE_Direct_RectArea_Physical( const in RectAreaLight rectAreaLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\t\\tvec3 normal = geometryNormal;\\n\\t\\tvec3 viewDir = geometryViewDir;\\n\\t\\tvec3 position = geometryPosition;\\n\\t\\tvec3 lightPos = rectAreaLight.position;\\n\\t\\tvec3 halfWidth = rectAreaLight.halfWidth;\\n\\t\\tvec3 halfHeight = rectAreaLight.halfHeight;\\n\\t\\tvec3 lightColor = rectAreaLight.color;\\n\\t\\tfloat roughness = material.roughness;\\n\\t\\tvec3 rectCoords[ 4 ];\\n\\t\\trectCoords[ 0 ] = lightPos + halfWidth - halfHeight;\\t\\trectCoords[ 1 ] = lightPos - halfWidth - halfHeight;\\n\\t\\trectCoords[ 2 ] = lightPos - halfWidth + halfHeight;\\n\\t\\trectCoords[ 3 ] = lightPos + halfWidth + halfHeight;\\n\\t\\tvec2 uv = LTC_Uv( normal, viewDir, roughness );\\n\\t\\tvec4 t1 = texture2D( ltc_1, uv );\\n\\t\\tvec4 t2 = texture2D( ltc_2, uv );\\n\\t\\tmat3 mInv = mat3(\\n\\t\\t\\tvec3( t1.x, 0, t1.y ),\\n\\t\\t\\tvec3(    0, 1,    0 ),\\n\\t\\t\\tvec3( t1.z, 0, t1.w )\\n\\t\\t);\\n\\t\\tvec3 fresnel = ( material.specularColorBlended * t2.x + ( vec3( 1.0 ) - material.specularColorBlended ) * t2.y );\\n\\t\\treflectedLight.directSpecular += lightColor * fresnel * LTC_Evaluate( normal, viewDir, position, mInv, rectCoords );\\n\\t\\treflectedLight.directDiffuse += lightColor * material.diffuseContribution * LTC_Evaluate( normal, viewDir, position, mat3( 1.0 ), rectCoords );\\n\\t}\\n#endif\\nvoid RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tfloat dotNL = saturate( dot( geometryNormal, directLight.direction ) );\\n\\tvec3 irradiance = dotNL * directLight.color;\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNLcc = saturate( dot( geometryClearcoatNormal, directLight.direction ) );\\n\\t\\tvec3 ccIrradiance = dotNLcc * directLight.color;\\n\\t\\tclearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n \\n \\t\\tsheenSpecularDirect += irradiance * BRDF_Sheen( directLight.direction, geometryViewDir, geometryNormal, material.sheenColor, material.sheenRoughness );\\n \\n \\t\\tfloat sheenAlbedoV = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\\n \\t\\tfloat sheenAlbedoL = IBLSheenBRDF( geometryNormal, directLight.direction, material.sheenRoughness );\\n \\n \\t\\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * max( sheenAlbedoV, sheenAlbedoL );\\n \\n \\t\\tirradiance *= sheenEnergyComp;\\n \\n \\t#endif\\n\\treflectedLight.directSpecular += irradiance * BRDF_GGX_Multiscatter( directLight.direction, geometryViewDir, geometryNormal, material );\\n\\treflectedLight.directDiffuse += irradiance * BRDF_Lambert( material.diffuseContribution );\\n}\\nvoid RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight ) {\\n\\tvec3 diffuse = irradiance * BRDF_Lambert( material.diffuseContribution );\\n\\t#ifdef USE_SHEEN\\n\\t\\tfloat sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\\n\\t\\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;\\n\\t\\tdiffuse *= sheenEnergyComp;\\n\\t#endif\\n\\treflectedLight.indirectDiffuse += diffuse;\\n}\\nvoid RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );\\n\\t#endif\\n\\t#ifdef USE_SHEEN\\n\\t\\tsheenSpecularIndirect += irradiance * material.sheenColor * IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness ) * RECIPROCAL_PI;\\n \\t#endif\\n\\tvec3 singleScatteringDielectric = vec3( 0.0 );\\n\\tvec3 multiScatteringDielectric = vec3( 0.0 );\\n\\tvec3 singleScatteringMetallic = vec3( 0.0 );\\n\\tvec3 multiScatteringMetallic = vec3( 0.0 );\\n\\t#ifdef USE_IRIDESCENCE\\n\\t\\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.iridescence, material.iridescenceFresnelDielectric, material.roughness, singleScatteringDielectric, multiScatteringDielectric );\\n\\t\\tcomputeMultiscatteringIridescence( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.iridescence, material.iridescenceFresnelMetallic, material.roughness, singleScatteringMetallic, multiScatteringMetallic );\\n\\t#else\\n\\t\\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.specularColor, material.specularF90, material.roughness, singleScatteringDielectric, multiScatteringDielectric );\\n\\t\\tcomputeMultiscattering( geometryNormal, geometryViewDir, material.diffuseColor, material.specularF90, material.roughness, singleScatteringMetallic, multiScatteringMetallic );\\n\\t#endif\\n\\tvec3 singleScattering = mix( singleScatteringDielectric, singleScatteringMetallic, material.metalness );\\n\\tvec3 multiScattering = mix( multiScatteringDielectric, multiScatteringMetallic, material.metalness );\\n\\tvec3 totalScatteringDielectric = singleScatteringDielectric + multiScatteringDielectric;\\n\\tvec3 diffuse = material.diffuseContribution * ( 1.0 - totalScatteringDielectric );\\n\\tvec3 cosineWeightedIrradiance = irradiance * RECIPROCAL_PI;\\n\\tvec3 indirectSpecular = radiance * singleScattering;\\n\\tindirectSpecular += multiScattering * cosineWeightedIrradiance;\\n\\tvec3 indirectDiffuse = diffuse * cosineWeightedIrradiance;\\n\\t#ifdef USE_SHEEN\\n\\t\\tfloat sheenAlbedo = IBLSheenBRDF( geometryNormal, geometryViewDir, material.sheenRoughness );\\n\\t\\tfloat sheenEnergyComp = 1.0 - max3( material.sheenColor ) * sheenAlbedo;\\n\\t\\tindirectSpecular *= sheenEnergyComp;\\n\\t\\tindirectDiffuse *= sheenEnergyComp;\\n\\t#endif\\n\\treflectedLight.indirectSpecular += indirectSpecular;\\n\\treflectedLight.indirectDiffuse += indirectDiffuse;\\n}\\n#define RE_Direct\\t\\t\\t\\tRE_Direct_Physical\\n#define RE_Direct_RectArea\\t\\tRE_Direct_RectArea_Physical\\n#define RE_IndirectDiffuse\\t\\tRE_IndirectDiffuse_Physical\\n#define RE_IndirectSpecular\\t\\tRE_IndirectSpecular_Physical\\nfloat computeSpecularOcclusion( const in float dotNV, const in float ambientOcclusion, const in float roughness ) {\\n\\treturn saturate( pow( dotNV + ambientOcclusion, exp2( - 16.0 * roughness - 1.0 ) ) - 1.0 + ambientOcclusion );\\n}\";\n\nvar lights_fragment_begin = \"\\nvec3 geometryPosition = - vViewPosition;\\nvec3 geometryNormal = normal;\\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\\nvec3 geometryClearcoatNormal = vec3( 0.0 );\\n#ifdef USE_CLEARCOAT\\n\\tgeometryClearcoatNormal = clearcoatNormal;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\\n\\tif ( material.iridescenceThickness == 0.0 ) {\\n\\t\\tmaterial.iridescence = 0.0;\\n\\t} else {\\n\\t\\tmaterial.iridescence = saturate( material.iridescence );\\n\\t}\\n\\tif ( material.iridescence > 0.0 ) {\\n\\t\\tmaterial.iridescenceFresnelDielectric = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\\n\\t\\tmaterial.iridescenceFresnelMetallic = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.diffuseColor );\\n\\t\\tmaterial.iridescenceFresnel = mix( material.iridescenceFresnelDielectric, material.iridescenceFresnelMetallic, material.metalness );\\n\\t\\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\\n\\t}\\n#endif\\nIncidentLight directLight;\\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tPointLight pointLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\\n\\tPointLightShadow pointLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\\n\\t\\tpointLight = pointLights[ i ];\\n\\t\\tgetPointLightInfo( pointLight, geometryPosition, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS ) && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) )\\n\\t\\tpointLightShadow = pointLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tSpotLight spotLight;\\n\\tvec4 spotColor;\\n\\tvec3 spotLightCoord;\\n\\tbool inSpotLightMap;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\\n\\t\\tspotLight = spotLights[ i ];\\n\\t\\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\\n\\t\\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\\n\\t\\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\\n\\t\\t#else\\n\\t\\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\\n\\t\\t#endif\\n\\t\\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\\n\\t\\t\\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\\n\\t\\t\\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\\n\\t\\t\\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\\n\\t\\t\\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\\n\\t\\t#endif\\n\\t\\t#undef SPOT_LIGHT_MAP_INDEX\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\tspotLightShadow = spotLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\\n\\tDirectionalLight directionalLight;\\n\\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLightShadow;\\n\\t#endif\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLights[ i ];\\n\\t\\tgetDirectionalLightInfo( directionalLight, directLight );\\n\\t\\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\\n\\t\\tdirectionalLightShadow = directionalLightShadows[ i ];\\n\\t\\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t\\t#endif\\n\\t\\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\\n\\tRectAreaLight rectAreaLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\\n\\t\\trectAreaLight = rectAreaLights[ i ];\\n\\t\\tRE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\\n#if defined( RE_IndirectDiffuse )\\n\\tvec3 iblIrradiance = vec3( 0.0 );\\n\\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\\n\\t#if defined( USE_LIGHT_PROBES )\\n\\t\\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\\n\\t#endif\\n\\t#if ( NUM_HEMI_LIGHTS > 0 )\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\\n\\t\\t\\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tvec3 radiance = vec3( 0.0 );\\n\\tvec3 clearcoatRadiance = vec3( 0.0 );\\n#endif\";\n\nvar lights_fragment_maps = \"#if defined( RE_IndirectDiffuse )\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\\n\\t\\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\\n\\t\\tirradiance += lightMapIrradiance;\\n\\t#endif\\n\\t#if defined( USE_ENVMAP ) && defined( STANDARD ) && defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tiblIrradiance += getIBLIrradiance( geometryNormal );\\n\\t#endif\\n#endif\\n#if defined( USE_ENVMAP ) && defined( RE_IndirectSpecular )\\n\\t#ifdef USE_ANISOTROPY\\n\\t\\tradiance += getIBLAnisotropyRadiance( geometryViewDir, geometryNormal, material.roughness, material.anisotropyB, material.anisotropy );\\n\\t#else\\n\\t\\tradiance += getIBLRadiance( geometryViewDir, geometryNormal, material.roughness );\\n\\t#endif\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tclearcoatRadiance += getIBLRadiance( geometryViewDir, geometryClearcoatNormal, material.clearcoatRoughness );\\n\\t#endif\\n#endif\";\n\nvar lights_fragment_end = \"#if defined( RE_IndirectDiffuse )\\n\\tRE_IndirectDiffuse( irradiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n#endif\\n#if defined( RE_IndirectSpecular )\\n\\tRE_IndirectSpecular( radiance, iblIrradiance, clearcoatRadiance, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\\n#endif\";\n\nvar logdepthbuf_fragment = \"#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\\n\\tgl_FragDepth = vIsPerspective == 0.0 ? gl_FragCoord.z : log2( vFragDepth ) * logDepthBufFC * 0.5;\\n#endif\";\n\nvar logdepthbuf_pars_fragment = \"#if defined( USE_LOGARITHMIC_DEPTH_BUFFER )\\n\\tuniform float logDepthBufFC;\\n\\tvarying float vFragDepth;\\n\\tvarying float vIsPerspective;\\n#endif\";\n\nvar logdepthbuf_pars_vertex = \"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\\n\\tvarying float vFragDepth;\\n\\tvarying float vIsPerspective;\\n#endif\";\n\nvar logdepthbuf_vertex = \"#ifdef USE_LOGARITHMIC_DEPTH_BUFFER\\n\\tvFragDepth = 1.0 + gl_Position.w;\\n\\tvIsPerspective = float( isPerspectiveMatrix( projectionMatrix ) );\\n#endif\";\n\nvar map_fragment = \"#ifdef USE_MAP\\n\\tvec4 sampledDiffuseColor = texture2D( map, vMapUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\tsampledDiffuseColor = sRGBTransferEOTF( sampledDiffuseColor );\\n\\t#endif\\n\\tdiffuseColor *= sampledDiffuseColor;\\n#endif\";\n\nvar map_pars_fragment = \"#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\";\n\nvar map_particle_fragment = \"#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\t#if defined( USE_POINTS_UV )\\n\\t\\tvec2 uv = vUv;\\n\\t#else\\n\\t\\tvec2 uv = ( uvTransform * vec3( gl_PointCoord.x, 1.0 - gl_PointCoord.y, 1 ) ).xy;\\n\\t#endif\\n#endif\\n#ifdef USE_MAP\\n\\tdiffuseColor *= texture2D( map, uv );\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tdiffuseColor.a *= texture2D( alphaMap, uv ).g;\\n#endif\";\n\nvar map_particle_pars_fragment = \"#if defined( USE_POINTS_UV )\\n\\tvarying vec2 vUv;\\n#else\\n\\t#if defined( USE_MAP ) || defined( USE_ALPHAMAP )\\n\\t\\tuniform mat3 uvTransform;\\n\\t#endif\\n#endif\\n#ifdef USE_MAP\\n\\tuniform sampler2D map;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tuniform sampler2D alphaMap;\\n#endif\";\n\nvar metalnessmap_fragment = \"float metalnessFactor = metalness;\\n#ifdef USE_METALNESSMAP\\n\\tvec4 texelMetalness = texture2D( metalnessMap, vMetalnessMapUv );\\n\\tmetalnessFactor *= texelMetalness.b;\\n#endif\";\n\nvar metalnessmap_pars_fragment = \"#ifdef USE_METALNESSMAP\\n\\tuniform sampler2D metalnessMap;\\n#endif\";\n\nvar morphinstance_vertex = \"#ifdef USE_INSTANCING_MORPH\\n\\tfloat morphTargetInfluences[ MORPHTARGETS_COUNT ];\\n\\tfloat morphTargetBaseInfluence = texelFetch( morphTexture, ivec2( 0, gl_InstanceID ), 0 ).r;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\tmorphTargetInfluences[i] =  texelFetch( morphTexture, ivec2( i + 1, gl_InstanceID ), 0 ).r;\\n\\t}\\n#endif\";\n\nvar morphcolor_vertex = \"#if defined( USE_MORPHCOLORS )\\n\\tvColor *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\t#if defined( USE_COLOR_ALPHA )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ) * morphTargetInfluences[ i ];\\n\\t\\t#elif defined( USE_COLOR )\\n\\t\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) vColor += getMorph( gl_VertexID, i, 2 ).rgb * morphTargetInfluences[ i ];\\n\\t\\t#endif\\n\\t}\\n#endif\";\n\nvar morphnormal_vertex = \"#ifdef USE_MORPHNORMALS\\n\\tobjectNormal *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) objectNormal += getMorph( gl_VertexID, i, 1 ).xyz * morphTargetInfluences[ i ];\\n\\t}\\n#endif\";\n\nvar morphtarget_pars_vertex = \"#ifdef USE_MORPHTARGETS\\n\\t#ifndef USE_INSTANCING_MORPH\\n\\t\\tuniform float morphTargetBaseInfluence;\\n\\t\\tuniform float morphTargetInfluences[ MORPHTARGETS_COUNT ];\\n\\t#endif\\n\\tuniform sampler2DArray morphTargetsTexture;\\n\\tuniform ivec2 morphTargetsTextureSize;\\n\\tvec4 getMorph( const in int vertexIndex, const in int morphTargetIndex, const in int offset ) {\\n\\t\\tint texelIndex = vertexIndex * MORPHTARGETS_TEXTURE_STRIDE + offset;\\n\\t\\tint y = texelIndex / morphTargetsTextureSize.x;\\n\\t\\tint x = texelIndex - y * morphTargetsTextureSize.x;\\n\\t\\tivec3 morphUV = ivec3( x, y, morphTargetIndex );\\n\\t\\treturn texelFetch( morphTargetsTexture, morphUV, 0 );\\n\\t}\\n#endif\";\n\nvar morphtarget_vertex = \"#ifdef USE_MORPHTARGETS\\n\\ttransformed *= morphTargetBaseInfluence;\\n\\tfor ( int i = 0; i < MORPHTARGETS_COUNT; i ++ ) {\\n\\t\\tif ( morphTargetInfluences[ i ] != 0.0 ) transformed += getMorph( gl_VertexID, i, 0 ).xyz * morphTargetInfluences[ i ];\\n\\t}\\n#endif\";\n\nvar normal_fragment_begin = \"float faceDirection = gl_FrontFacing ? 1.0 : - 1.0;\\n#ifdef FLAT_SHADED\\n\\tvec3 fdx = dFdx( vViewPosition );\\n\\tvec3 fdy = dFdy( vViewPosition );\\n\\tvec3 normal = normalize( cross( fdx, fdy ) );\\n#else\\n\\tvec3 normal = normalize( vNormal );\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal *= faceDirection;\\n\\t#endif\\n#endif\\n#if defined( USE_NORMALMAP_TANGENTSPACE ) || defined( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY )\\n\\t#ifdef USE_TANGENT\\n\\t\\tmat3 tbn = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\\n\\t#else\\n\\t\\tmat3 tbn = getTangentFrame( - vViewPosition, normal,\\n\\t\\t#if defined( USE_NORMALMAP )\\n\\t\\t\\tvNormalMapUv\\n\\t\\t#elif defined( USE_CLEARCOAT_NORMALMAP )\\n\\t\\t\\tvClearcoatNormalMapUv\\n\\t\\t#else\\n\\t\\t\\tvUv\\n\\t\\t#endif\\n\\t\\t);\\n\\t#endif\\n\\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\\n\\t\\ttbn[0] *= faceDirection;\\n\\t\\ttbn[1] *= faceDirection;\\n\\t#endif\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\t#ifdef USE_TANGENT\\n\\t\\tmat3 tbn2 = mat3( normalize( vTangent ), normalize( vBitangent ), normal );\\n\\t#else\\n\\t\\tmat3 tbn2 = getTangentFrame( - vViewPosition, normal, vClearcoatNormalMapUv );\\n\\t#endif\\n\\t#if defined( DOUBLE_SIDED ) && ! defined( FLAT_SHADED )\\n\\t\\ttbn2[0] *= faceDirection;\\n\\t\\ttbn2[1] *= faceDirection;\\n\\t#endif\\n#endif\\nvec3 nonPerturbedNormal = normal;\";\n\nvar normal_fragment_maps = \"#ifdef USE_NORMALMAP_OBJECTSPACE\\n\\tnormal = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\\n\\t#ifdef FLIP_SIDED\\n\\t\\tnormal = - normal;\\n\\t#endif\\n\\t#ifdef DOUBLE_SIDED\\n\\t\\tnormal = normal * faceDirection;\\n\\t#endif\\n\\tnormal = normalize( normalMatrix * normal );\\n#elif defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvec3 mapN = texture2D( normalMap, vNormalMapUv ).xyz * 2.0 - 1.0;\\n\\tmapN.xy *= normalScale;\\n\\tnormal = normalize( tbn * mapN );\\n#elif defined( USE_BUMPMAP )\\n\\tnormal = perturbNormalArb( - vViewPosition, normal, dHdxy_fwd(), faceDirection );\\n#endif\";\n\nvar normal_pars_fragment = \"#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\";\n\nvar normal_pars_vertex = \"#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n\\t#ifdef USE_TANGENT\\n\\t\\tvarying vec3 vTangent;\\n\\t\\tvarying vec3 vBitangent;\\n\\t#endif\\n#endif\";\n\nvar normal_vertex = \"#ifndef FLAT_SHADED\\n\\tvNormal = normalize( transformedNormal );\\n\\t#ifdef USE_TANGENT\\n\\t\\tvTangent = normalize( transformedTangent );\\n\\t\\tvBitangent = normalize( cross( vNormal, vTangent ) * tangent.w );\\n\\t#endif\\n#endif\";\n\nvar normalmap_pars_fragment = \"#ifdef USE_NORMALMAP\\n\\tuniform sampler2D normalMap;\\n\\tuniform vec2 normalScale;\\n#endif\\n#ifdef USE_NORMALMAP_OBJECTSPACE\\n\\tuniform mat3 normalMatrix;\\n#endif\\n#if ! defined ( USE_TANGENT ) && ( defined ( USE_NORMALMAP_TANGENTSPACE ) || defined ( USE_CLEARCOAT_NORMALMAP ) || defined( USE_ANISOTROPY ) )\\n\\tmat3 getTangentFrame( vec3 eye_pos, vec3 surf_norm, vec2 uv ) {\\n\\t\\tvec3 q0 = dFdx( eye_pos.xyz );\\n\\t\\tvec3 q1 = dFdy( eye_pos.xyz );\\n\\t\\tvec2 st0 = dFdx( uv.st );\\n\\t\\tvec2 st1 = dFdy( uv.st );\\n\\t\\tvec3 N = surf_norm;\\n\\t\\tvec3 q1perp = cross( q1, N );\\n\\t\\tvec3 q0perp = cross( N, q0 );\\n\\t\\tvec3 T = q1perp * st0.x + q0perp * st1.x;\\n\\t\\tvec3 B = q1perp * st0.y + q0perp * st1.y;\\n\\t\\tfloat det = max( dot( T, T ), dot( B, B ) );\\n\\t\\tfloat scale = ( det == 0.0 ) ? 0.0 : inversesqrt( det );\\n\\t\\treturn mat3( T * scale, B * scale, N );\\n\\t}\\n#endif\";\n\nvar clearcoat_normal_fragment_begin = \"#ifdef USE_CLEARCOAT\\n\\tvec3 clearcoatNormal = nonPerturbedNormal;\\n#endif\";\n\nvar clearcoat_normal_fragment_maps = \"#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvec3 clearcoatMapN = texture2D( clearcoatNormalMap, vClearcoatNormalMapUv ).xyz * 2.0 - 1.0;\\n\\tclearcoatMapN.xy *= clearcoatNormalScale;\\n\\tclearcoatNormal = normalize( tbn2 * clearcoatMapN );\\n#endif\";\n\nvar clearcoat_pars_fragment = \"#ifdef USE_CLEARCOATMAP\\n\\tuniform sampler2D clearcoatMap;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform sampler2D clearcoatNormalMap;\\n\\tuniform vec2 clearcoatNormalScale;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform sampler2D clearcoatRoughnessMap;\\n#endif\";\n\nvar iridescence_pars_fragment = \"#ifdef USE_IRIDESCENCEMAP\\n\\tuniform sampler2D iridescenceMap;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tuniform sampler2D iridescenceThicknessMap;\\n#endif\";\n\nvar opaque_fragment = \"#ifdef OPAQUE\\ndiffuseColor.a = 1.0;\\n#endif\\n#ifdef USE_TRANSMISSION\\ndiffuseColor.a *= material.transmissionAlpha;\\n#endif\\ngl_FragColor = vec4( outgoingLight, diffuseColor.a );\";\n\nvar packing = \"vec3 packNormalToRGB( const in vec3 normal ) {\\n\\treturn normalize( normal ) * 0.5 + 0.5;\\n}\\nvec3 unpackRGBToNormal( const in vec3 rgb ) {\\n\\treturn 2.0 * rgb.xyz - 1.0;\\n}\\nconst float PackUpscale = 256. / 255.;const float UnpackDownscale = 255. / 256.;const float ShiftRight8 = 1. / 256.;\\nconst float Inv255 = 1. / 255.;\\nconst vec4 PackFactors = vec4( 1.0, 256.0, 256.0 * 256.0, 256.0 * 256.0 * 256.0 );\\nconst vec2 UnpackFactors2 = vec2( UnpackDownscale, 1.0 / PackFactors.g );\\nconst vec3 UnpackFactors3 = vec3( UnpackDownscale / PackFactors.rg, 1.0 / PackFactors.b );\\nconst vec4 UnpackFactors4 = vec4( UnpackDownscale / PackFactors.rgb, 1.0 / PackFactors.a );\\nvec4 packDepthToRGBA( const in float v ) {\\n\\tif( v <= 0.0 )\\n\\t\\treturn vec4( 0., 0., 0., 0. );\\n\\tif( v >= 1.0 )\\n\\t\\treturn vec4( 1., 1., 1., 1. );\\n\\tfloat vuf;\\n\\tfloat af = modf( v * PackFactors.a, vuf );\\n\\tfloat bf = modf( vuf * ShiftRight8, vuf );\\n\\tfloat gf = modf( vuf * ShiftRight8, vuf );\\n\\treturn vec4( vuf * Inv255, gf * PackUpscale, bf * PackUpscale, af );\\n}\\nvec3 packDepthToRGB( const in float v ) {\\n\\tif( v <= 0.0 )\\n\\t\\treturn vec3( 0., 0., 0. );\\n\\tif( v >= 1.0 )\\n\\t\\treturn vec3( 1., 1., 1. );\\n\\tfloat vuf;\\n\\tfloat bf = modf( v * PackFactors.b, vuf );\\n\\tfloat gf = modf( vuf * ShiftRight8, vuf );\\n\\treturn vec3( vuf * Inv255, gf * PackUpscale, bf );\\n}\\nvec2 packDepthToRG( const in float v ) {\\n\\tif( v <= 0.0 )\\n\\t\\treturn vec2( 0., 0. );\\n\\tif( v >= 1.0 )\\n\\t\\treturn vec2( 1., 1. );\\n\\tfloat vuf;\\n\\tfloat gf = modf( v * 256., vuf );\\n\\treturn vec2( vuf * Inv255, gf );\\n}\\nfloat unpackRGBAToDepth( const in vec4 v ) {\\n\\treturn dot( v, UnpackFactors4 );\\n}\\nfloat unpackRGBToDepth( const in vec3 v ) {\\n\\treturn dot( v, UnpackFactors3 );\\n}\\nfloat unpackRGToDepth( const in vec2 v ) {\\n\\treturn v.r * UnpackFactors2.r + v.g * UnpackFactors2.g;\\n}\\nvec4 pack2HalfToRGBA( const in vec2 v ) {\\n\\tvec4 r = vec4( v.x, fract( v.x * 255.0 ), v.y, fract( v.y * 255.0 ) );\\n\\treturn vec4( r.x - r.y / 255.0, r.y, r.z - r.w / 255.0, r.w );\\n}\\nvec2 unpackRGBATo2Half( const in vec4 v ) {\\n\\treturn vec2( v.x + ( v.y / 255.0 ), v.z + ( v.w / 255.0 ) );\\n}\\nfloat viewZToOrthographicDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( viewZ + near ) / ( near - far );\\n}\\nfloat orthographicDepthToViewZ( const in float depth, const in float near, const in float far ) {\\n\\treturn depth * ( near - far ) - near;\\n}\\nfloat viewZToPerspectiveDepth( const in float viewZ, const in float near, const in float far ) {\\n\\treturn ( ( near + viewZ ) * far ) / ( ( far - near ) * viewZ );\\n}\\nfloat perspectiveDepthToViewZ( const in float depth, const in float near, const in float far ) {\\n\\treturn ( near * far ) / ( ( far - near ) * depth - far );\\n}\";\n\nvar premultiplied_alpha_fragment = \"#ifdef PREMULTIPLIED_ALPHA\\n\\tgl_FragColor.rgb *= gl_FragColor.a;\\n#endif\";\n\nvar project_vertex = \"vec4 mvPosition = vec4( transformed, 1.0 );\\n#ifdef USE_BATCHING\\n\\tmvPosition = batchingMatrix * mvPosition;\\n#endif\\n#ifdef USE_INSTANCING\\n\\tmvPosition = instanceMatrix * mvPosition;\\n#endif\\nmvPosition = modelViewMatrix * mvPosition;\\ngl_Position = projectionMatrix * mvPosition;\";\n\nvar dithering_fragment = \"#ifdef DITHERING\\n\\tgl_FragColor.rgb = dithering( gl_FragColor.rgb );\\n#endif\";\n\nvar dithering_pars_fragment = \"#ifdef DITHERING\\n\\tvec3 dithering( vec3 color ) {\\n\\t\\tfloat grid_position = rand( gl_FragCoord.xy );\\n\\t\\tvec3 dither_shift_RGB = vec3( 0.25 / 255.0, -0.25 / 255.0, 0.25 / 255.0 );\\n\\t\\tdither_shift_RGB = mix( 2.0 * dither_shift_RGB, -2.0 * dither_shift_RGB, grid_position );\\n\\t\\treturn color + dither_shift_RGB;\\n\\t}\\n#endif\";\n\nvar roughnessmap_fragment = \"float roughnessFactor = roughness;\\n#ifdef USE_ROUGHNESSMAP\\n\\tvec4 texelRoughness = texture2D( roughnessMap, vRoughnessMapUv );\\n\\troughnessFactor *= texelRoughness.g;\\n#endif\";\n\nvar roughnessmap_pars_fragment = \"#ifdef USE_ROUGHNESSMAP\\n\\tuniform sampler2D roughnessMap;\\n#endif\";\n\nvar shadowmap_pars_fragment = \"#if NUM_SPOT_LIGHT_COORDS > 0\\n\\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\\n#endif\\n#if NUM_SPOT_LIGHT_MAPS > 0\\n\\tuniform sampler2D spotLightMap[ NUM_SPOT_LIGHT_MAPS ];\\n#endif\\n#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tuniform sampler2DShadow directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\t#else\\n\\t\\t\\tuniform sampler2D directionalShadowMap[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\t#endif\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tuniform sampler2DShadow spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\t#else\\n\\t\\t\\tuniform sampler2D spotShadowMap[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t\\t#endif\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\t\\tuniform samplerCubeShadow pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\t#elif defined( SHADOWMAP_TYPE_BASIC )\\n\\t\\t\\tuniform samplerCube pointShadowMap[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\t#endif\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\tfloat interleavedGradientNoise( vec2 position ) {\\n\\t\\t\\treturn fract( 52.9829189 * fract( dot( position, vec2( 0.06711056, 0.00583715 ) ) ) );\\n\\t\\t}\\n\\t\\tvec2 vogelDiskSample( int sampleIndex, int samplesCount, float phi ) {\\n\\t\\t\\tconst float goldenAngle = 2.399963229728653;\\n\\t\\t\\tfloat r = sqrt( ( float( sampleIndex ) + 0.5 ) / float( samplesCount ) );\\n\\t\\t\\tfloat theta = float( sampleIndex ) * goldenAngle + phi;\\n\\t\\t\\treturn vec2( cos( theta ), sin( theta ) ) * r;\\n\\t\\t}\\n\\t#endif\\n\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\t\\tfloat getShadow( sampler2DShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\t\\tfloat shadow = 1.0;\\n\\t\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\t\\tshadowCoord.z += shadowBias;\\n\\t\\t\\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\\n\\t\\t\\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\\n\\t\\t\\tif ( frustumTest ) {\\n\\t\\t\\t\\tvec2 texelSize = vec2( 1.0 ) / shadowMapSize;\\n\\t\\t\\t\\tfloat radius = shadowRadius * texelSize.x;\\n\\t\\t\\t\\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * 6.28318530718;\\n\\t\\t\\t\\tshadow = (\\n\\t\\t\\t\\t\\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 0, 5, phi ) * radius, shadowCoord.z ) ) +\\n\\t\\t\\t\\t\\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 1, 5, phi ) * radius, shadowCoord.z ) ) +\\n\\t\\t\\t\\t\\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 2, 5, phi ) * radius, shadowCoord.z ) ) +\\n\\t\\t\\t\\t\\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 3, 5, phi ) * radius, shadowCoord.z ) ) +\\n\\t\\t\\t\\t\\ttexture( shadowMap, vec3( shadowCoord.xy + vogelDiskSample( 4, 5, phi ) * radius, shadowCoord.z ) )\\n\\t\\t\\t\\t) * 0.2;\\n\\t\\t\\t}\\n\\t\\t\\treturn mix( 1.0, shadow, shadowIntensity );\\n\\t\\t}\\n\\t#elif defined( SHADOWMAP_TYPE_VSM )\\n\\t\\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\t\\tfloat shadow = 1.0;\\n\\t\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\t\\tshadowCoord.z += shadowBias;\\n\\t\\t\\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\\n\\t\\t\\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\\n\\t\\t\\tif ( frustumTest ) {\\n\\t\\t\\t\\tvec2 distribution = texture2D( shadowMap, shadowCoord.xy ).rg;\\n\\t\\t\\t\\tfloat mean = distribution.x;\\n\\t\\t\\t\\tfloat variance = distribution.y * distribution.y;\\n\\t\\t\\t\\t#ifdef USE_REVERSED_DEPTH_BUFFER\\n\\t\\t\\t\\t\\tfloat hard_shadow = step( mean, shadowCoord.z );\\n\\t\\t\\t\\t#else\\n\\t\\t\\t\\t\\tfloat hard_shadow = step( shadowCoord.z, mean );\\n\\t\\t\\t\\t#endif\\n\\t\\t\\t\\tif ( hard_shadow == 1.0 ) {\\n\\t\\t\\t\\t\\tshadow = 1.0;\\n\\t\\t\\t\\t} else {\\n\\t\\t\\t\\t\\tvariance = max( variance, 0.0000001 );\\n\\t\\t\\t\\t\\tfloat d = shadowCoord.z - mean;\\n\\t\\t\\t\\t\\tfloat p_max = variance / ( variance + d * d );\\n\\t\\t\\t\\t\\tp_max = clamp( ( p_max - 0.3 ) / 0.65, 0.0, 1.0 );\\n\\t\\t\\t\\t\\tshadow = max( hard_shadow, p_max );\\n\\t\\t\\t\\t}\\n\\t\\t\\t}\\n\\t\\t\\treturn mix( 1.0, shadow, shadowIntensity );\\n\\t\\t}\\n\\t#else\\n\\t\\tfloat getShadow( sampler2D shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord ) {\\n\\t\\t\\tfloat shadow = 1.0;\\n\\t\\t\\tshadowCoord.xyz /= shadowCoord.w;\\n\\t\\t\\tshadowCoord.z += shadowBias;\\n\\t\\t\\tbool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\\n\\t\\t\\tbool frustumTest = inFrustum && shadowCoord.z <= 1.0;\\n\\t\\t\\tif ( frustumTest ) {\\n\\t\\t\\t\\tfloat depth = texture2D( shadowMap, shadowCoord.xy ).r;\\n\\t\\t\\t\\t#ifdef USE_REVERSED_DEPTH_BUFFER\\n\\t\\t\\t\\t\\tshadow = step( depth, shadowCoord.z );\\n\\t\\t\\t\\t#else\\n\\t\\t\\t\\t\\tshadow = step( shadowCoord.z, depth );\\n\\t\\t\\t\\t#endif\\n\\t\\t\\t}\\n\\t\\t\\treturn mix( 1.0, shadow, shadowIntensity );\\n\\t\\t}\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t#if defined( SHADOWMAP_TYPE_PCF )\\n\\tfloat getPointShadow( samplerCubeShadow shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tvec3 lightToPosition = shadowCoord.xyz;\\n\\t\\tvec3 bd3D = normalize( lightToPosition );\\n\\t\\tvec3 absVec = abs( lightToPosition );\\n\\t\\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\\n\\t\\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\\n\\t\\t\\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\\n\\t\\t\\tdp += shadowBias;\\n\\t\\t\\tfloat texelSize = shadowRadius / shadowMapSize.x;\\n\\t\\t\\tvec3 absDir = abs( bd3D );\\n\\t\\t\\tvec3 tangent = absDir.x > absDir.z ? vec3( 0.0, 1.0, 0.0 ) : vec3( 1.0, 0.0, 0.0 );\\n\\t\\t\\ttangent = normalize( cross( bd3D, tangent ) );\\n\\t\\t\\tvec3 bitangent = cross( bd3D, tangent );\\n\\t\\t\\tfloat phi = interleavedGradientNoise( gl_FragCoord.xy ) * 6.28318530718;\\n\\t\\t\\tshadow = (\\n\\t\\t\\t\\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 0, 5, phi ).x + bitangent * vogelDiskSample( 0, 5, phi ).y ) * texelSize, dp ) ) +\\n\\t\\t\\t\\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 1, 5, phi ).x + bitangent * vogelDiskSample( 1, 5, phi ).y ) * texelSize, dp ) ) +\\n\\t\\t\\t\\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 2, 5, phi ).x + bitangent * vogelDiskSample( 2, 5, phi ).y ) * texelSize, dp ) ) +\\n\\t\\t\\t\\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 3, 5, phi ).x + bitangent * vogelDiskSample( 3, 5, phi ).y ) * texelSize, dp ) ) +\\n\\t\\t\\t\\ttexture( shadowMap, vec4( bd3D + ( tangent * vogelDiskSample( 4, 5, phi ).x + bitangent * vogelDiskSample( 4, 5, phi ).y ) * texelSize, dp ) )\\n\\t\\t\\t) * 0.2;\\n\\t\\t}\\n\\t\\treturn mix( 1.0, shadow, shadowIntensity );\\n\\t}\\n\\t#elif defined( SHADOWMAP_TYPE_BASIC )\\n\\tfloat getPointShadow( samplerCube shadowMap, vec2 shadowMapSize, float shadowIntensity, float shadowBias, float shadowRadius, vec4 shadowCoord, float shadowCameraNear, float shadowCameraFar ) {\\n\\t\\tfloat shadow = 1.0;\\n\\t\\tvec3 lightToPosition = shadowCoord.xyz;\\n\\t\\tvec3 bd3D = normalize( lightToPosition );\\n\\t\\tvec3 absVec = abs( lightToPosition );\\n\\t\\tfloat viewSpaceZ = max( max( absVec.x, absVec.y ), absVec.z );\\n\\t\\tif ( viewSpaceZ - shadowCameraFar <= 0.0 && viewSpaceZ - shadowCameraNear >= 0.0 ) {\\n\\t\\t\\tfloat dp = ( shadowCameraFar * ( viewSpaceZ - shadowCameraNear ) ) / ( viewSpaceZ * ( shadowCameraFar - shadowCameraNear ) );\\n\\t\\t\\tdp += shadowBias;\\n\\t\\t\\tfloat depth = textureCube( shadowMap, bd3D ).r;\\n\\t\\t\\t#ifdef USE_REVERSED_DEPTH_BUFFER\\n\\t\\t\\t\\tshadow = step( depth, dp );\\n\\t\\t\\t#else\\n\\t\\t\\t\\tshadow = step( dp, depth );\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\t\\treturn mix( 1.0, shadow, shadowIntensity );\\n\\t}\\n\\t#endif\\n\\t#endif\\n#endif\";\n\nvar shadowmap_pars_vertex = \"#if NUM_SPOT_LIGHT_COORDS > 0\\n\\tuniform mat4 spotLightMatrix[ NUM_SPOT_LIGHT_COORDS ];\\n\\tvarying vec4 vSpotLightCoord[ NUM_SPOT_LIGHT_COORDS ];\\n#endif\\n#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 directionalShadowMatrix[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vDirectionalShadowCoord[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t\\tstruct DirectionalLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform DirectionalLightShadow directionalLightShadows[ NUM_DIR_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\t\\tstruct SpotLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t};\\n\\t\\tuniform SpotLightShadow spotLightShadows[ NUM_SPOT_LIGHT_SHADOWS ];\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\tuniform mat4 pointShadowMatrix[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tvarying vec4 vPointShadowCoord[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t\\tstruct PointLightShadow {\\n\\t\\t\\tfloat shadowIntensity;\\n\\t\\t\\tfloat shadowBias;\\n\\t\\t\\tfloat shadowNormalBias;\\n\\t\\t\\tfloat shadowRadius;\\n\\t\\t\\tvec2 shadowMapSize;\\n\\t\\t\\tfloat shadowCameraNear;\\n\\t\\t\\tfloat shadowCameraFar;\\n\\t\\t};\\n\\t\\tuniform PointLightShadow pointLightShadows[ NUM_POINT_LIGHT_SHADOWS ];\\n\\t#endif\\n#endif\";\n\nvar shadowmap_vertex = \"#if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )\\n\\tvec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );\\n\\tvec4 shadowWorldPosition;\\n#endif\\n#if defined( USE_SHADOWMAP )\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * directionalLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\t\\tvDirectionalShadowCoord[ i ] = directionalShadowMatrix[ i ] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0\\n\\t\\t#pragma unroll_loop_start\\n\\t\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\t\\tshadowWorldPosition = worldPosition + vec4( shadowWorldNormal * pointLightShadows[ i ].shadowNormalBias, 0 );\\n\\t\\t\\tvPointShadowCoord[ i ] = pointShadowMatrix[ i ] * shadowWorldPosition;\\n\\t\\t}\\n\\t\\t#pragma unroll_loop_end\\n\\t#endif\\n#endif\\n#if NUM_SPOT_LIGHT_COORDS > 0\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_COORDS; i ++ ) {\\n\\t\\tshadowWorldPosition = worldPosition;\\n\\t\\t#if ( defined( USE_SHADOWMAP ) && UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\\n\\t\\t\\tshadowWorldPosition.xyz += shadowWorldNormal * spotLightShadows[ i ].shadowNormalBias;\\n\\t\\t#endif\\n\\t\\tvSpotLightCoord[ i ] = spotLightMatrix[ i ] * shadowWorldPosition;\\n\\t}\\n\\t#pragma unroll_loop_end\\n#endif\";\n\nvar shadowmask_pars_fragment = \"float getShadowMask() {\\n\\tfloat shadow = 1.0;\\n\\t#ifdef USE_SHADOWMAP\\n\\t#if NUM_DIR_LIGHT_SHADOWS > 0\\n\\tDirectionalLightShadow directionalLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_DIR_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tdirectionalLight = directionalLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( directionalShadowMap[ i ], directionalLight.shadowMapSize, directionalLight.shadowIntensity, directionalLight.shadowBias, directionalLight.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_SPOT_LIGHT_SHADOWS > 0\\n\\tSpotLightShadow spotLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_SPOT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tspotLight = spotLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getShadow( spotShadowMap[ i ], spotLight.shadowMapSize, spotLight.shadowIntensity, spotLight.shadowBias, spotLight.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#if NUM_POINT_LIGHT_SHADOWS > 0 && ( defined( SHADOWMAP_TYPE_PCF ) || defined( SHADOWMAP_TYPE_BASIC ) )\\n\\tPointLightShadow pointLight;\\n\\t#pragma unroll_loop_start\\n\\tfor ( int i = 0; i < NUM_POINT_LIGHT_SHADOWS; i ++ ) {\\n\\t\\tpointLight = pointLightShadows[ i ];\\n\\t\\tshadow *= receiveShadow ? getPointShadow( pointShadowMap[ i ], pointLight.shadowMapSize, pointLight.shadowIntensity, pointLight.shadowBias, pointLight.shadowRadius, vPointShadowCoord[ i ], pointLight.shadowCameraNear, pointLight.shadowCameraFar ) : 1.0;\\n\\t}\\n\\t#pragma unroll_loop_end\\n\\t#endif\\n\\t#endif\\n\\treturn shadow;\\n}\";\n\nvar skinbase_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 boneMatX = getBoneMatrix( skinIndex.x );\\n\\tmat4 boneMatY = getBoneMatrix( skinIndex.y );\\n\\tmat4 boneMatZ = getBoneMatrix( skinIndex.z );\\n\\tmat4 boneMatW = getBoneMatrix( skinIndex.w );\\n#endif\";\n\nvar skinning_pars_vertex = \"#ifdef USE_SKINNING\\n\\tuniform mat4 bindMatrix;\\n\\tuniform mat4 bindMatrixInverse;\\n\\tuniform highp sampler2D boneTexture;\\n\\tmat4 getBoneMatrix( const in float i ) {\\n\\t\\tint size = textureSize( boneTexture, 0 ).x;\\n\\t\\tint j = int( i ) * 4;\\n\\t\\tint x = j % size;\\n\\t\\tint y = j / size;\\n\\t\\tvec4 v1 = texelFetch( boneTexture, ivec2( x, y ), 0 );\\n\\t\\tvec4 v2 = texelFetch( boneTexture, ivec2( x + 1, y ), 0 );\\n\\t\\tvec4 v3 = texelFetch( boneTexture, ivec2( x + 2, y ), 0 );\\n\\t\\tvec4 v4 = texelFetch( boneTexture, ivec2( x + 3, y ), 0 );\\n\\t\\treturn mat4( v1, v2, v3, v4 );\\n\\t}\\n#endif\";\n\nvar skinning_vertex = \"#ifdef USE_SKINNING\\n\\tvec4 skinVertex = bindMatrix * vec4( transformed, 1.0 );\\n\\tvec4 skinned = vec4( 0.0 );\\n\\tskinned += boneMatX * skinVertex * skinWeight.x;\\n\\tskinned += boneMatY * skinVertex * skinWeight.y;\\n\\tskinned += boneMatZ * skinVertex * skinWeight.z;\\n\\tskinned += boneMatW * skinVertex * skinWeight.w;\\n\\ttransformed = ( bindMatrixInverse * skinned ).xyz;\\n#endif\";\n\nvar skinnormal_vertex = \"#ifdef USE_SKINNING\\n\\tmat4 skinMatrix = mat4( 0.0 );\\n\\tskinMatrix += skinWeight.x * boneMatX;\\n\\tskinMatrix += skinWeight.y * boneMatY;\\n\\tskinMatrix += skinWeight.z * boneMatZ;\\n\\tskinMatrix += skinWeight.w * boneMatW;\\n\\tskinMatrix = bindMatrixInverse * skinMatrix * bindMatrix;\\n\\tobjectNormal = vec4( skinMatrix * vec4( objectNormal, 0.0 ) ).xyz;\\n\\t#ifdef USE_TANGENT\\n\\t\\tobjectTangent = vec4( skinMatrix * vec4( objectTangent, 0.0 ) ).xyz;\\n\\t#endif\\n#endif\";\n\nvar specularmap_fragment = \"float specularStrength;\\n#ifdef USE_SPECULARMAP\\n\\tvec4 texelSpecular = texture2D( specularMap, vSpecularMapUv );\\n\\tspecularStrength = texelSpecular.r;\\n#else\\n\\tspecularStrength = 1.0;\\n#endif\";\n\nvar specularmap_pars_fragment = \"#ifdef USE_SPECULARMAP\\n\\tuniform sampler2D specularMap;\\n#endif\";\n\nvar tonemapping_fragment = \"#if defined( TONE_MAPPING )\\n\\tgl_FragColor.rgb = toneMapping( gl_FragColor.rgb );\\n#endif\";\n\nvar tonemapping_pars_fragment = \"#ifndef saturate\\n#define saturate( a ) clamp( a, 0.0, 1.0 )\\n#endif\\nuniform float toneMappingExposure;\\nvec3 LinearToneMapping( vec3 color ) {\\n\\treturn saturate( toneMappingExposure * color );\\n}\\nvec3 ReinhardToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\treturn saturate( color / ( vec3( 1.0 ) + color ) );\\n}\\nvec3 CineonToneMapping( vec3 color ) {\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = max( vec3( 0.0 ), color - 0.004 );\\n\\treturn pow( ( color * ( 6.2 * color + 0.5 ) ) / ( color * ( 6.2 * color + 1.7 ) + 0.06 ), vec3( 2.2 ) );\\n}\\nvec3 RRTAndODTFit( vec3 v ) {\\n\\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\\n\\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\\n\\treturn a / b;\\n}\\nvec3 ACESFilmicToneMapping( vec3 color ) {\\n\\tconst mat3 ACESInputMat = mat3(\\n\\t\\tvec3( 0.59719, 0.07600, 0.02840 ),\\t\\tvec3( 0.35458, 0.90834, 0.13383 ),\\n\\t\\tvec3( 0.04823, 0.01566, 0.83777 )\\n\\t);\\n\\tconst mat3 ACESOutputMat = mat3(\\n\\t\\tvec3(  1.60475, -0.10208, -0.00327 ),\\t\\tvec3( -0.53108,  1.10813, -0.07276 ),\\n\\t\\tvec3( -0.07367, -0.00605,  1.07602 )\\n\\t);\\n\\tcolor *= toneMappingExposure / 0.6;\\n\\tcolor = ACESInputMat * color;\\n\\tcolor = RRTAndODTFit( color );\\n\\tcolor = ACESOutputMat * color;\\n\\treturn saturate( color );\\n}\\nconst mat3 LINEAR_REC2020_TO_LINEAR_SRGB = mat3(\\n\\tvec3( 1.6605, - 0.1246, - 0.0182 ),\\n\\tvec3( - 0.5876, 1.1329, - 0.1006 ),\\n\\tvec3( - 0.0728, - 0.0083, 1.1187 )\\n);\\nconst mat3 LINEAR_SRGB_TO_LINEAR_REC2020 = mat3(\\n\\tvec3( 0.6274, 0.0691, 0.0164 ),\\n\\tvec3( 0.3293, 0.9195, 0.0880 ),\\n\\tvec3( 0.0433, 0.0113, 0.8956 )\\n);\\nvec3 agxDefaultContrastApprox( vec3 x ) {\\n\\tvec3 x2 = x * x;\\n\\tvec3 x4 = x2 * x2;\\n\\treturn + 15.5 * x4 * x2\\n\\t\\t- 40.14 * x4 * x\\n\\t\\t+ 31.96 * x4\\n\\t\\t- 6.868 * x2 * x\\n\\t\\t+ 0.4298 * x2\\n\\t\\t+ 0.1191 * x\\n\\t\\t- 0.00232;\\n}\\nvec3 AgXToneMapping( vec3 color ) {\\n\\tconst mat3 AgXInsetMatrix = mat3(\\n\\t\\tvec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ),\\n\\t\\tvec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ),\\n\\t\\tvec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 )\\n\\t);\\n\\tconst mat3 AgXOutsetMatrix = mat3(\\n\\t\\tvec3( 1.1271005818144368, - 0.1413297634984383, - 0.14132976349843826 ),\\n\\t\\tvec3( - 0.11060664309660323, 1.157823702216272, - 0.11060664309660294 ),\\n\\t\\tvec3( - 0.016493938717834573, - 0.016493938717834257, 1.2519364065950405 )\\n\\t);\\n\\tconst float AgxMinEv = - 12.47393;\\tconst float AgxMaxEv = 4.026069;\\n\\tcolor *= toneMappingExposure;\\n\\tcolor = LINEAR_SRGB_TO_LINEAR_REC2020 * color;\\n\\tcolor = AgXInsetMatrix * color;\\n\\tcolor = max( color, 1e-10 );\\tcolor = log2( color );\\n\\tcolor = ( color - AgxMinEv ) / ( AgxMaxEv - AgxMinEv );\\n\\tcolor = clamp( color, 0.0, 1.0 );\\n\\tcolor = agxDefaultContrastApprox( color );\\n\\tcolor = AgXOutsetMatrix * color;\\n\\tcolor = pow( max( vec3( 0.0 ), color ), vec3( 2.2 ) );\\n\\tcolor = LINEAR_REC2020_TO_LINEAR_SRGB * color;\\n\\tcolor = clamp( color, 0.0, 1.0 );\\n\\treturn color;\\n}\\nvec3 NeutralToneMapping( vec3 color ) {\\n\\tconst float StartCompression = 0.8 - 0.04;\\n\\tconst float Desaturation = 0.15;\\n\\tcolor *= toneMappingExposure;\\n\\tfloat x = min( color.r, min( color.g, color.b ) );\\n\\tfloat offset = x < 0.08 ? x - 6.25 * x * x : 0.04;\\n\\tcolor -= offset;\\n\\tfloat peak = max( color.r, max( color.g, color.b ) );\\n\\tif ( peak < StartCompression ) return color;\\n\\tfloat d = 1. - StartCompression;\\n\\tfloat newPeak = 1. - d * d / ( peak + d - StartCompression );\\n\\tcolor *= newPeak / peak;\\n\\tfloat g = 1. - 1. / ( Desaturation * ( peak - newPeak ) + 1. );\\n\\treturn mix( color, vec3( newPeak ), g );\\n}\\nvec3 CustomToneMapping( vec3 color ) { return color; }\";\n\nvar transmission_fragment = \"#ifdef USE_TRANSMISSION\\n\\tmaterial.transmission = transmission;\\n\\tmaterial.transmissionAlpha = 1.0;\\n\\tmaterial.thickness = thickness;\\n\\tmaterial.attenuationDistance = attenuationDistance;\\n\\tmaterial.attenuationColor = attenuationColor;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\tmaterial.transmission *= texture2D( transmissionMap, vTransmissionMapUv ).r;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tmaterial.thickness *= texture2D( thicknessMap, vThicknessMapUv ).g;\\n\\t#endif\\n\\tvec3 pos = vWorldPosition;\\n\\tvec3 v = normalize( cameraPosition - pos );\\n\\tvec3 n = inverseTransformDirection( normal, viewMatrix );\\n\\tvec4 transmitted = getIBLVolumeRefraction(\\n\\t\\tn, v, material.roughness, material.diffuseContribution, material.specularColorBlended, material.specularF90,\\n\\t\\tpos, modelMatrix, viewMatrix, projectionMatrix, material.dispersion, material.ior, material.thickness,\\n\\t\\tmaterial.attenuationColor, material.attenuationDistance );\\n\\tmaterial.transmissionAlpha = mix( material.transmissionAlpha, transmitted.a, material.transmission );\\n\\ttotalDiffuse = mix( totalDiffuse, transmitted.rgb, material.transmission );\\n#endif\";\n\nvar transmission_pars_fragment = \"#ifdef USE_TRANSMISSION\\n\\tuniform float transmission;\\n\\tuniform float thickness;\\n\\tuniform float attenuationDistance;\\n\\tuniform vec3 attenuationColor;\\n\\t#ifdef USE_TRANSMISSIONMAP\\n\\t\\tuniform sampler2D transmissionMap;\\n\\t#endif\\n\\t#ifdef USE_THICKNESSMAP\\n\\t\\tuniform sampler2D thicknessMap;\\n\\t#endif\\n\\tuniform vec2 transmissionSamplerSize;\\n\\tuniform sampler2D transmissionSamplerMap;\\n\\tuniform mat4 modelMatrix;\\n\\tuniform mat4 projectionMatrix;\\n\\tvarying vec3 vWorldPosition;\\n\\tfloat w0( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - a + 3.0 ) - 3.0 ) + 1.0 );\\n\\t}\\n\\tfloat w1( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a *  a * ( 3.0 * a - 6.0 ) + 4.0 );\\n\\t}\\n\\tfloat w2( float a ){\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * ( a * ( - 3.0 * a + 3.0 ) + 3.0 ) + 1.0 );\\n\\t}\\n\\tfloat w3( float a ) {\\n\\t\\treturn ( 1.0 / 6.0 ) * ( a * a * a );\\n\\t}\\n\\tfloat g0( float a ) {\\n\\t\\treturn w0( a ) + w1( a );\\n\\t}\\n\\tfloat g1( float a ) {\\n\\t\\treturn w2( a ) + w3( a );\\n\\t}\\n\\tfloat h0( float a ) {\\n\\t\\treturn - 1.0 + w1( a ) / ( w0( a ) + w1( a ) );\\n\\t}\\n\\tfloat h1( float a ) {\\n\\t\\treturn 1.0 + w3( a ) / ( w2( a ) + w3( a ) );\\n\\t}\\n\\tvec4 bicubic( sampler2D tex, vec2 uv, vec4 texelSize, float lod ) {\\n\\t\\tuv = uv * texelSize.zw + 0.5;\\n\\t\\tvec2 iuv = floor( uv );\\n\\t\\tvec2 fuv = fract( uv );\\n\\t\\tfloat g0x = g0( fuv.x );\\n\\t\\tfloat g1x = g1( fuv.x );\\n\\t\\tfloat h0x = h0( fuv.x );\\n\\t\\tfloat h1x = h1( fuv.x );\\n\\t\\tfloat h0y = h0( fuv.y );\\n\\t\\tfloat h1y = h1( fuv.y );\\n\\t\\tvec2 p0 = ( vec2( iuv.x + h0x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p1 = ( vec2( iuv.x + h1x, iuv.y + h0y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p2 = ( vec2( iuv.x + h0x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\\n\\t\\tvec2 p3 = ( vec2( iuv.x + h1x, iuv.y + h1y ) - 0.5 ) * texelSize.xy;\\n\\t\\treturn g0( fuv.y ) * ( g0x * textureLod( tex, p0, lod ) + g1x * textureLod( tex, p1, lod ) ) +\\n\\t\\t\\tg1( fuv.y ) * ( g0x * textureLod( tex, p2, lod ) + g1x * textureLod( tex, p3, lod ) );\\n\\t}\\n\\tvec4 textureBicubic( sampler2D sampler, vec2 uv, float lod ) {\\n\\t\\tvec2 fLodSize = vec2( textureSize( sampler, int( lod ) ) );\\n\\t\\tvec2 cLodSize = vec2( textureSize( sampler, int( lod + 1.0 ) ) );\\n\\t\\tvec2 fLodSizeInv = 1.0 / fLodSize;\\n\\t\\tvec2 cLodSizeInv = 1.0 / cLodSize;\\n\\t\\tvec4 fSample = bicubic( sampler, uv, vec4( fLodSizeInv, fLodSize ), floor( lod ) );\\n\\t\\tvec4 cSample = bicubic( sampler, uv, vec4( cLodSizeInv, cLodSize ), ceil( lod ) );\\n\\t\\treturn mix( fSample, cSample, fract( lod ) );\\n\\t}\\n\\tvec3 getVolumeTransmissionRay( const in vec3 n, const in vec3 v, const in float thickness, const in float ior, const in mat4 modelMatrix ) {\\n\\t\\tvec3 refractionVector = refract( - v, normalize( n ), 1.0 / ior );\\n\\t\\tvec3 modelScale;\\n\\t\\tmodelScale.x = length( vec3( modelMatrix[ 0 ].xyz ) );\\n\\t\\tmodelScale.y = length( vec3( modelMatrix[ 1 ].xyz ) );\\n\\t\\tmodelScale.z = length( vec3( modelMatrix[ 2 ].xyz ) );\\n\\t\\treturn normalize( refractionVector ) * thickness * modelScale;\\n\\t}\\n\\tfloat applyIorToRoughness( const in float roughness, const in float ior ) {\\n\\t\\treturn roughness * clamp( ior * 2.0 - 2.0, 0.0, 1.0 );\\n\\t}\\n\\tvec4 getTransmissionSample( const in vec2 fragCoord, const in float roughness, const in float ior ) {\\n\\t\\tfloat lod = log2( transmissionSamplerSize.x ) * applyIorToRoughness( roughness, ior );\\n\\t\\treturn textureBicubic( transmissionSamplerMap, fragCoord.xy, lod );\\n\\t}\\n\\tvec3 volumeAttenuation( const in float transmissionDistance, const in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tif ( isinf( attenuationDistance ) ) {\\n\\t\\t\\treturn vec3( 1.0 );\\n\\t\\t} else {\\n\\t\\t\\tvec3 attenuationCoefficient = -log( attenuationColor ) / attenuationDistance;\\n\\t\\t\\tvec3 transmittance = exp( - attenuationCoefficient * transmissionDistance );\\t\\t\\treturn transmittance;\\n\\t\\t}\\n\\t}\\n\\tvec4 getIBLVolumeRefraction( const in vec3 n, const in vec3 v, const in float roughness, const in vec3 diffuseColor,\\n\\t\\tconst in vec3 specularColor, const in float specularF90, const in vec3 position, const in mat4 modelMatrix,\\n\\t\\tconst in mat4 viewMatrix, const in mat4 projMatrix, const in float dispersion, const in float ior, const in float thickness,\\n\\t\\tconst in vec3 attenuationColor, const in float attenuationDistance ) {\\n\\t\\tvec4 transmittedLight;\\n\\t\\tvec3 transmittance;\\n\\t\\t#ifdef USE_DISPERSION\\n\\t\\t\\tfloat halfSpread = ( ior - 1.0 ) * 0.025 * dispersion;\\n\\t\\t\\tvec3 iors = vec3( ior - halfSpread, ior, ior + halfSpread );\\n\\t\\t\\tfor ( int i = 0; i < 3; i ++ ) {\\n\\t\\t\\t\\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, iors[ i ], modelMatrix );\\n\\t\\t\\t\\tvec3 refractedRayExit = position + transmissionRay;\\n\\t\\t\\t\\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\\n\\t\\t\\t\\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\\n\\t\\t\\t\\trefractionCoords += 1.0;\\n\\t\\t\\t\\trefractionCoords /= 2.0;\\n\\t\\t\\t\\tvec4 transmissionSample = getTransmissionSample( refractionCoords, roughness, iors[ i ] );\\n\\t\\t\\t\\ttransmittedLight[ i ] = transmissionSample[ i ];\\n\\t\\t\\t\\ttransmittedLight.a += transmissionSample.a;\\n\\t\\t\\t\\ttransmittance[ i ] = diffuseColor[ i ] * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance )[ i ];\\n\\t\\t\\t}\\n\\t\\t\\ttransmittedLight.a /= 3.0;\\n\\t\\t#else\\n\\t\\t\\tvec3 transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\\n\\t\\t\\tvec3 refractedRayExit = position + transmissionRay;\\n\\t\\t\\tvec4 ndcPos = projMatrix * viewMatrix * vec4( refractedRayExit, 1.0 );\\n\\t\\t\\tvec2 refractionCoords = ndcPos.xy / ndcPos.w;\\n\\t\\t\\trefractionCoords += 1.0;\\n\\t\\t\\trefractionCoords /= 2.0;\\n\\t\\t\\ttransmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\\n\\t\\t\\ttransmittance = diffuseColor * volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance );\\n\\t\\t#endif\\n\\t\\tvec3 attenuatedColor = transmittance * transmittedLight.rgb;\\n\\t\\tvec3 F = EnvironmentBRDF( n, v, specularColor, specularF90, roughness );\\n\\t\\tfloat transmittanceFactor = ( transmittance.r + transmittance.g + transmittance.b ) / 3.0;\\n\\t\\treturn vec4( ( 1.0 - F ) * attenuatedColor, 1.0 - ( 1.0 - transmittedLight.a ) * transmittanceFactor );\\n\\t}\\n#endif\";\n\nvar uv_pars_fragment = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvarying vec2 vUv;\\n#endif\\n#ifdef USE_MAP\\n\\tvarying vec2 vMapUv;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tvarying vec2 vAlphaMapUv;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tvarying vec2 vLightMapUv;\\n#endif\\n#ifdef USE_AOMAP\\n\\tvarying vec2 vAoMapUv;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tvarying vec2 vBumpMapUv;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tvarying vec2 vNormalMapUv;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tvarying vec2 vEmissiveMapUv;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tvarying vec2 vMetalnessMapUv;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tvarying vec2 vRoughnessMapUv;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tvarying vec2 vAnisotropyMapUv;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tvarying vec2 vClearcoatMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvarying vec2 vClearcoatNormalMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tvarying vec2 vClearcoatRoughnessMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tvarying vec2 vIridescenceMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tvarying vec2 vIridescenceThicknessMapUv;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tvarying vec2 vSheenColorMapUv;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tvarying vec2 vSheenRoughnessMapUv;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tvarying vec2 vSpecularMapUv;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tvarying vec2 vSpecularColorMapUv;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tvarying vec2 vSpecularIntensityMapUv;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tuniform mat3 transmissionMapTransform;\\n\\tvarying vec2 vTransmissionMapUv;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tuniform mat3 thicknessMapTransform;\\n\\tvarying vec2 vThicknessMapUv;\\n#endif\";\n\nvar uv_pars_vertex = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvarying vec2 vUv;\\n#endif\\n#ifdef USE_MAP\\n\\tuniform mat3 mapTransform;\\n\\tvarying vec2 vMapUv;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tuniform mat3 alphaMapTransform;\\n\\tvarying vec2 vAlphaMapUv;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tuniform mat3 lightMapTransform;\\n\\tvarying vec2 vLightMapUv;\\n#endif\\n#ifdef USE_AOMAP\\n\\tuniform mat3 aoMapTransform;\\n\\tvarying vec2 vAoMapUv;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tuniform mat3 bumpMapTransform;\\n\\tvarying vec2 vBumpMapUv;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tuniform mat3 normalMapTransform;\\n\\tvarying vec2 vNormalMapUv;\\n#endif\\n#ifdef USE_DISPLACEMENTMAP\\n\\tuniform mat3 displacementMapTransform;\\n\\tvarying vec2 vDisplacementMapUv;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tuniform mat3 emissiveMapTransform;\\n\\tvarying vec2 vEmissiveMapUv;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tuniform mat3 metalnessMapTransform;\\n\\tvarying vec2 vMetalnessMapUv;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tuniform mat3 roughnessMapTransform;\\n\\tvarying vec2 vRoughnessMapUv;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tuniform mat3 anisotropyMapTransform;\\n\\tvarying vec2 vAnisotropyMapUv;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tuniform mat3 clearcoatMapTransform;\\n\\tvarying vec2 vClearcoatMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tuniform mat3 clearcoatNormalMapTransform;\\n\\tvarying vec2 vClearcoatNormalMapUv;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tuniform mat3 clearcoatRoughnessMapTransform;\\n\\tvarying vec2 vClearcoatRoughnessMapUv;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tuniform mat3 sheenColorMapTransform;\\n\\tvarying vec2 vSheenColorMapUv;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tuniform mat3 sheenRoughnessMapTransform;\\n\\tvarying vec2 vSheenRoughnessMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tuniform mat3 iridescenceMapTransform;\\n\\tvarying vec2 vIridescenceMapUv;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tuniform mat3 iridescenceThicknessMapTransform;\\n\\tvarying vec2 vIridescenceThicknessMapUv;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tuniform mat3 specularMapTransform;\\n\\tvarying vec2 vSpecularMapUv;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tuniform mat3 specularColorMapTransform;\\n\\tvarying vec2 vSpecularColorMapUv;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tuniform mat3 specularIntensityMapTransform;\\n\\tvarying vec2 vSpecularIntensityMapUv;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tuniform mat3 transmissionMapTransform;\\n\\tvarying vec2 vTransmissionMapUv;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tuniform mat3 thicknessMapTransform;\\n\\tvarying vec2 vThicknessMapUv;\\n#endif\";\n\nvar uv_vertex = \"#if defined( USE_UV ) || defined( USE_ANISOTROPY )\\n\\tvUv = vec3( uv, 1 ).xy;\\n#endif\\n#ifdef USE_MAP\\n\\tvMapUv = ( mapTransform * vec3( MAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ALPHAMAP\\n\\tvAlphaMapUv = ( alphaMapTransform * vec3( ALPHAMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_LIGHTMAP\\n\\tvLightMapUv = ( lightMapTransform * vec3( LIGHTMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_AOMAP\\n\\tvAoMapUv = ( aoMapTransform * vec3( AOMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_BUMPMAP\\n\\tvBumpMapUv = ( bumpMapTransform * vec3( BUMPMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_NORMALMAP\\n\\tvNormalMapUv = ( normalMapTransform * vec3( NORMALMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_DISPLACEMENTMAP\\n\\tvDisplacementMapUv = ( displacementMapTransform * vec3( DISPLACEMENTMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_EMISSIVEMAP\\n\\tvEmissiveMapUv = ( emissiveMapTransform * vec3( EMISSIVEMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_METALNESSMAP\\n\\tvMetalnessMapUv = ( metalnessMapTransform * vec3( METALNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ROUGHNESSMAP\\n\\tvRoughnessMapUv = ( roughnessMapTransform * vec3( ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_ANISOTROPYMAP\\n\\tvAnisotropyMapUv = ( anisotropyMapTransform * vec3( ANISOTROPYMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOATMAP\\n\\tvClearcoatMapUv = ( clearcoatMapTransform * vec3( CLEARCOATMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOAT_NORMALMAP\\n\\tvClearcoatNormalMapUv = ( clearcoatNormalMapTransform * vec3( CLEARCOAT_NORMALMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_CLEARCOAT_ROUGHNESSMAP\\n\\tvClearcoatRoughnessMapUv = ( clearcoatRoughnessMapTransform * vec3( CLEARCOAT_ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_IRIDESCENCEMAP\\n\\tvIridescenceMapUv = ( iridescenceMapTransform * vec3( IRIDESCENCEMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_IRIDESCENCE_THICKNESSMAP\\n\\tvIridescenceThicknessMapUv = ( iridescenceThicknessMapTransform * vec3( IRIDESCENCE_THICKNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SHEEN_COLORMAP\\n\\tvSheenColorMapUv = ( sheenColorMapTransform * vec3( SHEEN_COLORMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\tvSheenRoughnessMapUv = ( sheenRoughnessMapTransform * vec3( SHEEN_ROUGHNESSMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULARMAP\\n\\tvSpecularMapUv = ( specularMapTransform * vec3( SPECULARMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULAR_COLORMAP\\n\\tvSpecularColorMapUv = ( specularColorMapTransform * vec3( SPECULAR_COLORMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_SPECULAR_INTENSITYMAP\\n\\tvSpecularIntensityMapUv = ( specularIntensityMapTransform * vec3( SPECULAR_INTENSITYMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_TRANSMISSIONMAP\\n\\tvTransmissionMapUv = ( transmissionMapTransform * vec3( TRANSMISSIONMAP_UV, 1 ) ).xy;\\n#endif\\n#ifdef USE_THICKNESSMAP\\n\\tvThicknessMapUv = ( thicknessMapTransform * vec3( THICKNESSMAP_UV, 1 ) ).xy;\\n#endif\";\n\nvar worldpos_vertex = \"#if defined( USE_ENVMAP ) || defined( DISTANCE ) || defined ( USE_SHADOWMAP ) || defined ( USE_TRANSMISSION ) || NUM_SPOT_LIGHT_COORDS > 0\\n\\tvec4 worldPosition = vec4( transformed, 1.0 );\\n\\t#ifdef USE_BATCHING\\n\\t\\tworldPosition = batchingMatrix * worldPosition;\\n\\t#endif\\n\\t#ifdef USE_INSTANCING\\n\\t\\tworldPosition = instanceMatrix * worldPosition;\\n\\t#endif\\n\\tworldPosition = modelMatrix * worldPosition;\\n#endif\";\n\nconst vertex$h = \"varying vec2 vUv;\\nuniform mat3 uvTransform;\\nvoid main() {\\n\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n\\tgl_Position = vec4( position.xy, 1.0, 1.0 );\\n}\";\n\nconst fragment$h = \"uniform sampler2D t2D;\\nuniform float backgroundIntensity;\\nvarying vec2 vUv;\\nvoid main() {\\n\\tvec4 texColor = texture2D( t2D, vUv );\\n\\t#ifdef DECODE_VIDEO_TEXTURE\\n\\t\\ttexColor = vec4( mix( pow( texColor.rgb * 0.9478672986 + vec3( 0.0521327014 ), vec3( 2.4 ) ), texColor.rgb * 0.0773993808, vec3( lessThanEqual( texColor.rgb, vec3( 0.04045 ) ) ) ), texColor.w );\\n\\t#endif\\n\\ttexColor.rgb *= backgroundIntensity;\\n\\tgl_FragColor = texColor;\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n}\";\n\nconst vertex$g = \"varying vec3 vWorldDirection;\\n#include <common>\\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n\\tgl_Position.z = gl_Position.w;\\n}\";\n\nconst fragment$g = \"#ifdef ENVMAP_TYPE_CUBE\\n\\tuniform samplerCube envMap;\\n#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\tuniform sampler2D envMap;\\n#endif\\nuniform float flipEnvMap;\\nuniform float backgroundBlurriness;\\nuniform float backgroundIntensity;\\nuniform mat3 backgroundRotation;\\nvarying vec3 vWorldDirection;\\n#include <cube_uv_reflection_fragment>\\nvoid main() {\\n\\t#ifdef ENVMAP_TYPE_CUBE\\n\\t\\tvec4 texColor = textureCube( envMap, backgroundRotation * vec3( flipEnvMap * vWorldDirection.x, vWorldDirection.yz ) );\\n\\t#elif defined( ENVMAP_TYPE_CUBE_UV )\\n\\t\\tvec4 texColor = textureCubeUV( envMap, backgroundRotation * vWorldDirection, backgroundBlurriness );\\n\\t#else\\n\\t\\tvec4 texColor = vec4( 0.0, 0.0, 0.0, 1.0 );\\n\\t#endif\\n\\ttexColor.rgb *= backgroundIntensity;\\n\\tgl_FragColor = texColor;\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n}\";\n\nconst vertex$f = \"varying vec3 vWorldDirection;\\n#include <common>\\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n\\tgl_Position.z = gl_Position.w;\\n}\";\n\nconst fragment$f = \"uniform samplerCube tCube;\\nuniform float tFlip;\\nuniform float opacity;\\nvarying vec3 vWorldDirection;\\nvoid main() {\\n\\tvec4 texColor = textureCube( tCube, vec3( tFlip * vWorldDirection.x, vWorldDirection.yz ) );\\n\\tgl_FragColor = texColor;\\n\\tgl_FragColor.a *= opacity;\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n}\";\n\nconst vertex$e = \"#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include <beginnormal_vertex>\\n\\t\\t#include <morphnormal_vertex>\\n\\t\\t#include <skinnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvHighPrecisionZW = gl_Position.zw;\\n}\";\n\nconst fragment$e = \"#if DEPTH_PACKING == 3200\\n\\tuniform float opacity;\\n#endif\\n#include <common>\\n#include <packing>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvarying vec2 vHighPrecisionZW;\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include <clipping_planes_fragment>\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tdiffuseColor.a = opacity;\\n\\t#endif\\n\\t#include <map_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <logdepthbuf_fragment>\\n\\t#ifdef USE_REVERSED_DEPTH_BUFFER\\n\\t\\tfloat fragCoordZ = vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ];\\n\\t#else\\n\\t\\tfloat fragCoordZ = 0.5 * vHighPrecisionZW[ 0 ] / vHighPrecisionZW[ 1 ] + 0.5;\\n\\t#endif\\n\\t#if DEPTH_PACKING == 3200\\n\\t\\tgl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );\\n\\t#elif DEPTH_PACKING == 3201\\n\\t\\tgl_FragColor = packDepthToRGBA( fragCoordZ );\\n\\t#elif DEPTH_PACKING == 3202\\n\\t\\tgl_FragColor = vec4( packDepthToRGB( fragCoordZ ), 1.0 );\\n\\t#elif DEPTH_PACKING == 3203\\n\\t\\tgl_FragColor = vec4( packDepthToRG( fragCoordZ ), 0.0, 1.0 );\\n\\t#endif\\n}\";\n\nconst vertex$d = \"#define DISTANCE\\nvarying vec3 vWorldPosition;\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#ifdef USE_DISPLACEMENTMAP\\n\\t\\t#include <beginnormal_vertex>\\n\\t\\t#include <morphnormal_vertex>\\n\\t\\t#include <skinnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvWorldPosition = worldPosition.xyz;\\n}\";\n\nconst fragment$d = \"#define DISTANCE\\nuniform vec3 referencePosition;\\nuniform float nearDistance;\\nuniform float farDistance;\\nvarying vec3 vWorldPosition;\\n#include <common>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main () {\\n\\tvec4 diffuseColor = vec4( 1.0 );\\n\\t#include <clipping_planes_fragment>\\n\\t#include <map_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\tfloat dist = length( vWorldPosition - referencePosition );\\n\\tdist = ( dist - nearDistance ) / ( farDistance - nearDistance );\\n\\tdist = saturate( dist );\\n\\tgl_FragColor = vec4( dist, 0.0, 0.0, 1.0 );\\n}\";\n\nconst vertex$c = \"varying vec3 vWorldDirection;\\n#include <common>\\nvoid main() {\\n\\tvWorldDirection = transformDirection( position, modelMatrix );\\n\\t#include <begin_vertex>\\n\\t#include <project_vertex>\\n}\";\n\nconst fragment$c = \"uniform sampler2D tEquirect;\\nvarying vec3 vWorldDirection;\\n#include <common>\\nvoid main() {\\n\\tvec3 direction = normalize( vWorldDirection );\\n\\tvec2 sampleUV = equirectUv( direction );\\n\\tgl_FragColor = texture2D( tEquirect, sampleUV );\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n}\";\n\nconst vertex$b = \"uniform float scale;\\nattribute float lineDistance;\\nvarying float vLineDistance;\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\tvLineDistance = scale * lineDistance;\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$b = \"uniform vec3 diffuse;\\nuniform float opacity;\\nuniform float dashSize;\\nuniform float totalSize;\\nvarying float vLineDistance;\\n#include <common>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tif ( mod( vLineDistance, totalSize ) > dashSize ) {\\n\\t\\tdiscard;\\n\\t}\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n}\";\n\nconst vertex$a = \"#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <batching_vertex>\\n\\t#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )\\n\\t\\t#include <beginnormal_vertex>\\n\\t\\t#include <morphnormal_vertex>\\n\\t\\t#include <skinbase_vertex>\\n\\t\\t#include <skinnormal_vertex>\\n\\t\\t#include <defaultnormal_vertex>\\n\\t#endif\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$a = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#ifndef FLAT_SHADED\\n\\tvarying vec3 vNormal;\\n#endif\\n#include <common>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <envmap_common_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <specularmap_fragment>\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\t#ifdef USE_LIGHTMAP\\n\\t\\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\\n\\t\\treflectedLight.indirectDiffuse += lightMapTexel.rgb * lightMapIntensity * RECIPROCAL_PI;\\n\\t#else\\n\\t\\treflectedLight.indirectDiffuse += vec3( 1.0 );\\n\\t#endif\\n\\t#include <aomap_fragment>\\n\\treflectedLight.indirectDiffuse *= diffuseColor.rgb;\\n\\tvec3 outgoingLight = reflectedLight.indirectDiffuse;\\n\\t#include <envmap_fragment>\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$9 = \"#define LAMBERT\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$9 = \"#define LAMBERT\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\n#include <common>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <envmap_common_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <normal_pars_fragment>\\n#include <lights_lambert_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <specularmap_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_lambert_fragment>\\n\\t#include <lights_fragment_begin>\\n\\t#include <lights_fragment_maps>\\n\\t#include <lights_fragment_end>\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include <envmap_fragment>\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$8 = \"#define MATCAP\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <color_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <fog_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n}\";\n\nconst fragment$8 = \"#define MATCAP\\nuniform vec3 diffuse;\\nuniform float opacity;\\nuniform sampler2D matcap;\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <normal_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\tvec3 viewDir = normalize( vViewPosition );\\n\\tvec3 x = normalize( vec3( viewDir.z, 0.0, - viewDir.x ) );\\n\\tvec3 y = cross( viewDir, x );\\n\\tvec2 uv = vec2( dot( x, normal ), dot( y, normal ) ) * 0.495 + 0.5;\\n\\t#ifdef USE_MATCAP\\n\\t\\tvec4 matcapColor = texture2D( matcap, uv );\\n\\t#else\\n\\t\\tvec4 matcapColor = vec4( vec3( mix( 0.2, 0.8, uv.y ) ), 1.0 );\\n\\t#endif\\n\\tvec3 outgoingLight = diffuseColor.rgb * matcapColor.rgb;\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$7 = \"#define NORMAL\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvViewPosition = - mvPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$7 = \"#define NORMAL\\nuniform float opacity;\\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\\n\\tvarying vec3 vViewPosition;\\n#endif\\n#include <uv_pars_fragment>\\n#include <normal_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( 0.0, 0.0, 0.0, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\tgl_FragColor = vec4( normalize( normal ) * 0.5 + 0.5, diffuseColor.a );\\n\\t#ifdef OPAQUE\\n\\t\\tgl_FragColor.a = 1.0;\\n\\t#endif\\n}\";\n\nconst vertex$6 = \"#define PHONG\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <envmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <envmap_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$6 = \"#define PHONG\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform vec3 specular;\\nuniform float shininess;\\nuniform float opacity;\\n#include <common>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <envmap_common_pars_fragment>\\n#include <envmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <normal_pars_fragment>\\n#include <lights_phong_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <specularmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <specularmap_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_phong_fragment>\\n\\t#include <lights_fragment_begin>\\n\\t#include <lights_fragment_maps>\\n\\t#include <lights_fragment_end>\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + reflectedLight.directSpecular + reflectedLight.indirectSpecular + totalEmissiveRadiance;\\n\\t#include <envmap_fragment>\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$5 = \"#define STANDARD\\nvarying vec3 vViewPosition;\\n#ifdef USE_TRANSMISSION\\n\\tvarying vec3 vWorldPosition;\\n#endif\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n#ifdef USE_TRANSMISSION\\n\\tvWorldPosition = worldPosition.xyz;\\n#endif\\n}\";\n\nconst fragment$5 = \"#define STANDARD\\n#ifdef PHYSICAL\\n\\t#define IOR\\n\\t#define USE_SPECULAR\\n#endif\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float roughness;\\nuniform float metalness;\\nuniform float opacity;\\n#ifdef IOR\\n\\tuniform float ior;\\n#endif\\n#ifdef USE_SPECULAR\\n\\tuniform float specularIntensity;\\n\\tuniform vec3 specularColor;\\n\\t#ifdef USE_SPECULAR_COLORMAP\\n\\t\\tuniform sampler2D specularColorMap;\\n\\t#endif\\n\\t#ifdef USE_SPECULAR_INTENSITYMAP\\n\\t\\tuniform sampler2D specularIntensityMap;\\n\\t#endif\\n#endif\\n#ifdef USE_CLEARCOAT\\n\\tuniform float clearcoat;\\n\\tuniform float clearcoatRoughness;\\n#endif\\n#ifdef USE_DISPERSION\\n\\tuniform float dispersion;\\n#endif\\n#ifdef USE_IRIDESCENCE\\n\\tuniform float iridescence;\\n\\tuniform float iridescenceIOR;\\n\\tuniform float iridescenceThicknessMinimum;\\n\\tuniform float iridescenceThicknessMaximum;\\n#endif\\n#ifdef USE_SHEEN\\n\\tuniform vec3 sheenColor;\\n\\tuniform float sheenRoughness;\\n\\t#ifdef USE_SHEEN_COLORMAP\\n\\t\\tuniform sampler2D sheenColorMap;\\n\\t#endif\\n\\t#ifdef USE_SHEEN_ROUGHNESSMAP\\n\\t\\tuniform sampler2D sheenRoughnessMap;\\n\\t#endif\\n#endif\\n#ifdef USE_ANISOTROPY\\n\\tuniform vec2 anisotropyVector;\\n\\t#ifdef USE_ANISOTROPYMAP\\n\\t\\tuniform sampler2D anisotropyMap;\\n\\t#endif\\n#endif\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <iridescence_fragment>\\n#include <cube_uv_reflection_fragment>\\n#include <envmap_common_pars_fragment>\\n#include <envmap_physical_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <lights_pars_begin>\\n#include <normal_pars_fragment>\\n#include <lights_physical_pars_fragment>\\n#include <transmission_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <clearcoat_pars_fragment>\\n#include <iridescence_pars_fragment>\\n#include <roughnessmap_pars_fragment>\\n#include <metalnessmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <roughnessmap_fragment>\\n\\t#include <metalnessmap_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\t#include <clearcoat_normal_fragment_begin>\\n\\t#include <clearcoat_normal_fragment_maps>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_physical_fragment>\\n\\t#include <lights_fragment_begin>\\n\\t#include <lights_fragment_maps>\\n\\t#include <lights_fragment_end>\\n\\t#include <aomap_fragment>\\n\\tvec3 totalDiffuse = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse;\\n\\tvec3 totalSpecular = reflectedLight.directSpecular + reflectedLight.indirectSpecular;\\n\\t#include <transmission_fragment>\\n\\tvec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;\\n\\t#ifdef USE_SHEEN\\n \\n\\t\\toutgoingLight = outgoingLight + sheenSpecularDirect + sheenSpecularIndirect;\\n \\n \\t#endif\\n\\t#ifdef USE_CLEARCOAT\\n\\t\\tfloat dotNVcc = saturate( dot( geometryClearcoatNormal, geometryViewDir ) );\\n\\t\\tvec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );\\n\\t\\toutgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;\\n\\t#endif\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$4 = \"#define TOON\\nvarying vec3 vViewPosition;\\n#include <common>\\n#include <batching_pars_vertex>\\n#include <uv_pars_vertex>\\n#include <displacementmap_pars_vertex>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <normal_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <shadowmap_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <normal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <displacementmap_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\tvViewPosition = - mvPosition.xyz;\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$4 = \"#define TOON\\nuniform vec3 diffuse;\\nuniform vec3 emissive;\\nuniform float opacity;\\n#include <common>\\n#include <dithering_pars_fragment>\\n#include <color_pars_fragment>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <aomap_pars_fragment>\\n#include <lightmap_pars_fragment>\\n#include <emissivemap_pars_fragment>\\n#include <gradientmap_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <normal_pars_fragment>\\n#include <lights_toon_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <bumpmap_pars_fragment>\\n#include <normalmap_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\\n\\tvec3 totalEmissiveRadiance = emissive;\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\t#include <normal_fragment_begin>\\n\\t#include <normal_fragment_maps>\\n\\t#include <emissivemap_fragment>\\n\\t#include <lights_toon_fragment>\\n\\t#include <lights_fragment_begin>\\n\\t#include <lights_fragment_maps>\\n\\t#include <lights_fragment_end>\\n\\t#include <aomap_fragment>\\n\\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n\\t#include <dithering_fragment>\\n}\";\n\nconst vertex$3 = \"uniform float size;\\nuniform float scale;\\n#include <common>\\n#include <color_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\n#ifdef USE_POINTS_UV\\n\\tvarying vec2 vUv;\\n\\tuniform mat3 uvTransform;\\n#endif\\nvoid main() {\\n\\t#ifdef USE_POINTS_UV\\n\\t\\tvUv = ( uvTransform * vec3( uv, 1 ) ).xy;\\n\\t#endif\\n\\t#include <color_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphcolor_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <project_vertex>\\n\\tgl_PointSize = size;\\n\\t#ifdef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) gl_PointSize *= ( scale / - mvPosition.z );\\n\\t#endif\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$3 = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include <common>\\n#include <color_pars_fragment>\\n#include <map_particle_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_particle_fragment>\\n\\t#include <color_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n\\t#include <premultiplied_alpha_fragment>\\n}\";\n\nconst vertex$2 = \"#include <common>\\n#include <batching_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <morphtarget_pars_vertex>\\n#include <skinning_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <shadowmap_pars_vertex>\\nvoid main() {\\n\\t#include <batching_vertex>\\n\\t#include <beginnormal_vertex>\\n\\t#include <morphinstance_vertex>\\n\\t#include <morphnormal_vertex>\\n\\t#include <skinbase_vertex>\\n\\t#include <skinnormal_vertex>\\n\\t#include <defaultnormal_vertex>\\n\\t#include <begin_vertex>\\n\\t#include <morphtarget_vertex>\\n\\t#include <skinning_vertex>\\n\\t#include <project_vertex>\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <worldpos_vertex>\\n\\t#include <shadowmap_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$2 = \"uniform vec3 color;\\nuniform float opacity;\\n#include <common>\\n#include <fog_pars_fragment>\\n#include <bsdfs>\\n#include <lights_pars_begin>\\n#include <logdepthbuf_pars_fragment>\\n#include <shadowmap_pars_fragment>\\n#include <shadowmask_pars_fragment>\\nvoid main() {\\n\\t#include <logdepthbuf_fragment>\\n\\tgl_FragColor = vec4( color, opacity * ( 1.0 - getShadowMask() ) );\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n}\";\n\nconst vertex$1 = \"uniform float rotation;\\nuniform vec2 center;\\n#include <common>\\n#include <uv_pars_vertex>\\n#include <fog_pars_vertex>\\n#include <logdepthbuf_pars_vertex>\\n#include <clipping_planes_pars_vertex>\\nvoid main() {\\n\\t#include <uv_vertex>\\n\\tvec4 mvPosition = modelViewMatrix[ 3 ];\\n\\tvec2 scale = vec2( length( modelMatrix[ 0 ].xyz ), length( modelMatrix[ 1 ].xyz ) );\\n\\t#ifndef USE_SIZEATTENUATION\\n\\t\\tbool isPerspective = isPerspectiveMatrix( projectionMatrix );\\n\\t\\tif ( isPerspective ) scale *= - mvPosition.z;\\n\\t#endif\\n\\tvec2 alignedPosition = ( position.xy - ( center - vec2( 0.5 ) ) ) * scale;\\n\\tvec2 rotatedPosition;\\n\\trotatedPosition.x = cos( rotation ) * alignedPosition.x - sin( rotation ) * alignedPosition.y;\\n\\trotatedPosition.y = sin( rotation ) * alignedPosition.x + cos( rotation ) * alignedPosition.y;\\n\\tmvPosition.xy += rotatedPosition;\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\t#include <logdepthbuf_vertex>\\n\\t#include <clipping_planes_vertex>\\n\\t#include <fog_vertex>\\n}\";\n\nconst fragment$1 = \"uniform vec3 diffuse;\\nuniform float opacity;\\n#include <common>\\n#include <uv_pars_fragment>\\n#include <map_pars_fragment>\\n#include <alphamap_pars_fragment>\\n#include <alphatest_pars_fragment>\\n#include <alphahash_pars_fragment>\\n#include <fog_pars_fragment>\\n#include <logdepthbuf_pars_fragment>\\n#include <clipping_planes_pars_fragment>\\nvoid main() {\\n\\tvec4 diffuseColor = vec4( diffuse, opacity );\\n\\t#include <clipping_planes_fragment>\\n\\tvec3 outgoingLight = vec3( 0.0 );\\n\\t#include <logdepthbuf_fragment>\\n\\t#include <map_fragment>\\n\\t#include <alphamap_fragment>\\n\\t#include <alphatest_fragment>\\n\\t#include <alphahash_fragment>\\n\\toutgoingLight = diffuseColor.rgb;\\n\\t#include <opaque_fragment>\\n\\t#include <tonemapping_fragment>\\n\\t#include <colorspace_fragment>\\n\\t#include <fog_fragment>\\n}\";\n\nconst ShaderChunk = {\n\talphahash_fragment: alphahash_fragment,\n\talphahash_pars_fragment: alphahash_pars_fragment,\n\talphamap_fragment: alphamap_fragment,\n\talphamap_pars_fragment: alphamap_pars_fragment,\n\talphatest_fragment: alphatest_fragment,\n\talphatest_pars_fragment: alphatest_pars_fragment,\n\taomap_fragment: aomap_fragment,\n\taomap_pars_fragment: aomap_pars_fragment,\n\tbatching_pars_vertex: batching_pars_vertex,\n\tbatching_vertex: batching_vertex,\n\tbegin_vertex: begin_vertex,\n\tbeginnormal_vertex: beginnormal_vertex,\n\tbsdfs: bsdfs,\n\tiridescence_fragment: iridescence_fragment,\n\tbumpmap_pars_fragment: bumpmap_pars_fragment,\n\tclipping_planes_fragment: clipping_planes_fragment,\n\tclipping_planes_pars_fragment: clipping_planes_pars_fragment,\n\tclipping_planes_pars_vertex: clipping_planes_pars_vertex,\n\tclipping_planes_vertex: clipping_planes_vertex,\n\tcolor_fragment: color_fragment,\n\tcolor_pars_fragment: color_pars_fragment,\n\tcolor_pars_vertex: color_pars_vertex,\n\tcolor_vertex: color_vertex,\n\tcommon: common,\n\tcube_uv_reflection_fragment: cube_uv_reflection_fragment,\n\tdefaultnormal_vertex: defaultnormal_vertex,\n\tdisplacementmap_pars_vertex: displacementmap_pars_vertex,\n\tdisplacementmap_vertex: displacementmap_vertex,\n\temissivemap_fragment: emissivemap_fragment,\n\temissivemap_pars_fragment: emissivemap_pars_fragment,\n\tcolorspace_fragment: colorspace_fragment,\n\tcolorspace_pars_fragment: colorspace_pars_fragment,\n\tenvmap_fragment: envmap_fragment,\n\tenvmap_common_pars_fragment: envmap_common_pars_fragment,\n\tenvmap_pars_fragment: envmap_pars_fragment,\n\tenvmap_pars_vertex: envmap_pars_vertex,\n\tenvmap_physical_pars_fragment: envmap_physical_pars_fragment,\n\tenvmap_vertex: envmap_vertex,\n\tfog_vertex: fog_vertex,\n\tfog_pars_vertex: fog_pars_vertex,\n\tfog_fragment: fog_fragment,\n\tfog_pars_fragment: fog_pars_fragment,\n\tgradientmap_pars_fragment: gradientmap_pars_fragment,\n\tlightmap_pars_fragment: lightmap_pars_fragment,\n\tlights_lambert_fragment: lights_lambert_fragment,\n\tlights_lambert_pars_fragment: lights_lambert_pars_fragment,\n\tlights_pars_begin: lights_pars_begin,\n\tlights_toon_fragment: lights_toon_fragment,\n\tlights_toon_pars_fragment: lights_toon_pars_fragment,\n\tlights_phong_fragment: lights_phong_fragment,\n\tlights_phong_pars_fragment: lights_phong_pars_fragment,\n\tlights_physical_fragment: lights_physical_fragment,\n\tlights_physical_pars_fragment: lights_physical_pars_fragment,\n\tlights_fragment_begin: lights_fragment_begin,\n\tlights_fragment_maps: lights_fragment_maps,\n\tlights_fragment_end: lights_fragment_end,\n\tlogdepthbuf_fragment: logdepthbuf_fragment,\n\tlogdepthbuf_pars_fragment: logdepthbuf_pars_fragment,\n\tlogdepthbuf_pars_vertex: logdepthbuf_pars_vertex,\n\tlogdepthbuf_vertex: logdepthbuf_vertex,\n\tmap_fragment: map_fragment,\n\tmap_pars_fragment: map_pars_fragment,\n\tmap_particle_fragment: map_particle_fragment,\n\tmap_particle_pars_fragment: map_particle_pars_fragment,\n\tmetalnessmap_fragment: metalnessmap_fragment,\n\tmetalnessmap_pars_fragment: metalnessmap_pars_fragment,\n\tmorphinstance_vertex: morphinstance_vertex,\n\tmorphcolor_vertex: morphcolor_vertex,\n\tmorphnormal_vertex: morphnormal_vertex,\n\tmorphtarget_pars_vertex: morphtarget_pars_vertex,\n\tmorphtarget_vertex: morphtarget_vertex,\n\tnormal_fragment_begin: normal_fragment_begin,\n\tnormal_fragment_maps: normal_fragment_maps,\n\tnormal_pars_fragment: normal_pars_fragment,\n\tnormal_pars_vertex: normal_pars_vertex,\n\tnormal_vertex: normal_vertex,\n\tnormalmap_pars_fragment: normalmap_pars_fragment,\n\tclearcoat_normal_fragment_begin: clearcoat_normal_fragment_begin,\n\tclearcoat_normal_fragment_maps: clearcoat_normal_fragment_maps,\n\tclearcoat_pars_fragment: clearcoat_pars_fragment,\n\tiridescence_pars_fragment: iridescence_pars_fragment,\n\topaque_fragment: opaque_fragment,\n\tpacking: packing,\n\tpremultiplied_alpha_fragment: premultiplied_alpha_fragment,\n\tproject_vertex: project_vertex,\n\tdithering_fragment: dithering_fragment,\n\tdithering_pars_fragment: dithering_pars_fragment,\n\troughnessmap_fragment: roughnessmap_fragment,\n\troughnessmap_pars_fragment: roughnessmap_pars_fragment,\n\tshadowmap_pars_fragment: shadowmap_pars_fragment,\n\tshadowmap_pars_vertex: shadowmap_pars_vertex,\n\tshadowmap_vertex: shadowmap_vertex,\n\tshadowmask_pars_fragment: shadowmask_pars_fragment,\n\tskinbase_vertex: skinbase_vertex,\n\tskinning_pars_vertex: skinning_pars_vertex,\n\tskinning_vertex: skinning_vertex,\n\tskinnormal_vertex: skinnormal_vertex,\n\tspecularmap_fragment: specularmap_fragment,\n\tspecularmap_pars_fragment: specularmap_pars_fragment,\n\ttonemapping_fragment: tonemapping_fragment,\n\ttonemapping_pars_fragment: tonemapping_pars_fragment,\n\ttransmission_fragment: transmission_fragment,\n\ttransmission_pars_fragment: transmission_pars_fragment,\n\tuv_pars_fragment: uv_pars_fragment,\n\tuv_pars_vertex: uv_pars_vertex,\n\tuv_vertex: uv_vertex,\n\tworldpos_vertex: worldpos_vertex,\n\n\tbackground_vert: vertex$h,\n\tbackground_frag: fragment$h,\n\tbackgroundCube_vert: vertex$g,\n\tbackgroundCube_frag: fragment$g,\n\tcube_vert: vertex$f,\n\tcube_frag: fragment$f,\n\tdepth_vert: vertex$e,\n\tdepth_frag: fragment$e,\n\tdistance_vert: vertex$d,\n\tdistance_frag: fragment$d,\n\tequirect_vert: vertex$c,\n\tequirect_frag: fragment$c,\n\tlinedashed_vert: vertex$b,\n\tlinedashed_frag: fragment$b,\n\tmeshbasic_vert: vertex$a,\n\tmeshbasic_frag: fragment$a,\n\tmeshlambert_vert: vertex$9,\n\tmeshlambert_frag: fragment$9,\n\tmeshmatcap_vert: vertex$8,\n\tmeshmatcap_frag: fragment$8,\n\tmeshnormal_vert: vertex$7,\n\tmeshnormal_frag: fragment$7,\n\tmeshphong_vert: vertex$6,\n\tmeshphong_frag: fragment$6,\n\tmeshphysical_vert: vertex$5,\n\tmeshphysical_frag: fragment$5,\n\tmeshtoon_vert: vertex$4,\n\tmeshtoon_frag: fragment$4,\n\tpoints_vert: vertex$3,\n\tpoints_frag: fragment$3,\n\tshadow_vert: vertex$2,\n\tshadow_frag: fragment$2,\n\tsprite_vert: vertex$1,\n\tsprite_frag: fragment$1\n};\n\n// Uniforms library for shared webgl shaders\nconst UniformsLib = {\n\n\tcommon: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\n\t\tmap: { value: null },\n\t\tmapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\n\t\talphaTest: { value: 0 }\n\n\t},\n\n\tspecularmap: {\n\n\t\tspecularMap: { value: null },\n\t\tspecularMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tenvmap: {\n\n\t\tenvMap: { value: null },\n\t\tenvMapRotation: { value: /*@__PURE__*/ new Matrix3() },\n\t\tflipEnvMap: { value: -1 },\n\t\treflectivity: { value: 1.0 }, // basic, lambert, phong\n\t\tior: { value: 1.5 }, // physical\n\t\trefractionRatio: { value: 0.98 }, // basic, lambert, phong\n\t\tdfgLUT: { value: null } // DFG LUT for physically-based rendering\n\n\t},\n\n\taomap: {\n\n\t\taoMap: { value: null },\n\t\taoMapIntensity: { value: 1 },\n\t\taoMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tlightmap: {\n\n\t\tlightMap: { value: null },\n\t\tlightMapIntensity: { value: 1 },\n\t\tlightMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tbumpmap: {\n\n\t\tbumpMap: { value: null },\n\t\tbumpMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tbumpScale: { value: 1 }\n\n\t},\n\n\tnormalmap: {\n\n\t\tnormalMap: { value: null },\n\t\tnormalMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tnormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) }\n\n\t},\n\n\tdisplacementmap: {\n\n\t\tdisplacementMap: { value: null },\n\t\tdisplacementMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\tdisplacementScale: { value: 1 },\n\t\tdisplacementBias: { value: 0 }\n\n\t},\n\n\temissivemap: {\n\n\t\temissiveMap: { value: null },\n\t\temissiveMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tmetalnessmap: {\n\n\t\tmetalnessMap: { value: null },\n\t\tmetalnessMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\troughnessmap: {\n\n\t\troughnessMap: { value: null },\n\t\troughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tgradientmap: {\n\n\t\tgradientMap: { value: null }\n\n\t},\n\n\tfog: {\n\n\t\tfogDensity: { value: 0.00025 },\n\t\tfogNear: { value: 1 },\n\t\tfogFar: { value: 2000 },\n\t\tfogColor: { value: /*@__PURE__*/ new Color( 0xffffff ) }\n\n\t},\n\n\tlights: {\n\n\t\tambientLightColor: { value: [] },\n\n\t\tlightProbe: { value: [] },\n\n\t\tdirectionalLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tcolor: {}\n\t\t} },\n\n\t\tdirectionalLightShadows: { value: [], properties: {\n\t\t\tshadowIntensity: 1,\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tdirectionalShadowMap: { value: [] },\n\t\tdirectionalShadowMatrix: { value: [] },\n\n\t\tspotLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdirection: {},\n\t\t\tdistance: {},\n\t\t\tconeCos: {},\n\t\t\tpenumbraCos: {},\n\t\t\tdecay: {}\n\t\t} },\n\n\t\tspotLightShadows: { value: [], properties: {\n\t\t\tshadowIntensity: 1,\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {}\n\t\t} },\n\n\t\tspotLightMap: { value: [] },\n\t\tspotShadowMap: { value: [] },\n\t\tspotLightMatrix: { value: [] },\n\n\t\tpointLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\tdecay: {},\n\t\t\tdistance: {}\n\t\t} },\n\n\t\tpointLightShadows: { value: [], properties: {\n\t\t\tshadowIntensity: 1,\n\t\t\tshadowBias: {},\n\t\t\tshadowNormalBias: {},\n\t\t\tshadowRadius: {},\n\t\t\tshadowMapSize: {},\n\t\t\tshadowCameraNear: {},\n\t\t\tshadowCameraFar: {}\n\t\t} },\n\n\t\tpointShadowMap: { value: [] },\n\t\tpointShadowMatrix: { value: [] },\n\n\t\themisphereLights: { value: [], properties: {\n\t\t\tdirection: {},\n\t\t\tskyColor: {},\n\t\t\tgroundColor: {}\n\t\t} },\n\n\t\t// TODO (abelnation): RectAreaLight BRDF data needs to be moved from example to main src\n\t\trectAreaLights: { value: [], properties: {\n\t\t\tcolor: {},\n\t\t\tposition: {},\n\t\t\twidth: {},\n\t\t\theight: {}\n\t\t} },\n\n\t\tltc_1: { value: null },\n\t\tltc_2: { value: null }\n\n\t},\n\n\tpoints: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tsize: { value: 1.0 },\n\t\tscale: { value: 1.0 },\n\t\tmap: { value: null },\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaTest: { value: 0 },\n\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() }\n\n\t},\n\n\tsprite: {\n\n\t\tdiffuse: { value: /*@__PURE__*/ new Color( 0xffffff ) },\n\t\topacity: { value: 1.0 },\n\t\tcenter: { value: /*@__PURE__*/ new Vector2( 0.5, 0.5 ) },\n\t\trotation: { value: 0.0 },\n\t\tmap: { value: null },\n\t\tmapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaMap: { value: null },\n\t\talphaMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\talphaTest: { value: 0 }\n\n\t}\n\n};\n\nconst ShaderLib = {\n\n\tbasic: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshbasic_vert,\n\t\tfragmentShader: ShaderChunk.meshbasic_frag\n\n\t},\n\n\tlambert: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshlambert_vert,\n\t\tfragmentShader: ShaderChunk.meshlambert_frag\n\n\t},\n\n\tphong: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.specularmap,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\t\tspecular: { value: /*@__PURE__*/ new Color( 0x111111 ) },\n\t\t\t\tshininess: { value: 30 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphong_vert,\n\t\tfragmentShader: ShaderChunk.meshphong_frag\n\n\t},\n\n\tstandard: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.envmap,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.roughnessmap,\n\t\t\tUniformsLib.metalnessmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\t\troughness: { value: 1.0 },\n\t\t\t\tmetalness: { value: 0.0 },\n\t\t\t\tenvMapIntensity: { value: 1 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshphysical_vert,\n\t\tfragmentShader: ShaderChunk.meshphysical_frag\n\n\t},\n\n\ttoon: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.aomap,\n\t\t\tUniformsLib.lightmap,\n\t\t\tUniformsLib.emissivemap,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.gradientmap,\n\t\t\tUniformsLib.fog,\n\t\t\tUniformsLib.lights,\n\t\t\t{\n\t\t\t\temissive: { value: /*@__PURE__*/ new Color( 0x000000 ) }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshtoon_vert,\n\t\tfragmentShader: ShaderChunk.meshtoon_frag\n\n\t},\n\n\tmatcap: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tmatcap: { value: null }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshmatcap_vert,\n\t\tfragmentShader: ShaderChunk.meshmatcap_frag\n\n\t},\n\n\tpoints: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.points,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.points_vert,\n\t\tfragmentShader: ShaderChunk.points_frag\n\n\t},\n\n\tdashed: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tscale: { value: 1 },\n\t\t\t\tdashSize: { value: 1 },\n\t\t\t\ttotalSize: { value: 2 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.linedashed_vert,\n\t\tfragmentShader: ShaderChunk.linedashed_frag\n\n\t},\n\n\tdepth: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.depth_vert,\n\t\tfragmentShader: ShaderChunk.depth_frag\n\n\t},\n\n\tnormal: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.bumpmap,\n\t\t\tUniformsLib.normalmap,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.meshnormal_vert,\n\t\tfragmentShader: ShaderChunk.meshnormal_frag\n\n\t},\n\n\tsprite: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.sprite,\n\t\t\tUniformsLib.fog\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.sprite_vert,\n\t\tfragmentShader: ShaderChunk.sprite_frag\n\n\t},\n\n\tbackground: {\n\n\t\tuniforms: {\n\t\t\tuvTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tt2D: { value: null },\n\t\t\tbackgroundIntensity: { value: 1 }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.background_vert,\n\t\tfragmentShader: ShaderChunk.background_frag\n\n\t},\n\n\tbackgroundCube: {\n\n\t\tuniforms: {\n\t\t\tenvMap: { value: null },\n\t\t\tflipEnvMap: { value: -1 },\n\t\t\tbackgroundBlurriness: { value: 0 },\n\t\t\tbackgroundIntensity: { value: 1 },\n\t\t\tbackgroundRotation: { value: /*@__PURE__*/ new Matrix3() }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.backgroundCube_vert,\n\t\tfragmentShader: ShaderChunk.backgroundCube_frag\n\n\t},\n\n\tcube: {\n\n\t\tuniforms: {\n\t\t\ttCube: { value: null },\n\t\t\ttFlip: { value: -1 },\n\t\t\topacity: { value: 1.0 }\n\t\t},\n\n\t\tvertexShader: ShaderChunk.cube_vert,\n\t\tfragmentShader: ShaderChunk.cube_frag\n\n\t},\n\n\tequirect: {\n\n\t\tuniforms: {\n\t\t\ttEquirect: { value: null },\n\t\t},\n\n\t\tvertexShader: ShaderChunk.equirect_vert,\n\t\tfragmentShader: ShaderChunk.equirect_frag\n\n\t},\n\n\tdistance: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.common,\n\t\t\tUniformsLib.displacementmap,\n\t\t\t{\n\t\t\t\treferencePosition: { value: /*@__PURE__*/ new Vector3() },\n\t\t\t\tnearDistance: { value: 1 },\n\t\t\t\tfarDistance: { value: 1000 }\n\t\t\t}\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.distance_vert,\n\t\tfragmentShader: ShaderChunk.distance_frag\n\n\t},\n\n\tshadow: {\n\n\t\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\t\tUniformsLib.lights,\n\t\t\tUniformsLib.fog,\n\t\t\t{\n\t\t\t\tcolor: { value: /*@__PURE__*/ new Color( 0x00000 ) },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\t\t] ),\n\n\t\tvertexShader: ShaderChunk.shadow_vert,\n\t\tfragmentShader: ShaderChunk.shadow_frag\n\n\t}\n\n};\n\nShaderLib.physical = {\n\n\tuniforms: /*@__PURE__*/ mergeUniforms( [\n\t\tShaderLib.standard.uniforms,\n\t\t{\n\t\t\tclearcoat: { value: 0 },\n\t\t\tclearcoatMap: { value: null },\n\t\t\tclearcoatMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tclearcoatNormalMap: { value: null },\n\t\t\tclearcoatNormalMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tclearcoatNormalScale: { value: /*@__PURE__*/ new Vector2( 1, 1 ) },\n\t\t\tclearcoatRoughness: { value: 0 },\n\t\t\tclearcoatRoughnessMap: { value: null },\n\t\t\tclearcoatRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tdispersion: { value: 0 },\n\t\t\tiridescence: { value: 0 },\n\t\t\tiridescenceMap: { value: null },\n\t\t\tiridescenceMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tiridescenceIOR: { value: 1.3 },\n\t\t\tiridescenceThicknessMinimum: { value: 100 },\n\t\t\tiridescenceThicknessMaximum: { value: 400 },\n\t\t\tiridescenceThicknessMap: { value: null },\n\t\t\tiridescenceThicknessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tsheen: { value: 0 },\n\t\t\tsheenColor: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\tsheenColorMap: { value: null },\n\t\t\tsheenColorMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tsheenRoughness: { value: 1 },\n\t\t\tsheenRoughnessMap: { value: null },\n\t\t\tsheenRoughnessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\ttransmission: { value: 0 },\n\t\t\ttransmissionMap: { value: null },\n\t\t\ttransmissionMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\ttransmissionSamplerSize: { value: /*@__PURE__*/ new Vector2() },\n\t\t\ttransmissionSamplerMap: { value: null },\n\t\t\tthickness: { value: 0 },\n\t\t\tthicknessMap: { value: null },\n\t\t\tthicknessMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tattenuationDistance: { value: 0 },\n\t\t\tattenuationColor: { value: /*@__PURE__*/ new Color( 0x000000 ) },\n\t\t\tspecularColor: { value: /*@__PURE__*/ new Color( 1, 1, 1 ) },\n\t\t\tspecularColorMap: { value: null },\n\t\t\tspecularColorMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tspecularIntensity: { value: 1 },\n\t\t\tspecularIntensityMap: { value: null },\n\t\t\tspecularIntensityMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t\tanisotropyVector: { value: /*@__PURE__*/ new Vector2() },\n\t\t\tanisotropyMap: { value: null },\n\t\t\tanisotropyMapTransform: { value: /*@__PURE__*/ new Matrix3() },\n\t\t}\n\t] ),\n\n\tvertexShader: ShaderChunk.meshphysical_vert,\n\tfragmentShader: ShaderChunk.meshphysical_frag\n\n};\n\nconst _rgb = { r: 0, b: 0, g: 0 };\nconst _e1$1 = /*@__PURE__*/ new Euler();\nconst _m1$1 = /*@__PURE__*/ new Matrix4();\n\nfunction WebGLBackground( renderer, cubemaps, cubeuvmaps, state, objects, alpha, premultipliedAlpha ) {\n\n\tconst clearColor = new Color( 0x000000 );\n\tlet clearAlpha = alpha === true ? 0 : 1;\n\n\tlet planeMesh;\n\tlet boxMesh;\n\n\tlet currentBackground = null;\n\tlet currentBackgroundVersion = 0;\n\tlet currentTonemapping = null;\n\n\tfunction getBackground( scene ) {\n\n\t\tlet background = scene.isScene === true ? scene.background : null;\n\n\t\tif ( background && background.isTexture ) {\n\n\t\t\tconst usePMREM = scene.backgroundBlurriness > 0; // use PMREM if the user wants to blur the background\n\t\t\tbackground = ( usePMREM ? cubeuvmaps : cubemaps ).get( background );\n\n\t\t}\n\n\t\treturn background;\n\n\t}\n\n\tfunction render( scene ) {\n\n\t\tlet forceClear = false;\n\t\tconst background = getBackground( scene );\n\n\t\tif ( background === null ) {\n\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t} else if ( background && background.isColor ) {\n\n\t\t\tsetClear( background, 1 );\n\t\t\tforceClear = true;\n\n\t\t}\n\n\t\tconst environmentBlendMode = renderer.xr.getEnvironmentBlendMode();\n\n\t\tif ( environmentBlendMode === 'additive' ) {\n\n\t\t\tstate.buffers.color.setClear( 0, 0, 0, 1, premultipliedAlpha );\n\n\t\t} else if ( environmentBlendMode === 'alpha-blend' ) {\n\n\t\t\tstate.buffers.color.setClear( 0, 0, 0, 0, premultipliedAlpha );\n\n\t\t}\n\n\t\tif ( renderer.autoClear || forceClear ) {\n\n\t\t\t// buffers might not be writable which is required to ensure a correct clear\n\n\t\t\tstate.buffers.depth.setTest( true );\n\t\t\tstate.buffers.depth.setMask( true );\n\t\t\tstate.buffers.color.setMask( true );\n\n\t\t\trenderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\n\t\t}\n\n\t}\n\n\tfunction addToRenderList( renderList, scene ) {\n\n\t\tconst background = getBackground( scene );\n\n\t\tif ( background && ( background.isCubeTexture || background.mapping === CubeUVReflectionMapping ) ) {\n\n\t\t\tif ( boxMesh === undefined ) {\n\n\t\t\t\tboxMesh = new Mesh(\n\t\t\t\t\tnew BoxGeometry( 1, 1, 1 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundCubeMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.backgroundCube.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.backgroundCube.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.backgroundCube.fragmentShader,\n\t\t\t\t\t\tside: BackSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false,\n\t\t\t\t\t\tallowOverride: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'normal' );\n\t\t\t\tboxMesh.geometry.deleteAttribute( 'uv' );\n\n\t\t\t\tboxMesh.onBeforeRender = function ( renderer, scene, camera ) {\n\n\t\t\t\t\tthis.matrixWorld.copyPosition( camera.matrixWorld );\n\n\t\t\t\t};\n\n\t\t\t\t// add \"envMap\" material property so the renderer can evaluate it like for built-in materials\n\t\t\t\tObject.defineProperty( boxMesh.material, 'envMap', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.envMap.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( boxMesh );\n\n\t\t\t}\n\n\t\t\t_e1$1.copy( scene.backgroundRotation );\n\n\t\t\t// accommodate left-handed frame\n\t\t\t_e1$1.x *= -1; _e1$1.y *= -1; _e1$1.z *= -1;\n\n\t\t\tif ( background.isCubeTexture && background.isRenderTargetTexture === false ) {\n\n\t\t\t\t// environment maps which are not cube render targets or PMREMs follow a different convention\n\t\t\t\t_e1$1.y *= -1;\n\t\t\t\t_e1$1.z *= -1;\n\n\t\t\t}\n\n\t\t\tboxMesh.material.uniforms.envMap.value = background;\n\t\t\tboxMesh.material.uniforms.flipEnvMap.value = ( background.isCubeTexture && background.isRenderTargetTexture === false ) ? -1 : 1;\n\t\t\tboxMesh.material.uniforms.backgroundBlurriness.value = scene.backgroundBlurriness;\n\t\t\tboxMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity;\n\t\t\tboxMesh.material.uniforms.backgroundRotation.value.setFromMatrix4( _m1$1.makeRotationFromEuler( _e1$1 ) );\n\t\t\tboxMesh.material.toneMapped = ColorManagement.getTransfer( background.colorSpace ) !== SRGBTransfer;\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tboxMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tboxMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( boxMesh, boxMesh.geometry, boxMesh.material, 0, 0, null );\n\n\t\t} else if ( background && background.isTexture ) {\n\n\t\t\tif ( planeMesh === undefined ) {\n\n\t\t\t\tplaneMesh = new Mesh(\n\t\t\t\t\tnew PlaneGeometry( 2, 2 ),\n\t\t\t\t\tnew ShaderMaterial( {\n\t\t\t\t\t\tname: 'BackgroundMaterial',\n\t\t\t\t\t\tuniforms: cloneUniforms( ShaderLib.background.uniforms ),\n\t\t\t\t\t\tvertexShader: ShaderLib.background.vertexShader,\n\t\t\t\t\t\tfragmentShader: ShaderLib.background.fragmentShader,\n\t\t\t\t\t\tside: FrontSide,\n\t\t\t\t\t\tdepthTest: false,\n\t\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\t\tfog: false,\n\t\t\t\t\t\tallowOverride: false\n\t\t\t\t\t} )\n\t\t\t\t);\n\n\t\t\t\tplaneMesh.geometry.deleteAttribute( 'normal' );\n\n\t\t\t\t// add \"map\" material property so the renderer can evaluate it like for built-in materials\n\t\t\t\tObject.defineProperty( planeMesh.material, 'map', {\n\n\t\t\t\t\tget: function () {\n\n\t\t\t\t\t\treturn this.uniforms.t2D.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tobjects.update( planeMesh );\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.t2D.value = background;\n\t\t\tplaneMesh.material.uniforms.backgroundIntensity.value = scene.backgroundIntensity;\n\t\t\tplaneMesh.material.toneMapped = ColorManagement.getTransfer( background.colorSpace ) !== SRGBTransfer;\n\n\t\t\tif ( background.matrixAutoUpdate === true ) {\n\n\t\t\t\tbackground.updateMatrix();\n\n\t\t\t}\n\n\t\t\tplaneMesh.material.uniforms.uvTransform.value.copy( background.matrix );\n\n\t\t\tif ( currentBackground !== background ||\n\t\t\t\tcurrentBackgroundVersion !== background.version ||\n\t\t\t\tcurrentTonemapping !== renderer.toneMapping ) {\n\n\t\t\t\tplaneMesh.material.needsUpdate = true;\n\n\t\t\t\tcurrentBackground = background;\n\t\t\t\tcurrentBackgroundVersion = background.version;\n\t\t\t\tcurrentTonemapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t\tplaneMesh.layers.enableAll();\n\n\t\t\t// push to the pre-sorted opaque render list\n\t\t\trenderList.unshift( planeMesh, planeMesh.geometry, planeMesh.material, 0, 0, null );\n\n\t\t}\n\n\t}\n\n\tfunction setClear( color, alpha ) {\n\n\t\tcolor.getRGB( _rgb, getUnlitUniformColorSpace( renderer ) );\n\n\t\tstate.buffers.color.setClear( _rgb.r, _rgb.g, _rgb.b, alpha, premultipliedAlpha );\n\n\t}\n\n\tfunction dispose() {\n\n\t\tif ( boxMesh !== undefined ) {\n\n\t\t\tboxMesh.geometry.dispose();\n\t\t\tboxMesh.material.dispose();\n\n\t\t\tboxMesh = undefined;\n\n\t\t}\n\n\t\tif ( planeMesh !== undefined ) {\n\n\t\t\tplaneMesh.geometry.dispose();\n\t\t\tplaneMesh.material.dispose();\n\n\t\t\tplaneMesh = undefined;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\tgetClearColor: function () {\n\n\t\t\treturn clearColor;\n\n\t\t},\n\t\tsetClearColor: function ( color, alpha = 1 ) {\n\n\t\t\tclearColor.set( color );\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\tgetClearAlpha: function () {\n\n\t\t\treturn clearAlpha;\n\n\t\t},\n\t\tsetClearAlpha: function ( alpha ) {\n\n\t\t\tclearAlpha = alpha;\n\t\t\tsetClear( clearColor, clearAlpha );\n\n\t\t},\n\t\trender: render,\n\t\taddToRenderList: addToRenderList,\n\t\tdispose: dispose\n\n\t};\n\n}\n\nfunction WebGLBindingStates( gl, attributes ) {\n\n\tconst maxVertexAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\n\tconst bindingStates = {};\n\n\tconst defaultState = createBindingState( null );\n\tlet currentState = defaultState;\n\tlet forceUpdate = false;\n\n\tfunction setup( object, material, program, geometry, index ) {\n\n\t\tlet updateBuffers = false;\n\n\t\tconst state = getBindingState( geometry, program, material );\n\n\t\tif ( currentState !== state ) {\n\n\t\t\tcurrentState = state;\n\t\t\tbindVertexArrayObject( currentState.object );\n\n\t\t}\n\n\t\tupdateBuffers = needsUpdate( object, geometry, program, index );\n\n\t\tif ( updateBuffers ) saveCache( object, geometry, program, index );\n\n\t\tif ( index !== null ) {\n\n\t\t\tattributes.update( index, gl.ELEMENT_ARRAY_BUFFER );\n\n\t\t}\n\n\t\tif ( updateBuffers || forceUpdate ) {\n\n\t\t\tforceUpdate = false;\n\n\t\t\tsetupVertexAttributes( object, material, program, geometry );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, attributes.get( index ).buffer );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction createVertexArrayObject() {\n\n\t\treturn gl.createVertexArray();\n\n\t}\n\n\tfunction bindVertexArrayObject( vao ) {\n\n\t\treturn gl.bindVertexArray( vao );\n\n\t}\n\n\tfunction deleteVertexArrayObject( vao ) {\n\n\t\treturn gl.deleteVertexArray( vao );\n\n\t}\n\n\tfunction getBindingState( geometry, program, material ) {\n\n\t\tconst wireframe = ( material.wireframe === true );\n\n\t\tlet programMap = bindingStates[ geometry.id ];\n\n\t\tif ( programMap === undefined ) {\n\n\t\t\tprogramMap = {};\n\t\t\tbindingStates[ geometry.id ] = programMap;\n\n\t\t}\n\n\t\tlet stateMap = programMap[ program.id ];\n\n\t\tif ( stateMap === undefined ) {\n\n\t\t\tstateMap = {};\n\t\t\tprogramMap[ program.id ] = stateMap;\n\n\t\t}\n\n\t\tlet state = stateMap[ wireframe ];\n\n\t\tif ( state === undefined ) {\n\n\t\t\tstate = createBindingState( createVertexArrayObject() );\n\t\t\tstateMap[ wireframe ] = state;\n\n\t\t}\n\n\t\treturn state;\n\n\t}\n\n\tfunction createBindingState( vao ) {\n\n\t\tconst newAttributes = [];\n\t\tconst enabledAttributes = [];\n\t\tconst attributeDivisors = [];\n\n\t\tfor ( let i = 0; i < maxVertexAttributes; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\t\t\tenabledAttributes[ i ] = 0;\n\t\t\tattributeDivisors[ i ] = 0;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\t// for backward compatibility on non-VAO support browser\n\t\t\tgeometry: null,\n\t\t\tprogram: null,\n\t\t\twireframe: false,\n\n\t\t\tnewAttributes: newAttributes,\n\t\t\tenabledAttributes: enabledAttributes,\n\t\t\tattributeDivisors: attributeDivisors,\n\t\t\tobject: vao,\n\t\t\tattributes: {},\n\t\t\tindex: null\n\n\t\t};\n\n\t}\n\n\tfunction needsUpdate( object, geometry, program, index ) {\n\n\t\tconst cachedAttributes = currentState.attributes;\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tconst cachedAttribute = cachedAttributes[ name ];\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( cachedAttribute === undefined ) return true;\n\n\t\t\t\tif ( cachedAttribute.attribute !== geometryAttribute ) return true;\n\n\t\t\t\tif ( geometryAttribute && cachedAttribute.data !== geometryAttribute.data ) return true;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( currentState.attributesNum !== attributesNum ) return true;\n\n\t\tif ( currentState.index !== index ) return true;\n\n\t\treturn false;\n\n\t}\n\n\tfunction saveCache( object, geometry, program, index ) {\n\n\t\tconst cache = {};\n\t\tconst attributes = geometry.attributes;\n\t\tlet attributesNum = 0;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet attribute = attributes[ name ];\n\n\t\t\t\tif ( attribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) attribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) attribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tconst data = {};\n\t\t\t\tdata.attribute = attribute;\n\n\t\t\t\tif ( attribute && attribute.data ) {\n\n\t\t\t\t\tdata.data = attribute.data;\n\n\t\t\t\t}\n\n\t\t\t\tcache[ name ] = data;\n\n\t\t\t\tattributesNum ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tcurrentState.attributes = cache;\n\t\tcurrentState.attributesNum = attributesNum;\n\n\t\tcurrentState.index = index;\n\n\t}\n\n\tfunction initAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\n\t\tfor ( let i = 0, il = newAttributes.length; i < il; i ++ ) {\n\n\t\t\tnewAttributes[ i ] = 0;\n\n\t\t}\n\n\t}\n\n\tfunction enableAttribute( attribute ) {\n\n\t\tenableAttributeAndDivisor( attribute, 0 );\n\n\t}\n\n\tfunction enableAttributeAndDivisor( attribute, meshPerAttribute ) {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\t\tconst attributeDivisors = currentState.attributeDivisors;\n\n\t\tnewAttributes[ attribute ] = 1;\n\n\t\tif ( enabledAttributes[ attribute ] === 0 ) {\n\n\t\t\tgl.enableVertexAttribArray( attribute );\n\t\t\tenabledAttributes[ attribute ] = 1;\n\n\t\t}\n\n\t\tif ( attributeDivisors[ attribute ] !== meshPerAttribute ) {\n\n\t\t\tgl.vertexAttribDivisor( attribute, meshPerAttribute );\n\t\t\tattributeDivisors[ attribute ] = meshPerAttribute;\n\n\t\t}\n\n\t}\n\n\tfunction disableUnusedAttributes() {\n\n\t\tconst newAttributes = currentState.newAttributes;\n\t\tconst enabledAttributes = currentState.enabledAttributes;\n\n\t\tfor ( let i = 0, il = enabledAttributes.length; i < il; i ++ ) {\n\n\t\t\tif ( enabledAttributes[ i ] !== newAttributes[ i ] ) {\n\n\t\t\t\tgl.disableVertexAttribArray( i );\n\t\t\t\tenabledAttributes[ i ] = 0;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction vertexAttribPointer( index, size, type, normalized, stride, offset, integer ) {\n\n\t\tif ( integer === true ) {\n\n\t\t\tgl.vertexAttribIPointer( index, size, type, stride, offset );\n\n\t\t} else {\n\n\t\t\tgl.vertexAttribPointer( index, size, type, normalized, stride, offset );\n\n\t\t}\n\n\t}\n\n\tfunction setupVertexAttributes( object, material, program, geometry ) {\n\n\t\tinitAttributes();\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\tconst programAttributes = program.getAttributes();\n\n\t\tconst materialDefaultAttributeValues = material.defaultAttributeValues;\n\n\t\tfor ( const name in programAttributes ) {\n\n\t\t\tconst programAttribute = programAttributes[ name ];\n\n\t\t\tif ( programAttribute.location >= 0 ) {\n\n\t\t\t\tlet geometryAttribute = geometryAttributes[ name ];\n\n\t\t\t\tif ( geometryAttribute === undefined ) {\n\n\t\t\t\t\tif ( name === 'instanceMatrix' && object.instanceMatrix ) geometryAttribute = object.instanceMatrix;\n\t\t\t\t\tif ( name === 'instanceColor' && object.instanceColor ) geometryAttribute = object.instanceColor;\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometryAttribute !== undefined ) {\n\n\t\t\t\t\tconst normalized = geometryAttribute.normalized;\n\t\t\t\t\tconst size = geometryAttribute.itemSize;\n\n\t\t\t\t\tconst attribute = attributes.get( geometryAttribute );\n\n\t\t\t\t\t// TODO Attribute may not be available on context restore\n\n\t\t\t\t\tif ( attribute === undefined ) continue;\n\n\t\t\t\t\tconst buffer = attribute.buffer;\n\t\t\t\t\tconst type = attribute.type;\n\t\t\t\t\tconst bytesPerElement = attribute.bytesPerElement;\n\n\t\t\t\t\t// check for integer attributes\n\n\t\t\t\t\tconst integer = ( type === gl.INT || type === gl.UNSIGNED_INT || geometryAttribute.gpuType === IntType );\n\n\t\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\t\t\tconst data = geometryAttribute.data;\n\t\t\t\t\t\tconst stride = data.stride;\n\t\t\t\t\t\tconst offset = geometryAttribute.offset;\n\n\t\t\t\t\t\tif ( data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, data.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = data.meshPerAttribute * data.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tstride * bytesPerElement,\n\t\t\t\t\t\t\t\t( offset + ( size / programAttribute.locationSize ) * i ) * bytesPerElement,\n\t\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( geometryAttribute.isInstancedBufferAttribute ) {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttributeAndDivisor( programAttribute.location + i, geometryAttribute.meshPerAttribute );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( object.isInstancedMesh !== true && geometry._maxInstanceCount === undefined ) {\n\n\t\t\t\t\t\t\t\tgeometry._maxInstanceCount = geometryAttribute.meshPerAttribute * geometryAttribute.count;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\t\tenableAttribute( programAttribute.location + i );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, buffer );\n\n\t\t\t\t\t\tfor ( let i = 0; i < programAttribute.locationSize; i ++ ) {\n\n\t\t\t\t\t\t\tvertexAttribPointer(\n\t\t\t\t\t\t\t\tprogramAttribute.location + i,\n\t\t\t\t\t\t\t\tsize / programAttribute.locationSize,\n\t\t\t\t\t\t\t\ttype,\n\t\t\t\t\t\t\t\tnormalized,\n\t\t\t\t\t\t\t\tsize * bytesPerElement,\n\t\t\t\t\t\t\t\t( size / programAttribute.locationSize ) * i * bytesPerElement,\n\t\t\t\t\t\t\t\tinteger\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( materialDefaultAttributeValues !== undefined ) {\n\n\t\t\t\t\tconst value = materialDefaultAttributeValues[ name ];\n\n\t\t\t\t\tif ( value !== undefined ) {\n\n\t\t\t\t\t\tswitch ( value.length ) {\n\n\t\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\t\tgl.vertexAttrib2fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\tgl.vertexAttrib3fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\tgl.vertexAttrib4fv( programAttribute.location, value );\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tgl.vertexAttrib1fv( programAttribute.location, value );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tdisableUnusedAttributes();\n\n\t}\n\n\tfunction dispose() {\n\n\t\treset();\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tfor ( const programId in programMap ) {\n\n\t\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t\t}\n\n\t\t\t\tdelete programMap[ programId ];\n\n\t\t\t}\n\n\t\t\tdelete bindingStates[ geometryId ];\n\n\t\t}\n\n\t}\n\n\tfunction releaseStatesOfGeometry( geometry ) {\n\n\t\tif ( bindingStates[ geometry.id ] === undefined ) return;\n\n\t\tconst programMap = bindingStates[ geometry.id ];\n\n\t\tfor ( const programId in programMap ) {\n\n\t\t\tconst stateMap = programMap[ programId ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ programId ];\n\n\t\t}\n\n\t\tdelete bindingStates[ geometry.id ];\n\n\t}\n\n\tfunction releaseStatesOfProgram( program ) {\n\n\t\tfor ( const geometryId in bindingStates ) {\n\n\t\t\tconst programMap = bindingStates[ geometryId ];\n\n\t\t\tif ( programMap[ program.id ] === undefined ) continue;\n\n\t\t\tconst stateMap = programMap[ program.id ];\n\n\t\t\tfor ( const wireframe in stateMap ) {\n\n\t\t\t\tdeleteVertexArrayObject( stateMap[ wireframe ].object );\n\n\t\t\t\tdelete stateMap[ wireframe ];\n\n\t\t\t}\n\n\t\t\tdelete programMap[ program.id ];\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\tresetDefaultState();\n\t\tforceUpdate = true;\n\n\t\tif ( currentState === defaultState ) return;\n\n\t\tcurrentState = defaultState;\n\t\tbindVertexArrayObject( currentState.object );\n\n\t}\n\n\t// for backward-compatibility\n\n\tfunction resetDefaultState() {\n\n\t\tdefaultState.geometry = null;\n\t\tdefaultState.program = null;\n\t\tdefaultState.wireframe = false;\n\n\t}\n\n\treturn {\n\n\t\tsetup: setup,\n\t\treset: reset,\n\t\tresetDefaultState: resetDefaultState,\n\t\tdispose: dispose,\n\t\treleaseStatesOfGeometry: releaseStatesOfGeometry,\n\t\treleaseStatesOfProgram: releaseStatesOfProgram,\n\n\t\tinitAttributes: initAttributes,\n\t\tenableAttribute: enableAttribute,\n\t\tdisableUnusedAttributes: disableUnusedAttributes\n\n\t};\n\n}\n\nfunction WebGLBufferRenderer( gl, extensions, info ) {\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawArrays( mode, start, count );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tgl.drawArraysInstanced( mode, start, count, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\tfunction renderMultiDraw( starts, counts, drawCount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\t\textension.multiDrawArraysWEBGL( mode, starts, 0, counts, 0, drawCount );\n\n\t\tlet elementCount = 0;\n\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\telementCount += counts[ i ];\n\n\t\t}\n\n\t\tinfo.update( elementCount, mode, 1 );\n\n\t}\n\n\tfunction renderMultiDrawInstances( starts, counts, drawCount, primcount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\n\t\tif ( extension === null ) {\n\n\t\t\tfor ( let i = 0; i < starts.length; i ++ ) {\n\n\t\t\t\trenderInstances( starts[ i ], counts[ i ], primcount[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\textension.multiDrawArraysInstancedWEBGL( mode, starts, 0, counts, 0, primcount, 0, drawCount );\n\n\t\t\tlet elementCount = 0;\n\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\telementCount += counts[ i ] * primcount[ i ];\n\n\t\t\t}\n\n\t\t\tinfo.update( elementCount, mode, 1 );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\tthis.renderMultiDraw = renderMultiDraw;\n\tthis.renderMultiDrawInstances = renderMultiDrawInstances;\n\n}\n\nfunction WebGLCapabilities( gl, extensions, parameters, utils ) {\n\n\tlet maxAnisotropy;\n\n\tfunction getMaxAnisotropy() {\n\n\t\tif ( maxAnisotropy !== undefined ) return maxAnisotropy;\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tmaxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t} else {\n\n\t\t\tmaxAnisotropy = 0;\n\n\t\t}\n\n\t\treturn maxAnisotropy;\n\n\t}\n\n\tfunction textureFormatReadable( textureFormat ) {\n\n\t\tif ( textureFormat !== RGBAFormat && utils.convert( textureFormat ) !== gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_FORMAT ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfunction textureTypeReadable( textureType ) {\n\n\t\tconst halfFloatSupportedByExt = ( textureType === HalfFloatType ) && ( extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' ) );\n\n\t\tif ( textureType !== UnsignedByteType && utils.convert( textureType ) !== gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_TYPE ) && // Edge and Chrome Mac < 52 (#9513)\n\t\t\ttextureType !== FloatType && ! halfFloatSupportedByExt ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tfunction getMaxPrecision( precision ) {\n\n\t\tif ( precision === 'highp' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.HIGH_FLOAT ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.HIGH_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'highp';\n\n\t\t\t}\n\n\t\t\tprecision = 'mediump';\n\n\t\t}\n\n\t\tif ( precision === 'mediump' ) {\n\n\t\t\tif ( gl.getShaderPrecisionFormat( gl.VERTEX_SHADER, gl.MEDIUM_FLOAT ).precision > 0 &&\n\t\t\t\tgl.getShaderPrecisionFormat( gl.FRAGMENT_SHADER, gl.MEDIUM_FLOAT ).precision > 0 ) {\n\n\t\t\t\treturn 'mediump';\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn 'lowp';\n\n\t}\n\n\tlet precision = parameters.precision !== undefined ? parameters.precision : 'highp';\n\tconst maxPrecision = getMaxPrecision( precision );\n\n\tif ( maxPrecision !== precision ) {\n\n\t\twarn( 'WebGLRenderer:', precision, 'not supported, using', maxPrecision, 'instead.' );\n\t\tprecision = maxPrecision;\n\n\t}\n\n\tconst logarithmicDepthBuffer = parameters.logarithmicDepthBuffer === true;\n\tconst reversedDepthBuffer = parameters.reversedDepthBuffer === true && extensions.has( 'EXT_clip_control' );\n\n\tconst maxTextures = gl.getParameter( gl.MAX_TEXTURE_IMAGE_UNITS );\n\tconst maxVertexTextures = gl.getParameter( gl.MAX_VERTEX_TEXTURE_IMAGE_UNITS );\n\tconst maxTextureSize = gl.getParameter( gl.MAX_TEXTURE_SIZE );\n\tconst maxCubemapSize = gl.getParameter( gl.MAX_CUBE_MAP_TEXTURE_SIZE );\n\n\tconst maxAttributes = gl.getParameter( gl.MAX_VERTEX_ATTRIBS );\n\tconst maxVertexUniforms = gl.getParameter( gl.MAX_VERTEX_UNIFORM_VECTORS );\n\tconst maxVaryings = gl.getParameter( gl.MAX_VARYING_VECTORS );\n\tconst maxFragmentUniforms = gl.getParameter( gl.MAX_FRAGMENT_UNIFORM_VECTORS );\n\n\tconst maxSamples = gl.getParameter( gl.MAX_SAMPLES );\n\tconst samples = gl.getParameter( gl.SAMPLES );\n\n\treturn {\n\n\t\tisWebGL2: true, // keeping this for backwards compatibility\n\n\t\tgetMaxAnisotropy: getMaxAnisotropy,\n\t\tgetMaxPrecision: getMaxPrecision,\n\n\t\ttextureFormatReadable: textureFormatReadable,\n\t\ttextureTypeReadable: textureTypeReadable,\n\n\t\tprecision: precision,\n\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\t\treversedDepthBuffer: reversedDepthBuffer,\n\n\t\tmaxTextures: maxTextures,\n\t\tmaxVertexTextures: maxVertexTextures,\n\t\tmaxTextureSize: maxTextureSize,\n\t\tmaxCubemapSize: maxCubemapSize,\n\n\t\tmaxAttributes: maxAttributes,\n\t\tmaxVertexUniforms: maxVertexUniforms,\n\t\tmaxVaryings: maxVaryings,\n\t\tmaxFragmentUniforms: maxFragmentUniforms,\n\n\t\tmaxSamples: maxSamples,\n\n\t\tsamples: samples\n\n\t};\n\n}\n\nfunction WebGLClipping( properties ) {\n\n\tconst scope = this;\n\n\tlet globalState = null,\n\t\tnumGlobalPlanes = 0,\n\t\tlocalClippingEnabled = false,\n\t\trenderingShadows = false;\n\n\tconst plane = new Plane(),\n\t\tviewNormalMatrix = new Matrix3(),\n\n\t\tuniform = { value: null, needsUpdate: false };\n\n\tthis.uniform = uniform;\n\tthis.numPlanes = 0;\n\tthis.numIntersection = 0;\n\n\tthis.init = function ( planes, enableLocalClipping ) {\n\n\t\tconst enabled =\n\t\t\tplanes.length !== 0 ||\n\t\t\tenableLocalClipping ||\n\t\t\t// enable state of previous frame - the clipping code has to\n\t\t\t// run another frame in order to reset the state:\n\t\t\tnumGlobalPlanes !== 0 ||\n\t\t\tlocalClippingEnabled;\n\n\t\tlocalClippingEnabled = enableLocalClipping;\n\n\t\tnumGlobalPlanes = planes.length;\n\n\t\treturn enabled;\n\n\t};\n\n\tthis.beginShadows = function () {\n\n\t\trenderingShadows = true;\n\t\tprojectPlanes( null );\n\n\t};\n\n\tthis.endShadows = function () {\n\n\t\trenderingShadows = false;\n\n\t};\n\n\tthis.setGlobalState = function ( planes, camera ) {\n\n\t\tglobalState = projectPlanes( planes, camera, 0 );\n\n\t};\n\n\tthis.setState = function ( material, camera, useCache ) {\n\n\t\tconst planes = material.clippingPlanes,\n\t\t\tclipIntersection = material.clipIntersection,\n\t\t\tclipShadows = material.clipShadows;\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tif ( ! localClippingEnabled || planes === null || planes.length === 0 || renderingShadows && ! clipShadows ) {\n\n\t\t\t// there's no local clipping\n\n\t\t\tif ( renderingShadows ) {\n\n\t\t\t\t// there's no global clipping\n\n\t\t\t\tprojectPlanes( null );\n\n\t\t\t} else {\n\n\t\t\t\tresetGlobalState();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst nGlobal = renderingShadows ? 0 : numGlobalPlanes,\n\t\t\t\tlGlobal = nGlobal * 4;\n\n\t\t\tlet dstArray = materialProperties.clippingState || null;\n\n\t\t\tuniform.value = dstArray; // ensure unique state\n\n\t\t\tdstArray = projectPlanes( planes, camera, lGlobal, useCache );\n\n\t\t\tfor ( let i = 0; i !== lGlobal; ++ i ) {\n\n\t\t\t\tdstArray[ i ] = globalState[ i ];\n\n\t\t\t}\n\n\t\t\tmaterialProperties.clippingState = dstArray;\n\t\t\tthis.numIntersection = clipIntersection ? this.numPlanes : 0;\n\t\t\tthis.numPlanes += nGlobal;\n\n\t\t}\n\n\n\t};\n\n\tfunction resetGlobalState() {\n\n\t\tif ( uniform.value !== globalState ) {\n\n\t\t\tuniform.value = globalState;\n\t\t\tuniform.needsUpdate = numGlobalPlanes > 0;\n\n\t\t}\n\n\t\tscope.numPlanes = numGlobalPlanes;\n\t\tscope.numIntersection = 0;\n\n\t}\n\n\tfunction projectPlanes( planes, camera, dstOffset, skipTransform ) {\n\n\t\tconst nPlanes = planes !== null ? planes.length : 0;\n\t\tlet dstArray = null;\n\n\t\tif ( nPlanes !== 0 ) {\n\n\t\t\tdstArray = uniform.value;\n\n\t\t\tif ( skipTransform !== true || dstArray === null ) {\n\n\t\t\t\tconst flatSize = dstOffset + nPlanes * 4,\n\t\t\t\t\tviewMatrix = camera.matrixWorldInverse;\n\n\t\t\t\tviewNormalMatrix.getNormalMatrix( viewMatrix );\n\n\t\t\t\tif ( dstArray === null || dstArray.length < flatSize ) {\n\n\t\t\t\t\tdstArray = new Float32Array( flatSize );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, i4 = dstOffset; i !== nPlanes; ++ i, i4 += 4 ) {\n\n\t\t\t\t\tplane.copy( planes[ i ] ).applyMatrix4( viewMatrix, viewNormalMatrix );\n\n\t\t\t\t\tplane.normal.toArray( dstArray, i4 );\n\t\t\t\t\tdstArray[ i4 + 3 ] = plane.constant;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tuniform.value = dstArray;\n\t\t\tuniform.needsUpdate = true;\n\n\t\t}\n\n\t\tscope.numPlanes = nPlanes;\n\t\tscope.numIntersection = 0;\n\n\t\treturn dstArray;\n\n\t}\n\n}\n\nfunction WebGLCubeMaps( renderer ) {\n\n\tlet cubemaps = new WeakMap();\n\n\tfunction mapTextureMapping( texture, mapping ) {\n\n\t\tif ( mapping === EquirectangularReflectionMapping ) {\n\n\t\t\ttexture.mapping = CubeReflectionMapping;\n\n\t\t} else if ( mapping === EquirectangularRefractionMapping ) {\n\n\t\t\ttexture.mapping = CubeRefractionMapping;\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tif ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) {\n\n\t\t\t\tif ( cubemaps.has( texture ) ) {\n\n\t\t\t\t\tconst cubemap = cubemaps.get( texture ).texture;\n\t\t\t\t\treturn mapTextureMapping( cubemap, texture.mapping );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\tif ( image && image.height > 0 ) {\n\n\t\t\t\t\t\tconst renderTarget = new WebGLCubeRenderTarget( image.height );\n\t\t\t\t\t\trenderTarget.fromEquirectangularTexture( renderer, texture );\n\t\t\t\t\t\tcubemaps.set( texture, renderTarget );\n\n\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\treturn mapTextureMapping( renderTarget.texture, texture.mapping );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemap = cubemaps.get( texture );\n\n\t\tif ( cubemap !== undefined ) {\n\n\t\t\tcubemaps.delete( texture );\n\t\t\tcubemap.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubemaps = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nconst LOD_MIN = 4;\n\n// The standard deviations (radians) associated with the extra mips.\n// Used for scene blur in fromScene() method.\nconst EXTRA_LOD_SIGMA = [ 0.125, 0.215, 0.35, 0.446, 0.526, 0.582 ];\n\n// The maximum length of the blur for loop. Smaller sigmas will use fewer\n// samples and exit early, but not recompile the shader.\n// Used for scene blur in fromScene() method.\nconst MAX_SAMPLES = 20;\n\n// GGX VNDF importance sampling configuration\nconst GGX_SAMPLES = 256;\n\nconst _flatCamera = /*@__PURE__*/ new OrthographicCamera();\nconst _clearColor = /*@__PURE__*/ new Color();\nlet _oldTarget = null;\nlet _oldActiveCubeFace = 0;\nlet _oldActiveMipmapLevel = 0;\nlet _oldXrEnabled = false;\n\nconst _origin = /*@__PURE__*/ new Vector3();\n\n/**\n * This class generates a Prefiltered, Mipmapped Radiance Environment Map\n * (PMREM) from a cubeMap environment texture. This allows different levels of\n * blur to be quickly accessed based on material roughness. It is packed into a\n * special CubeUV format that allows us to perform custom interpolation so that\n * we can support nonlinear formats such as RGBE. Unlike a traditional mipmap\n * chain, it only goes down to the LOD_MIN level (above), and then creates extra\n * even more filtered 'mips' at the same LOD_MIN resolution, associated with\n * higher roughness levels. In this way we maintain resolution to smoothly\n * interpolate diffuse lighting while limiting sampling computation.\n *\n * The prefiltering uses GGX VNDF (Visible Normal Distribution Function)\n * importance sampling based on \"Sampling the GGX Distribution of Visible Normals\"\n * (Heitz, 2018) to generate environment maps that accurately match the GGX BRDF\n * used in material rendering for physically-based image-based lighting.\n */\nclass PMREMGenerator {\n\n\t/**\n\t * Constructs a new PMREM generator.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t */\n\tconstructor( renderer ) {\n\n\t\tthis._renderer = renderer;\n\t\tthis._pingPongRenderTarget = null;\n\n\t\tthis._lodMax = 0;\n\t\tthis._cubeSize = 0;\n\t\tthis._sizeLods = [];\n\t\tthis._sigmas = [];\n\t\tthis._lodMeshes = [];\n\n\t\tthis._backgroundBox = null;\n\n\t\tthis._cubemapMaterial = null;\n\t\tthis._equirectMaterial = null;\n\n\t\tthis._blurMaterial = null;\n\t\tthis._ggxMaterial = null;\n\n\t}\n\n\t/**\n\t * Generates a PMREM from a supplied Scene, which can be faster than using an\n\t * image if networking bandwidth is low. Optional sigma specifies a blur radius\n\t * in radians to be applied to the scene before PMREM generation. Optional near\n\t * and far planes ensure the scene is rendered in its entirety.\n\t *\n\t * @param {Scene} scene - The scene to be captured.\n\t * @param {number} [sigma=0] - The blur radius in radians.\n\t * @param {number} [near=0.1] - The near plane distance.\n\t * @param {number} [far=100] - The far plane distance.\n\t * @param {Object} [options={}] - The configuration options.\n\t * @param {number} [options.size=256] - The texture size of the PMREM.\n\t * @param {Vector3} [options.position=origin] - The position of the internal cube camera that renders the scene.\n\t * @return {WebGLRenderTarget} The resulting PMREM.\n\t */\n\tfromScene( scene, sigma = 0, near = 0.1, far = 100, options = {} ) {\n\n\t\tconst {\n\t\t\tsize = 256,\n\t\t\tposition = _origin,\n\t\t} = options;\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\t_oldActiveCubeFace = this._renderer.getActiveCubeFace();\n\t\t_oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();\n\t\t_oldXrEnabled = this._renderer.xr.enabled;\n\n\t\tthis._renderer.xr.enabled = false;\n\n\t\tthis._setSize( size );\n\n\t\tconst cubeUVRenderTarget = this._allocateTargets();\n\t\tcubeUVRenderTarget.depthBuffer = true;\n\n\t\tthis._sceneToCubeUV( scene, near, far, cubeUVRenderTarget, position );\n\n\t\tif ( sigma > 0 ) {\n\n\t\t\tthis._blur( cubeUVRenderTarget, 0, 0, sigma );\n\n\t\t}\n\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an equirectangular texture, which can be either LDR\n\t * or HDR. The ideal input image size is 1k (1024 x 512),\n\t * as this matches best with the 256 x 256 cubemap output.\n\t *\n\t * @param {Texture} equirectangular - The equirectangular texture to be converted.\n\t * @param {?WebGLRenderTarget} [renderTarget=null] - The render target to use.\n\t * @return {WebGLRenderTarget} The resulting PMREM.\n\t */\n\tfromEquirectangular( equirectangular, renderTarget = null ) {\n\n\t\treturn this._fromTexture( equirectangular, renderTarget );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an cubemap texture, which can be either LDR\n\t * or HDR. The ideal input cube size is 256 x 256,\n\t * as this matches best with the 256 x 256 cubemap output.\n\t *\n\t * @param {Texture} cubemap - The cubemap texture to be converted.\n\t * @param {?WebGLRenderTarget} [renderTarget=null] - The render target to use.\n\t * @return {WebGLRenderTarget} The resulting PMREM.\n\t */\n\tfromCubemap( cubemap, renderTarget = null ) {\n\n\t\treturn this._fromTexture( cubemap, renderTarget );\n\n\t}\n\n\t/**\n\t * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileCubemapShader() {\n\n\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\t\t\tthis._compileMaterial( this._cubemapMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t */\n\tcompileEquirectangularShader() {\n\n\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\t\t\tthis._compileMaterial( this._equirectMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class,\n\t * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on\n\t * one of them will cause any others to also become unusable.\n\t */\n\tdispose() {\n\n\t\tthis._dispose();\n\n\t\tif ( this._cubemapMaterial !== null ) this._cubemapMaterial.dispose();\n\t\tif ( this._equirectMaterial !== null ) this._equirectMaterial.dispose();\n\n\t\tif ( this._backgroundBox !== null ) {\n\n\t\t\tthis._backgroundBox.geometry.dispose();\n\t\t\tthis._backgroundBox.material.dispose();\n\n\t\t}\n\n\t}\n\n\t// private interface\n\n\t_setSize( cubeSize ) {\n\n\t\tthis._lodMax = Math.floor( Math.log2( cubeSize ) );\n\t\tthis._cubeSize = Math.pow( 2, this._lodMax );\n\n\t}\n\n\t_dispose() {\n\n\t\tif ( this._blurMaterial !== null ) this._blurMaterial.dispose();\n\t\tif ( this._ggxMaterial !== null ) this._ggxMaterial.dispose();\n\n\t\tif ( this._pingPongRenderTarget !== null ) this._pingPongRenderTarget.dispose();\n\n\t\tfor ( let i = 0; i < this._lodMeshes.length; i ++ ) {\n\n\t\t\tthis._lodMeshes[ i ].geometry.dispose();\n\n\t\t}\n\n\t}\n\n\t_cleanup( outputTarget ) {\n\n\t\tthis._renderer.setRenderTarget( _oldTarget, _oldActiveCubeFace, _oldActiveMipmapLevel );\n\t\tthis._renderer.xr.enabled = _oldXrEnabled;\n\n\t\toutputTarget.scissorTest = false;\n\t\t_setViewport( outputTarget, 0, 0, outputTarget.width, outputTarget.height );\n\n\t}\n\n\t_fromTexture( texture, renderTarget ) {\n\n\t\tif ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping ) {\n\n\t\t\tthis._setSize( texture.image.length === 0 ? 16 : ( texture.image[ 0 ].width || texture.image[ 0 ].image.width ) );\n\n\t\t} else { // Equirectangular\n\n\t\t\tthis._setSize( texture.image.width / 4 );\n\n\t\t}\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\t_oldActiveCubeFace = this._renderer.getActiveCubeFace();\n\t\t_oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();\n\t\t_oldXrEnabled = this._renderer.xr.enabled;\n\n\t\tthis._renderer.xr.enabled = false;\n\n\t\tconst cubeUVRenderTarget = renderTarget || this._allocateTargets();\n\t\tthis._textureToCubeUV( texture, cubeUVRenderTarget );\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_allocateTargets() {\n\n\t\tconst width = 3 * Math.max( this._cubeSize, 16 * 7 );\n\t\tconst height = 4 * this._cubeSize;\n\n\t\tconst params = {\n\t\t\tmagFilter: LinearFilter,\n\t\t\tminFilter: LinearFilter,\n\t\t\tgenerateMipmaps: false,\n\t\t\ttype: HalfFloatType,\n\t\t\tformat: RGBAFormat,\n\t\t\tcolorSpace: LinearSRGBColorSpace,\n\t\t\tdepthBuffer: false\n\t\t};\n\n\t\tconst cubeUVRenderTarget = _createRenderTarget( width, height, params );\n\n\t\tif ( this._pingPongRenderTarget === null || this._pingPongRenderTarget.width !== width || this._pingPongRenderTarget.height !== height ) {\n\n\t\t\tif ( this._pingPongRenderTarget !== null ) {\n\n\t\t\t\tthis._dispose();\n\n\t\t\t}\n\n\t\t\tthis._pingPongRenderTarget = _createRenderTarget( width, height, params );\n\n\t\t\tconst { _lodMax } = this;\n\t\t\t( { lodMeshes: this._lodMeshes, sizeLods: this._sizeLods, sigmas: this._sigmas } = _createPlanes( _lodMax ) );\n\n\t\t\tthis._blurMaterial = _getBlurShader( _lodMax, width, height );\n\t\t\tthis._ggxMaterial = _getGGXShader( _lodMax, width, height );\n\n\t\t}\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_compileMaterial( material ) {\n\n\t\tconst mesh = new Mesh( new BufferGeometry(), material );\n\t\tthis._renderer.compile( mesh, _flatCamera );\n\n\t}\n\n\t_sceneToCubeUV( scene, near, far, cubeUVRenderTarget, position ) {\n\n\t\tconst fov = 90;\n\t\tconst aspect = 1;\n\t\tconst cubeCamera = new PerspectiveCamera( fov, aspect, near, far );\n\t\tconst upSign = [ 1, -1, 1, 1, 1, 1 ];\n\t\tconst forwardSign = [ 1, 1, 1, -1, -1, -1 ];\n\t\tconst renderer = this._renderer;\n\n\t\tconst originalAutoClear = renderer.autoClear;\n\t\tconst toneMapping = renderer.toneMapping;\n\t\trenderer.getClearColor( _clearColor );\n\n\t\trenderer.toneMapping = NoToneMapping;\n\t\trenderer.autoClear = false;\n\n\t\t// https://github.com/mrdoob/three.js/issues/31413#issuecomment-3095966812\n\t\tconst reversedDepthBuffer = renderer.state.buffers.depth.getReversed();\n\n\t\tif ( reversedDepthBuffer ) {\n\n\t\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\t\trenderer.clearDepth();\n\t\t\trenderer.setRenderTarget( null );\n\n\t\t}\n\n\t\tif ( this._backgroundBox === null ) {\n\n\t\t\tthis._backgroundBox = new Mesh(\n\t\t\t\tnew BoxGeometry(),\n\t\t\t\tnew MeshBasicMaterial( {\n\t\t\t\t\tname: 'PMREM.Background',\n\t\t\t\t\tside: BackSide,\n\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\tdepthTest: false,\n\t\t\t\t} )\n\t\t\t);\n\n\t\t}\n\n\t\tconst backgroundBox = this._backgroundBox;\n\t\tconst backgroundMaterial = backgroundBox.material;\n\n\t\tlet useSolidColor = false;\n\n\t\tconst background = scene.background;\n\n\t\tif ( background ) {\n\n\t\t\tif ( background.isColor ) {\n\n\t\t\t\tbackgroundMaterial.color.copy( background );\n\t\t\t\tscene.background = null;\n\t\t\t\tuseSolidColor = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tbackgroundMaterial.color.copy( _clearColor );\n\t\t\tuseSolidColor = true;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst col = i % 3;\n\n\t\t\tif ( col === 0 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.position.set( position.x, position.y, position.z );\n\t\t\t\tcubeCamera.lookAt( position.x + forwardSign[ i ], position.y, position.z );\n\n\t\t\t} else if ( col === 1 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, 0, upSign[ i ] );\n\t\t\t\tcubeCamera.position.set( position.x, position.y, position.z );\n\t\t\t\tcubeCamera.lookAt( position.x, position.y + forwardSign[ i ], position.z );\n\n\n\t\t\t} else {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.position.set( position.x, position.y, position.z );\n\t\t\t\tcubeCamera.lookAt( position.x, position.y, position.z + forwardSign[ i ] );\n\n\t\t\t}\n\n\t\t\tconst size = this._cubeSize;\n\n\t\t\t_setViewport( cubeUVRenderTarget, col * size, i > 2 ? size : 0, size, size );\n\n\t\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\n\t\t\tif ( useSolidColor ) {\n\n\t\t\t\trenderer.render( backgroundBox, cubeCamera );\n\n\t\t\t}\n\n\t\t\trenderer.render( scene, cubeCamera );\n\n\t\t}\n\n\t\trenderer.toneMapping = toneMapping;\n\t\trenderer.autoClear = originalAutoClear;\n\t\tscene.background = background;\n\n\t}\n\n\t_textureToCubeUV( texture, cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\n\t\tconst isCubeTexture = ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping );\n\n\t\tif ( isCubeTexture ) {\n\n\t\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\n\t\t\t}\n\n\t\t\tthis._cubemapMaterial.uniforms.flipEnvMap.value = ( texture.isRenderTargetTexture === false ) ? -1 : 1;\n\n\t\t} else {\n\n\t\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst material = isCubeTexture ? this._cubemapMaterial : this._equirectMaterial;\n\n\t\tconst mesh = this._lodMeshes[ 0 ];\n\t\tmesh.material = material;\n\n\t\tconst uniforms = material.uniforms;\n\n\t\tuniforms[ 'envMap' ].value = texture;\n\n\t\tconst size = this._cubeSize;\n\n\t\t_setViewport( cubeUVRenderTarget, 0, 0, 3 * size, 2 * size );\n\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\trenderer.render( mesh, _flatCamera );\n\n\t}\n\n\t_applyPMREM( cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst autoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tconst n = this._lodMeshes.length;\n\n\t\t// Use GGX VNDF importance sampling\n\t\tfor ( let i = 1; i < n; i ++ ) {\n\n\t\t\tthis._applyGGXFilter( cubeUVRenderTarget, i - 1, i );\n\n\t\t}\n\n\t\trenderer.autoClear = autoClear;\n\n\t}\n\n\t/**\n\t * Applies GGX VNDF importance sampling filter to generate a prefiltered environment map.\n\t * Uses Monte Carlo integration with VNDF importance sampling to accurately represent the\n\t * GGX BRDF for physically-based rendering. Reads from the previous LOD level and\n\t * applies incremental roughness filtering to avoid over-blurring.\n\t *\n\t * @private\n\t * @param {WebGLRenderTarget} cubeUVRenderTarget\n\t * @param {number} lodIn - Source LOD level to read from\n\t * @param {number} lodOut - Target LOD level to write to\n\t */\n\t_applyGGXFilter( cubeUVRenderTarget, lodIn, lodOut ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst pingPongRenderTarget = this._pingPongRenderTarget;\n\n\t\tconst ggxMaterial = this._ggxMaterial;\n\t\tconst ggxMesh = this._lodMeshes[ lodOut ];\n\t\tggxMesh.material = ggxMaterial;\n\n\t\tconst ggxUniforms = ggxMaterial.uniforms;\n\n\t\t// Calculate incremental roughness between LOD levels\n\t\tconst targetRoughness = lodOut / ( this._lodMeshes.length - 1 );\n\t\tconst sourceRoughness = lodIn / ( this._lodMeshes.length - 1 );\n\t\tconst incrementalRoughness = Math.sqrt( targetRoughness * targetRoughness - sourceRoughness * sourceRoughness );\n\n\t\t// Apply blur strength mapping for better quality across the roughness range\n\t\tconst blurStrength = 0.0 + targetRoughness * 1.25;\n\t\tconst adjustedRoughness = incrementalRoughness * blurStrength;\n\n\t\t// Calculate viewport position based on output LOD level\n\t\tconst { _lodMax } = this;\n\t\tconst outputSize = this._sizeLods[ lodOut ];\n\t\tconst x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 );\n\t\tconst y = 4 * ( this._cubeSize - outputSize );\n\n\t\t// Read from previous LOD with incremental roughness\n\t\tggxUniforms[ 'envMap' ].value = cubeUVRenderTarget.texture;\n\t\tggxUniforms[ 'roughness' ].value = adjustedRoughness;\n\t\tggxUniforms[ 'mipInt' ].value = _lodMax - lodIn; // Sample from input LOD\n\n\t\t_setViewport( pingPongRenderTarget, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( pingPongRenderTarget );\n\t\trenderer.render( ggxMesh, _flatCamera );\n\n\t\t// Copy from pingPong back to cubeUV (simple direct copy)\n\t\tggxUniforms[ 'envMap' ].value = pingPongRenderTarget.texture;\n\t\tggxUniforms[ 'roughness' ].value = 0.0; // Direct copy\n\t\tggxUniforms[ 'mipInt' ].value = _lodMax - lodOut; // Read from the level we just wrote\n\n\t\t_setViewport( cubeUVRenderTarget, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\trenderer.render( ggxMesh, _flatCamera );\n\n\t}\n\n\t/**\n\t * This is a two-pass Gaussian blur for a cubemap. Normally this is done\n\t * vertically and horizontally, but this breaks down on a cube. Here we apply\n\t * the blur latitudinally (around the poles), and then longitudinally (towards\n\t * the poles) to approximate the orthogonally-separable blur. It is least\n\t * accurate at the poles, but still does a decent job.\n\t *\n\t * Used for initial scene blur in fromScene() method when sigma > 0.\n\t *\n\t * @private\n\t * @param {WebGLRenderTarget} cubeUVRenderTarget\n\t * @param {number} lodIn\n\t * @param {number} lodOut\n\t * @param {number} sigma\n\t * @param {Vector3} [poleAxis]\n\t */\n\t_blur( cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis ) {\n\n\t\tconst pingPongRenderTarget = this._pingPongRenderTarget;\n\n\t\tthis._halfBlur(\n\t\t\tcubeUVRenderTarget,\n\t\t\tpingPongRenderTarget,\n\t\t\tlodIn,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'latitudinal',\n\t\t\tpoleAxis );\n\n\t\tthis._halfBlur(\n\t\t\tpingPongRenderTarget,\n\t\t\tcubeUVRenderTarget,\n\t\t\tlodOut,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'longitudinal',\n\t\t\tpoleAxis );\n\n\t}\n\n\t_halfBlur( targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst blurMaterial = this._blurMaterial;\n\n\t\tif ( direction !== 'latitudinal' && direction !== 'longitudinal' ) {\n\n\t\t\terror(\n\t\t\t\t'blur direction must be either latitudinal or longitudinal!' );\n\n\t\t}\n\n\t\t// Number of standard deviations at which to cut off the discrete approximation.\n\t\tconst STANDARD_DEVIATIONS = 3;\n\n\t\tconst blurMesh = this._lodMeshes[ lodOut ];\n\t\tblurMesh.material = blurMaterial;\n\n\t\tconst blurUniforms = blurMaterial.uniforms;\n\n\t\tconst pixels = this._sizeLods[ lodIn ] - 1;\n\t\tconst radiansPerPixel = isFinite( sigmaRadians ) ? Math.PI / ( 2 * pixels ) : 2 * Math.PI / ( 2 * MAX_SAMPLES - 1 );\n\t\tconst sigmaPixels = sigmaRadians / radiansPerPixel;\n\t\tconst samples = isFinite( sigmaRadians ) ? 1 + Math.floor( STANDARD_DEVIATIONS * sigmaPixels ) : MAX_SAMPLES;\n\n\t\tif ( samples > MAX_SAMPLES ) {\n\n\t\t\twarn( `sigmaRadians, ${\n\t\t\t\tsigmaRadians}, is too large and will clip, as it requested ${\n\t\t\t\tsamples} samples when the maximum is set to ${MAX_SAMPLES}` );\n\n\t\t}\n\n\t\tconst weights = [];\n\t\tlet sum = 0;\n\n\t\tfor ( let i = 0; i < MAX_SAMPLES; ++ i ) {\n\n\t\t\tconst x = i / sigmaPixels;\n\t\t\tconst weight = Math.exp( - x * x / 2 );\n\t\t\tweights.push( weight );\n\n\t\t\tif ( i === 0 ) {\n\n\t\t\t\tsum += weight;\n\n\t\t\t} else if ( i < samples ) {\n\n\t\t\t\tsum += 2 * weight;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < weights.length; i ++ ) {\n\n\t\t\tweights[ i ] = weights[ i ] / sum;\n\n\t\t}\n\n\t\tblurUniforms[ 'envMap' ].value = targetIn.texture;\n\t\tblurUniforms[ 'samples' ].value = samples;\n\t\tblurUniforms[ 'weights' ].value = weights;\n\t\tblurUniforms[ 'latitudinal' ].value = direction === 'latitudinal';\n\n\t\tif ( poleAxis ) {\n\n\t\t\tblurUniforms[ 'poleAxis' ].value = poleAxis;\n\n\t\t}\n\n\t\tconst { _lodMax } = this;\n\t\tblurUniforms[ 'dTheta' ].value = radiansPerPixel;\n\t\tblurUniforms[ 'mipInt' ].value = _lodMax - lodIn;\n\n\t\tconst outputSize = this._sizeLods[ lodOut ];\n\t\tconst x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 );\n\t\tconst y = 4 * ( this._cubeSize - outputSize );\n\n\t\t_setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( targetOut );\n\t\trenderer.render( blurMesh, _flatCamera );\n\n\t}\n\n}\n\n\n\nfunction _createPlanes( lodMax ) {\n\n\tconst sizeLods = [];\n\tconst sigmas = [];\n\tconst lodMeshes = [];\n\n\tlet lod = lodMax;\n\n\tconst totalLods = lodMax - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length;\n\n\tfor ( let i = 0; i < totalLods; i ++ ) {\n\n\t\tconst sizeLod = Math.pow( 2, lod );\n\t\tsizeLods.push( sizeLod );\n\t\tlet sigma = 1.0 / sizeLod;\n\n\t\tif ( i > lodMax - LOD_MIN ) {\n\n\t\t\tsigma = EXTRA_LOD_SIGMA[ i - lodMax + LOD_MIN - 1 ];\n\n\t\t} else if ( i === 0 ) {\n\n\t\t\tsigma = 0;\n\n\t\t}\n\n\t\tsigmas.push( sigma );\n\n\t\tconst texelSize = 1.0 / ( sizeLod - 2 );\n\t\tconst min = - texelSize;\n\t\tconst max = 1 + texelSize;\n\t\tconst uv1 = [ min, min, max, min, max, max, min, min, max, max, min, max ];\n\n\t\tconst cubeFaces = 6;\n\t\tconst vertices = 6;\n\t\tconst positionSize = 3;\n\t\tconst uvSize = 2;\n\t\tconst faceIndexSize = 1;\n\n\t\tconst position = new Float32Array( positionSize * vertices * cubeFaces );\n\t\tconst uv = new Float32Array( uvSize * vertices * cubeFaces );\n\t\tconst faceIndex = new Float32Array( faceIndexSize * vertices * cubeFaces );\n\n\t\tfor ( let face = 0; face < cubeFaces; face ++ ) {\n\n\t\t\tconst x = ( face % 3 ) * 2 / 3 - 1;\n\t\t\tconst y = face > 2 ? 0 : -1;\n\t\t\tconst coordinates = [\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y + 1, 0\n\t\t\t];\n\t\t\tposition.set( coordinates, positionSize * vertices * face );\n\t\t\tuv.set( uv1, uvSize * vertices * face );\n\t\t\tconst fill = [ face, face, face, face, face, face ];\n\t\t\tfaceIndex.set( fill, faceIndexSize * vertices * face );\n\n\t\t}\n\n\t\tconst planes = new BufferGeometry();\n\t\tplanes.setAttribute( 'position', new BufferAttribute( position, positionSize ) );\n\t\tplanes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) );\n\t\tplanes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) );\n\t\tlodMeshes.push( new Mesh( planes, null ) );\n\n\t\tif ( lod > LOD_MIN ) {\n\n\t\t\tlod --;\n\n\t\t}\n\n\t}\n\n\treturn { lodMeshes, sizeLods, sigmas };\n\n}\n\nfunction _createRenderTarget( width, height, params ) {\n\n\tconst cubeUVRenderTarget = new WebGLRenderTarget( width, height, params );\n\tcubeUVRenderTarget.texture.mapping = CubeUVReflectionMapping;\n\tcubeUVRenderTarget.texture.name = 'PMREM.cubeUv';\n\tcubeUVRenderTarget.scissorTest = true;\n\treturn cubeUVRenderTarget;\n\n}\n\nfunction _setViewport( target, x, y, width, height ) {\n\n\ttarget.viewport.set( x, y, width, height );\n\ttarget.scissor.set( x, y, width, height );\n\n}\n\nfunction _getGGXShader( lodMax, width, height ) {\n\n\tconst shaderMaterial = new ShaderMaterial( {\n\n\t\tname: 'PMREMGGXConvolution',\n\n\t\tdefines: {\n\t\t\t'GGX_SAMPLES': GGX_SAMPLES,\n\t\t\t'CUBEUV_TEXEL_WIDTH': 1.0 / width,\n\t\t\t'CUBEUV_TEXEL_HEIGHT': 1.0 / height,\n\t\t\t'CUBEUV_MAX_MIP': `${lodMax}.0`,\n\t\t},\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'roughness': { value: 0.0 },\n\t\t\t'mipInt': { value: 0 }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision highp float;\n\t\t\tprecision highp int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform float roughness;\n\t\t\tuniform float mipInt;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include <cube_uv_reflection_fragment>\n\n\t\t\t#define PI 3.14159265359\n\n\t\t\t// Van der Corput radical inverse\n\t\t\tfloat radicalInverse_VdC(uint bits) {\n\t\t\t\tbits = (bits << 16u) | (bits >> 16u);\n\t\t\t\tbits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);\n\t\t\t\tbits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);\n\t\t\t\tbits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);\n\t\t\t\tbits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);\n\t\t\t\treturn float(bits) * 2.3283064365386963e-10; // / 0x100000000\n\t\t\t}\n\n\t\t\t// Hammersley sequence\n\t\t\tvec2 hammersley(uint i, uint N) {\n\t\t\t\treturn vec2(float(i) / float(N), radicalInverse_VdC(i));\n\t\t\t}\n\n\t\t\t// GGX VNDF importance sampling (Eric Heitz 2018)\n\t\t\t// \"Sampling the GGX Distribution of Visible Normals\"\n\t\t\t// https://jcgt.org/published/0007/04/01/\n\t\t\tvec3 importanceSampleGGX_VNDF(vec2 Xi, vec3 V, float roughness) {\n\t\t\t\tfloat alpha = roughness * roughness;\n\n\t\t\t\t// Section 3.2: Transform view direction to hemisphere configuration\n\t\t\t\tvec3 Vh = normalize(vec3(alpha * V.x, alpha * V.y, V.z));\n\n\t\t\t\t// Section 4.1: Orthonormal basis\n\t\t\t\tfloat lensq = Vh.x * Vh.x + Vh.y * Vh.y;\n\t\t\t\tvec3 T1 = lensq > 0.0 ? vec3(-Vh.y, Vh.x, 0.0) / sqrt(lensq) : vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 T2 = cross(Vh, T1);\n\n\t\t\t\t// Section 4.2: Parameterization of projected area\n\t\t\t\tfloat r = sqrt(Xi.x);\n\t\t\t\tfloat phi = 2.0 * PI * Xi.y;\n\t\t\t\tfloat t1 = r * cos(phi);\n\t\t\t\tfloat t2 = r * sin(phi);\n\t\t\t\tfloat s = 0.5 * (1.0 + Vh.z);\n\t\t\t\tt2 = (1.0 - s) * sqrt(1.0 - t1 * t1) + s * t2;\n\n\t\t\t\t// Section 4.3: Reprojection onto hemisphere\n\t\t\t\tvec3 Nh = t1 * T1 + t2 * T2 + sqrt(max(0.0, 1.0 - t1 * t1 - t2 * t2)) * Vh;\n\n\t\t\t\t// Section 3.4: Transform back to ellipsoid configuration\n\t\t\t\treturn normalize(vec3(alpha * Nh.x, alpha * Nh.y, max(0.0, Nh.z)));\n\t\t\t}\n\n\t\t\tvoid main() {\n\t\t\t\tvec3 N = normalize(vOutputDirection);\n\t\t\t\tvec3 V = N; // Assume view direction equals normal for pre-filtering\n\n\t\t\t\tvec3 prefilteredColor = vec3(0.0);\n\t\t\t\tfloat totalWeight = 0.0;\n\n\t\t\t\t// For very low roughness, just sample the environment directly\n\t\t\t\tif (roughness < 0.001) {\n\t\t\t\t\tgl_FragColor = vec4(bilinearCubeUV(envMap, N, mipInt), 1.0);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Tangent space basis for VNDF sampling\n\t\t\t\tvec3 up = abs(N.z) < 0.999 ? vec3(0.0, 0.0, 1.0) : vec3(1.0, 0.0, 0.0);\n\t\t\t\tvec3 tangent = normalize(cross(up, N));\n\t\t\t\tvec3 bitangent = cross(N, tangent);\n\n\t\t\t\tfor(uint i = 0u; i < uint(GGX_SAMPLES); i++) {\n\t\t\t\t\tvec2 Xi = hammersley(i, uint(GGX_SAMPLES));\n\n\t\t\t\t\t// For PMREM, V = N, so in tangent space V is always (0, 0, 1)\n\t\t\t\t\tvec3 H_tangent = importanceSampleGGX_VNDF(Xi, vec3(0.0, 0.0, 1.0), roughness);\n\n\t\t\t\t\t// Transform H back to world space\n\t\t\t\t\tvec3 H = normalize(tangent * H_tangent.x + bitangent * H_tangent.y + N * H_tangent.z);\n\t\t\t\t\tvec3 L = normalize(2.0 * dot(V, H) * H - V);\n\n\t\t\t\t\tfloat NdotL = max(dot(N, L), 0.0);\n\n\t\t\t\t\tif(NdotL > 0.0) {\n\t\t\t\t\t\t// Sample environment at fixed mip level\n\t\t\t\t\t\t// VNDF importance sampling handles the distribution filtering\n\t\t\t\t\t\tvec3 sampleColor = bilinearCubeUV(envMap, L, mipInt);\n\n\t\t\t\t\t\t// Weight by NdotL for the split-sum approximation\n\t\t\t\t\t\t// VNDF PDF naturally accounts for the visible microfacet distribution\n\t\t\t\t\t\tprefilteredColor += sampleColor * NdotL;\n\t\t\t\t\t\ttotalWeight += NdotL;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (totalWeight > 0.0) {\n\t\t\t\t\tprefilteredColor = prefilteredColor / totalWeight;\n\t\t\t\t}\n\n\t\t\t\tgl_FragColor = vec4(prefilteredColor, 1.0);\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getBlurShader( lodMax, width, height ) {\n\n\tconst weights = new Float32Array( MAX_SAMPLES );\n\tconst poleAxis = new Vector3( 0, 1, 0 );\n\tconst shaderMaterial = new ShaderMaterial( {\n\n\t\tname: 'SphericalGaussianBlur',\n\n\t\tdefines: {\n\t\t\t'n': MAX_SAMPLES,\n\t\t\t'CUBEUV_TEXEL_WIDTH': 1.0 / width,\n\t\t\t'CUBEUV_TEXEL_HEIGHT': 1.0 / height,\n\t\t\t'CUBEUV_MAX_MIP': `${lodMax}.0`,\n\t\t},\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'samples': { value: 1 },\n\t\t\t'weights': { value: weights },\n\t\t\t'latitudinal': { value: false },\n\t\t\t'dTheta': { value: 0 },\n\t\t\t'mipInt': { value: 0 },\n\t\t\t'poleAxis': { value: poleAxis }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\t\t\tuniform int samples;\n\t\t\tuniform float weights[ n ];\n\t\t\tuniform bool latitudinal;\n\t\t\tuniform float dTheta;\n\t\t\tuniform float mipInt;\n\t\t\tuniform vec3 poleAxis;\n\n\t\t\t#define ENVMAP_TYPE_CUBE_UV\n\t\t\t#include <cube_uv_reflection_fragment>\n\n\t\t\tvec3 getSample( float theta, vec3 axis ) {\n\n\t\t\t\tfloat cosTheta = cos( theta );\n\t\t\t\t// Rodrigues' axis-angle rotation\n\t\t\t\tvec3 sampleDirection = vOutputDirection * cosTheta\n\t\t\t\t\t+ cross( axis, vOutputDirection ) * sin( theta )\n\t\t\t\t\t+ axis * dot( axis, vOutputDirection ) * ( 1.0 - cosTheta );\n\n\t\t\t\treturn bilinearCubeUV( envMap, sampleDirection, mipInt );\n\n\t\t\t}\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 axis = latitudinal ? poleAxis : cross( poleAxis, vOutputDirection );\n\n\t\t\t\tif ( all( equal( axis, vec3( 0.0 ) ) ) ) {\n\n\t\t\t\t\taxis = vec3( vOutputDirection.z, 0.0, - vOutputDirection.x );\n\n\t\t\t\t}\n\n\t\t\t\taxis = normalize( axis );\n\n\t\t\t\tgl_FragColor = vec4( 0.0, 0.0, 0.0, 1.0 );\n\t\t\t\tgl_FragColor.rgb += weights[ 0 ] * getSample( 0.0, axis );\n\n\t\t\t\tfor ( int i = 1; i < n; i++ ) {\n\n\t\t\t\t\tif ( i >= samples ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat theta = dTheta * float( i );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( -1.0 * theta, axis );\n\t\t\t\t\tgl_FragColor.rgb += weights[ i ] * getSample( theta, axis );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n\treturn shaderMaterial;\n\n}\n\nfunction _getEquirectMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'EquirectangularToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform sampler2D envMap;\n\n\t\t\t#include <common>\n\n\t\t\tvoid main() {\n\n\t\t\t\tvec3 outputDirection = normalize( vOutputDirection );\n\t\t\t\tvec2 uv = equirectUv( outputDirection );\n\n\t\t\t\tgl_FragColor = vec4( texture2D ( envMap, uv ).rgb, 1.0 );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCubemapMaterial() {\n\n\treturn new ShaderMaterial( {\n\n\t\tname: 'CubemapToCubeUV',\n\n\t\tuniforms: {\n\t\t\t'envMap': { value: null },\n\t\t\t'flipEnvMap': { value: -1 }\n\t\t},\n\n\t\tvertexShader: _getCommonVertexShader(),\n\n\t\tfragmentShader: /* glsl */`\n\n\t\t\tprecision mediump float;\n\t\t\tprecision mediump int;\n\n\t\t\tuniform float flipEnvMap;\n\n\t\t\tvarying vec3 vOutputDirection;\n\n\t\t\tuniform samplerCube envMap;\n\n\t\t\tvoid main() {\n\n\t\t\t\tgl_FragColor = textureCube( envMap, vec3( flipEnvMap * vOutputDirection.x, vOutputDirection.yz ) );\n\n\t\t\t}\n\t\t`,\n\n\t\tblending: NoBlending,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\n\t} );\n\n}\n\nfunction _getCommonVertexShader() {\n\n\treturn /* glsl */`\n\n\t\tprecision mediump float;\n\t\tprecision mediump int;\n\n\t\tattribute float faceIndex;\n\n\t\tvarying vec3 vOutputDirection;\n\n\t\t// RH coordinate system; PMREM face-indexing convention\n\t\tvec3 getDirection( vec2 uv, float face ) {\n\n\t\t\tuv = 2.0 * uv - 1.0;\n\n\t\t\tvec3 direction = vec3( uv, 1.0 );\n\n\t\t\tif ( face == 0.0 ) {\n\n\t\t\t\tdirection = direction.zyx; // ( 1, v, u ) pos x\n\n\t\t\t} else if ( face == 1.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xz *= -1.0; // ( -u, 1, -v ) pos y\n\n\t\t\t} else if ( face == 2.0 ) {\n\n\t\t\t\tdirection.x *= -1.0; // ( -u, v, 1 ) pos z\n\n\t\t\t} else if ( face == 3.0 ) {\n\n\t\t\t\tdirection = direction.zyx;\n\t\t\t\tdirection.xz *= -1.0; // ( -1, v, -u ) neg x\n\n\t\t\t} else if ( face == 4.0 ) {\n\n\t\t\t\tdirection = direction.xzy;\n\t\t\t\tdirection.xy *= -1.0; // ( -u, -1, v ) neg y\n\n\t\t\t} else if ( face == 5.0 ) {\n\n\t\t\t\tdirection.z *= -1.0; // ( u, v, -1 ) neg z\n\n\t\t\t}\n\n\t\t\treturn direction;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvOutputDirection = getDirection( uv, faceIndex );\n\t\t\tgl_Position = vec4( position, 1.0 );\n\n\t\t}\n\t`;\n\n}\n\nfunction WebGLCubeUVMaps( renderer ) {\n\n\tlet cubeUVmaps = new WeakMap();\n\n\tlet pmremGenerator = null;\n\n\tfunction get( texture ) {\n\n\t\tif ( texture && texture.isTexture ) {\n\n\t\t\tconst mapping = texture.mapping;\n\n\t\t\tconst isEquirectMap = ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping );\n\t\t\tconst isCubeMap = ( mapping === CubeReflectionMapping || mapping === CubeRefractionMapping );\n\n\t\t\t// equirect/cube map to cubeUV conversion\n\n\t\t\tif ( isEquirectMap || isCubeMap ) {\n\n\t\t\t\tlet renderTarget = cubeUVmaps.get( texture );\n\n\t\t\t\tconst currentPMREMVersion = renderTarget !== undefined ? renderTarget.texture.pmremVersion : 0;\n\n\t\t\t\tif ( texture.isRenderTargetTexture && texture.pmremVersion !== currentPMREMVersion ) {\n\n\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\trenderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture, renderTarget ) : pmremGenerator.fromCubemap( texture, renderTarget );\n\t\t\t\t\trenderTarget.texture.pmremVersion = texture.pmremVersion;\n\n\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( renderTarget !== undefined ) {\n\n\t\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\t\tif ( ( isEquirectMap && image && image.height > 0 ) || ( isCubeMap && image && isCubeTextureComplete( image ) ) ) {\n\n\t\t\t\t\t\t\tif ( pmremGenerator === null ) pmremGenerator = new PMREMGenerator( renderer );\n\n\t\t\t\t\t\t\trenderTarget = isEquirectMap ? pmremGenerator.fromEquirectangular( texture ) : pmremGenerator.fromCubemap( texture );\n\t\t\t\t\t\t\trenderTarget.texture.pmremVersion = texture.pmremVersion;\n\n\t\t\t\t\t\t\tcubeUVmaps.set( texture, renderTarget );\n\n\t\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\t\treturn renderTarget.texture;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// image not yet ready. try the conversion next frame\n\n\t\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction isCubeTextureComplete( image ) {\n\n\t\tlet count = 0;\n\t\tconst length = 6;\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tif ( image[ i ] !== undefined ) count ++;\n\n\t\t}\n\n\t\treturn count === length;\n\n\n\t}\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tconst cubemapUV = cubeUVmaps.get( texture );\n\n\t\tif ( cubemapUV !== undefined ) {\n\n\t\t\tcubeUVmaps.delete( texture );\n\t\t\tcubemapUV.dispose();\n\n\t\t}\n\n\t}\n\n\tfunction dispose() {\n\n\t\tcubeUVmaps = new WeakMap();\n\n\t\tif ( pmremGenerator !== null ) {\n\n\t\t\tpmremGenerator.dispose();\n\t\t\tpmremGenerator = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLExtensions( gl ) {\n\n\tconst extensions = {};\n\n\tfunction getExtension( name ) {\n\n\t\tif ( extensions[ name ] !== undefined ) {\n\n\t\t\treturn extensions[ name ];\n\n\t\t}\n\n\t\tconst extension = gl.getExtension( name );\n\n\t\textensions[ name ] = extension;\n\n\t\treturn extension;\n\n\t}\n\n\treturn {\n\n\t\thas: function ( name ) {\n\n\t\t\treturn getExtension( name ) !== null;\n\n\t\t},\n\n\t\tinit: function () {\n\n\t\t\tgetExtension( 'EXT_color_buffer_float' );\n\t\t\tgetExtension( 'WEBGL_clip_cull_distance' );\n\t\t\tgetExtension( 'OES_texture_float_linear' );\n\t\t\tgetExtension( 'EXT_color_buffer_half_float' );\n\t\t\tgetExtension( 'WEBGL_multisampled_render_to_texture' );\n\t\t\tgetExtension( 'WEBGL_render_shared_exponent' );\n\n\t\t},\n\n\t\tget: function ( name ) {\n\n\t\t\tconst extension = getExtension( name );\n\n\t\t\tif ( extension === null ) {\n\n\t\t\t\twarnOnce( 'WebGLRenderer: ' + name + ' extension not supported.' );\n\n\t\t\t}\n\n\t\t\treturn extension;\n\n\t\t}\n\n\t};\n\n}\n\nfunction WebGLGeometries( gl, attributes, info, bindingStates ) {\n\n\tconst geometries = {};\n\tconst wireframeAttributes = new WeakMap();\n\n\tfunction onGeometryDispose( event ) {\n\n\t\tconst geometry = event.target;\n\n\t\tif ( geometry.index !== null ) {\n\n\t\t\tattributes.remove( geometry.index );\n\n\t\t}\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tattributes.remove( geometry.attributes[ name ] );\n\n\t\t}\n\n\t\tgeometry.removeEventListener( 'dispose', onGeometryDispose );\n\n\t\tdelete geometries[ geometry.id ];\n\n\t\tconst attribute = wireframeAttributes.get( geometry );\n\n\t\tif ( attribute ) {\n\n\t\t\tattributes.remove( attribute );\n\t\t\twireframeAttributes.delete( geometry );\n\n\t\t}\n\n\t\tbindingStates.releaseStatesOfGeometry( geometry );\n\n\t\tif ( geometry.isInstancedBufferGeometry === true ) {\n\n\t\t\tdelete geometry._maxInstanceCount;\n\n\t\t}\n\n\t\t//\n\n\t\tinfo.memory.geometries --;\n\n\t}\n\n\tfunction get( object, geometry ) {\n\n\t\tif ( geometries[ geometry.id ] === true ) return geometry;\n\n\t\tgeometry.addEventListener( 'dispose', onGeometryDispose );\n\n\t\tgeometries[ geometry.id ] = true;\n\n\t\tinfo.memory.geometries ++;\n\n\t\treturn geometry;\n\n\t}\n\n\tfunction update( geometry ) {\n\n\t\tconst geometryAttributes = geometry.attributes;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates.\n\n\t\tfor ( const name in geometryAttributes ) {\n\n\t\t\tattributes.update( geometryAttributes[ name ], gl.ARRAY_BUFFER );\n\n\t\t}\n\n\t}\n\n\tfunction updateWireframeAttribute( geometry ) {\n\n\t\tconst indices = [];\n\n\t\tconst geometryIndex = geometry.index;\n\t\tconst geometryPosition = geometry.attributes.position;\n\t\tlet version = 0;\n\n\t\tif ( geometryIndex !== null ) {\n\n\t\t\tconst array = geometryIndex.array;\n\t\t\tversion = geometryIndex.version;\n\n\t\t\tfor ( let i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\t\tconst a = array[ i + 0 ];\n\t\t\t\tconst b = array[ i + 1 ];\n\t\t\t\tconst c = array[ i + 2 ];\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else if ( geometryPosition !== undefined ) {\n\n\t\t\tconst array = geometryPosition.array;\n\t\t\tversion = geometryPosition.version;\n\n\t\t\tfor ( let i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\t\tconst a = i + 0;\n\t\t\t\tconst b = i + 1;\n\t\t\t\tconst c = i + 2;\n\n\t\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst attribute = new ( arrayNeedsUint32( indices ) ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\t\tattribute.version = version;\n\n\t\t// Updating index buffer in VAO now. See WebGLBindingStates\n\n\t\t//\n\n\t\tconst previousAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( previousAttribute ) attributes.remove( previousAttribute );\n\n\t\t//\n\n\t\twireframeAttributes.set( geometry, attribute );\n\n\t}\n\n\tfunction getWireframeAttribute( geometry ) {\n\n\t\tconst currentAttribute = wireframeAttributes.get( geometry );\n\n\t\tif ( currentAttribute ) {\n\n\t\t\tconst geometryIndex = geometry.index;\n\n\t\t\tif ( geometryIndex !== null ) {\n\n\t\t\t\t// if the attribute is obsolete, create a new one\n\n\t\t\t\tif ( currentAttribute.version < geometryIndex.version ) {\n\n\t\t\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tupdateWireframeAttribute( geometry );\n\n\t\t}\n\n\t\treturn wireframeAttributes.get( geometry );\n\n\t}\n\n\treturn {\n\n\t\tget: get,\n\t\tupdate: update,\n\n\t\tgetWireframeAttribute: getWireframeAttribute\n\n\t};\n\n}\n\nfunction WebGLIndexedBufferRenderer( gl, extensions, info ) {\n\n\tlet mode;\n\n\tfunction setMode( value ) {\n\n\t\tmode = value;\n\n\t}\n\n\tlet type, bytesPerElement;\n\n\tfunction setIndex( value ) {\n\n\t\ttype = value.type;\n\t\tbytesPerElement = value.bytesPerElement;\n\n\t}\n\n\tfunction render( start, count ) {\n\n\t\tgl.drawElements( mode, count, type, start * bytesPerElement );\n\n\t\tinfo.update( count, mode, 1 );\n\n\t}\n\n\tfunction renderInstances( start, count, primcount ) {\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tgl.drawElementsInstanced( mode, count, type, start * bytesPerElement, primcount );\n\n\t\tinfo.update( count, mode, primcount );\n\n\t}\n\n\tfunction renderMultiDraw( starts, counts, drawCount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\t\textension.multiDrawElementsWEBGL( mode, counts, 0, type, starts, 0, drawCount );\n\n\t\tlet elementCount = 0;\n\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\telementCount += counts[ i ];\n\n\t\t}\n\n\t\tinfo.update( elementCount, mode, 1 );\n\n\n\t}\n\n\tfunction renderMultiDrawInstances( starts, counts, drawCount, primcount ) {\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\n\t\tif ( extension === null ) {\n\n\t\t\tfor ( let i = 0; i < starts.length; i ++ ) {\n\n\t\t\t\trenderInstances( starts[ i ] / bytesPerElement, counts[ i ], primcount[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\textension.multiDrawElementsInstancedWEBGL( mode, counts, 0, type, starts, 0, primcount, 0, drawCount );\n\n\t\t\tlet elementCount = 0;\n\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\telementCount += counts[ i ] * primcount[ i ];\n\n\t\t\t}\n\n\t\t\tinfo.update( elementCount, mode, 1 );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tthis.setMode = setMode;\n\tthis.setIndex = setIndex;\n\tthis.render = render;\n\tthis.renderInstances = renderInstances;\n\tthis.renderMultiDraw = renderMultiDraw;\n\tthis.renderMultiDrawInstances = renderMultiDrawInstances;\n\n}\n\nfunction WebGLInfo( gl ) {\n\n\tconst memory = {\n\t\tgeometries: 0,\n\t\ttextures: 0\n\t};\n\n\tconst render = {\n\t\tframe: 0,\n\t\tcalls: 0,\n\t\ttriangles: 0,\n\t\tpoints: 0,\n\t\tlines: 0\n\t};\n\n\tfunction update( count, mode, instanceCount ) {\n\n\t\trender.calls ++;\n\n\t\tswitch ( mode ) {\n\n\t\t\tcase gl.TRIANGLES:\n\t\t\t\trender.triangles += instanceCount * ( count / 3 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINES:\n\t\t\t\trender.lines += instanceCount * ( count / 2 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_STRIP:\n\t\t\t\trender.lines += instanceCount * ( count - 1 );\n\t\t\t\tbreak;\n\n\t\t\tcase gl.LINE_LOOP:\n\t\t\t\trender.lines += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tcase gl.POINTS:\n\t\t\t\trender.points += instanceCount * count;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\terror( 'WebGLInfo: Unknown draw mode:', mode );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction reset() {\n\n\t\trender.calls = 0;\n\t\trender.triangles = 0;\n\t\trender.points = 0;\n\t\trender.lines = 0;\n\n\t}\n\n\treturn {\n\t\tmemory: memory,\n\t\trender: render,\n\t\tprograms: null,\n\t\tautoReset: true,\n\t\treset: reset,\n\t\tupdate: update\n\t};\n\n}\n\nfunction WebGLMorphtargets( gl, capabilities, textures ) {\n\n\tconst morphTextures = new WeakMap();\n\tconst morph = new Vector4();\n\n\tfunction update( object, geometry, program ) {\n\n\t\tconst objectInfluences = object.morphTargetInfluences;\n\n\t\t// the following encodes morph targets into an array of data textures. Each layer represents a single morph target.\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\tlet entry = morphTextures.get( geometry );\n\n\t\tif ( entry === undefined || entry.count !== morphTargetsCount ) {\n\n\t\t\tif ( entry !== undefined ) entry.texture.dispose();\n\n\t\t\tconst hasMorphPosition = geometry.morphAttributes.position !== undefined;\n\t\t\tconst hasMorphNormals = geometry.morphAttributes.normal !== undefined;\n\t\t\tconst hasMorphColors = geometry.morphAttributes.color !== undefined;\n\n\t\t\tconst morphTargets = geometry.morphAttributes.position || [];\n\t\t\tconst morphNormals = geometry.morphAttributes.normal || [];\n\t\t\tconst morphColors = geometry.morphAttributes.color || [];\n\n\t\t\tlet vertexDataCount = 0;\n\n\t\t\tif ( hasMorphPosition === true ) vertexDataCount = 1;\n\t\t\tif ( hasMorphNormals === true ) vertexDataCount = 2;\n\t\t\tif ( hasMorphColors === true ) vertexDataCount = 3;\n\n\t\t\tlet width = geometry.attributes.position.count * vertexDataCount;\n\t\t\tlet height = 1;\n\n\t\t\tif ( width > capabilities.maxTextureSize ) {\n\n\t\t\t\theight = Math.ceil( width / capabilities.maxTextureSize );\n\t\t\t\twidth = capabilities.maxTextureSize;\n\n\t\t\t}\n\n\t\t\tconst buffer = new Float32Array( width * height * 4 * morphTargetsCount );\n\n\t\t\tconst texture = new DataArrayTexture( buffer, width, height, morphTargetsCount );\n\t\t\ttexture.type = FloatType;\n\t\t\ttexture.needsUpdate = true;\n\n\t\t\t// fill buffer\n\n\t\t\tconst vertexDataStride = vertexDataCount * 4;\n\n\t\t\tfor ( let i = 0; i < morphTargetsCount; i ++ ) {\n\n\t\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\t\tconst morphNormal = morphNormals[ i ];\n\t\t\t\tconst morphColor = morphColors[ i ];\n\n\t\t\t\tconst offset = width * height * 4 * i;\n\n\t\t\t\tfor ( let j = 0; j < morphTarget.count; j ++ ) {\n\n\t\t\t\t\tconst stride = j * vertexDataStride;\n\n\t\t\t\t\tif ( hasMorphPosition === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphTarget, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 0 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 1 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 2 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 3 ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasMorphNormals === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphNormal, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 4 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 5 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 6 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 7 ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( hasMorphColors === true ) {\n\n\t\t\t\t\t\tmorph.fromBufferAttribute( morphColor, j );\n\n\t\t\t\t\t\tbuffer[ offset + stride + 8 ] = morph.x;\n\t\t\t\t\t\tbuffer[ offset + stride + 9 ] = morph.y;\n\t\t\t\t\t\tbuffer[ offset + stride + 10 ] = morph.z;\n\t\t\t\t\t\tbuffer[ offset + stride + 11 ] = ( morphColor.itemSize === 4 ) ? morph.w : 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tentry = {\n\t\t\t\tcount: morphTargetsCount,\n\t\t\t\ttexture: texture,\n\t\t\t\tsize: new Vector2( width, height )\n\t\t\t};\n\n\t\t\tmorphTextures.set( geometry, entry );\n\n\t\t\tfunction disposeTexture() {\n\n\t\t\t\ttexture.dispose();\n\n\t\t\t\tmorphTextures.delete( geometry );\n\n\t\t\t\tgeometry.removeEventListener( 'dispose', disposeTexture );\n\n\t\t\t}\n\n\t\t\tgeometry.addEventListener( 'dispose', disposeTexture );\n\n\t\t}\n\n\t\t//\n\t\tif ( object.isInstancedMesh === true && object.morphTexture !== null ) {\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTexture', object.morphTexture, textures );\n\n\t\t} else {\n\n\t\t\tlet morphInfluencesSum = 0;\n\n\t\t\tfor ( let i = 0; i < objectInfluences.length; i ++ ) {\n\n\t\t\t\tmorphInfluencesSum += objectInfluences[ i ];\n\n\t\t\t}\n\n\t\t\tconst morphBaseInfluence = geometry.morphTargetsRelative ? 1 : 1 - morphInfluencesSum;\n\n\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetBaseInfluence', morphBaseInfluence );\n\t\t\tprogram.getUniforms().setValue( gl, 'morphTargetInfluences', objectInfluences );\n\n\t\t}\n\n\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTexture', entry.texture, textures );\n\t\tprogram.getUniforms().setValue( gl, 'morphTargetsTextureSize', entry.size );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update\n\n\t};\n\n}\n\nfunction WebGLObjects( gl, geometries, attributes, info ) {\n\n\tlet updateMap = new WeakMap();\n\n\tfunction update( object ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\tconst geometry = object.geometry;\n\t\tconst buffergeometry = geometries.get( object, geometry );\n\n\t\t// Update once per frame\n\n\t\tif ( updateMap.get( buffergeometry ) !== frame ) {\n\n\t\t\tgeometries.update( buffergeometry );\n\n\t\t\tupdateMap.set( buffergeometry, frame );\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh ) {\n\n\t\t\tif ( object.hasEventListener( 'dispose', onInstancedMeshDispose ) === false ) {\n\n\t\t\t\tobject.addEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\t\t}\n\n\t\t\tif ( updateMap.get( object ) !== frame ) {\n\n\t\t\t\tattributes.update( object.instanceMatrix, gl.ARRAY_BUFFER );\n\n\t\t\t\tif ( object.instanceColor !== null ) {\n\n\t\t\t\t\tattributes.update( object.instanceColor, gl.ARRAY_BUFFER );\n\n\t\t\t\t}\n\n\t\t\t\tupdateMap.set( object, frame );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tconst skeleton = object.skeleton;\n\n\t\t\tif ( updateMap.get( skeleton ) !== frame ) {\n\n\t\t\t\tskeleton.update();\n\n\t\t\t\tupdateMap.set( skeleton, frame );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn buffergeometry;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tupdateMap = new WeakMap();\n\n\t}\n\n\tfunction onInstancedMeshDispose( event ) {\n\n\t\tconst instancedMesh = event.target;\n\n\t\tinstancedMesh.removeEventListener( 'dispose', onInstancedMeshDispose );\n\n\t\tattributes.remove( instancedMesh.instanceMatrix );\n\n\t\tif ( instancedMesh.instanceColor !== null ) attributes.remove( instancedMesh.instanceColor );\n\n\t}\n\n\treturn {\n\n\t\tupdate: update,\n\t\tdispose: dispose\n\n\t};\n\n}\n\nconst toneMappingMap = {\n\t[ LinearToneMapping ]: 'LINEAR_TONE_MAPPING',\n\t[ ReinhardToneMapping ]: 'REINHARD_TONE_MAPPING',\n\t[ CineonToneMapping ]: 'CINEON_TONE_MAPPING',\n\t[ ACESFilmicToneMapping ]: 'ACES_FILMIC_TONE_MAPPING',\n\t[ AgXToneMapping ]: 'AGX_TONE_MAPPING',\n\t[ NeutralToneMapping ]: 'NEUTRAL_TONE_MAPPING',\n\t[ CustomToneMapping ]: 'CUSTOM_TONE_MAPPING'\n};\n\nfunction WebGLOutput( type, width, height, depth, stencil ) {\n\n\t// render targets for scene and post-processing\n\tconst targetA = new WebGLRenderTarget( width, height, {\n\t\ttype: type,\n\t\tdepthBuffer: depth,\n\t\tstencilBuffer: stencil\n\t} );\n\n\tconst targetB = new WebGLRenderTarget( width, height, {\n\t\ttype: HalfFloatType,\n\t\tdepthBuffer: false,\n\t\tstencilBuffer: false\n\t} );\n\n\t// create fullscreen triangle geometry\n\tconst geometry = new BufferGeometry();\n\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [ -1, 3, 0, -1, -1, 0, 3, -1, 0 ], 3 ) );\n\tgeometry.setAttribute( 'uv', new Float32BufferAttribute( [ 0, 2, 0, 0, 2, 0 ], 2 ) );\n\n\t// create output material with tone mapping support\n\tconst material = new RawShaderMaterial( {\n\t\tuniforms: {\n\t\t\ttDiffuse: { value: null }\n\t\t},\n\t\tvertexShader: /* glsl */`\n\t\t\tprecision highp float;\n\n\t\t\tuniform mat4 modelViewMatrix;\n\t\t\tuniform mat4 projectionMatrix;\n\n\t\t\tattribute vec3 position;\n\t\t\tattribute vec2 uv;\n\n\t\t\tvarying vec2 vUv;\n\n\t\t\tvoid main() {\n\t\t\t\tvUv = uv;\n\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t}`,\n\t\tfragmentShader: /* glsl */`\n\t\t\tprecision highp float;\n\n\t\t\tuniform sampler2D tDiffuse;\n\n\t\t\tvarying vec2 vUv;\n\n\t\t\t#include <tonemapping_pars_fragment>\n\t\t\t#include <colorspace_pars_fragment>\n\n\t\t\tvoid main() {\n\t\t\t\tgl_FragColor = texture2D( tDiffuse, vUv );\n\n\t\t\t\t#ifdef LINEAR_TONE_MAPPING\n\t\t\t\t\tgl_FragColor.rgb = LinearToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( REINHARD_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = ReinhardToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( CINEON_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = CineonToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( ACES_FILMIC_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = ACESFilmicToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( AGX_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = AgXToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( NEUTRAL_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = NeutralToneMapping( gl_FragColor.rgb );\n\t\t\t\t#elif defined( CUSTOM_TONE_MAPPING )\n\t\t\t\t\tgl_FragColor.rgb = CustomToneMapping( gl_FragColor.rgb );\n\t\t\t\t#endif\n\n\t\t\t\t#ifdef SRGB_TRANSFER\n\t\t\t\t\tgl_FragColor = sRGBTransferOETF( gl_FragColor );\n\t\t\t\t#endif\n\t\t\t}`,\n\t\tdepthTest: false,\n\t\tdepthWrite: false\n\t} );\n\n\tconst mesh = new Mesh( geometry, material );\n\tconst camera = new OrthographicCamera( -1, 1, 1, -1, 0, 1 );\n\n\tlet _outputColorSpace = null;\n\tlet _outputToneMapping = null;\n\tlet _isCompositing = false;\n\tlet _savedToneMapping;\n\tlet _savedRenderTarget = null;\n\tlet _effects = [];\n\tlet _hasRenderPass = false;\n\n\tthis.setSize = function ( width, height ) {\n\n\t\ttargetA.setSize( width, height );\n\t\ttargetB.setSize( width, height );\n\n\t\tfor ( let i = 0; i < _effects.length; i ++ ) {\n\n\t\t\tconst effect = _effects[ i ];\n\t\t\tif ( effect.setSize ) effect.setSize( width, height );\n\n\t\t}\n\n\t};\n\n\tthis.setEffects = function ( effects ) {\n\n\t\t_effects = effects;\n\t\t_hasRenderPass = _effects.length > 0 && _effects[ 0 ].isRenderPass === true;\n\n\t\tconst width = targetA.width;\n\t\tconst height = targetA.height;\n\n\t\tfor ( let i = 0; i < _effects.length; i ++ ) {\n\n\t\t\tconst effect = _effects[ i ];\n\t\t\tif ( effect.setSize ) effect.setSize( width, height );\n\n\t\t}\n\n\t};\n\n\tthis.begin = function ( renderer, renderTarget ) {\n\n\t\t// Don't begin during compositing phase (post-processing effects call render())\n\t\tif ( _isCompositing ) return false;\n\n\t\tif ( renderer.toneMapping === NoToneMapping && _effects.length === 0 ) return false;\n\n\t\t_savedRenderTarget = renderTarget;\n\n\t\t// resize internal buffers to match render target (e.g. XR resolution)\n\t\tif ( renderTarget !== null ) {\n\n\t\t\tconst width = renderTarget.width;\n\t\t\tconst height = renderTarget.height;\n\n\t\t\tif ( targetA.width !== width || targetA.height !== height ) {\n\n\t\t\t\tthis.setSize( width, height );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// if first effect is a RenderPass, it will set its own render target\n\t\tif ( _hasRenderPass === false ) {\n\n\t\t\trenderer.setRenderTarget( targetA );\n\n\t\t}\n\n\t\t// disable tone mapping during render - it will be applied in end()\n\t\t_savedToneMapping = renderer.toneMapping;\n\t\trenderer.toneMapping = NoToneMapping;\n\n\t\treturn true;\n\n\t};\n\n\tthis.hasRenderPass = function () {\n\n\t\treturn _hasRenderPass;\n\n\t};\n\n\tthis.end = function ( renderer, deltaTime ) {\n\n\t\t// restore tone mapping\n\t\trenderer.toneMapping = _savedToneMapping;\n\n\t\t_isCompositing = true;\n\n\t\t// run post-processing effects\n\t\tlet readBuffer = targetA;\n\t\tlet writeBuffer = targetB;\n\n\t\tfor ( let i = 0; i < _effects.length; i ++ ) {\n\n\t\t\tconst effect = _effects[ i ];\n\n\t\t\tif ( effect.enabled === false ) continue;\n\n\t\t\teffect.render( renderer, writeBuffer, readBuffer, deltaTime );\n\n\t\t\tif ( effect.needsSwap !== false ) {\n\n\t\t\t\tconst temp = readBuffer;\n\t\t\t\treadBuffer = writeBuffer;\n\t\t\t\twriteBuffer = temp;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// update output material defines if settings changed\n\t\tif ( _outputColorSpace !== renderer.outputColorSpace || _outputToneMapping !== renderer.toneMapping ) {\n\n\t\t\t_outputColorSpace = renderer.outputColorSpace;\n\t\t\t_outputToneMapping = renderer.toneMapping;\n\n\t\t\tmaterial.defines = {};\n\n\t\t\tif ( ColorManagement.getTransfer( _outputColorSpace ) === SRGBTransfer ) material.defines.SRGB_TRANSFER = '';\n\n\t\t\tconst toneMapping = toneMappingMap[ _outputToneMapping ];\n\t\t\tif ( toneMapping ) material.defines[ toneMapping ] = '';\n\n\t\t\tmaterial.needsUpdate = true;\n\n\t\t}\n\n\t\t// final output to canvas (or XR render target)\n\t\tmaterial.uniforms.tDiffuse.value = readBuffer.texture;\n\t\trenderer.setRenderTarget( _savedRenderTarget );\n\t\trenderer.render( mesh, camera );\n\n\t\t_savedRenderTarget = null;\n\t\t_isCompositing = false;\n\n\t};\n\n\tthis.isCompositing = function () {\n\n\t\treturn _isCompositing;\n\n\t};\n\n\tthis.dispose = function () {\n\n\t\ttargetA.dispose();\n\t\ttargetB.dispose();\n\t\tgeometry.dispose();\n\t\tmaterial.dispose();\n\n\t};\n\n}\n\n/**\n * Uniforms of a program.\n * Those form a tree structure with a special top-level container for the root,\n * which you get by calling 'new WebGLUniforms( gl, program )'.\n *\n *\n * Properties of inner nodes including the top-level container:\n *\n * .seq - array of nested uniforms\n * .map - nested uniforms by name\n *\n *\n * Methods of all nodes except the top-level container:\n *\n * .setValue( gl, value, [textures] )\n *\n * \t\tuploads a uniform value(s)\n *  \tthe 'textures' parameter is needed for sampler uniforms\n *\n *\n * Static methods of the top-level container (textures factorizations):\n *\n * .upload( gl, seq, values, textures )\n *\n * \t\tsets uniforms in 'seq' to 'values[id].value'\n *\n * .seqWithValue( seq, values ) : filteredSeq\n *\n * \t\tfilters 'seq' entries with corresponding entry in values\n *\n *\n * Methods of the top-level container (textures factorizations):\n *\n * .setValue( gl, name, value, textures )\n *\n * \t\tsets uniform with  name 'name' to 'value'\n *\n * .setOptional( gl, obj, prop )\n *\n * \t\tlike .set for an optional property of the object\n *\n */\n\n\nconst emptyTexture = /*@__PURE__*/ new Texture();\n\nconst emptyShadowTexture = /*@__PURE__*/ new DepthTexture( 1, 1 );\n\nconst emptyArrayTexture = /*@__PURE__*/ new DataArrayTexture();\nconst empty3dTexture = /*@__PURE__*/ new Data3DTexture();\nconst emptyCubeTexture = /*@__PURE__*/ new CubeTexture();\n\n// --- Utilities ---\n\n// Array Caches (provide typed arrays for temporary by size)\n\nconst arrayCacheF32 = [];\nconst arrayCacheI32 = [];\n\n// Float32Array caches used for uploading Matrix uniforms\n\nconst mat4array = new Float32Array( 16 );\nconst mat3array = new Float32Array( 9 );\nconst mat2array = new Float32Array( 4 );\n\n// Flattening for arrays of vectors and matrices\n\nfunction flatten( array, nBlocks, blockSize ) {\n\n\tconst firstElem = array[ 0 ];\n\n\tif ( firstElem <= 0 || firstElem > 0 ) return array;\n\t// unoptimized: ! isNaN( firstElem )\n\t// see http://jacksondunstan.com/articles/983\n\n\tconst n = nBlocks * blockSize;\n\tlet r = arrayCacheF32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Float32Array( n );\n\t\tarrayCacheF32[ n ] = r;\n\n\t}\n\n\tif ( nBlocks !== 0 ) {\n\n\t\tfirstElem.toArray( r, 0 );\n\n\t\tfor ( let i = 1, offset = 0; i !== nBlocks; ++ i ) {\n\n\t\t\toffset += blockSize;\n\t\t\tarray[ i ].toArray( r, offset );\n\n\t\t}\n\n\t}\n\n\treturn r;\n\n}\n\nfunction arraysEqual( a, b ) {\n\n\tif ( a.length !== b.length ) return false;\n\n\tfor ( let i = 0, l = a.length; i < l; i ++ ) {\n\n\t\tif ( a[ i ] !== b[ i ] ) return false;\n\n\t}\n\n\treturn true;\n\n}\n\nfunction copyArray( a, b ) {\n\n\tfor ( let i = 0, l = b.length; i < l; i ++ ) {\n\n\t\ta[ i ] = b[ i ];\n\n\t}\n\n}\n\n// Texture unit allocation\n\nfunction allocTexUnits( textures, n ) {\n\n\tlet r = arrayCacheI32[ n ];\n\n\tif ( r === undefined ) {\n\n\t\tr = new Int32Array( n );\n\t\tarrayCacheI32[ n ] = r;\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\tr[ i ] = textures.allocateTextureUnit();\n\n\t}\n\n\treturn r;\n\n}\n\n// --- Setters ---\n\n// Note: Defining these methods externally, because they come in a bunch\n// and this way their names minify.\n\n// Single scalar\n\nfunction setValueV1f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1f( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single float vector (from flat array or THREE.VectorN)\n\nfunction setValueV2f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2f( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3f( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else if ( v.r !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.r || cache[ 1 ] !== v.g || cache[ 2 ] !== v.b ) {\n\n\t\t\tgl.uniform3f( this.addr, v.r, v.g, v.b );\n\n\t\t\tcache[ 0 ] = v.r;\n\t\t\tcache[ 1 ] = v.g;\n\t\t\tcache[ 2 ] = v.b;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4f( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4f( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4fv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single matrix (from flat array or THREE.MatrixN)\n\nfunction setValueM2( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix2fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat2array.set( elements );\n\n\t\tgl.uniformMatrix2fv( this.addr, false, mat2array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM3( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix3fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat3array.set( elements );\n\n\t\tgl.uniformMatrix3fv( this.addr, false, mat3array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\nfunction setValueM4( gl, v ) {\n\n\tconst cache = this.cache;\n\tconst elements = v.elements;\n\n\tif ( elements === undefined ) {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniformMatrix4fv( this.addr, false, v );\n\n\t\tcopyArray( cache, v );\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, elements ) ) return;\n\n\t\tmat4array.set( elements );\n\n\t\tgl.uniformMatrix4fv( this.addr, false, mat4array );\n\n\t\tcopyArray( cache, elements );\n\n\t}\n\n}\n\n// Single integer / boolean\n\nfunction setValueV1i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1i( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single integer / boolean vector (from flat array or THREE.VectorN)\n\nfunction setValueV2i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2i( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3i( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4i( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4i( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4iv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n// Single unsigned integer\n\nfunction setValueV1ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( cache[ 0 ] === v ) return;\n\n\tgl.uniform1ui( this.addr, v );\n\n\tcache[ 0 ] = v;\n\n}\n\n// Single unsigned integer vector (from flat array or THREE.VectorN)\n\nfunction setValueV2ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y ) {\n\n\t\t\tgl.uniform2ui( this.addr, v.x, v.y );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform2uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV3ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z ) {\n\n\t\t\tgl.uniform3ui( this.addr, v.x, v.y, v.z );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform3uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\nfunction setValueV4ui( gl, v ) {\n\n\tconst cache = this.cache;\n\n\tif ( v.x !== undefined ) {\n\n\t\tif ( cache[ 0 ] !== v.x || cache[ 1 ] !== v.y || cache[ 2 ] !== v.z || cache[ 3 ] !== v.w ) {\n\n\t\t\tgl.uniform4ui( this.addr, v.x, v.y, v.z, v.w );\n\n\t\t\tcache[ 0 ] = v.x;\n\t\t\tcache[ 1 ] = v.y;\n\t\t\tcache[ 2 ] = v.z;\n\t\t\tcache[ 3 ] = v.w;\n\n\t\t}\n\n\t} else {\n\n\t\tif ( arraysEqual( cache, v ) ) return;\n\n\t\tgl.uniform4uiv( this.addr, v );\n\n\t\tcopyArray( cache, v );\n\n\t}\n\n}\n\n\n// Single texture (2D / Cube)\n\nfunction setValueT1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\tlet emptyTexture2D;\n\n\tif ( this.type === gl.SAMPLER_2D_SHADOW ) {\n\n\t\temptyShadowTexture.compareFunction = textures.isReversedDepthBuffer() ? GreaterEqualCompare : LessEqualCompare;\n\t\temptyTexture2D = emptyShadowTexture;\n\n\t} else {\n\n\t\temptyTexture2D = emptyTexture;\n\n\t}\n\n\ttextures.setTexture2D( v || emptyTexture2D, unit );\n\n}\n\nfunction setValueT3D1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture3D( v || empty3dTexture, unit );\n\n}\n\nfunction setValueT6( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTextureCube( v || emptyCubeTexture, unit );\n\n}\n\nfunction setValueT2DArray1( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\tconst unit = textures.allocateTextureUnit();\n\n\tif ( cache[ 0 ] !== unit ) {\n\n\t\tgl.uniform1i( this.addr, unit );\n\t\tcache[ 0 ] = unit;\n\n\t}\n\n\ttextures.setTexture2DArray( v || emptyArrayTexture, unit );\n\n}\n\n// Helper to pick the right setter for the singular case\n\nfunction getSingularSetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1f; // FLOAT\n\t\tcase 0x8b50: return setValueV2f; // _VEC2\n\t\tcase 0x8b51: return setValueV3f; // _VEC3\n\t\tcase 0x8b52: return setValueV4f; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2; // _MAT2\n\t\tcase 0x8b5b: return setValueM3; // _MAT3\n\t\tcase 0x8b5c: return setValueM4; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1i; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2i; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3i; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4i; // _VEC4\n\n\t\tcase 0x1405: return setValueV1ui; // UINT\n\t\tcase 0x8dc6: return setValueV2ui; // _VEC2\n\t\tcase 0x8dc7: return setValueV3ui; // _VEC3\n\t\tcase 0x8dc8: return setValueV4ui; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3D1;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArray1;\n\n\t}\n\n}\n\n\n// Array of scalars\n\nfunction setValueV1fArray( gl, v ) {\n\n\tgl.uniform1fv( this.addr, v );\n\n}\n\n// Array of vectors (from flat array or array of THREE.VectorN)\n\nfunction setValueV2fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 2 );\n\n\tgl.uniform2fv( this.addr, data );\n\n}\n\nfunction setValueV3fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 3 );\n\n\tgl.uniform3fv( this.addr, data );\n\n}\n\nfunction setValueV4fArray( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniform4fv( this.addr, data );\n\n}\n\n// Array of matrices (from flat array or array of THREE.MatrixN)\n\nfunction setValueM2Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 4 );\n\n\tgl.uniformMatrix2fv( this.addr, false, data );\n\n}\n\nfunction setValueM3Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 9 );\n\n\tgl.uniformMatrix3fv( this.addr, false, data );\n\n}\n\nfunction setValueM4Array( gl, v ) {\n\n\tconst data = flatten( v, this.size, 16 );\n\n\tgl.uniformMatrix4fv( this.addr, false, data );\n\n}\n\n// Array of integer / boolean\n\nfunction setValueV1iArray( gl, v ) {\n\n\tgl.uniform1iv( this.addr, v );\n\n}\n\n// Array of integer / boolean vectors (from flat array)\n\nfunction setValueV2iArray( gl, v ) {\n\n\tgl.uniform2iv( this.addr, v );\n\n}\n\nfunction setValueV3iArray( gl, v ) {\n\n\tgl.uniform3iv( this.addr, v );\n\n}\n\nfunction setValueV4iArray( gl, v ) {\n\n\tgl.uniform4iv( this.addr, v );\n\n}\n\n// Array of unsigned integer\n\nfunction setValueV1uiArray( gl, v ) {\n\n\tgl.uniform1uiv( this.addr, v );\n\n}\n\n// Array of unsigned integer vectors (from flat array)\n\nfunction setValueV2uiArray( gl, v ) {\n\n\tgl.uniform2uiv( this.addr, v );\n\n}\n\nfunction setValueV3uiArray( gl, v ) {\n\n\tgl.uniform3uiv( this.addr, v );\n\n}\n\nfunction setValueV4uiArray( gl, v ) {\n\n\tgl.uniform4uiv( this.addr, v );\n\n}\n\n\n// Array of textures (2D / 3D / Cube / 2DArray)\n\nfunction setValueT1Array( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tlet emptyTexture2D;\n\n\tif ( this.type === gl.SAMPLER_2D_SHADOW ) {\n\n\t\temptyTexture2D = emptyShadowTexture;\n\n\t} else {\n\n\t\temptyTexture2D = emptyTexture;\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2D( v[ i ] || emptyTexture2D, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT3DArray( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture3D( v[ i ] || empty3dTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT6Array( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTextureCube( v[ i ] || emptyCubeTexture, units[ i ] );\n\n\t}\n\n}\n\nfunction setValueT2DArrayArray( gl, v, textures ) {\n\n\tconst cache = this.cache;\n\n\tconst n = v.length;\n\n\tconst units = allocTexUnits( textures, n );\n\n\tif ( ! arraysEqual( cache, units ) ) {\n\n\t\tgl.uniform1iv( this.addr, units );\n\n\t\tcopyArray( cache, units );\n\n\t}\n\n\tfor ( let i = 0; i !== n; ++ i ) {\n\n\t\ttextures.setTexture2DArray( v[ i ] || emptyArrayTexture, units[ i ] );\n\n\t}\n\n}\n\n\n// Helper to pick the right setter for a pure (bottom-level) array\n\nfunction getPureArraySetter( type ) {\n\n\tswitch ( type ) {\n\n\t\tcase 0x1406: return setValueV1fArray; // FLOAT\n\t\tcase 0x8b50: return setValueV2fArray; // _VEC2\n\t\tcase 0x8b51: return setValueV3fArray; // _VEC3\n\t\tcase 0x8b52: return setValueV4fArray; // _VEC4\n\n\t\tcase 0x8b5a: return setValueM2Array; // _MAT2\n\t\tcase 0x8b5b: return setValueM3Array; // _MAT3\n\t\tcase 0x8b5c: return setValueM4Array; // _MAT4\n\n\t\tcase 0x1404: case 0x8b56: return setValueV1iArray; // INT, BOOL\n\t\tcase 0x8b53: case 0x8b57: return setValueV2iArray; // _VEC2\n\t\tcase 0x8b54: case 0x8b58: return setValueV3iArray; // _VEC3\n\t\tcase 0x8b55: case 0x8b59: return setValueV4iArray; // _VEC4\n\n\t\tcase 0x1405: return setValueV1uiArray; // UINT\n\t\tcase 0x8dc6: return setValueV2uiArray; // _VEC2\n\t\tcase 0x8dc7: return setValueV3uiArray; // _VEC3\n\t\tcase 0x8dc8: return setValueV4uiArray; // _VEC4\n\n\t\tcase 0x8b5e: // SAMPLER_2D\n\t\tcase 0x8d66: // SAMPLER_EXTERNAL_OES\n\t\tcase 0x8dca: // INT_SAMPLER_2D\n\t\tcase 0x8dd2: // UNSIGNED_INT_SAMPLER_2D\n\t\tcase 0x8b62: // SAMPLER_2D_SHADOW\n\t\t\treturn setValueT1Array;\n\n\t\tcase 0x8b5f: // SAMPLER_3D\n\t\tcase 0x8dcb: // INT_SAMPLER_3D\n\t\tcase 0x8dd3: // UNSIGNED_INT_SAMPLER_3D\n\t\t\treturn setValueT3DArray;\n\n\t\tcase 0x8b60: // SAMPLER_CUBE\n\t\tcase 0x8dcc: // INT_SAMPLER_CUBE\n\t\tcase 0x8dd4: // UNSIGNED_INT_SAMPLER_CUBE\n\t\tcase 0x8dc5: // SAMPLER_CUBE_SHADOW\n\t\t\treturn setValueT6Array;\n\n\t\tcase 0x8dc1: // SAMPLER_2D_ARRAY\n\t\tcase 0x8dcf: // INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dd7: // UNSIGNED_INT_SAMPLER_2D_ARRAY\n\t\tcase 0x8dc4: // SAMPLER_2D_ARRAY_SHADOW\n\t\t\treturn setValueT2DArrayArray;\n\n\t}\n\n}\n\n// --- Uniform Classes ---\n\nclass SingleUniform {\n\n\tconstructor( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.cache = [];\n\t\tthis.type = activeInfo.type;\n\t\tthis.setValue = getSingularSetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n}\n\nclass PureArrayUniform {\n\n\tconstructor( id, activeInfo, addr ) {\n\n\t\tthis.id = id;\n\t\tthis.addr = addr;\n\t\tthis.cache = [];\n\t\tthis.type = activeInfo.type;\n\t\tthis.size = activeInfo.size;\n\t\tthis.setValue = getPureArraySetter( activeInfo.type );\n\n\t\t// this.path = activeInfo.name; // DEBUG\n\n\t}\n\n}\n\nclass StructuredUniform {\n\n\tconstructor( id ) {\n\n\t\tthis.id = id;\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t}\n\n\tsetValue( gl, value, textures ) {\n\n\t\tconst seq = this.seq;\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ];\n\t\t\tu.setValue( gl, value[ u.id ], textures );\n\n\t\t}\n\n\t}\n\n}\n\n// --- Top-level ---\n\n// Parser - builds up the property tree from the path strings\n\nconst RePathPart = /(\\w+)(\\])?(\\[|\\.)?/g;\n\n// extracts\n// \t- the identifier (member name or array index)\n//  - followed by an optional right bracket (found when array index)\n//  - followed by an optional left bracket or dot (type of subscript)\n//\n// Note: These portions can be read in a non-overlapping fashion and\n// allow straightforward parsing of the hierarchy that WebGL encodes\n// in the uniform names.\n\nfunction addUniform( container, uniformObject ) {\n\n\tcontainer.seq.push( uniformObject );\n\tcontainer.map[ uniformObject.id ] = uniformObject;\n\n}\n\nfunction parseUniform( activeInfo, addr, container ) {\n\n\tconst path = activeInfo.name,\n\t\tpathLength = path.length;\n\n\t// reset RegExp object, because of the early exit of a previous run\n\tRePathPart.lastIndex = 0;\n\n\twhile ( true ) {\n\n\t\tconst match = RePathPart.exec( path ),\n\t\t\tmatchEnd = RePathPart.lastIndex;\n\n\t\tlet id = match[ 1 ];\n\t\tconst idIsIndex = match[ 2 ] === ']',\n\t\t\tsubscript = match[ 3 ];\n\n\t\tif ( idIsIndex ) id = id | 0; // convert to integer\n\n\t\tif ( subscript === undefined || subscript === '[' && matchEnd + 2 === pathLength ) {\n\n\t\t\t// bare name or \"pure\" bottom-level array \"[0]\" suffix\n\n\t\t\taddUniform( container, subscript === undefined ?\n\t\t\t\tnew SingleUniform( id, activeInfo, addr ) :\n\t\t\t\tnew PureArrayUniform( id, activeInfo, addr ) );\n\n\t\t\tbreak;\n\n\t\t} else {\n\n\t\t\t// step into inner node / create it in case it doesn't exist\n\n\t\t\tconst map = container.map;\n\t\t\tlet next = map[ id ];\n\n\t\t\tif ( next === undefined ) {\n\n\t\t\t\tnext = new StructuredUniform( id );\n\t\t\t\taddUniform( container, next );\n\n\t\t\t}\n\n\t\t\tcontainer = next;\n\n\t\t}\n\n\t}\n\n}\n\n// Root Container\n\nclass WebGLUniforms {\n\n\tconstructor( gl, program ) {\n\n\t\tthis.seq = [];\n\t\tthis.map = {};\n\n\t\tconst n = gl.getProgramParameter( program, gl.ACTIVE_UNIFORMS );\n\n\t\tfor ( let i = 0; i < n; ++ i ) {\n\n\t\t\tconst info = gl.getActiveUniform( program, i ),\n\t\t\t\taddr = gl.getUniformLocation( program, info.name );\n\n\t\t\tparseUniform( info, addr, this );\n\n\t\t}\n\n\t\t// Sort uniforms to prioritize shadow samplers first (for optimal texture unit allocation)\n\n\t\tconst shadowSamplers = [];\n\t\tconst otherUniforms = [];\n\n\t\tfor ( const u of this.seq ) {\n\n\t\t\tif ( u.type === gl.SAMPLER_2D_SHADOW || u.type === gl.SAMPLER_CUBE_SHADOW || u.type === gl.SAMPLER_2D_ARRAY_SHADOW ) {\n\n\t\t\t\tshadowSamplers.push( u );\n\n\t\t\t} else {\n\n\t\t\t\totherUniforms.push( u );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( shadowSamplers.length > 0 ) {\n\n\t\t\tthis.seq = shadowSamplers.concat( otherUniforms );\n\n\t\t}\n\n\t}\n\n\tsetValue( gl, name, value, textures ) {\n\n\t\tconst u = this.map[ name ];\n\n\t\tif ( u !== undefined ) u.setValue( gl, value, textures );\n\n\t}\n\n\tsetOptional( gl, object, name ) {\n\n\t\tconst v = object[ name ];\n\n\t\tif ( v !== undefined ) this.setValue( gl, name, v );\n\n\t}\n\n\tstatic upload( gl, seq, values, textures ) {\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ],\n\t\t\t\tv = values[ u.id ];\n\n\t\t\tif ( v.needsUpdate !== false ) {\n\n\t\t\t\t// note: always updating when .needsUpdate is undefined\n\t\t\t\tu.setValue( gl, v.value, textures );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tstatic seqWithValue( seq, values ) {\n\n\t\tconst r = [];\n\n\t\tfor ( let i = 0, n = seq.length; i !== n; ++ i ) {\n\n\t\t\tconst u = seq[ i ];\n\t\t\tif ( u.id in values ) r.push( u );\n\n\t\t}\n\n\t\treturn r;\n\n\t}\n\n}\n\nfunction WebGLShader( gl, type, string ) {\n\n\tconst shader = gl.createShader( type );\n\n\tgl.shaderSource( shader, string );\n\tgl.compileShader( shader );\n\n\treturn shader;\n\n}\n\n// From https://www.khronos.org/registry/webgl/extensions/KHR_parallel_shader_compile/\nconst COMPLETION_STATUS_KHR = 0x91B1;\n\nlet programIdCount = 0;\n\nfunction handleSource( string, errorLine ) {\n\n\tconst lines = string.split( '\\n' );\n\tconst lines2 = [];\n\n\tconst from = Math.max( errorLine - 6, 0 );\n\tconst to = Math.min( errorLine + 6, lines.length );\n\n\tfor ( let i = from; i < to; i ++ ) {\n\n\t\tconst line = i + 1;\n\t\tlines2.push( `${line === errorLine ? '>' : ' '} ${line}: ${lines[ i ]}` );\n\n\t}\n\n\treturn lines2.join( '\\n' );\n\n}\n\nconst _m0 = /*@__PURE__*/ new Matrix3();\n\nfunction getEncodingComponents( colorSpace ) {\n\n\tColorManagement._getMatrix( _m0, ColorManagement.workingColorSpace, colorSpace );\n\n\tconst encodingMatrix = `mat3( ${ _m0.elements.map( ( v ) => v.toFixed( 4 ) ) } )`;\n\n\tswitch ( ColorManagement.getTransfer( colorSpace ) ) {\n\n\t\tcase LinearTransfer:\n\t\t\treturn [ encodingMatrix, 'LinearTransferOETF' ];\n\n\t\tcase SRGBTransfer:\n\t\t\treturn [ encodingMatrix, 'sRGBTransferOETF' ];\n\n\t\tdefault:\n\t\t\twarn( 'WebGLProgram: Unsupported color space: ', colorSpace );\n\t\t\treturn [ encodingMatrix, 'LinearTransferOETF' ];\n\n\t}\n\n}\n\nfunction getShaderErrors( gl, shader, type ) {\n\n\tconst status = gl.getShaderParameter( shader, gl.COMPILE_STATUS );\n\n\tconst shaderInfoLog = gl.getShaderInfoLog( shader ) || '';\n\tconst errors = shaderInfoLog.trim();\n\n\tif ( status && errors === '' ) return '';\n\n\tconst errorMatches = /ERROR: 0:(\\d+)/.exec( errors );\n\tif ( errorMatches ) {\n\n\t\t// --enable-privileged-webgl-extension\n\t\t// log( '**' + type + '**', gl.getExtension( 'WEBGL_debug_shaders' ).getTranslatedShaderSource( shader ) );\n\n\t\tconst errorLine = parseInt( errorMatches[ 1 ] );\n\t\treturn type.toUpperCase() + '\\n\\n' + errors + '\\n\\n' + handleSource( gl.getShaderSource( shader ), errorLine );\n\n\t} else {\n\n\t\treturn errors;\n\n\t}\n\n}\n\nfunction getTexelEncodingFunction( functionName, colorSpace ) {\n\n\tconst components = getEncodingComponents( colorSpace );\n\n\treturn [\n\n\t\t`vec4 ${functionName}( vec4 value ) {`,\n\n\t\t`\treturn ${components[ 1 ]}( vec4( value.rgb * ${components[ 0 ]}, value.a ) );`,\n\n\t\t'}',\n\n\t].join( '\\n' );\n\n}\n\nconst toneMappingFunctions = {\n\t[ LinearToneMapping ]: 'Linear',\n\t[ ReinhardToneMapping ]: 'Reinhard',\n\t[ CineonToneMapping ]: 'Cineon',\n\t[ ACESFilmicToneMapping ]: 'ACESFilmic',\n\t[ AgXToneMapping ]: 'AgX',\n\t[ NeutralToneMapping ]: 'Neutral',\n\t[ CustomToneMapping ]: 'Custom'\n};\n\nfunction getToneMappingFunction( functionName, toneMapping ) {\n\n\tconst toneMappingName = toneMappingFunctions[ toneMapping ];\n\n\tif ( toneMappingName === undefined ) {\n\n\t\twarn( 'WebGLProgram: Unsupported toneMapping:', toneMapping );\n\t\treturn 'vec3 ' + functionName + '( vec3 color ) { return LinearToneMapping( color ); }';\n\n\t}\n\n\treturn 'vec3 ' + functionName + '( vec3 color ) { return ' + toneMappingName + 'ToneMapping( color ); }';\n\n}\n\nconst _v0 = /*@__PURE__*/ new Vector3();\n\nfunction getLuminanceFunction() {\n\n\tColorManagement.getLuminanceCoefficients( _v0 );\n\n\tconst r = _v0.x.toFixed( 4 );\n\tconst g = _v0.y.toFixed( 4 );\n\tconst b = _v0.z.toFixed( 4 );\n\n\treturn [\n\n\t\t'float luminance( const in vec3 rgb ) {',\n\n\t\t`\tconst vec3 weights = vec3( ${ r }, ${ g }, ${ b } );`,\n\n\t\t'\treturn dot( weights, rgb );',\n\n\t\t'}'\n\n\t].join( '\\n' );\n\n}\n\nfunction generateVertexExtensions( parameters ) {\n\n\tconst chunks = [\n\t\tparameters.extensionClipCullDistance ? '#extension GL_ANGLE_clip_cull_distance : require' : '',\n\t\tparameters.extensionMultiDraw ? '#extension GL_ANGLE_multi_draw : require' : '',\n\t];\n\n\treturn chunks.filter( filterEmptyLine ).join( '\\n' );\n\n}\n\nfunction generateDefines( defines ) {\n\n\tconst chunks = [];\n\n\tfor ( const name in defines ) {\n\n\t\tconst value = defines[ name ];\n\n\t\tif ( value === false ) continue;\n\n\t\tchunks.push( '#define ' + name + ' ' + value );\n\n\t}\n\n\treturn chunks.join( '\\n' );\n\n}\n\nfunction fetchAttributeLocations( gl, program ) {\n\n\tconst attributes = {};\n\n\tconst n = gl.getProgramParameter( program, gl.ACTIVE_ATTRIBUTES );\n\n\tfor ( let i = 0; i < n; i ++ ) {\n\n\t\tconst info = gl.getActiveAttrib( program, i );\n\t\tconst name = info.name;\n\n\t\tlet locationSize = 1;\n\t\tif ( info.type === gl.FLOAT_MAT2 ) locationSize = 2;\n\t\tif ( info.type === gl.FLOAT_MAT3 ) locationSize = 3;\n\t\tif ( info.type === gl.FLOAT_MAT4 ) locationSize = 4;\n\n\t\t// log( 'WebGLProgram: ACTIVE VERTEX ATTRIBUTE:', name, i );\n\n\t\tattributes[ name ] = {\n\t\t\ttype: info.type,\n\t\t\tlocation: gl.getAttribLocation( program, name ),\n\t\t\tlocationSize: locationSize\n\t\t};\n\n\t}\n\n\treturn attributes;\n\n}\n\nfunction filterEmptyLine( string ) {\n\n\treturn string !== '';\n\n}\n\nfunction replaceLightNums( string, parameters ) {\n\n\tconst numSpotLightCoords = parameters.numSpotLightShadows + parameters.numSpotLightMaps - parameters.numSpotLightShadowsWithMaps;\n\n\treturn string\n\t\t.replace( /NUM_DIR_LIGHTS/g, parameters.numDirLights )\n\t\t.replace( /NUM_SPOT_LIGHTS/g, parameters.numSpotLights )\n\t\t.replace( /NUM_SPOT_LIGHT_MAPS/g, parameters.numSpotLightMaps )\n\t\t.replace( /NUM_SPOT_LIGHT_COORDS/g, numSpotLightCoords )\n\t\t.replace( /NUM_RECT_AREA_LIGHTS/g, parameters.numRectAreaLights )\n\t\t.replace( /NUM_POINT_LIGHTS/g, parameters.numPointLights )\n\t\t.replace( /NUM_HEMI_LIGHTS/g, parameters.numHemiLights )\n\t\t.replace( /NUM_DIR_LIGHT_SHADOWS/g, parameters.numDirLightShadows )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS/g, parameters.numSpotLightShadowsWithMaps )\n\t\t.replace( /NUM_SPOT_LIGHT_SHADOWS/g, parameters.numSpotLightShadows )\n\t\t.replace( /NUM_POINT_LIGHT_SHADOWS/g, parameters.numPointLightShadows );\n\n}\n\nfunction replaceClippingPlaneNums( string, parameters ) {\n\n\treturn string\n\t\t.replace( /NUM_CLIPPING_PLANES/g, parameters.numClippingPlanes )\n\t\t.replace( /UNION_CLIPPING_PLANES/g, ( parameters.numClippingPlanes - parameters.numClipIntersection ) );\n\n}\n\n// Resolve Includes\n\nconst includePattern = /^[ \\t]*#include +<([\\w\\d./]+)>/gm;\n\nfunction resolveIncludes( string ) {\n\n\treturn string.replace( includePattern, includeReplacer );\n\n}\n\nconst shaderChunkMap = new Map();\n\nfunction includeReplacer( match, include ) {\n\n\tlet string = ShaderChunk[ include ];\n\n\tif ( string === undefined ) {\n\n\t\tconst newInclude = shaderChunkMap.get( include );\n\n\t\tif ( newInclude !== undefined ) {\n\n\t\t\tstring = ShaderChunk[ newInclude ];\n\t\t\twarn( 'WebGLRenderer: Shader chunk \"%s\" has been deprecated. Use \"%s\" instead.', include, newInclude );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Can not resolve #include <' + include + '>' );\n\n\t\t}\n\n\t}\n\n\treturn resolveIncludes( string );\n\n}\n\n// Unroll Loops\n\nconst unrollLoopPattern = /#pragma unroll_loop_start\\s+for\\s*\\(\\s*int\\s+i\\s*=\\s*(\\d+)\\s*;\\s*i\\s*<\\s*(\\d+)\\s*;\\s*i\\s*\\+\\+\\s*\\)\\s*{([\\s\\S]+?)}\\s+#pragma unroll_loop_end/g;\n\nfunction unrollLoops( string ) {\n\n\treturn string.replace( unrollLoopPattern, loopReplacer );\n\n}\n\nfunction loopReplacer( match, start, end, snippet ) {\n\n\tlet string = '';\n\n\tfor ( let i = parseInt( start ); i < parseInt( end ); i ++ ) {\n\n\t\tstring += snippet\n\t\t\t.replace( /\\[\\s*i\\s*\\]/g, '[ ' + i + ' ]' )\n\t\t\t.replace( /UNROLLED_LOOP_INDEX/g, i );\n\n\t}\n\n\treturn string;\n\n}\n\n//\n\nfunction generatePrecision( parameters ) {\n\n\tlet precisionstring = `precision ${parameters.precision} float;\n\tprecision ${parameters.precision} int;\n\tprecision ${parameters.precision} sampler2D;\n\tprecision ${parameters.precision} samplerCube;\n\tprecision ${parameters.precision} sampler3D;\n\tprecision ${parameters.precision} sampler2DArray;\n\tprecision ${parameters.precision} sampler2DShadow;\n\tprecision ${parameters.precision} samplerCubeShadow;\n\tprecision ${parameters.precision} sampler2DArrayShadow;\n\tprecision ${parameters.precision} isampler2D;\n\tprecision ${parameters.precision} isampler3D;\n\tprecision ${parameters.precision} isamplerCube;\n\tprecision ${parameters.precision} isampler2DArray;\n\tprecision ${parameters.precision} usampler2D;\n\tprecision ${parameters.precision} usampler3D;\n\tprecision ${parameters.precision} usamplerCube;\n\tprecision ${parameters.precision} usampler2DArray;\n\t`;\n\n\tif ( parameters.precision === 'highp' ) {\n\n\t\tprecisionstring += '\\n#define HIGH_PRECISION';\n\n\t} else if ( parameters.precision === 'mediump' ) {\n\n\t\tprecisionstring += '\\n#define MEDIUM_PRECISION';\n\n\t} else if ( parameters.precision === 'lowp' ) {\n\n\t\tprecisionstring += '\\n#define LOW_PRECISION';\n\n\t}\n\n\treturn precisionstring;\n\n}\n\nconst shadowMapTypeDefines = {\n\t[ PCFShadowMap ]: 'SHADOWMAP_TYPE_PCF',\n\t[ VSMShadowMap ]: 'SHADOWMAP_TYPE_VSM'\n};\n\nfunction generateShadowMapTypeDefine( parameters ) {\n\n\treturn shadowMapTypeDefines[ parameters.shadowMapType ] || 'SHADOWMAP_TYPE_BASIC';\n\n}\n\nconst envMapTypeDefines = {\n\t[ CubeReflectionMapping ]: 'ENVMAP_TYPE_CUBE',\n\t[ CubeRefractionMapping ]: 'ENVMAP_TYPE_CUBE',\n\t[ CubeUVReflectionMapping ]: 'ENVMAP_TYPE_CUBE_UV'\n};\n\nfunction generateEnvMapTypeDefine( parameters ) {\n\n\tif ( parameters.envMap === false ) return 'ENVMAP_TYPE_CUBE';\n\n\treturn envMapTypeDefines[ parameters.envMapMode ] || 'ENVMAP_TYPE_CUBE';\n\n}\n\nconst envMapModeDefines = {\n\t[ CubeRefractionMapping ]: 'ENVMAP_MODE_REFRACTION'\n};\n\nfunction generateEnvMapModeDefine( parameters ) {\n\n\tif ( parameters.envMap === false ) return 'ENVMAP_MODE_REFLECTION';\n\n\treturn envMapModeDefines[ parameters.envMapMode ] || 'ENVMAP_MODE_REFLECTION';\n\n}\n\nconst envMapBlendingDefines = {\n\t[ MultiplyOperation ]: 'ENVMAP_BLENDING_MULTIPLY',\n\t[ MixOperation ]: 'ENVMAP_BLENDING_MIX',\n\t[ AddOperation ]: 'ENVMAP_BLENDING_ADD'\n};\n\nfunction generateEnvMapBlendingDefine( parameters ) {\n\n\tif ( parameters.envMap === false ) return 'ENVMAP_BLENDING_NONE';\n\n\treturn envMapBlendingDefines[ parameters.combine ] || 'ENVMAP_BLENDING_NONE';\n\n}\n\nfunction generateCubeUVSize( parameters ) {\n\n\tconst imageHeight = parameters.envMapCubeUVHeight;\n\n\tif ( imageHeight === null ) return null;\n\n\tconst maxMip = Math.log2( imageHeight ) - 2;\n\n\tconst texelHeight = 1.0 / imageHeight;\n\n\tconst texelWidth = 1.0 / ( 3 * Math.max( Math.pow( 2, maxMip ), 7 * 16 ) );\n\n\treturn { texelWidth, texelHeight, maxMip };\n\n}\n\nfunction WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {\n\n\t// TODO Send this event to Three.js DevTools\n\t// log( 'WebGLProgram', cacheKey );\n\n\tconst gl = renderer.getContext();\n\n\tconst defines = parameters.defines;\n\n\tlet vertexShader = parameters.vertexShader;\n\tlet fragmentShader = parameters.fragmentShader;\n\n\tconst shadowMapTypeDefine = generateShadowMapTypeDefine( parameters );\n\tconst envMapTypeDefine = generateEnvMapTypeDefine( parameters );\n\tconst envMapModeDefine = generateEnvMapModeDefine( parameters );\n\tconst envMapBlendingDefine = generateEnvMapBlendingDefine( parameters );\n\tconst envMapCubeUVSize = generateCubeUVSize( parameters );\n\n\tconst customVertexExtensions = generateVertexExtensions( parameters );\n\n\tconst customDefines = generateDefines( defines );\n\n\tconst program = gl.createProgram();\n\n\tlet prefixVertex, prefixFragment;\n\tlet versionString = parameters.glslVersion ? '#version ' + parameters.glslVersion + '\\n' : '';\n\n\tif ( parameters.isRawShaderMaterial ) {\n\n\t\tprefixVertex = [\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixVertex.length > 0 ) {\n\n\t\t\tprefixVertex += '\\n';\n\n\t\t}\n\n\t\tprefixFragment = [\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tif ( prefixFragment.length > 0 ) {\n\n\t\t\tprefixFragment += '\\n';\n\n\t\t}\n\n\t} else {\n\n\t\tprefixVertex = [\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.extensionClipCullDistance ? '#define USE_CLIP_DISTANCE' : '',\n\t\t\tparameters.batching ? '#define USE_BATCHING' : '',\n\t\t\tparameters.batchingColor ? '#define USE_BATCHING_COLOR' : '',\n\t\t\tparameters.instancing ? '#define USE_INSTANCING' : '',\n\t\t\tparameters.instancingColor ? '#define USE_INSTANCING_COLOR' : '',\n\t\t\tparameters.instancingMorph ? '#define USE_INSTANCING_MORPH' : '',\n\n\t\t\tparameters.useFog && parameters.fog ? '#define USE_FOG' : '',\n\t\t\tparameters.useFog && parameters.fogExp2 ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\tparameters.normalMapObjectSpace ? '#define USE_NORMALMAP_OBJECTSPACE' : '',\n\t\t\tparameters.normalMapTangentSpace ? '#define USE_NORMALMAP_TANGENTSPACE' : '',\n\t\t\tparameters.displacementMap ? '#define USE_DISPLACEMENTMAP' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\n\t\t\tparameters.anisotropy ? '#define USE_ANISOTROPY' : '',\n\t\t\tparameters.anisotropyMap ? '#define USE_ANISOTROPYMAP' : '',\n\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '',\n\t\t\tparameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULAR_COLORMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULAR_INTENSITYMAP' : '',\n\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.alphaHash ? '#define USE_ALPHAHASH' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEEN_COLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEEN_ROUGHNESSMAP' : '',\n\n\t\t\t//\n\n\t\t\tparameters.mapUv ? '#define MAP_UV ' + parameters.mapUv : '',\n\t\t\tparameters.alphaMapUv ? '#define ALPHAMAP_UV ' + parameters.alphaMapUv : '',\n\t\t\tparameters.lightMapUv ? '#define LIGHTMAP_UV ' + parameters.lightMapUv : '',\n\t\t\tparameters.aoMapUv ? '#define AOMAP_UV ' + parameters.aoMapUv : '',\n\t\t\tparameters.emissiveMapUv ? '#define EMISSIVEMAP_UV ' + parameters.emissiveMapUv : '',\n\t\t\tparameters.bumpMapUv ? '#define BUMPMAP_UV ' + parameters.bumpMapUv : '',\n\t\t\tparameters.normalMapUv ? '#define NORMALMAP_UV ' + parameters.normalMapUv : '',\n\t\t\tparameters.displacementMapUv ? '#define DISPLACEMENTMAP_UV ' + parameters.displacementMapUv : '',\n\n\t\t\tparameters.metalnessMapUv ? '#define METALNESSMAP_UV ' + parameters.metalnessMapUv : '',\n\t\t\tparameters.roughnessMapUv ? '#define ROUGHNESSMAP_UV ' + parameters.roughnessMapUv : '',\n\n\t\t\tparameters.anisotropyMapUv ? '#define ANISOTROPYMAP_UV ' + parameters.anisotropyMapUv : '',\n\n\t\t\tparameters.clearcoatMapUv ? '#define CLEARCOATMAP_UV ' + parameters.clearcoatMapUv : '',\n\t\t\tparameters.clearcoatNormalMapUv ? '#define CLEARCOAT_NORMALMAP_UV ' + parameters.clearcoatNormalMapUv : '',\n\t\t\tparameters.clearcoatRoughnessMapUv ? '#define CLEARCOAT_ROUGHNESSMAP_UV ' + parameters.clearcoatRoughnessMapUv : '',\n\n\t\t\tparameters.iridescenceMapUv ? '#define IRIDESCENCEMAP_UV ' + parameters.iridescenceMapUv : '',\n\t\t\tparameters.iridescenceThicknessMapUv ? '#define IRIDESCENCE_THICKNESSMAP_UV ' + parameters.iridescenceThicknessMapUv : '',\n\n\t\t\tparameters.sheenColorMapUv ? '#define SHEEN_COLORMAP_UV ' + parameters.sheenColorMapUv : '',\n\t\t\tparameters.sheenRoughnessMapUv ? '#define SHEEN_ROUGHNESSMAP_UV ' + parameters.sheenRoughnessMapUv : '',\n\n\t\t\tparameters.specularMapUv ? '#define SPECULARMAP_UV ' + parameters.specularMapUv : '',\n\t\t\tparameters.specularColorMapUv ? '#define SPECULAR_COLORMAP_UV ' + parameters.specularColorMapUv : '',\n\t\t\tparameters.specularIntensityMapUv ? '#define SPECULAR_INTENSITYMAP_UV ' + parameters.specularIntensityMapUv : '',\n\n\t\t\tparameters.transmissionMapUv ? '#define TRANSMISSIONMAP_UV ' + parameters.transmissionMapUv : '',\n\t\t\tparameters.thicknessMapUv ? '#define THICKNESSMAP_UV ' + parameters.thicknessMapUv : '',\n\n\t\t\t//\n\n\t\t\tparameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUv1s ? '#define USE_UV1' : '',\n\t\t\tparameters.vertexUv2s ? '#define USE_UV2' : '',\n\t\t\tparameters.vertexUv3s ? '#define USE_UV3' : '',\n\n\t\t\tparameters.pointsUvs ? '#define USE_POINTS_UV' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.skinning ? '#define USE_SKINNING' : '',\n\n\t\t\tparameters.morphTargets ? '#define USE_MORPHTARGETS' : '',\n\t\t\tparameters.morphNormals && parameters.flatShading === false ? '#define USE_MORPHNORMALS' : '',\n\t\t\t( parameters.morphColors ) ? '#define USE_MORPHCOLORS' : '',\n\t\t\t( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_TEXTURE_STRIDE ' + parameters.morphTextureStride : '',\n\t\t\t( parameters.morphTargetsCount > 0 ) ? '#define MORPHTARGETS_COUNT ' + parameters.morphTargetsCount : '',\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.sizeAttenuation ? '#define USE_SIZEATTENUATION' : '',\n\n\t\t\tparameters.numLightProbes > 0 ? '#define USE_LIGHT_PROBES' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGARITHMIC_DEPTH_BUFFER' : '',\n\t\t\tparameters.reversedDepthBuffer ? '#define USE_REVERSED_DEPTH_BUFFER' : '',\n\n\t\t\t'uniform mat4 modelMatrix;',\n\t\t\t'uniform mat4 modelViewMatrix;',\n\t\t\t'uniform mat4 projectionMatrix;',\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform mat3 normalMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t'#ifdef USE_INSTANCING',\n\n\t\t\t'\tattribute mat4 instanceMatrix;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_INSTANCING_COLOR',\n\n\t\t\t'\tattribute vec3 instanceColor;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_INSTANCING_MORPH',\n\n\t\t\t'\tuniform sampler2D morphTexture;',\n\n\t\t\t'#endif',\n\n\t\t\t'attribute vec3 position;',\n\t\t\t'attribute vec3 normal;',\n\t\t\t'attribute vec2 uv;',\n\n\t\t\t'#ifdef USE_UV1',\n\n\t\t\t'\tattribute vec2 uv1;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_UV2',\n\n\t\t\t'\tattribute vec2 uv2;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_UV3',\n\n\t\t\t'\tattribute vec2 uv3;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_TANGENT',\n\n\t\t\t'\tattribute vec4 tangent;',\n\n\t\t\t'#endif',\n\n\t\t\t'#if defined( USE_COLOR_ALPHA )',\n\n\t\t\t'\tattribute vec4 color;',\n\n\t\t\t'#elif defined( USE_COLOR )',\n\n\t\t\t'\tattribute vec3 color;',\n\n\t\t\t'#endif',\n\n\t\t\t'#ifdef USE_SKINNING',\n\n\t\t\t'\tattribute vec4 skinIndex;',\n\t\t\t'\tattribute vec4 skinWeight;',\n\n\t\t\t'#endif',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t\tprefixFragment = [\n\n\t\t\tgeneratePrecision( parameters ),\n\n\t\t\t'#define SHADER_TYPE ' + parameters.shaderType,\n\t\t\t'#define SHADER_NAME ' + parameters.shaderName,\n\n\t\t\tcustomDefines,\n\n\t\t\tparameters.useFog && parameters.fog ? '#define USE_FOG' : '',\n\t\t\tparameters.useFog && parameters.fogExp2 ? '#define FOG_EXP2' : '',\n\n\t\t\tparameters.alphaToCoverage ? '#define ALPHA_TO_COVERAGE' : '',\n\t\t\tparameters.map ? '#define USE_MAP' : '',\n\t\t\tparameters.matcap ? '#define USE_MATCAP' : '',\n\t\t\tparameters.envMap ? '#define USE_ENVMAP' : '',\n\t\t\tparameters.envMap ? '#define ' + envMapTypeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapModeDefine : '',\n\t\t\tparameters.envMap ? '#define ' + envMapBlendingDefine : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_WIDTH ' + envMapCubeUVSize.texelWidth : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_TEXEL_HEIGHT ' + envMapCubeUVSize.texelHeight : '',\n\t\t\tenvMapCubeUVSize ? '#define CUBEUV_MAX_MIP ' + envMapCubeUVSize.maxMip + '.0' : '',\n\t\t\tparameters.lightMap ? '#define USE_LIGHTMAP' : '',\n\t\t\tparameters.aoMap ? '#define USE_AOMAP' : '',\n\t\t\tparameters.bumpMap ? '#define USE_BUMPMAP' : '',\n\t\t\tparameters.normalMap ? '#define USE_NORMALMAP' : '',\n\t\t\tparameters.normalMapObjectSpace ? '#define USE_NORMALMAP_OBJECTSPACE' : '',\n\t\t\tparameters.normalMapTangentSpace ? '#define USE_NORMALMAP_TANGENTSPACE' : '',\n\t\t\tparameters.emissiveMap ? '#define USE_EMISSIVEMAP' : '',\n\n\t\t\tparameters.anisotropy ? '#define USE_ANISOTROPY' : '',\n\t\t\tparameters.anisotropyMap ? '#define USE_ANISOTROPYMAP' : '',\n\n\t\t\tparameters.clearcoat ? '#define USE_CLEARCOAT' : '',\n\t\t\tparameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',\n\t\t\tparameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',\n\t\t\tparameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',\n\n\t\t\tparameters.dispersion ? '#define USE_DISPERSION' : '',\n\n\t\t\tparameters.iridescence ? '#define USE_IRIDESCENCE' : '',\n\t\t\tparameters.iridescenceMap ? '#define USE_IRIDESCENCEMAP' : '',\n\t\t\tparameters.iridescenceThicknessMap ? '#define USE_IRIDESCENCE_THICKNESSMAP' : '',\n\n\t\t\tparameters.specularMap ? '#define USE_SPECULARMAP' : '',\n\t\t\tparameters.specularColorMap ? '#define USE_SPECULAR_COLORMAP' : '',\n\t\t\tparameters.specularIntensityMap ? '#define USE_SPECULAR_INTENSITYMAP' : '',\n\n\t\t\tparameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',\n\t\t\tparameters.metalnessMap ? '#define USE_METALNESSMAP' : '',\n\n\t\t\tparameters.alphaMap ? '#define USE_ALPHAMAP' : '',\n\t\t\tparameters.alphaTest ? '#define USE_ALPHATEST' : '',\n\t\t\tparameters.alphaHash ? '#define USE_ALPHAHASH' : '',\n\n\t\t\tparameters.sheen ? '#define USE_SHEEN' : '',\n\t\t\tparameters.sheenColorMap ? '#define USE_SHEEN_COLORMAP' : '',\n\t\t\tparameters.sheenRoughnessMap ? '#define USE_SHEEN_ROUGHNESSMAP' : '',\n\n\t\t\tparameters.transmission ? '#define USE_TRANSMISSION' : '',\n\t\t\tparameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',\n\t\t\tparameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',\n\n\t\t\tparameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '',\n\t\t\tparameters.vertexColors || parameters.instancingColor || parameters.batchingColor ? '#define USE_COLOR' : '',\n\t\t\tparameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',\n\t\t\tparameters.vertexUv1s ? '#define USE_UV1' : '',\n\t\t\tparameters.vertexUv2s ? '#define USE_UV2' : '',\n\t\t\tparameters.vertexUv3s ? '#define USE_UV3' : '',\n\n\t\t\tparameters.pointsUvs ? '#define USE_POINTS_UV' : '',\n\n\t\t\tparameters.gradientMap ? '#define USE_GRADIENTMAP' : '',\n\n\t\t\tparameters.flatShading ? '#define FLAT_SHADED' : '',\n\n\t\t\tparameters.doubleSided ? '#define DOUBLE_SIDED' : '',\n\t\t\tparameters.flipSided ? '#define FLIP_SIDED' : '',\n\n\t\t\tparameters.shadowMapEnabled ? '#define USE_SHADOWMAP' : '',\n\t\t\tparameters.shadowMapEnabled ? '#define ' + shadowMapTypeDefine : '',\n\n\t\t\tparameters.premultipliedAlpha ? '#define PREMULTIPLIED_ALPHA' : '',\n\n\t\t\tparameters.numLightProbes > 0 ? '#define USE_LIGHT_PROBES' : '',\n\n\t\t\tparameters.decodeVideoTexture ? '#define DECODE_VIDEO_TEXTURE' : '',\n\t\t\tparameters.decodeVideoTextureEmissive ? '#define DECODE_VIDEO_TEXTURE_EMISSIVE' : '',\n\n\t\t\tparameters.logarithmicDepthBuffer ? '#define USE_LOGARITHMIC_DEPTH_BUFFER' : '',\n\t\t\tparameters.reversedDepthBuffer ? '#define USE_REVERSED_DEPTH_BUFFER' : '',\n\n\t\t\t'uniform mat4 viewMatrix;',\n\t\t\t'uniform vec3 cameraPosition;',\n\t\t\t'uniform bool isOrthographic;',\n\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? '#define TONE_MAPPING' : '',\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? ShaderChunk[ 'tonemapping_pars_fragment' ] : '', // this code is required here because it is used by the toneMapping() function defined below\n\t\t\t( parameters.toneMapping !== NoToneMapping ) ? getToneMappingFunction( 'toneMapping', parameters.toneMapping ) : '',\n\n\t\t\tparameters.dithering ? '#define DITHERING' : '',\n\t\t\tparameters.opaque ? '#define OPAQUE' : '',\n\n\t\t\tShaderChunk[ 'colorspace_pars_fragment' ], // this code is required here because it is used by the various encoding/decoding function defined below\n\t\t\tgetTexelEncodingFunction( 'linearToOutputTexel', parameters.outputColorSpace ),\n\t\t\tgetLuminanceFunction(),\n\n\t\t\tparameters.useDepthPacking ? '#define DEPTH_PACKING ' + parameters.depthPacking : '',\n\n\t\t\t'\\n'\n\n\t\t].filter( filterEmptyLine ).join( '\\n' );\n\n\t}\n\n\tvertexShader = resolveIncludes( vertexShader );\n\tvertexShader = replaceLightNums( vertexShader, parameters );\n\tvertexShader = replaceClippingPlaneNums( vertexShader, parameters );\n\n\tfragmentShader = resolveIncludes( fragmentShader );\n\tfragmentShader = replaceLightNums( fragmentShader, parameters );\n\tfragmentShader = replaceClippingPlaneNums( fragmentShader, parameters );\n\n\tvertexShader = unrollLoops( vertexShader );\n\tfragmentShader = unrollLoops( fragmentShader );\n\n\tif ( parameters.isRawShaderMaterial !== true ) {\n\n\t\t// GLSL 3.0 conversion for built-in materials and ShaderMaterial\n\n\t\tversionString = '#version 300 es\\n';\n\n\t\tprefixVertex = [\n\t\t\tcustomVertexExtensions,\n\t\t\t'#define attribute in',\n\t\t\t'#define varying out',\n\t\t\t'#define texture2D texture'\n\t\t].join( '\\n' ) + '\\n' + prefixVertex;\n\n\t\tprefixFragment = [\n\t\t\t'#define varying in',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : 'layout(location = 0) out highp vec4 pc_fragColor;',\n\t\t\t( parameters.glslVersion === GLSL3 ) ? '' : '#define gl_FragColor pc_fragColor',\n\t\t\t'#define gl_FragDepthEXT gl_FragDepth',\n\t\t\t'#define texture2D texture',\n\t\t\t'#define textureCube texture',\n\t\t\t'#define texture2DProj textureProj',\n\t\t\t'#define texture2DLodEXT textureLod',\n\t\t\t'#define texture2DProjLodEXT textureProjLod',\n\t\t\t'#define textureCubeLodEXT textureLod',\n\t\t\t'#define texture2DGradEXT textureGrad',\n\t\t\t'#define texture2DProjGradEXT textureProjGrad',\n\t\t\t'#define textureCubeGradEXT textureGrad'\n\t\t].join( '\\n' ) + '\\n' + prefixFragment;\n\n\t}\n\n\tconst vertexGlsl = versionString + prefixVertex + vertexShader;\n\tconst fragmentGlsl = versionString + prefixFragment + fragmentShader;\n\n\t// log( '*VERTEX*', vertexGlsl );\n\t// log( '*FRAGMENT*', fragmentGlsl );\n\n\tconst glVertexShader = WebGLShader( gl, gl.VERTEX_SHADER, vertexGlsl );\n\tconst glFragmentShader = WebGLShader( gl, gl.FRAGMENT_SHADER, fragmentGlsl );\n\n\tgl.attachShader( program, glVertexShader );\n\tgl.attachShader( program, glFragmentShader );\n\n\t// Force a particular attribute to index 0.\n\n\tif ( parameters.index0AttributeName !== undefined ) {\n\n\t\tgl.bindAttribLocation( program, 0, parameters.index0AttributeName );\n\n\t} else if ( parameters.morphTargets === true ) {\n\n\t\t// programs with morphTargets displace position out of attribute 0\n\t\tgl.bindAttribLocation( program, 0, 'position' );\n\n\t}\n\n\tgl.linkProgram( program );\n\n\tfunction onFirstUse( self ) {\n\n\t\t// check for link errors\n\t\tif ( renderer.debug.checkShaderErrors ) {\n\n\t\t\tconst programInfoLog = gl.getProgramInfoLog( program ) || '';\n\t\t\tconst vertexShaderInfoLog = gl.getShaderInfoLog( glVertexShader ) || '';\n\t\t\tconst fragmentShaderInfoLog = gl.getShaderInfoLog( glFragmentShader ) || '';\n\n\t\t\tconst programLog = programInfoLog.trim();\n\t\t\tconst vertexLog = vertexShaderInfoLog.trim();\n\t\t\tconst fragmentLog = fragmentShaderInfoLog.trim();\n\n\t\t\tlet runnable = true;\n\t\t\tlet haveDiagnostics = true;\n\n\t\t\tif ( gl.getProgramParameter( program, gl.LINK_STATUS ) === false ) {\n\n\t\t\t\trunnable = false;\n\n\t\t\t\tif ( typeof renderer.debug.onShaderError === 'function' ) {\n\n\t\t\t\t\trenderer.debug.onShaderError( gl, program, glVertexShader, glFragmentShader );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// default error reporting\n\n\t\t\t\t\tconst vertexErrors = getShaderErrors( gl, glVertexShader, 'vertex' );\n\t\t\t\t\tconst fragmentErrors = getShaderErrors( gl, glFragmentShader, 'fragment' );\n\n\t\t\t\t\terror(\n\t\t\t\t\t\t'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' +\n\t\t\t\t\t\t'VALIDATE_STATUS ' + gl.getProgramParameter( program, gl.VALIDATE_STATUS ) + '\\n\\n' +\n\t\t\t\t\t\t'Material Name: ' + self.name + '\\n' +\n\t\t\t\t\t\t'Material Type: ' + self.type + '\\n\\n' +\n\t\t\t\t\t\t'Program Info Log: ' + programLog + '\\n' +\n\t\t\t\t\t\tvertexErrors + '\\n' +\n\t\t\t\t\t\tfragmentErrors\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t} else if ( programLog !== '' ) {\n\n\t\t\t\twarn( 'WebGLProgram: Program Info Log:', programLog );\n\n\t\t\t} else if ( vertexLog === '' || fragmentLog === '' ) {\n\n\t\t\t\thaveDiagnostics = false;\n\n\t\t\t}\n\n\t\t\tif ( haveDiagnostics ) {\n\n\t\t\t\tself.diagnostics = {\n\n\t\t\t\t\trunnable: runnable,\n\n\t\t\t\t\tprogramLog: programLog,\n\n\t\t\t\t\tvertexShader: {\n\n\t\t\t\t\t\tlog: vertexLog,\n\t\t\t\t\t\tprefix: prefixVertex\n\n\t\t\t\t\t},\n\n\t\t\t\t\tfragmentShader: {\n\n\t\t\t\t\t\tlog: fragmentLog,\n\t\t\t\t\t\tprefix: prefixFragment\n\n\t\t\t\t\t}\n\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Clean up\n\n\t\t// Crashes in iOS9 and iOS10. #18402\n\t\t// gl.detachShader( program, glVertexShader );\n\t\t// gl.detachShader( program, glFragmentShader );\n\n\t\tgl.deleteShader( glVertexShader );\n\t\tgl.deleteShader( glFragmentShader );\n\n\t\tcachedUniforms = new WebGLUniforms( gl, program );\n\t\tcachedAttributes = fetchAttributeLocations( gl, program );\n\n\t}\n\n\t// set up caching for uniform locations\n\n\tlet cachedUniforms;\n\n\tthis.getUniforms = function () {\n\n\t\tif ( cachedUniforms === undefined ) {\n\n\t\t\t// Populates cachedUniforms and cachedAttributes\n\t\t\tonFirstUse( this );\n\n\t\t}\n\n\t\treturn cachedUniforms;\n\n\t};\n\n\t// set up caching for attribute locations\n\n\tlet cachedAttributes;\n\n\tthis.getAttributes = function () {\n\n\t\tif ( cachedAttributes === undefined ) {\n\n\t\t\t// Populates cachedAttributes and cachedUniforms\n\t\t\tonFirstUse( this );\n\n\t\t}\n\n\t\treturn cachedAttributes;\n\n\t};\n\n\t// indicate when the program is ready to be used. if the KHR_parallel_shader_compile extension isn't supported,\n\t// flag the program as ready immediately. It may cause a stall when it's first used.\n\n\tlet programReady = ( parameters.rendererExtensionParallelShaderCompile === false );\n\n\tthis.isReady = function () {\n\n\t\tif ( programReady === false ) {\n\n\t\t\tprogramReady = gl.getProgramParameter( program, COMPLETION_STATUS_KHR );\n\n\t\t}\n\n\t\treturn programReady;\n\n\t};\n\n\t// free resource\n\n\tthis.destroy = function () {\n\n\t\tbindingStates.releaseStatesOfProgram( this );\n\n\t\tgl.deleteProgram( program );\n\t\tthis.program = undefined;\n\n\t};\n\n\t//\n\n\tthis.type = parameters.shaderType;\n\tthis.name = parameters.shaderName;\n\tthis.id = programIdCount ++;\n\tthis.cacheKey = cacheKey;\n\tthis.usedTimes = 1;\n\tthis.program = program;\n\tthis.vertexShader = glVertexShader;\n\tthis.fragmentShader = glFragmentShader;\n\n\treturn this;\n\n}\n\nlet _id = 0;\n\nclass WebGLShaderCache {\n\n\tconstructor() {\n\n\t\tthis.shaderCache = new Map();\n\t\tthis.materialCache = new Map();\n\n\t}\n\n\tupdate( material ) {\n\n\t\tconst vertexShader = material.vertexShader;\n\t\tconst fragmentShader = material.fragmentShader;\n\n\t\tconst vertexShaderStage = this._getShaderStage( vertexShader );\n\t\tconst fragmentShaderStage = this._getShaderStage( fragmentShader );\n\n\t\tconst materialShaders = this._getShaderCacheForMaterial( material );\n\n\t\tif ( materialShaders.has( vertexShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( vertexShaderStage );\n\t\t\tvertexShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\tif ( materialShaders.has( fragmentShaderStage ) === false ) {\n\n\t\t\tmaterialShaders.add( fragmentShaderStage );\n\t\t\tfragmentShaderStage.usedTimes ++;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tremove( material ) {\n\n\t\tconst materialShaders = this.materialCache.get( material );\n\n\t\tfor ( const shaderStage of materialShaders ) {\n\n\t\t\tshaderStage.usedTimes --;\n\n\t\t\tif ( shaderStage.usedTimes === 0 ) this.shaderCache.delete( shaderStage.code );\n\n\t\t}\n\n\t\tthis.materialCache.delete( material );\n\n\t\treturn this;\n\n\t}\n\n\tgetVertexShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.vertexShader ).id;\n\n\t}\n\n\tgetFragmentShaderID( material ) {\n\n\t\treturn this._getShaderStage( material.fragmentShader ).id;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.shaderCache.clear();\n\t\tthis.materialCache.clear();\n\n\t}\n\n\t_getShaderCacheForMaterial( material ) {\n\n\t\tconst cache = this.materialCache;\n\t\tlet set = cache.get( material );\n\n\t\tif ( set === undefined ) {\n\n\t\t\tset = new Set();\n\t\t\tcache.set( material, set );\n\n\t\t}\n\n\t\treturn set;\n\n\t}\n\n\t_getShaderStage( code ) {\n\n\t\tconst cache = this.shaderCache;\n\t\tlet stage = cache.get( code );\n\n\t\tif ( stage === undefined ) {\n\n\t\t\tstage = new WebGLShaderStage( code );\n\t\t\tcache.set( code, stage );\n\n\t\t}\n\n\t\treturn stage;\n\n\t}\n\n}\n\nclass WebGLShaderStage {\n\n\tconstructor( code ) {\n\n\t\tthis.id = _id ++;\n\n\t\tthis.code = code;\n\t\tthis.usedTimes = 0;\n\n\t}\n\n}\n\nfunction WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping ) {\n\n\tconst _programLayers = new Layers();\n\tconst _customShaders = new WebGLShaderCache();\n\tconst _activeChannels = new Set();\n\tconst programs = [];\n\tconst programsMap = new Map();\n\n\tconst logarithmicDepthBuffer = capabilities.logarithmicDepthBuffer;\n\n\tlet precision = capabilities.precision;\n\n\tconst shaderIDs = {\n\t\tMeshDepthMaterial: 'depth',\n\t\tMeshDistanceMaterial: 'distance',\n\t\tMeshNormalMaterial: 'normal',\n\t\tMeshBasicMaterial: 'basic',\n\t\tMeshLambertMaterial: 'lambert',\n\t\tMeshPhongMaterial: 'phong',\n\t\tMeshToonMaterial: 'toon',\n\t\tMeshStandardMaterial: 'physical',\n\t\tMeshPhysicalMaterial: 'physical',\n\t\tMeshMatcapMaterial: 'matcap',\n\t\tLineBasicMaterial: 'basic',\n\t\tLineDashedMaterial: 'dashed',\n\t\tPointsMaterial: 'points',\n\t\tShadowMaterial: 'shadow',\n\t\tSpriteMaterial: 'sprite'\n\t};\n\n\tfunction getChannel( value ) {\n\n\t\t_activeChannels.add( value );\n\n\t\tif ( value === 0 ) return 'uv';\n\n\t\treturn `uv${ value }`;\n\n\t}\n\n\tfunction getParameters( material, lights, shadows, scene, object ) {\n\n\t\tconst fog = scene.fog;\n\t\tconst geometry = object.geometry;\n\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\n\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\tconst envMapCubeUVHeight = ( !! envMap ) && ( envMap.mapping === CubeUVReflectionMapping ) ? envMap.image.height : null;\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\n\t\t// heuristics to create shader parameters according to lights in the scene\n\t\t// (not to blow over maxLights budget)\n\n\t\tif ( material.precision !== null ) {\n\n\t\t\tprecision = capabilities.getMaxPrecision( material.precision );\n\n\t\t\tif ( precision !== material.precision ) {\n\n\t\t\t\twarn( 'WebGLProgram.getParameters:', material.precision, 'not supported, using', precision, 'instead.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\tlet morphTextureStride = 0;\n\n\t\tif ( geometry.morphAttributes.position !== undefined ) morphTextureStride = 1;\n\t\tif ( geometry.morphAttributes.normal !== undefined ) morphTextureStride = 2;\n\t\tif ( geometry.morphAttributes.color !== undefined ) morphTextureStride = 3;\n\n\t\t//\n\n\t\tlet vertexShader, fragmentShader;\n\t\tlet customVertexShaderID, customFragmentShaderID;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\n\t\t\tvertexShader = shader.vertexShader;\n\t\t\tfragmentShader = shader.fragmentShader;\n\n\t\t} else {\n\n\t\t\tvertexShader = material.vertexShader;\n\t\t\tfragmentShader = material.fragmentShader;\n\n\t\t\t_customShaders.update( material );\n\n\t\t\tcustomVertexShaderID = _customShaders.getVertexShaderID( material );\n\t\t\tcustomFragmentShaderID = _customShaders.getFragmentShaderID( material );\n\n\t\t}\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst reversedDepthBuffer = renderer.state.buffers.depth.getReversed();\n\n\t\tconst IS_INSTANCEDMESH = object.isInstancedMesh === true;\n\t\tconst IS_BATCHEDMESH = object.isBatchedMesh === true;\n\n\t\tconst HAS_MAP = !! material.map;\n\t\tconst HAS_MATCAP = !! material.matcap;\n\t\tconst HAS_ENVMAP = !! envMap;\n\t\tconst HAS_AOMAP = !! material.aoMap;\n\t\tconst HAS_LIGHTMAP = !! material.lightMap;\n\t\tconst HAS_BUMPMAP = !! material.bumpMap;\n\t\tconst HAS_NORMALMAP = !! material.normalMap;\n\t\tconst HAS_DISPLACEMENTMAP = !! material.displacementMap;\n\t\tconst HAS_EMISSIVEMAP = !! material.emissiveMap;\n\n\t\tconst HAS_METALNESSMAP = !! material.metalnessMap;\n\t\tconst HAS_ROUGHNESSMAP = !! material.roughnessMap;\n\n\t\tconst HAS_ANISOTROPY = material.anisotropy > 0;\n\t\tconst HAS_CLEARCOAT = material.clearcoat > 0;\n\t\tconst HAS_DISPERSION = material.dispersion > 0;\n\t\tconst HAS_IRIDESCENCE = material.iridescence > 0;\n\t\tconst HAS_SHEEN = material.sheen > 0;\n\t\tconst HAS_TRANSMISSION = material.transmission > 0;\n\n\t\tconst HAS_ANISOTROPYMAP = HAS_ANISOTROPY && !! material.anisotropyMap;\n\n\t\tconst HAS_CLEARCOATMAP = HAS_CLEARCOAT && !! material.clearcoatMap;\n\t\tconst HAS_CLEARCOAT_NORMALMAP = HAS_CLEARCOAT && !! material.clearcoatNormalMap;\n\t\tconst HAS_CLEARCOAT_ROUGHNESSMAP = HAS_CLEARCOAT && !! material.clearcoatRoughnessMap;\n\n\t\tconst HAS_IRIDESCENCEMAP = HAS_IRIDESCENCE && !! material.iridescenceMap;\n\t\tconst HAS_IRIDESCENCE_THICKNESSMAP = HAS_IRIDESCENCE && !! material.iridescenceThicknessMap;\n\n\t\tconst HAS_SHEEN_COLORMAP = HAS_SHEEN && !! material.sheenColorMap;\n\t\tconst HAS_SHEEN_ROUGHNESSMAP = HAS_SHEEN && !! material.sheenRoughnessMap;\n\n\t\tconst HAS_SPECULARMAP = !! material.specularMap;\n\t\tconst HAS_SPECULAR_COLORMAP = !! material.specularColorMap;\n\t\tconst HAS_SPECULAR_INTENSITYMAP = !! material.specularIntensityMap;\n\n\t\tconst HAS_TRANSMISSIONMAP = HAS_TRANSMISSION && !! material.transmissionMap;\n\t\tconst HAS_THICKNESSMAP = HAS_TRANSMISSION && !! material.thicknessMap;\n\n\t\tconst HAS_GRADIENTMAP = !! material.gradientMap;\n\n\t\tconst HAS_ALPHAMAP = !! material.alphaMap;\n\n\t\tconst HAS_ALPHATEST = material.alphaTest > 0;\n\n\t\tconst HAS_ALPHAHASH = !! material.alphaHash;\n\n\t\tconst HAS_EXTENSIONS = !! material.extensions;\n\n\t\tlet toneMapping = NoToneMapping;\n\n\t\tif ( material.toneMapped ) {\n\n\t\t\tif ( currentRenderTarget === null || currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\t\t\ttoneMapping = renderer.toneMapping;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst parameters = {\n\n\t\t\tshaderID: shaderID,\n\t\t\tshaderType: material.type,\n\t\t\tshaderName: material.name,\n\n\t\t\tvertexShader: vertexShader,\n\t\t\tfragmentShader: fragmentShader,\n\t\t\tdefines: material.defines,\n\n\t\t\tcustomVertexShaderID: customVertexShaderID,\n\t\t\tcustomFragmentShaderID: customFragmentShaderID,\n\n\t\t\tisRawShaderMaterial: material.isRawShaderMaterial === true,\n\t\t\tglslVersion: material.glslVersion,\n\n\t\t\tprecision: precision,\n\n\t\t\tbatching: IS_BATCHEDMESH,\n\t\t\tbatchingColor: IS_BATCHEDMESH && object._colorsTexture !== null,\n\t\t\tinstancing: IS_INSTANCEDMESH,\n\t\t\tinstancingColor: IS_INSTANCEDMESH && object.instanceColor !== null,\n\t\t\tinstancingMorph: IS_INSTANCEDMESH && object.morphTexture !== null,\n\n\t\t\toutputColorSpace: ( currentRenderTarget === null ) ? renderer.outputColorSpace : ( currentRenderTarget.isXRRenderTarget === true ? currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace ),\n\t\t\talphaToCoverage: !! material.alphaToCoverage,\n\n\t\t\tmap: HAS_MAP,\n\t\t\tmatcap: HAS_MATCAP,\n\t\t\tenvMap: HAS_ENVMAP,\n\t\t\tenvMapMode: HAS_ENVMAP && envMap.mapping,\n\t\t\tenvMapCubeUVHeight: envMapCubeUVHeight,\n\t\t\taoMap: HAS_AOMAP,\n\t\t\tlightMap: HAS_LIGHTMAP,\n\t\t\tbumpMap: HAS_BUMPMAP,\n\t\t\tnormalMap: HAS_NORMALMAP,\n\t\t\tdisplacementMap: HAS_DISPLACEMENTMAP,\n\t\t\temissiveMap: HAS_EMISSIVEMAP,\n\n\t\t\tnormalMapObjectSpace: HAS_NORMALMAP && material.normalMapType === ObjectSpaceNormalMap,\n\t\t\tnormalMapTangentSpace: HAS_NORMALMAP && material.normalMapType === TangentSpaceNormalMap,\n\n\t\t\tmetalnessMap: HAS_METALNESSMAP,\n\t\t\troughnessMap: HAS_ROUGHNESSMAP,\n\n\t\t\tanisotropy: HAS_ANISOTROPY,\n\t\t\tanisotropyMap: HAS_ANISOTROPYMAP,\n\n\t\t\tclearcoat: HAS_CLEARCOAT,\n\t\t\tclearcoatMap: HAS_CLEARCOATMAP,\n\t\t\tclearcoatNormalMap: HAS_CLEARCOAT_NORMALMAP,\n\t\t\tclearcoatRoughnessMap: HAS_CLEARCOAT_ROUGHNESSMAP,\n\n\t\t\tdispersion: HAS_DISPERSION,\n\n\t\t\tiridescence: HAS_IRIDESCENCE,\n\t\t\tiridescenceMap: HAS_IRIDESCENCEMAP,\n\t\t\tiridescenceThicknessMap: HAS_IRIDESCENCE_THICKNESSMAP,\n\n\t\t\tsheen: HAS_SHEEN,\n\t\t\tsheenColorMap: HAS_SHEEN_COLORMAP,\n\t\t\tsheenRoughnessMap: HAS_SHEEN_ROUGHNESSMAP,\n\n\t\t\tspecularMap: HAS_SPECULARMAP,\n\t\t\tspecularColorMap: HAS_SPECULAR_COLORMAP,\n\t\t\tspecularIntensityMap: HAS_SPECULAR_INTENSITYMAP,\n\n\t\t\ttransmission: HAS_TRANSMISSION,\n\t\t\ttransmissionMap: HAS_TRANSMISSIONMAP,\n\t\t\tthicknessMap: HAS_THICKNESSMAP,\n\n\t\t\tgradientMap: HAS_GRADIENTMAP,\n\n\t\t\topaque: material.transparent === false && material.blending === NormalBlending && material.alphaToCoverage === false,\n\n\t\t\talphaMap: HAS_ALPHAMAP,\n\t\t\talphaTest: HAS_ALPHATEST,\n\t\t\talphaHash: HAS_ALPHAHASH,\n\n\t\t\tcombine: material.combine,\n\n\t\t\t//\n\n\t\t\tmapUv: HAS_MAP && getChannel( material.map.channel ),\n\t\t\taoMapUv: HAS_AOMAP && getChannel( material.aoMap.channel ),\n\t\t\tlightMapUv: HAS_LIGHTMAP && getChannel( material.lightMap.channel ),\n\t\t\tbumpMapUv: HAS_BUMPMAP && getChannel( material.bumpMap.channel ),\n\t\t\tnormalMapUv: HAS_NORMALMAP && getChannel( material.normalMap.channel ),\n\t\t\tdisplacementMapUv: HAS_DISPLACEMENTMAP && getChannel( material.displacementMap.channel ),\n\t\t\temissiveMapUv: HAS_EMISSIVEMAP && getChannel( material.emissiveMap.channel ),\n\n\t\t\tmetalnessMapUv: HAS_METALNESSMAP && getChannel( material.metalnessMap.channel ),\n\t\t\troughnessMapUv: HAS_ROUGHNESSMAP && getChannel( material.roughnessMap.channel ),\n\n\t\t\tanisotropyMapUv: HAS_ANISOTROPYMAP && getChannel( material.anisotropyMap.channel ),\n\n\t\t\tclearcoatMapUv: HAS_CLEARCOATMAP && getChannel( material.clearcoatMap.channel ),\n\t\t\tclearcoatNormalMapUv: HAS_CLEARCOAT_NORMALMAP && getChannel( material.clearcoatNormalMap.channel ),\n\t\t\tclearcoatRoughnessMapUv: HAS_CLEARCOAT_ROUGHNESSMAP && getChannel( material.clearcoatRoughnessMap.channel ),\n\n\t\t\tiridescenceMapUv: HAS_IRIDESCENCEMAP && getChannel( material.iridescenceMap.channel ),\n\t\t\tiridescenceThicknessMapUv: HAS_IRIDESCENCE_THICKNESSMAP && getChannel( material.iridescenceThicknessMap.channel ),\n\n\t\t\tsheenColorMapUv: HAS_SHEEN_COLORMAP && getChannel( material.sheenColorMap.channel ),\n\t\t\tsheenRoughnessMapUv: HAS_SHEEN_ROUGHNESSMAP && getChannel( material.sheenRoughnessMap.channel ),\n\n\t\t\tspecularMapUv: HAS_SPECULARMAP && getChannel( material.specularMap.channel ),\n\t\t\tspecularColorMapUv: HAS_SPECULAR_COLORMAP && getChannel( material.specularColorMap.channel ),\n\t\t\tspecularIntensityMapUv: HAS_SPECULAR_INTENSITYMAP && getChannel( material.specularIntensityMap.channel ),\n\n\t\t\ttransmissionMapUv: HAS_TRANSMISSIONMAP && getChannel( material.transmissionMap.channel ),\n\t\t\tthicknessMapUv: HAS_THICKNESSMAP && getChannel( material.thicknessMap.channel ),\n\n\t\t\talphaMapUv: HAS_ALPHAMAP && getChannel( material.alphaMap.channel ),\n\n\t\t\t//\n\n\t\t\tvertexTangents: !! geometry.attributes.tangent && ( HAS_NORMALMAP || HAS_ANISOTROPY ),\n\t\t\tvertexColors: material.vertexColors,\n\t\t\tvertexAlphas: material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4,\n\n\t\t\tpointsUvs: object.isPoints === true && !! geometry.attributes.uv && ( HAS_MAP || HAS_ALPHAMAP ),\n\n\t\t\tfog: !! fog,\n\t\t\tuseFog: material.fog === true,\n\t\t\tfogExp2: ( !! fog && fog.isFogExp2 ),\n\n\t\t\tflatShading: ( material.flatShading === true && material.wireframe === false ),\n\n\t\t\tsizeAttenuation: material.sizeAttenuation === true,\n\t\t\tlogarithmicDepthBuffer: logarithmicDepthBuffer,\n\t\t\treversedDepthBuffer: reversedDepthBuffer,\n\n\t\t\tskinning: object.isSkinnedMesh === true,\n\n\t\t\tmorphTargets: geometry.morphAttributes.position !== undefined,\n\t\t\tmorphNormals: geometry.morphAttributes.normal !== undefined,\n\t\t\tmorphColors: geometry.morphAttributes.color !== undefined,\n\t\t\tmorphTargetsCount: morphTargetsCount,\n\t\t\tmorphTextureStride: morphTextureStride,\n\n\t\t\tnumDirLights: lights.directional.length,\n\t\t\tnumPointLights: lights.point.length,\n\t\t\tnumSpotLights: lights.spot.length,\n\t\t\tnumSpotLightMaps: lights.spotLightMap.length,\n\t\t\tnumRectAreaLights: lights.rectArea.length,\n\t\t\tnumHemiLights: lights.hemi.length,\n\n\t\t\tnumDirLightShadows: lights.directionalShadowMap.length,\n\t\t\tnumPointLightShadows: lights.pointShadowMap.length,\n\t\t\tnumSpotLightShadows: lights.spotShadowMap.length,\n\t\t\tnumSpotLightShadowsWithMaps: lights.numSpotLightShadowsWithMaps,\n\n\t\t\tnumLightProbes: lights.numLightProbes,\n\n\t\t\tnumClippingPlanes: clipping.numPlanes,\n\t\t\tnumClipIntersection: clipping.numIntersection,\n\n\t\t\tdithering: material.dithering,\n\n\t\t\tshadowMapEnabled: renderer.shadowMap.enabled && shadows.length > 0,\n\t\t\tshadowMapType: renderer.shadowMap.type,\n\n\t\t\ttoneMapping: toneMapping,\n\n\t\t\tdecodeVideoTexture: HAS_MAP && ( material.map.isVideoTexture === true ) && ( ColorManagement.getTransfer( material.map.colorSpace ) === SRGBTransfer ),\n\t\t\tdecodeVideoTextureEmissive: HAS_EMISSIVEMAP && ( material.emissiveMap.isVideoTexture === true ) && ( ColorManagement.getTransfer( material.emissiveMap.colorSpace ) === SRGBTransfer ),\n\n\t\t\tpremultipliedAlpha: material.premultipliedAlpha,\n\n\t\t\tdoubleSided: material.side === DoubleSide,\n\t\t\tflipSided: material.side === BackSide,\n\n\t\t\tuseDepthPacking: material.depthPacking >= 0,\n\t\t\tdepthPacking: material.depthPacking || 0,\n\n\t\t\tindex0AttributeName: material.index0AttributeName,\n\n\t\t\textensionClipCullDistance: HAS_EXTENSIONS && material.extensions.clipCullDistance === true && extensions.has( 'WEBGL_clip_cull_distance' ),\n\t\t\textensionMultiDraw: ( HAS_EXTENSIONS && material.extensions.multiDraw === true || IS_BATCHEDMESH ) && extensions.has( 'WEBGL_multi_draw' ),\n\n\t\t\trendererExtensionParallelShaderCompile: extensions.has( 'KHR_parallel_shader_compile' ),\n\n\t\t\tcustomProgramCacheKey: material.customProgramCacheKey()\n\n\t\t};\n\n\t\t// the usage of getChannel() determines the active texture channels for this shader\n\n\t\tparameters.vertexUv1s = _activeChannels.has( 1 );\n\t\tparameters.vertexUv2s = _activeChannels.has( 2 );\n\t\tparameters.vertexUv3s = _activeChannels.has( 3 );\n\n\t\t_activeChannels.clear();\n\n\t\treturn parameters;\n\n\t}\n\n\tfunction getProgramCacheKey( parameters ) {\n\n\t\tconst array = [];\n\n\t\tif ( parameters.shaderID ) {\n\n\t\t\tarray.push( parameters.shaderID );\n\n\t\t} else {\n\n\t\t\tarray.push( parameters.customVertexShaderID );\n\t\t\tarray.push( parameters.customFragmentShaderID );\n\n\t\t}\n\n\t\tif ( parameters.defines !== undefined ) {\n\n\t\t\tfor ( const name in parameters.defines ) {\n\n\t\t\t\tarray.push( name );\n\t\t\t\tarray.push( parameters.defines[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( parameters.isRawShaderMaterial === false ) {\n\n\t\t\tgetProgramCacheKeyParameters( array, parameters );\n\t\t\tgetProgramCacheKeyBooleans( array, parameters );\n\t\t\tarray.push( renderer.outputColorSpace );\n\n\t\t}\n\n\t\tarray.push( parameters.customProgramCacheKey );\n\n\t\treturn array.join();\n\n\t}\n\n\tfunction getProgramCacheKeyParameters( array, parameters ) {\n\n\t\tarray.push( parameters.precision );\n\t\tarray.push( parameters.outputColorSpace );\n\t\tarray.push( parameters.envMapMode );\n\t\tarray.push( parameters.envMapCubeUVHeight );\n\t\tarray.push( parameters.mapUv );\n\t\tarray.push( parameters.alphaMapUv );\n\t\tarray.push( parameters.lightMapUv );\n\t\tarray.push( parameters.aoMapUv );\n\t\tarray.push( parameters.bumpMapUv );\n\t\tarray.push( parameters.normalMapUv );\n\t\tarray.push( parameters.displacementMapUv );\n\t\tarray.push( parameters.emissiveMapUv );\n\t\tarray.push( parameters.metalnessMapUv );\n\t\tarray.push( parameters.roughnessMapUv );\n\t\tarray.push( parameters.anisotropyMapUv );\n\t\tarray.push( parameters.clearcoatMapUv );\n\t\tarray.push( parameters.clearcoatNormalMapUv );\n\t\tarray.push( parameters.clearcoatRoughnessMapUv );\n\t\tarray.push( parameters.iridescenceMapUv );\n\t\tarray.push( parameters.iridescenceThicknessMapUv );\n\t\tarray.push( parameters.sheenColorMapUv );\n\t\tarray.push( parameters.sheenRoughnessMapUv );\n\t\tarray.push( parameters.specularMapUv );\n\t\tarray.push( parameters.specularColorMapUv );\n\t\tarray.push( parameters.specularIntensityMapUv );\n\t\tarray.push( parameters.transmissionMapUv );\n\t\tarray.push( parameters.thicknessMapUv );\n\t\tarray.push( parameters.combine );\n\t\tarray.push( parameters.fogExp2 );\n\t\tarray.push( parameters.sizeAttenuation );\n\t\tarray.push( parameters.morphTargetsCount );\n\t\tarray.push( parameters.morphAttributeCount );\n\t\tarray.push( parameters.numDirLights );\n\t\tarray.push( parameters.numPointLights );\n\t\tarray.push( parameters.numSpotLights );\n\t\tarray.push( parameters.numSpotLightMaps );\n\t\tarray.push( parameters.numHemiLights );\n\t\tarray.push( parameters.numRectAreaLights );\n\t\tarray.push( parameters.numDirLightShadows );\n\t\tarray.push( parameters.numPointLightShadows );\n\t\tarray.push( parameters.numSpotLightShadows );\n\t\tarray.push( parameters.numSpotLightShadowsWithMaps );\n\t\tarray.push( parameters.numLightProbes );\n\t\tarray.push( parameters.shadowMapType );\n\t\tarray.push( parameters.toneMapping );\n\t\tarray.push( parameters.numClippingPlanes );\n\t\tarray.push( parameters.numClipIntersection );\n\t\tarray.push( parameters.depthPacking );\n\n\t}\n\n\tfunction getProgramCacheKeyBooleans( array, parameters ) {\n\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.instancing )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.instancingColor )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.instancingMorph )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.matcap )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.envMap )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.normalMapObjectSpace )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.normalMapTangentSpace )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.clearcoat )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.iridescence )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.alphaTest )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.vertexColors )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.vertexAlphas )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.vertexUv1s )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.vertexUv2s )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.vertexUv3s )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.vertexTangents )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.anisotropy )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.alphaHash )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.batching )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.dispersion )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.batchingColor )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.gradientMap )\n\t\t\t_programLayers.enable( 21 );\n\n\t\tarray.push( _programLayers.mask );\n\t\t_programLayers.disableAll();\n\n\t\tif ( parameters.fog )\n\t\t\t_programLayers.enable( 0 );\n\t\tif ( parameters.useFog )\n\t\t\t_programLayers.enable( 1 );\n\t\tif ( parameters.flatShading )\n\t\t\t_programLayers.enable( 2 );\n\t\tif ( parameters.logarithmicDepthBuffer )\n\t\t\t_programLayers.enable( 3 );\n\t\tif ( parameters.reversedDepthBuffer )\n\t\t\t_programLayers.enable( 4 );\n\t\tif ( parameters.skinning )\n\t\t\t_programLayers.enable( 5 );\n\t\tif ( parameters.morphTargets )\n\t\t\t_programLayers.enable( 6 );\n\t\tif ( parameters.morphNormals )\n\t\t\t_programLayers.enable( 7 );\n\t\tif ( parameters.morphColors )\n\t\t\t_programLayers.enable( 8 );\n\t\tif ( parameters.premultipliedAlpha )\n\t\t\t_programLayers.enable( 9 );\n\t\tif ( parameters.shadowMapEnabled )\n\t\t\t_programLayers.enable( 10 );\n\t\tif ( parameters.doubleSided )\n\t\t\t_programLayers.enable( 11 );\n\t\tif ( parameters.flipSided )\n\t\t\t_programLayers.enable( 12 );\n\t\tif ( parameters.useDepthPacking )\n\t\t\t_programLayers.enable( 13 );\n\t\tif ( parameters.dithering )\n\t\t\t_programLayers.enable( 14 );\n\t\tif ( parameters.transmission )\n\t\t\t_programLayers.enable( 15 );\n\t\tif ( parameters.sheen )\n\t\t\t_programLayers.enable( 16 );\n\t\tif ( parameters.opaque )\n\t\t\t_programLayers.enable( 17 );\n\t\tif ( parameters.pointsUvs )\n\t\t\t_programLayers.enable( 18 );\n\t\tif ( parameters.decodeVideoTexture )\n\t\t\t_programLayers.enable( 19 );\n\t\tif ( parameters.decodeVideoTextureEmissive )\n\t\t\t_programLayers.enable( 20 );\n\t\tif ( parameters.alphaToCoverage )\n\t\t\t_programLayers.enable( 21 );\n\n\t\tarray.push( _programLayers.mask );\n\n\t}\n\n\tfunction getUniforms( material ) {\n\n\t\tconst shaderID = shaderIDs[ material.type ];\n\t\tlet uniforms;\n\n\t\tif ( shaderID ) {\n\n\t\t\tconst shader = ShaderLib[ shaderID ];\n\t\t\tuniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t} else {\n\n\t\t\tuniforms = material.uniforms;\n\n\t\t}\n\n\t\treturn uniforms;\n\n\t}\n\n\tfunction acquireProgram( parameters, cacheKey ) {\n\n\t\tlet program = programsMap.get( cacheKey );\n\n\t\tif ( program !== undefined ) {\n\n\t\t\t++ program.usedTimes;\n\n\t\t} else {\n\n\t\t\tprogram = new WebGLProgram( renderer, cacheKey, parameters, bindingStates );\n\t\t\tprograms.push( program );\n\n\t\t\tprogramsMap.set( cacheKey, program );\n\n\t\t}\n\n\t\treturn program;\n\n\t}\n\n\tfunction releaseProgram( program ) {\n\n\t\tif ( -- program.usedTimes === 0 ) {\n\n\t\t\t// Remove from unordered set\n\t\t\tconst i = programs.indexOf( program );\n\t\t\tprograms[ i ] = programs[ programs.length - 1 ];\n\t\t\tprograms.pop();\n\n\t\t\t// Remove from map\n\t\t\tprogramsMap.delete( program.cacheKey );\n\n\t\t\t// Free WebGL resources\n\t\t\tprogram.destroy();\n\n\t\t}\n\n\t}\n\n\tfunction releaseShaderCache( material ) {\n\n\t\t_customShaders.remove( material );\n\n\t}\n\n\tfunction dispose() {\n\n\t\t_customShaders.dispose();\n\n\t}\n\n\treturn {\n\t\tgetParameters: getParameters,\n\t\tgetProgramCacheKey: getProgramCacheKey,\n\t\tgetUniforms: getUniforms,\n\t\tacquireProgram: acquireProgram,\n\t\treleaseProgram: releaseProgram,\n\t\treleaseShaderCache: releaseShaderCache,\n\t\t// Exposed for resource monitoring & error feedback via renderer.info:\n\t\tprograms: programs,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction WebGLProperties() {\n\n\tlet properties = new WeakMap();\n\n\tfunction has( object ) {\n\n\t\treturn properties.has( object );\n\n\t}\n\n\tfunction get( object ) {\n\n\t\tlet map = properties.get( object );\n\n\t\tif ( map === undefined ) {\n\n\t\t\tmap = {};\n\t\t\tproperties.set( object, map );\n\n\t\t}\n\n\t\treturn map;\n\n\t}\n\n\tfunction remove( object ) {\n\n\t\tproperties.delete( object );\n\n\t}\n\n\tfunction update( object, key, value ) {\n\n\t\tproperties.get( object )[ key ] = value;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tproperties = new WeakMap();\n\n\t}\n\n\treturn {\n\t\thas: has,\n\t\tget: get,\n\t\tremove: remove,\n\t\tupdate: update,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction painterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.material.id !== b.material.id ) {\n\n\t\treturn a.material.id - b.material.id;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn a.z - b.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\nfunction reversePainterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn b.z - a.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\n\nfunction WebGLRenderList() {\n\n\tconst renderItems = [];\n\tlet renderItemsIndex = 0;\n\n\tconst opaque = [];\n\tconst transmissive = [];\n\tconst transparent = [];\n\n\tfunction init() {\n\n\t\trenderItemsIndex = 0;\n\n\t\topaque.length = 0;\n\t\ttransmissive.length = 0;\n\t\ttransparent.length = 0;\n\n\t}\n\n\tfunction getNextRenderItem( object, geometry, material, groupOrder, z, group ) {\n\n\t\tlet renderItem = renderItems[ renderItemsIndex ];\n\n\t\tif ( renderItem === undefined ) {\n\n\t\t\trenderItem = {\n\t\t\t\tid: object.id,\n\t\t\t\tobject: object,\n\t\t\t\tgeometry: geometry,\n\t\t\t\tmaterial: material,\n\t\t\t\tgroupOrder: groupOrder,\n\t\t\t\trenderOrder: object.renderOrder,\n\t\t\t\tz: z,\n\t\t\t\tgroup: group\n\t\t\t};\n\n\t\t\trenderItems[ renderItemsIndex ] = renderItem;\n\n\t\t} else {\n\n\t\t\trenderItem.id = object.id;\n\t\t\trenderItem.object = object;\n\t\t\trenderItem.geometry = geometry;\n\t\t\trenderItem.material = material;\n\t\t\trenderItem.groupOrder = groupOrder;\n\t\t\trenderItem.renderOrder = object.renderOrder;\n\t\t\trenderItem.z = z;\n\t\t\trenderItem.group = group;\n\n\t\t}\n\n\t\trenderItemsIndex ++;\n\n\t\treturn renderItem;\n\n\t}\n\n\tfunction push( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.push( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.push( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.push( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction unshift( object, geometry, material, groupOrder, z, group ) {\n\n\t\tconst renderItem = getNextRenderItem( object, geometry, material, groupOrder, z, group );\n\n\t\tif ( material.transmission > 0.0 ) {\n\n\t\t\ttransmissive.unshift( renderItem );\n\n\t\t} else if ( material.transparent === true ) {\n\n\t\t\ttransparent.unshift( renderItem );\n\n\t\t} else {\n\n\t\t\topaque.unshift( renderItem );\n\n\t\t}\n\n\t}\n\n\tfunction sort( customOpaqueSort, customTransparentSort ) {\n\n\t\tif ( opaque.length > 1 ) opaque.sort( customOpaqueSort || painterSortStable );\n\t\tif ( transmissive.length > 1 ) transmissive.sort( customTransparentSort || reversePainterSortStable );\n\t\tif ( transparent.length > 1 ) transparent.sort( customTransparentSort || reversePainterSortStable );\n\n\t}\n\n\tfunction finish() {\n\n\t\t// Clear references from inactive renderItems in the list\n\n\t\tfor ( let i = renderItemsIndex, il = renderItems.length; i < il; i ++ ) {\n\n\t\t\tconst renderItem = renderItems[ i ];\n\n\t\t\tif ( renderItem.id === null ) break;\n\n\t\t\trenderItem.id = null;\n\t\t\trenderItem.object = null;\n\t\t\trenderItem.geometry = null;\n\t\t\trenderItem.material = null;\n\t\t\trenderItem.group = null;\n\n\t\t}\n\n\t}\n\n\treturn {\n\n\t\topaque: opaque,\n\t\ttransmissive: transmissive,\n\t\ttransparent: transparent,\n\n\t\tinit: init,\n\t\tpush: push,\n\t\tunshift: unshift,\n\t\tfinish: finish,\n\n\t\tsort: sort\n\t};\n\n}\n\nfunction WebGLRenderLists() {\n\n\tlet lists = new WeakMap();\n\n\tfunction get( scene, renderCallDepth ) {\n\n\t\tconst listArray = lists.get( scene );\n\t\tlet list;\n\n\t\tif ( listArray === undefined ) {\n\n\t\t\tlist = new WebGLRenderList();\n\t\t\tlists.set( scene, [ list ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= listArray.length ) {\n\n\t\t\t\tlist = new WebGLRenderList();\n\t\t\t\tlistArray.push( list );\n\n\t\t\t} else {\n\n\t\t\t\tlist = listArray[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn list;\n\n\t}\n\n\tfunction dispose() {\n\n\t\tlists = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nfunction UniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tconeCos: 0,\n\t\t\t\t\t\tpenumbraCos: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tdistance: 0,\n\t\t\t\t\t\tdecay: 0\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'HemisphereLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tdirection: new Vector3(),\n\t\t\t\t\t\tskyColor: new Color(),\n\t\t\t\t\t\tgroundColor: new Color()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RectAreaLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tcolor: new Color(),\n\t\t\t\t\t\tposition: new Vector3(),\n\t\t\t\t\t\thalfWidth: new Vector3(),\n\t\t\t\t\t\thalfHeight: new Vector3()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\nfunction ShadowUniformsCache() {\n\n\tconst lights = {};\n\n\treturn {\n\n\t\tget: function ( light ) {\n\n\t\t\tif ( lights[ light.id ] !== undefined ) {\n\n\t\t\t\treturn lights[ light.id ];\n\n\t\t\t}\n\n\t\t\tlet uniforms;\n\n\t\t\tswitch ( light.type ) {\n\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowIntensity: 1,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpotLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowIntensity: 1,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2()\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointLight':\n\t\t\t\t\tuniforms = {\n\t\t\t\t\t\tshadowIntensity: 1,\n\t\t\t\t\t\tshadowBias: 0,\n\t\t\t\t\t\tshadowNormalBias: 0,\n\t\t\t\t\t\tshadowRadius: 1,\n\t\t\t\t\t\tshadowMapSize: new Vector2(),\n\t\t\t\t\t\tshadowCameraNear: 1,\n\t\t\t\t\t\tshadowCameraFar: 1000\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\n\t\t\t\t// TODO (abelnation): set RectAreaLight shadow uniforms\n\n\t\t\t}\n\n\t\t\tlights[ light.id ] = uniforms;\n\n\t\t\treturn uniforms;\n\n\t\t}\n\n\t};\n\n}\n\n\n\nlet nextVersion = 0;\n\nfunction shadowCastingAndTexturingLightsFirst( lightA, lightB ) {\n\n\treturn ( lightB.castShadow ? 2 : 0 ) - ( lightA.castShadow ? 2 : 0 ) + ( lightB.map ? 1 : 0 ) - ( lightA.map ? 1 : 0 );\n\n}\n\nfunction WebGLLights( extensions ) {\n\n\tconst cache = new UniformsCache();\n\n\tconst shadowCache = ShadowUniformsCache();\n\n\tconst state = {\n\n\t\tversion: 0,\n\n\t\thash: {\n\t\t\tdirectionalLength: -1,\n\t\t\tpointLength: -1,\n\t\t\tspotLength: -1,\n\t\t\trectAreaLength: -1,\n\t\t\themiLength: -1,\n\n\t\t\tnumDirectionalShadows: -1,\n\t\t\tnumPointShadows: -1,\n\t\t\tnumSpotShadows: -1,\n\t\t\tnumSpotMaps: -1,\n\n\t\t\tnumLightProbes: -1\n\t\t},\n\n\t\tambient: [ 0, 0, 0 ],\n\t\tprobe: [],\n\t\tdirectional: [],\n\t\tdirectionalShadow: [],\n\t\tdirectionalShadowMap: [],\n\t\tdirectionalShadowMatrix: [],\n\t\tspot: [],\n\t\tspotLightMap: [],\n\t\tspotShadow: [],\n\t\tspotShadowMap: [],\n\t\tspotLightMatrix: [],\n\t\trectArea: [],\n\t\trectAreaLTC1: null,\n\t\trectAreaLTC2: null,\n\t\tpoint: [],\n\t\tpointShadow: [],\n\t\tpointShadowMap: [],\n\t\tpointShadowMatrix: [],\n\t\themi: [],\n\t\tnumSpotLightShadowsWithMaps: 0,\n\t\tnumLightProbes: 0\n\n\t};\n\n\tfor ( let i = 0; i < 9; i ++ ) state.probe.push( new Vector3() );\n\n\tconst vector3 = new Vector3();\n\tconst matrix4 = new Matrix4();\n\tconst matrix42 = new Matrix4();\n\n\tfunction setup( lights ) {\n\n\t\tlet r = 0, g = 0, b = 0;\n\n\t\tfor ( let i = 0; i < 9; i ++ ) state.probe[ i ].set( 0, 0, 0 );\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tlet numDirectionalShadows = 0;\n\t\tlet numPointShadows = 0;\n\t\tlet numSpotShadows = 0;\n\t\tlet numSpotMaps = 0;\n\t\tlet numSpotShadowsWithMaps = 0;\n\n\t\tlet numLightProbes = 0;\n\n\t\t// ordering : [shadow casting + map texturing, map texturing, shadow casting, none ]\n\t\tlights.sort( shadowCastingAndTexturingLightsFirst );\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tconst color = light.color;\n\t\t\tconst intensity = light.intensity;\n\t\t\tconst distance = light.distance;\n\n\t\t\tlet shadowMap = null;\n\n\t\t\tif ( light.shadow && light.shadow.map ) {\n\n\t\t\t\tif ( light.shadow.map.texture.format === RGFormat ) {\n\n\t\t\t\t\t// VSM uses color texture with blurred mean/std_dev\n\t\t\t\t\tshadowMap = light.shadow.map.texture;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Other types use depth texture\n\t\t\t\t\tshadowMap = light.shadow.map.depthTexture || light.shadow.map.texture;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\tr += color.r * intensity;\n\t\t\t\tg += color.g * intensity;\n\t\t\t\tb += color.b * intensity;\n\n\t\t\t} else if ( light.isLightProbe ) {\n\n\t\t\t\tfor ( let j = 0; j < 9; j ++ ) {\n\n\t\t\t\t\tstate.probe[ j ].addScaledVector( light.sh.coefficients[ j ], intensity );\n\n\t\t\t\t}\n\n\t\t\t\tnumLightProbes ++;\n\n\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowIntensity = shadow.intensity;\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.directionalShadow[ directionalLength ] = shadowUniforms;\n\t\t\t\t\tstate.directionalShadowMap[ directionalLength ] = shadowMap;\n\t\t\t\t\tstate.directionalShadowMatrix[ directionalLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumDirectionalShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.directional[ directionalLength ] = uniforms;\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\t\t\t\tuniforms.distance = distance;\n\n\t\t\t\tuniforms.coneCos = Math.cos( light.angle );\n\t\t\t\tuniforms.penumbraCos = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tstate.spot[ spotLength ] = uniforms;\n\n\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\tif ( light.map ) {\n\n\t\t\t\t\tstate.spotLightMap[ numSpotMaps ] = light.map;\n\t\t\t\t\tnumSpotMaps ++;\n\n\t\t\t\t\t// make sure the lightMatrix is up to date\n\t\t\t\t\t// TODO : do it if required only\n\t\t\t\t\tshadow.updateMatrices( light );\n\n\t\t\t\t\tif ( light.castShadow ) numSpotShadowsWithMaps ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.spotLightMatrix[ spotLength ] = shadow.matrix;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowIntensity = shadow.intensity;\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\n\t\t\t\t\tstate.spotShadow[ spotLength ] = shadowUniforms;\n\t\t\t\t\tstate.spotShadowMap[ spotLength ] = shadowMap;\n\n\t\t\t\t\tnumSpotShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( color ).multiplyScalar( intensity );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tstate.rectArea[ rectAreaLength ] = uniforms;\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.color.copy( light.color ).multiplyScalar( light.intensity );\n\t\t\t\tuniforms.distance = light.distance;\n\t\t\t\tuniforms.decay = light.decay;\n\n\t\t\t\tif ( light.castShadow ) {\n\n\t\t\t\t\tconst shadow = light.shadow;\n\n\t\t\t\t\tconst shadowUniforms = shadowCache.get( light );\n\n\t\t\t\t\tshadowUniforms.shadowIntensity = shadow.intensity;\n\t\t\t\t\tshadowUniforms.shadowBias = shadow.bias;\n\t\t\t\t\tshadowUniforms.shadowNormalBias = shadow.normalBias;\n\t\t\t\t\tshadowUniforms.shadowRadius = shadow.radius;\n\t\t\t\t\tshadowUniforms.shadowMapSize = shadow.mapSize;\n\t\t\t\t\tshadowUniforms.shadowCameraNear = shadow.camera.near;\n\t\t\t\t\tshadowUniforms.shadowCameraFar = shadow.camera.far;\n\n\t\t\t\t\tstate.pointShadow[ pointLength ] = shadowUniforms;\n\t\t\t\t\tstate.pointShadowMap[ pointLength ] = shadowMap;\n\t\t\t\t\tstate.pointShadowMatrix[ pointLength ] = light.shadow.matrix;\n\n\t\t\t\t\tnumPointShadows ++;\n\n\t\t\t\t}\n\n\t\t\t\tstate.point[ pointLength ] = uniforms;\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = cache.get( light );\n\n\t\t\t\tuniforms.skyColor.copy( light.color ).multiplyScalar( intensity );\n\t\t\t\tuniforms.groundColor.copy( light.groundColor ).multiplyScalar( intensity );\n\n\t\t\t\tstate.hemi[ hemiLength ] = uniforms;\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( rectAreaLength > 0 ) {\n\n\t\t\tif ( extensions.has( 'OES_texture_float_linear' ) === true ) {\n\n\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_FLOAT_1;\n\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_FLOAT_2;\n\n\t\t\t} else {\n\n\t\t\t\tstate.rectAreaLTC1 = UniformsLib.LTC_HALF_1;\n\t\t\t\tstate.rectAreaLTC2 = UniformsLib.LTC_HALF_2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.ambient[ 0 ] = r;\n\t\tstate.ambient[ 1 ] = g;\n\t\tstate.ambient[ 2 ] = b;\n\n\t\tconst hash = state.hash;\n\n\t\tif ( hash.directionalLength !== directionalLength ||\n\t\t\thash.pointLength !== pointLength ||\n\t\t\thash.spotLength !== spotLength ||\n\t\t\thash.rectAreaLength !== rectAreaLength ||\n\t\t\thash.hemiLength !== hemiLength ||\n\t\t\thash.numDirectionalShadows !== numDirectionalShadows ||\n\t\t\thash.numPointShadows !== numPointShadows ||\n\t\t\thash.numSpotShadows !== numSpotShadows ||\n\t\t\thash.numSpotMaps !== numSpotMaps ||\n\t\t\thash.numLightProbes !== numLightProbes ) {\n\n\t\t\tstate.directional.length = directionalLength;\n\t\t\tstate.spot.length = spotLength;\n\t\t\tstate.rectArea.length = rectAreaLength;\n\t\t\tstate.point.length = pointLength;\n\t\t\tstate.hemi.length = hemiLength;\n\n\t\t\tstate.directionalShadow.length = numDirectionalShadows;\n\t\t\tstate.directionalShadowMap.length = numDirectionalShadows;\n\t\t\tstate.pointShadow.length = numPointShadows;\n\t\t\tstate.pointShadowMap.length = numPointShadows;\n\t\t\tstate.spotShadow.length = numSpotShadows;\n\t\t\tstate.spotShadowMap.length = numSpotShadows;\n\t\t\tstate.directionalShadowMatrix.length = numDirectionalShadows;\n\t\t\tstate.pointShadowMatrix.length = numPointShadows;\n\t\t\tstate.spotLightMatrix.length = numSpotShadows + numSpotMaps - numSpotShadowsWithMaps;\n\t\t\tstate.spotLightMap.length = numSpotMaps;\n\t\t\tstate.numSpotLightShadowsWithMaps = numSpotShadowsWithMaps;\n\t\t\tstate.numLightProbes = numLightProbes;\n\n\t\t\thash.directionalLength = directionalLength;\n\t\t\thash.pointLength = pointLength;\n\t\t\thash.spotLength = spotLength;\n\t\t\thash.rectAreaLength = rectAreaLength;\n\t\t\thash.hemiLength = hemiLength;\n\n\t\t\thash.numDirectionalShadows = numDirectionalShadows;\n\t\t\thash.numPointShadows = numPointShadows;\n\t\t\thash.numSpotShadows = numSpotShadows;\n\t\t\thash.numSpotMaps = numSpotMaps;\n\n\t\t\thash.numLightProbes = numLightProbes;\n\n\t\t\tstate.version = nextVersion ++;\n\n\t\t}\n\n\t}\n\n\tfunction setupView( lights, camera ) {\n\n\t\tlet directionalLength = 0;\n\t\tlet pointLength = 0;\n\t\tlet spotLength = 0;\n\t\tlet rectAreaLength = 0;\n\t\tlet hemiLength = 0;\n\n\t\tconst viewMatrix = camera.matrixWorldInverse;\n\n\t\tfor ( let i = 0, l = lights.length; i < l; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\tif ( light.isDirectionalLight ) {\n\n\t\t\t\tconst uniforms = state.directional[ directionalLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tdirectionalLength ++;\n\n\t\t\t} else if ( light.isSpotLight ) {\n\n\t\t\t\tconst uniforms = state.spot[ spotLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tvector3.setFromMatrixPosition( light.target.matrixWorld );\n\t\t\t\tuniforms.direction.sub( vector3 );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\tspotLength ++;\n\n\t\t\t} else if ( light.isRectAreaLight ) {\n\n\t\t\t\tconst uniforms = state.rectArea[ rectAreaLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\t// extract local rotation of light to derive width/height half vectors\n\t\t\t\tmatrix42.identity();\n\t\t\t\tmatrix4.copy( light.matrixWorld );\n\t\t\t\tmatrix4.premultiply( viewMatrix );\n\t\t\t\tmatrix42.extractRotation( matrix4 );\n\n\t\t\t\tuniforms.halfWidth.set( light.width * 0.5, 0.0, 0.0 );\n\t\t\t\tuniforms.halfHeight.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\t\t\tuniforms.halfWidth.applyMatrix4( matrix42 );\n\t\t\t\tuniforms.halfHeight.applyMatrix4( matrix42 );\n\n\t\t\t\trectAreaLength ++;\n\n\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\tconst uniforms = state.point[ pointLength ];\n\n\t\t\t\tuniforms.position.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.position.applyMatrix4( viewMatrix );\n\n\t\t\t\tpointLength ++;\n\n\t\t\t} else if ( light.isHemisphereLight ) {\n\n\t\t\t\tconst uniforms = state.hemi[ hemiLength ];\n\n\t\t\t\tuniforms.direction.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\tuniforms.direction.transformDirection( viewMatrix );\n\n\t\t\t\themiLength ++;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn {\n\t\tsetup: setup,\n\t\tsetupView: setupView,\n\t\tstate: state\n\t};\n\n}\n\nfunction WebGLRenderState( extensions ) {\n\n\tconst lights = new WebGLLights( extensions );\n\n\tconst lightsArray = [];\n\tconst shadowsArray = [];\n\n\tfunction init( camera ) {\n\n\t\tstate.camera = camera;\n\n\t\tlightsArray.length = 0;\n\t\tshadowsArray.length = 0;\n\n\t}\n\n\tfunction pushLight( light ) {\n\n\t\tlightsArray.push( light );\n\n\t}\n\n\tfunction pushShadow( shadowLight ) {\n\n\t\tshadowsArray.push( shadowLight );\n\n\t}\n\n\tfunction setupLights() {\n\n\t\tlights.setup( lightsArray );\n\n\t}\n\n\tfunction setupLightsView( camera ) {\n\n\t\tlights.setupView( lightsArray, camera );\n\n\t}\n\n\tconst state = {\n\t\tlightsArray: lightsArray,\n\t\tshadowsArray: shadowsArray,\n\n\t\tcamera: null,\n\n\t\tlights: lights,\n\n\t\ttransmissionRenderTarget: {}\n\t};\n\n\treturn {\n\t\tinit: init,\n\t\tstate: state,\n\t\tsetupLights: setupLights,\n\t\tsetupLightsView: setupLightsView,\n\n\t\tpushLight: pushLight,\n\t\tpushShadow: pushShadow\n\t};\n\n}\n\nfunction WebGLRenderStates( extensions ) {\n\n\tlet renderStates = new WeakMap();\n\n\tfunction get( scene, renderCallDepth = 0 ) {\n\n\t\tconst renderStateArray = renderStates.get( scene );\n\t\tlet renderState;\n\n\t\tif ( renderStateArray === undefined ) {\n\n\t\t\trenderState = new WebGLRenderState( extensions );\n\t\t\trenderStates.set( scene, [ renderState ] );\n\n\t\t} else {\n\n\t\t\tif ( renderCallDepth >= renderStateArray.length ) {\n\n\t\t\t\trenderState = new WebGLRenderState( extensions );\n\t\t\t\trenderStateArray.push( renderState );\n\n\t\t\t} else {\n\n\t\t\t\trenderState = renderStateArray[ renderCallDepth ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn renderState;\n\n\t}\n\n\tfunction dispose() {\n\n\t\trenderStates = new WeakMap();\n\n\t}\n\n\treturn {\n\t\tget: get,\n\t\tdispose: dispose\n\t};\n\n}\n\nconst vertex = \"void main() {\\n\\tgl_Position = vec4( position, 1.0 );\\n}\";\n\nconst fragment = \"uniform sampler2D shadow_pass;\\nuniform vec2 resolution;\\nuniform float radius;\\nvoid main() {\\n\\tconst float samples = float( VSM_SAMPLES );\\n\\tfloat mean = 0.0;\\n\\tfloat squared_mean = 0.0;\\n\\tfloat uvStride = samples <= 1.0 ? 0.0 : 2.0 / ( samples - 1.0 );\\n\\tfloat uvStart = samples <= 1.0 ? 0.0 : - 1.0;\\n\\tfor ( float i = 0.0; i < samples; i ++ ) {\\n\\t\\tfloat uvOffset = uvStart + i * uvStride;\\n\\t\\t#ifdef HORIZONTAL_PASS\\n\\t\\t\\tvec2 distribution = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( uvOffset, 0.0 ) * radius ) / resolution ).rg;\\n\\t\\t\\tmean += distribution.x;\\n\\t\\t\\tsquared_mean += distribution.y * distribution.y + distribution.x * distribution.x;\\n\\t\\t#else\\n\\t\\t\\tfloat depth = texture2D( shadow_pass, ( gl_FragCoord.xy + vec2( 0.0, uvOffset ) * radius ) / resolution ).r;\\n\\t\\t\\tmean += depth;\\n\\t\\t\\tsquared_mean += depth * depth;\\n\\t\\t#endif\\n\\t}\\n\\tmean = mean / samples;\\n\\tsquared_mean = squared_mean / samples;\\n\\tfloat std_dev = sqrt( max( 0.0, squared_mean - mean * mean ) );\\n\\tgl_FragColor = vec4( mean, std_dev, 0.0, 1.0 );\\n}\";\n\nconst _cubeDirections = [\n\t/*@__PURE__*/ new Vector3( 1, 0, 0 ), /*@__PURE__*/ new Vector3( -1, 0, 0 ), /*@__PURE__*/ new Vector3( 0, 1, 0 ),\n\t/*@__PURE__*/ new Vector3( 0, -1, 0 ), /*@__PURE__*/ new Vector3( 0, 0, 1 ), /*@__PURE__*/ new Vector3( 0, 0, -1 )\n];\n\nconst _cubeUps = [\n\t/*@__PURE__*/ new Vector3( 0, -1, 0 ), /*@__PURE__*/ new Vector3( 0, -1, 0 ), /*@__PURE__*/ new Vector3( 0, 0, 1 ),\n\t/*@__PURE__*/ new Vector3( 0, 0, -1 ), /*@__PURE__*/ new Vector3( 0, -1, 0 ), /*@__PURE__*/ new Vector3( 0, -1, 0 )\n];\n\nconst _projScreenMatrix = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld = /*@__PURE__*/ new Vector3();\nconst _lookTarget = /*@__PURE__*/ new Vector3();\n\nfunction WebGLShadowMap( renderer, objects, capabilities ) {\n\n\tlet _frustum = new Frustum();\n\n\tconst _shadowMapSize = new Vector2(),\n\t\t_viewportSize = new Vector2(),\n\n\t\t_viewport = new Vector4(),\n\n\t\t_depthMaterial = new MeshDepthMaterial(),\n\t\t_distanceMaterial = new MeshDistanceMaterial(),\n\n\t\t_materialCache = {},\n\n\t\t_maxTextureSize = capabilities.maxTextureSize;\n\n\tconst shadowSide = { [ FrontSide ]: BackSide, [ BackSide ]: FrontSide, [ DoubleSide ]: DoubleSide };\n\n\tconst shadowMaterialVertical = new ShaderMaterial( {\n\t\tdefines: {\n\t\t\tVSM_SAMPLES: 8\n\t\t},\n\t\tuniforms: {\n\t\t\tshadow_pass: { value: null },\n\t\t\tresolution: { value: new Vector2() },\n\t\t\tradius: { value: 4.0 }\n\t\t},\n\n\t\tvertexShader: vertex,\n\t\tfragmentShader: fragment\n\n\t} );\n\n\tconst shadowMaterialHorizontal = shadowMaterialVertical.clone();\n\tshadowMaterialHorizontal.defines.HORIZONTAL_PASS = 1;\n\n\tconst fullScreenTri = new BufferGeometry();\n\tfullScreenTri.setAttribute(\n\t\t'position',\n\t\tnew BufferAttribute(\n\t\t\tnew Float32Array( [ -1, -1, 0.5, 3, -1, 0.5, -1, 3, 0.5 ] ),\n\t\t\t3\n\t\t)\n\t);\n\n\tconst fullScreenMesh = new Mesh( fullScreenTri, shadowMaterialVertical );\n\n\tconst scope = this;\n\n\tthis.enabled = false;\n\n\tthis.autoUpdate = true;\n\tthis.needsUpdate = false;\n\n\tthis.type = PCFShadowMap;\n\tlet _previousType = this.type;\n\n\tthis.render = function ( lights, scene, camera ) {\n\n\t\tif ( scope.enabled === false ) return;\n\t\tif ( scope.autoUpdate === false && scope.needsUpdate === false ) return;\n\n\t\tif ( lights.length === 0 ) return;\n\n\t\tif ( lights.type === PCFSoftShadowMap ) {\n\n\t\t\twarn( 'WebGLShadowMap: PCFSoftShadowMap has been deprecated. Using PCFShadowMap instead.' );\n\t\t\tlights.type = PCFShadowMap;\n\n\t\t}\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst activeCubeFace = renderer.getActiveCubeFace();\n\t\tconst activeMipmapLevel = renderer.getActiveMipmapLevel();\n\n\t\tconst _state = renderer.state;\n\n\t\t// Set GL state for depth map.\n\t\t_state.setBlending( NoBlending );\n\n\t\tif ( _state.buffers.depth.getReversed() === true ) {\n\n\t\t\t_state.buffers.color.setClear( 0, 0, 0, 0 );\n\n\t\t} else {\n\n\t\t\t_state.buffers.color.setClear( 1, 1, 1, 1 );\n\n\t\t}\n\n\t\t_state.buffers.depth.setTest( true );\n\t\t_state.setScissorTest( false );\n\n\t\t// check for shadow map type changes\n\n\t\tconst typeChanged = _previousType !== this.type;\n\n\t\t// When shadow map type changes, materials need recompilation because sampler types change\n\t\t// (sampler2DShadow for PCF vs sampler2D for Basic)\n\t\tif ( typeChanged ) {\n\n\t\t\tscene.traverse( function ( object ) {\n\n\t\t\t\tif ( object.material ) {\n\n\t\t\t\t\tif ( Array.isArray( object.material ) ) {\n\n\t\t\t\t\t\tobject.material.forEach( mat => mat.needsUpdate = true );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tobject.material.needsUpdate = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t}\n\n\t\t// render depth map\n\n\t\tfor ( let i = 0, il = lights.length; i < il; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\t\t\tconst shadow = light.shadow;\n\n\t\t\tif ( shadow === undefined ) {\n\n\t\t\t\twarn( 'WebGLShadowMap:', light, 'has no shadow.' );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( shadow.autoUpdate === false && shadow.needsUpdate === false ) continue;\n\n\t\t\t_shadowMapSize.copy( shadow.mapSize );\n\n\t\t\tconst shadowFrameExtents = shadow.getFrameExtents();\n\n\t\t\t_shadowMapSize.multiply( shadowFrameExtents );\n\n\t\t\t_viewportSize.copy( shadow.mapSize );\n\n\t\t\tif ( _shadowMapSize.x > _maxTextureSize || _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\tif ( _shadowMapSize.x > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.x = Math.floor( _maxTextureSize / shadowFrameExtents.x );\n\t\t\t\t\t_shadowMapSize.x = _viewportSize.x * shadowFrameExtents.x;\n\t\t\t\t\tshadow.mapSize.x = _viewportSize.x;\n\n\t\t\t\t}\n\n\t\t\t\tif ( _shadowMapSize.y > _maxTextureSize ) {\n\n\t\t\t\t\t_viewportSize.y = Math.floor( _maxTextureSize / shadowFrameExtents.y );\n\t\t\t\t\t_shadowMapSize.y = _viewportSize.y * shadowFrameExtents.y;\n\t\t\t\t\tshadow.mapSize.y = _viewportSize.y;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( shadow.map === null || typeChanged === true ) {\n\n\t\t\t\tif ( shadow.map !== null ) {\n\n\t\t\t\t\tif ( shadow.map.depthTexture !== null ) {\n\n\t\t\t\t\t\tshadow.map.depthTexture.dispose();\n\t\t\t\t\t\tshadow.map.depthTexture = null;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tshadow.map.dispose();\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.type === VSMShadowMap ) {\n\n\t\t\t\t\tif ( light.isPointLight ) {\n\n\t\t\t\t\t\twarn( 'WebGLShadowMap: VSM shadow maps are not supported for PointLights. Use PCF or BasicShadowMap instead.' );\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, {\n\t\t\t\t\t\tformat: RGFormat,\n\t\t\t\t\t\ttype: HalfFloatType,\n\t\t\t\t\t\tminFilter: LinearFilter,\n\t\t\t\t\t\tmagFilter: LinearFilter,\n\t\t\t\t\t\tgenerateMipmaps: false\n\t\t\t\t\t} );\n\t\t\t\t\tshadow.map.texture.name = light.name + '.shadowMap';\n\n\t\t\t\t\t// Native depth texture for VSM - depth is captured here, then blurred into the color texture\n\t\t\t\t\tshadow.map.depthTexture = new DepthTexture( _shadowMapSize.x, _shadowMapSize.y, FloatType );\n\t\t\t\t\tshadow.map.depthTexture.name = light.name + '.shadowMapDepth';\n\t\t\t\t\tshadow.map.depthTexture.format = DepthFormat;\n\t\t\t\t\tshadow.map.depthTexture.compareFunction = null; // For regular sampling (not shadow comparison)\n\t\t\t\t\tshadow.map.depthTexture.minFilter = NearestFilter;\n\t\t\t\t\tshadow.map.depthTexture.magFilter = NearestFilter;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( light.isPointLight ) {\n\n\t\t\t\t\t\tshadow.map = new WebGLCubeRenderTarget( _shadowMapSize.x );\n\t\t\t\t\t\tshadow.map.depthTexture = new CubeDepthTexture( _shadowMapSize.x, UnsignedIntType );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tshadow.map = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y );\n\t\t\t\t\t\tshadow.map.depthTexture = new DepthTexture( _shadowMapSize.x, _shadowMapSize.y, UnsignedIntType );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tshadow.map.depthTexture.name = light.name + '.shadowMap';\n\t\t\t\t\tshadow.map.depthTexture.format = DepthFormat;\n\n\t\t\t\t\tconst reversedDepthBuffer = renderer.state.buffers.depth.getReversed();\n\n\t\t\t\t\tif ( this.type === PCFShadowMap ) {\n\n\t\t\t\t\t\tshadow.map.depthTexture.compareFunction = reversedDepthBuffer ? GreaterEqualCompare : LessEqualCompare;\n\t\t\t\t\t\tshadow.map.depthTexture.minFilter = LinearFilter;\n\t\t\t\t\t\tshadow.map.depthTexture.magFilter = LinearFilter;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tshadow.map.depthTexture.compareFunction = null;\n\t\t\t\t\t\tshadow.map.depthTexture.minFilter = NearestFilter;\n\t\t\t\t\t\tshadow.map.depthTexture.magFilter = NearestFilter;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tshadow.camera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\t// For cube render targets (PointLights), render all 6 faces. Otherwise, render once.\n\t\t\tconst faceCount = shadow.map.isWebGLCubeRenderTarget ? 6 : 1;\n\n\t\t\tfor ( let face = 0; face < faceCount; face ++ ) {\n\n\t\t\t\t// For cube render targets, render to each face separately\n\t\t\t\tif ( shadow.map.isWebGLCubeRenderTarget ) {\n\n\t\t\t\t\trenderer.setRenderTarget( shadow.map, face );\n\t\t\t\t\trenderer.clear();\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// For 2D render targets, use viewports\n\t\t\t\t\tif ( face === 0 ) {\n\n\t\t\t\t\t\trenderer.setRenderTarget( shadow.map );\n\t\t\t\t\t\trenderer.clear();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst viewport = shadow.getViewport( face );\n\n\t\t\t\t\t_viewport.set(\n\t\t\t\t\t\t_viewportSize.x * viewport.x,\n\t\t\t\t\t\t_viewportSize.y * viewport.y,\n\t\t\t\t\t\t_viewportSize.x * viewport.z,\n\t\t\t\t\t\t_viewportSize.y * viewport.w\n\t\t\t\t\t);\n\n\t\t\t\t\t_state.viewport( _viewport );\n\n\t\t\t\t}\n\n\t\t\t\tif ( light.isPointLight ) {\n\n\t\t\t\t\tconst camera = shadow.camera;\n\t\t\t\t\tconst shadowMatrix = shadow.matrix;\n\n\t\t\t\t\tconst far = light.distance || camera.far;\n\n\t\t\t\t\tif ( far !== camera.far ) {\n\n\t\t\t\t\t\tcamera.far = far;\n\t\t\t\t\t\tcamera.updateProjectionMatrix();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\t\t\t\tcamera.position.copy( _lightPositionWorld );\n\n\t\t\t\t\t_lookTarget.copy( camera.position );\n\t\t\t\t\t_lookTarget.add( _cubeDirections[ face ] );\n\t\t\t\t\tcamera.up.copy( _cubeUps[ face ] );\n\t\t\t\t\tcamera.lookAt( _lookTarget );\n\t\t\t\t\tcamera.updateMatrixWorld();\n\n\t\t\t\t\tshadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );\n\n\t\t\t\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t\t\t\tshadow._frustum.setFromProjectionMatrix( _projScreenMatrix, camera.coordinateSystem, camera.reversedDepth );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tshadow.updateMatrices( light );\n\n\t\t\t\t}\n\n\t\t\t\t_frustum = shadow.getFrustum();\n\n\t\t\t\trenderObject( scene, camera, shadow.camera, light, this.type );\n\n\t\t\t}\n\n\t\t\t// do blur pass for VSM\n\n\t\t\tif ( shadow.isPointLightShadow !== true && this.type === VSMShadowMap ) {\n\n\t\t\t\tVSMPass( shadow, camera );\n\n\t\t\t}\n\n\t\t\tshadow.needsUpdate = false;\n\n\t\t}\n\n\t\t_previousType = this.type;\n\n\t\tscope.needsUpdate = false;\n\n\t\trenderer.setRenderTarget( currentRenderTarget, activeCubeFace, activeMipmapLevel );\n\n\t};\n\n\tfunction VSMPass( shadow, camera ) {\n\n\t\tconst geometry = objects.update( fullScreenMesh );\n\n\t\tif ( shadowMaterialVertical.defines.VSM_SAMPLES !== shadow.blurSamples ) {\n\n\t\t\tshadowMaterialVertical.defines.VSM_SAMPLES = shadow.blurSamples;\n\t\t\tshadowMaterialHorizontal.defines.VSM_SAMPLES = shadow.blurSamples;\n\n\t\t\tshadowMaterialVertical.needsUpdate = true;\n\t\t\tshadowMaterialHorizontal.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( shadow.mapPass === null ) {\n\n\t\t\tshadow.mapPass = new WebGLRenderTarget( _shadowMapSize.x, _shadowMapSize.y, {\n\t\t\t\tformat: RGFormat,\n\t\t\t\ttype: HalfFloatType\n\t\t\t} );\n\n\t\t}\n\n\t\t// vertical pass - read from native depth texture\n\n\t\tshadowMaterialVertical.uniforms.shadow_pass.value = shadow.map.depthTexture;\n\t\tshadowMaterialVertical.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialVertical.uniforms.radius.value = shadow.radius;\n\t\trenderer.setRenderTarget( shadow.mapPass );\n\t\trenderer.clear();\n\t\trenderer.renderBufferDirect( camera, null, geometry, shadowMaterialVertical, fullScreenMesh, null );\n\n\t\t// horizontal pass\n\n\t\tshadowMaterialHorizontal.uniforms.shadow_pass.value = shadow.mapPass.texture;\n\t\tshadowMaterialHorizontal.uniforms.resolution.value = shadow.mapSize;\n\t\tshadowMaterialHorizontal.uniforms.radius.value = shadow.radius;\n\t\trenderer.setRenderTarget( shadow.map );\n\t\trenderer.clear();\n\t\trenderer.renderBufferDirect( camera, null, geometry, shadowMaterialHorizontal, fullScreenMesh, null );\n\n\t}\n\n\tfunction getDepthMaterial( object, material, light, type ) {\n\n\t\tlet result = null;\n\n\t\tconst customMaterial = ( light.isPointLight === true ) ? object.customDistanceMaterial : object.customDepthMaterial;\n\n\t\tif ( customMaterial !== undefined ) {\n\n\t\t\tresult = customMaterial;\n\n\t\t} else {\n\n\t\t\tresult = ( light.isPointLight === true ) ? _distanceMaterial : _depthMaterial;\n\n\t\t\tif ( ( renderer.localClippingEnabled && material.clipShadows === true && Array.isArray( material.clippingPlanes ) && material.clippingPlanes.length !== 0 ) ||\n\t\t\t\t( material.displacementMap && material.displacementScale !== 0 ) ||\n\t\t\t\t( material.alphaMap && material.alphaTest > 0 ) ||\n\t\t\t\t( material.map && material.alphaTest > 0 ) ||\n\t\t\t\t( material.alphaToCoverage === true ) ) {\n\n\t\t\t\t// in this case we need a unique material instance reflecting the\n\t\t\t\t// appropriate state\n\n\t\t\t\tconst keyA = result.uuid, keyB = material.uuid;\n\n\t\t\t\tlet materialsForVariant = _materialCache[ keyA ];\n\n\t\t\t\tif ( materialsForVariant === undefined ) {\n\n\t\t\t\t\tmaterialsForVariant = {};\n\t\t\t\t\t_materialCache[ keyA ] = materialsForVariant;\n\n\t\t\t\t}\n\n\t\t\t\tlet cachedMaterial = materialsForVariant[ keyB ];\n\n\t\t\t\tif ( cachedMaterial === undefined ) {\n\n\t\t\t\t\tcachedMaterial = result.clone();\n\t\t\t\t\tmaterialsForVariant[ keyB ] = cachedMaterial;\n\t\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t\t}\n\n\t\t\t\tresult = cachedMaterial;\n\n\t\t\t}\n\n\t\t}\n\n\t\tresult.visible = material.visible;\n\t\tresult.wireframe = material.wireframe;\n\n\t\tif ( type === VSMShadowMap ) {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : material.side;\n\n\t\t} else {\n\n\t\t\tresult.side = ( material.shadowSide !== null ) ? material.shadowSide : shadowSide[ material.side ];\n\n\t\t}\n\n\t\tresult.alphaMap = material.alphaMap;\n\t\tresult.alphaTest = ( material.alphaToCoverage === true ) ? 0.5 : material.alphaTest; // approximate alphaToCoverage by using a fixed alphaTest value\n\t\tresult.map = material.map;\n\n\t\tresult.clipShadows = material.clipShadows;\n\t\tresult.clippingPlanes = material.clippingPlanes;\n\t\tresult.clipIntersection = material.clipIntersection;\n\n\t\tresult.displacementMap = material.displacementMap;\n\t\tresult.displacementScale = material.displacementScale;\n\t\tresult.displacementBias = material.displacementBias;\n\n\t\tresult.wireframeLinewidth = material.wireframeLinewidth;\n\t\tresult.linewidth = material.linewidth;\n\n\t\tif ( light.isPointLight === true && result.isMeshDistanceMaterial === true ) {\n\n\t\t\tconst materialProperties = renderer.properties.get( result );\n\t\t\tmaterialProperties.light = light;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tfunction renderObject( object, camera, shadowCamera, light, type ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tconst visible = object.layers.test( camera.layers );\n\n\t\tif ( visible && ( object.isMesh || object.isLine || object.isPoints ) ) {\n\n\t\t\tif ( ( object.castShadow || ( object.receiveShadow && type === VSMShadowMap ) ) && ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) ) {\n\n\t\t\t\tobject.modelViewMatrix.multiplyMatrices( shadowCamera.matrixWorldInverse, object.matrixWorld );\n\n\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\tfor ( let k = 0, kl = groups.length; k < kl; k ++ ) {\n\n\t\t\t\t\t\tconst group = groups[ k ];\n\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, groupMaterial, light, type );\n\n\t\t\t\t\t\t\tobject.onBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, group );\n\n\t\t\t\t\t\t\trenderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, group );\n\n\t\t\t\t\t\t\tobject.onAfterShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, group );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\tconst depthMaterial = getDepthMaterial( object, material, light, type );\n\n\t\t\t\t\tobject.onBeforeShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, null );\n\n\t\t\t\t\trenderer.renderBufferDirect( shadowCamera, null, geometry, depthMaterial, object, null );\n\n\t\t\t\t\tobject.onAfterShadow( renderer, object, camera, shadowCamera, geometry, depthMaterial, null );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\trenderObject( children[ i ], camera, shadowCamera, light, type );\n\n\t\t}\n\n\t}\n\n\tfunction onMaterialDispose( event ) {\n\n\t\tconst material = event.target;\n\n\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t// make sure to remove the unique distance/depth materials used for shadow map rendering\n\n\t\tfor ( const id in _materialCache ) {\n\n\t\t\tconst cache = _materialCache[ id ];\n\n\t\t\tconst uuid = event.target.uuid;\n\n\t\t\tif ( uuid in cache ) {\n\n\t\t\t\tconst shadowMaterial = cache[ uuid ];\n\t\t\t\tshadowMaterial.dispose();\n\t\t\t\tdelete cache[ uuid ];\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nconst reversedFuncs = {\n\t[ NeverDepth ]: AlwaysDepth,\n\t[ LessDepth ]: GreaterDepth,\n\t[ EqualDepth ]: NotEqualDepth,\n\t[ LessEqualDepth ]: GreaterEqualDepth,\n\n\t[ AlwaysDepth ]: NeverDepth,\n\t[ GreaterDepth ]: LessDepth,\n\t[ NotEqualDepth ]: EqualDepth,\n\t[ GreaterEqualDepth ]: LessEqualDepth,\n};\n\nfunction WebGLState( gl, extensions ) {\n\n\tfunction ColorBuffer() {\n\n\t\tlet locked = false;\n\n\t\tconst color = new Vector4();\n\t\tlet currentColorMask = null;\n\t\tconst currentColorClear = new Vector4( 0, 0, 0, 0 );\n\n\t\treturn {\n\n\t\t\tsetMask: function ( colorMask ) {\n\n\t\t\t\tif ( currentColorMask !== colorMask && ! locked ) {\n\n\t\t\t\t\tgl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\t\t\tcurrentColorMask = colorMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( r, g, b, a, premultipliedAlpha ) {\n\n\t\t\t\tif ( premultipliedAlpha === true ) {\n\n\t\t\t\t\tr *= a; g *= a; b *= a;\n\n\t\t\t\t}\n\n\t\t\t\tcolor.set( r, g, b, a );\n\n\t\t\t\tif ( currentColorClear.equals( color ) === false ) {\n\n\t\t\t\t\tgl.clearColor( r, g, b, a );\n\t\t\t\t\tcurrentColorClear.copy( color );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentColorMask = null;\n\t\t\t\tcurrentColorClear.set( -1, 0, 0, 0 ); // set to invalid state\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction DepthBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentReversed = false;\n\t\tlet currentDepthMask = null;\n\t\tlet currentDepthFunc = null;\n\t\tlet currentDepthClear = null;\n\n\t\treturn {\n\n\t\t\tsetReversed: function ( reversed ) {\n\n\t\t\t\tif ( currentReversed !== reversed ) {\n\n\t\t\t\t\tconst ext = extensions.get( 'EXT_clip_control' );\n\n\t\t\t\t\tif ( reversed ) {\n\n\t\t\t\t\t\text.clipControlEXT( ext.LOWER_LEFT_EXT, ext.ZERO_TO_ONE_EXT );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\text.clipControlEXT( ext.LOWER_LEFT_EXT, ext.NEGATIVE_ONE_TO_ONE_EXT );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentReversed = reversed;\n\n\t\t\t\t\tconst oldDepth = currentDepthClear;\n\t\t\t\t\tcurrentDepthClear = null;\n\t\t\t\t\tthis.setClear( oldDepth );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tgetReversed: function () {\n\n\t\t\t\treturn currentReversed;\n\n\t\t\t},\n\n\t\t\tsetTest: function ( depthTest ) {\n\n\t\t\t\tif ( depthTest ) {\n\n\t\t\t\t\tenable( gl.DEPTH_TEST );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdisable( gl.DEPTH_TEST );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( depthMask ) {\n\n\t\t\t\tif ( currentDepthMask !== depthMask && ! locked ) {\n\n\t\t\t\t\tgl.depthMask( depthMask );\n\t\t\t\t\tcurrentDepthMask = depthMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( depthFunc ) {\n\n\t\t\t\tif ( currentReversed ) depthFunc = reversedFuncs[ depthFunc ];\n\n\t\t\t\tif ( currentDepthFunc !== depthFunc ) {\n\n\t\t\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase LessDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrentDepthFunc = depthFunc;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( depth ) {\n\n\t\t\t\tif ( currentDepthClear !== depth ) {\n\n\t\t\t\t\tif ( currentReversed ) {\n\n\t\t\t\t\t\tdepth = 1 - depth;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgl.clearDepth( depth );\n\t\t\t\t\tcurrentDepthClear = depth;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentDepthMask = null;\n\t\t\t\tcurrentDepthFunc = null;\n\t\t\t\tcurrentDepthClear = null;\n\t\t\t\tcurrentReversed = false;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction StencilBuffer() {\n\n\t\tlet locked = false;\n\n\t\tlet currentStencilMask = null;\n\t\tlet currentStencilFunc = null;\n\t\tlet currentStencilRef = null;\n\t\tlet currentStencilFuncMask = null;\n\t\tlet currentStencilFail = null;\n\t\tlet currentStencilZFail = null;\n\t\tlet currentStencilZPass = null;\n\t\tlet currentStencilClear = null;\n\n\t\treturn {\n\n\t\t\tsetTest: function ( stencilTest ) {\n\n\t\t\t\tif ( ! locked ) {\n\n\t\t\t\t\tif ( stencilTest ) {\n\n\t\t\t\t\t\tenable( gl.STENCIL_TEST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdisable( gl.STENCIL_TEST );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetMask: function ( stencilMask ) {\n\n\t\t\t\tif ( currentStencilMask !== stencilMask && ! locked ) {\n\n\t\t\t\t\tgl.stencilMask( stencilMask );\n\t\t\t\t\tcurrentStencilMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetFunc: function ( stencilFunc, stencilRef, stencilMask ) {\n\n\t\t\t\tif ( currentStencilFunc !== stencilFunc ||\n\t\t\t\t     currentStencilRef !== stencilRef ||\n\t\t\t\t     currentStencilFuncMask !== stencilMask ) {\n\n\t\t\t\t\tgl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\t\t\tcurrentStencilFunc = stencilFunc;\n\t\t\t\t\tcurrentStencilRef = stencilRef;\n\t\t\t\t\tcurrentStencilFuncMask = stencilMask;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetOp: function ( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\t\t\tif ( currentStencilFail !== stencilFail ||\n\t\t\t\t     currentStencilZFail !== stencilZFail ||\n\t\t\t\t     currentStencilZPass !== stencilZPass ) {\n\n\t\t\t\t\tgl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\t\t\tcurrentStencilFail = stencilFail;\n\t\t\t\t\tcurrentStencilZFail = stencilZFail;\n\t\t\t\t\tcurrentStencilZPass = stencilZPass;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tsetLocked: function ( lock ) {\n\n\t\t\t\tlocked = lock;\n\n\t\t\t},\n\n\t\t\tsetClear: function ( stencil ) {\n\n\t\t\t\tif ( currentStencilClear !== stencil ) {\n\n\t\t\t\t\tgl.clearStencil( stencil );\n\t\t\t\t\tcurrentStencilClear = stencil;\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\treset: function () {\n\n\t\t\t\tlocked = false;\n\n\t\t\t\tcurrentStencilMask = null;\n\t\t\t\tcurrentStencilFunc = null;\n\t\t\t\tcurrentStencilRef = null;\n\t\t\t\tcurrentStencilFuncMask = null;\n\t\t\t\tcurrentStencilFail = null;\n\t\t\t\tcurrentStencilZFail = null;\n\t\t\t\tcurrentStencilZPass = null;\n\t\t\t\tcurrentStencilClear = null;\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\t//\n\n\tconst colorBuffer = new ColorBuffer();\n\tconst depthBuffer = new DepthBuffer();\n\tconst stencilBuffer = new StencilBuffer();\n\n\tconst uboBindings = new WeakMap();\n\tconst uboProgramMap = new WeakMap();\n\n\tlet enabledCapabilities = {};\n\n\tlet currentBoundFramebuffers = {};\n\tlet currentDrawbuffers = new WeakMap();\n\tlet defaultDrawbuffers = [];\n\n\tlet currentProgram = null;\n\n\tlet currentBlendingEnabled = false;\n\tlet currentBlending = null;\n\tlet currentBlendEquation = null;\n\tlet currentBlendSrc = null;\n\tlet currentBlendDst = null;\n\tlet currentBlendEquationAlpha = null;\n\tlet currentBlendSrcAlpha = null;\n\tlet currentBlendDstAlpha = null;\n\tlet currentBlendColor = new Color( 0, 0, 0 );\n\tlet currentBlendAlpha = 0;\n\tlet currentPremultipledAlpha = false;\n\n\tlet currentFlipSided = null;\n\tlet currentCullFace = null;\n\n\tlet currentLineWidth = null;\n\n\tlet currentPolygonOffsetFactor = null;\n\tlet currentPolygonOffsetUnits = null;\n\n\tconst maxTextures = gl.getParameter( gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS );\n\n\tlet lineWidthAvailable = false;\n\tlet version = 0;\n\tconst glVersion = gl.getParameter( gl.VERSION );\n\n\tif ( glVersion.indexOf( 'WebGL' ) !== -1 ) {\n\n\t\tversion = parseFloat( /^WebGL (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 1.0 );\n\n\t} else if ( glVersion.indexOf( 'OpenGL ES' ) !== -1 ) {\n\n\t\tversion = parseFloat( /^OpenGL ES (\\d)/.exec( glVersion )[ 1 ] );\n\t\tlineWidthAvailable = ( version >= 2.0 );\n\n\t}\n\n\tlet currentTextureSlot = null;\n\tlet currentBoundTextures = {};\n\n\tconst scissorParam = gl.getParameter( gl.SCISSOR_BOX );\n\tconst viewportParam = gl.getParameter( gl.VIEWPORT );\n\n\tconst currentScissor = new Vector4().fromArray( scissorParam );\n\tconst currentViewport = new Vector4().fromArray( viewportParam );\n\n\tfunction createTexture( type, target, count, dimensions ) {\n\n\t\tconst data = new Uint8Array( 4 ); // 4 is required to match default unpack alignment of 4.\n\t\tconst texture = gl.createTexture();\n\n\t\tgl.bindTexture( type, texture );\n\t\tgl.texParameteri( type, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\t\tgl.texParameteri( type, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tif ( type === gl.TEXTURE_3D || type === gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\tgl.texImage3D( target, 0, gl.RGBA, 1, 1, dimensions, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t} else {\n\n\t\t\t\tgl.texImage2D( target + i, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tconst emptyTextures = {};\n\temptyTextures[ gl.TEXTURE_2D ] = createTexture( gl.TEXTURE_2D, gl.TEXTURE_2D, 1 );\n\temptyTextures[ gl.TEXTURE_CUBE_MAP ] = createTexture( gl.TEXTURE_CUBE_MAP, gl.TEXTURE_CUBE_MAP_POSITIVE_X, 6 );\n\temptyTextures[ gl.TEXTURE_2D_ARRAY ] = createTexture( gl.TEXTURE_2D_ARRAY, gl.TEXTURE_2D_ARRAY, 1, 1 );\n\temptyTextures[ gl.TEXTURE_3D ] = createTexture( gl.TEXTURE_3D, gl.TEXTURE_3D, 1, 1 );\n\n\t// init\n\n\tcolorBuffer.setClear( 0, 0, 0, 1 );\n\tdepthBuffer.setClear( 1 );\n\tstencilBuffer.setClear( 0 );\n\n\tenable( gl.DEPTH_TEST );\n\tdepthBuffer.setFunc( LessEqualDepth );\n\n\tsetFlipSided( false );\n\tsetCullFace( CullFaceBack );\n\tenable( gl.CULL_FACE );\n\n\tsetBlending( NoBlending );\n\n\t//\n\n\tfunction enable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== true ) {\n\n\t\t\tgl.enable( id );\n\t\t\tenabledCapabilities[ id ] = true;\n\n\t\t}\n\n\t}\n\n\tfunction disable( id ) {\n\n\t\tif ( enabledCapabilities[ id ] !== false ) {\n\n\t\t\tgl.disable( id );\n\t\t\tenabledCapabilities[ id ] = false;\n\n\t\t}\n\n\t}\n\n\tfunction bindFramebuffer( target, framebuffer ) {\n\n\t\tif ( currentBoundFramebuffers[ target ] !== framebuffer ) {\n\n\t\t\tgl.bindFramebuffer( target, framebuffer );\n\n\t\t\tcurrentBoundFramebuffers[ target ] = framebuffer;\n\n\t\t\t// gl.DRAW_FRAMEBUFFER is equivalent to gl.FRAMEBUFFER\n\n\t\t\tif ( target === gl.DRAW_FRAMEBUFFER ) {\n\n\t\t\t\tcurrentBoundFramebuffers[ gl.FRAMEBUFFER ] = framebuffer;\n\n\t\t\t}\n\n\t\t\tif ( target === gl.FRAMEBUFFER ) {\n\n\t\t\t\tcurrentBoundFramebuffers[ gl.DRAW_FRAMEBUFFER ] = framebuffer;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction drawBuffers( renderTarget, framebuffer ) {\n\n\t\tlet drawBuffers = defaultDrawbuffers;\n\n\t\tlet needsUpdate = false;\n\n\t\tif ( renderTarget ) {\n\n\t\t\tdrawBuffers = currentDrawbuffers.get( framebuffer );\n\n\t\t\tif ( drawBuffers === undefined ) {\n\n\t\t\t\tdrawBuffers = [];\n\t\t\t\tcurrentDrawbuffers.set( framebuffer, drawBuffers );\n\n\t\t\t}\n\n\t\t\tconst textures = renderTarget.textures;\n\n\t\t\tif ( drawBuffers.length !== textures.length || drawBuffers[ 0 ] !== gl.COLOR_ATTACHMENT0 ) {\n\n\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\tdrawBuffers[ i ] = gl.COLOR_ATTACHMENT0 + i;\n\n\t\t\t\t}\n\n\t\t\t\tdrawBuffers.length = textures.length;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( drawBuffers[ 0 ] !== gl.BACK ) {\n\n\t\t\t\tdrawBuffers[ 0 ] = gl.BACK;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tgl.drawBuffers( drawBuffers );\n\n\t\t}\n\n\t}\n\n\tfunction useProgram( program ) {\n\n\t\tif ( currentProgram !== program ) {\n\n\t\t\tgl.useProgram( program );\n\n\t\t\tcurrentProgram = program;\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tconst equationToGL = {\n\t\t[ AddEquation ]: gl.FUNC_ADD,\n\t\t[ SubtractEquation ]: gl.FUNC_SUBTRACT,\n\t\t[ ReverseSubtractEquation ]: gl.FUNC_REVERSE_SUBTRACT\n\t};\n\n\tequationToGL[ MinEquation ] = gl.MIN;\n\tequationToGL[ MaxEquation ] = gl.MAX;\n\n\tconst factorToGL = {\n\t\t[ ZeroFactor ]: gl.ZERO,\n\t\t[ OneFactor ]: gl.ONE,\n\t\t[ SrcColorFactor ]: gl.SRC_COLOR,\n\t\t[ SrcAlphaFactor ]: gl.SRC_ALPHA,\n\t\t[ SrcAlphaSaturateFactor ]: gl.SRC_ALPHA_SATURATE,\n\t\t[ DstColorFactor ]: gl.DST_COLOR,\n\t\t[ DstAlphaFactor ]: gl.DST_ALPHA,\n\t\t[ OneMinusSrcColorFactor ]: gl.ONE_MINUS_SRC_COLOR,\n\t\t[ OneMinusSrcAlphaFactor ]: gl.ONE_MINUS_SRC_ALPHA,\n\t\t[ OneMinusDstColorFactor ]: gl.ONE_MINUS_DST_COLOR,\n\t\t[ OneMinusDstAlphaFactor ]: gl.ONE_MINUS_DST_ALPHA,\n\t\t[ ConstantColorFactor ]: gl.CONSTANT_COLOR,\n\t\t[ OneMinusConstantColorFactor ]: gl.ONE_MINUS_CONSTANT_COLOR,\n\t\t[ ConstantAlphaFactor ]: gl.CONSTANT_ALPHA,\n\t\t[ OneMinusConstantAlphaFactor ]: gl.ONE_MINUS_CONSTANT_ALPHA\n\t};\n\n\tfunction setBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, blendColor, blendAlpha, premultipliedAlpha ) {\n\n\t\tif ( blending === NoBlending ) {\n\n\t\t\tif ( currentBlendingEnabled === true ) {\n\n\t\t\t\tdisable( gl.BLEND );\n\t\t\t\tcurrentBlendingEnabled = false;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( currentBlendingEnabled === false ) {\n\n\t\t\tenable( gl.BLEND );\n\t\t\tcurrentBlendingEnabled = true;\n\n\t\t}\n\n\t\tif ( blending !== CustomBlending ) {\n\n\t\t\tif ( blending !== currentBlending || premultipliedAlpha !== currentPremultipledAlpha ) {\n\n\t\t\t\tif ( currentBlendEquation !== AddEquation || currentBlendEquationAlpha !== AddEquation ) {\n\n\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\n\t\t\t\t\tcurrentBlendEquation = AddEquation;\n\t\t\t\t\tcurrentBlendEquationAlpha = AddEquation;\n\n\t\t\t\t}\n\n\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( gl.ONE, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.DST_COLOR, gl.ONE_MINUS_SRC_ALPHA, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\terror( 'WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE, gl.ONE, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\terror( 'WebGLState: SubtractiveBlending requires material.premultipliedAlpha = true' );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\terror( 'WebGLState: MultiplyBlending requires material.premultipliedAlpha = true' );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\terror( 'WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrentBlendSrc = null;\n\t\t\t\tcurrentBlendDst = null;\n\t\t\t\tcurrentBlendSrcAlpha = null;\n\t\t\t\tcurrentBlendDstAlpha = null;\n\t\t\t\tcurrentBlendColor.set( 0, 0, 0 );\n\t\t\t\tcurrentBlendAlpha = 0;\n\n\t\t\t\tcurrentBlending = blending;\n\t\t\t\tcurrentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// custom blending\n\n\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\tif ( blendEquation !== currentBlendEquation || blendEquationAlpha !== currentBlendEquationAlpha ) {\n\n\t\t\tgl.blendEquationSeparate( equationToGL[ blendEquation ], equationToGL[ blendEquationAlpha ] );\n\n\t\t\tcurrentBlendEquation = blendEquation;\n\t\t\tcurrentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t}\n\n\t\tif ( blendSrc !== currentBlendSrc || blendDst !== currentBlendDst || blendSrcAlpha !== currentBlendSrcAlpha || blendDstAlpha !== currentBlendDstAlpha ) {\n\n\t\t\tgl.blendFuncSeparate( factorToGL[ blendSrc ], factorToGL[ blendDst ], factorToGL[ blendSrcAlpha ], factorToGL[ blendDstAlpha ] );\n\n\t\t\tcurrentBlendSrc = blendSrc;\n\t\t\tcurrentBlendDst = blendDst;\n\t\t\tcurrentBlendSrcAlpha = blendSrcAlpha;\n\t\t\tcurrentBlendDstAlpha = blendDstAlpha;\n\n\t\t}\n\n\t\tif ( blendColor.equals( currentBlendColor ) === false || blendAlpha !== currentBlendAlpha ) {\n\n\t\t\tgl.blendColor( blendColor.r, blendColor.g, blendColor.b, blendAlpha );\n\n\t\t\tcurrentBlendColor.copy( blendColor );\n\t\t\tcurrentBlendAlpha = blendAlpha;\n\n\t\t}\n\n\t\tcurrentBlending = blending;\n\t\tcurrentPremultipledAlpha = false;\n\n\t}\n\n\tfunction setMaterial( material, frontFaceCW ) {\n\n\t\tmaterial.side === DoubleSide\n\t\t\t? disable( gl.CULL_FACE )\n\t\t\t: enable( gl.CULL_FACE );\n\n\t\tlet flipSided = ( material.side === BackSide );\n\t\tif ( frontFaceCW ) flipSided = ! flipSided;\n\n\t\tsetFlipSided( flipSided );\n\n\t\t( material.blending === NormalBlending && material.transparent === false )\n\t\t\t? setBlending( NoBlending )\n\t\t\t: setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.blendColor, material.blendAlpha, material.premultipliedAlpha );\n\n\t\tdepthBuffer.setFunc( material.depthFunc );\n\t\tdepthBuffer.setTest( material.depthTest );\n\t\tdepthBuffer.setMask( material.depthWrite );\n\t\tcolorBuffer.setMask( material.colorWrite );\n\n\t\tconst stencilWrite = material.stencilWrite;\n\t\tstencilBuffer.setTest( stencilWrite );\n\t\tif ( stencilWrite ) {\n\n\t\t\tstencilBuffer.setMask( material.stencilWriteMask );\n\t\t\tstencilBuffer.setFunc( material.stencilFunc, material.stencilRef, material.stencilFuncMask );\n\t\t\tstencilBuffer.setOp( material.stencilFail, material.stencilZFail, material.stencilZPass );\n\n\t\t}\n\n\t\tsetPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\tmaterial.alphaToCoverage === true\n\t\t\t? enable( gl.SAMPLE_ALPHA_TO_COVERAGE )\n\t\t\t: disable( gl.SAMPLE_ALPHA_TO_COVERAGE );\n\n\t}\n\n\t//\n\n\tfunction setFlipSided( flipSided ) {\n\n\t\tif ( currentFlipSided !== flipSided ) {\n\n\t\t\tif ( flipSided ) {\n\n\t\t\t\tgl.frontFace( gl.CW );\n\n\t\t\t} else {\n\n\t\t\t\tgl.frontFace( gl.CCW );\n\n\t\t\t}\n\n\t\t\tcurrentFlipSided = flipSided;\n\n\t\t}\n\n\t}\n\n\tfunction setCullFace( cullFace ) {\n\n\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\tenable( gl.CULL_FACE );\n\n\t\t\tif ( cullFace !== currentCullFace ) {\n\n\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\tgl.cullFace( gl.BACK );\n\n\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT_AND_BACK );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.CULL_FACE );\n\n\t\t}\n\n\t\tcurrentCullFace = cullFace;\n\n\t}\n\n\tfunction setLineWidth( width ) {\n\n\t\tif ( width !== currentLineWidth ) {\n\n\t\t\tif ( lineWidthAvailable ) gl.lineWidth( width );\n\n\t\t\tcurrentLineWidth = width;\n\n\t\t}\n\n\t}\n\n\tfunction setPolygonOffset( polygonOffset, factor, units ) {\n\n\t\tif ( polygonOffset ) {\n\n\t\t\tenable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\tif ( currentPolygonOffsetFactor !== factor || currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\tcurrentPolygonOffsetFactor = factor;\n\t\t\t\tcurrentPolygonOffsetUnits = units;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdisable( gl.POLYGON_OFFSET_FILL );\n\n\t\t}\n\n\t}\n\n\tfunction setScissorTest( scissorTest ) {\n\n\t\tif ( scissorTest ) {\n\n\t\t\tenable( gl.SCISSOR_TEST );\n\n\t\t} else {\n\n\t\t\tdisable( gl.SCISSOR_TEST );\n\n\t\t}\n\n\t}\n\n\t// texture\n\n\tfunction activeTexture( webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\tgl.activeTexture( webglSlot );\n\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t}\n\n\t}\n\n\tfunction bindTexture( webglType, webglTexture, webglSlot ) {\n\n\t\tif ( webglSlot === undefined ) {\n\n\t\t\tif ( currentTextureSlot === null ) {\n\n\t\t\t\twebglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\t\t} else {\n\n\t\t\t\twebglSlot = currentTextureSlot;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet boundTexture = currentBoundTextures[ webglSlot ];\n\n\t\tif ( boundTexture === undefined ) {\n\n\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\tcurrentBoundTextures[ webglSlot ] = boundTexture;\n\n\t\t}\n\n\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\t\tgl.activeTexture( webglSlot );\n\t\t\t\tcurrentTextureSlot = webglSlot;\n\n\t\t\t}\n\n\t\t\tgl.bindTexture( webglType, webglTexture || emptyTextures[ webglType ] );\n\n\t\t\tboundTexture.type = webglType;\n\t\t\tboundTexture.texture = webglTexture;\n\n\t\t}\n\n\t}\n\n\tfunction unbindTexture() {\n\n\t\tconst boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture !== undefined && boundTexture.type !== undefined ) {\n\n\t\t\tgl.bindTexture( boundTexture.type, null );\n\n\t\t\tboundTexture.type = undefined;\n\t\t\tboundTexture.texture = undefined;\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage2D( ...arguments );\n\n\t\t} catch ( e ) {\n\n\t\t\terror( 'WebGLState:', e );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexImage3D( ...arguments );\n\n\t\t} catch ( e ) {\n\n\t\t\terror( 'WebGLState:', e );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage2D( ...arguments );\n\n\t\t} catch ( e ) {\n\n\t\t\terror( 'WebGLState:', e );\n\n\t\t}\n\n\t}\n\n\tfunction texSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texSubImage3D( ...arguments );\n\n\t\t} catch ( e ) {\n\n\t\t\terror( 'WebGLState:', e );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexSubImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage2D( ...arguments );\n\n\t\t} catch ( e ) {\n\n\t\t\terror( 'WebGLState:', e );\n\n\t\t}\n\n\t}\n\n\tfunction compressedTexSubImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.compressedTexSubImage3D( ...arguments );\n\n\t\t} catch ( e ) {\n\n\t\t\terror( 'WebGLState:', e );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage2D( ...arguments );\n\n\t\t} catch ( e ) {\n\n\t\t\terror( 'WebGLState:', e );\n\n\t\t}\n\n\t}\n\n\tfunction texStorage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texStorage3D( ...arguments );\n\n\t\t} catch ( e ) {\n\n\t\t\terror( 'WebGLState:', e );\n\n\t\t}\n\n\t}\n\n\tfunction texImage2D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage2D( ...arguments );\n\n\t\t} catch ( e ) {\n\n\t\t\terror( 'WebGLState:', e );\n\n\t\t}\n\n\t}\n\n\tfunction texImage3D() {\n\n\t\ttry {\n\n\t\t\tgl.texImage3D( ...arguments );\n\n\t\t} catch ( e ) {\n\n\t\t\terror( 'WebGLState:', e );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction scissor( scissor ) {\n\n\t\tif ( currentScissor.equals( scissor ) === false ) {\n\n\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\tcurrentScissor.copy( scissor );\n\n\t\t}\n\n\t}\n\n\tfunction viewport( viewport ) {\n\n\t\tif ( currentViewport.equals( viewport ) === false ) {\n\n\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\tcurrentViewport.copy( viewport );\n\n\t\t}\n\n\t}\n\n\tfunction updateUBOMapping( uniformsGroup, program ) {\n\n\t\tlet mapping = uboProgramMap.get( program );\n\n\t\tif ( mapping === undefined ) {\n\n\t\t\tmapping = new WeakMap();\n\n\t\t\tuboProgramMap.set( program, mapping );\n\n\t\t}\n\n\t\tlet blockIndex = mapping.get( uniformsGroup );\n\n\t\tif ( blockIndex === undefined ) {\n\n\t\t\tblockIndex = gl.getUniformBlockIndex( program, uniformsGroup.name );\n\n\t\t\tmapping.set( uniformsGroup, blockIndex );\n\n\t\t}\n\n\t}\n\n\tfunction uniformBlockBinding( uniformsGroup, program ) {\n\n\t\tconst mapping = uboProgramMap.get( program );\n\t\tconst blockIndex = mapping.get( uniformsGroup );\n\n\t\tif ( uboBindings.get( program ) !== blockIndex ) {\n\n\t\t\t// bind shader specific block index to global block point\n\t\t\tgl.uniformBlockBinding( program, blockIndex, uniformsGroup.__bindingPointIndex );\n\n\t\t\tuboBindings.set( program, blockIndex );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction reset() {\n\n\t\t// reset state\n\n\t\tgl.disable( gl.BLEND );\n\t\tgl.disable( gl.CULL_FACE );\n\t\tgl.disable( gl.DEPTH_TEST );\n\t\tgl.disable( gl.POLYGON_OFFSET_FILL );\n\t\tgl.disable( gl.SCISSOR_TEST );\n\t\tgl.disable( gl.STENCIL_TEST );\n\t\tgl.disable( gl.SAMPLE_ALPHA_TO_COVERAGE );\n\n\t\tgl.blendEquation( gl.FUNC_ADD );\n\t\tgl.blendFunc( gl.ONE, gl.ZERO );\n\t\tgl.blendFuncSeparate( gl.ONE, gl.ZERO, gl.ONE, gl.ZERO );\n\t\tgl.blendColor( 0, 0, 0, 0 );\n\n\t\tgl.colorMask( true, true, true, true );\n\t\tgl.clearColor( 0, 0, 0, 0 );\n\n\t\tgl.depthMask( true );\n\t\tgl.depthFunc( gl.LESS );\n\n\t\tdepthBuffer.setReversed( false );\n\n\t\tgl.clearDepth( 1 );\n\n\t\tgl.stencilMask( 0xffffffff );\n\t\tgl.stencilFunc( gl.ALWAYS, 0, 0xffffffff );\n\t\tgl.stencilOp( gl.KEEP, gl.KEEP, gl.KEEP );\n\t\tgl.clearStencil( 0 );\n\n\t\tgl.cullFace( gl.BACK );\n\t\tgl.frontFace( gl.CCW );\n\n\t\tgl.polygonOffset( 0, 0 );\n\n\t\tgl.activeTexture( gl.TEXTURE0 );\n\n\t\tgl.bindFramebuffer( gl.FRAMEBUFFER, null );\n\t\tgl.bindFramebuffer( gl.DRAW_FRAMEBUFFER, null );\n\t\tgl.bindFramebuffer( gl.READ_FRAMEBUFFER, null );\n\n\t\tgl.useProgram( null );\n\n\t\tgl.lineWidth( 1 );\n\n\t\tgl.scissor( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tgl.viewport( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\t// reset internals\n\n\t\tenabledCapabilities = {};\n\n\t\tcurrentTextureSlot = null;\n\t\tcurrentBoundTextures = {};\n\n\t\tcurrentBoundFramebuffers = {};\n\t\tcurrentDrawbuffers = new WeakMap();\n\t\tdefaultDrawbuffers = [];\n\n\t\tcurrentProgram = null;\n\n\t\tcurrentBlendingEnabled = false;\n\t\tcurrentBlending = null;\n\t\tcurrentBlendEquation = null;\n\t\tcurrentBlendSrc = null;\n\t\tcurrentBlendDst = null;\n\t\tcurrentBlendEquationAlpha = null;\n\t\tcurrentBlendSrcAlpha = null;\n\t\tcurrentBlendDstAlpha = null;\n\t\tcurrentBlendColor = new Color( 0, 0, 0 );\n\t\tcurrentBlendAlpha = 0;\n\t\tcurrentPremultipledAlpha = false;\n\n\t\tcurrentFlipSided = null;\n\t\tcurrentCullFace = null;\n\n\t\tcurrentLineWidth = null;\n\n\t\tcurrentPolygonOffsetFactor = null;\n\t\tcurrentPolygonOffsetUnits = null;\n\n\t\tcurrentScissor.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\t\tcurrentViewport.set( 0, 0, gl.canvas.width, gl.canvas.height );\n\n\t\tcolorBuffer.reset();\n\t\tdepthBuffer.reset();\n\t\tstencilBuffer.reset();\n\n\t}\n\n\treturn {\n\n\t\tbuffers: {\n\t\t\tcolor: colorBuffer,\n\t\t\tdepth: depthBuffer,\n\t\t\tstencil: stencilBuffer\n\t\t},\n\n\t\tenable: enable,\n\t\tdisable: disable,\n\n\t\tbindFramebuffer: bindFramebuffer,\n\t\tdrawBuffers: drawBuffers,\n\n\t\tuseProgram: useProgram,\n\n\t\tsetBlending: setBlending,\n\t\tsetMaterial: setMaterial,\n\n\t\tsetFlipSided: setFlipSided,\n\t\tsetCullFace: setCullFace,\n\n\t\tsetLineWidth: setLineWidth,\n\t\tsetPolygonOffset: setPolygonOffset,\n\n\t\tsetScissorTest: setScissorTest,\n\n\t\tactiveTexture: activeTexture,\n\t\tbindTexture: bindTexture,\n\t\tunbindTexture: unbindTexture,\n\t\tcompressedTexImage2D: compressedTexImage2D,\n\t\tcompressedTexImage3D: compressedTexImage3D,\n\t\ttexImage2D: texImage2D,\n\t\ttexImage3D: texImage3D,\n\n\t\tupdateUBOMapping: updateUBOMapping,\n\t\tuniformBlockBinding: uniformBlockBinding,\n\n\t\ttexStorage2D: texStorage2D,\n\t\ttexStorage3D: texStorage3D,\n\t\ttexSubImage2D: texSubImage2D,\n\t\ttexSubImage3D: texSubImage3D,\n\t\tcompressedTexSubImage2D: compressedTexSubImage2D,\n\t\tcompressedTexSubImage3D: compressedTexSubImage3D,\n\n\t\tscissor: scissor,\n\t\tviewport: viewport,\n\n\t\treset: reset\n\n\t};\n\n}\n\nfunction WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info ) {\n\n\tconst multisampledRTTExt = extensions.has( 'WEBGL_multisampled_render_to_texture' ) ? extensions.get( 'WEBGL_multisampled_render_to_texture' ) : null;\n\tconst supportsInvalidateFramebuffer = typeof navigator === 'undefined' ? false : /OculusBrowser/g.test( navigator.userAgent );\n\n\tconst _imageDimensions = new Vector2();\n\tconst _videoTextures = new WeakMap();\n\tlet _canvas;\n\n\tconst _sources = new WeakMap(); // maps WebglTexture objects to instances of Source\n\n\t// cordova iOS (as of 5.0) still uses UIWebView, which provides OffscreenCanvas,\n\t// also OffscreenCanvas.getContext(\"webgl\"), but not OffscreenCanvas.getContext(\"2d\")!\n\t// Some implementations may only implement OffscreenCanvas partially (e.g. lacking 2d).\n\n\tlet useOffscreenCanvas = false;\n\n\ttry {\n\n\t\tuseOffscreenCanvas = typeof OffscreenCanvas !== 'undefined'\n\t\t\t&& ( new OffscreenCanvas( 1, 1 ).getContext( '2d' ) ) !== null;\n\n\n\t} catch ( err ) {\n\n\t\t// Ignore any errors\n\n\t}\n\n\tfunction createCanvas( width, height ) {\n\n\t\t// Use OffscreenCanvas when available. Specially needed in web workers\n\n\t\treturn useOffscreenCanvas ?\n\t\t\tnew OffscreenCanvas( width, height ) : createElementNS( 'canvas' );\n\n\t}\n\n\tfunction resizeImage( image, needsNewCanvas, maxSize ) {\n\n\t\tlet scale = 1;\n\n\t\tconst dimensions = getDimensions( image );\n\n\t\t// handle case if texture exceeds max size\n\n\t\tif ( dimensions.width > maxSize || dimensions.height > maxSize ) {\n\n\t\t\tscale = maxSize / Math.max( dimensions.width, dimensions.height );\n\n\t\t}\n\n\t\t// only perform resize if necessary\n\n\t\tif ( scale < 1 ) {\n\n\t\t\t// only perform resize for certain image types\n\n\t\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ||\n\t\t\t\t( typeof VideoFrame !== 'undefined' && image instanceof VideoFrame ) ) {\n\n\t\t\t\tconst width = Math.floor( scale * dimensions.width );\n\t\t\t\tconst height = Math.floor( scale * dimensions.height );\n\n\t\t\t\tif ( _canvas === undefined ) _canvas = createCanvas( width, height );\n\n\t\t\t\t// cube textures can't reuse the same canvas\n\n\t\t\t\tconst canvas = needsNewCanvas ? createCanvas( width, height ) : _canvas;\n\n\t\t\t\tcanvas.width = width;\n\t\t\t\tcanvas.height = height;\n\n\t\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\t\tcontext.drawImage( image, 0, 0, width, height );\n\n\t\t\t\twarn( 'WebGLRenderer: Texture has been resized from (' + dimensions.width + 'x' + dimensions.height + ') to (' + width + 'x' + height + ').' );\n\n\t\t\t\treturn canvas;\n\n\t\t\t} else {\n\n\t\t\t\tif ( 'data' in image ) {\n\n\t\t\t\t\twarn( 'WebGLRenderer: Image in DataTexture is too big (' + dimensions.width + 'x' + dimensions.height + ').' );\n\n\t\t\t\t}\n\n\t\t\t\treturn image;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction textureNeedsGenerateMipmaps( texture ) {\n\n\t\treturn texture.generateMipmaps;\n\n\t}\n\n\tfunction generateMipmap( target ) {\n\n\t\t_gl.generateMipmap( target );\n\n\t}\n\n\tfunction getTargetType( texture ) {\n\n\t\tif ( texture.isWebGLCubeRenderTarget ) return _gl.TEXTURE_CUBE_MAP;\n\t\tif ( texture.isWebGL3DRenderTarget ) return _gl.TEXTURE_3D;\n\t\tif ( texture.isWebGLArrayRenderTarget || texture.isCompressedArrayTexture ) return _gl.TEXTURE_2D_ARRAY;\n\t\treturn _gl.TEXTURE_2D;\n\n\t}\n\n\tfunction getInternalFormat( internalFormatName, glFormat, glType, colorSpace, forceLinearTransfer = false ) {\n\n\t\tif ( internalFormatName !== null ) {\n\n\t\t\tif ( _gl[ internalFormatName ] !== undefined ) return _gl[ internalFormatName ];\n\n\t\t\twarn( 'WebGLRenderer: Attempt to use non-existing WebGL internal format \\'' + internalFormatName + '\\'' );\n\n\t\t}\n\n\t\tlet internalFormat = glFormat;\n\n\t\tif ( glFormat === _gl.RED ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.R32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.R16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RED_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.R8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.R16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.R32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.R8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.R16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.R32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RG ) {\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.RG32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RG16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RG8;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RG_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RG8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RG16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RG32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.RG8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.RG16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.RG32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGB_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RGB8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RGB16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RGB32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.RGB8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.RGB16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.RGB32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGBA_INTEGER ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = _gl.RGBA8UI;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT ) internalFormat = _gl.RGBA16UI;\n\t\t\tif ( glType === _gl.UNSIGNED_INT ) internalFormat = _gl.RGBA32UI;\n\t\t\tif ( glType === _gl.BYTE ) internalFormat = _gl.RGBA8I;\n\t\t\tif ( glType === _gl.SHORT ) internalFormat = _gl.RGBA16I;\n\t\t\tif ( glType === _gl.INT ) internalFormat = _gl.RGBA32I;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGB ) {\n\n\t\t\tif ( glType === _gl.UNSIGNED_INT_5_9_9_9_REV ) internalFormat = _gl.RGB9_E5;\n\t\t\tif ( glType === _gl.UNSIGNED_INT_10F_11F_11F_REV ) internalFormat = _gl.R11F_G11F_B10F;\n\n\t\t}\n\n\t\tif ( glFormat === _gl.RGBA ) {\n\n\t\t\tconst transfer = forceLinearTransfer ? LinearTransfer : ColorManagement.getTransfer( colorSpace );\n\n\t\t\tif ( glType === _gl.FLOAT ) internalFormat = _gl.RGBA32F;\n\t\t\tif ( glType === _gl.HALF_FLOAT ) internalFormat = _gl.RGBA16F;\n\t\t\tif ( glType === _gl.UNSIGNED_BYTE ) internalFormat = ( transfer === SRGBTransfer ) ? _gl.SRGB8_ALPHA8 : _gl.RGBA8;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT_4_4_4_4 ) internalFormat = _gl.RGBA4;\n\t\t\tif ( glType === _gl.UNSIGNED_SHORT_5_5_5_1 ) internalFormat = _gl.RGB5_A1;\n\n\t\t}\n\n\t\tif ( internalFormat === _gl.R16F || internalFormat === _gl.R32F ||\n\t\t\tinternalFormat === _gl.RG16F || internalFormat === _gl.RG32F ||\n\t\t\tinternalFormat === _gl.RGBA16F || internalFormat === _gl.RGBA32F ) {\n\n\t\t\textensions.get( 'EXT_color_buffer_float' );\n\n\t\t}\n\n\t\treturn internalFormat;\n\n\t}\n\n\tfunction getInternalDepthFormat( useStencil, depthType ) {\n\n\t\tlet glInternalFormat;\n\t\tif ( useStencil ) {\n\n\t\t\tif ( depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH24_STENCIL8;\n\n\t\t\t} else if ( depthType === FloatType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH32F_STENCIL8;\n\n\t\t\t} else if ( depthType === UnsignedShortType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH24_STENCIL8;\n\t\t\t\twarn( 'DepthTexture: 16 bit depth attachment is not supported with stencil. Using 24-bit attachment.' );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( depthType === null || depthType === UnsignedIntType || depthType === UnsignedInt248Type ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT24;\n\n\t\t\t} else if ( depthType === FloatType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT32F;\n\n\t\t\t} else if ( depthType === UnsignedShortType ) {\n\n\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT16;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn glInternalFormat;\n\n\t}\n\n\tfunction getMipLevels( texture, image ) {\n\n\t\tif ( textureNeedsGenerateMipmaps( texture ) === true || ( texture.isFramebufferTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter ) ) {\n\n\t\t\treturn Math.log2( Math.max( image.width, image.height ) ) + 1;\n\n\t\t} else if ( texture.mipmaps !== undefined && texture.mipmaps.length > 0 ) {\n\n\t\t\t// user-defined mipmaps\n\n\t\t\treturn texture.mipmaps.length;\n\n\t\t} else if ( texture.isCompressedTexture && Array.isArray( texture.image ) ) {\n\n\t\t\treturn image.mipmaps.length;\n\n\t\t} else {\n\n\t\t\t// texture without mipmaps (only base level)\n\n\t\t\treturn 1;\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction onTextureDispose( event ) {\n\n\t\tconst texture = event.target;\n\n\t\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\t\tdeallocateTexture( texture );\n\n\t\tif ( texture.isVideoTexture ) {\n\n\t\t\t_videoTextures.delete( texture );\n\n\t\t}\n\n\t}\n\n\tfunction onRenderTargetDispose( event ) {\n\n\t\tconst renderTarget = event.target;\n\n\t\trenderTarget.removeEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tdeallocateRenderTarget( renderTarget );\n\n\t}\n\n\t//\n\n\tfunction deallocateTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( textureProperties.__webglInit === undefined ) return;\n\n\t\t// check if it's necessary to remove the WebGLTexture object\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures ) {\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\t\t\twebglTexture.usedTimes --;\n\n\t\t\t// the WebGLTexture object is not used anymore, remove it\n\n\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\tdeleteTexture( texture );\n\n\t\t\t}\n\n\t\t\t// remove the weak map entry if no WebGLTexture uses the source anymore\n\n\t\t\tif ( Object.keys( webglTextures ).length === 0 ) {\n\n\t\t\t\t_sources.delete( source );\n\n\t\t\t}\n\n\t\t}\n\n\t\tproperties.remove( texture );\n\n\t}\n\n\tfunction deleteTexture( texture ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\t\t_gl.deleteTexture( textureProperties.__webglTexture );\n\n\t\tconst source = texture.source;\n\t\tconst webglTextures = _sources.get( source );\n\t\tdelete webglTextures[ textureProperties.__cacheKey ];\n\n\t\tinfo.memory.textures --;\n\n\t}\n\n\tfunction deallocateRenderTarget( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( renderTarget.depthTexture ) {\n\n\t\t\trenderTarget.depthTexture.dispose();\n\n\t\t\tproperties.remove( renderTarget.depthTexture );\n\n\t\t}\n\n\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( Array.isArray( renderTargetProperties.__webglFramebuffer[ i ] ) ) {\n\n\t\t\t\t\tfor ( let level = 0; level < renderTargetProperties.__webglFramebuffer[ i ].length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ][ level ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( Array.isArray( renderTargetProperties.__webglFramebuffer ) ) {\n\n\t\t\t\tfor ( let level = 0; level < renderTargetProperties.__webglFramebuffer.length; level ++ ) _gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer[ level ] );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.deleteFramebuffer( renderTargetProperties.__webglFramebuffer );\n\n\t\t\t}\n\n\t\t\tif ( renderTargetProperties.__webglDepthbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthbuffer );\n\t\t\tif ( renderTargetProperties.__webglMultisampledFramebuffer ) _gl.deleteFramebuffer( renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer ) {\n\n\t\t\t\tfor ( let i = 0; i < renderTargetProperties.__webglColorRenderbuffer.length; i ++ ) {\n\n\t\t\t\t\tif ( renderTargetProperties.__webglColorRenderbuffer[ i ] ) _gl.deleteRenderbuffer( renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( renderTargetProperties.__webglDepthRenderbuffer ) _gl.deleteRenderbuffer( renderTargetProperties.__webglDepthRenderbuffer );\n\n\t\t}\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\tconst attachmentProperties = properties.get( textures[ i ] );\n\n\t\t\tif ( attachmentProperties.__webglTexture ) {\n\n\t\t\t\t_gl.deleteTexture( attachmentProperties.__webglTexture );\n\n\t\t\t\tinfo.memory.textures --;\n\n\t\t\t}\n\n\t\t\tproperties.remove( textures[ i ] );\n\n\t\t}\n\n\t\tproperties.remove( renderTarget );\n\n\t}\n\n\t//\n\n\tlet textureUnits = 0;\n\n\tfunction resetTextureUnits() {\n\n\t\ttextureUnits = 0;\n\n\t}\n\n\tfunction allocateTextureUnit() {\n\n\t\tconst textureUnit = textureUnits;\n\n\t\tif ( textureUnit >= capabilities.maxTextures ) {\n\n\t\t\twarn( 'WebGLTextures: Trying to use ' + textureUnit + ' texture units while this GPU supports only ' + capabilities.maxTextures );\n\n\t\t}\n\n\t\ttextureUnits += 1;\n\n\t\treturn textureUnit;\n\n\t}\n\n\tfunction getTextureCacheKey( texture ) {\n\n\t\tconst array = [];\n\n\t\tarray.push( texture.wrapS );\n\t\tarray.push( texture.wrapT );\n\t\tarray.push( texture.wrapR || 0 );\n\t\tarray.push( texture.magFilter );\n\t\tarray.push( texture.minFilter );\n\t\tarray.push( texture.anisotropy );\n\t\tarray.push( texture.internalFormat );\n\t\tarray.push( texture.format );\n\t\tarray.push( texture.type );\n\t\tarray.push( texture.generateMipmaps );\n\t\tarray.push( texture.premultiplyAlpha );\n\t\tarray.push( texture.flipY );\n\t\tarray.push( texture.unpackAlignment );\n\t\tarray.push( texture.colorSpace );\n\n\t\treturn array.join();\n\n\t}\n\n\t//\n\n\tfunction setTexture2D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isVideoTexture ) updateVideoTexture( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.isExternalTexture !== true && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tconst image = texture.image;\n\n\t\t\tif ( image === null ) {\n\n\t\t\t\twarn( 'WebGLRenderer: Texture marked for update but no image data found.' );\n\n\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\twarn( 'WebGLRenderer: Texture marked for update but image is incomplete' );\n\n\t\t\t} else {\n\n\t\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t} else if ( texture.isExternalTexture ) {\n\n\t\t\ttextureProperties.__webglTexture = texture.sourceTexture ? texture.sourceTexture : null;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_2D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTexture2DArray( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t} else if ( texture.isExternalTexture ) {\n\n\t\t\ttextureProperties.__webglTexture = texture.sourceTexture ? texture.sourceTexture : null;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_2D_ARRAY, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTexture3D( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isRenderTargetTexture === false && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_3D, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tfunction setTextureCube( texture, slot ) {\n\n\t\tconst textureProperties = properties.get( texture );\n\n\t\tif ( texture.isCubeDepthTexture !== true && texture.version > 0 && textureProperties.__version !== texture.version ) {\n\n\t\t\tuploadCubeTexture( textureProperties, texture, slot );\n\t\t\treturn;\n\n\t\t}\n\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t}\n\n\tconst wrappingToGL = {\n\t\t[ RepeatWrapping ]: _gl.REPEAT,\n\t\t[ ClampToEdgeWrapping ]: _gl.CLAMP_TO_EDGE,\n\t\t[ MirroredRepeatWrapping ]: _gl.MIRRORED_REPEAT\n\t};\n\n\tconst filterToGL = {\n\t\t[ NearestFilter ]: _gl.NEAREST,\n\t\t[ NearestMipmapNearestFilter ]: _gl.NEAREST_MIPMAP_NEAREST,\n\t\t[ NearestMipmapLinearFilter ]: _gl.NEAREST_MIPMAP_LINEAR,\n\n\t\t[ LinearFilter ]: _gl.LINEAR,\n\t\t[ LinearMipmapNearestFilter ]: _gl.LINEAR_MIPMAP_NEAREST,\n\t\t[ LinearMipmapLinearFilter ]: _gl.LINEAR_MIPMAP_LINEAR\n\t};\n\n\tconst compareToGL = {\n\t\t[ NeverCompare ]: _gl.NEVER,\n\t\t[ AlwaysCompare ]: _gl.ALWAYS,\n\t\t[ LessCompare ]: _gl.LESS,\n\t\t[ LessEqualCompare ]: _gl.LEQUAL,\n\t\t[ EqualCompare ]: _gl.EQUAL,\n\t\t[ GreaterEqualCompare ]: _gl.GEQUAL,\n\t\t[ GreaterCompare ]: _gl.GREATER,\n\t\t[ NotEqualCompare ]: _gl.NOTEQUAL\n\t};\n\n\tfunction setTextureParameters( textureType, texture ) {\n\n\t\tif ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false &&\n\t\t\t( texture.magFilter === LinearFilter || texture.magFilter === LinearMipmapNearestFilter || texture.magFilter === NearestMipmapLinearFilter || texture.magFilter === LinearMipmapLinearFilter ||\n\t\t\ttexture.minFilter === LinearFilter || texture.minFilter === LinearMipmapNearestFilter || texture.minFilter === NearestMipmapLinearFilter || texture.minFilter === LinearMipmapLinearFilter ) ) {\n\n\t\t\twarn( 'WebGLRenderer: Unable to use linear filtering with floating point textures. OES_texture_float_linear not supported on this device.' );\n\n\t\t}\n\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_S, wrappingToGL[ texture.wrapS ] );\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_T, wrappingToGL[ texture.wrapT ] );\n\n\t\tif ( textureType === _gl.TEXTURE_3D || textureType === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_WRAP_R, wrappingToGL[ texture.wrapR ] );\n\n\t\t}\n\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MAG_FILTER, filterToGL[ texture.magFilter ] );\n\t\t_gl.texParameteri( textureType, _gl.TEXTURE_MIN_FILTER, filterToGL[ texture.minFilter ] );\n\n\t\tif ( texture.compareFunction ) {\n\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_COMPARE_MODE, _gl.COMPARE_REF_TO_TEXTURE );\n\t\t\t_gl.texParameteri( textureType, _gl.TEXTURE_COMPARE_FUNC, compareToGL[ texture.compareFunction ] );\n\n\t\t}\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tif ( texture.magFilter === NearestFilter ) return;\n\t\t\tif ( texture.minFilter !== NearestMipmapLinearFilter && texture.minFilter !== LinearMipmapLinearFilter ) return;\n\t\t\tif ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false ) return; // verify extension\n\n\t\t\tif ( texture.anisotropy > 1 || properties.get( texture ).__currentAnisotropy ) {\n\n\t\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\t\t\t\t_gl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, capabilities.getMaxAnisotropy() ) );\n\t\t\t\tproperties.get( texture ).__currentAnisotropy = texture.anisotropy;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction initTexture( textureProperties, texture ) {\n\n\t\tlet forceUpload = false;\n\n\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\ttextureProperties.__webglInit = true;\n\n\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t}\n\n\t\t// create Source <-> WebGLTextures mapping if necessary\n\n\t\tconst source = texture.source;\n\t\tlet webglTextures = _sources.get( source );\n\n\t\tif ( webglTextures === undefined ) {\n\n\t\t\twebglTextures = {};\n\t\t\t_sources.set( source, webglTextures );\n\n\t\t}\n\n\t\t// check if there is already a WebGLTexture object for the given texture parameters\n\n\t\tconst textureCacheKey = getTextureCacheKey( texture );\n\n\t\tif ( textureCacheKey !== textureProperties.__cacheKey ) {\n\n\t\t\t// if not, create a new instance of WebGLTexture\n\n\t\t\tif ( webglTextures[ textureCacheKey ] === undefined ) {\n\n\t\t\t\t// create new entry\n\n\t\t\t\twebglTextures[ textureCacheKey ] = {\n\t\t\t\t\ttexture: _gl.createTexture(),\n\t\t\t\t\tusedTimes: 0\n\t\t\t\t};\n\n\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t// when a new instance of WebGLTexture was created, a texture upload is required\n\t\t\t\t// even if the image contents are identical\n\n\t\t\t\tforceUpload = true;\n\n\t\t\t}\n\n\t\t\twebglTextures[ textureCacheKey ].usedTimes ++;\n\n\t\t\t// every time the texture cache key changes, it's necessary to check if an instance of\n\t\t\t// WebGLTexture can be deleted in order to avoid a memory leak.\n\n\t\t\tconst webglTexture = webglTextures[ textureProperties.__cacheKey ];\n\n\t\t\tif ( webglTexture !== undefined ) {\n\n\t\t\t\twebglTextures[ textureProperties.__cacheKey ].usedTimes --;\n\n\t\t\t\tif ( webglTexture.usedTimes === 0 ) {\n\n\t\t\t\t\tdeleteTexture( texture );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// store references to cache key and WebGLTexture object\n\n\t\t\ttextureProperties.__cacheKey = textureCacheKey;\n\t\t\ttextureProperties.__webglTexture = webglTextures[ textureCacheKey ].texture;\n\n\t\t}\n\n\t\treturn forceUpload;\n\n\t}\n\n\tfunction getRow( index, rowLength, componentStride ) {\n\n\t\treturn Math.floor( Math.floor( index / componentStride ) / rowLength );\n\n\t}\n\n\tfunction updateTexture( texture, image, glFormat, glType ) {\n\n\t\tconst componentStride = 4; // only RGBA supported\n\n\t\tconst updateRanges = texture.updateRanges;\n\n\t\tif ( updateRanges.length === 0 ) {\n\n\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, image.width, image.height, glFormat, glType, image.data );\n\n\t\t} else {\n\n\t\t\t// Before applying update ranges, we merge any adjacent / overlapping\n\t\t\t// ranges to reduce load on `gl.texSubImage2D`. Empirically, this has led\n\t\t\t// to performance improvements for applications which make heavy use of\n\t\t\t// update ranges. Likely due to GPU command overhead.\n\t\t\t//\n\t\t\t// Note that to reduce garbage collection between frames, we merge the\n\t\t\t// update ranges in-place. This is safe because this method will clear the\n\t\t\t// update ranges once updated.\n\n\t\t\tupdateRanges.sort( ( a, b ) => a.start - b.start );\n\n\t\t\t// To merge the update ranges in-place, we work from left to right in the\n\t\t\t// existing updateRanges array, merging ranges. This may result in a final\n\t\t\t// array which is smaller than the original. This index tracks the last\n\t\t\t// index representing a merged range, any data after this index can be\n\t\t\t// trimmed once the merge algorithm is completed.\n\t\t\tlet mergeIndex = 0;\n\n\t\t\tfor ( let i = 1; i < updateRanges.length; i ++ ) {\n\n\t\t\t\tconst previousRange = updateRanges[ mergeIndex ];\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\t// Only merge if in the same row and overlapping/adjacent\n\t\t\t\tconst previousEnd = previousRange.start + previousRange.count;\n\t\t\t\tconst currentRow = getRow( range.start, image.width, componentStride );\n\t\t\t\tconst previousRow = getRow( previousRange.start, image.width, componentStride );\n\n\t\t\t\t// We add one here to merge adjacent ranges. This is safe because ranges\n\t\t\t\t// operate over positive integers.\n\t\t\t\tif (\n\t\t\t\t\trange.start <= previousEnd + 1 &&\n\t\t\t\t\tcurrentRow === previousRow &&\n\t\t\t\t\tgetRow( range.start + range.count - 1, image.width, componentStride ) === currentRow // ensure range doesn't spill\n\t\t\t\t) {\n\n\t\t\t\t\tpreviousRange.count = Math.max(\n\t\t\t\t\t\tpreviousRange.count,\n\t\t\t\t\t\trange.start + range.count - previousRange.start\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\t++ mergeIndex;\n\t\t\t\t\tupdateRanges[ mergeIndex ] = range;\n\n\t\t\t\t}\n\n\n\t\t\t}\n\n\t\t\t// Trim the array to only contain the merged ranges.\n\t\t\tupdateRanges.length = mergeIndex + 1;\n\n\t\t\tconst currentUnpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );\n\t\t\tconst currentUnpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );\n\t\t\tconst currentUnpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );\n\n\t\t\tfor ( let i = 0, l = updateRanges.length; i < l; i ++ ) {\n\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\tconst pixelStart = Math.floor( range.start / componentStride );\n\t\t\t\tconst pixelCount = Math.ceil( range.count / componentStride );\n\n\t\t\t\tconst x = pixelStart % image.width;\n\t\t\t\tconst y = Math.floor( pixelStart / image.width );\n\n\t\t\t\t// Assumes update ranges refer to contiguous memory\n\t\t\t\tconst width = pixelCount;\n\t\t\t\tconst height = 1;\n\n\t\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, x );\n\t\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, y );\n\n\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, x, y, width, height, glFormat, glType, image.data );\n\n\t\t\t}\n\n\t\t\ttexture.clearUpdateRanges();\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, currentUnpackRowLen );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows );\n\n\t\t}\n\n\t}\n\n\tfunction uploadTexture( textureProperties, texture, slot ) {\n\n\t\tlet textureType = _gl.TEXTURE_2D;\n\n\t\tif ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) textureType = _gl.TEXTURE_2D_ARRAY;\n\t\tif ( texture.isData3DTexture ) textureType = _gl.TEXTURE_3D;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.bindTexture( textureType, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t\tconst sourceProperties = properties.get( source );\n\n\t\tif ( source.version !== sourceProperties.__version || forceUpload === true ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\n\t\t\tconst workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace );\n\t\t\tconst texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries( texture.colorSpace );\n\t\t\tconst unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL;\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion );\n\n\t\t\tlet image = resizeImage( texture.image, false, capabilities.maxTextureSize );\n\t\t\timage = verifyColorSpace( texture, image );\n\n\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\n\t\t\tconst glType = utils.convert( texture.type );\n\t\t\tlet glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace, texture.isVideoTexture );\n\n\t\t\tsetTextureParameters( textureType, texture );\n\n\t\t\tlet mipmap;\n\t\t\tconst mipmaps = texture.mipmaps;\n\n\t\t\tconst useTexStorage = ( texture.isVideoTexture !== true );\n\t\t\tconst allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true );\n\t\t\tconst dataReady = source.dataReady;\n\t\t\tconst levels = getMipLevels( texture, image );\n\n\t\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t\tglInternalFormat = getInternalDepthFormat( texture.format === DepthStencilFormat, texture.type );\n\n\t\t\t\t//\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, 1, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, null );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isDataTexture ) {\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\tupdateTexture( texture, image, glFormat, glType );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, image.width, image.height, 0, glFormat, glType, image.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isCompressedTexture ) {\n\n\t\t\t\tif ( texture.isCompressedArrayTexture ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tif ( texture.layerUpdates.size > 0 ) {\n\n\t\t\t\t\t\t\t\t\t\t\tconst layerByteLength = getByteLength( mipmap.width, mipmap.height, texture.format, texture.type );\n\n\t\t\t\t\t\t\t\t\t\t\tfor ( const layerIndex of texture.layerUpdates ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\tconst layerData = mipmap.data.subarray(\n\t\t\t\t\t\t\t\t\t\t\t\t\tlayerIndex * layerByteLength / mipmap.data.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t\t\t\t\t\t( layerIndex + 1 ) * layerByteLength / mipmap.data.BYTES_PER_ELEMENT\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, layerIndex, mipmap.width, mipmap.height, 1, glFormat, layerData );\n\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\ttexture.clearLayerUpdates();\n\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage3D( _gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, mipmap.data, 0, 0 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\twarn( 'WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_2D_ARRAY, i, glInternalFormat, mipmap.width, mipmap.height, image.depth, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, mipmaps[ 0 ].width, mipmaps[ 0 ].height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\twarn( 'WebGLRenderer: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isDataArrayTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\tif ( texture.layerUpdates.size > 0 ) {\n\n\t\t\t\t\t\t\tconst layerByteLength = getByteLength( image.width, image.height, texture.format, texture.type );\n\n\t\t\t\t\t\t\tfor ( const layerIndex of texture.layerUpdates ) {\n\n\t\t\t\t\t\t\t\tconst layerData = image.data.subarray(\n\t\t\t\t\t\t\t\t\tlayerIndex * layerByteLength / image.data.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t\t\t\t( layerIndex + 1 ) * layerByteLength / image.data.BYTES_PER_ELEMENT\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, layerIndex, image.width, image.height, 1, glFormat, glType, layerData );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\ttexture.clearLayerUpdates();\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_2D_ARRAY, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\tstate.texStorage3D( _gl.TEXTURE_3D, levels, glInternalFormat, image.width, image.height, image.depth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\tstate.texSubImage3D( _gl.TEXTURE_3D, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.texImage3D( _gl.TEXTURE_3D, 0, glInternalFormat, image.width, image.height, image.depth, 0, glFormat, glType, image.data );\n\n\t\t\t\t}\n\n\t\t\t} else if ( texture.isFramebufferTexture ) {\n\n\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tlet width = image.width, height = image.height;\n\n\t\t\t\t\t\tfor ( let i = 0; i < levels; i ++ ) {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, width, height, 0, glFormat, glType, null );\n\n\t\t\t\t\t\t\twidth >>= 1;\n\t\t\t\t\t\t\theight >>= 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// regular Texture (image, video, canvas)\n\n\t\t\t\t// use manually created mipmaps if available\n\t\t\t\t// if there are no manual mipmaps\n\t\t\t\t// set 0 level mipmap and then use GL to generate other mipmap levels\n\n\t\t\t\tif ( mipmaps.length > 0 ) {\n\n\t\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t\tconst dimensions = getDimensions( mipmaps[ 0 ] );\n\n\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\t\tmipmap = mipmaps[ i ];\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, i, 0, 0, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, i, glInternalFormat, glFormat, glType, mipmap );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttexture.generateMipmaps = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\tif ( allocateMemory ) {\n\n\t\t\t\t\t\t\tconst dimensions = getDimensions( image );\n\n\t\t\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_2D, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_2D, 0, 0, 0, glFormat, glType, image );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_2D, 0, glInternalFormat, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( textureType );\n\n\t\t\t}\n\n\t\t\tsourceProperties.__version = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t}\n\n\tfunction uploadCubeTexture( textureProperties, texture, slot ) {\n\n\t\tif ( texture.image.length !== 6 ) return;\n\n\t\tconst forceUpload = initTexture( textureProperties, texture );\n\t\tconst source = texture.source;\n\n\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture, _gl.TEXTURE0 + slot );\n\n\t\tconst sourceProperties = properties.get( source );\n\n\t\tif ( source.version !== sourceProperties.__version || forceUpload === true ) {\n\n\t\t\tstate.activeTexture( _gl.TEXTURE0 + slot );\n\n\t\t\tconst workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace );\n\t\t\tconst texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries( texture.colorSpace );\n\t\t\tconst unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? _gl.NONE : _gl.BROWSER_DEFAULT_WEBGL;\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion );\n\n\t\t\tconst isCompressed = ( texture.isCompressedTexture || texture.image[ 0 ].isCompressedTexture );\n\t\t\tconst isDataTexture = ( texture.image[ 0 ] && texture.image[ 0 ].isDataTexture );\n\n\t\t\tconst cubeImage = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( ! isCompressed && ! isDataTexture ) {\n\n\t\t\t\t\tcubeImage[ i ] = resizeImage( texture.image[ i ], true, capabilities.maxCubemapSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcubeImage[ i ] = isDataTexture ? texture.image[ i ].image : texture.image[ i ];\n\n\t\t\t\t}\n\n\t\t\t\tcubeImage[ i ] = verifyColorSpace( texture, cubeImage[ i ] );\n\n\t\t\t}\n\n\t\t\tconst image = cubeImage[ 0 ],\n\t\t\t\tglFormat = utils.convert( texture.format, texture.colorSpace ),\n\t\t\t\tglType = utils.convert( texture.type ),\n\t\t\t\tglInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\n\t\t\tconst useTexStorage = ( texture.isVideoTexture !== true );\n\t\t\tconst allocateMemory = ( sourceProperties.__version === undefined ) || ( forceUpload === true );\n\t\t\tconst dataReady = source.dataReady;\n\t\t\tlet levels = getMipLevels( texture, image );\n\n\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture );\n\n\t\t\tlet mipmaps;\n\n\t\t\tif ( isCompressed ) {\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, image.width, image.height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tmipmaps = cubeImage[ i ].mipmaps;\n\n\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\tif ( texture.format !== RGBAFormat ) {\n\n\t\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\t\tstate.compressedTexSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tstate.compressedTexImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\twarn( 'WebGLRenderer: Attempt to load unsupported compressed texture format in .setTextureCube()' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, 0, 0, mipmap.width, mipmap.height, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j, glInternalFormat, mipmap.width, mipmap.height, 0, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tmipmaps = texture.mipmaps;\n\n\t\t\t\tif ( useTexStorage && allocateMemory ) {\n\n\t\t\t\t\t// TODO: Uniformly handle mipmap definitions\n\t\t\t\t\t// Normal textures and compressed cube textures define base level + mips with their mipmap array\n\t\t\t\t\t// Uncompressed cube textures use their mipmap array only for mips (no base level)\n\n\t\t\t\t\tif ( mipmaps.length > 0 ) levels ++;\n\n\t\t\t\t\tconst dimensions = getDimensions( cubeImage[ 0 ] );\n\n\t\t\t\t\tstate.texStorage2D( _gl.TEXTURE_CUBE_MAP, levels, glInternalFormat, dimensions.width, dimensions.height );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tif ( isDataTexture ) {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, cubeImage[ i ].width, cubeImage[ i ].height, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, cubeImage[ i ].width, cubeImage[ i ].height, 0, glFormat, glType, cubeImage[ i ].data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\t\t\t\t\t\t\tconst mipmapImage = mipmap.image[ i ].image;\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, mipmapImage.width, mipmapImage.height, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, mipmapImage.width, mipmapImage.height, 0, glFormat, glType, mipmapImage.data );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, glFormat, glType, cubeImage[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\n\t\t\t\t\t\t\tif ( useTexStorage ) {\n\n\t\t\t\t\t\t\t\tif ( dataReady ) {\n\n\t\t\t\t\t\t\t\t\tstate.texSubImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tstate.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, glInternalFormat, glFormat, glType, mipmap.image[ i ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\t// We assume images for cube map have the same size.\n\t\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t}\n\n\t\t\tsourceProperties.__version = source.version;\n\n\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t}\n\n\t\ttextureProperties.__version = texture.version;\n\n\t}\n\n\t// Render targets\n\n\t// Setup storage for target texture and bind it to correct framebuffer\n\tfunction setupFrameBufferTexture( framebuffer, renderTarget, texture, attachment, textureTarget, level ) {\n\n\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\tconst glType = utils.convert( texture.type );\n\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\ttextureProperties.__renderTarget = renderTarget;\n\n\t\tif ( ! renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\tconst width = Math.max( 1, renderTarget.width >> level );\n\t\t\tconst height = Math.max( 1, renderTarget.height >> level );\n\n\t\t\tif ( textureTarget === _gl.TEXTURE_3D || textureTarget === _gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t\tstate.texImage3D( textureTarget, level, glInternalFormat, width, height, renderTarget.depth, 0, glFormat, glType, null );\n\n\t\t\t} else {\n\n\t\t\t\tstate.texImage2D( textureTarget, level, glInternalFormat, width, height, 0, glFormat, glType, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, attachment, textureTarget, textureProperties.__webglTexture, 0, getRenderTargetSamples( renderTarget ) );\n\n\t\t} else if ( textureTarget === _gl.TEXTURE_2D || ( textureTarget >= _gl.TEXTURE_CUBE_MAP_POSITIVE_X && textureTarget <= _gl.TEXTURE_CUBE_MAP_NEGATIVE_Z ) ) { // see #24753\n\n\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, attachment, textureTarget, textureProperties.__webglTexture, level );\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\t// Setup storage for internal depth/stencil buffers and bind to correct framebuffer\n\tfunction setupRenderBufferStorage( renderbuffer, renderTarget, useMultisample ) {\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t// retrieve the depth attachment types\n\t\t\tconst depthTexture = renderTarget.depthTexture;\n\t\t\tconst depthType = depthTexture && depthTexture.isDepthTexture ? depthTexture.type : null;\n\t\t\tconst glInternalFormat = getInternalDepthFormat( renderTarget.stencilBuffer, depthType );\n\t\t\tconst glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\n\t\t\t// set up the attachment\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, getRenderTargetSamples( renderTarget ), glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else if ( useMultisample ) {\n\n\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, getRenderTargetSamples( renderTarget ), glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t}\n\n\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t} else {\n\n\t\t\tconst textures = renderTarget.textures;\n\n\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\tconst texture = textures[ i ];\n\n\t\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace );\n\n\t\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( _gl.RENDERBUFFER, getRenderTargetSamples( renderTarget ), glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else if ( useMultisample ) {\n\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, getRenderTargetSamples( renderTarget ), glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_gl.renderbufferStorage( _gl.RENDERBUFFER, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t}\n\n\t// Setup resources for a Depth Texture for a FBO (needs an extension)\n\tfunction setupDepthTexture( framebuffer, renderTarget, cubeFace ) {\n\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\tif ( ! ( renderTarget.depthTexture && renderTarget.depthTexture.isDepthTexture ) ) {\n\n\t\t\tthrow new Error( 'renderTarget.depthTexture must be an instance of THREE.DepthTexture' );\n\n\t\t}\n\n\t\tconst textureProperties = properties.get( renderTarget.depthTexture );\n\t\ttextureProperties.__renderTarget = renderTarget;\n\n\t\t// upload an empty depth texture with framebuffer size\n\t\tif ( ! textureProperties.__webglTexture ||\n\t\t\t\trenderTarget.depthTexture.image.width !== renderTarget.width ||\n\t\t\t\trenderTarget.depthTexture.image.height !== renderTarget.height ) {\n\n\t\t\trenderTarget.depthTexture.image.width = renderTarget.width;\n\t\t\trenderTarget.depthTexture.image.height = renderTarget.height;\n\t\t\trenderTarget.depthTexture.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( isCube ) {\n\n\t\t\t// For cube depth textures, initialize and bind without uploading image data\n\t\t\tif ( textureProperties.__webglInit === undefined ) {\n\n\t\t\t\ttextureProperties.__webglInit = true;\n\t\t\t\trenderTarget.depthTexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t}\n\n\t\t\t// Only create and allocate storage once\n\t\t\tif ( textureProperties.__webglTexture === undefined ) {\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, renderTarget.depthTexture );\n\n\t\t\t\t// Allocate storage for all 6 faces with correct depth texture format\n\t\t\t\tconst glFormat = utils.convert( renderTarget.depthTexture.format );\n\t\t\t\tconst glType = utils.convert( renderTarget.depthTexture.type );\n\n\t\t\t\t// Use proper internal format for depth textures\n\t\t\t\tlet glInternalFormat;\n\t\t\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\t\t\tglInternalFormat = _gl.DEPTH_COMPONENT24;\n\n\t\t\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\t\t\tglInternalFormat = _gl.DEPTH24_STENCIL8;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\t_gl.texImage2D( _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, glInternalFormat, renderTarget.width, renderTarget.height, 0, glFormat, glType, null );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tsetTexture2D( renderTarget.depthTexture, 0 );\n\n\t\t}\n\n\t\tconst webglDepthTexture = textureProperties.__webglTexture;\n\t\tconst samples = getRenderTargetSamples( renderTarget );\n\n\t\tconst glTextureType = isCube ? _gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace : _gl.TEXTURE_2D;\n\t\tconst glAttachmentType = renderTarget.depthTexture.format === DepthStencilFormat ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\n\t\tif ( renderTarget.depthTexture.format === DepthFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, glAttachmentType, glTextureType, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, glAttachmentType, glTextureType, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else if ( renderTarget.depthTexture.format === DepthStencilFormat ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) ) {\n\n\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( _gl.FRAMEBUFFER, glAttachmentType, glTextureType, webglDepthTexture, 0, samples );\n\n\t\t\t} else {\n\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, glAttachmentType, glTextureType, webglDepthTexture, 0 );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Unknown depthTexture format' );\n\n\t\t}\n\n\t}\n\n\t// Setup GL resources for a non-texture depth buffer\n\tfunction setupDepthRenderbuffer( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\n\t\t// if the bound depth texture has changed\n\t\tif ( renderTargetProperties.__boundDepthTexture !== renderTarget.depthTexture ) {\n\n\t\t\t// fire the dispose event to get rid of stored state associated with the previously bound depth buffer\n\t\t\tconst depthTexture = renderTarget.depthTexture;\n\t\t\tif ( renderTargetProperties.__depthDisposeCallback ) {\n\n\t\t\t\trenderTargetProperties.__depthDisposeCallback();\n\n\t\t\t}\n\n\t\t\t// set up dispose listeners to track when the currently attached buffer is implicitly unbound\n\t\t\tif ( depthTexture ) {\n\n\t\t\t\tconst disposeEvent = () => {\n\n\t\t\t\t\tdelete renderTargetProperties.__boundDepthTexture;\n\t\t\t\t\tdelete renderTargetProperties.__depthDisposeCallback;\n\t\t\t\t\tdepthTexture.removeEventListener( 'dispose', disposeEvent );\n\n\t\t\t\t};\n\n\t\t\t\tdepthTexture.addEventListener( 'dispose', disposeEvent );\n\t\t\t\trenderTargetProperties.__depthDisposeCallback = disposeEvent;\n\n\t\t\t}\n\n\t\t\trenderTargetProperties.__boundDepthTexture = depthTexture;\n\n\t\t}\n\n\t\tif ( renderTarget.depthTexture && ! renderTargetProperties.__autoAllocateDepthBuffer ) {\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\t// For cube render targets with depth texture, setup each face\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, i );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst mipmaps = renderTarget.texture.mipmaps;\n\n\t\t\t\tif ( mipmaps && mipmaps.length > 0 ) {\n\n\t\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer[ 0 ], renderTarget, 0 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsetupDepthTexture( renderTargetProperties.__webglFramebuffer, renderTarget, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetProperties.__webglDepthbuffer = [];\n\n\t\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ i ] );\n\n\t\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer[ i ] === undefined ) {\n\n\t\t\t\t\t\trenderTargetProperties.__webglDepthbuffer[ i ] = _gl.createRenderbuffer();\n\t\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer[ i ], renderTarget, false );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// attach buffer if it's been created already\n\t\t\t\t\t\tconst glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\t\t\t\t\t\tconst renderbuffer = renderTargetProperties.__webglDepthbuffer[ i ];\n\t\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst mipmaps = renderTarget.texture.mipmaps;\n\n\t\t\t\tif ( mipmaps && mipmaps.length > 0 ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ 0 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTargetProperties.__webglDepthbuffer === undefined ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthbuffer, renderTarget, false );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// attach buffer if it's been created already\n\t\t\t\t\tconst glAttachmentType = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\t\t\t\t\tconst renderbuffer = renderTargetProperties.__webglDepthbuffer;\n\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderbuffer );\n\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, glAttachmentType, _gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t}\n\n\t// rebind framebuffer with external textures\n\tfunction rebindTextures( renderTarget, colorTexture, depthTexture ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\tif ( colorTexture !== undefined ) {\n\n\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, renderTarget.texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, 0 );\n\n\t\t}\n\n\t\tif ( depthTexture !== undefined ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\t// Set up GL resources for the render target\n\tfunction setupRenderTarget( renderTarget ) {\n\n\t\tconst texture = renderTarget.texture;\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\tconst textureProperties = properties.get( texture );\n\n\t\trenderTarget.addEventListener( 'dispose', onRenderTargetDispose );\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tconst isCube = ( renderTarget.isWebGLCubeRenderTarget === true );\n\t\tconst isMultipleRenderTargets = ( textures.length > 1 );\n\n\t\tif ( ! isMultipleRenderTargets ) {\n\n\t\t\tif ( textureProperties.__webglTexture === undefined ) {\n\n\t\t\t\ttextureProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t}\n\n\t\t\ttextureProperties.__version = texture.version;\n\t\t\tinfo.memory.textures ++;\n\n\t\t}\n\n\t\t// Setup framebuffer\n\n\t\tif ( isCube ) {\n\n\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = [];\n\n\t\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ][ level ] = _gl.createFramebuffer();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ i ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = [];\n\n\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\trenderTargetProperties.__webglFramebuffer[ level ] = _gl.createFramebuffer();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\trenderTargetProperties.__webglFramebuffer = _gl.createFramebuffer();\n\n\t\t\t}\n\n\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst attachmentProperties = properties.get( textures[ i ] );\n\n\t\t\t\t\tif ( attachmentProperties.__webglTexture === undefined ) {\n\n\t\t\t\t\t\tattachmentProperties.__webglTexture = _gl.createTexture();\n\n\t\t\t\t\t\tinfo.memory.textures ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ( renderTarget.samples > 0 ) && useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\trenderTargetProperties.__webglMultisampledFramebuffer = _gl.createFramebuffer();\n\t\t\t\trenderTargetProperties.__webglColorRenderbuffer = [];\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tconst texture = textures[ i ];\n\t\t\t\t\trenderTargetProperties.__webglColorRenderbuffer[ i ] = _gl.createRenderbuffer();\n\n\t\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\tconst glFormat = utils.convert( texture.format, texture.colorSpace );\n\t\t\t\t\tconst glType = utils.convert( texture.type );\n\t\t\t\t\tconst glInternalFormat = getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace, renderTarget.isXRRenderTarget === true );\n\t\t\t\t\tconst samples = getRenderTargetSamples( renderTarget );\n\t\t\t\t\t_gl.renderbufferStorageMultisample( _gl.RENDERBUFFER, samples, glInternalFormat, renderTarget.width, renderTarget.height );\n\n\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\t_gl.bindRenderbuffer( _gl.RENDERBUFFER, null );\n\n\t\t\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\trenderTargetProperties.__webglDepthRenderbuffer = _gl.createRenderbuffer();\n\t\t\t\t\tsetupRenderBufferStorage( renderTargetProperties.__webglDepthRenderbuffer, renderTarget, true );\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, null );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Setup color buffer\n\n\t\tif ( isCube ) {\n\n\t\t\tstate.bindTexture( _gl.TEXTURE_CUBE_MAP, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( _gl.TEXTURE_CUBE_MAP, texture );\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ][ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, level );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ i ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( _gl.TEXTURE_CUBE_MAP );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else if ( isMultipleRenderTargets ) {\n\n\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\tconst attachment = textures[ i ];\n\t\t\t\tconst attachmentProperties = properties.get( attachment );\n\n\t\t\t\tlet glTextureType = _gl.TEXTURE_2D;\n\n\t\t\t\tif ( renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {\n\n\t\t\t\t\tglTextureType = renderTarget.isWebGL3DRenderTarget ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindTexture( glTextureType, attachmentProperties.__webglTexture );\n\t\t\t\tsetTextureParameters( glTextureType, attachment );\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, attachment, _gl.COLOR_ATTACHMENT0 + i, glTextureType, 0 );\n\n\t\t\t\tif ( textureNeedsGenerateMipmaps( attachment ) ) {\n\n\t\t\t\t\tgenerateMipmap( glTextureType );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t} else {\n\n\t\t\tlet glTextureType = _gl.TEXTURE_2D;\n\n\t\t\tif ( renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {\n\n\t\t\t\tglTextureType = renderTarget.isWebGL3DRenderTarget ? _gl.TEXTURE_3D : _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t}\n\n\t\t\tstate.bindTexture( glTextureType, textureProperties.__webglTexture );\n\t\t\tsetTextureParameters( glTextureType, texture );\n\n\t\t\tif ( texture.mipmaps && texture.mipmaps.length > 0 ) {\n\n\t\t\t\tfor ( let level = 0; level < texture.mipmaps.length; level ++ ) {\n\n\t\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer[ level ], renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, level );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tsetupFrameBufferTexture( renderTargetProperties.__webglFramebuffer, renderTarget, texture, _gl.COLOR_ATTACHMENT0, glTextureType, 0 );\n\n\t\t\t}\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tgenerateMipmap( glTextureType );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t}\n\n\t\t// Setup depth and stencil buffers\n\n\t\tif ( renderTarget.depthBuffer ) {\n\n\t\t\tsetupDepthRenderbuffer( renderTarget );\n\n\t\t}\n\n\t}\n\n\tfunction updateRenderTargetMipmap( renderTarget ) {\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\tconst texture = textures[ i ];\n\n\t\t\tif ( textureNeedsGenerateMipmaps( texture ) ) {\n\n\t\t\t\tconst targetType = getTargetType( renderTarget );\n\t\t\t\tconst webglTexture = properties.get( texture ).__webglTexture;\n\n\t\t\t\tstate.bindTexture( targetType, webglTexture );\n\t\t\t\tgenerateMipmap( targetType );\n\t\t\t\tstate.unbindTexture();\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tconst invalidationArrayRead = [];\n\tconst invalidationArrayDraw = [];\n\n\tfunction updateMultisampleRenderTarget( renderTarget ) {\n\n\t\tif ( renderTarget.samples > 0 ) {\n\n\t\t\tif ( useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\tconst textures = renderTarget.textures;\n\t\t\t\tconst width = renderTarget.width;\n\t\t\t\tconst height = renderTarget.height;\n\t\t\t\tlet mask = _gl.COLOR_BUFFER_BIT;\n\t\t\t\tconst depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\t\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\t\tconst isMultipleRenderTargets = ( textures.length > 1 );\n\n\t\t\t\t// If MRT we need to remove FBO attachments\n\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, null );\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, null, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t\tconst mipmaps = renderTarget.texture.mipmaps;\n\n\t\t\t\tif ( mipmaps && mipmaps.length > 0 ) {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer[ 0 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tif ( renderTarget.resolveDepthBuffer ) {\n\n\t\t\t\t\t\tif ( renderTarget.depthBuffer ) mask |= _gl.DEPTH_BUFFER_BIT;\n\n\t\t\t\t\t\t// resolving stencil is slow with a D3D backend. disable it for all transmission render targets (see #27799)\n\n\t\t\t\t\t\tif ( renderTarget.stencilBuffer && renderTarget.resolveStencilBuffer ) mask |= _gl.STENCIL_BUFFER_BIT;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\t\tconst webglTexture = properties.get( textures[ i ] ).__webglTexture;\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, webglTexture, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_gl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, _gl.NEAREST );\n\n\t\t\t\t\tif ( supportsInvalidateFramebuffer === true ) {\n\n\t\t\t\t\t\tinvalidationArrayRead.length = 0;\n\t\t\t\t\t\tinvalidationArrayDraw.length = 0;\n\n\t\t\t\t\t\tinvalidationArrayRead.push( _gl.COLOR_ATTACHMENT0 + i );\n\n\t\t\t\t\t\tif ( renderTarget.depthBuffer && renderTarget.resolveDepthBuffer === false ) {\n\n\t\t\t\t\t\t\tinvalidationArrayRead.push( depthStyle );\n\t\t\t\t\t\t\tinvalidationArrayDraw.push( depthStyle );\n\n\t\t\t\t\t\t\t_gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, invalidationArrayDraw );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t_gl.invalidateFramebuffer( _gl.READ_FRAMEBUFFER, invalidationArrayRead );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );\n\n\t\t\t\t// If MRT since pre-blit we removed the FBO we need to reconstruct the attachments\n\t\t\t\tif ( isMultipleRenderTargets ) {\n\n\t\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\t\t\t\t\t\t_gl.framebufferRenderbuffer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.RENDERBUFFER, renderTargetProperties.__webglColorRenderbuffer[ i ] );\n\n\t\t\t\t\t\tconst webglTexture = properties.get( textures[ i ] ).__webglTexture;\n\n\t\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, _gl.TEXTURE_2D, webglTexture, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, renderTargetProperties.__webglMultisampledFramebuffer );\n\n\t\t\t} else {\n\n\t\t\t\tif ( renderTarget.depthBuffer && renderTarget.resolveDepthBuffer === false && supportsInvalidateFramebuffer ) {\n\n\t\t\t\t\tconst depthStyle = renderTarget.stencilBuffer ? _gl.DEPTH_STENCIL_ATTACHMENT : _gl.DEPTH_ATTACHMENT;\n\n\t\t\t\t\t_gl.invalidateFramebuffer( _gl.DRAW_FRAMEBUFFER, [ depthStyle ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction getRenderTargetSamples( renderTarget ) {\n\n\t\treturn Math.min( capabilities.maxSamples, renderTarget.samples );\n\n\t}\n\n\tfunction useMultisampledRTT( renderTarget ) {\n\n\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\treturn renderTarget.samples > 0 && extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTargetProperties.__useRenderToTexture !== false;\n\n\t}\n\n\tfunction updateVideoTexture( texture ) {\n\n\t\tconst frame = info.render.frame;\n\n\t\t// Check the last frame we updated the VideoTexture\n\n\t\tif ( _videoTextures.get( texture ) !== frame ) {\n\n\t\t\t_videoTextures.set( texture, frame );\n\t\t\ttexture.update();\n\n\t\t}\n\n\t}\n\n\tfunction verifyColorSpace( texture, image ) {\n\n\t\tconst colorSpace = texture.colorSpace;\n\t\tconst format = texture.format;\n\t\tconst type = texture.type;\n\n\t\tif ( texture.isCompressedTexture === true || texture.isVideoTexture === true ) return image;\n\n\t\tif ( colorSpace !== LinearSRGBColorSpace && colorSpace !== NoColorSpace ) {\n\n\t\t\t// sRGB\n\n\t\t\tif ( ColorManagement.getTransfer( colorSpace ) === SRGBTransfer ) {\n\n\t\t\t\t// in WebGL 2 uncompressed textures can only be sRGB encoded if they have the RGBA8 format\n\n\t\t\t\tif ( format !== RGBAFormat || type !== UnsignedByteType ) {\n\n\t\t\t\t\twarn( 'WebGLTextures: sRGB encoded textures have to use RGBAFormat and UnsignedByteType.' );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\terror( 'WebGLTextures: Unsupported texture color space:', colorSpace );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn image;\n\n\t}\n\n\tfunction getDimensions( image ) {\n\n\t\tif ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) {\n\n\t\t\t// if intrinsic data are not available, fallback to width/height\n\n\t\t\t_imageDimensions.width = image.naturalWidth || image.width;\n\t\t\t_imageDimensions.height = image.naturalHeight || image.height;\n\n\t\t} else if ( typeof VideoFrame !== 'undefined' && image instanceof VideoFrame ) {\n\n\t\t\t_imageDimensions.width = image.displayWidth;\n\t\t\t_imageDimensions.height = image.displayHeight;\n\n\t\t} else {\n\n\t\t\t_imageDimensions.width = image.width;\n\t\t\t_imageDimensions.height = image.height;\n\n\t\t}\n\n\t\treturn _imageDimensions;\n\n\t}\n\n\t//\n\n\tthis.allocateTextureUnit = allocateTextureUnit;\n\tthis.resetTextureUnits = resetTextureUnits;\n\n\tthis.setTexture2D = setTexture2D;\n\tthis.setTexture2DArray = setTexture2DArray;\n\tthis.setTexture3D = setTexture3D;\n\tthis.setTextureCube = setTextureCube;\n\tthis.rebindTextures = rebindTextures;\n\tthis.setupRenderTarget = setupRenderTarget;\n\tthis.updateRenderTargetMipmap = updateRenderTargetMipmap;\n\tthis.updateMultisampleRenderTarget = updateMultisampleRenderTarget;\n\tthis.setupDepthRenderbuffer = setupDepthRenderbuffer;\n\tthis.setupFrameBufferTexture = setupFrameBufferTexture;\n\tthis.useMultisampledRTT = useMultisampledRTT;\n\n\tthis.isReversedDepthBuffer = function () {\n\n\t\treturn state.buffers.depth.getReversed();\n\n\t};\n\n}\n\nfunction WebGLUtils( gl, extensions ) {\n\n\tfunction convert( p, colorSpace = NoColorSpace ) {\n\n\t\tlet extension;\n\n\t\tconst transfer = ColorManagement.getTransfer( colorSpace );\n\n\t\tif ( p === UnsignedByteType ) return gl.UNSIGNED_BYTE;\n\t\tif ( p === UnsignedShort4444Type ) return gl.UNSIGNED_SHORT_4_4_4_4;\n\t\tif ( p === UnsignedShort5551Type ) return gl.UNSIGNED_SHORT_5_5_5_1;\n\t\tif ( p === UnsignedInt5999Type ) return gl.UNSIGNED_INT_5_9_9_9_REV;\n\t\tif ( p === UnsignedInt101111Type ) return gl.UNSIGNED_INT_10F_11F_11F_REV;\n\n\t\tif ( p === ByteType ) return gl.BYTE;\n\t\tif ( p === ShortType ) return gl.SHORT;\n\t\tif ( p === UnsignedShortType ) return gl.UNSIGNED_SHORT;\n\t\tif ( p === IntType ) return gl.INT;\n\t\tif ( p === UnsignedIntType ) return gl.UNSIGNED_INT;\n\t\tif ( p === FloatType ) return gl.FLOAT;\n\t\tif ( p === HalfFloatType ) return gl.HALF_FLOAT;\n\n\t\tif ( p === AlphaFormat ) return gl.ALPHA;\n\t\tif ( p === RGBFormat ) return gl.RGB;\n\t\tif ( p === RGBAFormat ) return gl.RGBA;\n\t\tif ( p === DepthFormat ) return gl.DEPTH_COMPONENT;\n\t\tif ( p === DepthStencilFormat ) return gl.DEPTH_STENCIL;\n\n\t\t// WebGL2 formats.\n\n\t\tif ( p === RedFormat ) return gl.RED;\n\t\tif ( p === RedIntegerFormat ) return gl.RED_INTEGER;\n\t\tif ( p === RGFormat ) return gl.RG;\n\t\tif ( p === RGIntegerFormat ) return gl.RG_INTEGER;\n\t\tif ( p === RGBAIntegerFormat ) return gl.RGBA_INTEGER;\n\n\t\t// S3TC\n\n\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\tif ( transfer === SRGBTransfer ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc_srgb' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// PVRTC\n\n\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ETC\n\n\t\tif ( p === RGB_ETC1_Format || p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format || p === R11_EAC_Format || p === SIGNED_R11_EAC_Format || p === RG11_EAC_Format || p === SIGNED_RG11_EAC_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_ETC1_Format || p === RGB_ETC2_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2;\n\t\t\t\tif ( p === RGBA_ETC2_EAC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : extension.COMPRESSED_RGBA8_ETC2_EAC;\n\t\t\t\tif ( p === R11_EAC_Format ) return extension.COMPRESSED_R11_EAC;\n\t\t\t\tif ( p === SIGNED_R11_EAC_Format ) return extension.COMPRESSED_SIGNED_R11_EAC;\n\t\t\t\tif ( p === RG11_EAC_Format ) return extension.COMPRESSED_RG11_EAC;\n\t\t\t\tif ( p === SIGNED_RG11_EAC_Format ) return extension.COMPRESSED_SIGNED_RG11_EAC;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ASTC\n\n\t\tif ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format ||\n\t\t\tp === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format ||\n\t\t\tp === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format ||\n\t\t\tp === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format ||\n\t\t\tp === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_astc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_ASTC_4x4_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR : extension.COMPRESSED_RGBA_ASTC_4x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x4_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR : extension.COMPRESSED_RGBA_ASTC_5x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR : extension.COMPRESSED_RGBA_ASTC_5x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR : extension.COMPRESSED_RGBA_ASTC_6x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR : extension.COMPRESSED_RGBA_ASTC_6x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR : extension.COMPRESSED_RGBA_ASTC_8x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR : extension.COMPRESSED_RGBA_ASTC_8x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x8_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR : extension.COMPRESSED_RGBA_ASTC_8x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR : extension.COMPRESSED_RGBA_ASTC_10x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR : extension.COMPRESSED_RGBA_ASTC_10x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x8_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR : extension.COMPRESSED_RGBA_ASTC_10x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x10_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR : extension.COMPRESSED_RGBA_ASTC_10x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x10_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR : extension.COMPRESSED_RGBA_ASTC_12x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x12_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR : extension.COMPRESSED_RGBA_ASTC_12x12_KHR;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// BPTC\n\n\t\tif ( p === RGBA_BPTC_Format || p === RGB_BPTC_SIGNED_Format || p === RGB_BPTC_UNSIGNED_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_bptc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_BPTC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT : extension.COMPRESSED_RGBA_BPTC_UNORM_EXT;\n\t\t\t\tif ( p === RGB_BPTC_SIGNED_Format ) return extension.COMPRESSED_RGB_BPTC_SIGNED_FLOAT_EXT;\n\t\t\t\tif ( p === RGB_BPTC_UNSIGNED_Format ) return extension.COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// RGTC\n\n\t\tif ( p === RED_RGTC1_Format || p === SIGNED_RED_RGTC1_Format || p === RED_GREEN_RGTC2_Format || p === SIGNED_RED_GREEN_RGTC2_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_rgtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RED_RGTC1_Format ) return extension.COMPRESSED_RED_RGTC1_EXT;\n\t\t\t\tif ( p === SIGNED_RED_RGTC1_Format ) return extension.COMPRESSED_SIGNED_RED_RGTC1_EXT;\n\t\t\t\tif ( p === RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_RED_GREEN_RGTC2_EXT;\n\t\t\t\tif ( p === SIGNED_RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( p === UnsignedInt248Type ) return gl.UNSIGNED_INT_24_8;\n\n\t\t// if \"p\" can't be resolved, assume the user defines a WebGL constant as a string (fallback/workaround for packed RGB formats)\n\n\t\treturn ( gl[ p ] !== undefined ) ? gl[ p ] : null;\n\n\t}\n\n\treturn { convert: convert };\n\n}\n\nconst _occlusion_vertex = `\nvoid main() {\n\n\tgl_Position = vec4( position, 1.0 );\n\n}`;\n\nconst _occlusion_fragment = `\nuniform sampler2DArray depthColor;\nuniform float depthWidth;\nuniform float depthHeight;\n\nvoid main() {\n\n\tvec2 coord = vec2( gl_FragCoord.x / depthWidth, gl_FragCoord.y / depthHeight );\n\n\tif ( coord.x >= 1.0 ) {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x - 1.0, coord.y, 1 ) ).r;\n\n\t} else {\n\n\t\tgl_FragDepth = texture( depthColor, vec3( coord.x, coord.y, 0 ) ).r;\n\n\t}\n\n}`;\n\n/**\n * A XR module that manages the access to the Depth Sensing API.\n */\nclass WebXRDepthSensing {\n\n\t/**\n\t * Constructs a new depth sensing module.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * An opaque texture representing the depth of the user's environment.\n\t\t *\n\t\t * @type {?ExternalTexture}\n\t\t */\n\t\tthis.texture = null;\n\n\t\t/**\n\t\t * A plane mesh for visualizing the depth texture.\n\t\t *\n\t\t * @type {?Mesh}\n\t\t */\n\t\tthis.mesh = null;\n\n\t\t/**\n\t\t * The depth near value.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.depthNear = 0;\n\n\t\t/**\n\t\t * The depth near far.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.depthFar = 0;\n\n\t}\n\n\t/**\n\t * Inits the depth sensing module\n\t *\n\t * @param {XRWebGLDepthInformation} depthData - The XR depth data.\n\t * @param {XRRenderState} renderState - The XR render state.\n\t */\n\tinit( depthData, renderState ) {\n\n\t\tif ( this.texture === null ) {\n\n\t\t\tconst texture = new ExternalTexture( depthData.texture );\n\n\t\t\tif ( ( depthData.depthNear !== renderState.depthNear ) || ( depthData.depthFar !== renderState.depthFar ) ) {\n\n\t\t\t\tthis.depthNear = depthData.depthNear;\n\t\t\t\tthis.depthFar = depthData.depthFar;\n\n\t\t\t}\n\n\t\t\tthis.texture = texture;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a plane mesh that visualizes the depth texture.\n\t *\n\t * @param {ArrayCamera} cameraXR - The XR camera.\n\t * @return {?Mesh} The plane mesh.\n\t */\n\tgetMesh( cameraXR ) {\n\n\t\tif ( this.texture !== null ) {\n\n\t\t\tif ( this.mesh === null ) {\n\n\t\t\t\tconst viewport = cameraXR.cameras[ 0 ].viewport;\n\t\t\t\tconst material = new ShaderMaterial( {\n\t\t\t\t\tvertexShader: _occlusion_vertex,\n\t\t\t\t\tfragmentShader: _occlusion_fragment,\n\t\t\t\t\tuniforms: {\n\t\t\t\t\t\tdepthColor: { value: this.texture },\n\t\t\t\t\t\tdepthWidth: { value: viewport.z },\n\t\t\t\t\t\tdepthHeight: { value: viewport.w }\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tthis.mesh = new Mesh( new PlaneGeometry( 20, 20 ), material );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this.mesh;\n\n\t}\n\n\t/**\n\t * Resets the module\n\t */\n\treset() {\n\n\t\tthis.texture = null;\n\t\tthis.mesh = null;\n\n\t}\n\n\t/**\n\t * Returns a texture representing the depth of the user's environment.\n\t *\n\t * @return {?ExternalTexture} The depth texture.\n\t */\n\tgetDepthTexture() {\n\n\t\treturn this.texture;\n\n\t}\n\n}\n\n/**\n * This class represents an abstraction of the WebXR Device API and is\n * internally used by {@link WebGLRenderer}. `WebXRManager` also provides a public\n * interface that allows users to enable/disable XR and perform XR related\n * tasks like for instance retrieving controllers.\n *\n * @augments EventDispatcher\n * @hideconstructor\n */\nclass WebXRManager extends EventDispatcher {\n\n\t/**\n\t * Constructs a new WebGL renderer.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGL2RenderingContext} gl - The rendering context.\n\t */\n\tconstructor( renderer, gl ) {\n\n\t\tsuper();\n\n\t\tconst scope = this;\n\n\t\tlet session = null;\n\n\t\tlet framebufferScaleFactor = 1.0;\n\n\t\tlet referenceSpace = null;\n\t\tlet referenceSpaceType = 'local-floor';\n\t\t// Set default foveation to maximum.\n\t\tlet foveation = 1.0;\n\t\tlet customReferenceSpace = null;\n\n\t\tlet pose = null;\n\t\tlet glBinding = null;\n\t\tlet glProjLayer = null;\n\t\tlet glBaseLayer = null;\n\t\tlet xrFrame = null;\n\n\t\tconst supportsGlBinding = typeof XRWebGLBinding !== 'undefined';\n\n\t\tconst depthSensing = new WebXRDepthSensing();\n\t\tconst cameraAccessTextures = {};\n\t\tconst attributes = gl.getContextAttributes();\n\n\t\tlet initialRenderTarget = null;\n\t\tlet newRenderTarget = null;\n\n\t\tconst controllers = [];\n\t\tconst controllerInputSources = [];\n\n\t\tconst currentSize = new Vector2();\n\t\tlet currentPixelRatio = null;\n\n\t\t//\n\n\t\tconst cameraL = new PerspectiveCamera();\n\t\tcameraL.viewport = new Vector4();\n\n\t\tconst cameraR = new PerspectiveCamera();\n\t\tcameraR.viewport = new Vector4();\n\n\t\tconst cameras = [ cameraL, cameraR ];\n\n\t\tconst cameraXR = new ArrayCamera();\n\n\t\tlet _currentDepthNear = null;\n\t\tlet _currentDepthFar = null;\n\n\t\t//\n\n\t\t/**\n\t\t * Whether the manager's XR camera should be automatically updated or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.cameraAutoUpdate = true;\n\n\t\t/**\n\t\t * This flag notifies the renderer to be ready for XR rendering. Set it to `true`\n\t\t * if you are going to use XR in your app.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.enabled = false;\n\n\t\t/**\n\t\t * Whether XR presentation is active or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isPresenting = false;\n\n\t\t/**\n\t\t * Returns a group representing the `target ray` space of the XR controller.\n\t\t * Use this space for visualizing 3D objects that support the user in pointing\n\t\t * tasks like UI interaction.\n\t\t *\n\t\t * @param {number} index - The index of the controller.\n\t\t * @return {Group} A group representing the `target ray` space.\n\t\t */\n\t\tthis.getController = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getTargetRaySpace();\n\n\t\t};\n\n\t\t/**\n\t\t * Returns a group representing the `grip` space of the XR controller.\n\t\t * Use this space for visualizing 3D objects that support the user in pointing\n\t\t * tasks like UI interaction.\n\t\t *\n\t\t * Note: If you want to show something in the user's hand AND offer a\n\t\t * pointing ray at the same time, you'll want to attached the handheld object\n\t\t * to the group returned by `getControllerGrip()` and the ray to the\n\t\t * group returned by `getController()`. The idea is to have two\n\t\t * different groups in two different coordinate spaces for the same WebXR\n\t\t * controller.\n\t\t *\n\t\t * @param {number} index - The index of the controller.\n\t\t * @return {Group} A group representing the `grip` space.\n\t\t */\n\t\tthis.getControllerGrip = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getGripSpace();\n\n\t\t};\n\n\t\t/**\n\t\t * Returns a group representing the `hand` space of the XR controller.\n\t\t * Use this space for visualizing 3D objects that support the user in pointing\n\t\t * tasks like UI interaction.\n\t\t *\n\t\t * @param {number} index - The index of the controller.\n\t\t * @return {Group} A group representing the `hand` space.\n\t\t */\n\t\tthis.getHand = function ( index ) {\n\n\t\t\tlet controller = controllers[ index ];\n\n\t\t\tif ( controller === undefined ) {\n\n\t\t\t\tcontroller = new WebXRController();\n\t\t\t\tcontrollers[ index ] = controller;\n\n\t\t\t}\n\n\t\t\treturn controller.getHandSpace();\n\n\t\t};\n\n\t\t//\n\n\t\tfunction onSessionEvent( event ) {\n\n\t\t\tconst controllerIndex = controllerInputSources.indexOf( event.inputSource );\n\n\t\t\tif ( controllerIndex === -1 ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst controller = controllers[ controllerIndex ];\n\n\t\t\tif ( controller !== undefined ) {\n\n\t\t\t\tcontroller.update( event.inputSource, event.frame, customReferenceSpace || referenceSpace );\n\t\t\t\tcontroller.dispatchEvent( { type: event.type, data: event.inputSource } );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction onSessionEnd() {\n\n\t\t\tsession.removeEventListener( 'select', onSessionEvent );\n\t\t\tsession.removeEventListener( 'selectstart', onSessionEvent );\n\t\t\tsession.removeEventListener( 'selectend', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeeze', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeezestart', onSessionEvent );\n\t\t\tsession.removeEventListener( 'squeezeend', onSessionEvent );\n\t\t\tsession.removeEventListener( 'end', onSessionEnd );\n\t\t\tsession.removeEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst inputSource = controllerInputSources[ i ];\n\n\t\t\t\tif ( inputSource === null ) continue;\n\n\t\t\t\tcontrollerInputSources[ i ] = null;\n\n\t\t\t\tcontrollers[ i ].disconnect( inputSource );\n\n\t\t\t}\n\n\t\t\t_currentDepthNear = null;\n\t\t\t_currentDepthFar = null;\n\n\t\t\tdepthSensing.reset();\n\t\t\tfor ( const key in cameraAccessTextures ) {\n\n\t\t\t\tdelete cameraAccessTextures[ key ];\n\n\t\t\t}\n\n\t\t\t// restore framebuffer/rendering state\n\n\t\t\trenderer.setRenderTarget( initialRenderTarget );\n\n\t\t\tglBaseLayer = null;\n\t\t\tglProjLayer = null;\n\t\t\tglBinding = null;\n\t\t\tsession = null;\n\t\t\tnewRenderTarget = null;\n\n\t\t\t//\n\n\t\t\tanimation.stop();\n\n\t\t\tscope.isPresenting = false;\n\n\t\t\trenderer.setPixelRatio( currentPixelRatio );\n\t\t\trenderer.setSize( currentSize.width, currentSize.height, false );\n\n\t\t\tscope.dispatchEvent( { type: 'sessionend' } );\n\n\t\t}\n\n\t\t/**\n\t\t * Sets the framebuffer scale factor.\n\t\t *\n\t\t * This method can not be used during a XR session.\n\t\t *\n\t\t * @param {number} value - The framebuffer scale factor.\n\t\t */\n\t\tthis.setFramebufferScaleFactor = function ( value ) {\n\n\t\t\tframebufferScaleFactor = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\twarn( 'WebXRManager: Cannot change framebuffer scale while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the reference space type. Can be used to configure a spatial relationship with the user's physical\n\t\t * environment. Depending on how the user moves in 3D space, setting an appropriate reference space can\n\t\t * improve tracking. Default is `local-floor`. Valid values can be found here\n\t\t * https://developer.mozilla.org/en-US/docs/Web/API/XRReferenceSpace#reference_space_types.\n\t\t *\n\t\t * This method can not be used during a XR session.\n\t\t *\n\t\t * @param {string} value - The reference space type.\n\t\t */\n\t\tthis.setReferenceSpaceType = function ( value ) {\n\n\t\t\treferenceSpaceType = value;\n\n\t\t\tif ( scope.isPresenting === true ) {\n\n\t\t\t\twarn( 'WebXRManager: Cannot change reference space type while presenting.' );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the XR reference space.\n\t\t *\n\t\t * @return {XRReferenceSpace} The XR reference space.\n\t\t */\n\t\tthis.getReferenceSpace = function () {\n\n\t\t\treturn customReferenceSpace || referenceSpace;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets a custom XR reference space.\n\t\t *\n\t\t * @param {XRReferenceSpace} space - The XR reference space.\n\t\t */\n\t\tthis.setReferenceSpace = function ( space ) {\n\n\t\t\tcustomReferenceSpace = space;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current base layer.\n\t\t *\n\t\t * This is an `XRProjectionLayer` when the targeted XR device supports the\n\t\t * WebXR Layers API, or an `XRWebGLLayer` otherwise.\n\t\t *\n\t\t * @return {?(XRWebGLLayer|XRProjectionLayer)} The XR base layer.\n\t\t */\n\t\tthis.getBaseLayer = function () {\n\n\t\t\treturn glProjLayer !== null ? glProjLayer : glBaseLayer;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current XR binding.\n\t\t *\n\t\t * Creates a new binding if needed and the browser is\n\t\t * capable of doing so.\n\t\t *\n\t\t * @return {?XRWebGLBinding} The XR binding. Returns `null` if one cannot be created.\n\t\t */\n\t\tthis.getBinding = function () {\n\n\t\t\tif ( glBinding === null && supportsGlBinding ) {\n\n\t\t\t\tglBinding = new XRWebGLBinding( session, gl );\n\n\t\t\t}\n\n\t\t\treturn glBinding;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current XR frame.\n\t\t *\n\t\t * @return {?XRFrame} The XR frame. Returns `null` when used outside a XR session.\n\t\t */\n\t\tthis.getFrame = function () {\n\n\t\t\treturn xrFrame;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current XR session.\n\t\t *\n\t\t * @return {?XRSession} The XR session. Returns `null` when used outside a XR session.\n\t\t */\n\t\tthis.getSession = function () {\n\n\t\t\treturn session;\n\n\t\t};\n\n\t\t/**\n\t\t * After a XR session has been requested usually with one of the `*Button` modules, it\n\t\t * is injected into the renderer with this method. This method triggers the start of\n\t\t * the actual XR rendering.\n\t\t *\n\t\t * @async\n\t\t * @param {XRSession} value - The XR session to set.\n\t\t * @return {Promise} A Promise that resolves when the session has been set.\n\t\t */\n\t\tthis.setSession = async function ( value ) {\n\n\t\t\tsession = value;\n\n\t\t\tif ( session !== null ) {\n\n\t\t\t\tinitialRenderTarget = renderer.getRenderTarget();\n\n\t\t\t\tsession.addEventListener( 'select', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectstart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'selectend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeeze', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezestart', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'squeezeend', onSessionEvent );\n\t\t\t\tsession.addEventListener( 'end', onSessionEnd );\n\t\t\t\tsession.addEventListener( 'inputsourceschange', onInputSourcesChange );\n\n\t\t\t\tif ( attributes.xrCompatible !== true ) {\n\n\t\t\t\t\tawait gl.makeXRCompatible();\n\n\t\t\t\t}\n\n\t\t\t\tcurrentPixelRatio = renderer.getPixelRatio();\n\t\t\t\trenderer.getSize( currentSize );\n\n\n\t\t\t\t// Check that the browser implements the necessary APIs to use an\n\t\t\t\t// XRProjectionLayer rather than an XRWebGLLayer\n\t\t\t\tconst supportsLayers = supportsGlBinding && 'createProjectionLayer' in XRWebGLBinding.prototype;\n\n\t\t\t\tif ( ! supportsLayers ) {\n\n\t\t\t\t\tconst layerInit = {\n\t\t\t\t\t\tantialias: attributes.antialias,\n\t\t\t\t\t\talpha: true,\n\t\t\t\t\t\tdepth: attributes.depth,\n\t\t\t\t\t\tstencil: attributes.stencil,\n\t\t\t\t\t\tframebufferScaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBaseLayer = new XRWebGLLayer( session, gl, layerInit );\n\n\t\t\t\t\tsession.updateRenderState( { baseLayer: glBaseLayer } );\n\n\t\t\t\t\trenderer.setPixelRatio( 1 );\n\t\t\t\t\trenderer.setSize( glBaseLayer.framebufferWidth, glBaseLayer.framebufferHeight, false );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglBaseLayer.framebufferWidth,\n\t\t\t\t\t\tglBaseLayer.framebufferHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tcolorSpace: renderer.outputColorSpace,\n\t\t\t\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\t\t\t\tresolveDepthBuffer: ( glBaseLayer.ignoreDepthValues === false ),\n\t\t\t\t\t\t\tresolveStencilBuffer: ( glBaseLayer.ignoreDepthValues === false )\n\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlet depthFormat = null;\n\t\t\t\t\tlet depthType = null;\n\t\t\t\t\tlet glDepthFormat = null;\n\n\t\t\t\t\tif ( attributes.depth ) {\n\n\t\t\t\t\t\tglDepthFormat = attributes.stencil ? gl.DEPTH24_STENCIL8 : gl.DEPTH_COMPONENT24;\n\t\t\t\t\t\tdepthFormat = attributes.stencil ? DepthStencilFormat : DepthFormat;\n\t\t\t\t\t\tdepthType = attributes.stencil ? UnsignedInt248Type : UnsignedIntType;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst projectionlayerInit = {\n\t\t\t\t\t\tcolorFormat: gl.RGBA8,\n\t\t\t\t\t\tdepthFormat: glDepthFormat,\n\t\t\t\t\t\tscaleFactor: framebufferScaleFactor\n\t\t\t\t\t};\n\n\t\t\t\t\tglBinding = this.getBinding();\n\n\t\t\t\t\tglProjLayer = glBinding.createProjectionLayer( projectionlayerInit );\n\n\t\t\t\t\tsession.updateRenderState( { layers: [ glProjLayer ] } );\n\n\t\t\t\t\trenderer.setPixelRatio( 1 );\n\t\t\t\t\trenderer.setSize( glProjLayer.textureWidth, glProjLayer.textureHeight, false );\n\n\t\t\t\t\tnewRenderTarget = new WebGLRenderTarget(\n\t\t\t\t\t\tglProjLayer.textureWidth,\n\t\t\t\t\t\tglProjLayer.textureHeight,\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\t\tdepthTexture: new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat ),\n\t\t\t\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\t\t\t\tcolorSpace: renderer.outputColorSpace,\n\t\t\t\t\t\t\tsamples: attributes.antialias ? 4 : 0,\n\t\t\t\t\t\t\tresolveDepthBuffer: ( glProjLayer.ignoreDepthValues === false ),\n\t\t\t\t\t\t\tresolveStencilBuffer: ( glProjLayer.ignoreDepthValues === false )\n\t\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t\tnewRenderTarget.isXRRenderTarget = true; // TODO Remove this when possible, see #23278\n\n\t\t\t\tthis.setFoveation( foveation );\n\n\t\t\t\tcustomReferenceSpace = null;\n\t\t\t\treferenceSpace = await session.requestReferenceSpace( referenceSpaceType );\n\n\t\t\t\tanimation.setContext( session );\n\t\t\t\tanimation.start();\n\n\t\t\t\tscope.isPresenting = true;\n\n\t\t\t\tscope.dispatchEvent( { type: 'sessionstart' } );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the environment blend mode from the current XR session.\n\t\t *\n\t\t * @return {'opaque'|'additive'|'alpha-blend'|undefined} The environment blend mode. Returns `undefined` when used outside of a XR session.\n\t\t */\n\t\tthis.getEnvironmentBlendMode = function () {\n\n\t\t\tif ( session !== null ) {\n\n\t\t\t\treturn session.environmentBlendMode;\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current depth texture computed via depth sensing.\n\t\t *\n\t\t * See {@link WebXRDepthSensing#getDepthTexture}.\n\t\t *\n\t\t * @return {?Texture} The depth texture.\n\t\t */\n\t\tthis.getDepthTexture = function () {\n\n\t\t\treturn depthSensing.getDepthTexture();\n\n\t\t};\n\n\t\tfunction onInputSourcesChange( event ) {\n\n\t\t\t// Notify disconnected\n\n\t\t\tfor ( let i = 0; i < event.removed.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.removed[ i ];\n\t\t\t\tconst index = controllerInputSources.indexOf( inputSource );\n\n\t\t\t\tif ( index >= 0 ) {\n\n\t\t\t\t\tcontrollerInputSources[ index ] = null;\n\t\t\t\t\tcontrollers[ index ].disconnect( inputSource );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Notify connected\n\n\t\t\tfor ( let i = 0; i < event.added.length; i ++ ) {\n\n\t\t\t\tconst inputSource = event.added[ i ];\n\n\t\t\t\tlet controllerIndex = controllerInputSources.indexOf( inputSource );\n\n\t\t\t\tif ( controllerIndex === -1 ) {\n\n\t\t\t\t\t// Assign input source a controller that currently has no input source\n\n\t\t\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\t\t\tif ( i >= controllerInputSources.length ) {\n\n\t\t\t\t\t\t\tcontrollerInputSources.push( inputSource );\n\t\t\t\t\t\t\tcontrollerIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t} else if ( controllerInputSources[ i ] === null ) {\n\n\t\t\t\t\t\t\tcontrollerInputSources[ i ] = inputSource;\n\t\t\t\t\t\t\tcontrollerIndex = i;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// If all controllers do currently receive input we ignore new ones\n\n\t\t\t\t\tif ( controllerIndex === -1 ) break;\n\n\t\t\t\t}\n\n\t\t\t\tconst controller = controllers[ controllerIndex ];\n\n\t\t\t\tif ( controller ) {\n\n\t\t\t\t\tcontroller.connect( inputSource );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst cameraLPos = new Vector3();\n\t\tconst cameraRPos = new Vector3();\n\n\t\t/**\n\t\t * Assumes 2 cameras that are parallel and share an X-axis, and that\n\t\t * the cameras' projection and world matrices have already been set.\n\t\t * And that near and far planes are identical for both cameras.\n\t\t * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765\n\t\t *\n\t\t * @param {ArrayCamera} camera - The camera to update.\n\t\t * @param {PerspectiveCamera} cameraL - The left camera.\n\t\t * @param {PerspectiveCamera} cameraR - The right camera.\n\t\t */\n\t\tfunction setProjectionFromUnion( camera, cameraL, cameraR ) {\n\n\t\t\tcameraLPos.setFromMatrixPosition( cameraL.matrixWorld );\n\t\t\tcameraRPos.setFromMatrixPosition( cameraR.matrixWorld );\n\n\t\t\tconst ipd = cameraLPos.distanceTo( cameraRPos );\n\n\t\t\tconst projL = cameraL.projectionMatrix.elements;\n\t\t\tconst projR = cameraR.projectionMatrix.elements;\n\n\t\t\t// VR systems will have identical far and near planes, and\n\t\t\t// most likely identical top and bottom frustum extents.\n\t\t\t// Use the left camera for these values.\n\t\t\tconst near = projL[ 14 ] / ( projL[ 10 ] - 1 );\n\t\t\tconst far = projL[ 14 ] / ( projL[ 10 ] + 1 );\n\t\t\tconst topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ];\n\t\t\tconst bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ];\n\n\t\t\tconst leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ];\n\t\t\tconst rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ];\n\t\t\tconst left = near * leftFov;\n\t\t\tconst right = near * rightFov;\n\n\t\t\t// Calculate the new camera's position offset from the\n\t\t\t// left camera. xOffset should be roughly half `ipd`.\n\t\t\tconst zOffset = ipd / ( - leftFov + rightFov );\n\t\t\tconst xOffset = zOffset * - leftFov;\n\n\t\t\t// TODO: Better way to apply this offset?\n\t\t\tcameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.translateX( xOffset );\n\t\t\tcamera.translateZ( zOffset );\n\t\t\tcamera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t\t// Check if the projection uses an infinite far plane.\n\t\t\tif ( projL[ 10 ] === -1 ) {\n\n\t\t\t\t// Use the projection matrix from the left eye.\n\t\t\t\t// The camera offset is sufficient to include the view volumes\n\t\t\t\t// of both eyes (assuming symmetric projections).\n\t\t\t\tcamera.projectionMatrix.copy( cameraL.projectionMatrix );\n\t\t\t\tcamera.projectionMatrixInverse.copy( cameraL.projectionMatrixInverse );\n\n\t\t\t} else {\n\n\t\t\t\t// Find the union of the frustum values of the cameras and scale\n\t\t\t\t// the values so that the near plane's position does not change in world space,\n\t\t\t\t// although must now be relative to the new union camera.\n\t\t\t\tconst near2 = near + zOffset;\n\t\t\t\tconst far2 = far + zOffset;\n\t\t\t\tconst left2 = left - xOffset;\n\t\t\t\tconst right2 = right + ( ipd - xOffset );\n\t\t\t\tconst top2 = topFov * far / far2 * near2;\n\t\t\t\tconst bottom2 = bottomFov * far / far2 * near2;\n\n\t\t\t\tcamera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 );\n\t\t\t\tcamera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction updateCamera( camera, parent ) {\n\n\t\t\tif ( parent === null ) {\n\n\t\t\t\tcamera.matrixWorld.copy( camera.matrix );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix );\n\n\t\t\t}\n\n\t\t\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t\t}\n\n\t\t/**\n\t\t * Updates the state of the XR camera. Use this method on app level if you\n\t\t * set `cameraAutoUpdate` to `false`. The method requires the non-XR\n\t\t * camera of the scene as a parameter. The passed in camera's transformation\n\t\t * is automatically adjusted to the position of the XR camera when calling\n\t\t * this method.\n\t\t *\n\t\t * @param {Camera} camera - The camera.\n\t\t */\n\t\tthis.updateCamera = function ( camera ) {\n\n\t\t\tif ( session === null ) return;\n\n\t\t\tlet depthNear = camera.near;\n\t\t\tlet depthFar = camera.far;\n\n\t\t\tif ( depthSensing.texture !== null ) {\n\n\t\t\t\tif ( depthSensing.depthNear > 0 ) depthNear = depthSensing.depthNear;\n\t\t\t\tif ( depthSensing.depthFar > 0 ) depthFar = depthSensing.depthFar;\n\n\t\t\t}\n\n\t\t\tcameraXR.near = cameraR.near = cameraL.near = depthNear;\n\t\t\tcameraXR.far = cameraR.far = cameraL.far = depthFar;\n\n\t\t\tif ( _currentDepthNear !== cameraXR.near || _currentDepthFar !== cameraXR.far ) {\n\n\t\t\t\t// Note that the new renderState won't apply until the next frame. See #18320\n\n\t\t\t\tsession.updateRenderState( {\n\t\t\t\t\tdepthNear: cameraXR.near,\n\t\t\t\t\tdepthFar: cameraXR.far\n\t\t\t\t} );\n\n\t\t\t\t_currentDepthNear = cameraXR.near;\n\t\t\t\t_currentDepthFar = cameraXR.far;\n\n\t\t\t}\n\n\t\t\t// inherit camera layers and enable eye layers (1 = left, 2 = right)\n\t\t\tcameraXR.layers.mask = camera.layers.mask | 0b110;\n\t\t\tcameraL.layers.mask = cameraXR.layers.mask & 0b011;\n\t\t\tcameraR.layers.mask = cameraXR.layers.mask & 0b101;\n\n\t\t\tconst parent = camera.parent;\n\t\t\tconst cameras = cameraXR.cameras;\n\n\t\t\tupdateCamera( cameraXR, parent );\n\n\t\t\tfor ( let i = 0; i < cameras.length; i ++ ) {\n\n\t\t\t\tupdateCamera( cameras[ i ], parent );\n\n\t\t\t}\n\n\t\t\t// update projection matrix for proper view frustum culling\n\n\t\t\tif ( cameras.length === 2 ) {\n\n\t\t\t\tsetProjectionFromUnion( cameraXR, cameraL, cameraR );\n\n\t\t\t} else {\n\n\t\t\t\t// assume single camera setup (AR)\n\n\t\t\t\tcameraXR.projectionMatrix.copy( cameraL.projectionMatrix );\n\n\t\t\t}\n\n\t\t\t// update user camera and its children\n\n\t\t\tupdateUserCamera( camera, cameraXR, parent );\n\n\t\t};\n\n\t\tfunction updateUserCamera( camera, cameraXR, parent ) {\n\n\t\t\tif ( parent === null ) {\n\n\t\t\t\tcamera.matrix.copy( cameraXR.matrixWorld );\n\n\t\t\t} else {\n\n\t\t\t\tcamera.matrix.copy( parent.matrixWorld );\n\t\t\t\tcamera.matrix.invert();\n\t\t\t\tcamera.matrix.multiply( cameraXR.matrixWorld );\n\n\t\t\t}\n\n\t\t\tcamera.matrix.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.updateMatrixWorld( true );\n\n\t\t\tcamera.projectionMatrix.copy( cameraXR.projectionMatrix );\n\t\t\tcamera.projectionMatrixInverse.copy( cameraXR.projectionMatrixInverse );\n\n\t\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\t\tcamera.fov = RAD2DEG * 2 * Math.atan( 1 / camera.projectionMatrix.elements[ 5 ] );\n\t\t\t\tcamera.zoom = 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\t/**\n\t\t * Returns an instance of {@link ArrayCamera} which represents the XR camera\n\t\t * of the active XR session. For each view it holds a separate camera object.\n\t\t *\n\t\t * The camera's `fov` is currently not used and does not reflect the fov of\n\t\t * the XR camera. If you need the fov on app level, you have to compute in\n\t\t * manually from the XR camera's projection matrices.\n\t\t *\n\t\t * @return {ArrayCamera} The XR camera.\n\t\t */\n\t\tthis.getCamera = function () {\n\n\t\t\treturn cameraXR;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the amount of foveation used by the XR compositor for the projection layer.\n\t\t *\n\t\t * @return {number|undefined} The amount of foveation.\n\t\t */\n\t\tthis.getFoveation = function () {\n\n\t\t\tif ( glProjLayer === null && glBaseLayer === null ) {\n\n\t\t\t\treturn undefined;\n\n\t\t\t}\n\n\t\t\treturn foveation;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the foveation value.\n\t\t *\n\t\t * @param {number} value - A number in the range `[0,1]` where `0` means no foveation (full resolution)\n\t\t * and `1` means maximum foveation (the edges render at lower resolution).\n\t\t */\n\t\tthis.setFoveation = function ( value ) {\n\n\t\t\t// 0 = no foveation = full resolution\n\t\t\t// 1 = maximum foveation = the edges render at lower resolution\n\n\t\t\tfoveation = value;\n\n\t\t\tif ( glProjLayer !== null ) {\n\n\t\t\t\tglProjLayer.fixedFoveation = value;\n\n\t\t\t}\n\n\t\t\tif ( glBaseLayer !== null && glBaseLayer.fixedFoveation !== undefined ) {\n\n\t\t\t\tglBaseLayer.fixedFoveation = value;\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Returns `true` if depth sensing is supported.\n\t\t *\n\t\t * @return {boolean} Whether depth sensing is supported or not.\n\t\t */\n\t\tthis.hasDepthSensing = function () {\n\n\t\t\treturn depthSensing.texture !== null;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the depth sensing mesh.\n\t\t *\n\t\t * See {@link WebXRDepthSensing#getMesh}.\n\t\t *\n\t\t * @return {Mesh} The depth sensing mesh.\n\t\t */\n\t\tthis.getDepthSensingMesh = function () {\n\n\t\t\treturn depthSensing.getMesh( cameraXR );\n\n\t\t};\n\n\t\t/**\n\t\t * Retrieves an opaque texture from the view-aligned {@link XRCamera}.\n\t\t * Only available during the current animation loop.\n\t\t *\n\t\t * @param {XRCamera} xrCamera - The camera to query.\n\t\t * @return {?Texture} An opaque texture representing the current raw camera frame.\n\t\t */\n\t\tthis.getCameraTexture = function ( xrCamera ) {\n\n\t\t\treturn cameraAccessTextures[ xrCamera ];\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tlet onAnimationFrameCallback = null;\n\n\t\tfunction onAnimationFrame( time, frame ) {\n\n\t\t\tpose = frame.getViewerPose( customReferenceSpace || referenceSpace );\n\t\t\txrFrame = frame;\n\n\t\t\tif ( pose !== null ) {\n\n\t\t\t\tconst views = pose.views;\n\n\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\trenderer.setRenderTargetFramebuffer( newRenderTarget, glBaseLayer.framebuffer );\n\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t}\n\n\t\t\t\tlet cameraXRNeedsUpdate = false;\n\n\t\t\t\t// check if it's necessary to rebuild cameraXR's camera list\n\n\t\t\t\tif ( views.length !== cameraXR.cameras.length ) {\n\n\t\t\t\t\tcameraXR.cameras.length = 0;\n\t\t\t\t\tcameraXRNeedsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < views.length; i ++ ) {\n\n\t\t\t\t\tconst view = views[ i ];\n\n\t\t\t\t\tlet viewport = null;\n\n\t\t\t\t\tif ( glBaseLayer !== null ) {\n\n\t\t\t\t\t\tviewport = glBaseLayer.getViewport( view );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst glSubImage = glBinding.getViewSubImage( glProjLayer, view );\n\t\t\t\t\t\tviewport = glSubImage.viewport;\n\n\t\t\t\t\t\t// For side-by-side projection, we only produce a single texture for both eyes.\n\t\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\t\trenderer.setRenderTargetTextures(\n\t\t\t\t\t\t\t\tnewRenderTarget,\n\t\t\t\t\t\t\t\tglSubImage.colorTexture,\n\t\t\t\t\t\t\t\tglSubImage.depthStencilTexture );\n\n\t\t\t\t\t\t\trenderer.setRenderTarget( newRenderTarget );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet camera = cameras[ i ];\n\n\t\t\t\t\tif ( camera === undefined ) {\n\n\t\t\t\t\t\tcamera = new PerspectiveCamera();\n\t\t\t\t\t\tcamera.layers.enable( i );\n\t\t\t\t\t\tcamera.viewport = new Vector4();\n\t\t\t\t\t\tcameras[ i ] = camera;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcamera.matrix.fromArray( view.transform.matrix );\n\t\t\t\t\tcamera.matrix.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\t\t\tcamera.projectionMatrix.fromArray( view.projectionMatrix );\n\t\t\t\t\tcamera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();\n\t\t\t\t\tcamera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );\n\n\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\tcameraXR.matrix.copy( camera.matrix );\n\t\t\t\t\t\tcameraXR.matrix.decompose( cameraXR.position, cameraXR.quaternion, cameraXR.scale );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( cameraXRNeedsUpdate === true ) {\n\n\t\t\t\t\t\tcameraXR.cameras.push( camera );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t//\n\n\t\t\t\tconst enabledFeatures = session.enabledFeatures;\n\t\t\t\tconst gpuDepthSensingEnabled = enabledFeatures &&\n\t\t\t\t\tenabledFeatures.includes( 'depth-sensing' ) &&\n\t\t\t\t\tsession.depthUsage == 'gpu-optimized';\n\n\t\t\t\tif ( gpuDepthSensingEnabled && supportsGlBinding ) {\n\n\t\t\t\t\tglBinding = scope.getBinding();\n\n\t\t\t\t\tconst depthData = glBinding.getDepthInformation( views[ 0 ] );\n\n\t\t\t\t\tif ( depthData && depthData.isValid && depthData.texture ) {\n\n\t\t\t\t\t\tdepthSensing.init( depthData, session.renderState );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst cameraAccessEnabled = enabledFeatures &&\n\t\t\t\t    enabledFeatures.includes( 'camera-access' );\n\n\t\t\t\tif ( cameraAccessEnabled && supportsGlBinding ) {\n\n\t\t\t\t\trenderer.state.unbindTexture();\n\n\t\t\t\t\tglBinding = scope.getBinding();\n\n\t\t\t\t\tfor ( let i = 0; i < views.length; i ++ ) {\n\n\t\t\t\t\t\tconst camera = views[ i ].camera;\n\n\t\t\t\t\t\tif ( camera ) {\n\n\t\t\t\t\t\t\tlet cameraTex = cameraAccessTextures[ camera ];\n\n\t\t\t\t\t\t\tif ( ! cameraTex ) {\n\n\t\t\t\t\t\t\t\tcameraTex = new ExternalTexture();\n\t\t\t\t\t\t\t\tcameraAccessTextures[ camera ] = cameraTex;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst glTexture = glBinding.getCameraImage( camera );\n\t\t\t\t\t\t\tcameraTex.sourceTexture = glTexture;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tconst inputSource = controllerInputSources[ i ];\n\t\t\t\tconst controller = controllers[ i ];\n\n\t\t\t\tif ( inputSource !== null && controller !== undefined ) {\n\n\t\t\t\t\tcontroller.update( inputSource, frame, customReferenceSpace || referenceSpace );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time, frame );\n\n\t\t\tif ( frame.detectedPlanes ) {\n\n\t\t\t\tscope.dispatchEvent( { type: 'planesdetected', data: frame } );\n\n\t\t\t}\n\n\t\t\txrFrame = null;\n\n\t\t}\n\n\t\tconst animation = new WebGLAnimation();\n\n\t\tanimation.setAnimationLoop( onAnimationFrame );\n\n\t\tthis.setAnimationLoop = function ( callback ) {\n\n\t\t\tonAnimationFrameCallback = callback;\n\n\t\t};\n\n\t\tthis.dispose = function () {};\n\n\t}\n\n}\n\nconst _e1 = /*@__PURE__*/ new Euler();\nconst _m1 = /*@__PURE__*/ new Matrix4();\n\nfunction WebGLMaterials( renderer, properties ) {\n\n\tfunction refreshTransformUniform( map, uniform ) {\n\n\t\tif ( map.matrixAutoUpdate === true ) {\n\n\t\t\tmap.updateMatrix();\n\n\t\t}\n\n\t\tuniform.value.copy( map.matrix );\n\n\t}\n\n\tfunction refreshFogUniforms( uniforms, fog ) {\n\n\t\tfog.color.getRGB( uniforms.fogColor.value, getUnlitUniformColorSpace( renderer ) );\n\n\t\tif ( fog.isFog ) {\n\n\t\t\tuniforms.fogNear.value = fog.near;\n\t\t\tuniforms.fogFar.value = fog.far;\n\n\t\t} else if ( fog.isFogExp2 ) {\n\n\t\t\tuniforms.fogDensity.value = fog.density;\n\n\t\t}\n\n\t}\n\n\tfunction refreshMaterialUniforms( uniforms, material, pixelRatio, height, transmissionRenderTarget ) {\n\n\t\tif ( material.isMeshBasicMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshLambertMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshToonMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsToon( uniforms, material );\n\n\t\t} else if ( material.isMeshPhongMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsPhong( uniforms, material );\n\n\t\t} else if ( material.isMeshStandardMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsStandard( uniforms, material );\n\n\t\t\tif ( material.isMeshPhysicalMaterial ) {\n\n\t\t\t\trefreshUniformsPhysical( uniforms, material, transmissionRenderTarget );\n\n\t\t\t}\n\n\t\t} else if ( material.isMeshMatcapMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsMatcap( uniforms, material );\n\n\t\t} else if ( material.isMeshDepthMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isMeshDistanceMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\t\t\trefreshUniformsDistance( uniforms, material );\n\n\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\trefreshUniformsCommon( uniforms, material );\n\n\t\t} else if ( material.isLineBasicMaterial ) {\n\n\t\t\trefreshUniformsLine( uniforms, material );\n\n\t\t\tif ( material.isLineDashedMaterial ) {\n\n\t\t\t\trefreshUniformsDash( uniforms, material );\n\n\t\t\t}\n\n\t\t} else if ( material.isPointsMaterial ) {\n\n\t\t\trefreshUniformsPoints( uniforms, material, pixelRatio, height );\n\n\t\t} else if ( material.isSpriteMaterial ) {\n\n\t\t\trefreshUniformsSprites( uniforms, material );\n\n\t\t} else if ( material.isShadowMaterial ) {\n\n\t\t\tuniforms.color.value.copy( material.color );\n\t\t\tuniforms.opacity.value = material.opacity;\n\n\t\t} else if ( material.isShaderMaterial ) {\n\n\t\t\tmaterial.uniformsNeedUpdate = false; // #15581\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsCommon( uniforms, material ) {\n\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.color ) {\n\n\t\t\tuniforms.diffuse.value.copy( material.color );\n\n\t\t}\n\n\t\tif ( material.emissive ) {\n\n\t\t\tuniforms.emissive.value.copy( material.emissive ).multiplyScalar( material.emissiveIntensity );\n\n\t\t}\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tuniforms.bumpMap.value = material.bumpMap;\n\n\t\t\trefreshTransformUniform( material.bumpMap, uniforms.bumpMapTransform );\n\n\t\t\tuniforms.bumpScale.value = material.bumpScale;\n\n\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\tuniforms.bumpScale.value *= -1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.normalMap ) {\n\n\t\t\tuniforms.normalMap.value = material.normalMap;\n\n\t\t\trefreshTransformUniform( material.normalMap, uniforms.normalMapTransform );\n\n\t\t\tuniforms.normalScale.value.copy( material.normalScale );\n\n\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\tuniforms.normalScale.value.negate();\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.displacementMap ) {\n\n\t\t\tuniforms.displacementMap.value = material.displacementMap;\n\n\t\t\trefreshTransformUniform( material.displacementMap, uniforms.displacementMapTransform );\n\n\t\t\tuniforms.displacementScale.value = material.displacementScale;\n\t\t\tuniforms.displacementBias.value = material.displacementBias;\n\n\t\t}\n\n\t\tif ( material.emissiveMap ) {\n\n\t\t\tuniforms.emissiveMap.value = material.emissiveMap;\n\n\t\t\trefreshTransformUniform( material.emissiveMap, uniforms.emissiveMapTransform );\n\n\t\t}\n\n\t\tif ( material.specularMap ) {\n\n\t\t\tuniforms.specularMap.value = material.specularMap;\n\n\t\t\trefreshTransformUniform( material.specularMap, uniforms.specularMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t\tconst materialProperties = properties.get( material );\n\n\t\tconst envMap = materialProperties.envMap;\n\t\tconst envMapRotation = materialProperties.envMapRotation;\n\n\t\tif ( envMap ) {\n\n\t\t\tuniforms.envMap.value = envMap;\n\n\t\t\t_e1.copy( envMapRotation );\n\n\t\t\t// accommodate left-handed frame\n\t\t\t_e1.x *= -1; _e1.y *= -1; _e1.z *= -1;\n\n\t\t\tif ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) {\n\n\t\t\t\t// environment maps which are not cube render targets or PMREMs follow a different convention\n\t\t\t\t_e1.y *= -1;\n\t\t\t\t_e1.z *= -1;\n\n\t\t\t}\n\n\t\t\tuniforms.envMapRotation.value.setFromMatrix4( _m1.makeRotationFromEuler( _e1 ) );\n\n\t\t\tuniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? -1 : 1;\n\n\t\t\tuniforms.reflectivity.value = material.reflectivity;\n\t\t\tuniforms.ior.value = material.ior;\n\t\t\tuniforms.refractionRatio.value = material.refractionRatio;\n\n\t\t}\n\n\t\tif ( material.lightMap ) {\n\n\t\t\tuniforms.lightMap.value = material.lightMap;\n\t\t\tuniforms.lightMapIntensity.value = material.lightMapIntensity;\n\n\t\t\trefreshTransformUniform( material.lightMap, uniforms.lightMapTransform );\n\n\t\t}\n\n\t\tif ( material.aoMap ) {\n\n\t\t\tuniforms.aoMap.value = material.aoMap;\n\t\t\tuniforms.aoMapIntensity.value = material.aoMapIntensity;\n\n\t\t\trefreshTransformUniform( material.aoMap, uniforms.aoMapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsLine( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDash( uniforms, material ) {\n\n\t\tuniforms.dashSize.value = material.dashSize;\n\t\tuniforms.totalSize.value = material.dashSize + material.gapSize;\n\t\tuniforms.scale.value = material.scale;\n\n\t}\n\n\tfunction refreshUniformsPoints( uniforms, material, pixelRatio, height ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.size.value = material.size * pixelRatio;\n\t\tuniforms.scale.value = height * 0.5;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.uvTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsSprites( uniforms, material ) {\n\n\t\tuniforms.diffuse.value.copy( material.color );\n\t\tuniforms.opacity.value = material.opacity;\n\t\tuniforms.rotation.value = material.rotation;\n\n\t\tif ( material.map ) {\n\n\t\t\tuniforms.map.value = material.map;\n\n\t\t\trefreshTransformUniform( material.map, uniforms.mapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaMap ) {\n\n\t\t\tuniforms.alphaMap.value = material.alphaMap;\n\n\t\t\trefreshTransformUniform( material.alphaMap, uniforms.alphaMapTransform );\n\n\t\t}\n\n\t\tif ( material.alphaTest > 0 ) {\n\n\t\t\tuniforms.alphaTest.value = material.alphaTest;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhong( uniforms, material ) {\n\n\t\tuniforms.specular.value.copy( material.specular );\n\t\tuniforms.shininess.value = Math.max( material.shininess, 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t}\n\n\tfunction refreshUniformsToon( uniforms, material ) {\n\n\t\tif ( material.gradientMap ) {\n\n\t\t\tuniforms.gradientMap.value = material.gradientMap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsStandard( uniforms, material ) {\n\n\t\tuniforms.metalness.value = material.metalness;\n\n\t\tif ( material.metalnessMap ) {\n\n\t\t\tuniforms.metalnessMap.value = material.metalnessMap;\n\n\t\t\trefreshTransformUniform( material.metalnessMap, uniforms.metalnessMapTransform );\n\n\t\t}\n\n\t\tuniforms.roughness.value = material.roughness;\n\n\t\tif ( material.roughnessMap ) {\n\n\t\t\tuniforms.roughnessMap.value = material.roughnessMap;\n\n\t\t\trefreshTransformUniform( material.roughnessMap, uniforms.roughnessMapTransform );\n\n\t\t}\n\n\t\tif ( material.envMap ) {\n\n\t\t\t//uniforms.envMap.value = material.envMap; // part of uniforms common\n\n\t\t\tuniforms.envMapIntensity.value = material.envMapIntensity;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsPhysical( uniforms, material, transmissionRenderTarget ) {\n\n\t\tuniforms.ior.value = material.ior; // also part of uniforms common\n\n\t\tif ( material.sheen > 0 ) {\n\n\t\t\tuniforms.sheenColor.value.copy( material.sheenColor ).multiplyScalar( material.sheen );\n\n\t\t\tuniforms.sheenRoughness.value = material.sheenRoughness;\n\n\t\t\tif ( material.sheenColorMap ) {\n\n\t\t\t\tuniforms.sheenColorMap.value = material.sheenColorMap;\n\n\t\t\t\trefreshTransformUniform( material.sheenColorMap, uniforms.sheenColorMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.sheenRoughnessMap ) {\n\n\t\t\t\tuniforms.sheenRoughnessMap.value = material.sheenRoughnessMap;\n\n\t\t\t\trefreshTransformUniform( material.sheenRoughnessMap, uniforms.sheenRoughnessMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.clearcoat > 0 ) {\n\n\t\t\tuniforms.clearcoat.value = material.clearcoat;\n\t\t\tuniforms.clearcoatRoughness.value = material.clearcoatRoughness;\n\n\t\t\tif ( material.clearcoatMap ) {\n\n\t\t\t\tuniforms.clearcoatMap.value = material.clearcoatMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatMap, uniforms.clearcoatMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatRoughnessMap ) {\n\n\t\t\t\tuniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatRoughnessMap, uniforms.clearcoatRoughnessMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.clearcoatNormalMap ) {\n\n\t\t\t\tuniforms.clearcoatNormalMap.value = material.clearcoatNormalMap;\n\n\t\t\t\trefreshTransformUniform( material.clearcoatNormalMap, uniforms.clearcoatNormalMapTransform );\n\n\t\t\t\tuniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale );\n\n\t\t\t\tif ( material.side === BackSide ) {\n\n\t\t\t\t\tuniforms.clearcoatNormalScale.value.negate();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.dispersion > 0 ) {\n\n\t\t\tuniforms.dispersion.value = material.dispersion;\n\n\t\t}\n\n\t\tif ( material.iridescence > 0 ) {\n\n\t\t\tuniforms.iridescence.value = material.iridescence;\n\t\t\tuniforms.iridescenceIOR.value = material.iridescenceIOR;\n\t\t\tuniforms.iridescenceThicknessMinimum.value = material.iridescenceThicknessRange[ 0 ];\n\t\t\tuniforms.iridescenceThicknessMaximum.value = material.iridescenceThicknessRange[ 1 ];\n\n\t\t\tif ( material.iridescenceMap ) {\n\n\t\t\t\tuniforms.iridescenceMap.value = material.iridescenceMap;\n\n\t\t\t\trefreshTransformUniform( material.iridescenceMap, uniforms.iridescenceMapTransform );\n\n\t\t\t}\n\n\t\t\tif ( material.iridescenceThicknessMap ) {\n\n\t\t\t\tuniforms.iridescenceThicknessMap.value = material.iridescenceThicknessMap;\n\n\t\t\t\trefreshTransformUniform( material.iridescenceThicknessMap, uniforms.iridescenceThicknessMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( material.transmission > 0 ) {\n\n\t\t\tuniforms.transmission.value = material.transmission;\n\t\t\tuniforms.transmissionSamplerMap.value = transmissionRenderTarget.texture;\n\t\t\tuniforms.transmissionSamplerSize.value.set( transmissionRenderTarget.width, transmissionRenderTarget.height );\n\n\t\t\tif ( material.transmissionMap ) {\n\n\t\t\t\tuniforms.transmissionMap.value = material.transmissionMap;\n\n\t\t\t\trefreshTransformUniform( material.transmissionMap, uniforms.transmissionMapTransform );\n\n\t\t\t}\n\n\t\t\tuniforms.thickness.value = material.thickness;\n\n\t\t\tif ( material.thicknessMap ) {\n\n\t\t\t\tuniforms.thicknessMap.value = material.thicknessMap;\n\n\t\t\t\trefreshTransformUniform( material.thicknessMap, uniforms.thicknessMapTransform );\n\n\t\t\t}\n\n\t\t\tuniforms.attenuationDistance.value = material.attenuationDistance;\n\t\t\tuniforms.attenuationColor.value.copy( material.attenuationColor );\n\n\t\t}\n\n\t\tif ( material.anisotropy > 0 ) {\n\n\t\t\tuniforms.anisotropyVector.value.set( material.anisotropy * Math.cos( material.anisotropyRotation ), material.anisotropy * Math.sin( material.anisotropyRotation ) );\n\n\t\t\tif ( material.anisotropyMap ) {\n\n\t\t\t\tuniforms.anisotropyMap.value = material.anisotropyMap;\n\n\t\t\t\trefreshTransformUniform( material.anisotropyMap, uniforms.anisotropyMapTransform );\n\n\t\t\t}\n\n\t\t}\n\n\t\tuniforms.specularIntensity.value = material.specularIntensity;\n\t\tuniforms.specularColor.value.copy( material.specularColor );\n\n\t\tif ( material.specularColorMap ) {\n\n\t\t\tuniforms.specularColorMap.value = material.specularColorMap;\n\n\t\t\trefreshTransformUniform( material.specularColorMap, uniforms.specularColorMapTransform );\n\n\t\t}\n\n\t\tif ( material.specularIntensityMap ) {\n\n\t\t\tuniforms.specularIntensityMap.value = material.specularIntensityMap;\n\n\t\t\trefreshTransformUniform( material.specularIntensityMap, uniforms.specularIntensityMapTransform );\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsMatcap( uniforms, material ) {\n\n\t\tif ( material.matcap ) {\n\n\t\t\tuniforms.matcap.value = material.matcap;\n\n\t\t}\n\n\t}\n\n\tfunction refreshUniformsDistance( uniforms, material ) {\n\n\t\tconst light = properties.get( material ).light;\n\n\t\tuniforms.referencePosition.value.setFromMatrixPosition( light.matrixWorld );\n\t\tuniforms.nearDistance.value = light.shadow.camera.near;\n\t\tuniforms.farDistance.value = light.shadow.camera.far;\n\n\t}\n\n\treturn {\n\t\trefreshFogUniforms: refreshFogUniforms,\n\t\trefreshMaterialUniforms: refreshMaterialUniforms\n\t};\n\n}\n\nfunction WebGLUniformsGroups( gl, info, capabilities, state ) {\n\n\tlet buffers = {};\n\tlet updateList = {};\n\tlet allocatedBindingPoints = [];\n\n\tconst maxBindingPoints = gl.getParameter( gl.MAX_UNIFORM_BUFFER_BINDINGS ); // binding points are global whereas block indices are per shader program\n\n\tfunction bind( uniformsGroup, program ) {\n\n\t\tconst webglProgram = program.program;\n\t\tstate.uniformBlockBinding( uniformsGroup, webglProgram );\n\n\t}\n\n\tfunction update( uniformsGroup, program ) {\n\n\t\tlet buffer = buffers[ uniformsGroup.id ];\n\n\t\tif ( buffer === undefined ) {\n\n\t\t\tprepareUniformsGroup( uniformsGroup );\n\n\t\t\tbuffer = createBuffer( uniformsGroup );\n\t\t\tbuffers[ uniformsGroup.id ] = buffer;\n\n\t\t\tuniformsGroup.addEventListener( 'dispose', onUniformsGroupsDispose );\n\n\t\t}\n\n\t\t// ensure to update the binding points/block indices mapping for this program\n\n\t\tconst webglProgram = program.program;\n\t\tstate.updateUBOMapping( uniformsGroup, webglProgram );\n\n\t\t// update UBO once per frame\n\n\t\tconst frame = info.render.frame;\n\n\t\tif ( updateList[ uniformsGroup.id ] !== frame ) {\n\n\t\t\tupdateBufferData( uniformsGroup );\n\n\t\t\tupdateList[ uniformsGroup.id ] = frame;\n\n\t\t}\n\n\t}\n\n\tfunction createBuffer( uniformsGroup ) {\n\n\t\t// the setup of an UBO is independent of a particular shader program but global\n\n\t\tconst bindingPointIndex = allocateBindingPointIndex();\n\t\tuniformsGroup.__bindingPointIndex = bindingPointIndex;\n\n\t\tconst buffer = gl.createBuffer();\n\t\tconst size = uniformsGroup.__size;\n\t\tconst usage = uniformsGroup.usage;\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, buffer );\n\t\tgl.bufferData( gl.UNIFORM_BUFFER, size, usage );\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, null );\n\t\tgl.bindBufferBase( gl.UNIFORM_BUFFER, bindingPointIndex, buffer );\n\n\t\treturn buffer;\n\n\t}\n\n\tfunction allocateBindingPointIndex() {\n\n\t\tfor ( let i = 0; i < maxBindingPoints; i ++ ) {\n\n\t\t\tif ( allocatedBindingPoints.indexOf( i ) === -1 ) {\n\n\t\t\t\tallocatedBindingPoints.push( i );\n\t\t\t\treturn i;\n\n\t\t\t}\n\n\t\t}\n\n\t\terror( 'WebGLRenderer: Maximum number of simultaneously usable uniforms groups reached.' );\n\n\t\treturn 0;\n\n\t}\n\n\tfunction updateBufferData( uniformsGroup ) {\n\n\t\tconst buffer = buffers[ uniformsGroup.id ];\n\t\tconst uniforms = uniformsGroup.uniforms;\n\t\tconst cache = uniformsGroup.__cache;\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, buffer );\n\n\t\tfor ( let i = 0, il = uniforms.length; i < il; i ++ ) {\n\n\t\t\tconst uniformArray = Array.isArray( uniforms[ i ] ) ? uniforms[ i ] : [ uniforms[ i ] ];\n\n\t\t\tfor ( let j = 0, jl = uniformArray.length; j < jl; j ++ ) {\n\n\t\t\t\tconst uniform = uniformArray[ j ];\n\n\t\t\t\tif ( hasUniformChanged( uniform, i, j, cache ) === true ) {\n\n\t\t\t\t\tconst offset = uniform.__offset;\n\n\t\t\t\t\tconst values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ];\n\n\t\t\t\t\tlet arrayOffset = 0;\n\n\t\t\t\t\tfor ( let k = 0; k < values.length; k ++ ) {\n\n\t\t\t\t\t\tconst value = values[ k ];\n\n\t\t\t\t\t\tconst info = getUniformSize( value );\n\n\t\t\t\t\t\t// TODO add integer and struct support\n\t\t\t\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\t\t\t\tuniform.__data[ 0 ] = value;\n\t\t\t\t\t\t\tgl.bufferSubData( gl.UNIFORM_BUFFER, offset + arrayOffset, uniform.__data );\n\n\t\t\t\t\t\t} else if ( value.isMatrix3 ) {\n\n\t\t\t\t\t\t\t// manually converting 3x3 to 3x4\n\n\t\t\t\t\t\t\tuniform.__data[ 0 ] = value.elements[ 0 ];\n\t\t\t\t\t\t\tuniform.__data[ 1 ] = value.elements[ 1 ];\n\t\t\t\t\t\t\tuniform.__data[ 2 ] = value.elements[ 2 ];\n\t\t\t\t\t\t\tuniform.__data[ 3 ] = 0;\n\t\t\t\t\t\t\tuniform.__data[ 4 ] = value.elements[ 3 ];\n\t\t\t\t\t\t\tuniform.__data[ 5 ] = value.elements[ 4 ];\n\t\t\t\t\t\t\tuniform.__data[ 6 ] = value.elements[ 5 ];\n\t\t\t\t\t\t\tuniform.__data[ 7 ] = 0;\n\t\t\t\t\t\t\tuniform.__data[ 8 ] = value.elements[ 6 ];\n\t\t\t\t\t\t\tuniform.__data[ 9 ] = value.elements[ 7 ];\n\t\t\t\t\t\t\tuniform.__data[ 10 ] = value.elements[ 8 ];\n\t\t\t\t\t\t\tuniform.__data[ 11 ] = 0;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvalue.toArray( uniform.__data, arrayOffset );\n\n\t\t\t\t\t\t\tarrayOffset += info.storage / Float32Array.BYTES_PER_ELEMENT;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgl.bufferSubData( gl.UNIFORM_BUFFER, offset, uniform.__data );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, null );\n\n\t}\n\n\tfunction hasUniformChanged( uniform, index, indexArray, cache ) {\n\n\t\tconst value = uniform.value;\n\t\tconst indexString = index + '_' + indexArray;\n\n\t\tif ( cache[ indexString ] === undefined ) {\n\n\t\t\t// cache entry does not exist so far\n\n\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\tcache[ indexString ] = value;\n\n\t\t\t} else {\n\n\t\t\t\tcache[ indexString ] = value.clone();\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t} else {\n\n\t\t\tconst cachedObject = cache[ indexString ];\n\n\t\t\t// compare current value with cached entry\n\n\t\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t\tif ( cachedObject !== value ) {\n\n\t\t\t\t\tcache[ indexString ] = value;\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( cachedObject.equals( value ) === false ) {\n\n\t\t\t\t\tcachedObject.copy( value );\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tfunction prepareUniformsGroup( uniformsGroup ) {\n\n\t\t// determine total buffer size according to the STD140 layout\n\t\t// Hint: STD140 is the only supported layout in WebGL 2\n\n\t\tconst uniforms = uniformsGroup.uniforms;\n\n\t\tlet offset = 0; // global buffer offset in bytes\n\t\tconst chunkSize = 16; // size of a chunk in bytes\n\n\t\tfor ( let i = 0, l = uniforms.length; i < l; i ++ ) {\n\n\t\t\tconst uniformArray = Array.isArray( uniforms[ i ] ) ? uniforms[ i ] : [ uniforms[ i ] ];\n\n\t\t\tfor ( let j = 0, jl = uniformArray.length; j < jl; j ++ ) {\n\n\t\t\t\tconst uniform = uniformArray[ j ];\n\n\t\t\t\tconst values = Array.isArray( uniform.value ) ? uniform.value : [ uniform.value ];\n\n\t\t\t\tfor ( let k = 0, kl = values.length; k < kl; k ++ ) {\n\n\t\t\t\t\tconst value = values[ k ];\n\n\t\t\t\t\tconst info = getUniformSize( value );\n\n\t\t\t\t\tconst chunkOffset = offset % chunkSize; // offset in the current chunk\n\t\t\t\t\tconst chunkPadding = chunkOffset % info.boundary; // required padding to match boundary\n\t\t\t\t\tconst chunkStart = chunkOffset + chunkPadding; // the start position in the current chunk for the data\n\n\t\t\t\t\toffset += chunkPadding;\n\n\t\t\t\t\t// Check for chunk overflow\n\t\t\t\t\tif ( chunkStart !== 0 && ( chunkSize - chunkStart ) < info.storage ) {\n\n\t\t\t\t\t\t// Add padding and adjust offset\n\t\t\t\t\t\toffset += ( chunkSize - chunkStart );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the following two properties will be used for partial buffer updates\n\t\t\t\t\tuniform.__data = new Float32Array( info.storage / Float32Array.BYTES_PER_ELEMENT );\n\t\t\t\t\tuniform.__offset = offset;\n\n\t\t\t\t\t// Update the global offset\n\t\t\t\t\toffset += info.storage;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ensure correct final padding\n\n\t\tconst chunkOffset = offset % chunkSize;\n\n\t\tif ( chunkOffset > 0 ) offset += ( chunkSize - chunkOffset );\n\n\t\t//\n\n\t\tuniformsGroup.__size = offset;\n\t\tuniformsGroup.__cache = {};\n\n\t\treturn this;\n\n\t}\n\n\tfunction getUniformSize( value ) {\n\n\t\tconst info = {\n\t\t\tboundary: 0, // bytes\n\t\t\tstorage: 0 // bytes\n\t\t};\n\n\t\t// determine sizes according to STD140\n\n\t\tif ( typeof value === 'number' || typeof value === 'boolean' ) {\n\n\t\t\t// float/int/bool\n\n\t\t\tinfo.boundary = 4;\n\t\t\tinfo.storage = 4;\n\n\t\t} else if ( value.isVector2 ) {\n\n\t\t\t// vec2\n\n\t\t\tinfo.boundary = 8;\n\t\t\tinfo.storage = 8;\n\n\t\t} else if ( value.isVector3 || value.isColor ) {\n\n\t\t\t// vec3\n\n\t\t\tinfo.boundary = 16;\n\t\t\tinfo.storage = 12; // evil: vec3 must start on a 16-byte boundary but it only consumes 12 bytes\n\n\t\t} else if ( value.isVector4 ) {\n\n\t\t\t// vec4\n\n\t\t\tinfo.boundary = 16;\n\t\t\tinfo.storage = 16;\n\n\t\t} else if ( value.isMatrix3 ) {\n\n\t\t\t// mat3 (in STD140 a 3x3 matrix is represented as 3x4)\n\n\t\t\tinfo.boundary = 48;\n\t\t\tinfo.storage = 48;\n\n\t\t} else if ( value.isMatrix4 ) {\n\n\t\t\t// mat4\n\n\t\t\tinfo.boundary = 64;\n\t\t\tinfo.storage = 64;\n\n\t\t} else if ( value.isTexture ) {\n\n\t\t\twarn( 'WebGLRenderer: Texture samplers can not be part of an uniforms group.' );\n\n\t\t} else {\n\n\t\t\twarn( 'WebGLRenderer: Unsupported uniform value type.', value );\n\n\t\t}\n\n\t\treturn info;\n\n\t}\n\n\tfunction onUniformsGroupsDispose( event ) {\n\n\t\tconst uniformsGroup = event.target;\n\n\t\tuniformsGroup.removeEventListener( 'dispose', onUniformsGroupsDispose );\n\n\t\tconst index = allocatedBindingPoints.indexOf( uniformsGroup.__bindingPointIndex );\n\t\tallocatedBindingPoints.splice( index, 1 );\n\n\t\tgl.deleteBuffer( buffers[ uniformsGroup.id ] );\n\n\t\tdelete buffers[ uniformsGroup.id ];\n\t\tdelete updateList[ uniformsGroup.id ];\n\n\t}\n\n\tfunction dispose() {\n\n\t\tfor ( const id in buffers ) {\n\n\t\t\tgl.deleteBuffer( buffers[ id ] );\n\n\t\t}\n\n\t\tallocatedBindingPoints = [];\n\t\tbuffers = {};\n\t\tupdateList = {};\n\n\t}\n\n\treturn {\n\n\t\tbind: bind,\n\t\tupdate: update,\n\n\t\tdispose: dispose\n\n\t};\n\n}\n\n/**\n * Precomputed DFG LUT for Image-Based Lighting\n * Resolution: 16x16\n * Samples: 4096 per texel\n * Format: RG16F (2 half floats per texel: scale, bias)\n */\n\n\nconst DATA = new Uint16Array( [\n\t0x30b5, 0x3ad1, 0x314c, 0x3a4d, 0x33d2, 0x391c, 0x35ef, 0x3828, 0x37f3, 0x36a6, 0x38d1, 0x3539, 0x3979, 0x3410, 0x39f8, 0x3252, 0x3a53, 0x30f0, 0x3a94, 0x2fc9, 0x3abf, 0x2e35, 0x3ada, 0x2d05, 0x3ae8, 0x2c1f, 0x3aed, 0x2ae0, 0x3aea, 0x29d1, 0x3ae1, 0x28ff,\n\t0x3638, 0x38e4, 0x364a, 0x38ce, 0x3699, 0x385e, 0x374e, 0x372c, 0x3839, 0x35a4, 0x38dc, 0x3462, 0x396e, 0x32c4, 0x39de, 0x3134, 0x3a2b, 0x3003, 0x3a59, 0x2e3a, 0x3a6d, 0x2ce1, 0x3a6e, 0x2bba, 0x3a5f, 0x2a33, 0x3a49, 0x290a, 0x3a2d, 0x2826, 0x3a0a, 0x26e8,\n\t0x3894, 0x36d7, 0x3897, 0x36c9, 0x38a3, 0x3675, 0x38bc, 0x35ac, 0x38ee, 0x349c, 0x393e, 0x3332, 0x3997, 0x3186, 0x39e2, 0x3038, 0x3a13, 0x2e75, 0x3a29, 0x2cf5, 0x3a2d, 0x2bac, 0x3a21, 0x29ff, 0x3a04, 0x28bc, 0x39dc, 0x2790, 0x39ad, 0x261a, 0x3978, 0x24fa,\n\t0x39ac, 0x34a8, 0x39ac, 0x34a3, 0x39ae, 0x3480, 0x39ae, 0x3423, 0x39b1, 0x330e, 0x39c2, 0x31a9, 0x39e0, 0x3063, 0x39fc, 0x2eb5, 0x3a0c, 0x2d1d, 0x3a14, 0x2bcf, 0x3a07, 0x29ff, 0x39e9, 0x28a3, 0x39be, 0x273c, 0x3989, 0x25b3, 0x394a, 0x2488, 0x3907, 0x2345,\n\t0x3a77, 0x3223, 0x3a76, 0x321f, 0x3a73, 0x3204, 0x3a6a, 0x31b3, 0x3a58, 0x3114, 0x3a45, 0x303b, 0x3a34, 0x2eb6, 0x3a26, 0x2d31, 0x3a1e, 0x2bef, 0x3a0b, 0x2a0d, 0x39ec, 0x28a1, 0x39c0, 0x271b, 0x3987, 0x2580, 0x3944, 0x2449, 0x38fa, 0x22bd, 0x38ac, 0x2155,\n\t0x3b07, 0x2fca, 0x3b06, 0x2fca, 0x3b00, 0x2fb8, 0x3af4, 0x2f7c, 0x3adb, 0x2eea, 0x3ab4, 0x2e00, 0x3a85, 0x2cec, 0x3a5e, 0x2bc5, 0x3a36, 0x2a00, 0x3a0d, 0x2899, 0x39dc, 0x2707, 0x39a0, 0x2562, 0x395a, 0x2424, 0x390b, 0x2268, 0x38b7, 0x20fd, 0x385f, 0x1fd1,\n\t0x3b69, 0x2cb9, 0x3b68, 0x2cbb, 0x3b62, 0x2cbb, 0x3b56, 0x2cae, 0x3b3b, 0x2c78, 0x3b0d, 0x2c0a, 0x3acf, 0x2ae3, 0x3a92, 0x2998, 0x3a54, 0x2867, 0x3a17, 0x26d0, 0x39d3, 0x253c, 0x3989, 0x2402, 0x3935, 0x2226, 0x38dc, 0x20bd, 0x387d, 0x1f54, 0x381d, 0x1db3,\n\t0x3ba9, 0x296b, 0x3ba8, 0x296f, 0x3ba3, 0x297b, 0x3b98, 0x2987, 0x3b7f, 0x2976, 0x3b4e, 0x2927, 0x3b0e, 0x2895, 0x3ac2, 0x27b7, 0x3a73, 0x263b, 0x3a23, 0x24e7, 0x39d0, 0x239b, 0x3976, 0x21d9, 0x3917, 0x207e, 0x38b2, 0x1ee7, 0x384b, 0x1d53, 0x37c7, 0x1c1e,\n\t0x3bd2, 0x25cb, 0x3bd1, 0x25d3, 0x3bcd, 0x25f0, 0x3bc2, 0x261f, 0x3bad, 0x2645, 0x3b7d, 0x262d, 0x3b3e, 0x25c4, 0x3aec, 0x250f, 0x3a93, 0x243a, 0x3a32, 0x22ce, 0x39d0, 0x215b, 0x3969, 0x202a, 0x38fe, 0x1e6e, 0x388f, 0x1cf1, 0x381f, 0x1b9b, 0x3762, 0x19dd,\n\t0x3be9, 0x21ab, 0x3be9, 0x21b7, 0x3be5, 0x21e5, 0x3bdd, 0x2241, 0x3bc9, 0x22a7, 0x3ba0, 0x22ec, 0x3b62, 0x22cd, 0x3b0f, 0x2247, 0x3aae, 0x2175, 0x3a44, 0x2088, 0x39d4, 0x1f49, 0x3960, 0x1dbe, 0x38e9, 0x1c77, 0x3870, 0x1ae8, 0x37f1, 0x1953, 0x3708, 0x181b,\n\t0x3bf6, 0x1cea, 0x3bf6, 0x1cfb, 0x3bf3, 0x1d38, 0x3bec, 0x1dbd, 0x3bda, 0x1e7c, 0x3bb7, 0x1f25, 0x3b7d, 0x1f79, 0x3b2c, 0x1f4c, 0x3ac6, 0x1ea6, 0x3a55, 0x1dbb, 0x39da, 0x1cbd, 0x395a, 0x1b9d, 0x38d8, 0x1a00, 0x3855, 0x18ac, 0x37ab, 0x173c, 0x36b7, 0x1598,\n\t0x3bfc, 0x1736, 0x3bfc, 0x1759, 0x3bf9, 0x17e7, 0x3bf4, 0x1896, 0x3be4, 0x1997, 0x3bc6, 0x1aa8, 0x3b91, 0x1b84, 0x3b43, 0x1bd2, 0x3ade, 0x1b8a, 0x3a65, 0x1acd, 0x39e2, 0x19d3, 0x3957, 0x18cd, 0x38ca, 0x17b3, 0x383e, 0x1613, 0x376d, 0x14bf, 0x366f, 0x135e,\n\t0x3bff, 0x101b, 0x3bff, 0x1039, 0x3bfc, 0x10c8, 0x3bf9, 0x1226, 0x3bea, 0x1428, 0x3bcf, 0x1584, 0x3b9f, 0x16c5, 0x3b54, 0x179a, 0x3af0, 0x17ce, 0x3a76, 0x1771, 0x39ea, 0x16a4, 0x3956, 0x15a7, 0x38bf, 0x14a7, 0x3829, 0x1379, 0x3735, 0x11ea, 0x362d, 0x10a1,\n\t0x3c00, 0x061b, 0x3c00, 0x066a, 0x3bfe, 0x081c, 0x3bfa, 0x0a4c, 0x3bed, 0x0d16, 0x3bd5, 0x0fb3, 0x3ba9, 0x114d, 0x3b63, 0x127c, 0x3b01, 0x132f, 0x3a85, 0x1344, 0x39f4, 0x12d2, 0x3957, 0x120d, 0x38b5, 0x1122, 0x3817, 0x103c, 0x3703, 0x0ed3, 0x35f0, 0x0d6d,\n\t0x3c00, 0x007a, 0x3c00, 0x0089, 0x3bfe, 0x011d, 0x3bfb, 0x027c, 0x3bf0, 0x04fa, 0x3bda, 0x0881, 0x3bb1, 0x0acd, 0x3b6f, 0x0c97, 0x3b10, 0x0d7b, 0x3a93, 0x0df1, 0x39fe, 0x0def, 0x3959, 0x0d8a, 0x38af, 0x0ce9, 0x3808, 0x0c31, 0x36d5, 0x0af0, 0x35b9, 0x09a3,\n\t0x3c00, 0x0000, 0x3c00, 0x0001, 0x3bff, 0x0015, 0x3bfb, 0x0059, 0x3bf2, 0x00fd, 0x3bdd, 0x01df, 0x3bb7, 0x031c, 0x3b79, 0x047c, 0x3b1d, 0x05d4, 0x3aa0, 0x06d5, 0x3a08, 0x075a, 0x395d, 0x075e, 0x38aa, 0x06f7, 0x37f4, 0x0648, 0x36ac, 0x0576, 0x3586, 0x049f\n] );\n\nlet lut = null;\n\nfunction getDFGLUT() {\n\n\tif ( lut === null ) {\n\n\t\tlut = new DataTexture( DATA, 16, 16, RGFormat, HalfFloatType );\n\t\tlut.name = 'DFG_LUT';\n\t\tlut.minFilter = LinearFilter;\n\t\tlut.magFilter = LinearFilter;\n\t\tlut.wrapS = ClampToEdgeWrapping;\n\t\tlut.wrapT = ClampToEdgeWrapping;\n\t\tlut.generateMipmaps = false;\n\t\tlut.needsUpdate = true;\n\n\t}\n\n\treturn lut;\n\n}\n\n/**\n * This renderer uses WebGL 2 to display scenes.\n *\n * WebGL 1 is not supported since `r163`.\n */\nclass WebGLRenderer {\n\n\t/**\n\t * Constructs a new WebGL renderer.\n\t *\n\t * @param {WebGLRenderer~Options} [parameters] - The configuration parameter.\n\t */\n\tconstructor( parameters = {} ) {\n\n\t\tconst {\n\t\t\tcanvas = createCanvasElement(),\n\t\t\tcontext = null,\n\t\t\tdepth = true,\n\t\t\tstencil = false,\n\t\t\talpha = false,\n\t\t\tantialias = false,\n\t\t\tpremultipliedAlpha = true,\n\t\t\tpreserveDrawingBuffer = false,\n\t\t\tpowerPreference = 'default',\n\t\t\tfailIfMajorPerformanceCaveat = false,\n\t\t\treversedDepthBuffer = false,\n\t\t\toutputBufferType = UnsignedByteType,\n\t\t} = parameters;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLRenderer = true;\n\n\t\tlet _alpha;\n\n\t\tif ( context !== null ) {\n\n\t\t\tif ( typeof WebGLRenderingContext !== 'undefined' && context instanceof WebGLRenderingContext ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLRenderer: WebGL 1 is not supported since r163.' );\n\n\t\t\t}\n\n\t\t\t_alpha = context.getContextAttributes().alpha;\n\n\t\t} else {\n\n\t\t\t_alpha = alpha;\n\n\t\t}\n\n\t\tconst _outputBufferType = outputBufferType;\n\n\t\tconst INTEGER_FORMATS = new Set( [\n\t\t\tRGBAIntegerFormat,\n\t\t\tRGIntegerFormat,\n\t\t\tRedIntegerFormat\n\t\t] );\n\n\t\tconst UNSIGNED_TYPES = new Set( [\n\t\t\tUnsignedByteType,\n\t\t\tUnsignedIntType,\n\t\t\tUnsignedShortType,\n\t\t\tUnsignedInt248Type,\n\t\t\tUnsignedShort4444Type,\n\t\t\tUnsignedShort5551Type\n\t\t] );\n\n\t\tconst uintClearColor = new Uint32Array( 4 );\n\t\tconst intClearColor = new Int32Array( 4 );\n\n\t\tlet currentRenderList = null;\n\t\tlet currentRenderState = null;\n\n\t\t// render() can be called from within a callback triggered by another render.\n\t\t// We track this so that the nested render call gets its list and state isolated from the parent render call.\n\n\t\tconst renderListStack = [];\n\t\tconst renderStateStack = [];\n\n\t\t// internal render target for non-UnsignedByteType color buffer\n\n\t\tlet output = null;\n\n\t\t// public properties\n\n\t\t/**\n\t\t * A canvas where the renderer draws its output.This is automatically created by the renderer\n\t\t * in the constructor (if not provided already); you just need to add it to your page like so:\n\t\t * ```js\n\t\t * document.body.appendChild( renderer.domElement );\n\t\t * ```\n\t\t *\n\t\t * @type {HTMLCanvasElement|OffscreenCanvas}\n\t\t */\n\t\tthis.domElement = canvas;\n\n\t\t/**\n\t\t * A object with debug configuration settings.\n\t\t *\n\t\t * - `checkShaderErrors`: If it is `true`, defines whether material shader programs are\n\t\t * checked for errors during compilation and linkage process. It may be useful to disable\n\t\t * this check in production for performance gain. It is strongly recommended to keep these\n\t\t * checks enabled during development. If the shader does not compile and link - it will not\n\t\t * work and associated material will not render.\n\t\t * - `onShaderError(gl, program, glVertexShader,glFragmentShader)`: A callback function that\n\t\t * can be used for custom error reporting. The callback receives the WebGL context, an instance\n\t\t * of WebGLProgram as well two instances of WebGLShader representing the vertex and fragment shader.\n\t\t * Assigning a custom function disables the default error reporting.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.debug = {\n\n\t\t\t/**\n\t\t\t * Enables error checking and reporting when shader programs are being compiled.\n\t\t\t * @type {boolean}\n\t\t\t */\n\t\t\tcheckShaderErrors: true,\n\t\t\t/**\n\t\t\t * Callback for custom error reporting.\n\t\t\t * @type {?Function}\n\t\t\t */\n\t\t\tonShaderError: null\n\t\t};\n\n\t\t// clearing\n\n\t\t/**\n\t\t * Whether the renderer should automatically clear its output before rendering a frame or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClear = true;\n\n\t\t/**\n\t\t * If {@link WebGLRenderer#autoClear} set to `true`, whether the renderer should clear\n\t\t * the color buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClearColor = true;\n\n\t\t/**\n\t\t * If {@link WebGLRenderer#autoClear} set to `true`, whether the renderer should clear\n\t\t * the depth buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClearDepth = true;\n\n\t\t/**\n\t\t * If {@link WebGLRenderer#autoClear} set to `true`, whether the renderer should clear\n\t\t * the stencil buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClearStencil = true;\n\n\t\t// scene graph\n\n\t\t/**\n\t\t * Whether the renderer should sort objects or not.\n\t\t *\n\t\t * Note: Sorting is used to attempt to properly render objects that have some\n\t\t * degree of transparency. By definition, sorting objects may not work in all\n\t\t * cases. Depending on the needs of application, it may be necessary to turn\n\t\t * off sorting and use other methods to deal with transparency rendering e.g.\n\t\t * manually determining each object's rendering order.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sortObjects = true;\n\n\t\t// user-defined clipping\n\n\t\t/**\n\t\t * User-defined clipping planes specified in world space. These planes apply globally.\n\t\t * Points in space whose dot product with the plane is negative are cut away.\n\t\t *\n\t\t * @type {Array<Plane>}\n\t\t */\n\t\tthis.clippingPlanes = [];\n\n\t\t/**\n\t\t * Whether the renderer respects object-level clipping planes or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.localClippingEnabled = false;\n\n\t\t// tone mapping\n\n\t\t/**\n\t\t * The tone mapping technique of the renderer.\n\t\t *\n\t\t * @type {(NoToneMapping|LinearToneMapping|ReinhardToneMapping|CineonToneMapping|ACESFilmicToneMapping|CustomToneMapping|AgXToneMapping|NeutralToneMapping)}\n\t\t * @default NoToneMapping\n\t\t */\n\t\tthis.toneMapping = NoToneMapping;\n\n\t\t/**\n\t\t * Exposure level of tone mapping.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.toneMappingExposure = 1.0;\n\n\t\t// transmission\n\n\t\t/**\n\t\t * The normalized resolution scale for the transmission render target, measured in percentage\n\t\t * of viewport dimensions. Lowering this value can result in significant performance improvements\n\t\t * when using {@link MeshPhysicalMaterial#transmission}.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.transmissionResolutionScale = 1.0;\n\n\t\t// internal properties\n\n\t\tconst _this = this;\n\n\t\tlet _isContextLost = false;\n\n\t\t// internal state cache\n\n\t\tthis._outputColorSpace = SRGBColorSpace;\n\n\t\tlet _currentActiveCubeFace = 0;\n\t\tlet _currentActiveMipmapLevel = 0;\n\t\tlet _currentRenderTarget = null;\n\t\tlet _currentMaterialId = -1;\n\n\t\tlet _currentCamera = null;\n\n\t\tconst _currentViewport = new Vector4();\n\t\tconst _currentScissor = new Vector4();\n\t\tlet _currentScissorTest = null;\n\n\t\tconst _currentClearColor = new Color( 0x000000 );\n\t\tlet _currentClearAlpha = 0;\n\n\t\t//\n\n\t\tlet _width = canvas.width;\n\t\tlet _height = canvas.height;\n\n\t\tlet _pixelRatio = 1;\n\t\tlet _opaqueSort = null;\n\t\tlet _transparentSort = null;\n\n\t\tconst _viewport = new Vector4( 0, 0, _width, _height );\n\t\tconst _scissor = new Vector4( 0, 0, _width, _height );\n\t\tlet _scissorTest = false;\n\n\t\t// frustum\n\n\t\tconst _frustum = new Frustum();\n\n\t\t// clipping\n\n\t\tlet _clippingEnabled = false;\n\t\tlet _localClippingEnabled = false;\n\n\t\t// camera matrices cache\n\n\t\tconst _projScreenMatrix = new Matrix4();\n\n\t\tconst _vector3 = new Vector3();\n\n\t\tconst _vector4 = new Vector4();\n\n\t\tconst _emptyScene = { background: null, fog: null, environment: null, overrideMaterial: null, isScene: true };\n\n\t\tlet _renderBackground = false;\n\n\t\tfunction getTargetPixelRatio() {\n\n\t\t\treturn _currentRenderTarget === null ? _pixelRatio : 1;\n\n\t\t}\n\n\t\t// initialize\n\n\t\tlet _gl = context;\n\n\t\tfunction getContext( contextName, contextAttributes ) {\n\n\t\t\treturn canvas.getContext( contextName, contextAttributes );\n\n\t\t}\n\n\t\ttry {\n\n\t\t\tconst contextAttributes = {\n\t\t\t\talpha: true,\n\t\t\t\tdepth,\n\t\t\t\tstencil,\n\t\t\t\tantialias,\n\t\t\t\tpremultipliedAlpha,\n\t\t\t\tpreserveDrawingBuffer,\n\t\t\t\tpowerPreference,\n\t\t\t\tfailIfMajorPerformanceCaveat,\n\t\t\t};\n\n\t\t\t// OffscreenCanvas does not have setAttribute, see #22811\n\t\t\tif ( 'setAttribute' in canvas ) canvas.setAttribute( 'data-engine', `three.js r${REVISION}` );\n\n\t\t\t// event listeners must be registered before WebGL context is created, see #12753\n\t\t\tcanvas.addEventListener( 'webglcontextlost', onContextLost, false );\n\t\t\tcanvas.addEventListener( 'webglcontextrestored', onContextRestore, false );\n\t\t\tcanvas.addEventListener( 'webglcontextcreationerror', onContextCreationError, false );\n\n\t\t\tif ( _gl === null ) {\n\n\t\t\t\tconst contextName = 'webgl2';\n\n\t\t\t\t_gl = getContext( contextName, contextAttributes );\n\n\t\t\t\tif ( _gl === null ) {\n\n\t\t\t\t\tif ( getContext( contextName ) ) {\n\n\t\t\t\t\t\tthrow new Error( 'Error creating WebGL context with your selected attributes.' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthrow new Error( 'Error creating WebGL context.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} catch ( e ) {\n\n\t\t\terror( 'WebGLRenderer: ' + e.message );\n\t\t\tthrow e;\n\n\t\t}\n\n\t\tlet extensions, capabilities, state, info;\n\t\tlet properties, textures, cubemaps, cubeuvmaps, attributes, geometries, objects;\n\t\tlet programCache, materials, renderLists, renderStates, clipping, shadowMap;\n\n\t\tlet background, morphtargets, bufferRenderer, indexedBufferRenderer;\n\n\t\tlet utils, bindingStates, uniformsGroups;\n\n\t\tfunction initGLContext() {\n\n\t\t\textensions = new WebGLExtensions( _gl );\n\t\t\textensions.init();\n\n\t\t\tutils = new WebGLUtils( _gl, extensions );\n\n\t\t\tcapabilities = new WebGLCapabilities( _gl, extensions, parameters, utils );\n\n\t\t\tstate = new WebGLState( _gl, extensions );\n\n\t\t\tif ( capabilities.reversedDepthBuffer && reversedDepthBuffer ) {\n\n\t\t\t\tstate.buffers.depth.setReversed( true );\n\n\t\t\t}\n\n\t\t\tinfo = new WebGLInfo( _gl );\n\t\t\tproperties = new WebGLProperties();\n\t\t\ttextures = new WebGLTextures( _gl, extensions, state, properties, capabilities, utils, info );\n\t\t\tcubemaps = new WebGLCubeMaps( _this );\n\t\t\tcubeuvmaps = new WebGLCubeUVMaps( _this );\n\t\t\tattributes = new WebGLAttributes( _gl );\n\t\t\tbindingStates = new WebGLBindingStates( _gl, attributes );\n\t\t\tgeometries = new WebGLGeometries( _gl, attributes, info, bindingStates );\n\t\t\tobjects = new WebGLObjects( _gl, geometries, attributes, info );\n\t\t\tmorphtargets = new WebGLMorphtargets( _gl, capabilities, textures );\n\t\t\tclipping = new WebGLClipping( properties );\n\t\t\tprogramCache = new WebGLPrograms( _this, cubemaps, cubeuvmaps, extensions, capabilities, bindingStates, clipping );\n\t\t\tmaterials = new WebGLMaterials( _this, properties );\n\t\t\trenderLists = new WebGLRenderLists();\n\t\t\trenderStates = new WebGLRenderStates( extensions );\n\t\t\tbackground = new WebGLBackground( _this, cubemaps, cubeuvmaps, state, objects, _alpha, premultipliedAlpha );\n\t\t\tshadowMap = new WebGLShadowMap( _this, objects, capabilities );\n\t\t\tuniformsGroups = new WebGLUniformsGroups( _gl, info, capabilities, state );\n\n\t\t\tbufferRenderer = new WebGLBufferRenderer( _gl, extensions, info );\n\t\t\tindexedBufferRenderer = new WebGLIndexedBufferRenderer( _gl, extensions, info );\n\n\t\t\tinfo.programs = programCache.programs;\n\n\t\t\t/**\n\t\t\t * Holds details about the capabilities of the current rendering context.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#capabilities\n\t\t\t * @type {WebGLRenderer~Capabilities}\n\t\t\t */\n\t\t\t_this.capabilities = capabilities;\n\n\t\t\t/**\n\t\t\t * Provides methods for retrieving and testing WebGL extensions.\n\t\t\t *\n\t\t\t * - `get(extensionName:string)`: Used to check whether a WebGL extension is supported\n\t\t\t * and return the extension object if available.\n\t\t\t * - `has(extensionName:string)`: returns `true` if the extension is supported.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#extensions\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.extensions = extensions;\n\n\t\t\t/**\n\t\t\t * Used to track properties of other objects like native WebGL objects.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#properties\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.properties = properties;\n\n\t\t\t/**\n\t\t\t * Manages the render lists of the renderer.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#renderLists\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.renderLists = renderLists;\n\n\n\n\t\t\t/**\n\t\t\t * Interface for managing shadows.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#shadowMap\n\t\t\t * @type {WebGLRenderer~ShadowMap}\n\t\t\t */\n\t\t\t_this.shadowMap = shadowMap;\n\n\t\t\t/**\n\t\t\t * Interface for managing the WebGL state.\n\t\t\t *\n\t\t\t * @name WebGLRenderer#state\n\t\t\t * @type {Object}\n\t\t\t */\n\t\t\t_this.state = state;\n\n\t\t\t/**\n\t\t\t * Holds a series of statistical information about the GPU memory\n\t\t\t * and the rendering process. Useful for debugging and monitoring.\n\t\t\t *\n\t\t\t * By default these data are reset at each render call but when having\n\t\t\t * multiple render passes per frame (e.g. when using post processing) it can\n\t\t\t * be preferred to reset with a custom pattern. First, set `autoReset` to\n\t\t\t * `false`.\n\t\t\t * ```js\n\t\t\t * renderer.info.autoReset = false;\n\t\t\t * ```\n\t\t\t * Call `reset()` whenever you have finished to render a single frame.\n\t\t\t * ```js\n\t\t\t * renderer.info.reset();\n\t\t\t * ```\n\t\t\t *\n\t\t\t * @name WebGLRenderer#info\n\t\t\t * @type {WebGLRenderer~Info}\n\t\t\t */\n\t\t\t_this.info = info;\n\n\t\t}\n\n\t\tinitGLContext();\n\n\t\t// initialize internal render target for non-UnsignedByteType color buffer\n\n\t\tif ( _outputBufferType !== UnsignedByteType ) {\n\n\t\t\toutput = new WebGLOutput( _outputBufferType, canvas.width, canvas.height, depth, stencil );\n\n\t\t}\n\n\t\t// xr\n\n\t\tconst xr = new WebXRManager( _this, _gl );\n\n\t\t/**\n\t\t * A reference to the XR manager.\n\t\t *\n\t\t * @type {WebXRManager}\n\t\t */\n\t\tthis.xr = xr;\n\n\t\t/**\n\t\t * Returns the rendering context.\n\t\t *\n\t\t * @return {WebGL2RenderingContext} The rendering context.\n\t\t */\n\t\tthis.getContext = function () {\n\n\t\t\treturn _gl;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the rendering context attributes.\n\t\t *\n\t\t * @return {WebGLContextAttributes} The rendering context attributes.\n\t\t */\n\t\tthis.getContextAttributes = function () {\n\n\t\t\treturn _gl.getContextAttributes();\n\n\t\t};\n\n\t\t/**\n\t\t * Simulates a loss of the WebGL context. This requires support for the `WEBGL_lose_context` extension.\n\t\t */\n\t\tthis.forceContextLoss = function () {\n\n\t\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\t\tif ( extension ) extension.loseContext();\n\n\t\t};\n\n\t\t/**\n\t\t * Simulates a restore of the WebGL context. This requires support for the `WEBGL_lose_context` extension.\n\t\t */\n\t\tthis.forceContextRestore = function () {\n\n\t\t\tconst extension = extensions.get( 'WEBGL_lose_context' );\n\t\t\tif ( extension ) extension.restoreContext();\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the pixel ratio.\n\t\t *\n\t\t * @return {number} The pixel ratio.\n\t\t */\n\t\tthis.getPixelRatio = function () {\n\n\t\t\treturn _pixelRatio;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the given pixel ratio and resizes the canvas if necessary.\n\t\t *\n\t\t * @param {number} value - The pixel ratio.\n\t\t */\n\t\tthis.setPixelRatio = function ( value ) {\n\n\t\t\tif ( value === undefined ) return;\n\n\t\t\t_pixelRatio = value;\n\n\t\t\tthis.setSize( _width, _height, false );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the renderer's size in logical pixels. This method does not honor the pixel ratio.\n\t\t *\n\t\t * @param {Vector2} target - The method writes the result in this target object.\n\t\t * @return {Vector2} The renderer's size in logical pixels.\n\t\t */\n\t\tthis.getSize = function ( target ) {\n\n\t\t\treturn target.set( _width, _height );\n\n\t\t};\n\n\t\t/**\n\t\t * Resizes the output canvas to (width, height) with device pixel ratio taken\n\t\t * into account, and also sets the viewport to fit that size, starting in (0,\n\t\t * 0). Setting `updateStyle` to false prevents any style changes to the output canvas.\n\t\t *\n\t\t * @param {number} width - The width in logical pixels.\n\t\t * @param {number} height - The height in logical pixels.\n\t\t * @param {boolean} [updateStyle=true] - Whether to update the `style` attribute of the canvas or not.\n\t\t */\n\t\tthis.setSize = function ( width, height, updateStyle = true ) {\n\n\t\t\tif ( xr.isPresenting ) {\n\n\t\t\t\twarn( 'WebGLRenderer: Can\\'t change size while VR device is presenting.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\tcanvas.width = Math.floor( width * _pixelRatio );\n\t\t\tcanvas.height = Math.floor( height * _pixelRatio );\n\n\t\t\tif ( updateStyle === true ) {\n\n\t\t\t\tcanvas.style.width = width + 'px';\n\t\t\t\tcanvas.style.height = height + 'px';\n\n\t\t\t}\n\n\t\t\tif ( output !== null ) {\n\n\t\t\t\toutput.setSize( canvas.width, canvas.height );\n\n\t\t\t}\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the drawing buffer size in physical pixels. This method honors the pixel ratio.\n\t\t *\n\t\t * @param {Vector2} target - The method writes the result in this target object.\n\t\t * @return {Vector2} The drawing buffer size.\n\t\t */\n\t\tthis.getDrawingBufferSize = function ( target ) {\n\n\t\t\treturn target.set( _width * _pixelRatio, _height * _pixelRatio ).floor();\n\n\t\t};\n\n\t\t/**\n\t\t * This method allows to define the drawing buffer size by specifying\n\t\t * width, height and pixel ratio all at once. The size of the drawing\n\t\t * buffer is computed with this formula:\n\t\t * ```js\n\t\t * size.x = width * pixelRatio;\n\t\t * size.y = height * pixelRatio;\n\t\t * ```\n\t\t *\n\t\t * @param {number} width - The width in logical pixels.\n\t\t * @param {number} height - The height in logical pixels.\n\t\t * @param {number} pixelRatio - The pixel ratio.\n\t\t */\n\t\tthis.setDrawingBufferSize = function ( width, height, pixelRatio ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_pixelRatio = pixelRatio;\n\n\t\t\tcanvas.width = Math.floor( width * pixelRatio );\n\t\t\tcanvas.height = Math.floor( height * pixelRatio );\n\n\t\t\tthis.setViewport( 0, 0, width, height );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the post-processing effects to be applied after rendering.\n\t\t *\n\t\t * @param {Array} effects - An array of post-processing effects.\n\t\t */\n\t\tthis.setEffects = function ( effects ) {\n\n\t\t\tif ( _outputBufferType === UnsignedByteType ) {\n\n\t\t\t\tconsole.error( 'THREE.WebGLRenderer: setEffects() requires outputBufferType set to HalfFloatType or FloatType.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( effects ) {\n\n\t\t\t\tfor ( let i = 0; i < effects.length; i ++ ) {\n\n\t\t\t\t\tif ( effects[ i ].isOutputPass === true ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.WebGLRenderer: OutputPass is not needed in setEffects(). Tone mapping and color space conversion are applied automatically.' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\toutput.setEffects( effects || [] );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current viewport definition.\n\t\t *\n\t\t * @param {Vector2} target - The method writes the result in this target object.\n\t\t * @return {Vector2} The current viewport definition.\n\t\t */\n\t\tthis.getCurrentViewport = function ( target ) {\n\n\t\t\treturn target.copy( _currentViewport );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the viewport definition.\n\t\t *\n\t\t * @param {Vector4} target - The method writes the result in this target object.\n\t\t * @return {Vector4} The viewport definition.\n\t\t */\n\t\tthis.getViewport = function ( target ) {\n\n\t\t\treturn target.copy( _viewport );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the viewport to render from `(x, y)` to `(x + width, y + height)`.\n\t\t *\n\t\t * @param {number | Vector4} x - The horizontal coordinate for the lower left corner of the viewport origin in logical pixel unit.\n\t\t * Or alternatively a four-component vector specifying all the parameters of the viewport.\n\t\t * @param {number} y - The vertical coordinate for the lower left corner of the viewport origin  in logical pixel unit.\n\t\t * @param {number} width - The width of the viewport in logical pixel unit.\n\t\t * @param {number} height - The height of the viewport in logical pixel unit.\n\t\t */\n\t\tthis.setViewport = function ( x, y, width, height ) {\n\n\t\t\tif ( x.isVector4 ) {\n\n\t\t\t\t_viewport.set( x.x, x.y, x.z, x.w );\n\n\t\t\t} else {\n\n\t\t\t\t_viewport.set( x, y, width, height );\n\n\t\t\t}\n\n\t\t\tstate.viewport( _currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).round() );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the scissor region.\n\t\t *\n\t\t * @param {Vector4} target - The method writes the result in this target object.\n\t\t * @return {Vector4} The scissor region.\n\t\t */\n\t\tthis.getScissor = function ( target ) {\n\n\t\t\treturn target.copy( _scissor );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the scissor region to render from `(x, y)` to `(x + width, y + height)`.\n\t\t *\n\t\t * @param {number | Vector4} x - The horizontal coordinate for the lower left corner of the scissor region origin in logical pixel unit.\n\t\t * Or alternatively a four-component vector specifying all the parameters of the scissor region.\n\t\t * @param {number} y - The vertical coordinate for the lower left corner of the scissor region origin  in logical pixel unit.\n\t\t * @param {number} width - The width of the scissor region in logical pixel unit.\n\t\t * @param {number} height - The height of the scissor region in logical pixel unit.\n\t\t */\n\t\tthis.setScissor = function ( x, y, width, height ) {\n\n\t\t\tif ( x.isVector4 ) {\n\n\t\t\t\t_scissor.set( x.x, x.y, x.z, x.w );\n\n\t\t\t} else {\n\n\t\t\t\t_scissor.set( x, y, width, height );\n\n\t\t\t}\n\n\t\t\tstate.scissor( _currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).round() );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns `true` if the scissor test is enabled.\n\t\t *\n\t\t * @return {boolean} Whether the scissor test is enabled or not.\n\t\t */\n\t\tthis.getScissorTest = function () {\n\n\t\t\treturn _scissorTest;\n\n\t\t};\n\n\t\t/**\n\t\t * Enable or disable the scissor test. When this is enabled, only the pixels\n\t\t * within the defined scissor area will be affected by further renderer\n\t\t * actions.\n\t\t *\n\t\t * @param {boolean} boolean - Whether the scissor test is enabled or not.\n\t\t */\n\t\tthis.setScissorTest = function ( boolean ) {\n\n\t\t\tstate.setScissorTest( _scissorTest = boolean );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets a custom opaque sort function for the render lists. Pass `null`\n\t\t * to use the default `painterSortStable` function.\n\t\t *\n\t\t * @param {?Function} method - The opaque sort function.\n\t\t */\n\t\tthis.setOpaqueSort = function ( method ) {\n\n\t\t\t_opaqueSort = method;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets a custom transparent sort function for the render lists. Pass `null`\n\t\t * to use the default `reversePainterSortStable` function.\n\t\t *\n\t\t * @param {?Function} method - The opaque sort function.\n\t\t */\n\t\tthis.setTransparentSort = function ( method ) {\n\n\t\t\t_transparentSort = method;\n\n\t\t};\n\n\t\t// Clearing\n\n\t\t/**\n\t\t * Returns the clear color.\n\t\t *\n\t\t * @param {Color} target - The method writes the result in this target object.\n\t\t * @return {Color} The clear color.\n\t\t */\n\t\tthis.getClearColor = function ( target ) {\n\n\t\t\treturn target.copy( background.getClearColor() );\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the clear color and alpha.\n\t\t *\n\t\t * @param {Color} color - The clear color.\n\t\t * @param {number} [alpha=1] - The clear alpha.\n\t\t */\n\t\tthis.setClearColor = function () {\n\n\t\t\tbackground.setClearColor( ...arguments );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the clear alpha. Ranges within `[0,1]`.\n\t\t *\n\t\t * @return {number} The clear alpha.\n\t\t */\n\t\tthis.getClearAlpha = function () {\n\n\t\t\treturn background.getClearAlpha();\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the clear alpha.\n\t\t *\n\t\t * @param {number} alpha - The clear alpha.\n\t\t */\n\t\tthis.setClearAlpha = function () {\n\n\t\t\tbackground.setClearAlpha( ...arguments );\n\n\t\t};\n\n\t\t/**\n\t\t * Tells the renderer to clear its color, depth or stencil drawing buffer(s).\n\t\t * This method initializes the buffers to the current clear color values.\n\t\t *\n\t\t * @param {boolean} [color=true] - Whether the color buffer should be cleared or not.\n\t\t * @param {boolean} [depth=true] - Whether the depth buffer should be cleared or not.\n\t\t * @param {boolean} [stencil=true] - Whether the stencil buffer should be cleared or not.\n\t\t */\n\t\tthis.clear = function ( color = true, depth = true, stencil = true ) {\n\n\t\t\tlet bits = 0;\n\n\t\t\tif ( color ) {\n\n\t\t\t\t// check if we're trying to clear an integer target\n\t\t\t\tlet isIntegerFormat = false;\n\t\t\t\tif ( _currentRenderTarget !== null ) {\n\n\t\t\t\t\tconst targetFormat = _currentRenderTarget.texture.format;\n\t\t\t\t\tisIntegerFormat = INTEGER_FORMATS.has( targetFormat );\n\n\t\t\t\t}\n\n\t\t\t\t// use the appropriate clear functions to clear the target if it's a signed\n\t\t\t\t// or unsigned integer target\n\t\t\t\tif ( isIntegerFormat ) {\n\n\t\t\t\t\tconst targetType = _currentRenderTarget.texture.type;\n\t\t\t\t\tconst isUnsignedType = UNSIGNED_TYPES.has( targetType );\n\n\t\t\t\t\tconst clearColor = background.getClearColor();\n\t\t\t\t\tconst a = background.getClearAlpha();\n\t\t\t\t\tconst r = clearColor.r;\n\t\t\t\t\tconst g = clearColor.g;\n\t\t\t\t\tconst b = clearColor.b;\n\n\t\t\t\t\tif ( isUnsignedType ) {\n\n\t\t\t\t\t\tuintClearColor[ 0 ] = r;\n\t\t\t\t\t\tuintClearColor[ 1 ] = g;\n\t\t\t\t\t\tuintClearColor[ 2 ] = b;\n\t\t\t\t\t\tuintClearColor[ 3 ] = a;\n\t\t\t\t\t\t_gl.clearBufferuiv( _gl.COLOR, 0, uintClearColor );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tintClearColor[ 0 ] = r;\n\t\t\t\t\t\tintClearColor[ 1 ] = g;\n\t\t\t\t\t\tintClearColor[ 2 ] = b;\n\t\t\t\t\t\tintClearColor[ 3 ] = a;\n\t\t\t\t\t\t_gl.clearBufferiv( _gl.COLOR, 0, intClearColor );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbits |= _gl.COLOR_BUFFER_BIT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( depth ) {\n\n\t\t\t\tbits |= _gl.DEPTH_BUFFER_BIT;\n\n\t\t\t}\n\n\t\t\tif ( stencil ) {\n\n\t\t\t\tbits |= _gl.STENCIL_BUFFER_BIT;\n\t\t\t\tthis.state.buffers.stencil.setMask( 0xffffffff );\n\n\t\t\t}\n\n\t\t\t_gl.clear( bits );\n\n\t\t};\n\n\t\t/**\n\t\t * Clears the color buffer. Equivalent to calling `renderer.clear( true, false, false )`.\n\t\t */\n\t\tthis.clearColor = function () {\n\n\t\t\tthis.clear( true, false, false );\n\n\t\t};\n\n\t\t/**\n\t\t * Clears the depth buffer. Equivalent to calling `renderer.clear( false, true, false )`.\n\t\t */\n\t\tthis.clearDepth = function () {\n\n\t\t\tthis.clear( false, true, false );\n\n\t\t};\n\n\t\t/**\n\t\t * Clears the stencil buffer. Equivalent to calling `renderer.clear( false, false, true )`.\n\t\t */\n\t\tthis.clearStencil = function () {\n\n\t\t\tthis.clear( false, false, true );\n\n\t\t};\n\n\t\t/**\n\t\t * Frees the GPU-related resources allocated by this instance. Call this\n\t\t * method whenever this instance is no longer used in your app.\n\t\t */\n\t\tthis.dispose = function () {\n\n\t\t\tcanvas.removeEventListener( 'webglcontextlost', onContextLost, false );\n\t\t\tcanvas.removeEventListener( 'webglcontextrestored', onContextRestore, false );\n\t\t\tcanvas.removeEventListener( 'webglcontextcreationerror', onContextCreationError, false );\n\n\t\t\tbackground.dispose();\n\t\t\trenderLists.dispose();\n\t\t\trenderStates.dispose();\n\t\t\tproperties.dispose();\n\t\t\tcubemaps.dispose();\n\t\t\tcubeuvmaps.dispose();\n\t\t\tobjects.dispose();\n\t\t\tbindingStates.dispose();\n\t\t\tuniformsGroups.dispose();\n\t\t\tprogramCache.dispose();\n\n\t\t\txr.dispose();\n\n\t\t\txr.removeEventListener( 'sessionstart', onXRSessionStart );\n\t\t\txr.removeEventListener( 'sessionend', onXRSessionEnd );\n\n\t\t\tanimation.stop();\n\n\t\t};\n\n\t\t// Events\n\n\t\tfunction onContextLost( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t\tlog( 'WebGLRenderer: Context Lost.' );\n\n\t\t\t_isContextLost = true;\n\n\t\t}\n\n\t\tfunction onContextRestore( /* event */ ) {\n\n\t\t\tlog( 'WebGLRenderer: Context Restored.' );\n\n\t\t\t_isContextLost = false;\n\n\t\t\tconst infoAutoReset = info.autoReset;\n\t\t\tconst shadowMapEnabled = shadowMap.enabled;\n\t\t\tconst shadowMapAutoUpdate = shadowMap.autoUpdate;\n\t\t\tconst shadowMapNeedsUpdate = shadowMap.needsUpdate;\n\t\t\tconst shadowMapType = shadowMap.type;\n\n\t\t\tinitGLContext();\n\n\t\t\tinfo.autoReset = infoAutoReset;\n\t\t\tshadowMap.enabled = shadowMapEnabled;\n\t\t\tshadowMap.autoUpdate = shadowMapAutoUpdate;\n\t\t\tshadowMap.needsUpdate = shadowMapNeedsUpdate;\n\t\t\tshadowMap.type = shadowMapType;\n\n\t\t}\n\n\t\tfunction onContextCreationError( event ) {\n\n\t\t\terror( 'WebGLRenderer: A WebGL context could not be created. Reason: ', event.statusMessage );\n\n\t\t}\n\n\t\tfunction onMaterialDispose( event ) {\n\n\t\t\tconst material = event.target;\n\n\t\t\tmaterial.removeEventListener( 'dispose', onMaterialDispose );\n\n\t\t\tdeallocateMaterial( material );\n\n\t\t}\n\n\t\t// Buffer deallocation\n\n\t\tfunction deallocateMaterial( material ) {\n\n\t\t\treleaseMaterialProgramReferences( material );\n\n\t\t\tproperties.remove( material );\n\n\t\t}\n\n\n\t\tfunction releaseMaterialProgramReferences( material ) {\n\n\t\t\tconst programs = properties.get( material ).programs;\n\n\t\t\tif ( programs !== undefined ) {\n\n\t\t\t\tprograms.forEach( function ( program ) {\n\n\t\t\t\t\tprogramCache.releaseProgram( program );\n\n\t\t\t\t} );\n\n\t\t\t\tif ( material.isShaderMaterial ) {\n\n\t\t\t\t\tprogramCache.releaseShaderCache( material );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Buffer rendering\n\n\t\tthis.renderBufferDirect = function ( camera, scene, geometry, material, object, group ) {\n\n\t\t\tif ( scene === null ) scene = _emptyScene; // renderBufferDirect second parameter used to be fog (could be null)\n\n\t\t\tconst frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );\n\n\t\t\tconst program = setProgram( camera, scene, geometry, material, object );\n\n\t\t\tstate.setMaterial( material, frontFaceCW );\n\n\t\t\t//\n\n\t\t\tlet index = geometry.index;\n\t\t\tlet rangeFactor = 1;\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tindex = geometries.getWireframeAttribute( geometry );\n\n\t\t\t\tif ( index === undefined ) return;\n\n\t\t\t\trangeFactor = 2;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tconst drawRange = geometry.drawRange;\n\t\t\tconst position = geometry.attributes.position;\n\n\t\t\tlet drawStart = drawRange.start * rangeFactor;\n\t\t\tlet drawEnd = ( drawRange.start + drawRange.count ) * rangeFactor;\n\n\t\t\tif ( group !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, group.start * rangeFactor );\n\t\t\t\tdrawEnd = Math.min( drawEnd, ( group.start + group.count ) * rangeFactor );\n\n\t\t\t}\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, 0 );\n\t\t\t\tdrawEnd = Math.min( drawEnd, index.count );\n\n\t\t\t} else if ( position !== undefined && position !== null ) {\n\n\t\t\t\tdrawStart = Math.max( drawStart, 0 );\n\t\t\t\tdrawEnd = Math.min( drawEnd, position.count );\n\n\t\t\t}\n\n\t\t\tconst drawCount = drawEnd - drawStart;\n\n\t\t\tif ( drawCount < 0 || drawCount === Infinity ) return;\n\n\t\t\t//\n\n\t\t\tbindingStates.setup( object, material, program, geometry, index );\n\n\t\t\tlet attribute;\n\t\t\tlet renderer = bufferRenderer;\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tattribute = attributes.get( index );\n\n\t\t\t\trenderer = indexedBufferRenderer;\n\t\t\t\trenderer.setIndex( attribute );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * getTargetPixelRatio() );\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isLine ) {\n\n\t\t\t\tlet lineWidth = material.linewidth;\n\n\t\t\t\tif ( lineWidth === undefined ) lineWidth = 1; // Not using Line*Material\n\n\t\t\t\tstate.setLineWidth( lineWidth * getTargetPixelRatio() );\n\n\t\t\t\tif ( object.isLineSegments ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINES );\n\n\t\t\t\t} else if ( object.isLineLoop ) {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_LOOP );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.setMode( _gl.LINE_STRIP );\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isPoints ) {\n\n\t\t\t\trenderer.setMode( _gl.POINTS );\n\n\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\trenderer.setMode( _gl.TRIANGLES );\n\n\t\t\t}\n\n\t\t\tif ( object.isBatchedMesh ) {\n\n\t\t\t\tif ( object._multiDrawInstances !== null ) {\n\n\t\t\t\t\t// @deprecated, r174\n\t\t\t\t\twarnOnce( 'WebGLRenderer: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.' );\n\t\t\t\t\trenderer.renderMultiDrawInstances( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( ! extensions.get( 'WEBGL_multi_draw' ) ) {\n\n\t\t\t\t\t\tconst starts = object._multiDrawStarts;\n\t\t\t\t\t\tconst counts = object._multiDrawCounts;\n\t\t\t\t\t\tconst drawCount = object._multiDrawCount;\n\t\t\t\t\t\tconst bytesPerElement = index ? attributes.get( index ).bytesPerElement : 1;\n\t\t\t\t\t\tconst uniforms = properties.get( material ).currentProgram.getUniforms();\n\t\t\t\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\t\t\t\tuniforms.setValue( _gl, '_gl_DrawID', i );\n\t\t\t\t\t\t\trenderer.render( starts[ i ] / bytesPerElement, counts[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\trenderer.renderMultiDraw( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isInstancedMesh ) {\n\n\t\t\t\trenderer.renderInstances( drawStart, drawCount, object.count );\n\n\t\t\t} else if ( geometry.isInstancedBufferGeometry ) {\n\n\t\t\t\tconst maxInstanceCount = geometry._maxInstanceCount !== undefined ? geometry._maxInstanceCount : Infinity;\n\t\t\t\tconst instanceCount = Math.min( geometry.instanceCount, maxInstanceCount );\n\n\t\t\t\trenderer.renderInstances( drawStart, drawCount, instanceCount );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.render( drawStart, drawCount );\n\n\t\t\t}\n\n\t\t};\n\n\t\t// Compile\n\n\t\tfunction prepareMaterial( material, scene, object ) {\n\n\t\t\tif ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {\n\n\t\t\t\tmaterial.side = BackSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\tmaterial.side = FrontSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t\tmaterial.side = DoubleSide;\n\n\t\t\t} else {\n\n\t\t\t\tgetProgram( material, scene, object );\n\n\t\t\t}\n\n\t\t}\n\n\t\t/**\n\t\t * Compiles all materials in the scene with the camera. This is useful to precompile shaders\n\t\t * before the first rendering. If you want to add a 3D object to an existing scene, use the third\n\t\t * optional parameter for applying the target scene.\n\t\t *\n\t\t * Note that the (target) scene's lighting and environment must be configured before calling this method.\n\t\t *\n\t\t * @param {Object3D} scene - The scene or another type of 3D object to precompile.\n\t\t * @param {Camera} camera - The camera.\n\t\t * @param {?Scene} [targetScene=null] - The target scene.\n\t\t * @return {Set<Material>} The precompiled materials.\n\t\t */\n\t\tthis.compile = function ( scene, camera, targetScene = null ) {\n\n\t\t\tif ( targetScene === null ) targetScene = scene;\n\n\t\t\tcurrentRenderState = renderStates.get( targetScene );\n\t\t\tcurrentRenderState.init( camera );\n\n\t\t\trenderStateStack.push( currentRenderState );\n\n\t\t\t// gather lights from both the target scene and the new object that will be added to the scene.\n\n\t\t\ttargetScene.traverseVisible( function ( object ) {\n\n\t\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tif ( scene !== targetScene ) {\n\n\t\t\t\tscene.traverseVisible( function ( object ) {\n\n\t\t\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tcurrentRenderState.setupLights();\n\n\t\t\t// Only initialize materials in the new scene, not the targetScene.\n\n\t\t\tconst materials = new Set();\n\n\t\t\tscene.traverse( function ( object ) {\n\n\t\t\t\tif ( ! ( object.isMesh || object.isPoints || object.isLine || object.isSprite ) ) {\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tconst material = object.material;\n\n\t\t\t\tif ( material ) {\n\n\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\tfor ( let i = 0; i < material.length; i ++ ) {\n\n\t\t\t\t\t\t\tconst material2 = material[ i ];\n\n\t\t\t\t\t\t\tprepareMaterial( material2, targetScene, object );\n\t\t\t\t\t\t\tmaterials.add( material2 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tprepareMaterial( material, targetScene, object );\n\t\t\t\t\t\tmaterials.add( material );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tcurrentRenderState = renderStateStack.pop();\n\n\t\t\treturn materials;\n\n\t\t};\n\n\t\t// compileAsync\n\n\t\t/**\n\t\t * Asynchronous version of {@link WebGLRenderer#compile}.\n\t\t *\n\t\t * This method makes use of the `KHR_parallel_shader_compile` WebGL extension. Hence,\n\t\t * it is recommended to use this version of `compile()` whenever possible.\n\t\t *\n\t\t * @async\n\t\t * @param {Object3D} scene - The scene or another type of 3D object to precompile.\n\t\t * @param {Camera} camera - The camera.\n\t\t * @param {?Scene} [targetScene=null] - The target scene.\n\t\t * @return {Promise} A Promise that resolves when the given scene can be rendered without unnecessary stalling due to shader compilation.\n\t\t */\n\t\tthis.compileAsync = function ( scene, camera, targetScene = null ) {\n\n\t\t\tconst materials = this.compile( scene, camera, targetScene );\n\n\t\t\t// Wait for all the materials in the new object to indicate that they're\n\t\t\t// ready to be used before resolving the promise.\n\n\t\t\treturn new Promise( ( resolve ) => {\n\n\t\t\t\tfunction checkMaterialsReady() {\n\n\t\t\t\t\tmaterials.forEach( function ( material ) {\n\n\t\t\t\t\t\tconst materialProperties = properties.get( material );\n\t\t\t\t\t\tconst program = materialProperties.currentProgram;\n\n\t\t\t\t\t\tif ( program.isReady() ) {\n\n\t\t\t\t\t\t\t// remove any programs that report they're ready to use from the list\n\t\t\t\t\t\t\tmaterials.delete( material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\t// once the list of compiling materials is empty, call the callback\n\n\t\t\t\t\tif ( materials.size === 0 ) {\n\n\t\t\t\t\t\tresolve( scene );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// if some materials are still not ready, wait a bit and check again\n\n\t\t\t\t\tsetTimeout( checkMaterialsReady, 10 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( extensions.get( 'KHR_parallel_shader_compile' ) !== null ) {\n\n\t\t\t\t\t// If we can check the compilation status of the materials without\n\t\t\t\t\t// blocking then do so right away.\n\n\t\t\t\t\tcheckMaterialsReady();\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Otherwise start by waiting a bit to give the materials we just\n\t\t\t\t\t// initialized a chance to finish.\n\n\t\t\t\t\tsetTimeout( checkMaterialsReady, 10 );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t};\n\n\t\t// Animation Loop\n\n\t\tlet onAnimationFrameCallback = null;\n\n\t\tfunction onAnimationFrame( time ) {\n\n\t\t\tif ( onAnimationFrameCallback ) onAnimationFrameCallback( time );\n\n\t\t}\n\n\t\tfunction onXRSessionStart() {\n\n\t\t\tanimation.stop();\n\n\t\t}\n\n\t\tfunction onXRSessionEnd() {\n\n\t\t\tanimation.start();\n\n\t\t}\n\n\t\tconst animation = new WebGLAnimation();\n\t\tanimation.setAnimationLoop( onAnimationFrame );\n\n\t\tif ( typeof self !== 'undefined' ) animation.setContext( self );\n\n\t\t/**\n\t\t * Applications are advised to always define the animation loop\n\t\t * with this method and not manually with `requestAnimationFrame()`\n\t\t * for best compatibility.\n\t\t *\n\t\t * @param {?onAnimationCallback} callback - The application's animation loop.\n\t\t */\n\t\tthis.setAnimationLoop = function ( callback ) {\n\n\t\t\tonAnimationFrameCallback = callback;\n\t\t\txr.setAnimationLoop( callback );\n\n\t\t\t( callback === null ) ? animation.stop() : animation.start();\n\n\t\t};\n\n\t\txr.addEventListener( 'sessionstart', onXRSessionStart );\n\t\txr.addEventListener( 'sessionend', onXRSessionEnd );\n\n\t\t// Rendering\n\n\t\t/**\n\t\t * Renders the given scene (or other type of 3D object) using the given camera.\n\t\t *\n\t\t * The render is done to a previously specified render target set by calling {@link WebGLRenderer#setRenderTarget}\n\t\t * or to the canvas as usual.\n\t\t *\n\t\t * By default render buffers are cleared before rendering but you can prevent\n\t\t * this by setting the property `autoClear` to `false`. If you want to prevent\n\t\t * only certain buffers being cleared you can `autoClearColor`, `autoClearDepth`\n\t\t * or `autoClearStencil` to `false`. To force a clear, use {@link WebGLRenderer#clear}.\n\t\t *\n\t\t * @param {Object3D} scene - The scene to render.\n\t\t * @param {Camera} camera - The camera.\n\t\t */\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( camera !== undefined && camera.isCamera !== true ) {\n\n\t\t\t\terror( 'WebGLRenderer.render: camera is not an instance of THREE.Camera.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( _isContextLost === true ) return;\n\n\t\t\t// use internal render target for HalfFloatType color buffer (only when tone mapping is enabled)\n\n\t\t\tconst isXRPresenting = xr.enabled === true && xr.isPresenting === true;\n\n\t\t\tconst useOutput = output !== null && ( _currentRenderTarget === null || isXRPresenting ) && output.begin( _this, _currentRenderTarget );\n\n\t\t\t// update scene graph\n\n\t\t\tif ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t\t// update camera matrices and frustum\n\n\t\t\tif ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();\n\n\t\t\tif ( xr.enabled === true && xr.isPresenting === true && ( output === null || output.isCompositing() === false ) ) {\n\n\t\t\t\tif ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera );\n\n\t\t\t\tcamera = xr.getCamera(); // use XR camera for rendering\n\n\t\t\t}\n\n\t\t\t//\n\t\t\tif ( scene.isScene === true ) scene.onBeforeRender( _this, scene, camera, _currentRenderTarget );\n\n\t\t\tcurrentRenderState = renderStates.get( scene, renderStateStack.length );\n\t\t\tcurrentRenderState.init( camera );\n\n\t\t\trenderStateStack.push( currentRenderState );\n\n\t\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t\t_frustum.setFromProjectionMatrix( _projScreenMatrix, WebGLCoordinateSystem, camera.reversedDepth );\n\n\t\t\t_localClippingEnabled = this.localClippingEnabled;\n\t\t\t_clippingEnabled = clipping.init( this.clippingPlanes, _localClippingEnabled );\n\n\t\t\tcurrentRenderList = renderLists.get( scene, renderListStack.length );\n\t\t\tcurrentRenderList.init();\n\n\t\t\trenderListStack.push( currentRenderList );\n\n\t\t\tif ( xr.enabled === true && xr.isPresenting === true ) {\n\n\t\t\t\tconst depthSensingMesh = _this.xr.getDepthSensingMesh();\n\n\t\t\t\tif ( depthSensingMesh !== null ) {\n\n\t\t\t\t\tprojectObject( depthSensingMesh, camera, - Infinity, _this.sortObjects );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tprojectObject( scene, camera, 0, _this.sortObjects );\n\n\t\t\tcurrentRenderList.finish();\n\n\t\t\tif ( _this.sortObjects === true ) {\n\n\t\t\t\tcurrentRenderList.sort( _opaqueSort, _transparentSort );\n\n\t\t\t}\n\n\t\t\t_renderBackground = xr.enabled === false || xr.isPresenting === false || xr.hasDepthSensing() === false;\n\t\t\tif ( _renderBackground ) {\n\n\t\t\t\tbackground.addToRenderList( currentRenderList, scene );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tthis.info.render.frame ++;\n\n\t\t\tif ( _clippingEnabled === true ) clipping.beginShadows();\n\n\t\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\t\tshadowMap.render( shadowsArray, scene, camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.endShadows();\n\n\t\t\t//\n\n\t\t\tif ( this.info.autoReset === true ) this.info.reset();\n\n\t\t\t// render scene (skip if first effect is a render pass - it will render the scene itself)\n\n\t\t\tconst skipSceneRender = useOutput && output.hasRenderPass();\n\n\t\t\tif ( skipSceneRender === false ) {\n\n\t\t\t\tconst opaqueObjects = currentRenderList.opaque;\n\t\t\t\tconst transmissiveObjects = currentRenderList.transmissive;\n\n\t\t\t\tcurrentRenderState.setupLights();\n\n\t\t\t\tif ( camera.isArrayCamera ) {\n\n\t\t\t\t\tconst cameras = camera.cameras;\n\n\t\t\t\t\tif ( transmissiveObjects.length > 0 ) {\n\n\t\t\t\t\t\tfor ( let i = 0, l = cameras.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tconst camera2 = cameras[ i ];\n\n\t\t\t\t\t\t\trenderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera2 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( _renderBackground ) background.render( scene );\n\n\t\t\t\t\tfor ( let i = 0, l = cameras.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst camera2 = cameras[ i ];\n\n\t\t\t\t\t\trenderScene( currentRenderList, scene, camera2, camera2.viewport );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( transmissiveObjects.length > 0 ) renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera );\n\n\t\t\t\t\tif ( _renderBackground ) background.render( scene );\n\n\t\t\t\t\trenderScene( currentRenderList, scene, camera );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( _currentRenderTarget !== null && _currentActiveMipmapLevel === 0 ) {\n\n\t\t\t\t// resolve multisample renderbuffers to a single-sample texture if necessary\n\n\t\t\t\ttextures.updateMultisampleRenderTarget( _currentRenderTarget );\n\n\t\t\t\t// Generate mipmap if we're using any kind of mipmap filtering\n\n\t\t\t\ttextures.updateRenderTargetMipmap( _currentRenderTarget );\n\n\t\t\t}\n\n\t\t\t// copy from internal render target to canvas using fullscreen quad\n\n\t\t\tif ( useOutput ) {\n\n\t\t\t\toutput.end( _this );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( scene.isScene === true ) scene.onAfterRender( _this, scene, camera );\n\n\t\t\t// _gl.finish();\n\n\t\t\tbindingStates.resetDefaultState();\n\t\t\t_currentMaterialId = -1;\n\t\t\t_currentCamera = null;\n\n\t\t\trenderStateStack.pop();\n\n\t\t\tif ( renderStateStack.length > 0 ) {\n\n\t\t\t\tcurrentRenderState = renderStateStack[ renderStateStack.length - 1 ];\n\n\t\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, currentRenderState.state.camera );\n\n\t\t\t} else {\n\n\t\t\t\tcurrentRenderState = null;\n\n\t\t\t}\n\n\t\t\trenderListStack.pop();\n\n\t\t\tif ( renderListStack.length > 0 ) {\n\n\t\t\t\tcurrentRenderList = renderListStack[ renderListStack.length - 1 ];\n\n\t\t\t} else {\n\n\t\t\t\tcurrentRenderList = null;\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction projectObject( object, camera, groupOrder, sortObjects ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tconst visible = object.layers.test( camera.layers );\n\n\t\t\tif ( visible ) {\n\n\t\t\t\tif ( object.isGroup ) {\n\n\t\t\t\t\tgroupOrder = object.renderOrder;\n\n\t\t\t\t} else if ( object.isLOD ) {\n\n\t\t\t\t\tif ( object.autoUpdate === true ) object.update( camera );\n\n\t\t\t\t} else if ( object.isLight ) {\n\n\t\t\t\t\tcurrentRenderState.pushLight( object );\n\n\t\t\t\t\tif ( object.castShadow ) {\n\n\t\t\t\t\t\tcurrentRenderState.pushShadow( object );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsSprite( object ) ) {\n\n\t\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t\t_vector4.setFromMatrixPosition( object.matrixWorld )\n\t\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\t\tif ( material.visible ) {\n\n\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector4.z, null );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\t\tif ( ! object.frustumCulled || _frustum.intersectsObject( object ) ) {\n\n\t\t\t\t\t\tconst geometry = objects.update( object );\n\t\t\t\t\t\tconst material = object.material;\n\n\t\t\t\t\t\tif ( sortObjects ) {\n\n\t\t\t\t\t\t\tif ( object.boundingSphere !== undefined ) {\n\n\t\t\t\t\t\t\t\tif ( object.boundingSphere === null ) object.computeBoundingSphere();\n\t\t\t\t\t\t\t\t_vector4.copy( object.boundingSphere.center );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\t\t\t\t\t\t\t\t_vector4.copy( geometry.boundingSphere.center );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t_vector4\n\t\t\t\t\t\t\t\t.applyMatrix4( object.matrixWorld )\n\t\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, groupMaterial, groupOrder, _vector4.z, group );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\t\t\tcurrentRenderList.push( object, geometry, material, groupOrder, _vector4.z, null );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst children = object.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ], camera, groupOrder, sortObjects );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderScene( currentRenderList, scene, camera, viewport ) {\n\n\t\t\tconst { opaque: opaqueObjects, transmissive: transmissiveObjects, transparent: transparentObjects } = currentRenderList;\n\n\t\t\tcurrentRenderState.setupLightsView( camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera );\n\n\t\t\tif ( viewport ) state.viewport( _currentViewport.copy( viewport ) );\n\n\t\t\tif ( opaqueObjects.length > 0 ) renderObjects( opaqueObjects, scene, camera );\n\t\t\tif ( transmissiveObjects.length > 0 ) renderObjects( transmissiveObjects, scene, camera );\n\t\t\tif ( transparentObjects.length > 0 ) renderObjects( transparentObjects, scene, camera );\n\n\t\t\t// Ensure depth buffer writing is enabled so it can be cleared on next render\n\n\t\t\tstate.buffers.depth.setTest( true );\n\t\t\tstate.buffers.depth.setMask( true );\n\t\t\tstate.buffers.color.setMask( true );\n\n\t\t\tstate.setPolygonOffset( false );\n\n\t\t}\n\n\t\tfunction renderTransmissionPass( opaqueObjects, transmissiveObjects, scene, camera ) {\n\n\t\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\t\tif ( overrideMaterial !== null ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( currentRenderState.state.transmissionRenderTarget[ camera.id ] === undefined ) {\n\n\t\t\t\tconst hasHalfFloatSupport = extensions.has( 'EXT_color_buffer_half_float' ) || extensions.has( 'EXT_color_buffer_float' );\n\n\t\t\t\tcurrentRenderState.state.transmissionRenderTarget[ camera.id ] = new WebGLRenderTarget( 1, 1, {\n\t\t\t\t\tgenerateMipmaps: true,\n\t\t\t\t\ttype: hasHalfFloatSupport ? HalfFloatType : UnsignedByteType,\n\t\t\t\t\tminFilter: LinearMipmapLinearFilter,\n\t\t\t\t\tsamples: capabilities.samples,\n\t\t\t\t\tstencilBuffer: stencil,\n\t\t\t\t\tresolveDepthBuffer: false,\n\t\t\t\t\tresolveStencilBuffer: false,\n\t\t\t\t\tcolorSpace: ColorManagement.workingColorSpace,\n\t\t\t\t} );\n\n\t\t\t\t// debug\n\n\t\t\t\t/*\n\t\t\t\tconst geometry = new PlaneGeometry();\n\t\t\t\tconst material = new MeshBasicMaterial( { map: _transmissionRenderTarget.texture } );\n\n\t\t\t\tconst mesh = new Mesh( geometry, material );\n\t\t\t\tscene.add( mesh );\n\t\t\t\t*/\n\n\t\t\t}\n\n\t\t\tconst transmissionRenderTarget = currentRenderState.state.transmissionRenderTarget[ camera.id ];\n\n\t\t\tconst activeViewport = camera.viewport || _currentViewport;\n\t\t\ttransmissionRenderTarget.setSize( activeViewport.z * _this.transmissionResolutionScale, activeViewport.w * _this.transmissionResolutionScale );\n\n\t\t\t//\n\n\t\t\tconst currentRenderTarget = _this.getRenderTarget();\n\t\t\tconst currentActiveCubeFace = _this.getActiveCubeFace();\n\t\t\tconst currentActiveMipmapLevel = _this.getActiveMipmapLevel();\n\n\t\t\t_this.setRenderTarget( transmissionRenderTarget );\n\n\t\t\t_this.getClearColor( _currentClearColor );\n\t\t\t_currentClearAlpha = _this.getClearAlpha();\n\t\t\tif ( _currentClearAlpha < 1 ) _this.setClearColor( 0xffffff, 0.5 );\n\n\t\t\t_this.clear();\n\n\t\t\tif ( _renderBackground ) background.render( scene );\n\n\t\t\t// Turn off the features which can affect the frag color for opaque objects pass.\n\t\t\t// Otherwise they are applied twice in opaque objects pass and transmission objects pass.\n\t\t\tconst currentToneMapping = _this.toneMapping;\n\t\t\t_this.toneMapping = NoToneMapping;\n\n\t\t\t// Remove viewport from camera to avoid nested render calls resetting viewport to it (e.g Reflector).\n\t\t\t// Transmission render pass requires viewport to match the transmissionRenderTarget.\n\t\t\tconst currentCameraViewport = camera.viewport;\n\t\t\tif ( camera.viewport !== undefined ) camera.viewport = undefined;\n\n\t\t\tcurrentRenderState.setupLightsView( camera );\n\n\t\t\tif ( _clippingEnabled === true ) clipping.setGlobalState( _this.clippingPlanes, camera );\n\n\t\t\trenderObjects( opaqueObjects, scene, camera );\n\n\t\t\ttextures.updateMultisampleRenderTarget( transmissionRenderTarget );\n\t\t\ttextures.updateRenderTargetMipmap( transmissionRenderTarget );\n\n\t\t\tif ( extensions.has( 'WEBGL_multisampled_render_to_texture' ) === false ) { // see #28131\n\n\t\t\t\tlet renderTargetNeedsUpdate = false;\n\n\t\t\t\tfor ( let i = 0, l = transmissiveObjects.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst renderItem = transmissiveObjects[ i ];\n\n\t\t\t\t\tconst { object, geometry, material, group } = renderItem;\n\n\t\t\t\t\tif ( material.side === DoubleSide && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\t\tconst currentSide = material.side;\n\n\t\t\t\t\t\tmaterial.side = BackSide;\n\t\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t\t\t\tmaterial.side = currentSide;\n\t\t\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t\t\t\trenderTargetNeedsUpdate = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderTargetNeedsUpdate === true ) {\n\n\t\t\t\t\ttextures.updateMultisampleRenderTarget( transmissionRenderTarget );\n\t\t\t\t\ttextures.updateRenderTargetMipmap( transmissionRenderTarget );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_this.setRenderTarget( currentRenderTarget, currentActiveCubeFace, currentActiveMipmapLevel );\n\n\t\t\t_this.setClearColor( _currentClearColor, _currentClearAlpha );\n\n\t\t\tif ( currentCameraViewport !== undefined ) camera.viewport = currentCameraViewport;\n\n\t\t\t_this.toneMapping = currentToneMapping;\n\n\t\t}\n\n\t\tfunction renderObjects( renderList, scene, camera ) {\n\n\t\t\tconst overrideMaterial = scene.isScene === true ? scene.overrideMaterial : null;\n\n\t\t\tfor ( let i = 0, l = renderList.length; i < l; i ++ ) {\n\n\t\t\t\tconst renderItem = renderList[ i ];\n\n\t\t\t\tconst { object, geometry, group } = renderItem;\n\t\t\t\tlet material = renderItem.material;\n\n\t\t\t\tif ( material.allowOverride === true && overrideMaterial !== null ) {\n\n\t\t\t\t\tmaterial = overrideMaterial;\n\n\t\t\t\t}\n\n\t\t\t\tif ( object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\trenderObject( object, scene, camera, geometry, material, group );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObject( object, scene, camera, geometry, material, group ) {\n\n\t\t\tobject.onBeforeRender( _this, scene, camera, geometry, material, group );\n\n\t\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\t\tobject.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t\t\tmaterial.onBeforeRender( _this, scene, camera, geometry, object, group );\n\n\t\t\tif ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {\n\n\t\t\t\tmaterial.side = BackSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t\tmaterial.side = FrontSide;\n\t\t\t\tmaterial.needsUpdate = true;\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t\tmaterial.side = DoubleSide;\n\n\t\t\t} else {\n\n\t\t\t\t_this.renderBufferDirect( camera, scene, geometry, material, object, group );\n\n\t\t\t}\n\n\t\t\tobject.onAfterRender( _this, scene, camera, geometry, material, group );\n\n\t\t}\n\n\t\tfunction getProgram( material, scene, object ) {\n\n\t\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\t\tconst materialProperties = properties.get( material );\n\n\t\t\tconst lights = currentRenderState.state.lights;\n\t\t\tconst shadowsArray = currentRenderState.state.shadowsArray;\n\n\t\t\tconst lightsStateVersion = lights.state.version;\n\n\t\t\tconst parameters = programCache.getParameters( material, lights.state, shadowsArray, scene, object );\n\t\t\tconst programCacheKey = programCache.getProgramCacheKey( parameters );\n\n\t\t\tlet programs = materialProperties.programs;\n\n\t\t\t// always update environment and fog - changing these trigger an getProgram call, but it's possible that the program doesn't change\n\n\t\t\tmaterialProperties.environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\t\tmaterialProperties.fog = scene.fog;\n\t\t\tmaterialProperties.envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || materialProperties.environment );\n\t\t\tmaterialProperties.envMapRotation = ( materialProperties.environment !== null && material.envMap === null ) ? scene.environmentRotation : material.envMapRotation;\n\n\t\t\tif ( programs === undefined ) {\n\n\t\t\t\t// new material\n\n\t\t\t\tmaterial.addEventListener( 'dispose', onMaterialDispose );\n\n\t\t\t\tprograms = new Map();\n\t\t\t\tmaterialProperties.programs = programs;\n\n\t\t\t}\n\n\t\t\tlet program = programs.get( programCacheKey );\n\n\t\t\tif ( program !== undefined ) {\n\n\t\t\t\t// early out if program and light state is identical\n\n\t\t\t\tif ( materialProperties.currentProgram === program && materialProperties.lightsStateVersion === lightsStateVersion ) {\n\n\t\t\t\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t\t\t\treturn program;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tparameters.uniforms = programCache.getUniforms( material );\n\n\t\t\t\tmaterial.onBeforeCompile( parameters, _this );\n\n\t\t\t\tprogram = programCache.acquireProgram( parameters, programCacheKey );\n\t\t\t\tprograms.set( programCacheKey, program );\n\n\t\t\t\tmaterialProperties.uniforms = parameters.uniforms;\n\n\t\t\t}\n\n\t\t\tconst uniforms = materialProperties.uniforms;\n\n\t\t\tif ( ( ! material.isShaderMaterial && ! material.isRawShaderMaterial ) || material.clipping === true ) {\n\n\t\t\t\tuniforms.clippingPlanes = clipping.uniform;\n\n\t\t\t}\n\n\t\t\tupdateCommonMaterialProperties( material, parameters );\n\n\t\t\t// store the light setup it was created for\n\n\t\t\tmaterialProperties.needsLights = materialNeedsLights( material );\n\t\t\tmaterialProperties.lightsStateVersion = lightsStateVersion;\n\n\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t// wire up the material to this renderer's lighting state\n\n\t\t\t\tuniforms.ambientLightColor.value = lights.state.ambient;\n\t\t\t\tuniforms.lightProbe.value = lights.state.probe;\n\t\t\t\tuniforms.directionalLights.value = lights.state.directional;\n\t\t\t\tuniforms.directionalLightShadows.value = lights.state.directionalShadow;\n\t\t\t\tuniforms.spotLights.value = lights.state.spot;\n\t\t\t\tuniforms.spotLightShadows.value = lights.state.spotShadow;\n\t\t\t\tuniforms.rectAreaLights.value = lights.state.rectArea;\n\t\t\t\tuniforms.ltc_1.value = lights.state.rectAreaLTC1;\n\t\t\t\tuniforms.ltc_2.value = lights.state.rectAreaLTC2;\n\t\t\t\tuniforms.pointLights.value = lights.state.point;\n\t\t\t\tuniforms.pointLightShadows.value = lights.state.pointShadow;\n\t\t\t\tuniforms.hemisphereLights.value = lights.state.hemi;\n\n\t\t\t\tuniforms.directionalShadowMap.value = lights.state.directionalShadowMap;\n\t\t\t\tuniforms.directionalShadowMatrix.value = lights.state.directionalShadowMatrix;\n\t\t\t\tuniforms.spotShadowMap.value = lights.state.spotShadowMap;\n\t\t\t\tuniforms.spotLightMatrix.value = lights.state.spotLightMatrix;\n\t\t\t\tuniforms.spotLightMap.value = lights.state.spotLightMap;\n\t\t\t\tuniforms.pointShadowMap.value = lights.state.pointShadowMap;\n\t\t\t\tuniforms.pointShadowMatrix.value = lights.state.pointShadowMatrix;\n\t\t\t\t// TODO (abelnation): add area lights shadow info to uniforms\n\n\t\t\t}\n\n\t\t\tmaterialProperties.currentProgram = program;\n\t\t\tmaterialProperties.uniformsList = null;\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\tfunction getUniformList( materialProperties ) {\n\n\t\t\tif ( materialProperties.uniformsList === null ) {\n\n\t\t\t\tconst progUniforms = materialProperties.currentProgram.getUniforms();\n\t\t\t\tmaterialProperties.uniformsList = WebGLUniforms.seqWithValue( progUniforms.seq, materialProperties.uniforms );\n\n\t\t\t}\n\n\t\t\treturn materialProperties.uniformsList;\n\n\t\t}\n\n\t\tfunction updateCommonMaterialProperties( material, parameters ) {\n\n\t\t\tconst materialProperties = properties.get( material );\n\n\t\t\tmaterialProperties.outputColorSpace = parameters.outputColorSpace;\n\t\t\tmaterialProperties.batching = parameters.batching;\n\t\t\tmaterialProperties.batchingColor = parameters.batchingColor;\n\t\t\tmaterialProperties.instancing = parameters.instancing;\n\t\t\tmaterialProperties.instancingColor = parameters.instancingColor;\n\t\t\tmaterialProperties.instancingMorph = parameters.instancingMorph;\n\t\t\tmaterialProperties.skinning = parameters.skinning;\n\t\t\tmaterialProperties.morphTargets = parameters.morphTargets;\n\t\t\tmaterialProperties.morphNormals = parameters.morphNormals;\n\t\t\tmaterialProperties.morphColors = parameters.morphColors;\n\t\t\tmaterialProperties.morphTargetsCount = parameters.morphTargetsCount;\n\t\t\tmaterialProperties.numClippingPlanes = parameters.numClippingPlanes;\n\t\t\tmaterialProperties.numIntersection = parameters.numClipIntersection;\n\t\t\tmaterialProperties.vertexAlphas = parameters.vertexAlphas;\n\t\t\tmaterialProperties.vertexTangents = parameters.vertexTangents;\n\t\t\tmaterialProperties.toneMapping = parameters.toneMapping;\n\n\t\t}\n\n\t\tfunction setProgram( camera, scene, geometry, material, object ) {\n\n\t\t\tif ( scene.isScene !== true ) scene = _emptyScene; // scene could be a Mesh, Line, Points, ...\n\n\t\t\ttextures.resetTextureUnits();\n\n\t\t\tconst fog = scene.fog;\n\t\t\tconst environment = material.isMeshStandardMaterial ? scene.environment : null;\n\t\t\tconst colorSpace = ( _currentRenderTarget === null ) ? _this.outputColorSpace : ( _currentRenderTarget.isXRRenderTarget === true ? _currentRenderTarget.texture.colorSpace : LinearSRGBColorSpace );\n\t\t\tconst envMap = ( material.isMeshStandardMaterial ? cubeuvmaps : cubemaps ).get( material.envMap || environment );\n\t\t\tconst vertexAlphas = material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4;\n\t\t\tconst vertexTangents = !! geometry.attributes.tangent && ( !! material.normalMap || material.anisotropy > 0 );\n\t\t\tconst morphTargets = !! geometry.morphAttributes.position;\n\t\t\tconst morphNormals = !! geometry.morphAttributes.normal;\n\t\t\tconst morphColors = !! geometry.morphAttributes.color;\n\n\t\t\tlet toneMapping = NoToneMapping;\n\n\t\t\tif ( material.toneMapped ) {\n\n\t\t\t\tif ( _currentRenderTarget === null || _currentRenderTarget.isXRRenderTarget === true ) {\n\n\t\t\t\t\ttoneMapping = _this.toneMapping;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\t\tconst materialProperties = properties.get( material );\n\t\t\tconst lights = currentRenderState.state.lights;\n\n\t\t\tif ( _clippingEnabled === true ) {\n\n\t\t\t\tif ( _localClippingEnabled === true || camera !== _currentCamera ) {\n\n\t\t\t\t\tconst useCache =\n\t\t\t\t\t\tcamera === _currentCamera &&\n\t\t\t\t\t\tmaterial.id === _currentMaterialId;\n\n\t\t\t\t\t// we might want to call this function with some ClippingGroup\n\t\t\t\t\t// object instead of the material, once it becomes feasible\n\t\t\t\t\t// (#8465, #8379)\n\t\t\t\t\tclipping.setState( material, camera, useCache );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet needsProgramChange = false;\n\n\t\t\tif ( material.version === materialProperties.__version ) {\n\n\t\t\t\tif ( materialProperties.needsLights && ( materialProperties.lightsStateVersion !== lights.state.version ) ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.outputColorSpace !== colorSpace ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isBatchedMesh && materialProperties.batching === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isBatchedMesh && materialProperties.batching === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isBatchedMesh && materialProperties.batchingColor === true && object.colorTexture === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isBatchedMesh && materialProperties.batchingColor === false && object.colorTexture !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancing === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isInstancedMesh && materialProperties.instancing === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isSkinnedMesh && materialProperties.skinning === false ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( ! object.isSkinnedMesh && materialProperties.skinning === true ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingColor === true && object.instanceColor === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingColor === false && object.instanceColor !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingMorph === true && object.morphTexture === null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( object.isInstancedMesh && materialProperties.instancingMorph === false && object.morphTexture !== null ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.envMap !== envMap ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( material.fog === true && materialProperties.fog !== fog ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.numClippingPlanes !== undefined &&\n\t\t\t\t\t( materialProperties.numClippingPlanes !== clipping.numPlanes ||\n\t\t\t\t\tmaterialProperties.numIntersection !== clipping.numIntersection ) ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.vertexAlphas !== vertexAlphas ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.vertexTangents !== vertexTangents ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphTargets !== morphTargets ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphNormals !== morphNormals ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphColors !== morphColors ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.toneMapping !== toneMapping ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t} else if ( materialProperties.morphTargetsCount !== morphTargetsCount ) {\n\n\t\t\t\t\tneedsProgramChange = true;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tneedsProgramChange = true;\n\t\t\t\tmaterialProperties.__version = material.version;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet program = materialProperties.currentProgram;\n\n\t\t\tif ( needsProgramChange === true ) {\n\n\t\t\t\tprogram = getProgram( material, scene, object );\n\n\t\t\t}\n\n\t\t\tlet refreshProgram = false;\n\t\t\tlet refreshMaterial = false;\n\t\t\tlet refreshLights = false;\n\n\t\t\tconst p_uniforms = program.getUniforms(),\n\t\t\t\tm_uniforms = materialProperties.uniforms;\n\n\t\t\tif ( state.useProgram( program.program ) ) {\n\n\t\t\t\trefreshProgram = true;\n\t\t\t\trefreshMaterial = true;\n\t\t\t\trefreshLights = true;\n\n\t\t\t}\n\n\t\t\tif ( material.id !== _currentMaterialId ) {\n\n\t\t\t\t_currentMaterialId = material.id;\n\n\t\t\t\trefreshMaterial = true;\n\n\t\t\t}\n\n\t\t\tif ( refreshProgram || _currentCamera !== camera ) {\n\n\t\t\t\t// common camera uniforms\n\n\t\t\t\tconst reversedDepthBuffer = state.buffers.depth.getReversed();\n\n\t\t\t\tif ( reversedDepthBuffer && camera.reversedDepth !== true ) {\n\n\t\t\t\t\tcamera._reversedDepth = true;\n\t\t\t\t\tcamera.updateProjectionMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tp_uniforms.setValue( _gl, 'projectionMatrix', camera.projectionMatrix );\n\n\t\t\t\tp_uniforms.setValue( _gl, 'viewMatrix', camera.matrixWorldInverse );\n\n\t\t\t\tconst uCamPos = p_uniforms.map.cameraPosition;\n\n\t\t\t\tif ( uCamPos !== undefined ) {\n\n\t\t\t\t\tuCamPos.setValue( _gl, _vector3.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( capabilities.logarithmicDepthBuffer ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'logDepthBufFC',\n\t\t\t\t\t\t2.0 / ( Math.log( camera.far + 1.0 ) / Math.LN2 ) );\n\n\t\t\t\t}\n\n\t\t\t\t// consider moving isOrthographic to UniformLib and WebGLMaterials, see https://github.com/mrdoob/three.js/pull/26467#issuecomment-1645185067\n\n\t\t\t\tif ( material.isMeshPhongMaterial ||\n\t\t\t\t\tmaterial.isMeshToonMaterial ||\n\t\t\t\t\tmaterial.isMeshLambertMaterial ||\n\t\t\t\t\tmaterial.isMeshBasicMaterial ||\n\t\t\t\t\tmaterial.isMeshStandardMaterial ||\n\t\t\t\t\tmaterial.isShaderMaterial ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'isOrthographic', camera.isOrthographicCamera === true );\n\n\t\t\t\t}\n\n\t\t\t\tif ( _currentCamera !== camera ) {\n\n\t\t\t\t\t_currentCamera = camera;\n\n\t\t\t\t\t// lighting uniforms depend on the camera so enforce an update\n\t\t\t\t\t// now, in case this material supports lights - or later, when\n\t\t\t\t\t// the next material that does gets activated:\n\n\t\t\t\t\trefreshMaterial = true;\t\t// set to true on material change\n\t\t\t\t\trefreshLights = true;\t\t// remains set until update done\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Pre-allocate texture units for shadow samplers before setting data textures\n\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t// Set shadow map uniforms first to ensure they get the first texture units\n\t\t\t\tif ( lights.state.directionalShadowMap.length > 0 ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'directionalShadowMap', lights.state.directionalShadowMap, textures );\n\n\t\t\t\t}\n\n\t\t\t\tif ( lights.state.spotShadowMap.length > 0 ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'spotShadowMap', lights.state.spotShadowMap, textures );\n\n\t\t\t\t}\n\n\t\t\t\tif ( lights.state.pointShadowMap.length > 0 ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'pointShadowMap', lights.state.pointShadowMap, textures );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// skinning and morph target uniforms must be set even if material didn't change\n\t\t\t// auto-setting of texture unit for bone and morph texture must go before other textures\n\t\t\t// otherwise textures used for skinning and morphing can take over texture units reserved for other material textures\n\n\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrix' );\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'bindMatrixInverse' );\n\n\t\t\t\tconst skeleton = object.skeleton;\n\n\t\t\t\tif ( skeleton ) {\n\n\t\t\t\t\tif ( skeleton.boneTexture === null ) skeleton.computeBoneTexture();\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'boneTexture', skeleton.boneTexture, textures );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( object.isBatchedMesh ) {\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'batchingTexture' );\n\t\t\t\tp_uniforms.setValue( _gl, 'batchingTexture', object._matricesTexture, textures );\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'batchingIdTexture' );\n\t\t\t\tp_uniforms.setValue( _gl, 'batchingIdTexture', object._indirectTexture, textures );\n\n\t\t\t\tp_uniforms.setOptional( _gl, object, 'batchingColorTexture' );\n\t\t\t\tif ( object._colorsTexture !== null ) {\n\n\t\t\t\t\tp_uniforms.setValue( _gl, 'batchingColorTexture', object._colorsTexture, textures );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst morphAttributes = geometry.morphAttributes;\n\n\t\t\tif ( morphAttributes.position !== undefined || morphAttributes.normal !== undefined || ( morphAttributes.color !== undefined ) ) {\n\n\t\t\t\tmorphtargets.update( object, geometry, program );\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial || materialProperties.receiveShadow !== object.receiveShadow ) {\n\n\t\t\t\tmaterialProperties.receiveShadow = object.receiveShadow;\n\t\t\t\tp_uniforms.setValue( _gl, 'receiveShadow', object.receiveShadow );\n\n\t\t\t}\n\n\t\t\t// https://github.com/mrdoob/three.js/pull/24467#issuecomment-1209031512\n\n\t\t\tif ( material.isMeshGouraudMaterial && material.envMap !== null ) {\n\n\t\t\t\tm_uniforms.envMap.value = envMap;\n\n\t\t\t\tm_uniforms.flipEnvMap.value = ( envMap.isCubeTexture && envMap.isRenderTargetTexture === false ) ? -1 : 1;\n\n\t\t\t}\n\n\t\t\tif ( material.isMeshStandardMaterial && material.envMap === null && scene.environment !== null ) {\n\n\t\t\t\tm_uniforms.envMapIntensity.value = scene.environmentIntensity;\n\n\t\t\t}\n\n\t\t\t// Set DFG LUT for physically-based materials\n\t\t\tif ( m_uniforms.dfgLUT !== undefined ) {\n\n\t\t\t\tm_uniforms.dfgLUT.value = getDFGLUT();\n\n\t\t\t}\n\n\t\t\tif ( refreshMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'toneMappingExposure', _this.toneMappingExposure );\n\n\t\t\t\tif ( materialProperties.needsLights ) {\n\n\t\t\t\t\t// the current material requires lighting info\n\n\t\t\t\t\t// note: all lighting uniforms are always set correctly\n\t\t\t\t\t// they simply reference the renderer's state for their\n\t\t\t\t\t// values\n\t\t\t\t\t//\n\t\t\t\t\t// use the current material's .needsUpdate flags to set\n\t\t\t\t\t// the GL state when required\n\n\t\t\t\t\tmarkUniformsLightsNeedsUpdate( m_uniforms, refreshLights );\n\n\t\t\t\t}\n\n\t\t\t\t// refresh uniforms common to several materials\n\n\t\t\t\tif ( fog && material.fog === true ) {\n\n\t\t\t\t\tmaterials.refreshFogUniforms( m_uniforms, fog );\n\n\t\t\t\t}\n\n\t\t\t\tmaterials.refreshMaterialUniforms( m_uniforms, material, _pixelRatio, _height, currentRenderState.state.transmissionRenderTarget[ camera.id ] );\n\n\t\t\t\tWebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures );\n\n\t\t\t}\n\n\t\t\tif ( material.isShaderMaterial && material.uniformsNeedUpdate === true ) {\n\n\t\t\t\tWebGLUniforms.upload( _gl, getUniformList( materialProperties ), m_uniforms, textures );\n\t\t\t\tmaterial.uniformsNeedUpdate = false;\n\n\t\t\t}\n\n\t\t\tif ( material.isSpriteMaterial ) {\n\n\t\t\t\tp_uniforms.setValue( _gl, 'center', object.center );\n\n\t\t\t}\n\n\t\t\t// common matrices\n\n\t\t\tp_uniforms.setValue( _gl, 'modelViewMatrix', object.modelViewMatrix );\n\t\t\tp_uniforms.setValue( _gl, 'normalMatrix', object.normalMatrix );\n\t\t\tp_uniforms.setValue( _gl, 'modelMatrix', object.matrixWorld );\n\n\t\t\t// UBOs\n\n\t\t\tif ( material.isShaderMaterial || material.isRawShaderMaterial ) {\n\n\t\t\t\tconst groups = material.uniformsGroups;\n\n\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst group = groups[ i ];\n\n\t\t\t\t\tuniformsGroups.update( group, program );\n\t\t\t\t\tuniformsGroups.bind( group, program );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn program;\n\n\t\t}\n\n\t\t// If uniforms are marked as clean, they don't need to be loaded to the GPU.\n\n\t\tfunction markUniformsLightsNeedsUpdate( uniforms, value ) {\n\n\t\t\tuniforms.ambientLightColor.needsUpdate = value;\n\t\t\tuniforms.lightProbe.needsUpdate = value;\n\n\t\t\tuniforms.directionalLights.needsUpdate = value;\n\t\t\tuniforms.directionalLightShadows.needsUpdate = value;\n\t\t\tuniforms.pointLights.needsUpdate = value;\n\t\t\tuniforms.pointLightShadows.needsUpdate = value;\n\t\t\tuniforms.spotLights.needsUpdate = value;\n\t\t\tuniforms.spotLightShadows.needsUpdate = value;\n\t\t\tuniforms.rectAreaLights.needsUpdate = value;\n\t\t\tuniforms.hemisphereLights.needsUpdate = value;\n\n\t\t}\n\n\t\tfunction materialNeedsLights( material ) {\n\n\t\t\treturn material.isMeshLambertMaterial || material.isMeshToonMaterial || material.isMeshPhongMaterial ||\n\t\t\t\tmaterial.isMeshStandardMaterial || material.isShadowMaterial ||\n\t\t\t\t( material.isShaderMaterial && material.lights === true );\n\n\t\t}\n\n\t\t/**\n\t\t * Returns the active cube face.\n\t\t *\n\t\t * @return {number} The active cube face.\n\t\t */\n\t\tthis.getActiveCubeFace = function () {\n\n\t\t\treturn _currentActiveCubeFace;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the active mipmap level.\n\t\t *\n\t\t * @return {number} The active mipmap level.\n\t\t */\n\t\tthis.getActiveMipmapLevel = function () {\n\n\t\t\treturn _currentActiveMipmapLevel;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the active render target.\n\t\t *\n\t\t * @return {?WebGLRenderTarget} The active render target. Returns `null` if no render target\n\t\t * is currently set.\n\t\t */\n\t\tthis.getRenderTarget = function () {\n\n\t\t\treturn _currentRenderTarget;\n\n\t\t};\n\n\t\tthis.setRenderTargetTextures = function ( renderTarget, colorTexture, depthTexture ) {\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\trenderTargetProperties.__autoAllocateDepthBuffer = renderTarget.resolveDepthBuffer === false;\n\t\t\tif ( renderTargetProperties.__autoAllocateDepthBuffer === false ) {\n\n\t\t\t\t// The multisample_render_to_texture extension doesn't work properly if there\n\t\t\t\t// are midframe flushes and an external depth buffer. Disable use of the extension.\n\t\t\t\trenderTargetProperties.__useRenderToTexture = false;\n\n\t\t\t}\n\n\t\t\tproperties.get( renderTarget.texture ).__webglTexture = colorTexture;\n\t\t\tproperties.get( renderTarget.depthTexture ).__webglTexture = renderTargetProperties.__autoAllocateDepthBuffer ? undefined : depthTexture;\n\n\t\t\trenderTargetProperties.__hasExternalTextures = true;\n\n\t\t};\n\n\t\tthis.setRenderTargetFramebuffer = function ( renderTarget, defaultFramebuffer ) {\n\n\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\t\t\trenderTargetProperties.__webglFramebuffer = defaultFramebuffer;\n\t\t\trenderTargetProperties.__useDefaultFramebuffer = defaultFramebuffer === undefined;\n\n\t\t};\n\n\t\tconst _scratchFrameBuffer = _gl.createFramebuffer();\n\n\t\t/**\n\t\t * Sets the active rendertarget.\n\t\t *\n\t\t * @param {?WebGLRenderTarget} renderTarget - The render target to set. When `null` is given,\n\t\t * the canvas is set as the active render target instead.\n\t\t * @param {number} [activeCubeFace=0] - The active cube face when using a cube render target.\n\t\t * Indicates the z layer to render in to when using 3D or array render targets.\n\t\t * @param {number} [activeMipmapLevel=0] - The active mipmap level.\n\t\t */\n\t\tthis.setRenderTarget = function ( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) {\n\n\t\t\t_currentRenderTarget = renderTarget;\n\t\t\t_currentActiveCubeFace = activeCubeFace;\n\t\t\t_currentActiveMipmapLevel = activeMipmapLevel;\n\n\t\t\tlet framebuffer = null;\n\t\t\tlet isCube = false;\n\t\t\tlet isRenderTarget3D = false;\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\tconst renderTargetProperties = properties.get( renderTarget );\n\n\t\t\t\tif ( renderTargetProperties.__useDefaultFramebuffer !== undefined ) {\n\n\t\t\t\t\t// Externally-managed framebuffer (e.g. XR)\n\t\t\t\t\t// Bind to the stored framebuffer (may be null for default, or a WebGLFramebuffer)\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, renderTargetProperties.__webglFramebuffer );\n\n\t\t\t\t\t_currentViewport.copy( renderTarget.viewport );\n\t\t\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t\t\t\tstate.viewport( _currentViewport );\n\t\t\t\t\tstate.scissor( _currentScissor );\n\t\t\t\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\t\t\t\t_currentMaterialId = -1;\n\n\t\t\t\t\treturn;\n\n\t\t\t\t} else if ( renderTargetProperties.__webglFramebuffer === undefined ) {\n\n\t\t\t\t\ttextures.setupRenderTarget( renderTarget );\n\n\t\t\t\t} else if ( renderTargetProperties.__hasExternalTextures ) {\n\n\t\t\t\t\t// Color and depth texture must be rebound in order for the swapchain to update.\n\t\t\t\t\ttextures.rebindTextures( renderTarget, properties.get( renderTarget.texture ).__webglTexture, properties.get( renderTarget.depthTexture ).__webglTexture );\n\n\t\t\t\t} else if ( renderTarget.depthBuffer ) {\n\n\t\t\t\t\t// check if the depth texture is already bound to the frame buffer and that it's been initialized\n\t\t\t\t\tconst depthTexture = renderTarget.depthTexture;\n\t\t\t\t\tif ( renderTargetProperties.__boundDepthTexture !== depthTexture ) {\n\n\t\t\t\t\t\t// check if the depth texture is compatible\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tdepthTexture !== null &&\n\t\t\t\t\t\t\tproperties.has( depthTexture ) &&\n\t\t\t\t\t\t\t( renderTarget.width !== depthTexture.image.width || renderTarget.height !== depthTexture.image.height )\n\t\t\t\t\t\t) {\n\n\t\t\t\t\t\t\tthrow new Error( 'WebGLRenderTarget: Attached DepthTexture is initialized to the incorrect size.' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Swap the depth buffer to the currently attached one\n\t\t\t\t\t\ttextures.setupDepthRenderbuffer( renderTarget );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst texture = renderTarget.texture;\n\n\t\t\t\tif ( texture.isData3DTexture || texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {\n\n\t\t\t\t\tisRenderTarget3D = true;\n\n\t\t\t\t}\n\n\t\t\t\tconst __webglFramebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\t\tif ( renderTarget.isWebGLCubeRenderTarget ) {\n\n\t\t\t\t\tif ( Array.isArray( __webglFramebuffer[ activeCubeFace ] ) ) {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ][ activeMipmapLevel ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeCubeFace ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tisCube = true;\n\n\t\t\t\t} else if ( ( renderTarget.samples > 0 ) && textures.useMultisampledRTT( renderTarget ) === false ) {\n\n\t\t\t\t\tframebuffer = properties.get( renderTarget ).__webglMultisampledFramebuffer;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( Array.isArray( __webglFramebuffer ) ) {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer[ activeMipmapLevel ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tframebuffer = __webglFramebuffer;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t_currentViewport.copy( renderTarget.viewport );\n\t\t\t\t_currentScissor.copy( renderTarget.scissor );\n\t\t\t\t_currentScissorTest = renderTarget.scissorTest;\n\n\t\t\t} else {\n\n\t\t\t\t_currentViewport.copy( _viewport ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t\t_currentScissor.copy( _scissor ).multiplyScalar( _pixelRatio ).floor();\n\t\t\t\t_currentScissorTest = _scissorTest;\n\n\t\t\t}\n\n\t\t\t// Use a scratch frame buffer if rendering to a mip level to avoid depth buffers\n\t\t\t// being bound that are different sizes.\n\t\t\tif ( activeMipmapLevel !== 0 ) {\n\n\t\t\t\tframebuffer = _scratchFrameBuffer;\n\n\t\t\t}\n\n\t\t\tconst framebufferBound = state.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\tif ( framebufferBound ) {\n\n\t\t\t\tstate.drawBuffers( renderTarget, framebuffer );\n\n\t\t\t}\n\n\t\t\tstate.viewport( _currentViewport );\n\t\t\tstate.scissor( _currentScissor );\n\t\t\tstate.setScissorTest( _currentScissorTest );\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_CUBE_MAP_POSITIVE_X + activeCubeFace, textureProperties.__webglTexture, activeMipmapLevel );\n\n\t\t\t} else if ( isRenderTarget3D ) {\n\n\t\t\t\tconst layer = activeCubeFace;\n\n\t\t\t\tfor ( let i = 0; i < renderTarget.textures.length; i ++ ) {\n\n\t\t\t\t\tconst textureProperties = properties.get( renderTarget.textures[ i ] );\n\n\t\t\t\t\t_gl.framebufferTextureLayer( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0 + i, textureProperties.__webglTexture, activeMipmapLevel, layer );\n\n\t\t\t\t}\n\n\t\t\t} else if ( renderTarget !== null && activeMipmapLevel !== 0 ) {\n\n\t\t\t\t// Only bind the frame buffer if we are using a scratch frame buffer to render to a mipmap.\n\t\t\t\t// If we rebind the texture when using a multi sample buffer then an error about inconsistent samples will be thrown.\n\t\t\t\tconst textureProperties = properties.get( renderTarget.texture );\n\t\t\t\t_gl.framebufferTexture2D( _gl.FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, textureProperties.__webglTexture, activeMipmapLevel );\n\n\t\t\t}\n\n\t\t\t_currentMaterialId = -1; // reset current material to ensure correct uniform bindings\n\n\t\t};\n\n\t\t/**\n\t\t * Reads the pixel data from the given render target into the given buffer.\n\t\t *\n\t\t * @param {WebGLRenderTarget} renderTarget - The render target to read from.\n\t\t * @param {number} x - The `x` coordinate of the copy region's origin.\n\t\t * @param {number} y - The `y` coordinate of the copy region's origin.\n\t\t * @param {number} width - The width of the copy region.\n\t\t * @param {number} height - The height of the copy region.\n\t\t * @param {TypedArray} buffer - The result buffer.\n\t\t * @param {number} [activeCubeFaceIndex] - The active cube face index.\n\t\t * @param {number} [textureIndex=0] - The texture index of an MRT render target.\n\t\t */\n\t\tthis.readRenderTargetPixels = function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex, textureIndex = 0 ) {\n\n\t\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\t\terror( 'WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tlet framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\n\t\t\tif ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {\n\n\t\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t\t}\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\ttry {\n\n\t\t\t\t\tconst texture = renderTarget.textures[ textureIndex ];\n\t\t\t\t\tconst textureFormat = texture.format;\n\t\t\t\t\tconst textureType = texture.type;\n\n\t\t\t\t\tif ( ! capabilities.textureFormatReadable( textureFormat ) ) {\n\n\t\t\t\t\t\terror( 'WebGLRenderer.readRenderTargetPixels: renderTarget is not in RGBA or implementation defined format.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! capabilities.textureTypeReadable( textureType ) ) {\n\n\t\t\t\t\t\terror( 'WebGLRenderer.readRenderTargetPixels: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\n\t\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t\t// when using MRT, select the correct color buffer for the subsequent read command\n\n\t\t\t\t\t\tif ( renderTarget.textures.length > 1 ) _gl.readBuffer( _gl.COLOR_ATTACHMENT0 + textureIndex );\n\n\t\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), buffer );\n\n\t\t\t\t\t}\n\n\t\t\t\t} finally {\n\n\t\t\t\t\t// restore framebuffer of current render target if necessary\n\n\t\t\t\t\tconst framebuffer = ( _currentRenderTarget !== null ) ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Asynchronous, non-blocking version of {@link WebGLRenderer#readRenderTargetPixels}.\n\t\t *\n\t\t * It is recommended to use this version of `readRenderTargetPixels()` whenever possible.\n\t\t *\n\t\t * @async\n\t\t * @param {WebGLRenderTarget} renderTarget - The render target to read from.\n\t\t * @param {number} x - The `x` coordinate of the copy region's origin.\n\t\t * @param {number} y - The `y` coordinate of the copy region's origin.\n\t\t * @param {number} width - The width of the copy region.\n\t\t * @param {number} height - The height of the copy region.\n\t\t * @param {TypedArray} buffer - The result buffer.\n\t\t * @param {number} [activeCubeFaceIndex] - The active cube face index.\n\t\t * @param {number} [textureIndex=0] - The texture index of an MRT render target.\n\t\t * @return {Promise<TypedArray>} A Promise that resolves when the read has been finished. The resolve provides the read data as a typed array.\n\t\t */\n\t\tthis.readRenderTargetPixelsAsync = async function ( renderTarget, x, y, width, height, buffer, activeCubeFaceIndex, textureIndex = 0 ) {\n\n\t\t\tif ( ! ( renderTarget && renderTarget.isWebGLRenderTarget ) ) {\n\n\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixels: renderTarget is not THREE.WebGLRenderTarget.' );\n\n\t\t\t}\n\n\t\t\tlet framebuffer = properties.get( renderTarget ).__webglFramebuffer;\n\t\t\tif ( renderTarget.isWebGLCubeRenderTarget && activeCubeFaceIndex !== undefined ) {\n\n\t\t\t\tframebuffer = framebuffer[ activeCubeFaceIndex ];\n\n\t\t\t}\n\n\t\t\tif ( framebuffer ) {\n\n\t\t\t\t// the following if statement ensures valid read requests (no out-of-bounds pixels, see #8604)\n\t\t\t\tif ( ( x >= 0 && x <= ( renderTarget.width - width ) ) && ( y >= 0 && y <= ( renderTarget.height - height ) ) ) {\n\n\t\t\t\t\t// set the active frame buffer to the one we want to read\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, framebuffer );\n\n\t\t\t\t\tconst texture = renderTarget.textures[ textureIndex ];\n\t\t\t\t\tconst textureFormat = texture.format;\n\t\t\t\t\tconst textureType = texture.type;\n\n\t\t\t\t\tif ( ! capabilities.textureFormatReadable( textureFormat ) ) {\n\n\t\t\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in RGBA or implementation defined format.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! capabilities.textureTypeReadable( textureType ) ) {\n\n\t\t\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: renderTarget is not in UnsignedByteType or implementation defined type.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst glBuffer = _gl.createBuffer();\n\t\t\t\t\t_gl.bindBuffer( _gl.PIXEL_PACK_BUFFER, glBuffer );\n\t\t\t\t\t_gl.bufferData( _gl.PIXEL_PACK_BUFFER, buffer.byteLength, _gl.STREAM_READ );\n\n\t\t\t\t\t// when using MRT, select the correct color buffer for the subsequent read command\n\n\t\t\t\t\tif ( renderTarget.textures.length > 1 ) _gl.readBuffer( _gl.COLOR_ATTACHMENT0 + textureIndex );\n\n\t\t\t\t\t_gl.readPixels( x, y, width, height, utils.convert( textureFormat ), utils.convert( textureType ), 0 );\n\n\t\t\t\t\t// reset the frame buffer to the currently set buffer before waiting\n\t\t\t\t\tconst currFramebuffer = _currentRenderTarget !== null ? properties.get( _currentRenderTarget ).__webglFramebuffer : null;\n\t\t\t\t\tstate.bindFramebuffer( _gl.FRAMEBUFFER, currFramebuffer );\n\n\t\t\t\t\t// check if the commands have finished every 8 ms\n\t\t\t\t\tconst sync = _gl.fenceSync( _gl.SYNC_GPU_COMMANDS_COMPLETE, 0 );\n\n\t\t\t\t\t_gl.flush();\n\n\t\t\t\t\tawait probeAsync( _gl, sync, 4 );\n\n\t\t\t\t\t// read the data and delete the buffer\n\t\t\t\t\t_gl.bindBuffer( _gl.PIXEL_PACK_BUFFER, glBuffer );\n\t\t\t\t\t_gl.getBufferSubData( _gl.PIXEL_PACK_BUFFER, 0, buffer );\n\t\t\t\t\t_gl.deleteBuffer( glBuffer );\n\t\t\t\t\t_gl.deleteSync( sync );\n\n\t\t\t\t\treturn buffer;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.WebGLRenderer.readRenderTargetPixelsAsync: requested read bounds are out of range.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Copies pixels from the current bound framebuffer into the given texture.\n\t\t *\n\t\t * @param {FramebufferTexture} texture - The texture.\n\t\t * @param {?Vector2} [position=null] - The start position of the copy operation.\n\t\t * @param {number} [level=0] - The mip level. The default represents the base mip.\n\t\t */\n\t\tthis.copyFramebufferToTexture = function ( texture, position = null, level = 0 ) {\n\n\t\t\tconst levelScale = Math.pow( 2, - level );\n\t\t\tconst width = Math.floor( texture.image.width * levelScale );\n\t\t\tconst height = Math.floor( texture.image.height * levelScale );\n\n\t\t\tconst x = position !== null ? position.x : 0;\n\t\t\tconst y = position !== null ? position.y : 0;\n\n\t\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t\t_gl.copyTexSubImage2D( _gl.TEXTURE_2D, level, 0, 0, x, y, width, height );\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\tconst _srcFramebuffer = _gl.createFramebuffer();\n\t\tconst _dstFramebuffer = _gl.createFramebuffer();\n\n\t\t/**\n\t\t * Copies data of the given source texture into a destination texture.\n\t\t *\n\t\t * When using render target textures as `srcTexture` and `dstTexture`, you must make sure both render targets are initialized\n\t\t * {@link WebGLRenderer#initRenderTarget}.\n\t\t *\n\t\t * @param {Texture} srcTexture - The source texture.\n\t\t * @param {Texture} dstTexture - The destination texture.\n\t\t * @param {?(Box2|Box3)} [srcRegion=null] - A bounding box which describes the source region. Can be two or three-dimensional.\n\t\t * @param {?(Vector2|Vector3)} [dstPosition=null] - A vector that represents the origin of the destination region. Can be two or three-dimensional.\n\t\t * @param {number} [srcLevel=0] - The source mipmap level to copy.\n\t\t * @param {?number} [dstLevel=null] - The destination mipmap level.\n\t\t */\n\t\tthis.copyTextureToTexture = function ( srcTexture, dstTexture, srcRegion = null, dstPosition = null, srcLevel = 0, dstLevel = null ) {\n\n\t\t\t// support the previous signature with just a single dst mipmap level\n\t\t\tif ( dstLevel === null ) {\n\n\t\t\t\tif ( srcLevel !== 0 ) {\n\n\t\t\t\t\t// @deprecated, r171\n\t\t\t\t\twarnOnce( 'WebGLRenderer: copyTextureToTexture function signature has changed to support src and dst mipmap levels.' );\n\t\t\t\t\tdstLevel = srcLevel;\n\t\t\t\t\tsrcLevel = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdstLevel = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// gather the necessary dimensions to copy\n\t\t\tlet width, height, depth, minX, minY, minZ;\n\t\t\tlet dstX, dstY, dstZ;\n\t\t\tconst image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ dstLevel ] : srcTexture.image;\n\t\t\tif ( srcRegion !== null ) {\n\n\t\t\t\twidth = srcRegion.max.x - srcRegion.min.x;\n\t\t\t\theight = srcRegion.max.y - srcRegion.min.y;\n\t\t\t\tdepth = srcRegion.isBox3 ? srcRegion.max.z - srcRegion.min.z : 1;\n\t\t\t\tminX = srcRegion.min.x;\n\t\t\t\tminY = srcRegion.min.y;\n\t\t\t\tminZ = srcRegion.isBox3 ? srcRegion.min.z : 0;\n\n\t\t\t} else {\n\n\t\t\t\tconst levelScale = Math.pow( 2, - srcLevel );\n\t\t\t\twidth = Math.floor( image.width * levelScale );\n\t\t\t\theight = Math.floor( image.height * levelScale );\n\t\t\t\tif ( srcTexture.isDataArrayTexture ) {\n\n\t\t\t\t\tdepth = image.depth;\n\n\t\t\t\t} else if ( srcTexture.isData3DTexture ) {\n\n\t\t\t\t\tdepth = Math.floor( image.depth * levelScale );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdepth = 1;\n\n\t\t\t\t}\n\n\t\t\t\tminX = 0;\n\t\t\t\tminY = 0;\n\t\t\t\tminZ = 0;\n\n\t\t\t}\n\n\t\t\tif ( dstPosition !== null ) {\n\n\t\t\t\tdstX = dstPosition.x;\n\t\t\t\tdstY = dstPosition.y;\n\t\t\t\tdstZ = dstPosition.z;\n\n\t\t\t} else {\n\n\t\t\t\tdstX = 0;\n\t\t\t\tdstY = 0;\n\t\t\t\tdstZ = 0;\n\n\t\t\t}\n\n\t\t\t// Set up the destination target\n\t\t\tconst glFormat = utils.convert( dstTexture.format );\n\t\t\tconst glType = utils.convert( dstTexture.type );\n\t\t\tlet glTarget;\n\n\t\t\tif ( dstTexture.isData3DTexture ) {\n\n\t\t\t\ttextures.setTexture3D( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_3D;\n\n\t\t\t} else if ( dstTexture.isDataArrayTexture || dstTexture.isCompressedArrayTexture ) {\n\n\t\t\t\ttextures.setTexture2DArray( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_2D_ARRAY;\n\n\t\t\t} else {\n\n\t\t\t\ttextures.setTexture2D( dstTexture, 0 );\n\t\t\t\tglTarget = _gl.TEXTURE_2D;\n\n\t\t\t}\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );\n\n\t\t\t// used for copying data from cpu\n\t\t\tconst currentUnpackRowLen = _gl.getParameter( _gl.UNPACK_ROW_LENGTH );\n\t\t\tconst currentUnpackImageHeight = _gl.getParameter( _gl.UNPACK_IMAGE_HEIGHT );\n\t\t\tconst currentUnpackSkipPixels = _gl.getParameter( _gl.UNPACK_SKIP_PIXELS );\n\t\t\tconst currentUnpackSkipRows = _gl.getParameter( _gl.UNPACK_SKIP_ROWS );\n\t\t\tconst currentUnpackSkipImages = _gl.getParameter( _gl.UNPACK_SKIP_IMAGES );\n\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, image.width );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, image.height );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, minX );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, minY );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, minZ );\n\n\t\t\t// set up the src texture\n\t\t\tconst isSrc3D = srcTexture.isDataArrayTexture || srcTexture.isData3DTexture;\n\t\t\tconst isDst3D = dstTexture.isDataArrayTexture || dstTexture.isData3DTexture;\n\t\t\tif ( srcTexture.isDepthTexture ) {\n\n\t\t\t\tconst srcTextureProperties = properties.get( srcTexture );\n\t\t\t\tconst dstTextureProperties = properties.get( dstTexture );\n\t\t\t\tconst srcRenderTargetProperties = properties.get( srcTextureProperties.__renderTarget );\n\t\t\t\tconst dstRenderTargetProperties = properties.get( dstTextureProperties.__renderTarget );\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, srcRenderTargetProperties.__webglFramebuffer );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, dstRenderTargetProperties.__webglFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < depth; i ++ ) {\n\n\t\t\t\t\t// if the source or destination are a 3d target then a layer needs to be bound\n\t\t\t\t\tif ( isSrc3D ) {\n\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, properties.get( srcTexture ).__webglTexture, srcLevel, minZ + i );\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, properties.get( dstTexture ).__webglTexture, dstLevel, dstZ + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_gl.blitFramebuffer( minX, minY, width, height, dstX, dstY, width, height, _gl.DEPTH_BUFFER_BIT, _gl.NEAREST );\n\n\t\t\t\t}\n\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );\n\n\t\t\t} else if ( srcLevel !== 0 || srcTexture.isRenderTargetTexture || properties.has( srcTexture ) ) {\n\n\t\t\t\t// get the appropriate frame buffers\n\t\t\t\tconst srcTextureProperties = properties.get( srcTexture );\n\t\t\t\tconst dstTextureProperties = properties.get( dstTexture );\n\n\t\t\t\t// bind the frame buffer targets\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, _srcFramebuffer );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, _dstFramebuffer );\n\n\t\t\t\tfor ( let i = 0; i < depth; i ++ ) {\n\n\t\t\t\t\t// assign the correct layers and mip maps to the frame buffers\n\t\t\t\t\tif ( isSrc3D ) {\n\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, srcTextureProperties.__webglTexture, srcLevel, minZ + i );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.READ_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, srcTextureProperties.__webglTexture, srcLevel );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isDst3D ) {\n\n\t\t\t\t\t\t_gl.framebufferTextureLayer( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, dstTextureProperties.__webglTexture, dstLevel, dstZ + i );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.framebufferTexture2D( _gl.DRAW_FRAMEBUFFER, _gl.COLOR_ATTACHMENT0, _gl.TEXTURE_2D, dstTextureProperties.__webglTexture, dstLevel );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// copy the data using the fastest function that can achieve the copy\n\t\t\t\t\tif ( srcLevel !== 0 ) {\n\n\t\t\t\t\t\t_gl.blitFramebuffer( minX, minY, width, height, dstX, dstY, width, height, _gl.COLOR_BUFFER_BIT, _gl.NEAREST );\n\n\t\t\t\t\t} else if ( isDst3D ) {\n\n\t\t\t\t\t\t_gl.copyTexSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ + i, minX, minY, width, height );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.copyTexSubImage2D( glTarget, dstLevel, dstX, dstY, minX, minY, width, height );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// unbind read, draw buffers\n\t\t\t\tstate.bindFramebuffer( _gl.READ_FRAMEBUFFER, null );\n\t\t\t\tstate.bindFramebuffer( _gl.DRAW_FRAMEBUFFER, null );\n\n\t\t\t} else {\n\n\t\t\t\tif ( isDst3D ) {\n\n\t\t\t\t\t// copy data into the 3d texture\n\t\t\t\t\tif ( srcTexture.isDataTexture || srcTexture.isData3DTexture ) {\n\n\t\t\t\t\t\t_gl.texSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image.data );\n\n\t\t\t\t\t} else if ( dstTexture.isCompressedArrayTexture ) {\n\n\t\t\t\t\t\t_gl.compressedTexSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, image.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.texSubImage3D( glTarget, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// copy data into the 2d texture\n\t\t\t\t\tif ( srcTexture.isDataTexture ) {\n\n\t\t\t\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, dstLevel, dstX, dstY, width, height, glFormat, glType, image.data );\n\n\t\t\t\t\t} else if ( srcTexture.isCompressedTexture ) {\n\n\t\t\t\t\t\t_gl.compressedTexSubImage2D( _gl.TEXTURE_2D, dstLevel, dstX, dstY, image.width, image.height, glFormat, image.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_gl.texSubImage2D( _gl.TEXTURE_2D, dstLevel, dstX, dstY, width, height, glFormat, glType, image );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// reset values\n\t\t\t_gl.pixelStorei( _gl.UNPACK_ROW_LENGTH, currentUnpackRowLen );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_IMAGE_HEIGHT, currentUnpackImageHeight );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows );\n\t\t\t_gl.pixelStorei( _gl.UNPACK_SKIP_IMAGES, currentUnpackSkipImages );\n\n\t\t\t// Generate mipmaps only when copying level 0\n\t\t\tif ( dstLevel === 0 && dstTexture.generateMipmaps ) {\n\n\t\t\t\t_gl.generateMipmap( glTarget );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\t/**\n\t\t * Initializes the given WebGLRenderTarget memory. Useful for initializing a render target so data\n\t\t * can be copied into it using {@link WebGLRenderer#copyTextureToTexture} before it has been\n\t\t * rendered to.\n\t\t *\n\t\t * @param {WebGLRenderTarget} target - The render target.\n\t\t */\n\t\tthis.initRenderTarget = function ( target ) {\n\n\t\t\tif ( properties.get( target ).__webglFramebuffer === undefined ) {\n\n\t\t\t\ttextures.setupRenderTarget( target );\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Initializes the given texture. Useful for preloading a texture rather than waiting until first\n\t\t * render (which can cause noticeable lags due to decode and GPU upload overhead).\n\t\t *\n\t\t * @param {Texture} texture - The texture.\n\t\t */\n\t\tthis.initTexture = function ( texture ) {\n\n\t\t\tif ( texture.isCubeTexture ) {\n\n\t\t\t\ttextures.setTextureCube( texture, 0 );\n\n\t\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\t\ttextures.setTexture3D( texture, 0 );\n\n\t\t\t} else if ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {\n\n\t\t\t\ttextures.setTexture2DArray( texture, 0 );\n\n\t\t\t} else {\n\n\t\t\t\ttextures.setTexture2D( texture, 0 );\n\n\t\t\t}\n\n\t\t\tstate.unbindTexture();\n\n\t\t};\n\n\t\t/**\n\t\t * Can be used to reset the internal WebGL state. This method is mostly\n\t\t * relevant for applications which share a single WebGL context across\n\t\t * multiple WebGL libraries.\n\t\t */\n\t\tthis.resetState = function () {\n\n\t\t\t_currentActiveCubeFace = 0;\n\t\t\t_currentActiveMipmapLevel = 0;\n\t\t\t_currentRenderTarget = null;\n\n\t\t\tstate.reset();\n\t\t\tbindingStates.reset();\n\n\t\t};\n\n\t\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Defines the coordinate system of the renderer.\n\t *\n\t * In `WebGLRenderer`, the value is always `WebGLCoordinateSystem`.\n\t *\n\t * @type {WebGLCoordinateSystem|WebGPUCoordinateSystem}\n\t * @default WebGLCoordinateSystem\n\t * @readonly\n\t */\n\tget coordinateSystem() {\n\n\t\treturn WebGLCoordinateSystem;\n\n\t}\n\n\t/**\n\t * Defines the output color space of the renderer.\n\t *\n\t * @type {SRGBColorSpace|LinearSRGBColorSpace}\n\t * @default SRGBColorSpace\n\t */\n\tget outputColorSpace() {\n\n\t\treturn this._outputColorSpace;\n\n\t}\n\n\tset outputColorSpace( colorSpace ) {\n\n\t\tthis._outputColorSpace = colorSpace;\n\n\t\tconst gl = this.getContext();\n\t\tgl.drawingBufferColorSpace = ColorManagement._getDrawingBufferColorSpace( colorSpace );\n\t\tgl.unpackColorSpace = ColorManagement._getUnpackColorSpace();\n\n\t}\n\n}\n\nexport { ACESFilmicToneMapping, AddEquation, AddOperation, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, ArrayCamera, BackSide, BoxGeometry, BufferAttribute, BufferGeometry, ByteType, CineonToneMapping, ClampToEdgeWrapping, Color, ColorManagement, ConstantAlphaFactor, ConstantColorFactor, CubeDepthTexture, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeUVReflectionMapping, CullFaceBack, CullFaceFront, CullFaceNone, CustomBlending, CustomToneMapping, Data3DTexture, DataArrayTexture, DataTexture, DepthFormat, DepthStencilFormat, DepthTexture, DoubleSide, DstAlphaFactor, DstColorFactor, EqualCompare, EqualDepth, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, ExternalTexture, Float32BufferAttribute, FloatType, FrontSide, Frustum, GLSL3, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, HalfFloatType, IntType, Layers, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, Matrix3, Matrix4, MaxEquation, Mesh, MeshBasicMaterial, MeshDepthMaterial, MeshDistanceMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NoBlending, NoColorSpace, NoToneMapping, NormalBlending, NotEqualCompare, NotEqualDepth, ObjectSpaceNormalMap, OneFactor, OneMinusConstantAlphaFactor, OneMinusConstantColorFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, PCFShadowMap, PCFSoftShadowMap, PMREMGenerator, PerspectiveCamera, Plane, PlaneGeometry, R11_EAC_Format, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RG11_EAC_Format, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBFormat, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RawShaderMaterial, RedFormat, RedIntegerFormat, ReinhardToneMapping, RepeatWrapping, ReverseSubtractEquation, SIGNED_R11_EAC_Format, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SIGNED_RG11_EAC_Format, SRGBColorSpace, SRGBTransfer, ShaderChunk, ShaderLib, ShaderMaterial, ShortType, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, SubtractEquation, SubtractiveBlending, TangentSpaceNormalMap, Texture, Uint16BufferAttribute, Uint32BufferAttribute, UniformsLib, UniformsUtils, UnsignedByteType, UnsignedInt101111Type, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, VSMShadowMap, Vector2, Vector3, Vector4, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGLRenderTarget, WebGLRenderer, WebGLUtils, WebXRController, ZeroFactor, createCanvasElement, error, log, warn, warnOnce };\n", "import {\n\tAnimationClip,\n\tBooleanKeyframeTrack,\n\tColorKeyframeTrack,\n\tNumberKeyframeTrack,\n\tVector3,\n\tVectorKeyframeTrack\n} from 'three';\n\n/**\n * A utility class with factory methods for creating basic animation clips.\n *\n * @hideconstructor\n * @three_import import { AnimationClipCreator } from 'three/addons/animation/AnimationClipCreator.js';\n */\nclass AnimationClipCreator {\n\n\t/**\n\t * Creates an animation clip that rotates a 3D object 360 degrees\n\t * in the given period of time around the given axis.\n\t *\n\t * @param {number} period - The duration of the animation.\n\t * @param {('x'|'y'|'z')} [axis='x'] - The axis of rotation.\n\t * @return {AnimationClip} The created animation clip.\n\t */\n\tstatic CreateRotationAnimation( period, axis = 'x' ) {\n\n\t\tconst times = [ 0, period ], values = [ 0, 360 ];\n\n\t\tconst trackName = '.rotation[' + axis + ']';\n\n\t\tconst track = new NumberKeyframeTrack( trackName, times, values );\n\n\t\treturn new AnimationClip( '', period, [ track ] );\n\n\t}\n\n\t/**\n\t * Creates an animation clip that scales a 3D object from `0` to `1`\n\t * in the given period of time along the given axis.\n\t *\n\t * @param {number} period - The duration of the animation.\n\t * @param {('x'|'y'|'z')} [axis='x'] - The axis to scale the 3D object along.\n\t * @return {AnimationClip} The created animation clip.\n\t */\n\tstatic CreateScaleAxisAnimation( period, axis = 'x' ) {\n\n\t\tconst times = [ 0, period ], values = [ 0, 1 ];\n\n\t\tconst trackName = '.scale[' + axis + ']';\n\n\t\tconst track = new NumberKeyframeTrack( trackName, times, values );\n\n\t\treturn new AnimationClip( '', period, [ track ] );\n\n\t}\n\n\t/**\n\t * Creates an animation clip that translates a 3D object in a shake pattern\n\t * in the given period.\n\t *\n\t * @param {number} duration - The duration of the animation.\n\t * @param {Vector3} shakeScale - The scale of the shake.\n\t * @return {AnimationClip} The created animation clip.\n\t */\n\tstatic CreateShakeAnimation( duration, shakeScale ) {\n\n\t\tconst times = [], values = [], tmp = new Vector3();\n\n\t\tfor ( let i = 0; i < duration * 10; i ++ ) {\n\n\t\t\ttimes.push( i / 10 );\n\n\t\t\ttmp.set( Math.random() * 2.0 - 1.0, Math.random() * 2.0 - 1.0, Math.random() * 2.0 - 1.0 ).\n\t\t\t\tmultiply( shakeScale ).\n\t\t\t\ttoArray( values, values.length );\n\n\t\t}\n\n\t\tconst trackName = '.position';\n\n\t\tconst track = new VectorKeyframeTrack( trackName, times, values );\n\n\t\treturn new AnimationClip( '', duration, [ track ] );\n\n\t}\n\n\t/**\n\t * Creates an animation clip that scales a 3D object in a pulse pattern\n\t * in the given period.\n\t *\n\t * @param {number} duration - The duration of the animation.\n\t * @param {number} pulseScale - The scale of the pulse.\n\t * @return {AnimationClip} The created animation clip.\n\t */\n\tstatic CreatePulsationAnimation( duration, pulseScale ) {\n\n\t\tconst times = [], values = [], tmp = new Vector3();\n\n\t\tfor ( let i = 0; i < duration * 10; i ++ ) {\n\n\t\t\ttimes.push( i / 10 );\n\n\t\t\tconst scaleFactor = Math.random() * pulseScale;\n\t\t\ttmp.set( scaleFactor, scaleFactor, scaleFactor ).\n\t\t\t\ttoArray( values, values.length );\n\n\t\t}\n\n\t\tconst trackName = '.scale';\n\n\t\tconst track = new VectorKeyframeTrack( trackName, times, values );\n\n\t\treturn new AnimationClip( '', duration, [ track ] );\n\n\t}\n\n\t/**\n\t * Creates an animation clip that toggles the visibility of a 3D object.\n\t *\n\t * @param {number} duration - The duration of the animation.\n\t * @return {AnimationClip} The created animation clip.\n\t */\n\tstatic CreateVisibilityAnimation( duration ) {\n\n\t\tconst times = [ 0, duration / 2, duration ], values = [ true, false, true ];\n\n\t\tconst trackName = '.visible';\n\n\t\tconst track = new BooleanKeyframeTrack( trackName, times, values );\n\n\t\treturn new AnimationClip( '', duration, [ track ] );\n\n\t}\n\n\t/**\n\t * Creates an animation clip that animates the `color` property of a 3D object's\n\t * material.\n\t *\n\t * @param {number} duration - The duration of the animation.\n\t * @param {Array<Color>} colors - An array of colors that should be sequentially animated.\n\t * @return {AnimationClip} The created animation clip.\n\t */\n\tstatic CreateMaterialColorAnimation( duration, colors ) {\n\n\t\tconst times = [], values = [],\n\t\t\ttimeStep = ( colors.length > 1 ) ? duration / ( colors.length - 1 ) : 0;\n\n\t\tfor ( let i = 0; i < colors.length; i ++ ) {\n\n\t\t\ttimes.push( i * timeStep );\n\n\t\t\tconst color = colors[ i ];\n\t\t\tvalues.push( color.r, color.g, color.b );\n\n\t\t}\n\n\t\tconst trackName = '.material.color';\n\n\t\tconst track = new ColorKeyframeTrack( trackName, times, values );\n\n\t\treturn new AnimationClip( '', duration, [ track ] );\n\n\t}\n\n}\n\nexport { AnimationClipCreator };\n", "import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tColor,\n\tLine,\n\tLineBasicMaterial,\n\tMatrix4,\n\tMesh,\n\tMeshBasicMaterial,\n\tObject3D,\n\tQuaternion,\n\tSphereGeometry,\n\tVector3\n} from 'three';\n\nconst _quaternion = new Quaternion();\nconst _targetPos = new Vector3();\nconst _targetVec = new Vector3();\nconst _effectorPos = new Vector3();\nconst _effectorVec = new Vector3();\nconst _linkPos = new Vector3();\nconst _invLinkQ = new Quaternion();\nconst _linkScale = new Vector3();\nconst _axis = new Vector3();\nconst _vector = new Vector3();\nconst _matrix = new Matrix4();\n\n/**\n * This class solves the Inverse Kinematics Problem with a [CCD Algorithm](https://web.archive.org/web/20221206080850/https://sites.google.com/site/auraliusproject/ccd-algorithm).\n *\n * `CCDIKSolver` is designed to work with instances of {@link SkinnedMesh}.\n *\n * @three_import import { CCDIKSolver } from 'three/addons/animation/CCDIKSolver.js';\n */\nclass CCDIKSolver {\n\n\t/**\n\t * @param {SkinnedMesh} mesh - The skinned mesh.\n\t * @param {Array<CCDIKSolver~IK>} [iks=[]] - The IK objects.\n\t */\n\tconstructor( mesh, iks = [] ) {\n\n\t\t/**\n\t\t * The skinned mesh.\n\t\t *\n\t\t * @type {SkinnedMesh}\n\t\t */\n\t\tthis.mesh = mesh;\n\n\t\t/**\n\t\t * The IK objects.\n\t\t *\n\t\t * @type {SkinnedMesh}\n\t\t */\n\t\tthis.iks = iks;\n\n\t\tthis._initialQuaternions = [];\n\t\tthis._workingQuaternion = new Quaternion();\n\n\t\tfor ( const ik of iks ) {\n\n\t\t\tconst chainQuats = [];\n\t\t\tfor ( let i = 0; i < ik.links.length; i ++ ) {\n\n\t\t\t  chainQuats.push( new Quaternion() );\n\n\t\t\t}\n\n\t\t\tthis._initialQuaternions.push( chainQuats );\n\n\t\t}\n\n\t\tthis._valid();\n\n\t}\n\n\t/**\n\t * Updates all IK bones by solving the CCD algorithm.\n\t *\n\t * @param {number} [globalBlendFactor=1.0] - Blend factor applied if an IK chain doesn't have its own .blendFactor.\n\t * @return {CCDIKSolver} A reference to this instance.\n\t */\n\tupdate( globalBlendFactor = 1.0 ) {\n\n\t\tconst iks = this.iks;\n\n\t\tfor ( let i = 0, il = iks.length; i < il; i ++ ) {\n\n\t\t\tthis.updateOne( iks[ i ], globalBlendFactor );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Updates one IK bone solving the CCD algorithm.\n\t *\n\t * @param {CCDIKSolver~IK} ik - The IK to update.\n\t * @param {number} [overrideBlend=1.0] - If the IK object does not define `blendFactor`, this value is used.\n\t * @return {CCDIKSolver} A reference to this instance.\n\t */\n\tupdateOne( ik, overrideBlend = 1.0 ) {\n\n\t\tconst chainBlend = ik.blendFactor !== undefined ? ik.blendFactor : overrideBlend;\n\t\tconst bones = this.mesh.skeleton.bones;\n\t\tconst chainIndex = this.iks.indexOf( ik );\n\t\tconst initialQuaternions = this._initialQuaternions[ chainIndex ];\n\n\t\t// for reference overhead reduction in loop\n\t\tconst math = Math;\n\n\t\tconst effector = bones[ ik.effector ];\n\t\tconst target = bones[ ik.target ];\n\n\t\t// don't use getWorldPosition() here for the performance\n\t\t// because it calls updateMatrixWorld( true ) inside.\n\t\t_targetPos.setFromMatrixPosition( target.matrixWorld );\n\n\t\tconst links = ik.links;\n\t\tconst iteration = ik.iteration !== undefined ? ik.iteration : 1;\n\n\t\tif ( chainBlend < 1.0 ) {\n\n\t\t\tfor ( let j = 0; j < links.length; j ++ ) {\n\n\t\t\t  const linkIndex = links[ j ].index;\n\t\t\t  initialQuaternions[ j ].copy( bones[ linkIndex ].quaternion );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < iteration; i ++ ) {\n\n\t\t\tlet rotated = false;\n\n\t\t\tfor ( let j = 0, jl = links.length; j < jl; j ++ ) {\n\n\t\t\t\tconst link = bones[ links[ j ].index ];\n\n\t\t\t\t// skip this link and following links\n\t\t\t\tif ( links[ j ].enabled === false ) break;\n\n\t\t\t\tconst limitation = links[ j ].limitation;\n\t\t\t\tconst rotationMin = links[ j ].rotationMin;\n\t\t\t\tconst rotationMax = links[ j ].rotationMax;\n\n\t\t\t\t// don't use getWorldPosition/Quaternion() here for the performance\n\t\t\t\t// because they call updateMatrixWorld( true ) inside.\n\t\t\t\tlink.matrixWorld.decompose( _linkPos, _invLinkQ, _linkScale );\n\t\t\t\t_invLinkQ.invert();\n\t\t\t\t_effectorPos.setFromMatrixPosition( effector.matrixWorld );\n\n\t\t\t\t// work in link world\n\t\t\t\t_effectorVec.subVectors( _effectorPos, _linkPos );\n\t\t\t\t_effectorVec.applyQuaternion( _invLinkQ );\n\t\t\t\t_effectorVec.normalize();\n\n\t\t\t\t_targetVec.subVectors( _targetPos, _linkPos );\n\t\t\t\t_targetVec.applyQuaternion( _invLinkQ );\n\t\t\t\t_targetVec.normalize();\n\n\t\t\t\tlet angle = _targetVec.dot( _effectorVec );\n\n\t\t\t\tif ( angle > 1.0 ) {\n\n\t\t\t\t\tangle = 1.0;\n\n\t\t\t\t} else if ( angle < - 1.0 ) {\n\n\t\t\t\t\tangle = - 1.0;\n\n\t\t\t\t}\n\n\t\t\t\tangle = math.acos( angle );\n\n\t\t\t\t// skip if changing angle is too small to prevent vibration of bone\n\t\t\t\tif ( angle < 1e-5 ) continue;\n\n\t\t\t\tif ( ik.minAngle !== undefined && angle < ik.minAngle ) {\n\n\t\t\t\t\tangle = ik.minAngle;\n\n\t\t\t\t}\n\n\t\t\t\tif ( ik.maxAngle !== undefined && angle > ik.maxAngle ) {\n\n\t\t\t\t\tangle = ik.maxAngle;\n\n\t\t\t\t}\n\n\t\t\t\t_axis.crossVectors( _effectorVec, _targetVec );\n\t\t\t\t_axis.normalize();\n\n\t\t\t\t_quaternion.setFromAxisAngle( _axis, angle );\n\t\t\t\tlink.quaternion.multiply( _quaternion );\n\n\t\t\t\t// TODO: re-consider the limitation specification\n\t\t\t\tif ( limitation !== undefined ) {\n\n\t\t\t\t\tlet c = link.quaternion.w;\n\n\t\t\t\t\tif ( c > 1.0 ) c = 1.0;\n\n\t\t\t\t\tconst c2 = math.sqrt( 1 - c * c );\n\t\t\t\t\tlink.quaternion.set( limitation.x * c2,\n\t\t\t\t\t                     limitation.y * c2,\n\t\t\t\t\t                     limitation.z * c2,\n\t\t\t\t\t                     c );\n\n\t\t\t\t}\n\n\t\t\t\tif ( rotationMin !== undefined ) {\n\n\t\t\t\t\tlink.rotation.setFromVector3( _vector.setFromEuler( link.rotation ).max( rotationMin ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( rotationMax !== undefined ) {\n\n\t\t\t\t\tlink.rotation.setFromVector3( _vector.setFromEuler( link.rotation ).min( rotationMax ) );\n\n\t\t\t\t}\n\n\t\t\t\tlink.updateMatrixWorld( true );\n\n\t\t\t\trotated = true;\n\n\t\t\t}\n\n\t\t\tif ( ! rotated ) break;\n\n\t\t}\n\n\t\tif ( chainBlend < 1.0 ) {\n\n\t\t\tfor ( let j = 0; j < links.length; j ++ ) {\n\n\t\t\t  const linkIndex = links[ j ].index;\n\t\t\t  const link = bones[ linkIndex ];\n\n\t\t\t  this._workingQuaternion.copy( initialQuaternions[ j ] ).slerp( link.quaternion, chainBlend );\n\n\t\t\t  link.quaternion.copy( this._workingQuaternion );\n\t\t\t  link.updateMatrixWorld( true );\n\n\t\t\t}\n\n\t\t}\n\n\t\t  return this;\n\n\t}\n\n\t/**\n\t * Creates a helper for visualizing the CCDIK.\n\t *\n\t * @param {number} sphereSize - The sphere size.\n\t * @return {CCDIKHelper} The created helper.\n\t */\n\tcreateHelper( sphereSize ) {\n\n\t\treturn new CCDIKHelper( this.mesh, this.iks, sphereSize );\n\n\t}\n\n\t// private methods\n\n\t_valid() {\n\n\t\tconst iks = this.iks;\n\t\tconst bones = this.mesh.skeleton.bones;\n\n\t\tfor ( let i = 0, il = iks.length; i < il; i ++ ) {\n\n\t\t\tconst ik = iks[ i ];\n\t\t\tconst effector = bones[ ik.effector ];\n\t\t\tconst links = ik.links;\n\t\t\tlet link0, link1;\n\n\t\t\tlink0 = effector;\n\n\t\t\tfor ( let j = 0, jl = links.length; j < jl; j ++ ) {\n\n\t\t\t\tlink1 = bones[ links[ j ].index ];\n\n\t\t\t\tif ( link0.parent !== link1 ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.CCDIKSolver: bone ' + link0.name + ' is not the child of bone ' + link1.name );\n\n\t\t\t\t}\n\n\t\t\t\tlink0 = link1;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction getPosition( bone, matrixWorldInv ) {\n\n\treturn _vector\n\t\t.setFromMatrixPosition( bone.matrixWorld )\n\t\t.applyMatrix4( matrixWorldInv );\n\n}\n\nfunction setPositionOfBoneToAttributeArray( array, index, bone, matrixWorldInv ) {\n\n\tconst v = getPosition( bone, matrixWorldInv );\n\n\tarray[ index * 3 + 0 ] = v.x;\n\tarray[ index * 3 + 1 ] = v.y;\n\tarray[ index * 3 + 2 ] = v.z;\n\n}\n\n/**\n * Helper for visualizing IK bones.\n *\n * @augments Object3D\n * @three_import import { CCDIKHelper } from 'three/addons/animation/CCDIKSolver.js';\n */\nclass CCDIKHelper extends Object3D {\n\n\t/**\n\t * @param {SkinnedMesh} mesh - The skinned mesh.\n \t * @param {Array<CCDIKSolver~IK>} [iks=[]] - The IK objects.\n \t * @param {number} [sphereSize=0.25] - The sphere size.\n\t */\n\tconstructor( mesh, iks = [], sphereSize = 0.25 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The skinned mesh this helper refers to.\n\t\t *\n\t\t * @type {SkinnedMesh}\n\t\t */\n\t\tthis.root = mesh;\n\n\t\t/**\n\t\t * The IK objects.\n\t\t *\n\t\t * @type {Array<CCDIKSolver~IK>}\n\t\t */\n\t\tthis.iks = iks;\n\n\t\tthis.matrix.copy( mesh.matrixWorld );\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * The helpers sphere geometry.\n\t\t *\n\t\t * @type {SkinnedMesh}\n\t\t */\n\t\tthis.sphereGeometry = new SphereGeometry( sphereSize, 16, 8 );\n\n\t\t/**\n\t\t * The material for the target spheres.\n\t\t *\n\t\t * @type {MeshBasicMaterial}\n\t\t */\n\t\tthis.targetSphereMaterial = new MeshBasicMaterial( {\n\t\t\tcolor: new Color( 0xff8888 ),\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\ttransparent: true\n\t\t} );\n\n\t\t/**\n\t\t * The material for the effector spheres.\n\t\t *\n\t\t * @type {MeshBasicMaterial}\n\t\t */\n\t\tthis.effectorSphereMaterial = new MeshBasicMaterial( {\n\t\t\tcolor: new Color( 0x88ff88 ),\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\ttransparent: true\n\t\t} );\n\n\t\t/**\n\t\t * The material for the link spheres.\n\t\t *\n\t\t * @type {MeshBasicMaterial}\n\t\t */\n\t\tthis.linkSphereMaterial = new MeshBasicMaterial( {\n\t\t\tcolor: new Color( 0x8888ff ),\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\ttransparent: true\n\t\t} );\n\n\t\t/**\n\t\t * A global line material.\n\t\t *\n\t\t * @type {LineBasicMaterial}\n\t\t */\n\t\tthis.lineMaterial = new LineBasicMaterial( {\n\t\t\tcolor: new Color( 0xff0000 ),\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\ttransparent: true\n\t\t} );\n\n\t\tthis._init();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst mesh = this.root;\n\n\t\tif ( this.visible ) {\n\n\t\t\tlet offset = 0;\n\n\t\t\tconst iks = this.iks;\n\t\t\tconst bones = mesh.skeleton.bones;\n\n\t\t\t_matrix.copy( mesh.matrixWorld ).invert();\n\n\t\t\tfor ( let i = 0, il = iks.length; i < il; i ++ ) {\n\n\t\t\t\tconst ik = iks[ i ];\n\n\t\t\t\tconst targetBone = bones[ ik.target ];\n\t\t\t\tconst effectorBone = bones[ ik.effector ];\n\n\t\t\t\tconst targetMesh = this.children[ offset ++ ];\n\t\t\t\tconst effectorMesh = this.children[ offset ++ ];\n\n\t\t\t\ttargetMesh.position.copy( getPosition( targetBone, _matrix ) );\n\t\t\t\teffectorMesh.position.copy( getPosition( effectorBone, _matrix ) );\n\n\t\t\t\tfor ( let j = 0, jl = ik.links.length; j < jl; j ++ ) {\n\n\t\t\t\t\tconst link = ik.links[ j ];\n\t\t\t\t\tconst linkBone = bones[ link.index ];\n\n\t\t\t\t\tconst linkMesh = this.children[ offset ++ ];\n\n\t\t\t\t\tlinkMesh.position.copy( getPosition( linkBone, _matrix ) );\n\n\t\t\t\t}\n\n\t\t\t\tconst line = this.children[ offset ++ ];\n\t\t\t\tconst array = line.geometry.attributes.position.array;\n\n\t\t\t\tsetPositionOfBoneToAttributeArray( array, 0, targetBone, _matrix );\n\t\t\t\tsetPositionOfBoneToAttributeArray( array, 1, effectorBone, _matrix );\n\n\t\t\t\tfor ( let j = 0, jl = ik.links.length; j < jl; j ++ ) {\n\n\t\t\t\t\tconst link = ik.links[ j ];\n\t\t\t\t\tconst linkBone = bones[ link.index ];\n\t\t\t\t\tsetPositionOfBoneToAttributeArray( array, j + 2, linkBone, _matrix );\n\n\t\t\t\t}\n\n\t\t\t\tline.geometry.attributes.position.needsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.matrix.copy( mesh.matrixWorld );\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance.\n\t * Call this method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.sphereGeometry.dispose();\n\n\t\tthis.targetSphereMaterial.dispose();\n\t\tthis.effectorSphereMaterial.dispose();\n\t\tthis.linkSphereMaterial.dispose();\n\t\tthis.lineMaterial.dispose();\n\n\t\tconst children = this.children;\n\n\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\tconst child = children[ i ];\n\n\t\t\tif ( child.isLine ) child.geometry.dispose();\n\n\t\t}\n\n\t}\n\n\t// private method\n\n\t_init() {\n\n\t\tconst scope = this;\n\t\tconst iks = this.iks;\n\n\t\tfunction createLineGeometry( ik ) {\n\n\t\t\tconst geometry = new BufferGeometry();\n\t\t\tconst vertices = new Float32Array( ( 2 + ik.links.length ) * 3 );\n\t\t\tgeometry.setAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction createTargetMesh() {\n\n\t\t\treturn new Mesh( scope.sphereGeometry, scope.targetSphereMaterial );\n\n\t\t}\n\n\t\tfunction createEffectorMesh() {\n\n\t\t\treturn new Mesh( scope.sphereGeometry, scope.effectorSphereMaterial );\n\n\t\t}\n\n\t\tfunction createLinkMesh() {\n\n\t\t\treturn new Mesh( scope.sphereGeometry, scope.linkSphereMaterial );\n\n\t\t}\n\n\t\tfunction createLine( ik ) {\n\n\t\t\treturn new Line( createLineGeometry( ik ), scope.lineMaterial );\n\n\t\t}\n\n\t\tfor ( let i = 0, il = iks.length; i < il; i ++ ) {\n\n\t\t\tconst ik = iks[ i ];\n\n\t\t\tthis.add( createTargetMesh() );\n\t\t\tthis.add( createEffectorMesh() );\n\n\t\t\tfor ( let j = 0, jl = ik.links.length; j < jl; j ++ ) {\n\n\t\t\t\tthis.add( createLinkMesh() );\n\n\t\t\t}\n\n\t\t\tthis.add( createLine( ik ) );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * This type represents IK configuration objects.\n *\n * @typedef {Object} CCDIKSolver~IK\n * @property {number} target - The target bone index which refers to a bone in the `Skeleton.bones` array.\n * @property {number} effector - The effector bone index which refers to a bone in the `Skeleton.bones` array.\n * @property {Array<CCDIKSolver~BoneLink>} links - An array of bone links.\n * @property {number} [iteration=1] - Iteration number of calculation. Smaller is faster but less precise.\n * @property {number} [minAngle] - Minimum rotation angle in a step in radians.\n * @property {number} [maxAngle] - Minimum rotation angle in a step in radians.\n * @property {number} [blendFactor] - The blend factor.\n **/\n\n/**\n * This type represents bone links.\n *\n * @typedef {Object} CCDIKSolver~BoneLink\n * @property {number} index - The index of a linked bone which refers to a bone in the `Skeleton.bones` array.\n * @property {number} [limitation] - Rotation axis.\n * @property {number} [rotationMin] - Rotation minimum limit.\n * @property {number} [rotationMax] - Rotation maximum limit.\n * @property {boolean} [enabled=true] - Whether the link is enabled or not.\n **/\n\n\nexport { CCDIKSolver, CCDIKHelper };\n", "import {\n\tControls,\n\tGridHelper,\n\tEllipseCurve,\n\tBufferGeometry,\n\tLine,\n\tLineBasicMaterial,\n\tRaycaster,\n\tGroup,\n\tBox3,\n\tSphere,\n\tQuaternion,\n\tVector2,\n\tVector3,\n\tMatrix4,\n\tMathUtils\n} from 'three';\n\n//trackball state\nconst STATE = {\n\n\tIDLE: Symbol(),\n\tROTATE: Symbol(),\n\tPAN: Symbol(),\n\tSCALE: Symbol(),\n\tFOV: Symbol(),\n\tFOCUS: Symbol(),\n\tZROTATE: Symbol(),\n\tTOUCH_MULTI: Symbol(),\n\tANIMATION_FOCUS: Symbol(),\n\tANIMATION_ROTATE: Symbol()\n\n};\n\nconst INPUT = {\n\n\tNONE: Symbol(),\n\tONE_FINGER: Symbol(),\n\tONE_FINGER_SWITCHED: Symbol(),\n\tTWO_FINGER: Symbol(),\n\tMULT_FINGER: Symbol(),\n\tCURSOR: Symbol()\n\n};\n\n//cursor center coordinates\nconst _center = {\n\n\tx: 0,\n\ty: 0\n\n};\n\n//transformation matrices for gizmos and camera\nconst _transformation = {\n\n\tcamera: new Matrix4(),\n\tgizmos: new Matrix4()\n\n};\n\n/**\n * Fires when the camera has been transformed by the controls.\n *\n * @event ArcballControls#change\n * @type {Object}\n */\nconst _changeEvent = { type: 'change' };\n\n/**\n * Fires when an interaction was initiated.\n *\n * @event ArcballControls#start\n * @type {Object}\n */\nconst _startEvent = { type: 'start' };\n\n/**\n * Fires when an interaction has finished.\n *\n * @event ArcballControls#end\n * @type {Object}\n */\nconst _endEvent = { type: 'end' };\n\nconst _raycaster = new Raycaster();\nconst _offset = new Vector3();\n\nconst _gizmoMatrixStateTemp = new Matrix4();\nconst _cameraMatrixStateTemp = new Matrix4();\nconst _scalePointTemp = new Vector3();\n\nconst _EPS = 0.000001;\n\n/**\n * Arcball controls allow the camera to be controlled by a virtual trackball with full touch support and advanced navigation functionality.\n * Cursor/finger positions and movements are mapped over a virtual trackball surface represented by a gizmo and mapped in intuitive and\n * consistent camera movements. Dragging cursor/fingers will cause camera to orbit around the center of the trackball in a conservative\n * way (returning to the starting point will make the camera return to its starting orientation).\n *\n * In addition to supporting pan, zoom and pinch gestures, Arcball controls provide focus< functionality with a double click/tap for intuitively\n * moving the object's point of interest in the center of the virtual trackball. Focus allows a much better inspection and navigation in complex\n * environment. Moreover Arcball controls allow FOV manipulation (in a vertigo-style method) and z-rotation. Saving and restoring of Camera State\n * is supported also through clipboard (use ctrl+c and ctrl+v shortcuts for copy and paste the state).\n *\n * Unlike {@link OrbitControls} and {@link TrackballControls}, `ArcballControls` doesn't require `update()` to be called externally in an\n * animation loop when animations are on.\n *\n * @augments Controls\n * @three_import import { ArcballControls } from 'three/addons/controls/ArcballControls.js';\n */\nclass ArcballControls extends Controls {\n\n\t/**\n\t * Constructs a new controls instance.\n\t *\n\t * @param {Camera} camera - The camera to be controlled. The camera must not be a child of another object, unless that object is the scene itself.\n\t * @param {?HTMLElement} [domElement=null] - The HTML element used for event listeners.\n\t * @param {?Scene} [scene=null] The scene rendered by the camera. If not given, gizmos cannot be shown.\n\t */\n\tconstructor( camera, domElement = null, scene = null ) {\n\n\t\tsuper( camera, domElement );\n\n\t\t/**\n\t\t * The scene rendered by the camera. If not given, gizmos cannot be shown.\n\t\t *\n\t\t * @type {?Scene}\n\t\t * @default null\n\t\t */\n\t\tthis.scene = scene;\n\n\t\t/**\n\t\t * The control's focus point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.target = new Vector3();\n\t\tthis._currentTarget = new Vector3();\n\n\t\t/**\n\t\t * The size of the gizmo relative to the screen width and height.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.67\n\t\t */\n\t\tthis.radiusFactor = 0.67;\n\n\t\t/**\n\t\t * Holds the mouse actions of this controls. This property is maintained by the methods\n\t\t * `setMouseAction()` and `unsetMouseAction()`.\n\t\t *\n\t\t * @type {Array<Object>}\n\t\t */\n\t\tthis.mouseActions = [];\n\t\tthis._mouseOp = null;\n\n\n\t\t//global vectors and matrices that are used in some operations to avoid creating new objects every time (e.g. every time cursor moves)\n\t\tthis._v2_1 = new Vector2();\n\t\tthis._v3_1 = new Vector3();\n\t\tthis._v3_2 = new Vector3();\n\n\t\tthis._m4_1 = new Matrix4();\n\t\tthis._m4_2 = new Matrix4();\n\n\t\tthis._quat = new Quaternion();\n\n\t\t//transformation matrices\n\t\tthis._translationMatrix = new Matrix4(); //matrix for translation operation\n\t\tthis._rotationMatrix = new Matrix4(); //matrix for rotation operation\n\t\tthis._scaleMatrix = new Matrix4(); //matrix for scaling operation\n\n\t\tthis._rotationAxis = new Vector3(); //axis for rotate operation\n\n\n\t\t//camera state\n\t\tthis._cameraMatrixState = new Matrix4();\n\t\tthis._cameraProjectionState = new Matrix4();\n\n\t\tthis._fovState = 1;\n\t\tthis._upState = new Vector3();\n\t\tthis._zoomState = 1;\n\t\tthis._nearPos = 0;\n\t\tthis._farPos = 0;\n\n\t\tthis._gizmoMatrixState = new Matrix4();\n\n\t\t//initial values\n\t\tthis._up0 = new Vector3();\n\t\tthis._zoom0 = 1;\n\t\tthis._fov0 = 0;\n\t\tthis._initialNear = 0;\n\t\tthis._nearPos0 = 0;\n\t\tthis._initialFar = 0;\n\t\tthis._farPos0 = 0;\n\t\tthis._cameraMatrixState0 = new Matrix4();\n\t\tthis._gizmoMatrixState0 = new Matrix4();\n\t\tthis._target0 = new Vector3();\n\n\t\t//pointers array\n\t\tthis._button = - 1;\n\t\tthis._touchStart = [];\n\t\tthis._touchCurrent = [];\n\t\tthis._input = INPUT.NONE;\n\n\t\t//two fingers touch interaction\n\t\tthis._switchSensibility = 32;\t//minimum movement to be performed to fire single pan start after the second finger has been released\n\t\tthis._startFingerDistance = 0; //distance between two fingers\n\t\tthis._currentFingerDistance = 0;\n\t\tthis._startFingerRotation = 0; //amount of rotation performed with two fingers\n\t\tthis._currentFingerRotation = 0;\n\n\t\t//double tap\n\t\tthis._devPxRatio = 0;\n\t\tthis._downValid = true;\n\t\tthis._nclicks = 0;\n\t\tthis._downEvents = [];\n\t\tthis._downStart = 0;\t//pointerDown time\n\t\tthis._clickStart = 0;\t//first click time\n\t\tthis._maxDownTime = 250;\n\t\tthis._maxInterval = 300;\n\t\tthis._posThreshold = 24;\n\t\tthis._movementThreshold = 24;\n\n\t\t//cursor positions\n\t\tthis._currentCursorPosition = new Vector3();\n\t\tthis._startCursorPosition = new Vector3();\n\n\t\t//grid\n\t\tthis._grid = null; //grid to be visualized during pan operation\n\t\tthis._gridPosition = new Vector3();\n\n\t\t//gizmos\n\t\tthis._gizmos = new Group();\n\t\tthis._curvePts = 128;\n\n\n\t\t//animations\n\t\tthis._timeStart = - 1; //initial time\n\t\tthis._animationId = - 1;\n\n\t\t/**\n\t\t * Duration of focus animations in ms.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 500\n\t\t */\n\t\tthis.focusAnimationTime = 500;\n\n\t\t//rotate animation\n\t\tthis._timePrev = 0; //time at which previous rotate operation has been detected\n\t\tthis._timeCurrent = 0; //time at which current rotate operation has been detected\n\t\tthis._anglePrev = 0; //angle of previous rotation\n\t\tthis._angleCurrent = 0; //angle of current rotation\n\t\tthis._cursorPosPrev = new Vector3();\t//cursor position when previous rotate operation has been detected\n\t\tthis._cursorPosCurr = new Vector3();//cursor position when current rotate operation has been detected\n\t\tthis._wPrev = 0; //angular velocity of the previous rotate operation\n\t\tthis._wCurr = 0; //angular velocity of the current rotate operation\n\n\t\t//parameters\n\n\t\t/**\n\t\t * If set to `true`, the camera's near and far values will be adjusted every time zoom is\n\t\t * performed trying to maintain the same visible portion given by initial near and far\n\t\t * values. Only works with perspective cameras.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.adjustNearFar = false;\n\n\t\t/**\n\t\t * The scaling factor used when performing zoom operation.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1.1\n\t\t */\n\t\tthis.scaleFactor = 1.1;\n\n\t\t/**\n\t\t * The damping inertia used if 'enableAnimations` is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 25\n\t\t */\n\t\tthis.dampingFactor = 25;\n\n\t\t/**\n\t\t * Maximum angular velocity allowed on rotation animation start.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 20\n\t\t */\n\t\tthis.wMax = 20;\n\n\t\t/**\n\t\t * Set to `true` to enable animations for rotation (damping) and focus operation.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enableAnimations = true;\n\n\t\t/**\n\t\t * If set to `true`, a grid will appear when panning operation is being performed\n\t\t * (desktop interaction only).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.enableGrid = false;\n\n\t\t/**\n\t\t * Set to `true` to make zoom become cursor centered.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.cursorZoom = false;\n\n\t\t/**\n\t\t * The minimum FOV in degrees.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 5\n\t\t */\n\t\tthis.minFov = 5;\n\n\t\t/**\n\t\t * The maximum FOV in degrees.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 90\n\t\t */\n\t\tthis.maxFov = 90;\n\n\t\t/**\n\t\t * Speed of rotation.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.rotateSpeed = 1;\n\n\t\t/**\n\t\t * Enable or disable camera panning.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enablePan = true;\n\n\t\t/**\n\t\t * Enable or disable camera rotation.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enableRotate = true;\n\n\t\t/**\n\t\t * Enable or disable camera zoom.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enableZoom = true;\n\n\t\t/**\n\t\t * Enable or disable gizmos.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enableGizmos = true;\n\n\t\t/**\n\t\t * Enable or disable camera focusing on double-tap (or click) operations.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enableFocus = true;\n\n\t\t/**\n\t\t * How far you can dolly in. For perspective cameras only.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.minDistance = 0;\n\n\t\t/**\n\t\t * How far you can dolly out. For perspective cameras only.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.maxDistance = Infinity;\n\n\t\t/**\n\t\t * How far you can zoom in. For orthographic cameras only.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.minZoom = 0;\n\n\t\t/**\n\t\t * How far you can zoom out. For orthographic cameras only.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.maxZoom = Infinity;\n\n\t\t//trackball parameters\n\t\tthis._tbRadius = 1;\n\n\t\t//FSA\n\t\tthis._state = STATE.IDLE;\n\n\t\tthis.setCamera( camera );\n\n\t\tif ( this.scene != null ) {\n\n\t\t\tthis.scene.add( this._gizmos );\n\n\t\t}\n\n\t\tthis.initializeMouseActions();\n\n\t\t// event listeners\n\n\t\tthis._onContextMenu = onContextMenu.bind( this );\n\t\tthis._onWheel = onWheel.bind( this );\n\t\tthis._onPointerUp = onPointerUp.bind( this );\n\t\tthis._onPointerMove = onPointerMove.bind( this );\n\t\tthis._onPointerDown = onPointerDown.bind( this );\n\t\tthis._onPointerCancel = onPointerCancel.bind( this );\n\t\tthis._onWindowResize = onWindowResize.bind( this );\n\n\t\tif ( domElement !== null ) {\n\n\t\t\tthis.connect( domElement );\n\n\t\t}\n\n\t}\n\n\tconnect( element ) {\n\n\t\tsuper.connect( element );\n\n\t\tthis.domElement.style.touchAction = 'none';\n\t\tthis._devPxRatio = window.devicePixelRatio;\n\n\t\tthis.domElement.addEventListener( 'contextmenu', this._onContextMenu );\n\t\tthis.domElement.addEventListener( 'wheel', this._onWheel, { passive: false } );\n\t\tthis.domElement.addEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.domElement.addEventListener( 'pointercancel', this._onPointerCancel );\n\n\t\twindow.addEventListener( 'resize', this._onWindowResize );\n\n\t}\n\n\tdisconnect() {\n\n\t\tthis.domElement.removeEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.domElement.removeEventListener( 'pointercancel', this._onPointerCancel );\n\t\tthis.domElement.removeEventListener( 'wheel', this._onWheel );\n\t\tthis.domElement.removeEventListener( 'contextmenu', this._onContextMenu );\n\n\t\twindow.removeEventListener( 'pointermove', this._onPointerMove );\n\t\twindow.removeEventListener( 'pointerup', this._onPointerUp );\n\n\t\twindow.removeEventListener( 'resize', this._onWindowResize );\n\n\t}\n\n\tonSinglePanStart( event, operation ) {\n\n\t\tif ( this.enabled ) {\n\n\t\t\tthis.dispatchEvent( _startEvent );\n\n\t\t\tthis.setCenter( event.clientX, event.clientY );\n\n\t\t\tswitch ( operation ) {\n\n\t\t\t\tcase 'PAN':\n\n\t\t\t\t\tif ( ! this.enablePan ) {\n\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this._animationId != - 1 ) {\n\n\t\t\t\t\t\tcancelAnimationFrame( this._animationId );\n\t\t\t\t\t\tthis._animationId = - 1;\n\t\t\t\t\t\tthis._timeStart = - 1;\n\n\t\t\t\t\t\tthis.activateGizmos( false );\n\t\t\t\t\t\tthis.dispatchEvent( _changeEvent );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.updateTbState( STATE.PAN, true );\n\t\t\t\t\tthis._startCursorPosition.copy( this.unprojectOnTbPlane( this.object, _center.x, _center.y, this.domElement ) );\n\t\t\t\t\tif ( this.enableGrid ) {\n\n\t\t\t\t\t\tthis.drawGrid();\n\t\t\t\t\t\tthis.dispatchEvent( _changeEvent );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ROTATE':\n\n\t\t\t\t\tif ( ! this.enableRotate ) {\n\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this._animationId != - 1 ) {\n\n\t\t\t\t\t\tcancelAnimationFrame( this._animationId );\n\t\t\t\t\t\tthis._animationId = - 1;\n\t\t\t\t\t\tthis._timeStart = - 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.updateTbState( STATE.ROTATE, true );\n\t\t\t\t\tthis._startCursorPosition.copy( this.unprojectOnTbSurface( this.object, _center.x, _center.y, this.domElement, this._tbRadius ) );\n\t\t\t\t\tthis.activateGizmos( true );\n\t\t\t\t\tif ( this.enableAnimations ) {\n\n\t\t\t\t\t\tthis._timePrev = this._timeCurrent = performance.now();\n\t\t\t\t\t\tthis._angleCurrent = this._anglePrev = 0;\n\t\t\t\t\t\tthis._cursorPosPrev.copy( this._startCursorPosition );\n\t\t\t\t\t\tthis._cursorPosCurr.copy( this._cursorPosPrev );\n\t\t\t\t\t\tthis._wCurr = 0;\n\t\t\t\t\t\tthis._wPrev = this._wCurr;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.dispatchEvent( _changeEvent );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'FOV':\n\n\t\t\t\t\tif ( ! this.object.isPerspectiveCamera || ! this.enableZoom ) {\n\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this._animationId != - 1 ) {\n\n\t\t\t\t\t\tcancelAnimationFrame( this._animationId );\n\t\t\t\t\t\tthis._animationId = - 1;\n\t\t\t\t\t\tthis._timeStart = - 1;\n\n\t\t\t\t\t\tthis.activateGizmos( false );\n\t\t\t\t\t\tthis.dispatchEvent( _changeEvent );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.updateTbState( STATE.FOV, true );\n\t\t\t\t\tthis._startCursorPosition.setY( this.getCursorNDC( _center.x, _center.y, this.domElement ).y * 0.5 );\n\t\t\t\t\tthis._currentCursorPosition.copy( this._startCursorPosition );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ZOOM':\n\n\t\t\t\t\tif ( ! this.enableZoom ) {\n\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this._animationId != - 1 ) {\n\n\t\t\t\t\t\tcancelAnimationFrame( this._animationId );\n\t\t\t\t\t\tthis._animationId = - 1;\n\t\t\t\t\t\tthis._timeStart = - 1;\n\n\t\t\t\t\t\tthis.activateGizmos( false );\n\t\t\t\t\t\tthis.dispatchEvent( _changeEvent );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.updateTbState( STATE.SCALE, true );\n\t\t\t\t\tthis._startCursorPosition.setY( this.getCursorNDC( _center.x, _center.y, this.domElement ).y * 0.5 );\n\t\t\t\t\tthis._currentCursorPosition.copy( this._startCursorPosition );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tonSinglePanMove( event, opState ) {\n\n\t\tif ( this.enabled ) {\n\n\t\t\tconst restart = opState != this._state;\n\t\t\tthis.setCenter( event.clientX, event.clientY );\n\n\t\t\tswitch ( opState ) {\n\n\t\t\t\tcase STATE.PAN:\n\n\t\t\t\t\tif ( this.enablePan ) {\n\n\t\t\t\t\t\tif ( restart ) {\n\n\t\t\t\t\t\t\t//switch to pan operation\n\n\t\t\t\t\t\t\tthis.dispatchEvent( _endEvent );\n\t\t\t\t\t\t\tthis.dispatchEvent( _startEvent );\n\n\t\t\t\t\t\t\tthis.updateTbState( opState, true );\n\t\t\t\t\t\t\tthis._startCursorPosition.copy( this.unprojectOnTbPlane( this.object, _center.x, _center.y, this.domElement ) );\n\t\t\t\t\t\t\tif ( this.enableGrid ) {\n\n\t\t\t\t\t\t\t\tthis.drawGrid();\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tthis.activateGizmos( false );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t//continue with pan operation\n\t\t\t\t\t\t\tthis._currentCursorPosition.copy( this.unprojectOnTbPlane( this.object, _center.x, _center.y, this.domElement ) );\n\t\t\t\t\t\t\tthis.applyTransformMatrix( this.pan( this._startCursorPosition, this._currentCursorPosition ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase STATE.ROTATE:\n\n\t\t\t\t\tif ( this.enableRotate ) {\n\n\t\t\t\t\t\tif ( restart ) {\n\n\t\t\t\t\t\t\t//switch to rotate operation\n\n\t\t\t\t\t\t\tthis.dispatchEvent( _endEvent );\n\t\t\t\t\t\t\tthis.dispatchEvent( _startEvent );\n\n\t\t\t\t\t\t\tthis.updateTbState( opState, true );\n\t\t\t\t\t\t\tthis._startCursorPosition.copy( this.unprojectOnTbSurface( this.object, _center.x, _center.y, this.domElement, this._tbRadius ) );\n\n\t\t\t\t\t\t\tif ( this.enableGrid ) {\n\n\t\t\t\t\t\t\t\tthis.disposeGrid();\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tthis.activateGizmos( true );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t//continue with rotate operation\n\t\t\t\t\t\t\tthis._currentCursorPosition.copy( this.unprojectOnTbSurface( this.object, _center.x, _center.y, this.domElement, this._tbRadius ) );\n\n\t\t\t\t\t\t\tconst distance = this._startCursorPosition.distanceTo( this._currentCursorPosition );\n\t\t\t\t\t\t\tconst angle = this._startCursorPosition.angleTo( this._currentCursorPosition );\n\t\t\t\t\t\t\tconst amount = Math.max( distance / this._tbRadius, angle ) * this.rotateSpeed; //effective rotation angle\n\n\t\t\t\t\t\t\tthis.applyTransformMatrix( this.rotate( this.calculateRotationAxis( this._startCursorPosition, this._currentCursorPosition ), amount ) );\n\n\t\t\t\t\t\t\tif ( this.enableAnimations ) {\n\n\t\t\t\t\t\t\t\tthis._timePrev = this._timeCurrent;\n\t\t\t\t\t\t\t\tthis._timeCurrent = performance.now();\n\t\t\t\t\t\t\t\tthis._anglePrev = this._angleCurrent;\n\t\t\t\t\t\t\t\tthis._angleCurrent = amount;\n\t\t\t\t\t\t\t\tthis._cursorPosPrev.copy( this._cursorPosCurr );\n\t\t\t\t\t\t\t\tthis._cursorPosCurr.copy( this._currentCursorPosition );\n\t\t\t\t\t\t\t\tthis._wPrev = this._wCurr;\n\t\t\t\t\t\t\t\tthis._wCurr = this.calculateAngularSpeed( this._anglePrev, this._angleCurrent, this._timePrev, this._timeCurrent );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase STATE.SCALE:\n\n\t\t\t\t\tif ( this.enableZoom ) {\n\n\t\t\t\t\t\tif ( restart ) {\n\n\t\t\t\t\t\t\t//switch to zoom operation\n\n\t\t\t\t\t\t\tthis.dispatchEvent( _endEvent );\n\t\t\t\t\t\t\tthis.dispatchEvent( _startEvent );\n\n\t\t\t\t\t\t\tthis.updateTbState( opState, true );\n\t\t\t\t\t\t\tthis._startCursorPosition.setY( this.getCursorNDC( _center.x, _center.y, this.domElement ).y * 0.5 );\n\t\t\t\t\t\t\tthis._currentCursorPosition.copy( this._startCursorPosition );\n\n\t\t\t\t\t\t\tif ( this.enableGrid ) {\n\n\t\t\t\t\t\t\t\tthis.disposeGrid();\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tthis.activateGizmos( false );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t//continue with zoom operation\n\t\t\t\t\t\t\tconst screenNotches = 8;\t//how many wheel notches corresponds to a full screen pan\n\t\t\t\t\t\t\tthis._currentCursorPosition.setY( this.getCursorNDC( _center.x, _center.y, this.domElement ).y * 0.5 );\n\n\t\t\t\t\t\t\tconst movement = this._currentCursorPosition.y - this._startCursorPosition.y;\n\n\t\t\t\t\t\t\tlet size = 1;\n\n\t\t\t\t\t\t\tif ( movement < 0 ) {\n\n\t\t\t\t\t\t\t\tsize = 1 / ( Math.pow( this.scaleFactor, - movement * screenNotches ) );\n\n\t\t\t\t\t\t\t} else if ( movement > 0 ) {\n\n\t\t\t\t\t\t\t\tsize = Math.pow( this.scaleFactor, movement * screenNotches );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tthis._v3_1.setFromMatrixPosition( this._gizmoMatrixState );\n\n\t\t\t\t\t\t\tthis.applyTransformMatrix( this.scale( size, this._v3_1 ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase STATE.FOV:\n\n\t\t\t\t\tif ( this.enableZoom && this.object.isPerspectiveCamera ) {\n\n\t\t\t\t\t\tif ( restart ) {\n\n\t\t\t\t\t\t\t//switch to fov operation\n\n\t\t\t\t\t\t\tthis.dispatchEvent( _endEvent );\n\t\t\t\t\t\t\tthis.dispatchEvent( _startEvent );\n\n\t\t\t\t\t\t\tthis.updateTbState( opState, true );\n\t\t\t\t\t\t\tthis._startCursorPosition.setY( this.getCursorNDC( _center.x, _center.y, this.domElement ).y * 0.5 );\n\t\t\t\t\t\t\tthis._currentCursorPosition.copy( this._startCursorPosition );\n\n\t\t\t\t\t\t\tif ( this.enableGrid ) {\n\n\t\t\t\t\t\t\t\tthis.disposeGrid();\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tthis.activateGizmos( false );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t//continue with fov operation\n\t\t\t\t\t\t\tconst screenNotches = 8;\t//how many wheel notches corresponds to a full screen pan\n\t\t\t\t\t\t\tthis._currentCursorPosition.setY( this.getCursorNDC( _center.x, _center.y, this.domElement ).y * 0.5 );\n\n\t\t\t\t\t\t\tconst movement = this._currentCursorPosition.y - this._startCursorPosition.y;\n\n\t\t\t\t\t\t\tlet size = 1;\n\n\t\t\t\t\t\t\tif ( movement < 0 ) {\n\n\t\t\t\t\t\t\t\tsize = 1 / ( Math.pow( this.scaleFactor, - movement * screenNotches ) );\n\n\t\t\t\t\t\t\t} else if ( movement > 0 ) {\n\n\t\t\t\t\t\t\t\tsize = Math.pow( this.scaleFactor, movement * screenNotches );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tthis._v3_1.setFromMatrixPosition( this._cameraMatrixState );\n\t\t\t\t\t\t\tconst x = this._v3_1.distanceTo( this._gizmos.position );\n\t\t\t\t\t\t\tlet xNew = x / size; //distance between camera and gizmos if scale(size, scalepoint) would be performed\n\n\t\t\t\t\t\t\t//check min and max distance\n\t\t\t\t\t\t\txNew = MathUtils.clamp( xNew, this.minDistance, this.maxDistance );\n\n\t\t\t\t\t\t\tconst y = x * Math.tan( MathUtils.DEG2RAD * this._fovState * 0.5 );\n\n\t\t\t\t\t\t\t//calculate new fov\n\t\t\t\t\t\t\tlet newFov = MathUtils.RAD2DEG * ( Math.atan( y / xNew ) * 2 );\n\n\t\t\t\t\t\t\t//check min and max fov\n\t\t\t\t\t\t\tnewFov = MathUtils.clamp( newFov, this.minFov, this.maxFov );\n\n\t\t\t\t\t\t\tconst newDistance = y / Math.tan( MathUtils.DEG2RAD * ( newFov / 2 ) );\n\t\t\t\t\t\t\tsize = x / newDistance;\n\t\t\t\t\t\t\tthis._v3_2.setFromMatrixPosition( this._gizmoMatrixState );\n\n\t\t\t\t\t\t\tthis.setFov( newFov );\n\t\t\t\t\t\t\tthis.applyTransformMatrix( this.scale( size, this._v3_2, false ) );\n\n\t\t\t\t\t\t\t//adjusting distance\n\t\t\t\t\t\t\t_offset.copy( this._gizmos.position ).sub( this.object.position ).normalize().multiplyScalar( newDistance / x );\n\t\t\t\t\t\t\tthis._m4_1.makeTranslation( _offset.x, _offset.y, _offset.z );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tthis.dispatchEvent( _changeEvent );\n\n\t\t}\n\n\t}\n\n\tonSinglePanEnd() {\n\n\t\tif ( this._state == STATE.ROTATE ) {\n\n\n\t\t\tif ( ! this.enableRotate ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( this.enableAnimations ) {\n\n\t\t\t\t//perform rotation animation\n\t\t\t\tconst deltaTime = ( performance.now() - this._timeCurrent );\n\t\t\t\tif ( deltaTime < 120 ) {\n\n\t\t\t\t\tconst w = Math.abs( ( this._wPrev + this._wCurr ) / 2 );\n\n\t\t\t\t\tconst self = this;\n\t\t\t\t\tthis._animationId = window.requestAnimationFrame( function ( t ) {\n\n\t\t\t\t\t\tself.updateTbState( STATE.ANIMATION_ROTATE, true );\n\t\t\t\t\t\tconst rotationAxis = self.calculateRotationAxis( self._cursorPosPrev, self._cursorPosCurr );\n\n\t\t\t\t\t\tself.onRotationAnim( t, rotationAxis, Math.min( w, self.wMax ) );\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t//cursor has been standing still for over 120 ms since last movement\n\t\t\t\t\tthis.updateTbState( STATE.IDLE, false );\n\t\t\t\t\tthis.activateGizmos( false );\n\t\t\t\t\tthis.dispatchEvent( _changeEvent );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.updateTbState( STATE.IDLE, false );\n\t\t\t\tthis.activateGizmos( false );\n\t\t\t\tthis.dispatchEvent( _changeEvent );\n\n\t\t\t}\n\n\t\t} else if ( this._state == STATE.PAN || this._state == STATE.IDLE ) {\n\n\t\t\tthis.updateTbState( STATE.IDLE, false );\n\n\t\t\tif ( this.enableGrid ) {\n\n\t\t\t\tthis.disposeGrid();\n\n\t\t\t}\n\n\t\t\tthis.activateGizmos( false );\n\t\t\tthis.dispatchEvent( _changeEvent );\n\n\n\t\t}\n\n\t\tthis.dispatchEvent( _endEvent );\n\n\t}\n\n\tonDoubleTap( event ) {\n\n\t\tif ( this.enabled && this.enablePan && this.enableFocus && this.scene != null ) {\n\n\t\t\tthis.dispatchEvent( _startEvent );\n\n\t\t\tthis.setCenter( event.clientX, event.clientY );\n\t\t\tconst hitP = this.unprojectOnObj( this.getCursorNDC( _center.x, _center.y, this.domElement ), this.object );\n\n\t\t\tif ( hitP != null && this.enableAnimations ) {\n\n\t\t\t\tconst self = this;\n\t\t\t\tif ( this._animationId != - 1 ) {\n\n\t\t\t\t\twindow.cancelAnimationFrame( this._animationId );\n\n\t\t\t\t}\n\n\t\t\t\tthis._timeStart = - 1;\n\t\t\t\tthis._animationId = window.requestAnimationFrame( function ( t ) {\n\n\t\t\t\t\tself.updateTbState( STATE.ANIMATION_FOCUS, true );\n\t\t\t\t\tself.onFocusAnim( t, hitP, self._cameraMatrixState, self._gizmoMatrixState );\n\n\t\t\t\t} );\n\n\t\t\t} else if ( hitP != null && ! this.enableAnimations ) {\n\n\t\t\t\tthis.updateTbState( STATE.FOCUS, true );\n\t\t\t\tthis.focus( hitP, this.scaleFactor );\n\t\t\t\tthis.updateTbState( STATE.IDLE, false );\n\t\t\t\tthis.dispatchEvent( _changeEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.dispatchEvent( _endEvent );\n\n\t}\n\n\tonDoublePanStart() {\n\n\t\tif ( this.enabled && this.enablePan ) {\n\n\t\t\tthis.dispatchEvent( _startEvent );\n\n\t\t\tthis.updateTbState( STATE.PAN, true );\n\n\t\t\tthis.setCenter( ( this._touchCurrent[ 0 ].clientX + this._touchCurrent[ 1 ].clientX ) / 2, ( this._touchCurrent[ 0 ].clientY + this._touchCurrent[ 1 ].clientY ) / 2 );\n\t\t\tthis._startCursorPosition.copy( this.unprojectOnTbPlane( this.object, _center.x, _center.y, this.domElement, true ) );\n\t\t\tthis._currentCursorPosition.copy( this._startCursorPosition );\n\n\t\t\tthis.activateGizmos( false );\n\n\t\t}\n\n\t}\n\n\tonDoublePanMove() {\n\n\t\tif ( this.enabled && this.enablePan ) {\n\n\t\t\tthis.setCenter( ( this._touchCurrent[ 0 ].clientX + this._touchCurrent[ 1 ].clientX ) / 2, ( this._touchCurrent[ 0 ].clientY + this._touchCurrent[ 1 ].clientY ) / 2 );\n\n\t\t\tif ( this._state != STATE.PAN ) {\n\n\t\t\t\tthis.updateTbState( STATE.PAN, true );\n\t\t\t\tthis._startCursorPosition.copy( this._currentCursorPosition );\n\n\t\t\t}\n\n\t\t\tthis._currentCursorPosition.copy( this.unprojectOnTbPlane( this.object, _center.x, _center.y, this.domElement, true ) );\n\t\t\tthis.applyTransformMatrix( this.pan( this._startCursorPosition, this._currentCursorPosition, true ) );\n\t\t\tthis.dispatchEvent( _changeEvent );\n\n\t\t}\n\n\t}\n\n\tonDoublePanEnd() {\n\n\t\tthis.updateTbState( STATE.IDLE, false );\n\t\tthis.dispatchEvent( _endEvent );\n\n\t}\n\n\tonRotateStart() {\n\n\t\tif ( this.enabled && this.enableRotate ) {\n\n\t\t\tthis.dispatchEvent( _startEvent );\n\n\t\t\tthis.updateTbState( STATE.ZROTATE, true );\n\n\t\t\t//this._startFingerRotation = event.rotation;\n\n\t\t\tthis._startFingerRotation = this.getAngle( this._touchCurrent[ 1 ], this._touchCurrent[ 0 ] ) + this.getAngle( this._touchStart[ 1 ], this._touchStart[ 0 ] );\n\t\t\tthis._currentFingerRotation = this._startFingerRotation;\n\n\t\t\tthis.object.getWorldDirection( this._rotationAxis ); //rotation axis\n\n\t\t\tif ( ! this.enablePan && ! this.enableZoom ) {\n\n\t\t\t\tthis.activateGizmos( true );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tonRotateMove() {\n\n\t\tif ( this.enabled && this.enableRotate ) {\n\n\t\t\tthis.setCenter( ( this._touchCurrent[ 0 ].clientX + this._touchCurrent[ 1 ].clientX ) / 2, ( this._touchCurrent[ 0 ].clientY + this._touchCurrent[ 1 ].clientY ) / 2 );\n\t\t\tlet rotationPoint;\n\n\t\t\tif ( this._state != STATE.ZROTATE ) {\n\n\t\t\t\tthis.updateTbState( STATE.ZROTATE, true );\n\t\t\t\tthis._startFingerRotation = this._currentFingerRotation;\n\n\t\t\t}\n\n\t\t\t//this._currentFingerRotation = event.rotation;\n\t\t\tthis._currentFingerRotation = this.getAngle( this._touchCurrent[ 1 ], this._touchCurrent[ 0 ] ) + this.getAngle( this._touchStart[ 1 ], this._touchStart[ 0 ] );\n\n\t\t\tif ( ! this.enablePan ) {\n\n\t\t\t\trotationPoint = new Vector3().setFromMatrixPosition( this._gizmoMatrixState );\n\n\t\t\t} else {\n\n\t\t\t\tthis._v3_2.setFromMatrixPosition( this._gizmoMatrixState );\n\t\t\t\trotationPoint = this.unprojectOnTbPlane( this.object, _center.x, _center.y, this.domElement ).applyQuaternion( this.object.quaternion ).multiplyScalar( 1 / this.object.zoom ).add( this._v3_2 );\n\n\t\t\t}\n\n\t\t\tconst amount = MathUtils.DEG2RAD * ( this._startFingerRotation - this._currentFingerRotation );\n\n\t\t\tthis.applyTransformMatrix( this.zRotate( rotationPoint, amount ) );\n\t\t\tthis.dispatchEvent( _changeEvent );\n\n\t\t}\n\n\t}\n\n\tonRotateEnd() {\n\n\t\tthis.updateTbState( STATE.IDLE, false );\n\t\tthis.activateGizmos( false );\n\t\tthis.dispatchEvent( _endEvent );\n\n\t}\n\n\tonPinchStart() {\n\n\t\tif ( this.enabled && this.enableZoom ) {\n\n\t\t\tthis.dispatchEvent( _startEvent );\n\t\t\tthis.updateTbState( STATE.SCALE, true );\n\n\t\t\tthis._startFingerDistance = this.calculatePointersDistance( this._touchCurrent[ 0 ], this._touchCurrent[ 1 ] );\n\t\t\tthis._currentFingerDistance = this._startFingerDistance;\n\n\t\t\tthis.activateGizmos( false );\n\n\t\t}\n\n\t}\n\n\tonPinchMove() {\n\n\t\tif ( this.enabled && this.enableZoom ) {\n\n\t\t\tthis.setCenter( ( this._touchCurrent[ 0 ].clientX + this._touchCurrent[ 1 ].clientX ) / 2, ( this._touchCurrent[ 0 ].clientY + this._touchCurrent[ 1 ].clientY ) / 2 );\n\t\t\tconst minDistance = 12; //minimum distance between fingers (in css pixels)\n\n\t\t\tif ( this._state != STATE.SCALE ) {\n\n\t\t\t\tthis._startFingerDistance = this._currentFingerDistance;\n\t\t\t\tthis.updateTbState( STATE.SCALE, true );\n\n\t\t\t}\n\n\t\t\tthis._currentFingerDistance = Math.max( this.calculatePointersDistance( this._touchCurrent[ 0 ], this._touchCurrent[ 1 ] ), minDistance * this._devPxRatio );\n\t\t\tconst amount = this._currentFingerDistance / this._startFingerDistance;\n\n\t\t\tlet scalePoint;\n\n\t\t\tif ( ! this.enablePan ) {\n\n\t\t\t\tscalePoint = this._gizmos.position;\n\n\t\t\t} else {\n\n\t\t\t\tif ( this.object.isOrthographicCamera ) {\n\n\t\t\t\t\tscalePoint = this.unprojectOnTbPlane( this.object, _center.x, _center.y, this.domElement )\n\t\t\t\t\t\t.applyQuaternion( this.object.quaternion )\n\t\t\t\t\t\t.multiplyScalar( 1 / this.object.zoom )\n\t\t\t\t\t\t.add( this._gizmos.position );\n\n\t\t\t\t} else if ( this.object.isPerspectiveCamera ) {\n\n\t\t\t\t\tscalePoint = this.unprojectOnTbPlane( this.object, _center.x, _center.y, this.domElement )\n\t\t\t\t\t\t.applyQuaternion( this.object.quaternion )\n\t\t\t\t\t\t.add( this._gizmos.position );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.applyTransformMatrix( this.scale( amount, scalePoint ) );\n\t\t\tthis.dispatchEvent( _changeEvent );\n\n\t\t}\n\n\t}\n\n\tonPinchEnd() {\n\n\t\tthis.updateTbState( STATE.IDLE, false );\n\t\tthis.dispatchEvent( _endEvent );\n\n\t}\n\n\tonTriplePanStart() {\n\n\t\tif ( this.enabled && this.enableZoom ) {\n\n\t\t\tthis.dispatchEvent( _startEvent );\n\n\t\t\tthis.updateTbState( STATE.SCALE, true );\n\n\t\t\t//const center = event.center;\n\t\t\tlet clientX = 0;\n\t\t\tlet clientY = 0;\n\t\t\tconst nFingers = this._touchCurrent.length;\n\n\t\t\tfor ( let i = 0; i < nFingers; i ++ ) {\n\n\t\t\t\tclientX += this._touchCurrent[ i ].clientX;\n\t\t\t\tclientY += this._touchCurrent[ i ].clientY;\n\n\t\t\t}\n\n\t\t\tthis.setCenter( clientX / nFingers, clientY / nFingers );\n\n\t\t\tthis._startCursorPosition.setY( this.getCursorNDC( _center.x, _center.y, this.domElement ).y * 0.5 );\n\t\t\tthis._currentCursorPosition.copy( this._startCursorPosition );\n\n\t\t}\n\n\t}\n\n\tonTriplePanMove() {\n\n\t\tif ( this.enabled && this.enableZoom ) {\n\n\t\t\t//\t  fov / 2\n\t\t\t//\t\t|\\\n\t\t\t//\t\t| \\\n\t\t\t//\t\t|  \\\n\t\t\t//\tx\t|\t\\\n\t\t\t//\t\t| \t \\\n\t\t\t//\t\t| \t  \\\n\t\t\t//\t\t| _ _ _\\\n\t\t\t//\t\t\ty\n\n\t\t\t//const center = event.center;\n\t\t\tlet clientX = 0;\n\t\t\tlet clientY = 0;\n\t\t\tconst nFingers = this._touchCurrent.length;\n\n\t\t\tfor ( let i = 0; i < nFingers; i ++ ) {\n\n\t\t\t\tclientX += this._touchCurrent[ i ].clientX;\n\t\t\t\tclientY += this._touchCurrent[ i ].clientY;\n\n\t\t\t}\n\n\t\t\tthis.setCenter( clientX / nFingers, clientY / nFingers );\n\n\t\t\tconst screenNotches = 8;\t//how many wheel notches corresponds to a full screen pan\n\t\t\tthis._currentCursorPosition.setY( this.getCursorNDC( _center.x, _center.y, this.domElement ).y * 0.5 );\n\n\t\t\tconst movement = this._currentCursorPosition.y - this._startCursorPosition.y;\n\n\t\t\tlet size = 1;\n\n\t\t\tif ( movement < 0 ) {\n\n\t\t\t\tsize = 1 / ( Math.pow( this.scaleFactor, - movement * screenNotches ) );\n\n\t\t\t} else if ( movement > 0 ) {\n\n\t\t\t\tsize = Math.pow( this.scaleFactor, movement * screenNotches );\n\n\t\t\t}\n\n\t\t\tthis._v3_1.setFromMatrixPosition( this._cameraMatrixState );\n\t\t\tconst x = this._v3_1.distanceTo( this._gizmos.position );\n\t\t\tlet xNew = x / size; //distance between camera and gizmos if scale(size, scalepoint) would be performed\n\n\t\t\t//check min and max distance\n\t\t\txNew = MathUtils.clamp( xNew, this.minDistance, this.maxDistance );\n\n\t\t\tconst y = x * Math.tan( MathUtils.DEG2RAD * this._fovState * 0.5 );\n\n\t\t\t//calculate new fov\n\t\t\tlet newFov = MathUtils.RAD2DEG * ( Math.atan( y / xNew ) * 2 );\n\n\t\t\t//check min and max fov\n\t\t\tnewFov = MathUtils.clamp( newFov, this.minFov, this.maxFov );\n\n\t\t\tconst newDistance = y / Math.tan( MathUtils.DEG2RAD * ( newFov / 2 ) );\n\t\t\tsize = x / newDistance;\n\t\t\tthis._v3_2.setFromMatrixPosition( this._gizmoMatrixState );\n\n\t\t\tthis.setFov( newFov );\n\t\t\tthis.applyTransformMatrix( this.scale( size, this._v3_2, false ) );\n\n\t\t\t//adjusting distance\n\t\t\t_offset.copy( this._gizmos.position ).sub( this.object.position ).normalize().multiplyScalar( newDistance / x );\n\t\t\tthis._m4_1.makeTranslation( _offset.x, _offset.y, _offset.z );\n\n\t\t\tthis.dispatchEvent( _changeEvent );\n\n\t\t}\n\n\t}\n\n\tonTriplePanEnd() {\n\n\t\tthis.updateTbState( STATE.IDLE, false );\n\t\tthis.dispatchEvent( _endEvent );\n\t\t//this.dispatchEvent( _changeEvent );\n\n\t}\n\n\t/**\n\t * Set _center's x/y coordinates.\n\t *\n\t * @private\n\t * @param {number} clientX - The x coordinate.\n\t * @param {number} clientY - The y coordinate.\n\t */\n\tsetCenter( clientX, clientY ) {\n\n\t\t_center.x = clientX;\n\t\t_center.y = clientY;\n\n\t}\n\n\t/**\n\t * Set default mouse actions.\n\t *\n\t * @private\n\t */\n\tinitializeMouseActions() {\n\n\t\tthis.setMouseAction( 'PAN', 0, 'CTRL' );\n\t\tthis.setMouseAction( 'PAN', 2 );\n\n\t\tthis.setMouseAction( 'ROTATE', 0 );\n\n\t\tthis.setMouseAction( 'ZOOM', 'WHEEL' );\n\t\tthis.setMouseAction( 'ZOOM', 1 );\n\n\t\tthis.setMouseAction( 'FOV', 'WHEEL', 'SHIFT' );\n\t\tthis.setMouseAction( 'FOV', 1, 'SHIFT' );\n\n\n\t}\n\n\t/**\n\t * Compare two mouse actions.\n\t *\n\t * @private\n\t * @param {Object} action1 - The first mouse action.\n\t * @param {Object} action2 - The second mouse action.\n\t * @returns {boolean} `true` if action1 and action 2 are the same mouse action, `false` otherwise.\n\t */\n\tcompareMouseAction( action1, action2 ) {\n\n\t\tif ( action1.operation == action2.operation ) {\n\n\t\t\tif ( action1.mouse == action2.mouse && action1.key == action2.key ) {\n\n\t\t\t\treturn true;\n\n\t\t\t} else {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Set a new mouse action by specifying the operation to be performed and a mouse/key combination. In case of conflict, replaces the existing one.\n\t *\n\t * @param {'PAN'|'ROTATE'|'ZOOM'|'FOV'} operation - The operation to be performed ('PAN', 'ROTATE', 'ZOOM', 'FOV').\n\t * @param {0|1|2|'WHEEL'} mouse - A mouse button (0, 1, 2) or 'WHEEL' for wheel notches.\n\t * @param {?('CTRL'|'SHIFT')} [key=null] - The keyboard modifier ('CTRL', 'SHIFT') or null if key is not needed.\n\t * @returns {boolean} `true` if the mouse action has been successfully added, `false` otherwise.\n\t */\n\tsetMouseAction( operation, mouse, key = null ) {\n\n\t\tconst operationInput = [ 'PAN', 'ROTATE', 'ZOOM', 'FOV' ];\n\t\tconst mouseInput = [ 0, 1, 2, 'WHEEL' ];\n\t\tconst keyInput = [ 'CTRL', 'SHIFT', null ];\n\t\tlet state;\n\n\t\tif ( ! operationInput.includes( operation ) || ! mouseInput.includes( mouse ) || ! keyInput.includes( key ) ) {\n\n\t\t\t//invalid parameters\n\t\t\treturn false;\n\n\t\t}\n\n\t\tif ( mouse == 'WHEEL' ) {\n\n\t\t\tif ( operation != 'ZOOM' && operation != 'FOV' ) {\n\n\t\t\t\t//cannot associate 2D operation to 1D input\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tswitch ( operation ) {\n\n\t\t\tcase 'PAN':\n\n\t\t\t\tstate = STATE.PAN;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ROTATE':\n\n\t\t\t\tstate = STATE.ROTATE;\n\t\t\t\tbreak;\n\n\t\t\tcase 'ZOOM':\n\n\t\t\t\tstate = STATE.SCALE;\n\t\t\t\tbreak;\n\n\t\t\tcase 'FOV':\n\n\t\t\t\tstate = STATE.FOV;\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tconst action = {\n\n\t\t\toperation: operation,\n\t\t\tmouse: mouse,\n\t\t\tkey: key,\n\t\t\tstate: state\n\n\t\t};\n\n\t\tfor ( let i = 0; i < this.mouseActions.length; i ++ ) {\n\n\t\t\tif ( this.mouseActions[ i ].mouse == action.mouse && this.mouseActions[ i ].key == action.key ) {\n\n\t\t\t\tthis.mouseActions.splice( i, 1, action );\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.mouseActions.push( action );\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Remove a mouse action by specifying its mouse/key combination.\n\t *\n\t * @param {0|1|2|'WHEEL'} mouse - A mouse button (0, 1, 2) or 'WHEEL' for wheel notches.\n\t * @param {?('CTRL'|'SHIFT')} key - The keyboard modifier ('CTRL', 'SHIFT') or null if key is not needed.\n\t * @returns {boolean} `true` if the operation has been successfully removed, `false` otherwise.\n\t */\n\tunsetMouseAction( mouse, key = null ) {\n\n\t\tfor ( let i = 0; i < this.mouseActions.length; i ++ ) {\n\n\t\t\tif ( this.mouseActions[ i ].mouse == mouse && this.mouseActions[ i ].key == key ) {\n\n\t\t\t\tthis.mouseActions.splice( i, 1 );\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Return the operation associated to a mouse/keyboard combination.\n\t *\n\t * @private\n\t * @param {0|1|2|'WHEEL'} mouse - Mouse button index (0, 1, 2) or 'WHEEL' for wheel notches.\n\t * @param {?('CTRL'|'SHIFT')} key - Keyboard modifier.\n\t * @returns {?('PAN'|'ROTATE'|'ZOOM'|'FOV')} The operation if it has been found, `null` otherwise.\n\t */\n\tgetOpFromAction( mouse, key ) {\n\n\t\tlet action;\n\n\t\tfor ( let i = 0; i < this.mouseActions.length; i ++ ) {\n\n\t\t\taction = this.mouseActions[ i ];\n\t\t\tif ( action.mouse == mouse && action.key == key ) {\n\n\t\t\t\treturn action.operation;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( key != null ) {\n\n\t\t\tfor ( let i = 0; i < this.mouseActions.length; i ++ ) {\n\n\t\t\t\taction = this.mouseActions[ i ];\n\t\t\t\tif ( action.mouse == mouse && action.key == null ) {\n\n\t\t\t\t\treturn action.operation;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Get the operation associated to mouse and key combination and returns the corresponding FSA state.\n\t *\n\t * @private\n\t * @param {0|1|2} mouse - Mouse button index (0, 1, 2)\n\t * @param {?('CTRL'|'SHIFT')} key - Keyboard modifier\n\t * @returns {?STATE} The FSA state obtained from the operation associated to mouse/keyboard combination.\n\t */\n\tgetOpStateFromAction( mouse, key ) {\n\n\t\tlet action;\n\n\t\tfor ( let i = 0; i < this.mouseActions.length; i ++ ) {\n\n\t\t\taction = this.mouseActions[ i ];\n\t\t\tif ( action.mouse == mouse && action.key == key ) {\n\n\t\t\t\treturn action.state;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( key != null ) {\n\n\t\t\tfor ( let i = 0; i < this.mouseActions.length; i ++ ) {\n\n\t\t\t\taction = this.mouseActions[ i ];\n\t\t\t\tif ( action.mouse == mouse && action.key == null ) {\n\n\t\t\t\t\treturn action.state;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Calculate the angle between two pointers.\n\t *\n\t * @private\n\t * @param {PointerEvent} p1 - The first pointer event.\n\t * @param {PointerEvent} p2 - The second pointer event.\n\t * @returns {number} The angle between two pointers in degrees.\n\t */\n\tgetAngle( p1, p2 ) {\n\n\t\treturn Math.atan2( p2.clientY - p1.clientY, p2.clientX - p1.clientX ) * 180 / Math.PI;\n\n\t}\n\n\t/**\n\t * Updates a PointerEvent inside current pointerevents array.\n\t *\n\t * @private\n\t * @param {PointerEvent} event - The pointer event.\n\t */\n\tupdateTouchEvent( event ) {\n\n\t\tfor ( let i = 0; i < this._touchCurrent.length; i ++ ) {\n\n\t\t\tif ( this._touchCurrent[ i ].pointerId == event.pointerId ) {\n\n\t\t\t\tthis._touchCurrent.splice( i, 1, event );\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Applies a transformation matrix, to the camera and gizmos.\n\t *\n\t * @private\n\t * @param {Object} transformation - Object containing matrices to apply to camera and gizmos.\n\t */\n\tapplyTransformMatrix( transformation ) {\n\n\t\tif ( transformation.camera != null ) {\n\n\t\t\tthis._m4_1.copy( this._cameraMatrixState ).premultiply( transformation.camera );\n\t\t\tthis._m4_1.decompose( this.object.position, this.object.quaternion, this.object.scale );\n\t\t\tthis.object.updateMatrix();\n\n\t\t\t//update camera up vector\n\t\t\tif ( this._state == STATE.ROTATE || this._state == STATE.ZROTATE || this._state == STATE.ANIMATION_ROTATE ) {\n\n\t\t\t\tthis.object.up.copy( this._upState ).applyQuaternion( this.object.quaternion );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( transformation.gizmos != null ) {\n\n\t\t\tthis._m4_1.copy( this._gizmoMatrixState ).premultiply( transformation.gizmos );\n\t\t\tthis._m4_1.decompose( this._gizmos.position, this._gizmos.quaternion, this._gizmos.scale );\n\t\t\tthis._gizmos.updateMatrix();\n\n\t\t}\n\n\t\tif ( this._state == STATE.SCALE || this._state == STATE.FOCUS || this._state == STATE.ANIMATION_FOCUS ) {\n\n\t\t\tthis._tbRadius = this.calculateTbRadius( this.object );\n\n\t\t\tif ( this.adjustNearFar ) {\n\n\t\t\t\tconst cameraDistance = this.object.position.distanceTo( this._gizmos.position );\n\n\t\t\t\tconst bb = new Box3();\n\t\t\t\tbb.setFromObject( this._gizmos );\n\t\t\t\tconst sphere = new Sphere();\n\t\t\t\tbb.getBoundingSphere( sphere );\n\n\t\t\t\tconst adjustedNearPosition = Math.max( this._nearPos0, sphere.radius + sphere.center.length() );\n\t\t\t\tconst regularNearPosition = cameraDistance - this._initialNear;\n\n\t\t\t\tconst minNearPos = Math.min( adjustedNearPosition, regularNearPosition );\n\t\t\t\tthis.object.near = cameraDistance - minNearPos;\n\n\n\t\t\t\tconst adjustedFarPosition = Math.min( this._farPos0, - sphere.radius + sphere.center.length() );\n\t\t\t\tconst regularFarPosition = cameraDistance - this._initialFar;\n\n\t\t\t\tconst minFarPos = Math.min( adjustedFarPosition, regularFarPosition );\n\t\t\t\tthis.object.far = cameraDistance - minFarPos;\n\n\t\t\t\tthis.object.updateProjectionMatrix();\n\n\t\t\t} else {\n\n\t\t\t\tlet update = false;\n\n\t\t\t\tif ( this.object.near != this._initialNear ) {\n\n\t\t\t\t\tthis.object.near = this._initialNear;\n\t\t\t\t\tupdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tif ( this.object.far != this._initialFar ) {\n\n\t\t\t\t\tthis.object.far = this._initialFar;\n\t\t\t\t\tupdate = true;\n\n\t\t\t\t}\n\n\t\t\t\tif ( update ) {\n\n\t\t\t\t\tthis.object.updateProjectionMatrix();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Calculates the angular speed.\n\t *\n\t * @private\n\t * @param {number} p0 - Position at t0.\n\t * @param {number} p1 - Position at t1.\n\t * @param {number} t0 - Initial time in milliseconds.\n\t * @param {number} t1 - Ending time in milliseconds.\n\t * @returns {number} The angular speed.\n\t */\n\tcalculateAngularSpeed( p0, p1, t0, t1 ) {\n\n\t\tconst s = p1 - p0;\n\t\tconst t = ( t1 - t0 ) / 1000;\n\t\tif ( t == 0 ) {\n\n\t\t\treturn 0;\n\n\t\t}\n\n\t\treturn s / t;\n\n\t}\n\n\t/**\n\t * Calculates the distance between two pointers.\n\t *\n\t * @private\n\t * @param {PointerEvent} p0 - The first pointer.\n\t * @param {PointerEvent} p1 - The second pointer.\n\t * @returns {number} The distance between the two pointers.\n\t */\n\tcalculatePointersDistance( p0, p1 ) {\n\n\t\treturn Math.sqrt( Math.pow( p1.clientX - p0.clientX, 2 ) + Math.pow( p1.clientY - p0.clientY, 2 ) );\n\n\t}\n\n\t/**\n\t * Calculates the rotation axis as the vector perpendicular between two vectors.\n\t *\n\t * @private\n\t * @param {Vector3} vec1 - The first vector.\n\t * @param {Vector3} vec2 - The second vector.\n\t * @returns {Vector3} The normalized rotation axis.\n\t */\n\tcalculateRotationAxis( vec1, vec2 ) {\n\n\t\tthis._rotationMatrix.extractRotation( this._cameraMatrixState );\n\t\tthis._quat.setFromRotationMatrix( this._rotationMatrix );\n\n\t\tthis._rotationAxis.crossVectors( vec1, vec2 ).applyQuaternion( this._quat );\n\t\treturn this._rotationAxis.normalize().clone();\n\n\t}\n\n\t/**\n\t * Calculates the trackball radius so that gizmo's diameter will be 2/3 of the minimum side of the camera frustum.\n\t *\n\t * @private\n\t * @param {Camera} camera - The camera.\n\t * @returns {number} The trackball radius.\n\t */\n\tcalculateTbRadius( camera ) {\n\n\t\tconst distance = camera.position.distanceTo( this._gizmos.position );\n\n\t\tif ( camera.type == 'PerspectiveCamera' ) {\n\n\t\t\tconst halfFovV = MathUtils.DEG2RAD * camera.fov * 0.5; //vertical fov/2 in radians\n\t\t\tconst halfFovH = Math.atan( ( camera.aspect ) * Math.tan( halfFovV ) ); //horizontal fov/2 in radians\n\t\t\treturn Math.tan( Math.min( halfFovV, halfFovH ) ) * distance * this.radiusFactor;\n\n\t\t} else if ( camera.type == 'OrthographicCamera' ) {\n\n\t\t\treturn Math.min( camera.top, camera.right ) * this.radiusFactor;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Focus operation consist of positioning the point of interest in front of the camera and a slightly zoom in.\n\t *\n\t * @private\n\t * @param {Vector3} point - The point of interest.\n\t * @param {number} size - Scale factor.\n\t * @param {number} [amount=1] - Amount of operation to be completed (used for focus animations, default is complete full operation).\n\t */\n\tfocus( point, size, amount = 1 ) {\n\n\t\t//move center of camera (along with gizmos) towards point of interest\n\t\t_offset.copy( point ).sub( this._gizmos.position ).multiplyScalar( amount );\n\t\tthis._translationMatrix.makeTranslation( _offset.x, _offset.y, _offset.z );\n\n\t\t_gizmoMatrixStateTemp.copy( this._gizmoMatrixState );\n\t\tthis._gizmoMatrixState.premultiply( this._translationMatrix );\n\t\tthis._gizmoMatrixState.decompose( this._gizmos.position, this._gizmos.quaternion, this._gizmos.scale );\n\n\t\t_cameraMatrixStateTemp.copy( this._cameraMatrixState );\n\t\tthis._cameraMatrixState.premultiply( this._translationMatrix );\n\t\tthis._cameraMatrixState.decompose( this.object.position, this.object.quaternion, this.object.scale );\n\n\t\t//apply zoom\n\t\tif ( this.enableZoom ) {\n\n\t\t\tthis.applyTransformMatrix( this.scale( size, this._gizmos.position ) );\n\n\t\t}\n\n\t\tthis._gizmoMatrixState.copy( _gizmoMatrixStateTemp );\n\t\tthis._cameraMatrixState.copy( _cameraMatrixStateTemp );\n\n\t}\n\n\t/**\n\t * Creates a grid if necessary and adds it to the scene.\n\t *\n\t * @private\n\t */\n\tdrawGrid() {\n\n\t\tif ( this.scene != null ) {\n\n\t\t\tconst color = 0x888888;\n\t\t\tconst multiplier = 3;\n\t\t\tlet size, divisions, maxLength, tick;\n\n\t\t\tif ( this.object.isOrthographicCamera ) {\n\n\t\t\t\tconst width = this.object.right - this.object.left;\n\t\t\t\tconst height = this.object.bottom - this.object.top;\n\n\t\t\t\tmaxLength = Math.max( width, height );\n\t\t\t\ttick = maxLength / 20;\n\n\t\t\t\tsize = maxLength / this.object.zoom * multiplier;\n\t\t\t\tdivisions = size / tick * this.object.zoom;\n\n\t\t\t} else if ( this.object.isPerspectiveCamera ) {\n\n\t\t\t\tconst distance = this.object.position.distanceTo( this._gizmos.position );\n\t\t\t\tconst halfFovV = MathUtils.DEG2RAD * this.object.fov * 0.5;\n\t\t\t\tconst halfFovH = Math.atan( ( this.object.aspect ) * Math.tan( halfFovV ) );\n\n\t\t\t\tmaxLength = Math.tan( Math.max( halfFovV, halfFovH ) ) * distance * 2;\n\t\t\t\ttick = maxLength / 20;\n\n\t\t\t\tsize = maxLength * multiplier;\n\t\t\t\tdivisions = size / tick;\n\n\t\t\t}\n\n\t\t\tif ( this._grid == null ) {\n\n\t\t\t\tthis._grid = new GridHelper( size, divisions, color, color );\n\t\t\t\tthis._grid.position.copy( this._gizmos.position );\n\t\t\t\tthis._gridPosition.copy( this._grid.position );\n\t\t\t\tthis._grid.quaternion.copy( this.object.quaternion );\n\t\t\t\tthis._grid.rotateX( Math.PI * 0.5 );\n\n\t\t\t\tthis.scene.add( this._grid );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tdispose() {\n\n\t\tif ( this._animationId != - 1 ) {\n\n\t\t\twindow.cancelAnimationFrame( this._animationId );\n\n\t\t}\n\n\t\tthis.disconnect();\n\n\t\tif ( this.scene !== null ) this.scene.remove( this._gizmos );\n\t\tthis.disposeGrid();\n\n\t}\n\n\t/**\n\t * Removes the grid from the scene.\n\t */\n\tdisposeGrid() {\n\n\t\tif ( this._grid != null && this.scene != null ) {\n\n\t\t\tthis.scene.remove( this._grid );\n\t\t\tthis._grid = null;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the easing out cubic function for ease out effect in animation.\n\t *\n\t * @private\n\t * @param {number} t - The absolute progress of the animation in the bound of `0` (beginning of the) and `1` (ending of animation).\n\t * @returns {number} Result of easing out cubic at time `t`.\n\t */\n\teaseOutCubic( t ) {\n\n\t\treturn 1 - Math.pow( 1 - t, 3 );\n\n\t}\n\n\t/**\n\t * Makes rotation gizmos more or less visible.\n\t *\n\t * @param {boolean} isActive - If set to `true`, gizmos are more visible.\n\t */\n\tactivateGizmos( isActive ) {\n\n\t\tconst gizmoX = this._gizmos.children[ 0 ];\n\t\tconst gizmoY = this._gizmos.children[ 1 ];\n\t\tconst gizmoZ = this._gizmos.children[ 2 ];\n\n\t\tif ( isActive ) {\n\n\t\t\tgizmoX.material.setValues( { opacity: 1 } );\n\t\t\tgizmoY.material.setValues( { opacity: 1 } );\n\t\t\tgizmoZ.material.setValues( { opacity: 1 } );\n\n\t\t} else {\n\n\t\t\tgizmoX.material.setValues( { opacity: 0.6 } );\n\t\t\tgizmoY.material.setValues( { opacity: 0.6 } );\n\t\t\tgizmoZ.material.setValues( { opacity: 0.6 } );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Calculates the cursor position in NDC.\n\t *\n\t * @private\n\t * @param {number} cursorX - Cursor horizontal coordinate within the canvas.\n\t * @param {number} cursorY - Cursor vertical coordinate within the canvas.\n\t * @param {HTMLElement} canvas - The canvas where the renderer draws its output.\n\t * @returns {Vector2} Cursor normalized position inside the canvas.\n\t */\n\tgetCursorNDC( cursorX, cursorY, canvas ) {\n\n\t\tconst canvasRect = canvas.getBoundingClientRect();\n\t\tthis._v2_1.setX( ( ( cursorX - canvasRect.left ) / canvasRect.width ) * 2 - 1 );\n\t\tthis._v2_1.setY( ( ( canvasRect.bottom - cursorY ) / canvasRect.height ) * 2 - 1 );\n\t\treturn this._v2_1.clone();\n\n\t}\n\n\t/**\n\t * Calculates the cursor position inside the canvas x/y coordinates with the origin being in the center of the canvas.\n\t *\n\t * @private\n\t * @param {number} cursorX - Cursor horizontal coordinate within the canvas.\n\t * @param {number} cursorY - Cursor vertical coordinate within the canvas.\n\t * @param {HTMLElement} canvas - The canvas where the renderer draws its output.\n\t * @returns {Vector2} Cursor position inside the canvas.\n\t */\n\tgetCursorPosition( cursorX, cursorY, canvas ) {\n\n\t\tthis._v2_1.copy( this.getCursorNDC( cursorX, cursorY, canvas ) );\n\t\tthis._v2_1.x *= ( this.object.right - this.object.left ) * 0.5;\n\t\tthis._v2_1.y *= ( this.object.top - this.object.bottom ) * 0.5;\n\t\treturn this._v2_1.clone();\n\n\t}\n\n\t/**\n\t * Sets the camera to be controlled.  Must be called in order to set a new camera to be controlled.\n\t *\n\t * @param {Camera} camera - The camera to be controlled.\n\t */\n\tsetCamera( camera ) {\n\n\t\tcamera.lookAt( this.target );\n\t\tcamera.updateMatrix();\n\n\t\t//setting state\n\t\tif ( camera.type == 'PerspectiveCamera' ) {\n\n\t\t\tthis._fov0 = camera.fov;\n\t\t\tthis._fovState = camera.fov;\n\n\t\t}\n\n\t\tthis._cameraMatrixState0.copy( camera.matrix );\n\t\tthis._cameraMatrixState.copy( this._cameraMatrixState0 );\n\t\tthis._cameraProjectionState.copy( camera.projectionMatrix );\n\t\tthis._zoom0 = camera.zoom;\n\t\tthis._zoomState = this._zoom0;\n\n\t\tthis._initialNear = camera.near;\n\t\tthis._nearPos0 = camera.position.distanceTo( this.target ) - camera.near;\n\t\tthis._nearPos = this._initialNear;\n\n\t\tthis._initialFar = camera.far;\n\t\tthis._farPos0 = camera.position.distanceTo( this.target ) - camera.far;\n\t\tthis._farPos = this._initialFar;\n\n\t\tthis._up0.copy( camera.up );\n\t\tthis._upState.copy( camera.up );\n\n\t\tthis.object = camera;\n\t\tthis.object.updateProjectionMatrix();\n\n\t\t//making gizmos\n\t\tthis._tbRadius = this.calculateTbRadius( camera );\n\t\tthis.makeGizmos( this.target, this._tbRadius );\n\n\t}\n\n\t/**\n\t * Sets gizmos visibility.\n\t *\n\t * @param {boolean} value - Value of gizmos visibility.\n\t */\n\tsetGizmosVisible( value ) {\n\n\t\tthis._gizmos.visible = value;\n\t\tthis.dispatchEvent( _changeEvent );\n\n\t}\n\n\t/**\n\t * Sets gizmos radius factor and redraws gizmos.\n\t *\n\t * @param {number} value - Value of radius factor.\n\t */\n\tsetTbRadius( value ) {\n\n\t\tthis.radiusFactor = value;\n\t\tthis._tbRadius = this.calculateTbRadius( this.object );\n\n\t\tconst curve = new EllipseCurve( 0, 0, this._tbRadius, this._tbRadius );\n\t\tconst points = curve.getPoints( this._curvePts );\n\t\tconst curveGeometry = new BufferGeometry().setFromPoints( points );\n\n\n\t\tfor ( const gizmo in this._gizmos.children ) {\n\n\t\t\tthis._gizmos.children[ gizmo ].geometry = curveGeometry;\n\n\t\t}\n\n\t\tthis.dispatchEvent( _changeEvent );\n\n\t}\n\n\t/**\n\t * Creates the rotation gizmos matching trackball center and radius.\n\t *\n\t * @private\n\t * @param {Vector3} tbCenter - The trackball center.\n\t * @param {number} tbRadius - The trackball radius.\n\t */\n\tmakeGizmos( tbCenter, tbRadius ) {\n\n\t\tconst curve = new EllipseCurve( 0, 0, tbRadius, tbRadius );\n\t\tconst points = curve.getPoints( this._curvePts );\n\n\t\t//geometry\n\t\tconst curveGeometry = new BufferGeometry().setFromPoints( points );\n\n\t\t//material\n\t\tconst curveMaterialX = new LineBasicMaterial( { color: 0xff8080, fog: false, transparent: true, opacity: 0.6 } );\n\t\tconst curveMaterialY = new LineBasicMaterial( { color: 0x80ff80, fog: false, transparent: true, opacity: 0.6 } );\n\t\tconst curveMaterialZ = new LineBasicMaterial( { color: 0x8080ff, fog: false, transparent: true, opacity: 0.6 } );\n\n\t\t//line\n\t\tconst gizmoX = new Line( curveGeometry, curveMaterialX );\n\t\tconst gizmoY = new Line( curveGeometry, curveMaterialY );\n\t\tconst gizmoZ = new Line( curveGeometry, curveMaterialZ );\n\n\t\tconst rotation = Math.PI * 0.5;\n\t\tgizmoX.rotation.x = rotation;\n\t\tgizmoY.rotation.y = rotation;\n\n\n\t\t//setting state\n\t\tthis._gizmoMatrixState0.identity().setPosition( tbCenter );\n\t\tthis._gizmoMatrixState.copy( this._gizmoMatrixState0 );\n\n\t\tif ( this.object.zoom !== 1 ) {\n\n\t\t\t//adapt gizmos size to camera zoom\n\t\t\tconst size = 1 / this.object.zoom;\n\t\t\tthis._scaleMatrix.makeScale( size, size, size );\n\t\t\tthis._translationMatrix.makeTranslation( - tbCenter.x, - tbCenter.y, - tbCenter.z );\n\n\t\t\tthis._gizmoMatrixState.premultiply( this._translationMatrix ).premultiply( this._scaleMatrix );\n\t\t\tthis._translationMatrix.makeTranslation( tbCenter.x, tbCenter.y, tbCenter.z );\n\t\t\tthis._gizmoMatrixState.premultiply( this._translationMatrix );\n\n\t\t}\n\n\t\tthis._gizmoMatrixState.decompose( this._gizmos.position, this._gizmos.quaternion, this._gizmos.scale );\n\n\t\t//\n\n\t\tthis._gizmos.traverse( function ( object ) {\n\n\t\t\tif ( object.isLine ) {\n\n\t\t\t\tobject.geometry.dispose();\n\t\t\t\tobject.material.dispose();\n\n\t\t\t}\n\n\t\t} );\n\n\t\tthis._gizmos.clear();\n\n\t\t//\n\n\t\tthis._gizmos.add( gizmoX );\n\t\tthis._gizmos.add( gizmoY );\n\t\tthis._gizmos.add( gizmoZ );\n\n\t}\n\n\t/**\n\t * Performs animation for focus operation.\n\t *\n\t * @private\n\t * @param {number} time - Instant in which this function is called as performance.now().\n\t * @param {Vector3} point - Point of interest for focus operation.\n\t * @param {Matrix4} cameraMatrix - Camera matrix.\n\t * @param {Matrix4} gizmoMatrix - Gizmos matrix.\n\t */\n\tonFocusAnim( time, point, cameraMatrix, gizmoMatrix ) {\n\n\t\tif ( this._timeStart == - 1 ) {\n\n\t\t\t//animation start\n\t\t\tthis._timeStart = time;\n\n\t\t}\n\n\t\tif ( this._state == STATE.ANIMATION_FOCUS ) {\n\n\t\t\tconst deltaTime = time - this._timeStart;\n\t\t\tconst animTime = deltaTime / this.focusAnimationTime;\n\n\t\t\tthis._gizmoMatrixState.copy( gizmoMatrix );\n\n\t\t\tif ( animTime >= 1 ) {\n\n\t\t\t\t//animation end\n\n\t\t\t\tthis._gizmoMatrixState.decompose( this._gizmos.position, this._gizmos.quaternion, this._gizmos.scale );\n\n\t\t\t\tthis.focus( point, this.scaleFactor );\n\n\t\t\t\tthis._timeStart = - 1;\n\t\t\t\tthis.updateTbState( STATE.IDLE, false );\n\t\t\t\tthis.activateGizmos( false );\n\n\t\t\t\tthis.dispatchEvent( _changeEvent );\n\n\t\t\t} else {\n\n\t\t\t\tconst amount = this.easeOutCubic( animTime );\n\t\t\t\tconst size = ( ( 1 - amount ) + ( this.scaleFactor * amount ) );\n\n\t\t\t\tthis._gizmoMatrixState.decompose( this._gizmos.position, this._gizmos.quaternion, this._gizmos.scale );\n\t\t\t\tthis.focus( point, size, amount );\n\n\t\t\t\tthis.dispatchEvent( _changeEvent );\n\t\t\t\tconst self = this;\n\t\t\t\tthis._animationId = window.requestAnimationFrame( function ( t ) {\n\n\t\t\t\t\tself.onFocusAnim( t, point, cameraMatrix, gizmoMatrix.clone() );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t//interrupt animation\n\n\t\t\tthis._animationId = - 1;\n\t\t\tthis._timeStart = - 1;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Performs animation for rotation operation.\n\t *\n\t * @private\n\t * @param {number} time - Instant in which this function is called as performance.now().\n\t * @param {Vector3} rotationAxis - Rotation axis.\n\t * @param {number} w0 - Initial angular velocity.\n\t */\n\tonRotationAnim( time, rotationAxis, w0 ) {\n\n\t\tif ( this._timeStart == - 1 ) {\n\n\t\t\t//animation start\n\t\t\tthis._anglePrev = 0;\n\t\t\tthis._angleCurrent = 0;\n\t\t\tthis._timeStart = time;\n\n\t\t}\n\n\t\tif ( this._state == STATE.ANIMATION_ROTATE ) {\n\n\t\t\t//w = w0 + alpha * t\n\t\t\tconst deltaTime = ( time - this._timeStart ) / 1000;\n\t\t\tconst w = w0 + ( ( - this.dampingFactor ) * deltaTime );\n\n\t\t\tif ( w > 0 ) {\n\n\t\t\t\t//tetha = 0.5 * alpha * t^2 + w0 * t + tetha0\n\t\t\t\tthis._angleCurrent = 0.5 * ( - this.dampingFactor ) * Math.pow( deltaTime, 2 ) + w0 * deltaTime + 0;\n\t\t\t\tthis.applyTransformMatrix( this.rotate( rotationAxis, this._angleCurrent ) );\n\t\t\t\tthis.dispatchEvent( _changeEvent );\n\t\t\t\tconst self = this;\n\t\t\t\tthis._animationId = window.requestAnimationFrame( function ( t ) {\n\n\t\t\t\t\tself.onRotationAnim( t, rotationAxis, w0 );\n\n\t\t\t\t} );\n\n\t\t\t} else {\n\n\t\t\t\tthis._animationId = - 1;\n\t\t\t\tthis._timeStart = - 1;\n\n\t\t\t\tthis.updateTbState( STATE.IDLE, false );\n\t\t\t\tthis.activateGizmos( false );\n\n\t\t\t\tthis.dispatchEvent( _changeEvent );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t//interrupt animation\n\n\t\t\tthis._animationId = - 1;\n\t\t\tthis._timeStart = - 1;\n\n\t\t\tif ( this._state != STATE.ROTATE ) {\n\n\t\t\t\tthis.activateGizmos( false );\n\t\t\t\tthis.dispatchEvent( _changeEvent );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\n\t/**\n\t * Performs pan operation moving camera between two points.\n\t *\n\t * @private\n\t * @param {Vector3} p0 - Initial point.\n\t * @param {Vector3} p1 - Ending point.\n\t * @param {boolean} [adjust=false] - If movement should be adjusted considering camera distance (Perspective only).\n\t * @returns {Object}\n\t */\n\tpan( p0, p1, adjust = false ) {\n\n\t\tconst movement = p0.clone().sub( p1 );\n\n\t\tif ( this.object.isOrthographicCamera ) {\n\n\t\t\t//adjust movement amount\n\t\t\tmovement.multiplyScalar( 1 / this.object.zoom );\n\n\t\t} else if ( this.object.isPerspectiveCamera && adjust ) {\n\n\t\t\t//adjust movement amount\n\t\t\tthis._v3_1.setFromMatrixPosition( this._cameraMatrixState0 );\t//camera's initial position\n\t\t\tthis._v3_2.setFromMatrixPosition( this._gizmoMatrixState0 );\t//gizmo's initial position\n\t\t\tconst distanceFactor = this._v3_1.distanceTo( this._v3_2 ) / this.object.position.distanceTo( this._gizmos.position );\n\t\t\tmovement.multiplyScalar( 1 / distanceFactor );\n\n\t\t}\n\n\t\tthis._v3_1.set( movement.x, movement.y, 0 ).applyQuaternion( this.object.quaternion );\n\n\t\tthis._m4_1.makeTranslation( this._v3_1.x, this._v3_1.y, this._v3_1.z );\n\n\t\tthis.setTransformationMatrices( this._m4_1, this._m4_1 );\n\t\treturn _transformation;\n\n\t}\n\n\t/**\n\t * Resets the controls.\n\t */\n\treset() {\n\n\t\tthis.target.copy( this._target0 );\n\t\tthis.object.zoom = this._zoom0;\n\n\t\tif ( this.object.isPerspectiveCamera ) {\n\n\t\t\tthis.object.fov = this._fov0;\n\n\t\t}\n\n\t\tthis.object.near = this._nearPos;\n\t\tthis.object.far = this._farPos;\n\t\tthis._cameraMatrixState.copy( this._cameraMatrixState0 );\n\t\tthis._cameraMatrixState.decompose( this.object.position, this.object.quaternion, this.object.scale );\n\t\tthis.object.up.copy( this._up0 );\n\n\t\tthis.object.updateMatrix();\n\t\tthis.object.updateProjectionMatrix();\n\n\t\tthis._gizmoMatrixState.copy( this._gizmoMatrixState0 );\n\t\tthis._gizmoMatrixState0.decompose( this._gizmos.position, this._gizmos.quaternion, this._gizmos.scale );\n\t\tthis._gizmos.updateMatrix();\n\n\t\tthis._tbRadius = this.calculateTbRadius( this.object );\n\t\tthis.makeGizmos( this._gizmos.position, this._tbRadius );\n\n\t\tthis.object.lookAt( this._gizmos.position );\n\n\t\tthis.updateTbState( STATE.IDLE, false );\n\n\t\tthis.dispatchEvent( _changeEvent );\n\n\t}\n\n\t/**\n\t * Rotates the camera around an axis passing by trackball's center.\n\t *\n\t * @private\n\t * @param {Vector3} axis - Rotation axis.\n\t * @param {number} angle - Angle in radians.\n\t * @returns {Object} Object with 'camera' field containing transformation matrix resulting from the operation to be applied to the camera.\n\t */\n\trotate( axis, angle ) {\n\n\t\tconst point = this._gizmos.position; //rotation center\n\t\tthis._translationMatrix.makeTranslation( - point.x, - point.y, - point.z );\n\t\tthis._rotationMatrix.makeRotationAxis( axis, - angle );\n\n\t\t//rotate camera\n\t\tthis._m4_1.makeTranslation( point.x, point.y, point.z );\n\t\tthis._m4_1.multiply( this._rotationMatrix );\n\t\tthis._m4_1.multiply( this._translationMatrix );\n\n\t\tthis.setTransformationMatrices( this._m4_1 );\n\n\t\treturn _transformation;\n\n\t}\n\n\t/**\n\t * Copy the current state to clipboard (as a readable JSON text).\n\t */\n\tcopyState() {\n\n\t\tlet state;\n\t\tif ( this.object.isOrthographicCamera ) {\n\n\t\t\tstate = JSON.stringify( {\n\t\t\t\tarcballState: {\n\t\t\t\t\tcameraFar: this.object.far,\n\t\t\t\t\tcameraMatrix: this.object.matrix,\n\t\t\t\t\tcameraNear: this.object.near,\n\t\t\t\t\tcameraUp: this.object.up,\n\t\t\t\t\tcameraZoom: this.object.zoom,\n\t\t\t\t\tgizmoMatrix: this._gizmos.matrix,\n\t\t\t\t\ttarget: this.target\n\n\t\t\t\t}\n\t\t\t} );\n\n\t\t} else if ( this.object.isPerspectiveCamera ) {\n\n\t\t\tstate = JSON.stringify( {\n\t\t\t\tarcballState: {\n\t\t\t\t\tcameraFar: this.object.far,\n\t\t\t\t\tcameraFov: this.object.fov,\n\t\t\t\t\tcameraMatrix: this.object.matrix,\n\t\t\t\t\tcameraNear: this.object.near,\n\t\t\t\t\tcameraUp: this.object.up,\n\t\t\t\t\tcameraZoom: this.object.zoom,\n\t\t\t\t\tgizmoMatrix: this._gizmos.matrix,\n\t\t\t\t\ttarget: this.target\n\n\t\t\t\t}\n\t\t\t} );\n\n\t\t}\n\n\t\tnavigator.clipboard.writeText( state );\n\n\t}\n\n\t/**\n\t * Set the controls state from the clipboard, assumes that the clipboard stores a JSON\n\t * text as saved from `copyState()`.\n\t */\n\tpasteState() {\n\n\t\tconst self = this;\n\t\tnavigator.clipboard.readText().then( function resolved( value ) {\n\n\t\t\tself.setStateFromJSON( value );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Saves the current state of the control. This can later be recover with `reset()`.\n\t */\n\tsaveState() {\n\n\t\tthis.object.updateMatrix();\n\t\tthis._gizmos.updateMatrix();\n\n\t\tthis._target0.copy( this.target );\n\t\tthis._cameraMatrixState0.copy( this.object.matrix );\n\t\tthis._gizmoMatrixState0.copy( this._gizmos.matrix );\n\t\tthis._nearPos = this.object.near;\n\t\tthis._farPos = this.object.far;\n\t\tthis._zoom0 = this.object.zoom;\n\t\tthis._up0.copy( this.object.up );\n\n\t\tif ( this.object.isPerspectiveCamera ) {\n\n\t\t\tthis._fov0 = this.object.fov;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Performs uniform scale operation around a given point.\n\t *\n\t * @private\n\t * @param {number} size - Scale factor.\n\t * @param {Vector3} point - Point around which scale.\n\t * @param {boolean} scaleGizmos - If gizmos should be scaled (Perspective only).\n\t * @returns {Object} Object with 'camera' and 'gizmo' fields containing transformation matrices resulting from the operation to be applied to the camera and gizmos.\n\t */\n\tscale( size, point, scaleGizmos = true ) {\n\n\t\t_scalePointTemp.copy( point );\n\t\tlet sizeInverse = 1 / size;\n\n\t\tif ( this.object.isOrthographicCamera ) {\n\n\t\t\t//camera zoom\n\t\t\tthis.object.zoom = this._zoomState;\n\t\t\tthis.object.zoom *= size;\n\n\t\t\t//check min and max zoom\n\t\t\tif ( this.object.zoom > this.maxZoom ) {\n\n\t\t\t\tthis.object.zoom = this.maxZoom;\n\t\t\t\tsizeInverse = this._zoomState / this.maxZoom;\n\n\t\t\t} else if ( this.object.zoom < this.minZoom ) {\n\n\t\t\t\tthis.object.zoom = this.minZoom;\n\t\t\t\tsizeInverse = this._zoomState / this.minZoom;\n\n\t\t\t}\n\n\t\t\tthis.object.updateProjectionMatrix();\n\n\t\t\tthis._v3_1.setFromMatrixPosition( this._gizmoMatrixState );\t//gizmos position\n\n\t\t\t//scale gizmos so they appear in the same spot having the same dimension\n\t\t\tthis._scaleMatrix.makeScale( sizeInverse, sizeInverse, sizeInverse );\n\t\t\tthis._translationMatrix.makeTranslation( - this._v3_1.x, - this._v3_1.y, - this._v3_1.z );\n\n\t\t\tthis._m4_2.makeTranslation( this._v3_1.x, this._v3_1.y, this._v3_1.z ).multiply( this._scaleMatrix );\n\t\t\tthis._m4_2.multiply( this._translationMatrix );\n\n\n\t\t\t//move camera and gizmos to obtain pinch effect\n\t\t\t_scalePointTemp.sub( this._v3_1 );\n\n\t\t\tconst amount = _scalePointTemp.clone().multiplyScalar( sizeInverse );\n\t\t\t_scalePointTemp.sub( amount );\n\n\t\t\tthis._m4_1.makeTranslation( _scalePointTemp.x, _scalePointTemp.y, _scalePointTemp.z );\n\t\t\tthis._m4_2.premultiply( this._m4_1 );\n\n\t\t\tthis.setTransformationMatrices( this._m4_1, this._m4_2 );\n\t\t\treturn _transformation;\n\n\t\t} else if ( this.object.isPerspectiveCamera ) {\n\n\t\t\tthis._v3_1.setFromMatrixPosition( this._cameraMatrixState );\n\t\t\tthis._v3_2.setFromMatrixPosition( this._gizmoMatrixState );\n\n\t\t\t//move camera\n\t\t\tlet distance = this._v3_1.distanceTo( _scalePointTemp );\n\t\t\tlet amount = distance - ( distance * sizeInverse );\n\n\t\t\t//check min and max distance\n\t\t\tconst newDistance = distance - amount;\n\t\t\tif ( newDistance < this.minDistance ) {\n\n\t\t\t\tsizeInverse = this.minDistance / distance;\n\t\t\t\tamount = distance - ( distance * sizeInverse );\n\n\t\t\t} else if ( newDistance > this.maxDistance ) {\n\n\t\t\t\tsizeInverse = this.maxDistance / distance;\n\t\t\t\tamount = distance - ( distance * sizeInverse );\n\n\t\t\t}\n\n\t\t\t_offset.copy( _scalePointTemp ).sub( this._v3_1 ).normalize().multiplyScalar( amount );\n\n\t\t\tthis._m4_1.makeTranslation( _offset.x, _offset.y, _offset.z );\n\n\n\t\t\tif ( scaleGizmos ) {\n\n\t\t\t\t//scale gizmos so they appear in the same spot having the same dimension\n\t\t\t\tconst pos = this._v3_2;\n\n\t\t\t\tdistance = pos.distanceTo( _scalePointTemp );\n\t\t\t\tamount = distance - ( distance * sizeInverse );\n\t\t\t\t_offset.copy( _scalePointTemp ).sub( this._v3_2 ).normalize().multiplyScalar( amount );\n\n\t\t\t\tthis._translationMatrix.makeTranslation( pos.x, pos.y, pos.z );\n\t\t\t\tthis._scaleMatrix.makeScale( sizeInverse, sizeInverse, sizeInverse );\n\n\t\t\t\tthis._m4_2.makeTranslation( _offset.x, _offset.y, _offset.z ).multiply( this._translationMatrix );\n\t\t\t\tthis._m4_2.multiply( this._scaleMatrix );\n\n\t\t\t\tthis._translationMatrix.makeTranslation( - pos.x, - pos.y, - pos.z );\n\n\t\t\t\tthis._m4_2.multiply( this._translationMatrix );\n\t\t\t\tthis.setTransformationMatrices( this._m4_1, this._m4_2 );\n\n\n\t\t\t} else {\n\n\t\t\t\tthis.setTransformationMatrices( this._m4_1 );\n\n\t\t\t}\n\n\t\t\treturn _transformation;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets camera fov.\n\t *\n\t * @private\n\t * @param {number} value - The FOV to be set.\n\t */\n\tsetFov( value ) {\n\n\t\tif ( this.object.isPerspectiveCamera ) {\n\n\t\t\tthis.object.fov = MathUtils.clamp( value, this.minFov, this.maxFov );\n\t\t\tthis.object.updateProjectionMatrix();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets values in transformation object.\n\t *\n\t * @private\n\t * @param {?Matrix4} [camera=null] - Transformation to be applied to the camera.\n\t * @param {?Matrix4} [gizmos=null] - Transformation to be applied to gizmos.\n\t */\n\tsetTransformationMatrices( camera = null, gizmos = null ) {\n\n\t\tif ( camera != null ) {\n\n\t\t\tif ( _transformation.camera != null ) {\n\n\t\t\t\t_transformation.camera.copy( camera );\n\n\t\t\t} else {\n\n\t\t\t\t_transformation.camera = camera.clone();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t_transformation.camera = null;\n\n\t\t}\n\n\t\tif ( gizmos != null ) {\n\n\t\t\tif ( _transformation.gizmos != null ) {\n\n\t\t\t\t_transformation.gizmos.copy( gizmos );\n\n\t\t\t} else {\n\n\t\t\t\t_transformation.gizmos = gizmos.clone();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t_transformation.gizmos = null;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Rotates camera around its direction axis passing by a given point by a given angle.\n\t *\n\t * @private\n\t * @param {Vector3} point - The point where the rotation axis is passing trough.\n\t * @param {number} angle - Angle in radians.\n\t * @returns {Object} The computed transformation matrix.\n\t */\n\tzRotate( point, angle ) {\n\n\t\tthis._rotationMatrix.makeRotationAxis( this._rotationAxis, angle );\n\t\tthis._translationMatrix.makeTranslation( - point.x, - point.y, - point.z );\n\n\t\tthis._m4_1.makeTranslation( point.x, point.y, point.z );\n\t\tthis._m4_1.multiply( this._rotationMatrix );\n\t\tthis._m4_1.multiply( this._translationMatrix );\n\n\t\tthis._v3_1.setFromMatrixPosition( this._gizmoMatrixState ).sub( point );\t//vector from rotation center to gizmos position\n\t\tthis._v3_2.copy( this._v3_1 ).applyAxisAngle( this._rotationAxis, angle );\t//apply rotation\n\t\tthis._v3_2.sub( this._v3_1 );\n\n\t\tthis._m4_2.makeTranslation( this._v3_2.x, this._v3_2.y, this._v3_2.z );\n\n\t\tthis.setTransformationMatrices( this._m4_1, this._m4_2 );\n\t\treturn _transformation;\n\n\t}\n\n\t/**\n\t * Returns the raycaster that is used for user interaction. This object is shared between all\n\t * instances of `ArcballControls`.\n\t *\n\t * @returns {Raycaster} The internal raycaster.\n\t */\n\tgetRaycaster() {\n\n\t\treturn _raycaster;\n\n\t}\n\n\n\t/**\n\t * Unprojects the cursor on the 3D object surface.\n\t *\n\t * @private\n\t * @param {Vector2} cursor - Cursor coordinates in NDC.\n\t * @param {Camera} camera - Virtual camera.\n\t * @returns {?Vector3} The point of intersection with the model, if exist, null otherwise.\n\t */\n\tunprojectOnObj( cursor, camera ) {\n\n\t\tconst raycaster = this.getRaycaster();\n\t\traycaster.near = camera.near;\n\t\traycaster.far = camera.far;\n\t\traycaster.setFromCamera( cursor, camera );\n\n\t\tconst intersect = raycaster.intersectObjects( this.scene.children, true );\n\n\t\tfor ( let i = 0; i < intersect.length; i ++ ) {\n\n\t\t\tif ( intersect[ i ].object.uuid != this._gizmos.uuid && intersect[ i ].face != null ) {\n\n\t\t\t\treturn intersect[ i ].point.clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Unproject the cursor on the trackball surface.\n\t *\n\t * @private\n\t * @param {Camera} camera - The virtual camera.\n\t * @param {number} cursorX - Cursor horizontal coordinate on screen.\n\t * @param {number} cursorY - Cursor vertical coordinate on screen.\n\t * @param {HTMLElement} canvas - The canvas where the renderer draws its output.\n\t * @param {number} tbRadius - The trackball radius.\n\t * @returns {Vector3} The unprojected point on the trackball surface.\n\t */\n\tunprojectOnTbSurface( camera, cursorX, cursorY, canvas, tbRadius ) {\n\n\t\tif ( camera.type == 'OrthographicCamera' ) {\n\n\t\t\tthis._v2_1.copy( this.getCursorPosition( cursorX, cursorY, canvas ) );\n\t\t\tthis._v3_1.set( this._v2_1.x, this._v2_1.y, 0 );\n\n\t\t\tconst x2 = Math.pow( this._v2_1.x, 2 );\n\t\t\tconst y2 = Math.pow( this._v2_1.y, 2 );\n\t\t\tconst r2 = Math.pow( this._tbRadius, 2 );\n\n\t\t\tif ( x2 + y2 <= r2 * 0.5 ) {\n\n\t\t\t\t//intersection with sphere\n\t\t\t\tthis._v3_1.setZ( Math.sqrt( r2 - ( x2 + y2 ) ) );\n\n\t\t\t} else {\n\n\t\t\t\t//intersection with hyperboloid\n\t\t\t\tthis._v3_1.setZ( ( r2 * 0.5 ) / ( Math.sqrt( x2 + y2 ) ) );\n\n\t\t\t}\n\n\t\t\treturn this._v3_1;\n\n\t\t} else if ( camera.type == 'PerspectiveCamera' ) {\n\n\t\t\t//unproject cursor on the near plane\n\t\t\tthis._v2_1.copy( this.getCursorNDC( cursorX, cursorY, canvas ) );\n\n\t\t\tthis._v3_1.set( this._v2_1.x, this._v2_1.y, - 1 );\n\t\t\tthis._v3_1.applyMatrix4( camera.projectionMatrixInverse );\n\n\t\t\tconst rayDir = this._v3_1.clone().normalize(); //unprojected ray direction\n\t\t\tconst cameraGizmoDistance = camera.position.distanceTo( this._gizmos.position );\n\t\t\tconst radius2 = Math.pow( tbRadius, 2 );\n\n\t\t\t//\t  camera\n\t\t\t//\t\t|\\\n\t\t\t//\t\t| \\\n\t\t\t//\t\t|  \\\n\t\t\t//\th\t|\t\\\n\t\t\t//\t\t| \t \\\n\t\t\t//\t\t| \t  \\\n\t\t\t//\t_ _ | _ _ _\\ _ _  near plane\n\t\t\t//\t\t\tl\n\n\t\t\tconst h = this._v3_1.z;\n\t\t\tconst l = Math.sqrt( Math.pow( this._v3_1.x, 2 ) + Math.pow( this._v3_1.y, 2 ) );\n\n\t\t\tif ( l == 0 ) {\n\n\t\t\t\t//ray aligned with camera\n\t\t\t\trayDir.set( this._v3_1.x, this._v3_1.y, tbRadius );\n\t\t\t\treturn rayDir;\n\n\t\t\t}\n\n\t\t\tconst m = h / l;\n\t\t\tconst q = cameraGizmoDistance;\n\n\t\t\t/*\n\t\t\t * calculate intersection point between unprojected ray and trackball surface\n\t\t\t *|y = m * x + q\n\t\t\t *|x^2 + y^2 = r^2\n\t\t\t *\n\t\t\t * (m^2 + 1) * x^2 + (2 * m * q) * x + q^2 - r^2 = 0\n\t\t\t */\n\t\t\tlet a = Math.pow( m, 2 ) + 1;\n\t\t\tlet b = 2 * m * q;\n\t\t\tlet c = Math.pow( q, 2 ) - radius2;\n\t\t\tlet delta = Math.pow( b, 2 ) - ( 4 * a * c );\n\n\t\t\tif ( delta >= 0 ) {\n\n\t\t\t\t//intersection with sphere\n\t\t\t\tthis._v2_1.setX( ( - b - Math.sqrt( delta ) ) / ( 2 * a ) );\n\t\t\t\tthis._v2_1.setY( m * this._v2_1.x + q );\n\n\t\t\t\tconst angle = MathUtils.RAD2DEG * this._v2_1.angle();\n\n\t\t\t\tif ( angle >= 45 ) {\n\n\t\t\t\t\t//if angle between intersection point and X' axis is >= 45\u00B0, return that point\n\t\t\t\t\t//otherwise, calculate intersection point with hyperboloid\n\n\t\t\t\t\tconst rayLength = Math.sqrt( Math.pow( this._v2_1.x, 2 ) + Math.pow( ( cameraGizmoDistance - this._v2_1.y ), 2 ) );\n\t\t\t\t\trayDir.multiplyScalar( rayLength );\n\t\t\t\t\trayDir.z += cameraGizmoDistance;\n\t\t\t\t\treturn rayDir;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//intersection with hyperboloid\n\t\t\t/*\n\t\t\t *|y = m * x + q\n\t\t\t *|y = (1 / x) * (r^2 / 2)\n\t\t\t *\n\t\t\t * m * x^2 + q * x - r^2 / 2 = 0\n\t\t\t */\n\n\t\t\ta = m;\n\t\t\tb = q;\n\t\t\tc = - radius2 * 0.5;\n\t\t\tdelta = Math.pow( b, 2 ) - ( 4 * a * c );\n\t\t\tthis._v2_1.setX( ( - b - Math.sqrt( delta ) ) / ( 2 * a ) );\n\t\t\tthis._v2_1.setY( m * this._v2_1.x + q );\n\n\t\t\tconst rayLength = Math.sqrt( Math.pow( this._v2_1.x, 2 ) + Math.pow( ( cameraGizmoDistance - this._v2_1.y ), 2 ) );\n\n\t\t\trayDir.multiplyScalar( rayLength );\n\t\t\trayDir.z += cameraGizmoDistance;\n\t\t\treturn rayDir;\n\n\t\t}\n\n\t}\n\n\n\t/**\n\t * Unprojects the cursor on the plane passing through the center of the trackball orthogonal to the camera.\n\t *\n\t * @private\n\t * @param {Camera} camera - The virtual camera.\n\t * @param {number} cursorX - Cursor horizontal coordinate on screen.\n\t * @param {number} cursorY - Cursor vertical coordinate on screen.\n\t * @param {HTMLElement} canvas - The canvas where the renderer draws its output.\n\t * @param {boolean} [initialDistance=false] - If initial distance between camera and gizmos should be used for calculations instead of current (Perspective only).\n\t * @returns {Vector3} The unprojected point on the trackball plane.\n\t */\n\tunprojectOnTbPlane( camera, cursorX, cursorY, canvas, initialDistance = false ) {\n\n\t\tif ( camera.type == 'OrthographicCamera' ) {\n\n\t\t\tthis._v2_1.copy( this.getCursorPosition( cursorX, cursorY, canvas ) );\n\t\t\tthis._v3_1.set( this._v2_1.x, this._v2_1.y, 0 );\n\n\t\t\treturn this._v3_1.clone();\n\n\t\t} else if ( camera.type == 'PerspectiveCamera' ) {\n\n\t\t\tthis._v2_1.copy( this.getCursorNDC( cursorX, cursorY, canvas ) );\n\n\t\t\t//unproject cursor on the near plane\n\t\t\tthis._v3_1.set( this._v2_1.x, this._v2_1.y, - 1 );\n\t\t\tthis._v3_1.applyMatrix4( camera.projectionMatrixInverse );\n\n\t\t\tconst rayDir = this._v3_1.clone().normalize(); //unprojected ray direction\n\n\t\t\t//\t  camera\n\t\t\t//\t\t|\\\n\t\t\t//\t\t| \\\n\t\t\t//\t\t|  \\\n\t\t\t//\th\t|\t\\\n\t\t\t//\t\t| \t \\\n\t\t\t//\t\t| \t  \\\n\t\t\t//\t_ _ | _ _ _\\ _ _  near plane\n\t\t\t//\t\t\tl\n\n\t\t\tconst h = this._v3_1.z;\n\t\t\tconst l = Math.sqrt( Math.pow( this._v3_1.x, 2 ) + Math.pow( this._v3_1.y, 2 ) );\n\t\t\tlet cameraGizmoDistance;\n\n\t\t\tif ( initialDistance ) {\n\n\t\t\t\tcameraGizmoDistance = this._v3_1.setFromMatrixPosition( this._cameraMatrixState0 ).distanceTo( this._v3_2.setFromMatrixPosition( this._gizmoMatrixState0 ) );\n\n\t\t\t} else {\n\n\t\t\t\tcameraGizmoDistance = camera.position.distanceTo( this._gizmos.position );\n\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * calculate intersection point between unprojected ray and the plane\n\t\t\t *|y = mx + q\n\t\t\t *|y = 0\n\t\t\t *\n\t\t\t * x = -q/m\n\t\t\t*/\n\t\t\tif ( l == 0 ) {\n\n\t\t\t\t//ray aligned with camera\n\t\t\t\trayDir.set( 0, 0, 0 );\n\t\t\t\treturn rayDir;\n\n\t\t\t}\n\n\t\t\tconst m = h / l;\n\t\t\tconst q = cameraGizmoDistance;\n\t\t\tconst x = - q / m;\n\n\t\t\tconst rayLength = Math.sqrt( Math.pow( q, 2 ) + Math.pow( x, 2 ) );\n\t\t\trayDir.multiplyScalar( rayLength );\n\t\t\trayDir.z = 0;\n\t\t\treturn rayDir;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates camera and gizmos state.\n\t *\n\t * @private\n\t */\n\tupdateMatrixState() {\n\n\t\t//update camera and gizmos state\n\t\tthis._cameraMatrixState.copy( this.object.matrix );\n\t\tthis._gizmoMatrixState.copy( this._gizmos.matrix );\n\n\t\tif ( this.object.isOrthographicCamera ) {\n\n\t\t\tthis._cameraProjectionState.copy( this.object.projectionMatrix );\n\t\t\tthis.object.updateProjectionMatrix();\n\t\t\tthis._zoomState = this.object.zoom;\n\n\t\t} else if ( this.object.isPerspectiveCamera ) {\n\n\t\t\tthis._fovState = this.object.fov;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the trackball FSA.\n\t *\n\t * @private\n\t * @param {STATE} newState - New state of the FSA.\n\t * @param {boolean} updateMatrices - If matrices state should be updated.\n\t */\n\tupdateTbState( newState, updateMatrices ) {\n\n\t\tthis._state = newState;\n\t\tif ( updateMatrices ) {\n\n\t\t\tthis.updateMatrixState();\n\n\t\t}\n\n\t}\n\n\tupdate() {\n\n\t\tif ( this.target.equals( this._currentTarget ) === false ) {\n\n\t\t\tthis._gizmos.position.copy( this.target );\t//for correct radius calculation\n\t\t\tthis._tbRadius = this.calculateTbRadius( this.object );\n\t\t\tthis.makeGizmos( this.target, this._tbRadius );\n\t\t\tthis._currentTarget.copy( this.target );\n\n\t\t}\n\n\t\t//check min/max parameters\n\t\tif ( this.object.isOrthographicCamera ) {\n\n\t\t\t//check zoom\n\t\t\tif ( this.object.zoom > this.maxZoom || this.object.zoom < this.minZoom ) {\n\n\t\t\t\tconst newZoom = MathUtils.clamp( this.object.zoom, this.minZoom, this.maxZoom );\n\t\t\t\tthis.applyTransformMatrix( this.scale( newZoom / this.object.zoom, this._gizmos.position, true ) );\n\n\t\t\t}\n\n\t\t} else if ( this.object.isPerspectiveCamera ) {\n\n\t\t\t//check distance\n\t\t\tconst distance = this.object.position.distanceTo( this._gizmos.position );\n\n\t\t\tif ( distance > this.maxDistance + _EPS || distance < this.minDistance - _EPS ) {\n\n\t\t\t\tconst newDistance = MathUtils.clamp( distance, this.minDistance, this.maxDistance );\n\t\t\t\tthis.applyTransformMatrix( this.scale( newDistance / distance, this._gizmos.position ) );\n\t\t\t\tthis.updateMatrixState();\n\n\t\t\t}\n\n\t\t\t//check fov\n\t\t\tif ( this.object.fov < this.minFov || this.object.fov > this.maxFov ) {\n\n\t\t\t\tthis.object.fov = MathUtils.clamp( this.object.fov, this.minFov, this.maxFov );\n\t\t\t\tthis.object.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\tconst oldRadius = this._tbRadius;\n\t\t\tthis._tbRadius = this.calculateTbRadius( this.object );\n\n\t\t\tif ( oldRadius < this._tbRadius - _EPS || oldRadius > this._tbRadius + _EPS ) {\n\n\t\t\t\tconst scale = ( this._gizmos.scale.x + this._gizmos.scale.y + this._gizmos.scale.z ) / 3;\n\t\t\t\tconst newRadius = this._tbRadius / scale;\n\t\t\t\tconst curve = new EllipseCurve( 0, 0, newRadius, newRadius );\n\t\t\t\tconst points = curve.getPoints( this._curvePts );\n\t\t\t\tconst curveGeometry = new BufferGeometry().setFromPoints( points );\n\n\t\t\t\tfor ( const gizmo in this._gizmos.children ) {\n\n\t\t\t\t\tthis._gizmos.children[ gizmo ].geometry = curveGeometry;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.object.lookAt( this._gizmos.position );\n\n\t}\n\n\tsetStateFromJSON( json ) {\n\n\t\tconst state = JSON.parse( json );\n\n\t\tif ( state.arcballState != undefined ) {\n\n\t\t\tthis.target.fromArray( state.arcballState.target );\n\n\t\t\tthis._cameraMatrixState.fromArray( state.arcballState.cameraMatrix.elements );\n\t\t\tthis._cameraMatrixState.decompose( this.object.position, this.object.quaternion, this.object.scale );\n\n\t\t\tthis.object.up.copy( state.arcballState.cameraUp );\n\t\t\tthis.object.near = state.arcballState.cameraNear;\n\t\t\tthis.object.far = state.arcballState.cameraFar;\n\n\t\t\tthis.object.zoom = state.arcballState.cameraZoom;\n\n\t\t\tif ( this.object.isPerspectiveCamera ) {\n\n\t\t\t\tthis.object.fov = state.arcballState.cameraFov;\n\n\t\t\t}\n\n\t\t\tthis._gizmoMatrixState.fromArray( state.arcballState.gizmoMatrix.elements );\n\t\t\tthis._gizmoMatrixState.decompose( this._gizmos.position, this._gizmos.quaternion, this._gizmos.scale );\n\n\t\t\tthis.object.updateMatrix();\n\t\t\tthis.object.updateProjectionMatrix();\n\n\t\t\tthis._gizmos.updateMatrix();\n\n\t\t\tthis._tbRadius = this.calculateTbRadius( this.object );\n\t\t\tconst gizmoTmp = new Matrix4().copy( this._gizmoMatrixState0 );\n\t\t\tthis.makeGizmos( this._gizmos.position, this._tbRadius );\n\t\t\tthis._gizmoMatrixState0.copy( gizmoTmp );\n\n\t\t\tthis.object.lookAt( this._gizmos.position );\n\t\t\tthis.updateTbState( STATE.IDLE, false );\n\n\t\t\tthis.dispatchEvent( _changeEvent );\n\n\t\t}\n\n\t}\n\n}\n\n//listeners\n\nfunction onWindowResize() {\n\n\tconst scale = ( this._gizmos.scale.x + this._gizmos.scale.y + this._gizmos.scale.z ) / 3;\n\tthis._tbRadius = this.calculateTbRadius( this.object );\n\n\tconst newRadius = this._tbRadius / scale;\n\tconst curve = new EllipseCurve( 0, 0, newRadius, newRadius );\n\tconst points = curve.getPoints( this._curvePts );\n\tconst curveGeometry = new BufferGeometry().setFromPoints( points );\n\n\n\tfor ( const gizmo in this._gizmos.children ) {\n\n\t\tthis._gizmos.children[ gizmo ].geometry = curveGeometry;\n\n\t}\n\n\tthis.dispatchEvent( _changeEvent );\n\n}\n\nfunction onContextMenu( event ) {\n\n\tif ( ! this.enabled ) {\n\n\t\treturn;\n\n\t}\n\n\tfor ( let i = 0; i < this.mouseActions.length; i ++ ) {\n\n\t\tif ( this.mouseActions[ i ].mouse == 2 ) {\n\n\t\t\t//prevent only if button 2 is actually used\n\t\t\tevent.preventDefault();\n\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n}\n\nfunction onPointerCancel() {\n\n\tthis._touchStart.splice( 0, this._touchStart.length );\n\tthis._touchCurrent.splice( 0, this._touchCurrent.length );\n\tthis._input = INPUT.NONE;\n\n}\n\nfunction onPointerDown( event ) {\n\n\tif ( event.button == 0 && event.isPrimary ) {\n\n\t\tthis._downValid = true;\n\t\tthis._downEvents.push( event );\n\t\tthis._downStart = performance.now();\n\n\t} else {\n\n\t\tthis._downValid = false;\n\n\t}\n\n\tif ( event.pointerType == 'touch' && this._input != INPUT.CURSOR ) {\n\n\t\tthis._touchStart.push( event );\n\t\tthis._touchCurrent.push( event );\n\n\t\tswitch ( this._input ) {\n\n\t\t\tcase INPUT.NONE:\n\n\t\t\t\t//singleStart\n\t\t\t\tthis._input = INPUT.ONE_FINGER;\n\t\t\t\tthis.onSinglePanStart( event, 'ROTATE' );\n\n\t\t\t\twindow.addEventListener( 'pointermove', this._onPointerMove );\n\t\t\t\twindow.addEventListener( 'pointerup', this._onPointerUp );\n\n\t\t\t\tbreak;\n\n\t\t\tcase INPUT.ONE_FINGER:\n\t\t\tcase INPUT.ONE_FINGER_SWITCHED:\n\n\t\t\t\t//doubleStart\n\t\t\t\tthis._input = INPUT.TWO_FINGER;\n\n\t\t\t\tthis.onRotateStart();\n\t\t\t\tthis.onPinchStart();\n\t\t\t\tthis.onDoublePanStart();\n\n\t\t\t\tbreak;\n\n\t\t\tcase INPUT.TWO_FINGER:\n\n\t\t\t\t//multipleStart\n\t\t\t\tthis._input = INPUT.MULT_FINGER;\n\t\t\t\tthis.onTriplePanStart( event );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t} else if ( event.pointerType != 'touch' && this._input == INPUT.NONE ) {\n\n\t\tlet modifier = null;\n\n\t\tif ( event.ctrlKey || event.metaKey ) {\n\n\t\t\tmodifier = 'CTRL';\n\n\t\t} else if ( event.shiftKey ) {\n\n\t\t\tmodifier = 'SHIFT';\n\n\t\t}\n\n\t\tthis._mouseOp = this.getOpFromAction( event.button, modifier );\n\t\tif ( this._mouseOp != null ) {\n\n\t\t\twindow.addEventListener( 'pointermove', this._onPointerMove );\n\t\t\twindow.addEventListener( 'pointerup', this._onPointerUp );\n\n\t\t\t//singleStart\n\t\t\tthis._input = INPUT.CURSOR;\n\t\t\tthis._button = event.button;\n\t\t\tthis.onSinglePanStart( event, this._mouseOp );\n\n\t\t}\n\n\t}\n\n}\n\nfunction onPointerMove( event ) {\n\n\tif ( event.pointerType == 'touch' && this._input != INPUT.CURSOR ) {\n\n\t\tswitch ( this._input ) {\n\n\t\t\tcase INPUT.ONE_FINGER:\n\n\t\t\t\t//singleMove\n\t\t\t\tthis.updateTouchEvent( event );\n\n\t\t\t\tthis.onSinglePanMove( event, STATE.ROTATE );\n\t\t\t\tbreak;\n\n\t\t\tcase INPUT.ONE_FINGER_SWITCHED:\n\n\t\t\t\tconst movement = this.calculatePointersDistance( this._touchCurrent[ 0 ], event ) * this._devPxRatio;\n\n\t\t\t\tif ( movement >= this._switchSensibility ) {\n\n\t\t\t\t\t//singleMove\n\t\t\t\t\tthis._input = INPUT.ONE_FINGER;\n\t\t\t\t\tthis.updateTouchEvent( event );\n\n\t\t\t\t\tthis.onSinglePanStart( event, 'ROTATE' );\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase INPUT.TWO_FINGER:\n\n\t\t\t\t//rotate/pan/pinchMove\n\t\t\t\tthis.updateTouchEvent( event );\n\n\t\t\t\tthis.onRotateMove();\n\t\t\t\tthis.onPinchMove();\n\t\t\t\tthis.onDoublePanMove();\n\n\t\t\t\tbreak;\n\n\t\t\tcase INPUT.MULT_FINGER:\n\n\t\t\t\t//multMove\n\t\t\t\tthis.updateTouchEvent( event );\n\n\t\t\t\tthis.onTriplePanMove( event );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t} else if ( event.pointerType != 'touch' && this._input == INPUT.CURSOR ) {\n\n\t\tlet modifier = null;\n\n\t\tif ( event.ctrlKey || event.metaKey ) {\n\n\t\t\tmodifier = 'CTRL';\n\n\t\t} else if ( event.shiftKey ) {\n\n\t\t\tmodifier = 'SHIFT';\n\n\t\t}\n\n\t\tconst mouseOpState = this.getOpStateFromAction( this._button, modifier );\n\n\t\tif ( mouseOpState != null ) {\n\n\t\t\tthis.onSinglePanMove( event, mouseOpState );\n\n\t\t}\n\n\t}\n\n\t//checkDistance\n\tif ( this._downValid ) {\n\n\t\tconst movement = this.calculatePointersDistance( this._downEvents[ this._downEvents.length - 1 ], event ) * this._devPxRatio;\n\t\tif ( movement > this._movementThreshold ) {\n\n\t\t\tthis._downValid = false;\n\n\t\t}\n\n\t}\n\n}\n\nfunction onPointerUp( event ) {\n\n\tif ( event.pointerType == 'touch' && this._input != INPUT.CURSOR ) {\n\n\t\tconst nTouch = this._touchCurrent.length;\n\n\t\tfor ( let i = 0; i < nTouch; i ++ ) {\n\n\t\t\tif ( this._touchCurrent[ i ].pointerId == event.pointerId ) {\n\n\t\t\t\tthis._touchCurrent.splice( i, 1 );\n\t\t\t\tthis._touchStart.splice( i, 1 );\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tswitch ( this._input ) {\n\n\t\t\tcase INPUT.ONE_FINGER:\n\t\t\tcase INPUT.ONE_FINGER_SWITCHED:\n\n\t\t\t\t//singleEnd\n\t\t\t\twindow.removeEventListener( 'pointermove', this._onPointerMove );\n\t\t\t\twindow.removeEventListener( 'pointerup', this._onPointerUp );\n\n\t\t\t\tthis._input = INPUT.NONE;\n\t\t\t\tthis.onSinglePanEnd();\n\n\t\t\t\tbreak;\n\n\t\t\tcase INPUT.TWO_FINGER:\n\n\t\t\t\t//doubleEnd\n\t\t\t\tthis.onDoublePanEnd( event );\n\t\t\t\tthis.onPinchEnd( event );\n\t\t\t\tthis.onRotateEnd( event );\n\n\t\t\t\t//switching to singleStart\n\t\t\t\tthis._input = INPUT.ONE_FINGER_SWITCHED;\n\n\t\t\t\tbreak;\n\n\t\t\tcase INPUT.MULT_FINGER:\n\n\t\t\t\tif ( this._touchCurrent.length == 0 ) {\n\n\t\t\t\t\twindow.removeEventListener( 'pointermove', this._onPointerMove );\n\t\t\t\t\twindow.removeEventListener( 'pointerup', this._onPointerUp );\n\n\t\t\t\t\t//multCancel\n\t\t\t\t\tthis._input = INPUT.NONE;\n\t\t\t\t\tthis.onTriplePanEnd();\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t} else if ( event.pointerType != 'touch' && this._input == INPUT.CURSOR ) {\n\n\t\twindow.removeEventListener( 'pointermove', this._onPointerMove );\n\t\twindow.removeEventListener( 'pointerup', this._onPointerUp );\n\n\t\tthis._input = INPUT.NONE;\n\t\tthis.onSinglePanEnd();\n\t\tthis._button = - 1;\n\n\t}\n\n\tif ( event.isPrimary ) {\n\n\t\tif ( this._downValid ) {\n\n\t\t\tconst downTime = event.timeStamp - this._downEvents[ this._downEvents.length - 1 ].timeStamp;\n\n\t\t\tif ( downTime <= this._maxDownTime ) {\n\n\t\t\t\tif ( this._nclicks == 0 ) {\n\n\t\t\t\t\t//first valid click detected\n\t\t\t\t\tthis._nclicks = 1;\n\t\t\t\t\tthis._clickStart = performance.now();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst clickInterval = event.timeStamp - this._clickStart;\n\t\t\t\t\tconst movement = this.calculatePointersDistance( this._downEvents[ 1 ], this._downEvents[ 0 ] ) * this._devPxRatio;\n\n\t\t\t\t\tif ( clickInterval <= this._maxInterval && movement <= this._posThreshold ) {\n\n\t\t\t\t\t\t//second valid click detected\n\t\t\t\t\t\t//fire double tap and reset values\n\t\t\t\t\t\tthis._nclicks = 0;\n\t\t\t\t\t\tthis._downEvents.splice( 0, this._downEvents.length );\n\t\t\t\t\t\tthis.onDoubleTap( event );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t//new 'first click'\n\t\t\t\t\t\tthis._nclicks = 1;\n\t\t\t\t\t\tthis._downEvents.shift();\n\t\t\t\t\t\tthis._clickStart = performance.now();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis._downValid = false;\n\t\t\t\tthis._nclicks = 0;\n\t\t\t\tthis._downEvents.splice( 0, this._downEvents.length );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis._nclicks = 0;\n\t\t\tthis._downEvents.splice( 0, this._downEvents.length );\n\n\t\t}\n\n\t}\n\n}\n\nfunction onWheel( event ) {\n\n\tif ( this.enabled && this.enableZoom ) {\n\n\t\tlet modifier = null;\n\n\t\tif ( event.ctrlKey || event.metaKey ) {\n\n\t\t\tmodifier = 'CTRL';\n\n\t\t} else if ( event.shiftKey ) {\n\n\t\t\tmodifier = 'SHIFT';\n\n\t\t}\n\n\t\tconst mouseOp = this.getOpFromAction( 'WHEEL', modifier );\n\n\t\tif ( mouseOp != null ) {\n\n\t\t\tevent.preventDefault();\n\t\t\tthis.dispatchEvent( _startEvent );\n\n\t\t\tconst notchDeltaY = 125; //distance of one notch of mouse wheel\n\t\t\tlet sgn = event.deltaY / notchDeltaY;\n\n\t\t\tlet size = 1;\n\n\t\t\tif ( sgn > 0 ) {\n\n\t\t\t\tsize = 1 / this.scaleFactor;\n\n\t\t\t} else if ( sgn < 0 ) {\n\n\t\t\t\tsize = this.scaleFactor;\n\n\t\t\t}\n\n\t\t\tswitch ( mouseOp ) {\n\n\t\t\t\tcase 'ZOOM':\n\n\t\t\t\t\tthis.updateTbState( STATE.SCALE, true );\n\n\t\t\t\t\tif ( sgn > 0 ) {\n\n\t\t\t\t\t\tsize = 1 / ( Math.pow( this.scaleFactor, sgn ) );\n\n\t\t\t\t\t} else if ( sgn < 0 ) {\n\n\t\t\t\t\t\tsize = Math.pow( this.scaleFactor, - sgn );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.cursorZoom && this.enablePan ) {\n\n\t\t\t\t\t\tlet scalePoint;\n\n\t\t\t\t\t\tif ( this.object.isOrthographicCamera ) {\n\n\t\t\t\t\t\t\tscalePoint = this.unprojectOnTbPlane( this.object, event.clientX, event.clientY, this.domElement ).applyQuaternion( this.object.quaternion ).multiplyScalar( 1 / this.object.zoom ).add( this._gizmos.position );\n\n\t\t\t\t\t\t} else if ( this.object.isPerspectiveCamera ) {\n\n\t\t\t\t\t\t\tscalePoint = this.unprojectOnTbPlane( this.object, event.clientX, event.clientY, this.domElement ).applyQuaternion( this.object.quaternion ).add( this._gizmos.position );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis.applyTransformMatrix( this.scale( size, scalePoint ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis.applyTransformMatrix( this.scale( size, this._gizmos.position ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this._grid != null ) {\n\n\t\t\t\t\t\tthis.disposeGrid();\n\t\t\t\t\t\tthis.drawGrid();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.updateTbState( STATE.IDLE, false );\n\n\t\t\t\t\tthis.dispatchEvent( _changeEvent );\n\t\t\t\t\tthis.dispatchEvent( _endEvent );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'FOV':\n\n\t\t\t\t\tif ( this.object.isPerspectiveCamera ) {\n\n\t\t\t\t\t\tthis.updateTbState( STATE.FOV, true );\n\n\n\t\t\t\t\t\t//Vertigo effect\n\n\t\t\t\t\t\t//\t  fov / 2\n\t\t\t\t\t\t//\t\t|\\\n\t\t\t\t\t\t//\t\t| \\\n\t\t\t\t\t\t//\t\t|  \\\n\t\t\t\t\t\t//\tx\t|\t\\\n\t\t\t\t\t\t//\t\t| \t \\\n\t\t\t\t\t\t//\t\t| \t  \\\n\t\t\t\t\t\t//\t\t| _ _ _\\\n\t\t\t\t\t\t//\t\t\ty\n\n\t\t\t\t\t\t//check for iOs shift shortcut\n\t\t\t\t\t\tif ( event.deltaX != 0 ) {\n\n\t\t\t\t\t\t\tsgn = event.deltaX / notchDeltaY;\n\n\t\t\t\t\t\t\tsize = 1;\n\n\t\t\t\t\t\t\tif ( sgn > 0 ) {\n\n\t\t\t\t\t\t\t\tsize = 1 / ( Math.pow( this.scaleFactor, sgn ) );\n\n\t\t\t\t\t\t\t} else if ( sgn < 0 ) {\n\n\t\t\t\t\t\t\t\tsize = Math.pow( this.scaleFactor, - sgn );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis._v3_1.setFromMatrixPosition( this._cameraMatrixState );\n\t\t\t\t\t\tconst x = this._v3_1.distanceTo( this._gizmos.position );\n\t\t\t\t\t\tlet xNew = x / size;\t//distance between camera and gizmos if scale(size, scalepoint) would be performed\n\n\t\t\t\t\t\t//check min and max distance\n\t\t\t\t\t\txNew = MathUtils.clamp( xNew, this.minDistance, this.maxDistance );\n\n\t\t\t\t\t\tconst y = x * Math.tan( MathUtils.DEG2RAD * this.object.fov * 0.5 );\n\n\t\t\t\t\t\t//calculate new fov\n\t\t\t\t\t\tlet newFov = MathUtils.RAD2DEG * ( Math.atan( y / xNew ) * 2 );\n\n\t\t\t\t\t\t//check min and max fov\n\t\t\t\t\t\tif ( newFov > this.maxFov ) {\n\n\t\t\t\t\t\t\tnewFov = this.maxFov;\n\n\t\t\t\t\t\t} else if ( newFov < this.minFov ) {\n\n\t\t\t\t\t\t\tnewFov = this.minFov;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconst newDistance = y / Math.tan( MathUtils.DEG2RAD * ( newFov / 2 ) );\n\t\t\t\t\t\tsize = x / newDistance;\n\n\t\t\t\t\t\tthis.setFov( newFov );\n\t\t\t\t\t\tthis.applyTransformMatrix( this.scale( size, this._gizmos.position, false ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this._grid != null ) {\n\n\t\t\t\t\t\tthis.disposeGrid();\n\t\t\t\t\t\tthis.drawGrid();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.updateTbState( STATE.IDLE, false );\n\n\t\t\t\t\tthis.dispatchEvent( _changeEvent );\n\t\t\t\t\tthis.dispatchEvent( _endEvent );\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nexport { ArcballControls };\n", "import {\n\tControls,\n\tMatrix4,\n\tPlane,\n\tRaycaster,\n\tVector2,\n\tVector3,\n\tMOUSE,\n\tTOUCH\n} from 'three';\n\nconst _plane = new Plane();\n\nconst _pointer = new Vector2();\nconst _offset = new Vector3();\nconst _diff = new Vector2();\nconst _previousPointer = new Vector2();\nconst _intersection = new Vector3();\nconst _worldPosition = new Vector3();\nconst _inverseMatrix = new Matrix4();\n\nconst _up = new Vector3();\nconst _right = new Vector3();\n\nlet _selected = null, _hovered = null;\nconst _intersections = [];\n\nconst STATE = {\n\tNONE: - 1,\n\tPAN: 0,\n\tROTATE: 1\n};\n\n/**\n * This class can be used to provide a drag'n'drop interaction.\n *\n * ```js\n * const controls = new DragControls( objects, camera, renderer.domElement );\n *\n * // add event listener to highlight dragged objects\n * controls.addEventListener( 'dragstart', function ( event ) {\n *\n * \tevent.object.material.emissive.set( 0xaaaaaa );\n *\n * } );\n *\n * controls.addEventListener( 'dragend', function ( event ) {\n *\n * \tevent.object.material.emissive.set( 0x000000 );\n *\n * } );\n * ```\n *\n * @augments Controls\n * @three_import import { DragControls } from 'three/addons/controls/DragControls.js';\n */\nclass DragControls extends Controls {\n\n\t/**\n\t * Constructs a new controls instance.\n\t *\n\t * @param {Array<Object3D>} objects - An array of draggable 3D objects.\n\t * @param {Camera} camera - The camera of the rendered scene.\n\t * @param {?HTMLElement} [domElement=null] - The HTML DOM element used for event listeners.\n\t */\n\tconstructor( objects, camera, domElement = null ) {\n\n\t\tsuper( camera, domElement );\n\n\t\t/**\n\t\t * An array of draggable 3D objects.\n\t\t *\n\t\t * @type {Array<Object3D>}\n\t\t */\n\t\tthis.objects = objects;\n\n\t\t/**\n\t\t * Whether children of draggable objects can be dragged independently from their parent.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.recursive = true;\n\n\t\t/**\n\t\t * This option only works if the `objects` array contains a single draggable  group object.\n\t\t * If set to `true`, the controls does not transform individual objects but the entire group.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.transformGroup = false;\n\n\t\t/**\n\t\t * The speed at which the object will rotate when dragged in `rotate` mode.\n\t\t * The higher the number the faster the rotation.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.rotateSpeed = 1;\n\n\t\t/**\n\t\t * The raycaster used for detecting 3D objects.\n\t\t *\n\t\t * @type {Raycaster}\n\t\t */\n\t\tthis.raycaster = new Raycaster();\n\n\t\t// interaction\n\n\t\tthis.mouseButtons = { LEFT: MOUSE.PAN, MIDDLE: MOUSE.PAN, RIGHT: MOUSE.ROTATE };\n\t\tthis.touches = { ONE: TOUCH.PAN };\n\n\t\t// event listeners\n\n\t\tthis._onPointerMove = onPointerMove.bind( this );\n\t\tthis._onPointerDown = onPointerDown.bind( this );\n\t\tthis._onPointerCancel = onPointerCancel.bind( this );\n\t\tthis._onContextMenu = onContextMenu.bind( this );\n\n\t\t//\n\n\t\tif ( domElement !== null ) {\n\n\t\t\tthis.connect( domElement );\n\n\t\t}\n\n\t}\n\n\tconnect( element ) {\n\n\t\tsuper.connect( element );\n\n\t\tthis.domElement.addEventListener( 'pointermove', this._onPointerMove );\n\t\tthis.domElement.addEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.domElement.addEventListener( 'pointerup', this._onPointerCancel );\n\t\tthis.domElement.addEventListener( 'pointerleave', this._onPointerCancel );\n\t\tthis.domElement.addEventListener( 'contextmenu', this._onContextMenu );\n\n\t\tthis.domElement.style.touchAction = 'none'; // disable touch scroll\n\n\t}\n\n\tdisconnect() {\n\n\t\tthis.domElement.removeEventListener( 'pointermove', this._onPointerMove );\n\t\tthis.domElement.removeEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.domElement.removeEventListener( 'pointerup', this._onPointerCancel );\n\t\tthis.domElement.removeEventListener( 'pointerleave', this._onPointerCancel );\n\t\tthis.domElement.removeEventListener( 'contextmenu', this._onContextMenu );\n\n\t\tthis.domElement.style.touchAction = 'auto';\n\t\tthis.domElement.style.cursor = '';\n\n\t}\n\n\tdispose() {\n\n\t\tthis.disconnect();\n\n\t}\n\n\t_updatePointer( event ) {\n\n\t\tconst rect = this.domElement.getBoundingClientRect();\n\n\t\t_pointer.x = ( event.clientX - rect.left ) / rect.width * 2 - 1;\n\t\t_pointer.y = - ( event.clientY - rect.top ) / rect.height * 2 + 1;\n\n\t}\n\n\t_updateState( event ) {\n\n\t\t// determine action\n\n\t\tlet action;\n\n\t\tif ( event.pointerType === 'touch' ) {\n\n\t\t\taction = this.touches.ONE;\n\n\t\t} else {\n\n\t\t\tswitch ( event.button ) {\n\n\t\t\t\tcase 0:\n\n\t\t\t\t\taction = this.mouseButtons.LEFT;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 1:\n\n\t\t\t\t\taction = this.mouseButtons.MIDDLE;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2:\n\n\t\t\t\t\taction = this.mouseButtons.RIGHT;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\taction = null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// determine state\n\n\t\tswitch ( action ) {\n\n\t\t\tcase MOUSE.PAN:\n\t\t\tcase TOUCH.PAN:\n\n\t\t\t\tthis.state = STATE.PAN;\n\n\t\t\t\tbreak;\n\n\t\t\tcase MOUSE.ROTATE:\n\t\t\tcase TOUCH.ROTATE:\n\n\t\t\t\tthis.state = STATE.ROTATE;\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tthis.state = STATE.NONE;\n\n\t\t}\n\n\t}\n\n}\n\nfunction onPointerMove( event ) {\n\n\tconst camera = this.object;\n\tconst domElement = this.domElement;\n\tconst raycaster = this.raycaster;\n\n\tif ( this.enabled === false ) return;\n\n\tthis._updatePointer( event );\n\n\traycaster.setFromCamera( _pointer, camera );\n\n\tif ( _selected ) {\n\n\t\tif ( this.state === STATE.PAN ) {\n\n\t\t\tif ( raycaster.ray.intersectPlane( _plane, _intersection ) ) {\n\n\t\t\t\t_selected.position.copy( _intersection.sub( _offset ).applyMatrix4( _inverseMatrix ) );\n\t\t\t\tthis.dispatchEvent( { type: 'drag', object: _selected } );\n\n\t\t\t}\n\n\t\t} else if ( this.state === STATE.ROTATE ) {\n\n\t\t\t_diff.subVectors( _pointer, _previousPointer ).multiplyScalar( this.rotateSpeed );\n\t\t\t_selected.rotateOnWorldAxis( _up, _diff.x );\n\t\t\t_selected.rotateOnWorldAxis( _right.normalize(), - _diff.y );\n\t\t\tthis.dispatchEvent( { type: 'drag', object: _selected } );\n\n\t\t}\n\n\t\t_previousPointer.copy( _pointer );\n\n\t} else {\n\n\t\t// hover support\n\n\t\tif ( event.pointerType === 'mouse' || event.pointerType === 'pen' ) {\n\n\t\t\t_intersections.length = 0;\n\n\t\t\traycaster.setFromCamera( _pointer, camera );\n\t\t\traycaster.intersectObjects( this.objects, this.recursive, _intersections );\n\n\t\t\tif ( _intersections.length > 0 ) {\n\n\t\t\t\tconst object = _intersections[ 0 ].object;\n\n\t\t\t\t_plane.setFromNormalAndCoplanarPoint( camera.getWorldDirection( _plane.normal ), _worldPosition.setFromMatrixPosition( object.matrixWorld ) );\n\n\t\t\t\tif ( _hovered !== object && _hovered !== null ) {\n\n\t\t\t\t\tthis.dispatchEvent( { type: 'hoveroff', object: _hovered } );\n\n\t\t\t\t\tdomElement.style.cursor = 'auto';\n\t\t\t\t\t_hovered = null;\n\n\t\t\t\t}\n\n\t\t\t\tif ( _hovered !== object ) {\n\n\t\t\t\t\tthis.dispatchEvent( { type: 'hoveron', object: object } );\n\n\t\t\t\t\tdomElement.style.cursor = 'pointer';\n\t\t\t\t\t_hovered = object;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( _hovered !== null ) {\n\n\t\t\t\t\tthis.dispatchEvent( { type: 'hoveroff', object: _hovered } );\n\n\t\t\t\t\tdomElement.style.cursor = 'auto';\n\t\t\t\t\t_hovered = null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_previousPointer.copy( _pointer );\n\n}\n\nfunction onPointerDown( event ) {\n\n\tconst camera = this.object;\n\tconst domElement = this.domElement;\n\tconst raycaster = this.raycaster;\n\n\tif ( this.enabled === false ) return;\n\n\tthis._updatePointer( event );\n\tthis._updateState( event );\n\n\t_intersections.length = 0;\n\n\traycaster.setFromCamera( _pointer, camera );\n\traycaster.intersectObjects( this.objects, this.recursive, _intersections );\n\n\tif ( _intersections.length > 0 ) {\n\n\t\tif ( this.transformGroup === true ) {\n\n\t\t\t// look for the outermost group in the object's upper hierarchy\n\n\t\t\t_selected = findGroup( _intersections[ 0 ].object );\n\n\t\t} else {\n\n\t\t\t_selected = _intersections[ 0 ].object;\n\n\t\t}\n\n\t\t_plane.setFromNormalAndCoplanarPoint( camera.getWorldDirection( _plane.normal ), _worldPosition.setFromMatrixPosition( _selected.matrixWorld ) );\n\n\t\tif ( raycaster.ray.intersectPlane( _plane, _intersection ) ) {\n\n\t\t\tif ( this.state === STATE.PAN ) {\n\n\t\t\t\t_inverseMatrix.copy( _selected.parent.matrixWorld ).invert();\n\t\t\t\t_offset.copy( _intersection ).sub( _worldPosition.setFromMatrixPosition( _selected.matrixWorld ) );\n\t\t\t\tdomElement.style.cursor = 'move';\n\t\t\t\tthis.dispatchEvent( { type: 'dragstart', object: _selected } );\n\n\t\t\t} else if ( this.state === STATE.ROTATE ) {\n\n\t\t\t\t// the controls only support Y+ up\n\t\t\t\t_up.set( 0, 1, 0 ).applyQuaternion( camera.quaternion ).normalize();\n\t\t\t\t_right.set( 1, 0, 0 ).applyQuaternion( camera.quaternion ).normalize();\n\t\t\t\tdomElement.style.cursor = 'move';\n\t\t\t\tthis.dispatchEvent( { type: 'dragstart', object: _selected } );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_previousPointer.copy( _pointer );\n\n}\n\nfunction onPointerCancel() {\n\n\tif ( this.enabled === false ) return;\n\n\tif ( _selected ) {\n\n\t\tthis.dispatchEvent( { type: 'dragend', object: _selected } );\n\n\t\t_selected = null;\n\n\t}\n\n\tthis.domElement.style.cursor = _hovered ? 'pointer' : 'auto';\n\n\tthis.state = STATE.NONE;\n\n}\n\nfunction onContextMenu( event ) {\n\n\tif ( this.enabled === false ) return;\n\n\tevent.preventDefault();\n\n}\n\nfunction findGroup( obj, group = null ) {\n\n\tif ( obj.isGroup ) group = obj;\n\n\tif ( obj.parent === null ) return group;\n\n\treturn findGroup( obj.parent, group );\n\n}\n\n/**\n * Fires when the user drags a 3D object.\n *\n * @event DragControls#drag\n * @type {Object}\n */\n\n/**\n * Fires when the user has finished dragging a 3D object.\n *\n * @event DragControls#dragend\n * @type {Object}\n */\n\n/**\n * Fires when the pointer is moved onto a 3D object, or onto one of its children.\n *\n * @event DragControls#hoveron\n * @type {Object}\n */\n\n/**\n * Fires when the pointer is moved out of a 3D object.\n *\n * @event DragControls#hoveroff\n * @type {Object}\n */\n\nexport { DragControls };\n", "import {\n\tControls,\n\tMathUtils,\n\tSpherical,\n\tVector3\n} from 'three';\n\nconst _lookDirection = new Vector3();\nconst _spherical = new Spherical();\nconst _target = new Vector3();\nconst _targetPosition = new Vector3();\n\n/**\n * This class is an alternative implementation of {@link FlyControls}.\n *\n * @augments Controls\n * @three_import import { FirstPersonControls } from 'three/addons/controls/FirstPersonControls.js';\n */\nclass FirstPersonControls extends Controls {\n\n\t/**\n\t * Constructs a new controls instance.\n\t *\n\t * @param {Object3D} object - The object that is managed by the controls.\n\t * @param {?HTMLElement} domElement - The HTML element used for event listeners.\n\t */\n\tconstructor( object, domElement = null ) {\n\n\t\tsuper( object, domElement );\n\n\t\t/**\n\t\t * The movement speed.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.movementSpeed = 1.0;\n\n\t\t/**\n\t\t * The look around speed.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.005\n\t\t */\n\t\tthis.lookSpeed = 0.005;\n\n\t\t/**\n\t\t * Whether it's possible to vertically look around or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.lookVertical = true;\n\n\t\t/**\n\t\t * Whether the camera is automatically moved forward or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.autoForward = false;\n\n\t\t/**\n\t\t * Whether it's possible to look around or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.activeLook = true;\n\n\t\t/**\n\t\t * Whether or not the camera's height influences the forward movement speed.\n\t\t * Use the properties `heightCoef`, `heightMin` and `heightMax` for configuration.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.heightSpeed = false;\n\n\t\t/**\n\t\t * Determines how much faster the camera moves when it's y-component is near `heightMax`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.heightCoef = 1.0;\n\n\t\t/**\n\t\t * Lower camera height limit used for movement speed adjustment.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.heightMin = 0.0;\n\n\t\t/**\n\t\t * Upper camera height limit used for movement speed adjustment.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.heightMax = 1.0;\n\n\t\t/**\n\t\t * Whether or not looking around is vertically constrained by `verticalMin` and `verticalMax`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.constrainVertical = false;\n\n\t\t/**\n\t\t * How far you can vertically look around, lower limit. Range is `0` to `Math.PI` in radians.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.verticalMin = 0;\n\n\t\t/**\n\t\t * How far you can vertically look around, upper limit. Range is `0` to `Math.PI` in radians.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.verticalMax = Math.PI;\n\n\t\t/**\n\t\t * Whether the mouse is pressed down or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.mouseDragOn = false;\n\n\t\t// internals\n\n\t\tthis._autoSpeedFactor = 0.0;\n\n\t\tthis._pointerX = 0;\n\t\tthis._pointerY = 0;\n\n\t\tthis._moveForward = false;\n\t\tthis._moveBackward = false;\n\t\tthis._moveLeft = false;\n\t\tthis._moveRight = false;\n\n\t\tthis._viewHalfX = 0;\n\t\tthis._viewHalfY = 0;\n\n\t\tthis._lat = 0;\n\t\tthis._lon = 0;\n\n\t\t// event listeners\n\n\t\tthis._onPointerMove = onPointerMove.bind( this );\n\t\tthis._onPointerDown = onPointerDown.bind( this );\n\t\tthis._onPointerUp = onPointerUp.bind( this );\n\t\tthis._onContextMenu = onContextMenu.bind( this );\n\t\tthis._onKeyDown = onKeyDown.bind( this );\n\t\tthis._onKeyUp = onKeyUp.bind( this );\n\n\t\t//\n\n\t\tif ( domElement !== null ) {\n\n\t\t\tthis.connect( domElement );\n\n\t\t\tthis.handleResize();\n\n\t\t}\n\n\t\tthis._setOrientation();\n\n\t}\n\n\tconnect( element ) {\n\n\t\tsuper.connect( element );\n\n\t\twindow.addEventListener( 'keydown', this._onKeyDown );\n\t\twindow.addEventListener( 'keyup', this._onKeyUp );\n\n\t\tthis.domElement.addEventListener( 'pointermove', this._onPointerMove );\n\t\tthis.domElement.addEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.domElement.addEventListener( 'pointerup', this._onPointerUp );\n\t\tthis.domElement.addEventListener( 'contextmenu', this._onContextMenu );\n\n\t}\n\n\tdisconnect() {\n\n\t\twindow.removeEventListener( 'keydown', this._onKeyDown );\n\t\twindow.removeEventListener( 'keyup', this._onKeyUp );\n\n\t\tthis.domElement.removeEventListener( 'pointermove', this._onPointerMove );\n\t\tthis.domElement.removeEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.domElement.removeEventListener( 'pointerup', this._onPointerUp );\n\t\tthis.domElement.removeEventListener( 'contextmenu', this._onContextMenu );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.disconnect();\n\n\t}\n\n\t/**\n\t * Must be called if the application window is resized.\n\t */\n\thandleResize() {\n\n\t\tif ( this.domElement === document ) {\n\n\t\t\tthis._viewHalfX = window.innerWidth / 2;\n\t\t\tthis._viewHalfY = window.innerHeight / 2;\n\n\t\t} else {\n\n\t\t\tthis._viewHalfX = this.domElement.offsetWidth / 2;\n\t\t\tthis._viewHalfY = this.domElement.offsetHeight / 2;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Rotates the camera towards the defined target position.\n\t *\n\t * @param {number|Vector3} x - The x coordinate of the target position or alternatively a vector representing the target position.\n\t * @param {number} y - The y coordinate of the target position.\n\t * @param {number} z - The z coordinate of the target position.\n\t * @return {FirstPersonControls} A reference to this controls.\n\t */\n\tlookAt( x, y, z ) {\n\n\t\tif ( x.isVector3 ) {\n\n\t\t\t_target.copy( x );\n\n\t\t} else {\n\n\t\t\t_target.set( x, y, z );\n\n\t\t}\n\n\t\tthis.object.lookAt( _target );\n\n\t\tthis._setOrientation();\n\n\t\treturn this;\n\n\t}\n\n\tupdate( delta ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\tif ( this.heightSpeed ) {\n\n\t\t\tconst y = MathUtils.clamp( this.object.position.y, this.heightMin, this.heightMax );\n\t\t\tconst heightDelta = y - this.heightMin;\n\n\t\t\tthis._autoSpeedFactor = delta * ( heightDelta * this.heightCoef );\n\n\t\t} else {\n\n\t\t\tthis._autoSpeedFactor = 0.0;\n\n\t\t}\n\n\t\tconst actualMoveSpeed = delta * this.movementSpeed;\n\n\t\tif ( this._moveForward || ( this.autoForward && ! this._moveBackward ) ) this.object.translateZ( - ( actualMoveSpeed + this._autoSpeedFactor ) );\n\t\tif ( this._moveBackward ) this.object.translateZ( actualMoveSpeed );\n\n\t\tif ( this._moveLeft ) this.object.translateX( - actualMoveSpeed );\n\t\tif ( this._moveRight ) this.object.translateX( actualMoveSpeed );\n\n\t\tif ( this._moveUp ) this.object.translateY( actualMoveSpeed );\n\t\tif ( this._moveDown ) this.object.translateY( - actualMoveSpeed );\n\n\t\tlet actualLookSpeed = delta * this.lookSpeed;\n\n\t\tif ( ! this.activeLook ) {\n\n\t\t\tactualLookSpeed = 0;\n\n\t\t}\n\n\t\tlet verticalLookRatio = 1;\n\n\t\tif ( this.constrainVertical ) {\n\n\t\t\tverticalLookRatio = Math.PI / ( this.verticalMax - this.verticalMin );\n\n\t\t}\n\n\t\tthis._lon -= this._pointerX * actualLookSpeed;\n\t\tif ( this.lookVertical ) this._lat -= this._pointerY * actualLookSpeed * verticalLookRatio;\n\n\t\tthis._lat = Math.max( - 85, Math.min( 85, this._lat ) );\n\n\t\tlet phi = MathUtils.degToRad( 90 - this._lat );\n\t\tconst theta = MathUtils.degToRad( this._lon );\n\n\t\tif ( this.constrainVertical ) {\n\n\t\t\tphi = MathUtils.mapLinear( phi, 0, Math.PI, this.verticalMin, this.verticalMax );\n\n\t\t}\n\n\t\tconst position = this.object.position;\n\n\t\t_targetPosition.setFromSphericalCoords( 1, phi, theta ).add( position );\n\n\t\tthis.object.lookAt( _targetPosition );\n\n\t}\n\n\t_setOrientation() {\n\n\t\tconst quaternion = this.object.quaternion;\n\n\t\t_lookDirection.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\t\t_spherical.setFromVector3( _lookDirection );\n\n\t\tthis._lat = 90 - MathUtils.radToDeg( _spherical.phi );\n\t\tthis._lon = MathUtils.radToDeg( _spherical.theta );\n\n\t}\n\n}\n\nfunction onPointerDown( event ) {\n\n\tif ( this.domElement !== document ) {\n\n\t\tthis.domElement.focus();\n\n\t}\n\n\tif ( this.activeLook ) {\n\n\t\tswitch ( event.button ) {\n\n\t\t\tcase 0: this._moveForward = true; break;\n\t\t\tcase 2: this._moveBackward = true; break;\n\n\t\t}\n\n\t}\n\n\tthis.mouseDragOn = true;\n\n}\n\nfunction onPointerUp( event ) {\n\n\tif ( this.activeLook ) {\n\n\t\tswitch ( event.button ) {\n\n\t\t\tcase 0: this._moveForward = false; break;\n\t\t\tcase 2: this._moveBackward = false; break;\n\n\t\t}\n\n\t}\n\n\tthis.mouseDragOn = false;\n\n}\n\nfunction onPointerMove( event ) {\n\n\tif ( this.domElement === document ) {\n\n\t\tthis._pointerX = event.pageX - this._viewHalfX;\n\t\tthis._pointerY = event.pageY - this._viewHalfY;\n\n\t} else {\n\n\t\tthis._pointerX = event.pageX - this.domElement.offsetLeft - this._viewHalfX;\n\t\tthis._pointerY = event.pageY - this.domElement.offsetTop - this._viewHalfY;\n\n\t}\n\n}\n\nfunction onKeyDown( event ) {\n\n\tswitch ( event.code ) {\n\n\t\tcase 'ArrowUp':\n\t\tcase 'KeyW': this._moveForward = true; break;\n\n\t\tcase 'ArrowLeft':\n\t\tcase 'KeyA': this._moveLeft = true; break;\n\n\t\tcase 'ArrowDown':\n\t\tcase 'KeyS': this._moveBackward = true; break;\n\n\t\tcase 'ArrowRight':\n\t\tcase 'KeyD': this._moveRight = true; break;\n\n\t\tcase 'KeyR': this._moveUp = true; break;\n\t\tcase 'KeyF': this._moveDown = true; break;\n\n\t}\n\n}\n\nfunction onKeyUp( event ) {\n\n\tswitch ( event.code ) {\n\n\t\tcase 'ArrowUp':\n\t\tcase 'KeyW': this._moveForward = false; break;\n\n\t\tcase 'ArrowLeft':\n\t\tcase 'KeyA': this._moveLeft = false; break;\n\n\t\tcase 'ArrowDown':\n\t\tcase 'KeyS': this._moveBackward = false; break;\n\n\t\tcase 'ArrowRight':\n\t\tcase 'KeyD': this._moveRight = false; break;\n\n\t\tcase 'KeyR': this._moveUp = false; break;\n\t\tcase 'KeyF': this._moveDown = false; break;\n\n\t}\n\n}\n\nfunction onContextMenu( event ) {\n\n\tif ( this.enabled === false ) return;\n\n\tevent.preventDefault();\n\n}\n\nexport { FirstPersonControls };\n", "import {\n\tControls,\n\tQuaternion,\n\tVector3\n} from 'three';\n\n/**\n * Fires when the camera has been transformed by the controls.\n *\n * @event FlyControls#change\n * @type {Object}\n */\nconst _changeEvent = { type: 'change' };\n\nconst _EPS = 0.000001;\nconst _tmpQuaternion = new Quaternion();\n\n/**\n * This class enables a navigation similar to fly modes in DCC tools like Blender.\n * You can arbitrarily transform the camera in 3D space without any limitations\n * (e.g. focus on a specific target).\n *\n * @augments Controls\n * @three_import import { FlyControls } from 'three/addons/controls/FlyControls.js';\n */\nclass FlyControls extends Controls {\n\n\t/**\n\t * Constructs a new controls instance.\n\t *\n\t * @param {Object3D} object - The object that is managed by the controls.\n\t * @param {?HTMLElement} domElement - The HTML element used for event listeners.\n\t */\n\tconstructor( object, domElement = null ) {\n\n\t\tsuper( object, domElement );\n\n\t\t/**\n\t\t * The movement speed.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.movementSpeed = 1.0;\n\n\t\t/**\n\t\t * The rotation speed.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.005\n\t\t */\n\t\tthis.rollSpeed = 0.005;\n\n\t\t/**\n\t\t * If set to `true`, you can only look around by performing a drag interaction.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.dragToLook = false;\n\n\t\t/**\n\t\t * If set to `true`, the camera automatically moves forward (and does not stop) when initially translated.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.autoForward = false;\n\n\t\t// internals\n\n\t\tthis._moveState = { up: 0, down: 0, left: 0, right: 0, forward: 0, back: 0, pitchUp: 0, pitchDown: 0, yawLeft: 0, yawRight: 0, rollLeft: 0, rollRight: 0 };\n\t\tthis._moveVector = new Vector3( 0, 0, 0 );\n\t\tthis._rotationVector = new Vector3( 0, 0, 0 );\n\t\tthis._lastQuaternion = new Quaternion();\n\t\tthis._lastPosition = new Vector3();\n\t\tthis._status = 0;\n\n\t\t// event listeners\n\n\t\tthis._onKeyDown = onKeyDown.bind( this );\n\t\tthis._onKeyUp = onKeyUp.bind( this );\n\t\tthis._onPointerMove = onPointerMove.bind( this );\n\t\tthis._onPointerDown = onPointerDown.bind( this );\n\t\tthis._onPointerUp = onPointerUp.bind( this );\n\t\tthis._onPointerCancel = onPointerCancel.bind( this );\n\t\tthis._onContextMenu = onContextMenu.bind( this );\n\n\t\t//\n\n\t\tif ( domElement !== null ) {\n\n\t\t\tthis.connect( domElement );\n\n\t\t}\n\n\t}\n\n\tconnect( element ) {\n\n\t\tsuper.connect( element );\n\n\t\twindow.addEventListener( 'keydown', this._onKeyDown );\n\t\twindow.addEventListener( 'keyup', this._onKeyUp );\n\n\t\tthis.domElement.addEventListener( 'pointermove', this._onPointerMove );\n\t\tthis.domElement.addEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.domElement.addEventListener( 'pointerup', this._onPointerUp );\n\t\tthis.domElement.addEventListener( 'pointercancel', this._onPointerCancel );\n\t\tthis.domElement.addEventListener( 'contextmenu', this._onContextMenu );\n\n\t}\n\n\tdisconnect() {\n\n\t\twindow.removeEventListener( 'keydown', this._onKeyDown );\n\t\twindow.removeEventListener( 'keyup', this._onKeyUp );\n\n\t\tthis.domElement.removeEventListener( 'pointermove', this._onPointerMove );\n\t\tthis.domElement.removeEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.domElement.removeEventListener( 'pointerup', this._onPointerUp );\n\t\tthis.domElement.removeEventListener( 'pointercancel', this._onPointerCancel );\n\t\tthis.domElement.removeEventListener( 'contextmenu', this._onContextMenu );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.disconnect();\n\n\t}\n\n\tupdate( delta ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\tconst object = this.object;\n\n\t\tconst moveMult = delta * this.movementSpeed;\n\t\tconst rotMult = delta * this.rollSpeed;\n\n\t\tobject.translateX( this._moveVector.x * moveMult );\n\t\tobject.translateY( this._moveVector.y * moveMult );\n\t\tobject.translateZ( this._moveVector.z * moveMult );\n\n\t\t_tmpQuaternion.set( this._rotationVector.x * rotMult, this._rotationVector.y * rotMult, this._rotationVector.z * rotMult, 1 ).normalize();\n\t\tobject.quaternion.multiply( _tmpQuaternion );\n\n\t\tif (\n\t\t\tthis._lastPosition.distanceToSquared( object.position ) > _EPS ||\n\t\t\t8 * ( 1 - this._lastQuaternion.dot( object.quaternion ) ) > _EPS\n\t\t) {\n\n\t\t\tthis.dispatchEvent( _changeEvent );\n\t\t\tthis._lastQuaternion.copy( object.quaternion );\n\t\t\tthis._lastPosition.copy( object.position );\n\n\t\t}\n\n\t}\n\n\t// private\n\n\t_updateMovementVector() {\n\n\t\tconst forward = ( this._moveState.forward || ( this.autoForward && ! this._moveState.back ) ) ? 1 : 0;\n\n\t\tthis._moveVector.x = ( - this._moveState.left + this._moveState.right );\n\t\tthis._moveVector.y = ( - this._moveState.down + this._moveState.up );\n\t\tthis._moveVector.z = ( - forward + this._moveState.back );\n\n\t\t//console.log( 'move:', [ this._moveVector.x, this._moveVector.y, this._moveVector.z ] );\n\n\t}\n\n\t_updateRotationVector() {\n\n\t\tthis._rotationVector.x = ( - this._moveState.pitchDown + this._moveState.pitchUp );\n\t\tthis._rotationVector.y = ( - this._moveState.yawRight + this._moveState.yawLeft );\n\t\tthis._rotationVector.z = ( - this._moveState.rollRight + this._moveState.rollLeft );\n\n\t\t//console.log( 'rotate:', [ this._rotationVector.x, this._rotationVector.y, this._rotationVector.z ] );\n\n\t}\n\n\t_getContainerDimensions() {\n\n\t\tif ( this.domElement != document ) {\n\n\t\t\treturn {\n\t\t\t\tsize: [ this.domElement.offsetWidth, this.domElement.offsetHeight ],\n\t\t\t\toffset: [ this.domElement.offsetLeft, this.domElement.offsetTop ]\n\t\t\t};\n\n\t\t} else {\n\n\t\t\treturn {\n\t\t\t\tsize: [ window.innerWidth, window.innerHeight ],\n\t\t\t\toffset: [ 0, 0 ]\n\t\t\t};\n\n\t\t}\n\n\t}\n\n}\n\nfunction onKeyDown( event ) {\n\n\tif ( event.altKey || this.enabled === false ) {\n\n\t\treturn;\n\n\t}\n\n\tswitch ( event.code ) {\n\n\t\tcase 'ShiftLeft':\n\t\tcase 'ShiftRight': this.movementSpeedMultiplier = .1; break;\n\n\t\tcase 'KeyW': this._moveState.forward = 1; break;\n\t\tcase 'KeyS': this._moveState.back = 1; break;\n\n\t\tcase 'KeyA': this._moveState.left = 1; break;\n\t\tcase 'KeyD': this._moveState.right = 1; break;\n\n\t\tcase 'KeyR': this._moveState.up = 1; break;\n\t\tcase 'KeyF': this._moveState.down = 1; break;\n\n\t\tcase 'ArrowUp': this._moveState.pitchUp = 1; break;\n\t\tcase 'ArrowDown': this._moveState.pitchDown = 1; break;\n\n\t\tcase 'ArrowLeft': this._moveState.yawLeft = 1; break;\n\t\tcase 'ArrowRight': this._moveState.yawRight = 1; break;\n\n\t\tcase 'KeyQ': this._moveState.rollLeft = 1; break;\n\t\tcase 'KeyE': this._moveState.rollRight = 1; break;\n\n\t}\n\n\tthis._updateMovementVector();\n\tthis._updateRotationVector();\n\n}\n\nfunction onKeyUp( event ) {\n\n\tif ( this.enabled === false ) return;\n\n\tswitch ( event.code ) {\n\n\t\tcase 'ShiftLeft':\n\t\tcase 'ShiftRight': this.movementSpeedMultiplier = 1; break;\n\n\t\tcase 'KeyW': this._moveState.forward = 0; break;\n\t\tcase 'KeyS': this._moveState.back = 0; break;\n\n\t\tcase 'KeyA': this._moveState.left = 0; break;\n\t\tcase 'KeyD': this._moveState.right = 0; break;\n\n\t\tcase 'KeyR': this._moveState.up = 0; break;\n\t\tcase 'KeyF': this._moveState.down = 0; break;\n\n\t\tcase 'ArrowUp': this._moveState.pitchUp = 0; break;\n\t\tcase 'ArrowDown': this._moveState.pitchDown = 0; break;\n\n\t\tcase 'ArrowLeft': this._moveState.yawLeft = 0; break;\n\t\tcase 'ArrowRight': this._moveState.yawRight = 0; break;\n\n\t\tcase 'KeyQ': this._moveState.rollLeft = 0; break;\n\t\tcase 'KeyE': this._moveState.rollRight = 0; break;\n\n\t}\n\n\tthis._updateMovementVector();\n\tthis._updateRotationVector();\n\n}\n\nfunction onPointerDown( event ) {\n\n\tif ( this.enabled === false ) return;\n\n\tif ( this.dragToLook ) {\n\n\t\tthis._status ++;\n\n\t} else {\n\n\t\tswitch ( event.button ) {\n\n\t\t\tcase 0: this._moveState.forward = 1; break;\n\t\t\tcase 2: this._moveState.back = 1; break;\n\n\t\t}\n\n\t\tthis._updateMovementVector();\n\n\t}\n\n}\n\nfunction onPointerMove( event ) {\n\n\tif ( this.enabled === false ) return;\n\n\tif ( ! this.dragToLook || this._status > 0 ) {\n\n\t\tconst container = this._getContainerDimensions();\n\t\tconst halfWidth = container.size[ 0 ] / 2;\n\t\tconst halfHeight = container.size[ 1 ] / 2;\n\n\t\tthis._moveState.yawLeft = - ( ( event.pageX - container.offset[ 0 ] ) - halfWidth ) / halfWidth;\n\t\tthis._moveState.pitchDown = ( ( event.pageY - container.offset[ 1 ] ) - halfHeight ) / halfHeight;\n\n\t\tthis._updateRotationVector();\n\n\t}\n\n}\n\nfunction onPointerUp( event ) {\n\n\tif ( this.enabled === false ) return;\n\n\tif ( this.dragToLook ) {\n\n\t\tthis._status --;\n\n\t\tthis._moveState.yawLeft = this._moveState.pitchDown = 0;\n\n\t} else {\n\n\t\tswitch ( event.button ) {\n\n\t\t\tcase 0: this._moveState.forward = 0; break;\n\t\t\tcase 2: this._moveState.back = 0; break;\n\n\t\t}\n\n\t\tthis._updateMovementVector();\n\n\t}\n\n\tthis._updateRotationVector();\n\n}\n\nfunction onPointerCancel() {\n\n\tif ( this.enabled === false ) return;\n\n\tif ( this.dragToLook ) {\n\n\t\tthis._status = 0;\n\n\t\tthis._moveState.yawLeft = this._moveState.pitchDown = 0;\n\n\t} else {\n\n\t\tthis._moveState.forward = 0;\n\t\tthis._moveState.back = 0;\n\n\t\tthis._updateMovementVector();\n\n\t}\n\n\tthis._updateRotationVector();\n\n}\n\nfunction onContextMenu( event ) {\n\n\tif ( this.enabled === false ) return;\n\n\tevent.preventDefault();\n\n}\n\nexport { FlyControls };\n", "import {\n\tControls,\n\tMOUSE,\n\tQuaternion,\n\tSpherical,\n\tTOUCH,\n\tVector2,\n\tVector3,\n\tPlane,\n\tRay,\n\tMathUtils\n} from 'three';\n\n/**\n * Fires when the camera has been transformed by the controls.\n *\n * @event OrbitControls#change\n * @type {Object}\n */\nconst _changeEvent = { type: 'change' };\n\n/**\n * Fires when an interaction was initiated.\n *\n * @event OrbitControls#start\n * @type {Object}\n */\nconst _startEvent = { type: 'start' };\n\n/**\n * Fires when an interaction has finished.\n *\n * @event OrbitControls#end\n * @type {Object}\n */\nconst _endEvent = { type: 'end' };\n\nconst _ray = new Ray();\nconst _plane = new Plane();\nconst _TILT_LIMIT = Math.cos( 70 * MathUtils.DEG2RAD );\n\nconst _v = new Vector3();\nconst _twoPI = 2 * Math.PI;\n\nconst _STATE = {\n\tNONE: - 1,\n\tROTATE: 0,\n\tDOLLY: 1,\n\tPAN: 2,\n\tTOUCH_ROTATE: 3,\n\tTOUCH_PAN: 4,\n\tTOUCH_DOLLY_PAN: 5,\n\tTOUCH_DOLLY_ROTATE: 6\n};\nconst _EPS = 0.000001;\n\n\n/**\n * Orbit controls allow the camera to orbit around a target.\n *\n * OrbitControls performs orbiting, dollying (zooming), and panning. Unlike {@link TrackballControls},\n * it maintains the \"up\" direction `object.up` (+Y by default).\n *\n * - Orbit: Left mouse / touch: one-finger move.\n * - Zoom: Middle mouse, or mousewheel / touch: two-finger spread or squish.\n * - Pan: Right mouse, or left mouse + ctrl/meta/shiftKey, or arrow keys / touch: two-finger move.\n *\n * ```js\n * const controls = new OrbitControls( camera, renderer.domElement );\n *\n * // controls.update() must be called after any manual changes to the camera's transform\n * camera.position.set( 0, 20, 100 );\n * controls.update();\n *\n * function animate() {\n *\n * \t// required if controls.enableDamping or controls.autoRotate are set to true\n * \tcontrols.update();\n *\n * \trenderer.render( scene, camera );\n *\n * }\n * ```\n *\n * @augments Controls\n * @three_import import { OrbitControls } from 'three/addons/controls/OrbitControls.js';\n */\nclass OrbitControls extends Controls {\n\n\t/**\n\t * Constructs a new controls instance.\n\t *\n\t * @param {Object3D} object - The object that is managed by the controls.\n\t * @param {?HTMLElement} domElement - The HTML element used for event listeners.\n\t */\n\tconstructor( object, domElement = null ) {\n\n\t\tsuper( object, domElement );\n\n\t\tthis.state = _STATE.NONE;\n\n\t\t/**\n\t\t * The focus point of the controls, the `object` orbits around this.\n\t\t * It can be updated manually at any point to change the focus of the controls.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.target = new Vector3();\n\n\t\t/**\n\t\t * The focus point of the `minTargetRadius` and `maxTargetRadius` limits.\n\t\t * It can be updated manually at any point to change the center of interest\n\t\t * for the `target`.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.cursor = new Vector3();\n\n\t\t/**\n\t\t * How far you can dolly in (perspective camera only).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.minDistance = 0;\n\n\t\t/**\n\t\t * How far you can dolly out (perspective camera only).\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.maxDistance = Infinity;\n\n\t\t/**\n\t\t * How far you can zoom in (orthographic camera only).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.minZoom = 0;\n\n\t\t/**\n\t\t * How far you can zoom out (orthographic camera only).\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.maxZoom = Infinity;\n\n\t\t/**\n\t\t * How close you can get the target to the 3D `cursor`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.minTargetRadius = 0;\n\n\t\t/**\n\t\t * How far you can move the target from the 3D `cursor`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.maxTargetRadius = Infinity;\n\n\t\t/**\n\t\t * How far you can orbit vertically, lower limit. Range is `[0, Math.PI]` radians.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.minPolarAngle = 0;\n\n\t\t/**\n\t\t * How far you can orbit vertically, upper limit. Range is `[0, Math.PI]` radians.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Math.PI\n\t\t */\n\t\tthis.maxPolarAngle = Math.PI;\n\n\t\t/**\n\t\t * How far you can orbit horizontally, lower limit. If set, the interval `[ min, max ]`\n\t\t * must be a sub-interval of `[ - 2 PI, 2 PI ]`, with `( max - min < 2 PI )`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -Infinity\n\t\t */\n\t\tthis.minAzimuthAngle = - Infinity;\n\n\t\t/**\n\t\t * How far you can orbit horizontally, upper limit. If set, the interval `[ min, max ]`\n\t\t * must be a sub-interval of `[ - 2 PI, 2 PI ]`, with `( max - min < 2 PI )`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -Infinity\n\t\t */\n\t\tthis.maxAzimuthAngle = Infinity;\n\n\t\t/**\n\t\t * Set to `true` to enable damping (inertia), which can be used to give a sense of weight\n\t\t * to the controls. Note that if this is enabled, you must call `update()` in your animation\n\t\t * loop.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.enableDamping = false;\n\n\t\t/**\n\t\t * The damping inertia used if `enableDamping` is set to `true`.\n\t\t *\n\t\t * Note that for this to work, you must call `update()` in your animation loop.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.05\n\t\t */\n\t\tthis.dampingFactor = 0.05;\n\n\t\t/**\n\t\t * Enable or disable zooming (dollying) of the camera.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enableZoom = true;\n\n\t\t/**\n\t\t * Speed of zooming / dollying.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.zoomSpeed = 1.0;\n\n\t\t/**\n\t\t * Enable or disable horizontal and vertical rotation of the camera.\n\t\t *\n\t\t * Note that it is possible to disable a single axis by setting the min and max of the\n\t\t * `minPolarAngle` or `minAzimuthAngle` to the same value, which will cause the vertical\n\t\t * or horizontal rotation to be fixed at that value.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enableRotate = true;\n\n\t\t/**\n\t\t * Speed of rotation.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.rotateSpeed = 1.0;\n\n\t\t/**\n\t\t * How fast to rotate the camera when the keyboard is used.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.keyRotateSpeed = 1.0;\n\n\t\t/**\n\t\t * Enable or disable camera panning.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enablePan = true;\n\n\t\t/**\n\t\t * Speed of panning.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.panSpeed = 1.0;\n\n\t\t/**\n\t\t * Defines how the camera's position is translated when panning. If `true`, the camera pans\n\t\t * in screen space. Otherwise, the camera pans in the plane orthogonal to the camera's up\n\t\t * direction.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.screenSpacePanning = true;\n\n\t\t/**\n\t\t * How fast to pan the camera when the keyboard is used in\n\t\t * pixels per keypress.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 7\n\t\t */\n\t\tthis.keyPanSpeed = 7.0;\n\n\t\t/**\n\t\t * Setting this property to `true` allows to zoom to the cursor's position.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.zoomToCursor = false;\n\n\t\t/**\n\t\t * Set to true to automatically rotate around the target\n\t\t *\n\t\t * Note that if this is enabled, you must call `update()` in your animation loop.\n\t\t * If you want the auto-rotate speed to be independent of the frame rate (the refresh\n\t\t * rate of the display), you must pass the time `deltaTime`, in seconds, to `update()`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.autoRotate = false;\n\n\t\t/**\n\t\t * How fast to rotate around the target if `autoRotate` is `true`. The default  equates to 30 seconds\n\t\t * per orbit at 60fps.\n\t\t *\n\t\t * Note that if `autoRotate` is enabled, you must call `update()` in your animation loop.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2\n\t\t */\n\t\tthis.autoRotateSpeed = 2.0;\n\n\t\t/**\n\t\t * This object contains references to the keycodes for controlling camera panning.\n\t\t *\n\t\t * ```js\n\t\t * controls.keys = {\n\t\t * \tLEFT: 'ArrowLeft', //left arrow\n\t\t * \tUP: 'ArrowUp', // up arrow\n\t\t * \tRIGHT: 'ArrowRight', // right arrow\n\t\t * \tBOTTOM: 'ArrowDown' // down arrow\n\t\t * }\n\t\t * ```\n\t\t * @type {Object}\n\t\t */\n\t\tthis.keys = { LEFT: 'ArrowLeft', UP: 'ArrowUp', RIGHT: 'ArrowRight', BOTTOM: 'ArrowDown' };\n\n\t\t/**\n\t\t * This object contains references to the mouse actions used by the controls.\n\t\t *\n\t\t * ```js\n\t\t * controls.mouseButtons = {\n\t\t * \tLEFT: THREE.MOUSE.ROTATE,\n\t\t * \tMIDDLE: THREE.MOUSE.DOLLY,\n\t\t * \tRIGHT: THREE.MOUSE.PAN\n\t\t * }\n\t\t * ```\n\t\t * @type {Object}\n\t\t */\n\t\tthis.mouseButtons = { LEFT: MOUSE.ROTATE, MIDDLE: MOUSE.DOLLY, RIGHT: MOUSE.PAN };\n\n\t\t/**\n\t\t * This object contains references to the touch actions used by the controls.\n\t\t *\n\t\t * ```js\n\t\t * controls.mouseButtons = {\n\t\t * \tONE: THREE.TOUCH.ROTATE,\n\t\t * \tTWO: THREE.TOUCH.DOLLY_PAN\n\t\t * }\n\t\t * ```\n\t\t * @type {Object}\n\t\t */\n\t\tthis.touches = { ONE: TOUCH.ROTATE, TWO: TOUCH.DOLLY_PAN };\n\n\t\t/**\n\t\t * Used internally by `saveState()` and `reset()`.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.target0 = this.target.clone();\n\n\t\t/**\n\t\t * Used internally by `saveState()` and `reset()`.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.position0 = this.object.position.clone();\n\n\t\t/**\n\t\t * Used internally by `saveState()` and `reset()`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.zoom0 = this.object.zoom;\n\n\t\t// the target DOM element for key events\n\t\tthis._domElementKeyEvents = null;\n\n\t\t// internals\n\n\t\tthis._lastPosition = new Vector3();\n\t\tthis._lastQuaternion = new Quaternion();\n\t\tthis._lastTargetPosition = new Vector3();\n\n\t\t// so camera.up is the orbit axis\n\t\tthis._quat = new Quaternion().setFromUnitVectors( object.up, new Vector3( 0, 1, 0 ) );\n\t\tthis._quatInverse = this._quat.clone().invert();\n\n\t\t// current position in spherical coordinates\n\t\tthis._spherical = new Spherical();\n\t\tthis._sphericalDelta = new Spherical();\n\n\t\tthis._scale = 1;\n\t\tthis._panOffset = new Vector3();\n\n\t\tthis._rotateStart = new Vector2();\n\t\tthis._rotateEnd = new Vector2();\n\t\tthis._rotateDelta = new Vector2();\n\n\t\tthis._panStart = new Vector2();\n\t\tthis._panEnd = new Vector2();\n\t\tthis._panDelta = new Vector2();\n\n\t\tthis._dollyStart = new Vector2();\n\t\tthis._dollyEnd = new Vector2();\n\t\tthis._dollyDelta = new Vector2();\n\n\t\tthis._dollyDirection = new Vector3();\n\t\tthis._mouse = new Vector2();\n\t\tthis._performCursorZoom = false;\n\n\t\tthis._pointers = [];\n\t\tthis._pointerPositions = {};\n\n\t\tthis._controlActive = false;\n\n\t\t// event listeners\n\n\t\tthis._onPointerMove = onPointerMove.bind( this );\n\t\tthis._onPointerDown = onPointerDown.bind( this );\n\t\tthis._onPointerUp = onPointerUp.bind( this );\n\t\tthis._onContextMenu = onContextMenu.bind( this );\n\t\tthis._onMouseWheel = onMouseWheel.bind( this );\n\t\tthis._onKeyDown = onKeyDown.bind( this );\n\n\t\tthis._onTouchStart = onTouchStart.bind( this );\n\t\tthis._onTouchMove = onTouchMove.bind( this );\n\n\t\tthis._onMouseDown = onMouseDown.bind( this );\n\t\tthis._onMouseMove = onMouseMove.bind( this );\n\n\t\tthis._interceptControlDown = interceptControlDown.bind( this );\n\t\tthis._interceptControlUp = interceptControlUp.bind( this );\n\n\t\t//\n\n\t\tif ( this.domElement !== null ) {\n\n\t\t\tthis.connect( this.domElement );\n\n\t\t}\n\n\t\tthis.update();\n\n\t}\n\n\tconnect( element ) {\n\n\t\tsuper.connect( element );\n\n\t\tthis.domElement.addEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.domElement.addEventListener( 'pointercancel', this._onPointerUp );\n\n\t\tthis.domElement.addEventListener( 'contextmenu', this._onContextMenu );\n\t\tthis.domElement.addEventListener( 'wheel', this._onMouseWheel, { passive: false } );\n\n\t\tconst document = this.domElement.getRootNode(); // offscreen canvas compatibility\n\t\tdocument.addEventListener( 'keydown', this._interceptControlDown, { passive: true, capture: true } );\n\n\t\tthis.domElement.style.touchAction = 'none'; // disable touch scroll\n\n\t}\n\n\tdisconnect() {\n\n\t\tthis.domElement.removeEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.domElement.ownerDocument.removeEventListener( 'pointermove', this._onPointerMove );\n\t\tthis.domElement.ownerDocument.removeEventListener( 'pointerup', this._onPointerUp );\n\t\tthis.domElement.removeEventListener( 'pointercancel', this._onPointerUp );\n\n\t\tthis.domElement.removeEventListener( 'wheel', this._onMouseWheel );\n\t\tthis.domElement.removeEventListener( 'contextmenu', this._onContextMenu );\n\n\t\tthis.stopListenToKeyEvents();\n\n\t\tconst document = this.domElement.getRootNode(); // offscreen canvas compatibility\n\t\tdocument.removeEventListener( 'keydown', this._interceptControlDown, { capture: true } );\n\n\t\tthis.domElement.style.touchAction = 'auto';\n\n\t}\n\n\tdispose() {\n\n\t\tthis.disconnect();\n\n\t}\n\n\t/**\n\t * Get the current vertical rotation, in radians.\n\t *\n\t * @return {number} The current vertical rotation, in radians.\n\t */\n\tgetPolarAngle() {\n\n\t\treturn this._spherical.phi;\n\n\t}\n\n\t/**\n\t * Get the current horizontal rotation, in radians.\n\t *\n\t * @return {number} The current horizontal rotation, in radians.\n\t */\n\tgetAzimuthalAngle() {\n\n\t\treturn this._spherical.theta;\n\n\t}\n\n\t/**\n\t * Returns the distance from the camera to the target.\n\t *\n\t * @return {number} The distance from the camera to the target.\n\t */\n\tgetDistance() {\n\n\t\treturn this.object.position.distanceTo( this.target );\n\n\t}\n\n\t/**\n\t * Adds key event listeners to the given DOM element.\n\t * `window` is a recommended argument for using this method.\n\t *\n\t * @param {HTMLElement} domElement - The DOM element\n\t */\n\tlistenToKeyEvents( domElement ) {\n\n\t\tdomElement.addEventListener( 'keydown', this._onKeyDown );\n\t\tthis._domElementKeyEvents = domElement;\n\n\t}\n\n\t/**\n\t * Removes the key event listener previously defined with `listenToKeyEvents()`.\n\t */\n\tstopListenToKeyEvents() {\n\n\t\tif ( this._domElementKeyEvents !== null ) {\n\n\t\t\tthis._domElementKeyEvents.removeEventListener( 'keydown', this._onKeyDown );\n\t\t\tthis._domElementKeyEvents = null;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Save the current state of the controls. This can later be recovered with `reset()`.\n\t */\n\tsaveState() {\n\n\t\tthis.target0.copy( this.target );\n\t\tthis.position0.copy( this.object.position );\n\t\tthis.zoom0 = this.object.zoom;\n\n\t}\n\n\t/**\n\t * Reset the controls to their state from either the last time the `saveState()`\n\t * was called, or the initial state.\n\t */\n\treset() {\n\n\t\tthis.target.copy( this.target0 );\n\t\tthis.object.position.copy( this.position0 );\n\t\tthis.object.zoom = this.zoom0;\n\n\t\tthis.object.updateProjectionMatrix();\n\t\tthis.dispatchEvent( _changeEvent );\n\n\t\tthis.update();\n\n\t\tthis.state = _STATE.NONE;\n\n\t}\n\n\tupdate( deltaTime = null ) {\n\n\t\tconst position = this.object.position;\n\n\t\t_v.copy( position ).sub( this.target );\n\n\t\t// rotate offset to \"y-axis-is-up\" space\n\t\t_v.applyQuaternion( this._quat );\n\n\t\t// angle from z-axis around y-axis\n\t\tthis._spherical.setFromVector3( _v );\n\n\t\tif ( this.autoRotate && this.state === _STATE.NONE ) {\n\n\t\t\tthis._rotateLeft( this._getAutoRotationAngle( deltaTime ) );\n\n\t\t}\n\n\t\tif ( this.enableDamping ) {\n\n\t\t\tthis._spherical.theta += this._sphericalDelta.theta * this.dampingFactor;\n\t\t\tthis._spherical.phi += this._sphericalDelta.phi * this.dampingFactor;\n\n\t\t} else {\n\n\t\t\tthis._spherical.theta += this._sphericalDelta.theta;\n\t\t\tthis._spherical.phi += this._sphericalDelta.phi;\n\n\t\t}\n\n\t\t// restrict theta to be between desired limits\n\n\t\tlet min = this.minAzimuthAngle;\n\t\tlet max = this.maxAzimuthAngle;\n\n\t\tif ( isFinite( min ) && isFinite( max ) ) {\n\n\t\t\tif ( min < - Math.PI ) min += _twoPI; else if ( min > Math.PI ) min -= _twoPI;\n\n\t\t\tif ( max < - Math.PI ) max += _twoPI; else if ( max > Math.PI ) max -= _twoPI;\n\n\t\t\tif ( min <= max ) {\n\n\t\t\t\tthis._spherical.theta = Math.max( min, Math.min( max, this._spherical.theta ) );\n\n\t\t\t} else {\n\n\t\t\t\tthis._spherical.theta = ( this._spherical.theta > ( min + max ) / 2 ) ?\n\t\t\t\t\tMath.max( min, this._spherical.theta ) :\n\t\t\t\t\tMath.min( max, this._spherical.theta );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// restrict phi to be between desired limits\n\t\tthis._spherical.phi = Math.max( this.minPolarAngle, Math.min( this.maxPolarAngle, this._spherical.phi ) );\n\n\t\tthis._spherical.makeSafe();\n\n\n\t\t// move target to panned location\n\n\t\tif ( this.enableDamping === true ) {\n\n\t\t\tthis.target.addScaledVector( this._panOffset, this.dampingFactor );\n\n\t\t} else {\n\n\t\t\tthis.target.add( this._panOffset );\n\n\t\t}\n\n\t\t// Limit the target distance from the cursor to create a sphere around the center of interest\n\t\tthis.target.sub( this.cursor );\n\t\tthis.target.clampLength( this.minTargetRadius, this.maxTargetRadius );\n\t\tthis.target.add( this.cursor );\n\n\t\tlet zoomChanged = false;\n\t\t// adjust the camera position based on zoom only if we're not zooming to the cursor or if it's an ortho camera\n\t\t// we adjust zoom later in these cases\n\t\tif ( this.zoomToCursor && this._performCursorZoom || this.object.isOrthographicCamera ) {\n\n\t\t\tthis._spherical.radius = this._clampDistance( this._spherical.radius );\n\n\t\t} else {\n\n\t\t\tconst prevRadius = this._spherical.radius;\n\t\t\tthis._spherical.radius = this._clampDistance( this._spherical.radius * this._scale );\n\t\t\tzoomChanged = prevRadius != this._spherical.radius;\n\n\t\t}\n\n\t\t_v.setFromSpherical( this._spherical );\n\n\t\t// rotate offset back to \"camera-up-vector-is-up\" space\n\t\t_v.applyQuaternion( this._quatInverse );\n\n\t\tposition.copy( this.target ).add( _v );\n\n\t\tthis.object.lookAt( this.target );\n\n\t\tif ( this.enableDamping === true ) {\n\n\t\t\tthis._sphericalDelta.theta *= ( 1 - this.dampingFactor );\n\t\t\tthis._sphericalDelta.phi *= ( 1 - this.dampingFactor );\n\n\t\t\tthis._panOffset.multiplyScalar( 1 - this.dampingFactor );\n\n\t\t} else {\n\n\t\t\tthis._sphericalDelta.set( 0, 0, 0 );\n\n\t\t\tthis._panOffset.set( 0, 0, 0 );\n\n\t\t}\n\n\t\t// adjust camera position\n\t\tif ( this.zoomToCursor && this._performCursorZoom ) {\n\n\t\t\tlet newRadius = null;\n\t\t\tif ( this.object.isPerspectiveCamera ) {\n\n\t\t\t\t// move the camera down the pointer ray\n\t\t\t\t// this method avoids floating point error\n\t\t\t\tconst prevRadius = _v.length();\n\t\t\t\tnewRadius = this._clampDistance( prevRadius * this._scale );\n\n\t\t\t\tconst radiusDelta = prevRadius - newRadius;\n\t\t\t\tthis.object.position.addScaledVector( this._dollyDirection, radiusDelta );\n\t\t\t\tthis.object.updateMatrixWorld();\n\n\t\t\t\tzoomChanged = !! radiusDelta;\n\n\t\t\t} else if ( this.object.isOrthographicCamera ) {\n\n\t\t\t\t// adjust the ortho camera position based on zoom changes\n\t\t\t\tconst mouseBefore = new Vector3( this._mouse.x, this._mouse.y, 0 );\n\t\t\t\tmouseBefore.unproject( this.object );\n\n\t\t\t\tconst prevZoom = this.object.zoom;\n\t\t\t\tthis.object.zoom = Math.max( this.minZoom, Math.min( this.maxZoom, this.object.zoom / this._scale ) );\n\t\t\t\tthis.object.updateProjectionMatrix();\n\n\t\t\t\tzoomChanged = prevZoom !== this.object.zoom;\n\n\t\t\t\tconst mouseAfter = new Vector3( this._mouse.x, this._mouse.y, 0 );\n\t\t\t\tmouseAfter.unproject( this.object );\n\n\t\t\t\tthis.object.position.sub( mouseAfter ).add( mouseBefore );\n\t\t\t\tthis.object.updateMatrixWorld();\n\n\t\t\t\tnewRadius = _v.length();\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled.' );\n\t\t\t\tthis.zoomToCursor = false;\n\n\t\t\t}\n\n\t\t\t// handle the placement of the target\n\t\t\tif ( newRadius !== null ) {\n\n\t\t\t\tif ( this.screenSpacePanning ) {\n\n\t\t\t\t\t// position the orbit target in front of the new camera position\n\t\t\t\t\tthis.target.set( 0, 0, - 1 )\n\t\t\t\t\t\t.transformDirection( this.object.matrix )\n\t\t\t\t\t\t.multiplyScalar( newRadius )\n\t\t\t\t\t\t.add( this.object.position );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// get the ray and translation plane to compute target\n\t\t\t\t\t_ray.origin.copy( this.object.position );\n\t\t\t\t\t_ray.direction.set( 0, 0, - 1 ).transformDirection( this.object.matrix );\n\n\t\t\t\t\t// if the camera is 20 degrees above the horizon then don't adjust the focus target to avoid\n\t\t\t\t\t// extremely large values\n\t\t\t\t\tif ( Math.abs( this.object.up.dot( _ray.direction ) ) < _TILT_LIMIT ) {\n\n\t\t\t\t\t\tthis.object.lookAt( this.target );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t_plane.setFromNormalAndCoplanarPoint( this.object.up, this.target );\n\t\t\t\t\t\t_ray.intersectPlane( _plane, this.target );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( this.object.isOrthographicCamera ) {\n\n\t\t\tconst prevZoom = this.object.zoom;\n\t\t\tthis.object.zoom = Math.max( this.minZoom, Math.min( this.maxZoom, this.object.zoom / this._scale ) );\n\n\t\t\tif ( prevZoom !== this.object.zoom ) {\n\n\t\t\t\tthis.object.updateProjectionMatrix();\n\t\t\t\tzoomChanged = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._scale = 1;\n\t\tthis._performCursorZoom = false;\n\n\t\t// update condition is:\n\t\t// min(camera displacement, camera rotation in radians)^2 > EPS\n\t\t// using small-angle approximation cos(x/2) = 1 - x^2 / 8\n\n\t\tif ( zoomChanged ||\n\t\t\tthis._lastPosition.distanceToSquared( this.object.position ) > _EPS ||\n\t\t\t8 * ( 1 - this._lastQuaternion.dot( this.object.quaternion ) ) > _EPS ||\n\t\t\tthis._lastTargetPosition.distanceToSquared( this.target ) > _EPS ) {\n\n\t\t\tthis.dispatchEvent( _changeEvent );\n\n\t\t\tthis._lastPosition.copy( this.object.position );\n\t\t\tthis._lastQuaternion.copy( this.object.quaternion );\n\t\t\tthis._lastTargetPosition.copy( this.target );\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t_getAutoRotationAngle( deltaTime ) {\n\n\t\tif ( deltaTime !== null ) {\n\n\t\t\treturn ( _twoPI / 60 * this.autoRotateSpeed ) * deltaTime;\n\n\t\t} else {\n\n\t\t\treturn _twoPI / 60 / 60 * this.autoRotateSpeed;\n\n\t\t}\n\n\t}\n\n\t_getZoomScale( delta ) {\n\n\t\tconst normalizedDelta = Math.abs( delta * 0.01 );\n\t\treturn Math.pow( 0.95, this.zoomSpeed * normalizedDelta );\n\n\t}\n\n\t_rotateLeft( angle ) {\n\n\t\tthis._sphericalDelta.theta -= angle;\n\n\t}\n\n\t_rotateUp( angle ) {\n\n\t\tthis._sphericalDelta.phi -= angle;\n\n\t}\n\n\t_panLeft( distance, objectMatrix ) {\n\n\t\t_v.setFromMatrixColumn( objectMatrix, 0 ); // get X column of objectMatrix\n\t\t_v.multiplyScalar( - distance );\n\n\t\tthis._panOffset.add( _v );\n\n\t}\n\n\t_panUp( distance, objectMatrix ) {\n\n\t\tif ( this.screenSpacePanning === true ) {\n\n\t\t\t_v.setFromMatrixColumn( objectMatrix, 1 );\n\n\t\t} else {\n\n\t\t\t_v.setFromMatrixColumn( objectMatrix, 0 );\n\t\t\t_v.crossVectors( this.object.up, _v );\n\n\t\t}\n\n\t\t_v.multiplyScalar( distance );\n\n\t\tthis._panOffset.add( _v );\n\n\t}\n\n\t// deltaX and deltaY are in pixels; right and down are positive\n\t_pan( deltaX, deltaY ) {\n\n\t\tconst element = this.domElement;\n\n\t\tif ( this.object.isPerspectiveCamera ) {\n\n\t\t\t// perspective\n\t\t\tconst position = this.object.position;\n\t\t\t_v.copy( position ).sub( this.target );\n\t\t\tlet targetDistance = _v.length();\n\n\t\t\t// half of the fov is center to top of screen\n\t\t\ttargetDistance *= Math.tan( ( this.object.fov / 2 ) * Math.PI / 180.0 );\n\n\t\t\t// we use only clientHeight here so aspect ratio does not distort speed\n\t\t\tthis._panLeft( 2 * deltaX * targetDistance / element.clientHeight, this.object.matrix );\n\t\t\tthis._panUp( 2 * deltaY * targetDistance / element.clientHeight, this.object.matrix );\n\n\t\t} else if ( this.object.isOrthographicCamera ) {\n\n\t\t\t// orthographic\n\t\t\tthis._panLeft( deltaX * ( this.object.right - this.object.left ) / this.object.zoom / element.clientWidth, this.object.matrix );\n\t\t\tthis._panUp( deltaY * ( this.object.top - this.object.bottom ) / this.object.zoom / element.clientHeight, this.object.matrix );\n\n\t\t} else {\n\n\t\t\t// camera neither orthographic nor perspective\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - pan disabled.' );\n\t\t\tthis.enablePan = false;\n\n\t\t}\n\n\t}\n\n\t_dollyOut( dollyScale ) {\n\n\t\tif ( this.object.isPerspectiveCamera || this.object.isOrthographicCamera ) {\n\n\t\t\tthis._scale /= dollyScale;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\tthis.enableZoom = false;\n\n\t\t}\n\n\t}\n\n\t_dollyIn( dollyScale ) {\n\n\t\tif ( this.object.isPerspectiveCamera || this.object.isOrthographicCamera ) {\n\n\t\t\tthis._scale *= dollyScale;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled.' );\n\t\t\tthis.enableZoom = false;\n\n\t\t}\n\n\t}\n\n\t_updateZoomParameters( x, y ) {\n\n\t\tif ( ! this.zoomToCursor ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._performCursorZoom = true;\n\n\t\tconst rect = this.domElement.getBoundingClientRect();\n\t\tconst dx = x - rect.left;\n\t\tconst dy = y - rect.top;\n\t\tconst w = rect.width;\n\t\tconst h = rect.height;\n\n\t\tthis._mouse.x = ( dx / w ) * 2 - 1;\n\t\tthis._mouse.y = - ( dy / h ) * 2 + 1;\n\n\t\tthis._dollyDirection.set( this._mouse.x, this._mouse.y, 1 ).unproject( this.object ).sub( this.object.position ).normalize();\n\n\t}\n\n\t_clampDistance( dist ) {\n\n\t\treturn Math.max( this.minDistance, Math.min( this.maxDistance, dist ) );\n\n\t}\n\n\t//\n\t// event callbacks - update the object state\n\t//\n\n\t_handleMouseDownRotate( event ) {\n\n\t\tthis._rotateStart.set( event.clientX, event.clientY );\n\n\t}\n\n\t_handleMouseDownDolly( event ) {\n\n\t\tthis._updateZoomParameters( event.clientX, event.clientX );\n\t\tthis._dollyStart.set( event.clientX, event.clientY );\n\n\t}\n\n\t_handleMouseDownPan( event ) {\n\n\t\tthis._panStart.set( event.clientX, event.clientY );\n\n\t}\n\n\t_handleMouseMoveRotate( event ) {\n\n\t\tthis._rotateEnd.set( event.clientX, event.clientY );\n\n\t\tthis._rotateDelta.subVectors( this._rotateEnd, this._rotateStart ).multiplyScalar( this.rotateSpeed );\n\n\t\tconst element = this.domElement;\n\n\t\tthis._rotateLeft( _twoPI * this._rotateDelta.x / element.clientHeight ); // yes, height\n\n\t\tthis._rotateUp( _twoPI * this._rotateDelta.y / element.clientHeight );\n\n\t\tthis._rotateStart.copy( this._rotateEnd );\n\n\t\tthis.update();\n\n\t}\n\n\t_handleMouseMoveDolly( event ) {\n\n\t\tthis._dollyEnd.set( event.clientX, event.clientY );\n\n\t\tthis._dollyDelta.subVectors( this._dollyEnd, this._dollyStart );\n\n\t\tif ( this._dollyDelta.y > 0 ) {\n\n\t\t\tthis._dollyOut( this._getZoomScale( this._dollyDelta.y ) );\n\n\t\t} else if ( this._dollyDelta.y < 0 ) {\n\n\t\t\tthis._dollyIn( this._getZoomScale( this._dollyDelta.y ) );\n\n\t\t}\n\n\t\tthis._dollyStart.copy( this._dollyEnd );\n\n\t\tthis.update();\n\n\t}\n\n\t_handleMouseMovePan( event ) {\n\n\t\tthis._panEnd.set( event.clientX, event.clientY );\n\n\t\tthis._panDelta.subVectors( this._panEnd, this._panStart ).multiplyScalar( this.panSpeed );\n\n\t\tthis._pan( this._panDelta.x, this._panDelta.y );\n\n\t\tthis._panStart.copy( this._panEnd );\n\n\t\tthis.update();\n\n\t}\n\n\t_handleMouseWheel( event ) {\n\n\t\tthis._updateZoomParameters( event.clientX, event.clientY );\n\n\t\tif ( event.deltaY < 0 ) {\n\n\t\t\tthis._dollyIn( this._getZoomScale( event.deltaY ) );\n\n\t\t} else if ( event.deltaY > 0 ) {\n\n\t\t\tthis._dollyOut( this._getZoomScale( event.deltaY ) );\n\n\t\t}\n\n\t\tthis.update();\n\n\t}\n\n\t_handleKeyDown( event ) {\n\n\t\tlet needsUpdate = false;\n\n\t\tswitch ( event.code ) {\n\n\t\t\tcase this.keys.UP:\n\n\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\tif ( this.enableRotate ) {\n\n\t\t\t\t\t\tthis._rotateUp( _twoPI * this.keyRotateSpeed / this.domElement.clientHeight );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( this.enablePan ) {\n\n\t\t\t\t\t\tthis._pan( 0, this.keyPanSpeed );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t\tcase this.keys.BOTTOM:\n\n\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\tif ( this.enableRotate ) {\n\n\t\t\t\t\t\tthis._rotateUp( - _twoPI * this.keyRotateSpeed / this.domElement.clientHeight );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( this.enablePan ) {\n\n\t\t\t\t\t\tthis._pan( 0, - this.keyPanSpeed );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t\tcase this.keys.LEFT:\n\n\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\tif ( this.enableRotate ) {\n\n\t\t\t\t\t\tthis._rotateLeft( _twoPI * this.keyRotateSpeed / this.domElement.clientHeight );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( this.enablePan ) {\n\n\t\t\t\t\t\tthis._pan( this.keyPanSpeed, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t\tcase this.keys.RIGHT:\n\n\t\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\t\tif ( this.enableRotate ) {\n\n\t\t\t\t\t\tthis._rotateLeft( - _twoPI * this.keyRotateSpeed / this.domElement.clientHeight );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( this.enablePan ) {\n\n\t\t\t\t\t\tthis._pan( - this.keyPanSpeed, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tneedsUpdate = true;\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( needsUpdate ) {\n\n\t\t\t// prevent the browser from scrolling on cursor keys\n\t\t\tevent.preventDefault();\n\n\t\t\tthis.update();\n\n\t\t}\n\n\n\t}\n\n\t_handleTouchStartRotate( event ) {\n\n\t\tif ( this._pointers.length === 1 ) {\n\n\t\t\tthis._rotateStart.set( event.pageX, event.pageY );\n\n\t\t} else {\n\n\t\t\tconst position = this._getSecondPointerPosition( event );\n\n\t\t\tconst x = 0.5 * ( event.pageX + position.x );\n\t\t\tconst y = 0.5 * ( event.pageY + position.y );\n\n\t\t\tthis._rotateStart.set( x, y );\n\n\t\t}\n\n\t}\n\n\t_handleTouchStartPan( event ) {\n\n\t\tif ( this._pointers.length === 1 ) {\n\n\t\t\tthis._panStart.set( event.pageX, event.pageY );\n\n\t\t} else {\n\n\t\t\tconst position = this._getSecondPointerPosition( event );\n\n\t\t\tconst x = 0.5 * ( event.pageX + position.x );\n\t\t\tconst y = 0.5 * ( event.pageY + position.y );\n\n\t\t\tthis._panStart.set( x, y );\n\n\t\t}\n\n\t}\n\n\t_handleTouchStartDolly( event ) {\n\n\t\tconst position = this._getSecondPointerPosition( event );\n\n\t\tconst dx = event.pageX - position.x;\n\t\tconst dy = event.pageY - position.y;\n\n\t\tconst distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\tthis._dollyStart.set( 0, distance );\n\n\t}\n\n\t_handleTouchStartDollyPan( event ) {\n\n\t\tif ( this.enableZoom ) this._handleTouchStartDolly( event );\n\n\t\tif ( this.enablePan ) this._handleTouchStartPan( event );\n\n\t}\n\n\t_handleTouchStartDollyRotate( event ) {\n\n\t\tif ( this.enableZoom ) this._handleTouchStartDolly( event );\n\n\t\tif ( this.enableRotate ) this._handleTouchStartRotate( event );\n\n\t}\n\n\t_handleTouchMoveRotate( event ) {\n\n\t\tif ( this._pointers.length == 1 ) {\n\n\t\t\tthis._rotateEnd.set( event.pageX, event.pageY );\n\n\t\t} else {\n\n\t\t\tconst position = this._getSecondPointerPosition( event );\n\n\t\t\tconst x = 0.5 * ( event.pageX + position.x );\n\t\t\tconst y = 0.5 * ( event.pageY + position.y );\n\n\t\t\tthis._rotateEnd.set( x, y );\n\n\t\t}\n\n\t\tthis._rotateDelta.subVectors( this._rotateEnd, this._rotateStart ).multiplyScalar( this.rotateSpeed );\n\n\t\tconst element = this.domElement;\n\n\t\tthis._rotateLeft( _twoPI * this._rotateDelta.x / element.clientHeight ); // yes, height\n\n\t\tthis._rotateUp( _twoPI * this._rotateDelta.y / element.clientHeight );\n\n\t\tthis._rotateStart.copy( this._rotateEnd );\n\n\t}\n\n\t_handleTouchMovePan( event ) {\n\n\t\tif ( this._pointers.length === 1 ) {\n\n\t\t\tthis._panEnd.set( event.pageX, event.pageY );\n\n\t\t} else {\n\n\t\t\tconst position = this._getSecondPointerPosition( event );\n\n\t\t\tconst x = 0.5 * ( event.pageX + position.x );\n\t\t\tconst y = 0.5 * ( event.pageY + position.y );\n\n\t\t\tthis._panEnd.set( x, y );\n\n\t\t}\n\n\t\tthis._panDelta.subVectors( this._panEnd, this._panStart ).multiplyScalar( this.panSpeed );\n\n\t\tthis._pan( this._panDelta.x, this._panDelta.y );\n\n\t\tthis._panStart.copy( this._panEnd );\n\n\t}\n\n\t_handleTouchMoveDolly( event ) {\n\n\t\tconst position = this._getSecondPointerPosition( event );\n\n\t\tconst dx = event.pageX - position.x;\n\t\tconst dy = event.pageY - position.y;\n\n\t\tconst distance = Math.sqrt( dx * dx + dy * dy );\n\n\t\tthis._dollyEnd.set( 0, distance );\n\n\t\tthis._dollyDelta.set( 0, Math.pow( this._dollyEnd.y / this._dollyStart.y, this.zoomSpeed ) );\n\n\t\tthis._dollyOut( this._dollyDelta.y );\n\n\t\tthis._dollyStart.copy( this._dollyEnd );\n\n\t\tconst centerX = ( event.pageX + position.x ) * 0.5;\n\t\tconst centerY = ( event.pageY + position.y ) * 0.5;\n\n\t\tthis._updateZoomParameters( centerX, centerY );\n\n\t}\n\n\t_handleTouchMoveDollyPan( event ) {\n\n\t\tif ( this.enableZoom ) this._handleTouchMoveDolly( event );\n\n\t\tif ( this.enablePan ) this._handleTouchMovePan( event );\n\n\t}\n\n\t_handleTouchMoveDollyRotate( event ) {\n\n\t\tif ( this.enableZoom ) this._handleTouchMoveDolly( event );\n\n\t\tif ( this.enableRotate ) this._handleTouchMoveRotate( event );\n\n\t}\n\n\t// pointers\n\n\t_addPointer( event ) {\n\n\t\tthis._pointers.push( event.pointerId );\n\n\t}\n\n\t_removePointer( event ) {\n\n\t\tdelete this._pointerPositions[ event.pointerId ];\n\n\t\tfor ( let i = 0; i < this._pointers.length; i ++ ) {\n\n\t\t\tif ( this._pointers[ i ] == event.pointerId ) {\n\n\t\t\t\tthis._pointers.splice( i, 1 );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_isTrackingPointer( event ) {\n\n\t\tfor ( let i = 0; i < this._pointers.length; i ++ ) {\n\n\t\t\tif ( this._pointers[ i ] == event.pointerId ) return true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t_trackPointer( event ) {\n\n\t\tlet position = this._pointerPositions[ event.pointerId ];\n\n\t\tif ( position === undefined ) {\n\n\t\t\tposition = new Vector2();\n\t\t\tthis._pointerPositions[ event.pointerId ] = position;\n\n\t\t}\n\n\t\tposition.set( event.pageX, event.pageY );\n\n\t}\n\n\t_getSecondPointerPosition( event ) {\n\n\t\tconst pointerId = ( event.pointerId === this._pointers[ 0 ] ) ? this._pointers[ 1 ] : this._pointers[ 0 ];\n\n\t\treturn this._pointerPositions[ pointerId ];\n\n\t}\n\n\t//\n\n\t_customWheelEvent( event ) {\n\n\t\tconst mode = event.deltaMode;\n\n\t\t// minimal wheel event altered to meet delta-zoom demand\n\t\tconst newEvent = {\n\t\t\tclientX: event.clientX,\n\t\t\tclientY: event.clientY,\n\t\t\tdeltaY: event.deltaY,\n\t\t};\n\n\t\tswitch ( mode ) {\n\n\t\t\tcase 1: // LINE_MODE\n\t\t\t\tnewEvent.deltaY *= 16;\n\t\t\t\tbreak;\n\n\t\t\tcase 2: // PAGE_MODE\n\t\t\t\tnewEvent.deltaY *= 100;\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\t// detect if event was triggered by pinching\n\t\tif ( event.ctrlKey && ! this._controlActive ) {\n\n\t\t\tnewEvent.deltaY *= 10;\n\n\t\t}\n\n\t\treturn newEvent;\n\n\t}\n\n}\n\nfunction onPointerDown( event ) {\n\n\tif ( this.enabled === false ) return;\n\n\tif ( this._pointers.length === 0 ) {\n\n\t\tthis.domElement.setPointerCapture( event.pointerId );\n\n\t\tthis.domElement.ownerDocument.addEventListener( 'pointermove', this._onPointerMove );\n\t\tthis.domElement.ownerDocument.addEventListener( 'pointerup', this._onPointerUp );\n\n\t}\n\n\t//\n\n\tif ( this._isTrackingPointer( event ) ) return;\n\n\t//\n\n\tthis._addPointer( event );\n\n\tif ( event.pointerType === 'touch' ) {\n\n\t\tthis._onTouchStart( event );\n\n\t} else {\n\n\t\tthis._onMouseDown( event );\n\n\t}\n\n}\n\nfunction onPointerMove( event ) {\n\n\tif ( this.enabled === false ) return;\n\n\tif ( event.pointerType === 'touch' ) {\n\n\t\tthis._onTouchMove( event );\n\n\t} else {\n\n\t\tthis._onMouseMove( event );\n\n\t}\n\n}\n\nfunction onPointerUp( event ) {\n\n\tthis._removePointer( event );\n\n\tswitch ( this._pointers.length ) {\n\n\t\tcase 0:\n\n\t\t\tthis.domElement.releasePointerCapture( event.pointerId );\n\n\t\t\tthis.domElement.ownerDocument.removeEventListener( 'pointermove', this._onPointerMove );\n\t\t\tthis.domElement.ownerDocument.removeEventListener( 'pointerup', this._onPointerUp );\n\n\t\t\tthis.dispatchEvent( _endEvent );\n\n\t\t\tthis.state = _STATE.NONE;\n\n\t\t\tbreak;\n\n\t\tcase 1:\n\n\t\t\tconst pointerId = this._pointers[ 0 ];\n\t\t\tconst position = this._pointerPositions[ pointerId ];\n\n\t\t\t// minimal placeholder event - allows state correction on pointer-up\n\t\t\tthis._onTouchStart( { pointerId: pointerId, pageX: position.x, pageY: position.y } );\n\n\t\t\tbreak;\n\n\t}\n\n}\n\nfunction onMouseDown( event ) {\n\n\tlet mouseAction;\n\n\tswitch ( event.button ) {\n\n\t\tcase 0:\n\n\t\t\tmouseAction = this.mouseButtons.LEFT;\n\t\t\tbreak;\n\n\t\tcase 1:\n\n\t\t\tmouseAction = this.mouseButtons.MIDDLE;\n\t\t\tbreak;\n\n\t\tcase 2:\n\n\t\t\tmouseAction = this.mouseButtons.RIGHT;\n\t\t\tbreak;\n\n\t\tdefault:\n\n\t\t\tmouseAction = - 1;\n\n\t}\n\n\tswitch ( mouseAction ) {\n\n\t\tcase MOUSE.DOLLY:\n\n\t\t\tif ( this.enableZoom === false ) return;\n\n\t\t\tthis._handleMouseDownDolly( event );\n\n\t\t\tthis.state = _STATE.DOLLY;\n\n\t\t\tbreak;\n\n\t\tcase MOUSE.ROTATE:\n\n\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\tif ( this.enablePan === false ) return;\n\n\t\t\t\tthis._handleMouseDownPan( event );\n\n\t\t\t\tthis.state = _STATE.PAN;\n\n\t\t\t} else {\n\n\t\t\t\tif ( this.enableRotate === false ) return;\n\n\t\t\t\tthis._handleMouseDownRotate( event );\n\n\t\t\t\tthis.state = _STATE.ROTATE;\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tcase MOUSE.PAN:\n\n\t\t\tif ( event.ctrlKey || event.metaKey || event.shiftKey ) {\n\n\t\t\t\tif ( this.enableRotate === false ) return;\n\n\t\t\t\tthis._handleMouseDownRotate( event );\n\n\t\t\t\tthis.state = _STATE.ROTATE;\n\n\t\t\t} else {\n\n\t\t\t\tif ( this.enablePan === false ) return;\n\n\t\t\t\tthis._handleMouseDownPan( event );\n\n\t\t\t\tthis.state = _STATE.PAN;\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tdefault:\n\n\t\t\tthis.state = _STATE.NONE;\n\n\t}\n\n\tif ( this.state !== _STATE.NONE ) {\n\n\t\tthis.dispatchEvent( _startEvent );\n\n\t}\n\n}\n\nfunction onMouseMove( event ) {\n\n\tswitch ( this.state ) {\n\n\t\tcase _STATE.ROTATE:\n\n\t\t\tif ( this.enableRotate === false ) return;\n\n\t\t\tthis._handleMouseMoveRotate( event );\n\n\t\t\tbreak;\n\n\t\tcase _STATE.DOLLY:\n\n\t\t\tif ( this.enableZoom === false ) return;\n\n\t\t\tthis._handleMouseMoveDolly( event );\n\n\t\t\tbreak;\n\n\t\tcase _STATE.PAN:\n\n\t\t\tif ( this.enablePan === false ) return;\n\n\t\t\tthis._handleMouseMovePan( event );\n\n\t\t\tbreak;\n\n\t}\n\n}\n\nfunction onMouseWheel( event ) {\n\n\tif ( this.enabled === false || this.enableZoom === false || this.state !== _STATE.NONE ) return;\n\n\tevent.preventDefault();\n\n\tthis.dispatchEvent( _startEvent );\n\n\tthis._handleMouseWheel( this._customWheelEvent( event ) );\n\n\tthis.dispatchEvent( _endEvent );\n\n}\n\nfunction onKeyDown( event ) {\n\n\tif ( this.enabled === false ) return;\n\n\tthis._handleKeyDown( event );\n\n}\n\nfunction onTouchStart( event ) {\n\n\tthis._trackPointer( event );\n\n\tswitch ( this._pointers.length ) {\n\n\t\tcase 1:\n\n\t\t\tswitch ( this.touches.ONE ) {\n\n\t\t\t\tcase TOUCH.ROTATE:\n\n\t\t\t\t\tif ( this.enableRotate === false ) return;\n\n\t\t\t\t\tthis._handleTouchStartRotate( event );\n\n\t\t\t\t\tthis.state = _STATE.TOUCH_ROTATE;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase TOUCH.PAN:\n\n\t\t\t\t\tif ( this.enablePan === false ) return;\n\n\t\t\t\t\tthis._handleTouchStartPan( event );\n\n\t\t\t\t\tthis.state = _STATE.TOUCH_PAN;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tthis.state = _STATE.NONE;\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tcase 2:\n\n\t\t\tswitch ( this.touches.TWO ) {\n\n\t\t\t\tcase TOUCH.DOLLY_PAN:\n\n\t\t\t\t\tif ( this.enableZoom === false && this.enablePan === false ) return;\n\n\t\t\t\t\tthis._handleTouchStartDollyPan( event );\n\n\t\t\t\t\tthis.state = _STATE.TOUCH_DOLLY_PAN;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase TOUCH.DOLLY_ROTATE:\n\n\t\t\t\t\tif ( this.enableZoom === false && this.enableRotate === false ) return;\n\n\t\t\t\t\tthis._handleTouchStartDollyRotate( event );\n\n\t\t\t\t\tthis.state = _STATE.TOUCH_DOLLY_ROTATE;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tthis.state = _STATE.NONE;\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t\tdefault:\n\n\t\t\tthis.state = _STATE.NONE;\n\n\t}\n\n\tif ( this.state !== _STATE.NONE ) {\n\n\t\tthis.dispatchEvent( _startEvent );\n\n\t}\n\n}\n\nfunction onTouchMove( event ) {\n\n\tthis._trackPointer( event );\n\n\tswitch ( this.state ) {\n\n\t\tcase _STATE.TOUCH_ROTATE:\n\n\t\t\tif ( this.enableRotate === false ) return;\n\n\t\t\tthis._handleTouchMoveRotate( event );\n\n\t\t\tthis.update();\n\n\t\t\tbreak;\n\n\t\tcase _STATE.TOUCH_PAN:\n\n\t\t\tif ( this.enablePan === false ) return;\n\n\t\t\tthis._handleTouchMovePan( event );\n\n\t\t\tthis.update();\n\n\t\t\tbreak;\n\n\t\tcase _STATE.TOUCH_DOLLY_PAN:\n\n\t\t\tif ( this.enableZoom === false && this.enablePan === false ) return;\n\n\t\t\tthis._handleTouchMoveDollyPan( event );\n\n\t\t\tthis.update();\n\n\t\t\tbreak;\n\n\t\tcase _STATE.TOUCH_DOLLY_ROTATE:\n\n\t\t\tif ( this.enableZoom === false && this.enableRotate === false ) return;\n\n\t\t\tthis._handleTouchMoveDollyRotate( event );\n\n\t\t\tthis.update();\n\n\t\t\tbreak;\n\n\t\tdefault:\n\n\t\t\tthis.state = _STATE.NONE;\n\n\t}\n\n}\n\nfunction onContextMenu( event ) {\n\n\tif ( this.enabled === false ) return;\n\n\tevent.preventDefault();\n\n}\n\nfunction interceptControlDown( event ) {\n\n\tif ( event.key === 'Control' ) {\n\n\t\tthis._controlActive = true;\n\n\t\tconst document = this.domElement.getRootNode(); // offscreen canvas compatibility\n\n\t\tdocument.addEventListener( 'keyup', this._interceptControlUp, { passive: true, capture: true } );\n\n\t}\n\n}\n\nfunction interceptControlUp( event ) {\n\n\tif ( event.key === 'Control' ) {\n\n\t\tthis._controlActive = false;\n\n\t\tconst document = this.domElement.getRootNode(); // offscreen canvas compatibility\n\n\t\tdocument.removeEventListener( 'keyup', this._interceptControlUp, { passive: true, capture: true } );\n\n\t}\n\n}\n\nexport { OrbitControls };\n", "import { MOUSE, TOUCH, Plane, Raycaster, Vector2, Vector3 } from 'three';\n\nimport { OrbitControls } from './OrbitControls.js';\n\nconst _plane = new Plane();\nconst _raycaster = new Raycaster();\nconst _mouse = new Vector2();\nconst _panCurrent = new Vector3();\n\n/**\n * This class is intended for transforming a camera over a map from bird's eye perspective.\n * The class shares its implementation with {@link OrbitControls} but uses a specific preset\n * for mouse/touch interaction and disables screen space panning by default.\n *\n * - Orbit: Right mouse, or left mouse + ctrl/meta/shiftKey / touch: two-finger rotate.\n * - Zoom: Middle mouse, or mousewheel / touch: two-finger spread or squish.\n * - Pan: Left mouse, or arrow keys / touch: one-finger move.\n *\n * @augments OrbitControls\n * @three_import import { MapControls } from 'three/addons/controls/MapControls.js';\n */\nclass MapControls extends OrbitControls {\n\n\tconstructor( object, domElement ) {\n\n\t\tsuper( object, domElement );\n\n\t\t/**\n\t\t * Overwritten and set to `false` to pan orthogonal to world-space direction `camera.up`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.screenSpacePanning = false;\n\n\t\t/**\n\t\t * This object contains references to the mouse actions used by the controls.\n\t\t *\n\t\t * ```js\n\t\t * controls.mouseButtons = {\n\t\t * \tLEFT: THREE.MOUSE.PAN,\n\t\t * \tMIDDLE: THREE.MOUSE.DOLLY,\n\t\t * \tRIGHT: THREE.MOUSE.ROTATE\n\t\t * }\n\t\t * ```\n\t\t * @type {Object}\n\t\t */\n\t\tthis.mouseButtons = { LEFT: MOUSE.PAN, MIDDLE: MOUSE.DOLLY, RIGHT: MOUSE.ROTATE };\n\n\t\t/**\n\t\t * This object contains references to the touch actions used by the controls.\n\t\t *\n\t\t * ```js\n\t\t * controls.mouseButtons = {\n\t\t * \tONE: THREE.TOUCH.PAN,\n\t\t * \tTWO: THREE.TOUCH.DOLLY_ROTATE\n\t\t * }\n\t\t * ```\n\t\t * @type {Object}\n\t\t */\n\t\tthis.touches = { ONE: TOUCH.PAN, TWO: TOUCH.DOLLY_ROTATE };\n\n\t\tthis._panWorldStart = new Vector3();\n\n\t}\n\n\t_handleMouseDownPan( event ) {\n\n\t\tsuper._handleMouseDownPan( event );\n\n\t\tthis._panOffset.set( 0, 0, 0 );\n\n\t\tif ( this.screenSpacePanning === true ) return;\n\n\t\t_plane.setFromNormalAndCoplanarPoint( this.object.up, this.target );\n\n\t\tconst element = this.domElement;\n\t\tconst rect = element.getBoundingClientRect();\n\t\t_mouse.x = ( ( event.clientX - rect.left ) / rect.width ) * 2 - 1;\n\t\t_mouse.y = - ( ( event.clientY - rect.top ) / rect.height ) * 2 + 1;\n\n\t\t_raycaster.setFromCamera( _mouse, this.object );\n\t\t_raycaster.ray.intersectPlane( _plane, this._panWorldStart );\n\n\t}\n\n\t_handleMouseMovePan( event ) {\n\n\t\tif ( this.screenSpacePanning === true ) {\n\n\t\t\tsuper._handleMouseMovePan( event );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst element = this.domElement;\n\t\tconst rect = element.getBoundingClientRect();\n\t\t_mouse.x = ( ( event.clientX - rect.left ) / rect.width ) * 2 - 1;\n\t\t_mouse.y = - ( ( event.clientY - rect.top ) / rect.height ) * 2 + 1;\n\n\t\t_raycaster.setFromCamera( _mouse, this.object );\n\n\t\tif ( _raycaster.ray.intersectPlane( _plane, _panCurrent ) ) {\n\n\t\t\t_panCurrent.sub( this._panWorldStart );\n\t\t\tthis._panOffset.copy( _panCurrent ).negate();\n\n\t\t\tthis.update();\n\n\t\t}\n\n\t}\n\n}\n\nexport { MapControls };\n", "import {\n\tControls,\n\tEuler,\n\tVector3\n} from 'three';\n\nconst _euler = new Euler( 0, 0, 0, 'YXZ' );\nconst _vector = new Vector3();\n\n/**\n * Fires when the user moves the mouse.\n *\n * @event PointerLockControls#change\n * @type {Object}\n */\nconst _changeEvent = { type: 'change' };\n\n/**\n * Fires when the pointer lock status is \"locked\" (in other words: the mouse is captured).\n *\n * @event PointerLockControls#lock\n * @type {Object}\n */\nconst _lockEvent = { type: 'lock' };\n\n/**\n * Fires when the pointer lock status is \"unlocked\" (in other words: the mouse is not captured anymore).\n *\n * @event PointerLockControls#unlock\n * @type {Object}\n */\nconst _unlockEvent = { type: 'unlock' };\n\nconst _MOUSE_SENSITIVITY = 0.002;\nconst _PI_2 = Math.PI / 2;\n\n/**\n * The implementation of this class is based on the [Pointer Lock API](https://developer.mozilla.org/en-US/docs/Web/API/Pointer_Lock_API).\n * `PointerLockControls` is a perfect choice for first person 3D games.\n *\n * ```js\n * const controls = new PointerLockControls( camera, document.body );\n *\n * // add event listener to show/hide a UI (e.g. the game's menu)\n * controls.addEventListener( 'lock', function () {\n *\n * \tmenu.style.display = 'none';\n *\n * } );\n *\n * controls.addEventListener( 'unlock', function () {\n *\n * \tmenu.style.display = 'block';\n *\n * } );\n * ```\n *\n * @augments Controls\n * @three_import import { PointerLockControls } from 'three/addons/controls/PointerLockControls.js';\n */\nclass PointerLockControls extends Controls {\n\n\t/**\n\t * Constructs a new controls instance.\n\t *\n\t * @param {Camera} camera - The camera that is managed by the controls.\n\t * @param {?HTMLElement} domElement - The HTML element used for event listeners.\n\t */\n\tconstructor( camera, domElement = null ) {\n\n\t\tsuper( camera, domElement );\n\n\t\t/**\n\t\t * Whether the controls are locked or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.isLocked = false;\n\n\t\t/**\n\t\t * Camera pitch, lower limit. Range is '[0, Math.PI]' in radians.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.minPolarAngle = 0;\n\n\t\t/**\n\t\t * Camera pitch, upper limit. Range is '[0, Math.PI]' in radians.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Math.PI\n\t\t */\n\t\tthis.maxPolarAngle = Math.PI;\n\n\t\t/**\n\t\t * Multiplier for how much the pointer movement influences the camera rotation.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.pointerSpeed = 1.0;\n\n\t\t// event listeners\n\n\t\tthis._onMouseMove = onMouseMove.bind( this );\n\t\tthis._onPointerlockChange = onPointerlockChange.bind( this );\n\t\tthis._onPointerlockError = onPointerlockError.bind( this );\n\n\t\tif ( this.domElement !== null ) {\n\n\t\t\tthis.connect( this.domElement );\n\n\t\t}\n\n\t}\n\n\tconnect( element ) {\n\n\t\tsuper.connect( element );\n\n\t\tthis.domElement.ownerDocument.addEventListener( 'mousemove', this._onMouseMove );\n\t\tthis.domElement.ownerDocument.addEventListener( 'pointerlockchange', this._onPointerlockChange );\n\t\tthis.domElement.ownerDocument.addEventListener( 'pointerlockerror', this._onPointerlockError );\n\n\t}\n\n\tdisconnect() {\n\n\t\tthis.domElement.ownerDocument.removeEventListener( 'mousemove', this._onMouseMove );\n\t\tthis.domElement.ownerDocument.removeEventListener( 'pointerlockchange', this._onPointerlockChange );\n\t\tthis.domElement.ownerDocument.removeEventListener( 'pointerlockerror', this._onPointerlockError );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.disconnect();\n\n\t}\n\n\t/**\n\t * Returns the look direction of the camera.\n\t *\n\t * @param {Vector3} v - The target vector that is used to store the method's result.\n\t * @return {Vector3} The normalized direction vector.\n\t */\n\tgetDirection( v ) {\n\n\t\treturn v.set( 0, 0, - 1 ).applyQuaternion( this.object.quaternion );\n\n\t}\n\n\t/**\n\t * Moves the camera forward parallel to the xz-plane. Assumes camera.up is y-up.\n\t *\n\t * @param {number} distance - The signed distance.\n\t */\n\tmoveForward( distance ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\t// move forward parallel to the xz-plane\n\t\t// assumes camera.up is y-up\n\n\t\tconst camera = this.object;\n\n\t\t_vector.setFromMatrixColumn( camera.matrix, 0 );\n\n\t\t_vector.crossVectors( camera.up, _vector );\n\n\t\tcamera.position.addScaledVector( _vector, distance );\n\n\t}\n\n\t/**\n\t * Moves the camera sidewards parallel to the xz-plane.\n\t *\n\t * @param {number} distance - The signed distance.\n\t */\n\tmoveRight( distance ) {\n\n\t\tif ( this.enabled === false ) return;\n\n\t\tconst camera = this.object;\n\n\t\t_vector.setFromMatrixColumn( camera.matrix, 0 );\n\n\t\tcamera.position.addScaledVector( _vector, distance );\n\n\t}\n\n\t/**\n\t * Activates the pointer lock.\n\t *\n\t * @param {boolean} [unadjustedMovement=false] - Disables OS-level adjustment for mouse acceleration, and accesses raw mouse input instead.\n\t * Setting it to true will disable mouse acceleration.\n\t */\n\tlock( unadjustedMovement = false ) {\n\n\t\tthis.domElement.requestPointerLock( {\n\t\t\tunadjustedMovement\n\t\t} );\n\n\t}\n\n\t/**\n\t * Exits the pointer lock.\n\t */\n\tunlock() {\n\n\t\tthis.domElement.ownerDocument.exitPointerLock();\n\n\t}\n\n}\n\n// event listeners\n\nfunction onMouseMove( event ) {\n\n\tif ( this.enabled === false || this.isLocked === false ) return;\n\n\tconst camera = this.object;\n\t_euler.setFromQuaternion( camera.quaternion );\n\n\t_euler.y -= event.movementX * _MOUSE_SENSITIVITY * this.pointerSpeed;\n\t_euler.x -= event.movementY * _MOUSE_SENSITIVITY * this.pointerSpeed;\n\n\t_euler.x = Math.max( _PI_2 - this.maxPolarAngle, Math.min( _PI_2 - this.minPolarAngle, _euler.x ) );\n\n\tcamera.quaternion.setFromEuler( _euler );\n\n\tthis.dispatchEvent( _changeEvent );\n\n}\n\nfunction onPointerlockChange() {\n\n\tif ( this.domElement.ownerDocument.pointerLockElement === this.domElement ) {\n\n\t\tthis.dispatchEvent( _lockEvent );\n\n\t\tthis.isLocked = true;\n\n\t} else {\n\n\t\tthis.dispatchEvent( _unlockEvent );\n\n\t\tthis.isLocked = false;\n\n\t}\n\n}\n\nfunction onPointerlockError() {\n\n\tconsole.error( 'THREE.PointerLockControls: Unable to use Pointer Lock API' );\n\n}\n\nexport { PointerLockControls };\n", "import {\n\tControls,\n\tMathUtils,\n\tMOUSE,\n\tQuaternion,\n\tVector2,\n\tVector3\n} from 'three';\n\n/**\n * Fires when the camera has been transformed by the controls.\n *\n * @event TrackballControls#change\n * @type {Object}\n */\nconst _changeEvent = { type: 'change' };\n\n/**\n * Fires when an interaction was initiated.\n *\n * @event TrackballControls#start\n * @type {Object}\n */\nconst _startEvent = { type: 'start' };\n\n/**\n * Fires when an interaction has finished.\n *\n * @event TrackballControls#end\n * @type {Object}\n */\nconst _endEvent = { type: 'end' };\n\nconst _EPS = 0.000001;\nconst _STATE = { NONE: - 1, ROTATE: 0, ZOOM: 1, PAN: 2, TOUCH_ROTATE: 3, TOUCH_ZOOM_PAN: 4 };\n\nconst _v2 = new Vector2();\nconst _mouseChange = new Vector2();\nconst _objectUp = new Vector3();\nconst _pan = new Vector3();\nconst _axis = new Vector3();\nconst _quaternion = new Quaternion();\nconst _eyeDirection = new Vector3();\nconst _objectUpDirection = new Vector3();\nconst _objectSidewaysDirection = new Vector3();\nconst _moveDirection = new Vector3();\n\n/**\n * This class is similar to {@link OrbitControls}. However, it does not maintain a constant camera\n * `up` vector. That means if the camera orbits over the \u201Cnorth\u201D and \u201Csouth\u201D poles, it does not flip\n * to stay \"right side up\".\n *\n * @augments Controls\n * @three_import import { TrackballControls } from 'three/addons/controls/TrackballControls.js';\n */\nclass TrackballControls extends Controls {\n\n\t/**\n\t * Constructs a new controls instance.\n\t *\n\t * @param {Object3D} object - The object that is managed by the controls.\n\t * @param {?HTMLElement} domElement - The HTML element used for event listeners.\n\t */\n\tconstructor( object, domElement = null ) {\n\n\t\tsuper( object, domElement );\n\n\t\t/**\n\t\t * Represents the properties of the screen. Automatically set when `handleResize()` is called.\n\t\t *\n\t\t * @type {Object}\n\t\t * @readonly\n\t\t */\n\t\tthis.screen = { left: 0, top: 0, width: 0, height: 0 };\n\n\t\t/**\n\t\t * The rotation speed.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.rotateSpeed = 1.0;\n\n\t\t/**\n\t\t * The zoom speed.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1.2\n\t\t */\n\t\tthis.zoomSpeed = 1.2;\n\n\t\t/**\n\t\t * The pan speed.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.3\n\t\t */\n\t\tthis.panSpeed = 0.3;\n\n\t\t/**\n\t\t * Whether rotation is disabled or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.noRotate = false;\n\n\t\t/**\n\t\t * Whether zooming is disabled or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.noZoom = false;\n\n\t\t/**\n\t\t * Whether panning is disabled or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.noPan = false;\n\n\t\t/**\n\t\t * Whether damping is disabled or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.staticMoving = false;\n\n\t\t/**\n\t\t * Defines the intensity of damping. Only considered if `staticMoving` is set to `false`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.2\n\t\t */\n\t\tthis.dynamicDampingFactor = 0.2;\n\n\t\t/**\n\t\t * How far you can dolly in (perspective camera only).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.minDistance = 0;\n\n\t\t/**\n\t\t * How far you can dolly out (perspective camera only).\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.maxDistance = Infinity;\n\n\t\t/**\n\t\t * How far you can zoom in (orthographic camera only).\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.minZoom = 0;\n\n\t\t/**\n\t\t * How far you can zoom out (orthographic camera only).\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.maxZoom = Infinity;\n\n\t\t/**\n\t\t * This array holds keycodes for controlling interactions.\n\t\t *\n\t\t * - When the first defined key is pressed, all mouse interactions (left, middle, right) performs orbiting.\n\t\t * - When the second defined key is pressed, all mouse interactions (left, middle, right) performs zooming.\n\t\t * - When the third defined key is pressed, all mouse interactions (left, middle, right) performs panning.\n\t\t *\n\t\t * Default is *KeyA, KeyS, KeyD* which represents A, S, D.\n\t\t *\n\t\t * @type {Array<string>}\n\t\t */\n\t\tthis.keys = [ 'KeyA' /*A*/, 'KeyS' /*S*/, 'KeyD' /*D*/ ];\n\n\t\t/**\n\t\t * This object contains references to the mouse actions used by the controls.\n\t\t *\n\t\t * ```js\n\t\t * controls.mouseButtons = {\n\t\t * \tLEFT: THREE.MOUSE.ROTATE,\n\t\t * \tMIDDLE: THREE.MOUSE.DOLLY,\n\t\t * \tRIGHT: THREE.MOUSE.PAN\n\t\t * }\n\t\t * ```\n\t\t * @type {Object}\n\t\t */\n\t\tthis.mouseButtons = { LEFT: MOUSE.ROTATE, MIDDLE: MOUSE.DOLLY, RIGHT: MOUSE.PAN };\n\n\t\t/**\n\t\t * The focus point of the controls.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.target = new Vector3();\n\n\t\t// internals\n\n\t\tthis.state = _STATE.NONE;\n\t\tthis.keyState = _STATE.NONE;\n\n\t\tthis._lastPosition = new Vector3();\n\t\tthis._lastZoom = 1;\n\t\tthis._touchZoomDistanceStart = 0;\n\t\tthis._touchZoomDistanceEnd = 0;\n\t\tthis._lastAngle = 0;\n\n\t\tthis._eye = new Vector3();\n\n\t\tthis._movePrev = new Vector2();\n\t\tthis._moveCurr = new Vector2();\n\n\t\tthis._lastAxis = new Vector3();\n\n\t\tthis._zoomStart = new Vector2();\n\t\tthis._zoomEnd = new Vector2();\n\n\t\tthis._panStart = new Vector2();\n\t\tthis._panEnd = new Vector2();\n\n\t\tthis._pointers = [];\n\t\tthis._pointerPositions = {};\n\n\t\t// event listeners\n\n\t\tthis._onPointerMove = onPointerMove.bind( this );\n\t\tthis._onPointerDown = onPointerDown.bind( this );\n\t\tthis._onPointerUp = onPointerUp.bind( this );\n\t\tthis._onPointerCancel = onPointerCancel.bind( this );\n\t\tthis._onContextMenu = onContextMenu.bind( this );\n\t\tthis._onMouseWheel = onMouseWheel.bind( this );\n\t\tthis._onKeyDown = onKeyDown.bind( this );\n\t\tthis._onKeyUp = onKeyUp.bind( this );\n\n\t\tthis._onTouchStart = onTouchStart.bind( this );\n\t\tthis._onTouchMove = onTouchMove.bind( this );\n\t\tthis._onTouchEnd = onTouchEnd.bind( this );\n\n\t\tthis._onMouseDown = onMouseDown.bind( this );\n\t\tthis._onMouseMove = onMouseMove.bind( this );\n\t\tthis._onMouseUp = onMouseUp.bind( this );\n\n\t\t// for reset\n\n\t\tthis._target0 = this.target.clone();\n\t\tthis._position0 = this.object.position.clone();\n\t\tthis._up0 = this.object.up.clone();\n\t\tthis._zoom0 = this.object.zoom;\n\n\t\tif ( domElement !== null ) {\n\n\t\t\tthis.connect( domElement );\n\n\t\t\tthis.handleResize();\n\n\t\t}\n\n\t\t// force an update at start\n\t\tthis.update();\n\n\t}\n\n\tconnect( element ) {\n\n\t\tsuper.connect( element );\n\n\t\twindow.addEventListener( 'keydown', this._onKeyDown );\n\t\twindow.addEventListener( 'keyup', this._onKeyUp );\n\n\t\tthis.domElement.addEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.domElement.addEventListener( 'pointercancel', this._onPointerCancel );\n\t\tthis.domElement.addEventListener( 'wheel', this._onMouseWheel, { passive: false } );\n\t\tthis.domElement.addEventListener( 'contextmenu', this._onContextMenu );\n\n\t\tthis.domElement.style.touchAction = 'none'; // disable touch scroll\n\n\t}\n\n\tdisconnect() {\n\n\t\twindow.removeEventListener( 'keydown', this._onKeyDown );\n\t\twindow.removeEventListener( 'keyup', this._onKeyUp );\n\n\t\tthis.domElement.removeEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.domElement.ownerDocument.removeEventListener( 'pointermove', this._onPointerMove );\n\t\tthis.domElement.ownerDocument.removeEventListener( 'pointerup', this._onPointerUp );\n\t\tthis.domElement.removeEventListener( 'pointercancel', this._onPointerCancel );\n\t\tthis.domElement.removeEventListener( 'wheel', this._onMouseWheel );\n\t\tthis.domElement.removeEventListener( 'contextmenu', this._onContextMenu );\n\n\t\tthis.domElement.style.touchAction = 'auto'; // disable touch scroll\n\n\t}\n\n\tdispose() {\n\n\t\tthis.disconnect();\n\n\t}\n\n\t/**\n\t * Must be called if the application window is resized.\n\t */\n\thandleResize() {\n\n\t\tconst box = this.domElement.getBoundingClientRect();\n\t\t// adjustments come from similar code in the jquery offset() function\n\t\tconst d = this.domElement.ownerDocument.documentElement;\n\n\t\tthis.screen.left = box.left + window.pageXOffset - d.clientLeft;\n\t\tthis.screen.top = box.top + window.pageYOffset - d.clientTop;\n\t\tthis.screen.width = box.width;\n\t\tthis.screen.height = box.height;\n\n\t}\n\n\tupdate() {\n\n\t\tthis._eye.subVectors( this.object.position, this.target );\n\n\t\tif ( ! this.noRotate ) {\n\n\t\t\tthis._rotateCamera();\n\n\t\t}\n\n\t\tif ( ! this.noZoom ) {\n\n\t\t\tthis._zoomCamera();\n\n\t\t}\n\n\t\tif ( ! this.noPan ) {\n\n\t\t\tthis._panCamera();\n\n\t\t}\n\n\t\tthis.object.position.addVectors( this.target, this._eye );\n\n\t\tif ( this.object.isPerspectiveCamera ) {\n\n\t\t\tthis._checkDistances();\n\n\t\t\tthis.object.lookAt( this.target );\n\n\t\t\tif ( this._lastPosition.distanceToSquared( this.object.position ) > _EPS ) {\n\n\t\t\t\tthis.dispatchEvent( _changeEvent );\n\n\t\t\t\tthis._lastPosition.copy( this.object.position );\n\n\t\t\t}\n\n\t\t} else if ( this.object.isOrthographicCamera ) {\n\n\t\t\tthis.object.lookAt( this.target );\n\n\t\t\tif ( this._lastPosition.distanceToSquared( this.object.position ) > _EPS || this._lastZoom !== this.object.zoom ) {\n\n\t\t\t\tthis.dispatchEvent( _changeEvent );\n\n\t\t\t\tthis._lastPosition.copy( this.object.position );\n\t\t\t\tthis._lastZoom = this.object.zoom;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.TrackballControls: Unsupported camera type.' );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Resets the controls to its initial state.\n\t */\n\treset() {\n\n\t\tthis.state = _STATE.NONE;\n\t\tthis.keyState = _STATE.NONE;\n\n\t\tthis.target.copy( this._target0 );\n\t\tthis.object.position.copy( this._position0 );\n\t\tthis.object.up.copy( this._up0 );\n\t\tthis.object.zoom = this._zoom0;\n\n\t\tthis.object.updateProjectionMatrix();\n\n\t\tthis._eye.subVectors( this.object.position, this.target );\n\n\t\tthis.object.lookAt( this.target );\n\n\t\tthis.dispatchEvent( _changeEvent );\n\n\t\tthis._lastPosition.copy( this.object.position );\n\t\tthis._lastZoom = this.object.zoom;\n\n\t}\n\n\t_panCamera() {\n\n\t\t_mouseChange.copy( this._panEnd ).sub( this._panStart );\n\n\t\tif ( _mouseChange.lengthSq() ) {\n\n\t\t\tif ( this.object.isOrthographicCamera ) {\n\n\t\t\t\tconst scale_x = ( this.object.right - this.object.left ) / this.object.zoom / this.domElement.clientWidth;\n\t\t\t\tconst scale_y = ( this.object.top - this.object.bottom ) / this.object.zoom / this.domElement.clientWidth;\n\n\t\t\t\t_mouseChange.x *= scale_x;\n\t\t\t\t_mouseChange.y *= scale_y;\n\n\t\t\t}\n\n\t\t\t_mouseChange.multiplyScalar( this._eye.length() * this.panSpeed );\n\n\t\t\t_pan.copy( this._eye ).cross( this.object.up ).setLength( _mouseChange.x );\n\t\t\t_pan.add( _objectUp.copy( this.object.up ).setLength( _mouseChange.y ) );\n\n\t\t\tthis.object.position.add( _pan );\n\t\t\tthis.target.add( _pan );\n\n\t\t\tif ( this.staticMoving ) {\n\n\t\t\t\tthis._panStart.copy( this._panEnd );\n\n\t\t\t} else {\n\n\t\t\t\tthis._panStart.add( _mouseChange.subVectors( this._panEnd, this._panStart ).multiplyScalar( this.dynamicDampingFactor ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_rotateCamera() {\n\n\t\t_moveDirection.set( this._moveCurr.x - this._movePrev.x, this._moveCurr.y - this._movePrev.y, 0 );\n\t\tlet angle = _moveDirection.length();\n\n\t\tif ( angle ) {\n\n\t\t\tthis._eye.copy( this.object.position ).sub( this.target );\n\n\t\t\t_eyeDirection.copy( this._eye ).normalize();\n\t\t\t_objectUpDirection.copy( this.object.up ).normalize();\n\t\t\t_objectSidewaysDirection.crossVectors( _objectUpDirection, _eyeDirection ).normalize();\n\n\t\t\t_objectUpDirection.setLength( this._moveCurr.y - this._movePrev.y );\n\t\t\t_objectSidewaysDirection.setLength( this._moveCurr.x - this._movePrev.x );\n\n\t\t\t_moveDirection.copy( _objectUpDirection.add( _objectSidewaysDirection ) );\n\n\t\t\t_axis.crossVectors( _moveDirection, this._eye ).normalize();\n\n\t\t\tangle *= this.rotateSpeed;\n\t\t\t_quaternion.setFromAxisAngle( _axis, angle );\n\n\t\t\tthis._eye.applyQuaternion( _quaternion );\n\t\t\tthis.object.up.applyQuaternion( _quaternion );\n\n\t\t\tthis._lastAxis.copy( _axis );\n\t\t\tthis._lastAngle = angle;\n\n\t\t} else if ( ! this.staticMoving && this._lastAngle ) {\n\n\t\t\tthis._lastAngle *= Math.sqrt( 1.0 - this.dynamicDampingFactor );\n\t\t\tthis._eye.copy( this.object.position ).sub( this.target );\n\t\t\t_quaternion.setFromAxisAngle( this._lastAxis, this._lastAngle );\n\t\t\tthis._eye.applyQuaternion( _quaternion );\n\t\t\tthis.object.up.applyQuaternion( _quaternion );\n\n\t\t}\n\n\t\tthis._movePrev.copy( this._moveCurr );\n\n\t}\n\n\t_zoomCamera() {\n\n\t\tlet factor;\n\n\t\tif ( this.state === _STATE.TOUCH_ZOOM_PAN ) {\n\n\t\t\tfactor = this._touchZoomDistanceStart / this._touchZoomDistanceEnd;\n\t\t\tthis._touchZoomDistanceStart = this._touchZoomDistanceEnd;\n\n\t\t\tif ( this.object.isPerspectiveCamera ) {\n\n\t\t\t\tthis._eye.multiplyScalar( factor );\n\n\t\t\t} else if ( this.object.isOrthographicCamera ) {\n\n\t\t\t\tthis.object.zoom = MathUtils.clamp( this.object.zoom / factor, this.minZoom, this.maxZoom );\n\n\t\t\t\tif ( this._lastZoom !== this.object.zoom ) {\n\n\t\t\t\t\tthis.object.updateProjectionMatrix();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'THREE.TrackballControls: Unsupported camera type' );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tfactor = 1.0 + ( this._zoomEnd.y - this._zoomStart.y ) * this.zoomSpeed;\n\n\t\t\tif ( factor !== 1.0 && factor > 0.0 ) {\n\n\t\t\t\tif ( this.object.isPerspectiveCamera ) {\n\n\t\t\t\t\tthis._eye.multiplyScalar( factor );\n\n\t\t\t\t} else if ( this.object.isOrthographicCamera ) {\n\n\t\t\t\t\tthis.object.zoom = MathUtils.clamp( this.object.zoom / factor, this.minZoom, this.maxZoom );\n\n\t\t\t\t\tif ( this._lastZoom !== this.object.zoom ) {\n\n\t\t\t\t\t\tthis.object.updateProjectionMatrix();\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.TrackballControls: Unsupported camera type' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( this.staticMoving ) {\n\n\t\t\t\tthis._zoomStart.copy( this._zoomEnd );\n\n\t\t\t} else {\n\n\t\t\t\tthis._zoomStart.y += ( this._zoomEnd.y - this._zoomStart.y ) * this.dynamicDampingFactor;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_getMouseOnScreen( pageX, pageY ) {\n\n\t\t_v2.set(\n\t\t\t( pageX - this.screen.left ) / this.screen.width,\n\t\t\t( pageY - this.screen.top ) / this.screen.height\n\t\t);\n\n\t\treturn _v2;\n\n\t}\n\n\t_getMouseOnCircle( pageX, pageY ) {\n\n\t\t_v2.set(\n\t\t\t( ( pageX - this.screen.width * 0.5 - this.screen.left ) / ( this.screen.width * 0.5 ) ),\n\t\t\t( ( this.screen.height + 2 * ( this.screen.top - pageY ) ) / this.screen.width ) // screen.width intentional\n\t\t);\n\n\t\treturn _v2;\n\n\t}\n\n\t_addPointer( event ) {\n\n\t\tthis._pointers.push( event );\n\n\t}\n\n\t_removePointer( event ) {\n\n\t\tdelete this._pointerPositions[ event.pointerId ];\n\n\t\tfor ( let i = 0; i < this._pointers.length; i ++ ) {\n\n\t\t\tif ( this._pointers[ i ].pointerId == event.pointerId ) {\n\n\t\t\t\tthis._pointers.splice( i, 1 );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_trackPointer( event ) {\n\n\t\tlet position = this._pointerPositions[ event.pointerId ];\n\n\t\tif ( position === undefined ) {\n\n\t\t\tposition = new Vector2();\n\t\t\tthis._pointerPositions[ event.pointerId ] = position;\n\n\t\t}\n\n\t\tposition.set( event.pageX, event.pageY );\n\n\t}\n\n\t_getSecondPointerPosition( event ) {\n\n\t\tconst pointer = ( event.pointerId === this._pointers[ 0 ].pointerId ) ? this._pointers[ 1 ] : this._pointers[ 0 ];\n\n\t\treturn this._pointerPositions[ pointer.pointerId ];\n\n\t}\n\n\t_checkDistances() {\n\n\t\tif ( ! this.noZoom || ! this.noPan ) {\n\n\t\t\tif ( this._eye.lengthSq() > this.maxDistance * this.maxDistance ) {\n\n\t\t\t\tthis.object.position.addVectors( this.target, this._eye.setLength( this.maxDistance ) );\n\t\t\t\tthis._zoomStart.copy( this._zoomEnd );\n\n\t\t\t}\n\n\t\t\tif ( this._eye.lengthSq() < this.minDistance * this.minDistance ) {\n\n\t\t\t\tthis.object.position.addVectors( this.target, this._eye.setLength( this.minDistance ) );\n\t\t\t\tthis._zoomStart.copy( this._zoomEnd );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nfunction onPointerDown( event ) {\n\n\tif ( this.enabled === false ) return;\n\n\tif ( this._pointers.length === 0 ) {\n\n\t\tthis.domElement.setPointerCapture( event.pointerId );\n\n\t\tthis.domElement.ownerDocument.addEventListener( 'pointermove', this._onPointerMove );\n\t\tthis.domElement.ownerDocument.addEventListener( 'pointerup', this._onPointerUp );\n\n\t}\n\n\t//\n\n\tthis._addPointer( event );\n\n\tif ( event.pointerType === 'touch' ) {\n\n\t\tthis._onTouchStart( event );\n\n\t} else {\n\n\t\tthis._onMouseDown( event );\n\n\t}\n\n}\n\nfunction onPointerMove( event ) {\n\n\tif ( this.enabled === false ) return;\n\n\tif ( event.pointerType === 'touch' ) {\n\n\t\tthis._onTouchMove( event );\n\n\t} else {\n\n\t\tthis._onMouseMove( event );\n\n\t}\n\n}\n\nfunction onPointerUp( event ) {\n\n\tif ( this.enabled === false ) return;\n\n\tif ( event.pointerType === 'touch' ) {\n\n\t\tthis._onTouchEnd( event );\n\n\t} else {\n\n\t\tthis._onMouseUp();\n\n\t}\n\n\t//\n\n\tthis._removePointer( event );\n\n\tif ( this._pointers.length === 0 ) {\n\n\t\tthis.domElement.releasePointerCapture( event.pointerId );\n\n\t\tthis.domElement.ownerDocument.removeEventListener( 'pointermove', this._onPointerMove );\n\t\tthis.domElement.ownerDocument.removeEventListener( 'pointerup', this._onPointerUp );\n\n\t}\n\n}\n\nfunction onPointerCancel( event ) {\n\n\tthis._removePointer( event );\n\n}\n\nfunction onKeyUp() {\n\n\tif ( this.enabled === false ) return;\n\n\tthis.keyState = _STATE.NONE;\n\n\twindow.addEventListener( 'keydown', this._onKeyDown );\n\n}\n\nfunction onKeyDown( event ) {\n\n\tif ( this.enabled === false ) return;\n\n\twindow.removeEventListener( 'keydown', this._onKeyDown );\n\n\tif ( this.keyState !== _STATE.NONE ) {\n\n\t\treturn;\n\n\t} else if ( event.code === this.keys[ _STATE.ROTATE ] && ! this.noRotate ) {\n\n\t\tthis.keyState = _STATE.ROTATE;\n\n\t} else if ( event.code === this.keys[ _STATE.ZOOM ] && ! this.noZoom ) {\n\n\t\tthis.keyState = _STATE.ZOOM;\n\n\t} else if ( event.code === this.keys[ _STATE.PAN ] && ! this.noPan ) {\n\n\t\tthis.keyState = _STATE.PAN;\n\n\t}\n\n}\n\nfunction onMouseDown( event ) {\n\n\tlet mouseAction;\n\n\tswitch ( event.button ) {\n\n\t\tcase 0:\n\t\t\tmouseAction = this.mouseButtons.LEFT;\n\t\t\tbreak;\n\n\t\tcase 1:\n\t\t\tmouseAction = this.mouseButtons.MIDDLE;\n\t\t\tbreak;\n\n\t\tcase 2:\n\t\t\tmouseAction = this.mouseButtons.RIGHT;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tmouseAction = - 1;\n\n\t}\n\n\tswitch ( mouseAction ) {\n\n\t\tcase MOUSE.DOLLY:\n\t\t\tthis.state = _STATE.ZOOM;\n\t\t\tbreak;\n\n\t\tcase MOUSE.ROTATE:\n\t\t\tthis.state = _STATE.ROTATE;\n\t\t\tbreak;\n\n\t\tcase MOUSE.PAN:\n\t\t\tthis.state = _STATE.PAN;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\tthis.state = _STATE.NONE;\n\n\t}\n\n\tconst state = ( this.keyState !== _STATE.NONE ) ? this.keyState : this.state;\n\n\tif ( state === _STATE.ROTATE && ! this.noRotate ) {\n\n\t\tthis._moveCurr.copy( this._getMouseOnCircle( event.pageX, event.pageY ) );\n\t\tthis._movePrev.copy( this._moveCurr );\n\n\t} else if ( state === _STATE.ZOOM && ! this.noZoom ) {\n\n\t\tthis._zoomStart.copy( this._getMouseOnScreen( event.pageX, event.pageY ) );\n\t\tthis._zoomEnd.copy( this._zoomStart );\n\n\t} else if ( state === _STATE.PAN && ! this.noPan ) {\n\n\t\tthis._panStart.copy( this._getMouseOnScreen( event.pageX, event.pageY ) );\n\t\tthis._panEnd.copy( this._panStart );\n\n\t}\n\n\tthis.dispatchEvent( _startEvent );\n\n}\n\nfunction onMouseMove( event ) {\n\n\tconst state = ( this.keyState !== _STATE.NONE ) ? this.keyState : this.state;\n\n\tif ( state === _STATE.ROTATE && ! this.noRotate ) {\n\n\t\tthis._movePrev.copy( this._moveCurr );\n\t\tthis._moveCurr.copy( this._getMouseOnCircle( event.pageX, event.pageY ) );\n\n\t} else if ( state === _STATE.ZOOM && ! this.noZoom ) {\n\n\t\tthis._zoomEnd.copy( this._getMouseOnScreen( event.pageX, event.pageY ) );\n\n\t} else if ( state === _STATE.PAN && ! this.noPan ) {\n\n\t\tthis._panEnd.copy( this._getMouseOnScreen( event.pageX, event.pageY ) );\n\n\t}\n\n}\n\nfunction onMouseUp() {\n\n\tthis.state = _STATE.NONE;\n\n\tthis.dispatchEvent( _endEvent );\n\n}\n\nfunction onMouseWheel( event ) {\n\n\tif ( this.enabled === false ) return;\n\n\tif ( this.noZoom === true ) return;\n\n\tevent.preventDefault();\n\n\tswitch ( event.deltaMode ) {\n\n\t\tcase 2:\n\t\t\t// Zoom in pages\n\t\t\tthis._zoomStart.y -= event.deltaY * 0.025;\n\t\t\tbreak;\n\n\t\tcase 1:\n\t\t\t// Zoom in lines\n\t\t\tthis._zoomStart.y -= event.deltaY * 0.01;\n\t\t\tbreak;\n\n\t\tdefault:\n\t\t\t// undefined, 0, assume pixels\n\t\t\tthis._zoomStart.y -= event.deltaY * 0.00025;\n\t\t\tbreak;\n\n\t}\n\n\tthis.dispatchEvent( _startEvent );\n\tthis.dispatchEvent( _endEvent );\n\n}\n\nfunction onContextMenu( event ) {\n\n\tif ( this.enabled === false ) return;\n\n\tevent.preventDefault();\n\n}\n\nfunction onTouchStart( event ) {\n\n\tthis._trackPointer( event );\n\n\tswitch ( this._pointers.length ) {\n\n\t\tcase 1:\n\t\t\tthis.state = _STATE.TOUCH_ROTATE;\n\t\t\tthis._moveCurr.copy( this._getMouseOnCircle( this._pointers[ 0 ].pageX, this._pointers[ 0 ].pageY ) );\n\t\t\tthis._movePrev.copy( this._moveCurr );\n\t\t\tbreak;\n\n\t\tdefault: // 2 or more\n\t\t\tthis.state = _STATE.TOUCH_ZOOM_PAN;\n\t\t\tconst dx = this._pointers[ 0 ].pageX - this._pointers[ 1 ].pageX;\n\t\t\tconst dy = this._pointers[ 0 ].pageY - this._pointers[ 1 ].pageY;\n\t\t\tthis._touchZoomDistanceEnd = this._touchZoomDistanceStart = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tconst x = ( this._pointers[ 0 ].pageX + this._pointers[ 1 ].pageX ) / 2;\n\t\t\tconst y = ( this._pointers[ 0 ].pageY + this._pointers[ 1 ].pageY ) / 2;\n\t\t\tthis._panStart.copy( this._getMouseOnScreen( x, y ) );\n\t\t\tthis._panEnd.copy( this._panStart );\n\t\t\tbreak;\n\n\t}\n\n\tthis.dispatchEvent( _startEvent );\n\n}\n\nfunction onTouchMove( event ) {\n\n\tthis._trackPointer( event );\n\n\tswitch ( this._pointers.length ) {\n\n\t\tcase 1:\n\t\t\tthis._movePrev.copy( this._moveCurr );\n\t\t\tthis._moveCurr.copy( this._getMouseOnCircle( event.pageX, event.pageY ) );\n\t\t\tbreak;\n\n\t\tdefault: // 2 or more\n\n\t\t\tconst position = this._getSecondPointerPosition( event );\n\n\t\t\tconst dx = event.pageX - position.x;\n\t\t\tconst dy = event.pageY - position.y;\n\t\t\tthis._touchZoomDistanceEnd = Math.sqrt( dx * dx + dy * dy );\n\n\t\t\tconst x = ( event.pageX + position.x ) / 2;\n\t\t\tconst y = ( event.pageY + position.y ) / 2;\n\t\t\tthis._panEnd.copy( this._getMouseOnScreen( x, y ) );\n\t\t\tbreak;\n\n\t}\n\n}\n\nfunction onTouchEnd( event ) {\n\n\tswitch ( this._pointers.length ) {\n\n\t\tcase 0:\n\t\t\tthis.state = _STATE.NONE;\n\t\t\tbreak;\n\n\t\tcase 1:\n\t\t\tthis.state = _STATE.TOUCH_ROTATE;\n\t\t\tthis._moveCurr.copy( this._getMouseOnCircle( event.pageX, event.pageY ) );\n\t\t\tthis._movePrev.copy( this._moveCurr );\n\t\t\tbreak;\n\n\t\tcase 2:\n\t\t\tthis.state = _STATE.TOUCH_ZOOM_PAN;\n\n\t\t\tfor ( let i = 0; i < this._pointers.length; i ++ ) {\n\n\t\t\t\tif ( this._pointers[ i ].pointerId !== event.pointerId ) {\n\n\t\t\t\t\tconst position = this._pointerPositions[ this._pointers[ i ].pointerId ];\n\t\t\t\t\tthis._moveCurr.copy( this._getMouseOnCircle( position.x, position.y ) );\n\t\t\t\t\tthis._movePrev.copy( this._moveCurr );\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tbreak;\n\n\t}\n\n\tthis.dispatchEvent( _endEvent );\n\n}\n\nexport { TrackballControls };\n", "import {\n\tBoxGeometry,\n\tBufferGeometry,\n\tControls,\n\tCylinderGeometry,\n\tDoubleSide,\n\tEuler,\n\tFloat32BufferAttribute,\n\tLine,\n\tLineBasicMaterial,\n\tMatrix4,\n\tMesh,\n\tMeshBasicMaterial,\n\tObject3D,\n\tOctahedronGeometry,\n\tPlaneGeometry,\n\tQuaternion,\n\tRaycaster,\n\tSphereGeometry,\n\tTorusGeometry,\n\tVector3\n} from 'three';\n\nconst _raycaster = new Raycaster();\n\nconst _tempVector = new Vector3();\nconst _tempVector2 = new Vector3();\nconst _tempQuaternion = new Quaternion();\nconst _unit = {\n\tX: new Vector3( 1, 0, 0 ),\n\tY: new Vector3( 0, 1, 0 ),\n\tZ: new Vector3( 0, 0, 1 )\n};\n\n/**\n * Fires if any type of change (object or property change) is performed. Property changes\n * are separate events you can add event listeners to. The event type is \"propertyname-changed\".\n *\n * @event TransformControls#change\n * @type {Object}\n */\nconst _changeEvent = { type: 'change' };\n\n/**\n * Fires if a pointer (mouse/touch) becomes active.\n *\n * @event TransformControls#mouseDown\n * @type {Object}\n */\nconst _mouseDownEvent = { type: 'mouseDown', mode: null };\n\n/**\n * Fires if a pointer (mouse/touch) is no longer active.\n *\n * @event TransformControls#mouseUp\n * @type {Object}\n */\nconst _mouseUpEvent = { type: 'mouseUp', mode: null };\n\n/**\n * Fires if the controlled 3D object is changed.\n *\n * @event TransformControls#objectChange\n * @type {Object}\n */\nconst _objectChangeEvent = { type: 'objectChange' };\n\n/**\n * This class can be used to transform objects in 3D space by adapting a similar interaction model\n * of DCC tools like Blender. Unlike other controls, it is not intended to transform the scene's camera.\n *\n * `TransformControls` expects that its attached 3D object is part of the scene graph.\n *\n * @augments Controls\n * @three_import import { TransformControls } from 'three/addons/controls/TransformControls.js';\n */\nclass TransformControls extends Controls {\n\n\t/**\n\t * Constructs a new controls instance.\n\t *\n\t * @param {Camera} camera - The camera of the rendered scene.\n\t * @param {?HTMLElement} domElement - The HTML element used for event listeners.\n\t */\n\tconstructor( camera, domElement = null ) {\n\n\t\tsuper( undefined, domElement );\n\n\t\tconst root = new TransformControlsRoot( this );\n\t\tthis._root = root;\n\n\t\tconst gizmo = new TransformControlsGizmo();\n\t\tthis._gizmo = gizmo;\n\t\troot.add( gizmo );\n\n\t\tconst plane = new TransformControlsPlane();\n\t\tthis._plane = plane;\n\t\troot.add( plane );\n\n\t\tconst scope = this;\n\n\t\t// Defined getter, setter and store for a property\n\t\tfunction defineProperty( propName, defaultValue ) {\n\n\t\t\tlet propValue = defaultValue;\n\n\t\t\tObject.defineProperty( scope, propName, {\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn propValue !== undefined ? propValue : defaultValue;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tif ( propValue !== value ) {\n\n\t\t\t\t\t\tpropValue = value;\n\t\t\t\t\t\tplane[ propName ] = value;\n\t\t\t\t\t\tgizmo[ propName ] = value;\n\n\t\t\t\t\t\tscope.dispatchEvent( { type: propName + '-changed', value: value } );\n\t\t\t\t\t\tscope.dispatchEvent( _changeEvent );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tscope[ propName ] = defaultValue;\n\t\t\tplane[ propName ] = defaultValue;\n\t\t\tgizmo[ propName ] = defaultValue;\n\n\t\t}\n\n\t\t// Define properties with getters/setter\n\t\t// Setting the defined property will automatically trigger change event\n\t\t// Defined properties are passed down to gizmo and plane\n\n\t\t/**\n\t\t * The camera of the rendered scene.\n\t\t *\n\t\t * @name TransformControls#camera\n\t\t * @type {Camera}\n\t\t */\n\t\tdefineProperty( 'camera', camera );\n\t\tdefineProperty( 'object', undefined );\n\t\tdefineProperty( 'enabled', true );\n\n\t\t/**\n\t\t * The current transformation axis.\n\t\t *\n\t\t * @name TransformControls#axis\n\t\t * @type {string}\n\t\t */\n\t\tdefineProperty( 'axis', null );\n\n\t\t/**\n\t\t * The current transformation axis.\n\t\t *\n\t\t * @name TransformControls#mode\n\t\t * @type {('translate'|'rotate'|'scale')}\n\t\t * @default 'translate'\n\t\t */\n\t\tdefineProperty( 'mode', 'translate' );\n\n\t\t/**\n\t\t * By default, 3D objects are continuously translated. If you set this property to a numeric\n\t\t * value (world units), you can define in which steps the 3D object should be translated.\n\t\t *\n\t\t * @name TransformControls#translationSnap\n\t\t * @type {?number}\n\t\t * @default null\n\t\t */\n\t\tdefineProperty( 'translationSnap', null );\n\n\t\t/**\n\t\t * By default, 3D objects are continuously rotated. If you set this property to a numeric\n\t\t * value (radians), you can define in which steps the 3D object should be rotated.\n\t\t *\n\t\t * @name TransformControls#rotationSnap\n\t\t * @type {?number}\n\t\t * @default null\n\t\t */\n\t\tdefineProperty( 'rotationSnap', null );\n\n\t\t/**\n\t\t * By default, 3D objects are continuously scaled. If you set this property to a numeric\n\t\t * value, you can define in which steps the 3D object should be scaled.\n\t\t *\n\t\t * @name TransformControls#scaleSnap\n\t\t * @type {?number}\n\t\t * @default null\n\t\t */\n\t\tdefineProperty( 'scaleSnap', null );\n\n\t\t/**\n\t\t * Defines in which coordinate space transformations should be performed.\n\t\t *\n\t\t * @name TransformControls#space\n\t\t * @type {('world'|'local')}\n\t\t * @default 'world'\n\t\t */\n\t\tdefineProperty( 'space', 'world' );\n\n\t\t/**\n\t\t * The size of the helper UI (axes/planes).\n\t\t *\n\t\t * @name TransformControls#size\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tdefineProperty( 'size', 1 );\n\n\t\t/**\n\t\t * Whether dragging is currently performed or not.\n\t\t *\n\t\t * @name TransformControls#dragging\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tdefineProperty( 'dragging', false );\n\n\t\t/**\n\t\t * Whether the x-axis helper should be visible or not.\n\t\t *\n\t\t * @name TransformControls#showX\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tdefineProperty( 'showX', true );\n\n\t\t/**\n\t\t * Whether the y-axis helper should be visible or not.\n\t\t *\n\t\t * @name TransformControls#showY\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tdefineProperty( 'showY', true );\n\n\t\t/**\n\t\t * Whether the z-axis helper should be visible or not.\n\t\t *\n\t\t * @name TransformControls#showZ\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tdefineProperty( 'showZ', true );\n\n\t\t/**\n\t\t * The minimum allowed X position during translation.\n\t\t *\n\t\t * @name TransformControls#minX\n\t\t * @type {number}\n\t\t * @default -Infinity\n\t\t */\n\t\tdefineProperty( 'minX', - Infinity );\n\n\t\t/**\n\t\t * The maximum allowed X position during translation.\n\t\t *\n\t\t * @name TransformControls#maxX\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tdefineProperty( 'maxX', Infinity );\n\n\t\t/**\n\t\t * The minimum allowed y position during translation.\n\t\t *\n\t\t * @name TransformControls#minY\n\t\t * @type {number}\n\t\t * @default -Infinity\n\t\t */\n\t\tdefineProperty( 'minY', - Infinity );\n\n\t\t/**\n\t\t * The maximum allowed Y position during translation.\n\t\t *\n\t\t * @name TransformControls#maxY\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tdefineProperty( 'maxY', Infinity );\n\n\t\t/**\n\t\t * The minimum allowed z position during translation.\n\t\t *\n\t\t * @name TransformControls#minZ\n\t\t * @type {number}\n\t\t * @default -Infinity\n\t\t */\n\t\tdefineProperty( 'minZ', - Infinity );\n\n\t\t/**\n\t\t * The maximum allowed Z position during translation.\n\t\t *\n\t\t * @name TransformControls#maxZ\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tdefineProperty( 'maxZ', Infinity );\n\n\t\t// Reusable utility variables\n\n\t\tconst worldPosition = new Vector3();\n\t\tconst worldPositionStart = new Vector3();\n\t\tconst worldQuaternion = new Quaternion();\n\t\tconst worldQuaternionStart = new Quaternion();\n\t\tconst cameraPosition = new Vector3();\n\t\tconst cameraQuaternion = new Quaternion();\n\t\tconst pointStart = new Vector3();\n\t\tconst pointEnd = new Vector3();\n\t\tconst rotationAxis = new Vector3();\n\t\tconst rotationAngle = 0;\n\t\tconst eye = new Vector3();\n\n\t\t// TODO: remove properties unused in plane and gizmo\n\n\t\tdefineProperty( 'worldPosition', worldPosition );\n\t\tdefineProperty( 'worldPositionStart', worldPositionStart );\n\t\tdefineProperty( 'worldQuaternion', worldQuaternion );\n\t\tdefineProperty( 'worldQuaternionStart', worldQuaternionStart );\n\t\tdefineProperty( 'cameraPosition', cameraPosition );\n\t\tdefineProperty( 'cameraQuaternion', cameraQuaternion );\n\t\tdefineProperty( 'pointStart', pointStart );\n\t\tdefineProperty( 'pointEnd', pointEnd );\n\t\tdefineProperty( 'rotationAxis', rotationAxis );\n\t\tdefineProperty( 'rotationAngle', rotationAngle );\n\t\tdefineProperty( 'eye', eye );\n\n\t\tthis._offset = new Vector3();\n\t\tthis._startNorm = new Vector3();\n\t\tthis._endNorm = new Vector3();\n\t\tthis._cameraScale = new Vector3();\n\n\t\tthis._parentPosition = new Vector3();\n\t\tthis._parentQuaternion = new Quaternion();\n\t\tthis._parentQuaternionInv = new Quaternion();\n\t\tthis._parentScale = new Vector3();\n\n\t\tthis._worldScaleStart = new Vector3();\n\t\tthis._worldQuaternionInv = new Quaternion();\n\t\tthis._worldScale = new Vector3();\n\n\t\tthis._positionStart = new Vector3();\n\t\tthis._quaternionStart = new Quaternion();\n\t\tthis._scaleStart = new Vector3();\n\n\t\tthis._getPointer = getPointer.bind( this );\n\t\tthis._onPointerDown = onPointerDown.bind( this );\n\t\tthis._onPointerHover = onPointerHover.bind( this );\n\t\tthis._onPointerMove = onPointerMove.bind( this );\n\t\tthis._onPointerUp = onPointerUp.bind( this );\n\n\t\tif ( domElement !== null ) {\n\n\t\t\tthis.connect( domElement );\n\n\t\t}\n\n\t}\n\n\tconnect( element ) {\n\n\t\tsuper.connect( element );\n\n\t\tthis.domElement.addEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.domElement.addEventListener( 'pointermove', this._onPointerHover );\n\t\tthis.domElement.addEventListener( 'pointerup', this._onPointerUp );\n\n\t\tthis.domElement.style.touchAction = 'none'; // disable touch scroll\n\n\t}\n\n\tdisconnect() {\n\n\t\tthis.domElement.removeEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.domElement.removeEventListener( 'pointermove', this._onPointerHover );\n\t\tthis.domElement.removeEventListener( 'pointermove', this._onPointerMove );\n\t\tthis.domElement.removeEventListener( 'pointerup', this._onPointerUp );\n\n\t\tthis.domElement.style.touchAction = 'auto';\n\n\t}\n\n\t/**\n\t * Returns the visual representation of the controls. Add the helper to your scene to\n\t * visually transform the attached  3D object.\n\t *\n\t * @return {TransformControlsRoot} The helper.\n\t */\n\tgetHelper() {\n\n\t\treturn this._root;\n\n\t}\n\n\tpointerHover( pointer ) {\n\n\t\tif ( this.object === undefined || this.dragging === true ) return;\n\n\t\tif ( pointer !== null ) _raycaster.setFromCamera( pointer, this.camera );\n\n\t\tconst intersect = intersectObjectWithRay( this._gizmo.picker[ this.mode ], _raycaster );\n\n\t\tif ( intersect ) {\n\n\t\t\tthis.axis = intersect.object.name;\n\n\t\t} else {\n\n\t\t\tthis.axis = null;\n\n\t\t}\n\n\t}\n\n\tpointerDown( pointer ) {\n\n\t\tif ( this.object === undefined || this.dragging === true || ( pointer != null && pointer.button !== 0 ) ) return;\n\n\t\tif ( this.axis !== null ) {\n\n\t\t\tif ( pointer !== null ) _raycaster.setFromCamera( pointer, this.camera );\n\n\t\t\tconst planeIntersect = intersectObjectWithRay( this._plane, _raycaster, true );\n\n\t\t\tif ( planeIntersect ) {\n\n\t\t\t\tthis.object.updateMatrixWorld();\n\t\t\t\tthis.object.parent.updateMatrixWorld();\n\n\t\t\t\tthis._positionStart.copy( this.object.position );\n\t\t\t\tthis._quaternionStart.copy( this.object.quaternion );\n\t\t\t\tthis._scaleStart.copy( this.object.scale );\n\n\t\t\t\tthis.object.matrixWorld.decompose( this.worldPositionStart, this.worldQuaternionStart, this._worldScaleStart );\n\n\t\t\t\tthis.pointStart.copy( planeIntersect.point ).sub( this.worldPositionStart );\n\n\t\t\t}\n\n\t\t\tthis.dragging = true;\n\t\t\t_mouseDownEvent.mode = this.mode;\n\t\t\tthis.dispatchEvent( _mouseDownEvent );\n\n\t\t}\n\n\t}\n\n\tpointerMove( pointer ) {\n\n\t\tconst axis = this.axis;\n\t\tconst mode = this.mode;\n\t\tconst object = this.object;\n\t\tlet space = this.space;\n\n\t\tif ( mode === 'scale' ) {\n\n\t\t\tspace = 'local';\n\n\t\t} else if ( axis === 'E' || axis === 'XYZE' || axis === 'XYZ' ) {\n\n\t\t\tspace = 'world';\n\n\t\t}\n\n\t\tif ( object === undefined || axis === null || this.dragging === false || ( pointer !== null && pointer.button !== - 1 ) ) return;\n\n\t\tif ( pointer !== null ) _raycaster.setFromCamera( pointer, this.camera );\n\n\t\tconst planeIntersect = intersectObjectWithRay( this._plane, _raycaster, true );\n\n\t\tif ( ! planeIntersect ) return;\n\n\t\tthis.pointEnd.copy( planeIntersect.point ).sub( this.worldPositionStart );\n\n\t\tif ( mode === 'translate' ) {\n\n\t\t\t// Apply translate\n\n\t\t\tthis._offset.copy( this.pointEnd ).sub( this.pointStart );\n\n\t\t\tif ( space === 'local' && axis !== 'XYZ' ) {\n\n\t\t\t\tthis._offset.applyQuaternion( this._worldQuaternionInv );\n\n\t\t\t}\n\n\t\t\tif ( axis.indexOf( 'X' ) === - 1 ) this._offset.x = 0;\n\t\t\tif ( axis.indexOf( 'Y' ) === - 1 ) this._offset.y = 0;\n\t\t\tif ( axis.indexOf( 'Z' ) === - 1 ) this._offset.z = 0;\n\n\t\t\tif ( space === 'local' && axis !== 'XYZ' ) {\n\n\t\t\t\tthis._offset.applyQuaternion( this._quaternionStart ).divide( this._parentScale );\n\n\t\t\t} else {\n\n\t\t\t\tthis._offset.applyQuaternion( this._parentQuaternionInv ).divide( this._parentScale );\n\n\t\t\t}\n\n\t\t\tobject.position.copy( this._offset ).add( this._positionStart );\n\n\t\t\t// Apply translation snap\n\n\t\t\tif ( this.translationSnap ) {\n\n\t\t\t\tif ( space === 'local' ) {\n\n\t\t\t\t\tobject.position.applyQuaternion( _tempQuaternion.copy( this._quaternionStart ).invert() );\n\n\t\t\t\t\tif ( axis.search( 'X' ) !== - 1 ) {\n\n\t\t\t\t\t\tobject.position.x = Math.round( object.position.x / this.translationSnap ) * this.translationSnap;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( axis.search( 'Y' ) !== - 1 ) {\n\n\t\t\t\t\t\tobject.position.y = Math.round( object.position.y / this.translationSnap ) * this.translationSnap;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( axis.search( 'Z' ) !== - 1 ) {\n\n\t\t\t\t\t\tobject.position.z = Math.round( object.position.z / this.translationSnap ) * this.translationSnap;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobject.position.applyQuaternion( this._quaternionStart );\n\n\t\t\t\t}\n\n\t\t\t\tif ( space === 'world' ) {\n\n\t\t\t\t\tif ( object.parent ) {\n\n\t\t\t\t\t\tobject.position.add( _tempVector.setFromMatrixPosition( object.parent.matrixWorld ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( axis.search( 'X' ) !== - 1 ) {\n\n\t\t\t\t\t\tobject.position.x = Math.round( object.position.x / this.translationSnap ) * this.translationSnap;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( axis.search( 'Y' ) !== - 1 ) {\n\n\t\t\t\t\t\tobject.position.y = Math.round( object.position.y / this.translationSnap ) * this.translationSnap;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( axis.search( 'Z' ) !== - 1 ) {\n\n\t\t\t\t\t\tobject.position.z = Math.round( object.position.z / this.translationSnap ) * this.translationSnap;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( object.parent ) {\n\n\t\t\t\t\t\tobject.position.sub( _tempVector.setFromMatrixPosition( object.parent.matrixWorld ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tobject.position.x = Math.max( this.minX, Math.min( this.maxX, object.position.x ) );\n\t\t\tobject.position.y = Math.max( this.minY, Math.min( this.maxY, object.position.y ) );\n\t\t\tobject.position.z = Math.max( this.minZ, Math.min( this.maxZ, object.position.z ) );\n\n\t\t} else if ( mode === 'scale' ) {\n\n\t\t\tif ( axis.search( 'XYZ' ) !== - 1 ) {\n\n\t\t\t\tlet d = this.pointEnd.length() / this.pointStart.length();\n\n\t\t\t\tif ( this.pointEnd.dot( this.pointStart ) < 0 ) d *= - 1;\n\n\t\t\t\t_tempVector2.set( d, d, d );\n\n\t\t\t} else {\n\n\t\t\t\t_tempVector.copy( this.pointStart );\n\t\t\t\t_tempVector2.copy( this.pointEnd );\n\n\t\t\t\t_tempVector.applyQuaternion( this._worldQuaternionInv );\n\t\t\t\t_tempVector2.applyQuaternion( this._worldQuaternionInv );\n\n\t\t\t\t_tempVector2.divide( _tempVector );\n\n\t\t\t\tif ( axis.search( 'X' ) === - 1 ) {\n\n\t\t\t\t\t_tempVector2.x = 1;\n\n\t\t\t\t}\n\n\t\t\t\tif ( axis.search( 'Y' ) === - 1 ) {\n\n\t\t\t\t\t_tempVector2.y = 1;\n\n\t\t\t\t}\n\n\t\t\t\tif ( axis.search( 'Z' ) === - 1 ) {\n\n\t\t\t\t\t_tempVector2.z = 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Apply scale\n\n\t\t\tobject.scale.copy( this._scaleStart ).multiply( _tempVector2 );\n\n\t\t\tif ( this.scaleSnap ) {\n\n\t\t\t\tif ( axis.search( 'X' ) !== - 1 ) {\n\n\t\t\t\t\tobject.scale.x = Math.round( object.scale.x / this.scaleSnap ) * this.scaleSnap || this.scaleSnap;\n\n\t\t\t\t}\n\n\t\t\t\tif ( axis.search( 'Y' ) !== - 1 ) {\n\n\t\t\t\t\tobject.scale.y = Math.round( object.scale.y / this.scaleSnap ) * this.scaleSnap || this.scaleSnap;\n\n\t\t\t\t}\n\n\t\t\t\tif ( axis.search( 'Z' ) !== - 1 ) {\n\n\t\t\t\t\tobject.scale.z = Math.round( object.scale.z / this.scaleSnap ) * this.scaleSnap || this.scaleSnap;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( mode === 'rotate' ) {\n\n\t\t\tthis._offset.copy( this.pointEnd ).sub( this.pointStart );\n\n\t\t\tconst ROTATION_SPEED = 20 / this.worldPosition.distanceTo( _tempVector.setFromMatrixPosition( this.camera.matrixWorld ) );\n\n\t\t\tlet _inPlaneRotation = false;\n\n\t\t\tif ( axis === 'XYZE' ) {\n\n\t\t\t\tthis.rotationAxis.copy( this._offset ).cross( this.eye ).normalize();\n\t\t\t\tthis.rotationAngle = this._offset.dot( _tempVector.copy( this.rotationAxis ).cross( this.eye ) ) * ROTATION_SPEED;\n\n\t\t\t} else if ( axis === 'X' || axis === 'Y' || axis === 'Z' ) {\n\n\t\t\t\tthis.rotationAxis.copy( _unit[ axis ] );\n\n\t\t\t\t_tempVector.copy( _unit[ axis ] );\n\n\t\t\t\tif ( space === 'local' ) {\n\n\t\t\t\t\t_tempVector.applyQuaternion( this.worldQuaternion );\n\n\t\t\t\t}\n\n\t\t\t\t_tempVector.cross( this.eye );\n\n\t\t\t\t// When _tempVector is 0 after cross with this.eye the vectors are parallel and should use in-plane rotation logic.\n\t\t\t\tif ( _tempVector.length() === 0 ) {\n\n\t\t\t\t\t_inPlaneRotation = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.rotationAngle = this._offset.dot( _tempVector.normalize() ) * ROTATION_SPEED;\n\n\t\t\t\t}\n\n\n\t\t\t}\n\n\t\t\tif ( axis === 'E' || _inPlaneRotation ) {\n\n\t\t\t\tthis.rotationAxis.copy( this.eye );\n\t\t\t\tthis.rotationAngle = this.pointEnd.angleTo( this.pointStart );\n\n\t\t\t\tthis._startNorm.copy( this.pointStart ).normalize();\n\t\t\t\tthis._endNorm.copy( this.pointEnd ).normalize();\n\n\t\t\t\tthis.rotationAngle *= ( this._endNorm.cross( this._startNorm ).dot( this.eye ) < 0 ? 1 : - 1 );\n\n\t\t\t}\n\n\t\t\t// Apply rotation snap\n\n\t\t\tif ( this.rotationSnap ) this.rotationAngle = Math.round( this.rotationAngle / this.rotationSnap ) * this.rotationSnap;\n\n\t\t\t// Apply rotate\n\t\t\tif ( space === 'local' && axis !== 'E' && axis !== 'XYZE' ) {\n\n\t\t\t\tobject.quaternion.copy( this._quaternionStart );\n\t\t\t\tobject.quaternion.multiply( _tempQuaternion.setFromAxisAngle( this.rotationAxis, this.rotationAngle ) ).normalize();\n\n\t\t\t} else {\n\n\t\t\t\tthis.rotationAxis.applyQuaternion( this._parentQuaternionInv );\n\t\t\t\tobject.quaternion.copy( _tempQuaternion.setFromAxisAngle( this.rotationAxis, this.rotationAngle ) );\n\t\t\t\tobject.quaternion.multiply( this._quaternionStart ).normalize();\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.dispatchEvent( _changeEvent );\n\t\tthis.dispatchEvent( _objectChangeEvent );\n\n\t}\n\n\tpointerUp( pointer ) {\n\n\t\tif ( pointer !== null && pointer.button !== 0 ) return;\n\n\t\tif ( this.dragging && ( this.axis !== null ) ) {\n\n\t\t\t_mouseUpEvent.mode = this.mode;\n\t\t\tthis.dispatchEvent( _mouseUpEvent );\n\n\t\t}\n\n\t\tthis.dragging = false;\n\t\tthis.axis = null;\n\n\t}\n\n\tdispose() {\n\n\t\tthis.disconnect();\n\n\t\tthis._root.dispose();\n\n\t}\n\n\t/**\n\t * Sets the 3D object that should be transformed and ensures the controls UI is visible.\n\t *\n\t * @param {Object3D} object -  The 3D object that should be transformed.\n\t * @return {TransformControls} A reference to this controls.\n\t */\n\tattach( object ) {\n\n\t\tthis.object = object;\n\t\tthis._root.visible = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes the current 3D object from the controls and makes the helper UI invisible.\n\t *\n\t * @return {TransformControls} A reference to this controls.\n\t */\n\tdetach() {\n\n\t\tthis.object = undefined;\n\t\tthis.axis = null;\n\n\t\tthis._root.visible = false;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Resets the object's position, rotation and scale to when the current transform began.\n\t */\n\treset() {\n\n\t\tif ( ! this.enabled ) return;\n\n\t\tif ( this.dragging ) {\n\n\t\t\tthis.object.position.copy( this._positionStart );\n\t\t\tthis.object.quaternion.copy( this._quaternionStart );\n\t\t\tthis.object.scale.copy( this._scaleStart );\n\n\t\t\tthis.dispatchEvent( _changeEvent );\n\t\t\tthis.dispatchEvent( _objectChangeEvent );\n\n\t\t\tthis.pointStart.copy( this.pointEnd );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the raycaster that is used for user interaction. This object is shared between all\n\t * instances of `TransformControls`.\n\t *\n\t * @returns {Raycaster} The internal raycaster.\n\t */\n\tgetRaycaster() {\n\n\t\treturn _raycaster;\n\n\t}\n\n\t/**\n\t * Returns the transformation mode.\n\t *\n\t * @returns {'translate'|'rotate'|'scale'} The transformation mode.\n\t */\n\tgetMode() {\n\n\t\treturn this.mode;\n\n\t}\n\n\t/**\n\t * Sets the given transformation mode.\n\t *\n\t * @param {'translate'|'rotate'|'scale'} mode - The transformation mode to set.\n\t */\n\tsetMode( mode ) {\n\n\t\tthis.mode = mode;\n\n\t}\n\n\t/**\n\t * Sets the translation snap.\n\t *\n\t * @param {?number} translationSnap - The translation snap to set.\n\t */\n\tsetTranslationSnap( translationSnap ) {\n\n\t\tthis.translationSnap = translationSnap;\n\n\t}\n\n\t/**\n\t * Sets the rotation snap.\n\t *\n\t * @param {?number} rotationSnap - The rotation snap to set.\n\t */\n\tsetRotationSnap( rotationSnap ) {\n\n\t\tthis.rotationSnap = rotationSnap;\n\n\t}\n\n\t/**\n\t * Sets the scale snap.\n\t *\n\t * @param {?number} scaleSnap - The scale snap to set.\n\t */\n\tsetScaleSnap( scaleSnap ) {\n\n\t\tthis.scaleSnap = scaleSnap;\n\n\t}\n\n\t/**\n\t * Sets the size of the helper UI.\n\t *\n\t * @param {number} size - The size to set.\n\t */\n\tsetSize( size ) {\n\n\t\tthis.size = size;\n\n\t}\n\n\t/**\n\t * Sets the coordinate space in which transformations are applied.\n\t *\n\t * @param {'world'|'local'} space - The space to set.\n\t */\n\tsetSpace( space ) {\n\n\t\tthis.space = space;\n\n\t}\n\n\t/**\n\t * Sets the colors of the control's gizmo.\n\t *\n\t * @param {number|Color|string} xAxis - The x-axis color.\n\t * @param {number|Color|string} yAxis - The y-axis color.\n\t * @param {number|Color|string} zAxis - The z-axis color.\n\t * @param {number|Color|string} active - The color for active elements.\n\t */\n\tsetColors( xAxis, yAxis, zAxis, active ) {\n\n\t\tconst materialLib = this._gizmo.materialLib;\n\n\t\tmaterialLib.xAxis.color.set( xAxis );\n\t\tmaterialLib.yAxis.color.set( yAxis );\n\t\tmaterialLib.zAxis.color.set( zAxis );\n\t\tmaterialLib.active.color.set( active );\n\t\tmaterialLib.xAxisTransparent.color.set( xAxis );\n\t\tmaterialLib.yAxisTransparent.color.set( yAxis );\n\t\tmaterialLib.zAxisTransparent.color.set( zAxis );\n\t\tmaterialLib.activeTransparent.color.set( active );\n\n\t\t// update color caches\n\n\t\tif ( materialLib.xAxis._color ) materialLib.xAxis._color.set( xAxis );\n\t\tif ( materialLib.yAxis._color ) materialLib.yAxis._color.set( yAxis );\n\t\tif ( materialLib.zAxis._color ) materialLib.zAxis._color.set( zAxis );\n\t\tif ( materialLib.active._color ) materialLib.active._color.set( active );\n\t\tif ( materialLib.xAxisTransparent._color ) materialLib.xAxisTransparent._color.set( xAxis );\n\t\tif ( materialLib.yAxisTransparent._color ) materialLib.yAxisTransparent._color.set( yAxis );\n\t\tif ( materialLib.zAxisTransparent._color ) materialLib.zAxisTransparent._color.set( zAxis );\n\t\tif ( materialLib.activeTransparent._color ) materialLib.activeTransparent._color.set( active );\n\n\t}\n\n}\n\n// mouse / touch event handlers\n\nfunction getPointer( event ) {\n\n\tif ( this.domElement.ownerDocument.pointerLockElement ) {\n\n\t\treturn {\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\tbutton: event.button\n\t\t};\n\n\t} else {\n\n\t\tconst rect = this.domElement.getBoundingClientRect();\n\n\t\treturn {\n\t\t\tx: ( event.clientX - rect.left ) / rect.width * 2 - 1,\n\t\t\ty: - ( event.clientY - rect.top ) / rect.height * 2 + 1,\n\t\t\tbutton: event.button\n\t\t};\n\n\t}\n\n}\n\nfunction onPointerHover( event ) {\n\n\tif ( ! this.enabled ) return;\n\n\tswitch ( event.pointerType ) {\n\n\t\tcase 'mouse':\n\t\tcase 'pen':\n\t\t\tthis.pointerHover( this._getPointer( event ) );\n\t\t\tbreak;\n\n\t}\n\n}\n\nfunction onPointerDown( event ) {\n\n\tif ( ! this.enabled ) return;\n\n\tif ( ! document.pointerLockElement ) {\n\n\t\tthis.domElement.setPointerCapture( event.pointerId );\n\n\t}\n\n\tthis.domElement.addEventListener( 'pointermove', this._onPointerMove );\n\n\tthis.pointerHover( this._getPointer( event ) );\n\tthis.pointerDown( this._getPointer( event ) );\n\n}\n\nfunction onPointerMove( event ) {\n\n\tif ( ! this.enabled ) return;\n\n\tthis.pointerMove( this._getPointer( event ) );\n\n}\n\nfunction onPointerUp( event ) {\n\n\tif ( ! this.enabled ) return;\n\n\tthis.domElement.releasePointerCapture( event.pointerId );\n\n\tthis.domElement.removeEventListener( 'pointermove', this._onPointerMove );\n\n\tthis.pointerUp( this._getPointer( event ) );\n\n}\n\nfunction intersectObjectWithRay( object, raycaster, includeInvisible ) {\n\n\tconst allIntersections = raycaster.intersectObject( object, true );\n\n\tfor ( let i = 0; i < allIntersections.length; i ++ ) {\n\n\t\tif ( allIntersections[ i ].object.visible || includeInvisible ) {\n\n\t\t\treturn allIntersections[ i ];\n\n\t\t}\n\n\t}\n\n\treturn false;\n\n}\n\n//\n\n// Reusable utility variables\n\nconst _tempEuler = new Euler();\nconst _alignVector = new Vector3( 0, 1, 0 );\nconst _zeroVector = new Vector3( 0, 0, 0 );\nconst _lookAtMatrix = new Matrix4();\nconst _tempQuaternion2 = new Quaternion();\nconst _identityQuaternion = new Quaternion();\nconst _dirVector = new Vector3();\nconst _tempMatrix = new Matrix4();\n\nconst _unitX = new Vector3( 1, 0, 0 );\nconst _unitY = new Vector3( 0, 1, 0 );\nconst _unitZ = new Vector3( 0, 0, 1 );\n\nconst _v1 = new Vector3();\nconst _v2 = new Vector3();\nconst _v3 = new Vector3();\n\nclass TransformControlsRoot extends Object3D {\n\n\tconstructor( controls ) {\n\n\t\tsuper();\n\n\t\tthis.isTransformControlsRoot = true;\n\n\t\tthis.controls = controls;\n\t\tthis.visible = false;\n\n\t}\n\n\t// updateMatrixWorld updates key transformation variables\n\tupdateMatrixWorld( force ) {\n\n\t\tconst controls = this.controls;\n\n\t\tif ( controls.object !== undefined ) {\n\n\t\t\tcontrols.object.updateMatrixWorld();\n\n\t\t\tif ( controls.object.parent === null ) {\n\n\t\t\t\tconsole.error( 'TransformControls: The attached 3D object must be a part of the scene graph.' );\n\n\t\t\t} else {\n\n\t\t\t\tcontrols.object.parent.matrixWorld.decompose( controls._parentPosition, controls._parentQuaternion, controls._parentScale );\n\n\t\t\t}\n\n\t\t\tcontrols.object.matrixWorld.decompose( controls.worldPosition, controls.worldQuaternion, controls._worldScale );\n\n\t\t\tcontrols._parentQuaternionInv.copy( controls._parentQuaternion ).invert();\n\t\t\tcontrols._worldQuaternionInv.copy( controls.worldQuaternion ).invert();\n\n\t\t}\n\n\t\tcontrols.camera.updateMatrixWorld();\n\t\tcontrols.camera.matrixWorld.decompose( controls.cameraPosition, controls.cameraQuaternion, controls._cameraScale );\n\n\t\tif ( controls.camera.isOrthographicCamera ) {\n\n\t\t\tcontrols.camera.getWorldDirection( controls.eye ).negate();\n\n\t\t} else {\n\n\t\t\tcontrols.eye.copy( controls.cameraPosition ).sub( controls.worldPosition ).normalize();\n\n\t\t}\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n\tdispose() {\n\n\t\tthis.traverse( function ( child ) {\n\n\t\t\tif ( child.geometry ) child.geometry.dispose();\n\t\t\tif ( child.material ) child.material.dispose();\n\n\t\t} );\n\n\t}\n\n}\n\nclass TransformControlsGizmo extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isTransformControlsGizmo = true;\n\n\t\tthis.type = 'TransformControlsGizmo';\n\n\t\t// shared materials\n\n\t\tconst gizmoMaterial = new MeshBasicMaterial( {\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\tfog: false,\n\t\t\ttoneMapped: false,\n\t\t\ttransparent: true\n\t\t} );\n\n\t\tconst gizmoLineMaterial = new LineBasicMaterial( {\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\tfog: false,\n\t\t\ttoneMapped: false,\n\t\t\ttransparent: true\n\t\t} );\n\n\t\t// Make unique material for each axis/color\n\n\t\tconst matInvisible = gizmoMaterial.clone();\n\t\tmatInvisible.opacity = 0.15;\n\n\t\tconst matHelper = gizmoLineMaterial.clone();\n\t\tmatHelper.opacity = 0.5;\n\n\t\tconst matRed = gizmoMaterial.clone();\n\t\tmatRed.color.setHex( 0xff0000 );\n\n\t\tconst matGreen = gizmoMaterial.clone();\n\t\tmatGreen.color.setHex( 0x00ff00 );\n\n\t\tconst matBlue = gizmoMaterial.clone();\n\t\tmatBlue.color.setHex( 0x0000ff );\n\n\t\tconst matRedTransparent = gizmoMaterial.clone();\n\t\tmatRedTransparent.color.setHex( 0xff0000 );\n\t\tmatRedTransparent.opacity = 0.5;\n\n\t\tconst matGreenTransparent = gizmoMaterial.clone();\n\t\tmatGreenTransparent.color.setHex( 0x00ff00 );\n\t\tmatGreenTransparent.opacity = 0.5;\n\n\t\tconst matBlueTransparent = gizmoMaterial.clone();\n\t\tmatBlueTransparent.color.setHex( 0x0000ff );\n\t\tmatBlueTransparent.opacity = 0.5;\n\n\t\tconst matWhiteTransparent = gizmoMaterial.clone();\n\t\tmatWhiteTransparent.opacity = 0.25;\n\n\t\tconst matYellowTransparent = gizmoMaterial.clone();\n\t\tmatYellowTransparent.color.setHex( 0xffff00 );\n\t\tmatYellowTransparent.opacity = 0.25;\n\n\t\tconst matYellow = gizmoMaterial.clone();\n\t\tmatYellow.color.setHex( 0xffff00 );\n\n\t\tconst matGray = gizmoMaterial.clone();\n\t\tmatGray.color.setHex( 0x787878 );\n\n\t\t// materials in the below property are configurable via setColors()\n\n\t\tthis.materialLib = {\n\t\t\txAxis: matRed,\n\t\t\tyAxis: matGreen,\n\t\t\tzAxis: matBlue,\n\t\t\tactive: matYellow,\n\t\t\txAxisTransparent: matRedTransparent,\n\t\t\tyAxisTransparent: matGreenTransparent,\n\t\t\tzAxisTransparent: matBlueTransparent,\n\t\t\tactiveTransparent: matYellowTransparent\n\t\t};\n\n\t\t// reusable geometry\n\n\t\tconst arrowGeometry = new CylinderGeometry( 0, 0.04, 0.1, 12 );\n\t\tarrowGeometry.translate( 0, 0.05, 0 );\n\n\t\tconst scaleHandleGeometry = new BoxGeometry( 0.08, 0.08, 0.08 );\n\t\tscaleHandleGeometry.translate( 0, 0.04, 0 );\n\n\t\tconst lineGeometry = new BufferGeometry();\n\t\tlineGeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0,\t1, 0, 0 ], 3 ) );\n\n\t\tconst lineGeometry2 = new CylinderGeometry( 0.0075, 0.0075, 0.5, 3 );\n\t\tlineGeometry2.translate( 0, 0.25, 0 );\n\n\t\tfunction CircleGeometry( radius, arc ) {\n\n\t\t\tconst geometry = new TorusGeometry( radius, 0.0075, 3, 64, arc * Math.PI * 2 );\n\t\t\tgeometry.rotateY( Math.PI / 2 );\n\t\t\tgeometry.rotateX( Math.PI / 2 );\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\t// Special geometry for transform helper. If scaled with position vector it spans from [0,0,0] to position\n\n\t\tfunction TranslateHelperGeometry() {\n\n\t\t\tconst geometry = new BufferGeometry();\n\n\t\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( [ 0, 0, 0, 1, 1, 1 ], 3 ) );\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\t// Gizmo definitions - custom hierarchy definitions for setupGizmo() function\n\n\t\tconst gizmoTranslate = {\n\t\t\tX: [\n\t\t\t\t[ new Mesh( arrowGeometry, matRed ), [ 0.5, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n\t\t\t\t[ new Mesh( arrowGeometry, matRed ), [ - 0.5, 0, 0 ], [ 0, 0, Math.PI / 2 ]],\n\t\t\t\t[ new Mesh( lineGeometry2, matRed ), [ 0, 0, 0 ], [ 0, 0, - Math.PI / 2 ]]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Mesh( arrowGeometry, matGreen ), [ 0, 0.5, 0 ]],\n\t\t\t\t[ new Mesh( arrowGeometry, matGreen ), [ 0, - 0.5, 0 ], [ Math.PI, 0, 0 ]],\n\t\t\t\t[ new Mesh( lineGeometry2, matGreen ) ]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Mesh( arrowGeometry, matBlue ), [ 0, 0, 0.5 ], [ Math.PI / 2, 0, 0 ]],\n\t\t\t\t[ new Mesh( arrowGeometry, matBlue ), [ 0, 0, - 0.5 ], [ - Math.PI / 2, 0, 0 ]],\n\t\t\t\t[ new Mesh( lineGeometry2, matBlue ), null, [ Math.PI / 2, 0, 0 ]]\n\t\t\t],\n\t\t\tXYZ: [\n\t\t\t\t[ new Mesh( new OctahedronGeometry( 0.1, 0 ), matWhiteTransparent ), [ 0, 0, 0 ]]\n\t\t\t],\n\t\t\tXY: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matBlueTransparent ), [ 0.15, 0.15, 0 ]]\n\t\t\t],\n\t\t\tYZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matRedTransparent ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]]\n\t\t\t],\n\t\t\tXZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matGreenTransparent ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]]\n\t\t\t]\n\t\t};\n\n\t\tconst pickerTranslate = {\n\t\t\tX: [\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0.3, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ - 0.3, 0, 0 ], [ 0, 0, Math.PI / 2 ]]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0.3, 0 ]],\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, - 0.3, 0 ], [ 0, 0, Math.PI ]]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, 0.3 ], [ Math.PI / 2, 0, 0 ]],\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, - 0.3 ], [ - Math.PI / 2, 0, 0 ]]\n\t\t\t],\n\t\t\tXYZ: [\n\t\t\t\t[ new Mesh( new OctahedronGeometry( 0.2, 0 ), matInvisible ) ]\n\t\t\t],\n\t\t\tXY: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0.15, 0.15, 0 ]]\n\t\t\t],\n\t\t\tYZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]]\n\t\t\t],\n\t\t\tXZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]]\n\t\t\t]\n\t\t};\n\n\t\tconst helperTranslate = {\n\t\t\tSTART: [\n\t\t\t\t[ new Mesh( new OctahedronGeometry( 0.01, 2 ), matHelper ), null, null, null, 'helper' ]\n\t\t\t],\n\t\t\tEND: [\n\t\t\t\t[ new Mesh( new OctahedronGeometry( 0.01, 2 ), matHelper ), null, null, null, 'helper' ]\n\t\t\t],\n\t\t\tDELTA: [\n\t\t\t\t[ new Line( TranslateHelperGeometry(), matHelper ), null, null, null, 'helper' ]\n\t\t\t],\n\t\t\tX: [\n\t\t\t\t[ new Line( lineGeometry, matHelper ), [ - 1e3, 0, 0 ], null, [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Line( lineGeometry, matHelper ), [ 0, - 1e3, 0 ], [ 0, 0, Math.PI / 2 ], [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Line( lineGeometry, matHelper ), [ 0, 0, - 1e3 ], [ 0, - Math.PI / 2, 0 ], [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t]\n\t\t};\n\n\t\tconst gizmoRotate = {\n\t\t\tXYZE: [\n\t\t\t\t[ new Mesh( CircleGeometry( 0.5, 1 ), matGray ), null, [ 0, Math.PI / 2, 0 ]]\n\t\t\t],\n\t\t\tX: [\n\t\t\t\t[ new Mesh( CircleGeometry( 0.5, 0.5 ), matRed ) ]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Mesh( CircleGeometry( 0.5, 0.5 ), matGreen ), null, [ 0, 0, - Math.PI / 2 ]]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Mesh( CircleGeometry( 0.5, 0.5 ), matBlue ), null, [ 0, Math.PI / 2, 0 ]]\n\t\t\t],\n\t\t\tE: [\n\t\t\t\t[ new Mesh( CircleGeometry( 0.75, 1 ), matYellowTransparent ), null, [ 0, Math.PI / 2, 0 ]]\n\t\t\t]\n\t\t};\n\n\t\tconst helperRotate = {\n\t\t\tAXIS: [\n\t\t\t\t[ new Line( lineGeometry, matHelper ), [ - 1e3, 0, 0 ], null, [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t]\n\t\t};\n\n\t\tconst pickerRotate = {\n\t\t\tXYZE: [\n\t\t\t\t[ new Mesh( new SphereGeometry( 0.25, 10, 8 ), matInvisible ) ]\n\t\t\t],\n\t\t\tX: [\n\t\t\t\t[ new Mesh( new TorusGeometry( 0.5, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ 0, - Math.PI / 2, - Math.PI / 2 ]],\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Mesh( new TorusGeometry( 0.5, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ Math.PI / 2, 0, 0 ]],\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Mesh( new TorusGeometry( 0.5, 0.1, 4, 24 ), matInvisible ), [ 0, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n\t\t\t],\n\t\t\tE: [\n\t\t\t\t[ new Mesh( new TorusGeometry( 0.75, 0.1, 2, 24 ), matInvisible ) ]\n\t\t\t]\n\t\t};\n\n\t\tconst gizmoScale = {\n\t\t\tX: [\n\t\t\t\t[ new Mesh( scaleHandleGeometry, matRed ), [ 0.5, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n\t\t\t\t[ new Mesh( lineGeometry2, matRed ), [ 0, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n\t\t\t\t[ new Mesh( scaleHandleGeometry, matRed ), [ - 0.5, 0, 0 ], [ 0, 0, Math.PI / 2 ]],\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Mesh( scaleHandleGeometry, matGreen ), [ 0, 0.5, 0 ]],\n\t\t\t\t[ new Mesh( lineGeometry2, matGreen ) ],\n\t\t\t\t[ new Mesh( scaleHandleGeometry, matGreen ), [ 0, - 0.5, 0 ], [ 0, 0, Math.PI ]],\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Mesh( scaleHandleGeometry, matBlue ), [ 0, 0, 0.5 ], [ Math.PI / 2, 0, 0 ]],\n\t\t\t\t[ new Mesh( lineGeometry2, matBlue ), [ 0, 0, 0 ], [ Math.PI / 2, 0, 0 ]],\n\t\t\t\t[ new Mesh( scaleHandleGeometry, matBlue ), [ 0, 0, - 0.5 ], [ - Math.PI / 2, 0, 0 ]]\n\t\t\t],\n\t\t\tXY: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matBlueTransparent ), [ 0.15, 0.15, 0 ]]\n\t\t\t],\n\t\t\tYZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matRedTransparent ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]]\n\t\t\t],\n\t\t\tXZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.15, 0.15, 0.01 ), matGreenTransparent ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]]\n\t\t\t],\n\t\t\tXYZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.1, 0.1, 0.1 ), matWhiteTransparent ) ],\n\t\t\t]\n\t\t};\n\n\t\tconst pickerScale = {\n\t\t\tX: [\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0.3, 0, 0 ], [ 0, 0, - Math.PI / 2 ]],\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ - 0.3, 0, 0 ], [ 0, 0, Math.PI / 2 ]]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0.3, 0 ]],\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, - 0.3, 0 ], [ 0, 0, Math.PI ]]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, 0.3 ], [ Math.PI / 2, 0, 0 ]],\n\t\t\t\t[ new Mesh( new CylinderGeometry( 0.2, 0, 0.6, 4 ), matInvisible ), [ 0, 0, - 0.3 ], [ - Math.PI / 2, 0, 0 ]]\n\t\t\t],\n\t\t\tXY: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0.15, 0.15, 0 ]],\n\t\t\t],\n\t\t\tYZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0, 0.15, 0.15 ], [ 0, Math.PI / 2, 0 ]],\n\t\t\t],\n\t\t\tXZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.01 ), matInvisible ), [ 0.15, 0, 0.15 ], [ - Math.PI / 2, 0, 0 ]],\n\t\t\t],\n\t\t\tXYZ: [\n\t\t\t\t[ new Mesh( new BoxGeometry( 0.2, 0.2, 0.2 ), matInvisible ), [ 0, 0, 0 ]],\n\t\t\t]\n\t\t};\n\n\t\tconst helperScale = {\n\t\t\tX: [\n\t\t\t\t[ new Line( lineGeometry, matHelper ), [ - 1e3, 0, 0 ], null, [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t],\n\t\t\tY: [\n\t\t\t\t[ new Line( lineGeometry, matHelper ), [ 0, - 1e3, 0 ], [ 0, 0, Math.PI / 2 ], [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t],\n\t\t\tZ: [\n\t\t\t\t[ new Line( lineGeometry, matHelper ), [ 0, 0, - 1e3 ], [ 0, - Math.PI / 2, 0 ], [ 1e6, 1, 1 ], 'helper' ]\n\t\t\t]\n\t\t};\n\n\t\t// Creates an Object3D with gizmos described in custom hierarchy definition.\n\n\t\tfunction setupGizmo( gizmoMap ) {\n\n\t\t\tconst gizmo = new Object3D();\n\n\t\t\tfor ( const name in gizmoMap ) {\n\n\t\t\t\tfor ( let i = gizmoMap[ name ].length; i --; ) {\n\n\t\t\t\t\tconst object = gizmoMap[ name ][ i ][ 0 ].clone();\n\t\t\t\t\tconst position = gizmoMap[ name ][ i ][ 1 ];\n\t\t\t\t\tconst rotation = gizmoMap[ name ][ i ][ 2 ];\n\t\t\t\t\tconst scale = gizmoMap[ name ][ i ][ 3 ];\n\t\t\t\t\tconst tag = gizmoMap[ name ][ i ][ 4 ];\n\n\t\t\t\t\t// name and tag properties are essential for picking and updating logic.\n\t\t\t\t\tobject.name = name;\n\t\t\t\t\tobject.tag = tag;\n\n\t\t\t\t\tif ( position ) {\n\n\t\t\t\t\t\tobject.position.set( position[ 0 ], position[ 1 ], position[ 2 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( rotation ) {\n\n\t\t\t\t\t\tobject.rotation.set( rotation[ 0 ], rotation[ 1 ], rotation[ 2 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( scale ) {\n\n\t\t\t\t\t\tobject.scale.set( scale[ 0 ], scale[ 1 ], scale[ 2 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobject.updateMatrix();\n\n\t\t\t\t\tconst tempGeometry = object.geometry.clone();\n\t\t\t\t\ttempGeometry.applyMatrix4( object.matrix );\n\t\t\t\t\tobject.geometry = tempGeometry;\n\t\t\t\t\tobject.renderOrder = Infinity;\n\n\t\t\t\t\tobject.position.set( 0, 0, 0 );\n\t\t\t\t\tobject.rotation.set( 0, 0, 0 );\n\t\t\t\t\tobject.scale.set( 1, 1, 1 );\n\n\t\t\t\t\tgizmo.add( object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn gizmo;\n\n\t\t}\n\n\t\t// Gizmo creation\n\n\t\tthis.gizmo = {};\n\t\tthis.picker = {};\n\t\tthis.helper = {};\n\n\t\tthis.add( this.gizmo[ 'translate' ] = setupGizmo( gizmoTranslate ) );\n\t\tthis.add( this.gizmo[ 'rotate' ] = setupGizmo( gizmoRotate ) );\n\t\tthis.add( this.gizmo[ 'scale' ] = setupGizmo( gizmoScale ) );\n\t\tthis.add( this.picker[ 'translate' ] = setupGizmo( pickerTranslate ) );\n\t\tthis.add( this.picker[ 'rotate' ] = setupGizmo( pickerRotate ) );\n\t\tthis.add( this.picker[ 'scale' ] = setupGizmo( pickerScale ) );\n\t\tthis.add( this.helper[ 'translate' ] = setupGizmo( helperTranslate ) );\n\t\tthis.add( this.helper[ 'rotate' ] = setupGizmo( helperRotate ) );\n\t\tthis.add( this.helper[ 'scale' ] = setupGizmo( helperScale ) );\n\n\t\t// Pickers should be hidden always\n\n\t\tthis.picker[ 'translate' ].visible = false;\n\t\tthis.picker[ 'rotate' ].visible = false;\n\t\tthis.picker[ 'scale' ].visible = false;\n\n\t}\n\n\t// updateMatrixWorld will update transformations and appearance of individual handles\n\n\tupdateMatrixWorld( force ) {\n\n\t\tconst space = ( this.mode === 'scale' ) ? 'local' : this.space; // scale always oriented to local rotation\n\n\t\tconst quaternion = ( space === 'local' ) ? this.worldQuaternion : _identityQuaternion;\n\n\t\t// Show only gizmos for current transform mode\n\n\t\tthis.gizmo[ 'translate' ].visible = this.mode === 'translate';\n\t\tthis.gizmo[ 'rotate' ].visible = this.mode === 'rotate';\n\t\tthis.gizmo[ 'scale' ].visible = this.mode === 'scale';\n\n\t\tthis.helper[ 'translate' ].visible = this.mode === 'translate';\n\t\tthis.helper[ 'rotate' ].visible = this.mode === 'rotate';\n\t\tthis.helper[ 'scale' ].visible = this.mode === 'scale';\n\n\n\t\tlet handles = [];\n\t\thandles = handles.concat( this.picker[ this.mode ].children );\n\t\thandles = handles.concat( this.gizmo[ this.mode ].children );\n\t\thandles = handles.concat( this.helper[ this.mode ].children );\n\n\t\tfor ( let i = 0; i < handles.length; i ++ ) {\n\n\t\t\tconst handle = handles[ i ];\n\n\t\t\t// hide aligned to camera\n\n\t\t\thandle.visible = true;\n\t\t\thandle.rotation.set( 0, 0, 0 );\n\t\t\thandle.position.copy( this.worldPosition );\n\n\t\t\tlet factor;\n\n\t\t\tif ( this.camera.isOrthographicCamera ) {\n\n\t\t\t\tfactor = ( this.camera.top - this.camera.bottom ) / this.camera.zoom;\n\n\t\t\t} else {\n\n\t\t\t\tfactor = this.worldPosition.distanceTo( this.cameraPosition ) * Math.min( 1.9 * Math.tan( Math.PI * this.camera.fov / 360 ) / this.camera.zoom, 7 );\n\n\t\t\t}\n\n\t\t\thandle.scale.set( 1, 1, 1 ).multiplyScalar( factor * this.size / 4 );\n\n\t\t\t// TODO: simplify helpers and consider decoupling from gizmo\n\n\t\t\tif ( handle.tag === 'helper' ) {\n\n\t\t\t\thandle.visible = false;\n\n\t\t\t\tif ( handle.name === 'AXIS' ) {\n\n\t\t\t\t\thandle.visible = !! this.axis;\n\n\t\t\t\t\tif ( this.axis === 'X' ) {\n\n\t\t\t\t\t\t_tempQuaternion.setFromEuler( _tempEuler.set( 0, 0, 0 ) );\n\t\t\t\t\t\thandle.quaternion.copy( quaternion ).multiply( _tempQuaternion );\n\n\t\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitX ).applyQuaternion( quaternion ).dot( this.eye ) ) > 0.9 ) {\n\n\t\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.axis === 'Y' ) {\n\n\t\t\t\t\t\t_tempQuaternion.setFromEuler( _tempEuler.set( 0, 0, Math.PI / 2 ) );\n\t\t\t\t\t\thandle.quaternion.copy( quaternion ).multiply( _tempQuaternion );\n\n\t\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitY ).applyQuaternion( quaternion ).dot( this.eye ) ) > 0.9 ) {\n\n\t\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.axis === 'Z' ) {\n\n\t\t\t\t\t\t_tempQuaternion.setFromEuler( _tempEuler.set( 0, Math.PI / 2, 0 ) );\n\t\t\t\t\t\thandle.quaternion.copy( quaternion ).multiply( _tempQuaternion );\n\n\t\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitZ ).applyQuaternion( quaternion ).dot( this.eye ) ) > 0.9 ) {\n\n\t\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.axis === 'XYZE' ) {\n\n\t\t\t\t\t\t_tempQuaternion.setFromEuler( _tempEuler.set( 0, Math.PI / 2, 0 ) );\n\t\t\t\t\t\t_alignVector.copy( this.rotationAxis );\n\t\t\t\t\t\thandle.quaternion.setFromRotationMatrix( _lookAtMatrix.lookAt( _zeroVector, _alignVector, _unitY ) );\n\t\t\t\t\t\thandle.quaternion.multiply( _tempQuaternion );\n\t\t\t\t\t\thandle.visible = this.dragging;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.axis === 'E' ) {\n\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\n\t\t\t\t} else if ( handle.name === 'START' ) {\n\n\t\t\t\t\thandle.position.copy( this.worldPositionStart );\n\t\t\t\t\thandle.visible = this.dragging;\n\n\t\t\t\t} else if ( handle.name === 'END' ) {\n\n\t\t\t\t\thandle.position.copy( this.worldPosition );\n\t\t\t\t\thandle.visible = this.dragging;\n\n\t\t\t\t} else if ( handle.name === 'DELTA' ) {\n\n\t\t\t\t\thandle.position.copy( this.worldPositionStart );\n\t\t\t\t\thandle.quaternion.copy( this.worldQuaternionStart );\n\t\t\t\t\t_tempVector.set( 1e-10, 1e-10, 1e-10 ).add( this.worldPositionStart ).sub( this.worldPosition ).multiplyScalar( - 1 );\n\t\t\t\t\t_tempVector.applyQuaternion( this.worldQuaternionStart.clone().invert() );\n\t\t\t\t\thandle.scale.copy( _tempVector );\n\t\t\t\t\thandle.visible = this.dragging;\n\n\t\t\t\t} else {\n\n\t\t\t\t\thandle.quaternion.copy( quaternion );\n\n\t\t\t\t\tif ( this.dragging ) {\n\n\t\t\t\t\t\thandle.position.copy( this.worldPositionStart );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\thandle.position.copy( this.worldPosition );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( this.axis ) {\n\n\t\t\t\t\t\thandle.visible = this.axis.search( handle.name ) !== - 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// If updating helper, skip rest of the loop\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// Align handles to current local or world rotation\n\n\t\t\thandle.quaternion.copy( quaternion );\n\n\t\t\tif ( this.mode === 'translate' || this.mode === 'scale' ) {\n\n\t\t\t\t// Hide translate and scale axis facing the camera\n\n\t\t\t\tconst AXIS_HIDE_THRESHOLD = 0.99;\n\t\t\t\tconst PLANE_HIDE_THRESHOLD = 0.2;\n\n\t\t\t\tif ( handle.name === 'X' ) {\n\n\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitX ).applyQuaternion( quaternion ).dot( this.eye ) ) > AXIS_HIDE_THRESHOLD ) {\n\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'Y' ) {\n\n\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitY ).applyQuaternion( quaternion ).dot( this.eye ) ) > AXIS_HIDE_THRESHOLD ) {\n\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'Z' ) {\n\n\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitZ ).applyQuaternion( quaternion ).dot( this.eye ) ) > AXIS_HIDE_THRESHOLD ) {\n\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'XY' ) {\n\n\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitZ ).applyQuaternion( quaternion ).dot( this.eye ) ) < PLANE_HIDE_THRESHOLD ) {\n\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'YZ' ) {\n\n\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitX ).applyQuaternion( quaternion ).dot( this.eye ) ) < PLANE_HIDE_THRESHOLD ) {\n\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'XZ' ) {\n\n\t\t\t\t\tif ( Math.abs( _alignVector.copy( _unitY ).applyQuaternion( quaternion ).dot( this.eye ) ) < PLANE_HIDE_THRESHOLD ) {\n\n\t\t\t\t\t\thandle.scale.set( 1e-10, 1e-10, 1e-10 );\n\t\t\t\t\t\thandle.visible = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( this.mode === 'rotate' ) {\n\n\t\t\t\t// Align handles to current local or world rotation\n\n\t\t\t\t_tempQuaternion2.copy( quaternion );\n\t\t\t\t_alignVector.copy( this.eye ).applyQuaternion( _tempQuaternion.copy( quaternion ).invert() );\n\n\t\t\t\tif ( handle.name.search( 'E' ) !== - 1 ) {\n\n\t\t\t\t\thandle.quaternion.setFromRotationMatrix( _lookAtMatrix.lookAt( this.eye, _zeroVector, _unitY ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'X' ) {\n\n\t\t\t\t\t_tempQuaternion.setFromAxisAngle( _unitX, Math.atan2( - _alignVector.y, _alignVector.z ) );\n\t\t\t\t\t_tempQuaternion.multiplyQuaternions( _tempQuaternion2, _tempQuaternion );\n\t\t\t\t\thandle.quaternion.copy( _tempQuaternion );\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'Y' ) {\n\n\t\t\t\t\t_tempQuaternion.setFromAxisAngle( _unitY, Math.atan2( _alignVector.x, _alignVector.z ) );\n\t\t\t\t\t_tempQuaternion.multiplyQuaternions( _tempQuaternion2, _tempQuaternion );\n\t\t\t\t\thandle.quaternion.copy( _tempQuaternion );\n\n\t\t\t\t}\n\n\t\t\t\tif ( handle.name === 'Z' ) {\n\n\t\t\t\t\t_tempQuaternion.setFromAxisAngle( _unitZ, Math.atan2( _alignVector.y, _alignVector.x ) );\n\t\t\t\t\t_tempQuaternion.multiplyQuaternions( _tempQuaternion2, _tempQuaternion );\n\t\t\t\t\thandle.quaternion.copy( _tempQuaternion );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Hide disabled axes\n\t\t\thandle.visible = handle.visible && ( handle.name.indexOf( 'X' ) === - 1 || this.showX );\n\t\t\thandle.visible = handle.visible && ( handle.name.indexOf( 'Y' ) === - 1 || this.showY );\n\t\t\thandle.visible = handle.visible && ( handle.name.indexOf( 'Z' ) === - 1 || this.showZ );\n\t\t\thandle.visible = handle.visible && ( handle.name.indexOf( 'E' ) === - 1 || ( this.showX && this.showY && this.showZ ) );\n\n\t\t\t// highlight selected axis\n\n\t\t\thandle.material._color = handle.material._color || handle.material.color.clone();\n\t\t\thandle.material._opacity = handle.material._opacity || handle.material.opacity;\n\n\t\t\thandle.material.color.copy( handle.material._color );\n\t\t\thandle.material.opacity = handle.material._opacity;\n\n\t\t\tif ( this.enabled && this.axis ) {\n\n\t\t\t\tif ( handle.name === this.axis ) {\n\n\t\t\t\t\thandle.material.color.copy( this.materialLib.active.color );\n\t\t\t\t\thandle.material.opacity = 1.0;\n\n\t\t\t\t} else if ( this.axis.split( '' ).some( function ( a ) {\n\n\t\t\t\t\treturn handle.name === a;\n\n\t\t\t\t} ) ) {\n\n\t\t\t\t\thandle.material.color.copy( this.materialLib.active.color );\n\t\t\t\t\thandle.material.opacity = 1.0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n}\n\n//\n\nclass TransformControlsPlane extends Mesh {\n\n\tconstructor() {\n\n\t\tsuper(\n\t\t\tnew PlaneGeometry( 100000, 100000, 2, 2 ),\n\t\t\tnew MeshBasicMaterial( { visible: false, wireframe: true, side: DoubleSide, transparent: true, opacity: 0.1, toneMapped: false } )\n\t\t);\n\n\t\tthis.isTransformControlsPlane = true;\n\n\t\tthis.type = 'TransformControlsPlane';\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tlet space = this.space;\n\n\t\tthis.position.copy( this.worldPosition );\n\n\t\tif ( this.mode === 'scale' ) space = 'local'; // scale always oriented to local rotation\n\n\t\t_v1.copy( _unitX ).applyQuaternion( space === 'local' ? this.worldQuaternion : _identityQuaternion );\n\t\t_v2.copy( _unitY ).applyQuaternion( space === 'local' ? this.worldQuaternion : _identityQuaternion );\n\t\t_v3.copy( _unitZ ).applyQuaternion( space === 'local' ? this.worldQuaternion : _identityQuaternion );\n\n\t\t// Align the plane for current transform mode, axis and space.\n\n\t\t_alignVector.copy( _v2 );\n\n\t\tswitch ( this.mode ) {\n\n\t\t\tcase 'translate':\n\t\t\tcase 'scale':\n\t\t\t\tswitch ( this.axis ) {\n\n\t\t\t\t\tcase 'X':\n\t\t\t\t\t\t_alignVector.copy( this.eye ).cross( _v1 );\n\t\t\t\t\t\t_dirVector.copy( _v1 ).cross( _alignVector );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Y':\n\t\t\t\t\t\t_alignVector.copy( this.eye ).cross( _v2 );\n\t\t\t\t\t\t_dirVector.copy( _v2 ).cross( _alignVector );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Z':\n\t\t\t\t\t\t_alignVector.copy( this.eye ).cross( _v3 );\n\t\t\t\t\t\t_dirVector.copy( _v3 ).cross( _alignVector );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'XY':\n\t\t\t\t\t\t_dirVector.copy( _v3 );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'YZ':\n\t\t\t\t\t\t_dirVector.copy( _v1 );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'XZ':\n\t\t\t\t\t\t_alignVector.copy( _v3 );\n\t\t\t\t\t\t_dirVector.copy( _v2 );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'XYZ':\n\t\t\t\t\tcase 'E':\n\t\t\t\t\t\t_dirVector.set( 0, 0, 0 );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\tcase 'rotate':\n\t\t\tdefault:\n\t\t\t\t// special case for rotate\n\t\t\t\t_dirVector.set( 0, 0, 0 );\n\n\t\t}\n\n\t\tif ( _dirVector.length() === 0 ) {\n\n\t\t\t// If in rotate mode, make the plane parallel to camera\n\t\t\tthis.quaternion.copy( this.cameraQuaternion );\n\n\t\t} else {\n\n\t\t\t_tempMatrix.lookAt( _tempVector.set( 0, 0, 0 ), _dirVector, _alignVector );\n\n\t\t\tthis.quaternion.setFromRotationMatrix( _tempMatrix );\n\n\t\t}\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t}\n\n}\n\nexport { TransformControls, TransformControlsGizmo, TransformControlsPlane };\n", "import { Vector3, Matrix4 } from 'three';\n\nconst inverseProjectionMatrix = new Matrix4();\n\n/**\n * Represents the frustum of a CSM instance.\n *\n * @three_import import { CSMFrustum } from 'three/addons/csm/CSMFrustum.js';\n */\nclass CSMFrustum {\n\n\t/**\n\t * Constructs a new CSM frustum.\n\t *\n\t * @param {CSMFrustum~Data} [data] - The CSM data.\n\t */\n\tconstructor( data ) {\n\n\t\tdata = data || {};\n\n\t\t/**\n\t\t * The zNear value. This value depends on whether the CSM\n\t\t * is used with WebGL or WebGPU. Both API use different\n\t\t * conventions for their projection matrices.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.zNear = data.webGL === true ? - 1 : 0;\n\n\t\t/**\n\t\t * An object representing the vertices of the near and\n\t\t * far plane in view space.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.vertices = {\n\t\t\tnear: [\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3()\n\t\t\t],\n\t\t\tfar: [\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3(),\n\t\t\t\tnew Vector3()\n\t\t\t]\n\t\t};\n\n\t\tif ( data.projectionMatrix !== undefined ) {\n\n\t\t\tthis.setFromProjectionMatrix( data.projectionMatrix, data.maxFar || 10000 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Setups this CSM frustum from the given projection matrix and max far value.\n\t *\n\t * @param {Matrix4} projectionMatrix - The projection matrix, usually of the scene's camera.\n\t * @param {number} maxFar - The maximum far value.\n\t * @returns {Object} An object representing the vertices of the near and far plane in view space.\n\t */\n\tsetFromProjectionMatrix( projectionMatrix, maxFar ) {\n\n\t\tconst zNear = this.zNear;\n\t\tconst isOrthographic = projectionMatrix.elements[ 2 * 4 + 3 ] === 0;\n\n\t\tinverseProjectionMatrix.copy( projectionMatrix ).invert();\n\n\t\t// 3 --- 0  vertices.near/far order\n\t\t// |     |\n\t\t// 2 --- 1\n\t\t// clip space spans from [-1, 1]\n\n\t\tthis.vertices.near[ 0 ].set( 1, 1, zNear );\n\t\tthis.vertices.near[ 1 ].set( 1, - 1, zNear );\n\t\tthis.vertices.near[ 2 ].set( - 1, - 1, zNear );\n\t\tthis.vertices.near[ 3 ].set( - 1, 1, zNear );\n\t\tthis.vertices.near.forEach( function ( v ) {\n\n\t\t\tv.applyMatrix4( inverseProjectionMatrix );\n\n\t\t} );\n\n\t\tthis.vertices.far[ 0 ].set( 1, 1, 1 );\n\t\tthis.vertices.far[ 1 ].set( 1, - 1, 1 );\n\t\tthis.vertices.far[ 2 ].set( - 1, - 1, 1 );\n\t\tthis.vertices.far[ 3 ].set( - 1, 1, 1 );\n\t\tthis.vertices.far.forEach( function ( v ) {\n\n\t\t\tv.applyMatrix4( inverseProjectionMatrix );\n\n\t\t\tconst absZ = Math.abs( v.z );\n\t\t\tif ( isOrthographic ) {\n\n\t\t\t\tv.z *= Math.min( maxFar / absZ, 1.0 );\n\n\t\t\t} else {\n\n\t\t\t\tv.multiplyScalar( Math.min( maxFar / absZ, 1.0 ) );\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn this.vertices;\n\n\t}\n\n\t/**\n\t * Splits the CSM frustum by the given array. The new CSM frustum are pushed into the given\n\t * target array.\n\t *\n\t * @param {Array<number>} breaks - An array of numbers in the range `[0,1]` the defines how the\n\t * CSM frustum should be split up.\n\t * @param {Array<CSMFrustum>} target - The target array that holds the new CSM frustums.\n\t */\n\tsplit( breaks, target ) {\n\n\t\twhile ( breaks.length > target.length ) {\n\n\t\t\ttarget.push( new CSMFrustum() );\n\n\t\t}\n\n\t\ttarget.length = breaks.length;\n\n\t\tfor ( let i = 0; i < breaks.length; i ++ ) {\n\n\t\t\tconst cascade = target[ i ];\n\n\t\t\tif ( i === 0 ) {\n\n\t\t\t\tfor ( let j = 0; j < 4; j ++ ) {\n\n\t\t\t\t\tcascade.vertices.near[ j ].copy( this.vertices.near[ j ] );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( let j = 0; j < 4; j ++ ) {\n\n\t\t\t\t\tcascade.vertices.near[ j ].lerpVectors( this.vertices.near[ j ], this.vertices.far[ j ], breaks[ i - 1 ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( i === breaks.length - 1 ) {\n\n\t\t\t\tfor ( let j = 0; j < 4; j ++ ) {\n\n\t\t\t\t\tcascade.vertices.far[ j ].copy( this.vertices.far[ j ] );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( let j = 0; j < 4; j ++ ) {\n\n\t\t\t\t\tcascade.vertices.far[ j ].lerpVectors( this.vertices.near[ j ], this.vertices.far[ j ], breaks[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Transforms the given target CSM frustum into the different coordinate system defined by the\n\t * given camera matrix.\n\t *\n\t * @param {Matrix4} cameraMatrix - The matrix that defines the new coordinate system.\n\t * @param {CSMFrustum} target - The CSM to convert.\n\t */\n\ttoSpace( cameraMatrix, target ) {\n\n\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\ttarget.vertices.near[ i ]\n\t\t\t\t.copy( this.vertices.near[ i ] )\n\t\t\t\t.applyMatrix4( cameraMatrix );\n\n\t\t\ttarget.vertices.far[ i ]\n\t\t\t\t.copy( this.vertices.far[ i ] )\n\t\t\t\t.applyMatrix4( cameraMatrix );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Constructor data of `CSMFrustum`.\n *\n * @typedef {Object} CSMFrustum~Data\n * @property {boolean} [webGL] - Whether this CSM frustum is used with WebGL or WebGPU.\n * @property {Matrix4} [projectionMatrix] - A projection matrix usually of the scene's camera.\n * @property {number} [maxFar] - The maximum far value.\n **/\n\nexport { CSMFrustum };\n", "import { ShaderChunk } from 'three';\n\n/**\n * @module CSMShader\n * @three_import import { CSMShader } from 'three/addons/csm/CSMShader.js';\n */\n\n/**\n * The object that holds the GLSL enhancements to enable CSM. This\n * code is injected into the built-in material shaders by {@link CSM}.\n *\n * @type {Object}\n */\nconst CSMShader = {\n\tlights_fragment_begin: /* glsl */`\nvec3 geometryPosition = - vViewPosition;\nvec3 geometryNormal = normal;\nvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n\nvec3 geometryClearcoatNormal = vec3( 0.0 );\n\n#ifdef USE_CLEARCOAT\n\n\tgeometryClearcoatNormal = clearcoatNormal;\n\n#endif\n\n#ifdef USE_IRIDESCENCE\n\tfloat dotNVi = saturate( dot( normal, geometryViewDir ) );\n\tif ( material.iridescenceThickness == 0.0 ) {\n\t\tmaterial.iridescence = 0.0;\n\t} else {\n\t\tmaterial.iridescence = saturate( material.iridescence );\n\t}\n\tif ( material.iridescence > 0.0 ) {\n\t\tmaterial.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n\t\t// Iridescence F0 approximation\n\t\tmaterial.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n\t}\n#endif\n\nIncidentLight directLight;\n\n#if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n\n\tPointLight pointLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n\tPointLightShadow pointLightShadow;\n\t#endif\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\n\t\tpointLight = pointLights[ i ];\n\n\t\tgetPointLightInfo( pointLight, geometryPosition, directLight );\n\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n\t\tpointLightShadow = pointLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n\n\t\t#endif\n\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n\n\tSpotLight spotLight;\n \tvec4 spotColor;\n\tvec3 spotLightCoord;\n\tbool inSpotLightMap;\n\n\t#if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n\tSpotLightShadow spotLightShadow;\n\t#endif\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\n\t\tspotLight = spotLights[ i ];\n\n\t\tgetSpotLightInfo( spotLight, geometryPosition, directLight );\n\n  \t\t// spot lights are ordered [shadows with maps, shadows without maps, maps without shadows, none]\n\t\t#if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n\t\t#elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\t#define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n\t\t#else\n\t\t#define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n\t\t#endif\n\t\t#if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n\t\t\tspotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n\t\t\tinSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n\t\t\tspotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n\t\t\tdirectLight.color = inSpotLightMap ? directLight.color * spotColor.rgb : directLight.color;\n\t\t#endif\n\t\t#undef SPOT_LIGHT_MAP_INDEX\n\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n\t\tspotLightShadow = spotLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n\n\t\t#endif\n\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct ) && defined( USE_CSM ) && defined( CSM_CASCADES )\n\n\tDirectionalLight directionalLight;\n\tfloat linearDepth = (vViewPosition.z) / (shadowFar - cameraNear);\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\n\t#if defined( USE_SHADOWMAP ) && defined( CSM_FADE )\n\t\tvec2 cascade;\n\t\tfloat cascadeCenter;\n\t\tfloat closestEdge;\n\t\tfloat margin;\n\t\tfloat csmx;\n\t\tfloat csmy;\n\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\n\t\t\tdirectionalLight = directionalLights[ i ];\n\t\t\tgetDirectionalLightInfo( directionalLight, directLight );\n\n\t\t\t#if ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\t\t\t// NOTE: Depth gets larger away from the camera.\n\t\t\t\t// cascade.x is closer, cascade.y is further\n\t\t\t\tcascade = CSM_cascades[ i ];\n\t\t\t\tcascadeCenter = ( cascade.x + cascade.y ) / 2.0;\n\t\t\t\tclosestEdge = linearDepth < cascadeCenter ? cascade.x : cascade.y;\n\t\t\t\tmargin = 0.25 * pow( closestEdge, 2.0 );\n\t\t\t\tcsmx = cascade.x - margin / 2.0;\n\t\t\t\tcsmy = cascade.y + margin / 2.0;\n\t\t\t\tif( linearDepth >= csmx && ( linearDepth < csmy || UNROLLED_LOOP_INDEX == CSM_CASCADES - 1 ) ) {\n\n\t\t\t\t\tfloat dist = min( linearDepth - csmx, csmy - linearDepth );\n\t\t\t\t\tfloat ratio = clamp( dist / margin, 0.0, 1.0 );\n\n\t\t\t\t\tvec3 prevColor = directLight.color;\n\t\t\t\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\t\t\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\n\t\t\t\t\tbool shouldFadeLastCascade = UNROLLED_LOOP_INDEX == CSM_CASCADES - 1 && linearDepth > cascadeCenter;\n\t\t\t\t\tdirectLight.color = mix( prevColor, directLight.color, shouldFadeLastCascade ? ratio : 1.0 );\n\n\t\t\t\t\tReflectedLight prevLight = reflectedLight;\n\t\t\t\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\n\t\t\t\t\tbool shouldBlend = UNROLLED_LOOP_INDEX != CSM_CASCADES - 1 || UNROLLED_LOOP_INDEX == CSM_CASCADES - 1 && linearDepth < cascadeCenter;\n\t\t\t\t\tfloat blendRatio = shouldBlend ? ratio : 1.0;\n\n\t\t\t\t\treflectedLight.directDiffuse = mix( prevLight.directDiffuse, reflectedLight.directDiffuse, blendRatio );\n\t\t\t\t\treflectedLight.directSpecular = mix( prevLight.directSpecular, reflectedLight.directSpecular, blendRatio );\n\t\t\t\t\treflectedLight.indirectDiffuse = mix( prevLight.indirectDiffuse, reflectedLight.indirectDiffuse, blendRatio );\n\t\t\t\t\treflectedLight.indirectSpecular = mix( prevLight.indirectSpecular, reflectedLight.indirectSpecular, blendRatio );\n\n\t\t\t\t}\n\t\t\t#endif\n\n\t\t}\n\t\t#pragma unroll_loop_end\n\t#elif defined (USE_SHADOWMAP)\n\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\n\t\t\tdirectionalLight = directionalLights[ i ];\n\t\t\tgetDirectionalLightInfo( directionalLight, directLight );\n\n\t\t\t#if ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\n\t\t\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\t\t\tif(linearDepth >= CSM_cascades[UNROLLED_LOOP_INDEX].x && linearDepth < CSM_cascades[UNROLLED_LOOP_INDEX].y) directLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\n\t\t\t\tif(linearDepth >= CSM_cascades[UNROLLED_LOOP_INDEX].x && (linearDepth < CSM_cascades[UNROLLED_LOOP_INDEX].y || UNROLLED_LOOP_INDEX == CSM_CASCADES - 1)) RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\n\t\t\t#endif\n\n\t\t}\n\t\t#pragma unroll_loop_end\n\n\t#elif ( NUM_DIR_LIGHT_SHADOWS > 0 )\n\t\t// note: no loop here - all CSM lights are in fact one light only\n\t\tgetDirectionalLightInfo( directionalLights[0], directLight );\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\n\t#endif\n\n\t#if ( NUM_DIR_LIGHTS > NUM_DIR_LIGHT_SHADOWS)\n\t\t// compute the lights not casting shadows (if any)\n\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = NUM_DIR_LIGHT_SHADOWS; i < NUM_DIR_LIGHTS; i ++ ) {\n\n\t\t\tdirectionalLight = directionalLights[ i ];\n\n\t\t\tgetDirectionalLightInfo( directionalLight, directLight );\n\n\t\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\n\t\t}\n\t\t#pragma unroll_loop_end\n\n\t#endif\n\n#endif\n\n\n#if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct ) && !defined( USE_CSM ) && !defined( CSM_CASCADES )\n\n\tDirectionalLight directionalLight;\n\t#if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n\tDirectionalLightShadow directionalLightShadow;\n\t#endif\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\n\t\tdirectionalLight = directionalLights[ i ];\n\n\t\tgetDirectionalLightInfo( directionalLight, directLight );\n\n\t\t#if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n\t\tdirectionalLightShadow = directionalLightShadows[ i ];\n\t\tdirectLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n\t\t#endif\n\n\t\tRE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n\n\tRectAreaLight rectAreaLight;\n\n\t#pragma unroll_loop_start\n\tfor ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n\n\t\trectAreaLight = rectAreaLights[ i ];\n\t\tRE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n\n\t}\n\t#pragma unroll_loop_end\n\n#endif\n\n#if defined( RE_IndirectDiffuse )\n\n\tvec3 iblIrradiance = vec3( 0.0 );\n\n\tvec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\n\t#if defined( USE_LIGHT_PROBES )\n\n\t\tirradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n\n\t#endif\n\n\t#if ( NUM_HEMI_LIGHTS > 0 )\n\n\t\t#pragma unroll_loop_start\n\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\n\t\t\tirradiance += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\n\n\t\t}\n\t\t#pragma unroll_loop_end\n\n\t#endif\n\n#endif\n\n#if defined( RE_IndirectSpecular )\n\n\tvec3 radiance = vec3( 0.0 );\n\tvec3 clearcoatRadiance = vec3( 0.0 );\n\n#endif\n`,\n\tlights_pars_begin: /* glsl */`\n#if defined( USE_CSM ) && defined( CSM_CASCADES )\nuniform vec2 CSM_cascades[CSM_CASCADES];\nuniform float cameraNear;\nuniform float shadowFar;\n#endif\n\t` + ShaderChunk.lights_pars_begin\n};\n\nexport { CSMShader };\n", "import {\n\tVector2,\n\tVector3,\n\tDirectionalLight,\n\tMathUtils,\n\tShaderChunk,\n\tMatrix4,\n\tBox3\n} from 'three';\nimport { CSMFrustum } from './CSMFrustum.js';\nimport { CSMShader } from './CSMShader.js';\n\nconst _cameraToLightMatrix = new Matrix4();\nconst _lightSpaceFrustum = new CSMFrustum( { webGL: true } );\nconst _center = new Vector3();\nconst _origin = new Vector3();\nconst _bbox = new Box3();\nconst _uniformArray = [];\nconst _logArray = [];\nconst _lightOrientationMatrix = new Matrix4();\nconst _lightOrientationMatrixInverse = new Matrix4();\nconst _up = new Vector3( 0, 1, 0 );\n\n/**\n * An implementation of Cascade Shadow Maps (CSM).\n *\n * This module can only be used with {@link WebGLRenderer}. When using {@link WebGPURenderer},\n * use {@link CSMShadowNode} instead.\n *\n * @three_import import { CSM } from 'three/addons/csm/CSM.js';\n */\nexport class CSM {\n\n\t/**\n\t * Constructs a new CSM instance.\n\t *\n\t * @param {CSM~Data} data - The CSM data.\n\t */\n\tconstructor( data ) {\n\n\t\t/**\n\t\t * The scene's camera.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = data.camera;\n\n\t\t/**\n\t\t * The parent object, usually the scene.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.parent = data.parent;\n\n\t\t/**\n\t\t * The number of cascades.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 3\n\t\t */\n\t\tthis.cascades = data.cascades || 3;\n\n\t\t/**\n\t\t * The maximum far value.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 100000\n\t\t */\n\t\tthis.maxFar = data.maxFar || 100000;\n\n\t\t/**\n\t\t * The frustum split mode.\n\t\t *\n\t\t * @type {('practical'|'uniform'|'logarithmic'|'custom')}\n\t\t * @default 'practical'\n\t\t */\n\t\tthis.mode = data.mode || 'practical';\n\n\t\t/**\n\t\t * The shadow map size.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2048\n\t\t */\n\t\tthis.shadowMapSize = data.shadowMapSize || 2048;\n\n\t\t/**\n\t\t * The shadow bias.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.000001\n\t\t */\n\t\tthis.shadowBias = data.shadowBias || 0.000001;\n\n\t\t/**\n\t\t * The light direction.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.lightDirection = data.lightDirection || new Vector3( 1, - 1, 1 ).normalize();\n\n\t\t/**\n\t\t * The light intensity.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 3\n\t\t */\n\t\tthis.lightIntensity = data.lightIntensity || 3;\n\n\t\t/**\n\t\t * The light near value.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.lightNear = data.lightNear || 1;\n\n\t\t/**\n\t\t * The light far value.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2000\n\t\t */\n\t\tthis.lightFar = data.lightFar || 2000;\n\n\t\t/**\n\t\t * The light margin.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 200\n\t\t */\n\t\tthis.lightMargin = data.lightMargin || 200;\n\n\t\t/**\n\t\t * Custom split callback when using `mode='custom'`.\n\t\t *\n\t\t * @type {Function}\n\t\t */\n\t\tthis.customSplitsCallback = data.customSplitsCallback;\n\n\t\t/**\n\t\t * Whether to fade between cascades or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.fade = false;\n\n\t\t/**\n\t\t * The main frustum.\n\t\t *\n\t\t * @type {CSMFrustum}\n\t\t */\n\t\tthis.mainFrustum = new CSMFrustum( { webGL: true } );\n\n\t\t/**\n\t\t * An array of frustums representing the cascades.\n\t\t *\n\t\t * @type {Array<CSMFrustum>}\n\t\t */\n\t\tthis.frustums = [];\n\n\t\t/**\n\t\t * An array of numbers in the range `[0,1]` the defines how the\n\t\t * mainCSM frustum should be split up.\n\t\t *\n\t\t * @type {Array<number>}\n\t\t */\n\t\tthis.breaks = [];\n\n\t\t/**\n\t\t * An array of directional lights which cast the shadows for\n\t\t * the different cascades. There is one directional light for each\n\t\t * cascade.\n\t\t *\n\t\t * @type {Array<DirectionalLight>}\n\t\t */\n\t\tthis.lights = [];\n\n\t\t/**\n\t\t * A Map holding enhanced material shaders.\n\t\t *\n\t\t * @type {Map<Material,Object>}\n\t\t */\n\t\tthis.shaders = new Map();\n\n\t\tthis._createLights();\n\t\tthis.updateFrustums();\n\t\tthis._injectInclude();\n\n\t}\n\n\t/**\n\t * Creates the directional lights of this CSM instance.\n\t *\n\t * @private\n\t */\n\t_createLights() {\n\n\t\tfor ( let i = 0; i < this.cascades; i ++ ) {\n\n\t\t\tconst light = new DirectionalLight( 0xffffff, this.lightIntensity );\n\t\t\tlight.castShadow = true;\n\t\t\tlight.shadow.mapSize.width = this.shadowMapSize;\n\t\t\tlight.shadow.mapSize.height = this.shadowMapSize;\n\n\t\t\tlight.shadow.camera.near = this.lightNear;\n\t\t\tlight.shadow.camera.far = this.lightFar;\n\t\t\tlight.shadow.bias = this.shadowBias;\n\n\t\t\tthis.parent.add( light );\n\t\t\tthis.parent.add( light.target );\n\t\t\tthis.lights.push( light );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Inits the cascades according to the scene's camera and breaks configuration.\n\t *\n\t * @private\n\t */\n\t_initCascades() {\n\n\t\tconst camera = this.camera;\n\t\tcamera.updateProjectionMatrix();\n\t\tthis.mainFrustum.setFromProjectionMatrix( camera.projectionMatrix, this.maxFar );\n\t\tthis.mainFrustum.split( this.breaks, this.frustums );\n\n\t}\n\n\t/**\n\t * Updates the shadow bounds of this CSM instance.\n\t *\n\t * @private\n\t */\n\t_updateShadowBounds() {\n\n\t\tconst frustums = this.frustums;\n\t\tfor ( let i = 0; i < frustums.length; i ++ ) {\n\n\t\t\tconst light = this.lights[ i ];\n\t\t\tconst shadowCam = light.shadow.camera;\n\t\t\tconst frustum = this.frustums[ i ];\n\n\t\t\t// Get the two points that represent that furthest points on the frustum assuming\n\t\t\t// that's either the diagonal across the far plane or the diagonal across the whole\n\t\t\t// frustum itself.\n\t\t\tconst nearVerts = frustum.vertices.near;\n\t\t\tconst farVerts = frustum.vertices.far;\n\t\t\tconst point1 = farVerts[ 0 ];\n\t\t\tlet point2;\n\t\t\tif ( point1.distanceTo( farVerts[ 2 ] ) > point1.distanceTo( nearVerts[ 2 ] ) ) {\n\n\t\t\t\tpoint2 = farVerts[ 2 ];\n\n\t\t\t} else {\n\n\t\t\t\tpoint2 = nearVerts[ 2 ];\n\n\t\t\t}\n\n\t\t\tlet squaredBBWidth = point1.distanceTo( point2 );\n\t\t\tif ( this.fade ) {\n\n\t\t\t\t// expand the shadow extents by the fade margin if fade is enabled.\n\t\t\t\tconst camera = this.camera;\n\t\t\t\tconst far = Math.max( camera.far, this.maxFar );\n\t\t\t\tconst linearDepth = frustum.vertices.far[ 0 ].z / ( far - camera.near );\n\t\t\t\tconst margin = 0.25 * Math.pow( linearDepth, 2.0 ) * ( far - camera.near );\n\n\t\t\t\tsquaredBBWidth += margin;\n\n\t\t\t}\n\n\t\t\tshadowCam.left = - squaredBBWidth / 2;\n\t\t\tshadowCam.right = squaredBBWidth / 2;\n\t\t\tshadowCam.top = squaredBBWidth / 2;\n\t\t\tshadowCam.bottom = - squaredBBWidth / 2;\n\t\t\tshadowCam.updateProjectionMatrix();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the breaks of this CSM instance based on the scene's camera, number of cascades\n\t * and the selected split mode.\n\t *\n\t * @private\n\t */\n\t_getBreaks() {\n\n\t\tconst camera = this.camera;\n\t\tconst far = Math.min( camera.far, this.maxFar );\n\t\tthis.breaks.length = 0;\n\n\t\tswitch ( this.mode ) {\n\n\t\t\tcase 'uniform':\n\t\t\t\tuniformSplit( this.cascades, camera.near, far, this.breaks );\n\t\t\t\tbreak;\n\t\t\tcase 'logarithmic':\n\t\t\t\tlogarithmicSplit( this.cascades, camera.near, far, this.breaks );\n\t\t\t\tbreak;\n\t\t\tcase 'practical':\n\t\t\t\tpracticalSplit( this.cascades, camera.near, far, 0.5, this.breaks );\n\t\t\t\tbreak;\n\t\t\tcase 'custom':\n\t\t\t\tif ( this.customSplitsCallback === undefined ) console.error( 'CSM: Custom split scheme callback not defined.' );\n\t\t\t\tthis.customSplitsCallback( this.cascades, camera.near, far, this.breaks );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tfunction uniformSplit( amount, near, far, target ) {\n\n\t\t\tfor ( let i = 1; i < amount; i ++ ) {\n\n\t\t\t\ttarget.push( ( near + ( far - near ) * i / amount ) / far );\n\n\t\t\t}\n\n\t\t\ttarget.push( 1 );\n\n\t\t}\n\n\t\tfunction logarithmicSplit( amount, near, far, target ) {\n\n\t\t\tfor ( let i = 1; i < amount; i ++ ) {\n\n\t\t\t\ttarget.push( ( near * ( far / near ) ** ( i / amount ) ) / far );\n\n\t\t\t}\n\n\t\t\ttarget.push( 1 );\n\n\t\t}\n\n\t\tfunction practicalSplit( amount, near, far, lambda, target ) {\n\n\t\t\t_uniformArray.length = 0;\n\t\t\t_logArray.length = 0;\n\t\t\tlogarithmicSplit( amount, near, far, _logArray );\n\t\t\tuniformSplit( amount, near, far, _uniformArray );\n\n\t\t\tfor ( let i = 1; i < amount; i ++ ) {\n\n\t\t\t\ttarget.push( MathUtils.lerp( _uniformArray[ i - 1 ], _logArray[ i - 1 ], lambda ) );\n\n\t\t\t}\n\n\t\t\ttarget.push( 1 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the CSM. This method must be called in your animation loop before\n\t * calling `renderer.render()`.\n\t */\n\tupdate() {\n\n\t\tconst camera = this.camera;\n\t\tconst frustums = this.frustums;\n\n\t\t// for each frustum we need to find its min-max box aligned with the light orientation\n\t\t// the position in _lightOrientationMatrix does not matter, as we transform there and back\n\t\t_lightOrientationMatrix.lookAt( _origin, this.lightDirection, _up );\n\t\t_lightOrientationMatrixInverse.copy( _lightOrientationMatrix ).invert();\n\n\t\tfor ( let i = 0; i < frustums.length; i ++ ) {\n\n\t\t\tconst light = this.lights[ i ];\n\t\t\tconst shadowCam = light.shadow.camera;\n\t\t\tconst texelWidth = ( shadowCam.right - shadowCam.left ) / this.shadowMapSize;\n\t\t\tconst texelHeight = ( shadowCam.top - shadowCam.bottom ) / this.shadowMapSize;\n\t\t\t_cameraToLightMatrix.multiplyMatrices( _lightOrientationMatrixInverse, camera.matrixWorld );\n\t\t\tfrustums[ i ].toSpace( _cameraToLightMatrix, _lightSpaceFrustum );\n\n\t\t\tconst nearVerts = _lightSpaceFrustum.vertices.near;\n\t\t\tconst farVerts = _lightSpaceFrustum.vertices.far;\n\t\t\t_bbox.makeEmpty();\n\t\t\tfor ( let j = 0; j < 4; j ++ ) {\n\n\t\t\t\t_bbox.expandByPoint( nearVerts[ j ] );\n\t\t\t\t_bbox.expandByPoint( farVerts[ j ] );\n\n\t\t\t}\n\n\t\t\t_bbox.getCenter( _center );\n\t\t\t_center.z = _bbox.max.z + this.lightMargin;\n\t\t\t_center.x = Math.floor( _center.x / texelWidth ) * texelWidth;\n\t\t\t_center.y = Math.floor( _center.y / texelHeight ) * texelHeight;\n\t\t\t_center.applyMatrix4( _lightOrientationMatrix );\n\n\t\t\tlight.position.copy( _center );\n\t\t\tlight.target.position.copy( _center );\n\n\t\t\tlight.target.position.x += this.lightDirection.x;\n\t\t\tlight.target.position.y += this.lightDirection.y;\n\t\t\tlight.target.position.z += this.lightDirection.z;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Injects the CSM shader enhancements into the built-in materials.\n\t *\n\t * @private\n\t */\n\t_injectInclude() {\n\n\t\tShaderChunk.lights_fragment_begin = CSMShader.lights_fragment_begin;\n\t\tShaderChunk.lights_pars_begin = CSMShader.lights_pars_begin;\n\n\t}\n\n\t/**\n\t * Applications must call this method for all materials that should be affected by CSM.\n\t *\n\t * @param {Material} material - The material to setup for CSM support.\n\t */\n\tsetupMaterial( material ) {\n\n\t\tmaterial.defines = material.defines || {};\n\t\tmaterial.defines.USE_CSM = 1;\n\t\tmaterial.defines.CSM_CASCADES = this.cascades;\n\n\t\tif ( this.fade ) {\n\n\t\t\tmaterial.defines.CSM_FADE = '';\n\n\t\t}\n\n\t\tconst breaksVec2 = [];\n\t\tconst scope = this;\n\t\tconst shaders = this.shaders;\n\n\t\tmaterial.onBeforeCompile = function ( shader ) {\n\n\t\t\tconst far = Math.min( scope.camera.far, scope.maxFar );\n\t\t\tscope._getExtendedBreaks( breaksVec2 );\n\n\t\t\tshader.uniforms.CSM_cascades = { value: breaksVec2 };\n\t\t\tshader.uniforms.cameraNear = { value: scope.camera.near };\n\t\t\tshader.uniforms.shadowFar = { value: far };\n\n\t\t\tshaders.set( material, shader );\n\n\t\t};\n\n\t\tshaders.set( material, null );\n\n\t}\n\n\t/**\n\t * Updates the CSM uniforms.\n\t *\n\t * @private\n\t */\n\t_updateUniforms() {\n\n\t\tconst far = Math.min( this.camera.far, this.maxFar );\n\t\tconst shaders = this.shaders;\n\n\t\tshaders.forEach( function ( shader, material ) {\n\n\t\t\tif ( shader !== null ) {\n\n\t\t\t\tconst uniforms = shader.uniforms;\n\t\t\t\tthis._getExtendedBreaks( uniforms.CSM_cascades.value );\n\t\t\t\tuniforms.cameraNear.value = this.camera.near;\n\t\t\t\tuniforms.shadowFar.value = far;\n\n\t\t\t}\n\n\t\t\tif ( ! this.fade && 'CSM_FADE' in material.defines ) {\n\n\t\t\t\tdelete material.defines.CSM_FADE;\n\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t} else if ( this.fade && ! ( 'CSM_FADE' in material.defines ) ) {\n\n\t\t\t\tmaterial.defines.CSM_FADE = '';\n\t\t\t\tmaterial.needsUpdate = true;\n\n\t\t\t}\n\n\t\t}, this );\n\n\t}\n\n\t/**\n\t * Computes the extended breaks for the CSM uniforms.\n\t *\n\t * @private\n\t * @param {Array<Vector2>} target - The target array that holds the extended breaks.\n\t */\n\t_getExtendedBreaks( target ) {\n\n\t\twhile ( target.length < this.breaks.length ) {\n\n\t\t\ttarget.push( new Vector2() );\n\n\t\t}\n\n\t\ttarget.length = this.breaks.length;\n\n\t\tfor ( let i = 0; i < this.cascades; i ++ ) {\n\n\t\t\tconst amount = this.breaks[ i ];\n\t\t\tconst prev = this.breaks[ i - 1 ] || 0;\n\t\t\ttarget[ i ].x = prev;\n\t\t\ttarget[ i ].y = amount;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Applications must call this method every time they change camera or CSM settings.\n\t */\n\tupdateFrustums() {\n\n\t\tthis._getBreaks();\n\t\tthis._initCascades();\n\t\tthis._updateShadowBounds();\n\t\tthis._updateUniforms();\n\n\t}\n\n\t/**\n\t * Applications must call this method when they remove the CSM usage from their scene.\n\t */\n\tremove() {\n\n\t\tfor ( let i = 0; i < this.lights.length; i ++ ) {\n\n\t\t\tthis.parent.remove( this.lights[ i ].target );\n\t\t\tthis.parent.remove( this.lights[ i ] );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tconst shaders = this.shaders;\n\t\tshaders.forEach( function ( shader, material ) {\n\n\t\t\tdelete material.onBeforeCompile;\n\t\t\tdelete material.defines.USE_CSM;\n\t\t\tdelete material.defines.CSM_CASCADES;\n\t\t\tdelete material.defines.CSM_FADE;\n\n\t\t\tif ( shader !== null ) {\n\n\t\t\t\tdelete shader.uniforms.CSM_cascades;\n\t\t\t\tdelete shader.uniforms.cameraNear;\n\t\t\t\tdelete shader.uniforms.shadowFar;\n\n\t\t\t}\n\n\t\t\tmaterial.needsUpdate = true;\n\n\t\t} );\n\t\tshaders.clear();\n\n\t}\n\n}\n\n/**\n * Constructor data of `CSM`.\n *\n * @typedef {Object} CSM~Data\n * @property {Camera} camera - The scene's camera.\n * @property {Object3D} parent - The parent object, usually the scene.\n * @property {number} [cascades=3] - The number of cascades.\n * @property {number} [maxFar=100000] - The maximum far value.\n * @property {('practical'|'uniform'|'logarithmic'|'custom')} [mode='practical'] - The frustum split mode.\n * @property {Function} [customSplitsCallback] - Custom split callback when using `mode='custom'`.\n * @property {number} [shadowMapSize=2048] - The shadow map size.\n * @property {number} [shadowBias=0.000001] - The shadow bias.\n * @property {Vector3} [lightDirection] - The light direction.\n * @property {number} [lightIntensity=3] - The light intensity.\n * @property {number} [lightNear=1] - The light near value.\n * @property {number} [lightNear=2000] - The light far value.\n * @property {number} [lightMargin=200] - The light margin.\n **/\n", "import {\n\tGroup,\n\tMesh,\n\tLineSegments,\n\tBufferGeometry,\n\tLineBasicMaterial,\n\tBox3Helper,\n\tBox3,\n\tPlaneGeometry,\n\tMeshBasicMaterial,\n\tBufferAttribute,\n\tDoubleSide\n} from 'three';\n\n/**\n * A helper for visualizing the cascades of a CSM instance.\n *\n * @augments Group\n * @three_import import { CSMHelper } from 'three/addons/csm/CSMHelper.js';\n */\nclass CSMHelper extends Group {\n\n\t/**\n\t * Constructs a new CSM helper.\n\t *\n\t * @param {CSM|CSMShadowNode} csm - The CSM instance to visualize.\n\t */\n\tconstructor( csm ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The CSM instance to visualize.\n\t\t *\n\t\t * @type {CSM|CSMShadowNode}\n\t\t */\n\t\tthis.csm = csm;\n\n\t\t/**\n\t\t * Whether to display the CSM frustum or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.displayFrustum = true;\n\n\t\t/**\n\t\t * Whether to display the cascade planes or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.displayPlanes = true;\n\n\t\t/**\n\t\t * Whether to display the shadow bounds or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.displayShadowBounds = true;\n\n\t\tconst indices = new Uint16Array( [ 0, 1, 1, 2, 2, 3, 3, 0, 4, 5, 5, 6, 6, 7, 7, 4, 0, 4, 1, 5, 2, 6, 3, 7 ] );\n\t\tconst positions = new Float32Array( 24 );\n\t\tconst frustumGeometry = new BufferGeometry();\n\t\tfrustumGeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tfrustumGeometry.setAttribute( 'position', new BufferAttribute( positions, 3, false ) );\n\t\tconst frustumLines = new LineSegments( frustumGeometry, new LineBasicMaterial() );\n\t\tthis.add( frustumLines );\n\n\t\tthis.frustumLines = frustumLines;\n\t\tthis.cascadeLines = [];\n\t\tthis.cascadePlanes = [];\n\t\tthis.shadowLines = [];\n\n\t}\n\n\t/**\n\t * This method must be called if one of the `display*` properties is changed at runtime.\n\t */\n\tupdateVisibility() {\n\n\t\tconst displayFrustum = this.displayFrustum;\n\t\tconst displayPlanes = this.displayPlanes;\n\t\tconst displayShadowBounds = this.displayShadowBounds;\n\n\t\tconst frustumLines = this.frustumLines;\n\t\tconst cascadeLines = this.cascadeLines;\n\t\tconst cascadePlanes = this.cascadePlanes;\n\t\tconst shadowLines = this.shadowLines;\n\t\tfor ( let i = 0, l = cascadeLines.length; i < l; i ++ ) {\n\n\t\t\tconst cascadeLine = cascadeLines[ i ];\n\t\t\tconst cascadePlane = cascadePlanes[ i ];\n\t\t\tconst shadowLineGroup = shadowLines[ i ];\n\n\t\t\tcascadeLine.visible = displayFrustum;\n\t\t\tcascadePlane.visible = displayFrustum && displayPlanes;\n\t\t\tshadowLineGroup.visible = displayShadowBounds;\n\n\t\t}\n\n\t\tfrustumLines.visible = displayFrustum;\n\n\t}\n\n\t/**\n\t * Updates the helper. This method should be called in the app's animation loop.\n\t */\n\tupdate() {\n\n\t\tconst csm = this.csm;\n\t\tconst camera = csm.camera;\n\t\tconst cascades = csm.cascades;\n\t\tconst mainFrustum = csm.mainFrustum;\n\t\tconst frustums = csm.frustums;\n\t\tconst lights = csm.lights;\n\n\t\tconst frustumLines = this.frustumLines;\n\t\tconst frustumLinePositions = frustumLines.geometry.getAttribute( 'position' );\n\t\tconst cascadeLines = this.cascadeLines;\n\t\tconst cascadePlanes = this.cascadePlanes;\n\t\tconst shadowLines = this.shadowLines;\n\n\t\tif ( camera === null ) return;\n\n\t\tthis.position.copy( camera.position );\n\t\tthis.quaternion.copy( camera.quaternion );\n\t\tthis.scale.copy( camera.scale );\n\t\tthis.updateMatrixWorld( true );\n\n\t\twhile ( cascadeLines.length > cascades ) {\n\n\t\t\tthis.remove( cascadeLines.pop() );\n\t\t\tthis.remove( cascadePlanes.pop() );\n\t\t\tthis.remove( shadowLines.pop() );\n\n\t\t}\n\n\t\twhile ( cascadeLines.length < cascades ) {\n\n\t\t\tconst cascadeLine = new Box3Helper( new Box3(), 0xffffff );\n\t\t\tconst planeMat = new MeshBasicMaterial( { transparent: true, opacity: 0.1, depthWrite: false, side: DoubleSide } );\n\t\t\tconst cascadePlane = new Mesh( new PlaneGeometry(), planeMat );\n\t\t\tconst shadowLineGroup = new Group();\n\t\t\tconst shadowLine = new Box3Helper( new Box3(), 0xffff00 );\n\t\t\tshadowLineGroup.add( shadowLine );\n\n\t\t\tthis.add( cascadeLine );\n\t\t\tthis.add( cascadePlane );\n\t\t\tthis.add( shadowLineGroup );\n\n\t\t\tcascadeLines.push( cascadeLine );\n\t\t\tcascadePlanes.push( cascadePlane );\n\t\t\tshadowLines.push( shadowLineGroup );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cascades; i ++ ) {\n\n\t\t\tconst frustum = frustums[ i ];\n\t\t\tconst light = lights[ i ];\n\t\t\tconst shadowCam = light.shadow.camera;\n\t\t\tconst farVerts = frustum.vertices.far;\n\n\t\t\tconst cascadeLine = cascadeLines[ i ];\n\t\t\tconst cascadePlane = cascadePlanes[ i ];\n\t\t\tconst shadowLineGroup = shadowLines[ i ];\n\t\t\tconst shadowLine = shadowLineGroup.children[ 0 ];\n\n\t\t\tcascadeLine.box.min.copy( farVerts[ 2 ] );\n\t\t\tcascadeLine.box.max.copy( farVerts[ 0 ] );\n\t\t\tcascadeLine.box.max.z += 1e-4;\n\n\t\t\tcascadePlane.position.addVectors( farVerts[ 0 ], farVerts[ 2 ] );\n\t\t\tcascadePlane.position.multiplyScalar( 0.5 );\n\t\t\tcascadePlane.scale.subVectors( farVerts[ 0 ], farVerts[ 2 ] );\n\t\t\tcascadePlane.scale.z = 1e-4;\n\n\t\t\tthis.remove( shadowLineGroup );\n\t\t\tshadowLineGroup.position.copy( shadowCam.position );\n\t\t\tshadowLineGroup.quaternion.copy( shadowCam.quaternion );\n\t\t\tshadowLineGroup.scale.copy( shadowCam.scale );\n\t\t\tshadowLineGroup.updateMatrixWorld( true );\n\t\t\tthis.attach( shadowLineGroup );\n\n\t\t\tshadowLine.box.min.set( shadowCam.bottom, shadowCam.left, - shadowCam.far );\n\t\t\tshadowLine.box.max.set( shadowCam.top, shadowCam.right, - shadowCam.near );\n\n\t\t}\n\n\t\tconst nearVerts = mainFrustum.vertices.near;\n\t\tconst farVerts = mainFrustum.vertices.far;\n\t\tfrustumLinePositions.setXYZ( 0, farVerts[ 0 ].x, farVerts[ 0 ].y, farVerts[ 0 ].z );\n\t\tfrustumLinePositions.setXYZ( 1, farVerts[ 3 ].x, farVerts[ 3 ].y, farVerts[ 3 ].z );\n\t\tfrustumLinePositions.setXYZ( 2, farVerts[ 2 ].x, farVerts[ 2 ].y, farVerts[ 2 ].z );\n\t\tfrustumLinePositions.setXYZ( 3, farVerts[ 1 ].x, farVerts[ 1 ].y, farVerts[ 1 ].z );\n\n\t\tfrustumLinePositions.setXYZ( 4, nearVerts[ 0 ].x, nearVerts[ 0 ].y, nearVerts[ 0 ].z );\n\t\tfrustumLinePositions.setXYZ( 5, nearVerts[ 3 ].x, nearVerts[ 3 ].y, nearVerts[ 3 ].z );\n\t\tfrustumLinePositions.setXYZ( 6, nearVerts[ 2 ].x, nearVerts[ 2 ].y, nearVerts[ 2 ].z );\n\t\tfrustumLinePositions.setXYZ( 7, nearVerts[ 1 ].x, nearVerts[ 1 ].y, nearVerts[ 1 ].z );\n\t\tfrustumLinePositions.needsUpdate = true;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tconst frustumLines = this.frustumLines;\n\t\tconst cascadeLines = this.cascadeLines;\n\t\tconst cascadePlanes = this.cascadePlanes;\n\t\tconst shadowLines = this.shadowLines;\n\n\t\tfrustumLines.geometry.dispose();\n\t\tfrustumLines.material.dispose();\n\n\t\tconst cascades = this.csm.cascades;\n\n\t\tfor ( let i = 0; i < cascades; i ++ ) {\n\n\t\t\tconst cascadeLine = cascadeLines[ i ];\n\t\t\tconst cascadePlane = cascadePlanes[ i ];\n\t\t\tconst shadowLineGroup = shadowLines[ i ];\n\t\t\tconst shadowLine = shadowLineGroup.children[ 0 ];\n\n\t\t\tcascadeLine.dispose(); // Box3Helper\n\n\t\t\tcascadePlane.geometry.dispose();\n\t\t\tcascadePlane.material.dispose();\n\n\t\t\tshadowLine.dispose(); // Box3Helper\n\n\t\t}\n\n\t}\n\n}\n\nexport { CSMHelper };\n", "import {\n\tCurve,\n\tVector3\n} from 'three';\n\n/**\n * A bunch of parametric curves\n *\n * Formulas collected from various sources\n * http://mathworld.wolfram.com/HeartCurve.html\n * http://en.wikipedia.org/wiki/Viviani%27s_curve\n * http://www.mi.sanu.ac.rs/vismath/taylorapril2011/Taylor.pdf\n * https://prideout.net/blog/old/blog/index.html@p=44.html\n */\n\n/**\n * A Granny Knot curve.\n *\n * @augments Curve\n * @three_import import { GrannyKnot } from 'three/addons/curves/CurveExtras.js';\n */\nclass GrannyKnot extends Curve {\n\n\t/**\n\t * This method returns a vector in 3D space for the given interpolation factor.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tt = 2 * Math.PI * t;\n\n\t\tconst x = - 0.22 * Math.cos( t ) - 1.28 * Math.sin( t ) - 0.44 * Math.cos( 3 * t ) - 0.78 * Math.sin( 3 * t );\n\t\tconst y = - 0.1 * Math.cos( 2 * t ) - 0.27 * Math.sin( 2 * t ) + 0.38 * Math.cos( 4 * t ) + 0.46 * Math.sin( 4 * t );\n\t\tconst z = 0.7 * Math.cos( 3 * t ) - 0.4 * Math.sin( 3 * t );\n\n\t\treturn point.set( x, y, z ).multiplyScalar( 20 );\n\n\t}\n\n}\n\n/**\n * A heart curve.\n *\n * @augments Curve\n * @three_import import { HeartCurve } from 'three/addons/curves/CurveExtras.js';\n */\nclass HeartCurve extends Curve {\n\n\t/**\n\t * Constructs a new heart curve.\n\t *\n\t * @param {number} [scale=5] - The curve's scale.\n\t */\n\tconstructor( scale = 5 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The curve's scale.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 5\n\t\t */\n\t\tthis.scale = scale;\n\n\t}\n\n\t/**\n\t * This method returns a vector in 3D space for the given interpolation factor.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tt *= 2 * Math.PI;\n\n\t\tconst x = 16 * Math.pow( Math.sin( t ), 3 );\n\t\tconst y = 13 * Math.cos( t ) - 5 * Math.cos( 2 * t ) - 2 * Math.cos( 3 * t ) - Math.cos( 4 * t );\n\t\tconst z = 0;\n\n\t\treturn point.set( x, y, z ).multiplyScalar( this.scale );\n\n\t}\n\n}\n\n/**\n * A Viviani curve.\n *\n * @augments Curve\n * @three_import import { VivianiCurve } from 'three/addons/curves/CurveExtras.js';\n */\nclass VivianiCurve extends Curve {\n\n\t/**\n\t * Constructs a new Viviani curve.\n\t *\n\t * @param {number} [scale=70] - The curve's scale.\n\t */\n\tconstructor( scale = 70 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The curve's scale.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 70\n\t\t */\n\t\tthis.scale = scale;\n\n\t}\n\n\t/**\n\t * This method returns a vector in 3D space for the given interpolation factor.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tt = t * 4 * Math.PI; // normalized to 0..1\n\t\tconst a = this.scale / 2;\n\n\t\tconst x = a * ( 1 + Math.cos( t ) );\n\t\tconst y = a * Math.sin( t );\n\t\tconst z = 2 * a * Math.sin( t / 2 );\n\n\t\treturn point.set( x, y, z );\n\n\t}\n\n}\n\n/**\n * A knot curve.\n *\n * @augments Curve\n * @three_import import { KnotCurve } from 'three/addons/curves/CurveExtras.js';\n */\nclass KnotCurve extends Curve {\n\n\t/**\n\t * This method returns a vector in 3D space for the given interpolation factor.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tt *= 2 * Math.PI;\n\n\t\tconst R = 10;\n\t\tconst s = 50;\n\n\t\tconst x = s * Math.sin( t );\n\t\tconst y = Math.cos( t ) * ( R + s * Math.cos( t ) );\n\t\tconst z = Math.sin( t ) * ( R + s * Math.cos( t ) );\n\n\t\treturn point.set( x, y, z );\n\n\t}\n\n}\n\n/**\n * A helix curve.\n *\n * @augments Curve\n * @three_import import { HelixCurve } from 'three/addons/curves/CurveExtras.js';\n */\nclass HelixCurve extends Curve {\n\n\t/**\n\t * This method returns a vector in 3D space for the given interpolation factor.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst a = 30; // radius\n\t\tconst b = 150; // height\n\n\t\tconst t2 = 2 * Math.PI * t * b / 30;\n\n\t\tconst x = Math.cos( t2 ) * a;\n\t\tconst y = Math.sin( t2 ) * a;\n\t\tconst z = b * t;\n\n\t\treturn point.set( x, y, z );\n\n\t}\n\n}\n\n/**\n * A Trefoil Knot.\n *\n * @augments Curve\n * @three_import import { TrefoilKnot } from 'three/addons/curves/CurveExtras.js';\n */\nclass TrefoilKnot extends Curve {\n\n\t/**\n\t * Constructs a new Trefoil Knot.\n\t *\n\t * @param {number} [scale=10] - The curve's scale.\n\t */\n\tconstructor( scale = 10 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The curve's scale.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.scale = scale;\n\n\t}\n\n\t/**\n\t * This method returns a vector in 3D space for the given interpolation factor.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tt *= Math.PI * 2;\n\n\t\tconst x = ( 2 + Math.cos( 3 * t ) ) * Math.cos( 2 * t );\n\t\tconst y = ( 2 + Math.cos( 3 * t ) ) * Math.sin( 2 * t );\n\t\tconst z = Math.sin( 3 * t );\n\n\t\treturn point.set( x, y, z ).multiplyScalar( this.scale );\n\n\t}\n\n}\n\n/**\n * A torus knot.\n *\n * @augments Curve\n * @three_import import { TorusKnot } from 'three/addons/curves/CurveExtras.js';\n */\nclass TorusKnot extends Curve {\n\n\t/**\n\t * Constructs a new torus knot.\n\t *\n\t * @param {number} [scale=10] - The curve's scale.\n\t */\n\tconstructor( scale = 10 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The curve's scale.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.scale = scale;\n\n\t}\n\n\t/**\n\t * This method returns a vector in 3D space for the given interpolation factor.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst p = 3;\n\t\tconst q = 4;\n\n\t\tt *= Math.PI * 2;\n\n\t\tconst x = ( 2 + Math.cos( q * t ) ) * Math.cos( p * t );\n\t\tconst y = ( 2 + Math.cos( q * t ) ) * Math.sin( p * t );\n\t\tconst z = Math.sin( q * t );\n\n\t\treturn point.set( x, y, z ).multiplyScalar( this.scale );\n\n\t}\n\n}\n\n/**\n * A Cinquefoil Knot.\n *\n * @augments Curve\n * @three_import import { CinquefoilKnot } from 'three/addons/curves/CurveExtras.js';\n */\nclass CinquefoilKnot extends Curve {\n\n\t/**\n\t * Constructs a new Cinquefoil Knot.\n\t *\n\t * @param {number} [scale=10] - The curve's scale.\n\t */\n\tconstructor( scale = 10 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The curve's scale.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.scale = scale;\n\n\t}\n\n\t/**\n\t * This method returns a vector in 3D space for the given interpolation factor.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst p = 2;\n\t\tconst q = 5;\n\n\t\tt *= Math.PI * 2;\n\n\t\tconst x = ( 2 + Math.cos( q * t ) ) * Math.cos( p * t );\n\t\tconst y = ( 2 + Math.cos( q * t ) ) * Math.sin( p * t );\n\t\tconst z = Math.sin( q * t );\n\n\t\treturn point.set( x, y, z ).multiplyScalar( this.scale );\n\n\t}\n\n}\n\n/**\n * A Trefoil Polynomial Knot.\n *\n * @augments Curve\n * @three_import import { TrefoilPolynomialKnot } from 'three/addons/curves/CurveExtras.js';\n */\nclass TrefoilPolynomialKnot extends Curve {\n\n\t/**\n\t * Constructs a new Trefoil Polynomial Knot.\n\t *\n\t * @param {number} [scale=10] - The curve's scale.\n\t */\n\tconstructor( scale = 10 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The curve's scale.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 10\n\t\t */\n\t\tthis.scale = scale;\n\n\t}\n\n\t/**\n\t * This method returns a vector in 3D space for the given interpolation factor.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tt = t * 4 - 2;\n\n\t\tconst x = Math.pow( t, 3 ) - 3 * t;\n\t\tconst y = Math.pow( t, 4 ) - 4 * t * t;\n\t\tconst z = 1 / 5 * Math.pow( t, 5 ) - 2 * t;\n\n\t\treturn point.set( x, y, z ).multiplyScalar( this.scale );\n\n\t}\n\n}\n\nfunction scaleTo( x, y, t ) {\n\n\tconst r = y - x;\n\treturn t * r + x;\n\n}\n\n/**\n * A Figure Eight Polynomial Knot.\n *\n * @augments Curve\n * @three_import import { FigureEightPolynomialKnot } from 'three/addons/curves/CurveExtras.js';\n */\nclass FigureEightPolynomialKnot extends Curve {\n\n\t/**\n\t * Constructs a new Figure Eight Polynomial Knot.\n\t *\n\t * @param {number} [scale=1] - The curve's scale.\n\t */\n\tconstructor( scale = 1 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The curve's scale.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.scale = scale;\n\n\t}\n\n\t/**\n\t * This method returns a vector in 3D space for the given interpolation factor.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tt = scaleTo( - 4, 4, t );\n\n\t\tconst x = 2 / 5 * t * ( t * t - 7 ) * ( t * t - 10 );\n\t\tconst y = Math.pow( t, 4 ) - 13 * t * t;\n\t\tconst z = 1 / 10 * t * ( t * t - 4 ) * ( t * t - 9 ) * ( t * t - 12 );\n\n\t\treturn point.set( x, y, z ).multiplyScalar( this.scale );\n\n\t}\n\n}\n\n/**\n * A Decorated Torus Knot 4a.\n *\n * @augments Curve\n * @three_import import { DecoratedTorusKnot4a } from 'three/addons/curves/CurveExtras.js';\n */\nclass DecoratedTorusKnot4a extends Curve {\n\n\t/**\n\t * Constructs a new Decorated Torus Knot 4a.\n\t *\n\t * @param {number} [scale=1] - The curve's scale.\n\t */\n\tconstructor( scale = 40 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The curve's scale.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 40\n\t\t */\n\t\tthis.scale = scale;\n\n\t}\n\n\t/**\n\t * This method returns a vector in 3D space for the given interpolation factor.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tt *= Math.PI * 2;\n\n\t\tconst x = Math.cos( 2 * t ) * ( 1 + 0.6 * ( Math.cos( 5 * t ) + 0.75 * Math.cos( 10 * t ) ) );\n\t\tconst y = Math.sin( 2 * t ) * ( 1 + 0.6 * ( Math.cos( 5 * t ) + 0.75 * Math.cos( 10 * t ) ) );\n\t\tconst z = 0.35 * Math.sin( 5 * t );\n\n\t\treturn point.set( x, y, z ).multiplyScalar( this.scale );\n\n\t}\n\n}\n\n/**\n * A Decorated Torus Knot 4b.\n *\n * @augments Curve\n * @three_import import { DecoratedTorusKnot4b } from 'three/addons/curves/CurveExtras.js';\n */\nclass DecoratedTorusKnot4b extends Curve {\n\n\t/**\n\t * Constructs a new Decorated Torus Knot 4b.\n\t *\n\t * @param {number} [scale=1] - The curve's scale.\n\t */\n\tconstructor( scale = 40 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The curve's scale.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 40\n\t\t */\n\t\tthis.scale = scale;\n\n\t}\n\n\t/**\n\t * This method returns a vector in 3D space for the given interpolation factor.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst fi = t * Math.PI * 2;\n\n\t\tconst x = Math.cos( 2 * fi ) * ( 1 + 0.45 * Math.cos( 3 * fi ) + 0.4 * Math.cos( 9 * fi ) );\n\t\tconst y = Math.sin( 2 * fi ) * ( 1 + 0.45 * Math.cos( 3 * fi ) + 0.4 * Math.cos( 9 * fi ) );\n\t\tconst z = 0.2 * Math.sin( 9 * fi );\n\n\t\treturn point.set( x, y, z ).multiplyScalar( this.scale );\n\n\t}\n\n}\n\n/**\n * A Decorated Torus Knot 5a.\n *\n * @augments Curve\n * @three_import import { DecoratedTorusKnot5a } from 'three/addons/curves/CurveExtras.js';\n */\nclass DecoratedTorusKnot5a extends Curve {\n\n\t/**\n\t * Constructs a new Decorated Torus Knot 5a.\n\t *\n\t * @param {number} [scale=1] - The curve's scale.\n\t */\n\tconstructor( scale = 40 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The curve's scale.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 40\n\t\t */\n\t\tthis.scale = scale;\n\n\t}\n\n\t/**\n\t * This method returns a vector in 3D space for the given interpolation factor.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst fi = t * Math.PI * 2;\n\n\t\tconst x = Math.cos( 3 * fi ) * ( 1 + 0.3 * Math.cos( 5 * fi ) + 0.5 * Math.cos( 10 * fi ) );\n\t\tconst y = Math.sin( 3 * fi ) * ( 1 + 0.3 * Math.cos( 5 * fi ) + 0.5 * Math.cos( 10 * fi ) );\n\t\tconst z = 0.2 * Math.sin( 20 * fi );\n\n\t\treturn point.set( x, y, z ).multiplyScalar( this.scale );\n\n\t}\n\n}\n\n/**\n * A Decorated Torus Knot 5c.\n *\n * @augments Curve\n * @three_import import { DecoratedTorusKnot5c } from 'three/addons/curves/CurveExtras.js';\n */\nclass DecoratedTorusKnot5c extends Curve {\n\n\t/**\n\t * Constructs a new Decorated Torus Knot 5c.\n\t *\n\t * @param {number} [scale=1] - The curve's scale.\n\t */\n\tconstructor( scale = 40 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The curve's scale.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 40\n\t\t */\n\t\tthis.scale = scale;\n\n\t}\n\n\t/**\n\t * This method returns a vector in 3D space for the given interpolation factor.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst fi = t * Math.PI * 2;\n\n\t\tconst x = Math.cos( 4 * fi ) * ( 1 + 0.5 * ( Math.cos( 5 * fi ) + 0.4 * Math.cos( 20 * fi ) ) );\n\t\tconst y = Math.sin( 4 * fi ) * ( 1 + 0.5 * ( Math.cos( 5 * fi ) + 0.4 * Math.cos( 20 * fi ) ) );\n\t\tconst z = 0.35 * Math.sin( 15 * fi );\n\n\t\treturn point.set( x, y, z ).multiplyScalar( this.scale );\n\n\t}\n\n}\n\nexport {\n\tGrannyKnot,\n\tHeartCurve,\n\tVivianiCurve,\n\tKnotCurve,\n\tHelixCurve,\n\tTrefoilKnot,\n\tTorusKnot,\n\tCinquefoilKnot,\n\tTrefoilPolynomialKnot,\n\tFigureEightPolynomialKnot,\n\tDecoratedTorusKnot4a,\n\tDecoratedTorusKnot4b,\n\tDecoratedTorusKnot5a,\n\tDecoratedTorusKnot5c\n};\n", "import {\n\tVector3,\n\tVector4\n} from 'three';\n\n/**\n * @module NURBSUtils\n * @three_import import * as NURBSUtils from 'three/addons/curves/NURBSUtils.js';\n */\n\n/**\n * Finds knot vector span.\n *\n * @param {number} p - The degree.\n * @param {number} u - The parametric value.\n * @param {Array<number>} U - The knot vector.\n * @return {number} The span.\n */\nfunction findSpan( p, u, U ) {\n\n\tconst n = U.length - p - 1;\n\n\tif ( u >= U[ n ] ) {\n\n\t\treturn n - 1;\n\n\t}\n\n\tif ( u <= U[ p ] ) {\n\n\t\treturn p;\n\n\t}\n\n\tlet low = p;\n\tlet high = n;\n\tlet mid = Math.floor( ( low + high ) / 2 );\n\n\twhile ( u < U[ mid ] || u >= U[ mid + 1 ] ) {\n\n\t\tif ( u < U[ mid ] ) {\n\n\t\t\thigh = mid;\n\n\t\t} else {\n\n\t\t\tlow = mid;\n\n\t\t}\n\n\t\tmid = Math.floor( ( low + high ) / 2 );\n\n\t}\n\n\treturn mid;\n\n}\n\n/**\n * Calculates basis functions. See The NURBS Book, page 70, algorithm A2.2.\n *\n * @param {number} span - The span in which `u` lies.\n * @param {number} u - The parametric value.\n * @param {number} p - The degree.\n * @param {Array<number>} U - The knot vector.\n * @return {Array<number>} Array[p+1] with basis functions values.\n */\nfunction calcBasisFunctions( span, u, p, U ) {\n\n\tconst N = [];\n\tconst left = [];\n\tconst right = [];\n\tN[ 0 ] = 1.0;\n\n\tfor ( let j = 1; j <= p; ++ j ) {\n\n\t\tleft[ j ] = u - U[ span + 1 - j ];\n\t\tright[ j ] = U[ span + j ] - u;\n\n\t\tlet saved = 0.0;\n\n\t\tfor ( let r = 0; r < j; ++ r ) {\n\n\t\t\tconst rv = right[ r + 1 ];\n\t\t\tconst lv = left[ j - r ];\n\t\t\tconst temp = N[ r ] / ( rv + lv );\n\t\t\tN[ r ] = saved + rv * temp;\n\t\t\tsaved = lv * temp;\n\n\t\t}\n\n\t\tN[ j ] = saved;\n\n\t}\n\n\treturn N;\n\n}\n\n/**\n * Calculates B-Spline curve points. See The NURBS Book, page 82, algorithm A3.1.\n *\n * @param {number} p - The degree of the B-Spline.\n * @param {Array<number>} U - The knot vector.\n * @param {Array<Vector4>} P - The control points\n * @param {number} u - The parametric point.\n * @return {Vector4} The point for given `u`.\n */\nfunction calcBSplinePoint( p, U, P, u ) {\n\n\tconst span = findSpan( p, u, U );\n\tconst N = calcBasisFunctions( span, u, p, U );\n\tconst C = new Vector4( 0, 0, 0, 0 );\n\n\tfor ( let j = 0; j <= p; ++ j ) {\n\n\t\tconst point = P[ span - p + j ];\n\t\tconst Nj = N[ j ];\n\t\tconst wNj = point.w * Nj;\n\t\tC.x += point.x * wNj;\n\t\tC.y += point.y * wNj;\n\t\tC.z += point.z * wNj;\n\t\tC.w += point.w * Nj;\n\n\t}\n\n\treturn C;\n\n}\n\n/**\n * Calculates basis functions derivatives. See The NURBS Book, page 72, algorithm A2.3.\n *\n * @param {number} span - The span in which `u` lies.\n * @param {number} u - The parametric point.\n * @param {number} p - The degree.\n * @param {number} n - number of derivatives to calculate\n * @param {Array<number>} U - The knot vector.\n * @return {Array<Array<number>>} An array[n+1][p+1] with basis functions derivatives.\n */\nfunction calcBasisFunctionDerivatives( span, u, p, n, U ) {\n\n\tconst zeroArr = [];\n\tfor ( let i = 0; i <= p; ++ i )\n\t\tzeroArr[ i ] = 0.0;\n\n\tconst ders = [];\n\n\tfor ( let i = 0; i <= n; ++ i )\n\t\tders[ i ] = zeroArr.slice( 0 );\n\n\tconst ndu = [];\n\n\tfor ( let i = 0; i <= p; ++ i )\n\t\tndu[ i ] = zeroArr.slice( 0 );\n\n\tndu[ 0 ][ 0 ] = 1.0;\n\n\tconst left = zeroArr.slice( 0 );\n\tconst right = zeroArr.slice( 0 );\n\n\tfor ( let j = 1; j <= p; ++ j ) {\n\n\t\tleft[ j ] = u - U[ span + 1 - j ];\n\t\tright[ j ] = U[ span + j ] - u;\n\n\t\tlet saved = 0.0;\n\n\t\tfor ( let r = 0; r < j; ++ r ) {\n\n\t\t\tconst rv = right[ r + 1 ];\n\t\t\tconst lv = left[ j - r ];\n\t\t\tndu[ j ][ r ] = rv + lv;\n\n\t\t\tconst temp = ndu[ r ][ j - 1 ] / ndu[ j ][ r ];\n\t\t\tndu[ r ][ j ] = saved + rv * temp;\n\t\t\tsaved = lv * temp;\n\n\t\t}\n\n\t\tndu[ j ][ j ] = saved;\n\n\t}\n\n\tfor ( let j = 0; j <= p; ++ j ) {\n\n\t\tders[ 0 ][ j ] = ndu[ j ][ p ];\n\n\t}\n\n\tfor ( let r = 0; r <= p; ++ r ) {\n\n\t\tlet s1 = 0;\n\t\tlet s2 = 1;\n\n\t\tconst a = [];\n\t\tfor ( let i = 0; i <= p; ++ i ) {\n\n\t\t\ta[ i ] = zeroArr.slice( 0 );\n\n\t\t}\n\n\t\ta[ 0 ][ 0 ] = 1.0;\n\n\t\tfor ( let k = 1; k <= n; ++ k ) {\n\n\t\t\tlet d = 0.0;\n\t\t\tconst rk = r - k;\n\t\t\tconst pk = p - k;\n\n\t\t\tif ( r >= k ) {\n\n\t\t\t\ta[ s2 ][ 0 ] = a[ s1 ][ 0 ] / ndu[ pk + 1 ][ rk ];\n\t\t\t\td = a[ s2 ][ 0 ] * ndu[ rk ][ pk ];\n\n\t\t\t}\n\n\t\t\tconst j1 = ( rk >= - 1 ) ? 1 : - rk;\n\t\t\tconst j2 = ( r - 1 <= pk ) ? k - 1 : p - r;\n\n\t\t\tfor ( let j = j1; j <= j2; ++ j ) {\n\n\t\t\t\ta[ s2 ][ j ] = ( a[ s1 ][ j ] - a[ s1 ][ j - 1 ] ) / ndu[ pk + 1 ][ rk + j ];\n\t\t\t\td += a[ s2 ][ j ] * ndu[ rk + j ][ pk ];\n\n\t\t\t}\n\n\t\t\tif ( r <= pk ) {\n\n\t\t\t\ta[ s2 ][ k ] = - a[ s1 ][ k - 1 ] / ndu[ pk + 1 ][ r ];\n\t\t\t\td += a[ s2 ][ k ] * ndu[ r ][ pk ];\n\n\t\t\t}\n\n\t\t\tders[ k ][ r ] = d;\n\n\t\t\tconst j = s1;\n\t\t\ts1 = s2;\n\t\t\ts2 = j;\n\n\t\t}\n\n\t}\n\n\tlet r = p;\n\n\tfor ( let k = 1; k <= n; ++ k ) {\n\n\t\tfor ( let j = 0; j <= p; ++ j ) {\n\n\t\t\tders[ k ][ j ] *= r;\n\n\t\t}\n\n\t\tr *= p - k;\n\n\t}\n\n\treturn ders;\n\n}\n\n/**\n * Calculates derivatives of a B-Spline. See The NURBS Book, page 93, algorithm A3.2.\n *\n * @param {number} p - The degree.\n * @param {Array<number>} U - The knot vector.\n * @param {Array<Vector4>} P - The control points\n * @param {number} u - The parametric point.\n * @param {number} nd - The number of derivatives.\n * @return {Array<Vector4>} An array[d+1] with derivatives.\n */\nfunction calcBSplineDerivatives( p, U, P, u, nd ) {\n\n\tconst du = nd < p ? nd : p;\n\tconst CK = [];\n\tconst span = findSpan( p, u, U );\n\tconst nders = calcBasisFunctionDerivatives( span, u, p, du, U );\n\tconst Pw = [];\n\n\tfor ( let i = 0; i < P.length; ++ i ) {\n\n\t\tconst point = P[ i ].clone();\n\t\tconst w = point.w;\n\n\t\tpoint.x *= w;\n\t\tpoint.y *= w;\n\t\tpoint.z *= w;\n\n\t\tPw[ i ] = point;\n\n\t}\n\n\tfor ( let k = 0; k <= du; ++ k ) {\n\n\t\tconst point = Pw[ span - p ].clone().multiplyScalar( nders[ k ][ 0 ] );\n\n\t\tfor ( let j = 1; j <= p; ++ j ) {\n\n\t\t\tpoint.add( Pw[ span - p + j ].clone().multiplyScalar( nders[ k ][ j ] ) );\n\n\t\t}\n\n\t\tCK[ k ] = point;\n\n\t}\n\n\tfor ( let k = du + 1; k <= nd + 1; ++ k ) {\n\n\t\tCK[ k ] = new Vector4( 0, 0, 0 );\n\n\t}\n\n\treturn CK;\n\n}\n\n/**\n * Calculates \"K over I\".\n *\n * @param {number} k - The K value.\n * @param {number} i - The I value.\n * @return {number} k!/(i!(k-i)!)\n */\nfunction calcKoverI( k, i ) {\n\n\tlet nom = 1;\n\n\tfor ( let j = 2; j <= k; ++ j ) {\n\n\t\tnom *= j;\n\n\t}\n\n\tlet denom = 1;\n\n\tfor ( let j = 2; j <= i; ++ j ) {\n\n\t\tdenom *= j;\n\n\t}\n\n\tfor ( let j = 2; j <= k - i; ++ j ) {\n\n\t\tdenom *= j;\n\n\t}\n\n\treturn nom / denom;\n\n}\n\n/**\n * Calculates derivatives (0-nd) of rational curve. See The NURBS Book, page 127, algorithm A4.2.\n *\n * @param {Array<Vector4>} Pders - Array with derivatives.\n * @return {Array<Vector3>} An array with derivatives for rational curve.\n */\nfunction calcRationalCurveDerivatives( Pders ) {\n\n\tconst nd = Pders.length;\n\tconst Aders = [];\n\tconst wders = [];\n\n\tfor ( let i = 0; i < nd; ++ i ) {\n\n\t\tconst point = Pders[ i ];\n\t\tAders[ i ] = new Vector3( point.x, point.y, point.z );\n\t\twders[ i ] = point.w;\n\n\t}\n\n\tconst CK = [];\n\n\tfor ( let k = 0; k < nd; ++ k ) {\n\n\t\tconst v = Aders[ k ].clone();\n\n\t\tfor ( let i = 1; i <= k; ++ i ) {\n\n\t\t\tv.sub( CK[ k - i ].clone().multiplyScalar( calcKoverI( k, i ) * wders[ i ] ) );\n\n\t\t}\n\n\t\tCK[ k ] = v.divideScalar( wders[ 0 ] );\n\n\t}\n\n\treturn CK;\n\n}\n\n/**\n * Calculates NURBS curve derivatives. See The NURBS Book, page 127, algorithm A4.2.\n *\n * @param {number} p - The degree.\n * @param {Array<number>} U - The knot vector.\n * @param {Array<Vector4>} P - The control points in homogeneous space.\n * @param {number} u - The parametric point.\n * @param {number} nd - The number of derivatives.\n * @return {Array<Vector3>} array with derivatives for rational curve.\n */\nfunction calcNURBSDerivatives( p, U, P, u, nd ) {\n\n\tconst Pders = calcBSplineDerivatives( p, U, P, u, nd );\n\treturn calcRationalCurveDerivatives( Pders );\n\n}\n\n/**\n * Calculates a rational B-Spline surface point. See The NURBS Book, page 134, algorithm A4.3.\n *\n * @param {number} p - The first degree of B-Spline surface.\n * @param {number} q - The second degree of B-Spline surface.\n * @param {Array<number>} U - The first knot vector.\n * @param {Array<number>} V - The second knot vector.\n * @param {Array<Array<Vector4>>} P - The control points in homogeneous space.\n * @param {number} u - The first parametric point.\n * @param {number} v - The second parametric point.\n * @param {Vector3} target - The target vector.\n */\nfunction calcSurfacePoint( p, q, U, V, P, u, v, target ) {\n\n\tconst uspan = findSpan( p, u, U );\n\tconst vspan = findSpan( q, v, V );\n\tconst Nu = calcBasisFunctions( uspan, u, p, U );\n\tconst Nv = calcBasisFunctions( vspan, v, q, V );\n\tconst temp = [];\n\n\tfor ( let l = 0; l <= q; ++ l ) {\n\n\t\ttemp[ l ] = new Vector4( 0, 0, 0, 0 );\n\t\tfor ( let k = 0; k <= p; ++ k ) {\n\n\t\t\tconst point = P[ uspan - p + k ][ vspan - q + l ].clone();\n\t\t\tconst w = point.w;\n\t\t\tpoint.x *= w;\n\t\t\tpoint.y *= w;\n\t\t\tpoint.z *= w;\n\t\t\ttemp[ l ].add( point.multiplyScalar( Nu[ k ] ) );\n\n\t\t}\n\n\t}\n\n\tconst Sw = new Vector4( 0, 0, 0, 0 );\n\tfor ( let l = 0; l <= q; ++ l ) {\n\n\t\tSw.add( temp[ l ].multiplyScalar( Nv[ l ] ) );\n\n\t}\n\n\tSw.divideScalar( Sw.w );\n\ttarget.set( Sw.x, Sw.y, Sw.z );\n\n}\n\n/**\n * Calculates a rational B-Spline volume point. See The NURBS Book, page 134, algorithm A4.3.\n *\n * @param {number} p - The first degree of B-Spline surface.\n * @param {number} q - The second degree of B-Spline surface.\n * @param {number} r - The third degree of B-Spline surface.\n * @param {Array<number>} U - The first knot vector.\n * @param {Array<number>} V - The second knot vector.\n * @param {Array<number>} W - The third knot vector.\n * @param {Array<Array<Array<Vector4>>>} P - The control points in homogeneous space.\n * @param {number} u - The first parametric point.\n * @param {number} v - The second parametric point.\n * @param {number} w - The third parametric point.\n * @param {Vector3} target - The target vector.\n */\nfunction calcVolumePoint( p, q, r, U, V, W, P, u, v, w, target ) {\n\n\tconst uspan = findSpan( p, u, U );\n\tconst vspan = findSpan( q, v, V );\n\tconst wspan = findSpan( r, w, W );\n\tconst Nu = calcBasisFunctions( uspan, u, p, U );\n\tconst Nv = calcBasisFunctions( vspan, v, q, V );\n\tconst Nw = calcBasisFunctions( wspan, w, r, W );\n\tconst temp = [];\n\n\tfor ( let m = 0; m <= r; ++ m ) {\n\n\t\ttemp[ m ] = [];\n\n\t\tfor ( let l = 0; l <= q; ++ l ) {\n\n\t\t\ttemp[ m ][ l ] = new Vector4( 0, 0, 0, 0 );\n\t\t\tfor ( let k = 0; k <= p; ++ k ) {\n\n\t\t\t\tconst point = P[ uspan - p + k ][ vspan - q + l ][ wspan - r + m ].clone();\n\t\t\t\tconst w = point.w;\n\t\t\t\tpoint.x *= w;\n\t\t\t\tpoint.y *= w;\n\t\t\t\tpoint.z *= w;\n\t\t\t\ttemp[ m ][ l ].add( point.multiplyScalar( Nu[ k ] ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tconst Sw = new Vector4( 0, 0, 0, 0 );\n\tfor ( let m = 0; m <= r; ++ m ) {\n\n\t\tfor ( let l = 0; l <= q; ++ l ) {\n\n\t\t\tSw.add( temp[ m ][ l ].multiplyScalar( Nw[ m ] ).multiplyScalar( Nv[ l ] ) );\n\n\t\t}\n\n\t}\n\n\tSw.divideScalar( Sw.w );\n\ttarget.set( Sw.x, Sw.y, Sw.z );\n\n}\n\nexport {\n\tfindSpan,\n\tcalcBasisFunctions,\n\tcalcBSplinePoint,\n\tcalcBasisFunctionDerivatives,\n\tcalcBSplineDerivatives,\n\tcalcKoverI,\n\tcalcRationalCurveDerivatives,\n\tcalcNURBSDerivatives,\n\tcalcSurfacePoint,\n\tcalcVolumePoint,\n};\n", "import {\n\tCurve,\n\tVector3,\n\tVector4\n} from 'three';\nimport * as NURBSUtils from '../curves/NURBSUtils.js';\n\n/**\n * This class represents a NURBS curve.\n *\n * Implementation is based on `(x, y [, z=0 [, w=1]])` control points with `w=weight`.\n *\n * @augments Curve\n * @three_import import { NURBSCurve } from 'three/addons/curves/NURBSCurve.js';\n */\nclass NURBSCurve extends Curve {\n\n\t/**\n\t * Constructs a new NURBS curve.\n\t *\n\t * @param {number} degree - The NURBS degree.\n\t * @param {Array<number>} knots - The knots as a flat array of numbers.\n\t * @param {Array<Vector2|Vector3|Vector4>} controlPoints - An array holding control points.\n\t * @param {number} [startKnot] - Index of the start knot into the `knots` array.\n\t * @param {number} [endKnot] - Index of the end knot into the `knots` array.\n\t */\n\tconstructor( degree, knots, controlPoints, startKnot, endKnot ) {\n\n\t\tsuper();\n\n\t\tconst knotsLength = knots ? knots.length - 1 : 0;\n\t\tconst pointsLength = controlPoints ? controlPoints.length : 0;\n\n\t\t/**\n\t\t * The NURBS degree.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.degree = degree;\n\n\t\t/**\n\t\t * The knots as a flat array of numbers.\n\t\t *\n\t\t * @type {Array<number>}\n\t\t */\n\t\tthis.knots = knots;\n\n\t\t/**\n\t\t * An array of control points.\n\t\t *\n\t\t * @type {Array<Vector4>}\n\t\t */\n\t\tthis.controlPoints = [];\n\n\t\t/**\n\t\t * Index of the start knot into the `knots` array.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.startKnot = startKnot || 0;\n\n\t\t/**\n\t\t * Index of the end knot into the `knots` array.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.endKnot = endKnot || knotsLength;\n\n\t\tfor ( let i = 0; i < pointsLength; ++ i ) {\n\n\t\t\t// ensure Vector4 for control points\n\t\t\tconst point = controlPoints[ i ];\n\t\t\tthis.controlPoints[ i ] = new Vector4( point.x, point.y, point.z, point.w );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * This method returns a vector in 3D space for the given interpolation factor.\n\t *\n\t * @param {number} t - A interpolation factor representing a position on the curve. Must be in the range `[0,1]`.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The position on the curve.\n\t */\n\tgetPoint( t, optionalTarget = new Vector3() ) {\n\n\t\tconst point = optionalTarget;\n\n\t\tconst u = this.knots[ this.startKnot ] + t * ( this.knots[ this.endKnot ] - this.knots[ this.startKnot ] ); // linear mapping t->u\n\n\t\t// following results in (wx, wy, wz, w) homogeneous point\n\t\tconst hpoint = NURBSUtils.calcBSplinePoint( this.degree, this.knots, this.controlPoints, u );\n\n\t\tif ( hpoint.w !== 1.0 ) {\n\n\t\t\t// project to 3D space: (wx, wy, wz, w) -> (x, y, z, 1)\n\t\t\thpoint.divideScalar( hpoint.w );\n\n\t\t}\n\n\t\treturn point.set( hpoint.x, hpoint.y, hpoint.z );\n\n\t}\n\n\t/**\n\t * Returns a unit vector tangent for the given interpolation factor.\n\t *\n\t * @param {number} t - The interpolation factor.\n\t * @param {Vector3} [optionalTarget] - The optional target vector the result is written to.\n\t * @return {Vector3} The tangent vector.\n\t */\n\tgetTangent( t, optionalTarget = new Vector3() ) {\n\n\t\tconst tangent = optionalTarget;\n\n\t\tconst u = this.knots[ 0 ] + t * ( this.knots[ this.knots.length - 1 ] - this.knots[ 0 ] );\n\t\tconst ders = NURBSUtils.calcNURBSDerivatives( this.degree, this.knots, this.controlPoints, u, 1 );\n\t\ttangent.copy( ders[ 1 ] ).normalize();\n\n\t\treturn tangent;\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst data = super.toJSON();\n\n\t\tdata.degree = this.degree;\n\t\tdata.knots = [ ...this.knots ];\n\t\tdata.controlPoints = this.controlPoints.map( p => p.toArray() );\n\t\tdata.startKnot = this.startKnot;\n\t\tdata.endKnot = this.endKnot;\n\n\t\treturn data;\n\n\t}\n\n\tfromJSON( json ) {\n\n\t\tsuper.fromJSON( json );\n\n\t\tthis.degree = json.degree;\n\t\tthis.knots = [ ...json.knots ];\n\t\tthis.controlPoints = json.controlPoints.map( p => new Vector4( p[ 0 ], p[ 1 ], p[ 2 ], p[ 3 ] ) );\n\t\tthis.startKnot = json.startKnot;\n\t\tthis.endKnot = json.endKnot;\n\n\t\treturn this;\n\n\t}\n\n}\n\nexport { NURBSCurve };\n", "import {\n\tVector4\n} from 'three';\nimport * as NURBSUtils from '../curves/NURBSUtils.js';\n\n/**\n * This class represents a NURBS surface.\n *\n * Implementation is based on `(x, y [, z=0 [, w=1]])` control points with `w=weight`.\n *\n * @three_import import { NURBSSurface } from 'three/addons/curves/NURBSSurface.js';\n */\nclass NURBSSurface {\n\n\t/**\n\t * Constructs a new NURBS surface.\n\t *\n\t * @param {number} degree1 - The first NURBS degree.\n\t * @param {number} degree2 - The second NURBS degree.\n\t * @param {Array<number>} knots1 - The first knots as a flat array of numbers.\n\t * @param {Array<number>} knots2 - The second knots as a flat array of numbers.\n\t * @param {Array<Array<Vector2|Vector3|Vector4>>} controlPoints - An array^2 holding control points.\n\t */\n\tconstructor( degree1, degree2, knots1, knots2, controlPoints ) {\n\n\t\t/**\n\t\t * The first NURBS degree.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.degree1 = degree1;\n\n\t\t/**\n\t\t * The second NURBS degree.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.degree2 = degree2;\n\n\t\t/**\n\t\t * The first knots as a flat array of numbers.\n\t\t *\n\t\t * @type {Array<number>}\n\t\t */\n\t\tthis.knots1 = knots1;\n\n\t\t/**\n\t\t * The second knots as a flat array of numbers.\n\t\t *\n\t\t * @type {Array<number>}\n\t\t */\n\t\tthis.knots2 = knots2;\n\n\t\t/**\n\t\t *  An array holding arrays of control points.\n\t\t *\n\t\t * @type {Array<Array<Vector2|Vector3|Vector4>>}\n\t\t */\n\t\tthis.controlPoints = [];\n\n\t\tconst len1 = knots1.length - degree1 - 1;\n\t\tconst len2 = knots2.length - degree2 - 1;\n\n\t\t// ensure Vector4 for control points\n\t\tfor ( let i = 0; i < len1; ++ i ) {\n\n\t\t\tthis.controlPoints[ i ] = [];\n\n\t\t\tfor ( let j = 0; j < len2; ++ j ) {\n\n\t\t\t\tconst point = controlPoints[ i ][ j ];\n\t\t\t\tthis.controlPoints[ i ][ j ] = new Vector4( point.x, point.y, point.z, point.w );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * This method returns a vector in 3D space for the given interpolation factor. This vector lies on the NURBS surface.\n\t *\n\t * @param {number} t1 - The first interpolation factor representing the `u` position on the surface. Must be in the range `[0,1]`.\n\t * @param {number} t2 - The second interpolation factor representing the `v` position on the surface. Must be in the range `[0,1]`.\n\t * @param {Vector3} target - The target vector the result is written to.\n\t */\n\tgetPoint( t1, t2, target ) {\n\n\t\tconst u = this.knots1[ 0 ] + t1 * ( this.knots1[ this.knots1.length - 1 ] - this.knots1[ 0 ] ); // linear mapping t1->u\n\t\tconst v = this.knots2[ 0 ] + t2 * ( this.knots2[ this.knots2.length - 1 ] - this.knots2[ 0 ] ); // linear mapping t2->u\n\n\t\tNURBSUtils.calcSurfacePoint( this.degree1, this.degree2, this.knots1, this.knots2, this.controlPoints, u, v, target );\n\n\t}\n\n}\n\nexport { NURBSSurface };\n", "import {\n\tVector4\n} from 'three';\nimport * as NURBSUtils from '../curves/NURBSUtils.js';\n\n/**\n * This class represents a NURBS volume.\n *\n * Implementation is based on `(x, y [, z=0 [, w=1]])` control points with `w=weight`.\n *\n * @three_import import { NURBSVolume } from 'three/addons/curves/NURBSVolume.js';\n */\nclass NURBSVolume {\n\n\t/**\n\t * Constructs a new NURBS surface.\n\t *\n\t * @param {number} degree1 - The first NURBS degree.\n\t * @param {number} degree2 - The second NURBS degree.\n\t * @param {number} degree3 - The third NURBS degree.\n\t * @param {Array<number>} knots1 - The first knots as a flat array of numbers.\n\t * @param {Array<number>} knots2 - The second knots as a flat array of numbers.\n\t * @param {Array<number>} knots3 - The third knots as a flat array of numbers.\n\t * @param {Array<Array<Array<Vector2|Vector3|Vector4>>>} controlPoints - An array^3 holding control points.\n\t */\n\tconstructor( degree1, degree2, degree3, knots1, knots2, knots3 /* arrays of reals */, controlPoints /* array^3 of Vector(2|3|4) */ ) {\n\n\t\tthis.degree1 = degree1;\n\t\tthis.degree2 = degree2;\n\t\tthis.degree3 = degree3;\n\t\tthis.knots1 = knots1;\n\t\tthis.knots2 = knots2;\n\t\tthis.knots3 = knots3;\n\t\tthis.controlPoints = [];\n\n\t\tconst len1 = knots1.length - degree1 - 1;\n\t\tconst len2 = knots2.length - degree2 - 1;\n\t\tconst len3 = knots3.length - degree3 - 1;\n\n\t\t// ensure Vector4 for control points\n\t\tfor ( let i = 0; i < len1; ++ i ) {\n\n\t\t\tthis.controlPoints[ i ] = [];\n\n\t\t\tfor ( let j = 0; j < len2; ++ j ) {\n\n\t\t\t\tthis.controlPoints[ i ][ j ] = [];\n\n\t\t\t\tfor ( let k = 0; k < len3; ++ k ) {\n\n\t\t\t\t\tconst point = controlPoints[ i ][ j ][ k ];\n\t\t\t\t\tthis.controlPoints[ i ][ j ][ k ] = new Vector4( point.x, point.y, point.z, point.w );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * This method returns a vector in 3D space for the given interpolation factor. This vector lies within the NURBS volume.\n\t *\n\t * @param {number} t1 - The first interpolation factor representing the `u` position within the volume. Must be in the range `[0,1]`.\n\t * @param {number} t2 - The second interpolation factor representing the `v` position within the volume. Must be in the range `[0,1]`.\n\t * @param {number} t3 - The third interpolation factor representing the `w` position within the volume. Must be in the range `[0,1]`.\n\t * @param {Vector3} target - The target vector the result is written to.\n\t */\n\tgetPoint( t1, t2, t3, target ) {\n\n\t\tconst u = this.knots1[ 0 ] + t1 * ( this.knots1[ this.knots1.length - 1 ] - this.knots1[ 0 ] ); // linear mapping t1->u\n\t\tconst v = this.knots2[ 0 ] + t2 * ( this.knots2[ this.knots2.length - 1 ] - this.knots2[ 0 ] ); // linear mapping t2->v\n\t\tconst w = this.knots3[ 0 ] + t3 * ( this.knots3[ this.knots3.length - 1 ] - this.knots3[ 0 ] ); // linear mapping t3->w\n\n\t\tNURBSUtils.calcVolumePoint( this.degree1, this.degree2, this.degree3, this.knots1, this.knots2, this.knots3, this.controlPoints, u, v, w, target );\n\n\t}\n\n}\n\nexport { NURBSVolume };\n", "import {\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tOrthographicCamera,\n\tMesh\n} from 'three';\n\n/**\n * Abstract base class for all post processing passes.\n *\n * This module is only relevant for post processing with {@link WebGLRenderer}.\n *\n * @abstract\n * @three_import import { Pass } from 'three/addons/postprocessing/Pass.js';\n */\nclass Pass {\n\n\t/**\n\t * Constructs a new pass.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPass = true;\n\n\t\t/**\n\t\t * If set to `true`, the pass is processed by the composer.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enabled = true;\n\n\t\t/**\n\t\t * If set to `true`, the pass indicates to swap read and write buffer after rendering.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.needsSwap = true;\n\n\t\t/**\n\t\t * If set to `true`, the pass clears its buffer before rendering\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clear = false;\n\n\t\t/**\n\t\t * If set to `true`, the result of the pass is rendered to screen. The last pass in the composers\n\t\t * pass chain gets automatically rendered to screen, no matter how this property is configured.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.renderToScreen = false;\n\n\t}\n\n\t/**\n\t * Sets the size of the pass.\n\t *\n\t * @abstract\n\t * @param {number} width - The width to set.\n\t * @param {number} height - The height to set.\n\t */\n\tsetSize( /* width, height */ ) {}\n\n\t/**\n\t * This method holds the render logic of a pass. It must be implemented in all derived classes.\n\t *\n\t * @abstract\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( /* renderer, writeBuffer, readBuffer, deltaTime, maskActive */ ) {\n\n\t\tconsole.error( 'THREE.Pass: .render() must be implemented in derived pass.' );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the pass is no longer used in your app.\n\t *\n\t * @abstract\n\t */\n\tdispose() {}\n\n}\n\n// Helper for passes that need to fill the viewport with a single quad.\n\nconst _camera = new OrthographicCamera( - 1, 1, 1, - 1, 0, 1 );\n\n// https://github.com/mrdoob/three.js/pull/21358\n\nclass FullscreenTriangleGeometry extends BufferGeometry {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( [ - 1, 3, 0, - 1, - 1, 0, 3, - 1, 0 ], 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( [ 0, 2, 0, 0, 2, 0 ], 2 ) );\n\n\t}\n\n}\n\nconst _geometry = new FullscreenTriangleGeometry();\n\n\n/**\n * This module is a helper for passes which need to render a full\n * screen effect which is quite common in context of post processing.\n *\n * The intended usage is to reuse a single full screen quad for rendering\n * subsequent passes by just reassigning the `material` reference.\n *\n * This module can only be used with {@link WebGLRenderer}.\n *\n * @augments Mesh\n * @three_import import { FullScreenQuad } from 'three/addons/postprocessing/Pass.js';\n */\nclass FullScreenQuad {\n\n\t/**\n\t * Constructs a new full screen quad.\n\t *\n\t * @param {?Material} material - The material to render te full screen quad with.\n\t */\n\tconstructor( material ) {\n\n\t\tthis._mesh = new Mesh( _geometry, material );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis._mesh.geometry.dispose();\n\n\t}\n\n\t/**\n\t * Renders the full screen quad.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t */\n\trender( renderer ) {\n\n\t\trenderer.render( this._mesh, _camera );\n\n\t}\n\n\t/**\n\t * The quad's material.\n\t *\n\t * @type {?Material}\n\t */\n\tget material() {\n\n\t\treturn this._mesh.material;\n\n\t}\n\n\tset material( value ) {\n\n\t\tthis._mesh.material = value;\n\n\t}\n\n}\n\nexport { Pass, FullScreenQuad };\n", "import {\n\tLinearFilter,\n\tMatrix3,\n\tNearestFilter,\n\tRGBAFormat,\n\tShaderMaterial,\n\tStereoCamera,\n\tWebGLRenderTarget\n} from 'three';\nimport { FullScreenQuad } from '../postprocessing/Pass.js';\n\n/**\n * A class that creates an anaglyph effect.\n *\n * Note that this class can only be used with {@link WebGLRenderer}.\n * When using {@link WebGPURenderer}, use {@link AnaglyphPassNode}.\n *\n * @three_import import { AnaglyphEffect } from 'three/addons/effects/AnaglyphEffect.js';\n */\nclass AnaglyphEffect {\n\n\t/**\n\t * Constructs a new anaglyph effect.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {number} width - The width of the effect in physical pixels.\n\t * @param {number} height - The height of the effect in physical pixels.\n\t */\n\tconstructor( renderer, width = 512, height = 512 ) {\n\n\t\t// Dubois matrices from https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.7.6968&rep=rep1&type=pdf#page=4\n\n\t\tthis.colorMatrixLeft = new Matrix3().fromArray( [\n\t\t\t0.456100, - 0.0400822, - 0.0152161,\n\t\t\t0.500484, - 0.0378246, - 0.0205971,\n\t\t\t0.176381, - 0.0157589, - 0.00546856\n\t\t] );\n\n\t\tthis.colorMatrixRight = new Matrix3().fromArray( [\n\t\t\t- 0.0434706, 0.378476, - 0.0721527,\n\t\t\t- 0.0879388, 0.73364, - 0.112961,\n\t\t\t- 0.00155529, - 0.0184503, 1.2264\n\t\t] );\n\n\t\tconst _stereo = new StereoCamera();\n\n\t\tconst _params = { minFilter: LinearFilter, magFilter: NearestFilter, format: RGBAFormat };\n\n\t\tconst _renderTargetL = new WebGLRenderTarget( width, height, _params );\n\t\tconst _renderTargetR = new WebGLRenderTarget( width, height, _params );\n\n\t\tconst _material = new ShaderMaterial( {\n\n\t\t\tuniforms: {\n\n\t\t\t\t'mapLeft': { value: _renderTargetL.texture },\n\t\t\t\t'mapRight': { value: _renderTargetR.texture },\n\n\t\t\t\t'colorMatrixLeft': { value: this.colorMatrixLeft },\n\t\t\t\t'colorMatrixRight': { value: this.colorMatrixRight }\n\n\t\t\t},\n\n\t\t\tvertexShader: [\n\n\t\t\t\t'varying vec2 vUv;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t'\tvUv = vec2( uv.x, uv.y );',\n\t\t\t\t'\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' ),\n\n\t\t\tfragmentShader: [\n\n\t\t\t\t'uniform sampler2D mapLeft;',\n\t\t\t\t'uniform sampler2D mapRight;',\n\t\t\t\t'varying vec2 vUv;',\n\n\t\t\t\t'uniform mat3 colorMatrixLeft;',\n\t\t\t\t'uniform mat3 colorMatrixRight;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t'\tvec2 uv = vUv;',\n\n\t\t\t\t'\tvec4 colorL = texture2D( mapLeft, uv );',\n\t\t\t\t'\tvec4 colorR = texture2D( mapRight, uv );',\n\n\t\t\t\t'\tvec3 color = clamp(',\n\t\t\t\t'\t\t\tcolorMatrixLeft * colorL.rgb +',\n\t\t\t\t'\t\t\tcolorMatrixRight * colorR.rgb, 0., 1. );',\n\n\t\t\t\t'\tgl_FragColor = vec4(',\n\t\t\t\t'\t\t\tcolor.r, color.g, color.b,',\n\t\t\t\t'\t\t\tmax( colorL.a, colorR.a ) );',\n\n\t\t\t\t'\t#include <tonemapping_fragment>',\n\t\t\t\t'\t#include <colorspace_fragment>',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' )\n\n\t\t} );\n\n\t\tconst _quad = new FullScreenQuad( _material );\n\n\t\t/**\n\t\t * Resizes the effect.\n\t\t *\n\t\t * @param {number} width - The width of the effect in logical pixels.\n\t\t * @param {number} height - The height of the effect in logical pixels.\n\t\t */\n\t\tthis.setSize = function ( width, height ) {\n\n\t\t\trenderer.setSize( width, height );\n\n\t\t\tconst pixelRatio = renderer.getPixelRatio();\n\n\t\t\t_renderTargetL.setSize( width * pixelRatio, height * pixelRatio );\n\t\t\t_renderTargetR.setSize( width * pixelRatio, height * pixelRatio );\n\n\t\t};\n\n\t\t/**\n\t\t * When using this effect, this method should be called instead of the\n\t\t * default {@link WebGLRenderer#render}.\n\t\t *\n\t\t * @param {Object3D} scene - The scene to render.\n\t\t * @param {Camera} camera - The camera.\n\t\t */\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\t\tif ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t\tif ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();\n\n\t\t\t_stereo.update( camera );\n\n\t\t\trenderer.setRenderTarget( _renderTargetL );\n\t\t\trenderer.clear();\n\t\t\trenderer.render( scene, _stereo.cameraL );\n\n\t\t\trenderer.setRenderTarget( _renderTargetR );\n\t\t\trenderer.clear();\n\t\t\trenderer.render( scene, _stereo.cameraR );\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\t_quad.render( renderer );\n\n\t\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t\t};\n\n\t\t/**\n\t\t * Frees internal resources. This method should be called\n\t\t * when the effect is no longer required.\n\t\t */\n\t\tthis.dispose = function () {\n\n\t\t\t_renderTargetL.dispose();\n\t\t\t_renderTargetR.dispose();\n\n\t\t\t_material.dispose();\n\t\t\t_quad.dispose();\n\n\t\t};\n\n\t}\n\n}\n\nexport { AnaglyphEffect };\n", "/**\n * A class that creates an ASCII effect.\n *\n * The ASCII generation is based on [jsascii](https://github.com/hassadee/jsascii/blob/master/jsascii.js).\n *\n * @three_import import { AsciiEffect } from 'three/addons/effects/AsciiEffect.js';\n */\nclass AsciiEffect {\n\n\t/**\n\t * Constructs a new ASCII effect.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {string} [charSet=' .:-=+*#%@'] - The char set.\n\t * @param {AsciiEffect~Options} [options] - The configuration parameter.\n\t */\n\tconstructor( renderer, charSet = ' .:-=+*#%@', options = {} ) {\n\n\t\t// ' .,:;=|iI+hHOE#`$';\n\t\t// darker bolder character set from https://github.com/saw/Canvas-ASCII-Art/\n\t\t// ' .\\'`^\",:;Il!i~+_-?][}{1)(|/tfjrxnuvczXYUJCLQ0OZmwqpdbkhao*#MW&8%B@$'\n\n\t\t// Some ASCII settings\n\n\t\tconst fResolution = options[ 'resolution' ] || 0.15;\n\t\tconst iScale = options[ 'scale' ] || 1;\n\t\tconst bColor = options[ 'color' ] || false;\n\t\tconst bAlpha = options[ 'alpha' ] || false;\n\t\tconst bBlock = options[ 'block' ] || false;\n\t\tconst bInvert = options[ 'invert' ] || false;\n\t\tconst strResolution = options[ 'strResolution' ] || 'low';\n\n\t\tlet width, height;\n\n\t\tconst domElement = document.createElement( 'div' );\n\t\tdomElement.style.cursor = 'default';\n\n\t\tconst oAscii = document.createElement( 'table' );\n\t\tdomElement.appendChild( oAscii );\n\n\t\tlet iWidth, iHeight;\n\t\tlet oImg;\n\n\t\t/**\n\t\t * Resizes the effect.\n\t\t *\n\t\t * @param {number} w - The width of the effect in logical pixels.\n\t\t * @param {number} h - The height of the effect in logical pixels.\n\t\t */\n\t\tthis.setSize = function ( w, h ) {\n\n\t\t\twidth = w;\n\t\t\theight = h;\n\n\t\t\trenderer.setSize( w, h );\n\n\t\t\tinitAsciiSize();\n\n\t\t};\n\n\t\t/**\n\t\t * When using this effect, this method should be called instead of the\n\t\t * default {@link WebGLRenderer#render}.\n\t\t *\n\t\t * @param {Object3D} scene - The scene to render.\n\t\t * @param {Camera} camera - The camera.\n\t\t */\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\trenderer.render( scene, camera );\n\t\t\tasciifyImage( oAscii );\n\n\t\t};\n\n\t\t/**\n\t\t * The DOM element of the effect. This element must be used instead of the\n\t\t * default {@link WebGLRenderer#domElement}.\n\t\t *\n\t\t * @type {HTMLDivElement}\n\t\t */\n\t\tthis.domElement = domElement;\n\n\n\t\t// Throw in ascii library from https://github.com/hassadee/jsascii/blob/master/jsascii.js (MIT License)\n\n\t\tfunction initAsciiSize() {\n\n\t\t\tiWidth = Math.floor( width * fResolution );\n\t\t\tiHeight = Math.floor( height * fResolution );\n\n\t\t\toCanvas.width = iWidth;\n\t\t\toCanvas.height = iHeight;\n\t\t\t// oCanvas.style.display = \"none\";\n\t\t\t// oCanvas.style.width = iWidth;\n\t\t\t// oCanvas.style.height = iHeight;\n\n\t\t\toImg = renderer.domElement;\n\n\t\t\tif ( oImg.style.backgroundColor ) {\n\n\t\t\t\toAscii.rows[ 0 ].cells[ 0 ].style.backgroundColor = oImg.style.backgroundColor;\n\t\t\t\toAscii.rows[ 0 ].cells[ 0 ].style.color = oImg.style.color;\n\n\t\t\t}\n\n\t\t\toAscii.cellSpacing = '0';\n\t\t\toAscii.cellPadding = '0';\n\n\t\t\tconst oStyle = oAscii.style;\n\t\t\toStyle.whiteSpace = 'pre';\n\t\t\toStyle.margin = '0px';\n\t\t\toStyle.padding = '0px';\n\t\t\toStyle.letterSpacing = fLetterSpacing + 'px';\n\t\t\toStyle.fontFamily = strFont;\n\t\t\toStyle.fontSize = fFontSize + 'px';\n\t\t\toStyle.lineHeight = fLineHeight + 'px';\n\t\t\toStyle.textAlign = 'left';\n\t\t\toStyle.textDecoration = 'none';\n\n\t\t}\n\n\n\t\tconst strFont = 'courier new, monospace';\n\n\t\tconst oCanvasImg = renderer.domElement;\n\n\t\tconst oCanvas = document.createElement( 'canvas' );\n\t\tif ( ! oCanvas.getContext ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst oCtx = oCanvas.getContext( '2d' );\n\t\tif ( ! oCtx.getImageData ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tlet aCharList;\n\t\tif ( charSet ) {\n\n\t\t\taCharList = ( charSet ).split( '' );\n\n\t\t} else {\n\n\t\t\tconst aDefaultCharList = ( ' .,:;i1tfLCG08@' ).split( '' );\n\t\t\tconst aDefaultColorCharList = ( ' CGO08@' ).split( '' );\n\t\t\taCharList = ( bColor ? aDefaultColorCharList : aDefaultCharList );\n\n\t\t}\n\n\n\t\t// Setup dom\n\n\t\tconst fFontSize = ( 2 / fResolution ) * iScale;\n\t\tconst fLineHeight = ( 2 / fResolution ) * iScale;\n\n\t\t// adjust letter-spacing for all combinations of scale and resolution to get it to fit the image width.\n\n\t\tlet fLetterSpacing = 0;\n\n\t\tif ( strResolution == 'low' ) {\n\n\t\t\tswitch ( iScale ) {\n\n\t\t\t\tcase 1 : fLetterSpacing = - 1; break;\n\t\t\t\tcase 2 :\n\t\t\t\tcase 3 : fLetterSpacing = - 2.1; break;\n\t\t\t\tcase 4 : fLetterSpacing = - 3.1; break;\n\t\t\t\tcase 5 : fLetterSpacing = - 4.15; break;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( strResolution == 'medium' ) {\n\n\t\t\tswitch ( iScale ) {\n\n\t\t\t\tcase 1 : fLetterSpacing = 0; break;\n\t\t\t\tcase 2 : fLetterSpacing = - 1; break;\n\t\t\t\tcase 3 : fLetterSpacing = - 1.04; break;\n\t\t\t\tcase 4 :\n\t\t\t\tcase 5 : fLetterSpacing = - 2.1; break;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( strResolution == 'high' ) {\n\n\t\t\tswitch ( iScale ) {\n\n\t\t\t\tcase 1 :\n\t\t\t\tcase 2 : fLetterSpacing = 0; break;\n\t\t\t\tcase 3 :\n\t\t\t\tcase 4 :\n\t\t\t\tcase 5 : fLetterSpacing = - 1; break;\n\n\t\t\t}\n\n\t\t}\n\n\n\t\t// can't get a span or div to flow like an img element, but a table works?\n\n\n\t\t// convert img element to ascii\n\n\t\tfunction asciifyImage( oAscii ) {\n\n\t\t\toCtx.clearRect( 0, 0, iWidth, iHeight );\n\t\t\toCtx.drawImage( oCanvasImg, 0, 0, iWidth, iHeight );\n\t\t\tconst oImgData = oCtx.getImageData( 0, 0, iWidth, iHeight ).data;\n\n\t\t\t// Coloring loop starts now\n\t\t\tlet strChars = '';\n\n\t\t\tconst maxIdx = aCharList.length - 1;\n\n\t\t\t// console.time('rendering');\n\n\t\t\tfor ( let y = 0; y < iHeight; y += 2 ) {\n\n\t\t\t\tfor ( let x = 0; x < iWidth; x ++ ) {\n\n\t\t\t\t\tconst iOffset = ( y * iWidth + x ) * 4;\n\n\t\t\t\t\tconst iRed = oImgData[ iOffset ];\n\t\t\t\t\tconst iGreen = oImgData[ iOffset + 1 ];\n\t\t\t\t\tconst iBlue = oImgData[ iOffset + 2 ];\n\t\t\t\t\tconst iAlpha = oImgData[ iOffset + 3 ];\n\n\t\t\t\t\tlet fBrightness = ( 0.3 * iRed + 0.59 * iGreen + 0.11 * iBlue ) / 255;\n\t\t\t\t\t// fBrightness = (0.3*iRed + 0.5*iGreen + 0.3*iBlue) / 255;\n\n\n\t\t\t\t\tif ( iAlpha == 0 ) {\n\n\t\t\t\t\t\t// should calculate alpha instead, but quick hack :)\n\t\t\t\t\t\t//fBrightness *= (iAlpha / 255);\n\t\t\t\t\t\tfBrightness = 1;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet iCharIdx = Math.round( ( 1 - fBrightness ) * maxIdx );\n\n\t\t\t\t\tif ( bInvert ) {\n\n\t\t\t\t\t\tiCharIdx = maxIdx - iCharIdx;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// good for debugging\n\t\t\t\t\t//fBrightness = Math.floor(fBrightness * 10);\n\t\t\t\t\t//strThisChar = fBrightness;\n\n\t\t\t\t\tlet strThisChar = aCharList[ iCharIdx ];\n\n\t\t\t\t\tif ( strThisChar === undefined || strThisChar == ' ' )\n\t\t\t\t\t\tstrThisChar = '&nbsp;';\n\n\t\t\t\t\tif ( bColor ) {\n\n\t\t\t\t\t\tstrChars += '<span style=\\''\n\t\t\t\t\t\t\t+ 'color:rgb(' + iRed + ',' + iGreen + ',' + iBlue + ');'\n\t\t\t\t\t\t\t+ ( bBlock ? 'background-color:rgb(' + iRed + ',' + iGreen + ',' + iBlue + ');' : '' )\n\t\t\t\t\t\t\t+ ( bAlpha ? 'opacity:' + ( iAlpha / 255 ) + ';' : '' )\n\t\t\t\t\t\t\t+ '\\'>' + strThisChar + '</span>';\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstrChars += strThisChar;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstrChars += '<br/>';\n\n\t\t\t}\n\n\t\t\toAscii.innerHTML = `<tr><td style=\"display:block;width:${width}px;height:${height}px;overflow:hidden\">${strChars}</td></tr>`;\n\n\t\t\t// console.timeEnd('rendering');\n\n\t\t\t// return oAscii;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * This type represents configuration settings of `AsciiEffect`.\n *\n * @typedef {Object} AsciiEffect~Options\n * @property {number} [resolution=0.15] - A higher value leads to more details.\n * @property {number} [scale=1] - The scale of the effect.\n * @property {boolean} [color=false] - Whether colors should be enabled or not. Better quality but slows down rendering.\n * @property {boolean} [alpha=false] - Whether transparency should be enabled or not.\n * @property {boolean} [block=false] - Whether blocked characters should be enabled or not.\n * @property {boolean} [invert=false] - Whether colors should be inverted or not.\n * @property {('low'|'medium'|'high')} [strResolution='low'] - The string resolution.\n **/\n\nexport { AsciiEffect };\n", "import {\n\tBackSide,\n\tColor,\n\tShaderMaterial,\n\tUniformsLib,\n\tUniformsUtils\n} from 'three';\n\n/**\n * An outline effect for toon shaders.\n *\n * Note that this class can only be used with {@link WebGLRenderer}.\n * When using {@link WebGPURenderer}, use {@link ToonOutlinePassNode}.\n *\n * ```js\n * const effect = new OutlineEffect( renderer );\n *\n * function render() {\n *\n * \teffect.render( scene, camera );\n *\n * }\n * ```\n *\n * @three_import import { OutlineEffect } from 'three/addons/effects/OutlineEffect.js';\n */\nclass OutlineEffect {\n\n\t/**\n\t * Constructs a new outline effect.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {OutlineEffect~Options} [parameters] - The configuration parameter.\n\t */\n\tconstructor( renderer, parameters = {} ) {\n\n\t\tthis.enabled = true;\n\n\t\tconst defaultThickness = parameters.defaultThickness !== undefined ? parameters.defaultThickness : 0.003;\n\t\tconst defaultColor = new Color().fromArray( parameters.defaultColor !== undefined ? parameters.defaultColor : [ 0, 0, 0 ] );\n\t\tconst defaultAlpha = parameters.defaultAlpha !== undefined ? parameters.defaultAlpha : 1.0;\n\t\tconst defaultKeepAlive = parameters.defaultKeepAlive !== undefined ? parameters.defaultKeepAlive : false;\n\n\t\t// object.material.uuid -> outlineMaterial or\n\t\t// object.material[ n ].uuid -> outlineMaterial\n\t\t// save at the outline material creation and release\n\t\t// if it's unused removeThresholdCount frames\n\t\t// unless keepAlive is true.\n\t\tconst cache = {};\n\n\t\tconst removeThresholdCount = 60;\n\n\t\t// outlineMaterial.uuid -> object.material or\n\t\t// outlineMaterial.uuid -> object.material[ n ]\n\t\t// save before render and release after render.\n\t\tconst originalMaterials = {};\n\n\t\t// object.uuid -> originalOnBeforeRender\n\t\t// save before render and release after render.\n\t\tconst originalOnBeforeRenders = {};\n\n\t\t//this.cache = cache;  // for debug\n\n\t\tconst uniformsOutline = {\n\t\t\toutlineThickness: { value: defaultThickness },\n\t\t\toutlineColor: { value: defaultColor },\n\t\t\toutlineAlpha: { value: defaultAlpha }\n\t\t};\n\n\t\tconst vertexShader = [\n\t\t\t'#include <common>',\n\t\t\t'#include <uv_pars_vertex>',\n\t\t\t'#include <displacementmap_pars_vertex>',\n\t\t\t'#include <fog_pars_vertex>',\n\t\t\t'#include <morphtarget_pars_vertex>',\n\t\t\t'#include <skinning_pars_vertex>',\n\t\t\t'#include <logdepthbuf_pars_vertex>',\n\t\t\t'#include <clipping_planes_pars_vertex>',\n\n\t\t\t'uniform float outlineThickness;',\n\n\t\t\t'vec4 calculateOutline( vec4 pos, vec3 normal, vec4 skinned ) {',\n\t\t\t'\tfloat thickness = outlineThickness;',\n\t\t\t'\tconst float ratio = 1.0;', // TODO: support outline thickness ratio for each vertex\n\t\t\t'\tvec4 pos2 = projectionMatrix * modelViewMatrix * vec4( skinned.xyz + normal, 1.0 );',\n\t\t\t// NOTE: subtract pos2 from pos because BackSide objectNormal is negative\n\t\t\t'\tvec4 norm = normalize( pos - pos2 );',\n\t\t\t'\treturn pos + norm * thickness * pos.w * ratio;',\n\t\t\t'}',\n\n\t\t\t'void main() {',\n\n\t\t\t'\t#include <uv_vertex>',\n\n\t\t\t'\t#include <beginnormal_vertex>',\n\t\t\t'\t#include <morphnormal_vertex>',\n\t\t\t'\t#include <skinbase_vertex>',\n\t\t\t'\t#include <skinnormal_vertex>',\n\n\t\t\t'\t#include <begin_vertex>',\n\t\t\t'\t#include <morphtarget_vertex>',\n\t\t\t'\t#include <skinning_vertex>',\n\t\t\t'\t#include <displacementmap_vertex>',\n\t\t\t'\t#include <project_vertex>',\n\n\t\t\t'\tvec3 outlineNormal = - objectNormal;', // the outline material is always rendered with BackSide\n\n\t\t\t'\tgl_Position = calculateOutline( gl_Position, outlineNormal, vec4( transformed, 1.0 ) );',\n\n\t\t\t'\t#include <logdepthbuf_vertex>',\n\t\t\t'\t#include <clipping_planes_vertex>',\n\t\t\t'\t#include <fog_vertex>',\n\n\t\t\t'}',\n\n\t\t].join( '\\n' );\n\n\t\tconst fragmentShader = [\n\n\t\t\t'#include <common>',\n\t\t\t'#include <fog_pars_fragment>',\n\t\t\t'#include <logdepthbuf_pars_fragment>',\n\t\t\t'#include <clipping_planes_pars_fragment>',\n\n\t\t\t'uniform vec3 outlineColor;',\n\t\t\t'uniform float outlineAlpha;',\n\n\t\t\t'void main() {',\n\n\t\t\t'\t#include <clipping_planes_fragment>',\n\t\t\t'\t#include <logdepthbuf_fragment>',\n\n\t\t\t'\tgl_FragColor = vec4( outlineColor, outlineAlpha );',\n\n\t\t\t'\t#include <tonemapping_fragment>',\n\t\t\t'\t#include <colorspace_fragment>',\n\t\t\t'\t#include <fog_fragment>',\n\t\t\t'\t#include <premultiplied_alpha_fragment>',\n\n\t\t\t'}'\n\n\t\t].join( '\\n' );\n\n\t\tfunction createMaterial() {\n\n\t\t\treturn new ShaderMaterial( {\n\t\t\t\ttype: 'OutlineEffect',\n\t\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\t\tUniformsLib[ 'fog' ],\n\t\t\t\t\tUniformsLib[ 'displacementmap' ],\n\t\t\t\t\tuniformsOutline\n\t\t\t\t] ),\n\t\t\t\tvertexShader: vertexShader,\n\t\t\t\tfragmentShader: fragmentShader,\n\t\t\t\tside: BackSide\n\t\t\t} );\n\n\t\t}\n\n\t\tfunction getOutlineMaterialFromCache( originalMaterial ) {\n\n\t\t\tlet data = cache[ originalMaterial.uuid ];\n\n\t\t\tif ( data === undefined ) {\n\n\t\t\t\tdata = {\n\t\t\t\t\tmaterial: createMaterial(),\n\t\t\t\t\tused: true,\n\t\t\t\t\tkeepAlive: defaultKeepAlive,\n\t\t\t\t\tcount: 0\n\t\t\t\t};\n\n\t\t\t\tcache[ originalMaterial.uuid ] = data;\n\n\t\t\t}\n\n\t\t\tdata.used = true;\n\n\t\t\treturn data.material;\n\n\t\t}\n\n\t\tfunction getOutlineMaterial( originalMaterial ) {\n\n\t\t\tconst outlineMaterial = getOutlineMaterialFromCache( originalMaterial );\n\n\t\t\toriginalMaterials[ outlineMaterial.uuid ] = originalMaterial;\n\n\t\t\tupdateOutlineMaterial( outlineMaterial, originalMaterial );\n\n\t\t\treturn outlineMaterial;\n\n\t\t}\n\n\t\tfunction isCompatible( object ) {\n\n\t\t\tconst geometry = object.geometry;\n\t\t\tconst hasNormals = ( geometry !== undefined ) && ( geometry.attributes.normal !== undefined );\n\n\t\t\treturn ( object.isMesh === true && object.material !== undefined && hasNormals === true );\n\n\t\t}\n\n\t\tfunction setOutlineMaterial( object ) {\n\n\t\t\tif ( isCompatible( object ) === false ) return;\n\n\t\t\tif ( Array.isArray( object.material ) ) {\n\n\t\t\t\tfor ( let i = 0, il = object.material.length; i < il; i ++ ) {\n\n\t\t\t\t\tobject.material[ i ] = getOutlineMaterial( object.material[ i ] );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tobject.material = getOutlineMaterial( object.material );\n\n\t\t\t}\n\n\t\t\toriginalOnBeforeRenders[ object.uuid ] = object.onBeforeRender;\n\t\t\tobject.onBeforeRender = onBeforeRender;\n\n\t\t}\n\n\t\tfunction restoreOriginalMaterial( object ) {\n\n\t\t\tif ( isCompatible( object ) === false ) return;\n\n\t\t\tif ( Array.isArray( object.material ) ) {\n\n\t\t\t\tfor ( let i = 0, il = object.material.length; i < il; i ++ ) {\n\n\t\t\t\t\tobject.material[ i ] = originalMaterials[ object.material[ i ].uuid ];\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tobject.material = originalMaterials[ object.material.uuid ];\n\n\t\t\t}\n\n\t\t\tobject.onBeforeRender = originalOnBeforeRenders[ object.uuid ];\n\n\t\t}\n\n\t\tfunction onBeforeRender( renderer, scene, camera, geometry, material ) {\n\n\t\t\tconst originalMaterial = originalMaterials[ material.uuid ];\n\n\t\t\t// just in case\n\t\t\tif ( originalMaterial === undefined ) return;\n\n\t\t\tupdateUniforms( material, originalMaterial );\n\n\t\t}\n\n\t\tfunction updateUniforms( material, originalMaterial ) {\n\n\t\t\tconst outlineParameters = originalMaterial.userData.outlineParameters;\n\n\t\t\tmaterial.uniforms.outlineAlpha.value = originalMaterial.opacity;\n\n\t\t\tif ( outlineParameters !== undefined ) {\n\n\t\t\t\tif ( outlineParameters.thickness !== undefined ) material.uniforms.outlineThickness.value = outlineParameters.thickness;\n\t\t\t\tif ( outlineParameters.color !== undefined ) material.uniforms.outlineColor.value.fromArray( outlineParameters.color );\n\t\t\t\tif ( outlineParameters.alpha !== undefined ) material.uniforms.outlineAlpha.value = outlineParameters.alpha;\n\n\t\t\t}\n\n\t\t\tif ( originalMaterial.displacementMap ) {\n\n\t\t\t\tmaterial.uniforms.displacementMap.value = originalMaterial.displacementMap;\n\t\t\t\tmaterial.uniforms.displacementScale.value = originalMaterial.displacementScale;\n\t\t\t\tmaterial.uniforms.displacementBias.value = originalMaterial.displacementBias;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction updateOutlineMaterial( material, originalMaterial ) {\n\n\t\t\tif ( material.name === 'invisible' ) return;\n\n\t\t\tconst outlineParameters = originalMaterial.userData.outlineParameters;\n\n\t\t\tmaterial.fog = originalMaterial.fog;\n\t\t\tmaterial.toneMapped = originalMaterial.toneMapped;\n\t\t\tmaterial.premultipliedAlpha = originalMaterial.premultipliedAlpha;\n\t\t\tmaterial.displacementMap = originalMaterial.displacementMap;\n\n\t\t\tif ( outlineParameters !== undefined ) {\n\n\t\t\t\tif ( originalMaterial.visible === false ) {\n\n\t\t\t\t\tmaterial.visible = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tmaterial.visible = ( outlineParameters.visible !== undefined ) ? outlineParameters.visible : true;\n\n\t\t\t\t}\n\n\t\t\t\tmaterial.transparent = ( outlineParameters.alpha !== undefined && outlineParameters.alpha < 1.0 ) ? true : originalMaterial.transparent;\n\n\t\t\t\tif ( outlineParameters.keepAlive !== undefined ) cache[ originalMaterial.uuid ].keepAlive = outlineParameters.keepAlive;\n\n\t\t\t} else {\n\n\t\t\t\tmaterial.transparent = originalMaterial.transparent;\n\t\t\t\tmaterial.visible = originalMaterial.visible;\n\n\t\t\t}\n\n\t\t\tif ( originalMaterial.wireframe === true || originalMaterial.depthTest === false ) material.visible = false;\n\n\t\t\tif ( originalMaterial.clippingPlanes ) {\n\n\t\t\t\tmaterial.clipping = true;\n\n\t\t\t\tmaterial.clippingPlanes = originalMaterial.clippingPlanes;\n\t\t\t\tmaterial.clipIntersection = originalMaterial.clipIntersection;\n\t\t\t\tmaterial.clipShadows = originalMaterial.clipShadows;\n\n\t\t\t}\n\n\t\t\tmaterial.version = originalMaterial.version; // update outline material if necessary\n\n\t\t}\n\n\t\tfunction cleanupCache() {\n\n\t\t\tlet keys;\n\n\t\t\t// clear originalMaterials\n\t\t\tkeys = Object.keys( originalMaterials );\n\n\t\t\tfor ( let i = 0, il = keys.length; i < il; i ++ ) {\n\n\t\t\t\toriginalMaterials[ keys[ i ] ] = undefined;\n\n\t\t\t}\n\n\t\t\t// clear originalOnBeforeRenders\n\t\t\tkeys = Object.keys( originalOnBeforeRenders );\n\n\t\t\tfor ( let i = 0, il = keys.length; i < il; i ++ ) {\n\n\t\t\t\toriginalOnBeforeRenders[ keys[ i ] ] = undefined;\n\n\t\t\t}\n\n\t\t\t// remove unused outlineMaterial from cache\n\t\t\tkeys = Object.keys( cache );\n\n\t\t\tfor ( let i = 0, il = keys.length; i < il; i ++ ) {\n\n\t\t\t\tconst key = keys[ i ];\n\n\t\t\t\tif ( cache[ key ].used === false ) {\n\n\t\t\t\t\tcache[ key ].count ++;\n\n\t\t\t\t\tif ( cache[ key ].keepAlive === false && cache[ key ].count > removeThresholdCount ) {\n\n\t\t\t\t\t\tdelete cache[ key ];\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcache[ key ].used = false;\n\t\t\t\t\tcache[ key ].count = 0;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t/**\n\t\t * When using this effect, this method should be called instead of the\n\t\t * default {@link WebGLRenderer#render}.\n\t\t *\n\t\t * @param {Object3D} scene - The scene to render.\n\t\t * @param {Camera} camera - The camera.\n\t\t */\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( this.enabled === false ) {\n\n\t\t\t\trenderer.render( scene, camera );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst currentAutoClear = renderer.autoClear;\n\t\t\trenderer.autoClear = this.autoClear;\n\n\t\t\trenderer.render( scene, camera );\n\n\t\t\trenderer.autoClear = currentAutoClear;\n\n\t\t\tthis.renderOutline( scene, camera );\n\n\t\t};\n\n\t\t/**\n\t\t * This method can be used to render outlines in VR.\n\t\t *\n\t\t * ```js\n\t\t * const effect = new OutlineEffect( renderer );\n\t\t * let renderingOutline = false;\n\t\t *\n\t\t * scene.onAfterRender = function () {\n\t\t *\n\t\t * \tif ( renderingOutline ) return;\n\t\t *\n\t\t * \trenderingOutline = true;\n\t\t * \teffect.renderOutline( scene, camera );\n\t\t * \trenderingOutline = false;\n\t\t * };\n\t\t *\n\t\t * function render() {\n\t\t * \trenderer.render( scene, camera );\n\t\t * }\n\t\t * ```\n\t\t *\n\t\t * @param {Object3D} scene - The scene to render.\n\t\t * @param {Camera} camera - The camera.\n\t\t */\n\t\tthis.renderOutline = function ( scene, camera ) {\n\n\t\t\tconst currentAutoClear = renderer.autoClear;\n\t\t\tconst currentSceneAutoUpdate = scene.matrixWorldAutoUpdate;\n\t\t\tconst currentSceneBackground = scene.background;\n\t\t\tconst currentShadowMapEnabled = renderer.shadowMap.enabled;\n\n\t\t\tscene.matrixWorldAutoUpdate = false;\n\t\t\tscene.background = null;\n\t\t\trenderer.autoClear = false;\n\t\t\trenderer.shadowMap.enabled = false;\n\n\t\t\tscene.traverse( setOutlineMaterial );\n\n\t\t\trenderer.render( scene, camera );\n\n\t\t\tscene.traverse( restoreOriginalMaterial );\n\n\t\t\tcleanupCache();\n\n\t\t\tscene.matrixWorldAutoUpdate = currentSceneAutoUpdate;\n\t\t\tscene.background = currentSceneBackground;\n\t\t\trenderer.autoClear = currentAutoClear;\n\t\t\trenderer.shadowMap.enabled = currentShadowMapEnabled;\n\n\t\t};\n\n\t\t/**\n\t\t * Resizes the effect.\n\t\t *\n\t\t * @param {number} width - The width of the effect in logical pixels.\n\t\t * @param {number} height - The height of the effect in logical pixels.\n\t\t */\n\t\tthis.setSize = function ( width, height ) {\n\n\t\t\trenderer.setSize( width, height );\n\n\t\t};\n\n\t}\n\n}\n\n/**\n * This type represents configuration settings of `OutlineEffect`.\n *\n * @typedef {Object} OutlineEffect~Options\n * @property {number} [defaultThickness=0.003] - The outline thickness.\n * @property {Array<number>} [defaultColor=[0,0,0]] - The outline color.\n * @property {number} [defaultAlpha=1] - The outline alpha value.\n * @property {boolean} [defaultKeepAlive=false] - Whether to keep alive cached internal materials or not.\n **/\n\n\nexport { OutlineEffect };\n", "import {\n\tLinearFilter,\n\tNearestFilter,\n\tRGBAFormat,\n\tShaderMaterial,\n\tStereoCamera,\n\tWebGLRenderTarget\n} from 'three';\nimport { FullScreenQuad } from '../postprocessing/Pass.js';\n\n/**\n * A class that creates an parallax barrier effect.\n *\n * Note that this class can only be used with {@link WebGLRenderer}.\n * When using {@link WebGPURenderer}, use {@link ParallaxBarrierPassNode}.\n *\n * @three_import import { ParallaxBarrierEffect } from 'three/addons/effects/ParallaxBarrierEffect.js';\n */\nclass ParallaxBarrierEffect {\n\n\t/**\n\t * Constructs a new parallax barrier effect.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t */\n\tconstructor( renderer ) {\n\n\t\tconst _stereo = new StereoCamera();\n\n\t\tconst _params = { minFilter: LinearFilter, magFilter: NearestFilter, format: RGBAFormat };\n\n\t\tconst _renderTargetL = new WebGLRenderTarget( 512, 512, _params );\n\t\tconst _renderTargetR = new WebGLRenderTarget( 512, 512, _params );\n\n\t\tconst _material = new ShaderMaterial( {\n\n\t\t\tuniforms: {\n\n\t\t\t\t'mapLeft': { value: _renderTargetL.texture },\n\t\t\t\t'mapRight': { value: _renderTargetR.texture }\n\n\t\t\t},\n\n\t\t\tvertexShader: [\n\n\t\t\t\t'varying vec2 vUv;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t'\tvUv = vec2( uv.x, uv.y );',\n\t\t\t\t'\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' ),\n\n\t\t\tfragmentShader: [\n\n\t\t\t\t'uniform sampler2D mapLeft;',\n\t\t\t\t'uniform sampler2D mapRight;',\n\t\t\t\t'varying vec2 vUv;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t'\tvec2 uv = vUv;',\n\n\t\t\t\t'\tif ( ( mod( gl_FragCoord.y, 2.0 ) ) > 1.00 ) {',\n\n\t\t\t\t'\t\tgl_FragColor = texture2D( mapLeft, uv );',\n\n\t\t\t\t'\t} else {',\n\n\t\t\t\t'\t\tgl_FragColor = texture2D( mapRight, uv );',\n\n\t\t\t\t'\t}',\n\n\t\t\t\t'\t#include <tonemapping_fragment>',\n\t\t\t\t'\t#include <colorspace_fragment>',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' )\n\n\t\t} );\n\n\t\tconst _quad = new FullScreenQuad( _material );\n\n\t\t/**\n\t\t * Resizes the effect.\n\t\t *\n\t\t * @param {number} width - The width of the effect in logical pixels.\n\t\t * @param {number} height - The height of the effect in logical pixels.\n\t\t */\n\t\tthis.setSize = function ( width, height ) {\n\n\t\t\trenderer.setSize( width, height );\n\n\t\t\tconst pixelRatio = renderer.getPixelRatio();\n\n\t\t\t_renderTargetL.setSize( width * pixelRatio, height * pixelRatio );\n\t\t\t_renderTargetR.setSize( width * pixelRatio, height * pixelRatio );\n\n\t\t};\n\n\t\t/**\n\t\t * When using this effect, this method should be called instead of the\n\t\t * default {@link WebGLRenderer#render}.\n\t\t *\n\t\t * @param {Object3D} scene - The scene to render.\n\t\t * @param {Camera} camera - The camera.\n\t\t */\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\t\tif ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t\tif ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();\n\n\t\t\t_stereo.update( camera );\n\n\t\t\trenderer.setRenderTarget( _renderTargetL );\n\t\t\trenderer.clear();\n\t\t\trenderer.render( scene, _stereo.cameraL );\n\n\t\t\trenderer.setRenderTarget( _renderTargetR );\n\t\t\trenderer.clear();\n\t\t\trenderer.render( scene, _stereo.cameraR );\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\t_quad.render( renderer );\n\n\t\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t\t};\n\n\t\t/**\n\t\t * Frees internal resources. This method should be called\n\t\t * when the effect is no longer required.\n\t\t */\n\t\tthis.dispose = function () {\n\n\t\t\t_renderTargetL.dispose();\n\t\t\t_renderTargetR.dispose();\n\n\t\t\t_material.dispose();\n\t\t\t_quad.dispose();\n\n\t\t};\n\n\t}\n\n}\n\nexport { ParallaxBarrierEffect };\n", "import {\n\tStereoCamera,\n\tVector2\n} from 'three';\n\n/**\n * A class that creates an stereo effect.\n *\n * Note that this class can only be used with {@link WebGLRenderer}.\n * When using {@link WebGPURenderer}, use {@link StereoPassNode}.\n *\n * @three_import import { StereoEffect } from 'three/addons/effects/StereoEffect.js';\n */\nclass StereoEffect {\n\n\t/**\n\t * Constructs a new stereo effect.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t */\n\tconstructor( renderer ) {\n\n\t\tconst _stereo = new StereoCamera();\n\t\t_stereo.aspect = 0.5;\n\t\tconst size = new Vector2();\n\n\t\t/**\n\t\t * Sets the given eye separation.\n\t\t *\n\t\t * @param {number} eyeSep - The eye separation to set.\n\t\t */\n\t\tthis.setEyeSeparation = function ( eyeSep ) {\n\n\t\t\t_stereo.eyeSep = eyeSep;\n\n\t\t};\n\n\t\t/**\n\t\t * Resizes the effect.\n\t\t *\n\t\t * @param {number} width - The width of the effect in logical pixels.\n\t\t * @param {number} height - The height of the effect in logical pixels.\n\t\t */\n\t\tthis.setSize = function ( width, height ) {\n\n\t\t\trenderer.setSize( width, height );\n\n\t\t};\n\n\t\t/**\n\t\t * When using this effect, this method should be called instead of the\n\t\t * default {@link WebGLRenderer#render}.\n\t\t *\n\t\t * @param {Object3D} scene - The scene to render.\n\t\t * @param {Camera} camera - The camera.\n\t\t */\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();\n\n\t\t\tif ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();\n\n\t\t\t_stereo.update( camera );\n\n\t\t\tconst currentAutoClear = renderer.autoClear;\n\t\t\trenderer.getSize( size );\n\n\t\t\trenderer.autoClear = false;\n\t\t\trenderer.clear();\n\n\t\t\trenderer.setScissorTest( true );\n\n\t\t\trenderer.setScissor( 0, 0, size.width / 2, size.height );\n\t\t\trenderer.setViewport( 0, 0, size.width / 2, size.height );\n\t\t\trenderer.render( scene, _stereo.cameraL );\n\n\t\t\trenderer.setScissor( size.width / 2, 0, size.width / 2, size.height );\n\t\t\trenderer.setViewport( size.width / 2, 0, size.width / 2, size.height );\n\t\t\trenderer.render( scene, _stereo.cameraR );\n\n\t\t\trenderer.setScissorTest( false );\n\n\t\t\trenderer.autoClear = currentAutoClear;\n\n\t\t};\n\n\t}\n\n}\n\nexport { StereoEffect };\n", "import {\n\tBackSide,\n\tBoxGeometry,\n\tMesh,\n\tMeshLambertMaterial,\n\tMeshStandardMaterial,\n\tPointLight,\n\tScene,\n} from 'three';\n\n/**\n * This class represents a scene with a very basic room setup that can be used as\n * input for {@link PMREMGenerator#fromScene}. The resulting PMREM represents the room's\n * lighting and can be used for Image Based Lighting by assigning it to {@link Scene#environment}\n * or directly as an environment map to PBR materials.\n *\n * This class uses a simple room setup and should only be used for development purposes.\n * A more appropriate setup for production is {@link RoomEnvironment}.\n *\n * ```js\n * const environment = new DebugEnvironment();\n * const pmremGenerator = new THREE.PMREMGenerator( renderer );\n *\n * const envMap = pmremGenerator.fromScene( environment ).texture;\n * scene.environment = envMap;\n * ```\n *\n * @augments Scene\n * @three_import import { DebugEnvironment } from 'three/addons/environments/DebugEnvironment.js';\n */\nclass DebugEnvironment extends Scene {\n\n\t/**\n\t * Constructs a new debug environment.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tconst geometry = new BoxGeometry();\n\t\tgeometry.deleteAttribute( 'uv' );\n\t\tconst roomMaterial = new MeshStandardMaterial( { metalness: 0, side: BackSide } );\n\t\tconst room = new Mesh( geometry, roomMaterial );\n\t\troom.scale.setScalar( 10 );\n\t\tthis.add( room );\n\n\t\tconst mainLight = new PointLight( 0xffffff, 50, 0, 2 );\n\t\tthis.add( mainLight );\n\n\t\tconst material1 = new MeshLambertMaterial( { color: 0xff0000, emissive: 0xffffff, emissiveIntensity: 10 } );\n\n\t\tconst light1 = new Mesh( geometry, material1 );\n\t\tlight1.position.set( - 5, 2, 0 );\n\t\tlight1.scale.set( 0.1, 1, 1 );\n\t\tthis.add( light1 );\n\n\t\tconst material2 = new MeshLambertMaterial( { color: 0x00ff00, emissive: 0xffffff, emissiveIntensity: 10 } );\n\n\t\tconst light2 = new Mesh( geometry, material2 );\n\t\tlight2.position.set( 0, 5, 0 );\n\t\tlight2.scale.set( 1, 0.1, 1 );\n\t\tthis.add( light2 );\n\n\t\tconst material3 = new MeshLambertMaterial( { color: 0x0000ff, emissive: 0xffffff, emissiveIntensity: 10 } );\n\n\t\tconst light3 = new Mesh( geometry, material3 );\n\t\tlight3.position.set( 2, 1, 5 );\n\t\tlight3.scale.set( 1.5, 2, 0.1 );\n\t\tthis.add( light3 );\n\n\t}\n\n\t/**\n\t * Frees internal resources. This method should be called\n\t * when the environment is no longer required.\n\t */\n\tdispose() {\n\n\t\tconst resources = new Set();\n\n\t\tthis.traverse( ( object ) => {\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tresources.add( object.geometry );\n\t\t\t\tresources.add( object.material );\n\n\t\t\t}\n\n\t\t} );\n\n\t\tfor ( const resource of resources ) {\n\n\t\t\tresource.dispose();\n\n\t\t}\n\n\t}\n\n}\n\nexport { DebugEnvironment };\n", "import {\n \tBackSide,\n \tBoxGeometry,\n \tInstancedMesh,\n \tMesh,\n\tMeshLambertMaterial,\n \tMeshStandardMaterial,\n \tPointLight,\n \tScene,\n \tObject3D,\n} from 'three';\n\n/**\n * This class represents a scene with a basic room setup that can be used as\n * input for {@link PMREMGenerator#fromScene}. The resulting PMREM represents the room's\n * lighting and can be used for Image Based Lighting by assigning it to {@link Scene#environment}\n * or directly as an environment map to PBR materials.\n *\n * The implementation is based on the [EnvironmentScene](https://github.com/google/model-viewer/blob/master/packages/model-viewer/src/three-components/EnvironmentScene.ts)\n * component from the `model-viewer` project.\n *\n * ```js\n * const environment = new RoomEnvironment();\n * const pmremGenerator = new THREE.PMREMGenerator( renderer );\n *\n * const envMap = pmremGenerator.fromScene( environment ).texture;\n * scene.environment = envMap;\n * ```\n *\n * @augments Scene\n * @three_import import { RoomEnvironment } from 'three/addons/environments/RoomEnvironment.js';\n */\nclass RoomEnvironment extends Scene {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.name = 'RoomEnvironment';\n\n\t\tconst geometry = new BoxGeometry();\n\t\tgeometry.deleteAttribute( 'uv' );\n\n\t\tconst roomMaterial = new MeshStandardMaterial( { side: BackSide } );\n\t\tconst boxMaterial = new MeshStandardMaterial();\n\n\t\tconst mainLight = new PointLight( 0xffffff, 900, 28, 2 );\n\t\tmainLight.position.set( 0.418, 16.199, 0.300 );\n\t\tthis.add( mainLight );\n\n\t\tconst room = new Mesh( geometry, roomMaterial );\n\t\troom.position.set( - 0.757, 13.219, 0.717 );\n\t\troom.scale.set( 31.713, 28.305, 28.591 );\n\t\tthis.add( room );\n\n\t\tconst boxes = new InstancedMesh( geometry, boxMaterial, 6 );\n\t\tconst transform = new Object3D();\n\n\t\t// box1\n\t\ttransform.position.set( - 10.906, 2.009, 1.846 );\n\t\ttransform.rotation.set( 0, - 0.195, 0 );\n\t\ttransform.scale.set( 2.328, 7.905, 4.651 );\n\t\ttransform.updateMatrix();\n\t\tboxes.setMatrixAt( 0, transform.matrix );\n\n\t\t// box2\n\t\ttransform.position.set( - 5.607, - 0.754, - 0.758 );\n\t\ttransform.rotation.set( 0, 0.994, 0 );\n\t\ttransform.scale.set( 1.970, 1.534, 3.955 );\n\t\ttransform.updateMatrix();\n\t\tboxes.setMatrixAt( 1, transform.matrix );\n\n\t\t// box3\n\t\ttransform.position.set( 6.167, 0.857, 7.803 );\n\t\ttransform.rotation.set( 0, 0.561, 0 );\n\t\ttransform.scale.set( 3.927, 6.285, 3.687 );\n\t\ttransform.updateMatrix();\n\t\tboxes.setMatrixAt( 2, transform.matrix );\n\n\t\t// box4\n\t\ttransform.position.set( - 2.017, 0.018, 6.124 );\n\t\ttransform.rotation.set( 0, 0.333, 0 );\n\t\ttransform.scale.set( 2.002, 4.566, 2.064 );\n\t\ttransform.updateMatrix();\n\t\tboxes.setMatrixAt( 3, transform.matrix );\n\n\t\t// box5\n\t\ttransform.position.set( 2.291, - 0.756, - 2.621 );\n\t\ttransform.rotation.set( 0, - 0.286, 0 );\n\t\ttransform.scale.set( 1.546, 1.552, 1.496 );\n\t\ttransform.updateMatrix();\n\t\tboxes.setMatrixAt( 4, transform.matrix );\n\n\t\t// box6\n\t\ttransform.position.set( - 2.193, - 0.369, - 5.547 );\n\t\ttransform.rotation.set( 0, 0.516, 0 );\n\t\ttransform.scale.set( 3.875, 3.487, 2.986 );\n\t\ttransform.updateMatrix();\n\t\tboxes.setMatrixAt( 5, transform.matrix );\n\n\t\tthis.add( boxes );\n\n\n\t\t// -x right\n\t\tconst light1 = new Mesh( geometry, createAreaLightMaterial( 50 ) );\n\t\tlight1.position.set( - 16.116, 14.37, 8.208 );\n\t\tlight1.scale.set( 0.1, 2.428, 2.739 );\n\t\tthis.add( light1 );\n\n\t\t// -x left\n\t\tconst light2 = new Mesh( geometry, createAreaLightMaterial( 50 ) );\n\t\tlight2.position.set( - 16.109, 18.021, - 8.207 );\n\t\tlight2.scale.set( 0.1, 2.425, 2.751 );\n\t\tthis.add( light2 );\n\n\t\t// +x\n\t\tconst light3 = new Mesh( geometry, createAreaLightMaterial( 17 ) );\n\t\tlight3.position.set( 14.904, 12.198, - 1.832 );\n\t\tlight3.scale.set( 0.15, 4.265, 6.331 );\n\t\tthis.add( light3 );\n\n\t\t// +z\n\t\tconst light4 = new Mesh( geometry, createAreaLightMaterial( 43 ) );\n\t\tlight4.position.set( - 0.462, 8.89, 14.520 );\n\t\tlight4.scale.set( 4.38, 5.441, 0.088 );\n\t\tthis.add( light4 );\n\n\t\t// -z\n\t\tconst light5 = new Mesh( geometry, createAreaLightMaterial( 20 ) );\n\t\tlight5.position.set( 3.235, 11.486, - 12.541 );\n\t\tlight5.scale.set( 2.5, 2.0, 0.1 );\n\t\tthis.add( light5 );\n\n\t\t// +y\n\t\tconst light6 = new Mesh( geometry, createAreaLightMaterial( 100 ) );\n\t\tlight6.position.set( 0.0, 20.0, 0.0 );\n\t\tlight6.scale.set( 1.0, 0.1, 1.0 );\n\t\tthis.add( light6 );\n\n\t}\n\n\t/**\n\t * Frees internal resources. This method should be called\n\t * when the environment is no longer required.\n\t */\n\tdispose() {\n\n\t\tconst resources = new Set();\n\n\t\tthis.traverse( ( object ) => {\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tresources.add( object.geometry );\n\t\t\t\tresources.add( object.material );\n\n\t\t\t}\n\n\t\t} );\n\n\t\tfor ( const resource of resources ) {\n\n\t\t\tresource.dispose();\n\n\t\t}\n\n\t}\n\n}\n\nfunction createAreaLightMaterial( intensity ) {\n\n\t// create an emissive-only material. see #31348\n\tconst material = new MeshLambertMaterial( {\n\t\tcolor: 0x000000,\n\t\temissive: 0xffffff,\n\t\temissiveIntensity: intensity\n\t} );\n\n\treturn material;\n\n}\n\nexport { RoomEnvironment };\n", "import { Color, ColorManagement, SRGBColorSpace } from 'three';\n\n/* global DracoEncoderModule */\n\n/**\n * An exporter to compress geometry with the Draco library.\n *\n * [Draco](https://google.github.io/draco/) is an open source library for compressing and\n * decompressing 3D meshes and point clouds. Compressed geometry can be significantly smaller,\n * at the cost of additional decoding time on the client device.\n *\n * Standalone Draco files have a `.drc` extension, and contain vertex positions,\n * normals, colors, and other attributes. Draco files *do not* contain materials,\n * textures, animation, or node hierarchies \u2013 to use these features, embed Draco geometry\n * inside of a glTF file. A normal glTF file can be converted to a Draco-compressed glTF file\n * using [glTF-Pipeline](https://github.com/AnalyticalGraphicsInc/gltf-pipeline).\n *\n * ```js\n * const exporter = new DRACOExporter();\n * const data = exporter.parse( mesh, options );\n * ```\n *\n * @three_import import { DRACOExporter } from 'three/addons/exporters/DRACOExporter.js';\n */\nclass DRACOExporter {\n\n\t/**\n\t * Parses the given mesh or point cloud and generates the Draco output.\n\t *\n\t * @param {(Mesh|Points)} object - The mesh or point cloud to export.\n\t * @param {DRACOExporter~Options} options - The export options.\n\t * @return {Int8Array} The exported Draco.\n\t */\n\tparse( object, options = {} ) {\n\n\t\toptions = Object.assign( {\n\t\t\tdecodeSpeed: 5,\n\t\t\tencodeSpeed: 5,\n\t\t\tencoderMethod: DRACOExporter.MESH_EDGEBREAKER_ENCODING,\n\t\t\tquantization: [ 16, 8, 8, 8, 8 ],\n\t\t\texportUvs: true,\n\t\t\texportNormals: true,\n\t\t\texportColor: false,\n\t\t}, options );\n\n\t\tif ( DracoEncoderModule === undefined ) {\n\n\t\t\tthrow new Error( 'THREE.DRACOExporter: required the draco_encoder to work.' );\n\n\t\t}\n\n\t\tconst geometry = object.geometry;\n\n\t\tconst dracoEncoder = DracoEncoderModule();\n\t\tconst encoder = new dracoEncoder.Encoder();\n\t\tlet builder;\n\t\tlet dracoObject;\n\n\t\tif ( object.isMesh === true ) {\n\n\t\t\tbuilder = new dracoEncoder.MeshBuilder();\n\t\t\tdracoObject = new dracoEncoder.Mesh();\n\n\t\t\tconst vertices = geometry.getAttribute( 'position' );\n\t\t\tbuilder.AddFloatAttributeToMesh( dracoObject, dracoEncoder.POSITION, vertices.count, vertices.itemSize, vertices.array );\n\n\t\t\tconst faces = geometry.getIndex();\n\n\t\t\tif ( faces !== null ) {\n\n\t\t\t\tbuilder.AddFacesToMesh( dracoObject, faces.count / 3, faces.array );\n\n\t\t\t} else {\n\n\t\t\t\tconst faces = new ( vertices.count > 65535 ? Uint32Array : Uint16Array )( vertices.count );\n\n\t\t\t\tfor ( let i = 0; i < faces.length; i ++ ) {\n\n\t\t\t\t\tfaces[ i ] = i;\n\n\t\t\t\t}\n\n\t\t\t\tbuilder.AddFacesToMesh( dracoObject, vertices.count, faces );\n\n\t\t\t}\n\n\t\t\tif ( options.exportNormals === true ) {\n\n\t\t\t\tconst normals = geometry.getAttribute( 'normal' );\n\n\t\t\t\tif ( normals !== undefined ) {\n\n\t\t\t\t\tbuilder.AddFloatAttributeToMesh( dracoObject, dracoEncoder.NORMAL, normals.count, normals.itemSize, normals.array );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( options.exportUvs === true ) {\n\n\t\t\t\tconst uvs = geometry.getAttribute( 'uv' );\n\n\t\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\t\tbuilder.AddFloatAttributeToMesh( dracoObject, dracoEncoder.TEX_COORD, uvs.count, uvs.itemSize, uvs.array );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( options.exportColor === true ) {\n\n\t\t\t\tconst colors = geometry.getAttribute( 'color' );\n\n\t\t\t\tif ( colors !== undefined ) {\n\n\t\t\t\t\tconst array = createVertexColorSRGBArray( colors );\n\n\t\t\t\t\tbuilder.AddFloatAttributeToMesh( dracoObject, dracoEncoder.COLOR, colors.count, colors.itemSize, array );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( object.isPoints === true ) {\n\n\t\t\tbuilder = new dracoEncoder.PointCloudBuilder();\n\t\t\tdracoObject = new dracoEncoder.PointCloud();\n\n\t\t\tconst vertices = geometry.getAttribute( 'position' );\n\t\t\tbuilder.AddFloatAttribute( dracoObject, dracoEncoder.POSITION, vertices.count, vertices.itemSize, vertices.array );\n\n\t\t\tif ( options.exportColor === true ) {\n\n\t\t\t\tconst colors = geometry.getAttribute( 'color' );\n\n\t\t\t\tif ( colors !== undefined ) {\n\n\t\t\t\t\tconst array = createVertexColorSRGBArray( colors );\n\n\t\t\t\t\tbuilder.AddFloatAttribute( dracoObject, dracoEncoder.COLOR, colors.count, colors.itemSize, array );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'DRACOExporter: Unsupported object type.' );\n\n\t\t}\n\n\t\t//Compress using draco encoder\n\n\t\tconst encodedData = new dracoEncoder.DracoInt8Array();\n\n\t\t//Sets the desired encoding and decoding speed for the given options from 0 (slowest speed, but the best compression) to 10 (fastest, but the worst compression).\n\n\t\tconst encodeSpeed = ( options.encodeSpeed !== undefined ) ? options.encodeSpeed : 5;\n\t\tconst decodeSpeed = ( options.decodeSpeed !== undefined ) ? options.decodeSpeed : 5;\n\n\t\tencoder.SetSpeedOptions( encodeSpeed, decodeSpeed );\n\n\t\t// Sets the desired encoding method for a given geometry.\n\n\t\tif ( options.encoderMethod !== undefined ) {\n\n\t\t\tencoder.SetEncodingMethod( options.encoderMethod );\n\n\t\t}\n\n\t\t// Sets the quantization (number of bits used to represent) compression options for a named attribute.\n\t\t// The attribute values will be quantized in a box defined by the maximum extent of the attribute values.\n\t\tif ( options.quantization !== undefined ) {\n\n\t\t\tfor ( let i = 0; i < 5; i ++ ) {\n\n\t\t\t\tif ( options.quantization[ i ] !== undefined ) {\n\n\t\t\t\t\tencoder.SetAttributeQuantization( i, options.quantization[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet length;\n\n\t\tif ( object.isMesh === true ) {\n\n\t\t\tlength = encoder.EncodeMeshToDracoBuffer( dracoObject, encodedData );\n\n\t\t} else {\n\n\t\t\tlength = encoder.EncodePointCloudToDracoBuffer( dracoObject, true, encodedData );\n\n\t\t}\n\n\t\tdracoEncoder.destroy( dracoObject );\n\n\t\tif ( length === 0 ) {\n\n\t\t\tthrow new Error( 'THREE.DRACOExporter: Draco encoding failed.' );\n\n\t\t}\n\n\t\t//Copy encoded data to buffer.\n\t\tconst outputData = new Int8Array( new ArrayBuffer( length ) );\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\toutputData[ i ] = encodedData.GetValue( i );\n\n\t\t}\n\n\t\tdracoEncoder.destroy( encodedData );\n\t\tdracoEncoder.destroy( encoder );\n\t\tdracoEncoder.destroy( builder );\n\n\t\treturn outputData;\n\n\t}\n\n}\n\nfunction createVertexColorSRGBArray( attribute ) {\n\n\t// While .drc files do not specify colorspace, the only 'official' tooling\n\t// is PLY and OBJ converters, which use sRGB. We'll assume sRGB is expected\n\t// for .drc files, but note that Draco buffers embedded in glTF files will\n\t// be Linear-sRGB instead.\n\n\tconst _color = new Color();\n\n\tconst count = attribute.count;\n\tconst itemSize = attribute.itemSize;\n\tconst array = new Float32Array( count * itemSize );\n\n\tfor ( let i = 0, il = count; i < il; i ++ ) {\n\n\t\t_color.fromBufferAttribute( attribute, i );\n\n\t\tColorManagement.workingToColorSpace( _color, SRGBColorSpace );\n\n\t\tarray[ i * itemSize ] = _color.r;\n\t\tarray[ i * itemSize + 1 ] = _color.g;\n\t\tarray[ i * itemSize + 2 ] = _color.b;\n\n\t\tif ( itemSize === 4 ) {\n\n\t\t\tarray[ i * itemSize + 3 ] = attribute.getW( i );\n\n\t\t}\n\n\t}\n\n\treturn array;\n\n}\n\n// Encoder methods\n\n/**\n * Edgebreaker encoding.\n *\n * @static\n * @constant\n * @type {number}\n * @default 1\n */\nDRACOExporter.MESH_EDGEBREAKER_ENCODING = 1;\n\n/**\n * Sequential encoding.\n *\n * @static\n * @constant\n * @type {number}\n * @default 0\n */\nDRACOExporter.MESH_SEQUENTIAL_ENCODING = 0;\n\n// Geometry type\n\nDRACOExporter.POINT_CLOUD = 0;\nDRACOExporter.TRIANGULAR_MESH = 1;\n\n// Attribute type\n\nDRACOExporter.INVALID = - 1;\nDRACOExporter.POSITION = 0;\nDRACOExporter.NORMAL = 1;\nDRACOExporter.COLOR = 2;\nDRACOExporter.TEX_COORD = 3;\nDRACOExporter.GENERIC = 4;\n\n/**\n * Export options of `DRACOExporter`.\n *\n * @typedef {Object} DRACOExporter~Options\n * @property {number} [decodeSpeed=5] - Indicates how to tune the encoder regarding decode speed (0 gives better speed but worst quality).\n * @property {number} [encodeSpeed=5] - Indicates how to tune the encoder parameters (0 gives better speed but worst quality).\n * @property {number} [encoderMethod=1] - Either sequential (very little compression) or Edgebreaker. Edgebreaker traverses the triangles of the mesh in a deterministic, spiral-like way which provides most of the benefits of this data format.\n * @property {Array<number>} [quantization=[ 16, 8, 8, 8, 8 ]] - Indicates the precision of each type of data stored in the draco file in the order (POSITION, NORMAL, COLOR, TEX_COORD, GENERIC).\n * @property {boolean} [exportUvs=true] - Whether to export UVs or not.\n * @property {boolean} [exportNormals=true] - Whether to export normals or not.\n * @property {boolean} [exportColor=false] - Whether to export colors or not.\n **/\n\nexport { DRACOExporter };\n", "import {\n\tFloatType,\n\tHalfFloatType,\n\tRGBAFormat,\n\tDataUtils,\n} from 'three';\nimport * as fflate from '../libs/fflate.module.js';\n\nconst textEncoder = new TextEncoder();\n\nconst NO_COMPRESSION = 0;\nconst ZIPS_COMPRESSION = 2;\nconst ZIP_COMPRESSION = 3;\n\n/**\n * An exporter for EXR.\n *\n * EXR ( Extended Dynamic Range) is an [open format specification](https://github.com/AcademySoftwareFoundation/openexr)\n * for professional-grade image storage format of the motion picture industry. The purpose of\n * format is to accurately and efficiently represent high-dynamic-range scene-linear image data\n * and associated metadata. The library is widely used in host application software where accuracy\n * is critical, such as photorealistic rendering, texture access, image compositing, deep compositing,\n * and DI.\n *\n * ```js\n * const exporter = new EXRExporter();\n * const result = await exporter.parse( renderer, options );\n * ```\n *\n * @three_import import { EXRExporter } from 'three/addons/exporters/EXRExporter.js';\n */\nclass EXRExporter {\n\n\t/**\n\t * This method has two variants.\n\t *\n\t * - When exporting a data texture, it receives two parameters. The texture and the exporter options.\n\t * - When exporting a render target (e.g. a PMREM), it receives three parameters. The renderer, the\n\t * render target and the exporter options.\n\t *\n\t * @async\n\t * @param {(DataTexture|WebGPURenderer|WebGLRenderer)} arg1 - The data texture to export or a renderer.\n\t * @param {(EXRExporter~Options|RenderTarget)} arg2 - The exporter options or a render target.\n\t * @param {EXRExporter~Options} [arg3] - The exporter options.\n\t * @return {Promise<Uint8Array>} A Promise that resolves with the exported EXR.\n\t */\n\tasync parse( arg1, arg2, arg3 ) {\n\n\t\tif ( ! arg1 || ! ( arg1.isWebGLRenderer || arg1.isWebGPURenderer || arg1.isDataTexture ) ) {\n\n\t\t\tthrow Error( 'EXRExporter.parse: Unsupported first parameter, expected instance of WebGLRenderer, WebGPURenderer or DataTexture.' );\n\n\t\t} else if ( arg1.isWebGLRenderer || arg1.isWebGPURenderer ) {\n\n\t\t\tconst renderer = arg1, renderTarget = arg2, options = arg3;\n\n\t\t\tsupportedRTT( renderTarget );\n\n\t\t\tconst info = buildInfoRTT( renderTarget, options ),\n\t\t\t\tdataBuffer = await getPixelData( renderer, renderTarget, info ),\n\t\t\t\trawContentBuffer = reorganizeDataBuffer( dataBuffer, info ),\n\t\t\t\tchunks = compressData( rawContentBuffer, info );\n\n\t\t\treturn fillData( chunks, info );\n\n\t\t} else if ( arg1.isDataTexture ) {\n\n\t\t\tconst texture = arg1, options = arg2;\n\n\t\t\tsupportedDT( texture );\n\n\t\t\tconst info = buildInfoDT( texture, options ),\n\t\t\t\tdataBuffer = texture.image.data,\n\t\t\t\trawContentBuffer = reorganizeDataBuffer( dataBuffer, info ),\n\t\t\t\tchunks = compressData( rawContentBuffer, info );\n\n\t\t\treturn fillData( chunks, info );\n\n\t\t}\n\n\t}\n\n}\n\nfunction supportedRTT( renderTarget ) {\n\n\tif ( ! renderTarget || ! renderTarget.isRenderTarget ) {\n\n\t\tthrow Error( 'EXRExporter.parse: Unsupported second parameter, expected instance of WebGLRenderTarget.' );\n\n\t}\n\n\tif ( renderTarget.isWebGLCubeRenderTarget || renderTarget.isWebGL3DRenderTarget || renderTarget.isWebGLArrayRenderTarget ) {\n\n\t\tthrow Error( 'EXRExporter.parse: Unsupported render target type, expected instance of WebGLRenderTarget.' );\n\n\t}\n\n\tif ( renderTarget.texture.type !== FloatType && renderTarget.texture.type !== HalfFloatType ) {\n\n\t\tthrow Error( 'EXRExporter.parse: Unsupported WebGLRenderTarget texture type.' );\n\n\t}\n\n\tif ( renderTarget.texture.format !== RGBAFormat ) {\n\n\t\tthrow Error( 'EXRExporter.parse: Unsupported WebGLRenderTarget texture format, expected RGBAFormat.' );\n\n\t}\n\n}\n\nfunction supportedDT( texture ) {\n\n\tif ( texture.type !== FloatType && texture.type !== HalfFloatType ) {\n\n\t\tthrow Error( 'EXRExporter.parse: Unsupported DataTexture texture type.' );\n\n\t}\n\n\tif ( texture.format !== RGBAFormat ) {\n\n\t\tthrow Error( 'EXRExporter.parse: Unsupported DataTexture texture format, expected RGBAFormat.' );\n\n\t}\n\n\tif ( ! texture.image.data ) {\n\n\t\tthrow Error( 'EXRExporter.parse: Invalid DataTexture image data.' );\n\n\t}\n\n\tif ( texture.type === FloatType && texture.image.data.constructor.name !== 'Float32Array' ) {\n\n\t\tthrow Error( 'EXRExporter.parse: DataTexture image data doesn\\'t match type, expected \\'Float32Array\\'.' );\n\n\t}\n\n\tif ( texture.type === HalfFloatType && texture.image.data.constructor.name !== 'Uint16Array' ) {\n\n\t\tthrow Error( 'EXRExporter.parse: DataTexture image data doesn\\'t match type, expected \\'Uint16Array\\'.' );\n\n\t}\n\n}\n\nfunction buildInfoRTT( renderTarget, options = {} ) {\n\n\tconst compressionSizes = {\n\t\t0: 1,\n\t\t2: 1,\n\t\t3: 16\n\t};\n\n\tconst WIDTH = renderTarget.width,\n\t\tHEIGHT = renderTarget.height,\n\t\tTYPE = renderTarget.texture.type,\n\t\tFORMAT = renderTarget.texture.format,\n\t\tCOMPRESSION = ( options.compression !== undefined ) ? options.compression : ZIP_COMPRESSION,\n\t\tEXPORTER_TYPE = ( options.type !== undefined ) ? options.type : HalfFloatType,\n\t\tOUT_TYPE = ( EXPORTER_TYPE === FloatType ) ? 2 : 1,\n\t\tCOMPRESSION_SIZE = compressionSizes[ COMPRESSION ],\n\t\tNUM_CHANNELS = 4;\n\n\treturn {\n\t\twidth: WIDTH,\n\t\theight: HEIGHT,\n\t\ttype: TYPE,\n\t\tformat: FORMAT,\n\t\tcompression: COMPRESSION,\n\t\tblockLines: COMPRESSION_SIZE,\n\t\tdataType: OUT_TYPE,\n\t\tdataSize: 2 * OUT_TYPE,\n\t\tnumBlocks: Math.ceil( HEIGHT / COMPRESSION_SIZE ),\n\t\tnumInputChannels: 4,\n\t\tnumOutputChannels: NUM_CHANNELS,\n\t};\n\n}\n\nfunction buildInfoDT( texture, options = {} ) {\n\n\tconst compressionSizes = {\n\t\t0: 1,\n\t\t2: 1,\n\t\t3: 16\n\t};\n\n\tconst WIDTH = texture.image.width,\n\t\tHEIGHT = texture.image.height,\n\t\tTYPE = texture.type,\n\t\tFORMAT = texture.format,\n\t\tCOMPRESSION = ( options.compression !== undefined ) ? options.compression : ZIP_COMPRESSION,\n\t\tEXPORTER_TYPE = ( options.type !== undefined ) ? options.type : HalfFloatType,\n\t\tOUT_TYPE = ( EXPORTER_TYPE === FloatType ) ? 2 : 1,\n\t\tCOMPRESSION_SIZE = compressionSizes[ COMPRESSION ],\n\t\tNUM_CHANNELS = 4;\n\n\treturn {\n\t\twidth: WIDTH,\n\t\theight: HEIGHT,\n\t\ttype: TYPE,\n\t\tformat: FORMAT,\n\t\tcompression: COMPRESSION,\n\t\tblockLines: COMPRESSION_SIZE,\n\t\tdataType: OUT_TYPE,\n\t\tdataSize: 2 * OUT_TYPE,\n\t\tnumBlocks: Math.ceil( HEIGHT / COMPRESSION_SIZE ),\n\t\tnumInputChannels: 4,\n\t\tnumOutputChannels: NUM_CHANNELS,\n\t};\n\n}\n\nasync function getPixelData( renderer, rtt, info ) {\n\n\tlet dataBuffer;\n\n\tif ( renderer.isWebGLRenderer ) {\n\n\t\tif ( info.type === FloatType ) {\n\n\t\t\tdataBuffer = new Float32Array( info.width * info.height * info.numInputChannels );\n\n\t\t} else {\n\n\t\t\tdataBuffer = new Uint16Array( info.width * info.height * info.numInputChannels );\n\n\t\t}\n\n\t\tawait renderer.readRenderTargetPixelsAsync( rtt, 0, 0, info.width, info.height, dataBuffer );\n\n\t} else {\n\n\t\tdataBuffer = await renderer.readRenderTargetPixelsAsync( rtt, 0, 0, info.width, info.height );\n\n\t}\n\n\treturn dataBuffer;\n\n}\n\nfunction reorganizeDataBuffer( inBuffer, info ) {\n\n\tconst w = info.width,\n\t\th = info.height,\n\t\tdec = { r: 0, g: 0, b: 0, a: 0 },\n\t\toffset = { value: 0 },\n\t\tcOffset = ( info.numOutputChannels == 4 ) ? 1 : 0,\n\t\tgetValue = ( info.type == FloatType ) ? getFloat32 : getFloat16,\n\t\tsetValue = ( info.dataType == 1 ) ? setFloat16 : setFloat32,\n\t\toutBuffer = new Uint8Array( info.width * info.height * info.numOutputChannels * info.dataSize ),\n\t\tdv = new DataView( outBuffer.buffer );\n\n\tfor ( let y = 0; y < h; ++ y ) {\n\n\t\tfor ( let x = 0; x < w; ++ x ) {\n\n\t\t\tconst i = y * w * 4 + x * 4;\n\n\t\t\tconst r = getValue( inBuffer, i );\n\t\t\tconst g = getValue( inBuffer, i + 1 );\n\t\t\tconst b = getValue( inBuffer, i + 2 );\n\t\t\tconst a = getValue( inBuffer, i + 3 );\n\n\t\t\tconst line = ( h - y - 1 ) * w * ( 3 + cOffset ) * info.dataSize;\n\n\t\t\tdecodeLinear( dec, r, g, b, a );\n\n\t\t\toffset.value = line + x * info.dataSize;\n\t\t\tsetValue( dv, dec.a, offset );\n\n\t\t\toffset.value = line + ( cOffset ) * w * info.dataSize + x * info.dataSize;\n\t\t\tsetValue( dv, dec.b, offset );\n\n\t\t\toffset.value = line + ( 1 + cOffset ) * w * info.dataSize + x * info.dataSize;\n\t\t\tsetValue( dv, dec.g, offset );\n\n\t\t\toffset.value = line + ( 2 + cOffset ) * w * info.dataSize + x * info.dataSize;\n\t\t\tsetValue( dv, dec.r, offset );\n\n\t\t}\n\n\t}\n\n\treturn outBuffer;\n\n}\n\nfunction compressData( inBuffer, info ) {\n\n\tlet compress,\n\t\ttmpBuffer,\n\t\tsum = 0;\n\n\tconst chunks = { data: new Array(), totalSize: 0 },\n\t\tsize = info.width * info.numOutputChannels * info.blockLines * info.dataSize;\n\n\tswitch ( info.compression ) {\n\n\t\tcase 0:\n\t\t\tcompress = compressNONE;\n\t\t\tbreak;\n\n\t\tcase 2:\n\t\tcase 3:\n\t\t\tcompress = compressZIP;\n\t\t\tbreak;\n\n\t}\n\n\tif ( info.compression !== 0 ) {\n\n\t\ttmpBuffer = new Uint8Array( size );\n\n\t}\n\n\tfor ( let i = 0; i < info.numBlocks; ++ i ) {\n\n\t\tconst arr = inBuffer.subarray( size * i, size * ( i + 1 ) );\n\n\t\tconst block = compress( arr, tmpBuffer );\n\n\t\tsum += block.length;\n\n\t\tchunks.data.push( { dataChunk: block, size: block.length } );\n\n\t}\n\n\tchunks.totalSize = sum;\n\n\treturn chunks;\n\n}\n\nfunction compressNONE( data ) {\n\n\treturn data;\n\n}\n\nfunction compressZIP( data, tmpBuffer ) {\n\n\t//\n\t// Reorder the pixel data.\n\t//\n\n\tlet t1 = 0,\n\t\tt2 = Math.floor( ( data.length + 1 ) / 2 ),\n\t\ts = 0;\n\n\tconst stop = data.length - 1;\n\n\twhile ( true ) {\n\n\t\tif ( s > stop ) break;\n\t\ttmpBuffer[ t1 ++ ] = data[ s ++ ];\n\n\t\tif ( s > stop ) break;\n\t\ttmpBuffer[ t2 ++ ] = data[ s ++ ];\n\n\t}\n\n\t//\n\t// Predictor.\n\t//\n\n\tlet p = tmpBuffer[ 0 ];\n\n\tfor ( let t = 1; t < tmpBuffer.length; t ++ ) {\n\n\t\tconst d = tmpBuffer[ t ] - p + ( 128 + 256 );\n\t\tp = tmpBuffer[ t ];\n\t\ttmpBuffer[ t ] = d;\n\n\t}\n\n\tconst deflate = fflate.zlibSync( tmpBuffer );\n\n\treturn deflate;\n\n}\n\nfunction fillHeader( outBuffer, chunks, info ) {\n\n\tconst offset = { value: 0 };\n\tconst dv = new DataView( outBuffer.buffer );\n\n\tsetUint32( dv, 20000630, offset ); // magic\n\tsetUint32( dv, 2, offset ); // mask\n\n\t// = HEADER =\n\n\tsetString( dv, 'compression', offset );\n\tsetString( dv, 'compression', offset );\n\tsetUint32( dv, 1, offset );\n\tsetUint8( dv, info.compression, offset );\n\n\tsetString( dv, 'screenWindowCenter', offset );\n\tsetString( dv, 'v2f', offset );\n\tsetUint32( dv, 8, offset );\n\tsetUint32( dv, 0, offset );\n\tsetUint32( dv, 0, offset );\n\n\tsetString( dv, 'screenWindowWidth', offset );\n\tsetString( dv, 'float', offset );\n\tsetUint32( dv, 4, offset );\n\tsetFloat32( dv, 1.0, offset );\n\n\tsetString( dv, 'pixelAspectRatio', offset );\n\tsetString( dv, 'float', offset );\n\tsetUint32( dv, 4, offset );\n\tsetFloat32( dv, 1.0, offset );\n\n\tsetString( dv, 'lineOrder', offset );\n\tsetString( dv, 'lineOrder', offset );\n\tsetUint32( dv, 1, offset );\n\tsetUint8( dv, 0, offset );\n\n\tsetString( dv, 'dataWindow', offset );\n\tsetString( dv, 'box2i', offset );\n\tsetUint32( dv, 16, offset );\n\tsetUint32( dv, 0, offset );\n\tsetUint32( dv, 0, offset );\n\tsetUint32( dv, info.width - 1, offset );\n\tsetUint32( dv, info.height - 1, offset );\n\n\tsetString( dv, 'displayWindow', offset );\n\tsetString( dv, 'box2i', offset );\n\tsetUint32( dv, 16, offset );\n\tsetUint32( dv, 0, offset );\n\tsetUint32( dv, 0, offset );\n\tsetUint32( dv, info.width - 1, offset );\n\tsetUint32( dv, info.height - 1, offset );\n\n\tsetString( dv, 'channels', offset );\n\tsetString( dv, 'chlist', offset );\n\tsetUint32( dv, info.numOutputChannels * 18 + 1, offset );\n\n\tsetString( dv, 'A', offset );\n\tsetUint32( dv, info.dataType, offset );\n\toffset.value += 4;\n\tsetUint32( dv, 1, offset );\n\tsetUint32( dv, 1, offset );\n\n\tsetString( dv, 'B', offset );\n\tsetUint32( dv, info.dataType, offset );\n\toffset.value += 4;\n\tsetUint32( dv, 1, offset );\n\tsetUint32( dv, 1, offset );\n\n\tsetString( dv, 'G', offset );\n\tsetUint32( dv, info.dataType, offset );\n\toffset.value += 4;\n\tsetUint32( dv, 1, offset );\n\tsetUint32( dv, 1, offset );\n\n\tsetString( dv, 'R', offset );\n\tsetUint32( dv, info.dataType, offset );\n\toffset.value += 4;\n\tsetUint32( dv, 1, offset );\n\tsetUint32( dv, 1, offset );\n\n\tsetUint8( dv, 0, offset );\n\n\t// null-byte\n\tsetUint8( dv, 0, offset );\n\n\t// = OFFSET TABLE =\n\n\tlet sum = offset.value + info.numBlocks * 8;\n\n\tfor ( let i = 0; i < chunks.data.length; ++ i ) {\n\n\t\tsetUint64( dv, sum, offset );\n\n\t\tsum += chunks.data[ i ].size + 8;\n\n\t}\n\n}\n\nfunction fillData( chunks, info ) {\n\n\tconst TableSize = info.numBlocks * 8,\n\t\tHeaderSize = 259 + ( 18 * info.numOutputChannels ), // 259 + 18 * chlist\n\t\toffset = { value: HeaderSize + TableSize },\n\t\toutBuffer = new Uint8Array( HeaderSize + TableSize + chunks.totalSize + info.numBlocks * 8 ),\n\t\tdv = new DataView( outBuffer.buffer );\n\n\tfillHeader( outBuffer, chunks, info );\n\n\tfor ( let i = 0; i < chunks.data.length; ++ i ) {\n\n\t\tconst data = chunks.data[ i ].dataChunk;\n\t\tconst size = chunks.data[ i ].size;\n\n\t\tsetUint32( dv, i * info.blockLines, offset );\n\t\tsetUint32( dv, size, offset );\n\n\t\toutBuffer.set( data, offset.value );\n\t\toffset.value += size;\n\n\t}\n\n\treturn outBuffer;\n\n}\n\nfunction decodeLinear( dec, r, g, b, a ) {\n\n\tdec.r = r;\n\tdec.g = g;\n\tdec.b = b;\n\tdec.a = a;\n\n}\n\n// function decodeSRGB( dec, r, g, b, a ) {\n\n// \tdec.r = r > 0.04045 ? Math.pow( r * 0.9478672986 + 0.0521327014, 2.4 ) : r * 0.0773993808;\n// \tdec.g = g > 0.04045 ? Math.pow( g * 0.9478672986 + 0.0521327014, 2.4 ) : g * 0.0773993808;\n// \tdec.b = b > 0.04045 ? Math.pow( b * 0.9478672986 + 0.0521327014, 2.4 ) : b * 0.0773993808;\n// \tdec.a = a;\n\n// }\n\n\nfunction setUint8( dv, value, offset ) {\n\n\tdv.setUint8( offset.value, value );\n\n\toffset.value += 1;\n\n}\n\nfunction setUint32( dv, value, offset ) {\n\n\tdv.setUint32( offset.value, value, true );\n\n\toffset.value += 4;\n\n}\n\nfunction setFloat16( dv, value, offset ) {\n\n\tdv.setUint16( offset.value, DataUtils.toHalfFloat( value ), true );\n\n\toffset.value += 2;\n\n}\n\nfunction setFloat32( dv, value, offset ) {\n\n\tdv.setFloat32( offset.value, value, true );\n\n\toffset.value += 4;\n\n}\n\nfunction setUint64( dv, value, offset ) {\n\n\tdv.setBigUint64( offset.value, BigInt( value ), true );\n\n\toffset.value += 8;\n\n}\n\nfunction setString( dv, string, offset ) {\n\n\tconst tmp = textEncoder.encode( string + '\\0' );\n\n\tfor ( let i = 0; i < tmp.length; ++ i ) {\n\n\t\tsetUint8( dv, tmp[ i ], offset );\n\n\t}\n\n}\n\nfunction decodeFloat16( binary ) {\n\n\tconst exponent = ( binary & 0x7C00 ) >> 10,\n\t\tfraction = binary & 0x03FF;\n\n\treturn ( binary >> 15 ? - 1 : 1 ) * (\n\t\texponent ?\n\t\t\t(\n\t\t\t\texponent === 0x1F ?\n\t\t\t\t\tfraction ? NaN : Infinity :\n\t\t\t\t\tMath.pow( 2, exponent - 15 ) * ( 1 + fraction / 0x400 )\n\t\t\t) :\n\t\t\t6.103515625e-5 * ( fraction / 0x400 )\n\t);\n\n}\n\nfunction getFloat16( arr, i ) {\n\n\treturn decodeFloat16( arr[ i ] );\n\n}\n\nfunction getFloat32( arr, i ) {\n\n\treturn arr[ i ];\n\n}\n\n/**\n * Export options of `EXRExporter`.\n *\n * @typedef {Object} EXRExporter~Options\n * @property {(HalfFloatType|FloatType)} [type=HalfFloatType] - Output data type.\n * @property {(NO_COMPRESSION|ZIP_COMPRESSION|ZIPS_COMPRESSION)} [type=ZIP_COMPRESSION] - The compression algorithm.\n **/\n\nexport { EXRExporter, NO_COMPRESSION, ZIP_COMPRESSION, ZIPS_COMPRESSION };\n", "import {\n\tBufferAttribute,\n\tClampToEdgeWrapping,\n\tColor,\n\tDoubleSide,\n\tInterpolateDiscrete,\n\tInterpolateLinear,\n\tNoColorSpace,\n\tLinearFilter,\n\tLinearMipmapLinearFilter,\n\tLinearMipmapNearestFilter,\n\tMathUtils,\n\tMatrix4,\n\tMirroredRepeatWrapping,\n\tNearestFilter,\n\tNearestMipmapLinearFilter,\n\tNearestMipmapNearestFilter,\n\tPropertyBinding,\n\tRGBAFormat,\n\tRepeatWrapping,\n\tScene,\n\tSource,\n\tSRGBColorSpace,\n\tCompressedTexture,\n\tVector3,\n\tQuaternion,\n\tREVISION,\n\tImageUtils\n} from 'three';\n\n/**\n * The KHR_mesh_quantization extension allows these extra attribute component types\n *\n * @see https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_mesh_quantization/README.md#extending-mesh-attributes\n */\nconst KHR_mesh_quantization_ExtraAttrTypes = {\n\tPOSITION: [\n\t\t'byte',\n\t\t'byte normalized',\n\t\t'unsigned byte',\n\t\t'unsigned byte normalized',\n\t\t'short',\n\t\t'short normalized',\n\t\t'unsigned short',\n\t\t'unsigned short normalized',\n\t],\n\tNORMAL: [\n\t\t'byte normalized',\n\t\t'short normalized',\n\t],\n\tTANGENT: [\n\t\t'byte normalized',\n\t\t'short normalized',\n\t],\n\tTEXCOORD: [\n\t\t'byte',\n\t\t'byte normalized',\n\t\t'unsigned byte',\n\t\t'short',\n\t\t'short normalized',\n\t\t'unsigned short',\n\t],\n};\n\n/**\n * An exporter for `glTF` 2.0.\n *\n * glTF (GL Transmission Format) is an [open format specification](https://github.com/KhronosGroup/glTF/tree/master/specification/2.0)\n * for efficient delivery and loading of 3D content. Assets may be provided either in JSON (.gltf)\n * or binary (.glb) format. External files store textures (.jpg, .png) and additional binary\n * data (.bin). A glTF asset may deliver one or more scenes, including meshes, materials,\n * textures, skins, skeletons, morph targets, animations, lights, and/or cameras.\n *\n * GLTFExporter supports the [glTF 2.0 extensions](https://github.com/KhronosGroup/glTF/tree/master/extensions/):\n *\n * - KHR_lights_punctual\n * - KHR_materials_clearcoat\n * - KHR_materials_dispersion\n * - KHR_materials_emissive_strength\n * - KHR_materials_ior\n * - KHR_materials_iridescence\n * - KHR_materials_specular\n * - KHR_materials_sheen\n * - KHR_materials_transmission\n * - KHR_materials_unlit\n * - KHR_materials_volume\n * - KHR_mesh_quantization\n * - KHR_texture_transform\n * - EXT_materials_bump\n * - EXT_mesh_gpu_instancing\n *\n * The following glTF 2.0 extension is supported by an external user plugin:\n *\n * - [KHR_materials_variants](https://github.com/takahirox/three-gltf-extensions)\n *\n * ```js\n * const exporter = new GLTFExporter();\n * const data = await exporter.parseAsync( scene, options );\n * ```\n *\n * @three_import import { GLTFExporter } from 'three/addons/exporters/GLTFExporter.js';\n */\nclass GLTFExporter {\n\n\t/**\n\t * Constructs a new glTF exporter.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * A reference to a texture utils module.\n\t\t *\n\t\t * @type {?(WebGLTextureUtils|WebGPUTextureUtils)}\n\t\t * @default null\n\t\t */\n\t\tthis.textureUtils = null;\n\n\t\tthis.pluginCallbacks = [];\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFLightExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsUnlitExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsTransmissionExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsVolumeExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsIorExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsSpecularExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsClearcoatExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsDispersionExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsIridescenceExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsSheenExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsAnisotropyExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsEmissiveStrengthExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMaterialsBumpExtension( writer );\n\n\t\t} );\n\n\t\tthis.register( function ( writer ) {\n\n\t\t\treturn new GLTFMeshGpuInstancing( writer );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Registers a plugin callback. This API is internally used to implement the various\n\t * glTF extensions but can also used by third-party code to add additional logic\n\t * to the exporter.\n\t *\n\t * @param {function(writer:GLTFWriter)} callback - The callback function to register.\n\t * @return {GLTFExporter} A reference to this exporter.\n\t */\n\tregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) === - 1 ) {\n\n\t\t\tthis.pluginCallbacks.push( callback );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Unregisters a plugin callback.\n\t *\n\t * @param {Function} callback - The callback function to unregister.\n\t * @return {GLTFExporter} A reference to this exporter.\n\t */\n\tunregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) {\n\n\t\t\tthis.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the texture utils for this exporter. Only relevant when compressed textures have to be exported.\n\t *\n\t * Depending on whether you use {@link WebGLRenderer} or {@link WebGPURenderer}, you must inject the\n\t * corresponding texture utils {@link WebGLTextureUtils} or {@link WebGPUTextureUtils}.\n\t *\n\t * @param {WebGLTextureUtils|WebGPUTextureUtils} utils - The texture utils.\n\t * @return {GLTFExporter} A reference to this exporter.\n\t */\n\tsetTextureUtils( utils ) {\n\n\t\tthis.textureUtils = utils;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Parses the given scenes and generates the glTF output.\n\t *\n\t * @param {Scene|Array<Scene>} input - A scene or an array of scenes.\n\t * @param {GLTFExporter~OnDone} onDone - A callback function that is executed when the export has finished.\n\t * @param {GLTFExporter~OnError} onError - A callback function that is executed when an error happens.\n\t * @param {GLTFExporter~Options} options - options\n\t */\n\tparse( input, onDone, onError, options ) {\n\n\t\tconst writer = new GLTFWriter();\n\t\tconst plugins = [];\n\n\t\tfor ( let i = 0, il = this.pluginCallbacks.length; i < il; i ++ ) {\n\n\t\t\tplugins.push( this.pluginCallbacks[ i ]( writer ) );\n\n\t\t}\n\n\t\twriter.setPlugins( plugins );\n\t\twriter.setTextureUtils( this.textureUtils );\n\t\twriter.writeAsync( input, onDone, options ).catch( onError );\n\n\t}\n\n\t/**\n\t * Async version of {@link GLTFExporter#parse}.\n\t *\n\t * @param {Scene|Array<Scene>} input - A scene or an array of scenes.\n\t * @param {GLTFExporter~Options} options - options.\n\t * @return {Promise<ArrayBuffer|string>} A Promise that resolved with the exported glTF data.\n\t */\n\tparseAsync( input, options ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.parse( input, resolve, reject, options );\n\n\t\t} );\n\n\t}\n\n}\n\n//------------------------------------------------------------------------------\n// Constants\n//------------------------------------------------------------------------------\n\nconst WEBGL_CONSTANTS = {\n\tPOINTS: 0x0000,\n\tLINES: 0x0001,\n\tLINE_LOOP: 0x0002,\n\tLINE_STRIP: 0x0003,\n\tTRIANGLES: 0x0004,\n\tTRIANGLE_STRIP: 0x0005,\n\tTRIANGLE_FAN: 0x0006,\n\n\tBYTE: 0x1400,\n\tUNSIGNED_BYTE: 0x1401,\n\tSHORT: 0x1402,\n\tUNSIGNED_SHORT: 0x1403,\n\tINT: 0x1404,\n\tUNSIGNED_INT: 0x1405,\n\tFLOAT: 0x1406,\n\n\tARRAY_BUFFER: 0x8892,\n\tELEMENT_ARRAY_BUFFER: 0x8893,\n\n\tNEAREST: 0x2600,\n\tLINEAR: 0x2601,\n\tNEAREST_MIPMAP_NEAREST: 0x2700,\n\tLINEAR_MIPMAP_NEAREST: 0x2701,\n\tNEAREST_MIPMAP_LINEAR: 0x2702,\n\tLINEAR_MIPMAP_LINEAR: 0x2703,\n\n\tCLAMP_TO_EDGE: 33071,\n\tMIRRORED_REPEAT: 33648,\n\tREPEAT: 10497\n};\n\nconst KHR_MESH_QUANTIZATION = 'KHR_mesh_quantization';\n\nconst THREE_TO_WEBGL = {};\n\nTHREE_TO_WEBGL[ NearestFilter ] = WEBGL_CONSTANTS.NEAREST;\nTHREE_TO_WEBGL[ NearestMipmapNearestFilter ] = WEBGL_CONSTANTS.NEAREST_MIPMAP_NEAREST;\nTHREE_TO_WEBGL[ NearestMipmapLinearFilter ] = WEBGL_CONSTANTS.NEAREST_MIPMAP_LINEAR;\nTHREE_TO_WEBGL[ LinearFilter ] = WEBGL_CONSTANTS.LINEAR;\nTHREE_TO_WEBGL[ LinearMipmapNearestFilter ] = WEBGL_CONSTANTS.LINEAR_MIPMAP_NEAREST;\nTHREE_TO_WEBGL[ LinearMipmapLinearFilter ] = WEBGL_CONSTANTS.LINEAR_MIPMAP_LINEAR;\n\nTHREE_TO_WEBGL[ ClampToEdgeWrapping ] = WEBGL_CONSTANTS.CLAMP_TO_EDGE;\nTHREE_TO_WEBGL[ RepeatWrapping ] = WEBGL_CONSTANTS.REPEAT;\nTHREE_TO_WEBGL[ MirroredRepeatWrapping ] = WEBGL_CONSTANTS.MIRRORED_REPEAT;\n\nconst PATH_PROPERTIES = {\n\tscale: 'scale',\n\tposition: 'translation',\n\tquaternion: 'rotation',\n\tmorphTargetInfluences: 'weights'\n};\n\nconst DEFAULT_SPECULAR_COLOR = new Color();\n\n// GLB constants\n// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#glb-file-format-specification\n\nconst GLB_HEADER_BYTES = 12;\nconst GLB_HEADER_MAGIC = 0x46546C67;\nconst GLB_VERSION = 2;\n\nconst GLB_CHUNK_PREFIX_BYTES = 8;\nconst GLB_CHUNK_TYPE_JSON = 0x4E4F534A;\nconst GLB_CHUNK_TYPE_BIN = 0x004E4942;\n\n//------------------------------------------------------------------------------\n// Utility functions\n//------------------------------------------------------------------------------\n\n/**\n * Compare two arrays\n *\n * @private\n * @param {Array} array1 Array 1 to compare\n * @param {Array} array2 Array 2 to compare\n * @return {boolean}        Returns true if both arrays are equal\n */\nfunction equalArray( array1, array2 ) {\n\n\treturn ( array1.length === array2.length ) && array1.every( function ( element, index ) {\n\n\t\treturn element === array2[ index ];\n\n\t} );\n\n}\n\n/**\n * Converts a string to an ArrayBuffer.\n *\n * @private\n * @param {string} text\n * @return {ArrayBuffer}\n */\nfunction stringToArrayBuffer( text ) {\n\n\treturn new TextEncoder().encode( text ).buffer;\n\n}\n\n/**\n * Is identity matrix\n *\n * @private\n * @param {Matrix4} matrix\n * @returns {boolean} Returns true, if parameter is identity matrix\n */\nfunction isIdentityMatrix( matrix ) {\n\n\treturn equalArray( matrix.elements, [ 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1 ] );\n\n}\n\n/**\n * Get the min and max vectors from the given attribute\n *\n * @private\n * @param {BufferAttribute} attribute Attribute to find the min/max in range from start to start + count\n * @param {number} start Start index\n * @param {number} count Range to cover\n * @return {Object} Object containing the `min` and `max` values (As an array of attribute.itemSize components)\n */\nfunction getMinMax( attribute, start, count ) {\n\n\tconst output = {\n\n\t\tmin: new Array( attribute.itemSize ).fill( Number.POSITIVE_INFINITY ),\n\t\tmax: new Array( attribute.itemSize ).fill( Number.NEGATIVE_INFINITY )\n\n\t};\n\n\tfor ( let i = start; i < start + count; i ++ ) {\n\n\t\tfor ( let a = 0; a < attribute.itemSize; a ++ ) {\n\n\t\t\tlet value;\n\n\t\t\tif ( attribute.itemSize > 4 ) {\n\n\t\t\t\t // no support for interleaved data for itemSize > 4\n\n\t\t\t\tvalue = attribute.array[ i * attribute.itemSize + a ];\n\n\t\t\t} else {\n\n\t\t\t\tif ( a === 0 ) value = attribute.getX( i );\n\t\t\t\telse if ( a === 1 ) value = attribute.getY( i );\n\t\t\t\telse if ( a === 2 ) value = attribute.getZ( i );\n\t\t\t\telse if ( a === 3 ) value = attribute.getW( i );\n\n\t\t\t\tif ( attribute.normalized === true ) {\n\n\t\t\t\t\tvalue = MathUtils.normalize( value, attribute.array );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\toutput.min[ a ] = Math.min( output.min[ a ], value );\n\t\t\toutput.max[ a ] = Math.max( output.max[ a ], value );\n\n\t\t}\n\n\t}\n\n\treturn output;\n\n}\n\n/**\n * Get the required size + padding for a buffer, rounded to the next 4-byte boundary.\n * https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#data-alignment\n *\n * @private\n * @param {number} bufferSize The size the original buffer. Should be an integer.\n * @returns {number} new buffer size with required padding as an integer.\n *\n */\nfunction getPaddedBufferSize( bufferSize ) {\n\n\treturn Math.ceil( bufferSize / 4 ) * 4;\n\n}\n\n/**\n * Returns a buffer aligned to 4-byte boundary.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer Buffer to pad\n * @param {number} [paddingByte=0] Should be an integer\n * @returns {ArrayBuffer} The same buffer if it's already aligned to 4-byte boundary or a new buffer\n */\nfunction getPaddedArrayBuffer( arrayBuffer, paddingByte = 0 ) {\n\n\tconst paddedLength = getPaddedBufferSize( arrayBuffer.byteLength );\n\n\tif ( paddedLength !== arrayBuffer.byteLength ) {\n\n\t\tconst array = new Uint8Array( paddedLength );\n\t\tarray.set( new Uint8Array( arrayBuffer ) );\n\n\t\tif ( paddingByte !== 0 ) {\n\n\t\t\tfor ( let i = arrayBuffer.byteLength; i < paddedLength; i ++ ) {\n\n\t\t\t\tarray[ i ] = paddingByte;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn array.buffer;\n\n\t}\n\n\treturn arrayBuffer;\n\n}\n\nfunction getCanvas() {\n\n\tif ( typeof document === 'undefined' && typeof OffscreenCanvas !== 'undefined' ) {\n\n\t\treturn new OffscreenCanvas( 1, 1 );\n\n\t}\n\n\treturn document.createElement( 'canvas' );\n\n}\n\nfunction getToBlobPromise( canvas, mimeType ) {\n\n\tif ( typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas ) {\n\n\t\tlet quality;\n\n\t\t// Blink's implementation of convertToBlob seems to default to a quality level of 100%\n\t\t// Use the Blink default quality levels of toBlob instead so that file sizes are comparable.\n\t\tif ( mimeType === 'image/jpeg' ) {\n\n\t\t\tquality = 0.92;\n\n\t\t} else if ( mimeType === 'image/webp' ) {\n\n\t\t\tquality = 0.8;\n\n\t\t}\n\n\t\treturn canvas.convertToBlob( {\n\n\t\t\ttype: mimeType,\n\t\t\tquality: quality\n\n\t\t} );\n\n\t} else {\n\n\t\t// HTMLCanvasElement code path\n\n\t\treturn new Promise( ( resolve ) => canvas.toBlob( resolve, mimeType ) );\n\n\t}\n\n}\n\n/**\n * Writer\n *\n * @private\n */\nclass GLTFWriter {\n\n\tconstructor() {\n\n\t\tthis.plugins = [];\n\n\t\tthis.options = {};\n\t\tthis.pending = [];\n\t\tthis.buffers = [];\n\n\t\tthis.byteOffset = 0;\n\t\tthis.buffers = [];\n\t\tthis.nodeMap = new Map();\n\t\tthis.skins = [];\n\n\t\tthis.extensionsUsed = {};\n\t\tthis.extensionsRequired = {};\n\n\t\tthis.uids = new Map();\n\t\tthis.uid = 0;\n\n\t\tthis.json = {\n\t\t\tasset: {\n\t\t\t\tversion: '2.0',\n\t\t\t\tgenerator: 'THREE.GLTFExporter r' + REVISION\n\t\t\t}\n\t\t};\n\n\t\tthis.cache = {\n\t\t\tmeshes: new Map(),\n\t\t\tattributes: new Map(),\n\t\t\tattributesNormalized: new Map(),\n\t\t\tmaterials: new Map(),\n\t\t\ttextures: new Map(),\n\t\t\timages: new Map()\n\t\t};\n\n\t\tthis.textureUtils = null;\n\n\t}\n\n\tsetPlugins( plugins ) {\n\n\t\tthis.plugins = plugins;\n\n\t}\n\n\tsetTextureUtils( utils ) {\n\n\t\tthis.textureUtils = utils;\n\n\t}\n\n\t/**\n\t * Parse scenes and generate GLTF output\n\t *\n\t * @param {Scene|Array<Scene>} input Scene or Array of THREE.Scenes\n\t * @param {Function} onDone Callback on completed\n\t * @param {Object} options options\n\t */\n\tasync writeAsync( input, onDone, options = {} ) {\n\n\t\tthis.options = Object.assign( {\n\t\t\t// default options\n\t\t\tbinary: false,\n\t\t\ttrs: false,\n\t\t\tonlyVisible: true,\n\t\t\tmaxTextureSize: Infinity,\n\t\t\tanimations: [],\n\t\t\tincludeCustomExtensions: false\n\t\t}, options );\n\n\t\tif ( this.options.animations.length > 0 ) {\n\n\t\t\t// Only TRS properties, and not matrices, may be targeted by animation.\n\t\t\tthis.options.trs = true;\n\n\t\t}\n\n\t\tawait this.processInputAsync( input );\n\n\t\tawait Promise.all( this.pending );\n\n\t\tconst writer = this;\n\t\tconst buffers = writer.buffers;\n\t\tconst json = writer.json;\n\t\toptions = writer.options;\n\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\t\tconst extensionsRequired = writer.extensionsRequired;\n\n\t\t// Merge buffers.\n\t\tconst blob = new Blob( buffers, { type: 'application/octet-stream' } );\n\n\t\t// Declare extensions.\n\t\tconst extensionsUsedList = Object.keys( extensionsUsed );\n\t\tconst extensionsRequiredList = Object.keys( extensionsRequired );\n\n\t\tif ( extensionsUsedList.length > 0 ) json.extensionsUsed = extensionsUsedList;\n\t\tif ( extensionsRequiredList.length > 0 ) json.extensionsRequired = extensionsRequiredList;\n\n\t\t// Update bytelength of the single buffer.\n\t\tif ( json.buffers && json.buffers.length > 0 ) json.buffers[ 0 ].byteLength = blob.size;\n\n\t\tif ( options.binary === true ) {\n\n\t\t\t// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#glb-file-format-specification\n\n\t\t\tconst reader = new FileReader();\n\t\t\treader.readAsArrayBuffer( blob );\n\t\t\treader.onloadend = function () {\n\n\t\t\t\t// Binary chunk.\n\t\t\t\tconst binaryChunk = getPaddedArrayBuffer( reader.result );\n\t\t\t\tconst binaryChunkPrefix = new DataView( new ArrayBuffer( GLB_CHUNK_PREFIX_BYTES ) );\n\t\t\t\tbinaryChunkPrefix.setUint32( 0, binaryChunk.byteLength, true );\n\t\t\t\tbinaryChunkPrefix.setUint32( 4, GLB_CHUNK_TYPE_BIN, true );\n\n\t\t\t\t// JSON chunk.\n\t\t\t\tconst jsonChunk = getPaddedArrayBuffer( stringToArrayBuffer( JSON.stringify( json ) ), 0x20 );\n\t\t\t\tconst jsonChunkPrefix = new DataView( new ArrayBuffer( GLB_CHUNK_PREFIX_BYTES ) );\n\t\t\t\tjsonChunkPrefix.setUint32( 0, jsonChunk.byteLength, true );\n\t\t\t\tjsonChunkPrefix.setUint32( 4, GLB_CHUNK_TYPE_JSON, true );\n\n\t\t\t\t// GLB header.\n\t\t\t\tconst header = new ArrayBuffer( GLB_HEADER_BYTES );\n\t\t\t\tconst headerView = new DataView( header );\n\t\t\t\theaderView.setUint32( 0, GLB_HEADER_MAGIC, true );\n\t\t\t\theaderView.setUint32( 4, GLB_VERSION, true );\n\t\t\t\tconst totalByteLength = GLB_HEADER_BYTES\n\t\t\t\t\t+ jsonChunkPrefix.byteLength + jsonChunk.byteLength\n\t\t\t\t\t+ binaryChunkPrefix.byteLength + binaryChunk.byteLength;\n\t\t\t\theaderView.setUint32( 8, totalByteLength, true );\n\n\t\t\t\tconst glbBlob = new Blob( [\n\t\t\t\t\theader,\n\t\t\t\t\tjsonChunkPrefix,\n\t\t\t\t\tjsonChunk,\n\t\t\t\t\tbinaryChunkPrefix,\n\t\t\t\t\tbinaryChunk\n\t\t\t\t], { type: 'application/octet-stream' } );\n\n\t\t\t\tconst glbReader = new FileReader();\n\t\t\t\tglbReader.readAsArrayBuffer( glbBlob );\n\t\t\t\tglbReader.onloadend = function () {\n\n\t\t\t\t\tonDone( glbReader.result );\n\n\t\t\t\t};\n\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tif ( json.buffers && json.buffers.length > 0 ) {\n\n\t\t\t\tconst reader = new FileReader();\n\t\t\t\treader.readAsDataURL( blob );\n\t\t\t\treader.onloadend = function () {\n\n\t\t\t\t\tconst base64data = reader.result;\n\t\t\t\t\tjson.buffers[ 0 ].uri = base64data;\n\t\t\t\t\tonDone( json );\n\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tonDone( json );\n\n\t\t\t}\n\n\t\t}\n\n\n\t}\n\n\t/**\n\t * Serializes a userData.\n\t *\n\t * @param {THREE.Object3D|THREE.Material|THREE.BufferGeometry|THREE.AnimationClip} object\n\t * @param {Object} objectDef\n\t */\n\tserializeUserData( object, objectDef ) {\n\n\t\tif ( Object.keys( object.userData ).length === 0 ) return;\n\n\t\tconst options = this.options;\n\t\tconst extensionsUsed = this.extensionsUsed;\n\n\t\ttry {\n\n\t\t\tconst json = JSON.parse( JSON.stringify( object.userData ) );\n\n\t\t\tif ( options.includeCustomExtensions && json.gltfExtensions ) {\n\n\t\t\t\tif ( objectDef.extensions === undefined ) objectDef.extensions = {};\n\n\t\t\t\tfor ( const extensionName in json.gltfExtensions ) {\n\n\t\t\t\t\tobjectDef.extensions[ extensionName ] = json.gltfExtensions[ extensionName ];\n\t\t\t\t\textensionsUsed[ extensionName ] = true;\n\n\t\t\t\t}\n\n\t\t\t\tdelete json.gltfExtensions;\n\n\t\t\t}\n\n\t\t\tif ( Object.keys( json ).length > 0 ) objectDef.extras = json;\n\n\t\t} catch ( error ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: userData of \\'' + object.name + '\\' ' +\n\t\t\t\t'won\\'t be serialized because of JSON.stringify error - ' + error.message );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns ids for buffer attributes.\n\t *\n\t * @param {Object} attribute\n\t * @param {boolean} [isRelativeCopy=false]\n\t * @return {number} An integer\n\t */\n\tgetUID( attribute, isRelativeCopy = false ) {\n\n\t\tif ( this.uids.has( attribute ) === false ) {\n\n\t\t\tconst uids = new Map();\n\n\t\t\tuids.set( true, this.uid ++ );\n\t\t\tuids.set( false, this.uid ++ );\n\n\t\t\tthis.uids.set( attribute, uids );\n\n\t\t}\n\n\t\tconst uids = this.uids.get( attribute );\n\n\t\treturn uids.get( isRelativeCopy );\n\n\t}\n\n\t/**\n\t * Checks if normal attribute values are normalized.\n\t *\n\t * @param {BufferAttribute} normal\n\t * @returns {boolean}\n\t */\n\tisNormalizedNormalAttribute( normal ) {\n\n\t\tconst cache = this.cache;\n\n\t\tif ( cache.attributesNormalized.has( normal ) ) return false;\n\n\t\tconst v = new Vector3();\n\n\t\tfor ( let i = 0, il = normal.count; i < il; i ++ ) {\n\n\t\t\t// 0.0005 is from glTF-validator\n\t\t\tif ( Math.abs( v.fromBufferAttribute( normal, i ).length() - 1.0 ) > 0.0005 ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Creates normalized normal buffer attribute.\n\t *\n\t * @param {BufferAttribute} normal\n\t * @returns {BufferAttribute}\n\t *\n\t */\n\tcreateNormalizedNormalAttribute( normal ) {\n\n\t\tconst cache = this.cache;\n\n\t\tif ( cache.attributesNormalized.has( normal ) )\treturn cache.attributesNormalized.get( normal );\n\n\t\tconst attribute = normal.clone();\n\t\tconst v = new Vector3();\n\n\t\tfor ( let i = 0, il = attribute.count; i < il; i ++ ) {\n\n\t\t\tv.fromBufferAttribute( attribute, i );\n\n\t\t\tif ( v.x === 0 && v.y === 0 && v.z === 0 ) {\n\n\t\t\t\t// if values can't be normalized set (1, 0, 0)\n\t\t\t\tv.setX( 1.0 );\n\n\t\t\t} else {\n\n\t\t\t\tv.normalize();\n\n\t\t\t}\n\n\t\t\tattribute.setXYZ( i, v.x, v.y, v.z );\n\n\t\t}\n\n\t\tcache.attributesNormalized.set( normal, attribute );\n\n\t\treturn attribute;\n\n\t}\n\n\t/**\n\t * Applies a texture transform, if present, to the map definition. Requires\n\t * the KHR_texture_transform extension.\n\t *\n\t * @param {Object} mapDef\n\t * @param {THREE.Texture} texture\n\t */\n\tapplyTextureTransform( mapDef, texture ) {\n\n\t\tlet didTransform = false;\n\t\tconst transformDef = {};\n\n\t\tif ( texture.offset.x !== 0 || texture.offset.y !== 0 ) {\n\n\t\t\ttransformDef.offset = texture.offset.toArray();\n\t\t\tdidTransform = true;\n\n\t\t}\n\n\t\tif ( texture.rotation !== 0 ) {\n\n\t\t\ttransformDef.rotation = texture.rotation;\n\t\t\tdidTransform = true;\n\n\t\t}\n\n\t\tif ( texture.repeat.x !== 1 || texture.repeat.y !== 1 ) {\n\n\t\t\ttransformDef.scale = texture.repeat.toArray();\n\t\t\tdidTransform = true;\n\n\t\t}\n\n\t\tif ( didTransform ) {\n\n\t\t\tmapDef.extensions = mapDef.extensions || {};\n\t\t\tmapDef.extensions[ 'KHR_texture_transform' ] = transformDef;\n\t\t\tthis.extensionsUsed[ 'KHR_texture_transform' ] = true;\n\n\t\t}\n\n\t}\n\n\tasync buildMetalRoughTextureAsync( metalnessMap, roughnessMap ) {\n\n\t\tif ( metalnessMap === roughnessMap ) return metalnessMap;\n\n\t\tfunction getEncodingConversion( map ) {\n\n\t\t\tif ( map.colorSpace === SRGBColorSpace ) {\n\n\t\t\t\treturn function SRGBToLinear( c ) {\n\n\t\t\t\t\treturn ( c < 0.04045 ) ? c * 0.0773993808 : Math.pow( c * 0.9478672986 + 0.0521327014, 2.4 );\n\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\treturn function LinearToLinear( c ) {\n\n\t\t\t\treturn c;\n\n\t\t\t};\n\n\t\t}\n\n\t\tif ( metalnessMap instanceof CompressedTexture ) {\n\n\t\t\tmetalnessMap = await this.decompressTextureAsync( metalnessMap );\n\n\t\t}\n\n\t\tif ( roughnessMap instanceof CompressedTexture ) {\n\n\t\t\troughnessMap = await this.decompressTextureAsync( roughnessMap );\n\n\t\t}\n\n\t\tconst metalness = metalnessMap ? metalnessMap.image : null;\n\t\tconst roughness = roughnessMap ? roughnessMap.image : null;\n\n\t\tconst width = Math.max( metalness ? metalness.width : 0, roughness ? roughness.width : 0 );\n\t\tconst height = Math.max( metalness ? metalness.height : 0, roughness ? roughness.height : 0 );\n\n\t\tconst canvas = getCanvas();\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\n\t\tconst context = canvas.getContext( '2d', {\n\t\t\twillReadFrequently: true,\n\t\t} );\n\t\tcontext.fillStyle = '#00ffff';\n\t\tcontext.fillRect( 0, 0, width, height );\n\n\t\tconst composite = context.getImageData( 0, 0, width, height );\n\n\t\tif ( metalness ) {\n\n\t\t\tcontext.drawImage( metalness, 0, 0, width, height );\n\n\t\t\tconst convert = getEncodingConversion( metalnessMap );\n\t\t\tconst data = context.getImageData( 0, 0, width, height ).data;\n\n\t\t\tfor ( let i = 2; i < data.length; i += 4 ) {\n\n\t\t\t\tcomposite.data[ i ] = convert( data[ i ] / 256 ) * 256;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( roughness ) {\n\n\t\t\tcontext.drawImage( roughness, 0, 0, width, height );\n\n\t\t\tconst convert = getEncodingConversion( roughnessMap );\n\t\t\tconst data = context.getImageData( 0, 0, width, height ).data;\n\n\t\t\tfor ( let i = 1; i < data.length; i += 4 ) {\n\n\t\t\t\tcomposite.data[ i ] = convert( data[ i ] / 256 ) * 256;\n\n\t\t\t}\n\n\t\t}\n\n\t\tcontext.putImageData( composite, 0, 0 );\n\n\t\t//\n\n\t\tconst reference = metalnessMap || roughnessMap;\n\n\t\tconst texture = reference.clone();\n\n\t\ttexture.source = new Source( canvas );\n\t\ttexture.colorSpace = NoColorSpace;\n\t\ttexture.channel = ( metalnessMap || roughnessMap ).channel;\n\n\t\tif ( metalnessMap && roughnessMap && metalnessMap.channel !== roughnessMap.channel ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: UV channels for metalnessMap and roughnessMap textures must match.' );\n\n\t\t}\n\n\t\tconsole.warn( 'THREE.GLTFExporter: Merged metalnessMap and roughnessMap textures.' );\n\n\t\treturn texture;\n\n\t}\n\n\n\tasync decompressTextureAsync( texture, maxTextureSize = Infinity ) {\n\n\t\tif ( this.textureUtils === null ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFExporter: setTextureUtils() must be called to process compressed textures.' );\n\n\t\t}\n\n\t\treturn await this.textureUtils.decompress( texture, maxTextureSize );\n\n\t}\n\n\t/**\n\t * Process a buffer to append to the default one.\n\t * @param {ArrayBuffer} buffer\n\t * @return {0}\n\t */\n\tprocessBuffer( buffer ) {\n\n\t\tconst json = this.json;\n\t\tconst buffers = this.buffers;\n\n\t\tif ( ! json.buffers ) json.buffers = [ { byteLength: 0 } ];\n\n\t\t// All buffers are merged before export.\n\t\tbuffers.push( buffer );\n\n\t\treturn 0;\n\n\t}\n\n\t/**\n\t * Process and generate a BufferView\n\t * @param {BufferAttribute} attribute\n\t * @param {number} componentType\n\t * @param {number} start\n\t * @param {number} count\n\t * @param {number} [target] Target usage of the BufferView\n\t * @return {Object}\n\t */\n\tprocessBufferView( attribute, componentType, start, count, target ) {\n\n\t\tconst json = this.json;\n\n\t\tif ( ! json.bufferViews ) json.bufferViews = [];\n\n\t\t// Create a new dataview and dump the attribute's array into it\n\n\t\tlet componentSize;\n\n\t\tswitch ( componentType ) {\n\n\t\t\tcase WEBGL_CONSTANTS.BYTE:\n\t\t\tcase WEBGL_CONSTANTS.UNSIGNED_BYTE:\n\n\t\t\t\tcomponentSize = 1;\n\n\t\t\t\tbreak;\n\n\t\t\tcase WEBGL_CONSTANTS.SHORT:\n\t\t\tcase WEBGL_CONSTANTS.UNSIGNED_SHORT:\n\n\t\t\t\tcomponentSize = 2;\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tcomponentSize = 4;\n\n\t\t}\n\n\t\tlet byteStride = attribute.itemSize * componentSize;\n\n\t\tif ( target === WEBGL_CONSTANTS.ARRAY_BUFFER ) {\n\n\t\t\t// Each element of a vertex attribute MUST be aligned to 4-byte boundaries\n\t\t\t// inside a bufferView\n\t\t\tbyteStride = Math.ceil( byteStride / 4 ) * 4;\n\n\t\t}\n\n\t\tconst byteLength = getPaddedBufferSize( count * byteStride );\n\t\tconst dataView = new DataView( new ArrayBuffer( byteLength ) );\n\t\tlet offset = 0;\n\n\t\tfor ( let i = start; i < start + count; i ++ ) {\n\n\t\t\tfor ( let a = 0; a < attribute.itemSize; a ++ ) {\n\n\t\t\t\tlet value;\n\n\t\t\t\tif ( attribute.itemSize > 4 ) {\n\n\t\t\t\t\t // no support for interleaved data for itemSize > 4\n\n\t\t\t\t\tvalue = attribute.array[ i * attribute.itemSize + a ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( a === 0 ) value = attribute.getX( i );\n\t\t\t\t\telse if ( a === 1 ) value = attribute.getY( i );\n\t\t\t\t\telse if ( a === 2 ) value = attribute.getZ( i );\n\t\t\t\t\telse if ( a === 3 ) value = attribute.getW( i );\n\n\t\t\t\t\tif ( attribute.normalized === true ) {\n\n\t\t\t\t\t\tvalue = MathUtils.normalize( value, attribute.array );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( componentType === WEBGL_CONSTANTS.FLOAT ) {\n\n\t\t\t\t\tdataView.setFloat32( offset, value, true );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.INT ) {\n\n\t\t\t\t\tdataView.setInt32( offset, value, true );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_INT ) {\n\n\t\t\t\t\tdataView.setUint32( offset, value, true );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.SHORT ) {\n\n\t\t\t\t\tdataView.setInt16( offset, value, true );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_SHORT ) {\n\n\t\t\t\t\tdataView.setUint16( offset, value, true );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.BYTE ) {\n\n\t\t\t\t\tdataView.setInt8( offset, value );\n\n\t\t\t\t} else if ( componentType === WEBGL_CONSTANTS.UNSIGNED_BYTE ) {\n\n\t\t\t\t\tdataView.setUint8( offset, value );\n\n\t\t\t\t}\n\n\t\t\t\toffset += componentSize;\n\n\t\t\t}\n\n\t\t\tif ( ( offset % byteStride ) !== 0 ) {\n\n\t\t\t\toffset += byteStride - ( offset % byteStride );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst bufferViewDef = {\n\n\t\t\tbuffer: this.processBuffer( dataView.buffer ),\n\t\t\tbyteOffset: this.byteOffset,\n\t\t\tbyteLength: byteLength\n\n\t\t};\n\n\t\tif ( target !== undefined ) bufferViewDef.target = target;\n\n\t\tif ( target === WEBGL_CONSTANTS.ARRAY_BUFFER ) {\n\n\t\t\t// Only define byteStride for vertex attributes.\n\t\t\tbufferViewDef.byteStride = byteStride;\n\n\t\t}\n\n\t\tthis.byteOffset += byteLength;\n\n\t\tjson.bufferViews.push( bufferViewDef );\n\n\t\t// @TODO Merge bufferViews where possible.\n\t\tconst output = {\n\n\t\t\tid: json.bufferViews.length - 1,\n\t\t\tbyteLength: 0\n\n\t\t};\n\n\t\treturn output;\n\n\t}\n\n\t/**\n\t * Process and generate a BufferView from an image Blob.\n\t * @param {Blob} blob\n\t * @return {Promise<number>} An integer\n\t */\n\tprocessBufferViewImage( blob ) {\n\n\t\tconst writer = this;\n\t\tconst json = writer.json;\n\n\t\tif ( ! json.bufferViews ) json.bufferViews = [];\n\n\t\treturn new Promise( function ( resolve ) {\n\n\t\t\tconst reader = new FileReader();\n\t\t\treader.readAsArrayBuffer( blob );\n\t\t\treader.onloadend = function () {\n\n\t\t\t\tconst buffer = getPaddedArrayBuffer( reader.result );\n\n\t\t\t\tconst bufferViewDef = {\n\t\t\t\t\tbuffer: writer.processBuffer( buffer ),\n\t\t\t\t\tbyteOffset: writer.byteOffset,\n\t\t\t\t\tbyteLength: buffer.byteLength\n\t\t\t\t};\n\n\t\t\t\twriter.byteOffset += buffer.byteLength;\n\t\t\t\tresolve( json.bufferViews.push( bufferViewDef ) - 1 );\n\n\t\t\t};\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Process attribute to generate an accessor\n\t * @param {BufferAttribute} attribute Attribute to process\n\t * @param {?BufferGeometry} [geometry] Geometry used for truncated draw range\n\t * @param {number} [start=0]\n\t * @param {number} [count=Infinity]\n\t * @return {?number} Index of the processed accessor on the \"accessors\" array\n\t */\n\tprocessAccessor( attribute, geometry, start, count ) {\n\n\t\tconst json = this.json;\n\n\t\tconst types = {\n\n\t\t\t1: 'SCALAR',\n\t\t\t2: 'VEC2',\n\t\t\t3: 'VEC3',\n\t\t\t4: 'VEC4',\n\t\t\t9: 'MAT3',\n\t\t\t16: 'MAT4'\n\n\t\t};\n\n\t\tlet componentType;\n\n\t\t// Detect the component type of the attribute array\n\t\tif ( attribute.array.constructor === Float32Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.FLOAT;\n\n\t\t} else if ( attribute.array.constructor === Int32Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.INT;\n\n\t\t} else if ( attribute.array.constructor === Uint32Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.UNSIGNED_INT;\n\n\t\t} else if ( attribute.array.constructor === Int16Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.SHORT;\n\n\t\t} else if ( attribute.array.constructor === Uint16Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.UNSIGNED_SHORT;\n\n\t\t} else if ( attribute.array.constructor === Int8Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.BYTE;\n\n\t\t} else if ( attribute.array.constructor === Uint8Array ) {\n\n\t\t\tcomponentType = WEBGL_CONSTANTS.UNSIGNED_BYTE;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.GLTFExporter: Unsupported bufferAttribute component type: ' + attribute.array.constructor.name );\n\n\t\t}\n\n\t\tif ( start === undefined ) start = 0;\n\t\tif ( count === undefined || count === Infinity ) count = attribute.count;\n\n\t\t// Skip creating an accessor if the attribute doesn't have data to export\n\t\tif ( count === 0 ) return null;\n\n\t\tconst minMax = getMinMax( attribute, start, count );\n\t\tlet bufferViewTarget;\n\n\t\t// If geometry isn't provided, don't infer the target usage of the bufferView. For\n\t\t// animation samplers, target must not be set.\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tbufferViewTarget = attribute === geometry.index ? WEBGL_CONSTANTS.ELEMENT_ARRAY_BUFFER : WEBGL_CONSTANTS.ARRAY_BUFFER;\n\n\t\t}\n\n\t\tconst bufferView = this.processBufferView( attribute, componentType, start, count, bufferViewTarget );\n\n\t\tconst accessorDef = {\n\n\t\t\tbufferView: bufferView.id,\n\t\t\tbyteOffset: bufferView.byteOffset,\n\t\t\tcomponentType: componentType,\n\t\t\tcount: count,\n\t\t\tmax: minMax.max,\n\t\t\tmin: minMax.min,\n\t\t\ttype: types[ attribute.itemSize ]\n\n\t\t};\n\n\t\tif ( attribute.normalized === true ) accessorDef.normalized = true;\n\t\tif ( ! json.accessors ) json.accessors = [];\n\n\t\treturn json.accessors.push( accessorDef ) - 1;\n\n\t}\n\n\t/**\n\t * Process image\n\t * @param {Image} image to process\n\t * @param {number} format Identifier of the format (RGBAFormat)\n\t * @param {boolean} flipY before writing out the image\n\t * @param {string} mimeType export format\n\t * @return {number}     Index of the processed texture in the \"images\" array\n\t */\n\tprocessImage( image, format, flipY, mimeType = 'image/png' ) {\n\n\t\tif ( image !== null ) {\n\n\t\t\tconst writer = this;\n\t\t\tconst cache = writer.cache;\n\t\t\tconst json = writer.json;\n\t\t\tconst options = writer.options;\n\t\t\tconst pending = writer.pending;\n\n\t\t\tif ( ! cache.images.has( image ) ) cache.images.set( image, {} );\n\n\t\t\tconst cachedImages = cache.images.get( image );\n\n\t\t\tconst key = mimeType + ':flipY/' + flipY.toString();\n\n\t\t\tif ( cachedImages[ key ] !== undefined ) return cachedImages[ key ];\n\n\t\t\tif ( ! json.images ) json.images = [];\n\n\t\t\tconst imageDef = { mimeType: mimeType };\n\n\t\t\tconst canvas = getCanvas();\n\n\t\t\tcanvas.width = Math.min( image.width, options.maxTextureSize );\n\t\t\tcanvas.height = Math.min( image.height, options.maxTextureSize );\n\n\t\t\tconst ctx = canvas.getContext( '2d', {\n\t\t\t\twillReadFrequently: true,\n\t\t\t} );\n\n\t\t\tif ( flipY === true ) {\n\n\t\t\t\tctx.translate( 0, canvas.height );\n\t\t\t\tctx.scale( 1, - 1 );\n\n\t\t\t}\n\n\t\t\tif ( image.data !== undefined ) { // THREE.DataTexture\n\n\t\t\t\tif ( format !== RGBAFormat ) {\n\n\t\t\t\t\tconsole.error( 'GLTFExporter: Only RGBAFormat is supported.', format );\n\n\t\t\t\t}\n\n\t\t\t\tif ( image.width > options.maxTextureSize || image.height > options.maxTextureSize ) {\n\n\t\t\t\t\tconsole.warn( 'GLTFExporter: Image size is bigger than maxTextureSize', image );\n\n\t\t\t\t}\n\n\t\t\t\tconst data = new Uint8ClampedArray( image.height * image.width * 4 );\n\n\t\t\t\tfor ( let i = 0; i < data.length; i += 4 ) {\n\n\t\t\t\t\tdata[ i + 0 ] = image.data[ i + 0 ];\n\t\t\t\t\tdata[ i + 1 ] = image.data[ i + 1 ];\n\t\t\t\t\tdata[ i + 2 ] = image.data[ i + 2 ];\n\t\t\t\t\tdata[ i + 3 ] = image.data[ i + 3 ];\n\n\t\t\t\t}\n\n\t\t\t\tctx.putImageData( new ImageData( data, image.width, image.height ), 0, 0 );\n\n\t\t\t} else {\n\n\t\t\t\tif ( ( typeof HTMLImageElement !== 'undefined' && image instanceof HTMLImageElement ) ||\n\t\t\t\t\t( typeof HTMLCanvasElement !== 'undefined' && image instanceof HTMLCanvasElement ) ||\n\t\t\t\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap ) ||\n\t\t\t\t\t( typeof OffscreenCanvas !== 'undefined' && image instanceof OffscreenCanvas ) ) {\n\n\t\t\t\t\tctx.drawImage( image, 0, 0, canvas.width, canvas.height );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFExporter: Invalid image type. Use HTMLImageElement, HTMLCanvasElement, ImageBitmap or OffscreenCanvas.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( options.binary === true ) {\n\n\t\t\t\tpending.push(\n\n\t\t\t\t\tgetToBlobPromise( canvas, mimeType )\n\t\t\t\t\t\t.then( blob => writer.processBufferViewImage( blob ) )\n\t\t\t\t\t\t.then( bufferViewIndex => {\n\n\t\t\t\t\t\t\timageDef.bufferView = bufferViewIndex;\n\n\t\t\t\t\t\t} )\n\n\t\t\t\t);\n\n\t\t\t} else {\n\n\t\t\t\timageDef.uri = ImageUtils.getDataURL( canvas, mimeType );\n\n\t\t\t}\n\n\t\t\tconst index = json.images.push( imageDef ) - 1;\n\t\t\tcachedImages[ key ] = index;\n\t\t\treturn index;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.GLTFExporter: No valid image data found. Unable to process texture.' );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Process sampler\n\t * @param {Texture} map Texture to process\n\t * @return {number}      Index of the processed texture in the \"samplers\" array\n\t */\n\tprocessSampler( map ) {\n\n\t\tconst json = this.json;\n\n\t\tif ( ! json.samplers ) json.samplers = [];\n\n\t\tconst samplerDef = {\n\t\t\tmagFilter: THREE_TO_WEBGL[ map.magFilter ],\n\t\t\tminFilter: THREE_TO_WEBGL[ map.minFilter ],\n\t\t\twrapS: THREE_TO_WEBGL[ map.wrapS ],\n\t\t\twrapT: THREE_TO_WEBGL[ map.wrapT ]\n\t\t};\n\n\t\treturn json.samplers.push( samplerDef ) - 1;\n\n\t}\n\n\t/**\n\t * Process texture\n\t * @param {Texture} map Map to process\n\t * @return {Promise<number>} Index of the processed texture in the \"textures\" array\n\t */\n\tasync processTextureAsync( map ) {\n\n\t\tconst writer = this;\n\t\tconst options = writer.options;\n\t\tconst cache = this.cache;\n\t\tconst json = this.json;\n\n\t\tif ( cache.textures.has( map ) ) return cache.textures.get( map );\n\n\t\tif ( ! json.textures ) json.textures = [];\n\n\t\t// make non-readable textures (e.g. CompressedTexture) readable by blitting them into a new texture\n\t\tif ( map instanceof CompressedTexture ) {\n\n\t\t\tmap = await this.decompressTextureAsync( map, options.maxTextureSize );\n\n\t\t}\n\n\t\tlet mimeType = map.userData.mimeType;\n\n\t\tif ( mimeType === 'image/webp' ) mimeType = 'image/png';\n\n\t\tconst textureDef = {\n\t\t\tsampler: this.processSampler( map ),\n\t\t\tsource: this.processImage( map.image, map.format, map.flipY, mimeType )\n\t\t};\n\n\t\tif ( map.name ) textureDef.name = map.name;\n\n\t\tawait this._invokeAllAsync( async function ( ext ) {\n\n\t\t\text.writeTexture && await ext.writeTexture( map, textureDef );\n\n\t\t} );\n\n\t\tconst index = json.textures.push( textureDef ) - 1;\n\t\tcache.textures.set( map, index );\n\t\treturn index;\n\n\t}\n\n\t/**\n\t * Process material\n\t * @param {THREE.Material} material Material to process\n\t * @return {Promise<?number>} Index of the processed material in the \"materials\" array\n\t */\n\tasync processMaterialAsync( material ) {\n\n\t\tconst cache = this.cache;\n\t\tconst json = this.json;\n\n\t\tif ( cache.materials.has( material ) ) return cache.materials.get( material );\n\n\t\tif ( material.isShaderMaterial ) {\n\n\t\t\tconsole.warn( 'GLTFExporter: THREE.ShaderMaterial not supported.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( ! json.materials ) json.materials = [];\n\n\t\t// @QUESTION Should we avoid including any attribute that has the default value?\n\t\tconst materialDef = {\tpbrMetallicRoughness: {} };\n\n\t\tif ( material.isMeshStandardMaterial !== true && material.isMeshBasicMaterial !== true ) {\n\n\t\t\tconsole.warn( 'GLTFExporter: Use MeshStandardMaterial or MeshBasicMaterial for best results.' );\n\n\t\t}\n\n\t\t// pbrMetallicRoughness.baseColorFactor\n\t\tconst color = material.color.toArray().concat( [ material.opacity ] );\n\n\t\tif ( ! equalArray( color, [ 1, 1, 1, 1 ] ) ) {\n\n\t\t\tmaterialDef.pbrMetallicRoughness.baseColorFactor = color;\n\n\t\t}\n\n\t\tif ( material.isMeshStandardMaterial ) {\n\n\t\t\tmaterialDef.pbrMetallicRoughness.metallicFactor = material.metalness;\n\t\t\tmaterialDef.pbrMetallicRoughness.roughnessFactor = material.roughness;\n\n\t\t} else {\n\n\t\t\tmaterialDef.pbrMetallicRoughness.metallicFactor = 0;\n\t\t\tmaterialDef.pbrMetallicRoughness.roughnessFactor = 1;\n\n\t\t}\n\n\t\t// pbrMetallicRoughness.metallicRoughnessTexture\n\t\tif ( material.metalnessMap || material.roughnessMap ) {\n\n\t\t\tconst metalRoughTexture = await this.buildMetalRoughTextureAsync( material.metalnessMap, material.roughnessMap );\n\n\t\t\tconst metalRoughMapDef = {\n\t\t\t\tindex: await this.processTextureAsync( metalRoughTexture ),\n\t\t\t\ttexCoord: metalRoughTexture.channel\n\t\t\t};\n\t\t\tthis.applyTextureTransform( metalRoughMapDef, metalRoughTexture );\n\t\t\tmaterialDef.pbrMetallicRoughness.metallicRoughnessTexture = metalRoughMapDef;\n\n\t\t}\n\n\t\t// pbrMetallicRoughness.baseColorTexture\n\t\tif ( material.map ) {\n\n\t\t\tconst baseColorMapDef = {\n\t\t\t\tindex: await this.processTextureAsync( material.map ),\n\t\t\t\ttexCoord: material.map.channel\n\t\t\t};\n\t\t\tthis.applyTextureTransform( baseColorMapDef, material.map );\n\t\t\tmaterialDef.pbrMetallicRoughness.baseColorTexture = baseColorMapDef;\n\n\t\t}\n\n\t\tif ( material.emissive ) {\n\n\t\t\tconst emissive = material.emissive;\n\t\t\tconst maxEmissiveComponent = Math.max( emissive.r, emissive.g, emissive.b );\n\n\t\t\tif ( maxEmissiveComponent > 0 ) {\n\n\t\t\t\tmaterialDef.emissiveFactor = material.emissive.toArray();\n\n\t\t\t}\n\n\t\t\t// emissiveTexture\n\t\t\tif ( material.emissiveMap ) {\n\n\t\t\t\tconst emissiveMapDef = {\n\t\t\t\t\tindex: await this.processTextureAsync( material.emissiveMap ),\n\t\t\t\t\ttexCoord: material.emissiveMap.channel\n\t\t\t\t};\n\t\t\t\tthis.applyTextureTransform( emissiveMapDef, material.emissiveMap );\n\t\t\t\tmaterialDef.emissiveTexture = emissiveMapDef;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// normalTexture\n\t\tif ( material.normalMap ) {\n\n\t\t\tconst normalMapDef = {\n\t\t\t\tindex: await this.processTextureAsync( material.normalMap ),\n\t\t\t\ttexCoord: material.normalMap.channel\n\t\t\t};\n\n\t\t\tif ( material.normalScale && material.normalScale.x !== 1 ) {\n\n\t\t\t\t// glTF normal scale is univariate. Ignore `y`, which may be flipped.\n\t\t\t\t// Context: https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995\n\t\t\t\tnormalMapDef.scale = material.normalScale.x;\n\n\t\t\t}\n\n\t\t\tthis.applyTextureTransform( normalMapDef, material.normalMap );\n\t\t\tmaterialDef.normalTexture = normalMapDef;\n\n\t\t}\n\n\t\t// occlusionTexture\n\t\tif ( material.aoMap ) {\n\n\t\t\tconst occlusionMapDef = {\n\t\t\t\tindex: await this.processTextureAsync( material.aoMap ),\n\t\t\t\ttexCoord: material.aoMap.channel\n\t\t\t};\n\n\t\t\tif ( material.aoMapIntensity !== 1.0 ) {\n\n\t\t\t\tocclusionMapDef.strength = material.aoMapIntensity;\n\n\t\t\t}\n\n\t\t\tthis.applyTextureTransform( occlusionMapDef, material.aoMap );\n\t\t\tmaterialDef.occlusionTexture = occlusionMapDef;\n\n\t\t}\n\n\t\t// alphaMode\n\t\tif ( material.transparent ) {\n\n\t\t\tmaterialDef.alphaMode = 'BLEND';\n\n\t\t} else {\n\n\t\t\tif ( material.alphaTest > 0.0 ) {\n\n\t\t\t\tmaterialDef.alphaMode = 'MASK';\n\t\t\t\tmaterialDef.alphaCutoff = material.alphaTest;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// doubleSided\n\t\tif ( material.side === DoubleSide ) materialDef.doubleSided = true;\n\t\tif ( material.name !== '' ) materialDef.name = material.name;\n\n\t\tthis.serializeUserData( material, materialDef );\n\n\t\tawait this._invokeAllAsync( async function ( ext ) {\n\n\t\t\text.writeMaterialAsync && await ext.writeMaterialAsync( material, materialDef );\n\n\t\t} );\n\n\t\tconst index = json.materials.push( materialDef ) - 1;\n\t\tcache.materials.set( material, index );\n\t\treturn index;\n\n\t}\n\n\t/**\n\t * Process mesh\n\t * @param {THREE.Mesh} mesh Mesh to process\n\t * @return {Promise<?number>} Index of the processed mesh in the \"meshes\" array\n\t */\n\tasync processMeshAsync( mesh ) {\n\n\t\tconst cache = this.cache;\n\t\tconst json = this.json;\n\n\t\tconst meshCacheKeyParts = [ mesh.geometry.uuid ];\n\n\t\tif ( Array.isArray( mesh.material ) ) {\n\n\t\t\tfor ( let i = 0, l = mesh.material.length; i < l; i ++ ) {\n\n\t\t\t\tmeshCacheKeyParts.push( mesh.material[ i ].uuid\t);\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tmeshCacheKeyParts.push( mesh.material.uuid );\n\n\t\t}\n\n\t\tconst meshCacheKey = meshCacheKeyParts.join( ':' );\n\n\t\tif ( cache.meshes.has( meshCacheKey ) ) return cache.meshes.get( meshCacheKey );\n\n\t\tconst geometry = mesh.geometry;\n\n\t\tlet mode;\n\n\t\t// Use the correct mode\n\t\tif ( mesh.isLineSegments ) {\n\n\t\t\tmode = WEBGL_CONSTANTS.LINES;\n\n\t\t} else if ( mesh.isLineLoop ) {\n\n\t\t\tmode = WEBGL_CONSTANTS.LINE_LOOP;\n\n\t\t} else if ( mesh.isLine ) {\n\n\t\t\tmode = WEBGL_CONSTANTS.LINE_STRIP;\n\n\t\t} else if ( mesh.isPoints ) {\n\n\t\t\tmode = WEBGL_CONSTANTS.POINTS;\n\n\t\t} else {\n\n\t\t\tmode = mesh.material.wireframe ? WEBGL_CONSTANTS.LINES : WEBGL_CONSTANTS.TRIANGLES;\n\n\t\t}\n\n\t\tconst meshDef = {};\n\t\tconst attributes = {};\n\t\tconst primitives = [];\n\t\tconst targets = [];\n\n\t\t// Conversion between attributes names in threejs and gltf spec\n\t\tconst nameConversion = {\n\t\t\tuv: 'TEXCOORD_0',\n\t\t\tuv1: 'TEXCOORD_1',\n\t\t\tuv2: 'TEXCOORD_2',\n\t\t\tuv3: 'TEXCOORD_3',\n\t\t\tcolor: 'COLOR_0',\n\t\t\tskinWeight: 'WEIGHTS_0',\n\t\t\tskinIndex: 'JOINTS_0'\n\t\t};\n\n\t\tconst originalNormal = geometry.getAttribute( 'normal' );\n\n\t\tif ( originalNormal !== undefined && ! this.isNormalizedNormalAttribute( originalNormal ) ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: Creating normalized normal attribute from the non-normalized one.' );\n\n\t\t\tgeometry.setAttribute( 'normal', this.createNormalizedNormalAttribute( originalNormal ) );\n\n\t\t}\n\n\t\t// @QUESTION Detect if .vertexColors = true?\n\t\t// For every attribute create an accessor\n\t\tlet modifiedAttribute = null;\n\n\t\tfor ( let attributeName in geometry.attributes ) {\n\n\t\t\t// Ignore morph target attributes, which are exported later.\n\t\t\tif ( attributeName.slice( 0, 5 ) === 'morph' ) continue;\n\n\t\t\tconst attribute = geometry.attributes[ attributeName ];\n\t\t\tattributeName = nameConversion[ attributeName ] || attributeName.toUpperCase();\n\n\t\t\t// Prefix all geometry attributes except the ones specifically\n\t\t\t// listed in the spec; non-spec attributes are considered custom.\n\t\t\tconst validVertexAttributes =\n\t\t\t\t\t/^(POSITION|NORMAL|TANGENT|TEXCOORD_\\d+|COLOR_\\d+|JOINTS_\\d+|WEIGHTS_\\d+)$/;\n\n\t\t\tif ( ! validVertexAttributes.test( attributeName ) ) attributeName = '_' + attributeName;\n\n\t\t\tif ( cache.attributes.has( this.getUID( attribute ) ) ) {\n\n\t\t\t\tattributes[ attributeName ] = cache.attributes.get( this.getUID( attribute ) );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// Enforce glTF vertex attribute requirements:\n\t\t\t// - JOINTS_0 must be UNSIGNED_BYTE or UNSIGNED_SHORT\n\t\t\t// - Only custom attributes may be INT or UNSIGNED_INT\n\t\t\tmodifiedAttribute = null;\n\t\t\tconst array = attribute.array;\n\n\t\t\tif ( attributeName === 'JOINTS_0' &&\n\t\t\t\t! ( array instanceof Uint16Array ) &&\n\t\t\t\t! ( array instanceof Uint8Array ) ) {\n\n\t\t\t\tconsole.warn( 'GLTFExporter: Attribute \"skinIndex\" converted to type UNSIGNED_SHORT.' );\n\t\t\t\tmodifiedAttribute = new BufferAttribute( new Uint16Array( array ), attribute.itemSize, attribute.normalized );\n\n\t\t\t} else if ( ( array instanceof Uint32Array || array instanceof Int32Array ) && ! attributeName.startsWith( '_' ) ) {\n\n\t\t\t\tconsole.warn( `GLTFExporter: Attribute \"${ attributeName }\" converted to type FLOAT.` );\n\t\t\t\tmodifiedAttribute = GLTFExporter.Utils.toFloat32BufferAttribute( attribute );\n\n\t\t\t}\n\n\t\t\tconst accessor = this.processAccessor( modifiedAttribute || attribute, geometry );\n\n\t\t\tif ( accessor !== null ) {\n\n\t\t\t\tif ( ! attributeName.startsWith( '_' ) ) {\n\n\t\t\t\t\tthis.detectMeshQuantization( attributeName, attribute );\n\n\t\t\t\t}\n\n\t\t\t\tattributes[ attributeName ] = accessor;\n\t\t\t\tcache.attributes.set( this.getUID( attribute ), accessor );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( originalNormal !== undefined ) geometry.setAttribute( 'normal', originalNormal );\n\n\t\t// Skip if no exportable attributes found\n\t\tif ( Object.keys( attributes ).length === 0 ) return null;\n\n\t\t// Morph targets\n\t\tif ( mesh.morphTargetInfluences !== undefined && mesh.morphTargetInfluences.length > 0 ) {\n\n\t\t\tconst weights = [];\n\t\t\tconst targetNames = [];\n\t\t\tconst reverseDictionary = {};\n\n\t\t\tif ( mesh.morphTargetDictionary !== undefined ) {\n\n\t\t\t\tfor ( const key in mesh.morphTargetDictionary ) {\n\n\t\t\t\t\treverseDictionary[ mesh.morphTargetDictionary[ key ] ] = key;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < mesh.morphTargetInfluences.length; ++ i ) {\n\n\t\t\t\tconst target = {};\n\t\t\t\tlet warned = false;\n\n\t\t\t\tfor ( const attributeName in geometry.morphAttributes ) {\n\n\t\t\t\t\t// glTF 2.0 morph supports only POSITION/NORMAL/TANGENT.\n\t\t\t\t\t// Three.js doesn't support TANGENT yet.\n\n\t\t\t\t\tif ( attributeName !== 'position' && attributeName !== 'normal' ) {\n\n\t\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\t\tconsole.warn( 'GLTFExporter: Only POSITION and NORMAL morph are supported.' );\n\t\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst attribute = geometry.morphAttributes[ attributeName ][ i ];\n\t\t\t\t\tconst gltfAttributeName = attributeName.toUpperCase();\n\n\t\t\t\t\t// Three.js morph attribute has absolute values while the one of glTF has relative values.\n\t\t\t\t\t//\n\t\t\t\t\t// glTF 2.0 Specification:\n\t\t\t\t\t// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#morph-targets\n\n\t\t\t\t\tconst baseAttribute = geometry.attributes[ attributeName ];\n\n\t\t\t\t\tif ( cache.attributes.has( this.getUID( attribute, true ) ) ) {\n\n\t\t\t\t\t\ttarget[ gltfAttributeName ] = cache.attributes.get( this.getUID( attribute, true ) );\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Clones attribute not to override\n\t\t\t\t\tconst relativeAttribute = attribute.clone();\n\n\t\t\t\t\tif ( ! geometry.morphTargetsRelative ) {\n\n\t\t\t\t\t\tfor ( let j = 0, jl = attribute.count; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tfor ( let a = 0; a < attribute.itemSize; a ++ ) {\n\n\t\t\t\t\t\t\t\tif ( a === 0 ) relativeAttribute.setX( j, attribute.getX( j ) - baseAttribute.getX( j ) );\n\t\t\t\t\t\t\t\tif ( a === 1 ) relativeAttribute.setY( j, attribute.getY( j ) - baseAttribute.getY( j ) );\n\t\t\t\t\t\t\t\tif ( a === 2 ) relativeAttribute.setZ( j, attribute.getZ( j ) - baseAttribute.getZ( j ) );\n\t\t\t\t\t\t\t\tif ( a === 3 ) relativeAttribute.setW( j, attribute.getW( j ) - baseAttribute.getW( j ) );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttarget[ gltfAttributeName ] = this.processAccessor( relativeAttribute, geometry );\n\t\t\t\t\tcache.attributes.set( this.getUID( baseAttribute, true ), target[ gltfAttributeName ] );\n\n\t\t\t\t}\n\n\t\t\t\ttargets.push( target );\n\n\t\t\t\tweights.push( mesh.morphTargetInfluences[ i ] );\n\n\t\t\t\tif ( mesh.morphTargetDictionary !== undefined ) targetNames.push( reverseDictionary[ i ] );\n\n\t\t\t}\n\n\t\t\tmeshDef.weights = weights;\n\n\t\t\tif ( targetNames.length > 0 ) {\n\n\t\t\t\tmeshDef.extras = {};\n\t\t\t\tmeshDef.extras.targetNames = targetNames;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst isMultiMaterial = Array.isArray( mesh.material );\n\n\t\tif ( isMultiMaterial && geometry.groups.length === 0 ) return null;\n\n\t\tlet didForceIndices = false;\n\n\t\tif ( isMultiMaterial && geometry.index === null ) {\n\n\t\t\tconst indices = [];\n\n\t\t\tfor ( let i = 0, il = geometry.attributes.position.count; i < il; i ++ ) {\n\n\t\t\t\tindices[ i ] = i;\n\n\t\t\t}\n\n\t\t\tgeometry.setIndex( indices );\n\n\t\t\tdidForceIndices = true;\n\n\t\t}\n\n\t\tconst materials = isMultiMaterial ? mesh.material : [ mesh.material ];\n\t\tconst groups = isMultiMaterial ? geometry.groups : [ { materialIndex: 0, start: undefined, count: undefined } ];\n\n\t\tfor ( let i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\tconst primitive = {\n\t\t\t\tmode: mode,\n\t\t\t\tattributes: attributes,\n\t\t\t};\n\n\t\t\tthis.serializeUserData( geometry, primitive );\n\n\t\t\tif ( targets.length > 0 ) primitive.targets = targets;\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\tlet cacheKey = this.getUID( geometry.index );\n\n\t\t\t\tif ( groups[ i ].start !== undefined || groups[ i ].count !== undefined ) {\n\n\t\t\t\t\tcacheKey += ':' + groups[ i ].start + ':' + groups[ i ].count;\n\n\t\t\t\t}\n\n\t\t\t\tif ( cache.attributes.has( cacheKey ) ) {\n\n\t\t\t\t\tprimitive.indices = cache.attributes.get( cacheKey );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tprimitive.indices = this.processAccessor( geometry.index, geometry, groups[ i ].start, groups[ i ].count );\n\t\t\t\t\tcache.attributes.set( cacheKey, primitive.indices );\n\n\t\t\t\t}\n\n\t\t\t\tif ( primitive.indices === null ) delete primitive.indices;\n\n\t\t\t}\n\n\t\t\tconst material = await this.processMaterialAsync( materials[ groups[ i ].materialIndex ] );\n\n\t\t\tif ( material !== null ) primitive.material = material;\n\n\t\t\tprimitives.push( primitive );\n\n\t\t}\n\n\t\tif ( didForceIndices === true ) {\n\n\t\t\tgeometry.setIndex( null );\n\n\t\t}\n\n\t\tmeshDef.primitives = primitives;\n\n\t\tif ( ! json.meshes ) json.meshes = [];\n\n\t\tawait this._invokeAllAsync( function ( ext ) {\n\n\t\t\text.writeMesh && ext.writeMesh( mesh, meshDef );\n\n\t\t} );\n\n\t\tconst index = json.meshes.push( meshDef ) - 1;\n\t\tcache.meshes.set( meshCacheKey, index );\n\t\treturn index;\n\n\t}\n\n\t/**\n\t * If a vertex attribute with a\n\t * [non-standard data type](https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#meshes-overview)\n\t * is used, it is checked whether it is a valid data type according to the\n\t * [KHR_mesh_quantization](https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_mesh_quantization/README.md)\n\t * extension.\n\t * In this case the extension is automatically added to the list of used extensions.\n\t *\n\t * @param {string} attributeName\n\t * @param {THREE.BufferAttribute} attribute\n\t */\n\tdetectMeshQuantization( attributeName, attribute ) {\n\n\t\tif ( this.extensionsUsed[ KHR_MESH_QUANTIZATION ] ) return;\n\n\t\tlet attrType = undefined;\n\n\t\tswitch ( attribute.array.constructor ) {\n\n\t\t\tcase Int8Array:\n\n\t\t\t\tattrType = 'byte';\n\n\t\t\t\tbreak;\n\n\t\t\tcase Uint8Array:\n\n\t\t\t\tattrType = 'unsigned byte';\n\n\t\t\t\tbreak;\n\n\t\t\tcase Int16Array:\n\n\t\t\t\tattrType = 'short';\n\n\t\t\t\tbreak;\n\n\t\t\tcase Uint16Array:\n\n\t\t\t\tattrType = 'unsigned short';\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\treturn;\n\n\t\t}\n\n\t\tif ( attribute.normalized ) attrType += ' normalized';\n\n\t\tconst attrNamePrefix = attributeName.split( '_', 1 )[ 0 ];\n\n\t\tif ( KHR_mesh_quantization_ExtraAttrTypes[ attrNamePrefix ] && KHR_mesh_quantization_ExtraAttrTypes[ attrNamePrefix ].includes( attrType ) ) {\n\n\t\t\tthis.extensionsUsed[ KHR_MESH_QUANTIZATION ] = true;\n\t\t\tthis.extensionsRequired[ KHR_MESH_QUANTIZATION ] = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Process camera\n\t * @param {THREE.Camera} camera Camera to process\n\t * @return {number} Index of the processed mesh in the \"camera\" array\n\t */\n\tprocessCamera( camera ) {\n\n\t\tconst json = this.json;\n\n\t\tif ( ! json.cameras ) json.cameras = [];\n\n\t\tconst isOrtho = camera.isOrthographicCamera;\n\n\t\tconst cameraDef = {\n\t\t\ttype: isOrtho ? 'orthographic' : 'perspective'\n\t\t};\n\n\t\tif ( isOrtho ) {\n\n\t\t\tcameraDef.orthographic = {\n\t\t\t\txmag: camera.right * 2,\n\t\t\t\tymag: camera.top * 2,\n\t\t\t\tzfar: camera.far <= 0 ? 0.001 : camera.far,\n\t\t\t\tznear: camera.near < 0 ? 0 : camera.near\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tcameraDef.perspective = {\n\t\t\t\taspectRatio: camera.aspect,\n\t\t\t\tyfov: MathUtils.degToRad( camera.fov ),\n\t\t\t\tzfar: camera.far <= 0 ? 0.001 : camera.far,\n\t\t\t\tznear: camera.near < 0 ? 0 : camera.near\n\t\t\t};\n\n\t\t}\n\n\t\t// Question: Is saving \"type\" as name intentional?\n\t\tif ( camera.name !== '' ) cameraDef.name = camera.type;\n\n\t\treturn json.cameras.push( cameraDef ) - 1;\n\n\t}\n\n\t/**\n\t * Creates glTF animation entry from AnimationClip object.\n\t *\n\t * Status:\n\t * - Only properties listed in PATH_PROPERTIES may be animated.\n\t *\n\t * @param {THREE.AnimationClip} clip\n\t * @param {THREE.Object3D} root\n\t * @return {?number}\n\t */\n\tprocessAnimation( clip, root ) {\n\n\t\tconst json = this.json;\n\t\tconst nodeMap = this.nodeMap;\n\n\t\tif ( ! json.animations ) json.animations = [];\n\n\t\tclip = GLTFExporter.Utils.mergeMorphTargetTracks( clip.clone(), root );\n\n\t\tconst tracks = clip.tracks;\n\t\tconst channels = [];\n\t\tconst samplers = [];\n\n\t\tfor ( let i = 0; i < tracks.length; ++ i ) {\n\n\t\t\tconst track = tracks[ i ];\n\t\t\tconst trackBinding = PropertyBinding.parseTrackName( track.name );\n\t\t\tlet trackNode = PropertyBinding.findNode( root, trackBinding.nodeName );\n\t\t\tconst trackProperty = PATH_PROPERTIES[ trackBinding.propertyName ];\n\n\t\t\tif ( trackBinding.objectName === 'bones' ) {\n\n\t\t\t\tif ( trackNode.isSkinnedMesh === true ) {\n\n\t\t\t\t\ttrackNode = trackNode.skeleton.getBoneByName( trackBinding.objectIndex );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttrackNode = undefined;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ! trackNode || ! trackProperty ) {\n\n\t\t\t\tconsole.warn( 'THREE.GLTFExporter: Could not export animation track \"%s\".', track.name );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst inputItemSize = 1;\n\t\t\tlet outputItemSize = track.values.length / track.times.length;\n\n\t\t\tif ( trackProperty === PATH_PROPERTIES.morphTargetInfluences ) {\n\n\t\t\t\toutputItemSize /= trackNode.morphTargetInfluences.length;\n\n\t\t\t}\n\n\t\t\tlet interpolation;\n\n\t\t\t// @TODO export CubicInterpolant(InterpolateSmooth) as CUBICSPLINE\n\n\t\t\t// Detecting glTF cubic spline interpolant by checking factory method's special property\n\t\t\t// GLTFCubicSplineInterpolant is a custom interpolant and track doesn't return\n\t\t\t// valid value from .getInterpolation().\n\t\t\tif ( track.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline === true ) {\n\n\t\t\t\tinterpolation = 'CUBICSPLINE';\n\n\t\t\t\t// itemSize of CUBICSPLINE keyframe is 9\n\t\t\t\t// (VEC3 * 3: inTangent, splineVertex, and outTangent)\n\t\t\t\t// but needs to be stored as VEC3 so dividing by 3 here.\n\t\t\t\toutputItemSize /= 3;\n\n\t\t\t} else if ( track.getInterpolation() === InterpolateDiscrete ) {\n\n\t\t\t\tinterpolation = 'STEP';\n\n\t\t\t} else {\n\n\t\t\t\tinterpolation = 'LINEAR';\n\n\t\t\t}\n\n\t\t\tsamplers.push( {\n\t\t\t\tinput: this.processAccessor( new BufferAttribute( track.times, inputItemSize ) ),\n\t\t\t\toutput: this.processAccessor( new BufferAttribute( track.values, outputItemSize ) ),\n\t\t\t\tinterpolation: interpolation\n\t\t\t} );\n\n\t\t\tchannels.push( {\n\t\t\t\tsampler: samplers.length - 1,\n\t\t\t\ttarget: {\n\t\t\t\t\tnode: nodeMap.get( trackNode ),\n\t\t\t\t\tpath: trackProperty\n\t\t\t\t}\n\t\t\t} );\n\n\t\t}\n\n\t\tconst animationDef = {\n\t\t\tname: clip.name || 'clip_' + json.animations.length,\n\t\t\tsamplers: samplers,\n\t\t\tchannels: channels\n\t\t};\n\n\t\tthis.serializeUserData( clip, animationDef );\n\n\t\tjson.animations.push( animationDef );\n\n\t\treturn json.animations.length - 1;\n\n\t}\n\n\t/**\n\t * @param {THREE.Object3D} object\n\t * @return {?number}\n\t */\n\t processSkin( object ) {\n\n\t\tconst json = this.json;\n\t\tconst nodeMap = this.nodeMap;\n\n\t\tconst node = json.nodes[ nodeMap.get( object ) ];\n\n\t\tconst skeleton = object.skeleton;\n\n\t\tif ( skeleton === undefined ) return null;\n\n\t\tconst rootJoint = object.skeleton.bones[ 0 ];\n\n\t\tif ( rootJoint === undefined ) return null;\n\n\t\tconst joints = [];\n\t\tconst inverseBindMatrices = new Float32Array( skeleton.bones.length * 16 );\n\t\tconst temporaryBoneInverse = new Matrix4();\n\n\t\tfor ( let i = 0; i < skeleton.bones.length; ++ i ) {\n\n\t\t\tjoints.push( nodeMap.get( skeleton.bones[ i ] ) );\n\t\t\ttemporaryBoneInverse.copy( skeleton.boneInverses[ i ] );\n\t\t\ttemporaryBoneInverse.multiply( object.bindMatrix ).toArray( inverseBindMatrices, i * 16 );\n\n\t\t}\n\n\t\tif ( json.skins === undefined ) json.skins = [];\n\n\t\tjson.skins.push( {\n\t\t\tinverseBindMatrices: this.processAccessor( new BufferAttribute( inverseBindMatrices, 16 ) ),\n\t\t\tjoints: joints,\n\t\t\tskeleton: nodeMap.get( rootJoint )\n\t\t} );\n\n\t\tconst skinIndex = node.skin = json.skins.length - 1;\n\n\t\treturn skinIndex;\n\n\t}\n\n\t/**\n\t * Process Object3D node\n\t * @param {THREE.Object3D} object Object3D to processNodeAsync\n\t * @return {Promise<number>} Index of the node in the nodes list\n\t */\n\tasync processNodeAsync( object ) {\n\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\t\tconst nodeMap = this.nodeMap;\n\n\t\tif ( ! json.nodes ) json.nodes = [];\n\n\t\tconst nodeDef = {};\n\n\t\tif ( options.trs ) {\n\n\t\t\tconst rotation = object.quaternion.toArray();\n\t\t\tconst position = object.position.toArray();\n\t\t\tconst scale = object.scale.toArray();\n\n\t\t\tif ( ! equalArray( rotation, [ 0, 0, 0, 1 ] ) ) {\n\n\t\t\t\tnodeDef.rotation = rotation;\n\n\t\t\t}\n\n\t\t\tif ( ! equalArray( position, [ 0, 0, 0 ] ) ) {\n\n\t\t\t\tnodeDef.translation = position;\n\n\t\t\t}\n\n\t\t\tif ( ! equalArray( scale, [ 1, 1, 1 ] ) ) {\n\n\t\t\t\tnodeDef.scale = scale;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( object.matrixAutoUpdate ) {\n\n\t\t\t\tobject.updateMatrix();\n\n\t\t\t}\n\n\t\t\tif ( isIdentityMatrix( object.matrix ) === false ) {\n\n\t\t\t\tnodeDef.matrix = object.matrix.elements;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// We don't export empty strings name because it represents no-name in Three.js.\n\t\tif ( object.name !== '' ) nodeDef.name = String( object.name );\n\n\t\tthis.serializeUserData( object, nodeDef );\n\n\t\tif ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\tconst meshIndex = await this.processMeshAsync( object );\n\n\t\t\tif ( meshIndex !== null ) nodeDef.mesh = meshIndex;\n\n\t\t} else if ( object.isCamera ) {\n\n\t\t\tnodeDef.camera = this.processCamera( object );\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) this.skins.push( object );\n\n\t\tconst nodeIndex = json.nodes.push( nodeDef ) - 1;\n\t\tnodeMap.set( object, nodeIndex );\n\n\t\tif ( object.children.length > 0 ) {\n\n\t\t\tconst children = [];\n\n\t\t\tfor ( let i = 0, l = object.children.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = object.children[ i ];\n\n\t\t\t\tif ( child.visible || options.onlyVisible === false ) {\n\n\t\t\t\t\tconst childNodeIndex = await this.processNodeAsync( child );\n\n\t\t\t\t\tif ( childNodeIndex !== null ) children.push( childNodeIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( children.length > 0 ) nodeDef.children = children;\n\n\t\t}\n\n\t\tawait this._invokeAllAsync( function ( ext ) {\n\n\t\t\text.writeNode && ext.writeNode( object, nodeDef );\n\n\t\t} );\n\n\t\treturn nodeIndex;\n\n\t}\n\n\t/**\n\t * Process Scene\n\t * @param {Scene} scene Scene to process\n\t */\n\tasync processSceneAsync( scene ) {\n\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\n\t\tif ( ! json.scenes ) {\n\n\t\t\tjson.scenes = [];\n\t\t\tjson.scene = 0;\n\n\t\t}\n\n\t\tconst sceneDef = {};\n\n\t\tif ( scene.name !== '' ) sceneDef.name = scene.name;\n\n\t\tjson.scenes.push( sceneDef );\n\n\t\tconst nodes = [];\n\n\t\tfor ( let i = 0, l = scene.children.length; i < l; i ++ ) {\n\n\t\t\tconst child = scene.children[ i ];\n\n\t\t\tif ( child.visible || options.onlyVisible === false ) {\n\n\t\t\t\tconst nodeIndex = await this.processNodeAsync( child );\n\n\t\t\t\tif ( nodeIndex !== null ) nodes.push( nodeIndex );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( nodes.length > 0 ) sceneDef.nodes = nodes;\n\n\t\tthis.serializeUserData( scene, sceneDef );\n\n\t}\n\n\t/**\n\t * Creates a Scene to hold a list of objects and parse it\n\t * @param {Array<THREE.Object3D>} objects List of objects to process\n\t */\n\tasync processObjectsAsync( objects ) {\n\n\t\tconst scene = new Scene();\n\t\tscene.name = 'AuxScene';\n\n\t\tfor ( let i = 0; i < objects.length; i ++ ) {\n\n\t\t\t// We push directly to children instead of calling `add` to prevent\n\t\t\t// modify the .parent and break its original scene and hierarchy\n\t\t\tscene.children.push( objects[ i ] );\n\n\t\t}\n\n\t\tawait this.processSceneAsync( scene );\n\n\t}\n\n\t/**\n\t * @param {THREE.Object3D|Array<THREE.Object3D>} input\n\t */\n\tasync processInputAsync( input ) {\n\n\t\tconst options = this.options;\n\n\t\tinput = input instanceof Array ? input : [ input ];\n\n\t\tawait this._invokeAllAsync( function ( ext ) {\n\n\t\t\text.beforeParse && ext.beforeParse( input );\n\n\t\t} );\n\n\t\tconst objectsWithoutScene = [];\n\n\t\tfor ( let i = 0; i < input.length; i ++ ) {\n\n\t\t\tif ( input[ i ] instanceof Scene ) {\n\n\t\t\t\tawait this.processSceneAsync( input[ i ] );\n\n\t\t\t} else {\n\n\t\t\t\tobjectsWithoutScene.push( input[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( objectsWithoutScene.length > 0 ) {\n\n\t\t\tawait this.processObjectsAsync( objectsWithoutScene );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < this.skins.length; ++ i ) {\n\n\t\t\tthis.processSkin( this.skins[ i ] );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < options.animations.length; ++ i ) {\n\n\t\t\tthis.processAnimation( options.animations[ i ], input[ 0 ] );\n\n\t\t}\n\n\t\tawait this._invokeAllAsync( function ( ext ) {\n\n\t\t\text.afterParse && ext.afterParse( input );\n\n\t\t} );\n\n\t}\n\n\tasync _invokeAllAsync( func ) {\n\n\t\tfor ( let i = 0, il = this.plugins.length; i < il; i ++ ) {\n\n\t\t\tawait func( this.plugins[ i ] );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Punctual Lights Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual\n *\n * @private\n */\nclass GLTFLightExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_lights_punctual';\n\n\t}\n\n\twriteNode( light, nodeDef ) {\n\n\t\tif ( ! light.isLight ) return;\n\n\t\tif ( ! light.isDirectionalLight && ! light.isPointLight && ! light.isSpotLight ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: Only directional, point, and spot lights are supported.', light );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst writer = this.writer;\n\t\tconst json = writer.json;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst lightDef = {};\n\n\t\tif ( light.name ) lightDef.name = light.name;\n\n\t\tlightDef.color = light.color.toArray();\n\n\t\tlightDef.intensity = light.intensity;\n\n\t\tif ( light.isDirectionalLight ) {\n\n\t\t\tlightDef.type = 'directional';\n\n\t\t} else if ( light.isPointLight ) {\n\n\t\t\tlightDef.type = 'point';\n\n\t\t\tif ( light.distance > 0 ) lightDef.range = light.distance;\n\n\t\t} else if ( light.isSpotLight ) {\n\n\t\t\tlightDef.type = 'spot';\n\n\t\t\tif ( light.distance > 0 ) lightDef.range = light.distance;\n\n\t\t\tlightDef.spot = {};\n\t\t\tlightDef.spot.innerConeAngle = ( 1.0 - light.penumbra ) * light.angle;\n\t\t\tlightDef.spot.outerConeAngle = light.angle;\n\n\t\t}\n\n\t\tif ( light.decay !== undefined && light.decay !== 2 ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: Light decay may be lost. glTF is physically-based, '\n\t\t\t\t+ 'and expects light.decay=2.' );\n\n\t\t}\n\n\t\tif ( light.target\n\t\t\t\t&& ( light.target.parent !== light\n\t\t\t\t|| light.target.position.x !== 0\n\t\t\t\t|| light.target.position.y !== 0\n\t\t\t\t|| light.target.position.z !== - 1 ) ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFExporter: Light direction may be lost. For best results, '\n\t\t\t\t+ 'make light.target a child of the light with position 0,0,-1.' );\n\n\t\t}\n\n\t\tif ( ! extensionsUsed[ this.name ] ) {\n\n\t\t\tjson.extensions = json.extensions || {};\n\t\t\tjson.extensions[ this.name ] = { lights: [] };\n\t\t\textensionsUsed[ this.name ] = true;\n\n\t\t}\n\n\t\tconst lights = json.extensions[ this.name ].lights;\n\t\tlights.push( lightDef );\n\n\t\tnodeDef.extensions = nodeDef.extensions || {};\n\t\tnodeDef.extensions[ this.name ] = { light: lights.length - 1 };\n\n\t}\n\n}\n\n/**\n * Unlit Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit\n *\n * @private\n */\nclass GLTFMaterialsUnlitExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_unlit';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshBasicMaterial ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = {};\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t\tmaterialDef.pbrMetallicRoughness.metallicFactor = 0.0;\n\t\tmaterialDef.pbrMetallicRoughness.roughnessFactor = 0.9;\n\n\t}\n\n}\n\n/**\n * Clearcoat Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat\n *\n * @private\n */\nclass GLTFMaterialsClearcoatExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_clearcoat';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.clearcoat === 0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.clearcoatFactor = material.clearcoat;\n\n\t\tif ( material.clearcoatMap ) {\n\n\t\t\tconst clearcoatMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.clearcoatMap ),\n\t\t\t\ttexCoord: material.clearcoatMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( clearcoatMapDef, material.clearcoatMap );\n\t\t\textensionDef.clearcoatTexture = clearcoatMapDef;\n\n\t\t}\n\n\t\textensionDef.clearcoatRoughnessFactor = material.clearcoatRoughness;\n\n\t\tif ( material.clearcoatRoughnessMap ) {\n\n\t\t\tconst clearcoatRoughnessMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.clearcoatRoughnessMap ),\n\t\t\t\ttexCoord: material.clearcoatRoughnessMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( clearcoatRoughnessMapDef, material.clearcoatRoughnessMap );\n\t\t\textensionDef.clearcoatRoughnessTexture = clearcoatRoughnessMapDef;\n\n\t\t}\n\n\t\tif ( material.clearcoatNormalMap ) {\n\n\t\t\tconst clearcoatNormalMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.clearcoatNormalMap ),\n\t\t\t\ttexCoord: material.clearcoatNormalMap.channel\n\t\t\t};\n\n\t\t\tif ( material.clearcoatNormalScale.x !== 1 ) clearcoatNormalMapDef.scale = material.clearcoatNormalScale.x;\n\n\t\t\twriter.applyTextureTransform( clearcoatNormalMapDef, material.clearcoatNormalMap );\n\t\t\textensionDef.clearcoatNormalTexture = clearcoatNormalMapDef;\n\n\t\t}\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\n\t}\n\n}\n\n/**\n * Materials dispersion Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_dispersion\n *\n * @private\n */\nclass GLTFMaterialsDispersionExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_dispersion';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.dispersion === 0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.dispersion = material.dispersion;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Iridescence Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_iridescence\n *\n * @private\n */\nclass GLTFMaterialsIridescenceExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_iridescence';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.iridescence === 0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.iridescenceFactor = material.iridescence;\n\n\t\tif ( material.iridescenceMap ) {\n\n\t\t\tconst iridescenceMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.iridescenceMap ),\n\t\t\t\ttexCoord: material.iridescenceMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( iridescenceMapDef, material.iridescenceMap );\n\t\t\textensionDef.iridescenceTexture = iridescenceMapDef;\n\n\t\t}\n\n\t\textensionDef.iridescenceIor = material.iridescenceIOR;\n\t\textensionDef.iridescenceThicknessMinimum = material.iridescenceThicknessRange[ 0 ];\n\t\textensionDef.iridescenceThicknessMaximum = material.iridescenceThicknessRange[ 1 ];\n\n\t\tif ( material.iridescenceThicknessMap ) {\n\n\t\t\tconst iridescenceThicknessMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.iridescenceThicknessMap ),\n\t\t\t\ttexCoord: material.iridescenceThicknessMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( iridescenceThicknessMapDef, material.iridescenceThicknessMap );\n\t\t\textensionDef.iridescenceThicknessTexture = iridescenceThicknessMapDef;\n\n\t\t}\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Transmission Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission\n *\n * @private\n */\nclass GLTFMaterialsTransmissionExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_transmission';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.transmission === 0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.transmissionFactor = material.transmission;\n\n\t\tif ( material.transmissionMap ) {\n\n\t\t\tconst transmissionMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.transmissionMap ),\n\t\t\t\ttexCoord: material.transmissionMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( transmissionMapDef, material.transmissionMap );\n\t\t\textensionDef.transmissionTexture = transmissionMapDef;\n\n\t\t}\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Materials Volume Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume\n *\n * @private\n */\nclass GLTFMaterialsVolumeExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_volume';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.transmission === 0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.thicknessFactor = material.thickness;\n\n\t\tif ( material.thicknessMap ) {\n\n\t\t\tconst thicknessMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.thicknessMap ),\n\t\t\t\ttexCoord: material.thicknessMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( thicknessMapDef, material.thicknessMap );\n\t\t\textensionDef.thicknessTexture = thicknessMapDef;\n\n\t\t}\n\n\t\tif ( material.attenuationDistance !== Infinity ) {\n\n\t\t\textensionDef.attenuationDistance = material.attenuationDistance;\n\n\t\t}\n\n\t\textensionDef.attenuationColor = material.attenuationColor.toArray();\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Materials ior Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior\n *\n * @private\n */\nclass GLTFMaterialsIorExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_ior';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.ior === 1.5 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.ior = material.ior;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Materials specular Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_specular\n *\n * @private\n */\nclass GLTFMaterialsSpecularExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_specular';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || ( material.specularIntensity === 1.0 &&\n\t\t       material.specularColor.equals( DEFAULT_SPECULAR_COLOR ) &&\n\t\t     ! material.specularIntensityMap && ! material.specularColorMap ) ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\tif ( material.specularIntensityMap ) {\n\n\t\t\tconst specularIntensityMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.specularIntensityMap ),\n\t\t\t\ttexCoord: material.specularIntensityMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( specularIntensityMapDef, material.specularIntensityMap );\n\t\t\textensionDef.specularTexture = specularIntensityMapDef;\n\n\t\t}\n\n\t\tif ( material.specularColorMap ) {\n\n\t\t\tconst specularColorMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.specularColorMap ),\n\t\t\t\ttexCoord: material.specularColorMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( specularColorMapDef, material.specularColorMap );\n\t\t\textensionDef.specularColorTexture = specularColorMapDef;\n\n\t\t}\n\n\t\textensionDef.specularFactor = material.specularIntensity;\n\t\textensionDef.specularColorFactor = material.specularColor.toArray();\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Sheen Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen\n *\n * @private\n */\nclass GLTFMaterialsSheenExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_sheen';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.sheen == 0.0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\tif ( material.sheenRoughnessMap ) {\n\n\t\t\tconst sheenRoughnessMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.sheenRoughnessMap ),\n\t\t\t\ttexCoord: material.sheenRoughnessMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( sheenRoughnessMapDef, material.sheenRoughnessMap );\n\t\t\textensionDef.sheenRoughnessTexture = sheenRoughnessMapDef;\n\n\t\t}\n\n\t\tif ( material.sheenColorMap ) {\n\n\t\t\tconst sheenColorMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.sheenColorMap ),\n\t\t\t\ttexCoord: material.sheenColorMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( sheenColorMapDef, material.sheenColorMap );\n\t\t\textensionDef.sheenColorTexture = sheenColorMapDef;\n\n\t\t}\n\n\t\textensionDef.sheenRoughnessFactor = material.sheenRoughness;\n\t\textensionDef.sheenColorFactor = material.sheenColor.toArray();\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Anisotropy Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_anisotropy\n *\n * @private\n */\nclass GLTFMaterialsAnisotropyExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_anisotropy';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshPhysicalMaterial || material.anisotropy == 0.0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\tif ( material.anisotropyMap ) {\n\n\t\t\tconst anisotropyMapDef = { index: await writer.processTextureAsync( material.anisotropyMap ) };\n\t\t\twriter.applyTextureTransform( anisotropyMapDef, material.anisotropyMap );\n\t\t\textensionDef.anisotropyTexture = anisotropyMapDef;\n\n\t\t}\n\n\t\textensionDef.anisotropyStrength = material.anisotropy;\n\t\textensionDef.anisotropyRotation = material.anisotropyRotation;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Materials Emissive Strength Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/blob/5768b3ce0ef32bc39cdf1bef10b948586635ead3/extensions/2.0/Khronos/KHR_materials_emissive_strength/README.md\n *\n * @private\n */\nclass GLTFMaterialsEmissiveStrengthExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'KHR_materials_emissive_strength';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshStandardMaterial || material.emissiveIntensity === 1.0 ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\textensionDef.emissiveStrength = material.emissiveIntensity;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n\n/**\n * Materials bump Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/EXT_materials_bump\n *\n * @private\n */\nclass GLTFMaterialsBumpExtension {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'EXT_materials_bump';\n\n\t}\n\n\tasync writeMaterialAsync( material, materialDef ) {\n\n\t\tif ( ! material.isMeshStandardMaterial || (\n\t\t       material.bumpScale === 1 &&\n\t\t     ! material.bumpMap ) ) return;\n\n\t\tconst writer = this.writer;\n\t\tconst extensionsUsed = writer.extensionsUsed;\n\n\t\tconst extensionDef = {};\n\n\t\tif ( material.bumpMap ) {\n\n\t\t\tconst bumpMapDef = {\n\t\t\t\tindex: await writer.processTextureAsync( material.bumpMap ),\n\t\t\t\ttexCoord: material.bumpMap.channel\n\t\t\t};\n\t\t\twriter.applyTextureTransform( bumpMapDef, material.bumpMap );\n\t\t\textensionDef.bumpTexture = bumpMapDef;\n\n\t\t}\n\n\t\textensionDef.bumpFactor = material.bumpScale;\n\n\t\tmaterialDef.extensions = materialDef.extensions || {};\n\t\tmaterialDef.extensions[ this.name ] = extensionDef;\n\n\t\textensionsUsed[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * GPU Instancing Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_mesh_gpu_instancing\n *\n * @private\n */\nclass GLTFMeshGpuInstancing {\n\n\tconstructor( writer ) {\n\n\t\tthis.writer = writer;\n\t\tthis.name = 'EXT_mesh_gpu_instancing';\n\n\t}\n\n\twriteNode( object, nodeDef ) {\n\n\t\tif ( ! object.isInstancedMesh ) return;\n\n\t\tconst writer = this.writer;\n\n\t\tconst mesh = object;\n\n\t\tconst translationAttr = new Float32Array( mesh.count * 3 );\n\t\tconst rotationAttr = new Float32Array( mesh.count * 4 );\n\t\tconst scaleAttr = new Float32Array( mesh.count * 3 );\n\n\t\tconst matrix = new Matrix4();\n\t\tconst position = new Vector3();\n\t\tconst quaternion = new Quaternion();\n\t\tconst scale = new Vector3();\n\n\t\tfor ( let i = 0; i < mesh.count; i ++ ) {\n\n\t\t\tmesh.getMatrixAt( i, matrix );\n\t\t\tmatrix.decompose( position, quaternion, scale );\n\n\t\t\tposition.toArray( translationAttr, i * 3 );\n\t\t\tquaternion.toArray( rotationAttr, i * 4 );\n\t\t\tscale.toArray( scaleAttr, i * 3 );\n\n\t\t}\n\n\t\tconst attributes = {\n\t\t\tTRANSLATION: writer.processAccessor( new BufferAttribute( translationAttr, 3 ) ),\n\t\t\tROTATION: writer.processAccessor( new BufferAttribute( rotationAttr, 4 ) ),\n\t\t\tSCALE: writer.processAccessor( new BufferAttribute( scaleAttr, 3 ) ),\n\t\t};\n\n\t\tif ( mesh.instanceColor )\n\t\t\tattributes._COLOR_0 = writer.processAccessor( mesh.instanceColor );\n\n\t\tnodeDef.extensions = nodeDef.extensions || {};\n\t\tnodeDef.extensions[ this.name ] = { attributes };\n\n\t\twriter.extensionsUsed[ this.name ] = true;\n\t\twriter.extensionsRequired[ this.name ] = true;\n\n\t}\n\n}\n\n/**\n * Static utility functions\n *\n * @private\n */\nGLTFExporter.Utils = {\n\n\tinsertKeyframe: function ( track, time ) {\n\n\t\tconst tolerance = 0.001; // 1ms\n\t\tconst valueSize = track.getValueSize();\n\n\t\tconst times = new track.TimeBufferType( track.times.length + 1 );\n\t\tconst values = new track.ValueBufferType( track.values.length + valueSize );\n\t\tconst interpolant = track.createInterpolant( new track.ValueBufferType( valueSize ) );\n\n\t\tlet index;\n\n\t\tif ( track.times.length === 0 ) {\n\n\t\t\ttimes[ 0 ] = time;\n\n\t\t\tfor ( let i = 0; i < valueSize; i ++ ) {\n\n\t\t\t\tvalues[ i ] = 0;\n\n\t\t\t}\n\n\t\t\tindex = 0;\n\n\t\t} else if ( time < track.times[ 0 ] ) {\n\n\t\t\tif ( Math.abs( track.times[ 0 ] - time ) < tolerance ) return 0;\n\n\t\t\ttimes[ 0 ] = time;\n\t\t\ttimes.set( track.times, 1 );\n\n\t\t\tvalues.set( interpolant.evaluate( time ), 0 );\n\t\t\tvalues.set( track.values, valueSize );\n\n\t\t\tindex = 0;\n\n\t\t} else if ( time > track.times[ track.times.length - 1 ] ) {\n\n\t\t\tif ( Math.abs( track.times[ track.times.length - 1 ] - time ) < tolerance ) {\n\n\t\t\t\treturn track.times.length - 1;\n\n\t\t\t}\n\n\t\t\ttimes[ times.length - 1 ] = time;\n\t\t\ttimes.set( track.times, 0 );\n\n\t\t\tvalues.set( track.values, 0 );\n\t\t\tvalues.set( interpolant.evaluate( time ), track.values.length );\n\n\t\t\tindex = times.length - 1;\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0; i < track.times.length; i ++ ) {\n\n\t\t\t\tif ( Math.abs( track.times[ i ] - time ) < tolerance ) return i;\n\n\t\t\t\tif ( track.times[ i ] < time && track.times[ i + 1 ] > time ) {\n\n\t\t\t\t\ttimes.set( track.times.slice( 0, i + 1 ), 0 );\n\t\t\t\t\ttimes[ i + 1 ] = time;\n\t\t\t\t\ttimes.set( track.times.slice( i + 1 ), i + 2 );\n\n\t\t\t\t\tvalues.set( track.values.slice( 0, ( i + 1 ) * valueSize ), 0 );\n\t\t\t\t\tvalues.set( interpolant.evaluate( time ), ( i + 1 ) * valueSize );\n\t\t\t\t\tvalues.set( track.values.slice( ( i + 1 ) * valueSize ), ( i + 2 ) * valueSize );\n\n\t\t\t\t\tindex = i + 1;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\ttrack.times = times;\n\t\ttrack.values = values;\n\n\t\treturn index;\n\n\t},\n\n\tmergeMorphTargetTracks: function ( clip, root ) {\n\n\t\tconst tracks = [];\n\t\tconst mergedTracks = {};\n\t\tconst sourceTracks = clip.tracks;\n\n\t\tfor ( let i = 0; i < sourceTracks.length; ++ i ) {\n\n\t\t\tlet sourceTrack = sourceTracks[ i ];\n\t\t\tconst sourceTrackBinding = PropertyBinding.parseTrackName( sourceTrack.name );\n\t\t\tconst sourceTrackNode = PropertyBinding.findNode( root, sourceTrackBinding.nodeName );\n\n\t\t\tif ( sourceTrackBinding.propertyName !== 'morphTargetInfluences' || sourceTrackBinding.propertyIndex === undefined ) {\n\n\t\t\t\t// Tracks that don't affect morph targets, or that affect all morph targets together, can be left as-is.\n\t\t\t\ttracks.push( sourceTrack );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tif ( sourceTrack.createInterpolant !== sourceTrack.InterpolantFactoryMethodDiscrete\n\t\t\t\t&& sourceTrack.createInterpolant !== sourceTrack.InterpolantFactoryMethodLinear ) {\n\n\t\t\t\tif ( sourceTrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline ) {\n\n\t\t\t\t\t// This should never happen, because glTF morph target animations\n\t\t\t\t\t// affect all targets already.\n\t\t\t\t\tthrow new Error( 'THREE.GLTFExporter: Cannot merge tracks with glTF CUBICSPLINE interpolation.' );\n\n\t\t\t\t}\n\n\t\t\t\tconsole.warn( 'THREE.GLTFExporter: Morph target interpolation mode not yet supported. Using LINEAR instead.' );\n\n\t\t\t\tsourceTrack = sourceTrack.clone();\n\t\t\t\tsourceTrack.setInterpolation( InterpolateLinear );\n\n\t\t\t}\n\n\t\t\tconst targetCount = sourceTrackNode.morphTargetInfluences.length;\n\t\t\tconst targetIndex = sourceTrackNode.morphTargetDictionary[ sourceTrackBinding.propertyIndex ];\n\n\t\t\tif ( targetIndex === undefined ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFExporter: Morph target name not found: ' + sourceTrackBinding.propertyIndex );\n\n\t\t\t}\n\n\t\t\tlet mergedTrack;\n\n\t\t\t// If this is the first time we've seen this object, create a new\n\t\t\t// track to store merged keyframe data for each morph target.\n\t\t\tif ( mergedTracks[ sourceTrackNode.uuid ] === undefined ) {\n\n\t\t\t\tmergedTrack = sourceTrack.clone();\n\n\t\t\t\tconst values = new mergedTrack.ValueBufferType( targetCount * mergedTrack.times.length );\n\n\t\t\t\tfor ( let j = 0; j < mergedTrack.times.length; j ++ ) {\n\n\t\t\t\t\tvalues[ j * targetCount + targetIndex ] = mergedTrack.values[ j ];\n\n\t\t\t\t}\n\n\t\t\t\t// We need to take into consideration the intended target node\n\t\t\t\t// of our original un-merged morphTarget animation.\n\t\t\t\tmergedTrack.name = ( sourceTrackBinding.nodeName || '' ) + '.morphTargetInfluences';\n\t\t\t\tmergedTrack.values = values;\n\n\t\t\t\tmergedTracks[ sourceTrackNode.uuid ] = mergedTrack;\n\t\t\t\ttracks.push( mergedTrack );\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst sourceInterpolant = sourceTrack.createInterpolant( new sourceTrack.ValueBufferType( 1 ) );\n\n\t\t\tmergedTrack = mergedTracks[ sourceTrackNode.uuid ];\n\n\t\t\t// For every existing keyframe of the merged track, write a (possibly\n\t\t\t// interpolated) value from the source track.\n\t\t\tfor ( let j = 0; j < mergedTrack.times.length; j ++ ) {\n\n\t\t\t\tmergedTrack.values[ j * targetCount + targetIndex ] = sourceInterpolant.evaluate( mergedTrack.times[ j ] );\n\n\t\t\t}\n\n\t\t\t// For every existing keyframe of the source track, write a (possibly\n\t\t\t// new) keyframe to the merged track. Values from the previous loop may\n\t\t\t// be written again, but keyframes are de-duplicated.\n\t\t\tfor ( let j = 0; j < sourceTrack.times.length; j ++ ) {\n\n\t\t\t\tconst keyframeIndex = this.insertKeyframe( mergedTrack, sourceTrack.times[ j ] );\n\t\t\t\tmergedTrack.values[ keyframeIndex * targetCount + targetIndex ] = sourceTrack.values[ j ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tclip.tracks = tracks;\n\n\t\treturn clip;\n\n\t},\n\n\ttoFloat32BufferAttribute: function ( srcAttribute ) {\n\n\t\tconst dstAttribute = new BufferAttribute( new Float32Array( srcAttribute.count * srcAttribute.itemSize ), srcAttribute.itemSize, false );\n\n\t\tif ( ! srcAttribute.normalized && ! srcAttribute.isInterleavedBufferAttribute ) {\n\n\t\t\tdstAttribute.array.set( srcAttribute.array );\n\n\t\t\treturn dstAttribute;\n\n\t\t}\n\n\t\tfor ( let i = 0, il = srcAttribute.count; i < il; i ++ ) {\n\n\t\t\tfor ( let j = 0; j < srcAttribute.itemSize; j ++ ) {\n\n\t\t\t\tdstAttribute.setComponent( i, j, srcAttribute.getComponent( i, j ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn dstAttribute;\n\n\t}\n\n};\n\n/**\n * Export options of `GLTFExporter`.\n *\n * @typedef {Object} GLTFExporter~Options\n * @property {boolean} [trs=false] - Export position, rotation and scale instead of matrix per node.\n * @property {boolean} [onlyVisible=true] - Export only visible 3D objects.\n * @property {boolean} [binary=false] - Export in binary (.glb) format, returning an ArrayBuffer.\n * @property {number} [maxTextureSize=Infinity] - Restricts the image maximum size (both width and height) to the given value.\n * @property {Array<AnimationClip>} [animations=[]] - List of animations to be included in the export.\n * @property {boolean} [includeCustomExtensions=false] - Export custom glTF extensions defined on an object's `userData.gltfExtensions` property.\n **/\n\n/**\n * onDone callback of `GLTFExporter`.\n *\n * @callback GLTFExporter~OnDone\n * @param {ArrayBuffer|string} result - The generated .gltf (JSON) or .glb (binary).\n */\n\n/**\n * onError callback of `GLTFExporter`.\n *\n * @callback GLTFExporter~OnError\n * @param {Error} error - The error object.\n */\n\nexport { GLTFExporter };\n", "const t=0,e=1,n=2,i=3,s=0,a=0,r=2,o=0,l=1,f=160,c=161,U=162,h=163,p=166,_=0,u=1,g=0,x=1,y=2,b=3,m=4,d=5,D=6,w=7,v=8,B=9,L=10,A=11,k=12,I=13,V=14,C=15,F=16,O=17,T=18,S=0,E=1,P=2,M=3,N=4,W=5,H=6,z=7,j=8,K=9,X=10,Y=11,R=0,G=1,q=2,J=13,Q=14,Z=15,$=128,tt=64,et=32,nt=16,it=0,st=1,at=2,rt=3,ot=4,lt=5,ft=6,ct=7,Ut=8,ht=9,pt=10,_t=13,ut=14,gt=15,xt=16,yt=17,bt=20,mt=21,dt=22,Dt=23,wt=24,vt=27,Bt=28,Lt=29,At=30,kt=31,It=34,Vt=35,Ct=36,Ft=37,Ot=38,Tt=41,St=42,Et=43,Pt=44,Mt=45,Nt=48,Wt=49,Ht=50,zt=58,jt=59,Kt=62,Xt=63,Yt=64,Rt=65,Gt=68,qt=69,Jt=70,Qt=71,Zt=74,$t=75,te=76,ee=77,ne=78,ie=81,se=82,ae=83,re=84,oe=85,le=88,fe=89,ce=90,Ue=91,he=92,pe=95,_e=96,ue=97,ge=98,xe=99,ye=100,be=101,me=102,de=103,De=104,we=105,ve=106,Be=107,Le=108,Ae=109,ke=110,Ie=111,Ve=112,Ce=113,Fe=114,Oe=115,Te=116,Se=117,Ee=118,Pe=119,Me=120,Ne=121,We=122,He=123,ze=124,je=125,Ke=126,Xe=127,Ye=128,Re=129,Ge=130,qe=131,Je=132,Qe=133,Ze=134,$e=135,tn=136,en=137,nn=138,sn=139,an=140,rn=141,on=142,ln=143,fn=144,cn=145,Un=146,hn=147,pn=148,_n=149,un=150,gn=151,xn=152,yn=153,bn=154,mn=155,dn=156,Dn=157,wn=158,vn=159,Bn=160,Ln=161,An=162,kn=163,In=164,Vn=165,Cn=166,Fn=167,On=168,Tn=169,Sn=170,En=171,Pn=172,Mn=173,Nn=174,Wn=175,Hn=176,zn=177,jn=178,Kn=179,Xn=180,Yn=181,Rn=182,Gn=183,qn=184,Jn=1000156007,Qn=1000156008,Zn=1000156009,$n=1000156010,ti=1000156011,ei=1000156017,ni=1000156018,ii=1000156019,si=1000156020,ai=1000156021,ri=1000054e3,oi=1000054001,li=1000054002,fi=1000054003,ci=1000054004,Ui=1000054005,hi=1000054006,pi=1000054007,_i=1000066e3,ui=1000066001,gi=1000066002,xi=1000066003,yi=1000066004,bi=1000066005,mi=1000066006,di=1000066007,Di=1000066008,wi=1000066009,vi=1000066010,Bi=1000066011,Li=1000066012,Ai=1000066013,ki=100034e4,Ii=1000340001;function Vi(){return{vkFormat:0,typeSize:1,pixelWidth:0,pixelHeight:0,pixelDepth:0,layerCount:0,faceCount:1,levelCount:0,supercompressionScheme:0,levels:[],dataFormatDescriptor:[{vendorId:0,descriptorType:0,versionNumber:2,colorModel:0,colorPrimaries:1,transferFunction:2,flags:0,texelBlockDimension:[0,0,0,0],bytesPlane:[0,0,0,0,0,0,0,0],samples:[]}],keyValue:{},globalData:null}}class Ci{constructor(t,e,n,i){this._dataView=void 0,this._littleEndian=void 0,this._offset=void 0,this._dataView=new DataView(t.buffer,t.byteOffset+e,n),this._littleEndian=i,this._offset=0}_nextUint8(){const t=this._dataView.getUint8(this._offset);return this._offset+=1,t}_nextUint16(){const t=this._dataView.getUint16(this._offset,this._littleEndian);return this._offset+=2,t}_nextUint32(){const t=this._dataView.getUint32(this._offset,this._littleEndian);return this._offset+=4,t}_nextUint64(){const t=this._dataView.getUint32(this._offset,this._littleEndian)+2**32*this._dataView.getUint32(this._offset+4,this._littleEndian);return this._offset+=8,t}_nextInt32(){const t=this._dataView.getInt32(this._offset,this._littleEndian);return this._offset+=4,t}_nextUint8Array(t){const e=new Uint8Array(this._dataView.buffer,this._dataView.byteOffset+this._offset,t);return this._offset+=t,e}_skip(t){return this._offset+=t,this}_scan(t,e=0){const n=this._offset;let i=0;for(;this._dataView.getUint8(this._offset)!==e&&i<t;)i++,this._offset++;return i<t&&this._offset++,new Uint8Array(this._dataView.buffer,this._dataView.byteOffset+n,i)}}const Fi=new Uint8Array([0]),Oi=[171,75,84,88,32,50,48,187,13,10,26,10];function Ti(t){return(new TextEncoder).encode(t)}function Si(t){return(new TextDecoder).decode(t)}function Ei(t){let e=0;for(const n of t)e+=n.byteLength;const n=new Uint8Array(e);let i=0;for(const e of t)n.set(new Uint8Array(e),i),i+=e.byteLength;return n}function Pi(t,e=4){return Math.ceil(t/e)*e-t}function Mi(t){const e=new Uint8Array(t.buffer,t.byteOffset,Oi.length);if(e[0]!==Oi[0]||e[1]!==Oi[1]||e[2]!==Oi[2]||e[3]!==Oi[3]||e[4]!==Oi[4]||e[5]!==Oi[5]||e[6]!==Oi[6]||e[7]!==Oi[7]||e[8]!==Oi[8]||e[9]!==Oi[9]||e[10]!==Oi[10]||e[11]!==Oi[11])throw new Error(\"Missing KTX 2.0 identifier.\");const n={vkFormat:0,typeSize:1,pixelWidth:0,pixelHeight:0,pixelDepth:0,layerCount:0,faceCount:1,levelCount:0,supercompressionScheme:0,levels:[],dataFormatDescriptor:[{vendorId:0,descriptorType:0,versionNumber:2,colorModel:0,colorPrimaries:1,transferFunction:2,flags:0,texelBlockDimension:[0,0,0,0],bytesPlane:[0,0,0,0,0,0,0,0],samples:[]}],keyValue:{},globalData:null},i=17*Uint32Array.BYTES_PER_ELEMENT,s=new Ci(t,Oi.length,i,!0);n.vkFormat=s._nextUint32(),n.typeSize=s._nextUint32(),n.pixelWidth=s._nextUint32(),n.pixelHeight=s._nextUint32(),n.pixelDepth=s._nextUint32(),n.layerCount=s._nextUint32(),n.faceCount=s._nextUint32(),n.levelCount=s._nextUint32(),n.supercompressionScheme=s._nextUint32();const a=s._nextUint32(),r=s._nextUint32(),o=s._nextUint32(),l=s._nextUint32(),f=s._nextUint64(),c=s._nextUint64(),U=3*Math.max(n.levelCount,1)*8,h=new Ci(t,Oi.length+i,U,!0);for(let e=0,i=Math.max(n.levelCount,1);e<i;e++)n.levels.push({levelData:new Uint8Array(t.buffer,t.byteOffset+h._nextUint64(),h._nextUint64()),uncompressedByteLength:h._nextUint64()});const p=new Ci(t,a,r,!0);p._skip(4);const _=p._nextUint16(),u=p._nextUint16(),g=p._nextUint16(),x=p._nextUint16(),y={vendorId:_,descriptorType:u,versionNumber:g,colorModel:p._nextUint8(),colorPrimaries:p._nextUint8(),transferFunction:p._nextUint8(),flags:p._nextUint8(),texelBlockDimension:[p._nextUint8(),p._nextUint8(),p._nextUint8(),p._nextUint8()],bytesPlane:[p._nextUint8(),p._nextUint8(),p._nextUint8(),p._nextUint8(),p._nextUint8(),p._nextUint8(),p._nextUint8(),p._nextUint8()],samples:[]},b=(x/4-6)/4;for(let t=0;t<b;t++){const e={bitOffset:p._nextUint16(),bitLength:p._nextUint8(),channelType:p._nextUint8(),samplePosition:[p._nextUint8(),p._nextUint8(),p._nextUint8(),p._nextUint8()],sampleLower:Number.NEGATIVE_INFINITY,sampleUpper:Number.POSITIVE_INFINITY};64&e.channelType?(e.sampleLower=p._nextInt32(),e.sampleUpper=p._nextInt32()):(e.sampleLower=p._nextUint32(),e.sampleUpper=p._nextUint32()),y.samples[t]=e}n.dataFormatDescriptor.length=0,n.dataFormatDescriptor.push(y);const m=new Ci(t,o,l,!0);for(;m._offset<l;){const t=m._nextUint32(),e=m._scan(t),i=Si(e);if(n.keyValue[i]=m._nextUint8Array(t-e.byteLength-1),i.match(/^ktx/i)){const t=Si(n.keyValue[i]);n.keyValue[i]=t.substring(0,t.lastIndexOf(\"\\0\"))}m._skip(t%4?4-t%4:0)}if(c<=0)return n;const d=new Ci(t,f,c,!0),D=d._nextUint16(),w=d._nextUint16(),v=d._nextUint32(),B=d._nextUint32(),L=d._nextUint32(),A=d._nextUint32(),k=[];for(let t=0,e=Math.max(n.levelCount,1);t<e;t++)k.push({imageFlags:d._nextUint32(),rgbSliceByteOffset:d._nextUint32(),rgbSliceByteLength:d._nextUint32(),alphaSliceByteOffset:d._nextUint32(),alphaSliceByteLength:d._nextUint32()});const I=f+d._offset,V=I+v,C=V+B,F=C+L,O=new Uint8Array(t.buffer,t.byteOffset+I,v),T=new Uint8Array(t.buffer,t.byteOffset+V,B),S=new Uint8Array(t.buffer,t.byteOffset+C,L),E=new Uint8Array(t.buffer,t.byteOffset+F,A);return n.globalData={endpointCount:D,selectorCount:w,imageDescs:k,endpointsData:O,selectorsData:T,tablesData:S,extendedData:E},n}function Ni(){return Ni=Object.assign?Object.assign.bind():function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var i in n)({}).hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t},Ni.apply(null,arguments)}const Wi={keepWriter:!1};function Hi(t,e={}){e=Ni({},Wi,e);let n=new ArrayBuffer(0);if(t.globalData){const e=new ArrayBuffer(20+5*t.globalData.imageDescs.length*4),i=new DataView(e);i.setUint16(0,t.globalData.endpointCount,!0),i.setUint16(2,t.globalData.selectorCount,!0),i.setUint32(4,t.globalData.endpointsData.byteLength,!0),i.setUint32(8,t.globalData.selectorsData.byteLength,!0),i.setUint32(12,t.globalData.tablesData.byteLength,!0),i.setUint32(16,t.globalData.extendedData.byteLength,!0);for(let e=0;e<t.globalData.imageDescs.length;e++){const n=t.globalData.imageDescs[e];i.setUint32(20+5*e*4+0,n.imageFlags,!0),i.setUint32(20+5*e*4+4,n.rgbSliceByteOffset,!0),i.setUint32(20+5*e*4+8,n.rgbSliceByteLength,!0),i.setUint32(20+5*e*4+12,n.alphaSliceByteOffset,!0),i.setUint32(20+5*e*4+16,n.alphaSliceByteLength,!0)}n=Ei([e,t.globalData.endpointsData,t.globalData.selectorsData,t.globalData.tablesData,t.globalData.extendedData])}const i=[],s=Object.entries(Ni({},t.keyValue,!e.keepWriter&&{KTXwriter:\"KTX-Parse v1.0.1\"}));s.sort((t,e)=>t[0]>e[0]?1:-1);for(const[t,e]of s){const n=Ti(t),s=\"string\"==typeof e?Ei([Ti(e),Fi]):e,a=n.byteLength+1+s.byteLength,r=Pi(a,4);i.push(Ei([new Uint32Array([a]),n,Fi,s,new Uint8Array(r).fill(0)]))}const a=Ei(i);if(1!==t.dataFormatDescriptor.length||0!==t.dataFormatDescriptor[0].descriptorType)throw new Error(\"Only BASICFORMAT Data Format Descriptor output supported.\");const r=t.dataFormatDescriptor[0],o=new ArrayBuffer(28+16*r.samples.length),l=new DataView(o),f=24+16*r.samples.length;if(l.setUint32(0,o.byteLength,!0),l.setUint16(4,r.vendorId,!0),l.setUint16(6,r.descriptorType,!0),l.setUint16(8,r.versionNumber,!0),l.setUint16(10,f,!0),l.setUint8(12,r.colorModel),l.setUint8(13,r.colorPrimaries),l.setUint8(14,r.transferFunction),l.setUint8(15,r.flags),!Array.isArray(r.texelBlockDimension))throw new Error(\"texelBlockDimension is now an array. For dimensionality `d`, set `d - 1`.\");l.setUint8(16,r.texelBlockDimension[0]),l.setUint8(17,r.texelBlockDimension[1]),l.setUint8(18,r.texelBlockDimension[2]),l.setUint8(19,r.texelBlockDimension[3]);for(let t=0;t<8;t++)l.setUint8(20+t,r.bytesPlane[t]);for(let t=0;t<r.samples.length;t++){const e=r.samples[t],n=28+16*t;l.setUint16(n+0,e.bitOffset,!0),l.setUint8(n+2,e.bitLength),l.setUint8(n+3,e.channelType),l.setUint8(n+4,e.samplePosition[0]),l.setUint8(n+5,e.samplePosition[1]),l.setUint8(n+6,e.samplePosition[2]),l.setUint8(n+7,e.samplePosition[3]),64&e.channelType?(l.setInt32(n+8,e.sampleLower,!0),l.setInt32(n+12,e.sampleUpper,!0)):(l.setUint32(n+8,e.sampleLower,!0),l.setUint32(n+12,e.sampleUpper,!0))}const c=Oi.length+68+3*t.levels.length*8,U=c+o.byteLength;let h=n.byteLength>0?U+a.byteLength:0;h%8&&(h+=8-h%8);const p=[],_=new DataView(new ArrayBuffer(3*t.levels.length*8)),u=new Uint32Array(t.levels.length);let g=0;0===t.supercompressionScheme&&(g=function(t){const e=Math.max(t,4),n=Math.min(t,4);let i=e;for(;i%n!==0;)i+=e;return i}(function(t){return t.levels[0].levelData.byteLength/function(t){let e=1;const n=[t.pixelWidth,t.pixelHeight,t.pixelDepth],i=function(t){const[e,n,i]=t.dataFormatDescriptor[0].texelBlockDimension;return[e+1,n+1,i+1]}(t);for(let t=0;t<3;t++)if(n[t]>0){const s=Math.ceil(Math.floor(1*n[t])/i[t]);e*=Math.max(1,s)}return t.layerCount>0&&(e*=t.layerCount),t.faceCount>0&&(e*=t.faceCount),e}(t)}(t)));let x=(h||U+a.byteLength)+n.byteLength;for(let e=t.levels.length-1;e>=0;e--){if(x%g){const t=Pi(x,g);p.push(new Uint8Array(t)),x+=t}const n=t.levels[e];p.push(n.levelData),u[e]=x,x+=n.levelData.byteLength}for(let e=0;e<t.levels.length;e++){const n=t.levels[e];_.setBigUint64(24*e+0,BigInt(u[e]),!0),_.setBigUint64(24*e+8,BigInt(n.levelData.byteLength),!0),_.setBigUint64(24*e+16,BigInt(n.uncompressedByteLength),!0)}const y=new ArrayBuffer(68),b=new DataView(y);return b.setUint32(0,t.vkFormat,!0),b.setUint32(4,t.typeSize,!0),b.setUint32(8,t.pixelWidth,!0),b.setUint32(12,t.pixelHeight,!0),b.setUint32(16,t.pixelDepth,!0),b.setUint32(20,t.layerCount,!0),b.setUint32(24,t.faceCount,!0),b.setUint32(28,t.levelCount,!0),b.setUint32(32,t.supercompressionScheme,!0),b.setUint32(36,c,!0),b.setUint32(40,o.byteLength,!0),b.setUint32(44,U,!0),b.setUint32(48,a.byteLength,!0),b.setBigUint64(52,BigInt(n.byteLength>0?h:0),!0),b.setBigUint64(60,BigInt(n.byteLength),!0),new Uint8Array(Ei([new Uint8Array(Oi).buffer,y,_.buffer,o,a,h>0?new ArrayBuffer(h-(U+a.byteLength)):new ArrayBuffer(0),n,...p]))}export{Z as KHR_DF_CHANNEL_RGBSDA_ALPHA,q as KHR_DF_CHANNEL_RGBSDA_BLUE,Q as KHR_DF_CHANNEL_RGBSDA_DEPTH,G as KHR_DF_CHANNEL_RGBSDA_GREEN,R as KHR_DF_CHANNEL_RGBSDA_RED,J as KHR_DF_CHANNEL_RGBSDA_STENCIL,u as KHR_DF_FLAG_ALPHA_PREMULTIPLIED,_ as KHR_DF_FLAG_ALPHA_STRAIGHT,s as KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT,U as KHR_DF_MODEL_ASTC,f as KHR_DF_MODEL_ETC1,h as KHR_DF_MODEL_ETC1S,c as KHR_DF_MODEL_ETC2,l as KHR_DF_MODEL_RGBSDA,p as KHR_DF_MODEL_UASTC,o as KHR_DF_MODEL_UNSPECIFIED,H as KHR_DF_PRIMARIES_ACES,z as KHR_DF_PRIMARIES_ACESCC,Y as KHR_DF_PRIMARIES_ADOBERGB,N as KHR_DF_PRIMARIES_BT2020,P as KHR_DF_PRIMARIES_BT601_EBU,M as KHR_DF_PRIMARIES_BT601_SMPTE,E as KHR_DF_PRIMARIES_BT709,W as KHR_DF_PRIMARIES_CIEXYZ,X as KHR_DF_PRIMARIES_DISPLAYP3,j as KHR_DF_PRIMARIES_NTSC1953,K as KHR_DF_PRIMARIES_PAL525,S as KHR_DF_PRIMARIES_UNSPECIFIED,et as KHR_DF_SAMPLE_DATATYPE_EXPONENT,$ as KHR_DF_SAMPLE_DATATYPE_FLOAT,nt as KHR_DF_SAMPLE_DATATYPE_LINEAR,tt as KHR_DF_SAMPLE_DATATYPE_SIGNED,F as KHR_DF_TRANSFER_ACESCC,O as KHR_DF_TRANSFER_ACESCCT,T as KHR_DF_TRANSFER_ADOBERGB,w as KHR_DF_TRANSFER_BT1886,k as KHR_DF_TRANSFER_DCIP3,B as KHR_DF_TRANSFER_HLG_EOTF,v as KHR_DF_TRANSFER_HLG_OETF,b as KHR_DF_TRANSFER_ITU,x as KHR_DF_TRANSFER_LINEAR,m as KHR_DF_TRANSFER_NTSC,V as KHR_DF_TRANSFER_PAL625_EOTF,I as KHR_DF_TRANSFER_PAL_OETF,L as KHR_DF_TRANSFER_PQ_EOTF,A as KHR_DF_TRANSFER_PQ_OETF,d as KHR_DF_TRANSFER_SLOG,D as KHR_DF_TRANSFER_SLOG2,y as KHR_DF_TRANSFER_SRGB,C as KHR_DF_TRANSFER_ST240,g as KHR_DF_TRANSFER_UNSPECIFIED,a as KHR_DF_VENDORID_KHRONOS,r as KHR_DF_VERSION,e as KHR_SUPERCOMPRESSION_BASISLZ,t as KHR_SUPERCOMPRESSION_NONE,i as KHR_SUPERCOMPRESSION_ZLIB,n as KHR_SUPERCOMPRESSION_ZSTD,Ut as VK_FORMAT_A1R5G5B5_UNORM_PACK16,qt as VK_FORMAT_A2B10G10R10_SINT_PACK32,Rt as VK_FORMAT_A2B10G10R10_SNORM_PACK32,Gt as VK_FORMAT_A2B10G10R10_UINT_PACK32,Yt as VK_FORMAT_A2B10G10R10_UNORM_PACK32,Xt as VK_FORMAT_A2R10G10B10_SINT_PACK32,jt as VK_FORMAT_A2R10G10B10_SNORM_PACK32,Kt as VK_FORMAT_A2R10G10B10_UINT_PACK32,zt as VK_FORMAT_A2R10G10B10_UNORM_PACK32,Ii as VK_FORMAT_A4B4G4R4_UNORM_PACK16_EXT,ki as VK_FORMAT_A4R4G4B4_UNORM_PACK16_EXT,Bi as VK_FORMAT_ASTC_10x10_SFLOAT_BLOCK_EXT,Xn as VK_FORMAT_ASTC_10x10_SRGB_BLOCK,Kn as VK_FORMAT_ASTC_10x10_UNORM_BLOCK,Di as VK_FORMAT_ASTC_10x5_SFLOAT_BLOCK_EXT,Nn as VK_FORMAT_ASTC_10x5_SRGB_BLOCK,Mn as VK_FORMAT_ASTC_10x5_UNORM_BLOCK,wi as VK_FORMAT_ASTC_10x6_SFLOAT_BLOCK_EXT,Hn as VK_FORMAT_ASTC_10x6_SRGB_BLOCK,Wn as VK_FORMAT_ASTC_10x6_UNORM_BLOCK,vi as VK_FORMAT_ASTC_10x8_SFLOAT_BLOCK_EXT,jn as VK_FORMAT_ASTC_10x8_SRGB_BLOCK,zn as VK_FORMAT_ASTC_10x8_UNORM_BLOCK,Li as VK_FORMAT_ASTC_12x10_SFLOAT_BLOCK_EXT,Rn as VK_FORMAT_ASTC_12x10_SRGB_BLOCK,Yn as VK_FORMAT_ASTC_12x10_UNORM_BLOCK,Ai as VK_FORMAT_ASTC_12x12_SFLOAT_BLOCK_EXT,qn as VK_FORMAT_ASTC_12x12_SRGB_BLOCK,Gn as VK_FORMAT_ASTC_12x12_UNORM_BLOCK,_i as VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT,wn as VK_FORMAT_ASTC_4x4_SRGB_BLOCK,Dn as VK_FORMAT_ASTC_4x4_UNORM_BLOCK,ui as VK_FORMAT_ASTC_5x4_SFLOAT_BLOCK_EXT,Bn as VK_FORMAT_ASTC_5x4_SRGB_BLOCK,vn as VK_FORMAT_ASTC_5x4_UNORM_BLOCK,gi as VK_FORMAT_ASTC_5x5_SFLOAT_BLOCK_EXT,An as VK_FORMAT_ASTC_5x5_SRGB_BLOCK,Ln as VK_FORMAT_ASTC_5x5_UNORM_BLOCK,xi as VK_FORMAT_ASTC_6x5_SFLOAT_BLOCK_EXT,In as VK_FORMAT_ASTC_6x5_SRGB_BLOCK,kn as VK_FORMAT_ASTC_6x5_UNORM_BLOCK,yi as VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT,Cn as VK_FORMAT_ASTC_6x6_SRGB_BLOCK,Vn as VK_FORMAT_ASTC_6x6_UNORM_BLOCK,bi as VK_FORMAT_ASTC_8x5_SFLOAT_BLOCK_EXT,On as VK_FORMAT_ASTC_8x5_SRGB_BLOCK,Fn as VK_FORMAT_ASTC_8x5_UNORM_BLOCK,mi as VK_FORMAT_ASTC_8x6_SFLOAT_BLOCK_EXT,Sn as VK_FORMAT_ASTC_8x6_SRGB_BLOCK,Tn as VK_FORMAT_ASTC_8x6_UNORM_BLOCK,di as VK_FORMAT_ASTC_8x8_SFLOAT_BLOCK_EXT,Pn as VK_FORMAT_ASTC_8x8_SRGB_BLOCK,En as VK_FORMAT_ASTC_8x8_UNORM_BLOCK,We as VK_FORMAT_B10G11R11_UFLOAT_PACK32,ti as VK_FORMAT_B10X6G10X6R10X6G10X6_422_UNORM_4PACK16,ai as VK_FORMAT_B12X4G12X4R12X4G12X4_422_UNORM_4PACK16,rt as VK_FORMAT_B4G4R4A4_UNORM_PACK16,ct as VK_FORMAT_B5G5R5A1_UNORM_PACK16,lt as VK_FORMAT_B5G6R5_UNORM_PACK16,Wt as VK_FORMAT_B8G8R8A8_SINT,Mt as VK_FORMAT_B8G8R8A8_SNORM,Ht as VK_FORMAT_B8G8R8A8_SRGB,Nt as VK_FORMAT_B8G8R8A8_UINT,Pt as VK_FORMAT_B8G8R8A8_UNORM,Vt as VK_FORMAT_B8G8R8_SINT,kt as VK_FORMAT_B8G8R8_SNORM,Ct as VK_FORMAT_B8G8R8_SRGB,It as VK_FORMAT_B8G8R8_UINT,At as VK_FORMAT_B8G8R8_UNORM,Ze as VK_FORMAT_BC1_RGBA_SRGB_BLOCK,Qe as VK_FORMAT_BC1_RGBA_UNORM_BLOCK,Je as VK_FORMAT_BC1_RGB_SRGB_BLOCK,qe as VK_FORMAT_BC1_RGB_UNORM_BLOCK,tn as VK_FORMAT_BC2_SRGB_BLOCK,$e as VK_FORMAT_BC2_UNORM_BLOCK,nn as VK_FORMAT_BC3_SRGB_BLOCK,en as VK_FORMAT_BC3_UNORM_BLOCK,an as VK_FORMAT_BC4_SNORM_BLOCK,sn as VK_FORMAT_BC4_UNORM_BLOCK,on as VK_FORMAT_BC5_SNORM_BLOCK,rn as VK_FORMAT_BC5_UNORM_BLOCK,fn as VK_FORMAT_BC6H_SFLOAT_BLOCK,ln as VK_FORMAT_BC6H_UFLOAT_BLOCK,Un as VK_FORMAT_BC7_SRGB_BLOCK,cn as VK_FORMAT_BC7_UNORM_BLOCK,ze as VK_FORMAT_D16_UNORM,Ye as VK_FORMAT_D16_UNORM_S8_UINT,Re as VK_FORMAT_D24_UNORM_S8_UINT,Ke as VK_FORMAT_D32_SFLOAT,Ge as VK_FORMAT_D32_SFLOAT_S8_UINT,He as VK_FORMAT_E5B9G9R9_UFLOAT_PACK32,dn as VK_FORMAT_EAC_R11G11_SNORM_BLOCK,mn as VK_FORMAT_EAC_R11G11_UNORM_BLOCK,bn as VK_FORMAT_EAC_R11_SNORM_BLOCK,yn as VK_FORMAT_EAC_R11_UNORM_BLOCK,un as VK_FORMAT_ETC2_R8G8B8A1_SRGB_BLOCK,_n as VK_FORMAT_ETC2_R8G8B8A1_UNORM_BLOCK,xn as VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK,gn as VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK,pn as VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK,hn as VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK,$n as VK_FORMAT_G10X6B10X6G10X6R10X6_422_UNORM_4PACK16,si as VK_FORMAT_G12X4B12X4G12X4R12X4_422_UNORM_4PACK16,ci as VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG,ri as VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG,Ui as VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG,oi as VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG,hi as VK_FORMAT_PVRTC2_2BPP_SRGB_BLOCK_IMG,li as VK_FORMAT_PVRTC2_2BPP_UNORM_BLOCK_IMG,pi as VK_FORMAT_PVRTC2_4BPP_SRGB_BLOCK_IMG,fi as VK_FORMAT_PVRTC2_4BPP_UNORM_BLOCK_IMG,Zn as VK_FORMAT_R10X6G10X6B10X6A10X6_UNORM_4PACK16,Qn as VK_FORMAT_R10X6G10X6_UNORM_2PACK16,Jn as VK_FORMAT_R10X6_UNORM_PACK16,ii as VK_FORMAT_R12X4G12X4B12X4A12X4_UNORM_4PACK16,ni as VK_FORMAT_R12X4G12X4_UNORM_2PACK16,ei as VK_FORMAT_R12X4_UNORM_PACK16,ue as VK_FORMAT_R16G16B16A16_SFLOAT,_e as VK_FORMAT_R16G16B16A16_SINT,he as VK_FORMAT_R16G16B16A16_SNORM,pe as VK_FORMAT_R16G16B16A16_UINT,Ue as VK_FORMAT_R16G16B16A16_UNORM,ce as VK_FORMAT_R16G16B16_SFLOAT,fe as VK_FORMAT_R16G16B16_SINT,oe as VK_FORMAT_R16G16B16_SNORM,le as VK_FORMAT_R16G16B16_UINT,re as VK_FORMAT_R16G16B16_UNORM,ae as VK_FORMAT_R16G16_SFLOAT,se as VK_FORMAT_R16G16_SINT,ne as VK_FORMAT_R16G16_SNORM,ie as VK_FORMAT_R16G16_UINT,ee as VK_FORMAT_R16G16_UNORM,te as VK_FORMAT_R16_SFLOAT,$t as VK_FORMAT_R16_SINT,Qt as VK_FORMAT_R16_SNORM,Zt as VK_FORMAT_R16_UINT,Jt as VK_FORMAT_R16_UNORM,Ae as VK_FORMAT_R32G32B32A32_SFLOAT,Le as VK_FORMAT_R32G32B32A32_SINT,Be as VK_FORMAT_R32G32B32A32_UINT,ve as VK_FORMAT_R32G32B32_SFLOAT,we as VK_FORMAT_R32G32B32_SINT,De as VK_FORMAT_R32G32B32_UINT,de as VK_FORMAT_R32G32_SFLOAT,me as VK_FORMAT_R32G32_SINT,be as VK_FORMAT_R32G32_UINT,ye as VK_FORMAT_R32_SFLOAT,xe as VK_FORMAT_R32_SINT,ge as VK_FORMAT_R32_UINT,at as VK_FORMAT_R4G4B4A4_UNORM_PACK16,st as VK_FORMAT_R4G4_UNORM_PACK8,ft as VK_FORMAT_R5G5B5A1_UNORM_PACK16,ot as VK_FORMAT_R5G6B5_UNORM_PACK16,Ne as VK_FORMAT_R64G64B64A64_SFLOAT,Me as VK_FORMAT_R64G64B64A64_SINT,Pe as VK_FORMAT_R64G64B64A64_UINT,Ee as VK_FORMAT_R64G64B64_SFLOAT,Se as VK_FORMAT_R64G64B64_SINT,Te as VK_FORMAT_R64G64B64_UINT,Oe as VK_FORMAT_R64G64_SFLOAT,Fe as VK_FORMAT_R64G64_SINT,Ce as VK_FORMAT_R64G64_UINT,Ve as VK_FORMAT_R64_SFLOAT,Ie as VK_FORMAT_R64_SINT,ke as VK_FORMAT_R64_UINT,St as VK_FORMAT_R8G8B8A8_SINT,Ot as VK_FORMAT_R8G8B8A8_SNORM,Et as VK_FORMAT_R8G8B8A8_SRGB,Tt as VK_FORMAT_R8G8B8A8_UINT,Ft as VK_FORMAT_R8G8B8A8_UNORM,Bt as VK_FORMAT_R8G8B8_SINT,wt as VK_FORMAT_R8G8B8_SNORM,Lt as VK_FORMAT_R8G8B8_SRGB,vt as VK_FORMAT_R8G8B8_UINT,Dt as VK_FORMAT_R8G8B8_UNORM,mt as VK_FORMAT_R8G8_SINT,yt as VK_FORMAT_R8G8_SNORM,dt as VK_FORMAT_R8G8_SRGB,bt as VK_FORMAT_R8G8_UINT,xt as VK_FORMAT_R8G8_UNORM,ut as VK_FORMAT_R8_SINT,pt as VK_FORMAT_R8_SNORM,gt as VK_FORMAT_R8_SRGB,_t as VK_FORMAT_R8_UINT,ht as VK_FORMAT_R8_UNORM,Xe as VK_FORMAT_S8_UINT,it as VK_FORMAT_UNDEFINED,je as VK_FORMAT_X8_D24_UNORM_PACK32,Vi as createDefaultContainer,Mi as read,Hi as write};\n", "import {\n\tColorManagement,\n\tFloatType,\n\tHalfFloatType,\n\tUnsignedByteType,\n\tRGBAFormat,\n\tRGFormat,\n\tRGIntegerFormat,\n\tRedFormat,\n\tRedIntegerFormat,\n\tNoColorSpace,\n\tLinearSRGBColorSpace,\n\tSRGBColorSpace,\n\tSRGBTransfer,\n\tDataTexture,\n\tREVISION,\n} from 'three';\n\nimport {\n\tcreateDefaultContainer,\n\twrite,\n\tKHR_DF_CHANNEL_RGBSDA_ALPHA,\n\tKHR_DF_CHANNEL_RGBSDA_BLUE,\n\tKHR_DF_CHANNEL_RGBSDA_GREEN,\n\tKHR_DF_CHANNEL_RGBSDA_RED,\n\tKHR_DF_MODEL_RGBSDA,\n\tKHR_DF_PRIMARIES_BT709,\n\tKHR_DF_PRIMARIES_UNSPECIFIED,\n\tKHR_DF_SAMPLE_DATATYPE_FLOAT,\n\tKHR_DF_SAMPLE_DATATYPE_LINEAR,\n\tKHR_DF_SAMPLE_DATATYPE_SIGNED,\n\tKHR_DF_TRANSFER_LINEAR,\n\tKHR_DF_TRANSFER_SRGB,\n\tVK_FORMAT_R16_SFLOAT,\n\tVK_FORMAT_R16G16_SFLOAT,\n\tVK_FORMAT_R16G16B16A16_SFLOAT,\n\tVK_FORMAT_R32_SFLOAT,\n\tVK_FORMAT_R32G32_SFLOAT,\n\tVK_FORMAT_R32G32B32A32_SFLOAT,\n\tVK_FORMAT_R8_SRGB,\n\tVK_FORMAT_R8_UNORM,\n\tVK_FORMAT_R8G8_SRGB,\n\tVK_FORMAT_R8G8_UNORM,\n\tVK_FORMAT_R8G8B8A8_SRGB,\n\tVK_FORMAT_R8G8B8A8_UNORM,\n} from '../libs/ktx-parse.module.js';\n\n/**\n * References:\n * - https://github.khronos.org/KTX-Specification/ktxspec.v2.html\n * - https://registry.khronos.org/DataFormat/specs/1.3/dataformat.1.3.html\n * - https://github.com/donmccurdy/KTX-Parse\n */\n\nconst VK_FORMAT_MAP = {\n\n\t[ RGBAFormat ]: {\n\t\t[ FloatType ]: {\n\t\t\t[ NoColorSpace ]: VK_FORMAT_R32G32B32A32_SFLOAT,\n\t\t\t[ LinearSRGBColorSpace ]: VK_FORMAT_R32G32B32A32_SFLOAT,\n\t\t},\n\t\t[ HalfFloatType ]: {\n\t\t\t[ NoColorSpace ]: VK_FORMAT_R16G16B16A16_SFLOAT,\n\t\t\t[ LinearSRGBColorSpace ]: VK_FORMAT_R16G16B16A16_SFLOAT,\n\t\t},\n\t\t[ UnsignedByteType ]: {\n\t\t\t[ NoColorSpace ]: VK_FORMAT_R8G8B8A8_UNORM,\n\t\t\t[ LinearSRGBColorSpace ]: VK_FORMAT_R8G8B8A8_UNORM,\n\t\t\t[ SRGBColorSpace ]: VK_FORMAT_R8G8B8A8_SRGB,\n\t\t},\n\t},\n\n\t[ RGFormat ]: {\n\t\t[ FloatType ]: {\n\t\t\t[ NoColorSpace ]: VK_FORMAT_R32G32_SFLOAT,\n\t\t\t[ LinearSRGBColorSpace ]: VK_FORMAT_R32G32_SFLOAT,\n\t\t},\n\t\t[ HalfFloatType ]: {\n\t\t\t[ NoColorSpace ]: VK_FORMAT_R16G16_SFLOAT,\n\t\t\t[ LinearSRGBColorSpace ]: VK_FORMAT_R16G16_SFLOAT,\n\t\t},\n\t\t[ UnsignedByteType ]: {\n\t\t\t[ NoColorSpace ]: VK_FORMAT_R8G8_UNORM,\n\t\t\t[ LinearSRGBColorSpace ]: VK_FORMAT_R8G8_UNORM,\n\t\t\t[ SRGBColorSpace ]: VK_FORMAT_R8G8_SRGB,\n\t\t},\n\t},\n\n\t[ RedFormat ]: {\n\t\t[ FloatType ]: {\n\t\t\t[ NoColorSpace ]: VK_FORMAT_R32_SFLOAT,\n\t\t\t[ LinearSRGBColorSpace ]: VK_FORMAT_R32_SFLOAT,\n\t\t},\n\t\t[ HalfFloatType ]: {\n\t\t\t[ NoColorSpace ]: VK_FORMAT_R16_SFLOAT,\n\t\t\t[ LinearSRGBColorSpace ]: VK_FORMAT_R16_SFLOAT,\n\t\t},\n\t\t[ UnsignedByteType ]: {\n\t\t\t[ NoColorSpace ]: VK_FORMAT_R8_UNORM,\n\t\t\t[ LinearSRGBColorSpace ]: VK_FORMAT_R8_UNORM,\n\t\t\t[ SRGBColorSpace ]: VK_FORMAT_R8_SRGB,\n\t\t},\n\t},\n\n};\n\nconst KHR_DF_CHANNEL_MAP = [\n\n\tKHR_DF_CHANNEL_RGBSDA_RED,\n\tKHR_DF_CHANNEL_RGBSDA_GREEN,\n\tKHR_DF_CHANNEL_RGBSDA_BLUE,\n\tKHR_DF_CHANNEL_RGBSDA_ALPHA,\n\n];\n\n// TODO: sampleLower and sampleUpper may change based on color space.\nconst KHR_DF_CHANNEL_SAMPLE_LOWER_UPPER = {\n\n\t[ FloatType ]: [ 0xbf800000, 0x3f800000 ],\n\t[ HalfFloatType ]: [ 0xbf800000, 0x3f800000 ],\n\t[ UnsignedByteType ]: [ 0, 255 ],\n\n};\n\nconst ERROR_INPUT = 'THREE.KTX2Exporter: Supported inputs are DataTexture, Data3DTexture, or WebGLRenderer and WebGLRenderTarget.';\nconst ERROR_FORMAT = 'THREE.KTX2Exporter: Supported formats are RGBAFormat, RGFormat, or RedFormat.';\nconst ERROR_TYPE = 'THREE.KTX2Exporter: Supported types are FloatType, HalfFloatType, or UnsignedByteType.\"';\nconst ERROR_COLOR_SPACE = 'THREE.KTX2Exporter: Supported color spaces are SRGBColorSpace (UnsignedByteType only), LinearSRGBColorSpace, or NoColorSpace.';\n\n/**\n * An exporter for KTX2.\n *\n * ```js\n * const exporter = new KTX2Exporter();\n * const result = await exporter.parse( dataTexture );\n * ```\n *\n * @three_import import { KTX2Exporter } from 'three/addons/exporters/KTX2Exporter.js';\n */\nexport class KTX2Exporter {\n\n\t/**\n\t * This method has two variants.\n\t *\n\t * - When exporting a data texture, it receives one parameter. The data or 3D data texture.\n\t * - When exporting a render target (e.g. a PMREM), it receives two parameters. The renderer and the\n\t * render target.\n\t *\n\t * @async\n\t * @param {(DataTexture|Data3DTexture|WebGPURenderer|WebGLRenderer)} arg1 - The data texture to export or a renderer.\n\t * @param {RenderTarget} [arg2] - The render target that should be exported\n\t * @return {Promise<Uint8Array>} A Promise that resolves with the exported KTX2.\n\t */\n\tasync parse( arg1, arg2 ) {\n\n\t\tlet texture;\n\n\t\tif ( arg1.isDataTexture || arg1.isData3DTexture ) {\n\n\t\t\ttexture = arg1;\n\n\t\t} else if ( ( arg1.isWebGLRenderer || arg1.isWebGPURenderer ) && arg2.isRenderTarget ) {\n\n\t\t\ttexture = await toDataTexture( arg1, arg2 );\n\n\t\t} else {\n\n\t\t\tthrow new Error( ERROR_INPUT );\n\n\t\t}\n\n\t\tif ( VK_FORMAT_MAP[ texture.format ] === undefined ) {\n\n\t\t\tthrow new Error( ERROR_FORMAT );\n\n\t\t}\n\n\t\tif ( VK_FORMAT_MAP[ texture.format ][ texture.type ] === undefined ) {\n\n\t\t\tthrow new Error( ERROR_TYPE );\n\n\t\t}\n\n\t\tif ( VK_FORMAT_MAP[ texture.format ][ texture.type ][ texture.colorSpace ] === undefined ) {\n\n\t\t\tthrow new Error( ERROR_COLOR_SPACE );\n\n\t\t}\n\n\t\t//\n\n\t\tconst array = texture.image.data;\n\t\tconst channelCount = getChannelCount( texture );\n\t\tconst container = createDefaultContainer();\n\n\t\tcontainer.vkFormat = VK_FORMAT_MAP[ texture.format ][ texture.type ][ texture.colorSpace ];\n\t\tcontainer.typeSize = array.BYTES_PER_ELEMENT;\n\t\tcontainer.pixelWidth = texture.image.width;\n\t\tcontainer.pixelHeight = texture.image.height;\n\n\t\tif ( texture.isData3DTexture ) {\n\n\t\t\tcontainer.pixelDepth = texture.image.depth;\n\n\t\t}\n\n\t\t//\n\n\t\tconst basicDesc = container.dataFormatDescriptor[ 0 ];\n\n\t\tbasicDesc.colorModel = KHR_DF_MODEL_RGBSDA;\n\t\tbasicDesc.colorPrimaries = texture.colorSpace === NoColorSpace\n\t\t\t? KHR_DF_PRIMARIES_UNSPECIFIED\n\t\t\t: KHR_DF_PRIMARIES_BT709;\n\t\tbasicDesc.transferFunction = ColorManagement.getTransfer( texture.colorSpace ) === SRGBTransfer\n\t\t\t? KHR_DF_TRANSFER_SRGB\n\t\t\t: KHR_DF_TRANSFER_LINEAR;\n\n\t\tbasicDesc.texelBlockDimension = [ 0, 0, 0, 0 ];\n\n\t\tbasicDesc.bytesPlane = [\n\n\t\t\tcontainer.typeSize * channelCount, 0, 0, 0, 0, 0, 0, 0,\n\n\t\t];\n\n\t\tfor ( let i = 0; i < channelCount; ++ i ) {\n\n\t\t\tlet channelType = KHR_DF_CHANNEL_MAP[ i ];\n\n\t\t\t// Assign KHR_DF_SAMPLE_DATATYPE_LINEAR if the channel is linear _and_ differs from the transfer function.\n\t\t\tif ( channelType === KHR_DF_CHANNEL_RGBSDA_ALPHA && basicDesc.transferFunction !== KHR_DF_TRANSFER_LINEAR ) {\n\n\t\t\t\tchannelType |= KHR_DF_SAMPLE_DATATYPE_LINEAR;\n\n\t\t\t}\n\n\t\t\tif ( texture.type === FloatType || texture.type === HalfFloatType ) {\n\n\t\t\t\tchannelType |= KHR_DF_SAMPLE_DATATYPE_FLOAT;\n\t\t\t\tchannelType |= KHR_DF_SAMPLE_DATATYPE_SIGNED;\n\n\t\t\t}\n\n\t\t\tbasicDesc.samples.push( {\n\n\t\t\t\tchannelType: channelType,\n\t\t\t\tbitOffset: i * array.BYTES_PER_ELEMENT * 8,\n\t\t\t\tbitLength: array.BYTES_PER_ELEMENT * 8 - 1,\n\t\t\t\tsamplePosition: [ 0, 0, 0, 0 ],\n\t\t\t\tsampleLower: KHR_DF_CHANNEL_SAMPLE_LOWER_UPPER[ texture.type ][ 0 ],\n\t\t\t\tsampleUpper: KHR_DF_CHANNEL_SAMPLE_LOWER_UPPER[ texture.type ][ 1 ],\n\n\t\t\t} );\n\n\t\t}\n\n\t\t//\n\n\t\tcontainer.levelCount = 1;\n\n\t\tcontainer.levels = [ {\n\n\t\t\tlevelData: new Uint8Array( array.buffer, array.byteOffset, array.byteLength ),\n\t\t\tuncompressedByteLength: array.byteLength,\n\n\t\t} ];\n\n\t\t//\n\n\t\tcontainer.keyValue[ 'KTXwriter' ] = `three.js ${ REVISION }`;\n\n\t\t//\n\n\t\treturn write( container, { keepWriter: true } );\n\n\t}\n\n}\n\nasync function toDataTexture( renderer, rtt ) {\n\n\tconst channelCount = getChannelCount( rtt.texture );\n\n\tlet view;\n\n\tif ( renderer.isWebGLRenderer ) {\n\n\t\tif ( rtt.texture.type === FloatType ) {\n\n\t\t\tview = new Float32Array( rtt.width * rtt.height * channelCount );\n\n\t\t} else if ( rtt.texture.type === HalfFloatType ) {\n\n\t\t\tview = new Uint16Array( rtt.width * rtt.height * channelCount );\n\n\t\t} else if ( rtt.texture.type === UnsignedByteType ) {\n\n\t\t\tview = new Uint8Array( rtt.width * rtt.height * channelCount );\n\n\t\t} else {\n\n\t\t\tthrow new Error( ERROR_TYPE );\n\n\t\t}\n\n\t\tawait renderer.readRenderTargetPixelsAsync( rtt, 0, 0, rtt.width, rtt.height, view );\n\n\t} else {\n\n\t\tview = await renderer.readRenderTargetPixelsAsync( rtt, 0, 0, rtt.width, rtt.height );\n\n\t}\n\n\tconst texture = new DataTexture( view, rtt.width, rtt.height, rtt.texture.format, rtt.texture.type );\n\n\ttexture.colorSpace = rtt.texture.colorSpace;\n\n\treturn texture;\n\n}\n\nfunction getChannelCount( texture ) {\n\n\tswitch ( texture.format ) {\n\n\t\tcase RGBAFormat:\n\n\t\t\treturn 4;\n\n\t\tcase RGFormat:\n\t\tcase RGIntegerFormat:\n\n\t\t\treturn 2;\n\n\t\tcase RedFormat:\n\t\tcase RedIntegerFormat:\n\n\t\t\treturn 1;\n\n\t\tdefault:\n\n\t\t\tthrow new Error( ERROR_FORMAT );\n\n\t}\n\n}\n", "import {\n\tColor,\n\tColorManagement,\n\tMatrix3,\n\tSRGBColorSpace,\n\tVector2,\n\tVector3\n} from 'three';\n\n/**\n * An exporter for OBJ.\n *\n * `OBJExporter` is not able to export material data into MTL files so only geometry data are supported.\n *\n * ```js\n * const exporter = new OBJExporter();\n * const data = exporter.parse( scene );\n * ```\n *\n * @three_import import { OBJExporter } from 'three/addons/exporters/OBJExporter.js';\n */\nclass OBJExporter {\n\n\t/**\n\t * Parses the given 3D object and generates the OBJ output.\n\t *\n\t * If the 3D object is composed of multiple children and geometry, they are merged into a single mesh in the file.\n\t *\n\t * @param {Object3D} object - The 3D object to export.\n\t * @return {string} The exported OBJ.\n\t */\n\tparse( object ) {\n\n\t\tlet output = '';\n\n\t\tlet indexVertex = 0;\n\t\tlet indexVertexUvs = 0;\n\t\tlet indexNormals = 0;\n\n\t\tconst vertex = new Vector3();\n\t\tconst color = new Color();\n\t\tconst normal = new Vector3();\n\t\tconst uv = new Vector2();\n\n\t\tconst face = [];\n\n\t\tfunction parseMesh( mesh ) {\n\n\t\t\tlet nbVertex = 0;\n\t\t\tlet nbNormals = 0;\n\t\t\tlet nbVertexUvs = 0;\n\n\t\t\tconst geometry = mesh.geometry;\n\n\t\t\tconst normalMatrixWorld = new Matrix3();\n\n\t\t\t// shortcuts\n\t\t\tconst vertices = geometry.getAttribute( 'position' );\n\t\t\tconst normals = geometry.getAttribute( 'normal' );\n\t\t\tconst uvs = geometry.getAttribute( 'uv' );\n\t\t\tconst indices = geometry.getIndex();\n\n\t\t\t// name of the mesh object\n\t\t\toutput += 'o ' + mesh.name + '\\n';\n\n\t\t\t// name of the mesh material\n\t\t\tif ( mesh.material && mesh.material.name ) {\n\n\t\t\t\toutput += 'usemtl ' + mesh.material.name + '\\n';\n\n\t\t\t}\n\n\t\t\t// vertices\n\n\t\t\tif ( vertices !== undefined ) {\n\n\t\t\t\tfor ( let i = 0, l = vertices.count; i < l; i ++, nbVertex ++ ) {\n\n\t\t\t\t\tvertex.fromBufferAttribute( vertices, i );\n\n\t\t\t\t\t// transform the vertex to world space\n\t\t\t\t\tvertex.applyMatrix4( mesh.matrixWorld );\n\n\t\t\t\t\t// transform the vertex to export format\n\t\t\t\t\toutput += 'v ' + vertex.x + ' ' + vertex.y + ' ' + vertex.z + '\\n';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// uvs\n\n\t\t\tif ( uvs !== undefined ) {\n\n\t\t\t\tfor ( let i = 0, l = uvs.count; i < l; i ++, nbVertexUvs ++ ) {\n\n\t\t\t\t\tuv.fromBufferAttribute( uvs, i );\n\n\t\t\t\t\t// transform the uv to export format\n\t\t\t\t\toutput += 'vt ' + uv.x + ' ' + uv.y + '\\n';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// normals\n\n\t\t\tif ( normals !== undefined ) {\n\n\t\t\t\tnormalMatrixWorld.getNormalMatrix( mesh.matrixWorld );\n\n\t\t\t\tfor ( let i = 0, l = normals.count; i < l; i ++, nbNormals ++ ) {\n\n\t\t\t\t\tnormal.fromBufferAttribute( normals, i );\n\n\t\t\t\t\t// transform the normal to world space\n\t\t\t\t\tnormal.applyMatrix3( normalMatrixWorld ).normalize();\n\n\t\t\t\t\t// transform the normal to export format\n\t\t\t\t\toutput += 'vn ' + normal.x + ' ' + normal.y + ' ' + normal.z + '\\n';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// faces\n\n\t\t\tif ( indices !== null ) {\n\n\t\t\t\tfor ( let i = 0, l = indices.count; i < l; i += 3 ) {\n\n\t\t\t\t\tfor ( let m = 0; m < 3; m ++ ) {\n\n\t\t\t\t\t\tconst j = indices.getX( i + m ) + 1;\n\n\t\t\t\t\t\tface[ m ] = ( indexVertex + j ) + ( normals || uvs ? '/' + ( uvs ? ( indexVertexUvs + j ) : '' ) + ( normals ? '/' + ( indexNormals + j ) : '' ) : '' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// transform the face to export format\n\t\t\t\t\toutput += 'f ' + face.join( ' ' ) + '\\n';\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( let i = 0, l = vertices.count; i < l; i += 3 ) {\n\n\t\t\t\t\tfor ( let m = 0; m < 3; m ++ ) {\n\n\t\t\t\t\t\tconst j = i + m + 1;\n\n\t\t\t\t\t\tface[ m ] = ( indexVertex + j ) + ( normals || uvs ? '/' + ( uvs ? ( indexVertexUvs + j ) : '' ) + ( normals ? '/' + ( indexNormals + j ) : '' ) : '' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// transform the face to export format\n\t\t\t\t\toutput += 'f ' + face.join( ' ' ) + '\\n';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// update index\n\t\t\tindexVertex += nbVertex;\n\t\t\tindexVertexUvs += nbVertexUvs;\n\t\t\tindexNormals += nbNormals;\n\n\t\t}\n\n\t\tfunction parseLine( line ) {\n\n\t\t\tlet nbVertex = 0;\n\n\t\t\tconst geometry = line.geometry;\n\t\t\tconst type = line.type;\n\n\t\t\t// shortcuts\n\t\t\tconst vertices = geometry.getAttribute( 'position' );\n\n\t\t\t// name of the line object\n\t\t\toutput += 'o ' + line.name + '\\n';\n\n\t\t\tif ( vertices !== undefined ) {\n\n\t\t\t\tfor ( let i = 0, l = vertices.count; i < l; i ++, nbVertex ++ ) {\n\n\t\t\t\t\tvertex.fromBufferAttribute( vertices, i );\n\n\t\t\t\t\t// transform the vertex to world space\n\t\t\t\t\tvertex.applyMatrix4( line.matrixWorld );\n\n\t\t\t\t\t// transform the vertex to export format\n\t\t\t\t\toutput += 'v ' + vertex.x + ' ' + vertex.y + ' ' + vertex.z + '\\n';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( type === 'Line' ) {\n\n\t\t\t\toutput += 'l ';\n\n\t\t\t\tfor ( let j = 1, l = vertices.count; j <= l; j ++ ) {\n\n\t\t\t\t\toutput += ( indexVertex + j ) + ' ';\n\n\t\t\t\t}\n\n\t\t\t\toutput += '\\n';\n\n\t\t\t}\n\n\t\t\tif ( type === 'LineSegments' ) {\n\n\t\t\t\tfor ( let j = 1, k = j + 1, l = vertices.count; j < l; j += 2, k = j + 1 ) {\n\n\t\t\t\t\toutput += 'l ' + ( indexVertex + j ) + ' ' + ( indexVertex + k ) + '\\n';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// update index\n\t\t\tindexVertex += nbVertex;\n\n\t\t}\n\n\t\tfunction parsePoints( points ) {\n\n\t\t\tlet nbVertex = 0;\n\n\t\t\tconst geometry = points.geometry;\n\n\t\t\tconst vertices = geometry.getAttribute( 'position' );\n\t\t\tconst colors = geometry.getAttribute( 'color' );\n\n\t\t\toutput += 'o ' + points.name + '\\n';\n\n\t\t\tif ( vertices !== undefined ) {\n\n\t\t\t\tfor ( let i = 0, l = vertices.count; i < l; i ++, nbVertex ++ ) {\n\n\t\t\t\t\tvertex.fromBufferAttribute( vertices, i );\n\t\t\t\t\tvertex.applyMatrix4( points.matrixWorld );\n\n\t\t\t\t\toutput += 'v ' + vertex.x + ' ' + vertex.y + ' ' + vertex.z;\n\n\t\t\t\t\tif ( colors !== undefined ) {\n\n\t\t\t\t\t\tcolor.fromBufferAttribute( colors, i );\n\n\t\t\t\t\t\tColorManagement.workingToColorSpace( color, SRGBColorSpace );\n\n\t\t\t\t\t\toutput += ' ' + color.r + ' ' + color.g + ' ' + color.b;\n\n\t\t\t\t\t}\n\n\t\t\t\t\toutput += '\\n';\n\n\t\t\t\t}\n\n\t\t\t\toutput += 'p ';\n\n\t\t\t\tfor ( let j = 1, l = vertices.count; j <= l; j ++ ) {\n\n\t\t\t\t\toutput += ( indexVertex + j ) + ' ';\n\n\t\t\t\t}\n\n\t\t\t\toutput += '\\n';\n\n\t\t\t}\n\n\t\t\t// update index\n\t\t\tindexVertex += nbVertex;\n\n\t\t}\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isMesh === true ) {\n\n\t\t\t\tparseMesh( child );\n\n\t\t\t}\n\n\t\t\tif ( child.isLine === true ) {\n\n\t\t\t\tparseLine( child );\n\n\t\t\t}\n\n\t\t\tif ( child.isPoints === true ) {\n\n\t\t\t\tparsePoints( child );\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn output;\n\n\t}\n\n}\n\nexport { OBJExporter };\n", "import {\n\tMatrix3,\n\tVector3,\n\tColor,\n\tColorManagement,\n\tSRGBColorSpace\n} from 'three';\n\n/**\n * An exporter for PLY.\n *\n * PLY (Polygon or Stanford Triangle Format) is a file format for efficient delivery and\n * loading of simple, static 3D content in a dense format. Both binary and ascii formats are\n * supported. PLY can store vertex positions, colors, normals and uv coordinates. No textures\n * or texture references are saved.\n *\n * ```js\n * const exporter = new PLYExporter();\n * const data = exporter.parse( scene, options );\n * ```\n *\n * @three_import import { PLYExporter } from 'three/addons/exporters/PLYExporter.js';\n */\nclass PLYExporter {\n\n\t/**\n\t * Parses the given 3D object and generates the PLY output.\n\t *\n\t * If the 3D object is composed of multiple children and geometry, they are merged into a single mesh in the file.\n\t *\n\t * @param {Object3D} object - The 3D object to export.\n\t * @param {PLYExporter~OnDone} onDone - A callback function that is executed when the export has finished.\n\t * @param {PLYExporter~Options} options - The export options.\n\t * @return {?(string|ArrayBuffer)} The exported PLY.\n\t */\n\tparse( object, onDone, options = {} ) {\n\n\t\t// reference https://github.com/gkjohnson/ply-exporter-js\n\n\t\t// Iterate over the valid meshes in the object\n\t\tfunction traverseMeshes( cb ) {\n\n\t\t\tobject.traverse( function ( child ) {\n\n\t\t\t\tif ( child.isMesh === true || child.isPoints ) {\n\n\t\t\t\t\tconst mesh = child;\n\t\t\t\t\tconst geometry = mesh.geometry;\n\n\t\t\t\t\tif ( geometry.hasAttribute( 'position' ) === true ) {\n\n\t\t\t\t\t\tcb( mesh, geometry );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t}\n\n\t\t// Default options\n\t\tconst defaultOptions = {\n\t\t\tbinary: false,\n\t\t\texcludeAttributes: [], // normal, uv, color, index\n\t\t\tlittleEndian: false\n\t\t};\n\n\t\toptions = Object.assign( defaultOptions, options );\n\n\t\tconst excludeAttributes = options.excludeAttributes;\n\t\tlet includeIndices = true;\n\t\tlet includeNormals = false;\n\t\tlet includeColors = false;\n\t\tlet includeUVs = false;\n\n\t\t// count the vertices, check which properties are used,\n\t\t// and cache the BufferGeometry\n\t\tlet vertexCount = 0;\n\t\tlet faceCount = 0;\n\n\t\tobject.traverse( function ( child ) {\n\n\t\t\tif ( child.isMesh === true ) {\n\n\t\t\t\tconst mesh = child;\n\t\t\t\tconst geometry = mesh.geometry;\n\n\t\t\t\tconst vertices = geometry.getAttribute( 'position' );\n\t\t\t\tconst normals = geometry.getAttribute( 'normal' );\n\t\t\t\tconst uvs = geometry.getAttribute( 'uv' );\n\t\t\t\tconst colors = geometry.getAttribute( 'color' );\n\t\t\t\tconst indices = geometry.getIndex();\n\n\t\t\t\tif ( vertices === undefined ) {\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tvertexCount += vertices.count;\n\t\t\t\tfaceCount += indices ? indices.count / 3 : vertices.count / 3;\n\n\t\t\t\tif ( normals !== undefined ) includeNormals = true;\n\n\t\t\t\tif ( uvs !== undefined ) includeUVs = true;\n\n\t\t\t\tif ( colors !== undefined ) includeColors = true;\n\n\t\t\t} else if ( child.isPoints ) {\n\n\t\t\t\tconst mesh = child;\n\t\t\t\tconst geometry = mesh.geometry;\n\n\t\t\t\tconst vertices = geometry.getAttribute( 'position' );\n\t\t\t\tconst normals = geometry.getAttribute( 'normal' );\n\t\t\t\tconst colors = geometry.getAttribute( 'color' );\n\n\t\t\t\tvertexCount += vertices.count;\n\n\t\t\t\tif ( normals !== undefined ) includeNormals = true;\n\n\t\t\t\tif ( colors !== undefined ) includeColors = true;\n\n\t\t\t\tincludeIndices = false;\n\n\t\t\t}\n\n\t\t} );\n\n\t\tconst tempColor = new Color();\n\t\tincludeIndices = includeIndices && excludeAttributes.indexOf( 'index' ) === - 1;\n\t\tincludeNormals = includeNormals && excludeAttributes.indexOf( 'normal' ) === - 1;\n\t\tincludeColors = includeColors && excludeAttributes.indexOf( 'color' ) === - 1;\n\t\tincludeUVs = includeUVs && excludeAttributes.indexOf( 'uv' ) === - 1;\n\n\n\t\tif ( includeIndices && faceCount !== Math.floor( faceCount ) ) {\n\n\t\t\t// point cloud meshes will not have an index array and may not have a\n\t\t\t// number of vertices that is divisible by 3 (and therefore representable\n\t\t\t// as triangles)\n\t\t\tconsole.error(\n\n\t\t\t\t'PLYExporter: Failed to generate a valid PLY file with triangle indices because the ' +\n\t\t\t\t'number of indices is not divisible by 3.'\n\n\t\t\t);\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst indexByteCount = 4;\n\n\t\tlet header =\n\t\t\t'ply\\n' +\n\t\t\t`format ${ options.binary ? ( options.littleEndian ? 'binary_little_endian' : 'binary_big_endian' ) : 'ascii' } 1.0\\n` +\n\t\t\t`element vertex ${vertexCount}\\n` +\n\n\t\t\t// position\n\t\t\t'property float x\\n' +\n\t\t\t'property float y\\n' +\n\t\t\t'property float z\\n';\n\n\t\tif ( includeNormals === true ) {\n\n\t\t\t// normal\n\t\t\theader +=\n\t\t\t\t'property float nx\\n' +\n\t\t\t\t'property float ny\\n' +\n\t\t\t\t'property float nz\\n';\n\n\t\t}\n\n\t\tif ( includeUVs === true ) {\n\n\t\t\t// uvs\n\t\t\theader +=\n\t\t\t\t'property float s\\n' +\n\t\t\t\t'property float t\\n';\n\n\t\t}\n\n\t\tif ( includeColors === true ) {\n\n\t\t\t// colors\n\t\t\theader +=\n\t\t\t\t'property uchar red\\n' +\n\t\t\t\t'property uchar green\\n' +\n\t\t\t\t'property uchar blue\\n';\n\n\t\t}\n\n\t\tif ( includeIndices === true ) {\n\n\t\t\t// faces\n\t\t\theader +=\n\t\t\t\t`element face ${faceCount}\\n` +\n\t\t\t\t'property list uchar int vertex_index\\n';\n\n\t\t}\n\n\t\theader += 'end_header\\n';\n\n\n\t\t// Generate attribute data\n\t\tconst vertex = new Vector3();\n\t\tconst normalMatrixWorld = new Matrix3();\n\t\tlet result = null;\n\n\t\tif ( options.binary === true ) {\n\n\t\t\t// Binary File Generation\n\t\t\tconst headerBin = new TextEncoder().encode( header );\n\n\t\t\t// 3 position values at 4 bytes\n\t\t\t// 3 normal values at 4 bytes\n\t\t\t// 3 color channels with 1 byte\n\t\t\t// 2 uv values at 4 bytes\n\t\t\tconst vertexListLength = vertexCount * ( 4 * 3 + ( includeNormals ? 4 * 3 : 0 ) + ( includeColors ? 3 : 0 ) + ( includeUVs ? 4 * 2 : 0 ) );\n\n\t\t\t// 1 byte shape descriptor\n\t\t\t// 3 vertex indices at ${indexByteCount} bytes\n\t\t\tconst faceListLength = includeIndices ? faceCount * ( indexByteCount * 3 + 1 ) : 0;\n\t\t\tconst output = new DataView( new ArrayBuffer( headerBin.length + vertexListLength + faceListLength ) );\n\t\t\tnew Uint8Array( output.buffer ).set( headerBin, 0 );\n\n\n\t\t\tlet vOffset = headerBin.length;\n\t\t\tlet fOffset = headerBin.length + vertexListLength;\n\t\t\tlet writtenVertices = 0;\n\t\t\ttraverseMeshes( function ( mesh, geometry ) {\n\n\t\t\t\tconst vertices = geometry.getAttribute( 'position' );\n\t\t\t\tconst normals = geometry.getAttribute( 'normal' );\n\t\t\t\tconst uvs = geometry.getAttribute( 'uv' );\n\t\t\t\tconst colors = geometry.getAttribute( 'color' );\n\t\t\t\tconst indices = geometry.getIndex();\n\n\t\t\t\tnormalMatrixWorld.getNormalMatrix( mesh.matrixWorld );\n\n\t\t\t\tfor ( let i = 0, l = vertices.count; i < l; i ++ ) {\n\n\t\t\t\t\tvertex.fromBufferAttribute( vertices, i );\n\n\t\t\t\t\tvertex.applyMatrix4( mesh.matrixWorld );\n\n\n\t\t\t\t\t// Position information\n\t\t\t\t\toutput.setFloat32( vOffset, vertex.x, options.littleEndian );\n\t\t\t\t\tvOffset += 4;\n\n\t\t\t\t\toutput.setFloat32( vOffset, vertex.y, options.littleEndian );\n\t\t\t\t\tvOffset += 4;\n\n\t\t\t\t\toutput.setFloat32( vOffset, vertex.z, options.littleEndian );\n\t\t\t\t\tvOffset += 4;\n\n\t\t\t\t\t// Normal information\n\t\t\t\t\tif ( includeNormals === true ) {\n\n\t\t\t\t\t\tif ( normals != null ) {\n\n\t\t\t\t\t\t\tvertex.fromBufferAttribute( normals, i );\n\n\t\t\t\t\t\t\tvertex.applyMatrix3( normalMatrixWorld ).normalize();\n\n\t\t\t\t\t\t\toutput.setFloat32( vOffset, vertex.x, options.littleEndian );\n\t\t\t\t\t\t\tvOffset += 4;\n\n\t\t\t\t\t\t\toutput.setFloat32( vOffset, vertex.y, options.littleEndian );\n\t\t\t\t\t\t\tvOffset += 4;\n\n\t\t\t\t\t\t\toutput.setFloat32( vOffset, vertex.z, options.littleEndian );\n\t\t\t\t\t\t\tvOffset += 4;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\toutput.setFloat32( vOffset, 0, options.littleEndian );\n\t\t\t\t\t\t\tvOffset += 4;\n\n\t\t\t\t\t\t\toutput.setFloat32( vOffset, 0, options.littleEndian );\n\t\t\t\t\t\t\tvOffset += 4;\n\n\t\t\t\t\t\t\toutput.setFloat32( vOffset, 0, options.littleEndian );\n\t\t\t\t\t\t\tvOffset += 4;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// UV information\n\t\t\t\t\tif ( includeUVs === true ) {\n\n\t\t\t\t\t\tif ( uvs != null ) {\n\n\t\t\t\t\t\t\toutput.setFloat32( vOffset, uvs.getX( i ), options.littleEndian );\n\t\t\t\t\t\t\tvOffset += 4;\n\n\t\t\t\t\t\t\toutput.setFloat32( vOffset, uvs.getY( i ), options.littleEndian );\n\t\t\t\t\t\t\tvOffset += 4;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\toutput.setFloat32( vOffset, 0, options.littleEndian );\n\t\t\t\t\t\t\tvOffset += 4;\n\n\t\t\t\t\t\t\toutput.setFloat32( vOffset, 0, options.littleEndian );\n\t\t\t\t\t\t\tvOffset += 4;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Color information\n\t\t\t\t\tif ( includeColors === true ) {\n\n\t\t\t\t\t\tif ( colors != null ) {\n\n\t\t\t\t\t\t\ttempColor.fromBufferAttribute( colors, i );\n\n\t\t\t\t\t\t\tColorManagement.workingToColorSpace( tempColor, SRGBColorSpace );\n\n\t\t\t\t\t\t\toutput.setUint8( vOffset, Math.floor( tempColor.r * 255 ) );\n\t\t\t\t\t\t\tvOffset += 1;\n\n\t\t\t\t\t\t\toutput.setUint8( vOffset, Math.floor( tempColor.g * 255 ) );\n\t\t\t\t\t\t\tvOffset += 1;\n\n\t\t\t\t\t\t\toutput.setUint8( vOffset, Math.floor( tempColor.b * 255 ) );\n\t\t\t\t\t\t\tvOffset += 1;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\toutput.setUint8( vOffset, 255 );\n\t\t\t\t\t\t\tvOffset += 1;\n\n\t\t\t\t\t\t\toutput.setUint8( vOffset, 255 );\n\t\t\t\t\t\t\tvOffset += 1;\n\n\t\t\t\t\t\t\toutput.setUint8( vOffset, 255 );\n\t\t\t\t\t\t\tvOffset += 1;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( includeIndices === true ) {\n\n\t\t\t\t\t// Create the face list\n\n\t\t\t\t\tif ( indices !== null ) {\n\n\t\t\t\t\t\tfor ( let i = 0, l = indices.count; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\toutput.setUint8( fOffset, 3 );\n\t\t\t\t\t\t\tfOffset += 1;\n\n\t\t\t\t\t\t\toutput.setUint32( fOffset, indices.getX( i + 0 ) + writtenVertices, options.littleEndian );\n\t\t\t\t\t\t\tfOffset += indexByteCount;\n\n\t\t\t\t\t\t\toutput.setUint32( fOffset, indices.getX( i + 1 ) + writtenVertices, options.littleEndian );\n\t\t\t\t\t\t\tfOffset += indexByteCount;\n\n\t\t\t\t\t\t\toutput.setUint32( fOffset, indices.getX( i + 2 ) + writtenVertices, options.littleEndian );\n\t\t\t\t\t\t\tfOffset += indexByteCount;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tfor ( let i = 0, l = vertices.count; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\toutput.setUint8( fOffset, 3 );\n\t\t\t\t\t\t\tfOffset += 1;\n\n\t\t\t\t\t\t\toutput.setUint32( fOffset, writtenVertices + i, options.littleEndian );\n\t\t\t\t\t\t\tfOffset += indexByteCount;\n\n\t\t\t\t\t\t\toutput.setUint32( fOffset, writtenVertices + i + 1, options.littleEndian );\n\t\t\t\t\t\t\tfOffset += indexByteCount;\n\n\t\t\t\t\t\t\toutput.setUint32( fOffset, writtenVertices + i + 2, options.littleEndian );\n\t\t\t\t\t\t\tfOffset += indexByteCount;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t\t// Save the amount of verts we've already written so we can offset\n\t\t\t\t// the face index on the next mesh\n\t\t\t\twrittenVertices += vertices.count;\n\n\t\t\t} );\n\n\t\t\tresult = output.buffer;\n\n\t\t} else {\n\n\t\t\t// Ascii File Generation\n\t\t\t// count the number of vertices\n\t\t\tlet writtenVertices = 0;\n\t\t\tlet vertexList = '';\n\t\t\tlet faceList = '';\n\n\t\t\ttraverseMeshes( function ( mesh, geometry ) {\n\n\t\t\t\tconst vertices = geometry.getAttribute( 'position' );\n\t\t\t\tconst normals = geometry.getAttribute( 'normal' );\n\t\t\t\tconst uvs = geometry.getAttribute( 'uv' );\n\t\t\t\tconst colors = geometry.getAttribute( 'color' );\n\t\t\t\tconst indices = geometry.getIndex();\n\n\t\t\t\tnormalMatrixWorld.getNormalMatrix( mesh.matrixWorld );\n\n\t\t\t\t// form each line\n\t\t\t\tfor ( let i = 0, l = vertices.count; i < l; i ++ ) {\n\n\t\t\t\t\tvertex.fromBufferAttribute( vertices, i );\n\n\t\t\t\t\tvertex.applyMatrix4( mesh.matrixWorld );\n\n\n\t\t\t\t\t// Position information\n\t\t\t\t\tlet line =\n\t\t\t\t\t\tvertex.x + ' ' +\n\t\t\t\t\t\tvertex.y + ' ' +\n\t\t\t\t\t\tvertex.z;\n\n\t\t\t\t\t// Normal information\n\t\t\t\t\tif ( includeNormals === true ) {\n\n\t\t\t\t\t\tif ( normals != null ) {\n\n\t\t\t\t\t\t\tvertex.fromBufferAttribute( normals, i );\n\n\t\t\t\t\t\t\tvertex.applyMatrix3( normalMatrixWorld ).normalize();\n\n\t\t\t\t\t\t\tline += ' ' +\n\t\t\t\t\t\t\t\tvertex.x + ' ' +\n\t\t\t\t\t\t\t\tvertex.y + ' ' +\n\t\t\t\t\t\t\t\tvertex.z;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tline += ' 0 0 0';\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// UV information\n\t\t\t\t\tif ( includeUVs === true ) {\n\n\t\t\t\t\t\tif ( uvs != null ) {\n\n\t\t\t\t\t\t\tline += ' ' +\n\t\t\t\t\t\t\t\tuvs.getX( i ) + ' ' +\n\t\t\t\t\t\t\t\tuvs.getY( i );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tline += ' 0 0';\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Color information\n\t\t\t\t\tif ( includeColors === true ) {\n\n\t\t\t\t\t\tif ( colors != null ) {\n\n\t\t\t\t\t\t\ttempColor.fromBufferAttribute( colors, i );\n\n\t\t\t\t\t\t\tColorManagement.workingToColorSpace( tempColor, SRGBColorSpace );\n\n\t\t\t\t\t\t\tline += ' ' +\n\t\t\t\t\t\t\t\tMath.floor( tempColor.r * 255 ) + ' ' +\n\t\t\t\t\t\t\t\tMath.floor( tempColor.g * 255 ) + ' ' +\n\t\t\t\t\t\t\t\tMath.floor( tempColor.b * 255 );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tline += ' 255 255 255';\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvertexList += line + '\\n';\n\n\t\t\t\t}\n\n\t\t\t\t// Create the face list\n\t\t\t\tif ( includeIndices === true ) {\n\n\t\t\t\t\tif ( indices !== null ) {\n\n\t\t\t\t\t\tfor ( let i = 0, l = indices.count; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\tfaceList += `3 ${ indices.getX( i + 0 ) + writtenVertices }`;\n\t\t\t\t\t\t\tfaceList += ` ${ indices.getX( i + 1 ) + writtenVertices }`;\n\t\t\t\t\t\t\tfaceList += ` ${ indices.getX( i + 2 ) + writtenVertices }\\n`;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tfor ( let i = 0, l = vertices.count; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\tfaceList += `3 ${ writtenVertices + i } ${ writtenVertices + i + 1 } ${ writtenVertices + i + 2 }\\n`;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfaceCount += indices ? indices.count / 3 : vertices.count / 3;\n\n\t\t\t\t}\n\n\t\t\t\twrittenVertices += vertices.count;\n\n\t\t\t} );\n\n\t\t\tresult = `${ header }${vertexList}${ includeIndices ? `${faceList}\\n` : '\\n' }`;\n\n\t\t}\n\n\t\tif ( typeof onDone === 'function' ) requestAnimationFrame( () => onDone( result ) );\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * Export options of `PLYExporter`.\n *\n * @typedef {Object} PLYExporter~Options\n * @property {boolean} [binary=false] - Whether to export in binary format or ASCII.\n * @property {Array<string>} [excludeAttributes] - Which properties to explicitly exclude from\n * the exported PLY file. Valid values are `'color'`, `'normal'`, `'uv'`, and `'index'`. If triangle\n * indices are excluded, then a point cloud is exported.\n * @property {boolean} [littleEndian=false] - Whether the binary export uses little or big endian.\n **/\n\n/**\n * onDone callback of `PLYExporter`.\n *\n * @callback PLYExporter~OnDone\n * @param {string|ArrayBuffer} result - The generated PLY ascii or binary.\n */\n\nexport { PLYExporter };\n", "import { Vector3 } from 'three';\n\n/**\n * An exporter for STL.\n *\n * STL files describe only the surface geometry of a three-dimensional object without\n * any representation of color, texture or other common model attributes. The STL format\n * specifies both ASCII and binary representations, with binary being more compact.\n * STL files contain no scale information or indexes, and the units are arbitrary.\n *\n * ```js\n * const exporter = new STLExporter();\n * const data = exporter.parse( mesh, { binary: true } );\n * ```\n *\n * @three_import import { STLExporter } from 'three/addons/exporters/STLExporter.js';\n */\nclass STLExporter {\n\n\t/**\n\t * Parses the given 3D object and generates the STL output.\n\t *\n\t * If the 3D object is composed of multiple children and geometry, they are merged into a single mesh in the file.\n\t *\n\t * @param {Object3D} scene - A scene, mesh or any other 3D object containing meshes to encode.\n\t * @param {STLExporter~Options} options - The export options.\n\t * @return {string|ArrayBuffer} The exported STL.\n\t */\n\tparse( scene, options = {} ) {\n\n\t\toptions = Object.assign( {\n\t\t\tbinary: false\n\t\t}, options );\n\n\t\tconst binary = options.binary;\n\n\t\t//\n\n\t\tconst objects = [];\n\t\tlet triangles = 0;\n\n\t\tscene.traverse( function ( object ) {\n\n\t\t\tif ( object.isMesh ) {\n\n\t\t\t\tconst geometry = object.geometry;\n\n\t\t\t\tconst index = geometry.index;\n\t\t\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\t\t\ttriangles += ( index !== null ) ? ( index.count / 3 ) : ( positionAttribute.count / 3 );\n\n\t\t\t\tobjects.push( {\n\t\t\t\t\tobject3d: object,\n\t\t\t\t\tgeometry: geometry\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} );\n\n\t\tlet output;\n\t\tlet offset = 80; // skip header\n\n\t\tif ( binary === true ) {\n\n\t\t\tconst bufferLength = triangles * 2 + triangles * 3 * 4 * 4 + 80 + 4;\n\t\t\tconst arrayBuffer = new ArrayBuffer( bufferLength );\n\t\t\toutput = new DataView( arrayBuffer );\n\t\t\toutput.setUint32( offset, triangles, true ); offset += 4;\n\n\t\t} else {\n\n\t\t\toutput = '';\n\t\t\toutput += 'solid exported\\n';\n\n\t\t}\n\n\t\tconst vA = new Vector3();\n\t\tconst vB = new Vector3();\n\t\tconst vC = new Vector3();\n\t\tconst cb = new Vector3();\n\t\tconst ab = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\tfor ( let i = 0, il = objects.length; i < il; i ++ ) {\n\n\t\t\tconst object = objects[ i ].object3d;\n\t\t\tconst geometry = objects[ i ].geometry;\n\n\t\t\tconst index = geometry.index;\n\t\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\t// indexed geometry\n\n\t\t\t\tfor ( let j = 0; j < index.count; j += 3 ) {\n\n\t\t\t\t\tconst a = index.getX( j + 0 );\n\t\t\t\t\tconst b = index.getX( j + 1 );\n\t\t\t\t\tconst c = index.getX( j + 2 );\n\n\t\t\t\t\twriteFace( a, b, c, positionAttribute, object );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// non-indexed geometry\n\n\t\t\t\tfor ( let j = 0; j < positionAttribute.count; j += 3 ) {\n\n\t\t\t\t\tconst a = j + 0;\n\t\t\t\t\tconst b = j + 1;\n\t\t\t\t\tconst c = j + 2;\n\n\t\t\t\t\twriteFace( a, b, c, positionAttribute, object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( binary === false ) {\n\n\t\t\toutput += 'endsolid exported\\n';\n\n\t\t}\n\n\t\treturn output;\n\n\t\tfunction writeFace( a, b, c, positionAttribute, object ) {\n\n\t\t\tvA.fromBufferAttribute( positionAttribute, a );\n\t\t\tvB.fromBufferAttribute( positionAttribute, b );\n\t\t\tvC.fromBufferAttribute( positionAttribute, c );\n\n\t\t\tif ( object.isSkinnedMesh === true ) {\n\n\t\t\t\tobject.applyBoneTransform( a, vA );\n\t\t\t\tobject.applyBoneTransform( b, vB );\n\t\t\t\tobject.applyBoneTransform( c, vC );\n\n\t\t\t}\n\n\t\t\tvA.applyMatrix4( object.matrixWorld );\n\t\t\tvB.applyMatrix4( object.matrixWorld );\n\t\t\tvC.applyMatrix4( object.matrixWorld );\n\n\t\t\twriteNormal( vA, vB, vC );\n\n\t\t\twriteVertex( vA );\n\t\t\twriteVertex( vB );\n\t\t\twriteVertex( vC );\n\n\t\t\tif ( binary === true ) {\n\n\t\t\t\toutput.setUint16( offset, 0, true ); offset += 2;\n\n\t\t\t} else {\n\n\t\t\t\toutput += '\\t\\tendloop\\n';\n\t\t\t\toutput += '\\tendfacet\\n';\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction writeNormal( vA, vB, vC ) {\n\n\t\t\tcb.subVectors( vC, vB );\n\t\t\tab.subVectors( vA, vB );\n\t\t\tcb.cross( ab ).normalize();\n\n\t\t\tnormal.copy( cb ).normalize();\n\n\t\t\tif ( binary === true ) {\n\n\t\t\t\toutput.setFloat32( offset, normal.x, true ); offset += 4;\n\t\t\t\toutput.setFloat32( offset, normal.y, true ); offset += 4;\n\t\t\t\toutput.setFloat32( offset, normal.z, true ); offset += 4;\n\n\t\t\t} else {\n\n\t\t\t\toutput += '\\tfacet normal ' + normal.x + ' ' + normal.y + ' ' + normal.z + '\\n';\n\t\t\t\toutput += '\\t\\touter loop\\n';\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction writeVertex( vertex ) {\n\n\t\t\tif ( binary === true ) {\n\n\t\t\t\toutput.setFloat32( offset, vertex.x, true ); offset += 4;\n\t\t\t\toutput.setFloat32( offset, vertex.y, true ); offset += 4;\n\t\t\t\toutput.setFloat32( offset, vertex.z, true ); offset += 4;\n\n\t\t\t} else {\n\n\t\t\t\toutput += '\\t\\t\\tvertex ' + vertex.x + ' ' + vertex.y + ' ' + vertex.z + '\\n';\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Export options of `STLExporter`.\n *\n * @typedef {Object} STLExporter~Options\n * @property {boolean} [binary=false] - Whether to export in binary format or ASCII.\n **/\n\nexport { STLExporter };\n", "import {\n\tNoColorSpace,\n\tDoubleSide,\n\tColor,\n} from 'three';\n\nimport {\n\tstrToU8,\n\tzipSync,\n} from '../libs/fflate.module.js';\n\nclass USDNode {\n\n\tconstructor( name, type = '', metadata = [], properties = [] ) {\n\n\t\tthis.name = name;\n\t\tthis.type = type;\n\t\tthis.metadata = metadata;\n\t\tthis.properties = properties;\n\t\tthis.children = [];\n\n\t}\n\n\taddMetadata( key, value ) {\n\n\t\tthis.metadata.push( { key, value } );\n\n\t}\n\n\taddProperty( property, metadata = [] ) {\n\n\t\tthis.properties.push( { property, metadata } );\n\n\t}\n\n\taddChild( child ) {\n\n\t\tthis.children.push( child );\n\n\t}\n\n\ttoString( indent = 0 ) {\n\n\t\tconst pad = '\\t'.repeat( indent );\n\n\t\tconst formattedMetadata = this.metadata.map( ( item ) => {\n\n\t\t\tconst key = item.key;\n\t\t\tconst value = item.value;\n\n\t\t\tif ( Array.isArray( value ) ) {\n\n\t\t\t\tconst lines = [];\n\t\t\t\tlines.push( `${key} = {` );\n\t\t\t\tvalue.forEach( ( line ) => {\n\n\t\t\t\t\tlines.push( `${pad}\\t\\t${line}` );\n\n\t\t\t\t} );\n\t\t\t\tlines.push( `${pad}\\t}` );\n\t\t\t\treturn lines.join( '\\n' );\n\n\t\t\t} else {\n\n\t\t\t\treturn `${key} = ${value}`;\n\n\t\t\t}\n\n\t\t} );\n\n\t\tconst meta = formattedMetadata.length\n\t\t\t? ` (\\n${formattedMetadata\n\t\t\t\t.map( ( l ) => `${pad}\\t${l}` )\n\t\t\t\t.join( '\\n' )}\\n${pad})`\n\t\t\t: '';\n\n\t\tconst properties = this.properties.map( ( l ) => {\n\n\t\t\tconst property = l.property;\n\t\t\tconst metadata = l.metadata.length\n\t\t\t\t? ` (\\n${l.metadata.map( ( m ) => `${pad}\\t\\t${m}` ).join( '\\n' )}\\n${pad}\\t)`\n\t\t\t\t: '';\n\t\t\treturn `${pad}\\t${property}${metadata}`;\n\n\t\t} );\n\t\tconst children = this.children.map( ( c ) => c.toString( indent + 1 ) );\n\n\t\tconst bodyLines = [];\n\n\t\tif ( properties.length > 0 ) {\n\n\t\t\tbodyLines.push( ...properties );\n\n\t\t}\n\n\t\tif ( children.length > 0 ) {\n\n\t\t\tif ( properties.length > 0 ) {\n\n\t\t\t\tbodyLines.push( '' );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\tbodyLines.push( children[ i ] );\n\t\t\t\tif ( i < children.length - 1 ) {\n\n\t\t\t\t\tbodyLines.push( '' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst bodyContent = bodyLines.join( '\\n' );\n\n\t\tconst type = this.type ? this.type + ' ' : '';\n\n\t\treturn `${pad}def ${type}\"${this.name}\"${meta}\\n${pad}{\\n${bodyContent}\\n${pad}}`;\n\n\t}\n\n}\n\n/**\n * An exporter for USDZ.\n *\n * ```js\n * const exporter = new USDZExporter();\n * const arraybuffer = await exporter.parseAsync( scene );\n * ```\n *\n * @three_import import { USDZExporter } from 'three/addons/exporters/USDZExporter.js';\n */\nclass USDZExporter {\n\n\t/**\n\t * Constructs a new USDZ exporter.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * A reference to a texture utils module.\n\t\t *\n\t\t * @type {?(WebGLTextureUtils|WebGPUTextureUtils)}\n\t\t * @default null\n\t\t */\n\t\tthis.textureUtils = null;\n\n\t}\n\n\t/**\n\t * Sets the texture utils for this exporter. Only relevant when compressed textures have to be exported.\n\t *\n\t * Depending on whether you use {@link WebGLRenderer} or {@link WebGPURenderer}, you must inject the\n\t * corresponding texture utils {@link WebGLTextureUtils} or {@link WebGPUTextureUtils}.\n\t *\n\t * @param {WebGLTextureUtils|WebGPUTextureUtils} utils - The texture utils.\n\t */\n\tsetTextureUtils( utils ) {\n\n\t\tthis.textureUtils = utils;\n\n\t}\n\n\t/**\n\t * Parse the given 3D object and generates the USDZ output.\n\t *\n\t * @param {Object3D} scene - The 3D object to export.\n\t * @param {USDZExporter~OnDone} onDone - A callback function that is executed when the export has finished.\n\t * @param {USDZExporter~OnError} onError - A callback function that is executed when an error happens.\n\t * @param {USDZExporter~Options} options - The export options.\n\t */\n\tparse( scene, onDone, onError, options ) {\n\n\t\tthis.parseAsync( scene, options ).then( onDone ).catch( onError );\n\n\t}\n\n\t/**\n\t * Async version of {@link USDZExporter#parse}.\n\t *\n\t * @async\n\t * @param {Object3D} scene - The 3D object to export.\n\t * @param {USDZExporter~Options} options - The export options.\n\t * @return {Promise<ArrayBuffer>} A Promise that resolved with the exported USDZ data.\n\t */\n\tasync parseAsync( scene, options = {} ) {\n\n\t\toptions = Object.assign(\n\t\t\t{\n\t\t\t\tar: {\n\t\t\t\t\tanchoring: { type: 'plane' },\n\t\t\t\t\tplaneAnchoring: { alignment: 'horizontal' },\n\t\t\t\t},\n\t\t\t\tincludeAnchoringProperties: true,\n\t\t\t\tonlyVisible: true,\n\t\t\t\tquickLookCompatible: false,\n\t\t\t\tmaxTextureSize: 1024,\n\t\t\t},\n\t\t\toptions\n\t\t);\n\n\t\tconst usedNames = new Set();\n\n\t\tconst files = {};\n\t\tconst modelFileName = 'model.usda';\n\n\t\t// model file should be first in USDZ archive so we init it here\n\t\tfiles[ modelFileName ] = null;\n\n\t\tconst root = new USDNode( 'Root', 'Xform' );\n\t\tconst scenesNode = new USDNode( 'Scenes', 'Scope' );\n\t\tscenesNode.addMetadata( 'kind', '\"sceneLibrary\"' );\n\t\troot.addChild( scenesNode );\n\n\t\tconst sceneName = 'Scene';\n\t\tconst sceneNode = new USDNode( sceneName, 'Xform' );\n\t\tsceneNode.addMetadata( 'customData', [\n\t\t\t'bool preliminary_collidesWithEnvironment = 0',\n\t\t\t`string sceneName = \"${sceneName}\"`,\n\t\t] );\n\t\tsceneNode.addMetadata( 'sceneName', `\"${sceneName}\"` );\n\t\tif ( options.includeAnchoringProperties ) {\n\n\t\t\tsceneNode.addProperty(\n\t\t\t\t`token preliminary:anchoring:type = \"${options.ar.anchoring.type}\"`\n\t\t\t);\n\t\t\tsceneNode.addProperty(\n\t\t\t\t`token preliminary:planeAnchoring:alignment = \"${options.ar.planeAnchoring.alignment}\"`\n\t\t\t);\n\n\t\t}\n\n\t\tscenesNode.addChild( sceneNode );\n\n\t\tlet output;\n\n\t\tconst materials = {};\n\t\tconst textures = {};\n\n\t\tbuildHierarchy( scene, sceneNode, materials, usedNames, files, options );\n\n\t\tconst materialsNode = buildMaterials(\n\t\t\tmaterials,\n\t\t\ttextures,\n\t\t\toptions.quickLookCompatible\n\t\t);\n\n\t\toutput =\n\t\t\tbuildHeader() +\n\t\t\t'\\n' +\n\t\t\troot.toString() +\n\t\t\t'\\n\\n' +\n\t\t\tmaterialsNode.toString();\n\n\t\tfiles[ modelFileName ] = strToU8( output );\n\t\toutput = null;\n\n\t\tfor ( const id in textures ) {\n\n\t\t\tlet texture = textures[ id ];\n\n\t\t\tif ( texture.isCompressedTexture === true ) {\n\n\t\t\t\tif ( this.textureUtils === null ) {\n\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t'THREE.USDZExporter: setTextureUtils() must be called to process compressed textures.'\n\t\t\t\t\t);\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttexture = await this.textureUtils.decompress( texture );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst canvas = imageToCanvas(\n\t\t\t\ttexture.image,\n\t\t\t\ttexture.flipY,\n\t\t\t\toptions.maxTextureSize\n\t\t\t);\n\t\t\tconst blob = await new Promise( ( resolve ) =>\n\t\t\t\tcanvas.toBlob( resolve, 'image/png', 1 )\n\t\t\t);\n\n\t\t\tfiles[ `textures/Texture_${id}.png` ] = new Uint8Array(\n\t\t\t\tawait blob.arrayBuffer()\n\t\t\t);\n\n\t\t}\n\n\t\t// 64 byte alignment\n\t\t// https://github.com/101arrowz/fflate/issues/39#issuecomment-777263109\n\n\t\tlet offset = 0;\n\n\t\tfor ( const filename in files ) {\n\n\t\t\tconst file = files[ filename ];\n\t\t\tconst headerSize = 34 + filename.length;\n\n\t\t\toffset += headerSize;\n\n\t\t\tconst offsetMod64 = offset & 63;\n\n\t\t\tif ( offsetMod64 !== 4 ) {\n\n\t\t\t\tconst padLength = 64 - offsetMod64;\n\t\t\t\tconst padding = new Uint8Array( padLength );\n\n\t\t\t\tfiles[ filename ] = [ file, { extra: { 12345: padding } } ];\n\n\t\t\t}\n\n\t\t\toffset = file.length;\n\n\t\t}\n\n\t\treturn zipSync( files, { level: 0 } );\n\n\t}\n\n}\n\nfunction getName( object, namesSet ) {\n\n\tlet name = object.name;\n\tname = name.replace( /[^A-Za-z0-9_]/g, '' );\n\tif ( /^[0-9]/.test( name ) ) {\n\n\t\tname = '_' + name;\n\n\t}\n\n\tif ( name === '' ) {\n\n\t\tif ( object.isCamera ) {\n\n\t\t\tname = 'Camera';\n\n\t\t} else {\n\n\t\t\tname = 'Object';\n\n\t\t}\n\n\t}\n\n\tif ( namesSet.has( name ) ) {\n\n\t\tname = name + '_' + object.id;\n\n\t}\n\n\tnamesSet.add( name );\n\n\treturn name;\n\n}\n\nfunction imageToCanvas( image, flipY, maxTextureSize ) {\n\n\tif (\n\t\t( typeof HTMLImageElement !== 'undefined' &&\n\t\t\timage instanceof HTMLImageElement ) ||\n\t\t( typeof HTMLCanvasElement !== 'undefined' &&\n\t\t\timage instanceof HTMLCanvasElement ) ||\n\t\t( typeof OffscreenCanvas !== 'undefined' &&\n\t\t\timage instanceof OffscreenCanvas ) ||\n\t\t( typeof ImageBitmap !== 'undefined' && image instanceof ImageBitmap )\n\t) {\n\n\t\tconst scale = maxTextureSize / Math.max( image.width, image.height );\n\n\t\tconst canvas = document.createElement( 'canvas' );\n\t\tcanvas.width = image.width * Math.min( 1, scale );\n\t\tcanvas.height = image.height * Math.min( 1, scale );\n\n\t\tconst context = canvas.getContext( '2d' );\n\n\t\t// TODO: We should be able to do this in the UsdTransform2d?\n\n\t\tif ( flipY === true ) {\n\n\t\t\tcontext.translate( 0, canvas.height );\n\t\t\tcontext.scale( 1, - 1 );\n\n\t\t}\n\n\t\tcontext.drawImage( image, 0, 0, canvas.width, canvas.height );\n\n\t\treturn canvas;\n\n\t} else {\n\n\t\tthrow new Error(\n\t\t\t'THREE.USDZExporter: No valid image data found. Unable to process texture.'\n\t\t);\n\n\t}\n\n}\n\n//\n\nconst PRECISION = 7;\n\nfunction buildHeader() {\n\n\treturn `#usda 1.0\n(\n\tcustomLayerData = {\n\t\tstring creator = \"Three.js USDZExporter\"\n\t}\n\tdefaultPrim = \"Root\"\n\tmetersPerUnit = 1\n\tupAxis = \"Y\"\n)\n`;\n\n}\n\n// Xform\n\nfunction buildHierarchy( object, parentNode, materials, usedNames, files, options ) {\n\n\tfor ( let i = 0, l = object.children.length; i < l; i ++ ) {\n\n\t\tconst child = object.children[ i ];\n\n\t\tif ( child.visible === false && options.onlyVisible === true ) continue;\n\n\t\tlet childNode;\n\n\t\tif ( child.isMesh ) {\n\n\t\t\tconst geometry = child.geometry;\n\t\t\tconst material = child.material;\n\n\t\t\tif ( material.isMeshStandardMaterial ) {\n\n\t\t\t\tconst geometryFileName = 'geometries/Geometry_' + geometry.id + '.usda';\n\n\t\t\t\tif ( ! ( geometryFileName in files ) ) {\n\n\t\t\t\t\tconst meshObject = buildMeshObject( geometry );\n\t\t\t\t\tfiles[ geometryFileName ] = strToU8(\n\t\t\t\t\t\tbuildHeader() + '\\n' + meshObject.toString()\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! ( material.uuid in materials ) ) {\n\n\t\t\t\t\tmaterials[ material.uuid ] = material;\n\n\t\t\t\t}\n\n\t\t\t\tchildNode = buildMesh(\n\t\t\t\t\tchild,\n\t\t\t\t\tgeometry,\n\t\t\t\t\tmaterials[ material.uuid ],\n\t\t\t\t\tusedNames\n\t\t\t\t);\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn(\n\t\t\t\t\t'THREE.USDZExporter: Unsupported material type (USDZ only supports MeshStandardMaterial)',\n\t\t\t\t\tchild\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t} else if ( child.isCamera ) {\n\n\t\t\tchildNode = buildCamera( child, usedNames );\n\n\t\t} else {\n\n\t\t\tchildNode = buildXform( child, usedNames );\n\n\t\t}\n\n\t\tif ( childNode ) {\n\n\t\t\tparentNode.addChild( childNode );\n\t\t\tbuildHierarchy( child, childNode, materials, usedNames, files, options );\n\n\t\t}\n\n\t}\n\n}\n\nfunction buildXform( object, usedNames ) {\n\n\tconst name = getName( object, usedNames );\n\tconst transform = buildMatrix( object.matrix );\n\n\tif ( object.matrix.determinant() < 0 ) {\n\n\t\tconsole.warn(\n\t\t\t'THREE.USDZExporter: USDZ does not support negative scales',\n\t\t\tobject\n\t\t);\n\n\t}\n\n\tconst node = new USDNode( name, 'Xform' );\n\n\tnode.addProperty( `matrix4d xformOp:transform = ${transform}` );\n\tnode.addProperty( 'uniform token[] xformOpOrder = [\"xformOp:transform\"]' );\n\n\treturn node;\n\n}\n\nfunction buildMesh( object, geometry, material, usedNames ) {\n\n\tconst node = buildXform( object, usedNames );\n\n\tnode.addMetadata(\n\t\t'prepend references',\n\t\t`@./geometries/Geometry_${geometry.id}.usda@</Geometry>`\n\t);\n\tnode.addMetadata( 'prepend apiSchemas', '[\"MaterialBindingAPI\"]' );\n\n\tnode.addProperty(\n\t\t`rel material:binding = </Materials/Material_${material.id}>`\n\t);\n\n\treturn node;\n\n}\n\nfunction buildMatrix( matrix ) {\n\n\tconst array = matrix.elements;\n\n\treturn `( ${buildMatrixRow( array, 0 )}, ${buildMatrixRow(\n\t\tarray,\n\t\t4\n\t)}, ${buildMatrixRow( array, 8 )}, ${buildMatrixRow( array, 12 )} )`;\n\n}\n\nfunction buildMatrixRow( array, offset ) {\n\n\treturn `(${array[ offset + 0 ]}, ${array[ offset + 1 ]}, ${array[ offset + 2 ]}, ${\n\t\tarray[ offset + 3 ]\n\t})`;\n\n}\n\n// Mesh\n\nfunction buildMeshObject( geometry ) {\n\n\tconst node = new USDNode( 'Geometry' );\n\n\tconst meshNode = buildMeshNode( geometry );\n\tnode.addChild( meshNode );\n\n\treturn node;\n\n}\n\nfunction buildMeshNode( geometry ) {\n\n\tconst name = 'Geometry';\n\tconst attributes = geometry.attributes;\n\tconst count = attributes.position.count;\n\n\tconst node = new USDNode( name, 'Mesh' );\n\n\tnode.addProperty(\n\t\t`int[] faceVertexCounts = [${buildMeshVertexCount( geometry )}]`\n\t);\n\tnode.addProperty(\n\t\t`int[] faceVertexIndices = [${buildMeshVertexIndices( geometry )}]`\n\t);\n\tnode.addProperty(\n\t\t`normal3f[] normals = [${buildVector3Array( attributes.normal, count )}]`,\n\t\t[ 'interpolation = \"vertex\"' ]\n\t);\n\tnode.addProperty(\n\t\t`point3f[] points = [${buildVector3Array( attributes.position, count )}]`\n\t);\n\n\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\tconst id = i > 0 ? i : '';\n\t\tconst attribute = attributes[ 'uv' + id ];\n\t\tif ( attribute !== undefined ) {\n\n\t\t\tnode.addProperty(\n\t\t\t\t`texCoord2f[] primvars:st${id} = [${buildVector2Array( attribute )}]`,\n\t\t\t\t[ 'interpolation = \"vertex\"' ]\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\tconst colorAttribute = attributes.color;\n\tif ( colorAttribute !== undefined ) {\n\n\t\tnode.addProperty(\n\t\t\t`color3f[] primvars:displayColor = [${buildVector3Array(\n\t\t\t\tcolorAttribute,\n\t\t\t\tcount\n\t\t\t)}]`,\n\t\t\t[ 'interpolation = \"vertex\"' ]\n\t\t);\n\n\t}\n\n\tnode.addProperty( 'uniform token subdivisionScheme = \"none\"' );\n\n\treturn node;\n\n}\n\nfunction buildMeshVertexCount( geometry ) {\n\n\tconst count =\n\t\tgeometry.index !== null\n\t\t\t? geometry.index.count\n\t\t\t: geometry.attributes.position.count;\n\n\treturn Array( count / 3 )\n\t\t.fill( 3 )\n\t\t.join( ', ' );\n\n}\n\nfunction buildMeshVertexIndices( geometry ) {\n\n\tconst index = geometry.index;\n\tconst array = [];\n\n\tif ( index !== null ) {\n\n\t\tfor ( let i = 0; i < index.count; i ++ ) {\n\n\t\t\tarray.push( index.getX( i ) );\n\n\t\t}\n\n\t} else {\n\n\t\tconst length = geometry.attributes.position.count;\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tarray.push( i );\n\n\t\t}\n\n\t}\n\n\treturn array.join( ', ' );\n\n}\n\nfunction buildVector3Array( attribute, count ) {\n\n\tif ( attribute === undefined ) {\n\n\t\tconsole.warn( 'USDZExporter: Normals missing.' );\n\t\treturn Array( count ).fill( '(0, 0, 0)' ).join( ', ' );\n\n\t}\n\n\tconst array = [];\n\n\tfor ( let i = 0; i < attribute.count; i ++ ) {\n\n\t\tconst x = attribute.getX( i );\n\t\tconst y = attribute.getY( i );\n\t\tconst z = attribute.getZ( i );\n\n\t\tarray.push(\n\t\t\t`(${x.toPrecision( PRECISION )}, ${y.toPrecision(\n\t\t\t\tPRECISION\n\t\t\t)}, ${z.toPrecision( PRECISION )})`\n\t\t);\n\n\t}\n\n\treturn array.join( ', ' );\n\n}\n\nfunction buildVector2Array( attribute ) {\n\n\tconst array = [];\n\n\tfor ( let i = 0; i < attribute.count; i ++ ) {\n\n\t\tconst x = attribute.getX( i );\n\t\tconst y = attribute.getY( i );\n\n\t\tarray.push(\n\t\t\t`(${x.toPrecision( PRECISION )}, ${1 - y.toPrecision( PRECISION )})`\n\t\t);\n\n\t}\n\n\treturn array.join( ', ' );\n\n}\n\n// Materials\n\nfunction buildMaterials( materials, textures, quickLookCompatible = false ) {\n\n\tconst materialsNode = new USDNode( 'Materials' );\n\n\tfor ( const uuid in materials ) {\n\n\t\tconst material = materials[ uuid ];\n\n\t\tmaterialsNode.addChild(\n\t\t\tbuildMaterial( material, textures, quickLookCompatible )\n\t\t);\n\n\t}\n\n\treturn materialsNode;\n\n}\n\nfunction buildMaterial( material, textures, quickLookCompatible = false ) {\n\n\t// https://graphics.pixar.com/usd/docs/UsdPreviewSurface-Proposal.html\n\n\tconst materialNode = new USDNode( `Material_${material.id}`, 'Material' );\n\n\tfunction buildTextureNodes( texture, mapType, color ) {\n\n\t\tconst id = texture.source.id + '_' + texture.flipY;\n\n\t\ttextures[ id ] = texture;\n\n\t\tconst uv = texture.channel > 0 ? 'st' + texture.channel : 'st';\n\n\t\tconst WRAPPINGS = {\n\t\t\t1000: 'repeat', // RepeatWrapping\n\t\t\t1001: 'clamp', // ClampToEdgeWrapping\n\t\t\t1002: 'mirror', // MirroredRepeatWrapping\n\t\t};\n\n\t\tconst repeat = texture.repeat.clone();\n\t\tconst offset = texture.offset.clone();\n\t\tconst rotation = texture.rotation;\n\n\t\t// rotation is around the wrong point. after rotation we need to shift offset again so that we're rotating around the right spot\n\t\tconst xRotationOffset = Math.sin( rotation );\n\t\tconst yRotationOffset = Math.cos( rotation );\n\n\t\t// texture coordinates start in the opposite corner, need to correct\n\t\toffset.y = 1 - offset.y - repeat.y;\n\n\t\t// turns out QuickLook is buggy and interprets texture repeat inverted/applies operations in a different order.\n\t\t// Apple Feedback: \tFB10036297 and FB11442287\n\t\tif ( quickLookCompatible ) {\n\n\t\t\t// This is NOT correct yet in QuickLook, but comes close for a range of models.\n\t\t\t// It becomes more incorrect the bigger the offset is\n\n\t\t\toffset.x = offset.x / repeat.x;\n\t\t\toffset.y = offset.y / repeat.y;\n\n\t\t\toffset.x += xRotationOffset / repeat.x;\n\t\t\toffset.y += yRotationOffset - 1;\n\n\t\t} else {\n\n\t\t\t// results match glTF results exactly. verified correct in usdview.\n\t\t\toffset.x += xRotationOffset * repeat.x;\n\t\t\toffset.y += ( 1 - yRotationOffset ) * repeat.y;\n\n\t\t}\n\n\t\tconst primvarReaderNode = new USDNode( `PrimvarReader_${mapType}`, 'Shader' );\n\t\tprimvarReaderNode.addProperty(\n\t\t\t'uniform token info:id = \"UsdPrimvarReader_float2\"'\n\t\t);\n\t\tprimvarReaderNode.addProperty( 'float2 inputs:fallback = (0.0, 0.0)' );\n\t\tprimvarReaderNode.addProperty( `string inputs:varname = \"${uv}\"` );\n\t\tprimvarReaderNode.addProperty( 'float2 outputs:result' );\n\n\t\tconst transform2dNode = new USDNode( `Transform2d_${mapType}`, 'Shader' );\n\t\ttransform2dNode.addProperty( 'uniform token info:id = \"UsdTransform2d\"' );\n\t\ttransform2dNode.addProperty(\n\t\t\t`float2 inputs:in.connect = </Materials/Material_${material.id}/PrimvarReader_${mapType}.outputs:result>`\n\t\t);\n\t\ttransform2dNode.addProperty(\n\t\t\t`float inputs:rotation = ${( rotation * ( 180 / Math.PI ) ).toFixed(\n\t\t\t\tPRECISION\n\t\t\t)}`\n\t\t);\n\t\ttransform2dNode.addProperty(\n\t\t\t`float2 inputs:scale = ${buildVector2( repeat )}`\n\t\t);\n\t\ttransform2dNode.addProperty(\n\t\t\t`float2 inputs:translation = ${buildVector2( offset )}`\n\t\t);\n\t\ttransform2dNode.addProperty( 'float2 outputs:result' );\n\n\t\tconst textureNode = new USDNode(\n\t\t\t`Texture_${texture.id}_${mapType}`,\n\t\t\t'Shader'\n\t\t);\n\t\ttextureNode.addProperty( 'uniform token info:id = \"UsdUVTexture\"' );\n\t\ttextureNode.addProperty( `asset inputs:file = @textures/Texture_${id}.png@` );\n\t\ttextureNode.addProperty(\n\t\t\t`float2 inputs:st.connect = </Materials/Material_${material.id}/Transform2d_${mapType}.outputs:result>`\n\t\t);\n\n\t\tif ( color !== undefined ) {\n\n\t\t\ttextureNode.addProperty( `float4 inputs:scale = ${buildColor4( color )}` );\n\n\t\t}\n\n\t\tif ( mapType === 'normal' ) {\n\n\t\t\ttextureNode.addProperty( 'float4 inputs:scale = (2, 2, 2, 1)' );\n\t\t\ttextureNode.addProperty( 'float4 inputs:bias = (-1, -1, -1, 0)' );\n\n\t\t}\n\n\t\ttextureNode.addProperty(\n\t\t\t`token inputs:sourceColorSpace = \"${\n\t\t\t\ttexture.colorSpace === NoColorSpace ? 'raw' : 'sRGB'\n\t\t\t}\"`\n\t\t);\n\t\ttextureNode.addProperty(\n\t\t\t`token inputs:wrapS = \"${WRAPPINGS[ texture.wrapS ]}\"`\n\t\t);\n\t\ttextureNode.addProperty(\n\t\t\t`token inputs:wrapT = \"${WRAPPINGS[ texture.wrapT ]}\"`\n\t\t);\n\t\ttextureNode.addProperty( 'float outputs:r' );\n\t\ttextureNode.addProperty( 'float outputs:g' );\n\t\ttextureNode.addProperty( 'float outputs:b' );\n\t\ttextureNode.addProperty( 'float3 outputs:rgb' );\n\n\t\tif ( material.transparent || material.alphaTest > 0.0 ) {\n\n\t\t\ttextureNode.addProperty( 'float outputs:a' );\n\n\t\t}\n\n\t\treturn [ primvarReaderNode, transform2dNode, textureNode ];\n\n\t}\n\n\tif ( material.side === DoubleSide ) {\n\n\t\tconsole.warn(\n\t\t\t'THREE.USDZExporter: USDZ does not support double sided materials',\n\t\t\tmaterial\n\t\t);\n\n\t}\n\n\tconst previewSurfaceNode = new USDNode( 'PreviewSurface', 'Shader' );\n\tpreviewSurfaceNode.addProperty( 'uniform token info:id = \"UsdPreviewSurface\"' );\n\n\tif ( material.map !== null ) {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`color3f inputs:diffuseColor.connect = </Materials/Material_${material.id}/Texture_${material.map.id}_diffuse.outputs:rgb>`\n\t\t);\n\n\t\tif ( material.transparent ) {\n\n\t\t\tpreviewSurfaceNode.addProperty(\n\t\t\t\t`float inputs:opacity.connect = </Materials/Material_${material.id}/Texture_${material.map.id}_diffuse.outputs:a>`\n\t\t\t);\n\n\t\t} else if ( material.alphaTest > 0.0 ) {\n\n\t\t\tpreviewSurfaceNode.addProperty(\n\t\t\t\t`float inputs:opacity.connect = </Materials/Material_${material.id}/Texture_${material.map.id}_diffuse.outputs:a>`\n\t\t\t);\n\t\t\tpreviewSurfaceNode.addProperty(\n\t\t\t\t`float inputs:opacityThreshold = ${material.alphaTest}`\n\t\t\t);\n\n\t\t}\n\n\t\tconst textureNodes = buildTextureNodes(\n\t\t\tmaterial.map,\n\t\t\t'diffuse',\n\t\t\tmaterial.color\n\t\t);\n\t\ttextureNodes.forEach( ( node ) => materialNode.addChild( node ) );\n\n\t} else {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`color3f inputs:diffuseColor = ${buildColor( material.color )}`\n\t\t);\n\n\t}\n\n\tif ( material.emissiveMap !== null ) {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`color3f inputs:emissiveColor.connect = </Materials/Material_${material.id}/Texture_${material.emissiveMap.id}_emissive.outputs:rgb>`\n\t\t);\n\n\t\tconst emissiveColor = new Color(\n\t\t\tmaterial.emissive.r * material.emissiveIntensity,\n\t\t\tmaterial.emissive.g * material.emissiveIntensity,\n\t\t\tmaterial.emissive.b * material.emissiveIntensity\n\t\t);\n\t\tconst textureNodes = buildTextureNodes(\n\t\t\tmaterial.emissiveMap,\n\t\t\t'emissive',\n\t\t\temissiveColor\n\t\t);\n\t\ttextureNodes.forEach( ( node ) => materialNode.addChild( node ) );\n\n\t} else if ( material.emissive.getHex() > 0 ) {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`color3f inputs:emissiveColor = ${buildColor( material.emissive )}`\n\t\t);\n\n\t}\n\n\tif ( material.normalMap !== null ) {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`normal3f inputs:normal.connect = </Materials/Material_${material.id}/Texture_${material.normalMap.id}_normal.outputs:rgb>`\n\t\t);\n\n\t\tconst textureNodes = buildTextureNodes( material.normalMap, 'normal' );\n\t\ttextureNodes.forEach( ( node ) => materialNode.addChild( node ) );\n\n\t}\n\n\tif ( material.aoMap !== null ) {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`float inputs:occlusion.connect = </Materials/Material_${material.id}/Texture_${material.aoMap.id}_occlusion.outputs:r>`\n\t\t);\n\n\t\tconst aoColor = new Color(\n\t\t\tmaterial.aoMapIntensity,\n\t\t\tmaterial.aoMapIntensity,\n\t\t\tmaterial.aoMapIntensity\n\t\t);\n\t\tconst textureNodes = buildTextureNodes(\n\t\t\tmaterial.aoMap,\n\t\t\t'occlusion',\n\t\t\taoColor\n\t\t);\n\t\ttextureNodes.forEach( ( node ) => materialNode.addChild( node ) );\n\n\t}\n\n\tif ( material.roughnessMap !== null ) {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`float inputs:roughness.connect = </Materials/Material_${material.id}/Texture_${material.roughnessMap.id}_roughness.outputs:g>`\n\t\t);\n\n\t\tconst roughnessColor = new Color(\n\t\t\tmaterial.roughness,\n\t\t\tmaterial.roughness,\n\t\t\tmaterial.roughness\n\t\t);\n\t\tconst textureNodes = buildTextureNodes(\n\t\t\tmaterial.roughnessMap,\n\t\t\t'roughness',\n\t\t\troughnessColor\n\t\t);\n\t\ttextureNodes.forEach( ( node ) => materialNode.addChild( node ) );\n\n\t} else {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`float inputs:roughness = ${material.roughness}`\n\t\t);\n\n\t}\n\n\tif ( material.metalnessMap !== null ) {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`float inputs:metallic.connect = </Materials/Material_${material.id}/Texture_${material.metalnessMap.id}_metallic.outputs:b>`\n\t\t);\n\n\t\tconst metalnessColor = new Color(\n\t\t\tmaterial.metalness,\n\t\t\tmaterial.metalness,\n\t\t\tmaterial.metalness\n\t\t);\n\t\tconst textureNodes = buildTextureNodes(\n\t\t\tmaterial.metalnessMap,\n\t\t\t'metallic',\n\t\t\tmetalnessColor\n\t\t);\n\t\ttextureNodes.forEach( ( node ) => materialNode.addChild( node ) );\n\n\t} else {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`float inputs:metallic = ${material.metalness}`\n\t\t);\n\n\t}\n\n\tif ( material.alphaMap !== null ) {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`float inputs:opacity.connect = </Materials/Material_${material.id}/Texture_${material.alphaMap.id}_opacity.outputs:r>`\n\t\t);\n\t\tpreviewSurfaceNode.addProperty( 'float inputs:opacityThreshold = 0.0001' );\n\n\t\tconst textureNodes = buildTextureNodes( material.alphaMap, 'opacity' );\n\t\ttextureNodes.forEach( ( node ) => materialNode.addChild( node ) );\n\n\t} else {\n\n\t\tpreviewSurfaceNode.addProperty(\n\t\t\t`float inputs:opacity = ${material.opacity}`\n\t\t);\n\n\t}\n\n\tif ( material.isMeshPhysicalMaterial ) {\n\n\t\tif ( material.clearcoatMap !== null ) {\n\n\t\t\tpreviewSurfaceNode.addProperty(\n\t\t\t\t`float inputs:clearcoat.connect = </Materials/Material_${material.id}/Texture_${material.clearcoatMap.id}_clearcoat.outputs:r>`\n\t\t\t);\n\n\t\t\tconst clearcoatColor = new Color(\n\t\t\t\tmaterial.clearcoat,\n\t\t\t\tmaterial.clearcoat,\n\t\t\t\tmaterial.clearcoat\n\t\t\t);\n\t\t\tconst textureNodes = buildTextureNodes(\n\t\t\t\tmaterial.clearcoatMap,\n\t\t\t\t'clearcoat',\n\t\t\t\tclearcoatColor\n\t\t\t);\n\t\t\ttextureNodes.forEach( ( node ) => materialNode.addChild( node ) );\n\n\t\t} else {\n\n\t\t\tpreviewSurfaceNode.addProperty(\n\t\t\t\t`float inputs:clearcoat = ${material.clearcoat}`\n\t\t\t);\n\n\t\t}\n\n\t\tif ( material.clearcoatRoughnessMap !== null ) {\n\n\t\t\tpreviewSurfaceNode.addProperty(\n\t\t\t\t`float inputs:clearcoatRoughness.connect = </Materials/Material_${material.id}/Texture_${material.clearcoatRoughnessMap.id}_clearcoatRoughness.outputs:g>`\n\t\t\t);\n\n\t\t\tconst clearcoatRoughnessColor = new Color(\n\t\t\t\tmaterial.clearcoatRoughness,\n\t\t\t\tmaterial.clearcoatRoughness,\n\t\t\t\tmaterial.clearcoatRoughness\n\t\t\t);\n\t\t\tconst textureNodes = buildTextureNodes(\n\t\t\t\tmaterial.clearcoatRoughnessMap,\n\t\t\t\t'clearcoatRoughness',\n\t\t\t\tclearcoatRoughnessColor\n\t\t\t);\n\t\t\ttextureNodes.forEach( ( node ) => materialNode.addChild( node ) );\n\n\t\t} else {\n\n\t\t\tpreviewSurfaceNode.addProperty(\n\t\t\t\t`float inputs:clearcoatRoughness = ${material.clearcoatRoughness}`\n\t\t\t);\n\n\t\t}\n\n\t\tpreviewSurfaceNode.addProperty( `float inputs:ior = ${material.ior}` );\n\n\t}\n\n\tpreviewSurfaceNode.addProperty( 'int inputs:useSpecularWorkflow = 0' );\n\tpreviewSurfaceNode.addProperty( 'token outputs:surface' );\n\n\tmaterialNode.addChild( previewSurfaceNode );\n\n\tmaterialNode.addProperty(\n\t\t`token outputs:surface.connect = </Materials/Material_${material.id}/PreviewSurface.outputs:surface>`\n\t);\n\n\treturn materialNode;\n\n}\n\nfunction buildColor( color ) {\n\n\treturn `(${color.r}, ${color.g}, ${color.b})`;\n\n}\n\nfunction buildColor4( color ) {\n\n\treturn `(${color.r}, ${color.g}, ${color.b}, 1.0)`;\n\n}\n\nfunction buildVector2( vector ) {\n\n\treturn `(${vector.x}, ${vector.y})`;\n\n}\n\nfunction buildCamera( camera, usedNames ) {\n\n\tconst name = getName( camera, usedNames );\n\n\tconst transform = buildMatrix( camera.matrix );\n\n\tif ( camera.matrix.determinant() < 0 ) {\n\n\t\tconsole.warn(\n\t\t\t'THREE.USDZExporter: USDZ does not support negative scales',\n\t\t\tcamera\n\t\t);\n\n\t}\n\n\tconst node = new USDNode( name, 'Camera' );\n\tnode.addProperty( `matrix4d xformOp:transform = ${transform}` );\n\tnode.addProperty( 'uniform token[] xformOpOrder = [\"xformOp:transform\"]' );\n\n\tconst projection = camera.isOrthographicCamera\n\t\t? 'orthographic'\n\t\t: 'perspective';\n\tnode.addProperty( `token projection = \"${projection}\"` );\n\n\tconst clippingRange = `(${camera.near.toPrecision(\n\t\tPRECISION\n\t)}, ${camera.far.toPrecision( PRECISION )})`;\n\tnode.addProperty( `float2 clippingRange = ${clippingRange}` );\n\n\tlet horizontalAperture;\n\tif ( camera.isOrthographicCamera ) {\n\n\t\thorizontalAperture = (\n\t\t\t( Math.abs( camera.left ) + Math.abs( camera.right ) ) *\n\t\t\t10\n\t\t).toPrecision( PRECISION );\n\n\t} else {\n\n\t\thorizontalAperture = camera.getFilmWidth().toPrecision( PRECISION );\n\n\t}\n\n\tnode.addProperty( `float horizontalAperture = ${horizontalAperture}` );\n\n\tlet verticalAperture;\n\tif ( camera.isOrthographicCamera ) {\n\n\t\tverticalAperture = (\n\t\t\t( Math.abs( camera.top ) + Math.abs( camera.bottom ) ) *\n\t\t\t10\n\t\t).toPrecision( PRECISION );\n\n\t} else {\n\n\t\tverticalAperture = camera.getFilmHeight().toPrecision( PRECISION );\n\n\t}\n\n\tnode.addProperty( `float verticalAperture = ${verticalAperture}` );\n\n\tif ( camera.isPerspectiveCamera ) {\n\n\t\tconst focalLength = camera.getFocalLength().toPrecision( PRECISION );\n\t\tnode.addProperty( `float focalLength = ${focalLength}` );\n\n\t\tconst focusDistance = camera.focus.toPrecision( PRECISION );\n\t\tnode.addProperty( `float focusDistance = ${focusDistance}` );\n\n\t}\n\n\treturn node;\n\n}\n\n/**\n * Export options of `USDZExporter`.\n *\n * @typedef {Object} USDZExporter~Options\n * @property {number} [maxTextureSize=1024] - The maximum texture size that is going to be exported.\n * @property {boolean} [includeAnchoringProperties=true] - Whether to include anchoring properties or not.\n * @property {boolean} [onlyVisible=true] - Export only visible 3D objects.\n * @property {Object} [ar] - If `includeAnchoringProperties` is set to `true`, the anchoring type and alignment\n * can be configured via `ar.anchoring.type` and `ar.planeAnchoring.alignment`.\n * @property {boolean} [quickLookCompatible=false] - Whether to make the exported USDZ compatible to QuickLook\n * which means the asset is modified to accommodate the bugs FB10036297 and FB11442287 (Apple Feedback).\n **/\n\n/**\n * onDone callback of `USDZExporter`.\n *\n * @callback USDZExporter~OnDone\n * @param {ArrayBuffer} result - The generated USDZ.\n */\n\n/**\n * onError callback of `USDZExporter`.\n *\n * @callback USDZExporter~OnError\n * @param {Error} error - The error object.\n */\n\nexport { USDZExporter };\n", "import {\n\tBufferGeometry,\n\tFloat32BufferAttribute\n} from 'three';\n\n/**\n * A special type of box geometry intended for {@link LineSegments}.\n *\n * ```js\n * const geometry = new THREE.BoxLineGeometry();\n * const material = new THREE.LineBasicMaterial( { color: 0x00ff00 } );\n * const lines = new THREE.LineSegments( geometry, material );\n * scene.add( lines );\n * ```\n *\n * @augments BufferGeometry\n * @three_import import { BoxLineGeometry } from 'three/addons/geometries/BoxLineGeometry.js';\n */\nclass BoxLineGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new box line geometry.\n\t *\n\t * @param {number} [width=1] - The width. That is, the length of the edges parallel to the X axis.\n\t * @param {number} [height=1] - The height. That is, the length of the edges parallel to the Y axis.\n\t * @param {number} [depth=1] - The depth. That is, the length of the edges parallel to the Z axis.\n\t * @param {number} [widthSegments=1] - Number of segmented rectangular sections along the width of the sides.\n\t * @param {number} [heightSegments=1] - Number of segmented rectangular sections along the height of the sides.\n\t * @param {number} [depthSegments=1] - Number of segmented rectangular sections along the depth of the sides.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1 ) {\n\n\t\tsuper();\n\n\t\twidthSegments = Math.floor( widthSegments );\n\t\theightSegments = Math.floor( heightSegments );\n\t\tdepthSegments = Math.floor( depthSegments );\n\n\t\tconst widthHalf = width / 2;\n\t\tconst heightHalf = height / 2;\n\t\tconst depthHalf = depth / 2;\n\n\t\tconst segmentWidth = width / widthSegments;\n\t\tconst segmentHeight = height / heightSegments;\n\t\tconst segmentDepth = depth / depthSegments;\n\n\t\tconst vertices = [];\n\n\t\tlet x = - widthHalf;\n\t\tlet y = - heightHalf;\n\t\tlet z = - depthHalf;\n\n\t\tfor ( let i = 0; i <= widthSegments; i ++ ) {\n\n\t\t\tvertices.push( x, - heightHalf, - depthHalf, x, heightHalf, - depthHalf );\n\t\t\tvertices.push( x, heightHalf, - depthHalf, x, heightHalf, depthHalf );\n\t\t\tvertices.push( x, heightHalf, depthHalf, x, - heightHalf, depthHalf );\n\t\t\tvertices.push( x, - heightHalf, depthHalf, x, - heightHalf, - depthHalf );\n\n\t\t\tx += segmentWidth;\n\n\t\t}\n\n\t\tfor ( let i = 0; i <= heightSegments; i ++ ) {\n\n\t\t\tvertices.push( - widthHalf, y, - depthHalf, widthHalf, y, - depthHalf );\n\t\t\tvertices.push( widthHalf, y, - depthHalf, widthHalf, y, depthHalf );\n\t\t\tvertices.push( widthHalf, y, depthHalf, - widthHalf, y, depthHalf );\n\t\t\tvertices.push( - widthHalf, y, depthHalf, - widthHalf, y, - depthHalf );\n\n\t\t\ty += segmentHeight;\n\n\t\t}\n\n\t\tfor ( let i = 0; i <= depthSegments; i ++ ) {\n\n\t\t\tvertices.push( - widthHalf, - heightHalf, z, - widthHalf, heightHalf, z );\n\t\t\tvertices.push( - widthHalf, heightHalf, z, widthHalf, heightHalf, z );\n\t\t\tvertices.push( widthHalf, heightHalf, z, widthHalf, - heightHalf, z );\n\t\t\tvertices.push( widthHalf, - heightHalf, z, - widthHalf, - heightHalf, z );\n\n\t\t\tz += segmentDepth;\n\n\t\t}\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t}\n\n}\n\nexport { BoxLineGeometry };\n", "import {\n\tLine3,\n\tPlane,\n\tTriangle,\n\tVector3\n} from 'three';\n\nconst Visible = 0;\nconst Deleted = 1;\n\nconst _v1 = new Vector3();\nconst _line3 = new Line3();\nconst _plane = new Plane();\nconst _closestPoint = new Vector3();\nconst _triangle = new Triangle();\n\n/**\n * Can be used to compute the convex hull in 3D space for a given set of points. It\n * is primarily intended for {@link ConvexGeometry}.\n *\n * This Quickhull 3D implementation is a port of [quickhull3d](https://github.com/maurizzzio/quickhull3d/)\n * by Mauricio Poppe.\n *\n * @three_import import { ConvexHull } from 'three/addons/math/ConvexHull.js';\n */\nclass ConvexHull {\n\n\t/**\n\t * Constructs a new convex hull.\n\t */\n\tconstructor() {\n\n\t\tthis.tolerance = - 1;\n\n\t\tthis.faces = []; // the generated faces of the convex hull\n\t\tthis.newFaces = []; // this array holds the faces that are generated within a single iteration\n\n\t\t// the vertex lists work as follows:\n\t\t//\n\t\t// let 'a' and 'b' be 'Face' instances\n\t\t// let 'v' be points wrapped as instance of 'Vertex'\n\t\t//\n\t\t//     [v, v, ..., v, v, v, ...]\n\t\t//      ^             ^\n\t\t//      |             |\n\t\t//  a.outside     b.outside\n\t\t//\n\t\tthis.assigned = new VertexList();\n\t\tthis.unassigned = new VertexList();\n\n\t\tthis.vertices = []; // vertices of the hull (internal representation of given geometry data)\n\n\t}\n\n\t/**\n\t * Computes to convex hull for the given array of points.\n\t *\n\t * @param {Array<Vector3>} points - The array of points in 3D space.\n\t * @return {ConvexHull} A reference to this convex hull.\n\t */\n\tsetFromPoints( points ) {\n\n\t\t// The algorithm needs at least four points.\n\n\t\tif ( points.length >= 4 ) {\n\n\t\t\tthis.makeEmpty();\n\n\t\t\tfor ( let i = 0, l = points.length; i < l; i ++ ) {\n\n\t\t\t\tthis.vertices.push( new VertexNode( points[ i ] ) );\n\n\t\t\t}\n\n\t\t\tthis._compute();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the convex hull of the given 3D object (including its descendants),\n\t * accounting for the world transforms of both the 3D object and its descendants.\n\t *\n\t * @param {Object3D} object - The 3D object to compute the convex hull for.\n\t * @return {ConvexHull} A reference to this convex hull.\n\t */\n\tsetFromObject( object ) {\n\n\t\tconst points = [];\n\n\t\tobject.updateMatrixWorld( true );\n\n\t\tobject.traverse( function ( node ) {\n\n\t\t\tconst geometry = node.geometry;\n\n\t\t\tif ( geometry !== undefined ) {\n\n\t\t\t\tconst attribute = geometry.attributes.position;\n\n\t\t\t\tif ( attribute !== undefined ) {\n\n\t\t\t\t\tfor ( let i = 0, l = attribute.count; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst point = new Vector3();\n\n\t\t\t\t\t\tpoint.fromBufferAttribute( attribute, i ).applyMatrix4( node.matrixWorld );\n\n\t\t\t\t\t\tpoints.push( point );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn this.setFromPoints( points );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies in the convex hull.\n\t *\n\t * @param {Vector3} point - The point to test.\n\t * @return {boolean} Whether the given point lies in the convex hull or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\tconst faces = this.faces;\n\n\t\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\tconst face = faces[ i ];\n\n\t\t\t// compute signed distance and check on what half space the point lies\n\n\t\t\tif ( face.distanceToPoint( point ) > this.tolerance ) return false;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Computes the intersections point of the given ray and this convex hull.\n\t *\n\t * @param {Ray} ray - The ray to test.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point. Returns `null` if not intersection was detected.\n\t */\n\tintersectRay( ray, target ) {\n\n\t\t// based on \"Fast Ray-Convex Polyhedron Intersection\" by Eric Haines, GRAPHICS GEMS II\n\n\t\tconst faces = this.faces;\n\n\t\tlet tNear = - Infinity;\n\t\tlet tFar = Infinity;\n\n\t\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\tconst face = faces[ i ];\n\n\t\t\t// interpret faces as planes for the further computation\n\n\t\t\tconst vN = face.distanceToPoint( ray.origin );\n\t\t\tconst vD = face.normal.dot( ray.direction );\n\n\t\t\t// if the origin is on the positive side of a plane (so the plane can \"see\" the origin) and\n\t\t\t// the ray is turned away or parallel to the plane, there is no intersection\n\n\t\t\tif ( vN > 0 && vD >= 0 ) return null;\n\n\t\t\t// compute the distance from the ray\u2019s origin to the intersection with the plane\n\n\t\t\tconst t = ( vD !== 0 ) ? ( - vN / vD ) : 0;\n\n\t\t\t// only proceed if the distance is positive. a negative distance means the intersection point\n\t\t\t// lies \"behind\" the origin\n\n\t\t\tif ( t <= 0 ) continue;\n\n\t\t\t// now categorized plane as front-facing or back-facing\n\n\t\t\tif ( vD > 0 ) {\n\n\t\t\t\t// plane faces away from the ray, so this plane is a back-face\n\n\t\t\t\ttFar = Math.min( t, tFar );\n\n\t\t\t} else {\n\n\t\t\t\t// front-face\n\n\t\t\t\ttNear = Math.max( t, tNear );\n\n\t\t\t}\n\n\t\t\tif ( tNear > tFar ) {\n\n\t\t\t\t// if tNear ever is greater than tFar, the ray must miss the convex hull\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// evaluate intersection point\n\n\t\t// always try tNear first since its the closer intersection point\n\n\t\tif ( tNear !== - Infinity ) {\n\n\t\t\tray.at( tNear, target );\n\n\t\t} else {\n\n\t\t\tray.at( tFar, target );\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given ray intersects with this convex hull.\n\t *\n\t * @param {Ray} ray - The ray to test.\n\t * @return {boolean} Whether the given ray intersects with this convex hull or not.\n\t */\n\tintersectsRay( ray ) {\n\n\t\treturn this.intersectRay( ray, _v1 ) !== null;\n\n\t}\n\n\t/**\n\t * Makes the convex hull empty.\n\t *\n\t * @return {ConvexHull} A reference to this convex hull.\n\t */\n\tmakeEmpty() {\n\n\t\tthis.faces = [];\n\t\tthis.vertices = [];\n\n\t\treturn this;\n\n\t}\n\n\t// private\n\n\t/**\n\t * Adds a vertex to the 'assigned' list of vertices and assigns it to the given face.\n\t *\n\t * @private\n\t * @param {VertexNode} vertex - The vertex to add.\n\t * @param {Face} face - The target face.\n\t * @return {ConvexHull} A reference to this convex hull.\n\t */\n\t_addVertexToFace( vertex, face ) {\n\n\t\tvertex.face = face;\n\n\t\tif ( face.outside === null ) {\n\n\t\t\tthis.assigned.append( vertex );\n\n\t\t} else {\n\n\t\t\tthis.assigned.insertBefore( face.outside, vertex );\n\n\t\t}\n\n\t\tface.outside = vertex;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes a vertex from the 'assigned' list of vertices and from the given face.\n\t * It also makes sure that the link from 'face' to the first vertex it sees in 'assigned'\n\t * is linked correctly after the removal.\n\t *\n\t * @private\n\t * @param {VertexNode} vertex - The vertex to remove.\n\t * @param {Face} face - The target face.\n\t * @return {ConvexHull} A reference to this convex hull.\n\t */\n\t_removeVertexFromFace( vertex, face ) {\n\n\t\tif ( vertex === face.outside ) {\n\n\t\t\t// fix face.outside link\n\n\t\t\tif ( vertex.next !== null && vertex.next.face === face ) {\n\n\t\t\t\t// face has at least 2 outside vertices, move the 'outside' reference\n\n\t\t\t\tface.outside = vertex.next;\n\n\t\t\t} else {\n\n\t\t\t\t// vertex was the only outside vertex that face had\n\n\t\t\t\tface.outside = null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.assigned.remove( vertex );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes all the visible vertices that a given face is able to see which are stored in\n\t * the 'assigned' vertex list.\n\t *\n\t * @private\n\t * @param {Face} face - The target face.\n\t * @return {VertexNode|undefined} A reference to this convex hull.\n\t */\n\t_removeAllVerticesFromFace( face ) {\n\n\t\tif ( face.outside !== null ) {\n\n\t\t\t// reference to the first and last vertex of this face\n\n\t\t\tconst start = face.outside;\n\t\t\tlet end = face.outside;\n\n\t\t\twhile ( end.next !== null && end.next.face === face ) {\n\n\t\t\t\tend = end.next;\n\n\t\t\t}\n\n\t\t\tthis.assigned.removeSubList( start, end );\n\n\t\t\t// fix references\n\n\t\t\tstart.prev = end.next = null;\n\t\t\tface.outside = null;\n\n\t\t\treturn start;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Removes all the visible vertices that `face` is able to see.\n\t *\n\t * - If `absorbingFace` doesn't exist, then all the removed vertices will be added to the 'unassigned' vertex list.\n\t * - If `absorbingFace` exists, then this method will assign all the vertices of 'face' that can see 'absorbingFace'.\n\t * - If a vertex cannot see `absorbingFace`, it's added to the 'unassigned' vertex list.\n\t *\n\t * @private\n\t * @param {Face} face - The given face.\n\t * @param {Face} [absorbingFace] - An optional face that tries to absorb the vertices of the first face.\n\t * @return {ConvexHull} A reference to this convex hull.\n\t */\n\t_deleteFaceVertices( face, absorbingFace ) {\n\n\t\tconst faceVertices = this._removeAllVerticesFromFace( face );\n\n\t\tif ( faceVertices !== undefined ) {\n\n\t\t\tif ( absorbingFace === undefined ) {\n\n\t\t\t\t// mark the vertices to be reassigned to some other face\n\n\t\t\t\tthis.unassigned.appendChain( faceVertices );\n\n\n\t\t\t} else {\n\n\t\t\t\t// if there's an absorbing face try to assign as many vertices as possible to it\n\n\t\t\t\tlet vertex = faceVertices;\n\n\t\t\t\tdo {\n\n\t\t\t\t\t// we need to buffer the subsequent vertex at this point because the 'vertex.next' reference\n\t\t\t\t\t// will be changed by upcoming method calls\n\n\t\t\t\t\tconst nextVertex = vertex.next;\n\n\t\t\t\t\tconst distance = absorbingFace.distanceToPoint( vertex.point );\n\n\t\t\t\t\t// check if 'vertex' is able to see 'absorbingFace'\n\n\t\t\t\t\tif ( distance > this.tolerance ) {\n\n\t\t\t\t\t\tthis._addVertexToFace( vertex, absorbingFace );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis.unassigned.append( vertex );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// now assign next vertex\n\n\t\t\t\t\tvertex = nextVertex;\n\n\t\t\t\t} while ( vertex !== null );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Reassigns as many vertices as possible from the unassigned list to the new faces.\n\t *\n\t * @private\n\t * @param {Array<Face>} newFaces - The new faces.\n\t * @return {ConvexHull} A reference to this convex hull.\n\t */\n\t_resolveUnassignedPoints( newFaces ) {\n\n\t\tif ( this.unassigned.isEmpty() === false ) {\n\n\t\t\tlet vertex = this.unassigned.first();\n\n\t\t\tdo {\n\n\t\t\t\t// buffer 'next' reference, see ._deleteFaceVertices()\n\n\t\t\t\tconst nextVertex = vertex.next;\n\n\t\t\t\tlet maxDistance = this.tolerance;\n\n\t\t\t\tlet maxFace = null;\n\n\t\t\t\tfor ( let i = 0; i < newFaces.length; i ++ ) {\n\n\t\t\t\t\tconst face = newFaces[ i ];\n\n\t\t\t\t\tif ( face.mark === Visible ) {\n\n\t\t\t\t\t\tconst distance = face.distanceToPoint( vertex.point );\n\n\t\t\t\t\t\tif ( distance > maxDistance ) {\n\n\t\t\t\t\t\t\tmaxDistance = distance;\n\t\t\t\t\t\t\tmaxFace = face;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( maxDistance > 1000 * this.tolerance ) break;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// 'maxFace' can be null e.g. if there are identical vertices\n\n\t\t\t\tif ( maxFace !== null ) {\n\n\t\t\t\t\tthis._addVertexToFace( vertex, maxFace );\n\n\t\t\t\t}\n\n\t\t\t\tvertex = nextVertex;\n\n\t\t\t} while ( vertex !== null );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the extremes values (min/max vectors) which will be used to\n\t * compute the initial hull.\n\t *\n\t * @private\n\t * @return {Object} The extremes.\n\t */\n\t_computeExtremes() {\n\n\t\tconst min = new Vector3();\n\t\tconst max = new Vector3();\n\n\t\tconst minVertices = [];\n\t\tconst maxVertices = [];\n\n\t\t// initially assume that the first vertex is the min/max\n\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tminVertices[ i ] = maxVertices[ i ] = this.vertices[ 0 ];\n\n\t\t}\n\n\t\tmin.copy( this.vertices[ 0 ].point );\n\t\tmax.copy( this.vertices[ 0 ].point );\n\n\t\t// compute the min/max vertex on all six directions\n\n\t\tfor ( let i = 0, l = this.vertices.length; i < l; i ++ ) {\n\n\t\t\tconst vertex = this.vertices[ i ];\n\t\t\tconst point = vertex.point;\n\n\t\t\t// update the min coordinates\n\n\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\tif ( point.getComponent( j ) < min.getComponent( j ) ) {\n\n\t\t\t\t\tmin.setComponent( j, point.getComponent( j ) );\n\t\t\t\t\tminVertices[ j ] = vertex;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// update the max coordinates\n\n\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\tif ( point.getComponent( j ) > max.getComponent( j ) ) {\n\n\t\t\t\t\tmax.setComponent( j, point.getComponent( j ) );\n\t\t\t\t\tmaxVertices[ j ] = vertex;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// use min/max vectors to compute an optimal epsilon\n\n\t\tthis.tolerance = 3 * Number.EPSILON * (\n\t\t\tMath.max( Math.abs( min.x ), Math.abs( max.x ) ) +\n\t\t\tMath.max( Math.abs( min.y ), Math.abs( max.y ) ) +\n\t\t\tMath.max( Math.abs( min.z ), Math.abs( max.z ) )\n\t\t);\n\n\t\treturn { min: minVertices, max: maxVertices };\n\n\t}\n\n\t/**\n\t * Computes the initial simplex assigning to its faces all the points that are\n\t * candidates to form part of the hull.\n\t *\n\t * @private\n\t * @return {ConvexHull} A reference to this convex hull.\n\t */\n\t_computeInitialHull() {\n\n\t\tconst vertices = this.vertices;\n\t\tconst extremes = this._computeExtremes();\n\t\tconst min = extremes.min;\n\t\tconst max = extremes.max;\n\n\t\t// 1. Find the two vertices 'v0' and 'v1' with the greatest 1d separation\n\t\t// (max.x - min.x)\n\t\t// (max.y - min.y)\n\t\t// (max.z - min.z)\n\n\t\tlet maxDistance = 0;\n\t\tlet index = 0;\n\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tconst distance = max[ i ].point.getComponent( i ) - min[ i ].point.getComponent( i );\n\n\t\t\tif ( distance > maxDistance ) {\n\n\t\t\t\tmaxDistance = distance;\n\t\t\t\tindex = i;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst v0 = min[ index ];\n\t\tconst v1 = max[ index ];\n\t\tlet v2;\n\t\tlet v3;\n\n\t\t// 2. The next vertex 'v2' is the one farthest to the line formed by 'v0' and 'v1'\n\n\t\tmaxDistance = 0;\n\t\t_line3.set( v0.point, v1.point );\n\n\t\tfor ( let i = 0, l = this.vertices.length; i < l; i ++ ) {\n\n\t\t\tconst vertex = vertices[ i ];\n\n\t\t\tif ( vertex !== v0 && vertex !== v1 ) {\n\n\t\t\t\t_line3.closestPointToPoint( vertex.point, true, _closestPoint );\n\n\t\t\t\tconst distance = _closestPoint.distanceToSquared( vertex.point );\n\n\t\t\t\tif ( distance > maxDistance ) {\n\n\t\t\t\t\tmaxDistance = distance;\n\t\t\t\t\tv2 = vertex;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// 3. The next vertex 'v3' is the one farthest to the plane 'v0', 'v1', 'v2'\n\n\t\tmaxDistance = - 1;\n\t\t_plane.setFromCoplanarPoints( v0.point, v1.point, v2.point );\n\n\t\tfor ( let i = 0, l = this.vertices.length; i < l; i ++ ) {\n\n\t\t\tconst vertex = vertices[ i ];\n\n\t\t\tif ( vertex !== v0 && vertex !== v1 && vertex !== v2 ) {\n\n\t\t\t\tconst distance = Math.abs( _plane.distanceToPoint( vertex.point ) );\n\n\t\t\t\tif ( distance > maxDistance ) {\n\n\t\t\t\t\tmaxDistance = distance;\n\t\t\t\t\tv3 = vertex;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst faces = [];\n\n\t\tif ( _plane.distanceToPoint( v3.point ) < 0 ) {\n\n\t\t\t// the face is not able to see the point so 'plane.normal' is pointing outside the tetrahedron\n\n\t\t\tfaces.push(\n\t\t\t\tFace.create( v0, v1, v2 ),\n\t\t\t\tFace.create( v3, v1, v0 ),\n\t\t\t\tFace.create( v3, v2, v1 ),\n\t\t\t\tFace.create( v3, v0, v2 )\n\t\t\t);\n\n\t\t\t// set the twin edge\n\n\t\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\t\tconst j = ( i + 1 ) % 3;\n\n\t\t\t\t// join face[ i ] i > 0, with the first face\n\n\t\t\t\tfaces[ i + 1 ].getEdge( 2 ).setTwin( faces[ 0 ].getEdge( j ) );\n\n\t\t\t\t// join face[ i ] with face[ i + 1 ], 1 <= i <= 3\n\n\t\t\t\tfaces[ i + 1 ].getEdge( 1 ).setTwin( faces[ j + 1 ].getEdge( 0 ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// the face is able to see the point so 'plane.normal' is pointing inside the tetrahedron\n\n\t\t\tfaces.push(\n\t\t\t\tFace.create( v0, v2, v1 ),\n\t\t\t\tFace.create( v3, v0, v1 ),\n\t\t\t\tFace.create( v3, v1, v2 ),\n\t\t\t\tFace.create( v3, v2, v0 )\n\t\t\t);\n\n\t\t\t// set the twin edge\n\n\t\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\t\tconst j = ( i + 1 ) % 3;\n\n\t\t\t\t// join face[ i ] i > 0, with the first face\n\n\t\t\t\tfaces[ i + 1 ].getEdge( 2 ).setTwin( faces[ 0 ].getEdge( ( 3 - i ) % 3 ) );\n\n\t\t\t\t// join face[ i ] with face[ i + 1 ]\n\n\t\t\t\tfaces[ i + 1 ].getEdge( 0 ).setTwin( faces[ j + 1 ].getEdge( 1 ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// the initial hull is the tetrahedron\n\n\t\tfor ( let i = 0; i < 4; i ++ ) {\n\n\t\t\tthis.faces.push( faces[ i ] );\n\n\t\t}\n\n\t\t// initial assignment of vertices to the faces of the tetrahedron\n\n\t\tfor ( let i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\tconst vertex = vertices[ i ];\n\n\t\t\tif ( vertex !== v0 && vertex !== v1 && vertex !== v2 && vertex !== v3 ) {\n\n\t\t\t\tmaxDistance = this.tolerance;\n\t\t\t\tlet maxFace = null;\n\n\t\t\t\tfor ( let j = 0; j < 4; j ++ ) {\n\n\t\t\t\t\tconst distance = this.faces[ j ].distanceToPoint( vertex.point );\n\n\t\t\t\t\tif ( distance > maxDistance ) {\n\n\t\t\t\t\t\tmaxDistance = distance;\n\t\t\t\t\t\tmaxFace = this.faces[ j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( maxFace !== null ) {\n\n\t\t\t\t\tthis._addVertexToFace( vertex, maxFace );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes inactive (e.g. deleted) faces from the internal face list.\n\t *\n\t * @private\n\t * @return {ConvexHull} A reference to this convex hull.\n\t */\n\t_reindexFaces() {\n\n\t\tconst activeFaces = [];\n\n\t\tfor ( let i = 0; i < this.faces.length; i ++ ) {\n\n\t\t\tconst face = this.faces[ i ];\n\n\t\t\tif ( face.mark === Visible ) {\n\n\t\t\t\tactiveFaces.push( face );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.faces = activeFaces;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Finds the next vertex to create faces with the current hull.\n\t *\n\t * - Let the initial face be the first face existing in the 'assigned' vertex list.\n\t * - If a face doesn't exist then return since there're no vertices left.\n\t * - Otherwise for each vertex that face sees find the one furthest away from it.\n\t *\n\t * @private\n\t * @return {?VertexNode} The next vertex to add.\n\t */\n\t_nextVertexToAdd() {\n\n\t\t// if the 'assigned' list of vertices is empty, no vertices are left. return with 'undefined'\n\n\t\tif ( this.assigned.isEmpty() === false ) {\n\n\t\t\tlet eyeVertex, maxDistance = 0;\n\n\t\t\t// grab the first available face and start with the first visible vertex of that face\n\n\t\t\tconst eyeFace = this.assigned.first().face;\n\t\t\tlet vertex = eyeFace.outside;\n\n\t\t\t// now calculate the farthest vertex that face can see\n\n\t\t\tdo {\n\n\t\t\t\tconst distance = eyeFace.distanceToPoint( vertex.point );\n\n\t\t\t\tif ( distance > maxDistance ) {\n\n\t\t\t\t\tmaxDistance = distance;\n\t\t\t\t\teyeVertex = vertex;\n\n\t\t\t\t}\n\n\t\t\t\tvertex = vertex.next;\n\n\t\t\t} while ( vertex !== null && vertex.face === eyeFace );\n\n\t\t\treturn eyeVertex;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes a chain of half edges in CCW order called the 'horizon'. For an edge\n\t * to be part of the horizon it must join a face that can see 'eyePoint' and a face\n\t * that cannot see 'eyePoint'.\n\t *\n\t * @private\n\t * @param {Vector3} eyePoint - The 3D-coordinates of a point.\n\t * @param {HalfEdge} crossEdge - The edge used to jump to the current face.\n\t * @param {Face} face - The current face being tested.\n\t * @param {Array<HalfEdge>} horizon - The edges that form part of the horizon in CCW order.\n\t * @return {ConvexHull} A reference to this convex hull.\n\t */\n\t_computeHorizon( eyePoint, crossEdge, face, horizon ) {\n\n\t\t// moves face's vertices to the 'unassigned' vertex list\n\n\t\tthis._deleteFaceVertices( face );\n\n\t\tface.mark = Deleted;\n\n\t\tlet edge;\n\n\t\tif ( crossEdge === null ) {\n\n\t\t\tedge = crossEdge = face.getEdge( 0 );\n\n\t\t} else {\n\n\t\t\t// start from the next edge since 'crossEdge' was already analyzed\n\t\t\t// (actually 'crossEdge.twin' was the edge who called this method recursively)\n\n\t\t\tedge = crossEdge.next;\n\n\t\t}\n\n\t\tdo {\n\n\t\t\tconst twinEdge = edge.twin;\n\t\t\tconst oppositeFace = twinEdge.face;\n\n\t\t\tif ( oppositeFace.mark === Visible ) {\n\n\t\t\t\tif ( oppositeFace.distanceToPoint( eyePoint ) > this.tolerance ) {\n\n\t\t\t\t\t// the opposite face can see the vertex, so proceed with next edge\n\n\t\t\t\t\tthis._computeHorizon( eyePoint, twinEdge, oppositeFace, horizon );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// the opposite face can't see the vertex, so this edge is part of the horizon\n\n\t\t\t\t\thorizon.push( edge );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tedge = edge.next;\n\n\t\t} while ( edge !== crossEdge );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a face with the vertices 'eyeVertex.point', 'horizonEdge.tail' and 'horizonEdge.head'\n\t * in CCW order. All the half edges are created in CCW order thus the face is always pointing\n\t * outside the hull.\n\t *\n\t * @private\n\t * @param {VertexNode} eyeVertex - The vertex that is added to the hull.\n\t * @param {HalfEdge} horizonEdge - A single edge of the horizon.\n\t * @return {HalfEdge} The half edge whose vertex is the eyeVertex.\n\t */\n\t_addAdjoiningFace( eyeVertex, horizonEdge ) {\n\n\t\t// all the half edges are created in ccw order thus the face is always pointing outside the hull\n\n\t\tconst face = Face.create( eyeVertex, horizonEdge.tail(), horizonEdge.head() );\n\n\t\tthis.faces.push( face );\n\n\t\t// join face.getEdge( - 1 ) with the horizon's opposite edge face.getEdge( - 1 ) = face.getEdge( 2 )\n\n\t\tface.getEdge( - 1 ).setTwin( horizonEdge.twin );\n\n\t\treturn face.getEdge( 0 ); // the half edge whose vertex is the eyeVertex\n\n\n\t}\n\n\t/**\n\t * Adds 'horizon.length' faces to the hull, each face will be linked with the horizon\n\t * opposite face and the face on the left/right.\n\t *\n\t * @private\n\t * @param {VertexNode} eyeVertex - The vertex that is added to the hull.\n\t * @param {Array<HalfEdge>} horizon - The horizon.\n\t * @return {ConvexHull} A reference to this convex hull.\n\t */\n\t_addNewFaces( eyeVertex, horizon ) {\n\n\t\tthis.newFaces = [];\n\n\t\tlet firstSideEdge = null;\n\t\tlet previousSideEdge = null;\n\n\t\tfor ( let i = 0; i < horizon.length; i ++ ) {\n\n\t\t\tconst horizonEdge = horizon[ i ];\n\n\t\t\t// returns the right side edge\n\n\t\t\tconst sideEdge = this._addAdjoiningFace( eyeVertex, horizonEdge );\n\n\t\t\tif ( firstSideEdge === null ) {\n\n\t\t\t\tfirstSideEdge = sideEdge;\n\n\t\t\t} else {\n\n\t\t\t\t// joins face.getEdge( 1 ) with previousFace.getEdge( 0 )\n\n\t\t\t\tsideEdge.next.setTwin( previousSideEdge );\n\n\t\t\t}\n\n\t\t\tthis.newFaces.push( sideEdge.face );\n\t\t\tpreviousSideEdge = sideEdge;\n\n\t\t}\n\n\t\t// perform final join of new faces\n\n\t\tfirstSideEdge.next.setTwin( previousSideEdge );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds a vertex to the hull with the following algorithm:\n\t *\n\t * - Compute the 'horizon' which is a chain of half edges. For an edge to belong to this group\n\t * it must be the edge connecting a face that can see 'eyeVertex' and a face which cannot see 'eyeVertex'.\n\t * - All the faces that can see 'eyeVertex' have its visible vertices removed from the assigned vertex list.\n\t * - A new set of faces is created with each edge of the 'horizon' and 'eyeVertex'. Each face is connected\n\t * with the opposite horizon face and the face on the left/right.\n\t * - The vertices removed from all the visible faces are assigned to the new faces if possible.\n\t *\n\t * @private\n\t * @param {VertexNode} eyeVertex - The vertex to add.\n\t * @return {ConvexHull} A reference to this convex hull.\n\t */\n\t_addVertexToHull( eyeVertex ) {\n\n\t\tconst horizon = [];\n\n\t\tthis.unassigned.clear();\n\n\t\t// remove 'eyeVertex' from 'eyeVertex.face' so that it can't be added to the 'unassigned' vertex list\n\n\t\tthis._removeVertexFromFace( eyeVertex, eyeVertex.face );\n\n\t\tthis._computeHorizon( eyeVertex.point, null, eyeVertex.face, horizon );\n\n\t\tthis._addNewFaces( eyeVertex, horizon );\n\n\t\t// reassign 'unassigned' vertices to the new faces\n\n\t\tthis._resolveUnassignedPoints( this.newFaces );\n\n\t\treturn\tthis;\n\n\t}\n\n\t/**\n\t * Cleans up internal properties after computing the convex hull.\n\t *\n\t * @private\n\t * @return {ConvexHull} A reference to this convex hull.\n\t */\n\t_cleanup() {\n\n\t\tthis.assigned.clear();\n\t\tthis.unassigned.clear();\n\t\tthis.newFaces = [];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Starts the execution of the quick hull algorithm.\n\t *\n\t * @private\n\t * @return {ConvexHull} A reference to this convex hull.\n\t */\n\t_compute() {\n\n\t\tlet vertex;\n\n\t\tthis._computeInitialHull();\n\n\t\t// add all available vertices gradually to the hull\n\n\t\twhile ( ( vertex = this._nextVertexToAdd() ) !== undefined ) {\n\n\t\t\tthis._addVertexToHull( vertex );\n\n\t\t}\n\n\t\tthis._reindexFaces();\n\n\t\tthis._cleanup();\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Represents a section bounded by a specific amount of half-edges.\n * The current implementation assumes that a face always consist of three edges.\n *\n * @private\n */\nclass Face {\n\n\t/**\n\t * Constructs a new face.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The normal vector of the face.\n\t\t *\n\t\t * @private\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.normal = new Vector3();\n\n\t\t/**\n\t\t * The midpoint or centroid of the face.\n\t\t *\n\t\t * @private\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.midpoint = new Vector3();\n\n\t\t/**\n\t\t * The area of the face.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.area = 0;\n\n\t\t/**\n\t\t * Signed distance from face to the origin.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.constant = 0;\n\n\t\t/**\n\t\t * Reference to a vertex in a vertex list this face can see.\n\t\t *\n\t\t * @private\n\t\t * @type {?VertexNode}\n\t\t * @default null\n\t\t */\n\t\tthis.outside = null; // reference to a vertex in a vertex list this face can see\n\t\tthis.mark = Visible;\n\n\t\t/**\n\t\t * Reference to the base edge of a face. To retrieve all edges, you can use the\n\t\t * `next` reference of the current edge.\n\t\t *\n\t\t * @private\n\t\t * @type {?HalfEdge}\n\t\t * @default null\n\t\t */\n\t\tthis.edge = null;\n\n\t}\n\n\t/**\n\t * Creates a face from the given vertex nodes.\n\t *\n\t * @private\n\t * @param {VertexNode} a - The first vertex node.\n\t * @param {VertexNode} b - The second vertex node.\n\t * @param {VertexNode} c - The third vertex node.\n\t * @return {Face} The created face.\n\t */\n\tstatic create( a, b, c ) {\n\n\t\tconst face = new Face();\n\n\t\tconst e0 = new HalfEdge( a, face );\n\t\tconst e1 = new HalfEdge( b, face );\n\t\tconst e2 = new HalfEdge( c, face );\n\n\t\t// join edges\n\n\t\te0.next = e2.prev = e1;\n\t\te1.next = e0.prev = e2;\n\t\te2.next = e1.prev = e0;\n\n\t\t// main half edge reference\n\n\t\tface.edge = e0;\n\n\t\treturn face.compute();\n\n\t}\n\n\t/**\n\t * Returns an edge by the given index.\n\t *\n\t * @private\n\t * @param {number} i - The edge index.\n\t * @return {HalfEdge} The edge.\n\t */\n\tgetEdge( i ) {\n\n\t\tlet edge = this.edge;\n\n\t\twhile ( i > 0 ) {\n\n\t\t\tedge = edge.next;\n\t\t\ti --;\n\n\t\t}\n\n\t\twhile ( i < 0 ) {\n\n\t\t\tedge = edge.prev;\n\t\t\ti ++;\n\n\t\t}\n\n\t\treturn edge;\n\n\t}\n\n\t/**\n\t * Computes all properties of the face.\n\t *\n\t * @private\n\t * @return {Face} A reference to this face.\n\t */\n\tcompute() {\n\n\t\tconst a = this.edge.tail();\n\t\tconst b = this.edge.head();\n\t\tconst c = this.edge.next.head();\n\n\t\t_triangle.set( a.point, b.point, c.point );\n\n\t\t_triangle.getNormal( this.normal );\n\t\t_triangle.getMidpoint( this.midpoint );\n\t\tthis.area = _triangle.getArea();\n\n\t\tthis.constant = this.normal.dot( this.midpoint );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the signed distance from a given point to the plane representation of this face.\n\t *\n\t * @private\n\t * @param {Vector3} point - The point to compute the distance to.\n\t * @return {number} The distance.\n\t */\n\tdistanceToPoint( point ) {\n\n\t\treturn this.normal.dot( point ) - this.constant;\n\n\t}\n\n}\n\n/**\n * The basis for a half-edge data structure, also known as doubly\n * connected edge list (DCEL).\n *\n * @private\n */\nclass HalfEdge {\n\n\t/**\n\t * Constructs a new half edge.\n\t *\n\t * @param {VertexNode} vertex - A reference to its destination vertex.\n\t * @param {Face} face - A reference to its face.\n\t */\n\tconstructor( vertex, face ) {\n\n\t\t/**\n\t\t * A reference to its destination vertex.\n\t\t *\n\t\t * @private\n\t\t * @type {VertexNode}\n\t\t */\n\t\tthis.vertex = vertex;\n\n\t\t/**\n\t\t * Reference to the previous half-edge of the same face.\n\t\t *\n\t\t * @private\n\t\t * @type {?HalfEdge}\n\t\t * @default null\n\t\t */\n\t\tthis.prev = null;\n\n\t\t/**\n\t\t * Reference to the next half-edge of the same face.\n\t\t *\n\t\t * @private\n\t\t * @type {?HalfEdge}\n\t\t * @default null\n\t\t */\n\t\tthis.next = null;\n\n\t\t/**\n\t\t * Reference to the twin half-edge to reach the opposite face.\n\t\t *\n\t\t * @private\n\t\t * @type {?HalfEdge}\n\t\t * @default null\n\t\t */\n\t\tthis.twin = null;\n\n\t\t/**\n\t\t * A reference to its face.\n\t\t *\n\t\t * @private\n\t\t * @type {Face}\n\t\t */\n\t\tthis.face = face;\n\n\t}\n\n\t/**\n\t * Returns the destination vertex.\n\t *\n\t * @private\n\t * @return {VertexNode} The destination vertex.\n\t */\n\thead() {\n\n\t\treturn this.vertex;\n\n\t}\n\n\t/**\n\t * Returns the origin vertex.\n\t *\n\t * @private\n\t * @return {?VertexNode} The destination vertex.\n\t */\n\ttail() {\n\n\t\treturn this.prev ? this.prev.vertex : null;\n\n\t}\n\n\t/**\n\t * Returns the Euclidean length (straight-line length) of the edge.\n\t *\n\t * @private\n\t * @return {number} The edge's length.\n\t */\n\tlength() {\n\n\t\tconst head = this.head();\n\t\tconst tail = this.tail();\n\n\t\tif ( tail !== null ) {\n\n\t\t\treturn tail.point.distanceTo( head.point );\n\n\t\t}\n\n\t\treturn - 1;\n\n\t}\n\n\t/**\n\t * Returns the square of the Euclidean length (straight-line length) of the edge.\n\t *\n\t * @private\n\t * @return {number} The square of the edge's length.\n\t */\n\tlengthSquared() {\n\n\t\tconst head = this.head();\n\t\tconst tail = this.tail();\n\n\t\tif ( tail !== null ) {\n\n\t\t\treturn tail.point.distanceToSquared( head.point );\n\n\t\t}\n\n\t\treturn - 1;\n\n\t}\n\n\t/**\n\t * Sets the twin edge of this half-edge. It also ensures that the twin reference\n\t * of the given half-edge is correctly set.\n\t *\n\t * @private\n\t * @param {HalfEdge} edge - The twin edge to set.\n\t * @return {HalfEdge} A reference to this edge.\n\t */\n\tsetTwin( edge ) {\n\n\t\tthis.twin = edge;\n\t\tedge.twin = this;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A vertex as a double linked list node.\n *\n * @private\n */\nclass VertexNode {\n\n\t/**\n\t * Constructs a new vertex node.\n\t *\n\t * @param {Vector3} point - A point in 3D space.\n\t */\n\tconstructor( point ) {\n\n\t\t/**\n\t\t * A point in 3D space.\n\t\t *\n\t\t * @private\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.point = point;\n\n\t\t/**\n\t\t * Reference to the previous vertex in the double linked list.\n\t\t *\n\t\t * @private\n\t\t * @type {?VertexNode}\n\t\t * @default null\n\t\t */\n\t\tthis.prev = null;\n\n\t\t/**\n\t\t * Reference to the next vertex in the double linked list.\n\t\t *\n\t\t * @private\n\t\t * @type {?VertexNode}\n\t\t * @default null\n\t\t */\n\t\tthis.next = null;\n\n\t\t/**\n\t\t * Reference to the face that is able to see this vertex.\n\t\t *\n\t\t * @private\n\t\t * @type {?Face}\n\t\t * @default null\n\t\t */\n\t\tthis.face = null;\n\n\t}\n\n}\n\n/**\n * A doubly linked list of vertices.\n *\n * @private\n */\nclass VertexList {\n\n\t/**\n\t * Constructs a new vertex list.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * Reference to the first vertex of the linked list.\n\t\t *\n\t\t * @private\n\t\t * @type {?VertexNode}\n\t\t * @default null\n\t\t */\n\t\tthis.head = null;\n\n\t\t/**\n\t\t * Reference to the last vertex of the linked list.\n\t\t *\n\t\t * @private\n\t\t * @type {?VertexNode}\n\t\t * @default null\n\t\t */\n\t\tthis.tail = null;\n\n\t}\n\n\t/**\n\t * Returns the head reference.\n\t *\n\t * @private\n\t * @return {VertexNode} The head reference.\n\t */\n\tfirst() {\n\n\t\treturn this.head;\n\n\t}\n\n\t/**\n\t * Returns the tail reference.\n\t *\n\t * @private\n\t * @return {VertexNode} The tail reference.\n\t */\n\tlast() {\n\n\t\treturn this.tail;\n\n\t}\n\n\t/**\n\t * Clears the linked list.\n\t *\n\t * @private\n\t * @return {VertexList} A reference to this vertex list.\n\t */\n\tclear() {\n\n\t\tthis.head = this.tail = null;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inserts a vertex before a target vertex.\n\t *\n\t * @private\n\t * @param {VertexNode} target - The target.\n\t * @param {VertexNode} vertex - The vertex to insert.\n\t * @return {VertexList} A reference to this vertex list.\n\t */\n\tinsertBefore( target, vertex ) {\n\n\t\tvertex.prev = target.prev;\n\t\tvertex.next = target;\n\n\t\tif ( vertex.prev === null ) {\n\n\t\t\tthis.head = vertex;\n\n\t\t} else {\n\n\t\t\tvertex.prev.next = vertex;\n\n\t\t}\n\n\t\ttarget.prev = vertex;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Inserts a vertex after a target vertex.\n\t *\n\t * @private\n\t * @param {VertexNode} target - The target.\n\t * @param {VertexNode} vertex - The vertex to insert.\n\t * @return {VertexList} A reference to this vertex list.\n\t */\n\tinsertAfter( target, vertex ) {\n\n\t\tvertex.prev = target;\n\t\tvertex.next = target.next;\n\n\t\tif ( vertex.next === null ) {\n\n\t\t\tthis.tail = vertex;\n\n\t\t} else {\n\n\t\t\tvertex.next.prev = vertex;\n\n\t\t}\n\n\t\ttarget.next = vertex;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Appends a vertex to this vertex list.\n\t *\n\t * @private\n\t * @param {VertexNode} vertex - The vertex to append.\n\t * @return {VertexList} A reference to this vertex list.\n\t */\n\tappend( vertex ) {\n\n\t\tif ( this.head === null ) {\n\n\t\t\tthis.head = vertex;\n\n\t\t} else {\n\n\t\t\tthis.tail.next = vertex;\n\n\t\t}\n\n\t\tvertex.prev = this.tail;\n\t\tvertex.next = null; // the tail has no subsequent vertex\n\n\t\tthis.tail = vertex;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Appends a chain of vertices where the given vertex is the head.\n\t *\n\t * @private\n\t * @param {VertexNode} vertex - The head vertex of a chain of vertices.\n\t * @return {VertexList} A reference to this vertex list.\n\t */\n\tappendChain( vertex ) {\n\n\t\tif ( this.head === null ) {\n\n\t\t\tthis.head = vertex;\n\n\t\t} else {\n\n\t\t\tthis.tail.next = vertex;\n\n\t\t}\n\n\t\tvertex.prev = this.tail;\n\n\t\t// ensure that the 'tail' reference points to the last vertex of the chain\n\n\t\twhile ( vertex.next !== null ) {\n\n\t\t\tvertex = vertex.next;\n\n\t\t}\n\n\t\tthis.tail = vertex;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes a vertex from the linked list.\n\t *\n\t * @private\n\t * @param {VertexNode} vertex - The vertex to remove.\n\t * @return {VertexList} A reference to this vertex list.\n\t */\n\tremove( vertex ) {\n\n\t\tif ( vertex.prev === null ) {\n\n\t\t\tthis.head = vertex.next;\n\n\t\t} else {\n\n\t\t\tvertex.prev.next = vertex.next;\n\n\t\t}\n\n\t\tif ( vertex.next === null ) {\n\n\t\t\tthis.tail = vertex.prev;\n\n\t\t} else {\n\n\t\t\tvertex.next.prev = vertex.prev;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes a sublist of vertices from the linked list.\n\t *\n\t * @private\n\t * @param {VertexNode} a - The head of the sublist.\n\t * @param {VertexNode} b - The tail of the sublist.\n\t * @return {VertexList} A reference to this vertex list.\n\t */\n\tremoveSubList( a, b ) {\n\n\t\tif ( a.prev === null ) {\n\n\t\t\tthis.head = b.next;\n\n\t\t} else {\n\n\t\t\ta.prev.next = b.next;\n\n\t\t}\n\n\t\tif ( b.next === null ) {\n\n\t\t\tthis.tail = a.prev;\n\n\t\t} else {\n\n\t\t\tb.next.prev = a.prev;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the linked list is empty.\n\t *\n\t * @private\n\t * @return {boolean} Whether the linked list is empty or not.\n\t */\n\tisEmpty() {\n\n\t\treturn this.head === null;\n\n\t}\n\n}\n\nexport { ConvexHull, Face, HalfEdge, VertexNode, VertexList };\n", "import {\n\tBufferGeometry,\n\tFloat32BufferAttribute\n} from 'three';\nimport { ConvexHull } from '../math/ConvexHull.js';\n\n/**\n * This class can be used to generate a convex hull for a given array of 3D points.\n * The average time complexity for this task is considered to be O(nlog(n)).\n *\n * ```js\n * const geometry = new ConvexGeometry( points );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @three_import import { ConvexGeometry } from 'three/addons/geometries/ConvexGeometry.js';\n */\nclass ConvexGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new convex geometry.\n\t *\n\t * @param {Array<Vector3>} points - An array of points in 3D space which should be enclosed by the convex hull.\n\t */\n\tconstructor( points = [] ) {\n\n\t\tsuper();\n\n\t\t// buffers\n\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\n\t\tconst convexHull = new ConvexHull().setFromPoints( points );\n\n\t\t// generate vertices and normals\n\n\t\tconst faces = convexHull.faces;\n\n\t\tfor ( let i = 0; i < faces.length; i ++ ) {\n\n\t\t\tconst face = faces[ i ];\n\t\t\tlet edge = face.edge;\n\n\t\t\t// we move along a doubly-connected edge list to access all face points (see HalfEdge docs)\n\n\t\t\tdo {\n\n\t\t\t\tconst point = edge.head().point;\n\n\t\t\t\tvertices.push( point.x, point.y, point.z );\n\t\t\t\tnormals.push( face.normal.x, face.normal.y, face.normal.z );\n\n\t\t\t\tedge = edge.next;\n\n\t\t\t} while ( edge !== face.edge );\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\n\t}\n\n}\n\nexport { ConvexGeometry };\n", "import {\n\tBufferGeometry,\n\tEuler,\n\tFloat32BufferAttribute,\n\tMatrix3,\n\tMatrix4,\n\tMesh,\n\tVector3\n} from 'three';\n\n/**\n * This class can be used to create a decal mesh that serves different kinds of purposes e.g.\n * adding unique details to models, performing dynamic visual environmental changes or covering seams.\n *\n * Please not that decal projections can be distorted when used around corners. More information at\n * this GitHub issue: [Decal projections without distortions](https://github.com/mrdoob/three.js/issues/21187).\n *\n * Reference: [How to project decals](http://blog.wolfire.com/2009/06/how-to-project-decals/)\n *\n * ```js\n * const geometry = new DecalGeometry( mesh, position, orientation, size );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n * ```\n *\n * @augments BufferGeometry\n * @three_import import { DecalGeometry } from 'three/addons/geometries/DecalGeometry.js';\n */\nclass DecalGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new decal geometry.\n\t *\n\t * @param {Mesh} [mesh] - The base mesh the decal should be projected on.\n\t * @param {Vector3} [position] - The position of the decal projector.\n\t * @param {Euler} [orientation] - The orientation of the decal projector.\n\t * @param {Vector3} [size] - The scale of the decal projector.\n\t */\n\tconstructor( mesh = new Mesh(), position = new Vector3(), orientation = new Euler(), size = new Vector3( 1, 1, 1 ) ) {\n\n\t\tsuper();\n\n\t\t// buffers\n\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\t// helpers\n\n\t\tconst plane = new Vector3();\n\n\t\tconst normalMatrix = new Matrix3().getNormalMatrix( mesh.matrixWorld );\n\n\t\t// this matrix represents the transformation of the decal projector\n\n\t\tconst projectorMatrix = new Matrix4();\n\t\tprojectorMatrix.makeRotationFromEuler( orientation );\n\t\tprojectorMatrix.setPosition( position );\n\n\t\tconst projectorMatrixInverse = new Matrix4();\n\t\tprojectorMatrixInverse.copy( projectorMatrix ).invert();\n\n\t\t// generate buffers\n\n\t\tgenerate();\n\n\t\t// build geometry\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\tif ( normals.length > 0 ) {\n\n\t\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\n\t\t}\n\n\t\t//\n\n\t\tfunction generate() {\n\n\t\t\tlet decalVertices = [];\n\n\t\t\tconst vertex = new Vector3();\n\t\t\tconst normal = new Vector3();\n\n\t\t\t// handle different geometry types\n\n\t\t\tconst geometry = mesh.geometry;\n\n\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\tconst normalAttribute = geometry.attributes.normal;\n\n\t\t\t// first, create an array of 'DecalVertex' objects\n\t\t\t// three consecutive 'DecalVertex' objects represent a single face\n\t\t\t//\n\t\t\t// this data structure will be later used to perform the clipping\n\n\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t// indexed BufferGeometry\n\n\t\t\t\tconst index = geometry.index;\n\n\t\t\t\tfor ( let i = 0; i < index.count; i ++ ) {\n\n\t\t\t\t\tvertex.fromBufferAttribute( positionAttribute, index.getX( i ) );\n\n\t\t\t\t\tif ( normalAttribute ) {\n\n\t\t\t\t\t\tnormal.fromBufferAttribute( normalAttribute, index.getX( i ) );\n\t\t\t\t\t\tpushDecalVertex( decalVertices, vertex, normal );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpushDecalVertex( decalVertices, vertex );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( positionAttribute === undefined ) return; // empty geometry\n\n\t\t\t\t// non-indexed BufferGeometry\n\n\t\t\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\t\t\tvertex.fromBufferAttribute( positionAttribute, i );\n\n\t\t\t\t\tif ( normalAttribute ) {\n\n\t\t\t\t\t\tnormal.fromBufferAttribute( normalAttribute, i );\n\t\t\t\t\t\tpushDecalVertex( decalVertices, vertex, normal );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpushDecalVertex( decalVertices, vertex );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// second, clip the geometry so that it doesn't extend out from the projector\n\n\t\t\tdecalVertices = clipGeometry( decalVertices, plane.set( 1, 0, 0 ) );\n\t\t\tdecalVertices = clipGeometry( decalVertices, plane.set( - 1, 0, 0 ) );\n\t\t\tdecalVertices = clipGeometry( decalVertices, plane.set( 0, 1, 0 ) );\n\t\t\tdecalVertices = clipGeometry( decalVertices, plane.set( 0, - 1, 0 ) );\n\t\t\tdecalVertices = clipGeometry( decalVertices, plane.set( 0, 0, 1 ) );\n\t\t\tdecalVertices = clipGeometry( decalVertices, plane.set( 0, 0, - 1 ) );\n\n\t\t\t// third, generate final vertices, normals and uvs\n\n\t\t\tfor ( let i = 0; i < decalVertices.length; i ++ ) {\n\n\t\t\t\tconst decalVertex = decalVertices[ i ];\n\n\t\t\t\t// create texture coordinates (we are still in projector space)\n\n\t\t\t\tuvs.push(\n\t\t\t\t\t0.5 + ( decalVertex.position.x / size.x ),\n\t\t\t\t\t0.5 + ( decalVertex.position.y / size.y )\n\t\t\t\t);\n\n\t\t\t\t// transform the vertex back to world space\n\n\t\t\t\tdecalVertex.position.applyMatrix4( projectorMatrix );\n\n\t\t\t\t// now create vertex and normal buffer data\n\n\t\t\t\tvertices.push( decalVertex.position.x, decalVertex.position.y, decalVertex.position.z );\n\n\t\t\t\tif ( decalVertex.normal !== null ) {\n\n\t\t\t\t\tnormals.push( decalVertex.normal.x, decalVertex.normal.y, decalVertex.normal.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction pushDecalVertex( decalVertices, vertex, normal = null ) {\n\n\t\t\t// transform the vertex to world space, then to projector space\n\n\t\t\tvertex.applyMatrix4( mesh.matrixWorld );\n\t\t\tvertex.applyMatrix4( projectorMatrixInverse );\n\n\t\t\tif ( normal ) {\n\n\t\t\t\tnormal.applyNormalMatrix( normalMatrix );\n\t\t\t\tdecalVertices.push( new DecalVertex( vertex.clone(), normal.clone() ) );\n\n\t\t\t} else {\n\n\t\t\t\tdecalVertices.push( new DecalVertex( vertex.clone() ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction clipGeometry( inVertices, plane ) {\n\n\t\t\tconst outVertices = [];\n\n\t\t\tconst s = 0.5 * Math.abs( size.dot( plane ) );\n\n\t\t\t// a single iteration clips one face,\n\t\t\t// which consists of three consecutive 'DecalVertex' objects\n\n\t\t\tfor ( let i = 0; i < inVertices.length; i += 3 ) {\n\n\t\t\t\tlet total = 0;\n\t\t\t\tlet nV1;\n\t\t\t\tlet nV2;\n\t\t\t\tlet nV3;\n\t\t\t\tlet nV4;\n\n\t\t\t\tconst d1 = inVertices[ i + 0 ].position.dot( plane ) - s;\n\t\t\t\tconst d2 = inVertices[ i + 1 ].position.dot( plane ) - s;\n\t\t\t\tconst d3 = inVertices[ i + 2 ].position.dot( plane ) - s;\n\n\t\t\t\tconst v1Out = d1 > 0;\n\t\t\t\tconst v2Out = d2 > 0;\n\t\t\t\tconst v3Out = d3 > 0;\n\n\t\t\t\t// calculate, how many vertices of the face lie outside of the clipping plane\n\n\t\t\t\ttotal = ( v1Out ? 1 : 0 ) + ( v2Out ? 1 : 0 ) + ( v3Out ? 1 : 0 );\n\n\t\t\t\tswitch ( total ) {\n\n\t\t\t\t\tcase 0: {\n\n\t\t\t\t\t\t// the entire face lies inside of the plane, no clipping needed\n\n\t\t\t\t\t\toutVertices.push( inVertices[ i ] );\n\t\t\t\t\t\toutVertices.push( inVertices[ i + 1 ] );\n\t\t\t\t\t\toutVertices.push( inVertices[ i + 2 ] );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 1: {\n\n\t\t\t\t\t\t// one vertex lies outside of the plane, perform clipping\n\n\t\t\t\t\t\tif ( v1Out ) {\n\n\t\t\t\t\t\t\tnV1 = inVertices[ i + 1 ];\n\t\t\t\t\t\t\tnV2 = inVertices[ i + 2 ];\n\t\t\t\t\t\t\tnV3 = clip( inVertices[ i ], nV1, plane, s );\n\t\t\t\t\t\t\tnV4 = clip( inVertices[ i ], nV2, plane, s );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( v2Out ) {\n\n\t\t\t\t\t\t\tnV1 = inVertices[ i ];\n\t\t\t\t\t\t\tnV2 = inVertices[ i + 2 ];\n\t\t\t\t\t\t\tnV3 = clip( inVertices[ i + 1 ], nV1, plane, s );\n\t\t\t\t\t\t\tnV4 = clip( inVertices[ i + 1 ], nV2, plane, s );\n\n\t\t\t\t\t\t\toutVertices.push( nV3 );\n\t\t\t\t\t\t\toutVertices.push( nV2.clone() );\n\t\t\t\t\t\t\toutVertices.push( nV1.clone() );\n\n\t\t\t\t\t\t\toutVertices.push( nV2.clone() );\n\t\t\t\t\t\t\toutVertices.push( nV3.clone() );\n\t\t\t\t\t\t\toutVertices.push( nV4 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( v3Out ) {\n\n\t\t\t\t\t\t\tnV1 = inVertices[ i ];\n\t\t\t\t\t\t\tnV2 = inVertices[ i + 1 ];\n\t\t\t\t\t\t\tnV3 = clip( inVertices[ i + 2 ], nV1, plane, s );\n\t\t\t\t\t\t\tnV4 = clip( inVertices[ i + 2 ], nV2, plane, s );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\toutVertices.push( nV1.clone() );\n\t\t\t\t\t\toutVertices.push( nV2.clone() );\n\t\t\t\t\t\toutVertices.push( nV3 );\n\n\t\t\t\t\t\toutVertices.push( nV4 );\n\t\t\t\t\t\toutVertices.push( nV3.clone() );\n\t\t\t\t\t\toutVertices.push( nV2.clone() );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 2: {\n\n\t\t\t\t\t\t// two vertices lies outside of the plane, perform clipping\n\n\t\t\t\t\t\tif ( ! v1Out ) {\n\n\t\t\t\t\t\t\tnV1 = inVertices[ i ].clone();\n\t\t\t\t\t\t\tnV2 = clip( nV1, inVertices[ i + 1 ], plane, s );\n\t\t\t\t\t\t\tnV3 = clip( nV1, inVertices[ i + 2 ], plane, s );\n\t\t\t\t\t\t\toutVertices.push( nV1 );\n\t\t\t\t\t\t\toutVertices.push( nV2 );\n\t\t\t\t\t\t\toutVertices.push( nV3 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( ! v2Out ) {\n\n\t\t\t\t\t\t\tnV1 = inVertices[ i + 1 ].clone();\n\t\t\t\t\t\t\tnV2 = clip( nV1, inVertices[ i + 2 ], plane, s );\n\t\t\t\t\t\t\tnV3 = clip( nV1, inVertices[ i ], plane, s );\n\t\t\t\t\t\t\toutVertices.push( nV1 );\n\t\t\t\t\t\t\toutVertices.push( nV2 );\n\t\t\t\t\t\t\toutVertices.push( nV3 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( ! v3Out ) {\n\n\t\t\t\t\t\t\tnV1 = inVertices[ i + 2 ].clone();\n\t\t\t\t\t\t\tnV2 = clip( nV1, inVertices[ i ], plane, s );\n\t\t\t\t\t\t\tnV3 = clip( nV1, inVertices[ i + 1 ], plane, s );\n\t\t\t\t\t\t\toutVertices.push( nV1 );\n\t\t\t\t\t\t\toutVertices.push( nV2 );\n\t\t\t\t\t\t\toutVertices.push( nV3 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcase 3: {\n\n\t\t\t\t\t\t// the entire face lies outside of the plane, so let's discard the corresponding vertices\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn outVertices;\n\n\t\t}\n\n\t\tfunction clip( v0, v1, p, s ) {\n\n\t\t\tconst d0 = v0.position.dot( p ) - s;\n\t\t\tconst d1 = v1.position.dot( p ) - s;\n\n\t\t\tconst s0 = d0 / ( d0 - d1 );\n\n\t\t\tconst position = new Vector3(\n\t\t\t\tv0.position.x + s0 * ( v1.position.x - v0.position.x ),\n\t\t\t\tv0.position.y + s0 * ( v1.position.y - v0.position.y ),\n\t\t\t\tv0.position.z + s0 * ( v1.position.z - v0.position.z )\n\t\t\t);\n\n\t\t\tlet normal = null;\n\n\t\t\tif ( v0.normal !== null && v1.normal !== null ) {\n\n\t\t\t\tnormal = new Vector3(\n\t\t\t\t\tv0.normal.x + s0 * ( v1.normal.x - v0.normal.x ),\n\t\t\t\t\tv0.normal.y + s0 * ( v1.normal.y - v0.normal.y ),\n\t\t\t\t\tv0.normal.z + s0 * ( v1.normal.z - v0.normal.z )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\tconst v = new DecalVertex( position, normal );\n\n\t\t\t// need to clip more values (texture coordinates)? do it this way:\n\t\t\t// intersectpoint.value = a.value + s * ( b.value - a.value );\n\n\t\t\treturn v;\n\n\t\t}\n\n\t}\n\n}\n\n// helper\n\nclass DecalVertex {\n\n\tconstructor( position, normal = null ) {\n\n\t\tthis.position = position;\n\t\tthis.normal = normal;\n\n\t}\n\n\tclone() {\n\n\t\tconst position = this.position.clone();\n\t\tconst normal = ( this.normal !== null ) ? this.normal.clone() : null;\n\n\t\treturn new this.constructor( position, normal );\n\n\t}\n\n}\n\nexport { DecalGeometry, DecalVertex };\n", "\n/**\n * @module ParametricFunctions\n * @three_import import * as ParametricFunctions from 'three/addons/geometries/ParametricFunctions.js';\n */\n\n/**\n * A parametric function representing the Klein bottle.\n *\n * @param {number} v - The `v` coordinate on the surface in the range `[0,1]`.\n * @param {number} u - The `u` coordinate on the surface in the range `[0,1]`.\n * @param {Vector3} target - The target vector that is used to store the method's result.\n */\nfunction klein( v, u, target ) {\n\n\tu *= Math.PI;\n\tv *= 2 * Math.PI;\n\n\tu = u * 2;\n\tlet x, z;\n\tif ( u < Math.PI ) {\n\n\t\tx = 3 * Math.cos( u ) * ( 1 + Math.sin( u ) ) + ( 2 * ( 1 - Math.cos( u ) / 2 ) ) * Math.cos( u ) * Math.cos( v );\n\t\tz = - 8 * Math.sin( u ) - 2 * ( 1 - Math.cos( u ) / 2 ) * Math.sin( u ) * Math.cos( v );\n\n\t} else {\n\n\t\tx = 3 * Math.cos( u ) * ( 1 + Math.sin( u ) ) + ( 2 * ( 1 - Math.cos( u ) / 2 ) ) * Math.cos( v + Math.PI );\n\t\tz = - 8 * Math.sin( u );\n\n\t}\n\n\tconst y = - 2 * ( 1 - Math.cos( u ) / 2 ) * Math.sin( v );\n\n\ttarget.set( x, y, z );\n\n}\n\n/**\n * A parametric function representing a flat plane.\n *\n * @param {number} u - The `u` coordinate on the surface in the range `[0,1]`.\n * @param {number} v - The `v` coordinate on the surface in the range `[0,1]`.\n * @param {Vector3} target - The target vector that is used to store the method's result.\n */\nfunction plane( u, v, target ) {\n\n\ttarget.set( u, 0, v );\n\n}\n\n/**\n * A parametric function representing a flat mobius strip.\n *\n * @param {number} u - The `u` coordinate on the surface in the range `[0,1]`.\n * @param {number} t - The `v` coordinate on the surface in the range `[0,1]`.\n * @param {Vector3} target - The target vector that is used to store the method's result.\n */\nfunction mobius( u, t, target ) {\n\n\t// http://www.wolframalpha.com/input/?i=M%C3%B6bius+strip+parametric+equations&lk=1&a=ClashPrefs_*Surface.MoebiusStrip.SurfaceProperty.ParametricEquations-\n\tu = u - 0.5;\n\tconst v = 2 * Math.PI * t;\n\n\tconst a = 2;\n\n\tconst x = Math.cos( v ) * ( a + u * Math.cos( v / 2 ) );\n\tconst y = Math.sin( v ) * ( a + u * Math.cos( v / 2 ) );\n\tconst z = u * Math.sin( v / 2 );\n\n\ttarget.set( x, y, z );\n\n}\n\n/**\n * A parametric function representing a volumetric mobius strip.\n *\n * @param {number} u - The `u` coordinate on the surface in the range `[0,1]`.\n * @param {number} t - The `v` coordinate on the surface in the range `[0,1]`.\n * @param {Vector3} target - The target vector that is used to store the method's result.\n */\nfunction mobius3d( u, t, target ) {\n\n\tu *= Math.PI;\n\tt *= 2 * Math.PI;\n\n\tu = u * 2;\n\tconst phi = u / 2;\n\tconst major = 2.25, a = 0.125, b = 0.65;\n\n\tlet x = a * Math.cos( t ) * Math.cos( phi ) - b * Math.sin( t ) * Math.sin( phi );\n\tconst z = a * Math.cos( t ) * Math.sin( phi ) + b * Math.sin( t ) * Math.cos( phi );\n\tconst y = ( major + x ) * Math.sin( u );\n\tx = ( major + x ) * Math.cos( u );\n\n\ttarget.set( x, y, z );\n\n}\n\nexport { klein, plane, mobius, mobius3d };\n", "import {\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tVector3\n} from 'three';\n\n/**\n * This class can be used to generate a geometry based on a parametric surface.\n *\n * Reference: [Mesh Generation with Python](https://prideout.net/blog/old/blog/index.html@p=44.html)\n *\n * ```js\n * const geometry = new THREE.ParametricGeometry( klein, 25, 25 );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const klein = new THREE.Mesh( geometry, material );\n * scene.add( klein );\n * ```\n *\n * @augments BufferGeometry\n * @three_import import { ParametricGeometry } from 'three/addons/geometries/ParametricGeometry.js';\n */\nclass ParametricGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new parametric geometry.\n\t *\n\t * @param {ParametricGeometry~Func} func - The parametric function. Default is a function that generates a curved plane surface.\n\t * @param {number} [slices=8] - The number of slices to use for the parametric function.\n\t * @param {number} [stacks=8] - The stacks of slices to use for the parametric function.\n\t */\n\tconstructor( func = ( u, v, target ) => target.set( u, v, Math.cos( u ) * Math.sin( v ) ), slices = 8, stacks = 8 ) {\n\n\t\tsuper();\n\n\t\tthis.type = 'ParametricGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\tfunc: func,\n\t\t\tslices: slices,\n\t\t\tstacks: stacks\n\t\t};\n\n\t\t// buffers\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tconst EPS = 0.00001;\n\n\t\tconst normal = new Vector3();\n\n\t\tconst p0 = new Vector3(), p1 = new Vector3();\n\t\tconst pu = new Vector3(), pv = new Vector3();\n\n\t\t// generate vertices, normals and uvs\n\n\t\tconst sliceCount = slices + 1;\n\n\t\tfor ( let i = 0; i <= stacks; i ++ ) {\n\n\t\t\tconst v = i / stacks;\n\n\t\t\tfor ( let j = 0; j <= slices; j ++ ) {\n\n\t\t\t\tconst u = j / slices;\n\n\t\t\t\t// vertex\n\n\t\t\t\tfunc( u, v, p0 );\n\t\t\t\tvertices.push( p0.x, p0.y, p0.z );\n\n\t\t\t\t// normal\n\n\t\t\t\t// approximate tangent vectors via finite differences\n\n\t\t\t\tif ( u - EPS >= 0 ) {\n\n\t\t\t\t\tfunc( u - EPS, v, p1 );\n\t\t\t\t\tpu.subVectors( p0, p1 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfunc( u + EPS, v, p1 );\n\t\t\t\t\tpu.subVectors( p1, p0 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( v - EPS >= 0 ) {\n\n\t\t\t\t\tfunc( u, v - EPS, p1 );\n\t\t\t\t\tpv.subVectors( p0, p1 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfunc( u, v + EPS, p1 );\n\t\t\t\t\tpv.subVectors( p1, p0 );\n\n\t\t\t\t}\n\n\t\t\t\t// cross product of tangent vectors returns surface normal\n\n\t\t\t\tnormal.crossVectors( pu, pv ).normalize();\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\n\t\t\t\t// uv\n\n\t\t\t\tuvs.push( u, v );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// generate indices\n\n\t\tfor ( let i = 0; i < stacks; i ++ ) {\n\n\t\t\tfor ( let j = 0; j < slices; j ++ ) {\n\n\t\t\t\tconst a = i * sliceCount + j;\n\t\t\t\tconst b = i * sliceCount + j + 1;\n\t\t\t\tconst c = ( i + 1 ) * sliceCount + j + 1;\n\t\t\t\tconst d = ( i + 1 ) * sliceCount + j;\n\n\t\t\t\t// faces one and two\n\n\t\t\t\tindices.push( a, b, d );\n\t\t\t\tindices.push( b, c, d );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tthis.setIndex( indices );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.parameters = Object.assign( {}, source.parameters );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Parametric function definition of `ParametricGeometry`.\n *\n * @callback ParametricGeometry~Func\n * @param {number} u - The `u` coordinate on the surface in the range `[0,1]`.\n * @param {number} v - The `v` coordinate on the surface in the range `[0,1]`.\n * @param {Vector3} target - The target vector that is used to store the method's result.\n */\n\nexport { ParametricGeometry };\n", "import {\n\tBoxGeometry,\n\tVector3\n} from 'three';\n\nconst _tempNormal = new Vector3();\n\nfunction getUv( faceDirVector, normal, uvAxis, projectionAxis, radius, sideLength ) {\n\n\tconst totArcLength = 2 * Math.PI * radius / 4;\n\n\t// length of the planes between the arcs on each axis\n\tconst centerLength = Math.max( sideLength - 2 * radius, 0 );\n\tconst halfArc = Math.PI / 4;\n\n\t// Get the vector projected onto the Y plane\n\t_tempNormal.copy( normal );\n\t_tempNormal[ projectionAxis ] = 0;\n\t_tempNormal.normalize();\n\n\t// total amount of UV space alloted to a single arc\n\tconst arcUvRatio = 0.5 * totArcLength / ( totArcLength + centerLength );\n\n\t// the distance along one arc the point is at\n\tconst arcAngleRatio = 1.0 - ( _tempNormal.angleTo( faceDirVector ) / halfArc );\n\n\tif ( Math.sign( _tempNormal[ uvAxis ] ) === 1 ) {\n\n\t\treturn arcAngleRatio * arcUvRatio;\n\n\t} else {\n\n\t\t// total amount of UV space alloted to the plane between the arcs\n\t\tconst lenUv = centerLength / ( totArcLength + centerLength );\n\t\treturn lenUv + arcUvRatio + arcUvRatio * ( 1.0 - arcAngleRatio );\n\n\t}\n\n}\n\n/**\n * A special type of box geometry with rounded corners and edges.\n *\n * ```js\n * const geometry = new THREE.RoundedBoxGeometry();\n * const material = new THREE.MeshStandardMaterial( { color: 0x00ff00 } );\n * const cube = new THREE.Mesh( geometry, material );\n * scene.add( cube );\n * ```\n *\n * @augments BoxGeometry\n * @three_import import { RoundedBoxGeometry } from 'three/addons/geometries/RoundedBoxGeometry.js';\n */\nclass RoundedBoxGeometry extends BoxGeometry {\n\n\t/**\n\t * Constructs a new rounded box geometry.\n\t *\n\t * @param {number} [width=1] - The width. That is, the length of the edges parallel to the X axis.\n\t * @param {number} [height=1] - The height. That is, the length of the edges parallel to the Y axis.\n\t * @param {number} [depth=1] - The depth. That is, the length of the edges parallel to the Z axis.\n\t * @param {number} [segments=2] - Number of segments that form the rounded corners.\n\t * @param {number} [radius=0.1] - The radius of the rounded corners.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1, segments = 2, radius = 0.1 ) {\n\n\t\t// calculate total segments needed &\n\t\t// ensure it's odd so that we have a plane connecting the rounded corners\n\t\tconst totalSegments = segments * 2 + 1;\n\n\t\t// ensure radius isn't bigger than shortest side\n\t\tradius = Math.min( width / 2, height / 2, depth / 2, radius );\n\n\t\t// start with a unit box geometry, its vertices will be modified to form the rounded box\n\t\tsuper( 1, 1, 1, totalSegments, totalSegments, totalSegments );\n\n\t\tthis.type = 'RoundedBoxGeometry';\n\n\t\t/**\n\t\t * Holds the constructor parameters that have been\n\t\t * used to generate the geometry. Any modification\n\t\t * after instantiation does not change the geometry.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\tdepth: depth,\n\t\t\tsegments: segments,\n\t\t\tradius: radius,\n\t\t};\n\n\t\t// if totalSegments is 1, no rounding is needed - return regular box\n\t\tif ( totalSegments === 1 ) return;\n\n\t\tconst geometry2 = this.toNonIndexed();\n\n\t\tthis.index = null;\n\t\tthis.attributes.position = geometry2.attributes.position;\n\t\tthis.attributes.normal = geometry2.attributes.normal;\n\t\tthis.attributes.uv = geometry2.attributes.uv;\n\n\t\t//\n\n\t\tconst position = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\tconst box = new Vector3( width, height, depth ).divideScalar( 2 ).subScalar( radius );\n\n\t\tconst positions = this.attributes.position.array;\n\t\tconst normals = this.attributes.normal.array;\n\t\tconst uvs = this.attributes.uv.array;\n\n\t\tconst faceTris = positions.length / 6;\n\t\tconst faceDirVector = new Vector3();\n\t\tconst halfSegmentSize = 0.5 / totalSegments;\n\n\t\tfor ( let i = 0, j = 0; i < positions.length; i += 3, j += 2 ) {\n\n\t\t\tposition.fromArray( positions, i );\n\t\t\tnormal.copy( position );\n\t\t\tnormal.x -= Math.sign( normal.x ) * halfSegmentSize;\n\t\t\tnormal.y -= Math.sign( normal.y ) * halfSegmentSize;\n\t\t\tnormal.z -= Math.sign( normal.z ) * halfSegmentSize;\n\t\t\tnormal.normalize();\n\n\t\t\tpositions[ i + 0 ] = box.x * Math.sign( position.x ) + normal.x * radius;\n\t\t\tpositions[ i + 1 ] = box.y * Math.sign( position.y ) + normal.y * radius;\n\t\t\tpositions[ i + 2 ] = box.z * Math.sign( position.z ) + normal.z * radius;\n\n\t\t\tnormals[ i + 0 ] = normal.x;\n\t\t\tnormals[ i + 1 ] = normal.y;\n\t\t\tnormals[ i + 2 ] = normal.z;\n\n\t\t\tconst side = Math.floor( i / faceTris );\n\n\t\t\tswitch ( side ) {\n\n\t\t\t\tcase 0: // right\n\n\t\t\t\t\t// generate UVs along Z then Y\n\t\t\t\t\tfaceDirVector.set( 1, 0, 0 );\n\t\t\t\t\tuvs[ j + 0 ] = getUv( faceDirVector, normal, 'z', 'y', radius, depth );\n\t\t\t\t\tuvs[ j + 1 ] = 1.0 - getUv( faceDirVector, normal, 'y', 'z', radius, height );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 1: // left\n\n\t\t\t\t\t// generate UVs along Z then Y\n\t\t\t\t\tfaceDirVector.set( - 1, 0, 0 );\n\t\t\t\t\tuvs[ j + 0 ] = 1.0 - getUv( faceDirVector, normal, 'z', 'y', radius, depth );\n\t\t\t\t\tuvs[ j + 1 ] = 1.0 - getUv( faceDirVector, normal, 'y', 'z', radius, height );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2: // top\n\n\t\t\t\t\t// generate UVs along X then Z\n\t\t\t\t\tfaceDirVector.set( 0, 1, 0 );\n\t\t\t\t\tuvs[ j + 0 ] = 1.0 - getUv( faceDirVector, normal, 'x', 'z', radius, width );\n\t\t\t\t\tuvs[ j + 1 ] = getUv( faceDirVector, normal, 'z', 'x', radius, depth );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3: // bottom\n\n\t\t\t\t\t// generate UVs along X then Z\n\t\t\t\t\tfaceDirVector.set( 0, - 1, 0 );\n\t\t\t\t\tuvs[ j + 0 ] = 1.0 - getUv( faceDirVector, normal, 'x', 'z', radius, width );\n\t\t\t\t\tuvs[ j + 1 ] = 1.0 - getUv( faceDirVector, normal, 'z', 'x', radius, depth );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 4: // front\n\n\t\t\t\t\t// generate UVs along X then Y\n\t\t\t\t\tfaceDirVector.set( 0, 0, 1 );\n\t\t\t\t\tuvs[ j + 0 ] = 1.0 - getUv( faceDirVector, normal, 'x', 'y', radius, width );\n\t\t\t\t\tuvs[ j + 1 ] = 1.0 - getUv( faceDirVector, normal, 'y', 'x', radius, height );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 5: // back\n\n\t\t\t\t\t// generate UVs along X then Y\n\t\t\t\t\tfaceDirVector.set( 0, 0, - 1 );\n\t\t\t\t\tuvs[ j + 0 ] = getUv( faceDirVector, normal, 'x', 'y', radius, width );\n\t\t\t\t\tuvs[ j + 1 ] = 1.0 - getUv( faceDirVector, normal, 'y', 'x', radius, height );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of this class from the given\n\t * JSON object.\n\t *\n\t * @param {Object} data - A JSON object representing the serialized geometry.\n\t * @returns {RoundedBoxGeometry} A new instance.\n\t */\n\tstatic fromJSON( data ) {\n\n\t\treturn new RoundedBoxGeometry(\n\t\t\tdata.width,\n\t\t\tdata.height,\n\t\t\tdata.depth,\n\t\t\tdata.segments,\n\t\t\tdata.radius\n\t\t);\n\n\t}\n\n\n}\n\nexport { RoundedBoxGeometry };\n", "import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tMatrix4,\n\tVector3,\n\tVector4\n} from 'three';\n\n/**\n * Tessellates the famous Utah teapot database by Martin Newell into triangles.\n *\n * The teapot should normally be rendered as a double sided object, since for some\n * patches both sides can be seen, e.g., the gap around the lid and inside the spout.\n *\n * Segments 'n' determines the number of triangles output. Total triangles = 32*2*n*n - 8*n\n * (degenerates at the top and bottom cusps are deleted).\n *\n * Code based on [SPD software](http://tog.acm.org/resources/SPD/)\n * Created for the Udacity course [Interactive Rendering](http://bit.ly/ericity)\n *\n * ```js\n * const geometry = new TeapotGeometry( 50, 18 );\n * const material = new THREE.MeshBasicMaterial( { color: 0x00ff00 } );\n * const teapot = new THREE.Mesh( geometry, material );\n * scene.add( teapot );\n * ```\n *\n * @augments BufferGeometry\n * @three_import import { TeapotGeometry } from 'three/addons/geometries/TeapotGeometry.js';\n */\nclass TeapotGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new teapot geometry.\n\t *\n\t * @param {number} [size=50] - Relative scale of the teapot.\n\t * @param {number} [segments=10] - Number of line segments to subdivide each patch edge.\n\t * @param {boolean} [bottom=true] - Whether the bottom of the teapot is generated or not.\n\t * @param {boolean} [lid=true] - Whether the lid is generated or not.\n\t * @param {boolean} [body=true] - Whether the body is generated or not.\n\t * @param {boolean} [fitLid=true] - Whether the lid is slightly stretched to prevent gaps between the body and lid or not.\n\t * @param {boolean} [blinn=true] -  Whether the teapot is scaled vertically for better aesthetics or not.\n\t */\n\tconstructor( size = 50, segments = 10, bottom = true, lid = true, body = true, fitLid = true, blinn = true ) {\n\n\t\t// 32 * 4 * 4 Bezier spline patches\n\t\tconst teapotPatches = [\n\t\t\t/*rim*/\n\t\t\t0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n\t\t\t3, 16, 17, 18, 7, 19, 20, 21, 11, 22, 23, 24, 15, 25, 26, 27,\n\t\t\t18, 28, 29, 30, 21, 31, 32, 33, 24, 34, 35, 36, 27, 37, 38, 39,\n\t\t\t30, 40, 41, 0, 33, 42, 43, 4, 36, 44, 45, 8, 39, 46, 47, 12,\n\t\t\t/*body*/\n\t\t\t12, 13, 14, 15, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,\n\t\t\t15, 25, 26, 27, 51, 60, 61, 62, 55, 63, 64, 65, 59, 66, 67, 68,\n\t\t\t27, 37, 38, 39, 62, 69, 70, 71, 65, 72, 73, 74, 68, 75, 76, 77,\n\t\t\t39, 46, 47, 12, 71, 78, 79, 48, 74, 80, 81, 52, 77, 82, 83, 56,\n\t\t\t56, 57, 58, 59, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95,\n\t\t\t59, 66, 67, 68, 87, 96, 97, 98, 91, 99, 100, 101, 95, 102, 103, 104,\n\t\t\t68, 75, 76, 77, 98, 105, 106, 107, 101, 108, 109, 110, 104, 111, 112, 113,\n\t\t\t77, 82, 83, 56, 107, 114, 115, 84, 110, 116, 117, 88, 113, 118, 119, 92,\n\t\t\t/*handle*/\n\t\t\t120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135,\n\t\t\t123, 136, 137, 120, 127, 138, 139, 124, 131, 140, 141, 128, 135, 142, 143, 132,\n\t\t\t132, 133, 134, 135, 144, 145, 146, 147, 148, 149, 150, 151, 68, 152, 153, 154,\n\t\t\t135, 142, 143, 132, 147, 155, 156, 144, 151, 157, 158, 148, 154, 159, 160, 68,\n\t\t\t/*spout*/\n\t\t\t161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176,\n\t\t\t164, 177, 178, 161, 168, 179, 180, 165, 172, 181, 182, 169, 176, 183, 184, 173,\n\t\t\t173, 174, 175, 176, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196,\n\t\t\t176, 183, 184, 173, 188, 197, 198, 185, 192, 199, 200, 189, 196, 201, 202, 193,\n\t\t\t/*lid*/\n\t\t\t203, 203, 203, 203, 204, 205, 206, 207, 208, 208, 208, 208, 209, 210, 211, 212,\n\t\t\t203, 203, 203, 203, 207, 213, 214, 215, 208, 208, 208, 208, 212, 216, 217, 218,\n\t\t\t203, 203, 203, 203, 215, 219, 220, 221, 208, 208, 208, 208, 218, 222, 223, 224,\n\t\t\t203, 203, 203, 203, 221, 225, 226, 204, 208, 208, 208, 208, 224, 227, 228, 209,\n\t\t\t209, 210, 211, 212, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240,\n\t\t\t212, 216, 217, 218, 232, 241, 242, 243, 236, 244, 245, 246, 240, 247, 248, 249,\n\t\t\t218, 222, 223, 224, 243, 250, 251, 252, 246, 253, 254, 255, 249, 256, 257, 258,\n\t\t\t224, 227, 228, 209, 252, 259, 260, 229, 255, 261, 262, 233, 258, 263, 264, 237,\n\t\t\t/*bottom*/\n\t\t\t265, 265, 265, 265, 266, 267, 268, 269, 270, 271, 272, 273, 92, 119, 118, 113,\n\t\t\t265, 265, 265, 265, 269, 274, 275, 276, 273, 277, 278, 279, 113, 112, 111, 104,\n\t\t\t265, 265, 265, 265, 276, 280, 281, 282, 279, 283, 284, 285, 104, 103, 102, 95,\n\t\t\t265, 265, 265, 265, 282, 286, 287, 266, 285, 288, 289, 270, 95, 94, 93, 92\n\t\t];\n\n\t\tconst teapotVertices = [\n\t\t\t1.4, 0, 2.4,\n\t\t\t1.4, - 0.784, 2.4,\n\t\t\t0.784, - 1.4, 2.4,\n\t\t\t0, - 1.4, 2.4,\n\t\t\t1.3375, 0, 2.53125,\n\t\t\t1.3375, - 0.749, 2.53125,\n\t\t\t0.749, - 1.3375, 2.53125,\n\t\t\t0, - 1.3375, 2.53125,\n\t\t\t1.4375, 0, 2.53125,\n\t\t\t1.4375, - 0.805, 2.53125,\n\t\t\t0.805, - 1.4375, 2.53125,\n\t\t\t0, - 1.4375, 2.53125,\n\t\t\t1.5, 0, 2.4,\n\t\t\t1.5, - 0.84, 2.4,\n\t\t\t0.84, - 1.5, 2.4,\n\t\t\t0, - 1.5, 2.4,\n\t\t\t- 0.784, - 1.4, 2.4,\n\t\t\t- 1.4, - 0.784, 2.4,\n\t\t\t- 1.4, 0, 2.4,\n\t\t\t- 0.749, - 1.3375, 2.53125,\n\t\t\t- 1.3375, - 0.749, 2.53125,\n\t\t\t- 1.3375, 0, 2.53125,\n\t\t\t- 0.805, - 1.4375, 2.53125,\n\t\t\t- 1.4375, - 0.805, 2.53125,\n\t\t\t- 1.4375, 0, 2.53125,\n\t\t\t- 0.84, - 1.5, 2.4,\n\t\t\t- 1.5, - 0.84, 2.4,\n\t\t\t- 1.5, 0, 2.4,\n\t\t\t- 1.4, 0.784, 2.4,\n\t\t\t- 0.784, 1.4, 2.4,\n\t\t\t0, 1.4, 2.4,\n\t\t\t- 1.3375, 0.749, 2.53125,\n\t\t\t- 0.749, 1.3375, 2.53125,\n\t\t\t0, 1.3375, 2.53125,\n\t\t\t- 1.4375, 0.805, 2.53125,\n\t\t\t- 0.805, 1.4375, 2.53125,\n\t\t\t0, 1.4375, 2.53125,\n\t\t\t- 1.5, 0.84, 2.4,\n\t\t\t- 0.84, 1.5, 2.4,\n\t\t\t0, 1.5, 2.4,\n\t\t\t0.784, 1.4, 2.4,\n\t\t\t1.4, 0.784, 2.4,\n\t\t\t0.749, 1.3375, 2.53125,\n\t\t\t1.3375, 0.749, 2.53125,\n\t\t\t0.805, 1.4375, 2.53125,\n\t\t\t1.4375, 0.805, 2.53125,\n\t\t\t0.84, 1.5, 2.4,\n\t\t\t1.5, 0.84, 2.4,\n\t\t\t1.75, 0, 1.875,\n\t\t\t1.75, - 0.98, 1.875,\n\t\t\t0.98, - 1.75, 1.875,\n\t\t\t0, - 1.75, 1.875,\n\t\t\t2, 0, 1.35,\n\t\t\t2, - 1.12, 1.35,\n\t\t\t1.12, - 2, 1.35,\n\t\t\t0, - 2, 1.35,\n\t\t\t2, 0, 0.9,\n\t\t\t2, - 1.12, 0.9,\n\t\t\t1.12, - 2, 0.9,\n\t\t\t0, - 2, 0.9,\n\t\t\t- 0.98, - 1.75, 1.875,\n\t\t\t- 1.75, - 0.98, 1.875,\n\t\t\t- 1.75, 0, 1.875,\n\t\t\t- 1.12, - 2, 1.35,\n\t\t\t- 2, - 1.12, 1.35,\n\t\t\t- 2, 0, 1.35,\n\t\t\t- 1.12, - 2, 0.9,\n\t\t\t- 2, - 1.12, 0.9,\n\t\t\t- 2, 0, 0.9,\n\t\t\t- 1.75, 0.98, 1.875,\n\t\t\t- 0.98, 1.75, 1.875,\n\t\t\t0, 1.75, 1.875,\n\t\t\t- 2, 1.12, 1.35,\n\t\t\t- 1.12, 2, 1.35,\n\t\t\t0, 2, 1.35,\n\t\t\t- 2, 1.12, 0.9,\n\t\t\t- 1.12, 2, 0.9,\n\t\t\t0, 2, 0.9,\n\t\t\t0.98, 1.75, 1.875,\n\t\t\t1.75, 0.98, 1.875,\n\t\t\t1.12, 2, 1.35,\n\t\t\t2, 1.12, 1.35,\n\t\t\t1.12, 2, 0.9,\n\t\t\t2, 1.12, 0.9,\n\t\t\t2, 0, 0.45,\n\t\t\t2, - 1.12, 0.45,\n\t\t\t1.12, - 2, 0.45,\n\t\t\t0, - 2, 0.45,\n\t\t\t1.5, 0, 0.225,\n\t\t\t1.5, - 0.84, 0.225,\n\t\t\t0.84, - 1.5, 0.225,\n\t\t\t0, - 1.5, 0.225,\n\t\t\t1.5, 0, 0.15,\n\t\t\t1.5, - 0.84, 0.15,\n\t\t\t0.84, - 1.5, 0.15,\n\t\t\t0, - 1.5, 0.15,\n\t\t\t- 1.12, - 2, 0.45,\n\t\t\t- 2, - 1.12, 0.45,\n\t\t\t- 2, 0, 0.45,\n\t\t\t- 0.84, - 1.5, 0.225,\n\t\t\t- 1.5, - 0.84, 0.225,\n\t\t\t- 1.5, 0, 0.225,\n\t\t\t- 0.84, - 1.5, 0.15,\n\t\t\t- 1.5, - 0.84, 0.15,\n\t\t\t- 1.5, 0, 0.15,\n\t\t\t- 2, 1.12, 0.45,\n\t\t\t- 1.12, 2, 0.45,\n\t\t\t0, 2, 0.45,\n\t\t\t- 1.5, 0.84, 0.225,\n\t\t\t- 0.84, 1.5, 0.225,\n\t\t\t0, 1.5, 0.225,\n\t\t\t- 1.5, 0.84, 0.15,\n\t\t\t- 0.84, 1.5, 0.15,\n\t\t\t0, 1.5, 0.15,\n\t\t\t1.12, 2, 0.45,\n\t\t\t2, 1.12, 0.45,\n\t\t\t0.84, 1.5, 0.225,\n\t\t\t1.5, 0.84, 0.225,\n\t\t\t0.84, 1.5, 0.15,\n\t\t\t1.5, 0.84, 0.15,\n\t\t\t- 1.6, 0, 2.025,\n\t\t\t- 1.6, - 0.3, 2.025,\n\t\t\t- 1.5, - 0.3, 2.25,\n\t\t\t- 1.5, 0, 2.25,\n\t\t\t- 2.3, 0, 2.025,\n\t\t\t- 2.3, - 0.3, 2.025,\n\t\t\t- 2.5, - 0.3, 2.25,\n\t\t\t- 2.5, 0, 2.25,\n\t\t\t- 2.7, 0, 2.025,\n\t\t\t- 2.7, - 0.3, 2.025,\n\t\t\t- 3, - 0.3, 2.25,\n\t\t\t- 3, 0, 2.25,\n\t\t\t- 2.7, 0, 1.8,\n\t\t\t- 2.7, - 0.3, 1.8,\n\t\t\t- 3, - 0.3, 1.8,\n\t\t\t- 3, 0, 1.8,\n\t\t\t- 1.5, 0.3, 2.25,\n\t\t\t- 1.6, 0.3, 2.025,\n\t\t\t- 2.5, 0.3, 2.25,\n\t\t\t- 2.3, 0.3, 2.025,\n\t\t\t- 3, 0.3, 2.25,\n\t\t\t- 2.7, 0.3, 2.025,\n\t\t\t- 3, 0.3, 1.8,\n\t\t\t- 2.7, 0.3, 1.8,\n\t\t\t- 2.7, 0, 1.575,\n\t\t\t- 2.7, - 0.3, 1.575,\n\t\t\t- 3, - 0.3, 1.35,\n\t\t\t- 3, 0, 1.35,\n\t\t\t- 2.5, 0, 1.125,\n\t\t\t- 2.5, - 0.3, 1.125,\n\t\t\t- 2.65, - 0.3, 0.9375,\n\t\t\t- 2.65, 0, 0.9375,\n\t\t\t- 2, - 0.3, 0.9,\n\t\t\t- 1.9, - 0.3, 0.6,\n\t\t\t- 1.9, 0, 0.6,\n\t\t\t- 3, 0.3, 1.35,\n\t\t\t- 2.7, 0.3, 1.575,\n\t\t\t- 2.65, 0.3, 0.9375,\n\t\t\t- 2.5, 0.3, 1.125,\n\t\t\t- 1.9, 0.3, 0.6,\n\t\t\t- 2, 0.3, 0.9,\n\t\t\t1.7, 0, 1.425,\n\t\t\t1.7, - 0.66, 1.425,\n\t\t\t1.7, - 0.66, 0.6,\n\t\t\t1.7, 0, 0.6,\n\t\t\t2.6, 0, 1.425,\n\t\t\t2.6, - 0.66, 1.425,\n\t\t\t3.1, - 0.66, 0.825,\n\t\t\t3.1, 0, 0.825,\n\t\t\t2.3, 0, 2.1,\n\t\t\t2.3, - 0.25, 2.1,\n\t\t\t2.4, - 0.25, 2.025,\n\t\t\t2.4, 0, 2.025,\n\t\t\t2.7, 0, 2.4,\n\t\t\t2.7, - 0.25, 2.4,\n\t\t\t3.3, - 0.25, 2.4,\n\t\t\t3.3, 0, 2.4,\n\t\t\t1.7, 0.66, 0.6,\n\t\t\t1.7, 0.66, 1.425,\n\t\t\t3.1, 0.66, 0.825,\n\t\t\t2.6, 0.66, 1.425,\n\t\t\t2.4, 0.25, 2.025,\n\t\t\t2.3, 0.25, 2.1,\n\t\t\t3.3, 0.25, 2.4,\n\t\t\t2.7, 0.25, 2.4,\n\t\t\t2.8, 0, 2.475,\n\t\t\t2.8, - 0.25, 2.475,\n\t\t\t3.525, - 0.25, 2.49375,\n\t\t\t3.525, 0, 2.49375,\n\t\t\t2.9, 0, 2.475,\n\t\t\t2.9, - 0.15, 2.475,\n\t\t\t3.45, - 0.15, 2.5125,\n\t\t\t3.45, 0, 2.5125,\n\t\t\t2.8, 0, 2.4,\n\t\t\t2.8, - 0.15, 2.4,\n\t\t\t3.2, - 0.15, 2.4,\n\t\t\t3.2, 0, 2.4,\n\t\t\t3.525, 0.25, 2.49375,\n\t\t\t2.8, 0.25, 2.475,\n\t\t\t3.45, 0.15, 2.5125,\n\t\t\t2.9, 0.15, 2.475,\n\t\t\t3.2, 0.15, 2.4,\n\t\t\t2.8, 0.15, 2.4,\n\t\t\t0, 0, 3.15,\n\t\t\t0.8, 0, 3.15,\n\t\t\t0.8, - 0.45, 3.15,\n\t\t\t0.45, - 0.8, 3.15,\n\t\t\t0, - 0.8, 3.15,\n\t\t\t0, 0, 2.85,\n\t\t\t0.2, 0, 2.7,\n\t\t\t0.2, - 0.112, 2.7,\n\t\t\t0.112, - 0.2, 2.7,\n\t\t\t0, - 0.2, 2.7,\n\t\t\t- 0.45, - 0.8, 3.15,\n\t\t\t- 0.8, - 0.45, 3.15,\n\t\t\t- 0.8, 0, 3.15,\n\t\t\t- 0.112, - 0.2, 2.7,\n\t\t\t- 0.2, - 0.112, 2.7,\n\t\t\t- 0.2, 0, 2.7,\n\t\t\t- 0.8, 0.45, 3.15,\n\t\t\t- 0.45, 0.8, 3.15,\n\t\t\t0, 0.8, 3.15,\n\t\t\t- 0.2, 0.112, 2.7,\n\t\t\t- 0.112, 0.2, 2.7,\n\t\t\t0, 0.2, 2.7,\n\t\t\t0.45, 0.8, 3.15,\n\t\t\t0.8, 0.45, 3.15,\n\t\t\t0.112, 0.2, 2.7,\n\t\t\t0.2, 0.112, 2.7,\n\t\t\t0.4, 0, 2.55,\n\t\t\t0.4, - 0.224, 2.55,\n\t\t\t0.224, - 0.4, 2.55,\n\t\t\t0, - 0.4, 2.55,\n\t\t\t1.3, 0, 2.55,\n\t\t\t1.3, - 0.728, 2.55,\n\t\t\t0.728, - 1.3, 2.55,\n\t\t\t0, - 1.3, 2.55,\n\t\t\t1.3, 0, 2.4,\n\t\t\t1.3, - 0.728, 2.4,\n\t\t\t0.728, - 1.3, 2.4,\n\t\t\t0, - 1.3, 2.4,\n\t\t\t- 0.224, - 0.4, 2.55,\n\t\t\t- 0.4, - 0.224, 2.55,\n\t\t\t- 0.4, 0, 2.55,\n\t\t\t- 0.728, - 1.3, 2.55,\n\t\t\t- 1.3, - 0.728, 2.55,\n\t\t\t- 1.3, 0, 2.55,\n\t\t\t- 0.728, - 1.3, 2.4,\n\t\t\t- 1.3, - 0.728, 2.4,\n\t\t\t- 1.3, 0, 2.4,\n\t\t\t- 0.4, 0.224, 2.55,\n\t\t\t- 0.224, 0.4, 2.55,\n\t\t\t0, 0.4, 2.55,\n\t\t\t- 1.3, 0.728, 2.55,\n\t\t\t- 0.728, 1.3, 2.55,\n\t\t\t0, 1.3, 2.55,\n\t\t\t- 1.3, 0.728, 2.4,\n\t\t\t- 0.728, 1.3, 2.4,\n\t\t\t0, 1.3, 2.4,\n\t\t\t0.224, 0.4, 2.55,\n\t\t\t0.4, 0.224, 2.55,\n\t\t\t0.728, 1.3, 2.55,\n\t\t\t1.3, 0.728, 2.55,\n\t\t\t0.728, 1.3, 2.4,\n\t\t\t1.3, 0.728, 2.4,\n\t\t\t0, 0, 0,\n\t\t\t1.425, 0, 0,\n\t\t\t1.425, 0.798, 0,\n\t\t\t0.798, 1.425, 0,\n\t\t\t0, 1.425, 0,\n\t\t\t1.5, 0, 0.075,\n\t\t\t1.5, 0.84, 0.075,\n\t\t\t0.84, 1.5, 0.075,\n\t\t\t0, 1.5, 0.075,\n\t\t\t- 0.798, 1.425, 0,\n\t\t\t- 1.425, 0.798, 0,\n\t\t\t- 1.425, 0, 0,\n\t\t\t- 0.84, 1.5, 0.075,\n\t\t\t- 1.5, 0.84, 0.075,\n\t\t\t- 1.5, 0, 0.075,\n\t\t\t- 1.425, - 0.798, 0,\n\t\t\t- 0.798, - 1.425, 0,\n\t\t\t0, - 1.425, 0,\n\t\t\t- 1.5, - 0.84, 0.075,\n\t\t\t- 0.84, - 1.5, 0.075,\n\t\t\t0, - 1.5, 0.075,\n\t\t\t0.798, - 1.425, 0,\n\t\t\t1.425, - 0.798, 0,\n\t\t\t0.84, - 1.5, 0.075,\n\t\t\t1.5, - 0.84, 0.075\n\t\t];\n\n\t\tsuper();\n\n\t\t// number of segments per patch\n\t\tsegments = Math.max( 2, Math.floor( segments ) );\n\n\t\t// Jim Blinn scaled the teapot down in size by about 1.3 for\n\t\t// some rendering tests. He liked the new proportions that he kept\n\t\t// the data in this form. The model was distributed with these new\n\t\t// proportions and became the norm. Trivia: comparing images of the\n\t\t// real teapot and the computer model, the ratio for the bowl of the\n\t\t// real teapot is more like 1.25, but since 1.3 is the traditional\n\t\t// value given, we use it here.\n\t\tconst blinnScale = 1.3;\n\n\t\t// scale the size to be the real scaling factor\n\t\tconst maxHeight = 3.15 * ( blinn ? 1 : blinnScale );\n\n\t\tconst maxHeight2 = maxHeight / 2;\n\t\tconst trueSize = size / maxHeight2;\n\n\t\t// Number of elements depends on what is needed. Subtract degenerate\n\t\t// triangles at tip of bottom and lid out in advance.\n\t\tlet numTriangles = bottom ? ( 8 * segments - 4 ) * segments : 0;\n\t\tnumTriangles += lid ? ( 16 * segments - 4 ) * segments : 0;\n\t\tnumTriangles += body ? 40 * segments * segments : 0;\n\n\t\tconst indices = new Uint32Array( numTriangles * 3 );\n\n\t\tlet numVertices = bottom ? 4 : 0;\n\t\tnumVertices += lid ? 8 : 0;\n\t\tnumVertices += body ? 20 : 0;\n\t\tnumVertices *= ( segments + 1 ) * ( segments + 1 );\n\n\t\tconst vertices = new Float32Array( numVertices * 3 );\n\t\tconst normals = new Float32Array( numVertices * 3 );\n\t\tconst uvs = new Float32Array( numVertices * 2 );\n\n\t\t// Bezier form\n\t\tconst ms = new Matrix4();\n\t\tms.set(\n\t\t\t- 1.0, 3.0, - 3.0, 1.0,\n\t\t\t3.0, - 6.0, 3.0, 0.0,\n\t\t\t- 3.0, 3.0, 0.0, 0.0,\n\t\t\t1.0, 0.0, 0.0, 0.0 );\n\n\t\tconst g = [];\n\n\t\tconst sp = [];\n\t\tconst tp = [];\n\t\tconst dsp = [];\n\t\tconst dtp = [];\n\n\t\t// M * G * M matrix, sort of see\n\t\t// http://www.cs.helsinki.fi/group/goa/mallinnus/curves/surfaces.html\n\t\tconst mgm = [];\n\n\t\tconst vert = [];\n\t\tconst sdir = [];\n\t\tconst tdir = [];\n\n\t\tconst norm = new Vector3();\n\n\t\tlet tcoord;\n\n\t\tlet sval;\n\t\tlet tval;\n\t\tlet p;\n\t\tlet dsval = 0;\n\t\tlet dtval = 0;\n\n\t\tconst normOut = new Vector3();\n\n\t\tconst gmx = new Matrix4();\n\t\tconst tmtx = new Matrix4();\n\n\t\tconst vsp = new Vector4();\n\t\tconst vtp = new Vector4();\n\t\tconst vdsp = new Vector4();\n\t\tconst vdtp = new Vector4();\n\n\t\tconst vsdir = new Vector3();\n\t\tconst vtdir = new Vector3();\n\n\t\tconst mst = ms.clone();\n\t\tmst.transpose();\n\n\t\t// internal function: test if triangle has any matching vertices;\n\t\t// if so, don't save triangle, since it won't display anything.\n\t\tconst notDegenerate = ( vtx1, vtx2, vtx3 ) => // if any vertex matches, return false\n\t\t\t! ( ( ( vertices[ vtx1 * 3 ] === vertices[ vtx2 * 3 ] ) &&\n\t\t\t\t\t( vertices[ vtx1 * 3 + 1 ] === vertices[ vtx2 * 3 + 1 ] ) &&\n\t\t\t\t\t( vertices[ vtx1 * 3 + 2 ] === vertices[ vtx2 * 3 + 2 ] ) ) ||\n\t\t\t\t\t( ( vertices[ vtx1 * 3 ] === vertices[ vtx3 * 3 ] ) &&\n\t\t\t\t\t( vertices[ vtx1 * 3 + 1 ] === vertices[ vtx3 * 3 + 1 ] ) &&\n\t\t\t\t\t( vertices[ vtx1 * 3 + 2 ] === vertices[ vtx3 * 3 + 2 ] ) ) || ( vertices[ vtx2 * 3 ] === vertices[ vtx3 * 3 ] ) &&\n\t\t\t\t\t( vertices[ vtx2 * 3 + 1 ] === vertices[ vtx3 * 3 + 1 ] ) &&\n\t\t\t\t\t( vertices[ vtx2 * 3 + 2 ] === vertices[ vtx3 * 3 + 2 ] ) );\n\n\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tmgm[ i ] = new Matrix4();\n\n\t\t}\n\n\t\tconst minPatches = body ? 0 : 20;\n\t\tconst maxPatches = bottom ? 32 : 28;\n\n\t\tconst vertPerRow = segments + 1;\n\n\t\tlet surfCount = 0;\n\n\t\tlet vertCount = 0;\n\t\tlet normCount = 0;\n\t\tlet uvCount = 0;\n\n\t\tlet indexCount = 0;\n\n\t\tfor ( let surf = minPatches; surf < maxPatches; surf ++ ) {\n\n\t\t\t// lid is in the middle of the data, patches 20-27,\n\t\t\t// so ignore it for this part of the loop if the lid is not desired\n\t\t\tif ( lid || ( surf < 20 || surf >= 28 ) ) {\n\n\t\t\t\t// get M * G * M matrix for x,y,z\n\t\t\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t// get control patches\n\t\t\t\t\tfor ( let r = 0; r < 4; r ++ ) {\n\n\t\t\t\t\t\tfor ( let c = 0; c < 4; c ++ ) {\n\n\t\t\t\t\t\t\t// transposed\n\t\t\t\t\t\t\tg[ c * 4 + r ] = teapotVertices[ teapotPatches[ surf * 16 + r * 4 + c ] * 3 + i ];\n\n\t\t\t\t\t\t\t// is the lid to be made larger, and is this a point on the lid\n\t\t\t\t\t\t\t// that is X or Y?\n\t\t\t\t\t\t\tif ( fitLid && ( surf >= 20 && surf < 28 ) && ( i !== 2 ) ) {\n\n\t\t\t\t\t\t\t\t// increase XY size by 7.7%, found empirically. I don't\n\t\t\t\t\t\t\t\t// increase Z so that the teapot will continue to fit in the\n\t\t\t\t\t\t\t\t// space -1 to 1 for Y (Y is up for the final model).\n\t\t\t\t\t\t\t\tg[ c * 4 + r ] *= 1.077;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Blinn \"fixed\" the teapot by dividing Z by blinnScale, and that's the\n\t\t\t\t\t\t\t// data we now use. The original teapot is taller. Fix it:\n\t\t\t\t\t\t\tif ( ! blinn && ( i === 2 ) ) {\n\n\t\t\t\t\t\t\t\tg[ c * 4 + r ] *= blinnScale;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgmx.set( g[ 0 ], g[ 1 ], g[ 2 ], g[ 3 ], g[ 4 ], g[ 5 ], g[ 6 ], g[ 7 ], g[ 8 ], g[ 9 ], g[ 10 ], g[ 11 ], g[ 12 ], g[ 13 ], g[ 14 ], g[ 15 ] );\n\n\t\t\t\t\ttmtx.multiplyMatrices( gmx, ms );\n\t\t\t\t\tmgm[ i ].multiplyMatrices( mst, tmtx );\n\n\t\t\t\t}\n\n\t\t\t\t// step along, get points, and output\n\t\t\t\tfor ( let sstep = 0; sstep <= segments; sstep ++ ) {\n\n\t\t\t\t\tconst s = sstep / segments;\n\n\t\t\t\t\tfor ( let tstep = 0; tstep <= segments; tstep ++ ) {\n\n\t\t\t\t\t\tconst t = tstep / segments;\n\n\t\t\t\t\t\t// point from basis\n\t\t\t\t\t\t// get power vectors and their derivatives\n\t\t\t\t\t\tfor ( p = 4, sval = tval = 1.0; p --; ) {\n\n\t\t\t\t\t\t\tsp[ p ] = sval;\n\t\t\t\t\t\t\ttp[ p ] = tval;\n\t\t\t\t\t\t\tsval *= s;\n\t\t\t\t\t\t\ttval *= t;\n\n\t\t\t\t\t\t\tif ( p === 3 ) {\n\n\t\t\t\t\t\t\t\tdsp[ p ] = dtp[ p ] = 0.0;\n\t\t\t\t\t\t\t\tdsval = dtval = 1.0;\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tdsp[ p ] = dsval * ( 3 - p );\n\t\t\t\t\t\t\t\tdtp[ p ] = dtval * ( 3 - p );\n\t\t\t\t\t\t\t\tdsval *= s;\n\t\t\t\t\t\t\t\tdtval *= t;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvsp.fromArray( sp );\n\t\t\t\t\t\tvtp.fromArray( tp );\n\t\t\t\t\t\tvdsp.fromArray( dsp );\n\t\t\t\t\t\tvdtp.fromArray( dtp );\n\n\t\t\t\t\t\t// do for x,y,z\n\t\t\t\t\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\t// multiply power vectors times matrix to get value\n\t\t\t\t\t\t\ttcoord = vsp.clone();\n\t\t\t\t\t\t\ttcoord.applyMatrix4( mgm[ i ] );\n\t\t\t\t\t\t\tvert[ i ] = tcoord.dot( vtp );\n\n\t\t\t\t\t\t\t// get s and t tangent vectors\n\t\t\t\t\t\t\ttcoord = vdsp.clone();\n\t\t\t\t\t\t\ttcoord.applyMatrix4( mgm[ i ] );\n\t\t\t\t\t\t\tsdir[ i ] = tcoord.dot( vtp );\n\n\t\t\t\t\t\t\ttcoord = vsp.clone();\n\t\t\t\t\t\t\ttcoord.applyMatrix4( mgm[ i ] );\n\t\t\t\t\t\t\ttdir[ i ] = tcoord.dot( vdtp );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// find normal\n\t\t\t\t\t\tvsdir.fromArray( sdir );\n\t\t\t\t\t\tvtdir.fromArray( tdir );\n\t\t\t\t\t\tnorm.crossVectors( vtdir, vsdir );\n\t\t\t\t\t\tnorm.normalize();\n\n\t\t\t\t\t\t// if X and Z length is 0, at the cusp, so point the normal up or down, depending on patch number\n\t\t\t\t\t\tif ( vert[ 0 ] === 0 && vert[ 1 ] === 0 ) {\n\n\t\t\t\t\t\t\t// if above the middle of the teapot, normal points up, else down\n\t\t\t\t\t\t\tnormOut.set( 0, vert[ 2 ] > maxHeight2 ? 1 : - 1, 0 );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// standard output: rotate on X axis\n\t\t\t\t\t\t\tnormOut.set( norm.x, norm.z, - norm.y );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// store it all\n\t\t\t\t\t\tvertices[ vertCount ++ ] = trueSize * vert[ 0 ];\n\t\t\t\t\t\tvertices[ vertCount ++ ] = trueSize * ( vert[ 2 ] - maxHeight2 );\n\t\t\t\t\t\tvertices[ vertCount ++ ] = - trueSize * vert[ 1 ];\n\n\t\t\t\t\t\tnormals[ normCount ++ ] = normOut.x;\n\t\t\t\t\t\tnormals[ normCount ++ ] = normOut.y;\n\t\t\t\t\t\tnormals[ normCount ++ ] = normOut.z;\n\n\t\t\t\t\t\tuvs[ uvCount ++ ] = 1 - t;\n\t\t\t\t\t\tuvs[ uvCount ++ ] = 1 - s;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// save the faces\n\t\t\t\tfor ( let sstep = 0; sstep < segments; sstep ++ ) {\n\n\t\t\t\t\tfor ( let tstep = 0; tstep < segments; tstep ++ ) {\n\n\t\t\t\t\t\tconst v1 = surfCount * vertPerRow * vertPerRow + sstep * vertPerRow + tstep;\n\t\t\t\t\t\tconst v2 = v1 + 1;\n\t\t\t\t\t\tconst v3 = v2 + vertPerRow;\n\t\t\t\t\t\tconst v4 = v1 + vertPerRow;\n\n\t\t\t\t\t\t// Normals and UVs cannot be shared. Without clone(), you can see the consequences\n\t\t\t\t\t\t// of sharing if you call geometry.applyMatrix4( matrix ).\n\t\t\t\t\t\tif ( notDegenerate( v1, v2, v3 ) ) {\n\n\t\t\t\t\t\t\tindices[ indexCount ++ ] = v1;\n\t\t\t\t\t\t\tindices[ indexCount ++ ] = v2;\n\t\t\t\t\t\t\tindices[ indexCount ++ ] = v3;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( notDegenerate( v1, v3, v4 ) ) {\n\n\t\t\t\t\t\t\tindices[ indexCount ++ ] = v1;\n\t\t\t\t\t\t\tindices[ indexCount ++ ] = v3;\n\t\t\t\t\t\t\tindices[ indexCount ++ ] = v4;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// increment only if a surface was used\n\t\t\t\tsurfCount ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex( new BufferAttribute( indices, 1 ) );\n\t\tthis.setAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\t\tthis.setAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\t\tthis.setAttribute( 'uv', new BufferAttribute( uvs, 2 ) );\n\n\t\tthis.computeBoundingSphere();\n\n\t}\n\n}\n\nexport { TeapotGeometry };\n", "import {\n\tExtrudeGeometry\n} from 'three';\n\n/**\n * A class for generating text as a single geometry. It is constructed by providing a string of text, and a set of\n * parameters consisting of a loaded font and extrude settings.\n *\n * See the {@link FontLoader} page for additional details.\n *\n * `TextGeometry` uses [typeface.json](http://gero3.github.io/facetype.js/) generated fonts.\n * Some existing fonts can be found located in `/examples/fonts`.\n *\n * ```js\n * const loader = new FontLoader();\n * const font = await loader.loadAsync( 'fonts/helvetiker_regular.typeface.json' );\n * const geometry = new TextGeometry( 'Hello three.js!', {\n * \tfont: font,\n * \tsize: 80,\n * \tdepth: 5,\n * \tcurveSegments: 12\n * } );\n * ```\n *\n * @augments ExtrudeGeometry\n * @three_import import { TextGeometry } from 'three/addons/geometries/TextGeometry.js';\n */\nclass TextGeometry extends ExtrudeGeometry {\n\n\t/**\n\t * Constructs a new text geometry.\n\t *\n\t * @param {string} text - The text that should be transformed into a geometry.\n\t * @param {TextGeometry~Options} [parameters] - The text settings.\n\t */\n\tconstructor( text, parameters = {} ) {\n\n\t\tconst font = parameters.font;\n\n\t\tif ( font === undefined ) {\n\n\t\t\tsuper(); // generate default extrude geometry\n\n\t\t} else {\n\n\t\t\tconst shapes = font.generateShapes( text, parameters.size, parameters.direction );\n\n\t\t\t// defaults\n\n\t\t\tif ( parameters.depth === undefined ) parameters.depth = 50;\n\t\t\tif ( parameters.bevelThickness === undefined ) parameters.bevelThickness = 10;\n\t\t\tif ( parameters.bevelSize === undefined ) parameters.bevelSize = 8;\n\t\t\tif ( parameters.bevelEnabled === undefined ) parameters.bevelEnabled = false;\n\n\t\t\tsuper( shapes, parameters );\n\n\t\t}\n\n\t\tthis.type = 'TextGeometry';\n\n\t}\n\n}\n\n/**\n * Represents the `options` type of the geometry's constructor.\n *\n * @typedef {Object} TextGeometry~Options\n * @property {Font} [font] - The font.\n * @property {number} [size=100] - The text size.\n * @property {number} [depth=50] - Depth to extrude the shape.\n * @property {number} [curveSegments=12] - Number of points on the curves.\n * @property {number} [steps=1] - Number of points used for subdividing segments along the depth of the extruded spline.\n * @property {boolean} [bevelEnabled=false] - Whether to beveling to the shape or not.\n * @property {number} [bevelThickness=10] - How deep into the original shape the bevel goes.\n * @property {number} [bevelSize=8] - Distance from the shape outline that the bevel extends.\n * @property {number} [bevelOffset=0] - Distance from the shape outline that the bevel starts.\n * @property {number} [bevelSegments=3] - Number of bevel layers.\n * @property {string} [direction='ltr'] - Char direction: ltr(left to right), rtl(right to left) & tb(top bottom).\n * @property {?Curve} [extrudePath=null] - A 3D spline path along which the shape should be extruded. Bevels not supported for path extrusion.\n * @property {Object} [UVGenerator] - An object that provides UV generator functions for custom UV generation.\n **/\n\nexport { TextGeometry };\n", "import {\n\tMesh,\n\tShaderMaterial,\n\tSphereGeometry\n} from 'three';\n\n/**\n * Renders a sphere to visualize a light probe in the scene.\n *\n * This helper can only be used with {@link WebGLRenderer}.\n * When using {@link WebGPURenderer}, import from `LightProbeHelperGPU.js`.\n *\n * ```js\n * const helper = new LightProbeHelper( lightProbe );\n * scene.add( helper );\n * ```\n *\n * @augments Mesh\n * @three_import import { LightProbeHelper } from 'three/addons/helpers/LightProbeHelper.js';\n */\nclass LightProbeHelper extends Mesh {\n\n\t/**\n\t * Constructs a new light probe helper.\n\t *\n\t * @param {LightProbe} lightProbe - The light probe to visualize.\n\t * @param {number} [size=1] - The size of the helper.\n\t */\n\tconstructor( lightProbe, size = 1 ) {\n\n\t\tconst material = new ShaderMaterial( {\n\n\t\t\ttype: 'LightProbeHelperMaterial',\n\n\t\t\tuniforms: {\n\n\t\t\t\tsh: { value: lightProbe.sh.coefficients }, // by reference\n\n\t\t\t\tintensity: { value: lightProbe.intensity }\n\n\t\t\t},\n\n\t\t\tvertexShader: /* glsl */`\n\n\t\t\t\tvarying vec3 vNormal;\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvNormal = normalize( normalMatrix * normal );\n\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t\t\t}\n\n\t\t\t`,\n\n\t\t\tfragmentShader: /* glsl */`\n\n\t\t\t\t#define RECIPROCAL_PI 0.318309886\n\n\t\t\t\tvec3 inverseTransformDirection( in vec3 normal, in mat4 matrix ) {\n\n\t\t\t\t\t// matrix is assumed to be orthogonal\n\n\t\t\t\t\treturn normalize( ( vec4( normal, 0.0 ) * matrix ).xyz );\n\n\t\t\t\t}\n\n\t\t\t\t// source: https://graphics.stanford.edu/papers/envmap/envmap.pdf,\n\t\t\t\tvec3 shGetIrradianceAt( in vec3 normal, in vec3 shCoefficients[ 9 ] ) {\n\n\t\t\t\t\t// normal is assumed to have unit length,\n\n\t\t\t\t\tfloat x = normal.x, y = normal.y, z = normal.z;\n\n\t\t\t\t\t// band 0,\n\t\t\t\t\tvec3 result = shCoefficients[ 0 ] * 0.886227;\n\n\t\t\t\t\t// band 1,\n\t\t\t\t\tresult += shCoefficients[ 1 ] * 2.0 * 0.511664 * y;\n\t\t\t\t\tresult += shCoefficients[ 2 ] * 2.0 * 0.511664 * z;\n\t\t\t\t\tresult += shCoefficients[ 3 ] * 2.0 * 0.511664 * x;\n\n\t\t\t\t\t// band 2,\n\t\t\t\t\tresult += shCoefficients[ 4 ] * 2.0 * 0.429043 * x * y;\n\t\t\t\t\tresult += shCoefficients[ 5 ] * 2.0 * 0.429043 * y * z;\n\t\t\t\t\tresult += shCoefficients[ 6 ] * ( 0.743125 * z * z - 0.247708 );\n\t\t\t\t\tresult += shCoefficients[ 7 ] * 2.0 * 0.429043 * x * z;\n\t\t\t\t\tresult += shCoefficients[ 8 ] * 0.429043 * ( x * x - y * y );\n\t\t\t\t\treturn result;\n\n\t\t\t\t}\n\n\t\t\t\tuniform vec3 sh[ 9 ]; // sh coefficients\n\n\t\t\t\tuniform float intensity; // light probe intensity\n\n\t\t\t\tvarying vec3 vNormal;\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec3 normal = normalize( vNormal );\n\n\t\t\t\t\tvec3 worldNormal = inverseTransformDirection( normal, viewMatrix );\n\n\t\t\t\t\tvec3 irradiance = shGetIrradianceAt( worldNormal, sh );\n\n\t\t\t\t\tvec3 outgoingLight = RECIPROCAL_PI * irradiance * intensity;\n\n\t\t\t\t\tgl_FragColor = linearToOutputTexel( vec4( outgoingLight, 1.0 ) );\n\n\t\t\t\t}\n\n\t\t\t`,\n\n\t\t} );\n\n\t\tconst geometry = new SphereGeometry( 1, 32, 16 );\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * The light probe to visualize.\n\t\t *\n\t\t * @type {LightProbe}\n\t\t */\n\t\tthis.lightProbe = lightProbe;\n\n\t\t/**\n\t\t * The size of the helper.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.size = size;\n\t\tthis.type = 'LightProbeHelper';\n\n\t\tthis.onBeforeRender();\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n\tonBeforeRender() {\n\n\t\tthis.position.copy( this.lightProbe.position );\n\n\t\tthis.scale.set( 1, 1, 1 ).multiplyScalar( this.size );\n\n\t\tthis.material.uniforms.intensity.value = this.lightProbe.intensity;\n\n\t}\n\n}\n\nexport { LightProbeHelper };\n", "import {\n\tLineSegments,\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tLineBasicMaterial\n} from 'three';\n\n/**\n * A helper for visualizing an Octree.\n *\n * ```js\n * const helper = new OctreeHelper( octree );\n * scene.add( helper );\n * ```\n *\n * @augments LineSegments\n * @three_import import { OctreeHelper } from 'three/addons/helpers/OctreeHelper.js';\n */\nclass OctreeHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new Octree helper.\n\t *\n\t * @param {Octree} octree - The octree to visualize.\n\t * @param {number|Color|string} [color=0xffff00] - The helper's color.\n\t */\n\tconstructor( octree, color = 0xffff00 ) {\n\n\t\tsuper( new BufferGeometry(), new LineBasicMaterial( { color: color, toneMapped: false } ) );\n\n\t\t/**\n\t\t * The octree to visualize.\n\t\t *\n\t\t * @type {Octree}\n\t\t */\n\t\tthis.octree = octree;\n\n\t\t/**\n\t\t * The helper's color.\n\t\t *\n\t\t * @type {number|Color|string}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'OctreeHelper';\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Updates the helper. This method must be called whenever the Octree's\n\t * structure is changed.\n\t */\n\tupdate() {\n\n\t\tconst vertices = [];\n\n\t\tfunction traverse( tree ) {\n\n\t\t\tfor ( let i = 0; i < tree.length; i ++ ) {\n\n\t\t\t\tconst min = tree[ i ].box.min;\n\t\t\t\tconst max = tree[ i ].box.max;\n\n\t\t\t\tvertices.push( max.x, max.y, max.z ); vertices.push( min.x, max.y, max.z ); // 0, 1\n\t\t\t\tvertices.push( min.x, max.y, max.z ); vertices.push( min.x, min.y, max.z ); // 1, 2\n\t\t\t\tvertices.push( min.x, min.y, max.z ); vertices.push( max.x, min.y, max.z ); // 2, 3\n\t\t\t\tvertices.push( max.x, min.y, max.z ); vertices.push( max.x, max.y, max.z ); // 3, 0\n\n\t\t\t\tvertices.push( max.x, max.y, min.z ); vertices.push( min.x, max.y, min.z ); // 4, 5\n\t\t\t\tvertices.push( min.x, max.y, min.z ); vertices.push( min.x, min.y, min.z ); // 5, 6\n\t\t\t\tvertices.push( min.x, min.y, min.z ); vertices.push( max.x, min.y, min.z ); // 6, 7\n\t\t\t\tvertices.push( max.x, min.y, min.z ); vertices.push( max.x, max.y, min.z ); // 7, 4\n\n\t\t\t\tvertices.push( max.x, max.y, max.z ); vertices.push( max.x, max.y, min.z ); // 0, 4\n\t\t\t\tvertices.push( min.x, max.y, max.z ); vertices.push( min.x, max.y, min.z ); // 1, 5\n\t\t\t\tvertices.push( min.x, min.y, max.z ); vertices.push( min.x, min.y, min.z ); // 2, 6\n\t\t\t\tvertices.push( max.x, min.y, max.z ); vertices.push( max.x, min.y, min.z ); // 3, 7\n\n\t\t\t\ttraverse( tree[ i ].subTrees );\n\n\t\t\t}\n\n\t\t}\n\n\t\ttraverse( this.octree.subTrees );\n\n\t\tthis.geometry.dispose();\n\n\t\tthis.geometry = new BufferGeometry();\n\t\tthis.geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nexport { OctreeHelper };\n", "import {\n\tBufferGeometry,\n\tBufferAttribute,\n\tLineBasicMaterial,\n\tLine,\n\tMathUtils\n} from 'three';\n\n/**\n * This helper displays the directional cone of a positional audio.\n *\n * `PositionalAudioHelper` must be added as a child of the positional audio.\n *\n * ```js\n * const positionalAudio = new THREE.PositionalAudio( listener );\n * positionalAudio.setDirectionalCone( 180, 230, 0.1 );\n * scene.add( positionalAudio );\n *\n * const helper = new PositionalAudioHelper( positionalAudio );\n * positionalAudio.add( helper );\n * ```\n *\n * @augments Line\n * @three_import import { PositionalAudioHelper } from 'three/addons/helpers/PositionalAudioHelper.js';\n */\nclass PositionalAudioHelper extends Line {\n\n\t/**\n\t * Constructs a new positional audio helper.\n\t *\n\t * @param {PositionalAudio} audio - The audio to visualize.\n\t * @param {number} [range=1] - The range of the directional cone.\n\t * @param {number} [divisionsInnerAngle=16] - The number of divisions of the inner part of the directional cone.\n\t * @param {number} [divisionsOuterAngle=2] The number of divisions of the outer part of the directional cone.\n\t */\n\tconstructor( audio, range = 1, divisionsInnerAngle = 16, divisionsOuterAngle = 2 ) {\n\n\t\tconst geometry = new BufferGeometry();\n\t\tconst divisions = divisionsInnerAngle + divisionsOuterAngle * 2;\n\t\tconst positions = new Float32Array( ( divisions * 3 + 3 ) * 3 );\n\t\tgeometry.setAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\t\tconst materialInnerAngle = new LineBasicMaterial( { color: 0x00ff00 } );\n\t\tconst materialOuterAngle = new LineBasicMaterial( { color: 0xffff00 } );\n\n\t\tsuper( geometry, [ materialOuterAngle, materialInnerAngle ] );\n\n\t\t/**\n\t\t * The audio to visualize.\n\t\t *\n\t\t * @type {PositionalAudio}\n\t\t */\n\t\tthis.audio = audio;\n\n\t\t/**\n\t\t * The range of the directional cone.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.range = range;\n\n\t\t/**\n\t\t * The number of divisions of the inner part of the directional cone.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 16\n\t\t */\n\t\tthis.divisionsInnerAngle = divisionsInnerAngle;\n\n\t\t/**\n\t\t * The number of divisions of the outer part of the directional cone.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2\n\t\t */\n\t\tthis.divisionsOuterAngle = divisionsOuterAngle;\n\n\t\tthis.type = 'PositionalAudioHelper';\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Updates the helper. This method must be called whenever the directional cone\n\t * of the positional audio is changed.\n\t */\n\tupdate() {\n\n\t\tconst audio = this.audio;\n\t\tconst range = this.range;\n\t\tconst divisionsInnerAngle = this.divisionsInnerAngle;\n\t\tconst divisionsOuterAngle = this.divisionsOuterAngle;\n\n\t\tconst coneInnerAngle = MathUtils.degToRad( audio.panner.coneInnerAngle );\n\t\tconst coneOuterAngle = MathUtils.degToRad( audio.panner.coneOuterAngle );\n\n\t\tconst halfConeInnerAngle = coneInnerAngle / 2;\n\t\tconst halfConeOuterAngle = coneOuterAngle / 2;\n\n\t\tlet start = 0;\n\t\tlet count = 0;\n\t\tlet i;\n\t\tlet stride;\n\n\t\tconst geometry = this.geometry;\n\t\tconst positionAttribute = geometry.attributes.position;\n\n\t\tgeometry.clearGroups();\n\n\t\t//\n\n\t\tfunction generateSegment( from, to, divisions, materialIndex ) {\n\n\t\t\tconst step = ( to - from ) / divisions;\n\n\t\t\tpositionAttribute.setXYZ( start, 0, 0, 0 );\n\t\t\tcount ++;\n\n\t\t\tfor ( i = from; i < to; i += step ) {\n\n\t\t\t\tstride = start + count;\n\n\t\t\t\tpositionAttribute.setXYZ( stride, Math.sin( i ) * range, 0, Math.cos( i ) * range );\n\t\t\t\tpositionAttribute.setXYZ( stride + 1, Math.sin( Math.min( i + step, to ) ) * range, 0, Math.cos( Math.min( i + step, to ) ) * range );\n\t\t\t\tpositionAttribute.setXYZ( stride + 2, 0, 0, 0 );\n\n\t\t\t\tcount += 3;\n\n\t\t\t}\n\n\t\t\tgeometry.addGroup( start, count, materialIndex );\n\n\t\t\tstart += count;\n\t\t\tcount = 0;\n\n\t\t}\n\n\t\t//\n\n\t\tgenerateSegment( - halfConeOuterAngle, - halfConeInnerAngle, divisionsOuterAngle, 0 );\n\t\tgenerateSegment( - halfConeInnerAngle, halfConeInnerAngle, divisionsInnerAngle, 1 );\n\t\tgenerateSegment( halfConeInnerAngle, halfConeOuterAngle, divisionsOuterAngle, 0 );\n\n\t\t//\n\n\t\tpositionAttribute.needsUpdate = true;\n\n\t\tif ( coneInnerAngle === coneOuterAngle ) this.material[ 0 ].visible = false;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material[ 0 ].dispose();\n\t\tthis.material[ 1 ].dispose();\n\n\t}\n\n}\n\n\nexport { PositionalAudioHelper };\n", "import {\n\tBackSide,\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tLine,\n\tLineBasicMaterial,\n\tMesh,\n\tMeshBasicMaterial\n} from 'three';\n\n/**\n * Creates a visual aid for rect area lights.\n *\n * `RectAreaLightHelper` must be added as a child of the light.\n *\n * ```js\n * const light = new THREE.RectAreaLight( 0xffffbb, 1.0, 5, 5 );\n * const helper = new RectAreaLightHelper( light );\n * light.add( helper );\n * ```\n *\n * @augments Line\n * @three_import import { RectAreaLightHelper } from 'three/addons/helpers/RectAreaLightHelper.js';\n */\nclass RectAreaLightHelper extends Line {\n\n\t/**\n\t * Constructs a new rect area light helper.\n\t *\n\t * @param {RectAreaLight} light - The light to visualize.\n\t * @param {number|Color|string} [color] - The helper's color.\n\t * If this is not the set, the helper will take the color of the light.\n\t */\n\tconstructor( light, color ) {\n\n\t\tconst positions = [ 1, 1, 0, - 1, 1, 0, - 1, - 1, 0, 1, - 1, 0, 1, 1, 0 ];\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\t\tgeometry.computeBoundingSphere();\n\n\t\tconst material = new LineBasicMaterial( { fog: false } );\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * The light to visualize.\n\t\t *\n\t\t * @type {RectAreaLight}\n\t\t */\n\t\tthis.light = light;\n\n\t\t/**\n\t\t * The helper's color. If `undefined`, the helper will take the color of the light.\n\t\t *\n\t\t * @type {number|Color|string|undefined}\n\t\t */\n\t\tthis.color = color;\n\n\t\tthis.type = 'RectAreaLightHelper';\n\n\t\t//\n\n\t\tconst positions2 = [ 1, 1, 0, - 1, 1, 0, - 1, - 1, 0, 1, 1, 0, - 1, - 1, 0, 1, - 1, 0 ];\n\n\t\tconst geometry2 = new BufferGeometry();\n\t\tgeometry2.setAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );\n\t\tgeometry2.computeBoundingSphere();\n\n\t\tthis.add( new Mesh( geometry2, new MeshBasicMaterial( { side: BackSide, fog: false } ) ) );\n\n\t}\n\n\tupdateMatrixWorld() {\n\n\t\tthis.scale.set( 0.5 * this.light.width, 0.5 * this.light.height, 1 );\n\n\t\tif ( this.color !== undefined ) {\n\n\t\t\tthis.material.color.set( this.color );\n\t\t\tthis.children[ 0 ].material.color.set( this.color );\n\n\t\t} else {\n\n\t\t\tthis.material.color.copy( this.light.color ).multiplyScalar( this.light.intensity );\n\n\t\t\t// prevent hue shift\n\t\t\tconst c = this.material.color;\n\t\t\tconst max = Math.max( c.r, c.g, c.b );\n\t\t\tif ( max > 1 ) c.multiplyScalar( 1 / max );\n\n\t\t\tthis.children[ 0 ].material.color.copy( this.material.color );\n\n\t\t}\n\n\t\t// ignore world scale on light\n\t\tthis.matrixWorld.extractRotation( this.light.matrixWorld ).scale( this.scale ).copyPosition( this.light.matrixWorld );\n\n\t\tthis.children[ 0 ].matrixWorld.copy( this.matrixWorld );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\t\tthis.children[ 0 ].geometry.dispose();\n\t\tthis.children[ 0 ].material.dispose();\n\n\t}\n\n}\n\nexport { RectAreaLightHelper };\n", "import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tInstancedBufferAttribute,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tTrianglesDrawMode,\n\tVector3,\n} from 'three';\n\n/**\n * @module BufferGeometryUtils\n * @three_import import * as BufferGeometryUtils from 'three/addons/utils/BufferGeometryUtils.js';\n */\n\n/**\n * Computes vertex tangents using the MikkTSpace algorithm. MikkTSpace generates the same tangents consistently,\n * and is used in most modelling tools and normal map bakers. Use MikkTSpace for materials with normal maps,\n * because inconsistent tangents may lead to subtle visual issues in the normal map, particularly around mirrored\n * UV seams.\n *\n * In comparison to this method, {@link BufferGeometry#computeTangents} (a custom algorithm) generates tangents that\n * probably will not match the tangents in other software. The custom algorithm is sufficient for general use with a\n * custom material, and may be faster than MikkTSpace.\n *\n * Returns the original BufferGeometry. Indexed geometries will be de-indexed. Requires position, normal, and uv attributes.\n *\n * @param {BufferGeometry} geometry - The geometry to compute tangents for.\n * @param {Object} MikkTSpace - Instance of `examples/jsm/libs/mikktspace.module.js`, or `mikktspace` npm package.\n * Await `MikkTSpace.ready` before use.\n * @param {boolean} [negateSign=true] - Whether to negate the sign component (.w) of each tangent.\n * Required for normal map conventions in some formats, including glTF.\n * @return {BufferGeometry} The updated geometry.\n */\nfunction computeMikkTSpaceTangents( geometry, MikkTSpace, negateSign = true ) {\n\n\tif ( ! MikkTSpace || ! MikkTSpace.isReady ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Initialized MikkTSpace library required.' );\n\n\t}\n\n\tif ( ! geometry.hasAttribute( 'position' ) || ! geometry.hasAttribute( 'normal' ) || ! geometry.hasAttribute( 'uv' ) ) {\n\n\t\tthrow new Error( 'BufferGeometryUtils: Tangents require \"position\", \"normal\", and \"uv\" attributes.' );\n\n\t}\n\n\tfunction getAttributeArray( attribute ) {\n\n\t\tif ( attribute.normalized || attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconst dstArray = new Float32Array( attribute.count * attribute.itemSize );\n\n\t\t\tfor ( let i = 0, j = 0; i < attribute.count; i ++ ) {\n\n\t\t\t\tdstArray[ j ++ ] = attribute.getX( i );\n\t\t\t\tdstArray[ j ++ ] = attribute.getY( i );\n\n\t\t\t\tif ( attribute.itemSize > 2 ) {\n\n\t\t\t\t\tdstArray[ j ++ ] = attribute.getZ( i );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn dstArray;\n\n\t\t}\n\n\t\tif ( attribute.array instanceof Float32Array ) {\n\n\t\t\treturn attribute.array;\n\n\t\t}\n\n\t\treturn new Float32Array( attribute.array );\n\n\t}\n\n\t// MikkTSpace algorithm requires non-indexed input.\n\n\tconst _geometry = geometry.index ? geometry.toNonIndexed() : geometry;\n\n\t// Compute vertex tangents.\n\n\tconst tangents = MikkTSpace.generateTangents(\n\n\t\tgetAttributeArray( _geometry.attributes.position ),\n\t\tgetAttributeArray( _geometry.attributes.normal ),\n\t\tgetAttributeArray( _geometry.attributes.uv )\n\n\t);\n\n\t// Texture coordinate convention of glTF differs from the apparent\n\t// default of the MikkTSpace library; .w component must be flipped.\n\n\tif ( negateSign ) {\n\n\t\tfor ( let i = 3; i < tangents.length; i += 4 ) {\n\n\t\t\ttangents[ i ] *= - 1;\n\n\t\t}\n\n\t}\n\n\t//\n\n\t_geometry.setAttribute( 'tangent', new BufferAttribute( tangents, 4 ) );\n\n\tif ( geometry !== _geometry ) {\n\n\t\tgeometry.copy( _geometry );\n\n\t}\n\n\treturn geometry;\n\n}\n\n/**\n * Merges a set of geometries into a single instance. All geometries must have compatible attributes.\n *\n * @param {Array<BufferGeometry>} geometries - The geometries to merge.\n * @param {boolean} [useGroups=false] - Whether to use groups or not.\n * @return {?BufferGeometry} The merged geometry. Returns `null` if the merge does not succeed.\n */\nfunction mergeGeometries( geometries, useGroups = false ) {\n\n\tconst isIndexed = geometries[ 0 ].index !== null;\n\n\tconst attributesUsed = new Set( Object.keys( geometries[ 0 ].attributes ) );\n\tconst morphAttributesUsed = new Set( Object.keys( geometries[ 0 ].morphAttributes ) );\n\n\tconst attributes = {};\n\tconst morphAttributes = {};\n\n\tconst morphTargetsRelative = geometries[ 0 ].morphTargetsRelative;\n\n\tconst mergedGeometry = new BufferGeometry();\n\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\tconst geometry = geometries[ i ];\n\t\tlet attributesCount = 0;\n\n\t\t// ensure that all geometries are indexed, or none\n\n\t\tif ( isIndexed !== ( geometry.index !== null ) ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather attributes, exit early if they're different\n\n\t\tfor ( const name in geometry.attributes ) {\n\n\t\t\tif ( ! attributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. All geometries must have compatible attributes; make sure \"' + name + '\" attribute exists among all geometries, or in none of them.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( attributes[ name ] === undefined ) attributes[ name ] = [];\n\n\t\t\tattributes[ name ].push( geometry.attributes[ name ] );\n\n\t\t\tattributesCount ++;\n\n\t\t}\n\n\t\t// ensure geometries have the same number of attributes\n\n\t\tif ( attributesCount !== attributesUsed.size ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. Make sure all geometries have the same number of attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// gather morph attributes, exit early if they're different\n\n\t\tif ( morphTargetsRelative !== geometry.morphTargetsRelative ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. .morphTargetsRelative must be consistent throughout all geometries.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tfor ( const name in geometry.morphAttributes ) {\n\n\t\t\tif ( ! morphAttributesUsed.has( name ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '.  .morphAttributes must be consistent throughout all geometries.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tif ( morphAttributes[ name ] === undefined ) morphAttributes[ name ] = [];\n\n\t\t\tmorphAttributes[ name ].push( geometry.morphAttributes[ name ] );\n\n\t\t}\n\n\t\tif ( useGroups ) {\n\n\t\t\tlet count;\n\n\t\t\tif ( isIndexed ) {\n\n\t\t\t\tcount = geometry.index.count;\n\n\t\t\t} else if ( geometry.attributes.position !== undefined ) {\n\n\t\t\t\tcount = geometry.attributes.position.count;\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index ' + i + '. The geometry must have either an index or a position attribute' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.addGroup( offset, count, i );\n\n\t\t\toffset += count;\n\n\t\t}\n\n\t}\n\n\t// merge indices\n\n\tif ( isIndexed ) {\n\n\t\tlet indexOffset = 0;\n\t\tconst mergedIndex = [];\n\n\t\tfor ( let i = 0; i < geometries.length; ++ i ) {\n\n\t\t\tconst index = geometries[ i ].index;\n\n\t\t\tfor ( let j = 0; j < index.count; ++ j ) {\n\n\t\t\t\tmergedIndex.push( index.getX( j ) + indexOffset );\n\n\t\t\t}\n\n\t\t\tindexOffset += geometries[ i ].attributes.position.count;\n\n\t\t}\n\n\t\tmergedGeometry.setIndex( mergedIndex );\n\n\t}\n\n\t// merge attributes\n\n\tfor ( const name in attributes ) {\n\n\t\tconst mergedAttribute = mergeAttributes( attributes[ name ] );\n\n\t\tif ( ! mergedAttribute ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' attribute.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tmergedGeometry.setAttribute( name, mergedAttribute );\n\n\t}\n\n\t// merge morph attributes\n\n\tfor ( const name in morphAttributes ) {\n\n\t\tconst numMorphTargets = morphAttributes[ name ][ 0 ].length;\n\n\t\tif ( numMorphTargets === 0 ) break;\n\n\t\tmergedGeometry.morphAttributes = mergedGeometry.morphAttributes || {};\n\t\tmergedGeometry.morphAttributes[ name ] = [];\n\n\t\tfor ( let i = 0; i < numMorphTargets; ++ i ) {\n\n\t\t\tconst morphAttributesToMerge = [];\n\n\t\t\tfor ( let j = 0; j < morphAttributes[ name ].length; ++ j ) {\n\n\t\t\t\tmorphAttributesToMerge.push( morphAttributes[ name ][ j ][ i ] );\n\n\t\t\t}\n\n\t\t\tconst mergedMorphAttribute = mergeAttributes( morphAttributesToMerge );\n\n\t\t\tif ( ! mergedMorphAttribute ) {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the ' + name + ' morphAttribute.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tmergedGeometry.morphAttributes[ name ].push( mergedMorphAttribute );\n\n\t\t}\n\n\t}\n\n\treturn mergedGeometry;\n\n}\n\n/**\n * Merges a set of attributes into a single instance. All attributes must have compatible properties and types.\n * Instances of {@link InterleavedBufferAttribute} are not supported.\n *\n * @param {Array<BufferAttribute>} attributes - The attributes to merge.\n * @return {?BufferAttribute} The merged attribute. Returns `null` if the merge does not succeed.\n */\nfunction mergeAttributes( attributes ) {\n\n\tlet TypedArray;\n\tlet itemSize;\n\tlet normalized;\n\tlet gpuType = - 1;\n\tlet arrayLength = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( itemSize === undefined ) itemSize = attribute.itemSize;\n\t\tif ( itemSize !== attribute.itemSize ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( normalized === undefined ) normalized = attribute.normalized;\n\t\tif ( normalized !== attribute.normalized ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( gpuType === - 1 ) gpuType = attribute.gpuType;\n\t\tif ( gpuType !== attribute.gpuType ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.gpuType must be consistent across matching attributes.' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.count * itemSize;\n\n\t}\n\n\tconst array = new TypedArray( arrayLength );\n\tconst result = new BufferAttribute( array, itemSize, normalized );\n\tlet offset = 0;\n\n\tfor ( let i = 0; i < attributes.length; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tconst tupleOffset = offset / itemSize;\n\t\t\tfor ( let j = 0, l = attribute.count; j < l; j ++ ) {\n\n\t\t\t\tfor ( let c = 0; c < itemSize; c ++ ) {\n\n\t\t\t\t\tconst value = attribute.getComponent( j, c );\n\t\t\t\t\tresult.setComponent( j + tupleOffset, c, value );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tarray.set( attribute.array, offset );\n\n\t\t}\n\n\t\toffset += attribute.count * itemSize;\n\n\t}\n\n\tif ( gpuType !== undefined ) {\n\n\t\tresult.gpuType = gpuType;\n\n\t}\n\n\treturn result;\n\n}\n\n/**\n * Performs a deep clone of the given buffer attribute.\n *\n * @param {BufferAttribute} attribute - The attribute to clone.\n * @return {BufferAttribute} The cloned attribute.\n */\nfunction deepCloneAttribute( attribute ) {\n\n\tif ( attribute.isInstancedInterleavedBufferAttribute || attribute.isInterleavedBufferAttribute ) {\n\n\t\treturn deinterleaveAttribute( attribute );\n\n\t}\n\n\tif ( attribute.isInstancedBufferAttribute ) {\n\n\t\treturn new InstancedBufferAttribute().copy( attribute );\n\n\t}\n\n\treturn new BufferAttribute().copy( attribute );\n\n}\n\n/**\n * Interleaves a set of attributes and returns a new array of corresponding attributes that share a\n * single {@link InterleavedBuffer} instance. All attributes must have compatible types.\n *\n * @param {Array<BufferAttribute>} attributes - The attributes to interleave.\n * @return {?Array<InterleavedBufferAttribute>} An array of interleaved attributes. If interleave does not succeed, the method returns `null`.\n */\nfunction interleaveAttributes( attributes ) {\n\n\t// Interleaves the provided attributes into an InterleavedBuffer and returns\n\t// a set of InterleavedBufferAttributes for each attribute\n\tlet TypedArray;\n\tlet arrayLength = 0;\n\tlet stride = 0;\n\n\t// calculate the length and type of the interleavedBuffer\n\tfor ( let i = 0, l = attributes.length; i < l; ++ i ) {\n\n\t\tconst attribute = attributes[ i ];\n\n\t\tif ( TypedArray === undefined ) TypedArray = attribute.array.constructor;\n\t\tif ( TypedArray !== attribute.array.constructor ) {\n\n\t\t\tconsole.error( 'AttributeBuffers of different types cannot be interleaved' );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tarrayLength += attribute.array.length;\n\t\tstride += attribute.itemSize;\n\n\t}\n\n\t// Create the set of buffer attributes\n\tconst interleavedBuffer = new InterleavedBuffer( new TypedArray( arrayLength ), stride );\n\tlet offset = 0;\n\tconst res = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\tfor ( let j = 0, l = attributes.length; j < l; j ++ ) {\n\n\t\tconst attribute = attributes[ j ];\n\t\tconst itemSize = attribute.itemSize;\n\t\tconst count = attribute.count;\n\t\tconst iba = new InterleavedBufferAttribute( interleavedBuffer, itemSize, offset, attribute.normalized );\n\t\tres.push( iba );\n\n\t\toffset += itemSize;\n\n\t\t// Move the data for each attribute into the new interleavedBuffer\n\t\t// at the appropriate offset\n\t\tfor ( let c = 0; c < count; c ++ ) {\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\tiba[ setters[ k ] ]( c, attribute[ getters[ k ] ]( c ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn res;\n\n}\n\n/**\n * Returns a new, non-interleaved version of the given attribute.\n *\n * @param {InterleavedBufferAttribute} attribute - The interleaved attribute.\n * @return {BufferAttribute} The non-interleaved attribute.\n */\nfunction deinterleaveAttribute( attribute ) {\n\n\tconst cons = attribute.data.array.constructor;\n\tconst count = attribute.count;\n\tconst itemSize = attribute.itemSize;\n\tconst normalized = attribute.normalized;\n\n\tconst array = new cons( count * itemSize );\n\tlet newAttribute;\n\tif ( attribute.isInstancedInterleavedBufferAttribute ) {\n\n\t\tnewAttribute = new InstancedBufferAttribute( array, itemSize, normalized, attribute.meshPerAttribute );\n\n\t} else {\n\n\t\tnewAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t}\n\n\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\tnewAttribute.setX( i, attribute.getX( i ) );\n\n\t\tif ( itemSize >= 2 ) {\n\n\t\t\tnewAttribute.setY( i, attribute.getY( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 3 ) {\n\n\t\t\tnewAttribute.setZ( i, attribute.getZ( i ) );\n\n\t\t}\n\n\t\tif ( itemSize >= 4 ) {\n\n\t\t\tnewAttribute.setW( i, attribute.getW( i ) );\n\n\t\t}\n\n\t}\n\n\treturn newAttribute;\n\n}\n\n/**\n * Deinterleaves all attributes on the given geometry.\n *\n * @param {BufferGeometry} geometry - The geometry to deinterleave.\n */\nfunction deinterleaveGeometry( geometry ) {\n\n\tconst attributes = geometry.attributes;\n\tconst morphTargets = geometry.morphTargets;\n\tconst attrMap = new Map();\n\n\tfor ( const key in attributes ) {\n\n\t\tconst attr = attributes[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tattributes[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n\tfor ( const key in morphTargets ) {\n\n\t\tconst attr = morphTargets[ key ];\n\t\tif ( attr.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( ! attrMap.has( attr ) ) {\n\n\t\t\t\tattrMap.set( attr, deinterleaveAttribute( attr ) );\n\n\t\t\t}\n\n\t\t\tmorphTargets[ key ] = attrMap.get( attr );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Returns the amount of bytes used by all attributes to represent the geometry.\n *\n * @param {BufferGeometry} geometry - The geometry.\n * @return {number} The estimate bytes used.\n */\nfunction estimateBytesUsed( geometry ) {\n\n\t// Return the estimated memory used by this geometry in bytes\n\t// Calculate using itemSize, count, and BYTES_PER_ELEMENT to account\n\t// for InterleavedBufferAttributes.\n\tlet mem = 0;\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst attr = geometry.getAttribute( name );\n\t\tmem += attr.count * attr.itemSize * attr.array.BYTES_PER_ELEMENT;\n\n\t}\n\n\tconst indices = geometry.getIndex();\n\tmem += indices ? indices.count * indices.itemSize * indices.array.BYTES_PER_ELEMENT : 0;\n\treturn mem;\n\n}\n\n/**\n * Returns a new geometry with vertices for which all similar vertex attributes (within tolerance) are merged.\n *\n * @param {BufferGeometry} geometry - The geometry to merge vertices for.\n * @param {number} [tolerance=1e-4] - The tolerance value.\n * @return {BufferGeometry} - The new geometry with merged vertices.\n */\nfunction mergeVertices( geometry, tolerance = 1e-4 ) {\n\n\ttolerance = Math.max( tolerance, Number.EPSILON );\n\n\t// Generate an index buffer if the geometry doesn't have one, or optimize it\n\t// if it's already available.\n\tconst hashToIndex = {};\n\tconst indices = geometry.getIndex();\n\tconst positions = geometry.getAttribute( 'position' );\n\tconst vertexCount = indices ? indices.count : positions.count;\n\n\t// next value for triangle indices\n\tlet nextIndex = 0;\n\n\t// attributes and new attribute arrays\n\tconst attributeNames = Object.keys( geometry.attributes );\n\tconst tmpAttributes = {};\n\tconst tmpMorphAttributes = {};\n\tconst newIndices = [];\n\tconst getters = [ 'getX', 'getY', 'getZ', 'getW' ];\n\tconst setters = [ 'setX', 'setY', 'setZ', 'setW' ];\n\n\t// Initialize the arrays, allocating space conservatively. Extra\n\t// space will be trimmed in the last step.\n\tfor ( let i = 0, l = attributeNames.length; i < l; i ++ ) {\n\n\t\tconst name = attributeNames[ i ];\n\t\tconst attr = geometry.attributes[ name ];\n\n\t\ttmpAttributes[ name ] = new attr.constructor(\n\t\t\tnew attr.array.constructor( attr.count * attr.itemSize ),\n\t\t\tattr.itemSize,\n\t\t\tattr.normalized\n\t\t);\n\n\t\tconst morphAttributes = geometry.morphAttributes[ name ];\n\t\tif ( morphAttributes ) {\n\n\t\t\tif ( ! tmpMorphAttributes[ name ] ) tmpMorphAttributes[ name ] = [];\n\t\t\tmorphAttributes.forEach( ( morphAttr, i ) => {\n\n\t\t\t\tconst array = new morphAttr.array.constructor( morphAttr.count * morphAttr.itemSize );\n\t\t\t\ttmpMorphAttributes[ name ][ i ] = new morphAttr.constructor( array, morphAttr.itemSize, morphAttr.normalized );\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\t// convert the error tolerance to an amount of decimal places to truncate to\n\tconst halfTolerance = tolerance * 0.5;\n\tconst exponent = Math.log10( 1 / tolerance );\n\tconst hashMultiplier = Math.pow( 10, exponent );\n\tconst hashAdditive = halfTolerance * hashMultiplier;\n\tfor ( let i = 0; i < vertexCount; i ++ ) {\n\n\t\tconst index = indices ? indices.getX( i ) : i;\n\n\t\t// Generate a hash for the vertex attributes at the current index 'i'\n\t\tlet hash = '';\n\t\tfor ( let j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n\t\t\tconst name = attributeNames[ j ];\n\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\tconst itemSize = attribute.itemSize;\n\n\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t// double tilde truncates the decimal value\n\t\t\t\thash += `${ ~ ~ ( attribute[ getters[ k ] ]( index ) * hashMultiplier + hashAdditive ) },`;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Add another reference to the vertex if it's already\n\t\t// used by another index\n\t\tif ( hash in hashToIndex ) {\n\n\t\t\tnewIndices.push( hashToIndex[ hash ] );\n\n\t\t} else {\n\n\t\t\t// copy data to the new index in the temporary attributes\n\t\t\tfor ( let j = 0, l = attributeNames.length; j < l; j ++ ) {\n\n\t\t\t\tconst name = attributeNames[ j ];\n\t\t\t\tconst attribute = geometry.getAttribute( name );\n\t\t\t\tconst morphAttributes = geometry.morphAttributes[ name ];\n\t\t\t\tconst itemSize = attribute.itemSize;\n\t\t\t\tconst newArray = tmpAttributes[ name ];\n\t\t\t\tconst newMorphArrays = tmpMorphAttributes[ name ];\n\n\t\t\t\tfor ( let k = 0; k < itemSize; k ++ ) {\n\n\t\t\t\t\tconst getterFunc = getters[ k ];\n\t\t\t\t\tconst setterFunc = setters[ k ];\n\t\t\t\t\tnewArray[ setterFunc ]( nextIndex, attribute[ getterFunc ]( index ) );\n\n\t\t\t\t\tif ( morphAttributes ) {\n\n\t\t\t\t\t\tfor ( let m = 0, ml = morphAttributes.length; m < ml; m ++ ) {\n\n\t\t\t\t\t\t\tnewMorphArrays[ m ][ setterFunc ]( nextIndex, morphAttributes[ m ][ getterFunc ]( index ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\thashToIndex[ hash ] = nextIndex;\n\t\t\tnewIndices.push( nextIndex );\n\t\t\tnextIndex ++;\n\n\t\t}\n\n\t}\n\n\t// generate result BufferGeometry\n\tconst result = geometry.clone();\n\tfor ( const name in geometry.attributes ) {\n\n\t\tconst tmpAttribute = tmpAttributes[ name ];\n\n\t\tresult.setAttribute( name, new tmpAttribute.constructor(\n\t\t\ttmpAttribute.array.slice( 0, nextIndex * tmpAttribute.itemSize ),\n\t\t\ttmpAttribute.itemSize,\n\t\t\ttmpAttribute.normalized,\n\t\t) );\n\n\t\tif ( ! ( name in tmpMorphAttributes ) ) continue;\n\n\t\tfor ( let j = 0; j < tmpMorphAttributes[ name ].length; j ++ ) {\n\n\t\t\tconst tmpMorphAttribute = tmpMorphAttributes[ name ][ j ];\n\n\t\t\tresult.morphAttributes[ name ][ j ] = new tmpMorphAttribute.constructor(\n\t\t\t\ttmpMorphAttribute.array.slice( 0, nextIndex * tmpMorphAttribute.itemSize ),\n\t\t\t\ttmpMorphAttribute.itemSize,\n\t\t\t\ttmpMorphAttribute.normalized,\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\t// indices\n\n\tresult.setIndex( newIndices );\n\n\treturn result;\n\n}\n\n/**\n * Returns a new indexed geometry based on `TrianglesDrawMode` draw mode.\n * This mode corresponds to the `gl.TRIANGLES` primitive in WebGL.\n *\n * @param {BufferGeometry} geometry - The geometry to convert.\n * @param {number} drawMode - The current draw mode.\n * @return {BufferGeometry} The new geometry using `TrianglesDrawMode`.\n */\nfunction toTrianglesDrawMode( geometry, drawMode ) {\n\n\tif ( drawMode === TrianglesDrawMode ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles.' );\n\t\treturn geometry;\n\n\t}\n\n\tif ( drawMode === TriangleFanDrawMode || drawMode === TriangleStripDrawMode ) {\n\n\t\tlet index = geometry.getIndex();\n\n\t\t// generate index if not present\n\n\t\tif ( index === null ) {\n\n\t\t\tconst indices = [];\n\n\t\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tfor ( let i = 0; i < position.count; i ++ ) {\n\n\t\t\t\t\tindices.push( i );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setIndex( indices );\n\t\t\t\tindex = geometry.getIndex();\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible.' );\n\t\t\t\treturn geometry;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst numberOfTriangles = index.count - 2;\n\t\tconst newIndices = [];\n\n\t\tif ( drawMode === TriangleFanDrawMode ) {\n\n\t\t\t// gl.TRIANGLE_FAN\n\n\t\t\tfor ( let i = 1; i <= numberOfTriangles; i ++ ) {\n\n\t\t\t\tnewIndices.push( index.getX( 0 ) );\n\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// gl.TRIANGLE_STRIP\n\n\t\t\tfor ( let i = 0; i < numberOfTriangles; i ++ ) {\n\n\t\t\t\tif ( i % 2 === 0 ) {\n\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnewIndices.push( index.getX( i + 2 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i + 1 ) );\n\t\t\t\t\tnewIndices.push( index.getX( i ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( ( newIndices.length / 3 ) !== numberOfTriangles ) {\n\n\t\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.' );\n\n\t\t}\n\n\t\t// build final geometry\n\n\t\tconst newGeometry = geometry.clone();\n\t\tnewGeometry.setIndex( newIndices );\n\t\tnewGeometry.clearGroups();\n\n\t\treturn newGeometry;\n\n\t} else {\n\n\t\tconsole.error( 'THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:', drawMode );\n\t\treturn geometry;\n\n\t}\n\n}\n\n/**\n * Calculates the morphed attributes of a morphed/skinned BufferGeometry.\n *\n * Helpful for Raytracing or Decals (i.e. a `DecalGeometry` applied to a morphed Object with a `BufferGeometry`\n * will use the original `BufferGeometry`, not the morphed/skinned one, generating an incorrect result.\n * Using this function to create a shadow `Object3`D the `DecalGeometry` can be correctly generated).\n *\n * @param {Mesh|Line|Points} object - The 3D object to compute morph attributes for.\n * @return {Object} An object with original position/normal attributes and morphed ones.\n */\nfunction computeMorphedAttributes( object ) {\n\n\tconst _vA = new Vector3();\n\tconst _vB = new Vector3();\n\tconst _vC = new Vector3();\n\n\tconst _tempA = new Vector3();\n\tconst _tempB = new Vector3();\n\tconst _tempC = new Vector3();\n\n\tconst _morphA = new Vector3();\n\tconst _morphB = new Vector3();\n\tconst _morphC = new Vector3();\n\n\tfunction _calculateMorphedAttributeData(\n\t\tobject,\n\t\tattribute,\n\t\tmorphAttribute,\n\t\tmorphTargetsRelative,\n\t\ta,\n\t\tb,\n\t\tc,\n\t\tmodifiedAttributeArray\n\t) {\n\n\t\t_vA.fromBufferAttribute( attribute, a );\n\t\t_vB.fromBufferAttribute( attribute, b );\n\t\t_vC.fromBufferAttribute( attribute, c );\n\n\t\tconst morphInfluences = object.morphTargetInfluences;\n\n\t\tif ( morphAttribute && morphInfluences ) {\n\n\t\t\t_morphA.set( 0, 0, 0 );\n\t\t\t_morphB.set( 0, 0, 0 );\n\t\t\t_morphC.set( 0, 0, 0 );\n\n\t\t\tfor ( let i = 0, il = morphAttribute.length; i < il; i ++ ) {\n\n\t\t\t\tconst influence = morphInfluences[ i ];\n\t\t\t\tconst morph = morphAttribute[ i ];\n\n\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t_tempA.fromBufferAttribute( morph, a );\n\t\t\t\t_tempB.fromBufferAttribute( morph, b );\n\t\t\t\t_tempC.fromBufferAttribute( morph, c );\n\n\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA, influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB, influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC, influence );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_morphA.addScaledVector( _tempA.sub( _vA ), influence );\n\t\t\t\t\t_morphB.addScaledVector( _tempB.sub( _vB ), influence );\n\t\t\t\t\t_morphC.addScaledVector( _tempC.sub( _vC ), influence );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t_vA.add( _morphA );\n\t\t\t_vB.add( _morphB );\n\t\t\t_vC.add( _morphC );\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\tobject.applyBoneTransform( a, _vA );\n\t\t\tobject.applyBoneTransform( b, _vB );\n\t\t\tobject.applyBoneTransform( c, _vC );\n\n\t\t}\n\n\t\tmodifiedAttributeArray[ a * 3 + 0 ] = _vA.x;\n\t\tmodifiedAttributeArray[ a * 3 + 1 ] = _vA.y;\n\t\tmodifiedAttributeArray[ a * 3 + 2 ] = _vA.z;\n\t\tmodifiedAttributeArray[ b * 3 + 0 ] = _vB.x;\n\t\tmodifiedAttributeArray[ b * 3 + 1 ] = _vB.y;\n\t\tmodifiedAttributeArray[ b * 3 + 2 ] = _vB.z;\n\t\tmodifiedAttributeArray[ c * 3 + 0 ] = _vC.x;\n\t\tmodifiedAttributeArray[ c * 3 + 1 ] = _vC.y;\n\t\tmodifiedAttributeArray[ c * 3 + 2 ] = _vC.z;\n\n\t}\n\n\tconst geometry = object.geometry;\n\tconst material = object.material;\n\n\tlet a, b, c;\n\tconst index = geometry.index;\n\tconst positionAttribute = geometry.attributes.position;\n\tconst morphPosition = geometry.morphAttributes.position;\n\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\tconst normalAttribute = geometry.attributes.normal;\n\tconst morphNormal = geometry.morphAttributes.position;\n\n\tconst groups = geometry.groups;\n\tconst drawRange = geometry.drawRange;\n\tlet i, j, il, jl;\n\tlet group;\n\tlet start, end;\n\n\tconst modifiedPosition = new Float32Array( positionAttribute.count * positionAttribute.itemSize );\n\tconst modifiedNormal = new Float32Array( normalAttribute.count * normalAttribute.itemSize );\n\n\tif ( index !== null ) {\n\n\t\t// indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = index.getX( j );\n\t\t\t\t\tb = index.getX( j + 1 );\n\t\t\t\t\tc = index.getX( j + 2 );\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( index.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = index.getX( i );\n\t\t\t\tb = index.getX( i + 1 );\n\t\t\t\tc = index.getX( i + 2 );\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t} else {\n\n\t\t// non-indexed buffer geometry\n\n\t\tif ( Array.isArray( material ) ) {\n\n\t\t\tfor ( i = 0, il = groups.length; i < il; i ++ ) {\n\n\t\t\t\tgroup = groups[ i ];\n\n\t\t\t\tstart = Math.max( group.start, drawRange.start );\n\t\t\t\tend = Math.min( ( group.start + group.count ), ( drawRange.start + drawRange.count ) );\n\n\t\t\t\tfor ( j = start, jl = end; j < jl; j += 3 ) {\n\n\t\t\t\t\ta = j;\n\t\t\t\t\tb = j + 1;\n\t\t\t\t\tc = j + 2;\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tpositionAttribute,\n\t\t\t\t\t\tmorphPosition,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedPosition\n\t\t\t\t\t);\n\n\t\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tnormalAttribute,\n\t\t\t\t\t\tmorphNormal,\n\t\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\t\ta, b, c,\n\t\t\t\t\t\tmodifiedNormal\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tstart = Math.max( 0, drawRange.start );\n\t\t\tend = Math.min( positionAttribute.count, ( drawRange.start + drawRange.count ) );\n\n\t\t\tfor ( i = start, il = end; i < il; i += 3 ) {\n\n\t\t\t\ta = i;\n\t\t\t\tb = i + 1;\n\t\t\t\tc = i + 2;\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tpositionAttribute,\n\t\t\t\t\tmorphPosition,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedPosition\n\t\t\t\t);\n\n\t\t\t\t_calculateMorphedAttributeData(\n\t\t\t\t\tobject,\n\t\t\t\t\tnormalAttribute,\n\t\t\t\t\tmorphNormal,\n\t\t\t\t\tmorphTargetsRelative,\n\t\t\t\t\ta, b, c,\n\t\t\t\t\tmodifiedNormal\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tconst morphedPositionAttribute = new Float32BufferAttribute( modifiedPosition, 3 );\n\tconst morphedNormalAttribute = new Float32BufferAttribute( modifiedNormal, 3 );\n\n\treturn {\n\n\t\tpositionAttribute: positionAttribute,\n\t\tnormalAttribute: normalAttribute,\n\t\tmorphedPositionAttribute: morphedPositionAttribute,\n\t\tmorphedNormalAttribute: morphedNormalAttribute\n\n\t};\n\n}\n\n/**\n * Merges the {@link BufferGeometry#groups} for the given geometry.\n *\n * @param {BufferGeometry} geometry - The geometry to modify.\n * @return {BufferGeometry} - The updated geometry\n */\nfunction mergeGroups( geometry ) {\n\n\tif ( geometry.groups.length === 0 ) {\n\n\t\tconsole.warn( 'THREE.BufferGeometryUtils.mergeGroups(): No groups are defined. Nothing to merge.' );\n\t\treturn geometry;\n\n\t}\n\n\tlet groups = geometry.groups;\n\n\t// sort groups by material index\n\n\tgroups = groups.sort( ( a, b ) => {\n\n\t\tif ( a.materialIndex !== b.materialIndex ) return a.materialIndex - b.materialIndex;\n\n\t\treturn a.start - b.start;\n\n\t} );\n\n\t// create index for non-indexed geometries\n\n\tif ( geometry.getIndex() === null ) {\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\t\tconst indices = [];\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i += 3 ) {\n\n\t\t\tindices.push( i, i + 1, i + 2 );\n\n\t\t}\n\n\t\tgeometry.setIndex( indices );\n\n\t}\n\n\t// sort index\n\n\tconst index = geometry.getIndex();\n\n\tconst newIndices = [];\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tconst groupStart = group.start;\n\t\tconst groupLength = groupStart + group.count;\n\n\t\tfor ( let j = groupStart; j < groupLength; j ++ ) {\n\n\t\t\tnewIndices.push( index.getX( j ) );\n\n\t\t}\n\n\t}\n\n\tgeometry.dispose(); // Required to force buffer recreation\n\tgeometry.setIndex( newIndices );\n\n\t// update groups indices\n\n\tlet start = 0;\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tgroup.start = start;\n\t\tstart += group.count;\n\n\t}\n\n\t// merge groups\n\n\tlet currentGroup = groups[ 0 ];\n\n\tgeometry.groups = [ currentGroup ];\n\n\tfor ( let i = 1; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tif ( currentGroup.materialIndex === group.materialIndex ) {\n\n\t\t\tcurrentGroup.count += group.count;\n\n\t\t} else {\n\n\t\t\tcurrentGroup = group;\n\t\t\tgeometry.groups.push( currentGroup );\n\n\t\t}\n\n\t}\n\n\treturn geometry;\n\n}\n\n/**\n * Modifies the supplied geometry if it is non-indexed, otherwise creates a new,\n * non-indexed geometry. Returns the geometry with smooth normals everywhere except\n * faces that meet at an angle greater than the crease angle.\n *\n * @param {BufferGeometry} geometry - The geometry to modify.\n * @param {number} [creaseAngle=Math.PI/3] - The crease angle in radians.\n * @return {BufferGeometry} - The updated geometry\n */\nfunction toCreasedNormals( geometry, creaseAngle = Math.PI / 3 /* 60 degrees */ ) {\n\n\tconst creaseDot = Math.cos( creaseAngle );\n\tconst hashMultiplier = ( 1 + 1e-10 ) * 1e2;\n\n\t// reusable vectors\n\tconst verts = [ new Vector3(), new Vector3(), new Vector3() ];\n\tconst tempVec1 = new Vector3();\n\tconst tempVec2 = new Vector3();\n\tconst tempNorm = new Vector3();\n\tconst tempNorm2 = new Vector3();\n\n\t// hashes a vector\n\tfunction hashVertex( v ) {\n\n\t\tconst x = ~ ~ ( v.x * hashMultiplier );\n\t\tconst y = ~ ~ ( v.y * hashMultiplier );\n\t\tconst z = ~ ~ ( v.z * hashMultiplier );\n\t\treturn `${x},${y},${z}`;\n\n\t}\n\n\t// BufferGeometry.toNonIndexed() warns if the geometry is non-indexed\n\t// and returns the original geometry\n\tconst resultGeometry = geometry.index ? geometry.toNonIndexed() : geometry;\n\tconst posAttr = resultGeometry.attributes.position;\n\tconst vertexMap = {};\n\n\t// find all the normals shared by commonly located vertices\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\t// add the normal to the map for all vertices\n\t\tconst normal = new Vector3().crossVectors( tempVec1, tempVec2 ).normalize();\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tif ( ! ( hash in vertexMap ) ) {\n\n\t\t\t\tvertexMap[ hash ] = [];\n\n\t\t\t}\n\n\t\t\tvertexMap[ hash ].push( normal );\n\n\t\t}\n\n\t}\n\n\t// average normals from all vertices that share a common location if they are within the\n\t// provided crease threshold\n\tconst normalArray = new Float32Array( posAttr.count * 3 );\n\tconst normAttr = new BufferAttribute( normalArray, 3, false );\n\tfor ( let i = 0, l = posAttr.count / 3; i < l; i ++ ) {\n\n\t\t// get the face normal for this vertex\n\t\tconst i3 = 3 * i;\n\t\tconst a = verts[ 0 ].fromBufferAttribute( posAttr, i3 + 0 );\n\t\tconst b = verts[ 1 ].fromBufferAttribute( posAttr, i3 + 1 );\n\t\tconst c = verts[ 2 ].fromBufferAttribute( posAttr, i3 + 2 );\n\n\t\ttempVec1.subVectors( c, b );\n\t\ttempVec2.subVectors( a, b );\n\n\t\ttempNorm.crossVectors( tempVec1, tempVec2 ).normalize();\n\n\t\t// average all normals that meet the threshold and set the normal value\n\t\tfor ( let n = 0; n < 3; n ++ ) {\n\n\t\t\tconst vert = verts[ n ];\n\t\t\tconst hash = hashVertex( vert );\n\t\t\tconst otherNormals = vertexMap[ hash ];\n\t\t\ttempNorm2.set( 0, 0, 0 );\n\n\t\t\tfor ( let k = 0, lk = otherNormals.length; k < lk; k ++ ) {\n\n\t\t\t\tconst otherNorm = otherNormals[ k ];\n\t\t\t\tif ( tempNorm.dot( otherNorm ) > creaseDot ) {\n\n\t\t\t\t\ttempNorm2.add( otherNorm );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttempNorm2.normalize();\n\t\t\tnormAttr.setXYZ( i3 + n, tempNorm2.x, tempNorm2.y, tempNorm2.z );\n\n\t\t}\n\n\t}\n\n\tresultGeometry.setAttribute( 'normal', normAttr );\n\treturn resultGeometry;\n\n}\n\nexport {\n\tcomputeMikkTSpaceTangents,\n\tmergeGeometries,\n\tmergeAttributes,\n\tdeepCloneAttribute,\n\tdeinterleaveAttribute,\n\tdeinterleaveGeometry,\n\tinterleaveAttributes,\n\testimateBytesUsed,\n\tmergeVertices,\n\ttoTrianglesDrawMode,\n\tcomputeMorphedAttributes,\n\tmergeGroups,\n\ttoCreasedNormals\n};\n", "import {\n\tBoxGeometry,\n\tBufferAttribute,\n\tDoubleSide,\n\tMesh,\n\tPlaneGeometry,\n\tShaderMaterial,\n\tVector3,\n} from 'three';\nimport { mergeGeometries } from '../utils/BufferGeometryUtils.js';\n\n/**\n * A helper that can be used to display any type of texture for\n * debugging purposes. Depending on the type of texture (2D, 3D, Array),\n * the helper becomes a plane or box mesh.\n *\n * This helper can only be used with {@link WebGLRenderer}.\n * When using {@link WebGPURenderer}, import from `TextureHelperGPU.js`.\n *\n * @augments Mesh\n * @three_import import { TextureHelper } from 'three/addons/helpers/TextureHelper.js';\n */\nclass TextureHelper extends Mesh {\n\n\t/**\n\t * Constructs a new texture helper.\n\t *\n\t * @param {Texture} texture - The texture to visualize.\n\t * @param {number} [width=1] - The helper's width.\n\t * @param {number} [height=1] - The helper's height.\n\t * @param {number} [depth=1] - The helper's depth.\n\t */\n\tconstructor( texture, width = 1, height = 1, depth = 1 ) {\n\n\t\tconst material = new ShaderMaterial( {\n\n\t\t\ttype: 'TextureHelperMaterial',\n\n\t\t\tside: DoubleSide,\n\t\t\ttransparent: true,\n\n\t\t\tuniforms: {\n\n\t\t\t\tmap: { value: texture },\n\t\t\t\talpha: { value: getAlpha( texture ) },\n\n\t\t\t},\n\n\t\t\tvertexShader: [\n\n\t\t\t\t'attribute vec3 uvw;',\n\n\t\t\t\t'varying vec3 vUvw;',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t'\tvUvw = uvw;',\n\n\t\t\t\t'\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );',\n\n\t\t\t\t'}',\n\n\t\t\t].join( '\\n' ),\n\n\t\t\tfragmentShader: [\n\n\t\t\t\t'precision highp float;',\n\n\t\t\t\t'precision highp sampler2DArray;',\n\n\t\t\t\t'precision highp sampler3D;',\n\n\t\t\t\t'uniform {samplerType} map;',\n\n\t\t\t\t'uniform float alpha;',\n\n\t\t\t\t'varying vec3 vUvw;',\n\n\t\t\t\t'vec4 textureHelper( in sampler2D map ) { return texture( map, vUvw.xy ); }',\n\n\t\t\t\t'vec4 textureHelper( in sampler2DArray map ) { return texture( map, vUvw ); }',\n\n\t\t\t\t'vec4 textureHelper( in sampler3D map ) { return texture( map, vUvw ); }',\n\n\t\t\t\t'vec4 textureHelper( in samplerCube map ) { return texture( map, vUvw ); }',\n\n\t\t\t\t'void main() {',\n\n\t\t\t\t'\tgl_FragColor = linearToOutputTexel( vec4( textureHelper( map ).xyz, alpha ) );',\n\n\t\t\t\t'}'\n\n\t\t\t].join( '\\n' ).replace( '{samplerType}', getSamplerType( texture ) )\n\n\t\t} );\n\n\t\tconst geometry = texture.isCubeTexture\n\t\t\t? createCubeGeometry( width, height, depth )\n\t\t\t: createSliceGeometry( texture, width, height, depth );\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * The texture to visualize.\n\t\t *\n\t\t * @type {Texture}\n\t\t */\n\t\tthis.texture = texture;\n\t\tthis.type = 'TextureHelper';\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nfunction getSamplerType( texture ) {\n\n\tif ( texture.isCubeTexture ) {\n\n\t\treturn 'samplerCube';\n\n\t} else if ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {\n\n\t\treturn 'sampler2DArray';\n\n\t} else if ( texture.isData3DTexture || texture.isCompressed3DTexture ) {\n\n\t\treturn 'sampler3D';\n\n\t} else {\n\n\t\treturn 'sampler2D';\n\n\t}\n\n}\n\nfunction getImageCount( texture ) {\n\n\tif ( texture.isCubeTexture ) {\n\n\t\treturn 6;\n\n\t} else if ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {\n\n\t\treturn texture.image.depth;\n\n\t} else if ( texture.isData3DTexture || texture.isCompressed3DTexture ) {\n\n\t\treturn texture.image.depth;\n\n\t} else {\n\n\t\treturn 1;\n\n\t}\n\n}\n\nfunction getAlpha( texture ) {\n\n\tif ( texture.isCubeTexture ) {\n\n\t\treturn 1;\n\n\t} else if ( texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {\n\n\t\treturn Math.max( 1 / texture.image.depth, 0.25 );\n\n\t} else if ( texture.isData3DTexture || texture.isCompressed3DTexture ) {\n\n\t\treturn Math.max( 1 / texture.image.depth, 0.25 );\n\n\t} else {\n\n\t\treturn 1;\n\n\t}\n\n}\n\nfunction createCubeGeometry( width, height, depth ) {\n\n\tconst geometry = new BoxGeometry( width, height, depth );\n\n\tconst position = geometry.attributes.position;\n\tconst uv = geometry.attributes.uv;\n\tconst uvw = new BufferAttribute( new Float32Array( uv.count * 3 ), 3 );\n\n\tconst _direction = new Vector3();\n\n\tfor ( let j = 0, jl = uv.count; j < jl; ++ j ) {\n\n\t\t_direction.fromBufferAttribute( position, j ).normalize();\n\n\t\tconst u = _direction.x;\n\t\tconst v = _direction.y;\n\t\tconst w = _direction.z;\n\n\t\tuvw.setXYZ( j, u, v, w );\n\n\t}\n\n\tgeometry.deleteAttribute( 'uv' );\n\tgeometry.setAttribute( 'uvw', uvw );\n\n\treturn geometry;\n\n}\n\nfunction createSliceGeometry( texture, width, height, depth ) {\n\n\tconst sliceCount = getImageCount( texture );\n\n\tconst geometries = [];\n\n\tfor ( let i = 0; i < sliceCount; ++ i ) {\n\n\t\tconst geometry = new PlaneGeometry( width, height );\n\n\t\tif ( sliceCount > 1 ) {\n\n\t\t\tgeometry.translate( 0, 0, depth * ( i / ( sliceCount - 1 ) - 0.5 ) );\n\n\t\t}\n\n\t\tconst uv = geometry.attributes.uv;\n\t\tconst uvw = new BufferAttribute( new Float32Array( uv.count * 3 ), 3 );\n\n\t\tfor ( let j = 0, jl = uv.count; j < jl; ++ j ) {\n\n\t\t\tconst u = uv.getX( j );\n\t\t\tconst v = texture.flipY ? uv.getY( j ) : 1 - uv.getY( j );\n\t\t\tconst w = sliceCount === 1\n\t\t\t\t? 1\n\t\t\t\t: texture.isDataArrayTexture || texture.isCompressedArrayTexture\n\t\t\t\t\t? i\n\t\t\t\t\t: i / ( sliceCount - 1 );\n\n\t\t\tuvw.setXYZ( j, u, v, w );\n\n\t\t}\n\n\t\tgeometry.deleteAttribute( 'uv' );\n\t\tgeometry.setAttribute( 'uvw', uvw );\n\n\t\tgeometries.push( geometry );\n\n\t}\n\n\treturn mergeGeometries( geometries );\n\n}\n\nexport { TextureHelper };\n", "import {\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tLineSegments,\n\tLineBasicMaterial,\n\tMatrix3,\n\tVector3\n} from 'three';\n\nconst _v1 = new Vector3();\nconst _v2 = new Vector3();\nconst _normalMatrix = new Matrix3();\n\n/**\n * Visualizes an object's vertex normals.\n *\n * Requires that normals have been specified in the geometry as a buffer attribute or\n * have been calculated using {@link BufferGeometry#computeVertexNormals}.\n * ```js\n * const geometry = new THREE.BoxGeometry( 10, 10, 10, 2, 2, 2 );\n * const material = new THREE.MeshStandardMaterial();\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n *\n * const helper = new VertexNormalsHelper( mesh, 1, 0xff0000 );\n * scene.add( helper );\n * ```\n *\n * @augments LineSegments\n * @three_import import { VertexNormalsHelper } from 'three/addons/helpers/VertexNormalsHelper.js';\n */\nclass VertexNormalsHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new vertex normals helper.\n\t *\n\t * @param {Object3D} object - The object for which to visualize vertex normals.\n\t * @param {number} [size=1] - The helper's size.\n\t * @param {number|Color|string} [color=0xff0000] - The helper's color.\n\t */\n\tconstructor( object, size = 1, color = 0xff0000 ) {\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst nNormals = object.geometry.attributes.normal.count;\n\t\tconst positions = new Float32BufferAttribute( nNormals * 2 * 3, 3 );\n\n\t\tgeometry.setAttribute( 'position', positions );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color, toneMapped: false } ) );\n\n\t\t/**\n\t\t * The object for which to visualize vertex normals.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.object = object;\n\n\t\t/**\n\t\t * The helper's size.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.size = size;\n\n\t\tthis.type = 'VertexNormalsHelper';\n\n\t\t/**\n\t\t * Overwritten and set to `false` since the object's world transformation\n\t\t * is encoded in the helper's geometry data.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isVertexNormalsHelper = true;\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Updates the vertex normals preview based on the object's world transform.\n\t */\n\tupdate() {\n\n\t\tthis.object.updateMatrixWorld( true );\n\n\t\t_normalMatrix.getNormalMatrix( this.object.matrixWorld );\n\n\t\tconst matrixWorld = this.object.matrixWorld;\n\n\t\tconst position = this.geometry.attributes.position;\n\n\t\t//\n\n\t\tconst objGeometry = this.object.geometry;\n\n\t\tif ( objGeometry ) {\n\n\t\t\tconst objPos = objGeometry.attributes.position;\n\n\t\t\tconst objNorm = objGeometry.attributes.normal;\n\n\t\t\tlet idx = 0;\n\n\t\t\t// for simplicity, ignore index and drawcalls, and render every normal\n\n\t\t\tfor ( let j = 0, jl = objPos.count; j < jl; j ++ ) {\n\n\t\t\t\t_v1.fromBufferAttribute( objPos, j ).applyMatrix4( matrixWorld );\n\n\t\t\t\t_v2.fromBufferAttribute( objNorm, j );\n\n\t\t\t\t_v2.applyMatrix3( _normalMatrix ).normalize().multiplyScalar( this.size ).add( _v1 );\n\n\t\t\t\tposition.setXYZ( idx, _v1.x, _v1.y, _v1.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t\tposition.setXYZ( idx, _v2.x, _v2.y, _v2.z );\n\n\t\t\t\tidx = idx + 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tposition.needsUpdate = true;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nexport { VertexNormalsHelper };\n", "import {\n\tBufferGeometry,\n\tFloat32BufferAttribute,\n\tLineSegments,\n\tLineBasicMaterial,\n\tVector3\n} from 'three';\n\nconst _v1 = new Vector3();\nconst _v2 = new Vector3();\n\n/**\n * Visualizes an object's vertex tangents.\n *\n * Requires that tangents have been specified in the geometry as a buffer attribute or\n * have been calculated using {@link BufferGeometry#computeTangents}.\n * ```js\n * const helper = new VertexTangentsHelper( mesh, 1, 0xff0000 );\n * scene.add( helper );\n * ```\n *\n * @augments LineSegments\n * @three_import import { VertexTangentsHelper } from 'three/addons/helpers/VertexTangentsHelper.js';\n */\nclass VertexTangentsHelper extends LineSegments {\n\n\t/**\n\t * Constructs a new vertex tangents helper.\n\t *\n\t * @param {Object3D} object - The object for which to visualize vertex tangents.\n\t * @param {number} [size=1] - The helper's size.\n\t * @param {number|Color|string} [color=0xff0000] - The helper's color.\n\t */\n\tconstructor( object, size = 1, color = 0x00ffff ) {\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst nTangents = object.geometry.attributes.tangent.count;\n\t\tconst positions = new Float32BufferAttribute( nTangents * 2 * 3, 3 );\n\n\t\tgeometry.setAttribute( 'position', positions );\n\n\t\tsuper( geometry, new LineBasicMaterial( { color, toneMapped: false } ) );\n\n\t\t/**\n\t\t * The object for which to visualize vertex tangents.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.object = object;\n\n\t\t/**\n\t\t * The helper's size.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.size = size;\n\n\t\tthis.type = 'VertexTangentsHelper';\n\n\t\t/**\n\t\t * Overwritten and set to `false` since the object's world transformation\n\t\t * is encoded in the helper's geometry data.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.matrixAutoUpdate = false;\n\n\t\tthis.update();\n\n\t}\n\n\t/**\n\t * Updates the vertex normals preview based on the object's world transform.\n\t */\n\tupdate() {\n\n\t\tthis.object.updateMatrixWorld( true );\n\n\t\tconst matrixWorld = this.object.matrixWorld;\n\n\t\tconst position = this.geometry.attributes.position;\n\n\t\t//\n\n\t\tconst objGeometry = this.object.geometry;\n\n\t\tconst objPos = objGeometry.attributes.position;\n\n\t\tconst objTan = objGeometry.attributes.tangent;\n\n\t\tlet idx = 0;\n\n\t\t// for simplicity, ignore index and drawcalls, and render every tangent\n\n\t\tfor ( let j = 0, jl = objPos.count; j < jl; j ++ ) {\n\n\t\t\t_v1.fromBufferAttribute( objPos, j ).applyMatrix4( matrixWorld );\n\n\t\t\t_v2.fromBufferAttribute( objTan, j );\n\n\t\t\t_v2.transformDirection( matrixWorld ).multiplyScalar( this.size ).add( _v1 );\n\n\t\t\tposition.setXYZ( idx, _v1.x, _v1.y, _v1.z );\n\n\t\t\tidx = idx + 1;\n\n\t\t\tposition.setXYZ( idx, _v2.x, _v2.y, _v2.z );\n\n\t\t\tidx = idx + 1;\n\n\t\t}\n\n\t\tposition.needsUpdate = true;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.geometry.dispose();\n\t\tthis.material.dispose();\n\n\t}\n\n}\n\nexport { VertexTangentsHelper };\n", "import {\n\tCylinderGeometry,\n\tCanvasTexture,\n\tColor,\n\tEuler,\n\tMesh,\n\tMeshBasicMaterial,\n\tObject3D,\n\tOrthographicCamera,\n\tQuaternion,\n\tRaycaster,\n\tSprite,\n\tSpriteMaterial,\n\tSRGBColorSpace,\n\tVector2,\n\tVector3,\n\tVector4\n} from 'three';\n\n/**\n * A special type of helper that visualizes the camera's transformation\n * in a small viewport area as an axes helper. Such a helper is often wanted\n * in 3D modeling tools or scene editors like the [three.js editor](https://threejs.org/editor).\n *\n * The helper allows to click on the X, Y and Z axes which animates the camera\n * so it looks along the selected axis.\n *\n * @augments Object3D\n * @three_import import { ViewHelper } from 'three/addons/helpers/ViewHelper.js';\n */\nclass ViewHelper extends Object3D {\n\n\t/**\n\t * Constructs a new view helper.\n\t *\n\t * @param {Camera} camera - The camera whose transformation should be visualized.\n\t * @param {HTMLElement} [domElement] - The DOM element that is used to render the view.\n\t */\n\tconstructor( camera, domElement ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isViewHelper = true;\n\n\t\t/**\n\t\t * Whether the helper is currently animating or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default false\n\t\t */\n\t\tthis.animating = false;\n\n\t\t/**\n\t\t * The helper's center point.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.center = new Vector3();\n\n\t\tconst color1 = new Color( '#ff4466' );\n\t\tconst color2 = new Color( '#88ff44' );\n\t\tconst color3 = new Color( '#4488ff' );\n\t\tconst color4 = new Color( '#000000' );\n\n\t\tconst options = {};\n\n\t\tconst interactiveObjects = [];\n\t\tconst raycaster = new Raycaster();\n\t\tconst mouse = new Vector2();\n\t\tconst dummy = new Object3D();\n\n\t\tconst orthoCamera = new OrthographicCamera( - 2, 2, 2, - 2, 0, 4 );\n\t\torthoCamera.position.set( 0, 0, 2 );\n\n\t\tconst geometry = new CylinderGeometry( 0.04, 0.04, 0.8, 5 ).rotateZ( - Math.PI / 2 ).translate( 0.4, 0, 0 );\n\n\t\tconst xAxis = new Mesh( geometry, getAxisMaterial( color1 ) );\n\t\tconst yAxis = new Mesh( geometry, getAxisMaterial( color2 ) );\n\t\tconst zAxis = new Mesh( geometry, getAxisMaterial( color3 ) );\n\n\t\tyAxis.rotation.z = Math.PI / 2;\n\t\tzAxis.rotation.y = - Math.PI / 2;\n\n\t\tthis.add( xAxis );\n\t\tthis.add( zAxis );\n\t\tthis.add( yAxis );\n\n\t\tconst spriteMaterial1 = getSpriteMaterial( color1 );\n\t\tconst spriteMaterial2 = getSpriteMaterial( color2 );\n\t\tconst spriteMaterial3 = getSpriteMaterial( color3 );\n\t\tconst spriteMaterial4 = getSpriteMaterial( color4 );\n\n\t\tconst posXAxisHelper = new Sprite( spriteMaterial1 );\n\t\tconst posYAxisHelper = new Sprite( spriteMaterial2 );\n\t\tconst posZAxisHelper = new Sprite( spriteMaterial3 );\n\t\tconst negXAxisHelper = new Sprite( spriteMaterial4 );\n\t\tconst negYAxisHelper = new Sprite( spriteMaterial4 );\n\t\tconst negZAxisHelper = new Sprite( spriteMaterial4 );\n\n\t\tposXAxisHelper.position.x = 1;\n\t\tposYAxisHelper.position.y = 1;\n\t\tposZAxisHelper.position.z = 1;\n\t\tnegXAxisHelper.position.x = - 1;\n\t\tnegYAxisHelper.position.y = - 1;\n\t\tnegZAxisHelper.position.z = - 1;\n\n\t\tnegXAxisHelper.material.opacity = 0.2;\n\t\tnegYAxisHelper.material.opacity = 0.2;\n\t\tnegZAxisHelper.material.opacity = 0.2;\n\n\t\tposXAxisHelper.userData.type = 'posX';\n\t\tposYAxisHelper.userData.type = 'posY';\n\t\tposZAxisHelper.userData.type = 'posZ';\n\t\tnegXAxisHelper.userData.type = 'negX';\n\t\tnegYAxisHelper.userData.type = 'negY';\n\t\tnegZAxisHelper.userData.type = 'negZ';\n\n\t\tthis.add( posXAxisHelper );\n\t\tthis.add( posYAxisHelper );\n\t\tthis.add( posZAxisHelper );\n\t\tthis.add( negXAxisHelper );\n\t\tthis.add( negYAxisHelper );\n\t\tthis.add( negZAxisHelper );\n\n\t\tinteractiveObjects.push( posXAxisHelper );\n\t\tinteractiveObjects.push( posYAxisHelper );\n\t\tinteractiveObjects.push( posZAxisHelper );\n\t\tinteractiveObjects.push( negXAxisHelper );\n\t\tinteractiveObjects.push( negYAxisHelper );\n\t\tinteractiveObjects.push( negZAxisHelper );\n\n\t\tconst point = new Vector3();\n\t\tconst dim = 128;\n\t\tconst turnRate = 2 * Math.PI; // turn rate in angles per second\n\n\t\t/**\n\t\t * Renders the helper in a separate view in the bottom-right corner\n\t\t * of the viewport.\n\t\t *\n\t\t * @param {WebGLRenderer|WebGPURenderer} renderer - The renderer.\n\t\t */\n\t\tthis.render = function ( renderer ) {\n\n\t\t\tthis.quaternion.copy( camera.quaternion ).invert();\n\t\t\tthis.updateMatrixWorld();\n\n\t\t\tpoint.set( 0, 0, 1 );\n\t\t\tpoint.applyQuaternion( camera.quaternion );\n\n\t\t\t//\n\n\t\t\tconst x = domElement.offsetWidth - dim;\n\t\t\tconst y = renderer.isWebGPURenderer ? domElement.offsetHeight - dim : 0;\n\n\t\t\trenderer.clearDepth();\n\n\t\t\trenderer.getViewport( viewport );\n\t\t\trenderer.setViewport( x, y, dim, dim );\n\n\t\t\trenderer.render( this, orthoCamera );\n\n\t\t\trenderer.setViewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\n\t\t};\n\n\t\tconst targetPosition = new Vector3();\n\t\tconst targetQuaternion = new Quaternion();\n\n\t\tconst q1 = new Quaternion();\n\t\tconst q2 = new Quaternion();\n\t\tconst viewport = new Vector4();\n\t\tlet radius = 0;\n\n\t\t/**\n\t\t * This method should be called when a click or pointer event\n\t\t * has happened in the app.\n\t\t *\n\t\t * @param {PointerEvent} event - The event to process.\n\t\t * @return {boolean} Whether an intersection with the helper has been detected or not.\n\t\t */\n\t\tthis.handleClick = function ( event ) {\n\n\t\t\tif ( this.animating === true ) return false;\n\n\t\t\tconst rect = domElement.getBoundingClientRect();\n\t\t\tconst offsetX = rect.left + ( domElement.offsetWidth - dim );\n\t\t\tconst offsetY = rect.top + ( domElement.offsetHeight - dim );\n\t\t\tmouse.x = ( ( event.clientX - offsetX ) / ( rect.right - offsetX ) ) * 2 - 1;\n\t\t\tmouse.y = - ( ( event.clientY - offsetY ) / ( rect.bottom - offsetY ) ) * 2 + 1;\n\n\t\t\traycaster.setFromCamera( mouse, orthoCamera );\n\n\t\t\tconst intersects = raycaster.intersectObjects( interactiveObjects );\n\n\t\t\tif ( intersects.length > 0 ) {\n\n\t\t\t\tconst intersection = intersects[ 0 ];\n\t\t\t\tconst object = intersection.object;\n\n\t\t\t\tprepareAnimationData( object, this.center );\n\n\t\t\t\tthis.animating = true;\n\n\t\t\t\treturn true;\n\n\t\t\t} else {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Sets labels for each axis. By default, they are unlabeled.\n\t\t *\n\t\t * @param {string|undefined} labelX - The label for the x-axis.\n\t\t * @param {string|undefined} labelY - The label for the y-axis.\n\t\t * @param {string|undefined} labelZ - The label for the z-axis.\n\t\t */\n\t\tthis.setLabels = function ( labelX, labelY, labelZ ) {\n\n\t\t\toptions.labelX = labelX;\n\t\t\toptions.labelY = labelY;\n\t\t\toptions.labelZ = labelZ;\n\n\t\t\tupdateLabels();\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the label style. Has no effect when the axes are unlabeled.\n\t\t *\n\t\t * @param {string} [font='24px Arial'] - The label font.\n\t\t * @param {string} [color='#000000'] - The label color.\n\t\t * @param {number} [radius=14] - The label radius.\n\t\t */\n\t\tthis.setLabelStyle = function ( font, color, radius ) {\n\n\t\t\toptions.font = font;\n\t\t\toptions.color = color;\n\t\t\toptions.radius = radius;\n\n\t\t\tupdateLabels();\n\n\t\t};\n\n\t\t/**\n\t\t * Updates the helper. This method should be called in the app's animation\n\t\t * loop.\n\t\t *\n\t\t * @param {number} delta - The delta time in seconds.\n\t\t */\n\t\tthis.update = function ( delta ) {\n\n\t\t\tconst step = delta * turnRate;\n\n\t\t\t// animate position by doing a slerp and then scaling the position on the unit sphere\n\n\t\t\tq1.rotateTowards( q2, step );\n\t\t\tcamera.position.set( 0, 0, 1 ).applyQuaternion( q1 ).multiplyScalar( radius ).add( this.center );\n\n\t\t\t// animate orientation\n\n\t\t\tcamera.quaternion.rotateTowards( targetQuaternion, step );\n\n\t\t\tif ( q1.angleTo( q2 ) === 0 ) {\n\n\t\t\t\tthis.animating = false;\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Frees the GPU-related resources allocated by this instance. Call this\n\t\t * method whenever this instance is no longer used in your app.\n\t\t */\n\t\tthis.dispose = function () {\n\n\t\t\tgeometry.dispose();\n\n\t\t\txAxis.material.dispose();\n\t\t\tyAxis.material.dispose();\n\t\t\tzAxis.material.dispose();\n\n\t\t\tposXAxisHelper.material.map.dispose();\n\t\t\tposYAxisHelper.material.map.dispose();\n\t\t\tposZAxisHelper.material.map.dispose();\n\t\t\tnegXAxisHelper.material.map.dispose();\n\t\t\tnegYAxisHelper.material.map.dispose();\n\t\t\tnegZAxisHelper.material.map.dispose();\n\n\t\t\tposXAxisHelper.material.dispose();\n\t\t\tposYAxisHelper.material.dispose();\n\t\t\tposZAxisHelper.material.dispose();\n\t\t\tnegXAxisHelper.material.dispose();\n\t\t\tnegYAxisHelper.material.dispose();\n\t\t\tnegZAxisHelper.material.dispose();\n\n\t\t};\n\n\t\tfunction prepareAnimationData( object, focusPoint ) {\n\n\t\t\tswitch ( object.userData.type ) {\n\n\t\t\t\tcase 'posX':\n\t\t\t\t\ttargetPosition.set( 1, 0, 0 );\n\t\t\t\t\ttargetQuaternion.setFromEuler( new Euler( 0, Math.PI * 0.5, 0 ) );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'posY':\n\t\t\t\t\ttargetPosition.set( 0, 1, 0 );\n\t\t\t\t\ttargetQuaternion.setFromEuler( new Euler( - Math.PI * 0.5, 0, 0 ) );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'posZ':\n\t\t\t\t\ttargetPosition.set( 0, 0, 1 );\n\t\t\t\t\ttargetQuaternion.setFromEuler( new Euler() );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'negX':\n\t\t\t\t\ttargetPosition.set( - 1, 0, 0 );\n\t\t\t\t\ttargetQuaternion.setFromEuler( new Euler( 0, - Math.PI * 0.5, 0 ) );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'negY':\n\t\t\t\t\ttargetPosition.set( 0, - 1, 0 );\n\t\t\t\t\ttargetQuaternion.setFromEuler( new Euler( Math.PI * 0.5, 0, 0 ) );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'negZ':\n\t\t\t\t\ttargetPosition.set( 0, 0, - 1 );\n\t\t\t\t\ttargetQuaternion.setFromEuler( new Euler( 0, Math.PI, 0 ) );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.error( 'ViewHelper: Invalid axis.' );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tradius = camera.position.distanceTo( focusPoint );\n\t\t\ttargetPosition.multiplyScalar( radius ).add( focusPoint );\n\n\t\t\tdummy.position.copy( focusPoint );\n\n\t\t\tdummy.lookAt( camera.position );\n\t\t\tq1.copy( dummy.quaternion );\n\n\t\t\tdummy.lookAt( targetPosition );\n\t\t\tq2.copy( dummy.quaternion );\n\n\t\t}\n\n\t\tfunction getAxisMaterial( color ) {\n\n\t\t\treturn new MeshBasicMaterial( { color: color, toneMapped: false } );\n\n\t\t}\n\n\t\tfunction useOffscreenCanvas() {\n\n\t\t\tlet result = false;\n\n\t\t\ttry {\n\n\t\t\t\t// this check has been adapted from WebGLTextures\n\n\t\t\t\tresult = typeof OffscreenCanvas !== 'undefined' && ( new OffscreenCanvas( 1, 1 ).getContext( '2d' ) ) !== null;\n\n\t\t\t} catch ( err ) {\n\n\t\t\t\t// Ignore any errors\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\tfunction createCanvas( width, height ) {\n\n\t\t\tlet canvas;\n\n\t\t\tif ( useOffscreenCanvas() ) {\n\n\t\t\t\tcanvas = new OffscreenCanvas( width, height );\n\n\t\t\t} else {\n\n\t\t\t\tcanvas = document.createElement( 'canvas' );\n\t\t\t\tcanvas.width = width;\n\t\t\t\tcanvas.height = height;\n\n\t\t\t}\n\n\t\t\treturn canvas;\n\n\t\t}\n\n\t\tfunction getSpriteMaterial( color, text ) {\n\n\t\t\tconst { font = '24px Arial', color: labelColor = '#000000', radius = 14 } = options;\n\n\t\t\tconst canvas = createCanvas( 64, 64 );\n\n\t\t\tconst context = canvas.getContext( '2d' );\n\t\t\tcontext.beginPath();\n\t\t\tcontext.arc( 32, 32, radius, 0, 2 * Math.PI );\n\t\t\tcontext.closePath();\n\t\t\tcontext.fillStyle = color.getStyle();\n\t\t\tcontext.fill();\n\n\t\t\tif ( text ) {\n\n\t\t\t\tcontext.font = font;\n\t\t\t\tcontext.textAlign = 'center';\n\t\t\t\tcontext.fillStyle = labelColor;\n\t\t\t\tcontext.fillText( text, 32, 41 );\n\n\t\t\t}\n\n\t\t\tconst texture = new CanvasTexture( canvas );\n\t\t\ttexture.colorSpace = SRGBColorSpace;\n\n\t\t\treturn new SpriteMaterial( { map: texture, toneMapped: false } );\n\n\t\t}\n\n\t\tfunction updateLabels() {\n\n\t\t\tposXAxisHelper.material.map.dispose();\n\t\t\tposYAxisHelper.material.map.dispose();\n\t\t\tposZAxisHelper.material.map.dispose();\n\n\t\t\tposXAxisHelper.material.dispose();\n\t\t\tposYAxisHelper.material.dispose();\n\t\t\tposZAxisHelper.material.dispose();\n\n\t\t\tposXAxisHelper.material = getSpriteMaterial( color1, options.labelX );\n\t\t\tposYAxisHelper.material = getSpriteMaterial( color2, options.labelY );\n\t\t\tposZAxisHelper.material = getSpriteMaterial( color3, options.labelZ );\n\n\t\t}\n\n\t}\n\n}\n\nexport { ViewHelper };\n", "import {\n\tCanvasTexture,\n\tLinearFilter,\n\tMesh,\n\tMeshBasicMaterial,\n\tPlaneGeometry,\n\tSRGBColorSpace,\n\tColor\n} from 'three';\n\n/**\n * This class can be used to render a DOM element onto a canvas and use it as a texture\n * for a plane mesh.\n *\n * A typical use case for this class is to render the GUI of `lil-gui` as a texture so it\n * is compatible for VR.\n *\n * ```js\n * const gui = new GUI( { width: 300 } ); // create lil-gui instance\n *\n * const mesh = new HTMLMesh( gui.domElement );\n * scene.add( mesh );\n * ```\n *\n * @augments Mesh\n * @three_import import { HTMLMesh } from 'three/addons/interactive/HTMLMesh.js';\n */\nclass HTMLMesh extends Mesh {\n\n\t/**\n\t * Constructs a new HTML mesh.\n\t *\n\t * @param {HTMLElement} dom - The DOM element to display as a plane mesh.\n\t */\n\tconstructor( dom ) {\n\n\t\tconst texture = new HTMLTexture( dom );\n\n\t\tconst geometry = new PlaneGeometry( texture.image.width * 0.001, texture.image.height * 0.001 );\n\t\tconst material = new MeshBasicMaterial( { map: texture, toneMapped: false, transparent: true } );\n\n\t\tsuper( geometry, material );\n\n\t\tfunction onEvent( event ) {\n\n\t\t\tmaterial.map.dispatchDOMEvent( event );\n\n\t\t}\n\n\t\tthis.addEventListener( 'mousedown', onEvent );\n\t\tthis.addEventListener( 'mousemove', onEvent );\n\t\tthis.addEventListener( 'mouseup', onEvent );\n\t\tthis.addEventListener( 'click', onEvent );\n\n\t\t/**\n\t\t * Frees the GPU-related resources allocated by this instance and removes all event listeners.\n\t\t * Call this method whenever this instance is no longer used in your app.\n\t\t */\n\t\tthis.dispose = function () {\n\n\t\t\tgeometry.dispose();\n\t\t\tmaterial.dispose();\n\n\t\t\tmaterial.map.dispose();\n\n\t\t\tcanvases.delete( dom );\n\n\t\t\tthis.removeEventListener( 'mousedown', onEvent );\n\t\t\tthis.removeEventListener( 'mousemove', onEvent );\n\t\t\tthis.removeEventListener( 'mouseup', onEvent );\n\t\t\tthis.removeEventListener( 'click', onEvent );\n\n\t\t};\n\n\t}\n\n}\n\nclass HTMLTexture extends CanvasTexture {\n\n\tconstructor( dom ) {\n\n\t\tsuper( html2canvas( dom ) );\n\n\t\tthis.dom = dom;\n\n\t\tthis.anisotropy = 16;\n\t\tthis.colorSpace = SRGBColorSpace;\n\t\tthis.minFilter = LinearFilter;\n\t\tthis.magFilter = LinearFilter;\n\t\tthis.generateMipmaps = false;\n\n\t\t// Create an observer on the DOM, and run html2canvas update in the next loop\n\t\tconst observer = new MutationObserver( () => {\n\n\t\t\tif ( ! this.scheduleUpdate ) {\n\n\t\t\t\t// ideally should use xr.requestAnimationFrame, here setTimeout to avoid passing the renderer\n\t\t\t\tthis.scheduleUpdate = setTimeout( () => this.update(), 16 );\n\n\t\t\t}\n\n\t\t} );\n\n\t\tconst config = { attributes: true, childList: true, subtree: true, characterData: true };\n\t\tobserver.observe( dom, config );\n\n\t\tthis.observer = observer;\n\n\t}\n\n\tdispatchDOMEvent( event ) {\n\n\t\tif ( event.data ) {\n\n\t\t\thtmlevent( this.dom, event.type, event.data.x, event.data.y );\n\n\t\t}\n\n\t}\n\n\tupdate() {\n\n\t\tthis.image = html2canvas( this.dom );\n\t\tthis.needsUpdate = true;\n\n\t\tthis.scheduleUpdate = null;\n\n\t}\n\n\tdispose() {\n\n\t\tif ( this.observer ) {\n\n\t\t\tthis.observer.disconnect();\n\n\t\t}\n\n\t\tthis.scheduleUpdate = clearTimeout( this.scheduleUpdate );\n\n\t\tsuper.dispose();\n\n\t}\n\n}\n\n\n//\n\nconst canvases = new WeakMap();\n\nfunction html2canvas( element ) {\n\n\tconst range = document.createRange();\n\tconst color = new Color();\n\n\tfunction Clipper( context ) {\n\n\t\tconst clips = [];\n\t\tlet isClipping = false;\n\n\t\tfunction doClip() {\n\n\t\t\tif ( isClipping ) {\n\n\t\t\t\tisClipping = false;\n\t\t\t\tcontext.restore();\n\n\t\t\t}\n\n\t\t\tif ( clips.length === 0 ) return;\n\n\t\t\tlet minX = - Infinity, minY = - Infinity;\n\t\t\tlet maxX = Infinity, maxY = Infinity;\n\n\t\t\tfor ( let i = 0; i < clips.length; i ++ ) {\n\n\t\t\t\tconst clip = clips[ i ];\n\n\t\t\t\tminX = Math.max( minX, clip.x );\n\t\t\t\tminY = Math.max( minY, clip.y );\n\t\t\t\tmaxX = Math.min( maxX, clip.x + clip.width );\n\t\t\t\tmaxY = Math.min( maxY, clip.y + clip.height );\n\n\t\t\t}\n\n\t\t\tcontext.save();\n\t\t\tcontext.beginPath();\n\t\t\tcontext.rect( minX, minY, maxX - minX, maxY - minY );\n\t\t\tcontext.clip();\n\n\t\t\tisClipping = true;\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tadd: function ( clip ) {\n\n\t\t\t\tclips.push( clip );\n\t\t\t\tdoClip();\n\n\t\t\t},\n\n\t\t\tremove: function () {\n\n\t\t\t\tclips.pop();\n\t\t\t\tdoClip();\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tfunction drawText( style, x, y, string ) {\n\n\t\tif ( string !== '' ) {\n\n\t\t\tif ( style.textTransform === 'uppercase' ) {\n\n\t\t\t\tstring = string.toUpperCase();\n\n\t\t\t}\n\n\t\t\tcontext.font = style.fontWeight + ' ' + style.fontSize + ' ' + style.fontFamily;\n\t\t\tcontext.textBaseline = 'top';\n\t\t\tcontext.fillStyle = style.color;\n\t\t\tcontext.fillText( string, x, y + parseFloat( style.fontSize ) * 0.1 );\n\n\t\t}\n\n\t}\n\n\tfunction buildRectPath( x, y, w, h, r ) {\n\n\t\tif ( w < 2 * r ) r = w / 2;\n\t\tif ( h < 2 * r ) r = h / 2;\n\n\t\tcontext.beginPath();\n\t\tcontext.moveTo( x + r, y );\n\t\tcontext.arcTo( x + w, y, x + w, y + h, r );\n\t\tcontext.arcTo( x + w, y + h, x, y + h, r );\n\t\tcontext.arcTo( x, y + h, x, y, r );\n\t\tcontext.arcTo( x, y, x + w, y, r );\n\t\tcontext.closePath();\n\n\t}\n\n\tfunction drawBorder( style, which, x, y, width, height ) {\n\n\t\tconst borderWidth = style[ which + 'Width' ];\n\t\tconst borderStyle = style[ which + 'Style' ];\n\t\tconst borderColor = style[ which + 'Color' ];\n\n\t\tif ( borderWidth !== '0px' && borderStyle !== 'none' && borderColor !== 'transparent' && borderColor !== 'rgba(0, 0, 0, 0)' ) {\n\n\t\t\tcontext.strokeStyle = borderColor;\n\t\t\tcontext.lineWidth = parseFloat( borderWidth );\n\t\t\tcontext.beginPath();\n\t\t\tcontext.moveTo( x, y );\n\t\t\tcontext.lineTo( x + width, y + height );\n\t\t\tcontext.stroke();\n\n\t\t}\n\n\t}\n\n\tfunction drawElement( element, style ) {\n\n\t\t// Do not render invisible elements, comments and scripts.\n\t\tif ( element.nodeType === Node.COMMENT_NODE || element.nodeName === 'SCRIPT' || ( element.style && element.style.display === 'none' ) ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tlet x = 0, y = 0, width = 0, height = 0;\n\n\t\tif ( element.nodeType === Node.TEXT_NODE ) {\n\n\t\t\t// text\n\n\t\t\trange.selectNode( element );\n\n\t\t\tconst rect = range.getBoundingClientRect();\n\n\t\t\tx = rect.left - offset.left - 0.5;\n\t\t\ty = rect.top - offset.top - 0.5;\n\t\t\twidth = rect.width;\n\t\t\theight = rect.height;\n\n\t\t\tdrawText( style, x, y, element.nodeValue.trim() );\n\n\t\t} else if ( element instanceof HTMLCanvasElement ) {\n\n\t\t\t// Canvas element\n\t\t\tconst rect = element.getBoundingClientRect();\n\t\t\tx = rect.left - offset.left - 0.5;\n\t\t\ty = rect.top - offset.top - 0.5;\n\t\t\tconst width = rect.width;\n\t\t\tconst height = rect.height;\n\t\t\tcontext.drawImage( element, x, y, width, height );\n\n\t\t} else if ( element instanceof HTMLImageElement ) {\n\n\t\t\tconst rect = element.getBoundingClientRect();\n\n\t\t\tx = rect.left - offset.left - 0.5;\n\t\t\ty = rect.top - offset.top - 0.5;\n\t\t\twidth = rect.width;\n\t\t\theight = rect.height;\n\n\t\t\tcontext.drawImage( element, x, y, width, height );\n\n\t\t} else {\n\n\t\t\tconst rect = element.getBoundingClientRect();\n\n\t\t\tx = rect.left - offset.left - 0.5;\n\t\t\ty = rect.top - offset.top - 0.5;\n\t\t\twidth = rect.width;\n\t\t\theight = rect.height;\n\n\t\t\tstyle = window.getComputedStyle( element );\n\n\t\t\t// Get the border of the element used for fill and border\n\n\t\t\tbuildRectPath( x, y, width, height, parseFloat( style.borderRadius ) );\n\n\t\t\tconst backgroundColor = style.backgroundColor;\n\n\t\t\tif ( backgroundColor !== 'transparent' && backgroundColor !== 'rgba(0, 0, 0, 0)' ) {\n\n\t\t\t\tcontext.fillStyle = backgroundColor;\n\t\t\t\tcontext.fill();\n\n\t\t\t}\n\n\t\t\t// If all the borders match then stroke the round rectangle\n\n\t\t\tconst borders = [ 'borderTop', 'borderLeft', 'borderBottom', 'borderRight' ];\n\n\t\t\tlet match = true;\n\t\t\tlet prevBorder = null;\n\n\t\t\tfor ( const border of borders ) {\n\n\t\t\t\tif ( prevBorder !== null ) {\n\n\t\t\t\t\tmatch = ( style[ border + 'Width' ] === style[ prevBorder + 'Width' ] ) &&\n\t\t\t\t\t( style[ border + 'Color' ] === style[ prevBorder + 'Color' ] ) &&\n\t\t\t\t\t( style[ border + 'Style' ] === style[ prevBorder + 'Style' ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( match === false ) break;\n\n\t\t\t\tprevBorder = border;\n\n\t\t\t}\n\n\t\t\tif ( match === true ) {\n\n\t\t\t\t// They all match so stroke the rectangle from before allows for border-radius\n\n\t\t\t\tconst width = parseFloat( style.borderTopWidth );\n\n\t\t\t\tif ( style.borderTopWidth !== '0px' && style.borderTopStyle !== 'none' && style.borderTopColor !== 'transparent' && style.borderTopColor !== 'rgba(0, 0, 0, 0)' ) {\n\n\t\t\t\t\tcontext.strokeStyle = style.borderTopColor;\n\t\t\t\t\tcontext.lineWidth = width;\n\t\t\t\t\tcontext.stroke();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// Otherwise draw individual borders\n\n\t\t\t\tdrawBorder( style, 'borderTop', x, y, width, 0 );\n\t\t\t\tdrawBorder( style, 'borderLeft', x, y, 0, height );\n\t\t\t\tdrawBorder( style, 'borderBottom', x, y + height, width, 0 );\n\t\t\t\tdrawBorder( style, 'borderRight', x + width, y, 0, height );\n\n\t\t\t}\n\n\t\t\tif ( element instanceof HTMLInputElement ) {\n\n\t\t\t\tlet accentColor = style.accentColor;\n\n\t\t\t\tif ( accentColor === undefined || accentColor === 'auto' ) accentColor = style.color;\n\n\t\t\t\tcolor.set( accentColor );\n\n\t\t\t\tconst luminance = Math.sqrt( 0.299 * ( color.r ** 2 ) + 0.587 * ( color.g ** 2 ) + 0.114 * ( color.b ** 2 ) );\n\t\t\t\tconst accentTextColor = luminance < 0.5 ? 'white' : '#111111';\n\n\t\t\t\tif ( element.type === 'radio' ) {\n\n\t\t\t\t\tbuildRectPath( x, y, width, height, height );\n\n\t\t\t\t\tcontext.fillStyle = 'white';\n\t\t\t\t\tcontext.strokeStyle = accentColor;\n\t\t\t\t\tcontext.lineWidth = 1;\n\t\t\t\t\tcontext.fill();\n\t\t\t\t\tcontext.stroke();\n\n\t\t\t\t\tif ( element.checked ) {\n\n\t\t\t\t\t\tbuildRectPath( x + 2, y + 2, width - 4, height - 4, height );\n\n\t\t\t\t\t\tcontext.fillStyle = accentColor;\n\t\t\t\t\t\tcontext.strokeStyle = accentTextColor;\n\t\t\t\t\t\tcontext.lineWidth = 2;\n\t\t\t\t\t\tcontext.fill();\n\t\t\t\t\t\tcontext.stroke();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( element.type === 'checkbox' ) {\n\n\t\t\t\t\tbuildRectPath( x, y, width, height, 2 );\n\n\t\t\t\t\tcontext.fillStyle = element.checked ? accentColor : 'white';\n\t\t\t\t\tcontext.strokeStyle = element.checked ? accentTextColor : accentColor;\n\t\t\t\t\tcontext.lineWidth = 1;\n\t\t\t\t\tcontext.stroke();\n\t\t\t\t\tcontext.fill();\n\n\t\t\t\t\tif ( element.checked ) {\n\n\t\t\t\t\t\tconst currentTextAlign = context.textAlign;\n\n\t\t\t\t\t\tcontext.textAlign = 'center';\n\n\t\t\t\t\t\tconst properties = {\n\t\t\t\t\t\t\tcolor: accentTextColor,\n\t\t\t\t\t\t\tfontFamily: style.fontFamily,\n\t\t\t\t\t\t\tfontSize: height + 'px',\n\t\t\t\t\t\t\tfontWeight: 'bold'\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tdrawText( properties, x + ( width / 2 ), y, '\u2714' );\n\n\t\t\t\t\t\tcontext.textAlign = currentTextAlign;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( element.type === 'range' ) {\n\n\t\t\t\t\tconst [ min, max, value ] = [ 'min', 'max', 'value' ].map( property => parseFloat( element[ property ] ) );\n\t\t\t\t\tconst position = ( ( value - min ) / ( max - min ) ) * ( width - height );\n\n\t\t\t\t\tbuildRectPath( x, y + ( height / 4 ), width, height / 2, height / 4 );\n\t\t\t\t\tcontext.fillStyle = accentTextColor;\n\t\t\t\t\tcontext.strokeStyle = accentColor;\n\t\t\t\t\tcontext.lineWidth = 1;\n\t\t\t\t\tcontext.fill();\n\t\t\t\t\tcontext.stroke();\n\n\t\t\t\t\tbuildRectPath( x, y + ( height / 4 ), position + ( height / 2 ), height / 2, height / 4 );\n\t\t\t\t\tcontext.fillStyle = accentColor;\n\t\t\t\t\tcontext.fill();\n\n\t\t\t\t\tbuildRectPath( x + position, y, height, height, height / 2 );\n\t\t\t\t\tcontext.fillStyle = accentColor;\n\t\t\t\t\tcontext.fill();\n\n\t\t\t\t}\n\n\t\t\t\tif ( element.type === 'color' || element.type === 'text' || element.type === 'number' || element.type === 'email' || element.type === 'password' ) {\n\n\t\t\t\t\tclipper.add( { x: x, y: y, width: width, height: height } );\n\n\t\t\t\t\tconst displayValue = element.type === 'password' ? '*'.repeat( element.value.length ) : element.value;\n\n\t\t\t\t\tdrawText( style, x + parseInt( style.paddingLeft ), y + parseInt( style.paddingTop ), displayValue );\n\n\t\t\t\t\tclipper.remove();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t/*\n\t\t// debug\n\t\tcontext.strokeStyle = '#' + Math.random().toString( 16 ).slice( - 3 );\n\t\tcontext.strokeRect( x - 0.5, y - 0.5, width + 1, height + 1 );\n\t\t*/\n\n\t\tconst isClipping = style.overflow === 'auto' || style.overflow === 'hidden';\n\n\t\tif ( isClipping ) clipper.add( { x: x, y: y, width: width, height: height } );\n\n\t\tfor ( let i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\tdrawElement( element.childNodes[ i ], style );\n\n\t\t}\n\n\t\tif ( isClipping ) clipper.remove();\n\n\t}\n\n\tconst offset = element.getBoundingClientRect();\n\n\tlet canvas = canvases.get( element );\n\n\tif ( canvas === undefined ) {\n\n\t\tcanvas = document.createElement( 'canvas' );\n\t\tcanvases.set( element, canvas );\n\n\t}\n\n\tcanvas.width = offset.width;\n\tcanvas.height = offset.height;\n\n\tconst context = canvas.getContext( '2d'/*, { alpha: false }*/ );\n\n\tconst clipper = new Clipper( context );\n\n\t// console.time( 'drawElement' );\n\n\tcontext.clearRect( 0, 0, canvas.width, canvas.height );\n\n\tdrawElement( element );\n\n\t// console.timeEnd( 'drawElement' );\n\n\treturn canvas;\n\n}\n\nfunction htmlevent( element, event, x, y ) {\n\n\tconst mouseEventInit = {\n\t\tclientX: ( x * element.offsetWidth ) + element.offsetLeft,\n\t\tclientY: ( y * element.offsetHeight ) + element.offsetTop,\n\t\tview: element.ownerDocument.defaultView\n\t};\n\n\twindow.dispatchEvent( new MouseEvent( event, mouseEventInit ) );\n\n\tconst rect = element.getBoundingClientRect();\n\n\tx = x * rect.width + rect.left;\n\ty = y * rect.height + rect.top;\n\n\tfunction traverse( element ) {\n\n\t\tif ( element.nodeType !== Node.TEXT_NODE && element.nodeType !== Node.COMMENT_NODE ) {\n\n\t\t\tconst rect = element.getBoundingClientRect();\n\n\t\t\tif ( x > rect.left && x < rect.right && y > rect.top && y < rect.bottom ) {\n\n\t\t\t\telement.dispatchEvent( new MouseEvent( event, mouseEventInit ) );\n\n\t\t\t\tif ( element instanceof HTMLInputElement && element.type === 'range' && ( event === 'mousedown' || event === 'click' ) ) {\n\n\t\t\t\t\tconst [ min, max ] = [ 'min', 'max' ].map( property => parseFloat( element[ property ] ) );\n\n\t\t\t\t\tconst width = rect.width;\n\t\t\t\t\tconst offsetX = x - rect.x;\n\t\t\t\t\tconst proportion = offsetX / width;\n\t\t\t\t\telement.value = min + ( max - min ) * proportion;\n\t\t\t\t\telement.dispatchEvent( new InputEvent( 'input', { bubbles: true } ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( element instanceof HTMLInputElement && ( element.type === 'text' || element.type === 'number' || element.type === 'email' || element.type === 'password' ) && ( event === 'mousedown' || event === 'click' ) ) {\n\n\t\t\t\t\telement.focus();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < element.childNodes.length; i ++ ) {\n\n\t\t\t\ttraverse( element.childNodes[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttraverse( element );\n\n}\n\nexport { HTMLMesh };\n", "import {\n\tGroup,\n\tRaycaster,\n\tVector2\n} from 'three';\n\nconst _pointer = new Vector2();\nconst _event = { type: '', data: _pointer };\n\n// The XR events that are mapped to \"standard\" pointer events.\nconst _events = {\n\t'move': 'mousemove',\n\t'select': 'click',\n\t'selectstart': 'mousedown',\n\t'selectend': 'mouseup'\n};\n\nconst _raycaster = new Raycaster();\n\n/**\n * This class can be used to group 3D objects in an interactive group.\n * The group itself can listen to Pointer, Mouse or XR controller events to\n * detect selections of descendant 3D objects. If a 3D object is selected,\n * the respective event is going to dispatched to it.\n *\n * ```js\n * const group = new InteractiveGroup();\n * group.listenToPointerEvents( renderer, camera );\n * group.listenToXRControllerEvents( controller1 );\n * group.listenToXRControllerEvents( controller2 );\n * scene.add( group );\n *\n * // now add objects that should be interactive\n * group.add( mesh1, mesh2, mesh3 );\n * ```\n * @augments Group\n * @three_import import { InteractiveGroup } from 'three/addons/interactive/InteractiveGroup.js';\n */\nclass InteractiveGroup extends Group {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The internal raycaster.\n\t\t *\n\t\t * @type {Raycaster}\n\t\t */\n\t\tthis.raycaster = new Raycaster();\n\n\t\t/**\n\t\t * The internal raycaster.\n\t\t *\n\t\t * @type {?HTMLElement}\n\t\t * @default null\n\t\t */\n\t\tthis.element = null;\n\n\t\t/**\n\t\t * The camera used for raycasting.\n\t\t *\n\t\t * @type {?Camera}\n\t\t * @default null\n\t\t */\n\t\tthis.camera = null;\n\n\t\t/**\n\t\t * An array of XR controllers.\n\t\t *\n\t\t * @type {Array<Group>}\n\t\t */\n\t\tthis.controllers = [];\n\n\t\tthis._onPointerEvent = this.onPointerEvent.bind( this );\n\t\tthis._onXRControllerEvent = this.onXRControllerEvent.bind( this );\n\n\t}\n\n\tonPointerEvent( event ) {\n\n\t\tevent.stopPropagation();\n\n\t\tconst rect = this.element.getBoundingClientRect();\n\n\t\t_pointer.x = ( event.clientX - rect.left ) / rect.width * 2 - 1;\n\t\t_pointer.y = - ( event.clientY - rect.top ) / rect.height * 2 + 1;\n\n\t\tthis.raycaster.setFromCamera( _pointer, this.camera );\n\n\t\tconst intersects = this.raycaster.intersectObjects( this.children, false );\n\n\t\tif ( intersects.length > 0 ) {\n\n\t\t\tconst intersection = intersects[ 0 ];\n\n\t\t\tconst object = intersection.object;\n\t\t\tconst uv = intersection.uv;\n\n\t\t\t_event.type = event.type;\n\t\t\t_event.data.set( uv.x, 1 - uv.y );\n\n\t\t\tobject.dispatchEvent( _event );\n\n\t\t}\n\n\t}\n\n\tonXRControllerEvent( event ) {\n\n\t\tconst controller = event.target;\n\n\t\t_raycaster.setFromXRController( controller );\n\n\t\tconst intersections = _raycaster.intersectObjects( this.children, false );\n\n\t\tif ( intersections.length > 0 ) {\n\n\t\t\tconst intersection = intersections[ 0 ];\n\n\t\t\tconst object = intersection.object;\n\t\t\tconst uv = intersection.uv;\n\n\t\t\t_event.type = _events[ event.type ];\n\t\t\t_event.data.set( uv.x, 1 - uv.y );\n\n\t\t\tobject.dispatchEvent( _event );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Calling this method makes sure the interactive group listens to Pointer and Mouse events.\n\t * The target is the `domElement` of the given renderer. The camera is required for the internal\n\t * raycasting so 3D objects can be detected based on the events.\n\t *\n\t * @param {(WebGPURenderer|WebGLRenderer)} renderer - The renderer.\n\t * @param {Camera} camera - The camera.\n\t */\n\tlistenToPointerEvents( renderer, camera ) {\n\n\t\tthis.camera = camera;\n\t\tthis.element = renderer.domElement;\n\n\t\tthis.element.addEventListener( 'pointerdown', this._onPointerEvent );\n\t\tthis.element.addEventListener( 'pointerup', this._onPointerEvent );\n\t\tthis.element.addEventListener( 'pointermove', this._onPointerEvent );\n\t\tthis.element.addEventListener( 'mousedown', this._onPointerEvent );\n\t\tthis.element.addEventListener( 'mouseup', this._onPointerEvent );\n\t\tthis.element.addEventListener( 'mousemove', this._onPointerEvent );\n\t\tthis.element.addEventListener( 'click', this._onPointerEvent );\n\n\t}\n\n\t/**\n\t * Disconnects this interactive group from all Pointer and Mouse Events.\n\t */\n\tdisconnectionPointerEvents() {\n\n\t\tif ( this.element !== null ) {\n\n\t\t\tthis.element.removeEventListener( 'pointerdown', this._onPointerEvent );\n\t\t\tthis.element.removeEventListener( 'pointerup', this._onPointerEvent );\n\t\t\tthis.element.removeEventListener( 'pointermove', this._onPointerEvent );\n\t\t\tthis.element.removeEventListener( 'mousedown', this._onPointerEvent );\n\t\t\tthis.element.removeEventListener( 'mouseup', this._onPointerEvent );\n\t\t\tthis.element.removeEventListener( 'mousemove', this._onPointerEvent );\n\t\t\tthis.element.removeEventListener( 'click', this._onPointerEvent );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Calling this method makes sure the interactive group listens to events of\n\t * the given XR controller.\n\t *\n\t * @param {Group} controller - The XR controller.\n\t */\n\tlistenToXRControllerEvents( controller ) {\n\n\t\tthis.controllers.push( controller );\n\t\tcontroller.addEventListener( 'move', this._onXRControllerEvent );\n\t\tcontroller.addEventListener( 'select', this._onXRControllerEvent );\n\t\tcontroller.addEventListener( 'selectstart', this._onXRControllerEvent );\n\t\tcontroller.addEventListener( 'selectend', this._onXRControllerEvent );\n\n\t}\n\n\t/**\n\t * Disconnects this interactive group from all XR controllers.\n\t */\n\tdisconnectXrControllerEvents() {\n\n\t\tfor ( const controller of this.controllers ) {\n\n\t\t\tcontroller.removeEventListener( 'move', this._onXRControllerEvent );\n\t\t\tcontroller.removeEventListener( 'select', this._onXRControllerEvent );\n\t\t\tcontroller.removeEventListener( 'selectstart', this._onXRControllerEvent );\n\t\t\tcontroller.removeEventListener( 'selectend', this._onXRControllerEvent );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disconnects this interactive group from the DOM and all XR controllers.\n\t */\n\tdisconnect() {\n\n\t\tthis.disconnectionPointerEvents();\n\t\tthis.disconnectXrControllerEvents();\n\n\t\tthis.camera = null;\n\t\tthis.element = null;\n\n\t\tthis.controllers = [];\n\n\t}\n\n}\n\nexport { InteractiveGroup };\n", "import {\n\tFrustum,\n\tVector3,\n\tMatrix4,\n\tQuaternion,\n} from 'three';\n\nconst _frustum = new Frustum();\nconst _center = new Vector3();\n\nconst _tmpPoint = new Vector3();\n\nconst _vecNear = new Vector3();\nconst _vecTopLeft = new Vector3();\nconst _vecTopRight = new Vector3();\nconst _vecDownRight = new Vector3();\nconst _vecDownLeft = new Vector3();\n\nconst _vecFarTopLeft = new Vector3();\nconst _vecFarTopRight = new Vector3();\nconst _vecFarDownRight = new Vector3();\nconst _vecFarDownLeft = new Vector3();\n\nconst _vectemp1 = new Vector3();\nconst _vectemp2 = new Vector3();\nconst _vectemp3 = new Vector3();\n\nconst _matrix = new Matrix4();\nconst _quaternion = new Quaternion();\nconst _scale = new Vector3();\n\n/**\n * This class can be used to select 3D objects in a scene with a selection box.\n * It is recommended to visualize the selected area with the help of {@link SelectionHelper}.\n *\n * ```js\n * const selectionBox = new SelectionBox( camera, scene );\n * const selectedObjects = selectionBox.select( startPoint, endPoint );\n * ```\n *\n * @three_import import { SelectionBox } from 'three/addons/interactive/SelectionBox.js';\n */\nclass SelectionBox {\n\n\t/**\n\t * Constructs a new selection box.\n\t *\n\t * @param {Camera} camera - The camera the scene is rendered with.\n\t * @param {Scene} scene - The scene.\n\t * @param {number} [deep=Number.MAX_VALUE] - How deep the selection frustum of perspective cameras should extend.\n\t */\n\tconstructor( camera, scene, deep = Number.MAX_VALUE ) {\n\n\t\t/**\n\t\t * The camera the scene is rendered with.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = camera;\n\n\t\t/**\n\t\t * The camera the scene is rendered with.\n\t\t *\n\t\t * @type {Scene}\n\t\t */\n\t\tthis.scene = scene;\n\n\t\t/**\n\t\t * The start point of the selection.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.startPoint = new Vector3();\n\n\t\t/**\n\t\t * The end point of the selection.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.endPoint = new Vector3();\n\n\t\t/**\n\t\t * The selected 3D objects.\n\t\t *\n\t\t * @type {Array<Object3D>}\n\t\t */\n\t\tthis.collection = [];\n\n\t\t/**\n\t\t * The selected instance IDs of instanced meshes.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.instances = {};\n\t\t/**\n\t\t * The selected batches of batched meshes.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.batches = {};\n\n\t\t/**\n\t\t * How deep the selection frustum of perspective cameras should extend.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Number.MAX_VALUE\n\t\t */\n\t\tthis.deep = deep;\n\n\t}\n\n\t/**\n\t * This method selects 3D objects in the scene based on the given start\n\t * and end point. If no parameters are provided, the method uses the start\n\t * and end values of the respective members.\n\t *\n\t * @param {Vector3} [startPoint] - The start point.\n\t * @param {Vector3} [endPoint] - The end point.\n\t * @return {Array<Object3D>} The selected 3D objects.\n\t */\n\tselect( startPoint, endPoint ) {\n\n\t\tthis.startPoint = startPoint || this.startPoint;\n\t\tthis.endPoint = endPoint || this.endPoint;\n\t\tthis.collection = [];\n\n\t\tthis._updateFrustum( this.startPoint, this.endPoint );\n\t\tthis._searchChildInFrustum( _frustum, this.scene );\n\n\t\treturn this.collection;\n\n\t}\n\n\t// private\n\n\t_updateFrustum( startPoint, endPoint ) {\n\n\t\tstartPoint = startPoint || this.startPoint;\n\t\tendPoint = endPoint || this.endPoint;\n\n\t\t// Avoid invalid frustum\n\n\t\tif ( startPoint.x === endPoint.x ) {\n\n\t\t\tendPoint.x += Number.EPSILON;\n\n\t\t}\n\n\t\tif ( startPoint.y === endPoint.y ) {\n\n\t\t\tendPoint.y += Number.EPSILON;\n\n\t\t}\n\n\t\tthis.camera.updateProjectionMatrix();\n\t\tthis.camera.updateMatrixWorld();\n\n\t\tif ( this.camera.isPerspectiveCamera ) {\n\n\t\t\t_tmpPoint.copy( startPoint );\n\t\t\t_tmpPoint.x = Math.min( startPoint.x, endPoint.x );\n\t\t\t_tmpPoint.y = Math.max( startPoint.y, endPoint.y );\n\t\t\tendPoint.x = Math.max( startPoint.x, endPoint.x );\n\t\t\tendPoint.y = Math.min( startPoint.y, endPoint.y );\n\n\t\t\t_vecNear.setFromMatrixPosition( this.camera.matrixWorld );\n\t\t\t_vecTopLeft.copy( _tmpPoint );\n\t\t\t_vecTopRight.set( endPoint.x, _tmpPoint.y, 0 );\n\t\t\t_vecDownRight.copy( endPoint );\n\t\t\t_vecDownLeft.set( _tmpPoint.x, endPoint.y, 0 );\n\n\t\t\t_vecTopLeft.unproject( this.camera );\n\t\t\t_vecTopRight.unproject( this.camera );\n\t\t\t_vecDownRight.unproject( this.camera );\n\t\t\t_vecDownLeft.unproject( this.camera );\n\n\t\t\t_vectemp1.copy( _vecTopLeft ).sub( _vecNear );\n\t\t\t_vectemp2.copy( _vecTopRight ).sub( _vecNear );\n\t\t\t_vectemp3.copy( _vecDownRight ).sub( _vecNear );\n\t\t\t_vectemp1.normalize();\n\t\t\t_vectemp2.normalize();\n\t\t\t_vectemp3.normalize();\n\n\t\t\t_vectemp1.multiplyScalar( this.deep );\n\t\t\t_vectemp2.multiplyScalar( this.deep );\n\t\t\t_vectemp3.multiplyScalar( this.deep );\n\t\t\t_vectemp1.add( _vecNear );\n\t\t\t_vectemp2.add( _vecNear );\n\t\t\t_vectemp3.add( _vecNear );\n\n\t\t\tconst planes = _frustum.planes;\n\n\t\t\tplanes[ 0 ].setFromCoplanarPoints( _vecNear, _vecTopLeft, _vecTopRight );\n\t\t\tplanes[ 1 ].setFromCoplanarPoints( _vecNear, _vecTopRight, _vecDownRight );\n\t\t\tplanes[ 2 ].setFromCoplanarPoints( _vecDownRight, _vecDownLeft, _vecNear );\n\t\t\tplanes[ 3 ].setFromCoplanarPoints( _vecDownLeft, _vecTopLeft, _vecNear );\n\t\t\tplanes[ 4 ].setFromCoplanarPoints( _vecTopRight, _vecDownRight, _vecDownLeft );\n\t\t\tplanes[ 5 ].setFromCoplanarPoints( _vectemp3, _vectemp2, _vectemp1 );\n\t\t\tplanes[ 5 ].normal.multiplyScalar( - 1 );\n\n\t\t} else if ( this.camera.isOrthographicCamera ) {\n\n\t\t\tconst left = Math.min( startPoint.x, endPoint.x );\n\t\t\tconst top = Math.max( startPoint.y, endPoint.y );\n\t\t\tconst right = Math.max( startPoint.x, endPoint.x );\n\t\t\tconst down = Math.min( startPoint.y, endPoint.y );\n\n\t\t\t_vecTopLeft.set( left, top, - 1 );\n\t\t\t_vecTopRight.set( right, top, - 1 );\n\t\t\t_vecDownRight.set( right, down, - 1 );\n\t\t\t_vecDownLeft.set( left, down, - 1 );\n\n\t\t\t_vecFarTopLeft.set( left, top, 1 );\n\t\t\t_vecFarTopRight.set( right, top, 1 );\n\t\t\t_vecFarDownRight.set( right, down, 1 );\n\t\t\t_vecFarDownLeft.set( left, down, 1 );\n\n\t\t\t_vecTopLeft.unproject( this.camera );\n\t\t\t_vecTopRight.unproject( this.camera );\n\t\t\t_vecDownRight.unproject( this.camera );\n\t\t\t_vecDownLeft.unproject( this.camera );\n\n\t\t\t_vecFarTopLeft.unproject( this.camera );\n\t\t\t_vecFarTopRight.unproject( this.camera );\n\t\t\t_vecFarDownRight.unproject( this.camera );\n\t\t\t_vecFarDownLeft.unproject( this.camera );\n\n\t\t\tconst planes = _frustum.planes;\n\n\t\t\tplanes[ 0 ].setFromCoplanarPoints( _vecTopLeft, _vecFarTopLeft, _vecFarTopRight );\n\t\t\tplanes[ 1 ].setFromCoplanarPoints( _vecTopRight, _vecFarTopRight, _vecFarDownRight );\n\t\t\tplanes[ 2 ].setFromCoplanarPoints( _vecFarDownRight, _vecFarDownLeft, _vecDownLeft );\n\t\t\tplanes[ 3 ].setFromCoplanarPoints( _vecFarDownLeft, _vecFarTopLeft, _vecTopLeft );\n\t\t\tplanes[ 4 ].setFromCoplanarPoints( _vecTopRight, _vecDownRight, _vecDownLeft );\n\t\t\tplanes[ 5 ].setFromCoplanarPoints( _vecFarDownRight, _vecFarTopRight, _vecFarTopLeft );\n\t\t\tplanes[ 5 ].normal.multiplyScalar( - 1 );\n\n\t\t} else {\n\n\t\t\tconsole.error( 'THREE.SelectionBox: Unsupported camera type.' );\n\n\t\t}\n\n\t}\n\n\t_searchChildInFrustum( frustum, object ) {\n\n\t\tif ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\tif ( object.isInstancedMesh ) {\n\n\t\t\t\tthis.instances[ object.uuid ] = [];\n\n\t\t\t\tfor ( let instanceId = 0; instanceId < object.count; instanceId ++ ) {\n\n\t\t\t\t\tobject.getMatrixAt( instanceId, _matrix );\n\t\t\t\t\t_matrix.decompose( _center, _quaternion, _scale );\n\t\t\t\t\t_center.applyMatrix4( object.matrixWorld );\n\n\t\t\t\t\tif ( frustum.containsPoint( _center ) ) {\n\n\t\t\t\t\t\tthis.instances[ object.uuid ].push( instanceId );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isBatchedMesh ) {\n\n\t\t\t\tthis.batches[ object.uuid ] = [];\n\n\t\t\t\tfor ( let instanceId = 0, count = 0; count < object.instanceCount; instanceId ++ ) {\n\n\t\t\t\t\t// skip invalid instances in the batchedMesh\n\n\t\t\t\t\tif ( object.validateInstanceId( instanceId ) === false ) continue;\n\n\t\t\t\t\tcount ++;\n\n\t\t\t\t\tobject.getMatrixAt( instanceId, _matrix );\n\t\t\t\t\t_matrix.decompose( _center, _quaternion, _scale );\n\t\t\t\t\t_center.applyMatrix4( object.matrixWorld );\n\n\t\t\t\t\tif ( frustum.containsPoint( _center ) ) {\n\n\t\t\t\t\t\tthis.batches[ object.uuid ].push( instanceId );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( object.geometry.boundingSphere === null ) object.geometry.computeBoundingSphere();\n\n\t\t\t\t_center.copy( object.geometry.boundingSphere.center );\n\n\t\t\t\t_center.applyMatrix4( object.matrixWorld );\n\n\t\t\t\tif ( frustum.containsPoint( _center ) ) {\n\n\t\t\t\t\tthis.collection.push( object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( object.children.length > 0 ) {\n\n\t\t\tfor ( let x = 0; x < object.children.length; x ++ ) {\n\n\t\t\t\tthis._searchChildInFrustum( frustum, object.children[ x ] );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nexport { SelectionBox };\n", "import { Vector2 } from 'three';\n\n/**\n * A helper for {@link SelectionBox}.\n *\n * It visualizes the current selection box with a `div` container element.\n *\n * @three_import import { SelectionHelper } from 'three/addons/interactive/SelectionHelper.js';\n */\nclass SelectionHelper {\n\n\t/**\n\t * Constructs a new selection helper.\n\t *\n\t * @param {(WebGPURenderer|WebGLRenderer)} renderer - The renderer.\n\t * @param {string} cssClassName - The CSS class name of the `div`.\n\t */\n\tconstructor( renderer, cssClassName ) {\n\n\t\t/**\n\t\t * The visualization of the selection box.\n\t\t *\n\t\t * @type {HTMLDivElement}\n\t\t */\n\t\tthis.element = document.createElement( 'div' );\n\t\tthis.element.classList.add( cssClassName );\n\t\tthis.element.style.pointerEvents = 'none';\n\n\t\t/**\n\t\t * A reference to the renderer.\n\t\t *\n\t\t * @type {(WebGPURenderer|WebGLRenderer)}\n\t\t */\n\t\tthis.renderer = renderer;\n\n\t\t/**\n\t\t * Whether the mouse or pointer is pressed down.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.isDown = false;\n\n\t\t/**\n\t\t * Whether helper is enabled or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enabled = true;\n\n\t\t// private\n\n\t\tthis._startPoint = new Vector2();\n\t\tthis._pointTopLeft = new Vector2();\n\t\tthis._pointBottomRight = new Vector2();\n\n\t\tthis._onPointerDown = function ( event ) {\n\n\t\t\tif ( this.enabled === false ) return;\n\n\t\t\tthis.isDown = true;\n\t\t\tthis._onSelectStart( event );\n\n\t\t}.bind( this );\n\n\t\tthis._onPointerMove = function ( event ) {\n\n\t\t\tif ( this.enabled === false ) return;\n\n\t\t\tif ( this.isDown ) {\n\n\t\t\t\tthis._onSelectMove( event );\n\n\t\t\t}\n\n\t\t}.bind( this );\n\n\t\tthis._onPointerUp = function ( ) {\n\n\t\t\tif ( this.enabled === false ) return;\n\n\t\t\tthis.isDown = false;\n\t\t\tthis._onSelectOver();\n\n\t\t}.bind( this );\n\n\t\tthis.renderer.domElement.addEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.renderer.domElement.addEventListener( 'pointermove', this._onPointerMove );\n\t\tthis.renderer.domElement.addEventListener( 'pointerup', this._onPointerUp );\n\n\t}\n\n\t/**\n\t * Call this method if you no longer want use to the controls. It frees all internal\n\t * resources and removes all event listeners.\n\t */\n\tdispose() {\n\n\t\tthis.renderer.domElement.removeEventListener( 'pointerdown', this._onPointerDown );\n\t\tthis.renderer.domElement.removeEventListener( 'pointermove', this._onPointerMove );\n\t\tthis.renderer.domElement.removeEventListener( 'pointerup', this._onPointerUp );\n\n\t\tthis.element.remove(); // in case disposal happens while dragging\n\n\t}\n\n\t// private\n\n\t_onSelectStart( event ) {\n\n\t\tthis.element.style.display = 'none';\n\n\t\tthis.renderer.domElement.parentElement.appendChild( this.element );\n\n\t\tthis.element.style.left = event.clientX + 'px';\n\t\tthis.element.style.top = event.clientY + 'px';\n\t\tthis.element.style.width = '0px';\n\t\tthis.element.style.height = '0px';\n\n\t\tthis._startPoint.x = event.clientX;\n\t\tthis._startPoint.y = event.clientY;\n\n\t}\n\n\t_onSelectMove( event ) {\n\n\t\tthis.element.style.display = 'block';\n\n\t\tthis._pointBottomRight.x = Math.max( this._startPoint.x, event.clientX );\n\t\tthis._pointBottomRight.y = Math.max( this._startPoint.y, event.clientY );\n\t\tthis._pointTopLeft.x = Math.min( this._startPoint.x, event.clientX );\n\t\tthis._pointTopLeft.y = Math.min( this._startPoint.y, event.clientY );\n\n\t\tthis.element.style.left = this._pointTopLeft.x + 'px';\n\t\tthis.element.style.top = this._pointTopLeft.y + 'px';\n\t\tthis.element.style.width = ( this._pointBottomRight.x - this._pointTopLeft.x ) + 'px';\n\t\tthis.element.style.height = ( this._pointBottomRight.y - this._pointTopLeft.y ) + 'px';\n\n\t}\n\n\t_onSelectOver() {\n\n\t\tthis.element.remove();\n\n\t}\n\n}\n\nexport { SelectionHelper };\n", "import {\n\tColor,\n\tLightProbe,\n\tLinearSRGBColorSpace,\n\tSphericalHarmonics3,\n\tVector3,\n\tSRGBColorSpace,\n\tNoColorSpace,\n\tHalfFloatType,\n\tDataUtils,\n\tWebGLCoordinateSystem,\n\tFloatType\n} from 'three';\n\n/**\n * Utility class for creating instances of {@link LightProbe}.\n *\n * @hideconstructor\n * @three_import import { LightProbeGenerator } from 'three/addons/lights/LightProbeGenerator.js';\n */\nclass LightProbeGenerator {\n\n\t/**\n\t * Creates a light probe from the given (radiance) environment map.\n\t * The method expects that the environment map is represented as a cube texture.\n\t *\n\t * @param {CubeTexture} cubeTexture - The environment map.\n\t * @return {LightProbe} The created light probe.\n\t */\n\tstatic fromCubeTexture( cubeTexture ) {\n\n\t\t// https://www.ppsloan.org/publications/StupidSH36.pdf\n\n\t\tlet totalWeight = 0;\n\n\t\tconst coord = new Vector3();\n\n\t\tconst dir = new Vector3();\n\n\t\tconst color = new Color();\n\n\t\tconst shBasis = [ 0, 0, 0, 0, 0, 0, 0, 0, 0 ];\n\n\t\tconst sh = new SphericalHarmonics3();\n\t\tconst shCoefficients = sh.coefficients;\n\n\t\tfor ( let faceIndex = 0; faceIndex < 6; faceIndex ++ ) {\n\n\t\t\tconst image = cubeTexture.image[ faceIndex ];\n\n\t\t\tconst width = image.width;\n\t\t\tconst height = image.height;\n\n\t\t\tconst canvas = document.createElement( 'canvas' );\n\n\t\t\tcanvas.width = width;\n\t\t\tcanvas.height = height;\n\n\t\t\tconst context = canvas.getContext( '2d' );\n\n\t\t\tcontext.drawImage( image, 0, 0, width, height );\n\n\t\t\tconst imageData = context.getImageData( 0, 0, width, height );\n\n\t\t\tconst data = imageData.data;\n\n\t\t\tconst imageWidth = imageData.width; // assumed to be square\n\n\t\t\tconst pixelSize = 2 / imageWidth;\n\n\t\t\tfor ( let i = 0, il = data.length; i < il; i += 4 ) { // RGBA assumed\n\n\t\t\t\t// pixel color\n\t\t\t\tcolor.setRGB( data[ i ] / 255, data[ i + 1 ] / 255, data[ i + 2 ] / 255 );\n\n\t\t\t\t// convert to linear color space\n\t\t\t\tconvertColorToLinear( color, cubeTexture.colorSpace );\n\n\t\t\t\t// pixel coordinate on unit cube\n\n\t\t\t\tconst pixelIndex = i / 4;\n\n\t\t\t\tconst col = - 1 + ( pixelIndex % imageWidth + 0.5 ) * pixelSize;\n\n\t\t\t\tconst row = 1 - ( Math.floor( pixelIndex / imageWidth ) + 0.5 ) * pixelSize;\n\n\t\t\t\tswitch ( faceIndex ) {\n\n\t\t\t\t\tcase 0: coord.set( - 1, row, - col ); break;\n\n\t\t\t\t\tcase 1: coord.set( 1, row, col ); break;\n\n\t\t\t\t\tcase 2: coord.set( - col, 1, - row ); break;\n\n\t\t\t\t\tcase 3: coord.set( - col, - 1, row ); break;\n\n\t\t\t\t\tcase 4: coord.set( - col, row, 1 ); break;\n\n\t\t\t\t\tcase 5: coord.set( col, row, - 1 ); break;\n\n\t\t\t\t}\n\n\t\t\t\t// weight assigned to this pixel\n\n\t\t\t\tconst lengthSq = coord.lengthSq();\n\n\t\t\t\tconst weight = 4 / ( Math.sqrt( lengthSq ) * lengthSq );\n\n\t\t\t\ttotalWeight += weight;\n\n\t\t\t\t// direction vector to this pixel\n\t\t\t\tdir.copy( coord ).normalize();\n\n\t\t\t\t// evaluate SH basis functions in direction dir\n\t\t\t\tSphericalHarmonics3.getBasisAt( dir, shBasis );\n\n\t\t\t\t// accumulate\n\t\t\t\tfor ( let j = 0; j < 9; j ++ ) {\n\n\t\t\t\t\tshCoefficients[ j ].x += shBasis[ j ] * color.r * weight;\n\t\t\t\t\tshCoefficients[ j ].y += shBasis[ j ] * color.g * weight;\n\t\t\t\t\tshCoefficients[ j ].z += shBasis[ j ] * color.b * weight;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// normalize\n\t\tconst norm = ( 4 * Math.PI ) / totalWeight;\n\n\t\tfor ( let j = 0; j < 9; j ++ ) {\n\n\t\t\tshCoefficients[ j ].x *= norm;\n\t\t\tshCoefficients[ j ].y *= norm;\n\t\t\tshCoefficients[ j ].z *= norm;\n\n\t\t}\n\n\t\treturn new LightProbe( sh );\n\n\t}\n\n\t/**\n\t * Creates a light probe from the given (radiance) environment map.\n\t * The method expects that the environment map is represented as a cube render target.\n\t *\n\t * The cube render target must be in RGBA so `cubeRenderTarget.texture.format` must be\n\t * set to {@link RGBAFormat}.\n\t *\n\t * @async\n\t * @param {WebGPURenderer|WebGLRenderer} renderer - The renderer.\n\t * @param {CubeRenderTarget|WebGLCubeRenderTarget} cubeRenderTarget - The environment map.\n\t * @return {Promise<LightProbe>} A Promise that resolves with the created light probe.\n\t */\n\tstatic async fromCubeRenderTarget( renderer, cubeRenderTarget ) {\n\n\t\tconst flip = renderer.coordinateSystem === WebGLCoordinateSystem ? - 1 : 1;\n\n\t\t// The renderTarget must be set to RGBA in order to make readRenderTargetPixels works\n\t\tlet totalWeight = 0;\n\n\t\tconst coord = new Vector3();\n\n\t\tconst dir = new Vector3();\n\n\t\tconst color = new Color();\n\n\t\tconst shBasis = [ 0, 0, 0, 0, 0, 0, 0, 0, 0 ];\n\n\t\tconst sh = new SphericalHarmonics3();\n\t\tconst shCoefficients = sh.coefficients;\n\n\t\tconst dataType = cubeRenderTarget.texture.type;\n\t\tconst imageWidth = cubeRenderTarget.width; // assumed to be square\n\n\t\tlet data;\n\n\t\tif ( renderer.isWebGLRenderer ) {\n\n\t\t\tif ( dataType === FloatType ) {\n\n\t\t\t\tdata = new Float32Array( imageWidth * imageWidth * 4 );\n\n\t\t\t} else if ( dataType === HalfFloatType ) {\n\n\t\t\t\tdata = new Uint16Array( imageWidth * imageWidth * 4 );\n\n\t\t\t} else {\n\n\t\t\t\t// assuming UnsignedByteType\n\n\t\t\t\tdata = new Uint8Array( imageWidth * imageWidth * 4 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let faceIndex = 0; faceIndex < 6; faceIndex ++ ) {\n\n\t\t\tif ( renderer.isWebGLRenderer ) {\n\n\t\t\t\tawait renderer.readRenderTargetPixelsAsync( cubeRenderTarget, 0, 0, imageWidth, imageWidth, data, faceIndex );\n\n\t\t\t} else {\n\n\t\t\t\tdata = await renderer.readRenderTargetPixelsAsync( cubeRenderTarget, 0, 0, imageWidth, imageWidth, 0, faceIndex );\n\n\t\t\t}\n\n\t\t\tconst pixelSize = 2 / imageWidth;\n\n\t\t\tfor ( let i = 0, il = data.length; i < il; i += 4 ) { // RGBA assumed\n\n\t\t\t\tlet r, g, b;\n\n\t\t\t\tif ( dataType === FloatType ) {\n\n\t\t\t\t\tr = data[ i ];\n\t\t\t\t\tg = data[ i + 1 ];\n\t\t\t\t\tb = data[ i + 2 ];\n\n\t\t\t\t} else if ( dataType === HalfFloatType ) {\n\n\t\t\t\t\tr = DataUtils.fromHalfFloat( data[ i ] );\n\t\t\t\t\tg = DataUtils.fromHalfFloat( data[ i + 1 ] );\n\t\t\t\t\tb = DataUtils.fromHalfFloat( data[ i + 2 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tr = data[ i ] / 255;\n\t\t\t\t\tg = data[ i + 1 ] / 255;\n\t\t\t\t\tb = data[ i + 2 ] / 255;\n\n\t\t\t\t}\n\n\t\t\t\t// pixel color\n\t\t\t\tcolor.setRGB( r, g, b );\n\n\t\t\t\t// convert to linear color space\n\t\t\t\tconvertColorToLinear( color, cubeRenderTarget.texture.colorSpace );\n\n\t\t\t\t// pixel coordinate on unit cube\n\n\t\t\t\tconst pixelIndex = i / 4;\n\n\t\t\t\tconst col = ( 1 - ( pixelIndex % imageWidth + 0.5 ) * pixelSize ) * flip;\n\n\t\t\t\tconst row = 1 - ( Math.floor( pixelIndex / imageWidth ) + 0.5 ) * pixelSize;\n\n\t\t\t\tswitch ( faceIndex ) {\n\n\t\t\t\t\tcase 0: coord.set( - 1 * flip, row, col * flip ); break;\n\n\t\t\t\t\tcase 1: coord.set( 1 * flip, row, - col * flip ); break;\n\n\t\t\t\t\tcase 2: coord.set( col, 1, - row ); break;\n\n\t\t\t\t\tcase 3: coord.set( col, - 1, row ); break;\n\n\t\t\t\t\tcase 4: coord.set( col, row, 1 ); break;\n\n\t\t\t\t\tcase 5: coord.set( - col, row, - 1 ); break;\n\n\t\t\t\t}\n\n\t\t\t\t// weight assigned to this pixel\n\n\t\t\t\tconst lengthSq = coord.lengthSq();\n\n\t\t\t\tconst weight = 4 / ( Math.sqrt( lengthSq ) * lengthSq );\n\n\t\t\t\ttotalWeight += weight;\n\n\t\t\t\t// direction vector to this pixel\n\t\t\t\tdir.copy( coord ).normalize();\n\n\t\t\t\t// evaluate SH basis functions in direction dir\n\t\t\t\tSphericalHarmonics3.getBasisAt( dir, shBasis );\n\n\t\t\t\t// accumulate\n\t\t\t\tfor ( let j = 0; j < 9; j ++ ) {\n\n\t\t\t\t\tshCoefficients[ j ].x += shBasis[ j ] * color.r * weight;\n\t\t\t\t\tshCoefficients[ j ].y += shBasis[ j ] * color.g * weight;\n\t\t\t\t\tshCoefficients[ j ].z += shBasis[ j ] * color.b * weight;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// normalize\n\t\tconst norm = ( 4 * Math.PI ) / totalWeight;\n\n\t\tfor ( let j = 0; j < 9; j ++ ) {\n\n\t\t\tshCoefficients[ j ].x *= norm;\n\t\t\tshCoefficients[ j ].y *= norm;\n\t\t\tshCoefficients[ j ].z *= norm;\n\n\t\t}\n\n\t\treturn new LightProbe( sh );\n\n\t}\n\n}\n\nfunction convertColorToLinear( color, colorSpace ) {\n\n\tswitch ( colorSpace ) {\n\n\t\tcase SRGBColorSpace:\n\n\t\t\tcolor.convertSRGBToLinear();\n\t\t\tbreak;\n\n\t\tcase LinearSRGBColorSpace:\n\t\tcase NoColorSpace:\n\n\t\t\tbreak;\n\n\t\tdefault:\n\n\t\t\tconsole.warn( 'WARNING: LightProbeGenerator convertColorToLinear() encountered an unsupported color space.' );\n\t\t\tbreak;\n\n\t}\n\n\treturn color;\n\n}\n\nexport { LightProbeGenerator };\n", "import {\n\tClampToEdgeWrapping,\n\tDataTexture,\n\tDataUtils,\n\tFloatType,\n\tHalfFloatType,\n\tLinearFilter,\n\tNearestFilter,\n\tRGBAFormat,\n\tUVMapping\n} from 'three';\n\n/**\n * Texture library for {@link RectAreaLight}. This class holds the LTC BRDF data\n * in data textures for further use in the renderer.\n *\n * Reference: Real-Time Polygonal-Light Shading with Linearly Transformed Cosines\n * by Eric Heitz, Jonathan Dupuy, Stephen Hill and David Neubelt. [Code](https://github.com/selfshadow/ltc_code/).\n *\n * NOTE: This is a temporary location for the BRDF approximation texture data\n * based off of Eric Heitz's work (see citation). BRDF data for\n * `RectAreaLight` is currently approximated using a precomputed texture\n * of roughly 80kb in size. The hope is to find a better way to include\n * the large texture data before including the full RectAreaLight implementation\n * in the main build files.\n *\n * @hideconstructor\n * @three_import import { RectAreaLightTexturesLib } from 'three/addons/lights/RectAreaLightTexturesLib.js';\n */\nclass RectAreaLightTexturesLib {\n\n\t/**\n\t * Inits the texture library.\n\t *\n\t * @return {RectAreaLightTexturesLib}\n\t */\n\tstatic init() {\n\n\t\t// source: https://github.com/selfshadow/ltc_code/tree/master/fit/results/ltc.js\n\n\t\tconst LTC_MAT_1 = [ 1, 0, 0, 2e-05, 1, 0, 0, 0.000503905, 1, 0, 0, 0.00201562, 1, 0, 0, 0.00453516, 1, 0, 0, 0.00806253, 1, 0, 0, 0.0125978, 1, 0, 0, 0.018141, 1, 0, 0, 0.0246924, 1, 0, 0, 0.0322525, 1, 0, 0, 0.0408213, 1, 0, 0, 0.0503999, 1, 0, 0, 0.0609894, 1, 0, 0, 0.0725906, 1, 0, 0, 0.0852058, 1, 0, 0, 0.0988363, 1, 0, 0, 0.113484, 1, 0, 0, 0.129153, 1, 0, 0, 0.145839, 1, 0, 0, 0.163548, 1, 0, 0, 0.182266, 1, 0, 0, 0.201942, 1, 0, 0, 0.222314, 1, 0, 0, 0.241906, 1, 0, 0, 0.262314, 1, 0, 0, 0.285754, 1, 0, 0, 0.310159, 1, 0, 0, 0.335426, 1, 0, 0, 0.361341, 1, 0, 0, 0.387445, 1, 0, 0, 0.412784, 1, 0, 0, 0.438197, 1, 0, 0, 0.466966, 1, 0, 0, 0.49559, 1, 0, 0, 0.523448, 1, 0, 0, 0.549938, 1, 0, 0, 0.57979, 1, 0, 0, 0.608746, 1, 0, 0, 0.636185, 1, 0, 0, 0.664748, 1, 0, 0, 0.69313, 1, 0, 0, 0.71966, 1, 0, 0, 0.747662, 1, 0, 0, 0.774023, 1, 0, 0, 0.799775, 1, 0, 0, 0.825274, 1, 0, 0, 0.849156, 1, 0, 0, 0.873248, 1, 0, 0, 0.89532, 1, 0, 0, 0.917565, 1, 0, 0, 0.937863, 1, 0, 0, 0.958139, 1, 0, 0, 0.976563, 1, 0, 0, 0.994658, 1, 0, 0, 1.0112, 1, 0, 0, 1.02712, 1, 0, 0, 1.04189, 1, 0, 0, 1.05568, 1, 0, 0, 1.06877, 1, 0, 0, 1.08058, 1, 0, 0, 1.09194, 1, 0, 0, 1.10191, 1, 0, 0, 1.11161, 1, 0, 0, 1.1199, 1, 0, 0, 1.12813, 0.999547, - 4.48815e-07, 0.0224417, 1.99902e-05, 0.999495, - 1.13079e-05, 0.0224406, 0.000503651, 0.999496, - 4.52317e-05, 0.0224406, 0.00201461, 0.999496, - 0.000101772, 0.0224406, 0.00453287, 0.999495, - 0.000180928, 0.0224406, 0.00805845, 0.999497, - 0.000282702, 0.0224406, 0.0125914, 0.999496, - 0.000407096, 0.0224406, 0.0181319, 0.999498, - 0.000554114, 0.0224406, 0.02468, 0.999499, - 0.000723768, 0.0224406, 0.0322363, 0.999495, - 0.000916058, 0.0224405, 0.0408009, 0.999499, - 0.00113101, 0.0224408, 0.050375, 0.999494, - 0.00136863, 0.0224405, 0.0609586, 0.999489, - 0.00162896, 0.0224401, 0.0725537, 0.999489, - 0.00191201, 0.0224414, 0.0851619, 0.999498, - 0.00221787, 0.0224413, 0.0987867, 0.999492, - 0.00254642, 0.0224409, 0.113426, 0.999507, - 0.00289779, 0.0224417, 0.129088, 0.999494, - 0.0032716, 0.0224386, 0.145767, 0.999546, - 0.0036673, 0.0224424, 0.163472, 0.999543, - 0.00408166, 0.0224387, 0.182182, 0.999499, - 0.00450056, 0.0224338, 0.201843, 0.999503, - 0.00483661, 0.0224203, 0.222198, 0.999546, - 0.00452928, 0.022315, 0.241714, 0.999508, - 0.00587403, 0.0224329, 0.262184, 0.999509, - 0.00638806, 0.0224271, 0.285609, 0.999501, - 0.00691028, 0.0224166, 0.309998, 0.999539, - 0.00741979, 0.0223989, 0.335262, 0.999454, - 0.00786282, 0.0223675, 0.361154, 0.999529, - 0.00811928, 0.0222828, 0.387224, 0.999503, - 0.00799941, 0.0221063, 0.41252, 0.999561, - 0.00952753, 0.0223057, 0.438006, 0.999557, - 0.0099134, 0.0222065, 0.466735, 0.999541, - 0.0100935, 0.0220402, 0.495332, 0.999562, - 0.00996821, 0.0218067, 0.523197, 0.999556, - 0.0105031, 0.0217096, 0.550223, 0.999561, - 0.0114191, 0.0217215, 0.579498, 0.999588, - 0.0111818, 0.0213357, 0.608416, 0.999633, - 0.0107725, 0.0208689, 0.635965, 0.999527, - 0.0121671, 0.0210149, 0.664476, 0.999508, - 0.0116005, 0.020431, 0.692786, 0.999568, - 0.0115604, 0.0199791, 0.719709, 0.999671, - 0.0121117, 0.0197415, 0.74737, 0.999688, - 0.0110769, 0.0188846, 0.773692, 0.99962, - 0.0122368, 0.0188452, 0.799534, 0.999823, - 0.0110325, 0.0178001, 0.825046, 0.999599, - 0.0114923, 0.0174221, 0.849075, 0.999619, - 0.0105923, 0.0164345, 0.872999, 0.999613, - 0.0105988, 0.0158227, 0.895371, 0.99964, - 0.00979861, 0.0148131, 0.917364, 0.99977, - 0.00967238, 0.0140721, 0.938002, 0.999726, - 0.00869175, 0.0129543, 0.957917, 0.99973, - 0.00866872, 0.0122329, 0.976557, 0.999773, - 0.00731956, 0.0108958, 0.994459, 0.999811, - 0.00756027, 0.0102715, 1.01118, 0.999862, - 0.00583732, 0.00878781, 1.02701, 0.999835, - 0.00631438, 0.00827529, 1.04186, 0.999871, - 0.00450785, 0.00674583, 1.05569, 0.999867, - 0.00486079, 0.00621041, 1.06861, 0.999939, - 0.00322072, 0.00478301, 1.08064, 0.999918, - 0.00318199, 0.00406395, 1.09181, 1.00003, - 0.00193348, 0.00280682, 1.10207, 0.999928, - 0.00153729, 0.00198741, 1.11152, 0.999933, - 0.000623666, 0.000917714, 1.12009, 1, - 1.02387e-06, 9.07581e-07, 1.12813, 0.997866, - 8.96716e-07, 0.0448334, 1.99584e-05, 0.997987, - 2.25945e-05, 0.0448389, 0.000502891, 0.997987, - 9.03781e-05, 0.0448388, 0.00201156, 0.997985, - 0.000203351, 0.0448388, 0.00452602, 0.997986, - 0.000361514, 0.0448388, 0.00804629, 0.997987, - 0.00056487, 0.0448389, 0.0125724, 0.997988, - 0.000813423, 0.0448389, 0.0181045, 0.997984, - 0.00110718, 0.0448387, 0.0246427, 0.997985, - 0.00144616, 0.0448388, 0.0321875, 0.997987, - 0.00183038, 0.044839, 0.0407392, 0.997983, - 0.00225987, 0.0448387, 0.0502986, 0.997991, - 0.00273467, 0.0448389, 0.0608667, 0.997984, - 0.00325481, 0.0448384, 0.0724444, 0.998002, - 0.00382043, 0.044839, 0.0850348, 0.997997, - 0.00443145, 0.0448396, 0.0986372, 0.998007, - 0.00508796, 0.0448397, 0.113255, 0.998008, - 0.00578985, 0.04484, 0.128891, 0.998003, - 0.00653683, 0.0448384, 0.145548, 0.997983, - 0.00732713, 0.0448358, 0.163221, 0.997985, - 0.00815454, 0.0448358, 0.181899, 0.998005, - 0.00898985, 0.0448286, 0.201533, 0.998026, - 0.00964404, 0.0447934, 0.221821, 0.998055, - 0.00922677, 0.044611, 0.241282, 0.99804, - 0.0117361, 0.0448245, 0.261791, 0.998048, - 0.0127628, 0.0448159, 0.285181, 0.998088, - 0.0138055, 0.0447996, 0.30954, 0.998058, - 0.0148206, 0.0447669, 0.334751, 0.998099, - 0.0156998, 0.044697, 0.36061, 0.998116, - 0.0161976, 0.0445122, 0.386603, 0.998195, - 0.015945, 0.0441711, 0.411844, 0.998168, - 0.0183947, 0.0444255, 0.43773, 0.998184, - 0.0197913, 0.0443809, 0.466009, 0.998251, - 0.0201426, 0.0440689, 0.494574, 0.998305, - 0.0198847, 0.0435632, 0.522405, 0.998273, - 0.0210577, 0.043414, 0.549967, 0.998254, - 0.0227901, 0.0433943, 0.578655, 0.998349, - 0.0223108, 0.0426529, 0.60758, 0.99843, - 0.0223088, 0.042, 0.635524, 0.998373, - 0.0241141, 0.0418987, 0.663621, 0.998425, - 0.0231446, 0.0408118, 0.691906, 0.998504, - 0.0233684, 0.0400565, 0.719339, 0.998443, - 0.0241652, 0.0394634, 0.74643, 0.99848, - 0.0228715, 0.0380002, 0.773086, 0.998569, - 0.023519, 0.0372322, 0.798988, 0.998619, - 0.0223108, 0.0356468, 0.824249, 0.998594, - 0.0223105, 0.034523, 0.848808, 0.998622, - 0.0213426, 0.0328887, 0.87227, 0.998669, - 0.0207912, 0.0314374, 0.895157, 0.998705, - 0.0198416, 0.0296925, 0.916769, 0.998786, - 0.0189168, 0.0279634, 0.937773, 0.998888, - 0.0178811, 0.0261597, 0.957431, 0.99906, - 0.0166845, 0.0242159, 0.976495, 0.999038, - 0.0155464, 0.0222638, 0.994169, 0.999237, - 0.0141349, 0.0201967, 1.01112, 0.999378, - 0.0129324, 0.0181744, 1.02692, 0.999433, - 0.0113192, 0.0159898, 1.04174, 0.999439, - 0.0101244, 0.0140385, 1.05559, 0.999614, - 0.00837456, 0.0117826, 1.06852, 0.999722, - 0.00721769, 0.00983745, 1.08069, 0.999817, - 0.00554067, 0.00769002, 1.09176, 0.99983, - 0.00426961, 0.005782, 1.10211, 0.999964, - 0.00273904, 0.00374503, 1.11152, 1.00001, - 0.00136739, 0.00187176, 1.12031, 0.999946, 3.93227e-05, - 2.8919e-05, 1.12804, 0.995847, - 1.3435e-06, 0.0671785, 1.9916e-05, 0.995464, - 3.38387e-05, 0.0671527, 0.000501622, 0.99547, - 0.000135355, 0.0671531, 0.00200649, 0.995471, - 0.00030455, 0.0671532, 0.00451461, 0.99547, - 0.000541423, 0.0671531, 0.008026, 0.995471, - 0.00084598, 0.0671531, 0.0125407, 0.99547, - 0.00121823, 0.0671531, 0.0180589, 0.99547, - 0.00165817, 0.0671531, 0.0245806, 0.995463, - 0.00216583, 0.0671526, 0.0321062, 0.995468, - 0.00274127, 0.0671527, 0.0406366, 0.995474, - 0.00338447, 0.0671534, 0.0501717, 0.995473, - 0.00409554, 0.0671533, 0.0607131, 0.995478, - 0.00487451, 0.0671531, 0.0722618, 0.995476, - 0.00572148, 0.0671532, 0.0848191, 0.995477, - 0.00663658, 0.0671539, 0.0983882, 0.995498, - 0.00761986, 0.0671541, 0.112972, 0.995509, - 0.00867094, 0.0671542, 0.128568, 0.995509, - 0.00978951, 0.0671531, 0.145183, 0.995503, - 0.0109725, 0.0671491, 0.162808, 0.995501, - 0.012211, 0.0671465, 0.181441, 0.99553, - 0.0134565, 0.0671371, 0.201015, 0.99555, - 0.014391, 0.0670831, 0.221206, 0.99558, - 0.014351, 0.0668883, 0.240813, 0.995577, - 0.0173997, 0.0671055, 0.261257, 0.995602, - 0.0191111, 0.0671178, 0.284467, 0.995623, - 0.0206705, 0.0670946, 0.308765, 0.995658, - 0.022184, 0.0670472, 0.333905, 0.995705, - 0.0234832, 0.0669417, 0.359677, 0.995719, - 0.0241933, 0.0666714, 0.385554, 0.995786, - 0.0243539, 0.066266, 0.410951, 0.995887, - 0.0271866, 0.0664367, 0.437163, 0.995944, - 0.0296012, 0.0664931, 0.464842, 0.996004, - 0.0301045, 0.0660105, 0.49332, 0.996128, - 0.0298311, 0.0652694, 0.521131, 0.996253, - 0.0316426, 0.0650739, 0.549167, 0.996244, - 0.0339043, 0.0649433, 0.57737, 0.996309, - 0.033329, 0.0638926, 0.606073, 0.996417, - 0.0338935, 0.0630849, 0.634527, 0.996372, - 0.0353104, 0.0625083, 0.66256, 0.996542, - 0.0348942, 0.0611986, 0.690516, 0.996568, - 0.0351614, 0.060069, 0.718317, 0.996711, - 0.0354317, 0.0588522, 0.74528, 0.996671, - 0.0349513, 0.0571902, 0.772061, 0.996865, - 0.0345622, 0.0555321, 0.798089, 0.996802, - 0.0342566, 0.0537816, 0.823178, 0.996992, - 0.0330862, 0.0516095, 0.847949, 0.996944, - 0.0324666, 0.0495537, 0.871431, 0.997146, - 0.0309544, 0.0470302, 0.894357, 0.997189, - 0.0299372, 0.0446043, 0.916142, 0.997471, - 0.0281389, 0.0418812, 0.937193, 0.997515, - 0.0268702, 0.0391823, 0.957, 0.997812, - 0.0247166, 0.0361338, 0.975936, 0.998027, - 0.0233525, 0.0333945, 0.99391, 0.998233, - 0.0209839, 0.0301917, 1.01075, 0.998481, - 0.0194309, 0.027271, 1.02669, 0.998859, - 0.0169728, 0.0240162, 1.04173, 0.99894, - 0.0152322, 0.0210517, 1.05551, 0.999132, - 0.0127497, 0.0178632, 1.06856, 0.999369, - 0.0108282, 0.014787, 1.08054, 0.999549, - 0.00845886, 0.0116185, 1.09185, 0.999805, - 0.0063937, 0.00867209, 1.10207, 0.99985, - 0.00414582, 0.00566823, 1.1117, 0.999912, - 0.00207443, 0.00277562, 1.12022, 1.00001, 8.70226e-05, - 5.3766e-05, 1.12832, 0.991943, - 1.78672e-06, 0.0893382, 1.98384e-05, 0.991952, - 4.50183e-05, 0.089339, 0.000499849, 0.991956, - 0.000180074, 0.0893394, 0.0019994, 0.991955, - 0.000405167, 0.0893393, 0.00449867, 0.991953, - 0.000720298, 0.0893391, 0.00799764, 0.991955, - 0.00112548, 0.0893393, 0.0124964, 0.991957, - 0.0016207, 0.0893395, 0.0179951, 0.991958, - 0.00220601, 0.0893396, 0.0244939, 0.991947, - 0.00288137, 0.0893385, 0.0319929, 0.991962, - 0.00364693, 0.0893399, 0.0404933, 0.991965, - 0.00450264, 0.0893399, 0.049995, 0.99198, - 0.00544862, 0.0893411, 0.0604995, 0.99197, - 0.00648491, 0.0893397, 0.0720074, 0.991976, - 0.00761164, 0.089341, 0.0845207, 0.99198, - 0.00882891, 0.0893405, 0.0980413, 0.991982, - 0.0101367, 0.0893396, 0.112571, 0.992008, - 0.011535, 0.0893415, 0.128115, 0.992026, - 0.0130228, 0.0893414, 0.144672, 0.992064, - 0.0145966, 0.0893418, 0.162241, 0.992041, - 0.0162421, 0.0893359, 0.180801, 0.992086, - 0.0178888, 0.0893214, 0.200302, 0.992157, - 0.0190368, 0.0892401, 0.220332, 0.992181, - 0.0195584, 0.0890525, 0.240144, 0.992175, - 0.0227257, 0.0892153, 0.260728, 0.99221, - 0.0254195, 0.089304, 0.283473, 0.99222, - 0.0274883, 0.0892703, 0.307673, 0.992317, - 0.0294905, 0.0892027, 0.332729, 0.992374, - 0.0311861, 0.0890577, 0.358387, 0.992505, - 0.0320656, 0.0886994, 0.384102, 0.992568, - 0.0329715, 0.0883198, 0.409767, 0.992675, - 0.036006, 0.0883602, 0.436145, 0.992746, - 0.0392897, 0.0884591, 0.463217, 0.992873, - 0.0399337, 0.0878287, 0.491557, 0.992934, - 0.040231, 0.0870108, 0.519516, 0.993091, - 0.0422013, 0.0865857, 0.547741, 0.993259, - 0.0443503, 0.0861937, 0.575792, 0.993455, - 0.0446368, 0.0851187, 0.604233, 0.993497, - 0.0454299, 0.0840576, 0.632925, 0.993694, - 0.0463296, 0.0829671, 0.660985, 0.993718, - 0.0470619, 0.0817185, 0.688714, 0.993973, - 0.0468838, 0.0800294, 0.716743, 0.994207, - 0.046705, 0.0781286, 0.74377, 0.994168, - 0.0469698, 0.0763337, 0.77042, 0.9945, - 0.0456816, 0.0738184, 0.796659, 0.994356, - 0.0455518, 0.0715545, 0.821868, 0.994747, - 0.0439488, 0.0686085, 0.846572, 0.994937, - 0.0430056, 0.065869, 0.870435, 0.995142, - 0.0413414, 0.0626446, 0.893272, 0.995451, - 0.0396521, 0.05929, 0.915376, 0.995445, - 0.0378453, 0.0558503, 0.936196, 0.995967, - 0.0355219, 0.0520949, 0.956376, 0.996094, - 0.0335146, 0.048377, 0.975327, 0.996622, - 0.030682, 0.0442575, 0.993471, 0.996938, - 0.0285504, 0.0404693, 1.01052, 0.997383, - 0.0253399, 0.0360903, 1.02637, 0.997714, - 0.0231651, 0.0322176, 1.04139, 0.998249, - 0.0198138, 0.0278433, 1.05542, 0.998596, - 0.0174337, 0.0238759, 1.06846, 0.998946, - 0.0141349, 0.0195944, 1.08056, 0.99928, - 0.0115603, 0.0156279, 1.09181, 0.999507, - 0.00839065, 0.0114607, 1.10213, 0.999697, - 0.005666, 0.00763325, 1.11169, 0.999869, - 0.00269902, 0.00364946, 1.12042, 1.00001, 6.23836e-05, - 3.19288e-05, 1.12832, 0.987221, - 2.22675e-06, 0.111332, 1.97456e-05, 0.98739, - 5.61116e-05, 0.111351, 0.000497563, 0.987448, - 0.000224453, 0.111357, 0.00199031, 0.987441, - 0.000505019, 0.111357, 0.0044782, 0.987442, - 0.000897816, 0.111357, 0.00796129, 0.987442, - 0.00140284, 0.111357, 0.0124396, 0.987444, - 0.00202012, 0.111357, 0.0179132, 0.987442, - 0.00274964, 0.111357, 0.0243824, 0.987446, - 0.00359147, 0.111357, 0.0318474, 0.987435, - 0.00454562, 0.111356, 0.0403086, 0.987461, - 0.00561225, 0.111358, 0.0497678, 0.987458, - 0.00679125, 0.111358, 0.0602239, 0.987443, - 0.0080828, 0.111356, 0.0716792, 0.987476, - 0.0094872, 0.111358, 0.0841364, 0.98749, - 0.0110044, 0.111361, 0.097597, 0.987508, - 0.0126344, 0.111362, 0.112062, 0.987494, - 0.0143767, 0.111357, 0.127533, 0.987526, - 0.0162307, 0.111359, 0.144015, 0.987558, - 0.0181912, 0.111361, 0.161502, 0.987602, - 0.0202393, 0.111355, 0.179979, 0.987692, - 0.022273, 0.111346, 0.199386, 0.987702, - 0.0235306, 0.111215, 0.219183, 0.987789, - 0.0247628, 0.111061, 0.239202, 0.987776, - 0.0280668, 0.111171, 0.259957, 0.987856, - 0.0316751, 0.111327, 0.282198, 0.987912, - 0.0342468, 0.111282, 0.306294, 0.988, - 0.0367205, 0.111198, 0.331219, 0.988055, - 0.0387766, 0.110994, 0.356708, 0.988241, - 0.0397722, 0.110547, 0.382234, 0.988399, - 0.0416076, 0.110198, 0.408227, 0.988539, - 0.0448192, 0.110137, 0.434662, 0.988661, - 0.0483793, 0.110143, 0.461442, 0.988967, - 0.0495895, 0.109453, 0.489318, 0.989073, - 0.0506797, 0.108628, 0.517516, 0.989274, - 0.0526953, 0.108003, 0.545844, 0.989528, - 0.054578, 0.107255, 0.573823, 0.989709, - 0.0561503, 0.106294, 0.601944, 0.989991, - 0.056866, 0.104896, 0.630855, 0.990392, - 0.0572914, 0.103336, 0.658925, 0.990374, - 0.0586224, 0.10189, 0.686661, 0.990747, - 0.0584764, 0.099783, 0.714548, 0.991041, - 0.0582662, 0.0974309, 0.74186, 0.991236, - 0.0584118, 0.0951678, 0.768422, 0.991585, - 0.0573055, 0.0921581, 0.794817, 0.991984, - 0.0564241, 0.0891167, 0.820336, 0.9921, - 0.0553608, 0.085805, 0.84493, 0.992749, - 0.0533816, 0.0820354, 0.868961, 0.99288, - 0.0518661, 0.0782181, 0.891931, 0.993511, - 0.0492492, 0.0738935, 0.914186, 0.993617, - 0.0471956, 0.0696402, 0.93532, 0.99411, - 0.044216, 0.0649659, 0.95543, 0.994595, - 0.0416654, 0.0603177, 0.974685, 0.994976, - 0.0384314, 0.0553493, 0.992807, 0.995579, - 0.0353491, 0.0503942, 1.00996, 0.996069, - 0.0319787, 0.0452123, 1.02606, 0.996718, - 0.028472, 0.0400112, 1.04114, 0.997173, - 0.0250789, 0.0349456, 1.05517, 0.997818, - 0.0213326, 0.029653, 1.0683, 0.998318, - 0.0178509, 0.024549, 1.0805, 0.998853, - 0.0141118, 0.0194197, 1.09177, 0.999218, - 0.0105914, 0.0143869, 1.1022, 0.999594, - 0.00693474, 0.00943517, 1.11175, 0.99975, - 0.00340478, 0.00464051, 1.12056, 1.00001, 0.000109172, - 0.000112821, 1.12853, 0.983383, - 2.66524e-06, 0.133358, 1.96534e-05, 0.981942, - 6.71009e-05, 0.133162, 0.000494804, 0.981946, - 0.000268405, 0.133163, 0.00197923, 0.981944, - 0.000603912, 0.133163, 0.00445326, 0.981941, - 0.00107362, 0.133162, 0.00791693, 0.981946, - 0.00167755, 0.133163, 0.0123703, 0.981944, - 0.00241569, 0.133162, 0.0178135, 0.981945, - 0.00328807, 0.133163, 0.0242466, 0.981945, - 0.00429472, 0.133162, 0.03167, 0.981955, - 0.00543573, 0.133164, 0.0400846, 0.981951, - 0.00671105, 0.133163, 0.0494901, 0.981968, - 0.00812092, 0.133165, 0.0598886, 0.981979, - 0.00966541, 0.133166, 0.0712811, 0.981996, - 0.0113446, 0.133168, 0.083669, 0.982014, - 0.0131585, 0.133169, 0.0970533, 0.982011, - 0.0151073, 0.133167, 0.111438, 0.982062, - 0.0171906, 0.133172, 0.126826, 0.9821, - 0.0194067, 0.133175, 0.143215, 0.982149, - 0.0217502, 0.133176, 0.160609, 0.982163, - 0.0241945, 0.133173, 0.178981, 0.982247, - 0.0265907, 0.133148, 0.198249, 0.982291, - 0.027916, 0.132974, 0.217795, 0.982396, - 0.0299663, 0.132868, 0.238042, 0.982456, - 0.0334544, 0.132934, 0.258901, 0.982499, - 0.0378636, 0.133137, 0.280639, 0.982617, - 0.0409274, 0.133085, 0.304604, 0.98274, - 0.0438523, 0.132985, 0.329376, 0.982944, - 0.0462288, 0.132728, 0.354697, 0.98308, - 0.0475995, 0.132228, 0.380102, 0.983391, - 0.0501901, 0.131924, 0.406256, 0.983514, - 0.0535899, 0.131737, 0.432735, 0.98373, - 0.0571858, 0.131567, 0.459359, 0.984056, - 0.0592353, 0.130932, 0.486637, 0.984234, - 0.0610488, 0.130092, 0.51509, 0.984748, - 0.0630758, 0.12923, 0.543461, 0.985073, - 0.0647398, 0.128174, 0.571376, 0.985195, - 0.0671941, 0.127133, 0.599414, 0.985734, - 0.0681345, 0.125576, 0.628134, 0.986241, - 0.0686089, 0.123639, 0.656399, 0.986356, - 0.0698511, 0.121834, 0.684258, 0.986894, - 0.0700931, 0.119454, 0.711818, 0.987382, - 0.0698321, 0.116718, 0.739511, 0.988109, - 0.0693975, 0.113699, 0.766267, 0.988363, - 0.0689584, 0.110454, 0.792456, 0.989112, - 0.0672353, 0.106602, 0.81813, 0.989241, - 0.0662034, 0.10267, 0.842889, 0.990333, - 0.0638938, 0.0981381, 0.867204, 0.990591, - 0.0618534, 0.0935388, 0.89038, 0.991106, - 0.0593117, 0.088553, 0.912576, 0.991919, - 0.0562676, 0.0832187, 0.934118, 0.992111, - 0.0534085, 0.0778302, 0.954254, 0.992997, - 0.0495459, 0.0720453, 0.973722, 0.993317, - 0.0463707, 0.0663458, 0.991949, 0.994133, - 0.0421245, 0.0601883, 1.00936, 0.994705, - 0.0384977, 0.0542501, 1.02559, 0.995495, - 0.0340956, 0.0479862, 1.04083, 0.996206, - 0.030105, 0.041887, 1.05497, 0.996971, - 0.0256095, 0.0355355, 1.06824, 0.997796, - 0.0213932, 0.0293655, 1.08056, 0.998272, - 0.0169612, 0.0232926, 1.09182, 0.998857, - 0.0126756, 0.0172786, 1.10219, 0.99939, - 0.00832486, 0.0113156, 1.11192, 0.999752, - 0.00410826, 0.00557892, 1.12075, 1, 0.000150957, - 0.000119101, 1.12885, 0.975169, - 3.09397e-06, 0.154669, 1.95073e-05, 0.975439, - 7.79608e-05, 0.154712, 0.000491534, 0.975464, - 0.000311847, 0.154716, 0.00196617, 0.975464, - 0.000701656, 0.154716, 0.00442387, 0.975462, - 0.0012474, 0.154715, 0.0078647, 0.975461, - 0.00194906, 0.154715, 0.0122886, 0.975464, - 0.00280667, 0.154715, 0.0176959, 0.975468, - 0.00382025, 0.154716, 0.0240867, 0.975471, - 0.00498985, 0.154716, 0.0314612, 0.975472, - 0.00631541, 0.154717, 0.0398199, 0.975486, - 0.00779719, 0.154718, 0.0491639, 0.975489, - 0.00943505, 0.154718, 0.0594932, 0.975509, - 0.0112295, 0.154721, 0.0708113, 0.97554, - 0.0131802, 0.154724, 0.0831176, 0.975557, - 0.0152876, 0.154726, 0.096415, 0.975585, - 0.0175512, 0.154728, 0.110705, 0.975605, - 0.0199713, 0.154729, 0.125992, 0.975645, - 0.0225447, 0.154729, 0.142272, 0.975711, - 0.0252649, 0.154735, 0.159549, 0.975788, - 0.0280986, 0.154736, 0.177805, 0.975872, - 0.0308232, 0.154704, 0.196911, 0.975968, - 0.0324841, 0.154525, 0.216324, 0.976063, - 0.0351281, 0.154432, 0.236628, 0.976157, - 0.0388618, 0.15446, 0.257539, 0.976204, - 0.0437704, 0.154665, 0.278975, 0.976358, - 0.047514, 0.154652, 0.302606, 0.976571, - 0.0508638, 0.154535, 0.327204, 0.976725, - 0.0534995, 0.154221, 0.352276, 0.977013, - 0.0555547, 0.153737, 0.377696, 0.977294, - 0.0586728, 0.153403, 0.403855, 0.977602, - 0.0622715, 0.15312, 0.430333, 0.977932, - 0.0658166, 0.152755, 0.456855, 0.978241, - 0.0689877, 0.152233, 0.483668, 0.978602, - 0.0712805, 0.15132, 0.512097, 0.979234, - 0.0732775, 0.150235, 0.540455, 0.97977, - 0.075163, 0.148978, 0.568486, 0.979995, - 0.0778026, 0.147755, 0.596524, 0.98078, - 0.0791854, 0.146019, 0.624825, 0.981628, - 0.0799666, 0.143906, 0.653403, 0.982067, - 0.0808532, 0.141561, 0.681445, 0.98271, - 0.0816024, 0.139025, 0.708918, 0.983734, - 0.0812511, 0.135764, 0.736594, 0.98431, - 0.0806201, 0.132152, 0.763576, 0.985071, - 0.0801605, 0.12846, 0.789797, 0.98618, - 0.0784208, 0.124084, 0.815804, 0.986886, - 0.0766643, 0.1193, 0.840869, 0.987485, - 0.0747744, 0.114236, 0.864952, 0.988431, - 0.0716701, 0.108654, 0.888431, 0.988886, - 0.0691609, 0.102994, 0.910963, 0.990024, - 0.0654048, 0.0967278, 0.932629, 0.990401, - 0.0619765, 0.090384, 0.95313, 0.991093, - 0.0579296, 0.0837885, 0.972587, 0.992018, - 0.0536576, 0.0770171, 0.991184, 0.992536, - 0.0493719, 0.0701486, 1.00863, 0.993421, - 0.0444813, 0.062953, 1.02494, 0.993928, - 0.040008, 0.0560455, 1.04017, 0.994994, - 0.0347982, 0.04856, 1.05463, 0.995866, - 0.0301017, 0.0416152, 1.06807, 0.996916, - 0.0248225, 0.0342597, 1.08039, 0.997766, - 0.0199229, 0.0271668, 1.09177, 0.998479, - 0.0147422, 0.0201387, 1.10235, 0.99921, - 0.00980173, 0.0131944, 1.11206, 0.999652, - 0.0047426, 0.00640712, 1.12104, 0.999998, 8.91673e-05, - 0.00010379, 1.12906, 0.967868, - 3.51885e-06, 0.175947, 1.93569e-05, 0.968001, - 8.86733e-05, 0.175972, 0.000487782, 0.96801, - 0.000354697, 0.175973, 0.00195115, 0.968012, - 0.000798063, 0.175974, 0.00439006, 0.968011, - 0.00141879, 0.175973, 0.00780461, 0.968011, - 0.00221686, 0.175973, 0.0121948, 0.968016, - 0.00319231, 0.175974, 0.0175607, 0.968019, - 0.00434515, 0.175974, 0.0239027, 0.968018, - 0.00567538, 0.175974, 0.0312208, 0.968033, - 0.00718308, 0.175977, 0.0395158, 0.968049, - 0.00886836, 0.175979, 0.0487885, 0.968047, - 0.0107312, 0.175978, 0.0590394, 0.968072, - 0.0127719, 0.175981, 0.0702705, 0.968108, - 0.0149905, 0.175986, 0.0824836, 0.968112, - 0.0173866, 0.175985, 0.0956783, 0.968173, - 0.0199611, 0.175993, 0.109862, 0.96827, - 0.0227128, 0.176008, 0.125033, 0.968292, - 0.025639, 0.17601, 0.141193, 0.968339, - 0.0287299, 0.176007, 0.158336, 0.968389, - 0.0319399, 0.176001, 0.176441, 0.968501, - 0.034941, 0.175962, 0.195359, 0.968646, - 0.0370812, 0.175793, 0.214686, 0.968789, - 0.0402329, 0.175708, 0.234973, 0.96886, - 0.0442601, 0.1757, 0.255871, 0.969013, - 0.049398, 0.175876, 0.277238, 0.969242, - 0.0539932, 0.17594, 0.300326, 0.969419, - 0.0577299, 0.175781, 0.324702, 0.969763, - 0.0605643, 0.175432, 0.349527, 0.970093, - 0.0634488, 0.174992, 0.374976, 0.970361, - 0.0670589, 0.174611, 0.401097, 0.970825, - 0.0708246, 0.174226, 0.427496, 0.971214, - 0.0742871, 0.173684, 0.453858, 0.971622, - 0.0782608, 0.173186, 0.480637, 0.972175, - 0.0813151, 0.172288, 0.508655, 0.972944, - 0.0832678, 0.170979, 0.536973, 0.973595, - 0.0855964, 0.169573, 0.565138, 0.974345, - 0.0882163, 0.168152, 0.593222, 0.975233, - 0.0901671, 0.166314, 0.621201, 0.976239, - 0.0912111, 0.163931, 0.649919, 0.977289, - 0.0916959, 0.161106, 0.678011, 0.978076, - 0.0927061, 0.158272, 0.705717, 0.979533, - 0.0925562, 0.15475, 0.733228, 0.980335, - 0.0918159, 0.150638, 0.760454, 0.981808, - 0.0908508, 0.146201, 0.786918, 0.983061, - 0.0896172, 0.141386, 0.812953, 0.984148, - 0.0871588, 0.135837, 0.838281, 0.985047, - 0.0850624, 0.130135, 0.862594, 0.986219, - 0.0818541, 0.123882, 0.88633, 0.987043, - 0.0784523, 0.117126, 0.908952, 0.988107, - 0.0749601, 0.110341, 0.930744, 0.988955, - 0.0703548, 0.102885, 0.951728, 0.989426, - 0.0662798, 0.0954167, 0.971166, 0.990421, - 0.0610834, 0.0876331, 0.989984, 0.991032, - 0.0562936, 0.0797785, 1.00765, 0.992041, - 0.0508154, 0.0718166, 1.02434, 0.992794, - 0.0454045, 0.0637125, 1.03976, 0.993691, - 0.0398194, 0.0555338, 1.05418, 0.994778, - 0.0341482, 0.0473388, 1.06772, 0.995915, - 0.028428, 0.0391016, 1.08028, 0.997109, - 0.022642, 0.0309953, 1.09185, 0.998095, - 0.0168738, 0.0230288, 1.10247, 0.998985, - 0.0111274, 0.0150722, 1.11229, 0.999581, - 0.00543881, 0.00740605, 1.12131, 1.00003, 0.000162239, - 0.000105549, 1.12946, 0.959505, - 3.93734e-06, 0.196876, 1.91893e-05, 0.959599, - 9.92157e-05, 0.196895, 0.000483544, 0.959641, - 0.000396868, 0.196903, 0.0019342, 0.959599, - 0.000892948, 0.196895, 0.00435193, 0.959603, - 0.00158747, 0.196896, 0.0077368, 0.959604, - 0.00248042, 0.196896, 0.0120888, 0.959605, - 0.00357184, 0.196896, 0.0174082, 0.959605, - 0.00486169, 0.196896, 0.0236949, 0.959613, - 0.00635008, 0.196897, 0.0309497, 0.959619, - 0.00803696, 0.196898, 0.0391725, 0.959636, - 0.00992255, 0.196901, 0.0483649, 0.959634, - 0.0120067, 0.1969, 0.0585266, 0.959675, - 0.0142898, 0.196906, 0.0696609, 0.959712, - 0.0167717, 0.196911, 0.0817678, 0.959752, - 0.0194524, 0.196918, 0.0948494, 0.959807, - 0.0223321, 0.196925, 0.10891, 0.959828, - 0.0254091, 0.196924, 0.123947, 0.959906, - 0.0286815, 0.196934, 0.139968, 0.960005, - 0.0321371, 0.196944, 0.156968, 0.960071, - 0.0357114, 0.196936, 0.17491, 0.960237, - 0.0389064, 0.196882, 0.193597, 0.960367, - 0.041623, 0.196731, 0.21285, 0.960562, - 0.0452655, 0.196654, 0.233075, 0.960735, - 0.0496207, 0.196643, 0.253941, 0.960913, - 0.0549379, 0.196774, 0.275278, 0.961121, - 0.0603414, 0.196893, 0.297733, 0.96139, - 0.0644244, 0.196717, 0.321877, 0.961818, - 0.067556, 0.196314, 0.346476, 0.962175, - 0.0712709, 0.195917, 0.371907, 0.96255, - 0.0752848, 0.1955, 0.397916, 0.963164, - 0.0792073, 0.195026, 0.424229, 0.963782, - 0.0828225, 0.194424, 0.450637, 0.964306, - 0.0873119, 0.193831, 0.477288, 0.964923, - 0.0911051, 0.192973, 0.504716, 0.966048, - 0.093251, 0.19151, 0.533053, 0.967024, - 0.0958983, 0.190013, 0.561366, 0.968038, - 0.09835, 0.188253, 0.589464, 0.969152, - 0.100754, 0.186257, 0.617433, 0.970557, - 0.102239, 0.183775, 0.645801, 0.972104, - 0.102767, 0.180645, 0.674278, 0.973203, - 0.103492, 0.177242, 0.702004, 0.975123, - 0.103793, 0.17345, 0.729529, 0.97641, - 0.102839, 0.168886, 0.756712, 0.978313, - 0.101687, 0.163892, 0.783801, 0.980036, - 0.100314, 0.158439, 0.809671, 0.981339, - 0.097836, 0.152211, 0.835402, 0.982794, - 0.0950006, 0.145679, 0.860081, 0.984123, - 0.0920994, 0.138949, 0.883757, 0.984918, - 0.0878641, 0.131283, 0.90685, 0.985999, - 0.083939, 0.123464, 0.928786, 0.987151, - 0.0791234, 0.115324, 0.94983, 0.987827, - 0.0739332, 0.106854, 0.96962, 0.988806, - 0.0688088, 0.0982691, 0.98861, 0.989588, - 0.0628962, 0.0893456, 1.00667, 0.990438, - 0.0573146, 0.0805392, 1.02344, 0.991506, - 0.0509433, 0.0713725, 1.03933, 0.992492, - 0.0448724, 0.0623732, 1.05378, 0.993663, - 0.0383497, 0.0530838, 1.06747, 0.994956, - 0.0319593, 0.0439512, 1.08007, 0.99634, - 0.025401, 0.0347803, 1.09182, 0.99761, - 0.0189687, 0.0257954, 1.1025, 0.99863, - 0.0124441, 0.0169893, 1.11247, 0.99947, - 0.00614003, 0.00829498, 1.12151, 1.00008, 0.000216624, - 0.000146107, 1.12993, 0.950129, - 4.34955e-06, 0.217413, 1.90081e-05, 0.950264, - 0.00010957, 0.217444, 0.00047884, 0.9503, - 0.000438299, 0.217451, 0.00191543, 0.950246, - 0.000986124, 0.21744, 0.00430951, 0.950246, - 0.00175311, 0.21744, 0.00766137, 0.950245, - 0.00273923, 0.21744, 0.011971, 0.950253, - 0.00394453, 0.217441, 0.0172385, 0.950258, - 0.00536897, 0.217442, 0.0234641, 0.950267, - 0.00701262, 0.217444, 0.030648, 0.950277, - 0.00887551, 0.217446, 0.038791, 0.950284, - 0.0109576, 0.217446, 0.0478931, 0.950312, - 0.0132591, 0.217451, 0.0579568, 0.950334, - 0.01578, 0.217454, 0.0689821, 0.950378, - 0.0185204, 0.217462, 0.0809714, 0.950417, - 0.0214803, 0.217467, 0.0939265, 0.950488, - 0.0246594, 0.217479, 0.10785, 0.950534, - 0.0280565, 0.217483, 0.122743, 0.950633, - 0.0316685, 0.217498, 0.138611, 0.950698, - 0.0354787, 0.217499, 0.155442, 0.950844, - 0.0394003, 0.217507, 0.173208, 0.950999, - 0.0426812, 0.217419, 0.191605, 0.951221, - 0.0461302, 0.217317, 0.21084, 0.951412, - 0.0502131, 0.217238, 0.230945, 0.951623, - 0.0549183, 0.21722, 0.251745, 0.951867, - 0.0604493, 0.217306, 0.273001, 0.952069, - 0.0665189, 0.217466, 0.294874, 0.952459, - 0.0709179, 0.217266, 0.318732, 0.952996, - 0.0746112, 0.216891, 0.34318, 0.953425, - 0.0789252, 0.216503, 0.36849, 0.953885, - 0.0833293, 0.216042, 0.394373, 0.954617, - 0.087371, 0.215469, 0.420505, 0.955429, - 0.0914054, 0.214802, 0.446907, 0.956068, - 0.0961671, 0.214146, 0.473522, 0.957094, - 0.10048, 0.213286, 0.50052, 0.958372, - 0.103248, 0.211796, 0.528715, 0.959654, - 0.106033, 0.21016, 0.557065, 0.961305, - 0.108384, 0.208149, 0.585286, 0.962785, - 0.111122, 0.206024, 0.613334, 0.964848, - 0.112981, 0.203442, 0.641334, 0.966498, - 0.113717, 0.19996, 0.669955, 0.968678, - 0.114121, 0.196105, 0.698094, 0.970489, - 0.114524, 0.191906, 0.725643, 0.972903, - 0.113792, 0.186963, 0.752856, 0.974701, - 0.112406, 0.181343, 0.780013, 0.976718, - 0.110685, 0.175185, 0.806268, 0.978905, - 0.108468, 0.168535, 0.832073, 0.980267, - 0.105061, 0.161106, 0.857149, 0.981967, - 0.101675, 0.153387, 0.881145, 0.983063, - 0.0974492, 0.145199, 0.904255, 0.984432, - 0.0925815, 0.136527, 0.926686, 0.985734, - 0.0877983, 0.127584, 0.947901, 0.986228, - 0.081884, 0.118125, 0.968111, 0.98719, - 0.0761208, 0.108594, 0.98719, 0.988228, - 0.0698196, 0.0989996, 1.00559, 0.989046, - 0.0632739, 0.0890074, 1.02246, 0.990242, - 0.056522, 0.0790832, 1.03841, 0.991252, - 0.0495272, 0.0689182, 1.05347, 0.992542, - 0.0425373, 0.0588592, 1.06724, 0.994096, - 0.0353198, 0.0486833, 1.08009, 0.995593, - 0.028235, 0.0385977, 1.09177, 0.99711, - 0.0209511, 0.0286457, 1.10274, 0.998263, - 0.0139289, 0.0188497, 1.11262, 0.999254, - 0.0067359, 0.009208, 1.12191, 0.999967, 0.000141846, - 6.57764e-05, 1.13024, 0.935608, - 4.74692e-06, 0.236466, 1.87817e-05, 0.93996, - 0.00011971, 0.237568, 0.000473646, 0.939959, - 0.000478845, 0.237567, 0.0018946, 0.939954, - 0.0010774, 0.237566, 0.00426284, 0.939956, - 0.00191538, 0.237566, 0.00757842, 0.939954, - 0.00299277, 0.237566, 0.0118413, 0.93996, - 0.00430961, 0.237567, 0.0170518, 0.939969, - 0.00586589, 0.237569, 0.02321, 0.939982, - 0.00766166, 0.237572, 0.0303164, 0.939987, - 0.00969686, 0.237572, 0.0383711, 0.939997, - 0.0119715, 0.237574, 0.0473751, 0.940031, - 0.0144858, 0.237581, 0.0573298, 0.940073, - 0.0172399, 0.237589, 0.0682366, 0.94012, - 0.0202335, 0.237598, 0.080097, 0.940162, - 0.0234663, 0.237604, 0.0929116, 0.940237, - 0.0269387, 0.237615, 0.106686, 0.940328, - 0.0306489, 0.237632, 0.121421, 0.940419, - 0.0345917, 0.237645, 0.137115, 0.940522, - 0.0387481, 0.237654, 0.153766, 0.940702, - 0.0429906, 0.237661, 0.17133, 0.940871, - 0.0465089, 0.237561, 0.189502, 0.941103, - 0.050531, 0.23748, 0.208616, 0.941369, - 0.0550657, 0.237423, 0.228595, 0.941641, - 0.0601337, 0.237399, 0.249287, 0.941903, - 0.0658804, 0.237443, 0.270467, 0.942224, - 0.0722674, 0.237597, 0.292024, 0.942633, - 0.0771788, 0.237419, 0.315272, 0.943172, - 0.0815623, 0.237068, 0.339579, 0.943691, - 0.0863973, 0.236682, 0.364717, 0.944382, - 0.0911536, 0.236213, 0.390435, 0.945392, - 0.0952967, 0.235562, 0.416425, 0.946185, - 0.0998948, 0.234832, 0.442772, 0.947212, - 0.104796, 0.234114, 0.469347, 0.948778, - 0.10928, 0.233222, 0.496162, 0.950149, - 0.113081, 0.231845, 0.523978, 0.951989, - 0.115893, 0.230005, 0.552295, 0.953921, - 0.11846, 0.227862, 0.580569, 0.955624, - 0.12115, 0.225439, 0.608698, 0.958234, - 0.123373, 0.222635, 0.636696, 0.960593, - 0.124519, 0.219093, 0.665208, 0.963201, - 0.124736, 0.214749, 0.693557, 0.965642, - 0.125012, 0.210059, 0.721334, 0.968765, - 0.124661, 0.204935, 0.748613, 0.971753, - 0.122996, 0.198661, 0.776224, 0.973751, - 0.120998, 0.191823, 0.802461, 0.976709, - 0.118583, 0.184359, 0.828399, 0.977956, - 0.115102, 0.176437, 0.853693, 0.979672, - 0.111077, 0.167681, 0.877962, 0.981816, - 0.10688, 0.158872, 0.901564, 0.98238, - 0.101469, 0.149398, 0.924057, 0.983964, - 0.0960013, 0.139436, 0.945751, 0.984933, - 0.0899626, 0.12943, 0.966272, 0.985694, - 0.0832973, 0.11894, 0.985741, 0.986822, - 0.0767082, 0.108349, 1.00407, 0.987725, - 0.0693614, 0.0976026, 1.02154, 0.98877, - 0.06211, 0.086652, 1.03757, 0.990129, - 0.0544143, 0.0756182, 1.05296, 0.991337, - 0.046744, 0.0645753, 1.06683, 0.992978, - 0.0387931, 0.0534683, 1.0798, 0.994676, - 0.030973, 0.0424137, 1.09181, 0.99645, - 0.0230311, 0.0314035, 1.10286, 0.997967, - 0.0152065, 0.0206869, 1.11291, 0.99922, - 0.00744837, 0.010155, 1.12237, 1.00002, 0.000240209, - 7.52767e-05, 1.13089, 0.922948, - 5.15351e-06, 0.255626, 1.86069e-05, 0.928785, - 0.000129623, 0.257244, 0.000468009, 0.928761, - 0.00051849, 0.257237, 0.00187202, 0.928751, - 0.0011666, 0.257235, 0.00421204, 0.928751, - 0.00207395, 0.257234, 0.0074881, 0.928754, - 0.00324055, 0.257235, 0.0117002, 0.92876, - 0.00466639, 0.257236, 0.0168486, 0.928763, - 0.00635149, 0.257237, 0.0229334, 0.928774, - 0.00829584, 0.257239, 0.029955, 0.928791, - 0.0104995, 0.257243, 0.0379139, 0.928804, - 0.0129623, 0.257245, 0.0468108, 0.928847, - 0.0156846, 0.257255, 0.0566473, 0.92889, - 0.0186661, 0.257263, 0.0674246, 0.928924, - 0.0219067, 0.257268, 0.0791433, 0.928989, - 0.0254066, 0.257282, 0.0918076, 0.92909, - 0.0291651, 0.257301, 0.105419, 0.92918, - 0.0331801, 0.257316, 0.119978, 0.92929, - 0.0374469, 0.257332, 0.135491, 0.929453, - 0.041939, 0.257357, 0.151948, 0.929586, - 0.0464612, 0.257347, 0.169275, 0.929858, - 0.0503426, 0.257269, 0.187257, 0.930125, - 0.0548409, 0.257199, 0.206204, 0.930403, - 0.0598063, 0.257149, 0.22601, 0.930726, - 0.0652437, 0.257122, 0.246561, 0.931098, - 0.0712376, 0.257153, 0.267618, 0.931396, - 0.0777506, 0.257237, 0.288993, 0.931947, - 0.0832374, 0.257124, 0.311527, 0.932579, - 0.0883955, 0.25683, 0.335697, 0.933194, - 0.0937037, 0.256444, 0.360634, 0.934013, - 0.0987292, 0.255939, 0.386126, 0.935307, - 0.103215, 0.255282, 0.412018, 0.936374, - 0.108234, 0.254538, 0.438292, 0.93776, - 0.113234, 0.253728, 0.464805, 0.939599, - 0.118013, 0.25275, 0.491464, 0.941036, - 0.122661, 0.251404, 0.518751, 0.94337, - 0.125477, 0.249435, 0.547133, 0.945318, - 0.128374, 0.247113, 0.575456, 0.947995, - 0.130996, 0.244441, 0.60372, 0.950818, - 0.133438, 0.241352, 0.63174, 0.954378, - 0.135004, 0.237849, 0.659971, 0.957151, - 0.135313, 0.233188, 0.688478, 0.960743, - 0.13521, 0.228001, 0.716767, 0.964352, - 0.135007, 0.222249, 0.744349, 0.967273, - 0.133523, 0.21542, 0.771786, 0.969767, - 0.131155, 0.208039, 0.798639, 0.973195, - 0.128492, 0.200076, 0.824774, 0.975557, - 0.125094, 0.191451, 0.850222, 0.977692, - 0.120578, 0.18184, 0.874761, 0.98026, - 0.115882, 0.172102, 0.898497, 0.981394, - 0.110372, 0.161859, 0.921636, 0.982386, - 0.10415, 0.15108, 0.943467, 0.983783, - 0.0978128, 0.140407, 0.964045, 0.98422, - 0.0906171, 0.129058, 0.98398, 0.985447, - 0.0832921, 0.117614, 1.00276, 0.986682, - 0.0754412, 0.10585, 1.02047, 0.987326, - 0.0673885, 0.0940943, 1.03678, 0.988707, - 0.0592565, 0.0822093, 1.05218, 0.990185, - 0.050717, 0.070192, 1.06652, 0.991866, - 0.0423486, 0.0582081, 1.07965, 0.993897, - 0.0336118, 0.0460985, 1.09188, 0.995841, - 0.0252178, 0.0342737, 1.10307, 0.997605, - 0.0164893, 0.0224829, 1.11324, 0.999037, - 0.00817112, 0.0110647, 1.12262, 1.00003, 0.000291686, - 0.000168673, 1.13139, 0.915304, - 5.52675e-06, 0.275999, 1.83285e-05, 0.91668, - 0.000139285, 0.276414, 0.000461914, 0.916664, - 0.00055713, 0.276409, 0.00184763, 0.916653, - 0.00125354, 0.276406, 0.00415715, 0.916651, - 0.00222851, 0.276405, 0.00739053, 0.916655, - 0.00348205, 0.276406, 0.0115478, 0.916653, - 0.00501414, 0.276405, 0.0166291, 0.916667, - 0.00682478, 0.276409, 0.0226346, 0.91668, - 0.00891398, 0.276412, 0.0295648, 0.91669, - 0.0112817, 0.276413, 0.0374199, 0.916727, - 0.013928, 0.276422, 0.0462016, 0.916759, - 0.0168528, 0.276429, 0.0559101, 0.916793, - 0.0200558, 0.276436, 0.0665466, 0.916849, - 0.0235373, 0.276448, 0.0781139, 0.916964, - 0.0272973, 0.276474, 0.0906156, 0.917047, - 0.0313344, 0.276491, 0.104051, 0.917152, - 0.0356465, 0.276511, 0.118424, 0.917286, - 0.0402271, 0.276533, 0.133736, 0.917469, - 0.0450408, 0.276564, 0.149978, 0.917686, - 0.0497872, 0.276563, 0.167057, 0.917953, - 0.0540937, 0.276493, 0.184846, 0.918228, - 0.0590709, 0.276437, 0.203614, 0.918572, - 0.0644277, 0.276398, 0.223212, 0.918918, - 0.0702326, 0.276362, 0.243584, 0.919356, - 0.076484, 0.276383, 0.264465, 0.919842, - 0.0830808, 0.276434, 0.285701, 0.920451, - 0.0892972, 0.276407, 0.307559, 0.921113, - 0.095016, 0.276128, 0.331501, 0.921881, - 0.100771, 0.275754, 0.356207, 0.923027, - 0.106029, 0.275254, 0.381477, 0.924364, - 0.111029, 0.274595, 0.40722, 0.925818, - 0.116345, 0.273841, 0.433385, 0.92746, - 0.121424, 0.272913, 0.459848, 0.929167, - 0.12657, 0.271837, 0.486493, 0.931426, - 0.131581, 0.270575, 0.513432, 0.934001, - 0.135038, 0.268512, 0.541502, 0.936296, - 0.138039, 0.266135, 0.569658, 0.939985, - 0.140687, 0.263271, 0.598375, 0.943516, - 0.143247, 0.260058, 0.626563, 0.94782, - 0.145135, 0.256138, 0.654711, 0.951023, - 0.145733, 0.251154, 0.683285, 0.955338, - 0.145554, 0.245562, 0.711831, 0.959629, - 0.145008, 0.239265, 0.739573, 0.963123, - 0.144003, 0.232064, 0.767027, 0.966742, - 0.141289, 0.224036, 0.794359, 0.969991, - 0.138247, 0.215305, 0.820361, 0.973403, - 0.134786, 0.206051, 0.846548, 0.975317, - 0.129966, 0.195914, 0.871541, 0.977647, - 0.12471, 0.185184, 0.895313, 0.980137, - 0.119086, 0.174161, 0.918398, 0.981031, - 0.112297, 0.162792, 0.940679, 0.982037, - 0.105372, 0.150952, 0.961991, 0.983164, - 0.097821, 0.138921, 0.981913, 0.983757, - 0.0897245, 0.126611, 1.00109, 0.985036, - 0.0815974, 0.114228, 1.01902, 0.986289, - 0.0727725, 0.101389, 1.03604, 0.987329, - 0.0639323, 0.0886476, 1.05149, 0.989193, - 0.0548109, 0.0756837, 1.06619, 0.990716, - 0.045687, 0.0627581, 1.07948, 0.992769, - 0.0364315, 0.0498337, 1.09172, 0.99524, - 0.0271761, 0.0370305, 1.1033, 0.997154, - 0.0179609, 0.0243959, 1.11353, 0.998845, - 0.00878063, 0.0119567, 1.12319, 1.00002, 0.000259038, - 0.000108146, 1.13177, 0.903945, - 5.91681e-06, 0.295126, 1.81226e-05, 0.903668, - 0.000148672, 0.295037, 0.000455367, 0.903677, - 0.000594683, 0.29504, 0.00182145, 0.903673, - 0.00133805, 0.295039, 0.00409831, 0.903666, - 0.00237872, 0.295036, 0.00728584, 0.903668, - 0.00371676, 0.295037, 0.0113842, 0.903679, - 0.00535212, 0.29504, 0.0163936, 0.903684, - 0.00728479, 0.295041, 0.0223141, 0.903698, - 0.00951473, 0.295044, 0.0291462, 0.903718, - 0.0120419, 0.295049, 0.0368904, 0.903754, - 0.0148664, 0.295058, 0.0455477, 0.903801, - 0.017988, 0.29507, 0.0551194, 0.903851, - 0.0214064, 0.295082, 0.0656058, 0.903921, - 0.0251219, 0.295097, 0.0770109, 0.904002, - 0.0291337, 0.295116, 0.0893354, 0.904111, - 0.033441, 0.29514, 0.102583, 0.904246, - 0.0380415, 0.295169, 0.116755, 0.904408, - 0.0429258, 0.295202, 0.131853, 0.904637, - 0.0480468, 0.295245, 0.147869, 0.904821, - 0.0529208, 0.295214, 0.164658, 0.905163, - 0.0577748, 0.295185, 0.182274, 0.905469, - 0.0631763, 0.295143, 0.200828, 0.905851, - 0.068917, 0.295112, 0.2202, 0.906322, - 0.0750861, 0.295104, 0.240372, 0.906761, - 0.0815855, 0.295086, 0.261082, 0.90735, - 0.0882138, 0.295095, 0.282123, 0.908087, - 0.095082, 0.295139, 0.303563, 0.908826, - 0.101488, 0.29492, 0.327028, 0.909832, - 0.107577, 0.294577, 0.351464, 0.911393, - 0.113033, 0.294115, 0.376497, 0.912804, - 0.118629, 0.293446, 0.402115, 0.914081, - 0.124232, 0.292581, 0.428111, 0.91637, - 0.129399, 0.29166, 0.454442, 0.91814, - 0.134892, 0.290422, 0.481024, 0.921179, - 0.140069, 0.289194, 0.507924, 0.924544, - 0.144431, 0.287421, 0.535557, 0.927995, - 0.147498, 0.284867, 0.563984, 0.931556, - 0.150197, 0.281722, 0.5923, 0.935777, - 0.152711, 0.278207, 0.620832, 0.940869, - 0.154836, 0.274148, 0.649069, 0.945994, - 0.155912, 0.269057, 0.677746, 0.949634, - 0.155641, 0.262799, 0.706293, 0.955032, - 0.154809, 0.256097, 0.734278, 0.95917, - 0.153678, 0.248618, 0.761751, 0.962931, - 0.151253, 0.239794, 0.789032, 0.966045, - 0.147625, 0.230281, 0.815422, 0.96971, - 0.143964, 0.220382, 0.841787, 0.972747, - 0.139464, 0.209846, 0.867446, 0.975545, - 0.133459, 0.198189, 0.892004, 0.978381, - 0.127424, 0.186362, 0.915458, 0.979935, - 0.120506, 0.173964, 0.937948, 0.980948, - 0.11282, 0.161429, 0.959732, 0.982234, - 0.104941, 0.148557, 0.980118, 0.982767, - 0.0962905, 0.135508, 0.999463, 0.983544, - 0.0873625, 0.122338, 1.01756, 0.984965, - 0.0783447, 0.108669, 1.03492, 0.986233, - 0.0684798, 0.0949911, 1.05087, 0.987796, - 0.0590867, 0.0811386, 1.0656, 0.989885, - 0.0489145, 0.0673099, 1.0794, 0.991821, - 0.0391, 0.0535665, 1.09174, 0.99448, - 0.029087, 0.0397529, 1.10341, 0.996769, - 0.019114, 0.0261463, 1.11383, 0.998641, - 0.00947007, 0.0128731, 1.1237, 0.999978, 0.000446316, - 0.000169093, 1.13253, 0.888362, - 6.27064e-06, 0.312578, 1.78215e-05, 0.889988, - 0.000157791, 0.313148, 0.000448451, 0.889825, - 0.000631076, 0.313092, 0.00179356, 0.88984, - 0.00141994, 0.313097, 0.00403554, 0.889828, - 0.0025243, 0.313092, 0.00717429, 0.889831, - 0.00394421, 0.313093, 0.0112099, 0.889831, - 0.00567962, 0.313093, 0.0161425, 0.889844, - 0.00773051, 0.313096, 0.0219724, 0.889858, - 0.0100968, 0.3131, 0.0286999, 0.889882, - 0.0127786, 0.313106, 0.0363256, 0.889918, - 0.0157757, 0.313116, 0.0448509, 0.889967, - 0.0190878, 0.313129, 0.0542758, 0.89003, - 0.022715, 0.313145, 0.0646032, 0.890108, - 0.0266566, 0.313165, 0.0758339, 0.890218, - 0.0309131, 0.313193, 0.0879729, 0.890351, - 0.0354819, 0.313226, 0.101019, 0.89051, - 0.0403613, 0.313263, 0.114979, 0.890672, - 0.0455385, 0.313294, 0.129848, 0.890882, - 0.0509444, 0.313333, 0.145616, 0.891189, - 0.0559657, 0.313324, 0.162122, 0.891457, - 0.0613123, 0.313281, 0.179524, 0.891856, - 0.0671488, 0.313281, 0.197855, 0.892312, - 0.0732732, 0.313268, 0.216991, 0.892819, - 0.0797865, 0.313263, 0.236924, 0.893369, - 0.0865269, 0.313247, 0.257433, 0.894045, - 0.0931592, 0.313205, 0.278215, 0.894884, - 0.100532, 0.313276, 0.299467, 0.895832, - 0.107716, 0.313205, 0.322276, 0.897043, - 0.114099, 0.312873, 0.34642, 0.898515, - 0.119941, 0.312331, 0.371187, 0.900191, - 0.126044, 0.311731, 0.396656, 0.90188, - 0.131808, 0.310859, 0.422488, 0.904359, - 0.137289, 0.309857, 0.448744, 0.906923, - 0.142991, 0.308714, 0.475239, 0.910634, - 0.148253, 0.307465, 0.501983, 0.914502, - 0.153332, 0.305774, 0.529254, 0.919046, - 0.156646, 0.303156, 0.557709, 0.923194, - 0.159612, 0.299928, 0.586267, 0.928858, - 0.162027, 0.296245, 0.614925, 0.934464, - 0.164203, 0.291832, 0.643187, 0.939824, - 0.165602, 0.286565, 0.671601, 0.944582, - 0.165383, 0.280073, 0.700213, 0.949257, - 0.164439, 0.272891, 0.728432, 0.954389, - 0.162953, 0.264771, 0.756082, 0.958595, - 0.161007, 0.255927, 0.78369, 0.962138, - 0.157243, 0.245769, 0.810769, 0.966979, - 0.152872, 0.235127, 0.836999, 0.969566, - 0.148209, 0.22347, 0.862684, 0.972372, - 0.142211, 0.211147, 0.887847, 0.975916, - 0.135458, 0.198606, 0.911843, 0.978026, - 0.128398, 0.185498, 0.934795, 0.979686, - 0.120313, 0.17171, 0.956787, 0.980748, - 0.11166, 0.158159, 0.978046, 0.981622, - 0.103035, 0.144399, 0.997693, 0.982356, - 0.0930328, 0.13001, 1.01642, 0.983308, - 0.0834627, 0.115778, 1.03366, 0.985037, - 0.0732249, 0.101327, 1.05014, 0.986493, - 0.0628145, 0.086554, 1.06507, 0.988484, - 0.0526556, 0.0720413, 1.07907, 0.991051, - 0.0415744, 0.0571151, 1.09189, 0.993523, - 0.0314275, 0.0426643, 1.10369, 0.99628, - 0.0203603, 0.0279325, 1.11423, 0.998344, - 0.0102446, 0.0138182, 1.12421, 0.999997, 0.00042612, - 0.000193628, 1.1333, 0.871555, - 6.60007e-06, 0.329176, 1.74749e-05, 0.875255, - 0.000166579, 0.330571, 0.000441051, 0.875644, - 0.000666394, 0.330718, 0.00176441, 0.875159, - 0.00149903, 0.330536, 0.00396899, 0.87516, - 0.00266493, 0.330536, 0.007056, 0.875158, - 0.00416393, 0.330535, 0.0110251, 0.87516, - 0.00599598, 0.330535, 0.0158764, 0.875163, - 0.00816108, 0.330536, 0.0216101, 0.875174, - 0.0106591, 0.330538, 0.0282266, 0.875199, - 0.0134899, 0.330545, 0.0357266, 0.875257, - 0.0166538, 0.330563, 0.0441117, 0.875304, - 0.0201501, 0.330575, 0.0533821, 0.875373, - 0.0239785, 0.330595, 0.0635395, 0.875464, - 0.0281389, 0.330619, 0.0745872, 0.875565, - 0.0326301, 0.330645, 0.0865255, 0.875691, - 0.0374516, 0.330676, 0.0993599, 0.875897, - 0.0425993, 0.330733, 0.113093, 0.876091, - 0.0480576, 0.330776, 0.127722, 0.876353, - 0.0537216, 0.330826, 0.143227, 0.876649, - 0.0589807, 0.330809, 0.159462, 0.877034, - 0.0647865, 0.330819, 0.176642, 0.877443, - 0.0709789, 0.330817, 0.194702, 0.877956, - 0.0774782, 0.330832, 0.213577, 0.878499, - 0.0843175, 0.330822, 0.233246, 0.879144, - 0.0912714, 0.330804, 0.253512, 0.879982, - 0.0980824, 0.330766, 0.274137, 0.88097, - 0.105823, 0.330864, 0.295209, 0.882051, - 0.113671, 0.330896, 0.317226, 0.883397, - 0.120303, 0.330545, 0.341068, 0.884987, - 0.12667, 0.330068, 0.365613, 0.886789, - 0.133118, 0.329418, 0.390807, 0.889311, - 0.139024, 0.328683, 0.416494, 0.891995, - 0.144971, 0.327729, 0.442618, 0.895106, - 0.150747, 0.326521, 0.469131, 0.899527, - 0.156283, 0.325229, 0.495921, 0.90504, - 0.161707, 0.32378, 0.523162, 0.909875, - 0.165661, 0.32122, 0.55092, 0.91561, - 0.168755, 0.317942, 0.579928, 0.921225, - 0.171193, 0.313983, 0.608539, 0.927308, - 0.17319, 0.309636, 0.636854, 0.933077, - 0.174819, 0.304262, 0.66523, 0.938766, - 0.175002, 0.297563, 0.693609, 0.943667, - 0.173946, 0.289613, 0.722157, 0.949033, - 0.172221, 0.281227, 0.750021, 0.953765, - 0.169869, 0.271545, 0.777466, 0.95804, - 0.166578, 0.261034, 0.804853, 0.962302, - 0.161761, 0.249434, 0.831569, 0.966544, - 0.156636, 0.237484, 0.857779, 0.969372, - 0.150784, 0.224395, 0.883051, 0.972486, - 0.143672, 0.210786, 0.907864, 0.975853, - 0.135772, 0.196556, 0.931223, 0.977975, - 0.127942, 0.182307, 0.954061, 0.979122, - 0.118347, 0.167607, 0.97531, 0.980719, - 0.109112, 0.152739, 0.995666, 0.981223, - 0.0991789, 0.137932, 1.01475, 0.98216, - 0.0883553, 0.122692, 1.03253, 0.983379, - 0.0780825, 0.107493, 1.04917, 0.985434, - 0.0665646, 0.0917791, 1.06464, 0.987332, - 0.0557714, 0.0764949, 1.07896, 0.990004, - 0.0442805, 0.060721, 1.09199, 0.992975, - 0.0331676, 0.0452284, 1.10393, 0.995811, - 0.0219547, 0.0297934, 1.11476, 0.9982, - 0.0107613, 0.0146415, 1.12484, 1.00002, 0.000248678, - 0.00014555, 1.13413, 0.859519, - 6.93595e-06, 0.347264, 1.71673e-05, 0.859843, - 0.00017503, 0.347394, 0.000433219, 0.859656, - 0.000700076, 0.347319, 0.00173277, 0.859671, - 0.00157517, 0.347325, 0.00389875, 0.859669, - 0.00280028, 0.347324, 0.00693112, 0.85967, - 0.0043754, 0.347324, 0.01083, 0.859665, - 0.00630049, 0.347321, 0.0155954, 0.859685, - 0.0085755, 0.347328, 0.0212278, 0.859694, - 0.0112003, 0.347329, 0.0277273, 0.859718, - 0.0141747, 0.347336, 0.0350946, 0.85976, - 0.0174988, 0.347348, 0.0433314, 0.85982, - 0.0211722, 0.347366, 0.0524384, 0.859892, - 0.0251941, 0.347387, 0.0624168, 0.860006, - 0.0295649, 0.347422, 0.0732708, 0.860122, - 0.0342825, 0.347453, 0.0849999, 0.860282, - 0.0393462, 0.347499, 0.0976102, 0.860482, - 0.0447513, 0.347554, 0.111104, 0.860719, - 0.0504775, 0.347614, 0.125479, 0.860998, - 0.0563577, 0.347666, 0.140703, 0.861322, - 0.0619473, 0.347662, 0.156681, 0.861724, - 0.0681277, 0.347684, 0.173597, 0.862198, - 0.0746567, 0.347709, 0.191371, 0.862733, - 0.0815234, 0.347727, 0.209976, 0.863371, - 0.0886643, 0.347744, 0.229351, 0.86414, - 0.0957908, 0.347734, 0.24934, 0.865138, - 0.102912, 0.34772, 0.269797, 0.866182, - 0.110924, 0.3478, 0.290654, 0.867436, - 0.119223, 0.347911, 0.312074, 0.869087, - 0.126197, 0.347649, 0.335438, 0.870859, - 0.133145, 0.347222, 0.359732, 0.872997, - 0.139869, 0.346645, 0.38467, 0.875939, - 0.146089, 0.345935, 0.41019, 0.879012, - 0.152334, 0.345012, 0.436218, 0.883353, - 0.15821, 0.343924, 0.462641, 0.888362, - 0.164097, 0.342636, 0.489449, 0.895026, - 0.169528, 0.341351, 0.516629, 0.900753, - 0.174408, 0.339115, 0.544109, 0.906814, - 0.17751, 0.335809, 0.572857, 0.912855, - 0.180101, 0.331597, 0.601554, 0.919438, - 0.182116, 0.32698, 0.630198, 0.925962, - 0.183494, 0.321449, 0.658404, 0.931734, - 0.184159, 0.314595, 0.686625, 0.93762, - 0.18304, 0.306462, 0.71531, 0.943858, - 0.181323, 0.297514, 0.744272, 0.948662, - 0.178683, 0.287447, 0.771462, 0.953299, - 0.175379, 0.276166, 0.798593, 0.957346, - 0.170395, 0.263758, 0.8256, 0.962565, - 0.165042, 0.251019, 0.852575, 0.966075, - 0.158655, 0.237011, 0.878316, 0.969048, - 0.151707, 0.222518, 0.90329, 0.972423, - 0.143271, 0.207848, 0.927745, 0.975833, - 0.134824, 0.192463, 0.950859, 0.977629, - 0.125444, 0.1768, 0.972947, 0.978995, - 0.114949, 0.161033, 0.993263, 0.980533, - 0.104936, 0.145523, 1.01337, 0.980745, - 0.0935577, 0.129799, 1.03128, 0.981814, - 0.0822956, 0.113486, 1.04825, 0.983943, - 0.0710082, 0.0972925, 1.06405, 0.986141, - 0.0587931, 0.0808138, 1.0785, 0.988878, - 0.0472755, 0.0644915, 1.09204, 0.992132, - 0.0349128, 0.0478128, 1.10413, 0.9953, - 0.0232407, 0.031621, 1.11527, 0.998117, - 0.0112713, 0.0154935, 1.12551, 1.00003, 0.000339743, - 0.000195763, 1.13504, 0.845441, - 7.29126e-06, 0.364305, 1.69208e-05, 0.843588, - 0.000183164, 0.363506, 0.000425067, 0.843412, - 0.00073253, 0.36343, 0.00169999, 0.843401, - 0.00164818, 0.363426, 0.00382495, 0.843399, - 0.00293008, 0.363425, 0.00679993, 0.843401, - 0.00457822, 0.363425, 0.010625, 0.843394, - 0.00659249, 0.363421, 0.0153002, 0.843398, - 0.00897282, 0.363421, 0.0208258, 0.843415, - 0.0117191, 0.363426, 0.0272024, 0.843438, - 0.0148312, 0.363432, 0.0344305, 0.843483, - 0.018309, 0.363447, 0.0425116, 0.84356, - 0.0221521, 0.363472, 0.0514471, 0.843646, - 0.0263597, 0.363499, 0.061238, 0.843743, - 0.0309315, 0.363527, 0.0718873, 0.84388, - 0.0358658, 0.363569, 0.0833969, 0.844079, - 0.0411624, 0.363631, 0.0957742, 0.844279, - 0.0468128, 0.363688, 0.109015, 0.844549, - 0.0527923, 0.363761, 0.123124, 0.844858, - 0.0588204, 0.363817, 0.138044, 0.84522, - 0.0647573, 0.36383, 0.153755, 0.845669, - 0.0713181, 0.363879, 0.170394, 0.846155, - 0.0781697, 0.363908, 0.187861, 0.846789, - 0.0853913, 0.363969, 0.206176, 0.847502, - 0.0928086, 0.363999, 0.225244, 0.8484, - 0.10005, 0.363997, 0.244926, 0.849461, - 0.107615, 0.364008, 0.265188, 0.850562, - 0.115814, 0.364055, 0.28587, 0.851962, - 0.124334, 0.364179, 0.306926, 0.854326, - 0.131995, 0.364233, 0.329605, 0.856295, - 0.139338, 0.363856, 0.35359, 0.858857, - 0.146346, 0.363347, 0.37831, 0.862428, - 0.152994, 0.362807, 0.403722, 0.866203, - 0.159463, 0.361963, 0.429537, 0.871629, - 0.165623, 0.36112, 0.456, 0.877365, - 0.171649, 0.359917, 0.482773, 0.883744, - 0.177151, 0.35848, 0.509705, 0.890693, - 0.182381, 0.356523, 0.537215, 0.897278, - 0.186076, 0.3533, 0.565493, 0.903958, - 0.188602, 0.349095, 0.594293, 0.910908, - 0.190755, 0.344215, 0.623165, 0.918117, - 0.192063, 0.338606, 0.651573, 0.924644, - 0.192758, 0.331544, 0.679869, 0.931054, - 0.192238, 0.323163, 0.708668, 0.937303, - 0.190035, 0.313529, 0.737201, 0.943387, - 0.187162, 0.303152, 0.764977, 0.948494, - 0.183876, 0.29146, 0.792683, 0.952546, - 0.178901, 0.277917, 0.819228, 0.958077, - 0.173173, 0.264753, 0.846559, 0.962462, - 0.16645, 0.25002, 0.872962, 0.966569, - 0.159452, 0.234873, 0.898729, 0.969108, - 0.15074, 0.218752, 0.923126, 0.973072, - 0.141523, 0.202673, 0.947278, 0.975452, - 0.132075, 0.186326, 0.969938, 0.977784, - 0.121257, 0.169396, 0.991325, 0.97899, - 0.110182, 0.153044, 1.01123, 0.979777, - 0.0989634, 0.136485, 1.0299, 0.980865, - 0.0865894, 0.119343, 1.04727, 0.982432, - 0.0746115, 0.102452, 1.06341, 0.984935, - 0.0621822, 0.0852423, 1.07834, 0.987776, - 0.0495694, 0.0678546, 1.092, 0.99103, - 0.0372386, 0.0506917, 1.1043, 0.99474, - 0.0244353, 0.0333316, 1.11576, 0.997768, - 0.0121448, 0.0164348, 1.12617, 1.00003, 0.00031774, - 0.000169504, 1.13598, 0.825551, - 7.56799e-06, 0.378425, 1.65099e-05, 0.82664, - 0.000190922, 0.378923, 0.000416504, 0.826323, - 0.000763495, 0.378779, 0.0016656, 0.826359, - 0.00171789, 0.378795, 0.00374768, 0.82636, - 0.00305402, 0.378795, 0.00666259, 0.826368, - 0.00477185, 0.378798, 0.0104104, 0.826364, - 0.00687131, 0.378795, 0.0149912, 0.826368, - 0.00935232, 0.378795, 0.0204054, 0.826376, - 0.0122146, 0.378797, 0.0266532, 0.826399, - 0.0154581, 0.378803, 0.0337355, 0.82646, - 0.0190825, 0.378824, 0.0416537, 0.826525, - 0.0230873, 0.378846, 0.0504091, 0.826614, - 0.0274719, 0.378876, 0.0600032, 0.82674, - 0.0322355, 0.378917, 0.0704393, 0.826888, - 0.0373766, 0.378964, 0.0817195, 0.827078, - 0.0428936, 0.379024, 0.0938492, 0.827318, - 0.0487778, 0.379099, 0.106828, 0.82764, - 0.0549935, 0.379199, 0.120659, 0.827926, - 0.0611058, 0.379227, 0.13526, 0.828325, - 0.0675054, 0.379275, 0.150713, 0.828801, - 0.0743455, 0.379332, 0.167034, 0.8294, - 0.0815523, 0.379415, 0.184209, 0.830094, - 0.0890779, 0.379495, 0.202203, 0.8309, - 0.096736, 0.379555, 0.220945, 0.831943, - 0.104135, 0.379577, 0.240306, 0.833037, - 0.112106, 0.379604, 0.260317, 0.834278, - 0.120554, 0.379668, 0.2808, 0.836192, - 0.129128, 0.3799, 0.301654, 0.838671, - 0.137541, 0.380109, 0.323502, 0.840939, - 0.14523, 0.379809, 0.347176, 0.844575, - 0.15248, 0.379593, 0.371706, 0.848379, - 0.159607, 0.37909, 0.39688, 0.853616, - 0.166267, 0.378617, 0.422702, 0.858921, - 0.172698, 0.377746, 0.448919, 0.865324, - 0.178823, 0.376749, 0.475661, 0.872207, - 0.184542, 0.375363, 0.502599, 0.880018, - 0.189836, 0.373657, 0.529914, 0.88694, - 0.194294, 0.370673, 0.557683, 0.894779, - 0.197022, 0.36662, 0.586848, 0.902242, - 0.199108, 0.36138, 0.615831, 0.909914, - 0.200398, 0.355434, 0.644478, 0.917088, - 0.20094, 0.348173, 0.672905, 0.923888, - 0.200671, 0.339482, 0.701327, 0.930495, - 0.198773, 0.32956, 0.730101, 0.937247, - 0.195394, 0.318363, 0.758383, 0.943108, - 0.191956, 0.306323, 0.786539, 0.948296, - 0.187227, 0.292576, 0.813637, 0.953472, - 0.181165, 0.278234, 0.840793, 0.958485, - 0.174119, 0.263054, 0.867712, 0.962714, - 0.166564, 0.246756, 0.893635, 0.966185, - 0.158181, 0.229945, 0.919028, 0.970146, - 0.148275, 0.212633, 0.943413, 0.973491, - 0.138157, 0.195229, 0.966627, 0.975741, - 0.127574, 0.178048, 0.988817, 0.977238, - 0.11554, 0.160312, 1.00924, 0.978411, - 0.10364, 0.142857, 1.02845, 0.979811, - 0.0913122, 0.125317, 1.04648, 0.98116, - 0.0782558, 0.107627, 1.06284, 0.983543, - 0.0655957, 0.0895862, 1.07798, 0.986789, - 0.0520411, 0.0713756, 1.092, 0.990292, - 0.0389727, 0.053228, 1.10484, 0.994187, - 0.025808, 0.0351945, 1.11642, 0.997499, - 0.0126071, 0.0173198, 1.12703, 0.999999, 0.000275604, - 0.000148602, 1.13674, 0.81075, - 7.8735e-06, 0.394456, 1.61829e-05, 0.808692, - 0.000198293, 0.393453, 0.000407564, 0.80846, - 0.000792877, 0.39334, 0.00162965, 0.808595, - 0.00178416, 0.393407, 0.00366711, 0.808597, - 0.00317182, 0.393408, 0.00651934, 0.808598, - 0.00495589, 0.393408, 0.0101866, 0.808591, - 0.00713627, 0.393403, 0.0146689, 0.808592, - 0.00971285, 0.393402, 0.0199667, 0.80861, - 0.0126855, 0.393407, 0.0260803, 0.808633, - 0.0160538, 0.393413, 0.0330107, 0.80868, - 0.0198175, 0.393429, 0.0407589, 0.808748, - 0.0239758, 0.393453, 0.0493264, 0.808854, - 0.0285286, 0.39349, 0.0587161, 0.808992, - 0.0334748, 0.39354, 0.0689304, 0.809141, - 0.0388116, 0.393588, 0.0799707, 0.809352, - 0.0445375, 0.39366, 0.0918432, 0.809608, - 0.0506427, 0.393742, 0.104549, 0.809915, - 0.0570708, 0.393834, 0.118085, 0.810253, - 0.0633526, 0.393885, 0.132377, 0.810687, - 0.0700966, 0.393953, 0.147537, 0.811233, - 0.0772274, 0.394047, 0.163543, 0.811865, - 0.0847629, 0.394148, 0.180394, 0.812648, - 0.0925663, 0.394265, 0.198051, 0.813583, - 0.100416, 0.394363, 0.216443, 0.814683, - 0.108119, 0.394402, 0.235502, 0.815948, - 0.11644, 0.394489, 0.255242, 0.817278, - 0.125036, 0.394542, 0.275441, 0.819605, - 0.133655, 0.39486, 0.296094, 0.822256, - 0.142682, 0.395248, 0.317309, 0.825349, - 0.150756, 0.395241, 0.340516, 0.829605, - 0.158392, 0.395285, 0.364819, 0.83391, - 0.165801, 0.394922, 0.389736, 0.839808, - 0.172677, 0.394691, 0.415409, 0.845708, - 0.179448, 0.394006, 0.441546, 0.853025, - 0.185746, 0.393279, 0.46832, 0.859666, - 0.191684, 0.391655, 0.495302, 0.86789, - 0.197146, 0.390068, 0.52262, 0.875845, - 0.201904, 0.38727, 0.550336, 0.882634, - 0.205023, 0.382688, 0.578825, 0.891076, - 0.207098, 0.377543, 0.608103, 0.900589, - 0.208474, 0.371752, 0.63723, 0.90791, - 0.209068, 0.364016, 0.665769, 0.915971, - 0.208655, 0.355593, 0.694428, 0.923455, - 0.20729, 0.345439, 0.723224, 0.931514, - 0.203821, 0.334099, 0.751925, 0.937885, - 0.19986, 0.321069, 0.780249, 0.943136, - 0.194993, 0.306571, 0.8077, 0.948818, - 0.189132, 0.291556, 0.83497, 0.954433, - 0.181617, 0.275745, 0.86188, 0.959078, - 0.173595, 0.258695, 0.888562, 0.962705, - 0.164855, 0.240825, 0.914008, 0.966753, - 0.155129, 0.22268, 0.939145, 0.970704, - 0.144241, 0.204542, 0.963393, 0.973367, - 0.133188, 0.185927, 0.985983, 0.975984, - 0.121146, 0.167743, 1.00704, 0.976994, - 0.108366, 0.149218, 1.02715, 0.978485, - 0.0956746, 0.13131, 1.0455, 0.980074, - 0.0820733, 0.112513, 1.06221, 0.98225, - 0.0684061, 0.0938323, 1.07782, 0.98553, - 0.0549503, 0.0749508, 1.09199, 0.989529, - 0.0407857, 0.055848, 1.10508, 0.993536, - 0.0271978, 0.0368581, 1.11684, 0.997247, - 0.0132716, 0.0181845, 1.12789, 1, 0.000431817, - 0.000198809, 1.13792, 0.785886, - 8.12608e-06, 0.405036, 1.57669e-05, 0.790388, - 0.000205278, 0.407355, 0.000398297, 0.790145, - 0.000820824, 0.407231, 0.00159263, 0.790135, - 0.00184681, 0.407226, 0.00358336, 0.790119, - 0.00328316, 0.407218, 0.00637039, 0.790126, - 0.00512988, 0.40722, 0.0099539, 0.79013, - 0.00738684, 0.407221, 0.0143339, 0.790135, - 0.0100538, 0.407221, 0.0195107, 0.790134, - 0.0131306, 0.407217, 0.0254848, 0.79016, - 0.0166169, 0.407224, 0.0322572, 0.790197, - 0.020512, 0.407236, 0.0398284, 0.790273, - 0.0248157, 0.407263, 0.0482014, 0.790381, - 0.029527, 0.407304, 0.0573777, 0.790521, - 0.0346446, 0.407355, 0.0673602, 0.790704, - 0.0401665, 0.40742, 0.0781522, 0.790925, - 0.0460896, 0.407499, 0.0897582, 0.791195, - 0.0524017, 0.407589, 0.10218, 0.791522, - 0.0590121, 0.407691, 0.11541, 0.791878, - 0.0654876, 0.407748, 0.12939, 0.792361, - 0.0725207, 0.407849, 0.144237, 0.792942, - 0.0799844, 0.407963, 0.159924, 0.79362, - 0.0877896, 0.408087, 0.176425, 0.794529, - 0.0958451, 0.408259, 0.193733, 0.795521, - 0.103827, 0.408362, 0.211756, 0.796778, - 0.111937, 0.408482, 0.230524, 0.798027, - 0.120521, 0.408547, 0.249967, 0.799813, - 0.129242, 0.408721, 0.269926, 0.802387, - 0.138048, 0.409148, 0.290338, 0.805279, - 0.147301, 0.409641, 0.311193, 0.809251, - 0.155895, 0.410154, 0.333611, 0.813733, - 0.163942, 0.410297, 0.357615, 0.819081, - 0.171666, 0.410373, 0.382339, 0.825427, - 0.178905, 0.410348, 0.407828, 0.83172, - 0.185812, 0.409486, 0.434034, 0.83877, - 0.192318, 0.408776, 0.460493, 0.845817, - 0.198249, 0.407176, 0.487346, 0.854664, - 0.204034, 0.405719, 0.514832, 0.863495, - 0.208908, 0.403282, 0.542401, 0.871883, - 0.212765, 0.399293, 0.570683, 0.88065, - 0.214911, 0.393803, 0.599947, 0.89004, - 0.216214, 0.387536, 0.62932, 0.898476, - 0.216745, 0.379846, 0.658319, 0.906738, - 0.216387, 0.370625, 0.687138, 0.914844, - 0.215053, 0.360139, 0.71601, 0.923877, - 0.212007, 0.348849, 0.745124, 0.931925, - 0.207481, 0.335639, 0.773366, 0.938054, - 0.202418, 0.320798, 0.801636, 0.943895, - 0.196507, 0.304772, 0.829055, 0.949468, - 0.189009, 0.288033, 0.856097, 0.955152, - 0.180539, 0.270532, 0.88301, 0.959403, - 0.171437, 0.251639, 0.909296, 0.963309, - 0.161661, 0.232563, 0.934868, 0.967399, - 0.150425, 0.213231, 0.959662, 0.972009, - 0.138659, 0.194247, 0.98302, 0.97433, - 0.126595, 0.174718, 1.00517, 0.975823, - 0.113205, 0.155518, 1.02566, 0.976371, - 0.0996096, 0.136709, 1.04418, 0.978705, - 0.0860754, 0.117571, 1.06146, 0.981477, - 0.0714438, 0.0980046, 1.07777, 0.984263, - 0.0572304, 0.0782181, 1.09214, 0.988423, - 0.0428875, 0.0584052, 1.10553, 0.993, - 0.0282442, 0.038522, 1.11758, 0.99704, - 0.0140183, 0.0190148, 1.12864, 0.999913, 0.000369494, - 0.000145203, 1.13901, 0.777662, - 8.4153e-06, 0.423844, 1.54403e-05, 0.770458, - 0.000211714, 0.419915, 0.00038845, 0.770716, - 0.000846888, 0.420055, 0.00155386, 0.770982, - 0.00190567, 0.420202, 0.00349653, 0.770981, - 0.00338782, 0.420201, 0.00621606, 0.77098, - 0.00529338, 0.4202, 0.00971274, 0.770983, - 0.00762223, 0.4202, 0.0139867, 0.770985, - 0.0103741, 0.420198, 0.0190381, 0.770996, - 0.0135489, 0.4202, 0.0248677, 0.771029, - 0.0171461, 0.420212, 0.0314764, 0.771052, - 0.0211647, 0.420215, 0.0388648, 0.771131, - 0.0256048, 0.420245, 0.047036, 0.771235, - 0.0304647, 0.420284, 0.0559911, 0.771383, - 0.0357436, 0.420341, 0.0657346, 0.771591, - 0.0414392, 0.420423, 0.0762694, 0.771819, - 0.0475462, 0.420506, 0.0875984, 0.772123, - 0.0540506, 0.420617, 0.099727, 0.772464, - 0.060797, 0.42072, 0.112637, 0.772855, - 0.0675393, 0.420799, 0.126313, 0.773317, - 0.0748323, 0.420893, 0.140824, 0.773981, - 0.0825681, 0.421058, 0.15617, 0.774746, - 0.0906307, 0.421226, 0.172322, 0.77566, - 0.0988982, 0.421397, 0.189253, 0.776837, - 0.106994, 0.421569, 0.206912, 0.778097, - 0.115528, 0.421704, 0.225359, 0.779588, - 0.124317, 0.421849, 0.24447, 0.781574, - 0.133139, 0.422097, 0.264156, 0.784451, - 0.142179, 0.422615, 0.284318, 0.787682, - 0.15165, 0.423269, 0.304902, 0.792433, - 0.160771, 0.424396, 0.3265, 0.797359, - 0.169166, 0.424772, 0.35014, 0.803986, - 0.177149, 0.425475, 0.374768, 0.809504, - 0.184745, 0.424996, 0.399928, 0.815885, - 0.19173, 0.424247, 0.425796, 0.823513, - 0.198525, 0.423515, 0.452287, 0.832549, - 0.204709, 0.422787, 0.479321, 0.841653, - 0.210447, 0.421187, 0.506718, 0.850401, - 0.215501, 0.418519, 0.53432, 0.859854, - 0.219752, 0.414715, 0.56242, 0.869364, - 0.222305, 0.409462, 0.591558, 0.878837, - 0.223744, 0.402926, 0.621074, 0.888636, - 0.224065, 0.395043, 0.650538, 0.898132, - 0.223742, 0.38564, 0.679538, 0.907181, - 0.222308, 0.375378, 0.708674, 0.915621, - 0.219837, 0.363212, 0.737714, 0.9239, - 0.215233, 0.349313, 0.767014, 0.931644, - 0.209592, 0.334162, 0.795133, 0.938887, - 0.203644, 0.317943, 0.823228, 0.945282, - 0.196349, 0.300581, 0.850822, 0.950758, - 0.18742, 0.282195, 0.877594, 0.956146, - 0.177879, 0.262481, 0.904564, 0.960355, - 0.167643, 0.242487, 0.930741, 0.965256, - 0.156671, 0.222668, 0.955868, 0.968029, - 0.144123, 0.201907, 0.979869, 0.97251, - 0.131305, 0.18202, 1.00291, 0.974925, - 0.118335, 0.161909, 1.02392, 0.975402, - 0.103714, 0.142129, 1.0433, 0.976987, - 0.089415, 0.122447, 1.06089, 0.979677, - 0.0748858, 0.102248, 1.07713, 0.983184, - 0.0596086, 0.0814851, 1.09218, 0.987466, - 0.0447671, 0.0609484, 1.10585, 0.992348, - 0.0295217, 0.0401835, 1.11829, 0.996674, - 0.0143917, 0.0198163, 1.12966, 1.00003, 0.000321364, - 0.000149983, 1.1402, 0.757901, - 8.69074e-06, 0.436176, 1.51011e-05, 0.751195, - 0.000217848, 0.432317, 0.000378533, 0.751178, - 0.000871373, 0.432307, 0.0015141, 0.751195, - 0.00196061, 0.432317, 0.0034068, 0.751198, - 0.00348552, 0.432318, 0.00605659, 0.751195, - 0.00544599, 0.432315, 0.00946353, 0.751207, - 0.00784203, 0.43232, 0.013628, 0.751213, - 0.0106732, 0.43232, 0.0185499, 0.751221, - 0.0139393, 0.432319, 0.0242302, 0.751244, - 0.0176398, 0.432325, 0.0306694, 0.7513, - 0.0217743, 0.432348, 0.0378698, 0.751358, - 0.0263412, 0.432367, 0.0458321, 0.751458, - 0.0313396, 0.432404, 0.0545587, 0.751608, - 0.0367682, 0.432464, 0.0640543, 0.7518, - 0.0426246, 0.43254, 0.0743222, 0.752065, - 0.0489031, 0.432645, 0.0853668, 0.752376, - 0.0555828, 0.432762, 0.0971911, 0.752715, - 0.0623861, 0.432859, 0.109768, 0.753137, - 0.069415, 0.432958, 0.123126, 0.753676, - 0.0770039, 0.433099, 0.137308, 0.754345, - 0.084971, 0.433272, 0.15229, 0.755235, - 0.0932681, 0.433504, 0.168075, 0.756186, - 0.10171, 0.433693, 0.184625, 0.757363, - 0.110019, 0.433857, 0.201897, 0.75884, - 0.11887, 0.434102, 0.220014, 0.760467, - 0.127881, 0.434306, 0.238778, 0.762969, - 0.136766, 0.434751, 0.258172, 0.765823, - 0.14612, 0.43529, 0.278062, 0.769676, - 0.15566, 0.436236, 0.298437, 0.774909, - 0.165177, 0.437754, 0.319532, 0.77994, - 0.17402, 0.438343, 0.342505, 0.785757, - 0.182201, 0.438609, 0.366693, 0.792487, - 0.190104, 0.438762, 0.391668, 0.80038, - 0.197438, 0.438795, 0.417494, 0.808494, - 0.204365, 0.438226, 0.443933, 0.817695, - 0.210714, 0.437283, 0.470929, 0.828111, - 0.216651, 0.436087, 0.498569, 0.837901, - 0.221804, 0.433717, 0.526165, 0.847813, - 0.226318, 0.430133, 0.554155, 0.858314, - 0.229297, 0.425213, 0.582822, 0.868891, - 0.230999, 0.418576, 0.612847, 0.878941, - 0.231155, 0.410405, 0.642445, 0.888809, - 0.230935, 0.400544, 0.672024, 0.898089, - 0.229343, 0.389613, 0.701366, 0.908081, - 0.226886, 0.377197, 0.730763, 0.916819, - 0.222676, 0.363397, 0.759642, 0.924968, - 0.216835, 0.347437, 0.788775, 0.932906, - 0.210245, 0.32995, 0.817135, 0.940025, - 0.202992, 0.312262, 0.844912, 0.946101, - 0.19436, 0.293313, 0.872164, 0.952835, - 0.184125, 0.273638, 0.899443, 0.957347, - 0.173657, 0.252385, 0.926389, 0.961434, - 0.162204, 0.231038, 0.951947, 0.965522, - 0.14979, 0.209834, 0.976751, 0.969412, - 0.136307, 0.188821, 1.00022, 0.973902, - 0.122527, 0.168013, 1.02229, 0.974045, - 0.108213, 0.147634, 1.04199, 0.975775, - 0.0927397, 0.12705, 1.06019, 0.978383, - 0.0778212, 0.106309, 1.07711, 0.98211, - 0.0621216, 0.0849279, 1.09245, 0.986517, - 0.0463847, 0.0633519, 1.10651, 0.991696, - 0.0309353, 0.0419698, 1.11903, 0.996349, - 0.0150914, 0.0206272, 1.13073, 1.00003, 0.000442449, - 0.000231396, 1.14146, 0.727498, - 8.85074e-06, 0.441528, 1.45832e-05, 0.730897, - 0.000223525, 0.443589, 0.000368298, 0.730796, - 0.000893996, 0.443528, 0.00147303, 0.730805, - 0.00201149, 0.443533, 0.00331433, 0.730814, - 0.00357596, 0.443538, 0.00589222, 0.730815, - 0.00558734, 0.443538, 0.00920678, 0.730822, - 0.00804544, 0.44354, 0.0132582, 0.730836, - 0.0109501, 0.443545, 0.0180468, 0.730848, - 0.0143008, 0.443546, 0.0235732, 0.730871, - 0.0180969, 0.443552, 0.0298382, 0.730915, - 0.022338, 0.443567, 0.0368438, 0.730982, - 0.0270225, 0.443591, 0.044591, 0.731076, - 0.0321491, 0.443627, 0.0530831, 0.731245, - 0.0377166, 0.443699, 0.0623243, 0.73144, - 0.0437216, 0.443777, 0.0723181, 0.7317, - 0.0501576, 0.443881, 0.0830691, 0.732034, - 0.0569942, 0.444014, 0.0945809, 0.732388, - 0.0638756, 0.444113, 0.106825, 0.732853, - 0.071203, 0.444247, 0.119859, 0.733473, - 0.0790076, 0.444442, 0.13369, 0.734195, - 0.0871937, 0.444645, 0.148304, 0.735069, - 0.095696, 0.444877, 0.163702, 0.736169, - 0.10426, 0.445133, 0.179861, 0.73747, - 0.112853, 0.44537, 0.196778, 0.738991, - 0.12199, 0.445651, 0.214496, 0.740865, - 0.131153, 0.445958, 0.232913, 0.743637, - 0.140245, 0.446548, 0.251977, 0.746797, - 0.149722, 0.447246, 0.271551, 0.751517, - 0.159341, 0.448656, 0.291774, 0.756156, - 0.169106, 0.449866, 0.312455, 0.761519, - 0.178436, 0.450919, 0.334552, 0.768295, - 0.186904, 0.451776, 0.358491, 0.776613, - 0.195117, 0.452832, 0.383446, 0.783966, - 0.202695, 0.45249, 0.408945, 0.793542, - 0.20985, 0.452587, 0.435364, 0.803192, - 0.216403, 0.451852, 0.462336, 0.813892, - 0.22251, 0.450708, 0.48987, 0.824968, - 0.227676, 0.4486, 0.517697, 0.835859, - 0.232443, 0.445156, 0.545975, 0.846825, - 0.235775, 0.440351, 0.574483, 0.858085, - 0.237897, 0.433641, 0.604246, 0.868825, - 0.238074, 0.425354, 0.634101, 0.879638, - 0.237661, 0.415383, 0.664201, 0.889966, - 0.236186, 0.404136, 0.693918, 0.899479, - 0.233599, 0.390917, 0.723481, 0.908769, - 0.229737, 0.376352, 0.75258, 0.917966, - 0.223836, 0.360372, 0.781764, 0.926304, - 0.217067, 0.342551, 0.811139, 0.934626, - 0.209309, 0.324238, 0.839585, 0.941841, - 0.20071, 0.304484, 0.867044, 0.94789, - 0.190602, 0.283607, 0.894579, 0.954196, - 0.179253, 0.262205, 0.921743, 0.958383, - 0.167646, 0.239847, 0.948026, 0.963119, - 0.155073, 0.218078, 0.973296, 0.966941, - 0.141426, 0.195899, 0.998135, 0.970836, - 0.126849, 0.174121, 1.02021, 0.973301, - 0.112296, 0.153052, 1.04085, 0.97448, - 0.0964965, 0.131733, 1.05946, 0.977045, - 0.080489, 0.10997, 1.07693, 0.980751, - 0.064844, 0.0881657, 1.09254, 0.985475, - 0.0481938, 0.0657987, 1.10697, 0.991089, - 0.0319185, 0.0435215, 1.12004, 0.996122, - 0.0158088, 0.0214779, 1.13173, 1.00001, 0.000372455, - 0.000200295, 1.14291, 0.708622, - 9.07597e-06, 0.45304, 1.41962e-05, 0.711162, - 0.000228911, 0.454662, 0.000358052, 0.709812, - 0.000914446, 0.453797, 0.00143034, 0.709865, - 0.00205819, 0.453834, 0.00321935, 0.709864, - 0.00365894, 0.453833, 0.00572331, 0.709855, - 0.00571692, 0.453826, 0.00894278, 0.709862, - 0.00823201, 0.453828, 0.012878, 0.709875, - 0.011204, 0.453832, 0.0175295, 0.709896, - 0.0146323, 0.453839, 0.0228978, 0.709925, - 0.0185163, 0.453847, 0.0289839, 0.709974, - 0.0228551, 0.453866, 0.0357894, 0.710045, - 0.0276473, 0.453892, 0.0433161, 0.710133, - 0.032891, 0.453924, 0.0515665, 0.710292, - 0.0385851, 0.453992, 0.0605458, 0.710485, - 0.0447254, 0.45407, 0.0702574, 0.710769, - 0.0513051, 0.454192, 0.0807077, 0.711106, - 0.0582733, 0.454329, 0.091896, 0.711516, - 0.0652866, 0.45446, 0.103814, 0.712071, - 0.0728426, 0.454653, 0.116508, 0.712676, - 0.0808307, 0.45484, 0.129968, 0.713476, - 0.0892216, 0.455096, 0.144206, 0.714377, - 0.0979047, 0.455346, 0.159212, 0.715579, - 0.106531, 0.455647, 0.174973, 0.716977, - 0.115492, 0.455961, 0.191504, 0.71862, - 0.124821, 0.456315, 0.208835, 0.72084, - 0.134079, 0.4568, 0.226869, 0.723786, - 0.143427, 0.457521, 0.245582, 0.727464, - 0.153061, 0.458475, 0.264957, 0.732771, - 0.162768, 0.460239, 0.284948, 0.736515, - 0.172627, 0.460899, 0.30522, 0.743519, - 0.182487, 0.463225, 0.326717, 0.750041, - 0.191295, 0.464027, 0.350113, 0.758589, - 0.199746, 0.465227, 0.374782, 0.767703, - 0.207584, 0.465877, 0.400226, 0.777484, - 0.214973, 0.465996, 0.426442, 0.788792, - 0.221796, 0.466019, 0.453688, 0.800194, - 0.228038, 0.465083, 0.481246, 0.811234, - 0.233346, 0.462506, 0.509086, 0.822859, - 0.238073, 0.459257, 0.537338, 0.835082, - 0.241764, 0.454863, 0.566108, 0.846332, - 0.244241, 0.448163, 0.595126, 0.858355, - 0.244736, 0.439709, 0.625574, 0.87034, - 0.244278, 0.429837, 0.65617, 0.881027, - 0.24255, 0.418002, 0.686029, 0.891007, - 0.239912, 0.404325, 0.716039, 0.900874, - 0.236133, 0.389222, 0.745518, 0.911072, - 0.230672, 0.373269, 0.775026, 0.920359, - 0.22356, 0.355083, 0.804521, 0.928604, - 0.215591, 0.335533, 0.834045, 0.937175, - 0.206503, 0.315278, 0.861612, 0.942825, - 0.196684, 0.293653, 0.889131, 0.949805, - 0.185116, 0.271503, 0.916853, 0.955535, - 0.172703, 0.248821, 0.943541, 0.959843, - 0.159978, 0.225591, 0.970132, 0.964393, - 0.146375, 0.202719, 0.994709, 0.968008, - 0.131269, 0.179928, 1.0186, 0.971013, - 0.11569, 0.158007, 1.03928, 0.973334, - 0.1003, 0.13624, 1.05887, 0.975775, - 0.0833352, 0.1138, 1.07652, 0.979579, - 0.0668981, 0.0913141, 1.09297, 0.984323, - 0.0500902, 0.0683051, 1.10734, 0.990351, - 0.0332377, 0.0451771, 1.12084, 0.995823, - 0.0161491, 0.0221705, 1.13296, 1.0001, 0.000234083, - 0.000108712, 1.14441, 0.683895, - 9.24677e-06, 0.46015, 1.37429e-05, 0.68833, - 0.000233383, 0.463134, 0.000346865, 0.688368, - 0.000933547, 0.463159, 0.00138748, 0.688367, - 0.00210049, 0.463159, 0.00312187, 0.688369, - 0.00373415, 0.463159, 0.00555004, 0.688377, - 0.00583449, 0.463163, 0.00867216, 0.688386, - 0.00840128, 0.463166, 0.0124884, 0.688398, - 0.0114343, 0.463169, 0.0169993, 0.688418, - 0.0149329, 0.463175, 0.0222054, 0.688453, - 0.0188964, 0.463188, 0.028108, 0.688515, - 0.0233239, 0.463214, 0.0347085, 0.68857, - 0.0282136, 0.463231, 0.0420091, 0.688679, - 0.033564, 0.463276, 0.0500132, 0.688854, - 0.0393733, 0.463356, 0.0587255, 0.689038, - 0.0456354, 0.46343, 0.0681476, 0.689321, - 0.0523433, 0.463553, 0.0782897, 0.689662, - 0.059412, 0.463693, 0.0891501, 0.690188, - 0.0665736, 0.4639, 0.100735, 0.690755, - 0.0743106, 0.464107, 0.113074, 0.691405, - 0.0824722, 0.464329, 0.126161, 0.692198, - 0.0910484, 0.464585, 0.140007, 0.693196, - 0.0998778, 0.464893, 0.154612, 0.69454, - 0.108651, 0.465285, 0.169984, 0.695921, - 0.117855, 0.465596, 0.186106, 0.697749, - 0.12734, 0.466056, 0.203034, 0.700375, - 0.136714, 0.466771, 0.220703, 0.703395, - 0.146386, 0.467579, 0.239062, 0.707904, - 0.156096, 0.469067, 0.258188, 0.711673, - 0.165904, 0.469851, 0.277759, 0.717489, - 0.175812, 0.471815, 0.297935, 0.724051, - 0.185931, 0.47389, 0.318916, 0.731965, - 0.195238, 0.47587, 0.341591, 0.741151, - 0.204021, 0.477523, 0.366062, 0.751416, - 0.212113, 0.478881, 0.391396, 0.761848, - 0.21979, 0.479226, 0.417599, 0.771886, - 0.2267, 0.478495, 0.444401, 0.783998, - 0.232991, 0.477622, 0.472084, 0.796523, - 0.238645, 0.475833, 0.500193, 0.808851, - 0.243396, 0.472568, 0.52865, 0.821191, - 0.247226, 0.467857, 0.557362, 0.834261, - 0.250102, 0.461871, 0.586768, 0.846762, - 0.251056, 0.453543, 0.617085, 0.859867, - 0.250604, 0.443494, 0.647659, 0.871948, - 0.248783, 0.431711, 0.678119, 0.882967, - 0.245855, 0.417911, 0.708399, 0.892826, - 0.242168, 0.401993, 0.738256, 0.90332, - 0.237062, 0.385371, 0.767999, 0.913633, - 0.22997, 0.366837, 0.798191, 0.922774, - 0.221687, 0.346372, 0.827756, 0.931371, - 0.212345, 0.325682, 0.856425, 0.938929, - 0.20206, 0.303665, 0.884299, 0.944821, - 0.190981, 0.280786, 0.912023, 0.951792, - 0.178065, 0.2573, 0.939669, 0.957712, - 0.164634, 0.233448, 0.96655, 0.961912, - 0.150863, 0.209504, 0.992366, 0.966382, - 0.13577, 0.18597, 1.01633, 0.969588, - 0.119593, 0.162905, 1.03843, 0.971777, - 0.103203, 0.14053, 1.05841, 0.97433, - 0.0865888, 0.117909, 1.07632, 0.978686, - 0.0690829, 0.0944101, 1.09326, 0.983281, - 0.0516568, 0.0705671, 1.10796, 0.989562, - 0.034558, 0.0468592, 1.12182, 0.995465, - 0.0167808, 0.0229846, 1.1342, 0.999991, 0.000373016, - 0.000235606, 1.1459, 0.662251, - 9.39016e-06, 0.468575, 1.32714e-05, 0.666634, - 0.000237624, 0.471675, 0.000335842, 0.666411, - 0.000950385, 0.471516, 0.00134321, 0.666399, - 0.00213833, 0.471509, 0.00302221, 0.666386, - 0.0038014, 0.471499, 0.00537283, 0.666405, - 0.00593958, 0.471511, 0.00839533, 0.666406, - 0.00855253, 0.471508, 0.0120898, 0.666428, - 0.0116401, 0.471519, 0.0164569, 0.666444, - 0.0152015, 0.471522, 0.0214971, 0.66649, - 0.0192362, 0.471543, 0.027212, 0.666537, - 0.0237428, 0.471558, 0.033603, 0.666617, - 0.0287198, 0.471591, 0.0406728, 0.666718, - 0.0341647, 0.471631, 0.0484238, 0.666889, - 0.0400759, 0.47171, 0.0568621, 0.667104, - 0.0464479, 0.471805, 0.0659915, 0.667374, - 0.0532677, 0.471923, 0.0758178, 0.667772, - 0.0603805, 0.472098, 0.0863425, 0.668371, - 0.0677392, 0.472363, 0.0975917, 0.668971, - 0.0756028, 0.472596, 0.109567, 0.669696, - 0.0839293, 0.472869, 0.122272, 0.670481, - 0.0926683, 0.473126, 0.135718, 0.6715, - 0.1016, 0.473442, 0.149914, 0.672911, - 0.110566, 0.47389, 0.164882, 0.674512, - 0.119984, 0.474354, 0.180602, 0.67651, - 0.129574, 0.474922, 0.19711, 0.679292, - 0.139106, 0.475764, 0.214371, 0.682798, - 0.148993, 0.476886, 0.232405, 0.686955, - 0.158737, 0.478179, 0.251153, 0.691406, - 0.168754, 0.479432, 0.270436, 0.697438, - 0.178703, 0.481481, 0.290374, 0.704761, - 0.188955, 0.484143, 0.311044, 0.713599, - 0.198814, 0.487007, 0.333003, 0.723194, - 0.207869, 0.488962, 0.357144, 0.732601, - 0.216189, 0.489815, 0.382169, 0.744193, - 0.22398, 0.490888, 0.408227, 0.754907, - 0.231156, 0.490355, 0.434928, 0.767403, - 0.23747, 0.489548, 0.462599, 0.78107, - 0.243503, 0.488274, 0.490908, 0.793893, - 0.248114, 0.484843, 0.519421, 0.807296, - 0.25222, 0.4803, 0.548561, 0.820529, - 0.255265, 0.474097, 0.577772, 0.833716, - 0.256741, 0.466041, 0.607782, 0.848403, - 0.25637, 0.456547, 0.638807, 0.860755, - 0.254804, 0.443946, 0.670058, 0.874012, - 0.251834, 0.430852, 0.700749, 0.885619, - 0.247867, 0.414903, 0.731446, 0.896069, - 0.242634, 0.397276, 0.761191, 0.906266, - 0.236093, 0.378535, 0.791053, 0.916759, - 0.227543, 0.358038, 0.821298, 0.92523, - 0.21783, 0.335705, 0.850747, 0.93436, - 0.207534, 0.313797, 0.879258, 0.941631, - 0.195983, 0.289671, 0.907734, 0.947564, - 0.183567, 0.265319, 0.935206, 0.953681, - 0.169345, 0.240815, 0.962739, 0.960008, - 0.154909, 0.216119, 0.989227, 0.964145, - 0.140161, 0.192096, 1.01465, 0.968171, - 0.123411, 0.167855, 1.03737, 0.969859, - 0.106525, 0.144817, 1.05767, 0.972666, - 0.0891023, 0.12149, 1.0761, 0.977055, - 0.0718094, 0.0975306, 1.09336, 0.982527, - 0.0534213, 0.0730217, 1.10878, 0.989001, - 0.0355579, 0.0483366, 1.12285, 0.99512, - 0.0176383, 0.023938, 1.13548, 1.00007, 0.000368831, - 0.000211581, 1.14744, 0.651047, - 9.60845e-06, 0.484101, 1.2922e-05, 0.644145, - 0.000241347, 0.478968, 0.000324578, 0.64396, - 0.000965142, 0.478831, 0.00129798, 0.64396, - 0.00217154, 0.47883, 0.00292046, 0.643968, - 0.00386049, 0.478835, 0.00519202, 0.643974, - 0.00603186, 0.478838, 0.0081128, 0.643977, - 0.0086854, 0.478836, 0.011683, 0.643982, - 0.0118207, 0.478834, 0.0159031, 0.644024, - 0.0154374, 0.478856, 0.0207743, 0.644059, - 0.0195343, 0.478868, 0.0262975, 0.644122, - 0.0241103, 0.478896, 0.0324747, 0.644207, - 0.0291638, 0.478933, 0.039309, 0.64432, - 0.0346919, 0.478981, 0.0468029, 0.644481, - 0.0406919, 0.479053, 0.0549614, 0.644722, - 0.047159, 0.479169, 0.0637909, 0.645013, - 0.0540748, 0.479302, 0.0732974, 0.645503, - 0.0612001, 0.479541, 0.0834898, 0.646117, - 0.0687303, 0.479829, 0.0943873, 0.646707, - 0.0767846, 0.480061, 0.105991, 0.647431, - 0.0852465, 0.480343, 0.11831, 0.64831, - 0.0940719, 0.48066, 0.131348, 0.649486, - 0.103056, 0.481083, 0.14514, 0.650864, - 0.112261, 0.481528, 0.159676, 0.652604, - 0.121852, 0.482102, 0.174979, 0.654825, - 0.131505, 0.482813, 0.191079, 0.657876, - 0.141189, 0.483876, 0.207927, 0.661339, - 0.151239, 0.48499, 0.225586, 0.665463, - 0.161091, 0.486279, 0.243947, 0.670542, - 0.171235, 0.487968, 0.262957, 0.677361, - 0.181347, 0.49053, 0.282781, 0.685672, - 0.191679, 0.493862, 0.303311, 0.694551, - 0.201781, 0.49699, 0.324607, 0.703753, - 0.211164, 0.498884, 0.347916, 0.713703, - 0.219675, 0.500086, 0.372628, 0.725911, - 0.227836, 0.501554, 0.398694, 0.73862, - 0.23533, 0.502193, 0.425529, 0.752118, - 0.241786, 0.501811, 0.453209, 0.76579, - 0.247865, 0.500185, 0.481381, 0.779568, - 0.252696, 0.497159, 0.51011, 0.793991, - 0.256802, 0.492765, 0.539322, 0.808182, - 0.259942, 0.486827, 0.569078, 0.821698, - 0.261703, 0.478386, 0.598818, 0.836009, - 0.262006, 0.468772, 0.629762, 0.849824, - 0.260333, 0.456352, 0.661366, 0.863888, - 0.257398, 0.442533, 0.69295, 0.876585, - 0.253264, 0.426573, 0.723608, 0.888665, - 0.248026, 0.408964, 0.754378, 0.899537, - 0.241487, 0.389677, 0.784761, 0.9094, - 0.233463, 0.368516, 0.814688, 0.920166, - 0.223397, 0.346624, 0.845009, 0.928899, - 0.21255, 0.322717, 0.874431, 0.937156, - 0.200869, 0.298698, 0.902922, 0.943861, - 0.188387, 0.273491, 0.931356, 0.949557, - 0.174341, 0.247866, 0.958854, 0.955862, - 0.158994, 0.222496, 0.986098, 0.961721, - 0.143664, 0.197522, 1.01229, 0.965976, - 0.127412, 0.17302, 1.03571, 0.968652, - 0.109798, 0.148954, 1.05699, 0.971084, - 0.0916787, 0.125044, 1.07587, 0.975584, - 0.0739634, 0.100577, 1.09372, 0.98122, - 0.055322, 0.0753666, 1.10948, 0.988253, - 0.0366825, 0.0498899, 1.12394, 0.99482, - 0.0180389, 0.024611, 1.13694, 1.00001, 0.000229839, - 0.000188283, 1.14919, 0.613867, - 9.64198e-06, 0.479449, 1.23452e-05, 0.621485, - 0.000244534, 0.485399, 0.000313091, 0.621429, - 0.000978202, 0.485353, 0.00125245, 0.62112, - 0.00220004, 0.485114, 0.00281687, 0.621119, - 0.0039111, 0.485112, 0.00500783, 0.621122, - 0.00611091, 0.485112, 0.00782498, 0.621133, - 0.00879922, 0.485117, 0.0112687, 0.621152, - 0.0119756, 0.485125, 0.0153394, 0.621183, - 0.0156396, 0.485139, 0.0200382, 0.621227, - 0.0197898, 0.485158, 0.0253663, 0.621298, - 0.0244253, 0.485192, 0.0313261, 0.621388, - 0.0295441, 0.485233, 0.0379204, 0.621507, - 0.0351432, 0.485286, 0.0451523, 0.621693, - 0.0412198, 0.485378, 0.0530277, 0.621933, - 0.0477673, 0.485495, 0.0615522, 0.622232, - 0.0547574, 0.485635, 0.0707316, 0.622809, - 0.0619417, 0.485943, 0.0805883, 0.623407, - 0.069625, 0.486232, 0.0911267, 0.62406, - 0.077796, 0.486516, 0.102354, 0.624835, - 0.0863731, 0.486838, 0.114279, 0.625758, - 0.095251, 0.487188, 0.126902, 0.627043, - 0.104299, 0.487695, 0.140285, 0.628438, - 0.113724, 0.488163, 0.154397, 0.630325, - 0.123417, 0.488858, 0.169267, 0.632801, - 0.133137, 0.489754, 0.184941, 0.635784, - 0.143052, 0.490815, 0.20136, 0.639406, - 0.153132, 0.492048, 0.218643, 0.643872, - 0.163143, 0.49363, 0.236615, 0.6499, - 0.17333, 0.496009, 0.255449, 0.657201, - 0.183622, 0.498994, 0.275006, 0.666221, - 0.194019, 0.502888, 0.295354, 0.674419, - 0.204192, 0.505459, 0.316244, 0.683729, - 0.21406, 0.507771, 0.33849, 0.695584, - 0.222854, 0.510245, 0.363166, 0.708583, - 0.231315, 0.512293, 0.389071, 0.721233, - 0.238911, 0.512747, 0.415737, 0.735134, - 0.245657, 0.512482, 0.443331, 0.750179, - 0.251879, 0.511526, 0.471891, 0.765073, - 0.256911, 0.508935, 0.500892, 0.779794, - 0.261144, 0.504341, 0.530294, 0.794801, - 0.264316, 0.498515, 0.560144, 0.810339, - 0.266276, 0.491015, 0.590213, 0.824818, - 0.266981, 0.481126, 0.620865, 0.839375, - 0.265778, 0.468685, 0.652687, 0.853043, - 0.262748, 0.453925, 0.684759, 0.867335, - 0.258474, 0.437912, 0.716209, 0.88037, - 0.253187, 0.419648, 0.747508, 0.891711, - 0.246476, 0.39982, 0.77797, 0.902896, - 0.238735, 0.37879, 0.808586, 0.913601, - 0.22885, 0.355891, 0.838843, 0.923019, - 0.217656, 0.331773, 0.869014, 0.933432, - 0.205539, 0.307356, 0.898512, 0.939691, - 0.192595, 0.281321, 0.9269, 0.946938, - 0.178945, 0.255441, 0.955297, 0.952372, - 0.163587, 0.229013, 0.983231, 0.95909, - 0.147214, 0.203179, 1.00971, 0.963675, - 0.13064, 0.17792, 1.03438, 0.968247, - 0.113121, 0.152898, 1.05625, 0.97001, - 0.0945824, 0.128712, 1.07598, 0.974458, - 0.0755648, 0.103349, 1.094, 0.980168, - 0.0571998, 0.0776731, 1.1104, 0.987295, - 0.0377994, 0.0514445, 1.12491, 0.994432, - 0.0186417, 0.025429, 1.13851, 0.999975, 0.000542714, - 0.000282356, 1.15108, 0.592656, - 9.80249e-06, 0.486018, 1.19532e-05, 0.598467, - 0.000247275, 0.490781, 0.000301531, 0.597934, - 0.000988317, 0.490343, 0.00120517, 0.597903, - 0.00222366, 0.490319, 0.0027116, 0.597913, - 0.00395315, 0.490327, 0.00482077, 0.597919, - 0.00617653, 0.490329, 0.00753264, 0.597936, - 0.00889375, 0.490339, 0.0108478, 0.597956, - 0.0121043, 0.490347, 0.0147668, 0.597992, - 0.0158073, 0.490365, 0.0192905, 0.598032, - 0.0200017, 0.490382, 0.0244204, 0.598109, - 0.0246865, 0.49042, 0.0301593, 0.598215, - 0.0298594, 0.490474, 0.03651, 0.59833, - 0.0355167, 0.490524, 0.0434757, 0.598525, - 0.0416559, 0.490624, 0.0510629, 0.598778, - 0.0482692, 0.490753, 0.0592781, 0.599135, - 0.0553114, 0.49094, 0.0681304, 0.599802, - 0.062542, 0.491328, 0.0776467, 0.600361, - 0.0703638, 0.491598, 0.0878184, 0.60101, - 0.0786256, 0.491882, 0.0986573, 0.601811, - 0.0872962, 0.492232, 0.11018, 0.602861, - 0.0962284, 0.492684, 0.1224, 0.604167, - 0.10538, 0.493213, 0.135354, 0.605693, - 0.114896, 0.493799, 0.149034, 0.607682, - 0.124654, 0.494576, 0.163469, 0.610672, - 0.13456, 0.4959, 0.178747, 0.613313, - 0.144581, 0.496713, 0.194723, 0.617603, - 0.154703, 0.498499, 0.211617, 0.622174, - 0.16489, 0.500188, 0.229183, 0.628855, - 0.175164, 0.503072, 0.247786, 0.636963, - 0.185565, 0.506798, 0.267116, 0.644866, - 0.195911, 0.509719, 0.28702, 0.653741, - 0.206104, 0.512776, 0.307763, 0.664942, - 0.216447, 0.516812, 0.329631, 0.67633, - 0.22552, 0.519181, 0.353515, 0.690012, - 0.234316, 0.521681, 0.379226, 0.704243, - 0.242032, 0.523129, 0.405901, 0.719396, - 0.249172, 0.523768, 0.433585, 0.734471, - 0.255543, 0.522541, 0.462085, 0.750539, - 0.260697, 0.520217, 0.491233, 0.766365, - 0.26501, 0.516293, 0.521094, 0.781677, - 0.268409, 0.509708, 0.551014, 0.797132, - 0.270399, 0.501944, 0.581463, 0.812655, - 0.271247, 0.492025, 0.612402, 0.828592, - 0.270708, 0.480424, 0.643798, 0.844044, - 0.268085, 0.465955, 0.67682, 0.857305, - 0.263459, 0.448425, 0.708496, 0.87114, - 0.258151, 0.430243, 0.74046, 0.884936, - 0.251171, 0.410578, 0.771583, 0.895772, - 0.243305, 0.38862, 0.802234, 0.906961, - 0.234037, 0.365214, 0.833179, 0.917775, - 0.222714, 0.34116, 0.86353, 0.927883, - 0.210175, 0.31572, 0.893557, 0.936617, - 0.196925, 0.289159, 0.922976, 0.943384, - 0.182788, 0.261996, 0.951606, 0.949713, - 0.167965, 0.235324, 0.979958, 0.955818, - 0.151109, 0.208408, 1.00765, 0.961344, - 0.133834, 0.182591, 1.03329, 0.965469, - 0.115987, 0.156958, 1.0557, 0.968693, - 0.09746, 0.132239, 1.07583, 0.973165, - 0.0778514, 0.106195, 1.09451, 0.979387, - 0.0585067, 0.0797669, 1.11137, 0.98671, - 0.0390409, 0.0530263, 1.12643, 0.994093, - 0.019408, 0.0263163, 1.14016, 1.00002, 0.000540029, - 0.000194487, 1.15299, 0.574483, - 9.89066e-06, 0.494533, 1.14896e-05, 0.574478, - 0.000249127, 0.494528, 0.000289403, 0.574607, - 0.000996811, 0.494637, 0.00115797, 0.574396, - 0.00224241, 0.494458, 0.00260498, 0.574377, - 0.00398632, 0.49444, 0.00463102, 0.574386, - 0.00622836, 0.494445, 0.00723623, 0.574401, - 0.0089683, 0.494453, 0.010421, 0.574419, - 0.0122056, 0.49446, 0.0141859, 0.574459, - 0.0159396, 0.494481, 0.0185322, 0.574525, - 0.0201692, 0.49452, 0.0234617, 0.574587, - 0.0248924, 0.494547, 0.0289762, 0.574697, - 0.0301074, 0.494604, 0.0350797, 0.574853, - 0.0358114, 0.494688, 0.0417767, 0.575027, - 0.041999, 0.494772, 0.0490718, 0.575294, - 0.0486618, 0.494915, 0.0569728, 0.575733, - 0.0557148, 0.495173, 0.0654955, 0.576356, - 0.0630489, 0.495537, 0.0746612, 0.576944, - 0.0709285, 0.495836, 0.0844615, 0.57765, - 0.0792723, 0.496177, 0.0949142, 0.578491, - 0.0880167, 0.496563, 0.10603, 0.579639, - 0.0969462, 0.497096, 0.117841, 0.580989, - 0.10622, 0.497684, 0.130367, 0.582587, - 0.115861, 0.498337, 0.143609, 0.584951, - 0.125605, 0.499414, 0.157625, 0.587602, - 0.135608, 0.500518, 0.172413, 0.59076, - 0.145742, 0.501767, 0.187999, 0.594992, - 0.155934, 0.503542, 0.20445, 0.600656, - 0.166303, 0.506135, 0.221764, 0.607816, - 0.176681, 0.509542, 0.24002, 0.61522, - 0.187071, 0.51263, 0.258992, 0.623702, - 0.197465, 0.516021, 0.278773, 0.634192, - 0.207816, 0.520422, 0.299377, 0.644936, - 0.218183, 0.524073, 0.320802, 0.657888, - 0.2278, 0.528049, 0.34384, 0.670666, - 0.236747, 0.52986, 0.36916, 0.685626, - 0.24484, 0.531892, 0.395867, 0.701304, - 0.252071, 0.532727, 0.423488, 0.717727, - 0.258714, 0.532146, 0.452201, 0.733914, - 0.264211, 0.529883, 0.481579, 0.750529, - 0.26859, 0.5259, 0.511558, 0.76747, - 0.272046, 0.51999, 0.542042, 0.785189, - 0.274225, 0.513083, 0.572799, 0.800954, - 0.275189, 0.502936, 0.603816, 0.816962, - 0.274946, 0.490921, 0.635461, 0.83336, - 0.272695, 0.47684, 0.6676, 0.848143, - 0.268223, 0.459405, 0.70051, 0.861818, - 0.262768, 0.440319, 0.732902, 0.876828, - 0.255872, 0.420123, 0.765084, 0.889312, - 0.247703, 0.398379, 0.796391, 0.900412, - 0.238381, 0.374496, 0.827333, 0.912251, - 0.227783, 0.349874, 0.858385, 0.921792, - 0.214832, 0.323181, 0.888652, 0.931273, - 0.200949, 0.296624, 0.917763, 0.940295, - 0.186537, 0.269211, 0.947878, 0.946812, - 0.171538, 0.241447, 0.977016, 0.953588, - 0.155254, 0.213829, 1.00501, 0.958841, - 0.137156, 0.186807, 1.03179, 0.963746, - 0.118699, 0.160706, 1.05502, 0.966468, - 0.0998358, 0.135504, 1.07568, 0.971178, - 0.0805186, 0.109131, 1.09479, 0.97831, - 0.0599348, 0.0818293, 1.1123, 0.985886, - 0.0399661, 0.0545872, 1.12771, 0.994021, - 0.0198682, 0.0269405, 1.14186, 1.00009, 0.000271022, - 0.00012989, 1.15514, 0.538716, - 9.90918e-06, 0.486732, 1.09675e-05, 0.550656, - 0.000250642, 0.497518, 0.000277412, 0.55057, - 0.00100265, 0.497441, 0.00110974, 0.550903, - 0.00225672, 0.497733, 0.00249779, 0.550568, - 0.00401046, 0.497438, 0.00443906, 0.550574, - 0.00626613, 0.49744, 0.00693637, 0.550591, - 0.0090226, 0.497449, 0.00998921, 0.550623, - 0.0122795, 0.497469, 0.0135984, 0.550667, - 0.0160361, 0.497495, 0.0177654, 0.550724, - 0.0202908, 0.497526, 0.0224915, 0.550792, - 0.0250421, 0.497557, 0.0277795, 0.550918, - 0.0302878, 0.49763, 0.0336334, 0.551058, - 0.0360241, 0.497701, 0.0400573, 0.551276, - 0.0422473, 0.497824, 0.0470585, 0.551551, - 0.0489441, 0.497977, 0.0546433, 0.552074, - 0.0559596, 0.498312, 0.0628367, 0.552681, - 0.0633978, 0.498679, 0.071646, 0.553324, - 0.0713176, 0.499031, 0.0810746, 0.554011, - 0.0797268, 0.499365, 0.091129, 0.55488, - 0.0885238, 0.499779, 0.101837, 0.556171, - 0.0974417, 0.500444, 0.113239, 0.557498, - 0.106841, 0.501025, 0.125316, 0.559299, - 0.116533, 0.501864, 0.138128, 0.561647, - 0.126298, 0.502967, 0.151695, 0.564347, - 0.136388, 0.504129, 0.16604, 0.567863, - 0.146576, 0.505713, 0.181207, 0.572569, - 0.156832, 0.507953, 0.197259, 0.578919, - 0.167323, 0.511186, 0.214258, 0.585387, - 0.177712, 0.514042, 0.232038, 0.593134, - 0.188184, 0.517484, 0.250733, 0.603295, - 0.198717, 0.522345, 0.270454, 0.613854, - 0.209177, 0.526751, 0.290807, 0.626092, - 0.219644, 0.531595, 0.312202, 0.637868, - 0.229494, 0.534721, 0.334435, 0.652458, - 0.238718, 0.538304, 0.359184, 0.666985, - 0.247061, 0.539875, 0.385637, 0.683301, - 0.254652, 0.541042, 0.41328, 0.69998, - 0.261376, 0.540735, 0.441903, 0.717824, - 0.267085, 0.539139, 0.471609, 0.734617, - 0.271465, 0.534958, 0.501446, 0.753663, - 0.27528, 0.53032, 0.532571, 0.770512, - 0.277617, 0.522134, 0.563641, 0.787356, - 0.278525, 0.51206, 0.595067, 0.806252, - 0.278512, 0.50119, 0.627226, 0.822061, - 0.277023, 0.486791, 0.659402, 0.838959, - 0.273175, 0.470467, 0.692874, 0.85379, - 0.267238, 0.450688, 0.725702, 0.868268, - 0.260327, 0.429741, 0.75832, 0.881994, - 0.251946, 0.407223, 0.790189, 0.893885, - 0.242432, 0.383214, 0.821625, 0.905118, - 0.231904, 0.357297, 0.853011, 0.916045, - 0.219545, 0.330733, 0.883773, 0.927614, - 0.205378, 0.303916, 0.914435, 0.936005, - 0.190388, 0.275941, 0.944502, 0.944533, - 0.1749, 0.247493, 0.974439, 0.950758, - 0.158588, 0.218996, 1.00286, 0.957078, - 0.141027, 0.191559, 1.0304, 0.962448, - 0.121507, 0.164457, 1.05466, 0.964993, - 0.102068, 0.138636, 1.0761, 0.970017, - 0.0822598, 0.111861, 1.09541, 0.97661, - 0.062033, 0.0843438, 1.11317, 0.985073, - 0.0409832, 0.0558496, 1.12911, 0.993515, - 0.020146, 0.0275331, 1.1438, 1.00006, 0.00027329, - 0.000107883, 1.15736, 0.525324, - 9.99341e-06, 0.498153, 1.05385e-05, 0.526513, - 0.000251605, 0.499277, 0.000265329, 0.526517, - 0.00100641, 0.499282, 0.0010613, 0.526588, - 0.00226466, 0.499337, 0.00238823, 0.526539, - 0.0040255, 0.499302, 0.00424535, 0.526547, - 0.00628954, 0.499306, 0.00663364, 0.526561, - 0.00905628, 0.499313, 0.00955337, 0.526593, - 0.0123253, 0.499334, 0.0130054, 0.526642, - 0.0160957, 0.499365, 0.0169911, 0.5267, - 0.0203661, 0.499396, 0.0215122, 0.526792, - 0.0251347, 0.499451, 0.0265718, 0.526904, - 0.0303985, 0.499511, 0.0321732, 0.527079, - 0.0361554, 0.499617, 0.0383231, 0.527285, - 0.0423982, 0.499731, 0.045026, 0.527602, - 0.0491121, 0.499924, 0.0522936, 0.528166, - 0.0561127, 0.500306, 0.0601528, 0.52879, - 0.0635988, 0.5007, 0.0686059, 0.529421, - 0.071581, 0.501048, 0.0776518, 0.530144, - 0.0799854, 0.501421, 0.0873148, 0.531062, - 0.0888032, 0.501884, 0.0976084, 0.532374, - 0.0977643, 0.50259, 0.108588, 0.533828, - 0.107197, 0.50329, 0.120234, 0.53581, - 0.116887, 0.504312, 0.132602, 0.538063, - 0.126755, 0.505365, 0.145721, 0.5409, - 0.136819, 0.506668, 0.159617, 0.544882, - 0.147117, 0.508731, 0.174369, 0.550238, - 0.157446, 0.511601, 0.190028, 0.556038, - 0.167988, 0.514431, 0.206587, 0.563031, - 0.178364, 0.517808, 0.224046, 0.571543, - 0.189007, 0.521937, 0.242503, 0.582255, - 0.199546, 0.527415, 0.261977, 0.59272, - 0.210084, 0.531682, 0.282162, 0.605648, - 0.220448, 0.537123, 0.303426, 0.61785, - 0.230593, 0.540664, 0.325323, 0.632223, - 0.240238, 0.544467, 0.348993, 0.648819, - 0.24887, 0.547594, 0.375462, 0.665825, - 0.256657, 0.54912, 0.403024, 0.683389, - 0.263711, 0.549294, 0.431773, 0.701495, - 0.269666, 0.547649, 0.461494, 0.719197, - 0.274169, 0.543786, 0.491623, 0.737906, - 0.278124, 0.538644, 0.522994, 0.756652, - 0.280632, 0.531057, 0.554775, 0.775279, - 0.281741, 0.521972, 0.586441, 0.792688, - 0.281652, 0.509613, 0.618596, 0.811894, - 0.280345, 0.496497, 0.651462, 0.827938, - 0.277128, 0.47968, 0.684023, 0.844837, - 0.271646, 0.460688, 0.718024, 0.859239, - 0.264397, 0.438872, 0.751207, 0.874088, - 0.256144, 0.41577, 0.784232, 0.887693, - 0.246311, 0.391369, 0.816191, 0.899402, - 0.235497, 0.365872, 0.847828, 0.910973, - 0.223631, 0.338618, 0.87934, 0.92204, - 0.209874, 0.310803, 0.910325, 0.930987, - 0.194265, 0.281802, 0.940695, 0.94, - 0.178125, 0.252836, 0.970958, 0.948018, - 0.161479, 0.224239, 1.00078, 0.955141, - 0.144038, 0.195857, 1.0288, 0.960513, - 0.124915, 0.168487, 1.05371, 0.963964, - 0.104284, 0.141495, 1.07596, 0.968713, - 0.0838732, 0.114437, 1.09628, 0.975524, - 0.0635579, 0.0863105, 1.11448, 0.98431, - 0.042291, 0.0574774, 1.13069, 0.992916, - 0.0209131, 0.0284343, 1.14568, 0.999926, 0.000743097, - 0.000379265, 1.15955, 0.501042, - 9.98428e-06, 0.498726, 1.00306e-05, 0.502992, - 0.000252112, 0.500665, 0.000253283, 0.502417, - 0.00100791, 0.500092, 0.00101259, 0.502965, - 0.00226919, 0.500621, 0.00227978, 0.502318, - 0.00403109, 0.499994, 0.00405011, 0.502333, - 0.00629832, 0.500005, 0.00632868, 0.502362, - 0.00906907, 0.500027, 0.00911446, 0.502369, - 0.0123423, 0.500023, 0.0124078, 0.50243, - 0.0161178, 0.500066, 0.016211, 0.502493, - 0.0203937, 0.500103, 0.0205256, 0.502592, - 0.0251684, 0.500166, 0.0253548, 0.502707, - 0.0304389, 0.50023, 0.0307029, 0.502881, - 0.0362015, 0.500335, 0.0365753, 0.503124, - 0.0424507, 0.500488, 0.0429798, 0.503443, - 0.0491582, 0.500686, 0.0499268, 0.504083, - 0.0561476, 0.501155, 0.0574541, 0.504668, - 0.0636846, 0.501524, 0.0655408, 0.505319, - 0.0716834, 0.501904, 0.0742072, 0.50609, - 0.0800925, 0.502321, 0.0834699, 0.507122, - 0.0888425, 0.502896, 0.0933603, 0.508414, - 0.097855, 0.503603, 0.10391, 0.509955, - 0.107304, 0.504416, 0.115113, 0.512061, - 0.116921, 0.505565, 0.127054, 0.514419, - 0.12689, 0.506732, 0.139709, 0.517529, - 0.136934, 0.508338, 0.153173, 0.522085, - 0.147327, 0.510987, 0.167528, 0.526986, - 0.157612, 0.513527, 0.182708, 0.533122, - 0.168213, 0.516717, 0.198881, 0.540807, - 0.178688, 0.520832, 0.215986, 0.550687, - 0.189511, 0.52632, 0.234335, 0.560567, - 0.199998, 0.531009, 0.253375, 0.571698, - 0.210652, 0.535839, 0.273499, 0.584364, - 0.220917, 0.541091, 0.294355, 0.599066, - 0.23137, 0.546875, 0.316525, 0.614148, - 0.241206, 0.551306, 0.339671, 0.631157, - 0.250379, 0.555187, 0.36531, 0.647919, - 0.258397, 0.556595, 0.392767, 0.666112, - 0.265528, 0.556949, 0.421397, 0.686158, - 0.271827, 0.556617, 0.451433, 0.704838, - 0.27674, 0.552975, 0.482131, 0.723957, - 0.280733, 0.547814, 0.513458, 0.74262, - 0.283359, 0.53997, 0.545446, 0.762009, - 0.284541, 0.530422, 0.57775, 0.781314, - 0.284507, 0.518546, 0.610434, 0.799116, - 0.283309, 0.504178, 0.643178, 0.817604, - 0.280378, 0.48843, 0.676248, 0.83459, - 0.275619, 0.469457, 0.709698, 0.850974, - 0.26856, 0.447698, 0.744245, 0.866747, - 0.260094, 0.424791, 0.777695, 0.881412, - 0.249929, 0.399913, 0.810392, 0.8936, - 0.239137, 0.37308, 0.842872, 0.905943, - 0.226818, 0.345705, 0.874677, 0.916408, - 0.213699, 0.31706, 0.906257, 0.927215, - 0.198428, 0.288444, 0.936881, 0.935625, - 0.181643, 0.258329, 0.96795, 0.944076, - 0.164386, 0.228488, 0.998216, 0.951229, - 0.146339, 0.199763, 1.02689, 0.958793, - 0.127709, 0.172153, 1.0535, 0.963219, - 0.107244, 0.144989, 1.07646, 0.967562, - 0.0857764, 0.11685, 1.09675, 0.974866, - 0.0645377, 0.0880571, 1.11576, 0.983353, - 0.0431732, 0.0587352, 1.13227, 0.992503, - 0.0218356, 0.0294181, 1.1478, 1.00003, 0.000605203, - 0.000231013, 1.16207, 0.482935, - 1.01177e-05, 0.504695, 9.68142e-06, 0.477554, - 0.000251521, 0.499071, 0.000240676, 0.477904, - 0.00100683, 0.499436, 0.00096342, 0.478368, - 0.00226636, 0.499899, 0.0021687, 0.477977, - 0.00402719, 0.499513, 0.00385384, 0.477993, - 0.00629226, 0.499525, 0.0060221, 0.478011, - 0.00906011, 0.499536, 0.00867289, 0.478051, - 0.0123305, 0.499566, 0.0118074, 0.478089, - 0.016102, 0.499587, 0.0154269, 0.478171, - 0.0203736, 0.499645, 0.0195341, 0.478254, - 0.025143, 0.499692, 0.0241318, 0.47839, - 0.0304071, 0.499779, 0.0292247, 0.478588, - 0.0361631, 0.499911, 0.0348196, 0.478812, - 0.0424023, 0.500046, 0.0409231, 0.479208, - 0.0490724, 0.500326, 0.047552, 0.479841, - 0.0560722, 0.500805, 0.0547377, 0.480392, - 0.0636125, 0.501152, 0.0624607, 0.481068, - 0.0716134, 0.501561, 0.0707473, 0.481898, - 0.0800062, 0.502054, 0.0796118, 0.483022, - 0.0886568, 0.502728, 0.0890974, 0.484332, - 0.0977553, 0.503479, 0.0992099, 0.486126, - 0.107173, 0.504546, 0.10999, 0.488066, - 0.11677, 0.50557, 0.121476, 0.490521, - 0.126725, 0.506849, 0.133672, 0.494232, - 0.136793, 0.50911, 0.146731, 0.498302, - 0.147116, 0.511345, 0.160577, 0.503565, - 0.157446, 0.514344, 0.175335, 0.510902, - 0.168121, 0.518824, 0.191207, 0.519263, - 0.178799, 0.523666, 0.208058, 0.528204, - 0.189407, 0.528296, 0.225875, 0.538854, - 0.200145, 0.533724, 0.244782, 0.551278, - 0.210701, 0.539833, 0.264753, 0.565222, - 0.221303, 0.546131, 0.285745, 0.579403, - 0.231688, 0.551496, 0.307592, 0.595469, - 0.241718, 0.556809, 0.330582, 0.610929, - 0.250992, 0.559641, 0.354995, 0.629433, - 0.259602, 0.562379, 0.382471, 0.648504, - 0.267038, 0.563676, 0.411126, 0.66756, - 0.273388, 0.562092, 0.440924, 0.689143, - 0.278788, 0.560807, 0.472118, 0.709056, - 0.282783, 0.555701, 0.503774, 0.729855, - 0.285836, 0.548698, 0.536364, 0.748954, - 0.287078, 0.538544, 0.56895, 0.768373, - 0.287133, 0.526711, 0.601991, 0.78827, - 0.285839, 0.512511, 0.635403, 0.807465, - 0.283238, 0.496323, 0.668797, 0.825194, - 0.27906, 0.477638, 0.702584, 0.842203, - 0.272286, 0.456253, 0.736393, 0.857749, - 0.263854, 0.432412, 0.77096, 0.874799, - 0.253943, 0.407806, 0.80489, 0.887497, - 0.24237, 0.38033, 0.83771, 0.89966, - 0.230278, 0.352446, 0.870376, 0.911753, - 0.21646, 0.323268, 0.902256, 0.923011, - 0.202071, 0.294314, 0.933306, 0.932375, - 0.185519, 0.264104, 0.965177, 0.940537, - 0.167604, 0.234035, 0.996303, 0.948904, - 0.149068, 0.20412, 1.0261, 0.955263, - 0.129539, 0.175431, 1.05304, 0.960303, - 0.109932, 0.148116, 1.07617, 0.965512, - 0.0880572, 0.119693, 1.09742, 0.973466, - 0.0660548, 0.0901619, 1.11721, 0.98284, - 0.0439228, 0.0599875, 1.13436, 0.992216, - 0.0219588, 0.0298975, 1.15006, 0.999946, 0.000119402, - 2.08547e-05, 1.16471, 0.447827, - 1.00414e-05, 0.491543, 9.14833e-06, 0.454778, - 0.000251257, 0.499172, 0.00022891, 0.453519, - 0.00100342, 0.497787, 0.000914184, 0.45357, - 0.00225776, 0.497847, 0.00205701, 0.453578, - 0.00401371, 0.497855, 0.00365705, 0.45357, - 0.00627107, 0.497841, 0.00571453, 0.453598, - 0.00902968, 0.497864, 0.00823019, 0.453627, - 0.0122888, 0.497882, 0.0112049, 0.453684, - 0.0160475, 0.497923, 0.0146405, 0.453764, - 0.0203044, 0.49798, 0.0185394, 0.453866, - 0.0250576, 0.498049, 0.0229054, 0.453996, - 0.0303028, 0.49813, 0.0277424, 0.454196, - 0.0360379, 0.498267, 0.0330587, 0.454457, - 0.0422521, 0.498445, 0.0388613, 0.454926, - 0.0488393, 0.498812, 0.0451767, 0.455525, - 0.0558653, 0.499272, 0.0520153, 0.456074, - 0.0633772, 0.499625, 0.0593754, 0.456752, - 0.0713606, 0.500049, 0.0672751, 0.457648, - 0.07971, 0.500615, 0.0757447, 0.458849, - 0.0883032, 0.501399, 0.0848231, 0.46029, - 0.0974095, 0.502293, 0.0945135, 0.462, - 0.106729, 0.503301, 0.104848, 0.464121, - 0.116354, 0.504533, 0.115884, 0.466889, - 0.126214, 0.506172, 0.127652, 0.470744, - 0.136324, 0.508667, 0.14024, 0.47488, - 0.146595, 0.510995, 0.153673, 0.480845, - 0.157027, 0.514832, 0.168053, 0.488262, - 0.167658, 0.519506, 0.183508, 0.496547, - 0.178343, 0.524347, 0.199948, 0.506254, - 0.188916, 0.52983, 0.217503, 0.517961, - 0.199975, 0.536357, 0.236272, 0.531484, - 0.210624, 0.543641, 0.256096, 0.545496, - 0.221227, 0.550048, 0.277085, 0.559497, - 0.231568, 0.555076, 0.298615, 0.575752, - 0.241698, 0.560541, 0.321547, 0.591999, - 0.251172, 0.564156, 0.345602, 0.610654, - 0.260178, 0.567607, 0.371851, 0.630484, - 0.268094, 0.56923, 0.40076, 0.651807, - 0.274661, 0.569779, 0.430801, 0.67239, - 0.280331, 0.566791, 0.461939, 0.693024, - 0.284501, 0.562007, 0.493854, 0.715473, - 0.287852, 0.555791, 0.526992, 0.736323, - 0.28929, 0.546345, 0.560102, 0.755771, - 0.289405, 0.534, 0.593543, 0.775424, - 0.2881, 0.519114, 0.627256, 0.795447, - 0.285562, 0.502543, 0.661464, 0.815319, - 0.281416, 0.484773, 0.695206, 0.831769, - 0.275523, 0.463445, 0.729044, 0.849464, - 0.267516, 0.440269, 0.764069, 0.866775, - 0.257584, 0.415049, 0.799089, 0.881252, - 0.245817, 0.388049, 0.831948, 0.894209, - 0.233127, 0.35889, 0.865526, 0.906922, - 0.219579, 0.329915, 0.89818, 0.919686, - 0.204491, 0.300441, 0.930013, 0.929044, - 0.188962, 0.269445, 0.962061, 0.938393, - 0.171079, 0.238402, 0.994214, 0.94661, - 0.15199, 0.208204, 1.02533, 0.953095, - 0.131953, 0.178653, 1.0529, 0.958644, - 0.111233, 0.150684, 1.0771, 0.963925, - 0.0903098, 0.122359, 1.09855, 0.971995, - 0.0680505, 0.0923342, 1.11874, 0.981658, - 0.0448512, 0.0614195, 1.13635, 0.991649, - 0.0221931, 0.0303582, 1.15238, 0.999985, 0.000393403, - 0.000111086, 1.16772, 0.396806, - 9.71563e-06, 0.457671, 8.42355e-06, 0.429186, - 0.000249421, 0.495017, 0.00021625, 0.429324, - 0.000998052, 0.495173, 0.000865322, 0.429175, - 0.00224487, 0.494999, 0.00194637, 0.429129, - 0.00399041, 0.494952, 0.00346004, 0.429153, - 0.00623476, 0.494974, 0.00540684, 0.429168, - 0.0089773, 0.494983, 0.00778714, 0.429207, - 0.0122175, 0.495012, 0.0106022, 0.429257, - 0.0159542, 0.495047, 0.0138535, 0.429338, - 0.0201864, 0.495106, 0.0175443, 0.429431, - 0.0249104, 0.495165, 0.0216774, 0.429587, - 0.0301252, 0.495279, 0.0262594, 0.429796, - 0.0358249, 0.495432, 0.0312968, 0.430065, - 0.0419972, 0.495621, 0.0367985, 0.430588, - 0.0485144, 0.496061, 0.042798, 0.43113, - 0.0555028, 0.496472, 0.0492914, 0.431743, - 0.0629852, 0.496904, 0.0562907, 0.432448, - 0.0709256, 0.497369, 0.0638056, 0.433414, - 0.0791942, 0.498032, 0.071885, 0.434638, - 0.0877346, 0.498854, 0.0805517, 0.43611, - 0.0968056, 0.499812, 0.0898047, 0.437859, - 0.106002, 0.500891, 0.0997142, 0.440017, - 0.115648, 0.502198, 0.110289, 0.443236, - 0.125427, 0.504389, 0.121644, 0.44697, - 0.135492, 0.506809, 0.133769, 0.451689, - 0.145746, 0.509858, 0.146787, 0.45811, - 0.156219, 0.514247, 0.160793, 0.465305, - 0.166834, 0.518816, 0.175791, 0.474085, - 0.177546, 0.524331, 0.191906, 0.484808, - 0.188262, 0.53104, 0.209199, 0.49732, - 0.199346, 0.538511, 0.227825, 0.509693, - 0.209951, 0.544554, 0.247269, 0.524367, - 0.220533, 0.551616, 0.267978, 0.539228, - 0.231082, 0.557368, 0.289672, 0.55644, - 0.241342, 0.563782, 0.31268, 0.574204, - 0.250964, 0.568851, 0.33651, 0.593388, - 0.260306, 0.57312, 0.362219, 0.613358, - 0.268667, 0.574916, 0.390322, 0.634512, - 0.275591, 0.575053, 0.420478, 0.65563, - 0.281328, 0.572404, 0.451614, 0.678265, - 0.285948, 0.568893, 0.484112, 0.70011, - 0.289408, 0.561878, 0.517348, 0.723005, - 0.291328, 0.55359, 0.551355, 0.743744, - 0.291418, 0.541099, 0.585109, 0.763949, - 0.290252, 0.526489, 0.619487, 0.784186, - 0.287648, 0.509496, 0.65404, 0.804304, - 0.283782, 0.491484, 0.688649, 0.823629, - 0.278067, 0.470517, 0.723133, 0.84094, - 0.270588, 0.44705, 0.757163, 0.857852, - 0.261188, 0.421252, 0.792816, 0.874934, - 0.249313, 0.394191, 0.827248, 0.888709, - 0.236492, 0.365359, 0.861074, 0.902589, - 0.222185, 0.336016, 0.894417, 0.914201, - 0.207314, 0.30527, 0.926825, 0.925978, - 0.191146, 0.274532, 0.9595, 0.93512, - 0.174135, 0.243393, 0.991583, 0.943656, - 0.155231, 0.212414, 1.02356, 0.951719, - 0.134403, 0.182005, 1.05239, 0.957164, - 0.113023, 0.153043, 1.07754, 0.962656, - 0.0914493, 0.124186, 1.09984, 0.970695, - 0.0694179, 0.0941654, 1.12, 0.980749, - 0.0466199, 0.0629671, 1.13849, 0.991205, - 0.0227032, 0.0311146, 1.15494, 0.999884, 0.000632388, - 0.000254483, 1.1706, 0.379821, - 9.57289e-06, 0.460637, 7.89337e-06, 0.405188, - 0.000247483, 0.491396, 0.000204064, 0.404796, - 0.000989434, 0.490914, 0.000815853, 0.40483, - 0.00222607, 0.490949, 0.00183559, 0.40473, - 0.00395723, 0.49084, 0.00326332, 0.404731, - 0.00618287, 0.490836, 0.00509945, 0.404768, - 0.00890258, 0.490871, 0.00734463, 0.404791, - 0.0121156, 0.490883, 0.00999992, 0.404857, - 0.0158214, 0.490938, 0.0130676, 0.404943, - 0.0200178, 0.491004, 0.0165503, 0.405059, - 0.0247027, 0.491093, 0.0204521, 0.405213, - 0.0298729, 0.491205, 0.0247788, 0.405399, - 0.0355226, 0.491333, 0.0295373, 0.405731, - 0.0416352, 0.491604, 0.034741, 0.406303, - 0.0480807, 0.492116, 0.0404255, 0.406814, - 0.0550458, 0.492506, 0.0465732, 0.407404, - 0.0624652, 0.492926, 0.0532058, 0.408149, - 0.0702958, 0.493442, 0.0603442, 0.409128, - 0.0784623, 0.494136, 0.0680297, 0.410408, - 0.087007, 0.495054, 0.0762786, 0.411813, - 0.0959639, 0.495962, 0.0851046, 0.413735, - 0.105075, 0.497257, 0.0945878, 0.416137, - 0.114646, 0.498882, 0.104725, 0.41934, - 0.124394, 0.501132, 0.11563, 0.423326, - 0.134328, 0.503883, 0.127325, 0.428419, - 0.14458, 0.50747, 0.139911, 0.43484, - 0.154979, 0.511964, 0.153481, 0.442641, - 0.165628, 0.517328, 0.168114, 0.452511, - 0.176365, 0.524258, 0.183995, 0.463473, - 0.187298, 0.531248, 0.200953, 0.475564, - 0.198244, 0.538367, 0.219176, 0.488664, - 0.208938, 0.545175, 0.238514, 0.504073, - 0.219599, 0.553227, 0.259129, 0.520832, - 0.230378, 0.560653, 0.280997, 0.538455, - 0.240703, 0.567523, 0.303821, 0.55709, - 0.250548, 0.573287, 0.327948, 0.576646, - 0.259964, 0.577795, 0.353362, 0.596705, - 0.268721, 0.580077, 0.380336, 0.618053, - 0.276054, 0.58018, 0.4101, 0.640303, - 0.282176, 0.578747, 0.44161, 0.662365, - 0.286931, 0.574294, 0.474106, 0.684542, - 0.290521, 0.567035, 0.507549, 0.707984, - 0.292672, 0.558687, 0.541853, 0.730913, - 0.293189, 0.547606, 0.576581, 0.752948, - 0.292199, 0.533471, 0.61172, 0.773452, - 0.289508, 0.516395, 0.646339, 0.794715, - 0.285716, 0.497873, 0.682131, 0.814251, - 0.280051, 0.476845, 0.716396, 0.833057, - 0.272873, 0.453449, 0.751503, 0.84959, - 0.263982, 0.427857, 0.786085, 0.867022, - 0.252745, 0.400335, 0.821355, 0.882277, - 0.239655, 0.371304, 0.85646, 0.895375, - 0.225386, 0.340397, 0.890828, 0.909347, - 0.209587, 0.310005, 0.923532, 0.921885, - 0.193433, 0.2796, 0.956419, 0.932127, - 0.176135, 0.247276, 0.989445, 0.941869, - 0.157872, 0.216186, 1.02221, 0.949735, - 0.137577, 0.185602, 1.05195, 0.956617, - 0.115285, 0.155767, 1.07822, 0.961974, - 0.0928418, 0.126103, 1.10149, 0.96972, - 0.0700592, 0.0956758, 1.12207, 0.98012, - 0.0474671, 0.0643269, 1.1408, 0.990825, - 0.0238113, 0.0320863, 1.1577, 0.999876, 0.000381574, - 8.12203e-05, 1.17403, 0.367636, - 9.61342e-06, 0.469176, 7.53287e-06, 0.380377, - 0.000244772, 0.485434, 0.000191797, 0.380416, - 0.000978857, 0.485475, 0.000767015, 0.380376, - 0.00220165, 0.485435, 0.00172522, 0.380419, - 0.00391408, 0.485487, 0.00306734, 0.380438, - 0.00611549, 0.485505, 0.00479332, 0.380462, - 0.00880558, 0.485525, 0.00690391, 0.380496, - 0.0119837, 0.485551, 0.00940039, 0.38056, - 0.0156487, 0.485605, 0.0122848, 0.38064, - 0.0197988, 0.485666, 0.0155601, 0.380767, - 0.0244324, 0.48577, 0.0192313, 0.380909, - 0.0295444, 0.485871, 0.0233032, 0.381142, - 0.0351321, 0.48606, 0.0277861, 0.381472, - 0.0411535, 0.486336, 0.0326939, 0.382015, - 0.0475408, 0.486833, 0.0380565, 0.382523, - 0.0544395, 0.487231, 0.0438615, 0.383129, - 0.061784, 0.487683, 0.0501332, 0.383952, - 0.0695085, 0.488313, 0.0568996, 0.38498, - 0.0775819, 0.489077, 0.0641952, 0.386331, - 0.0860443, 0.490113, 0.0720324, 0.387788, - 0.0948406, 0.491099, 0.0804379, 0.389808, - 0.103899, 0.492566, 0.0894899, 0.39252, - 0.113313, 0.494601, 0.0992098, 0.395493, - 0.123007, 0.496619, 0.109641, 0.399826, - 0.132859, 0.499912, 0.120919, 0.405341, - 0.143077, 0.504061, 0.133107, 0.411932, - 0.153465, 0.508905, 0.146263, 0.420591, - 0.164108, 0.515482, 0.160544, 0.43101, - 0.174893, 0.523191, 0.176123, 0.441881, - 0.185839, 0.53026, 0.192757, 0.453919, - 0.196633, 0.537295, 0.210535, 0.468715, - 0.207611, 0.546156, 0.229886, 0.485182, - 0.218517, 0.555173, 0.250543, 0.501926, - 0.229249, 0.562728, 0.27221, 0.51785, - 0.239481, 0.567494, 0.294892, 0.536947, - 0.249395, 0.573889, 0.318987, 0.557115, - 0.259, 0.578831, 0.344348, 0.577966, - 0.268075, 0.582055, 0.371223, 0.599489, - 0.276115, 0.583307, 0.399834, 0.62479, - 0.282523, 0.583902, 0.431415, 0.647504, - 0.287663, 0.57953, 0.464301, 0.670601, - 0.291538, 0.573103, 0.498123, 0.693539, - 0.293842, 0.563731, 0.532662, 0.717385, - 0.294681, 0.553169, 0.567925, 0.741533, - 0.293717, 0.539908, 0.603502, 0.762142, - 0.291156, 0.521902, 0.639074, 0.783014, - 0.28719, 0.502815, 0.674439, 0.805158, - 0.281773, 0.482598, 0.710497, 0.823646, - 0.274682, 0.458949, 0.7456, 0.841879, - 0.266184, 0.433129, 0.781085, 0.859515, - 0.255682, 0.406064, 0.816, 0.875335, - 0.242849, 0.376509, 0.851074, 0.890147, - 0.228329, 0.345502, 0.886473, 0.903144, - 0.212491, 0.31428, 0.920751, 0.916618, - 0.195695, 0.282994, 0.954606, 0.927953, - 0.178267, 0.251091, 0.988402, 0.937414, - 0.159549, 0.219107, 1.02141, 0.946823, - 0.140022, 0.18896, 1.05167, 0.954651, - 0.118154, 0.158667, 1.07819, 0.959955, - 0.0946636, 0.128808, 1.1025, 0.96858, - 0.0711792, 0.0973787, 1.12391, 0.97938, - 0.0475046, 0.0650965, 1.14322, 0.990498, - 0.024059, 0.0326267, 1.16077, 0.999844, - 5.12408e-05, 0.000112444, 1.17727, 0.316912, - 9.34977e-06, 0.425996, 6.95559e-06, 0.356423, - 0.000241372, 0.479108, 0.000179562, 0.356272, - 0.000965292, 0.478897, 0.00071811, 0.356262, - 0.00217182, 0.478894, 0.00161574, 0.356265, - 0.00386092, 0.478895, 0.00287261, 0.356278, - 0.0060324, 0.478905, 0.00448907, 0.356293, - 0.00868565, 0.478914, 0.00646572, 0.356346, - 0.0118207, 0.478965, 0.00880438, 0.356395, - 0.0154355, 0.479001, 0.0115066, 0.356484, - 0.019529, 0.479075, 0.0145762, 0.356609, - 0.0240991, 0.47918, 0.018018, 0.356766, - 0.0291413, 0.479305, 0.0218379, 0.357009, - 0.0346498, 0.479512, 0.0260454, 0.357424, - 0.0405462, 0.479909, 0.0306657, 0.357899, - 0.0468825, 0.480337, 0.0357054, 0.358424, - 0.0536887, 0.480771, 0.0411728, 0.359041, - 0.0609416, 0.481242, 0.0470841, 0.359903, - 0.0685239, 0.481943, 0.0534831, 0.360932, - 0.0764883, 0.482741, 0.0603795, 0.362196, - 0.0848364, 0.483688, 0.0678028, 0.363847, - 0.0935002, 0.484947, 0.0758086, 0.365972, - 0.102471, 0.486588, 0.0844173, 0.368741, - 0.111751, 0.488787, 0.0937199, 0.372146, - 0.121334, 0.491405, 0.103732, 0.377114, - 0.131147, 0.495604, 0.114608, 0.38226, - 0.141213, 0.499436, 0.126345, 0.389609, - 0.151632, 0.505334, 0.139116, 0.397925, - 0.162073, 0.51168, 0.152995, 0.407824, - 0.172819, 0.518876, 0.168071, 0.420014, - 0.183929, 0.527639, 0.184495, 0.434266, - 0.195032, 0.537588, 0.20232, 0.447352, - 0.205792, 0.544379, 0.221189, 0.463726, - 0.216704, 0.553422, 0.241616, 0.481406, - 0.227531, 0.562074, 0.263298, 0.498707, - 0.238017, 0.568227, 0.286116, 0.518039, - 0.247936, 0.574473, 0.3101, 0.538277, - 0.257437, 0.579191, 0.335401, 0.561166, - 0.266829, 0.584807, 0.362246, 0.583189, - 0.275329, 0.586476, 0.390609, 0.606024, - 0.28234, 0.585578, 0.420998, 0.632419, - 0.287924, 0.584496, 0.454357, 0.656128, - 0.291972, 0.577766, 0.488233, 0.679953, - 0.29456, 0.56875, 0.523248, 0.704654, - 0.295816, 0.558388, 0.559168, 0.729016, - 0.295157, 0.544826, 0.595326, 0.752062, - 0.292779, 0.528273, 0.631864, 0.773138, - 0.288681, 0.508482, 0.667793, 0.794869, - 0.283358, 0.487341, 0.704035, 0.815101, - 0.27608, 0.46354, 0.739925, 0.834212, - 0.26767, 0.438672, 0.775539, 0.852368, - 0.257397, 0.411239, 0.810895, 0.870207, - 0.245689, 0.3829, 0.846472, 0.884063, - 0.231452, 0.351496, 0.881788, 0.898284, - 0.215561, 0.31895, 0.917438, 0.912964, - 0.198208, 0.287367, 0.952422, 0.924666, - 0.180426, 0.254487, 0.987551, 0.934429, - 0.161525, 0.222226, 1.02142, 0.943485, - 0.141197, 0.191143, 1.05218, 0.9521, - 0.120085, 0.161112, 1.07937, 0.957876, - 0.0975881, 0.130982, 1.10403, 0.966943, - 0.0726842, 0.0990553, 1.12616, 0.978313, - 0.0483705, 0.0662818, 1.14619, 0.990048, - 0.0239072, 0.0329243, 1.16413, 0.999984, 0.000461885, - 7.72859e-05, 1.18099, 0.321287, - 9.35049e-06, 0.455413, 6.59662e-06, 0.332595, - 0.000237513, 0.471437, 0.000167562, 0.332729, - 0.000949964, 0.471618, 0.000670192, 0.332305, - 0.00213618, 0.471028, 0.00150712, 0.332326, - 0.00379765, 0.471055, 0.00267959, 0.332344, - 0.00593353, 0.471072, 0.00418751, 0.332356, - 0.00854349, 0.471077, 0.00603172, 0.332403, - 0.0116268, 0.471121, 0.00821362, 0.332461, - 0.0151824, 0.47117, 0.0107357, 0.332552, - 0.0192088, 0.471251, 0.0136014, 0.332657, - 0.0237024, 0.47133, 0.0168152, 0.332835, - 0.0286615, 0.471487, 0.0203853, 0.333083, - 0.0340765, 0.471708, 0.0243212, 0.333547, - 0.0398563, 0.47219, 0.0286518, 0.333989, - 0.0460916, 0.472587, 0.0333763, 0.334532, - 0.0527897, 0.473054, 0.0385084, 0.335167, - 0.0599284, 0.473568, 0.0440638, 0.33608, - 0.0673514, 0.474362, 0.0500962, 0.337146, - 0.0752237, 0.475231, 0.0566022, 0.338462, - 0.083418, 0.476282, 0.0636272, 0.34014, - 0.0919382, 0.477615, 0.0712153, 0.342341, - 0.100741, 0.479404, 0.079417, 0.345088, - 0.109905, 0.481618, 0.0882631, 0.349049, - 0.119369, 0.485081, 0.0978851, 0.353939, - 0.129033, 0.489317, 0.108336, 0.359893, - 0.139038, 0.494309, 0.119698, 0.366945, - 0.149411, 0.499983, 0.132024, 0.375814, - 0.159843, 0.507185, 0.145558, 0.387112, - 0.170664, 0.516392, 0.160433, 0.40023, - 0.181897, 0.526519, 0.176648, 0.412555, - 0.192785, 0.53423, 0.193922, 0.427023, - 0.203663, 0.542741, 0.212662, 0.443685, - 0.214695, 0.552066, 0.232944, 0.461499, - 0.225561, 0.560762, 0.254495, 0.480975, - 0.236257, 0.569421, 0.277531, 0.501, - 0.24639, 0.576101, 0.301724, 0.521691, - 0.256101, 0.581493, 0.327112, 0.543478, - 0.265289, 0.585221, 0.353917, 0.566094, - 0.273938, 0.587614, 0.381941, 0.589578, - 0.281679, 0.587991, 0.41172, 0.614583, - 0.287655, 0.585928, 0.444148, 0.641813, - 0.292228, 0.582092, 0.478617, 0.666189, - 0.295172, 0.57398, 0.51397, 0.690475, - 0.29648, 0.561676, 0.550118, 0.715543, - 0.296203, 0.548758, 0.586933, 0.740405, - 0.293999, 0.532792, 0.62384, 0.762183, - 0.28998, 0.512735, 0.660723, 0.786069, - 0.28478, 0.492402, 0.69807, 0.806812, - 0.277568, 0.469058, 0.734422, 0.826987, - 0.268951, 0.443017, 0.770946, 0.844588, - 0.259049, 0.415501, 0.80699, 0.863725, - 0.2471, 0.387328, 0.842107, 0.879137, - 0.234157, 0.356108, 0.878078, 0.894634, - 0.218719, 0.324315, 0.914058, 0.909162, - 0.201293, 0.291813, 0.949922, 0.92072, - 0.18267, 0.258474, 0.985337, 0.93158, - 0.163212, 0.225593, 1.0205, 0.941238, - 0.142771, 0.193986, 1.05273, 0.949293, - 0.120956, 0.163392, 1.08075, 0.956226, - 0.0985743, 0.132934, 1.10559, 0.96546, - 0.075118, 0.101255, 1.12823, 0.977403, - 0.0497921, 0.0675441, 1.149, 0.989648, - 0.0241574, 0.0334681, 1.16765, 1.00001, 0.0005762, - 0.000184807, 1.18519, 0.303474, - 9.16603e-06, 0.4542, 6.1243e-06, 0.308894, - 0.000232869, 0.462306, 0.000155592, 0.309426, - 0.000931661, 0.463093, 0.000622499, 0.308643, - 0.0020949, 0.461933, 0.00139979, 0.308651, - 0.0037242, 0.461941, 0.00248874, 0.308662, - 0.00581873, 0.46195, 0.00388933, 0.308687, - 0.00837818, 0.461974, 0.00560247, 0.308728, - 0.0114016, 0.462011, 0.00762948, 0.308789, - 0.0148884, 0.462067, 0.00997326, 0.308882, - 0.0188369, 0.462151, 0.0126375, 0.309007, - 0.0232436, 0.462263, 0.0156271, 0.30918, - 0.0281054, 0.462417, 0.0189498, 0.309442, - 0.0334065, 0.462667, 0.0226167, 0.309901, - 0.0390589, 0.463162, 0.0266614, 0.310331, - 0.0452042, 0.463555, 0.0310715, 0.310858, - 0.0517735, 0.464019, 0.0358698, 0.311576, - 0.0587359, 0.464669, 0.0410848, 0.312436, - 0.0660383, 0.465406, 0.0467453, 0.313526, - 0.0737266, 0.466339, 0.0528718, 0.314903, - 0.0817574, 0.467504, 0.0595039, 0.316814, - 0.090167, 0.469226, 0.0666888, 0.318965, - 0.0987555, 0.470981, 0.0744658, 0.322077, - 0.107792, 0.473814, 0.082912, 0.325947, - 0.117098, 0.477241, 0.0920846, 0.331008, - 0.126602, 0.48184, 0.102137, 0.337893, - 0.136619, 0.488334, 0.113135, 0.345106, - 0.146838, 0.494415, 0.12511, 0.355111, - 0.157357, 0.503275, 0.138356, 0.365095, - 0.167955, 0.510966, 0.152686, 0.378344, - 0.179157, 0.521508, 0.16856, 0.391599, - 0.190143, 0.530455, 0.18561, 0.407786, - 0.20123, 0.541275, 0.204308, 0.425294, - 0.212456, 0.551784, 0.224623, 0.444021, - 0.223568, 0.561493, 0.246172, 0.463418, - 0.234154, 0.569886, 0.268979, 0.484077, - 0.244546, 0.577116, 0.293411, 0.505513, - 0.254301, 0.582914, 0.318936, 0.527672, - 0.263564, 0.587208, 0.345856, 0.550565, - 0.272332, 0.589277, 0.374054, 0.573656, - 0.280011, 0.588426, 0.403276, 0.59827, - 0.286924, 0.587504, 0.43474, 0.624731, - 0.291994, 0.583401, 0.468767, 0.652396, - 0.295159, 0.576997, 0.504411, 0.67732, - 0.296954, 0.565863, 0.54114, 0.703147, - 0.296877, 0.552316, 0.57816, 0.728715, - 0.295147, 0.536773, 0.616124, 0.752448, - 0.291275, 0.51771, 0.653885, 0.775169, - 0.285905, 0.496087, 0.691537, 0.799307, - 0.279064, 0.474232, 0.729251, 0.819482, - 0.270294, 0.447676, 0.766267, 0.837659, - 0.260032, 0.419656, 0.802616, 0.856903, - 0.248497, 0.391328, 0.838583, 0.873325, - 0.235252, 0.360285, 0.874711, 0.889788, - 0.221126, 0.329215, 0.91077, 0.904486, - 0.204304, 0.296392, 0.94653, 0.917711, - 0.185562, 0.262159, 0.983828, 0.928969, - 0.165635, 0.229142, 1.01955, 0.939707, - 0.14442, 0.19673, 1.05317, 0.948167, - 0.122147, 0.165095, 1.0823, 0.955222, - 0.099098, 0.13451, 1.10791, 0.964401, - 0.0755332, 0.102476, 1.1312, 0.976605, - 0.0513817, 0.0689667, 1.15218, 0.989085, - 0.0258499, 0.034506, 1.17129, 0.999908, 0.000617773, - 0.000271268, 1.18961, 0.285803, - 9.05752e-06, 0.452348, 5.72272e-06, 0.284689, - 0.00022732, 0.450581, 0.000143626, 0.285263, - 0.000910214, 0.451482, 0.000575099, 0.285302, - 0.00204784, 0.451553, 0.00129395, 0.285318, - 0.00364057, 0.451574, 0.0023006, 0.28533, - 0.00568813, 0.451585, 0.00359547, 0.285361, - 0.00819001, 0.451618, 0.00517934, 0.285397, - 0.0111458, 0.45165, 0.007054, 0.285447, - 0.0145536, 0.451688, 0.00922167, 0.285527, - 0.0184127, 0.451758, 0.0116869, 0.285688, - 0.0227207, 0.451929, 0.0144555, 0.28584, - 0.0274712, 0.452055, 0.0175341, 0.286136, - 0.0326278, 0.452369, 0.0209406, 0.286574, - 0.0381792, 0.452853, 0.0246965, 0.287012, - 0.0441879, 0.453272, 0.0287996, 0.287542, - 0.0506096, 0.453752, 0.033268, 0.288299, - 0.0573634, 0.454488, 0.0381504, 0.289186, - 0.0645458, 0.455294, 0.0434447, 0.290302, - 0.0720405, 0.456301, 0.0491973, 0.291776, - 0.0799046, 0.457648, 0.0554453, 0.29372, - 0.088117, 0.459483, 0.0622311, 0.296052, - 0.0965328, 0.461571, 0.0695992, 0.299563, - 0.105409, 0.465085, 0.077658, 0.30335, - 0.114553, 0.468506, 0.0864176, 0.309167, - 0.123917, 0.474423, 0.0961078, 0.31529, - 0.13381, 0.47995, 0.106643, 0.324163, - 0.144021, 0.488592, 0.118322, 0.333272, - 0.154382, 0.496461, 0.131133, 0.344224, - 0.165015, 0.50562, 0.145208, 0.357733, - 0.176168, 0.516719, 0.16073, 0.373046, - 0.187468, 0.528513, 0.177807, 0.38788, - 0.198488, 0.537713, 0.196072, 0.405133, - 0.209545, 0.547999, 0.21605, 0.423845, - 0.220724, 0.55759, 0.237484, 0.443777, - 0.231518, 0.566246, 0.26039, 0.464824, - 0.242035, 0.574326, 0.284835, 0.486635, - 0.251898, 0.58037, 0.310518, 0.51012, - 0.261304, 0.58568, 0.337678, 0.535301, - 0.270384, 0.590197, 0.366242, 0.559193, - 0.27841, 0.590569, 0.395873, 0.583544, - 0.285325, 0.588161, 0.426857, 0.608834, - 0.291113, 0.584249, 0.459477, 0.635753, - 0.294882, 0.57763, 0.494734, 0.664367, - 0.297088, 0.569479, 0.532023, 0.689688, - 0.297364, 0.555064, 0.569629, 0.715732, - 0.295949, 0.539522, 0.608124, 0.741307, - 0.292259, 0.521613, 0.646231, 0.764949, - 0.287063, 0.49969, 0.684938, 0.788599, - 0.28012, 0.476747, 0.723548, 0.81048, - 0.27153, 0.45116, 0.761135, 0.831372, - 0.261289, 0.424101, 0.798916, 0.850092, - 0.249559, 0.39443, 0.835952, 0.867777, - 0.236348, 0.363849, 0.871606, 0.884632, - 0.221569, 0.332477, 0.907843, 0.90047, - 0.20618, 0.300667, 0.944187, 0.914524, - 0.188771, 0.266552, 0.981371, 0.926892, - 0.168362, 0.232349, 1.01841, 0.937951, - 0.146761, 0.199359, 1.05308, 0.947236, - 0.123813, 0.1675, 1.0839, 0.954367, - 0.099984, 0.136166, 1.11047, 0.963907, - 0.0759278, 0.103808, 1.13414, 0.976218, - 0.0511367, 0.0697061, 1.15575, 0.988772, - 0.0267415, 0.0352529, 1.17531, 0.999888, - 0.000520778, 0.000289926, 1.19389, 0.263546, - 8.83274e-06, 0.441896, 5.26783e-06, 0.262352, - 0.000221849, 0.439889, 0.000132311, 0.262325, - 0.000886683, 0.439848, 0.000528824, 0.26228, - 0.00199476, 0.439765, 0.00118975, 0.262372, - 0.00354671, 0.439922, 0.00211568, 0.26239, - 0.00554141, 0.439941, 0.00330652, 0.262412, - 0.00797888, 0.439961, 0.00476346, 0.262453, - 0.0108584, 0.440002, 0.00648818, 0.262528, - 0.0141788, 0.440085, 0.0084835, 0.262615, - 0.017938, 0.440166, 0.0107533, 0.262744, - 0.0221346, 0.440291, 0.0133044, 0.262939, - 0.026762, 0.440493, 0.0161445, 0.263277, - 0.0317573, 0.440889, 0.0192974, 0.26368, - 0.0371832, 0.441338, 0.0227699, 0.264106, - 0.0430371, 0.441753, 0.0265698, 0.264624, - 0.0493035, 0.442227, 0.0307178, 0.265378, - 0.0558669, 0.442985, 0.0352616, 0.266253, - 0.0628718, 0.443795, 0.0401968, 0.267478, - 0.0701569, 0.445008, 0.04559, 0.269062, - 0.077845, 0.446599, 0.0514539, 0.270926, - 0.0857941, 0.448349, 0.0578382, 0.273693, - 0.0940773, 0.451221, 0.0648363, 0.276746, - 0.102704, 0.454097, 0.0724389, 0.281693, - 0.111735, 0.459517, 0.0808744, 0.287335, - 0.121004, 0.46531, 0.0901551, 0.29448, - 0.130734, 0.472605, 0.100371, 0.30257, - 0.140777, 0.480251, 0.111644, 0.312465, - 0.15111, 0.489444, 0.124111, 0.324856, - 0.16189, 0.500919, 0.137979, 0.33774, - 0.172946, 0.511317, 0.153163, 0.35255, - 0.184152, 0.522684, 0.169817, 0.367786, - 0.19522, 0.53248, 0.187886, 0.385474, - 0.20632, 0.543326, 0.207634, 0.404976, - 0.217744, 0.554109, 0.229165, 0.425203, - 0.228691, 0.563395, 0.252068, 0.446704, - 0.239299, 0.571565, 0.276471, 0.468951, - 0.249348, 0.577935, 0.302323, 0.493487, - 0.258933, 0.584309, 0.329882, 0.517861, - 0.268009, 0.58773, 0.358525, 0.543309, - 0.276238, 0.589612, 0.388585, 0.569704, - 0.28356, 0.589294, 0.419787, 0.594871, - 0.289497, 0.585137, 0.452114, 0.622555, - 0.294452, 0.580356, 0.486466, 0.651167, - 0.296918, 0.57185, 0.523079, 0.677332, - 0.297647, 0.558428, 0.5611, 0.703718, - 0.296321, 0.542232, 0.599592, 0.730262, - 0.293339, 0.524541, 0.639138, 0.754304, - 0.288036, 0.502691, 0.677978, 0.778051, - 0.281018, 0.479212, 0.716537, 0.801557, - 0.272414, 0.454071, 0.75586, 0.822559, - 0.262419, 0.425952, 0.794477, 0.843051, - 0.250702, 0.397313, 0.832664, 0.86232, - 0.237264, 0.366534, 0.869876, 0.879044, - 0.222716, 0.334816, 0.906973, 0.896362, - 0.206827, 0.303143, 0.943558, 0.910342, - 0.189659, 0.269699, 0.979759, 0.924119, - 0.171108, 0.236411, 1.01718, 0.935374, - 0.149579, 0.202224, 1.05289, 0.944295, - 0.126295, 0.16989, 1.08496, 0.952227, - 0.101511, 0.138089, 1.11256, 0.962041, - 0.0766392, 0.105053, 1.1375, 0.97528, - 0.0511967, 0.070329, 1.15983, 0.988476, - 0.025463, 0.0351268, 1.17987, 0.999962, 2.86808e-05, 1.45564e-05, 1.19901, 0.227089, - 8.41413e-06, 0.404216, 4.72707e-06, 0.239725, - 0.000215083, 0.426708, 0.000120833, 0.239904, - 0.000860718, 0.427028, 0.000483555, 0.239911, - 0.00193661, 0.427039, 0.00108806, 0.239914, - 0.00344276, 0.42704, 0.00193457, 0.239933, - 0.00537907, 0.427064, 0.00302363, 0.239944, - 0.00774482, 0.427065, 0.00435604, 0.239993, - 0.01054, 0.427122, 0.00593398, 0.240052, - 0.0137626, 0.427179, 0.00775987, 0.240148, - 0.0174115, 0.427279, 0.00983854, 0.240278, - 0.021484, 0.42741, 0.0121763, 0.240472, - 0.0259729, 0.427618, 0.0147827, 0.240839, - 0.0308131, 0.428086, 0.0176837, 0.241201, - 0.0360893, 0.428482, 0.0208775, 0.241626, - 0.0417723, 0.428907, 0.0243821, 0.242207, - 0.0478337, 0.42952, 0.0282228, 0.24298, - 0.0542199, 0.430332, 0.0324333, 0.243881, - 0.0610015, 0.431222, 0.0370252, 0.245123, - 0.0680874, 0.432512, 0.0420535, 0.24667, - 0.0755482, 0.434088, 0.0475414, 0.248779, - 0.0832873, 0.436323, 0.0535542, 0.251665, - 0.0913546, 0.439509, 0.0601716, 0.255305, - 0.0998489, 0.443478, 0.0674282, 0.260049, - 0.108576, 0.448713, 0.0754673, 0.266192, - 0.117754, 0.455524, 0.084339, 0.273158, - 0.127294, 0.4627, 0.0941683, 0.282131, - 0.137311, 0.472068, 0.10515, 0.293332, - 0.147736, 0.483565, 0.117402, 0.304667, - 0.158357, 0.493702, 0.130824, 0.317785, - 0.169274, 0.504708, 0.145724, 0.333245, - 0.180595, 0.517107, 0.16215, 0.349843, - 0.191892, 0.528849, 0.180149, 0.367944, - 0.203168, 0.540301, 0.199746, 0.387579, - 0.214443, 0.551514, 0.221047, 0.408247, - 0.225624, 0.560906, 0.243981, 0.43014, - 0.236422, 0.56959, 0.268513, 0.452669, - 0.24654, 0.576098, 0.294409, 0.476196, - 0.256157, 0.580925, 0.322002, 0.501157, - 0.265289, 0.584839, 0.351052, 0.527632, - 0.273671, 0.587614, 0.3812, 0.555754, - 0.281254, 0.589119, 0.412994, 0.581682, - 0.287448, 0.585204, 0.445498, 0.608196, - 0.292614, 0.579006, 0.479505, 0.635661, - 0.296068, 0.571297, 0.514643, 0.664999, - 0.297395, 0.560855, 0.552213, 0.691039, - 0.296645, 0.544525, 0.591365, 0.7179, - 0.293785, 0.526535, 0.630883, 0.744059, - 0.289089, 0.50545, 0.670932, 0.76863, - 0.282239, 0.482514, 0.710904, 0.793273, - 0.273688, 0.457246, 0.750259, 0.814731, - 0.26328, 0.428872, 0.78948, 0.835603, - 0.251526, 0.399384, 0.828597, 0.85489, - 0.238339, 0.368811, 0.866892, 0.872828, - 0.223607, 0.336617, 0.90563, 0.889462, - 0.207538, 0.303997, 0.943538, 0.904929, - 0.190297, 0.270812, 0.980591, 0.919101, - 0.172034, 0.237453, 1.01935, 0.930536, - 0.152058, 0.204431, 1.05498, 0.941223, - 0.129515, 0.172495, 1.08717, 0.94982, - 0.104263, 0.140175, 1.11551, 0.960592, - 0.0781944, 0.106465, 1.14098, 0.974629, - 0.051688, 0.0711592, 1.16418, 0.98811, - 0.0253929, 0.0354432, 1.18465, 1.00004, 0.000804378, - 0.000330876, 1.20462, 0.214668, - 8.21282e-06, 0.406619, 4.33582e-06, 0.218053, - 0.000208144, 0.413025, 0.000109887, 0.217987, - 0.000832212, 0.412901, 0.000439362, 0.217971, - 0.00187246, 0.412876, 0.000988623, 0.217968, - 0.00332855, 0.41286, 0.00175772, 0.217985, - 0.00520055, 0.412882, 0.00274729, 0.218014, - 0.00748814, 0.412916, 0.00395842, 0.218054, - 0.0101901, 0.412957, 0.00539274, 0.218106, - 0.0133057, 0.413005, 0.00705348, 0.218217, - 0.0168342, 0.413139, 0.00894581, 0.218338, - 0.0207707, 0.413258, 0.0110754, 0.21855, - 0.0251001, 0.413509, 0.0134551, 0.218913, - 0.0297861, 0.413992, 0.0161081, 0.219265, - 0.0348956, 0.414383, 0.0190307, 0.219696, - 0.0403909, 0.414839, 0.0222458, 0.220329, - 0.0462003, 0.415567, 0.025792, 0.220989, - 0.0524208, 0.41621, 0.0296637, 0.222027, - 0.058948, 0.417385, 0.0339323, 0.223301, - 0.0658208, 0.418779, 0.0386055, 0.224988, - 0.0730347, 0.420665, 0.0437355, 0.227211, - 0.0805274, 0.423198, 0.0493844, 0.230131, - 0.088395, 0.426566, 0.0556135, 0.233908, - 0.0966208, 0.43091, 0.0624829, 0.239092, - 0.105223, 0.437148, 0.0701636, 0.245315, - 0.11424, 0.444302, 0.0786949, 0.253166, - 0.12368, 0.453262, 0.0882382, 0.262374, - 0.133569, 0.463211, 0.0988682, 0.273145, - 0.143836, 0.474271, 0.110727, 0.285512, - 0.154577, 0.4863, 0.123945, 0.299512, - 0.165501, 0.498817, 0.138581, 0.314287, - 0.176698, 0.510341, 0.154676, 0.331083, - 0.188066, 0.522583, 0.172459, 0.349615, - 0.199597, 0.534879, 0.191979, 0.369318, - 0.210843, 0.546083, 0.21309, 0.390377, - 0.222068, 0.5562, 0.235998, 0.412411, - 0.233059, 0.564704, 0.260518, 0.435715, - 0.24357, 0.572314, 0.286795, 0.461196, - 0.253356, 0.579395, 0.314559, 0.485587, - 0.262362, 0.581985, 0.343581, 0.511908, - 0.270895, 0.584347, 0.374367, 0.539798, - 0.278452, 0.58505, 0.406015, 0.567974, - 0.284877, 0.583344, 0.439168, 0.594303, - 0.290124, 0.577348, 0.473005, 0.622951, - 0.294183, 0.570751, 0.508534, 0.652404, - 0.296389, 0.561541, 0.544764, 0.679291, - 0.296605, 0.546426, 0.582927, 0.706437, - 0.294095, 0.528599, 0.622681, 0.734485, - 0.28978, 0.508676, 0.663567, 0.758841, - 0.283363, 0.484768, 0.704092, 0.78537, - 0.275015, 0.460434, 0.745101, 0.807315, - 0.264689, 0.432166, 0.784712, 0.8271, - 0.252597, 0.401807, 0.824241, 0.849191, - 0.239154, 0.371458, 0.863803, 0.867046, - 0.224451, 0.338873, 0.903063, 0.8852, - 0.208342, 0.306175, 0.942763, 0.901771, - 0.190684, 0.272759, 0.981559, 0.915958, - 0.172105, 0.239306, 1.02048, 0.928046, - 0.152214, 0.206071, 1.05765, 0.939961, - 0.130247, 0.17367, 1.08999, 0.948711, - 0.10672, 0.142201, 1.11829, 0.959305, - 0.0808688, 0.108454, 1.14467, 0.973009, - 0.0539145, 0.0728109, 1.16839, 0.987631, - 0.0262947, 0.0360625, 1.19004, 0.999978, 0.00132758, - 0.000559424, 1.21058, 0.193925, - 7.93421e-06, 0.391974, 3.92537e-06, 0.196746, - 0.000200315, 0.397675, 9.91033e-05, 0.19667, - 0.000801099, 0.397521, 0.000396342, 0.196633, - 0.00180246, 0.397445, 0.000891829, 0.196654, - 0.00320443, 0.397482, 0.00158582, 0.196659, - 0.00500647, 0.39748, 0.00247867, 0.196683, - 0.0072086, 0.397506, 0.00357167, 0.196728, - 0.00981001, 0.397562, 0.00486675, 0.196792, - 0.0128096, 0.397633, 0.00636707, 0.19689, - 0.0162055, 0.397746, 0.00807752, 0.197017, - 0.0199943, 0.397884, 0.0100052, 0.19729, - 0.024139, 0.39827, 0.0121691, 0.197583, - 0.0286671, 0.398639, 0.0145755, 0.197927, - 0.0335858, 0.399034, 0.0172355, 0.198383, - 0.0388806, 0.399554, 0.0201718, 0.199002, - 0.0444736, 0.400289, 0.0234194, 0.199739, - 0.0504583, 0.401111, 0.026984, 0.200784, - 0.056729, 0.402349, 0.0309217, 0.202075, - 0.0633643, 0.403841, 0.0352496, 0.203898, - 0.0703247, 0.406076, 0.0400313, 0.206199, - 0.0775565, 0.408841, 0.0453282, 0.209252, - 0.085184, 0.41259, 0.0511794, 0.213638, - 0.0931994, 0.418288, 0.0577459, 0.21881, - 0.101617, 0.424681, 0.0650508, 0.225642, - 0.11052, 0.433429, 0.0732759, 0.233717, - 0.119772, 0.442897, 0.0824683, 0.242823, - 0.129505, 0.452888, 0.0927484, 0.254772, - 0.139906, 0.466407, 0.104417, 0.266603, - 0.150402, 0.477413, 0.117211, 0.28073, - 0.161395, 0.490519, 0.131598, 0.295399, - 0.172465, 0.50201, 0.147407, 0.312705, - 0.183982, 0.515311, 0.165031, 0.331335, - 0.195532, 0.52786, 0.184336, 0.351037, - 0.206971, 0.5392, 0.205361, 0.372175, - 0.218117, 0.54941, 0.228043, 0.394548, - 0.229327, 0.558642, 0.25267, 0.419598, - 0.240052, 0.567861, 0.279071, 0.443922, - 0.249937, 0.573332, 0.306882, 0.471495, - 0.259407, 0.58013, 0.33661, 0.496769, - 0.267749, 0.580564, 0.367328, 0.524951, - 0.275524, 0.581696, 0.399753, 0.55318, - 0.282148, 0.579885, 0.433134, 0.581577, - 0.287533, 0.575471, 0.467534, 0.609231, - 0.291612, 0.567445, 0.502943, 0.637478, - 0.293911, 0.557657, 0.53871, 0.667795, - 0.295096, 0.546535, 0.576568, 0.694272, - 0.294073, 0.529561, 0.614929, 0.722937, - 0.290386, 0.510561, 0.655909, 0.749682, - 0.284481, 0.487846, 0.697663, 0.774754, - 0.276188, 0.462487, 0.738515, 0.799301, - 0.266215, 0.43481, 0.779802, 0.820762, - 0.254116, 0.404879, 0.820045, 0.843231, - 0.240393, 0.374559, 0.860294, 0.861857, - 0.225503, 0.341582, 0.900965, 0.880815, - 0.209382, 0.308778, 0.941727, 0.89766, - 0.19155, 0.275232, 0.980916, 0.912926, - 0.172346, 0.240938, 1.02162, 0.926391, - 0.151799, 0.207223, 1.0597, 0.938429, - 0.129968, 0.17484, 1.09291, 0.947834, - 0.10651, 0.142984, 1.12248, 0.958432, - 0.0824098, 0.109902, 1.149, 0.972402, - 0.0565242, 0.0744454, 1.1733, 0.987191, - 0.028427, 0.0373794, 1.19538, 0.999975, 3.85685e-05, - 4.203e-05, 1.21676, 0.178114, - 7.66075e-06, 0.385418, 3.54027e-06, 0.176074, - 0.000191966, 0.381002, 8.87135e-05, 0.17601, - 0.000767549, 0.380861, 0.000354715, 0.17598, - 0.00172696, 0.380798, 0.000798168, 0.175994, - 0.00307012, 0.380824, 0.00141928, 0.176017, - 0.00479684, 0.380858, 0.00221859, 0.176019, - 0.00690648, 0.380839, 0.00319714, 0.176072, - 0.00939888, 0.380913, 0.0043572, 0.176131, - 0.0122726, 0.380979, 0.005702, 0.176239, - 0.0155264, 0.38112, 0.00723689, 0.176371, - 0.0191551, 0.381272, 0.00896907, 0.176638, - 0.023117, 0.381669, 0.0109194, 0.176912, - 0.0274633, 0.382015, 0.0130903, 0.177279, - 0.032173, 0.382476, 0.0154949, 0.17774, - 0.0372219, 0.383041, 0.0181669, 0.178344, - 0.0426132, 0.38378, 0.0211209, 0.179153, - 0.0483309, 0.384773, 0.0243899, 0.180197, - 0.0543447, 0.386076, 0.0280062, 0.181581, - 0.0607122, 0.387809, 0.032004, 0.18344, - 0.0673855, 0.390205, 0.036453, 0.186139, - 0.0743989, 0.393944, 0.0414162, 0.189432, - 0.0817731, 0.39832, 0.0469394, 0.193795, - 0.0895464, 0.404188, 0.0531442, 0.199641, - 0.0978264, 0.4121, 0.0601374, 0.206679, - 0.106499, 0.421425, 0.0680078, 0.214865, - 0.115654, 0.431504, 0.076919, 0.224406, - 0.125268, 0.442526, 0.0868835, 0.235876, - 0.135475, 0.455465, 0.0981875, 0.248335, - 0.146023, 0.4681, 0.110759, 0.262868, - 0.157016, 0.482069, 0.124885, 0.278962, - 0.168245, 0.496182, 0.140645, 0.295082, - 0.17958, 0.507401, 0.157838, 0.313738, - 0.191227, 0.520252, 0.17695, 0.333573, - 0.202718, 0.531708, 0.197817, 0.356433, - 0.214424, 0.544509, 0.220785, 0.378853, - 0.225492, 0.55373, 0.245306, 0.402717, - 0.236236, 0.561348, 0.271593, 0.428375, - 0.246568, 0.568538, 0.299776, 0.454724, - 0.255941, 0.573462, 0.329433, 0.482291, - 0.264511, 0.576356, 0.360598, 0.509706, - 0.272129, 0.576446, 0.393204, 0.538805, - 0.278979, 0.575298, 0.427227, 0.568919, - 0.284528, 0.572154, 0.462157, 0.596804, - 0.288801, 0.564691, 0.497997, 0.625987, - 0.291334, 0.555134, 0.534467, 0.656414, - 0.292722, 0.545051, 0.571736, 0.683916, - 0.292185, 0.528813, 0.610158, 0.711809, - 0.290043, 0.51106, 0.649061, 0.739547, - 0.285246, 0.490103, 0.690081, 0.766914, - 0.277647, 0.465523, 0.732554, 0.791375, - 0.267603, 0.437718, 0.773982, 0.814772, - 0.256109, 0.40882, 0.81609, 0.836691, - 0.242281, 0.377823, 0.856849, 0.856984, - 0.227155, 0.34496, 0.898363, 0.876332, - 0.210395, 0.311335, 0.939471, 0.894988, - 0.192612, 0.277703, 0.980799, 0.911113, - 0.173236, 0.243019, 1.02215, 0.924092, - 0.152258, 0.209037, 1.06139, 0.936828, - 0.129575, 0.175909, 1.09635, 0.946869, - 0.10594, 0.143852, 1.12707, 0.958284, - 0.081318, 0.110289, 1.15419, 0.972325, - 0.0556133, 0.0747232, 1.17909, 0.986878, - 0.0297899, 0.0383149, 1.20163, 0.999936, - 0.00197169, 0.000912402, 1.22338, 0.151174, - 7.20365e-06, 0.351531, 3.09789e-06, 0.155594, - 0.00018279, 0.361806, 7.8608e-05, 0.156099, - 0.000731569, 0.362982, 0.000314615, 0.156053, - 0.00164578, 0.362869, 0.000707845, 0.156093, - 0.0029261, 0.362961, 0.00125884, 0.156099, - 0.00457155, 0.362959, 0.00196783, 0.15612, - 0.00658224, 0.362982, 0.00283622, 0.156168, - 0.00895774, 0.363048, 0.00386625, 0.156221, - 0.0116962, 0.363101, 0.00506109, 0.156324, - 0.0147973, 0.363241, 0.00642675, 0.156476, - 0.0182503, 0.363448, 0.00797175, 0.156731, - 0.0220266, 0.36384, 0.00971484, 0.156994, - 0.026176, 0.364179, 0.0116575, 0.157341, - 0.0306701, 0.36462, 0.0138207, 0.157867, - 0.0354591, 0.365364, 0.0162356, 0.15846, - 0.0406141, 0.366111, 0.0189092, 0.159308, - 0.0460519, 0.367248, 0.021885, 0.160426, - 0.0518096, 0.368767, 0.0252004, 0.161877, - 0.0578906, 0.370745, 0.0288825, 0.163995, - 0.0642812, 0.373831, 0.0330139, 0.16655, - 0.0710067, 0.377366, 0.0376283, 0.170237, - 0.0781522, 0.382799, 0.0428493, 0.175096, - 0.0857172, 0.389915, 0.0487324, 0.181069, - 0.0938025, 0.398487, 0.0554214, 0.188487, - 0.102363, 0.408799, 0.0630189, 0.197029, - 0.111343, 0.419991, 0.071634, 0.206684, - 0.120812, 0.431455, 0.0812797, 0.218698, - 0.131033, 0.445746, 0.0923651, 0.230726, - 0.141373, 0.457471, 0.104545, 0.245516, - 0.152387, 0.472388, 0.118449, 0.261551, - 0.163628, 0.486671, 0.133923, 0.277437, - 0.174814, 0.49762, 0.150849, 0.296662, - 0.186713, 0.51162, 0.169924, 0.31795, - 0.198513, 0.525435, 0.190848, 0.339422, - 0.210119, 0.536267, 0.213504, 0.362143, - 0.221354, 0.545982, 0.237947, 0.387198, - 0.23224, 0.555364, 0.264427, 0.412349, - 0.24257, 0.561489, 0.292519, 0.439274, - 0.252284, 0.566903, 0.322561, 0.466779, - 0.261023, 0.569614, 0.353952, 0.496011, - 0.26899, 0.571589, 0.387278, 0.524964, - 0.275498, 0.570325, 0.421356, 0.556518, - 0.281449, 0.568792, 0.457314, 0.584363, - 0.285526, 0.560268, 0.493199, 0.614214, - 0.28844, 0.55205, 0.530276, 0.645684, - 0.289777, 0.541906, 0.56855, 0.673446, - 0.289722, 0.526464, 0.606927, 0.701924, - 0.287792, 0.509872, 0.645945, 0.73037, - 0.284315, 0.490649, 0.685564, 0.757405, - 0.278804, 0.467964, 0.726511, 0.784025, - 0.269543, 0.441468, 0.768601, 0.808255, - 0.258117, 0.41216, 0.811321, 0.830739, - 0.244728, 0.380606, 0.853496, 0.851914, - 0.229428, 0.348111, 0.895374, 0.872586, - 0.212508, 0.314732, 0.937674, 0.891581, - 0.194025, 0.280338, 0.979869, 0.907641, - 0.174711, 0.245203, 1.02253, 0.922233, - 0.153509, 0.21077, 1.06371, 0.935878, - 0.130418, 0.177399, 1.09972, 0.946338, - 0.105558, 0.144507, 1.13124, 0.957265, - 0.080059, 0.110508, 1.15973, 0.971668, - 0.0539766, 0.0742311, 1.18515, 0.9866, - 0.0277101, 0.0375224, 1.20858, 1.00021, - 0.000515531, 0.000135226, 1.23135, 0.137468, - 6.86011e-06, 0.345041, 2.73315e-06, 0.13703, - 0.000173378, 0.343936, 6.90761e-05, 0.136986, - 0.000693048, 0.34383, 0.000276126, 0.136964, - 0.00155931, 0.343761, 0.000621337, 0.137003, - 0.00277211, 0.343863, 0.00110494, 0.137012, - 0.00433103, 0.343868, 0.00172744, 0.137043, - 0.00623606, 0.343916, 0.00249022, 0.13709, - 0.0084868, 0.343986, 0.00339559, 0.137145, - 0.0110814, 0.344045, 0.00444687, 0.137242, - 0.0140187, 0.344177, 0.00565007, 0.137431, - 0.0172713, 0.344491, 0.00701868, 0.137644, - 0.0208605, 0.344805, 0.00856042, 0.13791, - 0.024792, 0.345172, 0.0102863, 0.138295, - 0.0290461, 0.345734, 0.0122185, 0.138764, - 0.0335957, 0.346371, 0.0143771, 0.139415, - 0.038467, 0.347298, 0.0167894, 0.140272, - 0.0436176, 0.348527, 0.0194895, 0.141457, - 0.0491016, 0.350276, 0.0225043, 0.14303, - 0.0548764, 0.352646, 0.0258962, 0.145289, - 0.0610096, 0.356206, 0.0297168, 0.148502, - 0.0674777, 0.361488, 0.0340562, 0.152188, - 0.074345, 0.367103, 0.0389534, 0.157359, - 0.0817442, 0.375247, 0.0445541, 0.16379, - 0.0896334, 0.385064, 0.0509535, 0.171376, - 0.098005, 0.396082, 0.0582611, 0.179901, - 0.106817, 0.407418, 0.06654, 0.189892, - 0.116239, 0.420031, 0.075994, 0.201838, - 0.12627, 0.434321, 0.0867239, 0.214311, - 0.136701, 0.447631, 0.0987517, 0.228902, - 0.147616, 0.462046, 0.112353, 0.245107, - 0.158871, 0.476942, 0.127605, 0.262292, - 0.170261, 0.490285, 0.144469, 0.281215, - 0.182017, 0.503783, 0.163282, 0.301058, - 0.193729, 0.515505, 0.183873, 0.322752, - 0.205512, 0.52682, 0.206466, 0.347547, - 0.217214, 0.539473, 0.231194, 0.370969, - 0.227966, 0.546625, 0.257288, 0.397533, - 0.238555, 0.55472, 0.285789, 0.42398, - 0.248278, 0.559468, 0.315746, 0.452928, - 0.257422, 0.564095, 0.347724, 0.482121, - 0.265306, 0.565426, 0.380922, 0.510438, - 0.272043, 0.563205, 0.415639, 0.541188, - 0.277614, 0.561087, 0.451702, 0.571667, - 0.281927, 0.554922, 0.48845, 0.602432, - 0.285015, 0.546838, 0.526442, 0.634126, - 0.286512, 0.537415, 0.564896, 0.662816, - 0.286388, 0.522906, 0.604037, 0.692411, - 0.284734, 0.507003, 0.643795, 0.720946, - 0.281297, 0.488398, 0.68298, 0.748293, - 0.276262, 0.466353, 0.723466, 0.776931, - 0.269978, 0.443573, 0.764565, 0.801065, - 0.260305, 0.415279, 0.805838, 0.825843, - 0.247426, 0.384773, 0.849985, 0.84807, - 0.232437, 0.352555, 0.893174, 0.869122, - 0.215806, 0.318642, 0.936564, 0.888963, - 0.197307, 0.28381, 0.980253, 0.905547, - 0.177203, 0.247888, 1.02463, 0.918554, - 0.155542, 0.212904, 1.06714, 0.931395, - 0.131948, 0.1787, 1.10451, 0.941749, - 0.106723, 0.145902, 1.13694, 0.954551, - 0.0804939, 0.111193, 1.1666, 0.970279, - 0.0534239, 0.0744697, 1.19249, 0.986117, - 0.0257452, 0.0368788, 1.21665, 0.999938, 0.00190634, - 0.0010291, 1.23981, 0.118493, - 6.47439e-06, 0.32272, 2.3772e-06, 0.118765, - 0.000163023, 0.323456, 5.98573e-05, 0.118772, - 0.00065212, 0.323477, 0.000239447, 0.118843, - 0.00146741, 0.323657, 0.000538881, 0.118804, - 0.00260846, 0.323553, 0.00095826, 0.118826, - 0.00407576, 0.323595, 0.00149845, 0.118846, - 0.00586826, 0.323617, 0.00216047, 0.118886, - 0.00798578, 0.32367, 0.00294679, 0.118947, - 0.0104273, 0.323753, 0.00386124, 0.119055, - 0.0131909, 0.323922, 0.00490999, 0.119241, - 0.0162444, 0.324251, 0.00610804, 0.11944, - 0.0196339, 0.324544, 0.00745805, 0.119739, - 0.0233378, 0.325026, 0.00897805, 0.12011, - 0.0273179, 0.325586, 0.0106895, 0.120571, - 0.0316143, 0.326231, 0.0126073, 0.12124, - 0.0361939, 0.327264, 0.0147654, 0.122162, - 0.0410511, 0.328733, 0.0172001, 0.123378, - 0.0462233, 0.330659, 0.0199375, 0.125183, - 0.0517109, 0.333754, 0.0230498, 0.127832, - 0.0575652, 0.338507, 0.026597, 0.130909, - 0.0637441, 0.343666, 0.0306345, 0.135221, - 0.0704302, 0.351063, 0.035273, 0.14082, - 0.0776364, 0.360604, 0.0406137, 0.146781, - 0.0852293, 0.369638, 0.0466788, 0.155121, - 0.0935351, 0.3827, 0.0537628, 0.16398, - 0.102234, 0.39522, 0.0617985, 0.173926, - 0.111465, 0.40793, 0.07097, 0.185137, - 0.121296, 0.42105, 0.0813426, 0.19826, - 0.13169, 0.435735, 0.0931596, 0.212938, - 0.142614, 0.450932, 0.106547, 0.229046, - 0.153884, 0.465726, 0.121575, 0.246246, - 0.165382, 0.479461, 0.138286, 0.264637, - 0.176806, 0.492106, 0.15666, 0.284959, - 0.188793, 0.504774, 0.17728, 0.308157, - 0.200763, 0.518805, 0.19988, 0.330951, - 0.21239, 0.528231, 0.224293, 0.3549, - 0.223521, 0.536376, 0.250541, 0.381502, - 0.234169, 0.544846, 0.278902, 0.409529, - 0.244077, 0.551717, 0.309227, 0.437523, - 0.253363, 0.55517, 0.341426, 0.467624, - 0.261659, 0.557772, 0.37518, 0.497268, - 0.268498, 0.556442, 0.41007, 0.528294, - 0.274018, 0.553915, 0.446445, 0.559053, - 0.278169, 0.549153, 0.483779, 0.589329, - 0.281229, 0.539878, 0.522249, 0.622503, - 0.282902, 0.53162, 0.561754, 0.652382, - 0.282815, 0.518119, 0.601544, 0.681847, - 0.281247, 0.502187, 0.641574, 0.712285, - 0.277986, 0.484824, 0.682633, 0.740094, - 0.273017, 0.463483, 0.723426, 0.768478, - 0.266692, 0.441299, 0.763747, 0.794556, - 0.258358, 0.415238, 0.805565, 0.819408, - 0.248807, 0.386912, 0.847254, 0.843411, - 0.236214, 0.356165, 0.891091, 0.862397, - 0.219794, 0.320562, 0.936174, 0.883113, - 0.201768, 0.285322, 0.982562, 0.90023, - 0.181672, 0.249713, 1.02862, 0.915192, - 0.159279, 0.214546, 1.07163, 0.928458, - 0.134725, 0.180285, 1.10995, 0.94069, - 0.10913, 0.147119, 1.14354, 0.953409, - 0.0821315, 0.112492, 1.17372, 0.969537, - 0.0542677, 0.0752014, 1.20043, 0.985612, - 0.0259096, 0.0370361, 1.22528, 0.999835, 0.00298198, - 0.00151801, 1.24959, 0.10097, - 6.02574e-06, 0.300277, 2.02619e-06, 0.101577, - 0.000152164, 0.302077, 5.11662e-05, 0.101572, - 0.000608889, 0.302066, 0.000204751, 0.101566, - 0.00136997, 0.302047, 0.000460753, 0.101592, - 0.00243557, 0.302114, 0.000819497, 0.101608, - 0.0038053, 0.30214, 0.00128154, 0.101627, - 0.00547906, 0.30216, 0.0018483, 0.101669, - 0.00745647, 0.302224, 0.00252223, 0.101732, - 0.00973615, 0.302318, 0.00330716, 0.101844, - 0.0123097, 0.302513, 0.00421061, 0.102025, - 0.0151681, 0.30285, 0.00524481, 0.102224, - 0.0183334, 0.303166, 0.0064154, 0.102515, - 0.0217819, 0.303654, 0.00774063, 0.102886, - 0.0255067, 0.304243, 0.0092398, 0.103395, - 0.029514, 0.305089, 0.0109339, 0.104109, - 0.0337912, 0.306301, 0.0128561, 0.105074, - 0.0383565, 0.30798, 0.0150338, 0.10654, - 0.0432132, 0.310726, 0.0175228, 0.108478, - 0.0484244, 0.314351, 0.0203648, 0.111015, - 0.0539339, 0.319032, 0.0236325, 0.114682, - 0.0598885, 0.32605, 0.0274188, 0.11911, - 0.0663375, 0.334109, 0.0317905, 0.124736, - 0.0733011, 0.344013, 0.0368502, 0.131479, - 0.0807744, 0.355358, 0.0427104, 0.139283, - 0.0888204, 0.367614, 0.0494788, 0.148054, - 0.0973394, 0.380072, 0.0572367, 0.159037, - 0.10665, 0.395678, 0.0662704, 0.169794, - 0.116221, 0.40795, 0.0763192, 0.18314, - 0.126632, 0.423546, 0.087956, 0.197515, - 0.137383, 0.438213, 0.101042, 0.213514, - 0.148641, 0.453248, 0.115827, 0.23065, - 0.160117, 0.46688, 0.132283, 0.249148, - 0.171807, 0.479962, 0.150644, 0.270219, - 0.183695, 0.494618, 0.171073, 0.292338, - 0.195574, 0.506937, 0.193378, 0.314999, - 0.207205, 0.516463, 0.217585, 0.340991, - 0.218955, 0.528123, 0.24428, 0.367982, - 0.229917, 0.537025, 0.272784, 0.39432, - 0.239737, 0.541627, 0.302742, 0.423364, - 0.249048, 0.546466, 0.335112, 0.453751, - 0.257329, 0.549466, 0.369032, 0.48416, - 0.264623, 0.549503, 0.404577, 0.515262, - 0.270411, 0.547008, 0.441337, 0.547036, - 0.274581, 0.542249, 0.479162, 0.576614, - 0.277266, 0.533015, 0.517904, 0.611143, - 0.279144, 0.525512, 0.558508, 0.640989, - 0.279001, 0.51154, 0.598995, 0.671182, - 0.277324, 0.495641, 0.639935, 0.700848, - 0.273908, 0.477526, 0.681017, 0.729862, - 0.269063, 0.457955, 0.722764, 0.758273, - 0.262282, 0.434846, 0.764349, 0.784121, - 0.254281, 0.409203, 0.806206, 0.809798, - 0.24505, 0.382694, 0.848617, 0.834953, - 0.233861, 0.354034, 0.892445, 0.856817, - 0.221308, 0.321764, 0.936263, 0.877609, - 0.205996, 0.288118, 0.982401, 0.897489, - 0.186702, 0.253277, 1.02975, 0.913792, - 0.164618, 0.217963, 1.07488, 0.92785, - 0.140023, 0.183221, 1.11487, 0.940378, - 0.11328, 0.149385, 1.14947, 0.95273, - 0.0853958, 0.114152, 1.1807, 0.969059, - 0.0568698, 0.0769845, 1.20912, 0.985574, - 0.0276502, 0.0381186, 1.23498, 0.999943, 0.00239052, - 0.00126861, 1.25987, 0.0852715, - 5.60067e-06, 0.279021, 1.71162e-06, 0.0854143, - 0.000140871, 0.279483, 4.30516e-05, 0.0854191, - 0.000563385, 0.2795, 0.000172184, 0.0854188, - 0.00126753, 0.279493, 0.000387464, 0.0854229, - 0.00225337, 0.279501, 0.00068918, 0.0854443, - 0.00352086, 0.279549, 0.00107803, 0.0854697, - 0.00506962, 0.279591, 0.00155536, 0.0855093, - 0.00689873, 0.279652, 0.00212354, 0.0855724, - 0.00900821, 0.279752, 0.00278703, 0.0856991, - 0.0113799, 0.280011, 0.0035551, 0.085855, - 0.0140314, 0.280297, 0.00443449, 0.0860682, - 0.016963, 0.280682, 0.00543636, 0.086344, - 0.0201438, 0.281159, 0.0065788, 0.0867426, - 0.0235999, 0.281886, 0.00787977, 0.087239, - 0.0273069, 0.282745, 0.0093606, 0.0879815, - 0.031269, 0.284139, 0.011056, 0.0891258, - 0.035531, 0.28647, 0.0130065, 0.0906909, - 0.0400947, 0.289708, 0.0152495, 0.0927624, - 0.0449638, 0.293904, 0.0178454, 0.0958376, - 0.0502427, 0.300471, 0.0208915, 0.0995827, - 0.0559514, 0.30806, 0.0244247, 0.104526, - 0.0622152, 0.317874, 0.0285721, 0.110532, - 0.0690046, 0.329332, 0.0334227, 0.117385, - 0.0763068, 0.341217, 0.0390466, 0.12522, - 0.084184, 0.353968, 0.0455786, 0.134037, - 0.0925248, 0.366797, 0.0530773, 0.144014, - 0.101487, 0.380209, 0.0617424, 0.156013, - 0.111273, 0.395956, 0.071777, 0.168872, - 0.121431, 0.41053, 0.0830905, 0.183089, - 0.132105, 0.425073, 0.0959341, 0.198763, - 0.143286, 0.439833, 0.110448, 0.216159, - 0.154841, 0.454507, 0.126769, 0.234859, - 0.166588, 0.468368, 0.14495, 0.255879, - 0.178626, 0.482846, 0.165233, 0.27677, - 0.190218, 0.493489, 0.187217, 0.301184, - 0.202227, 0.506549, 0.211659, 0.325852, - 0.213764, 0.5158, 0.237922, 0.352824, - 0.22487, 0.525442, 0.26632, 0.380882, - 0.235246, 0.532487, 0.296691, 0.410137, - 0.244847, 0.537703, 0.329179, 0.439787, - 0.253122, 0.540361, 0.363135, 0.472291, - 0.260517, 0.542734, 0.399222, 0.501856, - 0.266519, 0.538826, 0.436352, 0.534816, - 0.270905, 0.535152, 0.474505, 0.565069, - 0.273826, 0.525979, 0.513988, 0.597154, - 0.275333, 0.516394, 0.554852, 0.630473, - 0.275314, 0.506206, 0.596592, 0.660574, - 0.273323, 0.489769, 0.638117, 0.692015, - 0.270008, 0.472578, 0.680457, 0.720647, - 0.265001, 0.452134, 0.723008, 0.750528, - 0.258311, 0.430344, 0.765954, 0.777568, - 0.250046, 0.405624, 0.809012, 0.80387, - 0.240114, 0.378339, 0.852425, 0.828439, - 0.228737, 0.349877, 0.895346, 0.851472, - 0.216632, 0.318968, 0.940695, 0.873906, - 0.202782, 0.287489, 0.987235, 0.89467, - 0.187059, 0.254394, 1.03348, 0.912281, - 0.168818, 0.221294, 1.07812, 0.927358, - 0.146494, 0.18675, 1.11928, 0.940385, - 0.120009, 0.152322, 1.15609, 0.952672, - 0.0917183, 0.117514, 1.18875, 0.968496, - 0.0620321, 0.0797405, 1.21821, 0.985236, - 0.0314945, 0.0402383, 1.24523, 0.99998, - 0.000575153, 0.000110644, 1.27133, 0.0702429, - 5.12222e-06, 0.255273, 1.40947e-06, 0.0702981, - 0.000128826, 0.255469, 3.54488e-05, 0.0703691, - 0.000515562, 0.255727, 0.000141874, 0.0703805, - 0.00116, 0.255754, 0.00031929, 0.0703961, - 0.00206224, 0.255813, 0.000567999, 0.0704102, - 0.00322223, 0.255839, 0.00088871, 0.0704298, - 0.00463928, 0.255863, 0.00128272, 0.0704759, - 0.00631375, 0.255953, 0.00175283, 0.0705434, - 0.00824317, 0.256079, 0.00230342, 0.0706693, - 0.010412, 0.25636, 0.0029443, 0.0708189, - 0.0128439, 0.256647, 0.00368031, 0.0710364, - 0.0155177, 0.257084, 0.00452614, 0.0713223, - 0.0184374, 0.257637, 0.00549706, 0.0717182, - 0.0216002, 0.258416, 0.00661246, 0.072321, - 0.0249966, 0.259699, 0.00790147, 0.0731446, - 0.0286566, 0.261475, 0.0093884, 0.0743352, - 0.0325888, 0.264132, 0.0111186, 0.0760676, - 0.036843, 0.26815, 0.013145, 0.078454, - 0.0414292, 0.273636, 0.0155251, 0.0818618, - 0.0464634, 0.281653, 0.0183525, 0.0857382, - 0.0519478, 0.289992, 0.0216642, 0.0908131, - 0.0579836, 0.30066, 0.0255956, 0.0967512, - 0.0645124, 0.312204, 0.0301954, 0.103717, - 0.0716505, 0.325001, 0.0356017, 0.111596, - 0.0793232, 0.338129, 0.041896, 0.120933, - 0.087645, 0.352853, 0.0492447, 0.130787, - 0.096492, 0.366192, 0.0576749, 0.142311, - 0.105973, 0.380864, 0.0673969, 0.155344, - 0.116182, 0.396575, 0.0785899, 0.169535, - 0.126815, 0.411443, 0.0912377, 0.185173, - 0.138015, 0.426256, 0.105607, 0.201755, - 0.149325, 0.439607, 0.121551, 0.221334, - 0.161207, 0.455467, 0.139608, 0.241461, - 0.173162, 0.469096, 0.159591, 0.26294, - 0.18504, 0.481014, 0.18156, 0.286776, - 0.196881, 0.493291, 0.205781, 0.311596, - 0.208311, 0.503556, 0.231819, 0.338667, - 0.219671, 0.513268, 0.260274, 0.366021, - 0.230451, 0.519414, 0.290862, 0.395875, - 0.240131, 0.526766, 0.323196, 0.425564, - 0.248566, 0.52905, 0.357071, 0.457094, - 0.256195, 0.530796, 0.393262, 0.488286, - 0.262331, 0.528703, 0.430797, 0.522291, - 0.267141, 0.52727, 0.470231, 0.554172, - 0.270411, 0.519848, 0.510477, 0.586427, - 0.271986, 0.510307, 0.551594, 0.619638, - 0.27192, 0.499158, 0.593849, 0.650656, - 0.269817, 0.483852, 0.636314, 0.68284, - 0.266267, 0.467515, 0.679679, 0.714356, - 0.26113, 0.44931, 0.723884, 0.742717, - 0.254067, 0.425789, 0.767245, 0.770894, - 0.245652, 0.401144, 0.811819, 0.797358, - 0.235554, 0.374224, 0.856315, 0.823377, - 0.223896, 0.346167, 0.901077, 0.847456, - 0.210865, 0.316056, 0.946502, 0.870697, - 0.196574, 0.284503, 0.993711, 0.891068, - 0.180814, 0.251628, 1.04134, 0.909267, - 0.163314, 0.219065, 1.08609, 0.925653, - 0.143304, 0.186446, 1.12702, 0.940017, - 0.121322, 0.153416, 1.16371, 0.952398, - 0.0973872, 0.120334, 1.19712, 0.967568, - 0.0698785, 0.08352, 1.22791, 0.984772, - 0.0390031, 0.0439209, 1.25672, 1.00026, - 0.0070087, 0.00315668, 1.28428, 0.0556653, - 4.59654e-06, 0.227325, 1.12556e-06, 0.0565238, - 0.000116382, 0.230826, 2.84985e-05, 0.0565717, - 0.000465666, 0.231026, 0.000114036, 0.0565859, - 0.00104773, 0.231079, 0.000256656, 0.0565761, - 0.00186255, 0.231025, 0.00045663, 0.0565913, - 0.00291002, 0.231058, 0.000714664, 0.0566108, - 0.00418998, 0.231085, 0.00103224, 0.0566532, - 0.00570206, 0.231169, 0.00141202, 0.0567473, - 0.00743666, 0.231417, 0.00186018, 0.0568567, - 0.00940298, 0.231661, 0.00238264, 0.0569859, - 0.0115991, 0.231895, 0.00298699, 0.0572221, - 0.0140096, 0.232456, 0.00368957, 0.057519, - 0.0166508, 0.233096, 0.00450303, 0.0579534, - 0.01951, 0.234094, 0.00544945, 0.0585922, - 0.0225991, 0.235629, 0.00655564, 0.0595647, - 0.0259416, 0.238106, 0.00785724, 0.0609109, - 0.0295661, 0.241557, 0.00939127, 0.0628751, - 0.0335126, 0.246652, 0.0112198, 0.0656908, - 0.0378604, 0.254091, 0.0134168, 0.0691347, - 0.0426543, 0.262666, 0.0160374, 0.0732165, - 0.0478967, 0.272029, 0.0191514, 0.0782863, - 0.0536716, 0.283007, 0.0228597, 0.0843973, - 0.0600683, 0.295732, 0.0272829, 0.0913598, - 0.0670095, 0.308779, 0.032484, 0.0994407, - 0.0745516, 0.322886, 0.0385886, 0.108189, - 0.082712, 0.336408, 0.0457133, 0.118574, - 0.0914927, 0.351692, 0.0539832, 0.129989, - 0.100854, 0.366502, 0.0635162, 0.142722, - 0.110837, 0.381675, 0.0744386, 0.156654, - 0.121353, 0.3963, 0.0868483, 0.172151, - 0.132414, 0.411477, 0.100963, 0.188712, - 0.143809, 0.42508, 0.116795, 0.208093, - 0.155765, 0.441328, 0.134715, 0.227936, - 0.167608, 0.454328, 0.154396, 0.249495, - 0.179579, 0.467235, 0.176179, 0.27362, - 0.191488, 0.480248, 0.200193, 0.296371, - 0.202618, 0.487886, 0.225775, 0.324234, - 0.214133, 0.499632, 0.25441, 0.353049, - 0.225212, 0.509532, 0.285077, 0.381785, - 0.234875, 0.514265, 0.317047, 0.414038, - 0.244205, 0.521282, 0.351874, 0.445251, - 0.252145, 0.522931, 0.388279, 0.476819, - 0.258433, 0.520947, 0.425825, 0.509209, - 0.263411, 0.517669, 0.465104, 0.542759, - 0.266732, 0.512841, 0.505741, 0.574822, - 0.268263, 0.503317, 0.547611, 0.609324, - 0.268489, 0.493035, 0.590953, 0.641772, - 0.266941, 0.478816, 0.63488, 0.674049, - 0.263297, 0.462863, 0.679072, 0.705071, - 0.257618, 0.442931, 0.723487, 0.734709, - 0.250625, 0.421299, 0.768708, 0.763704, - 0.24179, 0.397085, 0.814375, 0.791818, - 0.231115, 0.370577, 0.859907, 0.817439, - 0.21922, 0.34232, 0.906715, 0.843202, - 0.205658, 0.312627, 0.953943, 0.866639, - 0.190563, 0.280933, 1.00185, 0.888129, - 0.173978, 0.248393, 1.05105, 0.907239, - 0.155485, 0.216007, 1.09704, 0.923893, - 0.134782, 0.183233, 1.13857, 0.938882, - 0.11249, 0.150376, 1.17539, 0.952464, - 0.0890706, 0.117177, 1.20924, 0.968529, - 0.0646523, 0.0813095, 1.24055, 0.984763, - 0.038606, 0.0439378, 1.27018, 1.00053, - 0.01238, 0.00598668, 1.29873, 0.0437928, - 4.09594e-06, 0.204012, 8.79224e-07, 0.0440166, - 0.000103395, 0.205049, 2.21946e-05, 0.0440529, - 0.000413633, 0.205225, 8.87981e-05, 0.0440493, - 0.000930594, 0.2052, 0.000199858, 0.0439884, - 0.00165352, 0.204901, 0.000355495, 0.0440716, - 0.0025849, 0.205255, 0.000556983, 0.0440968, - 0.00372222, 0.205311, 0.000805326, 0.0441359, - 0.00506478, 0.205391, 0.00110333, 0.0442231, - 0.00660384, 0.205638, 0.00145768, 0.0443254, - 0.00835246, 0.205877, 0.00187275, 0.0444832, - 0.0102992, 0.20627, 0.00235938, 0.0447001, - 0.0124449, 0.206796, 0.0029299, 0.0450168, - 0.0147935, 0.207593, 0.0036005, 0.0454816, - 0.017336, 0.208819, 0.00439246, 0.0462446, - 0.0201156, 0.211036, 0.00533864, 0.0473694, - 0.0231568, 0.214388, 0.00646984, 0.0490191, - 0.0264941, 0.219357, 0.00783856, 0.0512776, - 0.030184, 0.226061, 0.00950182, 0.0541279, - 0.0342661, 0.234094, 0.0115156, 0.0578989, - 0.0388539, 0.244297, 0.0139687, 0.0620835, - 0.0438735, 0.254457, 0.0169015, 0.0673497, - 0.04951, 0.266706, 0.0204554, 0.0731759, - 0.0556263, 0.278753, 0.0246606, 0.0803937, - 0.0624585, 0.29309, 0.0297126, 0.0879287, - 0.0697556, 0.305856, 0.0355868, 0.0970669, - 0.0778795, 0.321059, 0.0425768, 0.106508, - 0.0863541, 0.333873, 0.05056, 0.11776, - 0.0955935, 0.349008, 0.0598972, 0.130081, - 0.105438, 0.363776, 0.0706314, 0.144454, - 0.115899, 0.380112, 0.0828822, 0.1596, - 0.126827, 0.394843, 0.0967611, 0.176097, - 0.138161, 0.409033, 0.112381, 0.194726, - 0.149904, 0.424257, 0.129952, 0.213944, - 0.161675, 0.436945, 0.149333, 0.235516, - 0.173659, 0.450176, 0.170892, 0.260564, - 0.185963, 0.466305, 0.194984, 0.285183, - 0.197582, 0.477328, 0.220805, 0.311095, - 0.208697, 0.486566, 0.248694, 0.338924, - 0.219519, 0.494811, 0.279015, 0.369757, - 0.229766, 0.504065, 0.311725, 0.3996, - 0.238879, 0.507909, 0.345844, 0.430484, - 0.246802, 0.509805, 0.381749, 0.46413, - 0.253924, 0.511436, 0.420251, 0.497077, - 0.259319, 0.508787, 0.459957, 0.530434, - 0.263297, 0.50394, 0.501356, 0.565725, - 0.265619, 0.49804, 0.544252, 0.599254, - 0.265842, 0.487346, 0.587856, 0.631251, - 0.263978, 0.472975, 0.631969, 0.663972, - 0.26043, 0.457135, 0.677471, 0.697724, - 0.255358, 0.439844, 0.723744, 0.727725, - 0.248308, 0.417872, 0.770653, 0.756417, - 0.239181, 0.39273, 0.817357, 0.785419, - 0.22814, 0.367839, 0.864221, 0.81266, - 0.215681, 0.339449, 0.912701, 0.839391, - 0.201623, 0.309279, 0.962419, 0.86366, - 0.185624, 0.278029, 1.0122, 0.885028, - 0.16797, 0.245294, 1.06186, 0.904639, - 0.148336, 0.212689, 1.10934, 0.922048, - 0.12637, 0.179616, 1.15063, 0.936952, - 0.102928, 0.146749, 1.18885, 0.951895, - 0.0785268, 0.112733, 1.22352, 0.967198, - 0.0530153, 0.0760056, 1.25681, 0.984405, - 0.02649, 0.0383183, 1.28762, 1.00021, 0.00070019, - 0.00020039, 1.31656, 0.0325964, - 3.55447e-06, 0.176706, 6.55682e-07, 0.0329333, - 8.99174e-05, 0.178527, 1.65869e-05, 0.0329181, - 0.000359637, 0.178453, 6.63498e-05, 0.0329085, - 0.000808991, 0.178383, 0.000149332, 0.0329181, - 0.00143826, 0.178394, 0.000265873, 0.0329425, - 0.00224678, 0.178517, 0.000416597, 0.0329511, - 0.00323575, 0.17849, 0.000603299, 0.033011, - 0.00439875, 0.178695, 0.000829422, 0.0330733, - 0.00574059, 0.178843, 0.00109908, 0.0331857, - 0.00725896, 0.179176, 0.00141933, 0.0333445, - 0.00895289, 0.179618, 0.0017999, 0.0335674, - 0.0108219, 0.180238, 0.00225316, 0.033939, - 0.0128687, 0.181417, 0.00279765, 0.0345239, - 0.015114, 0.183395, 0.0034564, 0.0354458, - 0.017596, 0.186616, 0.00425864, 0.0368313, - 0.0203524, 0.191547, 0.00524936, 0.0386115, - 0.0234105, 0.197508, 0.00647033, 0.0410303, - 0.0268509, 0.205395, 0.00798121, 0.0442245, - 0.0307481, 0.215365, 0.0098557, 0.0478659, - 0.0350863, 0.225595, 0.0121417, 0.0522416, - 0.0399506, 0.236946, 0.0149385, 0.0574513, - 0.045357, 0.249442, 0.0183189, 0.0631208, - 0.0512863, 0.261222, 0.0223644, 0.0701124, - 0.0579273, 0.275418, 0.0272418, 0.0777331, - 0.0650652, 0.288989, 0.0329458, 0.0862709, - 0.0728813, 0.302546, 0.0396819, 0.096103, - 0.081363, 0.317164, 0.04757, 0.106976, - 0.0904463, 0.331733, 0.0567012, 0.119175, - 0.100105, 0.34661, 0.067202, 0.132919, - 0.110375, 0.362249, 0.0792588, 0.147727, - 0.121115, 0.376978, 0.0928672, 0.163618, - 0.132299, 0.390681, 0.108228, 0.182234, - 0.143887, 0.406571, 0.125502, 0.201809, - 0.155827, 0.42042, 0.144836, 0.225041, - 0.168357, 0.438411, 0.166706, 0.247621, - 0.18004, 0.450368, 0.189909, 0.27097, - 0.191536, 0.460083, 0.215251, 0.296658, - 0.203024, 0.469765, 0.243164, 0.325892, - 0.214056, 0.481837, 0.273388, 0.35406, - 0.224104, 0.487474, 0.305344, 0.384372, - 0.233489, 0.492773, 0.339741, 0.41749, - 0.241874, 0.498451, 0.376287, 0.45013, - 0.248834, 0.499632, 0.414195, 0.481285, - 0.254658, 0.495233, 0.454077, 0.519183, - 0.259367, 0.496401, 0.496352, 0.551544, - 0.261818, 0.487686, 0.538798, 0.587349, - 0.262964, 0.479453, 0.583626, 0.621679, - 0.262128, 0.467709, 0.629451, 0.654991, - 0.258998, 0.452123, 0.67566, 0.686873, - 0.254119, 0.433495, 0.723248, 0.719801, - 0.246946, 0.413657, 0.771156, 0.750355, - 0.237709, 0.390366, 0.81989, 0.780033, - 0.226549, 0.364947, 0.868601, 0.809254, - 0.214186, 0.337256, 0.920034, 0.836576, - 0.199639, 0.307395, 0.971706, 0.861774, - 0.183169, 0.275431, 1.02479, 0.885707, - 0.165111, 0.243431, 1.07837, 0.904742, - 0.144363, 0.210921, 1.12783, 0.915604, - 0.121305, 0.17647, 1.17254, 0.930959, - 0.0962119, 0.143106, 1.21012, 0.948404, - 0.069969, 0.108112, 1.24474, 0.967012, - 0.0427586, 0.0708478, 1.27718, 0.984183, - 0.0147043, 0.032335, 1.3083, 0.999577, 0.0142165, - 0.00726867, 1.3382, 0.0229227, - 2.99799e-06, 0.148623, 4.62391e-07, 0.0232194, - 7.58796e-05, 0.15054, 1.17033e-05, 0.0232315, - 0.000303636, 0.15063, 4.68397e-05, 0.0232354, - 0.000683189, 0.150624, 0.000105472, 0.0232092, - 0.0012136, 0.150445, 0.000187744, 0.0232523, - 0.00189765, 0.150679, 0.000294847, 0.0232828, - 0.00273247, 0.150789, 0.000428013, 0.0233371, - 0.00371287, 0.150995, 0.000591134, 0.0234015, - 0.00484794, 0.15118, 0.000787642, 0.023514, - 0.00612877, 0.151562, 0.00102547, 0.023679, - 0.00756125, 0.152116, 0.00131351, 0.0239559, - 0.00914651, 0.153162, 0.00166594, 0.0244334, - 0.010904, 0.155133, 0.00210182, 0.025139, - 0.0128615, 0.158035, 0.00264406, 0.0262598, - 0.0150628, 0.162751, 0.00332923, 0.0277875, - 0.0175532, 0.168944, 0.00419773, 0.0298472, - 0.0203981, 0.176835, 0.00530034, 0.0325444, - 0.023655, 0.186686, 0.00669777, 0.0355581, - 0.0272982, 0.196248, 0.00842661, 0.0392841, - 0.0314457, 0.207352, 0.0105854, 0.0436815, - 0.0361157, 0.219279, 0.0132458, 0.0485272, - 0.0412932, 0.230728, 0.0164736, 0.0541574, - 0.0470337, 0.242994, 0.0203715, 0.0609479, - 0.0535002, 0.257042, 0.0250953, 0.0685228, - 0.0605409, 0.27102, 0.0306856, 0.0768042, - 0.0680553, 0.28406, 0.037193, 0.0864844, - 0.0765011, 0.299186, 0.0449795, 0.0969415, - 0.0852674, 0.3132, 0.0538316, 0.108478, - 0.0947333, 0.327138, 0.0641149, 0.121705, - 0.10481, 0.342345, 0.0759185, 0.136743, - 0.115474, 0.358472, 0.0894116, 0.152986, - 0.126536, 0.374067, 0.104562, 0.170397, - 0.138061, 0.388267, 0.121632, 0.191392, - 0.150203, 0.406467, 0.140996, 0.211566, - 0.161751, 0.418641, 0.161696, 0.233567, - 0.173407, 0.430418, 0.184557, 0.257769, - 0.185397, 0.44277, 0.210092, 0.28531, - 0.197048, 0.457191, 0.237827, 0.311726, - 0.20784, 0.464712, 0.267253, 0.340537, - 0.218345, 0.472539, 0.299332, 0.372921, - 0.228306, 0.482331, 0.333988, 0.402924, - 0.236665, 0.484378, 0.369722, 0.434475, - 0.244097, 0.484717, 0.407836, 0.469736, - 0.250547, 0.487093, 0.448465, 0.505045, - 0.25511, 0.485575, 0.490263, 0.540262, - 0.258444, 0.481225, 0.534495, 0.576347, - 0.259903, 0.473481, 0.579451, 0.608656, - 0.259572, 0.4603, 0.625604, 0.646679, - 0.257908, 0.450341, 0.674511, 0.679902, - 0.253663, 0.431561, 0.723269, 0.714159, - 0.247419, 0.412684, 0.773263, 0.745345, - 0.239122, 0.389388, 0.824182, 0.778248, - 0.228837, 0.365361, 0.876634, 0.807208, - 0.216197, 0.337667, 0.92945, 0.835019, - 0.201772, 0.307197, 0.985261, 0.860261, - 0.185291, 0.274205, 1.04299, 0.877601, - 0.165809, 0.240178, 1.09816, 0.898211, - 0.143897, 0.207571, 1.14694, 0.915789, - 0.119513, 0.174904, 1.19008, 0.931831, - 0.0932919, 0.141423, 1.2297, 0.949244, - 0.0656528, 0.105603, 1.26553, 0.967527, - 0.0370262, 0.0679551, 1.29986, 0.984139, - 0.00730117, 0.0283133, 1.33252, 0.999713, 0.0234648, - 0.0121785, 1.36397, 0.0152135, - 2.45447e-06, 0.122795, 3.04092e-07, 0.0151652, - 6.15778e-05, 0.122399, 7.6292e-06, 0.0151181, - 0.000245948, 0.122023, 3.04802e-05, 0.0151203, - 0.000553394, 0.12203, 6.86634e-05, 0.015125, - 0.000983841, 0.122037, 0.000122463, 0.0151427, - 0.00153774, 0.12214, 0.000192706, 0.0151708, - 0.0022103, 0.122237, 0.000281219, 0.0152115, - 0.00300741, 0.12238, 0.000390804, 0.0152877, - 0.00392494, 0.1227, 0.000526317, 0.015412, - 0.00496597, 0.123244, 0.00069443, 0.0156201, - 0.00613314, 0.124228, 0.00090547, 0.0159658, - 0.00744113, 0.125945, 0.0011732, 0.0165674, - 0.00892546, 0.129098, 0.00151888, 0.017487, - 0.010627, 0.133865, 0.00197007, 0.018839, - 0.0126043, 0.140682, 0.0025637, 0.020554, - 0.0148814, 0.148534, 0.00333637, 0.0226727, - 0.0175123, 0.157381, 0.00433738, 0.0251879, - 0.0205266, 0.166685, 0.00561664, 0.0283635, - 0.0240319, 0.177796, 0.00725563, 0.0318694, - 0.0279432, 0.188251, 0.00928811, 0.0361044, - 0.0324313, 0.200038, 0.011835, 0.0406656, - 0.0373527, 0.210685, 0.0149146, 0.0463846, - 0.0430132, 0.224182, 0.0187254, 0.0525696, - 0.0491013, 0.23634, 0.0232283, 0.0598083, - 0.0559175, 0.250013, 0.0286521, 0.0679437, - 0.0633657, 0.263981, 0.0350634, 0.0771181, - 0.0714602, 0.278072, 0.0425882, 0.0881273, - 0.0803502, 0.29511, 0.0514487, 0.0996628, - 0.0896903, 0.309976, 0.0615766, 0.112702, - 0.099644, 0.325611, 0.0732139, 0.126488, - 0.109829, 0.339321, 0.0862324, 0.142625, - 0.120859, 0.35574, 0.101275, 0.15953, - 0.131956, 0.369845, 0.117892, 0.176991, - 0.143145, 0.38146, 0.136205, 0.199715, - 0.155292, 0.40052, 0.157252, 0.220787, - 0.167066, 0.412055, 0.179966, 0.243697, - 0.178396, 0.423133, 0.204418, 0.272106, - 0.190433, 0.439524, 0.232141, 0.297637, - 0.201265, 0.447041, 0.261109, 0.325273, - 0.211834, 0.454488, 0.292627, 0.357219, - 0.221889, 0.465004, 0.326669, 0.387362, - 0.230729, 0.468527, 0.362426, 0.423131, - 0.23924, 0.475836, 0.401533, 0.45543, - 0.246067, 0.475017, 0.441902, 0.493393, - 0.251557, 0.478017, 0.484239, 0.526253, - 0.255571, 0.4709, 0.528586, 0.560554, - 0.257752, 0.463167, 0.574346, 0.599306, - 0.258076, 0.456452, 0.621655, 0.634541, - 0.256471, 0.443725, 0.670492, 0.668907, - 0.253283, 0.428719, 0.721943, 0.705619, - 0.247562, 0.411348, 0.772477, 0.739034, - 0.240626, 0.388939, 0.8264, 0.771408, - 0.231493, 0.36425, 0.881702, 0.803312, - 0.220125, 0.337321, 0.9385, 0.828457, - 0.206645, 0.305364, 0.997437, 0.854819, - 0.190664, 0.273715, 1.05693, 0.878666, - 0.171429, 0.242218, 1.11251, 0.898404, - 0.149235, 0.209556, 1.16398, 0.917416, - 0.12435, 0.176863, 1.21014, 0.933133, - 0.0972703, 0.142775, 1.25178, 0.95066, - 0.0683607, 0.106735, 1.29028, 0.968589, - 0.0378724, 0.0681609, 1.32703, 0.984776, - 0.00605712, 0.0273966, 1.36158, 0.99994, 0.0263276, - 0.0138124, 1.3943, 0.00867437, - 1.86005e-06, 0.0928979, 1.73682e-07, 0.00864003, - 4.66389e-05, 0.0925237, 4.35505e-06, 0.00864593, - 0.000186594, 0.0925806, 1.74322e-05, 0.00864095, - 0.000419639, 0.0924903, 3.92862e-05, 0.00863851, - 0.000746272, 0.0924589, 7.02598e-05, 0.00868531, - 0.00116456, 0.0929, 0.000111188, 0.00869667, - 0.00167711, 0.0928529, 0.000163867, 0.00874332, - 0.00228051, 0.0930914, 0.00023104, 0.00882709, - 0.00297864, 0.0935679, 0.00031741, 0.00898874, - 0.00377557, 0.0946165, 0.000430186, 0.00929346, - 0.00469247, 0.0967406, 0.000580383, 0.00978271, - 0.00575491, 0.100084, 0.000783529, 0.0105746, - 0.00701514, 0.105447, 0.00106304, 0.0116949, - 0.00851797, 0.112494, 0.00144685, 0.0130419, - 0.0102757, 0.119876, 0.00196439, 0.0148375, - 0.012381, 0.129034, 0.00266433, 0.0168725, - 0.01482, 0.137812, 0.00358364, 0.0193689, - 0.0176563, 0.147696, 0.00478132, 0.0222691, - 0.0209211, 0.157795, 0.00631721, 0.0256891, - 0.0246655, 0.168431, 0.00826346, 0.0294686, - 0.0288597, 0.178587, 0.0106714, 0.0340412, - 0.0336441, 0.190251, 0.0136629, 0.0393918, - 0.039033, 0.202999, 0.0173272, 0.0453947, - 0.0450087, 0.215655, 0.0217448, 0.0521936, - 0.0515461, 0.228686, 0.0269941, 0.0600279, - 0.058817, 0.242838, 0.033272, 0.0692398, - 0.0667228, 0.258145, 0.0406457, 0.0793832, - 0.0752401, 0.273565, 0.0492239, 0.0902297, - 0.0841851, 0.287735, 0.0590105, 0.102014, - 0.0936479, 0.301161, 0.0702021, 0.116054, - 0.103967, 0.317438, 0.0832001, 0.13191, - 0.114622, 0.334166, 0.0977951, 0.148239, - 0.125452, 0.348192, 0.113985, 0.165809, - 0.136453, 0.361094, 0.131928, 0.184616, - 0.147648, 0.373534, 0.151811, 0.207491, - 0.159607, 0.39101, 0.174476, 0.230106, - 0.171119, 0.402504, 0.198798, 0.257036, - 0.182906, 0.418032, 0.225796, 0.281172, - 0.193605, 0.425468, 0.254027, 0.312034, - 0.204771, 0.440379, 0.285713, 0.340402, - 0.214988, 0.445406, 0.319196, 0.370231, - 0.224711, 0.44968, 0.35537, 0.407105, - 0.233516, 0.460747, 0.393838, 0.439037, - 0.240801, 0.460624, 0.433747, 0.47781, - 0.24762, 0.465957, 0.477234, 0.510655, - 0.251823, 0.460054, 0.52044, 0.550584, - 0.255552, 0.459172, 0.567853, 0.585872, - 0.257036, 0.450311, 0.615943, 0.620466, - 0.257535, 0.437763, 0.667693, 0.660496, - 0.255248, 0.426639, 0.718988, 0.695578, - 0.251141, 0.409185, 0.772503, 0.732176, - 0.244718, 0.39015, 0.827023, 0.760782, - 0.236782, 0.362594, 0.885651, 0.79422, - 0.225923, 0.33711, 0.943756, 0.824521, - 0.213855, 0.308272, 1.00874, 0.854964, - 0.197723, 0.278529, 1.06764, 0.878065, - 0.179209, 0.246208, 1.12836, 0.899834, - 0.157569, 0.21329, 1.18318, 0.918815, - 0.133206, 0.181038, 1.23161, 0.934934, - 0.106545, 0.146993, 1.27644, 0.952115, - 0.0780574, 0.111175, 1.31842, 0.96906, - 0.0478279, 0.0728553, 1.35839, 0.985178, - 0.0160014, 0.032579, 1.39697, 1.00039, 0.0173126, - 0.0095256, 1.43312, 0.00384146, - 1.24311e-06, 0.0613583, 7.78271e-08, 0.00390023, - 3.14043e-05, 0.0622919, 1.96626e-06, 0.00389971, - 0.000125622, 0.0622632, 7.87379e-06, 0.00389491, - 0.000282352, 0.0620659, 1.778e-05, 0.00391618, - 0.000502512, 0.0624687, 3.20918e-05, 0.00392662, - 0.000784458, 0.0625113, 5.15573e-05, 0.00396053, - 0.00112907, 0.0628175, 7.78668e-05, 0.00401911, - 0.00153821, 0.0633286, 0.000113811, 0.00414994, - 0.0020208, 0.0646443, 0.00016445, 0.00441223, - 0.00260007, 0.0673886, 0.000237734, 0.00484427, - 0.0033097, 0.0716528, 0.000345929, 0.00549109, - 0.00418966, 0.0774998, 0.000505987, 0.00636293, - 0.00527331, 0.0844758, 0.000739208, 0.00746566, - 0.00660428, 0.0921325, 0.00107347, 0.00876625, - 0.00818826, 0.0997067, 0.00153691, 0.0103125, - 0.0100811, 0.107433, 0.00217153, 0.0123309, - 0.0123643, 0.117088, 0.00303427, 0.0146274, - 0.0150007, 0.126438, 0.00416018, 0.0172295, - 0.0180531, 0.135672, 0.00561513, 0.0204248, - 0.0215962, 0.146244, 0.007478, 0.0241597, - 0.0256234, 0.157481, 0.00981046, 0.0284693, - 0.0302209, 0.169125, 0.0127148, 0.033445, - 0.0353333, 0.181659, 0.0162453, 0.0391251, - 0.0410845, 0.1944, 0.0205417, 0.0454721, - 0.0473451, 0.207082, 0.0256333, 0.0530983, - 0.0542858, 0.221656, 0.0317036, 0.0615356, - 0.0618384, 0.236036, 0.0388319, 0.0703363, - 0.0697631, 0.248398, 0.046974, 0.0810391, - 0.0784757, 0.263611, 0.0565246, 0.0920144, - 0.0873488, 0.275857, 0.0671724, 0.105584, - 0.0973652, 0.292555, 0.0798105, 0.119506, - 0.107271, 0.306333, 0.0935945, 0.134434, - 0.117608, 0.318888, 0.109106, 0.153399, - 0.128938, 0.337552, 0.127074, 0.171258, - 0.139944, 0.349955, 0.14643, 0.191059, - 0.151288, 0.361545, 0.168, 0.215069, - 0.163018, 0.378421, 0.192082, 0.237838, - 0.174226, 0.38879, 0.217838, 0.266965, - 0.186063, 0.405857, 0.246931, 0.292827, - 0.196909, 0.414146, 0.277505, 0.324352, - 0.207473, 0.426955, 0.310711, 0.354427, - 0.217713, 0.433429, 0.346794, 0.389854, - 0.227183, 0.443966, 0.385237, 0.420749, - 0.235131, 0.44471, 0.424955, 0.459597, - 0.242786, 0.451729, 0.468446, 0.495316, - 0.248767, 0.45072, 0.513422, 0.534903, - 0.253351, 0.450924, 0.560618, 0.572369, - 0.256277, 0.445266, 0.609677, 0.612383, - 0.2576, 0.438798, 0.660995, 0.644037, - 0.256931, 0.421693, 0.713807, 0.686749, - 0.254036, 0.4109, 0.767616, 0.719814, - 0.249785, 0.390151, 0.82533, 0.754719, - 0.244283, 0.367847, 0.888311, 0.792022, - 0.235076, 0.345013, 0.948177, 0.822404, - 0.225061, 0.316193, 1.01661, 0.853084, - 0.211113, 0.287013, 1.08075, 0.879871, - 0.19449, 0.255424, 1.14501, 0.901655, - 0.174023, 0.222879, 1.20203, 0.919957, - 0.1509, 0.18989, 1.25698, 0.938412, - 0.124923, 0.15606, 1.30588, 0.953471, - 0.0968139, 0.120512, 1.3529, 0.970451, - 0.066734, 0.0828515, 1.3986, 0.985522, - 0.034734, 0.0424458, 1.44148, 1.00099, - 0.00102222, 0.000678929, 1.48398, 0.000965494, - 6.27338e-07, 0.0306409, 1.97672e-08, 0.00099168, - 1.58573e-05, 0.0314638, 4.99803e-07, 0.000991068, - 6.34012e-05, 0.031363, 2.00682e-06, 0.000974567, - 0.00014144, 0.03036, 4.57312e-06, 0.000998079, - 0.000252812, 0.031496, 8.60131e-06, 0.00102243, - 0.000396506, 0.0319955, 1.48288e-05, 0.00107877, - 0.000577593, 0.0331376, 2.49141e-05, 0.00121622, - 0.000816816, 0.0359396, 4.23011e-05, 0.0014455, - 0.00113761, 0.0399652, 7.24613e-05, 0.00178791, - 0.00156959, 0.0450556, 0.000123929, 0.00225668, - 0.00214064, 0.0508025, 0.000208531, 0.00285627, - 0.00287655, 0.0568443, 0.000341969, 0.0035991, - 0.00380271, 0.0630892, 0.000544158, 0.00455524, - 0.00496264, 0.0702204, 0.000842423, 0.00569143, - 0.0063793, 0.0773426, 0.00126704, 0.00716928, - 0.00813531, 0.0860839, 0.00186642, 0.00885307, - 0.0101946, 0.0944079, 0.00267014, 0.0109316, - 0.0126386, 0.103951, 0.00374033, 0.0133704, - 0.0154876, 0.113786, 0.0051304, 0.0161525, - 0.0187317, 0.123477, 0.00688858, 0.0194267, - 0.0224652, 0.133986, 0.00910557, 0.0230967, - 0.0265976, 0.143979, 0.0118074, 0.0273627, - 0.0312848, 0.154645, 0.0151266, 0.0323898, - 0.0365949, 0.166765, 0.0191791, 0.0379225, - 0.0422914, 0.177932, 0.0239236, 0.0447501, - 0.0487469, 0.19167, 0.0296568, 0.0519391, - 0.0556398, 0.203224, 0.0362924, 0.0599464, - 0.0631646, 0.215652, 0.0440585, 0.0702427, - 0.0714308, 0.232089, 0.0531619, 0.0806902, - 0.0800605, 0.245258, 0.0634564, 0.0923194, - 0.0892815, 0.258609, 0.0752481, 0.106938, - 0.09931, 0.276654, 0.0888914, 0.121238, - 0.109575, 0.289847, 0.104055, 0.138817, - 0.120461, 0.307566, 0.121266, 0.15595, - 0.131209, 0.320117, 0.139944, 0.178418, - 0.143049, 0.339677, 0.161591, 0.197875, - 0.154074, 0.349886, 0.184303, 0.224368, - 0.166307, 0.369352, 0.210669, 0.252213, - 0.178051, 0.386242, 0.238895, 0.277321, - 0.189335, 0.395294, 0.269182, 0.310332, - 0.200683, 0.412148, 0.302508, 0.338809, - 0.210856, 0.418266, 0.337264, 0.372678, - 0.220655, 0.428723, 0.374881, 0.405632, - 0.230053, 0.433887, 0.415656, 0.442293, - 0.237993, 0.439911, 0.457982, 0.477256, - 0.244897, 0.440175, 0.502831, 0.515592, - 0.250657, 0.441079, 0.550277, 0.550969, - 0.255459, 0.435219, 0.601102, 0.592883, - 0.257696, 0.432882, 0.651785, 0.629092, - 0.259894, 0.421054, 0.708961, 0.672033, - 0.258592, 0.41177, 0.763806, 0.709147, - 0.256525, 0.395267, 0.824249, 0.745367, - 0.254677, 0.375013, 0.8951, 0.784715, - 0.247892, 0.353906, 0.959317, 0.818107, - 0.240162, 0.327801, 1.03153, 0.847895, - 0.229741, 0.298821, 1.10601, 0.879603, - 0.213084, 0.269115, 1.164, 0.902605, - 0.195242, 0.236606, 1.22854, 0.922788, - 0.174505, 0.203442, 1.29017, 0.944831, - 0.150169, 0.169594, 1.34157, 0.959656, - 0.124099, 0.135909, 1.3956, 0.972399, - 0.0960626, 0.0990563, 1.45128, 0.986549, - 0.0657097, 0.0602348, 1.50312, 1.00013, - 0.0333558, 0.0186694, 1.55364, 6.19747e-06, - 1e-07, 0.00778326, 7.96756e-11, 2.37499e-08, - 9.99999e-08, 2.82592e-05, 1.14596e-10, 1.00292e-06, - 1.66369e-06, 0.000250354, 6.77492e-09, 3.50752e-06, - 6.37769e-06, 0.000357289, 6.31655e-08, 8.26445e-06, - 1.74689e-05, 0.000516179, 3.1851e-07, 2.42481e-05, - 4.50868e-05, 0.0010223, 1.30577e-06, 4.55631e-05, - 8.9044e-05, 0.00144302, 3.74587e-06, 9.71222e-05, - 0.000178311, 0.00241912, 1.02584e-05, 0.000171403, - 0.000313976, 0.00354938, 2.36481e-05, 0.000292747, - 0.000520026, 0.00513765, 4.96014e-05, 0.000789827, - 0.00118187, 0.0238621, 0.000139056, 0.00114093, - 0.00171827, 0.0286691, 0.000244093, 0.00176119, - 0.00249667, 0.0368565, 0.000420623, 0.0022233, - 0.00333742, 0.0400469, 0.00065673, 0.00343382, - 0.00481976, 0.0535751, 0.00109323, 0.00427602, - 0.00600755, 0.057099, 0.00155268, 0.00461435, - 0.00737637, 0.0551084, 0.00215031, 0.00695698, - 0.00971401, 0.0715767, 0.00316529, 0.00867619, - 0.0120943, 0.0793314, 0.00436995, 0.0106694, - 0.0148202, 0.0869391, 0.0058959, 0.0140351, - 0.0183501, 0.101572, 0.00798757, 0.0168939, - 0.022006, 0.11018, 0.0104233, 0.020197, - 0.0261568, 0.119041, 0.0134167, 0.0254702, - 0.0312778, 0.135404, 0.0173009, 0.0298384, - 0.0362469, 0.1437, 0.0215428, 0.035159, - 0.042237, 0.15512, 0.0268882, 0.0427685, - 0.0488711, 0.17128, 0.033235, 0.0494848, - 0.0557997, 0.181813, 0.0404443, 0.0592394, - 0.0635578, 0.198745, 0.0490043, 0.0681463, - 0.071838, 0.210497, 0.0588239, 0.0804753, - 0.0809297, 0.228864, 0.0702835, 0.0942205, - 0.0906488, 0.247008, 0.0834012, 0.106777, - 0.100216, 0.258812, 0.0975952, 0.124471, - 0.110827, 0.278617, 0.114162, 0.138389, - 0.121193, 0.287049, 0.131983, 0.159543, - 0.13253, 0.307151, 0.152541, 0.176432, - 0.143611, 0.31564, 0.174673, 0.201723, - 0.15548, 0.33538, 0.199842, 0.229721, - 0.167166, 0.355256, 0.227097, 0.250206, - 0.178238, 0.360047, 0.256014, 0.282118, - 0.189905, 0.378761, 0.28855, 0.312821, - 0.201033, 0.39181, 0.323348, 0.341482, - 0.211584, 0.397716, 0.360564, 0.377368, - 0.221314, 0.410141, 0.400004, 0.418229, - 0.230474, 0.423485, 0.442371, 0.444881, - 0.239443, 0.418874, 0.488796, 0.488899, - 0.245987, 0.427545, 0.535012, 0.520317, - 0.253948, 0.422147, 0.589678, 0.568566, - 0.256616, 0.42719, 0.637683, 0.599607, - 0.26376, 0.415114, 0.703363, 0.64222, - 0.268687, 0.408715, 0.771363, 0.685698, - 0.2694, 0.399722, 0.83574, 0.732327, - 0.266642, 0.388651, 0.897764, 0.769873, - 0.267712, 0.369198, 0.983312, 0.806733, - 0.263479, 0.346802, 1.06222, 0.843466, - 0.254575, 0.321368, 1.13477, 0.873008, - 0.242749, 0.29211, 1.20712, 0.908438, - 0.22725, 0.262143, 1.27465, 0.936321, - 0.207621, 0.228876, 1.33203, 0.950353, - 0.187932, 0.19484, 1.40439, 0.96442, - 0.165154, 0.163178, 1.4732, 0.979856, - 0.139302, 0.127531, 1.53574, 0.982561, - 0.11134, 0.0903457, 1.59982, 0.996389, - 0.0808124, 0.0489007, 1.6577 ];\n\n\t\tconst LTC_MAT_2 = [ 1, 0, 0, 0, 1, 7.91421e-31, 0, 0, 1, 1.04392e-24, 0, 0, 1, 3.49405e-21, 0, 0, 1, 1.09923e-18, 0, 0, 1, 9.47414e-17, 0, 0, 1, 3.59627e-15, 0, 0, 1, 7.72053e-14, 0, 0, 1, 1.08799e-12, 0, 0, 1, 1.10655e-11, 0, 0, 1, 8.65818e-11, 0, 0, 0.999998, 5.45037e-10, 0, 0, 0.999994, 2.85095e-09, 0, 0, 0.999989, 1.26931e-08, 0, 0, 0.999973, 4.89938e-08, 0, 0, 0.999947, 1.66347e-07, 0, 0, 0.999894, 5.02694e-07, 0, 0, 0.999798, 1.36532e-06, 0, 0, 0.999617, 3.35898e-06, 0, 0, 0.999234, 7.52126e-06, 0, 0, 0.998258, 1.52586e-05, 0, 0, 0.99504, 2.66207e-05, 0, 0, 0.980816, 2.36802e-05, 0, 0, 0.967553, 2.07684e-06, 0, 0, 0.966877, 4.03733e-06, 0, 0, 0.965752, 7.41174e-06, 0, 0, 0.96382, 1.27746e-05, 0, 0, 0.960306, 2.02792e-05, 0, 0, 0.953619, 2.80232e-05, 0, 0, 0.941103, 2.78816e-05, 0, 0, 0.926619, 1.60221e-05, 0, 0, 0.920983, 2.35164e-05, 0, 0, 0.912293, 3.11924e-05, 0, 0.0158731, 0.899277, 3.48118e-05, 0, 0.0476191, 0.880884, 2.6041e-05, 0, 0.0793651, 0.870399, 3.38726e-05, 0, 0.111111, 0.856138, 3.92906e-05, 0, 0.142857, 0.837436, 3.72874e-05, 0, 0.174603, 0.820973, 3.92558e-05, 0, 0.206349, 0.803583, 4.34658e-05, 0, 0.238095, 0.782168, 4.0256e-05, 0, 0.269841, 0.764107, 4.48159e-05, 0, 0.301587, 0.743092, 4.57627e-05, 0, 0.333333, 0.721626, 4.55314e-05, 0, 0.365079, 0.700375, 4.77335e-05, 0, 0.396825, 0.677334, 4.61072e-05, 0, 0.428571, 0.655702, 4.84393e-05, 0, 0.460317, 0.632059, 4.64583e-05, 0, 0.492064, 0.610125, 4.83923e-05, 0, 0.52381, 0.58653, 4.64342e-05, 0, 0.555556, 0.564508, 4.77033e-05, 0, 0.587302, 0.541405, 4.59263e-05, 0, 0.619048, 0.519556, 4.6412e-05, 0, 0.650794, 0.497292, 4.48913e-05, 0, 0.68254, 0.475898, 4.45789e-05, 0, 0.714286, 0.454722, 4.33496e-05, 0, 0.746032, 0.434042, 4.23054e-05, 0, 0.777778, 0.414126, 4.13737e-05, 0, 0.809524, 0.394387, 3.97265e-05, 0, 0.84127, 0.375841, 3.90709e-05, 0, 0.873016, 0.357219, 3.69938e-05, 0, 0.904762, 0.340084, 3.65618e-05, 0, 0.936508, 0.322714, 3.42533e-05, 0, 0.968254, 0.306974, 3.39596e-05, 0, 1, 1, 1.01524e-18, 0, 0, 1, 1.0292e-18, 0, 0, 1, 1.30908e-18, 0, 0, 1, 4.73331e-18, 0, 0, 1, 6.25319e-17, 0, 0, 1, 1.07932e-15, 0, 0, 1, 1.63779e-14, 0, 0, 1, 2.03198e-13, 0, 0, 1, 2.04717e-12, 0, 0, 0.999999, 1.68995e-11, 0, 0, 0.999998, 1.15855e-10, 0, 0, 0.999996, 6.6947e-10, 0, 0, 0.999991, 3.30863e-09, 0, 0, 0.999983, 1.41737e-08, 0, 0, 0.999968, 5.32626e-08, 0, 0, 0.99994, 1.77431e-07, 0, 0, 0.999891, 5.28835e-07, 0, 0, 0.999797, 1.42169e-06, 0, 0, 0.999617, 3.47057e-06, 0, 0, 0.999227, 7.7231e-06, 0, 0, 0.998239, 1.55753e-05, 0, 0, 0.994937, 2.68495e-05, 0, 0, 0.980225, 2.13742e-05, 0, 0, 0.967549, 2.1631e-06, 0, 0, 0.966865, 4.17989e-06, 0, 0, 0.965739, 7.63341e-06, 0, 0, 0.963794, 1.30892e-05, 0, 0, 0.960244, 2.06456e-05, 0, 0, 0.953495, 2.82016e-05, 0, 0.000148105, 0.940876, 2.71581e-05, 0, 0.002454, 0.926569, 1.64159e-05, 0, 0.00867491, 0.920905, 2.39521e-05, 0, 0.01956, 0.912169, 3.15127e-05, 0, 0.035433, 0.899095, 3.46626e-05, 0, 0.056294, 0.882209, 2.90223e-05, 0, 0.0818191, 0.870272, 3.42992e-05, 0, 0.111259, 0.855977, 3.94164e-05, 0, 0.142857, 0.837431, 3.72343e-05, 0, 0.174603, 0.820826, 3.96691e-05, 0, 0.206349, 0.803408, 4.35395e-05, 0, 0.238095, 0.782838, 4.19579e-05, 0, 0.269841, 0.763941, 4.50953e-05, 0, 0.301587, 0.742904, 4.55847e-05, 0, 0.333333, 0.721463, 4.58833e-05, 0, 0.365079, 0.700197, 4.77159e-05, 0, 0.396825, 0.677501, 4.70641e-05, 0, 0.428571, 0.655527, 4.84732e-05, 0, 0.460317, 0.6324, 4.76834e-05, 0, 0.492064, 0.609964, 4.84213e-05, 0, 0.52381, 0.586839, 4.75541e-05, 0, 0.555556, 0.564353, 4.76951e-05, 0, 0.587302, 0.541589, 4.67611e-05, 0, 0.619048, 0.519413, 4.63493e-05, 0, 0.650794, 0.497337, 4.53994e-05, 0, 0.68254, 0.475797, 4.45308e-05, 0, 0.714286, 0.454659, 4.35787e-05, 0, 0.746032, 0.434065, 4.24839e-05, 0, 0.777778, 0.414018, 4.1436e-05, 0, 0.809524, 0.39455, 4.01902e-05, 0, 0.84127, 0.375742, 3.90813e-05, 0, 0.873016, 0.357501, 3.77116e-05, 0, 0.904762, 0.339996, 3.6535e-05, 0, 0.936508, 0.323069, 3.51265e-05, 0, 0.968254, 0.306897, 3.39112e-05, 0, 1, 1, 1.0396e-15, 0, 0, 1, 1.04326e-15, 0, 0, 1, 1.10153e-15, 0, 0, 1, 1.44668e-15, 0, 0, 1, 3.4528e-15, 0, 0, 1, 1.75958e-14, 0, 0, 1, 1.2627e-13, 0, 0, 1, 9.36074e-13, 0, 0, 1, 6.45742e-12, 0, 0, 0.999998, 4.01228e-11, 0, 0, 0.999997, 2.22338e-10, 0, 0, 0.999995, 1.0967e-09, 0, 0, 0.999991, 4.82132e-09, 0, 0, 0.999981, 1.89434e-08, 0, 0, 0.999967, 6.67716e-08, 0, 0, 0.999938, 2.12066e-07, 0, 0, 0.999886, 6.0977e-07, 0, 0, 0.999792, 1.59504e-06, 0, 0, 0.999608, 3.81191e-06, 0, 0, 0.999209, 8.33727e-06, 0, 0, 0.998179, 1.65288e-05, 0, 0, 0.994605, 2.74387e-05, 0, 0, 0.979468, 1.67316e-05, 0, 0, 0.967529, 2.42877e-06, 0, 0, 0.966836, 4.61696e-06, 0, 0, 0.96569, 8.30977e-06, 0, 0, 0.963706, 1.40427e-05, 0, 2.44659e-06, 0.960063, 2.17353e-05, 0, 0.000760774, 0.953113, 2.86606e-05, 0, 0.00367261, 0.940192, 2.47691e-05, 0, 0.00940263, 0.927731, 1.95814e-05, 0, 0.018333, 0.920669, 2.52531e-05, 0, 0.0306825, 0.911799, 3.24277e-05, 0, 0.0465556, 0.89857, 3.40982e-05, 0, 0.0659521, 0.883283, 3.19622e-05, 0, 0.0887677, 0.86989, 3.5548e-05, 0, 0.114784, 0.855483, 3.97143e-05, 0, 0.143618, 0.837987, 3.91665e-05, 0, 0.174606, 0.820546, 4.11306e-05, 0, 0.206349, 0.802878, 4.36753e-05, 0, 0.238095, 0.783402, 4.44e-05, 0, 0.269841, 0.763439, 4.58726e-05, 0, 0.301587, 0.742925, 4.67097e-05, 0, 0.333333, 0.721633, 4.78887e-05, 0, 0.365079, 0.69985, 4.81251e-05, 0, 0.396825, 0.67783, 4.91811e-05, 0, 0.428571, 0.655126, 4.88199e-05, 0, 0.460318, 0.632697, 4.96025e-05, 0, 0.492064, 0.609613, 4.8829e-05, 0, 0.52381, 0.587098, 4.92754e-05, 0, 0.555556, 0.564119, 4.82625e-05, 0, 0.587302, 0.541813, 4.82807e-05, 0, 0.619048, 0.519342, 4.71552e-05, 0, 0.650794, 0.497514, 4.66765e-05, 0, 0.68254, 0.475879, 4.55582e-05, 0, 0.714286, 0.454789, 4.46007e-05, 0, 0.746032, 0.434217, 4.35382e-05, 0, 0.777778, 0.414086, 4.21753e-05, 0, 0.809524, 0.394744, 4.12093e-05, 0, 0.84127, 0.375782, 3.96634e-05, 0, 0.873016, 0.357707, 3.86419e-05, 0, 0.904762, 0.340038, 3.70345e-05, 0, 0.936508, 0.323284, 3.59725e-05, 0, 0.968254, 0.306954, 3.436e-05, 0, 1, 1, 5.99567e-14, 0, 0, 1, 6.00497e-14, 0, 0, 1, 6.14839e-14, 0, 0, 1, 6.86641e-14, 0, 0, 1, 9.72658e-14, 0, 0, 1, 2.21271e-13, 0, 0, 1, 8.33195e-13, 0, 0, 1, 4.03601e-12, 0, 0, 0.999999, 2.06001e-11, 0, 0, 0.999998, 1.01739e-10, 0, 0, 0.999997, 4.70132e-10, 0, 0, 0.999993, 2.00436e-09, 0, 0, 0.999988, 7.83682e-09, 0, 0, 0.999979, 2.80338e-08, 0, 0, 0.999962, 9.17033e-08, 0, 0, 0.999933, 2.74514e-07, 0, 0, 0.999881, 7.53201e-07, 0, 0, 0.999783, 1.89826e-06, 0, 0, 0.999594, 4.40279e-06, 0, 0, 0.999178, 9.3898e-06, 0, 0, 0.998073, 1.81265e-05, 0, 0, 0.993993, 2.80487e-05, 0, 0, 0.979982, 1.49422e-05, 0, 0, 0.968145, 3.78481e-06, 0, 0, 0.966786, 5.3771e-06, 0, 0, 0.965611, 9.47508e-06, 0, 3.88934e-05, 0.963557, 1.56616e-05, 0, 0.0009693, 0.959752, 2.35144e-05, 0, 0.00370329, 0.952461, 2.91568e-05, 0, 0.00868428, 0.940193, 2.40102e-05, 0, 0.0161889, 0.929042, 2.31235e-05, 0, 0.0263948, 0.920266, 2.73968e-05, 0, 0.0394088, 0.911178, 3.37915e-05, 0, 0.0552818, 0.897873, 3.33629e-05, 0, 0.0740138, 0.884053, 3.51405e-05, 0, 0.0955539, 0.869455, 3.78034e-05, 0, 0.119795, 0.854655, 3.99378e-05, 0, 0.14656, 0.838347, 4.19108e-05, 0, 0.175573, 0.820693, 4.40831e-05, 0, 0.206388, 0.802277, 4.45599e-05, 0, 0.238095, 0.783634, 4.72691e-05, 0, 0.269841, 0.763159, 4.76984e-05, 0, 0.301587, 0.742914, 4.91487e-05, 0, 0.333333, 0.721662, 5.02312e-05, 0, 0.365079, 0.699668, 5.02817e-05, 0, 0.396825, 0.677839, 5.1406e-05, 0, 0.428571, 0.655091, 5.11095e-05, 0, 0.460317, 0.632665, 5.16067e-05, 0, 0.492064, 0.609734, 5.12255e-05, 0, 0.52381, 0.587043, 5.10263e-05, 0, 0.555556, 0.564298, 5.0565e-05, 0, 0.587302, 0.541769, 4.97951e-05, 0, 0.619048, 0.519529, 4.92698e-05, 0, 0.650794, 0.497574, 4.82066e-05, 0, 0.68254, 0.476028, 4.73689e-05, 0, 0.714286, 0.454961, 4.61941e-05, 0, 0.746032, 0.434341, 4.50618e-05, 0, 0.777778, 0.414364, 4.38355e-05, 0, 0.809524, 0.394832, 4.24196e-05, 0, 0.84127, 0.376109, 4.12563e-05, 0, 0.873016, 0.35779, 3.96226e-05, 0, 0.904762, 0.340379, 3.84886e-05, 0, 0.936508, 0.323385, 3.68214e-05, 0, 0.968254, 0.307295, 3.56636e-05, 0, 1, 1, 1.06465e-12, 0, 0, 1, 1.06555e-12, 0, 0, 1, 1.07966e-12, 0, 0, 1, 1.14601e-12, 0, 0, 1, 1.37123e-12, 0, 0, 1, 2.1243e-12, 0, 0, 0.999999, 4.89653e-12, 0, 0, 0.999999, 1.60283e-11, 0, 0, 0.999998, 6.2269e-11, 0, 0, 0.999997, 2.51859e-10, 0, 0, 0.999996, 9.96192e-10, 0, 0, 0.999992, 3.74531e-09, 0, 0, 0.999986, 1.32022e-08, 0, 0, 0.999975, 4.33315e-08, 0, 0, 0.999959, 1.31956e-07, 0, 0, 0.999927, 3.72249e-07, 0, 0, 0.999871, 9.72461e-07, 0, 0, 0.999771, 2.35343e-06, 0, 0, 0.999572, 5.2768e-06, 0, 0, 0.999133, 1.09237e-05, 0, 0, 0.997912, 2.03675e-05, 0, 0, 0.993008, 2.79396e-05, 0, 0, 0.980645, 1.39604e-05, 0, 0, 0.970057, 6.46596e-06, 0, 0, 0.966717, 6.5089e-06, 0, 4.74145e-05, 0.965497, 1.11863e-05, 0, 0.00089544, 0.96334, 1.79857e-05, 0, 0.0032647, 0.959294, 2.59045e-05, 0, 0.0075144, 0.951519, 2.92327e-05, 0, 0.0138734, 0.940517, 2.49769e-05, 0, 0.0224952, 0.93014, 2.6803e-05, 0, 0.0334828, 0.91972, 3.03656e-05, 0, 0.0468973, 0.910294, 3.53323e-05, 0, 0.0627703, 0.897701, 3.51002e-05, 0, 0.0811019, 0.884522, 3.88104e-05, 0, 0.10186, 0.869489, 4.12932e-05, 0, 0.124985, 0.853983, 4.15781e-05, 0, 0.150372, 0.838425, 4.54066e-05, 0, 0.177868, 0.820656, 4.71624e-05, 0, 0.207245, 0.801875, 4.75243e-05, 0, 0.238143, 0.783521, 5.05621e-05, 0, 0.269841, 0.763131, 5.0721e-05, 0, 0.301587, 0.74261, 5.23293e-05, 0, 0.333333, 0.72148, 5.28699e-05, 0, 0.365079, 0.699696, 5.38677e-05, 0, 0.396825, 0.677592, 5.39255e-05, 0, 0.428571, 0.65525, 5.46367e-05, 0, 0.460317, 0.632452, 5.41348e-05, 0, 0.492064, 0.609903, 5.44976e-05, 0, 0.52381, 0.586928, 5.36201e-05, 0, 0.555556, 0.564464, 5.35185e-05, 0, 0.587302, 0.541801, 5.24949e-05, 0, 0.619048, 0.519681, 5.1812e-05, 0, 0.650794, 0.497685, 5.07687e-05, 0, 0.68254, 0.47622, 4.96243e-05, 0, 0.714286, 0.455135, 4.85714e-05, 0, 0.746032, 0.4346, 4.71847e-05, 0, 0.777778, 0.414564, 4.59294e-05, 0, 0.809524, 0.395165, 4.44705e-05, 0, 0.84127, 0.376333, 4.30772e-05, 0, 0.873016, 0.358197, 4.16229e-05, 0, 0.904762, 0.34064, 4.01019e-05, 0, 0.936508, 0.323816, 3.86623e-05, 0, 0.968254, 0.307581, 3.70933e-05, 0, 1, 1, 9.91541e-12, 0, 0, 1, 9.92077e-12, 0, 0, 1, 1.00041e-11, 0, 0, 1, 1.0385e-11, 0, 0, 1, 1.15777e-11, 0, 0, 1, 1.50215e-11, 0, 0, 0.999999, 2.54738e-11, 0, 0, 0.999999, 5.98822e-11, 0, 0, 0.999998, 1.79597e-10, 0, 0, 0.999997, 6.02367e-10, 0, 0, 0.999994, 2.06835e-09, 0, 0, 0.99999, 6.94952e-09, 0, 0, 0.999984, 2.23363e-08, 0, 0, 0.999972, 6.78578e-08, 0, 0, 0.999952, 1.93571e-07, 0, 0, 0.999919, 5.16594e-07, 0, 0, 0.99986, 1.28739e-06, 0, 0, 0.999753, 2.99298e-06, 0, 0, 0.999546, 6.48258e-06, 0, 0, 0.999074, 1.29985e-05, 0, 0, 0.997671, 2.32176e-05, 0, 0, 0.991504, 2.56701e-05, 0, 0, 0.981148, 1.31141e-05, 0, 0, 0.971965, 8.69048e-06, 0, 2.80182e-05, 0.966624, 8.08301e-06, 0, 0.000695475, 0.965344, 1.35235e-05, 0, 0.00265522, 0.963048, 2.10592e-05, 0, 0.00622975, 0.958673, 2.87473e-05, 0, 0.0116234, 0.950262, 2.81379e-05, 0, 0.018976, 0.940836, 2.71089e-05, 0, 0.0283844, 0.930996, 3.0926e-05, 0, 0.0399151, 0.919848, 3.48359e-05, 0, 0.0536063, 0.909136, 3.66092e-05, 0, 0.0694793, 0.897554, 3.84162e-05, 0, 0.0875342, 0.884691, 4.30971e-05, 0, 0.107749, 0.869414, 4.47803e-05, 0, 0.130087, 0.853462, 4.52858e-05, 0, 0.154481, 0.838187, 4.95769e-05, 0, 0.180833, 0.820381, 5.02709e-05, 0, 0.209005, 0.801844, 5.22713e-05, 0, 0.238791, 0.783061, 5.41505e-05, 0, 0.269869, 0.763205, 5.53712e-05, 0, 0.301587, 0.742362, 5.64909e-05, 0, 0.333333, 0.721393, 5.72646e-05, 0, 0.365079, 0.699676, 5.81012e-05, 0, 0.396825, 0.677395, 5.8096e-05, 0, 0.428571, 0.655208, 5.85766e-05, 0, 0.460317, 0.632451, 5.83602e-05, 0, 0.492064, 0.609839, 5.80234e-05, 0, 0.52381, 0.587093, 5.77161e-05, 0, 0.555556, 0.564467, 5.68447e-05, 0, 0.587302, 0.542043, 5.63166e-05, 0, 0.619048, 0.519826, 5.5156e-05, 0, 0.650794, 0.497952, 5.41682e-05, 0, 0.68254, 0.476477, 5.28971e-05, 0, 0.714286, 0.455412, 5.14952e-05, 0, 0.746032, 0.434926, 5.02222e-05, 0, 0.777778, 0.4149, 4.85779e-05, 0, 0.809524, 0.395552, 4.72242e-05, 0, 0.84127, 0.376712, 4.54891e-05, 0, 0.873016, 0.358622, 4.40924e-05, 0, 0.904762, 0.341048, 4.22984e-05, 0, 0.936508, 0.324262, 4.08582e-05, 0, 0.968254, 0.308013, 3.90839e-05, 0, 1, 1, 6.13913e-11, 0, 0, 1, 6.14145e-11, 0, 0, 1, 6.17708e-11, 0, 0, 1, 6.33717e-11, 0, 0, 1, 6.81648e-11, 0, 0, 1, 8.08291e-11, 0, 0, 1, 1.14608e-10, 0, 0, 0.999998, 2.10507e-10, 0, 0, 0.999997, 4.99595e-10, 0, 0, 0.999995, 1.39897e-09, 0, 0, 0.999994, 4.19818e-09, 0, 0, 0.999988, 1.27042e-08, 0, 0, 0.999979, 3.75153e-08, 0, 0, 0.999965, 1.06206e-07, 0, 0, 0.999945, 2.85381e-07, 0, 0, 0.999908, 7.23611e-07, 0, 0, 0.999846, 1.7255e-06, 0, 0, 0.999733, 3.86104e-06, 0, 0, 0.999511, 8.08493e-06, 0, 0, 0.998993, 1.56884e-05, 0, 0, 0.997326, 2.65538e-05, 0, 0, 0.989706, 2.06466e-05, 0, 0, 0.981713, 1.30756e-05, 0, 7.0005e-06, 0.973636, 1.06473e-05, 0, 0.000464797, 0.966509, 1.0194e-05, 0, 0.00201743, 0.965149, 1.65881e-05, 0, 0.00497549, 0.962669, 2.49147e-05, 0, 0.00953262, 0.95786, 3.17449e-05, 0, 0.0158211, 0.949334, 2.81045e-05, 0, 0.0239343, 0.941041, 3.03263e-05, 0, 0.0339372, 0.931575, 3.56754e-05, 0, 0.0458738, 0.920102, 3.97075e-05, 0, 0.059772, 0.908002, 3.84886e-05, 0, 0.075645, 0.897269, 4.3027e-05, 0, 0.0934929, 0.884559, 4.79925e-05, 0, 0.113302, 0.869161, 4.8246e-05, 0, 0.135045, 0.853342, 5.09505e-05, 0, 0.158678, 0.837633, 5.42846e-05, 0, 0.184136, 0.820252, 5.54139e-05, 0, 0.211325, 0.801872, 5.81412e-05, 0, 0.240113, 0.782418, 5.85535e-05, 0, 0.270306, 0.7631, 6.10923e-05, 0, 0.301594, 0.742183, 6.13678e-05, 0, 0.333333, 0.721098, 6.27275e-05, 0, 0.365079, 0.699512, 6.29413e-05, 0, 0.396825, 0.677372, 6.36351e-05, 0, 0.428571, 0.655059, 6.33555e-05, 0, 0.460317, 0.632567, 6.36513e-05, 0, 0.492064, 0.609784, 6.28965e-05, 0, 0.52381, 0.587237, 6.25546e-05, 0, 0.555556, 0.564525, 6.15825e-05, 0, 0.587302, 0.542181, 6.05048e-05, 0, 0.619048, 0.520017, 5.96329e-05, 0, 0.650794, 0.498204, 5.81516e-05, 0, 0.68254, 0.476742, 5.69186e-05, 0, 0.714286, 0.455803, 5.53833e-05, 0, 0.746032, 0.435251, 5.37807e-05, 0, 0.777778, 0.415374, 5.22025e-05, 0, 0.809524, 0.395921, 5.03421e-05, 0, 0.84127, 0.377253, 4.88211e-05, 0, 0.873016, 0.359021, 4.68234e-05, 0, 0.904762, 0.341637, 4.53269e-05, 0, 0.936508, 0.3247, 4.33014e-05, 0, 0.968254, 0.308625, 4.18007e-05, 0, 1, 1, 2.86798e-10, 0, 0, 1, 2.86877e-10, 0, 0, 1, 2.88094e-10, 0, 0, 1, 2.93506e-10, 0, 0, 1, 3.09262e-10, 0, 0, 0.999999, 3.48593e-10, 0, 0, 0.999999, 4.44582e-10, 0, 0, 0.999998, 6.88591e-10, 0, 0, 0.999996, 1.34391e-09, 0, 0, 0.999993, 3.17438e-09, 0, 0, 0.999989, 8.35609e-09, 0, 0, 0.999983, 2.28677e-08, 0, 0, 0.999974, 6.23361e-08, 0, 0, 0.999959, 1.65225e-07, 0, 0, 0.999936, 4.19983e-07, 0, 0, 0.999896, 1.01546e-06, 0, 0, 0.99983, 2.32376e-06, 0, 0, 0.999709, 5.0156e-06, 0, 0, 0.999469, 1.0167e-05, 0, 0, 0.998886, 1.90775e-05, 0, 0, 0.996819, 3.00511e-05, 0, 0, 0.988837, 1.85092e-05, 0, 1.68222e-07, 0.982178, 1.34622e-05, 0, 0.000259622, 0.975017, 1.25961e-05, 0, 0.00142595, 0.967101, 1.3507e-05, 0, 0.00382273, 0.964905, 2.05003e-05, 0, 0.00764164, 0.96218, 2.9546e-05, 0, 0.0130121, 0.956821, 3.43738e-05, 0, 0.0200253, 0.948829, 3.05063e-05, 0, 0.0287452, 0.941092, 3.46487e-05, 0, 0.039218, 0.931883, 4.12061e-05, 0, 0.0514748, 0.920211, 4.44651e-05, 0, 0.0655351, 0.907307, 4.31252e-05, 0, 0.0814082, 0.89684, 4.90382e-05, 0, 0.0990939, 0.884119, 5.3334e-05, 0, 0.118583, 0.869148, 5.4114e-05, 0, 0.139856, 0.853377, 5.78536e-05, 0, 0.162882, 0.836753, 5.92285e-05, 0, 0.187615, 0.820063, 6.22787e-05, 0, 0.213991, 0.801694, 6.45492e-05, 0, 0.241918, 0.782116, 6.5353e-05, 0, 0.271267, 0.762673, 6.74344e-05, 0, 0.301847, 0.742133, 6.82788e-05, 0, 0.333333, 0.720779, 6.91959e-05, 0, 0.365079, 0.699386, 6.96817e-05, 0, 0.396826, 0.67732, 6.99583e-05, 0, 0.428572, 0.654888, 6.98447e-05, 0, 0.460318, 0.632499, 6.94063e-05, 0, 0.492064, 0.609825, 6.91612e-05, 0, 0.52381, 0.587287, 6.81576e-05, 0, 0.555556, 0.564743, 6.74138e-05, 0, 0.587302, 0.542409, 6.61617e-05, 0, 0.619048, 0.520282, 6.47785e-05, 0, 0.650794, 0.498506, 6.33836e-05, 0, 0.68254, 0.477102, 6.15905e-05, 0, 0.714286, 0.456167, 6.01013e-05, 0, 0.746032, 0.435728, 5.81457e-05, 0, 0.777778, 0.415809, 5.64215e-05, 0, 0.809524, 0.396517, 5.44997e-05, 0, 0.84127, 0.377737, 5.25061e-05, 0, 0.873016, 0.359698, 5.06831e-05, 0, 0.904762, 0.342164, 4.8568e-05, 0, 0.936508, 0.325417, 4.67826e-05, 0, 0.968254, 0.309186, 4.46736e-05, 0, 1, 1, 1.09018e-09, 0, 0, 1, 1.0904e-09, 0, 0, 1, 1.09393e-09, 0, 0, 1, 1.1095e-09, 0, 0, 1, 1.154e-09, 0, 0, 1, 1.26089e-09, 0, 0, 0.999999, 1.5059e-09, 0, 0, 0.999997, 2.07899e-09, 0, 0, 0.999994, 3.48164e-09, 0, 0, 0.999993, 7.05728e-09, 0, 0, 0.999987, 1.63692e-08, 0, 0, 0.999981, 4.06033e-08, 0, 0, 0.999969, 1.0245e-07, 0, 0, 0.999953, 2.55023e-07, 0, 0, 0.999925, 6.1511e-07, 0, 0, 0.999881, 1.42218e-06, 0, 0, 0.99981, 3.13086e-06, 0, 0, 0.99968, 6.53119e-06, 0, 0, 0.999418, 1.2832e-05, 0, 0, 0.998748, 2.32497e-05, 0, 0, 0.996066, 3.29522e-05, 0, 0, 0.988379, 1.79613e-05, 0, 0.000108799, 0.982567, 1.43715e-05, 0, 0.000921302, 0.976097, 1.48096e-05, 0, 0.00280738, 0.968475, 1.78905e-05, 0, 0.00596622, 0.964606, 2.53921e-05, 0, 0.0105284, 0.961564, 3.48623e-05, 0, 0.0165848, 0.955517, 3.57612e-05, 0, 0.0242, 0.948381, 3.43493e-05, 0, 0.03342, 0.941095, 4.05849e-05, 0, 0.0442777, 0.931923, 4.75394e-05, 0, 0.0567958, 0.91996, 4.84328e-05, 0, 0.0709879, 0.907419, 5.02146e-05, 0, 0.086861, 0.89618, 5.61654e-05, 0, 0.104415, 0.88337, 5.87612e-05, 0, 0.123643, 0.869046, 6.18057e-05, 0, 0.144531, 0.853278, 6.57392e-05, 0, 0.167057, 0.836091, 6.6303e-05, 0, 0.191188, 0.819644, 7.04445e-05, 0, 0.216878, 0.801246, 7.14071e-05, 0, 0.244062, 0.782031, 7.40093e-05, 0, 0.272649, 0.762066, 7.4685e-05, 0, 0.302509, 0.741964, 7.66647e-05, 0, 0.333442, 0.720554, 7.66328e-05, 0, 0.365079, 0.699098, 7.77857e-05, 0, 0.396826, 0.677189, 7.74633e-05, 0, 0.428572, 0.65484, 7.76235e-05, 0, 0.460318, 0.632496, 7.70316e-05, 0, 0.492064, 0.609908, 7.62669e-05, 0, 0.52381, 0.587312, 7.53972e-05, 0, 0.555556, 0.564938, 7.39994e-05, 0, 0.587302, 0.542577, 7.28382e-05, 0, 0.619048, 0.52062, 7.1112e-05, 0, 0.650794, 0.498819, 6.94004e-05, 0, 0.68254, 0.477555, 6.75575e-05, 0, 0.714286, 0.456568, 6.53449e-05, 0, 0.746032, 0.436278, 6.36068e-05, 0, 0.777778, 0.41637, 6.13466e-05, 0, 0.809524, 0.397144, 5.94177e-05, 0, 0.84127, 0.378412, 5.70987e-05, 0, 0.873016, 0.360376, 5.50419e-05, 0, 0.904762, 0.342906, 5.27422e-05, 0, 0.936508, 0.326136, 5.06544e-05, 0, 0.968254, 0.30997, 4.84307e-05, 0, 1, 1, 3.54014e-09, 0, 0, 1, 3.54073e-09, 0, 0, 1, 3.54972e-09, 0, 0, 1, 3.58929e-09, 0, 0, 1, 3.70093e-09, 0, 0, 0.999999, 3.96194e-09, 0, 0, 0.999998, 4.53352e-09, 0, 0, 0.999997, 5.78828e-09, 0, 0, 0.999994, 8.63812e-09, 0, 0, 0.999991, 1.53622e-08, 0, 0, 0.999985, 3.16356e-08, 0, 0, 0.999977, 7.12781e-08, 0, 0, 0.999964, 1.66725e-07, 0, 0, 0.999945, 3.90501e-07, 0, 0, 0.999912, 8.95622e-07, 0, 0, 0.999866, 1.98428e-06, 0, 0, 0.999786, 4.21038e-06, 0, 0, 0.999647, 8.50239e-06, 0, 0, 0.999356, 1.62059e-05, 0, 0, 0.998563, 2.82652e-05, 0, 0, 0.994928, 3.36309e-05, 0, 2.44244e-05, 0.987999, 1.78458e-05, 0, 0.000523891, 0.982893, 1.59162e-05, 0, 0.00194729, 0.977044, 1.78056e-05, 0, 0.00451099, 0.969972, 2.30624e-05, 0, 0.00835132, 0.964237, 3.13922e-05, 0, 0.013561, 0.960791, 4.06145e-05, 0, 0.0202056, 0.954292, 3.72796e-05, 0, 0.0283321, 0.948052, 4.03199e-05, 0, 0.0379739, 0.940938, 4.79537e-05, 0, 0.0491551, 0.931689, 5.45292e-05, 0, 0.0618918, 0.91987, 5.4038e-05, 0, 0.0761941, 0.907665, 5.89909e-05, 0, 0.0920672, 0.895281, 6.42651e-05, 0, 0.109511, 0.882621, 6.59707e-05, 0, 0.12852, 0.86873, 7.09973e-05, 0, 0.149085, 0.853008, 7.42221e-05, 0, 0.171189, 0.835944, 7.61754e-05, 0, 0.194809, 0.818949, 7.97052e-05, 0, 0.21991, 0.800951, 8.12434e-05, 0, 0.246447, 0.781847, 8.38075e-05, 0, 0.274352, 0.761649, 8.4501e-05, 0, 0.303535, 0.74152, 8.60258e-05, 0, 0.333857, 0.720495, 8.66233e-05, 0, 0.365104, 0.698742, 8.68326e-05, 0, 0.396826, 0.677096, 8.7133e-05, 0, 0.428572, 0.654782, 8.63497e-05, 0, 0.460318, 0.632335, 8.60206e-05, 0, 0.492064, 0.610031, 8.49337e-05, 0, 0.52381, 0.587457, 8.38279e-05, 0, 0.555556, 0.56513, 8.2309e-05, 0, 0.587302, 0.542877, 8.03542e-05, 0, 0.619048, 0.5209, 7.86928e-05, 0, 0.650794, 0.499291, 7.65171e-05, 0, 0.68254, 0.477971, 7.44753e-05, 0, 0.714286, 0.457221, 7.2209e-05, 0, 0.746032, 0.436803, 6.97448e-05, 0, 0.777778, 0.417083, 6.75333e-05, 0, 0.809524, 0.397749, 6.48058e-05, 0, 0.84127, 0.379177, 6.25759e-05, 0, 0.873016, 0.361061, 5.98584e-05, 0, 0.904762, 0.343713, 5.75797e-05, 0, 0.936508, 0.326894, 5.49999e-05, 0, 0.968254, 0.310816, 5.27482e-05, 0, 1, 1, 1.0153e-08, 0, 0, 1, 1.01544e-08, 0, 0, 1, 1.01751e-08, 0, 0, 1, 1.02662e-08, 0, 0, 1, 1.0521e-08, 0, 0, 0.999999, 1.11049e-08, 0, 0, 0.999999, 1.23408e-08, 0, 0, 0.999996, 1.4924e-08, 0, 0, 0.999992, 2.04471e-08, 0, 0, 0.999989, 3.26539e-08, 0, 0, 0.99998, 6.03559e-08, 0, 0, 0.999971, 1.23936e-07, 0, 0, 0.999955, 2.69058e-07, 0, 0, 0.999933, 5.93604e-07, 0, 0, 0.999901, 1.29633e-06, 0, 0, 0.999847, 2.75621e-06, 0, 0, 0.999761, 5.64494e-06, 0, 0, 0.999607, 1.10485e-05, 0, 0, 0.999282, 2.04388e-05, 0, 0, 0.99831, 3.41084e-05, 0, 2.2038e-07, 0.993288, 2.94949e-05, 0, 0.000242388, 0.987855, 1.92736e-05, 0, 0.0012503, 0.983167, 1.82383e-05, 0, 0.0032745, 0.977908, 2.18633e-05, 0, 0.00646321, 0.971194, 2.90662e-05, 0, 0.0109133, 0.963867, 3.86401e-05, 0, 0.0166927, 0.95982, 4.62827e-05, 0, 0.0238494, 0.953497, 4.20705e-05, 0, 0.0324178, 0.947621, 4.77743e-05, 0, 0.0424225, 0.940611, 5.68258e-05, 0, 0.0538808, 0.931174, 6.18061e-05, 0, 0.0668047, 0.919919, 6.27098e-05, 0, 0.0812014, 0.907856, 6.94714e-05, 0, 0.0970745, 0.894509, 7.35008e-05, 0, 0.114424, 0.881954, 7.63369e-05, 0, 0.133246, 0.868309, 8.21896e-05, 0, 0.153534, 0.852511, 8.3769e-05, 0, 0.175275, 0.835821, 8.81615e-05, 0, 0.198453, 0.817981, 8.96368e-05, 0, 0.223042, 0.800504, 9.30906e-05, 0, 0.249009, 0.78141, 9.45056e-05, 0, 0.276304, 0.761427, 9.63605e-05, 0, 0.304862, 0.74094, 9.68088e-05, 0, 0.334584, 0.720233, 9.81481e-05, 0, 0.365322, 0.698592, 9.79122e-05, 0, 0.396826, 0.676763, 9.81057e-05, 0, 0.428571, 0.654808, 9.73956e-05, 0, 0.460318, 0.632326, 9.62619e-05, 0, 0.492064, 0.610049, 9.52996e-05, 0, 0.52381, 0.58763, 9.33334e-05, 0, 0.555556, 0.565261, 9.17573e-05, 0, 0.587302, 0.543244, 8.96636e-05, 0, 0.619048, 0.521273, 8.73304e-05, 0, 0.650794, 0.499818, 8.52648e-05, 0, 0.68254, 0.478536, 8.23961e-05, 0, 0.714286, 0.457826, 7.9939e-05, 0, 0.746032, 0.437549, 7.7126e-05, 0, 0.777778, 0.41776, 7.43043e-05, 0, 0.809524, 0.39863, 7.16426e-05, 0, 0.84127, 0.379954, 6.86456e-05, 0, 0.873016, 0.362025, 6.60514e-05, 0, 0.904762, 0.344581, 6.30755e-05, 0, 0.936508, 0.327909, 6.05439e-05, 0, 0.968254, 0.311736, 5.76345e-05, 0, 1, 1, 2.63344e-08, 0, 0, 1, 2.63373e-08, 0, 0, 1, 2.63815e-08, 0, 0, 1, 2.65753e-08, 0, 0, 1, 2.71132e-08, 0, 0, 0.999999, 2.83279e-08, 0, 0, 0.999997, 3.0833e-08, 0, 0, 0.999995, 3.58711e-08, 0, 0, 0.999992, 4.61266e-08, 0, 0, 0.999985, 6.7574e-08, 0, 0, 0.999977, 1.1358e-07, 0, 0, 0.999966, 2.13657e-07, 0, 0, 0.999948, 4.31151e-07, 0, 0, 0.999923, 8.96656e-07, 0, 0, 0.999884, 1.86603e-06, 0, 0, 0.999826, 3.81115e-06, 0, 0, 0.999732, 7.54184e-06, 0, 0, 0.999561, 1.43192e-05, 0, 0, 0.999191, 2.57061e-05, 0, 0, 0.997955, 4.05724e-05, 0, 7.44132e-05, 0.992228, 2.76537e-05, 0, 0.000716477, 0.987638, 2.08885e-05, 0, 0.0022524, 0.983395, 2.15226e-05, 0, 0.00484816, 0.978614, 2.70795e-05, 0, 0.00860962, 0.972389, 3.65282e-05, 0, 0.0136083, 0.964392, 4.74747e-05, 0, 0.0198941, 0.95861, 5.09141e-05, 0, 0.0275023, 0.952806, 4.8963e-05, 0, 0.0364584, 0.94712, 5.71119e-05, 0, 0.04678, 0.940104, 6.71704e-05, 0, 0.0584799, 0.930398, 6.87586e-05, 0, 0.0715665, 0.919866, 7.38161e-05, 0, 0.086045, 0.907853, 8.13235e-05, 0, 0.101918, 0.894078, 8.34582e-05, 0, 0.119186, 0.881177, 8.92093e-05, 0, 0.137845, 0.867575, 9.44548e-05, 0, 0.157891, 0.852107, 9.69607e-05, 0, 0.179316, 0.835502, 0.000101456, 0, 0.202106, 0.81756, 0.000103256, 0, 0.226243, 0.79984, 0.000106954, 0, 0.251704, 0.780998, 0.000108066, 0, 0.278451, 0.761132, 0.000110111, 0, 0.306436, 0.740429, 0.000110459, 0, 0.335586, 0.719836, 0.000111219, 0, 0.365796, 0.698467, 0.00011145, 0, 0.3969, 0.676446, 0.000110393, 0, 0.428571, 0.654635, 0.000110035, 0, 0.460318, 0.632411, 0.000108548, 0, 0.492064, 0.609986, 0.000106963, 0, 0.52381, 0.587872, 0.000105238, 0, 0.555556, 0.565528, 0.000102665, 0, 0.587302, 0.543563, 0.000100543, 0, 0.619048, 0.52176, 9.76182e-05, 0, 0.650794, 0.500188, 9.47099e-05, 0, 0.68254, 0.479204, 9.19929e-05, 0, 0.714286, 0.458413, 8.86139e-05, 0, 0.746032, 0.438314, 8.57839e-05, 0, 0.777778, 0.418573, 8.2411e-05, 0, 0.809524, 0.39947, 7.92211e-05, 0, 0.84127, 0.380892, 7.59546e-05, 0, 0.873016, 0.362953, 7.27571e-05, 0, 0.904762, 0.345601, 6.95738e-05, 0, 0.936508, 0.328895, 6.64907e-05, 0, 0.968254, 0.312808, 6.34277e-05, 0, 1, 1, 6.28647e-08, 0, 0, 1, 6.28705e-08, 0, 0, 1, 6.29587e-08, 0, 0, 1, 6.33441e-08, 0, 0, 0.999999, 6.44087e-08, 0, 0, 0.999998, 6.67856e-08, 0, 0, 0.999997, 7.15889e-08, 0, 0, 0.999995, 8.09577e-08, 0, 0, 0.999989, 9.92764e-08, 0, 0, 0.999983, 1.35834e-07, 0, 0, 0.999974, 2.10482e-07, 0, 0, 0.999959, 3.65215e-07, 0, 0, 0.999939, 6.86693e-07, 0, 0, 0.999911, 1.3472e-06, 0, 0, 0.999868, 2.6731e-06, 0, 0, 0.999804, 5.24756e-06, 0, 0, 0.9997, 1.00403e-05, 0, 0, 0.99951, 1.85019e-05, 0, 0, 0.999078, 3.22036e-05, 0, 6.20676e-06, 0.997428, 4.70002e-05, 0, 0.000341552, 0.99162, 2.87123e-05, 0, 0.00143727, 0.987479, 2.34706e-05, 0, 0.00349201, 0.983582, 2.60083e-05, 0, 0.0066242, 0.979186, 3.37927e-05, 0, 0.0109113, 0.97325, 4.54689e-05, 0, 0.0164064, 0.965221, 5.73759e-05, 0, 0.0231463, 0.957262, 5.44114e-05, 0, 0.0311571, 0.952211, 5.87006e-05, 0, 0.0404572, 0.946631, 6.92256e-05, 0, 0.0510592, 0.939391, 7.87819e-05, 0, 0.0629723, 0.929795, 7.92368e-05, 0, 0.0762025, 0.91965, 8.75075e-05, 0, 0.090753, 0.907737, 9.50903e-05, 0, 0.106626, 0.893899, 9.72963e-05, 0, 0.123822, 0.880239, 0.00010459, 0, 0.142337, 0.866562, 0.000107689, 0, 0.16217, 0.85164, 0.000113081, 0, 0.183314, 0.835021, 0.000116636, 0, 0.20576, 0.817311, 0.000120074, 0, 0.229496, 0.798845, 0.000121921, 0, 0.254502, 0.780479, 0.00012475, 0, 0.280753, 0.760694, 0.000125255, 0, 0.308212, 0.740142, 0.000126719, 0, 0.336825, 0.719248, 0.00012636, 0, 0.366517, 0.698209, 0.000126712, 0, 0.397167, 0.676398, 0.000125769, 0, 0.428578, 0.654378, 0.000124432, 0, 0.460318, 0.632484, 0.000123272, 0, 0.492064, 0.610113, 0.00012085, 0, 0.52381, 0.587931, 0.000118411, 0, 0.555556, 0.565872, 0.00011569, 0, 0.587302, 0.543814, 0.000112521, 0, 0.619048, 0.522265, 0.000109737, 0, 0.650794, 0.500835, 0.000106228, 0, 0.68254, 0.479818, 0.000102591, 0, 0.714286, 0.459258, 9.91288e-05, 0, 0.746032, 0.439061, 9.52325e-05, 0, 0.777778, 0.419552, 9.1895e-05, 0, 0.809524, 0.400399, 8.79051e-05, 0, 0.84127, 0.381976, 8.44775e-05, 0, 0.873016, 0.364009, 8.06316e-05, 0, 0.904762, 0.346761, 7.71848e-05, 0, 0.936508, 0.330049, 7.35429e-05, 0, 0.968254, 0.314018, 7.02103e-05, 0, 1, 1, 1.39968e-07, 0, 0, 1, 1.39979e-07, 0, 0, 1, 1.40145e-07, 0, 0, 1, 1.4087e-07, 0, 0, 0.999999, 1.42865e-07, 0, 0, 0.999998, 1.47279e-07, 0, 0, 0.999997, 1.56057e-07, 0, 0, 0.999992, 1.7276e-07, 0, 0, 0.999989, 2.04352e-07, 0, 0, 0.99998, 2.6494e-07, 0, 0, 0.999969, 3.83435e-07, 0, 0, 0.999953, 6.18641e-07, 0, 0, 0.999929, 1.08755e-06, 0, 0, 0.999898, 2.01497e-06, 0, 0, 0.999849, 3.81346e-06, 0, 0, 0.999778, 7.19815e-06, 0, 0, 0.999661, 1.33215e-05, 0, 0, 0.999451, 2.38313e-05, 0, 0, 0.998936, 4.01343e-05, 0, 0.000113724, 0.99662, 5.17346e-05, 0, 0.000820171, 0.991094, 3.04323e-05, 0, 0.00238143, 0.987487, 2.81757e-05, 0, 0.00493527, 0.983731, 3.20048e-05, 0, 0.00856859, 0.979647, 4.23905e-05, 0, 0.0133393, 0.973837, 5.62935e-05, 0, 0.0192863, 0.96584, 6.77442e-05, 0, 0.0264369, 0.956309, 6.23073e-05, 0, 0.03481, 0.951523, 7.04131e-05, 0, 0.0444184, 0.946003, 8.36594e-05, 0, 0.0552713, 0.938454, 9.11736e-05, 0, 0.0673749, 0.929279, 9.38264e-05, 0, 0.0807329, 0.919239, 0.000103754, 0, 0.0953479, 0.907293, 0.000109928, 0, 0.111221, 0.893936, 0.000115257, 0, 0.128352, 0.879674, 0.000122265, 0, 0.14674, 0.865668, 0.000125733, 0, 0.166382, 0.850998, 0.000132305, 0, 0.187276, 0.834498, 0.000134844, 0, 0.209413, 0.816903, 0.000139276, 0, 0.232786, 0.798235, 0.000140984, 0, 0.257382, 0.779724, 0.00014378, 0, 0.283181, 0.760251, 0.000144623, 0, 0.310156, 0.739808, 0.000145228, 0, 0.338269, 0.718762, 0.00014539, 0, 0.367461, 0.697815, 0.000144432, 0, 0.397646, 0.67631, 0.000143893, 0, 0.428685, 0.654278, 0.000141846, 0, 0.460318, 0.632347, 0.00013935, 0, 0.492064, 0.610296, 0.000137138, 0, 0.52381, 0.588039, 0.000133806, 0, 0.555556, 0.566218, 0.000130755, 0, 0.587302, 0.544346, 0.000127128, 0, 0.619048, 0.522701, 0.000123002, 0, 0.650794, 0.501542, 0.000119443, 0, 0.68254, 0.480508, 0.000115055, 0, 0.714286, 0.460092, 0.000111032, 0, 0.746032, 0.440021, 0.000106635, 0, 0.777778, 0.420446, 0.000102162, 0, 0.809524, 0.401512, 9.8184e-05, 0, 0.84127, 0.38299, 9.36497e-05, 0, 0.873016, 0.365232, 8.9813e-05, 0, 0.904762, 0.347865, 8.53073e-05, 0, 0.936508, 0.331342, 8.17068e-05, 0, 0.968254, 0.315202, 7.73818e-05, 0, 1, 1, 2.9368e-07, 0, 0, 1, 2.937e-07, 0, 0, 1, 2.93998e-07, 0, 0, 1, 2.95298e-07, 0, 0, 0.999999, 2.98865e-07, 0, 0, 0.999998, 3.067e-07, 0, 0, 0.999995, 3.22082e-07, 0, 0, 0.999992, 3.50767e-07, 0, 0, 0.999986, 4.03538e-07, 0, 0, 0.999976, 5.01372e-07, 0, 0, 0.999964, 6.8562e-07, 0, 0, 0.999945, 1.0374e-06, 0, 0, 0.999919, 1.71269e-06, 0, 0, 0.999882, 3.00175e-06, 0, 0, 0.999829, 5.42144e-06, 0, 0, 0.999749, 9.84182e-06, 0, 0, 0.99962, 1.76213e-05, 0, 0, 0.999382, 3.05995e-05, 0, 1.38418e-05, 0.998751, 4.96686e-05, 0, 0.000389844, 0.995344, 5.10733e-05, 0, 0.00150343, 0.990768, 3.45829e-05, 0, 0.00352451, 0.987464, 3.42841e-05, 0, 0.00655379, 0.983846, 3.99072e-05, 0, 0.0106554, 0.980007, 5.33219e-05, 0, 0.0158723, 0.974494, 6.96992e-05, 0, 0.0222333, 0.96622, 7.76754e-05, 0, 0.029758, 0.956273, 7.47718e-05, 0, 0.0384596, 0.950952, 8.64611e-05, 0, 0.0483473, 0.945215, 0.000100464, 0, 0.0594266, 0.937287, 0.000103729, 0, 0.0717019, 0.928649, 0.000111665, 0, 0.0851752, 0.918791, 0.00012353, 0, 0.0998479, 0.906685, 0.000127115, 0, 0.115721, 0.893706, 0.00013628, 0, 0.132794, 0.879248, 0.000142427, 0, 0.151067, 0.864685, 0.000148091, 0, 0.170538, 0.850032, 0.000153517, 0, 0.191204, 0.833853, 0.000157322, 0, 0.213063, 0.816353, 0.000161086, 0, 0.236107, 0.797834, 0.000164111, 0, 0.260329, 0.778831, 0.000165446, 0, 0.285714, 0.759756, 0.000167492, 0, 0.312243, 0.739419, 0.000166928, 0, 0.339887, 0.718491, 0.000167, 0, 0.368604, 0.697392, 0.000165674, 0, 0.398329, 0.676102, 0.000163815, 0, 0.428961, 0.654243, 0.000162003, 0, 0.460331, 0.632176, 0.000158831, 0, 0.492064, 0.610407, 0.000155463, 0, 0.52381, 0.588394, 0.000152062, 0, 0.555556, 0.56645, 0.000147665, 0, 0.587302, 0.5449, 0.00014375, 0, 0.619048, 0.523276, 0.000138905, 0, 0.650794, 0.502179, 0.000134189, 0, 0.68254, 0.481359, 0.000129392, 0, 0.714286, 0.46092, 0.000124556, 0, 0.746032, 0.441084, 0.00011957, 0, 0.777778, 0.421517, 0.000114652, 0, 0.809524, 0.402721, 0.000109688, 0, 0.84127, 0.384222, 0.000104667, 0, 0.873016, 0.366534, 9.99633e-05, 0, 0.904762, 0.349205, 9.50177e-05, 0, 0.936508, 0.332702, 9.07301e-05, 0, 0.968254, 0.316599, 8.59769e-05, 0, 1, 1, 5.85473e-07, 0, 0, 1, 5.85507e-07, 0, 0, 1, 5.8602e-07, 0, 0, 0.999999, 5.88259e-07, 0, 0, 0.999999, 5.94381e-07, 0, 0, 0.999998, 6.07754e-07, 0, 0, 0.999995, 6.33729e-07, 0, 0, 0.99999, 6.8137e-07, 0, 0, 0.999984, 7.67003e-07, 0, 0, 0.999973, 9.21212e-07, 0, 0, 0.999959, 1.20218e-06, 0, 0, 0.999936, 1.72024e-06, 0, 0, 0.999907, 2.68088e-06, 0, 0, 0.999866, 4.45512e-06, 0, 0, 0.999806, 7.68481e-06, 0, 0, 0.999716, 1.342e-05, 0, 0, 0.999576, 2.32473e-05, 0, 0, 0.9993, 3.91694e-05, 0, 0.000129917, 0.998498, 6.08429e-05, 0, 0.000845035, 0.994132, 4.89743e-05, 0, 0.00237616, 0.99031, 3.84644e-05, 0, 0.00484456, 0.987409, 4.21768e-05, 0, 0.00832472, 0.983981, 5.04854e-05, 0, 0.0128643, 0.980268, 6.71028e-05, 0, 0.0184947, 0.974875, 8.52749e-05, 0, 0.025237, 0.966063, 8.5531e-05, 0, 0.0331046, 0.956779, 9.00588e-05, 0, 0.0421067, 0.950259, 0.00010577, 0, 0.0522487, 0.944239, 0.000119458, 0, 0.0635343, 0.936341, 0.000122164, 0, 0.0759654, 0.928047, 0.000134929, 0, 0.0895434, 0.918065, 0.000145544, 0, 0.104269, 0.906267, 0.000150531, 0, 0.120142, 0.893419, 0.000161652, 0, 0.137163, 0.878758, 0.00016593, 0, 0.15533, 0.863699, 0.000174014, 0, 0.174645, 0.848876, 0.000177877, 0, 0.195106, 0.833032, 0.000184049, 0, 0.21671, 0.815557, 0.000186088, 0, 0.239454, 0.797323, 0.00019054, 0, 0.263332, 0.778124, 0.000191765, 0, 0.288336, 0.758929, 0.000192535, 0, 0.314451, 0.738979, 0.000192688, 0, 0.341658, 0.718213, 0.000191522, 0, 0.369924, 0.696947, 0.000190491, 0, 0.399202, 0.675807, 0.000187913, 0, 0.429416, 0.654147, 0.000184451, 0, 0.460447, 0.63229, 0.000181442, 0, 0.492064, 0.610499, 0.000177139, 0, 0.523809, 0.588747, 0.000172596, 0, 0.555555, 0.566783, 0.000167457, 0, 0.587301, 0.545359, 0.000162518, 0, 0.619048, 0.523984, 0.000156818, 0, 0.650794, 0.502917, 0.000151884, 0, 0.68254, 0.482294, 0.000145514, 0, 0.714286, 0.461945, 0.000140199, 0, 0.746032, 0.442133, 0.000134101, 0, 0.777778, 0.422705, 0.000128374, 0, 0.809524, 0.403916, 0.000122996, 0, 0.84127, 0.38554, 0.000116808, 0, 0.873016, 0.367909, 0.000111973, 0, 0.904762, 0.350651, 0.000105938, 0, 0.936508, 0.334208, 0.000101355, 0, 0.968254, 0.318123, 9.57629e-05, 0, 1, 1, 1.11633e-06, 0, 0, 1, 1.11639e-06, 0, 0, 1, 1.11725e-06, 0, 0, 1, 1.12096e-06, 0, 0, 0.999999, 1.1311e-06, 0, 0, 0.999997, 1.15315e-06, 0, 0, 0.999995, 1.1956e-06, 0, 0, 0.999989, 1.27239e-06, 0, 0, 0.999981, 1.40772e-06, 0, 0, 0.999969, 1.64541e-06, 0, 0, 0.999952, 2.06607e-06, 0, 0, 0.999928, 2.81783e-06, 0, 0, 0.999895, 4.16835e-06, 0, 0, 0.999848, 6.58728e-06, 0, 0, 0.999781, 1.08648e-05, 0, 0, 0.999682, 1.82579e-05, 0, 0, 0.999523, 3.06003e-05, 0, 1.59122e-05, 0.999205, 4.99862e-05, 0, 0.000391184, 0.998131, 7.3306e-05, 0, 0.00147534, 0.993334, 5.13229e-05, 0, 0.0034227, 0.99016, 4.67783e-05, 0, 0.00632232, 0.987321, 5.23413e-05, 0, 0.0102295, 0.984099, 6.4267e-05, 0, 0.0151794, 0.980432, 8.43042e-05, 0, 0.0211947, 0.974976, 0.000102819, 0, 0.0282899, 0.966429, 9.96234e-05, 0, 0.0364739, 0.957633, 0.000111074, 0, 0.0457522, 0.949422, 0.000128644, 0, 0.0561278, 0.943045, 0.000140076, 0, 0.0676023, 0.935448, 0.000146349, 0, 0.0801762, 0.927225, 0.000161854, 0, 0.0938499, 0.917033, 0.000169135, 0, 0.108623, 0.905762, 0.000179987, 0, 0.124496, 0.892879, 0.000189832, 0, 0.141469, 0.878435, 0.000195881, 0, 0.159541, 0.863114, 0.00020466, 0, 0.178713, 0.84776, 0.000209473, 0, 0.198985, 0.832084, 0.000214861, 0, 0.220355, 0.814915, 0.000217695, 0, 0.242823, 0.796711, 0.000220313, 0, 0.266385, 0.777603, 0.00022313, 0, 0.291036, 0.757991, 0.000222471, 0, 0.316767, 0.738371, 0.000222869, 0, 0.343563, 0.717872, 0.000221243, 0, 0.371402, 0.696619, 0.000218089, 0, 0.400248, 0.675379, 0.00021562, 0, 0.430047, 0.65411, 0.00021169, 0, 0.460709, 0.63241, 0.000206947, 0, 0.492079, 0.61046, 0.000201709, 0, 0.52381, 0.58903, 0.000196753, 0, 0.555556, 0.567267, 0.000189637, 0, 0.587302, 0.545886, 0.000184735, 0, 0.619048, 0.524714, 0.000177257, 0, 0.650794, 0.503789, 0.000171424, 0, 0.68254, 0.483204, 0.000164688, 0, 0.714286, 0.462976, 0.000157172, 0, 0.746032, 0.443294, 0.000151341, 0, 0.777778, 0.423988, 0.000143737, 0, 0.809524, 0.405325, 0.000138098, 0, 0.84127, 0.386981, 0.000130698, 0, 0.873016, 0.369436, 0.000125276, 0, 0.904762, 0.35219, 0.000118349, 0, 0.936508, 0.335804, 0.00011312, 0, 0.968254, 0.319749, 0.000106687, 0, 1, 1, 2.04685e-06, 0, 0, 1, 2.04694e-06, 0, 0, 1, 2.04831e-06, 0, 0, 0.999999, 2.05428e-06, 0, 0, 0.999999, 2.07056e-06, 0, 0, 0.999997, 2.10581e-06, 0, 0, 0.999993, 2.1732e-06, 0, 0, 0.999987, 2.29365e-06, 0, 0, 0.999979, 2.50243e-06, 0, 0, 0.999965, 2.86127e-06, 0, 0, 0.999947, 3.48028e-06, 0, 0, 0.999918, 4.55588e-06, 0, 0, 0.999881, 6.43303e-06, 0, 0, 0.999828, 9.70064e-06, 0, 0, 0.999753, 1.53233e-05, 0, 0, 0.999642, 2.4793e-05, 0, 0, 0.999464, 4.02032e-05, 0, 0.000122947, 0.999089, 6.35852e-05, 0, 0.000807414, 0.997567, 8.57026e-05, 0, 0.00227206, 0.992903, 5.94912e-05, 0, 0.00462812, 0.990011, 5.78515e-05, 0, 0.00794162, 0.987192, 6.5399e-05, 0, 0.0122534, 0.98418, 8.19675e-05, 0, 0.0175888, 0.980491, 0.000105514, 0, 0.0239635, 0.974779, 0.000121532, 0, 0.031387, 0.96675, 0.000119144, 0, 0.0398644, 0.958248, 0.000136125, 0, 0.0493982, 0.948884, 0.000155408, 0, 0.0599896, 0.941673, 0.000162281, 0, 0.0716382, 0.934521, 0.000176754, 0, 0.0843437, 0.926205, 0.000192873, 0, 0.0981056, 0.916089, 0.000200038, 0, 0.112923, 0.904963, 0.000213624, 0, 0.128796, 0.892089, 0.000221834, 0, 0.145725, 0.878028, 0.000232619, 0, 0.163709, 0.86249, 0.000238632, 0, 0.182749, 0.846587, 0.000247002, 0, 0.202847, 0.830988, 0.000250702, 0, 0.224001, 0.814165, 0.000255562, 0, 0.246214, 0.796135, 0.000257505, 0, 0.269482, 0.777052, 0.000258625, 0, 0.293805, 0.757201, 0.000258398, 0, 0.319176, 0.737655, 0.000256714, 0, 0.345587, 0.717477, 0.000255187, 0, 0.373021, 0.696433, 0.000251792, 0, 0.401454, 0.675084, 0.000247223, 0, 0.430844, 0.653907, 0.000242213, 0, 0.461125, 0.632561, 0.000237397, 0, 0.492187, 0.610658, 0.000229313, 0, 0.52381, 0.589322, 0.000224402, 0, 0.555556, 0.567857, 0.000216116, 0, 0.587302, 0.54652, 0.000209124, 0, 0.619048, 0.525433, 0.000201601, 0, 0.650794, 0.504679, 0.000192957, 0, 0.68254, 0.484203, 0.000186052, 0, 0.714286, 0.464203, 0.000177672, 0, 0.746032, 0.444549, 0.000170005, 0, 0.777778, 0.425346, 0.000162401, 0, 0.809524, 0.406706, 0.0001544, 0, 0.84127, 0.388576, 0.000147437, 0, 0.873016, 0.37094, 0.000139493, 0, 0.904762, 0.353996, 0.000133219, 0, 0.936508, 0.337391, 0.000125573, 0, 0.968254, 0.321648, 0.000119867, 0, 1, 1, 3.62511e-06, 0, 0, 1, 3.62525e-06, 0, 0, 1, 3.62739e-06, 0, 0, 0.999999, 3.63673e-06, 0, 0, 0.999998, 3.66214e-06, 0, 0, 0.999996, 3.71698e-06, 0, 0, 0.999992, 3.82116e-06, 0, 0, 0.999986, 4.00554e-06, 0, 0, 0.999976, 4.32058e-06, 0, 0, 0.999961, 4.85194e-06, 0, 0, 0.999938, 5.74808e-06, 0, 0, 0.999908, 7.26643e-06, 0, 0, 0.999865, 9.84707e-06, 0, 0, 0.999807, 1.42217e-05, 0, 0, 0.999723, 2.15581e-05, 0, 0, 0.999602, 3.36114e-05, 0, 1.19113e-05, 0.999398, 5.27353e-05, 0, 0.000355813, 0.998946, 8.05809e-05, 0, 0.00137768, 0.996647, 9.42908e-05, 0, 0.00322469, 0.992298, 6.68733e-05, 0, 0.00597897, 0.989802, 7.16564e-05, 0, 0.00968903, 0.987019, 8.21355e-05, 0, 0.0143845, 0.984219, 0.000104555, 0, 0.0200831, 0.980425, 0.000131245, 0, 0.0267948, 0.974241, 0.000139613, 0, 0.034525, 0.967006, 0.000145931, 0, 0.0432757, 0.95893, 0.000167153, 0, 0.0530471, 0.949157, 0.000188146, 0, 0.0638386, 0.94062, 0.000194625, 0, 0.0756487, 0.933509, 0.000213721, 0, 0.0884762, 0.925088, 0.000229616, 0, 0.10232, 0.915178, 0.000239638, 0, 0.117178, 0.904093, 0.000254814, 0, 0.133051, 0.891337, 0.000263685, 0, 0.149939, 0.877326, 0.000274789, 0, 0.167841, 0.861794, 0.000280534, 0, 0.18676, 0.845758, 0.000289534, 0, 0.206696, 0.829792, 0.000294446, 0, 0.22765, 0.813037, 0.000296877, 0, 0.249625, 0.795285, 0.000300217, 0, 0.27262, 0.776323, 0.000299826, 0, 0.296636, 0.756673, 0.000299787, 0, 0.321671, 0.736856, 0.000297867, 0, 0.347718, 0.716883, 0.000294052, 0, 0.374768, 0.696089, 0.000289462, 0, 0.402804, 0.67505, 0.000285212, 0, 0.431796, 0.653509, 0.00027653, 0, 0.461695, 0.63258, 0.000271759, 0, 0.49242, 0.61104, 0.000262811, 0, 0.523822, 0.589567, 0.000255151, 0, 0.555556, 0.568322, 0.000246434, 0, 0.587302, 0.547235, 0.000237061, 0, 0.619048, 0.52616, 0.000228343, 0, 0.650794, 0.505716, 0.000219236, 0, 0.68254, 0.485274, 0.000209595, 0, 0.714286, 0.465411, 0.000201011, 0, 0.746032, 0.445854, 0.00019109, 0, 0.777778, 0.426911, 0.000182897, 0, 0.809524, 0.408222, 0.000173569, 0, 0.84127, 0.390307, 0.000165496, 0, 0.873016, 0.372624, 0.000156799, 0, 0.904762, 0.355804, 0.00014917, 0, 0.936508, 0.33924, 0.000140907, 0, 0.968254, 0.323534, 0.000134062, 0, 1, 1, 6.22487e-06, 0, 0, 1, 6.2251e-06, 0, 0, 1, 6.22837e-06, 0, 0, 0.999999, 6.24259e-06, 0, 0, 0.999998, 6.28127e-06, 0, 0, 0.999996, 6.36451e-06, 0, 0, 0.999991, 6.5218e-06, 0, 0, 0.999984, 6.79782e-06, 0, 0, 0.999973, 7.26361e-06, 0, 0, 0.999955, 8.03644e-06, 0, 0, 0.999931, 9.31397e-06, 0, 0, 0.999896, 1.14299e-05, 0, 0, 0.999847, 1.49402e-05, 0, 0, 0.999784, 2.07461e-05, 0, 0, 0.999692, 3.02493e-05, 0, 0, 0.999554, 4.54957e-05, 0, 9.97275e-05, 0.999326, 6.90762e-05, 0, 0.000724813, 0.998757, 0.000101605, 0, 0.0020972, 0.995367, 9.58745e-05, 0, 0.00432324, 0.99209, 8.32808e-05, 0, 0.00746347, 0.989517, 8.87601e-05, 0, 0.0115534, 0.987008, 0.00010564, 0, 0.0166134, 0.98421, 0.000133179, 0, 0.0226552, 0.98021, 0.000161746, 0, 0.0296838, 0.973676, 0.000161821, 0, 0.0377016, 0.967052, 0.000178635, 0, 0.0467079, 0.959385, 0.000206765, 0, 0.0567013, 0.949461, 0.00022476, 0, 0.0676796, 0.939578, 0.00023574, 0, 0.0796403, 0.932416, 0.00025893, 0, 0.0925812, 0.923759, 0.000271228, 0, 0.106501, 0.914223, 0.000289165, 0, 0.121397, 0.902942, 0.000301156, 0, 0.13727, 0.890419, 0.000313852, 0, 0.15412, 0.876639, 0.000324408, 0, 0.171946, 0.861316, 0.00033249, 0, 0.190751, 0.84496, 0.000338497, 0, 0.210537, 0.828427, 0.000345861, 0, 0.231305, 0.811871, 0.000347863, 0, 0.253057, 0.794397, 0.000350225, 0, 0.275797, 0.775726, 0.000349915, 0, 0.299525, 0.75617, 0.000347297, 0, 0.324242, 0.736091, 0.000344232, 0, 0.349947, 0.716213, 0.000340835, 0, 0.376633, 0.695736, 0.000332369, 0, 0.404289, 0.674961, 0.000327943, 0, 0.432895, 0.653518, 0.000318533, 0, 0.462415, 0.632574, 0.000310391, 0, 0.492788, 0.61134, 0.000300755, 0, 0.523909, 0.590017, 0.000290506, 0, 0.555556, 0.568752, 0.000280446, 0, 0.587302, 0.548061, 0.000269902, 0, 0.619048, 0.52711, 0.000258815, 0, 0.650794, 0.506682, 0.000248481, 0, 0.68254, 0.486524, 0.000237141, 0, 0.714286, 0.466812, 0.000226872, 0, 0.746032, 0.44732, 0.000216037, 0, 0.777778, 0.428473, 0.000205629, 0, 0.809524, 0.409921, 0.000195691, 0, 0.84127, 0.392028, 0.000185457, 0, 0.873016, 0.374606, 0.000176436, 0, 0.904762, 0.357601, 0.000166508, 0, 0.936508, 0.341348, 0.000158385, 0, 0.968254, 0.32542, 0.000149203, 0, 1, 1, 1.03967e-05, 0, 0, 1, 1.0397e-05, 0, 0, 1, 1.04019e-05, 0, 0, 0.999999, 1.04231e-05, 0, 0, 0.999998, 1.04806e-05, 0, 0, 0.999995, 1.06042e-05, 0, 0, 0.999991, 1.08366e-05, 0, 0, 0.999982, 1.12415e-05, 0, 0, 0.999968, 1.19174e-05, 0, 0, 0.99995, 1.30227e-05, 0, 0, 0.999922, 1.48176e-05, 0, 0, 0.999884, 1.77303e-05, 0, 0, 0.99983, 2.24564e-05, 0, 0, 0.999758, 3.00966e-05, 0, 0, 0.999654, 4.23193e-05, 0, 5.49083e-06, 0.999503, 6.14848e-05, 0, 0.000296087, 0.999237, 9.03576e-05, 0, 0.00123144, 0.998491, 0.0001271, 0, 0.00295954, 0.994594, 0.000107754, 0, 0.00555829, 0.99178, 0.000103025, 0, 0.00907209, 0.989265, 0.00011154, 0, 0.0135257, 0.986998, 0.000136296, 0, 0.0189327, 0.984137, 0.000169154, 0, 0.0252993, 0.979798, 0.000196671, 0, 0.0326272, 0.97337, 0.000196678, 0, 0.0409157, 0.967239, 0.000223121, 0, 0.0501623, 0.959543, 0.000253809, 0, 0.0603638, 0.949466, 0.000265972, 0, 0.0715171, 0.939074, 0.000288372, 0, 0.0836187, 0.931118, 0.000310983, 0, 0.0966657, 0.922525, 0.000325561, 0, 0.110656, 0.912983, 0.000345725, 0, 0.125588, 0.901617, 0.0003556, 0, 0.141461, 0.889487, 0.000374012, 0, 0.158275, 0.875787, 0.000383445, 0, 0.176031, 0.860654, 0.000393972, 0, 0.19473, 0.844417, 0.000400311, 0, 0.214374, 0.82741, 0.000405004, 0, 0.234967, 0.810545, 0.000407378, 0, 0.256512, 0.793312, 0.000407351, 0, 0.279011, 0.774847, 0.000406563, 0, 0.302468, 0.755621, 0.000404903, 0, 0.326887, 0.735511, 0.000397486, 0, 0.352266, 0.715435, 0.00039357, 0, 0.378605, 0.695403, 0.000384739, 0, 0.405897, 0.674681, 0.000376108, 0, 0.43413, 0.65359, 0.000365997, 0, 0.463277, 0.632471, 0.000354957, 0, 0.493295, 0.61151, 0.000343593, 0, 0.524106, 0.59064, 0.000331841, 0, 0.555561, 0.569386, 0.000318891, 0, 0.587302, 0.548785, 0.0003072, 0, 0.619048, 0.528146, 0.00029361, 0, 0.650794, 0.507872, 0.000281709, 0, 0.68254, 0.487805, 0.000268627, 0, 0.714286, 0.468196, 0.000255887, 0, 0.746032, 0.448922, 0.000243997, 0, 0.777778, 0.430093, 0.000231662, 0, 0.809524, 0.411845, 0.000220339, 0, 0.84127, 0.393808, 0.000208694, 0, 0.873016, 0.376615, 0.000198045, 0, 0.904762, 0.359655, 0.000187375, 0, 0.936508, 0.343452, 0.000177371, 0, 0.968254, 0.32765, 0.000167525, 0, 1, 1, 1.69351e-05, 0, 0, 1, 1.69356e-05, 0, 0, 1, 1.69427e-05, 0, 0, 0.999999, 1.69736e-05, 0, 0, 0.999998, 1.70575e-05, 0, 0, 0.999995, 1.72372e-05, 0, 0, 0.99999, 1.75739e-05, 0, 0, 0.999979, 1.81568e-05, 0, 0, 0.999966, 1.91206e-05, 0, 0, 0.999944, 2.0677e-05, 0, 0, 0.999912, 2.31644e-05, 0, 0, 0.999869, 2.71268e-05, 0, 0, 0.999811, 3.34272e-05, 0, 0, 0.99973, 4.33979e-05, 0, 0, 0.999617, 5.90083e-05, 0, 6.80315e-05, 0.999445, 8.29497e-05, 0, 0.000612796, 0.999138, 0.000118019, 0, 0.00187408, 0.998095, 0.000156712, 0, 0.00395791, 0.993919, 0.000125054, 0, 0.00692144, 0.991333, 0.000126091, 0, 0.0107962, 0.989226, 0.000144912, 0, 0.0155986, 0.986954, 0.000175737, 0, 0.0213364, 0.983982, 0.000213883, 0, 0.0280114, 0.979128, 0.000234526, 0, 0.0356226, 0.973327, 0.000243725, 0, 0.0441668, 0.967416, 0.0002773, 0, 0.0536399, 0.959729, 0.000308799, 0, 0.0640376, 0.949758, 0.000322447, 0, 0.0753554, 0.939173, 0.000350021, 0, 0.0875893, 0.9296, 0.000370089, 0, 0.100736, 0.921181, 0.000391365, 0, 0.114793, 0.91164, 0.000413636, 0, 0.129759, 0.900435, 0.000427068, 0, 0.145632, 0.888183, 0.000441046, 0, 0.162412, 0.874772, 0.000454968, 0, 0.180101, 0.859566, 0.000461882, 0, 0.1987, 0.843579, 0.000471556, 0, 0.218213, 0.826453, 0.000474335, 0, 0.238641, 0.809164, 0.000477078, 0, 0.259989, 0.792179, 0.00047755, 0, 0.282262, 0.773866, 0.000472573, 0, 0.305464, 0.754944, 0.000469765, 0, 0.329599, 0.735133, 0.000462371, 0, 0.35467, 0.714858, 0.000453674, 0, 0.380678, 0.694829, 0.000443888, 0, 0.407622, 0.674453, 0.000432052, 0, 0.435493, 0.653685, 0.000420315, 0, 0.464275, 0.632666, 0.000406829, 0, 0.493938, 0.611676, 0.000392234, 0, 0.524422, 0.591193, 0.000379208, 0, 0.555624, 0.570145, 0.00036319, 0, 0.587302, 0.549566, 0.000349111, 0, 0.619048, 0.529278, 0.000334166, 0, 0.650794, 0.509026, 0.000318456, 0, 0.68254, 0.489186, 0.00030449, 0, 0.714286, 0.469662, 0.000289051, 0, 0.746032, 0.450691, 0.000275494, 0, 0.777778, 0.431841, 0.000261437, 0, 0.809524, 0.413752, 0.000247846, 0, 0.84127, 0.395951, 0.000235085, 0, 0.873016, 0.378633, 0.000222245, 0, 0.904762, 0.36194, 0.000210533, 0, 0.936508, 0.345599, 0.000198494, 0, 0.968254, 0.329999, 0.000188133, 0, 1, 1, 2.69663e-05, 0, 0, 1, 2.6967e-05, 0, 0, 1, 2.69772e-05, 0, 0, 0.999999, 2.70214e-05, 0, 0, 0.999998, 2.71415e-05, 0, 0, 0.999994, 2.7398e-05, 0, 0, 0.999988, 2.78771e-05, 0, 0, 0.999977, 2.87019e-05, 0, 0, 0.999961, 3.00544e-05, 0, 0, 0.999937, 3.22138e-05, 0, 0, 0.999904, 3.56163e-05, 0, 0, 0.999854, 4.09465e-05, 0, 0, 0.99979, 4.92651e-05, 0, 0, 0.999699, 6.21722e-05, 0, 8.8288e-07, 0.999572, 8.19715e-05, 0, 0.000223369, 0.999381, 0.000111689, 0, 0.00105414, 0.999016, 0.000153862, 0, 0.0026493, 0.997437, 0.000187667, 0, 0.00508608, 0.993545, 0.000155672, 0, 0.00840554, 0.991135, 0.000161455, 0, 0.012629, 0.989157, 0.000188241, 0, 0.0177661, 0.986874, 0.000226229, 0, 0.0238198, 0.983714, 0.000268668, 0, 0.0307887, 0.978301, 0.000277109, 0, 0.0386688, 0.973227, 0.000303446, 0, 0.0474554, 0.967317, 0.000341851, 0, 0.0571428, 0.959477, 0.000370885, 0, 0.0677256, 0.950012, 0.000392753, 0, 0.0791988, 0.939484, 0.00042781, 0, 0.0915576, 0.928135, 0.000443866, 0, 0.104798, 0.919819, 0.000472959, 0, 0.118918, 0.910049, 0.000491551, 0, 0.133915, 0.899181, 0.000512616, 0, 0.149788, 0.886881, 0.000523563, 0, 0.166537, 0.87359, 0.000540183, 0, 0.184164, 0.858613, 0.000547386, 0, 0.202669, 0.842809, 0.000554809, 0, 0.222056, 0.825727, 0.000558316, 0, 0.242329, 0.808086, 0.000557824, 0, 0.263492, 0.790728, 0.000556346, 0, 0.285551, 0.772987, 0.000552672, 0, 0.30851, 0.7541, 0.000543738, 0, 0.332376, 0.734669, 0.000536107, 0, 0.357153, 0.714411, 0.000523342, 0, 0.382845, 0.694196, 0.000512238, 0, 0.409454, 0.674252, 0.000497465, 0, 0.436977, 0.65357, 0.000481096, 0, 0.465404, 0.632999, 0.000467054, 0, 0.494713, 0.611994, 0.000448771, 0, 0.524864, 0.591604, 0.000431889, 0, 0.555779, 0.571134, 0.000415238, 0, 0.587302, 0.550528, 0.000396369, 0, 0.619048, 0.530292, 0.000379477, 0, 0.650794, 0.510364, 0.000361488, 0, 0.68254, 0.490749, 0.000343787, 0, 0.714286, 0.471266, 0.000327822, 0, 0.746032, 0.452462, 0.000310626, 0, 0.777778, 0.433907, 0.000295352, 0, 0.809524, 0.415659, 0.000279179, 0, 0.84127, 0.398138, 0.000264685, 0, 0.873016, 0.380833, 0.000249905, 0, 0.904762, 0.364247, 0.000236282, 0, 0.936508, 0.348041, 0.000222905, 0, 0.968254, 0.332389, 0.000210522, 0, 1, 1, 4.20604e-05, 0, 0, 1, 4.20614e-05, 0, 0, 1, 4.20757e-05, 0, 0, 0.999999, 4.2138e-05, 0, 0, 0.999997, 4.23067e-05, 0, 0, 0.999993, 4.26668e-05, 0, 0, 0.999986, 4.33372e-05, 0, 0, 0.999974, 4.44857e-05, 0, 0, 0.999956, 4.63554e-05, 0, 0, 0.99993, 4.93105e-05, 0, 0, 0.999892, 5.39077e-05, 0, 0, 0.999838, 6.10005e-05, 0, 0, 0.999767, 7.18822e-05, 0, 0, 0.999666, 8.84581e-05, 0, 3.65471e-05, 0.999525, 0.000113398, 0, 0.000485623, 0.999311, 0.000150043, 0, 0.00162096, 0.998865, 0.000200063, 0, 0.00355319, 0.996278, 0.000211014, 0, 0.00633818, 0.992956, 0.000189672, 0, 0.0100043, 0.991017, 0.000210262, 0, 0.0145648, 0.989055, 0.000244292, 0, 0.0200237, 0.986741, 0.000290481, 0, 0.0263798, 0.983288, 0.000334303, 0, 0.033629, 0.977784, 0.000340307, 0, 0.0417652, 0.973037, 0.000377864, 0, 0.0507821, 0.967181, 0.0004239, 0, 0.060673, 0.958971, 0.000443854, 0, 0.0714314, 0.950093, 0.000483039, 0, 0.0830518, 0.939552, 0.000517934, 0, 0.0955288, 0.927678, 0.000539449, 0, 0.108859, 0.918278, 0.000568604, 0, 0.123038, 0.908449, 0.000588505, 0, 0.138065, 0.897713, 0.000612473, 0, 0.153938, 0.885533, 0.000625575, 0, 0.170657, 0.872131, 0.00063854, 0, 0.188224, 0.857517, 0.000647034, 0, 0.20664, 0.841796, 0.00065209, 0, 0.225909, 0.824726, 0.0006544, 0, 0.246035, 0.807297, 0.000655744, 0, 0.267022, 0.789058, 0.000646716, 0, 0.288878, 0.77189, 0.000643898, 0, 0.311607, 0.753082, 0.000629973, 0, 0.335216, 0.7341, 0.000621564, 0, 0.359713, 0.714094, 0.000605171, 0, 0.385103, 0.693839, 0.000588752, 0, 0.41139, 0.673891, 0.000573294, 0, 0.438576, 0.653565, 0.000552682, 0, 0.466656, 0.633326, 0.000533446, 0, 0.495617, 0.612582, 0.000514635, 0, 0.525431, 0.59205, 0.00049303, 0, 0.556041, 0.571918, 0.000471842, 0, 0.587338, 0.551572, 0.000451713, 0, 0.619048, 0.531553, 0.000430049, 0, 0.650794, 0.51175, 0.000410445, 0, 0.68254, 0.49238, 0.000390098, 0, 0.714286, 0.473143, 0.000370033, 0, 0.746032, 0.45423, 0.000351205, 0, 0.777778, 0.435963, 0.000332049, 0, 0.809524, 0.41787, 0.000315021, 0, 0.84127, 0.400387, 0.000297315, 0, 0.873016, 0.383332, 0.000281385, 0, 0.904762, 0.366665, 0.000265397, 0, 0.936508, 0.350633, 0.000250601, 0, 0.968254, 0.334964, 0.00023589, 0, 1, 1, 6.43736e-05, 0, 0, 1, 6.4375e-05, 0, 0, 1, 6.43947e-05, 0, 0, 0.999999, 6.4481e-05, 0, 0, 0.999997, 6.47143e-05, 0, 0, 0.999994, 6.52119e-05, 0, 0, 0.999985, 6.61359e-05, 0, 0, 0.999972, 6.77116e-05, 0, 0, 0.999952, 7.02599e-05, 0, 0, 0.999922, 7.42517e-05, 0, 0, 0.99988, 8.03906e-05, 0, 0, 0.99982, 8.97315e-05, 0, 0, 0.999741, 0.000103838, 0, 0, 0.999629, 0.00012496, 0, 0.000149024, 0.999474, 0.000156161, 0, 0.000861027, 0.999229, 0.000201034, 0, 0.00231198, 0.998662, 0.000259069, 0, 0.00458147, 0.995299, 0.000245439, 0, 0.00770895, 0.992732, 0.00024498, 0, 0.0117126, 0.990847, 0.000273211, 0, 0.0165989, 0.988911, 0.000316492, 0, 0.0223674, 0.98654, 0.00037161, 0, 0.0290135, 0.982636, 0.000410352, 0, 0.0365309, 0.977346, 0.000421756, 0, 0.0449117, 0.972909, 0.000475578, 0, 0.0541481, 0.966821, 0.000522482, 0, 0.0642326, 0.958686, 0.000545008, 0, 0.075158, 0.949754, 0.000589286, 0, 0.0869181, 0.939184, 0.000619995, 0, 0.0995074, 0.927505, 0.000654266, 0, 0.112922, 0.916606, 0.000682362, 0, 0.127157, 0.906707, 0.000704286, 0, 0.142212, 0.895937, 0.000725909, 0, 0.158085, 0.883913, 0.000743939, 0, 0.174776, 0.870642, 0.000755157, 0, 0.192287, 0.856241, 0.000764387, 0, 0.210619, 0.84069, 0.000771032, 0, 0.229775, 0.823728, 0.000765906, 0, 0.249761, 0.806481, 0.000767604, 0, 0.270582, 0.787924, 0.000754385, 0, 0.292243, 0.770588, 0.000749668, 0, 0.314753, 0.751991, 0.000731613, 0, 0.338118, 0.733407, 0.000717655, 0, 0.362347, 0.713688, 0.000700604, 0, 0.387447, 0.693595, 0.000678765, 0, 0.413424, 0.673426, 0.000657042, 0, 0.440284, 0.65359, 0.000635892, 0, 0.468027, 0.633576, 0.000611569, 0, 0.496645, 0.613144, 0.000586011, 0, 0.526122, 0.592711, 0.000563111, 0, 0.556417, 0.572722, 0.000537699, 0, 0.587451, 0.552762, 0.000512556, 0, 0.619048, 0.532985, 0.000489757, 0, 0.650794, 0.513219, 0.000464139, 0, 0.68254, 0.493992, 0.000442193, 0, 0.714286, 0.47509, 0.000418629, 0, 0.746032, 0.456287, 0.000397045, 0, 0.777778, 0.438152, 0.000375504, 0, 0.809524, 0.420294, 0.00035492, 0, 0.84127, 0.402749, 0.000335327, 0, 0.873016, 0.385879, 0.000316422, 0, 0.904762, 0.369352, 0.000298333, 0, 0.936508, 0.353301, 0.000281417, 0, 0.968254, 0.337781, 0.000265203, 0, 1, 1, 9.68267e-05, 0, 0, 1, 9.68284e-05, 0, 0, 1, 9.68556e-05, 0, 0, 0.999999, 9.69733e-05, 0, 0, 0.999997, 9.72913e-05, 0, 0, 0.999993, 9.79688e-05, 0, 0, 0.999984, 9.92239e-05, 0, 0, 0.999969, 0.000101356, 0, 0, 0.999946, 0.000104784, 0, 0, 0.999913, 0.000110111, 0, 0, 0.999868, 0.000118217, 0, 0, 0.999801, 0.000130396, 0, 0, 0.999712, 0.000148523, 0, 1.24907e-05, 0.999589, 0.000175233, 0, 0.000355405, 0.999416, 0.000213999, 0, 0.0013528, 0.999136, 0.000268529, 0, 0.00312557, 0.998367, 0.000333088, 0, 0.00573045, 0.994701, 0.000304757, 0, 0.00919397, 0.992497, 0.000318031, 0, 0.0135261, 0.990608, 0.000353863, 0, 0.0187278, 0.988715, 0.000409044, 0, 0.0247947, 0.986241, 0.000472967, 0, 0.0317196, 0.981696, 0.000495104, 0, 0.039494, 0.977097, 0.000532873, 0, 0.0481087, 0.972583, 0.000594447, 0, 0.0575549, 0.966142, 0.000636867, 0, 0.0678242, 0.95823, 0.000669899, 0, 0.0789089, 0.949677, 0.000719499, 0, 0.0908023, 0.939226, 0.000750584, 0, 0.103499, 0.927501, 0.000793183, 0, 0.116993, 0.915199, 0.00081995, 0, 0.131282, 0.90498, 0.000847654, 0, 0.146364, 0.894243, 0.000868929, 0, 0.162237, 0.882154, 0.000884278, 0, 0.178902, 0.869161, 0.000898108, 0, 0.196358, 0.854751, 0.000901254, 0, 0.21461, 0.839368, 0.00090679, 0, 0.23366, 0.822874, 0.000901541, 0, 0.253512, 0.805514, 0.000897297, 0, 0.274174, 0.78716, 0.000881856, 0, 0.29565, 0.769061, 0.000870032, 0, 0.31795, 0.751, 0.000851719, 0, 0.341081, 0.732614, 0.000830671, 0, 0.365053, 0.713171, 0.000806569, 0, 0.389874, 0.693472, 0.00078338, 0, 0.415553, 0.673528, 0.000756404, 0, 0.442098, 0.653397, 0.000726872, 0, 0.469512, 0.633781, 0.000700494, 0, 0.497794, 0.613877, 0.00067105, 0, 0.526935, 0.593506, 0.000640361, 0, 0.556908, 0.573667, 0.000613502, 0, 0.587657, 0.553932, 0.000583177, 0, 0.61906, 0.534345, 0.000554375, 0, 0.650794, 0.515042, 0.000527811, 0, 0.68254, 0.495674, 0.000499367, 0, 0.714286, 0.477132, 0.00047429, 0, 0.746032, 0.458609, 0.000447726, 0, 0.777778, 0.440354, 0.000424205, 0, 0.809524, 0.422765, 0.000399549, 0, 0.84127, 0.405472, 0.000378315, 0, 0.873016, 0.388482, 0.000355327, 0, 0.904762, 0.372191, 0.000336122, 0, 0.936508, 0.356099, 0.000315247, 0, 0.968254, 0.340737, 0.00029794, 0, 1, 1, 0.000143327, 0, 0, 1, 0.00014333, 0, 0, 1, 0.000143366, 0, 0, 0.999999, 0.000143524, 0, 0, 0.999996, 0.000143952, 0, 0, 0.999991, 0.000144862, 0, 0, 0.999981, 0.000146544, 0, 0, 0.999966, 0.000149391, 0, 0, 0.999941, 0.000153946, 0, 0, 0.999905, 0.000160971, 0, 0, 0.999852, 0.000171562, 0, 0, 0.99978, 0.00018729, 0, 0, 0.999681, 0.000210386, 0, 8.26239e-05, 0.999546, 0.000243906, 0, 0.000664807, 0.999352, 0.000291739, 0, 0.00196192, 0.999027, 0.000357419, 0, 0.00405941, 0.997886, 0.000422349, 0, 0.00699664, 0.99419, 0.000385008, 0, 0.0107896, 0.99214, 0.000409775, 0, 0.0154415, 0.990274, 0.000456418, 0, 0.0209488, 0.988455, 0.000527008, 0, 0.0273037, 0.985804, 0.000597685, 0, 0.0344969, 0.98103, 0.000613124, 0, 0.0425183, 0.976674, 0.000668321, 0, 0.0513575, 0.972021, 0.000736985, 0, 0.0610046, 0.965274, 0.000773789, 0, 0.0714508, 0.958046, 0.000830852, 0, 0.0826877, 0.949333, 0.000875766, 0, 0.0947085, 0.939135, 0.000917088, 0, 0.107507, 0.927119, 0.000952244, 0, 0.121078, 0.91469, 0.000990626, 0, 0.135419, 0.903006, 0.00101304, 0, 0.150526, 0.892368, 0.00103834, 0, 0.166399, 0.880231, 0.00105002, 0, 0.183038, 0.867432, 0.00106331, 0, 0.200443, 0.853208, 0.00106783, 0, 0.218618, 0.837956, 0.00106458, 0, 0.237566, 0.821772, 0.00105945, 0, 0.257291, 0.804328, 0.00104685, 0, 0.2778, 0.786465, 0.00103178, 0, 0.2991, 0.768004, 0.00101077, 0, 0.321199, 0.74972, 0.000985504, 0, 0.344106, 0.731682, 0.000962893, 0, 0.36783, 0.712813, 0.000932146, 0, 0.392383, 0.693139, 0.00089871, 0, 0.417774, 0.673566, 0.000869678, 0, 0.444013, 0.653483, 0.000835525, 0, 0.471107, 0.633891, 0.000799853, 0, 0.49906, 0.614433, 0.000766838, 0, 0.527869, 0.594586, 0.000732227, 0, 0.557517, 0.574769, 0.000696442, 0, 0.587966, 0.555149, 0.000663935, 0, 0.61913, 0.535898, 0.000629826, 0, 0.650794, 0.516753, 0.000596486, 0, 0.68254, 0.497816, 0.000567078, 0, 0.714286, 0.479034, 0.000534399, 0, 0.746032, 0.460975, 0.000507013, 0, 0.777778, 0.442935, 0.000477421, 0, 0.809524, 0.425263, 0.000451101, 0, 0.84127, 0.408248, 0.000424964, 0, 0.873016, 0.391339, 0.00039993, 0, 0.904762, 0.37513, 0.000377619, 0, 0.936508, 0.359172, 0.000354418, 0, 0.968254, 0.343876, 0.000334823, 0, 1, 1, 0.000209042, 0, 0, 1, 0.000209045, 0, 0, 1, 0.000209093, 0, 0, 0.999999, 0.000209304, 0, 0, 0.999996, 0.000209871, 0, 0, 0.999991, 0.000211078, 0, 0, 0.999979, 0.000213304, 0, 0, 0.999963, 0.000217061, 0, 0, 0.999933, 0.000223042, 0, 0, 0.999894, 0.000232206, 0, 0, 0.999837, 0.000245901, 0, 0, 0.999756, 0.000266023, 0, 1.02927e-06, 0.999648, 0.000295204, 0, 0.000233468, 0.999499, 0.000336958, 0, 0.00108237, 0.999283, 0.000395563, 0, 0.00268832, 0.998896, 0.000473785, 0, 0.00511138, 0.997006, 0.000520008, 0, 0.00837705, 0.993819, 0.000497261, 0, 0.0124928, 0.991632, 0.000523722, 0, 0.0174561, 0.989875, 0.000587258, 0, 0.0232596, 0.988109, 0.000676329, 0, 0.0298932, 0.985155, 0.000747701, 0, 0.0373453, 0.980479, 0.000768803, 0, 0.0456045, 0.976271, 0.000841054, 0, 0.0546593, 0.971347, 0.000911469, 0, 0.0644994, 0.964528, 0.000953057, 0, 0.0751152, 0.957632, 0.00102221, 0, 0.0864981, 0.948681, 0.00106122, 0, 0.0986407, 0.938716, 0.00111857, 0, 0.111537, 0.926629, 0.00114762, 0, 0.125182, 0.914025, 0.00118995, 0, 0.139571, 0.901026, 0.00121228, 0, 0.154703, 0.890358, 0.00123946, 0, 0.170576, 0.878283, 0.0012527, 0, 0.18719, 0.865459, 0.00125536, 0, 0.204547, 0.851407, 0.00126134, 0, 0.222648, 0.836276, 0.00124759, 0, 0.241498, 0.820436, 0.00124443, 0, 0.261101, 0.803253, 0.00122071, 0, 0.281465, 0.785562, 0.00120107, 0, 0.302595, 0.76718, 0.00117762, 0, 0.324501, 0.748551, 0.00114289, 0, 0.347192, 0.730564, 0.00110872, 0, 0.370679, 0.712253, 0.00107636, 0, 0.394973, 0.692867, 0.00103646, 0, 0.420085, 0.673695, 0.000996793, 0, 0.446027, 0.653912, 0.00095675, 0, 0.47281, 0.634129, 0.000916739, 0, 0.500441, 0.615004, 0.000874401, 0, 0.528921, 0.595587, 0.000833411, 0, 0.558244, 0.575965, 0.000794556, 0, 0.588384, 0.5566, 0.00075196, 0, 0.619281, 0.537428, 0.000716381, 0, 0.650795, 0.518623, 0.000676558, 0, 0.68254, 0.499964, 0.00064074, 0, 0.714286, 0.481356, 0.000605984, 0, 0.746032, 0.463279, 0.000570256, 0, 0.777778, 0.445673, 0.000540138, 0, 0.809524, 0.428032, 0.000507299, 0, 0.84127, 0.411112, 0.000479553, 0, 0.873016, 0.394444, 0.000450737, 0, 0.904762, 0.378247, 0.000424269, 0, 0.936508, 0.362415, 0.000399111, 0, 0.968254, 0.347103, 0.000375274, 0, 1, 1, 0.000300729, 0, 0, 1, 0.000300733, 0, 0, 1, 0.000300797, 0, 0, 0.999998, 0.000301072, 0, 0, 0.999996, 0.000301817, 0, 0, 0.999989, 0.000303398, 0, 0, 0.999977, 0.000306309, 0, 0, 0.999958, 0.000311209, 0, 0, 0.999927, 0.000318975, 0, 0, 0.999884, 0.000330804, 0, 0, 0.99982, 0.00034834, 0, 0, 0.999733, 0.000373854, 0, 3.26995e-05, 0.999613, 0.000410424, 0, 0.000477174, 0.999447, 0.000462047, 0, 0.00161099, 0.999204, 0.000533322, 0, 0.00353153, 0.998725, 0.000624964, 0, 0.00627965, 0.995871, 0.000631786, 0, 0.0098693, 0.993194, 0.000632017, 0, 0.0143011, 0.991541, 0.00068923, 0, 0.019568, 0.989773, 0.000766892, 0, 0.0256593, 0.987647, 0.000863668, 0, 0.0325625, 0.984193, 0.000922089, 0, 0.0402647, 0.980016, 0.000970749, 0, 0.0487532, 0.975859, 0.00106027, 0, 0.058016, 0.970514, 0.00112239, 0, 0.0680419, 0.963625, 0.00117212, 0, 0.0788208, 0.956959, 0.00125211, 0, 0.0903439, 0.947956, 0.00129411, 0, 0.102604, 0.93809, 0.00135879, 0, 0.115594, 0.92659, 0.00139309, 0, 0.129309, 0.913829, 0.00143253, 0, 0.143745, 0.90005, 0.00145809, 0, 0.158901, 0.888129, 0.0014748, 0, 0.174774, 0.87607, 0.00148756, 0, 0.191365, 0.863461, 0.00148714, 0, 0.208674, 0.849594, 0.00148892, 0, 0.226705, 0.834531, 0.00146496, 0, 0.245461, 0.81903, 0.0014579, 0, 0.264947, 0.802122, 0.00143039, 0, 0.28517, 0.78445, 0.00139717, 0, 0.306137, 0.766434, 0.00136312, 0, 0.327857, 0.747816, 0.00132597, 0, 0.350341, 0.729519, 0.00128323, 0, 0.373598, 0.711454, 0.00123803, 0, 0.397642, 0.692699, 0.00119097, 0, 0.422485, 0.673723, 0.00114565, 0, 0.448139, 0.654386, 0.00109552, 0, 0.474619, 0.634673, 0.00104553, 0, 0.501933, 0.615554, 0.00099985, 0, 0.530089, 0.596462, 0.000948207, 0, 0.559087, 0.577385, 0.000902299, 0, 0.588913, 0.558257, 0.000856448, 0, 0.619525, 0.5392, 0.000810395, 0, 0.650826, 0.520543, 0.000768558, 0, 0.68254, 0.502206, 0.0007239, 0, 0.714286, 0.48402, 0.000685794, 0, 0.746032, 0.465779, 0.00064471, 0, 0.777778, 0.448455, 0.000609583, 0, 0.809524, 0.431091, 0.00057227, 0, 0.84127, 0.414147, 0.00054042, 0, 0.873016, 0.39765, 0.000506545, 0, 0.904762, 0.381576, 0.000477635, 0, 0.936508, 0.365881, 0.000448446, 0, 0.968254, 0.350582, 0.000421424, 0, 1, 1, 0.000427144, 0, 0, 1, 0.000427151, 0, 0, 1, 0.000427232, 0, 0, 0.999998, 0.00042759, 0, 0, 0.999995, 0.000428555, 0, 0, 0.999988, 0.000430603, 0, 0, 0.999976, 0.000434368, 0, 0, 0.999952, 0.000440688, 0, 0, 0.999919, 0.000450667, 0, 0, 0.999871, 0.00046578, 0, 0, 0.999801, 0.000488024, 0, 0, 0.999704, 0.000520092, 0, 0.000129791, 0.999572, 0.000565553, 0, 0.000821056, 0.999389, 0.000628906, 0, 0.00225241, 0.999114, 0.000714911, 0, 0.00449109, 0.998488, 0.000819218, 0, 0.00756249, 0.995234, 0.00080415, 0, 0.0114716, 0.993021, 0.000830181, 0, 0.0162131, 0.991407, 0.000902645, 0, 0.021776, 0.989625, 0.000996934, 0, 0.0281471, 0.987064, 0.00109707, 0, 0.0353118, 0.983265, 0.00114353, 0, 0.0432562, 0.979535, 0.0012272, 0, 0.0519665, 0.975224, 0.00132642, 0, 0.0614298, 0.969574, 0.00138092, 0, 0.0716348, 0.963021, 0.00145896, 0, 0.0825709, 0.956046, 0.00152834, 0, 0.094229, 0.947136, 0.00158217, 0, 0.106602, 0.937313, 0.0016347, 0, 0.119682, 0.926073, 0.00168383, 0, 0.133465, 0.913121, 0.00171627, 0, 0.147947, 0.899165, 0.00174229, 0, 0.163125, 0.885891, 0.00176137, 0, 0.178998, 0.873783, 0.00176406, 0, 0.195566, 0.861331, 0.00176156, 0, 0.21283, 0.847569, 0.00175346, 0, 0.230793, 0.832785, 0.00172753, 0, 0.249459, 0.817442, 0.00170204, 0, 0.268832, 0.800613, 0.00166576, 0, 0.28892, 0.783597, 0.00162909, 0, 0.30973, 0.76571, 0.0015826, 0, 0.331271, 0.747021, 0.00153106, 0, 0.353554, 0.728593, 0.00148036, 0, 0.37659, 0.710661, 0.00142808, 0, 0.400391, 0.692426, 0.00136906, 0, 0.424973, 0.673623, 0.00131066, 0, 0.450347, 0.65494, 0.00125569, 0, 0.476531, 0.635448, 0.00119517, 0, 0.503535, 0.616221, 0.00113828, 0, 0.531372, 0.597531, 0.0010816, 0, 0.560047, 0.578795, 0.00102673, 0, 0.589554, 0.559892, 0.000970985, 0, 0.619869, 0.541307, 0.000919773, 0, 0.650923, 0.522608, 0.000868479, 0, 0.68254, 0.504484, 0.00082137, 0, 0.714286, 0.486603, 0.000772916, 0, 0.746032, 0.468802, 0.000730353, 0, 0.777778, 0.451172, 0.000684955, 0, 0.809524, 0.434348, 0.000647565, 0, 0.84127, 0.417445, 0.000605863, 0, 0.873016, 0.401077, 0.000571885, 0, 0.904762, 0.385039, 0.000536034, 0, 0.936508, 0.369483, 0.000504227, 0, 0.968254, 0.354272, 0.000473165, 0, 1, 1, 0.000599525, 0, 0, 1, 0.000599533, 0, 0, 1, 0.000599639, 0, 0, 0.999998, 0.000600097, 0, 0, 0.999994, 0.000601336, 0, 0, 0.999987, 0.000603958, 0, 0, 0.999972, 0.000608775, 0, 0, 0.999949, 0.000616842, 0, 0, 0.999912, 0.000629534, 0, 0, 0.999857, 0.000648658, 0, 0, 0.999781, 0.000676615, 0, 5.38873e-06, 0.999674, 0.000716574, 0, 0.000308602, 0.999528, 0.000772641, 0, 0.00127003, 0.999326, 0.000849806, 0, 0.00300783, 0.999009, 0.000952682, 0, 0.00556637, 0.998112, 0.00106394, 0, 0.00895889, 0.994496, 0.00102228, 0, 0.0131827, 0.992806, 0.00108586, 0, 0.0182277, 0.991211, 0.0011759, 0, 0.0240795, 0.989415, 0.00128955, 0, 0.030723, 0.986499, 0.00139038, 0, 0.0381418, 0.982679, 0.00144539, 0, 0.046321, 0.978839, 0.00153954, 0, 0.0552459, 0.974295, 0.00164417, 0, 0.0649034, 0.968784, 0.00171517, 0, 0.0752814, 0.962324, 0.00180282, 0, 0.0863693, 0.954956, 0.00186387, 0, 0.0981578, 0.94624, 0.00193817, 0, 0.110639, 0.936517, 0.00198156, 0, 0.123806, 0.925186, 0.00203042, 0, 0.137655, 0.91252, 0.0020664, 0, 0.15218, 0.898441, 0.00207822, 0, 0.16738, 0.884394, 0.0020992, 0, 0.183253, 0.871273, 0.00208748, 0, 0.199799, 0.859057, 0.00208686, 0, 0.21702, 0.845243, 0.00205519, 0, 0.234918, 0.830723, 0.00202868, 0, 0.253496, 0.815801, 0.00199501, 0, 0.272761, 0.79914, 0.00194193, 0, 0.292719, 0.782372, 0.00188824, 0, 0.313377, 0.76482, 0.00183695, 0, 0.334745, 0.746586, 0.00177418, 0, 0.356833, 0.7281, 0.00170628, 0, 0.379654, 0.709842, 0.00164063, 0, 0.403221, 0.692019, 0.00157355, 0, 0.427548, 0.67364, 0.00150262, 0, 0.452651, 0.655277, 0.00143473, 0, 0.478545, 0.636438, 0.00136371, 0, 0.505246, 0.617364, 0.00129911, 0, 0.532768, 0.598603, 0.00123014, 0, 0.561122, 0.580195, 0.00116587, 0, 0.590309, 0.561786, 0.00110398, 0, 0.620318, 0.543377, 0.00104148, 0, 0.651102, 0.525093, 0.000983984, 0, 0.682545, 0.506791, 0.00092667, 0, 0.714286, 0.489291, 0.000874326, 0, 0.746032, 0.471811, 0.000821734, 0, 0.777778, 0.454435, 0.000774698, 0, 0.809524, 0.437493, 0.000727302, 0, 0.84127, 0.420977, 0.000684039, 0, 0.873016, 0.404729, 0.00064373, 0, 0.904762, 0.388756, 0.00060285, 0, 0.936508, 0.373344, 0.00056765, 0, 0.968254, 0.358191, 0.000531929, 0, 1, 1, 0.000832169, 0, 0, 1, 0.000832178, 0, 0, 1, 0.00083231, 0, 0, 0.999998, 0.000832893, 0, 0, 0.999995, 0.000834465, 0, 0, 0.999985, 0.000837791, 0, 0, 0.999969, 0.000843893, 0, 0, 0.999944, 0.000854086, 0, 0, 0.999903, 0.000870071, 0, 0, 0.999843, 0.000894042, 0, 0, 0.999759, 0.000928865, 0, 5.31805e-05, 0.999643, 0.000978242, 0, 0.000579365, 0.99948, 0.00104684, 0, 0.00182774, 0.999255, 0.00114012, 0, 0.00387804, 0.998885, 0.00126188, 0, 0.00675709, 0.997405, 0.00135888, 0, 0.010468, 0.99424, 0.00133626, 0, 0.0150018, 0.992458, 0.00140905, 0, 0.0203443, 0.990929, 0.00152305, 0, 0.0264786, 0.989116, 0.00165882, 0, 0.0333875, 0.985624, 0.00174128, 0, 0.0410536, 0.982003, 0.00182108, 0, 0.0494609, 0.978336, 0.00194498, 0, 0.0585941, 0.973184, 0.00202708, 0, 0.0684396, 0.9678, 0.00212166, 0, 0.0789851, 0.961348, 0.00221366, 0, 0.0902199, 0.953841, 0.00228219, 0, 0.102134, 0.94534, 0.00235662, 0, 0.114721, 0.935552, 0.00240572, 0, 0.127972, 0.924064, 0.00244405, 0, 0.141884, 0.911827, 0.00247557, 0, 0.156451, 0.897731, 0.00248374, 0, 0.171672, 0.883409, 0.00249863, 0, 0.187545, 0.868625, 0.00246688, 0, 0.20407, 0.856529, 0.00246523, 0, 0.221249, 0.842999, 0.00242368, 0, 0.239083, 0.828505, 0.00237354, 0, 0.257578, 0.813825, 0.00232588, 0, 0.276738, 0.797813, 0.00226731, 0, 0.296569, 0.781097, 0.00219704, 0, 0.31708, 0.764038, 0.00212394, 0, 0.338281, 0.746067, 0.00204786, 0, 0.360181, 0.727687, 0.00196728, 0, 0.382794, 0.709571, 0.00188779, 0, 0.406133, 0.691503, 0.00180532, 0, 0.430213, 0.673673, 0.00171849, 0, 0.45505, 0.655732, 0.00164147, 0, 0.480662, 0.637399, 0.00155858, 0, 0.507065, 0.618616, 0.00147641, 0, 0.534278, 0.60005, 0.00140125, 0, 0.562313, 0.581713, 0.00132441, 0, 0.59118, 0.563546, 0.00125014, 0, 0.620875, 0.545605, 0.00118249, 0, 0.651373, 0.527559, 0.0011116, 0, 0.682593, 0.509764, 0.00104979, 0, 0.714286, 0.49193, 0.000985977, 0, 0.746032, 0.475011, 0.000928592, 0, 0.777778, 0.457878, 0.000873466, 0, 0.809524, 0.440979, 0.000819585, 0, 0.84127, 0.424613, 0.000772365, 0, 0.873016, 0.408549, 0.000722195, 0, 0.904762, 0.392771, 0.000680014, 0, 0.936508, 0.377317, 0.000636797, 0, 0.968254, 0.362352, 0.000598318, 0, 1, 1, 0.00114313, 0, 0, 1, 0.00114314, 0, 0, 0.999999, 0.00114331, 0, 0, 0.999998, 0.00114404, 0, 0, 0.999994, 0.00114601, 0, 0, 0.999984, 0.00115019, 0, 0, 0.999967, 0.00115784, 0, 0, 0.999937, 0.0011706, 0, 0, 0.999894, 0.00119054, 0, 0, 0.999828, 0.00122031, 0, 0, 0.999735, 0.00126331, 0, 0.000169263, 0.999606, 0.00132382, 0, 0.000949167, 0.999426, 0.0014071, 0, 0.00249668, 0.999173, 0.00151895, 0, 0.00486392, 0.99873, 0.00166102, 0, 0.00806323, 0.996243, 0.0017023, 0, 0.0120895, 0.993779, 0.00172782, 0, 0.0169288, 0.9919, 0.0018108, 0, 0.0225633, 0.990524, 0.00196028, 0, 0.028974, 0.98868, 0.00212014, 0, 0.036142, 0.984663, 0.00217598, 0, 0.044049, 0.981457, 0.00230563, 0, 0.0526781, 0.977608, 0.00243966, 0, 0.0620137, 0.972215, 0.00251336, 0, 0.0720418, 0.966798, 0.0026285, 0, 0.0827499, 0.960241, 0.00271409, 0, 0.0941271, 0.952489, 0.00278381, 0, 0.106164, 0.944127, 0.00285399, 0, 0.118852, 0.934282, 0.00290994, 0, 0.132185, 0.923271, 0.00294558, 0, 0.146157, 0.910803, 0.00296269, 0, 0.160766, 0.896705, 0.00296803, 0, 0.176007, 0.88238, 0.00296637, 0, 0.19188, 0.867116, 0.00293163, 0, 0.208385, 0.853636, 0.00289418, 0, 0.225523, 0.840469, 0.00284663, 0, 0.243296, 0.82639, 0.00278594, 0, 0.261709, 0.811759, 0.00271618, 0, 0.280767, 0.796113, 0.00263187, 0, 0.300476, 0.779518, 0.00254589, 0, 0.320845, 0.763142, 0.00246003, 0, 0.341883, 0.745464, 0.00236529, 0, 0.363601, 0.727491, 0.00226536, 0, 0.386011, 0.709414, 0.00216375, 0, 0.409128, 0.691396, 0.00207127, 0, 0.432967, 0.67368, 0.00197106, 0, 0.457545, 0.656049, 0.00187022, 0, 0.482881, 0.638188, 0.00177605, 0, 0.508992, 0.620177, 0.00168482, 0, 0.535899, 0.601506, 0.00158909, 0, 0.563619, 0.58362, 0.00150583, 0, 0.592165, 0.565496, 0.00141791, 0, 0.621544, 0.54789, 0.00133693, 0, 0.651743, 0.530323, 0.00126038, 0, 0.682709, 0.512795, 0.00118556, 0, 0.714286, 0.495199, 0.00111527, 0, 0.746032, 0.478101, 0.0010489, 0, 0.777778, 0.461511, 0.000984264, 0, 0.809524, 0.444879, 0.00092591, 0, 0.84127, 0.428424, 0.000866582, 0, 0.873016, 0.412495, 0.000814463, 0, 0.904762, 0.396975, 0.000764498, 0, 0.936508, 0.381614, 0.000715967, 0, 0.968254, 0.366732, 0.000672483, 0, 1, 1, 0.00155501, 0, 0, 1, 0.00155503, 0, 0, 1, 0.00155524, 0, 0, 0.999998, 0.00155615, 0, 0, 0.999994, 0.0015586, 0, 0, 0.999983, 0.00156379, 0, 0, 0.999963, 0.0015733, 0, 0, 0.999932, 0.00158911, 0, 0, 0.999882, 0.00161376, 0, 0, 0.99981, 0.00165041, 0, 1.00875e-05, 0.999708, 0.00170304, 0, 0.000367658, 0.999565, 0.00177658, 0, 0.0014234, 0.999368, 0.00187688, 0, 0.00327939, 0.999081, 0.00200989, 0, 0.00596629, 0.99852, 0.00217177, 0, 0.0094852, 0.99549, 0.0021745, 0, 0.013824, 0.993252, 0.00222357, 0, 0.0189642, 0.991727, 0.00235022, 0, 0.0248856, 0.989951, 0.00250561, 0, 0.0315669, 0.988029, 0.00268829, 0, 0.0389882, 0.984029, 0.0027496, 0, 0.0471302, 0.980683, 0.00289793, 0, 0.0559754, 0.976554, 0.00303315, 0, 0.0655081, 0.97139, 0.00313257, 0, 0.0757138, 0.965544, 0.00323656, 0, 0.08658, 0.95912, 0.00333432, 0, 0.0980954, 0.951183, 0.0034039, 0, 0.110251, 0.942974, 0.00347515, 0, 0.123038, 0.932642, 0.00350381, 0, 0.13645, 0.922158, 0.00354519, 0, 0.150482, 0.909404, 0.00353851, 0, 0.165129, 0.896071, 0.0035435, 0, 0.18039, 0.881206, 0.00349936, 0, 0.196263, 0.866077, 0.00347256, 0, 0.212748, 0.85093, 0.003415, 0, 0.229847, 0.837703, 0.00333367, 0, 0.247561, 0.823878, 0.003249, 0, 0.265895, 0.809449, 0.00316347, 0, 0.284854, 0.794379, 0.00306351, 0, 0.304445, 0.778138, 0.0029499, 0, 0.324675, 0.761997, 0.00284099, 0, 0.345555, 0.744938, 0.00272104, 0, 0.367095, 0.727212, 0.00260715, 0, 0.389309, 0.709549, 0.00248855, 0, 0.41221, 0.691704, 0.00236783, 0, 0.435814, 0.673689, 0.00225178, 0, 0.460138, 0.656453, 0.00213765, 0, 0.485203, 0.639128, 0.00202178, 0, 0.511028, 0.621512, 0.00191443, 0, 0.537634, 0.603598, 0.00180977, 0, 0.565041, 0.58559, 0.00170456, 0, 0.593268, 0.567852, 0.00160927, 0, 0.622327, 0.5503, 0.00151395, 0, 0.652217, 0.533033, 0.00142499, 0, 0.682907, 0.515942, 0.00133955, 0, 0.714296, 0.498814, 0.0012602, 0, 0.746032, 0.481595, 0.00118188, 0, 0.777778, 0.465117, 0.00111171, 0, 0.809524, 0.448865, 0.00104091, 0, 0.84127, 0.432711, 0.000976618, 0, 0.873016, 0.416822, 0.00091859, 0, 0.904762, 0.401272, 0.000857704, 0, 0.936508, 0.386226, 0.000807172, 0, 0.968254, 0.371321, 0.00075464, 0, 1, 1, 0.00209596, 0, 0, 1, 0.00209598, 0, 0, 1, 0.00209624, 0, 0, 0.999997, 0.00209736, 0, 0, 0.999991, 0.00210039, 0, 0, 0.999979, 0.00210678, 0, 0, 0.999959, 0.00211847, 0, 0, 0.999925, 0.0021379, 0, 0, 0.99987, 0.00216809, 0, 0, 0.999791, 0.00221281, 0, 6.81487e-05, 0.999677, 0.00227669, 0, 0.000658161, 0.999521, 0.00236533, 0, 0.00200635, 0.999301, 0.00248514, 0, 0.0041779, 0.998977, 0.00264185, 0, 0.00718648, 0.998191, 0.00281695, 0, 0.0110239, 0.994801, 0.00278518, 0, 0.015672, 0.993091, 0.00288774, 0, 0.0211091, 0.991571, 0.00303931, 0, 0.0273123, 0.9897, 0.00321643, 0, 0.034259, 0.987023, 0.00337332, 0, 0.0419282, 0.983289, 0.00346146, 0, 0.0502998, 0.979892, 0.00363704, 0, 0.0593562, 0.975111, 0.00373601, 0, 0.069081, 0.970351, 0.0038842, 0, 0.0794598, 0.964131, 0.00397053, 0, 0.0904798, 0.957747, 0.00408078, 0, 0.10213, 0.949536, 0.00413533, 0, 0.1144, 0.941372, 0.00420305, 0, 0.127284, 0.931049, 0.00422815, 0, 0.140772, 0.920647, 0.00425048, 0, 0.154862, 0.908033, 0.0042281, 0, 0.169548, 0.895028, 0.00422026, 0, 0.184828, 0.879968, 0.00415042, 0, 0.200701, 0.864875, 0.00408821, 0, 0.217167, 0.84918, 0.00400909, 0, 0.234227, 0.834934, 0.00391178, 0, 0.251884, 0.821397, 0.00380066, 0, 0.270141, 0.807135, 0.00367974, 0, 0.289004, 0.792363, 0.00355172, 0, 0.308479, 0.776661, 0.003411, 0, 0.328575, 0.760705, 0.00328123, 0, 0.349301, 0.744408, 0.00314003, 0, 0.370668, 0.726994, 0.0029906, 0, 0.392689, 0.709598, 0.00285034, 0, 0.415379, 0.692112, 0.00271179, 0, 0.438754, 0.674435, 0.00257185, 0, 0.46283, 0.65676, 0.00243425, 0, 0.48763, 0.639982, 0.00230351, 0, 0.513173, 0.622983, 0.0021777, 0, 0.539482, 0.605471, 0.00204991, 0, 0.566579, 0.58796, 0.00193759, 0, 0.594488, 0.570463, 0.00181976, 0, 0.623226, 0.553058, 0.00171497, 0, 0.6528, 0.535894, 0.00161109, 0, 0.683198, 0.519089, 0.00151394, 0, 0.714354, 0.502454, 0.00142122, 0, 0.746032, 0.485681, 0.00133488, 0, 0.777778, 0.468935, 0.00124975, 0, 0.809524, 0.452951, 0.00117309, 0, 0.84127, 0.437139, 0.00110155, 0, 0.873016, 0.421446, 0.00103124, 0, 0.904762, 0.405951, 0.000966387, 0, 0.936508, 0.391003, 0.000908119, 0, 0.968254, 0.376198, 0.000848057, 0, 1, 1, 0.00280076, 0, 0, 1, 0.00280078, 0, 0, 0.999999, 0.00280109, 0, 0, 0.999997, 0.00280246, 0, 0, 0.999992, 0.00280616, 0, 0, 0.999979, 0.00281396, 0, 0, 0.999956, 0.00282822, 0, 0, 0.999916, 0.00285186, 0, 0, 0.999857, 0.0028885, 0, 0, 0.999768, 0.00294259, 0, 0.000196026, 0.999645, 0.00301946, 0, 0.00104842, 0.99947, 0.00312541, 0, 0.00270199, 0.999229, 0.00326733, 0, 0.00519449, 0.998852, 0.00344992, 0, 0.00852602, 0.997558, 0.00361052, 0, 0.0126804, 0.994417, 0.0035898, 0, 0.017635, 0.992824, 0.00372393, 0, 0.023365, 0.991344, 0.00390695, 0, 0.0298456, 0.989337, 0.00410392, 0, 0.0370529, 0.985811, 0.00420987, 0, 0.0449651, 0.982772, 0.00437488, 0, 0.0535615, 0.979001, 0.00455069, 0, 0.0628243, 0.974102, 0.00464462, 0, 0.0727368, 0.969197, 0.00480577, 0, 0.0832844, 0.962759, 0.00487818, 0, 0.0944545, 0.956207, 0.00498176, 0, 0.106236, 0.947909, 0.00503392, 0, 0.118619, 0.939596, 0.00507474, 0, 0.131595, 0.929642, 0.00509798, 0, 0.145159, 0.918807, 0.00508476, 0, 0.159305, 0.906921, 0.00505634, 0, 0.174028, 0.893312, 0.00498845, 0, 0.189327, 0.878933, 0.0049133, 0, 0.2052, 0.863986, 0.0048259, 0, 0.221647, 0.847936, 0.00470848, 0, 0.23867, 0.832253, 0.00456889, 0, 0.25627, 0.818619, 0.00442726, 0, 0.274453, 0.804788, 0.00427677, 0, 0.293222, 0.790241, 0.00411906, 0, 0.312585, 0.775162, 0.00394833, 0, 0.33255, 0.759463, 0.00377366, 0, 0.353126, 0.743598, 0.00361026, 0, 0.374324, 0.72697, 0.00343627, 0, 0.396158, 0.709646, 0.00326422, 0, 0.418641, 0.69277, 0.00309717, 0, 0.44179, 0.675371, 0.0029356, 0, 0.465624, 0.657863, 0.00277712, 0, 0.490163, 0.640772, 0.00261738, 0, 0.515429, 0.624441, 0.0024737, 0, 0.541445, 0.607497, 0.00233125, 0, 0.568236, 0.590438, 0.00218994, 0, 0.595828, 0.573224, 0.0020664, 0, 0.624242, 0.556168, 0.00193526, 0, 0.653496, 0.539232, 0.00182463, 0, 0.683588, 0.522352, 0.00170735, 0, 0.714482, 0.506172, 0.00160555, 0, 0.746032, 0.489842, 0.00150451, 0, 0.777778, 0.473463, 0.00140938, 0, 0.809524, 0.457266, 0.00132568, 0, 0.84127, 0.441609, 0.0012376, 0, 0.873016, 0.426348, 0.00116265, 0, 0.904762, 0.411002, 0.00108935, 0, 0.936508, 0.396045, 0.00101946, 0, 0.968254, 0.381448, 0.000955665, 0, 1, 1, 0.0037121, 0, 0, 1, 0.00371213, 0, 0, 1, 0.00371251, 0, 0, 0.999997, 0.00371417, 0, 0, 0.99999, 0.00371863, 0, 0, 0.999977, 0.00372807, 0, 0, 0.99995, 0.00374529, 0, 0, 0.999908, 0.0037738, 0, 0, 0.999843, 0.00381789, 0, 1.23596e-05, 0.999745, 0.00388273, 0, 0.000407442, 0.999608, 0.00397443, 0, 0.0015447, 0.999415, 0.00409998, 0, 0.00351385, 0.999143, 0.00426662, 0, 0.0063316, 0.9987, 0.00447625, 0, 0.00998679, 0.996363, 0.00455323, 0, 0.0144569, 0.994021, 0.00461052, 0, 0.0197151, 0.992372, 0.00476359, 0, 0.0257344, 0.991007, 0.00499101, 0, 0.0324882, 0.988767, 0.0051972, 0, 0.0399517, 0.984872, 0.00528407, 0, 0.0481022, 0.982004, 0.00548926, 0, 0.0569191, 0.977714, 0.00564385, 0, 0.0663839, 0.973076, 0.0057693, 0, 0.0764801, 0.967565, 0.0058924, 0, 0.0871928, 0.961384, 0.00599629, 0, 0.0985095, 0.954435, 0.00605998, 0, 0.110419, 0.946303, 0.0061133, 0, 0.122912, 0.937662, 0.00612028, 0, 0.13598, 0.927867, 0.00612209, 0, 0.149617, 0.916475, 0.00604813, 0, 0.163817, 0.90541, 0.00603088, 0, 0.178577, 0.891591, 0.00592218, 0, 0.193894, 0.877573, 0.00578854, 0, 0.209767, 0.862511, 0.00566648, 0, 0.226196, 0.846861, 0.00551481, 0, 0.243182, 0.83068, 0.00533754, 0, 0.260728, 0.815725, 0.00515487, 0, 0.278837, 0.802321, 0.0049655, 0, 0.297515, 0.787826, 0.00475421, 0, 0.316768, 0.773454, 0.00456002, 0, 0.336605, 0.758224, 0.00434727, 0, 0.357034, 0.74265, 0.00414444, 0, 0.378067, 0.726729, 0.00393738, 0, 0.399717, 0.710155, 0.00373575, 0, 0.421998, 0.693312, 0.00353736, 0, 0.444928, 0.67653, 0.00334368, 0, 0.468523, 0.659444, 0.00315981, 0, 0.492806, 0.642051, 0.00297809, 0, 0.517798, 0.625758, 0.00280592, 0, 0.543525, 0.609615, 0.00264254, 0, 0.570012, 0.592919, 0.00248459, 0, 0.597288, 0.576298, 0.00233327, 0, 0.625379, 0.559489, 0.00219519, 0, 0.654307, 0.542891, 0.00205441, 0, 0.684084, 0.526255, 0.00193385, 0, 0.714693, 0.509853, 0.00180745, 0, 0.746044, 0.494131, 0.00169817, 0, 0.777778, 0.478114, 0.0015913, 0, 0.809524, 0.462274, 0.00148981, 0, 0.84127, 0.446412, 0.00139537, 0, 0.873016, 0.431274, 0.00130984, 0, 0.904762, 0.41635, 0.00122403, 0, 0.936508, 0.401476, 0.00114809, 0, 0.968254, 0.386993, 0.00107563, 0, 1, 1, 0.00488216, 0, 0, 1, 0.0048822, 0, 0, 1, 0.00488265, 0, 0, 0.999997, 0.00488463, 0, 0, 0.999988, 0.00488999, 0, 0, 0.999974, 0.00490129, 0, 0, 0.999946, 0.00492191, 0, 0, 0.999897, 0.00495598, 0, 0, 0.999825, 0.00500855, 0, 7.44791e-05, 0.999718, 0.00508559, 0, 0.000712744, 0.999565, 0.005194, 0, 0.00215249, 0.999352, 0.00534147, 0, 0.00444576, 0.999046, 0.00553523, 0, 0.00759218, 0.998492, 0.00577016, 0, 0.0115714, 0.995564, 0.00578487, 0, 0.0163557, 0.993339, 0.00586414, 0, 0.021915, 0.991834, 0.00606002, 0, 0.0282201, 0.990496, 0.00633312, 0, 0.0352433, 0.987826, 0.00651941, 0, 0.042959, 0.98383, 0.00660842, 0, 0.0513439, 0.98109, 0.00685523, 0, 0.0603772, 0.976131, 0.00695778, 0, 0.0700402, 0.971922, 0.00714236, 0, 0.0803163, 0.965901, 0.00721437, 0, 0.0911908, 0.959606, 0.00732017, 0, 0.102651, 0.952504, 0.00735788, 0, 0.114686, 0.944365, 0.00738493, 0, 0.127286, 0.935652, 0.00737969, 0, 0.140443, 0.925813, 0.00733612, 0, 0.154151, 0.914397, 0.00723094, 0, 0.168405, 0.903257, 0.00714002, 0, 0.183201, 0.890015, 0.00700149, 0, 0.198536, 0.876014, 0.00682813, 0, 0.214409, 0.861436, 0.00665567, 0, 0.23082, 0.845752, 0.00644526, 0, 0.24777, 0.829169, 0.00621635, 0, 0.265263, 0.813435, 0.00597789, 0, 0.283301, 0.799701, 0.00575694, 0, 0.301889, 0.785726, 0.00549866, 0, 0.321035, 0.77152, 0.0052503, 0, 0.340746, 0.75683, 0.00499619, 0, 0.361032, 0.741951, 0.0047543, 0, 0.381904, 0.726367, 0.0045084, 0, 0.403374, 0.710537, 0.00426784, 0, 0.425457, 0.693965, 0.00403487, 0, 0.448169, 0.677724, 0.0038075, 0, 0.47153, 0.66117, 0.00359431, 0, 0.495561, 0.644274, 0.00338354, 0, 0.520284, 0.627449, 0.00318163, 0, 0.545725, 0.611645, 0.00299672, 0, 0.571911, 0.595614, 0.00281016, 0, 0.598873, 0.579426, 0.00264252, 0, 0.62664, 0.563016, 0.00247509, 0, 0.655239, 0.546728, 0.00232647, 0, 0.684692, 0.530539, 0.00217803, 0, 0.714999, 0.514164, 0.00204216, 0, 0.746106, 0.498344, 0.00191403, 0, 0.777778, 0.482957, 0.00179203, 0, 0.809524, 0.467336, 0.00167695, 0, 0.84127, 0.451994, 0.00157567, 0, 0.873016, 0.436514, 0.00147113, 0, 0.904762, 0.42178, 0.00138034, 0, 0.936508, 0.407271, 0.00129219, 0, 0.968254, 0.392822, 0.0012098, 0, 1, 1, 0.00637427, 0, 0, 1, 0.00637431, 0, 0, 0.999999, 0.00637485, 0, 0, 0.999996, 0.00637721, 0, 0, 0.999987, 0.00638357, 0, 0, 0.999971, 0.006397, 0, 0, 0.999939, 0.00642142, 0, 0, 0.999888, 0.00646177, 0, 0, 0.999807, 0.00652387, 0, 0.000207916, 0.999689, 0.00661454, 0, 0.00112051, 0.99952, 0.00674155, 0, 0.00287719, 0.999283, 0.00691313, 0, 0.00550145, 0.998936, 0.00713598, 0, 0.00897928, 0.998165, 0.00738501, 0, 0.0132829, 0.994847, 0.00734388, 0, 0.01838, 0.993182, 0.00749991, 0, 0.0242381, 0.991665, 0.0077246, 0, 0.030826, 0.989708, 0.00797579, 0, 0.0381152, 0.986663, 0.00813011, 0, 0.0460794, 0.983288, 0.00830365, 0, 0.0546951, 0.980104, 0.00853496, 0, 0.0639411, 0.974855, 0.00861045, 0, 0.0737988, 0.97045, 0.00879133, 0, 0.0842516, 0.964509, 0.00886377, 0, 0.0952848, 0.957594, 0.00890346, 0, 0.106886, 0.950546, 0.00893289, 0, 0.119044, 0.942225, 0.00890074, 0, 0.131749, 0.933365, 0.00886826, 0, 0.144994, 0.923202, 0.0087316, 0, 0.158772, 0.912605, 0.00863082, 0, 0.173078, 0.901099, 0.00847403, 0, 0.187908, 0.888177, 0.00825838, 0, 0.203261, 0.873955, 0.00801834, 0, 0.219134, 0.860091, 0.00779026, 0, 0.235527, 0.84434, 0.00752478, 0, 0.252443, 0.828517, 0.00724074, 0, 0.269883, 0.81239, 0.00693769, 0, 0.287851, 0.79721, 0.00664817, 0, 0.306352, 0.783489, 0.00634763, 0, 0.325393, 0.769514, 0.00604221, 0, 0.344981, 0.755419, 0.00573568, 0, 0.365126, 0.741083, 0.00544359, 0, 0.385839, 0.726059, 0.00515515, 0, 0.407132, 0.710809, 0.00487139, 0, 0.42902, 0.695052, 0.00459846, 0, 0.45152, 0.678886, 0.00433412, 0, 0.474651, 0.663042, 0.00407981, 0, 0.498433, 0.646634, 0.00384264, 0, 0.52289, 0.630117, 0.00360897, 0, 0.548048, 0.613804, 0.00338863, 0, 0.573936, 0.598338, 0.00318486, 0, 0.600584, 0.582687, 0.00298377, 0, 0.628027, 0.566809, 0.00280082, 0, 0.656295, 0.550817, 0.00262255, 0, 0.685417, 0.534937, 0.00245835, 0, 0.715406, 0.519151, 0.00230574, 0, 0.74624, 0.503118, 0.0021549, 0, 0.777778, 0.487723, 0.00202008, 0, 0.809524, 0.472725, 0.00189355, 0, 0.84127, 0.457599, 0.00177108, 0, 0.873016, 0.442558, 0.00165843, 0, 0.904762, 0.427624, 0.00155494, 0, 0.936508, 0.413171, 0.00145273, 0, 0.968254, 0.399122, 0.00136454, 0, 1, 1, 0.00826496, 0, 0, 1, 0.00826499, 0, 0, 1, 0.00826564, 0, 0, 0.999996, 0.00826842, 0, 0, 0.999987, 0.00827589, 0, 0, 0.999967, 0.00829167, 0, 0, 0.999933, 0.00832037, 0, 0, 0.999876, 0.00836768, 0, 1.09338e-05, 0.999786, 0.00844031, 0, 0.000427145, 0.999655, 0.00854603, 0, 0.0016384, 0.999468, 0.00869337, 0, 0.00372392, 0.999203, 0.008891, 0, 0.00668513, 0.998803, 0.00914387, 0, 0.0104968, 0.99748, 0.00935838, 0, 0.015125, 0.994446, 0.00933309, 0, 0.0205338, 0.99292, 0.00953084, 0, 0.0266884, 0.991414, 0.0097893, 0, 0.0335565, 0.989049, 0.0100228, 0, 0.0411086, 0.98582, 0.0101664, 0, 0.0493181, 0.982441, 0.0103582, 0, 0.0581613, 0.978595, 0.0105292, 0, 0.0676169, 0.973495, 0.0106274, 0, 0.0776661, 0.968405, 0.0107261, 0, 0.0882926, 0.962717, 0.0108234, 0, 0.0994817, 0.955478, 0.0108102, 0, 0.111221, 0.948275, 0.0107914, 0, 0.123499, 0.940006, 0.0107161, 0, 0.136308, 0.930831, 0.0106309, 0, 0.149639, 0.920648, 0.0104083, 0, 0.163485, 0.910205, 0.0102312, 0, 0.177843, 0.898445, 0.0100051, 0, 0.192707, 0.885986, 0.00971928, 0, 0.208077, 0.872204, 0.00940747, 0, 0.22395, 0.858436, 0.0091085, 0, 0.240326, 0.843454, 0.00876595, 0, 0.257208, 0.827437, 0.00839794, 0, 0.274596, 0.811488, 0.00803692, 0, 0.292496, 0.796039, 0.00767352, 0, 0.310911, 0.781083, 0.0073097, 0, 0.329849, 0.767642, 0.00694032, 0, 0.349316, 0.753901, 0.00657476, 0, 0.369323, 0.740131, 0.00622699, 0, 0.38988, 0.725845, 0.0058838, 0, 0.410999, 0.710991, 0.00555586, 0, 0.432696, 0.696002, 0.00523089, 0, 0.454987, 0.680461, 0.00492494, 0, 0.47789, 0.664875, 0.00463464, 0, 0.501426, 0.649273, 0.00435422, 0, 0.52562, 0.63302, 0.0040875, 0, 0.550498, 0.61705, 0.00384075, 0, 0.576089, 0.601154, 0.00359557, 0, 0.602427, 0.586008, 0.00337636, 0, 0.629544, 0.570699, 0.00316019, 0, 0.657479, 0.555166, 0.00296033, 0, 0.686264, 0.539645, 0.00277552, 0, 0.715924, 0.524159, 0.00259499, 0, 0.746459, 0.508682, 0.00243257, 0, 0.777789, 0.493163, 0.00227851, 0, 0.809524, 0.478004, 0.00213083, 0, 0.84127, 0.46347, 0.00199502, 0, 0.873016, 0.448778, 0.00186967, 0, 0.904762, 0.434105, 0.00174732, 0, 0.936508, 0.419576, 0.00163861, 0, 0.968254, 0.405541, 0.00153341, 0, 1, 1, 0.0106462, 0, 0, 1, 0.0106462, 0, 0, 0.999999, 0.010647, 0, 0, 0.999995, 0.0106502, 0, 0, 0.999985, 0.0106589, 0, 0, 0.999964, 0.0106773, 0, 0, 0.999925, 0.0107106, 0, 0, 0.999861, 0.0107655, 0, 7.12986e-05, 0.999763, 0.0108497, 0, 0.000743959, 0.999616, 0.0109716, 0, 0.00227361, 0.999408, 0.0111408, 0, 0.0046983, 0.999112, 0.0113659, 0, 0.00800158, 0.998637, 0.0116475, 0, 0.0121493, 0.996223, 0.0117231, 0, 0.0171023, 0.994006, 0.0118064, 0, 0.0228218, 0.992444, 0.0120254, 0, 0.0292711, 0.991028, 0.0123314, 0, 0.036417, 0.98803, 0.0124954, 0, 0.0442295, 0.984816, 0.0126538, 0, 0.0526815, 0.981399, 0.0128537, 0, 0.0617492, 0.977085, 0.0129694, 0, 0.0714114, 0.972154, 0.013091, 0, 0.0816495, 0.966617, 0.0131166, 0, 0.0924472, 0.960628, 0.0131583, 0, 0.10379, 0.953295, 0.0131094, 0, 0.115665, 0.94575, 0.0129966, 0, 0.128062, 0.937654, 0.0128796, 0, 0.140972, 0.927716, 0.0126477, 0, 0.154387, 0.917932, 0.0123889, 0, 0.168301, 0.907719, 0.012131, 0, 0.182709, 0.89584, 0.0118013, 0, 0.197608, 0.883526, 0.0114145, 0, 0.212994, 0.870301, 0.0110075, 0, 0.228867, 0.856272, 0.0106019, 0, 0.245227, 0.842251, 0.0101938, 0, 0.262074, 0.826466, 0.00973254, 0, 0.279412, 0.810859, 0.0092846, 0, 0.297244, 0.795051, 0.00883304, 0, 0.315575, 0.780053, 0.00840272, 0, 0.334412, 0.76575, 0.00796438, 0, 0.35376, 0.752298, 0.00752526, 0, 0.373631, 0.739153, 0.00711486, 0, 0.394034, 0.725514, 0.00670361, 0, 0.414983, 0.711473, 0.00632656, 0, 0.436491, 0.696936, 0.00595206, 0, 0.458575, 0.682126, 0.00559191, 0, 0.481253, 0.667027, 0.00525362, 0, 0.504547, 0.651875, 0.00493805, 0, 0.528481, 0.636463, 0.00462848, 0, 0.553081, 0.620641, 0.00433936, 0, 0.578377, 0.604931, 0.00407, 0, 0.604404, 0.589549, 0.00380864, 0, 0.631197, 0.574712, 0.00357049, 0, 0.658795, 0.559775, 0.00334466, 0, 0.687238, 0.544514, 0.00312505, 0, 0.716559, 0.529555, 0.00293199, 0, 0.746776, 0.514402, 0.00274204, 0, 0.777849, 0.499302, 0.00256647, 0, 0.809524, 0.484114, 0.00239901, 0, 0.84127, 0.469308, 0.00225148, 0, 0.873016, 0.455133, 0.00210178, 0, 0.904762, 0.440939, 0.0019727, 0, 0.936508, 0.426627, 0.00184382, 0, 0.968254, 0.412509, 0.00172548, 0, 1, 1, 0.013628, 0, 0, 1, 0.0136281, 0, 0, 0.999999, 0.0136289, 0, 0, 0.999995, 0.0136327, 0, 0, 0.999983, 0.0136427, 0, 0, 0.99996, 0.0136638, 0, 0, 0.999917, 0.0137022, 0, 0, 0.999846, 0.0137652, 0, 0.000204597, 0.999736, 0.0138615, 0, 0.00116837, 0.999573, 0.0140007, 0, 0.00303325, 0.99934, 0.0141927, 0, 0.00580613, 0.999004, 0.0144457, 0, 0.00945626, 0.998407, 0.0147489, 0, 0.0139421, 0.995464, 0.014731, 0, 0.0192202, 0.993328, 0.0148283, 0, 0.0252495, 0.991799, 0.0150797, 0, 0.0319921, 0.990397, 0.0154316, 0, 0.0394138, 0.986835, 0.0155005, 0, 0.0474843, 0.983938, 0.0157308, 0, 0.0561763, 0.980154, 0.0158753, 0, 0.0654661, 0.975659, 0.0159581, 0, 0.0753326, 0.970171, 0.0159832, 0, 0.0857571, 0.964803, 0.0160084, 0, 0.0967236, 0.958366, 0.0159484, 0, 0.108218, 0.950613, 0.0158001, 0, 0.120227, 0.942874, 0.0155845, 0, 0.132741, 0.935005, 0.0154292, 0, 0.145751, 0.924991, 0.0150742, 0, 0.159249, 0.914814, 0.0146757, 0, 0.17323, 0.904743, 0.0143097, 0, 0.187687, 0.893216, 0.0138695, 0, 0.202619, 0.880769, 0.0133706, 0, 0.218021, 0.868136, 0.0128606, 0, 0.233894, 0.85469, 0.0123403, 0, 0.250238, 0.840593, 0.0118091, 0, 0.267052, 0.825808, 0.011253, 0, 0.284341, 0.81009, 0.0107099, 0, 0.302106, 0.79504, 0.0101636, 0, 0.320354, 0.779757, 0.00964041, 0, 0.33909, 0.764697, 0.00911896, 0, 0.358322, 0.750913, 0.00859533, 0, 0.378059, 0.738175, 0.00811592, 0, 0.398311, 0.725242, 0.00764504, 0, 0.41909, 0.711864, 0.00718885, 0, 0.440412, 0.698009, 0.00675843, 0, 0.462292, 0.683841, 0.00634984, 0, 0.484748, 0.669391, 0.00595502, 0, 0.507802, 0.654731, 0.00558671, 0, 0.531477, 0.639805, 0.00523578, 0, 0.555802, 0.624789, 0.00490834, 0, 0.580805, 0.609325, 0.00459448, 0, 0.606522, 0.593975, 0.00430342, 0, 0.63299, 0.578983, 0.00403019, 0, 0.66025, 0.564442, 0.0037707, 0, 0.688346, 0.549835, 0.0035316, 0, 0.717319, 0.535039, 0.00330255, 0, 0.7472, 0.520403, 0.00308932, 0, 0.777982, 0.505687, 0.00289335, 0, 0.809524, 0.490939, 0.00270818, 0, 0.84127, 0.476233, 0.0025343, 0, 0.873016, 0.461624, 0.00237097, 0, 0.904762, 0.447833, 0.00222065, 0, 0.936508, 0.433992, 0.00207561, 0, 0.968254, 0.420147, 0.00194955, 0, 1, 1, 0.0173415, 0, 0, 1, 0.0173416, 0, 0, 0.999999, 0.0173426, 0, 0, 0.999995, 0.0173468, 0, 0, 0.999983, 0.0173582, 0, 0, 0.999954, 0.0173822, 0, 0, 0.999908, 0.0174258, 0, 6.69501e-06, 0.999828, 0.0174973, 0, 0.000427399, 0.999705, 0.0176063, 0, 0.00171019, 0.999524, 0.0177631, 0, 0.0039248, 0.999263, 0.0179781, 0, 0.00705382, 0.998878, 0.018258, 0, 0.0110552, 0.998012, 0.0185551, 0, 0.0158812, 0.994614, 0.0184264, 0, 0.0214852, 0.993132, 0.0186385, 0, 0.0278239, 0.991563, 0.0189067, 0, 0.0348585, 0.989298, 0.0191577, 0, 0.0425544, 0.986036, 0.0192522, 0, 0.050881, 0.982558, 0.0194063, 0, 0.059811, 0.978531, 0.019486, 0, 0.0693209, 0.974198, 0.0195847, 0, 0.0793895, 0.968148, 0.0194749, 0, 0.0899984, 0.962565, 0.0194277, 0, 0.101132, 0.956041, 0.0192991, 0, 0.112775, 0.947749, 0.0189893, 0, 0.124917, 0.94018, 0.018704, 0, 0.137547, 0.93165, 0.0183458, 0, 0.150655, 0.921798, 0.0178775, 0, 0.164236, 0.911573, 0.0173618, 0, 0.178281, 0.901569, 0.0168482, 0, 0.192788, 0.890341, 0.016265, 0, 0.207752, 0.877835, 0.0156199, 0, 0.223171, 0.865472, 0.0149516, 0, 0.239044, 0.852905, 0.0143274, 0, 0.255371, 0.838906, 0.0136643, 0, 0.272153, 0.824888, 0.0129903, 0, 0.289393, 0.809977, 0.0123218, 0, 0.307093, 0.794697, 0.0116572, 0, 0.325259, 0.780028, 0.0110307, 0, 0.343896, 0.765124, 0.0104236, 0, 0.363012, 0.750411, 0.0098219, 0, 0.382617, 0.737264, 0.00924397, 0, 0.402719, 0.724799, 0.00868719, 0, 0.423332, 0.712253, 0.00816476, 0, 0.444469, 0.699267, 0.00767262, 0, 0.466146, 0.685618, 0.00719746, 0, 0.488383, 0.671736, 0.00673916, 0, 0.511199, 0.657777, 0.00631937, 0, 0.534618, 0.643497, 0.00592411, 0, 0.558668, 0.62889, 0.00553928, 0, 0.58338, 0.614299, 0.0051934, 0, 0.608787, 0.599197, 0.00485985, 0, 0.634929, 0.584175, 0.00454357, 0, 0.661849, 0.569541, 0.00425787, 0, 0.689594, 0.555193, 0.00397905, 0, 0.718211, 0.540947, 0.00372364, 0, 0.747742, 0.526593, 0.00348599, 0, 0.778205, 0.512335, 0.00326103, 0, 0.80953, 0.498017, 0.00305137, 0, 0.84127, 0.483609, 0.00285485, 0, 0.873016, 0.469368, 0.00267472, 0, 0.904762, 0.455037, 0.00249945, 0, 0.936508, 0.441493, 0.00234792, 0, 0.968254, 0.428147, 0.00219936, 0, 1, 1, 0.0219422, 0, 0, 1, 0.0219423, 0, 0, 0.999998, 0.0219434, 0, 0, 0.999993, 0.0219481, 0, 0, 0.999981, 0.021961, 0, 0, 0.999949, 0.0219879, 0, 0, 0.999896, 0.0220367, 0, 5.93194e-05, 0.999808, 0.0221167, 0, 0.00075364, 0.99967, 0.0222383, 0, 0.00237884, 0.999466, 0.0224125, 0, 0.00495612, 0.999174, 0.0226495, 0, 0.00844887, 0.998725, 0.0229525, 0, 0.0128058, 0.996979, 0.0231123, 0, 0.0179742, 0.994317, 0.0230742, 0, 0.0239047, 0.992781, 0.0232895, 0, 0.0305526, 0.991191, 0.0235734, 0, 0.0378786, 0.987787, 0.0236152, 0, 0.0458475, 0.985092, 0.0237994, 0, 0.0544287, 0.981121, 0.0238553, 0, 0.0635952, 0.976924, 0.0238706, 0, 0.0733233, 0.97218, 0.0238704, 0, 0.0835922, 0.965956, 0.0236598, 0, 0.0943839, 0.959998, 0.0234735, 0, 0.105682, 0.953245, 0.0232277, 0, 0.117474, 0.944445, 0.0226973, 0, 0.129747, 0.937087, 0.0223527, 0, 0.142491, 0.928341, 0.0218144, 0, 0.155697, 0.9184, 0.0211516, 0, 0.169358, 0.907959, 0.0204553, 0, 0.183469, 0.89808, 0.0197673, 0, 0.198024, 0.887047, 0.0189915, 0, 0.21302, 0.875221, 0.0182082, 0, 0.228455, 0.86269, 0.0173584, 0, 0.244329, 0.850735, 0.0165718, 0, 0.260639, 0.837545, 0.0157524, 0, 0.277389, 0.823639, 0.0149482, 0, 0.29458, 0.809699, 0.0141431, 0, 0.312216, 0.794797, 0.0133527, 0, 0.3303, 0.780578, 0.0126193, 0, 0.34884, 0.766019, 0.0118914, 0, 0.367842, 0.751447, 0.0111839, 0, 0.387315, 0.737275, 0.010514, 0, 0.40727, 0.724545, 0.00987277, 0, 0.427717, 0.712644, 0.00926569, 0, 0.448671, 0.700432, 0.00869029, 0, 0.470149, 0.687664, 0.00814691, 0, 0.492167, 0.674288, 0.00763012, 0, 0.514746, 0.660966, 0.00714437, 0, 0.537911, 0.647264, 0.00668457, 0, 0.561688, 0.633431, 0.00626581, 0, 0.586108, 0.619133, 0.00585593, 0, 0.611206, 0.604935, 0.00548188, 0, 0.637022, 0.590236, 0.00513288, 0, 0.663599, 0.575473, 0.0047906, 0, 0.690989, 0.561228, 0.00448895, 0, 0.719242, 0.547054, 0.00420233, 0, 0.748411, 0.533175, 0.00392869, 0, 0.778531, 0.519163, 0.00367445, 0, 0.809583, 0.505328, 0.00344097, 0, 0.84127, 0.491446, 0.00322003, 0, 0.873016, 0.477356, 0.00301283, 0, 0.904762, 0.46356, 0.00282592, 0, 0.936508, 0.449623, 0.00264956, 0, 0.968254, 0.436068, 0.00246956, 0, 1, 1, 0.0276135, 0, 0, 1, 0.0276136, 0, 0, 0.999998, 0.0276148, 0, 0, 0.999993, 0.0276201, 0, 0, 0.999976, 0.0276342, 0, 0, 0.999945, 0.027664, 0, 0, 0.999884, 0.0277179, 0, 0.00018679, 0.999784, 0.027806, 0, 0.00119607, 0.99963, 0.0279394, 0, 0.00318407, 0.999401, 0.0281295, 0, 0.00613601, 0.999066, 0.0283858, 0, 0.00999963, 0.998524, 0.0287027, 0, 0.0147164, 0.995702, 0.0286256, 0, 0.0202295, 0.993593, 0.0286733, 0, 0.0264876, 0.992067, 0.0288989, 0, 0.0334452, 0.990548, 0.0292135, 0, 0.0410621, 0.986775, 0.0291296, 0, 0.0493032, 0.984054, 0.0293099, 0, 0.0581381, 0.979481, 0.0291881, 0, 0.0675397, 0.975297, 0.0291598, 0, 0.0774848, 0.96981, 0.028954, 0, 0.0879528, 0.963524, 0.028628, 0, 0.0989258, 0.957398, 0.0283135, 0, 0.110388, 0.950088, 0.0278469, 0, 0.122327, 0.941538, 0.0271798, 0, 0.134729, 0.933332, 0.0265388, 0, 0.147587, 0.924392, 0.0257776, 0, 0.160889, 0.914581, 0.024916, 0, 0.174631, 0.904347, 0.0240242, 0, 0.188806, 0.894324, 0.0231229, 0, 0.203409, 0.883724, 0.022153, 0, 0.218437, 0.872207, 0.0211355, 0, 0.233888, 0.859927, 0.0201048, 0, 0.249761, 0.848373, 0.0191263, 0, 0.266056, 0.836023, 0.0181306, 0, 0.282774, 0.82289, 0.0171718, 0, 0.299917, 0.809324, 0.0162196, 0, 0.317488, 0.795361, 0.0152622, 0, 0.335493, 0.781253, 0.01439, 0, 0.353936, 0.767338, 0.013533, 0, 0.372825, 0.753156, 0.0127244, 0, 0.392168, 0.739122, 0.0119454, 0, 0.411976, 0.725358, 0.0112054, 0, 0.432259, 0.712949, 0.010487, 0, 0.453032, 0.701621, 0.00984032, 0, 0.47431, 0.689703, 0.00921495, 0, 0.496111, 0.677216, 0.00862492, 0, 0.518456, 0.664217, 0.00806882, 0, 0.541367, 0.65137, 0.00755922, 0, 0.564872, 0.638, 0.00705705, 0, 0.589001, 0.62453, 0.00661266, 0, 0.613789, 0.610601, 0.00618432, 0, 0.639277, 0.59676, 0.00578033, 0, 0.66551, 0.582433, 0.00540927, 0, 0.692539, 0.568026, 0.00506104, 0, 0.720422, 0.55414, 0.0047353, 0, 0.749216, 0.540178, 0.00442889, 0, 0.778974, 0.526513, 0.00414363, 0, 0.809711, 0.512954, 0.00388237, 0, 0.84127, 0.499403, 0.00362875, 0, 0.873016, 0.486026, 0.00340827, 0, 0.904762, 0.472345, 0.00318598, 0, 0.936508, 0.458828, 0.00297635, 0, 0.968254, 0.445379, 0.00279447, 0, 1, 1, 0.0345716, 0, 0, 1, 0.0345717, 0, 0, 0.999999, 0.034573, 0, 0, 0.999991, 0.0345787, 0, 0, 0.999974, 0.0345941, 0, 0, 0.999937, 0.0346263, 0, 1.88589e-06, 0.999869, 0.0346847, 0, 0.000409238, 0.999757, 0.0347798, 0, 0.0017674, 0.999582, 0.0349233, 0, 0.00413658, 0.999322, 0.0351265, 0, 0.00747408, 0.998939, 0.0353967, 0, 0.0117157, 0.998219, 0.0357018, 0, 0.0167966, 0.994974, 0.0354726, 0, 0.0226572, 0.993201, 0.0355621, 0, 0.0292445, 0.991573, 0.0357641, 0, 0.0365123, 0.989301, 0.0359252, 0, 0.0444203, 0.985712, 0.0358017, 0, 0.0529334, 0.982411, 0.0358353, 0, 0.0620214, 0.977827, 0.035617, 0, 0.0716574, 0.973278, 0.0354398, 0, 0.0818186, 0.967397, 0.0350483, 0, 0.0924846, 0.960696, 0.0344795, 0, 0.103638, 0.954349, 0.0339861, 0, 0.115263, 0.946066, 0.0331323, 0, 0.127348, 0.938012, 0.032359, 0, 0.13988, 0.929413, 0.0314413, 0, 0.152849, 0.920355, 0.0304103, 0, 0.166248, 0.910586, 0.0292785, 0, 0.18007, 0.900609, 0.0281391, 0, 0.194308, 0.890093, 0.0269103, 0, 0.208958, 0.880013, 0.0257269, 0, 0.224018, 0.869001, 0.0244671, 0, 0.239485, 0.85751, 0.0232252, 0, 0.255359, 0.84582, 0.0220117, 0, 0.271638, 0.834383, 0.0208274, 0, 0.288324, 0.822158, 0.0196628, 0, 0.305419, 0.809056, 0.0185306, 0, 0.322927, 0.795832, 0.0174174, 0, 0.340851, 0.782547, 0.0163758, 0, 0.359199, 0.7689, 0.015391, 0, 0.377975, 0.755526, 0.0144488, 0, 0.397189, 0.741681, 0.0135372, 0, 0.416851, 0.728178, 0.0126957, 0, 0.436971, 0.714642, 0.0118812, 0, 0.457564, 0.702756, 0.0111165, 0, 0.478644, 0.69175, 0.0104145, 0, 0.500229, 0.680159, 0.00974439, 0, 0.522339, 0.668073, 0.00911926, 0, 0.544997, 0.655405, 0.00851393, 0, 0.56823, 0.642921, 0.00797637, 0, 0.592068, 0.629993, 0.00745119, 0, 0.616546, 0.616828, 0.00696972, 0, 0.641705, 0.603305, 0.00652425, 0, 0.66759, 0.589833, 0.00610188, 0, 0.694255, 0.575945, 0.00570834, 0, 0.72176, 0.561745, 0.00533384, 0, 0.750168, 0.548277, 0.00500001, 0, 0.779545, 0.534467, 0.00467582, 0, 0.809933, 0.521032, 0.00438092, 0, 0.841272, 0.507877, 0.00410348, 0, 0.873016, 0.494654, 0.00383618, 0, 0.904762, 0.481592, 0.00358699, 0, 0.936508, 0.468509, 0.00337281, 0, 0.968254, 0.455293, 0.00316196, 0, 1, 1, 0.0430698, 0, 0, 1, 0.0430699, 0, 0, 0.999998, 0.0430713, 0, 0, 0.999991, 0.0430773, 0, 0, 0.99997, 0.0430936, 0, 0, 0.999928, 0.0431277, 0, 4.06396e-05, 0.999852, 0.0431893, 0, 0.000744376, 0.999724, 0.0432895, 0, 0.0024806, 0.999527, 0.0434397, 0, 0.00524779, 0.99923, 0.0436507, 0, 0.00898164, 0.998783, 0.0439255, 0, 0.0136083, 0.997507, 0.0441104, 0, 0.0190582, 0.994418, 0.0438225, 0, 0.0252694, 0.992864, 0.0439396, 0, 0.0321879, 0.991127, 0.0440962, 0, 0.039767, 0.987331, 0.0438408, 0, 0.0479667, 0.984819, 0.0438991, 0, 0.056752, 0.980384, 0.0435906, 0, 0.0660929, 0.975846, 0.0432543, 0, 0.075963, 0.970748, 0.0428293, 0, 0.0863398, 0.964303, 0.042153, 0, 0.0972035, 0.95772, 0.0414111, 0, 0.108537, 0.950747, 0.0405893, 0, 0.120325, 0.942533, 0.0394887, 0, 0.132554, 0.934045, 0.0383544, 0, 0.145215, 0.924942, 0.037057, 0, 0.158296, 0.915811, 0.0356993, 0, 0.17179, 0.90612, 0.0342401, 0, 0.185691, 0.896434, 0.0328078, 0, 0.199993, 0.886021, 0.031288, 0, 0.214691, 0.876081, 0.0297776, 0, 0.229782, 0.865608, 0.0282334, 0, 0.245265, 0.854924, 0.026749, 0, 0.261138, 0.843607, 0.02526, 0, 0.277401, 0.832456, 0.0238214, 0, 0.294056, 0.821342, 0.0224682, 0, 0.311104, 0.809303, 0.0211297, 0, 0.328548, 0.796468, 0.0198387, 0, 0.346394, 0.784046, 0.0186227, 0, 0.364645, 0.771262, 0.0174561, 0, 0.38331, 0.758118, 0.0163806, 0, 0.402396, 0.745075, 0.0153287, 0, 0.421912, 0.731926, 0.0143647, 0, 0.44187, 0.71863, 0.0134363, 0, 0.462283, 0.705414, 0.0125603, 0, 0.483165, 0.693792, 0.0117508, 0, 0.504535, 0.683108, 0.0110016, 0, 0.52641, 0.67183, 0.0102757, 0, 0.548816, 0.66015, 0.00962044, 0, 0.571776, 0.647907, 0.00898031, 0, 0.595323, 0.635734, 0.00840811, 0, 0.619489, 0.623208, 0.00786211, 0, 0.644317, 0.610438, 0.00734953, 0, 0.669852, 0.597345, 0.00687688, 0, 0.696148, 0.584138, 0.00643469, 0, 0.723267, 0.5707, 0.00602236, 0, 0.75128, 0.556966, 0.0056324, 0, 0.780258, 0.543607, 0.00528277, 0, 0.810268, 0.530213, 0.00493999, 0, 0.841311, 0.516912, 0.00462265, 0, 0.873016, 0.503916, 0.0043307, 0, 0.904762, 0.491146, 0.00406858, 0, 0.936508, 0.478439, 0.00381436, 0, 0.968254, 0.465834, 0.00358003, 0, 1, 1, 0.0534039, 0, 0, 1, 0.053404, 0, 0, 0.999998, 0.0534055, 0, 0, 0.999989, 0.0534116, 0, 0, 0.999968, 0.0534283, 0, 0, 0.999918, 0.0534633, 0, 0.000155895, 0.99983, 0.0535262, 0, 0.00120914, 0.999685, 0.0536281, 0, 0.00334944, 0.999461, 0.0537799, 0, 0.00653077, 0.999119, 0.0539902, 0, 0.0106718, 0.998582, 0.0542524, 0, 0.0156907, 0.995919, 0.0540318, 0, 0.0215147, 0.993735, 0.0538914, 0, 0.0280801, 0.992126, 0.0539557, 0, 0.0353323, 0.990266, 0.0540401, 0, 0.0432247, 0.986317, 0.0536064, 0, 0.0517172, 0.983213, 0.0534425, 0, 0.0607754, 0.978303, 0.0528622, 0, 0.0703698, 0.973665, 0.0523363, 0, 0.0804742, 0.968091, 0.0516165, 0, 0.0910667, 0.961026, 0.0505434, 0, 0.102128, 0.954333, 0.049523, 0, 0.113641, 0.946372, 0.0481698, 0, 0.125591, 0.938254, 0.0467674, 0, 0.137965, 0.929516, 0.0452341, 0, 0.150754, 0.920106, 0.0435083, 0, 0.163947, 0.910899, 0.0417399, 0, 0.177537, 0.901532, 0.0399389, 0, 0.191516, 0.891919, 0.0380901, 0, 0.205881, 0.882006, 0.0362341, 0, 0.220626, 0.871965, 0.0343444, 0, 0.235749, 0.862145, 0.0324832, 0, 0.251248, 0.852058, 0.0306681, 0, 0.267121, 0.84161, 0.0289097, 0, 0.283368, 0.830806, 0.0272079, 0, 0.299992, 0.820476, 0.0256089, 0, 0.316992, 0.809514, 0.0240394, 0, 0.334374, 0.797865, 0.0225379, 0, 0.35214, 0.785621, 0.0211235, 0, 0.370296, 0.773765, 0.0197908, 0, 0.388849, 0.761629, 0.0185235, 0, 0.407807, 0.748891, 0.0173358, 0, 0.427178, 0.736437, 0.0162305, 0, 0.446974, 0.723707, 0.0151778, 0, 0.467207, 0.710606, 0.0141791, 0, 0.487892, 0.698019, 0.0132592, 0, 0.509046, 0.686203, 0.0123887, 0, 0.530687, 0.675692, 0.0115976, 0, 0.552839, 0.664826, 0.0108325, 0, 0.575527, 0.65349, 0.0101348, 0, 0.59878, 0.641774, 0.00947756, 0, 0.622634, 0.629794, 0.00886058, 0, 0.647128, 0.617647, 0.00828526, 0, 0.672308, 0.60534, 0.00775312, 0, 0.698231, 0.592718, 0.00726033, 0, 0.724958, 0.579746, 0.00679731, 0, 0.752563, 0.566763, 0.00636111, 0, 0.781127, 0.553515, 0.00595228, 0, 0.810733, 0.540118, 0.00556876, 0, 0.841426, 0.527325, 0.00523051, 0, 0.873016, 0.514265, 0.00490712, 0, 0.904762, 0.501406, 0.00460297, 0, 0.936508, 0.488922, 0.00431247, 0, 0.968254, 0.476541, 0.0040472, 0, 1, 1, 0.0659184, 0, 0, 1, 0.0659185, 0, 0, 0.999998, 0.06592, 0, 0, 0.999988, 0.0659259, 0, 0, 0.999963, 0.0659423, 0, 0, 0.999907, 0.0659764, 0, 0.000374198, 0.999806, 0.0660376, 0, 0.00182071, 0.999639, 0.0661361, 0, 0.0043894, 0.999378, 0.0662814, 0, 0.00800055, 0.998985, 0.0664779, 0, 0.0125594, 0.998285, 0.0666914, 0, 0.0179786, 0.995071, 0.0661989, 0, 0.0241822, 0.993172, 0.0660454, 0, 0.031106, 0.991438, 0.0660105, 0, 0.0386952, 0.988428, 0.0656875, 0, 0.0469032, 0.985218, 0.0652913, 0, 0.0556905, 0.981128, 0.0647107, 0, 0.065023, 0.976015, 0.0638491, 0, 0.0748717, 0.97097, 0.062993, 0, 0.0852112, 0.964582, 0.0617927, 0, 0.0960199, 0.957383, 0.0603626, 0, 0.107279, 0.949969, 0.0588128, 0, 0.118971, 0.941843, 0.0570274, 0, 0.131084, 0.933624, 0.0551885, 0, 0.143604, 0.924543, 0.053122, 0, 0.156521, 0.914919, 0.0508897, 0, 0.169825, 0.905773, 0.0486418, 0, 0.18351, 0.896434, 0.0463364, 0, 0.197569, 0.887195, 0.0440623, 0, 0.211997, 0.877706, 0.0417799, 0, 0.226789, 0.867719, 0.03945, 0, 0.241944, 0.858587, 0.037243, 0, 0.257458, 0.849317, 0.0350956, 0, 0.273331, 0.839585, 0.0329852, 0, 0.289563, 0.829856, 0.0310028, 0, 0.306154, 0.819589, 0.0290953, 0, 0.323108, 0.809714, 0.0272738, 0, 0.340426, 0.79934, 0.0255631, 0, 0.358113, 0.788224, 0.0239175, 0, 0.376175, 0.776619, 0.0223831, 0, 0.394616, 0.76521, 0.0209298, 0, 0.413445, 0.753716, 0.0195786, 0, 0.432671, 0.741564, 0.0183001, 0, 0.452305, 0.729413, 0.0171259, 0, 0.472358, 0.717146, 0.0159933, 0, 0.492845, 0.70436, 0.0149495, 0, 0.513783, 0.69219, 0.0139681, 0, 0.535189, 0.680289, 0.0130577, 0, 0.557087, 0.669611, 0.0122198, 0, 0.5795, 0.659113, 0.0114174, 0, 0.602459, 0.648148, 0.0106729, 0, 0.625997, 0.636905, 0.00998997, 0, 0.650154, 0.625154, 0.00934313, 0, 0.674976, 0.613481, 0.00874839, 0, 0.700518, 0.60154, 0.00818265, 0, 0.726845, 0.58943, 0.00766889, 0, 0.754032, 0.576828, 0.00717153, 0, 0.782167, 0.564194, 0.00672696, 0, 0.811344, 0.551501, 0.00630863, 0, 0.841644, 0.538635, 0.00592177, 0, 0.873016, 0.525724, 0.00554888, 0, 0.904762, 0.513209, 0.00520225, 0, 0.936508, 0.500457, 0.00488231, 0, 0.968254, 0.48799, 0.00457153, 0, 1, 1, 0.0810131, 0, 0, 1, 0.0810133, 0, 0, 0.999997, 0.0810145, 0, 0, 0.999985, 0.08102, 0, 0, 0.999956, 0.0810347, 0, 1.95026e-05, 0.999893, 0.0810656, 0, 0.000719316, 0.999777, 0.0811205, 0, 0.00259774, 0.999583, 0.081208, 0, 0.00561807, 0.999281, 0.0813343, 0, 0.00967472, 0.998813, 0.0814969, 0, 0.0146627, 0.997597, 0.0815217, 0, 0.0204902, 0.994379, 0.0808502, 0, 0.0270802, 0.992744, 0.0806792, 0, 0.0343674, 0.990745, 0.0804589, 0, 0.0422974, 0.986646, 0.0796107, 0, 0.0508242, 0.983611, 0.0790913, 0, 0.0599087, 0.978869, 0.0780746, 0, 0.0695175, 0.973475, 0.0768218, 0, 0.0796223, 0.967845, 0.0754926, 0, 0.0901983, 0.960778, 0.0737063, 0, 0.101224, 0.953333, 0.0718052, 0, 0.112682, 0.945274, 0.0695946, 0, 0.124555, 0.936955, 0.0672492, 0, 0.136831, 0.928319, 0.0647732, 0, 0.149496, 0.919075, 0.0620947, 0, 0.162542, 0.909114, 0.0591816, 0, 0.175958, 0.900137, 0.0563917, 0, 0.189739, 0.891069, 0.0535392, 0, 0.203877, 0.882262, 0.0507642, 0, 0.218368, 0.873232, 0.0479793, 0, 0.233208, 0.864042, 0.045226, 0, 0.248393, 0.855002, 0.0425413, 0, 0.263923, 0.846569, 0.0400126, 0, 0.279796, 0.837714, 0.0375269, 0, 0.296012, 0.828918, 0.0352027, 0, 0.312573, 0.819783, 0.0330011, 0, 0.329479, 0.810129, 0.0308908, 0, 0.346734, 0.800866, 0.0289112, 0, 0.364342, 0.79093, 0.0270255, 0, 0.382307, 0.780593, 0.0252758, 0, 0.400637, 0.769511, 0.0236178, 0, 0.419337, 0.758558, 0.0220652, 0, 0.438418, 0.747632, 0.0206289, 0, 0.457889, 0.736146, 0.0192873, 0, 0.477761, 0.724093, 0.0180333, 0, 0.49805, 0.71234, 0.0168264, 0, 0.51877, 0.700201, 0.015746, 0, 0.53994, 0.687949, 0.0147027, 0, 0.561581, 0.676163, 0.0137512, 0, 0.583718, 0.665001, 0.0128655, 0, 0.60638, 0.65472, 0.0120366, 0, 0.629599, 0.644213, 0.0112604, 0, 0.653415, 0.633382, 0.0105413, 0, 0.677874, 0.62212, 0.00986498, 0, 0.70303, 0.610631, 0.00923308, 0, 0.728948, 0.599078, 0.00864206, 0, 0.755706, 0.587519, 0.00811784, 0, 0.783396, 0.575505, 0.00761237, 0, 0.812121, 0.563148, 0.00713949, 0, 0.841989, 0.550828, 0.00668379, 0, 0.873035, 0.538458, 0.00627715, 0, 0.904762, 0.525905, 0.00588336, 0, 0.936508, 0.513517, 0.00552687, 0, 0.968254, 0.501395, 0.00519681, 0, 1, 1, 0.0991506, 0, 0, 1, 0.0991504, 0, 0, 0.999996, 0.0991515, 0, 0, 0.999984, 0.0991558, 0, 0, 0.999947, 0.0991672, 0, 0.000114389, 0.999874, 0.0991912, 0, 0.00121503, 0.999739, 0.0992331, 0, 0.00356108, 0.999514, 0.0992983, 0, 0.00705578, 0.999159, 0.0993877, 0, 0.011574, 0.998586, 0.0994837, 0, 0.017003, 0.995731, 0.0988425, 0, 0.0232484, 0.993384, 0.098276, 0, 0.0302318, 0.991615, 0.0979269, 0, 0.0378884, 0.989029, 0.0973432, 0, 0.0461641, 0.985373, 0.0963539, 0, 0.0550136, 0.981278, 0.0952306, 0, 0.0643988, 0.975777, 0.0936233, 0, 0.0742868, 0.970526, 0.0920219, 0, 0.0846501, 0.963755, 0.0898912, 0, 0.0954644, 0.956676, 0.0876064, 0, 0.106709, 0.948099, 0.0847751, 0, 0.118367, 0.939718, 0.0818638, 0, 0.130423, 0.931305, 0.078857, 0, 0.142862, 0.922342, 0.0756127, 0, 0.155674, 0.912842, 0.0721473, 0, 0.168849, 0.903304, 0.0686195, 0, 0.182378, 0.89411, 0.0650589, 0, 0.196255, 0.885512, 0.0616022, 0, 0.210473, 0.877193, 0.0582434, 0, 0.225027, 0.86877, 0.0548979, 0, 0.239915, 0.860267, 0.0516095, 0, 0.255132, 0.851915, 0.048468, 0, 0.270678, 0.843912, 0.0454447, 0, 0.286551, 0.83604, 0.0425612, 0, 0.302751, 0.828245, 0.0398752, 0, 0.31928, 0.820159, 0.0373198, 0, 0.336138, 0.81167, 0.034916, 0, 0.35333, 0.802659, 0.0326402, 0, 0.370858, 0.793921, 0.0304901, 0, 0.388728, 0.784713, 0.0284857, 0, 0.406944, 0.774946, 0.0266186, 0, 0.425515, 0.76448, 0.0248593, 0, 0.444449, 0.753793, 0.0232114, 0, 0.463756, 0.743506, 0.0217039, 0, 0.483447, 0.732555, 0.0202841, 0, 0.503535, 0.720965, 0.0189648, 0, 0.524036, 0.709422, 0.0177189, 0, 0.544968, 0.697756, 0.0165626, 0, 0.56635, 0.685565, 0.015483, 0, 0.588208, 0.673987, 0.0144892, 0, 0.610569, 0.66244, 0.0135607, 0, 0.633466, 0.651675, 0.0126956, 0, 0.656936, 0.641598, 0.0118788, 0, 0.681025, 0.63121, 0.0111261, 0, 0.705788, 0.620514, 0.010437, 0, 0.731289, 0.609366, 0.00978747, 0, 0.757606, 0.598137, 0.00917257, 0, 0.784834, 0.586966, 0.00859778, 0, 0.813085, 0.575549, 0.00806803, 0, 0.842485, 0.563797, 0.00757294, 0, 0.87313, 0.551758, 0.00710592, 0, 0.904762, 0.539894, 0.0066841, 0, 0.936508, 0.527901, 0.00627901, 0, 0.968254, 0.515819, 0.00590506, 0, 1, 1, 0.120864, 0, 0, 1, 0.120864, 0, 0, 0.999996, 0.120864, 0, 0, 0.99998, 0.120867, 0, 0, 0.99994, 0.120872, 0, 0.000323781, 0.999852, 0.120884, 0, 0.00188693, 0.999693, 0.120903, 0, 0.00473489, 0.999426, 0.120929, 0, 0.00872704, 0.999002, 0.120955, 0, 0.0137237, 0.998235, 0.120918, 0, 0.0196068, 0.994608, 0.119764, 0, 0.0262803, 0.992997, 0.119265, 0, 0.0336657, 0.990968, 0.11863, 0, 0.0416987, 0.987002, 0.117261, 0, 0.0503261, 0.983524, 0.116009, 0, 0.0595035, 0.97875, 0.114252, 0, 0.0691935, 0.972652, 0.11193, 0, 0.0793645, 0.966613, 0.109555, 0, 0.0899894, 0.959275, 0.106612, 0, 0.101045, 0.951272, 0.103375, 0, 0.112512, 0.942323, 0.0996594, 0, 0.124372, 0.933679, 0.0958841, 0, 0.136611, 0.924822, 0.0919265, 0, 0.149216, 0.915742, 0.0878061, 0, 0.162176, 0.906348, 0.0834894, 0, 0.175482, 0.896883, 0.079085, 0, 0.189125, 0.88774, 0.0746745, 0, 0.203098, 0.87986, 0.0705773, 0, 0.217396, 0.871998, 0.0665005, 0, 0.232015, 0.864325, 0.0625413, 0, 0.24695, 0.856685, 0.0586781, 0, 0.2622, 0.84925, 0.0550063, 0, 0.277761, 0.841719, 0.0514727, 0, 0.293634, 0.834755, 0.0481398, 0, 0.309819, 0.827853, 0.0450172, 0, 0.326315, 0.820888, 0.0420969, 0, 0.343126, 0.813616, 0.0393702, 0, 0.360254, 0.805767, 0.0367771, 0, 0.377701, 0.797338, 0.0343274, 0, 0.395474, 0.789122, 0.0320529, 0, 0.413577, 0.780601, 0.0299485, 0, 0.432018, 0.771424, 0.0279812, 0, 0.450804, 0.761502, 0.0261054, 0, 0.469944, 0.751166, 0.0243942, 0, 0.489451, 0.741276, 0.0228087, 0, 0.509337, 0.730898, 0.0213265, 0, 0.529617, 0.719878, 0.0199307, 0, 0.550307, 0.708379, 0.0186574, 0, 0.571428, 0.697165, 0.0174446, 0, 0.593003, 0.685554, 0.0163144, 0, 0.615059, 0.673631, 0.015276, 0, 0.637628, 0.662385, 0.0143003, 0, 0.660746, 0.651059, 0.0134112, 0, 0.68446, 0.640451, 0.0125794, 0, 0.70882, 0.630536, 0.011793, 0, 0.733893, 0.620316, 0.0110547, 0, 0.759756, 0.609722, 0.0103668, 0, 0.786505, 0.598804, 0.00973009, 0, 0.814259, 0.587871, 0.00912812, 0, 0.843157, 0.577121, 0.00858916, 0, 0.87334, 0.566019, 0.00807333, 0, 0.904762, 0.554664, 0.00759687, 0, 0.936508, 0.543101, 0.00714759, 0, 0.968254, 0.531558, 0.00673418, 0, 1, 1, 0.146767, 0, 0, 1, 0.146767, 0, 0, 0.999997, 0.146767, 0, 0, 0.999977, 0.146765, 0, 3.20658e-06, 0.999929, 0.146762, 0, 0.000682576, 0.999823, 0.146753, 0, 0.00276402, 0.999633, 0.146735, 0, 0.00614771, 0.999314, 0.146699, 0, 0.0106613, 0.998796, 0.14662, 0, 0.0161546, 0.997124, 0.146107, 0, 0.0225063, 0.994062, 0.144857, 0, 0.0296198, 0.992154, 0.144011, 0, 0.037417, 0.989186, 0.142712, 0, 0.0458348, 0.985279, 0.140926, 0, 0.0548211, 0.980826, 0.13885, 0, 0.0643326, 0.975056, 0.136168, 0, 0.074333, 0.969005, 0.133217, 0, 0.0847917, 0.961554, 0.12959, 0, 0.0956828, 0.954206, 0.125886, 0, 0.106984, 0.945046, 0.121335, 0, 0.118675, 0.935678, 0.116492, 0, 0.130741, 0.926748, 0.111635, 0, 0.143166, 0.917764, 0.106625, 0, 0.155939, 0.908358, 0.101325, 0, 0.169049, 0.899219, 0.0960249, 0, 0.182487, 0.890089, 0.0906527, 0, 0.196245, 0.881488, 0.0853905, 0, 0.210317, 0.874031, 0.0804177, 0, 0.224697, 0.866932, 0.0756005, 0, 0.23938, 0.859976, 0.0709019, 0, 0.254364, 0.853375, 0.0664391, 0, 0.269646, 0.846971, 0.0622012, 0, 0.285223, 0.840483, 0.058129, 0, 0.301096, 0.833969, 0.0542762, 0, 0.317265, 0.82806, 0.0507042, 0, 0.333729, 0.822128, 0.047368, 0, 0.350491, 0.815989, 0.044272, 0, 0.367554, 0.809336, 0.0413444, 0, 0.38492, 0.802177, 0.038601, 0, 0.402594, 0.79441, 0.0360227, 0, 0.420582, 0.786573, 0.0336383, 0, 0.438891, 0.778619, 0.0314321, 0, 0.457527, 0.77, 0.029362, 0, 0.476499, 0.760698, 0.0274102, 0, 0.49582, 0.750932, 0.0256146, 0, 0.5155, 0.740993, 0.023974, 0, 0.535555, 0.731159, 0.0224182, 0, 0.556, 0.720836, 0.0209889, 0, 0.576855, 0.709913, 0.0196411, 0, 0.598143, 0.698415, 0.0183824, 0, 0.619888, 0.68745, 0.0172222, 0, 0.642123, 0.676154, 0.0161509, 0, 0.664883, 0.664383, 0.0151397, 0, 0.688211, 0.6533, 0.0141873, 0, 0.71216, 0.642072, 0.0133105, 0, 0.736792, 0.631412, 0.0124932, 0, 0.762186, 0.621622, 0.0117408, 0, 0.788439, 0.611681, 0.0110358, 0, 0.815672, 0.60142, 0.0103775, 0, 0.844034, 0.59083, 0.00975623, 0, 0.873699, 0.580254, 0.00918084, 0, 0.904765, 0.569841, 0.00864721, 0, 0.936508, 0.559224, 0.00815731, 0, 0.968254, 0.548315, 0.00767924, 0, 1, 1, 0.177563, 0, 0, 1, 0.177563, 0, 0, 0.999994, 0.177562, 0, 0, 0.999972, 0.177555, 0, 6.64171e-05, 0.999914, 0.177536, 0, 0.0012276, 0.999787, 0.177496, 0, 0.00388025, 0.999556, 0.17742, 0, 0.00783463, 0.999165, 0.177285, 0, 0.0128953, 0.9985, 0.177037, 0, 0.0189053, 0.995388, 0.175634, 0, 0.025742, 0.993102, 0.174375, 0, 0.033309, 0.990992, 0.173121, 0, 0.0415298, 0.986932, 0.170896, 0, 0.0503425, 0.982786, 0.16847, 0, 0.0596964, 0.977592, 0.165455, 0, 0.0695498, 0.971075, 0.161676, 0, 0.0798676, 0.963967, 0.157458, 0, 0.0906201, 0.956397, 0.152836, 0, 0.101783, 0.947489, 0.147467, 0, 0.113333, 0.937564, 0.14145, 0, 0.125254, 0.928182, 0.135383, 0, 0.137529, 0.919027, 0.129212, 0, 0.150144, 0.909618, 0.12276, 0, 0.163088, 0.900492, 0.116273, 0, 0.176351, 0.891671, 0.1098, 0, 0.189924, 0.883146, 0.103362, 0, 0.203799, 0.875151, 0.0970799, 0, 0.21797, 0.868338, 0.0911732, 0, 0.232433, 0.862033, 0.0854966, 0, 0.247182, 0.856107, 0.0800691, 0, 0.262216, 0.850644, 0.0749618, 0, 0.27753, 0.845261, 0.070079, 0, 0.293124, 0.839885, 0.0654321, 0, 0.308997, 0.834609, 0.0610975, 0, 0.325149, 0.829083, 0.0569741, 0, 0.341581, 0.82404, 0.0531736, 0, 0.358294, 0.818968, 0.049665, 0, 0.37529, 0.813496, 0.0463856, 0, 0.392573, 0.807533, 0.0433217, 0, 0.410148, 0.80099, 0.0404402, 0, 0.428019, 0.793891, 0.0377578, 0, 0.446192, 0.786281, 0.0352616, 0, 0.464676, 0.778773, 0.0329577, 0, 0.483478, 0.770737, 0.030808, 0, 0.502608, 0.762094, 0.0287964, 0, 0.522079, 0.752898, 0.0269254, 0, 0.541905, 0.743306, 0.0251926, 0, 0.5621, 0.733416, 0.023595, 0, 0.582684, 0.723742, 0.0221155, 0, 0.603677, 0.713542, 0.0207435, 0, 0.625106, 0.702755, 0.019434, 0, 0.646998, 0.691484, 0.0182046, 0, 0.66939, 0.680531, 0.0170771, 0, 0.692324, 0.66953, 0.0160339, 0, 0.715849, 0.658126, 0.0150677, 0, 0.740028, 0.646933, 0.0141551, 0, 0.764937, 0.636107, 0.0133179, 0, 0.790673, 0.625271, 0.0125284, 0, 0.817358, 0.615225, 0.0117937, 0, 0.84515, 0.605678, 0.0111181, 0, 0.874244, 0.59583, 0.0104759, 0, 0.904828, 0.585704, 0.00986672, 0, 0.936508, 0.575413, 0.00929712, 0, 0.968254, 0.565373, 0.00876713, 0, 1, 1, 0.214058, 0, 0, 0.999999, 0.214058, 0, 0, 0.999994, 0.214055, 0, 0, 0.999966, 0.214039, 0, 0.000259642, 0.999893, 0.213998, 0, 0.00200075, 0.999737, 0.21391, 0, 0.00527775, 0.999449, 0.213745, 0, 0.00983959, 0.99896, 0.213458, 0, 0.0154755, 0.9979, 0.212855, 0, 0.0220249, 0.994278, 0.210779, 0, 0.0293654, 0.992254, 0.20926, 0, 0.0374021, 0.98881, 0.206908, 0, 0.0460604, 0.984715, 0.204009, 0, 0.0552802, 0.979738, 0.200471, 0, 0.0650127, 0.972884, 0.195813, 0, 0.0752175, 0.965996, 0.190856, 0, 0.0858612, 0.957974, 0.185077, 0, 0.0969155, 0.949155, 0.17868, 0, 0.108356, 0.939288, 0.171513, 0, 0.120163, 0.928996, 0.163838, 0, 0.132319, 0.919563, 0.156246, 0, 0.144808, 0.910004, 0.148359, 0, 0.157618, 0.900791, 0.140417, 0, 0.170737, 0.892135, 0.132569, 0, 0.184155, 0.883803, 0.124741, 0, 0.197866, 0.876034, 0.117091, 0, 0.211861, 0.869219, 0.109835, 0, 0.226134, 0.863062, 0.102859, 0, 0.240682, 0.857795, 0.0962928, 0, 0.255499, 0.853009, 0.0900725, 0, 0.270583, 0.848603, 0.0842101, 0, 0.285931, 0.844335, 0.0786527, 0, 0.301542, 0.840208, 0.0734397, 0, 0.317415, 0.836035, 0.0685334, 0, 0.33355, 0.83172, 0.0639275, 0, 0.349948, 0.827135, 0.0595909, 0, 0.36661, 0.822797, 0.0556204, 0, 0.383539, 0.818387, 0.0519394, 0, 0.400738, 0.813565, 0.0485317, 0, 0.41821, 0.808142, 0.0453138, 0, 0.435961, 0.802212, 0.0423354, 0, 0.453997, 0.79573, 0.0395553, 0, 0.472324, 0.788741, 0.036988, 0, 0.490951, 0.781093, 0.0345688, 0, 0.509887, 0.773597, 0.0323297, 0, 0.529144, 0.765622, 0.0302719, 0, 0.548735, 0.757083, 0.0283477, 0, 0.568674, 0.747992, 0.0265562, 0, 0.588979, 0.738591, 0.0248844, 0, 0.609671, 0.728719, 0.0233342, 0, 0.630773, 0.719146, 0.0219081, 0, 0.652314, 0.709165, 0.0205711, 0, 0.674328, 0.69875, 0.0193248, 0, 0.696854, 0.687884, 0.0181582, 0, 0.719942, 0.676818, 0.0170746, 0, 0.743651, 0.666247, 0.0160718, 0, 0.768057, 0.655284, 0.0151262, 0, 0.793253, 0.64401, 0.0142561, 0, 0.819363, 0.633353, 0.0134327, 0, 0.846547, 0.622674, 0.012653, 0, 0.875017, 0.612265, 0.0119354, 0, 0.905021, 0.602455, 0.0112533, 0, 0.936508, 0.593147, 0.0106234, 0, 0.968254, 0.583592, 0.0100213, 0, 1, 1, 0.25717, 0, 0, 1, 0.25717, 0, 0, 0.999992, 0.257164, 0, 0, 0.999958, 0.257135, 0, 0.000641715, 0.999864, 0.25706, 0, 0.00305314, 0.999666, 0.256897, 0, 0.00700975, 0.999302, 0.256596, 0, 0.0122194, 0.998663, 0.25607, 0, 0.0184622, 0.995607, 0.254123, 0, 0.0255773, 0.993094, 0.252081, 0, 0.0334439, 0.9907, 0.249867, 0, 0.0419696, 0.98594, 0.246118, 0, 0.0510823, 0.981214, 0.242049, 0, 0.0607242, 0.974966, 0.236869, 0, 0.0708486, 0.967589, 0.230724, 0, 0.081417, 0.95915, 0.223635, 0, 0.0923974, 0.950257, 0.21596, 0, 0.103763, 0.940165, 0.207296, 0, 0.115491, 0.929396, 0.197901, 0, 0.127562, 0.919288, 0.188437, 0, 0.13996, 0.909428, 0.178762, 0, 0.15267, 0.900105, 0.169072, 0, 0.165679, 0.891418, 0.159478, 0, 0.178979, 0.883347, 0.15002, 0, 0.192558, 0.875992, 0.140813, 0, 0.20641, 0.869466, 0.13196, 0, 0.220529, 0.863699, 0.123501, 0, 0.234907, 0.858553, 0.115436, 0, 0.249542, 0.854379, 0.107901, 0, 0.264428, 0.850894, 0.10088, 0, 0.279564, 0.847632, 0.0942296, 0, 0.294947, 0.844571, 0.0879861, 0, 0.310575, 0.84163, 0.0821534, 0, 0.326448, 0.838542, 0.0766409, 0, 0.342566, 0.835412, 0.0715322, 0, 0.358929, 0.831899, 0.0666883, 0, 0.37554, 0.828177, 0.0622175, 0, 0.392399, 0.82416, 0.0580452, 0, 0.409511, 0.820393, 0.054267, 0, 0.426878, 0.816068, 0.0507172, 0, 0.444506, 0.811201, 0.0474041, 0, 0.4624, 0.805785, 0.0443174, 0, 0.480566, 0.799878, 0.0414562, 0, 0.499013, 0.793469, 0.0388147, 0, 0.517749, 0.786473, 0.0363453, 0, 0.536785, 0.778874, 0.0340225, 0, 0.556134, 0.771277, 0.0318599, 0, 0.575809, 0.763426, 0.0298859, 0, 0.595827, 0.755044, 0.0280357, 0, 0.616207, 0.746161, 0.0262979, 0, 0.636973, 0.737124, 0.0247295, 0, 0.65815, 0.72761, 0.0232514, 0, 0.679772, 0.717822, 0.0218755, 0, 0.701876, 0.708279, 0.0205942, 0, 0.724509, 0.698333, 0.0193947, 0, 0.74773, 0.68802, 0.0182717, 0, 0.771609, 0.677321, 0.0172044, 0, 0.79624, 0.666504, 0.0162122, 0, 0.821743, 0.656184, 0.0152924, 0, 0.84828, 0.64556, 0.0144326, 0, 0.876069, 0.634636, 0.0136157, 0, 0.905404, 0.624124, 0.0128612, 0, 0.936508, 0.613914, 0.0121435, 0, 0.968254, 0.603589, 0.0114887, 0, 1, 1, 0.307946, 0, 0, 0.999999, 0.307945, 0, 0, 0.999988, 0.307934, 0, 2.04479e-05, 0.999944, 0.307886, 0, 0.00127833, 0.999824, 0.307756, 0, 0.00445047, 0.999565, 0.30748, 0, 0.00914673, 0.999085, 0.306966, 0, 0.0150498, 0.998103, 0.306004, 0, 0.0219367, 0.994249, 0.303028, 0, 0.0296485, 0.991807, 0.300435, 0, 0.038068, 0.987773, 0.296554, 0, 0.0471062, 0.982673, 0.2916, 0, 0.0566942, 0.976623, 0.285641, 0, 0.0667768, 0.968757, 0.27815, 0, 0.0773099, 0.959849, 0.269529, 0, 0.088257, 0.950663, 0.260248, 0, 0.0995879, 0.940129, 0.249704, 0, 0.111277, 0.92895, 0.238291, 0, 0.123304, 0.917996, 0.226501, 0, 0.13565, 0.907813, 0.214669, 0, 0.148299, 0.898305, 0.202835, 0, 0.161237, 0.889626, 0.191158, 0, 0.174455, 0.88175, 0.179695, 0, 0.187941, 0.874715, 0.168548, 0, 0.201687, 0.868746, 0.15792, 0, 0.215687, 0.863703, 0.147807, 0, 0.229933, 0.859315, 0.138149, 0, 0.24442, 0.855538, 0.128993, 0, 0.259145, 0.852428, 0.120414, 0, 0.274103, 0.850168, 0.112498, 0, 0.289293, 0.848132, 0.105054, 0, 0.304711, 0.846291, 0.0981087, 0, 0.320357, 0.844431, 0.0915942, 0, 0.33623, 0.842493, 0.0855056, 0, 0.35233, 0.840368, 0.0798204, 0, 0.368658, 0.83798, 0.0745097, 0, 0.385214, 0.83523, 0.0695424, 0, 0.402002, 0.832091, 0.0649092, 0, 0.419023, 0.828667, 0.0606291, 0, 0.436282, 0.824805, 0.0566523, 0, 0.453782, 0.820988, 0.0530229, 0, 0.471529, 0.816635, 0.0496364, 0, 0.489528, 0.811725, 0.0464658, 0, 0.507788, 0.806316, 0.0435082, 0, 0.526317, 0.800469, 0.0407873, 0, 0.545124, 0.794107, 0.038255, 0, 0.564221, 0.787218, 0.0358825, 0, 0.583621, 0.779872, 0.0336785, 0, 0.603341, 0.772097, 0.0316379, 0, 0.623397, 0.764484, 0.0297379, 0, 0.643812, 0.756428, 0.0279581, 0, 0.664611, 0.748022, 0.0263153, 0, 0.685824, 0.739268, 0.0247799, 0, 0.707488, 0.73024, 0.0233385, 0, 0.729646, 0.720893, 0.0220035, 0, 0.752354, 0.71119, 0.0207555, 0, 0.77568, 0.701791, 0.0195843, 0, 0.799715, 0.692184, 0.0184891, 0, 0.824574, 0.682258, 0.0174541, 0, 0.850417, 0.67206, 0.0164873, 0, 0.877466, 0.661717, 0.0155959, 0, 0.90604, 0.651462, 0.0147519, 0, 0.936528, 0.641467, 0.0139727, 0, 0.968254, 0.631229, 0.0132363, 0, 1, 1, 0.367573, 0, 0, 0.999999, 0.367571, 0, 0, 0.999984, 0.367553, 0, 0.000183382, 0.999925, 0.367473, 0, 0.00225254, 0.999759, 0.367259, 0, 0.00628165, 0.99941, 0.366801, 0, 0.0117858, 0.998739, 0.365946, 0, 0.0184359, 0.995529, 0.363191, 0, 0.0260114, 0.992875, 0.360171, 0, 0.0343581, 0.989135, 0.355981, 0, 0.0433637, 0.984166, 0.350401, 0, 0.0529438, 0.977871, 0.343348, 0, 0.0630334, 0.96951, 0.334341, 0, 0.0735805, 0.959964, 0.323862, 0, 0.0845437, 0.950162, 0.312521, 0, 0.095889, 0.938882, 0.299577, 0, 0.107588, 0.926992, 0.285573, 0, 0.119617, 0.915589, 0.271212, 0, 0.131957, 0.904791, 0.256611, 0, 0.144591, 0.895177, 0.242224, 0, 0.157503, 0.886403, 0.227952, 0, 0.170682, 0.878957, 0.214192, 0, 0.184117, 0.872418, 0.200795, 0, 0.197799, 0.867029, 0.188015, 0, 0.21172, 0.862835, 0.175975, 0, 0.225873, 0.859411, 0.164526, 0, 0.240253, 0.856655, 0.153693, 0, 0.254854, 0.854519, 0.14352, 0, 0.269673, 0.852828, 0.13397, 0, 0.284707, 0.851412, 0.124984, 0, 0.299953, 0.850609, 0.116748, 0, 0.315408, 0.849855, 0.10905, 0, 0.331073, 0.849017, 0.101839, 0, 0.346946, 0.848079, 0.0951359, 0, 0.363028, 0.846911, 0.0888774, 0, 0.379318, 0.845445, 0.0830375, 0, 0.395818, 0.84362, 0.0775844, 0, 0.41253, 0.841411, 0.0725054, 0, 0.429457, 0.838768, 0.0677691, 0, 0.446602, 0.835801, 0.0634016, 0, 0.463968, 0.832341, 0.0593095, 0, 0.481561, 0.828424, 0.0555121, 0, 0.499386, 0.824312, 0.052024, 0, 0.51745, 0.819918, 0.0487865, 0, 0.535761, 0.815072, 0.0457801, 0, 0.554328, 0.809863, 0.0430184, 0, 0.573162, 0.804164, 0.0404245, 0, 0.592275, 0.798034, 0.0380146, 0, 0.611681, 0.791436, 0.0357436, 0, 0.631398, 0.784498, 0.0336475, 0, 0.651445, 0.777125, 0.0316666, 0, 0.671845, 0.769365, 0.0298122, 0, 0.692628, 0.761579, 0.0281001, 0, 0.713827, 0.753746, 0.0265049, 0, 0.735484, 0.745573, 0.0250067, 0, 0.75765, 0.737083, 0.0236026, 0, 0.78039, 0.728545, 0.0223302, 0, 0.803789, 0.719691, 0.0211243, 0, 0.82796, 0.710569, 0.0199983, 0, 0.853056, 0.701216, 0.0189569, 0, 0.879298, 0.692094, 0.0179702, 0, 0.907014, 0.682909, 0.0170418, 0, 0.936691, 0.673509, 0.0161732, 0, 0.968254, 0.663863, 0.0153406, 0, 1, 1, 0.437395, 0, 0, 0.999998, 0.437394, 0, 0, 0.99998, 0.437363, 0, 0.000616704, 0.999891, 0.437232, 0, 0.00367925, 0.999656, 0.436877, 0, 0.00867446, 0.999148, 0.436121, 0, 0.0150679, 0.997959, 0.434564, 0, 0.022531, 0.993464, 0.430134, 0, 0.0308507, 0.990606, 0.426077, 0, 0.0398805, 0.985027, 0.419397, 0, 0.0495148, 0.978491, 0.41118, 0, 0.0596749, 0.969643, 0.40048, 0, 0.0703001, 0.959189, 0.38769, 0, 0.0813427, 0.948223, 0.373575, 0, 0.0927641, 0.935955, 0.357622, 0, 0.104533, 0.923237, 0.34043, 0, 0.116624, 0.911074, 0.322735, 0, 0.129015, 0.899724, 0.30479, 0, 0.141687, 0.890189, 0.287392, 0, 0.154626, 0.881796, 0.270248, 0, 0.167818, 0.874781, 0.253659, 0, 0.181252, 0.869166, 0.237786, 0, 0.194918, 0.864725, 0.222618, 0, 0.208807, 0.861565, 0.208356, 0, 0.222913, 0.859284, 0.194867, 0, 0.237229, 0.857677, 0.18212, 0, 0.25175, 0.856714, 0.17018, 0, 0.266473, 0.856155, 0.158969, 0, 0.281392, 0.8558, 0.148413, 0, 0.296505, 0.855672, 0.138578, 0, 0.311811, 0.855538, 0.129345, 0, 0.327306, 0.855689, 0.120861, 0, 0.342991, 0.855767, 0.112969, 0, 0.358864, 0.855618, 0.105593, 0, 0.374925, 0.85525, 0.0987451, 0, 0.391176, 0.854583, 0.0923727, 0, 0.407616, 0.853534, 0.0864143, 0, 0.424249, 0.852061, 0.0808338, 0, 0.441076, 0.850253, 0.0756771, 0, 0.4581, 0.848004, 0.0708612, 0, 0.475324, 0.845333, 0.0663784, 0, 0.492754, 0.842376, 0.0622631, 0, 0.510394, 0.838956, 0.0584112, 0, 0.528251, 0.835121, 0.0548328, 0, 0.546331, 0.830842, 0.0514838, 0, 0.564644, 0.826212, 0.048355, 0, 0.583198, 0.821522, 0.0454714, 0, 0.602005, 0.816551, 0.0428263, 0, 0.621078, 0.811211, 0.0403612, 0, 0.640434, 0.805479, 0.038039, 0, 0.660089, 0.799409, 0.0358739, 0, 0.680066, 0.79306, 0.0338727, 0, 0.70039, 0.786395, 0.0319985, 0, 0.721094, 0.779416, 0.030241, 0, 0.742215, 0.77214, 0.0285951, 0, 0.7638, 0.764636, 0.0270747, 0, 0.785912, 0.756836, 0.0256354, 0, 0.808628, 0.749315, 0.0243027, 0, 0.832055, 0.741561, 0.0230497, 0, 0.856338, 0.733589, 0.0218801, 0, 0.88169, 0.725479, 0.020784, 0, 0.908441, 0.717255, 0.0197702, 0, 0.937125, 0.708829, 0.0188168, 0, 0.968254, 0.700191, 0.0179113, 0, 1, 1, 0.518937, 0, 0, 0.999998, 0.518933, 0, 0, 0.999967, 0.518883, 0, 0.00147741, 0.999832, 0.51866, 0, 0.00573221, 0.999466, 0.518057, 0, 0.011826, 0.998644, 0.516752, 0, 0.0192116, 0.994458, 0.512347, 0, 0.027573, 0.991223, 0.507675, 0, 0.0367099, 0.985515, 0.500188, 0, 0.046487, 0.978308, 0.490408, 0, 0.0568071, 0.968359, 0.477357, 0, 0.0675984, 0.95682, 0.461752, 0, 0.0788059, 0.943929, 0.443796, 0, 0.090386, 0.930224, 0.423893, 0, 0.102304, 0.916514, 0.402682, 0, 0.114532, 0.903653, 0.380914, 0, 0.127047, 0.892315, 0.359212, 0, 0.139828, 0.882942, 0.338102, 0, 0.152861, 0.875438, 0.31773, 0, 0.16613, 0.869642, 0.298186, 0, 0.179624, 0.865304, 0.279491, 0, 0.193332, 0.862382, 0.261804, 0, 0.207247, 0.860666, 0.245146, 0, 0.22136, 0.859788, 0.229406, 0, 0.235666, 0.859608, 0.214605, 0, 0.250158, 0.859912, 0.200691, 0, 0.264832, 0.86053, 0.187623, 0, 0.279684, 0.861368, 0.17539, 0, 0.294711, 0.862237, 0.163901, 0, 0.309911, 0.863127, 0.153175, 0, 0.32528, 0.863923, 0.143147, 0, 0.340819, 0.864567, 0.133781, 0, 0.356524, 0.865013, 0.125042, 0, 0.372397, 0.86539, 0.116952, 0, 0.388438, 0.865591, 0.109476, 0, 0.404645, 0.865517, 0.102542, 0, 0.421022, 0.865084, 0.0960688, 0, 0.437569, 0.864309, 0.0900499, 0, 0.454287, 0.863151, 0.0844328, 0, 0.471181, 0.861649, 0.0792218, 0, 0.488253, 0.859742, 0.0743482, 0, 0.505507, 0.857446, 0.0697963, 0, 0.522947, 0.854757, 0.0655364, 0, 0.54058, 0.851783, 0.061608, 0, 0.558412, 0.848516, 0.0579701, 0, 0.576449, 0.844897, 0.0545742, 0, 0.594701, 0.840956, 0.0514167, 0, 0.613178, 0.836676, 0.0484598, 0, 0.631892, 0.832075, 0.0456934, 0, 0.650856, 0.827191, 0.0431178, 0, 0.670088, 0.822295, 0.0407718, 0, 0.689606, 0.817294, 0.0386032, 0, 0.709434, 0.812013, 0.0365675, 0, 0.7296, 0.806465, 0.0346547, 0, 0.750138, 0.800691, 0.0328717, 0, 0.771093, 0.794709, 0.031211, 0, 0.792519, 0.788493, 0.0296504, 0, 0.814488, 0.782049, 0.0281782, 0, 0.837097, 0.775403, 0.0267965, 0, 0.860481, 0.76857, 0.0255002, 0, 0.884842, 0.761536, 0.0242759, 0, 0.910494, 0.754303, 0.0231142, 0, 0.937985, 0.74692, 0.0220305, 0, 0.968254, 0.739745, 0.0210192, 0, 1, 1, 0.613914, 0, 0, 0.999996, 0.613907, 0, 9.63597e-05, 0.999942, 0.613814, 0, 0.00301247, 0.999704, 0.613407, 0, 0.00870385, 0.999046, 0.612302, 0, 0.0160714, 0.995516, 0.608266, 0, 0.0245899, 0.991726, 0.602863, 0, 0.0339681, 0.985157, 0.593956, 0, 0.0440254, 0.97642, 0.581748, 0, 0.0546409, 0.964404, 0.565183, 0, 0.0657284, 0.950601, 0.545273, 0, 0.0772246, 0.935158, 0.522129, 0, 0.0890812, 0.919364, 0.496782, 0, 0.10126, 0.904754, 0.470571, 0, 0.113731, 0.89176, 0.444037, 0, 0.126469, 0.881492, 0.418322, 0, 0.139454, 0.873656, 0.393522, 0, 0.15267, 0.868053, 0.369795, 0, 0.166101, 0.864336, 0.347171, 0, 0.179736, 0.862259, 0.325737, 0, 0.193565, 0.861556, 0.305532, 0, 0.207578, 0.861776, 0.286416, 0, 0.221769, 0.862661, 0.268355, 0, 0.23613, 0.864015, 0.251334, 0, 0.250656, 0.865711, 0.235352, 0, 0.265343, 0.867519, 0.220302, 0, 0.280187, 0.869351, 0.206161, 0, 0.295183, 0.871144, 0.192908, 0, 0.31033, 0.872839, 0.180505, 0, 0.325624, 0.874307, 0.168848, 0, 0.341065, 0.875667, 0.158021, 0, 0.35665, 0.876758, 0.147877, 0, 0.37238, 0.87764, 0.138441, 0, 0.388253, 0.878237, 0.129627, 0, 0.404269, 0.878563, 0.121415, 0, 0.42043, 0.878572, 0.113741, 0, 0.436735, 0.87842, 0.106652, 0, 0.453187, 0.878057, 0.100097, 0, 0.469786, 0.877413, 0.0940128, 0, 0.486536, 0.87646, 0.0883462, 0, 0.503439, 0.875233, 0.0830924, 0, 0.520498, 0.8737, 0.0781975, 0, 0.537717, 0.871873, 0.07364, 0, 0.555102, 0.86978, 0.0694103, 0, 0.572657, 0.867405, 0.0654696, 0, 0.59039, 0.864751, 0.0617914, 0, 0.608307, 0.861818, 0.0583491, 0, 0.626419, 0.858645, 0.0551443, 0, 0.644733, 0.855307, 0.0521894, 0, 0.663264, 0.851736, 0.0494334, 0, 0.682025, 0.847927, 0.0468504, 0, 0.701032, 0.843888, 0.0444261, 0, 0.720308, 0.839629, 0.0421497, 0, 0.739875, 0.835158, 0.0400082, 0, 0.759764, 0.830509, 0.0380076, 0, 0.780014, 0.825714, 0.0361488, 0, 0.800673, 0.820729, 0.0343956, 0, 0.821803, 0.815751, 0.0327781, 0, 0.843492, 0.810752, 0.031275, 0, 0.86586, 0.805587, 0.0298542, 0, 0.889087, 0.800317, 0.0285397, 0, 0.913466, 0.79489, 0.0272948, 0, 0.93952, 0.789314, 0.0261139, 0, 0.96835, 0.783593, 0.0249938, 0, 1, 1, 0.724258, 0, 0, 0.999992, 0.724243, 0, 0.000726889, 0.99987, 0.724044, 0, 0.00569574, 0.999336, 0.72317, 0, 0.0131702, 0.996271, 0.719432, 0, 0.0220738, 0.991159, 0.712576, 0, 0.0319405, 0.982465, 0.700927, 0, 0.0425202, 0.97049, 0.684297, 0, 0.0536599, 0.953973, 0.661244, 0, 0.065258, 0.935546, 0.633804, 0, 0.0772427, 0.916596, 0.603071, 0, 0.0895616, 0.899353, 0.57105, 0, 0.102175, 0.885216, 0.539206, 0, 0.11505, 0.875076, 0.508714, 0, 0.128164, 0.868334, 0.479571, 0, 0.141495, 0.864414, 0.451796, 0, 0.155026, 0.862678, 0.425328, 0, 0.168745, 0.862835, 0.400352, 0, 0.182639, 0.864067, 0.376532, 0, 0.196699, 0.866086, 0.35391, 0, 0.210915, 0.868557, 0.332424, 0, 0.225282, 0.871271, 0.312053, 0, 0.239792, 0.874058, 0.292764, 0, 0.25444, 0.8768, 0.27453, 0, 0.269223, 0.87939, 0.257297, 0, 0.284135, 0.8819, 0.24114, 0, 0.299174, 0.884187, 0.225934, 0, 0.314337, 0.886262, 0.211669, 0, 0.329622, 0.888119, 0.198311, 0, 0.345026, 0.889709, 0.185783, 0, 0.360549, 0.891054, 0.174063, 0, 0.376189, 0.892196, 0.163143, 0, 0.391946, 0.893101, 0.152952, 0, 0.407819, 0.893803, 0.143475, 0, 0.423808, 0.894277, 0.134647, 0, 0.439914, 0.894532, 0.126434, 0, 0.456137, 0.894576, 0.1188, 0, 0.472479, 0.894393, 0.111694, 0, 0.48894, 0.893976, 0.105069, 0, 0.505523, 0.893346, 0.0989077, 0, 0.52223, 0.892502, 0.0931724, 0, 0.539064, 0.891441, 0.0878276, 0, 0.556028, 0.890276, 0.082903, 0, 0.573125, 0.888972, 0.0783505, 0, 0.590361, 0.887469, 0.0741083, 0, 0.607741, 0.885785, 0.0701633, 0, 0.62527, 0.883914, 0.0664835, 0, 0.642957, 0.881872, 0.0630567, 0, 0.660809, 0.879651, 0.0598527, 0, 0.678836, 0.877267, 0.0568615, 0, 0.69705, 0.874717, 0.05406, 0, 0.715465, 0.872012, 0.0514378, 0, 0.734098, 0.869157, 0.0489805, 0, 0.752968, 0.866155, 0.0466727, 0, 0.772101, 0.863014, 0.0445056, 0, 0.791529, 0.859748, 0.0424733, 0, 0.81129, 0.856416, 0.0405957, 0, 0.831438, 0.852958, 0.0388273, 0, 0.852044, 0.849382, 0.0371619, 0, 0.87321, 0.845694, 0.0355959, 0, 0.89509, 0.841893, 0.0341155, 0, 0.917932, 0.837981, 0.0327141, 0, 0.942204, 0.833963, 0.0313856, 0, 0.968981, 0.829847, 0.0301275, 0, 1, 1, 0.85214, 0, 0, 0.999969, 0.852095, 0, 0.00279627, 0.999483, 0.851408, 0, 0.0107635, 0.994545, 0.84579, 0, 0.0206454, 0.986188, 0.835231, 0, 0.0315756, 0.969847, 0.814687, 0, 0.0432021, 0.945951, 0.783735, 0, 0.0553396, 0.91917, 0.746074, 0, 0.0678766, 0.895488, 0.706938, 0, 0.0807395, 0.878232, 0.669534, 0, 0.0938767, 0.868252, 0.635168, 0, 0.10725, 0.863873, 0.603069, 0, 0.120832, 0.863369, 0.572514, 0, 0.134598, 0.86545, 0.543169, 0, 0.148533, 0.868803, 0.514578, 0, 0.16262, 0.872794, 0.486762, 0, 0.176849, 0.87702, 0.459811, 0, 0.19121, 0.881054, 0.433654, 0, 0.205694, 0.884974, 0.408574, 0, 0.220294, 0.888587, 0.384525, 0, 0.235005, 0.891877, 0.36156, 0, 0.24982, 0.894793, 0.339661, 0, 0.264737, 0.89743, 0.318913, 0, 0.279751, 0.899796, 0.299302, 0, 0.294859, 0.901943, 0.280843, 0, 0.310058, 0.903858, 0.263481, 0, 0.325346, 0.905574, 0.247197, 0, 0.340721, 0.907069, 0.231915, 0, 0.356181, 0.908379, 0.217614, 0, 0.371725, 0.90952, 0.20425, 0, 0.387353, 0.910483, 0.191758, 0, 0.403063, 0.91128, 0.180092, 0, 0.418854, 0.911936, 0.169222, 0, 0.434727, 0.912454, 0.159098, 0, 0.450682, 0.912835, 0.149668, 0, 0.466718, 0.913078, 0.140884, 0, 0.482837, 0.913192, 0.132709, 0, 0.499038, 0.913175, 0.125095, 0, 0.515324, 0.91304, 0.118012, 0, 0.531695, 0.912781, 0.111417, 0, 0.548153, 0.91241, 0.105281, 0, 0.5647, 0.911924, 0.0995691, 0, 0.581338, 0.911331, 0.0942531, 0, 0.59807, 0.910637, 0.0893076, 0, 0.6149, 0.90984, 0.0846998, 0, 0.63183, 0.908941, 0.0804044, 0, 0.648865, 0.907944, 0.0763984, 0, 0.666011, 0.906857, 0.0726638, 0, 0.683273, 0.90568, 0.0691783, 0, 0.700659, 0.904416, 0.0659222, 0, 0.718176, 0.903067, 0.0628782, 0, 0.735834, 0.901637, 0.0600307, 0, 0.753646, 0.900128, 0.0573647, 0, 0.771625, 0.898544, 0.0548668, 0, 0.78979, 0.89689, 0.052527, 0, 0.808162, 0.895165, 0.0503306, 0, 0.826771, 0.893371, 0.0482668, 0, 0.845654, 0.891572, 0.0463605, 0, 0.864863, 0.889763, 0.0445998, 0, 0.884472, 0.887894, 0.0429451, 0, 0.904592, 0.885967, 0.0413884, 0, 0.925407, 0.883984, 0.0399225, 0, 0.947271, 0.881945, 0.0385405, 0, 0.97105, 0.879854, 0.0372362, 0, 1, 0.999804, 0.995833, 0, 0, 0.938155, 0.933611, 0, 0.0158731, 0.864755, 0.854311, 0, 0.0317461, 0.888594, 0.865264, 0, 0.0476191, 0.905575, 0.863922, 0, 0.0634921, 0.915125, 0.850558, 0, 0.0793651, 0.920665, 0.829254, 0, 0.0952381, 0.924073, 0.802578, 0, 0.111111, 0.926304, 0.772211, 0, 0.126984, 0.927829, 0.739366, 0, 0.142857, 0.928924, 0.705033, 0, 0.15873, 0.92973, 0.670019, 0, 0.174603, 0.930339, 0.634993, 0, 0.190476, 0.930811, 0.600485, 0, 0.206349, 0.931191, 0.566897, 0, 0.222222, 0.93149, 0.534485, 0, 0.238095, 0.931737, 0.503429, 0, 0.253968, 0.931939, 0.473811, 0, 0.269841, 0.932108, 0.445668, 0, 0.285714, 0.93225, 0.418993, 0, 0.301587, 0.932371, 0.393762, 0, 0.31746, 0.932474, 0.369939, 0, 0.333333, 0.932562, 0.347479, 0, 0.349206, 0.932638, 0.326336, 0, 0.365079, 0.932703, 0.306462, 0, 0.380952, 0.93276, 0.287805, 0, 0.396825, 0.932809, 0.270313, 0, 0.412698, 0.932851, 0.253933, 0, 0.428571, 0.932887, 0.23861, 0, 0.444444, 0.932917, 0.224289, 0, 0.460317, 0.932943, 0.210917, 0, 0.47619, 0.932965, 0.19844, 0, 0.492063, 0.932982, 0.186807, 0, 0.507937, 0.932995, 0.175966, 0, 0.52381, 0.933005, 0.165869, 0, 0.539683, 0.933011, 0.156468, 0, 0.555556, 0.933013, 0.147719, 0, 0.571429, 0.933013, 0.139579, 0, 0.587302, 0.93301, 0.132007, 0, 0.603175, 0.933004, 0.124965, 0, 0.619048, 0.932994, 0.118416, 0, 0.634921, 0.932982, 0.112326, 0, 0.650794, 0.932968, 0.106663, 0, 0.666667, 0.93295, 0.101397, 0, 0.68254, 0.932931, 0.0964993, 0, 0.698413, 0.932908, 0.0919438, 0, 0.714286, 0.932883, 0.0877057, 0, 0.730159, 0.932856, 0.0837623, 0, 0.746032, 0.932827, 0.0800921, 0, 0.761905, 0.932796, 0.0766754, 0, 0.777778, 0.932762, 0.0734936, 0, 0.793651, 0.932727, 0.0705296, 0, 0.809524, 0.932689, 0.0677676, 0, 0.825397, 0.93265, 0.0651929, 0, 0.84127, 0.932609, 0.0627917, 0, 0.857143, 0.932565, 0.0605515, 0, 0.873016, 0.932521, 0.0584606, 0, 0.888889, 0.932474, 0.0565082, 0, 0.904762, 0.932427, 0.0546841, 0, 0.920635, 0.932377, 0.0529793, 0, 0.936508, 0.932326, 0.0513851, 0, 0.952381, 0.932274, 0.0498936, 0, 0.968254, 0.93222, 0.0484975, 0, 0.984127, 0.932164, 0.0471899, 0, 1 ];\n\n\t\t// data textures\n\t\t// TODO: figure out a way to compress the LTC BRDF data\n\n\t\tconst ltc_float_1 = new Float32Array( LTC_MAT_1 );\n\t\tconst ltc_float_2 = new Float32Array( LTC_MAT_2 );\n\n\t\tconst LTC_FLOAT_1 = new DataTexture( ltc_float_1, 64, 64, RGBAFormat, FloatType, UVMapping, ClampToEdgeWrapping, ClampToEdgeWrapping, LinearFilter, NearestFilter, 1 );\n\t\tconst LTC_FLOAT_2 = new DataTexture( ltc_float_2, 64, 64, RGBAFormat, FloatType, UVMapping, ClampToEdgeWrapping, ClampToEdgeWrapping, LinearFilter, NearestFilter, 1 );\n\n\t\tLTC_FLOAT_1.needsUpdate = true;\n\t\tLTC_FLOAT_2.needsUpdate = true;\n\n\t\tconst ltc_half_1 = new Uint16Array( LTC_MAT_1.length );\n\n\t\tLTC_MAT_1.forEach( function ( x, index ) {\n\n\t\t\tltc_half_1[ index ] = DataUtils.toHalfFloat( x );\n\n\t\t} );\n\n\t\tconst ltc_half_2 = new Uint16Array( LTC_MAT_2.length );\n\n\t\tLTC_MAT_2.forEach( function ( x, index ) {\n\n\t\t\tltc_half_2[ index ] = DataUtils.toHalfFloat( x );\n\n\t\t} );\n\n\t\tconst LTC_HALF_1 = new DataTexture( ltc_half_1, 64, 64, RGBAFormat, HalfFloatType, UVMapping, ClampToEdgeWrapping, ClampToEdgeWrapping, LinearFilter, NearestFilter, 1 );\n\t\tconst LTC_HALF_2 = new DataTexture( ltc_half_2, 64, 64, RGBAFormat, HalfFloatType, UVMapping, ClampToEdgeWrapping, ClampToEdgeWrapping, LinearFilter, NearestFilter, 1 );\n\n\t\tLTC_HALF_1.needsUpdate = true;\n\t\tLTC_HALF_2.needsUpdate = true;\n\n\t\tthis.LTC_HALF_1 = LTC_HALF_1;\n\t\tthis.LTC_HALF_2 = LTC_HALF_2;\n\n\t\tthis.LTC_FLOAT_1 = LTC_FLOAT_1;\n\t\tthis.LTC_FLOAT_2 = LTC_FLOAT_2;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * The first LTC FP16 data texture.\n *\n * @static\n * @type {?DataTexture}\n * @default null\n */\nRectAreaLightTexturesLib.LTC_HALF_1 = null;\n\n/**\n * The second LTC FP16 data texture.\n *\n * @static\n * @type {?DataTexture}\n * @default null\n */\nRectAreaLightTexturesLib.LTC_HALF_2 = null;\n\n/**\n * The first LTC FP32 data texture.\n *\n * @static\n * @type {?DataTexture}\n * @default null\n */\nRectAreaLightTexturesLib.LTC_FLOAT_1 = null;\n\n/**\n * The second LTC FP32 data texture.\n *\n * @static\n * @type {?DataTexture}\n * @default null\n */\nRectAreaLightTexturesLib.LTC_FLOAT_2 = null;\n\nexport { RectAreaLightTexturesLib };\n", "import { UniformsLib } from 'three';\nimport { RectAreaLightTexturesLib } from './RectAreaLightTexturesLib.js';\n\n/**\n * This class is only relevant when using {@link RectAreaLight} with {@link WebGLRenderer}.\n *\n * Before rect area lights can be used, the internal uniform library of the renderer must be\n * enhanced with the following code.\n *\n * ```js\n * RectAreaLightUniformsLib.init();\n * ```\n *\n * @hideconstructor\n * @three_import import { RectAreaLightUniformsLib } from 'three/addons/lights/RectAreaLightUniformsLib.js';\n */\nclass RectAreaLightUniformsLib {\n\n\t/**\n\t * Inits the uniform library required when using rect area lights.\n\t */\n\tstatic init() {\n\n\t\tRectAreaLightTexturesLib.init();\n\n\t\tconst { LTC_FLOAT_1, LTC_FLOAT_2, LTC_HALF_1, LTC_HALF_2 } = RectAreaLightTexturesLib;\n\n\t\t// data textures\n\n\t\tUniformsLib.LTC_FLOAT_1 = LTC_FLOAT_1;\n\t\tUniformsLib.LTC_FLOAT_2 = LTC_FLOAT_2;\n\n\t\tUniformsLib.LTC_HALF_1 = LTC_HALF_1;\n\t\tUniformsLib.LTC_HALF_2 = LTC_HALF_2;\n\n\t}\n\n}\n\nexport { RectAreaLightUniformsLib };\n", "import {\n\tBox3,\n\tFloat32BufferAttribute,\n\tInstancedBufferGeometry,\n\tInstancedInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tSphere,\n\tVector3,\n\tWireframeGeometry\n} from 'three';\n\nconst _box = new Box3();\nconst _vector = new Vector3();\n\n/**\n * A series of vertex pairs, forming line segments.\n *\n * This is used in {@link LineSegments2} to describe the shape.\n *\n * @augments InstancedBufferGeometry\n * @three_import import { LineSegmentsGeometry } from 'three/addons/lines/LineSegmentsGeometry.js';\n */\nclass LineSegmentsGeometry extends InstancedBufferGeometry {\n\n\t/**\n\t * Constructs a new line segments geometry.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineSegmentsGeometry = true;\n\n\t\tthis.type = 'LineSegmentsGeometry';\n\n\t\tconst positions = [ - 1, 2, 0, 1, 2, 0, - 1, 1, 0, 1, 1, 0, - 1, 0, 0, 1, 0, 0, - 1, - 1, 0, 1, - 1, 0 ];\n\t\tconst uvs = [ - 1, 2, 1, 2, - 1, 1, 1, 1, - 1, - 1, 1, - 1, - 1, - 2, 1, - 2 ];\n\t\tconst index = [ 0, 2, 1, 2, 3, 1, 2, 4, 3, 4, 5, 3, 4, 6, 5, 6, 7, 5 ];\n\n\t\tthis.setIndex( index );\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t}\n\n\t/**\n\t * Applies the given 4x4 transformation matrix to the geometry.\n\t *\n\t * @param {Matrix4} matrix - The matrix to apply.\n\t * @return {LineSegmentsGeometry} A reference to this instance.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tconst start = this.attributes.instanceStart;\n\t\tconst end = this.attributes.instanceEnd;\n\n\t\tif ( start !== undefined ) {\n\n\t\t\tstart.applyMatrix4( matrix );\n\n\t\t\tend.applyMatrix4( matrix );\n\n\t\t\tstart.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( this.boundingBox !== null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tif ( this.boundingSphere !== null ) {\n\n\t\t\tthis.computeBoundingSphere();\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given line positions for this geometry. The length must be a multiple of six since\n\t * each line segment is defined by a start end vertex in the pattern `(xyz xyz)`.\n\t *\n\t * @param {Float32Array|Array<number>} array - The position data to set.\n\t * @return {LineSegmentsGeometry} A reference to this geometry.\n\t */\n\tsetPositions( array ) {\n\n\t\tlet lineSegments;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\tlineSegments = array;\n\n\t\t} else if ( Array.isArray( array ) ) {\n\n\t\t\tlineSegments = new Float32Array( array );\n\n\t\t}\n\n\t\tconst instanceBuffer = new InstancedInterleavedBuffer( lineSegments, 6, 1 ); // xyz, xyz\n\n\t\tthis.setAttribute( 'instanceStart', new InterleavedBufferAttribute( instanceBuffer, 3, 0 ) ); // xyz\n\t\tthis.setAttribute( 'instanceEnd', new InterleavedBufferAttribute( instanceBuffer, 3, 3 ) ); // xyz\n\n\t\tthis.instanceCount = this.attributes.instanceStart.count;\n\n\t\t//\n\n\t\tthis.computeBoundingBox();\n\t\tthis.computeBoundingSphere();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given line colors for this geometry. The length must be a multiple of six since\n\t * each line segment is defined by a start end color in the pattern `(rgb rgb)`.\n\t *\n\t * @param {Float32Array|Array<number>} array - The position data to set.\n\t * @return {LineSegmentsGeometry} A reference to this geometry.\n\t */\n\tsetColors( array ) {\n\n\t\tlet colors;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\tcolors = array;\n\n\t\t} else if ( Array.isArray( array ) ) {\n\n\t\t\tcolors = new Float32Array( array );\n\n\t\t}\n\n\t\tconst instanceColorBuffer = new InstancedInterleavedBuffer( colors, 6, 1 ); // rgb, rgb\n\n\t\tthis.setAttribute( 'instanceColorStart', new InterleavedBufferAttribute( instanceColorBuffer, 3, 0 ) ); // rgb\n\t\tthis.setAttribute( 'instanceColorEnd', new InterleavedBufferAttribute( instanceColorBuffer, 3, 3 ) ); // rgb\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Setups this line segments geometry from the given wireframe geometry.\n\t *\n\t * @param {WireframeGeometry} geometry - The geometry that should be used as a data source for this geometry.\n\t * @return {LineSegmentsGeometry} A reference to this geometry.\n\t */\n\tfromWireframeGeometry( geometry ) {\n\n\t\tthis.setPositions( geometry.attributes.position.array );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Setups this line segments geometry from the given edges geometry.\n\t *\n\t * @param {EdgesGeometry} geometry - The geometry that should be used as a data source for this geometry.\n\t * @return {LineSegmentsGeometry} A reference to this geometry.\n\t */\n\tfromEdgesGeometry( geometry ) {\n\n\t\tthis.setPositions( geometry.attributes.position.array );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Setups this line segments geometry from the given mesh.\n\t *\n\t * @param {Mesh} mesh - The mesh geometry that should be used as a data source for this geometry.\n\t * @return {LineSegmentsGeometry} A reference to this geometry.\n\t */\n\tfromMesh( mesh ) {\n\n\t\tthis.fromWireframeGeometry( new WireframeGeometry( mesh.geometry ) );\n\n\t\t// set colors, maybe\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Setups this line segments geometry from the given line segments.\n\t *\n\t * @param {LineSegments} lineSegments - The line segments that should be used as a data source for this geometry.\n\t * Assumes the source geometry is not using indices.\n\t * @return {LineSegmentsGeometry} A reference to this geometry.\n\t */\n\tfromLineSegments( lineSegments ) {\n\n\t\tconst geometry = lineSegments.geometry;\n\n\t\tthis.setPositions( geometry.attributes.position.array ); // assumes non-indexed\n\n\t\t// set colors, maybe\n\n\t\treturn this;\n\n\t}\n\n\tcomputeBoundingBox() {\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.boundingBox = new Box3();\n\n\t\t}\n\n\t\tconst start = this.attributes.instanceStart;\n\t\tconst end = this.attributes.instanceEnd;\n\n\t\tif ( start !== undefined && end !== undefined ) {\n\n\t\t\tthis.boundingBox.setFromBufferAttribute( start );\n\n\t\t\t_box.setFromBufferAttribute( end );\n\n\t\t\tthis.boundingBox.union( _box );\n\n\t\t}\n\n\t}\n\n\tcomputeBoundingSphere() {\n\n\t\tif ( this.boundingSphere === null ) {\n\n\t\t\tthis.boundingSphere = new Sphere();\n\n\t\t}\n\n\t\tif ( this.boundingBox === null ) {\n\n\t\t\tthis.computeBoundingBox();\n\n\t\t}\n\n\t\tconst start = this.attributes.instanceStart;\n\t\tconst end = this.attributes.instanceEnd;\n\n\t\tif ( start !== undefined && end !== undefined ) {\n\n\t\t\tconst center = this.boundingSphere.center;\n\n\t\t\tthis.boundingBox.getCenter( center );\n\n\t\t\tlet maxRadiusSq = 0;\n\n\t\t\tfor ( let i = 0, il = start.count; i < il; i ++ ) {\n\n\t\t\t\t_vector.fromBufferAttribute( start, i );\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector ) );\n\n\t\t\t\t_vector.fromBufferAttribute( end, i );\n\t\t\t\tmaxRadiusSq = Math.max( maxRadiusSq, center.distanceToSquared( _vector ) );\n\n\t\t\t}\n\n\t\t\tthis.boundingSphere.radius = Math.sqrt( maxRadiusSq );\n\n\t\t\tif ( isNaN( this.boundingSphere.radius ) ) {\n\n\t\t\t\tconsole.error( 'THREE.LineSegmentsGeometry.computeBoundingSphere(): Computed radius is NaN. The instanced position data is likely to have NaN values.', this );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\ttoJSON() {\n\n\t\t// todo\n\n\t}\n\n}\n\nexport { LineSegmentsGeometry };\n", "import {\n\tShaderLib,\n\tShaderMaterial,\n\tUniformsLib,\n\tUniformsUtils,\n\tVector2,\n} from 'three';\n\nUniformsLib.line = {\n\n\tworldUnits: { value: 1 },\n\tlinewidth: { value: 1 },\n\tresolution: { value: new Vector2( 1, 1 ) },\n\tdashOffset: { value: 0 },\n\tdashScale: { value: 1 },\n\tdashSize: { value: 1 },\n\tgapSize: { value: 1 } // todo FIX - maybe change to totalSize\n\n};\n\nShaderLib[ 'line' ] = {\n\n\tuniforms: UniformsUtils.merge( [\n\t\tUniformsLib.common,\n\t\tUniformsLib.fog,\n\t\tUniformsLib.line\n\t] ),\n\n\tvertexShader:\n\t/* glsl */`\n\t\t#include <common>\n\t\t#include <color_pars_vertex>\n\t\t#include <fog_pars_vertex>\n\t\t#include <logdepthbuf_pars_vertex>\n\t\t#include <clipping_planes_pars_vertex>\n\n\t\tuniform float linewidth;\n\t\tuniform vec2 resolution;\n\n\t\tattribute vec3 instanceStart;\n\t\tattribute vec3 instanceEnd;\n\n\t\tattribute vec3 instanceColorStart;\n\t\tattribute vec3 instanceColorEnd;\n\n\t\t#ifdef WORLD_UNITS\n\n\t\t\tvarying vec4 worldPos;\n\t\t\tvarying vec3 worldStart;\n\t\t\tvarying vec3 worldEnd;\n\n\t\t\t#ifdef USE_DASH\n\n\t\t\t\tvarying vec2 vUv;\n\n\t\t\t#endif\n\n\t\t#else\n\n\t\t\tvarying vec2 vUv;\n\n\t\t#endif\n\n\t\t#ifdef USE_DASH\n\n\t\t\tuniform float dashScale;\n\t\t\tattribute float instanceDistanceStart;\n\t\t\tattribute float instanceDistanceEnd;\n\t\t\tvarying float vLineDistance;\n\n\t\t#endif\n\n\t\tvoid trimSegment( const in vec4 start, inout vec4 end ) {\n\n\t\t\t// trim end segment so it terminates between the camera plane and the near plane\n\n\t\t\t// conservative estimate of the near plane\n\t\t\tfloat a = projectionMatrix[ 2 ][ 2 ]; // 3nd entry in 3th column\n\t\t\tfloat b = projectionMatrix[ 3 ][ 2 ]; // 3nd entry in 4th column\n\t\t\tfloat nearEstimate = - 0.5 * b / a;\n\n\t\t\tfloat alpha = ( nearEstimate - start.z ) / ( end.z - start.z );\n\n\t\t\tend.xyz = mix( start.xyz, end.xyz, alpha );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\t#ifdef USE_COLOR\n\n\t\t\t\tvColor.xyz = ( position.y < 0.5 ) ? instanceColorStart : instanceColorEnd;\n\n\t\t\t#endif\n\n\t\t\t#ifdef USE_DASH\n\n\t\t\t\tvLineDistance = ( position.y < 0.5 ) ? dashScale * instanceDistanceStart : dashScale * instanceDistanceEnd;\n\t\t\t\tvUv = uv;\n\n\t\t\t#endif\n\n\t\t\tfloat aspect = resolution.x / resolution.y;\n\n\t\t\t// camera space\n\t\t\tvec4 start = modelViewMatrix * vec4( instanceStart, 1.0 );\n\t\t\tvec4 end = modelViewMatrix * vec4( instanceEnd, 1.0 );\n\n\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\tworldStart = start.xyz;\n\t\t\t\tworldEnd = end.xyz;\n\n\t\t\t#else\n\n\t\t\t\tvUv = uv;\n\n\t\t\t#endif\n\n\t\t\t// special case for perspective projection, and segments that terminate either in, or behind, the camera plane\n\t\t\t// clearly the gpu firmware has a way of addressing this issue when projecting into ndc space\n\t\t\t// but we need to perform ndc-space calculations in the shader, so we must address this issue directly\n\t\t\t// perhaps there is a more elegant solution -- WestLangley\n\n\t\t\tbool perspective = ( projectionMatrix[ 2 ][ 3 ] == - 1.0 ); // 4th entry in the 3rd column\n\n\t\t\tif ( perspective ) {\n\n\t\t\t\tif ( start.z < 0.0 && end.z >= 0.0 ) {\n\n\t\t\t\t\ttrimSegment( start, end );\n\n\t\t\t\t} else if ( end.z < 0.0 && start.z >= 0.0 ) {\n\n\t\t\t\t\ttrimSegment( end, start );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// clip space\n\t\t\tvec4 clipStart = projectionMatrix * start;\n\t\t\tvec4 clipEnd = projectionMatrix * end;\n\n\t\t\t// ndc space\n\t\t\tvec3 ndcStart = clipStart.xyz / clipStart.w;\n\t\t\tvec3 ndcEnd = clipEnd.xyz / clipEnd.w;\n\n\t\t\t// direction\n\t\t\tvec2 dir = ndcEnd.xy - ndcStart.xy;\n\n\t\t\t// account for clip-space aspect ratio\n\t\t\tdir.x *= aspect;\n\t\t\tdir = normalize( dir );\n\n\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\tvec3 worldDir = normalize( end.xyz - start.xyz );\n\t\t\t\tvec3 tmpFwd = normalize( mix( start.xyz, end.xyz, 0.5 ) );\n\t\t\t\tvec3 worldUp = normalize( cross( worldDir, tmpFwd ) );\n\t\t\t\tvec3 worldFwd = cross( worldDir, worldUp );\n\t\t\t\tworldPos = position.y < 0.5 ? start: end;\n\n\t\t\t\t// height offset\n\t\t\t\tfloat hw = linewidth * 0.5;\n\t\t\t\tworldPos.xyz += position.x < 0.0 ? hw * worldUp : - hw * worldUp;\n\n\t\t\t\t// don't extend the line if we're rendering dashes because we\n\t\t\t\t// won't be rendering the endcaps\n\t\t\t\t#ifndef USE_DASH\n\n\t\t\t\t\t// cap extension\n\t\t\t\t\tworldPos.xyz += position.y < 0.5 ? - hw * worldDir : hw * worldDir;\n\n\t\t\t\t\t// add width to the box\n\t\t\t\t\tworldPos.xyz += worldFwd * hw;\n\n\t\t\t\t\t// endcaps\n\t\t\t\t\tif ( position.y > 1.0 || position.y < 0.0 ) {\n\n\t\t\t\t\t\tworldPos.xyz -= worldFwd * 2.0 * hw;\n\n\t\t\t\t\t}\n\n\t\t\t\t#endif\n\n\t\t\t\t// project the worldpos\n\t\t\t\tvec4 clip = projectionMatrix * worldPos;\n\n\t\t\t\t// shift the depth of the projected points so the line\n\t\t\t\t// segments overlap neatly\n\t\t\t\tvec3 clipPose = ( position.y < 0.5 ) ? ndcStart : ndcEnd;\n\t\t\t\tclip.z = clipPose.z * clip.w;\n\n\t\t\t#else\n\n\t\t\t\tvec2 offset = vec2( dir.y, - dir.x );\n\t\t\t\t// undo aspect ratio adjustment\n\t\t\t\tdir.x /= aspect;\n\t\t\t\toffset.x /= aspect;\n\n\t\t\t\t// sign flip\n\t\t\t\tif ( position.x < 0.0 ) offset *= - 1.0;\n\n\t\t\t\t// endcaps\n\t\t\t\tif ( position.y < 0.0 ) {\n\n\t\t\t\t\toffset += - dir;\n\n\t\t\t\t} else if ( position.y > 1.0 ) {\n\n\t\t\t\t\toffset += dir;\n\n\t\t\t\t}\n\n\t\t\t\t// adjust for linewidth\n\t\t\t\toffset *= linewidth;\n\n\t\t\t\t// adjust for clip-space to screen-space conversion // maybe resolution should be based on viewport ...\n\t\t\t\toffset /= resolution.y;\n\n\t\t\t\t// select end\n\t\t\t\tvec4 clip = ( position.y < 0.5 ) ? clipStart : clipEnd;\n\n\t\t\t\t// back to clip space\n\t\t\t\toffset *= clip.w;\n\n\t\t\t\tclip.xy += offset;\n\n\t\t\t#endif\n\n\t\t\tgl_Position = clip;\n\n\t\t\tvec4 mvPosition = ( position.y < 0.5 ) ? start : end; // this is an approximation\n\n\t\t\t#include <logdepthbuf_vertex>\n\t\t\t#include <clipping_planes_vertex>\n\t\t\t#include <fog_vertex>\n\n\t\t}\n\t\t`,\n\n\tfragmentShader:\n\t/* glsl */`\n\t\tuniform vec3 diffuse;\n\t\tuniform float opacity;\n\t\tuniform float linewidth;\n\n\t\t#ifdef USE_DASH\n\n\t\t\tuniform float dashOffset;\n\t\t\tuniform float dashSize;\n\t\t\tuniform float gapSize;\n\n\t\t#endif\n\n\t\tvarying float vLineDistance;\n\n\t\t#ifdef WORLD_UNITS\n\n\t\t\tvarying vec4 worldPos;\n\t\t\tvarying vec3 worldStart;\n\t\t\tvarying vec3 worldEnd;\n\n\t\t\t#ifdef USE_DASH\n\n\t\t\t\tvarying vec2 vUv;\n\n\t\t\t#endif\n\n\t\t#else\n\n\t\t\tvarying vec2 vUv;\n\n\t\t#endif\n\n\t\t#include <common>\n\t\t#include <color_pars_fragment>\n\t\t#include <fog_pars_fragment>\n\t\t#include <logdepthbuf_pars_fragment>\n\t\t#include <clipping_planes_pars_fragment>\n\n\t\tvec2 closestLineToLine(vec3 p1, vec3 p2, vec3 p3, vec3 p4) {\n\n\t\t\tfloat mua;\n\t\t\tfloat mub;\n\n\t\t\tvec3 p13 = p1 - p3;\n\t\t\tvec3 p43 = p4 - p3;\n\n\t\t\tvec3 p21 = p2 - p1;\n\n\t\t\tfloat d1343 = dot( p13, p43 );\n\t\t\tfloat d4321 = dot( p43, p21 );\n\t\t\tfloat d1321 = dot( p13, p21 );\n\t\t\tfloat d4343 = dot( p43, p43 );\n\t\t\tfloat d2121 = dot( p21, p21 );\n\n\t\t\tfloat denom = d2121 * d4343 - d4321 * d4321;\n\n\t\t\tfloat numer = d1343 * d4321 - d1321 * d4343;\n\n\t\t\tmua = numer / denom;\n\t\t\tmua = clamp( mua, 0.0, 1.0 );\n\t\t\tmub = ( d1343 + d4321 * ( mua ) ) / d4343;\n\t\t\tmub = clamp( mub, 0.0, 1.0 );\n\n\t\t\treturn vec2( mua, mub );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tfloat alpha = opacity;\n\t\t\tvec4 diffuseColor = vec4( diffuse, alpha );\n\n\t\t\t#include <clipping_planes_fragment>\n\n\t\t\t#ifdef USE_DASH\n\n\t\t\t\tif ( vUv.y < - 1.0 || vUv.y > 1.0 ) discard; // discard endcaps\n\n\t\t\t\tif ( mod( vLineDistance + dashOffset, dashSize + gapSize ) > dashSize ) discard; // todo - FIX\n\n\t\t\t#endif\n\n\t\t\t#ifdef WORLD_UNITS\n\n\t\t\t\t// Find the closest points on the view ray and the line segment\n\t\t\t\tvec3 rayEnd = normalize( worldPos.xyz ) * 1e5;\n\t\t\t\tvec3 lineDir = worldEnd - worldStart;\n\t\t\t\tvec2 params = closestLineToLine( worldStart, worldEnd, vec3( 0.0, 0.0, 0.0 ), rayEnd );\n\n\t\t\t\tvec3 p1 = worldStart + lineDir * params.x;\n\t\t\t\tvec3 p2 = rayEnd * params.y;\n\t\t\t\tvec3 delta = p1 - p2;\n\t\t\t\tfloat len = length( delta );\n\t\t\t\tfloat norm = len / linewidth;\n\n\t\t\t\t#ifndef USE_DASH\n\n\t\t\t\t\t#ifdef USE_ALPHA_TO_COVERAGE\n\n\t\t\t\t\t\tfloat dnorm = fwidth( norm );\n\t\t\t\t\t\talpha = 1.0 - smoothstep( 0.5 - dnorm, 0.5 + dnorm, norm );\n\n\t\t\t\t\t#else\n\n\t\t\t\t\t\tif ( norm > 0.5 ) {\n\n\t\t\t\t\t\t\tdiscard;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t#endif\n\n\t\t\t\t#endif\n\n\t\t\t#else\n\n\t\t\t\t#ifdef USE_ALPHA_TO_COVERAGE\n\n\t\t\t\t\t// artifacts appear on some hardware if a derivative is taken within a conditional\n\t\t\t\t\tfloat a = vUv.x;\n\t\t\t\t\tfloat b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;\n\t\t\t\t\tfloat len2 = a * a + b * b;\n\t\t\t\t\tfloat dlen = fwidth( len2 );\n\n\t\t\t\t\tif ( abs( vUv.y ) > 1.0 ) {\n\n\t\t\t\t\t\talpha = 1.0 - smoothstep( 1.0 - dlen, 1.0 + dlen, len2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t#else\n\n\t\t\t\t\tif ( abs( vUv.y ) > 1.0 ) {\n\n\t\t\t\t\t\tfloat a = vUv.x;\n\t\t\t\t\t\tfloat b = ( vUv.y > 0.0 ) ? vUv.y - 1.0 : vUv.y + 1.0;\n\t\t\t\t\t\tfloat len2 = a * a + b * b;\n\n\t\t\t\t\t\tif ( len2 > 1.0 ) discard;\n\n\t\t\t\t\t}\n\n\t\t\t\t#endif\n\n\t\t\t#endif\n\n\t\t\t#include <logdepthbuf_fragment>\n\t\t\t#include <color_fragment>\n\n\t\t\tgl_FragColor = vec4( diffuseColor.rgb, alpha );\n\n\t\t\t#include <tonemapping_fragment>\n\t\t\t#include <colorspace_fragment>\n\t\t\t#include <fog_fragment>\n\t\t\t#include <premultiplied_alpha_fragment>\n\n\t\t}\n\t\t`\n};\n\n/**\n * A material for drawing wireframe-style geometries.\n *\n * Unlike {@link LineBasicMaterial}, it supports arbitrary line widths and allows using world units\n * instead of screen space units. This material is used with {@link LineSegments2} and {@link Line2}.\n *\n * This module can only be used with {@link WebGLRenderer}. When using {@link WebGPURenderer},\n * use {@link Line2NodeMaterial}.\n *\n * @augments ShaderMaterial\n * @three_import import { LineMaterial } from 'three/addons/lines/LineMaterial.js';\n */\nclass LineMaterial extends ShaderMaterial {\n\n\t/**\n\t * Constructs a new line segments geometry.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper( {\n\n\t\t\ttype: 'LineMaterial',\n\t\t\tuniforms: UniformsUtils.clone( ShaderLib[ 'line' ].uniforms ),\n\n\t\t\tvertexShader: ShaderLib[ 'line' ].vertexShader,\n\t\t\tfragmentShader: ShaderLib[ 'line' ].fragmentShader,\n\n\t\t\tclipping: true // required for clipping support\n\n\t\t} );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineMaterial = true;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\t/**\n\t * The material's color.\n\t *\n\t * @type {Color}\n\t * @default (1,1,1)\n\t */\n\tget color() {\n\n\t\treturn this.uniforms.diffuse.value;\n\n\t}\n\n\tset color( value ) {\n\n\t\tthis.uniforms.diffuse.value = value;\n\n\t}\n\n\t/**\n\t * Whether the material's sizes (width, dash gaps) are in world units.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t */\n\tget worldUnits() {\n\n\t\treturn 'WORLD_UNITS' in this.defines;\n\n\t}\n\n\tset worldUnits( value ) {\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.defines.WORLD_UNITS = '';\n\n\t\t} else {\n\n\t\t\tdelete this.defines.WORLD_UNITS;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Controls line thickness in CSS pixel units when `worldUnits` is `false` (default),\n\t * or in world units when `worldUnits` is `true`.\n\t *\n\t * @type {number}\n\t * @default 1\n\t */\n\tget linewidth() {\n\n\t\treturn this.uniforms.linewidth.value;\n\n\t}\n\n\tset linewidth( value ) {\n\n\t\tif ( ! this.uniforms.linewidth ) return;\n\t\tthis.uniforms.linewidth.value = value;\n\n\t}\n\n\t/**\n\t * Whether the line is dashed, or solid.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t */\n\tget dashed() {\n\n\t\treturn 'USE_DASH' in this.defines;\n\n\t}\n\n\tset dashed( value ) {\n\n\t\tif ( ( value === true ) !== this.dashed ) {\n\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.defines.USE_DASH = '';\n\n\t\t} else {\n\n\t\t\tdelete this.defines.USE_DASH;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * The scale of the dashes and gaps.\n\t *\n\t * @type {number}\n\t * @default 1\n\t */\n\tget dashScale() {\n\n\t\treturn this.uniforms.dashScale.value;\n\n\t}\n\n\tset dashScale( value ) {\n\n\t\tthis.uniforms.dashScale.value = value;\n\n\t}\n\n\t/**\n\t * The size of the dash.\n\t *\n\t * @type {number}\n\t * @default 1\n\t */\n\tget dashSize() {\n\n\t\treturn this.uniforms.dashSize.value;\n\n\t}\n\n\tset dashSize( value ) {\n\n\t\tthis.uniforms.dashSize.value = value;\n\n\t}\n\n\t/**\n\t * Where in the dash cycle the dash starts.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget dashOffset() {\n\n\t\treturn this.uniforms.dashOffset.value;\n\n\t}\n\n\tset dashOffset( value ) {\n\n\t\tthis.uniforms.dashOffset.value = value;\n\n\t}\n\n\t/**\n\t * The size of the gap.\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget gapSize() {\n\n\t\treturn this.uniforms.gapSize.value;\n\n\t}\n\n\tset gapSize( value ) {\n\n\t\tthis.uniforms.gapSize.value = value;\n\n\t}\n\n\t/**\n\t * The opacity.\n\t *\n\t * @type {number}\n\t * @default 1\n\t */\n\tget opacity() {\n\n\t\treturn this.uniforms.opacity.value;\n\n\t}\n\n\tset opacity( value ) {\n\n\t\tif ( ! this.uniforms ) return;\n\t\tthis.uniforms.opacity.value = value;\n\n\t}\n\n\t/**\n\t * The size of the viewport, in screen pixels. This must be kept updated to make\n\t * screen-space rendering accurate.The `LineSegments2.onBeforeRender` callback\n\t * performs the update for visible objects.\n\t *\n\t * @type {Vector2}\n\t */\n\tget resolution() {\n\n\t\treturn this.uniforms.resolution.value;\n\n\t}\n\n\tset resolution( value ) {\n\n\t\tthis.uniforms.resolution.value.copy( value );\n\n\t}\n\n\t/**\n\t * Whether to use alphaToCoverage or not. When enabled, this can improve the\n\t * anti-aliasing of line edges when using MSAA.\n\t *\n\t * @type {boolean}\n\t */\n\tget alphaToCoverage() {\n\n\t\treturn 'USE_ALPHA_TO_COVERAGE' in this.defines;\n\n\t}\n\n\tset alphaToCoverage( value ) {\n\n\t\tif ( ! this.defines ) return;\n\n\t\tif ( ( value === true ) !== this.alphaToCoverage ) {\n\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.defines.USE_ALPHA_TO_COVERAGE = '';\n\n\t\t} else {\n\n\t\t\tdelete this.defines.USE_ALPHA_TO_COVERAGE;\n\n\t\t}\n\n\t}\n\n}\n\nexport { LineMaterial };\n", "import {\n\tBox3,\n\tInstancedInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tLine3,\n\tMathUtils,\n\tMatrix4,\n\tMesh,\n\tSphere,\n\tVector3,\n\tVector4\n} from 'three';\nimport { LineSegmentsGeometry } from './LineSegmentsGeometry.js';\nimport { LineMaterial } from './LineMaterial.js';\n\nconst _viewport = new Vector4();\n\nconst _start = new Vector3();\nconst _end = new Vector3();\n\nconst _start4 = new Vector4();\nconst _end4 = new Vector4();\n\nconst _ssOrigin = new Vector4();\nconst _ssOrigin3 = new Vector3();\nconst _mvMatrix = new Matrix4();\nconst _line = new Line3();\nconst _closestPoint = new Vector3();\n\nconst _box = new Box3();\nconst _sphere = new Sphere();\nconst _clipToWorldVector = new Vector4();\n\nlet _ray, _lineWidth;\n\n// Returns the margin required to expand by in world space given the distance from the camera,\n// line width, resolution, and camera projection\nfunction getWorldSpaceHalfWidth( camera, distance, resolution ) {\n\n\t// transform into clip space, adjust the x and y values by the pixel width offset, then\n\t// transform back into world space to get world offset. Note clip space is [-1, 1] so full\n\t// width does not need to be halved.\n\t_clipToWorldVector.set( 0, 0, - distance, 1.0 ).applyMatrix4( camera.projectionMatrix );\n\t_clipToWorldVector.multiplyScalar( 1.0 / _clipToWorldVector.w );\n\t_clipToWorldVector.x = _lineWidth / resolution.width;\n\t_clipToWorldVector.y = _lineWidth / resolution.height;\n\t_clipToWorldVector.applyMatrix4( camera.projectionMatrixInverse );\n\t_clipToWorldVector.multiplyScalar( 1.0 / _clipToWorldVector.w );\n\n\treturn Math.abs( Math.max( _clipToWorldVector.x, _clipToWorldVector.y ) );\n\n}\n\nfunction raycastWorldUnits( lineSegments, intersects ) {\n\n\tconst matrixWorld = lineSegments.matrixWorld;\n\tconst geometry = lineSegments.geometry;\n\tconst instanceStart = geometry.attributes.instanceStart;\n\tconst instanceEnd = geometry.attributes.instanceEnd;\n\tconst segmentCount = Math.min( geometry.instanceCount, instanceStart.count );\n\n\tfor ( let i = 0, l = segmentCount; i < l; i ++ ) {\n\n\t\t_line.start.fromBufferAttribute( instanceStart, i );\n\t\t_line.end.fromBufferAttribute( instanceEnd, i );\n\n\t\t_line.applyMatrix4( matrixWorld );\n\n\t\tconst pointOnLine = new Vector3();\n\t\tconst point = new Vector3();\n\n\t\t_ray.distanceSqToSegment( _line.start, _line.end, point, pointOnLine );\n\t\tconst isInside = point.distanceTo( pointOnLine ) < _lineWidth * 0.5;\n\n\t\tif ( isInside ) {\n\n\t\t\tintersects.push( {\n\t\t\t\tpoint,\n\t\t\t\tpointOnLine,\n\t\t\t\tdistance: _ray.origin.distanceTo( point ),\n\t\t\t\tobject: lineSegments,\n\t\t\t\tface: null,\n\t\t\t\tfaceIndex: i,\n\t\t\t\tuv: null,\n\t\t\t\tuv1: null,\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n}\n\nfunction raycastScreenSpace( lineSegments, camera, intersects ) {\n\n\tconst projectionMatrix = camera.projectionMatrix;\n\tconst material = lineSegments.material;\n\tconst resolution = material.resolution;\n\tconst matrixWorld = lineSegments.matrixWorld;\n\n\tconst geometry = lineSegments.geometry;\n\tconst instanceStart = geometry.attributes.instanceStart;\n\tconst instanceEnd = geometry.attributes.instanceEnd;\n\tconst segmentCount = Math.min( geometry.instanceCount, instanceStart.count );\n\n\tconst near = - camera.near;\n\n\t//\n\n\t// pick a point 1 unit out along the ray to avoid the ray origin\n\t// sitting at the camera origin which will cause \"w\" to be 0 when\n\t// applying the projection matrix.\n\t_ray.at( 1, _ssOrigin );\n\n\t// ndc space [ - 1.0, 1.0 ]\n\t_ssOrigin.w = 1;\n\t_ssOrigin.applyMatrix4( camera.matrixWorldInverse );\n\t_ssOrigin.applyMatrix4( projectionMatrix );\n\t_ssOrigin.multiplyScalar( 1 / _ssOrigin.w );\n\n\t// screen space\n\t_ssOrigin.x *= resolution.x / 2;\n\t_ssOrigin.y *= resolution.y / 2;\n\t_ssOrigin.z = 0;\n\n\t_ssOrigin3.copy( _ssOrigin );\n\n\t_mvMatrix.multiplyMatrices( camera.matrixWorldInverse, matrixWorld );\n\n\tfor ( let i = 0, l = segmentCount; i < l; i ++ ) {\n\n\t\t_start4.fromBufferAttribute( instanceStart, i );\n\t\t_end4.fromBufferAttribute( instanceEnd, i );\n\n\t\t_start4.w = 1;\n\t\t_end4.w = 1;\n\n\t\t// camera space\n\t\t_start4.applyMatrix4( _mvMatrix );\n\t\t_end4.applyMatrix4( _mvMatrix );\n\n\t\t// skip the segment if it's entirely behind the camera\n\t\tconst isBehindCameraNear = _start4.z > near && _end4.z > near;\n\t\tif ( isBehindCameraNear ) {\n\n\t\t\tcontinue;\n\n\t\t}\n\n\t\t// trim the segment if it extends behind camera near\n\t\tif ( _start4.z > near ) {\n\n\t\t\tconst deltaDist = _start4.z - _end4.z;\n\t\t\tconst t = ( _start4.z - near ) / deltaDist;\n\t\t\t_start4.lerp( _end4, t );\n\n\t\t} else if ( _end4.z > near ) {\n\n\t\t\tconst deltaDist = _end4.z - _start4.z;\n\t\t\tconst t = ( _end4.z - near ) / deltaDist;\n\t\t\t_end4.lerp( _start4, t );\n\n\t\t}\n\n\t\t// clip space\n\t\t_start4.applyMatrix4( projectionMatrix );\n\t\t_end4.applyMatrix4( projectionMatrix );\n\n\t\t// ndc space [ - 1.0, 1.0 ]\n\t\t_start4.multiplyScalar( 1 / _start4.w );\n\t\t_end4.multiplyScalar( 1 / _end4.w );\n\n\t\t// screen space\n\t\t_start4.x *= resolution.x / 2;\n\t\t_start4.y *= resolution.y / 2;\n\n\t\t_end4.x *= resolution.x / 2;\n\t\t_end4.y *= resolution.y / 2;\n\n\t\t// create 2d segment\n\t\t_line.start.copy( _start4 );\n\t\t_line.start.z = 0;\n\n\t\t_line.end.copy( _end4 );\n\t\t_line.end.z = 0;\n\n\t\t// get closest point on ray to segment\n\t\tconst param = _line.closestPointToPointParameter( _ssOrigin3, true );\n\t\t_line.at( param, _closestPoint );\n\n\t\t// check if the intersection point is within clip space\n\t\tconst zPos = MathUtils.lerp( _start4.z, _end4.z, param );\n\t\tconst isInClipSpace = zPos >= - 1 && zPos <= 1;\n\n\t\tconst isInside = _ssOrigin3.distanceTo( _closestPoint ) < _lineWidth * 0.5;\n\n\t\tif ( isInClipSpace && isInside ) {\n\n\t\t\t_line.start.fromBufferAttribute( instanceStart, i );\n\t\t\t_line.end.fromBufferAttribute( instanceEnd, i );\n\n\t\t\t_line.start.applyMatrix4( matrixWorld );\n\t\t\t_line.end.applyMatrix4( matrixWorld );\n\n\t\t\tconst pointOnLine = new Vector3();\n\t\t\tconst point = new Vector3();\n\n\t\t\t_ray.distanceSqToSegment( _line.start, _line.end, point, pointOnLine );\n\n\t\t\tintersects.push( {\n\t\t\t\tpoint: point,\n\t\t\t\tpointOnLine: pointOnLine,\n\t\t\t\tdistance: _ray.origin.distanceTo( point ),\n\t\t\t\tobject: lineSegments,\n\t\t\t\tface: null,\n\t\t\t\tfaceIndex: i,\n\t\t\t\tuv: null,\n\t\t\t\tuv1: null,\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * A series of lines drawn between pairs of vertices.\n *\n * This adds functionality beyond {@link LineSegments}, like arbitrary line width and changing width\n * to be in world units. {@link Line2} extends this object, forming a polyline instead of individual\n * segments.\n *\n * This module can only be used with {@link WebGLRenderer}. When using {@link WebGPURenderer},\n * import the class from `lines/webgpu/LineSegments2.js`.\n *\n *  ```js\n * const geometry = new LineSegmentsGeometry();\n * geometry.setPositions( positions );\n * geometry.setColors( colors );\n *\n * const material = new LineMaterial( { linewidth: 5, vertexColors: true } };\n *\n * const lineSegments = new LineSegments2( geometry, material );\n * scene.add( lineSegments );\n * ```\n *\n * @augments Mesh\n * @three_import import { LineSegments2 } from 'three/addons/lines/LineSegments2.js';\n */\nclass LineSegments2 extends Mesh {\n\n\t/**\n\t * Constructs a new wide line.\n\t *\n\t * @param {LineSegmentsGeometry} [geometry] - The line geometry.\n\t * @param {LineMaterial} [material] - The line material.\n\t */\n\tconstructor( geometry = new LineSegmentsGeometry(), material = new LineMaterial( { color: Math.random() * 0xffffff } ) ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineSegments2 = true;\n\n\t\tthis.type = 'LineSegments2';\n\n\t}\n\n\t/**\n\t * Computes an array of distance values which are necessary for rendering dashed lines.\n\t * For each vertex in the geometry, the method calculates the cumulative length from the\n\t * current point to the very beginning of the line.\n\t *\n\t * @return {LineSegments2} A reference to this instance.\n\t */\n\tcomputeLineDistances() {\n\n\t\t// for backwards-compatibility, but could be a method of LineSegmentsGeometry...\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst instanceStart = geometry.attributes.instanceStart;\n\t\tconst instanceEnd = geometry.attributes.instanceEnd;\n\t\tconst lineDistances = new Float32Array( 2 * instanceStart.count );\n\n\t\tfor ( let i = 0, j = 0, l = instanceStart.count; i < l; i ++, j += 2 ) {\n\n\t\t\t_start.fromBufferAttribute( instanceStart, i );\n\t\t\t_end.fromBufferAttribute( instanceEnd, i );\n\n\t\t\tlineDistances[ j ] = ( j === 0 ) ? 0 : lineDistances[ j - 1 ];\n\t\t\tlineDistances[ j + 1 ] = lineDistances[ j ] + _start.distanceTo( _end );\n\n\t\t}\n\n\t\tconst instanceDistanceBuffer = new InstancedInterleavedBuffer( lineDistances, 2, 1 ); // d0, d1\n\n\t\tgeometry.setAttribute( 'instanceDistanceStart', new InterleavedBufferAttribute( instanceDistanceBuffer, 1, 0 ) ); // d0\n\t\tgeometry.setAttribute( 'instanceDistanceEnd', new InterleavedBufferAttribute( instanceDistanceBuffer, 1, 1 ) ); // d1\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes intersection points between a casted ray and this instance.\n\t *\n\t * @param {Raycaster} raycaster - The raycaster.\n\t * @param {Array<Object>} intersects - The target array that holds the intersection points.\n\t */\n\traycast( raycaster, intersects ) {\n\n\t\tconst worldUnits = this.material.worldUnits;\n\t\tconst camera = raycaster.camera;\n\n\t\tif ( camera === null && ! worldUnits ) {\n\n\t\t\tconsole.error( 'LineSegments2: \"Raycaster.camera\" needs to be set in order to raycast against LineSegments2 while worldUnits is set to false.' );\n\n\t\t}\n\n\t\tconst threshold = ( raycaster.params.Line2 !== undefined ) ? raycaster.params.Line2.threshold || 0 : 0;\n\n\t\t_ray = raycaster.ray;\n\n\t\tconst matrixWorld = this.matrixWorld;\n\t\tconst geometry = this.geometry;\n\t\tconst material = this.material;\n\n\t\t_lineWidth = material.linewidth + threshold;\n\n\t\t// check if we intersect the sphere bounds\n\t\tif ( geometry.boundingSphere === null ) {\n\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t}\n\n\t\t_sphere.copy( geometry.boundingSphere ).applyMatrix4( matrixWorld );\n\n\t\t// increase the sphere bounds by the worst case line screen space width\n\t\tlet sphereMargin;\n\t\tif ( worldUnits ) {\n\n\t\t\tsphereMargin = _lineWidth * 0.5;\n\n\t\t} else {\n\n\t\t\tconst distanceToSphere = Math.max( camera.near, _sphere.distanceToPoint( _ray.origin ) );\n\t\t\tsphereMargin = getWorldSpaceHalfWidth( camera, distanceToSphere, material.resolution );\n\n\t\t}\n\n\t\t_sphere.radius += sphereMargin;\n\n\t\tif ( _ray.intersectsSphere( _sphere ) === false ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// check if we intersect the box bounds\n\t\tif ( geometry.boundingBox === null ) {\n\n\t\t\tgeometry.computeBoundingBox();\n\n\t\t}\n\n\t\t_box.copy( geometry.boundingBox ).applyMatrix4( matrixWorld );\n\n\t\t// increase the box bounds by the worst case line width\n\t\tlet boxMargin;\n\t\tif ( worldUnits ) {\n\n\t\t\tboxMargin = _lineWidth * 0.5;\n\n\t\t} else {\n\n\t\t\tconst distanceToBox = Math.max( camera.near, _box.distanceToPoint( _ray.origin ) );\n\t\t\tboxMargin = getWorldSpaceHalfWidth( camera, distanceToBox, material.resolution );\n\n\t\t}\n\n\t\t_box.expandByScalar( boxMargin );\n\n\t\tif ( _ray.intersectsBox( _box ) === false ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( worldUnits ) {\n\n\t\t\traycastWorldUnits( this, intersects );\n\n\t\t} else {\n\n\t\t\traycastScreenSpace( this, camera, intersects );\n\n\t\t}\n\n\t}\n\n\tonBeforeRender( renderer ) {\n\n\t\tconst uniforms = this.material.uniforms;\n\n\t\tif ( uniforms && uniforms.resolution ) {\n\n\t\t\trenderer.getViewport( _viewport );\n\t\t\tthis.material.uniforms.resolution.value.set( _viewport.z, _viewport.w );\n\n\t\t}\n\n\t}\n\n}\n\nexport { LineSegments2 };\n", "import { LineSegmentsGeometry } from './LineSegmentsGeometry.js';\n\n/**\n * A chain of vertices, forming a polyline.\n *\n * This is used in {@link Line2} to describe the shape.\n *\n * ```js\n * const points = [\n * \tnew THREE.Vector3( - 10, 0, 0 ),\n * \tnew THREE.Vector3( 0, 5, 0 ),\n * \tnew THREE.Vector3( 10, 0, 0 ),\n * ];\n *\n * const geometry = new LineGeometry();\n * geometry.setFromPoints( points );\n * ```\n *\n * @augments LineSegmentsGeometry\n * @three_import import { LineLineGeometry2 } from 'three/addons/lines/LineGeometry.js';\n */\nclass LineGeometry extends LineSegmentsGeometry {\n\n\t/**\n\t * Constructs a new line geometry.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineGeometry = true;\n\n\t\tthis.type = 'LineGeometry';\n\n\t}\n\n\t/**\n\t * Sets the given line positions for this geometry.\n\t *\n\t * @param {Float32Array|Array<number>} array - The position data to set.\n\t * @return {LineGeometry} A reference to this geometry.\n\t */\n\tsetPositions( array ) {\n\n\t\t// converts [ x1, y1, z1,  x2, y2, z2, ... ] to pairs format\n\n\t\tconst length = array.length - 3;\n\t\tconst points = new Float32Array( 2 * length );\n\n\t\tfor ( let i = 0; i < length; i += 3 ) {\n\n\t\t\tpoints[ 2 * i ] = array[ i ];\n\t\t\tpoints[ 2 * i + 1 ] = array[ i + 1 ];\n\t\t\tpoints[ 2 * i + 2 ] = array[ i + 2 ];\n\n\t\t\tpoints[ 2 * i + 3 ] = array[ i + 3 ];\n\t\t\tpoints[ 2 * i + 4 ] = array[ i + 4 ];\n\t\t\tpoints[ 2 * i + 5 ] = array[ i + 5 ];\n\n\t\t}\n\n\t\tsuper.setPositions( points );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given line colors for this geometry.\n\t *\n\t * @param {Float32Array|Array<number>} array - The position data to set.\n\t * @return {LineGeometry} A reference to this geometry.\n\t */\n\tsetColors( array ) {\n\n\t\t// converts [ r1, g1, b1,  r2, g2, b2, ... ] to pairs format\n\n\t\tconst length = array.length - 3;\n\t\tconst colors = new Float32Array( 2 * length );\n\n\t\tfor ( let i = 0; i < length; i += 3 ) {\n\n\t\t\tcolors[ 2 * i ] = array[ i ];\n\t\t\tcolors[ 2 * i + 1 ] = array[ i + 1 ];\n\t\t\tcolors[ 2 * i + 2 ] = array[ i + 2 ];\n\n\t\t\tcolors[ 2 * i + 3 ] = array[ i + 3 ];\n\t\t\tcolors[ 2 * i + 4 ] = array[ i + 4 ];\n\t\t\tcolors[ 2 * i + 5 ] = array[ i + 5 ];\n\n\t\t}\n\n\t\tsuper.setColors( colors );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Setups this line segments geometry from the given sequence of points.\n\t *\n\t * @param {Array<Vector3|Vector2>} points - An array of points in 2D or 3D space.\n\t * @return {LineGeometry} A reference to this geometry.\n\t */\n\tsetFromPoints( points ) {\n\n\t\t// converts a vector3 or vector2 array to pairs format\n\n\t\tconst length = points.length - 1;\n\t\tconst positions = new Float32Array( 6 * length );\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tpositions[ 6 * i ] = points[ i ].x;\n\t\t\tpositions[ 6 * i + 1 ] = points[ i ].y;\n\t\t\tpositions[ 6 * i + 2 ] = points[ i ].z || 0;\n\n\t\t\tpositions[ 6 * i + 3 ] = points[ i + 1 ].x;\n\t\t\tpositions[ 6 * i + 4 ] = points[ i + 1 ].y;\n\t\t\tpositions[ 6 * i + 5 ] = points[ i + 1 ].z || 0;\n\n\t\t}\n\n\t\tsuper.setPositions( positions );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Setups this line segments geometry from the given line.\n\t *\n\t * @param {Line} line - The line that should be used as a data source for this geometry.\n\t * @return {LineGeometry} A reference to this geometry.\n\t */\n\tfromLine( line ) {\n\n\t\tconst geometry = line.geometry;\n\n\t\tthis.setPositions( geometry.attributes.position.array ); // assumes non-indexed\n\n\t\t// set colors, maybe\n\n\t\treturn this;\n\n\t}\n\n}\n\nexport { LineGeometry };\n", "import { LineSegments2 } from './LineSegments2.js';\nimport { LineGeometry } from './LineGeometry.js';\nimport { LineMaterial } from './LineMaterial.js';\n\n/**\n * A polyline drawn between vertices.\n *\n * This adds functionality beyond {@link Line}, like arbitrary line width and changing width to\n * be in world units.It extends {@link LineSegments2}, simplifying constructing segments from a\n * chain of points.\n *\n * This module can only be used with {@link WebGLRenderer}. When using {@link WebGPURenderer},\n * import the class from `lines/webgpu/Line2.js`.\n *\n * ```js\n * const geometry = new LineGeometry();\n * geometry.setPositions( positions );\n * geometry.setColors( colors );\n *\n * const material = new LineMaterial( { linewidth: 5, vertexColors: true } };\n *\n * const line = new Line2( geometry, material );\n * scene.add( line );\n * ```\n *\n * @augments LineSegments2\n * @three_import import { Line2 } from 'three/addons/lines/Line2.js';\n */\nclass Line2 extends LineSegments2 {\n\n\t/**\n\t * Constructs a new wide line.\n\t *\n\t * @param {LineGeometry} [geometry] - The line geometry.\n\t * @param {LineMaterial} [material] - The line material.\n\t */\n\tconstructor( geometry = new LineGeometry(), material = new LineMaterial( { color: Math.random() * 0xffffff } ) ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLine2 = true;\n\n\t\tthis.type = 'Line2';\n\n\t}\n\n}\n\nexport { Line2 };\n", "import {\n\tInstancedInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tMesh,\n\tVector3,\n\tVector4\n} from 'three';\nimport { LineSegmentsGeometry } from './LineSegmentsGeometry.js';\nimport { LineMaterial } from './LineMaterial.js';\n\nconst _start = new Vector3();\nconst _end = new Vector3();\nconst _viewport = new Vector4();\n\n/**\n * A class for creating wireframes based on wide lines.\n *\n * This module can only be used with {@link WebGLRenderer}. When using {@link WebGPURenderer},\n * import the class from `lines/webgpu/Wireframe.js`.\n *\n * ```js\n * const geometry = new THREE.IcosahedronGeometry();\n * const wireframeGeometry = new WireframeGeometry2( geo );\n *\n * const wireframe = new Wireframe( wireframeGeometry, material );\n * scene.add( wireframe );\n * ```\n *\n * @augments Mesh\n * @three_import import { Wireframe } from 'three/addons/lines/Wireframe.js';\n */\nclass Wireframe extends Mesh {\n\n\t/**\n\t * Constructs a new wireframe.\n\t *\n\t * @param {LineSegmentsGeometry} [geometry] - The line geometry.\n\t * @param {LineMaterial} [material] - The line material.\n\t */\n\tconstructor( geometry = new LineSegmentsGeometry(), material = new LineMaterial( { color: Math.random() * 0xffffff } ) ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWireframe = true;\n\n\t\tthis.type = 'Wireframe';\n\n\t}\n\n\t/**\n\t * Computes an array of distance values which are necessary for rendering dashed lines.\n\t * For each vertex in the geometry, the method calculates the cumulative length from the\n\t * current point to the very beginning of the line.\n\t *\n\t * @return {Wireframe} A reference to this instance.\n\t */\n\tcomputeLineDistances() {\n\n\t\t// for backwards-compatibility, but could be a method of LineSegmentsGeometry...\n\n\t\tconst geometry = this.geometry;\n\n\t\tconst instanceStart = geometry.attributes.instanceStart;\n\t\tconst instanceEnd = geometry.attributes.instanceEnd;\n\t\tconst lineDistances = new Float32Array( 2 * instanceStart.count );\n\n\t\tfor ( let i = 0, j = 0, l = instanceStart.count; i < l; i ++, j += 2 ) {\n\n\t\t\t_start.fromBufferAttribute( instanceStart, i );\n\t\t\t_end.fromBufferAttribute( instanceEnd, i );\n\n\t\t\tlineDistances[ j ] = ( j === 0 ) ? 0 : lineDistances[ j - 1 ];\n\t\t\tlineDistances[ j + 1 ] = lineDistances[ j ] + _start.distanceTo( _end );\n\n\t\t}\n\n\t\tconst instanceDistanceBuffer = new InstancedInterleavedBuffer( lineDistances, 2, 1 ); // d0, d1\n\n\t\tgeometry.setAttribute( 'instanceDistanceStart', new InterleavedBufferAttribute( instanceDistanceBuffer, 1, 0 ) ); // d0\n\t\tgeometry.setAttribute( 'instanceDistanceEnd', new InterleavedBufferAttribute( instanceDistanceBuffer, 1, 1 ) ); // d1\n\n\t\treturn this;\n\n\t}\n\n\tonBeforeRender( renderer ) {\n\n\t\tconst uniforms = this.material.uniforms;\n\n\t\tif ( uniforms && uniforms.resolution ) {\n\n\t\t\trenderer.getViewport( _viewport );\n\t\t\tthis.material.uniforms.resolution.value.set( _viewport.z, _viewport.w );\n\n\t\t}\n\n\t}\n\n}\n\nexport { Wireframe };\n", "import {\n\tWireframeGeometry\n} from 'three';\nimport { LineSegmentsGeometry } from './LineSegmentsGeometry.js';\n\n/**\n * A special type of line segments geometry intended for wireframe rendering.\n *\n * This is used in {@link Wireframe} to describe the shape.\n *\n * ```js\n * const geometry = new THREE.IcosahedronGeometry();\n * const wireframeGeometry = new WireframeGeometry2( geo );\n * ```\n *\n * @augments LineSegmentsGeometry\n * @three_import import { WireframeGeometry2 } from 'three/addons/lines/WireframeGeometry2.js';\n */\nclass WireframeGeometry2 extends LineSegmentsGeometry {\n\n\t/**\n\t * Constructs a new wireframe geometry.\n\t *\n\t * @param {BufferGeometry} [geometry] - The geometry to render the wireframe for.\n\t */\n\tconstructor( geometry ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWireframeGeometry2 = true;\n\n\t\tthis.type = 'WireframeGeometry2';\n\n\t\tthis.fromWireframeGeometry( new WireframeGeometry( geometry ) );\n\n\t\t// set colors, maybe\n\n\t}\n\n}\n\nexport { WireframeGeometry2 };\n", "import {\n\tDataTextureLoader,\n\tDataUtils,\n\tFloatType,\n\tHalfFloatType,\n\tLinearFilter,\n\tLinearSRGBColorSpace,\n\tRedFormat,\n\tRGFormat,\n\tRGBAFormat\n} from 'three';\nimport * as fflate from '../libs/fflate.module.js';\n\n// Referred to the original Industrial Light & Magic OpenEXR implementation and the TinyEXR / Syoyo Fujita\n// implementation, so I have preserved their copyright notices.\n\n// /*\n// Copyright (c) 2014 - 2017, Syoyo Fujita\n// All rights reserved.\n\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n//     * Redistributions of source code must retain the above copyright\n//       notice, this list of conditions and the following disclaimer.\n//     * Redistributions in binary form must reproduce the above copyright\n//       notice, this list of conditions and the following disclaimer in the\n//       documentation and/or other materials provided with the distribution.\n//     * Neither the name of the Syoyo Fujita nor the\n//       names of its contributors may be used to endorse or promote products\n//       derived from this software without specific prior written permission.\n\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND\n// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\n// DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY\n// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND\n// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n// */\n\n// // TinyEXR contains some OpenEXR code, which is licensed under ------------\n\n// ///////////////////////////////////////////////////////////////////////////\n// //\n// // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas\n// // Digital Ltd. LLC\n// //\n// // All rights reserved.\n// //\n// // Redistribution and use in source and binary forms, with or without\n// // modification, are permitted provided that the following conditions are\n// // met:\n// // *       Redistributions of source code must retain the above copyright\n// // notice, this list of conditions and the following disclaimer.\n// // *       Redistributions in binary form must reproduce the above\n// // copyright notice, this list of conditions and the following disclaimer\n// // in the documentation and/or other materials provided with the\n// // distribution.\n// // *       Neither the name of Industrial Light & Magic nor the names of\n// // its contributors may be used to endorse or promote products derived\n// // from this software without specific prior written permission.\n// //\n// // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n// // \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n// // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n// // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n// // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n// // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n// // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n// // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n// // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n// // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n// // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n// //\n// ///////////////////////////////////////////////////////////////////////////\n\n// // End of OpenEXR license -------------------------------------------------\n\n\n/**\n * A loader for the OpenEXR texture format.\n *\n * `EXRLoader` currently supports uncompressed, ZIP(S), RLE, PIZ and DWA/B compression.\n * Supports reading as UnsignedByte, HalfFloat and Float type data texture.\n *\n * ```js\n * const loader = new EXRLoader();\n * const texture = await loader.loadAsync( 'textures/memorial.exr' );\n * ```\n *\n * @augments DataTextureLoader\n * @three_import import { EXRLoader } from 'three/addons/loaders/EXRLoader.js';\n */\nclass EXRLoader extends DataTextureLoader {\n\n\t/**\n\t * Constructs a new EXR loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * The texture type.\n\t\t *\n\t\t * @type {(HalfFloatType|FloatType)}\n\t\t * @default HalfFloatType\n\t\t */\n\t\tthis.type = HalfFloatType;\n\n\t\t/**\n\t\t * Texture output format.\n\t\t *\n\t\t * @type {(RGBAFormat|RGFormat|RedFormat)}\n\t\t * @default RGBAFormat\n\t\t */\n\t\tthis.outputFormat = RGBAFormat;\n\n\t}\n\n\t/**\n\t * Parses the given EXR texture data.\n\t *\n\t * @param {ArrayBuffer} buffer - The raw texture data.\n\t * @return {DataTextureLoader~TexData} An object representing the parsed texture data.\n\t */\n\tparse( buffer ) {\n\n\t\tconst USHORT_RANGE = ( 1 << 16 );\n\t\tconst BITMAP_SIZE = ( USHORT_RANGE >> 3 );\n\n\t\tconst HUF_ENCBITS = 16; // literal (value) bit length\n\t\tconst HUF_DECBITS = 14; // decoding bit size (>= 8)\n\n\t\tconst HUF_ENCSIZE = ( 1 << HUF_ENCBITS ) + 1; // encoding table size\n\t\tconst HUF_DECSIZE = 1 << HUF_DECBITS; // decoding table size\n\t\tconst HUF_DECMASK = HUF_DECSIZE - 1;\n\n\t\tconst NBITS = 16;\n\t\tconst A_OFFSET = 1 << ( NBITS - 1 );\n\t\tconst MOD_MASK = ( 1 << NBITS ) - 1;\n\n\t\tconst SHORT_ZEROCODE_RUN = 59;\n\t\tconst LONG_ZEROCODE_RUN = 63;\n\t\tconst SHORTEST_LONG_RUN = 2 + LONG_ZEROCODE_RUN - SHORT_ZEROCODE_RUN;\n\n\t\tconst ULONG_SIZE = 8;\n\t\tconst FLOAT32_SIZE = 4;\n\t\tconst INT32_SIZE = 4;\n\t\tconst INT16_SIZE = 2;\n\t\tconst INT8_SIZE = 1;\n\n\t\tconst STATIC_HUFFMAN = 0;\n\t\tconst DEFLATE = 1;\n\n\t\tconst UNKNOWN = 0;\n\t\tconst LOSSY_DCT = 1;\n\t\tconst RLE = 2;\n\n\t\tconst logBase = Math.pow( 2.7182818, 2.2 );\n\n\t\tfunction reverseLutFromBitmap( bitmap, lut ) {\n\n\t\t\tlet k = 0;\n\n\t\t\tfor ( let i = 0; i < USHORT_RANGE; ++ i ) {\n\n\t\t\t\tif ( ( i == 0 ) || ( bitmap[ i >> 3 ] & ( 1 << ( i & 7 ) ) ) ) {\n\n\t\t\t\t\tlut[ k ++ ] = i;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst n = k - 1;\n\n\t\t\twhile ( k < USHORT_RANGE ) lut[ k ++ ] = 0;\n\n\t\t\treturn n;\n\n\t\t}\n\n\t\tfunction hufClearDecTable( hdec ) {\n\n\t\t\tfor ( let i = 0; i < HUF_DECSIZE; i ++ ) {\n\n\t\t\t\thdec[ i ] = {};\n\t\t\t\thdec[ i ].len = 0;\n\t\t\t\thdec[ i ].lit = 0;\n\t\t\t\thdec[ i ].p = null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst getBitsReturn = { l: 0, c: 0, lc: 0 };\n\n\t\tfunction getBits( nBits, c, lc, uInt8Array, inOffset ) {\n\n\t\t\twhile ( lc < nBits ) {\n\n\t\t\t\tc = ( c << 8 ) | parseUint8Array( uInt8Array, inOffset );\n\t\t\t\tlc += 8;\n\n\t\t\t}\n\n\t\t\tlc -= nBits;\n\n\t\t\tgetBitsReturn.l = ( c >> lc ) & ( ( 1 << nBits ) - 1 );\n\t\t\tgetBitsReturn.c = c;\n\t\t\tgetBitsReturn.lc = lc;\n\n\t\t}\n\n\t\tconst hufTableBuffer = new Array( 59 );\n\n\t\tfunction hufCanonicalCodeTable( hcode ) {\n\n\t\t\tfor ( let i = 0; i <= 58; ++ i ) hufTableBuffer[ i ] = 0;\n\t\t\tfor ( let i = 0; i < HUF_ENCSIZE; ++ i ) hufTableBuffer[ hcode[ i ] ] += 1;\n\n\t\t\tlet c = 0;\n\n\t\t\tfor ( let i = 58; i > 0; -- i ) {\n\n\t\t\t\tconst nc = ( ( c + hufTableBuffer[ i ] ) >> 1 );\n\t\t\t\thufTableBuffer[ i ] = c;\n\t\t\t\tc = nc;\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < HUF_ENCSIZE; ++ i ) {\n\n\t\t\t\tconst l = hcode[ i ];\n\t\t\t\tif ( l > 0 ) hcode[ i ] = l | ( hufTableBuffer[ l ] ++ << 6 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction hufUnpackEncTable( uInt8Array, inOffset, ni, im, iM, hcode ) {\n\n\t\t\tconst p = inOffset;\n\t\t\tlet c = 0;\n\t\t\tlet lc = 0;\n\n\t\t\tfor ( ; im <= iM; im ++ ) {\n\n\t\t\t\tif ( p.value - inOffset.value > ni ) return false;\n\n\t\t\t\tgetBits( 6, c, lc, uInt8Array, p );\n\n\t\t\t\tconst l = getBitsReturn.l;\n\t\t\t\tc = getBitsReturn.c;\n\t\t\t\tlc = getBitsReturn.lc;\n\n\t\t\t\thcode[ im ] = l;\n\n\t\t\t\tif ( l == LONG_ZEROCODE_RUN ) {\n\n\t\t\t\t\tif ( p.value - inOffset.value > ni ) {\n\n\t\t\t\t\t\tthrow new Error( 'Something wrong with hufUnpackEncTable' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgetBits( 8, c, lc, uInt8Array, p );\n\n\t\t\t\t\tlet zerun = getBitsReturn.l + SHORTEST_LONG_RUN;\n\t\t\t\t\tc = getBitsReturn.c;\n\t\t\t\t\tlc = getBitsReturn.lc;\n\n\t\t\t\t\tif ( im + zerun > iM + 1 ) {\n\n\t\t\t\t\t\tthrow new Error( 'Something wrong with hufUnpackEncTable' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\twhile ( zerun -- ) hcode[ im ++ ] = 0;\n\n\t\t\t\t\tim --;\n\n\t\t\t\t} else if ( l >= SHORT_ZEROCODE_RUN ) {\n\n\t\t\t\t\tlet zerun = l - SHORT_ZEROCODE_RUN + 2;\n\n\t\t\t\t\tif ( im + zerun > iM + 1 ) {\n\n\t\t\t\t\t\tthrow new Error( 'Something wrong with hufUnpackEncTable' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\twhile ( zerun -- ) hcode[ im ++ ] = 0;\n\n\t\t\t\t\tim --;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\thufCanonicalCodeTable( hcode );\n\n\t\t}\n\n\t\tfunction hufLength( code ) {\n\n\t\t\treturn code & 63;\n\n\t\t}\n\n\t\tfunction hufCode( code ) {\n\n\t\t\treturn code >> 6;\n\n\t\t}\n\n\t\tfunction hufBuildDecTable( hcode, im, iM, hdecod ) {\n\n\t\t\tfor ( ; im <= iM; im ++ ) {\n\n\t\t\t\tconst c = hufCode( hcode[ im ] );\n\t\t\t\tconst l = hufLength( hcode[ im ] );\n\n\t\t\t\tif ( c >> l ) {\n\n\t\t\t\t\tthrow new Error( 'Invalid table entry' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( l > HUF_DECBITS ) {\n\n\t\t\t\t\tconst pl = hdecod[ ( c >> ( l - HUF_DECBITS ) ) ];\n\n\t\t\t\t\tif ( pl.len ) {\n\n\t\t\t\t\t\tthrow new Error( 'Invalid table entry' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tpl.lit ++;\n\n\t\t\t\t\tif ( pl.p ) {\n\n\t\t\t\t\t\tconst p = pl.p;\n\t\t\t\t\t\tpl.p = new Array( pl.lit );\n\n\t\t\t\t\t\tfor ( let i = 0; i < pl.lit - 1; ++ i ) {\n\n\t\t\t\t\t\t\tpl.p[ i ] = p[ i ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpl.p = new Array( 1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tpl.p[ pl.lit - 1 ] = im;\n\n\t\t\t\t} else if ( l ) {\n\n\t\t\t\t\tlet plOffset = 0;\n\n\t\t\t\t\tfor ( let i = 1 << ( HUF_DECBITS - l ); i > 0; i -- ) {\n\n\t\t\t\t\t\tconst pl = hdecod[ ( c << ( HUF_DECBITS - l ) ) + plOffset ];\n\n\t\t\t\t\t\tif ( pl.len || pl.p ) {\n\n\t\t\t\t\t\t\tthrow new Error( 'Invalid table entry' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tpl.len = l;\n\t\t\t\t\t\tpl.lit = im;\n\n\t\t\t\t\t\tplOffset ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tconst getCharReturn = { c: 0, lc: 0 };\n\n\t\tfunction getChar( c, lc, uInt8Array, inOffset ) {\n\n\t\t\tc = ( c << 8 ) | parseUint8Array( uInt8Array, inOffset );\n\t\t\tlc += 8;\n\n\t\t\tgetCharReturn.c = c;\n\t\t\tgetCharReturn.lc = lc;\n\n\t\t}\n\n\t\tconst getCodeReturn = { c: 0, lc: 0 };\n\n\t\tfunction getCode( po, rlc, c, lc, uInt8Array, inOffset, outBuffer, outBufferOffset, outBufferEndOffset ) {\n\n\t\t\tif ( po == rlc ) {\n\n\t\t\t\tif ( lc < 8 ) {\n\n\t\t\t\t\tgetChar( c, lc, uInt8Array, inOffset );\n\t\t\t\t\tc = getCharReturn.c;\n\t\t\t\t\tlc = getCharReturn.lc;\n\n\t\t\t\t}\n\n\t\t\t\tlc -= 8;\n\n\t\t\t\tlet cs = ( c >> lc );\n\t\t\t\tcs = new Uint8Array( [ cs ] )[ 0 ];\n\n\t\t\t\tif ( outBufferOffset.value + cs > outBufferEndOffset ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t\tconst s = outBuffer[ outBufferOffset.value - 1 ];\n\n\t\t\t\twhile ( cs -- > 0 ) {\n\n\t\t\t\t\toutBuffer[ outBufferOffset.value ++ ] = s;\n\n\t\t\t\t}\n\n\t\t\t} else if ( outBufferOffset.value < outBufferEndOffset ) {\n\n\t\t\t\toutBuffer[ outBufferOffset.value ++ ] = po;\n\n\t\t\t} else {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\tgetCodeReturn.c = c;\n\t\t\tgetCodeReturn.lc = lc;\n\n\t\t}\n\n\t\tfunction UInt16( value ) {\n\n\t\t\treturn ( value & 0xFFFF );\n\n\t\t}\n\n\t\tfunction Int16( value ) {\n\n\t\t\tconst ref = UInt16( value );\n\t\t\treturn ( ref > 0x7FFF ) ? ref - 0x10000 : ref;\n\n\t\t}\n\n\t\tconst wdec14Return = { a: 0, b: 0 };\n\n\t\tfunction wdec14( l, h ) {\n\n\t\t\tconst ls = Int16( l );\n\t\t\tconst hs = Int16( h );\n\n\t\t\tconst hi = hs;\n\t\t\tconst ai = ls + ( hi & 1 ) + ( hi >> 1 );\n\n\t\t\tconst as = ai;\n\t\t\tconst bs = ai - hi;\n\n\t\t\twdec14Return.a = as;\n\t\t\twdec14Return.b = bs;\n\n\t\t}\n\n\t\tfunction wdec16( l, h ) {\n\n\t\t\tconst m = UInt16( l );\n\t\t\tconst d = UInt16( h );\n\n\t\t\tconst bb = ( m - ( d >> 1 ) ) & MOD_MASK;\n\t\t\tconst aa = ( d + bb - A_OFFSET ) & MOD_MASK;\n\n\t\t\twdec14Return.a = aa;\n\t\t\twdec14Return.b = bb;\n\n\t\t}\n\n\t\tfunction wav2Decode( buffer, j, nx, ox, ny, oy, mx ) {\n\n\t\t\tconst w14 = mx < ( 1 << 14 );\n\t\t\tconst n = ( nx > ny ) ? ny : nx;\n\t\t\tlet p = 1;\n\t\t\tlet p2;\n\t\t\tlet py;\n\n\t\t\twhile ( p <= n ) p <<= 1;\n\n\t\t\tp >>= 1;\n\t\t\tp2 = p;\n\t\t\tp >>= 1;\n\n\t\t\twhile ( p >= 1 ) {\n\n\t\t\t\tpy = 0;\n\t\t\t\tconst ey = py + oy * ( ny - p2 );\n\t\t\t\tconst oy1 = oy * p;\n\t\t\t\tconst oy2 = oy * p2;\n\t\t\t\tconst ox1 = ox * p;\n\t\t\t\tconst ox2 = ox * p2;\n\t\t\t\tlet i00, i01, i10, i11;\n\n\t\t\t\tfor ( ; py <= ey; py += oy2 ) {\n\n\t\t\t\t\tlet px = py;\n\t\t\t\t\tconst ex = py + ox * ( nx - p2 );\n\n\t\t\t\t\tfor ( ; px <= ex; px += ox2 ) {\n\n\t\t\t\t\t\tconst p01 = px + ox1;\n\t\t\t\t\t\tconst p10 = px + oy1;\n\t\t\t\t\t\tconst p11 = p10 + ox1;\n\n\t\t\t\t\t\tif ( w14 ) {\n\n\t\t\t\t\t\t\twdec14( buffer[ px + j ], buffer[ p10 + j ] );\n\n\t\t\t\t\t\t\ti00 = wdec14Return.a;\n\t\t\t\t\t\t\ti10 = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec14( buffer[ p01 + j ], buffer[ p11 + j ] );\n\n\t\t\t\t\t\t\ti01 = wdec14Return.a;\n\t\t\t\t\t\t\ti11 = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec14( i00, i01 );\n\n\t\t\t\t\t\t\tbuffer[ px + j ] = wdec14Return.a;\n\t\t\t\t\t\t\tbuffer[ p01 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec14( i10, i11 );\n\n\t\t\t\t\t\t\tbuffer[ p10 + j ] = wdec14Return.a;\n\t\t\t\t\t\t\tbuffer[ p11 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\twdec16( buffer[ px + j ], buffer[ p10 + j ] );\n\n\t\t\t\t\t\t\ti00 = wdec14Return.a;\n\t\t\t\t\t\t\ti10 = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec16( buffer[ p01 + j ], buffer[ p11 + j ] );\n\n\t\t\t\t\t\t\ti01 = wdec14Return.a;\n\t\t\t\t\t\t\ti11 = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec16( i00, i01 );\n\n\t\t\t\t\t\t\tbuffer[ px + j ] = wdec14Return.a;\n\t\t\t\t\t\t\tbuffer[ p01 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\t\twdec16( i10, i11 );\n\n\t\t\t\t\t\t\tbuffer[ p10 + j ] = wdec14Return.a;\n\t\t\t\t\t\t\tbuffer[ p11 + j ] = wdec14Return.b;\n\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( nx & p ) {\n\n\t\t\t\t\t\tconst p10 = px + oy1;\n\n\t\t\t\t\t\tif ( w14 )\n\t\t\t\t\t\t\twdec14( buffer[ px + j ], buffer[ p10 + j ] );\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\twdec16( buffer[ px + j ], buffer[ p10 + j ] );\n\n\t\t\t\t\t\ti00 = wdec14Return.a;\n\t\t\t\t\t\tbuffer[ p10 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\tbuffer[ px + j ] = i00;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( ny & p ) {\n\n\t\t\t\t\tlet px = py;\n\t\t\t\t\tconst ex = py + ox * ( nx - p2 );\n\n\t\t\t\t\tfor ( ; px <= ex; px += ox2 ) {\n\n\t\t\t\t\t\tconst p01 = px + ox1;\n\n\t\t\t\t\t\tif ( w14 )\n\t\t\t\t\t\t\twdec14( buffer[ px + j ], buffer[ p01 + j ] );\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\twdec16( buffer[ px + j ], buffer[ p01 + j ] );\n\n\t\t\t\t\t\ti00 = wdec14Return.a;\n\t\t\t\t\t\tbuffer[ p01 + j ] = wdec14Return.b;\n\n\t\t\t\t\t\tbuffer[ px + j ] = i00;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tp2 = p;\n\t\t\t\tp >>= 1;\n\n\t\t\t}\n\n\t\t\treturn py;\n\n\t\t}\n\n\t\tfunction hufDecode( encodingTable, decodingTable, uInt8Array, inOffset, ni, rlc, no, outBuffer, outOffset ) {\n\n\t\t\tlet c = 0;\n\t\t\tlet lc = 0;\n\t\t\tconst outBufferEndOffset = no;\n\t\t\tconst inOffsetEnd = Math.trunc( inOffset.value + ( ni + 7 ) / 8 );\n\n\t\t\twhile ( inOffset.value < inOffsetEnd ) {\n\n\t\t\t\tgetChar( c, lc, uInt8Array, inOffset );\n\n\t\t\t\tc = getCharReturn.c;\n\t\t\t\tlc = getCharReturn.lc;\n\n\t\t\t\twhile ( lc >= HUF_DECBITS ) {\n\n\t\t\t\t\tconst index = ( c >> ( lc - HUF_DECBITS ) ) & HUF_DECMASK;\n\t\t\t\t\tconst pl = decodingTable[ index ];\n\n\t\t\t\t\tif ( pl.len ) {\n\n\t\t\t\t\t\tlc -= pl.len;\n\n\t\t\t\t\t\tgetCode( pl.lit, rlc, c, lc, uInt8Array, inOffset, outBuffer, outOffset, outBufferEndOffset );\n\n\t\t\t\t\t\tc = getCodeReturn.c;\n\t\t\t\t\t\tlc = getCodeReturn.lc;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( ! pl.p ) {\n\n\t\t\t\t\t\t\tthrow new Error( 'hufDecode issues' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet j;\n\n\t\t\t\t\t\tfor ( j = 0; j < pl.lit; j ++ ) {\n\n\t\t\t\t\t\t\tconst l = hufLength( encodingTable[ pl.p[ j ] ] );\n\n\t\t\t\t\t\t\twhile ( lc < l && inOffset.value < inOffsetEnd ) {\n\n\t\t\t\t\t\t\t\tgetChar( c, lc, uInt8Array, inOffset );\n\n\t\t\t\t\t\t\t\tc = getCharReturn.c;\n\t\t\t\t\t\t\t\tlc = getCharReturn.lc;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( lc >= l ) {\n\n\t\t\t\t\t\t\t\tif ( hufCode( encodingTable[ pl.p[ j ] ] ) == ( ( c >> ( lc - l ) ) & ( ( 1 << l ) - 1 ) ) ) {\n\n\t\t\t\t\t\t\t\t\tlc -= l;\n\n\t\t\t\t\t\t\t\t\tgetCode( pl.p[ j ], rlc, c, lc, uInt8Array, inOffset, outBuffer, outOffset, outBufferEndOffset );\n\n\t\t\t\t\t\t\t\t\tc = getCodeReturn.c;\n\t\t\t\t\t\t\t\t\tlc = getCodeReturn.lc;\n\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( j == pl.lit ) {\n\n\t\t\t\t\t\t\tthrow new Error( 'hufDecode issues' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst i = ( 8 - ni ) & 7;\n\n\t\t\tc >>= i;\n\t\t\tlc -= i;\n\n\t\t\twhile ( lc > 0 ) {\n\n\t\t\t\tconst pl = decodingTable[ ( c << ( HUF_DECBITS - lc ) ) & HUF_DECMASK ];\n\n\t\t\t\tif ( pl.len ) {\n\n\t\t\t\t\tlc -= pl.len;\n\n\t\t\t\t\tgetCode( pl.lit, rlc, c, lc, uInt8Array, inOffset, outBuffer, outOffset, outBufferEndOffset );\n\n\t\t\t\t\tc = getCodeReturn.c;\n\t\t\t\t\tlc = getCodeReturn.lc;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'hufDecode issues' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction hufUncompress( uInt8Array, inDataView, inOffset, nCompressed, outBuffer, nRaw ) {\n\n\t\t\tconst outOffset = { value: 0 };\n\t\t\tconst initialInOffset = inOffset.value;\n\n\t\t\tconst im = parseUint32( inDataView, inOffset );\n\t\t\tconst iM = parseUint32( inDataView, inOffset );\n\n\t\t\tinOffset.value += 4;\n\n\t\t\tconst nBits = parseUint32( inDataView, inOffset );\n\n\t\t\tinOffset.value += 4;\n\n\t\t\tif ( im < 0 || im >= HUF_ENCSIZE || iM < 0 || iM >= HUF_ENCSIZE ) {\n\n\t\t\t\tthrow new Error( 'Something wrong with HUF_ENCSIZE' );\n\n\t\t\t}\n\n\t\t\tconst freq = new Array( HUF_ENCSIZE );\n\t\t\tconst hdec = new Array( HUF_DECSIZE );\n\n\t\t\thufClearDecTable( hdec );\n\n\t\t\tconst ni = nCompressed - ( inOffset.value - initialInOffset );\n\n\t\t\thufUnpackEncTable( uInt8Array, inOffset, ni, im, iM, freq );\n\n\t\t\tif ( nBits > 8 * ( nCompressed - ( inOffset.value - initialInOffset ) ) ) {\n\n\t\t\t\tthrow new Error( 'Something wrong with hufUncompress' );\n\n\t\t\t}\n\n\t\t\thufBuildDecTable( freq, im, iM, hdec );\n\n\t\t\thufDecode( freq, hdec, uInt8Array, inOffset, nBits, iM, nRaw, outBuffer, outOffset );\n\n\t\t}\n\n\t\tfunction applyLut( lut, data, nData ) {\n\n\t\t\tfor ( let i = 0; i < nData; ++ i ) {\n\n\t\t\t\tdata[ i ] = lut[ data[ i ] ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction predictor( source ) {\n\n\t\t\tfor ( let t = 1; t < source.length; t ++ ) {\n\n\t\t\t\tconst d = source[ t - 1 ] + source[ t ] - 128;\n\t\t\t\tsource[ t ] = d;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction interleaveScalar( source, out ) {\n\n\t\t\tlet t1 = 0;\n\t\t\tlet t2 = Math.floor( ( source.length + 1 ) / 2 );\n\t\t\tlet s = 0;\n\t\t\tconst stop = source.length - 1;\n\n\t\t\twhile ( true ) {\n\n\t\t\t\tif ( s > stop ) break;\n\t\t\t\tout[ s ++ ] = source[ t1 ++ ];\n\n\t\t\t\tif ( s > stop ) break;\n\t\t\t\tout[ s ++ ] = source[ t2 ++ ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction decodeRunLength( source ) {\n\n\t\t\tlet size = source.byteLength;\n\t\t\tconst out = new Array();\n\t\t\tlet p = 0;\n\n\t\t\tconst reader = new DataView( source );\n\n\t\t\twhile ( size > 0 ) {\n\n\t\t\t\tconst l = reader.getInt8( p ++ );\n\n\t\t\t\tif ( l < 0 ) {\n\n\t\t\t\t\tconst count = - l;\n\t\t\t\t\tsize -= count + 1;\n\n\t\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\t\tout.push( reader.getUint8( p ++ ) );\n\n\t\t\t\t\t}\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst count = l;\n\t\t\t\t\tsize -= 2;\n\n\t\t\t\t\tconst value = reader.getUint8( p ++ );\n\n\t\t\t\t\tfor ( let i = 0; i < count + 1; i ++ ) {\n\n\t\t\t\t\t\tout.push( value );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn out;\n\n\t\t}\n\n\t\tfunction lossyDctDecode( cscSet, rowPtrs, channelData, acBuffer, dcBuffer, outBuffer ) {\n\n\t\t\tlet dataView = new DataView( outBuffer.buffer );\n\n\t\t\tconst width = channelData[ cscSet.idx[ 0 ] ].width;\n\t\t\tconst height = channelData[ cscSet.idx[ 0 ] ].height;\n\n\t\t\tconst numComp = 3;\n\n\t\t\tconst numFullBlocksX = Math.floor( width / 8.0 );\n\t\t\tconst numBlocksX = Math.ceil( width / 8.0 );\n\t\t\tconst numBlocksY = Math.ceil( height / 8.0 );\n\t\t\tconst leftoverX = width - ( numBlocksX - 1 ) * 8;\n\t\t\tconst leftoverY = height - ( numBlocksY - 1 ) * 8;\n\n\t\t\tconst currAcComp = { value: 0 };\n\t\t\tconst currDcComp = new Array( numComp );\n\t\t\tconst dctData = new Array( numComp );\n\t\t\tconst halfZigBlock = new Array( numComp );\n\t\t\tconst rowBlock = new Array( numComp );\n\t\t\tconst rowOffsets = new Array( numComp );\n\n\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\trowOffsets[ comp ] = rowPtrs[ cscSet.idx[ comp ] ];\n\t\t\t\tcurrDcComp[ comp ] = ( comp < 1 ) ? 0 : currDcComp[ comp - 1 ] + numBlocksX * numBlocksY;\n\t\t\t\tdctData[ comp ] = new Float32Array( 64 );\n\t\t\t\thalfZigBlock[ comp ] = new Uint16Array( 64 );\n\t\t\t\trowBlock[ comp ] = new Uint16Array( numBlocksX * 64 );\n\n\t\t\t}\n\n\t\t\tfor ( let blocky = 0; blocky < numBlocksY; ++ blocky ) {\n\n\t\t\t\tlet maxY = 8;\n\n\t\t\t\tif ( blocky == numBlocksY - 1 )\n\t\t\t\t\tmaxY = leftoverY;\n\n\t\t\t\tlet maxX = 8;\n\n\t\t\t\tfor ( let blockx = 0; blockx < numBlocksX; ++ blockx ) {\n\n\t\t\t\t\tif ( blockx == numBlocksX - 1 )\n\t\t\t\t\t\tmaxX = leftoverX;\n\n\t\t\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\t\t\thalfZigBlock[ comp ].fill( 0 );\n\n\t\t\t\t\t\t// set block DC component\n\t\t\t\t\t\thalfZigBlock[ comp ][ 0 ] = dcBuffer[ currDcComp[ comp ] ++ ];\n\t\t\t\t\t\t// set block AC components\n\t\t\t\t\t\tunRleAC( currAcComp, acBuffer, halfZigBlock[ comp ] );\n\n\t\t\t\t\t\t// UnZigZag block to float\n\t\t\t\t\t\tunZigZag( halfZigBlock[ comp ], dctData[ comp ] );\n\t\t\t\t\t\t// decode float dct\n\t\t\t\t\t\tdctInverse( dctData[ comp ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( numComp == 3 ) {\n\n\t\t\t\t\t\tcsc709Inverse( dctData );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\t\t\tconvertToHalf( dctData[ comp ], rowBlock[ comp ], blockx * 64 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} // blockx\n\n\t\t\t\tlet offset = 0;\n\n\t\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\t\tconst type = channelData[ cscSet.idx[ comp ] ].type;\n\n\t\t\t\t\tfor ( let y = 8 * blocky; y < 8 * blocky + maxY; ++ y ) {\n\n\t\t\t\t\t\toffset = rowOffsets[ comp ][ y ];\n\n\t\t\t\t\t\tfor ( let blockx = 0; blockx < numFullBlocksX; ++ blockx ) {\n\n\t\t\t\t\t\t\tconst src = blockx * 64 + ( ( y & 0x7 ) * 8 );\n\n\t\t\t\t\t\t\tdataView.setUint16( offset + 0 * INT16_SIZE * type, rowBlock[ comp ][ src + 0 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 1 * INT16_SIZE * type, rowBlock[ comp ][ src + 1 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 2 * INT16_SIZE * type, rowBlock[ comp ][ src + 2 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 3 * INT16_SIZE * type, rowBlock[ comp ][ src + 3 ], true );\n\n\t\t\t\t\t\t\tdataView.setUint16( offset + 4 * INT16_SIZE * type, rowBlock[ comp ][ src + 4 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 5 * INT16_SIZE * type, rowBlock[ comp ][ src + 5 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 6 * INT16_SIZE * type, rowBlock[ comp ][ src + 6 ], true );\n\t\t\t\t\t\t\tdataView.setUint16( offset + 7 * INT16_SIZE * type, rowBlock[ comp ][ src + 7 ], true );\n\n\t\t\t\t\t\t\toffset += 8 * INT16_SIZE * type;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// handle partial X blocks\n\t\t\t\t\tif ( numFullBlocksX != numBlocksX ) {\n\n\t\t\t\t\t\tfor ( let y = 8 * blocky; y < 8 * blocky + maxY; ++ y ) {\n\n\t\t\t\t\t\t\tconst offset = rowOffsets[ comp ][ y ] + 8 * numFullBlocksX * INT16_SIZE * type;\n\t\t\t\t\t\t\tconst src = numFullBlocksX * 64 + ( ( y & 0x7 ) * 8 );\n\n\t\t\t\t\t\t\tfor ( let x = 0; x < maxX; ++ x ) {\n\n\t\t\t\t\t\t\t\tdataView.setUint16( offset + x * INT16_SIZE * type, rowBlock[ comp ][ src + x ], true );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} // comp\n\n\t\t\t} // blocky\n\n\t\t\tconst halfRow = new Uint16Array( width );\n\t\t\tdataView = new DataView( outBuffer.buffer );\n\n\t\t\t// convert channels back to float, if needed\n\t\t\tfor ( let comp = 0; comp < numComp; ++ comp ) {\n\n\t\t\t\tchannelData[ cscSet.idx[ comp ] ].decoded = true;\n\t\t\t\tconst type = channelData[ cscSet.idx[ comp ] ].type;\n\n\t\t\t\tif ( channelData[ comp ].type != 2 ) continue;\n\n\t\t\t\tfor ( let y = 0; y < height; ++ y ) {\n\n\t\t\t\t\tconst offset = rowOffsets[ comp ][ y ];\n\n\t\t\t\t\tfor ( let x = 0; x < width; ++ x ) {\n\n\t\t\t\t\t\thalfRow[ x ] = dataView.getUint16( offset + x * INT16_SIZE * type, true );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let x = 0; x < width; ++ x ) {\n\n\t\t\t\t\t\tdataView.setFloat32( offset + x * INT16_SIZE * type, decodeFloat16( halfRow[ x ] ), true );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction lossyDctChannelDecode( channelIndex, rowPtrs, channelData, acBuffer, dcBuffer, outBuffer ) {\n\n\t\t\tconst dataView = new DataView( outBuffer.buffer );\n\t\t\tconst cd = channelData[ channelIndex ];\n\t\t\tconst width = cd.width;\n\t\t\tconst height = cd.height;\n\n\t\t\tconst numBlocksX = Math.ceil( width / 8.0 );\n\t\t\tconst numBlocksY = Math.ceil( height / 8.0 );\n\t\t\tconst numFullBlocksX = Math.floor( width / 8.0 );\n\t\t\tconst leftoverX = width - ( numBlocksX - 1 ) * 8;\n\t\t\tconst leftoverY = height - ( numBlocksY - 1 ) * 8;\n\n\t\t\tconst currAcComp = { value: 0 };\n\t\t\tlet currDcComp = 0;\n\t\t\tconst dctData = new Float32Array( 64 );\n\t\t\tconst halfZigBlock = new Uint16Array( 64 );\n\t\t\tconst rowBlock = new Uint16Array( numBlocksX * 64 );\n\n\t\t\tfor ( let blocky = 0; blocky < numBlocksY; ++ blocky ) {\n\n\t\t\t\tlet maxY = 8;\n\n\t\t\t\tif ( blocky == numBlocksY - 1 ) maxY = leftoverY;\n\n\t\t\t\tfor ( let blockx = 0; blockx < numBlocksX; ++ blockx ) {\n\n\t\t\t\t\thalfZigBlock.fill( 0 );\n\t\t\t\t\thalfZigBlock[ 0 ] = dcBuffer[ currDcComp ++ ];\n\t\t\t\t\tunRleAC( currAcComp, acBuffer, halfZigBlock );\n\t\t\t\t\tunZigZag( halfZigBlock, dctData );\n\t\t\t\t\tdctInverse( dctData );\n\t\t\t\t\tconvertToHalf( dctData, rowBlock, blockx * 64 );\n\n\t\t\t\t}\n\n\t\t\t\t// Write decoded data to output buffer\n\t\t\t\tfor ( let y = 8 * blocky; y < 8 * blocky + maxY; ++ y ) {\n\n\t\t\t\t\tlet offset = rowPtrs[ channelIndex ][ y ];\n\n\t\t\t\t\tfor ( let blockx = 0; blockx < numFullBlocksX; ++ blockx ) {\n\n\t\t\t\t\t\tconst src = blockx * 64 + ( ( y & 0x7 ) * 8 );\n\n\t\t\t\t\t\tfor ( let x = 0; x < 8; ++ x ) {\n\n\t\t\t\t\t\t\tdataView.setUint16( offset + x * INT16_SIZE * cd.type, rowBlock[ src + x ], true );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\toffset += 8 * INT16_SIZE * cd.type;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( numBlocksX != numFullBlocksX ) {\n\n\t\t\t\t\t\tconst src = numFullBlocksX * 64 + ( ( y & 0x7 ) * 8 );\n\n\t\t\t\t\t\tfor ( let x = 0; x < leftoverX; ++ x ) {\n\n\t\t\t\t\t\t\tdataView.setUint16( offset + x * INT16_SIZE * cd.type, rowBlock[ src + x ], true );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tcd.decoded = true;\n\n\t\t}\n\n\t\tfunction unRleAC( currAcComp, acBuffer, halfZigBlock ) {\n\n\t\t\tlet acValue;\n\t\t\tlet dctComp = 1;\n\n\t\t\twhile ( dctComp < 64 ) {\n\n\t\t\t\tacValue = acBuffer[ currAcComp.value ];\n\n\t\t\t\tif ( acValue == 0xff00 ) {\n\n\t\t\t\t\tdctComp = 64;\n\n\t\t\t\t} else if ( acValue >> 8 == 0xff ) {\n\n\t\t\t\t\tdctComp += acValue & 0xff;\n\n\t\t\t\t} else {\n\n\t\t\t\t\thalfZigBlock[ dctComp ] = acValue;\n\t\t\t\t\tdctComp ++;\n\n\t\t\t\t}\n\n\t\t\t\tcurrAcComp.value ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction unZigZag( src, dst ) {\n\n\t\t\tdst[ 0 ] = decodeFloat16( src[ 0 ] );\n\t\t\tdst[ 1 ] = decodeFloat16( src[ 1 ] );\n\t\t\tdst[ 2 ] = decodeFloat16( src[ 5 ] );\n\t\t\tdst[ 3 ] = decodeFloat16( src[ 6 ] );\n\t\t\tdst[ 4 ] = decodeFloat16( src[ 14 ] );\n\t\t\tdst[ 5 ] = decodeFloat16( src[ 15 ] );\n\t\t\tdst[ 6 ] = decodeFloat16( src[ 27 ] );\n\t\t\tdst[ 7 ] = decodeFloat16( src[ 28 ] );\n\t\t\tdst[ 8 ] = decodeFloat16( src[ 2 ] );\n\t\t\tdst[ 9 ] = decodeFloat16( src[ 4 ] );\n\n\t\t\tdst[ 10 ] = decodeFloat16( src[ 7 ] );\n\t\t\tdst[ 11 ] = decodeFloat16( src[ 13 ] );\n\t\t\tdst[ 12 ] = decodeFloat16( src[ 16 ] );\n\t\t\tdst[ 13 ] = decodeFloat16( src[ 26 ] );\n\t\t\tdst[ 14 ] = decodeFloat16( src[ 29 ] );\n\t\t\tdst[ 15 ] = decodeFloat16( src[ 42 ] );\n\t\t\tdst[ 16 ] = decodeFloat16( src[ 3 ] );\n\t\t\tdst[ 17 ] = decodeFloat16( src[ 8 ] );\n\t\t\tdst[ 18 ] = decodeFloat16( src[ 12 ] );\n\t\t\tdst[ 19 ] = decodeFloat16( src[ 17 ] );\n\n\t\t\tdst[ 20 ] = decodeFloat16( src[ 25 ] );\n\t\t\tdst[ 21 ] = decodeFloat16( src[ 30 ] );\n\t\t\tdst[ 22 ] = decodeFloat16( src[ 41 ] );\n\t\t\tdst[ 23 ] = decodeFloat16( src[ 43 ] );\n\t\t\tdst[ 24 ] = decodeFloat16( src[ 9 ] );\n\t\t\tdst[ 25 ] = decodeFloat16( src[ 11 ] );\n\t\t\tdst[ 26 ] = decodeFloat16( src[ 18 ] );\n\t\t\tdst[ 27 ] = decodeFloat16( src[ 24 ] );\n\t\t\tdst[ 28 ] = decodeFloat16( src[ 31 ] );\n\t\t\tdst[ 29 ] = decodeFloat16( src[ 40 ] );\n\n\t\t\tdst[ 30 ] = decodeFloat16( src[ 44 ] );\n\t\t\tdst[ 31 ] = decodeFloat16( src[ 53 ] );\n\t\t\tdst[ 32 ] = decodeFloat16( src[ 10 ] );\n\t\t\tdst[ 33 ] = decodeFloat16( src[ 19 ] );\n\t\t\tdst[ 34 ] = decodeFloat16( src[ 23 ] );\n\t\t\tdst[ 35 ] = decodeFloat16( src[ 32 ] );\n\t\t\tdst[ 36 ] = decodeFloat16( src[ 39 ] );\n\t\t\tdst[ 37 ] = decodeFloat16( src[ 45 ] );\n\t\t\tdst[ 38 ] = decodeFloat16( src[ 52 ] );\n\t\t\tdst[ 39 ] = decodeFloat16( src[ 54 ] );\n\n\t\t\tdst[ 40 ] = decodeFloat16( src[ 20 ] );\n\t\t\tdst[ 41 ] = decodeFloat16( src[ 22 ] );\n\t\t\tdst[ 42 ] = decodeFloat16( src[ 33 ] );\n\t\t\tdst[ 43 ] = decodeFloat16( src[ 38 ] );\n\t\t\tdst[ 44 ] = decodeFloat16( src[ 46 ] );\n\t\t\tdst[ 45 ] = decodeFloat16( src[ 51 ] );\n\t\t\tdst[ 46 ] = decodeFloat16( src[ 55 ] );\n\t\t\tdst[ 47 ] = decodeFloat16( src[ 60 ] );\n\t\t\tdst[ 48 ] = decodeFloat16( src[ 21 ] );\n\t\t\tdst[ 49 ] = decodeFloat16( src[ 34 ] );\n\n\t\t\tdst[ 50 ] = decodeFloat16( src[ 37 ] );\n\t\t\tdst[ 51 ] = decodeFloat16( src[ 47 ] );\n\t\t\tdst[ 52 ] = decodeFloat16( src[ 50 ] );\n\t\t\tdst[ 53 ] = decodeFloat16( src[ 56 ] );\n\t\t\tdst[ 54 ] = decodeFloat16( src[ 59 ] );\n\t\t\tdst[ 55 ] = decodeFloat16( src[ 61 ] );\n\t\t\tdst[ 56 ] = decodeFloat16( src[ 35 ] );\n\t\t\tdst[ 57 ] = decodeFloat16( src[ 36 ] );\n\t\t\tdst[ 58 ] = decodeFloat16( src[ 48 ] );\n\t\t\tdst[ 59 ] = decodeFloat16( src[ 49 ] );\n\n\t\t\tdst[ 60 ] = decodeFloat16( src[ 57 ] );\n\t\t\tdst[ 61 ] = decodeFloat16( src[ 58 ] );\n\t\t\tdst[ 62 ] = decodeFloat16( src[ 62 ] );\n\t\t\tdst[ 63 ] = decodeFloat16( src[ 63 ] );\n\n\t\t}\n\n\t\tfunction dctInverse( data ) {\n\n\t\t\tconst a = 0.5 * Math.cos( 3.14159 / 4.0 );\n\t\t\tconst b = 0.5 * Math.cos( 3.14159 / 16.0 );\n\t\t\tconst c = 0.5 * Math.cos( 3.14159 / 8.0 );\n\t\t\tconst d = 0.5 * Math.cos( 3.0 * 3.14159 / 16.0 );\n\t\t\tconst e = 0.5 * Math.cos( 5.0 * 3.14159 / 16.0 );\n\t\t\tconst f = 0.5 * Math.cos( 3.0 * 3.14159 / 8.0 );\n\t\t\tconst g = 0.5 * Math.cos( 7.0 * 3.14159 / 16.0 );\n\n\t\t\tconst alpha = new Array( 4 );\n\t\t\tconst beta = new Array( 4 );\n\t\t\tconst theta = new Array( 4 );\n\t\t\tconst gamma = new Array( 4 );\n\n\t\t\tfor ( let row = 0; row < 8; ++ row ) {\n\n\t\t\t\tconst rowPtr = row * 8;\n\n\t\t\t\talpha[ 0 ] = c * data[ rowPtr + 2 ];\n\t\t\t\talpha[ 1 ] = f * data[ rowPtr + 2 ];\n\t\t\t\talpha[ 2 ] = c * data[ rowPtr + 6 ];\n\t\t\t\talpha[ 3 ] = f * data[ rowPtr + 6 ];\n\n\t\t\t\tbeta[ 0 ] = b * data[ rowPtr + 1 ] + d * data[ rowPtr + 3 ] + e * data[ rowPtr + 5 ] + g * data[ rowPtr + 7 ];\n\t\t\t\tbeta[ 1 ] = d * data[ rowPtr + 1 ] - g * data[ rowPtr + 3 ] - b * data[ rowPtr + 5 ] - e * data[ rowPtr + 7 ];\n\t\t\t\tbeta[ 2 ] = e * data[ rowPtr + 1 ] - b * data[ rowPtr + 3 ] + g * data[ rowPtr + 5 ] + d * data[ rowPtr + 7 ];\n\t\t\t\tbeta[ 3 ] = g * data[ rowPtr + 1 ] - e * data[ rowPtr + 3 ] + d * data[ rowPtr + 5 ] - b * data[ rowPtr + 7 ];\n\n\t\t\t\ttheta[ 0 ] = a * ( data[ rowPtr + 0 ] + data[ rowPtr + 4 ] );\n\t\t\t\ttheta[ 3 ] = a * ( data[ rowPtr + 0 ] - data[ rowPtr + 4 ] );\n\t\t\t\ttheta[ 1 ] = alpha[ 0 ] + alpha[ 3 ];\n\t\t\t\ttheta[ 2 ] = alpha[ 1 ] - alpha[ 2 ];\n\n\t\t\t\tgamma[ 0 ] = theta[ 0 ] + theta[ 1 ];\n\t\t\t\tgamma[ 1 ] = theta[ 3 ] + theta[ 2 ];\n\t\t\t\tgamma[ 2 ] = theta[ 3 ] - theta[ 2 ];\n\t\t\t\tgamma[ 3 ] = theta[ 0 ] - theta[ 1 ];\n\n\t\t\t\tdata[ rowPtr + 0 ] = gamma[ 0 ] + beta[ 0 ];\n\t\t\t\tdata[ rowPtr + 1 ] = gamma[ 1 ] + beta[ 1 ];\n\t\t\t\tdata[ rowPtr + 2 ] = gamma[ 2 ] + beta[ 2 ];\n\t\t\t\tdata[ rowPtr + 3 ] = gamma[ 3 ] + beta[ 3 ];\n\n\t\t\t\tdata[ rowPtr + 4 ] = gamma[ 3 ] - beta[ 3 ];\n\t\t\t\tdata[ rowPtr + 5 ] = gamma[ 2 ] - beta[ 2 ];\n\t\t\t\tdata[ rowPtr + 6 ] = gamma[ 1 ] - beta[ 1 ];\n\t\t\t\tdata[ rowPtr + 7 ] = gamma[ 0 ] - beta[ 0 ];\n\n\t\t\t}\n\n\t\t\tfor ( let column = 0; column < 8; ++ column ) {\n\n\t\t\t\talpha[ 0 ] = c * data[ 16 + column ];\n\t\t\t\talpha[ 1 ] = f * data[ 16 + column ];\n\t\t\t\talpha[ 2 ] = c * data[ 48 + column ];\n\t\t\t\talpha[ 3 ] = f * data[ 48 + column ];\n\n\t\t\t\tbeta[ 0 ] = b * data[ 8 + column ] + d * data[ 24 + column ] + e * data[ 40 + column ] + g * data[ 56 + column ];\n\t\t\t\tbeta[ 1 ] = d * data[ 8 + column ] - g * data[ 24 + column ] - b * data[ 40 + column ] - e * data[ 56 + column ];\n\t\t\t\tbeta[ 2 ] = e * data[ 8 + column ] - b * data[ 24 + column ] + g * data[ 40 + column ] + d * data[ 56 + column ];\n\t\t\t\tbeta[ 3 ] = g * data[ 8 + column ] - e * data[ 24 + column ] + d * data[ 40 + column ] - b * data[ 56 + column ];\n\n\t\t\t\ttheta[ 0 ] = a * ( data[ column ] + data[ 32 + column ] );\n\t\t\t\ttheta[ 3 ] = a * ( data[ column ] - data[ 32 + column ] );\n\n\t\t\t\ttheta[ 1 ] = alpha[ 0 ] + alpha[ 3 ];\n\t\t\t\ttheta[ 2 ] = alpha[ 1 ] - alpha[ 2 ];\n\n\t\t\t\tgamma[ 0 ] = theta[ 0 ] + theta[ 1 ];\n\t\t\t\tgamma[ 1 ] = theta[ 3 ] + theta[ 2 ];\n\t\t\t\tgamma[ 2 ] = theta[ 3 ] - theta[ 2 ];\n\t\t\t\tgamma[ 3 ] = theta[ 0 ] - theta[ 1 ];\n\n\t\t\t\tdata[ 0 + column ] = gamma[ 0 ] + beta[ 0 ];\n\t\t\t\tdata[ 8 + column ] = gamma[ 1 ] + beta[ 1 ];\n\t\t\t\tdata[ 16 + column ] = gamma[ 2 ] + beta[ 2 ];\n\t\t\t\tdata[ 24 + column ] = gamma[ 3 ] + beta[ 3 ];\n\n\t\t\t\tdata[ 32 + column ] = gamma[ 3 ] - beta[ 3 ];\n\t\t\t\tdata[ 40 + column ] = gamma[ 2 ] - beta[ 2 ];\n\t\t\t\tdata[ 48 + column ] = gamma[ 1 ] - beta[ 1 ];\n\t\t\t\tdata[ 56 + column ] = gamma[ 0 ] - beta[ 0 ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction csc709Inverse( data ) {\n\n\t\t\tfor ( let i = 0; i < 64; ++ i ) {\n\n\t\t\t\tconst y = data[ 0 ][ i ];\n\t\t\t\tconst cb = data[ 1 ][ i ];\n\t\t\t\tconst cr = data[ 2 ][ i ];\n\n\t\t\t\tdata[ 0 ][ i ] = y + 1.5747 * cr;\n\t\t\t\tdata[ 1 ][ i ] = y - 0.1873 * cb - 0.4682 * cr;\n\t\t\t\tdata[ 2 ][ i ] = y + 1.8556 * cb;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction convertToHalf( src, dst, idx ) {\n\n\t\t\tfor ( let i = 0; i < 64; ++ i ) {\n\n\t\t\t\tdst[ idx + i ] = DataUtils.toHalfFloat( toLinear( src[ i ] ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction toLinear( float ) {\n\n\t\t\tif ( float <= 1 ) {\n\n\t\t\t\treturn Math.sign( float ) * Math.pow( Math.abs( float ), 2.2 );\n\n\t\t\t} else {\n\n\t\t\t\treturn Math.sign( float ) * Math.pow( logBase, Math.abs( float ) - 1.0 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction uncompressRAW( info ) {\n\n\t\t\treturn new DataView( info.array.buffer, info.offset.value, info.size );\n\n\t\t}\n\n\t\tfunction uncompressRLE( info ) {\n\n\t\t\tconst compressed = info.viewer.buffer.slice( info.offset.value, info.offset.value + info.size );\n\n\t\t\tconst rawBuffer = new Uint8Array( decodeRunLength( compressed ) );\n\t\t\tconst tmpBuffer = new Uint8Array( rawBuffer.length );\n\n\t\t\tpredictor( rawBuffer ); // revert predictor\n\n\t\t\tinterleaveScalar( rawBuffer, tmpBuffer ); // interleave pixels\n\n\t\t\treturn new DataView( tmpBuffer.buffer );\n\n\t\t}\n\n\t\tfunction uncompressZIP( info ) {\n\n\t\t\tconst compressed = info.array.slice( info.offset.value, info.offset.value + info.size );\n\n\t\t\tconst rawBuffer = fflate.unzlibSync( compressed );\n\t\t\tconst tmpBuffer = new Uint8Array( rawBuffer.length );\n\n\t\t\tpredictor( rawBuffer ); // revert predictor\n\n\t\t\tinterleaveScalar( rawBuffer, tmpBuffer ); // interleave pixels\n\n\t\t\treturn new DataView( tmpBuffer.buffer );\n\n\t\t}\n\n\t\tfunction uncompressPIZ( info ) {\n\n\t\t\tconst inDataView = info.viewer;\n\t\t\tconst inOffset = { value: info.offset.value };\n\n\t\t\tconst outBuffer = new Uint16Array( info.columns * info.lines * ( info.inputChannels.length * info.type ) );\n\t\t\tconst bitmap = new Uint8Array( BITMAP_SIZE );\n\n\t\t\t// Setup channel info\n\t\t\tlet outBufferEnd = 0;\n\t\t\tconst pizChannelData = new Array( info.inputChannels.length );\n\t\t\tfor ( let i = 0, il = info.inputChannels.length; i < il; i ++ ) {\n\n\t\t\t\tpizChannelData[ i ] = {};\n\t\t\t\tpizChannelData[ i ][ 'start' ] = outBufferEnd;\n\t\t\t\tpizChannelData[ i ][ 'end' ] = pizChannelData[ i ][ 'start' ];\n\t\t\t\tpizChannelData[ i ][ 'nx' ] = info.columns;\n\t\t\t\tpizChannelData[ i ][ 'ny' ] = info.lines;\n\t\t\t\tpizChannelData[ i ][ 'size' ] = info.type;\n\n\t\t\t\toutBufferEnd += pizChannelData[ i ].nx * pizChannelData[ i ].ny * pizChannelData[ i ].size;\n\n\t\t\t}\n\n\t\t\t// Read range compression data\n\n\t\t\tconst minNonZero = parseUint16( inDataView, inOffset );\n\t\t\tconst maxNonZero = parseUint16( inDataView, inOffset );\n\n\t\t\tif ( maxNonZero >= BITMAP_SIZE ) {\n\n\t\t\t\tthrow new Error( 'Something is wrong with PIZ_COMPRESSION BITMAP_SIZE' );\n\n\t\t\t}\n\n\t\t\tif ( minNonZero <= maxNonZero ) {\n\n\t\t\t\tfor ( let i = 0; i < maxNonZero - minNonZero + 1; i ++ ) {\n\n\t\t\t\t\tbitmap[ i + minNonZero ] = parseUint8( inDataView, inOffset );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Reverse LUT\n\t\t\tconst lut = new Uint16Array( USHORT_RANGE );\n\t\t\tconst maxValue = reverseLutFromBitmap( bitmap, lut );\n\n\t\t\tconst length = parseUint32( inDataView, inOffset );\n\n\t\t\t// Huffman decoding\n\t\t\thufUncompress( info.array, inDataView, inOffset, length, outBuffer, outBufferEnd );\n\n\t\t\t// Wavelet decoding\n\t\t\tfor ( let i = 0; i < info.inputChannels.length; ++ i ) {\n\n\t\t\t\tconst cd = pizChannelData[ i ];\n\n\t\t\t\tfor ( let j = 0; j < pizChannelData[ i ].size; ++ j ) {\n\n\t\t\t\t\twav2Decode(\n\t\t\t\t\t\toutBuffer,\n\t\t\t\t\t\tcd.start + j,\n\t\t\t\t\t\tcd.nx,\n\t\t\t\t\t\tcd.size,\n\t\t\t\t\t\tcd.ny,\n\t\t\t\t\t\tcd.nx * cd.size,\n\t\t\t\t\t\tmaxValue\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Expand the pixel data to their original range\n\t\t\tapplyLut( lut, outBuffer, outBufferEnd );\n\n\t\t\t// Rearrange the pixel data into the format expected by the caller.\n\t\t\tlet tmpOffset = 0;\n\t\t\tconst tmpBuffer = new Uint8Array( outBuffer.buffer.byteLength );\n\t\t\tfor ( let y = 0; y < info.lines; y ++ ) {\n\n\t\t\t\tfor ( let c = 0; c < info.inputChannels.length; c ++ ) {\n\n\t\t\t\t\tconst cd = pizChannelData[ c ];\n\n\t\t\t\t\tconst n = cd.nx * cd.size;\n\t\t\t\t\tconst cp = new Uint8Array( outBuffer.buffer, cd.end * INT16_SIZE, n * INT16_SIZE );\n\n\t\t\t\t\ttmpBuffer.set( cp, tmpOffset );\n\t\t\t\t\ttmpOffset += n * INT16_SIZE;\n\t\t\t\t\tcd.end += n;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new DataView( tmpBuffer.buffer );\n\n\t\t}\n\n\t\tfunction uncompressPXR( info ) {\n\n\t\t\tconst compressed = info.array.slice( info.offset.value, info.offset.value + info.size );\n\n\t\t\tconst rawBuffer = fflate.unzlibSync( compressed );\n\n\t\t\tconst byteSize = info.inputChannels.length * info.lines * info.columns * info.totalBytes;\n\t\t\tconst tmpBuffer = new ArrayBuffer( byteSize );\n\t\t\tconst viewer = new DataView( tmpBuffer );\n\n\t\t\tlet tmpBufferEnd = 0;\n\t\t\tlet writePtr = 0;\n\t\t\tconst ptr = new Array( 4 );\n\n\t\t\tfor ( let y = 0; y < info.lines; y ++ ) {\n\n\t\t\t\tfor ( let c = 0; c < info.inputChannels.length; c ++ ) {\n\n\t\t\t\t\tlet pixel = 0;\n\n\t\t\t\t\tconst type = info.inputChannels[ c ].pixelType;\n\t\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\t\tcase 1:\n\n\t\t\t\t\t\t\tptr[ 0 ] = tmpBufferEnd;\n\t\t\t\t\t\t\tptr[ 1 ] = ptr[ 0 ] + info.columns;\n\t\t\t\t\t\t\ttmpBufferEnd = ptr[ 1 ] + info.columns;\n\n\t\t\t\t\t\t\tfor ( let j = 0; j < info.columns; ++ j ) {\n\n\t\t\t\t\t\t\t\tconst diff = ( rawBuffer[ ptr[ 0 ] ++ ] << 8 ) | rawBuffer[ ptr[ 1 ] ++ ];\n\n\t\t\t\t\t\t\t\tpixel += diff;\n\n\t\t\t\t\t\t\t\tviewer.setUint16( writePtr, pixel, true );\n\t\t\t\t\t\t\t\twritePtr += 2;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 2:\n\n\t\t\t\t\t\t\tptr[ 0 ] = tmpBufferEnd;\n\t\t\t\t\t\t\tptr[ 1 ] = ptr[ 0 ] + info.columns;\n\t\t\t\t\t\t\tptr[ 2 ] = ptr[ 1 ] + info.columns;\n\t\t\t\t\t\t\ttmpBufferEnd = ptr[ 2 ] + info.columns;\n\n\t\t\t\t\t\t\tfor ( let j = 0; j < info.columns; ++ j ) {\n\n\t\t\t\t\t\t\t\tconst diff = ( rawBuffer[ ptr[ 0 ] ++ ] << 24 ) | ( rawBuffer[ ptr[ 1 ] ++ ] << 16 ) | ( rawBuffer[ ptr[ 2 ] ++ ] << 8 );\n\n\t\t\t\t\t\t\t\tpixel += diff;\n\n\t\t\t\t\t\t\t\tviewer.setUint32( writePtr, pixel, true );\n\t\t\t\t\t\t\t\twritePtr += 4;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn viewer;\n\n\t\t}\n\n\t\tfunction uncompressDWA( info ) {\n\n\t\t\tconst inDataView = info.viewer;\n\t\t\tconst inOffset = { value: info.offset.value };\n\t\t\tconst outBuffer = new Uint8Array( info.columns * info.lines * ( info.inputChannels.length * info.type * INT16_SIZE ) );\n\n\t\t\t// Read compression header information\n\t\t\tconst dwaHeader = {\n\n\t\t\t\tversion: parseInt64( inDataView, inOffset ),\n\t\t\t\tunknownUncompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\tunknownCompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\tacCompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\tdcCompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\trleCompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\trleUncompressedSize: parseInt64( inDataView, inOffset ),\n\t\t\t\trleRawSize: parseInt64( inDataView, inOffset ),\n\t\t\t\ttotalAcUncompressedCount: parseInt64( inDataView, inOffset ),\n\t\t\t\ttotalDcUncompressedCount: parseInt64( inDataView, inOffset ),\n\t\t\t\tacCompression: parseInt64( inDataView, inOffset )\n\n\t\t\t};\n\n\t\t\tif ( dwaHeader.version < 2 )\n\t\t\t\tthrow new Error( 'EXRLoader.parse: ' + EXRHeader.compression + ' version ' + dwaHeader.version + ' is unsupported' );\n\n\t\t\t// Read channel ruleset information\n\t\t\tconst channelRules = new Array();\n\t\t\tlet ruleSize = parseUint16( inDataView, inOffset ) - INT16_SIZE;\n\n\t\t\twhile ( ruleSize > 0 ) {\n\n\t\t\t\tconst name = parseNullTerminatedString( inDataView.buffer, inOffset );\n\t\t\t\tconst value = parseUint8( inDataView, inOffset );\n\t\t\t\tconst compression = ( value >> 2 ) & 3;\n\t\t\t\tconst csc = ( value >> 4 ) - 1;\n\t\t\t\tconst index = new Int8Array( [ csc ] )[ 0 ];\n\t\t\t\tconst type = parseUint8( inDataView, inOffset );\n\n\t\t\t\tchannelRules.push( {\n\t\t\t\t\tname: name,\n\t\t\t\t\tindex: index,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tcompression: compression,\n\t\t\t\t} );\n\n\t\t\t\truleSize -= name.length + 3;\n\n\t\t\t}\n\n\t\t\t// Classify channels\n\t\t\tconst channels = EXRHeader.channels;\n\t\t\tconst channelData = new Array( info.inputChannels.length );\n\n\t\t\tfor ( let i = 0; i < info.inputChannels.length; ++ i ) {\n\n\t\t\t\tconst cd = channelData[ i ] = {};\n\t\t\t\tconst channel = channels[ i ];\n\n\t\t\t\tcd.name = channel.name;\n\t\t\t\tcd.compression = UNKNOWN;\n\t\t\t\tcd.decoded = false;\n\t\t\t\tcd.type = channel.pixelType;\n\t\t\t\tcd.pLinear = channel.pLinear;\n\t\t\t\tcd.width = info.columns;\n\t\t\t\tcd.height = info.lines;\n\n\t\t\t}\n\n\t\t\tconst cscSet = {\n\t\t\t\tidx: new Array( 3 )\n\t\t\t};\n\n\t\t\tfor ( let offset = 0; offset < info.inputChannels.length; ++ offset ) {\n\n\t\t\t\tconst cd = channelData[ offset ];\n\n\t\t\t\tfor ( let i = 0; i < channelRules.length; ++ i ) {\n\n\t\t\t\t\tconst rule = channelRules[ i ];\n\n\t\t\t\t\tif ( cd.name == rule.name ) {\n\n\t\t\t\t\t\tcd.compression = rule.compression;\n\n\t\t\t\t\t\tif ( rule.index >= 0 ) {\n\n\t\t\t\t\t\t\tcscSet.idx[ rule.index ] = offset;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcd.offset = offset;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlet acBuffer, dcBuffer, rleBuffer;\n\n\t\t\t// Read DCT - AC component data\n\t\t\tif ( dwaHeader.acCompressedSize > 0 ) {\n\n\t\t\t\tswitch ( dwaHeader.acCompression ) {\n\n\t\t\t\t\tcase STATIC_HUFFMAN:\n\n\t\t\t\t\t\tacBuffer = new Uint16Array( dwaHeader.totalAcUncompressedCount );\n\t\t\t\t\t\thufUncompress( info.array, inDataView, inOffset, dwaHeader.acCompressedSize, acBuffer, dwaHeader.totalAcUncompressedCount );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase DEFLATE:\n\n\t\t\t\t\t\tconst compressed = info.array.slice( inOffset.value, inOffset.value + dwaHeader.totalAcUncompressedCount );\n\t\t\t\t\t\tconst data = fflate.unzlibSync( compressed );\n\t\t\t\t\t\tacBuffer = new Uint16Array( data.buffer );\n\t\t\t\t\t\tinOffset.value += dwaHeader.totalAcUncompressedCount;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\n\t\t\t}\n\n\t\t\t// Read DCT - DC component data\n\t\t\tif ( dwaHeader.dcCompressedSize > 0 ) {\n\n\t\t\t\tconst zlibInfo = {\n\t\t\t\t\tarray: info.array,\n\t\t\t\t\toffset: inOffset,\n\t\t\t\t\tsize: dwaHeader.dcCompressedSize\n\t\t\t\t};\n\t\t\t\tdcBuffer = new Uint16Array( uncompressZIP( zlibInfo ).buffer );\n\t\t\t\tinOffset.value += dwaHeader.dcCompressedSize;\n\n\t\t\t}\n\n\t\t\t// Read RLE compressed data\n\t\t\tif ( dwaHeader.rleRawSize > 0 ) {\n\n\t\t\t\tconst compressed = info.array.slice( inOffset.value, inOffset.value + dwaHeader.rleCompressedSize );\n\t\t\t\tconst data = fflate.unzlibSync( compressed );\n\t\t\t\trleBuffer = decodeRunLength( data.buffer );\n\n\t\t\t\tinOffset.value += dwaHeader.rleCompressedSize;\n\n\t\t\t}\n\n\t\t\t// Prepare outbuffer data offset\n\t\t\tlet outBufferEnd = 0;\n\t\t\tconst rowOffsets = new Array( channelData.length );\n\t\t\tfor ( let i = 0; i < rowOffsets.length; ++ i ) {\n\n\t\t\t\trowOffsets[ i ] = new Array();\n\n\t\t\t}\n\n\t\t\tfor ( let y = 0; y < info.lines; ++ y ) {\n\n\t\t\t\tfor ( let chan = 0; chan < channelData.length; ++ chan ) {\n\n\t\t\t\t\trowOffsets[ chan ].push( outBufferEnd );\n\t\t\t\t\toutBufferEnd += channelData[ chan ].width * info.type * INT16_SIZE;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Decode lossy DCT data if we have a valid color space conversion set with the first RGB channel present\n\t\t\tif ( cscSet.idx[ 0 ] !== undefined && channelData[ cscSet.idx[ 0 ] ] ) {\n\n\t\t\t\tlossyDctDecode( cscSet, rowOffsets, channelData, acBuffer, dcBuffer, outBuffer );\n\n\t\t\t}\n\n\t\t\t// Decode other channels\n\t\t\tfor ( let i = 0; i < channelData.length; ++ i ) {\n\n\t\t\t\tconst cd = channelData[ i ];\n\n\t\t\t\tif ( cd.decoded ) continue;\n\n\t\t\t\tswitch ( cd.compression ) {\n\n\t\t\t\t\tcase RLE:\n\n\t\t\t\t\t\tlet row = 0;\n\t\t\t\t\t\tlet rleOffset = 0;\n\n\t\t\t\t\t\tfor ( let y = 0; y < info.lines; ++ y ) {\n\n\t\t\t\t\t\t\tlet rowOffsetBytes = rowOffsets[ i ][ row ];\n\n\t\t\t\t\t\t\tfor ( let x = 0; x < cd.width; ++ x ) {\n\n\t\t\t\t\t\t\t\tfor ( let byte = 0; byte < INT16_SIZE * cd.type; ++ byte ) {\n\n\t\t\t\t\t\t\t\t\toutBuffer[ rowOffsetBytes ++ ] = rleBuffer[ rleOffset + byte * cd.width * cd.height ];\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\trleOffset ++;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\trow ++;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase LOSSY_DCT:\n\n\t\t\t\t\t\tlossyDctChannelDecode( i, rowOffsets, channelData, acBuffer, dcBuffer, outBuffer );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new Error( 'EXRLoader.parse: unsupported channel compression' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new DataView( outBuffer.buffer );\n\n\t\t}\n\n\t\tfunction parseNullTerminatedString( buffer, offset ) {\n\n\t\t\tconst uintBuffer = new Uint8Array( buffer );\n\t\t\tlet endOffset = 0;\n\n\t\t\twhile ( uintBuffer[ offset.value + endOffset ] != 0 ) {\n\n\t\t\t\tendOffset += 1;\n\n\t\t\t}\n\n\t\t\tconst stringValue = new TextDecoder().decode(\n\t\t\t\tuintBuffer.slice( offset.value, offset.value + endOffset )\n\t\t\t);\n\n\t\t\toffset.value = offset.value + endOffset + 1;\n\n\t\t\treturn stringValue;\n\n\t\t}\n\n\t\tfunction parseFixedLengthString( buffer, offset, size ) {\n\n\t\t\tconst stringValue = new TextDecoder().decode(\n\t\t\t\tnew Uint8Array( buffer ).slice( offset.value, offset.value + size )\n\t\t\t);\n\n\t\t\toffset.value = offset.value + size;\n\n\t\t\treturn stringValue;\n\n\t\t}\n\n\t\tfunction parseRational( dataView, offset ) {\n\n\t\t\tconst x = parseInt32( dataView, offset );\n\t\t\tconst y = parseUint32( dataView, offset );\n\n\t\t\treturn [ x, y ];\n\n\t\t}\n\n\t\tfunction parseTimecode( dataView, offset ) {\n\n\t\t\tconst x = parseUint32( dataView, offset );\n\t\t\tconst y = parseUint32( dataView, offset );\n\n\t\t\treturn [ x, y ];\n\n\t\t}\n\n\t\tfunction parseInt32( dataView, offset ) {\n\n\t\t\tconst Int32 = dataView.getInt32( offset.value, true );\n\n\t\t\toffset.value = offset.value + INT32_SIZE;\n\n\t\t\treturn Int32;\n\n\t\t}\n\n\t\tfunction parseUint32( dataView, offset ) {\n\n\t\t\tconst Uint32 = dataView.getUint32( offset.value, true );\n\n\t\t\toffset.value = offset.value + INT32_SIZE;\n\n\t\t\treturn Uint32;\n\n\t\t}\n\n\t\tfunction parseUint8Array( uInt8Array, offset ) {\n\n\t\t\tconst Uint8 = uInt8Array[ offset.value ];\n\n\t\t\toffset.value = offset.value + INT8_SIZE;\n\n\t\t\treturn Uint8;\n\n\t\t}\n\n\t\tfunction parseUint8( dataView, offset ) {\n\n\t\t\tconst Uint8 = dataView.getUint8( offset.value );\n\n\t\t\toffset.value = offset.value + INT8_SIZE;\n\n\t\t\treturn Uint8;\n\n\t\t}\n\n\t\tconst parseInt64 = function ( dataView, offset ) {\n\n\t\t\tlet int;\n\n\t\t\tif ( 'getBigInt64' in DataView.prototype ) {\n\n\t\t\t\tint = Number( dataView.getBigInt64( offset.value, true ) );\n\n\t\t\t} else {\n\n\t\t\t\tint = dataView.getUint32( offset.value + 4, true ) + Number( dataView.getUint32( offset.value, true ) << 32 );\n\n\t\t\t}\n\n\t\t\toffset.value += ULONG_SIZE;\n\n\t\t\treturn int;\n\n\t\t};\n\n\t\tfunction parseFloat32( dataView, offset ) {\n\n\t\t\tconst float = dataView.getFloat32( offset.value, true );\n\n\t\t\toffset.value += FLOAT32_SIZE;\n\n\t\t\treturn float;\n\n\t\t}\n\n\t\tfunction decodeFloat32( dataView, offset ) {\n\n\t\t\treturn DataUtils.toHalfFloat( parseFloat32( dataView, offset ) );\n\n\t\t}\n\n\t\t// https://stackoverflow.com/questions/5678432/decompressing-half-precision-floats-in-javascript\n\t\tfunction decodeFloat16( binary ) {\n\n\t\t\tconst exponent = ( binary & 0x7C00 ) >> 10,\n\t\t\t\tfraction = binary & 0x03FF;\n\n\t\t\treturn ( binary >> 15 ? - 1 : 1 ) * (\n\t\t\t\texponent ?\n\t\t\t\t\t(\n\t\t\t\t\t\texponent === 0x1F ?\n\t\t\t\t\t\t\tfraction ? NaN : Infinity :\n\t\t\t\t\t\t\tMath.pow( 2, exponent - 15 ) * ( 1 + fraction / 0x400 )\n\t\t\t\t\t) :\n\t\t\t\t\t6.103515625e-5 * ( fraction / 0x400 )\n\t\t\t);\n\n\t\t}\n\n\t\tfunction parseUint16( dataView, offset ) {\n\n\t\t\tconst Uint16 = dataView.getUint16( offset.value, true );\n\n\t\t\toffset.value += INT16_SIZE;\n\n\t\t\treturn Uint16;\n\n\t\t}\n\n\t\tfunction parseFloat16( buffer, offset ) {\n\n\t\t\treturn decodeFloat16( parseUint16( buffer, offset ) );\n\n\t\t}\n\n\t\tfunction parseChlist( dataView, buffer, offset, size ) {\n\n\t\t\tconst startOffset = offset.value;\n\t\t\tconst channels = [];\n\n\t\t\twhile ( offset.value < ( startOffset + size - 1 ) ) {\n\n\t\t\t\tconst name = parseNullTerminatedString( buffer, offset );\n\t\t\t\tconst pixelType = parseInt32( dataView, offset );\n\t\t\t\tconst pLinear = parseUint8( dataView, offset );\n\t\t\t\toffset.value += 3; // reserved, three chars\n\t\t\t\tconst xSampling = parseInt32( dataView, offset );\n\t\t\t\tconst ySampling = parseInt32( dataView, offset );\n\n\t\t\t\tchannels.push( {\n\t\t\t\t\tname: name,\n\t\t\t\t\tpixelType: pixelType,\n\t\t\t\t\tpLinear: pLinear,\n\t\t\t\t\txSampling: xSampling,\n\t\t\t\t\tySampling: ySampling\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\toffset.value += 1;\n\n\t\t\treturn channels;\n\n\t\t}\n\n\t\tfunction parseChromaticities( dataView, offset ) {\n\n\t\t\tconst redX = parseFloat32( dataView, offset );\n\t\t\tconst redY = parseFloat32( dataView, offset );\n\t\t\tconst greenX = parseFloat32( dataView, offset );\n\t\t\tconst greenY = parseFloat32( dataView, offset );\n\t\t\tconst blueX = parseFloat32( dataView, offset );\n\t\t\tconst blueY = parseFloat32( dataView, offset );\n\t\t\tconst whiteX = parseFloat32( dataView, offset );\n\t\t\tconst whiteY = parseFloat32( dataView, offset );\n\n\t\t\treturn { redX: redX, redY: redY, greenX: greenX, greenY: greenY, blueX: blueX, blueY: blueY, whiteX: whiteX, whiteY: whiteY };\n\n\t\t}\n\n\t\tfunction parseCompression( dataView, offset ) {\n\n\t\t\tconst compressionCodes = [\n\t\t\t\t'NO_COMPRESSION',\n\t\t\t\t'RLE_COMPRESSION',\n\t\t\t\t'ZIPS_COMPRESSION',\n\t\t\t\t'ZIP_COMPRESSION',\n\t\t\t\t'PIZ_COMPRESSION',\n\t\t\t\t'PXR24_COMPRESSION',\n\t\t\t\t'B44_COMPRESSION',\n\t\t\t\t'B44A_COMPRESSION',\n\t\t\t\t'DWAA_COMPRESSION',\n\t\t\t\t'DWAB_COMPRESSION'\n\t\t\t];\n\n\t\t\tconst compression = parseUint8( dataView, offset );\n\n\t\t\treturn compressionCodes[ compression ];\n\n\t\t}\n\n\t\tfunction parseBox2i( dataView, offset ) {\n\n\t\t\tconst xMin = parseInt32( dataView, offset );\n\t\t\tconst yMin = parseInt32( dataView, offset );\n\t\t\tconst xMax = parseInt32( dataView, offset );\n\t\t\tconst yMax = parseInt32( dataView, offset );\n\n\t\t\treturn { xMin: xMin, yMin: yMin, xMax: xMax, yMax: yMax };\n\n\t\t}\n\n\t\tfunction parseLineOrder( dataView, offset ) {\n\n\t\t\tconst lineOrders = [\n\t\t\t\t'INCREASING_Y',\n\t\t\t\t'DECREASING_Y',\n\t\t\t\t'RANDOM_Y',\n\t\t\t];\n\n\t\t\tconst lineOrder = parseUint8( dataView, offset );\n\n\t\t\treturn lineOrders[ lineOrder ];\n\n\t\t}\n\n\t\tfunction parseEnvmap( dataView, offset ) {\n\n\t\t\tconst envmaps = [\n\t\t\t\t'ENVMAP_LATLONG',\n\t\t\t\t'ENVMAP_CUBE'\n\t\t\t];\n\n\t\t\tconst envmap = parseUint8( dataView, offset );\n\n\t\t\treturn envmaps[ envmap ];\n\n\t\t}\n\n\t\tfunction parseTiledesc( dataView, offset ) {\n\n\t\t\tconst levelModes = [\n\t\t\t\t'ONE_LEVEL',\n\t\t\t\t'MIPMAP_LEVELS',\n\t\t\t\t'RIPMAP_LEVELS',\n\t\t\t];\n\n\t\t\tconst roundingModes = [\n\t\t\t\t'ROUND_DOWN',\n\t\t\t\t'ROUND_UP',\n\t\t\t];\n\n\t\t\tconst xSize = parseUint32( dataView, offset );\n\t\t\tconst ySize = parseUint32( dataView, offset );\n\t\t\tconst modes = parseUint8( dataView, offset );\n\n\t\t\treturn {\n\t\t\t\txSize: xSize,\n\t\t\t\tySize: ySize,\n\t\t\t\tlevelMode: levelModes[ modes & 0xf ],\n\t\t\t\troundingMode: roundingModes[ modes >> 4 ]\n\t\t\t};\n\n\t\t}\n\n\t\tfunction parseV2f( dataView, offset ) {\n\n\t\t\tconst x = parseFloat32( dataView, offset );\n\t\t\tconst y = parseFloat32( dataView, offset );\n\n\t\t\treturn [ x, y ];\n\n\t\t}\n\n\t\tfunction parseV3f( dataView, offset ) {\n\n\t\t\tconst x = parseFloat32( dataView, offset );\n\t\t\tconst y = parseFloat32( dataView, offset );\n\t\t\tconst z = parseFloat32( dataView, offset );\n\n\t\t\treturn [ x, y, z ];\n\n\t\t}\n\n\t\tfunction parseValue( dataView, buffer, offset, type, size ) {\n\n\t\t\tif ( type === 'string' || type === 'stringvector' || type === 'iccProfile' ) {\n\n\t\t\t\treturn parseFixedLengthString( buffer, offset, size );\n\n\t\t\t} else if ( type === 'chlist' ) {\n\n\t\t\t\treturn parseChlist( dataView, buffer, offset, size );\n\n\t\t\t} else if ( type === 'chromaticities' ) {\n\n\t\t\t\treturn parseChromaticities( dataView, offset );\n\n\t\t\t} else if ( type === 'compression' ) {\n\n\t\t\t\treturn parseCompression( dataView, offset );\n\n\t\t\t} else if ( type === 'box2i' ) {\n\n\t\t\t\treturn parseBox2i( dataView, offset );\n\n\t\t\t} else if ( type === 'envmap' ) {\n\n\t\t\t\treturn parseEnvmap( dataView, offset );\n\n\t\t\t} else if ( type === 'tiledesc' ) {\n\n\t\t\t\treturn parseTiledesc( dataView, offset );\n\n\t\t\t} else if ( type === 'lineOrder' ) {\n\n\t\t\t\treturn parseLineOrder( dataView, offset );\n\n\t\t\t} else if ( type === 'float' ) {\n\n\t\t\t\treturn parseFloat32( dataView, offset );\n\n\t\t\t} else if ( type === 'v2f' ) {\n\n\t\t\t\treturn parseV2f( dataView, offset );\n\n\t\t\t} else if ( type === 'v3f' ) {\n\n\t\t\t\treturn parseV3f( dataView, offset );\n\n\t\t\t} else if ( type === 'int' ) {\n\n\t\t\t\treturn parseInt32( dataView, offset );\n\n\t\t\t} else if ( type === 'rational' ) {\n\n\t\t\t\treturn parseRational( dataView, offset );\n\n\t\t\t} else if ( type === 'timecode' ) {\n\n\t\t\t\treturn parseTimecode( dataView, offset );\n\n\t\t\t} else if ( type === 'preview' ) {\n\n\t\t\t\toffset.value += size;\n\t\t\t\treturn 'skipped';\n\n\t\t\t} else {\n\n\t\t\t\toffset.value += size;\n\t\t\t\treturn undefined;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction roundLog2( x, mode ) {\n\n\t\t\tconst log2 = Math.log2( x );\n\t\t\treturn mode == 'ROUND_DOWN' ? Math.floor( log2 ) : Math.ceil( log2 );\n\n\t\t}\n\n\t\tfunction calculateTileLevels( tiledesc, w, h ) {\n\n\t\t\tlet num = 0;\n\n\t\t\tswitch ( tiledesc.levelMode ) {\n\n\t\t\t\tcase 'ONE_LEVEL':\n\t\t\t\t\tnum = 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'MIPMAP_LEVELS':\n\t\t\t\t\tnum = roundLog2( Math.max( w, h ), tiledesc.roundingMode ) + 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RIPMAP_LEVELS':\n\t\t\t\t\tthrow new Error( 'THREE.EXRLoader: RIPMAP_LEVELS tiles currently unsupported.' );\n\n\t\t\t}\n\n\t\t\treturn num;\n\n\t\t}\n\n\t\tfunction calculateTiles( count, dataSize, size, roundingMode ) {\n\n\t\t\tconst tiles = new Array( count );\n\n\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\tconst b = ( 1 << i );\n\t\t\t\tlet s = ( dataSize / b ) | 0;\n\n\t\t\t\tif ( roundingMode == 'ROUND_UP' && s * b < dataSize ) s += 1;\n\n\t\t\t\tconst l = Math.max( s, 1 );\n\n\t\t\t\ttiles[ i ] = ( ( l + size - 1 ) / size ) | 0;\n\n\t\t\t}\n\n\t\t\treturn tiles;\n\n\t\t}\n\n\t\tfunction parseTiles() {\n\n\t\t\tconst EXRDecoder = this;\n\t\t\tconst offset = EXRDecoder.offset;\n\t\t\tconst tmpOffset = { value: 0 };\n\n\t\t\tfor ( let tile = 0; tile < EXRDecoder.tileCount; tile ++ ) {\n\n\t\t\t\tconst tileX = parseInt32( EXRDecoder.viewer, offset );\n\t\t\t\tconst tileY = parseInt32( EXRDecoder.viewer, offset );\n\t\t\t\toffset.value += 8; // skip levels - only parsing top-level\n\t\t\t\tEXRDecoder.size = parseUint32( EXRDecoder.viewer, offset );\n\n\t\t\t\tconst startX = tileX * EXRDecoder.blockWidth;\n\t\t\t\tconst startY = tileY * EXRDecoder.blockHeight;\n\t\t\t\tEXRDecoder.columns = ( startX + EXRDecoder.blockWidth > EXRDecoder.width ) ? EXRDecoder.width - startX : EXRDecoder.blockWidth;\n\t\t\t\tEXRDecoder.lines = ( startY + EXRDecoder.blockHeight > EXRDecoder.height ) ? EXRDecoder.height - startY : EXRDecoder.blockHeight;\n\n\t\t\t\tconst bytesBlockLine = EXRDecoder.columns * EXRDecoder.totalBytes;\n\t\t\t\tconst isCompressed = EXRDecoder.size < EXRDecoder.lines * bytesBlockLine;\n\t\t\t\tconst viewer = isCompressed ? EXRDecoder.uncompress( EXRDecoder ) : uncompressRAW( EXRDecoder );\n\n\t\t\t\toffset.value += EXRDecoder.size;\n\n\t\t\t\tfor ( let line = 0; line < EXRDecoder.lines; line ++ ) {\n\n\t\t\t\t\tconst lineOffset = line * EXRDecoder.columns * EXRDecoder.totalBytes;\n\n\t\t\t\t\tfor ( let channelID = 0; channelID < EXRDecoder.inputChannels.length; channelID ++ ) {\n\n\t\t\t\t\t\tconst name = EXRHeader.channels[ channelID ].name;\n\t\t\t\t\t\tconst lOff = EXRDecoder.channelByteOffsets[ name ] * EXRDecoder.columns;\n\t\t\t\t\t\tconst cOff = EXRDecoder.decodeChannels[ name ];\n\n\t\t\t\t\t\tif ( cOff === undefined ) continue;\n\n\t\t\t\t\t\ttmpOffset.value = lineOffset + lOff;\n\t\t\t\t\t\tconst outLineOffset = ( EXRDecoder.height - ( 1 + startY + line ) ) * EXRDecoder.outLineWidth;\n\n\t\t\t\t\t\tfor ( let x = 0; x < EXRDecoder.columns; x ++ ) {\n\n\t\t\t\t\t\t\tconst outIndex = outLineOffset + ( x + startX ) * EXRDecoder.outputChannels + cOff;\n\t\t\t\t\t\t\tEXRDecoder.byteArray[ outIndex ] = EXRDecoder.getter( viewer, tmpOffset );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseScanline() {\n\n\t\t\tconst EXRDecoder = this;\n\t\t\tconst offset = EXRDecoder.offset;\n\t\t\tconst tmpOffset = { value: 0 };\n\n\t\t\tfor ( let scanlineBlockIdx = 0; scanlineBlockIdx < EXRDecoder.height / EXRDecoder.blockHeight; scanlineBlockIdx ++ ) {\n\n\t\t\t\tconst line = parseInt32( EXRDecoder.viewer, offset ) - EXRHeader.dataWindow.yMin; // line_no\n\t\t\t\tEXRDecoder.size = parseUint32( EXRDecoder.viewer, offset ); // data_len\n\t\t\t\tEXRDecoder.lines = ( ( line + EXRDecoder.blockHeight > EXRDecoder.height ) ? ( EXRDecoder.height - line ) : EXRDecoder.blockHeight );\n\n\t\t\t\tconst bytesPerLine = EXRDecoder.columns * EXRDecoder.totalBytes;\n\t\t\t\tconst isCompressed = EXRDecoder.size < EXRDecoder.lines * bytesPerLine;\n\t\t\t\tconst viewer = isCompressed ? EXRDecoder.uncompress( EXRDecoder ) : uncompressRAW( EXRDecoder );\n\n\t\t\t\toffset.value += EXRDecoder.size;\n\n\t\t\t\tfor ( let line_y = 0; line_y < EXRDecoder.blockHeight; line_y ++ ) {\n\n\t\t\t\t\tconst scan_y = scanlineBlockIdx * EXRDecoder.blockHeight;\n\t\t\t\t\tconst true_y = line_y + EXRDecoder.scanOrder( scan_y );\n\t\t\t\t\tif ( true_y >= EXRDecoder.height ) continue;\n\n\t\t\t\t\tconst lineOffset = line_y * bytesPerLine;\n\t\t\t\t\tconst outLineOffset = ( EXRDecoder.height - 1 - true_y ) * EXRDecoder.outLineWidth;\n\n\t\t\t\t\tfor ( let channelID = 0; channelID < EXRDecoder.inputChannels.length; channelID ++ ) {\n\n\t\t\t\t\t\tconst name = EXRHeader.channels[ channelID ].name;\n\t\t\t\t\t\tconst lOff = EXRDecoder.channelByteOffsets[ name ] * EXRDecoder.columns;\n\t\t\t\t\t\tconst cOff = EXRDecoder.decodeChannels[ name ];\n\n\t\t\t\t\t\tif ( cOff === undefined ) continue;\n\n\t\t\t\t\t\ttmpOffset.value = lineOffset + lOff;\n\n\t\t\t\t\t\tfor ( let x = 0; x < EXRDecoder.columns; x ++ ) {\n\n\t\t\t\t\t\t\tconst outIndex = outLineOffset + x * EXRDecoder.outputChannels + cOff;\n\t\t\t\t\t\t\tEXRDecoder.byteArray[ outIndex ] = EXRDecoder.getter( viewer, tmpOffset );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseHeader( dataView, buffer, offset ) {\n\n\t\t\tconst EXRHeader = {};\n\n\t\t\tif ( dataView.getUint32( 0, true ) != 20000630 ) { // magic\n\n\t\t\t\tthrow new Error( 'THREE.EXRLoader: Provided file doesn\\'t appear to be in OpenEXR format.' );\n\n\t\t\t}\n\n\t\t\tEXRHeader.version = dataView.getUint8( 4 );\n\n\t\t\tconst spec = dataView.getUint8( 5 ); // fullMask\n\n\t\t\tEXRHeader.spec = {\n\t\t\t\tsingleTile: !! ( spec & 2 ),\n\t\t\t\tlongName: !! ( spec & 4 ),\n\t\t\t\tdeepFormat: !! ( spec & 8 ),\n\t\t\t\tmultiPart: !! ( spec & 16 ),\n\t\t\t};\n\n\t\t\t// start of header\n\n\t\t\toffset.value = 8; // start at 8 - after pre-amble\n\n\t\t\tlet keepReading = true;\n\n\t\t\twhile ( keepReading ) {\n\n\t\t\t\tconst attributeName = parseNullTerminatedString( buffer, offset );\n\n\t\t\t\tif ( attributeName === '' ) {\n\n\t\t\t\t\tkeepReading = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst attributeType = parseNullTerminatedString( buffer, offset );\n\t\t\t\t\tconst attributeSize = parseUint32( dataView, offset );\n\t\t\t\t\tconst attributeValue = parseValue( dataView, buffer, offset, attributeType, attributeSize );\n\n\t\t\t\t\tif ( attributeValue === undefined ) {\n\n\t\t\t\t\t\tconsole.warn( `THREE.EXRLoader: Skipped unknown header attribute type \\'${attributeType}\\'.` );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tEXRHeader[ attributeName ] = attributeValue;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ( spec & ~ 0x06 ) != 0 ) { // unsupported deep-image, multi-part\n\n\t\t\t\tconsole.error( 'THREE.EXRHeader:', EXRHeader );\n\t\t\t\tthrow new Error( 'THREE.EXRLoader: Provided file is currently unsupported.' );\n\n\t\t\t}\n\n\t\t\treturn EXRHeader;\n\n\t\t}\n\n\t\tfunction setupDecoder( EXRHeader, dataView, uInt8Array, offset, outputType, outputFormat ) {\n\n\t\t\tconst EXRDecoder = {\n\t\t\t\tsize: 0,\n\t\t\t\tviewer: dataView,\n\t\t\t\tarray: uInt8Array,\n\t\t\t\toffset: offset,\n\t\t\t\twidth: EXRHeader.dataWindow.xMax - EXRHeader.dataWindow.xMin + 1,\n\t\t\t\theight: EXRHeader.dataWindow.yMax - EXRHeader.dataWindow.yMin + 1,\n\t\t\t\tinputChannels: EXRHeader.channels,\n\t\t\t\tchannelByteOffsets: {},\n\t\t\t\tshouldExpand: false,\n\t\t\t\tscanOrder: null,\n\t\t\t\ttotalBytes: null,\n\t\t\t\tcolumns: null,\n\t\t\t\tlines: null,\n\t\t\t\ttype: null,\n\t\t\t\tuncompress: null,\n\t\t\t\tgetter: null,\n\t\t\t\tformat: null,\n\t\t\t\tcolorSpace: LinearSRGBColorSpace,\n\t\t\t};\n\n\t\t\tswitch ( EXRHeader.compression ) {\n\n\t\t\t\tcase 'NO_COMPRESSION':\n\t\t\t\t\tEXRDecoder.blockHeight = 1;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressRAW;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'RLE_COMPRESSION':\n\t\t\t\t\tEXRDecoder.blockHeight = 1;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressRLE;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ZIPS_COMPRESSION':\n\t\t\t\t\tEXRDecoder.blockHeight = 1;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressZIP;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ZIP_COMPRESSION':\n\t\t\t\t\tEXRDecoder.blockHeight = 16;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressZIP;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PIZ_COMPRESSION':\n\t\t\t\t\tEXRDecoder.blockHeight = 32;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressPIZ;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PXR24_COMPRESSION':\n\t\t\t\t\tEXRDecoder.blockHeight = 16;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressPXR;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'DWAA_COMPRESSION':\n\t\t\t\t\tEXRDecoder.blockHeight = 32;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressDWA;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'DWAB_COMPRESSION':\n\t\t\t\t\tEXRDecoder.blockHeight = 256;\n\t\t\t\t\tEXRDecoder.uncompress = uncompressDWA;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error( 'EXRLoader.parse: ' + EXRHeader.compression + ' is unsupported' );\n\n\t\t\t}\n\n\t\t\tconst channels = {};\n\t\t\tfor ( const channel of EXRHeader.channels ) {\n\n\t\t\t\tswitch ( channel.name ) {\n\n\t\t\t\t\tcase 'Y':\n\t\t\t\t\tcase 'R':\n\t\t\t\t\tcase 'G':\n\t\t\t\t\tcase 'B':\n\t\t\t\t\tcase 'A':\n\t\t\t\t\t\tchannels[ channel.name ] = true;\n\t\t\t\t\t\tEXRDecoder.type = channel.pixelType;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// RGB images will be converted to RGBA format, preventing software emulation in select devices.\n\t\t\tlet fillAlpha = false;\n\t\t\tlet invalidOutput = false;\n\n\t\t\t// Validate if input texture contain supported channels\n\t\t\tif ( channels.R && channels.G && channels.B ) {\n\n\t\t\t\tEXRDecoder.outputChannels = 4;\n\n\t\t\t} else if ( channels.Y ) {\n\n\t\t\t\tEXRDecoder.outputChannels = 1;\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'EXRLoader.parse: file contains unsupported data channels.' );\n\n\t\t\t}\n\n\t\t\t// Setup output texture configuration\n\t\t\tswitch ( EXRDecoder.outputChannels ) {\n\n\t\t\t\tcase 4:\n\n\t\t\t\t\tif ( outputFormat == RGBAFormat ) {\n\n\t\t\t\t\t\tfillAlpha = ! channels.A;\n\t\t\t\t\t\tEXRDecoder.format = RGBAFormat;\n\t\t\t\t\t\tEXRDecoder.colorSpace = LinearSRGBColorSpace;\n\t\t\t\t\t\tEXRDecoder.outputChannels = 4;\n\t\t\t\t\t\tEXRDecoder.decodeChannels = { R: 0, G: 1, B: 2, A: 3 };\n\n\t\t\t\t\t} else if ( outputFormat == RGFormat ) {\n\n\t\t\t\t\t\tEXRDecoder.format = RGFormat;\n\t\t\t\t\t\tEXRDecoder.colorSpace = LinearSRGBColorSpace;\n\t\t\t\t\t\tEXRDecoder.outputChannels = 2;\n\t\t\t\t\t\tEXRDecoder.decodeChannels = { R: 0, G: 1 };\n\n\t\t\t\t\t} else if ( outputFormat == RedFormat ) {\n\n\t\t\t\t\t\tEXRDecoder.format = RedFormat;\n\t\t\t\t\t\tEXRDecoder.colorSpace = LinearSRGBColorSpace;\n\t\t\t\t\t\tEXRDecoder.outputChannels = 1;\n\t\t\t\t\t\tEXRDecoder.decodeChannels = { R: 0 };\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tinvalidOutput = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 1:\n\n\t\t\t\t\tif ( outputFormat == RGBAFormat ) {\n\n\t\t\t\t\t\tfillAlpha = true;\n\t\t\t\t\t\tEXRDecoder.format = RGBAFormat;\n\t\t\t\t\t\tEXRDecoder.colorSpace = LinearSRGBColorSpace;\n\t\t\t\t\t\tEXRDecoder.outputChannels = 4;\n\t\t\t\t\t\tEXRDecoder.shouldExpand = true;\n\t\t\t\t\t\tEXRDecoder.decodeChannels = { Y: 0 };\n\n\t\t\t\t\t} else if ( outputFormat == RGFormat ) {\n\n\t\t\t\t\t\tEXRDecoder.format = RGFormat;\n\t\t\t\t\t\tEXRDecoder.colorSpace = LinearSRGBColorSpace;\n\t\t\t\t\t\tEXRDecoder.outputChannels = 2;\n\t\t\t\t\t\tEXRDecoder.shouldExpand = true;\n\t\t\t\t\t\tEXRDecoder.decodeChannels = { Y: 0 };\n\n\t\t\t\t\t} else if ( outputFormat == RedFormat ) {\n\n\t\t\t\t\t\tEXRDecoder.format = RedFormat;\n\t\t\t\t\t\tEXRDecoder.colorSpace = LinearSRGBColorSpace;\n\t\t\t\t\t\tEXRDecoder.outputChannels = 1;\n\t\t\t\t\t\tEXRDecoder.decodeChannels = { Y: 0 };\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tinvalidOutput = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tinvalidOutput = true;\n\n\t\t\t}\n\n\t\t\tif ( invalidOutput ) throw new Error( 'EXRLoader.parse: invalid output format for specified file.' );\n\n\t\t\tif ( EXRDecoder.type == 1 ) {\n\n\t\t\t\t// half\n\t\t\t\tswitch ( outputType ) {\n\n\t\t\t\t\tcase FloatType:\n\t\t\t\t\t\tEXRDecoder.getter = parseFloat16;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase HalfFloatType:\n\t\t\t\t\t\tEXRDecoder.getter = parseUint16;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t} else if ( EXRDecoder.type == 2 ) {\n\n\t\t\t\t// float\n\t\t\t\tswitch ( outputType ) {\n\n\t\t\t\t\tcase FloatType:\n\t\t\t\t\t\tEXRDecoder.getter = parseFloat32;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase HalfFloatType:\n\t\t\t\t\t\tEXRDecoder.getter = decodeFloat32;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'EXRLoader.parse: unsupported pixelType ' + EXRDecoder.type + ' for ' + EXRHeader.compression + '.' );\n\n\t\t\t}\n\n\t\t\tEXRDecoder.columns = EXRDecoder.width;\n\t\t\tconst size = EXRDecoder.width * EXRDecoder.height * EXRDecoder.outputChannels;\n\n\t\t\tswitch ( outputType ) {\n\n\t\t\t\tcase FloatType:\n\t\t\t\t\tEXRDecoder.byteArray = new Float32Array( size );\n\n\t\t\t\t\t// Fill initially with 1s for the alpha value if the texture is not RGBA, RGB values will be overwritten\n\t\t\t\t\tif ( fillAlpha )\n\t\t\t\t\t\tEXRDecoder.byteArray.fill( 1, 0, size );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase HalfFloatType:\n\t\t\t\t\tEXRDecoder.byteArray = new Uint16Array( size );\n\n\t\t\t\t\tif ( fillAlpha )\n\t\t\t\t\t\tEXRDecoder.byteArray.fill( 0x3C00, 0, size ); // Uint16Array holds half float data, 0x3C00 is 1\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.error( 'THREE.EXRLoader: unsupported type: ', outputType );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tlet byteOffset = 0;\n\t\t\tfor ( const channel of EXRHeader.channels ) {\n\n\t\t\t\tif ( EXRDecoder.decodeChannels[ channel.name ] !== undefined ) {\n\n\t\t\t\t\tEXRDecoder.channelByteOffsets[ channel.name ] = byteOffset;\n\n\t\t\t\t}\n\n\t\t\t\tbyteOffset += channel.pixelType * 2;\n\n\t\t\t}\n\n\t\t\tEXRDecoder.totalBytes = byteOffset;\n\t\t\tEXRDecoder.outLineWidth = EXRDecoder.width * EXRDecoder.outputChannels;\n\n\t\t\tif ( EXRHeader.lineOrder === 'INCREASING_Y' ) {\n\n\t\t\t\tEXRDecoder.scanOrder = ( y ) => y;\n\n\t\t\t} else {\n\n\t\t\t\tEXRDecoder.scanOrder = ( y ) => EXRDecoder.height - 1 - y;\n\n\t\t\t}\n\n\t\t\tif ( EXRHeader.spec.singleTile ) {\n\n\t\t\t\tEXRDecoder.blockHeight = EXRHeader.tiles.ySize;\n\t\t\t\tEXRDecoder.blockWidth = EXRHeader.tiles.xSize;\n\n\t\t\t\tconst numXLevels = calculateTileLevels( EXRHeader.tiles, EXRDecoder.width, EXRDecoder.height );\n\t\t\t\t// const numYLevels = calculateTileLevels( EXRHeader.tiles, EXRDecoder.width, EXRDecoder.height );\n\n\t\t\t\tconst numXTiles = calculateTiles( numXLevels, EXRDecoder.width, EXRHeader.tiles.xSize, EXRHeader.tiles.roundingMode );\n\t\t\t\tconst numYTiles = calculateTiles( numXLevels, EXRDecoder.height, EXRHeader.tiles.ySize, EXRHeader.tiles.roundingMode );\n\n\t\t\t\tEXRDecoder.tileCount = numXTiles[ 0 ] * numYTiles[ 0 ];\n\n\t\t\t\tfor ( let l = 0; l < numXLevels; l ++ )\n\t\t\t\t\tfor ( let y = 0; y < numYTiles[ l ]; y ++ )\n\t\t\t\t\t\tfor ( let x = 0; x < numXTiles[ l ]; x ++ )\n\t\t\t\t\t\t\tparseInt64( dataView, offset ); // tileOffset\n\n\t\t\t\tEXRDecoder.decode = parseTiles.bind( EXRDecoder );\n\n\t\t\t} else {\n\n\t\t\t\tEXRDecoder.blockWidth = EXRDecoder.width;\n\t\t\t\tconst blockCount = Math.ceil( EXRDecoder.height / EXRDecoder.blockHeight );\n\n\t\t\t\tfor ( let i = 0; i < blockCount; i ++ )\n\t\t\t\t\tparseInt64( dataView, offset ); // scanlineOffset\n\n\t\t\t\tEXRDecoder.decode = parseScanline.bind( EXRDecoder );\n\n\t\t\t}\n\n\t\t\treturn EXRDecoder;\n\n\t\t}\n\n\t\t// start parsing file [START]\n\t\tconst offset = { value: 0 };\n\t\tconst bufferDataView = new DataView( buffer );\n\t\tconst uInt8Array = new Uint8Array( buffer );\n\n\t\t// get header information and validate format.\n\t\tconst EXRHeader = parseHeader( bufferDataView, buffer, offset );\n\n\t\t// get input compression information and prepare decoding.\n\t\tconst EXRDecoder = setupDecoder( EXRHeader, bufferDataView, uInt8Array, offset, this.type, this.outputFormat );\n\n\t\t// parse input data\n\t\tEXRDecoder.decode();\n\n\t\t// output texture post-processing\n\t\tif ( EXRDecoder.shouldExpand ) {\n\n\t\t\tconst byteArray = EXRDecoder.byteArray;\n\n\t\t\tif ( this.outputFormat == RGBAFormat ) {\n\n\t\t\t\tfor ( let i = 0; i < byteArray.length; i += 4 )\n\t\t\t\t\tbyteArray[ i + 2 ] = ( byteArray[ i + 1 ] = byteArray[ i ] );\n\n\t\t\t} else if ( this.outputFormat == RGFormat ) {\n\n\t\t\t\tfor ( let i = 0; i < byteArray.length; i += 2 )\n\t\t\t\t\tbyteArray[ i + 1 ] = byteArray[ i ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\theader: EXRHeader,\n\t\t\twidth: EXRDecoder.width,\n\t\t\theight: EXRDecoder.height,\n\t\t\tdata: EXRDecoder.byteArray,\n\t\t\tformat: EXRDecoder.format,\n\t\t\tcolorSpace: EXRDecoder.colorSpace,\n\t\t\ttype: this.type,\n\t\t};\n\n\t}\n\n\t/**\n\t * Sets the texture type.\n\t *\n\t * @param {(HalfFloatType|FloatType)} value - The texture type to set.\n\t * @return {EXRLoader} A reference to this loader.\n\t */\n\tsetDataType( value ) {\n\n\t\tthis.type = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets texture output format. Defaults to `RGBAFormat`.\n\t *\n\t * @param {(RGBAFormat|RGFormat|RedFormat)} value - Texture output format.\n\t * @return {EXRLoader} A reference to this loader.\n\t */\n\tsetOutputFormat( value ) {\n\n\t\tthis.outputFormat = value;\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tfunction onLoadCallback( texture, texData ) {\n\n\t\t\ttexture.colorSpace = texData.colorSpace;\n\t\t\ttexture.minFilter = LinearFilter;\n\t\t\ttexture.magFilter = LinearFilter;\n\t\t\ttexture.generateMipmaps = false;\n\t\t\ttexture.flipY = false;\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}\n\n\t\treturn super.load( url, onLoadCallback, onProgress, onError );\n\n\t}\n\n}\n\nexport { EXRLoader };\n", "import {\n\tBufferGeometryLoader,\n\tCanvasTexture,\n\tClampToEdgeWrapping,\n\tColor,\n\tDirectionalLight,\n\tDoubleSide,\n\tFileLoader,\n\tLinearFilter,\n\tLine,\n\tLineBasicMaterial,\n\tLoader,\n\tMatrix4,\n\tMesh,\n\tMeshPhysicalMaterial,\n\tMeshStandardMaterial,\n\tObject3D,\n\tPointLight,\n\tPoints,\n\tPointsMaterial,\n\tRectAreaLight,\n\tRepeatWrapping,\n\tSpotLight,\n\tSprite,\n\tSpriteMaterial,\n\tTextureLoader,\n\tEquirectangularReflectionMapping\n} from 'three';\n\nimport { EXRLoader } from '../loaders/EXRLoader.js';\n\nconst _taskCache = new WeakMap();\n\n/**\n * A loader for Rhinoceros 3D files and objects.\n *\n * Rhinoceros is a 3D modeler used to create, edit, analyze, document, render,\n * animate, and translate NURBS curves, surfaces, breps, extrusions, point clouds,\n * as well as polygon meshes and SubD objects. `rhino3dm.js` is compiled to WebAssembly\n * from the open source geometry library `openNURBS`. The loader currently uses\n * `rhino3dm.js 8.4.0`.\n *\n * ```js\n * const loader = new Rhino3dmLoader();\n * loader.setLibraryPath( 'https://cdn.jsdelivr.net/npm/rhino3dm@8.0.1' );\n *\n * const object = await loader.loadAsync( 'models/3dm/Rhino_Logo.3dm' );\n * scene.add( object );\n * ```\n *\n * @augments Loader\n * @three_import import { Rhino3dmLoader } from 'three/addons/loaders/3DMLoader.js';\n */\nclass Rhino3dmLoader extends Loader {\n\n\t/**\n\t * Constructs a new Rhino 3DM loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t// internals\n\n\t\tthis.libraryPath = '';\n\t\tthis.libraryPending = null;\n\t\tthis.libraryBinary = null;\n\t\tthis.libraryConfig = {};\n\n\t\tthis.url = '';\n\n\t\tthis.workerLimit = 4;\n\t\tthis.workerPool = [];\n\t\tthis.workerNextTaskID = 1;\n\t\tthis.workerSourceURL = '';\n\t\tthis.workerConfig = {};\n\n\t\tthis.materials = [];\n\t\tthis.warnings = [];\n\n\t}\n\n\t/**\n\t * Path to a folder containing the JS and WASM libraries.\n\t *\n\t * @param {string} path - The library path to set.\n\t * @return {Rhino3dmLoader} A reference to this loader.\n\t */\n\tsetLibraryPath( path ) {\n\n\t\tthis.libraryPath = path;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the maximum number of Web Workers to be used during decoding.\n\t * A lower limit may be preferable if workers are also for other\n\t * tasks in the application.\n\t *\n\t * @param {number} workerLimit - The worker limit.\n\t * @return {Rhino3dmLoader} A reference to this loader.\n\t */\n\tsetWorkerLimit( workerLimit ) {\n\n\t\tthis.workerLimit = workerLimit;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded 3DM asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Object3D)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\n\t\tthis.url = url;\n\n\t\tloader.load( url, ( buffer ) => {\n\n\t\t\t// Check for an existing task using this buffer. A transferred buffer cannot be transferred\n\t\t\t// again from this thread.\n\t\t\tif ( _taskCache.has( buffer ) ) {\n\n\t\t\t\tconst cachedTask = _taskCache.get( buffer );\n\n\t\t\t\treturn cachedTask.promise.then( onLoad ).catch( onError );\n\n\t\t\t}\n\n\t\t\tthis.decodeObjects( buffer, url )\n\t\t\t\t.then( result => {\n\n\t\t\t\t\tresult.userData.warnings = this.warnings;\n\t\t\t\t\tonLoad( result );\n\n\t\t\t\t } )\n\t\t\t\t.catch( e => onError( e ) );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Prints debug messages to the browser console.\n\t */\n\tdebug() {\n\n\t\tconsole.log( 'Task load: ', this.workerPool.map( ( worker ) => worker._taskLoad ) );\n\n\t}\n\n\t/**\n\t * Decodes the 3DM asset data with a Web Worker.\n\t *\n\t * @param {ArrayBuffer} buffer - The raw 3DM asset data as an array buffer.\n\t * @param {string} url - The asset URL.\n\t * @return {Promise<Object3D>} A Promise that resolved with the decoded 3D object.\n\t */\n\tdecodeObjects( buffer, url ) {\n\n\t\tlet worker;\n\t\tlet taskID;\n\n\t\tconst taskCost = buffer.byteLength;\n\n\t\tconst objectPending = this._getWorker( taskCost )\n\t\t\t.then( ( _worker ) => {\n\n\t\t\t\tworker = _worker;\n\t\t\t\ttaskID = this.workerNextTaskID ++;\n\n\t\t\t\treturn new Promise( ( resolve, reject ) => {\n\n\t\t\t\t\tworker._callbacks[ taskID ] = { resolve, reject };\n\n\t\t\t\t\tworker.postMessage( { type: 'decode', id: taskID, buffer }, [ buffer ] );\n\n\t\t\t\t\t// this.debug();\n\n\t\t\t\t} );\n\n\t\t\t} )\n\t\t\t.then( ( message ) => this._createGeometry( message.data ) )\n\t\t\t.catch( e => {\n\n\t\t\t\tthrow e;\n\n\t\t\t} );\n\n\t\t// Remove task from the task list.\n\t\t// Note: replaced '.finally()' with '.catch().then()' block - iOS 11 support (#19416)\n\t\tobjectPending\n\t\t\t.catch( () => true )\n\t\t\t.then( () => {\n\n\t\t\t\tif ( worker && taskID ) {\n\n\t\t\t\t\tthis._releaseTask( worker, taskID );\n\n\t\t\t\t\t//this.debug();\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t// Cache the task result.\n\t\t_taskCache.set( buffer, {\n\n\t\t\turl: url,\n\t\t\tpromise: objectPending\n\n\t\t} );\n\n\t\treturn objectPending;\n\n\t}\n\n\t/**\n\t * Parses the given 3DM data and passes the loaded 3DM asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {ArrayBuffer} data - The raw 3DM asset data as an array buffer.\n\t * @param {function(Object3D)} onLoad - Executed when the loading process has been finished.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tparse( data, onLoad, onError ) {\n\n\t\tthis.decodeObjects( data, '' )\n\t\t\t.then( result => {\n\n\t\t\t\tresult.userData.warnings = this.warnings;\n\t\t\t\tonLoad( result );\n\n\t\t\t} )\n\t\t\t.catch( e => onError( e ) );\n\n\t}\n\n\t_compareMaterials( material ) {\n\n\t\tconst mat = {};\n\t\tmat.name = material.name;\n\t\tmat.color = {};\n\t\tmat.color.r = material.color.r;\n\t\tmat.color.g = material.color.g;\n\t\tmat.color.b = material.color.b;\n\t\tmat.type = material.type;\n\t\tmat.vertexColors = material.vertexColors;\n\n\t\tconst json = JSON.stringify( mat );\n\n\t\tfor ( let i = 0; i < this.materials.length; i ++ ) {\n\n\t\t\tconst m = this.materials[ i ];\n\t\t\tconst _mat = {};\n\t\t\t_mat.name = m.name;\n\t\t\t_mat.color = {};\n\t\t\t_mat.color.r = m.color.r;\n\t\t\t_mat.color.g = m.color.g;\n\t\t\t_mat.color.b = m.color.b;\n\t\t\t_mat.type = m.type;\n\t\t\t_mat.vertexColors = m.vertexColors;\n\n\t\t\tif ( JSON.stringify( _mat ) === json ) {\n\n\t\t\t\treturn m;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.materials.push( material );\n\n\t\treturn material;\n\n\t}\n\n\t_createMaterial( material, renderEnvironment ) {\n\n\t\tif ( material === undefined ) {\n\n\t\t\treturn new MeshStandardMaterial( {\n\t\t\t\tcolor: new Color( 1, 1, 1 ),\n\t\t\t\tmetalness: 0.8,\n\t\t\t\tname: Loader.DEFAULT_MATERIAL_NAME,\n\t\t\t\tside: DoubleSide\n\t\t\t} );\n\n\t\t}\n\n\t\t//console.log(material)\n\n\t\tconst mat = new MeshPhysicalMaterial( {\n\n\t\t\tcolor: new Color( material.diffuseColor.r / 255.0, material.diffuseColor.g / 255.0, material.diffuseColor.b / 255.0 ),\n\t\t\temissive: new Color( material.emissionColor.r, material.emissionColor.g, material.emissionColor.b ),\n\t\t\tflatShading: material.disableLighting,\n\t\t\tior: material.indexOfRefraction,\n\t\t\tname: material.name,\n\t\t\treflectivity: material.reflectivity,\n\t\t\topacity: 1.0 - material.transparency,\n\t\t\tside: DoubleSide,\n\t\t\tspecularColor: material.specularColor,\n\t\t\ttransparent: material.transparency > 0 ? true : false\n\n\t\t} );\n\n\t\tmat.userData.id = material.id;\n\n\t\tif ( material.pbrSupported ) {\n\n\t\t\tconst pbr = material.pbr;\n\n\t\t\tmat.anisotropy = pbr.anisotropic;\n\t\t\tmat.anisotropyRotation = pbr.anisotropicRotation;\n\t\t\tmat.color = new Color( pbr.baseColor.r, pbr.baseColor.g, pbr.baseColor.b );\n\t\t\tmat.clearcoat = pbr.clearcoat;\n\t\t\tmat.clearcoatRoughness = pbr.clearcoatRoughness;\n\t\t\tmat.metalness = pbr.metallic;\n\t\t\tmat.transmission = 1 - pbr.opacity;\n\t\t\tmat.roughness = pbr.roughness;\n\t\t\tmat.sheen = pbr.sheen;\n\t\t\tmat.specularIntensity = pbr.specular;\n\t\t\tmat.thickness = pbr.subsurface;\n\n\t\t}\n\n\t\tif ( material.pbrSupported && material.pbr.opacity === 0 && material.transparency === 1 ) {\n\n\t\t\t//some compromises\n\n\t\t\tmat.opacity = 0.2;\n\t\t\tmat.transmission = 1.00;\n\n\t\t}\n\n\t\tconst textureLoader = new TextureLoader();\n\n\t\tfor ( let i = 0; i < material.textures.length; i ++ ) {\n\n\t\t\tconst texture = material.textures[ i ];\n\n\t\t\tif ( texture.image !== null ) {\n\n\t\t\t\tconst map = textureLoader.load( texture.image );\n\n\t\t\t\t//console.log(texture.type )\n\n\t\t\t\tswitch ( texture.type ) {\n\n\t\t\t\t\tcase 'Bump':\n\n\t\t\t\t\t\tmat.bumpMap = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Diffuse':\n\n\t\t\t\t\t\tmat.map = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Emap':\n\n\t\t\t\t\t\tmat.envMap = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Opacity':\n\n\t\t\t\t\t\tmat.transmissionMap = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Transparency':\n\n\t\t\t\t\t\tmat.alphaMap = map;\n\t\t\t\t\t\tmat.transparent = true;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PBR_Alpha':\n\n\t\t\t\t\t\tmat.alphaMap = map;\n\t\t\t\t\t\tmat.transparent = true;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PBR_AmbientOcclusion':\n\n\t\t\t\t\t\tmat.aoMap = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PBR_Anisotropic':\n\n\t\t\t\t\t\tmat.anisotropyMap = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PBR_BaseColor':\n\n\t\t\t\t\t\tmat.map = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PBR_Clearcoat':\n\n\t\t\t\t\t\tmat.clearcoatMap = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PBR_ClearcoatBump':\n\n\t\t\t\t\t\tmat.clearcoatNormalMap = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PBR_ClearcoatRoughness':\n\n\t\t\t\t\t\tmat.clearcoatRoughnessMap = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PBR_Displacement':\n\n\t\t\t\t\t\tmat.displacementMap = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PBR_Emission':\n\n\t\t\t\t\t\tmat.emissiveMap = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PBR_Metallic':\n\n\t\t\t\t\t\tmat.metalnessMap = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PBR_Roughness':\n\n\t\t\t\t\t\tmat.roughnessMap = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PBR_Sheen':\n\n\t\t\t\t\t\tmat.sheenColorMap = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PBR_Specular':\n\n\t\t\t\t\t\tmat.specularColorMap = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PBR_Subsurface':\n\n\t\t\t\t\t\tmat.thicknessMap = map;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tthis.warnings.push( {\n\t\t\t\t\t\t\tmessage: `THREE.3DMLoader: No conversion exists for 3dm ${texture.type}.`,\n\t\t\t\t\t\t\ttype: 'no conversion'\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tmap.wrapS = texture.wrapU === 0 ? RepeatWrapping : ClampToEdgeWrapping;\n\t\t\t\tmap.wrapT = texture.wrapV === 0 ? RepeatWrapping : ClampToEdgeWrapping;\n\n\t\t\t\tif ( texture.repeat ) {\n\n\t\t\t\t\tmap.repeat.set( texture.repeat[ 0 ], texture.repeat[ 1 ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( renderEnvironment ) {\n\n\t\t\tnew EXRLoader().load( renderEnvironment.image, function ( texture ) {\n\n\t\t\t\ttexture.mapping = EquirectangularReflectionMapping;\n\t\t\t\tmat.envMap = texture;\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn mat;\n\n\t}\n\n\t_createGeometry( data ) {\n\n\t\tconst object = new Object3D();\n\t\tconst instanceDefinitionObjects = [];\n\t\tconst instanceDefinitions = [];\n\t\tconst instanceReferences = [];\n\n\t\tobject.userData[ 'layers' ] = data.layers;\n\t\tobject.userData[ 'groups' ] = data.groups;\n\t\tobject.userData[ 'settings' ] = data.settings;\n\t\tobject.userData.settings[ 'renderSettings' ] = data.renderSettings;\n\t\tobject.userData[ 'objectType' ] = 'File3dm';\n\t\tobject.userData[ 'materials' ] = null;\n\n\t\tobject.name = this.url;\n\n\t\tlet objects = data.objects;\n\t\tconst materials = data.materials;\n\n\t\tfor ( let i = 0; i < objects.length; i ++ ) {\n\n\t\t\tconst obj = objects[ i ];\n\t\t\tconst attributes = obj.attributes;\n\n\t\t\tswitch ( obj.objectType ) {\n\n\t\t\t\tcase 'InstanceDefinition':\n\n\t\t\t\t\tinstanceDefinitions.push( obj );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'InstanceReference':\n\n\t\t\t\t\tinstanceReferences.push( obj );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tlet matId = null;\n\n\t\t\t\t\tswitch ( attributes.materialSource.name ) {\n\n\t\t\t\t\t\tcase 'ObjectMaterialSource_MaterialFromLayer':\n\t\t\t\t\t\t\t//check layer index\n\t\t\t\t\t\t\tif ( attributes.layerIndex >= 0 ) {\n\n\t\t\t\t\t\t\t\tmatId = data.layers[ attributes.layerIndex ].renderMaterialIndex;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'ObjectMaterialSource_MaterialFromObject':\n\n\t\t\t\t\t\t\tif ( attributes.materialIndex >= 0 ) {\n\n\t\t\t\t\t\t\t\tmatId = attributes.materialIndex;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet material = null;\n\n\t\t\t\t\tif ( matId >= 0 ) {\n\n\t\t\t\t\t\tconst rMaterial = materials[ matId ];\n\t\t\t\t\t\tmaterial = this._createMaterial( rMaterial, data.renderEnvironment );\n\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst _object = this._createObject( obj, material );\n\n\t\t\t\t\tif ( _object === undefined ) {\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst layer = data.layers[ attributes.layerIndex ];\n\n\t\t\t\t\t_object.visible = layer ? data.layers[ attributes.layerIndex ].visible : true;\n\n\t\t\t\t\tif ( attributes.isInstanceDefinitionObject ) {\n\n\t\t\t\t\t\tinstanceDefinitionObjects.push( _object );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tobject.add( _object );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < instanceDefinitions.length; i ++ ) {\n\n\t\t\tconst iDef = instanceDefinitions[ i ];\n\n\t\t\tobjects = [];\n\n\t\t\tfor ( let j = 0; j < iDef.attributes.objectIds.length; j ++ ) {\n\n\t\t\t\tconst objId = iDef.attributes.objectIds[ j ];\n\n\t\t\t\tfor ( let p = 0; p < instanceDefinitionObjects.length; p ++ ) {\n\n\t\t\t\t\tconst idoId = instanceDefinitionObjects[ p ].userData.attributes.id;\n\n\t\t\t\t\tif ( objId === idoId ) {\n\n\t\t\t\t\t\tobjects.push( instanceDefinitionObjects[ p ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Currently clones geometry and does not take advantage of instancing\n\n\t\t\tfor ( let j = 0; j < instanceReferences.length; j ++ ) {\n\n\t\t\t\tconst iRef = instanceReferences[ j ];\n\n\t\t\t\tif ( iRef.geometry.parentIdefId === iDef.attributes.id ) {\n\n\t\t\t\t\tconst iRefObject = new Object3D();\n\t\t\t\t\tconst xf = iRef.geometry.xform.array;\n\n\t\t\t\t\tconst matrix = new Matrix4();\n\t\t\t\t\tmatrix.set( ...xf );\n\n\t\t\t\t\tiRefObject.applyMatrix4( matrix );\n\n\t\t\t\t\tfor ( let p = 0; p < objects.length; p ++ ) {\n\n\t\t\t\t\t\tiRefObject.add( objects[ p ].clone( true ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobject.add( iRefObject );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tobject.userData[ 'materials' ] = this.materials;\n\t\tobject.name = '';\n\t\treturn object;\n\n\t}\n\n\t_createObject( obj, mat ) {\n\n\t\tconst loader = new BufferGeometryLoader();\n\n\t\tconst attributes = obj.attributes;\n\n\t\tlet geometry, material, _color, color;\n\n\t\tswitch ( obj.objectType ) {\n\n\t\t\tcase 'Point':\n\t\t\tcase 'PointSet':\n\n\t\t\t\tgeometry = loader.parse( obj.geometry );\n\n\t\t\t\tif ( geometry.hasAttribute( 'color' ) ) {\n\n\t\t\t\t\tmaterial = new PointsMaterial( { vertexColors: true, sizeAttenuation: false, size: 2 } );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_color = attributes.drawColor;\n\t\t\t\t\tcolor = new Color( _color.r / 255.0, _color.g / 255.0, _color.b / 255.0 );\n\t\t\t\t\tmaterial = new PointsMaterial( { color: color, sizeAttenuation: false, size: 2 } );\n\n\t\t\t\t}\n\n\t\t\t\tmaterial = this._compareMaterials( material );\n\n\t\t\t\tconst points = new Points( geometry, material );\n\t\t\t\tpoints.userData[ 'attributes' ] = attributes;\n\t\t\t\tpoints.userData[ 'objectType' ] = obj.objectType;\n\n\t\t\t\tif ( attributes.name ) {\n\n\t\t\t\t\tpoints.name = attributes.name;\n\n\t\t\t\t}\n\n\t\t\t\treturn points;\n\n\t\t\tcase 'Mesh':\n\t\t\tcase 'Extrusion':\n\t\t\tcase 'SubD':\n\t\t\tcase 'Brep':\n\n\t\t\t\tif ( obj.geometry === null ) return;\n\n\t\t\t\tgeometry = loader.parse( obj.geometry );\n\n\n\t\t\t\tif ( mat === null ) {\n\n\t\t\t\t\tmat = this._createMaterial();\n\n\t\t\t\t}\n\n\n\t\t\t\tif ( geometry.hasAttribute( 'color' ) ) {\n\n\t\t\t\t\tmat.vertexColors = true;\n\n\t\t\t\t}\n\n\t\t\t\tmat = this._compareMaterials( mat );\n\n\t\t\t\tconst mesh = new Mesh( geometry, mat );\n\t\t\t\tmesh.castShadow = attributes.castsShadows;\n\t\t\t\tmesh.receiveShadow = attributes.receivesShadows;\n\t\t\t\tmesh.userData[ 'attributes' ] = attributes;\n\t\t\t\tmesh.userData[ 'objectType' ] = obj.objectType;\n\n\t\t\t\tif ( attributes.name ) {\n\n\t\t\t\t\tmesh.name = attributes.name;\n\n\t\t\t\t}\n\n\t\t\t\treturn mesh;\n\n\t\t\tcase 'Curve':\n\n\t\t\t\tgeometry = loader.parse( obj.geometry );\n\n\t\t\t\t_color = attributes.drawColor;\n\t\t\t\tcolor = new Color( _color.r / 255.0, _color.g / 255.0, _color.b / 255.0 );\n\n\t\t\t\tmaterial = new LineBasicMaterial( { color: color } );\n\t\t\t\tmaterial = this._compareMaterials( material );\n\n\t\t\t\tconst lines = new Line( geometry, material );\n\t\t\t\tlines.userData[ 'attributes' ] = attributes;\n\t\t\t\tlines.userData[ 'objectType' ] = obj.objectType;\n\n\t\t\t\tif ( attributes.name ) {\n\n\t\t\t\t\tlines.name = attributes.name;\n\n\t\t\t\t}\n\n\t\t\t\treturn lines;\n\n\t\t\tcase 'TextDot':\n\n\t\t\t\tgeometry = obj.geometry;\n\n\t\t\t\tconst ctx = document.createElement( 'canvas' ).getContext( '2d' );\n\t\t\t\tconst font = `${geometry.fontHeight}px ${geometry.fontFace}`;\n\t\t\t\tctx.font = font;\n\t\t\t\tconst width = ctx.measureText( geometry.text ).width + 10;\n\t\t\t\tconst height = geometry.fontHeight + 10;\n\n\t\t\t\tconst r = window.devicePixelRatio;\n\n\t\t\t\tctx.canvas.width = width * r;\n\t\t\t\tctx.canvas.height = height * r;\n\t\t\t\tctx.canvas.style.width = width + 'px';\n\t\t\t\tctx.canvas.style.height = height + 'px';\n\t\t\t\tctx.setTransform( r, 0, 0, r, 0, 0 );\n\n\t\t\t\tctx.font = font;\n\t\t\t\tctx.textBaseline = 'middle';\n\t\t\t\tctx.textAlign = 'center';\n\t\t\t\tcolor = attributes.drawColor;\n\t\t\t\tctx.fillStyle = `rgba(${color.r},${color.g},${color.b},${color.a})`;\n\t\t\t\tctx.fillRect( 0, 0, width, height );\n\t\t\t\tctx.fillStyle = 'white';\n\t\t\t\tctx.fillText( geometry.text, width / 2, height / 2 );\n\n\t\t\t\tconst texture = new CanvasTexture( ctx.canvas );\n\t\t\t\ttexture.minFilter = LinearFilter;\n\t\t\t\ttexture.generateMipmaps = false;\n\t\t\t\ttexture.wrapS = ClampToEdgeWrapping;\n\t\t\t\ttexture.wrapT = ClampToEdgeWrapping;\n\n\t\t\t\tmaterial = new SpriteMaterial( { map: texture, depthTest: false } );\n\t\t\t\tconst sprite = new Sprite( material );\n\t\t\t\tsprite.position.set( geometry.point[ 0 ], geometry.point[ 1 ], geometry.point[ 2 ] );\n\t\t\t\tsprite.scale.set( width / 10, height / 10, 1.0 );\n\n\t\t\t\tsprite.userData[ 'attributes' ] = attributes;\n\t\t\t\tsprite.userData[ 'objectType' ] = obj.objectType;\n\n\t\t\t\tif ( attributes.name ) {\n\n\t\t\t\t\tsprite.name = attributes.name;\n\n\t\t\t\t}\n\n\t\t\t\treturn sprite;\n\n\t\t\tcase 'Light':\n\n\t\t\t\tgeometry = obj.geometry;\n\n\t\t\t\tlet light;\n\n\t\t\t\tswitch ( geometry.lightStyle.name ) {\n\n\t\t\t\t\tcase 'LightStyle_WorldPoint':\n\n\t\t\t\t\t\tlight = new PointLight();\n\t\t\t\t\t\tlight.castShadow = attributes.castsShadows;\n\t\t\t\t\t\tlight.position.set( geometry.location[ 0 ], geometry.location[ 1 ], geometry.location[ 2 ] );\n\t\t\t\t\t\tlight.shadow.normalBias = 0.1;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LightStyle_WorldSpot':\n\n\t\t\t\t\t\tlight = new SpotLight();\n\t\t\t\t\t\tlight.castShadow = attributes.castsShadows;\n\t\t\t\t\t\tlight.position.set( geometry.location[ 0 ], geometry.location[ 1 ], geometry.location[ 2 ] );\n\t\t\t\t\t\tlight.target.position.set( geometry.direction[ 0 ], geometry.direction[ 1 ], geometry.direction[ 2 ] );\n\t\t\t\t\t\tlight.angle = geometry.spotAngleRadians;\n\t\t\t\t\t\tlight.shadow.normalBias = 0.1;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LightStyle_WorldRectangular':\n\n\t\t\t\t\t\tlight = new RectAreaLight();\n\t\t\t\t\t\tconst width = Math.abs( geometry.width[ 2 ] );\n\t\t\t\t\t\tconst height = Math.abs( geometry.length[ 0 ] );\n\t\t\t\t\t\tlight.position.set( geometry.location[ 0 ] - ( height / 2 ), geometry.location[ 1 ], geometry.location[ 2 ] - ( width / 2 ) );\n\t\t\t\t\t\tlight.height = height;\n\t\t\t\t\t\tlight.width = width;\n\t\t\t\t\t\tlight.lookAt( geometry.direction[ 0 ], geometry.direction[ 1 ], geometry.direction[ 2 ] );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LightStyle_WorldDirectional':\n\n\t\t\t\t\t\tlight = new DirectionalLight();\n\t\t\t\t\t\tlight.castShadow = attributes.castsShadows;\n\t\t\t\t\t\tlight.position.set( geometry.location[ 0 ], geometry.location[ 1 ], geometry.location[ 2 ] );\n\t\t\t\t\t\tlight.target.position.set( geometry.direction[ 0 ], geometry.direction[ 1 ], geometry.direction[ 2 ] );\n\t\t\t\t\t\tlight.shadow.normalBias = 0.1;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LightStyle_WorldLinear':\n\t\t\t\t\t\t// no conversion exists, warning has already been printed to the console\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tif ( light ) {\n\n\t\t\t\t\tlight.intensity = geometry.intensity;\n\t\t\t\t\t_color = geometry.diffuse;\n\t\t\t\t\tcolor = new Color( _color.r / 255.0, _color.g / 255.0, _color.b / 255.0 );\n\t\t\t\t\tlight.color = color;\n\t\t\t\t\tlight.userData[ 'attributes' ] = attributes;\n\t\t\t\t\tlight.userData[ 'objectType' ] = obj.objectType;\n\n\t\t\t\t}\n\n\t\t\t\treturn light;\n\n\t\t}\n\n\t}\n\n\t_initLibrary() {\n\n\t\tif ( ! this.libraryPending ) {\n\n\t\t\t// Load rhino3dm wrapper.\n\t\t\tconst jsLoader = new FileLoader( this.manager );\n\t\t\tjsLoader.setPath( this.libraryPath );\n\t\t\tconst jsContent = new Promise( ( resolve, reject ) => {\n\n\t\t\t\tjsLoader.load( 'rhino3dm.js', resolve, undefined, reject );\n\n\t\t\t} );\n\n\t\t\t// Load rhino3dm WASM binary.\n\t\t\tconst binaryLoader = new FileLoader( this.manager );\n\t\t\tbinaryLoader.setPath( this.libraryPath );\n\t\t\tbinaryLoader.setResponseType( 'arraybuffer' );\n\t\t\tconst binaryContent = new Promise( ( resolve, reject ) => {\n\n\t\t\t\tbinaryLoader.load( 'rhino3dm.wasm', resolve, undefined, reject );\n\n\t\t\t} );\n\n\t\t\tthis.libraryPending = Promise.all( [ jsContent, binaryContent ] )\n\t\t\t\t.then( ( [ jsContent, binaryContent ] ) => {\n\n\t\t\t\t\t//this.libraryBinary = binaryContent;\n\t\t\t\t\tthis.libraryConfig.wasmBinary = binaryContent;\n\n\t\t\t\t\tconst fn = Rhino3dmWorker.toString();\n\n\t\t\t\t\tconst body = [\n\t\t\t\t\t\t'/* rhino3dm.js */',\n\t\t\t\t\t\tjsContent,\n\t\t\t\t\t\t'/* worker */',\n\t\t\t\t\t\tfn.substring( fn.indexOf( '{' ) + 1, fn.lastIndexOf( '}' ) )\n\t\t\t\t\t].join( '\\n' );\n\n\t\t\t\t\tthis.workerSourceURL = URL.createObjectURL( new Blob( [ body ] ) );\n\n\t\t\t\t} );\n\n\t\t}\n\n\t\treturn this.libraryPending;\n\n\t}\n\n\t_getWorker( taskCost ) {\n\n\t\treturn this._initLibrary().then( () => {\n\n\t\t\tif ( this.workerPool.length < this.workerLimit ) {\n\n\t\t\t\tconst worker = new Worker( this.workerSourceURL );\n\n\t\t\t\tworker._callbacks = {};\n\t\t\t\tworker._taskCosts = {};\n\t\t\t\tworker._taskLoad = 0;\n\n\t\t\t\tworker.postMessage( {\n\t\t\t\t\ttype: 'init',\n\t\t\t\t\tlibraryConfig: this.libraryConfig\n\t\t\t\t} );\n\n\t\t\t\tworker.onmessage = e => {\n\n\t\t\t\t\tconst message = e.data;\n\n\t\t\t\t\tswitch ( message.type ) {\n\n\t\t\t\t\t\tcase 'warning':\n\t\t\t\t\t\t\tthis.warnings.push( message.data );\n\t\t\t\t\t\t\tconsole.warn( message.data );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'decode':\n\t\t\t\t\t\t\tworker._callbacks[ message.id ].resolve( message );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'error':\n\t\t\t\t\t\t\tworker._callbacks[ message.id ].reject( message );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.Rhino3dmLoader: Unexpected message, \"' + message.type + '\"' );\n\n\t\t\t\t\t}\n\n\t\t\t\t};\n\n\t\t\t\tthis.workerPool.push( worker );\n\n\t\t\t} else {\n\n\t\t\t\tthis.workerPool.sort( function ( a, b ) {\n\n\t\t\t\t\treturn a._taskLoad > b._taskLoad ? - 1 : 1;\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tconst worker = this.workerPool[ this.workerPool.length - 1 ];\n\n\t\t\tworker._taskLoad += taskCost;\n\n\t\t\treturn worker;\n\n\t\t} );\n\n\t}\n\n\t_releaseTask( worker, taskID ) {\n\n\t\tworker._taskLoad -= worker._taskCosts[ taskID ];\n\t\tdelete worker._callbacks[ taskID ];\n\t\tdelete worker._taskCosts[ taskID ];\n\n\t}\n\n\t/**\n\t * Frees internal resources. This method should be called\n\t * when the loader is no longer required.\n\t */\n\tdispose() {\n\n\t\tfor ( let i = 0; i < this.workerPool.length; ++ i ) {\n\n\t\t\tthis.workerPool[ i ].terminate();\n\n\t\t}\n\n\t\tthis.workerPool.length = 0;\n\n\t}\n\n}\n\n/* WEB WORKER */\n\nfunction Rhino3dmWorker() {\n\n\tlet libraryPending;\n\tlet libraryConfig;\n\tlet rhino;\n\tlet taskID;\n\n\tonmessage = function ( e ) {\n\n\t\tconst message = e.data;\n\n\t\tswitch ( message.type ) {\n\n\t\t\tcase 'init':\n\n\t\t\t\tlibraryConfig = message.libraryConfig;\n\t\t\t\tconst wasmBinary = libraryConfig.wasmBinary;\n\t\t\t\tlet RhinoModule;\n\t\t\t\tlibraryPending = new Promise( function ( resolve ) {\n\n\t\t\t\t\t/* Like Basis Loader */\n\t\t\t\t\tRhinoModule = { wasmBinary, onRuntimeInitialized: resolve };\n\n\t\t\t\t\trhino3dm( RhinoModule ); // eslint-disable-line no-undef\n\n\t\t\t\t } ).then( () => {\n\n\t\t\t\t\trhino = RhinoModule;\n\n\t\t\t\t } );\n\n\t\t\t\tbreak;\n\n\t\t\tcase 'decode':\n\n\t\t\t\ttaskID = message.id;\n\t\t\t\tconst buffer = message.buffer;\n\t\t\t\tlibraryPending.then( () => {\n\n\t\t\t\t\ttry {\n\n\t\t\t\t\t\tconst data = decodeObjects( rhino, buffer );\n\t\t\t\t\t\tself.postMessage( { type: 'decode', id: message.id, data } );\n\n\t\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t\tself.postMessage( { type: 'error', id: message.id, error } );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t};\n\n\tfunction decodeObjects( rhino, buffer ) {\n\n\t\tconst arr = new Uint8Array( buffer );\n\t\tconst doc = rhino.File3dm.fromByteArray( arr );\n\n\t\tconst objects = [];\n\t\tconst materials = [];\n\t\tconst layers = [];\n\t\tconst views = [];\n\t\tconst namedViews = [];\n\t\tconst groups = [];\n\t\tconst strings = [];\n\n\t\t//Handle objects\n\n\t\tconst objs = doc.objects();\n\t\tconst cnt = objs.count;\n\n\t\tfor ( let i = 0; i < cnt; i ++ ) {\n\n\t\t\tconst _object = objs.get( i );\n\n\t\t\tconst object = extractObjectData( _object, doc );\n\n\t\t\t_object.delete();\n\n\t\t\tif ( object ) {\n\n\t\t\t\tobjects.push( object );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Handle instance definitions\n\t\t// console.log( `Instance Definitions Count: ${doc.instanceDefinitions().count()}` );\n\n\t\tfor ( let i = 0; i < doc.instanceDefinitions().count; i ++ ) {\n\n\t\t\tconst idef = doc.instanceDefinitions().get( i );\n\t\t\tconst idefAttributes = extractProperties( idef );\n\t\t\tidefAttributes.objectIds = idef.getObjectIds();\n\n\t\t\tobjects.push( { geometry: null, attributes: idefAttributes, objectType: 'InstanceDefinition' } );\n\n\t\t}\n\n\t\t// Handle materials\n\n\t\tconst textureTypes = [\n\t\t\t// rhino.TextureType.Bitmap,\n\t\t\trhino.TextureType.Diffuse,\n\t\t\trhino.TextureType.Bump,\n\t\t\trhino.TextureType.Transparency,\n\t\t\trhino.TextureType.Opacity,\n\t\t\trhino.TextureType.Emap\n\t\t];\n\n\t\tconst pbrTextureTypes = [\n\t\t\trhino.TextureType.PBR_BaseColor,\n\t\t\trhino.TextureType.PBR_Subsurface,\n\t\t\trhino.TextureType.PBR_SubsurfaceScattering,\n\t\t\trhino.TextureType.PBR_SubsurfaceScatteringRadius,\n\t\t\trhino.TextureType.PBR_Metallic,\n\t\t\trhino.TextureType.PBR_Specular,\n\t\t\trhino.TextureType.PBR_SpecularTint,\n\t\t\trhino.TextureType.PBR_Roughness,\n\t\t\trhino.TextureType.PBR_Anisotropic,\n\t\t\trhino.TextureType.PBR_Anisotropic_Rotation,\n\t\t\trhino.TextureType.PBR_Sheen,\n\t\t\trhino.TextureType.PBR_SheenTint,\n\t\t\trhino.TextureType.PBR_Clearcoat,\n\t\t\trhino.TextureType.PBR_ClearcoatBump,\n\t\t\trhino.TextureType.PBR_ClearcoatRoughness,\n\t\t\trhino.TextureType.PBR_OpacityIor,\n\t\t\trhino.TextureType.PBR_OpacityRoughness,\n\t\t\trhino.TextureType.PBR_Emission,\n\t\t\trhino.TextureType.PBR_AmbientOcclusion,\n\t\t\trhino.TextureType.PBR_Displacement\n\t\t];\n\n\t\tfor ( let i = 0; i < doc.materials().count; i ++ ) {\n\n\t\t\tconst _material = doc.materials().get( i );\n\n\t\t\tconst material = extractProperties( _material );\n\n\t\t\tconst textures = [];\n\n\t\t\ttextures.push( ...extractTextures( _material, textureTypes, doc ) );\n\n\t\t\tmaterial.pbrSupported = _material.physicallyBased().supported;\n\n\t\t\tif ( material.pbrSupported ) {\n\n\t\t\t\ttextures.push( ...extractTextures( _material, pbrTextureTypes, doc ) );\n\t\t\t\tmaterial.pbr = extractProperties( _material.physicallyBased() );\n\n\t\t\t}\n\n\t\t\tmaterial.textures = textures;\n\n\t\t\tmaterials.push( material );\n\n\t\t\t_material.delete();\n\n\t\t}\n\n\t\t// Handle layers\n\n\t\tfor ( let i = 0; i < doc.layers().count; i ++ ) {\n\n\t\t\tconst _layer = doc.layers().get( i );\n\t\t\tconst layer = extractProperties( _layer );\n\n\t\t\tlayers.push( layer );\n\n\t\t\t_layer.delete();\n\n\t\t}\n\n\t\t// Handle views\n\n\t\tfor ( let i = 0; i < doc.views().count; i ++ ) {\n\n\t\t\tconst _view = doc.views().get( i );\n\t\t\tconst view = extractProperties( _view );\n\n\t\t\tviews.push( view );\n\n\t\t\t_view.delete();\n\n\t\t}\n\n\t\t// Handle named views\n\n\t\tfor ( let i = 0; i < doc.namedViews().count; i ++ ) {\n\n\t\t\tconst _namedView = doc.namedViews().get( i );\n\t\t\tconst namedView = extractProperties( _namedView );\n\n\t\t\tnamedViews.push( namedView );\n\n\t\t\t_namedView.delete();\n\n\t\t}\n\n\t\t// Handle groups\n\n\t\tfor ( let i = 0; i < doc.groups().count; i ++ ) {\n\n\t\t\tconst _group = doc.groups().get( i );\n\t\t\tconst group = extractProperties( _group );\n\n\t\t\tgroups.push( group );\n\n\t\t\t_group.delete();\n\n\t\t}\n\n\t\t// Handle settings\n\n\t\tconst settings = extractProperties( doc.settings() );\n\n\t\t//TODO: Handle other document stuff like dimstyles, instance definitions, bitmaps etc.\n\n\t\t// Handle dimstyles\n\t\t// console.log( `Dimstyle Count: ${doc.dimstyles().count()}` );\n\n\t\t// Handle bitmaps\n\t\t// console.log( `Bitmap Count: ${doc.bitmaps().count()}` );\n\n\t\t// Handle strings\n\t\t// console.log( `Document Strings Count: ${doc.strings().count()}` );\n\t\t// Note: doc.strings().documentUserTextCount() counts any doc.strings defined in a section\n\t\t// console.log( `Document User Text Count: ${doc.strings().documentUserTextCount()}` );\n\n\t\tconst strings_count = doc.strings().count;\n\n\t\tfor ( let i = 0; i < strings_count; i ++ ) {\n\n\t\t\tstrings.push( doc.strings().get( i ) );\n\n\t\t}\n\n\t\t// Handle Render Environments for Material Environment\n\n\t\t// get the id of the active render environment skylight, which we'll use for environment texture\n\t\tconst reflectionId = doc.settings().renderSettings().renderEnvironments.reflectionId;\n\n\t\tconst rc = doc.renderContent();\n\n\t\tlet renderEnvironment = null;\n\n\t\tfor ( let i = 0; i < rc.count; i ++ ) {\n\n\t\t\tconst content = rc.get( i );\n\n\t\t\tswitch ( content.kind ) {\n\n\t\t\t\tcase 'environment':\n\n\t\t\t\t\tconst id = content.id;\n\n\t\t\t\t\t// there could be multiple render environments in a 3dm file\n\t\t\t\t\tif ( id !== reflectionId ) break;\n\n\t\t\t\t\tconst renderTexture = content.findChild( 'texture' );\n\t\t\t\t\tconst fileName = renderTexture.fileName;\n\n\t\t\t\t\tfor ( let j = 0; j < doc.embeddedFiles().count; j ++ ) {\n\n\t\t\t\t\t\tconst _fileName = doc.embeddedFiles().get( j ).fileName;\n\n\t\t\t\t\t\tif ( fileName === _fileName ) {\n\n\t\t\t\t\t\t\tconst background = doc.getEmbeddedFileAsBase64( fileName );\n\t\t\t\t\t\t\tconst backgroundImage = 'data:image/png;base64,' + background;\n\t\t\t\t\t\t\trenderEnvironment = { type: 'renderEnvironment', image: backgroundImage, name: fileName };\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Handle Render Settings\n\n\t\tconst renderSettings = {\n\t\t\tambientLight: doc.settings().renderSettings().ambientLight,\n\t\t\tbackgroundColorTop: doc.settings().renderSettings().backgroundColorTop,\n\t\t\tbackgroundColorBottom: doc.settings().renderSettings().backgroundColorBottom,\n\t\t\tuseHiddenLights: doc.settings().renderSettings().useHiddenLights,\n\t\t\tdepthCue: doc.settings().renderSettings().depthCue,\n\t\t\tflatShade: doc.settings().renderSettings().flatShade,\n\t\t\trenderBackFaces: doc.settings().renderSettings().renderBackFaces,\n\t\t\trenderPoints: doc.settings().renderSettings().renderPoints,\n\t\t\trenderCurves: doc.settings().renderSettings().renderCurves,\n\t\t\trenderIsoParams: doc.settings().renderSettings().renderIsoParams,\n\t\t\trenderMeshEdges: doc.settings().renderSettings().renderMeshEdges,\n\t\t\trenderAnnotations: doc.settings().renderSettings().renderAnnotations,\n\t\t\tuseViewportSize: doc.settings().renderSettings().useViewportSize,\n\t\t\tscaleBackgroundToFit: doc.settings().renderSettings().scaleBackgroundToFit,\n\t\t\ttransparentBackground: doc.settings().renderSettings().transparentBackground,\n\t\t\timageDpi: doc.settings().renderSettings().imageDpi,\n\t\t\tshadowMapLevel: doc.settings().renderSettings().shadowMapLevel,\n\t\t\tnamedView: doc.settings().renderSettings().namedView,\n\t\t\tsnapShot: doc.settings().renderSettings().snapShot,\n\t\t\tspecificViewport: doc.settings().renderSettings().specificViewport,\n\t\t\tgroundPlane: extractProperties( doc.settings().renderSettings().groundPlane ),\n\t\t\tsafeFrame: extractProperties( doc.settings().renderSettings().safeFrame ),\n\t\t\tdithering: extractProperties( doc.settings().renderSettings().dithering ),\n\t\t\tskylight: extractProperties( doc.settings().renderSettings().skylight ),\n\t\t\tlinearWorkflow: extractProperties( doc.settings().renderSettings().linearWorkflow ),\n\t\t\trenderChannels: extractProperties( doc.settings().renderSettings().renderChannels ),\n\t\t\tsun: extractProperties( doc.settings().renderSettings().sun ),\n\t\t\trenderEnvironments: extractProperties( doc.settings().renderSettings().renderEnvironments ),\n\t\t\tpostEffects: extractProperties( doc.settings().renderSettings().postEffects ),\n\n\t\t};\n\n\t\tdoc.delete();\n\n\t\treturn { objects, materials, layers, views, namedViews, groups, strings, settings, renderSettings, renderEnvironment };\n\n\t}\n\n\tfunction extractTextures( m, tTypes, d ) {\n\n\t\tconst textures = [];\n\n\t\tfor ( let i = 0; i < tTypes.length; i ++ ) {\n\n\t\t\tconst _texture = m.getTexture( tTypes[ i ] );\n\t\t\tif ( _texture ) {\n\n\t\t\t\tlet textureType = tTypes[ i ].constructor.name;\n\t\t\t\ttextureType = textureType.substring( 12, textureType.length );\n\t\t\t\tconst texture = extractTextureData( _texture, textureType, d );\n\t\t\t\ttextures.push( texture );\n\t\t\t\t_texture.delete();\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn textures;\n\n\t}\n\n\tfunction extractTextureData( t, tType, d ) {\n\n\t\tconst texture = { type: tType };\n\n\t\tconst image = d.getEmbeddedFileAsBase64( t.fileName );\n\n\t\ttexture.wrapU = t.wrapU;\n\t\ttexture.wrapV = t.wrapV;\n\t\ttexture.wrapW = t.wrapW;\n\t\tconst uvw = t.uvwTransform.toFloatArray( true );\n\n\t\ttexture.repeat = [ uvw[ 0 ], uvw[ 5 ] ];\n\n\t\tif ( image ) {\n\n\t\t\ttexture.image = 'data:image/png;base64,' + image;\n\n\t\t} else {\n\n\t\t\tself.postMessage( { type: 'warning', id: taskID, data: {\n\t\t\t\tmessage: `THREE.3DMLoader: Image for ${tType} texture not embedded in file.`,\n\t\t\t\ttype: 'missing resource'\n\t\t\t}\n\n\t\t\t} );\n\n\t\t\ttexture.image = null;\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\tfunction extractObjectData( object, doc ) {\n\n\t\tconst _geometry = object.geometry();\n\t\tconst _attributes = object.attributes();\n\t\tlet objectType = _geometry.objectType;\n\t\tlet geometry, attributes, position, data, mesh;\n\n\t\t// skip instance definition objects\n\t\t//if( _attributes.isInstanceDefinitionObject ) { continue; }\n\n\t\t// TODO: handle other geometry types\n\t\tswitch ( objectType ) {\n\n\t\t\tcase rhino.ObjectType.Curve:\n\n\t\t\t\tconst pts = curveToPoints( _geometry, 100 );\n\n\t\t\t\tposition = {};\n\t\t\t\tattributes = {};\n\t\t\t\tdata = {};\n\n\t\t\t\tposition.itemSize = 3;\n\t\t\t\tposition.type = 'Float32Array';\n\t\t\t\tposition.array = [];\n\n\t\t\t\tfor ( let j = 0; j < pts.length; j ++ ) {\n\n\t\t\t\t\tposition.array.push( pts[ j ][ 0 ] );\n\t\t\t\t\tposition.array.push( pts[ j ][ 1 ] );\n\t\t\t\t\tposition.array.push( pts[ j ][ 2 ] );\n\n\t\t\t\t}\n\n\t\t\t\tattributes.position = position;\n\t\t\t\tdata.attributes = attributes;\n\n\t\t\t\tgeometry = { data };\n\n\t\t\t\tbreak;\n\n\t\t\tcase rhino.ObjectType.Point:\n\n\t\t\t\tconst pt = _geometry.location;\n\n\t\t\t\tposition = {};\n\t\t\t\tconst color = {};\n\t\t\t\tattributes = {};\n\t\t\t\tdata = {};\n\n\t\t\t\tposition.itemSize = 3;\n\t\t\t\tposition.type = 'Float32Array';\n\t\t\t\tposition.array = [ pt[ 0 ], pt[ 1 ], pt[ 2 ] ];\n\n\t\t\t\tconst _color = _attributes.drawColor( doc );\n\n\t\t\t\tcolor.itemSize = 3;\n\t\t\t\tcolor.type = 'Float32Array';\n\t\t\t\tcolor.array = [ _color.r / 255.0, _color.g / 255.0, _color.b / 255.0 ];\n\n\t\t\t\tattributes.position = position;\n\t\t\t\tattributes.color = color;\n\t\t\t\tdata.attributes = attributes;\n\n\t\t\t\tgeometry = { data };\n\n\t\t\t\tbreak;\n\n\t\t\tcase rhino.ObjectType.PointSet:\n\t\t\tcase rhino.ObjectType.Mesh:\n\n\t\t\t\tgeometry = _geometry.toThreejsJSON();\n\n\t\t\t\tbreak;\n\n\t\t\tcase rhino.ObjectType.Brep:\n\n\t\t\t\tconst faces = _geometry.faces();\n\t\t\t\tmesh = new rhino.Mesh();\n\n\t\t\t\tfor ( let faceIndex = 0; faceIndex < faces.count; faceIndex ++ ) {\n\n\t\t\t\t\tconst face = faces.get( faceIndex );\n\t\t\t\t\tconst _mesh = face.getMesh( rhino.MeshType.Any );\n\n\t\t\t\t\tif ( _mesh ) {\n\n\t\t\t\t\t\tmesh.append( _mesh );\n\t\t\t\t\t\t_mesh.delete();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tface.delete();\n\n\t\t\t\t}\n\n\t\t\t\tif ( mesh.faces().count > 0 ) {\n\n\t\t\t\t\tmesh.compact();\n\t\t\t\t\tgeometry = mesh.toThreejsJSON();\n\t\t\t\t\tfaces.delete();\n\n\t\t\t\t}\n\n\t\t\t\tmesh.delete();\n\n\t\t\t\tbreak;\n\n\t\t\tcase rhino.ObjectType.Extrusion:\n\n\t\t\t\tmesh = _geometry.getMesh( rhino.MeshType.Any );\n\n\t\t\t\tif ( mesh ) {\n\n\t\t\t\t\tgeometry = mesh.toThreejsJSON();\n\t\t\t\t\tmesh.delete();\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase rhino.ObjectType.TextDot:\n\n\t\t\t\tgeometry = extractProperties( _geometry );\n\n\t\t\t\tbreak;\n\n\t\t\tcase rhino.ObjectType.Light:\n\n\t\t\t\tgeometry = extractProperties( _geometry );\n\n\t\t\t\tif ( geometry.lightStyle.name === 'LightStyle_WorldLinear' ) {\n\n\t\t\t\t\tself.postMessage( { type: 'warning', id: taskID, data: {\n\t\t\t\t\t\tmessage: `THREE.3DMLoader: No conversion exists for ${objectType.constructor.name} ${geometry.lightStyle.name}`,\n\t\t\t\t\t\ttype: 'no conversion',\n\t\t\t\t\t\tguid: _attributes.id\n\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase rhino.ObjectType.InstanceReference:\n\n\t\t\t\tgeometry = extractProperties( _geometry );\n\t\t\t\tgeometry.xform = extractProperties( _geometry.xform );\n\t\t\t\tgeometry.xform.array = _geometry.xform.toFloatArray( true );\n\n\t\t\t\tbreak;\n\n\t\t\tcase rhino.ObjectType.SubD:\n\n\t\t\t\t// TODO: precalculate resulting vertices and faces and warn on excessive results\n\t\t\t\t_geometry.subdivide( 3 );\n\t\t\t\tmesh = rhino.Mesh.createFromSubDControlNet( _geometry, false );\n\t\t\t\tif ( mesh ) {\n\n\t\t\t\t\tgeometry = mesh.toThreejsJSON();\n\t\t\t\t\tmesh.delete();\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\t\t/*\n\t\t\t\tcase rhino.ObjectType.Annotation:\n\t\t\t\tcase rhino.ObjectType.Hatch:\n\t\t\t\tcase rhino.ObjectType.ClipPlane:\n\t\t\t\t*/\n\n\t\t\tdefault:\n\n\t\t\t\tself.postMessage( { type: 'warning', id: taskID, data: {\n\t\t\t\t\tmessage: `THREE.3DMLoader: Conversion not implemented for ${objectType.constructor.name}`,\n\t\t\t\t\ttype: 'not implemented',\n\t\t\t\t\tguid: _attributes.id\n\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( geometry ) {\n\n\t\t\tattributes = extractProperties( _attributes );\n\t\t\tattributes.geometry = extractProperties( _geometry );\n\n\t\t\tif ( _attributes.groupCount > 0 ) {\n\n\t\t\t\tattributes.groupIds = _attributes.getGroupList();\n\n\t\t\t}\n\n\t\t\tif ( _attributes.userStringCount > 0 ) {\n\n\t\t\t\tattributes.userStrings = _attributes.getUserStrings();\n\n\t\t\t}\n\n\t\t\tif ( _geometry.userStringCount > 0 ) {\n\n\t\t\t\tattributes.geometry.userStrings = _geometry.getUserStrings();\n\n\t\t\t}\n\n\t\t\tif ( _attributes.decals().count > 0 ) {\n\n\t\t\t\tself.postMessage( { type: 'warning', id: taskID, data: {\n\t\t\t\t\tmessage: 'THREE.3DMLoader: No conversion exists for the decals associated with this object.',\n\t\t\t\t\ttype: 'no conversion',\n\t\t\t\t\tguid: _attributes.id\n\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tattributes.drawColor = _attributes.drawColor( doc );\n\n\t\t\tobjectType = objectType.constructor.name;\n\t\t\tobjectType = objectType.substring( 11, objectType.length );\n\n\t\t\treturn { geometry, attributes, objectType };\n\n\t\t} else {\n\n\t\t\tself.postMessage( { type: 'warning', id: taskID, data: {\n\t\t\t\tmessage: `THREE.3DMLoader: ${objectType.constructor.name} has no associated mesh geometry.`,\n\t\t\t\ttype: 'missing mesh',\n\t\t\t\tguid: _attributes.id\n\t\t\t}\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\tfunction extractProperties( object ) {\n\n\t\tconst result = {};\n\n\t\tfor ( const property in object ) {\n\n\t\t\tconst value = object[ property ];\n\n\t\t\tif ( typeof value !== 'function' ) {\n\n\t\t\t\tif ( typeof value === 'object' && value !== null && value.hasOwnProperty( 'constructor' ) ) {\n\n\t\t\t\t\tresult[ property ] = { name: value.constructor.name, value: value.value };\n\n\t\t\t\t} else if ( typeof value === 'object' && value !== null ) {\n\n\t\t\t\t\tresult[ property ] = extractProperties( value );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tresult[ property ] = value;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// these are functions that could be called to extract more data.\n\t\t\t\t//console.log( `${property}: ${object[ property ].constructor.name}` );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tfunction curveToPoints( curve, pointLimit ) {\n\n\t\tlet pointCount = pointLimit;\n\t\tlet rc = [];\n\t\tconst ts = [];\n\n\t\tif ( curve instanceof rhino.LineCurve ) {\n\n\t\t\treturn [ curve.pointAtStart, curve.pointAtEnd ];\n\n\t\t}\n\n\t\tif ( curve instanceof rhino.PolylineCurve ) {\n\n\t\t\tpointCount = curve.pointCount;\n\t\t\tfor ( let i = 0; i < pointCount; i ++ ) {\n\n\t\t\t\trc.push( curve.point( i ) );\n\n\t\t\t}\n\n\t\t\treturn rc;\n\n\t\t}\n\n\t\tif ( curve instanceof rhino.PolyCurve ) {\n\n\t\t\tconst segmentCount = curve.segmentCount;\n\n\t\t\tfor ( let i = 0; i < segmentCount; i ++ ) {\n\n\t\t\t\tconst segment = curve.segmentCurve( i );\n\t\t\t\tconst segmentArray = curveToPoints( segment, pointCount );\n\t\t\t\trc = rc.concat( segmentArray );\n\t\t\t\tsegment.delete();\n\n\t\t\t}\n\n\t\t\treturn rc;\n\n\t\t}\n\n\t\tif ( curve instanceof rhino.ArcCurve ) {\n\n\t\t\tpointCount = Math.floor( curve.angleDegrees / 5 );\n\t\t\tpointCount = pointCount < 2 ? 2 : pointCount;\n\t\t\t// alternative to this hardcoded version: https://stackoverflow.com/a/18499923/2179399\n\n\t\t}\n\n\t\tif ( curve instanceof rhino.NurbsCurve && curve.degree === 1 ) {\n\n\t\t\tconst pLine = curve.tryGetPolyline();\n\n\t\t\tfor ( let i = 0; i < pLine.count; i ++ ) {\n\n\t\t\t\trc.push( pLine.get( i ) );\n\n\t\t\t}\n\n\t\t\tpLine.delete();\n\n\t\t\treturn rc;\n\n\t\t}\n\n\t\tconst domain = curve.domain;\n\t\tconst divisions = pointCount - 1.0;\n\n\t\tfor ( let j = 0; j < pointCount; j ++ ) {\n\n\t\t\tconst t = domain[ 0 ] + ( j / divisions ) * ( domain[ 1 ] - domain[ 0 ] );\n\n\t\t\tif ( t === domain[ 0 ] || t === domain[ 1 ] ) {\n\n\t\t\t\tts.push( t );\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst tan = curve.tangentAt( t );\n\t\t\tconst prevTan = curve.tangentAt( ts.slice( - 1 )[ 0 ] );\n\n\t\t\t// Duplicated from THREE.Vector3\n\t\t\t// How to pass imports to worker?\n\n\t\t\tconst tS = tan[ 0 ] * tan[ 0 ] + tan[ 1 ] * tan[ 1 ] + tan[ 2 ] * tan[ 2 ];\n\t\t\tconst ptS = prevTan[ 0 ] * prevTan[ 0 ] + prevTan[ 1 ] * prevTan[ 1 ] + prevTan[ 2 ] * prevTan[ 2 ];\n\n\t\t\tconst denominator = Math.sqrt( tS * ptS );\n\n\t\t\tlet angle;\n\n\t\t\tif ( denominator === 0 ) {\n\n\t\t\t\tangle = Math.PI / 2;\n\n\t\t\t} else {\n\n\t\t\t\tconst theta = ( tan.x * prevTan.x + tan.y * prevTan.y + tan.z * prevTan.z ) / denominator;\n\t\t\t\tangle = Math.acos( Math.max( - 1, Math.min( 1, theta ) ) );\n\n\t\t\t}\n\n\t\t\tif ( angle < 0.1 ) continue;\n\n\t\t\tts.push( t );\n\n\t\t}\n\n\t\trc = ts.map( t => curve.pointAt( t ) );\n\t\treturn rc;\n\n\t}\n\n}\n\nexport { Rhino3dmLoader };\n", "import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tClampToEdgeWrapping,\n\tColor,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tGroup,\n\tLinearFilter,\n\tLinearMipmapLinearFilter,\n\tLoader,\n\tMatrix4,\n\tMesh,\n\tMeshPhongMaterial,\n\tMeshStandardMaterial,\n\tMirroredRepeatWrapping,\n\tNearestFilter,\n\tRepeatWrapping,\n\tTextureLoader,\n\tSRGBColorSpace\n} from 'three';\nimport * as fflate from '../libs/fflate.module.js';\n\nconst COLOR_SPACE_3MF = SRGBColorSpace;\n\n/**\n * A loader for the [3D Manufacturing Format (3MF)](https://3mf.io/specification/) format.\n *\n * The following features from the core specification are supported:\n *\n * - 3D Models\n * - Object Resources (Meshes and Components)\n * - Material Resources (Base Materials)\n *\n * 3MF Materials and Properties Extension are only partially supported.\n *\n * - Texture 2D\n * - Texture 2D Groups\n * - Color Groups (Vertex Colors)\n * - Metallic Display Properties (PBR)\n *\n * ```js\n * const loader = new ThreeMFLoader();\n *\n * const object = await loader.loadAsync( './models/3mf/truck.3mf' );\n * object.rotation.set( - Math.PI / 2, 0, 0 ); // z-up conversion\n * scene.add( object );\n * ```\n *\n * @augments Loader\n * @three_import import { ThreeMFLoader } from 'three/addons/loaders/3MFLoader.js';\n */\nclass ThreeMFLoader extends Loader {\n\n\t/**\n\t * Constructs a new 3MF loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * An array of available extensions.\n\t\t *\n\t\t * @type {Array<Object>}\n\t\t */\n\t\tthis.availableExtensions = [];\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded 3MF asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Group)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( buffer ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given 3MF data and returns the resulting group.\n\t *\n\t * @param {ArrayBuffer} data - The raw 3MF asset data as an array buffer.\n\t * @return {Group} A group representing the parsed asset.\n\t */\n\tparse( data ) {\n\n\t\tconst scope = this;\n\t\tconst textureLoader = new TextureLoader( this.manager );\n\n\t\tfunction loadDocument( data ) {\n\n\t\t\tlet zip = null;\n\t\t\tlet file = null;\n\n\t\t\tlet relsName;\n\t\t\tlet modelRelsName;\n\t\t\tconst modelPartNames = [];\n\t\t\tconst texturesPartNames = [];\n\n\t\t\tlet modelRels;\n\t\t\tconst modelParts = {};\n\t\t\tconst printTicketParts = {};\n\t\t\tconst texturesParts = {};\n\n\t\t\tconst textDecoder = new TextDecoder();\n\n\t\t\ttry {\n\n\t\t\t\tzip = fflate.unzipSync( new Uint8Array( data ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( e instanceof ReferenceError ) {\n\n\t\t\t\t\tconsole.error( 'THREE.3MFLoader: fflate missing and file is compressed.' );\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlet rootModelFile = null;\n\n\t\t\tfor ( file in zip ) {\n\n\t\t\t\tif ( file.match( /\\_rels\\/.rels$/ ) ) {\n\n\t\t\t\t\trelsName = file;\n\n\t\t\t\t} else if ( file.match( /3D\\/_rels\\/.*\\.model\\.rels$/ ) ) {\n\n\t\t\t\t\tmodelRelsName = file;\n\n\t\t\t\t} else if ( file.match( /^3D\\/[^\\/]*\\.model$/ ) ) {\n\n\t\t\t\t\trootModelFile = file;\n\n\t\t\t\t} else if ( file.match( /^3D\\/.*\\/.*\\.model$/ ) ) {\n\n\t\t\t\t\tmodelPartNames.push( file ); // sub models\n\n\t\t\t\t} else if ( file.match( /^3D\\/Textures?\\/.*/ ) ) {\n\n\t\t\t\t\ttexturesPartNames.push( file );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tmodelPartNames.push( rootModelFile ); // push root model at the end so it is processed after the sub models\n\n\t\t\tif ( relsName === undefined ) throw new Error( 'THREE.ThreeMFLoader: Cannot find relationship file `rels` in 3MF archive.' );\n\n\t\t\t//\n\n\t\t\tconst relsView = zip[ relsName ];\n\t\t\tconst relsFileText = textDecoder.decode( relsView );\n\t\t\tconst rels = parseRelsXml( relsFileText );\n\n\t\t\t//\n\n\t\t\tif ( modelRelsName ) {\n\n\t\t\t\tconst relsView = zip[ modelRelsName ];\n\t\t\t\tconst relsFileText = textDecoder.decode( relsView );\n\t\t\t\tmodelRels = parseRelsXml( relsFileText );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tfor ( let i = 0; i < modelPartNames.length; i ++ ) {\n\n\t\t\t\tconst modelPart = modelPartNames[ i ];\n\t\t\t\tconst view = zip[ modelPart ];\n\n\t\t\t\tconst fileText = textDecoder.decode( view );\n\t\t\t\tconst xmlData = new DOMParser().parseFromString( fileText, 'application/xml' );\n\n\t\t\t\tif ( xmlData.documentElement.nodeName.toLowerCase() !== 'model' ) {\n\n\t\t\t\t\tconsole.error( 'THREE.3MFLoader: Error loading 3MF - no 3MF document found: ', modelPart );\n\n\t\t\t\t}\n\n\t\t\t\tconst modelNode = xmlData.querySelector( 'model' );\n\t\t\t\tconst extensions = {};\n\n\t\t\t\tfor ( let i = 0; i < modelNode.attributes.length; i ++ ) {\n\n\t\t\t\t\tconst attr = modelNode.attributes[ i ];\n\t\t\t\t\tif ( attr.name.match( /^xmlns:(.+)$/ ) ) {\n\n\t\t\t\t\t\textensions[ attr.value ] = RegExp.$1;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst modelData = parseModelNode( modelNode );\n\t\t\t\tmodelData[ 'xml' ] = modelNode;\n\n\t\t\t\tif ( 0 < Object.keys( extensions ).length ) {\n\n\t\t\t\t\tmodelData[ 'extensions' ] = extensions;\n\n\t\t\t\t}\n\n\t\t\t\tmodelParts[ modelPart ] = modelData;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tfor ( let i = 0; i < texturesPartNames.length; i ++ ) {\n\n\t\t\t\tconst texturesPartName = texturesPartNames[ i ];\n\t\t\t\ttexturesParts[ texturesPartName ] = zip[ texturesPartName ].buffer;\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\trels: rels,\n\t\t\t\tmodelRels: modelRels,\n\t\t\t\tmodel: modelParts,\n\t\t\t\tprintTicket: printTicketParts,\n\t\t\t\ttexture: texturesParts\n\t\t\t};\n\n\t\t}\n\n\t\tfunction parseRelsXml( relsFileText ) {\n\n\t\t\tconst relationships = [];\n\n\t\t\tconst relsXmlData = new DOMParser().parseFromString( relsFileText, 'application/xml' );\n\n\t\t\tconst relsNodes = relsXmlData.querySelectorAll( 'Relationship' );\n\n\t\t\tfor ( let i = 0; i < relsNodes.length; i ++ ) {\n\n\t\t\t\tconst relsNode = relsNodes[ i ];\n\n\t\t\t\tconst relationship = {\n\t\t\t\t\ttarget: relsNode.getAttribute( 'Target' ), //required\n\t\t\t\t\tid: relsNode.getAttribute( 'Id' ), //required\n\t\t\t\t\ttype: relsNode.getAttribute( 'Type' ) //required\n\t\t\t\t};\n\n\t\t\t\trelationships.push( relationship );\n\n\t\t\t}\n\n\t\t\treturn relationships;\n\n\t\t}\n\n\t\tfunction parseMetadataNodes( metadataNodes ) {\n\n\t\t\tconst metadataData = {};\n\n\t\t\tfor ( let i = 0; i < metadataNodes.length; i ++ ) {\n\n\t\t\t\tconst metadataNode = metadataNodes[ i ];\n\t\t\t\tconst name = metadataNode.getAttribute( 'name' );\n\t\t\t\tconst validNames = [\n\t\t\t\t\t'Title',\n\t\t\t\t\t'Designer',\n\t\t\t\t\t'Description',\n\t\t\t\t\t'Copyright',\n\t\t\t\t\t'LicenseTerms',\n\t\t\t\t\t'Rating',\n\t\t\t\t\t'CreationDate',\n\t\t\t\t\t'ModificationDate'\n\t\t\t\t];\n\n\t\t\t\tif ( 0 <= validNames.indexOf( name ) ) {\n\n\t\t\t\t\tmetadataData[ name ] = metadataNode.textContent;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn metadataData;\n\n\t\t}\n\n\t\tfunction parseBasematerialsNode( basematerialsNode ) {\n\n\t\t\tconst basematerialsData = {\n\t\t\t\tid: basematerialsNode.getAttribute( 'id' ), // required\n\t\t\t\tbasematerials: []\n\t\t\t};\n\n\t\t\tconst basematerialNodes = basematerialsNode.querySelectorAll( 'base' );\n\n\t\t\tfor ( let i = 0; i < basematerialNodes.length; i ++ ) {\n\n\t\t\t\tconst basematerialNode = basematerialNodes[ i ];\n\t\t\t\tconst basematerialData = parseBasematerialNode( basematerialNode );\n\t\t\t\tbasematerialData.index = i; // the order and count of the material nodes form an implicit 0-based index\n\t\t\t\tbasematerialsData.basematerials.push( basematerialData );\n\n\t\t\t}\n\n\t\t\treturn basematerialsData;\n\n\t\t}\n\n\t\tfunction parseTexture2DNode( texture2DNode ) {\n\n\t\t\tconst texture2dData = {\n\t\t\t\tid: texture2DNode.getAttribute( 'id' ), // required\n\t\t\t\tpath: texture2DNode.getAttribute( 'path' ), // required\n\t\t\t\tcontenttype: texture2DNode.getAttribute( 'contenttype' ), // required\n\t\t\t\ttilestyleu: texture2DNode.getAttribute( 'tilestyleu' ),\n\t\t\t\ttilestylev: texture2DNode.getAttribute( 'tilestylev' ),\n\t\t\t\tfilter: texture2DNode.getAttribute( 'filter' ),\n\t\t\t};\n\n\t\t\treturn texture2dData;\n\n\t\t}\n\n\t\tfunction parseTextures2DGroupNode( texture2DGroupNode ) {\n\n\t\t\tconst texture2DGroupData = {\n\t\t\t\tid: texture2DGroupNode.getAttribute( 'id' ), // required\n\t\t\t\ttexid: texture2DGroupNode.getAttribute( 'texid' ), // required\n\t\t\t\tdisplaypropertiesid: texture2DGroupNode.getAttribute( 'displaypropertiesid' )\n\t\t\t};\n\n\t\t\tconst tex2coordNodes = texture2DGroupNode.querySelectorAll( 'tex2coord' );\n\n\t\t\tconst uvs = [];\n\n\t\t\tfor ( let i = 0; i < tex2coordNodes.length; i ++ ) {\n\n\t\t\t\tconst tex2coordNode = tex2coordNodes[ i ];\n\t\t\t\tconst u = tex2coordNode.getAttribute( 'u' );\n\t\t\t\tconst v = tex2coordNode.getAttribute( 'v' );\n\n\t\t\t\tuvs.push( parseFloat( u ), parseFloat( v ) );\n\n\t\t\t}\n\n\t\t\ttexture2DGroupData[ 'uvs' ] = new Float32Array( uvs );\n\n\t\t\treturn texture2DGroupData;\n\n\t\t}\n\n\t\tfunction parseColorGroupNode( colorGroupNode ) {\n\n\t\t\tconst colorGroupData = {\n\t\t\t\tid: colorGroupNode.getAttribute( 'id' ), // required\n\t\t\t\tdisplaypropertiesid: colorGroupNode.getAttribute( 'displaypropertiesid' )\n\t\t\t};\n\n\t\t\tconst colorNodes = colorGroupNode.querySelectorAll( 'color' );\n\n\t\t\tconst colors = [];\n\t\t\tconst colorObject = new Color();\n\n\t\t\tfor ( let i = 0; i < colorNodes.length; i ++ ) {\n\n\t\t\t\tconst colorNode = colorNodes[ i ];\n\t\t\t\tconst color = colorNode.getAttribute( 'color' );\n\n\t\t\t\tcolorObject.setStyle( color.substring( 0, 7 ), COLOR_SPACE_3MF );\n\n\t\t\t\tcolors.push( colorObject.r, colorObject.g, colorObject.b );\n\n\t\t\t}\n\n\t\t\tcolorGroupData[ 'colors' ] = new Float32Array( colors );\n\n\t\t\treturn colorGroupData;\n\n\t\t}\n\n\t\tfunction parseImplicitIONode( implicitIONode ) {\n\n\t\t\tconst portNodes = implicitIONode.children;\n\t\t\tconst portArguments = {};\n\t\t\tfor ( let i = 0; i < portNodes.length; i ++ ) {\n\n\t\t\t\tconst args = { type: portNodes[ i ].nodeName.substring( 2 ) };\n\t\t\t\tfor ( let j = 0; j < portNodes[ i ].attributes.length; j ++ ) {\n\n\t\t\t\t\tconst attrib = portNodes[ i ].attributes[ j ];\n\t\t\t\t\tif ( attrib.specified ) {\n\n\t\t \t\t\t\targs[ attrib.name ] = attrib.value;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tportArguments[ portNodes[ i ].getAttribute( 'identifier' ) ] = args;\n\n\t\t\t}\n\n\t\t\treturn portArguments;\n\n\t\t}\n\n\t\tfunction parseImplicitFunctionNode( implicitFunctionNode ) {\n\n\t\t\tconst implicitFunctionData = {\n\t\t\t\tid: implicitFunctionNode.getAttribute( 'id' ),\n\t\t\t\tdisplayname: implicitFunctionNode.getAttribute( 'displayname' )\n\t\t\t};\n\n\t\t\tconst functionNodes = implicitFunctionNode.children;\n\n\t\t\tconst operations = {};\n\n\t\t\tfor ( let i = 0; i < functionNodes.length; i ++ ) {\n\n\t\t\t\tconst operatorNode = functionNodes[ i ];\n\n\t\t\t\tif ( operatorNode.nodeName === 'i:in' || operatorNode.nodeName === 'i:out' ) {\n\n\t\t\t\t\toperations[ operatorNode.nodeName === 'i:in' ? 'inputs' : 'outputs' ] = parseImplicitIONode( operatorNode );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst inputNodes = operatorNode.children;\n\t\t\t\t\tconst portArguments = { 'op': operatorNode.nodeName.substring( 2 ), 'identifier': operatorNode.getAttribute( 'identifier' ) };\n\t\t\t\t\tfor ( let i = 0; i < inputNodes.length; i ++ ) {\n\n\t\t\t\t\t\tportArguments[ inputNodes[ i ].nodeName.substring( 2 ) ] = parseImplicitIONode( inputNodes[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\toperations[ portArguments[ 'identifier' ] ] = portArguments;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\timplicitFunctionData[ 'operations' ] = operations;\n\n\t\t\treturn implicitFunctionData;\n\n\t\t}\n\n\t\tfunction parseMetallicDisplaypropertiesNode( metallicDisplaypropetiesNode ) {\n\n\t\t\tconst metallicDisplaypropertiesData = {\n\t\t\t\tid: metallicDisplaypropetiesNode.getAttribute( 'id' ) // required\n\t\t\t};\n\n\t\t\tconst metallicNodes = metallicDisplaypropetiesNode.querySelectorAll( 'pbmetallic' );\n\n\t\t\tconst metallicData = [];\n\n\t\t\tfor ( let i = 0; i < metallicNodes.length; i ++ ) {\n\n\t\t\t\tconst metallicNode = metallicNodes[ i ];\n\n\t\t\t\tmetallicData.push( {\n\t\t\t\t\tname: metallicNode.getAttribute( 'name' ), // required\n\t\t\t\t\tmetallicness: parseFloat( metallicNode.getAttribute( 'metallicness' ) ), // required\n\t\t\t\t\troughness: parseFloat( metallicNode.getAttribute( 'roughness' ) ) // required\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tmetallicDisplaypropertiesData.data = metallicData;\n\n\t\t\treturn metallicDisplaypropertiesData;\n\n\t\t}\n\n\t\tfunction parseBasematerialNode( basematerialNode ) {\n\n\t\t\tconst basematerialData = {};\n\n\t\t\tbasematerialData[ 'name' ] = basematerialNode.getAttribute( 'name' ); // required\n\t\t\tbasematerialData[ 'displaycolor' ] = basematerialNode.getAttribute( 'displaycolor' ); // required\n\t\t\tbasematerialData[ 'displaypropertiesid' ] = basematerialNode.getAttribute( 'displaypropertiesid' );\n\n\t\t\treturn basematerialData;\n\n\t\t}\n\n\t\tfunction parseMeshNode( meshNode ) {\n\n\t\t\tconst meshData = {};\n\n\t\t\tconst vertices = [];\n\t\t\tconst vertexNodes = meshNode.querySelectorAll( 'vertices vertex' );\n\n\t\t\tfor ( let i = 0; i < vertexNodes.length; i ++ ) {\n\n\t\t\t\tconst vertexNode = vertexNodes[ i ];\n\t\t\t\tconst x = vertexNode.getAttribute( 'x' );\n\t\t\t\tconst y = vertexNode.getAttribute( 'y' );\n\t\t\t\tconst z = vertexNode.getAttribute( 'z' );\n\n\t\t\t\tvertices.push( parseFloat( x ), parseFloat( y ), parseFloat( z ) );\n\n\t\t\t}\n\n\t\t\tmeshData[ 'vertices' ] = new Float32Array( vertices );\n\n\t\t\tconst triangleProperties = [];\n\t\t\tconst triangles = [];\n\t\t\tconst triangleNodes = meshNode.querySelectorAll( 'triangles triangle' );\n\n\t\t\tfor ( let i = 0; i < triangleNodes.length; i ++ ) {\n\n\t\t\t\tconst triangleNode = triangleNodes[ i ];\n\t\t\t\tconst v1 = triangleNode.getAttribute( 'v1' );\n\t\t\t\tconst v2 = triangleNode.getAttribute( 'v2' );\n\t\t\t\tconst v3 = triangleNode.getAttribute( 'v3' );\n\t\t\t\tconst p1 = triangleNode.getAttribute( 'p1' );\n\t\t\t\tconst p2 = triangleNode.getAttribute( 'p2' );\n\t\t\t\tconst p3 = triangleNode.getAttribute( 'p3' );\n\t\t\t\tconst pid = triangleNode.getAttribute( 'pid' );\n\n\t\t\t\tconst triangleProperty = {};\n\n\t\t\t\ttriangleProperty[ 'v1' ] = parseInt( v1, 10 );\n\t\t\t\ttriangleProperty[ 'v2' ] = parseInt( v2, 10 );\n\t\t\t\ttriangleProperty[ 'v3' ] = parseInt( v3, 10 );\n\n\t\t\t\ttriangles.push( triangleProperty[ 'v1' ], triangleProperty[ 'v2' ], triangleProperty[ 'v3' ] );\n\n\t\t\t\t// optional\n\n\t\t\t\tif ( p1 ) {\n\n\t\t\t\t\ttriangleProperty[ 'p1' ] = parseInt( p1, 10 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( p2 ) {\n\n\t\t\t\t\ttriangleProperty[ 'p2' ] = parseInt( p2, 10 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( p3 ) {\n\n\t\t\t\t\ttriangleProperty[ 'p3' ] = parseInt( p3, 10 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( pid ) {\n\n\t\t\t\t\ttriangleProperty[ 'pid' ] = pid;\n\n\t\t\t\t}\n\n\t\t\t\tif ( 0 < Object.keys( triangleProperty ).length ) {\n\n\t\t\t\t\ttriangleProperties.push( triangleProperty );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tmeshData[ 'triangleProperties' ] = triangleProperties;\n\t\t\tmeshData[ 'triangles' ] = new Uint32Array( triangles );\n\n\t\t\treturn meshData;\n\n\t\t}\n\n\t\tfunction parseComponentsNode( componentsNode ) {\n\n\t\t\tconst components = [];\n\n\t\t\tconst componentNodes = componentsNode.querySelectorAll( 'component' );\n\n\t\t\tfor ( let i = 0; i < componentNodes.length; i ++ ) {\n\n\t\t\t\tconst componentNode = componentNodes[ i ];\n\t\t\t\tconst componentData = parseComponentNode( componentNode );\n\t\t\t\tcomponents.push( componentData );\n\n\t\t\t}\n\n\t\t\treturn components;\n\n\t\t}\n\n\t\tfunction parseComponentNode( componentNode ) {\n\n\t\t\tconst componentData = {};\n\n\t\t\tcomponentData[ 'objectId' ] = componentNode.getAttribute( 'objectid' ); // required\n\n\t\t\tconst transform = componentNode.getAttribute( 'transform' );\n\n\t\t\tif ( transform ) {\n\n\t\t\t\tcomponentData[ 'transform' ] = parseTransform( transform );\n\n\t\t\t}\n\n\t\t\treturn componentData;\n\n\t\t}\n\n\t\tfunction parseTransform( transform ) {\n\n\t\t\tconst t = [];\n\t\t\ttransform.split( ' ' ).forEach( function ( s ) {\n\n\t\t\t\tt.push( parseFloat( s ) );\n\n\t\t\t} );\n\n\t\t\tconst matrix = new Matrix4();\n\t\t\tmatrix.set(\n\t\t\t\tt[ 0 ], t[ 3 ], t[ 6 ], t[ 9 ],\n\t\t\t\tt[ 1 ], t[ 4 ], t[ 7 ], t[ 10 ],\n\t\t\t\tt[ 2 ], t[ 5 ], t[ 8 ], t[ 11 ],\n\t\t\t\t 0.0, 0.0, 0.0, 1.0\n\t\t\t);\n\n\t\t\treturn matrix;\n\n\t\t}\n\n\t\tfunction parseObjectNode( objectNode ) {\n\n\t\t\tconst objectData = {\n\t\t\t\ttype: objectNode.getAttribute( 'type' )\n\t\t\t};\n\n\t\t\tconst id = objectNode.getAttribute( 'id' );\n\n\t\t\tif ( id ) {\n\n\t\t\t\tobjectData[ 'id' ] = id;\n\n\t\t\t}\n\n\t\t\tconst pid = objectNode.getAttribute( 'pid' );\n\n\t\t\tif ( pid ) {\n\n\t\t\t\tobjectData[ 'pid' ] = pid;\n\n\t\t\t}\n\n\t\t\tconst pindex = objectNode.getAttribute( 'pindex' );\n\n\t\t\tif ( pindex ) {\n\n\t\t\t\tobjectData[ 'pindex' ] = pindex;\n\n\t\t\t}\n\n\t\t\tconst thumbnail = objectNode.getAttribute( 'thumbnail' );\n\n\t\t\tif ( thumbnail ) {\n\n\t\t\t\tobjectData[ 'thumbnail' ] = thumbnail;\n\n\t\t\t}\n\n\t\t\tconst partnumber = objectNode.getAttribute( 'partnumber' );\n\n\t\t\tif ( partnumber ) {\n\n\t\t\t\tobjectData[ 'partnumber' ] = partnumber;\n\n\t\t\t}\n\n\t\t\tconst name = objectNode.getAttribute( 'name' );\n\n\t\t\tif ( name ) {\n\n\t\t\t\tobjectData[ 'name' ] = name;\n\n\t\t\t}\n\n\t\t\tconst meshNode = objectNode.querySelector( 'mesh' );\n\n\t\t\tif ( meshNode ) {\n\n\t\t\t\tobjectData[ 'mesh' ] = parseMeshNode( meshNode );\n\n\t\t\t}\n\n\t\t\tconst componentsNode = objectNode.querySelector( 'components' );\n\n\t\t\tif ( componentsNode ) {\n\n\t\t\t\tobjectData[ 'components' ] = parseComponentsNode( componentsNode );\n\n\t\t\t}\n\n\t\t\treturn objectData;\n\n\t\t}\n\n\t\tfunction parseResourcesNode( resourcesNode ) {\n\n\t\t\tconst resourcesData = {};\n\n\t\t\tresourcesData[ 'basematerials' ] = {};\n\t\t\tconst basematerialsNodes = resourcesNode.querySelectorAll( 'basematerials' );\n\n\t\t\tfor ( let i = 0; i < basematerialsNodes.length; i ++ ) {\n\n\t\t\t\tconst basematerialsNode = basematerialsNodes[ i ];\n\t\t\t\tconst basematerialsData = parseBasematerialsNode( basematerialsNode );\n\t\t\t\tresourcesData[ 'basematerials' ][ basematerialsData[ 'id' ] ] = basematerialsData;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tresourcesData[ 'texture2d' ] = {};\n\t\t\tconst textures2DNodes = resourcesNode.querySelectorAll( 'texture2d' );\n\n\t\t\tfor ( let i = 0; i < textures2DNodes.length; i ++ ) {\n\n\t\t\t\tconst textures2DNode = textures2DNodes[ i ];\n\t\t\t\tconst texture2DData = parseTexture2DNode( textures2DNode );\n\t\t\t\tresourcesData[ 'texture2d' ][ texture2DData[ 'id' ] ] = texture2DData;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tresourcesData[ 'colorgroup' ] = {};\n\t\t\tconst colorGroupNodes = resourcesNode.querySelectorAll( 'colorgroup' );\n\n\t\t\tfor ( let i = 0; i < colorGroupNodes.length; i ++ ) {\n\n\t\t\t\tconst colorGroupNode = colorGroupNodes[ i ];\n\t\t\t\tconst colorGroupData = parseColorGroupNode( colorGroupNode );\n\t\t\t\tresourcesData[ 'colorgroup' ][ colorGroupData[ 'id' ] ] = colorGroupData;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tconst implicitFunctionNodes = resourcesNode.querySelectorAll( 'implicitfunction' );\n\n\t\t\tif ( implicitFunctionNodes.length > 0 ) {\n\n\t\t\t\tresourcesData[ 'implicitfunction' ] = {};\n\n\t\t\t}\n\n\n\t\t\tfor ( let i = 0; i < implicitFunctionNodes.length; i ++ ) {\n\n\t\t\t\tconst implicitFunctionNode = implicitFunctionNodes[ i ];\n\t\t\t\tconst implicitFunctionData = parseImplicitFunctionNode( implicitFunctionNode );\n\t\t\t\tresourcesData[ 'implicitfunction' ][ implicitFunctionData[ 'id' ] ] = implicitFunctionData;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tresourcesData[ 'pbmetallicdisplayproperties' ] = {};\n\t\t\tconst pbmetallicdisplaypropertiesNodes = resourcesNode.querySelectorAll( 'pbmetallicdisplayproperties' );\n\n\t\t\tfor ( let i = 0; i < pbmetallicdisplaypropertiesNodes.length; i ++ ) {\n\n\t\t\t\tconst pbmetallicdisplaypropertiesNode = pbmetallicdisplaypropertiesNodes[ i ];\n\t\t\t\tconst pbmetallicdisplaypropertiesData = parseMetallicDisplaypropertiesNode( pbmetallicdisplaypropertiesNode );\n\t\t\t\tresourcesData[ 'pbmetallicdisplayproperties' ][ pbmetallicdisplaypropertiesData[ 'id' ] ] = pbmetallicdisplaypropertiesData;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tresourcesData[ 'texture2dgroup' ] = {};\n\t\t\tconst textures2DGroupNodes = resourcesNode.querySelectorAll( 'texture2dgroup' );\n\n\t\t\tfor ( let i = 0; i < textures2DGroupNodes.length; i ++ ) {\n\n\t\t\t\tconst textures2DGroupNode = textures2DGroupNodes[ i ];\n\t\t\t\tconst textures2DGroupData = parseTextures2DGroupNode( textures2DGroupNode );\n\t\t\t\tresourcesData[ 'texture2dgroup' ][ textures2DGroupData[ 'id' ] ] = textures2DGroupData;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tresourcesData[ 'object' ] = {};\n\t\t\tconst objectNodes = resourcesNode.querySelectorAll( 'object' );\n\n\t\t\tfor ( let i = 0; i < objectNodes.length; i ++ ) {\n\n\t\t\t\tconst objectNode = objectNodes[ i ];\n\t\t\t\tconst objectData = parseObjectNode( objectNode );\n\t\t\t\tresourcesData[ 'object' ][ objectData[ 'id' ] ] = objectData;\n\n\t\t\t}\n\n\t\t\treturn resourcesData;\n\n\t\t}\n\n\t\tfunction parseBuildNode( buildNode ) {\n\n\t\t\tconst buildData = [];\n\t\t\tconst itemNodes = buildNode.querySelectorAll( 'item' );\n\n\t\t\tfor ( let i = 0; i < itemNodes.length; i ++ ) {\n\n\t\t\t\tconst itemNode = itemNodes[ i ];\n\t\t\t\tconst buildItem = {\n\t\t\t\t\tobjectId: itemNode.getAttribute( 'objectid' )\n\t\t\t\t};\n\t\t\t\tconst transform = itemNode.getAttribute( 'transform' );\n\n\t\t\t\tif ( transform ) {\n\n\t\t\t\t\tbuildItem[ 'transform' ] = parseTransform( transform );\n\n\t\t\t\t}\n\n\t\t\t\tbuildData.push( buildItem );\n\n\t\t\t}\n\n\t\t\treturn buildData;\n\n\t\t}\n\n\t\tfunction parseModelNode( modelNode ) {\n\n\t\t\tconst modelData = { unit: modelNode.getAttribute( 'unit' ) || 'millimeter' };\n\t\t\tconst metadataNodes = modelNode.querySelectorAll( 'metadata' );\n\n\t\t\tif ( metadataNodes ) {\n\n\t\t\t\tmodelData[ 'metadata' ] = parseMetadataNodes( metadataNodes );\n\n\t\t\t}\n\n\t\t\tconst resourcesNode = modelNode.querySelector( 'resources' );\n\n\t\t\tif ( resourcesNode ) {\n\n\t\t\t\tmodelData[ 'resources' ] = parseResourcesNode( resourcesNode );\n\n\t\t\t}\n\n\t\t\tconst buildNode = modelNode.querySelector( 'build' );\n\n\t\t\tif ( buildNode ) {\n\n\t\t\t\tmodelData[ 'build' ] = parseBuildNode( buildNode );\n\n\t\t\t}\n\n\t\t\treturn modelData;\n\n\t\t}\n\n\t\tfunction buildTexture( texture2dgroup, objects, modelData, textureData ) {\n\n\t\t\tconst texid = texture2dgroup.texid;\n\t\t\tconst texture2ds = modelData.resources.texture2d;\n\t\t\tconst texture2d = texture2ds[ texid ];\n\n\t\t\tif ( texture2d ) {\n\n\t\t\t\tconst data = textureData[ texture2d.path ];\n\t\t\t\tconst type = texture2d.contenttype;\n\n\t\t\t\tconst blob = new Blob( [ data ], { type: type } );\n\t\t\t\tconst sourceURI = URL.createObjectURL( blob );\n\n\t\t\t\tconst texture = textureLoader.load( sourceURI, function () {\n\n\t\t\t\t\tURL.revokeObjectURL( sourceURI );\n\n\t\t\t\t} );\n\n\t\t\t\ttexture.colorSpace = COLOR_SPACE_3MF;\n\n\t\t\t\t// texture parameters\n\n\t\t\t\tswitch ( texture2d.tilestyleu ) {\n\n\t\t\t\t\tcase 'wrap':\n\t\t\t\t\t\ttexture.wrapS = RepeatWrapping;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'mirror':\n\t\t\t\t\t\ttexture.wrapS = MirroredRepeatWrapping;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'none':\n\t\t\t\t\tcase 'clamp':\n\t\t\t\t\t\ttexture.wrapS = ClampToEdgeWrapping;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\ttexture.wrapS = RepeatWrapping;\n\n\t\t\t\t}\n\n\t\t\t\tswitch ( texture2d.tilestylev ) {\n\n\t\t\t\t\tcase 'wrap':\n\t\t\t\t\t\ttexture.wrapT = RepeatWrapping;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'mirror':\n\t\t\t\t\t\ttexture.wrapT = MirroredRepeatWrapping;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'none':\n\t\t\t\t\tcase 'clamp':\n\t\t\t\t\t\ttexture.wrapT = ClampToEdgeWrapping;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\ttexture.wrapT = RepeatWrapping;\n\n\t\t\t\t}\n\n\t\t\t\tswitch ( texture2d.filter ) {\n\n\t\t\t\t\tcase 'auto':\n\t\t\t\t\t\ttexture.magFilter = LinearFilter;\n\t\t\t\t\t\ttexture.minFilter = LinearMipmapLinearFilter;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'linear':\n\t\t\t\t\t\ttexture.magFilter = LinearFilter;\n\t\t\t\t\t\ttexture.minFilter = LinearFilter;\n\t\t\t\t\t\ttexture.generateMipmaps = false;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'nearest':\n\t\t\t\t\t\ttexture.magFilter = NearestFilter;\n\t\t\t\t\t\ttexture.minFilter = NearestFilter;\n\t\t\t\t\t\ttexture.generateMipmaps = false;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\ttexture.magFilter = LinearFilter;\n\t\t\t\t\t\ttexture.minFilter = LinearMipmapLinearFilter;\n\n\t\t\t\t}\n\n\t\t\t\treturn texture;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction buildBasematerialsMeshes( basematerials, triangleProperties, meshData, objects, modelData, textureData, objectData ) {\n\n\t\t\tconst objectPindex = objectData.pindex;\n\n\t\t\tconst materialMap = {};\n\n\t\t\tfor ( let i = 0, l = triangleProperties.length; i < l; i ++ ) {\n\n\t\t\t\tconst triangleProperty = triangleProperties[ i ];\n\t\t\t\tconst pindex = ( triangleProperty.p1 !== undefined ) ? triangleProperty.p1 : objectPindex;\n\n\t\t\t\tif ( materialMap[ pindex ] === undefined ) materialMap[ pindex ] = [];\n\n\t\t\t\tmaterialMap[ pindex ].push( triangleProperty );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tconst keys = Object.keys( materialMap );\n\t\t\tconst meshes = [];\n\n\t\t\tfor ( let i = 0, l = keys.length; i < l; i ++ ) {\n\n\t\t\t\tconst materialIndex = keys[ i ];\n\t\t\t\tconst trianglePropertiesProps = materialMap[ materialIndex ];\n\t\t\t\tconst basematerialData = basematerials.basematerials[ materialIndex ];\n\t\t\t\tconst material = getBuild( basematerialData, objects, modelData, textureData, objectData, buildBasematerial );\n\n\t\t\t\t//\n\n\t\t\t\tconst geometry = new BufferGeometry();\n\n\t\t\t\tconst positionData = [];\n\n\t\t\t\tconst vertices = meshData.vertices;\n\n\t\t\t\tfor ( let j = 0, jl = trianglePropertiesProps.length; j < jl; j ++ ) {\n\n\t\t\t\t\tconst triangleProperty = trianglePropertiesProps[ j ];\n\n\t\t\t\t\tpositionData.push( vertices[ ( triangleProperty.v1 * 3 ) + 0 ] );\n\t\t\t\t\tpositionData.push( vertices[ ( triangleProperty.v1 * 3 ) + 1 ] );\n\t\t\t\t\tpositionData.push( vertices[ ( triangleProperty.v1 * 3 ) + 2 ] );\n\n\t\t\t\t\tpositionData.push( vertices[ ( triangleProperty.v2 * 3 ) + 0 ] );\n\t\t\t\t\tpositionData.push( vertices[ ( triangleProperty.v2 * 3 ) + 1 ] );\n\t\t\t\t\tpositionData.push( vertices[ ( triangleProperty.v2 * 3 ) + 2 ] );\n\n\t\t\t\t\tpositionData.push( vertices[ ( triangleProperty.v3 * 3 ) + 0 ] );\n\t\t\t\t\tpositionData.push( vertices[ ( triangleProperty.v3 * 3 ) + 1 ] );\n\t\t\t\t\tpositionData.push( vertices[ ( triangleProperty.v3 * 3 ) + 2 ] );\n\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positionData, 3 ) );\n\n\t\t\t\t//\n\n\t\t\t\tconst mesh = new Mesh( geometry, material );\n\t\t\t\tmeshes.push( mesh );\n\n\t\t\t}\n\n\t\t\treturn meshes;\n\n\t\t}\n\n\t\tfunction buildTexturedMesh( texture2dgroup, triangleProperties, meshData, objects, modelData, textureData, objectData ) {\n\n\t\t\t// geometry\n\n\t\t\tconst geometry = new BufferGeometry();\n\n\t\t\tconst positionData = [];\n\t\t\tconst uvData = [];\n\n\t\t\tconst vertices = meshData.vertices;\n\t\t\tconst uvs = texture2dgroup.uvs;\n\n\t\t\tfor ( let i = 0, l = triangleProperties.length; i < l; i ++ ) {\n\n\t\t\t\tconst triangleProperty = triangleProperties[ i ];\n\n\t\t\t\tpositionData.push( vertices[ ( triangleProperty.v1 * 3 ) + 0 ] );\n\t\t\t\tpositionData.push( vertices[ ( triangleProperty.v1 * 3 ) + 1 ] );\n\t\t\t\tpositionData.push( vertices[ ( triangleProperty.v1 * 3 ) + 2 ] );\n\n\t\t\t\tpositionData.push( vertices[ ( triangleProperty.v2 * 3 ) + 0 ] );\n\t\t\t\tpositionData.push( vertices[ ( triangleProperty.v2 * 3 ) + 1 ] );\n\t\t\t\tpositionData.push( vertices[ ( triangleProperty.v2 * 3 ) + 2 ] );\n\n\t\t\t\tpositionData.push( vertices[ ( triangleProperty.v3 * 3 ) + 0 ] );\n\t\t\t\tpositionData.push( vertices[ ( triangleProperty.v3 * 3 ) + 1 ] );\n\t\t\t\tpositionData.push( vertices[ ( triangleProperty.v3 * 3 ) + 2 ] );\n\n\t\t\t\t//\n\n\t\t\t\tuvData.push( uvs[ ( triangleProperty.p1 * 2 ) + 0 ] );\n\t\t\t\tuvData.push( uvs[ ( triangleProperty.p1 * 2 ) + 1 ] );\n\n\t\t\t\tuvData.push( uvs[ ( triangleProperty.p2 * 2 ) + 0 ] );\n\t\t\t\tuvData.push( uvs[ ( triangleProperty.p2 * 2 ) + 1 ] );\n\n\t\t\t\tuvData.push( uvs[ ( triangleProperty.p3 * 2 ) + 0 ] );\n\t\t\t\tuvData.push( uvs[ ( triangleProperty.p3 * 2 ) + 1 ] );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positionData, 3 ) );\n\t\t\tgeometry.setAttribute( 'uv', new Float32BufferAttribute( uvData, 2 ) );\n\n\t\t\t// material\n\n\t\t\tconst texture = getBuild( texture2dgroup, objects, modelData, textureData, objectData, buildTexture );\n\n\t\t\tconst material = new MeshPhongMaterial( { map: texture, flatShading: true } );\n\n\t\t\t// mesh\n\n\t\t\tconst mesh = new Mesh( geometry, material );\n\n\t\t\treturn mesh;\n\n\t\t}\n\n\t\tfunction buildVertexColorMesh( colorgroup, triangleProperties, meshData, objectData ) {\n\n\t\t\t// geometry\n\n\t\t\tconst geometry = new BufferGeometry();\n\n\t\t\tconst positionData = [];\n\t\t\tconst colorData = [];\n\n\t\t\tconst vertices = meshData.vertices;\n\t\t\tconst colors = colorgroup.colors;\n\n\t\t\tfor ( let i = 0, l = triangleProperties.length; i < l; i ++ ) {\n\n\t\t\t\tconst triangleProperty = triangleProperties[ i ];\n\n\t\t\t\tconst v1 = triangleProperty.v1;\n\t\t\t\tconst v2 = triangleProperty.v2;\n\t\t\t\tconst v3 = triangleProperty.v3;\n\n\t\t\t\tpositionData.push( vertices[ ( v1 * 3 ) + 0 ] );\n\t\t\t\tpositionData.push( vertices[ ( v1 * 3 ) + 1 ] );\n\t\t\t\tpositionData.push( vertices[ ( v1 * 3 ) + 2 ] );\n\n\t\t\t\tpositionData.push( vertices[ ( v2 * 3 ) + 0 ] );\n\t\t\t\tpositionData.push( vertices[ ( v2 * 3 ) + 1 ] );\n\t\t\t\tpositionData.push( vertices[ ( v2 * 3 ) + 2 ] );\n\n\t\t\t\tpositionData.push( vertices[ ( v3 * 3 ) + 0 ] );\n\t\t\t\tpositionData.push( vertices[ ( v3 * 3 ) + 1 ] );\n\t\t\t\tpositionData.push( vertices[ ( v3 * 3 ) + 2 ] );\n\n\t\t\t\t//\n\n\t\t\t\tconst p1 = ( triangleProperty.p1 !== undefined ) ? triangleProperty.p1 : objectData.pindex;\n\t\t\t\tconst p2 = ( triangleProperty.p2 !== undefined ) ? triangleProperty.p2 : p1;\n\t\t\t\tconst p3 = ( triangleProperty.p3 !== undefined ) ? triangleProperty.p3 : p1;\n\n\t\t\t\tcolorData.push( colors[ ( p1 * 3 ) + 0 ] );\n\t\t\t\tcolorData.push( colors[ ( p1 * 3 ) + 1 ] );\n\t\t\t\tcolorData.push( colors[ ( p1 * 3 ) + 2 ] );\n\n\t\t\t\tcolorData.push( colors[ ( p2 * 3 ) + 0 ] );\n\t\t\t\tcolorData.push( colors[ ( p2 * 3 ) + 1 ] );\n\t\t\t\tcolorData.push( colors[ ( p2 * 3 ) + 2 ] );\n\n\t\t\t\tcolorData.push( colors[ ( p3 * 3 ) + 0 ] );\n\t\t\t\tcolorData.push( colors[ ( p3 * 3 ) + 1 ] );\n\t\t\t\tcolorData.push( colors[ ( p3 * 3 ) + 2 ] );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positionData, 3 ) );\n\t\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colorData, 3 ) );\n\n\t\t\t// material\n\n\t\t\tconst material = new MeshPhongMaterial( { vertexColors: true, flatShading: true } );\n\n\t\t\t// mesh\n\n\t\t\tconst mesh = new Mesh( geometry, material );\n\n\t\t\treturn mesh;\n\n\t\t}\n\n\t\tfunction buildDefaultMesh( meshData ) {\n\n\t\t\tconst geometry = new BufferGeometry();\n\t\t\tgeometry.setIndex( new BufferAttribute( meshData[ 'triangles' ], 1 ) );\n\t\t\tgeometry.setAttribute( 'position', new BufferAttribute( meshData[ 'vertices' ], 3 ) );\n\n\t\t\tconst material = new MeshPhongMaterial( {\n\t\t\t\tname: Loader.DEFAULT_MATERIAL_NAME,\n\t\t\t\tcolor: 0xffffff,\n\t\t\t\tflatShading: true\n\t\t\t} );\n\n\t\t\tconst mesh = new Mesh( geometry, material );\n\n\t\t\treturn mesh;\n\n\t\t}\n\n\t\tfunction buildMeshes( resourceMap, meshData, objects, modelData, textureData, objectData ) {\n\n\t\t\tconst keys = Object.keys( resourceMap );\n\t\t\tconst meshes = [];\n\n\t\t\tfor ( let i = 0, il = keys.length; i < il; i ++ ) {\n\n\t\t\t\tconst resourceId = keys[ i ];\n\t\t\t\tconst triangleProperties = resourceMap[ resourceId ];\n\t\t\t\tconst resourceType = getResourceType( resourceId, modelData );\n\n\t\t\t\tswitch ( resourceType ) {\n\n\t\t\t\t\tcase 'material':\n\t\t\t\t\t\tconst basematerials = modelData.resources.basematerials[ resourceId ];\n\t\t\t\t\t\tconst newMeshes = buildBasematerialsMeshes( basematerials, triangleProperties, meshData, objects, modelData, textureData, objectData );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = newMeshes.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tmeshes.push( newMeshes[ j ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'texture':\n\t\t\t\t\t\tconst texture2dgroup = modelData.resources.texture2dgroup[ resourceId ];\n\t\t\t\t\t\tmeshes.push( buildTexturedMesh( texture2dgroup, triangleProperties, meshData, objects, modelData, textureData, objectData ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'vertexColors':\n\t\t\t\t\t\tconst colorgroup = modelData.resources.colorgroup[ resourceId ];\n\t\t\t\t\t\tmeshes.push( buildVertexColorMesh( colorgroup, triangleProperties, meshData, objectData ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'default':\n\t\t\t\t\t\tmeshes.push( buildDefaultMesh( meshData ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.error( 'THREE.3MFLoader: Unsupported resource type.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( objectData.name ) {\n\n\t\t\t\tfor ( let i = 0; i < meshes.length; i ++ ) {\n\n\t\t\t\t\tmeshes[ i ].name = objectData.name;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn meshes;\n\n\t\t}\n\n\t\tfunction getResourceType( pid, modelData ) {\n\n\t\t\tif ( modelData.resources.texture2dgroup[ pid ] !== undefined ) {\n\n\t\t\t\treturn 'texture';\n\n\t\t\t} else if ( modelData.resources.basematerials[ pid ] !== undefined ) {\n\n\t\t\t\treturn 'material';\n\n\t\t\t} else if ( modelData.resources.colorgroup[ pid ] !== undefined ) {\n\n\t\t\t\treturn 'vertexColors';\n\n\t\t\t} else if ( pid === 'default' ) {\n\n\t\t\t\treturn 'default';\n\n\t\t\t} else {\n\n\t\t\t\treturn undefined;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction analyzeObject( meshData, objectData ) {\n\n\t\t\tconst resourceMap = {};\n\n\t\t\tconst triangleProperties = meshData[ 'triangleProperties' ];\n\n\t\t\tconst objectPid = objectData.pid;\n\n\t\t\tfor ( let i = 0, l = triangleProperties.length; i < l; i ++ ) {\n\n\t\t\t\tconst triangleProperty = triangleProperties[ i ];\n\t\t\t\tlet pid = ( triangleProperty.pid !== undefined ) ? triangleProperty.pid : objectPid;\n\n\t\t\t\tif ( pid === undefined ) pid = 'default';\n\n\t\t\t\tif ( resourceMap[ pid ] === undefined ) resourceMap[ pid ] = [];\n\n\t\t\t\tresourceMap[ pid ].push( triangleProperty );\n\n\t\t\t}\n\n\t\t\treturn resourceMap;\n\n\t\t}\n\n\t\tfunction buildGroup( meshData, objects, modelData, textureData, objectData ) {\n\n\t\t\tconst group = new Group();\n\n\t\t\tconst resourceMap = analyzeObject( meshData, objectData );\n\t\t\tconst meshes = buildMeshes( resourceMap, meshData, objects, modelData, textureData, objectData );\n\n\t\t\tfor ( let i = 0, l = meshes.length; i < l; i ++ ) {\n\n\t\t\t\tgroup.add( meshes[ i ] );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t}\n\n\t\tfunction applyExtensions( extensions, meshData, modelXml ) {\n\n\t\t\tif ( ! extensions ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst availableExtensions = [];\n\t\t\tconst keys = Object.keys( extensions );\n\n\t\t\tfor ( let i = 0; i < keys.length; i ++ ) {\n\n\t\t\t\tconst ns = keys[ i ];\n\n\t\t\t\tfor ( let j = 0; j < scope.availableExtensions.length; j ++ ) {\n\n\t\t\t\t\tconst extension = scope.availableExtensions[ j ];\n\n\t\t\t\t\tif ( extension.ns === ns ) {\n\n\t\t\t\t\t\tavailableExtensions.push( extension );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < availableExtensions.length; i ++ ) {\n\n\t\t\t\tconst extension = availableExtensions[ i ];\n\t\t\t\textension.apply( modelXml, extensions[ extension[ 'ns' ] ], meshData );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getBuild( data, objects, modelData, textureData, objectData, builder ) {\n\n\t\t\tif ( data.build !== undefined ) return data.build;\n\n\t\t\tdata.build = builder( data, objects, modelData, textureData, objectData );\n\n\t\t\treturn data.build;\n\n\t\t}\n\n\t\tfunction buildBasematerial( materialData, objects, modelData ) {\n\n\t\t\tlet material;\n\n\t\t\tconst displaypropertiesid = materialData.displaypropertiesid;\n\t\t\tconst pbmetallicdisplayproperties = modelData.resources.pbmetallicdisplayproperties;\n\n\t\t\tif ( displaypropertiesid !== null && pbmetallicdisplayproperties[ displaypropertiesid ] !== undefined ) {\n\n\t\t\t\t// metallic display property, use StandardMaterial\n\n\t\t\t\tconst pbmetallicdisplayproperty = pbmetallicdisplayproperties[ displaypropertiesid ];\n\t\t\t\tconst metallicData = pbmetallicdisplayproperty.data[ materialData.index ];\n\n\t\t\t\tmaterial = new MeshStandardMaterial( { flatShading: true, roughness: metallicData.roughness, metalness: metallicData.metallicness } );\n\n\t\t\t} else {\n\n\t\t\t\t// otherwise use PhongMaterial\n\n\t\t\t\tmaterial = new MeshPhongMaterial( { flatShading: true } );\n\n\t\t\t}\n\n\t\t\tmaterial.name = materialData.name;\n\n\t\t\t// displaycolor MUST be specified with a value of a 6 or 8 digit hexadecimal number, e.g. \"#RRGGBB\" or \"#RRGGBBAA\"\n\n\t\t\tconst displaycolor = materialData.displaycolor;\n\n\t\t\tconst color = displaycolor.substring( 0, 7 );\n\t\t\tmaterial.color.setStyle( color, COLOR_SPACE_3MF );\n\n\t\t\t// process alpha if set\n\n\t\t\tif ( displaycolor.length === 9 ) {\n\n\t\t\t\tmaterial.opacity = parseInt( displaycolor.charAt( 7 ) + displaycolor.charAt( 8 ), 16 ) / 255;\n\n\t\t\t}\n\n\t\t\treturn material;\n\n\t\t}\n\n\t\tfunction buildComposite( compositeData, objects, modelData, textureData ) {\n\n\t\t\tconst composite = new Group();\n\n\t\t\tfor ( let j = 0; j < compositeData.length; j ++ ) {\n\n\t\t\t\tconst component = compositeData[ j ];\n\t\t\t\tlet build = objects[ component.objectId ];\n\n\t\t\t\tif ( build === undefined ) {\n\n\t\t\t\t\tbuildObject( component.objectId, objects, modelData, textureData );\n\t\t\t\t\tbuild = objects[ component.objectId ];\n\n\t\t\t\t}\n\n\t\t\t\tconst object3D = build.clone();\n\n\t\t\t\t// apply component transform\n\n\t\t\t\tconst transform = component.transform;\n\n\t\t\t\tif ( transform ) {\n\n\t\t\t\t\tobject3D.applyMatrix4( transform );\n\n\t\t\t\t}\n\n\t\t\t\tcomposite.add( object3D );\n\n\t\t\t}\n\n\t\t\treturn composite;\n\n\t\t}\n\n\t\tfunction buildObject( objectId, objects, modelData, textureData ) {\n\n\t\t\tconst objectData = modelData[ 'resources' ][ 'object' ][ objectId ];\n\n\t\t\tif ( objectData[ 'mesh' ] ) {\n\n\t\t\t\tconst meshData = objectData[ 'mesh' ];\n\n\t\t\t\tconst extensions = modelData[ 'extensions' ];\n\t\t\t\tconst modelXml = modelData[ 'xml' ];\n\n\t\t\t\tapplyExtensions( extensions, meshData, modelXml );\n\n\t\t\t\tobjects[ objectData.id ] = getBuild( meshData, objects, modelData, textureData, objectData, buildGroup );\n\n\t\t\t} else {\n\n\t\t\t\tconst compositeData = objectData[ 'components' ];\n\n\t\t\t\tobjects[ objectData.id ] = getBuild( compositeData, objects, modelData, textureData, objectData, buildComposite );\n\n\t\t\t}\n\n\t\t\tif ( objectData.name ) {\n\n\t\t\t\tobjects[ objectData.id ].name = objectData.name;\n\n\t\t\t}\n\n\t\t\tif ( modelData.resources.implicitfunction ) {\n\n\t\t\t\tconsole.warn( 'THREE.ThreeMFLoader: Implicit Functions are implemented in data-only.', modelData.resources.implicitfunction );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction buildObjects( data3mf ) {\n\n\t\t\tconst modelsData = data3mf.model;\n\t\t\tconst modelRels = data3mf.modelRels;\n\t\t\tconst objects = {};\n\t\t\tconst modelsKeys = Object.keys( modelsData );\n\t\t\tconst textureData = {};\n\n\t\t\t// evaluate model relationships to textures\n\n\t\t\tif ( modelRels ) {\n\n\t\t\t\tfor ( let i = 0, l = modelRels.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst modelRel = modelRels[ i ];\n\t\t\t\t\tconst textureKey = modelRel.target.substring( 1 );\n\n\t\t\t\t\tif ( data3mf.texture[ textureKey ] ) {\n\n\t\t\t\t\t\ttextureData[ modelRel.target ] = data3mf.texture[ textureKey ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// start build\n\n\t\t\tfor ( let i = 0; i < modelsKeys.length; i ++ ) {\n\n\t\t\t\tconst modelsKey = modelsKeys[ i ];\n\t\t\t\tconst modelData = modelsData[ modelsKey ];\n\n\t\t\t\tconst objectIds = Object.keys( modelData[ 'resources' ][ 'object' ] );\n\n\t\t\t\tfor ( let j = 0; j < objectIds.length; j ++ ) {\n\n\t\t\t\t\tconst objectId = objectIds[ j ];\n\n\t\t\t\t\tbuildObject( objectId, objects, modelData, textureData );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn objects;\n\n\t\t}\n\n\t\tfunction fetch3DModelPart( rels ) {\n\n\t\t\tfor ( let i = 0; i < rels.length; i ++ ) {\n\n\t\t\t\tconst rel = rels[ i ];\n\t\t\t\tconst extension = rel.target.split( '.' ).pop();\n\n\t\t\t\tif ( extension.toLowerCase() === 'model' ) return rel;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction build( objects, data3mf ) {\n\n\t\t\tconst group = new Group();\n\n\t\t\tconst relationship = fetch3DModelPart( data3mf[ 'rels' ] );\n\t\t\tconst buildData = data3mf.model[ relationship[ 'target' ].substring( 1 ) ][ 'build' ];\n\n\t\t\tfor ( let i = 0; i < buildData.length; i ++ ) {\n\n\t\t\t\tconst buildItem = buildData[ i ];\n\t\t\t\tconst object3D = objects[ buildItem[ 'objectId' ] ].clone();\n\n\t\t\t\t// apply transform\n\n\t\t\t\tconst transform = buildItem[ 'transform' ];\n\n\t\t\t\tif ( transform ) {\n\n\t\t\t\t\tobject3D.applyMatrix4( transform );\n\n\t\t\t\t}\n\n\t\t\t\tgroup.add( object3D );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t}\n\n\t\tconst data3mf = loadDocument( data );\n\t\tconst objects = buildObjects( data3mf );\n\n\t\treturn build( objects, data3mf );\n\n\t}\n\n\t/**\n\t * Adds a 3MF extension.\n\t *\n\t * @param {Object} extension - The extension to add.\n\t */\n\taddExtension( extension ) {\n\n\t\tthis.availableExtensions.push( extension );\n\n\t}\n\n}\n\nexport { ThreeMFLoader };\n", "import {\n\tBufferGeometry,\n\tColor,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tGroup,\n\tLoader,\n\tMesh,\n\tMeshPhongMaterial\n} from 'three';\nimport * as fflate from '../libs/fflate.module.js';\n\n/**\n * A loader for the AMF format.\n *\n * The loader supports materials, color and ZIP compressed files.\n * No constellation support (yet).\n *\n * ```js\n * const loader = new AMFLoader();\n *\n * const object = await loader.loadAsync( './models/amf/rook.amf' );\n * scene.add( object );\n * ```\n *\n * @augments Loader\n * @three_import import { AMFLoader } from 'three/addons/loaders/AMFLoader.js';\n */\nclass AMFLoader extends Loader {\n\n\t/**\n\t * Constructs a new AMF loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded AMF asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Group)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( text ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given AMF data and returns the resulting group.\n\t *\n\t * @param {ArrayBuffer} data - The raw AMF asset data as an array buffer.\n\t * @return {Group} A group representing the parsed asset.\n\t */\n\tparse( data ) {\n\n\t\tfunction loadDocument( data ) {\n\n\t\t\tlet view = new DataView( data );\n\t\t\tconst magic = String.fromCharCode( view.getUint8( 0 ), view.getUint8( 1 ) );\n\n\t\t\tif ( magic === 'PK' ) {\n\n\t\t\t\tlet zip = null;\n\t\t\t\tlet file = null;\n\n\t\t\t\tconsole.log( 'THREE.AMFLoader: Loading Zip' );\n\n\t\t\t\ttry {\n\n\t\t\t\t\tzip = fflate.unzipSync( new Uint8Array( data ) );\n\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\tif ( e instanceof ReferenceError ) {\n\n\t\t\t\t\t\tconsole.log( 'THREE.AMFLoader: fflate missing and file is compressed.' );\n\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( file in zip ) {\n\n\t\t\t\t\tif ( file.toLowerCase().slice( - 4 ) === '.amf' ) {\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconsole.log( 'THREE.AMFLoader: Trying to load file asset: ' + file );\n\t\t\t\tview = new DataView( zip[ file ].buffer );\n\n\t\t\t}\n\n\t\t\tconst fileText = new TextDecoder().decode( view );\n\t\t\tconst xmlData = new DOMParser().parseFromString( fileText, 'application/xml' );\n\n\t\t\tif ( xmlData.documentElement.nodeName.toLowerCase() !== 'amf' ) {\n\n\t\t\t\tconsole.log( 'THREE.AMFLoader: Error loading AMF - no AMF document found.' );\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\treturn xmlData;\n\n\t\t}\n\n\t\tfunction loadDocumentScale( node ) {\n\n\t\t\tlet scale = 1.0;\n\t\t\tlet unit = 'millimeter';\n\n\t\t\tif ( node.documentElement.attributes.unit !== undefined ) {\n\n\t\t\t\tunit = node.documentElement.attributes.unit.value.toLowerCase();\n\n\t\t\t}\n\n\t\t\tconst scaleUnits = {\n\t\t\t\tmillimeter: 1.0,\n\t\t\t\tinch: 25.4,\n\t\t\t\tfeet: 304.8,\n\t\t\t\tmeter: 1000.0,\n\t\t\t\tmicron: 0.001\n\t\t\t};\n\n\t\t\tif ( scaleUnits[ unit ] !== undefined ) {\n\n\t\t\t\tscale = scaleUnits[ unit ];\n\n\t\t\t}\n\n\t\t\tconsole.log( 'THREE.AMFLoader: Unit scale: ' + scale );\n\t\t\treturn scale;\n\n\t\t}\n\n\t\tfunction loadMaterials( node ) {\n\n\t\t\tlet matName = 'AMF Material';\n\t\t\tconst matId = node.attributes.id.textContent;\n\t\t\tlet color = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 };\n\n\t\t\tlet loadedMaterial = null;\n\n\t\t\tfor ( let i = 0; i < node.childNodes.length; i ++ ) {\n\n\t\t\t\tconst matChildEl = node.childNodes[ i ];\n\n\t\t\t\tif ( matChildEl.nodeName === 'metadata' && matChildEl.attributes.type !== undefined ) {\n\n\t\t\t\t\tif ( matChildEl.attributes.type.value === 'name' ) {\n\n\t\t\t\t\t\tmatName = matChildEl.textContent;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( matChildEl.nodeName === 'color' ) {\n\n\t\t\t\t\tcolor = loadColor( matChildEl );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tloadedMaterial = new MeshPhongMaterial( {\n\t\t\t\tflatShading: true,\n\t\t\t\tcolor: new Color( color.r, color.g, color.b ),\n\t\t\t\tname: matName\n\t\t\t} );\n\n\t\t\tif ( color.a !== 1.0 ) {\n\n\t\t\t\tloadedMaterial.transparent = true;\n\t\t\t\tloadedMaterial.opacity = color.a;\n\n\t\t\t}\n\n\t\t\treturn { id: matId, material: loadedMaterial };\n\n\t\t}\n\n\t\tfunction loadColor( node ) {\n\n\t\t\tconst color = { r: 1.0, g: 1.0, b: 1.0, a: 1.0 };\n\n\t\t\tfor ( let i = 0; i < node.childNodes.length; i ++ ) {\n\n\t\t\t\tconst matColor = node.childNodes[ i ];\n\n\t\t\t\tif ( matColor.nodeName === 'r' ) {\n\n\t\t\t\t\tcolor.r = matColor.textContent;\n\n\t\t\t\t} else if ( matColor.nodeName === 'g' ) {\n\n\t\t\t\t\tcolor.g = matColor.textContent;\n\n\t\t\t\t} else if ( matColor.nodeName === 'b' ) {\n\n\t\t\t\t\tcolor.b = matColor.textContent;\n\n\t\t\t\t} else if ( matColor.nodeName === 'a' ) {\n\n\t\t\t\t\tcolor.a = matColor.textContent;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn color;\n\n\t\t}\n\n\t\tfunction loadMeshVolume( node ) {\n\n\t\t\tconst volume = { name: '', triangles: [], materialId: null };\n\n\t\t\tlet currVolumeNode = node.firstElementChild;\n\n\t\t\tif ( node.attributes.materialid !== undefined ) {\n\n\t\t\t\tvolume.materialId = node.attributes.materialid.nodeValue;\n\n\t\t\t}\n\n\t\t\twhile ( currVolumeNode ) {\n\n\t\t\t\tif ( currVolumeNode.nodeName === 'metadata' ) {\n\n\t\t\t\t\tif ( currVolumeNode.attributes.type !== undefined ) {\n\n\t\t\t\t\t\tif ( currVolumeNode.attributes.type.value === 'name' ) {\n\n\t\t\t\t\t\t\tvolume.name = currVolumeNode.textContent;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( currVolumeNode.nodeName === 'triangle' ) {\n\n\t\t\t\t\tconst v1 = currVolumeNode.getElementsByTagName( 'v1' )[ 0 ].textContent;\n\t\t\t\t\tconst v2 = currVolumeNode.getElementsByTagName( 'v2' )[ 0 ].textContent;\n\t\t\t\t\tconst v3 = currVolumeNode.getElementsByTagName( 'v3' )[ 0 ].textContent;\n\n\t\t\t\t\tvolume.triangles.push( v1, v2, v3 );\n\n\t\t\t\t}\n\n\t\t\t\tcurrVolumeNode = currVolumeNode.nextElementSibling;\n\n\t\t\t}\n\n\t\t\treturn volume;\n\n\t\t}\n\n\t\tfunction loadMeshVertices( node ) {\n\n\t\t\tconst vertArray = [];\n\t\t\tconst normalArray = [];\n\t\t\tlet currVerticesNode = node.firstElementChild;\n\n\t\t\twhile ( currVerticesNode ) {\n\n\t\t\t\tif ( currVerticesNode.nodeName === 'vertex' ) {\n\n\t\t\t\t\tlet vNode = currVerticesNode.firstElementChild;\n\n\t\t\t\t\twhile ( vNode ) {\n\n\t\t\t\t\t\tif ( vNode.nodeName === 'coordinates' ) {\n\n\t\t\t\t\t\t\tconst x = vNode.getElementsByTagName( 'x' )[ 0 ].textContent;\n\t\t\t\t\t\t\tconst y = vNode.getElementsByTagName( 'y' )[ 0 ].textContent;\n\t\t\t\t\t\t\tconst z = vNode.getElementsByTagName( 'z' )[ 0 ].textContent;\n\n\t\t\t\t\t\t\tvertArray.push( x, y, z );\n\n\t\t\t\t\t\t} else if ( vNode.nodeName === 'normal' ) {\n\n\t\t\t\t\t\t\tconst nx = vNode.getElementsByTagName( 'nx' )[ 0 ].textContent;\n\t\t\t\t\t\t\tconst ny = vNode.getElementsByTagName( 'ny' )[ 0 ].textContent;\n\t\t\t\t\t\t\tconst nz = vNode.getElementsByTagName( 'nz' )[ 0 ].textContent;\n\n\t\t\t\t\t\t\tnormalArray.push( nx, ny, nz );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvNode = vNode.nextElementSibling;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tcurrVerticesNode = currVerticesNode.nextElementSibling;\n\n\t\t\t}\n\n\t\t\treturn { 'vertices': vertArray, 'normals': normalArray };\n\n\t\t}\n\n\t\tfunction loadObject( node ) {\n\n\t\t\tconst objId = node.attributes.id.textContent;\n\t\t\tconst loadedObject = { name: 'amfobject', meshes: [] };\n\t\t\tlet currColor = null;\n\t\t\tlet currObjNode = node.firstElementChild;\n\n\t\t\twhile ( currObjNode ) {\n\n\t\t\t\tif ( currObjNode.nodeName === 'metadata' ) {\n\n\t\t\t\t\tif ( currObjNode.attributes.type !== undefined ) {\n\n\t\t\t\t\t\tif ( currObjNode.attributes.type.value === 'name' ) {\n\n\t\t\t\t\t\t\tloadedObject.name = currObjNode.textContent;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( currObjNode.nodeName === 'color' ) {\n\n\t\t\t\t\tcurrColor = loadColor( currObjNode );\n\n\t\t\t\t} else if ( currObjNode.nodeName === 'mesh' ) {\n\n\t\t\t\t\tlet currMeshNode = currObjNode.firstElementChild;\n\t\t\t\t\tconst mesh = { vertices: [], normals: [], volumes: [], color: currColor };\n\n\t\t\t\t\twhile ( currMeshNode ) {\n\n\t\t\t\t\t\tif ( currMeshNode.nodeName === 'vertices' ) {\n\n\t\t\t\t\t\t\tconst loadedVertices = loadMeshVertices( currMeshNode );\n\n\t\t\t\t\t\t\tmesh.normals = mesh.normals.concat( loadedVertices.normals );\n\t\t\t\t\t\t\tmesh.vertices = mesh.vertices.concat( loadedVertices.vertices );\n\n\t\t\t\t\t\t} else if ( currMeshNode.nodeName === 'volume' ) {\n\n\t\t\t\t\t\t\tmesh.volumes.push( loadMeshVolume( currMeshNode ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcurrMeshNode = currMeshNode.nextElementSibling;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tloadedObject.meshes.push( mesh );\n\n\t\t\t\t}\n\n\t\t\t\tcurrObjNode = currObjNode.nextElementSibling;\n\n\t\t\t}\n\n\t\t\treturn { 'id': objId, 'obj': loadedObject };\n\n\t\t}\n\n\t\tconst xmlData = loadDocument( data );\n\t\tlet amfName = '';\n\t\tlet amfAuthor = '';\n\t\tconst amfScale = loadDocumentScale( xmlData );\n\t\tconst amfMaterials = {};\n\t\tconst amfObjects = {};\n\t\tconst childNodes = xmlData.documentElement.childNodes;\n\n\t\tlet i, j;\n\n\t\tfor ( i = 0; i < childNodes.length; i ++ ) {\n\n\t\t\tconst child = childNodes[ i ];\n\n\t\t\tif ( child.nodeName === 'metadata' ) {\n\n\t\t\t\tif ( child.attributes.type !== undefined ) {\n\n\t\t\t\t\tif ( child.attributes.type.value === 'name' ) {\n\n\t\t\t\t\t\tamfName = child.textContent;\n\n\t\t\t\t\t} else if ( child.attributes.type.value === 'author' ) {\n\n\t\t\t\t\t\tamfAuthor = child.textContent;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( child.nodeName === 'material' ) {\n\n\t\t\t\tconst loadedMaterial = loadMaterials( child );\n\n\t\t\t\tamfMaterials[ loadedMaterial.id ] = loadedMaterial.material;\n\n\t\t\t} else if ( child.nodeName === 'object' ) {\n\n\t\t\t\tconst loadedObject = loadObject( child );\n\n\t\t\t\tamfObjects[ loadedObject.id ] = loadedObject.obj;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst sceneObject = new Group();\n\t\tconst defaultMaterial = new MeshPhongMaterial( {\n\t\t\tname: Loader.DEFAULT_MATERIAL_NAME,\n\t\t\tcolor: 0xaaaaff,\n\t\t\tflatShading: true\n\t\t} );\n\n\t\tsceneObject.name = amfName;\n\t\tsceneObject.userData.author = amfAuthor;\n\t\tsceneObject.userData.loader = 'AMF';\n\n\t\tfor ( const id in amfObjects ) {\n\n\t\t\tconst part = amfObjects[ id ];\n\t\t\tconst meshes = part.meshes;\n\t\t\tconst newObject = new Group();\n\t\t\tnewObject.name = part.name || '';\n\n\t\t\tfor ( i = 0; i < meshes.length; i ++ ) {\n\n\t\t\t\tlet objDefaultMaterial = defaultMaterial;\n\t\t\t\tconst mesh = meshes[ i ];\n\t\t\t\tconst vertices = new Float32BufferAttribute( mesh.vertices, 3 );\n\t\t\t\tlet normals = null;\n\n\t\t\t\tif ( mesh.normals.length ) {\n\n\t\t\t\t\tnormals = new Float32BufferAttribute( mesh.normals, 3 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( mesh.color ) {\n\n\t\t\t\t\tconst color = mesh.color;\n\n\t\t\t\t\tobjDefaultMaterial = defaultMaterial.clone();\n\t\t\t\t\tobjDefaultMaterial.color = new Color( color.r, color.g, color.b );\n\n\t\t\t\t\tif ( color.a !== 1.0 ) {\n\n\t\t\t\t\t\tobjDefaultMaterial.transparent = true;\n\t\t\t\t\t\tobjDefaultMaterial.opacity = color.a;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst volumes = mesh.volumes;\n\n\t\t\t\tfor ( j = 0; j < volumes.length; j ++ ) {\n\n\t\t\t\t\tconst volume = volumes[ j ];\n\t\t\t\t\tconst newGeometry = new BufferGeometry();\n\t\t\t\t\tlet material = objDefaultMaterial;\n\n\t\t\t\t\tnewGeometry.setIndex( volume.triangles );\n\t\t\t\t\tnewGeometry.setAttribute( 'position', vertices.clone() );\n\n\t\t\t\t\tif ( normals ) {\n\n\t\t\t\t\t\tnewGeometry.setAttribute( 'normal', normals.clone() );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( amfMaterials[ volume.materialId ] !== undefined ) {\n\n\t\t\t\t\t\tmaterial = amfMaterials[ volume.materialId ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tnewGeometry.scale( amfScale, amfScale, amfScale );\n\t\t\t\t\tnewObject.add( new Mesh( newGeometry, material.clone() ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tsceneObject.add( newObject );\n\n\t\t}\n\n\t\treturn sceneObject;\n\n\t}\n\n}\n\nexport { AMFLoader };\n", "import {\n\tAnimationClip,\n\tBone,\n\tFileLoader,\n\tLoader,\n\tQuaternion,\n\tQuaternionKeyframeTrack,\n\tSkeleton,\n\tVector3,\n\tVectorKeyframeTrack\n} from 'three';\n\n/**\n * A loader for the BVH format.\n *\n * Imports BVH files and outputs a single {@link Skeleton} and {@link AnimationClip}.\n * The loader only supports BVH files containing a single root right now.\n *\n * ```js\n * const loader = new BVHLoader();\n * const result = await loader.loadAsync( 'models/bvh/pirouette.bvh' );\n *\n * // visualize skeleton\n * const skeletonHelper = new THREE.SkeletonHelper( result.skeleton.bones[ 0 ] );\n * scene.add( result.skeleton.bones[ 0 ] );\n * scene.add( skeletonHelper );\n *\n * // play animation clip\n * mixer = new THREE.AnimationMixer( result.skeleton.bones[ 0 ] );\n * mixer.clipAction( result.clip ).play();\n * ```\n *\n * @augments Loader\n * @three_import import { BVHLoader } from 'three/addons/loaders/BVHLoader.js';\n */\nclass BVHLoader extends Loader {\n\n\t/**\n\t * Constructs a new BVH loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * Whether to animate bone positions or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.animateBonePositions = true;\n\n\t\t/**\n\t\t * Whether to animate bone rotations or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.animateBoneRotations = true;\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded BVH asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function({skeleton:Skeleton,clip:AnimationClip})} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( text ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given BVH data and returns the resulting data.\n\t *\n\t * @param {string} text - The raw BVH data as a string.\n\t * @return {{skeleton:Skeleton,clip:AnimationClip}} An object representing the parsed asset.\n\t */\n\tparse( text ) {\n\n\t\t// reads a string array (lines) from a BVH file\n\t\t// and outputs a skeleton structure including motion data\n\n\t\t// returns thee root node:\n\t\t// { name: '', channels: [], children: [] }\n\t\tfunction readBvh( lines ) {\n\n\t\t\t// read model structure\n\n\t\t\tif ( nextLine( lines ) !== 'HIERARCHY' ) {\n\n\t\t\t\tconsole.error( 'THREE.BVHLoader: HIERARCHY expected.' );\n\n\t\t\t}\n\n\t\t\tconst list = []; // collects flat array of all bones\n\t\t\tconst root = readNode( lines, nextLine( lines ), list );\n\n\t\t\t// read motion data\n\n\t\t\tif ( nextLine( lines ) !== 'MOTION' ) {\n\n\t\t\t\tconsole.error( 'THREE.BVHLoader: MOTION expected.' );\n\n\t\t\t}\n\n\t\t\t// number of frames\n\n\t\t\tlet tokens = nextLine( lines ).split( /[\\s]+/ );\n\t\t\tconst numFrames = parseInt( tokens[ 1 ] );\n\n\t\t\tif ( isNaN( numFrames ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BVHLoader: Failed to read number of frames.' );\n\n\t\t\t}\n\n\t\t\t// frame time\n\n\t\t\ttokens = nextLine( lines ).split( /[\\s]+/ );\n\t\t\tconst frameTime = parseFloat( tokens[ 2 ] );\n\n\t\t\tif ( isNaN( frameTime ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BVHLoader: Failed to read frame time.' );\n\n\t\t\t}\n\n\t\t\t// read frame data line by line\n\n\t\t\tfor ( let i = 0; i < numFrames; i ++ ) {\n\n\t\t\t\ttokens = nextLine( lines ).split( /[\\s]+/ );\n\t\t\t\treadFrameData( tokens, i * frameTime, root );\n\n\t\t\t}\n\n\t\t\treturn list;\n\n\t\t}\n\n\t\t/*\n\t\t\tRecursively reads data from a single frame into the bone hierarchy.\n\t\t\tThe passed bone hierarchy has to be structured in the same order as the BVH file.\n\t\t\tkeyframe data is stored in bone.frames.\n\n\t\t\t- data: splitted string array (frame values), values are shift()ed so\n\t\t\tthis should be empty after parsing the whole hierarchy.\n\t\t\t- frameTime: playback time for this keyframe.\n\t\t\t- bone: the bone to read frame data from.\n\t\t*/\n\t\tfunction readFrameData( data, frameTime, bone ) {\n\n\t\t\t// end sites have no motion data\n\n\t\t\tif ( bone.type === 'ENDSITE' ) return;\n\n\t\t\t// add keyframe\n\n\t\t\tconst keyframe = {\n\t\t\t\ttime: frameTime,\n\t\t\t\tposition: new Vector3(),\n\t\t\t\trotation: new Quaternion()\n\t\t\t};\n\n\t\t\tbone.frames.push( keyframe );\n\n\t\t\tconst quat = new Quaternion();\n\n\t\t\tconst vx = new Vector3( 1, 0, 0 );\n\t\t\tconst vy = new Vector3( 0, 1, 0 );\n\t\t\tconst vz = new Vector3( 0, 0, 1 );\n\n\t\t\t// parse values for each channel in node\n\n\t\t\tfor ( let i = 0; i < bone.channels.length; i ++ ) {\n\n\t\t\t\tswitch ( bone.channels[ i ] ) {\n\n\t\t\t\t\tcase 'Xposition':\n\t\t\t\t\t\tkeyframe.position.x = parseFloat( data.shift().trim() );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Yposition':\n\t\t\t\t\t\tkeyframe.position.y = parseFloat( data.shift().trim() );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Zposition':\n\t\t\t\t\t\tkeyframe.position.z = parseFloat( data.shift().trim() );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Xrotation':\n\t\t\t\t\t\tquat.setFromAxisAngle( vx, parseFloat( data.shift().trim() ) * Math.PI / 180 );\n\t\t\t\t\t\tkeyframe.rotation.multiply( quat );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Yrotation':\n\t\t\t\t\t\tquat.setFromAxisAngle( vy, parseFloat( data.shift().trim() ) * Math.PI / 180 );\n\t\t\t\t\t\tkeyframe.rotation.multiply( quat );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Zrotation':\n\t\t\t\t\t\tquat.setFromAxisAngle( vz, parseFloat( data.shift().trim() ) * Math.PI / 180 );\n\t\t\t\t\t\tkeyframe.rotation.multiply( quat );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn( 'THREE.BVHLoader: Invalid channel type.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// parse child nodes\n\n\t\t\tfor ( let i = 0; i < bone.children.length; i ++ ) {\n\n\t\t\t\treadFrameData( data, frameTime, bone.children[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\t/*\n\t\t Recursively parses the HIERARCHY section of the BVH file\n\n\t\t - lines: all lines of the file. lines are consumed as we go along.\n\t\t - firstline: line containing the node type and name e.g. 'JOINT hip'\n\t\t - list: collects a flat list of nodes\n\n\t\t returns: a BVH node including children\n\t\t*/\n\t\tfunction readNode( lines, firstline, list ) {\n\n\t\t\tconst node = { name: '', type: '', frames: [] };\n\t\t\tlist.push( node );\n\n\t\t\t// parse node type and name\n\n\t\t\tlet tokens = firstline.split( /[\\s]+/ );\n\n\t\t\tif ( tokens[ 0 ].toUpperCase() === 'END' && tokens[ 1 ].toUpperCase() === 'SITE' ) {\n\n\t\t\t\tnode.type = 'ENDSITE';\n\t\t\t\tnode.name = 'ENDSITE'; // bvh end sites have no name\n\n\t\t\t} else {\n\n\t\t\t\tnode.name = tokens[ 1 ];\n\t\t\t\tnode.type = tokens[ 0 ].toUpperCase();\n\n\t\t\t}\n\n\t\t\tif ( nextLine( lines ) !== '{' ) {\n\n\t\t\t\tconsole.error( 'THREE.BVHLoader: Expected opening { after type & name' );\n\n\t\t\t}\n\n\t\t\t// parse OFFSET\n\n\t\t\ttokens = nextLine( lines ).split( /[\\s]+/ );\n\n\t\t\tif ( tokens[ 0 ] !== 'OFFSET' ) {\n\n\t\t\t\tconsole.error( 'THREE.BVHLoader: Expected OFFSET but got: ' + tokens[ 0 ] );\n\n\t\t\t}\n\n\t\t\tif ( tokens.length !== 4 ) {\n\n\t\t\t\tconsole.error( 'THREE.BVHLoader: Invalid number of values for OFFSET.' );\n\n\t\t\t}\n\n\t\t\tconst offset = new Vector3(\n\t\t\t\tparseFloat( tokens[ 1 ] ),\n\t\t\t\tparseFloat( tokens[ 2 ] ),\n\t\t\t\tparseFloat( tokens[ 3 ] )\n\t\t\t);\n\n\t\t\tif ( isNaN( offset.x ) || isNaN( offset.y ) || isNaN( offset.z ) ) {\n\n\t\t\t\tconsole.error( 'THREE.BVHLoader: Invalid values of OFFSET.' );\n\n\t\t\t}\n\n\t\t\tnode.offset = offset;\n\n\t\t\t// parse CHANNELS definitions\n\n\t\t\tif ( node.type !== 'ENDSITE' ) {\n\n\t\t\t\ttokens = nextLine( lines ).split( /[\\s]+/ );\n\n\t\t\t\tif ( tokens[ 0 ] !== 'CHANNELS' ) {\n\n\t\t\t\t\tconsole.error( 'THREE.BVHLoader: Expected CHANNELS definition.' );\n\n\t\t\t\t}\n\n\t\t\t\tconst numChannels = parseInt( tokens[ 1 ] );\n\t\t\t\tnode.channels = tokens.splice( 2, numChannels );\n\t\t\t\tnode.children = [];\n\n\t\t\t}\n\n\t\t\t// read children\n\n\t\t\twhile ( true ) {\n\n\t\t\t\tconst line = nextLine( lines );\n\n\t\t\t\tif ( line === '}' ) {\n\n\t\t\t\t\treturn node;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnode.children.push( readNode( lines, line, list ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t/*\n\t\t\trecursively converts the internal bvh node structure to a Bone hierarchy\n\n\t\t\tsource: the bvh root node\n\t\t\tlist: pass an empty array, collects a flat list of all converted THREE.Bones\n\n\t\t\treturns the root Bone\n\t\t*/\n\t\tfunction toTHREEBone( source, list ) {\n\n\t\t\tconst bone = new Bone();\n\t\t\tlist.push( bone );\n\n\t\t\tbone.position.add( source.offset );\n\t\t\tbone.name = source.name;\n\n\t\t\tif ( source.type !== 'ENDSITE' ) {\n\n\t\t\t\tfor ( let i = 0; i < source.children.length; i ++ ) {\n\n\t\t\t\t\tbone.add( toTHREEBone( source.children[ i ], list ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn bone;\n\n\t\t}\n\n\t\t/*\n\t\t\tbuilds an AnimationClip from the keyframe data saved in each bone.\n\n\t\t\tbone: bvh root node\n\n\t\t\treturns: an AnimationClip containing position and quaternion tracks\n\t\t*/\n\t\tfunction toTHREEAnimation( bones ) {\n\n\t\t\tconst tracks = [];\n\n\t\t\t// create a position and quaternion animation track for each node\n\n\t\t\tfor ( let i = 0; i < bones.length; i ++ ) {\n\n\t\t\t\tconst bone = bones[ i ];\n\n\t\t\t\tif ( bone.type === 'ENDSITE' )\n\t\t\t\t\tcontinue;\n\n\t\t\t\t// track data\n\n\t\t\t\tconst times = [];\n\t\t\t\tconst positions = [];\n\t\t\t\tconst rotations = [];\n\n\t\t\t\tfor ( let j = 0; j < bone.frames.length; j ++ ) {\n\n\t\t\t\t\tconst frame = bone.frames[ j ];\n\n\t\t\t\t\ttimes.push( frame.time );\n\n\t\t\t\t\t// the animation system animates the position property,\n\t\t\t\t\t// so we have to add the joint offset to all values\n\n\t\t\t\t\tpositions.push( frame.position.x + bone.offset.x );\n\t\t\t\t\tpositions.push( frame.position.y + bone.offset.y );\n\t\t\t\t\tpositions.push( frame.position.z + bone.offset.z );\n\n\t\t\t\t\trotations.push( frame.rotation.x );\n\t\t\t\t\trotations.push( frame.rotation.y );\n\t\t\t\t\trotations.push( frame.rotation.z );\n\t\t\t\t\trotations.push( frame.rotation.w );\n\n\t\t\t\t}\n\n\t\t\t\tif ( scope.animateBonePositions ) {\n\n\t\t\t\t\ttracks.push( new VectorKeyframeTrack( bone.name + '.position', times, positions ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( scope.animateBoneRotations ) {\n\n\t\t\t\t\ttracks.push( new QuaternionKeyframeTrack( bone.name + '.quaternion', times, rotations ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new AnimationClip( 'animation', - 1, tracks );\n\n\t\t}\n\n\t\t/*\n\t\t\treturns the next non-empty line in lines\n\t\t*/\n\t\tfunction nextLine( lines ) {\n\n\t\t\tlet line;\n\t\t\t// skip empty lines\n\t\t\twhile ( ( line = lines.shift().trim() ).length === 0 ) { }\n\n\t\t\treturn line;\n\n\t\t}\n\n\t\tconst scope = this;\n\n\t\tconst lines = text.split( /[\\r\\n]+/g );\n\n\t\tconst bones = readBvh( lines );\n\n\t\tconst threeBones = [];\n\t\ttoTHREEBone( bones[ 0 ], threeBones );\n\n\t\tconst threeClip = toTHREEAnimation( bones );\n\n\t\treturn {\n\t\t\tskeleton: new Skeleton( threeBones ),\n\t\t\tclip: threeClip\n\t\t};\n\n\t}\n\n}\n\nexport { BVHLoader };\n", "import {\n\tDataTextureLoader,\n\tLinearMipmapLinearFilter\n} from 'three';\n\n/**\n * A loader for the TGA texture format.\n *\n * ```js\n * const loader = new TGALoader();\n * const texture = await loader.loadAsync( 'textures/crate_color8.tga' );\n * texture.colorSpace = THREE.SRGBColorSpace; // only for color textures\n * ```\n *\n * @augments DataTextureLoader\n * @three_import import { TGALoader } from 'three/addons/loaders/TGALoader.js';\n */\nclass TGALoader extends DataTextureLoader {\n\n\t/**\n\t * Constructs a new TGA loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Parses the given TGA texture data.\n\t *\n\t * @param {ArrayBuffer} buffer - The raw texture data.\n\t * @return {DataTextureLoader~TexData} An object representing the parsed texture data.\n\t */\n\tparse( buffer ) {\n\n\t\t// reference from vthibault, https://github.com/vthibault/roBrowser/blob/master/src/Loaders/Targa.js\n\n\t\tfunction tgaCheckHeader( header ) {\n\n\t\t\tswitch ( header.image_type ) {\n\n\t\t\t\t// check indexed type\n\n\t\t\t\tcase TGA_TYPE_INDEXED:\n\t\t\t\tcase TGA_TYPE_RLE_INDEXED:\n\t\t\t\t\tif ( header.colormap_length > 256 || header.colormap_size !== 24 || header.colormap_type !== 1 ) {\n\n\t\t\t\t\t\tthrow new Error( 'THREE.TGALoader: Invalid type colormap data for indexed type.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t\t// check colormap type\n\n\t\t\t\tcase TGA_TYPE_RGB:\n\t\t\t\tcase TGA_TYPE_GREY:\n\t\t\t\tcase TGA_TYPE_RLE_RGB:\n\t\t\t\tcase TGA_TYPE_RLE_GREY:\n\t\t\t\t\tif ( header.colormap_type ) {\n\n\t\t\t\t\t\tthrow new Error( 'THREE.TGALoader: Invalid type colormap data for colormap type.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t\t// What the need of a file without data ?\n\n\t\t\t\tcase TGA_TYPE_NO_DATA:\n\t\t\t\t\tthrow new Error( 'THREE.TGALoader: No data.' );\n\n\t\t\t\t\t// Invalid type ?\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error( 'THREE.TGALoader: Invalid type ' + header.image_type );\n\n\t\t\t}\n\n\t\t\t// check image width and height\n\n\t\t\tif ( header.width <= 0 || header.height <= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.TGALoader: Invalid image size.' );\n\n\t\t\t}\n\n\t\t\t// check image pixel size\n\n\t\t\tif ( header.pixel_size !== 8 && header.pixel_size !== 16 &&\n\t\t\t\theader.pixel_size !== 24 && header.pixel_size !== 32 ) {\n\n\t\t\t\tthrow new Error( 'THREE.TGALoader: Invalid pixel size ' + header.pixel_size );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// parse tga image buffer\n\n\t\tfunction tgaParse( use_rle, use_pal, header, offset, data ) {\n\n\t\t\tlet pixel_data,\n\t\t\t\tpalettes;\n\n\t\t\tconst pixel_size = header.pixel_size >> 3;\n\t\t\tconst pixel_total = header.width * header.height * pixel_size;\n\n\t\t\t // read palettes\n\n\t\t\t if ( use_pal ) {\n\n\t\t\t\t palettes = data.subarray( offset, offset += header.colormap_length * ( header.colormap_size >> 3 ) );\n\n\t\t\t }\n\n\t\t\t // read RLE\n\n\t\t\t if ( use_rle ) {\n\n\t\t\t\t pixel_data = new Uint8Array( pixel_total );\n\n\t\t\t\tlet c, count, i;\n\t\t\t\tlet shift = 0;\n\t\t\t\tconst pixels = new Uint8Array( pixel_size );\n\n\t\t\t\twhile ( shift < pixel_total ) {\n\n\t\t\t\t\tc = data[ offset ++ ];\n\t\t\t\t\tcount = ( c & 0x7f ) + 1;\n\n\t\t\t\t\t// RLE pixels\n\n\t\t\t\t\tif ( c & 0x80 ) {\n\n\t\t\t\t\t\t// bind pixel tmp array\n\n\t\t\t\t\t\tfor ( i = 0; i < pixel_size; ++ i ) {\n\n\t\t\t\t\t\t\tpixels[ i ] = data[ offset ++ ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// copy pixel array\n\n\t\t\t\t\t\tfor ( i = 0; i < count; ++ i ) {\n\n\t\t\t\t\t\t\tpixel_data.set( pixels, shift + i * pixel_size );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tshift += pixel_size * count;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// raw pixels\n\n\t\t\t\t\t\tcount *= pixel_size;\n\n\t\t\t\t\t\tfor ( i = 0; i < count; ++ i ) {\n\n\t\t\t\t\t\t\tpixel_data[ shift + i ] = data[ offset ++ ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tshift += count;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t } else {\n\n\t\t\t\t// raw pixels\n\n\t\t\t\tpixel_data = data.subarray(\n\t\t\t\t\t offset, offset += ( use_pal ? header.width * header.height : pixel_total )\n\t\t\t\t);\n\n\t\t\t }\n\n\t\t\t return {\n\t\t\t\tpixel_data: pixel_data,\n\t\t\t\tpalettes: palettes\n\t\t\t };\n\n\t\t}\n\n\t\tfunction tgaGetImageData8bits( imageData, y_start, y_step, y_end, x_start, x_step, x_end, image, palettes ) {\n\n\t\t\tconst colormap = palettes;\n\t\t\tlet color, i = 0, x, y;\n\t\t\tconst width = header.width;\n\n\t\t\tfor ( y = y_start; y !== y_end; y += y_step ) {\n\n\t\t\t\tfor ( x = x_start; x !== x_end; x += x_step, i ++ ) {\n\n\t\t\t\t\tcolor = image[ i ];\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 3 ] = 255;\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 2 ] = colormap[ ( color * 3 ) + 0 ];\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 1 ] = colormap[ ( color * 3 ) + 1 ];\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 0 ] = colormap[ ( color * 3 ) + 2 ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn imageData;\n\n\t\t}\n\n\t\tfunction tgaGetImageData16bits( imageData, y_start, y_step, y_end, x_start, x_step, x_end, image ) {\n\n\t\t\tlet color, i = 0, x, y;\n\t\t\tconst width = header.width;\n\n\t\t\tfor ( y = y_start; y !== y_end; y += y_step ) {\n\n\t\t\t\tfor ( x = x_start; x !== x_end; x += x_step, i += 2 ) {\n\n\t\t\t\t\tcolor = image[ i + 0 ] + ( image[ i + 1 ] << 8 );\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 0 ] = ( color & 0x7C00 ) >> 7;\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 1 ] = ( color & 0x03E0 ) >> 2;\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 2 ] = ( color & 0x001F ) << 3;\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 3 ] = ( color & 0x8000 ) ? 0 : 255;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn imageData;\n\n\t\t}\n\n\t\tfunction tgaGetImageData24bits( imageData, y_start, y_step, y_end, x_start, x_step, x_end, image ) {\n\n\t\t\tlet i = 0, x, y;\n\t\t\tconst width = header.width;\n\n\t\t\tfor ( y = y_start; y !== y_end; y += y_step ) {\n\n\t\t\t\tfor ( x = x_start; x !== x_end; x += x_step, i += 3 ) {\n\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 3 ] = 255;\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 2 ] = image[ i + 0 ];\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 1 ] = image[ i + 1 ];\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 0 ] = image[ i + 2 ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn imageData;\n\n\t\t}\n\n\t\tfunction tgaGetImageData32bits( imageData, y_start, y_step, y_end, x_start, x_step, x_end, image ) {\n\n\t\t\tlet i = 0, x, y;\n\t\t\tconst width = header.width;\n\n\t\t\tfor ( y = y_start; y !== y_end; y += y_step ) {\n\n\t\t\t\tfor ( x = x_start; x !== x_end; x += x_step, i += 4 ) {\n\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 2 ] = image[ i + 0 ];\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 1 ] = image[ i + 1 ];\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 0 ] = image[ i + 2 ];\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 3 ] = image[ i + 3 ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn imageData;\n\n\t\t}\n\n\t\tfunction tgaGetImageDataGrey8bits( imageData, y_start, y_step, y_end, x_start, x_step, x_end, image ) {\n\n\t\t\tlet color, i = 0, x, y;\n\t\t\tconst width = header.width;\n\n\t\t\tfor ( y = y_start; y !== y_end; y += y_step ) {\n\n\t\t\t\tfor ( x = x_start; x !== x_end; x += x_step, i ++ ) {\n\n\t\t\t\t\tcolor = image[ i ];\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 0 ] = color;\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 1 ] = color;\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 2 ] = color;\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 3 ] = 255;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn imageData;\n\n\t\t}\n\n\t\tfunction tgaGetImageDataGrey16bits( imageData, y_start, y_step, y_end, x_start, x_step, x_end, image ) {\n\n\t\t\tlet i = 0, x, y;\n\t\t\tconst width = header.width;\n\n\t\t\tfor ( y = y_start; y !== y_end; y += y_step ) {\n\n\t\t\t\tfor ( x = x_start; x !== x_end; x += x_step, i += 2 ) {\n\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 0 ] = image[ i + 0 ];\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 1 ] = image[ i + 0 ];\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 2 ] = image[ i + 0 ];\n\t\t\t\t\timageData[ ( x + width * y ) * 4 + 3 ] = image[ i + 1 ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn imageData;\n\n\t\t}\n\n\t\tfunction getTgaRGBA( data, width, height, image, palette ) {\n\n\t\t\tlet x_start,\n\t\t\t\ty_start,\n\t\t\t\tx_step,\n\t\t\t\ty_step,\n\t\t\t\tx_end,\n\t\t\t\ty_end;\n\n\t\t\tswitch ( ( header.flags & TGA_ORIGIN_MASK ) >> TGA_ORIGIN_SHIFT ) {\n\n\t\t\t\tdefault:\n\t\t\t\tcase TGA_ORIGIN_UL:\n\t\t\t\t\tx_start = 0;\n\t\t\t\t\tx_step = 1;\n\t\t\t\t\tx_end = width;\n\t\t\t\t\ty_start = 0;\n\t\t\t\t\ty_step = 1;\n\t\t\t\t\ty_end = height;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase TGA_ORIGIN_BL:\n\t\t\t\t\tx_start = 0;\n\t\t\t\t\tx_step = 1;\n\t\t\t\t\tx_end = width;\n\t\t\t\t\ty_start = height - 1;\n\t\t\t\t\ty_step = - 1;\n\t\t\t\t\ty_end = - 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase TGA_ORIGIN_UR:\n\t\t\t\t\tx_start = width - 1;\n\t\t\t\t\tx_step = - 1;\n\t\t\t\t\tx_end = - 1;\n\t\t\t\t\ty_start = 0;\n\t\t\t\t\ty_step = 1;\n\t\t\t\t\ty_end = height;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase TGA_ORIGIN_BR:\n\t\t\t\t\tx_start = width - 1;\n\t\t\t\t\tx_step = - 1;\n\t\t\t\t\tx_end = - 1;\n\t\t\t\t\ty_start = height - 1;\n\t\t\t\t\ty_step = - 1;\n\t\t\t\t\ty_end = - 1;\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( use_grey ) {\n\n\t\t\t\tswitch ( header.pixel_size ) {\n\n\t\t\t\t\tcase 8:\n\t\t\t\t\t\ttgaGetImageDataGrey8bits( data, y_start, y_step, y_end, x_start, x_step, x_end, image );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 16:\n\t\t\t\t\t\ttgaGetImageDataGrey16bits( data, y_start, y_step, y_end, x_start, x_step, x_end, image );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new Error( 'THREE.TGALoader: Format not supported.' );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tswitch ( header.pixel_size ) {\n\n\t\t\t\t\tcase 8:\n\t\t\t\t\t\ttgaGetImageData8bits( data, y_start, y_step, y_end, x_start, x_step, x_end, image, palette );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 16:\n\t\t\t\t\t\ttgaGetImageData16bits( data, y_start, y_step, y_end, x_start, x_step, x_end, image );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 24:\n\t\t\t\t\t\ttgaGetImageData24bits( data, y_start, y_step, y_end, x_start, x_step, x_end, image );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 32:\n\t\t\t\t\t\ttgaGetImageData32bits( data, y_start, y_step, y_end, x_start, x_step, x_end, image );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new Error( 'THREE.TGALoader: Format not supported.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Load image data according to specific method\n\t\t\t// let func = 'tgaGetImageData' + (use_grey ? 'Grey' : '') + (header.pixel_size) + 'bits';\n\t\t\t// func(data, y_start, y_step, y_end, x_start, x_step, x_end, width, image, palette );\n\t\t\treturn data;\n\n\t\t}\n\n\t\t// TGA constants\n\n\t\tconst TGA_TYPE_NO_DATA = 0,\n\t\t\tTGA_TYPE_INDEXED = 1,\n\t\t\tTGA_TYPE_RGB = 2,\n\t\t\tTGA_TYPE_GREY = 3,\n\t\t\tTGA_TYPE_RLE_INDEXED = 9,\n\t\t\tTGA_TYPE_RLE_RGB = 10,\n\t\t\tTGA_TYPE_RLE_GREY = 11,\n\n\t\t\tTGA_ORIGIN_MASK = 0x30,\n\t\t\tTGA_ORIGIN_SHIFT = 0x04,\n\t\t\tTGA_ORIGIN_BL = 0x00,\n\t\t\tTGA_ORIGIN_BR = 0x01,\n\t\t\tTGA_ORIGIN_UL = 0x02,\n\t\t\tTGA_ORIGIN_UR = 0x03;\n\n\t\tif ( buffer.length < 19 ) throw new Error( 'THREE.TGALoader: Not enough data to contain header.' );\n\n\t\tlet offset = 0;\n\n\t\tconst content = new Uint8Array( buffer ),\n\t\t\theader = {\n\t\t\t\tid_length: content[ offset ++ ],\n\t\t\t\tcolormap_type: content[ offset ++ ],\n\t\t\t\timage_type: content[ offset ++ ],\n\t\t\t\tcolormap_index: content[ offset ++ ] | content[ offset ++ ] << 8,\n\t\t\t\tcolormap_length: content[ offset ++ ] | content[ offset ++ ] << 8,\n\t\t\t\tcolormap_size: content[ offset ++ ],\n\t\t\t\torigin: [\n\t\t\t\t\tcontent[ offset ++ ] | content[ offset ++ ] << 8,\n\t\t\t\t\tcontent[ offset ++ ] | content[ offset ++ ] << 8\n\t\t\t\t],\n\t\t\t\twidth: content[ offset ++ ] | content[ offset ++ ] << 8,\n\t\t\t\theight: content[ offset ++ ] | content[ offset ++ ] << 8,\n\t\t\t\tpixel_size: content[ offset ++ ],\n\t\t\t\tflags: content[ offset ++ ]\n\t\t\t};\n\n\t\t// check tga if it is valid format\n\n\t\ttgaCheckHeader( header );\n\n\t\tif ( header.id_length + offset > buffer.length ) {\n\n\t\t\tthrow new Error( 'THREE.TGALoader: No data.' );\n\n\t\t}\n\n\t\t// skip the needn't data\n\n\t\toffset += header.id_length;\n\n\t\t// get targa information about RLE compression and palette\n\n\t\tlet use_rle = false,\n\t\t\tuse_pal = false,\n\t\t\tuse_grey = false;\n\n\t\tswitch ( header.image_type ) {\n\n\t\t\tcase TGA_TYPE_RLE_INDEXED:\n\t\t\t\tuse_rle = true;\n\t\t\t\tuse_pal = true;\n\t\t\t\tbreak;\n\n\t\t\tcase TGA_TYPE_INDEXED:\n\t\t\t\tuse_pal = true;\n\t\t\t\tbreak;\n\n\t\t\tcase TGA_TYPE_RLE_RGB:\n\t\t\t\tuse_rle = true;\n\t\t\t\tbreak;\n\n\t\t\tcase TGA_TYPE_RGB:\n\t\t\t\tbreak;\n\n\t\t\tcase TGA_TYPE_RLE_GREY:\n\t\t\t\tuse_rle = true;\n\t\t\t\tuse_grey = true;\n\t\t\t\tbreak;\n\n\t\t\tcase TGA_TYPE_GREY:\n\t\t\t\tuse_grey = true;\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\t//\n\n\t\tconst imageData = new Uint8Array( header.width * header.height * 4 );\n\t\tconst result = tgaParse( use_rle, use_pal, header, offset, content );\n\t\tgetTgaRGBA( imageData, header.width, header.height, result.pixel_data, result.palettes );\n\n\t\treturn {\n\n\t\t\tdata: imageData,\n\t\t\twidth: header.width,\n\t\t\theight: header.height,\n\t\t\tflipY: true,\n\t\t\tgenerateMipmaps: true,\n\t\t\tminFilter: LinearMipmapLinearFilter,\n\n\t\t};\n\n\t}\n\n}\n\nexport { TGALoader };\n", "import {\n\tAmbientLight,\n\tAnimationClip,\n\tBone,\n\tBufferGeometry,\n\tClampToEdgeWrapping,\n\tColor,\n\tColorManagement,\n\tDirectionalLight,\n\tDoubleSide,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tFrontSide,\n\tGroup,\n\tLine,\n\tLineBasicMaterial,\n\tLineSegments,\n\tLoader,\n\tLoaderUtils,\n\tMathUtils,\n\tMatrix4,\n\tMesh,\n\tMeshBasicMaterial,\n\tMeshLambertMaterial,\n\tMeshPhongMaterial,\n\tOrthographicCamera,\n\tPerspectiveCamera,\n\tPointLight,\n\tQuaternion,\n\tQuaternionKeyframeTrack,\n\tRepeatWrapping,\n\tScene,\n\tSkeleton,\n\tSkinnedMesh,\n\tSpotLight,\n\tTextureLoader,\n\tVector2,\n\tVector3,\n\tVectorKeyframeTrack,\n\tSRGBColorSpace\n} from 'three';\nimport { TGALoader } from '../loaders/TGALoader.js';\n\n/**\n * A loader for the Collada format.\n *\n * The Collada format is very complex so this loader only supports a subset of what\n * is defined in the [official specification](https://www.khronos.org/files/collada_spec_1_5.pdf).\n *\n * Assets with a Z-UP coordinate system are transformed it into Y-UP by a simple rotation.\n * The vertex data are not converted.\n *\n * ```js\n * const loader = new ColladaLoader();\n *\n * const result = await loader.loadAsync( './models/collada/elf/elf.dae' );\n * scene.add( result.scene );\n * ```\n *\n * @augments Loader\n * @three_import import { ColladaLoader } from 'three/addons/loaders/ColladaLoader.js';\n */\nclass ColladaLoader extends Loader {\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded Collada asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function({scene:Group,animations:Array<AnimationClip>,kinematics:Object})} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( scope.path === '' ) ? LoaderUtils.extractUrlBase( url ) : scope.path;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( text, path ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given Collada data and returns a result object holding the parsed scene,\n\t * an array of animation clips and kinematics.\n\t *\n\t * @param {string} text - The raw Collada data as a string.\n\t * @param {string} [path] - The asset path.\n\t * @return {?{scene:Group,animations:Array<AnimationClip>,kinematics:Object}} An object representing the parsed asset.\n\t */\n\tparse( text, path ) {\n\n\t\tfunction getElementsByTagName( xml, name ) {\n\n\t\t\t// Non recursive xml.getElementsByTagName() ...\n\n\t\t\tconst array = [];\n\t\t\tconst childNodes = xml.childNodes;\n\n\t\t\tfor ( let i = 0, l = childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = childNodes[ i ];\n\n\t\t\t\tif ( child.nodeName === name ) {\n\n\t\t\t\t\tarray.push( child );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn array;\n\n\t\t}\n\n\t\tfunction parseStrings( text ) {\n\n\t\t\tif ( text.length === 0 ) return [];\n\n\t\t\tconst parts = text.trim().split( /\\s+/ );\n\t\t\tconst array = new Array( parts.length );\n\n\t\t\tfor ( let i = 0, l = parts.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ] = parts[ i ];\n\n\t\t\t}\n\n\t\t\treturn array;\n\n\t\t}\n\n\t\tfunction parseFloats( text ) {\n\n\t\t\tif ( text.length === 0 ) return [];\n\n\t\t\tconst parts = text.trim().split( /\\s+/ );\n\t\t\tconst array = new Array( parts.length );\n\n\t\t\tfor ( let i = 0, l = parts.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ] = parseFloat( parts[ i ] );\n\n\t\t\t}\n\n\t\t\treturn array;\n\n\t\t}\n\n\t\tfunction parseInts( text ) {\n\n\t\t\tif ( text.length === 0 ) return [];\n\n\t\t\tconst parts = text.trim().split( /\\s+/ );\n\t\t\tconst array = new Array( parts.length );\n\n\t\t\tfor ( let i = 0, l = parts.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ] = parseInt( parts[ i ] );\n\n\t\t\t}\n\n\t\t\treturn array;\n\n\t\t}\n\n\t\tfunction parseId( text ) {\n\n\t\t\treturn text.substring( 1 );\n\n\t\t}\n\n\t\tfunction generateId() {\n\n\t\t\treturn 'three_default_' + ( count ++ );\n\n\t\t}\n\n\t\tfunction isEmpty( object ) {\n\n\t\t\treturn Object.keys( object ).length === 0;\n\n\t\t}\n\n\t\t// asset\n\n\t\tfunction parseAsset( xml ) {\n\n\t\t\treturn {\n\t\t\t\tunit: parseAssetUnit( getElementsByTagName( xml, 'unit' )[ 0 ] ),\n\t\t\t\tupAxis: parseAssetUpAxis( getElementsByTagName( xml, 'up_axis' )[ 0 ] )\n\t\t\t};\n\n\t\t}\n\n\t\tfunction parseAssetUnit( xml ) {\n\n\t\t\tif ( ( xml !== undefined ) && ( xml.hasAttribute( 'meter' ) === true ) ) {\n\n\t\t\t\treturn parseFloat( xml.getAttribute( 'meter' ) );\n\n\t\t\t} else {\n\n\t\t\t\treturn 1; // default 1 meter\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseAssetUpAxis( xml ) {\n\n\t\t\treturn xml !== undefined ? xml.textContent : 'Y_UP';\n\n\t\t}\n\n\t\t// library\n\n\t\tfunction parseLibrary( xml, libraryName, nodeName, parser ) {\n\n\t\t\tconst library = getElementsByTagName( xml, libraryName )[ 0 ];\n\n\t\t\tif ( library !== undefined ) {\n\n\t\t\t\tconst elements = getElementsByTagName( library, nodeName );\n\n\t\t\t\tfor ( let i = 0; i < elements.length; i ++ ) {\n\n\t\t\t\t\tparser( elements[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction buildLibrary( data, builder ) {\n\n\t\t\tfor ( const name in data ) {\n\n\t\t\t\tconst object = data[ name ];\n\t\t\t\tobject.build = builder( data[ name ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// get\n\n\t\tfunction getBuild( data, builder ) {\n\n\t\t\tif ( data.build !== undefined ) return data.build;\n\n\t\t\tdata.build = builder( data );\n\n\t\t\treturn data.build;\n\n\t\t}\n\n\t\t// animation\n\n\t\tfunction parseAnimation( xml ) {\n\n\t\t\tconst data = {\n\t\t\t\tsources: {},\n\t\t\t\tsamplers: {},\n\t\t\t\tchannels: {}\n\t\t\t};\n\n\t\t\tlet hasChildren = false;\n\n\t\t\tfor ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tlet id;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'source':\n\t\t\t\t\t\tid = child.getAttribute( 'id' );\n\t\t\t\t\t\tdata.sources[ id ] = parseSource( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'sampler':\n\t\t\t\t\t\tid = child.getAttribute( 'id' );\n\t\t\t\t\t\tdata.samplers[ id ] = parseAnimationSampler( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'channel':\n\t\t\t\t\t\tid = child.getAttribute( 'target' );\n\t\t\t\t\t\tdata.channels[ id ] = parseAnimationChannel( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'animation':\n\t\t\t\t\t\t// hierarchy of related animations\n\t\t\t\t\t\tparseAnimation( child );\n\t\t\t\t\t\thasChildren = true;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.log( child );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hasChildren === false ) {\n\n\t\t\t\t// since 'id' attributes can be optional, it's necessary to generate a UUID for unique assignment\n\n\t\t\t\tlibrary.animations[ xml.getAttribute( 'id' ) || MathUtils.generateUUID() ] = data;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseAnimationSampler( xml ) {\n\n\t\t\tconst data = {\n\t\t\t\tinputs: {},\n\t\t\t};\n\n\t\t\tfor ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'input':\n\t\t\t\t\t\tconst id = parseId( child.getAttribute( 'source' ) );\n\t\t\t\t\t\tconst semantic = child.getAttribute( 'semantic' );\n\t\t\t\t\t\tdata.inputs[ semantic ] = id;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseAnimationChannel( xml ) {\n\n\t\t\tconst data = {};\n\n\t\t\tconst target = xml.getAttribute( 'target' );\n\n\t\t\t// parsing SID Addressing Syntax\n\n\t\t\tlet parts = target.split( '/' );\n\n\t\t\tconst id = parts.shift();\n\t\t\tlet sid = parts.shift();\n\n\t\t\t// check selection syntax\n\n\t\t\tconst arraySyntax = ( sid.indexOf( '(' ) !== - 1 );\n\t\t\tconst memberSyntax = ( sid.indexOf( '.' ) !== - 1 );\n\n\t\t\tif ( memberSyntax ) {\n\n\t\t\t\t//  member selection access\n\n\t\t\t\tparts = sid.split( '.' );\n\t\t\t\tsid = parts.shift();\n\t\t\t\tdata.member = parts.shift();\n\n\t\t\t} else if ( arraySyntax ) {\n\n\t\t\t\t// array-access syntax. can be used to express fields in one-dimensional vectors or two-dimensional matrices.\n\n\t\t\t\tconst indices = sid.split( '(' );\n\t\t\t\tsid = indices.shift();\n\n\t\t\t\tfor ( let i = 0; i < indices.length; i ++ ) {\n\n\t\t\t\t\tindices[ i ] = parseInt( indices[ i ].replace( /\\)/, '' ) );\n\n\t\t\t\t}\n\n\t\t\t\tdata.indices = indices;\n\n\t\t\t}\n\n\t\t\tdata.id = id;\n\t\t\tdata.sid = sid;\n\n\t\t\tdata.arraySyntax = arraySyntax;\n\t\t\tdata.memberSyntax = memberSyntax;\n\n\t\t\tdata.sampler = parseId( xml.getAttribute( 'source' ) );\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction buildAnimation( data ) {\n\n\t\t\tconst tracks = [];\n\n\t\t\tconst channels = data.channels;\n\t\t\tconst samplers = data.samplers;\n\t\t\tconst sources = data.sources;\n\n\t\t\tfor ( const target in channels ) {\n\n\t\t\t\tif ( channels.hasOwnProperty( target ) ) {\n\n\t\t\t\t\tconst channel = channels[ target ];\n\t\t\t\t\tconst sampler = samplers[ channel.sampler ];\n\n\t\t\t\t\tconst inputId = sampler.inputs.INPUT;\n\t\t\t\t\tconst outputId = sampler.inputs.OUTPUT;\n\n\t\t\t\t\tconst inputSource = sources[ inputId ];\n\t\t\t\t\tconst outputSource = sources[ outputId ];\n\n\t\t\t\t\tconst animation = buildAnimationChannel( channel, inputSource, outputSource );\n\n\t\t\t\t\tcreateKeyframeTracks( animation, tracks );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn tracks;\n\n\t\t}\n\n\t\tfunction getAnimation( id ) {\n\n\t\t\treturn getBuild( library.animations[ id ], buildAnimation );\n\n\t\t}\n\n\t\tfunction buildAnimationChannel( channel, inputSource, outputSource ) {\n\n\t\t\tconst node = library.nodes[ channel.id ];\n\t\t\tconst object3D = getNode( node.id );\n\n\t\t\tconst transform = node.transforms[ channel.sid ];\n\t\t\tconst defaultMatrix = node.matrix.clone().transpose();\n\n\t\t\tlet time, stride;\n\t\t\tlet i, il, j, jl;\n\n\t\t\tconst data = {};\n\n\t\t\t// the collada spec allows the animation of data in various ways.\n\t\t\t// depending on the transform type (matrix, translate, rotate, scale), we execute different logic\n\n\t\t\tswitch ( transform ) {\n\n\t\t\t\tcase 'matrix':\n\n\t\t\t\t\tfor ( i = 0, il = inputSource.array.length; i < il; i ++ ) {\n\n\t\t\t\t\t\ttime = inputSource.array[ i ];\n\t\t\t\t\t\tstride = i * outputSource.stride;\n\n\t\t\t\t\t\tif ( data[ time ] === undefined ) data[ time ] = {};\n\n\t\t\t\t\t\tif ( channel.arraySyntax === true ) {\n\n\t\t\t\t\t\t\tconst value = outputSource.array[ stride ];\n\t\t\t\t\t\t\tconst index = channel.indices[ 0 ] + 4 * channel.indices[ 1 ];\n\n\t\t\t\t\t\t\tdata[ time ][ index ] = value;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( j = 0, jl = outputSource.stride; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\t\tdata[ time ][ j ] = outputSource.array[ stride + j ];\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'translate':\n\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Animation transform type \"%s\" not yet implemented.', transform );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'rotate':\n\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Animation transform type \"%s\" not yet implemented.', transform );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'scale':\n\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Animation transform type \"%s\" not yet implemented.', transform );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tconst keyframes = prepareAnimationData( data, defaultMatrix );\n\n\t\t\tconst animation = {\n\t\t\t\tname: object3D.uuid,\n\t\t\t\tkeyframes: keyframes\n\t\t\t};\n\n\t\t\treturn animation;\n\n\t\t}\n\n\t\tfunction prepareAnimationData( data, defaultMatrix ) {\n\n\t\t\tconst keyframes = [];\n\n\t\t\t// transfer data into a sortable array\n\n\t\t\tfor ( const time in data ) {\n\n\t\t\t\tkeyframes.push( { time: parseFloat( time ), value: data[ time ] } );\n\n\t\t\t}\n\n\t\t\t// ensure keyframes are sorted by time\n\n\t\t\tkeyframes.sort( ascending );\n\n\t\t\t// now we clean up all animation data, so we can use them for keyframe tracks\n\n\t\t\tfor ( let i = 0; i < 16; i ++ ) {\n\n\t\t\t\ttransformAnimationData( keyframes, i, defaultMatrix.elements[ i ] );\n\n\t\t\t}\n\n\t\t\treturn keyframes;\n\n\t\t\t// array sort function\n\n\t\t\tfunction ascending( a, b ) {\n\n\t\t\t\treturn a.time - b.time;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst position = new Vector3();\n\t\tconst scale = new Vector3();\n\t\tconst quaternion = new Quaternion();\n\n\t\tfunction createKeyframeTracks( animation, tracks ) {\n\n\t\t\tconst keyframes = animation.keyframes;\n\t\t\tconst name = animation.name;\n\n\t\t\tconst times = [];\n\t\t\tconst positionData = [];\n\t\t\tconst quaternionData = [];\n\t\t\tconst scaleData = [];\n\n\t\t\tfor ( let i = 0, l = keyframes.length; i < l; i ++ ) {\n\n\t\t\t\tconst keyframe = keyframes[ i ];\n\n\t\t\t\tconst time = keyframe.time;\n\t\t\t\tconst value = keyframe.value;\n\n\t\t\t\tmatrix.fromArray( value ).transpose();\n\t\t\t\tmatrix.decompose( position, quaternion, scale );\n\n\t\t\t\ttimes.push( time );\n\t\t\t\tpositionData.push( position.x, position.y, position.z );\n\t\t\t\tquaternionData.push( quaternion.x, quaternion.y, quaternion.z, quaternion.w );\n\t\t\t\tscaleData.push( scale.x, scale.y, scale.z );\n\n\t\t\t}\n\n\t\t\tif ( positionData.length > 0 ) tracks.push( new VectorKeyframeTrack( name + '.position', times, positionData ) );\n\t\t\tif ( quaternionData.length > 0 ) tracks.push( new QuaternionKeyframeTrack( name + '.quaternion', times, quaternionData ) );\n\t\t\tif ( scaleData.length > 0 ) tracks.push( new VectorKeyframeTrack( name + '.scale', times, scaleData ) );\n\n\t\t\treturn tracks;\n\n\t\t}\n\n\t\tfunction transformAnimationData( keyframes, property, defaultValue ) {\n\n\t\t\tlet keyframe;\n\n\t\t\tlet empty = true;\n\t\t\tlet i, l;\n\n\t\t\t// check, if values of a property are missing in our keyframes\n\n\t\t\tfor ( i = 0, l = keyframes.length; i < l; i ++ ) {\n\n\t\t\t\tkeyframe = keyframes[ i ];\n\n\t\t\t\tif ( keyframe.value[ property ] === undefined ) {\n\n\t\t\t\t\tkeyframe.value[ property ] = null; // mark as missing\n\n\t\t\t\t} else {\n\n\t\t\t\t\tempty = false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( empty === true ) {\n\n\t\t\t\t// no values at all, so we set a default value\n\n\t\t\t\tfor ( i = 0, l = keyframes.length; i < l; i ++ ) {\n\n\t\t\t\t\tkeyframe = keyframes[ i ];\n\n\t\t\t\t\tkeyframe.value[ property ] = defaultValue;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// filling gaps\n\n\t\t\t\tcreateMissingKeyframes( keyframes, property );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction createMissingKeyframes( keyframes, property ) {\n\n\t\t\tlet prev, next;\n\n\t\t\tfor ( let i = 0, l = keyframes.length; i < l; i ++ ) {\n\n\t\t\t\tconst keyframe = keyframes[ i ];\n\n\t\t\t\tif ( keyframe.value[ property ] === null ) {\n\n\t\t\t\t\tprev = getPrev( keyframes, i, property );\n\t\t\t\t\tnext = getNext( keyframes, i, property );\n\n\t\t\t\t\tif ( prev === null ) {\n\n\t\t\t\t\t\tkeyframe.value[ property ] = next.value[ property ];\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( next === null ) {\n\n\t\t\t\t\t\tkeyframe.value[ property ] = prev.value[ property ];\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tinterpolate( keyframe, prev, next, property );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getPrev( keyframes, i, property ) {\n\n\t\t\twhile ( i >= 0 ) {\n\n\t\t\t\tconst keyframe = keyframes[ i ];\n\n\t\t\t\tif ( keyframe.value[ property ] !== null ) return keyframe;\n\n\t\t\t\ti --;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tfunction getNext( keyframes, i, property ) {\n\n\t\t\twhile ( i < keyframes.length ) {\n\n\t\t\t\tconst keyframe = keyframes[ i ];\n\n\t\t\t\tif ( keyframe.value[ property ] !== null ) return keyframe;\n\n\t\t\t\ti ++;\n\n\t\t\t}\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tfunction interpolate( key, prev, next, property ) {\n\n\t\t\tif ( ( next.time - prev.time ) === 0 ) {\n\n\t\t\t\tkey.value[ property ] = prev.value[ property ];\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tkey.value[ property ] = ( ( key.time - prev.time ) * ( next.value[ property ] - prev.value[ property ] ) / ( next.time - prev.time ) ) + prev.value[ property ];\n\n\t\t}\n\n\t\t// animation clips\n\n\t\tfunction parseAnimationClip( xml ) {\n\n\t\t\tconst data = {\n\t\t\t\tname: xml.getAttribute( 'id' ) || 'default',\n\t\t\t\tstart: parseFloat( xml.getAttribute( 'start' ) || 0 ),\n\t\t\t\tend: parseFloat( xml.getAttribute( 'end' ) || 0 ),\n\t\t\t\tanimations: []\n\t\t\t};\n\n\t\t\tfor ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'instance_animation':\n\t\t\t\t\t\tdata.animations.push( parseId( child.getAttribute( 'url' ) ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlibrary.clips[ xml.getAttribute( 'id' ) ] = data;\n\n\t\t}\n\n\t\tfunction buildAnimationClip( data ) {\n\n\t\t\tconst tracks = [];\n\n\t\t\tconst name = data.name;\n\t\t\tconst duration = ( data.end - data.start ) || - 1;\n\t\t\tconst animations = data.animations;\n\n\t\t\tfor ( let i = 0, il = animations.length; i < il; i ++ ) {\n\n\t\t\t\tconst animationTracks = getAnimation( animations[ i ] );\n\n\t\t\t\tfor ( let j = 0, jl = animationTracks.length; j < jl; j ++ ) {\n\n\t\t\t\t\ttracks.push( animationTracks[ j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new AnimationClip( name, duration, tracks );\n\n\t\t}\n\n\t\tfunction getAnimationClip( id ) {\n\n\t\t\treturn getBuild( library.clips[ id ], buildAnimationClip );\n\n\t\t}\n\n\t\t// controller\n\n\t\tfunction parseController( xml ) {\n\n\t\t\tconst data = {};\n\n\t\t\tfor ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'skin':\n\t\t\t\t\t\t// there is exactly one skin per controller\n\t\t\t\t\t\tdata.id = parseId( child.getAttribute( 'source' ) );\n\t\t\t\t\t\tdata.skin = parseSkin( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'morph':\n\t\t\t\t\t\tdata.id = parseId( child.getAttribute( 'source' ) );\n\t\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Morph target animation not supported yet.' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlibrary.controllers[ xml.getAttribute( 'id' ) ] = data;\n\n\t\t}\n\n\t\tfunction parseSkin( xml ) {\n\n\t\t\tconst data = {\n\t\t\t\tsources: {}\n\t\t\t};\n\n\t\t\tfor ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'bind_shape_matrix':\n\t\t\t\t\t\tdata.bindShapeMatrix = parseFloats( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'source':\n\t\t\t\t\t\tconst id = child.getAttribute( 'id' );\n\t\t\t\t\t\tdata.sources[ id ] = parseSource( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'joints':\n\t\t\t\t\t\tdata.joints = parseJoints( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'vertex_weights':\n\t\t\t\t\t\tdata.vertexWeights = parseVertexWeights( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseJoints( xml ) {\n\n\t\t\tconst data = {\n\t\t\t\tinputs: {}\n\t\t\t};\n\n\t\t\tfor ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'input':\n\t\t\t\t\t\tconst semantic = child.getAttribute( 'semantic' );\n\t\t\t\t\t\tconst id = parseId( child.getAttribute( 'source' ) );\n\t\t\t\t\t\tdata.inputs[ semantic ] = id;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseVertexWeights( xml ) {\n\n\t\t\tconst data = {\n\t\t\t\tinputs: {}\n\t\t\t};\n\n\t\t\tfor ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'input':\n\t\t\t\t\t\tconst semantic = child.getAttribute( 'semantic' );\n\t\t\t\t\t\tconst id = parseId( child.getAttribute( 'source' ) );\n\t\t\t\t\t\tconst offset = parseInt( child.getAttribute( 'offset' ) );\n\t\t\t\t\t\tdata.inputs[ semantic ] = { id: id, offset: offset };\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'vcount':\n\t\t\t\t\t\tdata.vcount = parseInts( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v':\n\t\t\t\t\t\tdata.v = parseInts( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction buildController( data ) {\n\n\t\t\tconst build = {\n\t\t\t\tid: data.id\n\t\t\t};\n\n\t\t\tconst geometry = library.geometries[ build.id ];\n\n\t\t\tif ( data.skin !== undefined ) {\n\n\t\t\t\tbuild.skin = buildSkin( data.skin );\n\n\t\t\t\t// we enhance the 'sources' property of the corresponding geometry with our skin data\n\n\t\t\t\tgeometry.sources.skinIndices = build.skin.indices;\n\t\t\t\tgeometry.sources.skinWeights = build.skin.weights;\n\n\t\t\t}\n\n\t\t\treturn build;\n\n\t\t}\n\n\t\tfunction buildSkin( data ) {\n\n\t\t\tconst BONE_LIMIT = 4;\n\n\t\t\tconst build = {\n\t\t\t\tjoints: [], // this must be an array to preserve the joint order\n\t\t\t\tindices: {\n\t\t\t\t\tarray: [],\n\t\t\t\t\tstride: BONE_LIMIT\n\t\t\t\t},\n\t\t\t\tweights: {\n\t\t\t\t\tarray: [],\n\t\t\t\t\tstride: BONE_LIMIT\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst sources = data.sources;\n\t\t\tconst vertexWeights = data.vertexWeights;\n\n\t\t\tconst vcount = vertexWeights.vcount;\n\t\t\tconst v = vertexWeights.v;\n\t\t\tconst jointOffset = vertexWeights.inputs.JOINT.offset;\n\t\t\tconst weightOffset = vertexWeights.inputs.WEIGHT.offset;\n\n\t\t\tconst jointSource = data.sources[ data.joints.inputs.JOINT ];\n\t\t\tconst inverseSource = data.sources[ data.joints.inputs.INV_BIND_MATRIX ];\n\n\t\t\tconst weights = sources[ vertexWeights.inputs.WEIGHT.id ].array;\n\t\t\tlet stride = 0;\n\n\t\t\tlet i, j, l;\n\n\t\t\t// process skin data for each vertex\n\n\t\t\tfor ( i = 0, l = vcount.length; i < l; i ++ ) {\n\n\t\t\t\tconst jointCount = vcount[ i ]; // this is the amount of joints that affect a single vertex\n\t\t\t\tconst vertexSkinData = [];\n\n\t\t\t\tfor ( j = 0; j < jointCount; j ++ ) {\n\n\t\t\t\t\tconst skinIndex = v[ stride + jointOffset ];\n\t\t\t\t\tconst weightId = v[ stride + weightOffset ];\n\t\t\t\t\tconst skinWeight = weights[ weightId ];\n\n\t\t\t\t\tvertexSkinData.push( { index: skinIndex, weight: skinWeight } );\n\n\t\t\t\t\tstride += 2;\n\n\t\t\t\t}\n\n\t\t\t\t// we sort the joints in descending order based on the weights.\n\t\t\t\t// this ensures, we only proceed the most important joints of the vertex\n\n\t\t\t\tvertexSkinData.sort( descending );\n\n\t\t\t\t// now we provide for each vertex a set of four index and weight values.\n\t\t\t\t// the order of the skin data matches the order of vertices\n\n\t\t\t\tfor ( j = 0; j < BONE_LIMIT; j ++ ) {\n\n\t\t\t\t\tconst d = vertexSkinData[ j ];\n\n\t\t\t\t\tif ( d !== undefined ) {\n\n\t\t\t\t\t\tbuild.indices.array.push( d.index );\n\t\t\t\t\t\tbuild.weights.array.push( d.weight );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tbuild.indices.array.push( 0 );\n\t\t\t\t\t\tbuild.weights.array.push( 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// setup bind matrix\n\n\t\t\tif ( data.bindShapeMatrix ) {\n\n\t\t\t\tbuild.bindMatrix = new Matrix4().fromArray( data.bindShapeMatrix ).transpose();\n\n\t\t\t} else {\n\n\t\t\t\tbuild.bindMatrix = new Matrix4().identity();\n\n\t\t\t}\n\n\t\t\t// process bones and inverse bind matrix data\n\n\t\t\tfor ( i = 0, l = jointSource.array.length; i < l; i ++ ) {\n\n\t\t\t\tconst name = jointSource.array[ i ];\n\t\t\t\tconst boneInverse = new Matrix4().fromArray( inverseSource.array, i * inverseSource.stride ).transpose();\n\n\t\t\t\tbuild.joints.push( { name: name, boneInverse: boneInverse } );\n\n\t\t\t}\n\n\t\t\treturn build;\n\n\t\t\t// array sort function\n\n\t\t\tfunction descending( a, b ) {\n\n\t\t\t\treturn b.weight - a.weight;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getController( id ) {\n\n\t\t\treturn getBuild( library.controllers[ id ], buildController );\n\n\t\t}\n\n\t\t// image\n\n\t\tfunction parseImage( xml ) {\n\n\t\t\tconst data = {\n\t\t\t\tinit_from: getElementsByTagName( xml, 'init_from' )[ 0 ].textContent\n\t\t\t};\n\n\t\t\tlibrary.images[ xml.getAttribute( 'id' ) ] = data;\n\n\t\t}\n\n\t\tfunction buildImage( data ) {\n\n\t\t\tif ( data.build !== undefined ) return data.build;\n\n\t\t\treturn data.init_from;\n\n\t\t}\n\n\t\tfunction getImage( id ) {\n\n\t\t\tconst data = library.images[ id ];\n\n\t\t\tif ( data !== undefined ) {\n\n\t\t\t\treturn getBuild( data, buildImage );\n\n\t\t\t}\n\n\t\t\tconsole.warn( 'THREE.ColladaLoader: Couldn\\'t find image with ID:', id );\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// effect\n\n\t\tfunction parseEffect( xml ) {\n\n\t\t\tconst data = {};\n\n\t\t\tfor ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'profile_COMMON':\n\t\t\t\t\t\tdata.profile = parseEffectProfileCOMMON( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlibrary.effects[ xml.getAttribute( 'id' ) ] = data;\n\n\t\t}\n\n\t\tfunction parseEffectProfileCOMMON( xml ) {\n\n\t\t\tconst data = {\n\t\t\t\tsurfaces: {},\n\t\t\t\tsamplers: {}\n\t\t\t};\n\n\t\t\tfor ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'newparam':\n\t\t\t\t\t\tparseEffectNewparam( child, data );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'technique':\n\t\t\t\t\t\tdata.technique = parseEffectTechnique( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'extra':\n\t\t\t\t\t\tdata.extra = parseEffectExtra( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseEffectNewparam( xml, data ) {\n\n\t\t\tconst sid = xml.getAttribute( 'sid' );\n\n\t\t\tfor ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'surface':\n\t\t\t\t\t\tdata.surfaces[ sid ] = parseEffectSurface( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'sampler2D':\n\t\t\t\t\t\tdata.samplers[ sid ] = parseEffectSampler( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseEffectSurface( xml ) {\n\n\t\t\tconst data = {};\n\n\t\t\tfor ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'init_from':\n\t\t\t\t\t\tdata.init_from = child.textContent;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseEffectSampler( xml ) {\n\n\t\t\tconst data = {};\n\n\t\t\tfor ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'source':\n\t\t\t\t\t\tdata.source = child.textContent;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseEffectTechnique( xml ) {\n\n\t\t\tconst data = {};\n\n\t\t\tfor ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'constant':\n\t\t\t\t\tcase 'lambert':\n\t\t\t\t\tcase 'blinn':\n\t\t\t\t\tcase 'phong':\n\t\t\t\t\t\tdata.type = child.nodeName;\n\t\t\t\t\t\tdata.parameters = parseEffectParameters( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'extra':\n\t\t\t\t\t\tdata.extra = parseEffectExtra( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseEffectParameters( xml ) {\n\n\t\t\tconst data = {};\n\n\t\t\tfor ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'emission':\n\t\t\t\t\tcase 'diffuse':\n\t\t\t\t\tcase 'specular':\n\t\t\t\t\tcase 'bump':\n\t\t\t\t\tcase 'ambient':\n\t\t\t\t\tcase 'shininess':\n\t\t\t\t\tcase 'transparency':\n\t\t\t\t\t\tdata[ child.nodeName ] = parseEffectParameter( child );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'transparent':\n\t\t\t\t\t\tdata[ child.nodeName ] = {\n\t\t\t\t\t\t\topaque: child.hasAttribute( 'opaque' ) ? child.getAttribute( 'opaque' ) : 'A_ONE',\n\t\t\t\t\t\t\tdata: parseEffectParameter( child )\n\t\t\t\t\t\t};\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseEffectParameter( xml ) {\n\n\t\t\tconst data = {};\n\n\t\t\tfor ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'color':\n\t\t\t\t\t\tdata[ child.nodeName ] = parseFloats( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'float':\n\t\t\t\t\t\tdata[ child.nodeName ] = parseFloat( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'texture':\n\t\t\t\t\t\tdata[ child.nodeName ] = { id: child.getAttribute( 'texture' ), extra: parseEffectParameterTexture( child ) };\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseEffectParameterTexture( xml ) {\n\n\t\t\tconst data = {\n\t\t\t\ttechnique: {}\n\t\t\t};\n\n\t\t\tfor ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'extra':\n\t\t\t\t\t\tparseEffectParameterTextureExtra( child, data );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseEffectParameterTextureExtra( xml, data ) {\n\n\t\t\tfor ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'technique':\n\t\t\t\t\t\tparseEffectParameterTextureExtraTechnique( child, data );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseEffectParameterTextureExtraTechnique( xml, data ) {\n\n\t\t\tfor ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'repeatU':\n\t\t\t\t\tcase 'repeatV':\n\t\t\t\t\tcase 'offsetU':\n\t\t\t\t\tcase 'offsetV':\n\t\t\t\t\t\tdata.technique[ child.nodeName ] = parseFloat( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'wrapU':\n\t\t\t\t\tcase 'wrapV':\n\n\t\t\t\t\t\t// some files have values for wrapU/wrapV which become NaN via parseInt\n\n\t\t\t\t\t\tif ( child.textContent.toUpperCase() === 'TRUE' ) {\n\n\t\t\t\t\t\t\tdata.technique[ child.nodeName ] = 1;\n\n\t\t\t\t\t\t} else if ( child.textContent.toUpperCase() === 'FALSE' ) {\n\n\t\t\t\t\t\t\tdata.technique[ child.nodeName ] = 0;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tdata.technique[ child.nodeName ] = parseInt( child.textContent );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'bump':\n\t\t\t\t\t\tdata[ child.nodeName ] = parseEffectExtraTechniqueBump( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseEffectExtra( xml ) {\n\n\t\t\tconst data = {};\n\n\t\t\tfor ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'technique':\n\t\t\t\t\t\tdata.technique = parseEffectExtraTechnique( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseEffectExtraTechnique( xml ) {\n\n\t\t\tconst data = {};\n\n\t\t\tfor ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'double_sided':\n\t\t\t\t\t\tdata[ child.nodeName ] = parseInt( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'bump':\n\t\t\t\t\t\tdata[ child.nodeName ] = parseEffectExtraTechniqueBump( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseEffectExtraTechniqueBump( xml ) {\n\n\t\t\tconst data = {};\n\n\t\t\tfor ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'texture':\n\t\t\t\t\t\tdata[ child.nodeName ] = { id: child.getAttribute( 'texture' ), texcoord: child.getAttribute( 'texcoord' ), extra: parseEffectParameterTexture( child ) };\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction buildEffect( data ) {\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction getEffect( id ) {\n\n\t\t\treturn getBuild( library.effects[ id ], buildEffect );\n\n\t\t}\n\n\t\t// material\n\n\t\tfunction parseMaterial( xml ) {\n\n\t\t\tconst data = {\n\t\t\t\tname: xml.getAttribute( 'name' )\n\t\t\t};\n\n\t\t\tfor ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'instance_effect':\n\t\t\t\t\t\tdata.url = parseId( child.getAttribute( 'url' ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlibrary.materials[ xml.getAttribute( 'id' ) ] = data;\n\n\t\t}\n\n\t\tfunction getTextureLoader( image ) {\n\n\t\t\tlet loader;\n\n\t\t\tlet extension = image.slice( ( image.lastIndexOf( '.' ) - 1 >>> 0 ) + 2 ); // http://www.jstips.co/en/javascript/get-file-extension/\n\t\t\textension = extension.toLowerCase();\n\n\t\t\tswitch ( extension ) {\n\n\t\t\t\tcase 'tga':\n\t\t\t\t\tloader = tgaLoader;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tloader = textureLoader;\n\n\t\t\t}\n\n\t\t\treturn loader;\n\n\t\t}\n\n\t\tfunction buildMaterial( data ) {\n\n\t\t\tconst effect = getEffect( data.url );\n\t\t\tconst technique = effect.profile.technique;\n\n\t\t\tlet material;\n\n\t\t\tswitch ( technique.type ) {\n\n\t\t\t\tcase 'phong':\n\t\t\t\tcase 'blinn':\n\t\t\t\t\tmaterial = new MeshPhongMaterial();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'lambert':\n\t\t\t\t\tmaterial = new MeshLambertMaterial();\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tmaterial = new MeshBasicMaterial();\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tmaterial.name = data.name || '';\n\n\t\t\tfunction getTexture( textureObject, colorSpace = null ) {\n\n\t\t\t\tconst sampler = effect.profile.samplers[ textureObject.id ];\n\t\t\t\tlet image = null;\n\n\t\t\t\t// get image\n\n\t\t\t\tif ( sampler !== undefined ) {\n\n\t\t\t\t\tconst surface = effect.profile.surfaces[ sampler.source ];\n\t\t\t\t\timage = getImage( surface.init_from );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Undefined sampler. Access image directly (see #12530).' );\n\t\t\t\t\timage = getImage( textureObject.id );\n\n\t\t\t\t}\n\n\t\t\t\t// create texture if image is available\n\n\t\t\t\tif ( image !== null ) {\n\n\t\t\t\t\tconst loader = getTextureLoader( image );\n\n\t\t\t\t\tif ( loader !== undefined ) {\n\n\t\t\t\t\t\tconst texture = loader.load( image );\n\n\t\t\t\t\t\tconst extra = textureObject.extra;\n\n\t\t\t\t\t\tif ( extra !== undefined && extra.technique !== undefined && isEmpty( extra.technique ) === false ) {\n\n\t\t\t\t\t\t\tconst technique = extra.technique;\n\n\t\t\t\t\t\t\ttexture.wrapS = technique.wrapU ? RepeatWrapping : ClampToEdgeWrapping;\n\t\t\t\t\t\t\ttexture.wrapT = technique.wrapV ? RepeatWrapping : ClampToEdgeWrapping;\n\n\t\t\t\t\t\t\ttexture.offset.set( technique.offsetU || 0, technique.offsetV || 0 );\n\t\t\t\t\t\t\ttexture.repeat.set( technique.repeatU || 1, technique.repeatV || 1 );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ttexture.wrapS = RepeatWrapping;\n\t\t\t\t\t\t\ttexture.wrapT = RepeatWrapping;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( colorSpace !== null ) {\n\n\t\t\t\t\t\t\ttexture.colorSpace = colorSpace;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn texture;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Loader for texture %s not found.', image );\n\n\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Couldn\\'t create texture with ID:', textureObject.id );\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst parameters = technique.parameters;\n\n\t\t\tfor ( const key in parameters ) {\n\n\t\t\t\tconst parameter = parameters[ key ];\n\n\t\t\t\tswitch ( key ) {\n\n\t\t\t\t\tcase 'diffuse':\n\t\t\t\t\t\tif ( parameter.color ) material.color.fromArray( parameter.color );\n\t\t\t\t\t\tif ( parameter.texture ) material.map = getTexture( parameter.texture, SRGBColorSpace );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'specular':\n\t\t\t\t\t\tif ( parameter.color && material.specular ) material.specular.fromArray( parameter.color );\n\t\t\t\t\t\tif ( parameter.texture ) material.specularMap = getTexture( parameter.texture );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'bump':\n\t\t\t\t\t\tif ( parameter.texture ) material.normalMap = getTexture( parameter.texture );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'ambient':\n\t\t\t\t\t\tif ( parameter.texture ) material.lightMap = getTexture( parameter.texture, SRGBColorSpace );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'shininess':\n\t\t\t\t\t\tif ( parameter.float && material.shininess ) material.shininess = parameter.float;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'emission':\n\t\t\t\t\t\tif ( parameter.color && material.emissive ) material.emissive.fromArray( parameter.color );\n\t\t\t\t\t\tif ( parameter.texture ) material.emissiveMap = getTexture( parameter.texture, SRGBColorSpace );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tColorManagement.colorSpaceToWorking( material.color, SRGBColorSpace );\n\t\t\tif ( material.specular ) ColorManagement.colorSpaceToWorking( material.specular, SRGBColorSpace );\n\t\t\tif ( material.emissive ) ColorManagement.colorSpaceToWorking( material.emissive, SRGBColorSpace );\n\n\t\t\t//\n\n\t\t\tlet transparent = parameters[ 'transparent' ];\n\t\t\tlet transparency = parameters[ 'transparency' ];\n\n\t\t\t// <transparency> does not exist but <transparent>\n\n\t\t\tif ( transparency === undefined && transparent ) {\n\n\t\t\t\ttransparency = {\n\t\t\t\t\tfloat: 1\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\t// <transparent> does not exist but <transparency>\n\n\t\t\tif ( transparent === undefined && transparency ) {\n\n\t\t\t\ttransparent = {\n\t\t\t\t\topaque: 'A_ONE',\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tcolor: [ 1, 1, 1, 1 ]\n\t\t\t\t\t} };\n\n\t\t\t}\n\n\t\t\tif ( transparent && transparency ) {\n\n\t\t\t\t// handle case if a texture exists but no color\n\n\t\t\t\tif ( transparent.data.texture ) {\n\n\t\t\t\t\t// we do not set an alpha map (see #13792)\n\n\t\t\t\t\tmaterial.transparent = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst color = transparent.data.color;\n\n\t\t\t\t\tswitch ( transparent.opaque ) {\n\n\t\t\t\t\t\tcase 'A_ONE':\n\t\t\t\t\t\t\tmaterial.opacity = color[ 3 ] * transparency.float;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'RGB_ZERO':\n\t\t\t\t\t\t\tmaterial.opacity = 1 - ( color[ 0 ] * transparency.float );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'A_ZERO':\n\t\t\t\t\t\t\tmaterial.opacity = 1 - ( color[ 3 ] * transparency.float );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'RGB_ONE':\n\t\t\t\t\t\t\tmaterial.opacity = color[ 0 ] * transparency.float;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Invalid opaque type \"%s\" of transparent tag.', transparent.opaque );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( material.opacity < 1 ) material.transparent = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\n\t\t\tif ( technique.extra !== undefined && technique.extra.technique !== undefined ) {\n\n\t\t\t\tconst techniques = technique.extra.technique;\n\n\t\t\t\tfor ( const k in techniques ) {\n\n\t\t\t\t\tconst v = techniques[ k ];\n\n\t\t\t\t\tswitch ( k ) {\n\n\t\t\t\t\t\tcase 'double_sided':\n\t\t\t\t\t\t\tmaterial.side = ( v === 1 ? DoubleSide : FrontSide );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'bump':\n\t\t\t\t\t\t\tmaterial.normalMap = getTexture( v.texture );\n\t\t\t\t\t\t\tmaterial.normalScale = new Vector2( 1, 1 );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn material;\n\n\t\t}\n\n\t\tfunction getMaterial( id ) {\n\n\t\t\treturn getBuild( library.materials[ id ], buildMaterial );\n\n\t\t}\n\n\t\t// camera\n\n\t\tfunction parseCamera( xml ) {\n\n\t\t\tconst data = {\n\t\t\t\tname: xml.getAttribute( 'name' )\n\t\t\t};\n\n\t\t\tfor ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'optics':\n\t\t\t\t\t\tdata.optics = parseCameraOptics( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlibrary.cameras[ xml.getAttribute( 'id' ) ] = data;\n\n\t\t}\n\n\t\tfunction parseCameraOptics( xml ) {\n\n\t\t\tfor ( let i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'technique_common':\n\t\t\t\t\t\treturn parseCameraTechnique( child );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {};\n\n\t\t}\n\n\t\tfunction parseCameraTechnique( xml ) {\n\n\t\t\tconst data = {};\n\n\t\t\tfor ( let i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'perspective':\n\t\t\t\t\tcase 'orthographic':\n\n\t\t\t\t\t\tdata.technique = child.nodeName;\n\t\t\t\t\t\tdata.parameters = parseCameraParameters( child );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseCameraParameters( xml ) {\n\n\t\t\tconst data = {};\n\n\t\t\tfor ( let i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'xfov':\n\t\t\t\t\tcase 'yfov':\n\t\t\t\t\tcase 'xmag':\n\t\t\t\t\tcase 'ymag':\n\t\t\t\t\tcase 'znear':\n\t\t\t\t\tcase 'zfar':\n\t\t\t\t\tcase 'aspect_ratio':\n\t\t\t\t\t\tdata[ child.nodeName ] = parseFloat( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction buildCamera( data ) {\n\n\t\t\tlet camera;\n\n\t\t\tswitch ( data.optics.technique ) {\n\n\t\t\t\tcase 'perspective':\n\t\t\t\t\tcamera = new PerspectiveCamera(\n\t\t\t\t\t\tdata.optics.parameters.yfov,\n\t\t\t\t\t\tdata.optics.parameters.aspect_ratio,\n\t\t\t\t\t\tdata.optics.parameters.znear,\n\t\t\t\t\t\tdata.optics.parameters.zfar\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'orthographic':\n\t\t\t\t\tlet ymag = data.optics.parameters.ymag;\n\t\t\t\t\tlet xmag = data.optics.parameters.xmag;\n\t\t\t\t\tconst aspectRatio = data.optics.parameters.aspect_ratio;\n\n\t\t\t\t\txmag = ( xmag === undefined ) ? ( ymag * aspectRatio ) : xmag;\n\t\t\t\t\tymag = ( ymag === undefined ) ? ( xmag / aspectRatio ) : ymag;\n\n\t\t\t\t\txmag *= 0.5;\n\t\t\t\t\tymag *= 0.5;\n\n\t\t\t\t\tcamera = new OrthographicCamera(\n\t\t\t\t\t\t- xmag, xmag, ymag, - ymag, // left, right, top, bottom\n\t\t\t\t\t\tdata.optics.parameters.znear,\n\t\t\t\t\t\tdata.optics.parameters.zfar\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tcamera = new PerspectiveCamera();\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tcamera.name = data.name || '';\n\n\t\t\treturn camera;\n\n\t\t}\n\n\t\tfunction getCamera( id ) {\n\n\t\t\tconst data = library.cameras[ id ];\n\n\t\t\tif ( data !== undefined ) {\n\n\t\t\t\treturn getBuild( data, buildCamera );\n\n\t\t\t}\n\n\t\t\tconsole.warn( 'THREE.ColladaLoader: Couldn\\'t find camera with ID:', id );\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// light\n\n\t\tfunction parseLight( xml ) {\n\n\t\t\tlet data = {};\n\n\t\t\tfor ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'technique_common':\n\t\t\t\t\t\tdata = parseLightTechnique( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlibrary.lights[ xml.getAttribute( 'id' ) ] = data;\n\n\t\t}\n\n\t\tfunction parseLightTechnique( xml ) {\n\n\t\t\tconst data = {};\n\n\t\t\tfor ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'directional':\n\t\t\t\t\tcase 'point':\n\t\t\t\t\tcase 'spot':\n\t\t\t\t\tcase 'ambient':\n\n\t\t\t\t\t\tdata.technique = child.nodeName;\n\t\t\t\t\t\tdata.parameters = parseLightParameters( child );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseLightParameters( xml ) {\n\n\t\t\tconst data = {};\n\n\t\t\tfor ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'color':\n\t\t\t\t\t\tconst array = parseFloats( child.textContent );\n\t\t\t\t\t\tdata.color = new Color().fromArray( array );\n\t\t\t\t\t\tColorManagement.colorSpaceToWorking( data.color, SRGBColorSpace );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'falloff_angle':\n\t\t\t\t\t\tdata.falloffAngle = parseFloat( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'quadratic_attenuation':\n\t\t\t\t\t\tconst f = parseFloat( child.textContent );\n\t\t\t\t\t\tdata.distance = f ? Math.sqrt( 1 / f ) : 0;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction buildLight( data ) {\n\n\t\t\tlet light;\n\n\t\t\tswitch ( data.technique ) {\n\n\t\t\t\tcase 'directional':\n\t\t\t\t\tlight = new DirectionalLight();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'point':\n\t\t\t\t\tlight = new PointLight();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'spot':\n\t\t\t\t\tlight = new SpotLight();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ambient':\n\t\t\t\t\tlight = new AmbientLight();\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( data.parameters.color ) light.color.copy( data.parameters.color );\n\t\t\tif ( data.parameters.distance ) light.distance = data.parameters.distance;\n\n\t\t\treturn light;\n\n\t\t}\n\n\t\tfunction getLight( id ) {\n\n\t\t\tconst data = library.lights[ id ];\n\n\t\t\tif ( data !== undefined ) {\n\n\t\t\t\treturn getBuild( data, buildLight );\n\n\t\t\t}\n\n\t\t\tconsole.warn( 'THREE.ColladaLoader: Couldn\\'t find light with ID:', id );\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// geometry\n\n\t\tfunction parseGeometry( xml ) {\n\n\t\t\tconst data = {\n\t\t\t\tname: xml.getAttribute( 'name' ),\n\t\t\t\tsources: {},\n\t\t\t\tvertices: {},\n\t\t\t\tprimitives: []\n\t\t\t};\n\n\t\t\tconst mesh = getElementsByTagName( xml, 'mesh' )[ 0 ];\n\n\t\t\t// the following tags inside geometry are not supported yet (see https://github.com/mrdoob/three.js/pull/12606): convex_mesh, spline, brep\n\t\t\tif ( mesh === undefined ) return;\n\n\t\t\tfor ( let i = 0; i < mesh.childNodes.length; i ++ ) {\n\n\t\t\t\tconst child = mesh.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tconst id = child.getAttribute( 'id' );\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'source':\n\t\t\t\t\t\tdata.sources[ id ] = parseSource( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'vertices':\n\t\t\t\t\t\t// data.sources[ id ] = data.sources[ parseId( getElementsByTagName( child, 'input' )[ 0 ].getAttribute( 'source' ) ) ];\n\t\t\t\t\t\tdata.vertices = parseGeometryVertices( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'polygons':\n\t\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Unsupported primitive type: ', child.nodeName );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'lines':\n\t\t\t\t\tcase 'linestrips':\n\t\t\t\t\tcase 'polylist':\n\t\t\t\t\tcase 'triangles':\n\t\t\t\t\t\tdata.primitives.push( parseGeometryPrimitive( child ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.log( child );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlibrary.geometries[ xml.getAttribute( 'id' ) ] = data;\n\n\t\t}\n\n\t\tfunction parseSource( xml ) {\n\n\t\t\tconst data = {\n\t\t\t\tarray: [],\n\t\t\t\tstride: 3\n\t\t\t};\n\n\t\t\tfor ( let i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'float_array':\n\t\t\t\t\t\tdata.array = parseFloats( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Name_array':\n\t\t\t\t\t\tdata.array = parseStrings( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'technique_common':\n\t\t\t\t\t\tconst accessor = getElementsByTagName( child, 'accessor' )[ 0 ];\n\n\t\t\t\t\t\tif ( accessor !== undefined ) {\n\n\t\t\t\t\t\t\tdata.stride = parseInt( accessor.getAttribute( 'stride' ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseGeometryVertices( xml ) {\n\n\t\t\tconst data = {};\n\n\t\t\tfor ( let i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tdata[ child.getAttribute( 'semantic' ) ] = parseId( child.getAttribute( 'source' ) );\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseGeometryPrimitive( xml ) {\n\n\t\t\tconst primitive = {\n\t\t\t\ttype: xml.nodeName,\n\t\t\t\tmaterial: xml.getAttribute( 'material' ),\n\t\t\t\tcount: parseInt( xml.getAttribute( 'count' ) ),\n\t\t\t\tinputs: {},\n\t\t\t\tstride: 0,\n\t\t\t\thasUV: false\n\t\t\t};\n\n\t\t\tfor ( let i = 0, l = xml.childNodes.length; i < l; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'input':\n\t\t\t\t\t\tconst id = parseId( child.getAttribute( 'source' ) );\n\t\t\t\t\t\tconst semantic = child.getAttribute( 'semantic' );\n\t\t\t\t\t\tconst offset = parseInt( child.getAttribute( 'offset' ) );\n\t\t\t\t\t\tconst set = parseInt( child.getAttribute( 'set' ) );\n\t\t\t\t\t\tconst inputname = ( set > 0 ? semantic + set : semantic );\n\t\t\t\t\t\tprimitive.inputs[ inputname ] = { id: id, offset: offset };\n\t\t\t\t\t\tprimitive.stride = Math.max( primitive.stride, offset + 1 );\n\t\t\t\t\t\tif ( semantic === 'TEXCOORD' ) primitive.hasUV = true;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'vcount':\n\t\t\t\t\t\tprimitive.vcount = parseInts( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'p':\n\t\t\t\t\t\tprimitive.p = parseInts( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn primitive;\n\n\t\t}\n\n\t\tfunction groupPrimitives( primitives ) {\n\n\t\t\tconst build = {};\n\n\t\t\tfor ( let i = 0; i < primitives.length; i ++ ) {\n\n\t\t\t\tconst primitive = primitives[ i ];\n\n\t\t\t\tif ( build[ primitive.type ] === undefined ) build[ primitive.type ] = [];\n\n\t\t\t\tbuild[ primitive.type ].push( primitive );\n\n\t\t\t}\n\n\t\t\treturn build;\n\n\t\t}\n\n\t\tfunction checkUVCoordinates( primitives ) {\n\n\t\t\tlet count = 0;\n\n\t\t\tfor ( let i = 0, l = primitives.length; i < l; i ++ ) {\n\n\t\t\t\tconst primitive = primitives[ i ];\n\n\t\t\t\tif ( primitive.hasUV === true ) {\n\n\t\t\t\t\tcount ++;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( count > 0 && count < primitives.length ) {\n\n\t\t\t\tprimitives.uvsNeedsFix = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction buildGeometry( data ) {\n\n\t\t\tconst build = {};\n\n\t\t\tconst sources = data.sources;\n\t\t\tconst vertices = data.vertices;\n\t\t\tconst primitives = data.primitives;\n\n\t\t\tif ( primitives.length === 0 ) return {};\n\n\t\t\t// our goal is to create one buffer geometry for a single type of primitives\n\t\t\t// first, we group all primitives by their type\n\n\t\t\tconst groupedPrimitives = groupPrimitives( primitives );\n\n\t\t\tfor ( const type in groupedPrimitives ) {\n\n\t\t\t\tconst primitiveType = groupedPrimitives[ type ];\n\n\t\t\t\t// second, ensure consistent uv coordinates for each type of primitives (polylist,triangles or lines)\n\n\t\t\t\tcheckUVCoordinates( primitiveType );\n\n\t\t\t\t// third, create a buffer geometry for each type of primitives\n\n\t\t\t\tbuild[ type ] = buildGeometryType( primitiveType, sources, vertices );\n\n\t\t\t}\n\n\t\t\treturn build;\n\n\t\t}\n\n\t\tfunction buildGeometryType( primitives, sources, vertices ) {\n\n\t\t\tconst build = {};\n\n\t\t\tconst position = { array: [], stride: 0 };\n\t\t\tconst normal = { array: [], stride: 0 };\n\t\t\tconst uv = { array: [], stride: 0 };\n\t\t\tconst uv1 = { array: [], stride: 0 };\n\t\t\tconst color = { array: [], stride: 0 };\n\n\t\t\tconst skinIndex = { array: [], stride: 4 };\n\t\t\tconst skinWeight = { array: [], stride: 4 };\n\n\t\t\tconst geometry = new BufferGeometry();\n\n\t\t\tconst materialKeys = [];\n\n\t\t\tlet start = 0;\n\n\t\t\tfor ( let p = 0; p < primitives.length; p ++ ) {\n\n\t\t\t\tconst primitive = primitives[ p ];\n\t\t\t\tconst inputs = primitive.inputs;\n\n\t\t\t\t// groups\n\n\t\t\t\tlet count = 0;\n\n\t\t\t\tswitch ( primitive.type ) {\n\n\t\t\t\t\tcase 'lines':\n\t\t\t\t\tcase 'linestrips':\n\t\t\t\t\t\tcount = primitive.count * 2;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'triangles':\n\t\t\t\t\t\tcount = primitive.count * 3;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'polylist':\n\n\t\t\t\t\t\tfor ( let g = 0; g < primitive.count; g ++ ) {\n\n\t\t\t\t\t\t\tconst vc = primitive.vcount[ g ];\n\n\t\t\t\t\t\t\tswitch ( vc ) {\n\n\t\t\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\t\t\tcount += 3; // single triangle\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase 4:\n\t\t\t\t\t\t\t\t\tcount += 6; // quad, subdivided into two triangles\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\tcount += ( vc - 2 ) * 3; // polylist with more than four vertices\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Unknown primitive type:', primitive.type );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.addGroup( start, count, p );\n\t\t\t\tstart += count;\n\n\t\t\t\t// material\n\n\t\t\t\tif ( primitive.material ) {\n\n\t\t\t\t\tmaterialKeys.push( primitive.material );\n\n\t\t\t\t}\n\n\t\t\t\t// geometry data\n\n\t\t\t\tfor ( const name in inputs ) {\n\n\t\t\t\t\tconst input = inputs[ name ];\n\n\t\t\t\t\tswitch ( name )\t{\n\n\t\t\t\t\t\tcase 'VERTEX':\n\t\t\t\t\t\t\tfor ( const key in vertices ) {\n\n\t\t\t\t\t\t\t\tconst id = vertices[ key ];\n\n\t\t\t\t\t\t\t\tswitch ( key ) {\n\n\t\t\t\t\t\t\t\t\tcase 'POSITION':\n\t\t\t\t\t\t\t\t\t\tconst prevLength = position.array.length;\n\t\t\t\t\t\t\t\t\t\tbuildGeometryData( primitive, sources[ id ], input.offset, position.array );\n\t\t\t\t\t\t\t\t\t\tposition.stride = sources[ id ].stride;\n\n\t\t\t\t\t\t\t\t\t\tif ( sources.skinWeights && sources.skinIndices ) {\n\n\t\t\t\t\t\t\t\t\t\t\tbuildGeometryData( primitive, sources.skinIndices, input.offset, skinIndex.array );\n\t\t\t\t\t\t\t\t\t\t\tbuildGeometryData( primitive, sources.skinWeights, input.offset, skinWeight.array );\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// see #3803\n\n\t\t\t\t\t\t\t\t\t\tif ( primitive.hasUV === false && primitives.uvsNeedsFix === true ) {\n\n\t\t\t\t\t\t\t\t\t\t\tconst count = ( position.array.length - prevLength ) / position.stride;\n\n\t\t\t\t\t\t\t\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// fill missing uv coordinates\n\n\t\t\t\t\t\t\t\t\t\t\t\tuv.array.push( 0, 0 );\n\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\tcase 'NORMAL':\n\t\t\t\t\t\t\t\t\t\tbuildGeometryData( primitive, sources[ id ], input.offset, normal.array );\n\t\t\t\t\t\t\t\t\t\tnormal.stride = sources[ id ].stride;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\tcase 'COLOR':\n\t\t\t\t\t\t\t\t\t\tbuildGeometryData( primitive, sources[ id ], input.offset, color.array );\n\t\t\t\t\t\t\t\t\t\tcolor.stride = sources[ id ].stride;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\tcase 'TEXCOORD':\n\t\t\t\t\t\t\t\t\t\tbuildGeometryData( primitive, sources[ id ], input.offset, uv.array );\n\t\t\t\t\t\t\t\t\t\tuv.stride = sources[ id ].stride;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\tcase 'TEXCOORD1':\n\t\t\t\t\t\t\t\t\t\tbuildGeometryData( primitive, sources[ id ], input.offset, uv1.array );\n\t\t\t\t\t\t\t\t\t\tuv.stride = sources[ id ].stride;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Semantic \"%s\" not handled in geometry build process.', key );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'NORMAL':\n\t\t\t\t\t\t\tbuildGeometryData( primitive, sources[ input.id ], input.offset, normal.array );\n\t\t\t\t\t\t\tnormal.stride = sources[ input.id ].stride;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'COLOR':\n\t\t\t\t\t\t\tbuildGeometryData( primitive, sources[ input.id ], input.offset, color.array, true );\n\t\t\t\t\t\t\tcolor.stride = sources[ input.id ].stride;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'TEXCOORD':\n\t\t\t\t\t\t\tbuildGeometryData( primitive, sources[ input.id ], input.offset, uv.array );\n\t\t\t\t\t\t\tuv.stride = sources[ input.id ].stride;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'TEXCOORD1':\n\t\t\t\t\t\t\tbuildGeometryData( primitive, sources[ input.id ], input.offset, uv1.array );\n\t\t\t\t\t\t\tuv1.stride = sources[ input.id ].stride;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// build geometry\n\n\t\t\tif ( position.array.length > 0 ) geometry.setAttribute( 'position', new Float32BufferAttribute( position.array, position.stride ) );\n\t\t\tif ( normal.array.length > 0 ) geometry.setAttribute( 'normal', new Float32BufferAttribute( normal.array, normal.stride ) );\n\t\t\tif ( color.array.length > 0 ) geometry.setAttribute( 'color', new Float32BufferAttribute( color.array, color.stride ) );\n\t\t\tif ( uv.array.length > 0 ) geometry.setAttribute( 'uv', new Float32BufferAttribute( uv.array, uv.stride ) );\n\t\t\tif ( uv1.array.length > 0 ) geometry.setAttribute( 'uv1', new Float32BufferAttribute( uv1.array, uv1.stride ) );\n\n\t\t\tif ( skinIndex.array.length > 0 ) geometry.setAttribute( 'skinIndex', new Float32BufferAttribute( skinIndex.array, skinIndex.stride ) );\n\t\t\tif ( skinWeight.array.length > 0 ) geometry.setAttribute( 'skinWeight', new Float32BufferAttribute( skinWeight.array, skinWeight.stride ) );\n\n\t\t\tbuild.data = geometry;\n\t\t\tbuild.type = primitives[ 0 ].type;\n\t\t\tbuild.materialKeys = materialKeys;\n\n\t\t\treturn build;\n\n\t\t}\n\n\t\tfunction buildGeometryData( primitive, source, offset, array, isColor = false ) {\n\n\t\t\tconst indices = primitive.p;\n\t\t\tconst stride = primitive.stride;\n\t\t\tconst vcount = primitive.vcount;\n\n\t\t\tfunction pushVector( i ) {\n\n\t\t\t\tlet index = indices[ i + offset ] * sourceStride;\n\t\t\t\tconst length = index + sourceStride;\n\n\t\t\t\tfor ( ; index < length; index ++ ) {\n\n\t\t\t\t\tarray.push( sourceArray[ index ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( isColor ) {\n\n\t\t\t\t\t// convert the vertex colors from srgb to linear if present\n\t\t\t\t\tconst startIndex = array.length - sourceStride - 1;\n\t\t\t\t\ttempColor.setRGB(\n\t\t\t\t\t\tarray[ startIndex + 0 ],\n\t\t\t\t\t\tarray[ startIndex + 1 ],\n\t\t\t\t\t\tarray[ startIndex + 2 ],\n\t\t\t\t\t\tSRGBColorSpace\n\t\t\t\t\t);\n\n\t\t\t\t\tarray[ startIndex + 0 ] = tempColor.r;\n\t\t\t\t\tarray[ startIndex + 1 ] = tempColor.g;\n\t\t\t\t\tarray[ startIndex + 2 ] = tempColor.b;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst sourceArray = source.array;\n\t\t\tconst sourceStride = source.stride;\n\n\t\t\tif ( primitive.vcount !== undefined ) {\n\n\t\t\t\tlet index = 0;\n\n\t\t\t\tfor ( let i = 0, l = vcount.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst count = vcount[ i ];\n\n\t\t\t\t\tif ( count === 4 ) {\n\n\t\t\t\t\t\tconst a = index + stride * 0;\n\t\t\t\t\t\tconst b = index + stride * 1;\n\t\t\t\t\t\tconst c = index + stride * 2;\n\t\t\t\t\t\tconst d = index + stride * 3;\n\n\t\t\t\t\t\tpushVector( a ); pushVector( b ); pushVector( d );\n\t\t\t\t\t\tpushVector( b ); pushVector( c ); pushVector( d );\n\n\t\t\t\t\t} else if ( count === 3 ) {\n\n\t\t\t\t\t\tconst a = index + stride * 0;\n\t\t\t\t\t\tconst b = index + stride * 1;\n\t\t\t\t\t\tconst c = index + stride * 2;\n\n\t\t\t\t\t\tpushVector( a ); pushVector( b ); pushVector( c );\n\n\t\t\t\t\t} else if ( count > 4 ) {\n\n\t\t\t\t\t\tfor ( let k = 1, kl = ( count - 2 ); k <= kl; k ++ ) {\n\n\t\t\t\t\t\t\tconst a = index + stride * 0;\n\t\t\t\t\t\t\tconst b = index + stride * k;\n\t\t\t\t\t\t\tconst c = index + stride * ( k + 1 );\n\n\t\t\t\t\t\t\tpushVector( a ); pushVector( b ); pushVector( c );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tindex += stride * count;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( let i = 0, l = indices.length; i < l; i += stride ) {\n\n\t\t\t\t\tpushVector( i );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getGeometry( id ) {\n\n\t\t\treturn getBuild( library.geometries[ id ], buildGeometry );\n\n\t\t}\n\n\t\t// kinematics\n\n\t\tfunction parseKinematicsModel( xml ) {\n\n\t\t\tconst data = {\n\t\t\t\tname: xml.getAttribute( 'name' ) || '',\n\t\t\t\tjoints: {},\n\t\t\t\tlinks: []\n\t\t\t};\n\n\t\t\tfor ( let i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'technique_common':\n\t\t\t\t\t\tparseKinematicsTechniqueCommon( child, data );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlibrary.kinematicsModels[ xml.getAttribute( 'id' ) ] = data;\n\n\t\t}\n\n\t\tfunction buildKinematicsModel( data ) {\n\n\t\t\tif ( data.build !== undefined ) return data.build;\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction getKinematicsModel( id ) {\n\n\t\t\treturn getBuild( library.kinematicsModels[ id ], buildKinematicsModel );\n\n\t\t}\n\n\t\tfunction parseKinematicsTechniqueCommon( xml, data ) {\n\n\t\t\tfor ( let i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'joint':\n\t\t\t\t\t\tdata.joints[ child.getAttribute( 'sid' ) ] = parseKinematicsJoint( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'link':\n\t\t\t\t\t\tdata.links.push( parseKinematicsLink( child ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseKinematicsJoint( xml ) {\n\n\t\t\tlet data;\n\n\t\t\tfor ( let i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'prismatic':\n\t\t\t\t\tcase 'revolute':\n\t\t\t\t\t\tdata = parseKinematicsJointParameter( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseKinematicsJointParameter( xml ) {\n\n\t\t\tconst data = {\n\t\t\t\tsid: xml.getAttribute( 'sid' ),\n\t\t\t\tname: xml.getAttribute( 'name' ) || '',\n\t\t\t\taxis: new Vector3(),\n\t\t\t\tlimits: {\n\t\t\t\t\tmin: 0,\n\t\t\t\t\tmax: 0\n\t\t\t\t},\n\t\t\t\ttype: xml.nodeName,\n\t\t\t\tstatic: false,\n\t\t\t\tzeroPosition: 0,\n\t\t\t\tmiddlePosition: 0\n\t\t\t};\n\n\t\t\tfor ( let i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'axis':\n\t\t\t\t\t\tconst array = parseFloats( child.textContent );\n\t\t\t\t\t\tdata.axis.fromArray( array );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'limits':\n\t\t\t\t\t\tconst max = child.getElementsByTagName( 'max' )[ 0 ];\n\t\t\t\t\t\tconst min = child.getElementsByTagName( 'min' )[ 0 ];\n\n\t\t\t\t\t\tdata.limits.max = parseFloat( max.textContent );\n\t\t\t\t\t\tdata.limits.min = parseFloat( min.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// if min is equal to or greater than max, consider the joint static\n\n\t\t\tif ( data.limits.min >= data.limits.max ) {\n\n\t\t\t\tdata.static = true;\n\n\t\t\t}\n\n\t\t\t// calculate middle position\n\n\t\t\tdata.middlePosition = ( data.limits.min + data.limits.max ) / 2.0;\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseKinematicsLink( xml ) {\n\n\t\t\tconst data = {\n\t\t\t\tsid: xml.getAttribute( 'sid' ),\n\t\t\t\tname: xml.getAttribute( 'name' ) || '',\n\t\t\t\tattachments: [],\n\t\t\t\ttransforms: []\n\t\t\t};\n\n\t\t\tfor ( let i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'attachment_full':\n\t\t\t\t\t\tdata.attachments.push( parseKinematicsAttachment( child ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'matrix':\n\t\t\t\t\tcase 'translate':\n\t\t\t\t\tcase 'rotate':\n\t\t\t\t\t\tdata.transforms.push( parseKinematicsTransform( child ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseKinematicsAttachment( xml ) {\n\n\t\t\tconst data = {\n\t\t\t\tjoint: xml.getAttribute( 'joint' ).split( '/' ).pop(),\n\t\t\t\ttransforms: [],\n\t\t\t\tlinks: []\n\t\t\t};\n\n\t\t\tfor ( let i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'link':\n\t\t\t\t\t\tdata.links.push( parseKinematicsLink( child ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'matrix':\n\t\t\t\t\tcase 'translate':\n\t\t\t\t\tcase 'rotate':\n\t\t\t\t\t\tdata.transforms.push( parseKinematicsTransform( child ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseKinematicsTransform( xml ) {\n\n\t\t\tconst data = {\n\t\t\t\ttype: xml.nodeName\n\t\t\t};\n\n\t\t\tconst array = parseFloats( xml.textContent );\n\n\t\t\tswitch ( data.type ) {\n\n\t\t\t\tcase 'matrix':\n\t\t\t\t\tdata.obj = new Matrix4();\n\t\t\t\t\tdata.obj.fromArray( array ).transpose();\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'translate':\n\t\t\t\t\tdata.obj = new Vector3();\n\t\t\t\t\tdata.obj.fromArray( array );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'rotate':\n\t\t\t\t\tdata.obj = new Vector3();\n\t\t\t\t\tdata.obj.fromArray( array );\n\t\t\t\t\tdata.angle = MathUtils.degToRad( array[ 3 ] );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\t// physics\n\n\t\tfunction parsePhysicsModel( xml ) {\n\n\t\t\tconst data = {\n\t\t\t\tname: xml.getAttribute( 'name' ) || '',\n\t\t\t\trigidBodies: {}\n\t\t\t};\n\n\t\t\tfor ( let i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'rigid_body':\n\t\t\t\t\t\tdata.rigidBodies[ child.getAttribute( 'name' ) ] = {};\n\t\t\t\t\t\tparsePhysicsRigidBody( child, data.rigidBodies[ child.getAttribute( 'name' ) ] );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlibrary.physicsModels[ xml.getAttribute( 'id' ) ] = data;\n\n\t\t}\n\n\t\tfunction parsePhysicsRigidBody( xml, data ) {\n\n\t\t\tfor ( let i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'technique_common':\n\t\t\t\t\t\tparsePhysicsTechniqueCommon( child, data );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parsePhysicsTechniqueCommon( xml, data ) {\n\n\t\t\tfor ( let i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'inertia':\n\t\t\t\t\t\tdata.inertia = parseFloats( child.textContent );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'mass':\n\t\t\t\t\t\tdata.mass = parseFloats( child.textContent )[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// scene\n\n\t\tfunction parseKinematicsScene( xml ) {\n\n\t\t\tconst data = {\n\t\t\t\tbindJointAxis: []\n\t\t\t};\n\n\t\t\tfor ( let i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'bind_joint_axis':\n\t\t\t\t\t\tdata.bindJointAxis.push( parseKinematicsBindJointAxis( child ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlibrary.kinematicsScenes[ parseId( xml.getAttribute( 'url' ) ) ] = data;\n\n\t\t}\n\n\t\tfunction parseKinematicsBindJointAxis( xml ) {\n\n\t\t\tconst data = {\n\t\t\t\ttarget: xml.getAttribute( 'target' ).split( '/' ).pop()\n\t\t\t};\n\n\t\t\tfor ( let i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'axis':\n\t\t\t\t\t\tconst param = child.getElementsByTagName( 'param' )[ 0 ];\n\t\t\t\t\t\tdata.axis = param.textContent;\n\t\t\t\t\t\tconst tmpJointIndex = data.axis.split( 'inst_' ).pop().split( 'axis' )[ 0 ];\n\t\t\t\t\t\tdata.jointIndex = tmpJointIndex.substring( 0, tmpJointIndex.length - 1 );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction buildKinematicsScene( data ) {\n\n\t\t\tif ( data.build !== undefined ) return data.build;\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction getKinematicsScene( id ) {\n\n\t\t\treturn getBuild( library.kinematicsScenes[ id ], buildKinematicsScene );\n\n\t\t}\n\n\t\tfunction setupKinematics() {\n\n\t\t\tconst kinematicsModelId = Object.keys( library.kinematicsModels )[ 0 ];\n\t\t\tconst kinematicsSceneId = Object.keys( library.kinematicsScenes )[ 0 ];\n\t\t\tconst visualSceneId = Object.keys( library.visualScenes )[ 0 ];\n\n\t\t\tif ( kinematicsModelId === undefined || kinematicsSceneId === undefined ) return;\n\n\t\t\tconst kinematicsModel = getKinematicsModel( kinematicsModelId );\n\t\t\tconst kinematicsScene = getKinematicsScene( kinematicsSceneId );\n\t\t\tconst visualScene = getVisualScene( visualSceneId );\n\n\t\t\tconst bindJointAxis = kinematicsScene.bindJointAxis;\n\t\t\tconst jointMap = {};\n\n\t\t\tfor ( let i = 0, l = bindJointAxis.length; i < l; i ++ ) {\n\n\t\t\t\tconst axis = bindJointAxis[ i ];\n\n\t\t\t\t// the result of the following query is an element of type 'translate', 'rotate','scale' or 'matrix'\n\n\t\t\t\tconst targetElement = collada.querySelector( '[sid=\"' + axis.target + '\"]' );\n\n\t\t\t\tif ( targetElement ) {\n\n\t\t\t\t\t// get the parent of the transform element\n\n\t\t\t\t\tconst parentVisualElement = targetElement.parentElement;\n\n\t\t\t\t\t// connect the joint of the kinematics model with the element in the visual scene\n\n\t\t\t\t\tconnect( axis.jointIndex, parentVisualElement );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction connect( jointIndex, visualElement ) {\n\n\t\t\t\tconst visualElementName = visualElement.getAttribute( 'name' );\n\t\t\t\tconst joint = kinematicsModel.joints[ jointIndex ];\n\n\t\t\t\tvisualScene.traverse( function ( object ) {\n\n\t\t\t\t\tif ( object.name === visualElementName ) {\n\n\t\t\t\t\t\tjointMap[ jointIndex ] = {\n\t\t\t\t\t\t\tobject: object,\n\t\t\t\t\t\t\ttransforms: buildTransformList( visualElement ),\n\t\t\t\t\t\t\tjoint: joint,\n\t\t\t\t\t\t\tposition: joint.zeroPosition\n\t\t\t\t\t\t};\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tconst m0 = new Matrix4();\n\n\t\t\tkinematics = {\n\n\t\t\t\tjoints: kinematicsModel && kinematicsModel.joints,\n\n\t\t\t\tgetJointValue: function ( jointIndex ) {\n\n\t\t\t\t\tconst jointData = jointMap[ jointIndex ];\n\n\t\t\t\t\tif ( jointData ) {\n\n\t\t\t\t\t\treturn jointData.position;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Joint ' + jointIndex + ' doesn\\'t exist.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t},\n\n\t\t\t\tsetJointValue: function ( jointIndex, value ) {\n\n\t\t\t\t\tconst jointData = jointMap[ jointIndex ];\n\n\t\t\t\t\tif ( jointData ) {\n\n\t\t\t\t\t\tconst joint = jointData.joint;\n\n\t\t\t\t\t\tif ( value > joint.limits.max || value < joint.limits.min ) {\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Joint ' + jointIndex + ' value ' + value + ' outside of limits (min: ' + joint.limits.min + ', max: ' + joint.limits.max + ').' );\n\n\t\t\t\t\t\t} else if ( joint.static ) {\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Joint ' + jointIndex + ' is static.' );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tconst object = jointData.object;\n\t\t\t\t\t\t\tconst axis = joint.axis;\n\t\t\t\t\t\t\tconst transforms = jointData.transforms;\n\n\t\t\t\t\t\t\tmatrix.identity();\n\n\t\t\t\t\t\t\t// each update, we have to apply all transforms in the correct order\n\n\t\t\t\t\t\t\tfor ( let i = 0; i < transforms.length; i ++ ) {\n\n\t\t\t\t\t\t\t\tconst transform = transforms[ i ];\n\n\t\t\t\t\t\t\t\t// if there is a connection of the transform node with a joint, apply the joint value\n\n\t\t\t\t\t\t\t\tif ( transform.sid && transform.sid.indexOf( jointIndex ) !== - 1 ) {\n\n\t\t\t\t\t\t\t\t\tswitch ( joint.type ) {\n\n\t\t\t\t\t\t\t\t\t\tcase 'revolute':\n\t\t\t\t\t\t\t\t\t\t\tmatrix.multiply( m0.makeRotationAxis( axis, MathUtils.degToRad( value ) ) );\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tcase 'prismatic':\n\t\t\t\t\t\t\t\t\t\t\tmatrix.multiply( m0.makeTranslation( axis.x * value, axis.y * value, axis.z * value ) );\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Unknown joint type: ' + joint.type );\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tswitch ( transform.type ) {\n\n\t\t\t\t\t\t\t\t\t\tcase 'matrix':\n\t\t\t\t\t\t\t\t\t\t\tmatrix.multiply( transform.obj );\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tcase 'translate':\n\t\t\t\t\t\t\t\t\t\t\tmatrix.multiply( m0.makeTranslation( transform.obj.x, transform.obj.y, transform.obj.z ) );\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tcase 'scale':\n\t\t\t\t\t\t\t\t\t\t\tmatrix.scale( transform.obj );\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tcase 'rotate':\n\t\t\t\t\t\t\t\t\t\t\tmatrix.multiply( m0.makeRotationAxis( transform.obj, transform.angle ) );\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tobject.matrix.copy( matrix );\n\t\t\t\t\t\t\tobject.matrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t\t\t\t\t\tjointMap[ jointIndex ].position = value;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.log( 'THREE.ColladaLoader: ' + jointIndex + ' does not exist.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t}\n\n\t\tfunction buildTransformList( node ) {\n\n\t\t\tconst transforms = [];\n\n\t\t\tconst xml = collada.querySelector( '[id=\"' + node.id + '\"]' );\n\n\t\t\tfor ( let i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tlet array, vector;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'matrix':\n\t\t\t\t\t\tarray = parseFloats( child.textContent );\n\t\t\t\t\t\tconst matrix = new Matrix4().fromArray( array ).transpose();\n\t\t\t\t\t\ttransforms.push( {\n\t\t\t\t\t\t\tsid: child.getAttribute( 'sid' ),\n\t\t\t\t\t\t\ttype: child.nodeName,\n\t\t\t\t\t\t\tobj: matrix\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'translate':\n\t\t\t\t\tcase 'scale':\n\t\t\t\t\t\tarray = parseFloats( child.textContent );\n\t\t\t\t\t\tvector = new Vector3().fromArray( array );\n\t\t\t\t\t\ttransforms.push( {\n\t\t\t\t\t\t\tsid: child.getAttribute( 'sid' ),\n\t\t\t\t\t\t\ttype: child.nodeName,\n\t\t\t\t\t\t\tobj: vector\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'rotate':\n\t\t\t\t\t\tarray = parseFloats( child.textContent );\n\t\t\t\t\t\tvector = new Vector3().fromArray( array );\n\t\t\t\t\t\tconst angle = MathUtils.degToRad( array[ 3 ] );\n\t\t\t\t\t\ttransforms.push( {\n\t\t\t\t\t\t\tsid: child.getAttribute( 'sid' ),\n\t\t\t\t\t\t\ttype: child.nodeName,\n\t\t\t\t\t\t\tobj: vector,\n\t\t\t\t\t\t\tangle: angle\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn transforms;\n\n\t\t}\n\n\t\t// nodes\n\n\t\tfunction prepareNodes( xml ) {\n\n\t\t\tconst elements = xml.getElementsByTagName( 'node' );\n\n\t\t\t// ensure all node elements have id attributes\n\n\t\t\tfor ( let i = 0; i < elements.length; i ++ ) {\n\n\t\t\t\tconst element = elements[ i ];\n\n\t\t\t\tif ( element.hasAttribute( 'id' ) === false ) {\n\n\t\t\t\t\telement.setAttribute( 'id', generateId() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst matrix = new Matrix4();\n\t\tconst vector = new Vector3();\n\n\t\tfunction parseNode( xml ) {\n\n\t\t\tconst data = {\n\t\t\t\tname: xml.getAttribute( 'name' ) || '',\n\t\t\t\ttype: xml.getAttribute( 'type' ),\n\t\t\t\tid: xml.getAttribute( 'id' ),\n\t\t\t\tsid: xml.getAttribute( 'sid' ),\n\t\t\t\tmatrix: new Matrix4(),\n\t\t\t\tnodes: [],\n\t\t\t\tinstanceCameras: [],\n\t\t\t\tinstanceControllers: [],\n\t\t\t\tinstanceLights: [],\n\t\t\t\tinstanceGeometries: [],\n\t\t\t\tinstanceNodes: [],\n\t\t\t\ttransforms: {}\n\t\t\t};\n\n\t\t\tfor ( let i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tif ( child.nodeType !== 1 ) continue;\n\n\t\t\t\tlet array;\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'node':\n\t\t\t\t\t\tdata.nodes.push( child.getAttribute( 'id' ) );\n\t\t\t\t\t\tparseNode( child );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'instance_camera':\n\t\t\t\t\t\tdata.instanceCameras.push( parseId( child.getAttribute( 'url' ) ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'instance_controller':\n\t\t\t\t\t\tdata.instanceControllers.push( parseNodeInstance( child ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'instance_light':\n\t\t\t\t\t\tdata.instanceLights.push( parseId( child.getAttribute( 'url' ) ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'instance_geometry':\n\t\t\t\t\t\tdata.instanceGeometries.push( parseNodeInstance( child ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'instance_node':\n\t\t\t\t\t\tdata.instanceNodes.push( parseId( child.getAttribute( 'url' ) ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'matrix':\n\t\t\t\t\t\tarray = parseFloats( child.textContent );\n\t\t\t\t\t\tdata.matrix.multiply( matrix.fromArray( array ).transpose() );\n\t\t\t\t\t\tdata.transforms[ child.getAttribute( 'sid' ) ] = child.nodeName;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'translate':\n\t\t\t\t\t\tarray = parseFloats( child.textContent );\n\t\t\t\t\t\tvector.fromArray( array );\n\t\t\t\t\t\tdata.matrix.multiply( matrix.makeTranslation( vector.x, vector.y, vector.z ) );\n\t\t\t\t\t\tdata.transforms[ child.getAttribute( 'sid' ) ] = child.nodeName;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'rotate':\n\t\t\t\t\t\tarray = parseFloats( child.textContent );\n\t\t\t\t\t\tconst angle = MathUtils.degToRad( array[ 3 ] );\n\t\t\t\t\t\tdata.matrix.multiply( matrix.makeRotationAxis( vector.fromArray( array ), angle ) );\n\t\t\t\t\t\tdata.transforms[ child.getAttribute( 'sid' ) ] = child.nodeName;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'scale':\n\t\t\t\t\t\tarray = parseFloats( child.textContent );\n\t\t\t\t\t\tdata.matrix.scale( vector.fromArray( array ) );\n\t\t\t\t\t\tdata.transforms[ child.getAttribute( 'sid' ) ] = child.nodeName;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'extra':\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.log( child );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( hasNode( data.id ) ) {\n\n\t\t\t\tconsole.warn( 'THREE.ColladaLoader: There is already a node with ID %s. Exclude current node from further processing.', data.id );\n\n\t\t\t} else {\n\n\t\t\t\tlibrary.nodes[ data.id ] = data;\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction parseNodeInstance( xml ) {\n\n\t\t\tconst data = {\n\t\t\t\tid: parseId( xml.getAttribute( 'url' ) ),\n\t\t\t\tmaterials: {},\n\t\t\t\tskeletons: []\n\t\t\t};\n\n\t\t\tfor ( let i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\tconst child = xml.childNodes[ i ];\n\n\t\t\t\tswitch ( child.nodeName ) {\n\n\t\t\t\t\tcase 'bind_material':\n\t\t\t\t\t\tconst instances = child.getElementsByTagName( 'instance_material' );\n\n\t\t\t\t\t\tfor ( let j = 0; j < instances.length; j ++ ) {\n\n\t\t\t\t\t\t\tconst instance = instances[ j ];\n\t\t\t\t\t\t\tconst symbol = instance.getAttribute( 'symbol' );\n\t\t\t\t\t\t\tconst target = instance.getAttribute( 'target' );\n\n\t\t\t\t\t\t\tdata.materials[ symbol ] = parseId( target );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'skeleton':\n\t\t\t\t\t\tdata.skeletons.push( parseId( child.textContent ) );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction buildSkeleton( skeletons, joints ) {\n\n\t\t\tconst boneData = [];\n\t\t\tconst sortedBoneData = [];\n\n\t\t\tlet i, j, data;\n\n\t\t\t// a skeleton can have multiple root bones. collada expresses this\n\t\t\t// situation with multiple \"skeleton\" tags per controller instance\n\n\t\t\tfor ( i = 0; i < skeletons.length; i ++ ) {\n\n\t\t\t\tconst skeleton = skeletons[ i ];\n\n\t\t\t\tlet root;\n\n\t\t\t\tif ( hasNode( skeleton ) ) {\n\n\t\t\t\t\troot = getNode( skeleton );\n\t\t\t\t\tbuildBoneHierarchy( root, joints, boneData );\n\n\t\t\t\t} else if ( hasVisualScene( skeleton ) ) {\n\n\t\t\t\t\t// handle case where the skeleton refers to the visual scene (#13335)\n\n\t\t\t\t\tconst visualScene = library.visualScenes[ skeleton ];\n\t\t\t\t\tconst children = visualScene.children;\n\n\t\t\t\t\tfor ( let j = 0; j < children.length; j ++ ) {\n\n\t\t\t\t\t\tconst child = children[ j ];\n\n\t\t\t\t\t\tif ( child.type === 'JOINT' ) {\n\n\t\t\t\t\t\t\tconst root = getNode( child.id );\n\t\t\t\t\t\t\tbuildBoneHierarchy( root, joints, boneData );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( 'THREE.ColladaLoader: Unable to find root bone of skeleton with ID:', skeleton );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// sort bone data (the order is defined in the corresponding controller)\n\n\t\t\tfor ( i = 0; i < joints.length; i ++ ) {\n\n\t\t\t\tfor ( j = 0; j < boneData.length; j ++ ) {\n\n\t\t\t\t\tdata = boneData[ j ];\n\n\t\t\t\t\tif ( data.bone.name === joints[ i ].name ) {\n\n\t\t\t\t\t\tsortedBoneData[ i ] = data;\n\t\t\t\t\t\tdata.processed = true;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add unprocessed bone data at the end of the list\n\n\t\t\tfor ( i = 0; i < boneData.length; i ++ ) {\n\n\t\t\t\tdata = boneData[ i ];\n\n\t\t\t\tif ( data.processed === false ) {\n\n\t\t\t\t\tsortedBoneData.push( data );\n\t\t\t\t\tdata.processed = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// setup arrays for skeleton creation\n\n\t\t\tconst bones = [];\n\t\t\tconst boneInverses = [];\n\n\t\t\tfor ( i = 0; i < sortedBoneData.length; i ++ ) {\n\n\t\t\t\tdata = sortedBoneData[ i ];\n\n\t\t\t\tbones.push( data.bone );\n\t\t\t\tboneInverses.push( data.boneInverse );\n\n\t\t\t}\n\n\t\t\treturn new Skeleton( bones, boneInverses );\n\n\t\t}\n\n\t\tfunction buildBoneHierarchy( root, joints, boneData ) {\n\n\t\t\t// setup bone data from visual scene\n\n\t\t\troot.traverse( function ( object ) {\n\n\t\t\t\tif ( object.isBone === true ) {\n\n\t\t\t\t\tlet boneInverse;\n\n\t\t\t\t\t// retrieve the boneInverse from the controller data\n\n\t\t\t\t\tfor ( let i = 0; i < joints.length; i ++ ) {\n\n\t\t\t\t\t\tconst joint = joints[ i ];\n\n\t\t\t\t\t\tif ( joint.name === object.name ) {\n\n\t\t\t\t\t\t\tboneInverse = joint.boneInverse;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( boneInverse === undefined ) {\n\n\t\t\t\t\t\t// Unfortunately, there can be joints in the visual scene that are not part of the\n\t\t\t\t\t\t// corresponding controller. In this case, we have to create a dummy boneInverse matrix\n\t\t\t\t\t\t// for the respective bone. This bone won't affect any vertices, because there are no skin indices\n\t\t\t\t\t\t// and weights defined for it. But we still have to add the bone to the sorted bone list in order to\n\t\t\t\t\t\t// ensure a correct animation of the model.\n\n\t\t\t\t\t\tboneInverse = new Matrix4();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tboneData.push( { bone: object, boneInverse: boneInverse, processed: false } );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t}\n\n\t\tfunction buildNode( data ) {\n\n\t\t\tconst objects = [];\n\n\t\t\tconst matrix = data.matrix;\n\t\t\tconst nodes = data.nodes;\n\t\t\tconst type = data.type;\n\t\t\tconst instanceCameras = data.instanceCameras;\n\t\t\tconst instanceControllers = data.instanceControllers;\n\t\t\tconst instanceLights = data.instanceLights;\n\t\t\tconst instanceGeometries = data.instanceGeometries;\n\t\t\tconst instanceNodes = data.instanceNodes;\n\n\t\t\t// nodes\n\n\t\t\tfor ( let i = 0, l = nodes.length; i < l; i ++ ) {\n\n\t\t\t\tobjects.push( getNode( nodes[ i ] ) );\n\n\t\t\t}\n\n\t\t\t// instance cameras\n\n\t\t\tfor ( let i = 0, l = instanceCameras.length; i < l; i ++ ) {\n\n\t\t\t\tconst instanceCamera = getCamera( instanceCameras[ i ] );\n\n\t\t\t\tif ( instanceCamera !== null ) {\n\n\t\t\t\t\tobjects.push( instanceCamera.clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// instance controllers\n\n\t\t\tfor ( let i = 0, l = instanceControllers.length; i < l; i ++ ) {\n\n\t\t\t\tconst instance = instanceControllers[ i ];\n\t\t\t\tconst controller = getController( instance.id );\n\t\t\t\tconst geometries = getGeometry( controller.id );\n\t\t\t\tconst newObjects = buildObjects( geometries, instance.materials );\n\n\t\t\t\tconst skeletons = instance.skeletons;\n\t\t\t\tconst joints = controller.skin.joints;\n\n\t\t\t\tconst skeleton = buildSkeleton( skeletons, joints );\n\n\t\t\t\tfor ( let j = 0, jl = newObjects.length; j < jl; j ++ ) {\n\n\t\t\t\t\tconst object = newObjects[ j ];\n\n\t\t\t\t\tif ( object.isSkinnedMesh ) {\n\n\t\t\t\t\t\tobject.bind( skeleton, controller.skin.bindMatrix );\n\t\t\t\t\t\tobject.normalizeSkinWeights();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobjects.push( object );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// instance lights\n\n\t\t\tfor ( let i = 0, l = instanceLights.length; i < l; i ++ ) {\n\n\t\t\t\tconst instanceLight = getLight( instanceLights[ i ] );\n\n\t\t\t\tif ( instanceLight !== null ) {\n\n\t\t\t\t\tobjects.push( instanceLight.clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// instance geometries\n\n\t\t\tfor ( let i = 0, l = instanceGeometries.length; i < l; i ++ ) {\n\n\t\t\t\tconst instance = instanceGeometries[ i ];\n\n\t\t\t\t// a single geometry instance in collada can lead to multiple object3Ds.\n\t\t\t\t// this is the case when primitives are combined like triangles and lines\n\n\t\t\t\tconst geometries = getGeometry( instance.id );\n\t\t\t\tconst newObjects = buildObjects( geometries, instance.materials );\n\n\t\t\t\tfor ( let j = 0, jl = newObjects.length; j < jl; j ++ ) {\n\n\t\t\t\t\tobjects.push( newObjects[ j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// instance nodes\n\n\t\t\tfor ( let i = 0, l = instanceNodes.length; i < l; i ++ ) {\n\n\t\t\t\tobjects.push( getNode( instanceNodes[ i ] ).clone() );\n\n\t\t\t}\n\n\t\t\tlet object;\n\n\t\t\tif ( nodes.length === 0 && objects.length === 1 ) {\n\n\t\t\t\tobject = objects[ 0 ];\n\n\t\t\t} else {\n\n\t\t\t\tobject = ( type === 'JOINT' ) ? new Bone() : new Group();\n\n\t\t\t\tfor ( let i = 0; i < objects.length; i ++ ) {\n\n\t\t\t\t\tobject.add( objects[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tobject.name = ( type === 'JOINT' ) ? data.sid : data.name;\n\t\t\tobject.matrix.copy( matrix );\n\t\t\tobject.matrix.decompose( object.position, object.quaternion, object.scale );\n\n\t\t\treturn object;\n\n\t\t}\n\n\t\tconst fallbackMaterial = new MeshBasicMaterial( {\n\t\t\tname: Loader.DEFAULT_MATERIAL_NAME,\n\t\t\tcolor: 0xff00ff\n\t\t} );\n\n\t\tfunction resolveMaterialBinding( keys, instanceMaterials ) {\n\n\t\t\tconst materials = [];\n\n\t\t\tfor ( let i = 0, l = keys.length; i < l; i ++ ) {\n\n\t\t\t\tconst id = instanceMaterials[ keys[ i ] ];\n\n\t\t\t\tif ( id === undefined ) {\n\n\t\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Material with key %s not found. Apply fallback material.', keys[ i ] );\n\t\t\t\t\tmaterials.push( fallbackMaterial );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tmaterials.push( getMaterial( id ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn materials;\n\n\t\t}\n\n\t\tfunction buildObjects( geometries, instanceMaterials ) {\n\n\t\t\tconst objects = [];\n\n\t\t\tfor ( const type in geometries ) {\n\n\t\t\t\tconst geometry = geometries[ type ];\n\n\t\t\t\tconst materials = resolveMaterialBinding( geometry.materialKeys, instanceMaterials );\n\n\t\t\t\t// handle case if no materials are defined\n\n\t\t\t\tif ( materials.length === 0 ) {\n\n\t\t\t\t\tif ( type === 'lines' || type === 'linestrips' ) {\n\n\t\t\t\t\t\tmaterials.push( new LineBasicMaterial() );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tmaterials.push( new MeshPhongMaterial() );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Collada allows to use phong and lambert materials with lines. Replacing these cases with LineBasicMaterial.\n\n\t\t\t\tif ( type === 'lines' || type === 'linestrips' ) {\n\n\t\t\t\t\tfor ( let i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst material = materials[ i ];\n\n\t\t\t\t\t\tif ( material.isMeshPhongMaterial === true || material.isMeshLambertMaterial === true ) {\n\n\t\t\t\t\t\t\tconst lineMaterial = new LineBasicMaterial();\n\n\t\t\t\t\t\t\t// copy compatible properties\n\n\t\t\t\t\t\t\tlineMaterial.color.copy( material.color );\n\t\t\t\t\t\t\tlineMaterial.opacity = material.opacity;\n\t\t\t\t\t\t\tlineMaterial.transparent = material.transparent;\n\n\t\t\t\t\t\t\t// replace material\n\n\t\t\t\t\t\t\tmaterials[ i ] = lineMaterial;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// regard skinning\n\n\t\t\t\tconst skinning = ( geometry.data.attributes.skinIndex !== undefined );\n\n\t\t\t\t// choose between a single or multi materials (material array)\n\n\t\t\t\tconst material = ( materials.length === 1 ) ? materials[ 0 ] : materials;\n\n\t\t\t\t// now create a specific 3D object\n\n\t\t\t\tlet object;\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\tcase 'lines':\n\t\t\t\t\t\tobject = new LineSegments( geometry.data, material );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'linestrips':\n\t\t\t\t\t\tobject = new Line( geometry.data, material );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'triangles':\n\t\t\t\t\tcase 'polylist':\n\t\t\t\t\t\tif ( skinning ) {\n\n\t\t\t\t\t\t\tobject = new SkinnedMesh( geometry.data, material );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tobject = new Mesh( geometry.data, material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tobjects.push( object );\n\n\t\t\t}\n\n\t\t\treturn objects;\n\n\t\t}\n\n\t\tfunction hasNode( id ) {\n\n\t\t\treturn library.nodes[ id ] !== undefined;\n\n\t\t}\n\n\t\tfunction getNode( id ) {\n\n\t\t\treturn getBuild( library.nodes[ id ], buildNode );\n\n\t\t}\n\n\t\t// visual scenes\n\n\t\tfunction parseVisualScene( xml ) {\n\n\t\t\tconst data = {\n\t\t\t\tname: xml.getAttribute( 'name' ),\n\t\t\t\tchildren: []\n\t\t\t};\n\n\t\t\tprepareNodes( xml );\n\n\t\t\tconst elements = getElementsByTagName( xml, 'node' );\n\n\t\t\tfor ( let i = 0; i < elements.length; i ++ ) {\n\n\t\t\t\tdata.children.push( parseNode( elements[ i ] ) );\n\n\t\t\t}\n\n\t\t\tlibrary.visualScenes[ xml.getAttribute( 'id' ) ] = data;\n\n\t\t}\n\n\t\tfunction buildVisualScene( data ) {\n\n\t\t\tconst group = new Group();\n\t\t\tgroup.name = data.name;\n\n\t\t\tconst children = data.children;\n\n\t\t\tfor ( let i = 0; i < children.length; i ++ ) {\n\n\t\t\t\tconst child = children[ i ];\n\n\t\t\t\tgroup.add( getNode( child.id ) );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t}\n\n\t\tfunction hasVisualScene( id ) {\n\n\t\t\treturn library.visualScenes[ id ] !== undefined;\n\n\t\t}\n\n\t\tfunction getVisualScene( id ) {\n\n\t\t\treturn getBuild( library.visualScenes[ id ], buildVisualScene );\n\n\t\t}\n\n\t\t// scenes\n\n\t\tfunction parseScene( xml ) {\n\n\t\t\tconst instance = getElementsByTagName( xml, 'instance_visual_scene' )[ 0 ];\n\t\t\treturn getVisualScene( parseId( instance.getAttribute( 'url' ) ) );\n\n\t\t}\n\n\t\tfunction setupAnimations() {\n\n\t\t\tconst clips = library.clips;\n\n\t\t\tif ( isEmpty( clips ) === true ) {\n\n\t\t\t\tif ( isEmpty( library.animations ) === false ) {\n\n\t\t\t\t\t// if there are animations but no clips, we create a default clip for playback\n\n\t\t\t\t\tconst tracks = [];\n\n\t\t\t\t\tfor ( const id in library.animations ) {\n\n\t\t\t\t\t\tconst animationTracks = getAnimation( id );\n\n\t\t\t\t\t\tfor ( let i = 0, l = animationTracks.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\ttracks.push( animationTracks[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tanimations.push( new AnimationClip( 'default', - 1, tracks ) );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tfor ( const id in clips ) {\n\n\t\t\t\t\tanimations.push( getAnimationClip( id ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// convert the parser error element into text with each child elements text\n\t\t// separated by new lines.\n\n\t\tfunction parserErrorToText( parserError ) {\n\n\t\t\tlet result = '';\n\t\t\tconst stack = [ parserError ];\n\n\t\t\twhile ( stack.length ) {\n\n\t\t\t\tconst node = stack.shift();\n\n\t\t\t\tif ( node.nodeType === Node.TEXT_NODE ) {\n\n\t\t\t\t\tresult += node.textContent;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tresult += '\\n';\n\t\t\t\t\tstack.push( ...node.childNodes );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn result.trim();\n\n\t\t}\n\n\t\tif ( text.length === 0 ) {\n\n\t\t\treturn { scene: new Scene() };\n\n\t\t}\n\n\t\tconst xml = new DOMParser().parseFromString( text, 'application/xml' );\n\n\t\tconst collada = getElementsByTagName( xml, 'COLLADA' )[ 0 ];\n\n\t\tconst parserError = xml.getElementsByTagName( 'parsererror' )[ 0 ];\n\t\tif ( parserError !== undefined ) {\n\n\t\t\t// Chrome will return parser error with a div in it\n\n\t\t\tconst errorElement = getElementsByTagName( parserError, 'div' )[ 0 ];\n\t\t\tlet errorText;\n\n\t\t\tif ( errorElement ) {\n\n\t\t\t\terrorText = errorElement.textContent;\n\n\t\t\t} else {\n\n\t\t\t\terrorText = parserErrorToText( parserError );\n\n\t\t\t}\n\n\t\t\tconsole.error( 'THREE.ColladaLoader: Failed to parse collada file.\\n', errorText );\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\t// metadata\n\n\t\tconst version = collada.getAttribute( 'version' );\n\t\tconsole.debug( 'THREE.ColladaLoader: File version', version );\n\n\t\tconst asset = parseAsset( getElementsByTagName( collada, 'asset' )[ 0 ] );\n\t\tconst textureLoader = new TextureLoader( this.manager );\n\t\ttextureLoader.setPath( this.resourcePath || path ).setCrossOrigin( this.crossOrigin );\n\n\t\tlet tgaLoader;\n\n\t\tif ( TGALoader ) {\n\n\t\t\ttgaLoader = new TGALoader( this.manager );\n\t\t\ttgaLoader.setPath( this.resourcePath || path );\n\n\t\t}\n\n\t\t//\n\n\t\tconst tempColor = new Color();\n\t\tconst animations = [];\n\t\tlet kinematics = {};\n\t\tlet count = 0;\n\n\t\t//\n\n\t\tconst library = {\n\t\t\tanimations: {},\n\t\t\tclips: {},\n\t\t\tcontrollers: {},\n\t\t\timages: {},\n\t\t\teffects: {},\n\t\t\tmaterials: {},\n\t\t\tcameras: {},\n\t\t\tlights: {},\n\t\t\tgeometries: {},\n\t\t\tnodes: {},\n\t\t\tvisualScenes: {},\n\t\t\tkinematicsModels: {},\n\t\t\tphysicsModels: {},\n\t\t\tkinematicsScenes: {}\n\t\t};\n\n\t\tparseLibrary( collada, 'library_animations', 'animation', parseAnimation );\n\t\tparseLibrary( collada, 'library_animation_clips', 'animation_clip', parseAnimationClip );\n\t\tparseLibrary( collada, 'library_controllers', 'controller', parseController );\n\t\tparseLibrary( collada, 'library_images', 'image', parseImage );\n\t\tparseLibrary( collada, 'library_effects', 'effect', parseEffect );\n\t\tparseLibrary( collada, 'library_materials', 'material', parseMaterial );\n\t\tparseLibrary( collada, 'library_cameras', 'camera', parseCamera );\n\t\tparseLibrary( collada, 'library_lights', 'light', parseLight );\n\t\tparseLibrary( collada, 'library_geometries', 'geometry', parseGeometry );\n\t\tparseLibrary( collada, 'library_nodes', 'node', parseNode );\n\t\tparseLibrary( collada, 'library_visual_scenes', 'visual_scene', parseVisualScene );\n\t\tparseLibrary( collada, 'library_kinematics_models', 'kinematics_model', parseKinematicsModel );\n\t\tparseLibrary( collada, 'library_physics_models', 'physics_model', parsePhysicsModel );\n\t\tparseLibrary( collada, 'scene', 'instance_kinematics_scene', parseKinematicsScene );\n\n\t\tbuildLibrary( library.animations, buildAnimation );\n\t\tbuildLibrary( library.clips, buildAnimationClip );\n\t\tbuildLibrary( library.controllers, buildController );\n\t\tbuildLibrary( library.images, buildImage );\n\t\tbuildLibrary( library.effects, buildEffect );\n\t\tbuildLibrary( library.materials, buildMaterial );\n\t\tbuildLibrary( library.cameras, buildCamera );\n\t\tbuildLibrary( library.lights, buildLight );\n\t\tbuildLibrary( library.geometries, buildGeometry );\n\t\tbuildLibrary( library.visualScenes, buildVisualScene );\n\n\t\tsetupAnimations();\n\t\tsetupKinematics();\n\n\t\tconst scene = parseScene( getElementsByTagName( collada, 'scene' )[ 0 ] );\n\t\tscene.animations = animations;\n\n\t\tif ( asset.upAxis === 'Z_UP' ) {\n\n\t\t\tconsole.warn( 'THREE.ColladaLoader: You are loading an asset with a Z-UP coordinate system. The loader just rotates the asset to transform it into Y-UP. The vertex data are not converted, see #24289.' );\n\t\t\tscene.rotation.set( - Math.PI / 2, 0, 0 );\n\n\t\t}\n\n\t\tscene.scale.multiplyScalar( asset.unit );\n\n\t\treturn {\n\t\t\tget animations() {\n\n\t\t\t\tconsole.warn( 'THREE.ColladaLoader: Please access animations over scene.animations now.' );\n\t\t\t\treturn animations;\n\n\t\t\t},\n\t\t\tkinematics: kinematics,\n\t\t\tlibrary: library,\n\t\t\tscene: scene\n\t\t};\n\n\t}\n\n}\n\nexport { ColladaLoader };\n", "import {\n\tCompressedTextureLoader,\n\tRGBAFormat,\n\tRGBA_S3TC_DXT3_Format,\n\tRGBA_S3TC_DXT5_Format,\n\tRGB_ETC1_Format,\n\tRGB_S3TC_DXT1_Format,\n\tRGB_BPTC_SIGNED_Format,\n\tRGB_BPTC_UNSIGNED_Format\n} from 'three';\n\n/**\n * A loader for the S3TC texture compression format.\n *\n * ```js\n * const loader = new DDSLoader();\n *\n * const map = loader.load( 'textures/compressed/disturb_dxt1_nomip.dds' );\n * map.colorSpace = THREE.SRGBColorSpace; // only for color textures\n * ```\n *\n * @augments CompressedTextureLoader\n * @three_import import { DDSLoader } from 'three/addons/loaders/DDSLoader.js';\n */\nclass DDSLoader extends CompressedTextureLoader {\n\n\t/**\n\t * Constructs a new DDS loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Parses the given S3TC texture data.\n\t *\n\t * @param {ArrayBuffer} buffer - The raw texture data.\n\t * @param {boolean} loadMipmaps - Whether to load mipmaps or not.\n\t * @return {CompressedTextureLoader~TexData} An object representing the parsed texture data.\n\t */\n\tparse( buffer, loadMipmaps ) {\n\n\t\tconst dds = { mipmaps: [], width: 0, height: 0, format: null, mipmapCount: 1, isCubemap: false };\n\n\t\t// Adapted from @toji's DDS utils\n\t\t// https://github.com/toji/webgl-texture-utils/blob/master/texture-util/dds.js\n\n\t\t// All values and structures referenced from:\n\t\t// http://msdn.microsoft.com/en-us/library/bb943991.aspx/\n\n\t\tconst DDS_MAGIC = 0x20534444;\n\n\t\t// const DDSD_CAPS = 0x1;\n\t\t// const DDSD_HEIGHT = 0x2;\n\t\t// const DDSD_WIDTH = 0x4;\n\t\t// const DDSD_PITCH = 0x8;\n\t\t// const DDSD_PIXELFORMAT = 0x1000;\n\t\tconst DDSD_MIPMAPCOUNT = 0x20000;\n\t\t// const DDSD_LINEARSIZE = 0x80000;\n\t\t// const DDSD_DEPTH = 0x800000;\n\n\t\t// const DDSCAPS_COMPLEX = 0x8;\n\t\t// const DDSCAPS_MIPMAP = 0x400000;\n\t\t// const DDSCAPS_TEXTURE = 0x1000;\n\n\t\tconst DDSCAPS2_CUBEMAP = 0x200;\n\t\tconst DDSCAPS2_CUBEMAP_POSITIVEX = 0x400;\n\t\tconst DDSCAPS2_CUBEMAP_NEGATIVEX = 0x800;\n\t\tconst DDSCAPS2_CUBEMAP_POSITIVEY = 0x1000;\n\t\tconst DDSCAPS2_CUBEMAP_NEGATIVEY = 0x2000;\n\t\tconst DDSCAPS2_CUBEMAP_POSITIVEZ = 0x4000;\n\t\tconst DDSCAPS2_CUBEMAP_NEGATIVEZ = 0x8000;\n\t\t// const DDSCAPS2_VOLUME = 0x200000;\n\n\t\t// const DDPF_ALPHAPIXELS = 0x1;\n\t\t// const DDPF_ALPHA = 0x2;\n\t\t// const DDPF_FOURCC = 0x4;\n\t\t// const DDPF_RGB = 0x40;\n\t\t// const DDPF_YUV = 0x200;\n\t\t// const DDPF_LUMINANCE = 0x20000;\n\n\t\tconst DXGI_FORMAT_BC6H_UF16 = 95;\n\t\tconst DXGI_FORMAT_BC6H_SF16 = 96;\n\n\t\tfunction fourCCToInt32( value ) {\n\n\t\t\treturn value.charCodeAt( 0 ) +\n\t\t\t\t( value.charCodeAt( 1 ) << 8 ) +\n\t\t\t\t( value.charCodeAt( 2 ) << 16 ) +\n\t\t\t\t( value.charCodeAt( 3 ) << 24 );\n\n\t\t}\n\n\t\tfunction int32ToFourCC( value ) {\n\n\t\t\treturn String.fromCharCode(\n\t\t\t\tvalue & 0xff,\n\t\t\t\t( value >> 8 ) & 0xff,\n\t\t\t\t( value >> 16 ) & 0xff,\n\t\t\t\t( value >> 24 ) & 0xff\n\t\t\t);\n\n\t\t}\n\n\t\tfunction loadARGBMip( buffer, dataOffset, width, height ) {\n\n\t\t\tconst dataLength = width * height * 4;\n\t\t\tconst srcBuffer = new Uint8Array( buffer, dataOffset, dataLength );\n\t\t\tconst byteArray = new Uint8Array( dataLength );\n\t\t\tlet dst = 0;\n\t\t\tlet src = 0;\n\t\t\tfor ( let y = 0; y < height; y ++ ) {\n\n\t\t\t\tfor ( let x = 0; x < width; x ++ ) {\n\n\t\t\t\t\tconst b = srcBuffer[ src ]; src ++;\n\t\t\t\t\tconst g = srcBuffer[ src ]; src ++;\n\t\t\t\t\tconst r = srcBuffer[ src ]; src ++;\n\t\t\t\t\tconst a = srcBuffer[ src ]; src ++;\n\t\t\t\t\tbyteArray[ dst ] = r; dst ++;\t//r\n\t\t\t\t\tbyteArray[ dst ] = g; dst ++;\t//g\n\t\t\t\t\tbyteArray[ dst ] = b; dst ++;\t//b\n\t\t\t\t\tbyteArray[ dst ] = a; dst ++;\t//a\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn byteArray;\n\n\t\t}\n\n\t\tfunction loadRGBMip( buffer, dataOffset, width, height ) {\n\n\t\t\tconst dataLength = width * height * 3;\n\t\t\tconst srcBuffer = new Uint8Array( buffer, dataOffset, dataLength );\n\t\t\tconst byteArray = new Uint8Array( width * height * 4 );\n\t\t\tlet dst = 0;\n\t\t\tlet src = 0;\n\t\t\tfor ( let y = 0; y < height; y ++ ) {\n\n\t\t\t\tfor ( let x = 0; x < width; x ++ ) {\n\n\t\t\t\t\tconst b = srcBuffer[ src ]; src ++;\n\t\t\t\t\tconst g = srcBuffer[ src ]; src ++;\n\t\t\t\t\tconst r = srcBuffer[ src ]; src ++;\n\t\t\t\t\tbyteArray[ dst ] = r; dst ++;\t//r\n\t\t\t\t\tbyteArray[ dst ] = g; dst ++;\t//g\n\t\t\t\t\tbyteArray[ dst ] = b; dst ++;\t//b\n\t\t\t\t\tbyteArray[ dst ] = 255; dst ++; //a\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn byteArray;\n\n\t\t}\n\n\t\tconst FOURCC_DXT1 = fourCCToInt32( 'DXT1' );\n\t\tconst FOURCC_DXT3 = fourCCToInt32( 'DXT3' );\n\t\tconst FOURCC_DXT5 = fourCCToInt32( 'DXT5' );\n\t\tconst FOURCC_ETC1 = fourCCToInt32( 'ETC1' );\n\t\tconst FOURCC_DX10 = fourCCToInt32( 'DX10' );\n\n\t\tconst headerLengthInt = 31; // The header length in 32 bit ints\n\t\tconst extendedHeaderLengthInt = 5; // The extended header length in 32 bit ints\n\n\t\t// Offsets into the header array\n\n\t\tconst off_magic = 0;\n\n\t\tconst off_size = 1;\n\t\tconst off_flags = 2;\n\t\tconst off_height = 3;\n\t\tconst off_width = 4;\n\n\t\tconst off_mipmapCount = 7;\n\n\t\t// const off_pfFlags = 20;\n\t\tconst off_pfFourCC = 21;\n\t\tconst off_RGBBitCount = 22;\n\t\tconst off_RBitMask = 23;\n\t\tconst off_GBitMask = 24;\n\t\tconst off_BBitMask = 25;\n\t\tconst off_ABitMask = 26;\n\n\t\t// const off_caps = 27;\n\t\tconst off_caps2 = 28;\n\t\t// const off_caps3 = 29;\n\t\t// const off_caps4 = 30;\n\n\t\t// If fourCC = DX10, the extended header starts after 32\n\t\tconst off_dxgiFormat = 0;\n\n\t\t// Parse header\n\n\t\tconst header = new Int32Array( buffer, 0, headerLengthInt );\n\n\t\tif ( header[ off_magic ] !== DDS_MAGIC ) {\n\n\t\t\tconsole.error( 'THREE.DDSLoader.parse: Invalid magic number in DDS header.' );\n\t\t\treturn dds;\n\n\t\t}\n\n\t\tlet blockBytes;\n\n\t\tconst fourCC = header[ off_pfFourCC ];\n\n\t\tlet isRGBAUncompressed = false;\n\t\tlet isRGBUncompressed = false;\n\n\t\tlet dataOffset = header[ off_size ] + 4;\n\n\t\tswitch ( fourCC ) {\n\n\t\t\tcase FOURCC_DXT1:\n\n\t\t\t\tblockBytes = 8;\n\t\t\t\tdds.format = RGB_S3TC_DXT1_Format;\n\t\t\t\tbreak;\n\n\t\t\tcase FOURCC_DXT3:\n\n\t\t\t\tblockBytes = 16;\n\t\t\t\tdds.format = RGBA_S3TC_DXT3_Format;\n\t\t\t\tbreak;\n\n\t\t\tcase FOURCC_DXT5:\n\n\t\t\t\tblockBytes = 16;\n\t\t\t\tdds.format = RGBA_S3TC_DXT5_Format;\n\t\t\t\tbreak;\n\n\t\t\tcase FOURCC_ETC1:\n\n\t\t\t\tblockBytes = 8;\n\t\t\t\tdds.format = RGB_ETC1_Format;\n\t\t\t\tbreak;\n\n\t\t\tcase FOURCC_DX10:\n\n\t\t\t\tdataOffset += extendedHeaderLengthInt * 4;\n\t\t\t\tconst extendedHeader = new Int32Array( buffer, ( headerLengthInt + 1 ) * 4, extendedHeaderLengthInt );\n\t\t\t\tconst dxgiFormat = extendedHeader[ off_dxgiFormat ];\n\t\t\t\tswitch ( dxgiFormat ) {\n\n\t\t\t\t\tcase DXGI_FORMAT_BC6H_SF16: {\n\n\t\t\t\t\t\tblockBytes = 16;\n\t\t\t\t\t\tdds.format = RGB_BPTC_SIGNED_Format;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcase DXGI_FORMAT_BC6H_UF16: {\n\n\t\t\t\t\t\tblockBytes = 16;\n\t\t\t\t\t\tdds.format = RGB_BPTC_UNSIGNED_Format;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tdefault: {\n\n\t\t\t\t\t\tconsole.error( 'THREE.DDSLoader.parse: Unsupported DXGI_FORMAT code ', dxgiFormat );\n\t\t\t\t\t\treturn dds;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tif ( header[ off_RGBBitCount ] === 32\n\t\t\t\t\t&& header[ off_RBitMask ] & 0xff0000\n\t\t\t\t\t&& header[ off_GBitMask ] & 0xff00\n\t\t\t\t\t&& header[ off_BBitMask ] & 0xff\n\t\t\t\t\t&& header[ off_ABitMask ] & 0xff000000 ) {\n\n\t\t\t\t\tisRGBAUncompressed = true;\n\t\t\t\t\tblockBytes = 64;\n\t\t\t\t\tdds.format = RGBAFormat;\n\n\t\t\t\t} else if ( header[ off_RGBBitCount ] === 24\n\t\t\t\t\t&& header[ off_RBitMask ] & 0xff0000\n\t\t\t\t\t&& header[ off_GBitMask ] & 0xff00\n\t\t\t\t\t&& header[ off_BBitMask ] & 0xff ) {\n\n\t\t\t\t    \tisRGBUncompressed = true;\n                    \t\t\tblockBytes = 64;\n                    \t\t\tdds.format = RGBAFormat;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( 'THREE.DDSLoader.parse: Unsupported FourCC code ', int32ToFourCC( fourCC ) );\n\t\t\t\t\treturn dds;\n\n\t\t\t\t}\n\n\t\t}\n\n\t\tdds.mipmapCount = 1;\n\n\t\tif ( header[ off_flags ] & DDSD_MIPMAPCOUNT && loadMipmaps !== false ) {\n\n\t\t\tdds.mipmapCount = Math.max( 1, header[ off_mipmapCount ] );\n\n\t\t}\n\n\t\tconst caps2 = header[ off_caps2 ];\n\t\tdds.isCubemap = caps2 & DDSCAPS2_CUBEMAP ? true : false;\n\t\tif ( dds.isCubemap && (\n\t\t\t! ( caps2 & DDSCAPS2_CUBEMAP_POSITIVEX ) ||\n\t\t\t! ( caps2 & DDSCAPS2_CUBEMAP_NEGATIVEX ) ||\n\t\t\t! ( caps2 & DDSCAPS2_CUBEMAP_POSITIVEY ) ||\n\t\t\t! ( caps2 & DDSCAPS2_CUBEMAP_NEGATIVEY ) ||\n\t\t\t! ( caps2 & DDSCAPS2_CUBEMAP_POSITIVEZ ) ||\n\t\t\t! ( caps2 & DDSCAPS2_CUBEMAP_NEGATIVEZ )\n\t\t) ) {\n\n\t\t\tconsole.error( 'THREE.DDSLoader.parse: Incomplete cubemap faces' );\n\t\t\treturn dds;\n\n\t\t}\n\n\t\tdds.width = header[ off_width ];\n\t\tdds.height = header[ off_height ];\n\n\t\t// Extract mipmaps buffers\n\n\t\tconst faces = dds.isCubemap ? 6 : 1;\n\n\t\tfor ( let face = 0; face < faces; face ++ ) {\n\n\t\t\tlet width = dds.width;\n\t\t\tlet height = dds.height;\n\n\t\t\tfor ( let i = 0; i < dds.mipmapCount; i ++ ) {\n\n\t\t\t\tlet byteArray, dataLength;\n\n\t\t\t\tif ( isRGBAUncompressed ) {\n\n\t\t\t\t\tbyteArray = loadARGBMip( buffer, dataOffset, width, height );\n\t\t\t\t\tdataLength = byteArray.length;\n\n\t\t\t\t} else if ( isRGBUncompressed ) {\n\n\t\t\t\t\tbyteArray = loadRGBMip( buffer, dataOffset, width, height );\n\t\t\t\t\tdataLength = width * height * 3;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdataLength = Math.max( 4, width ) / 4 * Math.max( 4, height ) / 4 * blockBytes;\n\t\t\t\t\tbyteArray = new Uint8Array( buffer, dataOffset, dataLength );\n\n\t\t\t\t}\n\n\t\t\t\tconst mipmap = { 'data': byteArray, 'width': width, 'height': height };\n\t\t\t\tdds.mipmaps.push( mipmap );\n\n\t\t\t\tdataOffset += dataLength;\n\n\t\t\t\twidth = Math.max( width >> 1, 1 );\n\t\t\t\theight = Math.max( height >> 1, 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn dds;\n\n\t}\n\n}\n\nexport { DDSLoader };\n", "import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tColor,\n\tColorManagement,\n\tFileLoader,\n\tLoader,\n\tLinearSRGBColorSpace,\n\tSRGBColorSpace,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute\n} from 'three';\n\nconst _taskCache = new WeakMap();\n\n/**\n * A loader for the Draco format.\n *\n * [Draco](https://google.github.io/draco/) is an open source library for compressing\n * and decompressing 3D meshes and point clouds. Compressed geometry can be significantly smaller,\n * at the cost of additional decoding time on the client device.\n *\n * Standalone Draco files have a `.drc` extension, and contain vertex positions, normals, colors,\n * and other attributes. Draco files do not contain materials, textures, animation, or node hierarchies \u2013\n * to use these features, embed Draco geometry inside of a glTF file. A normal glTF file can be converted\n * to a Draco-compressed glTF file using [glTF-Pipeline](https://github.com/CesiumGS/gltf-pipeline).\n * When using Draco with glTF, an instance of `DRACOLoader` will be used internally by {@link GLTFLoader}.\n *\n * It is recommended to create one DRACOLoader instance and reuse it to avoid loading and creating\n * multiple decoder instances.\n *\n * `DRACOLoader` will automatically use either the JS or the WASM decoding library, based on\n * browser capabilities.\n *\n * ```js\n * const loader = new DRACOLoader();\n * loader.setDecoderPath( '/examples/jsm/libs/draco/' );\n *\n * const geometry = await dracoLoader.loadAsync( 'models/draco/bunny.drc' );\n * geometry.computeVertexNormals(); // optional\n *\n * dracoLoader.dispose();\n * ```\n *\n * @augments Loader\n * @three_import import { DRACOLoader } from 'three/addons/loaders/DRACOLoader.js';\n */\nclass DRACOLoader extends Loader {\n\n\t/**\n\t * Constructs a new Draco loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.decoderPath = '';\n\t\tthis.decoderConfig = {};\n\t\tthis.decoderBinary = null;\n\t\tthis.decoderPending = null;\n\n\t\tthis.workerLimit = 4;\n\t\tthis.workerPool = [];\n\t\tthis.workerNextTaskID = 1;\n\t\tthis.workerSourceURL = '';\n\n\t\tthis.defaultAttributeIDs = {\n\t\t\tposition: 'POSITION',\n\t\t\tnormal: 'NORMAL',\n\t\t\tcolor: 'COLOR',\n\t\t\tuv: 'TEX_COORD'\n\t\t};\n\t\tthis.defaultAttributeTypes = {\n\t\t\tposition: 'Float32Array',\n\t\t\tnormal: 'Float32Array',\n\t\t\tcolor: 'Float32Array',\n\t\t\tuv: 'Float32Array'\n\t\t};\n\n\t}\n\n\t/**\n\t * Provides configuration for the decoder libraries. Configuration cannot be changed after decoding begins.\n\t *\n\t * @param {string} path - The decoder path.\n\t * @return {DRACOLoader} A reference to this loader.\n\t */\n\tsetDecoderPath( path ) {\n\n\t\tthis.decoderPath = path;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Provides configuration for the decoder libraries. Configuration cannot be changed after decoding begins.\n\t *\n\t * @param {{type:('js'|'wasm')}} config - The decoder config.\n\t * @return {DRACOLoader} A reference to this loader.\n\t */\n\tsetDecoderConfig( config ) {\n\n\t\tthis.decoderConfig = config;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the maximum number of Web Workers to be used during decoding.\n\t * A lower limit may be preferable if workers are also for other tasks in the application.\n\t *\n\t * @param {number} workerLimit - The worker limit.\n\t * @return {DRACOLoader} A reference to this loader.\n\t */\n\tsetWorkerLimit( workerLimit ) {\n\n\t\tthis.workerLimit = workerLimit;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded Draco asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(BufferGeometry)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, ( buffer ) => {\n\n\t\t\tthis.parse( buffer, onLoad, onError );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given Draco data.\n\t *\n\t * @param {ArrayBuffer} buffer - The raw Draco data as an array buffer.\n\t * @param {function(BufferGeometry)} onLoad - Executed when the loading/parsing process has been finished.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tparse( buffer, onLoad, onError = ()=>{} ) {\n\n\t\tthis.decodeDracoFile( buffer, onLoad, null, null, SRGBColorSpace, onError ).catch( onError );\n\n\t}\n\n\t//\n\n\tdecodeDracoFile( buffer, callback, attributeIDs, attributeTypes, vertexColorSpace = LinearSRGBColorSpace, onError = () => {} ) {\n\n\t\tconst taskConfig = {\n\t\t\tattributeIDs: attributeIDs || this.defaultAttributeIDs,\n\t\t\tattributeTypes: attributeTypes || this.defaultAttributeTypes,\n\t\t\tuseUniqueIDs: !! attributeIDs,\n\t\t\tvertexColorSpace: vertexColorSpace,\n\t\t};\n\n\t\treturn this.decodeGeometry( buffer, taskConfig ).then( callback ).catch( onError );\n\n\t}\n\n\tdecodeGeometry( buffer, taskConfig ) {\n\n\t\tconst taskKey = JSON.stringify( taskConfig );\n\n\t\t// Check for an existing task using this buffer. A transferred buffer cannot be transferred\n\t\t// again from this thread.\n\t\tif ( _taskCache.has( buffer ) ) {\n\n\t\t\tconst cachedTask = _taskCache.get( buffer );\n\n\t\t\tif ( cachedTask.key === taskKey ) {\n\n\t\t\t\treturn cachedTask.promise;\n\n\t\t\t} else if ( buffer.byteLength === 0 ) {\n\n\t\t\t\t// Technically, it would be possible to wait for the previous task to complete,\n\t\t\t\t// transfer the buffer back, and decode again with the second configuration. That\n\t\t\t\t// is complex, and I don't know of any reason to decode a Draco buffer twice in\n\t\t\t\t// different ways, so this is left unimplemented.\n\t\t\t\tthrow new Error(\n\n\t\t\t\t\t'THREE.DRACOLoader: Unable to re-decode a buffer with different ' +\n\t\t\t\t\t'settings. Buffer has already been transferred.'\n\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tlet worker;\n\t\tconst taskID = this.workerNextTaskID ++;\n\t\tconst taskCost = buffer.byteLength;\n\n\t\t// Obtain a worker and assign a task, and construct a geometry instance\n\t\t// when the task completes.\n\t\tconst geometryPending = this._getWorker( taskID, taskCost )\n\t\t\t.then( ( _worker ) => {\n\n\t\t\t\tworker = _worker;\n\n\t\t\t\treturn new Promise( ( resolve, reject ) => {\n\n\t\t\t\t\tworker._callbacks[ taskID ] = { resolve, reject };\n\n\t\t\t\t\tworker.postMessage( { type: 'decode', id: taskID, taskConfig, buffer }, [ buffer ] );\n\n\t\t\t\t\t// this.debug();\n\n\t\t\t\t} );\n\n\t\t\t} )\n\t\t\t.then( ( message ) => this._createGeometry( message.geometry ) );\n\n\t\t// Remove task from the task list.\n\t\t// Note: replaced '.finally()' with '.catch().then()' block - iOS 11 support (#19416)\n\t\tgeometryPending\n\t\t\t.catch( () => true )\n\t\t\t.then( () => {\n\n\t\t\t\tif ( worker && taskID ) {\n\n\t\t\t\t\tthis._releaseTask( worker, taskID );\n\n\t\t\t\t\t// this.debug();\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t// Cache the task result.\n\t\t_taskCache.set( buffer, {\n\n\t\t\tkey: taskKey,\n\t\t\tpromise: geometryPending\n\n\t\t} );\n\n\t\treturn geometryPending;\n\n\t}\n\n\t_createGeometry( geometryData ) {\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tif ( geometryData.index ) {\n\n\t\t\tgeometry.setIndex( new BufferAttribute( geometryData.index.array, 1 ) );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < geometryData.attributes.length; i ++ ) {\n\n\t\t\tconst { name, array, itemSize, stride, vertexColorSpace } = geometryData.attributes[ i ];\n\n\t\t\tlet attribute;\n\n\t\t\tif ( itemSize === stride ) {\n\n\t\t\t\tattribute = new BufferAttribute( array, itemSize );\n\n\t\t\t} else {\n\n\t\t\t\tconst buffer = new InterleavedBuffer( array, stride );\n\n\t\t\t\tattribute = new InterleavedBufferAttribute( buffer, itemSize, 0 );\n\n\t\t\t}\n\n\t\t\tif ( name === 'color' ) {\n\n\t\t\t\tthis._assignVertexColorSpace( attribute, vertexColorSpace );\n\n\t\t\t\tattribute.normalized = ( array instanceof Float32Array ) === false;\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( name, attribute );\n\n\t\t}\n\n\t\treturn geometry;\n\n\t}\n\n\t_assignVertexColorSpace( attribute, inputColorSpace ) {\n\n\t\t// While .drc files do not specify colorspace, the only 'official' tooling\n\t\t// is PLY and OBJ converters, which use sRGB. We'll assume sRGB when a .drc\n\t\t// file is passed into .load() or .parse(). GLTFLoader uses internal APIs\n\t\t// to decode geometry, and vertex colors are already Linear-sRGB in there.\n\n\t\tif ( inputColorSpace !== SRGBColorSpace ) return;\n\n\t\tconst _color = new Color();\n\n\t\tfor ( let i = 0, il = attribute.count; i < il; i ++ ) {\n\n\t\t\t_color.fromBufferAttribute( attribute, i );\n\t\t\tColorManagement.colorSpaceToWorking( _color, SRGBColorSpace );\n\t\t\tattribute.setXYZ( i, _color.r, _color.g, _color.b );\n\n\t\t}\n\n\t}\n\n\t_loadLibrary( url, responseType ) {\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.decoderPath );\n\t\tloader.setResponseType( responseType );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\treturn new Promise( ( resolve, reject ) => {\n\n\t\t\tloader.load( url, resolve, undefined, reject );\n\n\t\t} );\n\n\t}\n\n\tpreload() {\n\n\t\tthis._initDecoder();\n\n\t\treturn this;\n\n\t}\n\n\t_initDecoder() {\n\n\t\tif ( this.decoderPending ) return this.decoderPending;\n\n\t\tconst useJS = typeof WebAssembly !== 'object' || this.decoderConfig.type === 'js';\n\t\tconst librariesPending = [];\n\n\t\tif ( useJS ) {\n\n\t\t\tlibrariesPending.push( this._loadLibrary( 'draco_decoder.js', 'text' ) );\n\n\t\t} else {\n\n\t\t\tlibrariesPending.push( this._loadLibrary( 'draco_wasm_wrapper.js', 'text' ) );\n\t\t\tlibrariesPending.push( this._loadLibrary( 'draco_decoder.wasm', 'arraybuffer' ) );\n\n\t\t}\n\n\t\tthis.decoderPending = Promise.all( librariesPending )\n\t\t\t.then( ( libraries ) => {\n\n\t\t\t\tconst jsContent = libraries[ 0 ];\n\n\t\t\t\tif ( ! useJS ) {\n\n\t\t\t\t\tthis.decoderConfig.wasmBinary = libraries[ 1 ];\n\n\t\t\t\t}\n\n\t\t\t\tconst fn = DRACOWorker.toString();\n\n\t\t\t\tconst body = [\n\t\t\t\t\t'/* draco decoder */',\n\t\t\t\t\tjsContent,\n\t\t\t\t\t'',\n\t\t\t\t\t'/* worker */',\n\t\t\t\t\tfn.substring( fn.indexOf( '{' ) + 1, fn.lastIndexOf( '}' ) )\n\t\t\t\t].join( '\\n' );\n\n\t\t\t\tthis.workerSourceURL = URL.createObjectURL( new Blob( [ body ] ) );\n\n\t\t\t} );\n\n\t\treturn this.decoderPending;\n\n\t}\n\n\t_getWorker( taskID, taskCost ) {\n\n\t\treturn this._initDecoder().then( () => {\n\n\t\t\tif ( this.workerPool.length < this.workerLimit ) {\n\n\t\t\t\tconst worker = new Worker( this.workerSourceURL );\n\n\t\t\t\tworker._callbacks = {};\n\t\t\t\tworker._taskCosts = {};\n\t\t\t\tworker._taskLoad = 0;\n\n\t\t\t\tworker.postMessage( { type: 'init', decoderConfig: this.decoderConfig } );\n\n\t\t\t\tworker.onmessage = function ( e ) {\n\n\t\t\t\t\tconst message = e.data;\n\n\t\t\t\t\tswitch ( message.type ) {\n\n\t\t\t\t\t\tcase 'decode':\n\t\t\t\t\t\t\tworker._callbacks[ message.id ].resolve( message );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'error':\n\t\t\t\t\t\t\tworker._callbacks[ message.id ].reject( message );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tconsole.error( 'THREE.DRACOLoader: Unexpected message, \"' + message.type + '\"' );\n\n\t\t\t\t\t}\n\n\t\t\t\t};\n\n\t\t\t\tthis.workerPool.push( worker );\n\n\t\t\t} else {\n\n\t\t\t\tthis.workerPool.sort( function ( a, b ) {\n\n\t\t\t\t\treturn a._taskLoad > b._taskLoad ? - 1 : 1;\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tconst worker = this.workerPool[ this.workerPool.length - 1 ];\n\t\t\tworker._taskCosts[ taskID ] = taskCost;\n\t\t\tworker._taskLoad += taskCost;\n\t\t\treturn worker;\n\n\t\t} );\n\n\t}\n\n\t_releaseTask( worker, taskID ) {\n\n\t\tworker._taskLoad -= worker._taskCosts[ taskID ];\n\t\tdelete worker._callbacks[ taskID ];\n\t\tdelete worker._taskCosts[ taskID ];\n\n\t}\n\n\tdebug() {\n\n\t\tconsole.log( 'Task load: ', this.workerPool.map( ( worker ) => worker._taskLoad ) );\n\n\t}\n\n\tdispose() {\n\n\t\tfor ( let i = 0; i < this.workerPool.length; ++ i ) {\n\n\t\t\tthis.workerPool[ i ].terminate();\n\n\t\t}\n\n\t\tthis.workerPool.length = 0;\n\n\t\tif ( this.workerSourceURL !== '' ) {\n\n\t\t\tURL.revokeObjectURL( this.workerSourceURL );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\n/* WEB WORKER */\n\nfunction DRACOWorker() {\n\n\tlet decoderConfig;\n\tlet decoderPending;\n\n\tonmessage = function ( e ) {\n\n\t\tconst message = e.data;\n\n\t\tswitch ( message.type ) {\n\n\t\t\tcase 'init':\n\t\t\t\tdecoderConfig = message.decoderConfig;\n\t\t\t\tdecoderPending = new Promise( function ( resolve/*, reject*/ ) {\n\n\t\t\t\t\tdecoderConfig.onModuleLoaded = function ( draco ) {\n\n\t\t\t\t\t\t// Module is Promise-like. Wrap before resolving to avoid loop.\n\t\t\t\t\t\tresolve( { draco: draco } );\n\n\t\t\t\t\t};\n\n\t\t\t\t\tDracoDecoderModule( decoderConfig ); // eslint-disable-line no-undef\n\n\t\t\t\t} );\n\t\t\t\tbreak;\n\n\t\t\tcase 'decode':\n\t\t\t\tconst buffer = message.buffer;\n\t\t\t\tconst taskConfig = message.taskConfig;\n\t\t\t\tdecoderPending.then( ( module ) => {\n\n\t\t\t\t\tconst draco = module.draco;\n\t\t\t\t\tconst decoder = new draco.Decoder();\n\n\t\t\t\t\ttry {\n\n\t\t\t\t\t\tconst geometry = decodeGeometry( draco, decoder, new Int8Array( buffer ), taskConfig );\n\n\t\t\t\t\t\tconst buffers = geometry.attributes.map( ( attr ) => attr.array.buffer );\n\n\t\t\t\t\t\tif ( geometry.index ) buffers.push( geometry.index.array.buffer );\n\n\t\t\t\t\t\tself.postMessage( { type: 'decode', id: message.id, geometry }, buffers );\n\n\t\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t\tconsole.error( error );\n\n\t\t\t\t\t\tself.postMessage( { type: 'error', id: message.id, error: error.message } );\n\n\t\t\t\t\t} finally {\n\n\t\t\t\t\t\tdraco.destroy( decoder );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t};\n\n\tfunction decodeGeometry( draco, decoder, array, taskConfig ) {\n\n\t\tconst attributeIDs = taskConfig.attributeIDs;\n\t\tconst attributeTypes = taskConfig.attributeTypes;\n\n\t\tlet dracoGeometry;\n\t\tlet decodingStatus;\n\n\t\tconst geometryType = decoder.GetEncodedGeometryType( array );\n\n\t\tif ( geometryType === draco.TRIANGULAR_MESH ) {\n\n\t\t\tdracoGeometry = new draco.Mesh();\n\t\t\tdecodingStatus = decoder.DecodeArrayToMesh( array, array.byteLength, dracoGeometry );\n\n\t\t} else if ( geometryType === draco.POINT_CLOUD ) {\n\n\t\t\tdracoGeometry = new draco.PointCloud();\n\t\t\tdecodingStatus = decoder.DecodeArrayToPointCloud( array, array.byteLength, dracoGeometry );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.DRACOLoader: Unexpected geometry type.' );\n\n\t\t}\n\n\t\tif ( ! decodingStatus.ok() || dracoGeometry.ptr === 0 ) {\n\n\t\t\tthrow new Error( 'THREE.DRACOLoader: Decoding failed: ' + decodingStatus.error_msg() );\n\n\t\t}\n\n\t\tconst geometry = { index: null, attributes: [] };\n\n\t\t// Gather all vertex attributes.\n\t\tfor ( const attributeName in attributeIDs ) {\n\n\t\t\tconst attributeType = self[ attributeTypes[ attributeName ] ];\n\n\t\t\tlet attribute;\n\t\t\tlet attributeID;\n\n\t\t\t// A Draco file may be created with default vertex attributes, whose attribute IDs\n\t\t\t// are mapped 1:1 from their semantic name (POSITION, NORMAL, ...). Alternatively,\n\t\t\t// a Draco file may contain a custom set of attributes, identified by known unique\n\t\t\t// IDs. glTF files always do the latter, and `.drc` files typically do the former.\n\t\t\tif ( taskConfig.useUniqueIDs ) {\n\n\t\t\t\tattributeID = attributeIDs[ attributeName ];\n\t\t\t\tattribute = decoder.GetAttributeByUniqueId( dracoGeometry, attributeID );\n\n\t\t\t} else {\n\n\t\t\t\tattributeID = decoder.GetAttributeId( dracoGeometry, draco[ attributeIDs[ attributeName ] ] );\n\n\t\t\t\tif ( attributeID === - 1 ) continue;\n\n\t\t\t\tattribute = decoder.GetAttribute( dracoGeometry, attributeID );\n\n\t\t\t}\n\n\t\t\tconst attributeResult = decodeAttribute( draco, decoder, dracoGeometry, attributeName, attributeType, attribute );\n\n\t\t\tif ( attributeName === 'color' ) {\n\n\t\t\t\tattributeResult.vertexColorSpace = taskConfig.vertexColorSpace;\n\n\t\t\t}\n\n\t\t\tgeometry.attributes.push( attributeResult );\n\n\t\t}\n\n\t\t// Add index.\n\t\tif ( geometryType === draco.TRIANGULAR_MESH ) {\n\n\t\t\tgeometry.index = decodeIndex( draco, decoder, dracoGeometry );\n\n\t\t}\n\n\t\tdraco.destroy( dracoGeometry );\n\n\t\treturn geometry;\n\n\t}\n\n\tfunction decodeIndex( draco, decoder, dracoGeometry ) {\n\n\t\tconst numFaces = dracoGeometry.num_faces();\n\t\tconst numIndices = numFaces * 3;\n\t\tconst byteLength = numIndices * 4;\n\n\t\tconst ptr = draco._malloc( byteLength );\n\t\tdecoder.GetTrianglesUInt32Array( dracoGeometry, byteLength, ptr );\n\t\tconst index = new Uint32Array( draco.HEAPF32.buffer, ptr, numIndices ).slice();\n\t\tdraco._free( ptr );\n\n\t\treturn { array: index, itemSize: 1 };\n\n\t}\n\n\tfunction decodeAttribute( draco, decoder, dracoGeometry, attributeName, TypedArray, attribute ) {\n\n\t\tconst count = dracoGeometry.num_points();\n\t\tconst itemSize = attribute.num_components();\n\t\tconst dracoDataType = getDracoDataType( draco, TypedArray );\n\n\t\t// Reference: https://registry.khronos.org/glTF/specs/2.0/glTF-2.0.html#data-alignment\n\t\tconst srcByteStride = itemSize * TypedArray.BYTES_PER_ELEMENT;\n\t\tconst dstByteStride = Math.ceil( srcByteStride / 4 ) * 4;\n\n\t\tconst dstStride = dstByteStride / TypedArray.BYTES_PER_ELEMENT;\n\n\t\tconst srcByteLength = count * srcByteStride;\n\t\tconst dstByteLength = count * dstByteStride;\n\n\t\tconst ptr = draco._malloc( srcByteLength );\n\t\tdecoder.GetAttributeDataArrayForAllPoints( dracoGeometry, attribute, dracoDataType, srcByteLength, ptr );\n\n\t\tconst srcArray = new TypedArray( draco.HEAPF32.buffer, ptr, srcByteLength / TypedArray.BYTES_PER_ELEMENT );\n\t\tlet dstArray;\n\n\t\tif ( srcByteStride === dstByteStride ) {\n\n\t\t\t// THREE.BufferAttribute\n\n\t\t\tdstArray = srcArray.slice();\n\n\t\t} else {\n\n\t\t\t// THREE.InterleavedBufferAttribute\n\n\t\t\tdstArray = new TypedArray( dstByteLength / TypedArray.BYTES_PER_ELEMENT );\n\n\t\t\tlet dstOffset = 0;\n\n\t\t\tfor ( let i = 0, il = srcArray.length; i < il; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\tdstArray[ dstOffset + j ] = srcArray[ i * itemSize + j ];\n\n\t\t\t\t}\n\n\t\t\t\tdstOffset += dstStride;\n\n\t\t\t}\n\n\t\t}\n\n\t\tdraco._free( ptr );\n\n\t\treturn {\n\t\t\tname: attributeName,\n\t\t\tcount: count,\n\t\t\titemSize: itemSize,\n\t\t\tarray: dstArray,\n\t\t\tstride: dstStride\n\t\t};\n\n\t}\n\n\tfunction getDracoDataType( draco, TypedArray ) {\n\n\t\tswitch ( TypedArray ) {\n\n\t\t\tcase Float32Array: return draco.DT_FLOAT32;\n\t\t\tcase Int8Array: return draco.DT_INT8;\n\t\t\tcase Int16Array: return draco.DT_INT16;\n\t\t\tcase Int32Array: return draco.DT_INT32;\n\t\t\tcase Uint8Array: return draco.DT_UINT8;\n\t\t\tcase Uint16Array: return draco.DT_UINT16;\n\t\t\tcase Uint32Array: return draco.DT_UINT32;\n\n\t\t}\n\n\t}\n\n}\n\nexport { DRACOLoader };\n", "import {\n\tAmbientLight,\n\tAnimationClip,\n\tBone,\n\tBufferGeometry,\n\tClampToEdgeWrapping,\n\tColor,\n\tColorManagement,\n\tDirectionalLight,\n\tEquirectangularReflectionMapping,\n\tEuler,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tGroup,\n\tLine,\n\tLineBasicMaterial,\n\tLoader,\n\tLoaderUtils,\n\tMathUtils,\n\tMatrix3,\n\tMatrix4,\n\tMesh,\n\tMeshLambertMaterial,\n\tMeshPhongMaterial,\n\tNumberKeyframeTrack,\n\tObject3D,\n\tPerspectiveCamera,\n\tPointLight,\n\tPropertyBinding,\n\tQuaternion,\n\tQuaternionKeyframeTrack,\n\tRepeatWrapping,\n\tSRGBColorSpace,\n\tShapeUtils,\n\tSkeleton,\n\tSkinnedMesh,\n\tSpotLight,\n\tTexture,\n\tTextureLoader,\n\tUint16BufferAttribute,\n\tVector2,\n\tVector3,\n\tVector4,\n\tVectorKeyframeTrack\n} from 'three';\n\nimport * as fflate from '../libs/fflate.module.js';\nimport { NURBSCurve } from '../curves/NURBSCurve.js';\n\nlet fbxTree;\nlet connections;\nlet sceneGraph;\n\n/**\n * A loader for the FBX format.\n *\n * Requires FBX file to be >= 7.0 and in ASCII or >= 6400 in Binary format.\n * Versions lower than this may load but will probably have errors.\n *\n * Needs Support:\n * - Morph normals / blend shape normals\n *\n * FBX format references:\n * - [C++ SDK reference](https://help.autodesk.com/view/FBX/2017/ENU/?guid=__cpp_ref_index_html)\n *\n * Binary format specification:\n * - [FBX binary file format specification](https://code.blender.org/2013/08/fbx-binary-file-format-specification/)\n *\n * ```js\n * const loader = new FBXLoader();\n * const object = await loader.loadAsync( 'models/fbx/stanford-bunny.fbx' );\n * scene.add( object );\n * ```\n *\n * @augments Loader\n * @three_import import { FBXLoader } from 'three/addons/loaders/FBXLoader.js';\n */\nclass FBXLoader extends Loader {\n\n\t/**\n\t * Constructs a new FBX loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded FBX asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Group)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( scope.path === '' ) ? LoaderUtils.extractUrlBase( url ) : scope.path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( buffer, path ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given FBX data and returns the resulting group.\n\t *\n\t * @param {ArrayBuffer} FBXBuffer - The raw FBX data as an array buffer.\n\t * @param {string} path - The URL base path.\n\t * @return {Group} An object representing the parsed asset.\n\t */\n\tparse( FBXBuffer, path ) {\n\n\t\tif ( isFbxFormatBinary( FBXBuffer ) ) {\n\n\t\t\tfbxTree = new BinaryParser().parse( FBXBuffer );\n\n\t\t} else {\n\n\t\t\tconst FBXText = convertArrayBufferToString( FBXBuffer );\n\n\t\t\tif ( ! isFbxFormatASCII( FBXText ) ) {\n\n\t\t\t\tthrow new Error( 'THREE.FBXLoader: Unknown format.' );\n\n\t\t\t}\n\n\t\t\tif ( getFbxVersion( FBXText ) < 7000 ) {\n\n\t\t\t\tthrow new Error( 'THREE.FBXLoader: FBX version not supported, FileVersion: ' + getFbxVersion( FBXText ) );\n\n\t\t\t}\n\n\t\t\tfbxTree = new TextParser().parse( FBXText );\n\n\t\t}\n\n\t\t// console.log( fbxTree );\n\n\t\tconst textureLoader = new TextureLoader( this.manager ).setPath( this.resourcePath || path ).setCrossOrigin( this.crossOrigin );\n\n\t\treturn new FBXTreeParser( textureLoader, this.manager ).parse( fbxTree );\n\n\t}\n\n}\n\n// Parse the FBXTree object returned by the BinaryParser or TextParser and return a Group\nclass FBXTreeParser {\n\n\tconstructor( textureLoader, manager ) {\n\n\t\tthis.textureLoader = textureLoader;\n\t\tthis.manager = manager;\n\n\t}\n\n\tparse() {\n\n\t\tconnections = this.parseConnections();\n\n\t\tconst images = this.parseImages();\n\t\tconst textures = this.parseTextures( images );\n\t\tconst materials = this.parseMaterials( textures );\n\t\tconst deformers = this.parseDeformers();\n\t\tconst geometryMap = new GeometryParser().parse( deformers );\n\n\t\tthis.parseScene( deformers, geometryMap, materials );\n\n\t\treturn sceneGraph;\n\n\t}\n\n\t// Parses FBXTree.Connections which holds parent-child connections between objects (e.g. material -> texture, model->geometry )\n\t// and details the connection type\n\tparseConnections() {\n\n\t\tconst connectionMap = new Map();\n\n\t\tif ( 'Connections' in fbxTree ) {\n\n\t\t\tconst rawConnections = fbxTree.Connections.connections;\n\n\t\t\trawConnections.forEach( function ( rawConnection ) {\n\n\t\t\t\tconst fromID = rawConnection[ 0 ];\n\t\t\t\tconst toID = rawConnection[ 1 ];\n\t\t\t\tconst relationship = rawConnection[ 2 ];\n\n\t\t\t\tif ( ! connectionMap.has( fromID ) ) {\n\n\t\t\t\t\tconnectionMap.set( fromID, {\n\t\t\t\t\t\tparents: [],\n\t\t\t\t\t\tchildren: []\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t\tconst parentRelationship = { ID: toID, relationship: relationship };\n\t\t\t\tconnectionMap.get( fromID ).parents.push( parentRelationship );\n\n\t\t\t\tif ( ! connectionMap.has( toID ) ) {\n\n\t\t\t\t\tconnectionMap.set( toID, {\n\t\t\t\t\t\tparents: [],\n\t\t\t\t\t\tchildren: []\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t\tconst childRelationship = { ID: fromID, relationship: relationship };\n\t\t\t\tconnectionMap.get( toID ).children.push( childRelationship );\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn connectionMap;\n\n\t}\n\n\t// Parse FBXTree.Objects.Video for embedded image data\n\t// These images are connected to textures in FBXTree.Objects.Textures\n\t// via FBXTree.Connections.\n\tparseImages() {\n\n\t\tconst images = {};\n\t\tconst blobs = {};\n\n\t\tif ( 'Video' in fbxTree.Objects ) {\n\n\t\t\tconst videoNodes = fbxTree.Objects.Video;\n\n\t\t\tfor ( const nodeID in videoNodes ) {\n\n\t\t\t\tconst videoNode = videoNodes[ nodeID ];\n\n\t\t\t\tconst id = parseInt( nodeID );\n\n\t\t\t\timages[ id ] = videoNode.RelativeFilename || videoNode.Filename;\n\n\t\t\t\t// raw image data is in videoNode.Content\n\t\t\t\tif ( 'Content' in videoNode ) {\n\n\t\t\t\t\tconst arrayBufferContent = ( videoNode.Content instanceof ArrayBuffer ) && ( videoNode.Content.byteLength > 0 );\n\t\t\t\t\tconst base64Content = ( typeof videoNode.Content === 'string' ) && ( videoNode.Content !== '' );\n\n\t\t\t\t\tif ( arrayBufferContent || base64Content ) {\n\n\t\t\t\t\t\tconst image = this.parseImage( videoNodes[ nodeID ] );\n\n\t\t\t\t\t\tblobs[ videoNode.RelativeFilename || videoNode.Filename ] = image;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( const id in images ) {\n\n\t\t\tconst filename = images[ id ];\n\n\t\t\tif ( blobs[ filename ] !== undefined ) images[ id ] = blobs[ filename ];\n\t\t\telse images[ id ] = images[ id ].split( '\\\\' ).pop();\n\n\t\t}\n\n\t\treturn images;\n\n\t}\n\n\t// Parse embedded image data in FBXTree.Video.Content\n\tparseImage( videoNode ) {\n\n\t\tconst content = videoNode.Content;\n\t\tconst fileName = videoNode.RelativeFilename || videoNode.Filename;\n\t\tconst extension = fileName.slice( fileName.lastIndexOf( '.' ) + 1 ).toLowerCase();\n\n\t\tlet type;\n\n\t\tswitch ( extension ) {\n\n\t\t\tcase 'bmp':\n\n\t\t\t\ttype = 'image/bmp';\n\t\t\t\tbreak;\n\n\t\t\tcase 'jpg':\n\t\t\tcase 'jpeg':\n\n\t\t\t\ttype = 'image/jpeg';\n\t\t\t\tbreak;\n\n\t\t\tcase 'png':\n\n\t\t\t\ttype = 'image/png';\n\t\t\t\tbreak;\n\n\t\t\tcase 'tif':\n\n\t\t\t\ttype = 'image/tiff';\n\t\t\t\tbreak;\n\n\t\t\tcase 'tga':\n\n\t\t\t\tif ( this.manager.getHandler( '.tga' ) === null ) {\n\n\t\t\t\t\tconsole.warn( 'FBXLoader: TGA loader not found, skipping ', fileName );\n\n\t\t\t\t}\n\n\t\t\t\ttype = 'image/tga';\n\t\t\t\tbreak;\n\n\t\t\tcase 'webp':\n\n\t\t\t\ttype = 'image/webp';\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tconsole.warn( 'FBXLoader: Image type \"' + extension + '\" is not supported.' );\n\t\t\t\treturn;\n\n\t\t}\n\n\t\tif ( typeof content === 'string' ) { // ASCII format\n\n\t\t\treturn 'data:' + type + ';base64,' + content;\n\n\t\t} else { // Binary Format\n\n\t\t\tconst array = new Uint8Array( content );\n\t\t\treturn window.URL.createObjectURL( new Blob( [ array ], { type: type } ) );\n\n\t\t}\n\n\t}\n\n\t// Parse nodes in FBXTree.Objects.Texture\n\t// These contain details such as UV scaling, cropping, rotation etc and are connected\n\t// to images in FBXTree.Objects.Video\n\tparseTextures( images ) {\n\n\t\tconst textureMap = new Map();\n\n\t\tif ( 'Texture' in fbxTree.Objects ) {\n\n\t\t\tconst textureNodes = fbxTree.Objects.Texture;\n\t\t\tfor ( const nodeID in textureNodes ) {\n\n\t\t\t\tconst texture = this.parseTexture( textureNodes[ nodeID ], images );\n\t\t\t\ttextureMap.set( parseInt( nodeID ), texture );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn textureMap;\n\n\t}\n\n\t// Parse individual node in FBXTree.Objects.Texture\n\tparseTexture( textureNode, images ) {\n\n\t\tconst texture = this.loadTexture( textureNode, images );\n\n\t\ttexture.ID = textureNode.id;\n\n\t\ttexture.name = textureNode.attrName;\n\n\t\tconst wrapModeU = textureNode.WrapModeU;\n\t\tconst wrapModeV = textureNode.WrapModeV;\n\n\t\tconst valueU = wrapModeU !== undefined ? wrapModeU.value : 0;\n\t\tconst valueV = wrapModeV !== undefined ? wrapModeV.value : 0;\n\n\t\t// http://download.autodesk.com/us/fbx/SDKdocs/FBX_SDK_Help/files/fbxsdkref/class_k_fbx_texture.html#889640e63e2e681259ea81061b85143a\n\t\t// 0: repeat(default), 1: clamp\n\n\t\ttexture.wrapS = valueU === 0 ? RepeatWrapping : ClampToEdgeWrapping;\n\t\ttexture.wrapT = valueV === 0 ? RepeatWrapping : ClampToEdgeWrapping;\n\n\t\tif ( 'Scaling' in textureNode ) {\n\n\t\t\tconst values = textureNode.Scaling.value;\n\n\t\t\ttexture.repeat.x = values[ 0 ];\n\t\t\ttexture.repeat.y = values[ 1 ];\n\n\t\t}\n\n\t\tif ( 'Translation' in textureNode ) {\n\n\t\t\tconst values = textureNode.Translation.value;\n\n\t\t\ttexture.offset.x = values[ 0 ];\n\t\t\ttexture.offset.y = values[ 1 ];\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\t// load a texture specified as a blob or data URI, or via an external URL using TextureLoader\n\tloadTexture( textureNode, images ) {\n\n\t\tconst extension = textureNode.FileName.split( '.' ).pop().toLowerCase();\n\n\t\tlet loader = this.manager.getHandler( `.${extension}` );\n\t\tif ( loader === null ) loader = this.textureLoader;\n\n\t\tconst loaderPath = loader.path;\n\n\t\tif ( ! loaderPath ) {\n\n\t\t\tloader.setPath( this.textureLoader.path );\n\n\t\t}\n\n\t\tconst children = connections.get( textureNode.id ).children;\n\n\t\tlet fileName;\n\n\t\tif ( children !== undefined && children.length > 0 && images[ children[ 0 ].ID ] !== undefined ) {\n\n\t\t\tfileName = images[ children[ 0 ].ID ];\n\n\t\t\tif ( fileName.indexOf( 'blob:' ) === 0 || fileName.indexOf( 'data:' ) === 0 ) {\n\n\t\t\t\tloader.setPath( undefined );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( fileName === undefined ) {\n\n\t\t\tconsole.warn( 'FBXLoader: Undefined filename, creating placeholder texture.' );\n\t\t\treturn new Texture();\n\n\t\t}\n\n\t\tconst texture = loader.load( fileName );\n\n\t\t// revert to initial path\n\t\tloader.setPath( loaderPath );\n\n\t\treturn texture;\n\n\t}\n\n\t// Parse nodes in FBXTree.Objects.Material\n\tparseMaterials( textureMap ) {\n\n\t\tconst materialMap = new Map();\n\n\t\tif ( 'Material' in fbxTree.Objects ) {\n\n\t\t\tconst materialNodes = fbxTree.Objects.Material;\n\n\t\t\tfor ( const nodeID in materialNodes ) {\n\n\t\t\t\tconst material = this.parseMaterial( materialNodes[ nodeID ], textureMap );\n\n\t\t\t\tif ( material !== null ) materialMap.set( parseInt( nodeID ), material );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn materialMap;\n\n\t}\n\n\t// Parse single node in FBXTree.Objects.Material\n\t// Materials are connected to texture maps in FBXTree.Objects.Textures\n\t// FBX format currently only supports Lambert and Phong shading models\n\tparseMaterial( materialNode, textureMap ) {\n\n\t\tconst ID = materialNode.id;\n\t\tconst name = materialNode.attrName;\n\t\tlet type = materialNode.ShadingModel;\n\n\t\t// Case where FBX wraps shading model in property object.\n\t\tif ( typeof type === 'object' ) {\n\n\t\t\ttype = type.value;\n\n\t\t}\n\n\t\t// Ignore unused materials which don't have any connections.\n\t\tif ( ! connections.has( ID ) ) return null;\n\n\t\tconst parameters = this.parseParameters( materialNode, textureMap, ID );\n\n\t\tlet material;\n\n\t\tswitch ( type.toLowerCase() ) {\n\n\t\t\tcase 'phong':\n\t\t\t\tmaterial = new MeshPhongMaterial();\n\t\t\t\tbreak;\n\t\t\tcase 'lambert':\n\t\t\t\tmaterial = new MeshLambertMaterial();\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tconsole.warn( 'THREE.FBXLoader: unknown material type \"%s\". Defaulting to MeshPhongMaterial.', type );\n\t\t\t\tmaterial = new MeshPhongMaterial();\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tmaterial.setValues( parameters );\n\t\tmaterial.name = name;\n\n\t\treturn material;\n\n\t}\n\n\t// Parse FBX material and return parameters suitable for a three.js material\n\t// Also parse the texture map and return any textures associated with the material\n\tparseParameters( materialNode, textureMap, ID ) {\n\n\t\tconst parameters = {};\n\n\t\tif ( materialNode.BumpFactor ) {\n\n\t\t\tparameters.bumpScale = materialNode.BumpFactor.value;\n\n\t\t}\n\n\t\tif ( materialNode.Diffuse ) {\n\n\t\t\tparameters.color = ColorManagement.colorSpaceToWorking( new Color().fromArray( materialNode.Diffuse.value ), SRGBColorSpace );\n\n\t\t} else if ( materialNode.DiffuseColor && ( materialNode.DiffuseColor.type === 'Color' || materialNode.DiffuseColor.type === 'ColorRGB' ) ) {\n\n\t\t\t// The blender exporter exports diffuse here instead of in materialNode.Diffuse\n\t\t\tparameters.color = ColorManagement.colorSpaceToWorking( new Color().fromArray( materialNode.DiffuseColor.value ), SRGBColorSpace );\n\n\t\t}\n\n\t\tif ( materialNode.DisplacementFactor ) {\n\n\t\t\tparameters.displacementScale = materialNode.DisplacementFactor.value;\n\n\t\t}\n\n\t\tif ( materialNode.Emissive ) {\n\n\t\t\tparameters.emissive = ColorManagement.colorSpaceToWorking( new Color().fromArray( materialNode.Emissive.value ), SRGBColorSpace );\n\n\t\t} else if ( materialNode.EmissiveColor && ( materialNode.EmissiveColor.type === 'Color' || materialNode.EmissiveColor.type === 'ColorRGB' ) ) {\n\n\t\t\t// The blender exporter exports emissive color here instead of in materialNode.Emissive\n\t\t\tparameters.emissive = ColorManagement.colorSpaceToWorking( new Color().fromArray( materialNode.EmissiveColor.value ), SRGBColorSpace );\n\n\t\t}\n\n\t\tif ( materialNode.EmissiveFactor ) {\n\n\t\t\tparameters.emissiveIntensity = parseFloat( materialNode.EmissiveFactor.value );\n\n\t\t}\n\n\t\t// the transparency handling is implemented based on Blender/Unity's approach: https://github.com/sobotka/blender-addons/blob/7d80f2f97161fc8e353a657b179b9aa1f8e5280b/io_scene_fbx/import_fbx.py#L1444-L1459\n\n\t\tparameters.opacity = 1 - ( materialNode.TransparencyFactor ? parseFloat( materialNode.TransparencyFactor.value ) : 0 );\n\n\t\tif ( parameters.opacity === 1 || parameters.opacity === 0 ) {\n\n\t\t\tparameters.opacity = ( materialNode.Opacity ? parseFloat( materialNode.Opacity.value ) : null );\n\n\t\t\tif ( parameters.opacity === null ) {\n\n\t\t\t\tparameters.opacity = 1 - ( materialNode.TransparentColor ? parseFloat( materialNode.TransparentColor.value[ 0 ] ) : 0 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( parameters.opacity < 1.0 ) {\n\n\t\t\tparameters.transparent = true;\n\n\t\t}\n\n\t\tif ( materialNode.ReflectionFactor ) {\n\n\t\t\tparameters.reflectivity = materialNode.ReflectionFactor.value;\n\n\t\t}\n\n\t\tif ( materialNode.Shininess ) {\n\n\t\t\tparameters.shininess = materialNode.Shininess.value;\n\n\t\t}\n\n\t\tif ( materialNode.Specular ) {\n\n\t\t\tparameters.specular = ColorManagement.colorSpaceToWorking( new Color().fromArray( materialNode.Specular.value ), SRGBColorSpace );\n\n\t\t} else if ( materialNode.SpecularColor && materialNode.SpecularColor.type === 'Color' ) {\n\n\t\t\t// The blender exporter exports specular color here instead of in materialNode.Specular\n\t\t\tparameters.specular = ColorManagement.colorSpaceToWorking( new Color().fromArray( materialNode.SpecularColor.value ), SRGBColorSpace );\n\n\t\t}\n\n\t\tconst scope = this;\n\t\tconnections.get( ID ).children.forEach( function ( child ) {\n\n\t\t\tconst type = child.relationship;\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 'Bump':\n\t\t\t\t\tparameters.bumpMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Maya|TEX_ao_map':\n\t\t\t\t\tparameters.aoMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'DiffuseColor':\n\t\t\t\tcase 'Maya|TEX_color_map':\n\t\t\t\t\tparameters.map = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\tif ( parameters.map !== undefined ) {\n\n\t\t\t\t\t\tparameters.map.colorSpace = SRGBColorSpace;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'DisplacementColor':\n\t\t\t\t\tparameters.displacementMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'EmissiveColor':\n\t\t\t\t\tparameters.emissiveMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\tif ( parameters.emissiveMap !== undefined ) {\n\n\t\t\t\t\t\tparameters.emissiveMap.colorSpace = SRGBColorSpace;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'NormalMap':\n\t\t\t\tcase 'Maya|TEX_normal_map':\n\t\t\t\t\tparameters.normalMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ReflectionColor':\n\t\t\t\t\tparameters.envMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\tif ( parameters.envMap !== undefined ) {\n\n\t\t\t\t\t\tparameters.envMap.mapping = EquirectangularReflectionMapping;\n\t\t\t\t\t\tparameters.envMap.colorSpace = SRGBColorSpace;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'SpecularColor':\n\t\t\t\t\tparameters.specularMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\tif ( parameters.specularMap !== undefined ) {\n\n\t\t\t\t\t\tparameters.specularMap.colorSpace = SRGBColorSpace;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'TransparentColor':\n\t\t\t\tcase 'TransparencyFactor':\n\t\t\t\t\tparameters.alphaMap = scope.getTexture( textureMap, child.ID );\n\t\t\t\t\tparameters.transparent = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'AmbientColor':\n\t\t\t\tcase 'ShininessExponent': // AKA glossiness map\n\t\t\t\tcase 'SpecularFactor': // AKA specularLevel\n\t\t\t\tcase 'VectorDisplacementColor': // NOTE: Seems to be a copy of DisplacementColor\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.warn( 'THREE.FBXLoader: %s map is not supported in three.js, skipping texture.', type );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn parameters;\n\n\t}\n\n\t// get a texture from the textureMap for use by a material.\n\tgetTexture( textureMap, id ) {\n\n\t\t// if the texture is a layered texture, just use the first layer and issue a warning\n\t\tif ( 'LayeredTexture' in fbxTree.Objects && id in fbxTree.Objects.LayeredTexture ) {\n\n\t\t\tconsole.warn( 'THREE.FBXLoader: layered textures are not supported in three.js. Discarding all but first layer.' );\n\t\t\tid = connections.get( id ).children[ 0 ].ID;\n\n\t\t}\n\n\t\treturn textureMap.get( id );\n\n\t}\n\n\t// Parse nodes in FBXTree.Objects.Deformer\n\t// Deformer node can contain skinning or Vertex Cache animation data, however only skinning is supported here\n\t// Generates map of Skeleton-like objects for use later when generating and binding skeletons.\n\tparseDeformers() {\n\n\t\tconst skeletons = {};\n\t\tconst morphTargets = {};\n\n\t\tif ( 'Deformer' in fbxTree.Objects ) {\n\n\t\t\tconst DeformerNodes = fbxTree.Objects.Deformer;\n\n\t\t\tfor ( const nodeID in DeformerNodes ) {\n\n\t\t\t\tconst deformerNode = DeformerNodes[ nodeID ];\n\n\t\t\t\tconst relationships = connections.get( parseInt( nodeID ) );\n\n\t\t\t\tif ( deformerNode.attrType === 'Skin' ) {\n\n\t\t\t\t\tconst skeleton = this.parseSkeleton( relationships, DeformerNodes );\n\t\t\t\t\tskeleton.ID = nodeID;\n\n\t\t\t\t\tif ( relationships.parents.length > 1 ) console.warn( 'THREE.FBXLoader: skeleton attached to more than one geometry is not supported.' );\n\t\t\t\t\tskeleton.geometryID = relationships.parents[ 0 ].ID;\n\n\t\t\t\t\tskeletons[ nodeID ] = skeleton;\n\n\t\t\t\t} else if ( deformerNode.attrType === 'BlendShape' ) {\n\n\t\t\t\t\tconst morphTarget = {\n\t\t\t\t\t\tid: nodeID,\n\t\t\t\t\t};\n\n\t\t\t\t\tmorphTarget.rawTargets = this.parseMorphTargets( relationships, DeformerNodes );\n\t\t\t\t\tmorphTarget.id = nodeID;\n\n\t\t\t\t\tif ( relationships.parents.length > 1 ) console.warn( 'THREE.FBXLoader: morph target attached to more than one geometry is not supported.' );\n\n\t\t\t\t\tmorphTargets[ nodeID ] = morphTarget;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\n\t\t\tskeletons: skeletons,\n\t\t\tmorphTargets: morphTargets,\n\n\t\t};\n\n\t}\n\n\t// Parse single nodes in FBXTree.Objects.Deformer\n\t// The top level skeleton node has type 'Skin' and sub nodes have type 'Cluster'\n\t// Each skin node represents a skeleton and each cluster node represents a bone\n\tparseSkeleton( relationships, deformerNodes ) {\n\n\t\tconst rawBones = [];\n\n\t\trelationships.children.forEach( function ( child ) {\n\n\t\t\tconst boneNode = deformerNodes[ child.ID ];\n\n\t\t\tif ( boneNode.attrType !== 'Cluster' ) return;\n\n\t\t\tconst rawBone = {\n\n\t\t\t\tID: child.ID,\n\t\t\t\tindices: [],\n\t\t\t\tweights: [],\n\t\t\t\ttransformLink: new Matrix4().fromArray( boneNode.TransformLink.a ),\n\t\t\t\t// transform: new Matrix4().fromArray( boneNode.Transform.a ),\n\t\t\t\t// linkMode: boneNode.Mode,\n\n\t\t\t};\n\n\t\t\tif ( 'Indexes' in boneNode ) {\n\n\t\t\t\trawBone.indices = boneNode.Indexes.a;\n\t\t\t\trawBone.weights = boneNode.Weights.a;\n\n\t\t\t}\n\n\t\t\trawBones.push( rawBone );\n\n\t\t} );\n\n\t\treturn {\n\n\t\t\trawBones: rawBones,\n\t\t\tbones: []\n\n\t\t};\n\n\t}\n\n\t// The top level morph deformer node has type \"BlendShape\" and sub nodes have type \"BlendShapeChannel\"\n\tparseMorphTargets( relationships, deformerNodes ) {\n\n\t\tconst rawMorphTargets = [];\n\n\t\tfor ( let i = 0; i < relationships.children.length; i ++ ) {\n\n\t\t\tconst child = relationships.children[ i ];\n\n\t\t\tconst morphTargetNode = deformerNodes[ child.ID ];\n\n\t\t\tconst rawMorphTarget = {\n\n\t\t\t\tname: morphTargetNode.attrName,\n\t\t\t\tinitialWeight: morphTargetNode.DeformPercent,\n\t\t\t\tid: morphTargetNode.id,\n\t\t\t\tfullWeights: morphTargetNode.FullWeights.a\n\n\t\t\t};\n\n\t\t\tif ( morphTargetNode.attrType !== 'BlendShapeChannel' ) return;\n\n\t\t\trawMorphTarget.geoID = connections.get( parseInt( child.ID ) ).children.filter( function ( child ) {\n\n\t\t\t\treturn child.relationship === undefined;\n\n\t\t\t} )[ 0 ].ID;\n\n\t\t\trawMorphTargets.push( rawMorphTarget );\n\n\t\t}\n\n\t\treturn rawMorphTargets;\n\n\t}\n\n\t// create the main Group() to be returned by the loader\n\tparseScene( deformers, geometryMap, materialMap ) {\n\n\t\tsceneGraph = new Group();\n\n\t\tconst modelMap = this.parseModels( deformers.skeletons, geometryMap, materialMap );\n\n\t\tconst modelNodes = fbxTree.Objects.Model;\n\n\t\tconst scope = this;\n\t\tmodelMap.forEach( function ( model ) {\n\n\t\t\tconst modelNode = modelNodes[ model.ID ];\n\t\t\tscope.setLookAtProperties( model, modelNode );\n\n\t\t\tconst parentConnections = connections.get( model.ID ).parents;\n\n\t\t\tparentConnections.forEach( function ( connection ) {\n\n\t\t\t\tconst parent = modelMap.get( connection.ID );\n\t\t\t\tif ( parent !== undefined ) parent.add( model );\n\n\t\t\t} );\n\n\t\t\tif ( model.parent === null ) {\n\n\t\t\t\tsceneGraph.add( model );\n\n\t\t\t}\n\n\n\t\t} );\n\n\t\tthis.bindSkeleton( deformers.skeletons, geometryMap, modelMap );\n\n\t\tthis.addGlobalSceneSettings();\n\n\t\tsceneGraph.traverse( function ( node ) {\n\n\t\t\tif ( node.userData.transformData ) {\n\n\t\t\t\tif ( node.parent ) {\n\n\t\t\t\t\tnode.userData.transformData.parentMatrix = node.parent.matrix;\n\t\t\t\t\tnode.userData.transformData.parentMatrixWorld = node.parent.matrixWorld;\n\n\t\t\t\t}\n\n\t\t\t\tconst transform = generateTransform( node.userData.transformData );\n\n\t\t\t\tnode.applyMatrix4( transform );\n\t\t\t\tnode.updateWorldMatrix();\n\n\t\t\t}\n\n\t\t} );\n\n\t\tconst animations = new AnimationParser().parse();\n\n\t\t// if all the models where already combined in a single group, just return that\n\t\tif ( sceneGraph.children.length === 1 && sceneGraph.children[ 0 ].isGroup ) {\n\n\t\t\tsceneGraph.children[ 0 ].animations = animations;\n\t\t\tsceneGraph = sceneGraph.children[ 0 ];\n\n\t\t}\n\n\t\tsceneGraph.animations = animations;\n\n\t}\n\n\t// parse nodes in FBXTree.Objects.Model\n\tparseModels( skeletons, geometryMap, materialMap ) {\n\n\t\tconst modelMap = new Map();\n\t\tconst modelNodes = fbxTree.Objects.Model;\n\n\t\tfor ( const nodeID in modelNodes ) {\n\n\t\t\tconst id = parseInt( nodeID );\n\t\t\tconst node = modelNodes[ nodeID ];\n\t\t\tconst relationships = connections.get( id );\n\n\t\t\tlet model = this.buildSkeleton( relationships, skeletons, id, node.attrName );\n\n\t\t\tif ( ! model ) {\n\n\t\t\t\tswitch ( node.attrType ) {\n\n\t\t\t\t\tcase 'Camera':\n\t\t\t\t\t\tmodel = this.createCamera( relationships );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Light':\n\t\t\t\t\t\tmodel = this.createLight( relationships );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Mesh':\n\t\t\t\t\t\tmodel = this.createMesh( relationships, geometryMap, materialMap );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'NurbsCurve':\n\t\t\t\t\t\tmodel = this.createCurve( relationships, geometryMap );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'LimbNode':\n\t\t\t\t\tcase 'Root':\n\t\t\t\t\t\tmodel = new Bone();\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Null':\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tmodel = new Group();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tmodel.name = node.attrName ? PropertyBinding.sanitizeNodeName( node.attrName ) : '';\n\t\t\t\tmodel.userData.originalName = node.attrName;\n\n\t\t\t\tmodel.ID = id;\n\n\t\t\t}\n\n\t\t\tthis.getTransformData( model, node );\n\t\t\tmodelMap.set( id, model );\n\n\t\t}\n\n\t\treturn modelMap;\n\n\t}\n\n\tbuildSkeleton( relationships, skeletons, id, name ) {\n\n\t\tlet bone = null;\n\n\t\trelationships.parents.forEach( function ( parent ) {\n\n\t\t\tfor ( const ID in skeletons ) {\n\n\t\t\t\tconst skeleton = skeletons[ ID ];\n\n\t\t\t\tskeleton.rawBones.forEach( function ( rawBone, i ) {\n\n\t\t\t\t\tif ( rawBone.ID === parent.ID ) {\n\n\t\t\t\t\t\tconst subBone = bone;\n\t\t\t\t\t\tbone = new Bone();\n\n\t\t\t\t\t\tbone.matrixWorld.copy( rawBone.transformLink );\n\n\t\t\t\t\t\t// set name and id here - otherwise in cases where \"subBone\" is created it will not have a name / id\n\n\t\t\t\t\t\tbone.name = name ? PropertyBinding.sanitizeNodeName( name ) : '';\n\t\t\t\t\t\tbone.userData.originalName = name;\n\t\t\t\t\t\tbone.ID = id;\n\n\t\t\t\t\t\tskeleton.bones[ i ] = bone;\n\n\t\t\t\t\t\t// In cases where a bone is shared between multiple meshes\n\t\t\t\t\t\t// duplicate the bone here and add it as a child of the first bone\n\t\t\t\t\t\tif ( subBone !== null ) {\n\n\t\t\t\t\t\t\tbone.add( subBone );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn bone;\n\n\t}\n\n\t// create a PerspectiveCamera or OrthographicCamera\n\tcreateCamera( relationships ) {\n\n\t\tlet model;\n\t\tlet cameraAttribute;\n\n\t\trelationships.children.forEach( function ( child ) {\n\n\t\t\tconst attr = fbxTree.Objects.NodeAttribute[ child.ID ];\n\n\t\t\tif ( attr !== undefined ) {\n\n\t\t\t\tcameraAttribute = attr;\n\n\t\t\t}\n\n\t\t} );\n\n\t\tif ( cameraAttribute === undefined ) {\n\n\t\t\tmodel = new Object3D();\n\n\t\t} else {\n\n\t\t\tlet type = 0;\n\t\t\tif ( cameraAttribute.CameraProjectionType !== undefined && cameraAttribute.CameraProjectionType.value === 1 ) {\n\n\t\t\t\ttype = 1;\n\n\t\t\t}\n\n\t\t\tlet nearClippingPlane = 1;\n\t\t\tif ( cameraAttribute.NearPlane !== undefined ) {\n\n\t\t\t\tnearClippingPlane = cameraAttribute.NearPlane.value / 1000;\n\n\t\t\t}\n\n\t\t\tlet farClippingPlane = 1000;\n\t\t\tif ( cameraAttribute.FarPlane !== undefined ) {\n\n\t\t\t\tfarClippingPlane = cameraAttribute.FarPlane.value / 1000;\n\n\t\t\t}\n\n\n\t\t\tlet width = window.innerWidth;\n\t\t\tlet height = window.innerHeight;\n\n\t\t\tif ( cameraAttribute.AspectWidth !== undefined && cameraAttribute.AspectHeight !== undefined ) {\n\n\t\t\t\twidth = cameraAttribute.AspectWidth.value;\n\t\t\t\theight = cameraAttribute.AspectHeight.value;\n\n\t\t\t}\n\n\t\t\tconst aspect = width / height;\n\n\t\t\tlet fov = 45;\n\t\t\tif ( cameraAttribute.FieldOfView !== undefined ) {\n\n\t\t\t\tfov = cameraAttribute.FieldOfView.value;\n\n\t\t\t}\n\n\t\t\tconst focalLength = cameraAttribute.FocalLength ? cameraAttribute.FocalLength.value : null;\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 0: // Perspective\n\t\t\t\t\tmodel = new PerspectiveCamera( fov, aspect, nearClippingPlane, farClippingPlane );\n\t\t\t\t\tif ( focalLength !== null ) model.setFocalLength( focalLength );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 1: // Orthographic\n\t\t\t\t\tconsole.warn( 'THREE.FBXLoader: Orthographic cameras not supported yet.' );\n\t\t\t\t\tmodel = new Object3D();\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.warn( 'THREE.FBXLoader: Unknown camera type ' + type + '.' );\n\t\t\t\t\tmodel = new Object3D();\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn model;\n\n\t}\n\n\t// Create a DirectionalLight, PointLight or SpotLight\n\tcreateLight( relationships ) {\n\n\t\tlet model;\n\t\tlet lightAttribute;\n\n\t\trelationships.children.forEach( function ( child ) {\n\n\t\t\tconst attr = fbxTree.Objects.NodeAttribute[ child.ID ];\n\n\t\t\tif ( attr !== undefined ) {\n\n\t\t\t\tlightAttribute = attr;\n\n\t\t\t}\n\n\t\t} );\n\n\t\tif ( lightAttribute === undefined ) {\n\n\t\t\tmodel = new Object3D();\n\n\t\t} else {\n\n\t\t\tlet type;\n\n\t\t\t// LightType can be undefined for Point lights\n\t\t\tif ( lightAttribute.LightType === undefined ) {\n\n\t\t\t\ttype = 0;\n\n\t\t\t} else {\n\n\t\t\t\ttype = lightAttribute.LightType.value;\n\n\t\t\t}\n\n\t\t\tlet color = 0xffffff;\n\n\t\t\tif ( lightAttribute.Color !== undefined ) {\n\n\t\t\t\tcolor = ColorManagement.colorSpaceToWorking( new Color().fromArray( lightAttribute.Color.value ), SRGBColorSpace );\n\n\t\t\t}\n\n\t\t\tlet intensity = ( lightAttribute.Intensity === undefined ) ? 1 : lightAttribute.Intensity.value / 100;\n\n\t\t\t// light disabled\n\t\t\tif ( lightAttribute.CastLightOnObject !== undefined && lightAttribute.CastLightOnObject.value === 0 ) {\n\n\t\t\t\tintensity = 0;\n\n\t\t\t}\n\n\t\t\tlet distance = 0;\n\t\t\tif ( lightAttribute.FarAttenuationEnd !== undefined ) {\n\n\t\t\t\tif ( lightAttribute.EnableFarAttenuation !== undefined && lightAttribute.EnableFarAttenuation.value === 0 ) {\n\n\t\t\t\t\tdistance = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdistance = lightAttribute.FarAttenuationEnd.value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// TODO: could this be calculated linearly from FarAttenuationStart to FarAttenuationEnd?\n\t\t\tconst decay = 1;\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 0: // Point\n\t\t\t\t\tmodel = new PointLight( color, intensity, distance, decay );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 1: // Directional\n\t\t\t\t\tmodel = new DirectionalLight( color, intensity );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2: // Spot\n\t\t\t\t\tlet angle = Math.PI / 3;\n\n\t\t\t\t\tif ( lightAttribute.InnerAngle !== undefined ) {\n\n\t\t\t\t\t\tangle = MathUtils.degToRad( lightAttribute.InnerAngle.value );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet penumbra = 0;\n\t\t\t\t\tif ( lightAttribute.OuterAngle !== undefined ) {\n\n\t\t\t\t\t\t// TODO: this is not correct - FBX calculates outer and inner angle in degrees\n\t\t\t\t\t\t// with OuterAngle > InnerAngle && OuterAngle <= Math.PI\n\t\t\t\t\t\t// while three.js uses a penumbra between (0, 1) to attenuate the inner angle\n\t\t\t\t\t\tpenumbra = MathUtils.degToRad( lightAttribute.OuterAngle.value );\n\t\t\t\t\t\tpenumbra = Math.max( penumbra, 1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmodel = new SpotLight( color, intensity, distance, angle, penumbra, decay );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.warn( 'THREE.FBXLoader: Unknown light type ' + lightAttribute.LightType.value + ', defaulting to a PointLight.' );\n\t\t\t\t\tmodel = new PointLight( color, intensity );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( lightAttribute.CastShadows !== undefined && lightAttribute.CastShadows.value === 1 ) {\n\n\t\t\t\tmodel.castShadow = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn model;\n\n\t}\n\n\tcreateMesh( relationships, geometryMap, materialMap ) {\n\n\t\tlet model;\n\t\tlet geometry = null;\n\t\tlet material = null;\n\t\tconst materials = [];\n\n\t\t// get geometry and materials(s) from connections\n\t\trelationships.children.forEach( function ( child ) {\n\n\t\t\tif ( geometryMap.has( child.ID ) ) {\n\n\t\t\t\tgeometry = geometryMap.get( child.ID );\n\n\t\t\t}\n\n\t\t\tif ( materialMap.has( child.ID ) ) {\n\n\t\t\t\tmaterials.push( materialMap.get( child.ID ) );\n\n\t\t\t}\n\n\t\t} );\n\n\t\tif ( materials.length > 1 ) {\n\n\t\t\tmaterial = materials;\n\n\t\t} else if ( materials.length > 0 ) {\n\n\t\t\tmaterial = materials[ 0 ];\n\n\t\t} else {\n\n\t\t\tmaterial = new MeshPhongMaterial( {\n\t\t\t\tname: Loader.DEFAULT_MATERIAL_NAME,\n\t\t\t\tcolor: 0xcccccc\n\t\t\t} );\n\t\t\tmaterials.push( material );\n\n\t\t}\n\n\t\tif ( 'color' in geometry.attributes ) {\n\n\t\t\tmaterials.forEach( function ( material ) {\n\n\t\t\t\tmaterial.vertexColors = true;\n\n\t\t\t} );\n\n\t\t}\n\n\t\t// Sanitization: If geometry has groups, then it must match the provided material array.\n\t\t// If not, we need to clean up the `group.materialIndex` properties inside the groups and point at a (new) default material.\n\t\t// This isn't well defined; Unity creates default material, while Blender implicitly uses the previous material in the list.\n\t\tif ( geometry.groups.length > 0 ) {\n\n\t\t\tlet needsDefaultMaterial = false;\n\n\t\t\tfor ( let i = 0, il = geometry.groups.length; i < il; i ++ ) {\n\n\t\t\t\tconst group = geometry.groups[ i ];\n\n\t\t\t\tif ( group.materialIndex < 0 || group.materialIndex >= materials.length ) {\n\n\t\t\t\t\tgroup.materialIndex = materials.length;\n\t\t\t\t\tneedsDefaultMaterial = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( needsDefaultMaterial ) {\n\n\t\t\t\tconst defaultMaterial = new MeshPhongMaterial();\n\t\t\t\tmaterials.push( defaultMaterial );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( geometry.FBX_Deformer ) {\n\n\t\t\tmodel = new SkinnedMesh( geometry, material );\n\t\t\tmodel.normalizeSkinWeights();\n\n\t\t} else {\n\n\t\t\tmodel = new Mesh( geometry, material );\n\n\t\t}\n\n\t\treturn model;\n\n\t}\n\n\tcreateCurve( relationships, geometryMap ) {\n\n\t\tconst geometry = relationships.children.reduce( function ( geo, child ) {\n\n\t\t\tif ( geometryMap.has( child.ID ) ) geo = geometryMap.get( child.ID );\n\n\t\t\treturn geo;\n\n\t\t}, null );\n\n\t\t// FBX does not list materials for Nurbs lines, so we'll just put our own in here.\n\t\tconst material = new LineBasicMaterial( {\n\t\t\tname: Loader.DEFAULT_MATERIAL_NAME,\n\t\t\tcolor: 0x3300ff,\n\t\t\tlinewidth: 1\n\t\t} );\n\t\treturn new Line( geometry, material );\n\n\t}\n\n\t// parse the model node for transform data\n\tgetTransformData( model, modelNode ) {\n\n\t\tconst transformData = {};\n\n\t\tif ( 'InheritType' in modelNode ) transformData.inheritType = parseInt( modelNode.InheritType.value );\n\n\t\tif ( 'RotationOrder' in modelNode ) transformData.eulerOrder = getEulerOrder( modelNode.RotationOrder.value );\n\t\telse transformData.eulerOrder = getEulerOrder( 0 );\n\n\t\tif ( 'Lcl_Translation' in modelNode ) transformData.translation = modelNode.Lcl_Translation.value;\n\n\t\tif ( 'PreRotation' in modelNode ) transformData.preRotation = modelNode.PreRotation.value;\n\t\tif ( 'Lcl_Rotation' in modelNode ) transformData.rotation = modelNode.Lcl_Rotation.value;\n\t\tif ( 'PostRotation' in modelNode ) transformData.postRotation = modelNode.PostRotation.value;\n\n\t\tif ( 'Lcl_Scaling' in modelNode ) transformData.scale = modelNode.Lcl_Scaling.value;\n\n\t\tif ( 'ScalingOffset' in modelNode ) transformData.scalingOffset = modelNode.ScalingOffset.value;\n\t\tif ( 'ScalingPivot' in modelNode ) transformData.scalingPivot = modelNode.ScalingPivot.value;\n\n\t\tif ( 'RotationOffset' in modelNode ) transformData.rotationOffset = modelNode.RotationOffset.value;\n\t\tif ( 'RotationPivot' in modelNode ) transformData.rotationPivot = modelNode.RotationPivot.value;\n\n\t\tmodel.userData.transformData = transformData;\n\n\t}\n\n\tsetLookAtProperties( model, modelNode ) {\n\n\t\tif ( 'LookAtProperty' in modelNode ) {\n\n\t\t\tconst children = connections.get( model.ID ).children;\n\n\t\t\tchildren.forEach( function ( child ) {\n\n\t\t\t\tif ( child.relationship === 'LookAtProperty' ) {\n\n\t\t\t\t\tconst lookAtTarget = fbxTree.Objects.Model[ child.ID ];\n\n\t\t\t\t\tif ( 'Lcl_Translation' in lookAtTarget ) {\n\n\t\t\t\t\t\tconst pos = lookAtTarget.Lcl_Translation.value;\n\n\t\t\t\t\t\t// DirectionalLight, SpotLight\n\t\t\t\t\t\tif ( model.target !== undefined ) {\n\n\t\t\t\t\t\t\tmodel.target.position.fromArray( pos );\n\t\t\t\t\t\t\tsceneGraph.add( model.target );\n\n\t\t\t\t\t\t} else { // Cameras and other Object3Ds\n\n\t\t\t\t\t\t\tmodel.lookAt( new Vector3().fromArray( pos ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\tbindSkeleton( skeletons, geometryMap, modelMap ) {\n\n\t\tconst bindMatrices = this.parsePoseNodes();\n\n\t\tfor ( const ID in skeletons ) {\n\n\t\t\tconst skeleton = skeletons[ ID ];\n\n\t\t\tconst parents = connections.get( parseInt( skeleton.ID ) ).parents;\n\n\t\t\tparents.forEach( function ( parent ) {\n\n\t\t\t\tif ( geometryMap.has( parent.ID ) ) {\n\n\t\t\t\t\tconst geoID = parent.ID;\n\t\t\t\t\tconst geoRelationships = connections.get( geoID );\n\n\t\t\t\t\tgeoRelationships.parents.forEach( function ( geoConnParent ) {\n\n\t\t\t\t\t\tif ( modelMap.has( geoConnParent.ID ) ) {\n\n\t\t\t\t\t\t\tconst model = modelMap.get( geoConnParent.ID );\n\n\t\t\t\t\t\t\tmodel.bind( new Skeleton( skeleton.bones ), bindMatrices[ geoConnParent.ID ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\tparsePoseNodes() {\n\n\t\tconst bindMatrices = {};\n\n\t\tif ( 'Pose' in fbxTree.Objects ) {\n\n\t\t\tconst BindPoseNode = fbxTree.Objects.Pose;\n\n\t\t\tfor ( const nodeID in BindPoseNode ) {\n\n\t\t\t\tif ( BindPoseNode[ nodeID ].attrType === 'BindPose' && BindPoseNode[ nodeID ].NbPoseNodes > 0 ) {\n\n\t\t\t\t\tconst poseNodes = BindPoseNode[ nodeID ].PoseNode;\n\n\t\t\t\t\tif ( Array.isArray( poseNodes ) ) {\n\n\t\t\t\t\t\tposeNodes.forEach( function ( poseNode ) {\n\n\t\t\t\t\t\t\tbindMatrices[ poseNode.Node ] = new Matrix4().fromArray( poseNode.Matrix.a );\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tbindMatrices[ poseNodes.Node ] = new Matrix4().fromArray( poseNodes.Matrix.a );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn bindMatrices;\n\n\t}\n\n\taddGlobalSceneSettings() {\n\n\t\tif ( 'GlobalSettings' in fbxTree ) {\n\n\t\t\tif ( 'AmbientColor' in fbxTree.GlobalSettings ) {\n\n\t\t\t\t// Parse ambient color - if it's not set to black (default), create an ambient light\n\n\t\t\t\tconst ambientColor = fbxTree.GlobalSettings.AmbientColor.value;\n\t\t\t\tconst r = ambientColor[ 0 ];\n\t\t\t\tconst g = ambientColor[ 1 ];\n\t\t\t\tconst b = ambientColor[ 2 ];\n\n\t\t\t\tif ( r !== 0 || g !== 0 || b !== 0 ) {\n\n\t\t\t\t\tconst color = new Color().setRGB( r, g, b, SRGBColorSpace );\n\t\t\t\t\tsceneGraph.add( new AmbientLight( color, 1 ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( 'UnitScaleFactor' in fbxTree.GlobalSettings ) {\n\n\t\t\t\tsceneGraph.userData.unitScaleFactor = fbxTree.GlobalSettings.UnitScaleFactor.value;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\n// parse Geometry data from FBXTree and return map of BufferGeometries\nclass GeometryParser {\n\n\tconstructor() {\n\n\t\tthis.negativeMaterialIndices = false;\n\n\t}\n\n\t// Parse nodes in FBXTree.Objects.Geometry\n\tparse( deformers ) {\n\n\t\tconst geometryMap = new Map();\n\n\t\tif ( 'Geometry' in fbxTree.Objects ) {\n\n\t\t\tconst geoNodes = fbxTree.Objects.Geometry;\n\n\t\t\tfor ( const nodeID in geoNodes ) {\n\n\t\t\t\tconst relationships = connections.get( parseInt( nodeID ) );\n\t\t\t\tconst geo = this.parseGeometry( relationships, geoNodes[ nodeID ], deformers );\n\n\t\t\t\tgeometryMap.set( parseInt( nodeID ), geo );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// report warnings\n\n\t\tif ( this.negativeMaterialIndices === true ) {\n\n\t\t\tconsole.warn( 'THREE.FBXLoader: The FBX file contains invalid (negative) material indices. The asset might not render as expected.' );\n\n\t\t}\n\n\t\treturn geometryMap;\n\n\t}\n\n\t// Parse single node in FBXTree.Objects.Geometry\n\tparseGeometry( relationships, geoNode, deformers ) {\n\n\t\tswitch ( geoNode.attrType ) {\n\n\t\t\tcase 'Mesh':\n\t\t\t\treturn this.parseMeshGeometry( relationships, geoNode, deformers );\n\n\t\t\tcase 'NurbsCurve':\n\t\t\t\treturn this.parseNurbsGeometry( geoNode );\n\n\t\t}\n\n\t}\n\n\t// Parse single node mesh geometry in FBXTree.Objects.Geometry\n\tparseMeshGeometry( relationships, geoNode, deformers ) {\n\n\t\tconst skeletons = deformers.skeletons;\n\t\tconst morphTargets = [];\n\n\t\tconst modelNodes = relationships.parents.map( function ( parent ) {\n\n\t\t\treturn fbxTree.Objects.Model[ parent.ID ];\n\n\t\t} );\n\n\t\t// don't create geometry if it is not associated with any models\n\t\tif ( modelNodes.length === 0 ) return;\n\n\t\tconst skeleton = relationships.children.reduce( function ( skeleton, child ) {\n\n\t\t\tif ( skeletons[ child.ID ] !== undefined ) skeleton = skeletons[ child.ID ];\n\n\t\t\treturn skeleton;\n\n\t\t}, null );\n\n\t\trelationships.children.forEach( function ( child ) {\n\n\t\t\tif ( deformers.morphTargets[ child.ID ] !== undefined ) {\n\n\t\t\t\tmorphTargets.push( deformers.morphTargets[ child.ID ] );\n\n\t\t\t}\n\n\t\t} );\n\n\t\t// Assume one model and get the preRotation from that\n\t\t// if there is more than one model associated with the geometry this may cause problems\n\t\tconst modelNode = modelNodes[ 0 ];\n\n\t\tconst transformData = {};\n\n\t\tif ( 'RotationOrder' in modelNode ) transformData.eulerOrder = getEulerOrder( modelNode.RotationOrder.value );\n\t\tif ( 'InheritType' in modelNode ) transformData.inheritType = parseInt( modelNode.InheritType.value );\n\n\t\tif ( 'GeometricTranslation' in modelNode ) transformData.translation = modelNode.GeometricTranslation.value;\n\t\tif ( 'GeometricRotation' in modelNode ) transformData.rotation = modelNode.GeometricRotation.value;\n\t\tif ( 'GeometricScaling' in modelNode ) transformData.scale = modelNode.GeometricScaling.value;\n\n\t\tconst transform = generateTransform( transformData );\n\n\t\treturn this.genGeometry( geoNode, skeleton, morphTargets, transform );\n\n\t}\n\n\t// Generate a BufferGeometry from a node in FBXTree.Objects.Geometry\n\tgenGeometry( geoNode, skeleton, morphTargets, preTransform ) {\n\n\t\tconst geo = new BufferGeometry();\n\t\tif ( geoNode.attrName ) geo.name = geoNode.attrName;\n\n\t\tconst geoInfo = this.parseGeoNode( geoNode, skeleton );\n\t\tconst buffers = this.genBuffers( geoInfo );\n\n\t\tconst positionAttribute = new Float32BufferAttribute( buffers.vertex, 3 );\n\n\t\tpositionAttribute.applyMatrix4( preTransform );\n\n\t\tgeo.setAttribute( 'position', positionAttribute );\n\n\t\tif ( buffers.colors.length > 0 ) {\n\n\t\t\tgeo.setAttribute( 'color', new Float32BufferAttribute( buffers.colors, 3 ) );\n\n\t\t}\n\n\t\tif ( skeleton ) {\n\n\t\t\tgeo.setAttribute( 'skinIndex', new Uint16BufferAttribute( buffers.weightsIndices, 4 ) );\n\n\t\t\tgeo.setAttribute( 'skinWeight', new Float32BufferAttribute( buffers.vertexWeights, 4 ) );\n\n\t\t\t// used later to bind the skeleton to the model\n\t\t\tgeo.FBX_Deformer = skeleton;\n\n\t\t}\n\n\t\tif ( buffers.normal.length > 0 ) {\n\n\t\t\tconst normalMatrix = new Matrix3().getNormalMatrix( preTransform );\n\n\t\t\tconst normalAttribute = new Float32BufferAttribute( buffers.normal, 3 );\n\t\t\tnormalAttribute.applyNormalMatrix( normalMatrix );\n\n\t\t\tgeo.setAttribute( 'normal', normalAttribute );\n\n\t\t}\n\n\t\tbuffers.uvs.forEach( function ( uvBuffer, i ) {\n\n\t\t\tconst name = i === 0 ? 'uv' : `uv${ i }`;\n\n\t\t\tgeo.setAttribute( name, new Float32BufferAttribute( buffers.uvs[ i ], 2 ) );\n\n\t\t} );\n\n\t\tif ( geoInfo.material && geoInfo.material.mappingType !== 'AllSame' ) {\n\n\t\t\t// Convert the material indices of each vertex into rendering groups on the geometry.\n\t\t\tlet prevMaterialIndex = buffers.materialIndex[ 0 ];\n\t\t\tlet startIndex = 0;\n\n\t\t\tbuffers.materialIndex.forEach( function ( currentIndex, i ) {\n\n\t\t\t\tif ( currentIndex !== prevMaterialIndex ) {\n\n\t\t\t\t\tgeo.addGroup( startIndex, i - startIndex, prevMaterialIndex );\n\n\t\t\t\t\tprevMaterialIndex = currentIndex;\n\t\t\t\t\tstartIndex = i;\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\t// the loop above doesn't add the last group, do that here.\n\t\t\tif ( geo.groups.length > 0 ) {\n\n\t\t\t\tconst lastGroup = geo.groups[ geo.groups.length - 1 ];\n\t\t\t\tconst lastIndex = lastGroup.start + lastGroup.count;\n\n\t\t\t\tif ( lastIndex !== buffers.materialIndex.length ) {\n\n\t\t\t\t\tgeo.addGroup( lastIndex, buffers.materialIndex.length - lastIndex, prevMaterialIndex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// case where there are multiple materials but the whole geometry is only\n\t\t\t// using one of them\n\t\t\tif ( geo.groups.length === 0 ) {\n\n\t\t\t\tgeo.addGroup( 0, buffers.materialIndex.length, buffers.materialIndex[ 0 ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.addMorphTargets( geo, geoNode, morphTargets, preTransform );\n\n\t\treturn geo;\n\n\t}\n\n\tparseGeoNode( geoNode, skeleton ) {\n\n\t\tconst geoInfo = {};\n\n\t\tgeoInfo.vertexPositions = ( geoNode.Vertices !== undefined ) ? geoNode.Vertices.a : [];\n\t\tgeoInfo.vertexIndices = ( geoNode.PolygonVertexIndex !== undefined ) ? geoNode.PolygonVertexIndex.a : [];\n\n\t\tif ( geoNode.LayerElementColor && geoNode.LayerElementColor[ 0 ].Colors ) {\n\n\t\t\tgeoInfo.color = this.parseVertexColors( geoNode.LayerElementColor[ 0 ] );\n\n\t\t}\n\n\t\tif ( geoNode.LayerElementMaterial ) {\n\n\t\t\tgeoInfo.material = this.parseMaterialIndices( geoNode.LayerElementMaterial[ 0 ] );\n\n\t\t}\n\n\t\tif ( geoNode.LayerElementNormal ) {\n\n\t\t\tgeoInfo.normal = this.parseNormals( geoNode.LayerElementNormal[ 0 ] );\n\n\t\t}\n\n\t\tif ( geoNode.LayerElementUV ) {\n\n\t\t\tgeoInfo.uv = [];\n\n\t\t\tlet i = 0;\n\t\t\twhile ( geoNode.LayerElementUV[ i ] ) {\n\n\t\t\t\tif ( geoNode.LayerElementUV[ i ].UV ) {\n\n\t\t\t\t\tgeoInfo.uv.push( this.parseUVs( geoNode.LayerElementUV[ i ] ) );\n\n\t\t\t\t}\n\n\t\t\t\ti ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeoInfo.weightTable = {};\n\n\t\tif ( skeleton !== null ) {\n\n\t\t\tgeoInfo.skeleton = skeleton;\n\n\t\t\tskeleton.rawBones.forEach( function ( rawBone, i ) {\n\n\t\t\t\t// loop over the bone's vertex indices and weights\n\t\t\t\trawBone.indices.forEach( function ( index, j ) {\n\n\t\t\t\t\tif ( geoInfo.weightTable[ index ] === undefined ) geoInfo.weightTable[ index ] = [];\n\n\t\t\t\t\tgeoInfo.weightTable[ index ].push( {\n\n\t\t\t\t\t\tid: i,\n\t\t\t\t\t\tweight: rawBone.weights[ j ],\n\n\t\t\t\t\t} );\n\n\t\t\t\t} );\n\n\t\t\t} );\n\n\t\t}\n\n\t\treturn geoInfo;\n\n\t}\n\n\tgenBuffers( geoInfo ) {\n\n\t\tconst buffers = {\n\t\t\tvertex: [],\n\t\t\tnormal: [],\n\t\t\tcolors: [],\n\t\t\tuvs: [],\n\t\t\tmaterialIndex: [],\n\t\t\tvertexWeights: [],\n\t\t\tweightsIndices: [],\n\t\t};\n\n\t\tlet polygonIndex = 0;\n\t\tlet faceLength = 0;\n\t\tlet displayedWeightsWarning = false;\n\n\t\t// these will hold data for a single face\n\t\tlet facePositionIndexes = [];\n\t\tlet faceNormals = [];\n\t\tlet faceColors = [];\n\t\tlet faceUVs = [];\n\t\tlet faceWeights = [];\n\t\tlet faceWeightIndices = [];\n\n\t\tconst scope = this;\n\t\tgeoInfo.vertexIndices.forEach( function ( vertexIndex, polygonVertexIndex ) {\n\n\t\t\tlet materialIndex;\n\t\t\tlet endOfFace = false;\n\n\t\t\t// Face index and vertex index arrays are combined in a single array\n\t\t\t// A cube with quad faces looks like this:\n\t\t\t// PolygonVertexIndex: *24 {\n\t\t\t//  a: 0, 1, 3, -3, 2, 3, 5, -5, 4, 5, 7, -7, 6, 7, 1, -1, 1, 7, 5, -4, 6, 0, 2, -5\n\t\t\t//  }\n\t\t\t// Negative numbers mark the end of a face - first face here is 0, 1, 3, -3\n\t\t\t// to find index of last vertex bit shift the index: ^ - 1\n\t\t\tif ( vertexIndex < 0 ) {\n\n\t\t\t\tvertexIndex = vertexIndex ^ - 1; // equivalent to ( x * -1 ) - 1\n\t\t\t\tendOfFace = true;\n\n\t\t\t}\n\n\t\t\tlet weightIndices = [];\n\t\t\tlet weights = [];\n\n\t\t\tfacePositionIndexes.push( vertexIndex * 3, vertexIndex * 3 + 1, vertexIndex * 3 + 2 );\n\n\t\t\tif ( geoInfo.color ) {\n\n\t\t\t\tconst data = getData( polygonVertexIndex, polygonIndex, vertexIndex, geoInfo.color );\n\n\t\t\t\tfaceColors.push( data[ 0 ], data[ 1 ], data[ 2 ] );\n\n\t\t\t}\n\n\t\t\tif ( geoInfo.skeleton ) {\n\n\t\t\t\tif ( geoInfo.weightTable[ vertexIndex ] !== undefined ) {\n\n\t\t\t\t\tgeoInfo.weightTable[ vertexIndex ].forEach( function ( wt ) {\n\n\t\t\t\t\t\tweights.push( wt.weight );\n\t\t\t\t\t\tweightIndices.push( wt.id );\n\n\t\t\t\t\t} );\n\n\n\t\t\t\t}\n\n\t\t\t\tif ( weights.length > 4 ) {\n\n\t\t\t\t\tif ( ! displayedWeightsWarning ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.FBXLoader: Vertex has more than 4 skinning weights assigned to vertex. Deleting additional weights.' );\n\t\t\t\t\t\tdisplayedWeightsWarning = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst wIndex = [ 0, 0, 0, 0 ];\n\t\t\t\t\tconst Weight = [ 0, 0, 0, 0 ];\n\n\t\t\t\t\tweights.forEach( function ( weight, weightIndex ) {\n\n\t\t\t\t\t\tlet currentWeight = weight;\n\t\t\t\t\t\tlet currentIndex = weightIndices[ weightIndex ];\n\n\t\t\t\t\t\tWeight.forEach( function ( comparedWeight, comparedWeightIndex, comparedWeightArray ) {\n\n\t\t\t\t\t\t\tif ( currentWeight > comparedWeight ) {\n\n\t\t\t\t\t\t\t\tcomparedWeightArray[ comparedWeightIndex ] = currentWeight;\n\t\t\t\t\t\t\t\tcurrentWeight = comparedWeight;\n\n\t\t\t\t\t\t\t\tconst tmp = wIndex[ comparedWeightIndex ];\n\t\t\t\t\t\t\t\twIndex[ comparedWeightIndex ] = currentIndex;\n\t\t\t\t\t\t\t\tcurrentIndex = tmp;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t} );\n\n\t\t\t\t\tweightIndices = wIndex;\n\t\t\t\t\tweights = Weight;\n\n\t\t\t\t}\n\n\t\t\t\t// if the weight array is shorter than 4 pad with 0s\n\t\t\t\twhile ( weights.length < 4 ) {\n\n\t\t\t\t\tweights.push( 0 );\n\t\t\t\t\tweightIndices.push( 0 );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < 4; ++ i ) {\n\n\t\t\t\t\tfaceWeights.push( weights[ i ] );\n\t\t\t\t\tfaceWeightIndices.push( weightIndices[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( geoInfo.normal ) {\n\n\t\t\t\tconst data = getData( polygonVertexIndex, polygonIndex, vertexIndex, geoInfo.normal );\n\n\t\t\t\tfaceNormals.push( data[ 0 ], data[ 1 ], data[ 2 ] );\n\n\t\t\t}\n\n\t\t\tif ( geoInfo.material && geoInfo.material.mappingType !== 'AllSame' ) {\n\n\t\t\t\tmaterialIndex = getData( polygonVertexIndex, polygonIndex, vertexIndex, geoInfo.material )[ 0 ];\n\n\t\t\t\tif ( materialIndex < 0 ) {\n\n\t\t\t\t\tscope.negativeMaterialIndices = true;\n\t\t\t\t\tmaterialIndex = 0; // fallback\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( geoInfo.uv ) {\n\n\t\t\t\tgeoInfo.uv.forEach( function ( uv, i ) {\n\n\t\t\t\t\tconst data = getData( polygonVertexIndex, polygonIndex, vertexIndex, uv );\n\n\t\t\t\t\tif ( faceUVs[ i ] === undefined ) {\n\n\t\t\t\t\t\tfaceUVs[ i ] = [];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfaceUVs[ i ].push( data[ 0 ] );\n\t\t\t\t\tfaceUVs[ i ].push( data[ 1 ] );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tfaceLength ++;\n\n\t\t\tif ( endOfFace ) {\n\n\t\t\t\tscope.genFace( buffers, geoInfo, facePositionIndexes, materialIndex, faceNormals, faceColors, faceUVs, faceWeights, faceWeightIndices, faceLength );\n\n\t\t\t\tpolygonIndex ++;\n\t\t\t\tfaceLength = 0;\n\n\t\t\t\t// reset arrays for the next face\n\t\t\t\tfacePositionIndexes = [];\n\t\t\t\tfaceNormals = [];\n\t\t\t\tfaceColors = [];\n\t\t\t\tfaceUVs = [];\n\t\t\t\tfaceWeights = [];\n\t\t\t\tfaceWeightIndices = [];\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn buffers;\n\n\t}\n\n\t// See https://www.khronos.org/opengl/wiki/Calculating_a_Surface_Normal\n\tgetNormalNewell( vertices ) {\n\n\t\tconst normal = new Vector3( 0.0, 0.0, 0.0 );\n\n\t\tfor ( let i = 0; i < vertices.length; i ++ ) {\n\n\t\t\tconst current = vertices[ i ];\n\t\t\tconst next = vertices[ ( i + 1 ) % vertices.length ];\n\n\t\t\tnormal.x += ( current.y - next.y ) * ( current.z + next.z );\n\t\t\tnormal.y += ( current.z - next.z ) * ( current.x + next.x );\n\t\t\tnormal.z += ( current.x - next.x ) * ( current.y + next.y );\n\n\t\t}\n\n\t\tnormal.normalize();\n\n\t\treturn normal;\n\n\t}\n\n\tgetNormalTangentAndBitangent( vertices ) {\n\n\t\tconst normalVector = this.getNormalNewell( vertices );\n\t\t// Avoid up being equal or almost equal to normalVector\n\t\tconst up = Math.abs( normalVector.z ) > 0.5 ? new Vector3( 0.0, 1.0, 0.0 ) : new Vector3( 0.0, 0.0, 1.0 );\n\t\tconst tangent = up.cross( normalVector ).normalize();\n\t\tconst bitangent = normalVector.clone().cross( tangent ).normalize();\n\n\t\treturn {\n\t\t\tnormal: normalVector,\n\t\t\ttangent: tangent,\n\t\t\tbitangent: bitangent\n\t\t};\n\n\t}\n\n\tflattenVertex( vertex, normalTangent, normalBitangent ) {\n\n\t\treturn new Vector2(\n\t\t\tvertex.dot( normalTangent ),\n\t\t\tvertex.dot( normalBitangent )\n\t\t);\n\n\t}\n\n\t// Generate data for a single face in a geometry. If the face is a quad then split it into 2 tris\n\tgenFace( buffers, geoInfo, facePositionIndexes, materialIndex, faceNormals, faceColors, faceUVs, faceWeights, faceWeightIndices, faceLength ) {\n\n\t\tlet triangles;\n\n\t\tif ( faceLength > 3 ) {\n\n\t\t\t// Triangulate n-gon using earcut\n\n\t\t\tconst vertices = [];\n\t\t\t// in morphing scenario vertexPositions represent morphPositions\n\t\t\t// while baseVertexPositions represent the original geometry's positions\n\t\t\tconst positions = geoInfo.baseVertexPositions || geoInfo.vertexPositions;\n\t\t\tfor ( let i = 0; i < facePositionIndexes.length; i += 3 ) {\n\n\t\t\t\tvertices.push(\n\t\t\t\t\tnew Vector3(\n\t\t\t\t\t\tpositions[ facePositionIndexes[ i ] ],\n\t\t\t\t\t\tpositions[ facePositionIndexes[ i + 1 ] ],\n\t\t\t\t\t\tpositions[ facePositionIndexes[ i + 2 ] ]\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\tconst { tangent, bitangent } = this.getNormalTangentAndBitangent( vertices );\n\t\t\tconst triangulationInput = [];\n\n\t\t\tfor ( const vertex of vertices ) {\n\n\t\t\t\ttriangulationInput.push( this.flattenVertex( vertex, tangent, bitangent ) );\n\n\t\t\t}\n\n\t\t\t// When vertices is an array of [0,0,0] elements (which is the case for vertices not participating in morph)\n\t\t\t// the triangulationInput will be an array of [0,0] elements\n\t\t\t// resulting in an array of 0 triangles being returned from ShapeUtils.triangulateShape\n\t\t\t// leading to not pushing into buffers.vertex the redundant vertices (the vertices that are not morphed).\n\t\t\t// That's why, in order to support morphing scenario, \"positions\" is looking first for baseVertexPositions,\n\t\t\t// so that we don't end up with an array of 0 triangles for the faces not participating in morph.\n\t\t\ttriangles = ShapeUtils.triangulateShape( triangulationInput, [] );\n\n\t\t} else {\n\n\t\t\t// Regular triangle, skip earcut triangulation step\n\t\t\ttriangles = [[ 0, 1, 2 ]];\n\n\t\t}\n\n\t\tfor ( const [ i0, i1, i2 ] of triangles ) {\n\n\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ i0 * 3 ] ] );\n\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ i0 * 3 + 1 ] ] );\n\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ i0 * 3 + 2 ] ] );\n\n\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ i1 * 3 ] ] );\n\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ i1 * 3 + 1 ] ] );\n\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ i1 * 3 + 2 ] ] );\n\n\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ i2 * 3 ] ] );\n\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ i2 * 3 + 1 ] ] );\n\t\t\tbuffers.vertex.push( geoInfo.vertexPositions[ facePositionIndexes[ i2 * 3 + 2 ] ] );\n\n\t\t\tif ( geoInfo.skeleton ) {\n\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i0 * 4 ] );\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i0 * 4 + 1 ] );\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i0 * 4 + 2 ] );\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i0 * 4 + 3 ] );\n\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i1 * 4 ] );\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i1 * 4 + 1 ] );\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i1 * 4 + 2 ] );\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i1 * 4 + 3 ] );\n\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i2 * 4 ] );\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i2 * 4 + 1 ] );\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i2 * 4 + 2 ] );\n\t\t\t\tbuffers.vertexWeights.push( faceWeights[ i2 * 4 + 3 ] );\n\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i0 * 4 ] );\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i0 * 4 + 1 ] );\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i0 * 4 + 2 ] );\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i0 * 4 + 3 ] );\n\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i1 * 4 ] );\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i1 * 4 + 1 ] );\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i1 * 4 + 2 ] );\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i1 * 4 + 3 ] );\n\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i2 * 4 ] );\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i2 * 4 + 1 ] );\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i2 * 4 + 2 ] );\n\t\t\t\tbuffers.weightsIndices.push( faceWeightIndices[ i2 * 4 + 3 ] );\n\n\t\t\t}\n\n\t\t\tif ( geoInfo.color ) {\n\n\t\t\t\tbuffers.colors.push( faceColors[ i0 * 3 ] );\n\t\t\t\tbuffers.colors.push( faceColors[ i0 * 3 + 1 ] );\n\t\t\t\tbuffers.colors.push( faceColors[ i0 * 3 + 2 ] );\n\n\t\t\t\tbuffers.colors.push( faceColors[ i1 * 3 ] );\n\t\t\t\tbuffers.colors.push( faceColors[ i1 * 3 + 1 ] );\n\t\t\t\tbuffers.colors.push( faceColors[ i1 * 3 + 2 ] );\n\n\t\t\t\tbuffers.colors.push( faceColors[ i2 * 3 ] );\n\t\t\t\tbuffers.colors.push( faceColors[ i2 * 3 + 1 ] );\n\t\t\t\tbuffers.colors.push( faceColors[ i2 * 3 + 2 ] );\n\n\t\t\t}\n\n\t\t\tif ( geoInfo.material && geoInfo.material.mappingType !== 'AllSame' ) {\n\n\t\t\t\tbuffers.materialIndex.push( materialIndex );\n\t\t\t\tbuffers.materialIndex.push( materialIndex );\n\t\t\t\tbuffers.materialIndex.push( materialIndex );\n\n\t\t\t}\n\n\t\t\tif ( geoInfo.normal ) {\n\n\t\t\t\tbuffers.normal.push( faceNormals[ i0 * 3 ] );\n\t\t\t\tbuffers.normal.push( faceNormals[ i0 * 3 + 1 ] );\n\t\t\t\tbuffers.normal.push( faceNormals[ i0 * 3 + 2 ] );\n\n\t\t\t\tbuffers.normal.push( faceNormals[ i1 * 3 ] );\n\t\t\t\tbuffers.normal.push( faceNormals[ i1 * 3 + 1 ] );\n\t\t\t\tbuffers.normal.push( faceNormals[ i1 * 3 + 2 ] );\n\n\t\t\t\tbuffers.normal.push( faceNormals[ i2 * 3 ] );\n\t\t\t\tbuffers.normal.push( faceNormals[ i2 * 3 + 1 ] );\n\t\t\t\tbuffers.normal.push( faceNormals[ i2 * 3 + 2 ] );\n\n\t\t\t}\n\n\t\t\tif ( geoInfo.uv ) {\n\n\t\t\t\tgeoInfo.uv.forEach( function ( uv, j ) {\n\n\t\t\t\t\tif ( buffers.uvs[ j ] === undefined ) buffers.uvs[ j ] = [];\n\n\t\t\t\t\tbuffers.uvs[ j ].push( faceUVs[ j ][ i0 * 2 ] );\n\t\t\t\t\tbuffers.uvs[ j ].push( faceUVs[ j ][ i0 * 2 + 1 ] );\n\n\t\t\t\t\tbuffers.uvs[ j ].push( faceUVs[ j ][ i1 * 2 ] );\n\t\t\t\t\tbuffers.uvs[ j ].push( faceUVs[ j ][ i1 * 2 + 1 ] );\n\n\t\t\t\t\tbuffers.uvs[ j ].push( faceUVs[ j ][ i2 * 2 ] );\n\t\t\t\t\tbuffers.uvs[ j ].push( faceUVs[ j ][ i2 * 2 + 1 ] );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\taddMorphTargets( parentGeo, parentGeoNode, morphTargets, preTransform ) {\n\n\t\tif ( morphTargets.length === 0 ) return;\n\n\t\tparentGeo.morphTargetsRelative = true;\n\n\t\tparentGeo.morphAttributes.position = [];\n\t\t// parentGeo.morphAttributes.normal = []; // not implemented\n\n\t\tconst scope = this;\n\t\tmorphTargets.forEach( function ( morphTarget ) {\n\n\t\t\tmorphTarget.rawTargets.forEach( function ( rawTarget ) {\n\n\t\t\t\tconst morphGeoNode = fbxTree.Objects.Geometry[ rawTarget.geoID ];\n\n\t\t\t\tif ( morphGeoNode !== undefined ) {\n\n\t\t\t\t\tscope.genMorphGeometry( parentGeo, parentGeoNode, morphGeoNode, preTransform, rawTarget.name );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\t// a morph geometry node is similar to a standard  node, and the node is also contained\n\t// in FBXTree.Objects.Geometry, however it can only have attributes for position, normal\n\t// and a special attribute Index defining which vertices of the original geometry are affected\n\t// Normal and position attributes only have data for the vertices that are affected by the morph\n\tgenMorphGeometry( parentGeo, parentGeoNode, morphGeoNode, preTransform, name ) {\n\n\t\tconst basePositions = parentGeoNode.Vertices !== undefined ? parentGeoNode.Vertices.a : [];\n\t\tconst baseIndices = parentGeoNode.PolygonVertexIndex !== undefined ? parentGeoNode.PolygonVertexIndex.a : [];\n\n\t\tconst morphPositionsSparse = morphGeoNode.Vertices !== undefined ? morphGeoNode.Vertices.a : [];\n\t\tconst morphIndices = morphGeoNode.Indexes !== undefined ? morphGeoNode.Indexes.a : [];\n\n\t\tconst length = parentGeo.attributes.position.count * 3;\n\t\tconst morphPositions = new Float32Array( length );\n\n\t\tfor ( let i = 0; i < morphIndices.length; i ++ ) {\n\n\t\t\tconst morphIndex = morphIndices[ i ] * 3;\n\n\t\t\tmorphPositions[ morphIndex ] = morphPositionsSparse[ i * 3 ];\n\t\t\tmorphPositions[ morphIndex + 1 ] = morphPositionsSparse[ i * 3 + 1 ];\n\t\t\tmorphPositions[ morphIndex + 2 ] = morphPositionsSparse[ i * 3 + 2 ];\n\n\t\t}\n\n\t\t// TODO: add morph normal support\n\t\tconst morphGeoInfo = {\n\t\t\tvertexIndices: baseIndices,\n\t\t\tvertexPositions: morphPositions,\n\t\t\tbaseVertexPositions: basePositions\n\t\t};\n\n\t\tconst morphBuffers = this.genBuffers( morphGeoInfo );\n\n\t\tconst positionAttribute = new Float32BufferAttribute( morphBuffers.vertex, 3 );\n\t\tpositionAttribute.name = name || morphGeoNode.attrName;\n\n\t\tpositionAttribute.applyMatrix4( preTransform );\n\n\t\tparentGeo.morphAttributes.position.push( positionAttribute );\n\n\t}\n\n\t// Parse normal from FBXTree.Objects.Geometry.LayerElementNormal if it exists\n\tparseNormals( NormalNode ) {\n\n\t\tconst mappingType = NormalNode.MappingInformationType;\n\t\tconst referenceType = NormalNode.ReferenceInformationType;\n\t\tconst buffer = NormalNode.Normals.a;\n\t\tlet indexBuffer = [];\n\t\tif ( referenceType === 'IndexToDirect' ) {\n\n\t\t\tif ( 'NormalIndex' in NormalNode ) {\n\n\t\t\t\tindexBuffer = NormalNode.NormalIndex.a;\n\n\t\t\t} else if ( 'NormalsIndex' in NormalNode ) {\n\n\t\t\t\tindexBuffer = NormalNode.NormalsIndex.a;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn {\n\t\t\tdataSize: 3,\n\t\t\tbuffer: buffer,\n\t\t\tindices: indexBuffer,\n\t\t\tmappingType: mappingType,\n\t\t\treferenceType: referenceType\n\t\t};\n\n\t}\n\n\t// Parse UVs from FBXTree.Objects.Geometry.LayerElementUV if it exists\n\tparseUVs( UVNode ) {\n\n\t\tconst mappingType = UVNode.MappingInformationType;\n\t\tconst referenceType = UVNode.ReferenceInformationType;\n\t\tconst buffer = UVNode.UV.a;\n\t\tlet indexBuffer = [];\n\t\tif ( referenceType === 'IndexToDirect' ) {\n\n\t\t\tindexBuffer = UVNode.UVIndex.a;\n\n\t\t}\n\n\t\treturn {\n\t\t\tdataSize: 2,\n\t\t\tbuffer: buffer,\n\t\t\tindices: indexBuffer,\n\t\t\tmappingType: mappingType,\n\t\t\treferenceType: referenceType\n\t\t};\n\n\t}\n\n\t// Parse Vertex Colors from FBXTree.Objects.Geometry.LayerElementColor if it exists\n\tparseVertexColors( ColorNode ) {\n\n\t\tconst mappingType = ColorNode.MappingInformationType;\n\t\tconst referenceType = ColorNode.ReferenceInformationType;\n\t\tconst buffer = ColorNode.Colors.a;\n\t\tlet indexBuffer = [];\n\t\tif ( referenceType === 'IndexToDirect' ) {\n\n\t\t\tindexBuffer = ColorNode.ColorIndex.a;\n\n\t\t}\n\n\t\tfor ( let i = 0, c = new Color(); i < buffer.length; i += 4 ) {\n\n\t\t\tc.fromArray( buffer, i );\n\t\t\tColorManagement.colorSpaceToWorking( c, SRGBColorSpace );\n\t\t\tc.toArray( buffer, i );\n\n\t\t}\n\n\t\treturn {\n\t\t\tdataSize: 4,\n\t\t\tbuffer: buffer,\n\t\t\tindices: indexBuffer,\n\t\t\tmappingType: mappingType,\n\t\t\treferenceType: referenceType\n\t\t};\n\n\t}\n\n\t// Parse mapping and material data in FBXTree.Objects.Geometry.LayerElementMaterial if it exists\n\tparseMaterialIndices( MaterialNode ) {\n\n\t\tconst mappingType = MaterialNode.MappingInformationType;\n\t\tconst referenceType = MaterialNode.ReferenceInformationType;\n\n\t\tif ( mappingType === 'NoMappingInformation' ) {\n\n\t\t\treturn {\n\t\t\t\tdataSize: 1,\n\t\t\t\tbuffer: [ 0 ],\n\t\t\t\tindices: [ 0 ],\n\t\t\t\tmappingType: 'AllSame',\n\t\t\t\treferenceType: referenceType\n\t\t\t};\n\n\t\t}\n\n\t\tconst materialIndexBuffer = MaterialNode.Materials.a;\n\n\t\t// Since materials are stored as indices, there's a bit of a mismatch between FBX and what\n\t\t// we expect.So we create an intermediate buffer that points to the index in the buffer,\n\t\t// for conforming with the other functions we've written for other data.\n\t\tconst materialIndices = [];\n\n\t\tfor ( let i = 0; i < materialIndexBuffer.length; ++ i ) {\n\n\t\t\tmaterialIndices.push( i );\n\n\t\t}\n\n\t\treturn {\n\t\t\tdataSize: 1,\n\t\t\tbuffer: materialIndexBuffer,\n\t\t\tindices: materialIndices,\n\t\t\tmappingType: mappingType,\n\t\t\treferenceType: referenceType\n\t\t};\n\n\t}\n\n\t// Generate a NurbGeometry from a node in FBXTree.Objects.Geometry\n\tparseNurbsGeometry( geoNode ) {\n\n\t\tconst order = parseInt( geoNode.Order );\n\n\t\tif ( isNaN( order ) ) {\n\n\t\t\tconsole.error( 'THREE.FBXLoader: Invalid Order %s given for geometry ID: %s', geoNode.Order, geoNode.id );\n\t\t\treturn new BufferGeometry();\n\n\t\t}\n\n\t\tconst degree = order - 1;\n\n\t\tconst knots = geoNode.KnotVector.a;\n\t\tconst controlPoints = [];\n\t\tconst pointsValues = geoNode.Points.a;\n\n\t\tfor ( let i = 0, l = pointsValues.length; i < l; i += 4 ) {\n\n\t\t\tcontrolPoints.push( new Vector4().fromArray( pointsValues, i ) );\n\n\t\t}\n\n\t\tlet startKnot, endKnot;\n\n\t\tif ( geoNode.Form === 'Closed' ) {\n\n\t\t\tcontrolPoints.push( controlPoints[ 0 ] );\n\n\t\t} else if ( geoNode.Form === 'Periodic' ) {\n\n\t\t\tstartKnot = degree;\n\t\t\tendKnot = knots.length - 1 - startKnot;\n\n\t\t\tfor ( let i = 0; i < degree; ++ i ) {\n\n\t\t\t\tcontrolPoints.push( controlPoints[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst curve = new NURBSCurve( degree, knots, controlPoints, startKnot, endKnot );\n\t\tconst points = curve.getPoints( controlPoints.length * 12 );\n\n\t\treturn new BufferGeometry().setFromPoints( points );\n\n\t}\n\n}\n\n// parse animation data from FBXTree\nclass AnimationParser {\n\n\t// take raw animation clips and turn them into three.js animation clips\n\tparse() {\n\n\t\tconst animationClips = [];\n\n\t\tconst rawClips = this.parseClips();\n\n\t\tif ( rawClips !== undefined ) {\n\n\t\t\tfor ( const key in rawClips ) {\n\n\t\t\t\tconst rawClip = rawClips[ key ];\n\n\t\t\t\tconst clip = this.addClip( rawClip );\n\n\t\t\t\tanimationClips.push( clip );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn animationClips;\n\n\t}\n\n\tparseClips() {\n\n\t\t// since the actual transformation data is stored in FBXTree.Objects.AnimationCurve,\n\t\t// if this is undefined we can safely assume there are no animations\n\t\tif ( fbxTree.Objects.AnimationCurve === undefined ) return undefined;\n\n\t\tconst curveNodesMap = this.parseAnimationCurveNodes();\n\n\t\tthis.parseAnimationCurves( curveNodesMap );\n\n\t\tconst layersMap = this.parseAnimationLayers( curveNodesMap );\n\t\tconst rawClips = this.parseAnimStacks( layersMap );\n\n\t\treturn rawClips;\n\n\t}\n\n\t// parse nodes in FBXTree.Objects.AnimationCurveNode\n\t// each AnimationCurveNode holds data for an animation transform for a model (e.g. left arm rotation )\n\t// and is referenced by an AnimationLayer\n\tparseAnimationCurveNodes() {\n\n\t\tconst rawCurveNodes = fbxTree.Objects.AnimationCurveNode;\n\n\t\tconst curveNodesMap = new Map();\n\n\t\tfor ( const nodeID in rawCurveNodes ) {\n\n\t\t\tconst rawCurveNode = rawCurveNodes[ nodeID ];\n\n\t\t\tif ( rawCurveNode.attrName.match( /S|R|T|DeformPercent/ ) !== null ) {\n\n\t\t\t\tconst curveNode = {\n\n\t\t\t\t\tid: rawCurveNode.id,\n\t\t\t\t\tattr: rawCurveNode.attrName,\n\t\t\t\t\tcurves: {},\n\n\t\t\t\t};\n\n\t\t\t\tcurveNodesMap.set( curveNode.id, curveNode );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn curveNodesMap;\n\n\t}\n\n\t// parse nodes in FBXTree.Objects.AnimationCurve and connect them up to\n\t// previously parsed AnimationCurveNodes. Each AnimationCurve holds data for a single animated\n\t// axis ( e.g. times and values of x rotation)\n\tparseAnimationCurves( curveNodesMap ) {\n\n\t\tconst rawCurves = fbxTree.Objects.AnimationCurve;\n\n\t\t// TODO: Many values are identical up to roundoff error, but won't be optimised\n\t\t// e.g. position times: [0, 0.4, 0. 8]\n\t\t// position values: [7.23538335023477e-7, 93.67518615722656, -0.9982695579528809, 7.23538335023477e-7, 93.67518615722656, -0.9982695579528809, 7.235384487103147e-7, 93.67520904541016, -0.9982695579528809]\n\t\t// clearly, this should be optimised to\n\t\t// times: [0], positions [7.23538335023477e-7, 93.67518615722656, -0.9982695579528809]\n\t\t// this shows up in nearly every FBX file, and generally time array is length > 100\n\n\t\tfor ( const nodeID in rawCurves ) {\n\n\t\t\tconst animationCurve = {\n\n\t\t\t\tid: rawCurves[ nodeID ].id,\n\t\t\t\ttimes: rawCurves[ nodeID ].KeyTime.a.map( convertFBXTimeToSeconds ),\n\t\t\t\tvalues: rawCurves[ nodeID ].KeyValueFloat.a,\n\n\t\t\t};\n\n\t\t\tconst relationships = connections.get( animationCurve.id );\n\n\t\t\tif ( relationships !== undefined ) {\n\n\t\t\t\tconst animationCurveID = relationships.parents[ 0 ].ID;\n\t\t\t\tconst animationCurveRelationship = relationships.parents[ 0 ].relationship;\n\n\t\t\t\tif ( animationCurveRelationship.match( /X/ ) ) {\n\n\t\t\t\t\tcurveNodesMap.get( animationCurveID ).curves[ 'x' ] = animationCurve;\n\n\t\t\t\t} else if ( animationCurveRelationship.match( /Y/ ) ) {\n\n\t\t\t\t\tcurveNodesMap.get( animationCurveID ).curves[ 'y' ] = animationCurve;\n\n\t\t\t\t} else if ( animationCurveRelationship.match( /Z/ ) ) {\n\n\t\t\t\t\tcurveNodesMap.get( animationCurveID ).curves[ 'z' ] = animationCurve;\n\n\t\t\t\t} else if ( animationCurveRelationship.match( /DeformPercent/ ) && curveNodesMap.has( animationCurveID ) ) {\n\n\t\t\t\t\tcurveNodesMap.get( animationCurveID ).curves[ 'morph' ] = animationCurve;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// parse nodes in FBXTree.Objects.AnimationLayer. Each layers holds references\n\t// to various AnimationCurveNodes and is referenced by an AnimationStack node\n\t// note: theoretically a stack can have multiple layers, however in practice there always seems to be one per stack\n\tparseAnimationLayers( curveNodesMap ) {\n\n\t\tconst rawLayers = fbxTree.Objects.AnimationLayer;\n\n\t\tconst layersMap = new Map();\n\n\t\tfor ( const nodeID in rawLayers ) {\n\n\t\t\tconst layerCurveNodes = [];\n\n\t\t\tconst connection = connections.get( parseInt( nodeID ) );\n\n\t\t\tif ( connection !== undefined ) {\n\n\t\t\t\t// all the animationCurveNodes used in the layer\n\t\t\t\tconst children = connection.children;\n\n\t\t\t\tchildren.forEach( function ( child, i ) {\n\n\t\t\t\t\tif ( curveNodesMap.has( child.ID ) ) {\n\n\t\t\t\t\t\tconst curveNode = curveNodesMap.get( child.ID );\n\n\t\t\t\t\t\t// check that the curves are defined for at least one axis, otherwise ignore the curveNode\n\t\t\t\t\t\tif ( curveNode.curves.x !== undefined || curveNode.curves.y !== undefined || curveNode.curves.z !== undefined ) {\n\n\t\t\t\t\t\t\tif ( layerCurveNodes[ i ] === undefined ) {\n\n\t\t\t\t\t\t\t\tconst modelID = connections.get( child.ID ).parents.filter( function ( parent ) {\n\n\t\t\t\t\t\t\t\t\treturn parent.relationship !== undefined;\n\n\t\t\t\t\t\t\t\t} )[ 0 ].ID;\n\n\t\t\t\t\t\t\t\tif ( modelID !== undefined ) {\n\n\t\t\t\t\t\t\t\t\tconst rawModel = fbxTree.Objects.Model[ modelID.toString() ];\n\n\t\t\t\t\t\t\t\t\tif ( rawModel === undefined ) {\n\n\t\t\t\t\t\t\t\t\t\tconsole.warn( 'THREE.FBXLoader: Encountered a unused curve.', child );\n\t\t\t\t\t\t\t\t\t\treturn;\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tconst node = {\n\n\t\t\t\t\t\t\t\t\t\tmodelName: rawModel.attrName ? PropertyBinding.sanitizeNodeName( rawModel.attrName ) : '',\n\t\t\t\t\t\t\t\t\t\tID: rawModel.id,\n\t\t\t\t\t\t\t\t\t\tinitialPosition: [ 0, 0, 0 ],\n\t\t\t\t\t\t\t\t\t\tinitialRotation: [ 0, 0, 0 ],\n\t\t\t\t\t\t\t\t\t\tinitialScale: [ 1, 1, 1 ],\n\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\t\tsceneGraph.traverse( function ( child ) {\n\n\t\t\t\t\t\t\t\t\t\tif ( child.ID === rawModel.id ) {\n\n\t\t\t\t\t\t\t\t\t\t\tnode.transform = child.matrix;\n\n\t\t\t\t\t\t\t\t\t\t\tif ( child.userData.transformData ) node.eulerOrder = child.userData.transformData.eulerOrder;\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t\t\t\tif ( ! node.transform ) node.transform = new Matrix4();\n\n\t\t\t\t\t\t\t\t\t// if the animated model is pre rotated, we'll have to apply the pre rotations to every\n\t\t\t\t\t\t\t\t\t// animation value as well\n\t\t\t\t\t\t\t\t\tif ( 'PreRotation' in rawModel ) node.preRotation = rawModel.PreRotation.value;\n\t\t\t\t\t\t\t\t\tif ( 'PostRotation' in rawModel ) node.postRotation = rawModel.PostRotation.value;\n\n\t\t\t\t\t\t\t\t\tlayerCurveNodes[ i ] = node;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( layerCurveNodes[ i ] ) layerCurveNodes[ i ][ curveNode.attr ] = curveNode;\n\n\t\t\t\t\t\t} else if ( curveNode.curves.morph !== undefined ) {\n\n\t\t\t\t\t\t\tif ( layerCurveNodes[ i ] === undefined ) {\n\n\t\t\t\t\t\t\t\tconst deformerID = connections.get( child.ID ).parents.filter( function ( parent ) {\n\n\t\t\t\t\t\t\t\t\treturn parent.relationship !== undefined;\n\n\t\t\t\t\t\t\t\t} )[ 0 ].ID;\n\n\t\t\t\t\t\t\t\tconst morpherID = connections.get( deformerID ).parents[ 0 ].ID;\n\t\t\t\t\t\t\t\tconst geoID = connections.get( morpherID ).parents[ 0 ].ID;\n\n\t\t\t\t\t\t\t\t// assuming geometry is not used in more than one model\n\t\t\t\t\t\t\t\tconst modelID = connections.get( geoID ).parents[ 0 ].ID;\n\n\t\t\t\t\t\t\t\tconst rawModel = fbxTree.Objects.Model[ modelID ];\n\n\t\t\t\t\t\t\t\tconst node = {\n\n\t\t\t\t\t\t\t\t\tmodelName: rawModel.attrName ? PropertyBinding.sanitizeNodeName( rawModel.attrName ) : '',\n\t\t\t\t\t\t\t\t\tmorphName: fbxTree.Objects.Deformer[ deformerID ].attrName,\n\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\tlayerCurveNodes[ i ] = node;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tlayerCurveNodes[ i ][ curveNode.attr ] = curveNode;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tlayersMap.set( parseInt( nodeID ), layerCurveNodes );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn layersMap;\n\n\t}\n\n\t// parse nodes in FBXTree.Objects.AnimationStack. These are the top level node in the animation\n\t// hierarchy. Each Stack node will be used to create an AnimationClip\n\tparseAnimStacks( layersMap ) {\n\n\t\tconst rawStacks = fbxTree.Objects.AnimationStack;\n\n\t\t// connect the stacks (clips) up to the layers\n\t\tconst rawClips = {};\n\n\t\tfor ( const nodeID in rawStacks ) {\n\n\t\t\tconst children = connections.get( parseInt( nodeID ) ).children;\n\n\t\t\tif ( children.length > 1 ) {\n\n\t\t\t\t// it seems like stacks will always be associated with a single layer. But just in case there are files\n\t\t\t\t// where there are multiple layers per stack, we'll display a warning\n\t\t\t\tconsole.warn( 'THREE.FBXLoader: Encountered an animation stack with multiple layers, this is currently not supported. Ignoring subsequent layers.' );\n\n\t\t\t}\n\n\t\t\tconst layer = layersMap.get( children[ 0 ].ID );\n\n\t\t\trawClips[ nodeID ] = {\n\n\t\t\t\tname: rawStacks[ nodeID ].attrName,\n\t\t\t\tlayer: layer,\n\n\t\t\t};\n\n\t\t}\n\n\t\treturn rawClips;\n\n\t}\n\n\taddClip( rawClip ) {\n\n\t\tlet tracks = [];\n\n\t\tconst scope = this;\n\t\trawClip.layer.forEach( function ( rawTracks ) {\n\n\t\t\ttracks = tracks.concat( scope.generateTracks( rawTracks ) );\n\n\t\t} );\n\n\t\treturn new AnimationClip( rawClip.name, - 1, tracks );\n\n\t}\n\n\tgenerateTracks( rawTracks ) {\n\n\t\tconst tracks = [];\n\n\t\tlet initialPosition = new Vector3();\n\t\tlet initialScale = new Vector3();\n\n\t\tif ( rawTracks.transform ) rawTracks.transform.decompose( initialPosition, new Quaternion(), initialScale );\n\n\t\tinitialPosition = initialPosition.toArray();\n\t\tinitialScale = initialScale.toArray();\n\n\t\tif ( rawTracks.T !== undefined && Object.keys( rawTracks.T.curves ).length > 0 ) {\n\n\t\t\tconst positionTrack = this.generateVectorTrack( rawTracks.modelName, rawTracks.T.curves, initialPosition, 'position' );\n\t\t\tif ( positionTrack !== undefined ) tracks.push( positionTrack );\n\n\t\t}\n\n\t\tif ( rawTracks.R !== undefined && Object.keys( rawTracks.R.curves ).length > 0 ) {\n\n\t\t\tconst rotationTrack = this.generateRotationTrack( rawTracks.modelName, rawTracks.R.curves, rawTracks.preRotation, rawTracks.postRotation, rawTracks.eulerOrder );\n\t\t\tif ( rotationTrack !== undefined ) tracks.push( rotationTrack );\n\n\t\t}\n\n\t\tif ( rawTracks.S !== undefined && Object.keys( rawTracks.S.curves ).length > 0 ) {\n\n\t\t\tconst scaleTrack = this.generateVectorTrack( rawTracks.modelName, rawTracks.S.curves, initialScale, 'scale' );\n\t\t\tif ( scaleTrack !== undefined ) tracks.push( scaleTrack );\n\n\t\t}\n\n\t\tif ( rawTracks.DeformPercent !== undefined ) {\n\n\t\t\tconst morphTrack = this.generateMorphTrack( rawTracks );\n\t\t\tif ( morphTrack !== undefined ) tracks.push( morphTrack );\n\n\t\t}\n\n\t\treturn tracks;\n\n\t}\n\n\tgenerateVectorTrack( modelName, curves, initialValue, type ) {\n\n\t\tconst times = this.getTimesForAllAxes( curves );\n\t\tconst values = this.getKeyframeTrackValues( times, curves, initialValue );\n\n\t\treturn new VectorKeyframeTrack( modelName + '.' + type, times, values );\n\n\t}\n\n\tgenerateRotationTrack( modelName, curves, preRotation, postRotation, eulerOrder ) {\n\n\t\tlet times;\n\t\tlet values;\n\n\t\tif ( curves.x !== undefined && curves.y !== undefined && curves.z !== undefined ) {\n\n\t\t\tconst result = this.interpolateRotations( curves.x, curves.y, curves.z, eulerOrder );\n\n\t\t\ttimes = result[ 0 ];\n\t\t\tvalues = result[ 1 ];\n\n\t\t}\n\n\t\t// For Maya models using \"Joint Orient\", Euler order only applies to rotation, not pre/post-rotations\n\t\tconst defaultEulerOrder = getEulerOrder( 0 );\n\n\t\tif ( preRotation !== undefined ) {\n\n\t\t\tpreRotation = preRotation.map( MathUtils.degToRad );\n\t\t\tpreRotation.push( defaultEulerOrder );\n\n\t\t\tpreRotation = new Euler().fromArray( preRotation );\n\t\t\tpreRotation = new Quaternion().setFromEuler( preRotation );\n\n\t\t}\n\n\t\tif ( postRotation !== undefined ) {\n\n\t\t\tpostRotation = postRotation.map( MathUtils.degToRad );\n\t\t\tpostRotation.push( defaultEulerOrder );\n\n\t\t\tpostRotation = new Euler().fromArray( postRotation );\n\t\t\tpostRotation = new Quaternion().setFromEuler( postRotation ).invert();\n\n\t\t}\n\n\t\tconst quaternion = new Quaternion();\n\t\tconst euler = new Euler();\n\n\t\tconst quaternionValues = [];\n\n\t\tif ( ! values || ! times ) return new QuaternionKeyframeTrack( modelName + '.quaternion', [ 0 ], [ 0 ] );\n\n\t\tfor ( let i = 0; i < values.length; i += 3 ) {\n\n\t\t\teuler.set( values[ i ], values[ i + 1 ], values[ i + 2 ], eulerOrder );\n\t\t\tquaternion.setFromEuler( euler );\n\n\t\t\tif ( preRotation !== undefined ) quaternion.premultiply( preRotation );\n\t\t\tif ( postRotation !== undefined ) quaternion.multiply( postRotation );\n\n\t\t\t// Check unroll\n\t\t\tif ( i > 2 ) {\n\n\t\t\t\tconst prevQuat = new Quaternion().fromArray(\n\t\t\t\t\tquaternionValues,\n\t\t\t\t\t( ( i - 3 ) / 3 ) * 4\n\t\t\t\t);\n\n\t\t\t\tif ( prevQuat.dot( quaternion ) < 0 ) {\n\n\t\t\t\t\tquaternion.set( - quaternion.x, - quaternion.y, - quaternion.z, - quaternion.w );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tquaternion.toArray( quaternionValues, ( i / 3 ) * 4 );\n\n\t\t}\n\n\t\treturn new QuaternionKeyframeTrack( modelName + '.quaternion', times, quaternionValues );\n\n\t}\n\n\tgenerateMorphTrack( rawTracks ) {\n\n\t\tconst curves = rawTracks.DeformPercent.curves.morph;\n\t\tconst values = curves.values.map( function ( val ) {\n\n\t\t\treturn val / 100;\n\n\t\t} );\n\n\t\tconst morphNum = sceneGraph.getObjectByName( rawTracks.modelName ).morphTargetDictionary[ rawTracks.morphName ];\n\n\t\treturn new NumberKeyframeTrack( rawTracks.modelName + '.morphTargetInfluences[' + morphNum + ']', curves.times, values );\n\n\t}\n\n\t// For all animated objects, times are defined separately for each axis\n\t// Here we'll combine the times into one sorted array without duplicates\n\tgetTimesForAllAxes( curves ) {\n\n\t\tlet times = [];\n\n\t\t// first join together the times for each axis, if defined\n\t\tif ( curves.x !== undefined ) times = times.concat( curves.x.times );\n\t\tif ( curves.y !== undefined ) times = times.concat( curves.y.times );\n\t\tif ( curves.z !== undefined ) times = times.concat( curves.z.times );\n\n\t\t// then sort them\n\t\ttimes = times.sort( function ( a, b ) {\n\n\t\t\treturn a - b;\n\n\t\t} );\n\n\t\t// and remove duplicates\n\t\tif ( times.length > 1 ) {\n\n\t\t\tlet targetIndex = 1;\n\t\t\tlet lastValue = times[ 0 ];\n\t\t\tfor ( let i = 1; i < times.length; i ++ ) {\n\n\t\t\t\tconst currentValue = times[ i ];\n\t\t\t\tif ( currentValue !== lastValue ) {\n\n\t\t\t\t\ttimes[ targetIndex ] = currentValue;\n\t\t\t\t\tlastValue = currentValue;\n\t\t\t\t\ttargetIndex ++;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttimes = times.slice( 0, targetIndex );\n\n\t\t}\n\n\t\treturn times;\n\n\t}\n\n\tgetKeyframeTrackValues( times, curves, initialValue ) {\n\n\t\tconst prevValue = initialValue;\n\n\t\tconst values = [];\n\n\t\tlet xIndex = - 1;\n\t\tlet yIndex = - 1;\n\t\tlet zIndex = - 1;\n\n\t\ttimes.forEach( function ( time ) {\n\n\t\t\tif ( curves.x ) xIndex = curves.x.times.indexOf( time );\n\t\t\tif ( curves.y ) yIndex = curves.y.times.indexOf( time );\n\t\t\tif ( curves.z ) zIndex = curves.z.times.indexOf( time );\n\n\t\t\t// if there is an x value defined for this frame, use that\n\t\t\tif ( xIndex !== - 1 ) {\n\n\t\t\t\tconst xValue = curves.x.values[ xIndex ];\n\t\t\t\tvalues.push( xValue );\n\t\t\t\tprevValue[ 0 ] = xValue;\n\n\t\t\t} else {\n\n\t\t\t\t// otherwise use the x value from the previous frame\n\t\t\t\tvalues.push( prevValue[ 0 ] );\n\n\t\t\t}\n\n\t\t\tif ( yIndex !== - 1 ) {\n\n\t\t\t\tconst yValue = curves.y.values[ yIndex ];\n\t\t\t\tvalues.push( yValue );\n\t\t\t\tprevValue[ 1 ] = yValue;\n\n\t\t\t} else {\n\n\t\t\t\tvalues.push( prevValue[ 1 ] );\n\n\t\t\t}\n\n\t\t\tif ( zIndex !== - 1 ) {\n\n\t\t\t\tconst zValue = curves.z.values[ zIndex ];\n\t\t\t\tvalues.push( zValue );\n\t\t\t\tprevValue[ 2 ] = zValue;\n\n\t\t\t} else {\n\n\t\t\t\tvalues.push( prevValue[ 2 ] );\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn values;\n\n\t}\n\n\t// Rotations are defined as Euler angles which can have values  of any size\n\t// These will be converted to quaternions which don't support values greater than\n\t// PI, so we'll interpolate large rotations\n\tinterpolateRotations( curvex, curvey, curvez, eulerOrder ) {\n\n\t\tconst times = [];\n\t\tconst values = [];\n\n\t\t// Add first frame\n\t\ttimes.push( curvex.times[ 0 ] );\n\t\tvalues.push( MathUtils.degToRad( curvex.values[ 0 ] ) );\n\t\tvalues.push( MathUtils.degToRad( curvey.values[ 0 ] ) );\n\t\tvalues.push( MathUtils.degToRad( curvez.values[ 0 ] ) );\n\n\t\tfor ( let i = 1; i < curvex.values.length; i ++ ) {\n\n\t\t\tconst initialValue = [\n\t\t\t\tcurvex.values[ i - 1 ],\n\t\t\t\tcurvey.values[ i - 1 ],\n\t\t\t\tcurvez.values[ i - 1 ],\n\t\t\t];\n\n\t\t\tif ( isNaN( initialValue[ 0 ] ) || isNaN( initialValue[ 1 ] ) || isNaN( initialValue[ 2 ] ) ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst initialValueRad = initialValue.map( MathUtils.degToRad );\n\n\t\t\tconst currentValue = [\n\t\t\t\tcurvex.values[ i ],\n\t\t\t\tcurvey.values[ i ],\n\t\t\t\tcurvez.values[ i ],\n\t\t\t];\n\n\t\t\tif ( isNaN( currentValue[ 0 ] ) || isNaN( currentValue[ 1 ] ) || isNaN( currentValue[ 2 ] ) ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst currentValueRad = currentValue.map( MathUtils.degToRad );\n\n\t\t\tconst valuesSpan = [\n\t\t\t\tcurrentValue[ 0 ] - initialValue[ 0 ],\n\t\t\t\tcurrentValue[ 1 ] - initialValue[ 1 ],\n\t\t\t\tcurrentValue[ 2 ] - initialValue[ 2 ],\n\t\t\t];\n\n\t\t\tconst absoluteSpan = [\n\t\t\t\tMath.abs( valuesSpan[ 0 ] ),\n\t\t\t\tMath.abs( valuesSpan[ 1 ] ),\n\t\t\t\tMath.abs( valuesSpan[ 2 ] ),\n\t\t\t];\n\n\t\t\tif ( absoluteSpan[ 0 ] >= 180 || absoluteSpan[ 1 ] >= 180 || absoluteSpan[ 2 ] >= 180 ) {\n\n\t\t\t\tconst maxAbsSpan = Math.max( ...absoluteSpan );\n\n\t\t\t\tconst numSubIntervals = maxAbsSpan / 180;\n\n\t\t\t\tconst E1 = new Euler( ...initialValueRad, eulerOrder );\n\t\t\t\tconst E2 = new Euler( ...currentValueRad, eulerOrder );\n\n\t\t\t\tconst Q1 = new Quaternion().setFromEuler( E1 );\n\t\t\t\tconst Q2 = new Quaternion().setFromEuler( E2 );\n\n\t\t\t\t// Check unroll\n\t\t\t\tif ( Q1.dot( Q2 ) ) {\n\n\t\t\t\t\tQ2.set( - Q2.x, - Q2.y, - Q2.z, - Q2.w );\n\n\t\t\t\t}\n\n\t\t\t\t// Interpolate\n\t\t\t\tconst initialTime = curvex.times[ i - 1 ];\n\t\t\t\tconst timeSpan = curvex.times[ i ] - initialTime;\n\n\t\t\t\tconst Q = new Quaternion();\n\t\t\t\tconst E = new Euler();\n\t\t\t\tfor ( let t = 0; t < 1; t += 1 / numSubIntervals ) {\n\n\t\t\t\t\tQ.copy( Q1.clone().slerp( Q2.clone(), t ) );\n\n\t\t\t\t\ttimes.push( initialTime + t * timeSpan );\n\t\t\t\t\tE.setFromQuaternion( Q, eulerOrder );\n\n\t\t\t\t\tvalues.push( E.x );\n\t\t\t\t\tvalues.push( E.y );\n\t\t\t\t\tvalues.push( E.z );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\ttimes.push( curvex.times[ i ] );\n\t\t\t\tvalues.push( MathUtils.degToRad( curvex.values[ i ] ) );\n\t\t\t\tvalues.push( MathUtils.degToRad( curvey.values[ i ] ) );\n\t\t\t\tvalues.push( MathUtils.degToRad( curvez.values[ i ] ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn [ times, values ];\n\n\t}\n\n}\n\n// parse an FBX file in ASCII format\nclass TextParser {\n\n\tgetPrevNode() {\n\n\t\treturn this.nodeStack[ this.currentIndent - 2 ];\n\n\t}\n\n\tgetCurrentNode() {\n\n\t\treturn this.nodeStack[ this.currentIndent - 1 ];\n\n\t}\n\n\tgetCurrentProp() {\n\n\t\treturn this.currentProp;\n\n\t}\n\n\tpushStack( node ) {\n\n\t\tthis.nodeStack.push( node );\n\t\tthis.currentIndent += 1;\n\n\t}\n\n\tpopStack() {\n\n\t\tthis.nodeStack.pop();\n\t\tthis.currentIndent -= 1;\n\n\t}\n\n\tsetCurrentProp( val, name ) {\n\n\t\tthis.currentProp = val;\n\t\tthis.currentPropName = name;\n\n\t}\n\n\tparse( text ) {\n\n\t\tthis.currentIndent = 0;\n\n\t\tthis.allNodes = new FBXTree();\n\t\tthis.nodeStack = [];\n\t\tthis.currentProp = [];\n\t\tthis.currentPropName = '';\n\n\t\tconst scope = this;\n\n\t\tconst split = text.split( /[\\r\\n]+/ );\n\n\t\tsplit.forEach( function ( line, i ) {\n\n\t\t\tconst matchComment = line.match( /^[\\s\\t]*;/ );\n\t\t\tconst matchEmpty = line.match( /^[\\s\\t]*$/ );\n\n\t\t\tif ( matchComment || matchEmpty ) return;\n\n\t\t\tconst matchBeginning = line.match( '^\\\\t{' + scope.currentIndent + '}(\\\\w+):(.*){', '' );\n\t\t\tconst matchProperty = line.match( '^\\\\t{' + ( scope.currentIndent ) + '}(\\\\w+):[\\\\s\\\\t\\\\r\\\\n](.*)' );\n\t\t\tconst matchEnd = line.match( '^\\\\t{' + ( scope.currentIndent - 1 ) + '}}' );\n\n\t\t\tif ( matchBeginning ) {\n\n\t\t\t\tscope.parseNodeBegin( line, matchBeginning );\n\n\t\t\t} else if ( matchProperty ) {\n\n\t\t\t\tscope.parseNodeProperty( line, matchProperty, split[ ++ i ] );\n\n\t\t\t} else if ( matchEnd ) {\n\n\t\t\t\tscope.popStack();\n\n\t\t\t} else if ( line.match( /^[^\\s\\t}]/ ) ) {\n\n\t\t\t\t// large arrays are split over multiple lines terminated with a ',' character\n\t\t\t\t// if this is encountered the line needs to be joined to the previous line\n\t\t\t\tscope.parseNodePropertyContinued( line );\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn this.allNodes;\n\n\t}\n\n\tparseNodeBegin( line, property ) {\n\n\t\tconst nodeName = property[ 1 ].trim().replace( /^\"/, '' ).replace( /\"$/, '' );\n\n\t\tconst nodeAttrs = property[ 2 ].split( ',' ).map( function ( attr ) {\n\n\t\t\treturn attr.trim().replace( /^\"/, '' ).replace( /\"$/, '' );\n\n\t\t} );\n\n\t\tconst node = { name: nodeName };\n\t\tconst attrs = this.parseNodeAttr( nodeAttrs );\n\n\t\tconst currentNode = this.getCurrentNode();\n\n\t\t// a top node\n\t\tif ( this.currentIndent === 0 ) {\n\n\t\t\tthis.allNodes.add( nodeName, node );\n\n\t\t} else { // a subnode\n\n\t\t\t// if the subnode already exists, append it\n\t\t\tif ( nodeName in currentNode ) {\n\n\t\t\t\t// special case Pose needs PoseNodes as an array\n\t\t\t\tif ( nodeName === 'PoseNode' ) {\n\n\t\t\t\t\tcurrentNode.PoseNode.push( node );\n\n\t\t\t\t} else if ( currentNode[ nodeName ].id !== undefined ) {\n\n\t\t\t\t\tcurrentNode[ nodeName ] = {};\n\t\t\t\t\tcurrentNode[ nodeName ][ currentNode[ nodeName ].id ] = currentNode[ nodeName ];\n\n\t\t\t\t}\n\n\t\t\t\tif ( attrs.id !== '' ) currentNode[ nodeName ][ attrs.id ] = node;\n\n\t\t\t} else if ( typeof attrs.id === 'number' ) {\n\n\t\t\t\tcurrentNode[ nodeName ] = {};\n\t\t\t\tcurrentNode[ nodeName ][ attrs.id ] = node;\n\n\t\t\t} else if ( nodeName !== 'Properties70' ) {\n\n\t\t\t\tif ( nodeName === 'PoseNode' )\tcurrentNode[ nodeName ] = [ node ];\n\t\t\t\telse currentNode[ nodeName ] = node;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( typeof attrs.id === 'number' ) node.id = attrs.id;\n\t\tif ( attrs.name !== '' ) node.attrName = attrs.name;\n\t\tif ( attrs.type !== '' ) node.attrType = attrs.type;\n\n\t\tthis.pushStack( node );\n\n\t}\n\n\tparseNodeAttr( attrs ) {\n\n\t\tlet id = attrs[ 0 ];\n\n\t\tif ( attrs[ 0 ] !== '' ) {\n\n\t\t\tid = parseInt( attrs[ 0 ] );\n\n\t\t\tif ( isNaN( id ) ) {\n\n\t\t\t\tid = attrs[ 0 ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet name = '', type = '';\n\n\t\tif ( attrs.length > 1 ) {\n\n\t\t\tname = attrs[ 1 ].replace( /^(\\w+)::/, '' );\n\t\t\ttype = attrs[ 2 ];\n\n\t\t}\n\n\t\treturn { id: id, name: name, type: type };\n\n\t}\n\n\tparseNodeProperty( line, property, contentLine ) {\n\n\t\tlet propName = property[ 1 ].replace( /^\"/, '' ).replace( /\"$/, '' ).trim();\n\t\tlet propValue = property[ 2 ].replace( /^\"/, '' ).replace( /\"$/, '' ).trim();\n\n\t\t// for special case: base64 image data follows \"Content: ,\" line\n\t\t//\tContent: ,\n\t\t//\t \"/9j/4RDaRXhpZgAATU0A...\"\n\t\tif ( propName === 'Content' && propValue === ',' ) {\n\n\t\t\tpropValue = contentLine.replace( /\"/g, '' ).replace( /,$/, '' ).trim();\n\n\t\t}\n\n\t\tconst currentNode = this.getCurrentNode();\n\t\tconst parentName = currentNode.name;\n\n\t\tif ( parentName === 'Properties70' ) {\n\n\t\t\tthis.parseNodeSpecialProperty( line, propName, propValue );\n\t\t\treturn;\n\n\t\t}\n\n\t\t// Connections\n\t\tif ( propName === 'C' ) {\n\n\t\t\tconst connProps = propValue.split( ',' ).slice( 1 );\n\t\t\tconst from = parseInt( connProps[ 0 ] );\n\t\t\tconst to = parseInt( connProps[ 1 ] );\n\n\t\t\tlet rest = propValue.split( ',' ).slice( 3 );\n\n\t\t\trest = rest.map( function ( elem ) {\n\n\t\t\t\treturn elem.trim().replace( /^\"/, '' );\n\n\t\t\t} );\n\n\t\t\tpropName = 'connections';\n\t\t\tpropValue = [ from, to ];\n\t\t\tappend( propValue, rest );\n\n\t\t\tif ( currentNode[ propName ] === undefined ) {\n\n\t\t\t\tcurrentNode[ propName ] = [];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Node\n\t\tif ( propName === 'Node' ) currentNode.id = propValue;\n\n\t\t// connections\n\t\tif ( propName in currentNode && Array.isArray( currentNode[ propName ] ) ) {\n\n\t\t\tcurrentNode[ propName ].push( propValue );\n\n\t\t} else {\n\n\t\t\tif ( propName !== 'a' ) currentNode[ propName ] = propValue;\n\t\t\telse currentNode.a = propValue;\n\n\t\t}\n\n\t\tthis.setCurrentProp( currentNode, propName );\n\n\t\t// convert string to array, unless it ends in ',' in which case more will be added to it\n\t\tif ( propName === 'a' && propValue.slice( - 1 ) !== ',' ) {\n\n\t\t\tcurrentNode.a = parseNumberArray( propValue );\n\n\t\t}\n\n\t}\n\n\tparseNodePropertyContinued( line ) {\n\n\t\tconst currentNode = this.getCurrentNode();\n\n\t\tcurrentNode.a += line;\n\n\t\t// if the line doesn't end in ',' we have reached the end of the property value\n\t\t// so convert the string to an array\n\t\tif ( line.slice( - 1 ) !== ',' ) {\n\n\t\t\tcurrentNode.a = parseNumberArray( currentNode.a );\n\n\t\t}\n\n\t}\n\n\t// parse \"Property70\"\n\tparseNodeSpecialProperty( line, propName, propValue ) {\n\n\t\t// split this\n\t\t// P: \"Lcl Scaling\", \"Lcl Scaling\", \"\", \"A\",1,1,1\n\t\t// into array like below\n\t\t// [\"Lcl Scaling\", \"Lcl Scaling\", \"\", \"A\", \"1,1,1\" ]\n\t\tconst props = propValue.split( '\",' ).map( function ( prop ) {\n\n\t\t\treturn prop.trim().replace( /^\\\"/, '' ).replace( /\\s/, '_' );\n\n\t\t} );\n\n\t\tconst innerPropName = props[ 0 ];\n\t\tconst innerPropType1 = props[ 1 ];\n\t\tconst innerPropType2 = props[ 2 ];\n\t\tconst innerPropFlag = props[ 3 ];\n\t\tlet innerPropValue = props[ 4 ];\n\n\t\t// cast values where needed, otherwise leave as strings\n\t\tswitch ( innerPropType1 ) {\n\n\t\t\tcase 'int':\n\t\t\tcase 'enum':\n\t\t\tcase 'bool':\n\t\t\tcase 'ULongLong':\n\t\t\tcase 'double':\n\t\t\tcase 'Number':\n\t\t\tcase 'FieldOfView':\n\t\t\t\tinnerPropValue = parseFloat( innerPropValue );\n\t\t\t\tbreak;\n\n\t\t\tcase 'Color':\n\t\t\tcase 'ColorRGB':\n\t\t\tcase 'Vector3D':\n\t\t\tcase 'Lcl_Translation':\n\t\t\tcase 'Lcl_Rotation':\n\t\t\tcase 'Lcl_Scaling':\n\t\t\t\tinnerPropValue = parseNumberArray( innerPropValue );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\t// CAUTION: these props must append to parent's parent\n\t\tthis.getPrevNode()[ innerPropName ] = {\n\n\t\t\t'type': innerPropType1,\n\t\t\t'type2': innerPropType2,\n\t\t\t'flag': innerPropFlag,\n\t\t\t'value': innerPropValue\n\n\t\t};\n\n\t\tthis.setCurrentProp( this.getPrevNode(), innerPropName );\n\n\t}\n\n}\n\n// Parse an FBX file in Binary format\nclass BinaryParser {\n\n\tparse( buffer ) {\n\n\t\tconst reader = new BinaryReader( buffer );\n\t\treader.skip( 23 ); // skip magic 23 bytes\n\n\t\tconst version = reader.getUint32();\n\n\t\tif ( version < 6400 ) {\n\n\t\t\tthrow new Error( 'THREE.FBXLoader: FBX version not supported, FileVersion: ' + version );\n\n\t\t}\n\n\t\tconst allNodes = new FBXTree();\n\n\t\twhile ( ! this.endOfContent( reader ) ) {\n\n\t\t\tconst node = this.parseNode( reader, version );\n\t\t\tif ( node !== null ) allNodes.add( node.name, node );\n\n\t\t}\n\n\t\treturn allNodes;\n\n\t}\n\n\t// Check if reader has reached the end of content.\n\tendOfContent( reader ) {\n\n\t\t// footer size: 160bytes + 16-byte alignment padding\n\t\t// - 16bytes: magic\n\t\t// - padding til 16-byte alignment (at least 1byte?)\n\t\t//\t(seems like some exporters embed fixed 15 or 16bytes?)\n\t\t// - 4bytes: magic\n\t\t// - 4bytes: version\n\t\t// - 120bytes: zero\n\t\t// - 16bytes: magic\n\t\tif ( reader.size() % 16 === 0 ) {\n\n\t\t\treturn ( ( reader.getOffset() + 160 + 16 ) & ~ 0xf ) >= reader.size();\n\n\t\t} else {\n\n\t\t\treturn reader.getOffset() + 160 + 16 >= reader.size();\n\n\t\t}\n\n\t}\n\n\t// recursively parse nodes until the end of the file is reached\n\tparseNode( reader, version ) {\n\n\t\tconst node = {};\n\n\t\t// The first three data sizes depends on version.\n\t\tconst endOffset = ( version >= 7500 ) ? reader.getUint64() : reader.getUint32();\n\t\tconst numProperties = ( version >= 7500 ) ? reader.getUint64() : reader.getUint32();\n\n\t\t( version >= 7500 ) ? reader.getUint64() : reader.getUint32(); // the returned propertyListLen is not used\n\n\t\tconst nameLen = reader.getUint8();\n\t\tconst name = reader.getString( nameLen );\n\n\t\t// Regards this node as NULL-record if endOffset is zero\n\t\tif ( endOffset === 0 ) return null;\n\n\t\tconst propertyList = [];\n\n\t\tfor ( let i = 0; i < numProperties; i ++ ) {\n\n\t\t\tpropertyList.push( this.parseProperty( reader ) );\n\n\t\t}\n\n\t\t// Regards the first three elements in propertyList as id, attrName, and attrType\n\t\tconst id = propertyList.length > 0 ? propertyList[ 0 ] : '';\n\t\tconst attrName = propertyList.length > 1 ? propertyList[ 1 ] : '';\n\t\tconst attrType = propertyList.length > 2 ? propertyList[ 2 ] : '';\n\n\t\t// check if this node represents just a single property\n\t\t// like (name, 0) set or (name2, [0, 1, 2]) set of {name: 0, name2: [0, 1, 2]}\n\t\tnode.singleProperty = ( numProperties === 1 && reader.getOffset() === endOffset ) ? true : false;\n\n\t\twhile ( endOffset > reader.getOffset() ) {\n\n\t\t\tconst subNode = this.parseNode( reader, version );\n\n\t\t\tif ( subNode !== null ) this.parseSubNode( name, node, subNode );\n\n\t\t}\n\n\t\tnode.propertyList = propertyList; // raw property list used by parent\n\n\t\tif ( typeof id === 'number' ) node.id = id;\n\t\tif ( attrName !== '' ) node.attrName = attrName;\n\t\tif ( attrType !== '' ) node.attrType = attrType;\n\t\tif ( name !== '' ) node.name = name;\n\n\t\treturn node;\n\n\t}\n\n\tparseSubNode( name, node, subNode ) {\n\n\t\t// special case: child node is single property\n\t\tif ( subNode.singleProperty === true ) {\n\n\t\t\tconst value = subNode.propertyList[ 0 ];\n\n\t\t\tif ( Array.isArray( value ) ) {\n\n\t\t\t\tnode[ subNode.name ] = subNode;\n\n\t\t\t\tsubNode.a = value;\n\n\t\t\t} else {\n\n\t\t\t\tnode[ subNode.name ] = value;\n\n\t\t\t}\n\n\t\t} else if ( name === 'Connections' && subNode.name === 'C' ) {\n\n\t\t\tconst array = [];\n\n\t\t\tsubNode.propertyList.forEach( function ( property, i ) {\n\n\t\t\t\t// first Connection is FBX type (OO, OP, etc.). We'll discard these\n\t\t\t\tif ( i !== 0 ) array.push( property );\n\n\t\t\t} );\n\n\t\t\tif ( node.connections === undefined ) {\n\n\t\t\t\tnode.connections = [];\n\n\t\t\t}\n\n\t\t\tnode.connections.push( array );\n\n\t\t} else if ( subNode.name === 'Properties70' ) {\n\n\t\t\tconst keys = Object.keys( subNode );\n\n\t\t\tkeys.forEach( function ( key ) {\n\n\t\t\t\tnode[ key ] = subNode[ key ];\n\n\t\t\t} );\n\n\t\t} else if ( name === 'Properties70' && subNode.name === 'P' ) {\n\n\t\t\tlet innerPropName = subNode.propertyList[ 0 ];\n\t\t\tlet innerPropType1 = subNode.propertyList[ 1 ];\n\t\t\tconst innerPropType2 = subNode.propertyList[ 2 ];\n\t\t\tconst innerPropFlag = subNode.propertyList[ 3 ];\n\t\t\tlet innerPropValue;\n\n\t\t\tif ( innerPropName.indexOf( 'Lcl ' ) === 0 ) innerPropName = innerPropName.replace( 'Lcl ', 'Lcl_' );\n\t\t\tif ( innerPropType1.indexOf( 'Lcl ' ) === 0 ) innerPropType1 = innerPropType1.replace( 'Lcl ', 'Lcl_' );\n\n\t\t\tif ( innerPropType1 === 'Color' || innerPropType1 === 'ColorRGB' || innerPropType1 === 'Vector' || innerPropType1 === 'Vector3D' || innerPropType1.indexOf( 'Lcl_' ) === 0 ) {\n\n\t\t\t\tinnerPropValue = [\n\t\t\t\t\tsubNode.propertyList[ 4 ],\n\t\t\t\t\tsubNode.propertyList[ 5 ],\n\t\t\t\t\tsubNode.propertyList[ 6 ]\n\t\t\t\t];\n\n\t\t\t} else {\n\n\t\t\t\tinnerPropValue = subNode.propertyList[ 4 ];\n\n\t\t\t}\n\n\t\t\t// this will be copied to parent, see above\n\t\t\tnode[ innerPropName ] = {\n\n\t\t\t\t'type': innerPropType1,\n\t\t\t\t'type2': innerPropType2,\n\t\t\t\t'flag': innerPropFlag,\n\t\t\t\t'value': innerPropValue\n\n\t\t\t};\n\n\t\t} else if ( node[ subNode.name ] === undefined ) {\n\n\t\t\tif ( typeof subNode.id === 'number' ) {\n\n\t\t\t\tnode[ subNode.name ] = {};\n\t\t\t\tnode[ subNode.name ][ subNode.id ] = subNode;\n\n\t\t\t} else {\n\n\t\t\t\tnode[ subNode.name ] = subNode;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( subNode.name === 'PoseNode' ) {\n\n\t\t\t\tif ( ! Array.isArray( node[ subNode.name ] ) ) {\n\n\t\t\t\t\tnode[ subNode.name ] = [ node[ subNode.name ] ];\n\n\t\t\t\t}\n\n\t\t\t\tnode[ subNode.name ].push( subNode );\n\n\t\t\t} else if ( node[ subNode.name ][ subNode.id ] === undefined ) {\n\n\t\t\t\tnode[ subNode.name ][ subNode.id ] = subNode;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tparseProperty( reader ) {\n\n\t\tconst type = reader.getString( 1 );\n\t\tlet length;\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 'C':\n\t\t\t\treturn reader.getBoolean();\n\n\t\t\tcase 'D':\n\t\t\t\treturn reader.getFloat64();\n\n\t\t\tcase 'F':\n\t\t\t\treturn reader.getFloat32();\n\n\t\t\tcase 'I':\n\t\t\t\treturn reader.getInt32();\n\n\t\t\tcase 'L':\n\t\t\t\treturn reader.getInt64();\n\n\t\t\tcase 'R':\n\t\t\t\tlength = reader.getUint32();\n\t\t\t\treturn reader.getArrayBuffer( length );\n\n\t\t\tcase 'S':\n\t\t\t\tlength = reader.getUint32();\n\t\t\t\treturn reader.getString( length );\n\n\t\t\tcase 'Y':\n\t\t\t\treturn reader.getInt16();\n\n\t\t\tcase 'b':\n\t\t\tcase 'c':\n\t\t\tcase 'd':\n\t\t\tcase 'f':\n\t\t\tcase 'i':\n\t\t\tcase 'l':\n\n\t\t\t\tconst arrayLength = reader.getUint32();\n\t\t\t\tconst encoding = reader.getUint32(); // 0: non-compressed, 1: compressed\n\t\t\t\tconst compressedLength = reader.getUint32();\n\n\t\t\t\tif ( encoding === 0 ) {\n\n\t\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\t\tcase 'b':\n\t\t\t\t\t\tcase 'c':\n\t\t\t\t\t\t\treturn reader.getBooleanArray( arrayLength );\n\n\t\t\t\t\t\tcase 'd':\n\t\t\t\t\t\t\treturn reader.getFloat64Array( arrayLength );\n\n\t\t\t\t\t\tcase 'f':\n\t\t\t\t\t\t\treturn reader.getFloat32Array( arrayLength );\n\n\t\t\t\t\t\tcase 'i':\n\t\t\t\t\t\t\treturn reader.getInt32Array( arrayLength );\n\n\t\t\t\t\t\tcase 'l':\n\t\t\t\t\t\t\treturn reader.getInt64Array( arrayLength );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst data = fflate.unzlibSync( new Uint8Array( reader.getArrayBuffer( compressedLength ) ) );\n\t\t\t\tconst reader2 = new BinaryReader( data.buffer );\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\tcase 'b':\n\t\t\t\t\tcase 'c':\n\t\t\t\t\t\treturn reader2.getBooleanArray( arrayLength );\n\n\t\t\t\t\tcase 'd':\n\t\t\t\t\t\treturn reader2.getFloat64Array( arrayLength );\n\n\t\t\t\t\tcase 'f':\n\t\t\t\t\t\treturn reader2.getFloat32Array( arrayLength );\n\n\t\t\t\t\tcase 'i':\n\t\t\t\t\t\treturn reader2.getInt32Array( arrayLength );\n\n\t\t\t\t\tcase 'l':\n\t\t\t\t\t\treturn reader2.getInt64Array( arrayLength );\n\n\t\t\t\t}\n\n\t\t\t\tbreak; // cannot happen but is required by the DeepScan\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'THREE.FBXLoader: Unknown property type ' + type );\n\n\t\t}\n\n\t}\n\n}\n\nclass BinaryReader {\n\n\tconstructor( buffer, littleEndian ) {\n\n\t\tthis.dv = new DataView( buffer );\n\t\tthis.offset = 0;\n\t\tthis.littleEndian = ( littleEndian !== undefined ) ? littleEndian : true;\n\t\tthis._textDecoder = new TextDecoder();\n\n\t}\n\n\tgetOffset() {\n\n\t\treturn this.offset;\n\n\t}\n\n\tsize() {\n\n\t\treturn this.dv.buffer.byteLength;\n\n\t}\n\n\tskip( length ) {\n\n\t\tthis.offset += length;\n\n\t}\n\n\t// seems like true/false representation depends on exporter.\n\t// true: 1 or 'Y'(=0x59), false: 0 or 'T'(=0x54)\n\t// then sees LSB.\n\tgetBoolean() {\n\n\t\treturn ( this.getUint8() & 1 ) === 1;\n\n\t}\n\n\tgetBooleanArray( size ) {\n\n\t\tconst a = [];\n\n\t\tfor ( let i = 0; i < size; i ++ ) {\n\n\t\t\ta.push( this.getBoolean() );\n\n\t\t}\n\n\t\treturn a;\n\n\t}\n\n\tgetUint8() {\n\n\t\tconst value = this.dv.getUint8( this.offset );\n\t\tthis.offset += 1;\n\t\treturn value;\n\n\t}\n\n\tgetInt16() {\n\n\t\tconst value = this.dv.getInt16( this.offset, this.littleEndian );\n\t\tthis.offset += 2;\n\t\treturn value;\n\n\t}\n\n\tgetInt32() {\n\n\t\tconst value = this.dv.getInt32( this.offset, this.littleEndian );\n\t\tthis.offset += 4;\n\t\treturn value;\n\n\t}\n\n\tgetInt32Array( size ) {\n\n\t\tconst a = [];\n\n\t\tfor ( let i = 0; i < size; i ++ ) {\n\n\t\t\ta.push( this.getInt32() );\n\n\t\t}\n\n\t\treturn a;\n\n\t}\n\n\tgetUint32() {\n\n\t\tconst value = this.dv.getUint32( this.offset, this.littleEndian );\n\t\tthis.offset += 4;\n\t\treturn value;\n\n\t}\n\n\t// JavaScript doesn't support 64-bit integer so calculate this here\n\t// 1 << 32 will return 1 so using multiply operation instead here.\n\t// There's a possibility that this method returns wrong value if the value\n\t// is out of the range between Number.MAX_SAFE_INTEGER and Number.MIN_SAFE_INTEGER.\n\t// TODO: safely handle 64-bit integer\n\tgetInt64() {\n\n\t\tlet low, high;\n\n\t\tif ( this.littleEndian ) {\n\n\t\t\tlow = this.getUint32();\n\t\t\thigh = this.getUint32();\n\n\t\t} else {\n\n\t\t\thigh = this.getUint32();\n\t\t\tlow = this.getUint32();\n\n\t\t}\n\n\t\t// calculate negative value\n\t\tif ( high & 0x80000000 ) {\n\n\t\t\thigh = ~ high & 0xFFFFFFFF;\n\t\t\tlow = ~ low & 0xFFFFFFFF;\n\n\t\t\tif ( low === 0xFFFFFFFF ) high = ( high + 1 ) & 0xFFFFFFFF;\n\n\t\t\tlow = ( low + 1 ) & 0xFFFFFFFF;\n\n\t\t\treturn - ( high * 0x100000000 + low );\n\n\t\t}\n\n\t\treturn high * 0x100000000 + low;\n\n\t}\n\n\tgetInt64Array( size ) {\n\n\t\tconst a = [];\n\n\t\tfor ( let i = 0; i < size; i ++ ) {\n\n\t\t\ta.push( this.getInt64() );\n\n\t\t}\n\n\t\treturn a;\n\n\t}\n\n\t// Note: see getInt64() comment\n\tgetUint64() {\n\n\t\tlet low, high;\n\n\t\tif ( this.littleEndian ) {\n\n\t\t\tlow = this.getUint32();\n\t\t\thigh = this.getUint32();\n\n\t\t} else {\n\n\t\t\thigh = this.getUint32();\n\t\t\tlow = this.getUint32();\n\n\t\t}\n\n\t\treturn high * 0x100000000 + low;\n\n\t}\n\n\tgetFloat32() {\n\n\t\tconst value = this.dv.getFloat32( this.offset, this.littleEndian );\n\t\tthis.offset += 4;\n\t\treturn value;\n\n\t}\n\n\tgetFloat32Array( size ) {\n\n\t\tconst a = [];\n\n\t\tfor ( let i = 0; i < size; i ++ ) {\n\n\t\t\ta.push( this.getFloat32() );\n\n\t\t}\n\n\t\treturn a;\n\n\t}\n\n\tgetFloat64() {\n\n\t\tconst value = this.dv.getFloat64( this.offset, this.littleEndian );\n\t\tthis.offset += 8;\n\t\treturn value;\n\n\t}\n\n\tgetFloat64Array( size ) {\n\n\t\tconst a = [];\n\n\t\tfor ( let i = 0; i < size; i ++ ) {\n\n\t\t\ta.push( this.getFloat64() );\n\n\t\t}\n\n\t\treturn a;\n\n\t}\n\n\tgetArrayBuffer( size ) {\n\n\t\tconst value = this.dv.buffer.slice( this.offset, this.offset + size );\n\t\tthis.offset += size;\n\t\treturn value;\n\n\t}\n\n\tgetString( size ) {\n\n\t\tconst start = this.offset;\n\t\tlet a = new Uint8Array( this.dv.buffer, start, size );\n\n\t\tthis.skip( size );\n\n\t\tconst nullByte = a.indexOf( 0 );\n\t\tif ( nullByte >= 0 ) a = new Uint8Array( this.dv.buffer, start, nullByte );\n\n\t\treturn this._textDecoder.decode( a );\n\n\t}\n\n}\n\n// FBXTree holds a representation of the FBX data, returned by the TextParser ( FBX ASCII format)\n// and BinaryParser( FBX Binary format)\nclass FBXTree {\n\n\tadd( key, val ) {\n\n\t\tthis[ key ] = val;\n\n\t}\n\n}\n\n// ************** UTILITY FUNCTIONS **************\n\nfunction isFbxFormatBinary( buffer ) {\n\n\tconst CORRECT = 'Kaydara\\u0020FBX\\u0020Binary\\u0020\\u0020\\0';\n\n\treturn buffer.byteLength >= CORRECT.length && CORRECT === convertArrayBufferToString( buffer, 0, CORRECT.length );\n\n}\n\nfunction isFbxFormatASCII( text ) {\n\n\tconst CORRECT = [ 'K', 'a', 'y', 'd', 'a', 'r', 'a', '\\\\', 'F', 'B', 'X', '\\\\', 'B', 'i', 'n', 'a', 'r', 'y', '\\\\', '\\\\' ];\n\n\tlet cursor = 0;\n\n\tfunction read( offset ) {\n\n\t\tconst result = text[ offset - 1 ];\n\t\ttext = text.slice( cursor + offset );\n\t\tcursor ++;\n\t\treturn result;\n\n\t}\n\n\tfor ( let i = 0; i < CORRECT.length; ++ i ) {\n\n\t\tconst num = read( 1 );\n\t\tif ( num === CORRECT[ i ] ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\treturn true;\n\n}\n\nfunction getFbxVersion( text ) {\n\n\tconst versionRegExp = /FBXVersion: (\\d+)/;\n\tconst match = text.match( versionRegExp );\n\n\tif ( match ) {\n\n\t\tconst version = parseInt( match[ 1 ] );\n\t\treturn version;\n\n\t}\n\n\tthrow new Error( 'THREE.FBXLoader: Cannot find the version number for the file given.' );\n\n}\n\n// Converts FBX ticks into real time seconds.\nfunction convertFBXTimeToSeconds( time ) {\n\n\treturn time / 46186158000;\n\n}\n\nconst dataArray = [];\n\n// extracts the data from the correct position in the FBX array based on indexing type\nfunction getData( polygonVertexIndex, polygonIndex, vertexIndex, infoObject ) {\n\n\tlet index;\n\n\tswitch ( infoObject.mappingType ) {\n\n\t\tcase 'ByPolygonVertex' :\n\t\t\tindex = polygonVertexIndex;\n\t\t\tbreak;\n\t\tcase 'ByPolygon' :\n\t\t\tindex = polygonIndex;\n\t\t\tbreak;\n\t\tcase 'ByVertice' :\n\t\t\tindex = vertexIndex;\n\t\t\tbreak;\n\t\tcase 'AllSame' :\n\t\t\tindex = infoObject.indices[ 0 ];\n\t\t\tbreak;\n\t\tdefault :\n\t\t\tconsole.warn( 'THREE.FBXLoader: unknown attribute mapping type ' + infoObject.mappingType );\n\n\t}\n\n\tif ( infoObject.referenceType === 'IndexToDirect' ) index = infoObject.indices[ index ];\n\n\tconst from = index * infoObject.dataSize;\n\tconst to = from + infoObject.dataSize;\n\n\treturn slice( dataArray, infoObject.buffer, from, to );\n\n}\n\nconst tempEuler = new Euler();\nconst tempVec = new Vector3();\n\n// generate transformation from FBX transform data\n// ref: https://help.autodesk.com/view/FBX/2017/ENU/?guid=__files_GUID_10CDD63C_79C1_4F2D_BB28_AD2BE65A02ED_htm\n// ref: http://docs.autodesk.com/FBX/2014/ENU/FBX-SDK-Documentation/index.html?url=cpp_ref/_transformations_2main_8cxx-example.html,topicNumber=cpp_ref__transformations_2main_8cxx_example_htmlfc10a1e1-b18d-4e72-9dc0-70d0f1959f5e\nfunction generateTransform( transformData ) {\n\n\tconst lTranslationM = new Matrix4();\n\tconst lPreRotationM = new Matrix4();\n\tconst lRotationM = new Matrix4();\n\tconst lPostRotationM = new Matrix4();\n\n\tconst lScalingM = new Matrix4();\n\tconst lScalingPivotM = new Matrix4();\n\tconst lScalingOffsetM = new Matrix4();\n\tconst lRotationOffsetM = new Matrix4();\n\tconst lRotationPivotM = new Matrix4();\n\n\tconst lParentGX = new Matrix4();\n\tconst lParentLX = new Matrix4();\n\tconst lGlobalT = new Matrix4();\n\n\tconst inheritType = ( transformData.inheritType ) ? transformData.inheritType : 0;\n\n\tif ( transformData.translation ) lTranslationM.setPosition( tempVec.fromArray( transformData.translation ) );\n\n\t// For Maya models using \"Joint Orient\", Euler order only applies to rotation, not pre/post-rotations\n\tconst defaultEulerOrder = getEulerOrder( 0 );\n\n\tif ( transformData.preRotation ) {\n\n\t\tconst array = transformData.preRotation.map( MathUtils.degToRad );\n\t\tarray.push( defaultEulerOrder );\n\t\tlPreRotationM.makeRotationFromEuler( tempEuler.fromArray( array ) );\n\n\t}\n\n\tif ( transformData.rotation ) {\n\n\t\tconst array = transformData.rotation.map( MathUtils.degToRad );\n\t\tarray.push( transformData.eulerOrder || defaultEulerOrder );\n\t\tlRotationM.makeRotationFromEuler( tempEuler.fromArray( array ) );\n\n\t}\n\n\tif ( transformData.postRotation ) {\n\n\t\tconst array = transformData.postRotation.map( MathUtils.degToRad );\n\t\tarray.push( defaultEulerOrder );\n\t\tlPostRotationM.makeRotationFromEuler( tempEuler.fromArray( array ) );\n\t\tlPostRotationM.invert();\n\n\t}\n\n\tif ( transformData.scale ) lScalingM.scale( tempVec.fromArray( transformData.scale ) );\n\n\t// Pivots and offsets\n\tif ( transformData.scalingOffset ) lScalingOffsetM.setPosition( tempVec.fromArray( transformData.scalingOffset ) );\n\tif ( transformData.scalingPivot ) lScalingPivotM.setPosition( tempVec.fromArray( transformData.scalingPivot ) );\n\tif ( transformData.rotationOffset ) lRotationOffsetM.setPosition( tempVec.fromArray( transformData.rotationOffset ) );\n\tif ( transformData.rotationPivot ) lRotationPivotM.setPosition( tempVec.fromArray( transformData.rotationPivot ) );\n\n\t// parent transform\n\tif ( transformData.parentMatrixWorld ) {\n\n\t\tlParentLX.copy( transformData.parentMatrix );\n\t\tlParentGX.copy( transformData.parentMatrixWorld );\n\n\t}\n\n\tconst lLRM = lPreRotationM.clone().multiply( lRotationM ).multiply( lPostRotationM );\n\t// Global Rotation\n\tconst lParentGRM = new Matrix4();\n\tlParentGRM.extractRotation( lParentGX );\n\n\t// Global Shear*Scaling\n\tconst lParentTM = new Matrix4();\n\tlParentTM.copyPosition( lParentGX );\n\n\tconst lParentGRSM = lParentTM.clone().invert().multiply( lParentGX );\n\tconst lParentGSM = lParentGRM.clone().invert().multiply( lParentGRSM );\n\tconst lLSM = lScalingM;\n\n\tconst lGlobalRS = new Matrix4();\n\n\tif ( inheritType === 0 ) {\n\n\t\tlGlobalRS.copy( lParentGRM ).multiply( lLRM ).multiply( lParentGSM ).multiply( lLSM );\n\n\t} else if ( inheritType === 1 ) {\n\n\t\tlGlobalRS.copy( lParentGRM ).multiply( lParentGSM ).multiply( lLRM ).multiply( lLSM );\n\n\t} else {\n\n\t\tconst lParentLSM = new Matrix4().scale( new Vector3().setFromMatrixScale( lParentLX ) );\n\t\tconst lParentLSM_inv = lParentLSM.clone().invert();\n\t\tconst lParentGSM_noLocal = lParentGSM.clone().multiply( lParentLSM_inv );\n\n\t\tlGlobalRS.copy( lParentGRM ).multiply( lLRM ).multiply( lParentGSM_noLocal ).multiply( lLSM );\n\n\t}\n\n\tconst lRotationPivotM_inv = lRotationPivotM.clone().invert();\n\tconst lScalingPivotM_inv = lScalingPivotM.clone().invert();\n\t// Calculate the local transform matrix\n\tlet lTransform = lTranslationM.clone().multiply( lRotationOffsetM ).multiply( lRotationPivotM ).multiply( lPreRotationM ).multiply( lRotationM ).multiply( lPostRotationM ).multiply( lRotationPivotM_inv ).multiply( lScalingOffsetM ).multiply( lScalingPivotM ).multiply( lScalingM ).multiply( lScalingPivotM_inv );\n\n\tconst lLocalTWithAllPivotAndOffsetInfo = new Matrix4().copyPosition( lTransform );\n\n\tconst lGlobalTranslation = lParentGX.clone().multiply( lLocalTWithAllPivotAndOffsetInfo );\n\tlGlobalT.copyPosition( lGlobalTranslation );\n\n\tlTransform = lGlobalT.clone().multiply( lGlobalRS );\n\n\t// from global to local\n\tlTransform.premultiply( lParentGX.invert() );\n\n\treturn lTransform;\n\n}\n\n// Returns the three.js intrinsic Euler order corresponding to FBX extrinsic Euler order\n// ref: http://help.autodesk.com/view/FBX/2017/ENU/?guid=__cpp_ref_class_fbx_euler_html\nfunction getEulerOrder( order ) {\n\n\torder = order || 0;\n\n\tconst enums = [\n\t\t'ZYX', // -> XYZ extrinsic\n\t\t'YZX', // -> XZY extrinsic\n\t\t'XZY', // -> YZX extrinsic\n\t\t'ZXY', // -> YXZ extrinsic\n\t\t'YXZ', // -> ZXY extrinsic\n\t\t'XYZ', // -> ZYX extrinsic\n\t\t//'SphericXYZ', // not possible to support\n\t];\n\n\tif ( order === 6 ) {\n\n\t\tconsole.warn( 'THREE.FBXLoader: unsupported Euler Order: Spherical XYZ. Animations and rotations may be incorrect.' );\n\t\treturn enums[ 0 ];\n\n\t}\n\n\treturn enums[ order ];\n\n}\n\n// Parses comma separated list of numbers and returns them an array.\n// Used internally by the TextParser\nfunction parseNumberArray( value ) {\n\n\tconst array = value.split( ',' ).map( function ( val ) {\n\n\t\treturn parseFloat( val );\n\n\t} );\n\n\treturn array;\n\n}\n\nfunction convertArrayBufferToString( buffer, from, to ) {\n\n\tif ( from === undefined ) from = 0;\n\tif ( to === undefined ) to = buffer.byteLength;\n\n\treturn new TextDecoder().decode( new Uint8Array( buffer, from, to ) );\n\n}\n\nfunction append( a, b ) {\n\n\tfor ( let i = 0, j = a.length, l = b.length; i < l; i ++, j ++ ) {\n\n\t\ta[ j ] = b[ i ];\n\n\t}\n\n}\n\nfunction slice( a, b, from, to ) {\n\n\tfor ( let i = from, j = 0; i < to; i ++, j ++ ) {\n\n\t\ta[ j ] = b[ i ];\n\n\t}\n\n\treturn a;\n\n}\n\n\nexport { FBXLoader };\n", "import {\n\tFileLoader,\n\tLoader,\n\tShapePath\n} from 'three';\n\n/**\n * A loader for loading fonts.\n *\n * You can convert fonts online using [facetype.js](https://gero3.github.io/facetype.js/).\n *\n * ```js\n * const loader = new FontLoader();\n * const font = await loader.loadAsync( 'fonts/helvetiker_regular.typeface.json' );\n * ```\n *\n * @augments Loader\n * @three_import import { FontLoader } from 'three/addons/loaders/FontLoader.js';\n */\nclass FontLoader extends Loader {\n\n\t/**\n\t * Constructs a new font loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded font\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Font)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tconst font = scope.parse( JSON.parse( text ) );\n\n\t\t\tif ( onLoad ) onLoad( font );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given font data and returns the resulting font.\n\t *\n\t * @param {Object} json - The raw font data as a JSON object.\n\t * @return {Font} The font.\n\t */\n\tparse( json ) {\n\n\t\treturn new Font( json );\n\n\t}\n\n}\n\n/**\n * Class representing a font.\n */\nclass Font {\n\n\t/**\n\t * Constructs a new font.\n\t *\n\t * @param {Object} data - The font data as JSON.\n\t */\n\tconstructor( data ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isFont = true;\n\n\t\tthis.type = 'Font';\n\n\t\t/**\n\t\t * The font data as JSON.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.data = data;\n\n\t}\n\n\t/**\n\t * Generates geometry shapes from the given text and size. The result of this method\n\t * should be used with {@link ShapeGeometry} to generate the actual geometry data.\n\t *\n\t * @param {string} text - The text.\n\t * @param {number} [size=100] - The text size.\n\t * @param {string} [direction='ltr'] - Char direction: ltr(left to right), rtl(right to left) & tb(top bottom).\n\t * @return {Array<Shape>} An array of shapes representing the text.\n\t */\n\tgenerateShapes( text, size = 100, direction = 'ltr' ) {\n\n\t\tconst shapes = [];\n\t\tconst paths = createPaths( text, size, this.data, direction );\n\n\t\tfor ( let p = 0, pl = paths.length; p < pl; p ++ ) {\n\n\t\t\tshapes.push( ...paths[ p ].toShapes() );\n\n\t\t}\n\n\t\treturn shapes;\n\n\t}\n\n}\n\nfunction createPaths( text, size, data, direction ) {\n\n\tconst chars = Array.from( text );\n\tconst scale = size / data.resolution;\n\tconst line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale;\n\n\tconst paths = [];\n\n\tlet offsetX = 0, offsetY = 0;\n\n\tif ( direction == 'rtl' || direction == 'tb' ) {\n\n\t\tchars.reverse();\n\n\t}\n\n\tfor ( let i = 0; i < chars.length; i ++ ) {\n\n\t\tconst char = chars[ i ];\n\n\t\tif ( char === '\\n' ) {\n\n\t\t\toffsetX = 0;\n\t\t\toffsetY -= line_height;\n\n\t\t} else {\n\n\t\t\tconst ret = createPath( char, scale, offsetX, offsetY, data );\n\n\t\t\tif ( direction == 'tb' ) {\n\n\t\t\t\toffsetX = 0;\n\t\t\t\toffsetY += data.ascender * scale;\n\n\t\t\t} else {\n\n\t\t\t\toffsetX += ret.offsetX;\n\n\t\t\t}\n\n\t\t\tpaths.push( ret.path );\n\n\t\t}\n\n\t}\n\n\treturn paths;\n\n}\n\nfunction createPath( char, scale, offsetX, offsetY, data ) {\n\n\tconst glyph = data.glyphs[ char ] || data.glyphs[ '?' ];\n\n\tif ( ! glyph ) {\n\n\t\tconsole.error( 'THREE.Font: character \"' + char + '\" does not exists in font family ' + data.familyName + '.' );\n\n\t\treturn;\n\n\t}\n\n\tconst path = new ShapePath();\n\n\tlet x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2;\n\n\tif ( glyph.o ) {\n\n\t\tconst outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );\n\n\t\tfor ( let i = 0, l = outline.length; i < l; ) {\n\n\t\t\tconst action = outline[ i ++ ];\n\n\t\t\tswitch ( action ) {\n\n\t\t\t\tcase 'm': // moveTo\n\n\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'l': // lineTo\n\n\t\t\t\t\tx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\ty = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'q': // quadraticCurveTo\n\n\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.quadraticCurveTo( cpx1, cpy1, cpx, cpy );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'b': // bezierCurveTo\n\n\t\t\t\t\tcpx = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx1 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy1 = outline[ i ++ ] * scale + offsetY;\n\t\t\t\t\tcpx2 = outline[ i ++ ] * scale + offsetX;\n\t\t\t\t\tcpy2 = outline[ i ++ ] * scale + offsetY;\n\n\t\t\t\t\tpath.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\treturn { offsetX: glyph.ha * scale, path: path };\n\n}\n\nexport { FontLoader, Font };\n", "import {\n\tBufferGeometry,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tGroup,\n\tLineBasicMaterial,\n\tLineSegments,\n\tLoader\n} from 'three';\n\n/**\n * A loader for the GCode format.\n *\n * GCode files are usually used for 3D printing or CNC applications.\n *\n * ```js\n * const loader = new GCodeLoader();\n * const object = await loader.loadAsync( 'models/gcode/benchy.gcode' );\n * scene.add( object );\n * ```\n *\n * @augments Loader\n * @three_import import { GCodeLoader } from 'three/addons/loaders/GCodeLoader.js';\n */\nclass GCodeLoader extends Loader {\n\n\t/**\n\t * Constructs a new GCode loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * Whether to split layers or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.splitLayer = false;\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded GCode asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Group)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( text ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given GCode data and returns a group with lines.\n\t *\n\t * @param {string} data - The raw Gcode data as a string.\n\t * @return {Group} The parsed GCode asset.\n\t */\n\tparse( data ) {\n\n\t\tlet state = { x: 0, y: 0, z: 0, e: 0, f: 0, extruding: false, relative: false };\n\t\tconst layers = [];\n\n\t\tlet currentLayer = undefined;\n\n\t\tconst pathMaterial = new LineBasicMaterial( { color: 0xFF0000 } );\n\t\tpathMaterial.name = 'path';\n\n\t\tconst extrudingMaterial = new LineBasicMaterial( { color: 0x00FF00 } );\n\t\textrudingMaterial.name = 'extruded';\n\n\t\tfunction newLayer( line ) {\n\n\t\t\tcurrentLayer = { vertex: [], pathVertex: [], z: line.z };\n\t\t\tlayers.push( currentLayer );\n\n\t\t}\n\n\t\t//Create lie segment between p1 and p2\n\t\tfunction addSegment( p1, p2 ) {\n\n\t\t\tif ( currentLayer === undefined ) {\n\n\t\t\t\tnewLayer( p1 );\n\n\t\t\t}\n\n\t\t\tif ( state.extruding ) {\n\n\t\t\t\tcurrentLayer.vertex.push( p1.x, p1.y, p1.z );\n\t\t\t\tcurrentLayer.vertex.push( p2.x, p2.y, p2.z );\n\n\t\t\t} else {\n\n\t\t\t\tcurrentLayer.pathVertex.push( p1.x, p1.y, p1.z );\n\t\t\t\tcurrentLayer.pathVertex.push( p2.x, p2.y, p2.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction delta( v1, v2 ) {\n\n\t\t\treturn state.relative ? v2 : v2 - v1;\n\n\t\t}\n\n\t\tfunction absolute( v1, v2 ) {\n\n\t\t\treturn state.relative ? v1 + v2 : v2;\n\n\t\t}\n\n\t\tconst lines = data.replace( /;.+/g, '' ).split( '\\n' );\n\n\t\tfor ( let i = 0; i < lines.length; i ++ ) {\n\n\t\t\tconst tokens = lines[ i ].split( ' ' );\n\t\t\tconst cmd = tokens[ 0 ].toUpperCase();\n\n\t\t\t//Arguments\n\t\t\tconst args = {};\n\t\t\ttokens.splice( 1 ).forEach( function ( token ) {\n\n\t\t\t\tif ( token[ 0 ] !== undefined ) {\n\n\t\t\t\t\tconst key = token[ 0 ].toLowerCase();\n\t\t\t\t\tconst value = parseFloat( token.substring( 1 ) );\n\t\t\t\t\targs[ key ] = value;\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\t//Process commands\n\t\t\t//G0/G1 \u2013 Linear Movement\n\t\t\tif ( cmd === 'G0' || cmd === 'G1' ) {\n\n\t\t\t\tconst line = {\n\t\t\t\t\tx: args.x !== undefined ? absolute( state.x, args.x ) : state.x,\n\t\t\t\t\ty: args.y !== undefined ? absolute( state.y, args.y ) : state.y,\n\t\t\t\t\tz: args.z !== undefined ? absolute( state.z, args.z ) : state.z,\n\t\t\t\t\te: args.e !== undefined ? absolute( state.e, args.e ) : state.e,\n\t\t\t\t\tf: args.f !== undefined ? absolute( state.f, args.f ) : state.f,\n\t\t\t\t};\n\n\t\t\t\t//Layer change detection is or made by watching Z, it's made by watching when we extrude at a new Z position\n\t\t\t\tif ( delta( state.e, line.e ) > 0 ) {\n\n\t\t\t\t\tstate.extruding = delta( state.e, line.e ) > 0;\n\n\t\t\t\t\tif ( currentLayer == undefined || line.z != currentLayer.z ) {\n\n\t\t\t\t\t\tnewLayer( line );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\taddSegment( state, line );\n\t\t\t\tstate = line;\n\n\t\t\t} else if ( cmd === 'G2' || cmd === 'G3' ) {\n\n\t\t\t\t//G2/G3 - Arc Movement ( G2 clock wise and G3 counter clock wise )\n\t\t\t\t//console.warn( 'THREE.GCodeLoader: Arc command not supported' );\n\n\t\t\t} else if ( cmd === 'G90' ) {\n\n\t\t\t\t//G90: Set to Absolute Positioning\n\t\t\t\tstate.relative = false;\n\n\t\t\t} else if ( cmd === 'G91' ) {\n\n\t\t\t\t//G91: Set to state.relative Positioning\n\t\t\t\tstate.relative = true;\n\n\t\t\t} else if ( cmd === 'G92' ) {\n\n\t\t\t\t//G92: Set Position\n\t\t\t\tconst line = state;\n\t\t\t\tline.x = args.x !== undefined ? args.x : line.x;\n\t\t\t\tline.y = args.y !== undefined ? args.y : line.y;\n\t\t\t\tline.z = args.z !== undefined ? args.z : line.z;\n\t\t\t\tline.e = args.e !== undefined ? args.e : line.e;\n\n\t\t\t} else {\n\n\t\t\t\t//console.warn( 'THREE.GCodeLoader: Command not supported:' + cmd );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction addObject( vertex, extruding, i ) {\n\n\t\t\tconst geometry = new BufferGeometry();\n\t\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertex, 3 ) );\n\t\t\tconst segments = new LineSegments( geometry, extruding ? extrudingMaterial : pathMaterial );\n\t\t\tsegments.name = 'layer' + i;\n\t\t\tobject.add( segments );\n\n\t\t}\n\n\t\tconst object = new Group();\n\t\tobject.name = 'gcode';\n\n\t\tif ( this.splitLayer ) {\n\n\t\t\tfor ( let i = 0; i < layers.length; i ++ ) {\n\n\t\t\t\tconst layer = layers[ i ];\n\t\t\t\taddObject( layer.vertex, true, i );\n\t\t\t\taddObject( layer.pathVertex, false, i );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst vertex = [],\n\t\t\t\tpathVertex = [];\n\n\t\t\tfor ( let i = 0; i < layers.length; i ++ ) {\n\n\t\t\t\tconst layer = layers[ i ];\n\t\t\t\tconst layerVertex = layer.vertex;\n\t\t\t\tconst layerPathVertex = layer.pathVertex;\n\n\t\t\t\tfor ( let j = 0; j < layerVertex.length; j ++ ) {\n\n\t\t\t\t\tvertex.push( layerVertex[ j ] );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let j = 0; j < layerPathVertex.length; j ++ ) {\n\n\t\t\t\t\tpathVertex.push( layerPathVertex[ j ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\taddObject( vertex, true, layers.length );\n\t\t\taddObject( pathVertex, false, layers.length );\n\n\t\t}\n\n\t\tobject.rotation.set( - Math.PI / 2, 0, 0 );\n\n\t\treturn object;\n\n\t}\n\n}\n\nexport { GCodeLoader };\n", "import {\n\tAnimationClip,\n\tBone,\n\tBox3,\n\tBufferAttribute,\n\tBufferGeometry,\n\tClampToEdgeWrapping,\n\tColor,\n\tColorManagement,\n\tDirectionalLight,\n\tDoubleSide,\n\tFileLoader,\n\tFrontSide,\n\tGroup,\n\tImageBitmapLoader,\n\tInstancedMesh,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tInterpolant,\n\tInterpolateDiscrete,\n\tInterpolateLinear,\n\tLine,\n\tLineBasicMaterial,\n\tLineLoop,\n\tLineSegments,\n\tLinearFilter,\n\tLinearMipmapLinearFilter,\n\tLinearMipmapNearestFilter,\n\tLinearSRGBColorSpace,\n\tLoader,\n\tLoaderUtils,\n\tMaterial,\n\tMathUtils,\n\tMatrix4,\n\tMesh,\n\tMeshBasicMaterial,\n\tMeshPhysicalMaterial,\n\tMeshStandardMaterial,\n\tMirroredRepeatWrapping,\n\tNearestFilter,\n\tNearestMipmapLinearFilter,\n\tNearestMipmapNearestFilter,\n\tNumberKeyframeTrack,\n\tObject3D,\n\tOrthographicCamera,\n\tPerspectiveCamera,\n\tPointLight,\n\tPoints,\n\tPointsMaterial,\n\tPropertyBinding,\n\tQuaternion,\n\tQuaternionKeyframeTrack,\n\tRepeatWrapping,\n\tSkeleton,\n\tSkinnedMesh,\n\tSphere,\n\tSpotLight,\n\tTexture,\n\tTextureLoader,\n\tTriangleFanDrawMode,\n\tTriangleStripDrawMode,\n\tVector2,\n\tVector3,\n\tVectorKeyframeTrack,\n\tSRGBColorSpace,\n\tInstancedBufferAttribute\n} from 'three';\nimport { toTrianglesDrawMode } from '../utils/BufferGeometryUtils.js';\n\n/**\n * A loader for the glTF 2.0 format.\n *\n * [glTF](https://www.khronos.org/gltf/} (GL Transmission Format) is an [open format specification]{@link https://github.com/KhronosGroup/glTF/tree/main/specification/2.0)\n * for efficient delivery and loading of 3D content. Assets may be provided either in JSON (.gltf) or binary (.glb)\n * format. External files store textures (.jpg, .png) and additional binary data (.bin). A glTF asset may deliver\n * one or more scenes, including meshes, materials, textures, skins, skeletons, morph targets, animations, lights,\n * and/or cameras.\n *\n * `GLTFLoader` uses {@link ImageBitmapLoader} whenever possible. Be advised that image bitmaps are not\n * automatically GC-collected when they are no longer referenced, and they require special handling during\n * the disposal process.\n *\n * `GLTFLoader` supports the following glTF 2.0 extensions:\n * - KHR_draco_mesh_compression\n * - KHR_materials_clearcoat\n * - KHR_materials_dispersion\n * - KHR_materials_ior\n * - KHR_materials_specular\n * - KHR_materials_transmission\n * - KHR_materials_iridescence\n * - KHR_materials_unlit\n * - KHR_materials_volume\n * - KHR_mesh_quantization\n * - KHR_lights_punctual\n * - KHR_texture_basisu\n * - KHR_texture_transform\n * - EXT_texture_webp\n * - EXT_meshopt_compression\n * - EXT_mesh_gpu_instancing\n *\n * The following glTF 2.0 extension is supported by an external user plugin:\n * - [KHR_materials_variants](https://github.com/takahirox/three-gltf-extensions)\n * - [MSFT_texture_dds](https://github.com/takahirox/three-gltf-extensions)\n * - [KHR_animation_pointer](https://github.com/needle-tools/three-animation-pointer)\n * - [NEEDLE_progressive](https://github.com/needle-tools/gltf-progressive)\n *\n * ```js\n * const loader = new GLTFLoader();\n *\n * // Optional: Provide a DRACOLoader instance to decode compressed mesh data\n * const dracoLoader = new DRACOLoader();\n * dracoLoader.setDecoderPath( '/examples/jsm/libs/draco/' );\n * loader.setDRACOLoader( dracoLoader );\n *\n * const gltf = await loader.loadAsync( 'models/gltf/duck/duck.gltf' );\n * scene.add( gltf.scene );\n * ```\n *\n * @augments Loader\n * @three_import import { GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';\n */\nclass GLTFLoader extends Loader {\n\n\t/**\n\t * Constructs a new glTF loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.dracoLoader = null;\n\t\tthis.ktx2Loader = null;\n\t\tthis.meshoptDecoder = null;\n\n\t\tthis.pluginCallbacks = [];\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsClearcoatExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsDispersionExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureBasisUExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureWebPExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFTextureAVIFExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsSheenExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsTransmissionExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsVolumeExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsIorExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsEmissiveStrengthExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsSpecularExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsIridescenceExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsAnisotropyExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMaterialsBumpExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFLightsExtension( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMeshoptCompression( parser );\n\n\t\t} );\n\n\t\tthis.register( function ( parser ) {\n\n\t\t\treturn new GLTFMeshGpuInstancing( parser );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded glTF asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(GLTFLoader~LoadObject)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tlet resourcePath;\n\n\t\tif ( this.resourcePath !== '' ) {\n\n\t\t\tresourcePath = this.resourcePath;\n\n\t\t} else if ( this.path !== '' ) {\n\n\t\t\t// If a base path is set, resources will be relative paths from that plus the relative path of the gltf file\n\t\t\t// Example  path = 'https://my-cnd-server.com/', url = 'assets/models/model.gltf'\n\t\t\t// resourcePath = 'https://my-cnd-server.com/assets/models/'\n\t\t\t// referenced resource 'model.bin' will be loaded from 'https://my-cnd-server.com/assets/models/model.bin'\n\t\t\t// referenced resource '../textures/texture.png' will be loaded from 'https://my-cnd-server.com/assets/textures/texture.png'\n\t\t\tconst relativeUrl = LoaderUtils.extractUrlBase( url );\n\t\t\tresourcePath = LoaderUtils.resolveURL( relativeUrl, this.path );\n\n\t\t} else {\n\n\t\t\tresourcePath = LoaderUtils.extractUrlBase( url );\n\n\t\t}\n\n\t\t// Tells the LoadingManager to track an extra item, which resolves after\n\t\t// the model is fully loaded. This means the count of items loaded will\n\t\t// be incorrect, but ensures manager.onLoad() does not fire early.\n\t\tthis.manager.itemStart( url );\n\n\t\tconst _onError = function ( e ) {\n\n\t\t\tif ( onError ) {\n\n\t\t\t\tonError( e );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.error( e );\n\n\t\t\t}\n\n\t\t\tscope.manager.itemError( url );\n\t\t\tscope.manager.itemEnd( url );\n\n\t\t};\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, function ( data ) {\n\n\t\t\ttry {\n\n\t\t\t\tscope.parse( data, resourcePath, function ( gltf ) {\n\n\t\t\t\t\tonLoad( gltf );\n\n\t\t\t\t\tscope.manager.itemEnd( url );\n\n\t\t\t\t}, _onError );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\t_onError( e );\n\n\t\t\t}\n\n\t\t}, onProgress, _onError );\n\n\t}\n\n\t/**\n\t * Sets the given Draco loader to this loader. Required for decoding assets\n\t * compressed with the `KHR_draco_mesh_compression` extension.\n\t *\n\t * @param {DRACOLoader} dracoLoader - The Draco loader to set.\n\t * @return {GLTFLoader} A reference to this loader.\n\t */\n\tsetDRACOLoader( dracoLoader ) {\n\n\t\tthis.dracoLoader = dracoLoader;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given KTX2 loader to this loader. Required for loading KTX2\n\t * compressed textures.\n\t *\n\t * @param {KTX2Loader} ktx2Loader - The KTX2 loader to set.\n\t * @return {GLTFLoader} A reference to this loader.\n\t */\n\tsetKTX2Loader( ktx2Loader ) {\n\n\t\tthis.ktx2Loader = ktx2Loader;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the given meshopt decoder. Required for decoding assets\n\t * compressed with the `EXT_meshopt_compression` extension.\n\t *\n\t * @param {Object} meshoptDecoder - The meshopt decoder to set.\n\t * @return {GLTFLoader} A reference to this loader.\n\t */\n\tsetMeshoptDecoder( meshoptDecoder ) {\n\n\t\tthis.meshoptDecoder = meshoptDecoder;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Registers a plugin callback. This API is internally used to implement the various\n\t * glTF extensions but can also used by third-party code to add additional logic\n\t * to the loader.\n\t *\n\t * @param {function(parser:GLTFParser)} callback - The callback function to register.\n\t * @return {GLTFLoader} A reference to this loader.\n\t */\n\tregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) === - 1 ) {\n\n\t\t\tthis.pluginCallbacks.push( callback );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Unregisters a plugin callback.\n\t *\n\t * @param {Function} callback - The callback function to unregister.\n\t * @return {GLTFLoader} A reference to this loader.\n\t */\n\tunregister( callback ) {\n\n\t\tif ( this.pluginCallbacks.indexOf( callback ) !== - 1 ) {\n\n\t\t\tthis.pluginCallbacks.splice( this.pluginCallbacks.indexOf( callback ), 1 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Parses the given FBX data and returns the resulting group.\n\t *\n\t * @param {string|ArrayBuffer} data - The raw glTF data.\n\t * @param {string} path - The URL base path.\n\t * @param {function(GLTFLoader~LoadObject)} onLoad - Executed when the loading process has been finished.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tparse( data, path, onLoad, onError ) {\n\n\t\tlet json;\n\t\tconst extensions = {};\n\t\tconst plugins = {};\n\t\tconst textDecoder = new TextDecoder();\n\n\t\tif ( typeof data === 'string' ) {\n\n\t\t\tjson = JSON.parse( data );\n\n\t\t} else if ( data instanceof ArrayBuffer ) {\n\n\t\t\tconst magic = textDecoder.decode( new Uint8Array( data, 0, 4 ) );\n\n\t\t\tif ( magic === BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\t\ttry {\n\n\t\t\t\t\textensions[ EXTENSIONS.KHR_BINARY_GLTF ] = new GLTFBinaryExtension( data );\n\n\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\tif ( onError ) onError( error );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tjson = JSON.parse( extensions[ EXTENSIONS.KHR_BINARY_GLTF ].content );\n\n\t\t\t} else {\n\n\t\t\t\tjson = JSON.parse( textDecoder.decode( data ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tjson = data;\n\n\t\t}\n\n\t\tif ( json.asset === undefined || json.asset.version[ 0 ] < 2 ) {\n\n\t\t\tif ( onError ) onError( new Error( 'THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.' ) );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst parser = new GLTFParser( json, {\n\n\t\t\tpath: path || this.resourcePath || '',\n\t\t\tcrossOrigin: this.crossOrigin,\n\t\t\trequestHeader: this.requestHeader,\n\t\t\tmanager: this.manager,\n\t\t\tktx2Loader: this.ktx2Loader,\n\t\t\tmeshoptDecoder: this.meshoptDecoder\n\n\t\t} );\n\n\t\tparser.fileLoader.setRequestHeader( this.requestHeader );\n\n\t\tfor ( let i = 0; i < this.pluginCallbacks.length; i ++ ) {\n\n\t\t\tconst plugin = this.pluginCallbacks[ i ]( parser );\n\n\t\t\tif ( ! plugin.name ) console.error( 'THREE.GLTFLoader: Invalid plugin found: missing name' );\n\n\t\t\tplugins[ plugin.name ] = plugin;\n\n\t\t\t// Workaround to avoid determining as unknown extension\n\t\t\t// in addUnknownExtensionsToUserData().\n\t\t\t// Remove this workaround if we move all the existing\n\t\t\t// extension handlers to plugin system\n\t\t\textensions[ plugin.name ] = true;\n\n\t\t}\n\n\t\tif ( json.extensionsUsed ) {\n\n\t\t\tfor ( let i = 0; i < json.extensionsUsed.length; ++ i ) {\n\n\t\t\t\tconst extensionName = json.extensionsUsed[ i ];\n\t\t\t\tconst extensionsRequired = json.extensionsRequired || [];\n\n\t\t\t\tswitch ( extensionName ) {\n\n\t\t\t\t\tcase EXTENSIONS.KHR_MATERIALS_UNLIT:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFMaterialsUnlitExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_DRACO_MESH_COMPRESSION:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFDracoMeshCompressionExtension( json, this.dracoLoader );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_TEXTURE_TRANSFORM:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFTextureTransformExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase EXTENSIONS.KHR_MESH_QUANTIZATION:\n\t\t\t\t\t\textensions[ extensionName ] = new GLTFMeshQuantizationExtension();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tif ( extensionsRequired.indexOf( extensionName ) >= 0 && plugins[ extensionName ] === undefined ) {\n\n\t\t\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Unknown extension \"' + extensionName + '\".' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tparser.setExtensions( extensions );\n\t\tparser.setPlugins( plugins );\n\t\tparser.parse( onLoad, onError );\n\n\t}\n\n\t/**\n\t * Async version of {@link GLTFLoader#parse}.\n\t *\n\t * @async\n\t * @param {string|ArrayBuffer} data - The raw glTF data.\n\t * @param {string} path - The URL base path.\n\t * @return {Promise<GLTFLoader~LoadObject>} A Promise that resolves with the loaded glTF when the parsing has been finished.\n\t */\n\tparseAsync( data, path ) {\n\n\t\tconst scope = this;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tscope.parse( data, path, resolve, reject );\n\n\t\t} );\n\n\t}\n\n}\n\n/* GLTFREGISTRY */\n\nfunction GLTFRegistry() {\n\n\tlet objects = {};\n\n\treturn\t{\n\n\t\tget: function ( key ) {\n\n\t\t\treturn objects[ key ];\n\n\t\t},\n\n\t\tadd: function ( key, object ) {\n\n\t\t\tobjects[ key ] = object;\n\n\t\t},\n\n\t\tremove: function ( key ) {\n\n\t\t\tdelete objects[ key ];\n\n\t\t},\n\n\t\tremoveAll: function () {\n\n\t\t\tobjects = {};\n\n\t\t}\n\n\t};\n\n}\n\n/*********************************/\n/********** EXTENSIONS ***********/\n/*********************************/\n\nconst EXTENSIONS = {\n\tKHR_BINARY_GLTF: 'KHR_binary_glTF',\n\tKHR_DRACO_MESH_COMPRESSION: 'KHR_draco_mesh_compression',\n\tKHR_LIGHTS_PUNCTUAL: 'KHR_lights_punctual',\n\tKHR_MATERIALS_CLEARCOAT: 'KHR_materials_clearcoat',\n\tKHR_MATERIALS_DISPERSION: 'KHR_materials_dispersion',\n\tKHR_MATERIALS_IOR: 'KHR_materials_ior',\n\tKHR_MATERIALS_SHEEN: 'KHR_materials_sheen',\n\tKHR_MATERIALS_SPECULAR: 'KHR_materials_specular',\n\tKHR_MATERIALS_TRANSMISSION: 'KHR_materials_transmission',\n\tKHR_MATERIALS_IRIDESCENCE: 'KHR_materials_iridescence',\n\tKHR_MATERIALS_ANISOTROPY: 'KHR_materials_anisotropy',\n\tKHR_MATERIALS_UNLIT: 'KHR_materials_unlit',\n\tKHR_MATERIALS_VOLUME: 'KHR_materials_volume',\n\tKHR_TEXTURE_BASISU: 'KHR_texture_basisu',\n\tKHR_TEXTURE_TRANSFORM: 'KHR_texture_transform',\n\tKHR_MESH_QUANTIZATION: 'KHR_mesh_quantization',\n\tKHR_MATERIALS_EMISSIVE_STRENGTH: 'KHR_materials_emissive_strength',\n\tEXT_MATERIALS_BUMP: 'EXT_materials_bump',\n\tEXT_TEXTURE_WEBP: 'EXT_texture_webp',\n\tEXT_TEXTURE_AVIF: 'EXT_texture_avif',\n\tEXT_MESHOPT_COMPRESSION: 'EXT_meshopt_compression',\n\tEXT_MESH_GPU_INSTANCING: 'EXT_mesh_gpu_instancing'\n};\n\n/**\n * Punctual Lights Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_lights_punctual\n *\n * @private\n */\nclass GLTFLightsExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_LIGHTS_PUNCTUAL;\n\n\t\t// Object3D instance caches\n\t\tthis.cache = { refs: {}, uses: {} };\n\n\t}\n\n\t_markDefs() {\n\n\t\tconst parser = this.parser;\n\t\tconst nodeDefs = this.parser.json.nodes || [];\n\n\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.extensions\n\t\t\t\t\t&& nodeDef.extensions[ this.name ]\n\t\t\t\t\t&& nodeDef.extensions[ this.name ].light !== undefined ) {\n\n\t\t\t\tparser._addNodeRef( this.cache, nodeDef.extensions[ this.name ].light );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_loadLight( lightIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst cacheKey = 'light:' + lightIndex;\n\t\tlet dependency = parser.cache.get( cacheKey );\n\n\t\tif ( dependency ) return dependency;\n\n\t\tconst json = parser.json;\n\t\tconst extensions = ( json.extensions && json.extensions[ this.name ] ) || {};\n\t\tconst lightDefs = extensions.lights || [];\n\t\tconst lightDef = lightDefs[ lightIndex ];\n\t\tlet lightNode;\n\n\t\tconst color = new Color( 0xffffff );\n\n\t\tif ( lightDef.color !== undefined ) color.setRGB( lightDef.color[ 0 ], lightDef.color[ 1 ], lightDef.color[ 2 ], LinearSRGBColorSpace );\n\n\t\tconst range = lightDef.range !== undefined ? lightDef.range : 0;\n\n\t\tswitch ( lightDef.type ) {\n\n\t\t\tcase 'directional':\n\t\t\t\tlightNode = new DirectionalLight( color );\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tcase 'point':\n\t\t\t\tlightNode = new PointLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\tbreak;\n\n\t\t\tcase 'spot':\n\t\t\t\tlightNode = new SpotLight( color );\n\t\t\t\tlightNode.distance = range;\n\t\t\t\t// Handle spotlight properties.\n\t\t\t\tlightDef.spot = lightDef.spot || {};\n\t\t\t\tlightDef.spot.innerConeAngle = lightDef.spot.innerConeAngle !== undefined ? lightDef.spot.innerConeAngle : 0;\n\t\t\t\tlightDef.spot.outerConeAngle = lightDef.spot.outerConeAngle !== undefined ? lightDef.spot.outerConeAngle : Math.PI / 4.0;\n\t\t\t\tlightNode.angle = lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.penumbra = 1.0 - lightDef.spot.innerConeAngle / lightDef.spot.outerConeAngle;\n\t\t\t\tlightNode.target.position.set( 0, 0, - 1 );\n\t\t\t\tlightNode.add( lightNode.target );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Unexpected light type: ' + lightDef.type );\n\n\t\t}\n\n\t\t// Some lights (e.g. spot) default to a position other than the origin. Reset the position\n\t\t// here, because node-level parsing will only override position if explicitly specified.\n\t\tlightNode.position.set( 0, 0, 0 );\n\n\t\tassignExtrasToUserData( lightNode, lightDef );\n\n\t\tif ( lightDef.intensity !== undefined ) lightNode.intensity = lightDef.intensity;\n\n\t\tlightNode.name = parser.createUniqueName( lightDef.name || ( 'light_' + lightIndex ) );\n\n\t\tdependency = Promise.resolve( lightNode );\n\n\t\tparser.cache.add( cacheKey, dependency );\n\n\t\treturn dependency;\n\n\t}\n\n\tgetDependency( type, index ) {\n\n\t\tif ( type !== 'light' ) return;\n\n\t\treturn this._loadLight( index );\n\n\t}\n\n\tcreateNodeAttachment( nodeIndex ) {\n\n\t\tconst self = this;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\t\tconst lightDef = ( nodeDef.extensions && nodeDef.extensions[ this.name ] ) || {};\n\t\tconst lightIndex = lightDef.light;\n\n\t\tif ( lightIndex === undefined ) return null;\n\n\t\treturn this._loadLight( lightIndex ).then( function ( light ) {\n\n\t\t\treturn parser._getNodeRef( self.cache, lightIndex, light );\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * Unlit Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_unlit\n *\n * @private\n */\nclass GLTFMaterialsUnlitExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_UNLIT;\n\n\t}\n\n\tgetMaterialType() {\n\n\t\treturn MeshBasicMaterial;\n\n\t}\n\n\textendParams( materialParams, materialDef, parser ) {\n\n\t\tconst pending = [];\n\n\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\tmaterialParams.opacity = 1.0;\n\n\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness;\n\n\t\tif ( metallicRoughness ) {\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.setRGB( array[ 0 ], array[ 1 ], array[ 2 ], LinearSRGBColorSpace );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, SRGBColorSpace ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials Emissive Strength Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/blob/5768b3ce0ef32bc39cdf1bef10b948586635ead3/extensions/2.0/Khronos/KHR_materials_emissive_strength/README.md\n *\n * @private\n */\nclass GLTFMaterialsEmissiveStrengthExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_EMISSIVE_STRENGTH;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst emissiveStrength = materialDef.extensions[ this.name ].emissiveStrength;\n\n\t\tif ( emissiveStrength !== undefined ) {\n\n\t\t\tmaterialParams.emissiveIntensity = emissiveStrength;\n\n\t\t}\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Clearcoat Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_clearcoat\n *\n * @private\n */\nclass GLTFMaterialsClearcoatExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_CLEARCOAT;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.clearcoatFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoat = extension.clearcoatFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatMap', extension.clearcoatTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessFactor !== undefined ) {\n\n\t\t\tmaterialParams.clearcoatRoughness = extension.clearcoatRoughnessFactor;\n\n\t\t}\n\n\t\tif ( extension.clearcoatRoughnessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatRoughnessMap', extension.clearcoatRoughnessTexture ) );\n\n\t\t}\n\n\t\tif ( extension.clearcoatNormalTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'clearcoatNormalMap', extension.clearcoatNormalTexture ) );\n\n\t\t\tif ( extension.clearcoatNormalTexture.scale !== undefined ) {\n\n\t\t\t\tconst scale = extension.clearcoatNormalTexture.scale;\n\n\t\t\t\tmaterialParams.clearcoatNormalScale = new Vector2( scale, scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials dispersion Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_dispersion\n *\n * @private\n */\nclass GLTFMaterialsDispersionExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_DISPERSION;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.dispersion = extension.dispersion !== undefined ? extension.dispersion : 0;\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Iridescence Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_iridescence\n *\n * @private\n */\nclass GLTFMaterialsIridescenceExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_IRIDESCENCE;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.iridescenceFactor !== undefined ) {\n\n\t\t\tmaterialParams.iridescence = extension.iridescenceFactor;\n\n\t\t}\n\n\t\tif ( extension.iridescenceTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'iridescenceMap', extension.iridescenceTexture ) );\n\n\t\t}\n\n\t\tif ( extension.iridescenceIor !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceIOR = extension.iridescenceIor;\n\n\t\t}\n\n\t\tif ( materialParams.iridescenceThicknessRange === undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange = [ 100, 400 ];\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessMinimum !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange[ 0 ] = extension.iridescenceThicknessMinimum;\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessMaximum !== undefined ) {\n\n\t\t\tmaterialParams.iridescenceThicknessRange[ 1 ] = extension.iridescenceThicknessMaximum;\n\n\t\t}\n\n\t\tif ( extension.iridescenceThicknessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'iridescenceThicknessMap', extension.iridescenceThicknessTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Sheen Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/main/extensions/2.0/Khronos/KHR_materials_sheen\n *\n * @private\n */\nclass GLTFMaterialsSheenExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SHEEN;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tmaterialParams.sheenColor = new Color( 0, 0, 0 );\n\t\tmaterialParams.sheenRoughness = 0;\n\t\tmaterialParams.sheen = 1;\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.sheenColorFactor !== undefined ) {\n\n\t\t\tconst colorFactor = extension.sheenColorFactor;\n\t\t\tmaterialParams.sheenColor.setRGB( colorFactor[ 0 ], colorFactor[ 1 ], colorFactor[ 2 ], LinearSRGBColorSpace );\n\n\t\t}\n\n\t\tif ( extension.sheenRoughnessFactor !== undefined ) {\n\n\t\t\tmaterialParams.sheenRoughness = extension.sheenRoughnessFactor;\n\n\t\t}\n\n\t\tif ( extension.sheenColorTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'sheenColorMap', extension.sheenColorTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\tif ( extension.sheenRoughnessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'sheenRoughnessMap', extension.sheenRoughnessTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Transmission Materials Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_transmission\n * Draft: https://github.com/KhronosGroup/glTF/pull/1698\n *\n * @private\n */\nclass GLTFMaterialsTransmissionExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_TRANSMISSION;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.transmissionFactor !== undefined ) {\n\n\t\t\tmaterialParams.transmission = extension.transmissionFactor;\n\n\t\t}\n\n\t\tif ( extension.transmissionTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'transmissionMap', extension.transmissionTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials Volume Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_volume\n *\n * @private\n */\nclass GLTFMaterialsVolumeExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_VOLUME;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.thickness = extension.thicknessFactor !== undefined ? extension.thicknessFactor : 0;\n\n\t\tif ( extension.thicknessTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'thicknessMap', extension.thicknessTexture ) );\n\n\t\t}\n\n\t\tmaterialParams.attenuationDistance = extension.attenuationDistance || Infinity;\n\n\t\tconst colorArray = extension.attenuationColor || [ 1, 1, 1 ];\n\t\tmaterialParams.attenuationColor = new Color().setRGB( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ], LinearSRGBColorSpace );\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials ior Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_ior\n *\n * @private\n */\nclass GLTFMaterialsIorExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_IOR;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.ior = extension.ior !== undefined ? extension.ior : 1.5;\n\n\t\treturn Promise.resolve();\n\n\t}\n\n}\n\n/**\n * Materials specular Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_specular\n *\n * @private\n */\nclass GLTFMaterialsSpecularExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_SPECULAR;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.specularIntensity = extension.specularFactor !== undefined ? extension.specularFactor : 1.0;\n\n\t\tif ( extension.specularTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'specularIntensityMap', extension.specularTexture ) );\n\n\t\t}\n\n\t\tconst colorArray = extension.specularColorFactor || [ 1, 1, 1 ];\n\t\tmaterialParams.specularColor = new Color().setRGB( colorArray[ 0 ], colorArray[ 1 ], colorArray[ 2 ], LinearSRGBColorSpace );\n\n\t\tif ( extension.specularColorTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'specularColorMap', extension.specularColorTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n\n/**\n * Materials bump Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/EXT_materials_bump\n *\n * @private\n */\nclass GLTFMaterialsBumpExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_MATERIALS_BUMP;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tmaterialParams.bumpScale = extension.bumpFactor !== undefined ? extension.bumpFactor : 1.0;\n\n\t\tif ( extension.bumpTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'bumpMap', extension.bumpTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * Materials anisotropy Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_materials_anisotropy\n *\n * @private\n */\nclass GLTFMaterialsAnisotropyExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_MATERIALS_ANISOTROPY;\n\n\t}\n\n\tgetMaterialType( materialIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) return null;\n\n\t\treturn MeshPhysicalMaterial;\n\n\t}\n\n\textendMaterialParams( materialIndex, materialParams ) {\n\n\t\tconst parser = this.parser;\n\t\tconst materialDef = parser.json.materials[ materialIndex ];\n\n\t\tif ( ! materialDef.extensions || ! materialDef.extensions[ this.name ] ) {\n\n\t\t\treturn Promise.resolve();\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tconst extension = materialDef.extensions[ this.name ];\n\n\t\tif ( extension.anisotropyStrength !== undefined ) {\n\n\t\t\tmaterialParams.anisotropy = extension.anisotropyStrength;\n\n\t\t}\n\n\t\tif ( extension.anisotropyRotation !== undefined ) {\n\n\t\t\tmaterialParams.anisotropyRotation = extension.anisotropyRotation;\n\n\t\t}\n\n\t\tif ( extension.anisotropyTexture !== undefined ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'anisotropyMap', extension.anisotropyTexture ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n}\n\n/**\n * BasisU Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_basisu\n *\n * @private\n */\nclass GLTFTextureBasisUExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_BASISU;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ this.name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ this.name ];\n\t\tconst loader = parser.options.ktx2Loader;\n\n\t\tif ( ! loader ) {\n\n\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures' );\n\n\t\t\t} else {\n\n\t\t\t\t// Assumes that the extension is optional and that a fallback texture is present\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t}\n\n}\n\n/**\n * WebP Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_webp\n *\n * @private\n */\nclass GLTFTextureWebPExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_TEXTURE_WEBP;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst name = this.name;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ name ];\n\t\tconst source = json.images[ extension.source ];\n\n\t\tlet loader = parser.textureLoader;\n\t\tif ( source.uri ) {\n\n\t\t\tconst handler = parser.options.manager.getHandler( source.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t}\n\n}\n\n/**\n * AVIF Texture Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_texture_avif\n *\n * @private\n */\nclass GLTFTextureAVIFExtension {\n\n\tconstructor( parser ) {\n\n\t\tthis.parser = parser;\n\t\tthis.name = EXTENSIONS.EXT_TEXTURE_AVIF;\n\n\t}\n\n\tloadTexture( textureIndex ) {\n\n\t\tconst name = this.name;\n\t\tconst parser = this.parser;\n\t\tconst json = parser.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\n\t\tif ( ! textureDef.extensions || ! textureDef.extensions[ name ] ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst extension = textureDef.extensions[ name ];\n\t\tconst source = json.images[ extension.source ];\n\n\t\tlet loader = parser.textureLoader;\n\t\tif ( source.uri ) {\n\n\t\t\tconst handler = parser.options.manager.getHandler( source.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn parser.loadTextureImage( textureIndex, extension.source, loader );\n\n\t}\n\n}\n\n/**\n * meshopt BufferView Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_meshopt_compression\n *\n * @private\n */\nclass GLTFMeshoptCompression {\n\n\tconstructor( parser ) {\n\n\t\tthis.name = EXTENSIONS.EXT_MESHOPT_COMPRESSION;\n\t\tthis.parser = parser;\n\n\t}\n\n\tloadBufferView( index ) {\n\n\t\tconst json = this.parser.json;\n\t\tconst bufferView = json.bufferViews[ index ];\n\n\t\tif ( bufferView.extensions && bufferView.extensions[ this.name ] ) {\n\n\t\t\tconst extensionDef = bufferView.extensions[ this.name ];\n\n\t\t\tconst buffer = this.parser.getDependency( 'buffer', extensionDef.buffer );\n\t\t\tconst decoder = this.parser.options.meshoptDecoder;\n\n\t\t\tif ( ! decoder || ! decoder.supported ) {\n\n\t\t\t\tif ( json.extensionsRequired && json.extensionsRequired.indexOf( this.name ) >= 0 ) {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Assumes that the extension is optional and that fallback buffer data is present\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn buffer.then( function ( res ) {\n\n\t\t\t\tconst byteOffset = extensionDef.byteOffset || 0;\n\t\t\t\tconst byteLength = extensionDef.byteLength || 0;\n\n\t\t\t\tconst count = extensionDef.count;\n\t\t\t\tconst stride = extensionDef.byteStride;\n\n\t\t\t\tconst source = new Uint8Array( res, byteOffset, byteLength );\n\n\t\t\t\tif ( decoder.decodeGltfBufferAsync ) {\n\n\t\t\t\t\treturn decoder.decodeGltfBufferAsync( count, stride, source, extensionDef.mode, extensionDef.filter ).then( function ( res ) {\n\n\t\t\t\t\t\treturn res.buffer;\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Support for MeshoptDecoder 0.18 or earlier, without decodeGltfBufferAsync\n\t\t\t\t\treturn decoder.ready.then( function () {\n\n\t\t\t\t\t\tconst result = new ArrayBuffer( count * stride );\n\t\t\t\t\t\tdecoder.decodeGltfBuffer( new Uint8Array( result ), count, stride, source, extensionDef.mode, extensionDef.filter );\n\t\t\t\t\t\treturn result;\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * GPU Instancing Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Vendor/EXT_mesh_gpu_instancing\n *\n * @private\n */\nclass GLTFMeshGpuInstancing {\n\n\tconstructor( parser ) {\n\n\t\tthis.name = EXTENSIONS.EXT_MESH_GPU_INSTANCING;\n\t\tthis.parser = parser;\n\n\t}\n\n\tcreateNodeMesh( nodeIndex ) {\n\n\t\tconst json = this.parser.json;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tif ( ! nodeDef.extensions || ! nodeDef.extensions[ this.name ] ||\n\t\t\tnodeDef.mesh === undefined ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst meshDef = json.meshes[ nodeDef.mesh ];\n\n\t\t// No Points or Lines + Instancing support yet\n\n\t\tfor ( const primitive of meshDef.primitives ) {\n\n\t\t\tif ( primitive.mode !== WEBGL_CONSTANTS.TRIANGLES &&\n\t\t\t\t primitive.mode !== WEBGL_CONSTANTS.TRIANGLE_STRIP &&\n\t\t\t\t primitive.mode !== WEBGL_CONSTANTS.TRIANGLE_FAN &&\n\t\t\t\t primitive.mode !== undefined ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst extensionDef = nodeDef.extensions[ this.name ];\n\t\tconst attributesDef = extensionDef.attributes;\n\n\t\t// @TODO: Can we support InstancedMesh + SkinnedMesh?\n\n\t\tconst pending = [];\n\t\tconst attributes = {};\n\n\t\tfor ( const key in attributesDef ) {\n\n\t\t\tpending.push( this.parser.getDependency( 'accessor', attributesDef[ key ] ).then( accessor => {\n\n\t\t\t\tattributes[ key ] = accessor;\n\t\t\t\treturn attributes[ key ];\n\n\t\t\t} ) );\n\n\t\t}\n\n\t\tif ( pending.length < 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tpending.push( this.parser.createNodeMesh( nodeIndex ) );\n\n\t\treturn Promise.all( pending ).then( results => {\n\n\t\t\tconst nodeObject = results.pop();\n\t\t\tconst meshes = nodeObject.isGroup ? nodeObject.children : [ nodeObject ];\n\t\t\tconst count = results[ 0 ].count; // All attribute counts should be same\n\t\t\tconst instancedMeshes = [];\n\n\t\t\tfor ( const mesh of meshes ) {\n\n\t\t\t\t// Temporal variables\n\t\t\t\tconst m = new Matrix4();\n\t\t\t\tconst p = new Vector3();\n\t\t\t\tconst q = new Quaternion();\n\t\t\t\tconst s = new Vector3( 1, 1, 1 );\n\n\t\t\t\tconst instancedMesh = new InstancedMesh( mesh.geometry, mesh.material, count );\n\n\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\tif ( attributes.TRANSLATION ) {\n\n\t\t\t\t\t\tp.fromBufferAttribute( attributes.TRANSLATION, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attributes.ROTATION ) {\n\n\t\t\t\t\t\tq.fromBufferAttribute( attributes.ROTATION, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attributes.SCALE ) {\n\n\t\t\t\t\t\ts.fromBufferAttribute( attributes.SCALE, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tinstancedMesh.setMatrixAt( i, m.compose( p, q, s ) );\n\n\t\t\t\t}\n\n\t\t\t\t// Add instance attributes to the geometry, excluding TRS.\n\t\t\t\tfor ( const attributeName in attributes ) {\n\n\t\t\t\t\tif ( attributeName === '_COLOR_0' ) {\n\n\t\t\t\t\t\tconst attr = attributes[ attributeName ];\n\t\t\t\t\t\tinstancedMesh.instanceColor = new InstancedBufferAttribute( attr.array, attr.itemSize, attr.normalized );\n\n\t\t\t\t\t} else if ( attributeName !== 'TRANSLATION' &&\n\t\t\t\t\t\t attributeName !== 'ROTATION' &&\n\t\t\t\t\t\t attributeName !== 'SCALE' ) {\n\n\t\t\t\t\t\tmesh.geometry.setAttribute( attributeName, attributes[ attributeName ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Just in case\n\t\t\t\tObject3D.prototype.copy.call( instancedMesh, mesh );\n\n\t\t\t\tthis.parser.assignFinalMaterial( instancedMesh );\n\n\t\t\t\tinstancedMeshes.push( instancedMesh );\n\n\t\t\t}\n\n\t\t\tif ( nodeObject.isGroup ) {\n\n\t\t\t\tnodeObject.clear();\n\n\t\t\t\tnodeObject.add( ... instancedMeshes );\n\n\t\t\t\treturn nodeObject;\n\n\t\t\t}\n\n\t\t\treturn instancedMeshes[ 0 ];\n\n\t\t} );\n\n\t}\n\n}\n\n/* BINARY EXTENSION */\nconst BINARY_EXTENSION_HEADER_MAGIC = 'glTF';\nconst BINARY_EXTENSION_HEADER_LENGTH = 12;\nconst BINARY_EXTENSION_CHUNK_TYPES = { JSON: 0x4E4F534A, BIN: 0x004E4942 };\n\nclass GLTFBinaryExtension {\n\n\tconstructor( data ) {\n\n\t\tthis.name = EXTENSIONS.KHR_BINARY_GLTF;\n\t\tthis.content = null;\n\t\tthis.body = null;\n\n\t\tconst headerView = new DataView( data, 0, BINARY_EXTENSION_HEADER_LENGTH );\n\t\tconst textDecoder = new TextDecoder();\n\n\t\tthis.header = {\n\t\t\tmagic: textDecoder.decode( new Uint8Array( data.slice( 0, 4 ) ) ),\n\t\t\tversion: headerView.getUint32( 4, true ),\n\t\t\tlength: headerView.getUint32( 8, true )\n\t\t};\n\n\t\tif ( this.header.magic !== BINARY_EXTENSION_HEADER_MAGIC ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported glTF-Binary header.' );\n\n\t\t} else if ( this.header.version < 2.0 ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Legacy binary file detected.' );\n\n\t\t}\n\n\t\tconst chunkContentsLength = this.header.length - BINARY_EXTENSION_HEADER_LENGTH;\n\t\tconst chunkView = new DataView( data, BINARY_EXTENSION_HEADER_LENGTH );\n\t\tlet chunkIndex = 0;\n\n\t\twhile ( chunkIndex < chunkContentsLength ) {\n\n\t\t\tconst chunkLength = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tconst chunkType = chunkView.getUint32( chunkIndex, true );\n\t\t\tchunkIndex += 4;\n\n\t\t\tif ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.JSON ) {\n\n\t\t\t\tconst contentArray = new Uint8Array( data, BINARY_EXTENSION_HEADER_LENGTH + chunkIndex, chunkLength );\n\t\t\t\tthis.content = textDecoder.decode( contentArray );\n\n\t\t\t} else if ( chunkType === BINARY_EXTENSION_CHUNK_TYPES.BIN ) {\n\n\t\t\t\tconst byteOffset = BINARY_EXTENSION_HEADER_LENGTH + chunkIndex;\n\t\t\t\tthis.body = data.slice( byteOffset, byteOffset + chunkLength );\n\n\t\t\t}\n\n\t\t\t// Clients must ignore chunks with unknown types.\n\n\t\t\tchunkIndex += chunkLength;\n\n\t\t}\n\n\t\tif ( this.content === null ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: JSON content not found.' );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * DRACO Mesh Compression Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_draco_mesh_compression\n *\n * @private\n */\nclass GLTFDracoMeshCompressionExtension {\n\n\tconstructor( json, dracoLoader ) {\n\n\t\tif ( ! dracoLoader ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: No DRACOLoader instance provided.' );\n\n\t\t}\n\n\t\tthis.name = EXTENSIONS.KHR_DRACO_MESH_COMPRESSION;\n\t\tthis.json = json;\n\t\tthis.dracoLoader = dracoLoader;\n\t\tthis.dracoLoader.preload();\n\n\t}\n\n\tdecodePrimitive( primitive, parser ) {\n\n\t\tconst json = this.json;\n\t\tconst dracoLoader = this.dracoLoader;\n\t\tconst bufferViewIndex = primitive.extensions[ this.name ].bufferView;\n\t\tconst gltfAttributeMap = primitive.extensions[ this.name ].attributes;\n\t\tconst threeAttributeMap = {};\n\t\tconst attributeNormalizedMap = {};\n\t\tconst attributeTypeMap = {};\n\n\t\tfor ( const attributeName in gltfAttributeMap ) {\n\n\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tthreeAttributeMap[ threeAttributeName ] = gltfAttributeMap[ attributeName ];\n\n\t\t}\n\n\t\tfor ( const attributeName in primitive.attributes ) {\n\n\t\t\tconst threeAttributeName = ATTRIBUTES[ attributeName ] || attributeName.toLowerCase();\n\n\t\t\tif ( gltfAttributeMap[ attributeName ] !== undefined ) {\n\n\t\t\t\tconst accessorDef = json.accessors[ primitive.attributes[ attributeName ] ];\n\t\t\t\tconst componentType = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t\tattributeTypeMap[ threeAttributeName ] = componentType.name;\n\t\t\t\tattributeNormalizedMap[ threeAttributeName ] = accessorDef.normalized === true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn parser.getDependency( 'bufferView', bufferViewIndex ).then( function ( bufferView ) {\n\n\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\tdracoLoader.decodeDracoFile( bufferView, function ( geometry ) {\n\n\t\t\t\t\tfor ( const attributeName in geometry.attributes ) {\n\n\t\t\t\t\t\tconst attribute = geometry.attributes[ attributeName ];\n\t\t\t\t\t\tconst normalized = attributeNormalizedMap[ attributeName ];\n\n\t\t\t\t\t\tif ( normalized !== undefined ) attribute.normalized = normalized;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tresolve( geometry );\n\n\t\t\t\t}, threeAttributeMap, attributeTypeMap, LinearSRGBColorSpace, reject );\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * Texture Transform Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_texture_transform\n *\n * @private\n */\nclass GLTFTextureTransformExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_TEXTURE_TRANSFORM;\n\n\t}\n\n\textendTexture( texture, transform ) {\n\n\t\tif ( ( transform.texCoord === undefined || transform.texCoord === texture.channel )\n\t\t\t&& transform.offset === undefined\n\t\t\t&& transform.rotation === undefined\n\t\t\t&& transform.scale === undefined ) {\n\n\t\t\t// See https://github.com/mrdoob/three.js/issues/21819.\n\t\t\treturn texture;\n\n\t\t}\n\n\t\ttexture = texture.clone();\n\n\t\tif ( transform.texCoord !== undefined ) {\n\n\t\t\ttexture.channel = transform.texCoord;\n\n\t\t}\n\n\t\tif ( transform.offset !== undefined ) {\n\n\t\t\ttexture.offset.fromArray( transform.offset );\n\n\t\t}\n\n\t\tif ( transform.rotation !== undefined ) {\n\n\t\t\ttexture.rotation = transform.rotation;\n\n\t\t}\n\n\t\tif ( transform.scale !== undefined ) {\n\n\t\t\ttexture.repeat.fromArray( transform.scale );\n\n\t\t}\n\n\t\ttexture.needsUpdate = true;\n\n\t\treturn texture;\n\n\t}\n\n}\n\n/**\n * Mesh Quantization Extension\n *\n * Specification: https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization\n *\n * @private\n */\nclass GLTFMeshQuantizationExtension {\n\n\tconstructor() {\n\n\t\tthis.name = EXTENSIONS.KHR_MESH_QUANTIZATION;\n\n\t}\n\n}\n\n/*********************************/\n/********** INTERPOLATION ********/\n/*********************************/\n\n// Spline Interpolation\n// Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#appendix-c-spline-interpolation\nclass GLTFCubicSplineInterpolant extends Interpolant {\n\n\tconstructor( parameterPositions, sampleValues, sampleSize, resultBuffer ) {\n\n\t\tsuper( parameterPositions, sampleValues, sampleSize, resultBuffer );\n\n\t}\n\n\tcopySampleValue_( index ) {\n\n\t\t// Copies a sample value to the result buffer. See description of glTF\n\t\t// CUBICSPLINE values layout in interpolate_() function below.\n\n\t\tconst result = this.resultBuffer,\n\t\t\tvalues = this.sampleValues,\n\t\t\tvalueSize = this.valueSize,\n\t\t\toffset = index * valueSize * 3 + valueSize;\n\n\t\tfor ( let i = 0; i !== valueSize; i ++ ) {\n\n\t\t\tresult[ i ] = values[ offset + i ];\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = this.resultBuffer;\n\t\tconst values = this.sampleValues;\n\t\tconst stride = this.valueSize;\n\n\t\tconst stride2 = stride * 2;\n\t\tconst stride3 = stride * 3;\n\n\t\tconst td = t1 - t0;\n\n\t\tconst p = ( t - t0 ) / td;\n\t\tconst pp = p * p;\n\t\tconst ppp = pp * p;\n\n\t\tconst offset1 = i1 * stride3;\n\t\tconst offset0 = offset1 - stride3;\n\n\t\tconst s2 = - 2 * ppp + 3 * pp;\n\t\tconst s3 = ppp - pp;\n\t\tconst s0 = 1 - s2;\n\t\tconst s1 = s3 - pp + p;\n\n\t\t// Layout of keyframe output values for CUBICSPLINE animations:\n\t\t//   [ inTangent_1, splineVertex_1, outTangent_1, inTangent_2, splineVertex_2, ... ]\n\t\tfor ( let i = 0; i !== stride; i ++ ) {\n\n\t\t\tconst p0 = values[ offset0 + i + stride ]; // splineVertex_k\n\t\t\tconst m0 = values[ offset0 + i + stride2 ] * td; // outTangent_k * (t_k+1 - t_k)\n\t\t\tconst p1 = values[ offset1 + i + stride ]; // splineVertex_k+1\n\t\t\tconst m1 = values[ offset1 + i ] * td; // inTangent_k+1 * (t_k+1 - t_k)\n\n\t\t\tresult[ i ] = s0 * p0 + s1 * m0 + s2 * p1 + s3 * m1;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n}\n\nconst _quaternion = new Quaternion();\n\nclass GLTFCubicSplineQuaternionInterpolant extends GLTFCubicSplineInterpolant {\n\n\tinterpolate_( i1, t0, t, t1 ) {\n\n\t\tconst result = super.interpolate_( i1, t0, t, t1 );\n\n\t\t_quaternion.fromArray( result ).normalize().toArray( result );\n\n\t\treturn result;\n\n\t}\n\n}\n\n\n/*********************************/\n/********** INTERNALS ************/\n/*********************************/\n\n/* CONSTANTS */\n\nconst WEBGL_CONSTANTS = {\n\tFLOAT: 5126,\n\t//FLOAT_MAT2: 35674,\n\tFLOAT_MAT3: 35675,\n\tFLOAT_MAT4: 35676,\n\tFLOAT_VEC2: 35664,\n\tFLOAT_VEC3: 35665,\n\tFLOAT_VEC4: 35666,\n\tLINEAR: 9729,\n\tREPEAT: 10497,\n\tSAMPLER_2D: 35678,\n\tPOINTS: 0,\n\tLINES: 1,\n\tLINE_LOOP: 2,\n\tLINE_STRIP: 3,\n\tTRIANGLES: 4,\n\tTRIANGLE_STRIP: 5,\n\tTRIANGLE_FAN: 6,\n\tUNSIGNED_BYTE: 5121,\n\tUNSIGNED_SHORT: 5123\n};\n\nconst WEBGL_COMPONENT_TYPES = {\n\t5120: Int8Array,\n\t5121: Uint8Array,\n\t5122: Int16Array,\n\t5123: Uint16Array,\n\t5125: Uint32Array,\n\t5126: Float32Array\n};\n\nconst WEBGL_FILTERS = {\n\t9728: NearestFilter,\n\t9729: LinearFilter,\n\t9984: NearestMipmapNearestFilter,\n\t9985: LinearMipmapNearestFilter,\n\t9986: NearestMipmapLinearFilter,\n\t9987: LinearMipmapLinearFilter\n};\n\nconst WEBGL_WRAPPINGS = {\n\t33071: ClampToEdgeWrapping,\n\t33648: MirroredRepeatWrapping,\n\t10497: RepeatWrapping\n};\n\nconst WEBGL_TYPE_SIZES = {\n\t'SCALAR': 1,\n\t'VEC2': 2,\n\t'VEC3': 3,\n\t'VEC4': 4,\n\t'MAT2': 4,\n\t'MAT3': 9,\n\t'MAT4': 16\n};\n\nconst ATTRIBUTES = {\n\tPOSITION: 'position',\n\tNORMAL: 'normal',\n\tTANGENT: 'tangent',\n\tTEXCOORD_0: 'uv',\n\tTEXCOORD_1: 'uv1',\n\tTEXCOORD_2: 'uv2',\n\tTEXCOORD_3: 'uv3',\n\tCOLOR_0: 'color',\n\tWEIGHTS_0: 'skinWeight',\n\tJOINTS_0: 'skinIndex',\n};\n\nconst PATH_PROPERTIES = {\n\tscale: 'scale',\n\ttranslation: 'position',\n\trotation: 'quaternion',\n\tweights: 'morphTargetInfluences'\n};\n\nconst INTERPOLATION = {\n\tCUBICSPLINE: undefined, // We use a custom interpolant (GLTFCubicSplineInterpolation) for CUBICSPLINE tracks. Each\n\t\t                        // keyframe track will be initialized with a default interpolation type, then modified.\n\tLINEAR: InterpolateLinear,\n\tSTEP: InterpolateDiscrete\n};\n\nconst ALPHA_MODES = {\n\tOPAQUE: 'OPAQUE',\n\tMASK: 'MASK',\n\tBLEND: 'BLEND'\n};\n\n/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#default-material\n *\n * @private\n * @param {Object<string, Material>} cache\n * @return {Material}\n */\nfunction createDefaultMaterial( cache ) {\n\n\tif ( cache[ 'DefaultMaterial' ] === undefined ) {\n\n\t\tcache[ 'DefaultMaterial' ] = new MeshStandardMaterial( {\n\t\t\tcolor: 0xFFFFFF,\n\t\t\temissive: 0x000000,\n\t\t\tmetalness: 1,\n\t\t\troughness: 1,\n\t\t\ttransparent: false,\n\t\t\tdepthTest: true,\n\t\t\tside: FrontSide\n\t\t} );\n\n\t}\n\n\treturn cache[ 'DefaultMaterial' ];\n\n}\n\nfunction addUnknownExtensionsToUserData( knownExtensions, object, objectDef ) {\n\n\t// Add unknown glTF extensions to an object's userData.\n\n\tfor ( const name in objectDef.extensions ) {\n\n\t\tif ( knownExtensions[ name ] === undefined ) {\n\n\t\t\tobject.userData.gltfExtensions = object.userData.gltfExtensions || {};\n\t\t\tobject.userData.gltfExtensions[ name ] = objectDef.extensions[ name ];\n\n\t\t}\n\n\t}\n\n}\n\n/**\n *\n * @private\n * @param {Object3D|Material|BufferGeometry|Object|AnimationClip} object\n * @param {GLTF.definition} gltfDef\n */\nfunction assignExtrasToUserData( object, gltfDef ) {\n\n\tif ( gltfDef.extras !== undefined ) {\n\n\t\tif ( typeof gltfDef.extras === 'object' ) {\n\n\t\t\tObject.assign( object.userData, gltfDef.extras );\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Ignoring primitive type .extras, ' + gltfDef.extras );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#morph-targets\n *\n * @private\n * @param {BufferGeometry} geometry\n * @param {Array<GLTF.Target>} targets\n * @param {GLTFParser} parser\n * @return {Promise<BufferGeometry>}\n */\nfunction addMorphTargets( geometry, targets, parser ) {\n\n\tlet hasMorphPosition = false;\n\tlet hasMorphNormal = false;\n\tlet hasMorphColor = false;\n\n\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\tconst target = targets[ i ];\n\n\t\tif ( target.POSITION !== undefined ) hasMorphPosition = true;\n\t\tif ( target.NORMAL !== undefined ) hasMorphNormal = true;\n\t\tif ( target.COLOR_0 !== undefined ) hasMorphColor = true;\n\n\t\tif ( hasMorphPosition && hasMorphNormal && hasMorphColor ) break;\n\n\t}\n\n\tif ( ! hasMorphPosition && ! hasMorphNormal && ! hasMorphColor ) return Promise.resolve( geometry );\n\n\tconst pendingPositionAccessors = [];\n\tconst pendingNormalAccessors = [];\n\tconst pendingColorAccessors = [];\n\n\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\tconst target = targets[ i ];\n\n\t\tif ( hasMorphPosition ) {\n\n\t\t\tconst pendingAccessor = target.POSITION !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.POSITION )\n\t\t\t\t: geometry.attributes.position;\n\n\t\t\tpendingPositionAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t\tif ( hasMorphNormal ) {\n\n\t\t\tconst pendingAccessor = target.NORMAL !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.NORMAL )\n\t\t\t\t: geometry.attributes.normal;\n\n\t\t\tpendingNormalAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t\tif ( hasMorphColor ) {\n\n\t\t\tconst pendingAccessor = target.COLOR_0 !== undefined\n\t\t\t\t? parser.getDependency( 'accessor', target.COLOR_0 )\n\t\t\t\t: geometry.attributes.color;\n\n\t\t\tpendingColorAccessors.push( pendingAccessor );\n\n\t\t}\n\n\t}\n\n\treturn Promise.all( [\n\t\tPromise.all( pendingPositionAccessors ),\n\t\tPromise.all( pendingNormalAccessors ),\n\t\tPromise.all( pendingColorAccessors )\n\t] ).then( function ( accessors ) {\n\n\t\tconst morphPositions = accessors[ 0 ];\n\t\tconst morphNormals = accessors[ 1 ];\n\t\tconst morphColors = accessors[ 2 ];\n\n\t\tif ( hasMorphPosition ) geometry.morphAttributes.position = morphPositions;\n\t\tif ( hasMorphNormal ) geometry.morphAttributes.normal = morphNormals;\n\t\tif ( hasMorphColor ) geometry.morphAttributes.color = morphColors;\n\t\tgeometry.morphTargetsRelative = true;\n\n\t\treturn geometry;\n\n\t} );\n\n}\n\n/**\n *\n * @private\n * @param {Mesh} mesh\n * @param {GLTF.Mesh} meshDef\n */\nfunction updateMorphTargets( mesh, meshDef ) {\n\n\tmesh.updateMorphTargets();\n\n\tif ( meshDef.weights !== undefined ) {\n\n\t\tfor ( let i = 0, il = meshDef.weights.length; i < il; i ++ ) {\n\n\t\t\tmesh.morphTargetInfluences[ i ] = meshDef.weights[ i ];\n\n\t\t}\n\n\t}\n\n\t// .extras has user-defined data, so check that .extras.targetNames is an array.\n\tif ( meshDef.extras && Array.isArray( meshDef.extras.targetNames ) ) {\n\n\t\tconst targetNames = meshDef.extras.targetNames;\n\n\t\tif ( mesh.morphTargetInfluences.length === targetNames.length ) {\n\n\t\t\tmesh.morphTargetDictionary = {};\n\n\t\t\tfor ( let i = 0, il = targetNames.length; i < il; i ++ ) {\n\n\t\t\t\tmesh.morphTargetDictionary[ targetNames[ i ] ] = i;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.' );\n\n\t\t}\n\n\t}\n\n}\n\nfunction createPrimitiveKey( primitiveDef ) {\n\n\tlet geometryKey;\n\n\tconst dracoExtension = primitiveDef.extensions && primitiveDef.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ];\n\n\tif ( dracoExtension ) {\n\n\t\tgeometryKey = 'draco:' + dracoExtension.bufferView\n\t\t\t\t+ ':' + dracoExtension.indices\n\t\t\t\t+ ':' + createAttributesKey( dracoExtension.attributes );\n\n\t} else {\n\n\t\tgeometryKey = primitiveDef.indices + ':' + createAttributesKey( primitiveDef.attributes ) + ':' + primitiveDef.mode;\n\n\t}\n\n\tif ( primitiveDef.targets !== undefined ) {\n\n\t\tfor ( let i = 0, il = primitiveDef.targets.length; i < il; i ++ ) {\n\n\t\t\tgeometryKey += ':' + createAttributesKey( primitiveDef.targets[ i ] );\n\n\t\t}\n\n\t}\n\n\treturn geometryKey;\n\n}\n\nfunction createAttributesKey( attributes ) {\n\n\tlet attributesKey = '';\n\n\tconst keys = Object.keys( attributes ).sort();\n\n\tfor ( let i = 0, il = keys.length; i < il; i ++ ) {\n\n\t\tattributesKey += keys[ i ] + ':' + attributes[ keys[ i ] ] + ';';\n\n\t}\n\n\treturn attributesKey;\n\n}\n\nfunction getNormalizedComponentScale( constructor ) {\n\n\t// Reference:\n\t// https://github.com/KhronosGroup/glTF/tree/master/extensions/2.0/Khronos/KHR_mesh_quantization#encoding-quantized-data\n\n\tswitch ( constructor ) {\n\n\t\tcase Int8Array:\n\t\t\treturn 1 / 127;\n\n\t\tcase Uint8Array:\n\t\t\treturn 1 / 255;\n\n\t\tcase Int16Array:\n\t\t\treturn 1 / 32767;\n\n\t\tcase Uint16Array:\n\t\t\treturn 1 / 65535;\n\n\t\tdefault:\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Unsupported normalized accessor component type.' );\n\n\t}\n\n}\n\nfunction getImageURIMimeType( uri ) {\n\n\tif ( uri.search( /\\.jpe?g($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/jpeg/ ) === 0 ) return 'image/jpeg';\n\tif ( uri.search( /\\.webp($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/webp/ ) === 0 ) return 'image/webp';\n\tif ( uri.search( /\\.ktx2($|\\?)/i ) > 0 || uri.search( /^data\\:image\\/ktx2/ ) === 0 ) return 'image/ktx2';\n\n\treturn 'image/png';\n\n}\n\nconst _identityMatrix = new Matrix4();\n\n/* GLTF PARSER */\n\nclass GLTFParser {\n\n\tconstructor( json = {}, options = {} ) {\n\n\t\tthis.json = json;\n\t\tthis.extensions = {};\n\t\tthis.plugins = {};\n\t\tthis.options = options;\n\n\t\t// loader object cache\n\t\tthis.cache = new GLTFRegistry();\n\n\t\t// associations between Three.js objects and glTF elements\n\t\tthis.associations = new Map();\n\n\t\t// BufferGeometry caching\n\t\tthis.primitiveCache = {};\n\n\t\t// Node cache\n\t\tthis.nodeCache = {};\n\n\t\t// Object3D instance caches\n\t\tthis.meshCache = { refs: {}, uses: {} };\n\t\tthis.cameraCache = { refs: {}, uses: {} };\n\t\tthis.lightCache = { refs: {}, uses: {} };\n\n\t\tthis.sourceCache = {};\n\t\tthis.textureCache = {};\n\n\t\t// Track node names, to ensure no duplicates\n\t\tthis.nodeNamesUsed = {};\n\n\t\t// Use an ImageBitmapLoader if imageBitmaps are supported. Moves much of the\n\t\t// expensive work of uploading a texture to the GPU off the main thread.\n\n\t\tlet isSafari = false;\n\t\tlet safariVersion = - 1;\n\t\tlet isFirefox = false;\n\t\tlet firefoxVersion = - 1;\n\n\t\tif ( typeof navigator !== 'undefined' ) {\n\n\t\t\tconst userAgent = navigator.userAgent;\n\n\t\t\tisSafari = /^((?!chrome|android).)*safari/i.test( userAgent ) === true;\n\t\t\tconst safariMatch = userAgent.match( /Version\\/(\\d+)/ );\n\t\t\tsafariVersion = isSafari && safariMatch ? parseInt( safariMatch[ 1 ], 10 ) : - 1;\n\n\t\t\tisFirefox = userAgent.indexOf( 'Firefox' ) > - 1;\n\t\t\tfirefoxVersion = isFirefox ? userAgent.match( /Firefox\\/([0-9]+)\\./ )[ 1 ] : - 1;\n\n\t\t}\n\n\t\tif ( typeof createImageBitmap === 'undefined' || ( isSafari && safariVersion < 17 ) || ( isFirefox && firefoxVersion < 98 ) ) {\n\n\t\t\tthis.textureLoader = new TextureLoader( this.options.manager );\n\n\t\t} else {\n\n\t\t\tthis.textureLoader = new ImageBitmapLoader( this.options.manager );\n\n\t\t}\n\n\t\tthis.textureLoader.setCrossOrigin( this.options.crossOrigin );\n\t\tthis.textureLoader.setRequestHeader( this.options.requestHeader );\n\n\t\tthis.fileLoader = new FileLoader( this.options.manager );\n\t\tthis.fileLoader.setResponseType( 'arraybuffer' );\n\n\t\tif ( this.options.crossOrigin === 'use-credentials' ) {\n\n\t\t\tthis.fileLoader.setWithCredentials( true );\n\n\t\t}\n\n\t}\n\n\tsetExtensions( extensions ) {\n\n\t\tthis.extensions = extensions;\n\n\t}\n\n\tsetPlugins( plugins ) {\n\n\t\tthis.plugins = plugins;\n\n\t}\n\n\tparse( onLoad, onError ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\n\t\t// Clear the loader cache\n\t\tthis.cache.removeAll();\n\t\tthis.nodeCache = {};\n\n\t\t// Mark the special nodes/meshes in json for efficient parse\n\t\tthis._invokeAll( function ( ext ) {\n\n\t\t\treturn ext._markDefs && ext._markDefs();\n\n\t\t} );\n\n\t\tPromise.all( this._invokeAll( function ( ext ) {\n\n\t\t\treturn ext.beforeRoot && ext.beforeRoot();\n\n\t\t} ) ).then( function () {\n\n\t\t\treturn Promise.all( [\n\n\t\t\t\tparser.getDependencies( 'scene' ),\n\t\t\t\tparser.getDependencies( 'animation' ),\n\t\t\t\tparser.getDependencies( 'camera' ),\n\n\t\t\t] );\n\n\t\t} ).then( function ( dependencies ) {\n\n\t\t\tconst result = {\n\t\t\t\tscene: dependencies[ 0 ][ json.scene || 0 ],\n\t\t\t\tscenes: dependencies[ 0 ],\n\t\t\t\tanimations: dependencies[ 1 ],\n\t\t\t\tcameras: dependencies[ 2 ],\n\t\t\t\tasset: json.asset,\n\t\t\t\tparser: parser,\n\t\t\t\tuserData: {}\n\t\t\t};\n\n\t\t\taddUnknownExtensionsToUserData( extensions, result, json );\n\n\t\t\tassignExtrasToUserData( result, json );\n\n\t\t\treturn Promise.all( parser._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.afterRoot && ext.afterRoot( result );\n\n\t\t\t} ) ).then( function () {\n\n\t\t\t\tfor ( const scene of result.scenes ) {\n\n\t\t\t\t\tscene.updateMatrixWorld();\n\n\t\t\t\t}\n\n\t\t\t\tonLoad( result );\n\n\t\t\t} );\n\n\t\t} ).catch( onError );\n\n\t}\n\n\t/**\n\t * Marks the special nodes/meshes in json for efficient parse.\n\t *\n\t * @private\n\t */\n\t_markDefs() {\n\n\t\tconst nodeDefs = this.json.nodes || [];\n\t\tconst skinDefs = this.json.skins || [];\n\t\tconst meshDefs = this.json.meshes || [];\n\n\t\t// Nothing in the node definition indicates whether it is a Bone or an\n\t\t// Object3D. Use the skins' joint references to mark bones.\n\t\tfor ( let skinIndex = 0, skinLength = skinDefs.length; skinIndex < skinLength; skinIndex ++ ) {\n\n\t\t\tconst joints = skinDefs[ skinIndex ].joints;\n\n\t\t\tfor ( let i = 0, il = joints.length; i < il; i ++ ) {\n\n\t\t\t\tnodeDefs[ joints[ i ] ].isBone = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Iterate over all nodes, marking references to shared resources,\n\t\t// as well as skeleton joints.\n\t\tfor ( let nodeIndex = 0, nodeLength = nodeDefs.length; nodeIndex < nodeLength; nodeIndex ++ ) {\n\n\t\t\tconst nodeDef = nodeDefs[ nodeIndex ];\n\n\t\t\tif ( nodeDef.mesh !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.meshCache, nodeDef.mesh );\n\n\t\t\t\t// Nothing in the mesh definition indicates whether it is\n\t\t\t\t// a SkinnedMesh or Mesh. Use the node's mesh reference\n\t\t\t\t// to mark SkinnedMesh if node has skin.\n\t\t\t\tif ( nodeDef.skin !== undefined ) {\n\n\t\t\t\t\tmeshDefs[ nodeDef.mesh ].isSkinnedMesh = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\t\tthis._addNodeRef( this.cameraCache, nodeDef.camera );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Counts references to shared node / Object3D resources. These resources\n\t * can be reused, or \"instantiated\", at multiple nodes in the scene\n\t * hierarchy. Mesh, Camera, and Light instances are instantiated and must\n\t * be marked. Non-scenegraph resources (like Materials, Geometries, and\n\t * Textures) can be reused directly and are not marked here.\n\t *\n\t * Example: CesiumMilkTruck sample model reuses \"Wheel\" meshes.\n\t *\n\t * @private\n\t * @param {Object} cache\n\t * @param {Object3D} index\n\t */\n\t_addNodeRef( cache, index ) {\n\n\t\tif ( index === undefined ) return;\n\n\t\tif ( cache.refs[ index ] === undefined ) {\n\n\t\t\tcache.refs[ index ] = cache.uses[ index ] = 0;\n\n\t\t}\n\n\t\tcache.refs[ index ] ++;\n\n\t}\n\n\t/**\n\t * Returns a reference to a shared resource, cloning it if necessary.\n\t *\n\t * @private\n\t * @param {Object} cache\n\t * @param {number} index\n\t * @param {Object} object\n\t * @return {Object}\n\t */\n\t_getNodeRef( cache, index, object ) {\n\n\t\tif ( cache.refs[ index ] <= 1 ) return object;\n\n\t\tconst ref = object.clone();\n\n\t\t// Propagates mappings to the cloned object, prevents mappings on the\n\t\t// original object from being lost.\n\t\tconst updateMappings = ( original, clone ) => {\n\n\t\t\tconst mappings = this.associations.get( original );\n\t\t\tif ( mappings != null ) {\n\n\t\t\t\tthis.associations.set( clone, mappings );\n\n\t\t\t}\n\n\t\t\tfor ( const [ i, child ] of original.children.entries() ) {\n\n\t\t\t\tupdateMappings( child, clone.children[ i ] );\n\n\t\t\t}\n\n\t\t};\n\n\t\tupdateMappings( object, ref );\n\n\t\tref.name += '_instance_' + ( cache.uses[ index ] ++ );\n\n\t\treturn ref;\n\n\t}\n\n\t_invokeOne( func ) {\n\n\t\tconst extensions = Object.values( this.plugins );\n\t\textensions.push( this );\n\n\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tconst result = func( extensions[ i ] );\n\n\t\t\tif ( result ) return result;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t_invokeAll( func ) {\n\n\t\tconst extensions = Object.values( this.plugins );\n\t\textensions.unshift( this );\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0; i < extensions.length; i ++ ) {\n\n\t\t\tconst result = func( extensions[ i ] );\n\n\t\t\tif ( result ) pending.push( result );\n\n\t\t}\n\n\t\treturn pending;\n\n\t}\n\n\t/**\n\t * Requests the specified dependency asynchronously, with caching.\n\t *\n\t * @private\n\t * @param {string} type\n\t * @param {number} index\n\t * @return {Promise<Object3D|Material|Texture|AnimationClip|ArrayBuffer|Object>}\n\t */\n\tgetDependency( type, index ) {\n\n\t\tconst cacheKey = type + ':' + index;\n\t\tlet dependency = this.cache.get( cacheKey );\n\n\t\tif ( ! dependency ) {\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 'scene':\n\t\t\t\t\tdependency = this.loadScene( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'node':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadNode && ext.loadNode( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'mesh':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMesh && ext.loadMesh( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'accessor':\n\t\t\t\t\tdependency = this.loadAccessor( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'bufferView':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadBufferView && ext.loadBufferView( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'buffer':\n\t\t\t\t\tdependency = this.loadBuffer( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'material':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadMaterial && ext.loadMaterial( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'texture':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadTexture && ext.loadTexture( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'skin':\n\t\t\t\t\tdependency = this.loadSkin( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'animation':\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext.loadAnimation && ext.loadAnimation( index );\n\n\t\t\t\t\t} );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'camera':\n\t\t\t\t\tdependency = this.loadCamera( index );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tdependency = this._invokeOne( function ( ext ) {\n\n\t\t\t\t\t\treturn ext != this && ext.getDependency && ext.getDependency( type, index );\n\n\t\t\t\t\t} );\n\n\t\t\t\t\tif ( ! dependency ) {\n\n\t\t\t\t\t\tthrow new Error( 'Unknown type: ' + type );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tthis.cache.add( cacheKey, dependency );\n\n\t\t}\n\n\t\treturn dependency;\n\n\t}\n\n\t/**\n\t * Requests all dependencies of the specified type asynchronously, with caching.\n\t *\n\t * @private\n\t * @param {string} type\n\t * @return {Promise<Array<Object>>}\n\t */\n\tgetDependencies( type ) {\n\n\t\tlet dependencies = this.cache.get( type );\n\n\t\tif ( ! dependencies ) {\n\n\t\t\tconst parser = this;\n\t\t\tconst defs = this.json[ type + ( type === 'mesh' ? 'es' : 's' ) ] || [];\n\n\t\t\tdependencies = Promise.all( defs.map( function ( def, index ) {\n\n\t\t\t\treturn parser.getDependency( type, index );\n\n\t\t\t} ) );\n\n\t\t\tthis.cache.add( type, dependencies );\n\n\t\t}\n\n\t\treturn dependencies;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t *\n\t * @private\n\t * @param {number} bufferIndex\n\t * @return {Promise<ArrayBuffer>}\n\t */\n\tloadBuffer( bufferIndex ) {\n\n\t\tconst bufferDef = this.json.buffers[ bufferIndex ];\n\t\tconst loader = this.fileLoader;\n\n\t\tif ( bufferDef.type && bufferDef.type !== 'arraybuffer' ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: ' + bufferDef.type + ' buffer type is not supported.' );\n\n\t\t}\n\n\t\t// If present, GLB container is required to be the first buffer.\n\t\tif ( bufferDef.uri === undefined && bufferIndex === 0 ) {\n\n\t\t\treturn Promise.resolve( this.extensions[ EXTENSIONS.KHR_BINARY_GLTF ].body );\n\n\t\t}\n\n\t\tconst options = this.options;\n\n\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\tloader.load( LoaderUtils.resolveURL( bufferDef.uri, options.path ), resolve, undefined, function () {\n\n\t\t\t\treject( new Error( 'THREE.GLTFLoader: Failed to load buffer \"' + bufferDef.uri + '\".' ) );\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#buffers-and-buffer-views\n\t *\n\t * @private\n\t * @param {number} bufferViewIndex\n\t * @return {Promise<ArrayBuffer>}\n\t */\n\tloadBufferView( bufferViewIndex ) {\n\n\t\tconst bufferViewDef = this.json.bufferViews[ bufferViewIndex ];\n\n\t\treturn this.getDependency( 'buffer', bufferViewDef.buffer ).then( function ( buffer ) {\n\n\t\t\tconst byteLength = bufferViewDef.byteLength || 0;\n\t\t\tconst byteOffset = bufferViewDef.byteOffset || 0;\n\t\t\treturn buffer.slice( byteOffset, byteOffset + byteLength );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#accessors\n\t *\n\t * @private\n\t * @param {number} accessorIndex\n\t * @return {Promise<BufferAttribute|InterleavedBufferAttribute>}\n\t */\n\tloadAccessor( accessorIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\n\t\tconst accessorDef = this.json.accessors[ accessorIndex ];\n\n\t\tif ( accessorDef.bufferView === undefined && accessorDef.sparse === undefined ) {\n\n\t\t\tconst itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\tconst TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\t\t\tconst normalized = accessorDef.normalized === true;\n\n\t\t\tconst array = new TypedArray( accessorDef.count * itemSize );\n\t\t\treturn Promise.resolve( new BufferAttribute( array, itemSize, normalized ) );\n\n\t\t}\n\n\t\tconst pendingBufferViews = [];\n\n\t\tif ( accessorDef.bufferView !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.bufferView ) );\n\n\t\t} else {\n\n\t\t\tpendingBufferViews.push( null );\n\n\t\t}\n\n\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.indices.bufferView ) );\n\t\t\tpendingBufferViews.push( this.getDependency( 'bufferView', accessorDef.sparse.values.bufferView ) );\n\n\t\t}\n\n\t\treturn Promise.all( pendingBufferViews ).then( function ( bufferViews ) {\n\n\t\t\tconst bufferView = bufferViews[ 0 ];\n\n\t\t\tconst itemSize = WEBGL_TYPE_SIZES[ accessorDef.type ];\n\t\t\tconst TypedArray = WEBGL_COMPONENT_TYPES[ accessorDef.componentType ];\n\n\t\t\t// For VEC3: itemSize is 3, elementBytes is 4, itemBytes is 12.\n\t\t\tconst elementBytes = TypedArray.BYTES_PER_ELEMENT;\n\t\t\tconst itemBytes = elementBytes * itemSize;\n\t\t\tconst byteOffset = accessorDef.byteOffset || 0;\n\t\t\tconst byteStride = accessorDef.bufferView !== undefined ? json.bufferViews[ accessorDef.bufferView ].byteStride : undefined;\n\t\t\tconst normalized = accessorDef.normalized === true;\n\t\t\tlet array, bufferAttribute;\n\n\t\t\t// The buffer is not interleaved if the stride is the item size in bytes.\n\t\t\tif ( byteStride && byteStride !== itemBytes ) {\n\n\t\t\t\t// Each \"slice\" of the buffer, as defined by 'count' elements of 'byteStride' bytes, gets its own InterleavedBuffer\n\t\t\t\t// This makes sure that IBA.count reflects accessor.count properly\n\t\t\t\tconst ibSlice = Math.floor( byteOffset / byteStride );\n\t\t\t\tconst ibCacheKey = 'InterleavedBuffer:' + accessorDef.bufferView + ':' + accessorDef.componentType + ':' + ibSlice + ':' + accessorDef.count;\n\t\t\t\tlet ib = parser.cache.get( ibCacheKey );\n\n\t\t\t\tif ( ! ib ) {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, ibSlice * byteStride, accessorDef.count * byteStride / elementBytes );\n\n\t\t\t\t\t// Integer parameters to IB/IBA are in array elements, not bytes.\n\t\t\t\t\tib = new InterleavedBuffer( array, byteStride / elementBytes );\n\n\t\t\t\t\tparser.cache.add( ibCacheKey, ib );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new InterleavedBufferAttribute( ib, itemSize, ( byteOffset % byteStride ) / elementBytes, normalized );\n\n\t\t\t} else {\n\n\t\t\t\tif ( bufferView === null ) {\n\n\t\t\t\t\tarray = new TypedArray( accessorDef.count * itemSize );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tarray = new TypedArray( bufferView, byteOffset, accessorDef.count * itemSize );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute = new BufferAttribute( array, itemSize, normalized );\n\n\t\t\t}\n\n\t\t\t// https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#sparse-accessors\n\t\t\tif ( accessorDef.sparse !== undefined ) {\n\n\t\t\t\tconst itemSizeIndices = WEBGL_TYPE_SIZES.SCALAR;\n\t\t\t\tconst TypedArrayIndices = WEBGL_COMPONENT_TYPES[ accessorDef.sparse.indices.componentType ];\n\n\t\t\t\tconst byteOffsetIndices = accessorDef.sparse.indices.byteOffset || 0;\n\t\t\t\tconst byteOffsetValues = accessorDef.sparse.values.byteOffset || 0;\n\n\t\t\t\tconst sparseIndices = new TypedArrayIndices( bufferViews[ 1 ], byteOffsetIndices, accessorDef.sparse.count * itemSizeIndices );\n\t\t\t\tconst sparseValues = new TypedArray( bufferViews[ 2 ], byteOffsetValues, accessorDef.sparse.count * itemSize );\n\n\t\t\t\tif ( bufferView !== null ) {\n\n\t\t\t\t\t// Avoid modifying the original ArrayBuffer, if the bufferView wasn't initialized with zeroes.\n\t\t\t\t\tbufferAttribute = new BufferAttribute( bufferAttribute.array.slice(), bufferAttribute.itemSize, bufferAttribute.normalized );\n\n\t\t\t\t}\n\n\t\t\t\t// Ignore normalized since we copy from sparse\n\t\t\t\tbufferAttribute.normalized = false;\n\n\t\t\t\tfor ( let i = 0, il = sparseIndices.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst index = sparseIndices[ i ];\n\n\t\t\t\t\tbufferAttribute.setX( index, sparseValues[ i * itemSize ] );\n\t\t\t\t\tif ( itemSize >= 2 ) bufferAttribute.setY( index, sparseValues[ i * itemSize + 1 ] );\n\t\t\t\t\tif ( itemSize >= 3 ) bufferAttribute.setZ( index, sparseValues[ i * itemSize + 2 ] );\n\t\t\t\t\tif ( itemSize >= 4 ) bufferAttribute.setW( index, sparseValues[ i * itemSize + 3 ] );\n\t\t\t\t\tif ( itemSize >= 5 ) throw new Error( 'THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.' );\n\n\t\t\t\t}\n\n\t\t\t\tbufferAttribute.normalized = normalized;\n\n\t\t\t}\n\n\t\t\treturn bufferAttribute;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#textures\n\t *\n\t * @private\n\t * @param {number} textureIndex\n\t * @return {Promise<?Texture>}\n\t */\n\tloadTexture( textureIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\t\tconst textureDef = json.textures[ textureIndex ];\n\t\tconst sourceIndex = textureDef.source;\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tlet loader = this.textureLoader;\n\n\t\tif ( sourceDef.uri ) {\n\n\t\t\tconst handler = options.manager.getHandler( sourceDef.uri );\n\t\t\tif ( handler !== null ) loader = handler;\n\n\t\t}\n\n\t\treturn this.loadTextureImage( textureIndex, sourceIndex, loader );\n\n\t}\n\n\tloadTextureImage( textureIndex, sourceIndex, loader ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\n\t\tconst textureDef = json.textures[ textureIndex ];\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tconst cacheKey = ( sourceDef.uri || sourceDef.bufferView ) + ':' + textureDef.sampler;\n\n\t\tif ( this.textureCache[ cacheKey ] ) {\n\n\t\t\t// See https://github.com/mrdoob/three.js/issues/21559.\n\t\t\treturn this.textureCache[ cacheKey ];\n\n\t\t}\n\n\t\tconst promise = this.loadImageSource( sourceIndex, loader ).then( function ( texture ) {\n\n\t\t\ttexture.flipY = false;\n\n\t\t\ttexture.name = textureDef.name || sourceDef.name || '';\n\n\t\t\tif ( texture.name === '' && typeof sourceDef.uri === 'string' && sourceDef.uri.startsWith( 'data:image/' ) === false ) {\n\n\t\t\t\ttexture.name = sourceDef.uri;\n\n\t\t\t}\n\n\t\t\tconst samplers = json.samplers || {};\n\t\t\tconst sampler = samplers[ textureDef.sampler ] || {};\n\n\t\t\ttexture.magFilter = WEBGL_FILTERS[ sampler.magFilter ] || LinearFilter;\n\t\t\ttexture.minFilter = WEBGL_FILTERS[ sampler.minFilter ] || LinearMipmapLinearFilter;\n\t\t\ttexture.wrapS = WEBGL_WRAPPINGS[ sampler.wrapS ] || RepeatWrapping;\n\t\t\ttexture.wrapT = WEBGL_WRAPPINGS[ sampler.wrapT ] || RepeatWrapping;\n\t\t\ttexture.generateMipmaps = ! texture.isCompressedTexture && texture.minFilter !== NearestFilter && texture.minFilter !== LinearFilter;\n\n\t\t\tparser.associations.set( texture, { textures: textureIndex } );\n\n\t\t\treturn texture;\n\n\t\t} ).catch( function () {\n\n\t\t\treturn null;\n\n\t\t} );\n\n\t\tthis.textureCache[ cacheKey ] = promise;\n\n\t\treturn promise;\n\n\t}\n\n\tloadImageSource( sourceIndex, loader ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst options = this.options;\n\n\t\tif ( this.sourceCache[ sourceIndex ] !== undefined ) {\n\n\t\t\treturn this.sourceCache[ sourceIndex ].then( ( texture ) => texture.clone() );\n\n\t\t}\n\n\t\tconst sourceDef = json.images[ sourceIndex ];\n\n\t\tconst URL = self.URL || self.webkitURL;\n\n\t\tlet sourceURI = sourceDef.uri || '';\n\t\tlet isObjectURL = false;\n\n\t\tif ( sourceDef.bufferView !== undefined ) {\n\n\t\t\t// Load binary image data from bufferView, if provided.\n\n\t\t\tsourceURI = parser.getDependency( 'bufferView', sourceDef.bufferView ).then( function ( bufferView ) {\n\n\t\t\t\tisObjectURL = true;\n\t\t\t\tconst blob = new Blob( [ bufferView ], { type: sourceDef.mimeType } );\n\t\t\t\tsourceURI = URL.createObjectURL( blob );\n\t\t\t\treturn sourceURI;\n\n\t\t\t} );\n\n\t\t} else if ( sourceDef.uri === undefined ) {\n\n\t\t\tthrow new Error( 'THREE.GLTFLoader: Image ' + sourceIndex + ' is missing URI and bufferView' );\n\n\t\t}\n\n\t\tconst promise = Promise.resolve( sourceURI ).then( function ( sourceURI ) {\n\n\t\t\treturn new Promise( function ( resolve, reject ) {\n\n\t\t\t\tlet onLoad = resolve;\n\n\t\t\t\tif ( loader.isImageBitmapLoader === true ) {\n\n\t\t\t\t\tonLoad = function ( imageBitmap ) {\n\n\t\t\t\t\t\tconst texture = new Texture( imageBitmap );\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tresolve( texture );\n\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tloader.load( LoaderUtils.resolveURL( sourceURI, options.path ), onLoad, undefined, reject );\n\n\t\t\t} );\n\n\t\t} ).then( function ( texture ) {\n\n\t\t\t// Clean up resources and configure Texture.\n\n\t\t\tif ( isObjectURL === true ) {\n\n\t\t\t\tURL.revokeObjectURL( sourceURI );\n\n\t\t\t}\n\n\t\t\tassignExtrasToUserData( texture, sourceDef );\n\n\t\t\ttexture.userData.mimeType = sourceDef.mimeType || getImageURIMimeType( sourceDef.uri );\n\n\t\t\treturn texture;\n\n\t\t} ).catch( function ( error ) {\n\n\t\t\tconsole.error( 'THREE.GLTFLoader: Couldn\\'t load texture', sourceURI );\n\t\t\tthrow error;\n\n\t\t} );\n\n\t\tthis.sourceCache[ sourceIndex ] = promise;\n\t\treturn promise;\n\n\t}\n\n\t/**\n\t * Asynchronously assigns a texture to the given material parameters.\n\t *\n\t * @private\n\t * @param {Object} materialParams\n\t * @param {string} mapName\n\t * @param {Object} mapDef\n\t * @param {string} [colorSpace]\n\t * @return {Promise<Texture>}\n\t */\n\tassignTexture( materialParams, mapName, mapDef, colorSpace ) {\n\n\t\tconst parser = this;\n\n\t\treturn this.getDependency( 'texture', mapDef.index ).then( function ( texture ) {\n\n\t\t\tif ( ! texture ) return null;\n\n\t\t\tif ( mapDef.texCoord !== undefined && mapDef.texCoord > 0 ) {\n\n\t\t\t\ttexture = texture.clone();\n\t\t\t\ttexture.channel = mapDef.texCoord;\n\n\t\t\t}\n\n\t\t\tif ( parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] ) {\n\n\t\t\t\tconst transform = mapDef.extensions !== undefined ? mapDef.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ] : undefined;\n\n\t\t\t\tif ( transform ) {\n\n\t\t\t\t\tconst gltfReference = parser.associations.get( texture );\n\t\t\t\t\ttexture = parser.extensions[ EXTENSIONS.KHR_TEXTURE_TRANSFORM ].extendTexture( texture, transform );\n\t\t\t\t\tparser.associations.set( texture, gltfReference );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( colorSpace !== undefined ) {\n\n\t\t\t\ttexture.colorSpace = colorSpace;\n\n\t\t\t}\n\n\t\t\tmaterialParams[ mapName ] = texture;\n\n\t\t\treturn texture;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Assigns final material to a Mesh, Line, or Points instance. The instance\n\t * already has a material (generated from the glTF material options alone)\n\t * but reuse of the same glTF material may require multiple threejs materials\n\t * to accommodate different primitive types, defines, etc. New materials will\n\t * be created if necessary, and reused from a cache.\n\t *\n\t * @private\n\t * @param {Object3D} mesh Mesh, Line, or Points instance.\n\t */\n\tassignFinalMaterial( mesh ) {\n\n\t\tconst geometry = mesh.geometry;\n\t\tlet material = mesh.material;\n\n\t\tconst useDerivativeTangents = geometry.attributes.tangent === undefined;\n\t\tconst useVertexColors = geometry.attributes.color !== undefined;\n\t\tconst useFlatShading = geometry.attributes.normal === undefined;\n\n\t\tif ( mesh.isPoints ) {\n\n\t\t\tconst cacheKey = 'PointsMaterial:' + material.uuid;\n\n\t\t\tlet pointsMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! pointsMaterial ) {\n\n\t\t\t\tpointsMaterial = new PointsMaterial();\n\t\t\t\tMaterial.prototype.copy.call( pointsMaterial, material );\n\t\t\t\tpointsMaterial.color.copy( material.color );\n\t\t\t\tpointsMaterial.map = material.map;\n\t\t\t\tpointsMaterial.sizeAttenuation = false; // glTF spec says points should be 1px\n\n\t\t\t\tthis.cache.add( cacheKey, pointsMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = pointsMaterial;\n\n\t\t} else if ( mesh.isLine ) {\n\n\t\t\tconst cacheKey = 'LineBasicMaterial:' + material.uuid;\n\n\t\t\tlet lineMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! lineMaterial ) {\n\n\t\t\t\tlineMaterial = new LineBasicMaterial();\n\t\t\t\tMaterial.prototype.copy.call( lineMaterial, material );\n\t\t\t\tlineMaterial.color.copy( material.color );\n\t\t\t\tlineMaterial.map = material.map;\n\n\t\t\t\tthis.cache.add( cacheKey, lineMaterial );\n\n\t\t\t}\n\n\t\t\tmaterial = lineMaterial;\n\n\t\t}\n\n\t\t// Clone the material if it will be modified\n\t\tif ( useDerivativeTangents || useVertexColors || useFlatShading ) {\n\n\t\t\tlet cacheKey = 'ClonedMaterial:' + material.uuid + ':';\n\n\t\t\tif ( useDerivativeTangents ) cacheKey += 'derivative-tangents:';\n\t\t\tif ( useVertexColors ) cacheKey += 'vertex-colors:';\n\t\t\tif ( useFlatShading ) cacheKey += 'flat-shading:';\n\n\t\t\tlet cachedMaterial = this.cache.get( cacheKey );\n\n\t\t\tif ( ! cachedMaterial ) {\n\n\t\t\t\tcachedMaterial = material.clone();\n\n\t\t\t\tif ( useVertexColors ) cachedMaterial.vertexColors = true;\n\t\t\t\tif ( useFlatShading ) cachedMaterial.flatShading = true;\n\n\t\t\t\tif ( useDerivativeTangents ) {\n\n\t\t\t\t\t// https://github.com/mrdoob/three.js/issues/11438#issuecomment-507003995\n\t\t\t\t\tif ( cachedMaterial.normalScale ) cachedMaterial.normalScale.y *= - 1;\n\t\t\t\t\tif ( cachedMaterial.clearcoatNormalScale ) cachedMaterial.clearcoatNormalScale.y *= - 1;\n\n\t\t\t\t}\n\n\t\t\t\tthis.cache.add( cacheKey, cachedMaterial );\n\n\t\t\t\tthis.associations.set( cachedMaterial, this.associations.get( material ) );\n\n\t\t\t}\n\n\t\t\tmaterial = cachedMaterial;\n\n\t\t}\n\n\t\tmesh.material = material;\n\n\t}\n\n\tgetMaterialType( /* materialIndex */ ) {\n\n\t\treturn MeshStandardMaterial;\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#materials\n\t *\n\t * @private\n\t * @param {number} materialIndex\n\t * @return {Promise<Material>}\n\t */\n\tloadMaterial( materialIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\t\tconst materialDef = json.materials[ materialIndex ];\n\n\t\tlet materialType;\n\t\tconst materialParams = {};\n\t\tconst materialExtensions = materialDef.extensions || {};\n\n\t\tconst pending = [];\n\n\t\tif ( materialExtensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ] ) {\n\n\t\t\tconst kmuExtension = extensions[ EXTENSIONS.KHR_MATERIALS_UNLIT ];\n\t\t\tmaterialType = kmuExtension.getMaterialType();\n\t\t\tpending.push( kmuExtension.extendParams( materialParams, materialDef, parser ) );\n\n\t\t} else {\n\n\t\t\t// Specification:\n\t\t\t// https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#metallic-roughness-material\n\n\t\t\tconst metallicRoughness = materialDef.pbrMetallicRoughness || {};\n\n\t\t\tmaterialParams.color = new Color( 1.0, 1.0, 1.0 );\n\t\t\tmaterialParams.opacity = 1.0;\n\n\t\t\tif ( Array.isArray( metallicRoughness.baseColorFactor ) ) {\n\n\t\t\t\tconst array = metallicRoughness.baseColorFactor;\n\n\t\t\t\tmaterialParams.color.setRGB( array[ 0 ], array[ 1 ], array[ 2 ], LinearSRGBColorSpace );\n\t\t\t\tmaterialParams.opacity = array[ 3 ];\n\n\t\t\t}\n\n\t\t\tif ( metallicRoughness.baseColorTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'map', metallicRoughness.baseColorTexture, SRGBColorSpace ) );\n\n\t\t\t}\n\n\t\t\tmaterialParams.metalness = metallicRoughness.metallicFactor !== undefined ? metallicRoughness.metallicFactor : 1.0;\n\t\t\tmaterialParams.roughness = metallicRoughness.roughnessFactor !== undefined ? metallicRoughness.roughnessFactor : 1.0;\n\n\t\t\tif ( metallicRoughness.metallicRoughnessTexture !== undefined ) {\n\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'metalnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\t\t\t\tpending.push( parser.assignTexture( materialParams, 'roughnessMap', metallicRoughness.metallicRoughnessTexture ) );\n\n\t\t\t}\n\n\t\t\tmaterialType = this._invokeOne( function ( ext ) {\n\n\t\t\t\treturn ext.getMaterialType && ext.getMaterialType( materialIndex );\n\n\t\t\t} );\n\n\t\t\tpending.push( Promise.all( this._invokeAll( function ( ext ) {\n\n\t\t\t\treturn ext.extendMaterialParams && ext.extendMaterialParams( materialIndex, materialParams );\n\n\t\t\t} ) ) );\n\n\t\t}\n\n\t\tif ( materialDef.doubleSided === true ) {\n\n\t\t\tmaterialParams.side = DoubleSide;\n\n\t\t}\n\n\t\tconst alphaMode = materialDef.alphaMode || ALPHA_MODES.OPAQUE;\n\n\t\tif ( alphaMode === ALPHA_MODES.BLEND ) {\n\n\t\t\tmaterialParams.transparent = true;\n\n\t\t\t// See: https://github.com/mrdoob/three.js/issues/17706\n\t\t\tmaterialParams.depthWrite = false;\n\n\t\t} else {\n\n\t\t\tmaterialParams.transparent = false;\n\n\t\t\tif ( alphaMode === ALPHA_MODES.MASK ) {\n\n\t\t\t\tmaterialParams.alphaTest = materialDef.alphaCutoff !== undefined ? materialDef.alphaCutoff : 0.5;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.normalTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'normalMap', materialDef.normalTexture ) );\n\n\t\t\tmaterialParams.normalScale = new Vector2( 1, 1 );\n\n\t\t\tif ( materialDef.normalTexture.scale !== undefined ) {\n\n\t\t\t\tconst scale = materialDef.normalTexture.scale;\n\n\t\t\t\tmaterialParams.normalScale.set( scale, scale );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.occlusionTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'aoMap', materialDef.occlusionTexture ) );\n\n\t\t\tif ( materialDef.occlusionTexture.strength !== undefined ) {\n\n\t\t\t\tmaterialParams.aoMapIntensity = materialDef.occlusionTexture.strength;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialDef.emissiveFactor !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tconst emissiveFactor = materialDef.emissiveFactor;\n\t\t\tmaterialParams.emissive = new Color().setRGB( emissiveFactor[ 0 ], emissiveFactor[ 1 ], emissiveFactor[ 2 ], LinearSRGBColorSpace );\n\n\t\t}\n\n\t\tif ( materialDef.emissiveTexture !== undefined && materialType !== MeshBasicMaterial ) {\n\n\t\t\tpending.push( parser.assignTexture( materialParams, 'emissiveMap', materialDef.emissiveTexture, SRGBColorSpace ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function () {\n\n\t\t\tconst material = new materialType( materialParams );\n\n\t\t\tif ( materialDef.name ) material.name = materialDef.name;\n\n\t\t\tassignExtrasToUserData( material, materialDef );\n\n\t\t\tparser.associations.set( material, { materials: materialIndex } );\n\n\t\t\tif ( materialDef.extensions ) addUnknownExtensionsToUserData( extensions, material, materialDef );\n\n\t\t\treturn material;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * When Object3D instances are targeted by animation, they need unique names.\n\t *\n\t * @private\n\t * @param {string} originalName\n\t * @return {string}\n\t */\n\tcreateUniqueName( originalName ) {\n\n\t\tconst sanitizedName = PropertyBinding.sanitizeNodeName( originalName || '' );\n\n\t\tif ( sanitizedName in this.nodeNamesUsed ) {\n\n\t\t\treturn sanitizedName + '_' + ( ++ this.nodeNamesUsed[ sanitizedName ] );\n\n\t\t} else {\n\n\t\t\tthis.nodeNamesUsed[ sanitizedName ] = 0;\n\n\t\t\treturn sanitizedName;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#geometry\n\t *\n\t * Creates BufferGeometries from primitives.\n\t *\n\t * @private\n\t * @param {Array<GLTF.Primitive>} primitives\n\t * @return {Promise<Array<BufferGeometry>>}\n\t */\n\tloadGeometries( primitives ) {\n\n\t\tconst parser = this;\n\t\tconst extensions = this.extensions;\n\t\tconst cache = this.primitiveCache;\n\n\t\tfunction createDracoPrimitive( primitive ) {\n\n\t\t\treturn extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ]\n\t\t\t\t.decodePrimitive( primitive, parser )\n\t\t\t\t.then( function ( geometry ) {\n\n\t\t\t\t\treturn addPrimitiveAttributes( geometry, primitive, parser );\n\n\t\t\t\t} );\n\n\t\t}\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tconst primitive = primitives[ i ];\n\t\t\tconst cacheKey = createPrimitiveKey( primitive );\n\n\t\t\t// See if we've already created this geometry\n\t\t\tconst cached = cache[ cacheKey ];\n\n\t\t\tif ( cached ) {\n\n\t\t\t\t// Use the cached geometry if it exists\n\t\t\t\tpending.push( cached.promise );\n\n\t\t\t} else {\n\n\t\t\t\tlet geometryPromise;\n\n\t\t\t\tif ( primitive.extensions && primitive.extensions[ EXTENSIONS.KHR_DRACO_MESH_COMPRESSION ] ) {\n\n\t\t\t\t\t// Use DRACO geometry if available\n\t\t\t\t\tgeometryPromise = createDracoPrimitive( primitive );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Otherwise create a new geometry\n\t\t\t\t\tgeometryPromise = addPrimitiveAttributes( new BufferGeometry(), primitive, parser );\n\n\t\t\t\t}\n\n\t\t\t\t// Cache this geometry\n\t\t\t\tcache[ cacheKey ] = { primitive: primitive, promise: geometryPromise };\n\n\t\t\t\tpending.push( geometryPromise );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn Promise.all( pending );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#meshes\n\t *\n\t * @private\n\t * @param {number} meshIndex\n\t * @return {Promise<Group|Mesh|SkinnedMesh|Line|Points>}\n\t */\n\tloadMesh( meshIndex ) {\n\n\t\tconst parser = this;\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\n\t\tconst meshDef = json.meshes[ meshIndex ];\n\t\tconst primitives = meshDef.primitives;\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = primitives.length; i < il; i ++ ) {\n\n\t\t\tconst material = primitives[ i ].material === undefined\n\t\t\t\t? createDefaultMaterial( this.cache )\n\t\t\t\t: this.getDependency( 'material', primitives[ i ].material );\n\n\t\t\tpending.push( material );\n\n\t\t}\n\n\t\tpending.push( parser.loadGeometries( primitives ) );\n\n\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\tconst materials = results.slice( 0, results.length - 1 );\n\t\t\tconst geometries = results[ results.length - 1 ];\n\n\t\t\tconst meshes = [];\n\n\t\t\tfor ( let i = 0, il = geometries.length; i < il; i ++ ) {\n\n\t\t\t\tconst geometry = geometries[ i ];\n\t\t\t\tconst primitive = primitives[ i ];\n\n\t\t\t\t// 1. create Mesh\n\n\t\t\t\tlet mesh;\n\n\t\t\t\tconst material = materials[ i ];\n\n\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLES ||\n\t\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ||\n\t\t\t\t\t\tprimitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ||\n\t\t\t\t\t\tprimitive.mode === undefined ) {\n\n\t\t\t\t\t// .isSkinnedMesh isn't in glTF spec. See ._markDefs()\n\t\t\t\t\tmesh = meshDef.isSkinnedMesh === true\n\t\t\t\t\t\t? new SkinnedMesh( geometry, material )\n\t\t\t\t\t\t: new Mesh( geometry, material );\n\n\t\t\t\t\tif ( mesh.isSkinnedMesh === true ) {\n\n\t\t\t\t\t\t// normalize skin weights to fix malformed assets (see #15319)\n\t\t\t\t\t\tmesh.normalizeSkinWeights();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_STRIP ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleStripDrawMode );\n\n\t\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.TRIANGLE_FAN ) {\n\n\t\t\t\t\t\tmesh.geometry = toTrianglesDrawMode( mesh.geometry, TriangleFanDrawMode );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINES ) {\n\n\t\t\t\t\tmesh = new LineSegments( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_STRIP ) {\n\n\t\t\t\t\tmesh = new Line( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.LINE_LOOP ) {\n\n\t\t\t\t\tmesh = new LineLoop( geometry, material );\n\n\t\t\t\t} else if ( primitive.mode === WEBGL_CONSTANTS.POINTS ) {\n\n\t\t\t\t\tmesh = new Points( geometry, material );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrow new Error( 'THREE.GLTFLoader: Primitive mode unsupported: ' + primitive.mode );\n\n\t\t\t\t}\n\n\t\t\t\tif ( Object.keys( mesh.geometry.morphAttributes ).length > 0 ) {\n\n\t\t\t\t\tupdateMorphTargets( mesh, meshDef );\n\n\t\t\t\t}\n\n\t\t\t\tmesh.name = parser.createUniqueName( meshDef.name || ( 'mesh_' + meshIndex ) );\n\n\t\t\t\tassignExtrasToUserData( mesh, meshDef );\n\n\t\t\t\tif ( primitive.extensions ) addUnknownExtensionsToUserData( extensions, mesh, primitive );\n\n\t\t\t\tparser.assignFinalMaterial( mesh );\n\n\t\t\t\tmeshes.push( mesh );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\tparser.associations.set( meshes[ i ], {\n\t\t\t\t\tmeshes: meshIndex,\n\t\t\t\t\tprimitives: i\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( meshes.length === 1 ) {\n\n\t\t\t\tif ( meshDef.extensions ) addUnknownExtensionsToUserData( extensions, meshes[ 0 ], meshDef );\n\n\t\t\t\treturn meshes[ 0 ];\n\n\t\t\t}\n\n\t\t\tconst group = new Group();\n\n\t\t\tif ( meshDef.extensions ) addUnknownExtensionsToUserData( extensions, group, meshDef );\n\n\t\t\tparser.associations.set( group, { meshes: meshIndex } );\n\n\t\t\tfor ( let i = 0, il = meshes.length; i < il; i ++ ) {\n\n\t\t\t\tgroup.add( meshes[ i ] );\n\n\t\t\t}\n\n\t\t\treturn group;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#cameras\n\t *\n\t * @private\n\t * @param {number} cameraIndex\n\t * @return {Promise<Camera>|undefined}\n\t */\n\tloadCamera( cameraIndex ) {\n\n\t\tlet camera;\n\t\tconst cameraDef = this.json.cameras[ cameraIndex ];\n\t\tconst params = cameraDef[ cameraDef.type ];\n\n\t\tif ( ! params ) {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing camera parameters.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( cameraDef.type === 'perspective' ) {\n\n\t\t\tcamera = new PerspectiveCamera( MathUtils.radToDeg( params.yfov ), params.aspectRatio || 1, params.znear || 1, params.zfar || 2e6 );\n\n\t\t} else if ( cameraDef.type === 'orthographic' ) {\n\n\t\t\tcamera = new OrthographicCamera( - params.xmag, params.xmag, params.ymag, - params.ymag, params.znear, params.zfar );\n\n\t\t}\n\n\t\tif ( cameraDef.name ) camera.name = this.createUniqueName( cameraDef.name );\n\n\t\tassignExtrasToUserData( camera, cameraDef );\n\n\t\treturn Promise.resolve( camera );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#skins\n\t *\n\t * @private\n\t * @param {number} skinIndex\n\t * @return {Promise<Skeleton>}\n\t */\n\tloadSkin( skinIndex ) {\n\n\t\tconst skinDef = this.json.skins[ skinIndex ];\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = skinDef.joints.length; i < il; i ++ ) {\n\n\t\t\tpending.push( this._loadNodeShallow( skinDef.joints[ i ] ) );\n\n\t\t}\n\n\t\tif ( skinDef.inverseBindMatrices !== undefined ) {\n\n\t\t\tpending.push( this.getDependency( 'accessor', skinDef.inverseBindMatrices ) );\n\n\t\t} else {\n\n\t\t\tpending.push( null );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function ( results ) {\n\n\t\t\tconst inverseBindMatrices = results.pop();\n\t\t\tconst jointNodes = results;\n\n\t\t\t// Note that bones (joint nodes) may or may not be in the\n\t\t\t// scene graph at this time.\n\n\t\t\tconst bones = [];\n\t\t\tconst boneInverses = [];\n\n\t\t\tfor ( let i = 0, il = jointNodes.length; i < il; i ++ ) {\n\n\t\t\t\tconst jointNode = jointNodes[ i ];\n\n\t\t\t\tif ( jointNode ) {\n\n\t\t\t\t\tbones.push( jointNode );\n\n\t\t\t\t\tconst mat = new Matrix4();\n\n\t\t\t\t\tif ( inverseBindMatrices !== null ) {\n\n\t\t\t\t\t\tmat.fromArray( inverseBindMatrices.array, i * 16 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tboneInverses.push( mat );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Joint \"%s\" could not be found.', skinDef.joints[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new Skeleton( bones, boneInverses );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#animations\n\t *\n\t * @private\n\t * @param {number} animationIndex\n\t * @return {Promise<AnimationClip>}\n\t */\n\tloadAnimation( animationIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\n\t\tconst animationDef = json.animations[ animationIndex ];\n\t\tconst animationName = animationDef.name ? animationDef.name : 'animation_' + animationIndex;\n\n\t\tconst pendingNodes = [];\n\t\tconst pendingInputAccessors = [];\n\t\tconst pendingOutputAccessors = [];\n\t\tconst pendingSamplers = [];\n\t\tconst pendingTargets = [];\n\n\t\tfor ( let i = 0, il = animationDef.channels.length; i < il; i ++ ) {\n\n\t\t\tconst channel = animationDef.channels[ i ];\n\t\t\tconst sampler = animationDef.samplers[ channel.sampler ];\n\t\t\tconst target = channel.target;\n\t\t\tconst name = target.node;\n\t\t\tconst input = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.input ] : sampler.input;\n\t\t\tconst output = animationDef.parameters !== undefined ? animationDef.parameters[ sampler.output ] : sampler.output;\n\n\t\t\tif ( target.node === undefined ) continue;\n\n\t\t\tpendingNodes.push( this.getDependency( 'node', name ) );\n\t\t\tpendingInputAccessors.push( this.getDependency( 'accessor', input ) );\n\t\t\tpendingOutputAccessors.push( this.getDependency( 'accessor', output ) );\n\t\t\tpendingSamplers.push( sampler );\n\t\t\tpendingTargets.push( target );\n\n\t\t}\n\n\t\treturn Promise.all( [\n\n\t\t\tPromise.all( pendingNodes ),\n\t\t\tPromise.all( pendingInputAccessors ),\n\t\t\tPromise.all( pendingOutputAccessors ),\n\t\t\tPromise.all( pendingSamplers ),\n\t\t\tPromise.all( pendingTargets )\n\n\t\t] ).then( function ( dependencies ) {\n\n\t\t\tconst nodes = dependencies[ 0 ];\n\t\t\tconst inputAccessors = dependencies[ 1 ];\n\t\t\tconst outputAccessors = dependencies[ 2 ];\n\t\t\tconst samplers = dependencies[ 3 ];\n\t\t\tconst targets = dependencies[ 4 ];\n\n\t\t\tconst tracks = [];\n\n\t\t\tfor ( let i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\tconst node = nodes[ i ];\n\t\t\t\tconst inputAccessor = inputAccessors[ i ];\n\t\t\t\tconst outputAccessor = outputAccessors[ i ];\n\t\t\t\tconst sampler = samplers[ i ];\n\t\t\t\tconst target = targets[ i ];\n\n\t\t\t\tif ( node === undefined ) continue;\n\n\t\t\t\tif ( node.updateMatrix ) {\n\n\t\t\t\t\tnode.updateMatrix();\n\n\t\t\t\t}\n\n\t\t\t\tconst createdTracks = parser._createAnimationTracks( node, inputAccessor, outputAccessor, sampler, target );\n\n\t\t\t\tif ( createdTracks ) {\n\n\t\t\t\t\tfor ( let k = 0; k < createdTracks.length; k ++ ) {\n\n\t\t\t\t\t\ttracks.push( createdTracks[ k ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst animation = new AnimationClip( animationName, undefined, tracks );\n\n\t\t\tassignExtrasToUserData( animation, animationDef );\n\n\t\t\treturn animation;\n\n\t\t} );\n\n\t}\n\n\tcreateNodeMesh( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tif ( nodeDef.mesh === undefined ) return null;\n\n\t\treturn parser.getDependency( 'mesh', nodeDef.mesh ).then( function ( mesh ) {\n\n\t\t\tconst node = parser._getNodeRef( parser.meshCache, nodeDef.mesh, mesh );\n\n\t\t\t// if weights are provided on the node, override weights on the mesh.\n\t\t\tif ( nodeDef.weights !== undefined ) {\n\n\t\t\t\tnode.traverse( function ( o ) {\n\n\t\t\t\t\tif ( ! o.isMesh ) return;\n\n\t\t\t\t\tfor ( let i = 0, il = nodeDef.weights.length; i < il; i ++ ) {\n\n\t\t\t\t\t\to.morphTargetInfluences[ i ] = nodeDef.weights[ i ];\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#nodes-and-hierarchy\n\t *\n\t * @private\n\t * @param {number} nodeIndex\n\t * @return {Promise<Object3D>}\n\t */\n\tloadNode( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst parser = this;\n\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\tconst nodePending = parser._loadNodeShallow( nodeIndex );\n\n\t\tconst childPending = [];\n\t\tconst childrenDef = nodeDef.children || [];\n\n\t\tfor ( let i = 0, il = childrenDef.length; i < il; i ++ ) {\n\n\t\t\tchildPending.push( parser.getDependency( 'node', childrenDef[ i ] ) );\n\n\t\t}\n\n\t\tconst skeletonPending = nodeDef.skin === undefined\n\t\t\t? Promise.resolve( null )\n\t\t\t: parser.getDependency( 'skin', nodeDef.skin );\n\n\t\treturn Promise.all( [\n\t\t\tnodePending,\n\t\t\tPromise.all( childPending ),\n\t\t\tskeletonPending\n\t\t] ).then( function ( results ) {\n\n\t\t\tconst node = results[ 0 ];\n\t\t\tconst children = results[ 1 ];\n\t\t\tconst skeleton = results[ 2 ];\n\n\t\t\tif ( skeleton !== null ) {\n\n\t\t\t\t// This full traverse should be fine because\n\t\t\t\t// child glTF nodes have not been added to this node yet.\n\t\t\t\tnode.traverse( function ( mesh ) {\n\n\t\t\t\t\tif ( ! mesh.isSkinnedMesh ) return;\n\n\t\t\t\t\tmesh.bind( skeleton, _identityMatrix );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, il = children.length; i < il; i ++ ) {\n\n\t\t\t\tnode.add( children[ i ] );\n\n\t\t\t}\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t}\n\n\t// ._loadNodeShallow() parses a single node.\n\t// skin and child nodes are created and added in .loadNode() (no '_' prefix).\n\t_loadNodeShallow( nodeIndex ) {\n\n\t\tconst json = this.json;\n\t\tconst extensions = this.extensions;\n\t\tconst parser = this;\n\n\t\t// This method is called from .loadNode() and .loadSkin().\n\t\t// Cache a node to avoid duplication.\n\n\t\tif ( this.nodeCache[ nodeIndex ] !== undefined ) {\n\n\t\t\treturn this.nodeCache[ nodeIndex ];\n\n\t\t}\n\n\t\tconst nodeDef = json.nodes[ nodeIndex ];\n\n\t\t// reserve node's name before its dependencies, so the root has the intended name.\n\t\tconst nodeName = nodeDef.name ? parser.createUniqueName( nodeDef.name ) : '';\n\n\t\tconst pending = [];\n\n\t\tconst meshPromise = parser._invokeOne( function ( ext ) {\n\n\t\t\treturn ext.createNodeMesh && ext.createNodeMesh( nodeIndex );\n\n\t\t} );\n\n\t\tif ( meshPromise ) {\n\n\t\t\tpending.push( meshPromise );\n\n\t\t}\n\n\t\tif ( nodeDef.camera !== undefined ) {\n\n\t\t\tpending.push( parser.getDependency( 'camera', nodeDef.camera ).then( function ( camera ) {\n\n\t\t\t\treturn parser._getNodeRef( parser.cameraCache, nodeDef.camera, camera );\n\n\t\t\t} ) );\n\n\t\t}\n\n\t\tparser._invokeAll( function ( ext ) {\n\n\t\t\treturn ext.createNodeAttachment && ext.createNodeAttachment( nodeIndex );\n\n\t\t} ).forEach( function ( promise ) {\n\n\t\t\tpending.push( promise );\n\n\t\t} );\n\n\t\tthis.nodeCache[ nodeIndex ] = Promise.all( pending ).then( function ( objects ) {\n\n\t\t\tlet node;\n\n\t\t\t// .isBone isn't in glTF spec. See ._markDefs\n\t\t\tif ( nodeDef.isBone === true ) {\n\n\t\t\t\tnode = new Bone();\n\n\t\t\t} else if ( objects.length > 1 ) {\n\n\t\t\t\tnode = new Group();\n\n\t\t\t} else if ( objects.length === 1 ) {\n\n\t\t\t\tnode = objects[ 0 ];\n\n\t\t\t} else {\n\n\t\t\t\tnode = new Object3D();\n\n\t\t\t}\n\n\t\t\tif ( node !== objects[ 0 ] ) {\n\n\t\t\t\tfor ( let i = 0, il = objects.length; i < il; i ++ ) {\n\n\t\t\t\t\tnode.add( objects[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( nodeDef.name ) {\n\n\t\t\t\tnode.userData.name = nodeDef.name;\n\t\t\t\tnode.name = nodeName;\n\n\t\t\t}\n\n\t\t\tassignExtrasToUserData( node, nodeDef );\n\n\t\t\tif ( nodeDef.extensions ) addUnknownExtensionsToUserData( extensions, node, nodeDef );\n\n\t\t\tif ( nodeDef.matrix !== undefined ) {\n\n\t\t\t\tconst matrix = new Matrix4();\n\t\t\t\tmatrix.fromArray( nodeDef.matrix );\n\t\t\t\tnode.applyMatrix4( matrix );\n\n\t\t\t} else {\n\n\t\t\t\tif ( nodeDef.translation !== undefined ) {\n\n\t\t\t\t\tnode.position.fromArray( nodeDef.translation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.rotation !== undefined ) {\n\n\t\t\t\t\tnode.quaternion.fromArray( nodeDef.rotation );\n\n\t\t\t\t}\n\n\t\t\t\tif ( nodeDef.scale !== undefined ) {\n\n\t\t\t\t\tnode.scale.fromArray( nodeDef.scale );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ! parser.associations.has( node ) ) {\n\n\t\t\t\tparser.associations.set( node, {} );\n\n\t\t\t} else if ( nodeDef.mesh !== undefined && parser.meshCache.refs[ nodeDef.mesh ] > 1 ) {\n\n\t\t\t\tconst mapping = parser.associations.get( node );\n\t\t\t\tparser.associations.set( node, { ...mapping } );\n\n\t\t\t}\n\n\t\t\tparser.associations.get( node ).nodes = nodeIndex;\n\n\t\t\treturn node;\n\n\t\t} );\n\n\t\treturn this.nodeCache[ nodeIndex ];\n\n\t}\n\n\t/**\n\t * Specification: https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#scenes\n\t *\n\t * @private\n\t * @param {number} sceneIndex\n\t * @return {Promise<Group>}\n\t */\n\tloadScene( sceneIndex ) {\n\n\t\tconst extensions = this.extensions;\n\t\tconst sceneDef = this.json.scenes[ sceneIndex ];\n\t\tconst parser = this;\n\n\t\t// Loader returns Group, not Scene.\n\t\t// See: https://github.com/mrdoob/three.js/issues/18342#issuecomment-578981172\n\t\tconst scene = new Group();\n\t\tif ( sceneDef.name ) scene.name = parser.createUniqueName( sceneDef.name );\n\n\t\tassignExtrasToUserData( scene, sceneDef );\n\n\t\tif ( sceneDef.extensions ) addUnknownExtensionsToUserData( extensions, scene, sceneDef );\n\n\t\tconst nodeIds = sceneDef.nodes || [];\n\n\t\tconst pending = [];\n\n\t\tfor ( let i = 0, il = nodeIds.length; i < il; i ++ ) {\n\n\t\t\tpending.push( parser.getDependency( 'node', nodeIds[ i ] ) );\n\n\t\t}\n\n\t\treturn Promise.all( pending ).then( function ( nodes ) {\n\n\t\t\tfor ( let i = 0, il = nodes.length; i < il; i ++ ) {\n\n\t\t\t\tscene.add( nodes[ i ] );\n\n\t\t\t}\n\n\t\t\t// Removes dangling associations, associations that reference a node that\n\t\t\t// didn't make it into the scene.\n\t\t\tconst reduceAssociations = ( node ) => {\n\n\t\t\t\tconst reducedAssociations = new Map();\n\n\t\t\t\tfor ( const [ key, value ] of parser.associations ) {\n\n\t\t\t\t\tif ( key instanceof Material || key instanceof Texture ) {\n\n\t\t\t\t\t\treducedAssociations.set( key, value );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tnode.traverse( ( node ) => {\n\n\t\t\t\t\tconst mappings = parser.associations.get( node );\n\n\t\t\t\t\tif ( mappings != null ) {\n\n\t\t\t\t\t\treducedAssociations.set( node, mappings );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\treturn reducedAssociations;\n\n\t\t\t};\n\n\t\t\tparser.associations = reduceAssociations( scene );\n\n\t\t\treturn scene;\n\n\t\t} );\n\n\t}\n\n\t_createAnimationTracks( node, inputAccessor, outputAccessor, sampler, target ) {\n\n\t\tconst tracks = [];\n\n\t\tconst targetName = node.name ? node.name : node.uuid;\n\t\tconst targetNames = [];\n\n\t\tif ( PATH_PROPERTIES[ target.path ] === PATH_PROPERTIES.weights ) {\n\n\t\t\tnode.traverse( function ( object ) {\n\n\t\t\t\tif ( object.morphTargetInfluences ) {\n\n\t\t\t\t\ttargetNames.push( object.name ? object.name : object.uuid );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\ttargetNames.push( targetName );\n\n\t\t}\n\n\t\tlet TypedKeyframeTrack;\n\n\t\tswitch ( PATH_PROPERTIES[ target.path ] ) {\n\n\t\t\tcase PATH_PROPERTIES.weights:\n\n\t\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tcase PATH_PROPERTIES.rotation:\n\n\t\t\t\tTypedKeyframeTrack = QuaternionKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tcase PATH_PROPERTIES.translation:\n\t\t\tcase PATH_PROPERTIES.scale:\n\n\t\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tswitch ( outputAccessor.itemSize ) {\n\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\tTypedKeyframeTrack = NumberKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\tcase 3:\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tTypedKeyframeTrack = VectorKeyframeTrack;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tconst interpolation = sampler.interpolation !== undefined ? INTERPOLATION[ sampler.interpolation ] : InterpolateLinear;\n\n\n\t\tconst outputArray = this._getArrayFromAccessor( outputAccessor );\n\n\t\tfor ( let j = 0, jl = targetNames.length; j < jl; j ++ ) {\n\n\t\t\tconst track = new TypedKeyframeTrack(\n\t\t\t\ttargetNames[ j ] + '.' + PATH_PROPERTIES[ target.path ],\n\t\t\t\tinputAccessor.array,\n\t\t\t\toutputArray,\n\t\t\t\tinterpolation\n\t\t\t);\n\n\t\t\t// Override interpolation with custom factory method.\n\t\t\tif ( sampler.interpolation === 'CUBICSPLINE' ) {\n\n\t\t\t\tthis._createCubicSplineTrackInterpolant( track );\n\n\t\t\t}\n\n\t\t\ttracks.push( track );\n\n\t\t}\n\n\t\treturn tracks;\n\n\t}\n\n\t_getArrayFromAccessor( accessor ) {\n\n\t\tlet outputArray = accessor.array;\n\n\t\tif ( accessor.normalized ) {\n\n\t\t\tconst scale = getNormalizedComponentScale( outputArray.constructor );\n\t\t\tconst scaled = new Float32Array( outputArray.length );\n\n\t\t\tfor ( let j = 0, jl = outputArray.length; j < jl; j ++ ) {\n\n\t\t\t\tscaled[ j ] = outputArray[ j ] * scale;\n\n\t\t\t}\n\n\t\t\toutputArray = scaled;\n\n\t\t}\n\n\t\treturn outputArray;\n\n\t}\n\n\t_createCubicSplineTrackInterpolant( track ) {\n\n\t\ttrack.createInterpolant = function InterpolantFactoryMethodGLTFCubicSpline( result ) {\n\n\t\t\t// A CUBICSPLINE keyframe in glTF has three output values for each input value,\n\t\t\t// representing inTangent, splineVertex, and outTangent. As a result, track.getValueSize()\n\t\t\t// must be divided by three to get the interpolant's sampleSize argument.\n\n\t\t\tconst interpolantType = ( this instanceof QuaternionKeyframeTrack ) ? GLTFCubicSplineQuaternionInterpolant : GLTFCubicSplineInterpolant;\n\n\t\t\treturn new interpolantType( this.times, this.values, this.getValueSize() / 3, result );\n\n\t\t};\n\n\t\t// Mark as CUBICSPLINE. `track.getInterpolation()` doesn't support custom interpolants.\n\t\ttrack.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline = true;\n\n\t}\n\n}\n\n/**\n *\n * @private\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n */\nfunction computeBounds( geometry, primitiveDef, parser ) {\n\n\tconst attributes = primitiveDef.attributes;\n\n\tconst box = new Box3();\n\n\tif ( attributes.POSITION !== undefined ) {\n\n\t\tconst accessor = parser.json.accessors[ attributes.POSITION ];\n\n\t\tconst min = accessor.min;\n\t\tconst max = accessor.max;\n\n\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\tbox.set(\n\t\t\t\tnew Vector3( min[ 0 ], min[ 1 ], min[ 2 ] ),\n\t\t\t\tnew Vector3( max[ 0 ], max[ 1 ], max[ 2 ] )\n\t\t\t);\n\n\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\tbox.min.multiplyScalar( boxScale );\n\t\t\t\tbox.max.multiplyScalar( boxScale );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\treturn;\n\n\t\t}\n\n\t} else {\n\n\t\treturn;\n\n\t}\n\n\tconst targets = primitiveDef.targets;\n\n\tif ( targets !== undefined ) {\n\n\t\tconst maxDisplacement = new Vector3();\n\t\tconst vector = new Vector3();\n\n\t\tfor ( let i = 0, il = targets.length; i < il; i ++ ) {\n\n\t\t\tconst target = targets[ i ];\n\n\t\t\tif ( target.POSITION !== undefined ) {\n\n\t\t\t\tconst accessor = parser.json.accessors[ target.POSITION ];\n\t\t\t\tconst min = accessor.min;\n\t\t\t\tconst max = accessor.max;\n\n\t\t\t\t// glTF requires 'min' and 'max', but VRM (which extends glTF) currently ignores that requirement.\n\n\t\t\t\tif ( min !== undefined && max !== undefined ) {\n\n\t\t\t\t\t// we need to get max of absolute components because target weight is [-1,1]\n\t\t\t\t\tvector.setX( Math.max( Math.abs( min[ 0 ] ), Math.abs( max[ 0 ] ) ) );\n\t\t\t\t\tvector.setY( Math.max( Math.abs( min[ 1 ] ), Math.abs( max[ 1 ] ) ) );\n\t\t\t\t\tvector.setZ( Math.max( Math.abs( min[ 2 ] ), Math.abs( max[ 2 ] ) ) );\n\n\n\t\t\t\t\tif ( accessor.normalized ) {\n\n\t\t\t\t\t\tconst boxScale = getNormalizedComponentScale( WEBGL_COMPONENT_TYPES[ accessor.componentType ] );\n\t\t\t\t\t\tvector.multiplyScalar( boxScale );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Note: this assumes that the sum of all weights is at most 1. This isn't quite correct - it's more conservative\n\t\t\t\t\t// to assume that each target can have a max weight of 1. However, for some use cases - notably, when morph targets\n\t\t\t\t\t// are used to implement key-frame animations and as such only two are active at a time - this results in very large\n\t\t\t\t\t// boxes. So for now we make a box that's sometimes a touch too small but is hopefully mostly of reasonable size.\n\t\t\t\t\tmaxDisplacement.max( vector );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( 'THREE.GLTFLoader: Missing min/max properties for accessor POSITION.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// As per comment above this box isn't conservative, but has a reasonable size for a very large number of morph targets.\n\t\tbox.expandByVector( maxDisplacement );\n\n\t}\n\n\tgeometry.boundingBox = box;\n\n\tconst sphere = new Sphere();\n\n\tbox.getCenter( sphere.center );\n\tsphere.radius = box.min.distanceTo( box.max ) / 2;\n\n\tgeometry.boundingSphere = sphere;\n\n}\n\n/**\n *\n * @private\n * @param {BufferGeometry} geometry\n * @param {GLTF.Primitive} primitiveDef\n * @param {GLTFParser} parser\n * @return {Promise<BufferGeometry>}\n */\nfunction addPrimitiveAttributes( geometry, primitiveDef, parser ) {\n\n\tconst attributes = primitiveDef.attributes;\n\n\tconst pending = [];\n\n\tfunction assignAttributeAccessor( accessorIndex, attributeName ) {\n\n\t\treturn parser.getDependency( 'accessor', accessorIndex )\n\t\t\t.then( function ( accessor ) {\n\n\t\t\t\tgeometry.setAttribute( attributeName, accessor );\n\n\t\t\t} );\n\n\t}\n\n\tfor ( const gltfAttributeName in attributes ) {\n\n\t\tconst threeAttributeName = ATTRIBUTES[ gltfAttributeName ] || gltfAttributeName.toLowerCase();\n\n\t\t// Skip attributes already provided by e.g. Draco extension.\n\t\tif ( threeAttributeName in geometry.attributes ) continue;\n\n\t\tpending.push( assignAttributeAccessor( attributes[ gltfAttributeName ], threeAttributeName ) );\n\n\t}\n\n\tif ( primitiveDef.indices !== undefined && ! geometry.index ) {\n\n\t\tconst accessor = parser.getDependency( 'accessor', primitiveDef.indices ).then( function ( accessor ) {\n\n\t\t\tgeometry.setIndex( accessor );\n\n\t\t} );\n\n\t\tpending.push( accessor );\n\n\t}\n\n\tif ( ColorManagement.workingColorSpace !== LinearSRGBColorSpace && 'COLOR_0' in attributes ) {\n\n\t\tconsole.warn( `THREE.GLTFLoader: Converting vertex colors from \"srgb-linear\" to \"${ColorManagement.workingColorSpace}\" not supported.` );\n\n\t}\n\n\tassignExtrasToUserData( geometry, primitiveDef );\n\n\tcomputeBounds( geometry, primitiveDef, parser );\n\n\treturn Promise.all( pending ).then( function () {\n\n\t\treturn primitiveDef.targets !== undefined\n\t\t\t? addMorphTargets( geometry, primitiveDef.targets, parser )\n\t\t\t: geometry;\n\n\t} );\n\n}\n\n/**\n * Loader result of `GLTFLoader`.\n *\n * @typedef {Object} GLTFLoader~LoadObject\n * @property {Array<AnimationClip>} animations - An array of animation clips.\n * @property {Object} asset - Meta data about the loaded asset.\n * @property {Array<Camera>} cameras - An array of cameras.\n * @property {GLTFParser} parser - A reference to the internal parser.\n * @property {Group} scene - The default scene.\n * @property {Array<Group>} scenes - glTF assets might define multiple scenes.\n * @property {Object} userData - Additional data.\n **/\n\nexport { GLTFLoader };\n", "import {\n\tDataTextureLoader,\n\tDataUtils,\n\tFloatType,\n\tHalfFloatType,\n\tLinearFilter,\n\tLinearSRGBColorSpace\n} from 'three';\n\n/**\n * A loader for the RGBE HDR texture format.\n *\n * ```js\n * const loader = new HDRLoader();\n * const envMap = await loader.loadAsync( 'textures/equirectangular/blouberg_sunrise_2_1k.hdr' );\n * envMap.mapping = THREE.EquirectangularReflectionMapping;\n *\n * scene.environment = envMap;\n * ```\n *\n * @augments DataTextureLoader\n * @three_import import { HDRLoader } from 'three/addons/loaders/HDRLoader.js';\n */\nclass HDRLoader extends DataTextureLoader {\n\n\t/**\n     * Constructs a new RGBE/HDR loader.\n     *\n     * @param {LoadingManager} [manager] - The loading manager.\n     */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n         * The texture type.\n         *\n         * @type {(HalfFloatType|FloatType)}\n         * @default HalfFloatType\n         */\n\t\tthis.type = HalfFloatType;\n\n\t}\n\n\t/**\n     * Parses the given RGBE texture data.\n     *\n     * @param {ArrayBuffer} buffer - The raw texture data.\n     * @return {DataTextureLoader~TexData} An object representing the parsed texture data.\n     */\n\tparse( buffer ) {\n\n\t\t// adapted from http://www.graphics.cornell.edu/~bjw/rgbe.html\n\n\t\tconst\n\t\t\t/* default error routine.  change this to change error handling */\n\t\t\trgbe_read_error = 1,\n\t\t\trgbe_write_error = 2,\n\t\t\trgbe_format_error = 3,\n\t\t\trgbe_memory_error = 4,\n\t\t\trgbe_error = function ( rgbe_error_code, msg ) {\n\n\t\t\t\tswitch ( rgbe_error_code ) {\n\n\t\t\t\t\tcase rgbe_read_error: throw new Error( 'THREE.HDRLoader: Read Error: ' + ( msg || '' ) );\n\t\t\t\t\tcase rgbe_write_error: throw new Error( 'THREE.HDRLoader: Write Error: ' + ( msg || '' ) );\n\t\t\t\t\tcase rgbe_format_error: throw new Error( 'THREE.HDRLoader: Bad File Format: ' + ( msg || '' ) );\n\t\t\t\t\tdefault:\n\t\t\t\t\tcase rgbe_memory_error: throw new Error( 'THREE.HDRLoader: Memory Error: ' + ( msg || '' ) );\n\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\t/* offsets to red, green, and blue components in a data (float) pixel */\n\t\t\t//RGBE_DATA_RED = 0,\n\t\t\t//RGBE_DATA_GREEN = 1,\n\t\t\t//RGBE_DATA_BLUE = 2,\n\n\t\t\t/* number of floats per pixel, use 4 since stored in rgba image format */\n\t\t\t//RGBE_DATA_SIZE = 4,\n\n\t\t\t/* flags indicating which fields in an rgbe_header_info are valid */\n\t\t\tRGBE_VALID_PROGRAMTYPE = 1,\n\t\t\tRGBE_VALID_FORMAT = 2,\n\t\t\tRGBE_VALID_DIMENSIONS = 4,\n\n\t\t\tNEWLINE = '\\n',\n\n\t\t\tfgets = function ( buffer, lineLimit, consume ) {\n\n\t\t\t\tconst chunkSize = 128;\n\n\t\t\t\tlineLimit = ! lineLimit ? 1024 : lineLimit;\n\t\t\t\tlet p = buffer.pos,\n\t\t\t\t\ti = - 1, len = 0, s = '',\n\t\t\t\t\tchunk = String.fromCharCode.apply( null, new Uint16Array( buffer.subarray( p, p + chunkSize ) ) );\n\n\t\t\t\twhile ( ( 0 > ( i = chunk.indexOf( NEWLINE ) ) ) && ( len < lineLimit ) && ( p < buffer.byteLength ) ) {\n\n\t\t\t\t\ts += chunk; len += chunk.length;\n\t\t\t\t\tp += chunkSize;\n\t\t\t\t\tchunk += String.fromCharCode.apply( null, new Uint16Array( buffer.subarray( p, p + chunkSize ) ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( - 1 < i ) {\n\n\t\t\t\t\t/*for (i=l-1; i>=0; i--) {\n                        byteCode = m.charCodeAt(i);\n                        if (byteCode > 0x7f && byteCode <= 0x7ff) byteLen++;\n                        else if (byteCode > 0x7ff && byteCode <= 0xffff) byteLen += 2;\n                        if (byteCode >= 0xDC00 && byteCode <= 0xDFFF) i--; //trail surrogate\n                    }*/\n\t\t\t\t\tif ( false !== consume ) buffer.pos += len + i + 1;\n\t\t\t\t\treturn s + chunk.slice( 0, i );\n\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\n\t\t\t},\n\n\t\t\t/* minimal header reading.  modify if you want to parse more information */\n\t\t\tRGBE_ReadHeader = function ( buffer ) {\n\n\n\t\t\t\t// regexes to parse header info fields\n\t\t\t\tconst magic_token_re = /^#\\?(\\S+)/,\n\t\t\t\t\tgamma_re = /^\\s*GAMMA\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n\t\t\t\t\texposure_re = /^\\s*EXPOSURE\\s*=\\s*(\\d+(\\.\\d+)?)\\s*$/,\n\t\t\t\t\tformat_re = /^\\s*FORMAT=(\\S+)\\s*$/,\n\t\t\t\t\tdimensions_re = /^\\s*\\-Y\\s+(\\d+)\\s+\\+X\\s+(\\d+)\\s*$/,\n\n\t\t\t\t\t// RGBE format header struct\n\t\t\t\t\theader = {\n\n\t\t\t\t\t\tvalid: 0, /* indicate which fields are valid */\n\n\t\t\t\t\t\tstring: '', /* the actual header string */\n\n\t\t\t\t\t\tcomments: '', /* comments found in header */\n\n\t\t\t\t\t\tprogramtype: 'RGBE', /* listed at beginning of file to identify it after \"#?\". defaults to \"RGBE\" */\n\n\t\t\t\t\t\tformat: '', /* RGBE format, default 32-bit_rle_rgbe */\n\n\t\t\t\t\t\tgamma: 1.0, /* image has already been gamma corrected with given gamma. defaults to 1.0 (no correction) */\n\n\t\t\t\t\t\texposure: 1.0, /* a value of 1.0 in an image corresponds to <exposure> watts/steradian/m^2. defaults to 1.0 */\n\n\t\t\t\t\t\twidth: 0, height: 0 /* image dimensions, width/height */\n\n\t\t\t\t\t};\n\n\t\t\t\tlet line, match;\n\n\t\t\t\tif ( buffer.pos >= buffer.byteLength || ! ( line = fgets( buffer ) ) ) {\n\n\t\t\t\t\trgbe_error( rgbe_read_error, 'no header found' );\n\n\t\t\t\t}\n\n\t\t\t\t/* if you want to require the magic token then uncomment the next line */\n\t\t\t\tif ( ! ( match = line.match( magic_token_re ) ) ) {\n\n\t\t\t\t\trgbe_error( rgbe_format_error, 'bad initial token' );\n\n\t\t\t\t}\n\n\t\t\t\theader.valid |= RGBE_VALID_PROGRAMTYPE;\n\t\t\t\theader.programtype = match[ 1 ];\n\t\t\t\theader.string += line + '\\n';\n\n\t\t\t\twhile ( true ) {\n\n\t\t\t\t\tline = fgets( buffer );\n\t\t\t\t\tif ( false === line ) break;\n\t\t\t\t\theader.string += line + '\\n';\n\n\t\t\t\t\tif ( '#' === line.charAt( 0 ) ) {\n\n\t\t\t\t\t\theader.comments += line + '\\n';\n\t\t\t\t\t\tcontinue; // comment line\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( gamma_re ) ) {\n\n\t\t\t\t\t\theader.gamma = parseFloat( match[ 1 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( exposure_re ) ) {\n\n\t\t\t\t\t\theader.exposure = parseFloat( match[ 1 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( format_re ) ) {\n\n\t\t\t\t\t\theader.valid |= RGBE_VALID_FORMAT;\n\t\t\t\t\t\theader.format = match[ 1 ];//'32-bit_rle_rgbe';\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( match = line.match( dimensions_re ) ) {\n\n\t\t\t\t\t\theader.valid |= RGBE_VALID_DIMENSIONS;\n\t\t\t\t\t\theader.height = parseInt( match[ 1 ], 10 );\n\t\t\t\t\t\theader.width = parseInt( match[ 2 ], 10 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ( header.valid & RGBE_VALID_FORMAT ) && ( header.valid & RGBE_VALID_DIMENSIONS ) ) break;\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! ( header.valid & RGBE_VALID_FORMAT ) ) {\n\n\t\t\t\t\trgbe_error( rgbe_format_error, 'missing format specifier' );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! ( header.valid & RGBE_VALID_DIMENSIONS ) ) {\n\n\t\t\t\t\trgbe_error( rgbe_format_error, 'missing image size specifier' );\n\n\t\t\t\t}\n\n\t\t\t\treturn header;\n\n\t\t\t},\n\n\t\t\tRGBE_ReadPixels_RLE = function ( buffer, w, h ) {\n\n\t\t\t\tconst scanline_width = w;\n\n\t\t\t\tif (\n\t\t\t\t// run length encoding is not allowed so read flat\n\t\t\t\t\t( ( scanline_width < 8 ) || ( scanline_width > 0x7fff ) ) ||\n                    // this file is not run length encoded\n                    ( ( 2 !== buffer[ 0 ] ) || ( 2 !== buffer[ 1 ] ) || ( buffer[ 2 ] & 0x80 ) )\n\t\t\t\t) {\n\n\t\t\t\t\t// return the flat buffer\n\t\t\t\t\treturn new Uint8Array( buffer );\n\n\t\t\t\t}\n\n\t\t\t\tif ( scanline_width !== ( ( buffer[ 2 ] << 8 ) | buffer[ 3 ] ) ) {\n\n\t\t\t\t\trgbe_error( rgbe_format_error, 'wrong scanline width' );\n\n\t\t\t\t}\n\n\t\t\t\tconst data_rgba = new Uint8Array( 4 * w * h );\n\n\t\t\t\tif ( ! data_rgba.length ) {\n\n\t\t\t\t\trgbe_error( rgbe_memory_error, 'unable to allocate buffer space' );\n\n\t\t\t\t}\n\n\t\t\t\tlet offset = 0, pos = 0;\n\n\t\t\t\tconst ptr_end = 4 * scanline_width;\n\t\t\t\tconst rgbeStart = new Uint8Array( 4 );\n\t\t\t\tconst scanline_buffer = new Uint8Array( ptr_end );\n\t\t\t\tlet num_scanlines = h;\n\n\t\t\t\t// read in each successive scanline\n\t\t\t\twhile ( ( num_scanlines > 0 ) && ( pos < buffer.byteLength ) ) {\n\n\t\t\t\t\tif ( pos + 4 > buffer.byteLength ) {\n\n\t\t\t\t\t\trgbe_error( rgbe_read_error );\n\n\t\t\t\t\t}\n\n\t\t\t\t\trgbeStart[ 0 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 1 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 2 ] = buffer[ pos ++ ];\n\t\t\t\t\trgbeStart[ 3 ] = buffer[ pos ++ ];\n\n\t\t\t\t\tif ( ( 2 != rgbeStart[ 0 ] ) || ( 2 != rgbeStart[ 1 ] ) || ( ( ( rgbeStart[ 2 ] << 8 ) | rgbeStart[ 3 ] ) != scanline_width ) ) {\n\n\t\t\t\t\t\trgbe_error( rgbe_format_error, 'bad rgbe scanline format' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// read each of the four channels for the scanline into the buffer\n\t\t\t\t\t// first red, then green, then blue, then exponent\n\t\t\t\t\tlet ptr = 0, count;\n\n\t\t\t\t\twhile ( ( ptr < ptr_end ) && ( pos < buffer.byteLength ) ) {\n\n\t\t\t\t\t\tcount = buffer[ pos ++ ];\n\t\t\t\t\t\tconst isEncodedRun = count > 128;\n\t\t\t\t\t\tif ( isEncodedRun ) count -= 128;\n\n\t\t\t\t\t\tif ( ( 0 === count ) || ( ptr + count > ptr_end ) ) {\n\n\t\t\t\t\t\t\trgbe_error( rgbe_format_error, 'bad scanline data' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( isEncodedRun ) {\n\n\t\t\t\t\t\t\t// a (encoded) run of the same value\n\t\t\t\t\t\t\tconst byteValue = buffer[ pos ++ ];\n\t\t\t\t\t\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\t\t\t\t\t\tscanline_buffer[ ptr ++ ] = byteValue;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t//ptr += count;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// a literal-run\n\t\t\t\t\t\t\tscanline_buffer.set( buffer.subarray( pos, pos + count ), ptr );\n\t\t\t\t\t\t\tptr += count; pos += count;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\t// now convert data from buffer into rgba\n\t\t\t\t\t// first red, then green, then blue, then exponent (alpha)\n\t\t\t\t\tconst l = scanline_width; //scanline_buffer.byteLength;\n\t\t\t\t\tfor ( let i = 0; i < l; i ++ ) {\n\n\t\t\t\t\t\tlet off = 0;\n\t\t\t\t\t\tdata_rgba[ offset ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 1 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 2 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toff += scanline_width; //1;\n\t\t\t\t\t\tdata_rgba[ offset + 3 ] = scanline_buffer[ i + off ];\n\t\t\t\t\t\toffset += 4;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tnum_scanlines --;\n\n\t\t\t\t}\n\n\t\t\t\treturn data_rgba;\n\n\t\t\t};\n\n\t\tconst RGBEByteToRGBFloat = function ( sourceArray, sourceOffset, destArray, destOffset ) {\n\n\t\t\tconst e = sourceArray[ sourceOffset + 3 ];\n\t\t\tconst scale = Math.pow( 2.0, e - 128.0 ) / 255.0;\n\n\t\t\tdestArray[ destOffset + 0 ] = sourceArray[ sourceOffset + 0 ] * scale;\n\t\t\tdestArray[ destOffset + 1 ] = sourceArray[ sourceOffset + 1 ] * scale;\n\t\t\tdestArray[ destOffset + 2 ] = sourceArray[ sourceOffset + 2 ] * scale;\n\t\t\tdestArray[ destOffset + 3 ] = 1;\n\n\t\t};\n\n\t\tconst RGBEByteToRGBHalf = function ( sourceArray, sourceOffset, destArray, destOffset ) {\n\n\t\t\tconst e = sourceArray[ sourceOffset + 3 ];\n\t\t\tconst scale = Math.pow( 2.0, e - 128.0 ) / 255.0;\n\n\t\t\t// clamping to 65504, the maximum representable value in float16\n\t\t\tdestArray[ destOffset + 0 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 0 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 1 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 1 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 2 ] = DataUtils.toHalfFloat( Math.min( sourceArray[ sourceOffset + 2 ] * scale, 65504 ) );\n\t\t\tdestArray[ destOffset + 3 ] = DataUtils.toHalfFloat( 1 );\n\n\t\t};\n\n\t\tconst byteArray = new Uint8Array( buffer );\n\t\tbyteArray.pos = 0;\n\t\tconst rgbe_header_info = RGBE_ReadHeader( byteArray );\n\n\t\tconst w = rgbe_header_info.width,\n\t\t\th = rgbe_header_info.height,\n\t\t\timage_rgba_data = RGBE_ReadPixels_RLE( byteArray.subarray( byteArray.pos ), w, h );\n\n\n\t\tlet data, type;\n\t\tlet numElements;\n\n\t\tswitch ( this.type ) {\n\n\t\t\tcase FloatType:\n\n\t\t\t\tnumElements = image_rgba_data.length / 4;\n\t\t\t\tconst floatArray = new Float32Array( numElements * 4 );\n\n\t\t\t\tfor ( let j = 0; j < numElements; j ++ ) {\n\n\t\t\t\t\tRGBEByteToRGBFloat( image_rgba_data, j * 4, floatArray, j * 4 );\n\n\t\t\t\t}\n\n\t\t\t\tdata = floatArray;\n\t\t\t\ttype = FloatType;\n\t\t\t\tbreak;\n\n\t\t\tcase HalfFloatType:\n\n\t\t\t\tnumElements = image_rgba_data.length / 4;\n\t\t\t\tconst halfArray = new Uint16Array( numElements * 4 );\n\n\t\t\t\tfor ( let j = 0; j < numElements; j ++ ) {\n\n\t\t\t\t\tRGBEByteToRGBHalf( image_rgba_data, j * 4, halfArray, j * 4 );\n\n\t\t\t\t}\n\n\t\t\t\tdata = halfArray;\n\t\t\t\ttype = HalfFloatType;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\n\t\t\t\tthrow new Error( 'THREE.HDRLoader: Unsupported type: ' + this.type );\n\n\t\t}\n\n\t\treturn {\n\t\t\twidth: w, height: h,\n\t\t\tdata: data,\n\t\t\theader: rgbe_header_info.string,\n\t\t\tgamma: rgbe_header_info.gamma,\n\t\t\texposure: rgbe_header_info.exposure,\n\t\t\ttype: type\n\t\t};\n\n\t}\n\n\t/**\n     * Sets the texture type.\n     *\n     * @param {(HalfFloatType|FloatType)} value - The texture type to set.\n     * @return {HDRLoader} A reference to this loader.\n     */\n\tsetDataType( value ) {\n\n\t\tthis.type = value;\n\t\treturn this;\n\n\t}\n\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tfunction onLoadCallback( texture, texData ) {\n\n\t\t\tswitch ( texture.type ) {\n\n\t\t\t\tcase FloatType:\n\t\t\t\tcase HalfFloatType:\n\n\t\t\t\t\ttexture.colorSpace = LinearSRGBColorSpace;\n\t\t\t\t\ttexture.minFilter = LinearFilter;\n\t\t\t\t\ttexture.magFilter = LinearFilter;\n\t\t\t\t\ttexture.generateMipmaps = false;\n\t\t\t\t\ttexture.flipY = true;\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t}\n\n\t\treturn super.load( url, onLoadCallback, onProgress, onError );\n\n\t}\n\n}\n\nexport { HDRLoader };\n\n\n", "import {\n\tCubeTexture,\n\tDataTexture,\n\tFileLoader,\n\tFloatType,\n\tHalfFloatType,\n\tLinearFilter,\n\tLinearSRGBColorSpace,\n\tLoader\n} from 'three';\nimport { HDRLoader } from '../loaders/HDRLoader.js';\n\n/**\n * A loader for loading HDR cube textures.\n *\n * ```js\n * const loader = new HDRCubeTextureLoader();\n * loader.setPath( 'textures/cube/pisaHDR/' );\n * const cubeTexture = await loader.loadAsync( [ 'px.hdr', 'nx.hdr', 'py.hdr', 'ny.hdr', 'pz.hdr', 'nz.hdr' ] );\n *\n * scene.background = cubeTexture;\n * scene.environment = cubeTexture;\n * ```\n *\n * @augments Loader\n * @three_import import { HDRCubeTextureLoader } from 'three/addons/loaders/HDRCubeTextureLoader.js';\n */\nclass HDRCubeTextureLoader extends Loader {\n\n\t/**\n\t * Constructs a new HDR cube texture loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * The internal HDR loader that loads the\n\t\t * individual textures for each cube face.\n\t\t *\n         * @type {HDRLoader}\n\t\t */\n\t\tthis.hdrLoader = new HDRLoader();\n\n\t\t/**\n\t\t * The texture type.\n\t\t *\n\t\t * @type {(HalfFloatType|FloatType)}\n\t\t * @default HalfFloatType\n\t\t */\n\t\tthis.type = HalfFloatType;\n\n\t}\n\n\t/**\n\t * Starts loading from the given URLs and passes the loaded HDR cube texture\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {Array<string>} urls - The paths/URLs of the files to be loaded. This can also be a data URIs.\n\t * @param {function(CubeTexture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {CubeTexture} The HDR cube texture.\n\t */\n\tload( urls, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new CubeTexture();\n\n\t\ttexture.type = this.type;\n\n\t\tswitch ( texture.type ) {\n\n\t\t\tcase FloatType:\n\n\t\t\t\ttexture.colorSpace = LinearSRGBColorSpace;\n\t\t\t\ttexture.minFilter = LinearFilter;\n\t\t\t\ttexture.magFilter = LinearFilter;\n\t\t\t\ttexture.generateMipmaps = false;\n\t\t\t\tbreak;\n\n\t\t\tcase HalfFloatType:\n\n\t\t\t\ttexture.colorSpace = LinearSRGBColorSpace;\n\t\t\t\ttexture.minFilter = LinearFilter;\n\t\t\t\ttexture.magFilter = LinearFilter;\n\t\t\t\ttexture.generateMipmaps = false;\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tconst scope = this;\n\n\t\tlet loaded = 0;\n\n\t\tfunction loadHDRData( i, onLoad, onProgress, onError ) {\n\n\t\t\tnew FileLoader( scope.manager )\n\t\t\t\t.setPath( scope.path )\n\t\t\t\t.setResponseType( 'arraybuffer' )\n\t\t\t\t.setWithCredentials( scope.withCredentials )\n\t\t\t\t.load( urls[ i ], function ( buffer ) {\n\n\t\t\t\t\tloaded ++;\n\n\t\t\t\t\tconst texData = scope.hdrLoader.parse( buffer );\n\n\t\t\t\t\tif ( ! texData ) return;\n\n\t\t\t\t\tif ( texData.data !== undefined ) {\n\n\t\t\t\t\t\tconst dataTexture = new DataTexture( texData.data, texData.width, texData.height );\n\n\t\t\t\t\t\tdataTexture.type = texture.type;\n\t\t\t\t\t\tdataTexture.colorSpace = texture.colorSpace;\n\t\t\t\t\t\tdataTexture.format = texture.format;\n\t\t\t\t\t\tdataTexture.minFilter = texture.minFilter;\n\t\t\t\t\t\tdataTexture.magFilter = texture.magFilter;\n\t\t\t\t\t\tdataTexture.generateMipmaps = texture.generateMipmaps;\n\n\t\t\t\t\t\ttexture.images[ i ] = dataTexture;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( loaded === 6 ) {\n\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\t\t\t\t\t\tif ( onLoad ) onLoad( texture );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, onProgress, onError );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < urls.length; i ++ ) {\n\n\t\t\tloadHDRData( i, onLoad, onProgress, onError );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\t/**\n\t * Sets the texture type.\n\t *\n     * @param {(HalfFloatType|FloatType)} value - The texture type to set.\n     * @return {HDRCubeTextureLoader} A reference to this loader.\n\t */\n\tsetDataType( value ) {\n\n\t\tthis.type = value;\n\t\tthis.hdrLoader.setDataType( value );\n\n\t\treturn this;\n\n\t}\n\n}\n\nexport { HDRCubeTextureLoader };\n", "import {\n\tDataTexture,\n\tFileLoader,\n\tFloatType,\n\tRedFormat,\n\tMathUtils,\n\tLoader,\n\tUnsignedByteType,\n\tLinearFilter,\n\tHalfFloatType,\n\tDataUtils\n} from 'three';\n\n/**\n * A loader for the IES format.\n *\n * The loaded texture should be assigned to {@link IESSpotLight#map}.\n *\n * ```js\n * const loader = new IESLoader();\n * const texture = await loader.loadAsync( 'ies/007cfb11e343e2f42e3b476be4ab684e.ies' );\n *\n * const spotLight = new THREE.IESSpotLight( 0xff0000, 500 );\n * spotLight.iesMap = texture;\n * ```\n *\n * @augments Loader\n * @three_import import { IESLoader } from 'three/addons/loaders/IESLoader.js';\n */\nclass IESLoader extends Loader {\n\n\t/**\n\t * Constructs a new IES loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * The texture type.\n\t\t *\n\t\t * @type {(HalfFloatType|FloatType)}\n\t\t * @default HalfFloatType\n\t\t */\n\t\tthis.type = HalfFloatType;\n\n\t}\n\n\t_getIESValues( iesLamp, type ) {\n\n\t\tconst width = 360;\n\t\tconst height = 180;\n\t\tconst size = width * height;\n\n\t\tconst data = new Array( size );\n\n\t\tfunction interpolateCandelaValues( phi, theta ) {\n\n\t\t\tlet phiIndex = 0, thetaIndex = 0;\n\t\t\tlet startTheta = 0, endTheta = 0, startPhi = 0, endPhi = 0;\n\n\t\t\tfor ( let i = 0; i < iesLamp.numHorAngles - 1; ++ i ) { // numHorAngles = horAngles.length-1 because of extra padding, so this wont cause an out of bounds error\n\n\t\t\t\tif ( theta < iesLamp.horAngles[ i + 1 ] || i == iesLamp.numHorAngles - 2 ) {\n\n\t\t\t\t\tthetaIndex = i;\n\t\t\t\t\tstartTheta = iesLamp.horAngles[ i ];\n\t\t\t\t\tendTheta = iesLamp.horAngles[ i + 1 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < iesLamp.numVerAngles - 1; ++ i ) {\n\n\t\t\t\tif ( phi < iesLamp.verAngles[ i + 1 ] || i == iesLamp.numVerAngles - 2 ) {\n\n\t\t\t\t\tphiIndex = i;\n\t\t\t\t\tstartPhi = iesLamp.verAngles[ i ];\n\t\t\t\t\tendPhi = iesLamp.verAngles[ i + 1 ];\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst deltaTheta = endTheta - startTheta;\n\t\t\tconst deltaPhi = endPhi - startPhi;\n\n\t\t\tif ( deltaPhi === 0 ) // Outside range\n\t\t\t\treturn 0;\n\n\t\t\tconst t1 = deltaTheta === 0 ? 0 : ( theta - startTheta ) / deltaTheta;\n\t\t\tconst t2 = ( phi - startPhi ) / deltaPhi;\n\n\t\t\tconst nextThetaIndex = deltaTheta === 0 ? thetaIndex : thetaIndex + 1;\n\n\t\t\tconst v1 = MathUtils.lerp( iesLamp.candelaValues[ thetaIndex ][ phiIndex ], iesLamp.candelaValues[ nextThetaIndex ][ phiIndex ], t1 );\n\t\t\tconst v2 = MathUtils.lerp( iesLamp.candelaValues[ thetaIndex ][ phiIndex + 1 ], iesLamp.candelaValues[ nextThetaIndex ][ phiIndex + 1 ], t1 );\n\t\t\tconst v = MathUtils.lerp( v1, v2, t2 );\n\n\t\t\treturn v;\n\n\t\t}\n\n\t\tconst startTheta = iesLamp.horAngles[ 0 ], endTheta = iesLamp.horAngles[ iesLamp.numHorAngles - 1 ];\n\n\t\tfor ( let i = 0; i < size; ++ i ) {\n\n\t\t\tlet theta = i % width;\n\t\t\tconst phi = Math.floor( i / width );\n\n\t\t\tif ( endTheta - startTheta !== 0 && ( theta < startTheta || theta >= endTheta ) ) { // Handle symmetry for hor angles\n\n\t\t\t\ttheta %= endTheta * 2;\n\n\t\t\t\tif ( theta > endTheta )\n\t\t\t\t\ttheta = endTheta * 2 - theta;\n\n\t\t\t}\n\n\t\t\tdata[ phi + theta * height ] = interpolateCandelaValues( phi, theta );\n\n\t\t}\n\n\t\tlet result = null;\n\n\t\tif ( type === UnsignedByteType ) result = Uint8Array.from( data.map( v => Math.min( v * 0xFF, 0xFF ) ) );\n\t\telse if ( type === HalfFloatType ) result = Uint16Array.from( data.map( v => DataUtils.toHalfFloat( v ) ) );\n\t\telse if ( type === FloatType ) result = Float32Array.from( data );\n\t\telse console.error( 'IESLoader: Unsupported type:', type );\n\n\t\treturn result;\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded IES texture\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(DataTexture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'text' );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\n\t\tloader.load( url, text => {\n\n\t\t\tonLoad( this.parse( text ) );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given IES data.\n\t *\n\t * @param {string} text - The raw IES data.\n\t * @return {DataTexture} THE IES data as a texture.\n\t */\n\tparse( text ) {\n\n\t\tconst type = this.type;\n\n\t\tconst iesLamp = new IESLamp( text );\n\t\tconst data = this._getIESValues( iesLamp, type );\n\n\t\tconst texture = new DataTexture( data, 180, 1, RedFormat, type );\n\t\ttexture.minFilter = LinearFilter;\n\t\ttexture.magFilter = LinearFilter;\n\t\ttexture.needsUpdate = true;\n\n\t\treturn texture;\n\n\t}\n\n}\n\n\nfunction IESLamp( text ) {\n\n\tconst _self = this;\n\n\tconst textArray = text.split( '\\n' );\n\n\tlet lineNumber = 0;\n\tlet line;\n\n\t_self.verAngles = [ ];\n\t_self.horAngles = [ ];\n\n\t_self.candelaValues = [ ];\n\n\t_self.tiltData = { };\n\t_self.tiltData.angles = [ ];\n\t_self.tiltData.mulFactors = [ ];\n\n\tfunction textToArray( text ) {\n\n\t\ttext = text.replace( /^\\s+|\\s+$/g, '' ); // remove leading or trailing spaces\n\t\ttext = text.replace( /,/g, ' ' ); // replace commas with spaces\n\t\ttext = text.replace( /\\s\\s+/g, ' ' ); // replace white space/tabs etc by single whitespace\n\n\t\tconst array = text.split( ' ' );\n\n\t\treturn array;\n\n\t}\n\n\tfunction readArray( count, array ) {\n\n\t\twhile ( true ) {\n\n\t\t\tconst line = textArray[ lineNumber ++ ];\n\t\t\tconst lineData = textToArray( line );\n\n\t\t\tfor ( let i = 0; i < lineData.length; ++ i ) {\n\n\t\t\t\tarray.push( Number( lineData[ i ] ) );\n\n\t\t\t}\n\n\t\t\tif ( array.length === count )\n\t\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tfunction readTilt() {\n\n\t\tlet line = textArray[ lineNumber ++ ];\n\t\tlet lineData = textToArray( line );\n\n\t\t_self.tiltData.lampToLumGeometry = Number( lineData[ 0 ] );\n\n\t\tline = textArray[ lineNumber ++ ];\n\t\tlineData = textToArray( line );\n\n\t\t_self.tiltData.numAngles = Number( lineData[ 0 ] );\n\n\t\treadArray( _self.tiltData.numAngles, _self.tiltData.angles );\n\t\treadArray( _self.tiltData.numAngles, _self.tiltData.mulFactors );\n\n\t}\n\n\tfunction readLampValues() {\n\n\t\tconst values = [ ];\n\t\treadArray( 10, values );\n\n\t\t_self.count = Number( values[ 0 ] );\n\t\t_self.lumens = Number( values[ 1 ] );\n\t\t_self.multiplier = Number( values[ 2 ] );\n\t\t_self.numVerAngles = Number( values[ 3 ] );\n\t\t_self.numHorAngles = Number( values[ 4 ] );\n\t\t_self.gonioType = Number( values[ 5 ] );\n\t\t_self.units = Number( values[ 6 ] );\n\t\t_self.width = Number( values[ 7 ] );\n\t\t_self.length = Number( values[ 8 ] );\n\t\t_self.height = Number( values[ 9 ] );\n\n\t}\n\n\tfunction readLampFactors() {\n\n\t\tconst values = [ ];\n\t\treadArray( 3, values );\n\n\t\t_self.ballFactor = Number( values[ 0 ] );\n\t\t_self.blpFactor = Number( values[ 1 ] );\n\t\t_self.inputWatts = Number( values[ 2 ] );\n\n\t}\n\n\twhile ( true ) {\n\n\t\tline = textArray[ lineNumber ++ ];\n\n\t\tif ( line.includes( 'TILT' ) ) {\n\n\t\t\tbreak;\n\n\t\t}\n\n\t}\n\n\tif ( ! line.includes( 'NONE' ) ) {\n\n\t\tif ( line.includes( 'INCLUDE' ) ) {\n\n\t\t\treadTilt();\n\n\t\t} else {\n\n\t\t\t// TODO:: Read tilt data from a file\n\n\t\t}\n\n\t}\n\n\treadLampValues();\n\n\treadLampFactors();\n\n\t// Initialize candela value array\n\tfor ( let i = 0; i < _self.numHorAngles; ++ i ) {\n\n\t\t_self.candelaValues.push( [ ] );\n\n\t}\n\n\t// Parse Angles\n\treadArray( _self.numVerAngles, _self.verAngles );\n\treadArray( _self.numHorAngles, _self.horAngles );\n\n\t// Parse Candela values\n\tfor ( let i = 0; i < _self.numHorAngles; ++ i ) {\n\n\t\treadArray( _self.numVerAngles, _self.candelaValues[ i ] );\n\n\t}\n\n\t// Calculate actual candela values, and normalize.\n\tfor ( let i = 0; i < _self.numHorAngles; ++ i ) {\n\n\t\tfor ( let j = 0; j < _self.numVerAngles; ++ j ) {\n\n\t\t\t_self.candelaValues[ i ][ j ] *= _self.candelaValues[ i ][ j ] * _self.multiplier\n\t\t\t\t* _self.ballFactor * _self.blpFactor;\n\n\t\t}\n\n\t}\n\n\tlet maxVal = - 1;\n\tfor ( let i = 0; i < _self.numHorAngles; ++ i ) {\n\n\t\tfor ( let j = 0; j < _self.numVerAngles; ++ j ) {\n\n\t\t\tconst value = _self.candelaValues[ i ][ j ];\n\t\t\tmaxVal = maxVal < value ? value : maxVal;\n\n\t\t}\n\n\t}\n\n\tconst bNormalize = true;\n\tif ( bNormalize && maxVal > 0 ) {\n\n\t\tfor ( let i = 0; i < _self.numHorAngles; ++ i ) {\n\n\t\t\tfor ( let j = 0; j < _self.numVerAngles; ++ j ) {\n\n\t\t\t\t_self.candelaValues[ i ][ j ] /= maxVal;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\n\nexport { IESLoader };\n", "import {\n\tFileLoader,\n\tGroup,\n\tLoader,\n\tLoadingManager\n} from 'three';\nimport { ColladaLoader } from '../loaders/ColladaLoader.js';\nimport * as fflate from '../libs/fflate.module.js';\n\n/**\n * A loader for the KMZ format.\n *\n * ```js\n * const loader = new KMZLoader();\n * const kmz = await loader.loadAsync( './models/kmz/Box.kmz' );\n *\n * scene.add( kmz.scene );\n * ```\n *\n * @augments Loader\n * @three_import import { KMZLoader } from 'three/addons/loaders/KMZLoader.js';\n */\nclass KMZLoader extends Loader {\n\n\t/**\n\t * Constructs a new KMZ loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded KMZ asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function({scene:Group})} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( text ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given KMZ data and returns an object holding the scene.\n\t *\n\t * @param {ArrayBuffer} data - The raw KMZ data as an array buffer.\n\t * @return {{scene:Group}} The parsed KMZ asset.\n\t */\n\tparse( data ) {\n\n\t\tfunction findFile( url ) {\n\n\t\t\tfor ( const path in zip ) {\n\n\t\t\t\tif ( path.slice( - url.length ) === url ) {\n\n\t\t\t\t\treturn zip[ path ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst manager = new LoadingManager();\n\t\tmanager.setURLModifier( function ( url ) {\n\n\t\t\tconst image = findFile( url );\n\n\t\t\tif ( image ) {\n\n\t\t\t\tconsole.log( 'Loading', url );\n\n\t\t\t\tconst blob = new Blob( [ image.buffer ], { type: 'application/octet-stream' } );\n\t\t\t\treturn URL.createObjectURL( blob );\n\n\t\t\t}\n\n\t\t\treturn url;\n\n\t\t} );\n\n\t\t//\n\n\t\tconst zip = fflate.unzipSync( new Uint8Array( data ) );\n\n\t\tif ( zip[ 'doc.kml' ] ) {\n\n\t\t\tconst xml = new DOMParser().parseFromString( fflate.strFromU8( zip[ 'doc.kml' ] ), 'application/xml' );\n\n\t\t\tconst model = xml.querySelector( 'Placemark Model Link href' );\n\n\t\t\tif ( model ) {\n\n\t\t\t\tconst loader = new ColladaLoader( manager );\n\t\t\t\treturn loader.parse( fflate.strFromU8( zip[ model.textContent ] ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'KMZLoader: Missing doc.kml file.' );\n\n\t\t\tfor ( const path in zip ) {\n\n\t\t\t\tconst extension = path.split( '.' ).pop().toLowerCase();\n\n\t\t\t\tif ( extension === 'dae' ) {\n\n\t\t\t\t\tconst loader = new ColladaLoader( manager );\n\t\t\t\t\treturn loader.parse( fflate.strFromU8( zip[ path ] ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconsole.error( 'KMZLoader: Couldn\\'t find .dae file.' );\n\t\treturn { scene: new Group() };\n\n\t}\n\n}\n\nexport { KMZLoader };\n", "/**\n * A simple pool for managing Web Workers.\n *\n * @three_import import { WorkerPool } from 'three/addons/utils/WorkerPool.js';\n */\nexport class WorkerPool {\n\n\t/**\n\t * Constructs a new Worker pool.\n\t *\n\t * @param {number} [pool=4] - The size of the pool.\n\t */\n\tconstructor( pool = 4 ) {\n\n\t\t/**\n\t\t * The size of the pool.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 4\n\t\t */\n\t\tthis.pool = pool;\n\n\t\t/**\n\t\t * A message queue.\n\t\t *\n\t\t * @type {Array<Object>}\n\t\t */\n\t\tthis.queue = [];\n\n\t\t/**\n\t\t * An array of Workers.\n\t\t *\n\t\t * @type {Array<Worker>}\n\t\t */\n\t\tthis.workers = [];\n\n\t\t/**\n\t\t * An array with resolve functions for messages.\n\t\t *\n\t\t * @type {Array<Function>}\n\t\t */\n\t\tthis.workersResolve = [];\n\n\t\t/**\n\t\t * The current worker status.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.workerStatus = 0;\n\n\t\t/**\n\t\t * A factory function for creating workers.\n\t\t *\n\t\t * @type {?Function}\n\t\t */\n\t\tthis.workerCreator = null;\n\n\t}\n\n\t_initWorker( workerId ) {\n\n\t\tif ( ! this.workers[ workerId ] ) {\n\n\t\t\tconst worker = this.workerCreator();\n\t\t\tworker.addEventListener( 'message', this._onMessage.bind( this, workerId ) );\n\t\t\tthis.workers[ workerId ] = worker;\n\n\t\t}\n\n\t}\n\n\t_getIdleWorker() {\n\n\t\tfor ( let i = 0; i < this.pool; i ++ )\n\t\t\tif ( ! ( this.workerStatus & ( 1 << i ) ) ) return i;\n\n\t\treturn - 1;\n\n\t}\n\n\t_onMessage( workerId, msg ) {\n\n\t\tconst resolve = this.workersResolve[ workerId ];\n\t\tresolve && resolve( msg );\n\n\t\tif ( this.queue.length ) {\n\n\t\t\tconst { resolve, msg, transfer } = this.queue.shift();\n\t\t\tthis.workersResolve[ workerId ] = resolve;\n\t\t\tthis.workers[ workerId ].postMessage( msg, transfer );\n\n\t\t} else {\n\n\t\t\tthis.workerStatus ^= 1 << workerId;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets a function that is responsible for creating Workers.\n\t *\n\t * @param {Function} workerCreator - The worker creator function.\n\t */\n\tsetWorkerCreator( workerCreator ) {\n\n\t\tthis.workerCreator = workerCreator;\n\n\t}\n\n\t/**\n\t * Sets the Worker limit\n\t *\n\t * @param {number} pool - The size of the pool.\n\t */\n\tsetWorkerLimit( pool ) {\n\n\t\tthis.pool = pool;\n\n\t}\n\n\t/**\n\t * Post a message to an idle Worker. If no Worker is available,\n\t * the message is pushed into a message queue for later processing.\n\t *\n\t * @param {Object} msg - The message.\n\t * @param {Array<ArrayBuffer>} transfer - An array with array buffers for data transfer.\n\t * @return {Promise} A Promise that resolves when the message has been processed.\n\t */\n\tpostMessage( msg, transfer ) {\n\n\t\treturn new Promise( ( resolve ) => {\n\n\t\t\tconst workerId = this._getIdleWorker();\n\n\t\t\tif ( workerId !== - 1 ) {\n\n\t\t\t\tthis._initWorker( workerId );\n\t\t\t\tthis.workerStatus |= 1 << workerId;\n\t\t\t\tthis.workersResolve[ workerId ] = resolve;\n\t\t\t\tthis.workers[ workerId ].postMessage( msg, transfer );\n\n\t\t\t} else {\n\n\t\t\t\tthis.queue.push( { resolve, msg, transfer } );\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Terminates all Workers of this pool. Call this  method whenever this\n\t * Worker pool is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.workers.forEach( ( worker ) => worker.terminate() );\n\t\tthis.workersResolve.length = 0;\n\t\tthis.workers.length = 0;\n\t\tthis.queue.length = 0;\n\t\tthis.workerStatus = 0;\n\n\t}\n\n}\n", "let A,I,B;const g={env:{emscripten_notify_memory_growth:function(A){B=new Uint8Array(I.exports.memory.buffer)}}};class Q{init(){return A||(A=\"undefined\"!=typeof fetch?fetch(\"data:application/wasm;base64,\"+C).then(A=>A.arrayBuffer()).then(A=>WebAssembly.instantiate(A,g)).then(this._init):WebAssembly.instantiate(Buffer.from(C,\"base64\"),g).then(this._init),A)}_init(A){I=A.instance,g.env.emscripten_notify_memory_growth(0)}decode(A,g=0){if(!I)throw new Error(\"ZSTDDecoder: Await .init() before decoding.\");const Q=A.byteLength,C=I.exports.malloc(Q);B.set(A,C),g=g||Number(I.exports.ZSTD_findDecompressedSize(C,Q));const E=I.exports.malloc(g),i=I.exports.ZSTD_decompress(E,g,C,Q),D=B.slice(E,E+i);return I.exports.free(C),I.exports.free(E),D}}const C=\"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IAMNACAEQQNxBEADQCACRQ0FIAAgAkF/aiICaiIDIAEgAmotAAA6AAAgA0EDcQ0ACwsgAkEDTQ0AA0AgACACQXxqIgJqIAEgAmooAgA2AgAgAkEDSw0ACwsgAkUNAgNAIAAgAkF/aiICaiABIAJqLQAAOgAAIAINAAsMAgsgAkEDTQ0AIAIhBANAIAMgASgCADYCACABQQRqIQEgA0EEaiEDIARBfGoiBEEDSw0ACyACQQNxIQILIAJFDQADQCADIAEtAAA6AAAgA0EBaiEDIAFBAWohASACQX9qIgINAAsLIAAL8wICAn8BfgJAIAJFDQAgACACaiIDQX9qIAE6AAAgACABOgAAIAJBA0kNACADQX5qIAE6AAAgACABOgABIANBfWogAToAACAAIAE6AAIgAkEHSQ0AIANBfGogAToAACAAIAE6AAMgAkEJSQ0AIABBACAAa0EDcSIEaiIDIAFB/wFxQYGChAhsIgE2AgAgAyACIARrQXxxIgRqIgJBfGogATYCACAEQQlJDQAgAyABNgIIIAMgATYCBCACQXhqIAE2AgAgAkF0aiABNgIAIARBGUkNACADIAE2AhggAyABNgIUIAMgATYCECADIAE2AgwgAkFwaiABNgIAIAJBbGogATYCACACQWhqIAE2AgAgAkFkaiABNgIAIAQgA0EEcUEYciIEayICQSBJDQAgAa0iBUIghiAFhCEFIAMgBGohAQNAIAEgBTcDGCABIAU3AxAgASAFNwMIIAEgBTcDACABQSBqIQEgAkFgaiICQR9LDQALCyAACy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAIajYCACADCy8BAn8gACgCBCAAKAIAQQJ0aiICLQACIQMgACACLwEAIAEgAi0AAxAFajYCACADCx8AIAAgASACKAIEEAg2AgAgARAEGiAAIAJBCGo2AgQLCAAgAGdBH3MLugUBDX8jAEEQayIKJAACfyAEQQNNBEAgCkEANgIMIApBDGogAyAEEAsaIAAgASACIApBDGpBBBAVIgBBbCAAEAMbIAAgACAESxsMAQsgAEEAIAEoAgBBAXRBAmoQECENQVQgAygAACIGQQ9xIgBBCksNABogAiAAQQVqNgIAIAMgBGoiAkF8aiEMIAJBeWohDiACQXtqIRAgAEEGaiELQQQh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ASIDNgLE4AEgACgCvOABIQQgACABNgK84AEgACABIAJqNgK44AEgACABIAQgA2tqNgLA4AELpgEBAX8gACAAKALs4QEQFjYCyOABIABCADcD+OABIABCADcDuOABIABBwOABakIANwMAIABBqNAAaiIBQYyAgOAANgIAIABBADYCmOIBIABCADcDiOEBIABCAzcDgOEBIABBrNABakHgEikCADcCACAAQbTQAWpB6BIoAgA2AgAgACABNgIMIAAgAEGYIGo2AgggACAAQaAwajYCBCAAIABBEGo2AgALYQEBf0G4fyEDAkAgAUEDSQ0AIAIgABAhIgFBA3YiADYCCCACIAFBAXE2AgQgAiABQQF2QQNxIgM2AgACQCADQX9qIgFBAksNAAJAIAFBAWsOAgEAAgtBbA8LIAAhAwsgAwsMACAAIAEgAkEAEC4LiAQCA38CfiADEBYhBCAAQQBBKBAQIQAgBCACSwRAIAQPCyABRQRAQX8PCwJAAkAgA0EBRg0AIAEoAAAiBkGo6r5pRg0AQXYhAyAGQXBxQdDUtMIBRw0BQQghAyACQQhJDQEgAEEAQSgQECEAIAEoAAQhASAAQQE2AhQgACABrTcDAEEADwsgASACIAMQLyIDIAJLDQAgACADNgIYQXIhAyABIARqIgVBf2otAAAiAkEIcQ0AIAJBIHEiBkUEQEFwIQMgBS0AACIFQacBSw0BIAVBB3GtQgEgBUEDdkEKaq2GIgdCA4h+IAd8IQggBEEBaiEECyACQQZ2IQMgAkECdiEFAkAgAkEDcUF/aiICQQJLBEBBACECDAELAkACQAJAIAJBAWsOAgECAAsgASAEai0AACECIARBAWohBAwCCyABIARqLwAAIQIgBEECaiEEDAELIAEgBGooAAAhAiAEQQRqIQQLIAVBAXEhBQJ+AkACQAJAIANBf2oiA0ECTQRAIANBAWsOAgIDAQtCfyAGRQ0DGiABIARqMQAADAMLIAEgBGovAACtQoACfAwCCyABIARqKAAArQwBCyABIARqKQAACyEHIAAgBTYCICAAIAI2AhwgACAHNwMAQQAhAyAAQQA2AhQgACAHIAggBhsiBzcDCCAAIAdCgIAIIAdCgIAIVBs+AhALIAMLWwEBf0G4fyEDIAIQFiICIAFNBH8gACACakF/ai0AACIAQQNxQQJ0QaAeaigC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C0Egak8NAQsgByAHKQNoNwMQIAcgBykDYDcDCCAEIA0gB0EIaiAHQdwAaiAPIA4gESAQEB4hCwwBCyACIARqIQggBCAKEAcgAkERTwRAIARBEGohAgNAIAIgCkEQaiIKEAcgAkEQaiICIAhJDQALCyAIIAlrIQIgByATNgJcIAkgCCAOa0sEQCAJIAggEWtLBEBBbCELDAILIBAgAiAOayICaiIKIANqIBBNBEAgCCAKIAMQDxoMAgsgCCAKQQAgAmsQDyEIIAcgAiADaiIDNgJkIAggAmshCCAOIQILIAlBEE8EQCADIAhqIQMDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALDAELAkAgCUEHTQRAIAggAi0AADoAACAIIAItAAE6AAEgCCACLQACOgACIAggAi0AAzoAAyAIQQRqIAIgCUECdCIDQcAeaigCAGoiAhAXIAIgA0HgHmooAgBrIQIgBygCZCEDDAELIAggAhAMCyADQQlJDQAgAyAIaiEDIAhBCGoiCCACQQhqIgJrQQ9MBEADQCAIIAIQDCACQQhqIQIgCEEIaiIIIANJDQAMAgALAAsDQCAIIAIQByACQRBqIQIgCEEQaiIIIANJDQALCyAHQRhqEAQaIAsgDCALEAMiAhshDCAEIAQgC2ogAhshBCAFQX9qIgUNAAsgDBADDQFBbCEMIAdBGGoQBEECSQ0BQQAhCANAIAhBA0cEQCAAIAhBAnQiAmpBrNABaiACIAdqKAJENgIAIAhBAWohCAwBCwsgBygCXCEIC0G6fyEMIA8gCGsiACANIARrSw0AIAQEfyAEIAggABALIABqBUEACyABayEMCyAHQfAAaiQAIAwLkRcCFn8FfiMAQdABayIHJAAgByAAKALw4QEiCDYCvAEgASACaiESIAggACgCgOIBaiETAkACQCAFRQRAIAEhAwwBCyAAKALE4AEhESAAKALA4AEhFSAAKAK84AEhDyAAQQE2AozhAUEAIQgDQCAIQQNHBEAgByAIQQJ0IgJqIAAgAmpBrNABaigCADYCVCAIQQFqIQgMAQsLIAcgETYCZCAHIA82AmAgByABIA9rNgJoQWwhECAHQShqIAMgBBAGEAMNASAFQQQgBUEESBshFyAHQTxqIAdBKGogACgCABATIAdBxABqIAdBKGogACgCCBATIAdBzABqIAdB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IAdB0AFqJAAgEAslACAAQgA3AgAgAEEAOwEIIABBADoACyAAIAE2AgwgACACOgAKC7QFAQN/IwBBMGsiBCQAIABB/wFqIgVBfWohBgJAIAMvAQIEQCAEQRhqIAEgAhAGIgIQAw0BIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahASOgAAIAMgBEEIaiAEQRhqEBI6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0FIAEgBEEQaiAEQRhqEBI6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBSABIARBCGogBEEYahASOgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEjoAACABIAJqIABrIQIMAwsgAyAEQRBqIARBGGoQEjoAAiADIARBCGogBEEYahASOgADIANBBGohAwwAAAsACyAEQRhqIAEgAhAGIgIQAw0AIARBEGogBEEYaiADEBwgBEEIaiAEQRhqIAMQHCAAIQMDQAJAIARBGGoQBCADIAZPckUEQCADIARBEGogBEEYahAROgAAIAMgBEEIaiAEQRhqEBE6AAEgBEEYahAERQ0BIANBAmohAwsgBUF+aiEFAn8DQEG6fyECIAMiASAFSw0EIAEgBEEQaiAEQRhqEBE6AAAgAUEBaiEDIARBGGoQBEEDRgRAQQIhAiAEQQhqDAILIAMgBUsNBCABIARBCGogBEEYahAROgABIAFBAmohA0EDIQIgBEEYahAEQQNHDQALIARBEGoLIQUgAyAFIARBGGoQEToAACABIAJqIABrIQIMAgsgAyAEQRBqIARBGGoQEToAAiADIARBCGogBEEYahAROgADIANBBGohAwwAAAsACyAEQTBqJAAgAgtpAQF/An8CQAJAIAJBB00NACABKAAAQbfIwuF+Rw0AIAAgASgABDYCmOIBQWIgAEEQaiABIAIQPiIDEAMNAhogAEKBgICAEDcDiOEBIAAgASADaiACIANrECoMAQsgACABIAIQKgtBAAsLrQMBBn8jAEGAAWsiAyQAQWIhCAJAIAJBCUkNACAAQZjQAGogAUEIaiIEIAJBeGogAEGY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wOABCwutAgIEfwF+IwBBQGoiBCQAAkACQCACQQhJDQAgASgAAEFwcUHQ1LTCAUcNACABIAIQIiEBIABCADcDCCAAQQA2AgQgACABNgIADAELIARBGGogASACEC0iAxADBEAgACADEBoMAQsgAwRAIABBuH8QGgwBCyACIAQoAjAiA2shAiABIANqIQMDQAJAIAAgAyACIARBCGoQLCIFEAMEfyAFBSACIAVBA2oiBU8NAUG4fwsQGgwCCyAGQQFqIQYgAiAFayECIAMgBWohAyAEKAIMRQ0ACyAEKAI4BEAgAkEDTQRAIABBuH8QGgwCCyADQQRqIQMLIAQoAighAiAEKQMYIQcgAEEANgIEIAAgAyABazYCACAAIAIgBmytIAcgB0J/URs3AwgLIARBQGskAAslAQF/IwBBEGsiAiQAIAIgACABEFEgAigCACEAIAJBEGokACAAC30BBH8jAEGQBGsiBCQAIARB/wE2AggCQCAEQRBqIARBCGogBEEMaiABIAIQFSIGEAMEQCAGIQUMAQtBVCEFIAQoAgwiB0EGSw0AIAMgBEEQaiAEKAIIIAcQQSIFEAMNACAAIAEgBmogAiAGayADEDwhBQsgBEGQBGokACAFC4cBAgJ/An5BABAWIQMCQANAIAEgA08EQAJAIAAoAABBcHFB0NS0wgFGBEAgACABECIiAhADRQ0BQn4PCyAAIAEQVSIEQn1WDQMgBCAFfCIFIARUIQJCfiEEIAINAyAAIAEQUiICEAMNAwsgASACayEBIAAgAmohAAwBCwtCfiAFIAEbIQQLIAQLPwIBfwF+IwBBMGsiAiQAAn5CfiACQQhqIAAgARAtDQAaQgAgAigCHEEBRg0AGiACKQMICyEDIAJBMGokACADC40BAQJ/IwBBMGsiASQAAkAgAEUNACAAKAKI4gENACABIABB/OEBaigCADYCKCABIAApAvThATcDICAAEDAgACgCqOIBIQIgASABKAIoNgIYIAEgASkDIDcDECACIAFBEGoQGyAAQQA2AqjiASABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALKgECfyMAQRBrIgAkACAAQQA2AgggAEIANwMAIAAQWCEBIABBEGokACABC4cBAQN/IwBBEGsiAiQAAkAgACgCAEUgACgCBEVzDQAgAiAAKAIINgIIIAIgACkCADcDAAJ/IAIoAgAiAQRAIAIoAghBqOMJIAERBQAMAQtBqOMJECgLIgFFDQAgASAAKQIANwL04QEgAUH84QFqIAAoAgg2AgAgARBZIAEhAwsgAkEQaiQAIAMLywEBAn8jAEEgayIBJAAgAEGBgIDAADYCtOIBIABBADYCiOIBIABBADYC7OEBIABCADcDkOIBIABBADYCpOMJIABBADYC3OIBIABCADcCzOIBIABBADYCvOIBIABBADYCxOABIABCADcCnOIBIABBpOIBakIANwIAIABBrOIBakEANgIAIAFCADcCECABQgA3AhggASABKQMYNwMIIAEgASkDEDcDACABKAIIQQh2QQFxIQIgAEEANgLg4gEgACACNgKM4gEgAUEgaiQAC3YBA38jAEEwayIBJAAgAARAIAEgAEHE0AFqIgIoAgA2AiggASAAKQK80AE3AyAgACgCACEDIAEgAigCADYCGCABIAApArzQATcDECADIAFBEGoQGyABIAEoAig2AgggASABKQMgNwMAIAAgARAbCyABQTBqJAALzAEBAX8gACABKAK00AE2ApjiASAAIAEoAgQiAjYCwOABIAAgAjYCvOABIAAgAiABKAIIaiICNgK44AEgACACNgLE4AEgASgCuNABBEAgAEKBgICAEDcDiOEBIAAgAUGk0ABqNgIMIAAgAUGUIGo2AgggACABQZwwajYCBCAAIAFBDGo2AgAgAEGs0AFqIAFBqNABaigCADYCACAAQbDQAWogAUGs0AFqKAIANgIAIABBtNABaiABQbDQAWooAgA2AgAPCyAAQgA3A4jhAQs7ACACRQRAQbp/DwsgBEUEQEFsDwsgAiAEEGAEQCAAIAEgAiADIAQgBRBhDwsgACABIAIgAyAEIAUQZQtGAQF/IwBBEGsiBSQAIAVBCGogBBAOAn8gBS0ACQRAIAAgASACIAMgBBAyDAELIAAgASACIAMgBBA0CyEAIAVBEGokACAACzQAIAAgAyAEIAUQNiIFEAMEQCAFDwsgBSAESQR/IAEgAiADIAVqIAQgBWsgABA1BUG4fwsLRgEBfyMAQRBrIgUkACAFQQhqIAQQDgJ/IAUtAAkEQCAAIAEgAiADIAQQYgwBCyAAIAEgAiADIAQQNQshACAFQRBqJAAgAAtZAQF/QQ8hAiABIABJBEAgAUEE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\";export{Q as ZSTDDecoder};\n", "import { LinearTransfer, Matrix3, SRGBTransfer, SRGBColorSpace, ColorManagement } from 'three';\n\n/** @module ColorSpaces */\n\n// Reference: http://www.russellcottrell.com/photo/matrixCalculator.htm\n\nconst P3_PRIMARIES = [ 0.680, 0.320, 0.265, 0.690, 0.150, 0.060 ];\nconst P3_LUMINANCE_COEFFICIENTS = [ 0.2289, 0.6917, 0.0793 ];\nconst REC2020_PRIMARIES = [ 0.708, 0.292, 0.170, 0.797, 0.131, 0.046 ];\nconst REC2020_LUMINANCE_COEFFICIENTS = [ 0.2627, 0.6780, 0.0593 ];\nconst D65 = [ 0.3127, 0.3290 ];\n\n/******************************************************************************\n * Display P3 definitions\n */\n\nconst LINEAR_DISPLAY_P3_TO_XYZ = /*@__PURE__*/ new Matrix3().set(\n\t0.4865709, 0.2656677, 0.1982173,\n\t0.2289746, 0.6917385, 0.0792869,\n\t0.0000000, 0.0451134, 1.0439444\n);\n\nconst XYZ_TO_LINEAR_DISPLAY_P3 = /*@__PURE__*/ new Matrix3().set(\n\t2.4934969, - 0.9313836, - 0.4027108,\n\t- 0.8294890, 1.7626641, 0.0236247,\n\t0.0358458, - 0.0761724, 0.9568845\n);\n\n/**\n * Display-P3 color space.\n *\n * @type {string}\n * @constant\n */\nexport const DisplayP3ColorSpace = 'display-p3';\n\n/**\n * Display-P3-Linear color space.\n *\n * @type {string}\n * @constant\n */\nexport const LinearDisplayP3ColorSpace = 'display-p3-linear';\n\n/**\n * Implementation object for the Display-P3 color space.\n *\n * @type {module:ColorSpaces~ColorSpaceImpl}\n * @constant\n */\nexport const DisplayP3ColorSpaceImpl = {\n\tprimaries: P3_PRIMARIES,\n\twhitePoint: D65,\n\ttransfer: SRGBTransfer,\n\ttoXYZ: LINEAR_DISPLAY_P3_TO_XYZ,\n\tfromXYZ: XYZ_TO_LINEAR_DISPLAY_P3,\n\tluminanceCoefficients: P3_LUMINANCE_COEFFICIENTS,\n\toutputColorSpaceConfig: { drawingBufferColorSpace: DisplayP3ColorSpace }\n};\n\n/**\n * Implementation object for the Display-P3-Linear color space.\n *\n * @type {module:ColorSpaces~ColorSpaceImpl}\n * @constant\n */\nexport const LinearDisplayP3ColorSpaceImpl = {\n\tprimaries: P3_PRIMARIES,\n\twhitePoint: D65,\n\ttransfer: LinearTransfer,\n\ttoXYZ: LINEAR_DISPLAY_P3_TO_XYZ,\n\tfromXYZ: XYZ_TO_LINEAR_DISPLAY_P3,\n\tluminanceCoefficients: P3_LUMINANCE_COEFFICIENTS,\n\tworkingColorSpaceConfig: { unpackColorSpace: DisplayP3ColorSpace },\n\toutputColorSpaceConfig: { drawingBufferColorSpace: DisplayP3ColorSpace }\n};\n\n/******************************************************************************\n * Rec. 2020 definitions\n */\n\nconst LINEAR_REC2020_TO_XYZ = /*@__PURE__*/ new Matrix3().set(\n\t0.6369580, 0.1446169, 0.1688810,\n\t0.2627002, 0.6779981, 0.0593017,\n\t0.0000000, 0.0280727, 1.0609851\n);\n\nconst XYZ_TO_LINEAR_REC2020 = /*@__PURE__*/ new Matrix3().set(\n\t1.7166512, - 0.3556708, - 0.2533663,\n\t- 0.6666844, 1.6164812, 0.0157685,\n\t0.0176399, - 0.0427706, 0.9421031\n);\n\n/**\n * Rec2020-Linear color space.\n *\n * @type {string}\n * @constant\n */\nexport const LinearRec2020ColorSpace = 'rec2020-linear';\n\n/**\n * Implementation object for the Rec2020-Linear color space.\n *\n * @type {module:ColorSpaces~ColorSpaceImpl}\n * @constant\n */\nexport const LinearRec2020ColorSpaceImpl = {\n\tprimaries: REC2020_PRIMARIES,\n\twhitePoint: D65,\n\ttransfer: LinearTransfer,\n\ttoXYZ: LINEAR_REC2020_TO_XYZ,\n\tfromXYZ: XYZ_TO_LINEAR_REC2020,\n\tluminanceCoefficients: REC2020_LUMINANCE_COEFFICIENTS,\n};\n\n/**\n * Extended-sRGB color space.\n *\n * @type {string}\n * @constant\n */\nexport const ExtendedSRGBColorSpace = 'extended-srgb';\n\n/**\n * Implementation object for the Extended-sRGB color space.\n *\n * @type {module:ColorSpaces~ColorSpaceImpl}\n * @constant\n */\nexport const ExtendedSRGBColorSpaceImpl = {\n\t...ColorManagement.spaces[ SRGBColorSpace ],\n\toutputColorSpaceConfig: { drawingBufferColorSpace: SRGBColorSpace, toneMappingMode: 'extended' }\n};\n\n/**\n * An object holding the color space implementation.\n *\n * @typedef {Object} module:ColorSpaces~ColorSpaceImpl\n * @property {Array<number>} primaries - The primaries.\n * @property {Array<number>} whitePoint - The white point.\n * @property {Matrix3} toXYZ - A color space conversion matrix, converting to CIE XYZ.\n * @property {Matrix3} fromXYZ - A color space conversion matrix, converting from CIE XYZ.\n * @property {Array<number>} luminanceCoefficients - The luminance coefficients.\n * @property {{unpackColorSpace:string}} [workingColorSpaceConfig] - The working color space config.\n * @property {{drawingBufferColorSpace:string}} [outputColorSpaceConfig] - The drawing buffer color space config.\n **/\n", "import {\n\tCompressedArrayTexture,\n\tCompressedCubeTexture,\n\tCompressedTexture,\n\tData3DTexture,\n\tDataTexture,\n\tFileLoader,\n\tFloatType,\n\tHalfFloatType,\n\tLinearFilter,\n\tLinearMipmapLinearFilter,\n\tNearestFilter,\n\tNearestMipmapNearestFilter,\n\tLinearSRGBColorSpace,\n\tLoader,\n\tNoColorSpace,\n\tRGBAFormat,\n\tRGBA_ASTC_4x4_Format,\n\tRGBA_ASTC_6x6_Format,\n\tRGBA_BPTC_Format,\n\tRGBA_S3TC_DXT3_Format,\n\tRGBA_ETC2_EAC_Format,\n\tR11_EAC_Format,\n\tSIGNED_R11_EAC_Format,\n\tRG11_EAC_Format,\n\tSIGNED_RG11_EAC_Format,\n\tRGBA_PVRTC_4BPPV1_Format,\n\tRGBA_PVRTC_2BPPV1_Format,\n\tRGBA_S3TC_DXT1_Format,\n\tRGBA_S3TC_DXT5_Format,\n\tRGB_BPTC_UNSIGNED_Format,\n\tRGB_ETC1_Format,\n\tRGB_ETC2_Format,\n\tRGB_PVRTC_4BPPV1_Format,\n\tRGB_S3TC_DXT1_Format,\n\tSIGNED_RED_GREEN_RGTC2_Format,\n\tSIGNED_RED_RGTC1_Format,\n\tRED_GREEN_RGTC2_Format,\n\tRED_RGTC1_Format,\n\tRGBFormat,\n\tRGFormat,\n\tRedFormat,\n\tSRGBColorSpace,\n\tUnsignedByteType,\n\tUnsignedInt5999Type,\n\tUnsignedInt101111Type\n} from 'three';\nimport { WorkerPool } from '../utils/WorkerPool.js';\nimport {\n\tread,\n\tKHR_DF_FLAG_ALPHA_PREMULTIPLIED,\n\tKHR_DF_PRIMARIES_BT709,\n\tKHR_DF_PRIMARIES_DISPLAYP3,\n\tKHR_DF_PRIMARIES_UNSPECIFIED,\n\tKHR_DF_TRANSFER_SRGB,\n\tKHR_SUPERCOMPRESSION_NONE,\n\tKHR_SUPERCOMPRESSION_ZSTD,\n\tVK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT,\n\tVK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT,\n\tVK_FORMAT_ASTC_4x4_SRGB_BLOCK,\n\tVK_FORMAT_ASTC_4x4_UNORM_BLOCK,\n\tVK_FORMAT_ASTC_6x6_SRGB_BLOCK,\n\tVK_FORMAT_ASTC_6x6_UNORM_BLOCK,\n\tVK_FORMAT_BC1_RGBA_SRGB_BLOCK,\n\tVK_FORMAT_BC1_RGBA_UNORM_BLOCK,\n\tVK_FORMAT_BC1_RGB_SRGB_BLOCK,\n\tVK_FORMAT_BC1_RGB_UNORM_BLOCK,\n\tVK_FORMAT_BC3_SRGB_BLOCK,\n\tVK_FORMAT_BC3_UNORM_BLOCK,\n\tVK_FORMAT_BC4_SNORM_BLOCK,\n\tVK_FORMAT_BC4_UNORM_BLOCK,\n\tVK_FORMAT_BC5_SNORM_BLOCK,\n\tVK_FORMAT_BC5_UNORM_BLOCK,\n\tVK_FORMAT_BC7_SRGB_BLOCK,\n\tVK_FORMAT_BC7_UNORM_BLOCK,\n\tVK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK,\n\tVK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK,\n\tVK_FORMAT_EAC_R11_UNORM_BLOCK,\n\tVK_FORMAT_EAC_R11_SNORM_BLOCK,\n\tVK_FORMAT_EAC_R11G11_UNORM_BLOCK,\n\tVK_FORMAT_EAC_R11G11_SNORM_BLOCK,\n\tVK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG,\n\tVK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG,\n\tVK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG,\n\tVK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG,\n\tVK_FORMAT_R16G16B16A16_SFLOAT,\n\tVK_FORMAT_R16G16_SFLOAT,\n\tVK_FORMAT_R16_SFLOAT,\n\tVK_FORMAT_R32G32B32A32_SFLOAT,\n\tVK_FORMAT_R32G32_SFLOAT,\n\tVK_FORMAT_R32_SFLOAT,\n\tVK_FORMAT_R8G8B8A8_SRGB,\n\tVK_FORMAT_R8G8B8A8_UNORM,\n\tVK_FORMAT_R8G8_SRGB,\n\tVK_FORMAT_R8G8_UNORM,\n\tVK_FORMAT_R8_SRGB,\n\tVK_FORMAT_R8_UNORM,\n\tVK_FORMAT_E5B9G9R9_UFLOAT_PACK32,\n\tVK_FORMAT_B10G11R11_UFLOAT_PACK32,\n\tVK_FORMAT_UNDEFINED\n} from '../libs/ktx-parse.module.js';\nimport { ZSTDDecoder } from '../libs/zstddec.module.js';\nimport { DisplayP3ColorSpace, LinearDisplayP3ColorSpace } from '../math/ColorSpaces.js';\n\nconst _taskCache = new WeakMap();\n\nlet _activeLoaders = 0;\n\nlet _zstd;\n\n/**\n * A loader for KTX 2.0 GPU Texture containers.\n *\n * KTX 2.0 is a container format for various GPU texture formats. The loader supports Basis Universal GPU textures,\n * which can be quickly transcoded to a wide variety of GPU texture compression formats. While KTX 2.0 also allows\n * other hardware-specific formats, this loader does not yet parse them.\n *\n * This loader parses the KTX 2.0 container and transcodes to a supported GPU compressed texture format.\n * The required WASM transcoder and JS wrapper are available from the `examples/jsm/libs/basis` directory.\n *\n * This loader relies on Web Assembly which is not supported in older browsers.\n *\n * References:\n * - [KTX specification](http://github.khronos.org/KTX-Specification/)\n * - [DFD](https://www.khronos.org/registry/DataFormat/specs/1.3/dataformat.1.3.html#basicdescriptor)\n * - [BasisU HDR](https://github.com/BinomialLLC/basis_universal/wiki/UASTC-HDR-Texture-Specification-v1.0)\n *\n * ```js\n * const loader = new KTX2Loader();\n * loader.setTranscoderPath( 'examples/jsm/libs/basis/' );\n * loader.detectSupport( renderer );\n * const texture = loader.loadAsync( 'diffuse.ktx2' );\n * ```\n *\n * @augments Loader\n * @three_import import { KTX2Loader } from 'three/addons/loaders/KTX2Loader.js';\n */\nclass KTX2Loader extends Loader {\n\n\t/**\n\t * Constructs a new KTX2 loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tthis.transcoderPath = '';\n\t\tthis.transcoderBinary = null;\n\t\tthis.transcoderPending = null;\n\n\t\tthis.workerPool = new WorkerPool();\n\t\tthis.workerSourceURL = '';\n\t\tthis.workerConfig = null;\n\n\t\tif ( typeof MSC_TRANSCODER !== 'undefined' ) {\n\n\t\t\tconsole.warn(\n\n\t\t\t\t'THREE.KTX2Loader: Please update to latest \"basis_transcoder\".'\n\t\t\t\t+ ' \"msc_basis_transcoder\" is no longer supported in three.js r125+.'\n\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the transcoder path.\n\t *\n\t * The WASM transcoder and JS wrapper are available from the `examples/jsm/libs/basis` directory.\n\t *\n\t * @param {string} path - The transcoder path to set.\n\t * @return {KTX2Loader} A reference to this loader.\n\t */\n\tsetTranscoderPath( path ) {\n\n\t\tthis.transcoderPath = path;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the maximum number of Web Workers to be allocated by this instance.\n\t *\n\t * @param {number} workerLimit - The worker limit.\n\t * @return {KTX2Loader} A reference to this loader.\n\t */\n\tsetWorkerLimit( workerLimit ) {\n\n\t\tthis.workerPool.setWorkerLimit( workerLimit );\n\n\t\treturn this;\n\n\t}\n\n\n\t/**\n\t * Async version of {@link KTX2Loader#detectSupport}.\n\t *\n\t * @async\n\t * @deprecated\n\t * @param {WebGPURenderer} renderer - The renderer.\n\t * @return {Promise} A Promise that resolves when the support has been detected.\n\t */\n\tasync detectSupportAsync( renderer ) {\n\n\t\tconsole.warn( 'KTX2Loader: \"detectSupportAsync()\" has been deprecated. Use \"detectSupport()\" and \"await renderer.init();\" when creating the renderer.' ); // @deprecated r181\n\n\t\tawait renderer.init();\n\n\t\treturn this.detectSupport( renderer );\n\n\t}\n\n\t/**\n\t * Detects hardware support for available compressed texture formats, to determine\n\t * the output format for the transcoder. Must be called before loading a texture.\n\t *\n\t * @param {WebGPURenderer|WebGLRenderer} renderer - The renderer.\n\t * @return {KTX2Loader} A reference to this loader.\n\t */\n\tdetectSupport( renderer ) {\n\n\t\tif ( renderer.isWebGPURenderer === true ) {\n\n\t\t\tthis.workerConfig = {\n\t\t\t\tastcSupported: renderer.hasFeature( 'texture-compression-astc' ),\n\t\t\t\tastcHDRSupported: false, // https://github.com/gpuweb/gpuweb/issues/3856\n\t\t\t\tetc1Supported: renderer.hasFeature( 'texture-compression-etc1' ),\n\t\t\t\tetc2Supported: renderer.hasFeature( 'texture-compression-etc2' ),\n\t\t\t\tdxtSupported: renderer.hasFeature( 'texture-compression-s3tc' ),\n\t\t\t\tbptcSupported: renderer.hasFeature( 'texture-compression-bc' ),\n\t\t\t\tpvrtcSupported: renderer.hasFeature( 'texture-compression-pvrtc' )\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tthis.workerConfig = {\n\t\t\t\tastcSupported: renderer.extensions.has( 'WEBGL_compressed_texture_astc' ),\n\t\t\t\tastcHDRSupported: renderer.extensions.has( 'WEBGL_compressed_texture_astc' )\n\t\t\t\t\t&& renderer.extensions.get( 'WEBGL_compressed_texture_astc' ).getSupportedProfiles().includes( 'hdr' ),\n\t\t\t\tetc1Supported: renderer.extensions.has( 'WEBGL_compressed_texture_etc1' ),\n\t\t\t\tetc2Supported: renderer.extensions.has( 'WEBGL_compressed_texture_etc' ),\n\t\t\t\tdxtSupported: renderer.extensions.has( 'WEBGL_compressed_texture_s3tc' ),\n\t\t\t\tbptcSupported: renderer.extensions.has( 'EXT_texture_compression_bptc' ),\n\t\t\t\tpvrtcSupported: renderer.extensions.has( 'WEBGL_compressed_texture_pvrtc' )\n\t\t\t\t\t|| renderer.extensions.has( 'WEBKIT_WEBGL_compressed_texture_pvrtc' )\n\t\t\t};\n\n\t\t\tif ( typeof navigator !== 'undefined' &&\n\t\t\t\tnavigator.platform.indexOf( 'Linux' ) >= 0 && navigator.userAgent.indexOf( 'Firefox' ) >= 0 &&\n\t\t\t\tthis.workerConfig.astcSupported && this.workerConfig.etc2Supported &&\n\t\t\t\tthis.workerConfig.bptcSupported && this.workerConfig.dxtSupported ) {\n\n\t\t\t\t// On Linux, Mesa drivers for AMD and Intel GPUs expose ETC2 and ASTC even though the hardware doesn't support these.\n\t\t\t\t// Using these extensions will result in expensive software decompression on the main thread inside the driver, causing performance issues.\n\t\t\t\t// When using ANGLE (e.g. via Chrome), these extensions are not exposed except for some specific Intel GPU models - however, Firefox doesn't perform this filtering.\n\t\t\t\t// Since a granular filter is a little too fragile and we can transcode into other GPU formats, disable formats that are likely to be emulated.\n\n\t\t\t\tthis.workerConfig.astcSupported = false;\n\t\t\t\tthis.workerConfig.etc2Supported = false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t// TODO: Make this method private\n\n\tinit() {\n\n\t\tif ( ! this.transcoderPending ) {\n\n\t\t\t// Load transcoder wrapper.\n\t\t\tconst jsLoader = new FileLoader( this.manager );\n\t\t\tjsLoader.setPath( this.transcoderPath );\n\t\t\tjsLoader.setWithCredentials( this.withCredentials );\n\t\t\tconst jsContent = jsLoader.loadAsync( 'basis_transcoder.js' );\n\n\t\t\t// Load transcoder WASM binary.\n\t\t\tconst binaryLoader = new FileLoader( this.manager );\n\t\t\tbinaryLoader.setPath( this.transcoderPath );\n\t\t\tbinaryLoader.setResponseType( 'arraybuffer' );\n\t\t\tbinaryLoader.setWithCredentials( this.withCredentials );\n\t\t\tconst binaryContent = binaryLoader.loadAsync( 'basis_transcoder.wasm' );\n\n\t\t\tthis.transcoderPending = Promise.all( [ jsContent, binaryContent ] )\n\t\t\t\t.then( ( [ jsContent, binaryContent ] ) => {\n\n\t\t\t\t\tconst fn = KTX2Loader.BasisWorker.toString();\n\n\t\t\t\t\tconst body = [\n\t\t\t\t\t\t'/* constants */',\n\t\t\t\t\t\t'let _EngineFormat = ' + JSON.stringify( KTX2Loader.EngineFormat ),\n\t\t\t\t\t\t'let _EngineType = ' + JSON.stringify( KTX2Loader.EngineType ),\n\t\t\t\t\t\t'let _TranscoderFormat = ' + JSON.stringify( KTX2Loader.TranscoderFormat ),\n\t\t\t\t\t\t'let _BasisFormat = ' + JSON.stringify( KTX2Loader.BasisFormat ),\n\t\t\t\t\t\t'/* basis_transcoder.js */',\n\t\t\t\t\t\tjsContent,\n\t\t\t\t\t\t'/* worker */',\n\t\t\t\t\t\tfn.substring( fn.indexOf( '{' ) + 1, fn.lastIndexOf( '}' ) )\n\t\t\t\t\t].join( '\\n' );\n\n\t\t\t\t\tthis.workerSourceURL = URL.createObjectURL( new Blob( [ body ] ) );\n\t\t\t\t\tthis.transcoderBinary = binaryContent;\n\n\t\t\t\t\tthis.workerPool.setWorkerCreator( () => {\n\n\t\t\t\t\t\tconst worker = new Worker( this.workerSourceURL );\n\t\t\t\t\t\tconst transcoderBinary = this.transcoderBinary.slice( 0 );\n\n\t\t\t\t\t\tworker.postMessage( { type: 'init', config: this.workerConfig, transcoderBinary }, [ transcoderBinary ] );\n\n\t\t\t\t\t\treturn worker;\n\n\t\t\t\t\t} );\n\n\t\t\t\t} );\n\n\t\t\tif ( _activeLoaders > 0 ) {\n\n\t\t\t\t// Each instance loads a transcoder and allocates workers, increasing network and memory cost.\n\n\t\t\t\tconsole.warn(\n\n\t\t\t\t\t'THREE.KTX2Loader: Multiple active KTX2 loaders may cause performance issues.'\n\t\t\t\t\t+ ' Use a single KTX2Loader instance, or call .dispose() on old instances.'\n\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\t_activeLoaders ++;\n\n\t\t}\n\n\t\treturn this.transcoderPending;\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded KTX2 texture\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(CompressedTexture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tif ( this.workerConfig === null ) {\n\n\t\t\tthrow new Error( 'THREE.KTX2Loader: Missing initialization with `.detectSupport( renderer )`.' );\n\n\t\t}\n\n\t\tconst loader = new FileLoader( this.manager );\n\n\t\tloader.setPath( this.path );\n\t\tloader.setCrossOrigin( this.crossOrigin );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\tloader.load( url, ( buffer ) => {\n\n\t\t\tthis.parse( buffer, onLoad, onError );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given KTX2 data.\n\t *\n\t * @param {ArrayBuffer} buffer - The raw KTX2 data as an array buffer.\n\t * @param {function(CompressedTexture)} onLoad - Executed when the loading/parsing process has been finished.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @returns {Promise} A Promise that resolves when the parsing has been finished.\n\t */\n\tparse( buffer, onLoad, onError ) {\n\n\t\tif ( this.workerConfig === null ) {\n\n\t\t\tthrow new Error( 'THREE.KTX2Loader: Missing initialization with `.detectSupport( renderer )`.' );\n\n\t\t}\n\n\t\t// Check for an existing task using this buffer. A transferred buffer cannot be transferred\n\t\t// again from this thread.\n\t\tif ( _taskCache.has( buffer ) ) {\n\n\t\t\tconst cachedTask = _taskCache.get( buffer );\n\n\t\t\treturn cachedTask.promise.then( onLoad ).catch( onError );\n\n\t\t}\n\n\t\tthis._createTexture( buffer )\n\t\t\t.then( ( texture ) => onLoad ? onLoad( texture ) : null )\n\t\t\t.catch( onError );\n\n\t}\n\n\t_createTextureFrom( transcodeResult, container ) {\n\n\t\tconst { type: messageType, error, data: { faces, width, height, format, type, dfdFlags } } = transcodeResult;\n\n\t\tif ( messageType === 'error' ) return Promise.reject( error );\n\n\t\tlet texture;\n\n\t\tif ( container.faceCount === 6 ) {\n\n\t\t\ttexture = new CompressedCubeTexture( faces, format, type );\n\n\t\t} else {\n\n\t\t\tconst mipmaps = faces[ 0 ].mipmaps;\n\n\t\t\ttexture = container.layerCount > 1\n\t\t\t\t? new CompressedArrayTexture( mipmaps, width, height, container.layerCount, format, type )\n\t\t\t\t: new CompressedTexture( mipmaps, width, height, format, type );\n\n\t\t}\n\n\t\ttexture.minFilter = faces[ 0 ].mipmaps.length === 1 ? LinearFilter : LinearMipmapLinearFilter;\n\t\ttexture.magFilter = LinearFilter;\n\t\ttexture.generateMipmaps = false;\n\n\t\ttexture.needsUpdate = true;\n\t\ttexture.colorSpace = parseColorSpace( container );\n\t\ttexture.premultiplyAlpha = !! ( dfdFlags & KHR_DF_FLAG_ALPHA_PREMULTIPLIED );\n\n\t\treturn texture;\n\n\t}\n\n\t/**\n\t * @private\n\t * @param {ArrayBuffer} buffer\n\t * @param {?Object} config\n\t * @return {Promise<CompressedTexture|CompressedArrayTexture|DataTexture|Data3DTexture>}\n\t */\n\tasync _createTexture( buffer, config = {} ) {\n\n\t\tconst container = read( new Uint8Array( buffer ) );\n\n\t\t// Basis UASTC HDR is a subset of ASTC, which can be transcoded efficiently\n\t\t// to BC6H. To detect whether a KTX2 file uses Basis UASTC HDR, or default\n\t\t// ASTC, inspect the DFD color model.\n\t\t//\n\t\t// Source: https://github.com/BinomialLLC/basis_universal/issues/381\n\t\tconst isBasisHDR = container.vkFormat === VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT\n\t\t\t&& container.dataFormatDescriptor[ 0 ].colorModel === 0xA7;\n\n\t\t// If the device supports ASTC, Basis UASTC HDR requires no transcoder.\n\t\tconst needsTranscoder = container.vkFormat === VK_FORMAT_UNDEFINED\n\t\t\t|| isBasisHDR && ! this.workerConfig.astcHDRSupported;\n\n\t\tif ( ! needsTranscoder ) {\n\n\t\t\treturn createRawTexture( container );\n\n\t\t}\n\n\t\t//\n\t\tconst taskConfig = config;\n\t\tconst texturePending = this.init().then( () => {\n\n\t\t\treturn this.workerPool.postMessage( { type: 'transcode', buffer, taskConfig: taskConfig }, [ buffer ] );\n\n\t\t} ).then( ( e ) => this._createTextureFrom( e.data, container ) );\n\n\t\t// Cache the task result.\n\t\t_taskCache.set( buffer, { promise: texturePending } );\n\n\t\treturn texturePending;\n\n\t}\n\n\t/**\n\t * Frees internal resources. This method should be called\n\t * when the loader is no longer required.\n\t */\n\tdispose() {\n\n\t\tthis.workerPool.dispose();\n\t\tif ( this.workerSourceURL ) URL.revokeObjectURL( this.workerSourceURL );\n\n\t\t_activeLoaders --;\n\n\t}\n\n}\n\n\n/* CONSTANTS */\n\nKTX2Loader.BasisFormat = {\n\tETC1S: 0,\n\tUASTC: 1,\n\tUASTC_HDR: 2,\n};\n\n// Source: https://github.com/BinomialLLC/basis_universal/blob/master/webgl/texture_test/index.html\nKTX2Loader.TranscoderFormat = {\n\tETC1: 0,\n\tETC2: 1,\n\tBC1: 2,\n\tBC3: 3,\n\tBC4: 4,\n\tBC5: 5,\n\tBC7_M6_OPAQUE_ONLY: 6,\n\tBC7_M5: 7,\n\tPVRTC1_4_RGB: 8,\n\tPVRTC1_4_RGBA: 9,\n\tASTC_4x4: 10,\n\tATC_RGB: 11,\n\tATC_RGBA_INTERPOLATED_ALPHA: 12,\n\tRGBA32: 13,\n\tRGB565: 14,\n\tBGR565: 15,\n\tRGBA4444: 16,\n\tBC6H: 22,\n\tRGB_HALF: 24,\n\tRGBA_HALF: 25,\n};\n\nKTX2Loader.EngineFormat = {\n\tRGBAFormat: RGBAFormat,\n\tRGBA_ASTC_4x4_Format: RGBA_ASTC_4x4_Format,\n\tRGB_BPTC_UNSIGNED_Format: RGB_BPTC_UNSIGNED_Format,\n\tRGBA_BPTC_Format: RGBA_BPTC_Format,\n\tRGBA_ETC2_EAC_Format: RGBA_ETC2_EAC_Format,\n\tRGBA_PVRTC_4BPPV1_Format: RGBA_PVRTC_4BPPV1_Format,\n\tRGBA_S3TC_DXT5_Format: RGBA_S3TC_DXT5_Format,\n\tRGB_ETC1_Format: RGB_ETC1_Format,\n\tRGB_ETC2_Format: RGB_ETC2_Format,\n\tRGB_PVRTC_4BPPV1_Format: RGB_PVRTC_4BPPV1_Format,\n\tRGBA_S3TC_DXT1_Format: RGBA_S3TC_DXT1_Format,\n};\n\nKTX2Loader.EngineType = {\n\tUnsignedByteType: UnsignedByteType,\n\tHalfFloatType: HalfFloatType,\n\tFloatType: FloatType,\n};\n\n/* WEB WORKER */\n\nKTX2Loader.BasisWorker = function () {\n\n\tlet config;\n\tlet transcoderPending;\n\tlet BasisModule;\n\n\tconst EngineFormat = _EngineFormat; // eslint-disable-line no-undef\n\tconst EngineType = _EngineType; // eslint-disable-line no-undef\n\tconst TranscoderFormat = _TranscoderFormat; // eslint-disable-line no-undef\n\tconst BasisFormat = _BasisFormat; // eslint-disable-line no-undef\n\n\tself.addEventListener( 'message', function ( e ) {\n\n\t\tconst message = e.data;\n\n\t\tswitch ( message.type ) {\n\n\t\t\tcase 'init':\n\t\t\t\tconfig = message.config;\n\t\t\t\tinit( message.transcoderBinary );\n\t\t\t\tbreak;\n\n\t\t\tcase 'transcode':\n\t\t\t\ttranscoderPending.then( () => {\n\n\t\t\t\t\ttry {\n\n\t\t\t\t\t\tconst { faces, buffers, width, height, hasAlpha, format, type, dfdFlags } = transcode( message.buffer );\n\n\t\t\t\t\t\tself.postMessage( { type: 'transcode', id: message.id, data: { faces, width, height, hasAlpha, format, type, dfdFlags } }, buffers );\n\n\t\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t\tconsole.error( error );\n\n\t\t\t\t\t\tself.postMessage( { type: 'error', id: message.id, error: error.message } );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t} );\n\n\tfunction init( wasmBinary ) {\n\n\t\ttranscoderPending = new Promise( ( resolve ) => {\n\n\t\t\tBasisModule = { wasmBinary, onRuntimeInitialized: resolve };\n\t\t\tBASIS( BasisModule ); // eslint-disable-line no-undef\n\n\t\t} ).then( () => {\n\n\t\t\tBasisModule.initializeBasis();\n\n\t\t\tif ( BasisModule.KTX2File === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.KTX2Loader: Please update Basis Universal transcoder.' );\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tfunction transcode( buffer ) {\n\n\t\tconst ktx2File = new BasisModule.KTX2File( new Uint8Array( buffer ) );\n\n\t\tfunction cleanup() {\n\n\t\t\tktx2File.close();\n\t\t\tktx2File.delete();\n\n\t\t}\n\n\t\tif ( ! ktx2File.isValid() ) {\n\n\t\t\tcleanup();\n\t\t\tthrow new Error( 'THREE.KTX2Loader:\tInvalid or unsupported .ktx2 file' );\n\n\t\t}\n\n\t\tlet basisFormat;\n\n\t\tif ( ktx2File.isUASTC() ) {\n\n\t\t\tbasisFormat = BasisFormat.UASTC;\n\n\t\t} else if ( ktx2File.isETC1S() ) {\n\n\t\t\tbasisFormat = BasisFormat.ETC1S;\n\n\t\t} else if ( ktx2File.isHDR() ) {\n\n\t\t\tbasisFormat = BasisFormat.UASTC_HDR;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.KTX2Loader: Unknown Basis encoding' );\n\n\t\t}\n\n\t\tconst width = ktx2File.getWidth();\n\t\tconst height = ktx2File.getHeight();\n\t\tconst layerCount = ktx2File.getLayers() || 1;\n\t\tconst levelCount = ktx2File.getLevels();\n\t\tconst faceCount = ktx2File.getFaces();\n\t\tconst hasAlpha = ktx2File.getHasAlpha();\n\t\tconst dfdFlags = ktx2File.getDFDFlags();\n\n\t\tconst { transcoderFormat, engineFormat, engineType } = getTranscoderFormat( basisFormat, width, height, hasAlpha );\n\n\t\tif ( ! width || ! height || ! levelCount ) {\n\n\t\t\tcleanup();\n\t\t\tthrow new Error( 'THREE.KTX2Loader:\tInvalid texture' );\n\n\t\t}\n\n\t\tif ( ! ktx2File.startTranscoding() ) {\n\n\t\t\tcleanup();\n\t\t\tthrow new Error( 'THREE.KTX2Loader: .startTranscoding failed' );\n\n\t\t}\n\n\t\tconst faces = [];\n\t\tconst buffers = [];\n\n\t\tfor ( let face = 0; face < faceCount; face ++ ) {\n\n\t\t\tconst mipmaps = [];\n\n\t\t\tfor ( let mip = 0; mip < levelCount; mip ++ ) {\n\n\t\t\t\tconst layerMips = [];\n\n\t\t\t\tlet mipWidth, mipHeight;\n\n\t\t\t\tfor ( let layer = 0; layer < layerCount; layer ++ ) {\n\n\t\t\t\t\tconst levelInfo = ktx2File.getImageLevelInfo( mip, layer, face );\n\n\t\t\t\t\tif ( face === 0 && mip === 0 && layer === 0 && ( levelInfo.origWidth % 4 !== 0 || levelInfo.origHeight % 4 !== 0 ) ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.KTX2Loader: ETC1S and UASTC textures should use multiple-of-four dimensions.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( levelCount > 1 ) {\n\n\t\t\t\t\t\tmipWidth = levelInfo.origWidth;\n\t\t\t\t\t\tmipHeight = levelInfo.origHeight;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Handles non-multiple-of-four dimensions in textures without mipmaps. Textures with\n\t\t\t\t\t\t// mipmaps must use multiple-of-four dimensions, for some texture formats and APIs.\n\t\t\t\t\t\t// See mrdoob/three.js#25908.\n\t\t\t\t\t\tmipWidth = levelInfo.width;\n\t\t\t\t\t\tmipHeight = levelInfo.height;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet dst = new Uint8Array( ktx2File.getImageTranscodedSizeInBytes( mip, layer, 0, transcoderFormat ) );\n\t\t\t\t\tconst status = ktx2File.transcodeImage( dst, mip, layer, face, transcoderFormat, 0, - 1, - 1 );\n\n\t\t\t\t\tif ( engineType === EngineType.HalfFloatType ) {\n\n\t\t\t\t\t\tdst = new Uint16Array( dst.buffer, dst.byteOffset, dst.byteLength / Uint16Array.BYTES_PER_ELEMENT );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! status ) {\n\n\t\t\t\t\t\tcleanup();\n\t\t\t\t\t\tthrow new Error( 'THREE.KTX2Loader: .transcodeImage failed.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlayerMips.push( dst );\n\n\t\t\t\t}\n\n\t\t\t\tconst mipData = concat( layerMips );\n\n\t\t\t\tmipmaps.push( { data: mipData, width: mipWidth, height: mipHeight } );\n\t\t\t\tbuffers.push( mipData.buffer );\n\n\t\t\t}\n\n\t\t\tfaces.push( { mipmaps, width, height, format: engineFormat, type: engineType } );\n\n\t\t}\n\n\t\tcleanup();\n\n\t\treturn { faces, buffers, width, height, hasAlpha, dfdFlags, format: engineFormat, type: engineType };\n\n\t}\n\n\t//\n\n\t// Optimal choice of a transcoder target format depends on the Basis format (ETC1S, UASTC, or\n\t// UASTC HDR), device capabilities, and texture dimensions. The list below ranks the formats\n\t// separately for each format. Currently, priority is assigned based on:\n\t//\n\t//   high quality > low quality > uncompressed\n\t//\n\t// Prioritization may be revisited, or exposed for configuration, in the future.\n\t//\n\t// Reference: https://github.com/KhronosGroup/3D-Formats-Guidelines/blob/main/KTXDeveloperGuide.md\n\tconst FORMAT_OPTIONS = [\n\t\t{\n\t\t\tif: 'astcSupported',\n\t\t\tbasisFormat: [ BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.ASTC_4x4, TranscoderFormat.ASTC_4x4 ],\n\t\t\tengineFormat: [ EngineFormat.RGBA_ASTC_4x4_Format, EngineFormat.RGBA_ASTC_4x4_Format ],\n\t\t\tengineType: [ EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: Infinity,\n\t\t\tpriorityUASTC: 1,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'bptcSupported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.BC7_M5, TranscoderFormat.BC7_M5 ],\n\t\t\tengineFormat: [ EngineFormat.RGBA_BPTC_Format, EngineFormat.RGBA_BPTC_Format ],\n\t\t\tengineType: [ EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: 3,\n\t\t\tpriorityUASTC: 2,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'dxtSupported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.BC1, TranscoderFormat.BC3 ],\n\t\t\tengineFormat: [ EngineFormat.RGBA_S3TC_DXT1_Format, EngineFormat.RGBA_S3TC_DXT5_Format ],\n\t\t\tengineType: [ EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: 4,\n\t\t\tpriorityUASTC: 5,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'etc2Supported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.ETC1, TranscoderFormat.ETC2 ],\n\t\t\tengineFormat: [ EngineFormat.RGB_ETC2_Format, EngineFormat.RGBA_ETC2_EAC_Format ],\n\t\t\tengineType: [ EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: 1,\n\t\t\tpriorityUASTC: 3,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'etc1Supported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.ETC1 ],\n\t\t\tengineFormat: [ EngineFormat.RGB_ETC1_Format ],\n\t\t\tengineType: [ EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: 2,\n\t\t\tpriorityUASTC: 4,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tif: 'pvrtcSupported',\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.PVRTC1_4_RGB, TranscoderFormat.PVRTC1_4_RGBA ],\n\t\t\tengineFormat: [ EngineFormat.RGB_PVRTC_4BPPV1_Format, EngineFormat.RGBA_PVRTC_4BPPV1_Format ],\n\t\t\tengineType: [ EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: 5,\n\t\t\tpriorityUASTC: 6,\n\t\t\tneedsPowerOfTwo: true,\n\t\t},\n\t\t{\n\t\t\tif: 'bptcSupported',\n\t\t\tbasisFormat: [ BasisFormat.UASTC_HDR ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.BC6H ],\n\t\t\tengineFormat: [ EngineFormat.RGB_BPTC_UNSIGNED_Format ],\n\t\t\tengineType: [ EngineType.HalfFloatType ],\n\t\t\tpriorityHDR: 1,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\n\t\t// Uncompressed fallbacks.\n\n\t\t{\n\t\t\tbasisFormat: [ BasisFormat.ETC1S, BasisFormat.UASTC ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.RGBA32, TranscoderFormat.RGBA32 ],\n\t\t\tengineFormat: [ EngineFormat.RGBAFormat, EngineFormat.RGBAFormat ],\n\t\t\tengineType: [ EngineType.UnsignedByteType, EngineType.UnsignedByteType ],\n\t\t\tpriorityETC1S: 100,\n\t\t\tpriorityUASTC: 100,\n\t\t\tneedsPowerOfTwo: false,\n\t\t},\n\t\t{\n\t\t\tbasisFormat: [ BasisFormat.UASTC_HDR ],\n\t\t\ttranscoderFormat: [ TranscoderFormat.RGBA_HALF ],\n\t\t\tengineFormat: [ EngineFormat.RGBAFormat ],\n\t\t\tengineType: [ EngineType.HalfFloatType ],\n\t\t\tpriorityHDR: 100,\n\t\t\tneedsPowerOfTwo: false,\n\t\t}\n\t];\n\n\tconst OPTIONS = {\n\t\t[ BasisFormat.ETC1S ]: FORMAT_OPTIONS\n\t\t\t.filter( ( opt ) => opt.basisFormat.includes( BasisFormat.ETC1S ) )\n\t\t\t.sort( ( a, b ) => a.priorityETC1S - b.priorityETC1S ),\n\n\t\t[ BasisFormat.UASTC ]: FORMAT_OPTIONS\n\t\t\t.filter( ( opt ) => opt.basisFormat.includes( BasisFormat.UASTC ) )\n\t\t\t.sort( ( a, b ) => a.priorityUASTC - b.priorityUASTC ),\n\n\t\t[ BasisFormat.UASTC_HDR ]: FORMAT_OPTIONS\n\t\t\t.filter( ( opt ) => opt.basisFormat.includes( BasisFormat.UASTC_HDR ) )\n\t\t\t.sort( ( a, b ) => a.priorityHDR - b.priorityHDR ),\n\t};\n\n\tfunction getTranscoderFormat( basisFormat, width, height, hasAlpha ) {\n\n\t\tconst options = OPTIONS[ basisFormat ];\n\n\t\tfor ( let i = 0; i < options.length; i ++ ) {\n\n\t\t\tconst opt = options[ i ];\n\n\t\t\tif ( opt.if && ! config[ opt.if ] ) continue;\n\t\t\tif ( ! opt.basisFormat.includes( basisFormat ) ) continue;\n\t\t\tif ( hasAlpha && opt.transcoderFormat.length < 2 ) continue;\n\t\t\tif ( opt.needsPowerOfTwo && ! ( isPowerOfTwo( width ) && isPowerOfTwo( height ) ) ) continue;\n\n\t\t\tconst transcoderFormat = opt.transcoderFormat[ hasAlpha ? 1 : 0 ];\n\t\t\tconst engineFormat = opt.engineFormat[ hasAlpha ? 1 : 0 ];\n\t\t\tconst engineType = opt.engineType[ 0 ];\n\n\t\t\treturn { transcoderFormat, engineFormat, engineType };\n\n\t\t}\n\n\t\tthrow new Error( 'THREE.KTX2Loader: Failed to identify transcoding target.' );\n\n\t}\n\n\tfunction isPowerOfTwo( value ) {\n\n\t\tif ( value <= 2 ) return true;\n\n\t\treturn ( value & ( value - 1 ) ) === 0 && value !== 0;\n\n\t}\n\n\t/**\n\t * Concatenates N byte arrays.\n\t *\n\t * @param {Uint8Array[]} arrays\n\t * @return {Uint8Array}\n\t */\n\tfunction concat( arrays ) {\n\n\t\tif ( arrays.length === 1 ) return arrays[ 0 ];\n\n\t\tlet totalByteLength = 0;\n\n\t\tfor ( let i = 0; i < arrays.length; i ++ ) {\n\n\t\t\tconst array = arrays[ i ];\n\t\t\ttotalByteLength += array.byteLength;\n\n\t\t}\n\n\t\tconst result = new Uint8Array( totalByteLength );\n\n\t\tlet byteOffset = 0;\n\n\t\tfor ( let i = 0; i < arrays.length; i ++ ) {\n\n\t\t\tconst array = arrays[ i ];\n\t\t\tresult.set( array, byteOffset );\n\n\t\t\tbyteOffset += array.byteLength;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n};\n\n// Parsing for non-Basis textures. These textures may have supercompression\n// like Zstd, but they do not require transcoding.\n\nconst UNCOMPRESSED_FORMATS = new Set( [ RGBAFormat, RGBFormat, RGFormat, RedFormat ] );\n\nconst FORMAT_MAP = {\n\n\t[ VK_FORMAT_R32G32B32A32_SFLOAT ]: RGBAFormat,\n\t[ VK_FORMAT_R32G32_SFLOAT ]: RGFormat,\n\t[ VK_FORMAT_R32_SFLOAT ]: RedFormat,\n\n\t[ VK_FORMAT_R16G16B16A16_SFLOAT ]: RGBAFormat,\n\t[ VK_FORMAT_R16G16_SFLOAT ]: RGFormat,\n\t[ VK_FORMAT_R16_SFLOAT ]: RedFormat,\n\n\t[ VK_FORMAT_R8G8B8A8_SRGB ]: RGBAFormat,\n\t[ VK_FORMAT_R8G8B8A8_UNORM ]: RGBAFormat,\n\t[ VK_FORMAT_R8G8_SRGB ]: RGFormat,\n\t[ VK_FORMAT_R8G8_UNORM ]: RGFormat,\n\t[ VK_FORMAT_R8_SRGB ]: RedFormat,\n\t[ VK_FORMAT_R8_UNORM ]: RedFormat,\n\n\t[ VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 ]: RGBFormat,\n\t[ VK_FORMAT_B10G11R11_UFLOAT_PACK32 ]: RGBFormat,\n\n\t[ VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK ]: RGBA_ETC2_EAC_Format,\n\t[ VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK ]: RGB_ETC2_Format,\n\t[ VK_FORMAT_EAC_R11_UNORM_BLOCK ]: R11_EAC_Format,\n\t[ VK_FORMAT_EAC_R11_SNORM_BLOCK ]: SIGNED_R11_EAC_Format,\n\t[ VK_FORMAT_EAC_R11G11_UNORM_BLOCK ]: RG11_EAC_Format,\n\t[ VK_FORMAT_EAC_R11G11_SNORM_BLOCK ]: SIGNED_RG11_EAC_Format,\n\n\t[ VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT ]: RGBA_ASTC_4x4_Format,\n\t[ VK_FORMAT_ASTC_4x4_SRGB_BLOCK ]: RGBA_ASTC_4x4_Format,\n\t[ VK_FORMAT_ASTC_4x4_UNORM_BLOCK ]: RGBA_ASTC_4x4_Format,\n\t[ VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT ]: RGBA_ASTC_6x6_Format,\n\t[ VK_FORMAT_ASTC_6x6_SRGB_BLOCK ]: RGBA_ASTC_6x6_Format,\n\t[ VK_FORMAT_ASTC_6x6_UNORM_BLOCK ]: RGBA_ASTC_6x6_Format,\n\n\t[ VK_FORMAT_BC1_RGBA_SRGB_BLOCK ]: RGBA_S3TC_DXT1_Format,\n\t[ VK_FORMAT_BC1_RGBA_UNORM_BLOCK ]: RGBA_S3TC_DXT1_Format,\n\t[ VK_FORMAT_BC1_RGB_SRGB_BLOCK ]: RGB_S3TC_DXT1_Format,\n\t[ VK_FORMAT_BC1_RGB_UNORM_BLOCK ]: RGB_S3TC_DXT1_Format,\n\n\t[ VK_FORMAT_BC3_SRGB_BLOCK ]: RGBA_S3TC_DXT3_Format,\n\t[ VK_FORMAT_BC3_UNORM_BLOCK ]: RGBA_S3TC_DXT3_Format,\n\n\t[ VK_FORMAT_BC4_SNORM_BLOCK ]: SIGNED_RED_RGTC1_Format,\n\t[ VK_FORMAT_BC4_UNORM_BLOCK ]: RED_RGTC1_Format,\n\n\t[ VK_FORMAT_BC5_SNORM_BLOCK ]: SIGNED_RED_GREEN_RGTC2_Format,\n\t[ VK_FORMAT_BC5_UNORM_BLOCK ]: RED_GREEN_RGTC2_Format,\n\n\t[ VK_FORMAT_BC7_SRGB_BLOCK ]: RGBA_BPTC_Format,\n\t[ VK_FORMAT_BC7_UNORM_BLOCK ]: RGBA_BPTC_Format,\n\n\t[ VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG ]: RGBA_PVRTC_4BPPV1_Format,\n\t[ VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG ]: RGBA_PVRTC_4BPPV1_Format,\n\t[ VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG ]: RGBA_PVRTC_2BPPV1_Format,\n\t[ VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG ]: RGBA_PVRTC_2BPPV1_Format,\n\n};\n\nconst TYPE_MAP = {\n\n\t[ VK_FORMAT_R32G32B32A32_SFLOAT ]: FloatType,\n\t[ VK_FORMAT_R32G32_SFLOAT ]: FloatType,\n\t[ VK_FORMAT_R32_SFLOAT ]: FloatType,\n\n\t[ VK_FORMAT_R16G16B16A16_SFLOAT ]: HalfFloatType,\n\t[ VK_FORMAT_R16G16_SFLOAT ]: HalfFloatType,\n\t[ VK_FORMAT_R16_SFLOAT ]: HalfFloatType,\n\n\t[ VK_FORMAT_R8G8B8A8_SRGB ]: UnsignedByteType,\n\t[ VK_FORMAT_R8G8B8A8_UNORM ]: UnsignedByteType,\n\t[ VK_FORMAT_R8G8_SRGB ]: UnsignedByteType,\n\t[ VK_FORMAT_R8G8_UNORM ]: UnsignedByteType,\n\t[ VK_FORMAT_R8_SRGB ]: UnsignedByteType,\n\t[ VK_FORMAT_R8_UNORM ]: UnsignedByteType,\n\n\t[ VK_FORMAT_E5B9G9R9_UFLOAT_PACK32 ]: UnsignedInt5999Type,\n\t[ VK_FORMAT_B10G11R11_UFLOAT_PACK32 ]: UnsignedInt101111Type,\n\n\t[ VK_FORMAT_ETC2_R8G8B8A8_SRGB_BLOCK ]: UnsignedByteType,\n\t[ VK_FORMAT_ETC2_R8G8B8_SRGB_BLOCK ]: UnsignedByteType,\n\t[ VK_FORMAT_EAC_R11_UNORM_BLOCK ]: UnsignedByteType,\n\t[ VK_FORMAT_EAC_R11_UNORM_BLOCK ]: UnsignedByteType,\n\t[ VK_FORMAT_EAC_R11G11_UNORM_BLOCK ]: UnsignedByteType,\n\t[ VK_FORMAT_EAC_R11G11_UNORM_BLOCK ]: UnsignedByteType,\n\n\t[ VK_FORMAT_ASTC_4x4_SFLOAT_BLOCK_EXT ]: HalfFloatType,\n\t[ VK_FORMAT_ASTC_4x4_SRGB_BLOCK ]: UnsignedByteType,\n\t[ VK_FORMAT_ASTC_4x4_UNORM_BLOCK ]: UnsignedByteType,\n\t[ VK_FORMAT_ASTC_6x6_SFLOAT_BLOCK_EXT ]: HalfFloatType,\n\t[ VK_FORMAT_ASTC_6x6_SRGB_BLOCK ]: UnsignedByteType,\n\t[ VK_FORMAT_ASTC_6x6_UNORM_BLOCK ]: UnsignedByteType,\n\n\t[ VK_FORMAT_BC1_RGBA_SRGB_BLOCK ]: UnsignedByteType,\n\t[ VK_FORMAT_BC1_RGBA_UNORM_BLOCK ]: UnsignedByteType,\n\t[ VK_FORMAT_BC1_RGB_SRGB_BLOCK ]: UnsignedByteType,\n\t[ VK_FORMAT_BC1_RGB_UNORM_BLOCK ]: UnsignedByteType,\n\n\t[ VK_FORMAT_BC3_SRGB_BLOCK ]: UnsignedByteType,\n\t[ VK_FORMAT_BC3_UNORM_BLOCK ]: UnsignedByteType,\n\n\t[ VK_FORMAT_BC4_SNORM_BLOCK ]: UnsignedByteType,\n\t[ VK_FORMAT_BC4_UNORM_BLOCK ]: UnsignedByteType,\n\n\t[ VK_FORMAT_BC5_SNORM_BLOCK ]: UnsignedByteType,\n\t[ VK_FORMAT_BC5_UNORM_BLOCK ]: UnsignedByteType,\n\n\t[ VK_FORMAT_BC7_SRGB_BLOCK ]: UnsignedByteType,\n\t[ VK_FORMAT_BC7_UNORM_BLOCK ]: UnsignedByteType,\n\n\t[ VK_FORMAT_PVRTC1_4BPP_SRGB_BLOCK_IMG ]: UnsignedByteType,\n\t[ VK_FORMAT_PVRTC1_4BPP_UNORM_BLOCK_IMG ]: UnsignedByteType,\n\t[ VK_FORMAT_PVRTC1_2BPP_SRGB_BLOCK_IMG ]: UnsignedByteType,\n\t[ VK_FORMAT_PVRTC1_2BPP_UNORM_BLOCK_IMG ]: UnsignedByteType,\n\n};\n\nasync function createRawTexture( container ) {\n\n\tconst { vkFormat } = container;\n\n\tif ( FORMAT_MAP[ vkFormat ] === undefined ) {\n\n\t\tthrow new Error( 'THREE.KTX2Loader: Unsupported vkFormat: ' + vkFormat );\n\n\t}\n\n\t// TODO: Merge the TYPE_MAP warning into the thrown error above, after r190.\n\tif ( TYPE_MAP[ vkFormat ] === undefined ) {\n\n\t\tconsole.warn( 'THREE.KTX2Loader: Missing \".type\" for vkFormat: ' + vkFormat );\n\n\t}\n\n\t//\n\n\tlet zstd;\n\n\tif ( container.supercompressionScheme === KHR_SUPERCOMPRESSION_ZSTD ) {\n\n\t\tif ( ! _zstd ) {\n\n\t\t\t_zstd = new Promise( async ( resolve ) => {\n\n\t\t\t\tconst zstd = new ZSTDDecoder();\n\t\t\t\tawait zstd.init();\n\t\t\t\tresolve( zstd );\n\n\t\t\t} );\n\n\t\t}\n\n\t\tzstd = await _zstd;\n\n\t}\n\n\t//\n\n\tconst mipmaps = [];\n\n\tfor ( let levelIndex = 0; levelIndex < container.levels.length; levelIndex ++ ) {\n\n\t\tconst levelWidth = Math.max( 1, container.pixelWidth >> levelIndex );\n\t\tconst levelHeight = Math.max( 1, container.pixelHeight >> levelIndex );\n\t\tconst levelDepth = container.pixelDepth ? Math.max( 1, container.pixelDepth >> levelIndex ) : 0;\n\n\t\tconst level = container.levels[ levelIndex ];\n\n\t\tlet levelData;\n\n\t\tif ( container.supercompressionScheme === KHR_SUPERCOMPRESSION_NONE ) {\n\n\t\t\tlevelData = level.levelData;\n\n\t\t} else if ( container.supercompressionScheme === KHR_SUPERCOMPRESSION_ZSTD ) {\n\n\t\t\tlevelData = zstd.decode( level.levelData, level.uncompressedByteLength );\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.KTX2Loader: Unsupported supercompressionScheme.' );\n\n\t\t}\n\n\t\tlet data;\n\n\t\tif ( TYPE_MAP[ vkFormat ] === FloatType ) {\n\n\t\t\tdata = new Float32Array(\n\n\t\t\t\tlevelData.buffer,\n\t\t\t\tlevelData.byteOffset,\n\t\t\t\tlevelData.byteLength / Float32Array.BYTES_PER_ELEMENT\n\n\t\t\t);\n\n\t\t} else if ( TYPE_MAP[ vkFormat ] === HalfFloatType ) {\n\n\t\t\tdata = new Uint16Array(\n\n\t\t\t\tlevelData.buffer,\n\t\t\t\tlevelData.byteOffset,\n\t\t\t\tlevelData.byteLength / Uint16Array.BYTES_PER_ELEMENT\n\n\t\t\t);\n\n\t\t} else if ( TYPE_MAP[ vkFormat ] === UnsignedInt5999Type || TYPE_MAP[ vkFormat ] === UnsignedInt101111Type ) {\n\n\t\t\tdata = new Uint32Array(\n\n\t\t\t\tlevelData.buffer,\n\t\t\t\tlevelData.byteOffset,\n\t\t\t\tlevelData.byteLength / Uint32Array.BYTES_PER_ELEMENT\n\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tdata = levelData;\n\n\t\t}\n\n\t\tmipmaps.push( {\n\n\t\t\tdata: data,\n\t\t\twidth: levelWidth,\n\t\t\theight: levelHeight,\n\t\t\tdepth: levelDepth,\n\n\t\t} );\n\n\t}\n\n\t// levelCount = 0 implies runtime-generated mipmaps.\n\tconst useMipmaps = container.levelCount === 0 || mipmaps.length > 1;\n\n\tlet texture;\n\n\tif ( UNCOMPRESSED_FORMATS.has( FORMAT_MAP[ vkFormat ] ) ) {\n\n\t\ttexture = container.pixelDepth === 0\n\t\t\t? new DataTexture( mipmaps[ 0 ].data, container.pixelWidth, container.pixelHeight )\n\t\t\t: new Data3DTexture( mipmaps[ 0 ].data, container.pixelWidth, container.pixelHeight, container.pixelDepth );\n\t\ttexture.minFilter = useMipmaps ? NearestMipmapNearestFilter : NearestFilter;\n\t\ttexture.magFilter = NearestFilter;\n\t\ttexture.generateMipmaps = container.levelCount === 0;\n\n\t} else {\n\n\t\tif ( container.pixelDepth > 0 ) throw new Error( 'THREE.KTX2Loader: Unsupported pixelDepth.' );\n\n\t\ttexture = new CompressedTexture( mipmaps, container.pixelWidth, container.pixelHeight );\n\t\ttexture.minFilter = useMipmaps ? LinearMipmapLinearFilter : LinearFilter;\n\t\ttexture.magFilter = LinearFilter;\n\n\t}\n\n\ttexture.mipmaps = mipmaps;\n\n\ttexture.type = TYPE_MAP[ vkFormat ];\n\ttexture.format = FORMAT_MAP[ vkFormat ];\n\ttexture.colorSpace = parseColorSpace( container );\n\ttexture.needsUpdate = true;\n\n\t//\n\n\treturn Promise.resolve( texture );\n\n}\n\nfunction parseColorSpace( container ) {\n\n\tconst dfd = container.dataFormatDescriptor[ 0 ];\n\n\tif ( dfd.colorPrimaries === KHR_DF_PRIMARIES_BT709 ) {\n\n\t\treturn dfd.transferFunction === KHR_DF_TRANSFER_SRGB ? SRGBColorSpace : LinearSRGBColorSpace;\n\n\t} else if ( dfd.colorPrimaries === KHR_DF_PRIMARIES_DISPLAYP3 ) {\n\n\t\treturn dfd.transferFunction === KHR_DF_TRANSFER_SRGB ? DisplayP3ColorSpace : LinearDisplayP3ColorSpace;\n\n\t} else if ( dfd.colorPrimaries === KHR_DF_PRIMARIES_UNSPECIFIED ) {\n\n\t\treturn NoColorSpace;\n\n\t} else {\n\n\t\tconsole.warn( `THREE.KTX2Loader: Unsupported color primaries, \"${ dfd.colorPrimaries }\"` );\n\t\treturn NoColorSpace;\n\n\t}\n\n}\n\nexport { KTX2Loader };\n", "import {\n\tCompressedTextureLoader\n} from 'three';\n\n/**\n * A loader for the KTX texture compression format.\n *\n * References:\n * - [The KTX File Format and Tools](https://www.khronos.org/opengles/sdk/tools/KTX/)\n * - [Babylon.JS khronosTextureContainer.ts](https://github.com/BabylonJS/Babylon.js/blob/master/src/Misc/khronosTextureContainer.ts)\n *\n * ```js\n * const loader = new KTXLoader();\n *\n * const map = loader.load( 'textures/compressed/lensflare_ASTC8x8.ktx' )\n * map.colorSpace = THREE.SRGBColorSpace; // only for color textures\n * ```\n *\n * @augments CompressedTextureLoader\n * @three_import import { KTXLoader } from 'three/addons/loaders/KTXLoader.js';\n */\nclass KTXLoader extends CompressedTextureLoader {\n\n\t/**\n\t * Constructs a new KTX loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Parses the given KTX texture data.\n\t *\n\t * @param {ArrayBuffer} buffer - The raw texture data.\n\t * @param {boolean} loadMipmaps - Whether to load mipmaps or not.\n\t * @return {CompressedTextureLoader~TexData} An object representing the parsed texture data.\n\t */\n\tparse( buffer, loadMipmaps ) {\n\n\t\tconst ktx = new KhronosTextureContainer( buffer, 1 );\n\n\t\treturn {\n\t\t\tmipmaps: ktx.mipmaps( loadMipmaps ),\n\t\t\twidth: ktx.pixelWidth,\n\t\t\theight: ktx.pixelHeight,\n\t\t\tformat: ktx.glInternalFormat,\n\t\t\tisCubemap: ktx.numberOfFaces === 6,\n\t\t\tmipmapCount: ktx.numberOfMipmapLevels\n\t\t};\n\n\t}\n\n}\n\nconst HEADER_LEN = 12 + ( 13 * 4 ); // identifier + header elements (not including key value meta-data pairs)\n// load types\nconst COMPRESSED_2D = 0; // uses a gl.compressedTexImage2D()\n//const COMPRESSED_3D = 1; // uses a gl.compressedTexImage3D()\n//const TEX_2D = 2; // uses a gl.texImage2D()\n//const TEX_3D = 3; // uses a gl.texImage3D()\n\nclass KhronosTextureContainer {\n\n\t/**\n\t * @private\n\t * @param {ArrayBuffer} arrayBuffer - contents of the KTX container file\n\t * @param {number} facesExpected - should be either 1 or 6, based whether a cube texture or or\n\t * @param {boolean} threeDExpected - provision for indicating that data should be a 3D texture, not implemented\n\t * @param {boolean} textureArrayExpected - provision for indicating that data should be a texture array, not implemented\n\t */\n\tconstructor( arrayBuffer, facesExpected /*, threeDExpected, textureArrayExpected */ ) {\n\n\t\tthis.arrayBuffer = arrayBuffer;\n\n\t\t// Test that it is a ktx formatted file, based on the first 12 bytes, character representation is:\n\t\t// '\u00B4', 'K', 'T', 'X', ' ', '1', '1', '\u00AA', '\\r', '\\n', '\\x1A', '\\n'\n\t\t// 0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A\n\t\tconst identifier = new Uint8Array( this.arrayBuffer, 0, 12 );\n\t\tif ( identifier[ 0 ] !== 0xAB ||\n\t\t\tidentifier[ 1 ] !== 0x4B ||\n\t\t\tidentifier[ 2 ] !== 0x54 ||\n\t\t\tidentifier[ 3 ] !== 0x58 ||\n\t\t\tidentifier[ 4 ] !== 0x20 ||\n\t\t\tidentifier[ 5 ] !== 0x31 ||\n\t\t\tidentifier[ 6 ] !== 0x31 ||\n\t\t\tidentifier[ 7 ] !== 0xBB ||\n\t\t\tidentifier[ 8 ] !== 0x0D ||\n\t\t\tidentifier[ 9 ] !== 0x0A ||\n\t\t\tidentifier[ 10 ] !== 0x1A ||\n\t\t\tidentifier[ 11 ] !== 0x0A ) {\n\n\t\t\tconsole.error( 'texture missing KTX identifier' );\n\t\t\treturn;\n\n\t\t}\n\n\t\t// load the reset of the header in native 32 bit uint\n\t\tconst dataSize = Uint32Array.BYTES_PER_ELEMENT;\n\t\tconst headerDataView = new DataView( this.arrayBuffer, 12, 13 * dataSize );\n\t\tconst endianness = headerDataView.getUint32( 0, true );\n\t\tconst littleEndian = endianness === 0x04030201;\n\n\t\tthis.glType = headerDataView.getUint32( 1 * dataSize, littleEndian ); // must be 0 for compressed textures\n\t\tthis.glTypeSize = headerDataView.getUint32( 2 * dataSize, littleEndian ); // must be 1 for compressed textures\n\t\tthis.glFormat = headerDataView.getUint32( 3 * dataSize, littleEndian ); // must be 0 for compressed textures\n\t\tthis.glInternalFormat = headerDataView.getUint32( 4 * dataSize, littleEndian ); // the value of arg passed to gl.compressedTexImage2D(,,x,,,,)\n\t\tthis.glBaseInternalFormat = headerDataView.getUint32( 5 * dataSize, littleEndian ); // specify GL_RGB, GL_RGBA, GL_ALPHA, etc (un-compressed only)\n\t\tthis.pixelWidth = headerDataView.getUint32( 6 * dataSize, littleEndian ); // level 0 value of arg passed to gl.compressedTexImage2D(,,,x,,,)\n\t\tthis.pixelHeight = headerDataView.getUint32( 7 * dataSize, littleEndian ); // level 0 value of arg passed to gl.compressedTexImage2D(,,,,x,,)\n\t\tthis.pixelDepth = headerDataView.getUint32( 8 * dataSize, littleEndian ); // level 0 value of arg passed to gl.compressedTexImage3D(,,,,,x,,)\n\t\tthis.numberOfArrayElements = headerDataView.getUint32( 9 * dataSize, littleEndian ); // used for texture arrays\n\t\tthis.numberOfFaces = headerDataView.getUint32( 10 * dataSize, littleEndian ); // used for cubemap textures, should either be 1 or 6\n\t\tthis.numberOfMipmapLevels = headerDataView.getUint32( 11 * dataSize, littleEndian ); // number of levels; disregard possibility of 0 for compressed textures\n\t\tthis.bytesOfKeyValueData = headerDataView.getUint32( 12 * dataSize, littleEndian ); // the amount of space after the header for meta-data\n\n\t\t// Make sure we have a compressed type.  Not only reduces work, but probably better to let dev know they are not compressing.\n\t\tif ( this.glType !== 0 ) {\n\n\t\t\tconsole.warn( 'only compressed formats currently supported' );\n\t\t\treturn;\n\n\t\t} else {\n\n\t\t\t// value of zero is an indication to generate mipmaps @ runtime.  Not usually allowed for compressed, so disregard.\n\t\t\tthis.numberOfMipmapLevels = Math.max( 1, this.numberOfMipmapLevels );\n\n\t\t}\n\n\t\tif ( this.pixelHeight === 0 || this.pixelDepth !== 0 ) {\n\n\t\t\tconsole.warn( 'only 2D textures currently supported' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.numberOfArrayElements !== 0 ) {\n\n\t\t\tconsole.warn( 'texture arrays not currently supported' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.numberOfFaces !== facesExpected ) {\n\n\t\t\tconsole.warn( 'number of faces expected' + facesExpected + ', but found ' + this.numberOfFaces );\n\t\t\treturn;\n\n\t\t}\n\n\t\t// we now have a completely validated file, so could use existence of loadType as success\n\t\t// would need to make this more elaborate & adjust checks above to support more than one load type\n\t\tthis.loadType = COMPRESSED_2D;\n\n\t}\n\n\tmipmaps( loadMipmaps ) {\n\n\t\tconst mipmaps = [];\n\n\t\t// initialize width & height for level 1\n\t\tlet dataOffset = HEADER_LEN + this.bytesOfKeyValueData;\n\t\tlet width = this.pixelWidth;\n\t\tlet height = this.pixelHeight;\n\t\tconst mipmapCount = loadMipmaps ? this.numberOfMipmapLevels : 1;\n\n\t\tfor ( let level = 0; level < mipmapCount; level ++ ) {\n\n\t\t\tconst imageSize = new Int32Array( this.arrayBuffer, dataOffset, 1 )[ 0 ]; // size per face, since not supporting array cubemaps\n\t\t\tdataOffset += 4; // size of the image + 4 for the imageSize field\n\n\t\t\tfor ( let face = 0; face < this.numberOfFaces; face ++ ) {\n\n\t\t\t\tconst byteArray = new Uint8Array( this.arrayBuffer, dataOffset, imageSize );\n\n\t\t\t\tmipmaps.push( { 'data': byteArray, 'width': width, 'height': height } );\n\n\t\t\t\tdataOffset += imageSize;\n\t\t\t\tdataOffset += 3 - ( ( imageSize + 3 ) % 4 ); // add padding for odd sized image\n\n\t\t\t}\n\n\t\t\twidth = Math.max( 1.0, width * 0.5 );\n\t\t\theight = Math.max( 1.0, height * 0.5 );\n\n\t\t}\n\n\t\treturn mipmaps;\n\n\t}\n\n}\n\nexport { KTXLoader };\n", "import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tColor,\n\tFileLoader,\n\tGroup,\n\tLineBasicMaterial,\n\tLineSegments,\n\tLoader,\n\tMatrix4,\n\tMesh,\n\tMeshStandardMaterial,\n\tSRGBColorSpace,\n\tVector3,\n\tRay\n} from 'three';\n\n// Special surface finish tag types.\n// Note: \"MATERIAL\" tag (e.g. GLITTER, SPECKLE) is not implemented\nconst FINISH_TYPE_DEFAULT = 0;\nconst FINISH_TYPE_CHROME = 1;\nconst FINISH_TYPE_PEARLESCENT = 2;\nconst FINISH_TYPE_RUBBER = 3;\nconst FINISH_TYPE_MATTE_METALLIC = 4;\nconst FINISH_TYPE_METAL = 5;\n\n// State machine to search a subobject path.\n// The LDraw standard establishes these various possible subfolders.\nconst FILE_LOCATION_TRY_PARTS = 0;\nconst FILE_LOCATION_TRY_P = 1;\nconst FILE_LOCATION_TRY_MODELS = 2;\nconst FILE_LOCATION_AS_IS = 3;\nconst FILE_LOCATION_TRY_RELATIVE = 4;\nconst FILE_LOCATION_TRY_ABSOLUTE = 5;\nconst FILE_LOCATION_NOT_FOUND = 6;\n\nconst MAIN_COLOUR_CODE = '16';\nconst MAIN_EDGE_COLOUR_CODE = '24';\n\nconst COLOR_SPACE_LDRAW = SRGBColorSpace;\n\nconst _tempVec0 = new Vector3();\nconst _tempVec1 = new Vector3();\n\n\nclass ConditionalLineSegments extends LineSegments {\n\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\t\tthis.isConditionalLine = true;\n\n\t}\n\n}\n\nfunction generateFaceNormals( faces ) {\n\n\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\tconst face = faces[ i ];\n\t\tconst vertices = face.vertices;\n\t\tconst v0 = vertices[ 0 ];\n\t\tconst v1 = vertices[ 1 ];\n\t\tconst v2 = vertices[ 2 ];\n\n\t\t_tempVec0.subVectors( v1, v0 );\n\t\t_tempVec1.subVectors( v2, v1 );\n\t\tface.faceNormal = new Vector3()\n\t\t\t.crossVectors( _tempVec0, _tempVec1 )\n\t\t\t.normalize();\n\n\t}\n\n}\n\nconst _ray = new Ray();\nfunction smoothNormals( faces, lineSegments, checkSubSegments = false ) {\n\n\t// NOTE: 1e2 is pretty coarse but was chosen to quantize the resulting value because\n\t// it allows edges to be smoothed as expected (see minifig arms).\n\t// --\n\t// And the vector values are initialize multiplied by 1 + 1e-10 to account for floating\n\t// point errors on vertices along quantization boundaries. Ie after matrix multiplication\n\t// vertices that should be merged might be set to \"1.7\" and \"1.6999...\" meaning they won't\n\t// get merged. This added epsilon attempts to push these error values to the same quantized\n\t// value for the sake of hashing. See \"AT-ST mini\" dishes. See mrdoob/three#23169.\n\n\tconst hashMultiplier = ( 1 + 1e-10 ) * 1e2;\n\tfunction hashVertex( v ) {\n\n\t\tconst x = ~ ~ ( v.x * hashMultiplier );\n\t\tconst y = ~ ~ ( v.y * hashMultiplier );\n\t\tconst z = ~ ~ ( v.z * hashMultiplier );\n\n\t\treturn `${ x },${ y },${ z }`;\n\n\t}\n\n\tfunction hashEdge( v0, v1 ) {\n\n\t\treturn `${ hashVertex( v0 ) }_${ hashVertex( v1 ) }`;\n\n\t}\n\n\t// converts the two vertices to a ray with a normalized direction and origin of 0, 0, 0 projected\n\t// onto the original line.\n\tfunction toNormalizedRay( v0, v1, targetRay ) {\n\n\t\ttargetRay.direction.subVectors( v1, v0 ).normalize();\n\n\t\tconst scalar = v0.dot( targetRay.direction );\n\t\ttargetRay.origin.copy( v0 ).addScaledVector( targetRay.direction, - scalar );\n\n\t\treturn targetRay;\n\n\t}\n\n\tfunction hashRay( ray ) {\n\n\t\treturn hashEdge( ray.origin, ray.direction );\n\n\t}\n\n\tconst hardEdges = new Set();\n\tconst hardEdgeRays = new Map();\n\tconst halfEdgeList = {};\n\tconst normals = [];\n\n\t// Save the list of hard edges by hash\n\tfor ( let i = 0, l = lineSegments.length; i < l; i ++ ) {\n\n\t\tconst ls = lineSegments[ i ];\n\t\tconst vertices = ls.vertices;\n\t\tconst v0 = vertices[ 0 ];\n\t\tconst v1 = vertices[ 1 ];\n\t\thardEdges.add( hashEdge( v0, v1 ) );\n\t\thardEdges.add( hashEdge( v1, v0 ) );\n\n\t\t// only generate the hard edge ray map if we're checking subsegments because it's more expensive to check\n\t\t// and requires more memory.\n\t\tif ( checkSubSegments ) {\n\n\t\t\t// add both ray directions to the map\n\t\t\tconst ray = toNormalizedRay( v0, v1, new Ray() );\n\t\t\tconst rh1 = hashRay( ray );\n\t\t\tif ( ! hardEdgeRays.has( rh1 ) ) {\n\n\t\t\t\ttoNormalizedRay( v1, v0, ray );\n\t\t\t\tconst rh2 = hashRay( ray );\n\n\t\t\t\tconst info = {\n\t\t\t\t\tray,\n\t\t\t\t\tdistances: [],\n\t\t\t\t};\n\n\t\t\t\thardEdgeRays.set( rh1, info );\n\t\t\t\thardEdgeRays.set( rh2, info );\n\n\t\t\t}\n\n\t\t\t// store both segments ends in min, max order in the distances array to check if a face edge is a\n\t\t\t// subsegment later.\n\t\t\tconst info = hardEdgeRays.get( rh1 );\n\t\t\tlet d0 = info.ray.direction.dot( v0 );\n\t\t\tlet d1 = info.ray.direction.dot( v1 );\n\t\t\tif ( d0 > d1 ) {\n\n\t\t\t\t[ d0, d1 ] = [ d1, d0 ];\n\n\t\t\t}\n\n\t\t\tinfo.distances.push( d0, d1 );\n\n\t\t}\n\n\t}\n\n\t// track the half edges associated with each triangle\n\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\tconst tri = faces[ i ];\n\t\tconst vertices = tri.vertices;\n\t\tconst vertCount = vertices.length;\n\t\tfor ( let i2 = 0; i2 < vertCount; i2 ++ ) {\n\n\t\t\tconst index = i2;\n\t\t\tconst next = ( i2 + 1 ) % vertCount;\n\t\t\tconst v0 = vertices[ index ];\n\t\t\tconst v1 = vertices[ next ];\n\t\t\tconst hash = hashEdge( v0, v1 );\n\n\t\t\t// don't add the triangle if the edge is supposed to be hard\n\t\t\tif ( hardEdges.has( hash ) ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// if checking subsegments then check to see if this edge lies on a hard edge ray and whether its within any ray bounds\n\t\t\tif ( checkSubSegments ) {\n\n\t\t\t\ttoNormalizedRay( v0, v1, _ray );\n\n\t\t\t\tconst rayHash = hashRay( _ray );\n\t\t\t\tif ( hardEdgeRays.has( rayHash ) ) {\n\n\t\t\t\t\tconst info = hardEdgeRays.get( rayHash );\n\t\t\t\t\tconst { ray, distances } = info;\n\t\t\t\t\tlet d0 = ray.direction.dot( v0 );\n\t\t\t\t\tlet d1 = ray.direction.dot( v1 );\n\n\t\t\t\t\tif ( d0 > d1 ) {\n\n\t\t\t\t\t\t[ d0, d1 ] = [ d1, d0 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// return early if the face edge is found to be a subsegment of a line edge meaning the edge will have \"hard\" normals\n\t\t\t\t\tlet found = false;\n\t\t\t\t\tfor ( let i = 0, l = distances.length; i < l; i += 2 ) {\n\n\t\t\t\t\t\tif ( d0 >= distances[ i ] && d1 <= distances[ i + 1 ] ) {\n\n\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( found ) {\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst info = {\n\t\t\t\tindex: index,\n\t\t\t\ttri: tri\n\t\t\t};\n\t\t\thalfEdgeList[ hash ] = info;\n\n\t\t}\n\n\t}\n\n\t// Iterate until we've tried to connect all faces to share normals\n\twhile ( true ) {\n\n\t\t// Stop if there are no more faces left\n\t\tlet halfEdge = null;\n\t\tfor ( const key in halfEdgeList ) {\n\n\t\t\thalfEdge = halfEdgeList[ key ];\n\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( halfEdge === null ) {\n\n\t\t\tbreak;\n\n\t\t}\n\n\t\t// Exhaustively find all connected faces\n\t\tconst queue = [ halfEdge ];\n\t\twhile ( queue.length > 0 ) {\n\n\t\t\t// initialize all vertex normals in this triangle\n\t\t\tconst tri = queue.pop().tri;\n\t\t\tconst vertices = tri.vertices;\n\t\t\tconst vertNormals = tri.normals;\n\t\t\tconst faceNormal = tri.faceNormal;\n\n\t\t\t// Check if any edge is connected to another triangle edge\n\t\t\tconst vertCount = vertices.length;\n\t\t\tfor ( let i2 = 0; i2 < vertCount; i2 ++ ) {\n\n\t\t\t\tconst index = i2;\n\t\t\t\tconst next = ( i2 + 1 ) % vertCount;\n\t\t\t\tconst v0 = vertices[ index ];\n\t\t\t\tconst v1 = vertices[ next ];\n\n\t\t\t\t// delete this triangle from the list so it won't be found again\n\t\t\t\tconst hash = hashEdge( v0, v1 );\n\t\t\t\tdelete halfEdgeList[ hash ];\n\n\t\t\t\tconst reverseHash = hashEdge( v1, v0 );\n\t\t\t\tconst otherInfo = halfEdgeList[ reverseHash ];\n\t\t\t\tif ( otherInfo ) {\n\n\t\t\t\t\tconst otherTri = otherInfo.tri;\n\t\t\t\t\tconst otherIndex = otherInfo.index;\n\t\t\t\t\tconst otherNormals = otherTri.normals;\n\t\t\t\t\tconst otherVertCount = otherNormals.length;\n\t\t\t\t\tconst otherFaceNormal = otherTri.faceNormal;\n\n\t\t\t\t\t// NOTE: If the angle between faces is > 67.5 degrees then assume it's\n\t\t\t\t\t// hard edge. There are some cases where the line segments do not line up exactly\n\t\t\t\t\t// with or span multiple triangle edges (see Lunar Vehicle wheels).\n\t\t\t\t\tif ( Math.abs( otherTri.faceNormal.dot( tri.faceNormal ) ) < 0.25 ) {\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// if this triangle has already been traversed then it won't be in\n\t\t\t\t\t// the halfEdgeList. If it has not then add it to the queue and delete\n\t\t\t\t\t// it so it won't be found again.\n\t\t\t\t\tif ( reverseHash in halfEdgeList ) {\n\n\t\t\t\t\t\tqueue.push( otherInfo );\n\t\t\t\t\t\tdelete halfEdgeList[ reverseHash ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// share the first normal\n\t\t\t\t\tconst otherNext = ( otherIndex + 1 ) % otherVertCount;\n\t\t\t\t\tif (\n\t\t\t\t\t\tvertNormals[ index ] && otherNormals[ otherNext ] &&\n\t\t\t\t\t\tvertNormals[ index ] !== otherNormals[ otherNext ]\n\t\t\t\t\t) {\n\n\t\t\t\t\t\totherNormals[ otherNext ].norm.add( vertNormals[ index ].norm );\n\t\t\t\t\t\tvertNormals[ index ].norm = otherNormals[ otherNext ].norm;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet sharedNormal1 = vertNormals[ index ] || otherNormals[ otherNext ];\n\t\t\t\t\tif ( sharedNormal1 === null ) {\n\n\t\t\t\t\t\t// it's possible to encounter an edge of a triangle that has already been traversed meaning\n\t\t\t\t\t\t// both edges already have different normals defined and shared. To work around this we create\n\t\t\t\t\t\t// a wrapper object so when those edges are merged the normals can be updated everywhere.\n\t\t\t\t\t\tsharedNormal1 = { norm: new Vector3() };\n\t\t\t\t\t\tnormals.push( sharedNormal1.norm );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( vertNormals[ index ] === null ) {\n\n\t\t\t\t\t\tvertNormals[ index ] = sharedNormal1;\n\t\t\t\t\t\tsharedNormal1.norm.add( faceNormal );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( otherNormals[ otherNext ] === null ) {\n\n\t\t\t\t\t\totherNormals[ otherNext ] = sharedNormal1;\n\t\t\t\t\t\tsharedNormal1.norm.add( otherFaceNormal );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// share the second normal\n\t\t\t\t\tif (\n\t\t\t\t\t\tvertNormals[ next ] && otherNormals[ otherIndex ] &&\n\t\t\t\t\t\tvertNormals[ next ] !== otherNormals[ otherIndex ]\n\t\t\t\t\t) {\n\n\t\t\t\t\t\totherNormals[ otherIndex ].norm.add( vertNormals[ next ].norm );\n\t\t\t\t\t\tvertNormals[ next ].norm = otherNormals[ otherIndex ].norm;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet sharedNormal2 = vertNormals[ next ] || otherNormals[ otherIndex ];\n\t\t\t\t\tif ( sharedNormal2 === null ) {\n\n\t\t\t\t\t\tsharedNormal2 = { norm: new Vector3() };\n\t\t\t\t\t\tnormals.push( sharedNormal2.norm );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( vertNormals[ next ] === null ) {\n\n\t\t\t\t\t\tvertNormals[ next ] = sharedNormal2;\n\t\t\t\t\t\tsharedNormal2.norm.add( faceNormal );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( otherNormals[ otherIndex ] === null ) {\n\n\t\t\t\t\t\totherNormals[ otherIndex ] = sharedNormal2;\n\t\t\t\t\t\tsharedNormal2.norm.add( otherFaceNormal );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// The normals of each face have been added up so now we average them by normalizing the vector.\n\tfor ( let i = 0, l = normals.length; i < l; i ++ ) {\n\n\t\tnormals[ i ].normalize();\n\n\t}\n\n}\n\nfunction isPartType( type ) {\n\n\treturn type === 'Part' || type === 'Unofficial_Part';\n\n}\n\nfunction isPrimitiveType( type ) {\n\n\treturn /primitive/i.test( type ) || type === 'Subpart';\n\n}\n\nclass LineParser {\n\n\tconstructor( line, lineNumber ) {\n\n\t\tthis.line = line;\n\t\tthis.lineLength = line.length;\n\t\tthis.currentCharIndex = 0;\n\t\tthis.currentChar = ' ';\n\t\tthis.lineNumber = lineNumber;\n\n\t}\n\n\tseekNonSpace() {\n\n\t\twhile ( this.currentCharIndex < this.lineLength ) {\n\n\t\t\tthis.currentChar = this.line.charAt( this.currentCharIndex );\n\n\t\t\tif ( this.currentChar !== ' ' && this.currentChar !== '\\t' ) {\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tthis.currentCharIndex ++;\n\n\t\t}\n\n\t}\n\n\tgetToken() {\n\n\t\tconst pos0 = this.currentCharIndex ++;\n\n\t\t// Seek space\n\t\twhile ( this.currentCharIndex < this.lineLength ) {\n\n\t\t\tthis.currentChar = this.line.charAt( this.currentCharIndex );\n\n\t\t\tif ( this.currentChar === ' ' || this.currentChar === '\\t' ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tthis.currentCharIndex ++;\n\n\t\t}\n\n\t\tconst pos1 = this.currentCharIndex;\n\n\t\tthis.seekNonSpace();\n\n\t\treturn this.line.substring( pos0, pos1 );\n\n\t}\n\n\tgetVector() {\n\n\t\treturn new Vector3( parseFloat( this.getToken() ), parseFloat( this.getToken() ), parseFloat( this.getToken() ) );\n\n\t}\n\n\tgetRemainingString() {\n\n\t\treturn this.line.substring( this.currentCharIndex, this.lineLength );\n\n\t}\n\n\tisAtTheEnd() {\n\n\t\treturn this.currentCharIndex >= this.lineLength;\n\n\t}\n\n\tsetToEnd() {\n\n\t\tthis.currentCharIndex = this.lineLength;\n\n\t}\n\n\tgetLineNumberString() {\n\n\t\treturn this.lineNumber >= 0 ? ' at line ' + this.lineNumber : '';\n\n\t}\n\n}\n\n// Fetches and parses an intermediate representation of LDraw parts files.\nclass LDrawParsedCache {\n\n\tconstructor( loader ) {\n\n\t\tthis.loader = loader;\n\t\tthis._cache = {};\n\n\t}\n\n\tcloneResult( original ) {\n\n\t\tconst result = {};\n\n\t\t// vertices are transformed and normals computed before being converted to geometry\n\t\t// so these pieces must be cloned.\n\t\tresult.faces = original.faces.map( face => {\n\n\t\t\treturn {\n\t\t\t\tcolorCode: face.colorCode,\n\t\t\t\tmaterial: face.material,\n\t\t\t\tvertices: face.vertices.map( v => v.clone() ),\n\t\t\t\tnormals: face.normals.map( () => null ),\n\t\t\t\tfaceNormal: null\n\t\t\t};\n\n\t\t} );\n\n\t\tresult.conditionalSegments = original.conditionalSegments.map( face => {\n\n\t\t\treturn {\n\t\t\t\tcolorCode: face.colorCode,\n\t\t\t\tmaterial: face.material,\n\t\t\t\tvertices: face.vertices.map( v => v.clone() ),\n\t\t\t\tcontrolPoints: face.controlPoints.map( v => v.clone() )\n\t\t\t};\n\n\t\t} );\n\n\t\tresult.lineSegments = original.lineSegments.map( face => {\n\n\t\t\treturn {\n\t\t\t\tcolorCode: face.colorCode,\n\t\t\t\tmaterial: face.material,\n\t\t\t\tvertices: face.vertices.map( v => v.clone() )\n\t\t\t};\n\n\t\t} );\n\n\t\t// none if this is subsequently modified\n\t\tresult.type = original.type;\n\t\tresult.category = original.category;\n\t\tresult.keywords = original.keywords;\n\t\tresult.author = original.author;\n\t\tresult.subobjects = original.subobjects;\n\t\tresult.fileName = original.fileName;\n\t\tresult.totalFaces = original.totalFaces;\n\t\tresult.startingBuildingStep = original.startingBuildingStep;\n\t\tresult.materials = original.materials;\n\t\tresult.group = null;\n\t\treturn result;\n\n\t}\n\n\tasync fetchData( fileName ) {\n\n\t\tlet triedLowerCase = false;\n\t\tlet locationState = FILE_LOCATION_TRY_PARTS;\n\t\twhile ( locationState !== FILE_LOCATION_NOT_FOUND ) {\n\n\t\t\tlet subobjectURL = fileName;\n\t\t\tswitch ( locationState ) {\n\n\t\t\t\tcase FILE_LOCATION_AS_IS:\n\t\t\t\t\tlocationState = locationState + 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase FILE_LOCATION_TRY_PARTS:\n\t\t\t\t\tsubobjectURL = 'parts/' + subobjectURL;\n\t\t\t\t\tlocationState = locationState + 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase FILE_LOCATION_TRY_P:\n\t\t\t\t\tsubobjectURL = 'p/' + subobjectURL;\n\t\t\t\t\tlocationState = locationState + 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase FILE_LOCATION_TRY_MODELS:\n\t\t\t\t\tsubobjectURL = 'models/' + subobjectURL;\n\t\t\t\t\tlocationState = locationState + 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase FILE_LOCATION_TRY_RELATIVE:\n\t\t\t\t\tsubobjectURL = fileName.substring( 0, fileName.lastIndexOf( '/' ) + 1 ) + subobjectURL;\n\t\t\t\t\tlocationState = locationState + 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase FILE_LOCATION_TRY_ABSOLUTE:\n\n\t\t\t\t\tif ( triedLowerCase ) {\n\n\t\t\t\t\t\t// Try absolute path\n\t\t\t\t\t\tlocationState = FILE_LOCATION_NOT_FOUND;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Next attempt is lower case\n\t\t\t\t\t\tfileName = fileName.toLowerCase();\n\t\t\t\t\t\tsubobjectURL = fileName;\n\t\t\t\t\t\ttriedLowerCase = true;\n\t\t\t\t\t\tlocationState = FILE_LOCATION_TRY_PARTS;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tconst loader = this.loader;\n\t\t\tconst fileLoader = new FileLoader( loader.manager );\n\t\t\tfileLoader.setPath( loader.partsLibraryPath );\n\t\t\tfileLoader.setRequestHeader( loader.requestHeader );\n\t\t\tfileLoader.setWithCredentials( loader.withCredentials );\n\n\t\t\ttry {\n\n\t\t\t\tconst text = await fileLoader.loadAsync( subobjectURL );\n\t\t\t\treturn text;\n\n\t\t\t} catch ( _ ) {\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthrow new Error( 'LDrawLoader: Subobject \"' + fileName + '\" could not be loaded.' );\n\n\t}\n\n\tparse( text, fileName = null ) {\n\n\t\tconst loader = this.loader;\n\n\t\t// final results\n\t\tconst faces = [];\n\t\tconst lineSegments = [];\n\t\tconst conditionalSegments = [];\n\t\tconst subobjects = [];\n\t\tconst materials = {};\n\n\t\tconst getLocalMaterial = colorCode => {\n\n\t\t\treturn materials[ colorCode ] || null;\n\n\t\t};\n\n\t\tlet type = 'Model';\n\t\tlet category = null;\n\t\tlet keywords = null;\n\t\tlet author = null;\n\t\tlet totalFaces = 0;\n\n\t\t// split into lines\n\t\tif ( text.indexOf( '\\r\\n' ) !== - 1 ) {\n\n\t\t\t// This is faster than String.split with regex that splits on both\n\t\t\ttext = text.replace( /\\r\\n/g, '\\n' );\n\n\t\t}\n\n\t\tconst lines = text.split( '\\n' );\n\t\tconst numLines = lines.length;\n\n\t\tlet parsingEmbeddedFiles = false;\n\t\tlet currentEmbeddedFileName = null;\n\t\tlet currentEmbeddedText = null;\n\n\t\tlet bfcCertified = false;\n\t\tlet bfcCCW = true;\n\t\tlet bfcInverted = false;\n\t\tlet bfcCull = true;\n\n\t\tlet startingBuildingStep = false;\n\n\t\t// Parse all line commands\n\t\tfor ( let lineIndex = 0; lineIndex < numLines; lineIndex ++ ) {\n\n\t\t\tconst line = lines[ lineIndex ];\n\n\t\t\tif ( line.length === 0 ) continue;\n\n\t\t\tif ( parsingEmbeddedFiles ) {\n\n\t\t\t\tif ( line.startsWith( '0 FILE ' ) ) {\n\n\t\t\t\t\t// Save previous embedded file in the cache\n\t\t\t\t\tthis.setData( currentEmbeddedFileName, currentEmbeddedText );\n\n\t\t\t\t\t// New embedded text file\n\t\t\t\t\tcurrentEmbeddedFileName = line.substring( 7 );\n\t\t\t\t\tcurrentEmbeddedText = '';\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcurrentEmbeddedText += line + '\\n';\n\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst lp = new LineParser( line, lineIndex + 1 );\n\t\t\tlp.seekNonSpace();\n\n\t\t\tif ( lp.isAtTheEnd() ) {\n\n\t\t\t\t// Empty line\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// Parse the line type\n\t\t\tconst lineType = lp.getToken();\n\n\t\t\tlet material;\n\t\t\tlet colorCode;\n\t\t\tlet segment;\n\t\t\tlet ccw;\n\t\t\tlet doubleSided;\n\t\t\tlet v0, v1, v2, v3, c0, c1;\n\n\t\t\tswitch ( lineType ) {\n\n\t\t\t\t// Line type 0: Comment or META\n\t\t\t\tcase '0':\n\n\t\t\t\t\t// Parse meta directive\n\t\t\t\t\tconst meta = lp.getToken();\n\n\t\t\t\t\tif ( meta ) {\n\n\t\t\t\t\t\tswitch ( meta ) {\n\n\t\t\t\t\t\t\tcase '!LDRAW_ORG':\n\n\t\t\t\t\t\t\t\ttype = lp.getToken();\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase '!COLOUR':\n\n\t\t\t\t\t\t\t\tmaterial = loader.parseColorMetaDirective( lp );\n\t\t\t\t\t\t\t\tif ( material ) {\n\n\t\t\t\t\t\t\t\t\tmaterials[ material.userData.code ] = material;\n\n\t\t\t\t\t\t\t\t}\telse {\n\n\t\t\t\t\t\t\t\t\tconsole.warn( 'LDrawLoader: Error parsing material' + lp.getLineNumberString() );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase '!CATEGORY':\n\n\t\t\t\t\t\t\t\tcategory = lp.getToken();\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase '!KEYWORDS':\n\n\t\t\t\t\t\t\t\tconst newKeywords = lp.getRemainingString().split( ',' );\n\t\t\t\t\t\t\t\tif ( newKeywords.length > 0 ) {\n\n\t\t\t\t\t\t\t\t\tif ( ! keywords ) {\n\n\t\t\t\t\t\t\t\t\t\tkeywords = [];\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tnewKeywords.forEach( function ( keyword ) {\n\n\t\t\t\t\t\t\t\t\t\tkeywords.push( keyword.trim() );\n\n\t\t\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'FILE':\n\n\t\t\t\t\t\t\t\tif ( lineIndex > 0 ) {\n\n\t\t\t\t\t\t\t\t\t// Start embedded text files parsing\n\t\t\t\t\t\t\t\t\tparsingEmbeddedFiles = true;\n\t\t\t\t\t\t\t\t\tcurrentEmbeddedFileName = lp.getRemainingString();\n\t\t\t\t\t\t\t\t\tcurrentEmbeddedText = '';\n\n\t\t\t\t\t\t\t\t\tbfcCertified = false;\n\t\t\t\t\t\t\t\t\tbfcCCW = true;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'BFC':\n\n\t\t\t\t\t\t\t\t// Changes to the backface culling state\n\t\t\t\t\t\t\t\twhile ( ! lp.isAtTheEnd() ) {\n\n\t\t\t\t\t\t\t\t\tconst token = lp.getToken();\n\n\t\t\t\t\t\t\t\t\tswitch ( token ) {\n\n\t\t\t\t\t\t\t\t\t\tcase 'CERTIFY':\n\t\t\t\t\t\t\t\t\t\tcase 'NOCERTIFY':\n\n\t\t\t\t\t\t\t\t\t\t\tbfcCertified = token === 'CERTIFY';\n\t\t\t\t\t\t\t\t\t\t\tbfcCCW = true;\n\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tcase 'CW':\n\t\t\t\t\t\t\t\t\t\tcase 'CCW':\n\n\t\t\t\t\t\t\t\t\t\t\tbfcCCW = token === 'CCW';\n\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tcase 'INVERTNEXT':\n\n\t\t\t\t\t\t\t\t\t\t\tbfcInverted = true;\n\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tcase 'CLIP':\n\t\t\t\t\t\t\t\t\t\tcase 'NOCLIP':\n\n\t\t\t\t\t\t\t\t\t\t\tbfcCull = token === 'CLIP';\n\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\t\t\t\t\tconsole.warn( 'THREE.LDrawLoader: BFC directive \"' + token + '\" is unknown.' );\n\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'STEP':\n\n\t\t\t\t\t\t\t\tstartingBuildingStep = true;\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'Author:':\n\n\t\t\t\t\t\t\t\tauthor = lp.getToken();\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\t// Other meta directives are not implemented\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t\t// Line type 1: Sub-object file\n\t\t\t\tcase '1':\n\n\t\t\t\t\tcolorCode = lp.getToken();\n\t\t\t\t\tmaterial = getLocalMaterial( colorCode );\n\n\t\t\t\t\tconst posX = parseFloat( lp.getToken() );\n\t\t\t\t\tconst posY = parseFloat( lp.getToken() );\n\t\t\t\t\tconst posZ = parseFloat( lp.getToken() );\n\t\t\t\t\tconst m0 = parseFloat( lp.getToken() );\n\t\t\t\t\tconst m1 = parseFloat( lp.getToken() );\n\t\t\t\t\tconst m2 = parseFloat( lp.getToken() );\n\t\t\t\t\tconst m3 = parseFloat( lp.getToken() );\n\t\t\t\t\tconst m4 = parseFloat( lp.getToken() );\n\t\t\t\t\tconst m5 = parseFloat( lp.getToken() );\n\t\t\t\t\tconst m6 = parseFloat( lp.getToken() );\n\t\t\t\t\tconst m7 = parseFloat( lp.getToken() );\n\t\t\t\t\tconst m8 = parseFloat( lp.getToken() );\n\n\t\t\t\t\tconst matrix = new Matrix4().set(\n\t\t\t\t\t\tm0, m1, m2, posX,\n\t\t\t\t\t\tm3, m4, m5, posY,\n\t\t\t\t\t\tm6, m7, m8, posZ,\n\t\t\t\t\t\t0, 0, 0, 1\n\t\t\t\t\t);\n\n\t\t\t\t\tlet fileName = lp.getRemainingString().trim().replace( /\\\\/g, '/' );\n\n\t\t\t\t\tif ( loader.fileMap[ fileName ] ) {\n\n\t\t\t\t\t\t// Found the subobject path in the preloaded file path map\n\t\t\t\t\t\tfileName = loader.fileMap[ fileName ];\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Standardized subfolders\n\t\t\t\t\t\tif ( fileName.startsWith( 's/' ) ) {\n\n\t\t\t\t\t\t\tfileName = 'parts/' + fileName;\n\n\t\t\t\t\t\t} else if ( fileName.startsWith( '48/' ) ) {\n\n\t\t\t\t\t\t\tfileName = 'p/' + fileName;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tsubobjects.push( {\n\t\t\t\t\t\tmaterial: material,\n\t\t\t\t\t\tcolorCode: colorCode,\n\t\t\t\t\t\tmatrix: matrix,\n\t\t\t\t\t\tfileName: fileName,\n\t\t\t\t\t\tinverted: bfcInverted,\n\t\t\t\t\t\tstartingBuildingStep: startingBuildingStep\n\t\t\t\t\t} );\n\n\t\t\t\t\tstartingBuildingStep = false;\n\t\t\t\t\tbfcInverted = false;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t\t// Line type 2: Line segment\n\t\t\t\tcase '2':\n\n\t\t\t\t\tcolorCode = lp.getToken();\n\t\t\t\t\tmaterial = getLocalMaterial( colorCode );\n\t\t\t\t\tv0 = lp.getVector();\n\t\t\t\t\tv1 = lp.getVector();\n\n\t\t\t\t\tsegment = {\n\t\t\t\t\t\tmaterial: material,\n\t\t\t\t\t\tcolorCode: colorCode,\n\t\t\t\t\t\tvertices: [ v0, v1 ],\n\t\t\t\t\t};\n\n\t\t\t\t\tlineSegments.push( segment );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t\t// Line type 5: Conditional Line segment\n\t\t\t\tcase '5':\n\n\t\t\t\t\tcolorCode = lp.getToken();\n\t\t\t\t\tmaterial = getLocalMaterial( colorCode );\n\t\t\t\t\tv0 = lp.getVector();\n\t\t\t\t\tv1 = lp.getVector();\n\t\t\t\t\tc0 = lp.getVector();\n\t\t\t\t\tc1 = lp.getVector();\n\n\t\t\t\t\tsegment = {\n\t\t\t\t\t\tmaterial: material,\n\t\t\t\t\t\tcolorCode: colorCode,\n\t\t\t\t\t\tvertices: [ v0, v1 ],\n\t\t\t\t\t\tcontrolPoints: [ c0, c1 ],\n\t\t\t\t\t};\n\n\t\t\t\t\tconditionalSegments.push( segment );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t\t// Line type 3: Triangle\n\t\t\t\tcase '3':\n\n\t\t\t\t\tcolorCode = lp.getToken();\n\t\t\t\t\tmaterial = getLocalMaterial( colorCode );\n\t\t\t\t\tccw = bfcCCW;\n\t\t\t\t\tdoubleSided = ! bfcCertified || ! bfcCull;\n\n\t\t\t\t\tif ( ccw === true ) {\n\n\t\t\t\t\t\tv0 = lp.getVector();\n\t\t\t\t\t\tv1 = lp.getVector();\n\t\t\t\t\t\tv2 = lp.getVector();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv2 = lp.getVector();\n\t\t\t\t\t\tv1 = lp.getVector();\n\t\t\t\t\t\tv0 = lp.getVector();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfaces.push( {\n\t\t\t\t\t\tmaterial: material,\n\t\t\t\t\t\tcolorCode: colorCode,\n\t\t\t\t\t\tfaceNormal: null,\n\t\t\t\t\t\tvertices: [ v0, v1, v2 ],\n\t\t\t\t\t\tnormals: [ null, null, null ],\n\t\t\t\t\t} );\n\t\t\t\t\ttotalFaces ++;\n\n\t\t\t\t\tif ( doubleSided === true ) {\n\n\t\t\t\t\t\tfaces.push( {\n\t\t\t\t\t\t\tmaterial: material,\n\t\t\t\t\t\t\tcolorCode: colorCode,\n\t\t\t\t\t\t\tfaceNormal: null,\n\t\t\t\t\t\t\tvertices: [ v2, v1, v0 ],\n\t\t\t\t\t\t\tnormals: [ null, null, null ],\n\t\t\t\t\t\t} );\n\t\t\t\t\t\ttotalFaces ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t\t// Line type 4: Quadrilateral\n\t\t\t\tcase '4':\n\n\t\t\t\t\tcolorCode = lp.getToken();\n\t\t\t\t\tmaterial = getLocalMaterial( colorCode );\n\t\t\t\t\tccw = bfcCCW;\n\t\t\t\t\tdoubleSided = ! bfcCertified || ! bfcCull;\n\n\t\t\t\t\tif ( ccw === true ) {\n\n\t\t\t\t\t\tv0 = lp.getVector();\n\t\t\t\t\t\tv1 = lp.getVector();\n\t\t\t\t\t\tv2 = lp.getVector();\n\t\t\t\t\t\tv3 = lp.getVector();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tv3 = lp.getVector();\n\t\t\t\t\t\tv2 = lp.getVector();\n\t\t\t\t\t\tv1 = lp.getVector();\n\t\t\t\t\t\tv0 = lp.getVector();\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// specifically place the triangle diagonal in the v0 and v1 slots so we can\n\t\t\t\t\t// account for the doubling of vertices later when smoothing normals.\n\t\t\t\t\tfaces.push( {\n\t\t\t\t\t\tmaterial: material,\n\t\t\t\t\t\tcolorCode: colorCode,\n\t\t\t\t\t\tfaceNormal: null,\n\t\t\t\t\t\tvertices: [ v0, v1, v2, v3 ],\n\t\t\t\t\t\tnormals: [ null, null, null, null ],\n\t\t\t\t\t} );\n\t\t\t\t\ttotalFaces += 2;\n\n\t\t\t\t\tif ( doubleSided === true ) {\n\n\t\t\t\t\t\tfaces.push( {\n\t\t\t\t\t\t\tmaterial: material,\n\t\t\t\t\t\t\tcolorCode: colorCode,\n\t\t\t\t\t\t\tfaceNormal: null,\n\t\t\t\t\t\t\tvertices: [ v3, v2, v1, v0 ],\n\t\t\t\t\t\t\tnormals: [ null, null, null, null ],\n\t\t\t\t\t\t} );\n\t\t\t\t\t\ttotalFaces += 2;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthrow new Error( 'LDrawLoader: Unknown line type \"' + lineType + '\"' + lp.getLineNumberString() + '.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( parsingEmbeddedFiles ) {\n\n\t\t\tthis.setData( currentEmbeddedFileName, currentEmbeddedText );\n\n\t\t}\n\n\t\treturn {\n\t\t\tfaces,\n\t\t\tconditionalSegments,\n\t\t\tlineSegments,\n\t\t\ttype,\n\t\t\tcategory,\n\t\t\tkeywords,\n\t\t\tauthor,\n\t\t\tsubobjects,\n\t\t\ttotalFaces,\n\t\t\tstartingBuildingStep,\n\t\t\tmaterials,\n\t\t\tfileName,\n\t\t\tgroup: null\n\t\t};\n\n\t}\n\n\t// returns an (optionally cloned) instance of the data\n\tgetData( fileName, clone = true ) {\n\n\t\tconst key = fileName.toLowerCase();\n\t\tconst result = this._cache[ key ];\n\t\tif ( result === null || result instanceof Promise ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tif ( clone ) {\n\n\t\t\treturn this.cloneResult( result );\n\n\t\t} else {\n\n\t\t\treturn result;\n\n\t\t}\n\n\t}\n\n\t// kicks off a fetch and parse of the requested data if it hasn't already been loaded. Returns when\n\t// the data is ready to use and can be retrieved synchronously with \"getData\".\n\tasync ensureDataLoaded( fileName ) {\n\n\t\tconst key = fileName.toLowerCase();\n\t\tif ( ! ( key in this._cache ) ) {\n\n\t\t\t// replace the promise with a copy of the parsed data for immediate processing\n\t\t\tthis._cache[ key ] = this.fetchData( fileName ).then( text => {\n\n\t\t\t\tconst info = this.parse( text, fileName );\n\t\t\t\tthis._cache[ key ] = info;\n\t\t\t\treturn info;\n\n\t\t\t} );\n\n\t\t}\n\n\t\tawait this._cache[ key ];\n\n\t}\n\n\t// sets the data in the cache from parsed data\n\tsetData( fileName, text ) {\n\n\t\tconst key = fileName.toLowerCase();\n\t\tthis._cache[ key ] = this.parse( text, fileName );\n\n\t}\n\n}\n\n// returns the material for an associated color code. If the color code is 16 for a face or 24 for\n// an edge then the passthroughColorCode is used.\nfunction getMaterialFromCode( colorCode, parentColorCode, materialHierarchy, forEdge ) {\n\n\tconst isPassthrough = ! forEdge && colorCode === MAIN_COLOUR_CODE || forEdge && colorCode === MAIN_EDGE_COLOUR_CODE;\n\tif ( isPassthrough ) {\n\n\t\tcolorCode = parentColorCode;\n\n\t}\n\n\treturn materialHierarchy[ colorCode ] || null;\n\n}\n\n// Class used to parse and build LDraw parts as three.js objects and cache them if they're a \"Part\" type.\nclass LDrawPartsGeometryCache {\n\n\tconstructor( loader ) {\n\n\t\tthis.loader = loader;\n\t\tthis.parseCache = new LDrawParsedCache( loader );\n\t\tthis._cache = {};\n\n\t}\n\n\t// Convert the given file information into a mesh by processing subobjects.\n\tasync processIntoMesh( info ) {\n\n\t\tconst loader = this.loader;\n\t\tconst parseCache = this.parseCache;\n\t\tconst faceMaterials = new Set();\n\n\t\t// Processes the part subobject information to load child parts and merge geometry onto part\n\t\t// piece object.\n\t\tconst processInfoSubobjects = async ( info, subobject = null ) => {\n\n\t\t\tconst subobjects = info.subobjects;\n\t\t\tconst promises = [];\n\n\t\t\t// Trigger load of all subobjects. If a subobject isn't a primitive then load it as a separate\n\t\t\t// group which lets instruction steps apply correctly.\n\t\t\tfor ( let i = 0, l = subobjects.length; i < l; i ++ ) {\n\n\t\t\t\tconst subobject = subobjects[ i ];\n\t\t\t\tconst promise = parseCache.ensureDataLoaded( subobject.fileName ).then( () => {\n\n\t\t\t\t\tconst subobjectInfo = parseCache.getData( subobject.fileName, false );\n\t\t\t\t\tif ( ! isPrimitiveType( subobjectInfo.type ) ) {\n\n\t\t\t\t\t\treturn this.loadModel( subobject.fileName ).catch( error => {\n\n\t\t\t\t\t\t\tconsole.warn( error );\n\t\t\t\t\t\t\treturn null;\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn processInfoSubobjects( parseCache.getData( subobject.fileName ), subobject );\n\n\t\t\t\t} );\n\n\t\t\t\tpromises.push( promise );\n\n\t\t\t}\n\n\t\t\tconst group = new Group();\n\t\t\tgroup.userData.category = info.category;\n\t\t\tgroup.userData.keywords = info.keywords;\n\t\t\tgroup.userData.author = info.author;\n\t\t\tgroup.userData.type = info.type;\n\t\t\tgroup.userData.fileName = info.fileName;\n\t\t\tinfo.group = group;\n\n\t\t\tconst subobjectInfos = await Promise.all( promises );\n\t\t\tfor ( let i = 0, l = subobjectInfos.length; i < l; i ++ ) {\n\n\t\t\t\tconst subobject = info.subobjects[ i ];\n\t\t\t\tconst subobjectInfo = subobjectInfos[ i ];\n\n\t\t\t\tif ( subobjectInfo === null ) {\n\n\t\t\t\t\t// the subobject failed to load\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// if the subobject was loaded as a separate group then apply the parent scopes materials\n\t\t\t\tif ( subobjectInfo.isGroup ) {\n\n\t\t\t\t\tconst subobjectGroup = subobjectInfo;\n\t\t\t\t\tsubobject.matrix.decompose( subobjectGroup.position, subobjectGroup.quaternion, subobjectGroup.scale );\n\t\t\t\t\tsubobjectGroup.userData.startingBuildingStep = subobject.startingBuildingStep;\n\t\t\t\t\tsubobjectGroup.name = subobject.fileName;\n\n\t\t\t\t\tloader.applyMaterialsToMesh( subobjectGroup, subobject.colorCode, info.materials );\n\t\t\t\t\tsubobjectGroup.userData.colorCode = subobject.colorCode;\n\n\t\t\t\t\tgroup.add( subobjectGroup );\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// add the subobject group if it has children in case it has both children and primitives\n\t\t\t\tif ( subobjectInfo.group.children.length ) {\n\n\t\t\t\t\tgroup.add( subobjectInfo.group );\n\n\t\t\t\t}\n\n\t\t\t\t// transform the primitives into the local space of the parent piece and append them to\n\t\t\t\t// to the parent primitives list.\n\t\t\t\tconst parentLineSegments = info.lineSegments;\n\t\t\t\tconst parentConditionalSegments = info.conditionalSegments;\n\t\t\t\tconst parentFaces = info.faces;\n\n\t\t\t\tconst lineSegments = subobjectInfo.lineSegments;\n\t\t\t\tconst conditionalSegments = subobjectInfo.conditionalSegments;\n\n\t\t\t\tconst faces = subobjectInfo.faces;\n\t\t\t\tconst matrix = subobject.matrix;\n\t\t\t\tconst inverted = subobject.inverted;\n\t\t\t\tconst matrixScaleInverted = matrix.determinant() < 0;\n\t\t\t\tconst colorCode = subobject.colorCode;\n\n\t\t\t\tconst lineColorCode = colorCode === MAIN_COLOUR_CODE ? MAIN_EDGE_COLOUR_CODE : colorCode;\n\t\t\t\tfor ( let i = 0, l = lineSegments.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst ls = lineSegments[ i ];\n\t\t\t\t\tconst vertices = ls.vertices;\n\t\t\t\t\tvertices[ 0 ].applyMatrix4( matrix );\n\t\t\t\t\tvertices[ 1 ].applyMatrix4( matrix );\n\t\t\t\t\tls.colorCode = ls.colorCode === MAIN_EDGE_COLOUR_CODE ? lineColorCode : ls.colorCode;\n\t\t\t\t\tls.material = ls.material || getMaterialFromCode( ls.colorCode, ls.colorCode, info.materials, true );\n\n\t\t\t\t\tparentLineSegments.push( ls );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, l = conditionalSegments.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst os = conditionalSegments[ i ];\n\t\t\t\t\tconst vertices = os.vertices;\n\t\t\t\t\tconst controlPoints = os.controlPoints;\n\t\t\t\t\tvertices[ 0 ].applyMatrix4( matrix );\n\t\t\t\t\tvertices[ 1 ].applyMatrix4( matrix );\n\t\t\t\t\tcontrolPoints[ 0 ].applyMatrix4( matrix );\n\t\t\t\t\tcontrolPoints[ 1 ].applyMatrix4( matrix );\n\t\t\t\t\tos.colorCode = os.colorCode === MAIN_EDGE_COLOUR_CODE ? lineColorCode : os.colorCode;\n\t\t\t\t\tos.material = os.material || getMaterialFromCode( os.colorCode, os.colorCode, info.materials, true );\n\n\t\t\t\t\tparentConditionalSegments.push( os );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst tri = faces[ i ];\n\t\t\t\t\tconst vertices = tri.vertices;\n\t\t\t\t\tfor ( let i = 0, l = vertices.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tvertices[ i ].applyMatrix4( matrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttri.colorCode = tri.colorCode === MAIN_COLOUR_CODE ? colorCode : tri.colorCode;\n\t\t\t\t\ttri.material = tri.material || getMaterialFromCode( tri.colorCode, colorCode, info.materials, false );\n\t\t\t\t\tfaceMaterials.add( tri.colorCode );\n\n\t\t\t\t\t// If the scale of the object is negated then the triangle winding order\n\t\t\t\t\t// needs to be flipped.\n\t\t\t\t\tif ( matrixScaleInverted !== inverted ) {\n\n\t\t\t\t\t\tvertices.reverse();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tparentFaces.push( tri );\n\n\t\t\t\t}\n\n\t\t\t\tinfo.totalFaces += subobjectInfo.totalFaces;\n\n\t\t\t}\n\n\t\t\t// Apply the parent subobjects pass through material code to this object. This is done several times due\n\t\t\t// to material scoping.\n\t\t\tif ( subobject ) {\n\n\t\t\t\tloader.applyMaterialsToMesh( group, subobject.colorCode, info.materials );\n\t\t\t\tgroup.userData.colorCode = subobject.colorCode;\n\n\t\t\t}\n\n\t\t\treturn info;\n\n\t\t};\n\n\t\t// Track material use to see if we need to use the normal smooth slow path for hard edges.\n\t\tfor ( let i = 0, l = info.faces; i < l; i ++ ) {\n\n\t\t\tfaceMaterials.add( info.faces[ i ].colorCode );\n\n\t\t}\n\n\t\tawait processInfoSubobjects( info );\n\n\t\tif ( loader.smoothNormals ) {\n\n\t\t\tconst checkSubSegments = faceMaterials.size > 1;\n\t\t\tgenerateFaceNormals( info.faces );\n\t\t\tsmoothNormals( info.faces, info.lineSegments, checkSubSegments );\n\n\t\t}\n\n\t\t// Add the primitive objects and metadata.\n\t\tconst group = info.group;\n\t\tif ( info.faces.length > 0 ) {\n\n\t\t\tgroup.add( createObject( this.loader, info.faces, 3, false, info.totalFaces ) );\n\n\t\t}\n\n\t\tif ( info.lineSegments.length > 0 ) {\n\n\t\t\tgroup.add( createObject( this.loader, info.lineSegments, 2 ) );\n\n\t\t}\n\n\t\tif ( info.conditionalSegments.length > 0 ) {\n\n\t\t\tgroup.add( createObject( this.loader, info.conditionalSegments, 2, true ) );\n\n\t\t}\n\n\t\treturn group;\n\n\t}\n\n\thasCachedModel( fileName ) {\n\n\t\treturn fileName !== null && fileName.toLowerCase() in this._cache;\n\n\t}\n\n\tasync getCachedModel( fileName ) {\n\n\t\tif ( fileName !== null && this.hasCachedModel( fileName ) ) {\n\n\t\t\tconst key = fileName.toLowerCase();\n\t\t\tconst group = await this._cache[ key ];\n\t\t\treturn group.clone();\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t}\n\n\t// Loads and parses the model with the given file name. Returns a cached copy if available.\n\tasync loadModel( fileName ) {\n\n\t\tconst parseCache = this.parseCache;\n\t\tconst key = fileName.toLowerCase();\n\t\tif ( this.hasCachedModel( fileName ) ) {\n\n\t\t\t// Return cached model if available.\n\t\t\treturn this.getCachedModel( fileName );\n\n\t\t} else {\n\n\t\t\t// Otherwise parse a new model.\n\t\t\t// Ensure the file data is loaded and pre parsed.\n\t\t\tawait parseCache.ensureDataLoaded( fileName );\n\n\t\t\tconst info = parseCache.getData( fileName );\n\t\t\tconst promise = this.processIntoMesh( info );\n\n\t\t\t// Now that the file has loaded it's possible that another part parse has been waiting in parallel\n\t\t\t// so check the cache again to see if it's been added since the last async operation so we don't\n\t\t\t// do unnecessary work.\n\t\t\tif ( this.hasCachedModel( fileName ) ) {\n\n\t\t\t\treturn this.getCachedModel( fileName );\n\n\t\t\t}\n\n\t\t\t// Cache object if it's a part so it can be reused later.\n\t\t\tif ( isPartType( info.type ) ) {\n\n\t\t\t\tthis._cache[ key ] = promise;\n\n\t\t\t}\n\n\t\t\t// return a copy\n\t\t\tconst group = await promise;\n\t\t\treturn group.clone();\n\n\t\t}\n\n\t}\n\n\t// parses the given model text into a renderable object. Returns cached copy if available.\n\tasync parseModel( text ) {\n\n\t\tconst parseCache = this.parseCache;\n\t\tconst info = parseCache.parse( text );\n\t\tif ( isPartType( info.type ) && this.hasCachedModel( info.fileName ) ) {\n\n\t\t\treturn this.getCachedModel( info.fileName );\n\n\t\t}\n\n\t\treturn this.processIntoMesh( info );\n\n\t}\n\n}\n\nfunction sortByMaterial( a, b ) {\n\n\tif ( a.colorCode === b.colorCode ) {\n\n\t\treturn 0;\n\n\t}\n\n\tif ( a.colorCode < b.colorCode ) {\n\n\t\treturn - 1;\n\n\t}\n\n\treturn 1;\n\n}\n\nfunction createObject( loader, elements, elementSize, isConditionalSegments = false, totalElements = null ) {\n\n\t// Creates a LineSegments (elementSize = 2) or a Mesh (elementSize = 3 )\n\t// With per face / segment material, implemented with mesh groups and materials array\n\n\t// Sort the faces or line segments by color code to make later the mesh groups\n\telements.sort( sortByMaterial );\n\n\tif ( totalElements === null ) {\n\n\t\ttotalElements = elements.length;\n\n\t}\n\n\tconst positions = new Float32Array( elementSize * totalElements * 3 );\n\tconst normals = elementSize === 3 ? new Float32Array( elementSize * totalElements * 3 ) : null;\n\tconst materials = [];\n\n\tconst quadArray = new Array( 6 );\n\tconst bufferGeometry = new BufferGeometry();\n\tlet prevMaterial = null;\n\tlet index0 = 0;\n\tlet numGroupVerts = 0;\n\tlet offset = 0;\n\n\tfor ( let iElem = 0, nElem = elements.length; iElem < nElem; iElem ++ ) {\n\n\t\tconst elem = elements[ iElem ];\n\t\tlet vertices = elem.vertices;\n\t\tif ( vertices.length === 4 ) {\n\n\t\t\tquadArray[ 0 ] = vertices[ 0 ];\n\t\t\tquadArray[ 1 ] = vertices[ 1 ];\n\t\t\tquadArray[ 2 ] = vertices[ 2 ];\n\t\t\tquadArray[ 3 ] = vertices[ 0 ];\n\t\t\tquadArray[ 4 ] = vertices[ 2 ];\n\t\t\tquadArray[ 5 ] = vertices[ 3 ];\n\t\t\tvertices = quadArray;\n\n\t\t}\n\n\t\tfor ( let j = 0, l = vertices.length; j < l; j ++ ) {\n\n\t\t\tconst v = vertices[ j ];\n\t\t\tconst index = offset + j * 3;\n\t\t\tpositions[ index + 0 ] = v.x;\n\t\t\tpositions[ index + 1 ] = v.y;\n\t\t\tpositions[ index + 2 ] = v.z;\n\n\t\t}\n\n\t\t// create the normals array if this is a set of faces\n\t\tif ( elementSize === 3 ) {\n\n\t\t\tif ( ! elem.faceNormal ) {\n\n\t\t\t\tconst v0 = vertices[ 0 ];\n\t\t\t\tconst v1 = vertices[ 1 ];\n\t\t\t\tconst v2 = vertices[ 2 ];\n\t\t\t\t_tempVec0.subVectors( v1, v0 );\n\t\t\t\t_tempVec1.subVectors( v2, v1 );\n\t\t\t\telem.faceNormal = new Vector3()\n\t\t\t\t\t.crossVectors( _tempVec0, _tempVec1 )\n\t\t\t\t\t.normalize();\n\n\t\t\t}\n\n\t\t\tlet elemNormals = elem.normals;\n\t\t\tif ( elemNormals.length === 4 ) {\n\n\t\t\t\tquadArray[ 0 ] = elemNormals[ 0 ];\n\t\t\t\tquadArray[ 1 ] = elemNormals[ 1 ];\n\t\t\t\tquadArray[ 2 ] = elemNormals[ 2 ];\n\t\t\t\tquadArray[ 3 ] = elemNormals[ 0 ];\n\t\t\t\tquadArray[ 4 ] = elemNormals[ 2 ];\n\t\t\t\tquadArray[ 5 ] = elemNormals[ 3 ];\n\t\t\t\telemNormals = quadArray;\n\n\t\t\t}\n\n\t\t\tfor ( let j = 0, l = elemNormals.length; j < l; j ++ ) {\n\n\t\t\t\t// use face normal if a vertex normal is not provided\n\t\t\t\tlet n = elem.faceNormal;\n\t\t\t\tif ( elemNormals[ j ] ) {\n\n\t\t\t\t\tn = elemNormals[ j ].norm;\n\n\t\t\t\t}\n\n\t\t\t\tconst index = offset + j * 3;\n\t\t\t\tnormals[ index + 0 ] = n.x;\n\t\t\t\tnormals[ index + 1 ] = n.y;\n\t\t\t\tnormals[ index + 2 ] = n.z;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( prevMaterial !== elem.colorCode ) {\n\n\t\t\tif ( prevMaterial !== null ) {\n\n\t\t\t\tbufferGeometry.addGroup( index0, numGroupVerts, materials.length - 1 );\n\n\t\t\t}\n\n\t\t\tconst material = elem.material;\n\n\t\t\tif ( material !== null ) {\n\n\t\t\t\tif ( elementSize === 3 ) {\n\n\t\t\t\t\tmaterials.push( material );\n\n\t\t\t\t} else if ( elementSize === 2 ) {\n\n\t\t\t\t\tif ( isConditionalSegments ) {\n\n\t\t\t\t\t\tconst edgeMaterial = loader.edgeMaterialCache.get( material );\n\n\t\t\t\t\t\tmaterials.push( loader.conditionalEdgeMaterialCache.get( edgeMaterial ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tmaterials.push( loader.edgeMaterialCache.get( material ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// If a material has not been made available yet then keep the color code string in the material array\n\t\t\t\t// to save the spot for the material once a parent scopes materials are being applied to the object.\n\t\t\t\tmaterials.push( elem.colorCode );\n\n\t\t\t}\n\n\t\t\tprevMaterial = elem.colorCode;\n\t\t\tindex0 = offset / 3;\n\t\t\tnumGroupVerts = vertices.length;\n\n\t\t} else {\n\n\t\t\tnumGroupVerts += vertices.length;\n\n\t\t}\n\n\t\toffset += 3 * vertices.length;\n\n\t}\n\n\tif ( numGroupVerts > 0 ) {\n\n\t\tbufferGeometry.addGroup( index0, numGroupVerts, materials.length - 1 );\n\n\t}\n\n\tbufferGeometry.setAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\n\tif ( normals !== null ) {\n\n\t\tbufferGeometry.setAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\n\t}\n\n\tlet object3d = null;\n\n\tif ( elementSize === 2 ) {\n\n\t\tif ( isConditionalSegments ) {\n\n\t\t\tobject3d = new ConditionalLineSegments( bufferGeometry, materials.length === 1 ? materials[ 0 ] : materials );\n\n\t\t} else {\n\n\t\t\tobject3d = new LineSegments( bufferGeometry, materials.length === 1 ? materials[ 0 ] : materials );\n\n\t\t}\n\n\t} else if ( elementSize === 3 ) {\n\n\t\tobject3d = new Mesh( bufferGeometry, materials.length === 1 ? materials[ 0 ] : materials );\n\n\t}\n\n\tif ( isConditionalSegments ) {\n\n\t\tobject3d.isConditionalLine = true;\n\n\t\tconst controlArray0 = new Float32Array( elements.length * 3 * 2 );\n\t\tconst controlArray1 = new Float32Array( elements.length * 3 * 2 );\n\t\tconst directionArray = new Float32Array( elements.length * 3 * 2 );\n\t\tfor ( let i = 0, l = elements.length; i < l; i ++ ) {\n\n\t\t\tconst os = elements[ i ];\n\t\t\tconst vertices = os.vertices;\n\t\t\tconst controlPoints = os.controlPoints;\n\t\t\tconst c0 = controlPoints[ 0 ];\n\t\t\tconst c1 = controlPoints[ 1 ];\n\t\t\tconst v0 = vertices[ 0 ];\n\t\t\tconst v1 = vertices[ 1 ];\n\t\t\tconst index = i * 3 * 2;\n\t\t\tcontrolArray0[ index + 0 ] = c0.x;\n\t\t\tcontrolArray0[ index + 1 ] = c0.y;\n\t\t\tcontrolArray0[ index + 2 ] = c0.z;\n\t\t\tcontrolArray0[ index + 3 ] = c0.x;\n\t\t\tcontrolArray0[ index + 4 ] = c0.y;\n\t\t\tcontrolArray0[ index + 5 ] = c0.z;\n\n\t\t\tcontrolArray1[ index + 0 ] = c1.x;\n\t\t\tcontrolArray1[ index + 1 ] = c1.y;\n\t\t\tcontrolArray1[ index + 2 ] = c1.z;\n\t\t\tcontrolArray1[ index + 3 ] = c1.x;\n\t\t\tcontrolArray1[ index + 4 ] = c1.y;\n\t\t\tcontrolArray1[ index + 5 ] = c1.z;\n\n\t\t\tdirectionArray[ index + 0 ] = v1.x - v0.x;\n\t\t\tdirectionArray[ index + 1 ] = v1.y - v0.y;\n\t\t\tdirectionArray[ index + 2 ] = v1.z - v0.z;\n\t\t\tdirectionArray[ index + 3 ] = v1.x - v0.x;\n\t\t\tdirectionArray[ index + 4 ] = v1.y - v0.y;\n\t\t\tdirectionArray[ index + 5 ] = v1.z - v0.z;\n\n\t\t}\n\n\t\tbufferGeometry.setAttribute( 'control0', new BufferAttribute( controlArray0, 3, false ) );\n\t\tbufferGeometry.setAttribute( 'control1', new BufferAttribute( controlArray1, 3, false ) );\n\t\tbufferGeometry.setAttribute( 'direction', new BufferAttribute( directionArray, 3, false ) );\n\n\t}\n\n\treturn object3d;\n\n}\n\n/**\n * A loader for the LDraw format.\n *\n * [LDraw](https://ldraw.org/} (LEGO Draw) is an [open format specification](https://ldraw.org/article/218.html)\n * for describing LEGO and other construction set 3D models.\n *\n * An LDraw asset (a text file usually with extension .ldr, .dat or .txt) can describe just a single construction\n * piece, or an entire model. In the case of a model the LDraw file can reference other LDraw files, which are\n * loaded from a library path set with `setPartsLibraryPath`. You usually download the LDraw official parts library,\n * extract to a folder and point setPartsLibraryPath to it.\n *\n * Library parts will be loaded by trial and error in subfolders 'parts', 'p' and 'models'. These file accesses\n * are not optimal for web environment, so a script tool has been made to pack an LDraw file with all its dependencies\n * into a single file, which loads much faster. See section 'Packing LDraw models'. The LDrawLoader example loads\n * several packed files. The official parts library is not included due to its large size.\n *\n * `LDrawLoader` supports the following extensions:\n * - !COLOUR: Color and surface finish declarations.\n * - BFC: Back Face Culling specification.\n * - !CATEGORY: Model/part category declarations.\n * - !KEYWORDS: Model/part keywords declarations.\n *\n * ```js\n * const loader = new LDrawLoader();\n * loader.setConditionalLineMaterial( LDrawConditionalLineMaterial ); // the type of line material depends on the used renderer\n * const object = await loader.loadAsync( 'models/ldraw/officialLibrary/models/car.ldr_Packed.mpd' );\n * scene.add( object );\n * ```\n *\n * @augments Loader\n * @three_import import { LDrawLoader } from 'three/addons/loaders/LDrawLoader.js';\n */\nclass LDrawLoader extends Loader {\n\n\t/**\n\t * Constructs a new LDraw loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t// Array of THREE.Material\n\t\tthis.materials = [];\n\t\tthis.materialLibrary = {};\n\t\tthis.edgeMaterialCache = new WeakMap();\n\t\tthis.conditionalEdgeMaterialCache = new WeakMap();\n\n\t\t// This also allows to handle the embedded text files (\"0 FILE\" lines)\n\t\tthis.partsCache = new LDrawPartsGeometryCache( this );\n\n\t\t// This object is a map from file names to paths. It agilizes the paths search. If it is not set then files will be searched by trial and error.\n\t\tthis.fileMap = {};\n\n\t\t// If this flag is set to true the vertex normals will be smoothed.\n\t\tthis.smoothNormals = true;\n\n\t\t// The path to load parts from the LDraw parts library from.\n\t\tthis.partsLibraryPath = '';\n\n\t\t// this material type must be injected via setConditionalLineMaterial()\n\t\tthis.ConditionalLineMaterial = null;\n\n\t\t// Material assigned to not available colors for meshes and edges\n\t\tthis.missingColorMaterial = new MeshStandardMaterial( { name: Loader.DEFAULT_MATERIAL_NAME, color: 0xFF00FF, roughness: 0.3, metalness: 0 } );\n\t\tthis.missingEdgeColorMaterial = new LineBasicMaterial( { name: Loader.DEFAULT_MATERIAL_NAME, color: 0xFF00FF } );\n\t\tthis.missingConditionalEdgeColorMaterial = null;\n\t\tthis.edgeMaterialCache.set( this.missingColorMaterial, this.missingEdgeColorMaterial );\n\t\tthis.conditionalEdgeMaterialCache.set( this.missingEdgeColorMaterial, this.missingConditionalEdgeColorMaterial );\n\n\t}\n\n\t/**\n\t * This method must be called prior to `load()` unless the model to load does not reference\n\t * library parts (usually it will be a model with all its parts packed in a single file).\n\t *\n\t * @param {string} path - Path to library parts files to load referenced parts from.\n\t * This is different from Loader.setPath, which indicates the path to load the main asset from.\n\t * @return {LDrawLoader} A reference to this loader.\n\t */\n\tsetPartsLibraryPath( path ) {\n\n\t\tthis.partsLibraryPath = path;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the conditional line material type which depends on the used renderer.\n\t * Use {@link LDrawConditionalLineMaterial} when using `WebGLRenderer` and\n\t * {@link LDrawConditionalLineNodeMaterial} when using `WebGPURenderer`.\n\t *\n\t * @param {(LDrawConditionalLineMaterial.constructor|LDrawConditionalLineNodeMaterial.constructor)} type - The conditional line material type.\n\t * @return {LDrawLoader} A reference to this loader.\n\t */\n\tsetConditionalLineMaterial( type ) {\n\n\t\tthis.ConditionalLineMaterial = type;\n\t\tthis.missingConditionalEdgeColorMaterial = new this.ConditionalLineMaterial( { name: Loader.DEFAULT_MATERIAL_NAME, fog: true, color: 0xFF00FF } );\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This async method preloads materials from a single LDraw file. In the official\n\t * parts library there is a special file which is loaded always the first (LDConfig.ldr)\n\t * and contains all the standard color codes. This method is intended to be used with\n\t * not packed files, for example in an editor where materials are preloaded and parts\n\t * are loaded on demand.\n\t *\n\t * @async\n\t * @param {string} url - Path of the LDraw materials asset.\n\t * @return {Promise} A Promise that resolves when the preload has finished.\n\t */\n\tasync preloadMaterials( url ) {\n\n\t\tconst fileLoader = new FileLoader( this.manager );\n\t\tfileLoader.setPath( this.path );\n\t\tfileLoader.setRequestHeader( this.requestHeader );\n\t\tfileLoader.setWithCredentials( this.withCredentials );\n\n\t\tconst text = await fileLoader.loadAsync( url );\n\t\tconst colorLineRegex = /^0 !COLOUR/;\n\t\tconst lines = text.split( /[\\n\\r]/g );\n\t\tconst materials = [];\n\t\tfor ( let i = 0, l = lines.length; i < l; i ++ ) {\n\n\t\t\tconst line = lines[ i ];\n\t\t\tif ( colorLineRegex.test( line ) ) {\n\n\t\t\t\tconst directive = line.replace( colorLineRegex, '' );\n\t\t\t\tconst material = this.parseColorMetaDirective( new LineParser( directive ) );\n\t\t\t\tmaterials.push( material );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.addMaterials( materials );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded LDraw asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Group)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst fileLoader = new FileLoader( this.manager );\n\t\tfileLoader.setPath( this.path );\n\t\tfileLoader.setRequestHeader( this.requestHeader );\n\t\tfileLoader.setWithCredentials( this.withCredentials );\n\t\tfileLoader.load( url, text => {\n\n\t\t\t// Initializes the materials library with default materials\n\t\t\tthis.addDefaultMaterials();\n\n\t\t\tthis.partsCache\n\t\t\t\t.parseModel( text )\n\t\t\t\t.then( group => {\n\n\t\t\t\t\tthis.applyMaterialsToMesh( group, MAIN_COLOUR_CODE, this.materialLibrary, true );\n\t\t\t\t\tthis.computeBuildingSteps( group );\n\t\t\t\t\tgroup.userData.fileName = url;\n\t\t\t\t\tonLoad( group );\n\n\t\t\t\t} )\n\t\t\t\t.catch( onError );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given LDraw data and returns the resulting group.\n\t *\n\t * @param {string} text - The raw VRML data as a string.\n\t * @param {function(Group)} onLoad - Executed when the loading/parsing process has been finished.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tparse( text, onLoad, onError ) {\n\n\t\tthis.partsCache\n\t\t\t.parseModel( text )\n\t\t\t.then( group => {\n\n\t\t\t\tthis.applyMaterialsToMesh( group, MAIN_COLOUR_CODE, this.materialLibrary, true );\n\t\t\t\tthis.computeBuildingSteps( group );\n\t\t\t\tgroup.userData.fileName = '';\n\t\t\t\tonLoad( group );\n\n\t\t\t} )\n\t\t\t.catch( onError );\n\n\t}\n\n\t/**\n\t * Sets the loader's material library. This method clears existing\n\t * material definitions.\n\t *\n\t * @param {Array<Material>} materials - The materials to set.\n\t * @return {LDrawLoader} A reference to this loader.\n\t */\n\tsetMaterials( materials ) {\n\n\t\tthis.clearMaterials();\n\t\tthis.addMaterials( materials );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Clears the loader's material library.\n\t *\n\t * @return {LDrawLoader} A reference to this loader.\n\t */\n\tclearMaterials() {\n\n\t\tthis.materialLibrary = {};\n\t\tthis.materials = [];\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds a list of materials to the loader's material library.\n\t *\n\t * @param {Array<Material>} materials - The materials to add.\n\t * @return {LDrawLoader} A reference to this loader.\n\t */\n\taddMaterials( materials ) {\n\n\t\tfor ( let i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\t\tthis.addMaterial( materials[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Initializes the loader with default materials.\n\t *\n\t * @return {LDrawLoader} A reference to this loader.\n\t */\n\taddDefaultMaterials() {\n\n\t\t// Add default main triangle and line edge materials (used in pieces that can be colored with a main color)\n\t\tthis.addMaterial( this.parseColorMetaDirective( new LineParser( 'Main_Colour CODE 16 VALUE #FF8080 EDGE #333333' ) ) );\n\t\tthis.addMaterial( this.parseColorMetaDirective( new LineParser( 'Edge_Colour CODE 24 VALUE #A0A0A0 EDGE #333333' ) ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets a map which maps referenced library filenames to new filenames.\n\t * If a fileMap is not specified (the default), library parts will be accessed by trial and\n\t * error in subfolders 'parts', 'p' and 'models'.\n\t *\n\t * @param {Object<string,string>} fileMap - The file map to set.\n\t * @return {LDrawLoader} A reference to this loader.\n\t */\n\tsetFileMap( fileMap ) {\n\n\t\tthis.fileMap = fileMap;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds a single material to the loader's material library.\n\t *\n\t * @param {Material} material - The material to add.\n\t * @return {LDrawLoader} A reference to this loader.\n\t */\n\taddMaterial( material ) {\n\n\t\t// Adds a material to the material library which is on top of the parse scopes stack. And also to the materials array\n\n\t\tconst matLib = this.materialLibrary;\n\t\tif ( ! matLib[ material.userData.code ] ) {\n\n\t\t\tthis.materials.push( material );\n\t\t\tmatLib[ material.userData.code ] = material;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a material for the given color code.\n\t *\n\t * @param {string} colorCode - The color code.\n\t * @return {?Material} The material. Returns `null` if no material has been found.\n\t */\n\tgetMaterial( colorCode ) {\n\n\t\tif ( colorCode.startsWith( '0x2' ) ) {\n\n\t\t\t// Special 'direct' material value (RGB color)\n\t\t\tconst color = colorCode.substring( 3 );\n\n\t\t\treturn this.parseColorMetaDirective( new LineParser( 'Direct_Color_' + color + ' CODE -1 VALUE #' + color + ' EDGE #' + color + '' ) );\n\n\t\t}\n\n\t\treturn this.materialLibrary[ colorCode ] || null;\n\n\t}\n\n\t// Applies the appropriate materials to a prebuilt hierarchy of geometry. Assumes that color codes are present\n\t// in the material array if they need to be filled in.\n\tapplyMaterialsToMesh( group, parentColorCode, materialHierarchy, finalMaterialPass = false ) {\n\n\t\t// find any missing materials as indicated by a color code string and replace it with a material from the current material lib\n\t\tconst loader = this;\n\t\tconst parentIsPassthrough = parentColorCode === MAIN_COLOUR_CODE;\n\t\tgroup.traverse( c => {\n\n\t\t\tif ( c.isMesh || c.isLineSegments ) {\n\n\t\t\t\tif ( Array.isArray( c.material ) ) {\n\n\t\t\t\t\tfor ( let i = 0, l = c.material.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tif ( ! c.material[ i ].isMaterial ) {\n\n\t\t\t\t\t\t\tc.material[ i ] = getMaterial( c, c.material[ i ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( ! c.material.isMaterial ) {\n\n\t\t\t\t\tc.material = getMaterial( c, c.material );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\n\t\t// Returns the appropriate material for the object (line or face) given color code. If the code is \"pass through\"\n\t\t// (24 for lines, 16 for edges) then the pass through color code is used. If that is also pass through then it's\n\t\t// simply returned for the subsequent material application.\n\t\tfunction getMaterial( c, colorCode ) {\n\n\t\t\t// if our parent is a passthrough color code and we don't have the current material color available then\n\t\t\t// return early.\n\t\t\tif ( parentIsPassthrough && ! ( colorCode in materialHierarchy ) && ! finalMaterialPass ) {\n\n\t\t\t\treturn colorCode;\n\n\t\t\t}\n\n\t\t\tconst forEdge = c.isLineSegments || c.isConditionalLine;\n\t\t\tconst isPassthrough = ! forEdge && colorCode === MAIN_COLOUR_CODE || forEdge && colorCode === MAIN_EDGE_COLOUR_CODE;\n\t\t\tif ( isPassthrough ) {\n\n\t\t\t\tcolorCode = parentColorCode;\n\n\t\t\t}\n\n\t\t\tlet material = null;\n\t\t\tif ( colorCode in materialHierarchy ) {\n\n\t\t\t\tmaterial = materialHierarchy[ colorCode ];\n\n\t\t\t} else if ( finalMaterialPass ) {\n\n\t\t\t\t// see if we can get the final material from the \"getMaterial\" function which will attempt to\n\t\t\t\t// parse the \"direct\" colors\n\t\t\t\tmaterial = loader.getMaterial( colorCode );\n\t\t\t\tif ( material === null ) {\n\n\t\t\t\t\t// otherwise throw a warning if this is final opportunity to set the material\n\t\t\t\t\tconsole.warn( `LDrawLoader: Material properties for code ${ colorCode } not available.` );\n\n\t\t\t\t\t// And return the 'missing color' material\n\t\t\t\t\tmaterial = loader.missingColorMaterial;\n\n\t\t\t\t}\n\n\n\t\t\t} else {\n\n\t\t\t\treturn colorCode;\n\n\t\t\t}\n\n\t\t\tif ( c.isLineSegments ) {\n\n\t\t\t\tmaterial = loader.edgeMaterialCache.get( material );\n\n\t\t\t\tif ( c.isConditionalLine ) {\n\n\t\t\t\t\tmaterial = loader.conditionalEdgeMaterialCache.get( material );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn material;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the Material for the main LDraw color.\n\t *\n\t * For an already loaded LDraw asset, returns the Material associated with the main color code.\n\t * This method can be useful to modify the main material of a model or part that exposes it.\n\t *\n\t * The main color code is the standard way to color an LDraw part. It is '16' for triangles and\n\t * '24' for edges. Usually a complete model will not expose the main color (that is, no part\n\t * uses the code '16' at the top level, because they are assigned other specific colors) An LDraw\n\t *  part file on the other hand will expose the code '16' to be colored, and can have additional\n\t * fixed colors.\n\t *\n\t * @return {?Material} The material. Returns `null` if no material has been found.\n\t */\n\tgetMainMaterial() {\n\n\t\treturn this.getMaterial( MAIN_COLOUR_CODE );\n\n\t}\n\n\t/**\n\t * Returns the material for the edges main LDraw color.\n\t *\n\t * @return {?Material} The material. Returns `null` if no material has been found.\n\t */\n\tgetMainEdgeMaterial() {\n\n\t\tconst mat = this.getMaterial( MAIN_EDGE_COLOUR_CODE );\n\t\treturn mat ? this.edgeMaterialCache.get( mat ) : null;\n\n\t}\n\n\tparseColorMetaDirective( lineParser ) {\n\n\t\t// Parses a color definition and returns a THREE.Material\n\n\t\tlet code = null;\n\n\t\t// Triangle and line colors\n\t\tlet fillColor = '#FF00FF';\n\t\tlet edgeColor = '#FF00FF';\n\n\t\t// Transparency\n\t\tlet alpha = 1;\n\t\tlet isTransparent = false;\n\t\t// Self-illumination:\n\t\tlet luminance = 0;\n\n\t\tlet finishType = FINISH_TYPE_DEFAULT;\n\n\t\tlet edgeMaterial = null;\n\n\t\tconst name = lineParser.getToken();\n\t\tif ( ! name ) {\n\n\t\t\tthrow new Error( 'LDrawLoader: Material name was expected after \"!COLOUR tag' + lineParser.getLineNumberString() + '.' );\n\n\t\t}\n\n\t\t// Parse tag tokens and their parameters\n\t\tlet token = null;\n\t\twhile ( true ) {\n\n\t\t\ttoken = lineParser.getToken();\n\n\t\t\tif ( ! token ) {\n\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( ! parseLuminance( token ) ) {\n\n\t\t\t\tswitch ( token.toUpperCase() ) {\n\n\t\t\t\t\tcase 'CODE':\n\n\t\t\t\t\t\tcode = lineParser.getToken();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'VALUE':\n\n\t\t\t\t\t\tfillColor = lineParser.getToken();\n\t\t\t\t\t\tif ( fillColor.startsWith( '0x' ) ) {\n\n\t\t\t\t\t\t\tfillColor = '#' + fillColor.substring( 2 );\n\n\t\t\t\t\t\t} else if ( ! fillColor.startsWith( '#' ) ) {\n\n\t\t\t\t\t\t\tthrow new Error( 'LDrawLoader: Invalid color while parsing material' + lineParser.getLineNumberString() + '.' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'EDGE':\n\n\t\t\t\t\t\tedgeColor = lineParser.getToken();\n\t\t\t\t\t\tif ( edgeColor.startsWith( '0x' ) ) {\n\n\t\t\t\t\t\t\tedgeColor = '#' + edgeColor.substring( 2 );\n\n\t\t\t\t\t\t} else if ( ! edgeColor.startsWith( '#' ) ) {\n\n\t\t\t\t\t\t\t// Try to see if edge color is a color code\n\t\t\t\t\t\t\tedgeMaterial = this.getMaterial( edgeColor );\n\t\t\t\t\t\t\tif ( ! edgeMaterial ) {\n\n\t\t\t\t\t\t\t\tthrow new Error( 'LDrawLoader: Invalid edge color while parsing material' + lineParser.getLineNumberString() + '.' );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Get the edge material for this triangle material\n\t\t\t\t\t\t\tedgeMaterial = this.edgeMaterialCache.get( edgeMaterial );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'ALPHA':\n\n\t\t\t\t\t\talpha = parseInt( lineParser.getToken() );\n\n\t\t\t\t\t\tif ( isNaN( alpha ) ) {\n\n\t\t\t\t\t\t\tthrow new Error( 'LDrawLoader: Invalid alpha value in material definition' + lineParser.getLineNumberString() + '.' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\talpha = Math.max( 0, Math.min( 1, alpha / 255 ) );\n\n\t\t\t\t\t\tif ( alpha < 1 ) {\n\n\t\t\t\t\t\t\tisTransparent = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'LUMINANCE':\n\n\t\t\t\t\t\tif ( ! parseLuminance( lineParser.getToken() ) ) {\n\n\t\t\t\t\t\t\tthrow new Error( 'LDrawLoader: Invalid luminance value in material definition' + lineParser.getLineNumberString() + '.' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'CHROME':\n\t\t\t\t\t\tfinishType = FINISH_TYPE_CHROME;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'PEARLESCENT':\n\t\t\t\t\t\tfinishType = FINISH_TYPE_PEARLESCENT;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'RUBBER':\n\t\t\t\t\t\tfinishType = FINISH_TYPE_RUBBER;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'MATTE_METALLIC':\n\t\t\t\t\t\tfinishType = FINISH_TYPE_MATTE_METALLIC;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'METAL':\n\t\t\t\t\t\tfinishType = FINISH_TYPE_METAL;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'MATERIAL':\n\t\t\t\t\t\t// Not implemented\n\t\t\t\t\t\tlineParser.setToEnd();\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tthrow new Error( 'LDrawLoader: Unknown token \"' + token + '\" while parsing material' + lineParser.getLineNumberString() + '.' );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet material = null;\n\n\t\tswitch ( finishType ) {\n\n\t\t\tcase FINISH_TYPE_DEFAULT:\n\n\t\t\t\tmaterial = new MeshStandardMaterial( { roughness: 0.3, metalness: 0 } );\n\t\t\t\tbreak;\n\n\t\t\tcase FINISH_TYPE_PEARLESCENT:\n\n\t\t\t\t// Try to imitate pearlescency by making the surface glossy\n\t\t\t\tmaterial = new MeshStandardMaterial( { roughness: 0.3, metalness: 0.25 } );\n\t\t\t\tbreak;\n\n\t\t\tcase FINISH_TYPE_CHROME:\n\n\t\t\t\t// Mirror finish surface\n\t\t\t\tmaterial = new MeshStandardMaterial( { roughness: 0, metalness: 1 } );\n\t\t\t\tbreak;\n\n\t\t\tcase FINISH_TYPE_RUBBER:\n\n\t\t\t\t// Rubber finish\n\t\t\t\tmaterial = new MeshStandardMaterial( { roughness: 0.9, metalness: 0 } );\n\t\t\t\tbreak;\n\n\t\t\tcase FINISH_TYPE_MATTE_METALLIC:\n\n\t\t\t\t// Brushed metal finish\n\t\t\t\tmaterial = new MeshStandardMaterial( { roughness: 0.8, metalness: 0.4 } );\n\t\t\t\tbreak;\n\n\t\t\tcase FINISH_TYPE_METAL:\n\n\t\t\t\t// Average metal finish\n\t\t\t\tmaterial = new MeshStandardMaterial( { roughness: 0.2, metalness: 0.85 } );\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\t// Should not happen\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tmaterial.color.setStyle( fillColor, COLOR_SPACE_LDRAW );\n\t\tmaterial.transparent = isTransparent;\n\t\tmaterial.opacity = alpha;\n\t\tmaterial.depthWrite = ! isTransparent;\n\n\t\tmaterial.polygonOffset = true;\n\t\tmaterial.polygonOffsetFactor = 1;\n\n\t\tif ( luminance !== 0 ) {\n\n\t\t\tmaterial.emissive.setStyle( fillColor, COLOR_SPACE_LDRAW ).multiplyScalar( luminance );\n\n\t\t}\n\n\t\tif ( ! edgeMaterial ) {\n\n\t\t\t// This is the material used for edges\n\t\t\tedgeMaterial = new LineBasicMaterial( {\n\t\t\t\tcolor: new Color().setStyle( edgeColor, COLOR_SPACE_LDRAW ),\n\t\t\t\ttransparent: isTransparent,\n\t\t\t\topacity: alpha,\n\t\t\t\tdepthWrite: ! isTransparent\n\t\t\t} );\n\t\t\tedgeMaterial.color;\n\t\t\tedgeMaterial.userData.code = code;\n\t\t\tedgeMaterial.name = name + ' - Edge';\n\n\t\t\tif ( this.ConditionalLineMaterial === null ) {\n\n\t\t\t\tthrow new Error( 'THREE.LDrawLoader: ConditionalLineMaterial type must be specified via .setConditionalLineMaterial().' );\n\n\t\t\t}\n\n\t\t\t// This is the material used for conditional edges\n\t\t\tconst conditionalEdgeMaterial = new this.ConditionalLineMaterial( {\n\n\t\t\t\tfog: true,\n\t\t\t\ttransparent: isTransparent,\n\t\t\t\tdepthWrite: ! isTransparent,\n\t\t\t\tcolor: new Color().setStyle( edgeColor, COLOR_SPACE_LDRAW ),\n\t\t\t\topacity: alpha,\n\n\t\t\t} );\n\t\t\tconditionalEdgeMaterial.userData.code = code;\n\t\t\tconditionalEdgeMaterial.name = name + ' - Conditional Edge';\n\n\t\t\tthis.conditionalEdgeMaterialCache.set( edgeMaterial, conditionalEdgeMaterial );\n\n\t\t}\n\n\t\tmaterial.userData.code = code;\n\t\tmaterial.name = name;\n\n\t\tthis.edgeMaterialCache.set( material, edgeMaterial );\n\n\t\tthis.addMaterial( material );\n\n\t\treturn material;\n\n\t\tfunction parseLuminance( token ) {\n\n\t\t\t// Returns success\n\n\t\t\tlet lum;\n\n\t\t\tif ( token.startsWith( 'LUMINANCE' ) ) {\n\n\t\t\t\tlum = parseInt( token.substring( 9 ) );\n\n\t\t\t} else {\n\n\t\t\t\tlum = parseInt( token );\n\n\t\t\t}\n\n\t\t\tif ( isNaN( lum ) ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\tluminance = Math.max( 0, Math.min( 1, lum / 255 ) );\n\n\t\t\treturn true;\n\n\t\t}\n\n\t}\n\n\tcomputeBuildingSteps( model ) {\n\n\t\t// Sets userdata.buildingStep number in Group objects and userData.numBuildingSteps number in the root Group object.\n\n\t\tlet stepNumber = 0;\n\n\t\tmodel.traverse( c => {\n\n\t\t\tif ( c.isGroup ) {\n\n\t\t\t\tif ( c.userData.startingBuildingStep ) {\n\n\t\t\t\t\tstepNumber ++;\n\n\t\t\t\t}\n\n\t\t\t\tc.userData.buildingStep = stepNumber;\n\n\t\t\t}\n\n\t\t} );\n\n\t\tmodel.userData.numBuildingSteps = stepNumber + 1;\n\n\t}\n\n}\n\nexport { LDrawLoader };\n", "import {\n\tClampToEdgeWrapping,\n\tData3DTexture,\n\tFileLoader,\n\tLinearFilter,\n\tLoader,\n\tRGBAFormat,\n\tUnsignedByteType,\n} from 'three';\n\n/**\n * A loader for the 3DL LUT format.\n *\n * References:\n * - [3D LUTs](http://download.autodesk.com/us/systemdocs/help/2011/lustre/index.html?url=./files/WSc4e151a45a3b785a24c3d9a411df9298473-7ffd.htm,topicNumber=d0e9492)\n * - [Format Spec for .3dl](https://community.foundry.com/discuss/topic/103636/format-spec-for-3dl?mode=Post&postID=895258)\n *\n * ```js\n * const loader = new LUT3dlLoader();\n * const map = loader.loadAsync( 'luts/Presetpro-Cinematic.3dl' );\n * ```\n *\n * @augments Loader\n * @three_import import { LUT3dlLoader } from 'three/addons/loaders/LUT3dlLoader.js';\n */\nexport class LUT3dlLoader extends Loader {\n\n\t/**\n\t * Constructs a new 3DL LUT loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * The texture type.\n\t\t *\n\t\t * @type {(UnsignedByteType|FloatType)}\n\t\t * @default UnsignedByteType\n\t\t */\n\t\tthis.type = UnsignedByteType;\n\n\t}\n\n\t/**\n\t * Sets the texture type.\n\t *\n\t * @param {(UnsignedByteType|FloatType)} type - The texture type to set.\n\t * @return {LUT3dlLoader} A reference to this loader.\n\t */\n\tsetType( type ) {\n\n\t\tthis.type = type;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded 3DL LUT asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function({size:number,texture3D:Data3DTexture})} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'text' );\n\t\tloader.load( url, text => {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( this.parse( text ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tthis.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given 3DL LUT data and returns the resulting 3D data texture.\n\t *\n\t * @param {string} input - The raw 3DL LUT data as a string.\n\t * @return {{size:number,texture3D:Data3DTexture}} The parsed 3DL LUT.\n\t */\n\tparse( input ) {\n\n\t\tconst regExpGridInfo = /^[\\d ]+$/m;\n\t\tconst regExpDataPoints = /^([\\d.e+-]+) +([\\d.e+-]+) +([\\d.e+-]+) *$/gm;\n\n\t\t// The first line describes the positions of values on the LUT grid.\n\t\tlet result = regExpGridInfo.exec( input );\n\n\t\tif ( result === null ) {\n\n\t\t\tthrow new Error( 'LUT3dlLoader: Missing grid information' );\n\n\t\t}\n\n\t\tconst gridLines = result[ 0 ].trim().split( /\\s+/g ).map( Number );\n\t\tconst gridStep = gridLines[ 1 ] - gridLines[ 0 ];\n\t\tconst size = gridLines.length;\n\t\tconst sizeSq = size ** 2;\n\n\t\tfor ( let i = 1, l = gridLines.length; i < l; ++ i ) {\n\n\t\t\tif ( gridStep !== ( gridLines[ i ] - gridLines[ i - 1 ] ) ) {\n\n\t\t\t\tthrow new Error( 'LUT3dlLoader: Inconsistent grid size' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst dataFloat = new Float32Array( size ** 3 * 4 );\n\t\tlet maxValue = 0.0;\n\t\tlet index = 0;\n\n\t\twhile ( ( result = regExpDataPoints.exec( input ) ) !== null ) {\n\n\t\t\tconst r = Number( result[ 1 ] );\n\t\t\tconst g = Number( result[ 2 ] );\n\t\t\tconst b = Number( result[ 3 ] );\n\n\t\t\tmaxValue = Math.max( maxValue, r, g, b );\n\n\t\t\tconst bLayer = index % size;\n\t\t\tconst gLayer = Math.floor( index / size ) % size;\n\t\t\tconst rLayer = Math.floor( index / ( sizeSq ) ) % size;\n\n\t\t\t// b grows first, then g, then r.\n\t\t\tconst d4 = ( bLayer * sizeSq + gLayer * size + rLayer ) * 4;\n\t\t\tdataFloat[ d4 + 0 ] = r;\n\t\t\tdataFloat[ d4 + 1 ] = g;\n\t\t\tdataFloat[ d4 + 2 ] = b;\n\n\t\t\t++ index;\n\n\t\t}\n\n\t\t// Determine the bit depth to scale the values to [0.0, 1.0].\n\t\tconst bits = Math.ceil( Math.log2( maxValue ) );\n\t\tconst maxBitValue = Math.pow( 2, bits );\n\n\t\tconst data = this.type === UnsignedByteType ? new Uint8Array( dataFloat.length ) : dataFloat;\n\t\tconst scale = this.type === UnsignedByteType ? 255 : 1;\n\n\t\tfor ( let i = 0, l = data.length; i < l; i += 4 ) {\n\n\t\t\tconst i1 = i + 1;\n\t\t\tconst i2 = i + 2;\n\t\t\tconst i3 = i + 3;\n\n\t\t\t// Note: data is dataFloat when type is FloatType.\n\t\t\tdata[ i ] = dataFloat[ i ] / maxBitValue * scale;\n\t\t\tdata[ i1 ] = dataFloat[ i1 ] / maxBitValue * scale;\n\t\t\tdata[ i2 ] = dataFloat[ i2 ] / maxBitValue * scale;\n\t\t\tdata[ i3 ] = scale;\n\n\t\t}\n\n\t\tconst texture3D = new Data3DTexture();\n\t\ttexture3D.image.data = data;\n\t\ttexture3D.image.width = size;\n\t\ttexture3D.image.height = size;\n\t\ttexture3D.image.depth = size;\n\t\ttexture3D.format = RGBAFormat;\n\t\ttexture3D.type = this.type;\n\t\ttexture3D.magFilter = LinearFilter;\n\t\ttexture3D.minFilter = LinearFilter;\n\t\ttexture3D.wrapS = ClampToEdgeWrapping;\n\t\ttexture3D.wrapT = ClampToEdgeWrapping;\n\t\ttexture3D.wrapR = ClampToEdgeWrapping;\n\t\ttexture3D.generateMipmaps = false;\n\t\ttexture3D.needsUpdate = true;\n\n\t\treturn {\n\t\t\tsize,\n\t\t\ttexture3D,\n\t\t};\n\n\t}\n\n}\n", "import {\n\tClampToEdgeWrapping,\n\tData3DTexture,\n\tFileLoader,\n\tLinearFilter,\n\tLoader,\n\tUnsignedByteType,\n\tVector3,\n} from 'three';\n\n/**\n * A loader for the Cube LUT format.\n *\n * References:\n * - [Cube LUT Specification](https://web.archive.org/web/20220220033515/https://wwwimages2.adobe.com/content/dam/acom/en/products/speedgrade/cc/pdfs/cube-lut-specification-1.0.pdf)\n *\n * ```js\n * const loader = new LUTCubeLoader();\n * const map = loader.loadAsync( 'luts/Bourbon 64.CUBE' );\n * ```\n *\n * @augments Loader\n * @three_import import { LUTCubeLoader } from 'three/addons/loaders/LUTCubeLoader.js';\n */\nexport class LUTCubeLoader extends Loader {\n\n\t/**\n\t * Constructs a new Cube LUT loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * The texture type.\n\t\t *\n\t\t * @type {(UnsignedByteType|FloatType)}\n\t\t * @default UnsignedByteType\n\t\t */\n\t\tthis.type = UnsignedByteType;\n\n\t}\n\n\t/**\n\t * Sets the texture type.\n\t *\n\t * @param {(UnsignedByteType|FloatType)} type - The texture type to set.\n\t * @return {LUTCubeLoader} A reference to this loader.\n\t */\n\tsetType( type ) {\n\n\t\tthis.type = type;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded Cube LUT asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function({title:string,size:number,domainMin:Vector3,domainMax:Vector3,texture3D:Data3DTexture})} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'text' );\n\t\tloader.load( url, text => {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( this.parse( text ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tthis.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given Cube LUT data and returns the resulting 3D data texture.\n\t *\n\t * @param {string} input - The raw Cube LUT data as a string.\n\t * @return {{title:string,size:number,domainMin:Vector3,domainMax:Vector3,texture3D:Data3DTexture}} The parsed Cube LUT.\n\t */\n\tparse( input ) {\n\n\t\tconst regExpTitle = /TITLE +\"([^\"]*)\"/;\n\t\tconst regExpSize = /LUT_3D_SIZE +(\\d+)/;\n\t\tconst regExpDomainMin = /DOMAIN_MIN +([\\d.]+) +([\\d.]+) +([\\d.]+)/;\n\t\tconst regExpDomainMax = /DOMAIN_MAX +([\\d.]+) +([\\d.]+) +([\\d.]+)/;\n\t\tconst regExpDataPoints = /^([\\d.e+-]+) +([\\d.e+-]+) +([\\d.e+-]+) *$/gm;\n\n\t\tlet result = regExpTitle.exec( input );\n\t\tconst title = ( result !== null ) ? result[ 1 ] : null;\n\n\t\tresult = regExpSize.exec( input );\n\n\t\tif ( result === null ) {\n\n\t\t\tthrow new Error( 'LUTCubeLoader: Missing LUT_3D_SIZE information' );\n\n\t\t}\n\n\t\tconst size = Number( result[ 1 ] );\n\t\tconst length = size ** 3 * 4;\n\t\tconst data = this.type === UnsignedByteType ? new Uint8Array( length ) : new Float32Array( length );\n\n\t\tconst domainMin = new Vector3( 0, 0, 0 );\n\t\tconst domainMax = new Vector3( 1, 1, 1 );\n\n\t\tresult = regExpDomainMin.exec( input );\n\n\t\tif ( result !== null ) {\n\n\t\t\tdomainMin.set( Number( result[ 1 ] ), Number( result[ 2 ] ), Number( result[ 3 ] ) );\n\n\t\t}\n\n\t\tresult = regExpDomainMax.exec( input );\n\n\t\tif ( result !== null ) {\n\n\t\t\tdomainMax.set( Number( result[ 1 ] ), Number( result[ 2 ] ), Number( result[ 3 ] ) );\n\n\t\t}\n\n\t\tif ( domainMin.x > domainMax.x || domainMin.y > domainMax.y || domainMin.z > domainMax.z ) {\n\n\t\t\tthrow new Error( 'LUTCubeLoader: Invalid input domain' );\n\n\t\t}\n\n\t\tconst scale = this.type === UnsignedByteType ? 255 : 1;\n\t\tlet i = 0;\n\n\t\twhile ( ( result = regExpDataPoints.exec( input ) ) !== null ) {\n\n\t\t\tdata[ i ++ ] = Number( result[ 1 ] ) * scale;\n\t\t\tdata[ i ++ ] = Number( result[ 2 ] ) * scale;\n\t\t\tdata[ i ++ ] = Number( result[ 3 ] ) * scale;\n\t\t\tdata[ i ++ ] = scale;\n\n\t\t}\n\n\t\tconst texture3D = new Data3DTexture();\n\t\ttexture3D.image.data = data;\n\t\ttexture3D.image.width = size;\n\t\ttexture3D.image.height = size;\n\t\ttexture3D.image.depth = size;\n\t\ttexture3D.type = this.type;\n\t\ttexture3D.magFilter = LinearFilter;\n\t\ttexture3D.minFilter = LinearFilter;\n\t\ttexture3D.wrapS = ClampToEdgeWrapping;\n\t\ttexture3D.wrapT = ClampToEdgeWrapping;\n\t\ttexture3D.wrapR = ClampToEdgeWrapping;\n\t\ttexture3D.generateMipmaps = false;\n\t\ttexture3D.needsUpdate = true;\n\n\t\treturn {\n\t\t\ttitle,\n\t\t\tsize,\n\t\t\tdomainMin,\n\t\t\tdomainMax,\n\t\t\ttexture3D,\n\t\t};\n\n\t}\n\n}\n", "import {\n\tAddOperation,\n\tBackSide,\n\tBufferGeometry,\n\tClampToEdgeWrapping,\n\tColor,\n\tDoubleSide,\n\tEquirectangularReflectionMapping,\n\tEquirectangularRefractionMapping,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tFrontSide,\n\tLineBasicMaterial,\n\tLineSegments,\n\tLoader,\n\tMesh,\n\tMeshPhongMaterial,\n\tMeshPhysicalMaterial,\n\tMeshStandardMaterial,\n\tMirroredRepeatWrapping,\n\tPoints,\n\tPointsMaterial,\n\tRepeatWrapping,\n\tSRGBColorSpace,\n\tTextureLoader,\n\tVector2\n} from 'three';\n\nimport { IFFParser } from './lwo/IFFParser.js';\n\nlet _lwoTree;\n\n/**\n * A loader for the LWO format.\n *\n * LWO3 and LWO2 formats are supported.\n *\n * References:\n * - [LWO3 format specification](https://static.lightwave3d.com/sdk/2019/html/filefmts/lwo3.html)\n * - [LWO2 format specification](https://static.lightwave3d.com/sdk/2019/html/filefmts/lwo2.html)\n *\n * ```js\n * const loader = new LWOLoader();\n * const lwoData = await loader.loadAsync( 'models/lwo/Objects/LWO3/Demo.lwo' );\n *\n * const mesh = object.meshes[ 0 ];\n * scene.add( mesh );\n * ```\n *\n * @augments Loader\n * @three_import import { LWOLoader } from 'three/addons/loaders/LWOLoader.js';\n */\nclass LWOLoader extends Loader {\n\n\t/**\n\t * Constructs a new LWO loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded LWO asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function({meshes:Array<Mesh>,materials:Array<Material>})} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( scope.path === '' ) ? extractParentUrl( url, 'Objects' ) : scope.path;\n\n\t\t// give the mesh a default name based on the filename\n\t\tconst modelName = url.split( path ).pop().split( '.' )[ 0 ];\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\t// console.time( 'Total parsing: ' );\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( buffer, path, modelName ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t\t// console.timeEnd( 'Total parsing: ' );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given LWO data and returns the resulting meshes and materials.\n\t *\n\t * @param {ArrayBuffer} iffBuffer - The raw LWO data as an array buffer.\n\t * @param {string} path - The URL base path.\n\t * @param {string} modelName - The model name.\n\t * @return {{meshes:Array<Mesh>,materials:Array<Material>}} An object holding the parse meshes and materials.\n\t */\n\tparse( iffBuffer, path, modelName ) {\n\n\t\t_lwoTree = new IFFParser().parse( iffBuffer );\n\n\t\t// console.log( 'lwoTree', lwoTree );\n\n\t\tconst textureLoader = new TextureLoader( this.manager ).setPath( this.resourcePath || path ).setCrossOrigin( this.crossOrigin );\n\n\t\treturn new LWOTreeParser( textureLoader ).parse( modelName );\n\n\t}\n\n}\n\n// Parse the lwoTree object\nclass LWOTreeParser {\n\n\tconstructor( textureLoader ) {\n\n\t\tthis.textureLoader = textureLoader;\n\n\t}\n\n\tparse( modelName ) {\n\n\t\tthis.materials = new MaterialParser( this.textureLoader ).parse();\n\t\tthis.defaultLayerName = modelName;\n\n\t\tthis.meshes = this.parseLayers();\n\n\t\treturn {\n\t\t\tmaterials: this.materials,\n\t\t\tmeshes: this.meshes,\n\t\t};\n\n\t}\n\n\tparseLayers() {\n\n\t\t// array of all meshes for building hierarchy\n\t\tconst meshes = [];\n\n\t\t// final array containing meshes with scene graph hierarchy set up\n\t\tconst finalMeshes = [];\n\n\t\tconst geometryParser = new GeometryParser();\n\n\t\tconst scope = this;\n\t\t_lwoTree.layers.forEach( function ( layer ) {\n\n\t\t\tconst geometry = geometryParser.parse( layer.geometry, layer );\n\n\t\t\tconst mesh = scope.parseMesh( geometry, layer );\n\n\t\t\tmeshes[ layer.number ] = mesh;\n\n\t\t\tif ( layer.parent === - 1 ) finalMeshes.push( mesh );\n\t\t\telse meshes[ layer.parent ].add( mesh );\n\n\n\t\t} );\n\n\t\tthis.applyPivots( finalMeshes );\n\n\t\treturn finalMeshes;\n\n\t}\n\n\tparseMesh( geometry, layer ) {\n\n\t\tlet mesh;\n\n\t\tconst materials = this.getMaterials( geometry.userData.matNames, layer.geometry.type );\n\n\t\tif ( layer.geometry.type === 'points' ) mesh = new Points( geometry, materials );\n\t\telse if ( layer.geometry.type === 'lines' ) mesh = new LineSegments( geometry, materials );\n\t\telse mesh = new Mesh( geometry, materials );\n\n\t\tif ( layer.name ) mesh.name = layer.name;\n\t\telse mesh.name = this.defaultLayerName + '_layer_' + layer.number;\n\n\t\tmesh.userData.pivot = layer.pivot;\n\n\t\treturn mesh;\n\n\t}\n\n\t// TODO: may need to be reversed in z to convert LWO to three.js coordinates\n\tapplyPivots( meshes ) {\n\n\t\tmeshes.forEach( function ( mesh ) {\n\n\t\t\tmesh.traverse( function ( child ) {\n\n\t\t\t\tconst pivot = child.userData.pivot;\n\n\t\t\t\tchild.position.x += pivot[ 0 ];\n\t\t\t\tchild.position.y += pivot[ 1 ];\n\t\t\t\tchild.position.z += pivot[ 2 ];\n\n\t\t\t\tif ( child.parent ) {\n\n\t\t\t\t\tconst parentPivot = child.parent.userData.pivot;\n\n\t\t\t\t\tchild.position.x -= parentPivot[ 0 ];\n\t\t\t\t\tchild.position.y -= parentPivot[ 1 ];\n\t\t\t\t\tchild.position.z -= parentPivot[ 2 ];\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\tgetMaterials( namesArray, type ) {\n\n\t\tconst materials = [];\n\n\t\tconst scope = this;\n\n\t\tnamesArray.forEach( function ( name, i ) {\n\n\t\t\tmaterials[ i ] = scope.getMaterialByName( name );\n\n\t\t} );\n\n\t\t// convert materials to line or point mats if required\n\t\tif ( type === 'points' || type === 'lines' ) {\n\n\t\t\tmaterials.forEach( function ( mat, i ) {\n\n\t\t\t\tconst spec = {\n\t\t\t\t\tcolor: mat.color,\n\t\t\t\t};\n\n\t\t\t\tif ( type === 'points' ) {\n\n\t\t\t\t\tspec.size = 0.1;\n\t\t\t\t\tspec.map = mat.map;\n\t\t\t\t\tmaterials[ i ] = new PointsMaterial( spec );\n\n\t\t\t\t} else if ( type === 'lines' ) {\n\n\t\t\t\t\tmaterials[ i ] = new LineBasicMaterial( spec );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t}\n\n\t\t// if there is only one material, return that directly instead of array\n\t\tconst filtered = materials.filter( Boolean );\n\t\tif ( filtered.length === 1 ) return filtered[ 0 ];\n\n\t\treturn materials;\n\n\t}\n\n\tgetMaterialByName( name ) {\n\n\t\treturn this.materials.filter( function ( m ) {\n\n\t\t\treturn m.name === name;\n\n\t\t} )[ 0 ];\n\n\t}\n\n}\n\nclass MaterialParser {\n\n\tconstructor( textureLoader ) {\n\n\t\tthis.textureLoader = textureLoader;\n\n\t}\n\n\tparse() {\n\n\t\tconst materials = [];\n\t\tthis.textures = {};\n\n\t\tfor ( const name in _lwoTree.materials ) {\n\n\t\t\tif ( _lwoTree.format === 'LWO3' ) {\n\n\t\t\t\tmaterials.push( this.parseMaterial( _lwoTree.materials[ name ], name, _lwoTree.textures ) );\n\n\t\t\t} else if ( _lwoTree.format === 'LWO2' ) {\n\n\t\t\t\tmaterials.push( this.parseMaterialLwo2( _lwoTree.materials[ name ], name, _lwoTree.textures ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn materials;\n\n\t}\n\n\tparseMaterial( materialData, name, textures ) {\n\n\t\tlet params = {\n\t\t\tname: name,\n\t\t\tside: this.getSide( materialData.attributes ),\n\t\t\tflatShading: this.getSmooth( materialData.attributes ),\n\t\t};\n\n\t\tconst connections = this.parseConnections( materialData.connections, materialData.nodes );\n\n\t\tconst maps = this.parseTextureNodes( connections.maps );\n\n\t\tthis.parseAttributeImageMaps( connections.attributes, textures, maps );\n\n\t\tconst attributes = this.parseAttributes( connections.attributes, maps );\n\n\t\tthis.parseEnvMap( connections, maps, attributes );\n\n\t\tparams = Object.assign( maps, params );\n\t\tparams = Object.assign( params, attributes );\n\n\t\tconst materialType = this.getMaterialType( connections.attributes );\n\n\t\tif ( materialType !== MeshPhongMaterial ) delete params.refractionRatio; // PBR materials do not support \"refractionRatio\"\n\n\t\treturn new materialType( params );\n\n\t}\n\n\tparseMaterialLwo2( materialData, name/*, textures*/ ) {\n\n\t\tlet params = {\n\t\t\tname: name,\n\t\t\tside: this.getSide( materialData.attributes ),\n\t\t\tflatShading: this.getSmooth( materialData.attributes ),\n\t\t};\n\n\t\tconst attributes = this.parseAttributes( materialData.attributes, {} );\n\t\tparams = Object.assign( params, attributes );\n\t\treturn new MeshPhongMaterial( params );\n\n\t}\n\n\t// Note: converting from left to right handed coords by switching x -> -x in vertices, and\n\t// then switching mat FrontSide -> BackSide\n\t// NB: this means that FrontSide and BackSide have been switched!\n\tgetSide( attributes ) {\n\n\t\tif ( ! attributes.side ) return BackSide;\n\n\t\tswitch ( attributes.side ) {\n\n\t\t\tcase 0:\n\t\t\tcase 1:\n\t\t\t\treturn BackSide;\n\t\t\tcase 2: return FrontSide;\n\t\t\tcase 3: return DoubleSide;\n\n\t\t}\n\n\t}\n\n\tgetSmooth( attributes ) {\n\n\t\tif ( ! attributes.smooth ) return true;\n\t\treturn ! attributes.smooth;\n\n\t}\n\n\tparseConnections( connections, nodes ) {\n\n\t\tconst materialConnections = {\n\t\t\tmaps: {}\n\t\t};\n\n\t\tconst inputName = connections.inputName;\n\t\tconst inputNodeName = connections.inputNodeName;\n\t\tconst nodeName = connections.nodeName;\n\n\t\tconst scope = this;\n\t\tinputName.forEach( function ( name, index ) {\n\n\t\t\tif ( name === 'Material' ) {\n\n\t\t\t\tconst matNode = scope.getNodeByRefName( inputNodeName[ index ], nodes );\n\t\t\t\tmaterialConnections.attributes = matNode.attributes;\n\t\t\t\tmaterialConnections.envMap = matNode.fileName;\n\t\t\t\tmaterialConnections.name = inputNodeName[ index ];\n\n\t\t\t}\n\n\t\t} );\n\n\t\tnodeName.forEach( function ( name, index ) {\n\n\t\t\tif ( name === materialConnections.name ) {\n\n\t\t\t\tmaterialConnections.maps[ inputName[ index ] ] = scope.getNodeByRefName( inputNodeName[ index ], nodes );\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn materialConnections;\n\n\t}\n\n\tgetNodeByRefName( refName, nodes ) {\n\n\t\tfor ( const name in nodes ) {\n\n\t\t\tif ( nodes[ name ].refName === refName ) return nodes[ name ];\n\n\t\t}\n\n\t}\n\n\tparseTextureNodes( textureNodes ) {\n\n\t\tconst maps = {};\n\n\t\tfor ( const name in textureNodes ) {\n\n\t\t\tconst node = textureNodes[ name ];\n\t\t\tconst path = node.fileName;\n\n\t\t\tif ( ! path ) return;\n\n\t\t\tconst texture = this.loadTexture( path );\n\n\t\t\tif ( node.widthWrappingMode !== undefined ) texture.wrapS = this.getWrappingType( node.widthWrappingMode );\n\t\t\tif ( node.heightWrappingMode !== undefined ) texture.wrapT = this.getWrappingType( node.heightWrappingMode );\n\n\t\t\tswitch ( name ) {\n\n\t\t\t\tcase 'Color':\n\t\t\t\t\tmaps.map = texture;\n\t\t\t\t\tmaps.map.colorSpace = SRGBColorSpace;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Roughness':\n\t\t\t\t\tmaps.roughnessMap = texture;\n\t\t\t\t\tmaps.roughness = 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Specular':\n\t\t\t\t\tmaps.specularMap = texture;\n\t\t\t\t\tmaps.specularMap.colorSpace = SRGBColorSpace;\n\t\t\t\t\tmaps.specular = 0xffffff;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Luminous':\n\t\t\t\t\tmaps.emissiveMap = texture;\n\t\t\t\t\tmaps.emissiveMap.colorSpace = SRGBColorSpace;\n\t\t\t\t\tmaps.emissive = 0x808080;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Luminous Color':\n\t\t\t\t\tmaps.emissive = 0x808080;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Metallic':\n\t\t\t\t\tmaps.metalnessMap = texture;\n\t\t\t\t\tmaps.metalness = 1;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Transparency':\n\t\t\t\tcase 'Alpha':\n\t\t\t\t\tmaps.alphaMap = texture;\n\t\t\t\t\tmaps.transparent = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Normal':\n\t\t\t\t\tmaps.normalMap = texture;\n\t\t\t\t\tif ( node.amplitude !== undefined ) maps.normalScale = new Vector2( node.amplitude, node.amplitude );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Bump':\n\t\t\t\t\tmaps.bumpMap = texture;\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// LWO BSDF materials can have both spec and rough, but this is not valid in three\n\t\tif ( maps.roughnessMap && maps.specularMap ) delete maps.specularMap;\n\n\t\treturn maps;\n\n\t}\n\n\t// maps can also be defined on individual material attributes, parse those here\n\t// This occurs on Standard (Phong) surfaces\n\tparseAttributeImageMaps( attributes, textures, maps ) {\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\n\t\t\tif ( attribute.maps ) {\n\n\t\t\t\tconst mapData = attribute.maps[ 0 ];\n\n\t\t\t\tconst path = this.getTexturePathByIndex( mapData.imageIndex );\n\t\t\t\tif ( ! path ) return;\n\n\t\t\t\tconst texture = this.loadTexture( path );\n\n\t\t\t\tif ( mapData.wrap !== undefined ) texture.wrapS = this.getWrappingType( mapData.wrap.w );\n\t\t\t\tif ( mapData.wrap !== undefined ) texture.wrapT = this.getWrappingType( mapData.wrap.h );\n\n\t\t\t\tswitch ( name ) {\n\n\t\t\t\t\tcase 'Color':\n\t\t\t\t\t\tmaps.map = texture;\n\t\t\t\t\t\tmaps.map.colorSpace = SRGBColorSpace;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Diffuse':\n\t\t\t\t\t\tmaps.aoMap = texture;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Roughness':\n\t\t\t\t\t\tmaps.roughnessMap = texture;\n\t\t\t\t\t\tmaps.roughness = 1;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Specular':\n\t\t\t\t\t\tmaps.specularMap = texture;\n\t\t\t\t\t\tmaps.specularMap.colorSpace = SRGBColorSpace;\n\t\t\t\t\t\tmaps.specular = 0xffffff;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Luminosity':\n\t\t\t\t\t\tmaps.emissiveMap = texture;\n\t\t\t\t\t\tmaps.emissiveMap.colorSpace = SRGBColorSpace;\n\t\t\t\t\t\tmaps.emissive = 0x808080;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Metallic':\n\t\t\t\t\t\tmaps.metalnessMap = texture;\n\t\t\t\t\t\tmaps.metalness = 1;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Transparency':\n\t\t\t\t\tcase 'Alpha':\n\t\t\t\t\t\tmaps.alphaMap = texture;\n\t\t\t\t\t\tmaps.transparent = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Normal':\n\t\t\t\t\t\tmaps.normalMap = texture;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'Bump':\n\t\t\t\t\t\tmaps.bumpMap = texture;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tparseAttributes( attributes, maps ) {\n\n\t\tconst params = {};\n\n\t\t// don't use color data if color map is present\n\t\tif ( attributes.Color && ! maps.map ) {\n\n\t\t\tparams.color = new Color().fromArray( attributes.Color.value );\n\n\t\t} else {\n\n\t\t\tparams.color = new Color();\n\n\t\t}\n\n\n\t\tif ( attributes.Transparency && attributes.Transparency.value !== 0 ) {\n\n\t\t\tparams.opacity = 1 - attributes.Transparency.value;\n\t\t\tparams.transparent = true;\n\n\t\t}\n\n\t\tif ( attributes[ 'Bump Height' ] ) params.bumpScale = attributes[ 'Bump Height' ].value * 0.1;\n\n\t\tthis.parsePhysicalAttributes( params, attributes, maps );\n\t\tthis.parseStandardAttributes( params, attributes, maps );\n\t\tthis.parsePhongAttributes( params, attributes, maps );\n\n\t\treturn params;\n\n\t}\n\n\tparsePhysicalAttributes( params, attributes/*, maps*/ ) {\n\n\t\tif ( attributes.Clearcoat && attributes.Clearcoat.value > 0 ) {\n\n\t\t\tparams.clearcoat = attributes.Clearcoat.value;\n\n\t\t\tif ( attributes[ 'Clearcoat Gloss' ] ) {\n\n\t\t\t\tparams.clearcoatRoughness = 0.5 * ( 1 - attributes[ 'Clearcoat Gloss' ].value );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tparseStandardAttributes( params, attributes, maps ) {\n\n\n\t\tif ( attributes.Luminous ) {\n\n\t\t\tparams.emissiveIntensity = attributes.Luminous.value;\n\n\t\t\tif ( attributes[ 'Luminous Color' ] && ! maps.emissive ) {\n\n\t\t\t\tparams.emissive = new Color().fromArray( attributes[ 'Luminous Color' ].value );\n\n\t\t\t} else {\n\n\t\t\t\tparams.emissive = new Color( 0x808080 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( attributes.Roughness && ! maps.roughnessMap ) params.roughness = attributes.Roughness.value;\n\t\tif ( attributes.Metallic && ! maps.metalnessMap ) params.metalness = attributes.Metallic.value;\n\n\t}\n\n\tparsePhongAttributes( params, attributes, maps ) {\n\n\t\tif ( attributes[ 'Refraction Index' ] ) params.refractionRatio = 0.98 / attributes[ 'Refraction Index' ].value;\n\n\t\tif ( attributes.Diffuse ) params.color.multiplyScalar( attributes.Diffuse.value );\n\n\t\tif ( attributes.Reflection ) {\n\n\t\t\tparams.reflectivity = attributes.Reflection.value;\n\t\t\tparams.combine = AddOperation;\n\n\t\t}\n\n\t\tif ( attributes.Luminosity ) {\n\n\t\t\tparams.emissiveIntensity = attributes.Luminosity.value;\n\n\t\t\tif ( ! maps.emissiveMap && ! maps.map ) {\n\n\t\t\t\tparams.emissive = params.color;\n\n\t\t\t} else {\n\n\t\t\t\tparams.emissive = new Color( 0x808080 );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// parse specular if there is no roughness - we will interpret the material as 'Phong' in this case\n\t\tif ( ! attributes.Roughness && attributes.Specular && ! maps.specularMap ) {\n\n\t\t\tif ( attributes[ 'Color Highlight' ] ) {\n\n\t\t\t\tparams.specular = new Color().setScalar( attributes.Specular.value ).lerp( params.color.clone().multiplyScalar( attributes.Specular.value ), attributes[ 'Color Highlight' ].value );\n\n\t\t\t} else {\n\n\t\t\t\tparams.specular = new Color().setScalar( attributes.Specular.value );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( params.specular && attributes.Glossiness ) params.shininess = 7 + Math.pow( 2, attributes.Glossiness.value * 12 + 2 );\n\n\t}\n\n\tparseEnvMap( connections, maps, attributes ) {\n\n\t\tif ( connections.envMap ) {\n\n\t\t\tconst envMap = this.loadTexture( connections.envMap );\n\n\t\t\tif ( attributes.transparent && attributes.opacity < 0.999 ) {\n\n\t\t\t\tenvMap.mapping = EquirectangularRefractionMapping;\n\n\t\t\t\t// Reflectivity and refraction mapping don't work well together in Phong materials\n\t\t\t\tif ( attributes.reflectivity !== undefined ) {\n\n\t\t\t\t\tdelete attributes.reflectivity;\n\t\t\t\t\tdelete attributes.combine;\n\n\t\t\t\t}\n\n\t\t\t\tif ( attributes.metalness !== undefined ) {\n\n\t\t\t\t\tattributes.metalness = 1; // For most transparent materials metalness should be set to 1 if not otherwise defined. If set to 0 no refraction will be visible\n\n\t\t\t\t}\n\n\t\t\t\tattributes.opacity = 1; // transparency fades out refraction, forcing opacity to 1 ensures a closer visual match to the material in Lightwave.\n\n\t\t\t} else envMap.mapping = EquirectangularReflectionMapping;\n\n\t\t\tmaps.envMap = envMap;\n\n\t\t}\n\n\t}\n\n\t// get texture defined at top level by its index\n\tgetTexturePathByIndex( index ) {\n\n\t\tlet fileName = '';\n\n\t\tif ( ! _lwoTree.textures ) return fileName;\n\n\t\t_lwoTree.textures.forEach( function ( texture ) {\n\n\t\t\tif ( texture.index === index ) fileName = texture.fileName;\n\n\t\t} );\n\n\t\treturn fileName;\n\n\t}\n\n\tloadTexture( path ) {\n\n\t\tif ( ! path ) return null;\n\n\t\tconst texture = this.textureLoader.load(\n\t\t\tpath,\n\t\t\tundefined,\n\t\t\tundefined,\n\t\t\tfunction () {\n\n\t\t\t\tconsole.warn( 'LWOLoader: non-standard resource hierarchy. Use \\`resourcePath\\` parameter to specify root content directory.' );\n\n\t\t\t}\n\t\t);\n\n\t\treturn texture;\n\n\t}\n\n\t// 0 = Reset, 1 = Repeat, 2 = Mirror, 3 = Edge\n\tgetWrappingType( num ) {\n\n\t\tswitch ( num ) {\n\n\t\t\tcase 0:\n\t\t\t\tconsole.warn( 'LWOLoader: \"Reset\" texture wrapping type is not supported in three.js' );\n\t\t\t\treturn ClampToEdgeWrapping;\n\t\t\tcase 1: return RepeatWrapping;\n\t\t\tcase 2: return MirroredRepeatWrapping;\n\t\t\tcase 3: return ClampToEdgeWrapping;\n\n\t\t}\n\n\t}\n\n\tgetMaterialType( nodeData ) {\n\n\t\tif ( nodeData.Clearcoat && nodeData.Clearcoat.value > 0 ) return MeshPhysicalMaterial;\n\t\tif ( nodeData.Roughness ) return MeshStandardMaterial;\n\t\treturn MeshPhongMaterial;\n\n\t}\n\n}\n\nclass GeometryParser {\n\n\tparse( geoData, layer ) {\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( geoData.points, 3 ) );\n\n\t\tconst indices = this.splitIndices( geoData.vertexIndices, geoData.polygonDimensions );\n\t\tgeometry.setIndex( indices );\n\n\t\tthis.parseGroups( geometry, geoData );\n\n\t\tgeometry.computeVertexNormals();\n\n\t\tthis.parseUVs( geometry, layer );\n\t\tthis.parseMorphTargets( geometry, layer );\n\n\t\t// TODO: z may need to be reversed to account for coordinate system change\n\t\tgeometry.translate( - layer.pivot[ 0 ], - layer.pivot[ 1 ], - layer.pivot[ 2 ] );\n\n\t\t// let userData = geometry.userData;\n\t\t// geometry = geometry.toNonIndexed()\n\t\t// geometry.userData = userData;\n\n\t\treturn geometry;\n\n\t}\n\n\t// split quads into tris\n\tsplitIndices( indices, polygonDimensions ) {\n\n\t\tconst remappedIndices = [];\n\n\t\tlet i = 0;\n\t\tpolygonDimensions.forEach( function ( dim ) {\n\n\t\t\tif ( dim < 4 ) {\n\n\t\t\t\tfor ( let k = 0; k < dim; k ++ ) remappedIndices.push( indices[ i + k ] );\n\n\t\t\t} else if ( dim === 4 ) {\n\n\t\t\t\tremappedIndices.push(\n\t\t\t\t\tindices[ i ],\n\t\t\t\t\tindices[ i + 1 ],\n\t\t\t\t\tindices[ i + 2 ],\n\n\t\t\t\t\tindices[ i ],\n\t\t\t\t\tindices[ i + 2 ],\n\t\t\t\t\tindices[ i + 3 ]\n\n\t\t\t\t);\n\n\t\t\t} else if ( dim > 4 ) {\n\n\t\t\t\tfor ( let k = 1; k < dim - 1; k ++ ) {\n\n\t\t\t\t\tremappedIndices.push( indices[ i ], indices[ i + k ], indices[ i + k + 1 ] );\n\n\t\t\t\t}\n\n\t\t\t\tconsole.warn( 'LWOLoader: polygons with greater than 4 sides are not supported' );\n\n\t\t\t}\n\n\t\t\ti += dim;\n\n\t\t} );\n\n\t\treturn remappedIndices;\n\n\t}\n\n\t// NOTE: currently ignoring poly indices and assuming that they are intelligently ordered\n\tparseGroups( geometry, geoData ) {\n\n\t\tconst tags = _lwoTree.tags;\n\t\tconst matNames = [];\n\n\t\tlet elemSize = 3;\n\t\tif ( geoData.type === 'lines' ) elemSize = 2;\n\t\tif ( geoData.type === 'points' ) elemSize = 1;\n\n\t\tconst remappedIndices = this.splitMaterialIndices( geoData.polygonDimensions, geoData.materialIndices );\n\n\t\tlet indexNum = 0; // create new indices in numerical order\n\t\tconst indexPairs = {}; // original indices mapped to numerical indices\n\n\t\tlet prevMaterialIndex;\n\t\tlet materialIndex;\n\n\t\tlet prevStart = 0;\n\t\tlet currentCount = 0;\n\n\t\tfor ( let i = 0; i < remappedIndices.length; i += 2 ) {\n\n\t\t\tmaterialIndex = remappedIndices[ i + 1 ];\n\n\t\t\tif ( i === 0 ) matNames[ indexNum ] = tags[ materialIndex ];\n\n\t\t\tif ( prevMaterialIndex === undefined ) prevMaterialIndex = materialIndex;\n\n\t\t\tif ( materialIndex !== prevMaterialIndex ) {\n\n\t\t\t\tlet currentIndex;\n\t\t\t\tif ( indexPairs[ tags[ prevMaterialIndex ] ] ) {\n\n\t\t\t\t\tcurrentIndex = indexPairs[ tags[ prevMaterialIndex ] ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcurrentIndex = indexNum;\n\t\t\t\t\tindexPairs[ tags[ prevMaterialIndex ] ] = indexNum;\n\t\t\t\t\tmatNames[ indexNum ] = tags[ prevMaterialIndex ];\n\t\t\t\t\tindexNum ++;\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.addGroup( prevStart, currentCount, currentIndex );\n\n\t\t\t\tprevStart += currentCount;\n\n\t\t\t\tprevMaterialIndex = materialIndex;\n\t\t\t\tcurrentCount = 0;\n\n\t\t\t}\n\n\t\t\tcurrentCount += elemSize;\n\n\t\t}\n\n\t\t// the loop above doesn't add the last group, do that here.\n\t\tif ( geometry.groups.length > 0 ) {\n\n\t\t\tlet currentIndex;\n\t\t\tif ( indexPairs[ tags[ materialIndex ] ] ) {\n\n\t\t\t\tcurrentIndex = indexPairs[ tags[ materialIndex ] ];\n\n\t\t\t} else {\n\n\t\t\t\tcurrentIndex = indexNum;\n\t\t\t\tindexPairs[ tags[ materialIndex ] ] = indexNum;\n\t\t\t\tmatNames[ indexNum ] = tags[ materialIndex ];\n\n\t\t\t}\n\n\t\t\tgeometry.addGroup( prevStart, currentCount, currentIndex );\n\n\t\t}\n\n\t\t// Mat names from TAGS chunk, used to build up an array of materials for this geometry\n\t\tgeometry.userData.matNames = matNames;\n\n\t}\n\n\tsplitMaterialIndices( polygonDimensions, indices ) {\n\n\t\tconst remappedIndices = [];\n\n\t\tpolygonDimensions.forEach( function ( dim, i ) {\n\n\t\t\tif ( dim <= 3 ) {\n\n\t\t\t\tremappedIndices.push( indices[ i * 2 ], indices[ i * 2 + 1 ] );\n\n\t\t\t} else if ( dim === 4 ) {\n\n\t\t\t\tremappedIndices.push( indices[ i * 2 ], indices[ i * 2 + 1 ], indices[ i * 2 ], indices[ i * 2 + 1 ] );\n\n\t\t\t} else {\n\n\t\t\t\t // ignore > 4 for now\n\t\t\t\tfor ( let k = 0; k < dim - 2; k ++ ) {\n\n\t\t\t\t\tremappedIndices.push( indices[ i * 2 ], indices[ i * 2 + 1 ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn remappedIndices;\n\n\t}\n\n\t// UV maps:\n\t// 1: are defined via index into an array of points, not into a geometry\n\t// - the geometry is also defined by an index into this array, but the indexes may not match\n\t// 2: there can be any number of UV maps for a single geometry. Here these are combined,\n\t// \twith preference given to the first map encountered\n\t// 3: UV maps can be partial - that is, defined for only a part of the geometry\n\t// 4: UV maps can be VMAP or VMAD (discontinuous, to allow for seams). In practice, most\n\t// UV maps are defined as partially VMAP and partially VMAD\n\t// VMADs are currently not supported\n\tparseUVs( geometry, layer ) {\n\n\t\t// start by creating a UV map set to zero for the whole geometry\n\t\tconst remappedUVs = Array.from( Array( geometry.attributes.position.count * 2 ), function () {\n\n\t\t\treturn 0;\n\n\t\t} );\n\n\t\tfor ( const name in layer.uvs ) {\n\n\t\t\tconst uvs = layer.uvs[ name ].uvs;\n\t\t\tconst uvIndices = layer.uvs[ name ].uvIndices;\n\n\t\t\tuvIndices.forEach( function ( i, j ) {\n\n\t\t\t\tremappedUVs[ i * 2 ] = uvs[ j * 2 ];\n\t\t\t\tremappedUVs[ i * 2 + 1 ] = uvs[ j * 2 + 1 ];\n\n\t\t\t} );\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'uv', new Float32BufferAttribute( remappedUVs, 2 ) );\n\n\t}\n\n\tparseMorphTargets( geometry, layer ) {\n\n\t\tlet num = 0;\n\t\tfor ( const name in layer.morphTargets ) {\n\n\t\t\tconst remappedPoints = geometry.attributes.position.array.slice();\n\n\t\t\tif ( ! geometry.morphAttributes.position ) geometry.morphAttributes.position = [];\n\n\t\t\tconst morphPoints = layer.morphTargets[ name ].points;\n\t\t\tconst morphIndices = layer.morphTargets[ name ].indices;\n\t\t\tconst type = layer.morphTargets[ name ].type;\n\n\t\t\tmorphIndices.forEach( function ( i, j ) {\n\n\t\t\t\tif ( type === 'relative' ) {\n\n\t\t\t\t\tremappedPoints[ i * 3 ] += morphPoints[ j * 3 ];\n\t\t\t\t\tremappedPoints[ i * 3 + 1 ] += morphPoints[ j * 3 + 1 ];\n\t\t\t\t\tremappedPoints[ i * 3 + 2 ] += morphPoints[ j * 3 + 2 ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tremappedPoints[ i * 3 ] = morphPoints[ j * 3 ];\n\t\t\t\t\tremappedPoints[ i * 3 + 1 ] = morphPoints[ j * 3 + 1 ];\n\t\t\t\t\tremappedPoints[ i * 3 + 2 ] = morphPoints[ j * 3 + 2 ];\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tgeometry.morphAttributes.position[ num ] = new Float32BufferAttribute( remappedPoints, 3 );\n\t\t\tgeometry.morphAttributes.position[ num ].name = name;\n\n\t\t\tnum ++;\n\n\t\t}\n\n\t\tgeometry.morphTargetsRelative = false;\n\n\t}\n\n}\n\n\n// ************** UTILITY FUNCTIONS **************\n\nfunction extractParentUrl( url, dir ) {\n\n\tconst index = url.indexOf( dir );\n\n\tif ( index === - 1 ) return './';\n\n\treturn url.slice( 0, index );\n\n}\n\nexport { LWOLoader };\n", "import {\n\tFileLoader,\n\tLoader,\n\tCanvasTexture,\n\tNearestFilter,\n\tSRGBColorSpace\n} from 'three';\n\nimport lottie from '../libs/lottie_canvas.module.js';\n\n/**\n * A loader for the Lottie texture animation format.\n *\n * The loader returns an instance of {@link CanvasTexture} to represent\n * the animated texture. Two additional properties are added to each texture:\n * - `animation`: The return value of `lottie.loadAnimation()` which is an object\n * with an API for controlling the animation's playback.\n * - `image`: The image container.\n *\n * ```js\n * const loader = new LottieLoader();\n * loader.setQuality( 2 );\n * const texture = await loader.loadAsync( 'textures/lottie/24017-lottie-logo-animation.json' );\n *\n * const geometry = new THREE.BoxGeometry();\n * const material = new THREE.MeshBasicMaterial( { map: texture } );\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n * ```\n *\n * @augments Loader\n * @three_import import { LottieLoader } from 'three/addons/loaders/LottieLoader.js';\n */\nclass LottieLoader extends Loader {\n\n\t/**\n\t * Constructs a new Lottie loader.\n\t *\n\t * @deprecated The loader has been deprecated and will be removed with r186. Use lottie-web instead and create your animated texture manually.\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\tconsole.warn( 'THREE.LottieLoader: The loader has been deprecated and will be removed with r186. Use lottie-web instead and create your animated texture manually.' );\n\n\t}\n\n\t/**\n\t * Sets the texture quality.\n\t *\n\t * @param {number} value - The texture quality.\n\t */\n\tsetQuality( value ) {\n\n\t\tthis._quality = value;\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded Lottie asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(CanvasTexture)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @returns {CanvasTexture} The Lottie texture.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst quality = this._quality || 1;\n\n\t\tconst texture = new CanvasTexture();\n\t\ttexture.minFilter = NearestFilter;\n\t\ttexture.generateMipmaps = false;\n\t\ttexture.colorSpace = SRGBColorSpace;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, function ( text ) {\n\n\t\t\tconst data = JSON.parse( text );\n\n\t\t\t// lottie uses container.offsetWidth and offsetHeight\n\t\t\t// to define width/height\n\n\t\t\tconst container = document.createElement( 'div' );\n\t\t\tcontainer.style.width = data.w + 'px';\n\t\t\tcontainer.style.height = data.h + 'px';\n\t\t\tdocument.body.appendChild( container );\n\n\t\t\tconst animation = lottie.loadAnimation( {\n\t\t\t\tcontainer: container,\n\t\t\t\tanimType: 'canvas',\n\t\t\t\tloop: true,\n\t\t\t\tautoplay: true,\n\t\t\t\tanimationData: data,\n\t\t\t\trendererSettings: { dpr: quality }\n\t\t\t} );\n\n\t\t\ttexture.animation = animation;\n\t\t\ttexture.image = animation.container;\n\n\t\t\tanimation.addEventListener( 'enterFrame', function () {\n\n\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t} );\n\n\t\t\tcontainer.style.display = 'none';\n\n\t\t\tif ( onLoad !== undefined ) {\n\n\t\t\t\tonLoad( texture );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\treturn texture;\n\n\t}\n\n}\n\nexport { LottieLoader };\n", "import {\n\tAnimationClip,\n\tBufferGeometry,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tLoader,\n\tVector3\n} from 'three';\n\nconst _normalData = [\n\t[ - 0.525731, 0.000000, 0.850651 ], [ - 0.442863, 0.238856, 0.864188 ],\n\t[ - 0.295242, 0.000000, 0.955423 ], [ - 0.309017, 0.500000, 0.809017 ],\n\t[ - 0.162460, 0.262866, 0.951056 ], [ 0.000000, 0.000000, 1.000000 ],\n\t[ 0.000000, 0.850651, 0.525731 ], [ - 0.147621, 0.716567, 0.681718 ],\n\t[ 0.147621, 0.716567, 0.681718 ], [ 0.000000, 0.525731, 0.850651 ],\n\t[ 0.309017, 0.500000, 0.809017 ], [ 0.525731, 0.000000, 0.850651 ],\n\t[ 0.295242, 0.000000, 0.955423 ], [ 0.442863, 0.238856, 0.864188 ],\n\t[ 0.162460, 0.262866, 0.951056 ], [ - 0.681718, 0.147621, 0.716567 ],\n\t[ - 0.809017, 0.309017, 0.500000 ], [ - 0.587785, 0.425325, 0.688191 ],\n\t[ - 0.850651, 0.525731, 0.000000 ], [ - 0.864188, 0.442863, 0.238856 ],\n\t[ - 0.716567, 0.681718, 0.147621 ], [ - 0.688191, 0.587785, 0.425325 ],\n\t[ - 0.500000, 0.809017, 0.309017 ], [ - 0.238856, 0.864188, 0.442863 ],\n\t[ - 0.425325, 0.688191, 0.587785 ], [ - 0.716567, 0.681718, - 0.147621 ],\n\t[ - 0.500000, 0.809017, - 0.309017 ], [ - 0.525731, 0.850651, 0.000000 ],\n\t[ 0.000000, 0.850651, - 0.525731 ], [ - 0.238856, 0.864188, - 0.442863 ],\n\t[ 0.000000, 0.955423, - 0.295242 ], [ - 0.262866, 0.951056, - 0.162460 ],\n\t[ 0.000000, 1.000000, 0.000000 ], [ 0.000000, 0.955423, 0.295242 ],\n\t[ - 0.262866, 0.951056, 0.162460 ], [ 0.238856, 0.864188, 0.442863 ],\n\t[ 0.262866, 0.951056, 0.162460 ], [ 0.500000, 0.809017, 0.309017 ],\n\t[ 0.238856, 0.864188, - 0.442863 ], [ 0.262866, 0.951056, - 0.162460 ],\n\t[ 0.500000, 0.809017, - 0.309017 ], [ 0.850651, 0.525731, 0.000000 ],\n\t[ 0.716567, 0.681718, 0.147621 ], [ 0.716567, 0.681718, - 0.147621 ],\n\t[ 0.525731, 0.850651, 0.000000 ], [ 0.425325, 0.688191, 0.587785 ],\n\t[ 0.864188, 0.442863, 0.238856 ], [ 0.688191, 0.587785, 0.425325 ],\n\t[ 0.809017, 0.309017, 0.500000 ], [ 0.681718, 0.147621, 0.716567 ],\n\t[ 0.587785, 0.425325, 0.688191 ], [ 0.955423, 0.295242, 0.000000 ],\n\t[ 1.000000, 0.000000, 0.000000 ], [ 0.951056, 0.162460, 0.262866 ],\n\t[ 0.850651, - 0.525731, 0.000000 ], [ 0.955423, - 0.295242, 0.000000 ],\n\t[ 0.864188, - 0.442863, 0.238856 ], [ 0.951056, - 0.162460, 0.262866 ],\n\t[ 0.809017, - 0.309017, 0.500000 ], [ 0.681718, - 0.147621, 0.716567 ],\n\t[ 0.850651, 0.000000, 0.525731 ], [ 0.864188, 0.442863, - 0.238856 ],\n\t[ 0.809017, 0.309017, - 0.500000 ], [ 0.951056, 0.162460, - 0.262866 ],\n\t[ 0.525731, 0.000000, - 0.850651 ], [ 0.681718, 0.147621, - 0.716567 ],\n\t[ 0.681718, - 0.147621, - 0.716567 ], [ 0.850651, 0.000000, - 0.525731 ],\n\t[ 0.809017, - 0.309017, - 0.500000 ], [ 0.864188, - 0.442863, - 0.238856 ],\n\t[ 0.951056, - 0.162460, - 0.262866 ], [ 0.147621, 0.716567, - 0.681718 ],\n\t[ 0.309017, 0.500000, - 0.809017 ], [ 0.425325, 0.688191, - 0.587785 ],\n\t[ 0.442863, 0.238856, - 0.864188 ], [ 0.587785, 0.425325, - 0.688191 ],\n\t[ 0.688191, 0.587785, - 0.425325 ], [ - 0.147621, 0.716567, - 0.681718 ],\n\t[ - 0.309017, 0.500000, - 0.809017 ], [ 0.000000, 0.525731, - 0.850651 ],\n\t[ - 0.525731, 0.000000, - 0.850651 ], [ - 0.442863, 0.238856, - 0.864188 ],\n\t[ - 0.295242, 0.000000, - 0.955423 ], [ - 0.162460, 0.262866, - 0.951056 ],\n\t[ 0.000000, 0.000000, - 1.000000 ], [ 0.295242, 0.000000, - 0.955423 ],\n\t[ 0.162460, 0.262866, - 0.951056 ], [ - 0.442863, - 0.238856, - 0.864188 ],\n\t[ - 0.309017, - 0.500000, - 0.809017 ], [ - 0.162460, - 0.262866, - 0.951056 ],\n\t[ 0.000000, - 0.850651, - 0.525731 ], [ - 0.147621, - 0.716567, - 0.681718 ],\n\t[ 0.147621, - 0.716567, - 0.681718 ], [ 0.000000, - 0.525731, - 0.850651 ],\n\t[ 0.309017, - 0.500000, - 0.809017 ], [ 0.442863, - 0.238856, - 0.864188 ],\n\t[ 0.162460, - 0.262866, - 0.951056 ], [ 0.238856, - 0.864188, - 0.442863 ],\n\t[ 0.500000, - 0.809017, - 0.309017 ], [ 0.425325, - 0.688191, - 0.587785 ],\n\t[ 0.716567, - 0.681718, - 0.147621 ], [ 0.688191, - 0.587785, - 0.425325 ],\n\t[ 0.587785, - 0.425325, - 0.688191 ], [ 0.000000, - 0.955423, - 0.295242 ],\n\t[ 0.000000, - 1.000000, 0.000000 ], [ 0.262866, - 0.951056, - 0.162460 ],\n\t[ 0.000000, - 0.850651, 0.525731 ], [ 0.000000, - 0.955423, 0.295242 ],\n\t[ 0.238856, - 0.864188, 0.442863 ], [ 0.262866, - 0.951056, 0.162460 ],\n\t[ 0.500000, - 0.809017, 0.309017 ], [ 0.716567, - 0.681718, 0.147621 ],\n\t[ 0.525731, - 0.850651, 0.000000 ], [ - 0.238856, - 0.864188, - 0.442863 ],\n\t[ - 0.500000, - 0.809017, - 0.309017 ], [ - 0.262866, - 0.951056, - 0.162460 ],\n\t[ - 0.850651, - 0.525731, 0.000000 ], [ - 0.716567, - 0.681718, - 0.147621 ],\n\t[ - 0.716567, - 0.681718, 0.147621 ], [ - 0.525731, - 0.850651, 0.000000 ],\n\t[ - 0.500000, - 0.809017, 0.309017 ], [ - 0.238856, - 0.864188, 0.442863 ],\n\t[ - 0.262866, - 0.951056, 0.162460 ], [ - 0.864188, - 0.442863, 0.238856 ],\n\t[ - 0.809017, - 0.309017, 0.500000 ], [ - 0.688191, - 0.587785, 0.425325 ],\n\t[ - 0.681718, - 0.147621, 0.716567 ], [ - 0.442863, - 0.238856, 0.864188 ],\n\t[ - 0.587785, - 0.425325, 0.688191 ], [ - 0.309017, - 0.500000, 0.809017 ],\n\t[ - 0.147621, - 0.716567, 0.681718 ], [ - 0.425325, - 0.688191, 0.587785 ],\n\t[ - 0.162460, - 0.262866, 0.951056 ], [ 0.442863, - 0.238856, 0.864188 ],\n\t[ 0.162460, - 0.262866, 0.951056 ], [ 0.309017, - 0.500000, 0.809017 ],\n\t[ 0.147621, - 0.716567, 0.681718 ], [ 0.000000, - 0.525731, 0.850651 ],\n\t[ 0.425325, - 0.688191, 0.587785 ], [ 0.587785, - 0.425325, 0.688191 ],\n\t[ 0.688191, - 0.587785, 0.425325 ], [ - 0.955423, 0.295242, 0.000000 ],\n\t[ - 0.951056, 0.162460, 0.262866 ], [ - 1.000000, 0.000000, 0.000000 ],\n\t[ - 0.850651, 0.000000, 0.525731 ], [ - 0.955423, - 0.295242, 0.000000 ],\n\t[ - 0.951056, - 0.162460, 0.262866 ], [ - 0.864188, 0.442863, - 0.238856 ],\n\t[ - 0.951056, 0.162460, - 0.262866 ], [ - 0.809017, 0.309017, - 0.500000 ],\n\t[ - 0.864188, - 0.442863, - 0.238856 ], [ - 0.951056, - 0.162460, - 0.262866 ],\n\t[ - 0.809017, - 0.309017, - 0.500000 ], [ - 0.681718, 0.147621, - 0.716567 ],\n\t[ - 0.681718, - 0.147621, - 0.716567 ], [ - 0.850651, 0.000000, - 0.525731 ],\n\t[ - 0.688191, 0.587785, - 0.425325 ], [ - 0.587785, 0.425325, - 0.688191 ],\n\t[ - 0.425325, 0.688191, - 0.587785 ], [ - 0.425325, - 0.688191, - 0.587785 ],\n\t[ - 0.587785, - 0.425325, - 0.688191 ], [ - 0.688191, - 0.587785, - 0.425325 ]\n];\n\n/**\n * A loader for the MD2 format.\n *\n * The loader represents the animations of the MD2 asset as an array of animation\n * clips and stores them in the `animations` property of the geometry.\n *\n * ```js\n * const loader = new MD2Loader();\n * const geometry = await loader.loadAsync( './models/md2/ogro/ogro.md2' );\n *\n * const animations = geometry.animations;\n * ```\n *\n * @augments Loader\n * @three_import import { MD2Loader } from 'three/addons/loaders/MD2Loader.js';\n */\nclass MD2Loader extends Loader {\n\n\t/**\n\t * Constructs a new MD2 loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded MD2 asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(BufferGeometry)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} [onProgress] - Executed while the loading is in progress.\n\t * @param {onErrorCallback} [onError] - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( buffer ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given MD2 data and returns a geometry.\n\t *\n\t * @param {ArrayBuffer} buffer - The raw MD2 data as an array buffer.\n\t * @return {BufferGeometry} The parsed geometry data.\n\t */\n\tparse( buffer ) {\n\n\t\tconst data = new DataView( buffer );\n\n\t\t// http://tfc.duke.free.fr/coding/md2-specs-en.html\n\n\t\tconst header = {};\n\t\tconst headerNames = [\n\t\t\t'ident', 'version',\n\t\t\t'skinwidth', 'skinheight',\n\t\t\t'framesize',\n\t\t\t'num_skins', 'num_vertices', 'num_st', 'num_tris', 'num_glcmds', 'num_frames',\n\t\t\t'offset_skins', 'offset_st', 'offset_tris', 'offset_frames', 'offset_glcmds', 'offset_end'\n\t\t];\n\n\t\tfor ( let i = 0; i < headerNames.length; i ++ ) {\n\n\t\t\theader[ headerNames[ i ] ] = data.getInt32( i * 4, true );\n\n\t\t}\n\n\t\tif ( header.ident !== 844121161 || header.version !== 8 ) {\n\n\t\t\tconsole.error( 'Not a valid MD2 file' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( header.offset_end !== data.byteLength ) {\n\n\t\t\tconsole.error( 'Corrupted MD2 file' );\n\t\t\treturn;\n\n\t\t}\n\n\t\t//\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\t// uvs\n\n\t\tconst uvsTemp = [];\n\t\tlet offset = header.offset_st;\n\n\t\tfor ( let i = 0, l = header.num_st; i < l; i ++ ) {\n\n\t\t\tconst u = data.getInt16( offset + 0, true );\n\t\t\tconst v = data.getInt16( offset + 2, true );\n\n\t\t\tuvsTemp.push( u / header.skinwidth, 1 - ( v / header.skinheight ) );\n\n\t\t\toffset += 4;\n\n\t\t}\n\n\t\t// triangles\n\n\t\toffset = header.offset_tris;\n\n\t\tconst vertexIndices = [];\n\t\tconst uvIndices = [];\n\n\t\tfor ( let i = 0, l = header.num_tris; i < l; i ++ ) {\n\n\t\t\tvertexIndices.push(\n\t\t\t\tdata.getUint16( offset + 0, true ),\n\t\t\t\tdata.getUint16( offset + 2, true ),\n\t\t\t\tdata.getUint16( offset + 4, true )\n\t\t\t);\n\n\t\t\tuvIndices.push(\n\t\t\t\tdata.getUint16( offset + 6, true ),\n\t\t\t\tdata.getUint16( offset + 8, true ),\n\t\t\t\tdata.getUint16( offset + 10, true )\n\t\t\t);\n\n\t\t\toffset += 12;\n\n\t\t}\n\n\t\t// frames\n\n\t\tconst translation = new Vector3();\n\t\tconst scale = new Vector3();\n\n\t\tconst frames = [];\n\n\t\toffset = header.offset_frames;\n\n\t\tfor ( let i = 0, l = header.num_frames; i < l; i ++ ) {\n\n\t\t\tscale.set(\n\t\t\t\tdata.getFloat32( offset + 0, true ),\n\t\t\t\tdata.getFloat32( offset + 4, true ),\n\t\t\t\tdata.getFloat32( offset + 8, true )\n\t\t\t);\n\n\t\t\ttranslation.set(\n\t\t\t\tdata.getFloat32( offset + 12, true ),\n\t\t\t\tdata.getFloat32( offset + 16, true ),\n\t\t\t\tdata.getFloat32( offset + 20, true )\n\t\t\t);\n\n\t\t\toffset += 24;\n\n\t\t\tconst string = [];\n\n\t\t\tfor ( let j = 0; j < 16; j ++ ) {\n\n\t\t\t\tconst character = data.getUint8( offset + j );\n\t\t\t\tif ( character === 0 ) break;\n\n\t\t\t\tstring[ j ] = character;\n\n\t\t\t}\n\n\t\t\tconst frame = {\n\t\t\t\tname: String.fromCharCode.apply( null, string ),\n\t\t\t\tvertices: [],\n\t\t\t\tnormals: []\n\t\t\t};\n\n\t\t\toffset += 16;\n\n\t\t\tfor ( let j = 0; j < header.num_vertices; j ++ ) {\n\n\t\t\t\tlet x = data.getUint8( offset ++ );\n\t\t\t\tlet y = data.getUint8( offset ++ );\n\t\t\t\tlet z = data.getUint8( offset ++ );\n\t\t\t\tconst n = _normalData[ data.getUint8( offset ++ ) ];\n\n\t\t\t\tx = x * scale.x + translation.x;\n\t\t\t\ty = y * scale.y + translation.y;\n\t\t\t\tz = z * scale.z + translation.z;\n\n\t\t\t\tframe.vertices.push( x, z, y ); // convert to Y-up\n\t\t\t\tframe.normals.push( n[ 0 ], n[ 2 ], n[ 1 ] ); // convert to Y-up\n\n\t\t\t}\n\n\t\t\tframes.push( frame );\n\n\t\t}\n\n\t\t// static\n\n\t\tconst positions = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tconst verticesTemp = frames[ 0 ].vertices;\n\t\tconst normalsTemp = frames[ 0 ].normals;\n\n\t\tfor ( let i = 0, l = vertexIndices.length; i < l; i ++ ) {\n\n\t\t\tconst vertexIndex = vertexIndices[ i ];\n\t\t\tlet stride = vertexIndex * 3;\n\n\t\t\t//\n\n\t\t\tconst x = verticesTemp[ stride ];\n\t\t\tconst y = verticesTemp[ stride + 1 ];\n\t\t\tconst z = verticesTemp[ stride + 2 ];\n\n\t\t\tpositions.push( x, y, z );\n\n\t\t\t//\n\n\t\t\tconst nx = normalsTemp[ stride ];\n\t\t\tconst ny = normalsTemp[ stride + 1 ];\n\t\t\tconst nz = normalsTemp[ stride + 2 ];\n\n\t\t\tnormals.push( nx, ny, nz );\n\n\t\t\t//\n\n\t\t\tconst uvIndex = uvIndices[ i ];\n\t\t\tstride = uvIndex * 2;\n\n\t\t\tconst u = uvsTemp[ stride ];\n\t\t\tconst v = uvsTemp[ stride + 1 ];\n\n\t\t\tuvs.push( u, v );\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\t\tgeometry.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tgeometry.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\t// animation\n\n\t\tconst morphPositions = [];\n\t\tconst morphNormals = [];\n\n\t\tfor ( let i = 0, l = frames.length; i < l; i ++ ) {\n\n\t\t\tconst frame = frames[ i ];\n\t\t\tconst attributeName = frame.name;\n\n\t\t\tif ( frame.vertices.length > 0 ) {\n\n\t\t\t\tconst positions = [];\n\n\t\t\t\tfor ( let j = 0, jl = vertexIndices.length; j < jl; j ++ ) {\n\n\t\t\t\t\tconst vertexIndex = vertexIndices[ j ];\n\t\t\t\t\tconst stride = vertexIndex * 3;\n\n\t\t\t\t\tconst x = frame.vertices[ stride ];\n\t\t\t\t\tconst y = frame.vertices[ stride + 1 ];\n\t\t\t\t\tconst z = frame.vertices[ stride + 2 ];\n\n\t\t\t\t\tpositions.push( x, y, z );\n\n\t\t\t\t}\n\n\t\t\t\tconst positionAttribute = new Float32BufferAttribute( positions, 3 );\n\t\t\t\tpositionAttribute.name = attributeName;\n\n\t\t\t\tmorphPositions.push( positionAttribute );\n\n\t\t\t}\n\n\t\t\tif ( frame.normals.length > 0 ) {\n\n\t\t\t\tconst normals = [];\n\n\t\t\t\tfor ( let j = 0, jl = vertexIndices.length; j < jl; j ++ ) {\n\n\t\t\t\t\tconst vertexIndex = vertexIndices[ j ];\n\t\t\t\t\tconst stride = vertexIndex * 3;\n\n\t\t\t\t\tconst nx = frame.normals[ stride ];\n\t\t\t\t\tconst ny = frame.normals[ stride + 1 ];\n\t\t\t\t\tconst nz = frame.normals[ stride + 2 ];\n\n\t\t\t\t\tnormals.push( nx, ny, nz );\n\n\t\t\t\t}\n\n\t\t\t\tconst normalAttribute = new Float32BufferAttribute( normals, 3 );\n\t\t\t\tnormalAttribute.name = attributeName;\n\n\t\t\t\tmorphNormals.push( normalAttribute );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.morphAttributes.position = morphPositions;\n\t\tgeometry.morphAttributes.normal = morphNormals;\n\t\tgeometry.morphTargetsRelative = false;\n\n\t\tgeometry.animations = AnimationClip.CreateClipsFromMorphTargetSequences( frames, 10, false );\n\n\t\treturn geometry;\n\n\t}\n\n}\n\nexport { MD2Loader };\n", "import {\n\tAnimationClip,\n\tBufferAttribute,\n\tFileLoader,\n\tLoader,\n\tNumberKeyframeTrack\n} from 'three';\n\n/**\n * A loader for the MDD format.\n *\n * MDD stores a position for every vertex in a model for every frame in an animation.\n * Similar to BVH, it can be used to transfer animation data between different 3D applications or engines.\n *\n * MDD stores its data in binary format (big endian) in the following way:\n *\n * - number of frames (a single uint32)\n * - number of vertices (a single uint32)\n * - time values for each frame (sequence of float32)\n * - vertex data for each frame (sequence of float32)\n *\n * ```js\n * const loader = new MDDLoader();\n * const result = await loader.loadAsync( 'models/mdd/cube.mdd' );\n *\n * const morphTargets = result.morphTargets;\n * const clip = result.clip;\n * // clip.optimize(); // optional\n *\n * const geometry = new THREE.BoxGeometry();\n * geometry.morphAttributes.position = morphTargets; // apply morph targets (vertex data must match)\n *\n * const material = new THREE.MeshBasicMaterial();\n *\n * const mesh = new THREE.Mesh( geometry, material );\n * scene.add( mesh );\n *\n * const mixer = new THREE.AnimationMixer( mesh );\n * mixer.clipAction( clip ).play();\n * ```\n *\n * @augments Loader\n * @three_import import { MDDLoader } from 'three/addons/loaders/MDDLoader.js';\n */\nclass MDDLoader extends Loader {\n\n\t/**\n\t * Constructs a new MDD loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded MDD asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function({clip:AnimationClip, morphTargets:Array<BufferAttribute>})} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.load( url, function ( data ) {\n\n\t\t\tonLoad( scope.parse( data ) );\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given MDD data and returns an object holding the animation clip and the respective\n\t * morph targets.\n\t *\n\t * @param {ArrayBuffer} data - The raw XYZ data as an array buffer.\n\t * @return {{clip:AnimationClip, morphTargets:Array<BufferAttribute>}} The result object.\n\t */\n\tparse( data ) {\n\n\t\tconst view = new DataView( data );\n\n\t\tconst totalFrames = view.getUint32( 0 );\n\t\tconst totalPoints = view.getUint32( 4 );\n\n\t\tlet offset = 8;\n\n\t\t// animation clip\n\n\t\tconst times = new Float32Array( totalFrames );\n\t\tconst values = new Float32Array( totalFrames * totalFrames ).fill( 0 );\n\n\t\tfor ( let i = 0; i < totalFrames; i ++ ) {\n\n\t\t\ttimes[ i ] = view.getFloat32( offset ); offset += 4;\n\t\t\tvalues[ ( totalFrames * i ) + i ] = 1;\n\n\t\t}\n\n\t\tconst track = new NumberKeyframeTrack( '.morphTargetInfluences', times, values );\n\t\tconst clip = new AnimationClip( 'default', times[ times.length - 1 ], [ track ] );\n\n\t\t// morph targets\n\n\t\tconst morphTargets = [];\n\n\t\tfor ( let i = 0; i < totalFrames; i ++ ) {\n\n\t\t\tconst morphTarget = new Float32Array( totalPoints * 3 );\n\n\t\t\tfor ( let j = 0; j < totalPoints; j ++ ) {\n\n\t\t\t\tconst stride = ( j * 3 );\n\n\t\t\t\tmorphTarget[ stride + 0 ] = view.getFloat32( offset ); offset += 4; // x\n\t\t\t\tmorphTarget[ stride + 1 ] = view.getFloat32( offset ); offset += 4; // y\n\t\t\t\tmorphTarget[ stride + 2 ] = view.getFloat32( offset ); offset += 4; // z\n\n\t\t\t}\n\n\t\t\tconst attribute = new BufferAttribute( morphTarget, 3 );\n\t\t\tattribute.name = 'morph_' + i;\n\n\t\t\tmorphTargets.push( attribute );\n\n\t\t}\n\n\t\treturn {\n\t\t\tmorphTargets: morphTargets,\n\t\t\tclip: clip\n\t\t};\n\n\t}\n\n}\n\nexport { MDDLoader };\n", "import {\n\tColor,\n\tColorManagement,\n\tDefaultLoadingManager,\n\tFileLoader,\n\tFrontSide,\n\tLoader,\n\tLoaderUtils,\n\tMeshPhongMaterial,\n\tRepeatWrapping,\n\tTextureLoader,\n\tVector2,\n\tSRGBColorSpace\n} from 'three';\n\n/**\n * A loader for the MTL format.\n *\n * The Material Template Library format (MTL) or .MTL File Format is a companion file format\n * to OBJ that describes surface shading (material) properties of objects within one or more\n * OBJ files.\n *\n * ```js\n * const loader = new MTLLoader();\n * const materials = await loader.loadAsync( 'models/obj/male02/male02.mtl' );\n *\n * const objLoader = new OBJLoader();\n * objLoader.setMaterials( materials );\n * ```\n *\n * @augments Loader\n * @three_import import { MTLLoader } from 'three/addons/loaders/MTLLoader.js';\n */\nclass MTLLoader extends Loader {\n\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded MTL asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(MaterialCreator)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( text, path ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Sets the material options.\n\t *\n\t * @param {MTLLoader~MaterialOptions} value - The material options.\n\t * @return {MTLLoader} A reference to this loader.\n\t */\n\tsetMaterialOptions( value ) {\n\n\t\tthis.materialOptions = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Parses the given MTL data and returns the resulting material creator.\n\t *\n\t * @param {string} text - The raw MTL data as a string.\n\t * @param {string} path - The URL base path.\n\t * @return {MaterialCreator} The material creator.\n\t */\n\tparse( text, path ) {\n\n\t\tconst lines = text.split( '\\n' );\n\t\tlet info = {};\n\t\tconst delimiter_pattern = /\\s+/;\n\t\tconst materialsInfo = {};\n\n\t\tfor ( let i = 0; i < lines.length; i ++ ) {\n\n\t\t\tlet line = lines[ i ];\n\t\t\tline = line.trim();\n\n\t\t\tif ( line.length === 0 || line.charAt( 0 ) === '#' ) {\n\n\t\t\t\t// Blank line or comment ignore\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst pos = line.indexOf( ' ' );\n\n\t\t\tlet key = ( pos >= 0 ) ? line.substring( 0, pos ) : line;\n\t\t\tkey = key.toLowerCase();\n\n\t\t\tlet value = ( pos >= 0 ) ? line.substring( pos + 1 ) : '';\n\t\t\tvalue = value.trim();\n\n\t\t\tif ( key === 'newmtl' ) {\n\n\t\t\t\t// New material\n\n\t\t\t\tinfo = { name: value };\n\t\t\t\tmaterialsInfo[ value ] = info;\n\n\t\t\t} else {\n\n\t\t\t\tif ( key === 'ka' || key === 'kd' || key === 'ks' || key === 'ke' ) {\n\n\t\t\t\t\tconst ss = value.split( delimiter_pattern, 3 );\n\t\t\t\t\tinfo[ key ] = [ parseFloat( ss[ 0 ] ), parseFloat( ss[ 1 ] ), parseFloat( ss[ 2 ] ) ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tinfo[ key ] = value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst materialCreator = new MaterialCreator( this.resourcePath || path, this.materialOptions );\n\t\tmaterialCreator.setCrossOrigin( this.crossOrigin );\n\t\tmaterialCreator.setManager( this.manager );\n\t\tmaterialCreator.setMaterials( materialsInfo );\n\t\treturn materialCreator;\n\n\t}\n\n}\n\n/**\n * Material options of `MTLLoader`.\n *\n * @typedef {Object} MTLLoader~MaterialOptions\n * @property {(FrontSide|BackSide|DoubleSide)} [side=FrontSide] - Which side to apply the material.\n * @property {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)} [wrap=RepeatWrapping] - What type of wrapping to apply for textures.\n * @property {boolean} [normalizeRGB=false] - Whether RGB colors should be normalized to `0-1` from `0-255`.\n * @property {boolean} [ignoreZeroRGBs=false] - Ignore values of RGBs (Ka,Kd,Ks) that are all 0's.\n */\n\nclass MaterialCreator {\n\n\tconstructor( baseUrl = '', options = {} ) {\n\n\t\tthis.baseUrl = baseUrl;\n\t\tthis.options = options;\n\t\tthis.materialsInfo = {};\n\t\tthis.materials = {};\n\t\tthis.materialsArray = [];\n\t\tthis.nameLookup = {};\n\n\t\tthis.crossOrigin = 'anonymous';\n\n\t\tthis.side = ( this.options.side !== undefined ) ? this.options.side : FrontSide;\n\t\tthis.wrap = ( this.options.wrap !== undefined ) ? this.options.wrap : RepeatWrapping;\n\n\t}\n\n\tsetCrossOrigin( value ) {\n\n\t\tthis.crossOrigin = value;\n\t\treturn this;\n\n\t}\n\n\tsetManager( value ) {\n\n\t\tthis.manager = value;\n\n\t}\n\n\tsetMaterials( materialsInfo ) {\n\n\t\tthis.materialsInfo = this.convert( materialsInfo );\n\t\tthis.materials = {};\n\t\tthis.materialsArray = [];\n\t\tthis.nameLookup = {};\n\n\t}\n\n\tconvert( materialsInfo ) {\n\n\t\tif ( ! this.options ) return materialsInfo;\n\n\t\tconst converted = {};\n\n\t\tfor ( const mn in materialsInfo ) {\n\n\t\t\t// Convert materials info into normalized form based on options\n\n\t\t\tconst mat = materialsInfo[ mn ];\n\n\t\t\tconst covmat = {};\n\n\t\t\tconverted[ mn ] = covmat;\n\n\t\t\tfor ( const prop in mat ) {\n\n\t\t\t\tlet save = true;\n\t\t\t\tlet value = mat[ prop ];\n\t\t\t\tconst lprop = prop.toLowerCase();\n\n\t\t\t\tswitch ( lprop ) {\n\n\t\t\t\t\tcase 'kd':\n\t\t\t\t\tcase 'ka':\n\t\t\t\t\tcase 'ks':\n\n\t\t\t\t\t\t// Diffuse color (color under white light) using RGB values\n\n\t\t\t\t\t\tif ( this.options && this.options.normalizeRGB ) {\n\n\t\t\t\t\t\t\tvalue = [ value[ 0 ] / 255, value[ 1 ] / 255, value[ 2 ] / 255 ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( this.options && this.options.ignoreZeroRGBs ) {\n\n\t\t\t\t\t\t\tif ( value[ 0 ] === 0 && value[ 1 ] === 0 && value[ 2 ] === 0 ) {\n\n\t\t\t\t\t\t\t\t// ignore\n\n\t\t\t\t\t\t\t\tsave = false;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tif ( save ) {\n\n\t\t\t\t\tcovmat[ lprop ] = value;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn converted;\n\n\t}\n\n\tpreload() {\n\n\t\tfor ( const mn in this.materialsInfo ) {\n\n\t\t\tthis.create( mn );\n\n\t\t}\n\n\t}\n\n\tgetIndex( materialName ) {\n\n\t\treturn this.nameLookup[ materialName ];\n\n\t}\n\n\tgetAsArray() {\n\n\t\tlet index = 0;\n\n\t\tfor ( const mn in this.materialsInfo ) {\n\n\t\t\tthis.materialsArray[ index ] = this.create( mn );\n\t\t\tthis.nameLookup[ mn ] = index;\n\t\t\tindex ++;\n\n\t\t}\n\n\t\treturn this.materialsArray;\n\n\t}\n\n\tcreate( materialName ) {\n\n\t\tif ( this.materials[ materialName ] === undefined ) {\n\n\t\t\tthis.createMaterial_( materialName );\n\n\t\t}\n\n\t\treturn this.materials[ materialName ];\n\n\t}\n\n\tcreateMaterial_( materialName ) {\n\n\t\t// Create material\n\n\t\tconst scope = this;\n\t\tconst mat = this.materialsInfo[ materialName ];\n\t\tconst params = {\n\n\t\t\tname: materialName,\n\t\t\tside: this.side\n\n\t\t};\n\n\t\tfunction resolveURL( baseUrl, url ) {\n\n\t\t\tif ( typeof url !== 'string' || url === '' )\n\t\t\t\treturn '';\n\n\t\t\t// Absolute URL\n\t\t\tif ( /^https?:\\/\\//i.test( url ) ) return url;\n\n\t\t\treturn baseUrl + url;\n\n\t\t}\n\n\t\tfunction setMapForType( mapType, value ) {\n\n\t\t\tif ( params[ mapType ] ) return; // Keep the first encountered texture\n\n\t\t\tconst texParams = scope.getTextureParams( value, params );\n\t\t\tconst map = scope.loadTexture( resolveURL( scope.baseUrl, texParams.url ) );\n\n\t\t\tmap.repeat.copy( texParams.scale );\n\t\t\tmap.offset.copy( texParams.offset );\n\n\t\t\tmap.wrapS = scope.wrap;\n\t\t\tmap.wrapT = scope.wrap;\n\n\t\t\tif ( mapType === 'map' || mapType === 'emissiveMap' ) {\n\n\t\t\t\tmap.colorSpace = SRGBColorSpace;\n\n\t\t\t}\n\n\t\t\tparams[ mapType ] = map;\n\n\t\t}\n\n\t\tfor ( const prop in mat ) {\n\n\t\t\tconst value = mat[ prop ];\n\t\t\tlet n;\n\n\t\t\tif ( value === '' ) continue;\n\n\t\t\tswitch ( prop.toLowerCase() ) {\n\n\t\t\t\t// Ns is material specular exponent\n\n\t\t\t\tcase 'kd':\n\n\t\t\t\t\t// Diffuse color (color under white light) using RGB values\n\n\t\t\t\t\tparams.color = ColorManagement.colorSpaceToWorking( new Color().fromArray( value ), SRGBColorSpace );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ks':\n\n\t\t\t\t\t// Specular color (color when light is reflected from shiny surface) using RGB values\n\t\t\t\t\tparams.specular = ColorManagement.colorSpaceToWorking( new Color().fromArray( value ), SRGBColorSpace );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ke':\n\n\t\t\t\t\t// Emissive using RGB values\n\t\t\t\t\tparams.emissive = ColorManagement.colorSpaceToWorking( new Color().fromArray( value ), SRGBColorSpace );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'map_kd':\n\n\t\t\t\t\t// Diffuse texture map\n\n\t\t\t\t\tsetMapForType( 'map', value );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'map_ks':\n\n\t\t\t\t\t// Specular map\n\n\t\t\t\t\tsetMapForType( 'specularMap', value );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'map_ke':\n\n\t\t\t\t\t// Emissive map\n\n\t\t\t\t\tsetMapForType( 'emissiveMap', value );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'norm':\n\n\t\t\t\t\tsetMapForType( 'normalMap', value );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'map_bump':\n\t\t\t\tcase 'bump':\n\n\t\t\t\t\t// Bump texture map\n\n\t\t\t\t\tsetMapForType( 'bumpMap', value );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'disp':\n\n\t\t\t\t\t// Displacement texture map\n\n\t\t\t\t\tsetMapForType( 'displacementMap', value );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'map_d':\n\n\t\t\t\t\t// Alpha map\n\n\t\t\t\t\tsetMapForType( 'alphaMap', value );\n\t\t\t\t\tparams.transparent = true;\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ns':\n\n\t\t\t\t\t// The specular exponent (defines the focus of the specular highlight)\n\t\t\t\t\t// A high exponent results in a tight, concentrated highlight. Ns values normally range from 0 to 1000.\n\n\t\t\t\t\tparams.shininess = parseFloat( value );\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'd':\n\t\t\t\t\tn = parseFloat( value );\n\n\t\t\t\t\tif ( n < 1 ) {\n\n\t\t\t\t\t\tparams.opacity = n;\n\t\t\t\t\t\tparams.transparent = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'tr':\n\t\t\t\t\tn = parseFloat( value );\n\n\t\t\t\t\tif ( this.options && this.options.invertTrProperty ) n = 1 - n;\n\n\t\t\t\t\tif ( n > 0 ) {\n\n\t\t\t\t\t\tparams.opacity = 1 - n;\n\t\t\t\t\t\tparams.transparent = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.materials[ materialName ] = new MeshPhongMaterial( params );\n\t\treturn this.materials[ materialName ];\n\n\t}\n\n\tgetTextureParams( value, matParams ) {\n\n\t\tconst texParams = {\n\n\t\t\tscale: new Vector2( 1, 1 ),\n\t\t\toffset: new Vector2( 0, 0 )\n\n\t\t };\n\n\t\tconst items = value.split( /\\s+/ );\n\t\tlet pos;\n\n\t\tpos = items.indexOf( '-bm' );\n\n\t\tif ( pos >= 0 ) {\n\n\t\t\tmatParams.bumpScale = parseFloat( items[ pos + 1 ] );\n\t\t\titems.splice( pos, 2 );\n\n\t\t}\n\n\t\tpos = items.indexOf( '-mm' );\n\n\t\tif ( pos >= 0 ) {\n\n\t\t\tmatParams.displacementBias = parseFloat( items[ pos + 1 ] );\n\t\t\tmatParams.displacementScale = parseFloat( items[ pos + 2 ] );\n\t\t\titems.splice( pos, 3 );\n\n\t\t}\n\n\t\tpos = items.indexOf( '-s' );\n\n\t\tif ( pos >= 0 ) {\n\n\t\t\ttexParams.scale.set( parseFloat( items[ pos + 1 ] ), parseFloat( items[ pos + 2 ] ) );\n\t\t\titems.splice( pos, 4 ); // we expect 3 parameters here!\n\n\t\t}\n\n\t\tpos = items.indexOf( '-o' );\n\n\t\tif ( pos >= 0 ) {\n\n\t\t\ttexParams.offset.set( parseFloat( items[ pos + 1 ] ), parseFloat( items[ pos + 2 ] ) );\n\t\t\titems.splice( pos, 4 ); // we expect 3 parameters here!\n\n\t\t}\n\n\t\ttexParams.url = items.join( ' ' ).trim();\n\t\treturn texParams;\n\n\t}\n\n\tloadTexture( url, mapping, onLoad, onProgress, onError ) {\n\n\t\tconst manager = ( this.manager !== undefined ) ? this.manager : DefaultLoadingManager;\n\t\tlet loader = manager.getHandler( url );\n\n\t\tif ( loader === null ) {\n\n\t\t\tloader = new TextureLoader( manager );\n\n\t\t}\n\n\t\tif ( loader.setCrossOrigin ) loader.setCrossOrigin( this.crossOrigin );\n\n\t\tconst texture = loader.load( url, onLoad, onProgress, onError );\n\n\t\tif ( mapping !== undefined ) texture.mapping = mapping;\n\n\t\treturn texture;\n\n\t}\n\n}\n\nexport { MTLLoader };\n", "import {\n\tClampToEdgeWrapping,\n\tDoubleSide,\n\tLinearFilter,\n\tMesh,\n\tMeshBasicMaterial,\n\tPlaneGeometry,\n\tTexture,\n\tSRGBColorSpace\n} from 'three';\n\n/**\n * This class has been made to hold a slice of a volume data.\n *\n * @see {@link Volume}\n * @three_import import { VolumeSlice } from 'three/addons/misc/VolumeSlice.js';\n */\nclass VolumeSlice {\n\n\t/**\n\t * Constructs a new volume slice.\n\t *\n \t * @param {Volume} volume - The associated volume.\n \t * @param {number} [index=0] - The index of the slice.\n \t * @param {('x'|'y'|'z')} [axis='z'] - For now only 'x', 'y' or 'z' but later it will change to a normal vector.\n\t */\n\tconstructor( volume, index = 0, axis = 'z' ) {\n\n\t\tconst slice = this;\n\n\t\t/**\n\t\t * The associated volume.\n\t\t *\n\t\t * @type {Volume}\n\t\t */\n\t\tthis.volume = volume;\n\n\t\tObject.defineProperty( this, 'index', {\n\t\t\tget: function () {\n\n\t\t\t\treturn index;\n\n\t\t\t},\n\t\t\t/**\n\t\t\t * The index of the slice, if changed, will automatically call updateGeometry at the next repaint.\n\t\t\t *\n\t\t\t * @name VolumeSlice#index\n\t\t\t * @type {number}\n\t\t\t * @default 0\n\t\t\t * @param {number} value\n\t\t\t * @return {number}\n\t\t\t */\n\t\t\tset: function ( value ) {\n\n\t\t\t\tindex = value;\n\t\t\t\tslice.geometryNeedsUpdate = true;\n\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * The normal axis.\n\t\t *\n\t\t * @type {('x'|'y'|'z')}\n\t\t */\n\t\tthis.axis = axis;\n\n\t\t/**\n\t\t * The final canvas used for the texture.\n\t\t *\n\t\t * @type {HTMLCanvasElement}\n\t\t */\n\t\tthis.canvas = document.createElement( 'canvas' );\n\n\t\t/**\n\t\t * The rendering context of the canvas.\n\t\t *\n\t\t * @type {CanvasRenderingContext2D}\n\t\t */\n\t\tthis.ctx;\n\n\t\t/**\n\t\t * The intermediary canvas used to paint the data.\n\t\t *\n\t\t * @type {HTMLCanvasElement}\n\t\t */\n\t\tthis.canvasBuffer = document.createElement( 'canvas' );\n\n\t\t/**\n\t\t * The rendering context of the canvas buffer,\n\t\t *\n\t\t * @type {CanvasRenderingContext2D}\n\t\t */\n\t\tthis.ctxBuffer;\n\n\t\tthis.updateGeometry();\n\n\n\t\tconst canvasMap = new Texture( this.canvas );\n\t\tcanvasMap.minFilter = LinearFilter;\n\t\tcanvasMap.generateMipmaps = false;\n\t\tcanvasMap.wrapS = canvasMap.wrapT = ClampToEdgeWrapping;\n\t\tcanvasMap.colorSpace = SRGBColorSpace;\n\t\tconst material = new MeshBasicMaterial( { map: canvasMap, side: DoubleSide, transparent: true } );\n\n\t\t/**\n\t\t * The mesh ready to get used in the scene.\n\t\t *\n\t\t * @type {Mesh}\n\t\t */\n\t\tthis.mesh = new Mesh( this.geometry, material );\n\t\tthis.mesh.matrixAutoUpdate = false;\n\n\t\t/**\n\t\t * If set to `true`, `updateGeometry()` will be triggered at the next repaint.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.geometryNeedsUpdate = true;\n\t\tthis.repaint();\n\n\t\t/**\n\t\t * Width of slice in the original coordinate system, corresponds to the width of the buffer canvas.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.iLength = 0;\n\n\t\t/**\n\t\t * Height of slice in the original coordinate system, corresponds to the height of the buffer canvas.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.jLength = 0;\n\n\t\t/**\n\t\t * Function that allow the slice to access right data.\n\t\t *\n\t\t * @type {?Function}\n\t\t * @see {@link Volume#extractPerpendicularPlane}\n\t\t */\n\t\tthis.sliceAccess = null;\n\n\t}\n\n\t/**\n\t * Refresh the texture and the geometry if geometryNeedsUpdate is set to `true`.\n\t */\n\trepaint() {\n\n\t\tif ( this.geometryNeedsUpdate ) {\n\n\t\t\tthis.updateGeometry();\n\n\t\t}\n\n\t\tconst iLength = this.iLength,\n\t\t\tjLength = this.jLength,\n\t\t\tsliceAccess = this.sliceAccess,\n\t\t\tvolume = this.volume,\n\t\t\tcanvas = this.canvasBuffer,\n\t\t\tctx = this.ctxBuffer;\n\n\n\t\t// get the imageData and pixel array from the canvas\n\t\tconst imgData = ctx.getImageData( 0, 0, iLength, jLength );\n\t\tconst data = imgData.data;\n\t\tconst volumeData = volume.data;\n\t\tconst upperThreshold = volume.upperThreshold;\n\t\tconst lowerThreshold = volume.lowerThreshold;\n\t\tconst windowLow = volume.windowLow;\n\t\tconst windowHigh = volume.windowHigh;\n\n\t\t// manipulate some pixel elements\n\t\tlet pixelCount = 0;\n\n\t\tif ( volume.dataType === 'label' ) {\n\n\t\t\tconsole.error( 'THREE.VolumeSlice.repaint: label are not supported yet' );\n\n\t\t\t// This part is currently useless but will be used when colortables will be handled\n\n\t\t\t// for ( let j = 0; j < jLength; j ++ ) {\n\n\t\t\t// \tfor ( let i = 0; i < iLength; i ++ ) {\n\n\t\t\t// \t\tlet label = volumeData[ sliceAccess( i, j ) ];\n\t\t\t// \t\tlabel = label >= this.colorMap.length ? ( label % this.colorMap.length ) + 1 : label;\n\t\t\t// \t\tconst color = this.colorMap[ label ];\n\t\t\t// \t\tdata[ 4 * pixelCount ] = ( color >> 24 ) & 0xff;\n\t\t\t// \t\tdata[ 4 * pixelCount + 1 ] = ( color >> 16 ) & 0xff;\n\t\t\t// \t\tdata[ 4 * pixelCount + 2 ] = ( color >> 8 ) & 0xff;\n\t\t\t// \t\tdata[ 4 * pixelCount + 3 ] = color & 0xff;\n\t\t\t// \t\tpixelCount ++;\n\n\t\t\t// \t}\n\n\t\t\t// }\n\n\t\t} else {\n\n\t\t\tfor ( let j = 0; j < jLength; j ++ ) {\n\n\t\t\t\tfor ( let i = 0; i < iLength; i ++ ) {\n\n\t\t\t\t\tlet value = volumeData[ sliceAccess( i, j ) ];\n\t\t\t\t\tlet alpha = 0xff;\n\t\t\t\t\t//apply threshold\n\t\t\t\t\talpha = upperThreshold >= value ? ( lowerThreshold <= value ? alpha : 0 ) : 0;\n\t\t\t\t\t//apply window level\n\t\t\t\t\tvalue = Math.floor( 255 * ( value - windowLow ) / ( windowHigh - windowLow ) );\n\t\t\t\t\tvalue = value > 255 ? 255 : ( value < 0 ? 0 : value | 0 );\n\n\t\t\t\t\tdata[ 4 * pixelCount ] = value;\n\t\t\t\t\tdata[ 4 * pixelCount + 1 ] = value;\n\t\t\t\t\tdata[ 4 * pixelCount + 2 ] = value;\n\t\t\t\t\tdata[ 4 * pixelCount + 3 ] = alpha;\n\t\t\t\t\tpixelCount ++;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tctx.putImageData( imgData, 0, 0 );\n\t\tthis.ctx.drawImage( canvas, 0, 0, iLength, jLength, 0, 0, this.canvas.width, this.canvas.height );\n\n\n\t\tthis.mesh.material.map.needsUpdate = true;\n\n\t}\n\n\t/**\n\t * Refresh the geometry according to axis and index.\n\t * @see {@link Volume#extractPerpendicularPlane}\n\t */\n\tupdateGeometry() {\n\n\t\tconst extracted = this.volume.extractPerpendicularPlane( this.axis, this.index );\n\t\tthis.sliceAccess = extracted.sliceAccess;\n\t\tthis.jLength = extracted.jLength;\n\t\tthis.iLength = extracted.iLength;\n\t\tthis.matrix = extracted.matrix;\n\n\t\tthis.canvas.width = extracted.planeWidth;\n\t\tthis.canvas.height = extracted.planeHeight;\n\t\tthis.canvasBuffer.width = this.iLength;\n\t\tthis.canvasBuffer.height = this.jLength;\n\t\tthis.ctx = this.canvas.getContext( '2d' );\n\t\tthis.ctxBuffer = this.canvasBuffer.getContext( '2d' );\n\n\t\tif ( this.geometry ) this.geometry.dispose(); // dispose existing geometry\n\n\t\tthis.geometry = new PlaneGeometry( extracted.planeWidth, extracted.planeHeight );\n\n\t\tif ( this.mesh ) {\n\n\t\t\tthis.mesh.geometry = this.geometry;\n\t\t\t//reset mesh matrix\n\t\t\tthis.mesh.matrix.identity();\n\t\t\tthis.mesh.applyMatrix4( this.matrix );\n\n\t\t}\n\n\t\tthis.geometryNeedsUpdate = false;\n\n\t}\n\n}\n\nexport { VolumeSlice };\n", "import {\n\tMatrix3,\n\tMatrix4,\n\tVector3\n} from 'three';\nimport { VolumeSlice } from '../misc/VolumeSlice.js';\n\n/**\n * This class had been written to handle the output of the {@link NRRDLoader}.\n * It contains a volume of data and information about it. For now it only handles 3 dimensional data.\n *\n * @three_import import { Volume } from 'three/addons/misc/Volume.js';\n */\nclass Volume {\n\n\t/**\n\t * Constructs a new volume.\n\t *\n\t * @param {number} [xLength] - Width of the volume.\n\t * @param {number} [yLength] - Length of the volume.\n\t * @param {number} [zLength] - Depth of the volume.\n\t * @param {string} [type] - The type of data (uint8, uint16, ...).\n\t * @param {ArrayBuffer} [arrayBuffer] - The buffer with volume data.\n\t */\n\tconstructor( xLength, yLength, zLength, type, arrayBuffer ) {\n\n\t\tif ( xLength !== undefined ) {\n\n\t\t\t/**\n\t\t\t * Width of the volume in the IJK coordinate system.\n\t\t\t *\n\t\t\t * @type {number}\n\t\t\t * @default 1\n\t\t\t */\n\t\t\tthis.xLength = Number( xLength ) || 1;\n\n\t\t\t/**\n\t\t\t * Height of the volume in the IJK coordinate system.\n\t\t\t *\n\t\t\t * @type {number}\n\t\t\t * @default 1\n\t\t\t */\n\t\t\tthis.yLength = Number( yLength ) || 1;\n\n\t\t\t/**\n\t\t\t * Depth of the volume in the IJK coordinate system.\n\t\t\t *\n\t\t\t * @type {number}\n\t\t\t * @default 1\n\t\t\t */\n\t\t\tthis.zLength = Number( zLength ) || 1;\n\n\t\t\t/**\n\t\t\t * The order of the Axis dictated by the NRRD header\n\t\t\t *\n\t\t\t * @type {Array<string>}\n\t\t\t */\n\t\t\tthis.axisOrder = [ 'x', 'y', 'z' ];\n\n\t\t\t/**\n\t\t\t * The data of the volume.\n\t\t\t *\n\t\t\t * @type {TypedArray}\n\t\t\t */\n\t\t\tthis.data;\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 'Uint8' :\n\t\t\t\tcase 'uint8' :\n\t\t\t\tcase 'uchar' :\n\t\t\t\tcase 'unsigned char' :\n\t\t\t\tcase 'uint8_t' :\n\t\t\t\t\tthis.data = new Uint8Array( arrayBuffer );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Int8' :\n\t\t\t\tcase 'int8' :\n\t\t\t\tcase 'signed char' :\n\t\t\t\tcase 'int8_t' :\n\t\t\t\t\tthis.data = new Int8Array( arrayBuffer );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Int16' :\n\t\t\t\tcase 'int16' :\n\t\t\t\tcase 'short' :\n\t\t\t\tcase 'short int' :\n\t\t\t\tcase 'signed short' :\n\t\t\t\tcase 'signed short int' :\n\t\t\t\tcase 'int16_t' :\n\t\t\t\t\tthis.data = new Int16Array( arrayBuffer );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Uint16' :\n\t\t\t\tcase 'uint16' :\n\t\t\t\tcase 'ushort' :\n\t\t\t\tcase 'unsigned short' :\n\t\t\t\tcase 'unsigned short int' :\n\t\t\t\tcase 'uint16_t' :\n\t\t\t\t\tthis.data = new Uint16Array( arrayBuffer );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Int32' :\n\t\t\t\tcase 'int32' :\n\t\t\t\tcase 'int' :\n\t\t\t\tcase 'signed int' :\n\t\t\t\tcase 'int32_t' :\n\t\t\t\t\tthis.data = new Int32Array( arrayBuffer );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Uint32' :\n\t\t\t\tcase 'uint32' :\n\t\t\t\tcase 'uint' :\n\t\t\t\tcase 'unsigned int' :\n\t\t\t\tcase 'uint32_t' :\n\t\t\t\t\tthis.data = new Uint32Array( arrayBuffer );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'longlong' :\n\t\t\t\tcase 'long long' :\n\t\t\t\tcase 'long long int' :\n\t\t\t\tcase 'signed long long' :\n\t\t\t\tcase 'signed long long int' :\n\t\t\t\tcase 'int64' :\n\t\t\t\tcase 'int64_t' :\n\t\t\t\tcase 'ulonglong' :\n\t\t\t\tcase 'unsigned long long' :\n\t\t\t\tcase 'unsigned long long int' :\n\t\t\t\tcase 'uint64' :\n\t\t\t\tcase 'uint64_t' :\n\t\t\t\t\tthrow new Error( 'Error in Volume constructor : this type is not supported in JavaScript' );\n\t\t\t\tcase 'Float32' :\n\t\t\t\tcase 'float32' :\n\t\t\t\tcase 'float' :\n\t\t\t\t\tthis.data = new Float32Array( arrayBuffer );\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Float64' :\n\t\t\t\tcase 'float64' :\n\t\t\t\tcase 'double' :\n\t\t\t\t\tthis.data = new Float64Array( arrayBuffer );\n\t\t\t\t\tbreak;\n\t\t\t\tdefault :\n\t\t\t\t\tthis.data = new Uint8Array( arrayBuffer );\n\n\t\t\t}\n\n\t\t\tif ( this.data.length !== this.xLength * this.yLength * this.zLength ) {\n\n\t\t\t\tthrow new Error( 'Error in Volume constructor, lengths are not matching arrayBuffer size' );\n\n\t\t\t}\n\n\t\t}\n\n\t\t/**\n\t\t * Spacing to apply to the volume from IJK to RAS coordinate system\n\t\t *\n\t\t * @type {Array<number>}\n\t\t */\n\t\tthis.spacing = [ 1, 1, 1 ];\n\n\t\t/**\n\t\t * Offset of the volume in the RAS coordinate system\n\t\t *\n\t\t * @type {Array<number>}\n\t\t */\n\t\tthis.offset = [ 0, 0, 0 ];\n\n\t\t/**\n\t\t * The IJK to RAS matrix.\n\t\t *\n\t\t * @type {Martrix3}\n\t\t */\n\t\tthis.matrix = new Matrix3();\n\t\tthis.matrix.identity();\n\n\t\t/**\n\t\t * The RAS to IJK matrix.\n\t\t *\n\t\t * @type {Martrix3}\n\t\t */\n\t\tthis.inverseMatrix = new Matrix3();\n\n\t\tlet lowerThreshold = - Infinity;\n\t\tObject.defineProperty( this, 'lowerThreshold', {\n\t\t\tget: function () {\n\n\t\t\t\treturn lowerThreshold;\n\n\t\t\t},\n\t\t\t/**\n\t\t\t * The voxels with values under this threshold won't appear in the slices.\n\t\t\t * If changed, geometryNeedsUpdate is automatically set to true on all the slices associated to this volume.\n\t\t\t *\n\t\t\t * @name Volume#lowerThreshold\n\t\t\t * @type {number}\n\t\t\t * @param {number} value\n\t\t\t */\n\t\t\tset: function ( value ) {\n\n\t\t\t\tlowerThreshold = value;\n\t\t\t\tthis.sliceList.forEach( function ( slice ) {\n\n\t\t\t\t\tslice.geometryNeedsUpdate = true;\n\n\t\t\t\t} );\n\n\t\t\t}\n\t\t} );\n\n\t\tlet upperThreshold = Infinity;\n\t\tObject.defineProperty( this, 'upperThreshold', {\n\t\t\tget: function () {\n\n\t\t\t\treturn upperThreshold;\n\n\t\t\t},\n\t\t\t/**\n\t\t\t * The voxels with values over this threshold won't appear in the slices.\n\t\t\t * If changed, geometryNeedsUpdate is automatically set to true on all the slices associated to this volume\n\t\t\t *\n\t\t\t * @name Volume#upperThreshold\n\t\t\t * @type {number}\n\t\t\t * @param {number} value\n\t\t\t */\n\t\t\tset: function ( value ) {\n\n\t\t\t\tupperThreshold = value;\n\t\t\t\tthis.sliceList.forEach( function ( slice ) {\n\n\t\t\t\t\tslice.geometryNeedsUpdate = true;\n\n\t\t\t\t} );\n\n\t\t\t}\n\t\t} );\n\n\n\t\t/**\n\t\t * The list of all the slices associated to this volume\n\t\t *\n\t\t * @type {Array<VolumeSlice>}\n\t\t */\n\t\tthis.sliceList = [];\n\n\t\t/**\n\t\t * Whether to use segmentation mode or not.\n\t\t * It can load 16-bits nrrds correctly.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.segmentation = false;\n\n\n\t\t/**\n\t\t * This array holds the dimensions of the volume in the RAS space\n\t\t *\n\t\t * @type {Array<number>}\n\t\t */\n\t\tthis.RASDimensions = [];\n\n\t}\n\n\t/**\n\t * Shortcut for data[access(i,j,k)].\n\t *\n\t * @param {number} i - First coordinate.\n\t * @param {number} j - Second coordinate.\n\t * @param {number} k - Third coordinate.\n\t * @returns {number} The value in the data array.\n\t */\n\tgetData( i, j, k ) {\n\n\t\treturn this.data[ k * this.xLength * this.yLength + j * this.xLength + i ];\n\n\t}\n\n\t/**\n\t * Compute the index in the data array corresponding to the given coordinates in IJK system.\n\t *\n\t * @param {number} i - First coordinate.\n\t * @param {number} j - Second coordinate.\n\t * @param {number} k - Third coordinate.\n\t * @returns {number} The index.\n\t */\n\taccess( i, j, k ) {\n\n\t\treturn k * this.xLength * this.yLength + j * this.xLength + i;\n\n\t}\n\n\t/**\n\t * Retrieve the IJK coordinates of the voxel corresponding of the given index in the data.\n\t *\n\t * @param {number} index - Index of the voxel.\n\t * @returns {Array<number>} The IJK coordinates as `[x,y,z]`.\n\t */\n\treverseAccess( index ) {\n\n\t\tconst z = Math.floor( index / ( this.yLength * this.xLength ) );\n\t\tconst y = Math.floor( ( index - z * this.yLength * this.xLength ) / this.xLength );\n\t\tconst x = index - z * this.yLength * this.xLength - y * this.xLength;\n\t\treturn [ x, y, z ];\n\n\t}\n\n\t/**\n\t * Apply a function to all the voxels, be careful, the value will be replaced.\n\t *\n\t * @param {Function} functionToMap A function to apply to every voxel, will be called with the following parameters:\n\t * value of the voxel, index of the voxel, the data (TypedArray).\n\t * @param {Object} context - You can specify a context in which call the function, default if this Volume.\n\t * @returns {Volume} A reference to this instance.\n\t */\n\tmap( functionToMap, context ) {\n\n\t\tconst length = this.data.length;\n\t\tcontext = context || this;\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tthis.data[ i ] = functionToMap.call( context, this.data[ i ], i, this.data );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Compute the orientation of the slice and returns all the information relative to the geometry such as sliceAccess,\n\t * the plane matrix (orientation and position in RAS coordinate) and the dimensions of the plane in both coordinate system.\n\t *\n\t * @param {('x'|'y'|'z')} axis - The normal axis to the slice.\n\t * @param {number} RASIndex - The index of the slice.\n\t * @returns {Object} An object containing all the useful information on the geometry of the slice.\n\t */\n\textractPerpendicularPlane( axis, RASIndex ) {\n\n\t\tlet firstSpacing,\n\t\t\tsecondSpacing,\n\t\t\tpositionOffset,\n\t\t\tIJKIndex;\n\n\t\tconst axisInIJK = new Vector3(),\n\t\t\tfirstDirection = new Vector3(),\n\t\t\tsecondDirection = new Vector3(),\n\t\t\tplaneMatrix = ( new Matrix4() ).identity(),\n\t\t\tvolume = this;\n\n\t\tconst dimensions = new Vector3( this.xLength, this.yLength, this.zLength );\n\n\n\t\tswitch ( axis ) {\n\n\t\t\tcase 'x' :\n\t\t\t\taxisInIJK.set( 1, 0, 0 );\n\t\t\t\tfirstDirection.set( 0, 0, - 1 );\n\t\t\t\tsecondDirection.set( 0, - 1, 0 );\n\t\t\t\tfirstSpacing = this.spacing[ this.axisOrder.indexOf( 'z' ) ];\n\t\t\t\tsecondSpacing = this.spacing[ this.axisOrder.indexOf( 'y' ) ];\n\t\t\t\tIJKIndex = new Vector3( RASIndex, 0, 0 );\n\n\t\t\t\tplaneMatrix.multiply( ( new Matrix4() ).makeRotationY( Math.PI / 2 ) );\n\t\t\t\tpositionOffset = ( volume.RASDimensions[ 0 ] - 1 ) / 2;\n\t\t\t\tplaneMatrix.setPosition( new Vector3( RASIndex - positionOffset, 0, 0 ) );\n\t\t\t\tbreak;\n\t\t\tcase 'y' :\n\t\t\t\taxisInIJK.set( 0, 1, 0 );\n\t\t\t\tfirstDirection.set( 1, 0, 0 );\n\t\t\t\tsecondDirection.set( 0, 0, 1 );\n\t\t\t\tfirstSpacing = this.spacing[ this.axisOrder.indexOf( 'x' ) ];\n\t\t\t\tsecondSpacing = this.spacing[ this.axisOrder.indexOf( 'z' ) ];\n\t\t\t\tIJKIndex = new Vector3( 0, RASIndex, 0 );\n\n\t\t\t\tplaneMatrix.multiply( ( new Matrix4() ).makeRotationX( - Math.PI / 2 ) );\n\t\t\t\tpositionOffset = ( volume.RASDimensions[ 1 ] - 1 ) / 2;\n\t\t\t\tplaneMatrix.setPosition( new Vector3( 0, RASIndex - positionOffset, 0 ) );\n\t\t\t\tbreak;\n\t\t\tcase 'z' :\n\t\t\tdefault :\n\t\t\t\taxisInIJK.set( 0, 0, 1 );\n\t\t\t\tfirstDirection.set( 1, 0, 0 );\n\t\t\t\tsecondDirection.set( 0, - 1, 0 );\n\t\t\t\tfirstSpacing = this.spacing[ this.axisOrder.indexOf( 'x' ) ];\n\t\t\t\tsecondSpacing = this.spacing[ this.axisOrder.indexOf( 'y' ) ];\n\t\t\t\tIJKIndex = new Vector3( 0, 0, RASIndex );\n\n\t\t\t\tpositionOffset = ( volume.RASDimensions[ 2 ] - 1 ) / 2;\n\t\t\t\tplaneMatrix.setPosition( new Vector3( 0, 0, RASIndex - positionOffset ) );\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif ( ! this.segmentation ) {\n\n\t\t\tfirstDirection.applyMatrix4( volume.inverseMatrix ).normalize();\n\t\t\tsecondDirection.applyMatrix4( volume.inverseMatrix ).normalize();\n\t\t\taxisInIJK.applyMatrix4( volume.inverseMatrix ).normalize();\n\n\t\t}\n\n\t\tfirstDirection.arglet = 'i';\n\t\tsecondDirection.arglet = 'j';\n\t\tconst iLength = Math.floor( Math.abs( firstDirection.dot( dimensions ) ) );\n\t\tconst jLength = Math.floor( Math.abs( secondDirection.dot( dimensions ) ) );\n\t\tconst planeWidth = Math.abs( iLength * firstSpacing );\n\t\tconst planeHeight = Math.abs( jLength * secondSpacing );\n\n\t\tIJKIndex = Math.abs( Math.round( IJKIndex.applyMatrix4( volume.inverseMatrix ).dot( axisInIJK ) ) );\n\t\tconst base = [ new Vector3( 1, 0, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ) ];\n\t\tconst iDirection = [ firstDirection, secondDirection, axisInIJK ].find( function ( x ) {\n\n\t\t\treturn Math.abs( x.dot( base[ 0 ] ) ) > 0.9;\n\n\t\t} );\n\t\tconst jDirection = [ firstDirection, secondDirection, axisInIJK ].find( function ( x ) {\n\n\t\t\treturn Math.abs( x.dot( base[ 1 ] ) ) > 0.9;\n\n\t\t} );\n\t\tconst kDirection = [ firstDirection, secondDirection, axisInIJK ].find( function ( x ) {\n\n\t\t\treturn Math.abs( x.dot( base[ 2 ] ) ) > 0.9;\n\n\t\t} );\n\n\t\tfunction sliceAccess( i, j ) {\n\n\t\t\tconst si = ( iDirection === axisInIJK ) ? IJKIndex : ( iDirection.arglet === 'i' ? i : j );\n\t\t\tconst sj = ( jDirection === axisInIJK ) ? IJKIndex : ( jDirection.arglet === 'i' ? i : j );\n\t\t\tconst sk = ( kDirection === axisInIJK ) ? IJKIndex : ( kDirection.arglet === 'i' ? i : j );\n\n\t\t\t// invert indices if necessary\n\n\t\t\tconst accessI = ( iDirection.dot( base[ 0 ] ) > 0 ) ? si : ( volume.xLength - 1 ) - si;\n\t\t\tconst accessJ = ( jDirection.dot( base[ 1 ] ) > 0 ) ? sj : ( volume.yLength - 1 ) - sj;\n\t\t\tconst accessK = ( kDirection.dot( base[ 2 ] ) > 0 ) ? sk : ( volume.zLength - 1 ) - sk;\n\n\t\t\treturn volume.access( accessI, accessJ, accessK );\n\n\t\t}\n\n\t\treturn {\n\t\t\tiLength: iLength,\n\t\t\tjLength: jLength,\n\t\t\tsliceAccess: sliceAccess,\n\t\t\tmatrix: planeMatrix,\n\t\t\tplaneWidth: planeWidth,\n\t\t\tplaneHeight: planeHeight\n\t\t};\n\n\t}\n\n\t/**\n\t * Returns a slice corresponding to the given axis and index.\n\t * The coordinate are given in the Right Anterior Superior coordinate format.\n\t *\n\t * @param {('x'|'y'|'z')} axis - The normal axis to the slice.\n\t * @param {number} index - The index of the slice.\n\t * @returns {VolumeSlice} The extracted slice.\n\t */\n\textractSlice( axis, index ) {\n\n\t\tconst slice = new VolumeSlice( this, index, axis );\n\t\tthis.sliceList.push( slice );\n\t\treturn slice;\n\n\t}\n\n\t/**\n\t * Call repaint on all the slices extracted from this volume.\n\t *\n\t * @see {@link VolumeSlice#repaint}\n\t * @returns {Volume} A reference to this volume.\n\t */\n\trepaintAllSlices() {\n\n\t\tthis.sliceList.forEach( function ( slice ) {\n\n\t\t\tslice.repaint();\n\n\t\t} );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Compute the minimum and the maximum of the data in the volume.\n\t *\n\t * @returns {Array<number>} The min/max data as `[min,max]`.\n\t */\n\tcomputeMinMax() {\n\n\t\tlet min = Infinity;\n\t\tlet max = - Infinity;\n\n\t\t// buffer the length\n\t\tconst datasize = this.data.length;\n\n\t\tlet i = 0;\n\n\t\tfor ( i = 0; i < datasize; i ++ ) {\n\n\t\t\tif ( ! isNaN( this.data[ i ] ) ) {\n\n\t\t\t\tconst value = this.data[ i ];\n\t\t\t\tmin = Math.min( min, value );\n\t\t\t\tmax = Math.max( max, value );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.min = min;\n\t\tthis.max = max;\n\n\t\treturn [ min, max ];\n\n\t}\n\n}\n\nexport { Volume };\n", "import {\n\tFileLoader,\n\tLoader,\n\tMatrix4,\n\tVector3\n} from 'three';\nimport * as fflate from '../libs/fflate.module.js';\nimport { Volume } from '../misc/Volume.js';\n\n/**\n * A loader for the NRRD format.\n *\n * ```js\n * const loader = new NRRDLoader();\n * const volume = await loader.loadAsync( 'models/nrrd/I.nrrd' );\n * ```\n *\n * @augments Loader\n * @three_import import { NRRDLoader } from 'three/addons/loaders/NRRDLoader.js';\n */\nclass NRRDLoader extends Loader {\n\n\t/**\n\t * Constructs a new NRRD loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded NRRD asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Volume)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( data ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( data ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Toggles the segmentation mode.\n\t *\n\t * @param {boolean} segmentation - Whether to use segmentation mode or not.\n\t */\n\tsetSegmentation( segmentation ) {\n\n\t\tthis.segmentation = segmentation;\n\n\t}\n\n\t/**\n\t * Parses the given NRRD data and returns the resulting volume data.\n\t *\n\t * @param {ArrayBuffer} data - The raw NRRD data as an array buffer.\n\t * @return {Volume} The parsed volume.\n\t */\n\tparse( data ) {\n\n\t\t// this parser is largely inspired from the XTK NRRD parser : https://github.com/xtk/X\n\n\t\tlet _data = data;\n\n\t\tlet _dataPointer = 0;\n\n\t\tconst _nativeLittleEndian = new Int8Array( new Int16Array( [ 1 ] ).buffer )[ 0 ] > 0;\n\n\t\tconst _littleEndian = true;\n\n\t\tconst headerObject = {};\n\n\t\tfunction scan( type, chunks ) {\n\n\t\t\tlet _chunkSize = 1;\n\t\t\tlet _array_type = Uint8Array;\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\t// 1 byte data types\n\t\t\t\tcase 'uchar':\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'schar':\n\t\t\t\t\t_array_type = Int8Array;\n\t\t\t\t\tbreak;\n\t\t\t\t// 2 byte data types\n\t\t\t\tcase 'ushort':\n\t\t\t\t\t_array_type = Uint16Array;\n\t\t\t\t\t_chunkSize = 2;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'sshort':\n\t\t\t\t\t_array_type = Int16Array;\n\t\t\t\t\t_chunkSize = 2;\n\t\t\t\t\tbreak;\n\t\t\t\t// 4 byte data types\n\t\t\t\tcase 'uint':\n\t\t\t\t\t_array_type = Uint32Array;\n\t\t\t\t\t_chunkSize = 4;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'sint':\n\t\t\t\t\t_array_type = Int32Array;\n\t\t\t\t\t_chunkSize = 4;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'float':\n\t\t\t\t\t_array_type = Float32Array;\n\t\t\t\t\t_chunkSize = 4;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'complex':\n\t\t\t\t\t_array_type = Float64Array;\n\t\t\t\t\t_chunkSize = 8;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'double':\n\t\t\t\t\t_array_type = Float64Array;\n\t\t\t\t\t_chunkSize = 8;\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\t// increase the data pointer in-place\n\t\t\tlet _bytes = new _array_type( _data.slice( _dataPointer,\n\t\t\t\t_dataPointer += chunks * _chunkSize ) );\n\n\t\t\t// if required, flip the endianness of the bytes\n\t\t\tif ( _nativeLittleEndian != _littleEndian ) {\n\n\t\t\t\t// we need to flip here since the format doesn't match the native endianness\n\t\t\t\t_bytes = flipEndianness( _bytes, _chunkSize );\n\n\t\t\t}\n\n\t\t\t// return the byte array\n\t\t\treturn _bytes;\n\n\t\t}\n\n\t\t//Flips typed array endianness in-place. Based on https://github.com/kig/DataStream.js/blob/master/DataStream.js.\n\n\t\tfunction flipEndianness( array, chunkSize ) {\n\n\t\t\tconst u8 = new Uint8Array( array.buffer, array.byteOffset, array.byteLength );\n\t\t\tfor ( let i = 0; i < array.byteLength; i += chunkSize ) {\n\n\t\t\t\tfor ( let j = i + chunkSize - 1, k = i; j > k; j --, k ++ ) {\n\n\t\t\t\t\tconst tmp = u8[ k ];\n\t\t\t\t\tu8[ k ] = u8[ j ];\n\t\t\t\t\tu8[ j ] = tmp;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn array;\n\n\t\t}\n\n\t\t//parse the header\n\t\tfunction parseHeader( header ) {\n\n\t\t\tlet data, field, fn, i, l, m, _i, _len;\n\t\t\tconst lines = header.split( /\\r?\\n/ );\n\t\t\tfor ( _i = 0, _len = lines.length; _i < _len; _i ++ ) {\n\n\t\t\t\tl = lines[ _i ];\n\t\t\t\tif ( l.match( /NRRD\\d+/ ) ) {\n\n\t\t\t\t\theaderObject.isNrrd = true;\n\n\t\t\t\t} else if ( ! l.match( /^#/ ) && ( m = l.match( /(.*):(.*)/ ) ) ) {\n\n\t\t\t\t\tfield = m[ 1 ].trim();\n\t\t\t\t\tdata = m[ 2 ].trim();\n\t\t\t\t\tfn = _fieldFunctions[ field ];\n\t\t\t\t\tif ( fn ) {\n\n\t\t\t\t\t\tfn.call( headerObject, data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\theaderObject[ field ] = data;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ! headerObject.isNrrd ) {\n\n\t\t\t\tthrow new Error( 'Not an NRRD file' );\n\n\t\t\t}\n\n\t\t\tif ( headerObject.encoding === 'bz2' || headerObject.encoding === 'bzip2' ) {\n\n\t\t\t\tthrow new Error( 'Bzip is not supported' );\n\n\t\t\t}\n\n\t\t\tif ( ! headerObject.vectors ) {\n\n\t\t\t\t//if no space direction is set, let's use the identity\n\t\t\t\theaderObject.vectors = [ ];\n\t\t\t\theaderObject.vectors.push( [ 1, 0, 0 ] );\n\t\t\t\theaderObject.vectors.push( [ 0, 1, 0 ] );\n\t\t\t\theaderObject.vectors.push( [ 0, 0, 1 ] );\n\n\t\t\t\t//apply spacing if defined\n\t\t\t\tif ( headerObject.spacings ) {\n\n\t\t\t\t\tfor ( i = 0; i <= 2; i ++ ) {\n\n\t\t\t\t\t\tif ( ! isNaN( headerObject.spacings[ i ] ) ) {\n\n\t\t\t\t\t\t\tfor ( let j = 0; j <= 2; j ++ ) {\n\n\t\t\t\t\t\t\t\theaderObject.vectors[ i ][ j ] *= headerObject.spacings[ i ];\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t//parse the data when registered as one of this type : 'text', 'ascii', 'txt'\n\t\tfunction parseDataAsText( data, start, end ) {\n\n\t\t\tlet number = '';\n\t\t\tstart = start || 0;\n\t\t\tend = end || data.length;\n\t\t\tlet value;\n\t\t\t//length of the result is the product of the sizes\n\t\t\tconst lengthOfTheResult = headerObject.sizes.reduce( function ( previous, current ) {\n\n\t\t\t\treturn previous * current;\n\n\t\t\t}, 1 );\n\n\t\t\tlet base = 10;\n\t\t\tif ( headerObject.encoding === 'hex' ) {\n\n\t\t\t\tbase = 16;\n\n\t\t\t}\n\n\t\t\tconst result = new headerObject.__array( lengthOfTheResult );\n\t\t\tlet resultIndex = 0;\n\t\t\tlet parsingFunction = parseInt;\n\t\t\tif ( headerObject.__array === Float32Array || headerObject.__array === Float64Array ) {\n\n\t\t\t\tparsingFunction = parseFloat;\n\n\t\t\t}\n\n\t\t\tfor ( let i = start; i < end; i ++ ) {\n\n\t\t\t\tvalue = data[ i ];\n\t\t\t\t//if value is not a space\n\t\t\t\tif ( ( value < 9 || value > 13 ) && value !== 32 ) {\n\n\t\t\t\t\tnumber += String.fromCharCode( value );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( number !== '' ) {\n\n\t\t\t\t\t\tresult[ resultIndex ] = parsingFunction( number, base );\n\t\t\t\t\t\tresultIndex ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tnumber = '';\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( number !== '' ) {\n\n\t\t\t\tresult[ resultIndex ] = parsingFunction( number, base );\n\t\t\t\tresultIndex ++;\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\tconst _bytes = scan( 'uchar', data.byteLength );\n\t\tconst _length = _bytes.length;\n\t\tlet _header = null;\n\t\tlet _data_start = 0;\n\t\tlet i;\n\t\tfor ( i = 1; i < _length; i ++ ) {\n\n\t\t\tif ( _bytes[ i - 1 ] == 10 && _bytes[ i ] == 10 ) {\n\n\t\t\t\t// we found two line breaks in a row\n\t\t\t\t// now we know what the header is\n\t\t\t\t_header = this._parseChars( _bytes, 0, i - 2 );\n\t\t\t\t// this is were the data starts\n\t\t\t\t_data_start = i + 1;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// parse the header\n\t\tparseHeader( _header );\n\n\t\t_data = _bytes.subarray( _data_start ); // the data without header\n\t\tif ( headerObject.encoding.substring( 0, 2 ) === 'gz' ) {\n\n\t\t\t// we need to decompress the datastream\n\t\t\t// here we start the unzipping and get a typed Uint8Array back\n\t\t\t_data = fflate.gunzipSync( new Uint8Array( _data ) );\n\n\t\t} else if ( headerObject.encoding === 'ascii' || headerObject.encoding === 'text' || headerObject.encoding === 'txt' || headerObject.encoding === 'hex' ) {\n\n\t\t\t_data = parseDataAsText( _data );\n\n\t\t} else if ( headerObject.encoding === 'raw' ) {\n\n\t\t\t//we need to copy the array to create a new array buffer, else we retrieve the original arraybuffer with the header\n\t\t\tconst _copy = new Uint8Array( _data.length );\n\n\t\t\tfor ( let i = 0; i < _data.length; i ++ ) {\n\n\t\t\t\t_copy[ i ] = _data[ i ];\n\n\t\t\t}\n\n\t\t\t_data = _copy;\n\n\t\t}\n\n\t\t// .. let's use the underlying array buffer\n\t\t_data = _data.buffer;\n\n\t\tconst volume = new Volume();\n\t\tvolume.header = headerObject;\n\t\tvolume.segmentation = this.segmentation;\n\t\t//\n\t\t// parse the (unzipped) data to a datastream of the correct type\n\t\t//\n\t\tvolume.data = new headerObject.__array( _data );\n\t\t// get the min and max intensities\n\t\tconst min_max = volume.computeMinMax();\n\t\tconst min = min_max[ 0 ];\n\t\tconst max = min_max[ 1 ];\n\t\t// attach the scalar range to the volume\n\t\tvolume.windowLow = min;\n\t\tvolume.windowHigh = max;\n\n\t\t// get the image dimensions\n\t\tvolume.dimensions = [ headerObject.sizes[ 0 ], headerObject.sizes[ 1 ], headerObject.sizes[ 2 ] ];\n\t\tvolume.xLength = volume.dimensions[ 0 ];\n\t\tvolume.yLength = volume.dimensions[ 1 ];\n\t\tvolume.zLength = volume.dimensions[ 2 ];\n\n\t\t// Identify axis order in the space-directions matrix from the header if possible.\n\t\tif ( headerObject.vectors ) {\n\n\t\t\tconst xIndex = headerObject.vectors.findIndex( vector => vector[ 0 ] !== 0 );\n\t\t\tconst yIndex = headerObject.vectors.findIndex( vector => vector[ 1 ] !== 0 );\n\t\t\tconst zIndex = headerObject.vectors.findIndex( vector => vector[ 2 ] !== 0 );\n\n\t\t\tconst axisOrder = [];\n\n\t\t\tif ( xIndex !== yIndex && xIndex !== zIndex && yIndex !== zIndex ) {\n\n\t\t\t\taxisOrder[ xIndex ] = 'x';\n\t\t\t\taxisOrder[ yIndex ] = 'y';\n\t\t\t\taxisOrder[ zIndex ] = 'z';\n\n\t\t\t} else {\n\n\t\t\t\taxisOrder[ 0 ] = 'x';\n\t\t\t\taxisOrder[ 1 ] = 'y';\n\t\t\t\taxisOrder[ 2 ] = 'z';\n\n\t\t\t}\n\n\t\t\tvolume.axisOrder = axisOrder;\n\n\t\t} else {\n\n\t\t\tvolume.axisOrder = [ 'x', 'y', 'z' ];\n\n\t\t}\n\n\t\t// spacing\n\t\tconst spacingX = new Vector3().fromArray( headerObject.vectors[ 0 ] ).length();\n\t\tconst spacingY = new Vector3().fromArray( headerObject.vectors[ 1 ] ).length();\n\t\tconst spacingZ = new Vector3().fromArray( headerObject.vectors[ 2 ] ).length();\n\t\tvolume.spacing = [ spacingX, spacingY, spacingZ ];\n\n\n\t\t// Create IJKtoRAS matrix\n\t\tvolume.matrix = new Matrix4();\n\n\t\tconst transitionMatrix = new Matrix4();\n\n\t\tif ( headerObject.space === 'left-posterior-superior' ) {\n\n\t\t\ttransitionMatrix.set(\n\t\t\t\t- 1, 0, 0, 0,\n\t\t\t\t0, - 1, 0, 0,\n\t\t\t\t0, 0, 1, 0,\n\t\t\t\t0, 0, 0, 1\n\t\t\t);\n\n\t\t} else if ( headerObject.space === 'left-anterior-superior' ) {\n\n\t\t\ttransitionMatrix.set(\n\t\t\t\t1, 0, 0, 0,\n\t\t\t\t0, 1, 0, 0,\n\t\t\t\t0, 0, - 1, 0,\n\t\t\t\t0, 0, 0, 1\n\t\t\t);\n\n\t\t}\n\n\n\t\tif ( ! headerObject.vectors ) {\n\n\t\t\tvolume.matrix.set(\n\t\t\t\t1, 0, 0, 0,\n\t\t\t\t0, 1, 0, 0,\n\t\t\t\t0, 0, 1, 0,\n\t\t\t\t0, 0, 0, 1 );\n\n\t\t} else {\n\n\t\t\tconst v = headerObject.vectors;\n\n\t\t\tconst ijk_to_transition = new Matrix4().set(\n\t\t\t\tv[ 0 ][ 0 ], v[ 1 ][ 0 ], v[ 2 ][ 0 ], 0,\n\t\t\t\tv[ 0 ][ 1 ], v[ 1 ][ 1 ], v[ 2 ][ 1 ], 0,\n\t\t\t\tv[ 0 ][ 2 ], v[ 1 ][ 2 ], v[ 2 ][ 2 ], 0,\n\t\t\t\t0, 0, 0, 1\n\t\t\t);\n\n\t\t\tconst transition_to_ras = new Matrix4().multiplyMatrices( ijk_to_transition, transitionMatrix );\n\n\t\t\tvolume.matrix = transition_to_ras;\n\n\t\t}\n\n\t\tvolume.inverseMatrix = new Matrix4();\n\t\tvolume.inverseMatrix.copy( volume.matrix ).invert();\n\n\t\tvolume.RASDimensions = [\n\t\t\tMath.floor( volume.xLength * spacingX ),\n\t\t\tMath.floor( volume.yLength * spacingY ),\n\t\t\tMath.floor( volume.zLength * spacingZ )\n\t\t];\n\n\t\t// .. and set the default threshold\n\t\t// only if the threshold was not already set\n\t\tif ( volume.lowerThreshold === - Infinity ) {\n\n\t\t\tvolume.lowerThreshold = min;\n\n\t\t}\n\n\t\tif ( volume.upperThreshold === Infinity ) {\n\n\t\t\tvolume.upperThreshold = max;\n\n\t\t}\n\n\t\treturn volume;\n\n\t}\n\n\t_parseChars( array, start, end ) {\n\n\t\t// without borders, use the whole array\n\t\tif ( start === undefined ) {\n\n\t\t\tstart = 0;\n\n\t\t}\n\n\t\tif ( end === undefined ) {\n\n\t\t\tend = array.length;\n\n\t\t}\n\n\t\tlet output = '';\n\t\t// create and append the chars\n\t\tlet i = 0;\n\t\tfor ( i = start; i < end; ++ i ) {\n\n\t\t\toutput += String.fromCharCode( array[ i ] );\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n}\n\nconst _fieldFunctions = {\n\n\ttype: function ( data ) {\n\n\t\tswitch ( data ) {\n\n\t\t\tcase 'uchar':\n\t\t\tcase 'unsigned char':\n\t\t\tcase 'uint8':\n\t\t\tcase 'uint8_t':\n\t\t\t\tthis.__array = Uint8Array;\n\t\t\t\tbreak;\n\t\t\tcase 'signed char':\n\t\t\tcase 'int8':\n\t\t\tcase 'int8_t':\n\t\t\t\tthis.__array = Int8Array;\n\t\t\t\tbreak;\n\t\t\tcase 'short':\n\t\t\tcase 'short int':\n\t\t\tcase 'signed short':\n\t\t\tcase 'signed short int':\n\t\t\tcase 'int16':\n\t\t\tcase 'int16_t':\n\t\t\t\tthis.__array = Int16Array;\n\t\t\t\tbreak;\n\t\t\tcase 'ushort':\n\t\t\tcase 'unsigned short':\n\t\t\tcase 'unsigned short int':\n\t\t\tcase 'uint16':\n\t\t\tcase 'uint16_t':\n\t\t\t\tthis.__array = Uint16Array;\n\t\t\t\tbreak;\n\t\t\tcase 'int':\n\t\t\tcase 'signed int':\n\t\t\tcase 'int32':\n\t\t\tcase 'int32_t':\n\t\t\t\tthis.__array = Int32Array;\n\t\t\t\tbreak;\n\t\t\tcase 'uint':\n\t\t\tcase 'unsigned int':\n\t\t\tcase 'uint32':\n\t\t\tcase 'uint32_t':\n\t\t\t\tthis.__array = Uint32Array;\n\t\t\t\tbreak;\n\t\t\tcase 'float':\n\t\t\t\tthis.__array = Float32Array;\n\t\t\t\tbreak;\n\t\t\tcase 'double':\n\t\t\t\tthis.__array = Float64Array;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tthrow new Error( 'Unsupported NRRD data type: ' + data );\n\n\t\t}\n\n\t\treturn this.type = data;\n\n\t},\n\n\tendian: function ( data ) {\n\n\t\treturn this.endian = data;\n\n\t},\n\n\tencoding: function ( data ) {\n\n\t\treturn this.encoding = data;\n\n\t},\n\n\tdimension: function ( data ) {\n\n\t\treturn this.dim = parseInt( data, 10 );\n\n\t},\n\n\tsizes: function ( data ) {\n\n\t\tlet i;\n\t\treturn this.sizes = ( function () {\n\n\t\t\tconst _ref = data.split( /\\s+/ );\n\t\t\tconst _results = [];\n\n\t\t\tfor ( let _i = 0, _len = _ref.length; _i < _len; _i ++ ) {\n\n\t\t\t\ti = _ref[ _i ];\n\t\t\t\t_results.push( parseInt( i, 10 ) );\n\n\t\t\t}\n\n\t\t\treturn _results;\n\n\t\t} )();\n\n\t},\n\n\tspace: function ( data ) {\n\n\t\treturn this.space = data;\n\n\t},\n\n\t'space origin': function ( data ) {\n\n\t\treturn this.space_origin = data.split( '(' )[ 1 ].split( ')' )[ 0 ].split( ',' );\n\n\t},\n\n\t'space directions': function ( data ) {\n\n\t\tlet f, v;\n\t\tconst parts = data.match( /\\(.*?\\)/g );\n\t\treturn this.vectors = ( function () {\n\n\t\t\tconst _results = [];\n\n\t\t\tfor ( let _i = 0, _len = parts.length; _i < _len; _i ++ ) {\n\n\t\t\t\tv = parts[ _i ];\n\t\t\t\t_results.push( ( function () {\n\n\t\t\t\t\tconst _ref = v.slice( 1, - 1 ).split( /,/ );\n\t\t\t\t\tconst _results2 = [];\n\n\t\t\t\t\tfor ( let _j = 0, _len2 = _ref.length; _j < _len2; _j ++ ) {\n\n\t\t\t\t\t\tf = _ref[ _j ];\n\t\t\t\t\t\t_results2.push( parseFloat( f ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn _results2;\n\n\t\t\t\t} )() );\n\n\t\t\t}\n\n\t\t\treturn _results;\n\n\t\t} )();\n\n\t},\n\n\tspacings: function ( data ) {\n\n\t\tlet f;\n\t\tconst parts = data.split( /\\s+/ );\n\t\treturn this.spacings = ( function () {\n\n\t\t\tconst _results = [];\n\n\t\t\tfor ( let _i = 0, _len = parts.length; _i < _len; _i ++ ) {\n\n\t\t\t\tf = parts[ _i ];\n\t\t\t\t_results.push( parseFloat( f ) );\n\n\t\t\t}\n\n\t\t\treturn _results;\n\n\t\t} )();\n\n\t}\n\n};\n\nexport { NRRDLoader };\n", "import {\n\tBufferGeometry,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tGroup,\n\tLineBasicMaterial,\n\tLineSegments,\n\tLoader,\n\tMaterial,\n\tMesh,\n\tMeshPhongMaterial,\n\tPoints,\n\tPointsMaterial,\n\tVector3,\n\tColor,\n\tSRGBColorSpace\n} from 'three';\n\n// o object_name | g group_name\nconst _object_pattern = /^[og]\\s*(.+)?/;\n// mtllib file_reference\nconst _material_library_pattern = /^mtllib /;\n// usemtl material_name\nconst _material_use_pattern = /^usemtl /;\n// usemap map_name\nconst _map_use_pattern = /^usemap /;\nconst _face_vertex_data_separator_pattern = /\\s+/;\n\nconst _vA = new Vector3();\nconst _vB = new Vector3();\nconst _vC = new Vector3();\n\nconst _ab = new Vector3();\nconst _cb = new Vector3();\n\nconst _color = new Color();\n\nfunction ParserState() {\n\n\tconst state = {\n\t\tobjects: [],\n\t\tobject: {},\n\n\t\tvertices: [],\n\t\tnormals: [],\n\t\tcolors: [],\n\t\tuvs: [],\n\n\t\tmaterials: {},\n\t\tmaterialLibraries: [],\n\n\t\tstartObject: function ( name, fromDeclaration ) {\n\n\t\t\t// If the current object (initial from reset) is not from a g/o declaration in the parsed\n\t\t\t// file. We need to use it for the first parsed g/o to keep things in sync.\n\t\t\tif ( this.object && this.object.fromDeclaration === false ) {\n\n\t\t\t\tthis.object.name = name;\n\t\t\t\tthis.object.fromDeclaration = ( fromDeclaration !== false );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst previousMaterial = ( this.object && typeof this.object.currentMaterial === 'function' ? this.object.currentMaterial() : undefined );\n\n\t\t\tif ( this.object && typeof this.object._finalize === 'function' ) {\n\n\t\t\t\tthis.object._finalize( true );\n\n\t\t\t}\n\n\t\t\tthis.object = {\n\t\t\t\tname: name || '',\n\t\t\t\tfromDeclaration: ( fromDeclaration !== false ),\n\n\t\t\t\tgeometry: {\n\t\t\t\t\tvertices: [],\n\t\t\t\t\tnormals: [],\n\t\t\t\t\tcolors: [],\n\t\t\t\t\tuvs: [],\n\t\t\t\t\thasUVIndices: false\n\t\t\t\t},\n\t\t\t\tmaterials: [],\n\t\t\t\tsmooth: true,\n\n\t\t\t\tstartMaterial: function ( name, libraries ) {\n\n\t\t\t\t\tconst previous = this._finalize( false );\n\n\t\t\t\t\t// New usemtl declaration overwrites an inherited material, except if faces were declared\n\t\t\t\t\t// after the material, then it must be preserved for proper MultiMaterial continuation.\n\t\t\t\t\tif ( previous && ( previous.inherited || previous.groupCount <= 0 ) ) {\n\n\t\t\t\t\t\tthis.materials.splice( previous.index, 1 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst material = {\n\t\t\t\t\t\tindex: this.materials.length,\n\t\t\t\t\t\tname: name || '',\n\t\t\t\t\t\tmtllib: ( Array.isArray( libraries ) && libraries.length > 0 ? libraries[ libraries.length - 1 ] : '' ),\n\t\t\t\t\t\tsmooth: ( previous !== undefined ? previous.smooth : this.smooth ),\n\t\t\t\t\t\tgroupStart: ( previous !== undefined ? previous.groupEnd : 0 ),\n\t\t\t\t\t\tgroupEnd: - 1,\n\t\t\t\t\t\tgroupCount: - 1,\n\t\t\t\t\t\tinherited: false,\n\n\t\t\t\t\t\tclone: function ( index ) {\n\n\t\t\t\t\t\t\tconst cloned = {\n\t\t\t\t\t\t\t\tindex: ( typeof index === 'number' ? index : this.index ),\n\t\t\t\t\t\t\t\tname: this.name,\n\t\t\t\t\t\t\t\tmtllib: this.mtllib,\n\t\t\t\t\t\t\t\tsmooth: this.smooth,\n\t\t\t\t\t\t\t\tgroupStart: 0,\n\t\t\t\t\t\t\t\tgroupEnd: - 1,\n\t\t\t\t\t\t\t\tgroupCount: - 1,\n\t\t\t\t\t\t\t\tinherited: false\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tcloned.clone = this.clone.bind( cloned );\n\t\t\t\t\t\t\treturn cloned;\n\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\n\t\t\t\t\tthis.materials.push( material );\n\n\t\t\t\t\treturn material;\n\n\t\t\t\t},\n\n\t\t\t\tcurrentMaterial: function () {\n\n\t\t\t\t\tif ( this.materials.length > 0 ) {\n\n\t\t\t\t\t\treturn this.materials[ this.materials.length - 1 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn undefined;\n\n\t\t\t\t},\n\n\t\t\t\t_finalize: function ( end ) {\n\n\t\t\t\t\tconst lastMultiMaterial = this.currentMaterial();\n\t\t\t\t\tif ( lastMultiMaterial && lastMultiMaterial.groupEnd === - 1 ) {\n\n\t\t\t\t\t\tlastMultiMaterial.groupEnd = this.geometry.vertices.length / 3;\n\t\t\t\t\t\tlastMultiMaterial.groupCount = lastMultiMaterial.groupEnd - lastMultiMaterial.groupStart;\n\t\t\t\t\t\tlastMultiMaterial.inherited = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Ignore objects tail materials if no face declarations followed them before a new o/g started.\n\t\t\t\t\tif ( end && this.materials.length > 1 ) {\n\n\t\t\t\t\t\tfor ( let mi = this.materials.length - 1; mi >= 0; mi -- ) {\n\n\t\t\t\t\t\t\tif ( this.materials[ mi ].groupCount <= 0 ) {\n\n\t\t\t\t\t\t\t\tthis.materials.splice( mi, 1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Guarantee at least one empty material, this makes the creation later more straight forward.\n\t\t\t\t\tif ( end && this.materials.length === 0 ) {\n\n\t\t\t\t\t\tthis.materials.push( {\n\t\t\t\t\t\t\tname: '',\n\t\t\t\t\t\t\tsmooth: this.smooth\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn lastMultiMaterial;\n\n\t\t\t\t}\n\t\t\t};\n\n\t\t\t// Inherit previous objects material.\n\t\t\t// Spec tells us that a declared material must be set to all objects until a new material is declared.\n\t\t\t// If a usemtl declaration is encountered while this new object is being parsed, it will\n\t\t\t// overwrite the inherited material. Exception being that there was already face declarations\n\t\t\t// to the inherited material, then it will be preserved for proper MultiMaterial continuation.\n\n\t\t\tif ( previousMaterial && previousMaterial.name && typeof previousMaterial.clone === 'function' ) {\n\n\t\t\t\tconst declared = previousMaterial.clone( 0 );\n\t\t\t\tdeclared.inherited = true;\n\t\t\t\tthis.object.materials.push( declared );\n\n\t\t\t}\n\n\t\t\tthis.objects.push( this.object );\n\n\t\t},\n\n\t\tfinalize: function () {\n\n\t\t\tif ( this.object && typeof this.object._finalize === 'function' ) {\n\n\t\t\t\tthis.object._finalize( true );\n\n\t\t\t}\n\n\t\t},\n\n\t\tparseVertexIndex: function ( value, len ) {\n\n\t\t\tconst index = parseInt( value, 10 );\n\t\t\treturn ( index >= 0 ? index - 1 : index + len / 3 ) * 3;\n\n\t\t},\n\n\t\tparseNormalIndex: function ( value, len ) {\n\n\t\t\tconst index = parseInt( value, 10 );\n\t\t\treturn ( index >= 0 ? index - 1 : index + len / 3 ) * 3;\n\n\t\t},\n\n\t\tparseUVIndex: function ( value, len ) {\n\n\t\t\tconst index = parseInt( value, 10 );\n\t\t\treturn ( index >= 0 ? index - 1 : index + len / 2 ) * 2;\n\n\t\t},\n\n\t\taddVertex: function ( a, b, c ) {\n\n\t\t\tconst src = this.vertices;\n\t\t\tconst dst = this.object.geometry.vertices;\n\n\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n\t\t\tdst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] );\n\t\t\tdst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] );\n\n\t\t},\n\n\t\taddVertexPoint: function ( a ) {\n\n\t\t\tconst src = this.vertices;\n\t\t\tconst dst = this.object.geometry.vertices;\n\n\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n\n\t\t},\n\n\t\taddVertexLine: function ( a ) {\n\n\t\t\tconst src = this.vertices;\n\t\t\tconst dst = this.object.geometry.vertices;\n\n\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n\n\t\t},\n\n\t\taddNormal: function ( a, b, c ) {\n\n\t\t\tconst src = this.normals;\n\t\t\tconst dst = this.object.geometry.normals;\n\n\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n\t\t\tdst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] );\n\t\t\tdst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] );\n\n\t\t},\n\n\t\taddFaceNormal: function ( a, b, c ) {\n\n\t\t\tconst src = this.vertices;\n\t\t\tconst dst = this.object.geometry.normals;\n\n\t\t\t_vA.fromArray( src, a );\n\t\t\t_vB.fromArray( src, b );\n\t\t\t_vC.fromArray( src, c );\n\n\t\t\t_cb.subVectors( _vC, _vB );\n\t\t\t_ab.subVectors( _vA, _vB );\n\t\t\t_cb.cross( _ab );\n\n\t\t\t_cb.normalize();\n\n\t\t\tdst.push( _cb.x, _cb.y, _cb.z );\n\t\t\tdst.push( _cb.x, _cb.y, _cb.z );\n\t\t\tdst.push( _cb.x, _cb.y, _cb.z );\n\n\t\t},\n\n\t\taddColor: function ( a, b, c ) {\n\n\t\t\tconst src = this.colors;\n\t\t\tconst dst = this.object.geometry.colors;\n\n\t\t\tif ( src[ a ] !== undefined ) dst.push( src[ a + 0 ], src[ a + 1 ], src[ a + 2 ] );\n\t\t\tif ( src[ b ] !== undefined ) dst.push( src[ b + 0 ], src[ b + 1 ], src[ b + 2 ] );\n\t\t\tif ( src[ c ] !== undefined ) dst.push( src[ c + 0 ], src[ c + 1 ], src[ c + 2 ] );\n\n\t\t},\n\n\t\taddUV: function ( a, b, c ) {\n\n\t\t\tconst src = this.uvs;\n\t\t\tconst dst = this.object.geometry.uvs;\n\n\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ] );\n\t\t\tdst.push( src[ b + 0 ], src[ b + 1 ] );\n\t\t\tdst.push( src[ c + 0 ], src[ c + 1 ] );\n\n\t\t},\n\n\t\taddDefaultUV: function () {\n\n\t\t\tconst dst = this.object.geometry.uvs;\n\n\t\t\tdst.push( 0, 0 );\n\t\t\tdst.push( 0, 0 );\n\t\t\tdst.push( 0, 0 );\n\n\t\t},\n\n\t\taddUVLine: function ( a ) {\n\n\t\t\tconst src = this.uvs;\n\t\t\tconst dst = this.object.geometry.uvs;\n\n\t\t\tdst.push( src[ a + 0 ], src[ a + 1 ] );\n\n\t\t},\n\n\t\taddFace: function ( a, b, c, ua, ub, uc, na, nb, nc ) {\n\n\t\t\tconst vLen = this.vertices.length;\n\n\t\t\tlet ia = this.parseVertexIndex( a, vLen );\n\t\t\tlet ib = this.parseVertexIndex( b, vLen );\n\t\t\tlet ic = this.parseVertexIndex( c, vLen );\n\n\t\t\tthis.addVertex( ia, ib, ic );\n\t\t\tthis.addColor( ia, ib, ic );\n\n\t\t\t// normals\n\n\t\t\tif ( na !== undefined && na !== '' ) {\n\n\t\t\t\tconst nLen = this.normals.length;\n\n\t\t\t\tia = this.parseNormalIndex( na, nLen );\n\t\t\t\tib = this.parseNormalIndex( nb, nLen );\n\t\t\t\tic = this.parseNormalIndex( nc, nLen );\n\n\t\t\t\tthis.addNormal( ia, ib, ic );\n\n\t\t\t} else {\n\n\t\t\t\tthis.addFaceNormal( ia, ib, ic );\n\n\t\t\t}\n\n\t\t\t// uvs\n\n\t\t\tif ( ua !== undefined && ua !== '' ) {\n\n\t\t\t\tconst uvLen = this.uvs.length;\n\n\t\t\t\tia = this.parseUVIndex( ua, uvLen );\n\t\t\t\tib = this.parseUVIndex( ub, uvLen );\n\t\t\t\tic = this.parseUVIndex( uc, uvLen );\n\n\t\t\t\tthis.addUV( ia, ib, ic );\n\n\t\t\t\tthis.object.geometry.hasUVIndices = true;\n\n\t\t\t} else {\n\n\t\t\t\t// add placeholder values (for inconsistent face definitions)\n\n\t\t\t\tthis.addDefaultUV();\n\n\t\t\t}\n\n\t\t},\n\n\t\taddPointGeometry: function ( vertices ) {\n\n\t\t\tthis.object.geometry.type = 'Points';\n\n\t\t\tconst vLen = this.vertices.length;\n\n\t\t\tfor ( let vi = 0, l = vertices.length; vi < l; vi ++ ) {\n\n\t\t\t\tconst index = this.parseVertexIndex( vertices[ vi ], vLen );\n\n\t\t\t\tthis.addVertexPoint( index );\n\t\t\t\tthis.addColor( index );\n\n\t\t\t}\n\n\t\t},\n\n\t\taddLineGeometry: function ( vertices, uvs ) {\n\n\t\t\tthis.object.geometry.type = 'Line';\n\n\t\t\tconst vLen = this.vertices.length;\n\t\t\tconst uvLen = this.uvs.length;\n\n\t\t\tfor ( let vi = 0, l = vertices.length; vi < l; vi ++ ) {\n\n\t\t\t\tthis.addVertexLine( this.parseVertexIndex( vertices[ vi ], vLen ) );\n\n\t\t\t}\n\n\t\t\tfor ( let uvi = 0, l = uvs.length; uvi < l; uvi ++ ) {\n\n\t\t\t\tthis.addUVLine( this.parseUVIndex( uvs[ uvi ], uvLen ) );\n\n\t\t\t}\n\n\t\t}\n\n\t};\n\n\tstate.startObject( '', false );\n\n\treturn state;\n\n}\n\n\n/**\n * A loader for the OBJ format.\n *\n * The [OBJ format](https://en.wikipedia.org/wiki/Wavefront_.obj_file) is a simple data-format that\n * represents 3D geometry in a human readable format as the position of each vertex, the UV position of\n * each texture coordinate vertex, vertex normals, and the faces that make each polygon defined as a list\n * of vertices, and texture vertices.\n *\n * ```js\n * const loader = new OBJLoader();\n * const object = await loader.loadAsync( 'models/monster.obj' );\n * scene.add( object );\n * ```\n *\n * @augments Loader\n * @three_import import { OBJLoader } from 'three/addons/loaders/OBJLoader.js';\n */\nclass OBJLoader extends Loader {\n\n\t/**\n\t * Constructs a new OBJ loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * A reference to a material creator.\n\t\t *\n\t\t * @type {?MaterialCreator}\n\t\t * @default null\n\t\t */\n\t\tthis.materials = null;\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded OBJ asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Group)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( text ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Sets the material creator for this OBJ. This object is loaded via {@link MTLLoader}.\n\t *\n\t * @param {MaterialCreator} materials - An object that creates the materials for this OBJ.\n\t * @return {OBJLoader} A reference to this loader.\n\t */\n\tsetMaterials( materials ) {\n\n\t\tthis.materials = materials;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Parses the given OBJ data and returns the resulting group.\n\t *\n\t * @param {string} text - The raw OBJ data as a string.\n\t * @return {Group} The parsed OBJ.\n\t */\n\tparse( text ) {\n\n\t\tconst state = new ParserState();\n\n\t\tif ( text.indexOf( '\\r\\n' ) !== - 1 ) {\n\n\t\t\t// This is faster than String.split with regex that splits on both\n\t\t\ttext = text.replace( /\\r\\n/g, '\\n' );\n\n\t\t}\n\n\t\tif ( text.indexOf( '\\\\\\n' ) !== - 1 ) {\n\n\t\t\t// join lines separated by a line continuation character (\\)\n\t\t\ttext = text.replace( /\\\\\\n/g, '' );\n\n\t\t}\n\n\t\tconst lines = text.split( '\\n' );\n\t\tlet result = [];\n\n\t\tfor ( let i = 0, l = lines.length; i < l; i ++ ) {\n\n\t\t\tconst line = lines[ i ].trimStart();\n\n\t\t\tif ( line.length === 0 ) continue;\n\n\t\t\tconst lineFirstChar = line.charAt( 0 );\n\n\t\t\t// @todo invoke passed in handler if any\n\t\t\tif ( lineFirstChar === '#' ) continue; // skip comments\n\n\t\t\tif ( lineFirstChar === 'v' ) {\n\n\t\t\t\tconst data = line.split( _face_vertex_data_separator_pattern );\n\n\t\t\t\tswitch ( data[ 0 ] ) {\n\n\t\t\t\t\tcase 'v':\n\t\t\t\t\t\tstate.vertices.push(\n\t\t\t\t\t\t\tparseFloat( data[ 1 ] ),\n\t\t\t\t\t\t\tparseFloat( data[ 2 ] ),\n\t\t\t\t\t\t\tparseFloat( data[ 3 ] )\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif ( data.length >= 7 ) {\n\n\t\t\t\t\t\t\t_color.setRGB(\n\t\t\t\t\t\t\t\tparseFloat( data[ 4 ] ),\n\t\t\t\t\t\t\t\tparseFloat( data[ 5 ] ),\n\t\t\t\t\t\t\t\tparseFloat( data[ 6 ] ),\n\t\t\t\t\t\t\t\tSRGBColorSpace\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tstate.colors.push( _color.r, _color.g, _color.b );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// if no colors are defined, add placeholders so color and vertex indices match\n\n\t\t\t\t\t\t\tstate.colors.push( undefined, undefined, undefined );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'vn':\n\t\t\t\t\t\tstate.normals.push(\n\t\t\t\t\t\t\tparseFloat( data[ 1 ] ),\n\t\t\t\t\t\t\tparseFloat( data[ 2 ] ),\n\t\t\t\t\t\t\tparseFloat( data[ 3 ] )\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'vt':\n\t\t\t\t\t\tstate.uvs.push(\n\t\t\t\t\t\t\tparseFloat( data[ 1 ] ),\n\t\t\t\t\t\t\tparseFloat( data[ 2 ] )\n\t\t\t\t\t\t);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t} else if ( lineFirstChar === 'f' ) {\n\n\t\t\t\tconst lineData = line.slice( 1 ).trim();\n\t\t\t\tconst vertexData = lineData.split( _face_vertex_data_separator_pattern );\n\t\t\t\tconst faceVertices = [];\n\n\t\t\t\t// Parse the face vertex data into an easy to work with format\n\n\t\t\t\tfor ( let j = 0, jl = vertexData.length; j < jl; j ++ ) {\n\n\t\t\t\t\tconst vertex = vertexData[ j ];\n\n\t\t\t\t\tif ( vertex.length > 0 ) {\n\n\t\t\t\t\t\tconst vertexParts = vertex.split( '/' );\n\t\t\t\t\t\tfaceVertices.push( vertexParts );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Draw an edge between the first vertex and all subsequent vertices to form an n-gon\n\n\t\t\t\tconst v1 = faceVertices[ 0 ];\n\n\t\t\t\tfor ( let j = 1, jl = faceVertices.length - 1; j < jl; j ++ ) {\n\n\t\t\t\t\tconst v2 = faceVertices[ j ];\n\t\t\t\t\tconst v3 = faceVertices[ j + 1 ];\n\n\t\t\t\t\tstate.addFace(\n\t\t\t\t\t\tv1[ 0 ], v2[ 0 ], v3[ 0 ],\n\t\t\t\t\t\tv1[ 1 ], v2[ 1 ], v3[ 1 ],\n\t\t\t\t\t\tv1[ 2 ], v2[ 2 ], v3[ 2 ]\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t} else if ( lineFirstChar === 'l' ) {\n\n\t\t\t\tconst lineParts = line.substring( 1 ).trim().split( ' ' );\n\t\t\t\tlet lineVertices = [];\n\t\t\t\tconst lineUVs = [];\n\n\t\t\t\tif ( line.indexOf( '/' ) === - 1 ) {\n\n\t\t\t\t\tlineVertices = lineParts;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tfor ( let li = 0, llen = lineParts.length; li < llen; li ++ ) {\n\n\t\t\t\t\t\tconst parts = lineParts[ li ].split( '/' );\n\n\t\t\t\t\t\tif ( parts[ 0 ] !== '' ) lineVertices.push( parts[ 0 ] );\n\t\t\t\t\t\tif ( parts[ 1 ] !== '' ) lineUVs.push( parts[ 1 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tstate.addLineGeometry( lineVertices, lineUVs );\n\n\t\t\t} else if ( lineFirstChar === 'p' ) {\n\n\t\t\t\tconst lineData = line.slice( 1 ).trim();\n\t\t\t\tconst pointData = lineData.split( ' ' );\n\n\t\t\t\tstate.addPointGeometry( pointData );\n\n\t\t\t} else if ( ( result = _object_pattern.exec( line ) ) !== null ) {\n\n\t\t\t\t// o object_name\n\t\t\t\t// or\n\t\t\t\t// g group_name\n\n\t\t\t\t// WORKAROUND: https://bugs.chromium.org/p/v8/issues/detail?id=2869\n\t\t\t\t// let name = result[ 0 ].slice( 1 ).trim();\n\t\t\t\tconst name = ( ' ' + result[ 0 ].slice( 1 ).trim() ).slice( 1 );\n\n\t\t\t\tstate.startObject( name );\n\n\t\t\t} else if ( _material_use_pattern.test( line ) ) {\n\n\t\t\t\t// material\n\n\t\t\t\tstate.object.startMaterial( line.substring( 7 ).trim(), state.materialLibraries );\n\n\t\t\t} else if ( _material_library_pattern.test( line ) ) {\n\n\t\t\t\t// mtl file\n\n\t\t\t\tstate.materialLibraries.push( line.substring( 7 ).trim() );\n\n\t\t\t} else if ( _map_use_pattern.test( line ) ) {\n\n\t\t\t\t// the line is parsed but ignored since the loader assumes textures are defined MTL files\n\t\t\t\t// (according to https://www.okino.com/conv/imp_wave.htm, 'usemap' is the old-style Wavefront texture reference method)\n\n\t\t\t\tconsole.warn( 'THREE.OBJLoader: Rendering identifier \"usemap\" not supported. Textures must be defined in MTL files.' );\n\n\t\t\t} else if ( lineFirstChar === 's' ) {\n\n\t\t\t\tresult = line.split( ' ' );\n\n\t\t\t\t// smooth shading\n\n\t\t\t\t// @todo Handle files that have varying smooth values for a set of faces inside one geometry,\n\t\t\t\t// but does not define a usemtl for each face set.\n\t\t\t\t// This should be detected and a dummy material created (later MultiMaterial and geometry groups).\n\t\t\t\t// This requires some care to not create extra material on each smooth value for \"normal\" obj files.\n\t\t\t\t// where explicit usemtl defines geometry groups.\n\t\t\t\t// Example asset: examples/models/obj/cerberus/Cerberus.obj\n\n\t\t\t\t/*\n\t\t\t\t\t * http://paulbourke.net/dataformats/obj/\n\t\t\t\t\t *\n\t\t\t\t\t * From chapter \"Grouping\" Syntax explanation \"s group_number\":\n\t\t\t\t\t * \"group_number is the smoothing group number. To turn off smoothing groups, use a value of 0 or off.\n\t\t\t\t\t * Polygonal elements use group numbers to put elements in different smoothing groups. For free-form\n\t\t\t\t\t * surfaces, smoothing groups are either turned on or off; there is no difference between values greater\n\t\t\t\t\t * than 0.\"\n\t\t\t\t\t */\n\t\t\t\tif ( result.length > 1 ) {\n\n\t\t\t\t\tconst value = result[ 1 ].trim().toLowerCase();\n\t\t\t\t\tstate.object.smooth = ( value !== '0' && value !== 'off' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// ZBrush can produce \"s\" lines #11707\n\t\t\t\t\tstate.object.smooth = true;\n\n\t\t\t\t}\n\n\t\t\t\tconst material = state.object.currentMaterial();\n\t\t\t\tif ( material ) material.smooth = state.object.smooth;\n\n\t\t\t} else {\n\n\t\t\t\t// Handle null terminated files without exception\n\t\t\t\tif ( line === '\\0' ) continue;\n\n\t\t\t\tconsole.warn( 'THREE.OBJLoader: Unexpected line: \"' + line + '\"' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tstate.finalize();\n\n\t\tconst container = new Group();\n\t\tcontainer.materialLibraries = [].concat( state.materialLibraries );\n\n\t\tconst hasPrimitives = ! ( state.objects.length === 1 && state.objects[ 0 ].geometry.vertices.length === 0 );\n\n\t\tif ( hasPrimitives === true ) {\n\n\t\t\tfor ( let i = 0, l = state.objects.length; i < l; i ++ ) {\n\n\t\t\t\tconst object = state.objects[ i ];\n\t\t\t\tconst geometry = object.geometry;\n\t\t\t\tconst materials = object.materials;\n\t\t\t\tconst isLine = ( geometry.type === 'Line' );\n\t\t\t\tconst isPoints = ( geometry.type === 'Points' );\n\t\t\t\tlet hasVertexColors = false;\n\n\t\t\t\t// Skip o/g line declarations that did not follow with any faces\n\t\t\t\tif ( geometry.vertices.length === 0 ) continue;\n\n\t\t\t\tconst buffergeometry = new BufferGeometry();\n\n\t\t\t\tbuffergeometry.setAttribute( 'position', new Float32BufferAttribute( geometry.vertices, 3 ) );\n\n\t\t\t\tif ( geometry.normals.length > 0 ) {\n\n\t\t\t\t\tbuffergeometry.setAttribute( 'normal', new Float32BufferAttribute( geometry.normals, 3 ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.colors.length > 0 ) {\n\n\t\t\t\t\thasVertexColors = true;\n\t\t\t\t\tbuffergeometry.setAttribute( 'color', new Float32BufferAttribute( geometry.colors, 3 ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( geometry.hasUVIndices === true ) {\n\n\t\t\t\t\tbuffergeometry.setAttribute( 'uv', new Float32BufferAttribute( geometry.uvs, 2 ) );\n\n\t\t\t\t}\n\n\t\t\t\t// Create materials\n\n\t\t\t\tconst createdMaterials = [];\n\n\t\t\t\tfor ( let mi = 0, miLen = materials.length; mi < miLen; mi ++ ) {\n\n\t\t\t\t\tconst sourceMaterial = materials[ mi ];\n\t\t\t\t\tconst materialHash = sourceMaterial.name + '_' + sourceMaterial.smooth + '_' + hasVertexColors;\n\t\t\t\t\tlet material = state.materials[ materialHash ];\n\n\t\t\t\t\tif ( this.materials !== null ) {\n\n\t\t\t\t\t\tmaterial = this.materials.create( sourceMaterial.name );\n\n\t\t\t\t\t\t// mtl etc. loaders probably can't create line materials correctly, copy properties to a line material.\n\t\t\t\t\t\tif ( isLine && material && ! ( material instanceof LineBasicMaterial ) ) {\n\n\t\t\t\t\t\t\tconst materialLine = new LineBasicMaterial();\n\t\t\t\t\t\t\tMaterial.prototype.copy.call( materialLine, material );\n\t\t\t\t\t\t\tmaterialLine.color.copy( material.color );\n\t\t\t\t\t\t\tmaterial = materialLine;\n\n\t\t\t\t\t\t} else if ( isPoints && material && ! ( material instanceof PointsMaterial ) ) {\n\n\t\t\t\t\t\t\tconst materialPoints = new PointsMaterial( { size: 10, sizeAttenuation: false } );\n\t\t\t\t\t\t\tMaterial.prototype.copy.call( materialPoints, material );\n\t\t\t\t\t\t\tmaterialPoints.color.copy( material.color );\n\t\t\t\t\t\t\tmaterialPoints.map = material.map;\n\t\t\t\t\t\t\tmaterial = materialPoints;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( material === undefined ) {\n\n\t\t\t\t\t\tif ( isLine ) {\n\n\t\t\t\t\t\t\tmaterial = new LineBasicMaterial();\n\n\t\t\t\t\t\t} else if ( isPoints ) {\n\n\t\t\t\t\t\t\tmaterial = new PointsMaterial( { size: 1, sizeAttenuation: false } );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tmaterial = new MeshPhongMaterial();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tmaterial.name = sourceMaterial.name;\n\t\t\t\t\t\tmaterial.flatShading = sourceMaterial.smooth ? false : true;\n\t\t\t\t\t\tmaterial.vertexColors = hasVertexColors;\n\n\t\t\t\t\t\tstate.materials[ materialHash ] = material;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcreatedMaterials.push( material );\n\n\t\t\t\t}\n\n\t\t\t\t// Create mesh\n\n\t\t\t\tlet mesh;\n\n\t\t\t\tif ( createdMaterials.length > 1 ) {\n\n\t\t\t\t\tfor ( let mi = 0, miLen = materials.length; mi < miLen; mi ++ ) {\n\n\t\t\t\t\t\tconst sourceMaterial = materials[ mi ];\n\t\t\t\t\t\tbuffergeometry.addGroup( sourceMaterial.groupStart, sourceMaterial.groupCount, mi );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isLine ) {\n\n\t\t\t\t\t\tmesh = new LineSegments( buffergeometry, createdMaterials );\n\n\t\t\t\t\t} else if ( isPoints ) {\n\n\t\t\t\t\t\tmesh = new Points( buffergeometry, createdMaterials );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tmesh = new Mesh( buffergeometry, createdMaterials );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( isLine ) {\n\n\t\t\t\t\t\tmesh = new LineSegments( buffergeometry, createdMaterials[ 0 ] );\n\n\t\t\t\t\t} else if ( isPoints ) {\n\n\t\t\t\t\t\tmesh = new Points( buffergeometry, createdMaterials[ 0 ] );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tmesh = new Mesh( buffergeometry, createdMaterials[ 0 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tmesh.name = object.name;\n\n\t\t\t\tcontainer.add( mesh );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// if there is only the default parser state object with no geometry data, interpret data as point cloud\n\n\t\t\tif ( state.vertices.length > 0 ) {\n\n\t\t\t\tconst material = new PointsMaterial( { size: 1, sizeAttenuation: false } );\n\n\t\t\t\tconst buffergeometry = new BufferGeometry();\n\n\t\t\t\tbuffergeometry.setAttribute( 'position', new Float32BufferAttribute( state.vertices, 3 ) );\n\n\t\t\t\tif ( state.colors.length > 0 && state.colors[ 0 ] !== undefined ) {\n\n\t\t\t\t\tbuffergeometry.setAttribute( 'color', new Float32BufferAttribute( state.colors, 3 ) );\n\t\t\t\t\tmaterial.vertexColors = true;\n\n\t\t\t\t}\n\n\t\t\t\tconst points = new Points( buffergeometry, material );\n\t\t\t\tcontainer.add( points );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn container;\n\n\t}\n\n}\n\nexport { OBJLoader };\n", "import {\n\tBufferGeometry,\n\tColor,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tInt32BufferAttribute,\n\tLoader,\n\tPoints,\n\tPointsMaterial,\n\tSRGBColorSpace\n} from 'three';\n\n/**\n * A loader for the Point Cloud Data (PCD) format.\n *\n * PCDLoader supports ASCII and (compressed) binary files as well as the following PCD fields:\n * - x y z\n * - rgb\n * - normal_x normal_y normal_z\n * - intensity\n * - label\n *\n * ```js\n * const loader = new PCDLoader();\n *\n * const points = await loader.loadAsync( './models/pcd/binary/Zaghetto.pcd' );\n * points.geometry.center(); // optional\n * points.geometry.rotateX( Math.PI ); // optional\n * scene.add( points );\n * ```\n *\n * @augments Loader\n * @three_import import { PCDLoader } from 'three/addons/loaders/PCDLoader.js';\n */\nclass PCDLoader extends Loader {\n\n\t/**\n\t * Constructs a new PCD loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * Whether to use little Endian or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.littleEndian = true;\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded PCD asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Points)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( data ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( data ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Get dataview value by field type and size.\n\t *\n\t * @private\n\t * @param {DataView} dataview - The DataView to read from.\n\t * @param {number} offset - The offset to start reading from.\n\t * @param {'F' | 'U' | 'I'} type - Field type.\n\t * @param {number} size - Field size.\n\t * @returns {number} Field value.\n\t */\n\t_getDataView( dataview, offset, type, size ) {\n\n\t\tswitch ( type ) {\n\n\t\t\tcase 'F': {\n\n\t\t\t\tif ( size === 8 ) {\n\n\t\t\t\t\treturn dataview.getFloat64( offset, this.littleEndian );\n\n\t\t\t\t}\n\n\t\t\t\treturn dataview.getFloat32( offset, this.littleEndian );\n\n\t\t\t}\n\n\t\t\tcase 'I': {\n\n\t\t\t\tif ( size === 1 ) {\n\n\t\t\t\t\treturn dataview.getInt8( offset );\n\n\t\t\t\t}\n\n\t\t\t\tif ( size === 2 ) {\n\n\t\t\t\t\treturn dataview.getInt16( offset, this.littleEndian );\n\n\t\t\t\t}\n\n\t\t\t\treturn dataview.getInt32( offset, this.littleEndian );\n\n\t\t\t}\n\n\t\t\tcase 'U': {\n\n\t\t\t\tif ( size === 1 ) {\n\n\t\t\t\t\treturn dataview.getUint8( offset );\n\n\t\t\t\t}\n\n\t\t\t\tif ( size === 2 ) {\n\n\t\t\t\t\treturn dataview.getUint16( offset, this.littleEndian );\n\n\t\t\t\t}\n\n\t\t\t\treturn dataview.getUint32( offset, this.littleEndian );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Parses the given PCD data and returns a point cloud.\n\t *\n\t * @param {ArrayBuffer} data - The raw PCD data as an array buffer.\n\t * @return {Points} The parsed point cloud.\n\t */\n\tparse( data ) {\n\n\t\t// from https://gitlab.com/taketwo/three-pcd-loader/blob/master/decompress-lzf.js\n\n\t\tfunction decompressLZF( inData, outLength ) {\n\n\t\t\tconst inLength = inData.length;\n\t\t\tconst outData = new Uint8Array( outLength );\n\t\t\tlet inPtr = 0;\n\t\t\tlet outPtr = 0;\n\t\t\tlet ctrl;\n\t\t\tlet len;\n\t\t\tlet ref;\n\t\t\tdo {\n\n\t\t\t\tctrl = inData[ inPtr ++ ];\n\t\t\t\tif ( ctrl < ( 1 << 5 ) ) {\n\n\t\t\t\t\tctrl ++;\n\t\t\t\t\tif ( outPtr + ctrl > outLength ) throw new Error( 'Output buffer is not large enough' );\n\t\t\t\t\tif ( inPtr + ctrl > inLength ) throw new Error( 'Invalid compressed data' );\n\t\t\t\t\tdo {\n\n\t\t\t\t\t\toutData[ outPtr ++ ] = inData[ inPtr ++ ];\n\n\t\t\t\t\t} while ( -- ctrl );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlen = ctrl >> 5;\n\t\t\t\t\tref = outPtr - ( ( ctrl & 0x1f ) << 8 ) - 1;\n\t\t\t\t\tif ( inPtr >= inLength ) throw new Error( 'Invalid compressed data' );\n\t\t\t\t\tif ( len === 7 ) {\n\n\t\t\t\t\t\tlen += inData[ inPtr ++ ];\n\t\t\t\t\t\tif ( inPtr >= inLength ) throw new Error( 'Invalid compressed data' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tref -= inData[ inPtr ++ ];\n\t\t\t\t\tif ( outPtr + len + 2 > outLength ) throw new Error( 'Output buffer is not large enough' );\n\t\t\t\t\tif ( ref < 0 ) throw new Error( 'Invalid compressed data' );\n\t\t\t\t\tif ( ref >= outPtr ) throw new Error( 'Invalid compressed data' );\n\t\t\t\t\tdo {\n\n\t\t\t\t\t\toutData[ outPtr ++ ] = outData[ ref ++ ];\n\n\t\t\t\t\t} while ( -- len + 2 );\n\n\t\t\t\t}\n\n\t\t\t} while ( inPtr < inLength );\n\n\t\t\treturn outData;\n\n\t\t}\n\n\t\tfunction parseHeader( binaryData ) {\n\n\t\t\tconst PCDheader = {};\n\n\t\t\tconst buffer = new Uint8Array( binaryData );\n\n\t\t\tlet data = '', line = '', i = 0, end = false;\n\n\t\t\tconst max = buffer.length;\n\n\t\t\twhile ( i < max && end === false ) {\n\n\t\t\t\tconst char = String.fromCharCode( buffer[ i ++ ] );\n\n\t\t\t\tif ( char === '\\n' || char === '\\r' ) {\n\n\t\t\t\t\tif ( line.trim().toLowerCase().startsWith( 'data' ) ) {\n\n\t\t\t\t\t\tend = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tline = '';\n\n\t\t\t\t} else {\n\n\t\t\t\t\tline += char;\n\n\t\t\t\t}\n\n\t\t\t\tdata += char;\n\n\t\t\t}\n\n\t\t\tconst result1 = data.search( /[\\r\\n]DATA\\s(\\S*)\\s/i );\n\t\t\tconst result2 = /[\\r\\n]DATA\\s(\\S*)\\s/i.exec( data.slice( result1 - 1 ) );\n\n\t\t\tPCDheader.data = result2[ 1 ];\n\t\t\tPCDheader.headerLen = result2[ 0 ].length + result1;\n\t\t\tPCDheader.str = data.slice( 0, PCDheader.headerLen );\n\n\t\t\t// remove comments\n\n\t\t\tPCDheader.str = PCDheader.str.replace( /#.*/gi, '' );\n\n\t\t\t// parse\n\n\t\t\tPCDheader.version = /^VERSION (.*)/im.exec( PCDheader.str );\n\t\t\tPCDheader.fields = /^FIELDS (.*)/im.exec( PCDheader.str );\n\t\t\tPCDheader.size = /^SIZE (.*)/im.exec( PCDheader.str );\n\t\t\tPCDheader.type = /^TYPE (.*)/im.exec( PCDheader.str );\n\t\t\tPCDheader.count = /^COUNT (.*)/im.exec( PCDheader.str );\n\t\t\tPCDheader.width = /^WIDTH (.*)/im.exec( PCDheader.str );\n\t\t\tPCDheader.height = /^HEIGHT (.*)/im.exec( PCDheader.str );\n\t\t\tPCDheader.viewpoint = /^VIEWPOINT (.*)/im.exec( PCDheader.str );\n\t\t\tPCDheader.points = /^POINTS (.*)/im.exec( PCDheader.str );\n\n\t\t\t// evaluate\n\n\t\t\tif ( PCDheader.version !== null )\n\t\t\t\tPCDheader.version = parseFloat( PCDheader.version[ 1 ] );\n\n\t\t\tPCDheader.fields = ( PCDheader.fields !== null ) ? PCDheader.fields[ 1 ].split( ' ' ) : [];\n\n\t\t\tif ( PCDheader.type !== null )\n\t\t\t\tPCDheader.type = PCDheader.type[ 1 ].split( ' ' );\n\n\t\t\tif ( PCDheader.width !== null )\n\t\t\t\tPCDheader.width = parseInt( PCDheader.width[ 1 ] );\n\n\t\t\tif ( PCDheader.height !== null )\n\t\t\t\tPCDheader.height = parseInt( PCDheader.height[ 1 ] );\n\n\t\t\tif ( PCDheader.viewpoint !== null )\n\t\t\t\tPCDheader.viewpoint = PCDheader.viewpoint[ 1 ];\n\n\t\t\tif ( PCDheader.points !== null )\n\t\t\t\tPCDheader.points = parseInt( PCDheader.points[ 1 ], 10 );\n\n\t\t\tif ( PCDheader.points === null )\n\t\t\t\tPCDheader.points = PCDheader.width * PCDheader.height;\n\n\t\t\tif ( PCDheader.size !== null ) {\n\n\t\t\t\tPCDheader.size = PCDheader.size[ 1 ].split( ' ' ).map( function ( x ) {\n\n\t\t\t\t\treturn parseInt( x, 10 );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( PCDheader.count !== null ) {\n\n\t\t\t\tPCDheader.count = PCDheader.count[ 1 ].split( ' ' ).map( function ( x ) {\n\n\t\t\t\t\treturn parseInt( x, 10 );\n\n\t\t\t\t} );\n\n\t\t\t} else {\n\n\t\t\t\tPCDheader.count = [];\n\n\t\t\t\tfor ( let i = 0, l = PCDheader.fields.length; i < l; i ++ ) {\n\n\t\t\t\t\tPCDheader.count.push( 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tPCDheader.offset = {};\n\n\t\t\tlet sizeSum = 0;\n\n\t\t\tfor ( let i = 0, l = PCDheader.fields.length; i < l; i ++ ) {\n\n\t\t\t\tif ( PCDheader.data === 'ascii' ) {\n\n\t\t\t\t\tPCDheader.offset[ PCDheader.fields[ i ] ] = i;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tPCDheader.offset[ PCDheader.fields[ i ] ] = sizeSum;\n\t\t\t\t\tsizeSum += PCDheader.size[ i ] * PCDheader.count[ i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// for binary only\n\n\t\t\tPCDheader.rowSize = sizeSum;\n\n\t\t\treturn PCDheader;\n\n\t\t}\n\n\t\t// parse header\n\n\t\tconst PCDheader = parseHeader( data );\n\n\t\t// parse data\n\n\t\tconst position = [];\n\t\tconst normal = [];\n\t\tconst color = [];\n\t\tconst intensity = [];\n\t\tconst label = [];\n\n\t\tconst c = new Color();\n\n\t\t// ascii\n\n\t\tif ( PCDheader.data === 'ascii' ) {\n\n\t\t\tconst offset = PCDheader.offset;\n\t\t\tconst textData = new TextDecoder().decode( data );\n\t\t\tconst pcdData = textData.slice( PCDheader.headerLen );\n\t\t\tconst lines = pcdData.split( '\\n' );\n\n\t\t\tfor ( let i = 0, l = lines.length; i < l; i ++ ) {\n\n\t\t\t\tif ( lines[ i ] === '' ) continue;\n\n\t\t\t\tconst line = lines[ i ].split( ' ' );\n\n\t\t\t\tif ( offset.x !== undefined ) {\n\n\t\t\t\t\tposition.push( parseFloat( line[ offset.x ] ) );\n\t\t\t\t\tposition.push( parseFloat( line[ offset.y ] ) );\n\t\t\t\t\tposition.push( parseFloat( line[ offset.z ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( offset.rgb !== undefined ) {\n\n\t\t\t\t\tconst rgb_field_index = PCDheader.fields.findIndex( ( field ) => field === 'rgb' );\n\t\t\t\t\tconst rgb_type = PCDheader.type[ rgb_field_index ];\n\n\t\t\t\t\tconst float = parseFloat( line[ offset.rgb ] );\n\t\t\t\t\tlet rgb = float;\n\n\t\t\t\t\tif ( rgb_type === 'F' ) {\n\n\t\t\t\t\t\t// treat float values as int\n\t\t\t\t\t\t// https://github.com/daavoo/pyntcloud/pull/204/commits/7b4205e64d5ed09abe708b2e91b615690c24d518\n\t\t\t\t\t\tconst farr = new Float32Array( 1 );\n\t\t\t\t\t\tfarr[ 0 ] = float;\n\t\t\t\t\t\trgb = new Int32Array( farr.buffer )[ 0 ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst r = ( ( rgb >> 16 ) & 0x0000ff ) / 255;\n\t\t\t\t\tconst g = ( ( rgb >> 8 ) & 0x0000ff ) / 255;\n\t\t\t\t\tconst b = ( ( rgb >> 0 ) & 0x0000ff ) / 255;\n\n\t\t\t\t\tc.setRGB( r, g, b, SRGBColorSpace );\n\n\t\t\t\t\tcolor.push( c.r, c.g, c.b );\n\n\t\t\t\t}\n\n\t\t\t\tif ( offset.normal_x !== undefined ) {\n\n\t\t\t\t\tnormal.push( parseFloat( line[ offset.normal_x ] ) );\n\t\t\t\t\tnormal.push( parseFloat( line[ offset.normal_y ] ) );\n\t\t\t\t\tnormal.push( parseFloat( line[ offset.normal_z ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( offset.intensity !== undefined ) {\n\n\t\t\t\t\tintensity.push( parseFloat( line[ offset.intensity ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( offset.label !== undefined ) {\n\n\t\t\t\t\tlabel.push( parseInt( line[ offset.label ] ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// binary-compressed\n\n\t\t// normally data in PCD files are organized as array of structures: XYZRGBXYZRGB\n\t\t// binary compressed PCD files organize their data as structure of arrays: XXYYZZRGBRGB\n\t\t// that requires a totally different parsing approach compared to non-compressed data\n\n\t\tif ( PCDheader.data === 'binary_compressed' ) {\n\n\t\t\tconst sizes = new Uint32Array( data.slice( PCDheader.headerLen, PCDheader.headerLen + 8 ) );\n\t\t\tconst compressedSize = sizes[ 0 ];\n\t\t\tconst decompressedSize = sizes[ 1 ];\n\t\t\tconst decompressed = decompressLZF( new Uint8Array( data, PCDheader.headerLen + 8, compressedSize ), decompressedSize );\n\t\t\tconst dataview = new DataView( decompressed.buffer );\n\n\t\t\tconst offset = PCDheader.offset;\n\n\t\t\tfor ( let i = 0; i < PCDheader.points; i ++ ) {\n\n\t\t\t\tif ( offset.x !== undefined ) {\n\n\t\t\t\t\tconst xIndex = PCDheader.fields.indexOf( 'x' );\n\t\t\t\t\tconst yIndex = PCDheader.fields.indexOf( 'y' );\n\t\t\t\t\tconst zIndex = PCDheader.fields.indexOf( 'z' );\n\t\t\t\t\tposition.push( this._getDataView( dataview, ( PCDheader.points * offset.x ) + PCDheader.size[ xIndex ] * i, PCDheader.type[ xIndex ], PCDheader.size[ xIndex ] ) );\n\t\t\t\t\tposition.push( this._getDataView( dataview, ( PCDheader.points * offset.y ) + PCDheader.size[ yIndex ] * i, PCDheader.type[ yIndex ], PCDheader.size[ yIndex ] ) );\n\t\t\t\t\tposition.push( this._getDataView( dataview, ( PCDheader.points * offset.z ) + PCDheader.size[ zIndex ] * i, PCDheader.type[ zIndex ], PCDheader.size[ zIndex ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( offset.rgb !== undefined ) {\n\n\t\t\t\t\tconst rgbIndex = PCDheader.fields.indexOf( 'rgb' );\n\n\t\t\t\t\tconst r = dataview.getUint8( ( PCDheader.points * offset.rgb ) + PCDheader.size[ rgbIndex ] * i + 2 ) / 255.0;\n\t\t\t\t\tconst g = dataview.getUint8( ( PCDheader.points * offset.rgb ) + PCDheader.size[ rgbIndex ] * i + 1 ) / 255.0;\n\t\t\t\t\tconst b = dataview.getUint8( ( PCDheader.points * offset.rgb ) + PCDheader.size[ rgbIndex ] * i + 0 ) / 255.0;\n\n\t\t\t\t\tc.setRGB( r, g, b, SRGBColorSpace );\n\n\t\t\t\t\tcolor.push( c.r, c.g, c.b );\n\n\t\t\t\t}\n\n\t\t\t\tif ( offset.normal_x !== undefined ) {\n\n\t\t\t\t\tconst xIndex = PCDheader.fields.indexOf( 'normal_x' );\n\t\t\t\t\tconst yIndex = PCDheader.fields.indexOf( 'normal_y' );\n\t\t\t\t\tconst zIndex = PCDheader.fields.indexOf( 'normal_z' );\n\t\t\t\t\tnormal.push( this._getDataView( dataview, ( PCDheader.points * offset.normal_x ) + PCDheader.size[ xIndex ] * i, PCDheader.type[ xIndex ], PCDheader.size[ xIndex ] ) );\n\t\t\t\t\tnormal.push( this._getDataView( dataview, ( PCDheader.points * offset.normal_y ) + PCDheader.size[ yIndex ] * i, PCDheader.type[ yIndex ], PCDheader.size[ yIndex ] ) );\n\t\t\t\t\tnormal.push( this._getDataView( dataview, ( PCDheader.points * offset.normal_z ) + PCDheader.size[ zIndex ] * i, PCDheader.type[ zIndex ], PCDheader.size[ zIndex ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( offset.intensity !== undefined ) {\n\n\t\t\t\t\tconst intensityIndex = PCDheader.fields.indexOf( 'intensity' );\n\t\t\t\t\tintensity.push( this._getDataView( dataview, ( PCDheader.points * offset.intensity ) + PCDheader.size[ intensityIndex ] * i, PCDheader.type[ intensityIndex ], PCDheader.size[ intensityIndex ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( offset.label !== undefined ) {\n\n\t\t\t\t\tconst labelIndex = PCDheader.fields.indexOf( 'label' );\n\t\t\t\t\tlabel.push( dataview.getInt32( ( PCDheader.points * offset.label ) + PCDheader.size[ labelIndex ] * i, this.littleEndian ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// binary\n\n\t\tif ( PCDheader.data === 'binary' ) {\n\n\t\t\tconst dataview = new DataView( data, PCDheader.headerLen );\n\t\t\tconst offset = PCDheader.offset;\n\n\t\t\tfor ( let i = 0, row = 0; i < PCDheader.points; i ++, row += PCDheader.rowSize ) {\n\n\t\t\t\tif ( offset.x !== undefined ) {\n\n\t\t\t\t\tconst xIndex = PCDheader.fields.indexOf( 'x' );\n\t\t\t\t\tconst yIndex = PCDheader.fields.indexOf( 'y' );\n\t\t\t\t\tconst zIndex = PCDheader.fields.indexOf( 'z' );\n\t\t\t\t\tposition.push( this._getDataView( dataview, row + offset.x, PCDheader.type[ xIndex ], PCDheader.size[ xIndex ] ) );\n\t\t\t\t\tposition.push( this._getDataView( dataview, row + offset.y, PCDheader.type[ yIndex ], PCDheader.size[ yIndex ] ) );\n\t\t\t\t\tposition.push( this._getDataView( dataview, row + offset.z, PCDheader.type[ zIndex ], PCDheader.size[ zIndex ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( offset.rgb !== undefined ) {\n\n\t\t\t\t\tconst r = dataview.getUint8( row + offset.rgb + 2 ) / 255.0;\n\t\t\t\t\tconst g = dataview.getUint8( row + offset.rgb + 1 ) / 255.0;\n\t\t\t\t\tconst b = dataview.getUint8( row + offset.rgb + 0 ) / 255.0;\n\n\t\t\t\t\tc.setRGB( r, g, b, SRGBColorSpace );\n\n\t\t\t\t\tcolor.push( c.r, c.g, c.b );\n\n\t\t\t\t}\n\n\t\t\t\tif ( offset.normal_x !== undefined ) {\n\n\t\t\t\t\tconst xIndex = PCDheader.fields.indexOf( 'normal_x' );\n\t\t\t\t\tconst yIndex = PCDheader.fields.indexOf( 'normal_y' );\n\t\t\t\t\tconst zIndex = PCDheader.fields.indexOf( 'normal_z' );\n\t\t\t\t\tnormal.push( this._getDataView( dataview, row + offset.normal_x, PCDheader.type[ xIndex ], PCDheader.size[ xIndex ] ) );\n\t\t\t\t\tnormal.push( this._getDataView( dataview, row + offset.normal_y, PCDheader.type[ yIndex ], PCDheader.size[ yIndex ] ) );\n\t\t\t\t\tnormal.push( this._getDataView( dataview, row + offset.normal_z, PCDheader.type[ zIndex ], PCDheader.size[ zIndex ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( offset.intensity !== undefined ) {\n\n\t\t\t\t\tconst intensityIndex = PCDheader.fields.indexOf( 'intensity' );\n\t\t\t\t\tintensity.push( this._getDataView( dataview, row + offset.intensity, PCDheader.type[ intensityIndex ], PCDheader.size[ intensityIndex ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( offset.label !== undefined ) {\n\n\t\t\t\t\tlabel.push( dataview.getInt32( row + offset.label, this.littleEndian ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build geometry\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tif ( position.length > 0 ) geometry.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) );\n\t\tif ( normal.length > 0 ) geometry.setAttribute( 'normal', new Float32BufferAttribute( normal, 3 ) );\n\t\tif ( color.length > 0 ) geometry.setAttribute( 'color', new Float32BufferAttribute( color, 3 ) );\n\t\tif ( intensity.length > 0 ) geometry.setAttribute( 'intensity', new Float32BufferAttribute( intensity, 1 ) );\n\t\tif ( label.length > 0 ) geometry.setAttribute( 'label', new Int32BufferAttribute( label, 1 ) );\n\n\t\tgeometry.computeBoundingSphere();\n\n\t\t// build material\n\n\t\tconst material = new PointsMaterial( { size: 0.005 } );\n\n\t\tif ( color.length > 0 ) {\n\n\t\t\tmaterial.vertexColors = true;\n\n\t\t}\n\n\t\t// build point cloud\n\n\t\treturn new Points( geometry, material );\n\n\t}\n\n}\n\nexport { PCDLoader };\n", "import {\n\tBufferGeometry,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tLoader,\n\tColor,\n\tSRGBColorSpace\n} from 'three';\n\n/**\n * A loader for the PDB format.\n *\n * The [Protein Data Bank](https://en.wikipedia.org/wiki/Protein_Data_Bank_(file_format))\n * file format is a textual file describing the three-dimensional structures of molecules.\n *\n * ```js\n * const loader = new PDBLoader();\n * const pdb = await loader.loadAsync( 'models/pdb/ethanol.pdb' );\n *\n * const geometryAtoms = pdb.geometryAtoms;\n * const geometryBonds = pdb.geometryBonds;\n * const json = pdb.json;\n * ```\n *\n * @augments Loader\n * @three_import import { PDBLoader } from 'three/addons/loaders/PDBLoader.js';\n */\nclass PDBLoader extends Loader {\n\n\t/**\n\t * Constructs a new PDB loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded PDB asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Object)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( text ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given PDB data and returns an object holding the atoms and\n\t * bond geometries as well as the raw atom data as JSON.\n\t *\n\t * @param {string} text - The raw PDB data as a string.\n\t * @return {Object} The result object.\n\t */\n\tparse( text ) {\n\n\t\t// Based on CanvasMol PDB parser\n\n\t\tfunction trim( text ) {\n\n\t\t\treturn text.replace( /^\\s\\s*/, '' ).replace( /\\s\\s*$/, '' );\n\n\t\t}\n\n\t\tfunction capitalize( text ) {\n\n\t\t\treturn text.charAt( 0 ).toUpperCase() + text.slice( 1 ).toLowerCase();\n\n\t\t}\n\n\t\tfunction hash( s, e ) {\n\n\t\t\treturn 's' + Math.min( s, e ) + 'e' + Math.max( s, e );\n\n\t\t}\n\n\t\tfunction parseBond( start, length, satom, i ) {\n\n\t\t\tconst eatom = parseInt( lines[ i ].slice( start, start + length ) );\n\n\t\t\tif ( eatom ) {\n\n\t\t\t\tconst h = hash( satom, eatom );\n\n\t\t\t\tif ( _bhash[ h ] === undefined ) {\n\n\t\t\t\t\t_bonds.push( [ satom - 1, eatom - 1, 1 ] );\n\t\t\t\t\t_bhash[ h ] = _bonds.length - 1;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// doesn't really work as almost all PDBs\n\t\t\t\t\t// have just normal bonds appearing multiple\n\t\t\t\t\t// times instead of being double/triple bonds\n\t\t\t\t\t// bonds[bhash[h]][2] += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction buildGeometry() {\n\n\t\t\tconst build = {\n\t\t\t\tgeometryAtoms: new BufferGeometry(),\n\t\t\t\tgeometryBonds: new BufferGeometry(),\n\t\t\t\tjson: {\n\t\t\t\t\tatoms: atoms\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tconst geometryAtoms = build.geometryAtoms;\n\t\t\tconst geometryBonds = build.geometryBonds;\n\n\t\t\tconst verticesAtoms = [];\n\t\t\tconst colorsAtoms = [];\n\t\t\tconst verticesBonds = [];\n\n\t\t\t// atoms\n\n\t\t\tconst c = new Color();\n\n\t\t\tfor ( let i = 0, l = atoms.length; i < l; i ++ ) {\n\n\t\t\t\tconst atom = atoms[ i ];\n\n\t\t\t\tconst x = atom[ 0 ];\n\t\t\t\tconst y = atom[ 1 ];\n\t\t\t\tconst z = atom[ 2 ];\n\n\t\t\t\tverticesAtoms.push( x, y, z );\n\n\t\t\t\tconst r = atom[ 3 ][ 0 ] / 255;\n\t\t\t\tconst g = atom[ 3 ][ 1 ] / 255;\n\t\t\t\tconst b = atom[ 3 ][ 2 ] / 255;\n\n\t\t\t\tc.setRGB( r, g, b, SRGBColorSpace );\n\n\t\t\t\tcolorsAtoms.push( c.r, c.g, c.b );\n\n\t\t\t}\n\n\t\t\t// bonds\n\n\t\t\tfor ( let i = 0, l = _bonds.length; i < l; i ++ ) {\n\n\t\t\t\tconst bond = _bonds[ i ];\n\n\t\t\t\tconst start = bond[ 0 ];\n\t\t\t\tconst end = bond[ 1 ];\n\n\t\t\t\tconst startAtom = _atomMap[ start ];\n\t\t\t\tconst endAtom = _atomMap[ end ];\n\n\t\t\t\tlet x = startAtom[ 0 ];\n\t\t\t\tlet y = startAtom[ 1 ];\n\t\t\t\tlet z = startAtom[ 2 ];\n\n\t\t\t\tverticesBonds.push( x, y, z );\n\n\t\t\t\tx = endAtom[ 0 ];\n\t\t\t\ty = endAtom[ 1 ];\n\t\t\t\tz = endAtom[ 2 ];\n\n\t\t\t\tverticesBonds.push( x, y, z );\n\n\t\t\t}\n\n\t\t\t// build geometry\n\n\t\t\tgeometryAtoms.setAttribute( 'position', new Float32BufferAttribute( verticesAtoms, 3 ) );\n\t\t\tgeometryAtoms.setAttribute( 'color', new Float32BufferAttribute( colorsAtoms, 3 ) );\n\n\t\t\tgeometryBonds.setAttribute( 'position', new Float32BufferAttribute( verticesBonds, 3 ) );\n\n\t\t\treturn build;\n\n\t\t}\n\n\t\tconst CPK = { h: [ 255, 255, 255 ], he: [ 217, 255, 255 ], li: [ 204, 128, 255 ], be: [ 194, 255, 0 ], b: [ 255, 181, 181 ], c: [ 144, 144, 144 ], n: [ 48, 80, 248 ], o: [ 255, 13, 13 ], f: [ 144, 224, 80 ], ne: [ 179, 227, 245 ], na: [ 171, 92, 242 ], mg: [ 138, 255, 0 ], al: [ 191, 166, 166 ], si: [ 240, 200, 160 ], p: [ 255, 128, 0 ], s: [ 255, 255, 48 ], cl: [ 31, 240, 31 ], ar: [ 128, 209, 227 ], k: [ 143, 64, 212 ], ca: [ 61, 255, 0 ], sc: [ 230, 230, 230 ], ti: [ 191, 194, 199 ], v: [ 166, 166, 171 ], cr: [ 138, 153, 199 ], mn: [ 156, 122, 199 ], fe: [ 224, 102, 51 ], co: [ 240, 144, 160 ], ni: [ 80, 208, 80 ], cu: [ 200, 128, 51 ], zn: [ 125, 128, 176 ], ga: [ 194, 143, 143 ], ge: [ 102, 143, 143 ], as: [ 189, 128, 227 ], se: [ 255, 161, 0 ], br: [ 166, 41, 41 ], kr: [ 92, 184, 209 ], rb: [ 112, 46, 176 ], sr: [ 0, 255, 0 ], y: [ 148, 255, 255 ], zr: [ 148, 224, 224 ], nb: [ 115, 194, 201 ], mo: [ 84, 181, 181 ], tc: [ 59, 158, 158 ], ru: [ 36, 143, 143 ], rh: [ 10, 125, 140 ], pd: [ 0, 105, 133 ], ag: [ 192, 192, 192 ], cd: [ 255, 217, 143 ], in: [ 166, 117, 115 ], sn: [ 102, 128, 128 ], sb: [ 158, 99, 181 ], te: [ 212, 122, 0 ], i: [ 148, 0, 148 ], xe: [ 66, 158, 176 ], cs: [ 87, 23, 143 ], ba: [ 0, 201, 0 ], la: [ 112, 212, 255 ], ce: [ 255, 255, 199 ], pr: [ 217, 255, 199 ], nd: [ 199, 255, 199 ], pm: [ 163, 255, 199 ], sm: [ 143, 255, 199 ], eu: [ 97, 255, 199 ], gd: [ 69, 255, 199 ], tb: [ 48, 255, 199 ], dy: [ 31, 255, 199 ], ho: [ 0, 255, 156 ], er: [ 0, 230, 117 ], tm: [ 0, 212, 82 ], yb: [ 0, 191, 56 ], lu: [ 0, 171, 36 ], hf: [ 77, 194, 255 ], ta: [ 77, 166, 255 ], w: [ 33, 148, 214 ], re: [ 38, 125, 171 ], os: [ 38, 102, 150 ], ir: [ 23, 84, 135 ], pt: [ 208, 208, 224 ], au: [ 255, 209, 35 ], hg: [ 184, 184, 208 ], tl: [ 166, 84, 77 ], pb: [ 87, 89, 97 ], bi: [ 158, 79, 181 ], po: [ 171, 92, 0 ], at: [ 117, 79, 69 ], rn: [ 66, 130, 150 ], fr: [ 66, 0, 102 ], ra: [ 0, 125, 0 ], ac: [ 112, 171, 250 ], th: [ 0, 186, 255 ], pa: [ 0, 161, 255 ], u: [ 0, 143, 255 ], np: [ 0, 128, 255 ], pu: [ 0, 107, 255 ], am: [ 84, 92, 242 ], cm: [ 120, 92, 227 ], bk: [ 138, 79, 227 ], cf: [ 161, 54, 212 ], es: [ 179, 31, 212 ], fm: [ 179, 31, 186 ], md: [ 179, 13, 166 ], no: [ 189, 13, 135 ], lr: [ 199, 0, 102 ], rf: [ 204, 0, 89 ], db: [ 209, 0, 79 ], sg: [ 217, 0, 69 ], bh: [ 224, 0, 56 ], hs: [ 230, 0, 46 ], mt: [ 235, 0, 38 ], ds: [ 235, 0, 38 ], rg: [ 235, 0, 38 ], cn: [ 235, 0, 38 ], uut: [ 235, 0, 38 ], uuq: [ 235, 0, 38 ], uup: [ 235, 0, 38 ], uuh: [ 235, 0, 38 ], uus: [ 235, 0, 38 ], uuo: [ 235, 0, 38 ] };\n\n\t\tconst atoms = [];\n\n\t\tconst _bonds = [];\n\t\tconst _bhash = {};\n\t\tconst _atomMap = {};\n\n\t\t// parse\n\n\t\tconst lines = text.split( '\\n' );\n\n\t\tfor ( let i = 0, l = lines.length; i < l; i ++ ) {\n\n\t\t\tif ( lines[ i ].slice( 0, 4 ) === 'ATOM' || lines[ i ].slice( 0, 6 ) === 'HETATM' ) {\n\n\t\t\t\tconst x = parseFloat( lines[ i ].slice( 30, 37 ) );\n\t\t\t\tconst y = parseFloat( lines[ i ].slice( 38, 45 ) );\n\t\t\t\tconst z = parseFloat( lines[ i ].slice( 46, 53 ) );\n\t\t\t\tconst index = parseInt( lines[ i ].slice( 6, 11 ) ) - 1;\n\n\t\t\t\tlet e = trim( lines[ i ].slice( 76, 78 ) ).toLowerCase();\n\n\t\t\t\tif ( e === '' ) {\n\n\t\t\t\t\te = trim( lines[ i ].slice( 12, 14 ) ).toLowerCase();\n\n\t\t\t\t}\n\n\t\t\t\tconst atomData = [ x, y, z, CPK[ e ], capitalize( e ) ];\n\n\t\t\t\tatoms.push( atomData );\n\t\t\t\t_atomMap[ index ] = atomData;\n\n\t\t\t} else if ( lines[ i ].slice( 0, 6 ) === 'CONECT' ) {\n\n\t\t\t\tconst satom = parseInt( lines[ i ].slice( 6, 11 ) );\n\n\t\t\t\tparseBond( 11, 5, satom, i );\n\t\t\t\tparseBond( 16, 5, satom, i );\n\t\t\t\tparseBond( 21, 5, satom, i );\n\t\t\t\tparseBond( 26, 5, satom, i );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// build and return geometry\n\n\t\treturn buildGeometry();\n\n\t}\n\n}\n\nexport { PDBLoader };\n", "import {\n\tBufferGeometry,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tLoader,\n\tColor,\n\tSRGBColorSpace\n} from 'three';\n\nconst _color = new Color();\n\n/**\n * A loader for PLY the PLY format (known as the Polygon\n * File Format or the Stanford Triangle Format).\n *\n * Limitations:\n *  - ASCII decoding assumes file is UTF-8.\n *\n * ```js\n * const loader = new PLYLoader();\n * const geometry = await loader.loadAsync( './models/ply/ascii/dolphins.ply' );\n * scene.add( new THREE.Mesh( geometry ) );\n * ```\n *\n * @augments Loader\n * @three_import import { PLYLoader } from 'three/addons/loaders/PLYLoader.js';\n */\nclass PLYLoader extends Loader {\n\n\t/**\n\t * Constructs a new PLY loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t// internals\n\n\t\tthis.propertyNameMapping = {};\n\t\tthis.customPropertyMapping = {};\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded PLY asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(BufferGeometry)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( text ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Sets a property name mapping that maps default property names\n\t * to custom ones. For example, the following maps the properties\n\t * \u201Cdiffuse_(red|green|blue)\u201D in the file to standard color names.\n\t *\n\t * ```js\n\t * loader.setPropertyNameMapping( {\n\t * \tdiffuse_red: 'red',\n\t * \tdiffuse_green: 'green',\n\t * \tdiffuse_blue: 'blue'\n\t * } );\n\t * ```\n\t *\n\t * @param {Object} mapping - The mapping dictionary.\n\t */\n\tsetPropertyNameMapping( mapping ) {\n\n\t\tthis.propertyNameMapping = mapping;\n\n\t}\n\n\t/**\n\t * Custom properties outside of the defaults for position, uv, normal\n\t * and color attributes can be added using the setCustomPropertyNameMapping method.\n\t * For example, the following maps the element properties \u201Ccustom_property_a\u201D\n\t * and \u201Ccustom_property_b\u201D to an attribute \u201CcustomAttribute\u201D with an item size of 2.\n\t * Attribute item sizes are set from the number of element properties in the property array.\n\t *\n\t * ```js\n\t * loader.setCustomPropertyNameMapping( {\n\t *\tcustomAttribute: ['custom_property_a', 'custom_property_b'],\n\t * } );\n\t * ```\n\t * @param {Object} mapping - The mapping dictionary.\n\t */\n\tsetCustomPropertyNameMapping( mapping ) {\n\n\t\tthis.customPropertyMapping = mapping;\n\n\t}\n\n\t/**\n\t * Parses the given PLY data and returns the resulting geometry.\n\t *\n\t * @param {ArrayBuffer} data - The raw PLY data as an array buffer.\n\t * @return {BufferGeometry} The parsed geometry.\n\t */\n\tparse( data ) {\n\n\t\tfunction parseHeader( data, headerLength = 0 ) {\n\n\t\t\tconst patternHeader = /^ply([\\s\\S]*)end_header(\\r\\n|\\r|\\n)/;\n\t\t\tlet headerText = '';\n\t\t\tconst result = patternHeader.exec( data );\n\n\t\t\tif ( result !== null ) {\n\n\t\t\t\theaderText = result[ 1 ];\n\n\t\t\t}\n\n\t\t\tconst header = {\n\t\t\t\tcomments: [],\n\t\t\t\telements: [],\n\t\t\t\theaderLength: headerLength,\n\t\t\t\tobjInfo: ''\n\t\t\t};\n\n\t\t\tconst lines = headerText.split( /\\r\\n|\\r|\\n/ );\n\t\t\tlet currentElement;\n\n\t\t\tfunction make_ply_element_property( propertyValues, propertyNameMapping ) {\n\n\t\t\t\tconst property = { type: propertyValues[ 0 ] };\n\n\t\t\t\tif ( property.type === 'list' ) {\n\n\t\t\t\t\tproperty.name = propertyValues[ 3 ];\n\t\t\t\t\tproperty.countType = propertyValues[ 1 ];\n\t\t\t\t\tproperty.itemType = propertyValues[ 2 ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tproperty.name = propertyValues[ 1 ];\n\n\t\t\t\t}\n\n\t\t\t\tif ( property.name in propertyNameMapping ) {\n\n\t\t\t\t\tproperty.name = propertyNameMapping[ property.name ];\n\n\t\t\t\t}\n\n\t\t\t\treturn property;\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < lines.length; i ++ ) {\n\n\t\t\t\tlet line = lines[ i ];\n\t\t\t\tline = line.trim();\n\n\t\t\t\tif ( line === '' ) continue;\n\n\t\t\t\tconst lineValues = line.split( /\\s+/ );\n\t\t\t\tconst lineType = lineValues.shift();\n\t\t\t\tline = lineValues.join( ' ' );\n\n\t\t\t\tswitch ( lineType ) {\n\n\t\t\t\t\tcase 'format':\n\n\t\t\t\t\t\theader.format = lineValues[ 0 ];\n\t\t\t\t\t\theader.version = lineValues[ 1 ];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'comment':\n\n\t\t\t\t\t\theader.comments.push( line );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'element':\n\n\t\t\t\t\t\tif ( currentElement !== undefined ) {\n\n\t\t\t\t\t\t\theader.elements.push( currentElement );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcurrentElement = {};\n\t\t\t\t\t\tcurrentElement.name = lineValues[ 0 ];\n\t\t\t\t\t\tcurrentElement.count = parseInt( lineValues[ 1 ] );\n\t\t\t\t\t\tcurrentElement.properties = [];\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'property':\n\n\t\t\t\t\t\tcurrentElement.properties.push( make_ply_element_property( lineValues, scope.propertyNameMapping ) );\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'obj_info':\n\n\t\t\t\t\t\theader.objInfo = line;\n\n\t\t\t\t\t\tbreak;\n\n\n\t\t\t\t\tdefault:\n\n\t\t\t\t\t\tconsole.log( 'unhandled', lineType, lineValues );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( currentElement !== undefined ) {\n\n\t\t\t\theader.elements.push( currentElement );\n\n\t\t\t}\n\n\t\t\treturn header;\n\n\t\t}\n\n\t\tfunction parseASCIINumber( n, type ) {\n\n\t\t\tswitch ( type ) {\n\n\t\t\t\tcase 'char': case 'uchar': case 'short': case 'ushort': case 'int': case 'uint':\n\t\t\t\tcase 'int8': case 'uint8': case 'int16': case 'uint16': case 'int32': case 'uint32':\n\n\t\t\t\t\treturn parseInt( n );\n\n\t\t\t\tcase 'float': case 'double': case 'float32': case 'float64':\n\n\t\t\t\t\treturn parseFloat( n );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseASCIIElement( properties, tokens ) {\n\n\t\t\tconst element = {};\n\n\t\t\tfor ( let i = 0; i < properties.length; i ++ ) {\n\n\t\t\t\tif ( tokens.empty() ) return null;\n\n\t\t\t\tif ( properties[ i ].type === 'list' ) {\n\n\t\t\t\t\tconst list = [];\n\t\t\t\t\tconst n = parseASCIINumber( tokens.next(), properties[ i ].countType );\n\n\t\t\t\t\tfor ( let j = 0; j < n; j ++ ) {\n\n\t\t\t\t\t\tif ( tokens.empty() ) return null;\n\n\t\t\t\t\t\tlist.push( parseASCIINumber( tokens.next(), properties[ i ].itemType ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\telement[ properties[ i ].name ] = list;\n\n\t\t\t\t} else {\n\n\t\t\t\t\telement[ properties[ i ].name ] = parseASCIINumber( tokens.next(), properties[ i ].type );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn element;\n\n\t\t}\n\n\t\tfunction createBuffer() {\n\n\t\t\tconst buffer = {\n\t\t\t  indices: [],\n\t\t\t  vertices: [],\n\t\t\t  normals: [],\n\t\t\t  uvs: [],\n\t\t\t  faceVertexUvs: [],\n\t\t\t  colors: [],\n\t\t\t  faceVertexColors: []\n\t\t\t};\n\n\t\t\tfor ( const customProperty of Object.keys( scope.customPropertyMapping ) ) {\n\n\t\t\t  buffer[ customProperty ] = [];\n\n\t\t\t}\n\n\t\t\treturn buffer;\n\n\t\t}\n\n\t\tfunction mapElementAttributes( properties ) {\n\n\t\t\tconst elementNames = properties.map( property => {\n\n\t\t\t\treturn property.name;\n\n\t\t\t} );\n\n\t\t\tfunction findAttrName( names ) {\n\n\t\t\t\tfor ( let i = 0, l = names.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst name = names[ i ];\n\n\t\t\t\t\tif ( elementNames.includes( name ) ) return name;\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tattrX: findAttrName( [ 'x', 'px', 'posx' ] ) || 'x',\n\t\t\t\tattrY: findAttrName( [ 'y', 'py', 'posy' ] ) || 'y',\n\t\t\t\tattrZ: findAttrName( [ 'z', 'pz', 'posz' ] ) || 'z',\n\t\t\t\tattrNX: findAttrName( [ 'nx', 'normalx' ] ),\n\t\t\t\tattrNY: findAttrName( [ 'ny', 'normaly' ] ),\n\t\t\t\tattrNZ: findAttrName( [ 'nz', 'normalz' ] ),\n\t\t\t\tattrS: findAttrName( [ 's', 'u', 'texture_u', 'tx' ] ),\n\t\t\t\tattrT: findAttrName( [ 't', 'v', 'texture_v', 'ty' ] ),\n\t\t\t\tattrR: findAttrName( [ 'red', 'diffuse_red', 'r', 'diffuse_r' ] ),\n\t\t\t\tattrG: findAttrName( [ 'green', 'diffuse_green', 'g', 'diffuse_g' ] ),\n\t\t\t\tattrB: findAttrName( [ 'blue', 'diffuse_blue', 'b', 'diffuse_b' ] ),\n\t\t\t};\n\n\t\t}\n\n\t\tfunction parseASCII( data, header ) {\n\n\t\t\t// PLY ascii format specification, as per http://en.wikipedia.org/wiki/PLY_(file_format)\n\n\t\t\tconst buffer = createBuffer();\n\n\t\t\tconst patternBody = /end_header\\s+(\\S[\\s\\S]*\\S|\\S)\\s*$/;\n\t\t\tlet body, matches;\n\n\t\t\tif ( ( matches = patternBody.exec( data ) ) !== null ) {\n\n\t\t\t\tbody = matches[ 1 ].split( /\\s+/ );\n\n\t\t\t} else {\n\n\t\t\t\tbody = [ ];\n\n\t\t\t}\n\n\t\t\tconst tokens = new ArrayStream( body );\n\n\t\t\tloop: for ( let i = 0; i < header.elements.length; i ++ ) {\n\n\t\t\t\tconst elementDesc = header.elements[ i ];\n\t\t\t\tconst attributeMap = mapElementAttributes( elementDesc.properties );\n\n\t\t\t\tfor ( let j = 0; j < elementDesc.count; j ++ ) {\n\n\t\t\t\t\tconst element = parseASCIIElement( elementDesc.properties, tokens );\n\n\t\t\t\t\tif ( ! element ) break loop;\n\n\t\t\t\t\thandleElement( buffer, elementDesc.name, element, attributeMap );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn postProcess( buffer );\n\n\t\t}\n\n\t\tfunction postProcess( buffer ) {\n\n\t\t\tlet geometry = new BufferGeometry();\n\n\t\t\t// mandatory buffer data\n\n\t\t\tif ( buffer.indices.length > 0 ) {\n\n\t\t\t\tgeometry.setIndex( buffer.indices );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( buffer.vertices, 3 ) );\n\n\t\t\t// optional buffer data\n\n\t\t\tif ( buffer.normals.length > 0 ) {\n\n\t\t\t\tgeometry.setAttribute( 'normal', new Float32BufferAttribute( buffer.normals, 3 ) );\n\n\t\t\t}\n\n\t\t\tif ( buffer.uvs.length > 0 ) {\n\n\t\t\t\tgeometry.setAttribute( 'uv', new Float32BufferAttribute( buffer.uvs, 2 ) );\n\n\t\t\t}\n\n\t\t\tif ( buffer.colors.length > 0 ) {\n\n\t\t\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( buffer.colors, 3 ) );\n\n\t\t\t}\n\n\t\t\tif ( buffer.faceVertexUvs.length > 0 || buffer.faceVertexColors.length > 0 ) {\n\n\t\t\t\tgeometry = geometry.toNonIndexed();\n\n\t\t\t\tif ( buffer.faceVertexUvs.length > 0 ) geometry.setAttribute( 'uv', new Float32BufferAttribute( buffer.faceVertexUvs, 2 ) );\n\t\t\t\tif ( buffer.faceVertexColors.length > 0 ) geometry.setAttribute( 'color', new Float32BufferAttribute( buffer.faceVertexColors, 3 ) );\n\n\t\t\t}\n\n\t\t\t// custom buffer data\n\n\t\t\tfor ( const customProperty of Object.keys( scope.customPropertyMapping ) ) {\n\n\t\t\t\tif ( buffer[ customProperty ].length > 0 ) {\n\n\t\t\t\t  \tgeometry.setAttribute(\n\t\t\t\t\t\tcustomProperty,\n\t\t\t\t\t\tnew Float32BufferAttribute(\n\t\t\t\t\t  \t\tbuffer[ customProperty ],\n\t\t\t\t\t  \t\tscope.customPropertyMapping[ customProperty ].length\n\t\t\t\t\t\t)\n\t\t\t\t  \t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgeometry.computeBoundingSphere();\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction handleElement( buffer, elementName, element, cacheEntry ) {\n\n\t\t\tif ( elementName === 'vertex' ) {\n\n\t\t\t\tbuffer.vertices.push( element[ cacheEntry.attrX ], element[ cacheEntry.attrY ], element[ cacheEntry.attrZ ] );\n\n\t\t\t\tif ( cacheEntry.attrNX !== null && cacheEntry.attrNY !== null && cacheEntry.attrNZ !== null ) {\n\n\t\t\t\t\tbuffer.normals.push( element[ cacheEntry.attrNX ], element[ cacheEntry.attrNY ], element[ cacheEntry.attrNZ ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( cacheEntry.attrS !== null && cacheEntry.attrT !== null ) {\n\n\t\t\t\t\tbuffer.uvs.push( element[ cacheEntry.attrS ], element[ cacheEntry.attrT ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( cacheEntry.attrR !== null && cacheEntry.attrG !== null && cacheEntry.attrB !== null ) {\n\n\t\t\t\t\t_color.setRGB(\n\t\t\t\t\t\telement[ cacheEntry.attrR ] / 255.0,\n\t\t\t\t\t\telement[ cacheEntry.attrG ] / 255.0,\n\t\t\t\t\t\telement[ cacheEntry.attrB ] / 255.0,\n\t\t\t\t\t\tSRGBColorSpace\n\t\t\t\t\t);\n\n\t\t\t\t\tbuffer.colors.push( _color.r, _color.g, _color.b );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( const customProperty of Object.keys( scope.customPropertyMapping ) ) {\n\n\t\t\t\t\tfor ( const elementProperty of scope.customPropertyMapping[ customProperty ] ) {\n\n\t\t\t\t\t  buffer[ customProperty ].push( element[ elementProperty ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( elementName === 'face' ) {\n\n\t\t\t\tconst vertex_indices = element.vertex_indices || element.vertex_index; // issue #9338\n\t\t\t\tconst texcoord = element.texcoord;\n\n\t\t\t\tif ( vertex_indices.length === 3 ) {\n\n\t\t\t\t\tbuffer.indices.push( vertex_indices[ 0 ], vertex_indices[ 1 ], vertex_indices[ 2 ] );\n\n\t\t\t\t\tif ( texcoord && texcoord.length === 6 ) {\n\n\t\t\t\t\t\tbuffer.faceVertexUvs.push( texcoord[ 0 ], texcoord[ 1 ] );\n\t\t\t\t\t\tbuffer.faceVertexUvs.push( texcoord[ 2 ], texcoord[ 3 ] );\n\t\t\t\t\t\tbuffer.faceVertexUvs.push( texcoord[ 4 ], texcoord[ 5 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( vertex_indices.length === 4 ) {\n\n\t\t\t\t\tbuffer.indices.push( vertex_indices[ 0 ], vertex_indices[ 1 ], vertex_indices[ 3 ] );\n\t\t\t\t\tbuffer.indices.push( vertex_indices[ 1 ], vertex_indices[ 2 ], vertex_indices[ 3 ] );\n\n\t\t\t\t}\n\n\t\t\t\t// face colors\n\n\t\t\t\tif ( cacheEntry.attrR !== null && cacheEntry.attrG !== null && cacheEntry.attrB !== null ) {\n\n\t\t\t\t\t_color.setRGB(\n\t\t\t\t\t\telement[ cacheEntry.attrR ] / 255.0,\n\t\t\t\t\t\telement[ cacheEntry.attrG ] / 255.0,\n\t\t\t\t\t\telement[ cacheEntry.attrB ] / 255.0,\n\t\t\t\t\t\tSRGBColorSpace\n\t\t\t\t\t);\n\t\t\t\t\tbuffer.faceVertexColors.push( _color.r, _color.g, _color.b );\n\t\t\t\t\tbuffer.faceVertexColors.push( _color.r, _color.g, _color.b );\n\t\t\t\t\tbuffer.faceVertexColors.push( _color.r, _color.g, _color.b );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction binaryReadElement( at, properties ) {\n\n\t\t\tconst element = {};\n\t\t\tlet read = 0;\n\n\t\t\tfor ( let i = 0; i < properties.length; i ++ ) {\n\n\t\t\t\tconst property = properties[ i ];\n\t\t\t\tconst valueReader = property.valueReader;\n\n\t\t\t\tif ( property.type === 'list' ) {\n\n\t\t\t\t\tconst list = [];\n\n\t\t\t\t\tconst n = property.countReader.read( at + read );\n\t\t\t\t\tread += property.countReader.size;\n\n\t\t\t\t\tfor ( let j = 0; j < n; j ++ ) {\n\n\t\t\t\t\t\tlist.push( valueReader.read( at + read ) );\n\t\t\t\t\t\tread += valueReader.size;\n\n\t\t\t\t\t}\n\n\t\t\t\t\telement[ property.name ] = list;\n\n\t\t\t\t} else {\n\n\t\t\t\t\telement[ property.name ] = valueReader.read( at + read );\n\t\t\t\t\tread += valueReader.size;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn [ element, read ];\n\n\t\t}\n\n\t\tfunction setPropertyBinaryReaders( properties, body, little_endian ) {\n\n\t\t\tfunction getBinaryReader( dataview, type, little_endian ) {\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\t// correspondences for non-specific length types here match rply:\n\t\t\t\t\tcase 'int8':\tcase 'char':\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getInt8( at );\n\n\t\t\t\t\t}, size: 1 };\n\t\t\t\t\tcase 'uint8':\tcase 'uchar':\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getUint8( at );\n\n\t\t\t\t\t}, size: 1 };\n\t\t\t\t\tcase 'int16':\tcase 'short':\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getInt16( at, little_endian );\n\n\t\t\t\t\t}, size: 2 };\n\t\t\t\t\tcase 'uint16':\tcase 'ushort':\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getUint16( at, little_endian );\n\n\t\t\t\t\t}, size: 2 };\n\t\t\t\t\tcase 'int32':\tcase 'int':\t\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getInt32( at, little_endian );\n\n\t\t\t\t\t}, size: 4 };\n\t\t\t\t\tcase 'uint32':\tcase 'uint':\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getUint32( at, little_endian );\n\n\t\t\t\t\t}, size: 4 };\n\t\t\t\t\tcase 'float32': case 'float':\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getFloat32( at, little_endian );\n\n\t\t\t\t\t}, size: 4 };\n\t\t\t\t\tcase 'float64': case 'double':\treturn { read: ( at ) => {\n\n\t\t\t\t\t\treturn dataview.getFloat64( at, little_endian );\n\n\t\t\t\t\t}, size: 8 };\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = properties.length; i < l; i ++ ) {\n\n\t\t\t\tconst property = properties[ i ];\n\n\t\t\t\tif ( property.type === 'list' ) {\n\n\t\t\t\t\tproperty.countReader = getBinaryReader( body, property.countType, little_endian );\n\t\t\t\t\tproperty.valueReader = getBinaryReader( body, property.itemType, little_endian );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tproperty.valueReader = getBinaryReader( body, property.type, little_endian );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parseBinary( data, header ) {\n\n\t\t\tconst buffer = createBuffer();\n\n\t\t\tconst little_endian = ( header.format === 'binary_little_endian' );\n\t\t\tconst body = new DataView( data, header.headerLength );\n\t\t\tlet result, loc = 0;\n\n\t\t\tfor ( let currentElement = 0; currentElement < header.elements.length; currentElement ++ ) {\n\n\t\t\t\tconst elementDesc = header.elements[ currentElement ];\n\t\t\t\tconst properties = elementDesc.properties;\n\t\t\t\tconst attributeMap = mapElementAttributes( properties );\n\n\t\t\t\tsetPropertyBinaryReaders( properties, body, little_endian );\n\n\t\t\t\tfor ( let currentElementCount = 0; currentElementCount < elementDesc.count; currentElementCount ++ ) {\n\n\t\t\t\t\tresult = binaryReadElement( loc, properties );\n\t\t\t\t\tloc += result[ 1 ];\n\t\t\t\t\tconst element = result[ 0 ];\n\n\t\t\t\t\thandleElement( buffer, elementDesc.name, element, attributeMap );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn postProcess( buffer );\n\n\t\t}\n\n\t\tfunction extractHeaderText( bytes ) {\n\n\t\t\tlet i = 0;\n\t\t\tlet cont = true;\n\n\t\t\tlet line = '';\n\t\t\tconst lines = [];\n\n\t\t\tconst startLine = new TextDecoder().decode( bytes.subarray( 0, 5 ) );\n\t\t\tconst hasCRNL = /^ply\\r\\n/.test( startLine );\n\n\t\t\tdo {\n\n\t\t\t\tconst c = String.fromCharCode( bytes[ i ++ ] );\n\n\t\t\t\tif ( c !== '\\n' && c !== '\\r' ) {\n\n\t\t\t\t\tline += c;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( line === 'end_header' ) cont = false;\n\t\t\t\t\tif ( line !== '' ) {\n\n\t\t\t\t\t\tlines.push( line );\n\t\t\t\t\t\tline = '';\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} while ( cont && i < bytes.length );\n\n\t\t\t// ascii section using \\r\\n as line endings\n\t\t\tif ( hasCRNL === true ) i ++;\n\n\t\t\treturn { headerText: lines.join( '\\r' ) + '\\r', headerLength: i };\n\n\t\t}\n\n\t\t//\n\n\t\tlet geometry;\n\t\tconst scope = this;\n\n\t\tif ( data instanceof ArrayBuffer ) {\n\n\t\t\tconst bytes = new Uint8Array( data );\n\t\t\tconst { headerText, headerLength } = extractHeaderText( bytes );\n\t\t\tconst header = parseHeader( headerText, headerLength );\n\n\t\t\tif ( header.format === 'ascii' ) {\n\n\t\t\t\tconst text = new TextDecoder().decode( bytes );\n\n\t\t\t\tgeometry = parseASCII( text, header );\n\n\t\t\t} else {\n\n\t\t\t\tgeometry = parseBinary( data, header );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tgeometry = parseASCII( data, parseHeader( data ) );\n\n\t\t}\n\n\t\treturn geometry;\n\n\t}\n\n}\n\nclass ArrayStream {\n\n\tconstructor( arr ) {\n\n\t\tthis.arr = arr;\n\t\tthis.i = 0;\n\n\t}\n\n\tempty() {\n\n\t\treturn this.i >= this.arr.length;\n\n\t}\n\n\tnext() {\n\n\t\treturn this.arr[ this.i ++ ];\n\n\t}\n\n}\n\nexport { PLYLoader };\n", "import {\n\tCompressedTextureLoader,\n\tRGBA_PVRTC_2BPPV1_Format,\n\tRGBA_PVRTC_4BPPV1_Format,\n\tRGB_PVRTC_2BPPV1_Format,\n\tRGB_PVRTC_4BPPV1_Format\n} from 'three';\n\n/**\n * A loader for the PVRTC texture compression format.\n *\n * ```js\n * const loader = new PVRLoader();\n *\n * const map = loader.load( 'textures/compressed/disturb_4bpp_rgb.pvr' );\n * map.colorSpace = THREE.SRGBColorSpace; // only for color textures\n * ```\n *\n * @augments CompressedTextureLoader\n * @three_import import { PVRLoader } from 'three/addons/loaders/PVRLoader.js';\n */\nclass PVRLoader extends CompressedTextureLoader {\n\n\t/**\n\t * Constructs a new PVR loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Parses the given PVRTC texture data.\n\t *\n\t * @param {ArrayBuffer} buffer - The raw texture data.\n\t * @param {boolean} loadMipmaps - Whether to load mipmaps or not. This option is not yet supported by the loader.\n\t * @return {CompressedTextureLoader~TexData} An object representing the parsed texture data.\n\t */\n\tparse( buffer, loadMipmaps ) {\n\n\t\tconst headerLengthInt = 13;\n\t\tconst header = new Uint32Array( buffer, 0, headerLengthInt );\n\n\t\tconst pvrDatas = {\n\t\t\tbuffer: buffer,\n\t\t\theader: header,\n\t\t\tloadMipmaps: loadMipmaps\n\t\t};\n\n\t\tif ( header[ 0 ] === 0x03525650 ) {\n\n\t\t\t// PVR v3\n\n\t\t\treturn _parseV3( pvrDatas );\n\n\t\t} else if ( header[ 11 ] === 0x21525650 ) {\n\n\t\t\t// PVR v2\n\n\t\t\treturn _parseV2( pvrDatas );\n\n\t\t} else {\n\n\t\t\tconsole.error( 'THREE.PVRLoader: Unknown PVR format.' );\n\n\t\t}\n\n\t}\n\n}\n\nfunction _parseV3( pvrDatas ) {\n\n\tconst header = pvrDatas.header;\n\tlet bpp, format;\n\n\n\tconst metaLen = header[ 12 ],\n\t\tpixelFormat = header[ 2 ],\n\t\theight = header[ 6 ],\n\t\twidth = header[ 7 ],\n\t\t// numSurfs = header[ 9 ],\n\t\tnumFaces = header[ 10 ],\n\t\tnumMipmaps = header[ 11 ];\n\n\tswitch ( pixelFormat ) {\n\n\t\tcase 0 : // PVRTC 2bpp RGB\n\t\t\tbpp = 2;\n\t\t\tformat = RGB_PVRTC_2BPPV1_Format;\n\t\t\tbreak;\n\n\t\tcase 1 : // PVRTC 2bpp RGBA\n\t\t\tbpp = 2;\n\t\t\tformat = RGBA_PVRTC_2BPPV1_Format;\n\t\t\tbreak;\n\n\t\tcase 2 : // PVRTC 4bpp RGB\n\t\t\tbpp = 4;\n\t\t\tformat = RGB_PVRTC_4BPPV1_Format;\n\t\t\tbreak;\n\n\t\tcase 3 : // PVRTC 4bpp RGBA\n\t\t\tbpp = 4;\n\t\t\tformat = RGBA_PVRTC_4BPPV1_Format;\n\t\t\tbreak;\n\n\t\tdefault :\n\t\t\tconsole.error( 'THREE.PVRLoader: Unsupported PVR format:', pixelFormat );\n\n\t}\n\n\tpvrDatas.dataPtr = 52 + metaLen;\n\tpvrDatas.bpp = bpp;\n\tpvrDatas.format = format;\n\tpvrDatas.width = width;\n\tpvrDatas.height = height;\n\tpvrDatas.numSurfaces = numFaces;\n\tpvrDatas.numMipmaps = numMipmaps;\n\tpvrDatas.isCubemap \t= ( numFaces === 6 );\n\n\treturn _extract( pvrDatas );\n\n}\n\nfunction _parseV2( pvrDatas ) {\n\n\tconst header = pvrDatas.header;\n\n\tconst headerLength = header[ 0 ],\n\t\theight = header[ 1 ],\n\t\twidth = header[ 2 ],\n\t\tnumMipmaps = header[ 3 ],\n\t\tflags = header[ 4 ],\n\t\t// dataLength = header[ 5 ],\n\t\t// bpp =  header[ 6 ],\n\t\t// bitmaskRed = header[ 7 ],\n\t\t// bitmaskGreen = header[ 8 ],\n\t\t// bitmaskBlue = header[ 9 ],\n\t\tbitmaskAlpha = header[ 10 ],\n\t\t// pvrTag = header[ 11 ],\n\t\tnumSurfs = header[ 12 ];\n\n\n\tconst TYPE_MASK = 0xff;\n\tconst PVRTC_2 = 24,\n\t\tPVRTC_4 = 25;\n\n\tconst formatFlags = flags & TYPE_MASK;\n\n\tlet bpp, format;\n\tconst _hasAlpha = bitmaskAlpha > 0;\n\n\tif ( formatFlags === PVRTC_4 ) {\n\n\t\tformat = _hasAlpha ? RGBA_PVRTC_4BPPV1_Format : RGB_PVRTC_4BPPV1_Format;\n\t\tbpp = 4;\n\n\t} else if ( formatFlags === PVRTC_2 ) {\n\n\t\tformat = _hasAlpha ? RGBA_PVRTC_2BPPV1_Format : RGB_PVRTC_2BPPV1_Format;\n\t\tbpp = 2;\n\n\t} else {\n\n\t\tconsole.error( 'THREE.PVRLoader: Unknown PVR format:', formatFlags );\n\n\t}\n\n\tpvrDatas.dataPtr = headerLength;\n\tpvrDatas.bpp = bpp;\n\tpvrDatas.format = format;\n\tpvrDatas.width = width;\n\tpvrDatas.height = height;\n\tpvrDatas.numSurfaces = numSurfs;\n\tpvrDatas.numMipmaps = numMipmaps + 1;\n\n\t// guess cubemap type seems tricky in v2\n\t// it's just a pvr containing 6 surface (no explicit cubemap type)\n\tpvrDatas.isCubemap \t= ( numSurfs === 6 );\n\n\treturn _extract( pvrDatas );\n\n}\n\n\nfunction _extract( pvrDatas ) {\n\n\tconst pvr = {\n\t\tmipmaps: [],\n\t\twidth: pvrDatas.width,\n\t\theight: pvrDatas.height,\n\t\tformat: pvrDatas.format,\n\t\tmipmapCount: pvrDatas.numMipmaps,\n\t\tisCubemap: pvrDatas.isCubemap\n\t};\n\n\tconst buffer = pvrDatas.buffer;\n\n\tlet dataOffset = pvrDatas.dataPtr,\n\t\tdataSize = 0,\n\t\tblockSize = 0,\n\t\tblockWidth = 0,\n\t\tblockHeight = 0,\n\t\twidthBlocks = 0,\n\t\theightBlocks = 0;\n\n\tconst bpp = pvrDatas.bpp,\n\t\tnumSurfs = pvrDatas.numSurfaces;\n\n\tif ( bpp === 2 ) {\n\n\t\tblockWidth = 8;\n\t\tblockHeight = 4;\n\n\t} else {\n\n\t\tblockWidth = 4;\n\t\tblockHeight = 4;\n\n\t}\n\n\tblockSize = ( blockWidth * blockHeight ) * bpp / 8;\n\n\tpvr.mipmaps.length = pvrDatas.numMipmaps * numSurfs;\n\n\tlet mipLevel = 0;\n\n\twhile ( mipLevel < pvrDatas.numMipmaps ) {\n\n\t\tconst sWidth = pvrDatas.width >> mipLevel,\n\t\t\tsHeight = pvrDatas.height >> mipLevel;\n\n\t\twidthBlocks = sWidth / blockWidth;\n\t\theightBlocks = sHeight / blockHeight;\n\n\t\t// Clamp to minimum number of blocks\n\t\tif ( widthBlocks < 2 ) widthBlocks = 2;\n\t\tif ( heightBlocks < 2 ) heightBlocks = 2;\n\n\t\tdataSize = widthBlocks * heightBlocks * blockSize;\n\n\t\tfor ( let surfIndex = 0; surfIndex < numSurfs; surfIndex ++ ) {\n\n\t\t\tconst byteArray = new Uint8Array( buffer, dataOffset, dataSize );\n\n\t\t\tconst mipmap = {\n\t\t\t\tdata: byteArray,\n\t\t\t\twidth: sWidth,\n\t\t\t\theight: sHeight\n\t\t\t};\n\n\t\t\tpvr.mipmaps[ surfIndex * pvrDatas.numMipmaps + mipLevel ] = mipmap;\n\n\t\t\tdataOffset += dataSize;\n\n\t\t}\n\n\t\tmipLevel ++;\n\n\t}\n\n\treturn pvr;\n\n}\n\nexport { PVRLoader };\n", "import { HDRLoader } from './HDRLoader.js';\n\n// @deprecated, r180\n\nclass RGBELoader extends HDRLoader {\n\n\tconstructor( manager ) {\n\n\t\tconsole.warn( 'RGBELoader has been deprecated. Please use HDRLoader instead.' );\n\t\tsuper( manager );\n\n\t}\n\n}\n\nexport { RGBELoader };\n\n\n", "import {\n\tClampToEdgeWrapping,\n\tDataTexture,\n\tDataUtils,\n\tFileLoader,\n\tHalfFloatType,\n\tLinearFilter,\n\tLinearMipMapLinearFilter,\n\tLinearSRGBColorSpace,\n\tLoader,\n\tRGBAFormat,\n\tUVMapping,\n} from 'three';\n\n/**\n * UltraHDR Image Format - https://developer.android.com/media/platform/hdr-image-format\n *\n * Short format brief:\n *\n *  [JPEG headers]\n *  [XMP metadata describing the MPF container and *both* SDR and gainmap images]\n *  [Optional metadata] [EXIF] [ICC Profile]\n *  [SDR image]\n *  [XMP metadata describing only the gainmap image]\n *  [Gainmap image]\n *\n * Each section is separated by a 0xFFXX byte followed by a descriptor byte (0xFFE0, 0xFFE1, 0xFFE2.)\n * Binary image storages are prefixed with a unique 0xFFD8 16-bit descriptor.\n */\n\n\n// Pre-calculated sRGB to linear lookup table for values 0-1023\nconst SRGB_TO_LINEAR = new Float64Array( 1024 );\nfor ( let i = 0; i < 1024; i ++ ) {\n\n\t// (1/255) * 0.9478672986 = 0.003717127\n\tSRGB_TO_LINEAR[ i ] = Math.pow( i * 0.003717127 + 0.0521327014, 2.4 );\n\n}\n\n/**\n * A loader for the Ultra HDR Image Format.\n *\n * Existing HDR or EXR textures can be converted to Ultra HDR with this [tool](https://gainmap-creator.monogrid.com/).\n *\n * Current feature set:\n * - JPEG headers (required)\n * - XMP metadata (required)\n * - XMP validation (not implemented)\n * - EXIF profile (not implemented)\n * - ICC profile (not implemented)\n * - Binary storage for SDR & HDR images (required)\n * - Gainmap metadata (required)\n * - Non-JPEG image formats (not implemented)\n * - Primary image as an HDR image (not implemented)\n *\n * ```js\n * const loader = new UltraHDRLoader();\n * const texture = await loader.loadAsync( 'textures/equirectangular/ice_planet_close.jpg' );\n * texture.mapping = THREE.EquirectangularReflectionMapping;\n *\n * scene.background = texture;\n * scene.environment = texture;\n * ```\n *\n * @augments Loader\n * @three_import import { UltraHDRLoader } from 'three/addons/loaders/UltraHDRLoader.js';\n */\nclass UltraHDRLoader extends Loader {\n\n\t/**\n\t * Constructs a new Ultra HDR loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * The texture type.\n\t\t *\n\t\t * @type {(HalfFloatType|FloatType)}\n\t\t * @default HalfFloatType\n\t\t */\n\t\tthis.type = HalfFloatType;\n\n\t}\n\n\t/**\n\t * Sets the texture type.\n\t *\n\t * @param {(HalfFloatType|FloatType)} value - The texture type to set.\n\t * @return {UltraHDRLoader} A reference to this loader.\n\t */\n\tsetDataType( value ) {\n\n\t\tthis.type = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Parses the given Ultra HDR texture data.\n\t *\n\t * @param {ArrayBuffer} buffer - The raw texture data.\n\t * @param {Function} onLoad - The `onLoad` callback.\n\t */\n\tparse( buffer, onLoad ) {\n\n\t\tconst xmpMetadata = {\n\t\t\tversion: null,\n\t\t\tbaseRenditionIsHDR: null,\n\t\t\tgainMapMin: null,\n\t\t\tgainMapMax: null,\n\t\t\tgamma: null,\n\t\t\toffsetSDR: null,\n\t\t\toffsetHDR: null,\n\t\t\thdrCapacityMin: null,\n\t\t\thdrCapacityMax: null,\n\t\t};\n\t\tconst textDecoder = new TextDecoder();\n\n\t\tconst bytes = new Uint8Array( buffer );\n\n\t\tconst sections = [];\n\n\t\t// JPEG segment-aware scanner using length headers\n\t\tlet offset = 0;\n\n\t\twhile ( offset < bytes.length - 1 ) {\n\n\t\t\t// Find marker prefix\n\t\t\tif ( bytes[ offset ] !== 0xff ) {\n\n\t\t\t\toffset ++;\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\tconst markerType = bytes[ offset + 1 ];\n\n\t\t\t// SOI (0xD8) - Start of Image, no length field\n\t\t\tif ( markerType === 0xd8 ) {\n\n\t\t\t\tsections.push( {\n\t\t\t\t\tsectionType: markerType,\n\t\t\t\t\tsection: bytes.subarray( offset, offset + 2 ),\n\t\t\t\t\tsectionOffset: offset + 2,\n\t\t\t\t} );\n\n\t\t\t\toffset += 2;\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// APP0-APP2 segments have length headers\n\t\t\tif ( markerType === 0xe0 || markerType === 0xe1 || markerType === 0xe2 ) {\n\n\t\t\t\t// Length is stored as big-endian 16-bit value (includes length bytes, excludes marker)\n\t\t\t\tconst segmentLength = ( bytes[ offset + 2 ] << 8 ) | bytes[ offset + 3 ];\n\t\t\t\tconst segmentEnd = offset + 2 + segmentLength;\n\n\t\t\t\tsections.push( {\n\t\t\t\t\tsectionType: markerType,\n\t\t\t\t\tsection: bytes.subarray( offset, segmentEnd ),\n\t\t\t\t\tsectionOffset: offset + 2,\n\t\t\t\t} );\n\n\t\t\t\toffset = segmentEnd;\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// Skip other markers with length fields (0xC0-0xFE range, except RST and EOI)\n\t\t\tif ( markerType >= 0xc0 && markerType <= 0xfe && markerType !== 0xd9 && ( markerType < 0xd0 || markerType > 0xd7 ) ) {\n\n\t\t\t\tconst segmentLength = ( bytes[ offset + 2 ] << 8 ) | bytes[ offset + 3 ];\n\t\t\t\toffset += 2 + segmentLength;\n\t\t\t\tcontinue;\n\n\t\t\t}\n\n\t\t\t// EOI (0xD9) or RST markers (0xD0-0xD7) - no length field\n\t\t\toffset += 2;\n\n\t\t}\n\n\t\tlet primaryImage, gainmapImage;\n\n\t\tfor ( let i = 0; i < sections.length; i ++ ) {\n\n\t\t\tconst { sectionType, section, sectionOffset } = sections[ i ];\n\n\t\t\tif ( sectionType === 0xe0 ) {\n\t\t\t\t/* JPEG Header - no useful information */\n\t\t\t} else if ( sectionType === 0xe1 ) {\n\n\t\t\t\t/* XMP Metadata */\n\n\t\t\t\tthis._parseXMPMetadata(\n\t\t\t\t\ttextDecoder.decode( new Uint8Array( section ) ),\n\t\t\t\t\txmpMetadata\n\t\t\t\t);\n\n\t\t\t} else if ( sectionType === 0xe2 ) {\n\n\t\t\t\t/* Data Sections - MPF / EXIF / ICC Profile */\n\n\t\t\t\tconst sectionData = new DataView( section.buffer, section.byteOffset + 2, section.byteLength - 2 );\n\t\t\t\tconst sectionHeader = sectionData.getUint32( 2, false );\n\n\t\t\t\tif ( sectionHeader === 0x4d504600 ) {\n\n\t\t\t\t\t/* MPF Section */\n\n\t\t\t\t\t/* Section contains a list of static bytes and ends with offsets indicating location of SDR and gainmap images */\n\t\t\t\t\t/* First bytes after header indicate little / big endian ordering (0x49492A00 - LE / 0x4D4D002A - BE) */\n\t\t\t\t\t/*\n\t\t\t\t\t... 60 bytes indicating tags, versions, etc. ...\n\n\t\t\t\t\tbytes | bits | description\n\n\t\t\t\t\t4       32     primary image size\n\t\t\t\t\t4       32     primary image offset\n\t\t\t\t\t2       16     0x0000\n\t\t\t\t\t2       16     0x0000\n\n\t\t\t\t\t4       32     0x00000000\n\t\t\t\t\t4       32     gainmap image size\n\t\t\t\t\t4       32     gainmap image offset\n\t\t\t\t\t2       16     0x0000\n\t\t\t\t\t2       16     0x0000\n\t\t\t\t\t*/\n\n\t\t\t\t\tconst mpfLittleEndian = sectionData.getUint32( 6 ) === 0x49492a00;\n\t\t\t\t\tconst mpfBytesOffset = 60;\n\n\t\t\t\t\t/* SDR size includes the metadata length, SDR offset is always 0 */\n\n\t\t\t\t\tconst primaryImageSize = sectionData.getUint32(\n\t\t\t\t\t\tmpfBytesOffset,\n\t\t\t\t\t\tmpfLittleEndian\n\t\t\t\t\t);\n\t\t\t\t\tconst primaryImageOffset = sectionData.getUint32(\n\t\t\t\t\t\tmpfBytesOffset + 4,\n\t\t\t\t\t\tmpfLittleEndian\n\t\t\t\t\t);\n\n\t\t\t\t\t/* Gainmap size is an absolute value starting from its offset, gainmap offset needs 6 bytes padding to take into account 0x00 bytes at the end of XMP */\n\t\t\t\t\tconst gainmapImageSize = sectionData.getUint32(\n\t\t\t\t\t\tmpfBytesOffset + 16,\n\t\t\t\t\t\tmpfLittleEndian\n\t\t\t\t\t);\n\t\t\t\t\tconst gainmapImageOffset =\n\t\t\t\t\t\tsectionData.getUint32( mpfBytesOffset + 20, mpfLittleEndian ) +\n\t\t\t\t\t\tsectionOffset +\n\t\t\t\t\t\t6;\n\n\t\t\t\t\tprimaryImage = new Uint8Array(\n\t\t\t\t\t\tbuffer,\n\t\t\t\t\t\tprimaryImageOffset,\n\t\t\t\t\t\tprimaryImageSize\n\t\t\t\t\t);\n\n\t\t\t\t\tgainmapImage = new Uint8Array(\n\t\t\t\t\t\tbuffer,\n\t\t\t\t\t\tgainmapImageOffset,\n\t\t\t\t\t\tgainmapImageSize\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t/* Minimal sufficient validation - https://developer.android.com/media/platform/hdr-image-format#signal_of_the_format */\n\t\tif ( ! xmpMetadata.version ) {\n\n\t\t\tthrow new Error( 'THREE.UltraHDRLoader: Not a valid UltraHDR image' );\n\n\t\t}\n\n\t\tif ( primaryImage && gainmapImage ) {\n\n\t\t\tthis._applyGainmapToSDR(\n\t\t\t\txmpMetadata,\n\t\t\t\tprimaryImage,\n\t\t\t\tgainmapImage,\n\t\t\t\t( hdrBuffer, width, height ) => {\n\n\t\t\t\t\tonLoad( {\n\t\t\t\t\t\twidth,\n\t\t\t\t\t\theight,\n\t\t\t\t\t\tdata: hdrBuffer,\n\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\ttype: this.type,\n\t\t\t\t\t} );\n\n\t\t\t\t},\n\t\t\t\t( error ) => {\n\n\t\t\t\t\tthrow new Error( error );\n\n\t\t\t\t}\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.UltraHDRLoader: Could not parse UltraHDR images' );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded Ultra HDR texture\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the files to be loaded. This can also be a data URI.\n\t * @param {function(DataTexture, Object)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t * @return {DataTexture} The Ultra HDR texture.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst texture = new DataTexture(\n\t\t\tthis.type === HalfFloatType ? new Uint16Array() : new Float32Array(),\n\t\t\t0,\n\t\t\t0,\n\t\t\tRGBAFormat,\n\t\t\tthis.type,\n\t\t\tUVMapping,\n\t\t\tClampToEdgeWrapping,\n\t\t\tClampToEdgeWrapping,\n\t\t\tLinearFilter,\n\t\t\tLinearMipMapLinearFilter,\n\t\t\t1,\n\t\t\tLinearSRGBColorSpace\n\t\t);\n\t\ttexture.generateMipmaps = true;\n\t\ttexture.flipY = true;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setPath( this.path );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, ( buffer ) => {\n\n\t\t\ttry {\n\n\t\t\t\tthis.parse(\n\t\t\t\t\tbuffer,\n\t\t\t\t\t( texData ) => {\n\n\t\t\t\t\t\ttexture.image = {\n\t\t\t\t\t\t\tdata: texData.data,\n\t\t\t\t\t\t\twidth: texData.width,\n\t\t\t\t\t\t\theight: texData.height,\n\t\t\t\t\t\t};\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\n\t\t\t\t\t\tif ( onLoad ) onLoad( texture, texData );\n\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( onError ) onError( error );\n\n\t\t\t\tconsole.error( error );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t\treturn texture;\n\n\t}\n\n\t_parseXMPMetadata( xmpDataString, xmpMetadata ) {\n\n\t\tconst domParser = new DOMParser();\n\n\t\tconst xmpXml = domParser.parseFromString(\n\t\t\txmpDataString.substring(\n\t\t\t\txmpDataString.indexOf( '<' ),\n\t\t\t\txmpDataString.lastIndexOf( '>' ) + 1\n\t\t\t),\n\t\t\t'text/xml'\n\t\t);\n\n\t\t/* Determine if given XMP metadata is the primary GContainer descriptor or a gainmap descriptor */\n\t\tconst [ hasHDRContainerDescriptor ] = xmpXml.getElementsByTagName(\n\t\t\t'Container:Directory'\n\t\t);\n\n\t\tif ( hasHDRContainerDescriptor ) {\n\t\t\t/* There's not much useful information in the container descriptor besides memory-validation */\n\t\t} else {\n\n\t\t\t/* Gainmap descriptor - defaults from https://developer.android.com/media/platform/hdr-image-format#HDR_gain_map_metadata */\n\n\t\t\tconst [ gainmapNode ] = xmpXml.getElementsByTagName( 'rdf:Description' );\n\n\t\t\txmpMetadata.version = gainmapNode.getAttribute( 'hdrgm:Version' );\n\t\t\txmpMetadata.baseRenditionIsHDR =\n\t\t\t\tgainmapNode.getAttribute( 'hdrgm:BaseRenditionIsHDR' ) === 'True';\n\t\t\txmpMetadata.gainMapMin = parseFloat(\n\t\t\t\tgainmapNode.getAttribute( 'hdrgm:GainMapMin' ) || 0.0\n\t\t\t);\n\t\t\txmpMetadata.gainMapMax = parseFloat(\n\t\t\t\tgainmapNode.getAttribute( 'hdrgm:GainMapMax' ) || 1.0\n\t\t\t);\n\t\t\txmpMetadata.gamma = parseFloat(\n\t\t\t\tgainmapNode.getAttribute( 'hdrgm:Gamma' ) || 1.0\n\t\t\t);\n\t\t\txmpMetadata.offsetSDR = parseFloat(\n\t\t\t\tgainmapNode.getAttribute( 'hdrgm:OffsetSDR' ) / ( 1 / 64 )\n\t\t\t);\n\t\t\txmpMetadata.offsetHDR = parseFloat(\n\t\t\t\tgainmapNode.getAttribute( 'hdrgm:OffsetHDR' ) / ( 1 / 64 )\n\t\t\t);\n\t\t\txmpMetadata.hdrCapacityMin = parseFloat(\n\t\t\t\tgainmapNode.getAttribute( 'hdrgm:HDRCapacityMin' ) || 0.0\n\t\t\t);\n\t\t\txmpMetadata.hdrCapacityMax = parseFloat(\n\t\t\t\tgainmapNode.getAttribute( 'hdrgm:HDRCapacityMax' ) || 1.0\n\t\t\t);\n\n\t\t}\n\n\t}\n\n\t_srgbToLinear( value ) {\n\n\t\t// 0.04045 * 255 = 10.31475\n\t\tif ( value < 10.31475 ) {\n\n\t\t\t// (1/255) * 0.0773993808\n\t\t\treturn value * 0.000303527;\n\n\t\t}\n\n\t\tif ( value < 1024 ) {\n\n\t\t\treturn SRGB_TO_LINEAR[ value | 0 ];\n\n\t\t}\n\n\t\t// (1/255) * 0.9478672986 = 0.003717127\n\t\treturn Math.pow( value * 0.003717127 + 0.0521327014, 2.4 );\n\n\t}\n\n\t_applyGainmapToSDR(\n\t\txmpMetadata,\n\t\tsdrBuffer,\n\t\tgainmapBuffer,\n\t\tonSuccess,\n\t\tonError\n\t) {\n\n\t\tconst decodeImage = ( data ) => createImageBitmap( new Blob( [ data ], { type: 'image/jpeg' } ) );\n\n\t\tPromise.all( [ decodeImage( sdrBuffer ), decodeImage( gainmapBuffer ) ] )\n\t\t\t.then( ( [ sdrImage, gainmapImage ] ) => {\n\n\t\t\t\tconst sdrWidth = sdrImage.width;\n\t\t\t\tconst sdrHeight = sdrImage.height;\n\t\t\t\tconst sdrImageAspect = sdrWidth / sdrHeight;\n\t\t\t\tconst gainmapImageAspect = gainmapImage.width / gainmapImage.height;\n\n\t\t\t\tif ( sdrImageAspect !== gainmapImageAspect ) {\n\n\t\t\t\t\tonError(\n\t\t\t\t\t\t'THREE.UltraHDRLoader Error: Aspect ratio mismatch between SDR and Gainmap images'\n\t\t\t\t\t);\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tconst canvas = document.createElement( 'canvas' );\n\t\t\t\tconst ctx = canvas.getContext( '2d', {\n\t\t\t\t\twillReadFrequently: true,\n\t\t\t\t\tcolorSpace: 'srgb',\n\t\t\t\t} );\n\n\t\t\t\tcanvas.width = sdrWidth;\n\t\t\t\tcanvas.height = sdrHeight;\n\n\t\t\t\t/* Use out-of-the-box interpolation of Canvas API to scale gainmap to fit the SDR resolution */\n\t\t\t\tctx.drawImage(\n\t\t\t\t\tgainmapImage,\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t\tgainmapImage.width,\n\t\t\t\t\tgainmapImage.height,\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t\tsdrWidth,\n\t\t\t\t\tsdrHeight\n\t\t\t\t);\n\t\t\t\tconst gainmapImageData = ctx.getImageData(\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t\tsdrWidth,\n\t\t\t\t\tsdrHeight,\n\t\t\t\t\t{ colorSpace: 'srgb' }\n\t\t\t\t);\n\n\t\t\t\tctx.drawImage( sdrImage, 0, 0 );\n\t\t\t\tconst sdrImageData = ctx.getImageData(\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t\tsdrWidth,\n\t\t\t\t\tsdrHeight,\n\t\t\t\t\t{ colorSpace: 'srgb' }\n\t\t\t\t);\n\n\t\t\t\t/* HDR Recovery formula - https://developer.android.com/media/platform/hdr-image-format#use_the_gain_map_to_create_adapted_HDR_rendition */\n\n\t\t\t\t/* 1.8 instead of 2 near-perfectly rectifies approximations introduced by precalculated SRGB_TO_LINEAR values */\n\t\t\t\tconst maxDisplayBoost = 1.8 ** ( xmpMetadata.hdrCapacityMax * 0.5 );\n\t\t\t\tconst unclampedWeightFactor =\n\t\t\t\t\t( Math.log2( maxDisplayBoost ) - xmpMetadata.hdrCapacityMin ) /\n\t\t\t\t\t( xmpMetadata.hdrCapacityMax - xmpMetadata.hdrCapacityMin );\n\t\t\t\tconst weightFactor = Math.min(\n\t\t\t\t\tMath.max( unclampedWeightFactor, 0.0 ),\n\t\t\t\t\t1.0\n\t\t\t\t);\n\n\t\t\t\tconst sdrData = sdrImageData.data;\n\t\t\t\tconst gainmapData = gainmapImageData.data;\n\t\t\t\tconst dataLength = sdrData.length;\n\t\t\t\tconst gainMapMin = xmpMetadata.gainMapMin;\n\t\t\t\tconst gainMapMax = xmpMetadata.gainMapMax;\n\t\t\t\tconst offsetSDR = xmpMetadata.offsetSDR;\n\t\t\t\tconst offsetHDR = xmpMetadata.offsetHDR;\n\t\t\t\tconst invGamma = 1.0 / xmpMetadata.gamma;\n\t\t\t\tconst useGammaOne = xmpMetadata.gamma === 1.0;\n\t\t\t\tconst isHalfFloat = this.type === HalfFloatType;\n\t\t\t\tconst toHalfFloat = DataUtils.toHalfFloat;\n\t\t\t\tconst srgbToLinear = this._srgbToLinear;\n\n\t\t\t\tconst hdrBuffer = isHalfFloat\n\t\t\t\t\t? new Uint16Array( dataLength ).fill( 15360 )\n\t\t\t\t\t: new Float32Array( dataLength ).fill( 1.0 );\n\n\t\t\t\tfor ( let i = 0; i < dataLength; i += 4 ) {\n\n\t\t\t\t\tfor ( let c = 0; c < 3; c ++ ) {\n\n\t\t\t\t\t\tconst idx = i + c;\n\t\t\t\t\t\tconst sdrValue = sdrData[ idx ];\n\t\t\t\t\t\tconst gainmapValue = gainmapData[ idx ] * 0.00392156862745098; // 1/255\n\n\t\t\t\t\t\tconst logRecovery = useGammaOne\n\t\t\t\t\t\t\t? gainmapValue\n\t\t\t\t\t\t\t: Math.pow( gainmapValue, invGamma );\n\n\t\t\t\t\t\tconst logBoost = gainMapMin + ( gainMapMax - gainMapMin ) * logRecovery;\n\n\t\t\t\t\t\tconst hdrValue =\n\t\t\t\t\t\t\t( sdrValue + offsetSDR ) *\n\t\t\t\t\t\t\t\t( logBoost * weightFactor === 0.0\n\t\t\t\t\t\t\t\t\t? 1.0\n\t\t\t\t\t\t\t\t\t: Math.pow( 2, logBoost * weightFactor ) ) -\n\t\t\t\t\t\t\toffsetHDR;\n\n\t\t\t\t\t\tconst linearHDRValue = Math.min(\n\t\t\t\t\t\t\tMath.max( srgbToLinear( hdrValue ), 0 ),\n\t\t\t\t\t\t\t65504\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\thdrBuffer[ idx ] = isHalfFloat\n\t\t\t\t\t\t\t? toHalfFloat( linearHDRValue )\n\t\t\t\t\t\t\t: linearHDRValue;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tonSuccess( hdrBuffer, sdrWidth, sdrHeight );\n\n\t\t\t} )\n\t\t\t.catch( ( e ) => {\n\n\t\t\t\tonError( e );\n\n\t\t\t} );\n\n\t}\n\n}\n\nexport { UltraHDRLoader };\n", "import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tColor,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tLoader,\n\tVector3,\n\tSRGBColorSpace\n} from 'three';\n\n/**\n * A loader for the STL format, as created by Solidworks and other CAD programs.\n *\n * Supports both binary and ASCII encoded files. The loader returns a non-indexed buffer geometry.\n *\n * Limitations:\n * - Binary decoding supports \"Magics\" color format (http://en.wikipedia.org/wiki/STL_(file_format)#Color_in_binary_STL).\n * - There is perhaps some question as to how valid it is to always assume little-endian-ness.\n * - ASCII decoding assumes file is UTF-8.\n *\n * ```js\n * const loader = new STLLoader();\n * const geometry = await loader.loadAsync( './models/stl/slotted_disk.stl' )\n * scene.add( new THREE.Mesh( geometry ) );\n * ```\n * For binary STLs geometry might contain colors for vertices. To use it:\n * ```js\n * // use the same code to load STL as above\n * if ( geometry.hasColors ) {\n * \tmaterial = new THREE.MeshPhongMaterial( { opacity: geometry.alpha, vertexColors: true } );\n * }\n * const mesh = new THREE.Mesh( geometry, material );\n * ```\n * For ASCII STLs containing multiple solids, each solid is assigned to a different group.\n * Groups can be used to assign a different color by defining an array of materials with the same length of\n * geometry.groups and passing it to the Mesh constructor:\n *\n * ```js\n * const materials = [];\n * const nGeometryGroups = geometry.groups.length;\n *\n * for ( let i = 0; i < nGeometryGroups; i ++ ) {\n * \tconst material = new THREE.MeshPhongMaterial( { color: colorMap[ i ], wireframe: false } );\n * \tmaterials.push( material );\n * }\n *\n * const mesh = new THREE.Mesh(geometry, materials);\n * ```\n *\n * @augments Loader\n * @three_import import { STLLoader } from 'three/addons/loaders/STLLoader.js';\n */\nclass STLLoader extends Loader {\n\n\t/**\n\t * Constructs a new STL loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded STL asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(BufferGeometry)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( text ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given STL data and returns the resulting geometry.\n\t *\n\t * @param {ArrayBuffer} data - The raw STL data as an array buffer.\n\t * @return {BufferGeometry} The parsed geometry.\n\t */\n\tparse( data ) {\n\n\t\tfunction isBinary( data ) {\n\n\t\t\tconst reader = new DataView( data );\n\t\t\tconst face_size = ( 32 / 8 * 3 ) + ( ( 32 / 8 * 3 ) * 3 ) + ( 16 / 8 );\n\t\t\tconst n_faces = reader.getUint32( 80, true );\n\t\t\tconst expect = 80 + ( 32 / 8 ) + ( n_faces * face_size );\n\n\t\t\tif ( expect === reader.byteLength ) {\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\t// An ASCII STL data must begin with 'solid ' as the first six bytes.\n\t\t\t// However, ASCII STLs lacking the SPACE after the 'd' are known to be\n\t\t\t// plentiful.  So, check the first 5 bytes for 'solid'.\n\n\t\t\t// Several encodings, such as UTF-8, precede the text with up to 5 bytes:\n\t\t\t// https://en.wikipedia.org/wiki/Byte_order_mark#Byte_order_marks_by_encoding\n\t\t\t// Search for \"solid\" to start anywhere after those prefixes.\n\n\t\t\t// US-ASCII ordinal values for 's', 'o', 'l', 'i', 'd'\n\n\t\t\tconst solid = [ 115, 111, 108, 105, 100 ];\n\n\t\t\tfor ( let off = 0; off < 5; off ++ ) {\n\n\t\t\t\t// If \"solid\" text is matched to the current offset, declare it to be an ASCII STL.\n\n\t\t\t\tif ( matchDataViewAt( solid, reader, off ) ) return false;\n\n\t\t\t}\n\n\t\t\t// Couldn't find \"solid\" text at the beginning; it is binary STL.\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction matchDataViewAt( query, reader, offset ) {\n\n\t\t\t// Check if each byte in query matches the corresponding byte from the current offset\n\n\t\t\tfor ( let i = 0, il = query.length; i < il; i ++ ) {\n\n\t\t\t\tif ( query[ i ] !== reader.getUint8( offset + i ) ) return false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction parseBinary( data ) {\n\n\t\t\tconst reader = new DataView( data );\n\t\t\tconst faces = reader.getUint32( 80, true );\n\n\t\t\tlet r, g, b, hasColors = false, colors;\n\t\t\tlet defaultR, defaultG, defaultB, alpha;\n\n\t\t\t// process STL header\n\t\t\t// check for default color in header (\"COLOR=rgba\" sequence).\n\n\t\t\tfor ( let index = 0; index < 80 - 10; index ++ ) {\n\n\t\t\t\tif ( ( reader.getUint32( index, false ) == 0x434F4C4F /*COLO*/ ) &&\n\t\t\t\t\t( reader.getUint8( index + 4 ) == 0x52 /*'R'*/ ) &&\n\t\t\t\t\t( reader.getUint8( index + 5 ) == 0x3D /*'='*/ ) ) {\n\n\t\t\t\t\thasColors = true;\n\t\t\t\t\tcolors = new Float32Array( faces * 3 * 3 );\n\n\t\t\t\t\tdefaultR = reader.getUint8( index + 6 ) / 255;\n\t\t\t\t\tdefaultG = reader.getUint8( index + 7 ) / 255;\n\t\t\t\t\tdefaultB = reader.getUint8( index + 8 ) / 255;\n\t\t\t\t\talpha = reader.getUint8( index + 9 ) / 255;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst dataOffset = 84;\n\t\t\tconst faceLength = 12 * 4 + 2;\n\n\t\t\tconst geometry = new BufferGeometry();\n\n\t\t\tconst vertices = new Float32Array( faces * 3 * 3 );\n\t\t\tconst normals = new Float32Array( faces * 3 * 3 );\n\n\t\t\tconst color = new Color();\n\n\t\t\tfor ( let face = 0; face < faces; face ++ ) {\n\n\t\t\t\tconst start = dataOffset + face * faceLength;\n\t\t\t\tconst normalX = reader.getFloat32( start, true );\n\t\t\t\tconst normalY = reader.getFloat32( start + 4, true );\n\t\t\t\tconst normalZ = reader.getFloat32( start + 8, true );\n\n\t\t\t\tif ( hasColors ) {\n\n\t\t\t\t\tconst packedColor = reader.getUint16( start + 48, true );\n\n\t\t\t\t\tif ( ( packedColor & 0x8000 ) === 0 ) {\n\n\t\t\t\t\t\t// facet has its own unique color\n\n\t\t\t\t\t\tr = ( packedColor & 0x1F ) / 31;\n\t\t\t\t\t\tg = ( ( packedColor >> 5 ) & 0x1F ) / 31;\n\t\t\t\t\t\tb = ( ( packedColor >> 10 ) & 0x1F ) / 31;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tr = defaultR;\n\t\t\t\t\t\tg = defaultG;\n\t\t\t\t\t\tb = defaultB;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 1; i <= 3; i ++ ) {\n\n\t\t\t\t\tconst vertexstart = start + i * 12;\n\t\t\t\t\tconst componentIdx = ( face * 3 * 3 ) + ( ( i - 1 ) * 3 );\n\n\t\t\t\t\tvertices[ componentIdx ] = reader.getFloat32( vertexstart, true );\n\t\t\t\t\tvertices[ componentIdx + 1 ] = reader.getFloat32( vertexstart + 4, true );\n\t\t\t\t\tvertices[ componentIdx + 2 ] = reader.getFloat32( vertexstart + 8, true );\n\n\t\t\t\t\tnormals[ componentIdx ] = normalX;\n\t\t\t\t\tnormals[ componentIdx + 1 ] = normalY;\n\t\t\t\t\tnormals[ componentIdx + 2 ] = normalZ;\n\n\t\t\t\t\tif ( hasColors ) {\n\n\t\t\t\t\t\tcolor.setRGB( r, g, b, SRGBColorSpace );\n\n\t\t\t\t\t\tcolors[ componentIdx ] = color.r;\n\t\t\t\t\t\tcolors[ componentIdx + 1 ] = color.g;\n\t\t\t\t\t\tcolors[ componentIdx + 2 ] = color.b;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'position', new BufferAttribute( vertices, 3 ) );\n\t\t\tgeometry.setAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\n\t\t\tif ( hasColors ) {\n\n\t\t\t\tgeometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) );\n\t\t\t\tgeometry.hasColors = true;\n\t\t\t\tgeometry.alpha = alpha;\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction parseASCII( data ) {\n\n\t\t\tconst geometry = new BufferGeometry();\n\t\t\tconst patternSolid = /solid([\\s\\S]*?)endsolid/g;\n\t\t\tconst patternFace = /facet([\\s\\S]*?)endfacet/g;\n\t\t\tconst patternName = /solid\\s(.+)/;\n\t\t\tlet faceCounter = 0;\n\n\t\t\tconst patternFloat = /[\\s]+([+-]?(?:\\d*)(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)/.source;\n\t\t\tconst patternVertex = new RegExp( 'vertex' + patternFloat + patternFloat + patternFloat, 'g' );\n\t\t\tconst patternNormal = new RegExp( 'normal' + patternFloat + patternFloat + patternFloat, 'g' );\n\n\t\t\tconst vertices = [];\n\t\t\tconst normals = [];\n\t\t\tconst groupNames = [];\n\n\t\t\tconst normal = new Vector3();\n\n\t\t\tlet result;\n\n\t\t\tlet groupCount = 0;\n\t\t\tlet startVertex = 0;\n\t\t\tlet endVertex = 0;\n\n\t\t\twhile ( ( result = patternSolid.exec( data ) ) !== null ) {\n\n\t\t\t\tstartVertex = endVertex;\n\n\t\t\t\tconst solid = result[ 0 ];\n\n\t\t\t\tconst name = ( result = patternName.exec( solid ) ) !== null ? result[ 1 ] : '';\n\t\t\t\tgroupNames.push( name );\n\n\t\t\t\twhile ( ( result = patternFace.exec( solid ) ) !== null ) {\n\n\t\t\t\t\tlet vertexCountPerFace = 0;\n\t\t\t\t\tlet normalCountPerFace = 0;\n\n\t\t\t\t\tconst text = result[ 0 ];\n\n\t\t\t\t\twhile ( ( result = patternNormal.exec( text ) ) !== null ) {\n\n\t\t\t\t\t\tnormal.x = parseFloat( result[ 1 ] );\n\t\t\t\t\t\tnormal.y = parseFloat( result[ 2 ] );\n\t\t\t\t\t\tnormal.z = parseFloat( result[ 3 ] );\n\t\t\t\t\t\tnormalCountPerFace ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\twhile ( ( result = patternVertex.exec( text ) ) !== null ) {\n\n\t\t\t\t\t\tvertices.push( parseFloat( result[ 1 ] ), parseFloat( result[ 2 ] ), parseFloat( result[ 3 ] ) );\n\t\t\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\t\t\t\t\t\tvertexCountPerFace ++;\n\t\t\t\t\t\tendVertex ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// every face have to own ONE valid normal\n\n\t\t\t\t\tif ( normalCountPerFace !== 1 ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.STLLoader: Something isn\\'t right with the normal of face number ' + faceCounter );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// each face have to own THREE valid vertices\n\n\t\t\t\t\tif ( vertexCountPerFace !== 3 ) {\n\n\t\t\t\t\t\tconsole.error( 'THREE.STLLoader: Something isn\\'t right with the vertices of face number ' + faceCounter );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfaceCounter ++;\n\n\t\t\t\t}\n\n\t\t\t\tconst start = startVertex;\n\t\t\t\tconst count = endVertex - startVertex;\n\n\t\t\t\tgeometry.userData.groupNames = groupNames;\n\n\t\t\t\tgeometry.addGroup( start, count, groupCount );\n\t\t\t\tgroupCount ++;\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\t\tgeometry.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction ensureString( buffer ) {\n\n\t\t\tif ( typeof buffer !== 'string' ) {\n\n\t\t\t\treturn new TextDecoder().decode( buffer );\n\n\t\t\t}\n\n\t\t\treturn buffer;\n\n\t\t}\n\n\t\tfunction ensureBinary( buffer ) {\n\n\t\t\tif ( typeof buffer === 'string' ) {\n\n\t\t\t\tconst array_buffer = new Uint8Array( buffer.length );\n\t\t\t\tfor ( let i = 0; i < buffer.length; i ++ ) {\n\n\t\t\t\t\tarray_buffer[ i ] = buffer.charCodeAt( i ) & 0xff; // implicitly assumes little-endian\n\n\t\t\t\t}\n\n\t\t\t\treturn array_buffer.buffer || array_buffer;\n\n\t\t\t} else {\n\n\t\t\t\treturn buffer;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// start\n\n\t\tconst binData = ensureBinary( data );\n\n\t\treturn isBinary( binData ) ? parseBinary( binData ) : parseASCII( ensureString( data ) );\n\n\t}\n\n}\n\nexport { STLLoader };\n", "import {\n\tBox2,\n\tBufferGeometry,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tLoader,\n\tMatrix3,\n\tPath,\n\tShape,\n\tShapePath,\n\tShapeUtils,\n\tSRGBColorSpace,\n\tVector2,\n\tVector3\n} from 'three';\n\nconst COLOR_SPACE_SVG = SRGBColorSpace;\n\n/**\n * A loader for the SVG format.\n *\n * Scalable Vector Graphics is an XML-based vector image format for two-dimensional graphics\n * with support for interactivity and animation.\n *\n * ```js\n * const loader = new SVGLoader();\n * const data = await loader.loadAsync( 'data/svgSample.svg' );\n *\n * const paths = data.paths;\n * const group = new THREE.Group();\n *\n * for ( let i = 0; i < paths.length; i ++ ) {\n *\n * \tconst path = paths[ i ];\n * \tconst material = new THREE.MeshBasicMaterial( {\n * \t\tcolor: path.color,\n * \t\tside: THREE.DoubleSide,\n * \t\tdepthWrite: false\n * \t} );\n *\n * \tconst shapes = SVGLoader.createShapes( path );\n *\n * \tfor ( let j = 0; j < shapes.length; j ++ ) {\n *\n * \t\tconst shape = shapes[ j ];\n * \t\tconst geometry = new THREE.ShapeGeometry( shape );\n * \t\tconst mesh = new THREE.Mesh( geometry, material );\n * \t\tgroup.add( mesh );\n *\n * \t}\n *\n * }\n *\n * scene.add( group );\n * ```\n *\n * @augments Loader\n * @three_import import { SVGLoader } from 'three/addons/loaders/SVGLoader.js';\n */\nclass SVGLoader extends Loader {\n\n\t/**\n\t * Constructs a new SVG loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * Default dots per inch.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 90\n\t\t */\n\t\tthis.defaultDPI = 90;\n\n\t\t/**\n\t\t * Default unit.\n\t\t *\n\t\t * @type {('mm'|'cm'|'in'|'pt'|'pc'|'px')}\n\t\t * @default 'px'\n\t\t */\n\t\tthis.defaultUnit = 'px';\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded SVG asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function({paths:Array<ShapePath>,xml:string})} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( text ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given SVG data and returns the resulting data.\n\t *\n\t * @param {string} text - The raw SVG data as a string.\n\t * @return {{paths:Array<ShapePath>,xml:string}} An object holding an array of shape paths and the\n\t * SVG XML document.\n\t */\n\tparse( text ) {\n\n\t\tconst scope = this;\n\n\t\tfunction parseNode( node, style ) {\n\n\t\t\tif ( node.nodeType !== 1 ) return;\n\n\t\t\tconst transform = getNodeTransform( node );\n\n\t\t\tlet isDefsNode = false;\n\n\t\t\tlet path = null;\n\n\t\t\tswitch ( node.nodeName ) {\n\n\t\t\t\tcase 'svg':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'style':\n\t\t\t\t\tparseCSSStylesheet( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'g':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'path':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tif ( node.hasAttribute( 'd' ) ) path = parsePathNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'rect':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parseRectNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'polygon':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parsePolygonNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'polyline':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parsePolylineNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'circle':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parseCircleNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ellipse':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parseEllipseNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'line':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\t\t\t\t\tpath = parseLineNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'defs':\n\t\t\t\t\tisDefsNode = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'use':\n\t\t\t\t\tstyle = parseStyle( node, style );\n\n\t\t\t\t\tconst href = node.getAttributeNS( 'http://www.w3.org/1999/xlink', 'href' ) || '';\n\t\t\t\t\tconst usedNodeId = href.substring( 1 );\n\t\t\t\t\tconst usedNode = node.viewportElement.getElementById( usedNodeId );\n\t\t\t\t\tif ( usedNode ) {\n\n\t\t\t\t\t\tparseNode( usedNode, style );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconsole.warn( 'SVGLoader: \\'use node\\' references non-existent node id: ' + usedNodeId );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\t// console.log( node );\n\n\t\t\t}\n\n\t\t\tif ( path ) {\n\n\t\t\t\tif ( style.fill !== undefined && style.fill !== 'none' ) {\n\n\t\t\t\t\tpath.color.setStyle( style.fill, COLOR_SPACE_SVG );\n\n\t\t\t\t}\n\n\t\t\t\ttransformPath( path, currentTransform );\n\n\t\t\t\tpaths.push( path );\n\n\t\t\t\tpath.userData = { node: node, style: style };\n\n\t\t\t}\n\n\t\t\tconst childNodes = node.childNodes;\n\n\t\t\tfor ( let i = 0; i < childNodes.length; i ++ ) {\n\n\t\t\t\tconst node = childNodes[ i ];\n\n\t\t\t\tif ( isDefsNode && node.nodeName !== 'style' && node.nodeName !== 'defs' ) {\n\n\t\t\t\t\t// Ignore everything in defs except CSS style definitions\n\t\t\t\t\t// and nested defs, because it is OK by the standard to have\n\t\t\t\t\t// <style/> there.\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\tparseNode( node, style );\n\n\t\t\t}\n\n\n\t\t\tif ( transform ) {\n\n\t\t\t\ttransformStack.pop();\n\n\t\t\t\tif ( transformStack.length > 0 ) {\n\n\t\t\t\t\tcurrentTransform.copy( transformStack[ transformStack.length - 1 ] );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcurrentTransform.identity();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction parsePathNode( node ) {\n\n\t\t\tconst path = new ShapePath();\n\n\t\t\tconst point = new Vector2();\n\t\t\tconst control = new Vector2();\n\n\t\t\tconst firstPoint = new Vector2();\n\t\t\tlet isFirstPoint = true;\n\t\t\tlet doSetFirstPoint = false;\n\n\t\t\tconst d = node.getAttribute( 'd' );\n\n\t\t\tif ( d === '' || d === 'none' ) return null;\n\n\t\t\t// console.log( d );\n\n\t\t\tconst commands = d.match( /[a-df-z][^a-df-z]*/ig );\n\n\t\t\tfor ( let i = 0, l = commands.length; i < l; i ++ ) {\n\n\t\t\t\tconst command = commands[ i ];\n\n\t\t\t\tconst type = command.charAt( 0 );\n\t\t\t\tconst data = command.slice( 1 ).trim();\n\n\t\t\t\tif ( isFirstPoint === true ) {\n\n\t\t\t\t\tdoSetFirstPoint = true;\n\t\t\t\t\tisFirstPoint = false;\n\n\t\t\t\t}\n\n\t\t\t\tlet numbers;\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\tcase 'M':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 1 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\n\t\t\t\t\t\t\tif ( j === 0 ) {\n\n\t\t\t\t\t\t\t\tpath.moveTo( point.x, point.y );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( j === 0 ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'H':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tpoint.x = numbers[ j ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'V':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tpoint.y = numbers[ j ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'L':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 1 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'C':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 6 ) {\n\n\t\t\t\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\t\t\t\tnumbers[ j + 0 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 1 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 2 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 3 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 4 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 5 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = numbers[ j + 2 ];\n\t\t\t\t\t\t\tcontrol.y = numbers[ j + 3 ];\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 4 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 5 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'S':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {\n\n\t\t\t\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\t\t\t\tgetReflection( point.x, control.x ),\n\t\t\t\t\t\t\t\tgetReflection( point.y, control.y ),\n\t\t\t\t\t\t\t\tnumbers[ j + 0 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 1 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 2 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 3 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tcontrol.y = numbers[ j + 1 ];\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 2 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 3 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Q':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {\n\n\t\t\t\t\t\t\tpath.quadraticCurveTo(\n\t\t\t\t\t\t\t\tnumbers[ j + 0 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 1 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 2 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 3 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tcontrol.y = numbers[ j + 1 ];\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 2 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 3 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'T':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tconst rx = getReflection( point.x, control.x );\n\t\t\t\t\t\t\tconst ry = getReflection( point.y, control.y );\n\t\t\t\t\t\t\tpath.quadraticCurveTo(\n\t\t\t\t\t\t\t\trx,\n\t\t\t\t\t\t\t\try,\n\t\t\t\t\t\t\t\tnumbers[ j + 0 ],\n\t\t\t\t\t\t\t\tnumbers[ j + 1 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = rx;\n\t\t\t\t\t\t\tcontrol.y = ry;\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 1 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'A':\n\t\t\t\t\t\tnumbers = parseFloats( data, [ 3, 4 ], 7 );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 7 ) {\n\n\t\t\t\t\t\t\t// skip command if start point == end point\n\t\t\t\t\t\t\tif ( numbers[ j + 5 ] == point.x && numbers[ j + 6 ] == point.y ) continue;\n\n\t\t\t\t\t\t\tconst start = point.clone();\n\t\t\t\t\t\t\tpoint.x = numbers[ j + 5 ];\n\t\t\t\t\t\t\tpoint.y = numbers[ j + 6 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tparseArcCommand(\n\t\t\t\t\t\t\t\tpath, numbers[ j ], numbers[ j + 1 ], numbers[ j + 2 ], numbers[ j + 3 ], numbers[ j + 4 ], start, point\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'm':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 1 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\n\t\t\t\t\t\t\tif ( j === 0 ) {\n\n\t\t\t\t\t\t\t\tpath.moveTo( point.x, point.y );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( j === 0 ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'h':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tpoint.x += numbers[ j ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'v':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\t\tpoint.y += numbers[ j ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'l':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 1 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tpath.lineTo( point.x, point.y );\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'c':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 6 ) {\n\n\t\t\t\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 0 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 1 ],\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 2 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 3 ],\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 4 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 5 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = point.x + numbers[ j + 2 ];\n\t\t\t\t\t\t\tcontrol.y = point.y + numbers[ j + 3 ];\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 4 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 5 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 's':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {\n\n\t\t\t\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\t\t\t\tgetReflection( point.x, control.x ),\n\t\t\t\t\t\t\t\tgetReflection( point.y, control.y ),\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 0 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 1 ],\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 2 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 3 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = point.x + numbers[ j + 0 ];\n\t\t\t\t\t\t\tcontrol.y = point.y + numbers[ j + 1 ];\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 2 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 3 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'q':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 4 ) {\n\n\t\t\t\t\t\t\tpath.quadraticCurveTo(\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 0 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 1 ],\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 2 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 3 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = point.x + numbers[ j + 0 ];\n\t\t\t\t\t\t\tcontrol.y = point.y + numbers[ j + 1 ];\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 2 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 3 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 't':\n\t\t\t\t\t\tnumbers = parseFloats( data );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 2 ) {\n\n\t\t\t\t\t\t\tconst rx = getReflection( point.x, control.x );\n\t\t\t\t\t\t\tconst ry = getReflection( point.y, control.y );\n\t\t\t\t\t\t\tpath.quadraticCurveTo(\n\t\t\t\t\t\t\t\trx,\n\t\t\t\t\t\t\t\try,\n\t\t\t\t\t\t\t\tpoint.x + numbers[ j + 0 ],\n\t\t\t\t\t\t\t\tpoint.y + numbers[ j + 1 ]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tcontrol.x = rx;\n\t\t\t\t\t\t\tcontrol.y = ry;\n\t\t\t\t\t\t\tpoint.x = point.x + numbers[ j + 0 ];\n\t\t\t\t\t\t\tpoint.y = point.y + numbers[ j + 1 ];\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'a':\n\t\t\t\t\t\tnumbers = parseFloats( data, [ 3, 4 ], 7 );\n\n\t\t\t\t\t\tfor ( let j = 0, jl = numbers.length; j < jl; j += 7 ) {\n\n\t\t\t\t\t\t\t// skip command if no displacement\n\t\t\t\t\t\t\tif ( numbers[ j + 5 ] == 0 && numbers[ j + 6 ] == 0 ) continue;\n\n\t\t\t\t\t\t\tconst start = point.clone();\n\t\t\t\t\t\t\tpoint.x += numbers[ j + 5 ];\n\t\t\t\t\t\t\tpoint.y += numbers[ j + 6 ];\n\t\t\t\t\t\t\tcontrol.x = point.x;\n\t\t\t\t\t\t\tcontrol.y = point.y;\n\t\t\t\t\t\t\tparseArcCommand(\n\t\t\t\t\t\t\t\tpath, numbers[ j ], numbers[ j + 1 ], numbers[ j + 2 ], numbers[ j + 3 ], numbers[ j + 4 ], start, point\n\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\tif ( j === 0 && doSetFirstPoint === true ) firstPoint.copy( point );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'Z':\n\t\t\t\t\tcase 'z':\n\t\t\t\t\t\tpath.currentPath.autoClose = true;\n\n\t\t\t\t\t\tif ( path.currentPath.curves.length > 0 ) {\n\n\t\t\t\t\t\t\t// Reset point to beginning of Path\n\t\t\t\t\t\t\tpoint.copy( firstPoint );\n\t\t\t\t\t\t\tpath.currentPath.currentPoint.copy( point );\n\t\t\t\t\t\t\tisFirstPoint = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn( command );\n\n\t\t\t\t}\n\n\t\t\t\t// console.log( type, parseFloats( data ), parseFloats( data ).length  )\n\n\t\t\t\tdoSetFirstPoint = false;\n\n\t\t\t}\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parseCSSStylesheet( node ) {\n\n\t\t\tif ( ! node.sheet || ! node.sheet.cssRules || ! node.sheet.cssRules.length ) return;\n\n\t\t\tfor ( let i = 0; i < node.sheet.cssRules.length; i ++ ) {\n\n\t\t\t\tconst stylesheet = node.sheet.cssRules[ i ];\n\n\t\t\t\tif ( stylesheet.type !== 1 ) continue;\n\n\t\t\t\tconst selectorList = stylesheet.selectorText\n\t\t\t\t\t.split( /,/gm )\n\t\t\t\t\t.filter( Boolean )\n\t\t\t\t\t.map( i => i.trim() );\n\n\t\t\t\tfor ( let j = 0; j < selectorList.length; j ++ ) {\n\n\t\t\t\t\t// Remove empty rules\n\t\t\t\t\tconst definitions = Object.fromEntries(\n\t\t\t\t\t\tObject.entries( stylesheet.style ).filter( ( [ , v ] ) => v !== '' )\n\t\t\t\t\t);\n\n\t\t\t\t\tstylesheets[ selectorList[ j ] ] = Object.assign(\n\t\t\t\t\t\tstylesheets[ selectorList[ j ] ] || {},\n\t\t\t\t\t\tdefinitions\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t/**\n\t\t * https://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes\n\t\t * https://mortoray.com/2017/02/16/rendering-an-svg-elliptical-arc-as-bezier-curves/ Appendix: Endpoint to center arc conversion\n\t\t * From\n\t\t * rx ry x-axis-rotation large-arc-flag sweep-flag x y\n\t\t * To\n\t\t * aX, aY, xRadius, yRadius, aStartAngle, aEndAngle, aClockwise, aRotation\n\t\t */\n\n\t\tfunction parseArcCommand( path, rx, ry, x_axis_rotation, large_arc_flag, sweep_flag, start, end ) {\n\n\t\t\tif ( rx == 0 || ry == 0 ) {\n\n\t\t\t\t// draw a line if either of the radii == 0\n\t\t\t\tpath.lineTo( end.x, end.y );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tx_axis_rotation = x_axis_rotation * Math.PI / 180;\n\n\t\t\t// Ensure radii are positive\n\t\t\trx = Math.abs( rx );\n\t\t\try = Math.abs( ry );\n\n\t\t\t// Compute (x1', y1')\n\t\t\tconst dx2 = ( start.x - end.x ) / 2.0;\n\t\t\tconst dy2 = ( start.y - end.y ) / 2.0;\n\t\t\tconst x1p = Math.cos( x_axis_rotation ) * dx2 + Math.sin( x_axis_rotation ) * dy2;\n\t\t\tconst y1p = - Math.sin( x_axis_rotation ) * dx2 + Math.cos( x_axis_rotation ) * dy2;\n\n\t\t\t// Compute (cx', cy')\n\t\t\tlet rxs = rx * rx;\n\t\t\tlet rys = ry * ry;\n\t\t\tconst x1ps = x1p * x1p;\n\t\t\tconst y1ps = y1p * y1p;\n\n\t\t\t// Ensure radii are large enough\n\t\t\tconst cr = x1ps / rxs + y1ps / rys;\n\n\t\t\tif ( cr > 1 ) {\n\n\t\t\t\t// scale up rx,ry equally so cr == 1\n\t\t\t\tconst s = Math.sqrt( cr );\n\t\t\t\trx = s * rx;\n\t\t\t\try = s * ry;\n\t\t\t\trxs = rx * rx;\n\t\t\t\trys = ry * ry;\n\n\t\t\t}\n\n\t\t\tconst dq = ( rxs * y1ps + rys * x1ps );\n\t\t\tconst pq = ( rxs * rys - dq ) / dq;\n\t\t\tlet q = Math.sqrt( Math.max( 0, pq ) );\n\t\t\tif ( large_arc_flag === sweep_flag ) q = - q;\n\t\t\tconst cxp = q * rx * y1p / ry;\n\t\t\tconst cyp = - q * ry * x1p / rx;\n\n\t\t\t// Step 3: Compute (cx, cy) from (cx', cy')\n\t\t\tconst cx = Math.cos( x_axis_rotation ) * cxp - Math.sin( x_axis_rotation ) * cyp + ( start.x + end.x ) / 2;\n\t\t\tconst cy = Math.sin( x_axis_rotation ) * cxp + Math.cos( x_axis_rotation ) * cyp + ( start.y + end.y ) / 2;\n\n\t\t\t// Step 4: Compute \u03B81 and \u0394\u03B8\n\t\t\tconst theta = svgAngle( 1, 0, ( x1p - cxp ) / rx, ( y1p - cyp ) / ry );\n\t\t\tconst delta = svgAngle( ( x1p - cxp ) / rx, ( y1p - cyp ) / ry, ( - x1p - cxp ) / rx, ( - y1p - cyp ) / ry ) % ( Math.PI * 2 );\n\n\t\t\tpath.currentPath.absellipse( cx, cy, rx, ry, theta, theta + delta, sweep_flag === 0, x_axis_rotation );\n\n\t\t}\n\n\t\tfunction svgAngle( ux, uy, vx, vy ) {\n\n\t\t\tconst dot = ux * vx + uy * vy;\n\t\t\tconst len = Math.sqrt( ux * ux + uy * uy ) * Math.sqrt( vx * vx + vy * vy );\n\t\t\tlet ang = Math.acos( Math.max( - 1, Math.min( 1, dot / len ) ) ); // floating point precision, slightly over values appear\n\t\t\tif ( ( ux * vy - uy * vx ) < 0 ) ang = - ang;\n\t\t\treturn ang;\n\n\t\t}\n\n\t\t/*\n\t\t* According to https://www.w3.org/TR/SVG/shapes.html#RectElementRXAttribute\n\t\t* rounded corner should be rendered to elliptical arc, but bezier curve does the job well enough\n\t\t*/\n\n\t\tfunction parseRectNode( node ) {\n\n\t\t\tconst x = parseFloatWithUnits( node.getAttribute( 'x' ) || 0 );\n\t\t\tconst y = parseFloatWithUnits( node.getAttribute( 'y' ) || 0 );\n\t\t\tconst rx = parseFloatWithUnits( node.getAttribute( 'rx' ) || node.getAttribute( 'ry' ) || 0 );\n\t\t\tconst ry = parseFloatWithUnits( node.getAttribute( 'ry' ) || node.getAttribute( 'rx' ) || 0 );\n\t\t\tconst w = parseFloatWithUnits( node.getAttribute( 'width' ) );\n\t\t\tconst h = parseFloatWithUnits( node.getAttribute( 'height' ) );\n\n\t\t\t// Ellipse arc to Bezier approximation Coefficient (Inversed). See:\n\t\t\t// https://spencermortensen.com/articles/bezier-circle/\n\t\t\tconst bci = 1 - 0.551915024494;\n\n\t\t\tconst path = new ShapePath();\n\n\t\t\t// top left\n\t\t\tpath.moveTo( x + rx, y );\n\n\t\t\t// top right\n\t\t\tpath.lineTo( x + w - rx, y );\n\t\t\tif ( rx !== 0 || ry !== 0 ) {\n\n\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\tx + w - rx * bci,\n\t\t\t\t\ty,\n\t\t\t\t\tx + w,\n\t\t\t\t\ty + ry * bci,\n\t\t\t\t\tx + w,\n\t\t\t\t\ty + ry\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\t// bottom right\n\t\t\tpath.lineTo( x + w, y + h - ry );\n\t\t\tif ( rx !== 0 || ry !== 0 ) {\n\n\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\tx + w,\n\t\t\t\t\ty + h - ry * bci,\n\t\t\t\t\tx + w - rx * bci,\n\t\t\t\t\ty + h,\n\t\t\t\t\tx + w - rx,\n\t\t\t\t\ty + h\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\t// bottom left\n\t\t\tpath.lineTo( x + rx, y + h );\n\t\t\tif ( rx !== 0 || ry !== 0 ) {\n\n\t\t\t\tpath.bezierCurveTo(\n\t\t\t\t\tx + rx * bci,\n\t\t\t\t\ty + h,\n\t\t\t\t\tx,\n\t\t\t\t\ty + h - ry * bci,\n\t\t\t\t\tx,\n\t\t\t\t\ty + h - ry\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\t// back to top left\n\t\t\tpath.lineTo( x, y + ry );\n\t\t\tif ( rx !== 0 || ry !== 0 ) {\n\n\t\t\t\tpath.bezierCurveTo( x, y + ry * bci, x + rx * bci, y, x + rx, y );\n\n\t\t\t}\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parsePolygonNode( node ) {\n\n\t\t\tfunction iterator( match, a, b ) {\n\n\t\t\t\tconst x = parseFloatWithUnits( a );\n\t\t\t\tconst y = parseFloatWithUnits( b );\n\n\t\t\t\tif ( index === 0 ) {\n\n\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t}\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\tconst regex = /([+-]?\\d*\\.?\\d+(?:e[+-]?\\d+)?)(?:,|\\s)([+-]?\\d*\\.?\\d+(?:e[+-]?\\d+)?)/g;\n\n\t\t\tconst path = new ShapePath();\n\n\t\t\tlet index = 0;\n\n\t\t\tnode.getAttribute( 'points' ).replace( regex, iterator );\n\n\t\t\tpath.currentPath.autoClose = true;\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parsePolylineNode( node ) {\n\n\t\t\tfunction iterator( match, a, b ) {\n\n\t\t\t\tconst x = parseFloatWithUnits( a );\n\t\t\t\tconst y = parseFloatWithUnits( b );\n\n\t\t\t\tif ( index === 0 ) {\n\n\t\t\t\t\tpath.moveTo( x, y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tpath.lineTo( x, y );\n\n\t\t\t\t}\n\n\t\t\t\tindex ++;\n\n\t\t\t}\n\n\t\t\tconst regex = /([+-]?\\d*\\.?\\d+(?:e[+-]?\\d+)?)(?:,|\\s)([+-]?\\d*\\.?\\d+(?:e[+-]?\\d+)?)/g;\n\n\t\t\tconst path = new ShapePath();\n\n\t\t\tlet index = 0;\n\n\t\t\tnode.getAttribute( 'points' ).replace( regex, iterator );\n\n\t\t\tpath.currentPath.autoClose = false;\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parseCircleNode( node ) {\n\n\t\t\tconst x = parseFloatWithUnits( node.getAttribute( 'cx' ) || 0 );\n\t\t\tconst y = parseFloatWithUnits( node.getAttribute( 'cy' ) || 0 );\n\t\t\tconst r = parseFloatWithUnits( node.getAttribute( 'r' ) || 0 );\n\n\t\t\tconst subpath = new Path();\n\t\t\tsubpath.absarc( x, y, r, 0, Math.PI * 2 );\n\n\t\t\tconst path = new ShapePath();\n\t\t\tpath.subPaths.push( subpath );\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parseEllipseNode( node ) {\n\n\t\t\tconst x = parseFloatWithUnits( node.getAttribute( 'cx' ) || 0 );\n\t\t\tconst y = parseFloatWithUnits( node.getAttribute( 'cy' ) || 0 );\n\t\t\tconst rx = parseFloatWithUnits( node.getAttribute( 'rx' ) || 0 );\n\t\t\tconst ry = parseFloatWithUnits( node.getAttribute( 'ry' ) || 0 );\n\n\t\t\tconst subpath = new Path();\n\t\t\tsubpath.absellipse( x, y, rx, ry, 0, Math.PI * 2 );\n\n\t\t\tconst path = new ShapePath();\n\t\t\tpath.subPaths.push( subpath );\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction parseLineNode( node ) {\n\n\t\t\tconst x1 = parseFloatWithUnits( node.getAttribute( 'x1' ) || 0 );\n\t\t\tconst y1 = parseFloatWithUnits( node.getAttribute( 'y1' ) || 0 );\n\t\t\tconst x2 = parseFloatWithUnits( node.getAttribute( 'x2' ) || 0 );\n\t\t\tconst y2 = parseFloatWithUnits( node.getAttribute( 'y2' ) || 0 );\n\n\t\t\tconst path = new ShapePath();\n\t\t\tpath.moveTo( x1, y1 );\n\t\t\tpath.lineTo( x2, y2 );\n\t\t\tpath.currentPath.autoClose = false;\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\t//\n\n\t\tfunction parseStyle( node, style ) {\n\n\t\t\tstyle = Object.assign( {}, style ); // clone style\n\n\t\t\tlet stylesheetStyles = {};\n\n\t\t\tif ( node.hasAttribute( 'class' ) ) {\n\n\t\t\t\tconst classSelectors = node.getAttribute( 'class' )\n\t\t\t\t\t.split( /\\s/ )\n\t\t\t\t\t.filter( Boolean )\n\t\t\t\t\t.map( i => i.trim() );\n\n\t\t\t\tfor ( let i = 0; i < classSelectors.length; i ++ ) {\n\n\t\t\t\t\tstylesheetStyles = Object.assign( stylesheetStyles, stylesheets[ '.' + classSelectors[ i ] ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( node.hasAttribute( 'id' ) ) {\n\n\t\t\t\tstylesheetStyles = Object.assign( stylesheetStyles, stylesheets[ '#' + node.getAttribute( 'id' ) ] );\n\n\t\t\t}\n\n\t\t\tfunction addStyle( svgName, jsName, adjustFunction ) {\n\n\t\t\t\tif ( adjustFunction === undefined ) adjustFunction = function copy( v ) {\n\n\t\t\t\t\tif ( v.startsWith( 'url' ) ) console.warn( 'SVGLoader: url access in attributes is not implemented.' );\n\n\t\t\t\t\treturn v;\n\n\t\t\t\t};\n\n\t\t\t\tif ( node.hasAttribute( svgName ) ) style[ jsName ] = adjustFunction( node.getAttribute( svgName ) );\n\t\t\t\tif ( stylesheetStyles[ jsName ] ) style[ jsName ] = adjustFunction( stylesheetStyles[ jsName ] );\n\t\t\t\tif ( node.style && node.style[ svgName ] !== '' ) style[ jsName ] = adjustFunction( node.style[ svgName ] );\n\n\t\t\t}\n\n\t\t\tfunction clamp( v ) {\n\n\t\t\t\treturn Math.max( 0, Math.min( 1, parseFloatWithUnits( v ) ) );\n\n\t\t\t}\n\n\t\t\tfunction positive( v ) {\n\n\t\t\t\treturn Math.max( 0, parseFloatWithUnits( v ) );\n\n\t\t\t}\n\n\t\t\taddStyle( 'fill', 'fill' );\n\t\t\taddStyle( 'fill-opacity', 'fillOpacity', clamp );\n\t\t\taddStyle( 'fill-rule', 'fillRule' );\n\t\t\taddStyle( 'opacity', 'opacity', clamp );\n\t\t\taddStyle( 'stroke', 'stroke' );\n\t\t\taddStyle( 'stroke-opacity', 'strokeOpacity', clamp );\n\t\t\taddStyle( 'stroke-width', 'strokeWidth', positive );\n\t\t\taddStyle( 'stroke-linejoin', 'strokeLineJoin' );\n\t\t\taddStyle( 'stroke-linecap', 'strokeLineCap' );\n\t\t\taddStyle( 'stroke-miterlimit', 'strokeMiterLimit', positive );\n\t\t\taddStyle( 'visibility', 'visibility' );\n\n\t\t\treturn style;\n\n\t\t}\n\n\t\t// http://www.w3.org/TR/SVG11/implnote.html#PathElementImplementationNotes\n\n\t\tfunction getReflection( a, b ) {\n\n\t\t\treturn a - ( b - a );\n\n\t\t}\n\n\t\t// from https://github.com/ppvg/svg-numbers (MIT License)\n\n\t\tfunction parseFloats( input, flags, stride ) {\n\n\t\t\tif ( typeof input !== 'string' ) {\n\n\t\t\t\tthrow new TypeError( 'Invalid input: ' + typeof input );\n\n\t\t\t}\n\n\t\t\t// Character groups\n\t\t\tconst RE = {\n\t\t\t\tSEPARATOR: /[ \\t\\r\\n\\,.\\-+]/,\n\t\t\t\tWHITESPACE: /[ \\t\\r\\n]/,\n\t\t\t\tDIGIT: /[\\d]/,\n\t\t\t\tSIGN: /[-+]/,\n\t\t\t\tPOINT: /\\./,\n\t\t\t\tCOMMA: /,/,\n\t\t\t\tEXP: /e/i,\n\t\t\t\tFLAGS: /[01]/\n\t\t\t};\n\n\t\t\t// States\n\t\t\tconst SEP = 0;\n\t\t\tconst INT = 1;\n\t\t\tconst FLOAT = 2;\n\t\t\tconst EXP = 3;\n\n\t\t\tlet state = SEP;\n\t\t\tlet seenComma = true;\n\t\t\tlet number = '', exponent = '';\n\t\t\tconst result = [];\n\n\t\t\tfunction throwSyntaxError( current, i, partial ) {\n\n\t\t\t\tconst error = new SyntaxError( 'Unexpected character \"' + current + '\" at index ' + i + '.' );\n\t\t\t\terror.partial = partial;\n\t\t\t\tthrow error;\n\n\t\t\t}\n\n\t\t\tfunction newNumber() {\n\n\t\t\t\tif ( number !== '' ) {\n\n\t\t\t\t\tif ( exponent === '' ) result.push( Number( number ) );\n\t\t\t\t\telse result.push( Number( number ) * Math.pow( 10, Number( exponent ) ) );\n\n\t\t\t\t}\n\n\t\t\t\tnumber = '';\n\t\t\t\texponent = '';\n\n\t\t\t}\n\n\t\t\tlet current;\n\t\t\tconst length = input.length;\n\n\t\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\t\tcurrent = input[ i ];\n\n\t\t\t\t// check for flags\n\t\t\t\tif ( Array.isArray( flags ) && flags.includes( result.length % stride ) && RE.FLAGS.test( current ) ) {\n\n\t\t\t\t\tstate = INT;\n\t\t\t\t\tnumber = current;\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t\t// parse until next number\n\t\t\t\tif ( state === SEP ) {\n\n\t\t\t\t\t// eat whitespace\n\t\t\t\t\tif ( RE.WHITESPACE.test( current ) ) {\n\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// start new number\n\t\t\t\t\tif ( RE.DIGIT.test( current ) || RE.SIGN.test( current ) ) {\n\n\t\t\t\t\t\tstate = INT;\n\t\t\t\t\t\tnumber = current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.POINT.test( current ) ) {\n\n\t\t\t\t\t\tstate = FLOAT;\n\t\t\t\t\t\tnumber = current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// throw on double commas (e.g. \"1, , 2\")\n\t\t\t\t\tif ( RE.COMMA.test( current ) ) {\n\n\t\t\t\t\t\tif ( seenComma ) {\n\n\t\t\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tseenComma = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// parse integer part\n\t\t\t\tif ( state === INT ) {\n\n\t\t\t\t\tif ( RE.DIGIT.test( current ) ) {\n\n\t\t\t\t\t\tnumber += current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.POINT.test( current ) ) {\n\n\t\t\t\t\t\tnumber += current;\n\t\t\t\t\t\tstate = FLOAT;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.EXP.test( current ) ) {\n\n\t\t\t\t\t\tstate = EXP;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// throw on double signs (\"-+1\"), but not on sign as separator (\"-1-2\")\n\t\t\t\t\tif ( RE.SIGN.test( current )\n\t\t\t\t\t\t\t&& number.length === 1\n\t\t\t\t\t\t\t&& RE.SIGN.test( number[ 0 ] ) ) {\n\n\t\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// parse decimal part\n\t\t\t\tif ( state === FLOAT ) {\n\n\t\t\t\t\tif ( RE.DIGIT.test( current ) ) {\n\n\t\t\t\t\t\tnumber += current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.EXP.test( current ) ) {\n\n\t\t\t\t\t\tstate = EXP;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// throw on double decimal points (e.g. \"1..2\")\n\t\t\t\t\tif ( RE.POINT.test( current ) && number[ number.length - 1 ] === '.' ) {\n\n\t\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// parse exponent part\n\t\t\t\tif ( state === EXP ) {\n\n\t\t\t\t\tif ( RE.DIGIT.test( current ) ) {\n\n\t\t\t\t\t\texponent += current;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( RE.SIGN.test( current ) ) {\n\n\t\t\t\t\t\tif ( exponent === '' ) {\n\n\t\t\t\t\t\t\texponent += current;\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( exponent.length === 1 && RE.SIGN.test( exponent ) ) {\n\n\t\t\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t\t// end of number\n\t\t\t\tif ( RE.WHITESPACE.test( current ) ) {\n\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tstate = SEP;\n\t\t\t\t\tseenComma = false;\n\n\t\t\t\t} else if ( RE.COMMA.test( current ) ) {\n\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tstate = SEP;\n\t\t\t\t\tseenComma = true;\n\n\t\t\t\t} else if ( RE.SIGN.test( current ) ) {\n\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tstate = INT;\n\t\t\t\t\tnumber = current;\n\n\t\t\t\t} else if ( RE.POINT.test( current ) ) {\n\n\t\t\t\t\tnewNumber();\n\t\t\t\t\tstate = FLOAT;\n\t\t\t\t\tnumber = current;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthrowSyntaxError( current, i, result );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// add the last number found (if any)\n\t\t\tnewNumber();\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\t// Units\n\n\t\tconst units = [ 'mm', 'cm', 'in', 'pt', 'pc', 'px' ];\n\n\t\t// Conversion: [ fromUnit ][ toUnit ] (-1 means dpi dependent)\n\t\tconst unitConversion = {\n\n\t\t\t'mm': {\n\t\t\t\t'mm': 1,\n\t\t\t\t'cm': 0.1,\n\t\t\t\t'in': 1 / 25.4,\n\t\t\t\t'pt': 72 / 25.4,\n\t\t\t\t'pc': 6 / 25.4,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'cm': {\n\t\t\t\t'mm': 10,\n\t\t\t\t'cm': 1,\n\t\t\t\t'in': 1 / 2.54,\n\t\t\t\t'pt': 72 / 2.54,\n\t\t\t\t'pc': 6 / 2.54,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'in': {\n\t\t\t\t'mm': 25.4,\n\t\t\t\t'cm': 2.54,\n\t\t\t\t'in': 1,\n\t\t\t\t'pt': 72,\n\t\t\t\t'pc': 6,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'pt': {\n\t\t\t\t'mm': 25.4 / 72,\n\t\t\t\t'cm': 2.54 / 72,\n\t\t\t\t'in': 1 / 72,\n\t\t\t\t'pt': 1,\n\t\t\t\t'pc': 6 / 72,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'pc': {\n\t\t\t\t'mm': 25.4 / 6,\n\t\t\t\t'cm': 2.54 / 6,\n\t\t\t\t'in': 1 / 6,\n\t\t\t\t'pt': 72 / 6,\n\t\t\t\t'pc': 1,\n\t\t\t\t'px': - 1\n\t\t\t},\n\t\t\t'px': {\n\t\t\t\t'px': 1\n\t\t\t}\n\n\t\t};\n\n\t\tfunction parseFloatWithUnits( string ) {\n\n\t\t\tlet theUnit = 'px';\n\n\t\t\tif ( typeof string === 'string' || string instanceof String ) {\n\n\t\t\t\tfor ( let i = 0, n = units.length; i < n; i ++ ) {\n\n\t\t\t\t\tconst u = units[ i ];\n\n\t\t\t\t\tif ( string.endsWith( u ) ) {\n\n\t\t\t\t\t\ttheUnit = u;\n\t\t\t\t\t\tstring = string.substring( 0, string.length - u.length );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlet scale = undefined;\n\n\t\t\tif ( theUnit === 'px' && scope.defaultUnit !== 'px' ) {\n\n\t\t\t\t// Conversion scale from  pixels to inches, then to default units\n\n\t\t\t\tscale = unitConversion[ 'in' ][ scope.defaultUnit ] / scope.defaultDPI;\n\n\t\t\t} else {\n\n\t\t\t\tscale = unitConversion[ theUnit ][ scope.defaultUnit ];\n\n\t\t\t\tif ( scale < 0 ) {\n\n\t\t\t\t\t// Conversion scale to pixels\n\n\t\t\t\t\tscale = unitConversion[ theUnit ][ 'in' ] * scope.defaultDPI;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn scale * parseFloat( string );\n\n\t\t}\n\n\t\t// Transforms\n\n\t\tfunction getNodeTransform( node ) {\n\n\t\t\tif ( ! ( node.hasAttribute( 'transform' ) || ( node.nodeName === 'use' && ( node.hasAttribute( 'x' ) || node.hasAttribute( 'y' ) ) ) ) ) {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t\tconst transform = parseNodeTransform( node );\n\n\t\t\tif ( transformStack.length > 0 ) {\n\n\t\t\t\ttransform.premultiply( transformStack[ transformStack.length - 1 ] );\n\n\t\t\t}\n\n\t\t\tcurrentTransform.copy( transform );\n\t\t\ttransformStack.push( transform );\n\n\t\t\treturn transform;\n\n\t\t}\n\n\t\tfunction parseNodeTransform( node ) {\n\n\t\t\tconst transform = new Matrix3();\n\t\t\tconst currentTransform = tempTransform0;\n\n\t\t\tif ( node.nodeName === 'use' && ( node.hasAttribute( 'x' ) || node.hasAttribute( 'y' ) ) ) {\n\n\t\t\t\tconst tx = parseFloatWithUnits( node.getAttribute( 'x' ) || 0 );\n\t\t\t\tconst ty = parseFloatWithUnits( node.getAttribute( 'y' ) || 0 );\n\n\t\t\t\ttransform.translate( tx, ty );\n\n\t\t\t}\n\n\t\t\tif ( node.hasAttribute( 'transform' ) ) {\n\n\t\t\t\tconst transformsTexts = node.getAttribute( 'transform' ).split( ')' );\n\n\t\t\t\tfor ( let tIndex = transformsTexts.length - 1; tIndex >= 0; tIndex -- ) {\n\n\t\t\t\t\tconst transformText = transformsTexts[ tIndex ].trim();\n\n\t\t\t\t\tif ( transformText === '' ) continue;\n\n\t\t\t\t\tconst openParPos = transformText.indexOf( '(' );\n\t\t\t\t\tconst closeParPos = transformText.length;\n\n\t\t\t\t\tif ( openParPos > 0 && openParPos < closeParPos ) {\n\n\t\t\t\t\t\tconst transformType = transformText.slice( 0, openParPos );\n\n\t\t\t\t\t\tconst array = parseFloats( transformText.slice( openParPos + 1 ) );\n\n\t\t\t\t\t\tcurrentTransform.identity();\n\n\t\t\t\t\t\tswitch ( transformType ) {\n\n\t\t\t\t\t\t\tcase 'translate':\n\n\t\t\t\t\t\t\t\tif ( array.length >= 1 ) {\n\n\t\t\t\t\t\t\t\t\tconst tx = array[ 0 ];\n\t\t\t\t\t\t\t\t\tlet ty = 0;\n\n\t\t\t\t\t\t\t\t\tif ( array.length >= 2 ) {\n\n\t\t\t\t\t\t\t\t\t\tty = array[ 1 ];\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.translate( tx, ty );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'rotate':\n\n\t\t\t\t\t\t\t\tif ( array.length >= 1 ) {\n\n\t\t\t\t\t\t\t\t\tlet angle = 0;\n\t\t\t\t\t\t\t\t\tlet cx = 0;\n\t\t\t\t\t\t\t\t\tlet cy = 0;\n\n\t\t\t\t\t\t\t\t\t// Angle\n\t\t\t\t\t\t\t\t\tangle = array[ 0 ] * Math.PI / 180;\n\n\t\t\t\t\t\t\t\t\tif ( array.length >= 3 ) {\n\n\t\t\t\t\t\t\t\t\t\t// Center x, y\n\t\t\t\t\t\t\t\t\t\tcx = array[ 1 ];\n\t\t\t\t\t\t\t\t\t\tcy = array[ 2 ];\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Rotate around center (cx, cy)\n\t\t\t\t\t\t\t\t\ttempTransform1.makeTranslation( - cx, - cy );\n\t\t\t\t\t\t\t\t\ttempTransform2.makeRotation( angle );\n\t\t\t\t\t\t\t\t\ttempTransform3.multiplyMatrices( tempTransform2, tempTransform1 );\n\t\t\t\t\t\t\t\t\ttempTransform1.makeTranslation( cx, cy );\n\t\t\t\t\t\t\t\t\tcurrentTransform.multiplyMatrices( tempTransform1, tempTransform3 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'scale':\n\n\t\t\t\t\t\t\t\tif ( array.length >= 1 ) {\n\n\t\t\t\t\t\t\t\t\tconst scaleX = array[ 0 ];\n\t\t\t\t\t\t\t\t\tlet scaleY = scaleX;\n\n\t\t\t\t\t\t\t\t\tif ( array.length >= 2 ) {\n\n\t\t\t\t\t\t\t\t\t\tscaleY = array[ 1 ];\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.scale( scaleX, scaleY );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'skewX':\n\n\t\t\t\t\t\t\t\tif ( array.length === 1 ) {\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.set(\n\t\t\t\t\t\t\t\t\t\t1, Math.tan( array[ 0 ] * Math.PI / 180 ), 0,\n\t\t\t\t\t\t\t\t\t\t0, 1, 0,\n\t\t\t\t\t\t\t\t\t\t0, 0, 1\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'skewY':\n\n\t\t\t\t\t\t\t\tif ( array.length === 1 ) {\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.set(\n\t\t\t\t\t\t\t\t\t\t1, 0, 0,\n\t\t\t\t\t\t\t\t\t\tMath.tan( array[ 0 ] * Math.PI / 180 ), 1, 0,\n\t\t\t\t\t\t\t\t\t\t0, 0, 1\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tcase 'matrix':\n\n\t\t\t\t\t\t\t\tif ( array.length === 6 ) {\n\n\t\t\t\t\t\t\t\t\tcurrentTransform.set(\n\t\t\t\t\t\t\t\t\t\tarray[ 0 ], array[ 2 ], array[ 4 ],\n\t\t\t\t\t\t\t\t\t\tarray[ 1 ], array[ 3 ], array[ 5 ],\n\t\t\t\t\t\t\t\t\t\t0, 0, 1\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttransform.premultiply( currentTransform );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn transform;\n\n\t\t}\n\n\t\tfunction transformPath( path, m ) {\n\n\t\t\tfunction transfVec2( v2 ) {\n\n\t\t\t\ttempV3.set( v2.x, v2.y, 1 ).applyMatrix3( m );\n\n\t\t\t\tv2.set( tempV3.x, tempV3.y );\n\n\t\t\t}\n\n\t\t\tfunction transfEllipseGeneric( curve ) {\n\n\t\t\t\t// For math description see:\n\t\t\t\t// https://math.stackexchange.com/questions/4544164\n\n\t\t\t\tconst a = curve.xRadius;\n\t\t\t\tconst b = curve.yRadius;\n\n\t\t\t\tconst cosTheta = Math.cos( curve.aRotation );\n\t\t\t\tconst sinTheta = Math.sin( curve.aRotation );\n\n\t\t\t\tconst v1 = new Vector3( a * cosTheta, a * sinTheta, 0 );\n\t\t\t\tconst v2 = new Vector3( - b * sinTheta, b * cosTheta, 0 );\n\n\t\t\t\tconst f1 = v1.applyMatrix3( m );\n\t\t\t\tconst f2 = v2.applyMatrix3( m );\n\n\t\t\t\tconst mF = tempTransform0.set(\n\t\t\t\t\tf1.x, f2.x, 0,\n\t\t\t\t\tf1.y, f2.y, 0,\n\t\t\t\t\t0, 0, 1,\n\t\t\t\t);\n\n\t\t\t\tconst mFInv = tempTransform1.copy( mF ).invert();\n\t\t\t\tconst mFInvT = tempTransform2.copy( mFInv ).transpose();\n\t\t\t\tconst mQ = mFInvT.multiply( mFInv );\n\t\t\t\tconst mQe = mQ.elements;\n\n\t\t\t\tconst ed = eigenDecomposition( mQe[ 0 ], mQe[ 1 ], mQe[ 4 ] );\n\t\t\t\tconst rt1sqrt = Math.sqrt( ed.rt1 );\n\t\t\t\tconst rt2sqrt = Math.sqrt( ed.rt2 );\n\n\t\t\t\tcurve.xRadius = 1 / rt1sqrt;\n\t\t\t\tcurve.yRadius = 1 / rt2sqrt;\n\t\t\t\tcurve.aRotation = Math.atan2( ed.sn, ed.cs );\n\n\t\t\t\tconst isFullEllipse =\n\t\t\t\t\t( curve.aEndAngle - curve.aStartAngle ) % ( 2 * Math.PI ) < Number.EPSILON;\n\n\t\t\t\t// Do not touch angles of a full ellipse because after transformation they\n\t\t\t\t// would converge to a single value effectively removing the whole curve\n\n\t\t\t\tif ( ! isFullEllipse ) {\n\n\t\t\t\t\tconst mDsqrt = tempTransform1.set(\n\t\t\t\t\t\trt1sqrt, 0, 0,\n\t\t\t\t\t\t0, rt2sqrt, 0,\n\t\t\t\t\t\t0, 0, 1,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst mRT = tempTransform2.set(\n\t\t\t\t\t\ted.cs, ed.sn, 0,\n\t\t\t\t\t\t- ed.sn, ed.cs, 0,\n\t\t\t\t\t\t0, 0, 1,\n\t\t\t\t\t);\n\n\t\t\t\t\tconst mDRF = mDsqrt.multiply( mRT ).multiply( mF );\n\n\t\t\t\t\tconst transformAngle = phi => {\n\n\t\t\t\t\t\tconst { x: cosR, y: sinR } =\n\t\t\t\t\t\t\tnew Vector3( Math.cos( phi ), Math.sin( phi ), 0 ).applyMatrix3( mDRF );\n\n\t\t\t\t\t\treturn Math.atan2( sinR, cosR );\n\n\t\t\t\t\t};\n\n\t\t\t\t\tcurve.aStartAngle = transformAngle( curve.aStartAngle );\n\t\t\t\t\tcurve.aEndAngle = transformAngle( curve.aEndAngle );\n\n\t\t\t\t\tif ( isTransformFlipped( m ) ) {\n\n\t\t\t\t\t\tcurve.aClockwise = ! curve.aClockwise;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction transfEllipseNoSkew( curve ) {\n\n\t\t\t\t// Faster shortcut if no skew is applied\n\t\t\t\t// (e.g, a euclidean transform of a group containing the ellipse)\n\n\t\t\t\tconst sx = getTransformScaleX( m );\n\t\t\t\tconst sy = getTransformScaleY( m );\n\n\t\t\t\tcurve.xRadius *= sx;\n\t\t\t\tcurve.yRadius *= sy;\n\n\t\t\t\t// Extract rotation angle from the matrix of form:\n\t\t\t\t//\n\t\t\t\t//  | cos\u03B8 sx   -sin\u03B8 sy |\n\t\t\t\t//  | sin\u03B8 sx    cos\u03B8 sy |\n\t\t\t\t//\n\t\t\t\t// Remembering that tan\u03B8 = sin\u03B8 / cos\u03B8; and that\n\t\t\t\t// `sx`, `sy`, or both might be zero.\n\t\t\t\tconst theta =\n\t\t\t\t\tsx > Number.EPSILON\n\t\t\t\t\t\t? Math.atan2( m.elements[ 1 ], m.elements[ 0 ] )\n\t\t\t\t\t\t: Math.atan2( - m.elements[ 3 ], m.elements[ 4 ] );\n\n\t\t\t\tcurve.aRotation += theta;\n\n\t\t\t\tif ( isTransformFlipped( m ) ) {\n\n\t\t\t\t\tcurve.aStartAngle *= - 1;\n\t\t\t\t\tcurve.aEndAngle *= - 1;\n\t\t\t\t\tcurve.aClockwise = ! curve.aClockwise;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst subPaths = path.subPaths;\n\n\t\t\tfor ( let i = 0, n = subPaths.length; i < n; i ++ ) {\n\n\t\t\t\tconst subPath = subPaths[ i ];\n\t\t\t\tconst curves = subPath.curves;\n\n\t\t\t\tfor ( let j = 0; j < curves.length; j ++ ) {\n\n\t\t\t\t\tconst curve = curves[ j ];\n\n\t\t\t\t\tif ( curve.isLineCurve ) {\n\n\t\t\t\t\t\ttransfVec2( curve.v1 );\n\t\t\t\t\t\ttransfVec2( curve.v2 );\n\n\t\t\t\t\t} else if ( curve.isCubicBezierCurve ) {\n\n\t\t\t\t\t\ttransfVec2( curve.v0 );\n\t\t\t\t\t\ttransfVec2( curve.v1 );\n\t\t\t\t\t\ttransfVec2( curve.v2 );\n\t\t\t\t\t\ttransfVec2( curve.v3 );\n\n\t\t\t\t\t} else if ( curve.isQuadraticBezierCurve ) {\n\n\t\t\t\t\t\ttransfVec2( curve.v0 );\n\t\t\t\t\t\ttransfVec2( curve.v1 );\n\t\t\t\t\t\ttransfVec2( curve.v2 );\n\n\t\t\t\t\t} else if ( curve.isEllipseCurve ) {\n\n\t\t\t\t\t\t// Transform ellipse center point\n\n\t\t\t\t\t\ttempV2.set( curve.aX, curve.aY );\n\t\t\t\t\t\ttransfVec2( tempV2 );\n\t\t\t\t\t\tcurve.aX = tempV2.x;\n\t\t\t\t\t\tcurve.aY = tempV2.y;\n\n\t\t\t\t\t\t// Transform ellipse shape parameters\n\n\t\t\t\t\t\tif ( isTransformSkewed( m ) ) {\n\n\t\t\t\t\t\t\ttransfEllipseGeneric( curve );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ttransfEllipseNoSkew( curve );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction isTransformFlipped( m ) {\n\n\t\t\tconst te = m.elements;\n\t\t\treturn te[ 0 ] * te[ 4 ] - te[ 1 ] * te[ 3 ] < 0;\n\n\t\t}\n\n\t\tfunction isTransformSkewed( m ) {\n\n\t\t\tconst te = m.elements;\n\t\t\tconst basisDot = te[ 0 ] * te[ 3 ] + te[ 1 ] * te[ 4 ];\n\n\t\t\t// Shortcut for trivial rotations and transformations\n\t\t\tif ( basisDot === 0 ) return false;\n\n\t\t\tconst sx = getTransformScaleX( m );\n\t\t\tconst sy = getTransformScaleY( m );\n\n\t\t\treturn Math.abs( basisDot / ( sx * sy ) ) > Number.EPSILON;\n\n\t\t}\n\n\t\tfunction getTransformScaleX( m ) {\n\n\t\t\tconst te = m.elements;\n\t\t\treturn Math.sqrt( te[ 0 ] * te[ 0 ] + te[ 1 ] * te[ 1 ] );\n\n\t\t}\n\n\t\tfunction getTransformScaleY( m ) {\n\n\t\t\tconst te = m.elements;\n\t\t\treturn Math.sqrt( te[ 3 ] * te[ 3 ] + te[ 4 ] * te[ 4 ] );\n\n\t\t}\n\n\t\t// Calculates the eigensystem of a real symmetric 2x2 matrix\n\t\t//    [ A  B ]\n\t\t//    [ B  C ]\n\t\t// in the form\n\t\t//    [ A  B ]  =  [ cs  -sn ] [ rt1   0  ] [  cs  sn ]\n\t\t//    [ B  C ]     [ sn   cs ] [  0   rt2 ] [ -sn  cs ]\n\t\t// where rt1 >= rt2.\n\t\t//\n\t\t// Adapted from: https://www.mpi-hd.mpg.de/personalhomes/globes/3x3/index.html\n\t\t// -> Algorithms for real symmetric matrices -> Analytical (2x2 symmetric)\n\t\tfunction eigenDecomposition( A, B, C ) {\n\n\t\t\tlet rt1, rt2, cs, sn, t;\n\t\t\tconst sm = A + C;\n\t\t\tconst df = A - C;\n\t\t\tconst rt = Math.sqrt( df * df + 4 * B * B );\n\n\t\t\tif ( sm > 0 ) {\n\n\t\t\t\trt1 = 0.5 * ( sm + rt );\n\t\t\t\tt = 1 / rt1;\n\t\t\t\trt2 = A * t * C - B * t * B;\n\n\t\t\t} else if ( sm < 0 ) {\n\n\t\t\t\trt2 = 0.5 * ( sm - rt );\n\n\t\t\t} else {\n\n\t\t\t\t// This case needs to be treated separately to avoid div by 0\n\n\t\t\t\trt1 = 0.5 * rt;\n\t\t\t\trt2 = - 0.5 * rt;\n\n\t\t\t}\n\n\t\t\t// Calculate eigenvectors\n\n\t\t\tif ( df > 0 ) {\n\n\t\t\t\tcs = df + rt;\n\n\t\t\t} else {\n\n\t\t\t\tcs = df - rt;\n\n\t\t\t}\n\n\t\t\tif ( Math.abs( cs ) > 2 * Math.abs( B ) ) {\n\n\t\t\t\tt = - 2 * B / cs;\n\t\t\t\tsn = 1 / Math.sqrt( 1 + t * t );\n\t\t\t\tcs = t * sn;\n\n\t\t\t} else if ( Math.abs( B ) === 0 ) {\n\n\t\t\t\tcs = 1;\n\t\t\t\tsn = 0;\n\n\t\t\t} else {\n\n\t\t\t\tt = - 0.5 * cs / B;\n\t\t\t\tcs = 1 / Math.sqrt( 1 + t * t );\n\t\t\t\tsn = t * cs;\n\n\t\t\t}\n\n\t\t\tif ( df > 0 ) {\n\n\t\t\t\tt = cs;\n\t\t\t\tcs = - sn;\n\t\t\t\tsn = t;\n\n\t\t\t}\n\n\t\t\treturn { rt1, rt2, cs, sn };\n\n\t\t}\n\n\t\t//\n\n\t\tconst paths = [];\n\t\tconst stylesheets = {};\n\n\t\tconst transformStack = [];\n\n\t\tconst tempTransform0 = new Matrix3();\n\t\tconst tempTransform1 = new Matrix3();\n\t\tconst tempTransform2 = new Matrix3();\n\t\tconst tempTransform3 = new Matrix3();\n\t\tconst tempV2 = new Vector2();\n\t\tconst tempV3 = new Vector3();\n\n\t\tconst currentTransform = new Matrix3();\n\n\t\tconst xml = new DOMParser().parseFromString( text, 'image/svg+xml' ); // application/xml\n\n\t\tparseNode( xml.documentElement, {\n\t\t\tfill: '#000',\n\t\t\tfillOpacity: 1,\n\t\t\tstrokeOpacity: 1,\n\t\t\tstrokeWidth: 1,\n\t\t\tstrokeLineJoin: 'miter',\n\t\t\tstrokeLineCap: 'butt',\n\t\t\tstrokeMiterLimit: 4\n\t\t} );\n\n\t\tconst data = { paths: paths, xml: xml.documentElement };\n\n\t\t// console.log( paths );\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Creates from the given shape path and array of shapes.\n\t *\n\t * @param {ShapePath} shapePath - The shape path.\n\t * @return {Array<Shape>} An array of shapes.\n\t */\n\tstatic createShapes( shapePath ) {\n\n\t\tconst BIGNUMBER = 999999999;\n\n\t\tconst IntersectionLocationType = {\n\t\t\tORIGIN: 0,\n\t\t\tDESTINATION: 1,\n\t\t\tBETWEEN: 2,\n\t\t\tLEFT: 3,\n\t\t\tRIGHT: 4,\n\t\t\tBEHIND: 5,\n\t\t\tBEYOND: 6\n\t\t};\n\n\t\tconst classifyResult = {\n\t\t\tloc: IntersectionLocationType.ORIGIN,\n\t\t\tt: 0\n\t\t};\n\n\t\tfunction findEdgeIntersection( a0, a1, b0, b1 ) {\n\n\t\t\tconst x1 = a0.x;\n\t\t\tconst x2 = a1.x;\n\t\t\tconst x3 = b0.x;\n\t\t\tconst x4 = b1.x;\n\t\t\tconst y1 = a0.y;\n\t\t\tconst y2 = a1.y;\n\t\t\tconst y3 = b0.y;\n\t\t\tconst y4 = b1.y;\n\t\t\tconst nom1 = ( x4 - x3 ) * ( y1 - y3 ) - ( y4 - y3 ) * ( x1 - x3 );\n\t\t\tconst nom2 = ( x2 - x1 ) * ( y1 - y3 ) - ( y2 - y1 ) * ( x1 - x3 );\n\t\t\tconst denom = ( y4 - y3 ) * ( x2 - x1 ) - ( x4 - x3 ) * ( y2 - y1 );\n\t\t\tconst t1 = nom1 / denom;\n\t\t\tconst t2 = nom2 / denom;\n\n\t\t\tif ( ( ( denom === 0 ) && ( nom1 !== 0 ) ) || ( t1 <= 0 ) || ( t1 >= 1 ) || ( t2 < 0 ) || ( t2 > 1 ) ) {\n\n\t\t\t\t//1. lines are parallel or edges don't intersect\n\n\t\t\t\treturn null;\n\n\t\t\t} else if ( ( nom1 === 0 ) && ( denom === 0 ) ) {\n\n\t\t\t\t//2. lines are colinear\n\n\t\t\t\t//check if endpoints of edge2 (b0-b1) lies on edge1 (a0-a1)\n\t\t\t\tfor ( let i = 0; i < 2; i ++ ) {\n\n\t\t\t\t\tclassifyPoint( i === 0 ? b0 : b1, a0, a1 );\n\t\t\t\t\t//find position of this endpoints relatively to edge1\n\t\t\t\t\tif ( classifyResult.loc == IntersectionLocationType.ORIGIN ) {\n\n\t\t\t\t\t\tconst point = ( i === 0 ? b0 : b1 );\n\t\t\t\t\t\treturn { x: point.x, y: point.y, t: classifyResult.t };\n\n\t\t\t\t\t} else if ( classifyResult.loc == IntersectionLocationType.BETWEEN ) {\n\n\t\t\t\t\t\tconst x = + ( ( x1 + classifyResult.t * ( x2 - x1 ) ).toPrecision( 10 ) );\n\t\t\t\t\t\tconst y = + ( ( y1 + classifyResult.t * ( y2 - y1 ) ).toPrecision( 10 ) );\n\t\t\t\t\t\treturn { x: x, y: y, t: classifyResult.t, };\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\n\t\t\t} else {\n\n\t\t\t\t//3. edges intersect\n\n\t\t\t\tfor ( let i = 0; i < 2; i ++ ) {\n\n\t\t\t\t\tclassifyPoint( i === 0 ? b0 : b1, a0, a1 );\n\n\t\t\t\t\tif ( classifyResult.loc == IntersectionLocationType.ORIGIN ) {\n\n\t\t\t\t\t\tconst point = ( i === 0 ? b0 : b1 );\n\t\t\t\t\t\treturn { x: point.x, y: point.y, t: classifyResult.t };\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst x = + ( ( x1 + t1 * ( x2 - x1 ) ).toPrecision( 10 ) );\n\t\t\t\tconst y = + ( ( y1 + t1 * ( y2 - y1 ) ).toPrecision( 10 ) );\n\t\t\t\treturn { x: x, y: y, t: t1 };\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction classifyPoint( p, edgeStart, edgeEnd ) {\n\n\t\t\tconst ax = edgeEnd.x - edgeStart.x;\n\t\t\tconst ay = edgeEnd.y - edgeStart.y;\n\t\t\tconst bx = p.x - edgeStart.x;\n\t\t\tconst by = p.y - edgeStart.y;\n\t\t\tconst sa = ax * by - bx * ay;\n\n\t\t\tif ( ( p.x === edgeStart.x ) && ( p.y === edgeStart.y ) ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.ORIGIN;\n\t\t\t\tclassifyResult.t = 0;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( ( p.x === edgeEnd.x ) && ( p.y === edgeEnd.y ) ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.DESTINATION;\n\t\t\t\tclassifyResult.t = 1;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( sa < - Number.EPSILON ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.LEFT;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( sa > Number.EPSILON ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.RIGHT;\n\t\t\t\treturn;\n\n\n\t\t\t}\n\n\t\t\tif ( ( ( ax * bx ) < 0 ) || ( ( ay * by ) < 0 ) ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.BEHIND;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( ( Math.sqrt( ax * ax + ay * ay ) ) < ( Math.sqrt( bx * bx + by * by ) ) ) {\n\n\t\t\t\tclassifyResult.loc = IntersectionLocationType.BEYOND;\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tlet t;\n\n\t\t\tif ( ax !== 0 ) {\n\n\t\t\t\tt = bx / ax;\n\n\t\t\t} else {\n\n\t\t\t\tt = by / ay;\n\n\t\t\t}\n\n\t\t\tclassifyResult.loc = IntersectionLocationType.BETWEEN;\n\t\t\tclassifyResult.t = t;\n\n\t\t}\n\n\t\tfunction getIntersections( path1, path2 ) {\n\n\t\t\tconst intersectionsRaw = [];\n\t\t\tconst intersections = [];\n\n\t\t\tfor ( let index = 1; index < path1.length; index ++ ) {\n\n\t\t\t\tconst path1EdgeStart = path1[ index - 1 ];\n\t\t\t\tconst path1EdgeEnd = path1[ index ];\n\n\t\t\t\tfor ( let index2 = 1; index2 < path2.length; index2 ++ ) {\n\n\t\t\t\t\tconst path2EdgeStart = path2[ index2 - 1 ];\n\t\t\t\t\tconst path2EdgeEnd = path2[ index2 ];\n\n\t\t\t\t\tconst intersection = findEdgeIntersection( path1EdgeStart, path1EdgeEnd, path2EdgeStart, path2EdgeEnd );\n\n\t\t\t\t\tif ( intersection !== null && intersectionsRaw.find( i => i.t <= intersection.t + Number.EPSILON && i.t >= intersection.t - Number.EPSILON ) === undefined ) {\n\n\t\t\t\t\t\tintersectionsRaw.push( intersection );\n\t\t\t\t\t\tintersections.push( new Vector2( intersection.x, intersection.y ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn intersections;\n\n\t\t}\n\n\t\tfunction getScanlineIntersections( scanline, boundingBox, paths ) {\n\n\t\t\tconst center = new Vector2();\n\t\t\tboundingBox.getCenter( center );\n\n\t\t\tconst allIntersections = [];\n\n\t\t\tpaths.forEach( path => {\n\n\t\t\t\t// check if the center of the bounding box is in the bounding box of the paths.\n\t\t\t\t// this is a pruning method to limit the search of intersections in paths that can't envelop of the current path.\n\t\t\t\t// if a path envelops another path. The center of that other path, has to be inside the bounding box of the enveloping path.\n\t\t\t\tif ( path.boundingBox.containsPoint( center ) ) {\n\n\t\t\t\t\tconst intersections = getIntersections( scanline, path.points );\n\n\t\t\t\t\tintersections.forEach( p => {\n\n\t\t\t\t\t\tallIntersections.push( { identifier: path.identifier, isCW: path.isCW, point: p } );\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tallIntersections.sort( ( i1, i2 ) => {\n\n\t\t\t\treturn i1.point.x - i2.point.x;\n\n\t\t\t} );\n\n\t\t\treturn allIntersections;\n\n\t\t}\n\n\t\tfunction isHoleTo( simplePath, allPaths, scanlineMinX, scanlineMaxX, _fillRule ) {\n\n\t\t\tif ( _fillRule === null || _fillRule === undefined || _fillRule === '' ) {\n\n\t\t\t\t_fillRule = 'nonzero';\n\n\t\t\t}\n\n\t\t\tconst centerBoundingBox = new Vector2();\n\t\t\tsimplePath.boundingBox.getCenter( centerBoundingBox );\n\n\t\t\tconst scanline = [ new Vector2( scanlineMinX, centerBoundingBox.y ), new Vector2( scanlineMaxX, centerBoundingBox.y ) ];\n\n\t\t\tconst scanlineIntersections = getScanlineIntersections( scanline, simplePath.boundingBox, allPaths );\n\n\t\t\tscanlineIntersections.sort( ( i1, i2 ) => {\n\n\t\t\t\treturn i1.point.x - i2.point.x;\n\n\t\t\t} );\n\n\t\t\tconst baseIntersections = [];\n\t\t\tconst otherIntersections = [];\n\n\t\t\tscanlineIntersections.forEach( i => {\n\n\t\t\t\tif ( i.identifier === simplePath.identifier ) {\n\n\t\t\t\t\tbaseIntersections.push( i );\n\n\t\t\t\t} else {\n\n\t\t\t\t\totherIntersections.push( i );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tconst firstXOfPath = baseIntersections[ 0 ].point.x;\n\n\t\t\t// build up the path hierarchy\n\t\t\tconst stack = [];\n\t\t\tlet i = 0;\n\n\t\t\twhile ( i < otherIntersections.length && otherIntersections[ i ].point.x < firstXOfPath ) {\n\n\t\t\t\tif ( stack.length > 0 && stack[ stack.length - 1 ] === otherIntersections[ i ].identifier ) {\n\n\t\t\t\t\tstack.pop();\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstack.push( otherIntersections[ i ].identifier );\n\n\t\t\t\t}\n\n\t\t\t\ti ++;\n\n\t\t\t}\n\n\t\t\tstack.push( simplePath.identifier );\n\n\t\t\tif ( _fillRule === 'evenodd' ) {\n\n\t\t\t\tconst isHole = stack.length % 2 === 0 ? true : false;\n\t\t\t\tconst isHoleFor = stack[ stack.length - 2 ];\n\n\t\t\t\treturn { identifier: simplePath.identifier, isHole: isHole, for: isHoleFor };\n\n\t\t\t} else if ( _fillRule === 'nonzero' ) {\n\n\t\t\t\t// check if path is a hole by counting the amount of paths with alternating rotations it has to cross.\n\t\t\t\tlet isHole = true;\n\t\t\t\tlet isHoleFor = null;\n\t\t\t\tlet lastCWValue = null;\n\n\t\t\t\tfor ( let i = 0; i < stack.length; i ++ ) {\n\n\t\t\t\t\tconst identifier = stack[ i ];\n\t\t\t\t\tif ( isHole ) {\n\n\t\t\t\t\t\tlastCWValue = allPaths[ identifier ].isCW;\n\t\t\t\t\t\tisHole = false;\n\t\t\t\t\t\tisHoleFor = identifier;\n\n\t\t\t\t\t} else if ( lastCWValue !== allPaths[ identifier ].isCW ) {\n\n\t\t\t\t\t\tlastCWValue = allPaths[ identifier ].isCW;\n\t\t\t\t\t\tisHole = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn { identifier: simplePath.identifier, isHole: isHole, for: isHoleFor };\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( 'fill-rule: \"' + _fillRule + '\" is currently not implemented.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// check for self intersecting paths\n\t\t// TODO\n\n\t\t// check intersecting paths\n\t\t// TODO\n\n\t\t// prepare paths for hole detection\n\t\tlet scanlineMinX = BIGNUMBER;\n\t\tlet scanlineMaxX = - BIGNUMBER;\n\n\t\tlet simplePaths = shapePath.subPaths.map( p => {\n\n\t\t\tconst points = p.getPoints();\n\t\t\tlet maxY = - BIGNUMBER;\n\t\t\tlet minY = BIGNUMBER;\n\t\t\tlet maxX = - BIGNUMBER;\n\t\t\tlet minX = BIGNUMBER;\n\n\t      \t//points.forEach(p => p.y *= -1);\n\n\t\t\tfor ( let i = 0; i < points.length; i ++ ) {\n\n\t\t\t\tconst p = points[ i ];\n\n\t\t\t\tif ( p.y > maxY ) {\n\n\t\t\t\t\tmaxY = p.y;\n\n\t\t\t\t}\n\n\t\t\t\tif ( p.y < minY ) {\n\n\t\t\t\t\tminY = p.y;\n\n\t\t\t\t}\n\n\t\t\t\tif ( p.x > maxX ) {\n\n\t\t\t\t\tmaxX = p.x;\n\n\t\t\t\t}\n\n\t\t\t\tif ( p.x < minX ) {\n\n\t\t\t\t\tminX = p.x;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\t\t\tif ( scanlineMaxX <= maxX ) {\n\n\t\t\t\tscanlineMaxX = maxX + 1;\n\n\t\t\t}\n\n\t\t\tif ( scanlineMinX >= minX ) {\n\n\t\t\t\tscanlineMinX = minX - 1;\n\n\t\t\t}\n\n\t\t\treturn { curves: p.curves, points: points, isCW: ShapeUtils.isClockWise( points ), identifier: - 1, boundingBox: new Box2( new Vector2( minX, minY ), new Vector2( maxX, maxY ) ) };\n\n\t\t} );\n\n\t\tsimplePaths = simplePaths.filter( sp => sp.points.length > 1 );\n\n\t\tfor ( let identifier = 0; identifier < simplePaths.length; identifier ++ ) {\n\n\t\t\tsimplePaths[ identifier ].identifier = identifier;\n\n\t\t}\n\n\t\t// check if path is solid or a hole\n\t\tconst isAHole = simplePaths.map( p => isHoleTo( p, simplePaths, scanlineMinX, scanlineMaxX, ( shapePath.userData ? shapePath.userData.style.fillRule : undefined ) ) );\n\n\n\t\tconst shapesToReturn = [];\n\t\tsimplePaths.forEach( p => {\n\n\t\t\tconst amIAHole = isAHole[ p.identifier ];\n\n\t\t\tif ( ! amIAHole.isHole ) {\n\n\t\t\t\tconst shape = new Shape();\n\t\t\t\tshape.curves = p.curves;\n\t\t\t\tconst holes = isAHole.filter( h => h.isHole && h.for === p.identifier );\n\t\t\t\tholes.forEach( h => {\n\n\t\t\t\t\tconst hole = simplePaths[ h.identifier ];\n\t\t\t\t\tconst path = new Path();\n\t\t\t\t\tpath.curves = hole.curves;\n\t\t\t\t\tshape.holes.push( path );\n\n\t\t\t\t} );\n\t\t\t\tshapesToReturn.push( shape );\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn shapesToReturn;\n\n\t}\n\n\t/**\n\t * Returns a stroke style object from the given parameters.\n\t *\n\t * @param {number} [width=1] - The stroke width.\n\t * @param {string} [color='#000'] - The stroke color, as  returned by {@link Color#getStyle}.\n\t * @param {'round'|'bevel'|'miter'|'miter-limit'} [lineJoin='miter'] - The line join style.\n\t * @param {'round'|'square'|'butt'} [lineCap='butt'] - The line cap style.\n\t * @param {number} [miterLimit=4] - Maximum join length, in multiples of the `width` parameter (join is truncated if it exceeds that distance).\n\t * @return {Object} The style object.\n\t */\n\tstatic getStrokeStyle( width, color, lineJoin, lineCap, miterLimit ) {\n\n\t\twidth = width !== undefined ? width : 1;\n\t\tcolor = color !== undefined ? color : '#000';\n\t\tlineJoin = lineJoin !== undefined ? lineJoin : 'miter';\n\t\tlineCap = lineCap !== undefined ? lineCap : 'butt';\n\t\tmiterLimit = miterLimit !== undefined ? miterLimit : 4;\n\n\t\treturn {\n\t\t\tstrokeColor: color,\n\t\t\tstrokeWidth: width,\n\t\t\tstrokeLineJoin: lineJoin,\n\t\t\tstrokeLineCap: lineCap,\n\t\t\tstrokeMiterLimit: miterLimit\n\t\t};\n\n\t}\n\n\t/**\n\t * Creates a stroke from an array of points.\n\t *\n\t * @param {Array<Vector2>} points - The points in 2D space. Minimum 2 points. The path can be open or closed (last point equals to first point).\n\t * @param {Object} style - Object with SVG properties as returned by `SVGLoader.getStrokeStyle()`, or `SVGLoader.parse()` in the `path.userData.style` object.\n\t * @param {number} [arcDivisions=12] - Arc divisions for round joins and endcaps.\n\t * @param {number} [minDistance=0.001] - Points closer to this distance will be merged.\n\t * @return {?BufferGeometry} The stroke geometry. UV coordinates are generated ('u' along path. 'v' across it, from left to right).\n\t * Returns `null` if not geometry was generated.\n\t */\n\tstatic pointsToStroke( points, style, arcDivisions, minDistance ) {\n\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tif ( SVGLoader.pointsToStrokeWithBuffers( points, style, arcDivisions, minDistance, vertices, normals, uvs ) === 0 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\t\tgeometry.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\t\tgeometry.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\t\treturn geometry;\n\n\t}\n\n\t/**\n\t * Creates a stroke from an array of points.\n\t *\n\t * @param {Array<Vector2>} points - The points in 2D space. Minimum 2 points.\n\t * @param {Object} style - Object with SVG properties as returned by `SVGLoader.getStrokeStyle()`, or `SVGLoader.parse()` in the `path.userData.style` object.\n\t * @param {number} [arcDivisions=12] - Arc divisions for round joins and endcaps.\n\t * @param {number} [minDistance=0.001] - Points closer to this distance will be merged.\n\t * @param {Array<number>} vertices - An array holding vertices.\n\t * @param {Array<number>} normals - An array holding normals.\n\t * @param {Array<number>} uvs - An array holding uvs.\n\t * @param {number} [vertexOffset=0] - The vertex offset.\n\t * @return {number} The number of vertices.\n\t */\n\tstatic pointsToStrokeWithBuffers( points, style, arcDivisions, minDistance, vertices, normals, uvs, vertexOffset ) {\n\n\t\t// This function can be called to update existing arrays or buffers.\n\t\t// Accepts same parameters as pointsToStroke, plus the buffers and optional offset.\n\t\t// Param vertexOffset: Offset vertices to start writing in the buffers (3 elements/vertex for vertices and normals, and 2 elements/vertex for uvs)\n\t\t// Returns number of written vertices / normals / uvs pairs\n\t\t// if 'vertices' parameter is undefined no triangles will be generated, but the returned vertices count will still be valid (useful to preallocate the buffers)\n\t\t// 'normals' and 'uvs' buffers are optional\n\n\t\tconst tempV2_1 = new Vector2();\n\t\tconst tempV2_2 = new Vector2();\n\t\tconst tempV2_3 = new Vector2();\n\t\tconst tempV2_4 = new Vector2();\n\t\tconst tempV2_5 = new Vector2();\n\t\tconst tempV2_6 = new Vector2();\n\t\tconst tempV2_7 = new Vector2();\n\t\tconst lastPointL = new Vector2();\n\t\tconst lastPointR = new Vector2();\n\t\tconst point0L = new Vector2();\n\t\tconst point0R = new Vector2();\n\t\tconst currentPointL = new Vector2();\n\t\tconst currentPointR = new Vector2();\n\t\tconst nextPointL = new Vector2();\n\t\tconst nextPointR = new Vector2();\n\t\tconst innerPoint = new Vector2();\n\t\tconst outerPoint = new Vector2();\n\n\t\tarcDivisions = arcDivisions !== undefined ? arcDivisions : 12;\n\t\tminDistance = minDistance !== undefined ? minDistance : 0.001;\n\t\tvertexOffset = vertexOffset !== undefined ? vertexOffset : 0;\n\n\t\t// First ensure there are no duplicated points\n\t\tpoints = removeDuplicatedPoints( points );\n\n\t\tconst numPoints = points.length;\n\n\t\tif ( numPoints < 2 ) return 0;\n\n\t\tconst isClosed = points[ 0 ].equals( points[ numPoints - 1 ] );\n\n\t\tlet currentPoint;\n\t\tlet previousPoint = points[ 0 ];\n\t\tlet nextPoint;\n\n\t\tconst strokeWidth2 = style.strokeWidth / 2;\n\n\t\tconst deltaU = 1 / ( numPoints - 1 );\n\t\tlet u0 = 0, u1;\n\n\t\tlet innerSideModified;\n\t\tlet joinIsOnLeftSide;\n\t\tlet isMiter;\n\t\tlet initialJoinIsOnLeftSide = false;\n\n\t\tlet numVertices = 0;\n\t\tlet currentCoordinate = vertexOffset * 3;\n\t\tlet currentCoordinateUV = vertexOffset * 2;\n\n\t\t// Get initial left and right stroke points\n\t\tgetNormal( points[ 0 ], points[ 1 ], tempV2_1 ).multiplyScalar( strokeWidth2 );\n\t\tlastPointL.copy( points[ 0 ] ).sub( tempV2_1 );\n\t\tlastPointR.copy( points[ 0 ] ).add( tempV2_1 );\n\t\tpoint0L.copy( lastPointL );\n\t\tpoint0R.copy( lastPointR );\n\n\t\tfor ( let iPoint = 1; iPoint < numPoints; iPoint ++ ) {\n\n\t\t\tcurrentPoint = points[ iPoint ];\n\n\t\t\t// Get next point\n\t\t\tif ( iPoint === numPoints - 1 ) {\n\n\t\t\t\tif ( isClosed ) {\n\n\t\t\t\t\t// Skip duplicated initial point\n\t\t\t\t\tnextPoint = points[ 1 ];\n\n\t\t\t\t} else nextPoint = undefined;\n\n\t\t\t} else {\n\n\t\t\t\tnextPoint = points[ iPoint + 1 ];\n\n\t\t\t}\n\n\t\t\t// Normal of previous segment in tempV2_1\n\t\t\tconst normal1 = tempV2_1;\n\t\t\tgetNormal( previousPoint, currentPoint, normal1 );\n\n\t\t\ttempV2_3.copy( normal1 ).multiplyScalar( strokeWidth2 );\n\t\t\tcurrentPointL.copy( currentPoint ).sub( tempV2_3 );\n\t\t\tcurrentPointR.copy( currentPoint ).add( tempV2_3 );\n\n\t\t\tu1 = u0 + deltaU;\n\n\t\t\tinnerSideModified = false;\n\n\t\t\tif ( nextPoint !== undefined ) {\n\n\t\t\t\t// Normal of next segment in tempV2_2\n\t\t\t\tgetNormal( currentPoint, nextPoint, tempV2_2 );\n\n\t\t\t\ttempV2_3.copy( tempV2_2 ).multiplyScalar( strokeWidth2 );\n\t\t\t\tnextPointL.copy( currentPoint ).sub( tempV2_3 );\n\t\t\t\tnextPointR.copy( currentPoint ).add( tempV2_3 );\n\n\t\t\t\tjoinIsOnLeftSide = true;\n\t\t\t\ttempV2_3.subVectors( nextPoint, previousPoint );\n\t\t\t\tif ( normal1.dot( tempV2_3 ) < 0 ) {\n\n\t\t\t\t\tjoinIsOnLeftSide = false;\n\n\t\t\t\t}\n\n\t\t\t\tif ( iPoint === 1 ) initialJoinIsOnLeftSide = joinIsOnLeftSide;\n\n\t\t\t\ttempV2_3.subVectors( nextPoint, currentPoint );\n\t\t\t\ttempV2_3.normalize();\n\t\t\t\tconst dot = Math.abs( normal1.dot( tempV2_3 ) );\n\n\t\t\t\t// If path is straight, don't create join\n\t\t\t\tif ( dot > Number.EPSILON ) {\n\n\t\t\t\t\t// Compute inner and outer segment intersections\n\t\t\t\t\tconst miterSide = strokeWidth2 / dot;\n\t\t\t\t\ttempV2_3.multiplyScalar( - miterSide );\n\t\t\t\t\ttempV2_4.subVectors( currentPoint, previousPoint );\n\t\t\t\t\ttempV2_5.copy( tempV2_4 ).setLength( miterSide ).add( tempV2_3 );\n\t\t\t\t\tinnerPoint.copy( tempV2_5 ).negate();\n\t\t\t\t\tconst miterLength2 = tempV2_5.length();\n\t\t\t\t\tconst segmentLengthPrev = tempV2_4.length();\n\t\t\t\t\ttempV2_4.divideScalar( segmentLengthPrev );\n\t\t\t\t\ttempV2_6.subVectors( nextPoint, currentPoint );\n\t\t\t\t\tconst segmentLengthNext = tempV2_6.length();\n\t\t\t\t\ttempV2_6.divideScalar( segmentLengthNext );\n\t\t\t\t\t// Check that previous and next segments doesn't overlap with the innerPoint of intersection\n\t\t\t\t\tif ( tempV2_4.dot( innerPoint ) < segmentLengthPrev && tempV2_6.dot( innerPoint ) < segmentLengthNext ) {\n\n\t\t\t\t\t\tinnerSideModified = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\touterPoint.copy( tempV2_5 ).add( currentPoint );\n\t\t\t\t\tinnerPoint.add( currentPoint );\n\n\t\t\t\t\tisMiter = false;\n\n\t\t\t\t\tif ( innerSideModified ) {\n\n\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\tnextPointR.copy( innerPoint );\n\t\t\t\t\t\t\tcurrentPointR.copy( innerPoint );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tnextPointL.copy( innerPoint );\n\t\t\t\t\t\t\tcurrentPointL.copy( innerPoint );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// The segment triangles are generated here if there was overlapping\n\n\t\t\t\t\t\tmakeSegmentTriangles();\n\n\t\t\t\t\t}\n\n\t\t\t\t\tswitch ( style.strokeLineJoin ) {\n\n\t\t\t\t\t\tcase 'bevel':\n\n\t\t\t\t\t\t\tmakeSegmentWithBevelJoin( joinIsOnLeftSide, innerSideModified, u1 );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'round':\n\n\t\t\t\t\t\t\t// Segment triangles\n\n\t\t\t\t\t\t\tcreateSegmentTrianglesWithMiddleSection( joinIsOnLeftSide, innerSideModified );\n\n\t\t\t\t\t\t\t// Join triangles\n\n\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\tmakeCircularSector( currentPoint, currentPointL, nextPointL, u1, 0 );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tmakeCircularSector( currentPoint, nextPointR, currentPointR, u1, 1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'miter':\n\t\t\t\t\t\tcase 'miter-clip':\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tconst miterFraction = ( strokeWidth2 * style.strokeMiterLimit ) / miterLength2;\n\n\t\t\t\t\t\t\tif ( miterFraction < 1 ) {\n\n\t\t\t\t\t\t\t\t// The join miter length exceeds the miter limit\n\n\t\t\t\t\t\t\t\tif ( style.strokeLineJoin !== 'miter-clip' ) {\n\n\t\t\t\t\t\t\t\t\tmakeSegmentWithBevelJoin( joinIsOnLeftSide, innerSideModified, u1 );\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t// Segment triangles\n\n\t\t\t\t\t\t\t\t\tcreateSegmentTrianglesWithMiddleSection( joinIsOnLeftSide, innerSideModified );\n\n\t\t\t\t\t\t\t\t\t// Miter-clip join triangles\n\n\t\t\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\t\t\ttempV2_6.subVectors( outerPoint, currentPointL ).multiplyScalar( miterFraction ).add( currentPointL );\n\t\t\t\t\t\t\t\t\t\ttempV2_7.subVectors( outerPoint, nextPointL ).multiplyScalar( miterFraction ).add( nextPointL );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_6, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_6, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_7, u1, 0 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_7, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( nextPointL, u1, 0 );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\ttempV2_6.subVectors( outerPoint, currentPointR ).multiplyScalar( miterFraction ).add( currentPointR );\n\t\t\t\t\t\t\t\t\t\ttempV2_7.subVectors( outerPoint, nextPointR ).multiplyScalar( miterFraction ).add( nextPointR );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_6, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_6, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_7, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( tempV2_7, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( nextPointR, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Miter join segment triangles\n\n\t\t\t\t\t\t\t\tif ( innerSideModified ) {\n\n\t\t\t\t\t\t\t\t\t// Optimized segment + join triangles\n\n\t\t\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 0 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\t\t\tnextPointL.copy( outerPoint );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\tnextPointR.copy( outerPoint );\n\n\t\t\t\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t// Add extra miter join triangles\n\n\t\t\t\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 0 );\n\t\t\t\t\t\t\t\t\t\taddVertex( nextPointL, u1, 0 );\n\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\t\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\t\t\t\t\t\taddVertex( outerPoint, u1, 1 );\n\t\t\t\t\t\t\t\t\t\taddVertex( nextPointR, u1, 1 );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tisMiter = true;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// The segment triangles are generated here when two consecutive points are collinear\n\n\t\t\t\t\tmakeSegmentTriangles();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// The segment triangles are generated here if it is the ending segment\n\n\t\t\t\tmakeSegmentTriangles();\n\n\t\t\t}\n\n\t\t\tif ( ! isClosed && iPoint === numPoints - 1 ) {\n\n\t\t\t\t// Start line endcap\n\t\t\t\taddCapGeometry( points[ 0 ], point0L, point0R, joinIsOnLeftSide, true, u0 );\n\n\t\t\t}\n\n\t\t\t// Increment loop variables\n\n\t\t\tu0 = u1;\n\n\t\t\tpreviousPoint = currentPoint;\n\n\t\t\tlastPointL.copy( nextPointL );\n\t\t\tlastPointR.copy( nextPointR );\n\n\t\t}\n\n\t\tif ( ! isClosed ) {\n\n\t\t\t// Ending line endcap\n\t\t\taddCapGeometry( currentPoint, currentPointL, currentPointR, joinIsOnLeftSide, false, u1 );\n\n\t\t} else if ( innerSideModified && vertices ) {\n\n\t\t\t// Modify path first segment vertices to adjust to the segments inner and outer intersections\n\n\t\t\tlet lastOuter = outerPoint;\n\t\t\tlet lastInner = innerPoint;\n\n\t\t\tif ( initialJoinIsOnLeftSide !== joinIsOnLeftSide ) {\n\n\t\t\t\tlastOuter = innerPoint;\n\t\t\t\tlastInner = outerPoint;\n\n\t\t\t}\n\n\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\tif ( isMiter || initialJoinIsOnLeftSide ) {\n\n\t\t\t\t\tlastInner.toArray( vertices, 0 * 3 );\n\t\t\t\t\tlastInner.toArray( vertices, 3 * 3 );\n\n\t\t\t\t\tif ( isMiter ) {\n\n\t\t\t\t\t\tlastOuter.toArray( vertices, 1 * 3 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tif ( isMiter || ! initialJoinIsOnLeftSide ) {\n\n\t\t\t\t\tlastInner.toArray( vertices, 1 * 3 );\n\t\t\t\t\tlastInner.toArray( vertices, 3 * 3 );\n\n\t\t\t\t\tif ( isMiter ) {\n\n\t\t\t\t\t\tlastOuter.toArray( vertices, 0 * 3 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn numVertices;\n\n\t\t// -- End of algorithm\n\n\t\t// -- Functions\n\n\t\tfunction getNormal( p1, p2, result ) {\n\n\t\t\tresult.subVectors( p2, p1 );\n\t\t\treturn result.set( - result.y, result.x ).normalize();\n\n\t\t}\n\n\t\tfunction addVertex( position, u, v ) {\n\n\t\t\tif ( vertices ) {\n\n\t\t\t\tvertices[ currentCoordinate ] = position.x;\n\t\t\t\tvertices[ currentCoordinate + 1 ] = position.y;\n\t\t\t\tvertices[ currentCoordinate + 2 ] = 0;\n\n\t\t\t\tif ( normals ) {\n\n\t\t\t\t\tnormals[ currentCoordinate ] = 0;\n\t\t\t\t\tnormals[ currentCoordinate + 1 ] = 0;\n\t\t\t\t\tnormals[ currentCoordinate + 2 ] = 1;\n\n\t\t\t\t}\n\n\t\t\t\tcurrentCoordinate += 3;\n\n\t\t\t\tif ( uvs ) {\n\n\t\t\t\t\tuvs[ currentCoordinateUV ] = u;\n\t\t\t\t\tuvs[ currentCoordinateUV + 1 ] = v;\n\n\t\t\t\t\tcurrentCoordinateUV += 2;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tnumVertices += 3;\n\n\t\t}\n\n\t\tfunction makeCircularSector( center, p1, p2, u, v ) {\n\n\t\t\t// param p1, p2: Points in the circle arc.\n\t\t\t// p1 and p2 are in clockwise direction.\n\n\t\t\ttempV2_1.copy( p1 ).sub( center ).normalize();\n\t\t\ttempV2_2.copy( p2 ).sub( center ).normalize();\n\n\t\t\tlet angle = Math.PI;\n\t\t\tconst dot = tempV2_1.dot( tempV2_2 );\n\t\t\tif ( Math.abs( dot ) < 1 ) angle = Math.abs( Math.acos( dot ) );\n\n\t\t\tangle /= arcDivisions;\n\n\t\t\ttempV2_3.copy( p1 );\n\n\t\t\tfor ( let i = 0, il = arcDivisions - 1; i < il; i ++ ) {\n\n\t\t\t\ttempV2_4.copy( tempV2_3 ).rotateAround( center, angle );\n\n\t\t\t\taddVertex( tempV2_3, u, v );\n\t\t\t\taddVertex( tempV2_4, u, v );\n\t\t\t\taddVertex( center, u, 0.5 );\n\n\t\t\t\ttempV2_3.copy( tempV2_4 );\n\n\t\t\t}\n\n\t\t\taddVertex( tempV2_4, u, v );\n\t\t\taddVertex( p2, u, v );\n\t\t\taddVertex( center, u, 0.5 );\n\n\t\t}\n\n\t\tfunction makeSegmentTriangles() {\n\n\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\taddVertex( currentPointL, u1, 0 );\n\n\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t}\n\n\t\tfunction makeSegmentWithBevelJoin( joinIsOnLeftSide, innerSideModified, u ) {\n\n\t\t\tif ( innerSideModified ) {\n\n\t\t\t\t// Optimized segment + bevel triangles\n\n\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t// Path segments triangles\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t\t// Bevel join triangle\n\n\t\t\t\t\taddVertex( currentPointL, u, 0 );\n\t\t\t\t\taddVertex( nextPointL, u, 0 );\n\t\t\t\t\taddVertex( innerPoint, u, 0.5 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Path segments triangles\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t\t\t\t// Bevel join triangle\n\n\t\t\t\t\taddVertex( currentPointR, u, 1 );\n\t\t\t\t\taddVertex( innerPoint, u, 0 );\n\t\t\t\t\taddVertex( nextPointR, u, 1 );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// Bevel join triangle. The segment triangles are done in the main loop\n\n\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\taddVertex( currentPointL, u, 0 );\n\t\t\t\t\taddVertex( nextPointL, u, 0 );\n\t\t\t\t\taddVertex( currentPoint, u, 0.5 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\taddVertex( currentPointR, u, 1 );\n\t\t\t\t\taddVertex( nextPointR, u, 0 );\n\t\t\t\t\taddVertex( currentPoint, u, 0.5 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction createSegmentTrianglesWithMiddleSection( joinIsOnLeftSide, innerSideModified ) {\n\n\t\t\tif ( innerSideModified ) {\n\n\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( currentPointL, u1, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t\taddVertex( currentPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\taddVertex( nextPointL, u0, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 1 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\taddVertex( lastPointR, u0, 1 );\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t\t\t\taddVertex( lastPointL, u0, 0 );\n\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\taddVertex( currentPointR, u1, 1 );\n\n\t\t\t\t\taddVertex( currentPointR, u0, 1 );\n\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\n\t\t\t\t\taddVertex( currentPoint, u1, 0.5 );\n\t\t\t\t\taddVertex( innerPoint, u1, 0 );\n\t\t\t\t\taddVertex( nextPointR, u0, 1 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction addCapGeometry( center, p1, p2, joinIsOnLeftSide, start, u ) {\n\n\t\t\t// param center: End point of the path\n\t\t\t// param p1, p2: Left and right cap points\n\n\t\t\tswitch ( style.strokeLineCap ) {\n\n\t\t\t\tcase 'round':\n\n\t\t\t\t\tif ( start ) {\n\n\t\t\t\t\t\tmakeCircularSector( center, p2, p1, u, 0.5 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tmakeCircularSector( center, p1, p2, u, 0.5 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'square':\n\n\t\t\t\t\tif ( start ) {\n\n\t\t\t\t\t\ttempV2_1.subVectors( p1, center );\n\t\t\t\t\t\ttempV2_2.set( tempV2_1.y, - tempV2_1.x );\n\n\t\t\t\t\t\ttempV2_3.addVectors( tempV2_1, tempV2_2 ).add( center );\n\t\t\t\t\t\ttempV2_4.subVectors( tempV2_2, tempV2_1 ).add( center );\n\n\t\t\t\t\t\t// Modify already existing vertices\n\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\ttempV2_3.toArray( vertices, 1 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, 0 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, 3 * 3 );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ttempV2_3.toArray( vertices, 1 * 3 );\n\t\t\t\t\t\t\t// using tempV2_4 to update 3rd vertex if the uv.y of 3rd vertex is 1\n\t\t\t\t\t\t\tuvs[ 3 * 2 + 1 ] === 1 ? tempV2_4.toArray( vertices, 3 * 3 ) : tempV2_3.toArray( vertices, 3 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, 0 * 3 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttempV2_1.subVectors( p2, center );\n\t\t\t\t\t\ttempV2_2.set( tempV2_1.y, - tempV2_1.x );\n\n\t\t\t\t\t\ttempV2_3.addVectors( tempV2_1, tempV2_2 ).add( center );\n\t\t\t\t\t\ttempV2_4.subVectors( tempV2_2, tempV2_1 ).add( center );\n\n\t\t\t\t\t\tconst vl = vertices.length;\n\n\t\t\t\t\t\t// Modify already existing vertices\n\t\t\t\t\t\tif ( joinIsOnLeftSide ) {\n\n\t\t\t\t\t\t\ttempV2_3.toArray( vertices, vl - 1 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, vl - 2 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, vl - 4 * 3 );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, vl - 2 * 3 );\n\t\t\t\t\t\t\ttempV2_3.toArray( vertices, vl - 1 * 3 );\n\t\t\t\t\t\t\ttempV2_4.toArray( vertices, vl - 4 * 3 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'butt':\n\t\t\t\tdefault:\n\n\t\t\t\t\t// Nothing to do here\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction removeDuplicatedPoints( points ) {\n\n\t\t\t// Creates a new array if necessary with duplicated points removed.\n\t\t\t// This does not remove duplicated initial and ending points of a closed path.\n\n\t\t\tlet dupPoints = false;\n\t\t\tfor ( let i = 1, n = points.length - 1; i < n; i ++ ) {\n\n\t\t\t\tif ( points[ i ].distanceTo( points[ i + 1 ] ) < minDistance ) {\n\n\t\t\t\t\tdupPoints = true;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( ! dupPoints ) return points;\n\n\t\t\tconst newPoints = [];\n\t\t\tnewPoints.push( points[ 0 ] );\n\n\t\t\tfor ( let i = 1, n = points.length - 1; i < n; i ++ ) {\n\n\t\t\t\tif ( points[ i ].distanceTo( points[ i + 1 ] ) >= minDistance ) {\n\n\t\t\t\t\tnewPoints.push( points[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tnewPoints.push( points[ points.length - 1 ] );\n\n\t\t\treturn newPoints;\n\n\t\t}\n\n\t}\n\n\n}\n\nexport { SVGLoader };\n", "import {\n\tAdditiveBlending,\n\tBufferGeometry,\n\tColor,\n\tDoubleSide,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tGroup,\n\tLoader,\n\tLoaderUtils,\n\tMatrix4,\n\tMesh,\n\tMeshPhongMaterial,\n\tTextureLoader\n} from 'three';\n\n/**\n * A loader for the 3DS format, based on lib3ds.\n *\n * Loads geometry with uv and materials basic properties with texture support.\n *\n * ```js\n * const loader = new TDSLoader();\n * loader.setResourcePath( 'models/3ds/portalgun/textures/' );\n * const object = await loader.loadAsync( 'models/3ds/portalgun/portalgun.3ds' );\n * scene.add( object );\n *\n * @augments Loader\n * @three_import import { TDSLoader } from 'three/addons/loaders/TDSLoader.js';\n */\nclass TDSLoader extends Loader {\n\n\t/**\n\t * Constructs a new 3DS loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * Whether debug mode should be enabled or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.debug = false;\n\n\t\t// internals\n\n\t\tthis.group = null;\n\n\t\tthis.materials = [];\n\t\tthis.meshes = [];\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded 3DS asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Group)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\n\t\tloader.load( url, function ( data ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( data, path ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given 3DS data and returns the resulting data.\n\t *\n\t * @param {ArrayBuffer} arraybuffer - The raw 3DS data as an array buffer.\n\t * @param {string} path - The asset path.\n\t * @return {Group} The parsed asset represented as a group.\n\t */\n\tparse( arraybuffer, path ) {\n\n\t\tthis.group = new Group();\n\t\tthis.materials = [];\n\t\tthis.meshes = [];\n\n\t\tthis.readFile( arraybuffer, path );\n\n\t\tfor ( let i = 0; i < this.meshes.length; i ++ ) {\n\n\t\t\tthis.group.add( this.meshes[ i ] );\n\n\t\t}\n\n\t\treturn this.group;\n\n\t}\n\n\t/**\n\t * Decode file content to read 3ds data.\n\t *\n\t * @private\n\t * @param {ArrayBuffer} arraybuffer - Arraybuffer data to be loaded.\n\t * @param {string} path - Path for external resources.\n\t */\n\treadFile( arraybuffer, path ) {\n\n\t\tconst data = new DataView( arraybuffer );\n\t\tconst chunk = new Chunk( data, 0, this.debugMessage );\n\n\t\tif ( chunk.id === MLIBMAGIC || chunk.id === CMAGIC || chunk.id === M3DMAGIC ) {\n\n\t\t\tlet next = chunk.readChunk();\n\n\t\t\twhile ( next ) {\n\n\t\t\t\tif ( next.id === M3D_VERSION ) {\n\n\t\t\t\t\tconst version = next.readDWord();\n\t\t\t\t\tthis.debugMessage( '3DS file version: ' + version );\n\n\t\t\t\t} else if ( next.id === MDATA ) {\n\n\t\t\t\t\tthis.readMeshData( next, path );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.debugMessage( 'Unknown main chunk: ' + next.hexId );\n\n\t\t\t\t}\n\n\t\t\t\tnext = chunk.readChunk();\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.debugMessage( 'Parsed ' + this.meshes.length + ' meshes' );\n\n\t}\n\n\t/**\n\t * Read mesh data chunk.\n\t *\n\t * @private\n\t * @param {Chunk} chunk - to read mesh from\n\t * @param {string} path - Path for external resources.\n\t */\n\treadMeshData( chunk, path ) {\n\n\t\tlet next = chunk.readChunk();\n\n\t\twhile ( next ) {\n\n\t\t\tif ( next.id === MESH_VERSION ) {\n\n\t\t\t\tconst version = + next.readDWord();\n\t\t\t\tthis.debugMessage( 'Mesh Version: ' + version );\n\n\t\t\t} else if ( next.id === MASTER_SCALE ) {\n\n\t\t\t\tconst scale = next.readFloat();\n\t\t\t\tthis.debugMessage( 'Master scale: ' + scale );\n\t\t\t\tthis.group.scale.set( scale, scale, scale );\n\n\t\t\t} else if ( next.id === NAMED_OBJECT ) {\n\n\t\t\t\tthis.debugMessage( 'Named Object' );\n\t\t\t\tthis.readNamedObject( next );\n\n\t\t\t} else if ( next.id === MAT_ENTRY ) {\n\n\t\t\t\tthis.debugMessage( 'Material' );\n\t\t\t\tthis.readMaterialEntry( next, path );\n\n\t\t\t} else {\n\n\t\t\t\tthis.debugMessage( 'Unknown MDATA chunk: ' + next.hexId );\n\n\t\t\t}\n\n\t\t\tnext = chunk.readChunk();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Read named object chunk.\n\t *\n\t * @private\n\t * @param {Chunk} chunk - Chunk in use.\n\t */\n\treadNamedObject( chunk ) {\n\n\t\tconst name = chunk.readString();\n\n\t\tlet next = chunk.readChunk();\n\t\twhile ( next ) {\n\n\t\t\tif ( next.id === N_TRI_OBJECT ) {\n\n\t\t\t\tconst mesh = this.readMesh( next );\n\t\t\t\tmesh.name = name;\n\t\t\t\tthis.meshes.push( mesh );\n\n\t\t\t} else {\n\n\t\t\t\tthis.debugMessage( 'Unknown named object chunk: ' + next.hexId );\n\n\t\t\t}\n\n\t\t\tnext = chunk.readChunk( );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Read material data chunk and add it to the material list.\n\t *\n\t * @private\n\t * @param {Chunk} chunk - Chunk in use.\n\t * @param {string} path - Path for external resources.\n\t */\n\treadMaterialEntry( chunk, path ) {\n\n\t\tlet next = chunk.readChunk();\n\t\tconst material = new MeshPhongMaterial();\n\n\t\twhile ( next ) {\n\n\t\t\tif ( next.id === MAT_NAME ) {\n\n\t\t\t\tmaterial.name = next.readString();\n\t\t\t\tthis.debugMessage( '   Name: ' + material.name );\n\n\t\t\t} else if ( next.id === MAT_WIRE ) {\n\n\t\t\t\tthis.debugMessage( '   Wireframe' );\n\t\t\t\tmaterial.wireframe = true;\n\n\t\t\t} else if ( next.id === MAT_WIRE_SIZE ) {\n\n\t\t\t\tconst value = next.readByte();\n\t\t\t\tmaterial.wireframeLinewidth = value;\n\t\t\t\tthis.debugMessage( '   Wireframe Thickness: ' + value );\n\n\t\t\t} else if ( next.id === MAT_TWO_SIDE ) {\n\n\t\t\t\tmaterial.side = DoubleSide;\n\t\t\t\tthis.debugMessage( '   DoubleSided' );\n\n\t\t\t} else if ( next.id === MAT_ADDITIVE ) {\n\n\t\t\t\tthis.debugMessage( '   Additive Blending' );\n\t\t\t\tmaterial.blending = AdditiveBlending;\n\n\t\t\t} else if ( next.id === MAT_DIFFUSE ) {\n\n\t\t\t\tthis.debugMessage( '   Diffuse Color' );\n\t\t\t\tmaterial.color = this.readColor( next );\n\n\t\t\t} else if ( next.id === MAT_SPECULAR ) {\n\n\t\t\t\tthis.debugMessage( '   Specular Color' );\n\t\t\t\tmaterial.specular = this.readColor( next );\n\n\t\t\t} else if ( next.id === MAT_AMBIENT ) {\n\n\t\t\t\tthis.debugMessage( '   Ambient color' );\n\t\t\t\tmaterial.color = this.readColor( next );\n\n\t\t\t} else if ( next.id === MAT_SHININESS ) {\n\n\t\t\t\tconst shininess = this.readPercentage( next );\n\t\t\t\tmaterial.shininess = shininess * 100;\n\t\t\t\tthis.debugMessage( '   Shininess : ' + shininess );\n\n\t\t\t} else if ( next.id === MAT_TRANSPARENCY ) {\n\n\t\t\t\tconst transparency = this.readPercentage( next );\n\t\t\t\tmaterial.opacity = 1 - transparency;\n\t\t\t\tthis.debugMessage( '  Transparency : ' + transparency );\n\t\t\t\tmaterial.transparent = material.opacity < 1 ? true : false;\n\n\t\t\t} else if ( next.id === MAT_TEXMAP ) {\n\n\t\t\t\tthis.debugMessage( '   ColorMap' );\n\t\t\t\tmaterial.map = this.readMap( next, path );\n\n\t\t\t} else if ( next.id === MAT_BUMPMAP ) {\n\n\t\t\t\tthis.debugMessage( '   BumpMap' );\n\t\t\t\tmaterial.bumpMap = this.readMap( next, path );\n\n\t\t\t} else if ( next.id === MAT_OPACMAP ) {\n\n\t\t\t\tthis.debugMessage( '   OpacityMap' );\n\t\t\t\tmaterial.alphaMap = this.readMap( next, path );\n\n\t\t\t} else if ( next.id === MAT_SPECMAP ) {\n\n\t\t\t\tthis.debugMessage( '   SpecularMap' );\n\t\t\t\tmaterial.specularMap = this.readMap( next, path );\n\n\t\t\t} else {\n\n\t\t\t\tthis.debugMessage( '   Unknown material chunk: ' + next.hexId );\n\n\t\t\t}\n\n\t\t\tnext = chunk.readChunk();\n\n\t\t}\n\n\t\tthis.materials[ material.name ] = material;\n\n\t}\n\n\t/**\n\t * Read mesh data chunk.\n\t *\n\t * @private\n\t * @param {Chunk} chunk - Chunk in use.\n\t * @return {Mesh} - The parsed mesh.\n\t */\n\treadMesh( chunk ) {\n\n\t\tlet next = chunk.readChunk( );\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tconst material = new MeshPhongMaterial();\n\t\tconst mesh = new Mesh( geometry, material );\n\t\tmesh.name = 'mesh';\n\n\t\twhile ( next ) {\n\n\t\t\tif ( next.id === POINT_ARRAY ) {\n\n\t\t\t\tconst points = next.readWord( );\n\n\t\t\t\tthis.debugMessage( '   Vertex: ' + points );\n\n\t\t\t\t//BufferGeometry\n\n\t\t\t\tconst vertices = [];\n\n\t\t\t\tfor ( let i = 0; i < points; i ++ )\t\t{\n\n\t\t\t\t\tvertices.push( next.readFloat( ) );\n\t\t\t\t\tvertices.push( next.readFloat( ) );\n\t\t\t\t\tvertices.push( next.readFloat( ) );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\t\t} else if ( next.id === FACE_ARRAY ) {\n\n\t\t\t\tthis.readFaceArray( next, mesh );\n\n\t\t\t} else if ( next.id === TEX_VERTS ) {\n\n\t\t\t\tconst texels = next.readWord( );\n\n\t\t\t\tthis.debugMessage( '   UV: ' + texels );\n\n\t\t\t\t//BufferGeometry\n\n\t\t\t\tconst uvs = [];\n\n\t\t\t\tfor ( let i = 0; i < texels; i ++ ) {\n\n\t\t\t\t\tuvs.push( next.readFloat( ) );\n\t\t\t\t\tuvs.push( next.readFloat( ) );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );\n\n\n\t\t\t} else if ( next.id === MESH_MATRIX ) {\n\n\t\t\t\tthis.debugMessage( '   Transformation Matrix (TODO)' );\n\n\t\t\t\tconst values = [];\n\t\t\t\tfor ( let i = 0; i < 12; i ++ ) {\n\n\t\t\t\t\tvalues[ i ] = next.readFloat( );\n\n\t\t\t\t}\n\n\t\t\t\tconst matrix = new Matrix4();\n\n\t\t\t\t//X Line\n\t\t\t\tmatrix.elements[ 0 ] = values[ 0 ];\n\t\t\t\tmatrix.elements[ 1 ] = values[ 6 ];\n\t\t\t\tmatrix.elements[ 2 ] = values[ 3 ];\n\t\t\t\tmatrix.elements[ 3 ] = values[ 9 ];\n\n\t\t\t\t//Y Line\n\t\t\t\tmatrix.elements[ 4 ] = values[ 2 ];\n\t\t\t\tmatrix.elements[ 5 ] = values[ 8 ];\n\t\t\t\tmatrix.elements[ 6 ] = values[ 5 ];\n\t\t\t\tmatrix.elements[ 7 ] = values[ 11 ];\n\n\t\t\t\t//Z Line\n\t\t\t\tmatrix.elements[ 8 ] = values[ 1 ];\n\t\t\t\tmatrix.elements[ 9 ] = values[ 7 ];\n\t\t\t\tmatrix.elements[ 10 ] = values[ 4 ];\n\t\t\t\tmatrix.elements[ 11 ] = values[ 10 ];\n\n\t\t\t\t//W Line\n\t\t\t\tmatrix.elements[ 12 ] = 0;\n\t\t\t\tmatrix.elements[ 13 ] = 0;\n\t\t\t\tmatrix.elements[ 14 ] = 0;\n\t\t\t\tmatrix.elements[ 15 ] = 1;\n\n\t\t\t\tmatrix.transpose();\n\n\t\t\t\tconst inverse = new Matrix4();\n\t\t\t\tinverse.copy( matrix ).invert();\n\t\t\t\tgeometry.applyMatrix4( inverse );\n\n\t\t\t\tmatrix.decompose( mesh.position, mesh.quaternion, mesh.scale );\n\n\t\t\t} else {\n\n\t\t\t\tthis.debugMessage( '   Unknown mesh chunk: ' + next.hexId );\n\n\t\t\t}\n\n\t\t\tnext = chunk.readChunk( );\n\n\t\t}\n\n\t\tgeometry.computeVertexNormals();\n\n\t\treturn mesh;\n\n\t}\n\n\t/**\n\t * Read face array data chunk.\n\t *\n\t * @private\n\t * @param {Chunk} chunk - Chunk in use.\n\t * @param {Mesh} mesh - Mesh to be filled with the data read.\n\t */\n\treadFaceArray( chunk, mesh ) {\n\n\t\tconst faces = chunk.readWord( );\n\n\t\tthis.debugMessage( '   Faces: ' + faces );\n\n\t\tconst index = [];\n\n\t\tfor ( let i = 0; i < faces; ++ i ) {\n\n\t\t\tindex.push( chunk.readWord( ), chunk.readWord( ), chunk.readWord( ) );\n\n\t\t\tchunk.readWord( ); // visibility\n\n\t\t}\n\n\t\tmesh.geometry.setIndex( index );\n\n\t\t//The rest of the FACE_ARRAY chunk is subchunks\n\n\t\tlet materialIndex = 0;\n\t\tlet start = 0;\n\n\t\twhile ( ! chunk.endOfChunk ) {\n\n\t\t\tconst subchunk = chunk.readChunk( );\n\n\t\t\tif ( subchunk.id === MSH_MAT_GROUP ) {\n\n\t\t\t\tthis.debugMessage( '      Material Group' );\n\n\t\t\t\tconst group = this.readMaterialGroup( subchunk );\n\t\t\t\tconst count = group.index.length * 3; // assuming successive indices\n\n\t\t\t\tmesh.geometry.addGroup( start, count, materialIndex );\n\n\t\t\t\tstart += count;\n\t\t\t\tmaterialIndex ++;\n\n\t\t\t\tconst material = this.materials[ group.name ];\n\n\t\t\t\tif ( Array.isArray( mesh.material ) === false ) mesh.material = [];\n\n\t\t\t\tif ( material !== undefined )\t{\n\n\t\t\t\t\tmesh.material.push( material );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tthis.debugMessage( '      Unknown face array chunk: ' + subchunk.hexId );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( mesh.material.length === 1 ) mesh.material = mesh.material[ 0 ]; // for backwards compatibility\n\n\t}\n\n\t/**\n\t * Read texture map data chunk.\n\t *\n\t * @private\n\t * @param {Chunk} chunk - Chunk in use.\n\t * @param {string} path - Path for external resources.\n\t * @return {Texture} Texture read from this data chunk.\n\t */\n\treadMap( chunk, path ) {\n\n\t\tlet next = chunk.readChunk( );\n\t\tlet texture = {};\n\n\t\tconst loader = new TextureLoader( this.manager );\n\t\tloader.setPath( this.resourcePath || path ).setCrossOrigin( this.crossOrigin );\n\n\t\twhile ( next ) {\n\n\t\t\tif ( next.id === MAT_MAPNAME ) {\n\n\t\t\t\tconst name = next.readString();\n\t\t\t\ttexture = loader.load( name );\n\n\t\t\t\tthis.debugMessage( '      File: ' + path + name );\n\n\t\t\t} else if ( next.id === MAT_MAP_UOFFSET ) {\n\n\t\t\t\ttexture.offset.x = next.readFloat( );\n\t\t\t\tthis.debugMessage( '      OffsetX: ' + texture.offset.x );\n\n\t\t\t} else if ( next.id === MAT_MAP_VOFFSET ) {\n\n\t\t\t\ttexture.offset.y = next.readFloat( );\n\t\t\t\tthis.debugMessage( '      OffsetY: ' + texture.offset.y );\n\n\t\t\t} else if ( next.id === MAT_MAP_USCALE ) {\n\n\t\t\t\ttexture.repeat.x = next.readFloat( );\n\t\t\t\tthis.debugMessage( '      RepeatX: ' + texture.repeat.x );\n\n\t\t\t} else if ( next.id === MAT_MAP_VSCALE ) {\n\n\t\t\t\ttexture.repeat.y = next.readFloat( );\n\t\t\t\tthis.debugMessage( '      RepeatY: ' + texture.repeat.y );\n\n\t\t\t} else {\n\n\t\t\t\tthis.debugMessage( '      Unknown map chunk: ' + next.hexId );\n\n\t\t\t}\n\n\t\t\tnext = chunk.readChunk( );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\t/**\n\t * Read material group data chunk.\n\t *\n\t * @private\n\t * @param {Chunk} chunk - Chunk in use.\n\t * @return {Object} Object with name and index of the object.\n\t */\n\treadMaterialGroup( chunk ) {\n\n\t\tconst name = chunk.readString();\n\t\tconst numFaces = chunk.readWord();\n\n\t\tthis.debugMessage( '         Name: ' + name );\n\t\tthis.debugMessage( '         Faces: ' + numFaces );\n\n\t\tconst index = [];\n\t\tfor ( let i = 0; i < numFaces; ++ i ) {\n\n\t\t\tindex.push( chunk.readWord( ) );\n\n\t\t}\n\n\t\treturn { name: name, index: index };\n\n\t}\n\n\t/**\n\t * Read a color value.\n\t *\n\t * @private\n\t * @param {Chunk} chunk - Chunk.\n\t * @return {Color} Color value read.\n\t */\n\treadColor( chunk ) {\n\n\t\tconst subChunk = chunk.readChunk( );\n\t\tconst color = new Color();\n\n\t\tif ( subChunk.id === COLOR_24 || subChunk.id === LIN_COLOR_24 ) {\n\n\t\t\tconst r = subChunk.readByte( );\n\t\t\tconst g = subChunk.readByte( );\n\t\t\tconst b = subChunk.readByte( );\n\n\t\t\tcolor.setRGB( r / 255, g / 255, b / 255 );\n\n\t\t\tthis.debugMessage( '      Color: ' + color.r + ', ' + color.g + ', ' + color.b );\n\n\t\t}\telse if ( subChunk.id === COLOR_F || subChunk.id === LIN_COLOR_F ) {\n\n\t\t\tconst r = subChunk.readFloat( );\n\t\t\tconst g = subChunk.readFloat( );\n\t\t\tconst b = subChunk.readFloat( );\n\n\t\t\tcolor.setRGB( r, g, b );\n\n\t\t\tthis.debugMessage( '      Color: ' + color.r + ', ' + color.g + ', ' + color.b );\n\n\t\t}\telse {\n\n\t\t\tthis.debugMessage( '      Unknown color chunk: ' + subChunk.hexId );\n\n\t\t}\n\n\t\treturn color;\n\n\t}\n\n\t/**\n\t * Read percentage value.\n\t *\n\t * @private\n\t * @param {Chunk} chunk - Chunk to read data from.\n\t * @return {number} Data read from the dataview.\n\t */\n\treadPercentage( chunk ) {\n\n\t\tconst subChunk = chunk.readChunk( );\n\n\t\tswitch ( subChunk.id ) {\n\n\t\t\tcase INT_PERCENTAGE:\n\t\t\t\treturn ( subChunk.readShort( ) / 100 );\n\n\t\t\tcase FLOAT_PERCENTAGE:\n\t\t\t\treturn subChunk.readFloat( );\n\n\t\t\tdefault:\n\t\t\t\tthis.debugMessage( '      Unknown percentage chunk: ' + subChunk.hexId );\n\t\t\t\treturn 0;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Print debug message to the console.\n\t *\n\t * Is controlled by a flag to show or hide debug messages.\n\t *\n\t * @private\n\t * @param {Object} message - Debug message to print to the console.\n\t */\n\tdebugMessage( message ) {\n\n\t\tif ( this.debug ) {\n\n\t\t\tconsole.log( message );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Read data/sub-chunks from chunk.\n *\n * @private\n */\nclass Chunk {\n\n\t/**\n\t * Create a new chunk\n\t *\n\t * @private\n\t * @param {DataView} data - DataView to read from.\n\t * @param {number} position - In data.\n\t * @param {Function} debugMessage - Logging callback.\n\t */\n\tconstructor( data, position, debugMessage ) {\n\n\t\tthis.data = data;\n\t\t// the offset to the begin of this chunk\n\t\tthis.offset = position;\n\t\t// the current reading position\n\t\tthis.position = position;\n\t\tthis.debugMessage = debugMessage;\n\n\t\tif ( this.debugMessage instanceof Function ) {\n\n\t\t\tthis.debugMessage = function () {};\n\n\t\t}\n\n\t\tthis.id = this.readWord();\n\t\tthis.size = this.readDWord();\n\t\tthis.end = this.offset + this.size;\n\n\t\tif ( this.end > data.byteLength ) {\n\n\t\t\tthis.debugMessage( 'Bad chunk size for chunk at ' + position );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Reads a sub cchunk.\n\t *\n\t * @private\n\t * @return {Chunk | null} next sub chunk.\n\t */\n\treadChunk() {\n\n\t\tif ( this.endOfChunk ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\ttry {\n\n\t\t\tconst next = new Chunk( this.data, this.position, this.debugMessage );\n\t\t\tthis.position += next.size;\n\t\t\treturn next;\n\n\t\t}\tcatch ( e ) {\n\n\t\t\tthis.debugMessage( 'Unable to read chunk at ' + this.position );\n\t\t\treturn null;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the ID of this chunk as Hex\n\t *\n\t * @private\n\t * @return {string} hex-string of id\n\t */\n\tget hexId() {\n\n\t\treturn this.id.toString( 16 );\n\n\t}\n\n\tget endOfChunk() {\n\n\t\treturn this.position >= this.end;\n\n\t}\n\n\t/**\n\t * Read byte value.\n\t *\n\t * @private\n\t * @return {number} Data read from the dataview.\n\t */\n\treadByte() {\n\n\t\tconst v = this.data.getUint8( this.position, true );\n\t\tthis.position += 1;\n\t\treturn v;\n\n\t}\n\n\t/**\n\t * Read 32 bit float value.\n\t *\n\t * @private\n\t * @return {number} Data read from the dataview.\n\t */\n\treadFloat() {\n\n\t\ttry {\n\n\t\t\tconst v = this.data.getFloat32( this.position, true );\n\t\t\tthis.position += 4;\n\t\t\treturn v;\n\n\t\t}\tcatch ( e ) {\n\n\t\t\tthis.debugMessage( e + ' ' + this.position + ' ' + this.data.byteLength );\n\t\t\treturn 0;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Read 32 bit signed integer value.\n\t *\n\t * @private\n\t * @return {number} Data read from the dataview.\n\t */\n\treadInt() {\n\n\t\tconst v = this.data.getInt32( this.position, true );\n\t\tthis.position += 4;\n\t\treturn v;\n\n\t}\n\n\t/**\n\t * Read 16 bit signed integer value.\n\t *\n\t * @private\n\t * @return {number} Data read from the dataview.\n\t */\n\treadShort() {\n\n\t\tconst v = this.data.getInt16( this.position, true );\n\t\tthis.position += 2;\n\t\treturn v;\n\n\t}\n\n\t/**\n\t * Read 64 bit unsigned integer value.\n\t *\n\t * @private\n\t * @return {number} Data read from the dataview.\n\t */\n\treadDWord() {\n\n\t\tconst v = this.data.getUint32( this.position, true );\n\t\tthis.position += 4;\n\t\treturn v;\n\n\t}\n\n\t/**\n\t * Read 32 bit unsigned integer value.\n\t *\n\t * @private\n\t * @return {number} Data read from the dataview.\n\t */\n\treadWord() {\n\n\t\tconst v = this.data.getUint16( this.position, true );\n\t\tthis.position += 2;\n\t\treturn v;\n\n\t}\n\n\t/**\n\t * Read NULL terminated ASCII string value from chunk-pos.\n\t *\n\t * @private\n\t * @return {string} Data read from the dataview.\n\t */\n\treadString() {\n\n\t\tlet s = '';\n\t\tlet c = this.readByte();\n\t\twhile ( c ) {\n\n\t\t\ts += String.fromCharCode( c );\n\t\t\tc = this.readByte();\n\n\t\t}\n\n\t\treturn s;\n\n\t}\n\n}\n\n// const NULL_CHUNK = 0x0000;\nconst M3DMAGIC = 0x4D4D;\n// const SMAGIC = 0x2D2D;\n// const LMAGIC = 0x2D3D;\nconst MLIBMAGIC = 0x3DAA;\n// const MATMAGIC = 0x3DFF;\nconst CMAGIC = 0xC23D;\nconst M3D_VERSION = 0x0002;\n// const M3D_KFVERSION = 0x0005;\nconst COLOR_F = 0x0010;\nconst COLOR_24 = 0x0011;\nconst LIN_COLOR_24 = 0x0012;\nconst LIN_COLOR_F = 0x0013;\nconst INT_PERCENTAGE = 0x0030;\nconst FLOAT_PERCENTAGE = 0x0031;\nconst MDATA = 0x3D3D;\nconst MESH_VERSION = 0x3D3E;\nconst MASTER_SCALE = 0x0100;\n// const LO_SHADOW_BIAS = 0x1400;\n// const HI_SHADOW_BIAS = 0x1410;\n// const SHADOW_MAP_SIZE = 0x1420;\n// const SHADOW_SAMPLES = 0x1430;\n// const SHADOW_RANGE = 0x1440;\n// const SHADOW_FILTER = 0x1450;\n// const RAY_BIAS = 0x1460;\n// const O_CONSTS = 0x1500;\n// const AMBIENT_LIGHT = 0x2100;\n// const BIT_MAP = 0x1100;\n// const SOLID_BGND = 0x1200;\n// const V_GRADIENT = 0x1300;\n// const USE_BIT_MAP = 0x1101;\n// const USE_SOLID_BGND = 0x1201;\n// const USE_V_GRADIENT = 0x1301;\n// const FOG = 0x2200;\n// const FOG_BGND = 0x2210;\n// const LAYER_FOG = 0x2302;\n// const DISTANCE_CUE = 0x2300;\n// const DCUE_BGND = 0x2310;\n// const USE_FOG = 0x2201;\n// const USE_LAYER_FOG = 0x2303;\n// const USE_DISTANCE_CUE = 0x2301;\nconst MAT_ENTRY = 0xAFFF;\nconst MAT_NAME = 0xA000;\nconst MAT_AMBIENT = 0xA010;\nconst MAT_DIFFUSE = 0xA020;\nconst MAT_SPECULAR = 0xA030;\nconst MAT_SHININESS = 0xA040;\n// const MAT_SHIN2PCT = 0xA041;\nconst MAT_TRANSPARENCY = 0xA050;\n// const MAT_XPFALL = 0xA052;\n// const MAT_USE_XPFALL = 0xA240;\n// const MAT_REFBLUR = 0xA053;\n// const MAT_SHADING = 0xA100;\n// const MAT_USE_REFBLUR = 0xA250;\n// const MAT_SELF_ILLUM = 0xA084;\nconst MAT_TWO_SIDE = 0xA081;\n// const MAT_DECAL = 0xA082;\nconst MAT_ADDITIVE = 0xA083;\nconst MAT_WIRE = 0xA085;\n// const MAT_FACEMAP = 0xA088;\n// const MAT_TRANSFALLOFF_IN = 0xA08A;\n// const MAT_PHONGSOFT = 0xA08C;\n// const MAT_WIREABS = 0xA08E;\nconst MAT_WIRE_SIZE = 0xA087;\nconst MAT_TEXMAP = 0xA200;\n// const MAT_SXP_TEXT_DATA = 0xA320;\n// const MAT_TEXMASK = 0xA33E;\n// const MAT_SXP_TEXTMASK_DATA = 0xA32A;\n// const MAT_TEX2MAP = 0xA33A;\n// const MAT_SXP_TEXT2_DATA = 0xA321;\n// const MAT_TEX2MASK = 0xA340;\n// const MAT_SXP_TEXT2MASK_DATA = 0xA32C;\nconst MAT_OPACMAP = 0xA210;\n// const MAT_SXP_OPAC_DATA = 0xA322;\n// const MAT_OPACMASK = 0xA342;\n// const MAT_SXP_OPACMASK_DATA = 0xA32E;\nconst MAT_BUMPMAP = 0xA230;\n// const MAT_SXP_BUMP_DATA = 0xA324;\n// const MAT_BUMPMASK = 0xA344;\n// const MAT_SXP_BUMPMASK_DATA = 0xA330;\nconst MAT_SPECMAP = 0xA204;\n// const MAT_SXP_SPEC_DATA = 0xA325;\n// const MAT_SPECMASK = 0xA348;\n// const MAT_SXP_SPECMASK_DATA = 0xA332;\n// const MAT_SHINMAP = 0xA33C;\n// const MAT_SXP_SHIN_DATA = 0xA326;\n// const MAT_SHINMASK = 0xA346;\n// const MAT_SXP_SHINMASK_DATA = 0xA334;\n// const MAT_SELFIMAP = 0xA33D;\n// const MAT_SXP_SELFI_DATA = 0xA328;\n// const MAT_SELFIMASK = 0xA34A;\n// const MAT_SXP_SELFIMASK_DATA = 0xA336;\n// const MAT_REFLMAP = 0xA220;\n// const MAT_REFLMASK = 0xA34C;\n// const MAT_SXP_REFLMASK_DATA = 0xA338;\n// const MAT_ACUBIC = 0xA310;\nconst MAT_MAPNAME = 0xA300;\n// const MAT_MAP_TILING = 0xA351;\n// const MAT_MAP_TEXBLUR = 0xA353;\nconst MAT_MAP_USCALE = 0xA354;\nconst MAT_MAP_VSCALE = 0xA356;\nconst MAT_MAP_UOFFSET = 0xA358;\nconst MAT_MAP_VOFFSET = 0xA35A;\n// const MAT_MAP_ANG = 0xA35C;\n// const MAT_MAP_COL1 = 0xA360;\n// const MAT_MAP_COL2 = 0xA362;\n// const MAT_MAP_RCOL = 0xA364;\n// const MAT_MAP_GCOL = 0xA366;\n// const MAT_MAP_BCOL = 0xA368;\nconst NAMED_OBJECT = 0x4000;\n// const N_DIRECT_LIGHT = 0x4600;\n// const DL_OFF = 0x4620;\n// const DL_OUTER_RANGE = 0x465A;\n// const DL_INNER_RANGE = 0x4659;\n// const DL_MULTIPLIER = 0x465B;\n// const DL_EXCLUDE = 0x4654;\n// const DL_ATTENUATE = 0x4625;\n// const DL_SPOTLIGHT = 0x4610;\n// const DL_SPOT_ROLL = 0x4656;\n// const DL_SHADOWED = 0x4630;\n// const DL_LOCAL_SHADOW2 = 0x4641;\n// const DL_SEE_CONE = 0x4650;\n// const DL_SPOT_RECTANGULAR = 0x4651;\n// const DL_SPOT_ASPECT = 0x4657;\n// const DL_SPOT_PROJECTOR = 0x4653;\n// const DL_SPOT_OVERSHOOT = 0x4652;\n// const DL_RAY_BIAS = 0x4658;\n// const DL_RAYSHAD = 0x4627;\n// const N_CAMERA = 0x4700;\n// const CAM_SEE_CONE = 0x4710;\n// const CAM_RANGES = 0x4720;\n// const OBJ_HIDDEN = 0x4010;\n// const OBJ_VIS_LOFTER = 0x4011;\n// const OBJ_DOESNT_CAST = 0x4012;\n// const OBJ_DONT_RECVSHADOW = 0x4017;\n// const OBJ_MATTE = 0x4013;\n// const OBJ_FAST = 0x4014;\n// const OBJ_PROCEDURAL = 0x4015;\n// const OBJ_FROZEN = 0x4016;\nconst N_TRI_OBJECT = 0x4100;\nconst POINT_ARRAY = 0x4110;\n// const POINT_FLAG_ARRAY = 0x4111;\nconst FACE_ARRAY = 0x4120;\nconst MSH_MAT_GROUP = 0x4130;\n// const SMOOTH_GROUP = 0x4150;\n// const MSH_BOXMAP = 0x4190;\nconst TEX_VERTS = 0x4140;\nconst MESH_MATRIX = 0x4160;\n// const MESH_COLOR = 0x4165;\n// const MESH_TEXTURE_INFO = 0x4170;\n// const KFDATA = 0xB000;\n// const KFHDR = 0xB00A;\n// const KFSEG = 0xB008;\n// const KFCURTIME = 0xB009;\n// const AMBIENT_NODE_TAG = 0xB001;\n// const OBJECT_NODE_TAG = 0xB002;\n// const CAMERA_NODE_TAG = 0xB003;\n// const TARGET_NODE_TAG = 0xB004;\n// const LIGHT_NODE_TAG = 0xB005;\n// const L_TARGET_NODE_TAG = 0xB006;\n// const SPOTLIGHT_NODE_TAG = 0xB007;\n// const NODE_ID = 0xB030;\n// const NODE_HDR = 0xB010;\n// const PIVOT = 0xB013;\n// const INSTANCE_NAME = 0xB011;\n// const MORPH_SMOOTH = 0xB015;\n// const BOUNDBOX = 0xB014;\n// const POS_TRACK_TAG = 0xB020;\n// const COL_TRACK_TAG = 0xB025;\n// const ROT_TRACK_TAG = 0xB021;\n// const SCL_TRACK_TAG = 0xB022;\n// const MORPH_TRACK_TAG = 0xB026;\n// const FOV_TRACK_TAG = 0xB023;\n// const ROLL_TRACK_TAG = 0xB024;\n// const HOT_TRACK_TAG = 0xB027;\n// const FALL_TRACK_TAG = 0xB028;\n// const HIDE_TRACK_TAG = 0xB029;\n// const POLY_2D = 0x5000;\n// const SHAPE_OK = 0x5010;\n// const SHAPE_NOT_OK = 0x5011;\n// const SHAPE_HOOK = 0x5020;\n// const PATH_3D = 0x6000;\n// const PATH_MATRIX = 0x6005;\n// const SHAPE_2D = 0x6010;\n// const M_SCALE = 0x6020;\n// const M_TWIST = 0x6030;\n// const M_TEETER = 0x6040;\n// const M_FIT = 0x6050;\n// const M_BEVEL = 0x6060;\n// const XZ_CURVE = 0x6070;\n// const YZ_CURVE = 0x6080;\n// const INTERPCT = 0x6090;\n// const DEFORM_LIMIT = 0x60A0;\n// const USE_CONTOUR = 0x6100;\n// const USE_TWEEN = 0x6110;\n// const USE_SCALE = 0x6120;\n// const USE_TWIST = 0x6130;\n// const USE_TEETER = 0x6140;\n// const USE_FIT = 0x6150;\n// const USE_BEVEL = 0x6160;\n// const DEFAULT_VIEW = 0x3000;\n// const VIEW_TOP = 0x3010;\n// const VIEW_BOTTOM = 0x3020;\n// const VIEW_LEFT = 0x3030;\n// const VIEW_RIGHT = 0x3040;\n// const VIEW_FRONT = 0x3050;\n// const VIEW_BACK = 0x3060;\n// const VIEW_USER = 0x3070;\n// const VIEW_CAMERA = 0x3080;\n// const VIEW_WINDOW = 0x3090;\n// const VIEWPORT_LAYOUT_OLD = 0x7000;\n// const VIEWPORT_DATA_OLD = 0x7010;\n// const VIEWPORT_LAYOUT = 0x7001;\n// const VIEWPORT_DATA = 0x7011;\n// const VIEWPORT_DATA_3 = 0x7012;\n// const VIEWPORT_SIZE = 0x7020;\n// const NETWORK_VIEW = 0x7030;\n\nexport { TDSLoader };\n", "import {\n\tDataTextureLoader,\n\tLinearFilter,\n\tLinearMipmapLinearFilter\n} from 'three';\n\nimport UTIF from '../libs/utif.module.js';\n\n/**\n * A loader for the TIFF texture format.\n *\n * ```js\n * const loader = new TIFFLoader();\n * const texture = await loader.loadAsync( 'textures/tiff/crate_lzw.tif' );\n * texture.colorSpace = THREE.SRGBColorSpace;\n * ```\n *\n * @augments DataTextureLoader\n * @three_import import { TIFFLoader } from 'three/addons/loaders/TIFFLoader.js';\n */\nclass TIFFLoader extends DataTextureLoader {\n\n\t/**\n\t * Constructs a new TIFF loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Parses the given TIFF texture data.\n\t *\n\t * @param {ArrayBuffer} buffer - The raw texture data.\n\t * @return {DataTextureLoader~TexData} An object representing the parsed texture data.\n\t */\n\tparse( buffer ) {\n\n\t\tconst ifds = UTIF.decode( buffer );\n\t\tUTIF.decodeImage( buffer, ifds[ 0 ] );\n\t\tconst rgba = UTIF.toRGBA8( ifds[ 0 ] );\n\n\t\treturn {\n\t\t\twidth: ifds[ 0 ].width,\n\t\t\theight: ifds[ 0 ].height,\n\t\t\tdata: rgba,\n\t\t\tflipY: true,\n\t\t\tmagFilter: LinearFilter,\n\t\t\tminFilter: LinearMipmapLinearFilter\n\t\t};\n\n\t}\n\n}\n\nexport { TIFFLoader };\n", "import {\n\tFileLoader,\n\tLoader\n} from 'three';\nimport opentype from '../libs/opentype.module.js';\n\n/**\n * A loader for the TTF format.\n *\n * Loads TTF files and converts them into typeface JSON that can be used directly\n * to create THREE.Font objects.\n *\n * ```js\n * const loader = new TTFLoader();\n * const json = await loader.loadAsync( 'fonts/ttf/kenpixel.ttf' );\n * const font = new Font( json );\n * ```\n *\n * @augments Loader\n * @three_import import { TTFLoader } from 'three/addons/loaders/TTFLoader.js';\n */\nclass TTFLoader extends Loader {\n\n\t/**\n\t * Constructs a new TTF loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * Whether the TTF commands should be reversed or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.reversed = false;\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded TTF asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Object)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( buffer ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given TTF data and returns a JSON for creating a font.\n\t *\n\t * @param {ArrayBuffer} arraybuffer - The raw TTF data as an array buffer.\n\t * @return {Object} The result JSON.\n\t */\n\tparse( arraybuffer ) {\n\n\t\tfunction convert( font, reversed ) {\n\n\t\t\tconst round = Math.round;\n\n\t\t\tconst glyphs = {};\n\t\t\tconst scale = ( 100000 ) / ( ( font.unitsPerEm || 2048 ) * 72 );\n\n\t\t\tconst glyphIndexMap = font.encoding.cmap.glyphIndexMap;\n\t\t\tconst unicodes = Object.keys( glyphIndexMap );\n\n\t\t\tfor ( let i = 0; i < unicodes.length; i ++ ) {\n\n\t\t\t\tconst unicode = unicodes[ i ];\n\t\t\t\tconst glyph = font.glyphs.glyphs[ glyphIndexMap[ unicode ] ];\n\n\t\t\t\tif ( unicode !== undefined ) {\n\n\t\t\t\t\tconst token = {\n\t\t\t\t\t\tha: round( glyph.advanceWidth * scale ),\n\t\t\t\t\t\tx_min: round( glyph.xMin * scale ),\n\t\t\t\t\t\tx_max: round( glyph.xMax * scale ),\n\t\t\t\t\t\to: ''\n\t\t\t\t\t};\n\n\t\t\t\t\tif ( reversed ) {\n\n\t\t\t\t\t\tglyph.path.commands = reverseCommands( glyph.path.commands );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tglyph.path.commands.forEach( function ( command ) {\n\n\t\t\t\t\t\tif ( command.type.toLowerCase() === 'c' ) {\n\n\t\t\t\t\t\t\tcommand.type = 'b';\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttoken.o += command.type.toLowerCase() + ' ';\n\n\t\t\t\t\t\tif ( command.x !== undefined && command.y !== undefined ) {\n\n\t\t\t\t\t\t\ttoken.o += round( command.x * scale ) + ' ' + round( command.y * scale ) + ' ';\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( command.x1 !== undefined && command.y1 !== undefined ) {\n\n\t\t\t\t\t\t\ttoken.o += round( command.x1 * scale ) + ' ' + round( command.y1 * scale ) + ' ';\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( command.x2 !== undefined && command.y2 !== undefined ) {\n\n\t\t\t\t\t\t\ttoken.o += round( command.x2 * scale ) + ' ' + round( command.y2 * scale ) + ' ';\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} );\n\n\t\t\t\t\tif ( Array.isArray( glyph.unicodes ) && glyph.unicodes.length > 0 ) {\n\n\t\t\t\t\t\tglyph.unicodes.forEach( function ( unicode ) {\n\n\t\t\t\t\t\t\tglyphs[ String.fromCodePoint( unicode ) ] = token;\n\n\t\t\t\t\t\t} );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tglyphs[ String.fromCodePoint( glyph.unicode ) ] = token;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tglyphs: glyphs,\n\t\t\t\tfamilyName: font.getEnglishName( 'fullName' ),\n\t\t\t\tascender: round( font.ascender * scale ),\n\t\t\t\tdescender: round( font.descender * scale ),\n\t\t\t\tunderlinePosition: font.tables.post.underlinePosition,\n\t\t\t\tunderlineThickness: font.tables.post.underlineThickness,\n\t\t\t\tboundingBox: {\n\t\t\t\t\txMin: font.tables.head.xMin,\n\t\t\t\t\txMax: font.tables.head.xMax,\n\t\t\t\t\tyMin: font.tables.head.yMin,\n\t\t\t\t\tyMax: font.tables.head.yMax\n\t\t\t\t},\n\t\t\t\tresolution: 1000,\n\t\t\t\toriginal_font_information: font.tables.name\n\t\t\t};\n\n\t\t}\n\n\t\tfunction reverseCommands( commands ) {\n\n\t\t\tconst paths = [];\n\t\t\tlet path;\n\n\t\t\tcommands.forEach( function ( c ) {\n\n\t\t\t\tif ( c.type.toLowerCase() === 'm' ) {\n\n\t\t\t\t\tpath = [ c ];\n\t\t\t\t\tpaths.push( path );\n\n\t\t\t\t} else if ( c.type.toLowerCase() !== 'z' ) {\n\n\t\t\t\t\tpath.push( c );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tconst reversed = [];\n\n\t\t\tpaths.forEach( function ( p ) {\n\n\t\t\t\tconst result = {\n\t\t\t\t\ttype: 'm',\n\t\t\t\t\tx: p[ p.length - 1 ].x,\n\t\t\t\t\ty: p[ p.length - 1 ].y\n\t\t\t\t};\n\n\t\t\t\treversed.push( result );\n\n\t\t\t\tfor ( let i = p.length - 1; i > 0; i -- ) {\n\n\t\t\t\t\tconst command = p[ i ];\n\t\t\t\t\tconst result = { type: command.type };\n\n\t\t\t\t\tif ( command.x2 !== undefined && command.y2 !== undefined ) {\n\n\t\t\t\t\t\tresult.x1 = command.x2;\n\t\t\t\t\t\tresult.y1 = command.y2;\n\t\t\t\t\t\tresult.x2 = command.x1;\n\t\t\t\t\t\tresult.y2 = command.y1;\n\n\t\t\t\t\t} else if ( command.x1 !== undefined && command.y1 !== undefined ) {\n\n\t\t\t\t\t\tresult.x1 = command.x1;\n\t\t\t\t\t\tresult.y1 = command.y1;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tresult.x = p[ i - 1 ].x;\n\t\t\t\t\tresult.y = p[ i - 1 ].y;\n\t\t\t\t\treversed.push( result );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\treturn reversed;\n\n\t\t}\n\n\t\treturn convert( opentype.parse( arraybuffer ), this.reversed );\n\n\t}\n\n}\n\nexport { TTFLoader };\n", "import {\n\tFileLoader,\n\tLoader\n} from 'three';\n\nimport * as fflate from '../libs/fflate.module.js';\nimport { USDAParser } from './usd/USDAParser.js';\nimport { USDCParser } from './usd/USDCParser.js';\n\n/**\n * A loader for the USDZ format.\n *\n * USDZ files that use USDC internally are not yet supported, only USDA.\n *\n * ```js\n * const loader = new USDZLoader();\n * const model = await loader.loadAsync( 'saeukkang.usdz' );\n * scene.add( model );\n * ```\n *\n * @augments Loader\n * @three_import import { USDLoader } from 'three/addons/loaders/USDLoader.js';\n */\nclass USDLoader extends Loader {\n\n\t/**\n\t * Constructs a new USDZ loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded USDZ asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Group)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( text ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given USDZ data and returns the resulting group.\n\t *\n\t * @param {ArrayBuffer|string} buffer - The raw USDZ data as an array buffer.\n\t * @return {Group} The parsed asset as a group.\n\t */\n\tparse( buffer ) {\n\n\t\tconst usda = new USDAParser();\n\t\tconst usdc = new USDCParser();\n\n\t\tfunction parseAssets( zip ) {\n\n\t\t\tconst data = {};\n\t\t\tconst loader = new FileLoader();\n\t\t\tloader.setResponseType( 'arraybuffer' );\n\n\t\t\tfor ( const filename in zip ) {\n\n\t\t\t\tif ( filename.endsWith( 'png' ) ) {\n\n\t\t\t\t\tconst blob = new Blob( [ zip[ filename ] ], { type: 'image/png' } );\n\t\t\t\t\tdata[ filename ] = URL.createObjectURL( blob );\n\n\t\t\t\t}\n\n\t\t\t\tif ( filename.endsWith( 'usd' ) || filename.endsWith( 'usda' ) || filename.endsWith( 'usdc' ) ) {\n\n\t\t\t\t\tif ( isCrateFile( zip[ filename ] ) ) {\n\n\t\t\t\t\t\tdata[ filename ] = usdc.parse( zip[ filename ].buffer, data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst text = fflate.strFromU8( zip[ filename ] );\n\t\t\t\t\t\tdata[ filename ] = usda.parseText( text );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn data;\n\n\t\t}\n\n\t\tfunction isCrateFile( buffer ) {\n\n\t\t\tconst crateHeader = new Uint8Array( [ 0x50, 0x58, 0x52, 0x2D, 0x55, 0x53, 0x44, 0x43 ] ); // PXR-USDC\n\n\t\t\tif ( buffer.byteLength < crateHeader.length ) return false;\n\n\t\t\tconst view = new Uint8Array( buffer, 0, crateHeader.length );\n\n\t\t\tfor ( let i = 0; i < crateHeader.length; i ++ ) {\n\n\t\t\t\tif ( view[ i ] !== crateHeader[ i ] ) return false;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tfunction findUSD( zip ) {\n\n\t\t\tif ( zip.length < 1 ) return undefined;\n\n\t\t\tconst firstFileName = Object.keys( zip )[ 0 ];\n\t\t\tlet isCrate = false;\n\n\t\t\t// As per the USD specification, the first entry in the zip archive is used as the main file (\"UsdStage\").\n\t\t\t// ASCII files can end in either .usda or .usd.\n\t\t\t// See https://openusd.org/release/spec_usdz.html#layout\n\t\t\tif ( firstFileName.endsWith( 'usda' ) ) return zip[ firstFileName ];\n\n\t\t\tif ( firstFileName.endsWith( 'usdc' ) ) {\n\n\t\t\t\tisCrate = true;\n\n\t\t\t} else if ( firstFileName.endsWith( 'usd' ) ) {\n\n\t\t\t\t// If this is not a crate file, we assume it is a plain USDA file.\n\t\t\t\tif ( ! isCrateFile( zip[ firstFileName ] ) ) {\n\n\t\t\t\t\treturn zip[ firstFileName ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tisCrate = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( isCrate ) {\n\n\t\t\t\treturn zip[ firstFileName ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// USDA\n\n\t\tif ( typeof buffer === 'string' ) {\n\n\t\t\treturn usda.parse( buffer, {} );\n\n\t\t}\n\n\t\t// USDC\n\n\t\tif ( isCrateFile( buffer ) ) {\n\n\t\t\treturn usdc.parse( buffer );\n\n\t\t}\n\n\t\t// USDZ\n\n\t\tconst zip = fflate.unzipSync( new Uint8Array( buffer ) );\n\n\t\tconst assets = parseAssets( zip );\n\n\t\t// console.log( assets );\n\n\t\tconst file = findUSD( zip );\n\n\t\tconst text = fflate.strFromU8( file );\n\n\t\treturn usda.parse( text, assets );\n\n\t}\n\n}\n\nexport { USDLoader };\n", "import {\n\tBufferGeometry,\n\tColor,\n\tData3DTexture,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tGroup,\n\tLoader,\n\tLinearFilter,\n\tMatrix4,\n\tMesh,\n\tMeshStandardMaterial,\n\tNearestFilter,\n\tRedFormat,\n\tSRGBColorSpace\n} from 'three';\n\n// Helper function to read a STRING from the data view\nfunction readString( data, offset ) {\n\n\tconst size = data.getUint32( offset, true );\n\toffset += 4;\n\n\tlet str = '';\n\tfor ( let i = 0; i < size; i ++ ) {\n\n\t\tstr += String.fromCharCode( data.getUint8( offset ++ ) );\n\n\t}\n\n\treturn { value: str, size: 4 + size };\n\n}\n\n// Helper function to read a DICT from the data view\nfunction readDict( data, offset ) {\n\n\tconst dict = {};\n\tconst count = data.getUint32( offset, true );\n\toffset += 4;\n\n\tlet totalSize = 4;\n\n\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\tconst key = readString( data, offset );\n\t\toffset += key.size;\n\t\ttotalSize += key.size;\n\n\t\tconst value = readString( data, offset );\n\t\toffset += value.size;\n\t\ttotalSize += value.size;\n\n\t\tdict[ key.value ] = value.value;\n\n\t}\n\n\treturn { value: dict, size: totalSize };\n\n}\n\n// Helper function to decode ROTATION byte into a rotation matrix\nfunction decodeRotation( byte ) {\n\n\t// The rotation is stored as a row-major 3x3 matrix encoded in a single byte\n\t// Bits 0-1: index of the non-zero entry in the first row\n\t// Bits 2-3: index of the non-zero entry in the second row\n\t// Bit 4: sign of the first row entry (0 = positive, 1 = negative)\n\t// Bit 5: sign of the second row entry\n\t// Bit 6: sign of the third row entry\n\t// The third row index is determined by the remaining column\n\n\tconst index1 = byte & 0x3;\n\tconst index2 = ( byte >> 2 ) & 0x3;\n\tconst sign1 = ( byte >> 4 ) & 0x1 ? - 1 : 1;\n\tconst sign2 = ( byte >> 5 ) & 0x1 ? - 1 : 1;\n\tconst sign3 = ( byte >> 6 ) & 0x1 ? - 1 : 1;\n\n\t// Find the third row index (the one not used by row 0 or row 1)\n\tconst index3 = 3 - index1 - index2;\n\n\t// Build the VOX rotation matrix (row-major 3x3)\n\t// r[row][col] - each row has one non-zero entry\n\tconst r = [\n\t\t[ 0, 0, 0 ],\n\t\t[ 0, 0, 0 ],\n\t\t[ 0, 0, 0 ]\n\t];\n\n\tr[ 0 ][ index1 ] = sign1;\n\tr[ 1 ][ index2 ] = sign2;\n\tr[ 2 ][ index3 ] = sign3;\n\n\t// Convert from VOX coordinate system (Z-up) to Three.js (Y-up)\n\t// VOX: X-right, Y-forward, Z-up\n\t// Three.js: X-right, Y-up, Z-backward\n\t// Transformation: x' = x, y' = z, z' = -y\n\t//\n\t// To convert rotation matrix R_vox to R_three:\n\t// R_three = C * R_vox * C^-1\n\t// where C converts VOX coords to Three.js coords\n\n\t// Apply coordinate change: swap Y and Z, negate new Z\n\t// This is equivalent to: C * R * C^-1\n\tconst m = new Matrix4();\n\tm.set(\n\t\tr[ 0 ][ 0 ], r[ 0 ][ 2 ], - r[ 0 ][ 1 ], 0,\n\t\tr[ 2 ][ 0 ], r[ 2 ][ 2 ], - r[ 2 ][ 1 ], 0,\n\t\t- r[ 1 ][ 0 ], - r[ 1 ][ 2 ], r[ 1 ][ 1 ], 0,\n\t\t0, 0, 0, 1\n\t);\n\n\treturn m;\n\n}\n\n// Apply VOX transform to a Three.js object\nfunction applyTransform( object, node ) {\n\n\tif ( node.attributes._name ) {\n\n\t\tobject.name = node.attributes._name;\n\n\t}\n\n\tif ( node.frames.length > 0 ) {\n\n\t\tconst frame = node.frames[ 0 ];\n\n\t\tif ( frame.rotation ) {\n\n\t\t\tobject.applyMatrix4( frame.rotation );\n\n\t\t}\n\n\t\tif ( frame.translation ) {\n\n\t\t\t// VOX uses Z-up, Three.js uses Y-up\n\t\t\tobject.position.set(\n\t\t\t\tframe.translation.x,\n\t\t\t\tframe.translation.z,\n\t\t\t\t- frame.translation.y\n\t\t\t);\n\n\t\t}\n\n\t}\n\n}\n\n// Recursively build Three.js object graph from VOX nodes\nfunction buildObject( nodeId, nodes, chunks ) {\n\n\tconst node = nodes[ nodeId ];\n\n\tif ( node.type === 'transform' ) {\n\n\t\tconst childNode = nodes[ node.childNodeId ];\n\n\t\t// Check if this transform has actual transformation data\n\t\tconst frame = node.frames[ 0 ];\n\t\tconst hasTransform = frame && ( frame.rotation || frame.translation );\n\n\t\t// Flatten: if child is a single-model shape, apply transform directly to mesh\n\t\tif ( childNode.type === 'shape' && childNode.models.length === 1 ) {\n\n\t\t\tconst chunk = chunks[ childNode.models[ 0 ].modelId ];\n\t\t\tconst mesh = buildMesh( chunk );\n\t\t\tapplyTransform( mesh, node );\n\t\t\treturn mesh;\n\n\t\t}\n\n\t\t// If no transform, just return the child directly (avoid unnecessary group)\n\t\tif ( ! hasTransform ) {\n\n\t\t\tconst child = buildObject( node.childNodeId, nodes, chunks );\n\t\t\tif ( child && node.attributes._name ) child.name = node.attributes._name;\n\t\t\treturn child;\n\n\t\t}\n\n\t\t// Otherwise create a group\n\t\tconst group = new Group();\n\t\tapplyTransform( group, node );\n\n\t\tconst child = buildObject( node.childNodeId, nodes, chunks );\n\t\tif ( child ) group.add( child );\n\n\t\treturn group;\n\n\t} else if ( node.type === 'group' ) {\n\n\t\tconst group = new Group();\n\n\t\tfor ( const childId of node.childIds ) {\n\n\t\t\tconst child = buildObject( childId, nodes, chunks );\n\t\t\tif ( child ) group.add( child );\n\n\t\t}\n\n\t\treturn group;\n\n\t} else if ( node.type === 'shape' ) {\n\n\t\t// Shape reached directly (shouldn't happen in well-formed files, but handle it)\n\t\tif ( node.models.length === 1 ) {\n\n\t\t\tconst chunk = chunks[ node.models[ 0 ].modelId ];\n\t\t\treturn buildMesh( chunk );\n\n\t\t}\n\n\t\tconst group = new Group();\n\n\t\tfor ( const model of node.models ) {\n\n\t\t\tconst chunk = chunks[ model.modelId ];\n\t\t\tgroup.add( buildMesh( chunk ) );\n\n\t\t}\n\n\t\treturn group;\n\n\t}\n\n\treturn null;\n\n}\n\n/**\n * A loader for the VOX format.\n *\n * ```js\n * const loader = new VOXLoader();\n * const result = await loader.loadAsync( 'models/vox/monu10.vox' );\n *\n * scene.add( result.scene.children[ 0 ] );\n * ```\n * @augments Loader\n * @three_import import { VOXLoader } from 'three/addons/loaders/VOXLoader.js';\n */\nclass VOXLoader extends Loader {\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded VOX asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Object)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.load( url, function ( buffer ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( buffer ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given VOX data and returns the result object.\n\t *\n\t * @param {ArrayBuffer} buffer - The raw VOX data as an array buffer.\n\t * @return {Object} The parsed VOX data with properties: chunks, scene.\n\t */\n\tparse( buffer ) {\n\n\t\tconst data = new DataView( buffer );\n\n\t\tconst id = data.getUint32( 0, true );\n\t\tconst version = data.getUint32( 4, true );\n\n\t\tif ( id !== 542658390 ) {\n\n\t\t\tconsole.error( 'THREE.VOXLoader: Invalid VOX file.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( version !== 150 && version !== 200 ) {\n\n\t\t\tconsole.error( 'THREE.VOXLoader: Invalid VOX file. Unsupported version:', version );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst DEFAULT_PALETTE = [\n\t\t\t0x00000000, 0xffffffff, 0xffccffff, 0xff99ffff, 0xff66ffff, 0xff33ffff, 0xff00ffff, 0xffffccff,\n\t\t\t0xffccccff, 0xff99ccff, 0xff66ccff, 0xff33ccff, 0xff00ccff, 0xffff99ff, 0xffcc99ff, 0xff9999ff,\n\t\t\t0xff6699ff, 0xff3399ff, 0xff0099ff, 0xffff66ff, 0xffcc66ff, 0xff9966ff, 0xff6666ff, 0xff3366ff,\n\t\t\t0xff0066ff, 0xffff33ff, 0xffcc33ff, 0xff9933ff, 0xff6633ff, 0xff3333ff, 0xff0033ff, 0xffff00ff,\n\t\t\t0xffcc00ff, 0xff9900ff, 0xff6600ff, 0xff3300ff, 0xff0000ff, 0xffffffcc, 0xffccffcc, 0xff99ffcc,\n\t\t\t0xff66ffcc, 0xff33ffcc, 0xff00ffcc, 0xffffcccc, 0xffcccccc, 0xff99cccc, 0xff66cccc, 0xff33cccc,\n\t\t\t0xff00cccc, 0xffff99cc, 0xffcc99cc, 0xff9999cc, 0xff6699cc, 0xff3399cc, 0xff0099cc, 0xffff66cc,\n\t\t\t0xffcc66cc, 0xff9966cc, 0xff6666cc, 0xff3366cc, 0xff0066cc, 0xffff33cc, 0xffcc33cc, 0xff9933cc,\n\t\t\t0xff6633cc, 0xff3333cc, 0xff0033cc, 0xffff00cc, 0xffcc00cc, 0xff9900cc, 0xff6600cc, 0xff3300cc,\n\t\t\t0xff0000cc, 0xffffff99, 0xffccff99, 0xff99ff99, 0xff66ff99, 0xff33ff99, 0xff00ff99, 0xffffcc99,\n\t\t\t0xffcccc99, 0xff99cc99, 0xff66cc99, 0xff33cc99, 0xff00cc99, 0xffff9999, 0xffcc9999, 0xff999999,\n\t\t\t0xff669999, 0xff339999, 0xff009999, 0xffff6699, 0xffcc6699, 0xff996699, 0xff666699, 0xff336699,\n\t\t\t0xff006699, 0xffff3399, 0xffcc3399, 0xff993399, 0xff663399, 0xff333399, 0xff003399, 0xffff0099,\n\t\t\t0xffcc0099, 0xff990099, 0xff660099, 0xff330099, 0xff000099, 0xffffff66, 0xffccff66, 0xff99ff66,\n\t\t\t0xff66ff66, 0xff33ff66, 0xff00ff66, 0xffffcc66, 0xffcccc66, 0xff99cc66, 0xff66cc66, 0xff33cc66,\n\t\t\t0xff00cc66, 0xffff9966, 0xffcc9966, 0xff999966, 0xff669966, 0xff339966, 0xff009966, 0xffff6666,\n\t\t\t0xffcc6666, 0xff996666, 0xff666666, 0xff336666, 0xff006666, 0xffff3366, 0xffcc3366, 0xff993366,\n\t\t\t0xff663366, 0xff333366, 0xff003366, 0xffff0066, 0xffcc0066, 0xff990066, 0xff660066, 0xff330066,\n\t\t\t0xff000066, 0xffffff33, 0xffccff33, 0xff99ff33, 0xff66ff33, 0xff33ff33, 0xff00ff33, 0xffffcc33,\n\t\t\t0xffcccc33, 0xff99cc33, 0xff66cc33, 0xff33cc33, 0xff00cc33, 0xffff9933, 0xffcc9933, 0xff999933,\n\t\t\t0xff669933, 0xff339933, 0xff009933, 0xffff6633, 0xffcc6633, 0xff996633, 0xff666633, 0xff336633,\n\t\t\t0xff006633, 0xffff3333, 0xffcc3333, 0xff993333, 0xff663333, 0xff333333, 0xff003333, 0xffff0033,\n\t\t\t0xffcc0033, 0xff990033, 0xff660033, 0xff330033, 0xff000033, 0xffffff00, 0xffccff00, 0xff99ff00,\n\t\t\t0xff66ff00, 0xff33ff00, 0xff00ff00, 0xffffcc00, 0xffcccc00, 0xff99cc00, 0xff66cc00, 0xff33cc00,\n\t\t\t0xff00cc00, 0xffff9900, 0xffcc9900, 0xff999900, 0xff669900, 0xff339900, 0xff009900, 0xffff6600,\n\t\t\t0xffcc6600, 0xff996600, 0xff666600, 0xff336600, 0xff006600, 0xffff3300, 0xffcc3300, 0xff993300,\n\t\t\t0xff663300, 0xff333300, 0xff003300, 0xffff0000, 0xffcc0000, 0xff990000, 0xff660000, 0xff330000,\n\t\t\t0xff0000ee, 0xff0000dd, 0xff0000bb, 0xff0000aa, 0xff000088, 0xff000077, 0xff000055, 0xff000044,\n\t\t\t0xff000022, 0xff000011, 0xff00ee00, 0xff00dd00, 0xff00bb00, 0xff00aa00, 0xff008800, 0xff007700,\n\t\t\t0xff005500, 0xff004400, 0xff002200, 0xff001100, 0xffee0000, 0xffdd0000, 0xffbb0000, 0xffaa0000,\n\t\t\t0xff880000, 0xff770000, 0xff550000, 0xff440000, 0xff220000, 0xff110000, 0xffeeeeee, 0xffdddddd,\n\t\t\t0xffbbbbbb, 0xffaaaaaa, 0xff888888, 0xff777777, 0xff555555, 0xff444444, 0xff222222, 0xff111111\n\t\t];\n\n\t\tlet i = 8;\n\n\t\tlet chunk;\n\t\tconst chunks = [];\n\n\t\t// Extension data\n\t\tconst nodes = {};\n\t\tlet palette = DEFAULT_PALETTE;\n\n\t\twhile ( i < data.byteLength ) {\n\n\t\t\tlet id = '';\n\n\t\t\tfor ( let j = 0; j < 4; j ++ ) {\n\n\t\t\t\tid += String.fromCharCode( data.getUint8( i ++ ) );\n\n\t\t\t}\n\n\t\t\tconst chunkSize = data.getUint32( i, true ); i += 4;\n\t\t\ti += 4; // childChunks\n\n\t\t\tif ( id === 'SIZE' ) {\n\n\t\t\t\tconst x = data.getUint32( i, true ); i += 4;\n\t\t\t\tconst y = data.getUint32( i, true ); i += 4;\n\t\t\t\tconst z = data.getUint32( i, true ); i += 4;\n\n\t\t\t\tchunk = {\n\t\t\t\t\tpalette: DEFAULT_PALETTE,\n\t\t\t\t\tsize: { x: x, y: y, z: z },\n\t\t\t\t};\n\n\t\t\t\tchunks.push( chunk );\n\n\t\t\t\ti += chunkSize - ( 3 * 4 );\n\n\t\t\t} else if ( id === 'XYZI' ) {\n\n\t\t\t\tconst numVoxels = data.getUint32( i, true ); i += 4;\n\t\t\t\tchunk.data = new Uint8Array( buffer, i, numVoxels * 4 );\n\n\t\t\t\ti += numVoxels * 4;\n\n\t\t\t} else if ( id === 'RGBA' ) {\n\n\t\t\t\tpalette = [ 0 ];\n\n\t\t\t\tfor ( let j = 0; j < 256; j ++ ) {\n\n\t\t\t\t\tpalette[ j + 1 ] = data.getUint32( i, true ); i += 4;\n\n\t\t\t\t}\n\n\t\t\t\tchunk.palette = palette;\n\n\t\t\t} else if ( id === 'nTRN' ) {\n\n\t\t\t\t// Transform Node\n\t\t\t\tconst nodeId = data.getUint32( i, true ); i += 4;\n\t\t\t\tconst attributes = readDict( data, i );\n\t\t\t\ti += attributes.size;\n\n\t\t\t\tconst childNodeId = data.getUint32( i, true ); i += 4;\n\t\t\t\ti += 4; // reserved (-1)\n\t\t\t\tconst layerId = data.getInt32( i, true ); i += 4;\n\t\t\t\tconst numFrames = data.getUint32( i, true ); i += 4;\n\n\t\t\t\tconst frames = [];\n\n\t\t\t\tfor ( let f = 0; f < numFrames; f ++ ) {\n\n\t\t\t\t\tconst frameDict = readDict( data, i );\n\t\t\t\t\ti += frameDict.size;\n\n\t\t\t\t\tconst frame = { rotation: null, translation: null };\n\n\t\t\t\t\tif ( frameDict.value._r !== undefined ) {\n\n\t\t\t\t\t\tframe.rotation = decodeRotation( parseInt( frameDict.value._r ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( frameDict.value._t !== undefined ) {\n\n\t\t\t\t\t\tconst parts = frameDict.value._t.split( ' ' ).map( Number );\n\t\t\t\t\t\tframe.translation = { x: parts[ 0 ], y: parts[ 1 ], z: parts[ 2 ] };\n\n\t\t\t\t\t}\n\n\t\t\t\t\tframes.push( frame );\n\n\t\t\t\t}\n\n\t\t\t\tnodes[ nodeId ] = {\n\t\t\t\t\ttype: 'transform',\n\t\t\t\t\tid: nodeId,\n\t\t\t\t\tattributes: attributes.value,\n\t\t\t\t\tchildNodeId: childNodeId,\n\t\t\t\t\tlayerId: layerId,\n\t\t\t\t\tframes: frames\n\t\t\t\t};\n\n\t\t\t} else if ( id === 'nGRP' ) {\n\n\t\t\t\t// Group Node\n\t\t\t\tconst nodeId = data.getUint32( i, true ); i += 4;\n\t\t\t\tconst attributes = readDict( data, i );\n\t\t\t\ti += attributes.size;\n\n\t\t\t\tconst numChildren = data.getUint32( i, true ); i += 4;\n\t\t\t\tconst childIds = [];\n\n\t\t\t\tfor ( let c = 0; c < numChildren; c ++ ) {\n\n\t\t\t\t\tchildIds.push( data.getUint32( i, true ) ); i += 4;\n\n\t\t\t\t}\n\n\t\t\t\tnodes[ nodeId ] = {\n\t\t\t\t\ttype: 'group',\n\t\t\t\t\tid: nodeId,\n\t\t\t\t\tattributes: attributes.value,\n\t\t\t\t\tchildIds: childIds\n\t\t\t\t};\n\n\t\t\t} else if ( id === 'nSHP' ) {\n\n\t\t\t\t// Shape Node\n\t\t\t\tconst nodeId = data.getUint32( i, true ); i += 4;\n\t\t\t\tconst attributes = readDict( data, i );\n\t\t\t\ti += attributes.size;\n\n\t\t\t\tconst numModels = data.getUint32( i, true ); i += 4;\n\t\t\t\tconst models = [];\n\n\t\t\t\tfor ( let m = 0; m < numModels; m ++ ) {\n\n\t\t\t\t\tconst modelId = data.getUint32( i, true ); i += 4;\n\t\t\t\t\tconst modelAttributes = readDict( data, i );\n\t\t\t\t\ti += modelAttributes.size;\n\n\t\t\t\t\tmodels.push( {\n\t\t\t\t\t\tmodelId: modelId,\n\t\t\t\t\t\tattributes: modelAttributes.value\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t\tnodes[ nodeId ] = {\n\t\t\t\t\ttype: 'shape',\n\t\t\t\t\tid: nodeId,\n\t\t\t\t\tattributes: attributes.value,\n\t\t\t\t\tmodels: models\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\t// Skip unknown chunks\n\t\t\t\ti += chunkSize;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Apply palette to all chunks\n\t\tfor ( let c = 0; c < chunks.length; c ++ ) {\n\n\t\t\tchunks[ c ].palette = palette;\n\n\t\t}\n\n\t\t// Build Three.js scene graph from nodes\n\t\tlet scene = null;\n\n\t\tif ( Object.keys( nodes ).length > 0 ) {\n\n\t\t\tscene = buildObject( 0, nodes, chunks );\n\n\t\t}\n\n\t\t// Build result object\n\t\tconst result = {\n\t\t\tchunks: chunks,\n\t\t\tscene: scene\n\t\t};\n\n\t\t// @deprecated, r182\n\t\t// Proxy for backwards compatibility with array-like access\n\t\tlet warned = false;\n\n\t\treturn new Proxy( result, {\n\n\t\t\tget( target, prop ) {\n\n\t\t\t\t// Handle numeric indices\n\t\t\t\tif ( typeof prop === 'string' && /^\\d+$/.test( prop ) ) {\n\n\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.VOXLoader: Accessing result as an array is deprecated. Use result.chunks[] instead.' );\n\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn target.chunks[ parseInt( prop ) ];\n\n\t\t\t\t}\n\n\t\t\t\t// Handle array properties/methods\n\t\t\t\tif ( prop === 'length' ) {\n\n\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.VOXLoader: Accessing result as an array is deprecated. Use result.chunks instead.' );\n\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn target.chunks.length;\n\n\t\t\t\t}\n\n\t\t\t\t// Handle iteration\n\t\t\t\tif ( prop === Symbol.iterator ) {\n\n\t\t\t\t\tif ( ! warned ) {\n\n\t\t\t\t\t\tconsole.warn( 'THREE.VOXLoader: Iterating result as an array is deprecated. Use result.chunks instead.' );\n\t\t\t\t\t\twarned = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn target.chunks[ Symbol.iterator ].bind( target.chunks );\n\n\t\t\t\t}\n\n\t\t\t\treturn target[ prop ];\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * Builds a mesh from a VOX chunk.\n *\n * @param {Object} chunk - A VOX chunk loaded via {@link VOXLoader}.\n * @return {Mesh} The generated mesh.\n */\nfunction buildMesh( chunk ) {\n\n\tconst data = chunk.data;\n\tconst size = chunk.size;\n\tconst palette = chunk.palette;\n\n\tconst sx = size.x;\n\tconst sy = size.y;\n\tconst sz = size.z;\n\n\t// Build volume with color indices\n\n\tconst volume = new Uint8Array( sx * sy * sz );\n\n\tfor ( let j = 0; j < data.length; j += 4 ) {\n\n\t\tconst x = data[ j + 0 ];\n\t\tconst y = data[ j + 1 ];\n\t\tconst z = data[ j + 2 ];\n\t\tconst c = data[ j + 3 ];\n\n\t\tvolume[ x + y * sx + z * sx * sy ] = c;\n\n\t}\n\n\t// Greedy meshing\n\n\tconst vertices = [];\n\tconst indices = [];\n\tconst colors = [];\n\n\tconst _color = new Color();\n\tlet hasColors = false;\n\n\t// Process each of the 6 face directions\n\t// dims: the 3 axis sizes, d: which axis is normal to the face\n\tconst dims = [ sx, sy, sz ];\n\n\tfor ( let d = 0; d < 3; d ++ ) {\n\n\t\tconst u = ( d + 1 ) % 3;\n\t\tconst v = ( d + 2 ) % 3;\n\n\t\tconst dimsD = dims[ d ];\n\t\tconst dimsU = dims[ u ];\n\t\tconst dimsV = dims[ v ];\n\n\t\tconst q = [ 0, 0, 0 ];\n\t\tconst mask = new Int16Array( dimsU * dimsV );\n\n\t\tq[ d ] = 1;\n\n\t\t// Sweep through slices\n\t\tfor ( let slice = 0; slice <= dimsD; slice ++ ) {\n\n\t\t\t// Build mask for this slice\n\t\t\tlet n = 0;\n\n\t\t\tfor ( let vv = 0; vv < dimsV; vv ++ ) {\n\n\t\t\t\tfor ( let uu = 0; uu < dimsU; uu ++ ) {\n\n\t\t\t\t\tconst pos = [ 0, 0, 0 ];\n\t\t\t\t\tpos[ d ] = slice;\n\t\t\t\t\tpos[ u ] = uu;\n\t\t\t\t\tpos[ v ] = vv;\n\n\t\t\t\t\tconst x0 = pos[ 0 ], y0 = pos[ 1 ], z0 = pos[ 2 ];\n\n\t\t\t\t\t// Get voxel behind and in front of this face\n\t\t\t\t\tconst behind = ( slice > 0 ) ? volume[ ( x0 - q[ 0 ] ) + ( y0 - q[ 1 ] ) * sx + ( z0 - q[ 2 ] ) * sx * sy ] : 0;\n\t\t\t\t\tconst infront = ( slice < dimsD ) ? volume[ x0 + y0 * sx + z0 * sx * sy ] : 0;\n\n\t\t\t\t\t// Face exists if exactly one side is solid\n\t\t\t\t\tif ( behind > 0 && infront === 0 ) {\n\n\t\t\t\t\t\tmask[ n ] = behind; // positive face\n\n\t\t\t\t\t} else if ( infront > 0 && behind === 0 ) {\n\n\t\t\t\t\t\tmask[ n ] = - infront; // negative face\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tmask[ n ] = 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tn ++;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Greedy merge mask into quads\n\t\t\tn = 0;\n\n\t\t\tfor ( let vv = 0; vv < dimsV; vv ++ ) {\n\n\t\t\t\tfor ( let uu = 0; uu < dimsU; ) {\n\n\t\t\t\t\tconst c = mask[ n ];\n\n\t\t\t\t\tif ( c !== 0 ) {\n\n\t\t\t\t\t\t// Find width\n\t\t\t\t\t\tlet w = 1;\n\n\t\t\t\t\t\twhile ( uu + w < dimsU && mask[ n + w ] === c ) {\n\n\t\t\t\t\t\t\tw ++;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Find height\n\t\t\t\t\t\tlet h = 1;\n\t\t\t\t\t\tlet done = false;\n\n\t\t\t\t\t\twhile ( vv + h < dimsV && ! done ) {\n\n\t\t\t\t\t\t\tfor ( let k = 0; k < w; k ++ ) {\n\n\t\t\t\t\t\t\t\tif ( mask[ n + k + h * dimsU ] !== c ) {\n\n\t\t\t\t\t\t\t\t\tdone = true;\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( ! done ) h ++;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Add quad\n\t\t\t\t\t\tconst pos = [ 0, 0, 0 ];\n\t\t\t\t\t\tpos[ d ] = slice;\n\t\t\t\t\t\tpos[ u ] = uu;\n\t\t\t\t\t\tpos[ v ] = vv;\n\n\t\t\t\t\t\tconst du = [ 0, 0, 0 ];\n\t\t\t\t\t\tconst dv = [ 0, 0, 0 ];\n\t\t\t\t\t\tdu[ u ] = w;\n\t\t\t\t\t\tdv[ v ] = h;\n\n\t\t\t\t\t\t// Get color\n\t\t\t\t\t\tconst colorIndex = Math.abs( c );\n\t\t\t\t\t\tconst hex = palette[ colorIndex ];\n\t\t\t\t\t\tconst r = ( hex >> 0 & 0xff ) / 0xff;\n\t\t\t\t\t\tconst g = ( hex >> 8 & 0xff ) / 0xff;\n\t\t\t\t\t\tconst b = ( hex >> 16 & 0xff ) / 0xff;\n\n\t\t\t\t\t\tif ( r > 0 || g > 0 || b > 0 ) hasColors = true;\n\n\t\t\t\t\t\t_color.setRGB( r, g, b, SRGBColorSpace );\n\n\t\t\t\t\t\t// Convert VOX coords to Three.js coords (Y-up)\n\t\t\t\t\t\t// VOX: X right, Y forward, Z up -> Three.js: X right, Y up, Z back\n\t\t\t\t\t\tconst toThree = ( p ) => [\n\t\t\t\t\t\t\tp[ 0 ] - sx / 2,\n\t\t\t\t\t\t\tp[ 2 ] - sz / 2,\n\t\t\t\t\t\t\t- p[ 1 ] + sy / 2\n\t\t\t\t\t\t];\n\n\t\t\t\t\t\tconst v0 = toThree( pos );\n\t\t\t\t\t\tconst v1 = toThree( [ pos[ 0 ] + du[ 0 ], pos[ 1 ] + du[ 1 ], pos[ 2 ] + du[ 2 ] ] );\n\t\t\t\t\t\tconst v2 = toThree( [ pos[ 0 ] + du[ 0 ] + dv[ 0 ], pos[ 1 ] + du[ 1 ] + dv[ 1 ], pos[ 2 ] + du[ 2 ] + dv[ 2 ] ] );\n\t\t\t\t\t\tconst v3 = toThree( [ pos[ 0 ] + dv[ 0 ], pos[ 1 ] + dv[ 1 ], pos[ 2 ] + dv[ 2 ] ] );\n\n\t\t\t\t\t\tconst idx = vertices.length / 3;\n\n\t\t\t\t\t\t// Winding order depends on face direction\n\t\t\t\t\t\tif ( c > 0 ) {\n\n\t\t\t\t\t\t\tvertices.push( ...v0, ...v1, ...v2, ...v3 );\n\t\t\t\t\t\t\tindices.push( idx, idx + 1, idx + 2, idx, idx + 2, idx + 3 );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvertices.push( ...v0, ...v3, ...v2, ...v1 );\n\t\t\t\t\t\t\tindices.push( idx, idx + 1, idx + 2, idx, idx + 2, idx + 3 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcolors.push(\n\t\t\t\t\t\t\t_color.r, _color.g, _color.b,\n\t\t\t\t\t\t\t_color.r, _color.g, _color.b,\n\t\t\t\t\t\t\t_color.r, _color.g, _color.b,\n\t\t\t\t\t\t\t_color.r, _color.g, _color.b\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// Clear mask\n\t\t\t\t\t\tfor ( let hh = 0; hh < h; hh ++ ) {\n\n\t\t\t\t\t\t\tfor ( let ww = 0; ww < w; ww ++ ) {\n\n\t\t\t\t\t\t\t\tmask[ n + ww + hh * dimsU ] = 0;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tuu += w;\n\t\t\t\t\t\tn += w;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuu ++;\n\t\t\t\t\t\tn ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tconst geometry = new BufferGeometry();\n\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\tgeometry.setIndex( indices );\n\tgeometry.computeVertexNormals();\n\n\tconst material = new MeshStandardMaterial();\n\n\tif ( hasColors ) {\n\n\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\t\tmaterial.vertexColors = true;\n\n\t}\n\n\treturn new Mesh( geometry, material );\n\n}\n\n/**\n * Builds a 3D texture from a VOX chunk.\n *\n * @param {Object} chunk - A VOX chunk loaded via {@link VOXLoader}.\n * @return {Data3DTexture} The generated 3D texture.\n */\nfunction buildData3DTexture( chunk ) {\n\n\tconst data = chunk.data;\n\tconst size = chunk.size;\n\n\tconst offsety = size.x;\n\tconst offsetz = size.x * size.y;\n\n\tconst array = new Uint8Array( size.x * size.y * size.z );\n\n\tfor ( let j = 0; j < data.length; j += 4 ) {\n\n\t\tconst x = data[ j + 0 ];\n\t\tconst y = data[ j + 1 ];\n\t\tconst z = data[ j + 2 ];\n\n\t\tconst index = x + ( y * offsety ) + ( z * offsetz );\n\n\t\tarray[ index ] = 255;\n\n\t}\n\n\tconst texture = new Data3DTexture( array, size.x, size.y, size.z );\n\n\ttexture.format = RedFormat;\n\ttexture.minFilter = NearestFilter;\n\ttexture.magFilter = LinearFilter;\n\ttexture.unpackAlignment = 1;\n\ttexture.needsUpdate = true;\n\n\treturn texture;\n\n}\n\n// @deprecated, r182\n\nclass VOXMesh extends Mesh {\n\n\tconstructor( chunk ) {\n\n\t\tconsole.warn( 'VOXMesh has been deprecated. Use buildMesh() instead.' );\n\n\t\tconst mesh = buildMesh( chunk );\n\n\t\tsuper( mesh.geometry, mesh.material );\n\n\t}\n\n}\n\nclass VOXData3DTexture extends Data3DTexture {\n\n\tconstructor( chunk ) {\n\n\t\tconsole.warn( 'VOXData3DTexture has been deprecated. Use buildData3DTexture() instead.' );\n\n\t\tconst texture = buildData3DTexture( chunk );\n\n\t\tsuper( texture.image.data, texture.image.width, texture.image.height, texture.image.depth );\n\n\t\tthis.format = texture.format;\n\t\tthis.minFilter = texture.minFilter;\n\t\tthis.magFilter = texture.magFilter;\n\t\tthis.unpackAlignment = texture.unpackAlignment;\n\t\tthis.needsUpdate = true;\n\n\t}\n\n}\n\nexport { VOXLoader, buildMesh, buildData3DTexture, VOXMesh, VOXData3DTexture };\n", "/*! chevrotain - v9.0.1 */\nvar R=(t,e)=>()=>(e||(e={exports:{}},t(e.exports,e)),e.exports);var Er=R(Pt=>{\"use strict\";Object.defineProperty(Pt,\"__esModule\",{value:!0});Pt.VERSION=void 0;Pt.VERSION=\"9.0.1\"});var k=R((exports,module)=>{\"use strict\";var __spreadArray=exports&&exports.__spreadArray||function(t,e){for(var r=0,n=e.length,i=t.length;r<n;r++,i++)t[i]=e[r];return t};Object.defineProperty(exports,\"__esModule\",{value:!0});exports.toFastProperties=exports.timer=exports.peek=exports.isES2015MapSupported=exports.PRINT_WARNING=exports.PRINT_ERROR=exports.packArray=exports.IDENTITY=exports.NOOP=exports.merge=exports.groupBy=exports.defaults=exports.assignNoOverwrite=exports.assign=exports.zipObject=exports.sortBy=exports.indexOf=exports.some=exports.difference=exports.every=exports.isObject=exports.isRegExp=exports.isArray=exports.partial=exports.uniq=exports.compact=exports.reduce=exports.findAll=exports.find=exports.cloneObj=exports.cloneArr=exports.contains=exports.has=exports.pick=exports.reject=exports.filter=exports.dropRight=exports.drop=exports.isFunction=exports.isUndefined=exports.isString=exports.forEach=exports.last=exports.first=exports.flatten=exports.map=exports.mapValues=exports.values=exports.keys=exports.isEmpty=void 0;function isEmpty(t){return t&&t.length===0}exports.isEmpty=isEmpty;function keys(t){return t==null?[]:Object.keys(t)}exports.keys=keys;function values(t){for(var e=[],r=Object.keys(t),n=0;n<r.length;n++)e.push(t[r[n]]);return e}exports.values=values;function mapValues(t,e){for(var r=[],n=keys(t),i=0;i<n.length;i++){var a=n[i];r.push(e.call(null,t[a],a))}return r}exports.mapValues=mapValues;function map(t,e){for(var r=[],n=0;n<t.length;n++)r.push(e.call(null,t[n],n));return r}exports.map=map;function flatten(t){for(var e=[],r=0;r<t.length;r++){var n=t[r];Array.isArray(n)?e=e.concat(flatten(n)):e.push(n)}return e}exports.flatten=flatten;function first(t){return isEmpty(t)?void 0:t[0]}exports.first=first;function last(t){var e=t&&t.length;return e?t[e-1]:void 0}exports.last=last;function forEach(t,e){if(Array.isArray(t))for(var r=0;r<t.length;r++)e.call(null,t[r],r);else if(isObject(t))for(var n=keys(t),r=0;r<n.length;r++){var i=n[r],a=t[i];e.call(null,a,i)}else throw Error(\"non exhaustive match\")}exports.forEach=forEach;function isString(t){return typeof t==\"string\"}exports.isString=isString;function isUndefined(t){return t===void 0}exports.isUndefined=isUndefined;function isFunction(t){return t instanceof Function}exports.isFunction=isFunction;function drop(t,e){return e===void 0&&(e=1),t.slice(e,t.length)}exports.drop=drop;function dropRight(t,e){return e===void 0&&(e=1),t.slice(0,t.length-e)}exports.dropRight=dropRight;function filter(t,e){var r=[];if(Array.isArray(t))for(var n=0;n<t.length;n++){var i=t[n];e.call(null,i)&&r.push(i)}return r}exports.filter=filter;function reject(t,e){return filter(t,function(r){return!e(r)})}exports.reject=reject;function pick(t,e){for(var r=Object.keys(t),n={},i=0;i<r.length;i++){var a=r[i],o=t[a];e(o)&&(n[a]=o)}return n}exports.pick=pick;function has(t,e){return isObject(t)?t.hasOwnProperty(e):!1}exports.has=has;function contains(t,e){return find(t,function(r){return r===e})!==void 0}exports.contains=contains;function cloneArr(t){for(var e=[],r=0;r<t.length;r++)e.push(t[r]);return e}exports.cloneArr=cloneArr;function cloneObj(t){var e={};for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r]);return e}exports.cloneObj=cloneObj;function find(t,e){for(var r=0;r<t.length;r++){var n=t[r];if(e.call(null,n))return n}}exports.find=find;function findAll(t,e){for(var r=[],n=0;n<t.length;n++){var i=t[n];e.call(null,i)&&r.push(i)}return r}exports.findAll=findAll;function reduce(t,e,r){for(var n=Array.isArray(t),i=n?t:values(t),a=n?[]:keys(t),o=r,s=0;s<i.length;s++)o=e.call(null,o,i[s],n?s:a[s]);return o}exports.reduce=reduce;function compact(t){return reject(t,function(e){return e==null})}exports.compact=compact;function uniq(t,e){e===void 0&&(e=function(n){return n});var r=[];return reduce(t,function(n,i){var a=e(i);return contains(r,a)?n:(r.push(a),n.concat(i))},[])}exports.uniq=uniq;function partial(t){for(var e=[],r=1;r<arguments.length;r++)e[r-1]=arguments[r];var n=[null],i=n.concat(e);return Function.bind.apply(t,i)}exports.partial=partial;function isArray(t){return Array.isArray(t)}exports.isArray=isArray;function isRegExp(t){return t instanceof RegExp}exports.isRegExp=isRegExp;function isObject(t){return t instanceof Object}exports.isObject=isObject;function every(t,e){for(var r=0;r<t.length;r++)if(!e(t[r],r))return!1;return!0}exports.every=every;function difference(t,e){return reject(t,function(r){return contains(e,r)})}exports.difference=difference;function some(t,e){for(var r=0;r<t.length;r++)if(e(t[r]))return!0;return!1}exports.some=some;function indexOf(t,e){for(var r=0;r<t.length;r++)if(t[r]===e)return r;return-1}exports.indexOf=indexOf;function sortBy(t,e){var r=cloneArr(t);return r.sort(function(n,i){return e(n)-e(i)}),r}exports.sortBy=sortBy;function zipObject(t,e){if(t.length!==e.length)throw Error(\"can't zipObject with different number of keys and values!\");for(var r={},n=0;n<t.length;n++)r[t[n]]=e[n];return r}exports.zipObject=zipObject;function assign(t){for(var e=[],r=1;r<arguments.length;r++)e[r-1]=arguments[r];for(var n=0;n<e.length;n++)for(var i=e[n],a=keys(i),o=0;o<a.length;o++){var s=a[o];t[s]=i[s]}return t}exports.assign=assign;function assignNoOverwrite(t){for(var e=[],r=1;r<arguments.length;r++)e[r-1]=arguments[r];for(var n=0;n<e.length;n++)for(var i=e[n],a=keys(i),o=0;o<a.length;o++){var s=a[o];has(t,s)||(t[s]=i[s])}return t}exports.assignNoOverwrite=assignNoOverwrite;function defaults(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];return assignNoOverwrite.apply(void 0,__spreadArray([{}],t))}exports.defaults=defaults;function groupBy(t,e){var r={};return forEach(t,function(n){var i=e(n),a=r[i];a?a.push(n):r[i]=[n]}),r}exports.groupBy=groupBy;function merge(t,e){for(var r=cloneObj(t),n=keys(e),i=0;i<n.length;i++){var a=n[i],o=e[a];r[a]=o}return r}exports.merge=merge;function NOOP(){}exports.NOOP=NOOP;function IDENTITY(t){return t}exports.IDENTITY=IDENTITY;function packArray(t){for(var e=[],r=0;r<t.length;r++){var n=t[r];e.push(n!==void 0?n:void 0)}return e}exports.packArray=packArray;function PRINT_ERROR(t){console&&console.error&&console.error(\"Error: \"+t)}exports.PRINT_ERROR=PRINT_ERROR;function PRINT_WARNING(t){console&&console.warn&&console.warn(\"Warning: \"+t)}exports.PRINT_WARNING=PRINT_WARNING;function isES2015MapSupported(){return typeof Map==\"function\"}exports.isES2015MapSupported=isES2015MapSupported;function peek(t){return t[t.length-1]}exports.peek=peek;function timer(t){var e=new Date().getTime(),r=t(),n=new Date().getTime(),i=n-e;return{time:i,value:r}}exports.timer=timer;function toFastProperties(toBecomeFast){function FakeConstructor(){}FakeConstructor.prototype=toBecomeFast;var fakeInstance=new FakeConstructor;function fakeAccess(){return typeof fakeInstance.bar}return fakeAccess(),fakeAccess(),toBecomeFast;eval(toBecomeFast)}exports.toFastProperties=toFastProperties});var xt=R((sn,St)=>{(function(t,e){typeof define==\"function\"&&define.amd?define([],e):typeof St==\"object\"&&St.exports?St.exports=e():t.regexpToAst=e()})(typeof self!=\"undefined\"?self:sn,function(){function t(){}t.prototype.saveState=function(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}},t.prototype.restoreState=function(u){this.idx=u.idx,this.input=u.input,this.groupIdx=u.groupIdx},t.prototype.pattern=function(u){this.idx=0,this.input=u,this.groupIdx=0,this.consumeChar(\"/\");var d=this.disjunction();this.consumeChar(\"/\");for(var A={type:\"Flags\",loc:{begin:this.idx,end:u.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};this.isRegExpFlag();)switch(this.popChar()){case\"g\":o(A,\"global\");break;case\"i\":o(A,\"ignoreCase\");break;case\"m\":o(A,\"multiLine\");break;case\"u\":o(A,\"unicode\");break;case\"y\":o(A,\"sticky\");break}if(this.idx!==this.input.length)throw Error(\"Redundant input: \"+this.input.substring(this.idx));return{type:\"Pattern\",flags:A,value:d,loc:this.loc(0)}},t.prototype.disjunction=function(){var u=[],d=this.idx;for(u.push(this.alternative());this.peekChar()===\"|\";)this.consumeChar(\"|\"),u.push(this.alternative());return{type:\"Disjunction\",value:u,loc:this.loc(d)}},t.prototype.alternative=function(){for(var u=[],d=this.idx;this.isTerm();)u.push(this.term());return{type:\"Alternative\",value:u,loc:this.loc(d)}},t.prototype.term=function(){return this.isAssertion()?this.assertion():this.atom()},t.prototype.assertion=function(){var u=this.idx;switch(this.popChar()){case\"^\":return{type:\"StartAnchor\",loc:this.loc(u)};case\"$\":return{type:\"EndAnchor\",loc:this.loc(u)};case\"\\\\\":switch(this.popChar()){case\"b\":return{type:\"WordBoundary\",loc:this.loc(u)};case\"B\":return{type:\"NonWordBoundary\",loc:this.loc(u)}}throw Error(\"Invalid Assertion Escape\");case\"(\":this.consumeChar(\"?\");var d;switch(this.popChar()){case\"=\":d=\"Lookahead\";break;case\"!\":d=\"NegativeLookahead\";break}s(d);var A=this.disjunction();return this.consumeChar(\")\"),{type:d,value:A,loc:this.loc(u)}}c()},t.prototype.quantifier=function(u){var d,A=this.idx;switch(this.popChar()){case\"*\":d={atLeast:0,atMost:Infinity};break;case\"+\":d={atLeast:1,atMost:Infinity};break;case\"?\":d={atLeast:0,atMost:1};break;case\"{\":var _=this.integerIncludingZero();switch(this.popChar()){case\"}\":d={atLeast:_,atMost:_};break;case\",\":var g;this.isDigit()?(g=this.integerIncludingZero(),d={atLeast:_,atMost:g}):d={atLeast:_,atMost:Infinity},this.consumeChar(\"}\");break}if(u===!0&&d===void 0)return;s(d);break}if(!(u===!0&&d===void 0))return s(d),this.peekChar(0)===\"?\"?(this.consumeChar(\"?\"),d.greedy=!1):d.greedy=!0,d.type=\"Quantifier\",d.loc=this.loc(A),d},t.prototype.atom=function(){var u,d=this.idx;switch(this.peekChar()){case\".\":u=this.dotAll();break;case\"\\\\\":u=this.atomEscape();break;case\"[\":u=this.characterClass();break;case\"(\":u=this.group();break}return u===void 0&&this.isPatternCharacter()&&(u=this.patternCharacter()),s(u),u.loc=this.loc(d),this.isQuantifier()&&(u.quantifier=this.quantifier()),u},t.prototype.dotAll=function(){return this.consumeChar(\".\"),{type:\"Set\",complement:!0,value:[i(`\n`),i(\"\\r\"),i(\"\\u2028\"),i(\"\\u2029\")]}},t.prototype.atomEscape=function(){switch(this.consumeChar(\"\\\\\"),this.peekChar()){case\"1\":case\"2\":case\"3\":case\"4\":case\"5\":case\"6\":case\"7\":case\"8\":case\"9\":return this.decimalEscapeAtom();case\"d\":case\"D\":case\"s\":case\"S\":case\"w\":case\"W\":return this.characterClassEscape();case\"f\":case\"n\":case\"r\":case\"t\":case\"v\":return this.controlEscapeAtom();case\"c\":return this.controlLetterEscapeAtom();case\"0\":return this.nulCharacterAtom();case\"x\":return this.hexEscapeSequenceAtom();case\"u\":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}},t.prototype.decimalEscapeAtom=function(){var u=this.positiveInteger();return{type:\"GroupBackReference\",value:u}},t.prototype.characterClassEscape=function(){var u,d=!1;switch(this.popChar()){case\"d\":u=p;break;case\"D\":u=p,d=!0;break;case\"s\":u=m;break;case\"S\":u=m,d=!0;break;case\"w\":u=l;break;case\"W\":u=l,d=!0;break}return s(u),{type:\"Set\",value:u,complement:d}},t.prototype.controlEscapeAtom=function(){var u;switch(this.popChar()){case\"f\":u=i(\"\\f\");break;case\"n\":u=i(`\n`);break;case\"r\":u=i(\"\\r\");break;case\"t\":u=i(\"\t\");break;case\"v\":u=i(\"\\v\");break}return s(u),{type:\"Character\",value:u}},t.prototype.controlLetterEscapeAtom=function(){this.consumeChar(\"c\");var u=this.popChar();if(/[a-zA-Z]/.test(u)===!1)throw Error(\"Invalid \");var d=u.toUpperCase().charCodeAt(0)-64;return{type:\"Character\",value:d}},t.prototype.nulCharacterAtom=function(){return this.consumeChar(\"0\"),{type:\"Character\",value:i(\"\\0\")}},t.prototype.hexEscapeSequenceAtom=function(){return this.consumeChar(\"x\"),this.parseHexDigits(2)},t.prototype.regExpUnicodeEscapeSequenceAtom=function(){return this.consumeChar(\"u\"),this.parseHexDigits(4)},t.prototype.identityEscapeAtom=function(){var u=this.popChar();return{type:\"Character\",value:i(u)}},t.prototype.classPatternCharacterAtom=function(){switch(this.peekChar()){case`\n`:case\"\\r\":case\"\\u2028\":case\"\\u2029\":case\"\\\\\":case\"]\":throw Error(\"TBD\");default:var u=this.popChar();return{type:\"Character\",value:i(u)}}},t.prototype.characterClass=function(){var u=[],d=!1;for(this.consumeChar(\"[\"),this.peekChar(0)===\"^\"&&(this.consumeChar(\"^\"),d=!0);this.isClassAtom();){var A=this.classAtom(),_=A.type===\"Character\";if(_&&this.isRangeDash()){this.consumeChar(\"-\");var g=this.classAtom(),y=g.type===\"Character\";if(y){if(g.value<A.value)throw Error(\"Range out of order in character class\");u.push({from:A.value,to:g.value})}else a(A.value,u),u.push(i(\"-\")),a(g.value,u)}else a(A.value,u)}return this.consumeChar(\"]\"),{type:\"Set\",complement:d,value:u}},t.prototype.classAtom=function(){switch(this.peekChar()){case\"]\":case`\n`:case\"\\r\":case\"\\u2028\":case\"\\u2029\":throw Error(\"TBD\");case\"\\\\\":return this.classEscape();default:return this.classPatternCharacterAtom()}},t.prototype.classEscape=function(){switch(this.consumeChar(\"\\\\\"),this.peekChar()){case\"b\":return this.consumeChar(\"b\"),{type:\"Character\",value:i(\"\\b\")};case\"d\":case\"D\":case\"s\":case\"S\":case\"w\":case\"W\":return this.characterClassEscape();case\"f\":case\"n\":case\"r\":case\"t\":case\"v\":return this.controlEscapeAtom();case\"c\":return this.controlLetterEscapeAtom();case\"0\":return this.nulCharacterAtom();case\"x\":return this.hexEscapeSequenceAtom();case\"u\":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}},t.prototype.group=function(){var u=!0;switch(this.consumeChar(\"(\"),this.peekChar(0)){case\"?\":this.consumeChar(\"?\"),this.consumeChar(\":\"),u=!1;break;default:this.groupIdx++;break}var d=this.disjunction();this.consumeChar(\")\");var A={type:\"Group\",capturing:u,value:d};return u&&(A.idx=this.groupIdx),A},t.prototype.positiveInteger=function(){var u=this.popChar();if(n.test(u)===!1)throw Error(\"Expecting a positive integer\");for(;r.test(this.peekChar(0));)u+=this.popChar();return parseInt(u,10)},t.prototype.integerIncludingZero=function(){var u=this.popChar();if(r.test(u)===!1)throw Error(\"Expecting an integer\");for(;r.test(this.peekChar(0));)u+=this.popChar();return parseInt(u,10)},t.prototype.patternCharacter=function(){var u=this.popChar();switch(u){case`\n`:case\"\\r\":case\"\\u2028\":case\"\\u2029\":case\"^\":case\"$\":case\"\\\\\":case\".\":case\"*\":case\"+\":case\"?\":case\"(\":case\")\":case\"[\":case\"|\":throw Error(\"TBD\");default:return{type:\"Character\",value:i(u)}}},t.prototype.isRegExpFlag=function(){switch(this.peekChar(0)){case\"g\":case\"i\":case\"m\":case\"u\":case\"y\":return!0;default:return!1}},t.prototype.isRangeDash=function(){return this.peekChar()===\"-\"&&this.isClassAtom(1)},t.prototype.isDigit=function(){return r.test(this.peekChar(0))},t.prototype.isClassAtom=function(u){switch(u===void 0&&(u=0),this.peekChar(u)){case\"]\":case`\n`:case\"\\r\":case\"\\u2028\":case\"\\u2029\":return!1;default:return!0}},t.prototype.isTerm=function(){return this.isAtom()||this.isAssertion()},t.prototype.isAtom=function(){if(this.isPatternCharacter())return!0;switch(this.peekChar(0)){case\".\":case\"\\\\\":case\"[\":case\"(\":return!0;default:return!1}},t.prototype.isAssertion=function(){switch(this.peekChar(0)){case\"^\":case\"$\":return!0;case\"\\\\\":switch(this.peekChar(1)){case\"b\":case\"B\":return!0;default:return!1}case\"(\":return this.peekChar(1)===\"?\"&&(this.peekChar(2)===\"=\"||this.peekChar(2)===\"!\");default:return!1}},t.prototype.isQuantifier=function(){var u=this.saveState();try{return this.quantifier(!0)!==void 0}catch(d){return!1}finally{this.restoreState(u)}},t.prototype.isPatternCharacter=function(){switch(this.peekChar()){case\"^\":case\"$\":case\"\\\\\":case\".\":case\"*\":case\"+\":case\"?\":case\"(\":case\")\":case\"[\":case\"|\":case\"/\":case`\n`:case\"\\r\":case\"\\u2028\":case\"\\u2029\":return!1;default:return!0}},t.prototype.parseHexDigits=function(u){for(var d=\"\",A=0;A<u;A++){var _=this.popChar();if(e.test(_)===!1)throw Error(\"Expecting a HexDecimal digits\");d+=_}var g=parseInt(d,16);return{type:\"Character\",value:g}},t.prototype.peekChar=function(u){return u===void 0&&(u=0),this.input[this.idx+u]},t.prototype.popChar=function(){var u=this.peekChar(0);return this.consumeChar(),u},t.prototype.consumeChar=function(u){if(u!==void 0&&this.input[this.idx]!==u)throw Error(\"Expected: '\"+u+\"' but found: '\"+this.input[this.idx]+\"' at offset: \"+this.idx);if(this.idx>=this.input.length)throw Error(\"Unexpected end of input\");this.idx++},t.prototype.loc=function(u){return{begin:u,end:this.idx}};var e=/[0-9a-fA-F]/,r=/[0-9]/,n=/[1-9]/;function i(u){return u.charCodeAt(0)}function a(u,d){u.length!==void 0?u.forEach(function(A){d.push(A)}):d.push(u)}function o(u,d){if(u[d]===!0)throw\"duplicate flag \"+d;u[d]=!0}function s(u){if(u===void 0)throw Error(\"Internal Error - Should never get here!\")}function c(){throw Error(\"Internal Error - Should never get here!\")}var f,p=[];for(f=i(\"0\");f<=i(\"9\");f++)p.push(f);var l=[i(\"_\")].concat(p);for(f=i(\"a\");f<=i(\"z\");f++)l.push(f);for(f=i(\"A\");f<=i(\"Z\");f++)l.push(f);var m=[i(\" \"),i(\"\\f\"),i(`\n`),i(\"\\r\"),i(\"\t\"),i(\"\\v\"),i(\"\t\"),i(\"\\xA0\"),i(\"\\u1680\"),i(\"\\u2000\"),i(\"\\u2001\"),i(\"\\u2002\"),i(\"\\u2003\"),i(\"\\u2004\"),i(\"\\u2005\"),i(\"\\u2006\"),i(\"\\u2007\"),i(\"\\u2008\"),i(\"\\u2009\"),i(\"\\u200A\"),i(\"\\u2028\"),i(\"\\u2029\"),i(\"\\u202F\"),i(\"\\u205F\"),i(\"\\u3000\"),i(\"\\uFEFF\")];function v(){}return v.prototype.visitChildren=function(u){for(var d in u){var A=u[d];u.hasOwnProperty(d)&&(A.type!==void 0?this.visit(A):Array.isArray(A)&&A.forEach(function(_){this.visit(_)},this))}},v.prototype.visit=function(u){switch(u.type){case\"Pattern\":this.visitPattern(u);break;case\"Flags\":this.visitFlags(u);break;case\"Disjunction\":this.visitDisjunction(u);break;case\"Alternative\":this.visitAlternative(u);break;case\"StartAnchor\":this.visitStartAnchor(u);break;case\"EndAnchor\":this.visitEndAnchor(u);break;case\"WordBoundary\":this.visitWordBoundary(u);break;case\"NonWordBoundary\":this.visitNonWordBoundary(u);break;case\"Lookahead\":this.visitLookahead(u);break;case\"NegativeLookahead\":this.visitNegativeLookahead(u);break;case\"Character\":this.visitCharacter(u);break;case\"Set\":this.visitSet(u);break;case\"Group\":this.visitGroup(u);break;case\"GroupBackReference\":this.visitGroupBackReference(u);break;case\"Quantifier\":this.visitQuantifier(u);break}this.visitChildren(u)},v.prototype.visitPattern=function(u){},v.prototype.visitFlags=function(u){},v.prototype.visitDisjunction=function(u){},v.prototype.visitAlternative=function(u){},v.prototype.visitStartAnchor=function(u){},v.prototype.visitEndAnchor=function(u){},v.prototype.visitWordBoundary=function(u){},v.prototype.visitNonWordBoundary=function(u){},v.prototype.visitLookahead=function(u){},v.prototype.visitNegativeLookahead=function(u){},v.prototype.visitCharacter=function(u){},v.prototype.visitSet=function(u){},v.prototype.visitGroup=function(u){},v.prototype.visitGroupBackReference=function(u){},v.prototype.visitQuantifier=function(u){},{RegExpParser:t,BaseRegExpVisitor:v,VERSION:\"0.5.0\"}})});var Lt=R(He=>{\"use strict\";Object.defineProperty(He,\"__esModule\",{value:!0});He.clearRegExpParserCache=He.getRegExpAst=void 0;var Ga=xt(),Ct={},Wa=new Ga.RegExpParser;function Ba(t){var e=t.toString();if(Ct.hasOwnProperty(e))return Ct[e];var r=Wa.pattern(e);return Ct[e]=r,r}He.getRegExpAst=Ba;function qa(){Ct={}}He.clearRegExpParserCache=qa});var pn=R(re=>{\"use strict\";var ja=re&&re.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,i){n.__proto__=i}||function(n,i){for(var a in i)Object.prototype.hasOwnProperty.call(i,a)&&(n[a]=i[a])},t(e,r)};return function(e,r){if(typeof r!=\"function\"&&r!==null)throw new TypeError(\"Class extends value \"+String(r)+\" is not a constructor or null\");t(e,r);function n(){this.constructor=e}e.prototype=r===null?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(re,\"__esModule\",{value:!0});re.canMatchCharCode=re.firstCharOptimizedIndices=re.getOptimizedStartCodesIndices=re.failedOptimizationPrefixMsg=void 0;var un=xt(),pe=k(),cn=Lt(),Ce=Tr(),ln=\"Complement Sets are not supported for first char optimization\";re.failedOptimizationPrefixMsg=`Unable to use \"first char\" lexer optimizations:\n`;function Va(t,e){e===void 0&&(e=!1);try{var r=cn.getRegExpAst(t),n=Mt(r.value,{},r.flags.ignoreCase);return n}catch(a){if(a.message===ln)e&&pe.PRINT_WARNING(\"\"+re.failedOptimizationPrefixMsg+(\"\tUnable to optimize: < \"+t.toString()+` >\n`)+`\tComplement Sets cannot be automatically optimized.\n\tThis will disable the lexer's first char optimizations.\n\tSee: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.`);else{var i=\"\";e&&(i=`\n\tThis will disable the lexer's first char optimizations.\n\tSee: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.`),pe.PRINT_ERROR(re.failedOptimizationPrefixMsg+`\n`+(\"\tFailed parsing: < \"+t.toString()+` >\n`)+(\"\tUsing the regexp-to-ast library version: \"+un.VERSION+`\n`)+\"\tPlease open an issue at: https://github.com/bd82/regexp-to-ast/issues\"+i)}}return[]}re.getOptimizedStartCodesIndices=Va;function Mt(t,e,r){switch(t.type){case\"Disjunction\":for(var n=0;n<t.value.length;n++)Mt(t.value[n],e,r);break;case\"Alternative\":for(var i=t.value,n=0;n<i.length;n++){var a=i[n];switch(a.type){case\"EndAnchor\":case\"GroupBackReference\":case\"Lookahead\":case\"NegativeLookahead\":case\"StartAnchor\":case\"WordBoundary\":case\"NonWordBoundary\":continue}var o=a;switch(o.type){case\"Character\":bt(o.value,e,r);break;case\"Set\":if(o.complement===!0)throw Error(ln);pe.forEach(o.value,function(f){if(typeof f==\"number\")bt(f,e,r);else{var p=f;if(r===!0)for(var l=p.from;l<=p.to;l++)bt(l,e,r);else{for(var l=p.from;l<=p.to&&l<Ce.minOptimizationVal;l++)bt(l,e,r);if(p.to>=Ce.minOptimizationVal)for(var m=p.from>=Ce.minOptimizationVal?p.from:Ce.minOptimizationVal,v=p.to,u=Ce.charCodeToOptimizedIndex(m),d=Ce.charCodeToOptimizedIndex(v),A=u;A<=d;A++)e[A]=A}}});break;case\"Group\":Mt(o.value,e,r);break;default:throw Error(\"Non Exhaustive Match\")}var s=o.quantifier!==void 0&&o.quantifier.atLeast===0;if(o.type===\"Group\"&&yr(o)===!1||o.type!==\"Group\"&&s===!1)break}break;default:throw Error(\"non exhaustive match!\")}return pe.values(e)}re.firstCharOptimizedIndices=Mt;function bt(t,e,r){var n=Ce.charCodeToOptimizedIndex(t);e[n]=n,r===!0&&Ka(t,e)}function Ka(t,e){var r=String.fromCharCode(t),n=r.toUpperCase();if(n!==r){var i=Ce.charCodeToOptimizedIndex(n.charCodeAt(0));e[i]=i}else{var a=r.toLowerCase();if(a!==r){var i=Ce.charCodeToOptimizedIndex(a.charCodeAt(0));e[i]=i}}}function fn(t,e){return pe.find(t.value,function(r){if(typeof r==\"number\")return pe.contains(e,r);var n=r;return pe.find(e,function(i){return n.from<=i&&i<=n.to})!==void 0})}function yr(t){return t.quantifier&&t.quantifier.atLeast===0?!0:t.value?pe.isArray(t.value)?pe.every(t.value,yr):yr(t.value):!1}var za=function(t){ja(e,t);function e(r){var n=t.call(this)||this;return n.targetCharCodes=r,n.found=!1,n}return e.prototype.visitChildren=function(r){if(this.found!==!0){switch(r.type){case\"Lookahead\":this.visitLookahead(r);return;case\"NegativeLookahead\":this.visitNegativeLookahead(r);return}t.prototype.visitChildren.call(this,r)}},e.prototype.visitCharacter=function(r){pe.contains(this.targetCharCodes,r.value)&&(this.found=!0)},e.prototype.visitSet=function(r){r.complement?fn(r,this.targetCharCodes)===void 0&&(this.found=!0):fn(r,this.targetCharCodes)!==void 0&&(this.found=!0)},e}(un.BaseRegExpVisitor);function Ha(t,e){if(e instanceof RegExp){var r=cn.getRegExpAst(e),n=new za(t);return n.visit(r),n.found}else return pe.find(e,function(i){return pe.contains(t,i.charCodeAt(0))})!==void 0}re.canMatchCharCode=Ha});var Tr=R(T=>{\"use strict\";var hn=T&&T.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,i){n.__proto__=i}||function(n,i){for(var a in i)Object.prototype.hasOwnProperty.call(i,a)&&(n[a]=i[a])},t(e,r)};return function(e,r){if(typeof r!=\"function\"&&r!==null)throw new TypeError(\"Class extends value \"+String(r)+\" is not a constructor or null\");t(e,r);function n(){this.constructor=e}e.prototype=r===null?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(T,\"__esModule\",{value:!0});T.charCodeToOptimizedIndex=T.minOptimizationVal=T.buildLineBreakIssueMessage=T.LineTerminatorOptimizedTester=T.isShortPattern=T.isCustomPattern=T.cloneEmptyGroups=T.performWarningRuntimeChecks=T.performRuntimeChecks=T.addStickyFlag=T.addStartOfInput=T.findUnreachablePatterns=T.findModesThatDoNotExist=T.findInvalidGroupType=T.findDuplicatePatterns=T.findUnsupportedFlags=T.findStartOfInputAnchor=T.findEmptyMatchRegExps=T.findEndOfInputAnchor=T.findInvalidPatterns=T.findMissingPatterns=T.validatePatterns=T.analyzeTokenTypes=T.enableSticky=T.disableSticky=T.SUPPORT_STICKY=T.MODES=T.DEFAULT_MODE=void 0;var dn=xt(),F=ft(),h=k(),Ye=pn(),vn=Lt(),Ae=\"PATTERN\";T.DEFAULT_MODE=\"defaultMode\";T.MODES=\"modes\";T.SUPPORT_STICKY=typeof new RegExp(\"(?:)\").sticky==\"boolean\";function Ya(){T.SUPPORT_STICKY=!1}T.disableSticky=Ya;function Xa(){T.SUPPORT_STICKY=!0}T.enableSticky=Xa;function Za(t,e){e=h.defaults(e,{useSticky:T.SUPPORT_STICKY,debug:!1,safeMode:!1,positionTracking:\"full\",lineTerminatorCharacters:[\"\\r\",`\n`],tracer:function(g,y){return y()}});var r=e.tracer;r(\"initCharCodeToOptimizedIndexMap\",function(){$a()});var n;r(\"Reject Lexer.NA\",function(){n=h.reject(t,function(g){return g[Ae]===F.Lexer.NA})});var i=!1,a;r(\"Transform Patterns\",function(){i=!1,a=h.map(n,function(g){var y=g[Ae];if(h.isRegExp(y)){var b=y.source;return b.length===1&&b!==\"^\"&&b!==\"$\"&&b!==\".\"&&!y.ignoreCase?b:b.length===2&&b[0]===\"\\\\\"&&!h.contains([\"d\",\"D\",\"s\",\"S\",\"t\",\"r\",\"n\",\"t\",\"0\",\"c\",\"b\",\"B\",\"f\",\"v\",\"w\",\"W\"],b[1])?b[1]:e.useSticky?gr(y):_r(y)}else{if(h.isFunction(y))return i=!0,{exec:y};if(h.has(y,\"exec\"))return i=!0,y;if(typeof y==\"string\"){if(y.length===1)return y;var L=y.replace(/[\\\\^$.*+?()[\\]{}|]/g,\"\\\\$&\"),se=new RegExp(L);return e.useSticky?gr(se):_r(se)}else throw Error(\"non exhaustive match\")}})});var o,s,c,f,p;r(\"misc mapping\",function(){o=h.map(n,function(g){return g.tokenTypeIdx}),s=h.map(n,function(g){var y=g.GROUP;if(y!==F.Lexer.SKIPPED){if(h.isString(y))return y;if(h.isUndefined(y))return!1;throw Error(\"non exhaustive match\")}}),c=h.map(n,function(g){var y=g.LONGER_ALT;if(y){var b=h.indexOf(n,y);return b}}),f=h.map(n,function(g){return g.PUSH_MODE}),p=h.map(n,function(g){return h.has(g,\"POP_MODE\")})});var l;r(\"Line Terminator Handling\",function(){var g=Tn(e.lineTerminatorCharacters);l=h.map(n,function(y){return!1}),e.positionTracking!==\"onlyOffset\"&&(l=h.map(n,function(y){if(h.has(y,\"LINE_BREAKS\"))return y.LINE_BREAKS;if(En(y,g)===!1)return Ye.canMatchCharCode(g,y.PATTERN)}))});var m,v,u,d;r(\"Misc Mapping #2\",function(){m=h.map(n,Ar),v=h.map(a,mn),u=h.reduce(n,function(g,y){var b=y.GROUP;return h.isString(b)&&b!==F.Lexer.SKIPPED&&(g[b]=[]),g},{}),d=h.map(a,function(g,y){return{pattern:a[y],longerAlt:c[y],canLineTerminator:l[y],isCustom:m[y],short:v[y],group:s[y],push:f[y],pop:p[y],tokenTypeIdx:o[y],tokenType:n[y]}})});var A=!0,_=[];return e.safeMode||r(\"First Char Optimization\",function(){_=h.reduce(n,function(g,y,b){if(typeof y.PATTERN==\"string\"){var L=y.PATTERN.charCodeAt(0),se=Or(L);Rr(g,se,d[b])}else if(h.isArray(y.START_CHARS_HINT)){var fe;h.forEach(y.START_CHARS_HINT,function(ue){var Q=typeof ue==\"string\"?ue.charCodeAt(0):ue,te=Or(Q);fe!==te&&(fe=te,Rr(g,te,d[b]))})}else if(h.isRegExp(y.PATTERN))if(y.PATTERN.unicode)A=!1,e.ensureOptimizations&&h.PRINT_ERROR(\"\"+Ye.failedOptimizationPrefixMsg+(\"\tUnable to analyze < \"+y.PATTERN.toString()+` > pattern.\n`)+`\tThe regexp unicode flag is not currently supported by the regexp-to-ast library.\n\tThis will disable the lexer's first char optimizations.\n\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE`);else{var Z=Ye.getOptimizedStartCodesIndices(y.PATTERN,e.ensureOptimizations);h.isEmpty(Z)&&(A=!1),h.forEach(Z,function(ue){Rr(g,ue,d[b])})}else e.ensureOptimizations&&h.PRINT_ERROR(\"\"+Ye.failedOptimizationPrefixMsg+(\"\tTokenType: <\"+y.name+`> is using a custom token pattern without providing <start_chars_hint> parameter.\n`)+`\tThis will disable the lexer's first char optimizations.\n\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE`),A=!1;return g},[])}),r(\"ArrayPacking\",function(){_=h.packArray(_)}),{emptyGroups:u,patternIdxToConfig:d,charCodeToPatternIdxToConfig:_,hasCustom:i,canBeOptimized:A}}T.analyzeTokenTypes=Za;function Ja(t,e){var r=[],n=yn(t);r=r.concat(n.errors);var i=_n(n.valid),a=i.valid;return r=r.concat(i.errors),r=r.concat(Qa(a)),r=r.concat(gn(a)),r=r.concat(An(a,e)),r=r.concat(Rn(a)),r}T.validatePatterns=Ja;function Qa(t){var e=[],r=h.filter(t,function(n){return h.isRegExp(n[Ae])});return e=e.concat(On(r)),e=e.concat(In(r)),e=e.concat(kn(r)),e=e.concat(Pn(r)),e=e.concat(Nn(r)),e}function yn(t){var e=h.filter(t,function(i){return!h.has(i,Ae)}),r=h.map(e,function(i){return{message:\"Token Type: ->\"+i.name+\"<- missing static 'PATTERN' property\",type:F.LexerDefinitionErrorType.MISSING_PATTERN,tokenTypes:[i]}}),n=h.difference(t,e);return{errors:r,valid:n}}T.findMissingPatterns=yn;function _n(t){var e=h.filter(t,function(i){var a=i[Ae];return!h.isRegExp(a)&&!h.isFunction(a)&&!h.has(a,\"exec\")&&!h.isString(a)}),r=h.map(e,function(i){return{message:\"Token Type: ->\"+i.name+\"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.\",type:F.LexerDefinitionErrorType.INVALID_PATTERN,tokenTypes:[i]}}),n=h.difference(t,e);return{errors:r,valid:n}}T.findInvalidPatterns=_n;var eo=/[^\\\\][\\$]/;function On(t){var e=function(i){hn(a,i);function a(){var o=i!==null&&i.apply(this,arguments)||this;return o.found=!1,o}return a.prototype.visitEndAnchor=function(o){this.found=!0},a}(dn.BaseRegExpVisitor),r=h.filter(t,function(i){var a=i[Ae];try{var o=vn.getRegExpAst(a),s=new e;return s.visit(o),s.found}catch(c){return eo.test(a.source)}}),n=h.map(r,function(i){return{message:`Unexpected RegExp Anchor Error:\n\tToken Type: ->`+i.name+`<- static 'PATTERN' cannot contain end of input anchor '$'\n\tSee chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS\tfor details.`,type:F.LexerDefinitionErrorType.EOI_ANCHOR_FOUND,tokenTypes:[i]}});return n}T.findEndOfInputAnchor=On;function Nn(t){var e=h.filter(t,function(n){var i=n[Ae];return i.test(\"\")}),r=h.map(e,function(n){return{message:\"Token Type: ->\"+n.name+\"<- static 'PATTERN' must not match an empty string\",type:F.LexerDefinitionErrorType.EMPTY_MATCH_PATTERN,tokenTypes:[n]}});return r}T.findEmptyMatchRegExps=Nn;var to=/[^\\\\[][\\^]|^\\^/;function In(t){var e=function(i){hn(a,i);function a(){var o=i!==null&&i.apply(this,arguments)||this;return o.found=!1,o}return a.prototype.visitStartAnchor=function(o){this.found=!0},a}(dn.BaseRegExpVisitor),r=h.filter(t,function(i){var a=i[Ae];try{var o=vn.getRegExpAst(a),s=new e;return s.visit(o),s.found}catch(c){return to.test(a.source)}}),n=h.map(r,function(i){return{message:`Unexpected RegExp Anchor Error:\n\tToken Type: ->`+i.name+`<- static 'PATTERN' cannot contain start of input anchor '^'\n\tSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS\tfor details.`,type:F.LexerDefinitionErrorType.SOI_ANCHOR_FOUND,tokenTypes:[i]}});return n}T.findStartOfInputAnchor=In;function kn(t){var e=h.filter(t,function(n){var i=n[Ae];return i instanceof RegExp&&(i.multiline||i.global)}),r=h.map(e,function(n){return{message:\"Token Type: ->\"+n.name+\"<- static 'PATTERN' may NOT contain global('g') or multiline('m')\",type:F.LexerDefinitionErrorType.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[n]}});return r}T.findUnsupportedFlags=kn;function Pn(t){var e=[],r=h.map(t,function(a){return h.reduce(t,function(o,s){return a.PATTERN.source===s.PATTERN.source&&!h.contains(e,s)&&s.PATTERN!==F.Lexer.NA&&(e.push(s),o.push(s)),o},[])});r=h.compact(r);var n=h.filter(r,function(a){return a.length>1}),i=h.map(n,function(a){var o=h.map(a,function(c){return c.name}),s=h.first(a).PATTERN;return{message:\"The same RegExp pattern ->\"+s+\"<-\"+(\"has been used in all of the following Token Types: \"+o.join(\", \")+\" <-\"),type:F.LexerDefinitionErrorType.DUPLICATE_PATTERNS_FOUND,tokenTypes:a}});return i}T.findDuplicatePatterns=Pn;function gn(t){var e=h.filter(t,function(n){if(!h.has(n,\"GROUP\"))return!1;var i=n.GROUP;return i!==F.Lexer.SKIPPED&&i!==F.Lexer.NA&&!h.isString(i)}),r=h.map(e,function(n){return{message:\"Token Type: ->\"+n.name+\"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String\",type:F.LexerDefinitionErrorType.INVALID_GROUP_TYPE_FOUND,tokenTypes:[n]}});return r}T.findInvalidGroupType=gn;function An(t,e){var r=h.filter(t,function(i){return i.PUSH_MODE!==void 0&&!h.contains(e,i.PUSH_MODE)}),n=h.map(r,function(i){var a=\"Token Type: ->\"+i.name+\"<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->\"+i.PUSH_MODE+\"<-which does not exist\";return{message:a,type:F.LexerDefinitionErrorType.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[i]}});return n}T.findModesThatDoNotExist=An;function Rn(t){var e=[],r=h.reduce(t,function(n,i,a){var o=i.PATTERN;return o===F.Lexer.NA||(h.isString(o)?n.push({str:o,idx:a,tokenType:i}):h.isRegExp(o)&&no(o)&&n.push({str:o.source,idx:a,tokenType:i})),n},[]);return h.forEach(t,function(n,i){h.forEach(r,function(a){var o=a.str,s=a.idx,c=a.tokenType;if(i<s&&ro(o,n.PATTERN)){var f=\"Token: ->\"+c.name+`<- can never be matched.\n`+(\"Because it appears AFTER the Token Type ->\"+n.name+\"<-\")+`in the lexer's definition.\nSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;e.push({message:f,type:F.LexerDefinitionErrorType.UNREACHABLE_PATTERN,tokenTypes:[n,c]})}})}),e}T.findUnreachablePatterns=Rn;function ro(t,e){if(h.isRegExp(e)){var r=e.exec(t);return r!==null&&r.index===0}else{if(h.isFunction(e))return e(t,0,[],{});if(h.has(e,\"exec\"))return e.exec(t,0,[],{});if(typeof e==\"string\")return e===t;throw Error(\"non exhaustive match\")}}function no(t){var e=[\".\",\"\\\\\",\"[\",\"]\",\"|\",\"^\",\"$\",\"(\",\")\",\"?\",\"*\",\"+\",\"{\"];return h.find(e,function(r){return t.source.indexOf(r)!==-1})===void 0}function _r(t){var e=t.ignoreCase?\"i\":\"\";return new RegExp(\"^(?:\"+t.source+\")\",e)}T.addStartOfInput=_r;function gr(t){var e=t.ignoreCase?\"iy\":\"y\";return new RegExp(\"\"+t.source,e)}T.addStickyFlag=gr;function io(t,e,r){var n=[];return h.has(t,T.DEFAULT_MODE)||n.push({message:\"A MultiMode Lexer cannot be initialized without a <\"+T.DEFAULT_MODE+`> property in its definition\n`,type:F.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),h.has(t,T.MODES)||n.push({message:\"A MultiMode Lexer cannot be initialized without a <\"+T.MODES+`> property in its definition\n`,type:F.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),h.has(t,T.MODES)&&h.has(t,T.DEFAULT_MODE)&&!h.has(t.modes,t.defaultMode)&&n.push({message:\"A MultiMode Lexer cannot be initialized with a \"+T.DEFAULT_MODE+\": <\"+t.defaultMode+`>which does not exist\n`,type:F.LexerDefinitionErrorType.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),h.has(t,T.MODES)&&h.forEach(t.modes,function(i,a){h.forEach(i,function(o,s){h.isUndefined(o)&&n.push({message:\"A Lexer cannot be initialized using an undefined Token Type. Mode:\"+(\"<\"+a+\"> at index: <\"+s+`>\n`),type:F.LexerDefinitionErrorType.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED})})}),n}T.performRuntimeChecks=io;function ao(t,e,r){var n=[],i=!1,a=h.compact(h.flatten(h.mapValues(t.modes,function(c){return c}))),o=h.reject(a,function(c){return c[Ae]===F.Lexer.NA}),s=Tn(r);return e&&h.forEach(o,function(c){var f=En(c,s);if(f!==!1){var p=Sn(c,f),l={message:p,type:f.issue,tokenType:c};n.push(l)}else h.has(c,\"LINE_BREAKS\")?c.LINE_BREAKS===!0&&(i=!0):Ye.canMatchCharCode(s,c.PATTERN)&&(i=!0)}),e&&!i&&n.push({message:`Warning: No LINE_BREAKS Found.\n\tThis Lexer has been defined to track line and column information,\n\tBut none of the Token Types can be identified as matching a line terminator.\n\tSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS\n\tfor details.`,type:F.LexerDefinitionErrorType.NO_LINE_BREAKS_FLAGS}),n}T.performWarningRuntimeChecks=ao;function oo(t){var e={},r=h.keys(t);return h.forEach(r,function(n){var i=t[n];if(h.isArray(i))e[n]=[];else throw Error(\"non exhaustive match\")}),e}T.cloneEmptyGroups=oo;function Ar(t){var e=t.PATTERN;if(h.isRegExp(e))return!1;if(h.isFunction(e))return!0;if(h.has(e,\"exec\"))return!0;if(h.isString(e))return!1;throw Error(\"non exhaustive match\")}T.isCustomPattern=Ar;function mn(t){return h.isString(t)&&t.length===1?t.charCodeAt(0):!1}T.isShortPattern=mn;T.LineTerminatorOptimizedTester={test:function(t){for(var e=t.length,r=this.lastIndex;r<e;r++){var n=t.charCodeAt(r);if(n===10)return this.lastIndex=r+1,!0;if(n===13)return t.charCodeAt(r+1)===10?this.lastIndex=r+2:this.lastIndex=r+1,!0}return!1},lastIndex:0};function En(t,e){if(h.has(t,\"LINE_BREAKS\"))return!1;if(h.isRegExp(t.PATTERN)){try{Ye.canMatchCharCode(e,t.PATTERN)}catch(r){return{issue:F.LexerDefinitionErrorType.IDENTIFY_TERMINATOR,errMsg:r.message}}return!1}else{if(h.isString(t.PATTERN))return!1;if(Ar(t))return{issue:F.LexerDefinitionErrorType.CUSTOM_LINE_BREAK};throw Error(\"non exhaustive match\")}}function Sn(t,e){if(e.issue===F.LexerDefinitionErrorType.IDENTIFY_TERMINATOR)return`Warning: unable to identify line terminator usage in pattern.\n`+(\"\tThe problem is in the <\"+t.name+`> Token Type\n`)+(\"\t Root cause: \"+e.errMsg+`.\n`)+\"\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR\";if(e.issue===F.LexerDefinitionErrorType.CUSTOM_LINE_BREAK)return`Warning: A Custom Token Pattern should specify the <line_breaks> option.\n`+(\"\tThe problem is in the <\"+t.name+`> Token Type\n`)+\"\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK\";throw Error(\"non exhaustive match\")}T.buildLineBreakIssueMessage=Sn;function Tn(t){var e=h.map(t,function(r){return h.isString(r)&&r.length>0?r.charCodeAt(0):r});return e}function Rr(t,e,r){t[e]===void 0?t[e]=[r]:t[e].push(r)}T.minOptimizationVal=256;var Ft=[];function Or(t){return t<T.minOptimizationVal?t:Ft[t]}T.charCodeToOptimizedIndex=Or;function $a(){if(h.isEmpty(Ft)){Ft=new Array(65536);for(var t=0;t<65536;t++)Ft[t]=t>255?255+~~(t/255):t}}});var Xe=R(N=>{\"use strict\";Object.defineProperty(N,\"__esModule\",{value:!0});N.isTokenType=N.hasExtendingTokensTypesMapProperty=N.hasExtendingTokensTypesProperty=N.hasCategoriesProperty=N.hasShortKeyProperty=N.singleAssignCategoriesToksMap=N.assignCategoriesMapProp=N.assignCategoriesTokensProp=N.assignTokenDefaultProps=N.expandCategories=N.augmentTokenTypes=N.tokenIdxToClass=N.tokenShortNameIdx=N.tokenStructuredMatcherNoCategories=N.tokenStructuredMatcher=void 0;var V=k();function so(t,e){var r=t.tokenTypeIdx;return r===e.tokenTypeIdx?!0:e.isParent===!0&&e.categoryMatchesMap[r]===!0}N.tokenStructuredMatcher=so;function uo(t,e){return t.tokenTypeIdx===e.tokenTypeIdx}N.tokenStructuredMatcherNoCategories=uo;N.tokenShortNameIdx=1;N.tokenIdxToClass={};function co(t){var e=xn(t);Cn(e),Mn(e),Ln(e),V.forEach(e,function(r){r.isParent=r.categoryMatches.length>0})}N.augmentTokenTypes=co;function xn(t){for(var e=V.cloneArr(t),r=t,n=!0;n;){r=V.compact(V.flatten(V.map(r,function(a){return a.CATEGORIES})));var i=V.difference(r,e);e=e.concat(i),V.isEmpty(i)?n=!1:r=i}return e}N.expandCategories=xn;function Cn(t){V.forEach(t,function(e){bn(e)||(N.tokenIdxToClass[N.tokenShortNameIdx]=e,e.tokenTypeIdx=N.tokenShortNameIdx++),Nr(e)&&!V.isArray(e.CATEGORIES)&&(e.CATEGORIES=[e.CATEGORIES]),Nr(e)||(e.CATEGORIES=[]),Fn(e)||(e.categoryMatches=[]),wn(e)||(e.categoryMatchesMap={})})}N.assignTokenDefaultProps=Cn;function Ln(t){V.forEach(t,function(e){e.categoryMatches=[],V.forEach(e.categoryMatchesMap,function(r,n){e.categoryMatches.push(N.tokenIdxToClass[n].tokenTypeIdx)})})}N.assignCategoriesTokensProp=Ln;function Mn(t){V.forEach(t,function(e){Ir([],e)})}N.assignCategoriesMapProp=Mn;function Ir(t,e){V.forEach(t,function(r){e.categoryMatchesMap[r.tokenTypeIdx]=!0}),V.forEach(e.CATEGORIES,function(r){var n=t.concat(e);V.contains(n,r)||Ir(n,r)})}N.singleAssignCategoriesToksMap=Ir;function bn(t){return V.has(t,\"tokenTypeIdx\")}N.hasShortKeyProperty=bn;function Nr(t){return V.has(t,\"CATEGORIES\")}N.hasCategoriesProperty=Nr;function Fn(t){return V.has(t,\"categoryMatches\")}N.hasExtendingTokensTypesProperty=Fn;function wn(t){return V.has(t,\"categoryMatchesMap\")}N.hasExtendingTokensTypesMapProperty=wn;function lo(t){return V.has(t,\"tokenTypeIdx\")}N.isTokenType=lo});var kr=R(wt=>{\"use strict\";Object.defineProperty(wt,\"__esModule\",{value:!0});wt.defaultLexerErrorProvider=void 0;wt.defaultLexerErrorProvider={buildUnableToPopLexerModeMessage:function(t){return\"Unable to pop Lexer Mode after encountering Token ->\"+t.image+\"<- The Mode Stack is empty\"},buildUnexpectedCharactersMessage:function(t,e,r,n,i){return\"unexpected character: ->\"+t.charAt(e)+\"<- at offset: \"+e+\",\"+(\" skipped \"+r+\" characters.\")}}});var ft=R(qe=>{\"use strict\";Object.defineProperty(qe,\"__esModule\",{value:!0});qe.Lexer=qe.LexerDefinitionErrorType=void 0;var Ee=Tr(),w=k(),fo=Xe(),po=kr(),ho=Lt(),vo;(function(t){t[t.MISSING_PATTERN=0]=\"MISSING_PATTERN\",t[t.INVALID_PATTERN=1]=\"INVALID_PATTERN\",t[t.EOI_ANCHOR_FOUND=2]=\"EOI_ANCHOR_FOUND\",t[t.UNSUPPORTED_FLAGS_FOUND=3]=\"UNSUPPORTED_FLAGS_FOUND\",t[t.DUPLICATE_PATTERNS_FOUND=4]=\"DUPLICATE_PATTERNS_FOUND\",t[t.INVALID_GROUP_TYPE_FOUND=5]=\"INVALID_GROUP_TYPE_FOUND\",t[t.PUSH_MODE_DOES_NOT_EXIST=6]=\"PUSH_MODE_DOES_NOT_EXIST\",t[t.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]=\"MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE\",t[t.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]=\"MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY\",t[t.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]=\"MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST\",t[t.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]=\"LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED\",t[t.SOI_ANCHOR_FOUND=11]=\"SOI_ANCHOR_FOUND\",t[t.EMPTY_MATCH_PATTERN=12]=\"EMPTY_MATCH_PATTERN\",t[t.NO_LINE_BREAKS_FLAGS=13]=\"NO_LINE_BREAKS_FLAGS\",t[t.UNREACHABLE_PATTERN=14]=\"UNREACHABLE_PATTERN\",t[t.IDENTIFY_TERMINATOR=15]=\"IDENTIFY_TERMINATOR\",t[t.CUSTOM_LINE_BREAK=16]=\"CUSTOM_LINE_BREAK\"})(vo=qe.LexerDefinitionErrorType||(qe.LexerDefinitionErrorType={}));var pt={deferDefinitionErrorsHandling:!1,positionTracking:\"full\",lineTerminatorsPattern:/\\n|\\r\\n?/g,lineTerminatorCharacters:[`\n`,\"\\r\"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:po.defaultLexerErrorProvider,traceInitPerf:!1,skipValidations:!1};Object.freeze(pt);var mo=function(){function t(e,r){var n=this;if(r===void 0&&(r=pt),this.lexerDefinition=e,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.config=void 0,this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},typeof r==\"boolean\")throw Error(`The second argument to the Lexer constructor is now an ILexerConfig Object.\na boolean 2nd argument is no longer supported`);this.config=w.merge(pt,r);var i=this.config.traceInitPerf;i===!0?(this.traceInitMaxIdent=Infinity,this.traceInitPerf=!0):typeof i==\"number\"&&(this.traceInitMaxIdent=i,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT(\"Lexer Constructor\",function(){var a,o=!0;n.TRACE_INIT(\"Lexer Config handling\",function(){if(n.config.lineTerminatorsPattern===pt.lineTerminatorsPattern)n.config.lineTerminatorsPattern=Ee.LineTerminatorOptimizedTester;else if(n.config.lineTerminatorCharacters===pt.lineTerminatorCharacters)throw Error(`Error: Missing <lineTerminatorCharacters> property on the Lexer config.\n\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS`);if(r.safeMode&&r.ensureOptimizations)throw Error('\"safeMode\" and \"ensureOptimizations\" flags are mutually exclusive.');n.trackStartLines=/full|onlyStart/i.test(n.config.positionTracking),n.trackEndLines=/full/i.test(n.config.positionTracking),w.isArray(e)?(a={modes:{}},a.modes[Ee.DEFAULT_MODE]=w.cloneArr(e),a[Ee.DEFAULT_MODE]=Ee.DEFAULT_MODE):(o=!1,a=w.cloneObj(e))}),n.config.skipValidations===!1&&(n.TRACE_INIT(\"performRuntimeChecks\",function(){n.lexerDefinitionErrors=n.lexerDefinitionErrors.concat(Ee.performRuntimeChecks(a,n.trackStartLines,n.config.lineTerminatorCharacters))}),n.TRACE_INIT(\"performWarningRuntimeChecks\",function(){n.lexerDefinitionWarning=n.lexerDefinitionWarning.concat(Ee.performWarningRuntimeChecks(a,n.trackStartLines,n.config.lineTerminatorCharacters))})),a.modes=a.modes?a.modes:{},w.forEach(a.modes,function(p,l){a.modes[l]=w.reject(p,function(m){return w.isUndefined(m)})});var s=w.keys(a.modes);if(w.forEach(a.modes,function(p,l){n.TRACE_INIT(\"Mode: <\"+l+\"> processing\",function(){if(n.modes.push(l),n.config.skipValidations===!1&&n.TRACE_INIT(\"validatePatterns\",function(){n.lexerDefinitionErrors=n.lexerDefinitionErrors.concat(Ee.validatePatterns(p,s))}),w.isEmpty(n.lexerDefinitionErrors)){fo.augmentTokenTypes(p);var m;n.TRACE_INIT(\"analyzeTokenTypes\",function(){m=Ee.analyzeTokenTypes(p,{lineTerminatorCharacters:n.config.lineTerminatorCharacters,positionTracking:r.positionTracking,ensureOptimizations:r.ensureOptimizations,safeMode:r.safeMode,tracer:n.TRACE_INIT.bind(n)})}),n.patternIdxToConfig[l]=m.patternIdxToConfig,n.charCodeToPatternIdxToConfig[l]=m.charCodeToPatternIdxToConfig,n.emptyGroups=w.merge(n.emptyGroups,m.emptyGroups),n.hasCustom=m.hasCustom||n.hasCustom,n.canModeBeOptimized[l]=m.canBeOptimized}})}),n.defaultMode=a.defaultMode,!w.isEmpty(n.lexerDefinitionErrors)&&!n.config.deferDefinitionErrorsHandling){var c=w.map(n.lexerDefinitionErrors,function(p){return p.message}),f=c.join(`-----------------------\n`);throw new Error(`Errors detected in definition of Lexer:\n`+f)}w.forEach(n.lexerDefinitionWarning,function(p){w.PRINT_WARNING(p.message)}),n.TRACE_INIT(\"Choosing sub-methods implementations\",function(){if(Ee.SUPPORT_STICKY?(n.chopInput=w.IDENTITY,n.match=n.matchWithTest):(n.updateLastIndex=w.NOOP,n.match=n.matchWithExec),o&&(n.handleModes=w.NOOP),n.trackStartLines===!1&&(n.computeNewColumn=w.IDENTITY),n.trackEndLines===!1&&(n.updateTokenEndLineColumnLocation=w.NOOP),/full/i.test(n.config.positionTracking))n.createTokenInstance=n.createFullToken;else if(/onlyStart/i.test(n.config.positionTracking))n.createTokenInstance=n.createStartOnlyToken;else if(/onlyOffset/i.test(n.config.positionTracking))n.createTokenInstance=n.createOffsetOnlyToken;else throw Error('Invalid <positionTracking> config option: \"'+n.config.positionTracking+'\"');n.hasCustom?(n.addToken=n.addTokenUsingPush,n.handlePayload=n.handlePayloadWithCustom):(n.addToken=n.addTokenUsingMemberAccess,n.handlePayload=n.handlePayloadNoCustom)}),n.TRACE_INIT(\"Failed Optimization Warnings\",function(){var p=w.reduce(n.canModeBeOptimized,function(l,m,v){return m===!1&&l.push(v),l},[]);if(r.ensureOptimizations&&!w.isEmpty(p))throw Error(\"Lexer Modes: < \"+p.join(\", \")+` > cannot be optimized.\n\t Disable the \"ensureOptimizations\" lexer config flag to silently ignore this and run the lexer in an un-optimized mode.\n\t Or inspect the console log for details on how to resolve these issues.`)}),n.TRACE_INIT(\"clearRegExpParserCache\",function(){ho.clearRegExpParserCache()}),n.TRACE_INIT(\"toFastProperties\",function(){w.toFastProperties(n)})})}return t.prototype.tokenize=function(e,r){if(r===void 0&&(r=this.defaultMode),!w.isEmpty(this.lexerDefinitionErrors)){var n=w.map(this.lexerDefinitionErrors,function(o){return o.message}),i=n.join(`-----------------------\n`);throw new Error(`Unable to Tokenize because Errors detected in definition of Lexer:\n`+i)}var a=this.tokenizeInternal(e,r);return a},t.prototype.tokenizeInternal=function(e,r){var n=this,i,a,o,s,c,f,p,l,m,v,u,d,A,_,g,y=e,b=y.length,L=0,se=0,fe=this.hasCustom?0:Math.floor(e.length/10),Z=new Array(fe),ue=[],Q=this.trackStartLines?1:void 0,te=this.trackStartLines?1:void 0,xe=Ee.cloneEmptyGroups(this.emptyGroups),it=this.trackStartLines,at=this.config.lineTerminatorsPattern,Ke=0,we=[],ot=[],It=[],Qr=[];Object.freeze(Qr);var st=void 0;function Jr(){return we}function en(J){var lt=Ee.charCodeToOptimizedIndex(J),ze=ot[lt];return ze===void 0?Qr:ze}var wa=function(J){if(It.length===1&&J.tokenType.PUSH_MODE===void 0){var lt=n.config.errorMessageProvider.buildUnableToPopLexerModeMessage(J);ue.push({offset:J.startOffset,line:J.startLine!==void 0?J.startLine:void 0,column:J.startColumn!==void 0?J.startColumn:void 0,length:J.image.length,message:lt})}else{It.pop();var ze=w.last(It);we=n.patternIdxToConfig[ze],ot=n.charCodeToPatternIdxToConfig[ze],Ke=we.length;var Ua=n.canModeBeOptimized[ze]&&n.config.safeMode===!1;ot&&Ua?st=en:st=Jr}};function tn(J){It.push(J),ot=this.charCodeToPatternIdxToConfig[J],we=this.patternIdxToConfig[J],Ke=we.length,Ke=we.length;var lt=this.canModeBeOptimized[J]&&this.config.safeMode===!1;ot&&lt?st=en:st=Jr}tn.call(this,r);for(var me;L<b;){c=null;var rn=y.charCodeAt(L),nn=st(rn),Da=nn.length;for(i=0;i<Da;i++){me=nn[i];var De=me.pattern;f=null;var ut=me.short;if(ut!==!1?rn===ut&&(c=De):me.isCustom===!0?(g=De.exec(y,L,Z,xe),g!==null?(c=g[0],g.payload!==void 0&&(f=g.payload)):c=null):(this.updateLastIndex(De,L),c=this.match(De,e,L)),c!==null){if(s=me.longerAlt,s!==void 0){var fr=we[s],pr=fr.pattern;p=null,fr.isCustom===!0?(g=pr.exec(y,L,Z,xe),g!==null?(o=g[0],g.payload!==void 0&&(p=g.payload)):o=null):(this.updateLastIndex(pr,L),o=this.match(pr,e,L)),o&&o.length>c.length&&(c=o,f=p,me=fr)}break}}if(c!==null){if(l=c.length,m=me.group,m!==void 0&&(v=me.tokenTypeIdx,u=this.createTokenInstance(c,L,v,me.tokenType,Q,te,l),this.handlePayload(u,f),m===!1?se=this.addToken(Z,se,u):xe[m].push(u)),e=this.chopInput(e,l),L=L+l,te=this.computeNewColumn(te,l),it===!0&&me.canLineTerminator===!0){var kt=0,hr=void 0,dr=void 0;at.lastIndex=0;do hr=at.test(c),hr===!0&&(dr=at.lastIndex-1,kt++);while(hr===!0);kt!==0&&(Q=Q+kt,te=l-dr,this.updateTokenEndLineColumnLocation(u,m,dr,kt,Q,te,l))}this.handleModes(me,wa,tn,u)}else{for(var vr=L,an=Q,on=te,ct=!1;!ct&&L<b;)for(A=y.charCodeAt(L),e=this.chopInput(e,1),L++,a=0;a<Ke;a++){var mr=we[a],De=mr.pattern,ut=mr.short;if(ut!==!1?y.charCodeAt(L)===ut&&(ct=!0):mr.isCustom===!0?ct=De.exec(y,L,Z,xe)!==null:(this.updateLastIndex(De,L),ct=De.exec(e)!==null),ct===!0)break}d=L-vr,_=this.config.errorMessageProvider.buildUnexpectedCharactersMessage(y,vr,d,an,on),ue.push({offset:vr,line:an,column:on,length:d,message:_})}}return this.hasCustom||(Z.length=se),{tokens:Z,groups:xe,errors:ue}},t.prototype.handleModes=function(e,r,n,i){if(e.pop===!0){var a=e.push;r(i),a!==void 0&&n.call(this,a)}else e.push!==void 0&&n.call(this,e.push)},t.prototype.chopInput=function(e,r){return e.substring(r)},t.prototype.updateLastIndex=function(e,r){e.lastIndex=r},t.prototype.updateTokenEndLineColumnLocation=function(e,r,n,i,a,o,s){var c,f;r!==void 0&&(c=n===s-1,f=c?-1:0,i===1&&c===!0||(e.endLine=a+f,e.endColumn=o-1+-f))},t.prototype.computeNewColumn=function(e,r){return e+r},t.prototype.createTokenInstance=function(){for(var e=[],r=0;r<arguments.length;r++)e[r]=arguments[r];return null},t.prototype.createOffsetOnlyToken=function(e,r,n,i){return{image:e,startOffset:r,tokenTypeIdx:n,tokenType:i}},t.prototype.createStartOnlyToken=function(e,r,n,i,a,o){return{image:e,startOffset:r,startLine:a,startColumn:o,tokenTypeIdx:n,tokenType:i}},t.prototype.createFullToken=function(e,r,n,i,a,o,s){return{image:e,startOffset:r,endOffset:r+s-1,startLine:a,endLine:a,startColumn:o,endColumn:o+s-1,tokenTypeIdx:n,tokenType:i}},t.prototype.addToken=function(e,r,n){return 666},t.prototype.addTokenUsingPush=function(e,r,n){return e.push(n),r},t.prototype.addTokenUsingMemberAccess=function(e,r,n){return e[r]=n,r++,r},t.prototype.handlePayload=function(e,r){},t.prototype.handlePayloadNoCustom=function(e,r){},t.prototype.handlePayloadWithCustom=function(e,r){r!==null&&(e.payload=r)},t.prototype.match=function(e,r,n){return null},t.prototype.matchWithTest=function(e,r,n){var i=e.test(r);return i===!0?r.substring(n,e.lastIndex):null},t.prototype.matchWithExec=function(e,r){var n=e.exec(r);return n!==null?n[0]:n},t.prototype.TRACE_INIT=function(e,r){if(this.traceInitPerf===!0){this.traceInitIndent++;var n=new Array(this.traceInitIndent+1).join(\"\t\");this.traceInitIndent<this.traceInitMaxIdent&&console.log(n+\"--> <\"+e+\">\");var i=w.timer(r),a=i.time,o=i.value,s=a>10?console.warn:console.log;return this.traceInitIndent<this.traceInitMaxIdent&&s(n+\"<-- <\"+e+\"> time: \"+a+\"ms\"),this.traceInitIndent--,o}else return r()},t.SKIPPED=\"This marks a skipped Token pattern, this means each token identified by it willbe consumed and then thrown into oblivion, this can be used to for example to completely ignore whitespace.\",t.NA=/NOT_APPLICABLE/,t}();qe.Lexer=mo});var Ue=R(H=>{\"use strict\";Object.defineProperty(H,\"__esModule\",{value:!0});H.tokenMatcher=H.createTokenInstance=H.EOF=H.createToken=H.hasTokenLabel=H.tokenName=H.tokenLabel=void 0;var Te=k(),Eo=ft(),Pr=Xe();function To(t){return Dn(t)?t.LABEL:t.name}H.tokenLabel=To;function yo(t){return t.name}H.tokenName=yo;function Dn(t){return Te.isString(t.LABEL)&&t.LABEL!==\"\"}H.hasTokenLabel=Dn;var _o=\"parent\",Un=\"categories\",Gn=\"label\",Wn=\"group\",Bn=\"push_mode\",qn=\"pop_mode\",jn=\"longer_alt\",Vn=\"line_breaks\",Kn=\"start_chars_hint\";function zn(t){return go(t)}H.createToken=zn;function go(t){var e=t.pattern,r={};if(r.name=t.name,Te.isUndefined(e)||(r.PATTERN=e),Te.has(t,_o))throw`The parent property is no longer supported.\nSee: https://github.com/chevrotain/chevrotain/issues/564#issuecomment-349062346 for details.`;return Te.has(t,Un)&&(r.CATEGORIES=t[Un]),Pr.augmentTokenTypes([r]),Te.has(t,Gn)&&(r.LABEL=t[Gn]),Te.has(t,Wn)&&(r.GROUP=t[Wn]),Te.has(t,qn)&&(r.POP_MODE=t[qn]),Te.has(t,Bn)&&(r.PUSH_MODE=t[Bn]),Te.has(t,jn)&&(r.LONGER_ALT=t[jn]),Te.has(t,Vn)&&(r.LINE_BREAKS=t[Vn]),Te.has(t,Kn)&&(r.START_CHARS_HINT=t[Kn]),r}H.EOF=zn({name:\"EOF\",pattern:Eo.Lexer.NA});Pr.augmentTokenTypes([H.EOF]);function Ao(t,e,r,n,i,a,o,s){return{image:e,startOffset:r,endOffset:n,startLine:i,endLine:a,startColumn:o,endColumn:s,tokenTypeIdx:t.tokenTypeIdx,tokenType:t}}H.createTokenInstance=Ao;function Ro(t,e){return Pr.tokenStructuredMatcher(t,e)}H.tokenMatcher=Ro});var ne=R(S=>{\"use strict\";var Le=S&&S.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,i){n.__proto__=i}||function(n,i){for(var a in i)Object.prototype.hasOwnProperty.call(i,a)&&(n[a]=i[a])},t(e,r)};return function(e,r){if(typeof r!=\"function\"&&r!==null)throw new TypeError(\"Class extends value \"+String(r)+\" is not a constructor or null\");t(e,r);function n(){this.constructor=e}e.prototype=r===null?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(S,\"__esModule\",{value:!0});S.serializeProduction=S.serializeGrammar=S.Terminal=S.Alternation=S.RepetitionWithSeparator=S.Repetition=S.RepetitionMandatoryWithSeparator=S.RepetitionMandatory=S.Option=S.Alternative=S.Rule=S.NonTerminal=S.AbstractProduction=void 0;var G=k(),Oo=Ue(),Re=function(){function t(e){this._definition=e}return Object.defineProperty(t.prototype,\"definition\",{get:function(){return this._definition},set:function(e){this._definition=e},enumerable:!1,configurable:!0}),t.prototype.accept=function(e){e.visit(this),G.forEach(this.definition,function(r){r.accept(e)})},t}();S.AbstractProduction=Re;var Hn=function(t){Le(e,t);function e(r){var n=t.call(this,[])||this;return n.idx=1,G.assign(n,G.pick(r,function(i){return i!==void 0})),n}return Object.defineProperty(e.prototype,\"definition\",{get:function(){return this.referencedRule!==void 0?this.referencedRule.definition:[]},set:function(r){},enumerable:!1,configurable:!0}),e.prototype.accept=function(r){r.visit(this)},e}(Re);S.NonTerminal=Hn;var Yn=function(t){Le(e,t);function e(r){var n=t.call(this,r.definition)||this;return n.orgText=\"\",G.assign(n,G.pick(r,function(i){return i!==void 0})),n}return e}(Re);S.Rule=Yn;var Xn=function(t){Le(e,t);function e(r){var n=t.call(this,r.definition)||this;return n.ignoreAmbiguities=!1,G.assign(n,G.pick(r,function(i){return i!==void 0})),n}return e}(Re);S.Alternative=Xn;var $n=function(t){Le(e,t);function e(r){var n=t.call(this,r.definition)||this;return n.idx=1,G.assign(n,G.pick(r,function(i){return i!==void 0})),n}return e}(Re);S.Option=$n;var Zn=function(t){Le(e,t);function e(r){var n=t.call(this,r.definition)||this;return n.idx=1,G.assign(n,G.pick(r,function(i){return i!==void 0})),n}return e}(Re);S.RepetitionMandatory=Zn;var Qn=function(t){Le(e,t);function e(r){var n=t.call(this,r.definition)||this;return n.idx=1,G.assign(n,G.pick(r,function(i){return i!==void 0})),n}return e}(Re);S.RepetitionMandatoryWithSeparator=Qn;var Jn=function(t){Le(e,t);function e(r){var n=t.call(this,r.definition)||this;return n.idx=1,G.assign(n,G.pick(r,function(i){return i!==void 0})),n}return e}(Re);S.Repetition=Jn;var ei=function(t){Le(e,t);function e(r){var n=t.call(this,r.definition)||this;return n.idx=1,G.assign(n,G.pick(r,function(i){return i!==void 0})),n}return e}(Re);S.RepetitionWithSeparator=ei;var ti=function(t){Le(e,t);function e(r){var n=t.call(this,r.definition)||this;return n.idx=1,n.ignoreAmbiguities=!1,n.hasPredicates=!1,G.assign(n,G.pick(r,function(i){return i!==void 0})),n}return Object.defineProperty(e.prototype,\"definition\",{get:function(){return this._definition},set:function(r){this._definition=r},enumerable:!1,configurable:!0}),e}(Re);S.Alternation=ti;var Dt=function(){function t(e){this.idx=1,G.assign(this,G.pick(e,function(r){return r!==void 0}))}return t.prototype.accept=function(e){e.visit(this)},t}();S.Terminal=Dt;function No(t){return G.map(t,ht)}S.serializeGrammar=No;function ht(t){function e(i){return G.map(i,ht)}if(t instanceof Hn)return{type:\"NonTerminal\",name:t.nonTerminalName,idx:t.idx};if(t instanceof Xn)return{type:\"Alternative\",definition:e(t.definition)};if(t instanceof $n)return{type:\"Option\",idx:t.idx,definition:e(t.definition)};if(t instanceof Zn)return{type:\"RepetitionMandatory\",idx:t.idx,definition:e(t.definition)};if(t instanceof Qn)return{type:\"RepetitionMandatoryWithSeparator\",idx:t.idx,separator:ht(new Dt({terminalType:t.separator})),definition:e(t.definition)};if(t instanceof ei)return{type:\"RepetitionWithSeparator\",idx:t.idx,separator:ht(new Dt({terminalType:t.separator})),definition:e(t.definition)};if(t instanceof Jn)return{type:\"Repetition\",idx:t.idx,definition:e(t.definition)};if(t instanceof ti)return{type:\"Alternation\",idx:t.idx,definition:e(t.definition)};if(t instanceof Dt){var r={type:\"Terminal\",name:t.terminalType.name,label:Oo.tokenLabel(t.terminalType),idx:t.idx},n=t.terminalType.PATTERN;return t.terminalType.PATTERN&&(r.pattern=G.isRegExp(n)?n.source:n),r}else{if(t instanceof Yn)return{type:\"Rule\",name:t.name,orgText:t.orgText,definition:e(t.definition)};throw Error(\"non exhaustive match\")}}S.serializeProduction=ht});var Gt=R(Ut=>{\"use strict\";Object.defineProperty(Ut,\"__esModule\",{value:!0});Ut.RestWalker=void 0;var Sr=k(),ie=ne(),Io=function(){function t(){}return t.prototype.walk=function(e,r){var n=this;r===void 0&&(r=[]),Sr.forEach(e.definition,function(i,a){var o=Sr.drop(e.definition,a+1);if(i instanceof ie.NonTerminal)n.walkProdRef(i,o,r);else if(i instanceof ie.Terminal)n.walkTerminal(i,o,r);else if(i instanceof ie.Alternative)n.walkFlat(i,o,r);else if(i instanceof ie.Option)n.walkOption(i,o,r);else if(i instanceof ie.RepetitionMandatory)n.walkAtLeastOne(i,o,r);else if(i instanceof ie.RepetitionMandatoryWithSeparator)n.walkAtLeastOneSep(i,o,r);else if(i instanceof ie.RepetitionWithSeparator)n.walkManySep(i,o,r);else if(i instanceof ie.Repetition)n.walkMany(i,o,r);else if(i instanceof ie.Alternation)n.walkOr(i,o,r);else throw Error(\"non exhaustive match\")})},t.prototype.walkTerminal=function(e,r,n){},t.prototype.walkProdRef=function(e,r,n){},t.prototype.walkFlat=function(e,r,n){var i=r.concat(n);this.walk(e,i)},t.prototype.walkOption=function(e,r,n){var i=r.concat(n);this.walk(e,i)},t.prototype.walkAtLeastOne=function(e,r,n){var i=[new ie.Option({definition:e.definition})].concat(r,n);this.walk(e,i)},t.prototype.walkAtLeastOneSep=function(e,r,n){var i=ri(e,r,n);this.walk(e,i)},t.prototype.walkMany=function(e,r,n){var i=[new ie.Option({definition:e.definition})].concat(r,n);this.walk(e,i)},t.prototype.walkManySep=function(e,r,n){var i=ri(e,r,n);this.walk(e,i)},t.prototype.walkOr=function(e,r,n){var i=this,a=r.concat(n);Sr.forEach(e.definition,function(o){var s=new ie.Alternative({definition:[o]});i.walk(s,a)})},t}();Ut.RestWalker=Io;function ri(t,e,r){var n=[new ie.Option({definition:[new ie.Terminal({terminalType:t.separator})].concat(t.definition)})],i=n.concat(e,r);return i}});var $e=R(Wt=>{\"use strict\";Object.defineProperty(Wt,\"__esModule\",{value:!0});Wt.GAstVisitor=void 0;var Oe=ne(),ko=function(){function t(){}return t.prototype.visit=function(e){var r=e;switch(r.constructor){case Oe.NonTerminal:return this.visitNonTerminal(r);case Oe.Alternative:return this.visitAlternative(r);case Oe.Option:return this.visitOption(r);case Oe.RepetitionMandatory:return this.visitRepetitionMandatory(r);case Oe.RepetitionMandatoryWithSeparator:return this.visitRepetitionMandatoryWithSeparator(r);case Oe.RepetitionWithSeparator:return this.visitRepetitionWithSeparator(r);case Oe.Repetition:return this.visitRepetition(r);case Oe.Alternation:return this.visitAlternation(r);case Oe.Terminal:return this.visitTerminal(r);case Oe.Rule:return this.visitRule(r);default:throw Error(\"non exhaustive match\")}},t.prototype.visitNonTerminal=function(e){},t.prototype.visitAlternative=function(e){},t.prototype.visitOption=function(e){},t.prototype.visitRepetition=function(e){},t.prototype.visitRepetitionMandatory=function(e){},t.prototype.visitRepetitionMandatoryWithSeparator=function(e){},t.prototype.visitRepetitionWithSeparator=function(e){},t.prototype.visitAlternation=function(e){},t.prototype.visitTerminal=function(e){},t.prototype.visitRule=function(e){},t}();Wt.GAstVisitor=ko});var vt=R(X=>{\"use strict\";var Po=X&&X.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,i){n.__proto__=i}||function(n,i){for(var a in i)Object.prototype.hasOwnProperty.call(i,a)&&(n[a]=i[a])},t(e,r)};return function(e,r){if(typeof r!=\"function\"&&r!==null)throw new TypeError(\"Class extends value \"+String(r)+\" is not a constructor or null\");t(e,r);function n(){this.constructor=e}e.prototype=r===null?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(X,\"__esModule\",{value:!0});X.collectMethods=X.DslMethodsCollectorVisitor=X.getProductionDslName=X.isBranchingProd=X.isOptionalProd=X.isSequenceProd=void 0;var dt=k(),W=ne(),So=$e();function xo(t){return t instanceof W.Alternative||t instanceof W.Option||t instanceof W.Repetition||t instanceof W.RepetitionMandatory||t instanceof W.RepetitionMandatoryWithSeparator||t instanceof W.RepetitionWithSeparator||t instanceof W.Terminal||t instanceof W.Rule}X.isSequenceProd=xo;function xr(t,e){e===void 0&&(e=[]);var r=t instanceof W.Option||t instanceof W.Repetition||t instanceof W.RepetitionWithSeparator;return r?!0:t instanceof W.Alternation?dt.some(t.definition,function(n){return xr(n,e)}):t instanceof W.NonTerminal&&dt.contains(e,t)?!1:t instanceof W.AbstractProduction?(t instanceof W.NonTerminal&&e.push(t),dt.every(t.definition,function(n){return xr(n,e)})):!1}X.isOptionalProd=xr;function Co(t){return t instanceof W.Alternation}X.isBranchingProd=Co;function Lo(t){if(t instanceof W.NonTerminal)return\"SUBRULE\";if(t instanceof W.Option)return\"OPTION\";if(t instanceof W.Alternation)return\"OR\";if(t instanceof W.RepetitionMandatory)return\"AT_LEAST_ONE\";if(t instanceof W.RepetitionMandatoryWithSeparator)return\"AT_LEAST_ONE_SEP\";if(t instanceof W.RepetitionWithSeparator)return\"MANY_SEP\";if(t instanceof W.Repetition)return\"MANY\";if(t instanceof W.Terminal)return\"CONSUME\";throw Error(\"non exhaustive match\")}X.getProductionDslName=Lo;var ni=function(t){Po(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.separator=\"-\",r.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]},r}return e.prototype.reset=function(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}},e.prototype.visitTerminal=function(r){var n=r.terminalType.name+this.separator+\"Terminal\";dt.has(this.dslMethods,n)||(this.dslMethods[n]=[]),this.dslMethods[n].push(r)},e.prototype.visitNonTerminal=function(r){var n=r.nonTerminalName+this.separator+\"Terminal\";dt.has(this.dslMethods,n)||(this.dslMethods[n]=[]),this.dslMethods[n].push(r)},e.prototype.visitOption=function(r){this.dslMethods.option.push(r)},e.prototype.visitRepetitionWithSeparator=function(r){this.dslMethods.repetitionWithSeparator.push(r)},e.prototype.visitRepetitionMandatory=function(r){this.dslMethods.repetitionMandatory.push(r)},e.prototype.visitRepetitionMandatoryWithSeparator=function(r){this.dslMethods.repetitionMandatoryWithSeparator.push(r)},e.prototype.visitRepetition=function(r){this.dslMethods.repetition.push(r)},e.prototype.visitAlternation=function(r){this.dslMethods.alternation.push(r)},e}(So.GAstVisitor);X.DslMethodsCollectorVisitor=ni;var Bt=new ni;function Mo(t){Bt.reset(),t.accept(Bt);var e=Bt.dslMethods;return Bt.reset(),e}X.collectMethods=Mo});var Lr=R(Ne=>{\"use strict\";Object.defineProperty(Ne,\"__esModule\",{value:!0});Ne.firstForTerminal=Ne.firstForBranching=Ne.firstForSequence=Ne.first=void 0;var qt=k(),ii=ne(),Cr=vt();function jt(t){if(t instanceof ii.NonTerminal)return jt(t.referencedRule);if(t instanceof ii.Terminal)return si(t);if(Cr.isSequenceProd(t))return ai(t);if(Cr.isBranchingProd(t))return oi(t);throw Error(\"non exhaustive match\")}Ne.first=jt;function ai(t){for(var e=[],r=t.definition,n=0,i=r.length>n,a,o=!0;i&&o;)a=r[n],o=Cr.isOptionalProd(a),e=e.concat(jt(a)),n=n+1,i=r.length>n;return qt.uniq(e)}Ne.firstForSequence=ai;function oi(t){var e=qt.map(t.definition,function(r){return jt(r)});return qt.uniq(qt.flatten(e))}Ne.firstForBranching=oi;function si(t){return[t.terminalType]}Ne.firstForTerminal=si});var Mr=R(Vt=>{\"use strict\";Object.defineProperty(Vt,\"__esModule\",{value:!0});Vt.IN=void 0;Vt.IN=\"_~IN~_\"});var pi=R(he=>{\"use strict\";var bo=he&&he.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,i){n.__proto__=i}||function(n,i){for(var a in i)Object.prototype.hasOwnProperty.call(i,a)&&(n[a]=i[a])},t(e,r)};return function(e,r){if(typeof r!=\"function\"&&r!==null)throw new TypeError(\"Class extends value \"+String(r)+\" is not a constructor or null\");t(e,r);function n(){this.constructor=e}e.prototype=r===null?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(he,\"__esModule\",{value:!0});he.buildInProdFollowPrefix=he.buildBetweenProdsFollowPrefix=he.computeAllProdsFollows=he.ResyncFollowsWalker=void 0;var Fo=Gt(),wo=Lr(),ui=k(),ci=Mr(),Do=ne(),fi=function(t){bo(e,t);function e(r){var n=t.call(this)||this;return n.topProd=r,n.follows={},n}return e.prototype.startWalking=function(){return this.walk(this.topProd),this.follows},e.prototype.walkTerminal=function(r,n,i){},e.prototype.walkProdRef=function(r,n,i){var a=li(r.referencedRule,r.idx)+this.topProd.name,o=n.concat(i),s=new Do.Alternative({definition:o}),c=wo.first(s);this.follows[a]=c},e}(Fo.RestWalker);he.ResyncFollowsWalker=fi;function Uo(t){var e={};return ui.forEach(t,function(r){var n=new fi(r).startWalking();ui.assign(e,n)}),e}he.computeAllProdsFollows=Uo;function li(t,e){return t.name+e+ci.IN}he.buildBetweenProdsFollowPrefix=li;function Go(t){var e=t.terminalType.name;return e+t.idx+ci.IN}he.buildInProdFollowPrefix=Go});var mt=R(Me=>{\"use strict\";Object.defineProperty(Me,\"__esModule\",{value:!0});Me.defaultGrammarValidatorErrorProvider=Me.defaultGrammarResolverErrorProvider=Me.defaultParserErrorProvider=void 0;var Ze=Ue(),Wo=k(),ye=k(),br=ne(),hi=vt();Me.defaultParserErrorProvider={buildMismatchTokenMessage:function(t){var e=t.expected,r=t.actual,n=t.previous,i=t.ruleName,a=Ze.hasTokenLabel(e),o=a?\"--> \"+Ze.tokenLabel(e)+\" <--\":\"token of type --> \"+e.name+\" <--\",s=\"Expecting \"+o+\" but found --> '\"+r.image+\"' <--\";return s},buildNotAllInputParsedMessage:function(t){var e=t.firstRedundant,r=t.ruleName;return\"Redundant input, expecting EOF but found: \"+e.image},buildNoViableAltMessage:function(t){var e=t.expectedPathsPerAlt,r=t.actual,n=t.previous,i=t.customUserDescription,a=t.ruleName,o=\"Expecting: \",s=ye.first(r).image,c=`\nbut found: '`+s+\"'\";if(i)return o+i+c;var f=ye.reduce(e,function(v,u){return v.concat(u)},[]),p=ye.map(f,function(v){return\"[\"+ye.map(v,function(u){return Ze.tokenLabel(u)}).join(\", \")+\"]\"}),l=ye.map(p,function(v,u){return\"  \"+(u+1)+\". \"+v}),m=`one of these possible Token sequences:\n`+l.join(`\n`);return o+m+c},buildEarlyExitMessage:function(t){var e=t.expectedIterationPaths,r=t.actual,n=t.customUserDescription,i=t.ruleName,a=\"Expecting: \",o=ye.first(r).image,s=`\nbut found: '`+o+\"'\";if(n)return a+n+s;var c=ye.map(e,function(p){return\"[\"+ye.map(p,function(l){return Ze.tokenLabel(l)}).join(\",\")+\"]\"}),f=`expecting at least one iteration which starts with one of these possible Token sequences::\n  `+(\"<\"+c.join(\" ,\")+\">\");return a+f+s}};Object.freeze(Me.defaultParserErrorProvider);Me.defaultGrammarResolverErrorProvider={buildRuleNotFoundError:function(t,e){var r=\"Invalid grammar, reference to a rule which is not defined: ->\"+e.nonTerminalName+`<-\ninside top level rule: ->`+t.name+\"<-\";return r}};Me.defaultGrammarValidatorErrorProvider={buildDuplicateFoundError:function(t,e){function r(p){return p instanceof br.Terminal?p.terminalType.name:p instanceof br.NonTerminal?p.nonTerminalName:\"\"}var n=t.name,i=ye.first(e),a=i.idx,o=hi.getProductionDslName(i),s=r(i),c=a>0,f=\"->\"+o+(c?a:\"\")+\"<- \"+(s?\"with argument: ->\"+s+\"<-\":\"\")+`\n                  appears more than once (`+e.length+\" times) in the top level rule: ->\"+n+`<-.\n                  For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES\n                  `;return f=f.replace(/[ \\t]+/g,\" \"),f=f.replace(/\\s\\s+/g,`\n`),f},buildNamespaceConflictError:function(t){var e=`Namespace conflict found in grammar.\n`+(\"The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <\"+t.name+`>.\n`)+`To resolve this make sure each Terminal and Non-Terminal names are unique\nThis is easy to accomplish by using the convention that Terminal names start with an uppercase letter\nand Non-Terminal names start with a lower case letter.`;return e},buildAlternationPrefixAmbiguityError:function(t){var e=ye.map(t.prefixPath,function(i){return Ze.tokenLabel(i)}).join(\", \"),r=t.alternation.idx===0?\"\":t.alternation.idx,n=\"Ambiguous alternatives: <\"+t.ambiguityIndices.join(\" ,\")+`> due to common lookahead prefix\n`+(\"in <OR\"+r+\"> inside <\"+t.topLevelRule.name+`> Rule,\n`)+(\"<\"+e+`> may appears as a prefix path in all these alternatives.\n`)+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX\nFor Further details.`;return n},buildAlternationAmbiguityError:function(t){var e=ye.map(t.prefixPath,function(i){return Ze.tokenLabel(i)}).join(\", \"),r=t.alternation.idx===0?\"\":t.alternation.idx,n=\"Ambiguous Alternatives Detected: <\"+t.ambiguityIndices.join(\" ,\")+\"> in <OR\"+r+\">\"+(\" inside <\"+t.topLevelRule.name+`> Rule,\n`)+(\"<\"+e+`> may appears as a prefix path in all these alternatives.\n`);return n=n+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES\nFor Further details.`,n},buildEmptyRepetitionError:function(t){var e=hi.getProductionDslName(t.repetition);t.repetition.idx!==0&&(e+=t.repetition.idx);var r=\"The repetition <\"+e+\"> within Rule <\"+t.topLevelRule.name+`> can never consume any tokens.\nThis could lead to an infinite loop.`;return r},buildTokenNameError:function(t){return\"deprecated\"},buildEmptyAlternationError:function(t){var e=\"Ambiguous empty alternative: <\"+(t.emptyChoiceIdx+1)+\">\"+(\" in <OR\"+t.alternation.idx+\"> inside <\"+t.topLevelRule.name+`> Rule.\n`)+\"Only the last alternative may be an empty alternative.\";return e},buildTooManyAlternativesError:function(t){var e=`An Alternation cannot have more than 256 alternatives:\n`+(\"<OR\"+t.alternation.idx+\"> inside <\"+t.topLevelRule.name+`> Rule.\n has `+(t.alternation.definition.length+1)+\" alternatives.\");return e},buildLeftRecursionError:function(t){var e=t.topLevelRule.name,r=Wo.map(t.leftRecursionPath,function(a){return a.name}),n=e+\" --> \"+r.concat([e]).join(\" --> \"),i=`Left Recursion found in grammar.\n`+(\"rule: <\"+e+`> can be invoked from itself (directly or indirectly)\n`)+(`without consuming any Tokens. The grammar path that causes this is:\n `+n+`\n`)+` To fix this refactor your grammar to remove the left recursion.\nsee: https://en.wikipedia.org/wiki/LL_parser#Left_Factoring.`;return i},buildInvalidRuleNameError:function(t){return\"deprecated\"},buildDuplicateRuleNameError:function(t){var e;t.topLevelRule instanceof br.Rule?e=t.topLevelRule.name:e=t.topLevelRule;var r=\"Duplicate definition, rule: ->\"+e+\"<- is already defined in the grammar: ->\"+t.grammarName+\"<-\";return r}}});var mi=R(Ge=>{\"use strict\";var Bo=Ge&&Ge.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,i){n.__proto__=i}||function(n,i){for(var a in i)Object.prototype.hasOwnProperty.call(i,a)&&(n[a]=i[a])},t(e,r)};return function(e,r){if(typeof r!=\"function\"&&r!==null)throw new TypeError(\"Class extends value \"+String(r)+\" is not a constructor or null\");t(e,r);function n(){this.constructor=e}e.prototype=r===null?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(Ge,\"__esModule\",{value:!0});Ge.GastRefResolverVisitor=Ge.resolveGrammar=void 0;var qo=ce(),di=k(),jo=$e();function Vo(t,e){var r=new vi(t,e);return r.resolveRefs(),r.errors}Ge.resolveGrammar=Vo;var vi=function(t){Bo(e,t);function e(r,n){var i=t.call(this)||this;return i.nameToTopRule=r,i.errMsgProvider=n,i.errors=[],i}return e.prototype.resolveRefs=function(){var r=this;di.forEach(di.values(this.nameToTopRule),function(n){r.currTopLevel=n,n.accept(r)})},e.prototype.visitNonTerminal=function(r){var n=this.nameToTopRule[r.nonTerminalName];if(n)r.referencedRule=n;else{var i=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,r);this.errors.push({message:i,type:qo.ParserDefinitionErrorType.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:r.nonTerminalName})}},e}(jo.GAstVisitor);Ge.GastRefResolverVisitor=vi});var Tt=R(j=>{\"use strict\";var je=j&&j.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,i){n.__proto__=i}||function(n,i){for(var a in i)Object.prototype.hasOwnProperty.call(i,a)&&(n[a]=i[a])},t(e,r)};return function(e,r){if(typeof r!=\"function\"&&r!==null)throw new TypeError(\"Class extends value \"+String(r)+\" is not a constructor or null\");t(e,r);function n(){this.constructor=e}e.prototype=r===null?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(j,\"__esModule\",{value:!0});j.nextPossibleTokensAfter=j.possiblePathsFrom=j.NextTerminalAfterAtLeastOneSepWalker=j.NextTerminalAfterAtLeastOneWalker=j.NextTerminalAfterManySepWalker=j.NextTerminalAfterManyWalker=j.AbstractNextTerminalAfterProductionWalker=j.NextAfterTokenWalker=j.AbstractNextPossibleTokensWalker=void 0;var Ei=Gt(),I=k(),Ko=Lr(),O=ne(),Ti=function(t){je(e,t);function e(r,n){var i=t.call(this)||this;return i.topProd=r,i.path=n,i.possibleTokTypes=[],i.nextProductionName=\"\",i.nextProductionOccurrence=0,i.found=!1,i.isAtEndOfPath=!1,i}return e.prototype.startWalking=function(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error(\"The path does not start with the walker's top Rule!\");return this.ruleStack=I.cloneArr(this.path.ruleStack).reverse(),this.occurrenceStack=I.cloneArr(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes},e.prototype.walk=function(r,n){n===void 0&&(n=[]),this.found||t.prototype.walk.call(this,r,n)},e.prototype.walkProdRef=function(r,n,i){if(r.referencedRule.name===this.nextProductionName&&r.idx===this.nextProductionOccurrence){var a=n.concat(i);this.updateExpectedNext(),this.walk(r.referencedRule,a)}},e.prototype.updateExpectedNext=function(){I.isEmpty(this.ruleStack)?(this.nextProductionName=\"\",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())},e}(Ei.RestWalker);j.AbstractNextPossibleTokensWalker=Ti;var zo=function(t){je(e,t);function e(r,n){var i=t.call(this,r,n)||this;return i.path=n,i.nextTerminalName=\"\",i.nextTerminalOccurrence=0,i.nextTerminalName=i.path.lastTok.name,i.nextTerminalOccurrence=i.path.lastTokOccurrence,i}return e.prototype.walkTerminal=function(r,n,i){if(this.isAtEndOfPath&&r.terminalType.name===this.nextTerminalName&&r.idx===this.nextTerminalOccurrence&&!this.found){var a=n.concat(i),o=new O.Alternative({definition:a});this.possibleTokTypes=Ko.first(o),this.found=!0}},e}(Ti);j.NextAfterTokenWalker=zo;var Et=function(t){je(e,t);function e(r,n){var i=t.call(this)||this;return i.topRule=r,i.occurrence=n,i.result={token:void 0,occurrence:void 0,isEndOfRule:void 0},i}return e.prototype.startWalking=function(){return this.walk(this.topRule),this.result},e}(Ei.RestWalker);j.AbstractNextTerminalAfterProductionWalker=Et;var Ho=function(t){je(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.walkMany=function(r,n,i){if(r.idx===this.occurrence){var a=I.first(n.concat(i));this.result.isEndOfRule=a===void 0,a instanceof O.Terminal&&(this.result.token=a.terminalType,this.result.occurrence=a.idx)}else t.prototype.walkMany.call(this,r,n,i)},e}(Et);j.NextTerminalAfterManyWalker=Ho;var Yo=function(t){je(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.walkManySep=function(r,n,i){if(r.idx===this.occurrence){var a=I.first(n.concat(i));this.result.isEndOfRule=a===void 0,a instanceof O.Terminal&&(this.result.token=a.terminalType,this.result.occurrence=a.idx)}else t.prototype.walkManySep.call(this,r,n,i)},e}(Et);j.NextTerminalAfterManySepWalker=Yo;var Xo=function(t){je(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.walkAtLeastOne=function(r,n,i){if(r.idx===this.occurrence){var a=I.first(n.concat(i));this.result.isEndOfRule=a===void 0,a instanceof O.Terminal&&(this.result.token=a.terminalType,this.result.occurrence=a.idx)}else t.prototype.walkAtLeastOne.call(this,r,n,i)},e}(Et);j.NextTerminalAfterAtLeastOneWalker=Xo;var $o=function(t){je(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.walkAtLeastOneSep=function(r,n,i){if(r.idx===this.occurrence){var a=I.first(n.concat(i));this.result.isEndOfRule=a===void 0,a instanceof O.Terminal&&(this.result.token=a.terminalType,this.result.occurrence=a.idx)}else t.prototype.walkAtLeastOneSep.call(this,r,n,i)},e}(Et);j.NextTerminalAfterAtLeastOneSepWalker=$o;function yi(t,e,r){r===void 0&&(r=[]),r=I.cloneArr(r);var n=[],i=0;function a(f){return f.concat(I.drop(t,i+1))}function o(f){var p=yi(a(f),e,r);return n.concat(p)}for(;r.length<e&&i<t.length;){var s=t[i];if(s instanceof O.Alternative)return o(s.definition);if(s instanceof O.NonTerminal)return o(s.definition);if(s instanceof O.Option)n=o(s.definition);else if(s instanceof O.RepetitionMandatory){var c=s.definition.concat([new O.Repetition({definition:s.definition})]);return o(c)}else if(s instanceof O.RepetitionMandatoryWithSeparator){var c=[new O.Alternative({definition:s.definition}),new O.Repetition({definition:[new O.Terminal({terminalType:s.separator})].concat(s.definition)})];return o(c)}else if(s instanceof O.RepetitionWithSeparator){var c=s.definition.concat([new O.Repetition({definition:[new O.Terminal({terminalType:s.separator})].concat(s.definition)})]);n=o(c)}else if(s instanceof O.Repetition){var c=s.definition.concat([new O.Repetition({definition:s.definition})]);n=o(c)}else{if(s instanceof O.Alternation)return I.forEach(s.definition,function(f){I.isEmpty(f.definition)===!1&&(n=o(f.definition))}),n;if(s instanceof O.Terminal)r.push(s.terminalType);else throw Error(\"non exhaustive match\")}i++}return n.push({partialPath:r,suffixDef:I.drop(t,i)}),n}j.possiblePathsFrom=yi;function Qo(t,e,r,n){var i=\"EXIT_NONE_TERMINAL\",a=[i],o=\"EXIT_ALTERNATIVE\",s=!1,c=e.length,f=c-n-1,p=[],l=[];for(l.push({idx:-1,def:t,ruleStack:[],occurrenceStack:[]});!I.isEmpty(l);){var m=l.pop();if(m===o){s&&I.last(l).idx<=f&&l.pop();continue}var v=m.def,u=m.idx,d=m.ruleStack,A=m.occurrenceStack;if(!I.isEmpty(v)){var _=v[0];if(_===i){var g={idx:u,def:I.drop(v),ruleStack:I.dropRight(d),occurrenceStack:I.dropRight(A)};l.push(g)}else if(_ instanceof O.Terminal)if(u<c-1){var y=u+1,b=e[y];if(r(b,_.terminalType)){var g={idx:y,def:I.drop(v),ruleStack:d,occurrenceStack:A};l.push(g)}}else if(u===c-1)p.push({nextTokenType:_.terminalType,nextTokenOccurrence:_.idx,ruleStack:d,occurrenceStack:A}),s=!0;else throw Error(\"non exhaustive match\");else if(_ instanceof O.NonTerminal){var L=I.cloneArr(d);L.push(_.nonTerminalName);var se=I.cloneArr(A);se.push(_.idx);var g={idx:u,def:_.definition.concat(a,I.drop(v)),ruleStack:L,occurrenceStack:se};l.push(g)}else if(_ instanceof O.Option){var fe={idx:u,def:I.drop(v),ruleStack:d,occurrenceStack:A};l.push(fe),l.push(o);var Z={idx:u,def:_.definition.concat(I.drop(v)),ruleStack:d,occurrenceStack:A};l.push(Z)}else if(_ instanceof O.RepetitionMandatory){var ue=new O.Repetition({definition:_.definition,idx:_.idx}),Q=_.definition.concat([ue],I.drop(v)),g={idx:u,def:Q,ruleStack:d,occurrenceStack:A};l.push(g)}else if(_ instanceof O.RepetitionMandatoryWithSeparator){var te=new O.Terminal({terminalType:_.separator}),ue=new O.Repetition({definition:[te].concat(_.definition),idx:_.idx}),Q=_.definition.concat([ue],I.drop(v)),g={idx:u,def:Q,ruleStack:d,occurrenceStack:A};l.push(g)}else if(_ instanceof O.RepetitionWithSeparator){var fe={idx:u,def:I.drop(v),ruleStack:d,occurrenceStack:A};l.push(fe),l.push(o);var te=new O.Terminal({terminalType:_.separator}),xe=new O.Repetition({definition:[te].concat(_.definition),idx:_.idx}),Q=_.definition.concat([xe],I.drop(v)),Z={idx:u,def:Q,ruleStack:d,occurrenceStack:A};l.push(Z)}else if(_ instanceof O.Repetition){var fe={idx:u,def:I.drop(v),ruleStack:d,occurrenceStack:A};l.push(fe),l.push(o);var xe=new O.Repetition({definition:_.definition,idx:_.idx}),Q=_.definition.concat([xe],I.drop(v)),Z={idx:u,def:Q,ruleStack:d,occurrenceStack:A};l.push(Z)}else if(_ instanceof O.Alternation)for(var it=_.definition.length-1;it>=0;it--){var at=_.definition[it],Ke={idx:u,def:at.definition.concat(I.drop(v)),ruleStack:d,occurrenceStack:A};l.push(Ke),l.push(o)}else if(_ instanceof O.Alternative)l.push({idx:u,def:_.definition.concat(I.drop(v)),ruleStack:d,occurrenceStack:A});else if(_ instanceof O.Rule)l.push(Zo(_,u,d,A));else throw Error(\"non exhaustive match\")}}return p}j.nextPossibleTokensAfter=Qo;function Zo(t,e,r,n){var i=I.cloneArr(r);i.push(t.name);var a=I.cloneArr(n);return a.push(1),{idx:e,def:t.definition,ruleStack:i,occurrenceStack:a}}});var yt=R(C=>{\"use strict\";var _i=C&&C.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,i){n.__proto__=i}||function(n,i){for(var a in i)Object.prototype.hasOwnProperty.call(i,a)&&(n[a]=i[a])},t(e,r)};return function(e,r){if(typeof r!=\"function\"&&r!==null)throw new TypeError(\"Class extends value \"+String(r)+\" is not a constructor or null\");t(e,r);function n(){this.constructor=e}e.prototype=r===null?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(C,\"__esModule\",{value:!0});C.areTokenCategoriesNotUsed=C.isStrictPrefixOfPath=C.containsPath=C.getLookaheadPathsForOptionalProd=C.getLookaheadPathsForOr=C.lookAheadSequenceFromAlternatives=C.buildSingleAlternativeLookaheadFunction=C.buildAlternativesLookAheadFunc=C.buildLookaheadFuncForOptionalProd=C.buildLookaheadFuncForOr=C.getProdType=C.PROD_TYPE=void 0;var D=k(),gi=Tt(),Jo=Gt(),Kt=Xe(),We=ne(),es=$e(),z;(function(t){t[t.OPTION=0]=\"OPTION\",t[t.REPETITION=1]=\"REPETITION\",t[t.REPETITION_MANDATORY=2]=\"REPETITION_MANDATORY\",t[t.REPETITION_MANDATORY_WITH_SEPARATOR=3]=\"REPETITION_MANDATORY_WITH_SEPARATOR\",t[t.REPETITION_WITH_SEPARATOR=4]=\"REPETITION_WITH_SEPARATOR\",t[t.ALTERNATION=5]=\"ALTERNATION\"})(z=C.PROD_TYPE||(C.PROD_TYPE={}));function ts(t){if(t instanceof We.Option)return z.OPTION;if(t instanceof We.Repetition)return z.REPETITION;if(t instanceof We.RepetitionMandatory)return z.REPETITION_MANDATORY;if(t instanceof We.RepetitionMandatoryWithSeparator)return z.REPETITION_MANDATORY_WITH_SEPARATOR;if(t instanceof We.RepetitionWithSeparator)return z.REPETITION_WITH_SEPARATOR;if(t instanceof We.Alternation)return z.ALTERNATION;throw Error(\"non exhaustive match\")}C.getProdType=ts;function rs(t,e,r,n,i,a){var o=Ai(t,e,r),s=Fr(o)?Kt.tokenStructuredMatcherNoCategories:Kt.tokenStructuredMatcher;return a(o,n,s,i)}C.buildLookaheadFuncForOr=rs;function ns(t,e,r,n,i,a){var o=Ri(t,e,i,r),s=Fr(o)?Kt.tokenStructuredMatcherNoCategories:Kt.tokenStructuredMatcher;return a(o[0],s,n)}C.buildLookaheadFuncForOptionalProd=ns;function is(t,e,r,n){var i=t.length,a=D.every(t,function(c){return D.every(c,function(f){return f.length===1})});if(e)return function(c){for(var f=D.map(c,function(y){return y.GATE}),p=0;p<i;p++){var l=t[p],m=l.length,v=f[p];if(v!==void 0&&v.call(this)===!1)continue;e:for(var u=0;u<m;u++){for(var d=l[u],A=d.length,_=0;_<A;_++){var g=this.LA(_+1);if(r(g,d[_])===!1)continue e}return p}}};if(a&&!n){var o=D.map(t,function(c){return D.flatten(c)}),s=D.reduce(o,function(c,f,p){return D.forEach(f,function(l){D.has(c,l.tokenTypeIdx)||(c[l.tokenTypeIdx]=p),D.forEach(l.categoryMatches,function(m){D.has(c,m)||(c[m]=p)})}),c},[]);return function(){var c=this.LA(1);return s[c.tokenTypeIdx]}}else return function(){for(var c=0;c<i;c++){var f=t[c],p=f.length;e:for(var l=0;l<p;l++){for(var m=f[l],v=m.length,u=0;u<v;u++){var d=this.LA(u+1);if(r(d,m[u])===!1)continue e}return c}}}}C.buildAlternativesLookAheadFunc=is;function as(t,e,r){var n=D.every(t,function(f){return f.length===1}),i=t.length;if(n&&!r){var a=D.flatten(t);if(a.length===1&&D.isEmpty(a[0].categoryMatches)){var o=a[0],s=o.tokenTypeIdx;return function(){return this.LA(1).tokenTypeIdx===s}}else{var c=D.reduce(a,function(f,p,l){return f[p.tokenTypeIdx]=!0,D.forEach(p.categoryMatches,function(m){f[m]=!0}),f},[]);return function(){var f=this.LA(1);return c[f.tokenTypeIdx]===!0}}}else return function(){e:for(var f=0;f<i;f++){for(var p=t[f],l=p.length,m=0;m<l;m++){var v=this.LA(m+1);if(e(v,p[m])===!1)continue e}return!0}return!1}}C.buildSingleAlternativeLookaheadFunction=as;var os=function(t){_i(e,t);function e(r,n,i){var a=t.call(this)||this;return a.topProd=r,a.targetOccurrence=n,a.targetProdType=i,a}return e.prototype.startWalking=function(){return this.walk(this.topProd),this.restDef},e.prototype.checkIsTarget=function(r,n,i,a){return r.idx===this.targetOccurrence&&this.targetProdType===n?(this.restDef=i.concat(a),!0):!1},e.prototype.walkOption=function(r,n,i){this.checkIsTarget(r,z.OPTION,n,i)||t.prototype.walkOption.call(this,r,n,i)},e.prototype.walkAtLeastOne=function(r,n,i){this.checkIsTarget(r,z.REPETITION_MANDATORY,n,i)||t.prototype.walkOption.call(this,r,n,i)},e.prototype.walkAtLeastOneSep=function(r,n,i){this.checkIsTarget(r,z.REPETITION_MANDATORY_WITH_SEPARATOR,n,i)||t.prototype.walkOption.call(this,r,n,i)},e.prototype.walkMany=function(r,n,i){this.checkIsTarget(r,z.REPETITION,n,i)||t.prototype.walkOption.call(this,r,n,i)},e.prototype.walkManySep=function(r,n,i){this.checkIsTarget(r,z.REPETITION_WITH_SEPARATOR,n,i)||t.prototype.walkOption.call(this,r,n,i)},e}(Jo.RestWalker),Oi=function(t){_i(e,t);function e(r,n,i){var a=t.call(this)||this;return a.targetOccurrence=r,a.targetProdType=n,a.targetRef=i,a.result=[],a}return e.prototype.checkIsTarget=function(r,n){r.idx===this.targetOccurrence&&this.targetProdType===n&&(this.targetRef===void 0||r===this.targetRef)&&(this.result=r.definition)},e.prototype.visitOption=function(r){this.checkIsTarget(r,z.OPTION)},e.prototype.visitRepetition=function(r){this.checkIsTarget(r,z.REPETITION)},e.prototype.visitRepetitionMandatory=function(r){this.checkIsTarget(r,z.REPETITION_MANDATORY)},e.prototype.visitRepetitionMandatoryWithSeparator=function(r){this.checkIsTarget(r,z.REPETITION_MANDATORY_WITH_SEPARATOR)},e.prototype.visitRepetitionWithSeparator=function(r){this.checkIsTarget(r,z.REPETITION_WITH_SEPARATOR)},e.prototype.visitAlternation=function(r){this.checkIsTarget(r,z.ALTERNATION)},e}(es.GAstVisitor);function Ni(t){for(var e=new Array(t),r=0;r<t;r++)e[r]=[];return e}function wr(t){for(var e=[\"\"],r=0;r<t.length;r++){for(var n=t[r],i=[],a=0;a<e.length;a++){var o=e[a];i.push(o+\"_\"+n.tokenTypeIdx);for(var s=0;s<n.categoryMatches.length;s++){var c=\"_\"+n.categoryMatches[s];i.push(o+c)}}e=i}return e}function ss(t,e,r){for(var n=0;n<t.length;n++)if(n!==r)for(var i=t[n],a=0;a<e.length;a++){var o=e[a];if(i[o]===!0)return!1}return!0}function Dr(t,e){for(var r=D.map(t,function(p){return gi.possiblePathsFrom([p],1)}),n=Ni(r.length),i=D.map(r,function(p){var l={};return D.forEach(p,function(m){var v=wr(m.partialPath);D.forEach(v,function(u){l[u]=!0})}),l}),a=r,o=1;o<=e;o++){var s=a;a=Ni(s.length);for(var c=function(p){for(var l=s[p],m=0;m<l.length;m++){var v=l[m].partialPath,u=l[m].suffixDef,d=wr(v),A=ss(i,d,p);if(A||D.isEmpty(u)||v.length===e){var _=n[p];if(Ii(_,v)===!1){_.push(v);for(var g=0;g<d.length;g++){var y=d[g];i[p][y]=!0}}}else{var b=gi.possiblePathsFrom(u,o+1,v);a[p]=a[p].concat(b),D.forEach(b,function(L){var se=wr(L.partialPath);D.forEach(se,function(fe){i[p][fe]=!0})})}}},f=0;f<s.length;f++)c(f)}return n}C.lookAheadSequenceFromAlternatives=Dr;function Ai(t,e,r,n){var i=new Oi(t,z.ALTERNATION,n);return e.accept(i),Dr(i.result,r)}C.getLookaheadPathsForOr=Ai;function Ri(t,e,r,n){var i=new Oi(t,r);e.accept(i);var a=i.result,o=new os(e,t,r),s=o.startWalking(),c=new We.Alternative({definition:a}),f=new We.Alternative({definition:s});return Dr([c,f],n)}C.getLookaheadPathsForOptionalProd=Ri;function Ii(t,e){e:for(var r=0;r<t.length;r++){var n=t[r];if(n.length===e.length){for(var i=0;i<n.length;i++){var a=e[i],o=n[i],s=a===o||o.categoryMatchesMap[a.tokenTypeIdx]!==void 0;if(s===!1)continue e}return!0}}return!1}C.containsPath=Ii;function us(t,e){return t.length<e.length&&D.every(t,function(r,n){var i=e[n];return r===i||i.categoryMatchesMap[r.tokenTypeIdx]})}C.isStrictPrefixOfPath=us;function Fr(t){return D.every(t,function(e){return D.every(e,function(r){return D.every(r,function(n){return D.isEmpty(n.categoryMatches)})})})}C.areTokenCategoriesNotUsed=Fr});var jr=R(x=>{\"use strict\";var Ur=x&&x.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,i){n.__proto__=i}||function(n,i){for(var a in i)Object.prototype.hasOwnProperty.call(i,a)&&(n[a]=i[a])},t(e,r)};return function(e,r){if(typeof r!=\"function\"&&r!==null)throw new TypeError(\"Class extends value \"+String(r)+\" is not a constructor or null\");t(e,r);function n(){this.constructor=e}e.prototype=r===null?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(x,\"__esModule\",{value:!0});x.checkPrefixAlternativesAmbiguities=x.validateSomeNonEmptyLookaheadPath=x.validateTooManyAlts=x.RepetionCollector=x.validateAmbiguousAlternationAlternatives=x.validateEmptyOrAlternative=x.getFirstNoneTerminal=x.validateNoLeftRecursion=x.validateRuleIsOverridden=x.validateRuleDoesNotAlreadyExist=x.OccurrenceValidationCollector=x.identifyProductionForDuplicates=x.validateGrammar=void 0;var M=k(),B=k(),Ie=ce(),Gr=vt(),Qe=yt(),cs=Tt(),_e=ne(),Wr=$e();function ps(t,e,r,n,i){var a=M.map(t,function(v){return ls(v,n)}),o=M.map(t,function(v){return Br(v,v,n)}),s=[],c=[],f=[];B.every(o,B.isEmpty)&&(s=B.map(t,function(v){return Pi(v,n)}),c=B.map(t,function(v){return Si(v,e,n)}),f=Ci(t,e,n));var p=fs(t,r,n),l=B.map(t,function(v){return xi(v,n)}),m=B.map(t,function(v){return ki(v,t,i,n)});return M.flatten(a.concat(f,o,s,c,p,l,m))}x.validateGrammar=ps;function ls(t,e){var r=new bi;t.accept(r);var n=r.allProductions,i=M.groupBy(n,Li),a=M.pick(i,function(s){return s.length>1}),o=M.map(M.values(a),function(s){var c=M.first(s),f=e.buildDuplicateFoundError(t,s),p=Gr.getProductionDslName(c),l={message:f,type:Ie.ParserDefinitionErrorType.DUPLICATE_PRODUCTIONS,ruleName:t.name,dslName:p,occurrence:c.idx},m=Mi(c);return m&&(l.parameter=m),l});return o}function Li(t){return Gr.getProductionDslName(t)+\"_#_\"+t.idx+\"_#_\"+Mi(t)}x.identifyProductionForDuplicates=Li;function Mi(t){return t instanceof _e.Terminal?t.terminalType.name:t instanceof _e.NonTerminal?t.nonTerminalName:\"\"}var bi=function(t){Ur(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.allProductions=[],r}return e.prototype.visitNonTerminal=function(r){this.allProductions.push(r)},e.prototype.visitOption=function(r){this.allProductions.push(r)},e.prototype.visitRepetitionWithSeparator=function(r){this.allProductions.push(r)},e.prototype.visitRepetitionMandatory=function(r){this.allProductions.push(r)},e.prototype.visitRepetitionMandatoryWithSeparator=function(r){this.allProductions.push(r)},e.prototype.visitRepetition=function(r){this.allProductions.push(r)},e.prototype.visitAlternation=function(r){this.allProductions.push(r)},e.prototype.visitTerminal=function(r){this.allProductions.push(r)},e}(Wr.GAstVisitor);x.OccurrenceValidationCollector=bi;function ki(t,e,r,n){var i=[],a=B.reduce(e,function(s,c){return c.name===t.name?s+1:s},0);if(a>1){var o=n.buildDuplicateRuleNameError({topLevelRule:t,grammarName:r});i.push({message:o,type:Ie.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:t.name})}return i}x.validateRuleDoesNotAlreadyExist=ki;function hs(t,e,r){var n=[],i;return M.contains(e,t)||(i=\"Invalid rule override, rule: ->\"+t+\"<- cannot be overridden in the grammar: ->\"+r+\"<-as it is not defined in any of the super grammars \",n.push({message:i,type:Ie.ParserDefinitionErrorType.INVALID_RULE_OVERRIDE,ruleName:t})),n}x.validateRuleIsOverridden=hs;function Br(t,e,r,n){n===void 0&&(n=[]);var i=[],a=_t(e.definition);if(M.isEmpty(a))return[];var o=t.name,s=M.contains(a,t);s&&i.push({message:r.buildLeftRecursionError({topLevelRule:t,leftRecursionPath:n}),type:Ie.ParserDefinitionErrorType.LEFT_RECURSION,ruleName:o});var c=M.difference(a,n.concat([t])),f=M.map(c,function(p){var l=M.cloneArr(n);return l.push(p),Br(t,p,r,l)});return i.concat(M.flatten(f))}x.validateNoLeftRecursion=Br;function _t(t){var e=[];if(M.isEmpty(t))return e;var r=M.first(t);if(r instanceof _e.NonTerminal)e.push(r.referencedRule);else if(r instanceof _e.Alternative||r instanceof _e.Option||r instanceof _e.RepetitionMandatory||r instanceof _e.RepetitionMandatoryWithSeparator||r instanceof _e.RepetitionWithSeparator||r instanceof _e.Repetition)e=e.concat(_t(r.definition));else if(r instanceof _e.Alternation)e=M.flatten(M.map(r.definition,function(o){return _t(o.definition)}));else if(!(r instanceof _e.Terminal))throw Error(\"non exhaustive match\");var n=Gr.isOptionalProd(r),i=t.length>1;if(n&&i){var a=M.drop(t);return e.concat(_t(a))}else return e}x.getFirstNoneTerminal=_t;var qr=function(t){Ur(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.alternations=[],r}return e.prototype.visitAlternation=function(r){this.alternations.push(r)},e}(Wr.GAstVisitor);function Pi(t,e){var r=new qr;t.accept(r);var n=r.alternations,i=M.reduce(n,function(a,o){var s=M.dropRight(o.definition),c=M.map(s,function(f,p){var l=cs.nextPossibleTokensAfter([f],[],null,1);return M.isEmpty(l)?{message:e.buildEmptyAlternationError({topLevelRule:t,alternation:o,emptyChoiceIdx:p}),type:Ie.ParserDefinitionErrorType.NONE_LAST_EMPTY_ALT,ruleName:t.name,occurrence:o.idx,alternative:p+1}:null});return a.concat(M.compact(c))},[]);return i}x.validateEmptyOrAlternative=Pi;function Si(t,e,r){var n=new qr;t.accept(n);var i=n.alternations;i=B.reject(i,function(o){return o.ignoreAmbiguities===!0});var a=M.reduce(i,function(o,s){var c=s.idx,f=s.maxLookahead||e,p=Qe.getLookaheadPathsForOr(c,t,f,s),l=ds(p,s,t,r),m=Fi(p,s,t,r);return o.concat(l,m)},[]);return a}x.validateAmbiguousAlternationAlternatives=Si;var wi=function(t){Ur(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.allProductions=[],r}return e.prototype.visitRepetitionWithSeparator=function(r){this.allProductions.push(r)},e.prototype.visitRepetitionMandatory=function(r){this.allProductions.push(r)},e.prototype.visitRepetitionMandatoryWithSeparator=function(r){this.allProductions.push(r)},e.prototype.visitRepetition=function(r){this.allProductions.push(r)},e}(Wr.GAstVisitor);x.RepetionCollector=wi;function xi(t,e){var r=new qr;t.accept(r);var n=r.alternations,i=M.reduce(n,function(a,o){return o.definition.length>255&&a.push({message:e.buildTooManyAlternativesError({topLevelRule:t,alternation:o}),type:Ie.ParserDefinitionErrorType.TOO_MANY_ALTS,ruleName:t.name,occurrence:o.idx}),a},[]);return i}x.validateTooManyAlts=xi;function Ci(t,e,r){var n=[];return B.forEach(t,function(i){var a=new wi;i.accept(a);var o=a.allProductions;B.forEach(o,function(s){var c=Qe.getProdType(s),f=s.maxLookahead||e,p=s.idx,l=Qe.getLookaheadPathsForOptionalProd(p,i,c,f),m=l[0];if(B.isEmpty(B.flatten(m))){var v=r.buildEmptyRepetitionError({topLevelRule:i,repetition:s});n.push({message:v,type:Ie.ParserDefinitionErrorType.NO_NON_EMPTY_LOOKAHEAD,ruleName:i.name})}})}),n}x.validateSomeNonEmptyLookaheadPath=Ci;function ds(t,e,r,n){var i=[],a=B.reduce(t,function(s,c,f){return e.definition[f].ignoreAmbiguities===!0||B.forEach(c,function(p){var l=[f];B.forEach(t,function(m,v){f!==v&&Qe.containsPath(m,p)&&e.definition[v].ignoreAmbiguities!==!0&&l.push(v)}),l.length>1&&!Qe.containsPath(i,p)&&(i.push(p),s.push({alts:l,path:p}))}),s},[]),o=M.map(a,function(s){var c=B.map(s.alts,function(p){return p+1}),f=n.buildAlternationAmbiguityError({topLevelRule:r,alternation:e,ambiguityIndices:c,prefixPath:s.path});return{message:f,type:Ie.ParserDefinitionErrorType.AMBIGUOUS_ALTS,ruleName:r.name,occurrence:e.idx,alternatives:[s.alts]}});return o}function Fi(t,e,r,n){var i=[],a=B.reduce(t,function(o,s,c){var f=B.map(s,function(p){return{idx:c,path:p}});return o.concat(f)},[]);return B.forEach(a,function(o){var s=e.definition[o.idx];if(s.ignoreAmbiguities!==!0){var c=o.idx,f=o.path,p=B.findAll(a,function(m){return e.definition[m.idx].ignoreAmbiguities!==!0&&m.idx<c&&Qe.isStrictPrefixOfPath(m.path,f)}),l=B.map(p,function(m){var v=[m.idx+1,c+1],u=e.idx===0?\"\":e.idx,d=n.buildAlternationPrefixAmbiguityError({topLevelRule:r,alternation:e,ambiguityIndices:v,prefixPath:m.path});return{message:d,type:Ie.ParserDefinitionErrorType.AMBIGUOUS_PREFIX_ALTS,ruleName:r.name,occurrence:u,alternatives:v}});i=i.concat(l)}}),i}x.checkPrefixAlternativesAmbiguities=Fi;function fs(t,e,r){var n=[],i=B.map(e,function(a){return a.name});return B.forEach(t,function(a){var o=a.name;if(B.contains(i,o)){var s=r.buildNamespaceConflictError(a);n.push({message:s,type:Ie.ParserDefinitionErrorType.CONFLICT_TOKENS_RULES_NAMESPACE,ruleName:o})}}),n}});var Ui=R(Je=>{\"use strict\";Object.defineProperty(Je,\"__esModule\",{value:!0});Je.validateGrammar=Je.resolveGrammar=void 0;var Vr=k(),vs=mi(),ms=jr(),Di=mt();function Es(t){t=Vr.defaults(t,{errMsgProvider:Di.defaultGrammarResolverErrorProvider});var e={};return Vr.forEach(t.rules,function(r){e[r.name]=r}),vs.resolveGrammar(e,t.errMsgProvider)}Je.resolveGrammar=Es;function Ts(t){return t=Vr.defaults(t,{errMsgProvider:Di.defaultGrammarValidatorErrorProvider}),ms.validateGrammar(t.rules,t.maxLookahead,t.tokenTypes,t.errMsgProvider,t.grammarName)}Je.validateGrammar=Ts});var et=R(ae=>{\"use strict\";var gt=ae&&ae.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,i){n.__proto__=i}||function(n,i){for(var a in i)Object.prototype.hasOwnProperty.call(i,a)&&(n[a]=i[a])},t(e,r)};return function(e,r){if(typeof r!=\"function\"&&r!==null)throw new TypeError(\"Class extends value \"+String(r)+\" is not a constructor or null\");t(e,r);function n(){this.constructor=e}e.prototype=r===null?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(ae,\"__esModule\",{value:!0});ae.EarlyExitException=ae.NotAllInputParsedException=ae.NoViableAltException=ae.MismatchedTokenException=ae.isRecognitionException=void 0;var ys=k(),Gi=\"MismatchedTokenException\",Wi=\"NoViableAltException\",Bi=\"EarlyExitException\",qi=\"NotAllInputParsedException\",ji=[Gi,Wi,Bi,qi];Object.freeze(ji);function _s(t){return ys.contains(ji,t.name)}ae.isRecognitionException=_s;var zt=function(t){gt(e,t);function e(r,n){var i=this.constructor,a=t.call(this,r)||this;return a.token=n,a.resyncedTokens=[],Object.setPrototypeOf(a,i.prototype),Error.captureStackTrace&&Error.captureStackTrace(a,a.constructor),a}return e}(Error),gs=function(t){gt(e,t);function e(r,n,i){var a=t.call(this,r,n)||this;return a.previousToken=i,a.name=Gi,a}return e}(zt);ae.MismatchedTokenException=gs;var As=function(t){gt(e,t);function e(r,n,i){var a=t.call(this,r,n)||this;return a.previousToken=i,a.name=Wi,a}return e}(zt);ae.NoViableAltException=As;var Rs=function(t){gt(e,t);function e(r,n){var i=t.call(this,r,n)||this;return i.name=qi,i}return e}(zt);ae.NotAllInputParsedException=Rs;var Os=function(t){gt(e,t);function e(r,n,i){var a=t.call(this,r,n)||this;return a.previousToken=i,a.name=Bi,a}return e}(zt);ae.EarlyExitException=Os});var zr=R($=>{\"use strict\";Object.defineProperty($,\"__esModule\",{value:!0});$.attemptInRepetitionRecovery=$.Recoverable=$.InRuleRecoveryException=$.IN_RULE_RECOVERY_EXCEPTION=$.EOF_FOLLOW_KEY=void 0;var Ht=Ue(),de=k(),Ns=et(),Is=Mr(),ks=ce();$.EOF_FOLLOW_KEY={};$.IN_RULE_RECOVERY_EXCEPTION=\"InRuleRecoveryException\";function Kr(t){this.name=$.IN_RULE_RECOVERY_EXCEPTION,this.message=t}$.InRuleRecoveryException=Kr;Kr.prototype=Error.prototype;var Ps=function(){function t(){}return t.prototype.initRecoverable=function(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=de.has(e,\"recoveryEnabled\")?e.recoveryEnabled:ks.DEFAULT_PARSER_CONFIG.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=Vi)},t.prototype.getTokenToInsert=function(e){var r=Ht.createTokenInstance(e,\"\",NaN,NaN,NaN,NaN,NaN,NaN);return r.isInsertedInRecovery=!0,r},t.prototype.canTokenTypeBeInsertedInRecovery=function(e){return!0},t.prototype.tryInRepetitionRecovery=function(e,r,n,i){for(var a=this,o=this.findReSyncTokenType(),s=this.exportLexerState(),c=[],f=!1,p=this.LA(1),l=this.LA(1),m=function(){var v=a.LA(0),u=a.errorMessageProvider.buildMismatchTokenMessage({expected:i,actual:p,previous:v,ruleName:a.getCurrRuleFullName()}),d=new Ns.MismatchedTokenException(u,p,a.LA(0));d.resyncedTokens=de.dropRight(c),a.SAVE_ERROR(d)};!f;)if(this.tokenMatcher(l,i)){m();return}else if(n.call(this)){m(),e.apply(this,r);return}else this.tokenMatcher(l,o)?f=!0:(l=this.SKIP_TOKEN(),this.addToResyncTokens(l,c));this.importLexerState(s)},t.prototype.shouldInRepetitionRecoveryBeTried=function(e,r,n){return!(n===!1||e===void 0||r===void 0||this.tokenMatcher(this.LA(1),e)||this.isBackTracking()||this.canPerformInRuleRecovery(e,this.getFollowsForInRuleRecovery(e,r)))},t.prototype.getFollowsForInRuleRecovery=function(e,r){var n=this.getCurrentGrammarPath(e,r),i=this.getNextPossibleTokenTypes(n);return i},t.prototype.tryInRuleRecovery=function(e,r){if(this.canRecoverWithSingleTokenInsertion(e,r)){var n=this.getTokenToInsert(e);return n}if(this.canRecoverWithSingleTokenDeletion(e)){var i=this.SKIP_TOKEN();return this.consumeToken(),i}throw new Kr(\"sad sad panda\")},t.prototype.canPerformInRuleRecovery=function(e,r){return this.canRecoverWithSingleTokenInsertion(e,r)||this.canRecoverWithSingleTokenDeletion(e)},t.prototype.canRecoverWithSingleTokenInsertion=function(e,r){var n=this;if(!this.canTokenTypeBeInsertedInRecovery(e)||de.isEmpty(r))return!1;var i=this.LA(1),a=de.find(r,function(o){return n.tokenMatcher(i,o)})!==void 0;return a},t.prototype.canRecoverWithSingleTokenDeletion=function(e){var r=this.tokenMatcher(this.LA(2),e);return r},t.prototype.isInCurrentRuleReSyncSet=function(e){var r=this.getCurrFollowKey(),n=this.getFollowSetFromFollowKey(r);return de.contains(n,e)},t.prototype.findReSyncTokenType=function(){for(var e=this.flattenFollowSet(),r=this.LA(1),n=2;;){var i=r.tokenType;if(de.contains(e,i))return i;r=this.LA(n),n++}},t.prototype.getCurrFollowKey=function(){if(this.RULE_STACK.length===1)return $.EOF_FOLLOW_KEY;var e=this.getLastExplicitRuleShortName(),r=this.getLastExplicitRuleOccurrenceIndex(),n=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(e),idxInCallingRule:r,inRule:this.shortRuleNameToFullName(n)}},t.prototype.buildFullFollowKeyStack=function(){var e=this,r=this.RULE_STACK,n=this.RULE_OCCURRENCE_STACK;return de.map(r,function(i,a){return a===0?$.EOF_FOLLOW_KEY:{ruleName:e.shortRuleNameToFullName(i),idxInCallingRule:n[a],inRule:e.shortRuleNameToFullName(r[a-1])}})},t.prototype.flattenFollowSet=function(){var e=this,r=de.map(this.buildFullFollowKeyStack(),function(n){return e.getFollowSetFromFollowKey(n)});return de.flatten(r)},t.prototype.getFollowSetFromFollowKey=function(e){if(e===$.EOF_FOLLOW_KEY)return[Ht.EOF];var r=e.ruleName+e.idxInCallingRule+Is.IN+e.inRule;return this.resyncFollows[r]},t.prototype.addToResyncTokens=function(e,r){return this.tokenMatcher(e,Ht.EOF)||r.push(e),r},t.prototype.reSyncTo=function(e){for(var r=[],n=this.LA(1);this.tokenMatcher(n,e)===!1;)n=this.SKIP_TOKEN(),this.addToResyncTokens(n,r);return de.dropRight(r)},t.prototype.attemptInRepetitionRecovery=function(e,r,n,i,a,o,s){},t.prototype.getCurrentGrammarPath=function(e,r){var n=this.getHumanReadableRuleStack(),i=de.cloneArr(this.RULE_OCCURRENCE_STACK),a={ruleStack:n,occurrenceStack:i,lastTok:e,lastTokOccurrence:r};return a},t.prototype.getHumanReadableRuleStack=function(){var e=this;return de.map(this.RULE_STACK,function(r){return e.shortRuleNameToFullName(r)})},t}();$.Recoverable=Ps;function Vi(t,e,r,n,i,a,o){var s=this.getKeyForAutomaticLookahead(n,i),c=this.firstAfterRepMap[s];if(c===void 0){var f=this.getCurrRuleFullName(),p=this.getGAstProductions()[f],l=new a(p,i);c=l.startWalking(),this.firstAfterRepMap[s]=c}var m=c.token,v=c.occurrence,u=c.isEndOfRule;this.RULE_STACK.length===1&&u&&m===void 0&&(m=Ht.EOF,v=1),this.shouldInRepetitionRecoveryBeTried(m,v,o)&&this.tryInRepetitionRecovery(t,e,r,m)}$.attemptInRepetitionRecovery=Vi});var Yt=R(P=>{\"use strict\";Object.defineProperty(P,\"__esModule\",{value:!0});P.getKeyForAutomaticLookahead=P.AT_LEAST_ONE_SEP_IDX=P.MANY_SEP_IDX=P.AT_LEAST_ONE_IDX=P.MANY_IDX=P.OPTION_IDX=P.OR_IDX=P.BITS_FOR_ALT_IDX=P.BITS_FOR_RULE_IDX=P.BITS_FOR_OCCURRENCE_IDX=P.BITS_FOR_METHOD_TYPE=void 0;P.BITS_FOR_METHOD_TYPE=4;P.BITS_FOR_OCCURRENCE_IDX=8;P.BITS_FOR_RULE_IDX=12;P.BITS_FOR_ALT_IDX=8;P.OR_IDX=1<<P.BITS_FOR_OCCURRENCE_IDX;P.OPTION_IDX=2<<P.BITS_FOR_OCCURRENCE_IDX;P.MANY_IDX=3<<P.BITS_FOR_OCCURRENCE_IDX;P.AT_LEAST_ONE_IDX=4<<P.BITS_FOR_OCCURRENCE_IDX;P.MANY_SEP_IDX=5<<P.BITS_FOR_OCCURRENCE_IDX;P.AT_LEAST_ONE_SEP_IDX=6<<P.BITS_FOR_OCCURRENCE_IDX;function Ss(t,e,r){return r|e|t}P.getKeyForAutomaticLookahead=Ss;var ic=32-P.BITS_FOR_ALT_IDX});var zi=R(Xt=>{\"use strict\";Object.defineProperty(Xt,\"__esModule\",{value:!0});Xt.LooksAhead=void 0;var be=yt(),ge=k(),Ki=ce(),Fe=Yt(),Ve=vt(),xs=function(){function t(){}return t.prototype.initLooksAhead=function(e){this.dynamicTokensEnabled=ge.has(e,\"dynamicTokensEnabled\")?e.dynamicTokensEnabled:Ki.DEFAULT_PARSER_CONFIG.dynamicTokensEnabled,this.maxLookahead=ge.has(e,\"maxLookahead\")?e.maxLookahead:Ki.DEFAULT_PARSER_CONFIG.maxLookahead,this.lookAheadFuncsCache=ge.isES2015MapSupported()?new Map:[],ge.isES2015MapSupported()?(this.getLaFuncFromCache=this.getLaFuncFromMap,this.setLaFuncCache=this.setLaFuncCacheUsingMap):(this.getLaFuncFromCache=this.getLaFuncFromObj,this.setLaFuncCache=this.setLaFuncUsingObj)},t.prototype.preComputeLookaheadFunctions=function(e){var r=this;ge.forEach(e,function(n){r.TRACE_INIT(n.name+\" Rule Lookahead\",function(){var i=Ve.collectMethods(n),a=i.alternation,o=i.repetition,s=i.option,c=i.repetitionMandatory,f=i.repetitionMandatoryWithSeparator,p=i.repetitionWithSeparator;ge.forEach(a,function(l){var m=l.idx===0?\"\":l.idx;r.TRACE_INIT(\"\"+Ve.getProductionDslName(l)+m,function(){var v=be.buildLookaheadFuncForOr(l.idx,n,l.maxLookahead||r.maxLookahead,l.hasPredicates,r.dynamicTokensEnabled,r.lookAheadBuilderForAlternatives),u=Fe.getKeyForAutomaticLookahead(r.fullRuleNameToShort[n.name],Fe.OR_IDX,l.idx);r.setLaFuncCache(u,v)})}),ge.forEach(o,function(l){r.computeLookaheadFunc(n,l.idx,Fe.MANY_IDX,be.PROD_TYPE.REPETITION,l.maxLookahead,Ve.getProductionDslName(l))}),ge.forEach(s,function(l){r.computeLookaheadFunc(n,l.idx,Fe.OPTION_IDX,be.PROD_TYPE.OPTION,l.maxLookahead,Ve.getProductionDslName(l))}),ge.forEach(c,function(l){r.computeLookaheadFunc(n,l.idx,Fe.AT_LEAST_ONE_IDX,be.PROD_TYPE.REPETITION_MANDATORY,l.maxLookahead,Ve.getProductionDslName(l))}),ge.forEach(f,function(l){r.computeLookaheadFunc(n,l.idx,Fe.AT_LEAST_ONE_SEP_IDX,be.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR,l.maxLookahead,Ve.getProductionDslName(l))}),ge.forEach(p,function(l){r.computeLookaheadFunc(n,l.idx,Fe.MANY_SEP_IDX,be.PROD_TYPE.REPETITION_WITH_SEPARATOR,l.maxLookahead,Ve.getProductionDslName(l))})})})},t.prototype.computeLookaheadFunc=function(e,r,n,i,a,o){var s=this;this.TRACE_INIT(\"\"+o+(r===0?\"\":r),function(){var c=be.buildLookaheadFuncForOptionalProd(r,e,a||s.maxLookahead,s.dynamicTokensEnabled,i,s.lookAheadBuilderForOptional),f=Fe.getKeyForAutomaticLookahead(s.fullRuleNameToShort[e.name],n,r);s.setLaFuncCache(f,c)})},t.prototype.lookAheadBuilderForOptional=function(e,r,n){return be.buildSingleAlternativeLookaheadFunction(e,r,n)},t.prototype.lookAheadBuilderForAlternatives=function(e,r,n,i){return be.buildAlternativesLookAheadFunc(e,r,n,i)},t.prototype.getKeyForAutomaticLookahead=function(e,r){var n=this.getLastExplicitRuleShortName();return Fe.getKeyForAutomaticLookahead(n,e,r)},t.prototype.getLaFuncFromCache=function(e){},t.prototype.getLaFuncFromMap=function(e){return this.lookAheadFuncsCache.get(e)},t.prototype.getLaFuncFromObj=function(e){return this.lookAheadFuncsCache[e]},t.prototype.setLaFuncCache=function(e,r){},t.prototype.setLaFuncCacheUsingMap=function(e,r){this.lookAheadFuncsCache.set(e,r)},t.prototype.setLaFuncUsingObj=function(e,r){this.lookAheadFuncsCache[e]=r},t}();Xt.LooksAhead=xs});var Hi=R(ke=>{\"use strict\";Object.defineProperty(ke,\"__esModule\",{value:!0});ke.addNoneTerminalToCst=ke.addTerminalToCst=ke.setNodeLocationFull=ke.setNodeLocationOnlyOffset=void 0;function Cs(t,e){isNaN(t.startOffset)===!0?(t.startOffset=e.startOffset,t.endOffset=e.endOffset):t.endOffset<e.endOffset&&(t.endOffset=e.endOffset)}ke.setNodeLocationOnlyOffset=Cs;function Ls(t,e){isNaN(t.startOffset)===!0?(t.startOffset=e.startOffset,t.startColumn=e.startColumn,t.startLine=e.startLine,t.endOffset=e.endOffset,t.endColumn=e.endColumn,t.endLine=e.endLine):t.endOffset<e.endOffset&&(t.endOffset=e.endOffset,t.endColumn=e.endColumn,t.endLine=e.endLine)}ke.setNodeLocationFull=Ls;function Ms(t,e,r){t.children[r]===void 0?t.children[r]=[e]:t.children[r].push(e)}ke.addTerminalToCst=Ms;function bs(t,e,r){t.children[e]===void 0?t.children[e]=[r]:t.children[e].push(r)}ke.addNoneTerminalToCst=bs});var Hr=R(Be=>{\"use strict\";Object.defineProperty(Be,\"__esModule\",{value:!0});Be.defineNameProp=Be.functionName=Be.classNameFromInstance=void 0;var Fs=k();function ws(t){return Yi(t.constructor)}Be.classNameFromInstance=ws;var Xi=\"name\";function Yi(t){var e=t.name;return e||\"anonymous\"}Be.functionName=Yi;function Ds(t,e){var r=Object.getOwnPropertyDescriptor(t,Xi);return Fs.isUndefined(r)||r.configurable?(Object.defineProperty(t,Xi,{enumerable:!1,configurable:!0,writable:!1,value:e}),!0):!1}Be.defineNameProp=Ds});var ea=R(Y=>{\"use strict\";Object.defineProperty(Y,\"__esModule\",{value:!0});Y.validateRedundantMethods=Y.validateMissingCstMethods=Y.validateVisitor=Y.CstVisitorDefinitionError=Y.createBaseVisitorConstructorWithDefaults=Y.createBaseSemanticVisitorConstructor=Y.defaultVisit=void 0;var ve=k(),At=Hr();function $i(t,e){for(var r=ve.keys(t),n=r.length,i=0;i<n;i++)for(var a=r[i],o=t[a],s=o.length,c=0;c<s;c++){var f=o[c];f.tokenTypeIdx===void 0&&this[f.name](f.children,e)}}Y.defaultVisit=$i;function Us(t,e){var r=function(){};At.defineNameProp(r,t+\"BaseSemantics\");var n={visit:function(i,a){if(ve.isArray(i)&&(i=i[0]),!ve.isUndefined(i))return this[i.name](i.children,a)},validateVisitor:function(){var i=Zi(this,e);if(!ve.isEmpty(i)){var a=ve.map(i,function(o){return o.msg});throw Error(\"Errors Detected in CST Visitor <\"+At.functionName(this.constructor)+`>:\n\t`+(\"\"+a.join(`\n\n`).replace(/\\n/g,`\n\t`)))}}};return r.prototype=n,r.prototype.constructor=r,r._RULE_NAMES=e,r}Y.createBaseSemanticVisitorConstructor=Us;function Gs(t,e,r){var n=function(){};At.defineNameProp(n,t+\"BaseSemanticsWithDefaults\");var i=Object.create(r.prototype);return ve.forEach(e,function(a){i[a]=$i}),n.prototype=i,n.prototype.constructor=n,n}Y.createBaseVisitorConstructorWithDefaults=Gs;var Yr;(function(t){t[t.REDUNDANT_METHOD=0]=\"REDUNDANT_METHOD\",t[t.MISSING_METHOD=1]=\"MISSING_METHOD\"})(Yr=Y.CstVisitorDefinitionError||(Y.CstVisitorDefinitionError={}));function Zi(t,e){var r=Qi(t,e),n=Ji(t,e);return r.concat(n)}Y.validateVisitor=Zi;function Qi(t,e){var r=ve.map(e,function(n){if(!ve.isFunction(t[n]))return{msg:\"Missing visitor method: <\"+n+\"> on \"+At.functionName(t.constructor)+\" CST Visitor.\",type:Yr.MISSING_METHOD,methodName:n}});return ve.compact(r)}Y.validateMissingCstMethods=Qi;var Ws=[\"constructor\",\"visit\",\"validateVisitor\"];function Ji(t,e){var r=[];for(var n in t)ve.isFunction(t[n])&&!ve.contains(Ws,n)&&!ve.contains(e,n)&&r.push({msg:\"Redundant visitor method: <\"+n+\"> on \"+At.functionName(t.constructor)+` CST Visitor\nThere is no Grammar Rule corresponding to this method's name.\n`,type:Yr.REDUNDANT_METHOD,methodName:n});return r}Y.validateRedundantMethods=Ji});var ra=R($t=>{\"use strict\";Object.defineProperty($t,\"__esModule\",{value:!0});$t.TreeBuilder=void 0;var tt=Hi(),K=k(),ta=ea(),Bs=ce(),qs=function(){function t(){}return t.prototype.initTreeBuilder=function(e){if(this.CST_STACK=[],this.outputCst=e.outputCst,this.nodeLocationTracking=K.has(e,\"nodeLocationTracking\")?e.nodeLocationTracking:Bs.DEFAULT_PARSER_CONFIG.nodeLocationTracking,!this.outputCst)this.cstInvocationStateUpdate=K.NOOP,this.cstFinallyStateUpdate=K.NOOP,this.cstPostTerminal=K.NOOP,this.cstPostNonTerminal=K.NOOP,this.cstPostRule=K.NOOP;else if(/full/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=tt.setNodeLocationFull,this.setNodeLocationFromNode=tt.setNodeLocationFull,this.cstPostRule=K.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationFullRecovery):(this.setNodeLocationFromToken=K.NOOP,this.setNodeLocationFromNode=K.NOOP,this.cstPostRule=this.cstPostRuleFull,this.setInitialNodeLocation=this.setInitialNodeLocationFullRegular);else if(/onlyOffset/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=tt.setNodeLocationOnlyOffset,this.setNodeLocationFromNode=tt.setNodeLocationOnlyOffset,this.cstPostRule=K.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRecovery):(this.setNodeLocationFromToken=K.NOOP,this.setNodeLocationFromNode=K.NOOP,this.cstPostRule=this.cstPostRuleOnlyOffset,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRegular);else if(/none/i.test(this.nodeLocationTracking))this.setNodeLocationFromToken=K.NOOP,this.setNodeLocationFromNode=K.NOOP,this.cstPostRule=K.NOOP,this.setInitialNodeLocation=K.NOOP;else throw Error('Invalid <nodeLocationTracking> config option: \"'+e.nodeLocationTracking+'\"')},t.prototype.setInitialNodeLocationOnlyOffsetRecovery=function(e){e.location={startOffset:NaN,endOffset:NaN}},t.prototype.setInitialNodeLocationOnlyOffsetRegular=function(e){e.location={startOffset:this.LA(1).startOffset,endOffset:NaN}},t.prototype.setInitialNodeLocationFullRecovery=function(e){e.location={startOffset:NaN,startLine:NaN,startColumn:NaN,endOffset:NaN,endLine:NaN,endColumn:NaN}},t.prototype.setInitialNodeLocationFullRegular=function(e){var r=this.LA(1);e.location={startOffset:r.startOffset,startLine:r.startLine,startColumn:r.startColumn,endOffset:NaN,endLine:NaN,endColumn:NaN}},t.prototype.cstInvocationStateUpdate=function(e,r){var n={name:e,children:{}};this.setInitialNodeLocation(n),this.CST_STACK.push(n)},t.prototype.cstFinallyStateUpdate=function(){this.CST_STACK.pop()},t.prototype.cstPostRuleFull=function(e){var r=this.LA(0),n=e.location;n.startOffset<=r.startOffset?(n.endOffset=r.endOffset,n.endLine=r.endLine,n.endColumn=r.endColumn):(n.startOffset=NaN,n.startLine=NaN,n.startColumn=NaN)},t.prototype.cstPostRuleOnlyOffset=function(e){var r=this.LA(0),n=e.location;n.startOffset<=r.startOffset?n.endOffset=r.endOffset:n.startOffset=NaN},t.prototype.cstPostTerminal=function(e,r){var n=this.CST_STACK[this.CST_STACK.length-1];tt.addTerminalToCst(n,r,e),this.setNodeLocationFromToken(n.location,r)},t.prototype.cstPostNonTerminal=function(e,r){var n=this.CST_STACK[this.CST_STACK.length-1];tt.addNoneTerminalToCst(n,r,e),this.setNodeLocationFromNode(n.location,e.location)},t.prototype.getBaseCstVisitorConstructor=function(){if(K.isUndefined(this.baseCstVisitorConstructor)){var e=ta.createBaseSemanticVisitorConstructor(this.className,K.keys(this.gastProductionsCache));return this.baseCstVisitorConstructor=e,e}return this.baseCstVisitorConstructor},t.prototype.getBaseCstVisitorConstructorWithDefaults=function(){if(K.isUndefined(this.baseCstVisitorWithDefaultsConstructor)){var e=ta.createBaseVisitorConstructorWithDefaults(this.className,K.keys(this.gastProductionsCache),this.getBaseCstVisitorConstructor());return this.baseCstVisitorWithDefaultsConstructor=e,e}return this.baseCstVisitorWithDefaultsConstructor},t.prototype.getLastExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-1]},t.prototype.getPreviousExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-2]},t.prototype.getLastExplicitRuleOccurrenceIndex=function(){var e=this.RULE_OCCURRENCE_STACK;return e[e.length-1]},t}();$t.TreeBuilder=qs});var ia=R(Zt=>{\"use strict\";Object.defineProperty(Zt,\"__esModule\",{value:!0});Zt.LexerAdapter=void 0;var na=ce(),js=function(){function t(){}return t.prototype.initLexerAdapter=function(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1},Object.defineProperty(t.prototype,\"input\",{get:function(){return this.tokVector},set:function(e){if(this.selfAnalysisDone!==!0)throw Error(\"Missing <performSelfAnalysis> invocation at the end of the Parser's constructor.\");this.reset(),this.tokVector=e,this.tokVectorLength=e.length},enumerable:!1,configurable:!0}),t.prototype.SKIP_TOKEN=function(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):na.END_OF_FILE},t.prototype.LA=function(e){var r=this.currIdx+e;return r<0||this.tokVectorLength<=r?na.END_OF_FILE:this.tokVector[r]},t.prototype.consumeToken=function(){this.currIdx++},t.prototype.exportLexerState=function(){return this.currIdx},t.prototype.importLexerState=function(e){this.currIdx=e},t.prototype.resetLexerState=function(){this.currIdx=-1},t.prototype.moveToTerminatedState=function(){this.currIdx=this.tokVector.length-1},t.prototype.getLexerPosition=function(){return this.exportLexerState()},t}();Zt.LexerAdapter=js});var oa=R(Qt=>{\"use strict\";Object.defineProperty(Qt,\"__esModule\",{value:!0});Qt.RecognizerApi=void 0;var aa=k(),Vs=et(),Xr=ce(),Ks=mt(),zs=jr(),Hs=ne(),Ys=function(){function t(){}return t.prototype.ACTION=function(e){return e.call(this)},t.prototype.consume=function(e,r,n){return this.consumeInternal(r,e,n)},t.prototype.subrule=function(e,r,n){return this.subruleInternal(r,e,n)},t.prototype.option=function(e,r){return this.optionInternal(r,e)},t.prototype.or=function(e,r){return this.orInternal(r,e)},t.prototype.many=function(e,r){return this.manyInternal(e,r)},t.prototype.atLeastOne=function(e,r){return this.atLeastOneInternal(e,r)},t.prototype.CONSUME=function(e,r){return this.consumeInternal(e,0,r)},t.prototype.CONSUME1=function(e,r){return this.consumeInternal(e,1,r)},t.prototype.CONSUME2=function(e,r){return this.consumeInternal(e,2,r)},t.prototype.CONSUME3=function(e,r){return this.consumeInternal(e,3,r)},t.prototype.CONSUME4=function(e,r){return this.consumeInternal(e,4,r)},t.prototype.CONSUME5=function(e,r){return this.consumeInternal(e,5,r)},t.prototype.CONSUME6=function(e,r){return this.consumeInternal(e,6,r)},t.prototype.CONSUME7=function(e,r){return this.consumeInternal(e,7,r)},t.prototype.CONSUME8=function(e,r){return this.consumeInternal(e,8,r)},t.prototype.CONSUME9=function(e,r){return this.consumeInternal(e,9,r)},t.prototype.SUBRULE=function(e,r){return this.subruleInternal(e,0,r)},t.prototype.SUBRULE1=function(e,r){return this.subruleInternal(e,1,r)},t.prototype.SUBRULE2=function(e,r){return this.subruleInternal(e,2,r)},t.prototype.SUBRULE3=function(e,r){return this.subruleInternal(e,3,r)},t.prototype.SUBRULE4=function(e,r){return this.subruleInternal(e,4,r)},t.prototype.SUBRULE5=function(e,r){return this.subruleInternal(e,5,r)},t.prototype.SUBRULE6=function(e,r){return this.subruleInternal(e,6,r)},t.prototype.SUBRULE7=function(e,r){return this.subruleInternal(e,7,r)},t.prototype.SUBRULE8=function(e,r){return this.subruleInternal(e,8,r)},t.prototype.SUBRULE9=function(e,r){return this.subruleInternal(e,9,r)},t.prototype.OPTION=function(e){return this.optionInternal(e,0)},t.prototype.OPTION1=function(e){return this.optionInternal(e,1)},t.prototype.OPTION2=function(e){return this.optionInternal(e,2)},t.prototype.OPTION3=function(e){return this.optionInternal(e,3)},t.prototype.OPTION4=function(e){return this.optionInternal(e,4)},t.prototype.OPTION5=function(e){return this.optionInternal(e,5)},t.prototype.OPTION6=function(e){return this.optionInternal(e,6)},t.prototype.OPTION7=function(e){return this.optionInternal(e,7)},t.prototype.OPTION8=function(e){return this.optionInternal(e,8)},t.prototype.OPTION9=function(e){return this.optionInternal(e,9)},t.prototype.OR=function(e){return this.orInternal(e,0)},t.prototype.OR1=function(e){return this.orInternal(e,1)},t.prototype.OR2=function(e){return this.orInternal(e,2)},t.prototype.OR3=function(e){return this.orInternal(e,3)},t.prototype.OR4=function(e){return this.orInternal(e,4)},t.prototype.OR5=function(e){return this.orInternal(e,5)},t.prototype.OR6=function(e){return this.orInternal(e,6)},t.prototype.OR7=function(e){return this.orInternal(e,7)},t.prototype.OR8=function(e){return this.orInternal(e,8)},t.prototype.OR9=function(e){return this.orInternal(e,9)},t.prototype.MANY=function(e){this.manyInternal(0,e)},t.prototype.MANY1=function(e){this.manyInternal(1,e)},t.prototype.MANY2=function(e){this.manyInternal(2,e)},t.prototype.MANY3=function(e){this.manyInternal(3,e)},t.prototype.MANY4=function(e){this.manyInternal(4,e)},t.prototype.MANY5=function(e){this.manyInternal(5,e)},t.prototype.MANY6=function(e){this.manyInternal(6,e)},t.prototype.MANY7=function(e){this.manyInternal(7,e)},t.prototype.MANY8=function(e){this.manyInternal(8,e)},t.prototype.MANY9=function(e){this.manyInternal(9,e)},t.prototype.MANY_SEP=function(e){this.manySepFirstInternal(0,e)},t.prototype.MANY_SEP1=function(e){this.manySepFirstInternal(1,e)},t.prototype.MANY_SEP2=function(e){this.manySepFirstInternal(2,e)},t.prototype.MANY_SEP3=function(e){this.manySepFirstInternal(3,e)},t.prototype.MANY_SEP4=function(e){this.manySepFirstInternal(4,e)},t.prototype.MANY_SEP5=function(e){this.manySepFirstInternal(5,e)},t.prototype.MANY_SEP6=function(e){this.manySepFirstInternal(6,e)},t.prototype.MANY_SEP7=function(e){this.manySepFirstInternal(7,e)},t.prototype.MANY_SEP8=function(e){this.manySepFirstInternal(8,e)},t.prototype.MANY_SEP9=function(e){this.manySepFirstInternal(9,e)},t.prototype.AT_LEAST_ONE=function(e){this.atLeastOneInternal(0,e)},t.prototype.AT_LEAST_ONE1=function(e){return this.atLeastOneInternal(1,e)},t.prototype.AT_LEAST_ONE2=function(e){this.atLeastOneInternal(2,e)},t.prototype.AT_LEAST_ONE3=function(e){this.atLeastOneInternal(3,e)},t.prototype.AT_LEAST_ONE4=function(e){this.atLeastOneInternal(4,e)},t.prototype.AT_LEAST_ONE5=function(e){this.atLeastOneInternal(5,e)},t.prototype.AT_LEAST_ONE6=function(e){this.atLeastOneInternal(6,e)},t.prototype.AT_LEAST_ONE7=function(e){this.atLeastOneInternal(7,e)},t.prototype.AT_LEAST_ONE8=function(e){this.atLeastOneInternal(8,e)},t.prototype.AT_LEAST_ONE9=function(e){this.atLeastOneInternal(9,e)},t.prototype.AT_LEAST_ONE_SEP=function(e){this.atLeastOneSepFirstInternal(0,e)},t.prototype.AT_LEAST_ONE_SEP1=function(e){this.atLeastOneSepFirstInternal(1,e)},t.prototype.AT_LEAST_ONE_SEP2=function(e){this.atLeastOneSepFirstInternal(2,e)},t.prototype.AT_LEAST_ONE_SEP3=function(e){this.atLeastOneSepFirstInternal(3,e)},t.prototype.AT_LEAST_ONE_SEP4=function(e){this.atLeastOneSepFirstInternal(4,e)},t.prototype.AT_LEAST_ONE_SEP5=function(e){this.atLeastOneSepFirstInternal(5,e)},t.prototype.AT_LEAST_ONE_SEP6=function(e){this.atLeastOneSepFirstInternal(6,e)},t.prototype.AT_LEAST_ONE_SEP7=function(e){this.atLeastOneSepFirstInternal(7,e)},t.prototype.AT_LEAST_ONE_SEP8=function(e){this.atLeastOneSepFirstInternal(8,e)},t.prototype.AT_LEAST_ONE_SEP9=function(e){this.atLeastOneSepFirstInternal(9,e)},t.prototype.RULE=function(e,r,n){if(n===void 0&&(n=Xr.DEFAULT_RULE_CONFIG),aa.contains(this.definedRulesNames,e)){var i=Ks.defaultGrammarValidatorErrorProvider.buildDuplicateRuleNameError({topLevelRule:e,grammarName:this.className}),a={message:i,type:Xr.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:e};this.definitionErrors.push(a)}this.definedRulesNames.push(e);var o=this.defineRule(e,r,n);return this[e]=o,o},t.prototype.OVERRIDE_RULE=function(e,r,n){n===void 0&&(n=Xr.DEFAULT_RULE_CONFIG);var i=[];i=i.concat(zs.validateRuleIsOverridden(e,this.definedRulesNames,this.className)),this.definitionErrors=this.definitionErrors.concat(i);var a=this.defineRule(e,r,n);return this[e]=a,a},t.prototype.BACKTRACK=function(e,r){return function(){this.isBackTrackingStack.push(1);var n=this.saveRecogState();try{return e.apply(this,r),!0}catch(i){if(Vs.isRecognitionException(i))return!1;throw i}finally{this.reloadRecogState(n),this.isBackTrackingStack.pop()}}},t.prototype.getGAstProductions=function(){return this.gastProductionsCache},t.prototype.getSerializedGastProductions=function(){return Hs.serializeGrammar(aa.values(this.gastProductionsCache))},t}();Qt.RecognizerApi=Ys});var la=R(Jt=>{\"use strict\";Object.defineProperty(Jt,\"__esModule\",{value:!0});Jt.RecognizerEngine=void 0;var q=k(),le=Yt(),er=et(),sa=yt(),rt=Tt(),ua=ce(),Xs=zr(),ca=Ue(),Rt=Xe(),$s=Hr(),Zs=function(){function t(){}return t.prototype.initRecognizerEngine=function(e,r){if(this.className=$s.classNameFromInstance(this),this.shortRuleNameToFull={},this.fullRuleNameToShort={},this.ruleShortNameIdx=256,this.tokenMatcher=Rt.tokenStructuredMatcherNoCategories,this.definedRulesNames=[],this.tokensMap={},this.isBackTrackingStack=[],this.RULE_STACK=[],this.RULE_OCCURRENCE_STACK=[],this.gastProductionsCache={},q.has(r,\"serializedGrammar\"))throw Error(`The Parser's configuration can no longer contain a <serializedGrammar> property.\n\tSee: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0\n\tFor Further details.`);if(q.isArray(e)){if(q.isEmpty(e))throw Error(`A Token Vocabulary cannot be empty.\n\tNote that the first argument for the parser constructor\n\tis no longer a Token vector (since v4.0).`);if(typeof e[0].startOffset==\"number\")throw Error(`The Parser constructor no longer accepts a token vector as the first argument.\n\tSee: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0\n\tFor Further details.`)}if(q.isArray(e))this.tokensMap=q.reduce(e,function(o,s){return o[s.name]=s,o},{});else if(q.has(e,\"modes\")&&q.every(q.flatten(q.values(e.modes)),Rt.isTokenType)){var n=q.flatten(q.values(e.modes)),i=q.uniq(n);this.tokensMap=q.reduce(i,function(o,s){return o[s.name]=s,o},{})}else if(q.isObject(e))this.tokensMap=q.cloneObj(e);else throw new Error(\"<tokensDictionary> argument must be An Array of Token constructors, A dictionary of Token constructors or an IMultiModeLexerDefinition\");this.tokensMap.EOF=ca.EOF;var a=q.every(q.values(e),function(o){return q.isEmpty(o.categoryMatches)});this.tokenMatcher=a?Rt.tokenStructuredMatcherNoCategories:Rt.tokenStructuredMatcher,Rt.augmentTokenTypes(q.values(this.tokensMap))},t.prototype.defineRule=function(e,r,n){if(this.selfAnalysisDone)throw Error(\"Grammar rule <\"+e+`> may not be defined after the 'performSelfAnalysis' method has been called'\nMake sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`);var i=q.has(n,\"resyncEnabled\")?n.resyncEnabled:ua.DEFAULT_RULE_CONFIG.resyncEnabled,a=q.has(n,\"recoveryValueFunc\")?n.recoveryValueFunc:ua.DEFAULT_RULE_CONFIG.recoveryValueFunc,o=this.ruleShortNameIdx<<le.BITS_FOR_METHOD_TYPE+le.BITS_FOR_OCCURRENCE_IDX;this.ruleShortNameIdx++,this.shortRuleNameToFull[o]=e,this.fullRuleNameToShort[e]=o;function s(p){try{if(this.outputCst===!0){r.apply(this,p);var l=this.CST_STACK[this.CST_STACK.length-1];return this.cstPostRule(l),l}else return r.apply(this,p)}catch(m){return this.invokeRuleCatch(m,i,a)}finally{this.ruleFinallyStateUpdate()}}var c=function(p,l){return p===void 0&&(p=0),this.ruleInvocationStateUpdate(o,e,p),s.call(this,l)},f=\"ruleName\";return c[f]=e,c.originalGrammarAction=r,c},t.prototype.invokeRuleCatch=function(e,r,n){var i=this.RULE_STACK.length===1,a=r&&!this.isBackTracking()&&this.recoveryEnabled;if(er.isRecognitionException(e)){var o=e;if(a){var s=this.findReSyncTokenType();if(this.isInCurrentRuleReSyncSet(s))if(o.resyncedTokens=this.reSyncTo(s),this.outputCst){var c=this.CST_STACK[this.CST_STACK.length-1];return c.recoveredNode=!0,c}else return n();else{if(this.outputCst){var c=this.CST_STACK[this.CST_STACK.length-1];c.recoveredNode=!0,o.partialCstResult=c}throw o}}else{if(i)return this.moveToTerminatedState(),n();throw o}}else throw e},t.prototype.optionInternal=function(e,r){var n=this.getKeyForAutomaticLookahead(le.OPTION_IDX,r);return this.optionInternalLogic(e,r,n)},t.prototype.optionInternalLogic=function(e,r,n){var i=this,a=this.getLaFuncFromCache(n),o,s;if(e.DEF!==void 0){if(o=e.DEF,s=e.GATE,s!==void 0){var c=a;a=function(){return s.call(i)&&c.call(i)}}}else o=e;if(a.call(this)===!0)return o.call(this)},t.prototype.atLeastOneInternal=function(e,r){var n=this.getKeyForAutomaticLookahead(le.AT_LEAST_ONE_IDX,e);return this.atLeastOneInternalLogic(e,r,n)},t.prototype.atLeastOneInternalLogic=function(e,r,n){var i=this,a=this.getLaFuncFromCache(n),o,s;if(r.DEF!==void 0){if(o=r.DEF,s=r.GATE,s!==void 0){var c=a;a=function(){return s.call(i)&&c.call(i)}}}else o=r;if(a.call(this)===!0)for(var f=this.doSingleRepetition(o);a.call(this)===!0&&f===!0;)f=this.doSingleRepetition(o);else throw this.raiseEarlyExitException(e,sa.PROD_TYPE.REPETITION_MANDATORY,r.ERR_MSG);this.attemptInRepetitionRecovery(this.atLeastOneInternal,[e,r],a,le.AT_LEAST_ONE_IDX,e,rt.NextTerminalAfterAtLeastOneWalker)},t.prototype.atLeastOneSepFirstInternal=function(e,r){var n=this.getKeyForAutomaticLookahead(le.AT_LEAST_ONE_SEP_IDX,e);this.atLeastOneSepFirstInternalLogic(e,r,n)},t.prototype.atLeastOneSepFirstInternalLogic=function(e,r,n){var i=this,a=r.DEF,o=r.SEP,s=this.getLaFuncFromCache(n);if(s.call(this)===!0){a.call(this);for(var c=function(){return i.tokenMatcher(i.LA(1),o)};this.tokenMatcher(this.LA(1),o)===!0;)this.CONSUME(o),a.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,o,c,a,rt.NextTerminalAfterAtLeastOneSepWalker],c,le.AT_LEAST_ONE_SEP_IDX,e,rt.NextTerminalAfterAtLeastOneSepWalker)}else throw this.raiseEarlyExitException(e,sa.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR,r.ERR_MSG)},t.prototype.manyInternal=function(e,r){var n=this.getKeyForAutomaticLookahead(le.MANY_IDX,e);return this.manyInternalLogic(e,r,n)},t.prototype.manyInternalLogic=function(e,r,n){var i=this,a=this.getLaFuncFromCache(n),o,s;if(r.DEF!==void 0){if(o=r.DEF,s=r.GATE,s!==void 0){var c=a;a=function(){return s.call(i)&&c.call(i)}}}else o=r;for(var f=!0;a.call(this)===!0&&f===!0;)f=this.doSingleRepetition(o);this.attemptInRepetitionRecovery(this.manyInternal,[e,r],a,le.MANY_IDX,e,rt.NextTerminalAfterManyWalker,f)},t.prototype.manySepFirstInternal=function(e,r){var n=this.getKeyForAutomaticLookahead(le.MANY_SEP_IDX,e);this.manySepFirstInternalLogic(e,r,n)},t.prototype.manySepFirstInternalLogic=function(e,r,n){var i=this,a=r.DEF,o=r.SEP,s=this.getLaFuncFromCache(n);if(s.call(this)===!0){a.call(this);for(var c=function(){return i.tokenMatcher(i.LA(1),o)};this.tokenMatcher(this.LA(1),o)===!0;)this.CONSUME(o),a.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,o,c,a,rt.NextTerminalAfterManySepWalker],c,le.MANY_SEP_IDX,e,rt.NextTerminalAfterManySepWalker)}},t.prototype.repetitionSepSecondInternal=function(e,r,n,i,a){for(;n();)this.CONSUME(r),i.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,r,n,i,a],n,le.AT_LEAST_ONE_SEP_IDX,e,a)},t.prototype.doSingleRepetition=function(e){var r=this.getLexerPosition();e.call(this);var n=this.getLexerPosition();return n>r},t.prototype.orInternal=function(e,r){var n=this.getKeyForAutomaticLookahead(le.OR_IDX,r),i=q.isArray(e)?e:e.DEF,a=this.getLaFuncFromCache(n),o=a.call(this,i);if(o!==void 0){var s=i[o];return s.ALT.call(this)}this.raiseNoAltException(r,e.ERR_MSG)},t.prototype.ruleFinallyStateUpdate=function(){if(this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstFinallyStateUpdate(),this.RULE_STACK.length===0&&this.isAtEndOfInput()===!1){var e=this.LA(1),r=this.errorMessageProvider.buildNotAllInputParsedMessage({firstRedundant:e,ruleName:this.getCurrRuleFullName()});this.SAVE_ERROR(new er.NotAllInputParsedException(r,e))}},t.prototype.subruleInternal=function(e,r,n){var i;try{var a=n!==void 0?n.ARGS:void 0;return i=e.call(this,r,a),this.cstPostNonTerminal(i,n!==void 0&&n.LABEL!==void 0?n.LABEL:e.ruleName),i}catch(o){this.subruleInternalError(o,n,e.ruleName)}},t.prototype.subruleInternalError=function(e,r,n){throw er.isRecognitionException(e)&&e.partialCstResult!==void 0&&(this.cstPostNonTerminal(e.partialCstResult,r!==void 0&&r.LABEL!==void 0?r.LABEL:n),delete e.partialCstResult),e},t.prototype.consumeInternal=function(e,r,n){var i;try{var a=this.LA(1);this.tokenMatcher(a,e)===!0?(this.consumeToken(),i=a):this.consumeInternalError(e,a,n)}catch(o){i=this.consumeInternalRecovery(e,r,o)}return this.cstPostTerminal(n!==void 0&&n.LABEL!==void 0?n.LABEL:e.name,i),i},t.prototype.consumeInternalError=function(e,r,n){var i,a=this.LA(0);throw n!==void 0&&n.ERR_MSG?i=n.ERR_MSG:i=this.errorMessageProvider.buildMismatchTokenMessage({expected:e,actual:r,previous:a,ruleName:this.getCurrRuleFullName()}),this.SAVE_ERROR(new er.MismatchedTokenException(i,r,a))},t.prototype.consumeInternalRecovery=function(e,r,n){if(this.recoveryEnabled&&n.name===\"MismatchedTokenException\"&&!this.isBackTracking()){var i=this.getFollowsForInRuleRecovery(e,r);try{return this.tryInRuleRecovery(e,i)}catch(a){throw a.name===Xs.IN_RULE_RECOVERY_EXCEPTION?n:a}}else throw n},t.prototype.saveRecogState=function(){var e=this.errors,r=q.cloneArr(this.RULE_STACK);return{errors:e,lexerState:this.exportLexerState(),RULE_STACK:r,CST_STACK:this.CST_STACK}},t.prototype.reloadRecogState=function(e){this.errors=e.errors,this.importLexerState(e.lexerState),this.RULE_STACK=e.RULE_STACK},t.prototype.ruleInvocationStateUpdate=function(e,r,n){this.RULE_OCCURRENCE_STACK.push(n),this.RULE_STACK.push(e),this.cstInvocationStateUpdate(r,e)},t.prototype.isBackTracking=function(){return this.isBackTrackingStack.length!==0},t.prototype.getCurrRuleFullName=function(){var e=this.getLastExplicitRuleShortName();return this.shortRuleNameToFull[e]},t.prototype.shortRuleNameToFullName=function(e){return this.shortRuleNameToFull[e]},t.prototype.isAtEndOfInput=function(){return this.tokenMatcher(this.LA(1),ca.EOF)},t.prototype.reset=function(){this.resetLexerState(),this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]},t}();Jt.RecognizerEngine=Zs});var pa=R(tr=>{\"use strict\";Object.defineProperty(tr,\"__esModule\",{value:!0});tr.ErrorHandler=void 0;var $r=et(),Zr=k(),fa=yt(),Qs=ce(),Js=function(){function t(){}return t.prototype.initErrorHandler=function(e){this._errors=[],this.errorMessageProvider=Zr.has(e,\"errorMessageProvider\")?e.errorMessageProvider:Qs.DEFAULT_PARSER_CONFIG.errorMessageProvider},t.prototype.SAVE_ERROR=function(e){if($r.isRecognitionException(e))return e.context={ruleStack:this.getHumanReadableRuleStack(),ruleOccurrenceStack:Zr.cloneArr(this.RULE_OCCURRENCE_STACK)},this._errors.push(e),e;throw Error(\"Trying to save an Error which is not a RecognitionException\")},Object.defineProperty(t.prototype,\"errors\",{get:function(){return Zr.cloneArr(this._errors)},set:function(e){this._errors=e},enumerable:!1,configurable:!0}),t.prototype.raiseEarlyExitException=function(e,r,n){for(var i=this.getCurrRuleFullName(),a=this.getGAstProductions()[i],o=fa.getLookaheadPathsForOptionalProd(e,a,r,this.maxLookahead),s=o[0],c=[],f=1;f<=this.maxLookahead;f++)c.push(this.LA(f));var p=this.errorMessageProvider.buildEarlyExitMessage({expectedIterationPaths:s,actual:c,previous:this.LA(0),customUserDescription:n,ruleName:i});throw this.SAVE_ERROR(new $r.EarlyExitException(p,this.LA(1),this.LA(0)))},t.prototype.raiseNoAltException=function(e,r){for(var n=this.getCurrRuleFullName(),i=this.getGAstProductions()[n],a=fa.getLookaheadPathsForOr(e,i,this.maxLookahead),o=[],s=1;s<=this.maxLookahead;s++)o.push(this.LA(s));var c=this.LA(0),f=this.errorMessageProvider.buildNoViableAltMessage({expectedPathsPerAlt:a,actual:o,previous:c,customUserDescription:r,ruleName:this.getCurrRuleFullName()});throw this.SAVE_ERROR(new $r.NoViableAltException(f,this.LA(1),c))},t}();tr.ErrorHandler=Js});var va=R(rr=>{\"use strict\";Object.defineProperty(rr,\"__esModule\",{value:!0});rr.ContentAssist=void 0;var ha=Tt(),da=k(),eu=function(){function t(){}return t.prototype.initContentAssist=function(){},t.prototype.computeContentAssist=function(e,r){var n=this.gastProductionsCache[e];if(da.isUndefined(n))throw Error(\"Rule ->\"+e+\"<- does not exist in this grammar.\");return ha.nextPossibleTokensAfter([n],r,this.tokenMatcher,this.maxLookahead)},t.prototype.getNextPossibleTokenTypes=function(e){var r=da.first(e.ruleStack),n=this.getGAstProductions(),i=n[r],a=new ha.NextAfterTokenWalker(i,e).startWalking();return a},t}();rr.ContentAssist=eu});var Ra=R(nr=>{\"use strict\";Object.defineProperty(nr,\"__esModule\",{value:!0});nr.GastRecorder=void 0;var oe=k(),Pe=ne(),tu=ft(),ma=Xe(),Ea=Ue(),ru=ce(),nu=Yt(),ir={description:\"This Object indicates the Parser is during Recording Phase\"};Object.freeze(ir);var Ta=!0,ya=Math.pow(2,nu.BITS_FOR_OCCURRENCE_IDX)-1,_a=Ea.createToken({name:\"RECORDING_PHASE_TOKEN\",pattern:tu.Lexer.NA});ma.augmentTokenTypes([_a]);var ga=Ea.createTokenInstance(_a,`This IToken indicates the Parser is in Recording Phase\n\tSee: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,-1,-1,-1,-1,-1,-1);Object.freeze(ga);var iu={name:`This CSTNode indicates the Parser is in Recording Phase\n\tSee: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,children:{}},ou=function(){function t(){}return t.prototype.initGastRecorder=function(e){this.recordingProdStack=[],this.RECORDING_PHASE=!1},t.prototype.enableRecording=function(){var e=this;this.RECORDING_PHASE=!0,this.TRACE_INIT(\"Enable Recording\",function(){for(var r=function(i){var a=i>0?i:\"\";e[\"CONSUME\"+a]=function(o,s){return this.consumeInternalRecord(o,i,s)},e[\"SUBRULE\"+a]=function(o,s){return this.subruleInternalRecord(o,i,s)},e[\"OPTION\"+a]=function(o){return this.optionInternalRecord(o,i)},e[\"OR\"+a]=function(o){return this.orInternalRecord(o,i)},e[\"MANY\"+a]=function(o){this.manyInternalRecord(i,o)},e[\"MANY_SEP\"+a]=function(o){this.manySepFirstInternalRecord(i,o)},e[\"AT_LEAST_ONE\"+a]=function(o){this.atLeastOneInternalRecord(i,o)},e[\"AT_LEAST_ONE_SEP\"+a]=function(o){this.atLeastOneSepFirstInternalRecord(i,o)}},n=0;n<10;n++)r(n);e.consume=function(i,a,o){return this.consumeInternalRecord(a,i,o)},e.subrule=function(i,a,o){return this.subruleInternalRecord(a,i,o)},e.option=function(i,a){return this.optionInternalRecord(a,i)},e.or=function(i,a){return this.orInternalRecord(a,i)},e.many=function(i,a){this.manyInternalRecord(i,a)},e.atLeastOne=function(i,a){this.atLeastOneInternalRecord(i,a)},e.ACTION=e.ACTION_RECORD,e.BACKTRACK=e.BACKTRACK_RECORD,e.LA=e.LA_RECORD})},t.prototype.disableRecording=function(){var e=this;this.RECORDING_PHASE=!1,this.TRACE_INIT(\"Deleting Recording methods\",function(){for(var r=0;r<10;r++){var n=r>0?r:\"\";delete e[\"CONSUME\"+n],delete e[\"SUBRULE\"+n],delete e[\"OPTION\"+n],delete e[\"OR\"+n],delete e[\"MANY\"+n],delete e[\"MANY_SEP\"+n],delete e[\"AT_LEAST_ONE\"+n],delete e[\"AT_LEAST_ONE_SEP\"+n]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})},t.prototype.ACTION_RECORD=function(e){},t.prototype.BACKTRACK_RECORD=function(e,r){return function(){return!0}},t.prototype.LA_RECORD=function(e){return ru.END_OF_FILE},t.prototype.topLevelRuleRecord=function(e,r){try{var n=new Pe.Rule({definition:[],name:e});return n.name=e,this.recordingProdStack.push(n),r.call(this),this.recordingProdStack.pop(),n}catch(i){if(i.KNOWN_RECORDER_ERROR!==!0)try{i.message=i.message+`\n\t This error was thrown during the \"grammar recording phase\" For more info see:\n\thttps://chevrotain.io/docs/guide/internals.html#grammar-recording`}catch(a){throw i}throw i}},t.prototype.optionInternalRecord=function(e,r){return Ot.call(this,Pe.Option,e,r)},t.prototype.atLeastOneInternalRecord=function(e,r){Ot.call(this,Pe.RepetitionMandatory,r,e)},t.prototype.atLeastOneSepFirstInternalRecord=function(e,r){Ot.call(this,Pe.RepetitionMandatoryWithSeparator,r,e,Ta)},t.prototype.manyInternalRecord=function(e,r){Ot.call(this,Pe.Repetition,r,e)},t.prototype.manySepFirstInternalRecord=function(e,r){Ot.call(this,Pe.RepetitionWithSeparator,r,e,Ta)},t.prototype.orInternalRecord=function(e,r){return au.call(this,e,r)},t.prototype.subruleInternalRecord=function(e,r,n){if(ar(r),!e||oe.has(e,\"ruleName\")===!1){var i=new Error(\"<SUBRULE\"+Aa(r)+\"> argument is invalid\"+(\" expecting a Parser method reference but got: <\"+JSON.stringify(e)+\">\")+(`\n inside top level rule: <`+this.recordingProdStack[0].name+\">\"));throw i.KNOWN_RECORDER_ERROR=!0,i}var a=oe.peek(this.recordingProdStack),o=e.ruleName,s=new Pe.NonTerminal({idx:r,nonTerminalName:o,referencedRule:void 0});return a.definition.push(s),this.outputCst?iu:ir},t.prototype.consumeInternalRecord=function(e,r,n){if(ar(r),!ma.hasShortKeyProperty(e)){var i=new Error(\"<CONSUME\"+Aa(r)+\"> argument is invalid\"+(\" expecting a TokenType reference but got: <\"+JSON.stringify(e)+\">\")+(`\n inside top level rule: <`+this.recordingProdStack[0].name+\">\"));throw i.KNOWN_RECORDER_ERROR=!0,i}var a=oe.peek(this.recordingProdStack),o=new Pe.Terminal({idx:r,terminalType:e});return a.definition.push(o),ga},t}();nr.GastRecorder=ou;function Ot(t,e,r,n){n===void 0&&(n=!1),ar(r);var i=oe.peek(this.recordingProdStack),a=oe.isFunction(e)?e:e.DEF,o=new t({definition:[],idx:r});return n&&(o.separator=e.SEP),oe.has(e,\"MAX_LOOKAHEAD\")&&(o.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(o),a.call(this),i.definition.push(o),this.recordingProdStack.pop(),ir}function au(t,e){var r=this;ar(e);var n=oe.peek(this.recordingProdStack),i=oe.isArray(t)===!1,a=i===!1?t:t.DEF,o=new Pe.Alternation({definition:[],idx:e,ignoreAmbiguities:i&&t.IGNORE_AMBIGUITIES===!0});oe.has(t,\"MAX_LOOKAHEAD\")&&(o.maxLookahead=t.MAX_LOOKAHEAD);var s=oe.some(a,function(c){return oe.isFunction(c.GATE)});return o.hasPredicates=s,n.definition.push(o),oe.forEach(a,function(c){var f=new Pe.Alternative({definition:[]});o.definition.push(f),oe.has(c,\"IGNORE_AMBIGUITIES\")?f.ignoreAmbiguities=c.IGNORE_AMBIGUITIES:oe.has(c,\"GATE\")&&(f.ignoreAmbiguities=!0),r.recordingProdStack.push(f),c.ALT.call(r),r.recordingProdStack.pop()}),ir}function Aa(t){return t===0?\"\":\"\"+t}function ar(t){if(t<0||t>ya){var e=new Error(\"Invalid DSL Method idx value: <\"+t+`>\n\t`+(\"Idx value must be a none negative value smaller than \"+(ya+1)));throw e.KNOWN_RECORDER_ERROR=!0,e}}});var Na=R(or=>{\"use strict\";Object.defineProperty(or,\"__esModule\",{value:!0});or.PerformanceTracer=void 0;var Oa=k(),su=ce(),uu=function(){function t(){}return t.prototype.initPerformanceTracer=function(e){if(Oa.has(e,\"traceInitPerf\")){var r=e.traceInitPerf,n=typeof r==\"number\";this.traceInitMaxIdent=n?r:Infinity,this.traceInitPerf=n?r>0:r}else this.traceInitMaxIdent=0,this.traceInitPerf=su.DEFAULT_PARSER_CONFIG.traceInitPerf;this.traceInitIndent=-1},t.prototype.TRACE_INIT=function(e,r){if(this.traceInitPerf===!0){this.traceInitIndent++;var n=new Array(this.traceInitIndent+1).join(\"\t\");this.traceInitIndent<this.traceInitMaxIdent&&console.log(n+\"--> <\"+e+\">\");var i=Oa.timer(r),a=i.time,o=i.value,s=a>10?console.warn:console.log;return this.traceInitIndent<this.traceInitMaxIdent&&s(n+\"<-- <\"+e+\"> time: \"+a+\"ms\"),this.traceInitIndent--,o}else return r()},t}();or.PerformanceTracer=uu});var Ia=R(sr=>{\"use strict\";Object.defineProperty(sr,\"__esModule\",{value:!0});sr.applyMixins=void 0;function cu(t,e){e.forEach(function(r){var n=r.prototype;Object.getOwnPropertyNames(n).forEach(function(i){if(i!==\"constructor\"){var a=Object.getOwnPropertyDescriptor(n,i);a&&(a.get||a.set)?Object.defineProperty(t.prototype,i,a):t.prototype[i]=r.prototype[i]}})})}sr.applyMixins=cu});var ce=R(U=>{\"use strict\";var ka=U&&U.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(n,i){n.__proto__=i}||function(n,i){for(var a in i)Object.prototype.hasOwnProperty.call(i,a)&&(n[a]=i[a])},t(e,r)};return function(e,r){if(typeof r!=\"function\"&&r!==null)throw new TypeError(\"Class extends value \"+String(r)+\" is not a constructor or null\");t(e,r);function n(){this.constructor=e}e.prototype=r===null?Object.create(r):(n.prototype=r.prototype,new n)}}();Object.defineProperty(U,\"__esModule\",{value:!0});U.EmbeddedActionsParser=U.CstParser=U.Parser=U.EMPTY_ALT=U.ParserDefinitionErrorType=U.DEFAULT_RULE_CONFIG=U.DEFAULT_PARSER_CONFIG=U.END_OF_FILE=void 0;var ee=k(),lu=pi(),Pa=Ue(),Sa=mt(),xa=Ui(),fu=zr(),pu=zi(),hu=ra(),du=ia(),vu=oa(),mu=la(),Eu=pa(),Tu=va(),yu=Ra(),_u=Na(),gu=Ia();U.END_OF_FILE=Pa.createTokenInstance(Pa.EOF,\"\",NaN,NaN,NaN,NaN,NaN,NaN);Object.freeze(U.END_OF_FILE);U.DEFAULT_PARSER_CONFIG=Object.freeze({recoveryEnabled:!1,maxLookahead:3,dynamicTokensEnabled:!1,outputCst:!0,errorMessageProvider:Sa.defaultParserErrorProvider,nodeLocationTracking:\"none\",traceInitPerf:!1,skipValidations:!1});U.DEFAULT_RULE_CONFIG=Object.freeze({recoveryValueFunc:function(){},resyncEnabled:!0});var Au;(function(t){t[t.INVALID_RULE_NAME=0]=\"INVALID_RULE_NAME\",t[t.DUPLICATE_RULE_NAME=1]=\"DUPLICATE_RULE_NAME\",t[t.INVALID_RULE_OVERRIDE=2]=\"INVALID_RULE_OVERRIDE\",t[t.DUPLICATE_PRODUCTIONS=3]=\"DUPLICATE_PRODUCTIONS\",t[t.UNRESOLVED_SUBRULE_REF=4]=\"UNRESOLVED_SUBRULE_REF\",t[t.LEFT_RECURSION=5]=\"LEFT_RECURSION\",t[t.NONE_LAST_EMPTY_ALT=6]=\"NONE_LAST_EMPTY_ALT\",t[t.AMBIGUOUS_ALTS=7]=\"AMBIGUOUS_ALTS\",t[t.CONFLICT_TOKENS_RULES_NAMESPACE=8]=\"CONFLICT_TOKENS_RULES_NAMESPACE\",t[t.INVALID_TOKEN_NAME=9]=\"INVALID_TOKEN_NAME\",t[t.NO_NON_EMPTY_LOOKAHEAD=10]=\"NO_NON_EMPTY_LOOKAHEAD\",t[t.AMBIGUOUS_PREFIX_ALTS=11]=\"AMBIGUOUS_PREFIX_ALTS\",t[t.TOO_MANY_ALTS=12]=\"TOO_MANY_ALTS\"})(Au=U.ParserDefinitionErrorType||(U.ParserDefinitionErrorType={}));function Ru(t){return t===void 0&&(t=void 0),function(){return t}}U.EMPTY_ALT=Ru;var ur=function(){function t(e,r){this.definitionErrors=[],this.selfAnalysisDone=!1;var n=this;if(n.initErrorHandler(r),n.initLexerAdapter(),n.initLooksAhead(r),n.initRecognizerEngine(e,r),n.initRecoverable(r),n.initTreeBuilder(r),n.initContentAssist(),n.initGastRecorder(r),n.initPerformanceTracer(r),ee.has(r,\"ignoredIssues\"))throw new Error(`The <ignoredIssues> IParserConfig property has been deprecated.\n\tPlease use the <IGNORE_AMBIGUITIES> flag on the relevant DSL method instead.\n\tSee: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES\n\tFor further details.`);this.skipValidations=ee.has(r,\"skipValidations\")?r.skipValidations:U.DEFAULT_PARSER_CONFIG.skipValidations}return t.performSelfAnalysis=function(e){throw Error(\"The **static** `performSelfAnalysis` method has been deprecated.\t\\nUse the **instance** method with the same name instead.\")},t.prototype.performSelfAnalysis=function(){var e=this;this.TRACE_INIT(\"performSelfAnalysis\",function(){var r;e.selfAnalysisDone=!0;var n=e.className;e.TRACE_INIT(\"toFastProps\",function(){ee.toFastProperties(e)}),e.TRACE_INIT(\"Grammar Recording\",function(){try{e.enableRecording(),ee.forEach(e.definedRulesNames,function(a){var o=e[a],s=o.originalGrammarAction,c=void 0;e.TRACE_INIT(a+\" Rule\",function(){c=e.topLevelRuleRecord(a,s)}),e.gastProductionsCache[a]=c})}finally{e.disableRecording()}});var i=[];if(e.TRACE_INIT(\"Grammar Resolving\",function(){i=xa.resolveGrammar({rules:ee.values(e.gastProductionsCache)}),e.definitionErrors=e.definitionErrors.concat(i)}),e.TRACE_INIT(\"Grammar Validations\",function(){if(ee.isEmpty(i)&&e.skipValidations===!1){var a=xa.validateGrammar({rules:ee.values(e.gastProductionsCache),maxLookahead:e.maxLookahead,tokenTypes:ee.values(e.tokensMap),errMsgProvider:Sa.defaultGrammarValidatorErrorProvider,grammarName:n});e.definitionErrors=e.definitionErrors.concat(a)}}),ee.isEmpty(e.definitionErrors)&&(e.recoveryEnabled&&e.TRACE_INIT(\"computeAllProdsFollows\",function(){var a=lu.computeAllProdsFollows(ee.values(e.gastProductionsCache));e.resyncFollows=a}),e.TRACE_INIT(\"ComputeLookaheadFunctions\",function(){e.preComputeLookaheadFunctions(ee.values(e.gastProductionsCache))})),!t.DEFER_DEFINITION_ERRORS_HANDLING&&!ee.isEmpty(e.definitionErrors))throw r=ee.map(e.definitionErrors,function(a){return a.message}),new Error(`Parser Definition Errors detected:\n `+r.join(`\n-------------------------------\n`))})},t.DEFER_DEFINITION_ERRORS_HANDLING=!1,t}();U.Parser=ur;gu.applyMixins(ur,[fu.Recoverable,pu.LooksAhead,hu.TreeBuilder,du.LexerAdapter,mu.RecognizerEngine,vu.RecognizerApi,Eu.ErrorHandler,Tu.ContentAssist,yu.GastRecorder,_u.PerformanceTracer]);var Ou=function(t){ka(e,t);function e(r,n){n===void 0&&(n=U.DEFAULT_PARSER_CONFIG);var i=this,a=ee.cloneObj(n);return a.outputCst=!0,i=t.call(this,r,a)||this,i}return e}(ur);U.CstParser=Ou;var Nu=function(t){ka(e,t);function e(r,n){n===void 0&&(n=U.DEFAULT_PARSER_CONFIG);var i=this,a=ee.cloneObj(n);return a.outputCst=!1,i=t.call(this,r,a)||this,i}return e}(ur);U.EmbeddedActionsParser=Nu});var La=R(cr=>{\"use strict\";Object.defineProperty(cr,\"__esModule\",{value:!0});cr.createSyntaxDiagramsCode=void 0;var Ca=Er();function Iu(t,e){var r=e===void 0?{}:e,n=r.resourceBase,i=n===void 0?\"https://unpkg.com/chevrotain@\"+Ca.VERSION+\"/diagrams/\":n,a=r.css,o=a===void 0?\"https://unpkg.com/chevrotain@\"+Ca.VERSION+\"/diagrams/diagrams.css\":a,s=`\n<!-- This is a generated file -->\n<!DOCTYPE html>\n<meta charset=\"utf-8\">\n<style>\n  body {\n    background-color: hsl(30, 20%, 95%)\n  }\n</style>\n\n`,c=`\n<link rel='stylesheet' href='`+o+`'>\n`,f=`\n<script src='`+i+`vendor/railroad-diagrams.js'></script>\n<script src='`+i+`src/diagrams_builder.js'></script>\n<script src='`+i+`src/diagrams_behavior.js'></script>\n<script src='`+i+`src/main.js'></script>\n`,p=`\n<div id=\"diagrams\" align=\"center\"></div>\n`,l=`\n<script>\n    window.serializedGrammar = `+JSON.stringify(t,null,\"  \")+`;\n</script>\n`,m=`\n<script>\n    var diagramsDiv = document.getElementById(\"diagrams\");\n    main.drawDiagramsFromSerializedGrammar(serializedGrammar, diagramsDiv);\n</script>\n`;return s+c+f+p+l+m}cr.createSyntaxDiagramsCode=Iu});var Fa=R(E=>{\"use strict\";Object.defineProperty(E,\"__esModule\",{value:!0});E.Parser=E.createSyntaxDiagramsCode=E.clearCache=E.GAstVisitor=E.serializeProduction=E.serializeGrammar=E.Terminal=E.Rule=E.RepetitionWithSeparator=E.RepetitionMandatoryWithSeparator=E.RepetitionMandatory=E.Repetition=E.Option=E.NonTerminal=E.Alternative=E.Alternation=E.defaultLexerErrorProvider=E.NoViableAltException=E.NotAllInputParsedException=E.MismatchedTokenException=E.isRecognitionException=E.EarlyExitException=E.defaultParserErrorProvider=E.tokenName=E.tokenMatcher=E.tokenLabel=E.EOF=E.createTokenInstance=E.createToken=E.LexerDefinitionErrorType=E.Lexer=E.EMPTY_ALT=E.ParserDefinitionErrorType=E.EmbeddedActionsParser=E.CstParser=E.VERSION=void 0;var ku=Er();Object.defineProperty(E,\"VERSION\",{enumerable:!0,get:function(){return ku.VERSION}});var lr=ce();Object.defineProperty(E,\"CstParser\",{enumerable:!0,get:function(){return lr.CstParser}});Object.defineProperty(E,\"EmbeddedActionsParser\",{enumerable:!0,get:function(){return lr.EmbeddedActionsParser}});Object.defineProperty(E,\"ParserDefinitionErrorType\",{enumerable:!0,get:function(){return lr.ParserDefinitionErrorType}});Object.defineProperty(E,\"EMPTY_ALT\",{enumerable:!0,get:function(){return lr.EMPTY_ALT}});var Ma=ft();Object.defineProperty(E,\"Lexer\",{enumerable:!0,get:function(){return Ma.Lexer}});Object.defineProperty(E,\"LexerDefinitionErrorType\",{enumerable:!0,get:function(){return Ma.LexerDefinitionErrorType}});var nt=Ue();Object.defineProperty(E,\"createToken\",{enumerable:!0,get:function(){return nt.createToken}});Object.defineProperty(E,\"createTokenInstance\",{enumerable:!0,get:function(){return nt.createTokenInstance}});Object.defineProperty(E,\"EOF\",{enumerable:!0,get:function(){return nt.EOF}});Object.defineProperty(E,\"tokenLabel\",{enumerable:!0,get:function(){return nt.tokenLabel}});Object.defineProperty(E,\"tokenMatcher\",{enumerable:!0,get:function(){return nt.tokenMatcher}});Object.defineProperty(E,\"tokenName\",{enumerable:!0,get:function(){return nt.tokenName}});var Pu=mt();Object.defineProperty(E,\"defaultParserErrorProvider\",{enumerable:!0,get:function(){return Pu.defaultParserErrorProvider}});var Nt=et();Object.defineProperty(E,\"EarlyExitException\",{enumerable:!0,get:function(){return Nt.EarlyExitException}});Object.defineProperty(E,\"isRecognitionException\",{enumerable:!0,get:function(){return Nt.isRecognitionException}});Object.defineProperty(E,\"MismatchedTokenException\",{enumerable:!0,get:function(){return Nt.MismatchedTokenException}});Object.defineProperty(E,\"NotAllInputParsedException\",{enumerable:!0,get:function(){return Nt.NotAllInputParsedException}});Object.defineProperty(E,\"NoViableAltException\",{enumerable:!0,get:function(){return Nt.NoViableAltException}});var Su=kr();Object.defineProperty(E,\"defaultLexerErrorProvider\",{enumerable:!0,get:function(){return Su.defaultLexerErrorProvider}});var Se=ne();Object.defineProperty(E,\"Alternation\",{enumerable:!0,get:function(){return Se.Alternation}});Object.defineProperty(E,\"Alternative\",{enumerable:!0,get:function(){return Se.Alternative}});Object.defineProperty(E,\"NonTerminal\",{enumerable:!0,get:function(){return Se.NonTerminal}});Object.defineProperty(E,\"Option\",{enumerable:!0,get:function(){return Se.Option}});Object.defineProperty(E,\"Repetition\",{enumerable:!0,get:function(){return Se.Repetition}});Object.defineProperty(E,\"RepetitionMandatory\",{enumerable:!0,get:function(){return Se.RepetitionMandatory}});Object.defineProperty(E,\"RepetitionMandatoryWithSeparator\",{enumerable:!0,get:function(){return Se.RepetitionMandatoryWithSeparator}});Object.defineProperty(E,\"RepetitionWithSeparator\",{enumerable:!0,get:function(){return Se.RepetitionWithSeparator}});Object.defineProperty(E,\"Rule\",{enumerable:!0,get:function(){return Se.Rule}});Object.defineProperty(E,\"Terminal\",{enumerable:!0,get:function(){return Se.Terminal}});var ba=ne();Object.defineProperty(E,\"serializeGrammar\",{enumerable:!0,get:function(){return ba.serializeGrammar}});Object.defineProperty(E,\"serializeProduction\",{enumerable:!0,get:function(){return ba.serializeProduction}});var xu=$e();Object.defineProperty(E,\"GAstVisitor\",{enumerable:!0,get:function(){return xu.GAstVisitor}});function Cu(){console.warn(`The clearCache function was 'soft' removed from the Chevrotain API.\n\t It performs no action other than printing this message.\n\t Please avoid using it as it will be completely removed in the future`)}E.clearCache=Cu;var Lu=La();Object.defineProperty(E,\"createSyntaxDiagramsCode\",{enumerable:!0,get:function(){return Lu.createSyntaxDiagramsCode}});var Mu=function(){function t(){throw new Error(`The Parser class has been deprecated, use CstParser or EmbeddedActionsParser instead.\nSee: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_7-0-0`)}return t}();E.Parser=Mu});export default Fa();\n", "import {\n\tBackSide,\n\tBoxGeometry,\n\tBufferAttribute,\n\tBufferGeometry,\n\tClampToEdgeWrapping,\n\tColor,\n\tColorManagement,\n\tConeGeometry,\n\tCylinderGeometry,\n\tDataTexture,\n\tDoubleSide,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tFrontSide,\n\tGroup,\n\tLineBasicMaterial,\n\tLineSegments,\n\tLoader,\n\tLoaderUtils,\n\tMesh,\n\tMeshBasicMaterial,\n\tMeshPhongMaterial,\n\tObject3D,\n\tPoints,\n\tPointsMaterial,\n\tQuaternion,\n\tRepeatWrapping,\n\tScene,\n\tShapeUtils,\n\tSphereGeometry,\n\tSRGBColorSpace,\n\tTextureLoader,\n\tVector2,\n\tVector3\n} from 'three';\nimport chevrotain from '../libs/chevrotain.module.min.js';\n\n/**\n * A loader for the VRML format.\n *\n * ```js\n * const loader = new VRMLLoader();\n * const object = await loader.loadAsync( 'models/vrml/house.wrl' );\n * scene.add( object );\n * ```\n *\n * @augments Loader\n * @three_import import { VRMLLoader } from 'three/addons/loaders/VRMLLoader.js';\n */\nclass VRMLLoader extends Loader {\n\n\t/**\n\t * Constructs a new VRML loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded VRML asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(Scene)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst path = ( scope.path === '' ) ? LoaderUtils.extractUrlBase( url ) : scope.path;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( text, path ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given VRML data and returns the resulting scene.\n\t *\n\t * @param {string} data - The raw VRML data as a string.\n\t * @param {string} path - The URL base path.\n\t * @return {Scene} The parsed scene.\n\t */\n\tparse( data, path ) {\n\n\t\tconst nodeMap = {};\n\n\t\tfunction generateVRMLTree( data ) {\n\n\t\t\t// create lexer, parser and visitor\n\n\t\t\tconst tokenData = createTokens();\n\n\t\t\tconst lexer = new VRMLLexer( tokenData.tokens );\n\t\t\tconst parser = new VRMLParser( tokenData.tokenVocabulary );\n\t\t\tconst visitor = createVisitor( parser.getBaseCstVisitorConstructor() );\n\n\t\t\t// lexing\n\n\t\t\tconst lexingResult = lexer.lex( data );\n\t\t\tparser.input = lexingResult.tokens;\n\n\t\t\t// parsing\n\n\t\t\tconst cstOutput = parser.vrml();\n\n\t\t\tif ( parser.errors.length > 0 ) {\n\n\t\t\t\tconsole.error( parser.errors );\n\n\t\t\t\tthrow Error( 'THREE.VRMLLoader: Parsing errors detected.' );\n\n\t\t\t}\n\n\t\t\t// actions\n\n\t\t\tconst ast = visitor.visit( cstOutput );\n\n\t\t\treturn ast;\n\n\t\t}\n\n\t\tfunction createTokens() {\n\n\t\t\tconst createToken = chevrotain.createToken;\n\n\t\t\t// from http://gun.teipir.gr/VRML-amgem/spec/part1/concepts.html#SyntaxBasics\n\n\t\t\tconst RouteIdentifier = createToken( { name: 'RouteIdentifier', pattern: /[^\\x30-\\x39\\0-\\x20\\x22\\x27\\x23\\x2b\\x2c\\x2d\\x2e\\x5b\\x5d\\x5c\\x7b\\x7d][^\\0-\\x20\\x22\\x27\\x23\\x2b\\x2c\\x2d\\x2e\\x5b\\x5d\\x5c\\x7b\\x7d]*[\\.][^\\x30-\\x39\\0-\\x20\\x22\\x27\\x23\\x2b\\x2c\\x2d\\x2e\\x5b\\x5d\\x5c\\x7b\\x7d][^\\0-\\x20\\x22\\x27\\x23\\x2b\\x2c\\x2d\\x2e\\x5b\\x5d\\x5c\\x7b\\x7d]*/ } );\n\t\t\tconst Identifier = createToken( { name: 'Identifier', pattern: /[^\\x30-\\x39\\0-\\x20\\x22\\x27\\x23\\x2b\\x2c\\x2d\\x2e\\x5b\\x5d\\x5c\\x7b\\x7d]([^\\0-\\x20\\x22\\x27\\x23\\x2b\\x2c\\x2e\\x5b\\x5d\\x5c\\x7b\\x7d])*/, longer_alt: RouteIdentifier } );\n\n\t\t\t// from http://gun.teipir.gr/VRML-amgem/spec/part1/nodesRef.html\n\n\t\t\tconst nodeTypes = [\n\t\t\t\t'Anchor', 'Billboard', 'Collision', 'Group', 'Transform', // grouping nodes\n\t\t\t\t'Inline', 'LOD', 'Switch', // special groups\n\t\t\t\t'AudioClip', 'DirectionalLight', 'PointLight', 'Script', 'Shape', 'Sound', 'SpotLight', 'WorldInfo', // common nodes\n\t\t\t\t'CylinderSensor', 'PlaneSensor', 'ProximitySensor', 'SphereSensor', 'TimeSensor', 'TouchSensor', 'VisibilitySensor', // sensors\n\t\t\t\t'Box', 'Cone', 'Cylinder', 'ElevationGrid', 'Extrusion', 'IndexedFaceSet', 'IndexedLineSet', 'PointSet', 'Sphere', // geometries\n\t\t\t\t'Color', 'Coordinate', 'Normal', 'TextureCoordinate', // geometric properties\n\t\t\t\t'Appearance', 'FontStyle', 'ImageTexture', 'Material', 'MovieTexture', 'PixelTexture', 'TextureTransform', // appearance\n\t\t\t\t'ColorInterpolator', 'CoordinateInterpolator', 'NormalInterpolator', 'OrientationInterpolator', 'PositionInterpolator', 'ScalarInterpolator', // interpolators\n\t\t\t\t'Background', 'Fog', 'NavigationInfo', 'Viewpoint', // bindable nodes\n\t\t\t\t'Text' // Text must be placed at the end of the regex so there are no matches for TextureTransform and TextureCoordinate\n\t\t\t];\n\n\t\t\t//\n\n\t\t\tconst Version = createToken( {\n\t\t\t\tname: 'Version',\n\t\t\t\tpattern: /#VRML.*/,\n\t\t\t\tlonger_alt: Identifier\n\t\t\t} );\n\n\t\t\tconst NodeName = createToken( {\n\t\t\t\tname: 'NodeName',\n\t\t\t\tpattern: new RegExp( nodeTypes.join( '|' ) ),\n\t\t\t\tlonger_alt: Identifier\n\t\t\t} );\n\n\t\t\tconst DEF = createToken( {\n\t\t\t\tname: 'DEF',\n\t\t\t\tpattern: /DEF/,\n\t\t\t\tlonger_alt: Identifier\n\t\t\t} );\n\n\t\t\tconst USE = createToken( {\n\t\t\t\tname: 'USE',\n\t\t\t\tpattern: /USE/,\n\t\t\t\tlonger_alt: Identifier\n\t\t\t} );\n\n\t\t\tconst ROUTE = createToken( {\n\t\t\t\tname: 'ROUTE',\n\t\t\t\tpattern: /ROUTE/,\n\t\t\t\tlonger_alt: Identifier\n\t\t\t} );\n\n\t\t\tconst TO = createToken( {\n\t\t\t\tname: 'TO',\n\t\t\t\tpattern: /TO/,\n\t\t\t\tlonger_alt: Identifier\n\t\t\t} );\n\n\t\t\t//\n\n\t\t\tconst StringLiteral = createToken( { name: 'StringLiteral', pattern: /\"(?:[^\\\\\"\\n\\r]|\\\\[bfnrtv\"\\\\/]|\\\\u[0-9a-fA-F][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F])*\"/ } );\n\t\t\tconst HexLiteral = createToken( { name: 'HexLiteral', pattern: /0[xX][0-9a-fA-F]+/ } );\n\t\t\tconst NumberLiteral = createToken( { name: 'NumberLiteral', pattern: /[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?/ } );\n\t\t\tconst TrueLiteral = createToken( { name: 'TrueLiteral', pattern: /TRUE/ } );\n\t\t\tconst FalseLiteral = createToken( { name: 'FalseLiteral', pattern: /FALSE/ } );\n\t\t\tconst NullLiteral = createToken( { name: 'NullLiteral', pattern: /NULL/ } );\n\t\t\tconst LSquare = createToken( { name: 'LSquare', pattern: /\\[/ } );\n\t\t\tconst RSquare = createToken( { name: 'RSquare', pattern: /]/ } );\n\t\t\tconst LCurly = createToken( { name: 'LCurly', pattern: /{/ } );\n\t\t\tconst RCurly = createToken( { name: 'RCurly', pattern: /}/ } );\n\t\t\tconst Comment = createToken( {\n\t\t\t\tname: 'Comment',\n\t\t\t\tpattern: /#.*/,\n\t\t\t\tgroup: chevrotain.Lexer.SKIPPED\n\t\t\t} );\n\n\t\t\t// commas, blanks, tabs, newlines and carriage returns are whitespace characters wherever they appear outside of string fields\n\n\t\t\tconst WhiteSpace = createToken( {\n\t\t\t\tname: 'WhiteSpace',\n\t\t\t\tpattern: /[ ,\\s]/,\n\t\t\t\tgroup: chevrotain.Lexer.SKIPPED\n\t\t\t} );\n\n\t\t\tconst tokens = [\n\t\t\t\tWhiteSpace,\n\t\t\t\t// keywords appear before the Identifier\n\t\t\t\tNodeName,\n\t\t\t\tDEF,\n\t\t\t\tUSE,\n\t\t\t\tROUTE,\n\t\t\t\tTO,\n\t\t\t\tTrueLiteral,\n\t\t\t\tFalseLiteral,\n\t\t\t\tNullLiteral,\n\t\t\t\t// the Identifier must appear after the keywords because all keywords are valid identifiers\n\t\t\t\tVersion,\n\t\t\t\tIdentifier,\n\t\t\t\tRouteIdentifier,\n\t\t\t\tStringLiteral,\n\t\t\t\tHexLiteral,\n\t\t\t\tNumberLiteral,\n\t\t\t\tLSquare,\n\t\t\t\tRSquare,\n\t\t\t\tLCurly,\n\t\t\t\tRCurly,\n\t\t\t\tComment\n\t\t\t];\n\n\t\t\tconst tokenVocabulary = {};\n\n\t\t\tfor ( let i = 0, l = tokens.length; i < l; i ++ ) {\n\n\t\t\t\tconst token = tokens[ i ];\n\n\t\t\t\ttokenVocabulary[ token.name ] = token;\n\n\t\t\t}\n\n\t\t\treturn { tokens: tokens, tokenVocabulary: tokenVocabulary };\n\n\t\t}\n\n\n\t\tfunction createVisitor( BaseVRMLVisitor ) {\n\n\t\t\t// the visitor is created dynamically based on the given base class\n\n\t\t\tclass VRMLToASTVisitor extends BaseVRMLVisitor {\n\n\t\t\t\tconstructor() {\n\n\t\t\t\t\tsuper();\n\n\t\t\t\t\tthis.validateVisitor();\n\n\t\t\t\t}\n\n\t\t\t\tvrml( ctx ) {\n\n\t\t\t\t\tconst data = {\n\t\t\t\t\t\tversion: this.visit( ctx.version ),\n\t\t\t\t\t\tnodes: [],\n\t\t\t\t\t\troutes: []\n\t\t\t\t\t};\n\n\t\t\t\t\tfor ( let i = 0, l = ctx.node.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst node = ctx.node[ i ];\n\n\t\t\t\t\t\tdata.nodes.push( this.visit( node ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ctx.route ) {\n\n\t\t\t\t\t\tfor ( let i = 0, l = ctx.route.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tconst route = ctx.route[ i ];\n\n\t\t\t\t\t\t\tdata.routes.push( this.visit( route ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn data;\n\n\t\t\t\t}\n\n\t\t\t\tversion( ctx ) {\n\n\t\t\t\t\treturn ctx.Version[ 0 ].image;\n\n\t\t\t\t}\n\n\t\t\t\tnode( ctx ) {\n\n\t\t\t\t\tconst data = {\n\t\t\t\t\t\tname: ctx.NodeName[ 0 ].image,\n\t\t\t\t\t\tfields: []\n\t\t\t\t\t};\n\n\t\t\t\t\tif ( ctx.field ) {\n\n\t\t\t\t\t\tfor ( let i = 0, l = ctx.field.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tconst field = ctx.field[ i ];\n\n\t\t\t\t\t\t\tdata.fields.push( this.visit( field ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// DEF\n\n\t\t\t\t\tif ( ctx.def ) {\n\n\t\t\t\t\t\tdata.DEF = this.visit( ctx.def[ 0 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn data;\n\n\t\t\t\t}\n\n\t\t\t\tfield( ctx ) {\n\n\t\t\t\t\tconst data = {\n\t\t\t\t\t\tname: ctx.Identifier[ 0 ].image,\n\t\t\t\t\t\ttype: null,\n\t\t\t\t\t\tvalues: null\n\t\t\t\t\t};\n\n\t\t\t\t\tlet result;\n\n\t\t\t\t\t// SFValue\n\n\t\t\t\t\tif ( ctx.singleFieldValue ) {\n\n\t\t\t\t\t\tresult = this.visit( ctx.singleFieldValue[ 0 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// MFValue\n\n\t\t\t\t\tif ( ctx.multiFieldValue ) {\n\n\t\t\t\t\t\tresult = this.visit( ctx.multiFieldValue[ 0 ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tdata.type = result.type;\n\t\t\t\t\tdata.values = result.values;\n\n\t\t\t\t\treturn data;\n\n\t\t\t\t}\n\n\t\t\t\tdef( ctx ) {\n\n\t\t\t\t\treturn ( ctx.Identifier || ctx.NodeName )[ 0 ].image;\n\n\t\t\t\t}\n\n\t\t\t\tuse( ctx ) {\n\n\t\t\t\t\treturn { USE: ( ctx.Identifier || ctx.NodeName )[ 0 ].image };\n\n\t\t\t\t}\n\n\t\t\t\tsingleFieldValue( ctx ) {\n\n\t\t\t\t\treturn processField( this, ctx );\n\n\t\t\t\t}\n\n\t\t\t\tmultiFieldValue( ctx ) {\n\n\t\t\t\t\treturn processField( this, ctx );\n\n\t\t\t\t}\n\n\t\t\t\troute( ctx ) {\n\n\t\t\t\t\tconst data = {\n\t\t\t\t\t\tFROM: ctx.RouteIdentifier[ 0 ].image,\n\t\t\t\t\t\tTO: ctx.RouteIdentifier[ 1 ].image\n\t\t\t\t\t};\n\n\t\t\t\t\treturn data;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction processField( scope, ctx ) {\n\n\t\t\t\tconst field = {\n\t\t\t\t\ttype: null,\n\t\t\t\t\tvalues: []\n\t\t\t\t};\n\n\t\t\t\tif ( ctx.node ) {\n\n\t\t\t\t\tfield.type = 'node';\n\n\t\t\t\t\tfor ( let i = 0, l = ctx.node.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst node = ctx.node[ i ];\n\n\t\t\t\t\t\tfield.values.push( scope.visit( node ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( ctx.use ) {\n\n\t\t\t\t\tfield.type = 'use';\n\n\t\t\t\t\tfor ( let i = 0, l = ctx.use.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst use = ctx.use[ i ];\n\n\t\t\t\t\t\tfield.values.push( scope.visit( use ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( ctx.StringLiteral ) {\n\n\t\t\t\t\tfield.type = 'string';\n\n\t\t\t\t\tfor ( let i = 0, l = ctx.StringLiteral.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst stringLiteral = ctx.StringLiteral[ i ];\n\n\t\t\t\t\t\tfield.values.push( stringLiteral.image.replace( /'|\"/g, '' ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( ctx.NumberLiteral ) {\n\n\t\t\t\t\tfield.type = 'number';\n\n\t\t\t\t\tfor ( let i = 0, l = ctx.NumberLiteral.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst numberLiteral = ctx.NumberLiteral[ i ];\n\n\t\t\t\t\t\tfield.values.push( parseFloat( numberLiteral.image ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( ctx.HexLiteral ) {\n\n\t\t\t\t\tfield.type = 'hex';\n\n\t\t\t\t\tfor ( let i = 0, l = ctx.HexLiteral.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst hexLiteral = ctx.HexLiteral[ i ];\n\n\t\t\t\t\t\tfield.values.push( hexLiteral.image );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( ctx.TrueLiteral ) {\n\n\t\t\t\t\tfield.type = 'boolean';\n\n\t\t\t\t\tfor ( let i = 0, l = ctx.TrueLiteral.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst trueLiteral = ctx.TrueLiteral[ i ];\n\n\t\t\t\t\t\tif ( trueLiteral.image === 'TRUE' ) field.values.push( true );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( ctx.FalseLiteral ) {\n\n\t\t\t\t\tfield.type = 'boolean';\n\n\t\t\t\t\tfor ( let i = 0, l = ctx.FalseLiteral.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst falseLiteral = ctx.FalseLiteral[ i ];\n\n\t\t\t\t\t\tif ( falseLiteral.image === 'FALSE' ) field.values.push( false );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( ctx.NullLiteral ) {\n\n\t\t\t\t\tfield.type = 'null';\n\n\t\t\t\t\tctx.NullLiteral.forEach( function () {\n\n\t\t\t\t\t\tfield.values.push( null );\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t\treturn field;\n\n\t\t\t}\n\n\t\t\treturn new VRMLToASTVisitor();\n\n\t\t}\n\n\t\tfunction parseTree( tree ) {\n\n\t\t\t// console.log( JSON.stringify( tree, null, 2 ) );\n\n\t\t\tconst nodes = tree.nodes;\n\t\t\tconst scene = new Scene();\n\n\t\t\t// first iteration: build nodemap based on DEF statements\n\n\t\t\tfor ( let i = 0, l = nodes.length; i < l; i ++ ) {\n\n\t\t\t\tconst node = nodes[ i ];\n\n\t\t\t\tbuildNodeMap( node );\n\n\t\t\t}\n\n\t\t\t// second iteration: build nodes\n\n\t\t\tfor ( let i = 0, l = nodes.length; i < l; i ++ ) {\n\n\t\t\t\tconst node = nodes[ i ];\n\t\t\t\tconst object = getNode( node );\n\n\t\t\t\tif ( object instanceof Object3D ) scene.add( object );\n\n\t\t\t\tif ( node.name === 'WorldInfo' ) scene.userData.worldInfo = object;\n\n\t\t\t}\n\n\t\t\treturn scene;\n\n\t\t}\n\n\t\tfunction buildNodeMap( node ) {\n\n\t\t\tif ( node.DEF ) {\n\n\t\t\t\tnodeMap[ node.DEF ] = node;\n\n\t\t\t}\n\n\t\t\tconst fields = node.fields;\n\n\t\t\tfor ( let i = 0, l = fields.length; i < l; i ++ ) {\n\n\t\t\t\tconst field = fields[ i ];\n\n\t\t\t\tif ( field.type === 'node' ) {\n\n\t\t\t\t\tconst fieldValues = field.values;\n\n\t\t\t\t\tfor ( let j = 0, jl = fieldValues.length; j < jl; j ++ ) {\n\n\t\t\t\t\t\tbuildNodeMap( fieldValues[ j ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tfunction getNode( node ) {\n\n\t\t\t// handle case where a node refers to a different one\n\n\t\t\tif ( node.USE ) {\n\n\t\t\t\treturn resolveUSE( node.USE );\n\n\t\t\t}\n\n\t\t\tif ( node.build !== undefined ) return node.build;\n\n\t\t\tnode.build = buildNode( node );\n\n\t\t\treturn node.build;\n\n\t\t}\n\n\t\t// node builder\n\n\t\tfunction buildNode( node ) {\n\n\t\t\tconst nodeName = node.name;\n\t\t\tlet build;\n\n\t\t\tswitch ( nodeName ) {\n\n\t\t\t\tcase 'Anchor':\n\t\t\t\tcase 'Group':\n\t\t\t\tcase 'Transform':\n\t\t\t\tcase 'Collision':\n\t\t\t\t\tbuild = buildGroupingNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Background':\n\t\t\t\t\tbuild = buildBackgroundNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Shape':\n\t\t\t\t\tbuild = buildShapeNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Appearance':\n\t\t\t\t\tbuild = buildAppearanceNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Material':\n\t\t\t\t\tbuild = buildMaterialNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ImageTexture':\n\t\t\t\t\tbuild = buildImageTextureNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PixelTexture':\n\t\t\t\t\tbuild = buildPixelTextureNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'TextureTransform':\n\t\t\t\t\tbuild = buildTextureTransformNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'IndexedFaceSet':\n\t\t\t\t\tbuild = buildIndexedFaceSetNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'IndexedLineSet':\n\t\t\t\t\tbuild = buildIndexedLineSetNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'PointSet':\n\t\t\t\t\tbuild = buildPointSetNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Box':\n\t\t\t\t\tbuild = buildBoxNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Cone':\n\t\t\t\t\tbuild = buildConeNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Cylinder':\n\t\t\t\t\tbuild = buildCylinderNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Sphere':\n\t\t\t\t\tbuild = buildSphereNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'ElevationGrid':\n\t\t\t\t\tbuild = buildElevationGridNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Extrusion':\n\t\t\t\t\tbuild = buildExtrusionNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Color':\n\t\t\t\tcase 'Coordinate':\n\t\t\t\tcase 'Normal':\n\t\t\t\tcase 'TextureCoordinate':\n\t\t\t\t\tbuild = buildGeometricNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'WorldInfo':\n\t\t\t\t\tbuild = buildWorldInfoNode( node );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'Billboard':\n\n\t\t\t\tcase 'Inline':\n\t\t\t\tcase 'LOD':\n\t\t\t\tcase 'Switch':\n\n\t\t\t\tcase 'AudioClip':\n\t\t\t\tcase 'DirectionalLight':\n\t\t\t\tcase 'PointLight':\n\t\t\t\tcase 'Script':\n\t\t\t\tcase 'Sound':\n\t\t\t\tcase 'SpotLight':\n\n\t\t\t\tcase 'CylinderSensor':\n\t\t\t\tcase 'PlaneSensor':\n\t\t\t\tcase 'ProximitySensor':\n\t\t\t\tcase 'SphereSensor':\n\t\t\t\tcase 'TimeSensor':\n\t\t\t\tcase 'TouchSensor':\n\t\t\t\tcase 'VisibilitySensor':\n\n\t\t\t\tcase 'Text':\n\n\t\t\t\tcase 'FontStyle':\n\t\t\t\tcase 'MovieTexture':\n\n\t\t\t\tcase 'ColorInterpolator':\n\t\t\t\tcase 'CoordinateInterpolator':\n\t\t\t\tcase 'NormalInterpolator':\n\t\t\t\tcase 'OrientationInterpolator':\n\t\t\t\tcase 'PositionInterpolator':\n\t\t\t\tcase 'ScalarInterpolator':\n\n\t\t\t\tcase 'Fog':\n\t\t\t\tcase 'NavigationInfo':\n\t\t\t\tcase 'Viewpoint':\n\t\t\t\t\t// node not supported yet\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tconsole.warn( 'THREE.VRMLLoader: Unknown node:', nodeName );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( build !== undefined && node.DEF !== undefined && build.hasOwnProperty( 'name' ) === true ) {\n\n\t\t\t\tbuild.name = node.DEF;\n\n\t\t\t}\n\n\t\t\treturn build;\n\n\t\t}\n\n\t\tfunction buildGroupingNode( node ) {\n\n\t\t\tconst object = new Group();\n\n\t\t\t//\n\n\t\t\tconst fields = node.fields;\n\n\t\t\tfor ( let i = 0, l = fields.length; i < l; i ++ ) {\n\n\t\t\t\tconst field = fields[ i ];\n\t\t\t\tconst fieldName = field.name;\n\t\t\t\tconst fieldValues = field.values;\n\n\t\t\t\tswitch ( fieldName ) {\n\n\t\t\t\t\tcase 'bboxCenter':\n\t\t\t\t\t\t// field not supported\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'bboxSize':\n\t\t\t\t\t\t// field not supported\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'center':\n\t\t\t\t\t\t// field not supported\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'children':\n\t\t\t\t\t\tparseFieldChildren( fieldValues, object );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'description':\n\t\t\t\t\t\t// field not supported\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'collide':\n\t\t\t\t\t\t// field not supported\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'parameter':\n\t\t\t\t\t\t// field not supported\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'rotation':\n\t\t\t\t\t\tconst axis = new Vector3( fieldValues[ 0 ], fieldValues[ 1 ], fieldValues[ 2 ] ).normalize();\n\t\t\t\t\t\tconst angle = fieldValues[ 3 ];\n\t\t\t\t\t\tobject.quaternion.setFromAxisAngle( axis, angle );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'scale':\n\t\t\t\t\t\tobject.scale.set( fieldValues[ 0 ], fieldValues[ 1 ], fieldValues[ 2 ] );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'scaleOrientation':\n\t\t\t\t\t\t// field not supported\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'translation':\n\t\t\t\t\t\tobject.position.set( fieldValues[ 0 ], fieldValues[ 1 ], fieldValues[ 2 ] );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'proxy':\n\t\t\t\t\t\t// field not supported\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'url':\n\t\t\t\t\t\t// field not supported\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn( 'THREE.VRMLLoader: Unknown field:', fieldName );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn object;\n\n\t\t}\n\n\t\tfunction buildBackgroundNode( node ) {\n\n\t\t\tconst group = new Group();\n\n\t\t\tlet groundAngle, groundColor;\n\t\t\tlet skyAngle, skyColor;\n\n\t\t\tconst fields = node.fields;\n\n\t\t\tfor ( let i = 0, l = fields.length; i < l; i ++ ) {\n\n\t\t\t\tconst field = fields[ i ];\n\t\t\t\tconst fieldName = field.name;\n\t\t\t\tconst fieldValues = field.values;\n\n\t\t\t\tswitch ( fieldName ) {\n\n\t\t\t\t\tcase 'groundAngle':\n\t\t\t\t\t\tgroundAngle = fieldValues;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'groundColor':\n\t\t\t\t\t\tgroundColor = fieldValues;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'backUrl':\n\t\t\t\t\t\t// field not supported\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'bottomUrl':\n\t\t\t\t\t\t// field not supported\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'frontUrl':\n\t\t\t\t\t\t// field not supported\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'leftUrl':\n\t\t\t\t\t\t// field not supported\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'rightUrl':\n\t\t\t\t\t\t// field not supported\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'topUrl':\n\t\t\t\t\t\t// field not supported\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'skyAngle':\n\t\t\t\t\t\tskyAngle = fieldValues;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'skyColor':\n\t\t\t\t\t\tskyColor = fieldValues;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn( 'THREE.VRMLLoader: Unknown field:', fieldName );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst radius = 10000;\n\n\t\t\t// sky\n\n\t\t\tif ( skyColor ) {\n\n\t\t\t\tconst skyGeometry = new SphereGeometry( radius, 32, 16 );\n\t\t\t\tconst skyMaterial = new MeshBasicMaterial( { fog: false, side: BackSide, depthWrite: false, depthTest: false } );\n\n\t\t\t\tif ( skyColor.length > 3 ) {\n\n\t\t\t\t\tpaintFaces( skyGeometry, radius, skyAngle, toColorArray( skyColor ), true );\n\t\t\t\t\tskyMaterial.vertexColors = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tskyMaterial.color.setRGB( skyColor[ 0 ], skyColor[ 1 ], skyColor[ 2 ], SRGBColorSpace );\n\n\t\t\t\t}\n\n\t\t\t\tconst sky = new Mesh( skyGeometry, skyMaterial );\n\t\t\t\tgroup.add( sky );\n\n\t\t\t}\n\n\t\t\t// ground\n\n\t\t\tif ( groundColor ) {\n\n\t\t\t\tif ( groundColor.length > 0 ) {\n\n\t\t\t\t\tconst groundGeometry = new SphereGeometry( radius, 32, 16, 0, 2 * Math.PI, 0.5 * Math.PI, 1.5 * Math.PI );\n\t\t\t\t\tconst groundMaterial = new MeshBasicMaterial( { fog: false, side: BackSide, vertexColors: true, depthWrite: false, depthTest: false } );\n\n\t\t\t\t\tpaintFaces( groundGeometry, radius, groundAngle, toColorArray( groundColor ), false );\n\n\t\t\t\t\tconst ground = new Mesh( groundGeometry, groundMaterial );\n\t\t\t\t\tgroup.add( ground );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// render background group first\n\n\t\t\tgroup.renderOrder = - Infinity;\n\n\t\t\treturn group;\n\n\t\t}\n\n\t\tfunction buildShapeNode( node ) {\n\n\t\t\tconst fields = node.fields;\n\n\t\t\t// if the appearance field is NULL or unspecified, lighting is off and the unlit object color is (0, 0, 0)\n\n\t\t\tlet material = new MeshBasicMaterial( {\n\t\t\t\tname: Loader.DEFAULT_MATERIAL_NAME,\n\t\t\t\tcolor: 0x000000\n\t\t\t} );\n\t\t\tlet geometry;\n\n\t\t\tfor ( let i = 0, l = fields.length; i < l; i ++ ) {\n\n\t\t\t\tconst field = fields[ i ];\n\t\t\t\tconst fieldName = field.name;\n\t\t\t\tconst fieldValues = field.values;\n\n\t\t\t\tswitch ( fieldName ) {\n\n\t\t\t\t\tcase 'appearance':\n\t\t\t\t\t\tif ( fieldValues[ 0 ] !== null ) {\n\n\t\t\t\t\t\t\tmaterial = getNode( fieldValues[ 0 ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'geometry':\n\t\t\t\t\t\tif ( fieldValues[ 0 ] !== null ) {\n\n\t\t\t\t\t\t\tgeometry = getNode( fieldValues[ 0 ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn( 'THREE.VRMLLoader: Unknown field:', fieldName );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// build 3D object\n\n\t\t\tlet object;\n\n\t\t\tif ( geometry && geometry.attributes.position ) {\n\n\t\t\t\tconst type = geometry._type;\n\n\t\t\t\tif ( type === 'points' ) { // points\n\n\t\t\t\t\tconst pointsMaterial = new PointsMaterial( {\n\t\t\t\t\t\tname: Loader.DEFAULT_MATERIAL_NAME,\n\t\t\t\t\t\tcolor: 0xffffff,\n\t\t\t\t\t\topacity: material.opacity,\n\t\t\t\t\t\ttransparent: material.transparent\n\t\t\t\t\t} );\n\n\t\t\t\t\tif ( geometry.attributes.color !== undefined ) {\n\n\t\t\t\t\t\tpointsMaterial.vertexColors = true;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// if the color field is NULL and there is a material defined for the appearance affecting this PointSet, then use the emissiveColor of the material to draw the points\n\n\t\t\t\t\t\tif ( material.isMeshPhongMaterial ) {\n\n\t\t\t\t\t\t\tpointsMaterial.color.copy( material.emissive );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobject = new Points( geometry, pointsMaterial );\n\n\t\t\t\t} else if ( type === 'line' ) { // lines\n\n\t\t\t\t\tconst lineMaterial = new LineBasicMaterial( {\n\t\t\t\t\t\tname: Loader.DEFAULT_MATERIAL_NAME,\n\t\t\t\t\t\tcolor: 0xffffff,\n\t\t\t\t\t\topacity: material.opacity,\n\t\t\t\t\t\ttransparent: material.transparent\n\t\t\t\t\t} );\n\n\t\t\t\t\tif ( geometry.attributes.color !== undefined ) {\n\n\t\t\t\t\t\tlineMaterial.vertexColors = true;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// if the color field is NULL and there is a material defined for the appearance affecting this IndexedLineSet, then use the emissiveColor of the material to draw the lines\n\n\t\t\t\t\t\tif ( material.isMeshPhongMaterial ) {\n\n\t\t\t\t\t\t\tlineMaterial.color.copy( material.emissive );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobject = new LineSegments( geometry, lineMaterial );\n\n\t\t\t\t} else { // consider meshes\n\n\t\t\t\t\t// check \"solid\" hint (it's placed in the geometry but affects the material)\n\n\t\t\t\t\tif ( geometry._solid !== undefined ) {\n\n\t\t\t\t\t\tmaterial.side = ( geometry._solid ) ? FrontSide : DoubleSide;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// check for vertex colors\n\n\t\t\t\t\tif ( geometry.attributes.color !== undefined ) {\n\n\t\t\t\t\t\tmaterial.vertexColors = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobject = new Mesh( geometry, material );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tobject = new Object3D();\n\n\t\t\t\t// if the geometry field is NULL or no vertices are defined the object is not drawn\n\n\t\t\t\tobject.visible = false;\n\n\t\t\t}\n\n\t\t\treturn object;\n\n\t\t}\n\n\t\tfunction buildAppearanceNode( node ) {\n\n\t\t\tlet material = new MeshPhongMaterial();\n\t\t\tlet transformData;\n\n\t\t\tconst fields = node.fields;\n\n\t\t\tfor ( let i = 0, l = fields.length; i < l; i ++ ) {\n\n\t\t\t\tconst field = fields[ i ];\n\t\t\t\tconst fieldName = field.name;\n\t\t\t\tconst fieldValues = field.values;\n\n\t\t\t\tswitch ( fieldName ) {\n\n\t\t\t\t\tcase 'material':\n\t\t\t\t\t\tif ( fieldValues[ 0 ] !== null ) {\n\n\t\t\t\t\t\t\tconst materialData = getNode( fieldValues[ 0 ] );\n\n\t\t\t\t\t\t\tif ( materialData.diffuseColor ) material.color.copy( materialData.diffuseColor );\n\t\t\t\t\t\t\tif ( materialData.emissiveColor ) material.emissive.copy( materialData.emissiveColor );\n\t\t\t\t\t\t\tif ( materialData.shininess ) material.shininess = materialData.shininess;\n\t\t\t\t\t\t\tif ( materialData.specularColor ) material.specular.copy( materialData.specularColor );\n\t\t\t\t\t\t\tif ( materialData.transparency ) material.opacity = 1 - materialData.transparency;\n\t\t\t\t\t\t\tif ( materialData.transparency > 0 ) material.transparent = true;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// if the material field is NULL or unspecified, lighting is off and the unlit object color is (0, 0, 0)\n\n\t\t\t\t\t\t\tmaterial = new MeshBasicMaterial( {\n\t\t\t\t\t\t\t\tname: Loader.DEFAULT_MATERIAL_NAME,\n\t\t\t\t\t\t\t\tcolor: 0x000000\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'texture':\n\t\t\t\t\t\tconst textureNode = fieldValues[ 0 ];\n\t\t\t\t\t\tif ( textureNode !== null ) {\n\n\t\t\t\t\t\t\tif ( textureNode.name === 'ImageTexture' || textureNode.name === 'PixelTexture' ) {\n\n\t\t\t\t\t\t\t\tmaterial.map = getNode( textureNode );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// MovieTexture not supported yet\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'textureTransform':\n\t\t\t\t\t\tif ( fieldValues[ 0 ] !== null ) {\n\n\t\t\t\t\t\t\ttransformData = getNode( fieldValues[ 0 ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn( 'THREE.VRMLLoader: Unknown field:', fieldName );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// only apply texture transform data if a texture was defined\n\n\t\t\tif ( material.map ) {\n\n\t\t\t\t// respect VRML lighting model\n\n\t\t\t\tif ( material.map.__type ) {\n\n\t\t\t\t\tswitch ( material.map.__type ) {\n\n\t\t\t\t\t\tcase TEXTURE_TYPE.INTENSITY_ALPHA:\n\t\t\t\t\t\t\tmaterial.opacity = 1; // ignore transparency\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TEXTURE_TYPE.RGB:\n\t\t\t\t\t\t\tmaterial.color.set( 0xffffff ); // ignore material color\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase TEXTURE_TYPE.RGBA:\n\t\t\t\t\t\t\tmaterial.color.set( 0xffffff ); // ignore material color\n\t\t\t\t\t\t\tmaterial.opacity = 1; // ignore transparency\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t}\n\n\t\t\t\t\tdelete material.map.__type;\n\n\t\t\t\t}\n\n\t\t\t\t// apply texture transform\n\n\t\t\t\tif ( transformData ) {\n\n\t\t\t\t\tmaterial.map.center.copy( transformData.center );\n\t\t\t\t\tmaterial.map.rotation = transformData.rotation;\n\t\t\t\t\tmaterial.map.repeat.copy( transformData.scale );\n\t\t\t\t\tmaterial.map.offset.copy( transformData.translation );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn material;\n\n\t\t}\n\n\t\tfunction buildMaterialNode( node ) {\n\n\t\t\tconst materialData = {};\n\n\t\t\tconst fields = node.fields;\n\n\t\t\tfor ( let i = 0, l = fields.length; i < l; i ++ ) {\n\n\t\t\t\tconst field = fields[ i ];\n\t\t\t\tconst fieldName = field.name;\n\t\t\t\tconst fieldValues = field.values;\n\n\t\t\t\tswitch ( fieldName ) {\n\n\t\t\t\t\tcase 'ambientIntensity':\n\t\t\t\t\t\t// field not supported\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'diffuseColor':\n\t\t\t\t\t\tmaterialData.diffuseColor = new Color().setRGB( fieldValues[ 0 ], fieldValues[ 1 ], fieldValues[ 2 ], SRGBColorSpace );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'emissiveColor':\n\t\t\t\t\t\tmaterialData.emissiveColor = new Color().setRGB( fieldValues[ 0 ], fieldValues[ 1 ], fieldValues[ 2 ], SRGBColorSpace );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'shininess':\n\t\t\t\t\t\tmaterialData.shininess = fieldValues[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'specularColor':\n\t\t\t\t\t\tmaterialData.specularColor = new Color().setRGB( fieldValues[ 0 ], fieldValues[ 1 ], fieldValues[ 2 ], SRGBColorSpace );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'transparency':\n\t\t\t\t\t\tmaterialData.transparency = fieldValues[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn( 'THREE.VRMLLoader: Unknown field:', fieldName );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn materialData;\n\n\t\t}\n\n\t\tfunction parseHexColor( hex, textureType, color ) {\n\n\t\t\tlet value;\n\n\t\t\tswitch ( textureType ) {\n\n\t\t\t\tcase TEXTURE_TYPE.INTENSITY:\n\t\t\t\t\t// Intensity texture: A one-component image specifies one-byte hexadecimal or integer values representing the intensity of the image\n\t\t\t\t\tvalue = parseInt( hex );\n\t\t\t\t\tcolor.r = value;\n\t\t\t\t\tcolor.g = value;\n\t\t\t\t\tcolor.b = value;\n\t\t\t\t\tcolor.a = 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase TEXTURE_TYPE.INTENSITY_ALPHA:\n\t\t\t\t\t// Intensity+Alpha texture: A two-component image specifies the intensity in the first (high) byte and the alpha opacity in the second (low) byte.\n\t\t\t\t\tvalue = parseInt( '0x' + hex.substring( 2, 4 ) );\n\t\t\t\t\tcolor.r = value;\n\t\t\t\t\tcolor.g = value;\n\t\t\t\t\tcolor.b = value;\n\t\t\t\t\tcolor.a = parseInt( '0x' + hex.substring( 4, 6 ) );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase TEXTURE_TYPE.RGB:\n\t\t\t\t\t// RGB texture: Pixels in a three-component image specify the red component in the first (high) byte, followed by the green and blue components\n\t\t\t\t\tcolor.r = parseInt( '0x' + hex.substring( 2, 4 ) );\n\t\t\t\t\tcolor.g = parseInt( '0x' + hex.substring( 4, 6 ) );\n\t\t\t\t\tcolor.b = parseInt( '0x' + hex.substring( 6, 8 ) );\n\t\t\t\t\tcolor.a = 1;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase TEXTURE_TYPE.RGBA:\n\t\t\t\t\t// RGBA texture: Four-component images specify the alpha opacity byte after red/green/blue\n\t\t\t\t\tcolor.r = parseInt( '0x' + hex.substring( 2, 4 ) );\n\t\t\t\t\tcolor.g = parseInt( '0x' + hex.substring( 4, 6 ) );\n\t\t\t\t\tcolor.b = parseInt( '0x' + hex.substring( 6, 8 ) );\n\t\t\t\t\tcolor.a = parseInt( '0x' + hex.substring( 8, 10 ) );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getTextureType( num_components ) {\n\n\t\t\tlet type;\n\n\t\t\tswitch ( num_components ) {\n\n\t\t\t\tcase 1:\n\t\t\t\t\ttype = TEXTURE_TYPE.INTENSITY;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 2:\n\t\t\t\t\ttype = TEXTURE_TYPE.INTENSITY_ALPHA;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 3:\n\t\t\t\t\ttype = TEXTURE_TYPE.RGB;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 4:\n\t\t\t\t\ttype = TEXTURE_TYPE.RGBA;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t}\n\n\t\t\treturn type;\n\n\t\t}\n\n\t\tfunction buildPixelTextureNode( node ) {\n\n\t\t\tlet texture;\n\t\t\tlet wrapS = RepeatWrapping;\n\t\t\tlet wrapT = RepeatWrapping;\n\n\t\t\tconst fields = node.fields;\n\n\t\t\tfor ( let i = 0, l = fields.length; i < l; i ++ ) {\n\n\t\t\t\tconst field = fields[ i ];\n\t\t\t\tconst fieldName = field.name;\n\t\t\t\tconst fieldValues = field.values;\n\n\t\t\t\tswitch ( fieldName ) {\n\n\t\t\t\t\tcase 'image':\n\t\t\t\t\t\tconst width = fieldValues[ 0 ];\n\t\t\t\t\t\tconst height = fieldValues[ 1 ];\n\t\t\t\t\t\tconst num_components = fieldValues[ 2 ];\n\n\t\t\t\t\t\tconst textureType = getTextureType( num_components );\n\n\t\t\t\t\t\tconst data = new Uint8Array( 4 * width * height );\n\n\t\t\t\t\t\tconst color = { r: 0, g: 0, b: 0, a: 0 };\n\n\t\t\t\t\t\tfor ( let j = 3, k = 0, jl = fieldValues.length; j < jl; j ++, k ++ ) {\n\n\t\t\t\t\t\t\tparseHexColor( fieldValues[ j ], textureType, color );\n\n\t\t\t\t\t\t\tconst stride = k * 4;\n\n\t\t\t\t\t\t\tdata[ stride + 0 ] = color.r;\n\t\t\t\t\t\t\tdata[ stride + 1 ] = color.g;\n\t\t\t\t\t\t\tdata[ stride + 2 ] = color.b;\n\t\t\t\t\t\t\tdata[ stride + 3 ] = color.a;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttexture = new DataTexture( data, width, height );\n\t\t\t\t\t\ttexture.colorSpace = SRGBColorSpace;\n\t\t\t\t\t\ttexture.needsUpdate = true;\n\t\t\t\t\t\ttexture.__type = textureType; // needed for material modifications\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'repeatS':\n\t\t\t\t\t\tif ( fieldValues[ 0 ] === false ) wrapS = ClampToEdgeWrapping;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'repeatT':\n\t\t\t\t\t\tif ( fieldValues[ 0 ] === false ) wrapT = ClampToEdgeWrapping;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn( 'THREE.VRMLLoader: Unknown field:', fieldName );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texture ) {\n\n\t\t\t\ttexture.wrapS = wrapS;\n\t\t\t\ttexture.wrapT = wrapT;\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t}\n\n\t\tfunction buildImageTextureNode( node ) {\n\n\t\t\tlet texture;\n\t\t\tlet wrapS = RepeatWrapping;\n\t\t\tlet wrapT = RepeatWrapping;\n\n\t\t\tconst fields = node.fields;\n\n\t\t\tfor ( let i = 0, l = fields.length; i < l; i ++ ) {\n\n\t\t\t\tconst field = fields[ i ];\n\t\t\t\tconst fieldName = field.name;\n\t\t\t\tconst fieldValues = field.values;\n\n\t\t\t\tswitch ( fieldName ) {\n\n\t\t\t\t\tcase 'url':\n\t\t\t\t\t\tconst url = fieldValues[ 0 ];\n\t\t\t\t\t\tif ( url ) texture = textureLoader.load( url );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'repeatS':\n\t\t\t\t\t\tif ( fieldValues[ 0 ] === false ) wrapS = ClampToEdgeWrapping;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'repeatT':\n\t\t\t\t\t\tif ( fieldValues[ 0 ] === false ) wrapT = ClampToEdgeWrapping;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn( 'THREE.VRMLLoader: Unknown field:', fieldName );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( texture ) {\n\n\t\t\t\ttexture.wrapS = wrapS;\n\t\t\t\ttexture.wrapT = wrapT;\n\t\t\t\ttexture.colorSpace = SRGBColorSpace;\n\n\t\t\t}\n\n\t\t\treturn texture;\n\n\t\t}\n\n\t\tfunction buildTextureTransformNode( node ) {\n\n\t\t\tconst transformData = {\n\t\t\t\tcenter: new Vector2(),\n\t\t\t\trotation: new Vector2(),\n\t\t\t\tscale: new Vector2(),\n\t\t\t\ttranslation: new Vector2()\n\t\t\t};\n\n\t\t\tconst fields = node.fields;\n\n\t\t\tfor ( let i = 0, l = fields.length; i < l; i ++ ) {\n\n\t\t\t\tconst field = fields[ i ];\n\t\t\t\tconst fieldName = field.name;\n\t\t\t\tconst fieldValues = field.values;\n\n\t\t\t\tswitch ( fieldName ) {\n\n\t\t\t\t\tcase 'center':\n\t\t\t\t\t\ttransformData.center.set( fieldValues[ 0 ], fieldValues[ 1 ] );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'rotation':\n\t\t\t\t\t\ttransformData.rotation = fieldValues[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'scale':\n\t\t\t\t\t\ttransformData.scale.set( fieldValues[ 0 ], fieldValues[ 1 ] );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'translation':\n\t\t\t\t\t\ttransformData.translation.set( fieldValues[ 0 ], fieldValues[ 1 ] );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn( 'THREE.VRMLLoader: Unknown field:', fieldName );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn transformData;\n\n\t\t}\n\n\t\tfunction buildGeometricNode( node ) {\n\n\t\t\treturn node.fields[ 0 ].values;\n\n\t\t}\n\n\t\tfunction buildWorldInfoNode( node ) {\n\n\t\t\tconst worldInfo = {};\n\n\t\t\tconst fields = node.fields;\n\n\t\t\tfor ( let i = 0, l = fields.length; i < l; i ++ ) {\n\n\t\t\t\tconst field = fields[ i ];\n\t\t\t\tconst fieldName = field.name;\n\t\t\t\tconst fieldValues = field.values;\n\n\t\t\t\tswitch ( fieldName ) {\n\n\t\t\t\t\tcase 'title':\n\t\t\t\t\t\tworldInfo.title = fieldValues[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'info':\n\t\t\t\t\t\tworldInfo.info = fieldValues;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn( 'THREE.VRMLLoader: Unknown field:', fieldName );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn worldInfo;\n\n\t\t}\n\n\t\tfunction buildIndexedFaceSetNode( node ) {\n\n\t\t\tlet color, coord, normal, texCoord;\n\t\t\tlet ccw = true, solid = true, creaseAngle = 0;\n\t\t\tlet colorIndex, coordIndex, normalIndex, texCoordIndex;\n\t\t\tlet colorPerVertex = true, normalPerVertex = true;\n\n\t\t\tconst fields = node.fields;\n\n\t\t\tfor ( let i = 0, l = fields.length; i < l; i ++ ) {\n\n\t\t\t\tconst field = fields[ i ];\n\t\t\t\tconst fieldName = field.name;\n\t\t\t\tconst fieldValues = field.values;\n\n\t\t\t\tswitch ( fieldName ) {\n\n\t\t\t\t\tcase 'color':\n\t\t\t\t\t\tconst colorNode = fieldValues[ 0 ];\n\n\t\t\t\t\t\tif ( colorNode !== null ) {\n\n\t\t\t\t\t\t\tcolor = getNode( colorNode );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'coord':\n\t\t\t\t\t\tconst coordNode = fieldValues[ 0 ];\n\n\t\t\t\t\t\tif ( coordNode !== null ) {\n\n\t\t\t\t\t\t\tcoord = getNode( coordNode );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'normal':\n\t\t\t\t\t\tconst normalNode = fieldValues[ 0 ];\n\n\t\t\t\t\t\tif ( normalNode !== null ) {\n\n\t\t\t\t\t\t\tnormal = getNode( normalNode );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'texCoord':\n\t\t\t\t\t\tconst texCoordNode = fieldValues[ 0 ];\n\n\t\t\t\t\t\tif ( texCoordNode !== null ) {\n\n\t\t\t\t\t\t\ttexCoord = getNode( texCoordNode );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'ccw':\n\t\t\t\t\t\tccw = fieldValues[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'colorIndex':\n\t\t\t\t\t\tcolorIndex = fieldValues;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'colorPerVertex':\n\t\t\t\t\t\tcolorPerVertex = fieldValues[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'convex':\n\t\t\t\t\t\t// field not supported\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'coordIndex':\n\t\t\t\t\t\tcoordIndex = fieldValues;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'creaseAngle':\n\t\t\t\t\t\tcreaseAngle = fieldValues[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'normalIndex':\n\t\t\t\t\t\tnormalIndex = fieldValues;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'normalPerVertex':\n\t\t\t\t\t\tnormalPerVertex = fieldValues[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'solid':\n\t\t\t\t\t\tsolid = fieldValues[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'texCoordIndex':\n\t\t\t\t\t\ttexCoordIndex = fieldValues;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn( 'THREE.VRMLLoader: Unknown field:', fieldName );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( coordIndex === undefined ) {\n\n\t\t\t\tconsole.warn( 'THREE.VRMLLoader: Missing coordIndex.' );\n\n\t\t\t\treturn new BufferGeometry(); // handle VRML files with incomplete geometry definition\n\n\t\t\t}\n\n\t\t\tconst triangulatedCoordIndex = triangulateFaceIndex( coordIndex, ccw );\n\n\t\t\tlet colorAttribute;\n\t\t\tlet normalAttribute;\n\t\t\tlet uvAttribute;\n\n\t\t\tif ( color ) {\n\n\t\t\t\tif ( colorPerVertex === true ) {\n\n\t\t\t\t\tif ( colorIndex && colorIndex.length > 0 ) {\n\n\t\t\t\t\t\t// if the colorIndex field is not empty, then it is used to choose colors for each vertex of the IndexedFaceSet.\n\n\t\t\t\t\t\tconst triangulatedColorIndex = triangulateFaceIndex( colorIndex, ccw );\n\t\t\t\t\t\tcolorAttribute = computeAttributeFromIndexedData( triangulatedCoordIndex, triangulatedColorIndex, color, 3 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// if the colorIndex field is empty, then the coordIndex field is used to choose colors from the Color node\n\n\t\t\t\t\t\tcolorAttribute = toNonIndexedAttribute( triangulatedCoordIndex, new Float32BufferAttribute( color, 3 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( colorIndex && colorIndex.length > 0 ) {\n\n\t\t\t\t\t\t// if the colorIndex field is not empty, then they are used to choose one color for each face of the IndexedFaceSet\n\n\t\t\t\t\t\tconst flattenFaceColors = flattenData( color, colorIndex );\n\t\t\t\t\t\tconst triangulatedFaceColors = triangulateFaceData( flattenFaceColors, coordIndex );\n\t\t\t\t\t\tcolorAttribute = computeAttributeFromFaceData( triangulatedCoordIndex, triangulatedFaceColors );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// if the colorIndex field is empty, then the color are applied to each face of the IndexedFaceSet in order\n\n\t\t\t\t\t\tconst triangulatedFaceColors = triangulateFaceData( color, coordIndex );\n\t\t\t\t\t\tcolorAttribute = computeAttributeFromFaceData( triangulatedCoordIndex, triangulatedFaceColors );\n\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconvertColorsToLinearSRGB( colorAttribute );\n\n\t\t\t}\n\n\t\t\tif ( normal ) {\n\n\t\t\t\tif ( normalPerVertex === true ) {\n\n\t\t\t\t\t// consider vertex normals\n\n\t\t\t\t\tif ( normalIndex && normalIndex.length > 0 ) {\n\n\t\t\t\t\t\t// if the normalIndex field is not empty, then it is used to choose normals for each vertex of the IndexedFaceSet.\n\n\t\t\t\t\t\tconst triangulatedNormalIndex = triangulateFaceIndex( normalIndex, ccw );\n\t\t\t\t\t\tnormalAttribute = computeAttributeFromIndexedData( triangulatedCoordIndex, triangulatedNormalIndex, normal, 3 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// if the normalIndex field is empty, then the coordIndex field is used to choose normals from the Normal node\n\n\t\t\t\t\t\tnormalAttribute = toNonIndexedAttribute( triangulatedCoordIndex, new Float32BufferAttribute( normal, 3 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// consider face normals\n\n\t\t\t\t\tif ( normalIndex && normalIndex.length > 0 ) {\n\n\t\t\t\t\t\t// if the normalIndex field is not empty, then they are used to choose one normal for each face of the IndexedFaceSet\n\n\t\t\t\t\t\tconst flattenFaceNormals = flattenData( normal, normalIndex );\n\t\t\t\t\t\tconst triangulatedFaceNormals = triangulateFaceData( flattenFaceNormals, coordIndex );\n\t\t\t\t\t\tnormalAttribute = computeAttributeFromFaceData( triangulatedCoordIndex, triangulatedFaceNormals );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// if the normalIndex field is empty, then the normals are applied to each face of the IndexedFaceSet in order\n\n\t\t\t\t\t\tconst triangulatedFaceNormals = triangulateFaceData( normal, coordIndex );\n\t\t\t\t\t\tnormalAttribute = computeAttributeFromFaceData( triangulatedCoordIndex, triangulatedFaceNormals );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// if the normal field is NULL, then the loader should automatically generate normals, using creaseAngle to determine if and how normals are smoothed across shared vertices\n\n\t\t\t\tnormalAttribute = computeNormalAttribute( triangulatedCoordIndex, coord, creaseAngle );\n\n\t\t\t}\n\n\t\t\tif ( texCoord ) {\n\n\t\t\t\t// texture coordinates are always defined on vertex level\n\n\t\t\t\tif ( texCoordIndex && texCoordIndex.length > 0 ) {\n\n\t\t\t\t\t// if the texCoordIndex field is not empty, then it is used to choose texture coordinates for each vertex of the IndexedFaceSet.\n\n\t\t\t\t\tconst triangulatedTexCoordIndex = triangulateFaceIndex( texCoordIndex, ccw );\n\t\t\t\t\tuvAttribute = computeAttributeFromIndexedData( triangulatedCoordIndex, triangulatedTexCoordIndex, texCoord, 2 );\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// if the texCoordIndex field is empty, then the coordIndex array is used to choose texture coordinates from the TextureCoordinate node\n\n\t\t\t\t\tuvAttribute = toNonIndexedAttribute( triangulatedCoordIndex, new Float32BufferAttribute( texCoord, 2 ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst geometry = new BufferGeometry();\n\t\t\tconst positionAttribute = toNonIndexedAttribute( triangulatedCoordIndex, new Float32BufferAttribute( coord, 3 ) );\n\n\t\t\tgeometry.setAttribute( 'position', positionAttribute );\n\t\t\tgeometry.setAttribute( 'normal', normalAttribute );\n\n\t\t\t// optional attributes\n\n\t\t\tif ( colorAttribute ) geometry.setAttribute( 'color', colorAttribute );\n\t\t\tif ( uvAttribute ) geometry.setAttribute( 'uv', uvAttribute );\n\n\t\t\t// \"solid\" influences the material so let's store it for later use\n\n\t\t\tgeometry._solid = solid;\n\t\t\tgeometry._type = 'mesh';\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction buildIndexedLineSetNode( node ) {\n\n\t\t\tlet color, coord;\n\t\t\tlet colorIndex, coordIndex;\n\t\t\tlet colorPerVertex = true;\n\n\t\t\tconst fields = node.fields;\n\n\t\t\tfor ( let i = 0, l = fields.length; i < l; i ++ ) {\n\n\t\t\t\tconst field = fields[ i ];\n\t\t\t\tconst fieldName = field.name;\n\t\t\t\tconst fieldValues = field.values;\n\n\t\t\t\tswitch ( fieldName ) {\n\n\t\t\t\t\tcase 'color':\n\t\t\t\t\t\tconst colorNode = fieldValues[ 0 ];\n\n\t\t\t\t\t\tif ( colorNode !== null ) {\n\n\t\t\t\t\t\t\tcolor = getNode( colorNode );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'coord':\n\t\t\t\t\t\tconst coordNode = fieldValues[ 0 ];\n\n\t\t\t\t\t\tif ( coordNode !== null ) {\n\n\t\t\t\t\t\t\tcoord = getNode( coordNode );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'colorIndex':\n\t\t\t\t\t\tcolorIndex = fieldValues;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'colorPerVertex':\n\t\t\t\t\t\tcolorPerVertex = fieldValues[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'coordIndex':\n\t\t\t\t\t\tcoordIndex = fieldValues;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn( 'THREE.VRMLLoader: Unknown field:', fieldName );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// build lines\n\n\t\t\tlet colorAttribute;\n\n\t\t\tconst expandedLineIndex = expandLineIndex( coordIndex ); // create an index for three.js's linesegment primitive\n\n\t\t\tif ( color ) {\n\n\t\t\t\tif ( colorPerVertex === true ) {\n\n\t\t\t\t\tif ( colorIndex.length > 0 ) {\n\n\t\t\t\t\t\t// if the colorIndex field is not empty, then one color is used for each polyline of the IndexedLineSet.\n\n\t\t\t\t\t\tconst expandedColorIndex = expandLineIndex( colorIndex ); // compute colors for each line segment (rendering primitive)\n\t\t\t\t\t\tcolorAttribute = computeAttributeFromIndexedData( expandedLineIndex, expandedColorIndex, color, 3 ); // compute data on vertex level\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// if the colorIndex field is empty, then the colors are applied to each polyline of the IndexedLineSet in order.\n\n\t\t\t\t\t\tcolorAttribute = toNonIndexedAttribute( expandedLineIndex, new Float32BufferAttribute( color, 3 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( colorIndex.length > 0 ) {\n\n\t\t\t\t\t\t// if the colorIndex field is not empty, then colors are applied to each vertex of the IndexedLineSet\n\n\t\t\t\t\t\tconst flattenLineColors = flattenData( color, colorIndex ); // compute colors for each VRML primitive\n\t\t\t\t\t\tconst expandedLineColors = expandLineData( flattenLineColors, coordIndex ); // compute colors for each line segment (rendering primitive)\n\t\t\t\t\t\tcolorAttribute = computeAttributeFromLineData( expandedLineIndex, expandedLineColors ); // compute data on vertex level\n\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// if the colorIndex field is empty, then the coordIndex field is used to choose colors from the Color node\n\n\t\t\t\t\t\tconst expandedLineColors = expandLineData( color, coordIndex ); // compute colors for each line segment (rendering primitive)\n\t\t\t\t\t\tcolorAttribute = computeAttributeFromLineData( expandedLineIndex, expandedLineColors ); // compute data on vertex level\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconvertColorsToLinearSRGB( colorAttribute );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tconst geometry = new BufferGeometry();\n\n\t\t\tconst positionAttribute = toNonIndexedAttribute( expandedLineIndex, new Float32BufferAttribute( coord, 3 ) );\n\t\t\tgeometry.setAttribute( 'position', positionAttribute );\n\n\t\t\tif ( colorAttribute ) geometry.setAttribute( 'color', colorAttribute );\n\n\t\t\tgeometry._type = 'line';\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction buildPointSetNode( node ) {\n\n\t\t\tlet color, coord;\n\n\t\t\tconst fields = node.fields;\n\n\t\t\tfor ( let i = 0, l = fields.length; i < l; i ++ ) {\n\n\t\t\t\tconst field = fields[ i ];\n\t\t\t\tconst fieldName = field.name;\n\t\t\t\tconst fieldValues = field.values;\n\n\t\t\t\tswitch ( fieldName ) {\n\n\t\t\t\t\tcase 'color':\n\t\t\t\t\t\tconst colorNode = fieldValues[ 0 ];\n\n\t\t\t\t\t\tif ( colorNode !== null ) {\n\n\t\t\t\t\t\t\tcolor = getNode( colorNode );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'coord':\n\t\t\t\t\t\tconst coordNode = fieldValues[ 0 ];\n\n\t\t\t\t\t\tif ( coordNode !== null ) {\n\n\t\t\t\t\t\t\tcoord = getNode( coordNode );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn( 'THREE.VRMLLoader: Unknown field:', fieldName );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst geometry = new BufferGeometry();\n\n\t\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( coord, 3 ) );\n\n\t\t\tif ( color ) {\n\n\t\t\t\tconst colorAttribute = new Float32BufferAttribute( color, 3 );\n\t\t\t\tconvertColorsToLinearSRGB( colorAttribute );\n\n\t\t\t\tgeometry.setAttribute( 'color', colorAttribute );\n\n\t\t\t}\n\n\t\t\tgeometry._type = 'points';\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction buildBoxNode( node ) {\n\n\t\t\tconst size = new Vector3( 2, 2, 2 );\n\n\t\t\tconst fields = node.fields;\n\n\t\t\tfor ( let i = 0, l = fields.length; i < l; i ++ ) {\n\n\t\t\t\tconst field = fields[ i ];\n\t\t\t\tconst fieldName = field.name;\n\t\t\t\tconst fieldValues = field.values;\n\n\t\t\t\tswitch ( fieldName ) {\n\n\t\t\t\t\tcase 'size':\n\t\t\t\t\t\tsize.x = fieldValues[ 0 ];\n\t\t\t\t\t\tsize.y = fieldValues[ 1 ];\n\t\t\t\t\t\tsize.z = fieldValues[ 2 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn( 'THREE.VRMLLoader: Unknown field:', fieldName );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst geometry = new BoxGeometry( size.x, size.y, size.z );\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction buildConeNode( node ) {\n\n\t\t\tlet radius = 1, height = 2, openEnded = false;\n\n\t\t\tconst fields = node.fields;\n\n\t\t\tfor ( let i = 0, l = fields.length; i < l; i ++ ) {\n\n\t\t\t\tconst field = fields[ i ];\n\t\t\t\tconst fieldName = field.name;\n\t\t\t\tconst fieldValues = field.values;\n\n\t\t\t\tswitch ( fieldName ) {\n\n\t\t\t\t\tcase 'bottom':\n\t\t\t\t\t\topenEnded = ! fieldValues[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'bottomRadius':\n\t\t\t\t\t\tradius = fieldValues[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'height':\n\t\t\t\t\t\theight = fieldValues[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'side':\n\t\t\t\t\t\t// field not supported\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn( 'THREE.VRMLLoader: Unknown field:', fieldName );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst geometry = new ConeGeometry( radius, height, 16, 1, openEnded );\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction buildCylinderNode( node ) {\n\n\t\t\tlet radius = 1, height = 2;\n\n\t\t\tconst fields = node.fields;\n\n\t\t\tfor ( let i = 0, l = fields.length; i < l; i ++ ) {\n\n\t\t\t\tconst field = fields[ i ];\n\t\t\t\tconst fieldName = field.name;\n\t\t\t\tconst fieldValues = field.values;\n\n\t\t\t\tswitch ( fieldName ) {\n\n\t\t\t\t\tcase 'bottom':\n\t\t\t\t\t\t// field not supported\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'radius':\n\t\t\t\t\t\tradius = fieldValues[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'height':\n\t\t\t\t\t\theight = fieldValues[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'side':\n\t\t\t\t\t\t// field not supported\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'top':\n\t\t\t\t\t\t// field not supported\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn( 'THREE.VRMLLoader: Unknown field:', fieldName );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst geometry = new CylinderGeometry( radius, radius, height, 16, 1 );\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction buildSphereNode( node ) {\n\n\t\t\tlet radius = 1;\n\n\t\t\tconst fields = node.fields;\n\n\t\t\tfor ( let i = 0, l = fields.length; i < l; i ++ ) {\n\n\t\t\t\tconst field = fields[ i ];\n\t\t\t\tconst fieldName = field.name;\n\t\t\t\tconst fieldValues = field.values;\n\n\t\t\t\tswitch ( fieldName ) {\n\n\t\t\t\t\tcase 'radius':\n\t\t\t\t\t\tradius = fieldValues[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn( 'THREE.VRMLLoader: Unknown field:', fieldName );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst geometry = new SphereGeometry( radius, 16, 16 );\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction buildElevationGridNode( node ) {\n\n\t\t\tlet color;\n\t\t\tlet normal;\n\t\t\tlet texCoord;\n\t\t\tlet height;\n\n\t\t\tlet colorPerVertex = true;\n\t\t\tlet normalPerVertex = true;\n\t\t\tlet solid = true;\n\t\t\tlet ccw = true;\n\t\t\tlet creaseAngle = 0;\n\t\t\tlet xDimension = 2;\n\t\t\tlet zDimension = 2;\n\t\t\tlet xSpacing = 1;\n\t\t\tlet zSpacing = 1;\n\n\t\t\tconst fields = node.fields;\n\n\t\t\tfor ( let i = 0, l = fields.length; i < l; i ++ ) {\n\n\t\t\t\tconst field = fields[ i ];\n\t\t\t\tconst fieldName = field.name;\n\t\t\t\tconst fieldValues = field.values;\n\n\t\t\t\tswitch ( fieldName ) {\n\n\t\t\t\t\tcase 'color':\n\t\t\t\t\t\tconst colorNode = fieldValues[ 0 ];\n\n\t\t\t\t\t\tif ( colorNode !== null ) {\n\n\t\t\t\t\t\t\tcolor = getNode( colorNode );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'normal':\n\t\t\t\t\t\tconst normalNode = fieldValues[ 0 ];\n\n\t\t\t\t\t\tif ( normalNode !== null ) {\n\n\t\t\t\t\t\t\tnormal = getNode( normalNode );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'texCoord':\n\t\t\t\t\t\tconst texCoordNode = fieldValues[ 0 ];\n\n\t\t\t\t\t\tif ( texCoordNode !== null ) {\n\n\t\t\t\t\t\t\ttexCoord = getNode( texCoordNode );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'height':\n\t\t\t\t\t\theight = fieldValues;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'ccw':\n\t\t\t\t\t\tccw = fieldValues[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'colorPerVertex':\n\t\t\t\t\t\tcolorPerVertex = fieldValues[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'creaseAngle':\n\t\t\t\t\t\tcreaseAngle = fieldValues[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'normalPerVertex':\n\t\t\t\t\t\tnormalPerVertex = fieldValues[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'solid':\n\t\t\t\t\t\tsolid = fieldValues[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'xDimension':\n\t\t\t\t\t\txDimension = fieldValues[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'xSpacing':\n\t\t\t\t\t\txSpacing = fieldValues[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'zDimension':\n\t\t\t\t\t\tzDimension = fieldValues[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'zSpacing':\n\t\t\t\t\t\tzSpacing = fieldValues[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn( 'THREE.VRMLLoader: Unknown field:', fieldName );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// vertex data\n\n\t\t\tconst vertices = [];\n\t\t\tconst normals = [];\n\t\t\tconst colors = [];\n\t\t\tconst uvs = [];\n\n\t\t\tfor ( let i = 0; i < zDimension; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j < xDimension; j ++ ) {\n\n\t\t\t\t\t// compute a row major index\n\n\t\t\t\t\tconst index = ( i * xDimension ) + j;\n\n\t\t\t\t\t// vertices\n\n\t\t\t\t\tconst x = xSpacing * i;\n\t\t\t\t\tconst y = height[ index ];\n\t\t\t\t\tconst z = zSpacing * j;\n\n\t\t\t\t\tvertices.push( x, y, z );\n\n\t\t\t\t\t// colors\n\n\t\t\t\t\tif ( color && colorPerVertex === true ) {\n\n\t\t\t\t\t\tconst r = color[ index * 3 + 0 ];\n\t\t\t\t\t\tconst g = color[ index * 3 + 1 ];\n\t\t\t\t\t\tconst b = color[ index * 3 + 2 ];\n\n\t\t\t\t\t\tcolors.push( r, g, b );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// normals\n\n\t\t\t\t\tif ( normal && normalPerVertex === true ) {\n\n\t\t\t\t\t\tconst xn = normal[ index * 3 + 0 ];\n\t\t\t\t\t\tconst yn = normal[ index * 3 + 1 ];\n\t\t\t\t\t\tconst zn = normal[ index * 3 + 2 ];\n\n\t\t\t\t\t\tnormals.push( xn, yn, zn );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// uvs\n\n\t\t\t\t\tif ( texCoord ) {\n\n\t\t\t\t\t\tconst s = texCoord[ index * 2 + 0 ];\n\t\t\t\t\t\tconst t = texCoord[ index * 2 + 1 ];\n\n\t\t\t\t\t\tuvs.push( s, t );\n\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tuvs.push( i / ( xDimension - 1 ), j / ( zDimension - 1 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\tconst indices = [];\n\n\t\t\tfor ( let i = 0; i < xDimension - 1; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j < zDimension - 1; j ++ ) {\n\n\t\t\t\t\t// from https://tecfa.unige.ch/guides/vrml/vrml97/spec/part1/nodesRef.html#ElevationGrid\n\n\t\t\t\t\tconst a = i + j * xDimension;\n\t\t\t\t\tconst b = i + ( j + 1 ) * xDimension;\n\t\t\t\t\tconst c = ( i + 1 ) + ( j + 1 ) * xDimension;\n\t\t\t\t\tconst d = ( i + 1 ) + j * xDimension;\n\n\t\t\t\t\t// faces\n\n\t\t\t\t\tif ( ccw === true ) {\n\n\t\t\t\t\t\tindices.push( a, c, b );\n\t\t\t\t\t\tindices.push( c, a, d );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tindices.push( a, b, c );\n\t\t\t\t\t\tindices.push( c, d, a );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tconst positionAttribute = toNonIndexedAttribute( indices, new Float32BufferAttribute( vertices, 3 ) );\n\t\t\tconst uvAttribute = toNonIndexedAttribute( indices, new Float32BufferAttribute( uvs, 2 ) );\n\t\t\tlet colorAttribute;\n\t\t\tlet normalAttribute;\n\n\t\t\t// color attribute\n\n\t\t\tif ( color ) {\n\n\t\t\t\tif ( colorPerVertex === false ) {\n\n\t\t\t\t\tfor ( let i = 0; i < xDimension - 1; i ++ ) {\n\n\t\t\t\t\t\tfor ( let j = 0; j < zDimension - 1; j ++ ) {\n\n\t\t\t\t\t\t\tconst index = i + j * ( xDimension - 1 );\n\n\t\t\t\t\t\t\tconst r = color[ index * 3 + 0 ];\n\t\t\t\t\t\t\tconst g = color[ index * 3 + 1 ];\n\t\t\t\t\t\t\tconst b = color[ index * 3 + 2 ];\n\n\t\t\t\t\t\t\t// one color per quad\n\n\t\t\t\t\t\t\tcolors.push( r, g, b ); colors.push( r, g, b ); colors.push( r, g, b );\n\t\t\t\t\t\t\tcolors.push( r, g, b ); colors.push( r, g, b ); colors.push( r, g, b );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcolorAttribute = new Float32BufferAttribute( colors, 3 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcolorAttribute = toNonIndexedAttribute( indices, new Float32BufferAttribute( colors, 3 ) );\n\n\t\t\t\t}\n\n\t\t\t\tconvertColorsToLinearSRGB( colorAttribute );\n\n\t\t\t}\n\n\t\t\t// normal attribute\n\n\t\t\tif ( normal ) {\n\n\t\t\t\tif ( normalPerVertex === false ) {\n\n\t\t\t\t\tfor ( let i = 0; i < xDimension - 1; i ++ ) {\n\n\t\t\t\t\t\tfor ( let j = 0; j < zDimension - 1; j ++ ) {\n\n\t\t\t\t\t\t\tconst index = i + j * ( xDimension - 1 );\n\n\t\t\t\t\t\t\tconst xn = normal[ index * 3 + 0 ];\n\t\t\t\t\t\t\tconst yn = normal[ index * 3 + 1 ];\n\t\t\t\t\t\t\tconst zn = normal[ index * 3 + 2 ];\n\n\t\t\t\t\t\t\t// one normal per quad\n\n\t\t\t\t\t\t\tnormals.push( xn, yn, zn ); normals.push( xn, yn, zn ); normals.push( xn, yn, zn );\n\t\t\t\t\t\t\tnormals.push( xn, yn, zn ); normals.push( xn, yn, zn ); normals.push( xn, yn, zn );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tnormalAttribute = new Float32BufferAttribute( normals, 3 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnormalAttribute = toNonIndexedAttribute( indices, new Float32BufferAttribute( normals, 3 ) );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tnormalAttribute = computeNormalAttribute( indices, vertices, creaseAngle );\n\n\t\t\t}\n\n\t\t\t// build geometry\n\n\t\t\tconst geometry = new BufferGeometry();\n\t\t\tgeometry.setAttribute( 'position', positionAttribute );\n\t\t\tgeometry.setAttribute( 'normal', normalAttribute );\n\t\t\tgeometry.setAttribute( 'uv', uvAttribute );\n\n\t\t\tif ( colorAttribute ) geometry.setAttribute( 'color', colorAttribute );\n\n\t\t\t// \"solid\" influences the material so let's store it for later use\n\n\t\t\tgeometry._solid = solid;\n\t\t\tgeometry._type = 'mesh';\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction buildExtrusionNode( node ) {\n\n\t\t\tlet crossSection = [ 1, 1, 1, - 1, - 1, - 1, - 1, 1, 1, 1 ];\n\t\t\tlet spine = [ 0, 0, 0, 0, 1, 0 ];\n\t\t\tlet scale;\n\t\t\tlet orientation;\n\n\t\t\tlet beginCap = true;\n\t\t\tlet ccw = true;\n\t\t\tlet creaseAngle = 0;\n\t\t\tlet endCap = true;\n\t\t\tlet solid = true;\n\n\t\t\tconst fields = node.fields;\n\n\t\t\tfor ( let i = 0, l = fields.length; i < l; i ++ ) {\n\n\t\t\t\tconst field = fields[ i ];\n\t\t\t\tconst fieldName = field.name;\n\t\t\t\tconst fieldValues = field.values;\n\n\t\t\t\tswitch ( fieldName ) {\n\n\t\t\t\t\tcase 'beginCap':\n\t\t\t\t\t\tbeginCap = fieldValues[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'ccw':\n\t\t\t\t\t\tccw = fieldValues[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'convex':\n\t\t\t\t\t\t// field not supported\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'creaseAngle':\n\t\t\t\t\t\tcreaseAngle = fieldValues[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'crossSection':\n\t\t\t\t\t\tcrossSection = fieldValues;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'endCap':\n\t\t\t\t\t\tendCap = fieldValues[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'orientation':\n\t\t\t\t\t\torientation = fieldValues;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'scale':\n\t\t\t\t\t\tscale = fieldValues;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'solid':\n\t\t\t\t\t\tsolid = fieldValues[ 0 ];\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'spine':\n\t\t\t\t\t\tspine = fieldValues; // only extrusion along the Y-axis are supported so far\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.warn( 'THREE.VRMLLoader: Unknown field:', fieldName );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst crossSectionClosed = ( crossSection[ 0 ] === crossSection[ crossSection.length - 2 ] && crossSection[ 1 ] === crossSection[ crossSection.length - 1 ] );\n\n\t\t\t// vertices\n\n\t\t\tconst vertices = [];\n\t\t\tconst spineVector = new Vector3();\n\t\t\tconst scaling = new Vector3();\n\n\t\t\tconst axis = new Vector3();\n\t\t\tconst vertex = new Vector3();\n\t\t\tconst quaternion = new Quaternion();\n\n\t\t\tfor ( let i = 0, j = 0, o = 0, il = spine.length; i < il; i += 3, j += 2, o += 4 ) {\n\n\t\t\t\tspineVector.fromArray( spine, i );\n\n\t\t\t\tscaling.x = scale ? scale[ j + 0 ] : 1;\n\t\t\t\tscaling.y = 1;\n\t\t\t\tscaling.z = scale ? scale[ j + 1 ] : 1;\n\n\t\t\t\taxis.x = orientation ? orientation[ o + 0 ] : 0;\n\t\t\t\taxis.y = orientation ? orientation[ o + 1 ] : 0;\n\t\t\t\taxis.z = orientation ? orientation[ o + 2 ] : 1;\n\t\t\t\tconst angle = orientation ? orientation[ o + 3 ] : 0;\n\n\t\t\t\tfor ( let k = 0, kl = crossSection.length; k < kl; k += 2 ) {\n\n\t\t\t\t\tvertex.x = crossSection[ k + 0 ];\n\t\t\t\t\tvertex.y = 0;\n\t\t\t\t\tvertex.z = crossSection[ k + 1 ];\n\n\t\t\t\t\t// scale\n\n\t\t\t\t\tvertex.multiply( scaling );\n\n\t\t\t\t\t// rotate\n\n\t\t\t\t\tquaternion.setFromAxisAngle( axis, angle );\n\t\t\t\t\tvertex.applyQuaternion( quaternion );\n\n\t\t\t\t\t// translate\n\n\t\t\t\t\tvertex.add( spineVector );\n\n\t\t\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// indices\n\n\t\t\tconst indices = [];\n\n\t\t\tconst spineCount = spine.length / 3;\n\t\t\tconst crossSectionCount = crossSection.length / 2;\n\n\t\t\tfor ( let i = 0; i < spineCount - 1; i ++ ) {\n\n\t\t\t\tfor ( let j = 0; j < crossSectionCount - 1; j ++ ) {\n\n\t\t\t\t\tconst a = j + i * crossSectionCount;\n\t\t\t\t\tlet b = ( j + 1 ) + i * crossSectionCount;\n\t\t\t\t\tconst c = j + ( i + 1 ) * crossSectionCount;\n\t\t\t\t\tlet d = ( j + 1 ) + ( i + 1 ) * crossSectionCount;\n\n\t\t\t\t\tif ( ( j === crossSectionCount - 2 ) && ( crossSectionClosed === true ) ) {\n\n\t\t\t\t\t\tb = i * crossSectionCount;\n\t\t\t\t\t\td = ( i + 1 ) * crossSectionCount;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ccw === true ) {\n\n\t\t\t\t\t\tindices.push( a, b, c );\n\t\t\t\t\t\tindices.push( c, b, d );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tindices.push( a, c, b );\n\t\t\t\t\t\tindices.push( c, d, b );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// triangulate cap\n\n\t\t\tif ( beginCap === true || endCap === true ) {\n\n\t\t\t\tconst contour = [];\n\n\t\t\t\tfor ( let i = 0, l = crossSection.length; i < l; i += 2 ) {\n\n\t\t\t\t\tcontour.push( new Vector2( crossSection[ i ], crossSection[ i + 1 ] ) );\n\n\t\t\t\t}\n\n\t\t\t\tconst faces = ShapeUtils.triangulateShape( contour, [] );\n\t\t\t\tconst capIndices = [];\n\n\t\t\t\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst face = faces[ i ];\n\n\t\t\t\t\tcapIndices.push( face[ 0 ], face[ 1 ], face[ 2 ] );\n\n\t\t\t\t}\n\n\t\t\t\t// begin cap\n\n\t\t\t\tif ( beginCap === true ) {\n\n\t\t\t\t\tfor ( let i = 0, l = capIndices.length; i < l; i += 3 ) {\n\n\t\t\t\t\t\tif ( ccw === true ) {\n\n\t\t\t\t\t\t\tindices.push( capIndices[ i + 0 ], capIndices[ i + 1 ], capIndices[ i + 2 ] );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tindices.push( capIndices[ i + 0 ], capIndices[ i + 2 ], capIndices[ i + 1 ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// end cap\n\n\t\t\t\tif ( endCap === true ) {\n\n\t\t\t\t\tconst indexOffset = crossSectionCount * ( spineCount - 1 ); // references to the first vertex of the last cross section\n\n\t\t\t\t\tfor ( let i = 0, l = capIndices.length; i < l; i += 3 ) {\n\n\t\t\t\t\t\tif ( ccw === true ) {\n\n\t\t\t\t\t\t\tindices.push( indexOffset + capIndices[ i + 0 ], indexOffset + capIndices[ i + 2 ], indexOffset + capIndices[ i + 1 ] );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tindices.push( indexOffset + capIndices[ i + 0 ], indexOffset + capIndices[ i + 1 ], indexOffset + capIndices[ i + 2 ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst positionAttribute = toNonIndexedAttribute( indices, new Float32BufferAttribute( vertices, 3 ) );\n\t\t\tconst normalAttribute = computeNormalAttribute( indices, vertices, creaseAngle );\n\n\t\t\tconst geometry = new BufferGeometry();\n\t\t\tgeometry.setAttribute( 'position', positionAttribute );\n\t\t\tgeometry.setAttribute( 'normal', normalAttribute );\n\t\t\t// no uvs yet\n\n\t\t\t// \"solid\" influences the material so let's store it for later use\n\n\t\t\tgeometry._solid = solid;\n\t\t\tgeometry._type = 'mesh';\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\t// helper functions\n\n\t\tfunction resolveUSE( identifier ) {\n\n\t\t\tconst node = nodeMap[ identifier ];\n\t\t\tconst build = getNode( node );\n\n\t\t\t// because the same 3D objects can have different transformations, it's necessary to clone them.\n\t\t\t// materials can be influenced by the geometry (e.g. vertex normals). cloning is necessary to avoid\n\t\t\t// any side effects\n\n\t\t\treturn ( build.isObject3D || build.isMaterial ) ? build.clone() : build;\n\n\t\t}\n\n\t\tfunction parseFieldChildren( children, owner ) {\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tconst object = getNode( children[ i ] );\n\n\t\t\t\tif ( object instanceof Object3D ) owner.add( object );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction triangulateFaceIndex( index, ccw ) {\n\n\t\t\tconst indices = [];\n\n\t\t\t// since face definitions can have more than three vertices, it's necessary to\n\t\t\t// perform a simple triangulation\n\n\t\t\tlet start = 0;\n\n\t\t\tfor ( let i = 0, l = index.length; i < l; i ++ ) {\n\n\t\t\t\tconst i1 = index[ start ];\n\t\t\t\tconst i2 = index[ i + ( ccw ? 1 : 2 ) ];\n\t\t\t\tconst i3 = index[ i + ( ccw ? 2 : 1 ) ];\n\n\t\t\t\tindices.push( i1, i2, i3 );\n\n\t\t\t\t// an index of -1 indicates that the current face has ended and the next one begins\n\n\t\t\t\tif ( index[ i + 3 ] === - 1 || i + 3 >= l ) {\n\n\t\t\t\t\ti += 3;\n\t\t\t\t\tstart = i + 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn indices;\n\n\t\t}\n\n\t\tfunction triangulateFaceData( data, index ) {\n\n\t\t\tconst triangulatedData = [];\n\n\t\t\tlet start = 0;\n\n\t\t\tfor ( let i = 0, l = index.length; i < l; i ++ ) {\n\n\t\t\t\tconst stride = start * 3;\n\n\t\t\t\tconst x = data[ stride ];\n\t\t\t\tconst y = data[ stride + 1 ];\n\t\t\t\tconst z = data[ stride + 2 ];\n\n\t\t\t\ttriangulatedData.push( x, y, z );\n\n\t\t\t\t// an index of -1 indicates that the current face has ended and the next one begins\n\n\t\t\t\tif ( index[ i + 3 ] === - 1 || i + 3 >= l ) {\n\n\t\t\t\t\ti += 3;\n\t\t\t\t\tstart ++;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn triangulatedData;\n\n\t\t}\n\n\t\tfunction flattenData( data, index ) {\n\n\t\t\tconst flattenData = [];\n\n\t\t\tfor ( let i = 0, l = index.length; i < l; i ++ ) {\n\n\t\t\t\tconst i1 = index[ i ];\n\n\t\t\t\tconst stride = i1 * 3;\n\n\t\t\t\tconst x = data[ stride ];\n\t\t\t\tconst y = data[ stride + 1 ];\n\t\t\t\tconst z = data[ stride + 2 ];\n\n\t\t\t\tflattenData.push( x, y, z );\n\n\t\t\t}\n\n\t\t\treturn flattenData;\n\n\t\t}\n\n\t\tfunction expandLineIndex( index ) {\n\n\t\t\tconst indices = [];\n\n\t\t\tfor ( let i = 0, l = index.length; i < l; i ++ ) {\n\n\t\t\t\tconst i1 = index[ i ];\n\t\t\t\tconst i2 = index[ i + 1 ];\n\n\t\t\t\tindices.push( i1, i2 );\n\n\t\t\t\t// an index of -1 indicates that the current line has ended and the next one begins\n\n\t\t\t\tif ( index[ i + 2 ] === - 1 || i + 2 >= l ) {\n\n\t\t\t\t\ti += 2;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn indices;\n\n\t\t}\n\n\t\tfunction expandLineData( data, index ) {\n\n\t\t\tconst triangulatedData = [];\n\n\t\t\tlet start = 0;\n\n\t\t\tfor ( let i = 0, l = index.length; i < l; i ++ ) {\n\n\t\t\t\tconst stride = start * 3;\n\n\t\t\t\tconst x = data[ stride ];\n\t\t\t\tconst y = data[ stride + 1 ];\n\t\t\t\tconst z = data[ stride + 2 ];\n\n\t\t\t\ttriangulatedData.push( x, y, z );\n\n\t\t\t\t// an index of -1 indicates that the current line has ended and the next one begins\n\n\t\t\t\tif ( index[ i + 2 ] === - 1 || i + 2 >= l ) {\n\n\t\t\t\t\ti += 2;\n\t\t\t\t\tstart ++;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn triangulatedData;\n\n\t\t}\n\n\t\tconst vA = new Vector3();\n\t\tconst vB = new Vector3();\n\t\tconst vC = new Vector3();\n\n\t\tconst uvA = new Vector2();\n\t\tconst uvB = new Vector2();\n\t\tconst uvC = new Vector2();\n\n\t\tfunction computeAttributeFromIndexedData( coordIndex, index, data, itemSize ) {\n\n\t\t\tconst array = [];\n\n\t\t\t// we use the coordIndex.length as delimiter since normalIndex must contain at least as many indices\n\n\t\t\tfor ( let i = 0, l = coordIndex.length; i < l; i += 3 ) {\n\n\t\t\t\tconst a = index[ i ];\n\t\t\t\tconst b = index[ i + 1 ];\n\t\t\t\tconst c = index[ i + 2 ];\n\n\t\t\t\tif ( itemSize === 2 ) {\n\n\t\t\t\t\tuvA.fromArray( data, a * itemSize );\n\t\t\t\t\tuvB.fromArray( data, b * itemSize );\n\t\t\t\t\tuvC.fromArray( data, c * itemSize );\n\n\t\t\t\t\tarray.push( uvA.x, uvA.y );\n\t\t\t\t\tarray.push( uvB.x, uvB.y );\n\t\t\t\t\tarray.push( uvC.x, uvC.y );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvA.fromArray( data, a * itemSize );\n\t\t\t\t\tvB.fromArray( data, b * itemSize );\n\t\t\t\t\tvC.fromArray( data, c * itemSize );\n\n\t\t\t\t\tarray.push( vA.x, vA.y, vA.z );\n\t\t\t\t\tarray.push( vB.x, vB.y, vB.z );\n\t\t\t\t\tarray.push( vC.x, vC.y, vC.z );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new Float32BufferAttribute( array, itemSize );\n\n\t\t}\n\n\t\tfunction computeAttributeFromFaceData( index, faceData ) {\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0, j = 0, l = index.length; i < l; i += 3, j ++ ) {\n\n\t\t\t\tvA.fromArray( faceData, j * 3 );\n\n\t\t\t\tarray.push( vA.x, vA.y, vA.z );\n\t\t\t\tarray.push( vA.x, vA.y, vA.z );\n\t\t\t\tarray.push( vA.x, vA.y, vA.z );\n\n\t\t\t}\n\n\t\t\treturn new Float32BufferAttribute( array, 3 );\n\n\t\t}\n\n\t\tfunction computeAttributeFromLineData( index, lineData ) {\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0, j = 0, l = index.length; i < l; i += 2, j ++ ) {\n\n\t\t\t\tvA.fromArray( lineData, j * 3 );\n\n\t\t\t\tarray.push( vA.x, vA.y, vA.z );\n\t\t\t\tarray.push( vA.x, vA.y, vA.z );\n\n\t\t\t}\n\n\t\t\treturn new Float32BufferAttribute( array, 3 );\n\n\t\t}\n\n\t\tfunction toNonIndexedAttribute( indices, attribute ) {\n\n\t\t\tconst array = attribute.array;\n\t\t\tconst itemSize = attribute.itemSize;\n\n\t\t\tconst array2 = new array.constructor( indices.length * itemSize );\n\n\t\t\tlet index = 0, index2 = 0;\n\n\t\t\tfor ( let i = 0, l = indices.length; i < l; i ++ ) {\n\n\t\t\t\tindex = indices[ i ] * itemSize;\n\n\t\t\t\tfor ( let j = 0; j < itemSize; j ++ ) {\n\n\t\t\t\t\tarray2[ index2 ++ ] = array[ index ++ ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn new Float32BufferAttribute( array2, itemSize );\n\n\t\t}\n\n\t\tconst ab = new Vector3();\n\t\tconst cb = new Vector3();\n\n\t\tfunction computeNormalAttribute( index, coord, creaseAngle ) {\n\n\t\t\tconst faces = [];\n\t\t\tconst vertexNormals = {};\n\n\t\t\t// prepare face and raw vertex normals\n\n\t\t\tfor ( let i = 0, l = index.length; i < l; i += 3 ) {\n\n\t\t\t\tconst a = index[ i ];\n\t\t\t\tconst b = index[ i + 1 ];\n\t\t\t\tconst c = index[ i + 2 ];\n\n\t\t\t\tconst face = new Face( a, b, c );\n\n\t\t\t\tvA.fromArray( coord, a * 3 );\n\t\t\t\tvB.fromArray( coord, b * 3 );\n\t\t\t\tvC.fromArray( coord, c * 3 );\n\n\t\t\t\tcb.subVectors( vC, vB );\n\t\t\t\tab.subVectors( vA, vB );\n\t\t\t\tcb.cross( ab );\n\n\t\t\t\tcb.normalize();\n\n\t\t\t\tface.normal.copy( cb );\n\n\t\t\t\tif ( vertexNormals[ a ] === undefined ) vertexNormals[ a ] = [];\n\t\t\t\tif ( vertexNormals[ b ] === undefined ) vertexNormals[ b ] = [];\n\t\t\t\tif ( vertexNormals[ c ] === undefined ) vertexNormals[ c ] = [];\n\n\t\t\t\tvertexNormals[ a ].push( face.normal );\n\t\t\t\tvertexNormals[ b ].push( face.normal );\n\t\t\t\tvertexNormals[ c ].push( face.normal );\n\n\t\t\t\tfaces.push( face );\n\n\t\t\t}\n\n\t\t\t// compute vertex normals and build final geometry\n\n\t\t\tconst normals = [];\n\n\t\t\tfor ( let i = 0, l = faces.length; i < l; i ++ ) {\n\n\t\t\t\tconst face = faces[ i ];\n\n\t\t\t\tconst nA = weightedNormal( vertexNormals[ face.a ], face.normal, creaseAngle );\n\t\t\t\tconst nB = weightedNormal( vertexNormals[ face.b ], face.normal, creaseAngle );\n\t\t\t\tconst nC = weightedNormal( vertexNormals[ face.c ], face.normal, creaseAngle );\n\n\t\t\t\tvA.fromArray( coord, face.a * 3 );\n\t\t\t\tvB.fromArray( coord, face.b * 3 );\n\t\t\t\tvC.fromArray( coord, face.c * 3 );\n\n\t\t\t\tnormals.push( nA.x, nA.y, nA.z );\n\t\t\t\tnormals.push( nB.x, nB.y, nB.z );\n\t\t\t\tnormals.push( nC.x, nC.y, nC.z );\n\n\t\t\t}\n\n\t\t\treturn new Float32BufferAttribute( normals, 3 );\n\n\t\t}\n\n\t\tfunction weightedNormal( normals, vector, creaseAngle ) {\n\n\t\t\tconst normal = new Vector3();\n\n\t\t\tif ( creaseAngle === 0 ) {\n\n\t\t\t\tnormal.copy( vector );\n\n\t\t\t} else {\n\n\t\t\t\tfor ( let i = 0, l = normals.length; i < l; i ++ ) {\n\n\t\t\t\t\tif ( normals[ i ].angleTo( vector ) < creaseAngle ) {\n\n\t\t\t\t\t\tnormal.add( normals[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn normal.normalize();\n\n\t\t}\n\n\t\tfunction toColorArray( colors ) {\n\n\t\t\tconst array = [];\n\n\t\t\tfor ( let i = 0, l = colors.length; i < l; i += 3 ) {\n\n\t\t\t\tarray.push( new Color( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] ) );\n\n\t\t\t}\n\n\t\t\treturn array;\n\n\t\t}\n\n\t\tfunction convertColorsToLinearSRGB( attribute ) {\n\n\t\t\tconst color = new Color();\n\n\t\t\tfor ( let i = 0; i < attribute.count; i ++ ) {\n\n\t\t\t\tcolor.fromBufferAttribute( attribute, i );\n\n\t\t\t\tColorManagement.colorSpaceToWorking( color, SRGBColorSpace );\n\n\t\t\t\tattribute.setXYZ( i, color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\t/**\n\t\t * Vertically paints the faces interpolating between the\n\t\t * specified colors at the specified angels. This is used for the Background\n\t\t * node, but could be applied to other nodes with multiple faces as well.\n\t\t *\n\t\t * When used with the Background node, default is directionIsDown is true if\n\t\t * interpolating the skyColor down from the Zenith. When interpolating up from\n\t\t * the Nadir i.e. interpolating the groundColor, the directionIsDown is false.\n\t\t *\n\t\t * The first angle is never specified, it is the Zenith (0 rad). Angles are specified\n\t\t * in radians. The geometry is thought a sphere, but could be anything. The color interpolation\n\t\t * is linear along the Y axis in any case.\n\t\t *\n\t\t * You must specify one more color than you have angles at the beginning of the colors array.\n\t\t * This is the color of the Zenith (the top of the shape).\n\t\t *\n\t\t * @param {BufferGeometry} geometry\n\t\t * @param {number} radius\n\t\t * @param {Array} angles\n\t\t * @param {Array} colors\n\t\t * @param {boolean} topDown - Whether to work top down or bottom up.\n\t\t */\n\t\tfunction paintFaces( geometry, radius, angles, colors, topDown ) {\n\n\t\t\t// compute threshold values\n\n\t\t\tconst thresholds = [];\n\t\t\tconst startAngle = ( topDown === true ) ? 0 : Math.PI;\n\n\t\t\tfor ( let i = 0, l = colors.length; i < l; i ++ ) {\n\n\t\t\t\tlet angle = ( i === 0 ) ? 0 : angles[ i - 1 ];\n\t\t\t\tangle = ( topDown === true ) ? angle : ( startAngle - angle );\n\n\t\t\t\tconst point = new Vector3();\n\t\t\t\tpoint.setFromSphericalCoords( radius, angle, 0 );\n\n\t\t\t\tthresholds.push( point );\n\n\t\t\t}\n\n\t\t\t// generate vertex colors\n\n\t\t\tconst indices = geometry.index;\n\t\t\tconst positionAttribute = geometry.attributes.position;\n\t\t\tconst colorAttribute = new BufferAttribute( new Float32Array( geometry.attributes.position.count * 3 ), 3 );\n\n\t\t\tconst position = new Vector3();\n\t\t\tconst color = new Color();\n\n\t\t\tfor ( let i = 0; i < indices.count; i ++ ) {\n\n\t\t\t\tconst index = indices.getX( i );\n\t\t\t\tposition.fromBufferAttribute( positionAttribute, index );\n\n\t\t\t\tlet thresholdIndexA, thresholdIndexB;\n\t\t\t\tlet t = 1;\n\n\t\t\t\tfor ( let j = 1; j < thresholds.length; j ++ ) {\n\n\t\t\t\t\tthresholdIndexA = j - 1;\n\t\t\t\t\tthresholdIndexB = j;\n\n\t\t\t\t\tconst thresholdA = thresholds[ thresholdIndexA ];\n\t\t\t\t\tconst thresholdB = thresholds[ thresholdIndexB ];\n\n\t\t\t\t\tif ( topDown === true ) {\n\n\t\t\t\t\t\t// interpolation for sky color\n\n\t\t\t\t\t\tif ( position.y <= thresholdA.y && position.y > thresholdB.y ) {\n\n\t\t\t\t\t\t\tt = Math.abs( thresholdA.y - position.y ) / Math.abs( thresholdA.y - thresholdB.y );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// interpolation for ground color\n\n\t\t\t\t\t\tif ( position.y >= thresholdA.y && position.y < thresholdB.y ) {\n\n\t\t\t\t\t\t\tt = Math.abs( thresholdA.y - position.y ) / Math.abs( thresholdA.y - thresholdB.y );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst colorA = colors[ thresholdIndexA ];\n\t\t\t\tconst colorB = colors[ thresholdIndexB ];\n\n\t\t\t\tcolor.copy( colorA ).lerp( colorB, t );\n\n\t\t\t\tColorManagement.colorSpaceToWorking( color, SRGBColorSpace );\n\n\t\t\t\tcolorAttribute.setXYZ( index, color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t\tgeometry.setAttribute( 'color', colorAttribute );\n\n\t\t}\n\n\t\t//\n\n\t\tconst textureLoader = new TextureLoader( this.manager );\n\t\ttextureLoader.setPath( this.resourcePath || path ).setCrossOrigin( this.crossOrigin );\n\n\t\t// check version (only 2.0 is supported)\n\n\t\tif ( data.indexOf( '#VRML V2.0' ) === - 1 ) {\n\n\t\t\tthrow Error( 'THREE.VRMLLexer: Version of VRML asset not supported.' );\n\n\t\t}\n\n\t\t// create JSON representing the tree structure of the VRML asset\n\n\t\tconst tree = generateVRMLTree( data );\n\n\t\t// parse the tree structure to a three.js scene\n\n\t\tconst scene = parseTree( tree );\n\n\t\treturn scene;\n\n\t}\n\n}\n\nclass VRMLLexer {\n\n\tconstructor( tokens ) {\n\n\t\tthis.lexer = new chevrotain.Lexer( tokens );\n\n\t}\n\n\tlex( inputText ) {\n\n\t\tconst lexingResult = this.lexer.tokenize( inputText );\n\n\t\tif ( lexingResult.errors.length > 0 ) {\n\n\t\t\tconsole.error( lexingResult.errors );\n\n\t\t\tthrow Error( 'THREE.VRMLLexer: Lexing errors detected.' );\n\n\t\t}\n\n\t\treturn lexingResult;\n\n\t}\n\n}\n\nconst CstParser = chevrotain.CstParser;\n\nclass VRMLParser extends CstParser {\n\n\tconstructor( tokenVocabulary ) {\n\n\t\tsuper( tokenVocabulary );\n\n\t\tconst $ = this;\n\n\t\tconst Version = tokenVocabulary[ 'Version' ];\n\t\tconst LCurly = tokenVocabulary[ 'LCurly' ];\n\t\tconst RCurly = tokenVocabulary[ 'RCurly' ];\n\t\tconst LSquare = tokenVocabulary[ 'LSquare' ];\n\t\tconst RSquare = tokenVocabulary[ 'RSquare' ];\n\t\tconst Identifier = tokenVocabulary[ 'Identifier' ];\n\t\tconst RouteIdentifier = tokenVocabulary[ 'RouteIdentifier' ];\n\t\tconst StringLiteral = tokenVocabulary[ 'StringLiteral' ];\n\t\tconst HexLiteral = tokenVocabulary[ 'HexLiteral' ];\n\t\tconst NumberLiteral = tokenVocabulary[ 'NumberLiteral' ];\n\t\tconst TrueLiteral = tokenVocabulary[ 'TrueLiteral' ];\n\t\tconst FalseLiteral = tokenVocabulary[ 'FalseLiteral' ];\n\t\tconst NullLiteral = tokenVocabulary[ 'NullLiteral' ];\n\t\tconst DEF = tokenVocabulary[ 'DEF' ];\n\t\tconst USE = tokenVocabulary[ 'USE' ];\n\t\tconst ROUTE = tokenVocabulary[ 'ROUTE' ];\n\t\tconst TO = tokenVocabulary[ 'TO' ];\n\t\tconst NodeName = tokenVocabulary[ 'NodeName' ];\n\n\t\t$.RULE( 'vrml', function () {\n\n\t\t\t$.SUBRULE( $.version );\n\t\t\t$.AT_LEAST_ONE( function () {\n\n\t\t\t\t$.SUBRULE( $.node );\n\n\t\t\t} );\n\t\t\t$.MANY( function () {\n\n\t\t\t\t$.SUBRULE( $.route );\n\n\t\t\t} );\n\n\t\t} );\n\n\t\t$.RULE( 'version', function () {\n\n\t\t\t$.CONSUME( Version );\n\n\t\t} );\n\n\t\t$.RULE( 'node', function () {\n\n\t\t\t$.OPTION( function () {\n\n\t\t\t\t$.SUBRULE( $.def );\n\n\t\t\t} );\n\n\t\t\t$.CONSUME( NodeName );\n\t\t\t$.CONSUME( LCurly );\n\t\t\t$.MANY( function () {\n\n\t\t\t\t$.SUBRULE( $.field );\n\n\t\t\t} );\n\t\t\t$.CONSUME( RCurly );\n\n\t\t} );\n\n\t\t$.RULE( 'field', function () {\n\n\t\t\t$.CONSUME( Identifier );\n\n\t\t\t$.OR2( [\n\t\t\t\t{ ALT: function () {\n\n\t\t\t\t\t$.SUBRULE( $.singleFieldValue );\n\n\t\t\t\t} },\n\t\t\t\t{ ALT: function () {\n\n\t\t\t\t\t$.SUBRULE( $.multiFieldValue );\n\n\t\t\t\t} }\n\t\t\t] );\n\n\t\t} );\n\n\t\t$.RULE( 'def', function () {\n\n\t\t\t$.CONSUME( DEF );\n\t\t\t$.OR( [\n\t\t\t\t{ ALT: function () {\n\n\t\t\t\t\t$.CONSUME( Identifier );\n\n\t\t\t\t} },\n\t\t\t\t{ ALT: function () {\n\n\t\t\t\t\t$.CONSUME( NodeName );\n\n\t\t\t\t} }\n\t\t\t] );\n\n\t\t} );\n\n\t\t$.RULE( 'use', function () {\n\n\t\t\t$.CONSUME( USE );\n\t\t\t$.OR( [\n\t\t\t\t{ ALT: function () {\n\n\t\t\t\t\t$.CONSUME( Identifier );\n\n\t\t\t\t} },\n\t\t\t\t{ ALT: function () {\n\n\t\t\t\t\t$.CONSUME( NodeName );\n\n\t\t\t\t} }\n\t\t\t] );\n\n\t\t} );\n\n\t\t$.RULE( 'singleFieldValue', function () {\n\n\t\t\t$.AT_LEAST_ONE( function () {\n\n\t\t\t\t$.OR( [\n\t\t\t\t\t{ ALT: function () {\n\n\t\t\t\t\t\t$.SUBRULE( $.node );\n\n\t\t\t\t\t} },\n\t\t\t\t\t{ ALT: function () {\n\n\t\t\t\t\t\t$.SUBRULE( $.use );\n\n\t\t\t\t\t} },\n\t\t\t\t\t{ ALT: function () {\n\n\t\t\t\t\t\t$.CONSUME( StringLiteral );\n\n\t\t\t\t\t} },\n\t\t\t\t\t{ ALT: function () {\n\n\t\t\t\t\t\t$.CONSUME( HexLiteral );\n\n\t\t\t\t\t} },\n\t\t\t\t\t{ ALT: function () {\n\n\t\t\t\t\t\t$.CONSUME( NumberLiteral );\n\n\t\t\t\t\t} },\n\t\t\t\t\t{ ALT: function () {\n\n\t\t\t\t\t\t$.CONSUME( TrueLiteral );\n\n\t\t\t\t\t} },\n\t\t\t\t\t{ ALT: function () {\n\n\t\t\t\t\t\t$.CONSUME( FalseLiteral );\n\n\t\t\t\t\t} },\n\t\t\t\t\t{ ALT: function () {\n\n\t\t\t\t\t\t$.CONSUME( NullLiteral );\n\n\t\t\t\t\t} }\n\t\t\t\t] );\n\n\n\t\t\t} );\n\n\t\t} );\n\n\t\t$.RULE( 'multiFieldValue', function () {\n\n\t\t\t$.CONSUME( LSquare );\n\t\t\t$.MANY( function () {\n\n\t\t\t\t$.OR( [\n\t\t\t\t\t{ ALT: function () {\n\n\t\t\t\t\t\t$.SUBRULE( $.node );\n\n\t\t\t\t\t} },\n\t\t\t\t\t{ ALT: function () {\n\n\t\t\t\t\t\t$.SUBRULE( $.use );\n\n\t\t\t\t\t} },\n\t\t\t\t\t{ ALT: function () {\n\n\t\t\t\t\t\t$.CONSUME( StringLiteral );\n\n\t\t\t\t\t} },\n\t\t\t\t\t{ ALT: function () {\n\n\t\t\t\t\t\t$.CONSUME( HexLiteral );\n\n\t\t\t\t\t} },\n\t\t\t\t\t{ ALT: function () {\n\n\t\t\t\t\t\t$.CONSUME( NumberLiteral );\n\n\t\t\t\t\t} },\n\t\t\t\t\t{ ALT: function () {\n\n\t\t\t\t\t\t$.CONSUME( NullLiteral );\n\n\t\t\t\t\t} }\n\t\t\t\t] );\n\n\t\t\t} );\n\t\t\t$.CONSUME( RSquare );\n\n\t\t} );\n\n\t\t$.RULE( 'route', function () {\n\n\t\t\t$.CONSUME( ROUTE );\n\t\t\t$.CONSUME( RouteIdentifier );\n\t\t\t$.CONSUME( TO );\n\t\t\t$.CONSUME2( RouteIdentifier );\n\n\t\t} );\n\n\t\tthis.performSelfAnalysis();\n\n\t}\n\n}\n\nclass Face {\n\n\tconstructor( a, b, c ) {\n\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\t\tthis.normal = new Vector3();\n\n\t}\n\n}\n\nconst TEXTURE_TYPE = {\n\tINTENSITY: 1,\n\tINTENSITY_ALPHA: 2,\n\tRGB: 3,\n\tRGBA: 4\n};\n\nexport { VRMLLoader };\n", "import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tColor,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tLoader,\n\tSRGBColorSpace\n} from 'three';\nimport * as fflate from '../libs/fflate.module.js';\n\n/**\n * A loader for the VTK format.\n *\n * This loader only supports the `POLYDATA` dataset format so far. Other formats\n * (structured points, structured grid, rectilinear grid, unstructured grid, appended)\n * are not supported.\n *\n * ```js\n * const loader = new VTKLoader();\n * const geometry = await loader.loadAsync( 'models/vtk/liver.vtk' );\n * geometry.computeVertexNormals();\n *\n * const mesh = new THREE.Mesh( geometry, new THREE.MeshLambertMaterial() );\n * scene.add( mesh );\n * ```\n *\n * @augments Loader\n * @three_import import { VTKLoader } from 'three/addons/loaders/VTKLoader.js';\n */\nclass VTKLoader extends Loader {\n\n\t/**\n\t * Constructs a new VTK loader.\n\t *\n\t * @param {LoadingManager} [manager] - The loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t}\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded VRML asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(BufferGeometry)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( scope.manager );\n\t\tloader.setPath( scope.path );\n\t\tloader.setResponseType( 'arraybuffer' );\n\t\tloader.setRequestHeader( scope.requestHeader );\n\t\tloader.setWithCredentials( scope.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( text ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given VTK data and returns the resulting geometry.\n\t *\n\t * @param {ArrayBuffer} data - The raw VTK data as an array buffer\n\t * @return {BufferGeometry} The parsed geometry.\n\t */\n\tparse( data ) {\n\n\t\tfunction parseASCII( data ) {\n\n\t\t\t// connectivity of the triangles\n\t\t\tconst indices = [];\n\n\t\t\t// triangles vertices\n\t\t\tconst positions = [];\n\n\t\t\t// red, green, blue colors in the range 0 to 1\n\t\t\tconst colors = [];\n\n\t\t\t// normal vector, one per vertex\n\t\t\tconst normals = [];\n\n\t\t\tlet result;\n\n\t\t\t// pattern for detecting the end of a number sequence\n\t\t\tconst patWord = /^[^\\d.\\s-]+/;\n\n\t\t\t// pattern for reading vertices, 3 floats or integers\n\t\t\tconst pat3Floats = /(\\-?\\d+\\.?[\\d\\-\\+e]*)\\s+(\\-?\\d+\\.?[\\d\\-\\+e]*)\\s+(\\-?\\d+\\.?[\\d\\-\\+e]*)/g;\n\n\t\t\t// pattern for connectivity, an integer followed by any number of ints\n\t\t\t// the first integer is the number of polygon nodes\n\t\t\tconst patConnectivity = /^(\\d+)\\s+([\\s\\d]*)/;\n\n\t\t\t// indicates start of vertex data section\n\t\t\tconst patPOINTS = /^POINTS /;\n\n\t\t\t// indicates start of polygon connectivity section\n\t\t\tconst patPOLYGONS = /^POLYGONS /;\n\n\t\t\t// indicates start of triangle strips section\n\t\t\tconst patTRIANGLE_STRIPS = /^TRIANGLE_STRIPS /;\n\n\t\t\t// POINT_DATA number_of_values\n\t\t\tconst patPOINT_DATA = /^POINT_DATA[ ]+(\\d+)/;\n\n\t\t\t// CELL_DATA number_of_polys\n\t\t\tconst patCELL_DATA = /^CELL_DATA[ ]+(\\d+)/;\n\n\t\t\t// Start of color section\n\t\t\tconst patCOLOR_SCALARS = /^COLOR_SCALARS[ ]+(\\w+)[ ]+3/;\n\n\t\t\t// NORMALS Normals float\n\t\t\tconst patNORMALS = /^NORMALS[ ]+(\\w+)[ ]+(\\w+)/;\n\n\t\t\tlet inPointsSection = false;\n\t\t\tlet inPolygonsSection = false;\n\t\t\tlet inTriangleStripSection = false;\n\t\t\tlet inPointDataSection = false;\n\t\t\tlet inCellDataSection = false;\n\t\t\tlet inColorSection = false;\n\t\t\tlet inNormalsSection = false;\n\n\t\t\tconst color = new Color();\n\n\t\t\tconst lines = data.split( '\\n' );\n\n\t\t\tfor ( const i in lines ) {\n\n\t\t\t\tconst line = lines[ i ].trim();\n\n\t\t\t\tif ( line.indexOf( 'DATASET' ) === 0 ) {\n\n\t\t\t\t\tconst dataset = line.split( ' ' )[ 1 ];\n\n\t\t\t\t\tif ( dataset !== 'POLYDATA' ) throw new Error( 'Unsupported DATASET type: ' + dataset );\n\n\t\t\t\t} else if ( inPointsSection ) {\n\n\t\t\t\t\t// get the vertices\n\t\t\t\t\twhile ( ( result = pat3Floats.exec( line ) ) !== null ) {\n\n\t\t\t\t\t\tif ( patWord.exec( line ) !== null ) break;\n\n\t\t\t\t\t\tconst x = parseFloat( result[ 1 ] );\n\t\t\t\t\t\tconst y = parseFloat( result[ 2 ] );\n\t\t\t\t\t\tconst z = parseFloat( result[ 3 ] );\n\t\t\t\t\t\tpositions.push( x, y, z );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( inPolygonsSection ) {\n\n\t\t\t\t\tif ( ( result = patConnectivity.exec( line ) ) !== null ) {\n\n\t\t\t\t\t\t// numVertices i0 i1 i2 ...\n\t\t\t\t\t\tconst numVertices = parseInt( result[ 1 ] );\n\t\t\t\t\t\tconst inds = result[ 2 ].split( /\\s+/ );\n\n\t\t\t\t\t\tif ( numVertices >= 3 ) {\n\n\t\t\t\t\t\t\tconst i0 = parseInt( inds[ 0 ] );\n\t\t\t\t\t\t\tlet k = 1;\n\t\t\t\t\t\t\t// split the polygon in numVertices - 2 triangles\n\t\t\t\t\t\t\tfor ( let j = 0; j < numVertices - 2; ++ j ) {\n\n\t\t\t\t\t\t\t\tconst i1 = parseInt( inds[ k ] );\n\t\t\t\t\t\t\t\tconst i2 = parseInt( inds[ k + 1 ] );\n\t\t\t\t\t\t\t\tindices.push( i0, i1, i2 );\n\t\t\t\t\t\t\t\tk ++;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( inTriangleStripSection ) {\n\n\t\t\t\t\tif ( ( result = patConnectivity.exec( line ) ) !== null ) {\n\n\t\t\t\t\t\t// numVertices i0 i1 i2 ...\n\t\t\t\t\t\tconst numVertices = parseInt( result[ 1 ] );\n\t\t\t\t\t\tconst inds = result[ 2 ].split( /\\s+/ );\n\n\t\t\t\t\t\tif ( numVertices >= 3 ) {\n\n\t\t\t\t\t\t\t// split the polygon in numVertices - 2 triangles\n\t\t\t\t\t\t\tfor ( let j = 0; j < numVertices - 2; j ++ ) {\n\n\t\t\t\t\t\t\t\tif ( j % 2 === 1 ) {\n\n\t\t\t\t\t\t\t\t\tconst i0 = parseInt( inds[ j ] );\n\t\t\t\t\t\t\t\t\tconst i1 = parseInt( inds[ j + 2 ] );\n\t\t\t\t\t\t\t\t\tconst i2 = parseInt( inds[ j + 1 ] );\n\t\t\t\t\t\t\t\t\tindices.push( i0, i1, i2 );\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tconst i0 = parseInt( inds[ j ] );\n\t\t\t\t\t\t\t\t\tconst i1 = parseInt( inds[ j + 1 ] );\n\t\t\t\t\t\t\t\t\tconst i2 = parseInt( inds[ j + 2 ] );\n\t\t\t\t\t\t\t\t\tindices.push( i0, i1, i2 );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( inPointDataSection || inCellDataSection ) {\n\n\t\t\t\t\tif ( inColorSection ) {\n\n\t\t\t\t\t\t// Get the colors\n\n\t\t\t\t\t\twhile ( ( result = pat3Floats.exec( line ) ) !== null ) {\n\n\t\t\t\t\t\t\tif ( patWord.exec( line ) !== null ) break;\n\n\t\t\t\t\t\t\tconst r = parseFloat( result[ 1 ] );\n\t\t\t\t\t\t\tconst g = parseFloat( result[ 2 ] );\n\t\t\t\t\t\t\tconst b = parseFloat( result[ 3 ] );\n\n\t\t\t\t\t\t\tcolor.setRGB( r, g, b, SRGBColorSpace );\n\n\t\t\t\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( inNormalsSection ) {\n\n\t\t\t\t\t\t// Get the normal vectors\n\n\t\t\t\t\t\twhile ( ( result = pat3Floats.exec( line ) ) !== null ) {\n\n\t\t\t\t\t\t\tif ( patWord.exec( line ) !== null ) break;\n\n\t\t\t\t\t\t\tconst nx = parseFloat( result[ 1 ] );\n\t\t\t\t\t\t\tconst ny = parseFloat( result[ 2 ] );\n\t\t\t\t\t\t\tconst nz = parseFloat( result[ 3 ] );\n\t\t\t\t\t\t\tnormals.push( nx, ny, nz );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( patPOLYGONS.exec( line ) !== null ) {\n\n\t\t\t\t\tinPolygonsSection = true;\n\t\t\t\t\tinPointsSection = false;\n\t\t\t\t\tinTriangleStripSection = false;\n\n\t\t\t\t} else if ( patPOINTS.exec( line ) !== null ) {\n\n\t\t\t\t\tinPolygonsSection = false;\n\t\t\t\t\tinPointsSection = true;\n\t\t\t\t\tinTriangleStripSection = false;\n\n\t\t\t\t} else if ( patTRIANGLE_STRIPS.exec( line ) !== null ) {\n\n\t\t\t\t\tinPolygonsSection = false;\n\t\t\t\t\tinPointsSection = false;\n\t\t\t\t\tinTriangleStripSection = true;\n\n\t\t\t\t} else if ( patPOINT_DATA.exec( line ) !== null ) {\n\n\t\t\t\t\tinPointDataSection = true;\n\t\t\t\t\tinPointsSection = false;\n\t\t\t\t\tinPolygonsSection = false;\n\t\t\t\t\tinTriangleStripSection = false;\n\n\t\t\t\t} else if ( patCELL_DATA.exec( line ) !== null ) {\n\n\t\t\t\t\tinCellDataSection = true;\n\t\t\t\t\tinPointsSection = false;\n\t\t\t\t\tinPolygonsSection = false;\n\t\t\t\t\tinTriangleStripSection = false;\n\n\t\t\t\t} else if ( patCOLOR_SCALARS.exec( line ) !== null ) {\n\n\t\t\t\t\tinColorSection = true;\n\t\t\t\t\tinNormalsSection = false;\n\t\t\t\t\tinPointsSection = false;\n\t\t\t\t\tinPolygonsSection = false;\n\t\t\t\t\tinTriangleStripSection = false;\n\n\t\t\t\t} else if ( patNORMALS.exec( line ) !== null ) {\n\n\t\t\t\t\tinNormalsSection = true;\n\t\t\t\t\tinColorSection = false;\n\t\t\t\t\tinPointsSection = false;\n\t\t\t\t\tinPolygonsSection = false;\n\t\t\t\t\tinTriangleStripSection = false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlet geometry = new BufferGeometry();\n\t\t\tgeometry.setIndex( indices );\n\t\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( positions, 3 ) );\n\n\t\t\tif ( normals.length === positions.length ) {\n\n\t\t\t\tgeometry.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );\n\n\t\t\t}\n\n\t\t\tif ( colors.length !== indices.length ) {\n\n\t\t\t\t// stagger\n\n\t\t\t\tif ( colors.length === positions.length ) {\n\n\t\t\t\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// cell\n\n\t\t\t\tgeometry = geometry.toNonIndexed();\n\t\t\t\tconst numTriangles = geometry.attributes.position.count / 3;\n\n\t\t\t\tif ( colors.length === ( numTriangles * 3 ) ) {\n\n\t\t\t\t\tconst newColors = [];\n\n\t\t\t\t\tfor ( let i = 0; i < numTriangles; i ++ ) {\n\n\t\t\t\t\t\tconst r = colors[ 3 * i + 0 ];\n\t\t\t\t\t\tconst g = colors[ 3 * i + 1 ];\n\t\t\t\t\t\tconst b = colors[ 3 * i + 2 ];\n\n\t\t\t\t\t\tcolor.setRGB( r, g, b, SRGBColorSpace );\n\n\t\t\t\t\t\tnewColors.push( color.r, color.g, color.b );\n\t\t\t\t\t\tnewColors.push( color.r, color.g, color.b );\n\t\t\t\t\t\tnewColors.push( color.r, color.g, color.b );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( newColors, 3 ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction parseBinary( data ) {\n\n\t\t\tconst buffer = new Uint8Array( data );\n\t\t\tconst dataView = new DataView( data );\n\n\t\t\t// Points and normals, by default, are empty\n\t\t\tlet points = [];\n\t\t\tlet normals = [];\n\t\t\tlet indices = [];\n\n\t\t\tlet index = 0;\n\n\t\t\tfunction findString( buffer, start ) {\n\n\t\t\t\tlet index = start;\n\t\t\t\tlet c = buffer[ index ];\n\t\t\t\tconst s = [];\n\t\t\t\twhile ( c !== 10 ) {\n\n\t\t\t\t\ts.push( String.fromCharCode( c ) );\n\t\t\t\t\tindex ++;\n\t\t\t\t\tc = buffer[ index ];\n\n\t\t\t\t}\n\n\t\t\t\treturn { start: start,\n\t\t\t\t\tend: index,\n\t\t\t\t\tnext: index + 1,\n\t\t\t\t\tparsedString: s.join( '' ) };\n\n\t\t\t}\n\n\t\t\tlet state, line;\n\n\t\t\twhile ( true ) {\n\n\t\t\t\t// Get a string\n\t\t\t\tstate = findString( buffer, index );\n\t\t\t\tline = state.parsedString;\n\n\t\t\t\tif ( line.indexOf( 'DATASET' ) === 0 ) {\n\n\t\t\t\t\tconst dataset = line.split( ' ' )[ 1 ];\n\n\t\t\t\t\tif ( dataset !== 'POLYDATA' ) throw new Error( 'Unsupported DATASET type: ' + dataset );\n\n\t\t\t\t} else if ( line.indexOf( 'POINTS' ) === 0 ) {\n\n\t\t\t\t\t// Add the points\n\t\t\t\t\tconst numberOfPoints = parseInt( line.split( ' ' )[ 1 ], 10 );\n\n\t\t\t\t\t// Each point is 3 4-byte floats\n\t\t\t\t\tconst count = numberOfPoints * 4 * 3;\n\n\t\t\t\t\tpoints = new Float32Array( numberOfPoints * 3 );\n\n\t\t\t\t\tlet pointIndex = state.next;\n\t\t\t\t\tfor ( let i = 0; i < numberOfPoints; i ++ ) {\n\n\t\t\t\t\t\tpoints[ 3 * i ] = dataView.getFloat32( pointIndex, false );\n\t\t\t\t\t\tpoints[ 3 * i + 1 ] = dataView.getFloat32( pointIndex + 4, false );\n\t\t\t\t\t\tpoints[ 3 * i + 2 ] = dataView.getFloat32( pointIndex + 8, false );\n\t\t\t\t\t\tpointIndex = pointIndex + 12;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// increment our next pointer\n\t\t\t\t\tstate.next = state.next + count + 1;\n\n\t\t\t\t} else if ( line.indexOf( 'TRIANGLE_STRIPS' ) === 0 ) {\n\n\t\t\t\t\tconst numberOfStrips = parseInt( line.split( ' ' )[ 1 ], 10 );\n\t\t\t\t\tconst size = parseInt( line.split( ' ' )[ 2 ], 10 );\n\t\t\t\t\t// 4 byte integers\n\t\t\t\t\tconst count = size * 4;\n\n\t\t\t\t\tindices = new Uint32Array( 3 * size - 9 * numberOfStrips );\n\t\t\t\t\tlet indicesIndex = 0;\n\n\t\t\t\t\tlet pointIndex = state.next;\n\t\t\t\t\tfor ( let i = 0; i < numberOfStrips; i ++ ) {\n\n\t\t\t\t\t\t// For each strip, read the first value, then record that many more points\n\t\t\t\t\t\tconst indexCount = dataView.getInt32( pointIndex, false );\n\t\t\t\t\t\tconst strip = [];\n\t\t\t\t\t\tpointIndex += 4;\n\t\t\t\t\t\tfor ( let s = 0; s < indexCount; s ++ ) {\n\n\t\t\t\t\t\t\tstrip.push( dataView.getInt32( pointIndex, false ) );\n\t\t\t\t\t\t\tpointIndex += 4;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// retrieves the n-2 triangles from the triangle strip\n\t\t\t\t\t\tfor ( let j = 0; j < indexCount - 2; j ++ ) {\n\n\t\t\t\t\t\t\tif ( j % 2 ) {\n\n\t\t\t\t\t\t\t\tindices[ indicesIndex ++ ] = strip[ j ];\n\t\t\t\t\t\t\t\tindices[ indicesIndex ++ ] = strip[ j + 2 ];\n\t\t\t\t\t\t\t\tindices[ indicesIndex ++ ] = strip[ j + 1 ];\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tindices[ indicesIndex ++ ] = strip[ j ];\n\t\t\t\t\t\t\t\tindices[ indicesIndex ++ ] = strip[ j + 1 ];\n\t\t\t\t\t\t\t\tindices[ indicesIndex ++ ] = strip[ j + 2 ];\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// increment our next pointer\n\t\t\t\t\tstate.next = state.next + count + 1;\n\n\t\t\t\t} else if ( line.indexOf( 'POLYGONS' ) === 0 ) {\n\n\t\t\t\t\tconst numberOfStrips = parseInt( line.split( ' ' )[ 1 ], 10 );\n\t\t\t\t\tconst size = parseInt( line.split( ' ' )[ 2 ], 10 );\n\t\t\t\t\t// 4 byte integers\n\t\t\t\t\tconst count = size * 4;\n\n\t\t\t\t\tindices = new Uint32Array( 3 * size - 9 * numberOfStrips );\n\t\t\t\t\tlet indicesIndex = 0;\n\n\t\t\t\t\tlet pointIndex = state.next;\n\t\t\t\t\tfor ( let i = 0; i < numberOfStrips; i ++ ) {\n\n\t\t\t\t\t\t// For each strip, read the first value, then record that many more points\n\t\t\t\t\t\tconst indexCount = dataView.getInt32( pointIndex, false );\n\t\t\t\t\t\tconst strip = [];\n\t\t\t\t\t\tpointIndex += 4;\n\t\t\t\t\t\tfor ( let s = 0; s < indexCount; s ++ ) {\n\n\t\t\t\t\t\t\tstrip.push( dataView.getInt32( pointIndex, false ) );\n\t\t\t\t\t\t\tpointIndex += 4;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// divide the polygon in n-2 triangle\n\t\t\t\t\t\tfor ( let j = 1; j < indexCount - 1; j ++ ) {\n\n\t\t\t\t\t\t\tindices[ indicesIndex ++ ] = strip[ 0 ];\n\t\t\t\t\t\t\tindices[ indicesIndex ++ ] = strip[ j ];\n\t\t\t\t\t\t\tindices[ indicesIndex ++ ] = strip[ j + 1 ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// increment our next pointer\n\t\t\t\t\tstate.next = state.next + count + 1;\n\n\t\t\t\t} else if ( line.indexOf( 'POINT_DATA' ) === 0 ) {\n\n\t\t\t\t\tconst numberOfPoints = parseInt( line.split( ' ' )[ 1 ], 10 );\n\n\t\t\t\t\t// Grab the next line\n\t\t\t\t\tstate = findString( buffer, state.next );\n\n\t\t\t\t\t// Now grab the binary data\n\t\t\t\t\tconst count = numberOfPoints * 4 * 3;\n\n\t\t\t\t\tnormals = new Float32Array( numberOfPoints * 3 );\n\t\t\t\t\tlet pointIndex = state.next;\n\t\t\t\t\tfor ( let i = 0; i < numberOfPoints; i ++ ) {\n\n\t\t\t\t\t\tnormals[ 3 * i ] = dataView.getFloat32( pointIndex, false );\n\t\t\t\t\t\tnormals[ 3 * i + 1 ] = dataView.getFloat32( pointIndex + 4, false );\n\t\t\t\t\t\tnormals[ 3 * i + 2 ] = dataView.getFloat32( pointIndex + 8, false );\n\t\t\t\t\t\tpointIndex += 12;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Increment past our data\n\t\t\t\t\tstate.next = state.next + count;\n\n\t\t\t\t}\n\n\t\t\t\t// Increment index\n\t\t\t\tindex = state.next;\n\n\t\t\t\tif ( index >= buffer.byteLength ) {\n\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst geometry = new BufferGeometry();\n\t\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\t\tgeometry.setAttribute( 'position', new BufferAttribute( points, 3 ) );\n\n\t\t\tif ( normals.length === points.length ) {\n\n\t\t\t\tgeometry.setAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\n\t\t\t}\n\n\t\t\treturn geometry;\n\n\t\t}\n\n\t\tfunction Float32Concat( first, second ) {\n\n\t\t\tconst firstLength = first.length, result = new Float32Array( firstLength + second.length );\n\n\t\t\tresult.set( first );\n\t\t\tresult.set( second, firstLength );\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\tfunction Int32Concat( first, second ) {\n\n\t\t\tconst firstLength = first.length, result = new Int32Array( firstLength + second.length );\n\n\t\t\tresult.set( first );\n\t\t\tresult.set( second, firstLength );\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\tfunction parseXML( stringFile ) {\n\n\t\t\t// Changes XML to JSON, based on https://davidwalsh.name/convert-xml-json\n\n\t\t\tfunction xmlToJson( xml ) {\n\n\t\t\t\t// Create the return object\n\t\t\t\tlet obj = {};\n\n\t\t\t\tif ( xml.nodeType === 1 ) { // element\n\n\t\t\t\t\t// do attributes\n\n\t\t\t\t\tif ( xml.attributes ) {\n\n\t\t\t\t\t\tif ( xml.attributes.length > 0 ) {\n\n\t\t\t\t\t\t\tobj[ 'attributes' ] = {};\n\n\t\t\t\t\t\t\tfor ( let j = 0; j < xml.attributes.length; j ++ ) {\n\n\t\t\t\t\t\t\t\tconst attribute = xml.attributes.item( j );\n\t\t\t\t\t\t\t\tobj[ 'attributes' ][ attribute.nodeName ] = attribute.nodeValue.trim();\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( xml.nodeType === 3 ) { // text\n\n\t\t\t\t\tobj = xml.nodeValue.trim();\n\n\t\t\t\t}\n\n\t\t\t\t// do children\n\t\t\t\tif ( xml.hasChildNodes() ) {\n\n\t\t\t\t\tfor ( let i = 0; i < xml.childNodes.length; i ++ ) {\n\n\t\t\t\t\t\tconst item = xml.childNodes.item( i );\n\t\t\t\t\t\tconst nodeName = item.nodeName;\n\n\t\t\t\t\t\tif ( typeof obj[ nodeName ] === 'undefined' ) {\n\n\t\t\t\t\t\t\tconst tmp = xmlToJson( item );\n\n\t\t\t\t\t\t\tif ( tmp !== '' ) {\n\n\t\t\t\t\t\t\t\tif ( Array.isArray( tmp[ '#text' ] ) ) {\n\n\t\t\t\t\t\t\t\t\ttmp[ '#text' ] = tmp[ '#text' ][ 0 ];\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tobj[ nodeName ] = tmp;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( typeof obj[ nodeName ].push === 'undefined' ) {\n\n\t\t\t\t\t\t\t\tconst old = obj[ nodeName ];\n\t\t\t\t\t\t\t\tobj[ nodeName ] = [ old ];\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconst tmp = xmlToJson( item );\n\n\t\t\t\t\t\t\tif ( tmp !== '' ) {\n\n\t\t\t\t\t\t\t\tif ( Array.isArray( tmp[ '#text' ] ) ) {\n\n\t\t\t\t\t\t\t\t\ttmp[ '#text' ] = tmp[ '#text' ][ 0 ];\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tobj[ nodeName ].push( tmp );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\treturn obj;\n\n\t\t\t}\n\n\t\t\t// Taken from Base64-js\n\t\t\tfunction Base64toByteArray( b64 ) {\n\n\t\t\t\tconst Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array;\n\t\t\t\tconst revLookup = [];\n\t\t\t\tconst code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\n\t\t\t\tfor ( let i = 0, l = code.length; i < l; ++ i ) {\n\n\t\t\t\t\trevLookup[ code.charCodeAt( i ) ] = i;\n\n\t\t\t\t}\n\n\t\t\t\trevLookup[ '-'.charCodeAt( 0 ) ] = 62;\n\t\t\t\trevLookup[ '_'.charCodeAt( 0 ) ] = 63;\n\n\t\t\t\tconst len = b64.length;\n\n\t\t\t\tif ( len % 4 > 0 ) {\n\n\t\t\t\t\tthrow new Error( 'Invalid string. Length must be a multiple of 4' );\n\n\t\t\t\t}\n\n\t\t\t\tconst placeHolders = b64[ len - 2 ] === '=' ? 2 : b64[ len - 1 ] === '=' ? 1 : 0;\n\t\t\t\tconst arr = new Arr( len * 3 / 4 - placeHolders );\n\t\t\t\tconst l = placeHolders > 0 ? len - 4 : len;\n\n\t\t\t\tlet L = 0;\n\t\t\t\tlet i, j;\n\n\t\t\t\tfor ( i = 0, j = 0; i < l; i += 4, j += 3 ) {\n\n\t\t\t\t\tconst tmp = ( revLookup[ b64.charCodeAt( i ) ] << 18 ) | ( revLookup[ b64.charCodeAt( i + 1 ) ] << 12 ) | ( revLookup[ b64.charCodeAt( i + 2 ) ] << 6 ) | revLookup[ b64.charCodeAt( i + 3 ) ];\n\t\t\t\t\tarr[ L ++ ] = ( tmp & 0xFF0000 ) >> 16;\n\t\t\t\t\tarr[ L ++ ] = ( tmp & 0xFF00 ) >> 8;\n\t\t\t\t\tarr[ L ++ ] = tmp & 0xFF;\n\n\t\t\t\t}\n\n\t\t\t\tif ( placeHolders === 2 ) {\n\n\t\t\t\t\tconst tmp = ( revLookup[ b64.charCodeAt( i ) ] << 2 ) | ( revLookup[ b64.charCodeAt( i + 1 ) ] >> 4 );\n\t\t\t\t\tarr[ L ++ ] = tmp & 0xFF;\n\n\t\t\t\t} else if ( placeHolders === 1 ) {\n\n\t\t\t\t\tconst tmp = ( revLookup[ b64.charCodeAt( i ) ] << 10 ) | ( revLookup[ b64.charCodeAt( i + 1 ) ] << 4 ) | ( revLookup[ b64.charCodeAt( i + 2 ) ] >> 2 );\n\t\t\t\t\tarr[ L ++ ] = ( tmp >> 8 ) & 0xFF;\n\t\t\t\t\tarr[ L ++ ] = tmp & 0xFF;\n\n\t\t\t\t}\n\n\t\t\t\treturn arr;\n\n\t\t\t}\n\n\t\t\tfunction parseDataArray( ele, compressed ) {\n\n\t\t\t\tlet numBytes = 0;\n\n\t\t\t\tif ( json.attributes.header_type === 'UInt64' ) {\n\n\t\t\t\t\tnumBytes = 8;\n\n\t\t\t\t}\telse if ( json.attributes.header_type === 'UInt32' ) {\n\n\t\t\t\t\tnumBytes = 4;\n\n\t\t\t\t}\n\n\t\t\t\tlet txt, content;\n\n\t\t\t\t// Check the format\n\t\t\t\tif ( ele.attributes.format === 'binary' && compressed ) {\n\n\t\t\t\t\tif ( ele.attributes.type === 'Float32' ) {\n\n\t\t\t\t\t\ttxt = new Float32Array( );\n\n\t\t\t\t\t} else if ( ele.attributes.type === 'Int32' || ele.attributes.type === 'Int64' ) {\n\n\t\t\t\t\t\ttxt = new Int32Array( );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// VTP data with the header has the following structure:\n\t\t\t\t\t// [#blocks][#u-size][#p-size][#c-size-1][#c-size-2]...[#c-size-#blocks][DATA]\n\t\t\t\t\t//\n\t\t\t\t\t// Each token is an integer value whose type is specified by \"header_type\" at the top of the file (UInt32 if no type specified). The token meanings are:\n\t\t\t\t\t// [#blocks] = Number of blocks\n\t\t\t\t\t// [#u-size] = Block size before compression\n\t\t\t\t\t// [#p-size] = Size of last partial block (zero if it not needed)\n\t\t\t\t\t// [#c-size-i] = Size in bytes of block i after compression\n\t\t\t\t\t//\n\t\t\t\t\t// The [DATA] portion stores contiguously every block appended together. The offset from the beginning of the data section to the beginning of a block is\n\t\t\t\t\t// computed by summing the compressed block sizes from preceding blocks according to the header.\n\n\t\t\t\t\tconst textNode = ele[ '#text' ];\n\t\t\t\t\tconst rawData = Array.isArray( textNode ) ? textNode[ 0 ] : textNode;\n\n\t\t\t\t\tconst byteData = Base64toByteArray( rawData );\n\n\t\t\t\t\t// Each data point consists of 8 bits regardless of the header type\n\t\t\t\t\tconst dataPointSize = 8;\n\n\t\t\t\t\tlet blocks = byteData[ 0 ];\n\t\t\t\t\tfor ( let i = 1; i < numBytes - 1; i ++ ) {\n\n\t\t\t\t\t\tblocks = blocks | ( byteData[ i ] << ( i * dataPointSize ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet headerSize = ( blocks + 3 ) * numBytes;\n\t\t\t\t\tconst padding = ( ( headerSize % 3 ) > 0 ) ? 3 - ( headerSize % 3 ) : 0;\n\t\t\t\t\theaderSize = headerSize + padding;\n\n\t\t\t\t\tconst dataOffsets = [];\n\t\t\t\t\tlet currentOffset = headerSize;\n\t\t\t\t\tdataOffsets.push( currentOffset );\n\n\t\t\t\t\t// Get the blocks sizes after the compression.\n\t\t\t\t\t// There are three blocks before c-size-i, so we skip 3*numBytes\n\t\t\t\t\tconst cSizeStart = 3 * numBytes;\n\n\t\t\t\t\tfor ( let i = 0; i < blocks; i ++ ) {\n\n\t\t\t\t\t\tlet currentBlockSize = byteData[ i * numBytes + cSizeStart ];\n\n\t\t\t\t\t\tfor ( let j = 1; j < numBytes - 1; j ++ ) {\n\n\t\t\t\t\t\t\tcurrentBlockSize = currentBlockSize | ( byteData[ i * numBytes + cSizeStart + j ] << ( j * dataPointSize ) );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tcurrentOffset = currentOffset + currentBlockSize;\n\t\t\t\t\t\tdataOffsets.push( currentOffset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfor ( let i = 0; i < dataOffsets.length - 1; i ++ ) {\n\n\t\t\t\t\t\tconst data = fflate.unzlibSync( byteData.slice( dataOffsets[ i ], dataOffsets[ i + 1 ] ) );\n\t\t\t\t\t\tcontent = data.buffer;\n\n\t\t\t\t\t\tif ( ele.attributes.type === 'Float32' ) {\n\n\t\t\t\t\t\t\tcontent = new Float32Array( content );\n\t\t\t\t\t\t\ttxt = Float32Concat( txt, content );\n\n\t\t\t\t\t\t} else if ( ele.attributes.type === 'Int32' || ele.attributes.type === 'Int64' ) {\n\n\t\t\t\t\t\t\tcontent = new Int32Array( content );\n\t\t\t\t\t\t\ttxt = Int32Concat( txt, content );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tdelete ele[ '#text' ];\n\n\t\t\t\t\tif ( ele.attributes.type === 'Int64' ) {\n\n\t\t\t\t\t\tif ( ele.attributes.format === 'binary' ) {\n\n\t\t\t\t\t\t\ttxt = txt.filter( function ( el, idx ) {\n\n\t\t\t\t\t\t\t\tif ( idx % 2 !== 1 ) return true;\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( ele.attributes.format === 'binary' && ! compressed ) {\n\n\t\t\t\t\t\tcontent = Base64toByteArray( ele[ '#text' ] );\n\n\t\t\t\t\t\t//  VTP data for the uncompressed case has the following structure:\n\t\t\t\t\t\t// [#bytes][DATA]\n\t\t\t\t\t\t// where \"[#bytes]\" is an integer value specifying the number of bytes in the block of data following it.\n\t\t\t\t\t\tcontent = content.slice( numBytes ).buffer;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( ele[ '#text' ] ) {\n\n\t\t\t\t\t\t\tcontent = ele[ '#text' ].split( /\\s+/ ).filter( function ( el ) {\n\n\t\t\t\t\t\t\t\tif ( el !== '' ) return el;\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tcontent = new Int32Array( 0 ).buffer;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tdelete ele[ '#text' ];\n\n\t\t\t\t\t// Get the content and optimize it\n\t\t\t\t\tif ( ele.attributes.type === 'Float32' ) {\n\n\t\t\t\t\t\ttxt = new Float32Array( content );\n\n\t\t\t\t\t} else if ( ele.attributes.type === 'Int32' ) {\n\n\t\t\t\t\t\ttxt = new Int32Array( content );\n\n\t\t\t\t\t} else if ( ele.attributes.type === 'Int64' ) {\n\n\t\t\t\t\t\ttxt = new Int32Array( content );\n\n\t\t\t\t\t\tif ( ele.attributes.format === 'binary' ) {\n\n\t\t\t\t\t\t\ttxt = txt.filter( function ( el, idx ) {\n\n\t\t\t\t\t\t\t\tif ( idx % 2 !== 1 ) return true;\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} // endif ( ele.attributes.format === 'binary' && compressed )\n\n\t\t\t\treturn txt;\n\n\t\t\t}\n\n\t\t\t// Main part\n\t\t\t// Get Dom\n\t\t\tconst dom = new DOMParser().parseFromString( stringFile, 'application/xml' );\n\n\t\t\t// Get the doc\n\t\t\tconst doc = dom.documentElement;\n\t\t\t// Convert to json\n\t\t\tconst json = xmlToJson( doc );\n\t\t\tlet points = [];\n\t\t\tlet normals = [];\n\t\t\tlet indices = [];\n\n\t\t\tif ( json.AppendedData ) {\n\n\t\t\t\tconst appendedData = json.AppendedData[ '#text' ].slice( 1 );\n\t\t\t\tconst piece = json.PolyData.Piece;\n\n\t\t\t\tconst sections = [ 'PointData', 'CellData', 'Points', 'Verts', 'Lines', 'Strips', 'Polys' ];\n\t\t\t\tlet sectionIndex = 0;\n\n\t\t\t\tconst offsets = sections.map( s => {\n\n\t\t\t\t\tconst sect = piece[ s ];\n\n\t\t\t\t\tif ( sect && sect.DataArray ) {\n\n\t\t\t\t\t\tconst arr = Array.isArray( sect.DataArray ) ? sect.DataArray : [ sect.DataArray ];\n\n\t\t\t\t\t\treturn arr.map( a => a.attributes.offset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn [];\n\n\t\t\t\t} ).flat();\n\n\t\t\t\tfor ( const sect of sections ) {\n\n\t\t\t\t\tconst section = piece[ sect ];\n\n\t\t\t\t\tif ( section && section.DataArray ) {\n\n\t\t\t\t\t\tif ( Array.isArray( section.DataArray ) ) {\n\n\t\t\t\t\t\t\tfor ( const sectionEle of section.DataArray ) {\n\n\t\t\t\t\t\t\t\tsectionEle[ '#text' ] = appendedData.slice( offsets[ sectionIndex ], offsets[ sectionIndex + 1 ] );\n\t\t\t\t\t\t\t\tsectionEle.attributes.format = 'binary';\n\t\t\t\t\t\t\t\tsectionIndex ++;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tsection.DataArray[ '#text' ] = appendedData.slice( offsets[ sectionIndex ], offsets[ sectionIndex + 1 ] );\n\t\t\t\t\t\t\tsection.DataArray.attributes.format = 'binary';\n\t\t\t\t\t\t\tsectionIndex ++;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( json.PolyData ) {\n\n\t\t\t\tconst piece = json.PolyData.Piece;\n\t\t\t\tconst compressed = json.attributes.hasOwnProperty( 'compressor' );\n\n\t\t\t\t// Can be optimized\n\t\t\t\t// Loop through the sections\n\t\t\t\tconst sections = [ 'PointData', 'Points', 'Strips', 'Polys' ];// +['CellData', 'Verts', 'Lines'];\n\t\t\t\tlet sectionIndex = 0;\n\t\t\t\tconst numberOfSections = sections.length;\n\n\t\t\t\twhile ( sectionIndex < numberOfSections ) {\n\n\t\t\t\t\tconst section = piece[ sections[ sectionIndex ] ];\n\n\t\t\t\t\t// If it has a DataArray in it\n\n\t\t\t\t\tif ( section && section.DataArray ) {\n\n\t\t\t\t\t\t// Depending on the number of DataArrays\n\n\t\t\t\t\t\tlet arr;\n\n\t\t\t\t\t\tif ( Array.isArray( section.DataArray ) ) {\n\n\t\t\t\t\t\t\tarr = section.DataArray;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tarr = [ section.DataArray ];\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tlet dataArrayIndex = 0;\n\t\t\t\t\t\tconst numberOfDataArrays = arr.length;\n\n\t\t\t\t\t\twhile ( dataArrayIndex < numberOfDataArrays ) {\n\n\t\t\t\t\t\t\t// Parse the DataArray\n\t\t\t\t\t\t\tif ( ( '#text' in arr[ dataArrayIndex ] ) && ( arr[ dataArrayIndex ][ '#text' ].length > 0 ) ) {\n\n\t\t\t\t\t\t\t\tarr[ dataArrayIndex ].text = parseDataArray( arr[ dataArrayIndex ], compressed );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tdataArrayIndex ++;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tswitch ( sections[ sectionIndex ] ) {\n\n\t\t\t\t\t\t\t// if iti is point data\n\t\t\t\t\t\t\tcase 'PointData':\n\n\t\t\t\t\t\t\t\t{\n\n\t\t\t\t\t\t\t\t\tconst numberOfPoints = parseInt( piece.attributes.NumberOfPoints );\n\t\t\t\t\t\t\t\t\tconst normalsName = section.attributes.Normals;\n\n\t\t\t\t\t\t\t\t\tif ( numberOfPoints > 0 ) {\n\n\t\t\t\t\t\t\t\t\t\tfor ( let i = 0, len = arr.length; i < len; i ++ ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( normalsName === arr[ i ].attributes.Name ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\tconst components = arr[ i ].attributes.NumberOfComponents;\n\t\t\t\t\t\t\t\t\t\t\t\tnormals = new Float32Array( numberOfPoints * components );\n\t\t\t\t\t\t\t\t\t\t\t\tnormals.set( arr[ i ].text, 0 );\n\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t// if it is points\n\t\t\t\t\t\t\tcase 'Points':\n\n\t\t\t\t\t\t\t\t{\n\n\t\t\t\t\t\t\t\t\tconst numberOfPoints = parseInt( piece.attributes.NumberOfPoints );\n\n\t\t\t\t\t\t\t\t\tif ( numberOfPoints > 0 ) {\n\n\t\t\t\t\t\t\t\t\t\tconst components = section.DataArray.attributes.NumberOfComponents;\n\t\t\t\t\t\t\t\t\t\tpoints = new Float32Array( numberOfPoints * components );\n\t\t\t\t\t\t\t\t\t\tpoints.set( section.DataArray.text, 0 );\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t// if it is strips\n\t\t\t\t\t\t\tcase 'Strips':\n\n\t\t\t\t\t\t\t\t{\n\n\t\t\t\t\t\t\t\t\tconst numberOfStrips = parseInt( piece.attributes.NumberOfStrips );\n\n\t\t\t\t\t\t\t\t\tif ( numberOfStrips > 0 ) {\n\n\t\t\t\t\t\t\t\t\t\tconst connectivity = new Int32Array( section.DataArray[ 0 ].text.length );\n\t\t\t\t\t\t\t\t\t\tconst offset = new Int32Array( section.DataArray[ 1 ].text.length );\n\t\t\t\t\t\t\t\t\t\tconnectivity.set( section.DataArray[ 0 ].text, 0 );\n\t\t\t\t\t\t\t\t\t\toffset.set( section.DataArray[ 1 ].text, 0 );\n\n\t\t\t\t\t\t\t\t\t\tconst size = numberOfStrips + connectivity.length;\n\t\t\t\t\t\t\t\t\t\tindices = new Uint32Array( 3 * size - 9 * numberOfStrips );\n\n\t\t\t\t\t\t\t\t\t\tlet indicesIndex = 0;\n\n\t\t\t\t\t\t\t\t\t\tfor ( let i = 0, len = numberOfStrips; i < len; i ++ ) {\n\n\t\t\t\t\t\t\t\t\t\t\tconst strip = [];\n\n\t\t\t\t\t\t\t\t\t\t\tfor ( let s = 0, len1 = offset[ i ], len0 = 0; s < len1 - len0; s ++ ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\tstrip.push( connectivity[ s ] );\n\n\t\t\t\t\t\t\t\t\t\t\t\tif ( i > 0 ) len0 = offset[ i - 1 ];\n\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\tfor ( let j = 0, len1 = offset[ i ], len0 = 0; j < len1 - len0 - 2; j ++ ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\tif ( j % 2 ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tindices[ indicesIndex ++ ] = strip[ j ];\n\t\t\t\t\t\t\t\t\t\t\t\t\tindices[ indicesIndex ++ ] = strip[ j + 2 ];\n\t\t\t\t\t\t\t\t\t\t\t\t\tindices[ indicesIndex ++ ] = strip[ j + 1 ];\n\n\t\t\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t\t\tindices[ indicesIndex ++ ] = strip[ j ];\n\t\t\t\t\t\t\t\t\t\t\t\t\tindices[ indicesIndex ++ ] = strip[ j + 1 ];\n\t\t\t\t\t\t\t\t\t\t\t\t\tindices[ indicesIndex ++ ] = strip[ j + 2 ];\n\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tif ( i > 0 ) len0 = offset[ i - 1 ];\n\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t// if it is polys\n\t\t\t\t\t\t\tcase 'Polys':\n\n\t\t\t\t\t\t\t\t{\n\n\t\t\t\t\t\t\t\t\tconst numberOfPolys = parseInt( piece.attributes.NumberOfPolys );\n\n\t\t\t\t\t\t\t\t\tif ( numberOfPolys > 0 ) {\n\n\t\t\t\t\t\t\t\t\t\tconst connectivity = new Int32Array( section.DataArray[ 0 ].text.length );\n\t\t\t\t\t\t\t\t\t\tconst offset = new Int32Array( section.DataArray[ 1 ].text.length );\n\t\t\t\t\t\t\t\t\t\tconnectivity.set( section.DataArray[ 0 ].text, 0 );\n\t\t\t\t\t\t\t\t\t\toffset.set( section.DataArray[ 1 ].text, 0 );\n\n\t\t\t\t\t\t\t\t\t\tconst size = numberOfPolys + connectivity.length;\n\t\t\t\t\t\t\t\t\t\tindices = new Uint32Array( 3 * size - 9 * numberOfPolys );\n\t\t\t\t\t\t\t\t\t\tlet indicesIndex = 0, connectivityIndex = 0;\n\t\t\t\t\t\t\t\t\t\tlet i = 0, len0 = 0;\n\t\t\t\t\t\t\t\t\t\tconst len = numberOfPolys;\n\n\t\t\t\t\t\t\t\t\t\twhile ( i < len ) {\n\n\t\t\t\t\t\t\t\t\t\t\tconst poly = [];\n\t\t\t\t\t\t\t\t\t\t\tlet s = 0;\n\t\t\t\t\t\t\t\t\t\t\tconst len1 = offset[ i ];\n\n\t\t\t\t\t\t\t\t\t\t\twhile ( s < len1 - len0 ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\tpoly.push( connectivity[ connectivityIndex ++ ] );\n\t\t\t\t\t\t\t\t\t\t\t\ts ++;\n\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\tlet j = 1;\n\n\t\t\t\t\t\t\t\t\t\t\twhile ( j < len1 - len0 - 1 ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\tindices[ indicesIndex ++ ] = poly[ 0 ];\n\t\t\t\t\t\t\t\t\t\t\t\tindices[ indicesIndex ++ ] = poly[ j ];\n\t\t\t\t\t\t\t\t\t\t\t\tindices[ indicesIndex ++ ] = poly[ j + 1 ];\n\t\t\t\t\t\t\t\t\t\t\t\tj ++;\n\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\ti ++;\n\t\t\t\t\t\t\t\t\t\t\tlen0 = offset[ i - 1 ];\n\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tsectionIndex ++;\n\n\t\t\t\t}\n\n\t\t\t\tconst geometry = new BufferGeometry();\n\t\t\t\tgeometry.setIndex( new BufferAttribute( indices, 1 ) );\n\t\t\t\tgeometry.setAttribute( 'position', new BufferAttribute( points, 3 ) );\n\n\t\t\t\tif ( normals.length === points.length ) {\n\n\t\t\t\t\tgeometry.setAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\n\t\t\t\t}\n\n\t\t\t\treturn geometry;\n\n\t\t\t} else {\n\n\t\t\t\tthrow new Error( 'Unsupported DATASET type' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst textDecoder = new TextDecoder();\n\n\t\t// get the 5 first lines of the files to check if there is the key word binary\n\t\tconst meta = textDecoder.decode( new Uint8Array( data, 0, 250 ) ).split( '\\n' );\n\n\t\tif ( meta[ 0 ].indexOf( 'xml' ) !== - 1 ) {\n\n\t\t\treturn parseXML( textDecoder.decode( data ) );\n\n\t\t} else if ( meta[ 2 ].includes( 'ASCII' ) ) {\n\n\t\t\treturn parseASCII( textDecoder.decode( data ) );\n\n\t\t} else {\n\n\t\t\treturn parseBinary( data );\n\n\t\t}\n\n\t}\n\n}\n\nexport { VTKLoader };\n", "import {\n\tBufferGeometry,\n\tColor,\n\tFileLoader,\n\tFloat32BufferAttribute,\n\tLoader,\n\tSRGBColorSpace\n} from 'three';\n\n/**\n * A loader for the XYZ format.\n *\n * XYZ is a very simple format for storing point clouds. The layouts\n * `XYZ` (points) and `XYZRGB` (points + colors) are supported.\n *\n * ```js\n * const loader = new XYZLoader();\n * const geometry = await loader.loadAsync( 'models/xyz/helix_201.xyz' );\n * geometry.center();\n *\n * const vertexColors = ( geometry.hasAttribute( 'color' ) === true );\n * const material = new THREE.PointsMaterial( { size: 0.1, vertexColors: vertexColors } );\n *\n * const points = new THREE.Points( geometry, material );\n * scene.add( points );\n * ```\n *\n * @augments Loader\n * @three_import import { XYZLoader } from 'three/addons/loaders/XYZLoader.js';\n */\nclass XYZLoader extends Loader {\n\n\t/**\n\t * Starts loading from the given URL and passes the loaded XYZ asset\n\t * to the `onLoad()` callback.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.\n\t * @param {function(BufferGeometry)} onLoad - Executed when the loading process has been finished.\n\t * @param {onProgressCallback} onProgress - Executed while the loading is in progress.\n\t * @param {onErrorCallback} onError - Executed when errors occur.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst scope = this;\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, function ( text ) {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( scope.parse( text ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.error( e );\n\n\t\t\t\t}\n\n\t\t\t\tscope.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parses the given XYZ data and returns the resulting geometry.\n\t *\n\t * @param {string} text - The raw XYZ data as a string.\n\t * @return {BufferGeometry} The geometry representing the point cloud.\n\t */\n\tparse( text ) {\n\n\t\tconst lines = text.split( '\\n' );\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\t\tconst color = new Color();\n\n\t\tfor ( let line of lines ) {\n\n\t\t\tline = line.trim();\n\n\t\t\tif ( line.charAt( 0 ) === '#' ) continue; // skip comments\n\n\t\t\tconst lineValues = line.split( /\\s+/ );\n\n\t\t\tif ( lineValues.length === 3 ) {\n\n\t\t\t\t// XYZ\n\n\t\t\t\tvertices.push( parseFloat( lineValues[ 0 ] ) );\n\t\t\t\tvertices.push( parseFloat( lineValues[ 1 ] ) );\n\t\t\t\tvertices.push( parseFloat( lineValues[ 2 ] ) );\n\n\t\t\t}\n\n\t\t\tif ( lineValues.length === 6 ) {\n\n\t\t\t\t// XYZRGB\n\n\t\t\t\tvertices.push( parseFloat( lineValues[ 0 ] ) );\n\t\t\t\tvertices.push( parseFloat( lineValues[ 1 ] ) );\n\t\t\t\tvertices.push( parseFloat( lineValues[ 2 ] ) );\n\n\t\t\t\tconst r = parseFloat( lineValues[ 3 ] ) / 255;\n\t\t\t\tconst g = parseFloat( lineValues[ 4 ] ) / 255;\n\t\t\t\tconst b = parseFloat( lineValues[ 5 ] ) / 255;\n\n\t\t\t\tcolor.setRGB( r, g, b, SRGBColorSpace );\n\n\t\t\t\tcolors.push( color.r, color.g, color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst geometry = new BufferGeometry();\n\t\tgeometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );\n\n\t\tif ( colors.length > 0 ) {\n\n\t\t\tgeometry.setAttribute( 'color', new Float32BufferAttribute( colors, 3 ) );\n\n\t\t}\n\n\t\treturn geometry;\n\n\t}\n\n}\n\nexport { XYZLoader };\n", "/**\n * MeshGouraudMaterial\n *\n * Lambert illumination model with Gouraud (per-vertex) shading\n *\n */\n\nimport { UniformsUtils, UniformsLib, ShaderMaterial, Color, MultiplyOperation } from 'three';\n\nconst GouraudShader = {\n\n\tname: 'GouraudShader',\n\n\tuniforms: UniformsUtils.merge( [\n\t\tUniformsLib.common,\n\t\tUniformsLib.specularmap,\n\t\tUniformsLib.envmap,\n\t\tUniformsLib.aomap,\n\t\tUniformsLib.lightmap,\n\t\tUniformsLib.emissivemap,\n\t\tUniformsLib.fog,\n\t\tUniformsLib.lights,\n\t\t{\n\t\t\temissive: { value: new Color( 0x000000 ) }\n\t\t}\n\t] ),\n\n\tvertexShader: /* glsl */`\n\n\t\t#define GOURAUD\n\n\t\tvarying vec3 vLightFront;\n\t\tvarying vec3 vIndirectFront;\n\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvarying vec3 vLightBack;\n\t\t\tvarying vec3 vIndirectBack;\n\t\t#endif\n\n\t\t#include <common>\n\t\t#include <uv_pars_vertex>\n\t\t#include <envmap_pars_vertex>\n\t\t#include <bsdfs>\n\t\t#include <lights_pars_begin>\n\t\t#include <color_pars_vertex>\n\t\t#include <fog_pars_vertex>\n\t\t#include <morphtarget_pars_vertex>\n\t\t#include <skinning_pars_vertex>\n\t\t#include <shadowmap_pars_vertex>\n\t\t#include <logdepthbuf_pars_vertex>\n\t\t#include <clipping_planes_pars_vertex>\n\n\t\tvoid main() {\n\n\t\t\t#include <uv_vertex>\n\t\t\t#include <color_vertex>\n\t\t\t#include <morphcolor_vertex>\n\n\t\t\t#include <beginnormal_vertex>\n\t\t\t#include <morphnormal_vertex>\n\t\t\t#include <skinbase_vertex>\n\t\t\t#include <skinnormal_vertex>\n\t\t\t#include <defaultnormal_vertex>\n\n\t\t\t#include <begin_vertex>\n\t\t\t#include <morphtarget_vertex>\n\t\t\t#include <skinning_vertex>\n\t\t\t#include <project_vertex>\n\t\t\t#include <logdepthbuf_vertex>\n\t\t\t#include <clipping_planes_vertex>\n\n\t\t\t#include <worldpos_vertex>\n\t\t\t#include <envmap_vertex>\n\n\t\t\t// inlining legacy <lights_lambert_vertex>\n\n\t\t\tvec3 diffuse = vec3( 1.0 );\n\n\t\t\tvec3 geometryPosition = mvPosition.xyz;\n\t\t\tvec3 geometryNormal = normalize( transformedNormal );\n\t\t\tvec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( -mvPosition.xyz );\n\n\t\t\tvec3 backGeometryNormal = - geometryNormal;\n\n\t\t\tvLightFront = vec3( 0.0 );\n\t\t\tvIndirectFront = vec3( 0.0 );\n\t\t\t#ifdef DOUBLE_SIDED\n\t\t\t\tvLightBack = vec3( 0.0 );\n\t\t\t\tvIndirectBack = vec3( 0.0 );\n\t\t\t#endif\n\n\t\t\tIncidentLight directLight;\n\t\t\tfloat dotNL;\n\t\t\tvec3 directLightColor_Diffuse;\n\n\t\t\tvIndirectFront += getAmbientLightIrradiance( ambientLightColor );\n\n\t\t\t#if defined( USE_LIGHT_PROBES )\n\n\t\t\t\tvIndirectFront += getLightProbeIrradiance( lightProbe, geometryNormal );\n\n\t\t\t#endif\n\n\t\t\t#ifdef DOUBLE_SIDED\n\n\t\t\t\tvIndirectBack += getAmbientLightIrradiance( ambientLightColor );\n\n\t\t\t\t#if defined( USE_LIGHT_PROBES )\n\n\t\t\t\t\tvIndirectBack += getLightProbeIrradiance( lightProbe, backGeometryNormal );\n\n\t\t\t\t#endif\n\n\t\t\t#endif\n\n\t\t\t#if NUM_POINT_LIGHTS > 0\n\n\t\t\t\t#pragma unroll_loop_start\n\t\t\t\tfor ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n\n\t\t\t\t\tgetPointLightInfo( pointLights[ i ], geometryPosition, directLight );\n\n\t\t\t\t\tdotNL = dot( geometryNormal, directLight.direction );\n\t\t\t\t\tdirectLightColor_Diffuse = directLight.color;\n\n\t\t\t\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\n\t\t\t\t\t#ifdef DOUBLE_SIDED\n\n\t\t\t\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t}\n\t\t\t\t#pragma unroll_loop_end\n\n\t\t\t#endif\n\n\t\t\t#if NUM_SPOT_LIGHTS > 0\n\n\t\t\t\t#pragma unroll_loop_start\n\t\t\t\tfor ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n\n\t\t\t\t\tgetSpotLightInfo( spotLights[ i ], geometryPosition, directLight );\n\n\t\t\t\t\tdotNL = dot( geometryNormal, directLight.direction );\n\t\t\t\t\tdirectLightColor_Diffuse = directLight.color;\n\n\t\t\t\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\n\t\t\t\t\t#ifdef DOUBLE_SIDED\n\n\t\t\t\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\n\t\t\t\t\t#endif\n\t\t\t\t}\n\t\t\t\t#pragma unroll_loop_end\n\n\t\t\t#endif\n\n\t\t\t#if NUM_DIR_LIGHTS > 0\n\n\t\t\t\t#pragma unroll_loop_start\n\t\t\t\tfor ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\n\t\t\t\t\tgetDirectionalLightInfo( directionalLights[ i ], directLight );\n\n\t\t\t\t\tdotNL = dot( geometryNormal, directLight.direction );\n\t\t\t\t\tdirectLightColor_Diffuse = directLight.color;\n\n\t\t\t\t\tvLightFront += saturate( dotNL ) * directLightColor_Diffuse;\n\n\t\t\t\t\t#ifdef DOUBLE_SIDED\n\n\t\t\t\t\t\tvLightBack += saturate( - dotNL ) * directLightColor_Diffuse;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t}\n\t\t\t\t#pragma unroll_loop_end\n\n\t\t\t#endif\n\n\t\t\t#if NUM_HEMI_LIGHTS > 0\n\n\t\t\t\t#pragma unroll_loop_start\n\t\t\t\tfor ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n\n\t\t\t\t\tvIndirectFront += getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\n\n\t\t\t\t\t#ifdef DOUBLE_SIDED\n\n\t\t\t\t\t\tvIndirectBack += getHemisphereLightIrradiance( hemisphereLights[ i ], backGeometryNormal );\n\n\t\t\t\t\t#endif\n\n\t\t\t\t}\n\t\t\t\t#pragma unroll_loop_end\n\n\t\t\t#endif\n\n\t\t\t#include <shadowmap_vertex>\n\t\t\t#include <fog_vertex>\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\t#define GOURAUD\n\n\t\tuniform vec3 diffuse;\n\t\tuniform vec3 emissive;\n\t\tuniform float opacity;\n\n\t\tvarying vec3 vLightFront;\n\t\tvarying vec3 vIndirectFront;\n\n\t\t#ifdef DOUBLE_SIDED\n\t\t\tvarying vec3 vLightBack;\n\t\t\tvarying vec3 vIndirectBack;\n\t\t#endif\n\n\t\t#include <common>\n\t\t#include <dithering_pars_fragment>\n\t\t#include <color_pars_fragment>\n\t\t#include <uv_pars_fragment>\n\t\t#include <map_pars_fragment>\n\t\t#include <alphamap_pars_fragment>\n\t\t#include <alphatest_pars_fragment>\n\t\t#include <aomap_pars_fragment>\n\t\t#include <lightmap_pars_fragment>\n\t\t#include <emissivemap_pars_fragment>\n\t\t#include <envmap_common_pars_fragment>\n\t\t#include <envmap_pars_fragment>\n\t\t#include <bsdfs>\n\t\t#include <lights_pars_begin>\n\t\t#include <fog_pars_fragment>\n\t\t#include <shadowmap_pars_fragment>\n\t\t#include <shadowmask_pars_fragment>\n\t\t#include <specularmap_pars_fragment>\n\t\t#include <logdepthbuf_pars_fragment>\n\t\t#include <clipping_planes_pars_fragment>\n\n\t\tvoid main() {\n\n\t\t\t#include <clipping_planes_fragment>\n\n\t\t\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t\t\tReflectedLight reflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ), vec3( 0.0 ) );\n\t\t\tvec3 totalEmissiveRadiance = emissive;\n\n\t\t\t#include <logdepthbuf_fragment>\n\t\t\t#include <map_fragment>\n\t\t\t#include <color_fragment>\n\t\t\t#include <alphamap_fragment>\n\t\t\t#include <alphatest_fragment>\n\t\t\t#include <specularmap_fragment>\n\t\t\t#include <emissivemap_fragment>\n\n\t\t\t// accumulation\n\n\t\t\t#ifdef DOUBLE_SIDED\n\n\t\t\t\treflectedLight.indirectDiffuse += ( gl_FrontFacing ) ? vIndirectFront : vIndirectBack;\n\n\t\t\t#else\n\n\t\t\t\treflectedLight.indirectDiffuse += vIndirectFront;\n\n\t\t\t#endif\n\n\t\t\t#ifdef USE_LIGHTMAP\n\n\t\t\t\tvec4 lightMapTexel = texture2D( lightMap, vLightMapUv );\n\t\t\t\tvec3 lightMapIrradiance = lightMapTexel.rgb * lightMapIntensity;\n\t\t\t\treflectedLight.indirectDiffuse += lightMapIrradiance;\n\n\t\t\t#endif\n\n\t\t\treflectedLight.indirectDiffuse *= BRDF_Lambert( diffuseColor.rgb );\n\n\t\t\t#ifdef DOUBLE_SIDED\n\n\t\t\t\treflectedLight.directDiffuse = ( gl_FrontFacing ) ? vLightFront : vLightBack;\n\n\t\t\t#else\n\n\t\t\t\treflectedLight.directDiffuse = vLightFront;\n\n\t\t\t#endif\n\n\t\t\treflectedLight.directDiffuse *= BRDF_Lambert( diffuseColor.rgb ) * getShadowMask();\n\n\t\t\t// modulation\n\n\t\t\t#include <aomap_fragment>\n\n\t\t\tvec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;\n\n\t\t\t#include <envmap_fragment>\n\n\t\t\t#include <opaque_fragment>\n\t\t\t#include <tonemapping_fragment>\n\t\t\t#include <colorspace_fragment>\n\t\t\t#include <fog_fragment>\n\t\t\t#include <premultiplied_alpha_fragment>\n\t\t\t#include <dithering_fragment>\n\n\t\t}`\n\n};\n\n//\n\nclass MeshGouraudMaterial extends ShaderMaterial {\n\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\tconsole.warn( 'THREE.MeshGouraudMaterial: MeshGouraudMaterial has been deprecated and will be removed with r183. Use THREE.MeshLambertMaterial instead.' ); // @deprecated r173\n\n\t\tthis.isMeshGouraudMaterial = true;\n\n\t\tthis.type = 'MeshGouraudMaterial';\n\n\t\t//this.color = new THREE.Color( 0xffffff ); // diffuse\n\n\t\t//this.map = null;\n\n\t\t//this.lightMap = null;\n\t\t//this.lightMapIntensity = 1.0;\n\n\t\t//this.aoMap = null;\n\t\t//this.aoMapIntensity = 1.0;\n\n\t\t//this.emissive = new THREE.Color( 0x000000 );\n\t\t//this.emissiveIntensity = 1.0;\n\t\t//this.emissiveMap = null;\n\n\t\t//this.specularMap = null;\n\n\t\t//this.alphaMap = null;\n\n\t\t//this.envMap = null;\n\t\tthis.combine = MultiplyOperation; // combine has no uniform\n\t\t//this.reflectivity = 1;\n\t\t//this.refractionRatio = 0.98;\n\n\t\tthis.fog = false; // set to use scene fog\n\t\tthis.lights = true; // set to use scene lights\n\t\tthis.clipping = false; // set to use user-defined clipping planes\n\n\t\tconst shader = GouraudShader;\n\n\t\tthis.defines = Object.assign( {}, shader.defines );\n\t\tthis.uniforms = UniformsUtils.clone( shader.uniforms );\n\t\tthis.vertexShader = shader.vertexShader;\n\t\tthis.fragmentShader = shader.fragmentShader;\n\n\t\tconst exposePropertyNames = [\n\t\t\t'map', 'lightMap', 'lightMapIntensity', 'aoMap', 'aoMapIntensity',\n\t\t\t'emissive', 'emissiveIntensity', 'emissiveMap', 'specularMap', 'alphaMap',\n\t\t\t'envMap', 'reflectivity', 'refractionRatio', 'opacity', 'diffuse'\n\t\t];\n\n\t\tfor ( const propertyName of exposePropertyNames ) {\n\n\t\t\tObject.defineProperty( this, propertyName, {\n\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms[ propertyName ].value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms[ propertyName ].value = value;\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t}\n\n\t\tObject.defineProperty( this, 'color', Object.getOwnPropertyDescriptor( this, 'diffuse' ) );\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis.color.copy( source.color );\n\n\t\tthis.map = source.map;\n\n\t\tthis.lightMap = source.lightMap;\n\t\tthis.lightMapIntensity = source.lightMapIntensity;\n\n\t\tthis.aoMap = source.aoMap;\n\t\tthis.aoMapIntensity = source.aoMapIntensity;\n\n\t\tthis.emissive.copy( source.emissive );\n\t\tthis.emissiveMap = source.emissiveMap;\n\t\tthis.emissiveIntensity = source.emissiveIntensity;\n\n\t\tthis.specularMap = source.specularMap;\n\n\t\tthis.alphaMap = source.alphaMap;\n\n\t\tthis.envMap = source.envMap;\n\t\tthis.combine = source.combine;\n\t\tthis.reflectivity = source.reflectivity;\n\t\tthis.refractionRatio = source.refractionRatio;\n\n\t\tthis.wireframe = source.wireframe;\n\t\tthis.wireframeLinewidth = source.wireframeLinewidth;\n\t\tthis.wireframeLinecap = source.wireframeLinecap;\n\t\tthis.wireframeLinejoin = source.wireframeLinejoin;\n\n\t\tthis.fog = source.fog;\n\n\t\treturn this;\n\n\t}\n\n}\n\nexport { MeshGouraudMaterial };\n", "import {\n\tColor,\n\tShaderMaterial,\n\tUniformsLib,\n\tUniformsUtils,\n} from 'three';\n\n/**\n * A special line material for meshes loaded via {@link LDrawLoader}.\n *\n * This module can only be used with {@link WebGLRenderer}. When using {@link WebGPURenderer},\n * import the class from `LDrawConditionalLineNodeMaterial.js`.\n *\n * @augments ShaderMaterial\n * @three_import import { LDrawConditionalLineMaterial } from 'three/addons/materials/LDrawConditionalLineMaterial.js';\n */\nclass LDrawConditionalLineMaterial extends ShaderMaterial {\n\n\tstatic get type() {\n\n\t\treturn 'LDrawConditionalLineMaterial';\n\n\t}\n\n\t/**\n\t * Constructs a new conditional line material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper( {\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib.fog,\n\t\t\t\t{\n\t\t\t\t\tdiffuse: {\n\t\t\t\t\t\tvalue: new Color()\n\t\t\t\t\t},\n\t\t\t\t\topacity: {\n\t\t\t\t\t\tvalue: 1.0\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: /* glsl */`\n\t\t\t\tattribute vec3 control0;\n\t\t\t\tattribute vec3 control1;\n\t\t\t\tattribute vec3 direction;\n\t\t\t\tvarying float discardFlag;\n\n\t\t\t\t#include <common>\n\t\t\t\t#include <color_pars_vertex>\n\t\t\t\t#include <fog_pars_vertex>\n\t\t\t\t#include <logdepthbuf_pars_vertex>\n\t\t\t\t#include <clipping_planes_pars_vertex>\n\t\t\t\tvoid main() {\n\t\t\t\t\t#include <color_vertex>\n\n\t\t\t\t\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t\tgl_Position = projectionMatrix * mvPosition;\n\n\t\t\t\t\t// Transform the line segment ends and control points into camera clip space\n\t\t\t\t\tvec4 c0 = projectionMatrix * modelViewMatrix * vec4( control0, 1.0 );\n\t\t\t\t\tvec4 c1 = projectionMatrix * modelViewMatrix * vec4( control1, 1.0 );\n\t\t\t\t\tvec4 p0 = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t\tvec4 p1 = projectionMatrix * modelViewMatrix * vec4( position + direction, 1.0 );\n\n\t\t\t\t\tc0.xy /= c0.w;\n\t\t\t\t\tc1.xy /= c1.w;\n\t\t\t\t\tp0.xy /= p0.w;\n\t\t\t\t\tp1.xy /= p1.w;\n\n\t\t\t\t\t// Get the direction of the segment and an orthogonal vector\n\t\t\t\t\tvec2 dir = p1.xy - p0.xy;\n\t\t\t\t\tvec2 norm = vec2( -dir.y, dir.x );\n\n\t\t\t\t\t// Get control point directions from the line\n\t\t\t\t\tvec2 c0dir = c0.xy - p1.xy;\n\t\t\t\t\tvec2 c1dir = c1.xy - p1.xy;\n\n\t\t\t\t\t// If the vectors to the controls points are pointed in different directions away\n\t\t\t\t\t// from the line segment then the line should not be drawn.\n\t\t\t\t\tfloat d0 = dot( normalize( norm ), normalize( c0dir ) );\n\t\t\t\t\tfloat d1 = dot( normalize( norm ), normalize( c1dir ) );\n\t\t\t\t\tdiscardFlag = float( sign( d0 ) != sign( d1 ) );\n\n\t\t\t\t\t#include <logdepthbuf_vertex>\n\t\t\t\t\t#include <clipping_planes_vertex>\n\t\t\t\t\t#include <fog_vertex>\n\t\t\t\t}\n\t\t\t`,\n\n\t\t\tfragmentShader: /* glsl */`\n\t\t\tuniform vec3 diffuse;\n\t\t\tuniform float opacity;\n\t\t\tvarying float discardFlag;\n\n\t\t\t#include <common>\n\t\t\t#include <color_pars_fragment>\n\t\t\t#include <fog_pars_fragment>\n\t\t\t#include <logdepthbuf_pars_fragment>\n\t\t\t#include <clipping_planes_pars_fragment>\n\t\t\tvoid main() {\n\n\t\t\t\tif ( discardFlag > 0.5 ) discard;\n\n\t\t\t\t#include <clipping_planes_fragment>\n\t\t\t\tvec3 outgoingLight = vec3( 0.0 );\n\t\t\t\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t\t\t\t#include <logdepthbuf_fragment>\n\t\t\t\t#include <color_fragment>\n\t\t\t\toutgoingLight = diffuseColor.rgb; // simple shader\n\t\t\t\tgl_FragColor = vec4( outgoingLight, diffuseColor.a );\n\t\t\t\t#include <tonemapping_fragment>\n\t\t\t\t#include <colorspace_fragment>\n\t\t\t\t#include <fog_fragment>\n\t\t\t\t#include <premultiplied_alpha_fragment>\n\t\t\t}\n\t\t\t`,\n\n\t\t} );\n\n\t\tObject.defineProperties( this, {\n\n\t\t\t/**\n\t\t\t * The material's opacity.\n\t\t\t *\n\t\t\t * @name LDrawConditionalLineMaterial#opacity\n\t\t\t * @type {number}\n\t\t\t * @default 1\n\t\t\t */\n\t\t\topacity: {\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.opacity.value;\n\n\t\t\t\t},\n\n\t\t\t\tset: function ( value ) {\n\n\t\t\t\t\tthis.uniforms.opacity.value = value;\n\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t/**\n\t\t\t * The material's color.\n\t\t\t *\n\t\t\t * @name LDrawConditionalLineMaterial#color\n\t\t\t * @type {Color}\n\t\t\t * @default (1,1,1)\n\t\t\t */\n\t\t\tcolor: {\n\t\t\t\tget: function () {\n\n\t\t\t\t\treturn this.uniforms.diffuse.value;\n\n\t\t\t\t}\n\t\t\t}\n\n\t\t} );\n\n\t\tthis.setValues( parameters );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLDrawConditionalLineMaterial = true;\n\n\t}\n\n}\n\nexport { LDrawConditionalLineMaterial };\n", "import { MeshPhysicalMaterial } from 'three';\n\n/**\n * The aim of this mesh material is to use information from a post processing pass in the diffuse color pass.\n * This material is based on the MeshPhysicalMaterial.\n *\n * In the current state, only the information of a screen space AO pass can be used in the material.\n * Actually, the output of any screen space AO (SSAO, GTAO) can be used,\n * as it is only necessary to provide the AO in one color channel of a texture,\n * however the AO pass must be rendered prior to the color pass,\n * which makes the post-processing pass somewhat of a pre-processing pass.\n * Fot this purpose a new map (`aoPassMap`) is added to the material.\n * The value of the map is used the same way as the `aoMap` value.\n *\n * Motivation to use the outputs AO pass directly in the material:\n * The incident light of a fragment is composed of ambient light, direct light and indirect light\n * Ambient Occlusion only occludes ambient light and environment light, but not direct light.\n * Direct light is only occluded by geometry that casts shadows.\n * And of course the emitted light should not be darkened by ambient occlusion either.\n * This cannot be achieved if the AO post processing pass is simply blended with the diffuse render pass.\n *\n * Further extension work might be to use the output of an SSR pass or an HBIL pass from a previous frame.\n * This would then create the possibility of SSR and IR depending on material properties such as `roughness`, `metalness` and `reflectivity`.\n *\n * @augments MeshPhysicalMaterial\n * @three_import import { MeshPostProcessingMaterial } from 'three/addons/materials/MeshPostProcessingMaterial.js';\n */\nclass MeshPostProcessingMaterial extends MeshPhysicalMaterial {\n\n\t/**\n\t * Constructs a new conditional line material.\n\t *\n\t * @param {Object} [parameters] - An object with one or more properties\n\t * defining the material's appearance. Any property of the material\n\t * (including any property from inherited materials) can be passed\n\t * in here. Color values can be passed any type of value accepted\n\t * by {@link Color#set}.\n\t */\n\tconstructor( parameters ) {\n\n\t\tconst aoPassMap = parameters.aoPassMap;\n\t\tconst aoPassMapScale = parameters.aoPassMapScale || 1.0;\n\t\tdelete parameters.aoPassMap;\n\t\tdelete parameters.aoPassMapScale;\n\n\t\tsuper( parameters );\n\n\t\tthis.onBeforeCompile = this._onBeforeCompile;\n\t\tthis.customProgramCacheKey = this._customProgramCacheKey;\n\t\tthis._aoPassMap = aoPassMap;\n\n\t\t/**\n\t\t * The scale of the AO pass.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.aoPassMapScale = aoPassMapScale;\n\t\tthis._shader = null;\n\n\t}\n\n\t/**\n\t * A texture representing the AO pass.\n\t *\n\t * @type {Texture}\n\t */\n\tget aoPassMap() {\n\n\t\treturn this._aoPassMap;\n\n\t}\n\n\tset aoPassMap( aoPassMap ) {\n\n\t\tthis._aoPassMap = aoPassMap;\n\t\tthis.needsUpdate = true;\n\t\tthis._setUniforms();\n\n\t}\n\n\t_customProgramCacheKey() {\n\n\t\treturn this._aoPassMap !== undefined && this._aoPassMap !== null ? 'aoPassMap' : '';\n\n\t}\n\n\t_onBeforeCompile( shader ) {\n\n\t\tthis._shader = shader;\n\n\t\tif ( this._aoPassMap !== undefined && this._aoPassMap !== null ) {\n\n\t\t\tshader.fragmentShader = shader.fragmentShader.replace(\n\t\t\t\t'#include <aomap_pars_fragment>',\n\t\t\t\taomap_pars_fragment_replacement\n\t\t\t);\n\t\t\tshader.fragmentShader = shader.fragmentShader.replace(\n\t\t\t\t'#include <aomap_fragment>',\n\t\t\t\taomap_fragment_replacement\n\t\t\t);\n\n\t\t}\n\n\t\tthis._setUniforms();\n\n\t}\n\n\t_setUniforms() {\n\n\t\tif ( this._shader ) {\n\n\t\t\tthis._shader.uniforms.tAoPassMap = { value: this._aoPassMap };\n\t\t\tthis._shader.uniforms.aoPassMapScale = { value: this.aoPassMapScale };\n\n\t\t}\n\n\t}\n\n}\n\nconst aomap_pars_fragment_replacement = /* glsl */`\n#ifdef USE_AOMAP\n\n\tuniform sampler2D aoMap;\n\tuniform float aoMapIntensity;\n\n#endif\n\n\tuniform sampler2D tAoPassMap;\n\tuniform float aoPassMapScale;\n`;\n\nconst aomap_fragment_replacement = /* glsl */`\n#ifndef AOPASSMAP_SWIZZLE\n\t#define AOPASSMAP_SWIZZLE r\n#endif\n\tfloat ambientOcclusion = texelFetch( tAoPassMap, ivec2( gl_FragCoord.xy * aoPassMapScale ), 0 ).AOPASSMAP_SWIZZLE;\n\n#ifdef USE_AOMAP\n\n\t// reads channel R, compatible with a combined OcclusionRoughnessMetallic (RGB) texture\n\tambientOcclusion = min( ambientOcclusion, texture2D( aoMap, vAoMapUv ).r );\n\tambientOcclusion *= ( ambientOcclusion - 1.0 ) * aoMapIntensity + 1.0;\n\n#endif\n\n\treflectedLight.indirectDiffuse *= ambientOcclusion;\n\n\t#if defined( USE_CLEARCOAT ) \n\t\tclearcoatSpecularIndirect *= ambientOcclusion;\n\t#endif\n\n\t#if defined( USE_SHEEN ) \n\t\tsheenSpecularIndirect *= ambientOcclusion;\n\t#endif\n\n\t#if defined( USE_ENVMAP ) && defined( STANDARD )\n\n\t\tfloat dotNV = saturate( dot( geometryNormal, geometryViewDir ) );\n\n\t\treflectedLight.indirectSpecular *= computeSpecularOcclusion( dotNV, ambientOcclusion, material.roughness );\n\n\t#endif\n`;\n\nexport { MeshPostProcessingMaterial };\n", "import {\n\tVector3\n} from 'three';\n\n/**\n * A capsule is essentially a cylinder with hemispherical caps at both ends.\n * It can be thought of as a swept sphere, where a sphere is moved along a line segment.\n *\n * Capsules are often used as bounding volumes (next to AABBs and bounding spheres).\n *\n * @three_import import { Capsule } from 'three/addons/math/Capsule.js';\n */\nclass Capsule {\n\n\t/**\n\t * Constructs a new capsule.\n\t *\n\t * @param {Vector3} [start] - The start vector.\n\t * @param {Vector3} [end] - The end vector.\n\t * @param {number} [radius=1] - The capsule's radius.\n\t */\n\tconstructor( start = new Vector3( 0, 0, 0 ), end = new Vector3( 0, 1, 0 ), radius = 1 ) {\n\n\t\t/**\n\t\t * The start vector.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.start = start;\n\n\t\t/**\n\t\t * The end vector.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.end = end;\n\n\t\t/**\n\t\t * The capsule's radius.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.radius = radius;\n\n\t}\n\n\t/**\n\t * Returns a new capsule with copied values from this instance.\n\t *\n\t * @return {Capsule} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Sets the capsule components to the given values.\n\t * Please note that this method only copies the values from the given objects.\n\t *\n\t * @param {Vector3} start - The start vector.\n\t * @param {Vector3} end - The end vector\n\t * @param {number} radius - The capsule's radius.\n\t * @return {Capsule} A reference to this capsule.\n\t */\n\tset( start, end, radius ) {\n\n\t\tthis.start.copy( start );\n\t\tthis.end.copy( end );\n\t\tthis.radius = radius;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given capsule to this instance.\n\t *\n\t * @param {Capsule} capsule - The capsule to copy.\n\t * @return {Capsule} A reference to this capsule.\n\t */\n\tcopy( capsule ) {\n\n\t\tthis.start.copy( capsule.start );\n\t\tthis.end.copy( capsule.end );\n\t\tthis.radius = capsule.radius;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the center point of this capsule.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The center point.\n\t */\n\tgetCenter( target ) {\n\n\t\treturn target.copy( this.end ).add( this.start ).multiplyScalar( 0.5 );\n\n\t}\n\n\t/**\n\t * Adds the given offset to this capsule, effectively moving it in 3D space.\n\t *\n\t * @param {Vector3} v - The offset that should be used to translate the capsule.\n\t * @return {Capsule} A reference to this capsule.\n\t */\n\ttranslate( v ) {\n\n\t\tthis.start.add( v );\n\t\tthis.end.add( v );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding box intersects with this capsule.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {boolean} Whether the given bounding box intersects with this capsule.\n\t */\n\tintersectsBox( box ) {\n\n\t\treturn (\n\t\t\tcheckAABBAxis(\n\t\t\t\tthis.start.x, this.start.y, this.end.x, this.end.y,\n\t\t\t\tbox.min.x, box.max.x, box.min.y, box.max.y,\n\t\t\t\tthis.radius ) &&\n\t\t\tcheckAABBAxis(\n\t\t\t\tthis.start.x, this.start.z, this.end.x, this.end.z,\n\t\t\t\tbox.min.x, box.max.x, box.min.z, box.max.z,\n\t\t\t\tthis.radius ) &&\n\t\t\tcheckAABBAxis(\n\t\t\t\tthis.start.y, this.start.z, this.end.y, this.end.z,\n\t\t\t\tbox.min.y, box.max.y, box.min.z, box.max.z,\n\t\t\t\tthis.radius )\n\t\t);\n\n\t}\n\n}\n\nfunction checkAABBAxis( p1x, p1y, p2x, p2y, minx, maxx, miny, maxy, radius ) {\n\n\treturn (\n\t\t( minx - p1x < radius || minx - p2x < radius ) &&\n\t\t( p1x - maxx < radius || p2x - maxx < radius ) &&\n\t\t( miny - p1y < radius || miny - p2y < radius ) &&\n\t\t( p1y - maxy < radius || p2y - maxy < radius )\n\t);\n\n}\n\nexport { Capsule };\n", "import { MathUtils } from 'three';\n\nconst _hsl = {};\n\n/**\n * A utility class with helper functions for color conversion.\n *\n * @hideconstructor\n * @three_import import { ColorConverter } from 'three/addons/math/ColorConverter.js';\n */\nclass ColorConverter {\n\n\t/**\n\t * Sets the given HSV color definition to the given color object.\n\t *\n\t * @param {Color} color - The color to set.\n\t * @param {number} h - The hue.\n\t * @param {number} s - The saturation.\n\t * @param {number} v - The value.\n\t * @return {Color} The update color.\n\t */\n\tstatic setHSV( color, h, s, v ) {\n\n\t\t// https://gist.github.com/xpansive/1337890#file-index-js\n\n\t\th = MathUtils.euclideanModulo( h, 1 );\n\t\ts = MathUtils.clamp( s, 0, 1 );\n\t\tv = MathUtils.clamp( v, 0, 1 );\n\n\t\treturn color.setHSL( h, ( s * v ) / ( ( h = ( 2 - s ) * v ) < 1 ? h : ( 2 - h ) ), h * 0.5 );\n\n\t}\n\n\t/**\n\t * Returns a HSV color representation of the given color object.\n\t *\n\t * @param {Color} color - The color to get HSV values from.\n\t * @param {{h:number,s:number,v:number}} target - The target object that is used to store the method's result.\n\t * @return {{h:number,s:number,v:number}} The HSV color.\n\t */\n\tstatic getHSV( color, target ) {\n\n\t\tcolor.getHSL( _hsl );\n\n\t\t// based on https://gist.github.com/xpansive/1337890#file-index-js\n\t\t_hsl.s *= ( _hsl.l < 0.5 ) ? _hsl.l : ( 1 - _hsl.l );\n\n\t\ttarget.h = _hsl.h;\n\t\ttarget.s = 2 * _hsl.s / ( _hsl.l + _hsl.s );\n\t\ttarget.v = _hsl.l + _hsl.s;\n\n\t\treturn target;\n\n\t}\n\n}\n\nexport { ColorConverter };\n", "import { MathUtils } from 'three';\n\nconst { lerp } = MathUtils;\n\nconst _p = [ 151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8, 99, 37, 240, 21, 10,\n\t 23, 190, 6, 148, 247, 120, 234, 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88, 237, 149, 56, 87,\n\t 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134, 139, 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60, 211,\n\t 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54, 65, 25, 63, 161, 1, 216, 80, 73, 209, 76, 132, 187, 208,\n\t 89, 18, 169, 200, 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217, 226, 250, 124, 123, 5,\n\t 202, 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42, 223, 183, 170, 213, 119,\n\t 248, 152, 2, 44, 154, 163, 70, 221, 153, 101, 155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232,\n\t 178, 185, 112, 104, 218, 246, 97, 228, 251, 34, 242, 193, 238, 210, 144, 12, 191, 179, 162, 241, 81, 51, 145, 235, 249,\n\t 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150, 254, 138, 236, 205,\n\t 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180 ];\n\nfor ( let i = 0; i < 256; i ++ ) {\n\n\t_p[ 256 + i ] = _p[ i ];\n\n}\n\nfunction fade( t ) {\n\n\treturn t * t * t * ( t * ( t * 6 - 15 ) + 10 );\n\n}\n\nfunction grad( hash, x, y, z ) {\n\n\tconst h = hash & 15;\n\tconst u = h < 8 ? x : y, v = h < 4 ? y : h == 12 || h == 14 ? x : z;\n\treturn ( ( h & 1 ) == 0 ? u : - u ) + ( ( h & 2 ) == 0 ? v : - v );\n\n}\n\n/**\n * A utility class providing a 3D noise function.\n *\n * The code is based on [IMPROVED NOISE](https://cs.nyu.edu/~perlin/noise/)\n * by Ken Perlin, 2002.\n *\n * @three_import import { ImprovedNoise } from 'three/addons/math/ImprovedNoise.js';\n */\nclass ImprovedNoise {\n\n\t/**\n\t * Returns a noise value for the given parameters.\n\t *\n\t * @param {number} x - The x coordinate.\n\t * @param {number} y - The y coordinate.\n\t * @param {number} z - The z coordinate.\n\t * @return {number} The noise value.\n\t */\n\tnoise( x, y, z ) {\n\n\t\tconst floorX = Math.floor( x ), floorY = Math.floor( y ), floorZ = Math.floor( z );\n\n\t\tconst X = floorX & 255, Y = floorY & 255, Z = floorZ & 255;\n\n\t\tx -= floorX;\n\t\ty -= floorY;\n\t\tz -= floorZ;\n\n\t\tconst xMinus1 = x - 1, yMinus1 = y - 1, zMinus1 = z - 1;\n\n\t\tconst u = fade( x ), v = fade( y ), w = fade( z );\n\n\t\tconst A = _p[ X ] + Y, AA = _p[ A ] + Z, AB = _p[ A + 1 ] + Z, B = _p[ X + 1 ] + Y, BA = _p[ B ] + Z, BB = _p[ B + 1 ] + Z;\n\n\t\treturn lerp(\n\t\t\tlerp(\n\t\t\t\tlerp( grad( _p[ AA ], x, y, z ), grad( _p[ BA ], xMinus1, y, z ), u ),\n\t\t\t\tlerp( grad( _p[ AB ], x, yMinus1, z ), grad( _p[ BB ], xMinus1, yMinus1, z ), u ),\n\t\t\t\tv\n\t\t\t),\n\t\t\tlerp(\n\t\t\t\tlerp( grad( _p[ AA + 1 ], x, y, zMinus1 ), grad( _p[ BA + 1 ], xMinus1, y, zMinus1 ), u ),\n\t\t\t\tlerp( grad( _p[ AB + 1 ], x, yMinus1, zMinus1 ), grad( _p[ BB + 1 ], xMinus1, yMinus1, zMinus1 ), u ),\n\t\t\t\tv\n\t\t\t),\n\t\t\tw\n\t\t);\n\n\t}\n\n}\n\nexport { ImprovedNoise };\n", "import {\n\tColor,\n\tLinearSRGBColorSpace,\n\tMathUtils\n} from 'three';\n\n/**\n * Represents a lookup table for colormaps. It is used to determine the color\n * values from a range of data values.\n *\n * ```js\n * const lut = new Lut( 'rainbow', 512 );\n * const color = lut.getColor( 0.5 );\n * ```\n *\n * @three_import import { Lut } from 'three/addons/math/Lut.js';\n */\nclass Lut {\n\n\t/**\n\t * Constructs a new Lut.\n\t *\n\t * @param {('rainbow'|'cooltowarm'|'blackbody'|'grayscale')} [colormap='rainbow'] - Sets a colormap from predefined list of colormaps.\n\t * @param {number} [count=32] - Sets the number of colors used to represent the data array.\n\t */\n \tconstructor( colormap, count = 32 ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLut = true;\n\n\n\t\t/**\n\t\t * The lookup table for the selected color map\n\t\t *\n\t\t * @type {Array<Color>}\n\t\t */\n\t\tthis.lut = [];\n\n\t\t/**\n\t\t * The currently selected color map.\n\t\t *\n\t\t * @type {Array<Array<number>>}\n\t\t */\n\t\tthis.map = [];\n\n\t\t/**\n\t\t * The number of colors of the current selected color map.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 32\n\t\t */\n\t\tthis.n = 0;\n\n\t\t/**\n\t\t * The minimum value to be represented with the lookup table.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.minV = 0;\n\n\t\t/**\n\t\t * The maximum value to be represented with the lookup table.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.maxV = 1;\n\n\t\tthis.setColorMap( colormap, count );\n\n\t}\n\n\t/**\n\t * Sets the given LUT.\n\t *\n\t * @param {Lut} value - The LUT to set.\n\t * @return {Lut} A reference to this LUT.\n\t */\n\tset( value ) {\n\n\t\tif ( value.isLut === true ) {\n\n\t\t\tthis.copy( value );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the minimum value to be represented with this LUT.\n\t *\n\t * @param {number} min - The minimum value to be represented with the lookup table.\n\t * @return {Lut} A reference to this LUT.\n\t */\n\tsetMin( min ) {\n\n\t\tthis.minV = min;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the maximum value to be represented with this LUT.\n\t *\n\t * @param {number} max - The maximum value to be represented with the lookup table.\n\t * @return {Lut} A reference to this LUT.\n\t */\n\tsetMax( max ) {\n\n\t\tthis.maxV = max;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Configure the lookup table for the given color map and number of colors.\n\t *\n\t * @param {string} colormap - The name of the color map.\n\t * @param {number} [count=32] - The number of colors.\n\t * @return {Lut} A reference to this LUT.\n\t */\n\tsetColorMap( colormap, count = 32 ) {\n\n\t\tthis.map = ColorMapKeywords[ colormap ] || ColorMapKeywords.rainbow;\n\t\tthis.n = count;\n\n\t\tconst step = 1.0 / this.n;\n\t\tconst minColor = new Color();\n\t\tconst maxColor = new Color();\n\n\t\tthis.lut.length = 0;\n\n\t\t// sample at 0\n\n\t\tthis.lut.push( new Color( this.map[ 0 ][ 1 ] ) );\n\n\t\t// sample at 1/n, ..., (n-1)/n\n\n\t\tfor ( let i = 1; i < count; i ++ ) {\n\n\t\t\tconst alpha = i * step;\n\n\t\t\tfor ( let j = 0; j < this.map.length - 1; j ++ ) {\n\n\t\t\t\tif ( alpha > this.map[ j ][ 0 ] && alpha <= this.map[ j + 1 ][ 0 ] ) {\n\n\t\t\t\t\tconst min = this.map[ j ][ 0 ];\n\t\t\t\t\tconst max = this.map[ j + 1 ][ 0 ];\n\n\t\t\t\t\tminColor.setHex( this.map[ j ][ 1 ], LinearSRGBColorSpace );\n\t\t\t\t\tmaxColor.setHex( this.map[ j + 1 ][ 1 ], LinearSRGBColorSpace );\n\n\t\t\t\t\tconst color = new Color().lerpColors( minColor, maxColor, ( alpha - min ) / ( max - min ) );\n\n\t\t\t\t\tthis.lut.push( color );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// sample at 1\n\n\t\tthis.lut.push( new Color( this.map[ this.map.length - 1 ][ 1 ] ) );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the given lut.\n\t *\n\t * @param {Lut} lut - The LUT to copy.\n\t * @return {Lut} A reference to this LUT.\n\t */\n\tcopy( lut ) {\n\n\t\tthis.lut = lut.lut;\n\t\tthis.map = lut.map;\n\t\tthis.n = lut.n;\n\t\tthis.minV = lut.minV;\n\t\tthis.maxV = lut.maxV;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns an instance of Color for the given data value.\n\t *\n\t * @param {number} alpha - The value to lookup.\n\t * @return {Color} The color from the LUT.\n\t */\n\tgetColor( alpha ) {\n\n\t\talpha = MathUtils.clamp( alpha, this.minV, this.maxV );\n\n\t\talpha = ( alpha - this.minV ) / ( this.maxV - this.minV );\n\n\t\tconst colorPosition = Math.round( alpha * this.n );\n\n\t\treturn this.lut[ colorPosition ];\n\n\t}\n\n\t/**\n\t * Adds a color map to this Lut instance.\n\t *\n\t * @param {string} name - The name of the color map.\n\t * @param {Array<Array<number>>} arrayOfColors - An array of color values. Each value is an array\n\t * holding a threshold and the actual color value as a hexadecimal number.\n\t * @return {Lut} A reference to this LUT.\n\t */\n\taddColorMap( name, arrayOfColors ) {\n\n\t\tColorMapKeywords[ name ] = arrayOfColors;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a canvas in order to visualize the lookup table as a texture.\n\t *\n\t * @return {HTMLCanvasElement} The created canvas.\n\t */\n\tcreateCanvas() {\n\n\t\tconst canvas = document.createElement( 'canvas' );\n\t\tcanvas.width = 1;\n\t\tcanvas.height = this.n;\n\n\t\tthis.updateCanvas( canvas );\n\n\t\treturn canvas;\n\n\t}\n\n\t/**\n\t * Updates the given canvas with the Lut's data.\n\t *\n\t * @param {HTMLCanvasElement} canvas - The canvas to update.\n\t * @return {HTMLCanvasElement} The updated canvas.\n\t */\n\tupdateCanvas( canvas ) {\n\n\t\tconst ctx = canvas.getContext( '2d', { alpha: false } );\n\n\t\tconst imageData = ctx.getImageData( 0, 0, 1, this.n );\n\n\t\tconst data = imageData.data;\n\n\t\tlet k = 0;\n\n\t\tconst step = 1.0 / this.n;\n\n\t\tconst minColor = new Color();\n\t\tconst maxColor = new Color();\n\t\tconst finalColor = new Color();\n\n\t\tfor ( let i = 1; i >= 0; i -= step ) {\n\n\t\t\tfor ( let j = this.map.length - 1; j >= 0; j -- ) {\n\n\t\t\t\tif ( i < this.map[ j ][ 0 ] && i >= this.map[ j - 1 ][ 0 ] ) {\n\n\t\t\t\t\tconst min = this.map[ j - 1 ][ 0 ];\n\t\t\t\t\tconst max = this.map[ j ][ 0 ];\n\n\t\t\t\t\tminColor.setHex( this.map[ j - 1 ][ 1 ], LinearSRGBColorSpace );\n\t\t\t\t\tmaxColor.setHex( this.map[ j ][ 1 ], LinearSRGBColorSpace );\n\n\t\t\t\t\tfinalColor.lerpColors( minColor, maxColor, ( i - min ) / ( max - min ) );\n\n\t\t\t\t\tdata[ k * 4 ] = Math.round( finalColor.r * 255 );\n\t\t\t\t\tdata[ k * 4 + 1 ] = Math.round( finalColor.g * 255 );\n\t\t\t\t\tdata[ k * 4 + 2 ] = Math.round( finalColor.b * 255 );\n\t\t\t\t\tdata[ k * 4 + 3 ] = 255;\n\n\t\t\t\t\tk += 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tctx.putImageData( imageData, 0, 0 );\n\n\t\treturn canvas;\n\n\t}\n\n}\n\nconst ColorMapKeywords = {\n\n\t'rainbow': [[ 0.0, 0x0000FF ], [ 0.2, 0x00FFFF ], [ 0.5, 0x00FF00 ], [ 0.8, 0xFFFF00 ], [ 1.0, 0xFF0000 ]],\n\t'cooltowarm': [[ 0.0, 0x3C4EC2 ], [ 0.2, 0x9BBCFF ], [ 0.5, 0xDCDCDC ], [ 0.8, 0xF6A385 ], [ 1.0, 0xB40426 ]],\n\t'blackbody': [[ 0.0, 0x000000 ], [ 0.2, 0x780000 ], [ 0.5, 0xE63200 ], [ 0.8, 0xFFFF00 ], [ 1.0, 0xFFFFFF ]],\n\t'grayscale': [[ 0.0, 0x000000 ], [ 0.2, 0x404040 ], [ 0.5, 0x7F7F80 ], [ 0.8, 0xBFBFBF ], [ 1.0, 0xFFFFFF ]]\n\n};\n\nexport { Lut, ColorMapKeywords };\n", "import {\n\tTriangle,\n\tVector2,\n\tVector3\n} from 'three';\n\nconst _face = new Triangle();\nconst _color = new Vector3();\nconst _uva = new Vector2(), _uvb = new Vector2(), _uvc = new Vector2();\n\n/**\n * Utility class for sampling weighted random points on the surface of a mesh.\n *\n * Building the sampler is a one-time O(n) operation. Once built, any number of\n * random samples may be selected in O(logn) time. Memory usage is O(n).\n *\n * References:\n * - {@link http://www.joesfer.com/?p=84}\n * - {@link https://stackoverflow.com/a/4322940/1314762}\n *\n * ```js\n * const sampler = new MeshSurfaceSampler( surfaceMesh )\n * \t.setWeightAttribute( 'color' )\n * \t.build();\n *\n * const mesh = new THREE.InstancedMesh( sampleGeometry, sampleMaterial, 100 );\n *\n * const position = new THREE.Vector3();\n * const matrix = new THREE.Matrix4();\n *\n * // Sample randomly from the surface, creating an instance of the sample geometry at each sample point.\n *\n * for ( let i = 0; i < 100; i ++ ) {\n *\n * \tsampler.sample( position );\n * \tmatrix.makeTranslation( position.x, position.y, position.z );\n * \tmesh.setMatrixAt( i, matrix );\n *\n * }\n *\n * scene.add( mesh );\n * ```\n *\n * @three_import import { MeshSurfaceSampler } from 'three/addons/math/MeshSurfaceSampler.js';\n */\nclass MeshSurfaceSampler {\n\n\t/**\n\t * Constructs a mesh surface sampler.\n\t *\n\t * @param {Mesh} mesh - Surface mesh from which to sample.\n\t */\n\tconstructor( mesh ) {\n\n\t\tthis.geometry = mesh.geometry;\n\t\tthis.randomFunction = Math.random;\n\n\t\tthis.indexAttribute = this.geometry.index;\n\t\tthis.positionAttribute = this.geometry.getAttribute( 'position' );\n\t\tthis.normalAttribute = this.geometry.getAttribute( 'normal' );\n\t\tthis.colorAttribute = this.geometry.getAttribute( 'color' );\n\t\tthis.uvAttribute = this.geometry.getAttribute( 'uv' );\n\t\tthis.weightAttribute = null;\n\n\t\tthis.distribution = null;\n\n\t}\n\n\t/**\n\t * Specifies a vertex attribute to be used as a weight when sampling from the surface.\n\t * Faces with higher weights are more likely to be sampled, and those with weights of\n\t * zero will not be sampled at all. For vector attributes, only .x is used in sampling.\n\t *\n\t * If no weight attribute is selected, sampling is randomly distributed by area.\n\t *\n\t * @param {string} name - The attribute name.\n\t * @return {MeshSurfaceSampler} A reference to this sampler.\n\t */\n\tsetWeightAttribute( name ) {\n\n\t\tthis.weightAttribute = name ? this.geometry.getAttribute( name ) : null;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Processes the input geometry and prepares to return samples. Any configuration of the\n\t * geometry or sampler must occur before this method is called. Time complexity is O(n)\n\t * for a surface with n faces.\n\t *\n\t * @return {MeshSurfaceSampler} A reference to this sampler.\n\t */\n\tbuild() {\n\n\t\tconst indexAttribute = this.indexAttribute;\n\t\tconst positionAttribute = this.positionAttribute;\n\t\tconst weightAttribute = this.weightAttribute;\n\n\t\tconst totalFaces = indexAttribute ? ( indexAttribute.count / 3 ) : ( positionAttribute.count / 3 );\n\t\tconst faceWeights = new Float32Array( totalFaces );\n\n\t\t// Accumulate weights for each mesh face.\n\n\t\tfor ( let i = 0; i < totalFaces; i ++ ) {\n\n\t\t\tlet faceWeight = 1;\n\n\t\t\tlet i0 = 3 * i;\n\t\t\tlet i1 = 3 * i + 1;\n\t\t\tlet i2 = 3 * i + 2;\n\n\t\t\tif ( indexAttribute ) {\n\n\t\t\t\ti0 = indexAttribute.getX( i0 );\n\t\t\t\ti1 = indexAttribute.getX( i1 );\n\t\t\t\ti2 = indexAttribute.getX( i2 );\n\n\t\t\t}\n\n\t\t\tif ( weightAttribute ) {\n\n\t\t\t\tfaceWeight = weightAttribute.getX( i0 )\n\t\t\t\t\t+ weightAttribute.getX( i1 )\n\t\t\t\t\t+ weightAttribute.getX( i2 );\n\n\t\t\t}\n\n\t\t\t_face.a.fromBufferAttribute( positionAttribute, i0 );\n\t\t\t_face.b.fromBufferAttribute( positionAttribute, i1 );\n\t\t\t_face.c.fromBufferAttribute( positionAttribute, i2 );\n\t\t\tfaceWeight *= _face.getArea();\n\n\t\t\tfaceWeights[ i ] = faceWeight;\n\n\t\t}\n\n\t\t// Store cumulative total face weights in an array, where weight index\n\t\t// corresponds to face index.\n\n\t\tconst distribution = new Float32Array( totalFaces );\n\t\tlet cumulativeTotal = 0;\n\n\t\tfor ( let i = 0; i < totalFaces; i ++ ) {\n\n\t\t\tcumulativeTotal += faceWeights[ i ];\n\t\t\tdistribution[ i ] = cumulativeTotal;\n\n\t\t}\n\n\t\tthis.distribution = distribution;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Allows to set a custom random number generator. Default is `Math.random()`.\n\t *\n\t * @param {Function} randomFunction - A random number generator.\n\t * @return {MeshSurfaceSampler} A reference to this sampler.\n\t */\n\tsetRandomGenerator( randomFunction ) {\n\n\t\tthis.randomFunction = randomFunction;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Selects a random point on the surface of the input geometry, returning the\n\t * position and optionally the normal vector, color and UV Coordinate at that point.\n\t * Time complexity is O(log n) for a surface with n faces.\n\t *\n\t * @param {Vector3} targetPosition - The target object holding the sampled position.\n\t * @param {Vector3} targetNormal - The target object holding the sampled normal.\n\t * @param {Color} targetColor - The target object holding the sampled color.\n\t * @param {Vector2} targetUV -  The target object holding the sampled uv coordinates.\n\t * @return {MeshSurfaceSampler} A reference to this sampler.\n\t */\n\tsample( targetPosition, targetNormal, targetColor, targetUV ) {\n\n\t\tconst faceIndex = this._sampleFaceIndex();\n\t\treturn this._sampleFace( faceIndex, targetPosition, targetNormal, targetColor, targetUV );\n\n\t}\n\n\t// private\n\n\t_sampleFaceIndex() {\n\n\t\tconst cumulativeTotal = this.distribution[ this.distribution.length - 1 ];\n\t\treturn this._binarySearch( this.randomFunction() * cumulativeTotal );\n\n\t}\n\n\t_binarySearch( x ) {\n\n\t\tconst dist = this.distribution;\n\t\tlet start = 0;\n\t\tlet end = dist.length - 1;\n\n\t\tlet index = - 1;\n\n\t\twhile ( start <= end ) {\n\n\t\t\tconst mid = Math.ceil( ( start + end ) / 2 );\n\n\t\t\tif ( mid === 0 || dist[ mid - 1 ] <= x && dist[ mid ] > x ) {\n\n\t\t\t\tindex = mid;\n\n\t\t\t\tbreak;\n\n\t\t\t} else if ( x < dist[ mid ] ) {\n\n\t\t\t\tend = mid - 1;\n\n\t\t\t} else {\n\n\t\t\t\tstart = mid + 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn index;\n\n\t}\n\n\t_sampleFace( faceIndex, targetPosition, targetNormal, targetColor, targetUV ) {\n\n\t\tlet u = this.randomFunction();\n\t\tlet v = this.randomFunction();\n\n\t\tif ( u + v > 1 ) {\n\n\t\t\tu = 1 - u;\n\t\t\tv = 1 - v;\n\n\t\t}\n\n\t\t// get the vertex attribute indices\n\t\tconst indexAttribute = this.indexAttribute;\n\t\tlet i0 = faceIndex * 3;\n\t\tlet i1 = faceIndex * 3 + 1;\n\t\tlet i2 = faceIndex * 3 + 2;\n\t\tif ( indexAttribute ) {\n\n\t\t\ti0 = indexAttribute.getX( i0 );\n\t\t\ti1 = indexAttribute.getX( i1 );\n\t\t\ti2 = indexAttribute.getX( i2 );\n\n\t\t}\n\n\t\t_face.a.fromBufferAttribute( this.positionAttribute, i0 );\n\t\t_face.b.fromBufferAttribute( this.positionAttribute, i1 );\n\t\t_face.c.fromBufferAttribute( this.positionAttribute, i2 );\n\n\t\ttargetPosition\n\t\t\t.set( 0, 0, 0 )\n\t\t\t.addScaledVector( _face.a, u )\n\t\t\t.addScaledVector( _face.b, v )\n\t\t\t.addScaledVector( _face.c, 1 - ( u + v ) );\n\n\t\tif ( targetNormal !== undefined ) {\n\n\t\t\tif ( this.normalAttribute !== undefined ) {\n\n\t\t\t\t_face.a.fromBufferAttribute( this.normalAttribute, i0 );\n\t\t\t\t_face.b.fromBufferAttribute( this.normalAttribute, i1 );\n\t\t\t\t_face.c.fromBufferAttribute( this.normalAttribute, i2 );\n\t\t\t\ttargetNormal.set( 0, 0, 0 ).addScaledVector( _face.a, u ).addScaledVector( _face.b, v ).addScaledVector( _face.c, 1 - ( u + v ) ).normalize();\n\n\t\t\t} else {\n\n\t\t\t\t_face.getNormal( targetNormal );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( targetColor !== undefined && this.colorAttribute !== undefined ) {\n\n\t\t\t_face.a.fromBufferAttribute( this.colorAttribute, i0 );\n\t\t\t_face.b.fromBufferAttribute( this.colorAttribute, i1 );\n\t\t\t_face.c.fromBufferAttribute( this.colorAttribute, i2 );\n\n\t\t\t_color\n\t\t\t\t.set( 0, 0, 0 )\n\t\t\t\t.addScaledVector( _face.a, u )\n\t\t\t\t.addScaledVector( _face.b, v )\n\t\t\t\t.addScaledVector( _face.c, 1 - ( u + v ) );\n\n\t\t\ttargetColor.r = _color.x;\n\t\t\ttargetColor.g = _color.y;\n\t\t\ttargetColor.b = _color.z;\n\n\t\t}\n\n\t\tif ( targetUV !== undefined && this.uvAttribute !== undefined ) {\n\n\t\t\t_uva.fromBufferAttribute( this.uvAttribute, i0 );\n\t\t\t_uvb.fromBufferAttribute( this.uvAttribute, i1 );\n\t\t\t_uvc.fromBufferAttribute( this.uvAttribute, i2 );\n\t\t\ttargetUV.set( 0, 0 ).addScaledVector( _uva, u ).addScaledVector( _uvb, v ).addScaledVector( _uvc, 1 - ( u + v ) );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n}\n\nexport { MeshSurfaceSampler };\n", "import {\n\tBox3,\n\tMathUtils,\n\tMatrix4,\n\tMatrix3,\n\tRay,\n\tVector3\n} from 'three';\n\n// module scope helper variables\n\nconst a = {\n\tc: null, // center\n\tu: [ new Vector3(), new Vector3(), new Vector3() ], // basis vectors\n\te: [] // half width\n};\n\nconst b = {\n\tc: null, // center\n\tu: [ new Vector3(), new Vector3(), new Vector3() ], // basis vectors\n\te: [] // half width\n};\n\nconst R = [[], [], []];\nconst AbsR = [[], [], []];\nconst t = [];\n\nconst xAxis = new Vector3();\nconst yAxis = new Vector3();\nconst zAxis = new Vector3();\nconst v1 = new Vector3();\nconst size = new Vector3();\nconst closestPoint = new Vector3();\nconst rotationMatrix = new Matrix3();\nconst aabb = new Box3();\nconst matrix = new Matrix4();\nconst inverse = new Matrix4();\nconst localRay = new Ray();\n\n/**\n * Represents an oriented bounding box (OBB) in 3D space.\n *\n * @three_import import { OBB } from 'three/addons/math/OBB.js';\n */\nclass OBB {\n\n\t/**\n\t * Constructs a new OBB.\n\t *\n\t * @param {Vector3} [center] - The center of the OBB.\n\t * @param {Vector3} [halfSize] - Positive halfwidth extents of the OBB along each axis.\n\t * @param {Matrix3} [rotation] - The rotation of the OBB.\n\t */\n\tconstructor( center = new Vector3(), halfSize = new Vector3(), rotation = new Matrix3() ) {\n\n\t\t/**\n\t\t * The center of the OBB.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.center = center;\n\n\t\t/**\n\t\t * Positive halfwidth extents of the OBB along each axis.\n\t\t *\n\t\t * @type {Vector3}\n\t\t */\n\t\tthis.halfSize = halfSize;\n\n\t\t/**\n\t\t * The rotation of the OBB.\n\t\t *\n\t\t * @type {Matrix3}\n\t\t */\n\t\tthis.rotation = rotation;\n\n\t}\n\n\t/**\n\t * Sets the OBBs components to the given values.\n\t *\n\t * @param {Vector3} [center] - The center of the OBB.\n\t * @param {Vector3} [halfSize] - Positive halfwidth extents of the OBB along each axis.\n\t * @param {Matrix3} [rotation] - The rotation of the OBB.\n\t * @return {OBB} A reference to this OBB.\n\t */\n\tset( center, halfSize, rotation ) {\n\n\t\tthis.center = center;\n\t\tthis.halfSize = halfSize;\n\t\tthis.rotation = rotation;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Copies the values of the given OBB to this instance.\n\t *\n\t * @param {OBB} obb - The OBB to copy.\n\t * @return {OBB} A reference to this OBB.\n\t */\n\tcopy( obb ) {\n\n\t\tthis.center.copy( obb.center );\n\t\tthis.halfSize.copy( obb.halfSize );\n\t\tthis.rotation.copy( obb.rotation );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a new OBB with copied values from this instance.\n\t *\n\t * @return {OBB} A clone of this instance.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\t/**\n\t * Returns the size of this OBB.\n\t *\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {Vector3} The size.\n\t */\n\tgetSize( target ) {\n\n\t\treturn target.copy( this.halfSize ).multiplyScalar( 2 );\n\n\t}\n\n\t/**\n\t * Clamps the given point within the bounds of this OBB.\n\t *\n\t * @param {Vector3} point - The point that should be clamped within the bounds of this OBB.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @returns {Vector3} - The clamped point.\n\t */\n\tclampPoint( point, target ) {\n\n\t\t// Reference: Closest Point on OBB to Point in Real-Time Collision Detection\n\t\t// by Christer Ericson (chapter 5.1.4)\n\n\t\tconst halfSize = this.halfSize;\n\n\t\tv1.subVectors( point, this.center );\n\t\tthis.rotation.extractBasis( xAxis, yAxis, zAxis );\n\n\t\t// start at the center position of the OBB\n\n\t\ttarget.copy( this.center );\n\n\t\t// project the target onto the OBB axes and walk towards that point\n\n\t\tconst x = MathUtils.clamp( v1.dot( xAxis ), - halfSize.x, halfSize.x );\n\t\ttarget.add( xAxis.multiplyScalar( x ) );\n\n\t\tconst y = MathUtils.clamp( v1.dot( yAxis ), - halfSize.y, halfSize.y );\n\t\ttarget.add( yAxis.multiplyScalar( y ) );\n\n\t\tconst z = MathUtils.clamp( v1.dot( zAxis ), - halfSize.z, halfSize.z );\n\t\ttarget.add( zAxis.multiplyScalar( z ) );\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given point lies within this OBB.\n\t *\n\t * @param {Vector3} point - The point to test.\n\t * @returns {boolean} - Whether the given point lies within this OBB or not.\n\t */\n\tcontainsPoint( point ) {\n\n\t\tv1.subVectors( point, this.center );\n\t\tthis.rotation.extractBasis( xAxis, yAxis, zAxis );\n\n\t\t// project v1 onto each axis and check if these points lie inside the OBB\n\n\t\treturn Math.abs( v1.dot( xAxis ) ) <= this.halfSize.x &&\n\t\t\t\tMath.abs( v1.dot( yAxis ) ) <= this.halfSize.y &&\n\t\t\t\tMath.abs( v1.dot( zAxis ) ) <= this.halfSize.z;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given AABB intersects this OBB.\n\t *\n\t * @param {Box3} box3 - The AABB to test.\n\t * @returns {boolean} - Whether the given AABB intersects this OBB or not.\n\t */\n\tintersectsBox3( box3 ) {\n\n\t\treturn this.intersectsOBB( obb.fromBox3( box3 ) );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given bounding sphere intersects this OBB.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @returns {boolean} - Whether the given bounding sphere intersects this OBB or not.\n\t */\n\tintersectsSphere( sphere ) {\n\n\t\t// find the point on the OBB closest to the sphere center\n\n\t\tthis.clampPoint( sphere.center, closestPoint );\n\n\t\t// if that point is inside the sphere, the OBB and sphere intersect\n\n\t\treturn closestPoint.distanceToSquared( sphere.center ) <= ( sphere.radius * sphere.radius );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given OBB intersects this OBB.\n\t *\n\t * @param {OBB} obb - The OBB to test.\n\t * @param {number} [epsilon=Number.EPSILON] - A small value to prevent arithmetic errors.\n\t * @returns {boolean} - Whether the given OBB intersects this OBB or not.\n\t */\n\tintersectsOBB( obb, epsilon = Number.EPSILON ) {\n\n\t\t// Reference: OBB-OBB Intersection in Real-Time Collision Detection\n\t\t// by Christer Ericson (chapter 4.4.1)\n\n\t\t// prepare data structures (the code uses the same nomenclature like the reference)\n\n\t\ta.c = this.center;\n\t\ta.e[ 0 ] = this.halfSize.x;\n\t\ta.e[ 1 ] = this.halfSize.y;\n\t\ta.e[ 2 ] = this.halfSize.z;\n\t\tthis.rotation.extractBasis( a.u[ 0 ], a.u[ 1 ], a.u[ 2 ] );\n\n\t\tb.c = obb.center;\n\t\tb.e[ 0 ] = obb.halfSize.x;\n\t\tb.e[ 1 ] = obb.halfSize.y;\n\t\tb.e[ 2 ] = obb.halfSize.z;\n\t\tobb.rotation.extractBasis( b.u[ 0 ], b.u[ 1 ], b.u[ 2 ] );\n\n\t\t// compute rotation matrix expressing b in a's coordinate frame\n\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\tR[ i ][ j ] = a.u[ i ].dot( b.u[ j ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// compute translation vector\n\n\t\tv1.subVectors( b.c, a.c );\n\n\t\t// bring translation into a's coordinate frame\n\n\t\tt[ 0 ] = v1.dot( a.u[ 0 ] );\n\t\tt[ 1 ] = v1.dot( a.u[ 1 ] );\n\t\tt[ 2 ] = v1.dot( a.u[ 2 ] );\n\n\t\t// compute common subexpressions. Add in an epsilon term to\n\t\t// counteract arithmetic errors when two edges are parallel and\n\t\t// their cross product is (near) null\n\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\tAbsR[ i ][ j ] = Math.abs( R[ i ][ j ] ) + epsilon;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet ra, rb;\n\n\t\t// test axes L = A0, L = A1, L = A2\n\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tra = a.e[ i ];\n\t\t\trb = b.e[ 0 ] * AbsR[ i ][ 0 ] + b.e[ 1 ] * AbsR[ i ][ 1 ] + b.e[ 2 ] * AbsR[ i ][ 2 ];\n\t\t\tif ( Math.abs( t[ i ] ) > ra + rb ) return false;\n\n\n\t\t}\n\n\t\t// test axes L = B0, L = B1, L = B2\n\n\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\tra = a.e[ 0 ] * AbsR[ 0 ][ i ] + a.e[ 1 ] * AbsR[ 1 ][ i ] + a.e[ 2 ] * AbsR[ 2 ][ i ];\n\t\t\trb = b.e[ i ];\n\t\t\tif ( Math.abs( t[ 0 ] * R[ 0 ][ i ] + t[ 1 ] * R[ 1 ][ i ] + t[ 2 ] * R[ 2 ][ i ] ) > ra + rb ) return false;\n\n\t\t}\n\n\t\t// test axis L = A0 x B0\n\n\t\tra = a.e[ 1 ] * AbsR[ 2 ][ 0 ] + a.e[ 2 ] * AbsR[ 1 ][ 0 ];\n\t\trb = b.e[ 1 ] * AbsR[ 0 ][ 2 ] + b.e[ 2 ] * AbsR[ 0 ][ 1 ];\n\t\tif ( Math.abs( t[ 2 ] * R[ 1 ][ 0 ] - t[ 1 ] * R[ 2 ][ 0 ] ) > ra + rb ) return false;\n\n\t\t// test axis L = A0 x B1\n\n\t\tra = a.e[ 1 ] * AbsR[ 2 ][ 1 ] + a.e[ 2 ] * AbsR[ 1 ][ 1 ];\n\t\trb = b.e[ 0 ] * AbsR[ 0 ][ 2 ] + b.e[ 2 ] * AbsR[ 0 ][ 0 ];\n\t\tif ( Math.abs( t[ 2 ] * R[ 1 ][ 1 ] - t[ 1 ] * R[ 2 ][ 1 ] ) > ra + rb ) return false;\n\n\t\t// test axis L = A0 x B2\n\n\t\tra = a.e[ 1 ] * AbsR[ 2 ][ 2 ] + a.e[ 2 ] * AbsR[ 1 ][ 2 ];\n\t\trb = b.e[ 0 ] * AbsR[ 0 ][ 1 ] + b.e[ 1 ] * AbsR[ 0 ][ 0 ];\n\t\tif ( Math.abs( t[ 2 ] * R[ 1 ][ 2 ] - t[ 1 ] * R[ 2 ][ 2 ] ) > ra + rb ) return false;\n\n\t\t// test axis L = A1 x B0\n\n\t\tra = a.e[ 0 ] * AbsR[ 2 ][ 0 ] + a.e[ 2 ] * AbsR[ 0 ][ 0 ];\n\t\trb = b.e[ 1 ] * AbsR[ 1 ][ 2 ] + b.e[ 2 ] * AbsR[ 1 ][ 1 ];\n\t\tif ( Math.abs( t[ 0 ] * R[ 2 ][ 0 ] - t[ 2 ] * R[ 0 ][ 0 ] ) > ra + rb ) return false;\n\n\t\t// test axis L = A1 x B1\n\n\t\tra = a.e[ 0 ] * AbsR[ 2 ][ 1 ] + a.e[ 2 ] * AbsR[ 0 ][ 1 ];\n\t\trb = b.e[ 0 ] * AbsR[ 1 ][ 2 ] + b.e[ 2 ] * AbsR[ 1 ][ 0 ];\n\t\tif ( Math.abs( t[ 0 ] * R[ 2 ][ 1 ] - t[ 2 ] * R[ 0 ][ 1 ] ) > ra + rb ) return false;\n\n\t\t// test axis L = A1 x B2\n\n\t\tra = a.e[ 0 ] * AbsR[ 2 ][ 2 ] + a.e[ 2 ] * AbsR[ 0 ][ 2 ];\n\t\trb = b.e[ 0 ] * AbsR[ 1 ][ 1 ] + b.e[ 1 ] * AbsR[ 1 ][ 0 ];\n\t\tif ( Math.abs( t[ 0 ] * R[ 2 ][ 2 ] - t[ 2 ] * R[ 0 ][ 2 ] ) > ra + rb ) return false;\n\n\t\t// test axis L = A2 x B0\n\n\t\tra = a.e[ 0 ] * AbsR[ 1 ][ 0 ] + a.e[ 1 ] * AbsR[ 0 ][ 0 ];\n\t\trb = b.e[ 1 ] * AbsR[ 2 ][ 2 ] + b.e[ 2 ] * AbsR[ 2 ][ 1 ];\n\t\tif ( Math.abs( t[ 1 ] * R[ 0 ][ 0 ] - t[ 0 ] * R[ 1 ][ 0 ] ) > ra + rb ) return false;\n\n\t\t// test axis L = A2 x B1\n\n\t\tra = a.e[ 0 ] * AbsR[ 1 ][ 1 ] + a.e[ 1 ] * AbsR[ 0 ][ 1 ];\n\t\trb = b.e[ 0 ] * AbsR[ 2 ][ 2 ] + b.e[ 2 ] * AbsR[ 2 ][ 0 ];\n\t\tif ( Math.abs( t[ 1 ] * R[ 0 ][ 1 ] - t[ 0 ] * R[ 1 ][ 1 ] ) > ra + rb ) return false;\n\n\t\t// test axis L = A2 x B2\n\n\t\tra = a.e[ 0 ] * AbsR[ 1 ][ 2 ] + a.e[ 1 ] * AbsR[ 0 ][ 2 ];\n\t\trb = b.e[ 0 ] * AbsR[ 2 ][ 1 ] + b.e[ 1 ] * AbsR[ 2 ][ 0 ];\n\t\tif ( Math.abs( t[ 1 ] * R[ 0 ][ 2 ] - t[ 0 ] * R[ 1 ][ 2 ] ) > ra + rb ) return false;\n\n\t\t// since no separating axis is found, the OBBs must be intersecting\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given plane intersects this OBB.\n\t *\n\t * @param {Plane} plane - The plane to test.\n\t * @returns {boolean} Whether the given plane intersects this OBB or not.\n\t */\n\tintersectsPlane( plane ) {\n\n\t\t// Reference: Testing Box Against Plane in Real-Time Collision Detection\n\t\t// by Christer Ericson (chapter 5.2.3)\n\n\t\tthis.rotation.extractBasis( xAxis, yAxis, zAxis );\n\n\t\t// compute the projection interval radius of this OBB onto L(t) = this->center + t * p.normal;\n\n\t\tconst r = this.halfSize.x * Math.abs( plane.normal.dot( xAxis ) ) +\n\t\t\t\tthis.halfSize.y * Math.abs( plane.normal.dot( yAxis ) ) +\n\t\t\t\tthis.halfSize.z * Math.abs( plane.normal.dot( zAxis ) );\n\n\t\t// compute distance of the OBB's center from the plane\n\n\t\tconst d = plane.normal.dot( this.center ) - plane.constant;\n\n\t\t// Intersection occurs when distance d falls within [-r,+r] interval\n\n\t\treturn Math.abs( d ) <= r;\n\n\t}\n\n\t/**\n\t * Performs a ray/OBB intersection test and stores the intersection point\n\t * in the given 3D vector.\n\t *\n\t * @param {Ray} ray - The ray to test.\n\t * @param {Vector3} target - The target vector that is used to store the method's result.\n\t * @return {?Vector3} The intersection point. If no intersection is detected, `null` is returned.\n\t */\n\tintersectRay( ray, target ) {\n\n\t\t// the idea is to perform the intersection test in the local space\n\t\t// of the OBB.\n\n\t\tthis.getSize( size );\n\t\taabb.setFromCenterAndSize( v1.set( 0, 0, 0 ), size );\n\n\t\t// create a 4x4 transformation matrix\n\n\t\tmatrix.setFromMatrix3( this.rotation );\n\t\tmatrix.setPosition( this.center );\n\n\t\t// transform ray to the local space of the OBB\n\n\t\tinverse.copy( matrix ).invert();\n\t\tlocalRay.copy( ray ).applyMatrix4( inverse );\n\n\t\t// perform ray <-> AABB intersection test\n\n\t\tif ( localRay.intersectBox( aabb, target ) ) {\n\n\t\t\t// transform the intersection point back to world space\n\n\t\t\treturn target.applyMatrix4( matrix );\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns `true` if the given ray intersects this OBB.\n\t *\n\t * @param {Ray} ray - The ray to test.\n\t * @returns {boolean} Whether the given ray intersects this OBB or not.\n\t */\n\tintersectsRay( ray ) {\n\n\t\treturn this.intersectRay( ray, v1 ) !== null;\n\n\t}\n\n\t/**\n\t * Defines an OBB based on the given AABB.\n\t *\n\t * @param {Box3} box3 - The AABB to setup the OBB from.\n\t * @return {OBB} A reference of this OBB.\n\t */\n\tfromBox3( box3 ) {\n\n\t\tbox3.getCenter( this.center );\n\n\t\tbox3.getSize( this.halfSize ).multiplyScalar( 0.5 );\n\n\t\tthis.rotation.identity();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given OBB is equal to this OBB.\n\t *\n\t * @param {OBB} obb - The OBB to test.\n\t * @returns {boolean} Whether the given OBB is equal to this OBB or not.\n\t */\n\tequals( obb ) {\n\n\t\treturn obb.center.equals( this.center ) &&\n\t\t\tobb.halfSize.equals( this.halfSize ) &&\n\t\t\tobb.rotation.equals( this.rotation );\n\n\t}\n\n\t/**\n\t * Applies the given transformation matrix to this OBB. This method can be\n\t * used to transform the bounding volume with the world matrix of a 3D object\n\t * in order to keep both entities in sync.\n\t *\n\t * @param {Matrix4} matrix - The matrix to apply.\n\t * @return {OBB} A reference of this OBB.\n\t */\n\tapplyMatrix4( matrix ) {\n\n\t\tconst e = matrix.elements;\n\n\t\tlet sx = v1.set( e[ 0 ], e[ 1 ], e[ 2 ] ).length();\n\t\tconst sy = v1.set( e[ 4 ], e[ 5 ], e[ 6 ] ).length();\n\t\tconst sz = v1.set( e[ 8 ], e[ 9 ], e[ 10 ] ).length();\n\n\t\tconst det = matrix.determinant();\n\t\tif ( det < 0 ) sx = - sx;\n\n\t\trotationMatrix.setFromMatrix4( matrix );\n\n\t\tconst invSX = 1 / sx;\n\t\tconst invSY = 1 / sy;\n\t\tconst invSZ = 1 / sz;\n\n\t\trotationMatrix.elements[ 0 ] *= invSX;\n\t\trotationMatrix.elements[ 1 ] *= invSX;\n\t\trotationMatrix.elements[ 2 ] *= invSX;\n\n\t\trotationMatrix.elements[ 3 ] *= invSY;\n\t\trotationMatrix.elements[ 4 ] *= invSY;\n\t\trotationMatrix.elements[ 5 ] *= invSY;\n\n\t\trotationMatrix.elements[ 6 ] *= invSZ;\n\t\trotationMatrix.elements[ 7 ] *= invSZ;\n\t\trotationMatrix.elements[ 8 ] *= invSZ;\n\n\t\tthis.rotation.multiply( rotationMatrix );\n\n\t\tthis.halfSize.x *= sx;\n\t\tthis.halfSize.y *= sy;\n\t\tthis.halfSize.z *= sz;\n\n\t\tv1.setFromMatrixPosition( matrix );\n\t\tthis.center.add( v1 );\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst obb = new OBB();\n\nexport { OBB };\n", "import {\n\tBox3,\n\tLine3,\n\tPlane,\n\tSphere,\n\tTriangle,\n\tVector3,\n\tLayers\n} from 'three';\nimport { Capsule } from '../math/Capsule.js';\n\n\nconst _v1 = new Vector3();\nconst _v2 = new Vector3();\nconst _point1 = new Vector3();\nconst _point2 = new Vector3();\nconst _plane = new Plane();\nconst _line1 = new Line3();\nconst _line2 = new Line3();\nconst _box = new Box3();\nconst _sphere = new Sphere();\nconst _capsule = new Capsule();\nconst _center = new Vector3();\n\nconst _temp1 = new Vector3();\nconst _temp2 = new Vector3();\nconst _temp3 = new Vector3();\nconst EPS = 1e-10;\n\nfunction lineToLineClosestPoints( line1, line2, target1 = null, target2 = null ) {\n\n\tconst r = _temp1.copy( line1.end ).sub( line1.start );\n\tconst s = _temp2.copy( line2.end ).sub( line2.start );\n\tconst w = _temp3.copy( line2.start ).sub( line1.start );\n\n\tconst a = r.dot( s ),\n\t\tb = r.dot( r ),\n\t\tc = s.dot( s ),\n\t\td = s.dot( w ),\n\t\te = r.dot( w );\n\n\tlet t1, t2;\n\tconst divisor = b * c - a * a;\n\n\tif ( Math.abs( divisor ) < EPS ) {\n\n\t\tconst d1 = - d / c;\n\t\tconst d2 = ( a - d ) / c;\n\n\t\tif ( Math.abs( d1 - 0.5 ) < Math.abs( d2 - 0.5 ) ) {\n\n\t\t\tt1 = 0;\n\t\t\tt2 = d1;\n\n\t\t} else {\n\n\t\t\tt1 = 1;\n\t\t\tt2 = d2;\n\n\t\t}\n\n\t} else {\n\n\t\tt1 = ( d * a + e * c ) / divisor;\n\t\tt2 = ( t1 * a - d ) / c;\n\n\t}\n\n\tt2 = Math.max( 0, Math.min( 1, t2 ) );\n\tt1 = Math.max( 0, Math.min( 1, t1 ) );\n\n\tif ( target1 ) {\n\n\t\ttarget1.copy( r ).multiplyScalar( t1 ).add( line1.start );\n\n\t}\n\n\tif ( target2 ) {\n\n\t\ttarget2.copy( s ).multiplyScalar( t2 ).add( line2.start );\n\n\t}\n\n}\n\n/**\n * An octree is a hierarchical tree data structure used to partition a three-dimensional\n * space by recursively subdividing it into eight octants.\n *\n * This particular implementation can have up to sixteen levels and stores up to eight triangles\n * in leaf nodes.\n *\n * `Octree` can be used in games to compute collision between the game world and colliders from\n * the player or other dynamic 3D objects.\n *\n *\n * ```js\n * const octree = new Octree().fromGraphNode( scene );\n * const result = octree.capsuleIntersect( playerCollider ); // collision detection\n * ```\n *\n * @three_import import { Octree } from 'three/addons/math/Octree.js';\n */\nclass Octree {\n\n\t/**\n\t * Constructs a new Octree.\n\t *\n\t * @param {Box3} [box] - The base box with enclose the entire Octree.\n\t */\n\tconstructor( box ) {\n\n\t\t/**\n\t\t * The base box with enclose the entire Octree.\n\t\t *\n\t\t * @type {Box3}\n\t\t */\n\t\tthis.box = box;\n\n\t\t/**\n\t\t * The bounds of the Octree. Compared to {@link Octree#box}, no\n\t\t * margin is applied.\n\t\t *\n\t\t * @type {Box3}\n\t\t */\n\t\tthis.bounds = new Box3();\n\n\t\t/**\n\t\t * Can by used for layers configuration for refine testing.\n\t\t *\n\t\t * @type {Layers}\n\t\t */\n\t\tthis.layers = new Layers();\n\n\t\t/**\n\t\t * The number of triangles a leaf can store before it is split.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 8\n\t\t */\n\t\tthis.trianglesPerLeaf = 8;\n\n\t\t/**\n\t\t * The maximum level of the Octree. It defines the maximum\n\t\t * hierarchical depth of the data structure.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 16\n\t\t */\n\t\tthis.maxLevel = 16;\n\n\t\t// private\n\n\t\tthis.subTrees = [];\n\t\tthis.triangles = [];\n\n\t}\n\n\t/**\n\t * Adds the given triangle to the Octree. The triangle vertices are clamped if they exceed\n\t * the bounds of the Octree.\n\t *\n\t * @param {Triangle} triangle - The triangle to add.\n\t * @return {Octree} A reference to this Octree.\n\t */\n\taddTriangle( triangle ) {\n\n\t\tthis.bounds.min.x = Math.min( this.bounds.min.x, triangle.a.x, triangle.b.x, triangle.c.x );\n\t\tthis.bounds.min.y = Math.min( this.bounds.min.y, triangle.a.y, triangle.b.y, triangle.c.y );\n\t\tthis.bounds.min.z = Math.min( this.bounds.min.z, triangle.a.z, triangle.b.z, triangle.c.z );\n\t\tthis.bounds.max.x = Math.max( this.bounds.max.x, triangle.a.x, triangle.b.x, triangle.c.x );\n\t\tthis.bounds.max.y = Math.max( this.bounds.max.y, triangle.a.y, triangle.b.y, triangle.c.y );\n\t\tthis.bounds.max.z = Math.max( this.bounds.max.z, triangle.a.z, triangle.b.z, triangle.c.z );\n\n\t\tthis.triangles.push( triangle );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Prepares {@link Octree#box} for the build.\n\t *\n\t * @return {Octree} A reference to this Octree.\n\t */\n\tcalcBox() {\n\n\t\tthis.box = this.bounds.clone();\n\n\t\t// offset small amount to account for regular grid\n\t\tthis.box.min.x -= 0.01;\n\t\tthis.box.min.y -= 0.01;\n\t\tthis.box.min.z -= 0.01;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Splits the Octree. This method is used recursively when\n\t * building the Octree.\n\t *\n\t * @param {number} level - The current level.\n\t * @return {Octree} A reference to this Octree.\n\t */\n\tsplit( level ) {\n\n\t\tif ( ! this.box ) return;\n\n\t\tconst subTrees = [];\n\t\tconst halfsize = _v2.copy( this.box.max ).sub( this.box.min ).multiplyScalar( 0.5 );\n\n\t\tfor ( let x = 0; x < 2; x ++ ) {\n\n\t\t\tfor ( let y = 0; y < 2; y ++ ) {\n\n\t\t\t\tfor ( let z = 0; z < 2; z ++ ) {\n\n\t\t\t\t\tconst box = new Box3();\n\t\t\t\t\tconst v = _v1.set( x, y, z );\n\n\t\t\t\t\tbox.min.copy( this.box.min ).add( v.multiply( halfsize ) );\n\t\t\t\t\tbox.max.copy( box.min ).add( halfsize );\n\n\t\t\t\t\tsubTrees.push( new Octree( box ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet triangle;\n\n\t\twhile ( triangle = this.triangles.pop() ) {\n\n\t\t\tfor ( let i = 0; i < subTrees.length; i ++ ) {\n\n\t\t\t\tif ( subTrees[ i ].box.intersectsTriangle( triangle ) ) {\n\n\t\t\t\t\tsubTrees[ i ].triangles.push( triangle );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < subTrees.length; i ++ ) {\n\n\t\t\tconst len = subTrees[ i ].triangles.length;\n\n\t\t\tif ( len > this.trianglesPerLeaf && level < this.maxLevel ) {\n\n\t\t\t\tsubTrees[ i ].split( level + 1 );\n\n\t\t\t}\n\n\t\t\tif ( len !== 0 ) {\n\n\t\t\t\tthis.subTrees.push( subTrees[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Builds the Octree.\n\t *\n\t * @return {Octree} A reference to this Octree.\n\t */\n\tbuild() {\n\n\t\tthis.calcBox();\n\t\tthis.split( 0 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Computes the triangles that potentially intersect with the given ray.\n\t *\n\t * @param {Ray} ray - The ray to test.\n\t * @param {Array<Triangle>} triangles - The target array that holds the triangles.\n\t */\n\tgetRayTriangles( ray, triangles ) {\n\n\t\tfor ( let i = 0; i < this.subTrees.length; i ++ ) {\n\n\t\t\tconst subTree = this.subTrees[ i ];\n\t\t\tif ( ! ray.intersectsBox( subTree.box ) ) continue;\n\n\t\t\tif ( subTree.triangles.length > 0 ) {\n\n\t\t\t\tfor ( let j = 0; j < subTree.triangles.length; j ++ ) {\n\n\t\t\t\t\tif ( triangles.indexOf( subTree.triangles[ j ] ) === - 1 ) triangles.push( subTree.triangles[ j ] );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tsubTree.getRayTriangles( ray, triangles );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the intersection between the given capsule and triangle.\n\t *\n\t * @param {Capsule} capsule - The capsule to test.\n\t * @param {Triangle} triangle - The triangle to test.\n\t * @return {Object|false} The intersection object. If no intersection\n\t * is detected, the method returns `false`.\n\t */\n\ttriangleCapsuleIntersect( capsule, triangle ) {\n\n\t\ttriangle.getPlane( _plane );\n\n\t\tconst d1 = _plane.distanceToPoint( capsule.start ) - capsule.radius;\n\t\tconst d2 = _plane.distanceToPoint( capsule.end ) - capsule.radius;\n\n\t\tif ( ( d1 > 0 && d2 > 0 ) || ( d1 < - capsule.radius && d2 < - capsule.radius ) ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\tconst delta = Math.abs( d1 / ( Math.abs( d1 ) + Math.abs( d2 ) ) );\n\t\tconst intersectPoint = _v1.copy( capsule.start ).lerp( capsule.end, delta );\n\n\t\tif ( triangle.containsPoint( intersectPoint ) ) {\n\n\t\t\treturn { normal: _plane.normal.clone(), point: intersectPoint.clone(), depth: Math.abs( Math.min( d1, d2 ) ) };\n\n\t\t}\n\n\t\tconst r2 = capsule.radius * capsule.radius;\n\n\t\tconst line1 = _line1.set( capsule.start, capsule.end );\n\n\t\tconst lines = [\n\t\t\t[ triangle.a, triangle.b ],\n\t\t\t[ triangle.b, triangle.c ],\n\t\t\t[ triangle.c, triangle.a ]\n\t\t];\n\n\t\tfor ( let i = 0; i < lines.length; i ++ ) {\n\n\t\t\tconst line2 = _line2.set( lines[ i ][ 0 ], lines[ i ][ 1 ] );\n\n\t\t\tlineToLineClosestPoints( line1, line2, _point1, _point2 );\n\n\t\t\tif ( _point1.distanceToSquared( _point2 ) < r2 ) {\n\n\t\t\t\treturn {\n\t\t\t\t\tnormal: _point1.clone().sub( _point2 ).normalize(),\n\t\t\t\t\tpoint: _point2.clone(),\n\t\t\t\t\tdepth: capsule.radius - _point1.distanceTo( _point2 )\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Computes the intersection between the given bounding box and triangle.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @param {Triangle} triangle - The triangle to test.\n\t * @return {Object|false} The intersection object. If no intersection\n\t * is detected, the method returns `false`.\n\t */\n\ttriangleBoxIntersect( box, triangle ) {\n\n\t\t// cheap check\n\n\t\tif ( Math.max( triangle.a.x, triangle.b.x, triangle.c.x ) < box.min.x ||\n\t\t\t\tMath.min( triangle.a.x, triangle.b.x, triangle.c.x ) > box.max.x ||\n\t\t\t\tMath.max( triangle.a.y, triangle.b.y, triangle.c.y ) < box.min.y ||\n\t\t\t\tMath.min( triangle.a.y, triangle.b.y, triangle.c.y ) > box.max.y ||\n\t\t\t\tMath.max( triangle.a.z, triangle.b.z, triangle.c.z ) < box.min.z ||\n\t\t\t\tMath.min( triangle.a.z, triangle.b.z, triangle.c.z ) > box.max.z ) {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// expensive check\n\n\t\tif ( ! box.intersectsTriangle( triangle ) ) return false;\n\n\t\t// there is an intersection, now compute collision data\n\n\t\ttriangle.getPlane( _plane );\n\n\t\t// determine which corner of the box is \"deepest\" into the plane\n\n\t\t_v1.x = ( _plane.normal.x > 0 ) ? box.min.x : box.max.x;\n\t\t_v1.y = ( _plane.normal.y > 0 ) ? box.min.y : box.max.y;\n\t\t_v1.z = ( _plane.normal.z > 0 ) ? box.min.z : box.max.z;\n\n\t\t// Calculate the distance from the plane to that corner (the distance will be negative\n\t\t// because of the intersection)\n\n\t\tconst distance = _plane.distanceToPoint( _v1 );\n\n\t\tconst intersection = {\n\t\t\tdepth: - distance, // Flip sign so depth is positive\n\t\t\tnormal: _plane.normal.clone(),\n\t\t\tpoint: _v1.clone()\n\t\t};\n\n\t\t// project the point onto the triangle surface\n\t\tintersection.point.addScaledVector( intersection.normal, distance );\n\n\t\treturn intersection;\n\n\t}\n\n\t/**\n\t * Computes the intersection between the given sphere and triangle.\n\t *\n\t * @param {Sphere} sphere - The sphere to test.\n\t * @param {Triangle} triangle - The triangle to test.\n\t * @return {Object|false} The intersection object. If no intersection\n\t * is detected, the method returns `false`.\n\t */\n\ttriangleSphereIntersect( sphere, triangle ) {\n\n\t\ttriangle.getPlane( _plane );\n\n\t\tif ( ! sphere.intersectsPlane( _plane ) ) return false;\n\n\t\tconst depth = Math.abs( _plane.distanceToSphere( sphere ) );\n\t\tconst r2 = sphere.radius * sphere.radius - depth * depth;\n\n\t\tconst plainPoint = _plane.projectPoint( sphere.center, _v1 );\n\n\t\tif ( triangle.containsPoint( sphere.center ) ) {\n\n\t\t\treturn { normal: _plane.normal.clone(), point: plainPoint.clone(), depth: Math.abs( _plane.distanceToSphere( sphere ) ) };\n\n\t\t}\n\n\t\tconst lines = [\n\t\t\t[ triangle.a, triangle.b ],\n\t\t\t[ triangle.b, triangle.c ],\n\t\t\t[ triangle.c, triangle.a ]\n\t\t];\n\n\t\tfor ( let i = 0; i < lines.length; i ++ ) {\n\n\t\t\t_line1.set( lines[ i ][ 0 ], lines[ i ][ 1 ] );\n\t\t\t_line1.closestPointToPoint( plainPoint, true, _v2 );\n\n\t\t\tconst d = _v2.distanceToSquared( sphere.center );\n\n\t\t\tif ( d < r2 ) {\n\n\t\t\t\treturn { normal: sphere.center.clone().sub( _v2 ).normalize(), point: _v2.clone(), depth: sphere.radius - Math.sqrt( d ) };\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Computes the triangles that potentially intersect with the given bounding sphere.\n\t *\n\t * @param {Sphere} sphere - The sphere to test.\n\t * @param {Array<Triangle>} triangles - The target array that holds the triangles.\n\t */\n\tgetSphereTriangles( sphere, triangles ) {\n\n\t\tfor ( let i = 0; i < this.subTrees.length; i ++ ) {\n\n\t\t\tconst subTree = this.subTrees[ i ];\n\n\t\t\tif ( ! sphere.intersectsBox( subTree.box ) ) continue;\n\n\t\t\tif ( subTree.triangles.length > 0 ) {\n\n\t\t\t\tfor ( let j = 0; j < subTree.triangles.length; j ++ ) {\n\n\t\t\t\t\tif ( triangles.indexOf( subTree.triangles[ j ] ) === - 1 ) triangles.push( subTree.triangles[ j ] );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tsubTree.getSphereTriangles( sphere, triangles );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the triangles that potentially intersect with the given bounding box.\n\t *\n\t * @param {Box3} box - The bounding box.\n\t * @param {Array<Triangle>} triangles - The target array that holds the triangles.\n\t */\n\tgetBoxTriangles( box, triangles ) {\n\n\t\tfor ( let i = 0; i < this.subTrees.length; i ++ ) {\n\n\t\t\tconst subTree = this.subTrees[ i ];\n\n\t\t\tif ( ! box.intersectsBox( subTree.box ) ) continue;\n\n\t\t\tif ( subTree.triangles.length > 0 ) {\n\n\t\t\t\tfor ( let j = 0; j < subTree.triangles.length; j ++ ) {\n\n\t\t\t\t\tif ( triangles.indexOf( subTree.triangles[ j ] ) === - 1 ) triangles.push( subTree.triangles[ j ] );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tsubTree.getBoxTriangles( box, triangles );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Computes the triangles that potentially intersect with the given capsule.\n\t *\n\t * @param {Capsule} capsule - The capsule to test.\n\t * @param {Array<Triangle>} triangles - The target array that holds the triangles.\n\t */\n\tgetCapsuleTriangles( capsule, triangles ) {\n\n\t\tfor ( let i = 0; i < this.subTrees.length; i ++ ) {\n\n\t\t\tconst subTree = this.subTrees[ i ];\n\n\t\t\tif ( ! capsule.intersectsBox( subTree.box ) ) continue;\n\n\t\t\tif ( subTree.triangles.length > 0 ) {\n\n\t\t\t\tfor ( let j = 0; j < subTree.triangles.length; j ++ ) {\n\n\t\t\t\t\tif ( triangles.indexOf( subTree.triangles[ j ] ) === - 1 ) triangles.push( subTree.triangles[ j ] );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tsubTree.getCapsuleTriangles( capsule, triangles );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Performs a bounding box intersection test with this Octree.\n\t *\n\t * @param {Box3} box - The bounding box to test.\n\t * @return {Object|boolean} The intersection object. If no intersection\n\t * is detected, the method returns `false`.\n\t */\n\tboxIntersect( box ) {\n\n\t\t_box.copy( box );\n\n\t\tconst triangles = [];\n\t\tlet result, hit = false;\n\n\t\tthis.getBoxTriangles( box, triangles );\n\n\t\tfor ( let i = 0; i < triangles.length; i ++ ) {\n\n\t\t\tif ( result = this.triangleBoxIntersect( _box, triangles[ i ] ) ) {\n\n\t\t\t\thit = true;\n\n\t\t\t\t_box.translate( result.normal.multiplyScalar( result.depth ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( hit ) {\n\n\t\t\tconst collisionVector = _box.getCenter( _center ).sub( box.getCenter( _v1 ) );\n\t\t\tconst depth = collisionVector.length();\n\n\t\t\treturn { normal: collisionVector.normalize(), depth: depth };\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Performs a bounding sphere intersection test with this Octree.\n\t *\n\t * @param {Sphere} sphere - The bounding sphere to test.\n\t * @return {Object|boolean} The intersection object. If no intersection\n\t * is detected, the method returns `false`.\n\t */\n\tsphereIntersect( sphere ) {\n\n\t\t_sphere.copy( sphere );\n\n\t\tconst triangles = [];\n\t\tlet result, hit = false;\n\n\t\tthis.getSphereTriangles( sphere, triangles );\n\n\t\tfor ( let i = 0; i < triangles.length; i ++ ) {\n\n\t\t\tif ( result = this.triangleSphereIntersect( _sphere, triangles[ i ] ) ) {\n\n\t\t\t\thit = true;\n\n\t\t\t\t_sphere.center.add( result.normal.multiplyScalar( result.depth ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( hit ) {\n\n\t\t\tconst collisionVector = _sphere.center.clone().sub( sphere.center );\n\t\t\tconst depth = collisionVector.length();\n\n\t\t\treturn { normal: collisionVector.normalize(), depth: depth };\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Performs a capsule intersection test with this Octree.\n\t *\n\t * @param {Capsule} capsule - The capsule to test.\n\t * @return {Object|boolean} The intersection object. If no intersection\n\t * is detected, the method returns `false`.\n\t */\n\tcapsuleIntersect( capsule ) {\n\n\t\t_capsule.copy( capsule );\n\n\t\tconst triangles = [];\n\t\tlet result, hit = false;\n\n\t\tthis.getCapsuleTriangles( _capsule, triangles );\n\n\t\tfor ( let i = 0; i < triangles.length; i ++ ) {\n\n\t\t\tif ( result = this.triangleCapsuleIntersect( _capsule, triangles[ i ] ) ) {\n\n\t\t\t\thit = true;\n\n\t\t\t\t_capsule.translate( result.normal.multiplyScalar( result.depth ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( hit ) {\n\n\t\t\tconst collisionVector = _capsule.getCenter( _center ).sub( capsule.getCenter( _v1 ) );\n\t\t\tconst depth = collisionVector.length();\n\n\t\t\treturn { normal: collisionVector.normalize(), depth: depth };\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Performs a ray intersection test with this Octree.\n\t *\n\t * @param {Ray} ray - The ray to test.\n\t * @return {Object|boolean} The nearest intersection object. If no intersection\n\t * is detected, the method returns `false`.\n\t */\n\trayIntersect( ray ) {\n\n\t\tconst triangles = [];\n\t\tlet triangle, position, distance = 1e100;\n\n\t\tthis.getRayTriangles( ray, triangles );\n\n\t\tfor ( let i = 0; i < triangles.length; i ++ ) {\n\n\t\t\tconst result = ray.intersectTriangle( triangles[ i ].a, triangles[ i ].b, triangles[ i ].c, true, _v1 );\n\n\t\t\tif ( result ) {\n\n\t\t\t\tconst newdistance = result.sub( ray.origin ).length();\n\n\t\t\t\tif ( distance > newdistance ) {\n\n\t\t\t\t\tposition = result.clone().add( ray.origin );\n\t\t\t\t\tdistance = newdistance;\n\t\t\t\t\ttriangle = triangles[ i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn distance < 1e100 ? { distance: distance, triangle: triangle, position: position } : false;\n\n\t}\n\n\t/**\n\t * Constructs the Octree from the given 3D object.\n\t *\n\t * @param {Object3D} group - The scene graph node.\n\t * @return {Octree} A reference to this Octree.\n\t */\n\tfromGraphNode( group ) {\n\n\t\tgroup.updateWorldMatrix( true, true );\n\n\t\tgroup.traverse( ( obj ) => {\n\n\t\t\tif ( obj.isMesh === true ) {\n\n\t\t\t\tif ( this.layers.test( obj.layers ) ) {\n\n\t\t\t\t\tlet geometry, isTemp = false;\n\n\t\t\t\t\tif ( obj.geometry.index !== null ) {\n\n\t\t\t\t\t\tisTemp = true;\n\t\t\t\t\t\tgeometry = obj.geometry.toNonIndexed();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgeometry = obj.geometry;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\n\t\t\t\t\tfor ( let i = 0; i < positionAttribute.count; i += 3 ) {\n\n\t\t\t\t\t\tconst v1 = new Vector3().fromBufferAttribute( positionAttribute, i );\n\t\t\t\t\t\tconst v2 = new Vector3().fromBufferAttribute( positionAttribute, i + 1 );\n\t\t\t\t\t\tconst v3 = new Vector3().fromBufferAttribute( positionAttribute, i + 2 );\n\n\t\t\t\t\t\tv1.applyMatrix4( obj.matrixWorld );\n\t\t\t\t\t\tv2.applyMatrix4( obj.matrixWorld );\n\t\t\t\t\t\tv3.applyMatrix4( obj.matrixWorld );\n\n\t\t\t\t\t\tthis.addTriangle( new Triangle( v1, v2, v3 ) );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( isTemp ) {\n\n\t\t\t\t\t\tgeometry.dispose();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t\tthis.build();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Clears the Octree by making it empty.\n\t *\n\t * @return {Octree} A reference to this Octree.\n\t */\n\tclear() {\n\n\t\tthis.box = null;\n\t\tthis.bounds.makeEmpty();\n\n\t\tthis.subTrees.length = 0;\n\t\tthis.triangles.length = 0;\n\n\t\treturn this;\n\n\t}\n\n}\n\nexport { Octree };\n", "/**\n * A utility class providing noise functions.\n *\n * The code is based on [Simplex noise demystified](https://web.archive.org/web/20210210162332/http://staffwww.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf)\n * by Stefan Gustavson, 2005.\n *\n * @three_import import { SimplexNoise } from 'three/addons/math/SimplexNoise.js';\n */\nclass SimplexNoise {\n\n\t/**\n\t * Constructs a new simplex noise object.\n\t *\n\t * @param {Object} [r=Math] - A math utility class that holds a `random()` method. This makes it\n\t * possible to pass in custom random number generator.\n\t */\n\tconstructor( r = Math ) {\n\n\t\tthis.grad3 = [[ 1, 1, 0 ], [ - 1, 1, 0 ], [ 1, - 1, 0 ], [ - 1, - 1, 0 ],\n\t\t\t[ 1, 0, 1 ], [ - 1, 0, 1 ], [ 1, 0, - 1 ], [ - 1, 0, - 1 ],\n\t\t\t[ 0, 1, 1 ], [ 0, - 1, 1 ], [ 0, 1, - 1 ], [ 0, - 1, - 1 ]];\n\n\t\tthis.grad4 = [[ 0, 1, 1, 1 ], [ 0, 1, 1, - 1 ], [ 0, 1, - 1, 1 ], [ 0, 1, - 1, - 1 ],\n\t\t\t[ 0, - 1, 1, 1 ], [ 0, - 1, 1, - 1 ], [ 0, - 1, - 1, 1 ], [ 0, - 1, - 1, - 1 ],\n\t\t\t[ 1, 0, 1, 1 ], [ 1, 0, 1, - 1 ], [ 1, 0, - 1, 1 ], [ 1, 0, - 1, - 1 ],\n\t\t\t[ - 1, 0, 1, 1 ], [ - 1, 0, 1, - 1 ], [ - 1, 0, - 1, 1 ], [ - 1, 0, - 1, - 1 ],\n\t\t\t[ 1, 1, 0, 1 ], [ 1, 1, 0, - 1 ], [ 1, - 1, 0, 1 ], [ 1, - 1, 0, - 1 ],\n\t\t\t[ - 1, 1, 0, 1 ], [ - 1, 1, 0, - 1 ], [ - 1, - 1, 0, 1 ], [ - 1, - 1, 0, - 1 ],\n\t\t\t[ 1, 1, 1, 0 ], [ 1, 1, - 1, 0 ], [ 1, - 1, 1, 0 ], [ 1, - 1, - 1, 0 ],\n\t\t\t[ - 1, 1, 1, 0 ], [ - 1, 1, - 1, 0 ], [ - 1, - 1, 1, 0 ], [ - 1, - 1, - 1, 0 ]];\n\n\t\tthis.p = [];\n\n\t\tfor ( let i = 0; i < 256; i ++ ) {\n\n\t\t\tthis.p[ i ] = Math.floor( r.random() * 256 );\n\n\t\t}\n\n\t\t// To remove the need for index wrapping, double the permutation table length\n\t\tthis.perm = [];\n\n\t\tfor ( let i = 0; i < 512; i ++ ) {\n\n\t\t\tthis.perm[ i ] = this.p[ i & 255 ];\n\n\t\t}\n\n\t\t// A lookup table to traverse the simplex around a given point in 4D.\n\t\t// Details can be found where this table is used, in the 4D noise method.\n\t\tthis.simplex = [\n\t\t\t[ 0, 1, 2, 3 ], [ 0, 1, 3, 2 ], [ 0, 0, 0, 0 ], [ 0, 2, 3, 1 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 1, 2, 3, 0 ],\n\t\t\t[ 0, 2, 1, 3 ], [ 0, 0, 0, 0 ], [ 0, 3, 1, 2 ], [ 0, 3, 2, 1 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 1, 3, 2, 0 ],\n\t\t\t[ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ],\n\t\t\t[ 1, 2, 0, 3 ], [ 0, 0, 0, 0 ], [ 1, 3, 0, 2 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 2, 3, 0, 1 ], [ 2, 3, 1, 0 ],\n\t\t\t[ 1, 0, 2, 3 ], [ 1, 0, 3, 2 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 2, 0, 3, 1 ], [ 0, 0, 0, 0 ], [ 2, 1, 3, 0 ],\n\t\t\t[ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ],\n\t\t\t[ 2, 0, 1, 3 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 3, 0, 1, 2 ], [ 3, 0, 2, 1 ], [ 0, 0, 0, 0 ], [ 3, 1, 2, 0 ],\n\t\t\t[ 2, 1, 0, 3 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 0, 0, 0, 0 ], [ 3, 1, 0, 2 ], [ 0, 0, 0, 0 ], [ 3, 2, 0, 1 ], [ 3, 2, 1, 0 ]];\n\n\t}\n\n\t/**\n\t * A 2D simplex noise method.\n\t *\n\t * @param {number} xin - The x coordinate.\n\t * @param {number} yin - The y coordinate.\n\t * @return {number} The noise value.\n\t */\n\tnoise( xin, yin ) {\n\n\t\tlet n0; // Noise contributions from the three corners\n\t\tlet n1;\n\t\tlet n2;\n\t\t// Skew the input space to determine which simplex cell we're in\n\t\tconst F2 = 0.5 * ( Math.sqrt( 3.0 ) - 1.0 );\n\t\tconst s = ( xin + yin ) * F2; // Hairy factor for 2D\n\t\tconst i = Math.floor( xin + s );\n\t\tconst j = Math.floor( yin + s );\n\t\tconst G2 = ( 3.0 - Math.sqrt( 3.0 ) ) / 6.0;\n\t\tconst t = ( i + j ) * G2;\n\t\tconst X0 = i - t; // Unskew the cell origin back to (x,y) space\n\t\tconst Y0 = j - t;\n\t\tconst x0 = xin - X0; // The x,y distances from the cell origin\n\t\tconst y0 = yin - Y0;\n\n\t\t// For the 2D case, the simplex shape is an equilateral triangle.\n\t\t// Determine which simplex we are in.\n\t\tlet i1; // Offsets for second (middle) corner of simplex in (i,j) coords\n\n\t\tlet j1;\n\t\tif ( x0 > y0 ) {\n\n\t\t\ti1 = 1; j1 = 0;\n\n\t\t\t// lower triangle, XY order: (0,0)->(1,0)->(1,1)\n\n\t\t}\telse {\n\n\t\t\ti1 = 0; j1 = 1;\n\n\t\t} // upper triangle, YX order: (0,0)->(0,1)->(1,1)\n\n\t\t// A step of (1,0) in (i,j) means a step of (1-c,-c) in (x,y), and\n\t\t// a step of (0,1) in (i,j) means a step of (-c,1-c) in (x,y), where\n\t\t// c = (3-sqrt(3))/6\n\t\tconst x1 = x0 - i1 + G2; // Offsets for middle corner in (x,y) unskewed coords\n\t\tconst y1 = y0 - j1 + G2;\n\t\tconst x2 = x0 - 1.0 + 2.0 * G2; // Offsets for last corner in (x,y) unskewed coords\n\t\tconst y2 = y0 - 1.0 + 2.0 * G2;\n\t\t// Work out the hashed gradient indices of the three simplex corners\n\t\tconst ii = i & 255;\n\t\tconst jj = j & 255;\n\t\tconst gi0 = this.perm[ ii + this.perm[ jj ] ] % 12;\n\t\tconst gi1 = this.perm[ ii + i1 + this.perm[ jj + j1 ] ] % 12;\n\t\tconst gi2 = this.perm[ ii + 1 + this.perm[ jj + 1 ] ] % 12;\n\t\t// Calculate the contribution from the three corners\n\t\tlet t0 = 0.5 - x0 * x0 - y0 * y0;\n\t\tif ( t0 < 0 ) n0 = 0.0;\n\t\telse {\n\n\t\t\tt0 *= t0;\n\t\t\tn0 = t0 * t0 * this._dot( this.grad3[ gi0 ], x0, y0 ); // (x,y) of grad3 used for 2D gradient\n\n\t\t}\n\n\t\tlet t1 = 0.5 - x1 * x1 - y1 * y1;\n\t\tif ( t1 < 0 ) n1 = 0.0;\n\t\telse {\n\n\t\t\tt1 *= t1;\n\t\t\tn1 = t1 * t1 * this._dot( this.grad3[ gi1 ], x1, y1 );\n\n\t\t}\n\n\t\tlet t2 = 0.5 - x2 * x2 - y2 * y2;\n\t\tif ( t2 < 0 ) n2 = 0.0;\n\t\telse {\n\n\t\t\tt2 *= t2;\n\t\t\tn2 = t2 * t2 * this._dot( this.grad3[ gi2 ], x2, y2 );\n\n\t\t}\n\n\t\t// Add contributions from each corner to get the final noise value.\n\t\t// The result is scaled to return values in the interval [-1,1].\n\t\treturn 70.0 * ( n0 + n1 + n2 );\n\n\t}\n\n\t/**\n\t * A 3D simplex noise method.\n\t *\n\t * @param {number} xin - The x coordinate.\n\t * @param {number} yin - The y coordinate.\n\t * @param {number} zin - The z coordinate.\n\t * @return {number} The noise value.\n\t */\n\tnoise3d( xin, yin, zin ) {\n\n\t\tlet n0; // Noise contributions from the four corners\n\t\tlet n1;\n\t\tlet n2;\n\t\tlet n3;\n\t\t// Skew the input space to determine which simplex cell we're in\n\t\tconst F3 = 1.0 / 3.0;\n\t\tconst s = ( xin + yin + zin ) * F3; // Very nice and simple skew factor for 3D\n\t\tconst i = Math.floor( xin + s );\n\t\tconst j = Math.floor( yin + s );\n\t\tconst k = Math.floor( zin + s );\n\t\tconst G3 = 1.0 / 6.0; // Very nice and simple unskew factor, too\n\t\tconst t = ( i + j + k ) * G3;\n\t\tconst X0 = i - t; // Unskew the cell origin back to (x,y,z) space\n\t\tconst Y0 = j - t;\n\t\tconst Z0 = k - t;\n\t\tconst x0 = xin - X0; // The x,y,z distances from the cell origin\n\t\tconst y0 = yin - Y0;\n\t\tconst z0 = zin - Z0;\n\n\t\t// For the 3D case, the simplex shape is a slightly irregular tetrahedron.\n\t\t// Determine which simplex we are in.\n\t\tlet i1; // Offsets for second corner of simplex in (i,j,k) coords\n\n\t\tlet j1;\n\t\tlet k1;\n\t\tlet i2; // Offsets for third corner of simplex in (i,j,k) coords\n\t\tlet j2;\n\t\tlet k2;\n\t\tif ( x0 >= y0 ) {\n\n\t\t\tif ( y0 >= z0 ) {\n\n\t\t\t\ti1 = 1; j1 = 0; k1 = 0; i2 = 1; j2 = 1; k2 = 0;\n\n\t\t\t\t// X Y Z order\n\n\t\t\t} else if ( x0 >= z0 ) {\n\n\t\t\t\ti1 = 1; j1 = 0; k1 = 0; i2 = 1; j2 = 0; k2 = 1;\n\n\t\t\t\t// X Z Y order\n\n\t\t\t} else {\n\n\t\t\t\ti1 = 0; j1 = 0; k1 = 1; i2 = 1; j2 = 0; k2 = 1;\n\n\t\t\t} // Z X Y order\n\n\t\t} else { // x0<y0\n\n\t\t\tif ( y0 < z0 ) {\n\n\t\t\t\ti1 = 0; j1 = 0; k1 = 1; i2 = 0; j2 = 1; k2 = 1;\n\n\t\t\t\t// Z Y X order\n\n\t\t\t} else if ( x0 < z0 ) {\n\n\t\t\t\ti1 = 0; j1 = 1; k1 = 0; i2 = 0; j2 = 1; k2 = 1;\n\n\t\t\t\t// Y Z X order\n\n\t\t\t} else {\n\n\t\t\t\ti1 = 0; j1 = 1; k1 = 0; i2 = 1; j2 = 1; k2 = 0;\n\n\t\t\t} // Y X Z order\n\n\t\t}\n\n\t\t// A step of (1,0,0) in (i,j,k) means a step of (1-c,-c,-c) in (x,y,z),\n\t\t// a step of (0,1,0) in (i,j,k) means a step of (-c,1-c,-c) in (x,y,z), and\n\t\t// a step of (0,0,1) in (i,j,k) means a step of (-c,-c,1-c) in (x,y,z), where\n\t\t// c = 1/6.\n\t\tconst x1 = x0 - i1 + G3; // Offsets for second corner in (x,y,z) coords\n\t\tconst y1 = y0 - j1 + G3;\n\t\tconst z1 = z0 - k1 + G3;\n\t\tconst x2 = x0 - i2 + 2.0 * G3; // Offsets for third corner in (x,y,z) coords\n\t\tconst y2 = y0 - j2 + 2.0 * G3;\n\t\tconst z2 = z0 - k2 + 2.0 * G3;\n\t\tconst x3 = x0 - 1.0 + 3.0 * G3; // Offsets for last corner in (x,y,z) coords\n\t\tconst y3 = y0 - 1.0 + 3.0 * G3;\n\t\tconst z3 = z0 - 1.0 + 3.0 * G3;\n\t\t// Work out the hashed gradient indices of the four simplex corners\n\t\tconst ii = i & 255;\n\t\tconst jj = j & 255;\n\t\tconst kk = k & 255;\n\t\tconst gi0 = this.perm[ ii + this.perm[ jj + this.perm[ kk ] ] ] % 12;\n\t\tconst gi1 = this.perm[ ii + i1 + this.perm[ jj + j1 + this.perm[ kk + k1 ] ] ] % 12;\n\t\tconst gi2 = this.perm[ ii + i2 + this.perm[ jj + j2 + this.perm[ kk + k2 ] ] ] % 12;\n\t\tconst gi3 = this.perm[ ii + 1 + this.perm[ jj + 1 + this.perm[ kk + 1 ] ] ] % 12;\n\t\t// Calculate the contribution from the four corners\n\t\tlet t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0;\n\t\tif ( t0 < 0 ) n0 = 0.0;\n\t\telse {\n\n\t\t\tt0 *= t0;\n\t\t\tn0 = t0 * t0 * this._dot3( this.grad3[ gi0 ], x0, y0, z0 );\n\n\t\t}\n\n\t\tlet t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1;\n\t\tif ( t1 < 0 ) n1 = 0.0;\n\t\telse {\n\n\t\t\tt1 *= t1;\n\t\t\tn1 = t1 * t1 * this._dot3( this.grad3[ gi1 ], x1, y1, z1 );\n\n\t\t}\n\n\t\tlet t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2;\n\t\tif ( t2 < 0 ) n2 = 0.0;\n\t\telse {\n\n\t\t\tt2 *= t2;\n\t\t\tn2 = t2 * t2 * this._dot3( this.grad3[ gi2 ], x2, y2, z2 );\n\n\t\t}\n\n\t\tlet t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3;\n\t\tif ( t3 < 0 ) n3 = 0.0;\n\t\telse {\n\n\t\t\tt3 *= t3;\n\t\t\tn3 = t3 * t3 * this._dot3( this.grad3[ gi3 ], x3, y3, z3 );\n\n\t\t}\n\n\t\t// Add contributions from each corner to get the final noise value.\n\t\t// The result is scaled to stay just inside [-1,1]\n\t\treturn 32.0 * ( n0 + n1 + n2 + n3 );\n\n\t}\n\n\t/**\n\t * A 4D simplex noise method.\n\t *\n\t * @param {number} x - The x coordinate.\n\t * @param {number} y - The y coordinate.\n\t * @param {number} z - The z coordinate.\n\t * @param {number} w - The w coordinate.\n\t * @return {number} The noise value.\n\t */\n\tnoise4d( x, y, z, w ) {\n\n\t\t// For faster and easier lookups\n\t\tconst grad4 = this.grad4;\n\t\tconst simplex = this.simplex;\n\t\tconst perm = this.perm;\n\n\t\t// The skewing and unskewing factors are hairy again for the 4D case\n\t\tconst F4 = ( Math.sqrt( 5.0 ) - 1.0 ) / 4.0;\n\t\tconst G4 = ( 5.0 - Math.sqrt( 5.0 ) ) / 20.0;\n\t\tlet n0; // Noise contributions from the five corners\n\t\tlet n1;\n\t\tlet n2;\n\t\tlet n3;\n\t\tlet n4;\n\t\t// Skew the (x,y,z,w) space to determine which cell of 24 simplices we're in\n\t\tconst s = ( x + y + z + w ) * F4; // Factor for 4D skewing\n\t\tconst i = Math.floor( x + s );\n\t\tconst j = Math.floor( y + s );\n\t\tconst k = Math.floor( z + s );\n\t\tconst l = Math.floor( w + s );\n\t\tconst t = ( i + j + k + l ) * G4; // Factor for 4D unskewing\n\t\tconst X0 = i - t; // Unskew the cell origin back to (x,y,z,w) space\n\t\tconst Y0 = j - t;\n\t\tconst Z0 = k - t;\n\t\tconst W0 = l - t;\n\t\tconst x0 = x - X0; // The x,y,z,w distances from the cell origin\n\t\tconst y0 = y - Y0;\n\t\tconst z0 = z - Z0;\n\t\tconst w0 = w - W0;\n\n\t\t// For the 4D case, the simplex is a 4D shape I won't even try to describe.\n\t\t// To find out which of the 24 possible simplices we're in, we need to\n\t\t// determine the magnitude ordering of x0, y0, z0 and w0.\n\t\t// The method below is a good way of finding the ordering of x,y,z,w and\n\t\t// then find the correct traversal order for the simplex we\u2019re in.\n\t\t// First, six pair-wise comparisons are performed between each possible pair\n\t\t// of the four coordinates, and the results are used to add up binary bits\n\t\t// for an integer index.\n\t\tconst c1 = ( x0 > y0 ) ? 32 : 0;\n\t\tconst c2 = ( x0 > z0 ) ? 16 : 0;\n\t\tconst c3 = ( y0 > z0 ) ? 8 : 0;\n\t\tconst c4 = ( x0 > w0 ) ? 4 : 0;\n\t\tconst c5 = ( y0 > w0 ) ? 2 : 0;\n\t\tconst c6 = ( z0 > w0 ) ? 1 : 0;\n\t\tconst c = c1 + c2 + c3 + c4 + c5 + c6;\n\n\t\t// simplex[c] is a 4-vector with the numbers 0, 1, 2 and 3 in some order.\n\t\t// Many values of c will never occur, since e.g. x>y>z>w makes x<z, y<w and x<w\n\t\t// impossible. Only the 24 indices which have non-zero entries make any sense.\n\t\t// We use a thresholding to set the coordinates in turn from the largest magnitude.\n\t\t// The number 3 in the \"simplex\" array is at the position of the largest coordinate.\n\t\tconst i1 = simplex[ c ][ 0 ] >= 3 ? 1 : 0;\n\t\tconst j1 = simplex[ c ][ 1 ] >= 3 ? 1 : 0;\n\t\tconst k1 = simplex[ c ][ 2 ] >= 3 ? 1 : 0;\n\t\tconst l1 = simplex[ c ][ 3 ] >= 3 ? 1 : 0;\n\t\t// The number 2 in the \"simplex\" array is at the second largest coordinate.\n\t\tconst i2 = simplex[ c ][ 0 ] >= 2 ? 1 : 0;\n\t\tconst j2 = simplex[ c ][ 1 ] >= 2 ? 1 : 0;\n\t\tconst k2 = simplex[ c ][ 2 ] >= 2 ? 1 : 0;\n\t\tconst l2 = simplex[ c ][ 3 ] >= 2 ? 1 : 0;\n\t\t// The number 1 in the \"simplex\" array is at the second smallest coordinate.\n\t\tconst i3 = simplex[ c ][ 0 ] >= 1 ? 1 : 0;\n\t\tconst j3 = simplex[ c ][ 1 ] >= 1 ? 1 : 0;\n\t\tconst k3 = simplex[ c ][ 2 ] >= 1 ? 1 : 0;\n\t\tconst l3 = simplex[ c ][ 3 ] >= 1 ? 1 : 0;\n\t\t// The fifth corner has all coordinate offsets = 1, so no need to look that up.\n\t\tconst x1 = x0 - i1 + G4; // Offsets for second corner in (x,y,z,w) coords\n\t\tconst y1 = y0 - j1 + G4;\n\t\tconst z1 = z0 - k1 + G4;\n\t\tconst w1 = w0 - l1 + G4;\n\t\tconst x2 = x0 - i2 + 2.0 * G4; // Offsets for third corner in (x,y,z,w) coords\n\t\tconst y2 = y0 - j2 + 2.0 * G4;\n\t\tconst z2 = z0 - k2 + 2.0 * G4;\n\t\tconst w2 = w0 - l2 + 2.0 * G4;\n\t\tconst x3 = x0 - i3 + 3.0 * G4; // Offsets for fourth corner in (x,y,z,w) coords\n\t\tconst y3 = y0 - j3 + 3.0 * G4;\n\t\tconst z3 = z0 - k3 + 3.0 * G4;\n\t\tconst w3 = w0 - l3 + 3.0 * G4;\n\t\tconst x4 = x0 - 1.0 + 4.0 * G4; // Offsets for last corner in (x,y,z,w) coords\n\t\tconst y4 = y0 - 1.0 + 4.0 * G4;\n\t\tconst z4 = z0 - 1.0 + 4.0 * G4;\n\t\tconst w4 = w0 - 1.0 + 4.0 * G4;\n\t\t// Work out the hashed gradient indices of the five simplex corners\n\t\tconst ii = i & 255;\n\t\tconst jj = j & 255;\n\t\tconst kk = k & 255;\n\t\tconst ll = l & 255;\n\t\tconst gi0 = perm[ ii + perm[ jj + perm[ kk + perm[ ll ] ] ] ] % 32;\n\t\tconst gi1 = perm[ ii + i1 + perm[ jj + j1 + perm[ kk + k1 + perm[ ll + l1 ] ] ] ] % 32;\n\t\tconst gi2 = perm[ ii + i2 + perm[ jj + j2 + perm[ kk + k2 + perm[ ll + l2 ] ] ] ] % 32;\n\t\tconst gi3 = perm[ ii + i3 + perm[ jj + j3 + perm[ kk + k3 + perm[ ll + l3 ] ] ] ] % 32;\n\t\tconst gi4 = perm[ ii + 1 + perm[ jj + 1 + perm[ kk + 1 + perm[ ll + 1 ] ] ] ] % 32;\n\t\t// Calculate the contribution from the five corners\n\t\tlet t0 = 0.6 - x0 * x0 - y0 * y0 - z0 * z0 - w0 * w0;\n\t\tif ( t0 < 0 ) n0 = 0.0;\n\t\telse {\n\n\t\t\tt0 *= t0;\n\t\t\tn0 = t0 * t0 * this._dot4( grad4[ gi0 ], x0, y0, z0, w0 );\n\n\t\t}\n\n\t\tlet t1 = 0.6 - x1 * x1 - y1 * y1 - z1 * z1 - w1 * w1;\n\t\tif ( t1 < 0 ) n1 = 0.0;\n\t\telse {\n\n\t\t\tt1 *= t1;\n\t\t\tn1 = t1 * t1 * this._dot4( grad4[ gi1 ], x1, y1, z1, w1 );\n\n\t\t}\n\n\t\tlet t2 = 0.6 - x2 * x2 - y2 * y2 - z2 * z2 - w2 * w2;\n\t\tif ( t2 < 0 ) n2 = 0.0;\n\t\telse {\n\n\t\t\tt2 *= t2;\n\t\t\tn2 = t2 * t2 * this._dot4( grad4[ gi2 ], x2, y2, z2, w2 );\n\n\t\t}\n\n\t\tlet t3 = 0.6 - x3 * x3 - y3 * y3 - z3 * z3 - w3 * w3;\n\t\tif ( t3 < 0 ) n3 = 0.0;\n\t\telse {\n\n\t\t\tt3 *= t3;\n\t\t\tn3 = t3 * t3 * this._dot4( grad4[ gi3 ], x3, y3, z3, w3 );\n\n\t\t}\n\n\t\tlet t4 = 0.6 - x4 * x4 - y4 * y4 - z4 * z4 - w4 * w4;\n\t\tif ( t4 < 0 ) n4 = 0.0;\n\t\telse {\n\n\t\t\tt4 *= t4;\n\t\t\tn4 = t4 * t4 * this._dot4( grad4[ gi4 ], x4, y4, z4, w4 );\n\n\t\t}\n\n\t\t// Sum up and scale the result to cover the range [-1,1]\n\t\treturn 27.0 * ( n0 + n1 + n2 + n3 + n4 );\n\n\t}\n\n\t// private\n\n\t_dot( g, x, y ) {\n\n\t\treturn g[ 0 ] * x + g[ 1 ] * y;\n\n\t}\n\n\t_dot3( g, x, y, z ) {\n\n\t\treturn g[ 0 ] * x + g[ 1 ] * y + g[ 2 ] * z;\n\n\t}\n\n\t_dot4( g, x, y, z, w ) {\n\n\t\treturn g[ 0 ] * x + g[ 1 ] * y + g[ 2 ] * z + g[ 3 ] * w;\n\n\t}\n\n}\n\nexport { SimplexNoise };\n", "import {\n\tLine3,\n\tMesh,\n\tPlane,\n\tVector3\n} from 'three';\nimport { ConvexGeometry } from '../geometries/ConvexGeometry.js';\n\nconst _v1 = new Vector3();\n\n/**\n * This class can be used to subdivide a convex Geometry object into pieces.\n *\n * Use the function prepareBreakableObject to prepare a Mesh object to be broken.\n * Then, call the various functions to subdivide the object (subdivideByImpact, cutByPlane).\n * Sub-objects that are product of subdivision don't need prepareBreakableObject to be called on them.\n *\n * Requisites for the object:\n * - Mesh object must have a buffer geometry and a material.\n * - Vertex normals must be planar (not smoothed).\n * - The geometry must be convex (this is not checked in the library). You can create convex\n * geometries with {@link ConvexGeometry}. The {@link BoxGeometry}, {@link SphereGeometry} and other\n * convex primitives can also be used.\n *\n * Note: This lib adds member variables to object's userData member (see prepareBreakableObject function)\n * Use with caution and read the code when using with other libs.\n *\n * @three_import import { ConvexObjectBreaker } from 'three/addons/misc/ConvexObjectBreaker.js';\n */\nclass ConvexObjectBreaker {\n\n\t/**\n\t * Constructs a new convex object breaker.\n\t *\n\t * @param {number} [minSizeForBreak=1.4] - Min size a debris can have to break.\n \t * @param {number} [smallDelta=0.0001] - Max distance to consider that a point belongs to a plane.\n\t */\n\tconstructor( minSizeForBreak = 1.4, smallDelta = 0.0001 ) {\n\n\t\tthis.minSizeForBreak = minSizeForBreak;\n\t\tthis.smallDelta = smallDelta;\n\n\t\tthis.tempLine1 = new Line3();\n\t\tthis.tempPlane1 = new Plane();\n\t\tthis.tempPlane2 = new Plane();\n\t\tthis.tempPlane_Cut = new Plane();\n\t\tthis.tempCM1 = new Vector3();\n\t\tthis.tempCM2 = new Vector3();\n\t\tthis.tempVector3 = new Vector3();\n\t\tthis.tempVector3_2 = new Vector3();\n\t\tthis.tempVector3_3 = new Vector3();\n\t\tthis.tempVector3_P0 = new Vector3();\n\t\tthis.tempVector3_P1 = new Vector3();\n\t\tthis.tempVector3_P2 = new Vector3();\n\t\tthis.tempVector3_N0 = new Vector3();\n\t\tthis.tempVector3_N1 = new Vector3();\n\t\tthis.tempVector3_AB = new Vector3();\n\t\tthis.tempVector3_CB = new Vector3();\n\t\tthis.tempResultObjects = { object1: null, object2: null };\n\n\t\tthis.segments = [];\n\t\tconst n = 30 * 30;\n\t\tfor ( let i = 0; i < n; i ++ ) this.segments[ i ] = false;\n\n\t}\n\n\t/**\n\t * Must be called for all 3D objects that should be breakable.\n\t *\n\t * @param {Object3D} object - The 3D object. It must have a convex geometry.\n\t * @param {number} mass - The 3D object's mass in kg. Must be greater than `0`.\n\t * @param {Vector3} velocity - The 3D object's velocity.\n\t * @param {Vector3} angularVelocity - The 3D object's angular velocity.\n\t * @param {boolean} breakable - Whether the 3D object is breakable or not.\n\t */\n\tprepareBreakableObject( object, mass, velocity, angularVelocity, breakable ) {\n\n\t\t// object is a Object3d (normally a Mesh), must have a buffer geometry, and it must be convex.\n\t\t// Its material property is propagated to its children (sub-pieces)\n\t\t// mass must be > 0\n\n\t\tconst userData = object.userData;\n\t\tuserData.mass = mass;\n\t\tuserData.velocity = velocity.clone();\n\t\tuserData.angularVelocity = angularVelocity.clone();\n\t\tuserData.breakable = breakable;\n\n\t}\n\n\t/**\n\t * Subdivides the given 3D object into pieces by an impact (meaning another object hits\n\t * the given 3D object at a certain surface point).\n\t *\n\t * @param {Object3D} object - The 3D object to subdivide.\n\t * @param {Vector3} pointOfImpact - The point of impact.\n\t * @param {Vector3} normal - The impact normal.\n\t * @param {number} maxRadialIterations - Iterations for radial cuts.\n\t * @param {number} maxRandomIterations - Max random iterations for not-radial cuts.\n\t * @return {Array<Object3D>} The array of pieces.\n\t */\n\tsubdivideByImpact( object, pointOfImpact, normal, maxRadialIterations, maxRandomIterations ) {\n\n\t\tconst debris = [];\n\n\t\tconst tempPlane1 = this.tempPlane1;\n\t\tconst tempPlane2 = this.tempPlane2;\n\n\t\tthis.tempVector3.addVectors( pointOfImpact, normal );\n\t\ttempPlane1.setFromCoplanarPoints( pointOfImpact, object.position, this.tempVector3 );\n\n\t\tconst maxTotalIterations = maxRandomIterations + maxRadialIterations;\n\n\t\tconst scope = this;\n\n\t\tfunction subdivideRadial( subObject, startAngle, endAngle, numIterations ) {\n\n\t\t\tif ( Math.random() < numIterations * 0.05 || numIterations > maxTotalIterations ) {\n\n\t\t\t\tdebris.push( subObject );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tlet angle = Math.PI;\n\n\t\t\tif ( numIterations === 0 ) {\n\n\t\t\t\ttempPlane2.normal.copy( tempPlane1.normal );\n\t\t\t\ttempPlane2.constant = tempPlane1.constant;\n\n\t\t\t} else {\n\n\t\t\t\tif ( numIterations <= maxRadialIterations ) {\n\n\t\t\t\t\tangle = ( endAngle - startAngle ) * ( 0.2 + 0.6 * Math.random() ) + startAngle;\n\n\t\t\t\t\t// Rotate tempPlane2 at impact point around normal axis and the angle\n\t\t\t\t\tscope.tempVector3_2.copy( object.position ).sub( pointOfImpact ).applyAxisAngle( normal, angle ).add( pointOfImpact );\n\t\t\t\t\ttempPlane2.setFromCoplanarPoints( pointOfImpact, scope.tempVector3, scope.tempVector3_2 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tangle = ( ( 0.5 * ( numIterations & 1 ) ) + 0.2 * ( 2 - Math.random() ) ) * Math.PI;\n\n\t\t\t\t\t// Rotate tempPlane2 at object position around normal axis and the angle\n\t\t\t\t\tscope.tempVector3_2.copy( pointOfImpact ).sub( subObject.position ).applyAxisAngle( normal, angle ).add( subObject.position );\n\t\t\t\t\tscope.tempVector3_3.copy( normal ).add( subObject.position );\n\t\t\t\t\ttempPlane2.setFromCoplanarPoints( subObject.position, scope.tempVector3_3, scope.tempVector3_2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Perform the cut\n\t\t\tscope.cutByPlane( subObject, tempPlane2, scope.tempResultObjects );\n\n\t\t\tconst obj1 = scope.tempResultObjects.object1;\n\t\t\tconst obj2 = scope.tempResultObjects.object2;\n\n\t\t\tif ( obj1 ) {\n\n\t\t\t\tsubdivideRadial( obj1, startAngle, angle, numIterations + 1 );\n\n\t\t\t}\n\n\t\t\tif ( obj2 ) {\n\n\t\t\t\tsubdivideRadial( obj2, angle, endAngle, numIterations + 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tsubdivideRadial( object, 0, 2 * Math.PI, 0 );\n\n\t\treturn debris;\n\n\t}\n\n\t/**\n\t * Subdivides the given 3D object into pieces by a plane.\n\t *\n\t * @param {Object3D} object - The 3D object to subdivide.\n\t * @param {Plane} plane - The plane to cut the 3D object.\n\t * @param {{object1:?Mesh,object2:?Mesh}} output - An object that stores the pieces.\n\t * @return {number} The number of pieces.\n\t */\n\tcutByPlane( object, plane, output ) {\n\n\t\t// Returns breakable objects in output.object1 and output.object2 members, the resulting 2 pieces of the cut.\n\t\t// object2 can be null if the plane doesn't cut the object.\n\t\t// object1 can be null only in case of internal error\n\t\t// Returned value is number of pieces, 0 for error.\n\n\t\tconst geometry = object.geometry;\n\t\tconst coords = geometry.attributes.position.array;\n\t\tconst normals = geometry.attributes.normal.array;\n\n\t\tconst numPoints = coords.length / 3;\n\t\tlet numFaces = numPoints / 3;\n\n\t\tlet indices = geometry.getIndex();\n\n\t\tif ( indices ) {\n\n\t\t\tindices = indices.array;\n\t\t\tnumFaces = indices.length / 3;\n\n\t\t}\n\n\t\tfunction getVertexIndex( faceIdx, vert ) {\n\n\t\t\t// vert = 0, 1 or 2.\n\n\t\t\tconst idx = faceIdx * 3 + vert;\n\n\t\t\treturn indices ? indices[ idx ] : idx;\n\n\t\t}\n\n\t\tconst points1 = [];\n\t\tconst points2 = [];\n\n\t\tconst delta = this.smallDelta;\n\n\t\t// Reset segments mark\n\t\tconst numPointPairs = numPoints * numPoints;\n\t\tfor ( let i = 0; i < numPointPairs; i ++ ) this.segments[ i ] = false;\n\n\t\tconst p0 = this.tempVector3_P0;\n\t\tconst p1 = this.tempVector3_P1;\n\t\tconst n0 = this.tempVector3_N0;\n\t\tconst n1 = this.tempVector3_N1;\n\n\t\t// Iterate through the faces to mark edges shared by coplanar faces\n\t\tfor ( let i = 0; i < numFaces - 1; i ++ ) {\n\n\t\t\tconst a1 = getVertexIndex( i, 0 );\n\t\t\tconst b1 = getVertexIndex( i, 1 );\n\t\t\tconst c1 = getVertexIndex( i, 2 );\n\n\t\t\t// Assuming all 3 vertices have the same normal\n\t\t\tn0.set( normals[ a1 ], normals[ a1 ] + 1, normals[ a1 ] + 2 );\n\n\t\t\tfor ( let j = i + 1; j < numFaces; j ++ ) {\n\n\t\t\t\tconst a2 = getVertexIndex( j, 0 );\n\t\t\t\tconst b2 = getVertexIndex( j, 1 );\n\t\t\t\tconst c2 = getVertexIndex( j, 2 );\n\n\t\t\t\t// Assuming all 3 vertices have the same normal\n\t\t\t\tn1.set( normals[ a2 ], normals[ a2 ] + 1, normals[ a2 ] + 2 );\n\n\t\t\t\tconst coplanar = 1 - n0.dot( n1 ) < delta;\n\n\t\t\t\tif ( coplanar ) {\n\n\t\t\t\t\tif ( a1 === a2 || a1 === b2 || a1 === c2 ) {\n\n\t\t\t\t\t\tif ( b1 === a2 || b1 === b2 || b1 === c2 ) {\n\n\t\t\t\t\t\t\tthis.segments[ a1 * numPoints + b1 ] = true;\n\t\t\t\t\t\t\tthis.segments[ b1 * numPoints + a1 ] = true;\n\n\t\t\t\t\t\t}\telse {\n\n\t\t\t\t\t\t\tthis.segments[ c1 * numPoints + a1 ] = true;\n\t\t\t\t\t\t\tthis.segments[ a1 * numPoints + c1 ] = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\telse if ( b1 === a2 || b1 === b2 || b1 === c2 ) {\n\n\t\t\t\t\t\tthis.segments[ c1 * numPoints + b1 ] = true;\n\t\t\t\t\t\tthis.segments[ b1 * numPoints + c1 ] = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Transform the plane to object local space\n\t\tconst localPlane = this.tempPlane_Cut;\n\t\tobject.updateMatrix();\n\t\tConvexObjectBreaker.transformPlaneToLocalSpace( plane, object.matrix, localPlane );\n\n\t\t// Iterate through the faces adding points to both pieces\n\t\tfor ( let i = 0; i < numFaces; i ++ ) {\n\n\t\t\tconst va = getVertexIndex( i, 0 );\n\t\t\tconst vb = getVertexIndex( i, 1 );\n\t\t\tconst vc = getVertexIndex( i, 2 );\n\n\t\t\tfor ( let segment = 0; segment < 3; segment ++ ) {\n\n\t\t\t\tconst i0 = segment === 0 ? va : ( segment === 1 ? vb : vc );\n\t\t\t\tconst i1 = segment === 0 ? vb : ( segment === 1 ? vc : va );\n\n\t\t\t\tconst segmentState = this.segments[ i0 * numPoints + i1 ];\n\n\t\t\t\tif ( segmentState ) continue; // The segment already has been processed in another face\n\n\t\t\t\t// Mark segment as processed (also inverted segment)\n\t\t\t\tthis.segments[ i0 * numPoints + i1 ] = true;\n\t\t\t\tthis.segments[ i1 * numPoints + i0 ] = true;\n\n\t\t\t\tp0.set( coords[ 3 * i0 ], coords[ 3 * i0 + 1 ], coords[ 3 * i0 + 2 ] );\n\t\t\t\tp1.set( coords[ 3 * i1 ], coords[ 3 * i1 + 1 ], coords[ 3 * i1 + 2 ] );\n\n\t\t\t\t// mark: 1 for negative side, 2 for positive side, 3 for coplanar point\n\t\t\t\tlet mark0 = 0;\n\n\t\t\t\tlet d = localPlane.distanceToPoint( p0 );\n\n\t\t\t\tif ( d > delta ) {\n\n\t\t\t\t\tmark0 = 2;\n\t\t\t\t\tpoints2.push( p0.clone() );\n\n\t\t\t\t} else if ( d < - delta ) {\n\n\t\t\t\t\tmark0 = 1;\n\t\t\t\t\tpoints1.push( p0.clone() );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tmark0 = 3;\n\t\t\t\t\tpoints1.push( p0.clone() );\n\t\t\t\t\tpoints2.push( p0.clone() );\n\n\t\t\t\t}\n\n\t\t\t\t// mark: 1 for negative side, 2 for positive side, 3 for coplanar point\n\t\t\t\tlet mark1 = 0;\n\n\t\t\t\td = localPlane.distanceToPoint( p1 );\n\n\t\t\t\tif ( d > delta ) {\n\n\t\t\t\t\tmark1 = 2;\n\t\t\t\t\tpoints2.push( p1.clone() );\n\n\t\t\t\t} else if ( d < - delta ) {\n\n\t\t\t\t\tmark1 = 1;\n\t\t\t\t\tpoints1.push( p1.clone() );\n\n\t\t\t\t}\telse {\n\n\t\t\t\t\tmark1 = 3;\n\t\t\t\t\tpoints1.push( p1.clone() );\n\t\t\t\t\tpoints2.push( p1.clone() );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ( mark0 === 1 && mark1 === 2 ) || ( mark0 === 2 && mark1 === 1 ) ) {\n\n\t\t\t\t\t// Intersection of segment with the plane\n\n\t\t\t\t\tthis.tempLine1.start.copy( p0 );\n\t\t\t\t\tthis.tempLine1.end.copy( p1 );\n\n\t\t\t\t\tlet intersection = new Vector3();\n\t\t\t\t\tintersection = localPlane.intersectLine( this.tempLine1, intersection );\n\n\t\t\t\t\tif ( intersection === null ) {\n\n\t\t\t\t\t\t// Shouldn't happen\n\t\t\t\t\t\tconsole.error( 'Internal error: segment does not intersect plane.' );\n\t\t\t\t\t\toutput.segmentedObject1 = null;\n\t\t\t\t\t\toutput.segmentedObject2 = null;\n\t\t\t\t\t\treturn 0;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tpoints1.push( intersection );\n\t\t\t\t\tpoints2.push( intersection.clone() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Calculate debris mass (very fast and imprecise):\n\t\tconst newMass = object.userData.mass * 0.5;\n\n\t\t// Calculate debris Center of Mass (again fast and imprecise)\n\t\tthis.tempCM1.set( 0, 0, 0 );\n\t\tlet radius1 = 0;\n\t\tconst numPoints1 = points1.length;\n\n\t\tif ( numPoints1 > 0 ) {\n\n\t\t\tfor ( let i = 0; i < numPoints1; i ++ ) this.tempCM1.add( points1[ i ] );\n\n\t\t\tthis.tempCM1.divideScalar( numPoints1 );\n\t\t\tfor ( let i = 0; i < numPoints1; i ++ ) {\n\n\t\t\t\tconst p = points1[ i ];\n\t\t\t\tp.sub( this.tempCM1 );\n\t\t\t\tradius1 = Math.max( radius1, p.x, p.y, p.z );\n\n\t\t\t}\n\n\t\t\tthis.tempCM1.add( object.position );\n\n\t\t}\n\n\t\tthis.tempCM2.set( 0, 0, 0 );\n\t\tlet radius2 = 0;\n\t\tconst numPoints2 = points2.length;\n\t\tif ( numPoints2 > 0 ) {\n\n\t\t\tfor ( let i = 0; i < numPoints2; i ++ ) this.tempCM2.add( points2[ i ] );\n\n\t\t\tthis.tempCM2.divideScalar( numPoints2 );\n\t\t\tfor ( let i = 0; i < numPoints2; i ++ ) {\n\n\t\t\t\tconst p = points2[ i ];\n\t\t\t\tp.sub( this.tempCM2 );\n\t\t\t\tradius2 = Math.max( radius2, p.x, p.y, p.z );\n\n\t\t\t}\n\n\t\t\tthis.tempCM2.add( object.position );\n\n\t\t}\n\n\t\tlet object1 = null;\n\t\tlet object2 = null;\n\n\t\tlet numObjects = 0;\n\n\t\tif ( numPoints1 > 4 ) {\n\n\t\t\tobject1 = new Mesh( new ConvexGeometry( points1 ), object.material );\n\t\t\tobject1.position.copy( this.tempCM1 );\n\t\t\tobject1.quaternion.copy( object.quaternion );\n\n\t\t\tthis.prepareBreakableObject( object1, newMass, object.userData.velocity, object.userData.angularVelocity, 2 * radius1 > this.minSizeForBreak );\n\n\t\t\tnumObjects ++;\n\n\t\t}\n\n\t\tif ( numPoints2 > 4 ) {\n\n\t\t\tobject2 = new Mesh( new ConvexGeometry( points2 ), object.material );\n\t\t\tobject2.position.copy( this.tempCM2 );\n\t\t\tobject2.quaternion.copy( object.quaternion );\n\n\t\t\tthis.prepareBreakableObject( object2, newMass, object.userData.velocity, object.userData.angularVelocity, 2 * radius2 > this.minSizeForBreak );\n\n\t\t\tnumObjects ++;\n\n\t\t}\n\n\t\toutput.object1 = object1;\n\t\toutput.object2 = object2;\n\n\t\treturn numObjects;\n\n\t}\n\n\t// internal helpers\n\n\tstatic transformFreeVector( v, m ) {\n\n\t\t// input:\n\t\t// vector interpreted as a free vector\n\t\t// THREE.Matrix4 orthogonal matrix (matrix without scale)\n\n\t\tconst x = v.x, y = v.y, z = v.z;\n\t\tconst e = m.elements;\n\n\t\tv.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z;\n\t\tv.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z;\n\t\tv.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z;\n\n\t\treturn v;\n\n\t}\n\n\tstatic transformFreeVectorInverse( v, m ) {\n\n\t\t// input:\n\t\t// vector interpreted as a free vector\n\t\t// THREE.Matrix4 orthogonal matrix (matrix without scale)\n\n\t\tconst x = v.x, y = v.y, z = v.z;\n\t\tconst e = m.elements;\n\n\t\tv.x = e[ 0 ] * x + e[ 1 ] * y + e[ 2 ] * z;\n\t\tv.y = e[ 4 ] * x + e[ 5 ] * y + e[ 6 ] * z;\n\t\tv.z = e[ 8 ] * x + e[ 9 ] * y + e[ 10 ] * z;\n\n\t\treturn v;\n\n\t}\n\n\tstatic transformTiedVectorInverse( v, m ) {\n\n\t\t// input:\n\t\t// vector interpreted as a tied (ordinary) vector\n\t\t// THREE.Matrix4 orthogonal matrix (matrix without scale)\n\n\t\tconst x = v.x, y = v.y, z = v.z;\n\t\tconst e = m.elements;\n\n\t\tv.x = e[ 0 ] * x + e[ 1 ] * y + e[ 2 ] * z - e[ 12 ];\n\t\tv.y = e[ 4 ] * x + e[ 5 ] * y + e[ 6 ] * z - e[ 13 ];\n\t\tv.z = e[ 8 ] * x + e[ 9 ] * y + e[ 10 ] * z - e[ 14 ];\n\n\t\treturn v;\n\n\t}\n\n\tstatic transformPlaneToLocalSpace( plane, m, resultPlane ) {\n\n\t\tresultPlane.normal.copy( plane.normal );\n\t\tresultPlane.constant = plane.constant;\n\n\t\tconst referencePoint = ConvexObjectBreaker.transformTiedVectorInverse( plane.coplanarPoint( _v1 ), m );\n\n\t\tConvexObjectBreaker.transformFreeVectorInverse( resultPlane.normal, m );\n\n\t\t// recalculate constant (like in setFromNormalAndCoplanarPoint)\n\t\tresultPlane.constant = - referencePoint.dot( resultPlane.normal );\n\n\t}\n\n}\n\nexport { ConvexObjectBreaker };\n", "import {\n\tClampToEdgeWrapping,\n\tDataTexture,\n\tFloatType,\n\tNearestFilter,\n\tRGBAFormat,\n\tShaderMaterial,\n\tWebGLRenderTarget\n} from 'three';\n\nimport { FullScreenQuad } from '../postprocessing/Pass.js';\n\n/**\n * GPUComputationRenderer, based on SimulationRenderer by @zz85.\n *\n * The GPUComputationRenderer uses the concept of variables. These variables are RGBA float textures that hold 4 floats\n * for each compute element (texel).\n *\n * Each variable has a fragment shader that defines the computation made to obtain the variable in question.\n * You can use as many variables you need, and make dependencies so you can use textures of other variables in the shader\n * (the sampler uniforms are added automatically) Most of the variables will need themselves as dependency.\n *\n * The renderer has actually two render targets per variable, to make ping-pong. Textures from the current frame are used\n * as inputs to render the textures of the next frame.\n *\n * The render targets of the variables can be used as input textures for your visualization shaders.\n *\n * Variable names should be valid identifiers and should not collide with THREE GLSL used identifiers.\n * a common approach could be to use 'texture' prefixing the variable name; i.e texturePosition, textureVelocity...\n *\n * The size of the computation (sizeX * sizeY) is defined as 'resolution' automatically in the shader. For example:\n * ```\n * #DEFINE resolution vec2( 1024.0, 1024.0 )\n * ```\n * Basic use:\n * ```js\n * // Initialization...\n *\n * // Create computation renderer\n * const gpuCompute = new GPUComputationRenderer( 1024, 1024, renderer );\n *\n * // Create initial state float textures\n * const pos0 = gpuCompute.createTexture();\n * const vel0 = gpuCompute.createTexture();\n * // and fill in here the texture data...\n *\n * // Add texture variables\n * const velVar = gpuCompute.addVariable( \"textureVelocity\", fragmentShaderVel, vel0 );\n * const posVar = gpuCompute.addVariable( \"texturePosition\", fragmentShaderPos, pos0 );\n *\n * // Add variable dependencies\n * gpuCompute.setVariableDependencies( velVar, [ velVar, posVar ] );\n * gpuCompute.setVariableDependencies( posVar, [ velVar, posVar ] );\n *\n * // Add custom uniforms\n * velVar.material.uniforms.time = { value: 0.0 };\n *\n * // Check for completeness\n * const error = gpuCompute.init();\n * if ( error !== null ) {\n *\t\tconsole.error( error );\n  * }\n *\n * // In each frame...\n *\n * // Compute!\n * gpuCompute.compute();\n *\n * // Update texture uniforms in your visualization materials with the gpu renderer output\n * myMaterial.uniforms.myTexture.value = gpuCompute.getCurrentRenderTarget( posVar ).texture;\n *\n * // Do your rendering\n * renderer.render( myScene, myCamera );\n * ```\n *\n * Also, you can use utility functions to create ShaderMaterial and perform computations (rendering between textures)\n * Note that the shaders can have multiple input textures.\n *\n * ```js\n * const myFilter1 = gpuCompute.createShaderMaterial( myFilterFragmentShader1, { theTexture: { value: null } } );\n * const myFilter2 = gpuCompute.createShaderMaterial( myFilterFragmentShader2, { theTexture: { value: null } } );\n *\n * const inputTexture = gpuCompute.createTexture();\n *\n * // Fill in here inputTexture...\n *\n * myFilter1.uniforms.theTexture.value = inputTexture;\n *\n * const myRenderTarget = gpuCompute.createRenderTarget();\n * myFilter2.uniforms.theTexture.value = myRenderTarget.texture;\n *\n * const outputRenderTarget = gpuCompute.createRenderTarget();\n *\n * // Now use the output texture where you want:\n * myMaterial.uniforms.map.value = outputRenderTarget.texture;\n *\n * // And compute each frame, before rendering to screen:\n * gpuCompute.doRenderTarget( myFilter1, myRenderTarget );\n * gpuCompute.doRenderTarget( myFilter2, outputRenderTarget );\n * ```\n *\n * @three_import import { GPUComputationRenderer } from 'three/addons/misc/GPUComputationRenderer.js';\n */\nclass GPUComputationRenderer {\n\n\t/**\n\t * Constructs a new GPU computation renderer.\n\t *\n\t * @param {number} sizeX - Computation problem size is always 2d: sizeX * sizeY elements.\n \t * @param {number} sizeY - Computation problem size is always 2d: sizeX * sizeY elements.\n \t * @param {WebGLRenderer} renderer - The renderer.\n\t */\n\tconstructor( sizeX, sizeY, renderer ) {\n\n\t\tthis.variables = [];\n\n\t\tthis.currentTextureIndex = 0;\n\n\t\tlet dataType = FloatType;\n\n\t\tconst passThruUniforms = {\n\t\t\tpassThruTexture: { value: null }\n\t\t};\n\n\t\tconst passThruShader = createShaderMaterial( getPassThroughFragmentShader(), passThruUniforms );\n\n\t\tconst quad = new FullScreenQuad( passThruShader );\n\n\t\t/**\n\t\t * Sets the data type of the internal textures.\n\t\t *\n\t\t * @param {(FloatType|HalfFloatType)} type - The type to set.\n\t\t * @return {GPUComputationRenderer} A reference to this renderer.\n\t\t */\n\t\tthis.setDataType = function ( type ) {\n\n\t\t\tdataType = type;\n\t\t\treturn this;\n\n\t\t};\n\n\t\t/**\n\t\t * Adds a compute variable to the renderer.\n\t\t *\n\t\t * @param {string} variableName - The variable name.\n\t\t * @param {string} computeFragmentShader - The compute (fragment) shader source.\n\t\t * @param {Texture} initialValueTexture - The initial value texture.\n\t\t * @return {Object} The compute variable.\n\t\t */\n\t\tthis.addVariable = function ( variableName, computeFragmentShader, initialValueTexture ) {\n\n\t\t\tconst material = this.createShaderMaterial( computeFragmentShader );\n\n\t\t\tconst variable = {\n\t\t\t\tname: variableName,\n\t\t\t\tinitialValueTexture: initialValueTexture,\n\t\t\t\tmaterial: material,\n\t\t\t\tdependencies: null,\n\t\t\t\trenderTargets: [],\n\t\t\t\twrapS: null,\n\t\t\t\twrapT: null,\n\t\t\t\tminFilter: NearestFilter,\n\t\t\t\tmagFilter: NearestFilter\n\t\t\t};\n\n\t\t\tthis.variables.push( variable );\n\n\t\t\treturn variable;\n\n\t\t};\n\n\t\t/**\n\t\t * Sets variable dependencies.\n\t\t *\n\t\t * @param {Object} variable - The compute variable.\n\t\t * @param {Array<Object>} dependencies - Other compute variables that represents the dependencies.\n\t\t */\n\t\tthis.setVariableDependencies = function ( variable, dependencies ) {\n\n\t\t\tvariable.dependencies = dependencies;\n\n\t\t};\n\n\t\t/**\n\t\t * Initializes the renderer.\n\t\t *\n\t\t * @return {?string} Returns `null` if no errors are detected. Otherwise returns the error message.\n\t\t */\n\t\tthis.init = function () {\n\n\t\t\tif ( renderer.capabilities.maxVertexTextures === 0 ) {\n\n\t\t\t\treturn 'No support for vertex shader textures.';\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < this.variables.length; i ++ ) {\n\n\t\t\t\tconst variable = this.variables[ i ];\n\n\t\t\t\t// Creates rendertargets and initialize them with input texture\n\t\t\t\tvariable.renderTargets[ 0 ] = this.createRenderTarget( sizeX, sizeY, variable.wrapS, variable.wrapT, variable.minFilter, variable.magFilter );\n\t\t\t\tvariable.renderTargets[ 1 ] = this.createRenderTarget( sizeX, sizeY, variable.wrapS, variable.wrapT, variable.minFilter, variable.magFilter );\n\t\t\t\tthis.renderTexture( variable.initialValueTexture, variable.renderTargets[ 0 ] );\n\t\t\t\tthis.renderTexture( variable.initialValueTexture, variable.renderTargets[ 1 ] );\n\n\t\t\t\t// Adds dependencies uniforms to the ShaderMaterial\n\t\t\t\tconst material = variable.material;\n\t\t\t\tconst uniforms = material.uniforms;\n\n\t\t\t\tif ( variable.dependencies !== null ) {\n\n\t\t\t\t\tfor ( let d = 0; d < variable.dependencies.length; d ++ ) {\n\n\t\t\t\t\t\tconst depVar = variable.dependencies[ d ];\n\n\t\t\t\t\t\tif ( depVar.name !== variable.name ) {\n\n\t\t\t\t\t\t\t// Checks if variable exists\n\t\t\t\t\t\t\tlet found = false;\n\n\t\t\t\t\t\t\tfor ( let j = 0; j < this.variables.length; j ++ ) {\n\n\t\t\t\t\t\t\t\tif ( depVar.name === this.variables[ j ].name ) {\n\n\t\t\t\t\t\t\t\t\tfound = true;\n\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif ( ! found ) {\n\n\t\t\t\t\t\t\t\treturn 'Variable dependency not found. Variable=' + variable.name + ', dependency=' + depVar.name;\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tuniforms[ depVar.name ] = { value: null };\n\n\t\t\t\t\t\tmaterial.fragmentShader = '\\nuniform sampler2D ' + depVar.name + ';\\n' + material.fragmentShader;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.currentTextureIndex = 0;\n\n\t\t\treturn null;\n\n\t\t};\n\n\t\t/**\n\t\t * Executes the compute. This method is usually called in the animation loop.\n\t\t */\n\t\tthis.compute = function () {\n\n\t\t\tconst currentTextureIndex = this.currentTextureIndex;\n\t\t\tconst nextTextureIndex = this.currentTextureIndex === 0 ? 1 : 0;\n\n\t\t\tfor ( let i = 0, il = this.variables.length; i < il; i ++ ) {\n\n\t\t\t\tconst variable = this.variables[ i ];\n\n\t\t\t\t// Sets texture dependencies uniforms\n\t\t\t\tif ( variable.dependencies !== null ) {\n\n\t\t\t\t\tconst uniforms = variable.material.uniforms;\n\n\t\t\t\t\tfor ( let d = 0, dl = variable.dependencies.length; d < dl; d ++ ) {\n\n\t\t\t\t\t\tconst depVar = variable.dependencies[ d ];\n\n\t\t\t\t\t\tuniforms[ depVar.name ].value = depVar.renderTargets[ currentTextureIndex ].texture;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t// Performs the computation for this variable\n\t\t\t\tthis.doRenderTarget( variable.material, variable.renderTargets[ nextTextureIndex ] );\n\n\t\t\t}\n\n\t\t\tthis.currentTextureIndex = nextTextureIndex;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the current render target for the given compute variable.\n\t\t *\n\t\t * @param {Object} variable - The compute variable.\n\t\t * @return {WebGLRenderTarget} The current render target.\n\t\t */\n\t\tthis.getCurrentRenderTarget = function ( variable ) {\n\n\t\t\treturn variable.renderTargets[ this.currentTextureIndex ];\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the alternate render target for the given compute variable.\n\t\t *\n\t\t * @param {Object} variable - The compute variable.\n\t\t * @return {WebGLRenderTarget} The alternate render target.\n\t\t */\n\t\tthis.getAlternateRenderTarget = function ( variable ) {\n\n\t\t\treturn variable.renderTargets[ this.currentTextureIndex === 0 ? 1 : 0 ];\n\n\t\t};\n\n\t\t/**\n\t\t * Frees all internal resources. Call this method if you don't need the\n\t\t * renderer anymore.\n\t\t */\n\t\tthis.dispose = function () {\n\n\t\t\tquad.dispose();\n\n\t\t\tconst variables = this.variables;\n\n\t\t\tfor ( let i = 0; i < variables.length; i ++ ) {\n\n\t\t\t\tconst variable = variables[ i ];\n\n\t\t\t\tif ( variable.initialValueTexture ) variable.initialValueTexture.dispose();\n\n\t\t\t\tconst renderTargets = variable.renderTargets;\n\n\t\t\t\tfor ( let j = 0; j < renderTargets.length; j ++ ) {\n\n\t\t\t\t\tconst renderTarget = renderTargets[ j ];\n\t\t\t\t\trenderTarget.dispose();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\tfunction addResolutionDefine( materialShader ) {\n\n\t\t\tmaterialShader.defines.resolution = 'vec2( ' + sizeX.toFixed( 1 ) + ', ' + sizeY.toFixed( 1 ) + ' )';\n\n\t\t}\n\n\t\t/**\n\t\t * Adds a resolution defined for the given material shader.\n\t\t *\n\t\t * @param {Object} materialShader - The material shader.\n\t\t */\n\t\tthis.addResolutionDefine = addResolutionDefine;\n\n\n\t\t// The following functions can be used to compute things manually\n\n\t\tfunction createShaderMaterial( computeFragmentShader, uniforms ) {\n\n\t\t\tuniforms = uniforms || {};\n\n\t\t\tconst material = new ShaderMaterial( {\n\t\t\t\tname: 'GPUComputationShader',\n\t\t\t\tuniforms: uniforms,\n\t\t\t\tvertexShader: getPassThroughVertexShader(),\n\t\t\t\tfragmentShader: computeFragmentShader\n\t\t\t} );\n\n\t\t\taddResolutionDefine( material );\n\n\t\t\treturn material;\n\n\t\t}\n\n\t\tthis.createShaderMaterial = createShaderMaterial;\n\n\t\t/**\n\t\t * Creates a new render target from the given parameters.\n\t\t *\n\t\t * @param {number} sizeXTexture - The width of the render target.\n\t\t * @param {number} sizeYTexture - The height of the render target.\n\t\t * @param {number} wrapS - The wrapS value.\n\t\t * @param {number} wrapT - The wrapS value.\n\t\t * @param {number} minFilter - The minFilter value.\n\t\t * @param {number} magFilter - The magFilter value.\n\t\t * @return {WebGLRenderTarget} The new render target.\n\t\t */\n\t\tthis.createRenderTarget = function ( sizeXTexture, sizeYTexture, wrapS, wrapT, minFilter, magFilter ) {\n\n\t\t\tsizeXTexture = sizeXTexture || sizeX;\n\t\t\tsizeYTexture = sizeYTexture || sizeY;\n\n\t\t\twrapS = wrapS || ClampToEdgeWrapping;\n\t\t\twrapT = wrapT || ClampToEdgeWrapping;\n\n\t\t\tminFilter = minFilter || NearestFilter;\n\t\t\tmagFilter = magFilter || NearestFilter;\n\n\t\t\tconst renderTarget = new WebGLRenderTarget( sizeXTexture, sizeYTexture, {\n\t\t\t\twrapS: wrapS,\n\t\t\t\twrapT: wrapT,\n\t\t\t\tminFilter: minFilter,\n\t\t\t\tmagFilter: magFilter,\n\t\t\t\tformat: RGBAFormat,\n\t\t\t\ttype: dataType,\n\t\t\t\tdepthBuffer: false\n\t\t\t} );\n\n\t\t\treturn renderTarget;\n\n\t\t};\n\n\t\t/**\n\t\t * Creates a new data texture.\n\t\t *\n\t\t * @return {DataTexture} The new data texture.\n\t\t */\n\t\tthis.createTexture = function () {\n\n\t\t\tconst data = new Float32Array( sizeX * sizeY * 4 );\n\t\t\tconst texture = new DataTexture( data, sizeX, sizeY, RGBAFormat, FloatType );\n\t\t\ttexture.needsUpdate = true;\n\t\t\treturn texture;\n\n\t\t};\n\n\t\t/**\n\t\t * Renders the given texture into the given render target.\n\t\t *\n\t\t * @param {Texture} input - The input.\n\t\t * @param {WebGLRenderTarget} output - The output.\n\t\t */\n\t\tthis.renderTexture = function ( input, output ) {\n\n\t\t\tpassThruUniforms.passThruTexture.value = input;\n\n\t\t\tthis.doRenderTarget( passThruShader, output );\n\n\t\t\tpassThruUniforms.passThruTexture.value = null;\n\n\t\t};\n\n\n\t\t/**\n\t\t * Renders the given material into the given render target\n\t\t * with a full-screen pass.\n\t\t *\n\t\t * @param {Material} material - The material.\n\t\t * @param {WebGLRenderTarget} output - The output.\n\t\t */\n\t\tthis.doRenderTarget = function ( material, output ) {\n\n\t\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\t\tconst currentXrEnabled = renderer.xr.enabled;\n\t\t\tconst currentShadowAutoUpdate = renderer.shadowMap.autoUpdate;\n\n\t\t\trenderer.xr.enabled = false; // Avoid camera modification\n\t\t\trenderer.shadowMap.autoUpdate = false; // Avoid re-computing shadows\n\t\t\tquad.material = material;\n\t\t\trenderer.setRenderTarget( output );\n\t\t\tquad.render( renderer );\n\t\t\tquad.material = passThruShader;\n\n\t\t\trenderer.xr.enabled = currentXrEnabled;\n\t\t\trenderer.shadowMap.autoUpdate = currentShadowAutoUpdate;\n\n\t\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t\t};\n\n\t\t// Shaders\n\n\t\tfunction getPassThroughVertexShader() {\n\n\t\t\treturn\t'void main()\t{\\n' +\n\t\t\t\t\t'\\n' +\n\t\t\t\t\t'\tgl_Position = vec4( position, 1.0 );\\n' +\n\t\t\t\t\t'\\n' +\n\t\t\t\t\t'}\\n';\n\n\t\t}\n\n\t\tfunction getPassThroughFragmentShader() {\n\n\t\t\treturn\t'uniform sampler2D passThruTexture;\\n' +\n\t\t\t\t\t'\\n' +\n\t\t\t\t\t'void main() {\\n' +\n\t\t\t\t\t'\\n' +\n\t\t\t\t\t'\tvec2 uv = gl_FragCoord.xy / resolution.xy;\\n' +\n\t\t\t\t\t'\\n' +\n\t\t\t\t\t'\tgl_FragColor = texture2D( passThruTexture, uv );\\n' +\n\t\t\t\t\t'\\n' +\n\t\t\t\t\t'}\\n';\n\n\t\t}\n\n\t}\n\n}\n\nexport { GPUComputationRenderer };\n", "import {\n\tObject3D,\n\tQuaternion,\n\tVector3\n} from 'three';\n\nconst _translationObject = new Vector3();\nconst _quaternionObject = new Quaternion();\nconst _scaleObject = new Vector3();\n\nconst _translationWorld = new Vector3();\nconst _quaternionWorld = new Quaternion();\nconst _scaleWorld = new Vector3();\n\n/**\n * A special type of 3D object that takes a position from the scene graph hierarchy\n * but uses its local rotation as world rotation. It works like real-world gyroscope -\n * you can move it around using hierarchy while its orientation stays fixed with\n * respect to the world.\n *\n * @augments Object3D\n * @three_import import { Gyroscope } from 'three/addons/misc/Gyroscope.js';\n */\nclass Gyroscope extends Object3D {\n\n\t/**\n\t * Constructs a new gyroscope.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tthis.matrixAutoUpdate && this.updateMatrix();\n\n\t\t// update matrixWorld\n\n\t\tif ( this.matrixWorldNeedsUpdate || force ) {\n\n\t\t\tif ( this.parent !== null ) {\n\n\t\t\t\tthis.matrixWorld.multiplyMatrices( this.parent.matrixWorld, this.matrix );\n\n\t\t\t\tthis.matrixWorld.decompose( _translationWorld, _quaternionWorld, _scaleWorld );\n\t\t\t\tthis.matrix.decompose( _translationObject, _quaternionObject, _scaleObject );\n\n\t\t\t\tthis.matrixWorld.compose( _translationWorld, _quaternionObject, _scaleWorld );\n\n\n\t\t\t} else {\n\n\t\t\t\tthis.matrixWorld.copy( this.matrix );\n\n\t\t\t}\n\n\n\t\t\tthis.matrixWorldNeedsUpdate = false;\n\n\t\t\tforce = true;\n\n\t\t}\n\n\t\t// update children\n\n\t\tfor ( let i = 0, l = this.children.length; i < l; i ++ ) {\n\n\t\t\tthis.children[ i ].updateMatrixWorld( force );\n\n\t\t}\n\n\t}\n\n}\n\nexport { Gyroscope };\n", "import {\n\tAnimationMixer,\n\tBox3,\n\tMesh,\n\tMeshLambertMaterial,\n\tObject3D,\n\tTextureLoader,\n\tUVMapping,\n\tSRGBColorSpace\n} from 'three';\nimport { MD2Loader } from '../loaders/MD2Loader.js';\n\n/**\n * This class represents a management component for animated MD2\n * character assets.\n *\n * @three_import import { MD2Character } from 'three/addons/misc/MD2Character.js';\n */\nclass MD2Character {\n\n\t/**\n\t * Constructs a new MD2 character.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The mesh scale.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.scale = 1;\n\n\t\t/**\n\t\t * The FPS\n\t\t *\n\t\t * @type {number}\n\t\t * @default 6\n\t\t */\n\t\tthis.animationFPS = 6;\n\n\t\t/**\n\t\t * The root 3D object\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.root = new Object3D();\n\n\t\t/**\n\t\t * The body mesh.\n\t\t *\n\t\t * @type {?Mesh}\n\t\t * @default null\n\t\t */\n\t\tthis.meshBody = null;\n\n\t\t/**\n\t\t * The weapon mesh.\n\t\t *\n\t\t * @type {?Mesh}\n\t\t * @default null\n\t\t */\n\t\tthis.meshWeapon = null;\n\n\t\t/**\n\t\t * The body skins.\n\t\t *\n\t\t * @type {Array<Texture>}\n\t\t */\n\t\tthis.skinsBody = [];\n\n\t\t/**\n\t\t * The weapon skins.\n\t\t *\n\t\t * @type {Array<Texture>}\n\t\t */\n\t\tthis.skinsWeapon = [];\n\n\t\t/**\n\t\t * The weapon meshes.\n\t\t *\n\t\t * @type {Array<Mesh>}\n\t\t */\n\t\tthis.weapons = [];\n\n\t\t/**\n\t\t * The name of the active animation clip.\n\t\t *\n\t\t * @type {?string}\n\t\t * @default null\n\t\t */\n\t\tthis.activeAnimationClipName = null;\n\n\t\t/**\n\t\t * The animation mixer.\n\t\t *\n\t\t * @type {?AnimationMixer}\n\t\t * @default null\n\t\t */\n\t\tthis.mixer = null;\n\n\t\t/**\n\t\t * The `onLoad` callback function.\n\t\t *\n\t\t * @type {Function}\n\t\t */\n\t\tthis.onLoadComplete = function () {};\n\n\t\t// internal\n\n\t\tthis.loadCounter = 0;\n\n\t}\n\n\t/**\n\t * Loads the character model for the given config.\n\t *\n\t * @param {Object} config - The config which defines the model and textures paths.\n\t */\n\tloadParts( config ) {\n\n\t\tconst scope = this;\n\n\t\tfunction createPart( geometry, skinMap ) {\n\n\t\t\tconst materialWireframe = new MeshLambertMaterial( { color: 0xffaa00, wireframe: true } );\n\t\t\tconst materialTexture = new MeshLambertMaterial( { color: 0xffffff, wireframe: false, map: skinMap } );\n\n\t\t\t//\n\n\t\t\tconst mesh = new Mesh( geometry, materialTexture );\n\t\t\tmesh.rotation.y = - Math.PI / 2;\n\n\t\t\tmesh.castShadow = true;\n\t\t\tmesh.receiveShadow = true;\n\n\t\t\t//\n\n\t\t\tmesh.materialTexture = materialTexture;\n\t\t\tmesh.materialWireframe = materialWireframe;\n\n\t\t\treturn mesh;\n\n\t\t}\n\n\t\tfunction loadTextures( baseUrl, textureUrls ) {\n\n\t\t\tconst textureLoader = new TextureLoader();\n\t\t\tconst textures = [];\n\n\t\t\tfor ( let i = 0; i < textureUrls.length; i ++ ) {\n\n\t\t\t\ttextures[ i ] = textureLoader.load( baseUrl + textureUrls[ i ], checkLoadingComplete );\n\t\t\t\ttextures[ i ].mapping = UVMapping;\n\t\t\t\ttextures[ i ].name = textureUrls[ i ];\n\t\t\t\ttextures[ i ].colorSpace = SRGBColorSpace;\n\n\t\t\t}\n\n\t\t\treturn textures;\n\n\t\t}\n\n\t\tfunction checkLoadingComplete() {\n\n\t\t\tscope.loadCounter -= 1;\n\n\t\t\tif ( scope.loadCounter === 0 ) scope.onLoadComplete();\n\n\t\t}\n\n\t\tthis.loadCounter = config.weapons.length * 2 + config.skins.length + 1;\n\n\t\tconst weaponsTextures = [];\n\t\tfor ( let i = 0; i < config.weapons.length; i ++ ) weaponsTextures[ i ] = config.weapons[ i ][ 1 ];\n\t\t// SKINS\n\n\t\tthis.skinsBody = loadTextures( config.baseUrl + 'skins/', config.skins );\n\t\tthis.skinsWeapon = loadTextures( config.baseUrl + 'skins/', weaponsTextures );\n\n\t\t// BODY\n\n\t\tconst loader = new MD2Loader();\n\n\t\tloader.load( config.baseUrl + config.body, function ( geo ) {\n\n\t\t\tconst boundingBox = new Box3();\n\t\t\tboundingBox.setFromBufferAttribute( geo.attributes.position );\n\n\t\t\tscope.root.position.y = - scope.scale * boundingBox.min.y;\n\n\t\t\tconst mesh = createPart( geo, scope.skinsBody[ 0 ] );\n\t\t\tmesh.scale.set( scope.scale, scope.scale, scope.scale );\n\n\t\t\tscope.root.add( mesh );\n\n\t\t\tscope.meshBody = mesh;\n\n\t\t\tscope.meshBody.clipOffset = 0;\n\t\t\tscope.activeAnimationClipName = mesh.geometry.animations[ 0 ].name;\n\n\t\t\tscope.mixer = new AnimationMixer( mesh );\n\n\t\t\tcheckLoadingComplete();\n\n\t\t} );\n\n\t\t// WEAPONS\n\n\t\tconst generateCallback = function ( index, name ) {\n\n\t\t\treturn function ( geo ) {\n\n\t\t\t\tconst mesh = createPart( geo, scope.skinsWeapon[ index ] );\n\t\t\t\tmesh.scale.set( scope.scale, scope.scale, scope.scale );\n\t\t\t\tmesh.visible = false;\n\n\t\t\t\tmesh.name = name;\n\n\t\t\t\tscope.root.add( mesh );\n\n\t\t\t\tscope.weapons[ index ] = mesh;\n\t\t\t\tscope.meshWeapon = mesh;\n\n\t\t\t\tcheckLoadingComplete();\n\n\t\t\t};\n\n\t\t};\n\n\t\tfor ( let i = 0; i < config.weapons.length; i ++ ) {\n\n\t\t\tloader.load( config.baseUrl + config.weapons[ i ][ 0 ], generateCallback( i, config.weapons[ i ][ 0 ] ) );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the animation playback rate.\n\t *\n\t * @param {number} rate - The playback rate to set.\n\t */\n\tsetPlaybackRate( rate ) {\n\n\t\tif ( rate !== 0 ) {\n\n\t\t\tthis.mixer.timeScale = 1 / rate;\n\n\t\t} else {\n\n\t\t\tthis.mixer.timeScale = 0;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the wireframe material flag.\n\t *\n\t * @param {boolean} wireframeEnabled - Whether to enable wireframe rendering or not.\n\t */\n\tsetWireframe( wireframeEnabled ) {\n\n\t\tif ( wireframeEnabled ) {\n\n\t\t\tif ( this.meshBody ) this.meshBody.material = this.meshBody.materialWireframe;\n\t\t\tif ( this.meshWeapon ) this.meshWeapon.material = this.meshWeapon.materialWireframe;\n\n\t\t} else {\n\n\t\t\tif ( this.meshBody ) this.meshBody.material = this.meshBody.materialTexture;\n\t\t\tif ( this.meshWeapon ) this.meshWeapon.material = this.meshWeapon.materialTexture;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the skin defined by the given skin index. This will result in a different texture\n\t * for the body mesh.\n\t *\n\t * @param {number} index - The skin index.\n\t */\n\tsetSkin( index ) {\n\n\t\tif ( this.meshBody && this.meshBody.material.wireframe === false ) {\n\n\t\t\tthis.meshBody.material.map = this.skinsBody[ index ];\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the weapon defined by the given weapon index. This will result in a different weapon\n\t * hold by the character.\n\t *\n\t * @param {number} index - The weapon index.\n\t */\n\tsetWeapon( index ) {\n\n\t\tfor ( let i = 0; i < this.weapons.length; i ++ ) this.weapons[ i ].visible = false;\n\n\t\tconst activeWeapon = this.weapons[ index ];\n\n\t\tif ( activeWeapon ) {\n\n\t\t\tactiveWeapon.visible = true;\n\t\t\tthis.meshWeapon = activeWeapon;\n\n\t\t\tthis.syncWeaponAnimation();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the defined animation clip as the active animation.\n\t *\n\t * @param {string} clipName - The name of the animation clip.\n\t */\n\tsetAnimation( clipName ) {\n\n\t\tif ( this.meshBody ) {\n\n\t\t\tif ( this.meshBody.activeAction ) {\n\n\t\t\t\tthis.meshBody.activeAction.stop();\n\t\t\t\tthis.meshBody.activeAction = null;\n\n\t\t\t}\n\n\t\t\tconst action = this.mixer.clipAction( clipName, this.meshBody );\n\n\t\t\tif ( action ) {\n\n\t\t\t\tthis.meshBody.activeAction = action.play();\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.activeClipName = clipName;\n\n\t\tthis.syncWeaponAnimation();\n\n\t}\n\n\t/**\n\t * Synchronizes the weapon with the body animation.\n\t */\n\tsyncWeaponAnimation() {\n\n\t\tconst clipName = this.activeClipName;\n\n\t\tif ( this.meshWeapon ) {\n\n\t\t\tif ( this.meshWeapon.activeAction ) {\n\n\t\t\t\tthis.meshWeapon.activeAction.stop();\n\t\t\t\tthis.meshWeapon.activeAction = null;\n\n\t\t\t}\n\n\t\t\tconst action = this.mixer.clipAction( clipName, this.meshWeapon );\n\n\t\t\tif ( action ) {\n\n\t\t\t\tthis.meshWeapon.activeAction = action.syncWith( this.meshBody.activeAction ).play();\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the animations of the mesh. Must be called inside the animation loop.\n\t *\n\t * @param {number} delta - The delta time in seconds.\n\t */\n\tupdate( delta ) {\n\n\t\tif ( this.mixer ) this.mixer.update( delta );\n\n\t}\n\n}\n\nexport { MD2Character };\n", "import {\n\tMathUtils,\n\tMesh\n} from 'three';\n\n/**\n * A special type of an animated mesh with a more advanced interface\n * for animation playback. Unlike {@link MorphAnimMesh}. It allows to\n * playback more than one morph animation at the same time but without\n * fading options.\n *\n * @augments Mesh\n * @three_import import { MorphBlendMesh } from 'three/addons/misc/MorphBlendMesh.js';\n */\nclass MorphBlendMesh extends Mesh {\n\n\t/**\n\t * Constructs a new morph blend mesh.\n\t *\n\t * @param {BufferGeometry} [geometry] - The mesh geometry.\n\t * @param {Material|Array<Material>} [material] - The mesh material.\n\t */\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * A dictionary of animations.\n\t\t *\n\t\t * @type {Object<string,Object>}\n\t\t */\n\t\tthis.animationsMap = {};\n\n\t\t/**\n\t\t * A list of animations.\n\t\t *\n\t\t * @type {Array<Object>}\n\t\t */\n\t\tthis.animationsList = [];\n\n\t\t// prepare default animation\n\t\t// (all frames played together in 1 second)\n\n\t\tconst numFrames = Object.keys( this.morphTargetDictionary ).length;\n\n\t\tconst name = '__default';\n\n\t\tconst startFrame = 0;\n\t\tconst endFrame = numFrames - 1;\n\n\t\tconst fps = numFrames / 1;\n\n\t\tthis.createAnimation( name, startFrame, endFrame, fps );\n\t\tthis.setAnimationWeight( name, 1 );\n\n\t}\n\n\t/**\n\t * Creates a new animation.\n\t *\n\t * @param {string} name - The animation name.\n\t * @param {number} start - The start time.\n\t * @param {number} end - The end time.\n\t * @param {number} fps - The FPS.\n\t */\n\tcreateAnimation( name, start, end, fps ) {\n\n\t\tconst animation = {\n\n\t\t\tstart: start,\n\t\t\tend: end,\n\n\t\t\tlength: end - start + 1,\n\n\t\t\tfps: fps,\n\t\t\tduration: ( end - start ) / fps,\n\n\t\t\tlastFrame: 0,\n\t\t\tcurrentFrame: 0,\n\n\t\t\tactive: false,\n\n\t\t\ttime: 0,\n\t\t\tdirection: 1,\n\t\t\tweight: 1,\n\n\t\t\tdirectionBackwards: false,\n\t\t\tmirroredLoop: false\n\n\t\t};\n\n\t\tthis.animationsMap[ name ] = animation;\n\t\tthis.animationsList.push( animation );\n\n\t}\n\n\t/**\n\t * Automatically creates animations based on the values in\n\t * {@link Mesh#morphTargetDictionary}.\n\t *\n\t * @param {number} fps - The FPS of all animations.\n\t */\n\tautoCreateAnimations( fps ) {\n\n\t\tconst pattern = /([a-z]+)_?(\\d+)/i;\n\n\t\tlet firstAnimation;\n\n\t\tconst frameRanges = {};\n\n\t\tlet i = 0;\n\n\t\tfor ( const key in this.morphTargetDictionary ) {\n\n\t\t\tconst chunks = key.match( pattern );\n\n\t\t\tif ( chunks && chunks.length > 1 ) {\n\n\t\t\t\tconst name = chunks[ 1 ];\n\n\t\t\t\tif ( ! frameRanges[ name ] ) frameRanges[ name ] = { start: Infinity, end: - Infinity };\n\n\t\t\t\tconst range = frameRanges[ name ];\n\n\t\t\t\tif ( i < range.start ) range.start = i;\n\t\t\t\tif ( i > range.end ) range.end = i;\n\n\t\t\t\tif ( ! firstAnimation ) firstAnimation = name;\n\n\t\t\t}\n\n\t\t\ti ++;\n\n\t\t}\n\n\t\tfor ( const name in frameRanges ) {\n\n\t\t\tconst range = frameRanges[ name ];\n\t\t\tthis.createAnimation( name, range.start, range.end, fps );\n\n\t\t}\n\n\t\tthis.firstAnimation = firstAnimation;\n\n\t}\n\n\t/**\n\t * Sets the animation playback direction to \"forward\" for the\n\t * defined animation.\n\t *\n\t * @param {string} name - The animation name.\n\t */\n\tsetAnimationDirectionForward( name ) {\n\n\t\tconst animation = this.animationsMap[ name ];\n\n\t\tif ( animation ) {\n\n\t\t\tanimation.direction = 1;\n\t\t\tanimation.directionBackwards = false;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the animation playback direction to \"backward\" for the\n\t * defined animation.\n\t *\n\t * @param {string} name - The animation name.\n\t */\n\tsetAnimationDirectionBackward( name ) {\n\n\t\tconst animation = this.animationsMap[ name ];\n\n\t\tif ( animation ) {\n\n\t\t\tanimation.direction = - 1;\n\t\t\tanimation.directionBackwards = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the FPS to the given value for the defined animation.\n\t *\n\t * @param {string} name - The animation name.\n\t * @param {number} fps - The FPS to set.\n\t */\n\tsetAnimationFPS( name, fps ) {\n\n\t\tconst animation = this.animationsMap[ name ];\n\n\t\tif ( animation ) {\n\n\t\t\tanimation.fps = fps;\n\t\t\tanimation.duration = ( animation.end - animation.start ) / animation.fps;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the duration to the given value for the defined animation.\n\t *\n\t * @param {string} name - The animation name.\n\t * @param {number} duration - The duration to set.\n\t */\n\tsetAnimationDuration( name, duration ) {\n\n\t\tconst animation = this.animationsMap[ name ];\n\n\t\tif ( animation ) {\n\n\t\t\tanimation.duration = duration;\n\t\t\tanimation.fps = ( animation.end - animation.start ) / animation.duration;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the weight to the given value for the defined animation.\n\t *\n\t * @param {string} name - The animation name.\n\t * @param {number} weight - The weight to set.\n\t */\n\tsetAnimationWeight( name, weight ) {\n\n\t\tconst animation = this.animationsMap[ name ];\n\n\t\tif ( animation ) {\n\n\t\t\tanimation.weight = weight;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the time to the given value for the defined animation.\n\t *\n\t * @param {string} name - The animation name.\n\t * @param {number} time - The time to set.\n\t */\n\tsetAnimationTime( name, time ) {\n\n\t\tconst animation = this.animationsMap[ name ];\n\n\t\tif ( animation ) {\n\n\t\t\tanimation.time = time;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the time for the defined animation.\n\t *\n\t * @param {string} name - The animation name.\n\t * @return {number} The time.\n\t */\n\tgetAnimationTime( name ) {\n\n\t\tlet time = 0;\n\n\t\tconst animation = this.animationsMap[ name ];\n\n\t\tif ( animation ) {\n\n\t\t\ttime = animation.time;\n\n\t\t}\n\n\t\treturn time;\n\n\t}\n\n\t/**\n\t * Returns the duration for the defined animation.\n\t *\n\t * @param {string} name - The animation name.\n\t * @return {number} The duration.\n\t */\n\tgetAnimationDuration( name ) {\n\n\t\tlet duration = - 1;\n\n\t\tconst animation = this.animationsMap[ name ];\n\n\t\tif ( animation ) {\n\n\t\t\tduration = animation.duration;\n\n\t\t}\n\n\t\treturn duration;\n\n\t}\n\n\t/**\n\t * Plays the defined animation.\n\t *\n\t * @param {string} name - The animation name.\n\t */\n\tplayAnimation( name ) {\n\n\t\tconst animation = this.animationsMap[ name ];\n\n\t\tif ( animation ) {\n\n\t\t\tanimation.time = 0;\n\t\t\tanimation.active = true;\n\n\t\t} else {\n\n\t\t\tconsole.warn( 'THREE.MorphBlendMesh: animation[' + name + '] undefined in .playAnimation()' );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Stops the defined animation.\n\t *\n\t * @param {string} name - The animation name.\n\t */\n\tstopAnimation( name ) {\n\n\t\tconst animation = this.animationsMap[ name ];\n\n\t\tif ( animation ) {\n\n\t\t\tanimation.active = false;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the animations of the mesh.\n\t *\n\t * @param {number} delta - The delta time in seconds.\n\t */\n\tupdate( delta ) {\n\n\t\tfor ( let i = 0, il = this.animationsList.length; i < il; i ++ ) {\n\n\t\t\tconst animation = this.animationsList[ i ];\n\n\t\t\tif ( ! animation.active ) continue;\n\n\t\t\tconst frameTime = animation.duration / animation.length;\n\n\t\t\tanimation.time += animation.direction * delta;\n\n\t\t\tif ( animation.mirroredLoop ) {\n\n\t\t\t\tif ( animation.time > animation.duration || animation.time < 0 ) {\n\n\t\t\t\t\tanimation.direction *= - 1;\n\n\t\t\t\t\tif ( animation.time > animation.duration ) {\n\n\t\t\t\t\t\tanimation.time = animation.duration;\n\t\t\t\t\t\tanimation.directionBackwards = true;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( animation.time < 0 ) {\n\n\t\t\t\t\t\tanimation.time = 0;\n\t\t\t\t\t\tanimation.directionBackwards = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tanimation.time = animation.time % animation.duration;\n\n\t\t\t\tif ( animation.time < 0 ) animation.time += animation.duration;\n\n\t\t\t}\n\n\t\t\tconst keyframe = animation.start + MathUtils.clamp( Math.floor( animation.time / frameTime ), 0, animation.length - 1 );\n\t\t\tconst weight = animation.weight;\n\n\t\t\tif ( keyframe !== animation.currentFrame ) {\n\n\t\t\t\tthis.morphTargetInfluences[ animation.lastFrame ] = 0;\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = 1 * weight;\n\n\t\t\t\tthis.morphTargetInfluences[ keyframe ] = 0;\n\n\t\t\t\tanimation.lastFrame = animation.currentFrame;\n\t\t\t\tanimation.currentFrame = keyframe;\n\n\t\t\t}\n\n\t\t\tlet mix = ( animation.time % frameTime ) / frameTime;\n\n\t\t\tif ( animation.directionBackwards ) mix = 1 - mix;\n\n\t\t\tif ( animation.currentFrame !== animation.lastFrame ) {\n\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = mix * weight;\n\t\t\t\tthis.morphTargetInfluences[ animation.lastFrame ] = ( 1 - mix ) * weight;\n\n\t\t\t} else {\n\n\t\t\t\tthis.morphTargetInfluences[ animation.currentFrame ] = weight;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nexport { MorphBlendMesh };\n", "import {\n\tBox3,\n\tMathUtils,\n\tMeshLambertMaterial,\n\tObject3D,\n\tTextureLoader,\n\tUVMapping,\n\tSRGBColorSpace\n} from 'three';\nimport { MD2Loader } from '../loaders/MD2Loader.js';\nimport { MorphBlendMesh } from '../misc/MorphBlendMesh.js';\n\n/**\n * This class represents a management component for animated MD2\n * character assets. It provides a larger API compared to {@link MD2Character}.\n *\n * @three_import import { MD2CharacterComplex } from 'three/addons/misc/MD2CharacterComplex.js';\n */\nclass MD2CharacterComplex {\n\n\t/**\n\t * Constructs a new MD2 character.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The mesh scale.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.scale = 1;\n\n\t\t/**\n\t\t * The FPS\n\t\t *\n\t\t * @type {number}\n\t\t * @default 6\n\t\t */\n\t\tthis.animationFPS = 6;\n\n\t\t/**\n\t\t * The transition frames.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 15\n\t\t */\n\t\tthis.transitionFrames = 15;\n\n\t\t/**\n\t\t * The character's maximum speed.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 275\n\t\t */\n\t\tthis.maxSpeed = 275;\n\n\t\t/**\n\t\t * The character's maximum reverse speed.\n\t\t *\n\t\t * @type {number}\n\t\t * @default - 275\n\t\t */\n\t\tthis.maxReverseSpeed = - 275;\n\n\t\t/**\n\t\t * The character's front acceleration.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 600\n\t\t */\n\t\tthis.frontAcceleration = 600;\n\n\t\t/**\n\t\t * The character's back acceleration.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 600\n\t\t */\n\t\tthis.backAcceleration = 600;\n\n\t\t/**\n\t\t * The character's front deceleration.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 600\n\t\t */\n\t\tthis.frontDeceleration = 600;\n\n\t\t/**\n\t\t * The character's angular speed.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2.5\n\t\t */\n\t\tthis.angularSpeed = 2.5;\n\n\t\t/**\n\t\t * The root 3D object\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.root = new Object3D();\n\n\t\t/**\n\t\t * The body mesh.\n\t\t *\n\t\t * @type {?Mesh}\n\t\t * @default null\n\t\t */\n\t\tthis.meshBody = null;\n\n\t\t/**\n\t\t * The weapon mesh.\n\t\t *\n\t\t * @type {?Mesh}\n\t\t * @default null\n\t\t */\n\t\tthis.meshWeapon = null;\n\n\t\t/**\n\t\t * The movement controls.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.controls = null;\n\n\t\t/**\n\t\t * The body skins.\n\t\t *\n\t\t * @type {Array<Texture>}\n\t\t */\n\t\tthis.skinsBody = [];\n\n\t\t/**\n\t\t * The weapon skins.\n\t\t *\n\t\t * @type {Array<Texture>}\n\t\t */\n\t\tthis.skinsWeapon = [];\n\n\t\t/**\n\t\t * The weapon meshes.\n\t\t *\n\t\t * @type {Array<Mesh>}\n\t\t */\n\t\tthis.weapons = [];\n\n\t\t/**\n\t\t * The current skin.\n\t\t *\n\t\t * @type {Texture}\n\t\t * @default undefined\n\t\t */\n\t\tthis.currentSkin = undefined;\n\n\t\t//\n\n\t\tthis.onLoadComplete = function () {};\n\n\t\t// internals\n\n\t\tthis.meshes = [];\n\t\tthis.animations = {};\n\n\t\tthis.loadCounter = 0;\n\n\t\t// internal movement control variables\n\n\t\tthis.speed = 0;\n\t\tthis.bodyOrientation = 0;\n\n\t\tthis.walkSpeed = this.maxSpeed;\n\t\tthis.crouchSpeed = this.maxSpeed * 0.5;\n\n\t\t// internal animation parameters\n\n\t\tthis.activeAnimation = null;\n\t\tthis.oldAnimation = null;\n\n\t\t// API\n\n\t}\n\n\t/**\n\t * Toggles shadow casting and receiving on the character's meshes.\n\t *\n\t * @param {boolean} enable - Whether to enable shadows or not.\n\t */\n\tenableShadows( enable ) {\n\n\t\tfor ( let i = 0; i < this.meshes.length; i ++ ) {\n\n\t\t\tthis.meshes[ i ].castShadow = enable;\n\t\t\tthis.meshes[ i ].receiveShadow = enable;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Toggles visibility on the character's meshes.\n\t *\n\t * @param {boolean} enable - Whether the character is visible or not.\n\t */\n\tsetVisible( enable ) {\n\n\t\tfor ( let i = 0; i < this.meshes.length; i ++ ) {\n\n\t\t\tthis.meshes[ i ].visible = enable;\n\t\t\tthis.meshes[ i ].visible = enable;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Shares certain resources from a different character model.\n\t *\n\t * @param {MD2CharacterComplex} original - The original MD2 character.\n\t */\n\tshareParts( original ) {\n\n\t\tthis.animations = original.animations;\n\t\tthis.walkSpeed = original.walkSpeed;\n\t\tthis.crouchSpeed = original.crouchSpeed;\n\n\t\tthis.skinsBody = original.skinsBody;\n\t\tthis.skinsWeapon = original.skinsWeapon;\n\n\t\t// BODY\n\n\t\tconst mesh = this._createPart( original.meshBody.geometry, this.skinsBody[ 0 ] );\n\t\tmesh.scale.set( this.scale, this.scale, this.scale );\n\n\t\tthis.root.position.y = original.root.position.y;\n\t\tthis.root.add( mesh );\n\n\t\tthis.meshBody = mesh;\n\n\t\tthis.meshes.push( mesh );\n\n\t\t// WEAPONS\n\n\t\tfor ( let i = 0; i < original.weapons.length; i ++ ) {\n\n\t\t\tconst meshWeapon = this._createPart( original.weapons[ i ].geometry, this.skinsWeapon[ i ] );\n\t\t\tmeshWeapon.scale.set( this.scale, this.scale, this.scale );\n\t\t\tmeshWeapon.visible = false;\n\n\t\t\tmeshWeapon.name = original.weapons[ i ].name;\n\n\t\t\tthis.root.add( meshWeapon );\n\n\t\t\tthis.weapons[ i ] = meshWeapon;\n\t\t\tthis.meshWeapon = meshWeapon;\n\n\t\t\tthis.meshes.push( meshWeapon );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Loads the character model for the given config.\n\t *\n\t * @param {Object} config - The config which defines the model and textures paths.\n\t */\n\tloadParts( config ) {\n\n\t\tconst scope = this;\n\n\t\tfunction loadTextures( baseUrl, textureUrls ) {\n\n\t\t\tconst textureLoader = new TextureLoader();\n\t\t\tconst textures = [];\n\n\t\t\tfor ( let i = 0; i < textureUrls.length; i ++ ) {\n\n\t\t\t\ttextures[ i ] = textureLoader.load( baseUrl + textureUrls[ i ], checkLoadingComplete );\n\t\t\t\ttextures[ i ].mapping = UVMapping;\n\t\t\t\ttextures[ i ].name = textureUrls[ i ];\n\t\t\t\ttextures[ i ].colorSpace = SRGBColorSpace;\n\n\t\t\t}\n\n\t\t\treturn textures;\n\n\t\t}\n\n\t\tfunction checkLoadingComplete() {\n\n\t\t\tscope.loadCounter -= 1;\n\t\t\tif ( scope.loadCounter === 0 ) \tscope.onLoadComplete();\n\n\t\t}\n\n\t\tthis.animations = config.animations;\n\t\tthis.walkSpeed = config.walkSpeed;\n\t\tthis.crouchSpeed = config.crouchSpeed;\n\n\t\tthis.loadCounter = config.weapons.length * 2 + config.skins.length + 1;\n\n\t\tconst weaponsTextures = [];\n\t\tfor ( let i = 0; i < config.weapons.length; i ++ ) weaponsTextures[ i ] = config.weapons[ i ][ 1 ];\n\n\t\t// SKINS\n\n\t\tthis.skinsBody = loadTextures( config.baseUrl + 'skins/', config.skins );\n\t\tthis.skinsWeapon = loadTextures( config.baseUrl + 'skins/', weaponsTextures );\n\n\t\t// BODY\n\n\t\tconst loader = new MD2Loader();\n\n\t\tloader.load( config.baseUrl + config.body, function ( geo ) {\n\n\t\t\tconst boundingBox = new Box3();\n\t\t\tboundingBox.setFromBufferAttribute( geo.attributes.position );\n\n\t\t\tscope.root.position.y = - scope.scale * boundingBox.min.y;\n\n\t\t\tconst mesh = scope._createPart( geo, scope.skinsBody[ 0 ] );\n\t\t\tmesh.scale.set( scope.scale, scope.scale, scope.scale );\n\n\t\t\tscope.root.add( mesh );\n\n\t\t\tscope.meshBody = mesh;\n\t\t\tscope.meshes.push( mesh );\n\n\t\t\tcheckLoadingComplete();\n\n\t\t} );\n\n\t\t// WEAPONS\n\n\t\tconst generateCallback = function ( index, name ) {\n\n\t\t\treturn function ( geo ) {\n\n\t\t\t\tconst mesh = scope._createPart( geo, scope.skinsWeapon[ index ] );\n\t\t\t\tmesh.scale.set( scope.scale, scope.scale, scope.scale );\n\t\t\t\tmesh.visible = false;\n\n\t\t\t\tmesh.name = name;\n\n\t\t\t\tscope.root.add( mesh );\n\n\t\t\t\tscope.weapons[ index ] = mesh;\n\t\t\t\tscope.meshWeapon = mesh;\n\t\t\t\tscope.meshes.push( mesh );\n\n\t\t\t\tcheckLoadingComplete();\n\n\t\t\t};\n\n\t\t};\n\n\t\tfor ( let i = 0; i < config.weapons.length; i ++ ) {\n\n\t\t\tloader.load( config.baseUrl + config.weapons[ i ][ 0 ], generateCallback( i, config.weapons[ i ][ 0 ] ) );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the animation playback rate.\n\t *\n\t * @param {number} rate - The playback rate to set.\n\t */\n\tsetPlaybackRate( rate ) {\n\n\t\tif ( this.meshBody ) this.meshBody.duration = this.meshBody.baseDuration / rate;\n\t\tif ( this.meshWeapon ) this.meshWeapon.duration = this.meshWeapon.baseDuration / rate;\n\n\t}\n\n\t/**\n\t * Sets the wireframe material flag.\n\t *\n\t * @param {boolean} wireframeEnabled - Whether to enable wireframe rendering or not.\n\t */\n\tsetWireframe( wireframeEnabled ) {\n\n\t\tif ( wireframeEnabled ) {\n\n\t\t\tif ( this.meshBody ) this.meshBody.material = this.meshBody.materialWireframe;\n\t\t\tif ( this.meshWeapon ) this.meshWeapon.material = this.meshWeapon.materialWireframe;\n\n\t\t} else {\n\n\t\t\tif ( this.meshBody ) this.meshBody.material = this.meshBody.materialTexture;\n\t\t\tif ( this.meshWeapon ) this.meshWeapon.material = this.meshWeapon.materialTexture;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the skin defined by the given skin index. This will result in a different texture\n\t * for the body mesh.\n\t *\n\t * @param {number} index - The skin index.\n\t */\n\tsetSkin( index ) {\n\n\t\tif ( this.meshBody && this.meshBody.material.wireframe === false ) {\n\n\t\t\tthis.meshBody.material.map = this.skinsBody[ index ];\n\t\t\tthis.currentSkin = index;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the weapon defined by the given weapon index. This will result in a different weapon\n\t * hold by the character.\n\t *\n\t * @param {number} index - The weapon index.\n\t */\n\tsetWeapon( index ) {\n\n\t\tfor ( let i = 0; i < this.weapons.length; i ++ ) this.weapons[ i ].visible = false;\n\n\t\tconst activeWeapon = this.weapons[ index ];\n\n\t\tif ( activeWeapon ) {\n\n\t\t\tactiveWeapon.visible = true;\n\t\t\tthis.meshWeapon = activeWeapon;\n\n\t\t\tif ( this.activeAnimation ) {\n\n\t\t\t\tactiveWeapon.playAnimation( this.activeAnimation );\n\t\t\t\tthis.meshWeapon.setAnimationTime( this.activeAnimation, this.meshBody.getAnimationTime( this.activeAnimation ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the defined animation clip as the active animation.\n\t *\n\t * @param {string} animationName - The name of the animation clip.\n\t */\n\tsetAnimation( animationName ) {\n\n\t\tif ( animationName === this.activeAnimation || ! animationName ) return;\n\n\t\tif ( this.meshBody ) {\n\n\t\t\tthis.meshBody.setAnimationWeight( animationName, 0 );\n\t\t\tthis.meshBody.playAnimation( animationName );\n\n\t\t\tthis.oldAnimation = this.activeAnimation;\n\t\t\tthis.activeAnimation = animationName;\n\n\t\t\tthis.blendCounter = this.transitionFrames;\n\n\t\t}\n\n\t\tif ( this.meshWeapon ) {\n\n\t\t\tthis.meshWeapon.setAnimationWeight( animationName, 0 );\n\t\t\tthis.meshWeapon.playAnimation( animationName );\n\n\t\t}\n\n\n\t}\n\n\tupdate( delta ) {\n\n\t\tif ( this.controls ) this.updateMovementModel( delta );\n\n\t\tif ( this.animations ) {\n\n\t\t\tthis.updateBehaviors();\n\t\t\tthis.updateAnimations( delta );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the animations of the mesh. Must be called inside the animation loop.\n\t *\n\t * @param {number} delta - The delta time in seconds.\n\t */\n\tupdateAnimations( delta ) {\n\n\t\tlet mix = 1;\n\n\t\tif ( this.blendCounter > 0 ) {\n\n\t\t\tmix = ( this.transitionFrames - this.blendCounter ) / this.transitionFrames;\n\t\t\tthis.blendCounter -= 1;\n\n\t\t}\n\n\t\tif ( this.meshBody ) {\n\n\t\t\tthis.meshBody.update( delta );\n\n\t\t\tthis.meshBody.setAnimationWeight( this.activeAnimation, mix );\n\t\t\tthis.meshBody.setAnimationWeight( this.oldAnimation, 1 - mix );\n\n\t\t}\n\n\t\tif ( this.meshWeapon ) {\n\n\t\t\tthis.meshWeapon.update( delta );\n\n\t\t\tthis.meshWeapon.setAnimationWeight( this.activeAnimation, mix );\n\t\t\tthis.meshWeapon.setAnimationWeight( this.oldAnimation, 1 - mix );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the animation state based on the control inputs.\n\t */\n\tupdateBehaviors() {\n\n\t\tconst controls = this.controls;\n\t\tconst animations = this.animations;\n\n\t\tlet moveAnimation, idleAnimation;\n\n\t\t// crouch vs stand\n\n\t\tif ( controls.crouch ) {\n\n\t\t\tmoveAnimation = animations[ 'crouchMove' ];\n\t\t\tidleAnimation = animations[ 'crouchIdle' ];\n\n\t\t} else {\n\n\t\t\tmoveAnimation = animations[ 'move' ];\n\t\t\tidleAnimation = animations[ 'idle' ];\n\n\t\t}\n\n\t\t// actions\n\n\t\tif ( controls.jump ) {\n\n\t\t\tmoveAnimation = animations[ 'jump' ];\n\t\t\tidleAnimation = animations[ 'jump' ];\n\n\t\t}\n\n\t\tif ( controls.attack ) {\n\n\t\t\tif ( controls.crouch ) {\n\n\t\t\t\tmoveAnimation = animations[ 'crouchAttack' ];\n\t\t\t\tidleAnimation = animations[ 'crouchAttack' ];\n\n\t\t\t} else {\n\n\t\t\t\tmoveAnimation = animations[ 'attack' ];\n\t\t\t\tidleAnimation = animations[ 'attack' ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// set animations\n\n\t\tif ( controls.moveForward || controls.moveBackward || controls.moveLeft || controls.moveRight ) {\n\n\t\t\tif ( this.activeAnimation !== moveAnimation ) {\n\n\t\t\t\tthis.setAnimation( moveAnimation );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tif ( Math.abs( this.speed ) < 0.2 * this.maxSpeed && ! ( controls.moveLeft || controls.moveRight || controls.moveForward || controls.moveBackward ) ) {\n\n\t\t\tif ( this.activeAnimation !== idleAnimation ) {\n\n\t\t\t\tthis.setAnimation( idleAnimation );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// set animation direction\n\n\t\tif ( controls.moveForward ) {\n\n\t\t\tif ( this.meshBody ) {\n\n\t\t\t\tthis.meshBody.setAnimationDirectionForward( this.activeAnimation );\n\t\t\t\tthis.meshBody.setAnimationDirectionForward( this.oldAnimation );\n\n\t\t\t}\n\n\t\t\tif ( this.meshWeapon ) {\n\n\t\t\t\tthis.meshWeapon.setAnimationDirectionForward( this.activeAnimation );\n\t\t\t\tthis.meshWeapon.setAnimationDirectionForward( this.oldAnimation );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( controls.moveBackward ) {\n\n\t\t\tif ( this.meshBody ) {\n\n\t\t\t\tthis.meshBody.setAnimationDirectionBackward( this.activeAnimation );\n\t\t\t\tthis.meshBody.setAnimationDirectionBackward( this.oldAnimation );\n\n\t\t\t}\n\n\t\t\tif ( this.meshWeapon ) {\n\n\t\t\t\tthis.meshWeapon.setAnimationDirectionBackward( this.activeAnimation );\n\t\t\t\tthis.meshWeapon.setAnimationDirectionBackward( this.oldAnimation );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Transforms the character model based on the control input.\n\t *\n\t * @param {number} delta - The delta time in seconds.\n\t */\n\tupdateMovementModel( delta ) {\n\n\t\tfunction exponentialEaseOut( k ) {\n\n\t\t\treturn k === 1 ? 1 : - Math.pow( 2, - 10 * k ) + 1;\n\n\t\t}\n\n\t\tconst controls = this.controls;\n\n\t\t// speed based on controls\n\n\t\tif ( controls.crouch ) \tthis.maxSpeed = this.crouchSpeed;\n\t\telse this.maxSpeed = this.walkSpeed;\n\n\t\tthis.maxReverseSpeed = - this.maxSpeed;\n\n\t\tif ( controls.moveForward ) this.speed = MathUtils.clamp( this.speed + delta * this.frontAcceleration, this.maxReverseSpeed, this.maxSpeed );\n\t\tif ( controls.moveBackward ) this.speed = MathUtils.clamp( this.speed - delta * this.backAcceleration, this.maxReverseSpeed, this.maxSpeed );\n\n\t\t// orientation based on controls\n\t\t// (don't just stand while turning)\n\n\t\tconst dir = 1;\n\n\t\tif ( controls.moveLeft ) {\n\n\t\t\tthis.bodyOrientation += delta * this.angularSpeed;\n\t\t\tthis.speed = MathUtils.clamp( this.speed + dir * delta * this.frontAcceleration, this.maxReverseSpeed, this.maxSpeed );\n\n\t\t}\n\n\t\tif ( controls.moveRight ) {\n\n\t\t\tthis.bodyOrientation -= delta * this.angularSpeed;\n\t\t\tthis.speed = MathUtils.clamp( this.speed + dir * delta * this.frontAcceleration, this.maxReverseSpeed, this.maxSpeed );\n\n\t\t}\n\n\t\t// speed decay\n\n\t\tif ( ! ( controls.moveForward || controls.moveBackward ) ) {\n\n\t\t\tif ( this.speed > 0 ) {\n\n\t\t\t\tconst k = exponentialEaseOut( this.speed / this.maxSpeed );\n\t\t\t\tthis.speed = MathUtils.clamp( this.speed - k * delta * this.frontDeceleration, 0, this.maxSpeed );\n\n\t\t\t} else {\n\n\t\t\t\tconst k = exponentialEaseOut( this.speed / this.maxReverseSpeed );\n\t\t\t\tthis.speed = MathUtils.clamp( this.speed + k * delta * this.backAcceleration, this.maxReverseSpeed, 0 );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// displacement\n\n\t\tconst forwardDelta = this.speed * delta;\n\n\t\tthis.root.position.x += Math.sin( this.bodyOrientation ) * forwardDelta;\n\t\tthis.root.position.z += Math.cos( this.bodyOrientation ) * forwardDelta;\n\n\t\t// steering\n\n\t\tthis.root.rotation.y = this.bodyOrientation;\n\n\t}\n\n\t// internal\n\n\t_createPart( geometry, skinMap ) {\n\n\t\tconst materialWireframe = new MeshLambertMaterial( { color: 0xffaa00, wireframe: true } );\n\t\tconst materialTexture = new MeshLambertMaterial( { color: 0xffffff, wireframe: false, map: skinMap } );\n\n\t\t//\n\n\t\tconst mesh = new MorphBlendMesh( geometry, materialTexture );\n\t\tmesh.rotation.y = - Math.PI / 2;\n\n\t\t//\n\n\t\tmesh.materialTexture = materialTexture;\n\t\tmesh.materialWireframe = materialWireframe;\n\n\t\t//\n\n\t\tmesh.autoCreateAnimations( this.animationFPS );\n\n\t\treturn mesh;\n\n\t}\n\n}\n\nexport { MD2CharacterComplex };\n", "import {\n\tAnimationClip,\n\tAnimationMixer,\n\tMesh\n} from 'three';\n\n/**\n * A special type of an animated mesh with a simple interface\n * for animation playback. It allows to playback just one animation\n * without any transitions or fading between animation changes.\n *\n * @augments Mesh\n * @three_import import { MorphAnimMesh } from 'three/addons/misc/MorphAnimMesh.js';\n */\nclass MorphAnimMesh extends Mesh {\n\n\t/**\n\t * Constructs a new morph anim mesh.\n\t *\n\t * @param {BufferGeometry} [geometry] - The mesh geometry.\n\t * @param {Material|Array<Material>} [material] - The mesh material.\n\t */\n\tconstructor( geometry, material ) {\n\n\t\tsuper( geometry, material );\n\n\t\tthis.type = 'MorphAnimMesh';\n\n\t\t/**\n\t\t * The internal animation mixer.\n\t\t *\n\t\t * @type {AnimationMixer}\n\t\t */\n\t\tthis.mixer = new AnimationMixer( this );\n\n\t\t/**\n\t\t * The current active animation action.\n\t\t *\n\t\t * @type {?AnimationAction}\n\t\t * @default null\n\t\t */\n\t\tthis.activeAction = null;\n\n\t}\n\n\t/**\n\t * Sets the animation playback direction to \"forward\".\n\t */\n\tsetDirectionForward() {\n\n\t\tthis.mixer.timeScale = 1.0;\n\n\t}\n\n\t/**\n\t * Sets the animation playback direction to \"backward\".\n\t */\n\tsetDirectionBackward() {\n\n\t\tthis.mixer.timeScale = - 1.0;\n\n\t}\n\n\t/**\n\t * Plays the defined animation clip. The implementation assumes the animation\n\t * clips are stored in {@link Object3D#animations} or the geometry.\n\t *\n\t * @param {string} label - The name of the animation clip.\n\t * @param {number} fps - The FPS of the animation clip.\n\t */\n\tplayAnimation( label, fps ) {\n\n\t\tif ( this.activeAction ) {\n\n\t\t\tthis.activeAction.stop();\n\t\t\tthis.activeAction = null;\n\n\t\t}\n\n\t\tconst clip = AnimationClip.findByName( this, label );\n\n\t\tif ( clip ) {\n\n\t\t\tconst action = this.mixer.clipAction( clip );\n\t\t\taction.timeScale = ( clip.tracks.length * fps ) / clip.duration;\n\t\t\tthis.activeAction = action.play();\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.MorphAnimMesh: animations[' + label + '] undefined in .playAnimation()' );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the animations of the mesh. Must be called inside the animation loop.\n\t *\n\t * @param {number} delta - The delta time in seconds.\n\t */\n\tupdateAnimation( delta ) {\n\n\t\tthis.mixer.update( delta );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.mixer = new AnimationMixer( this );\n\n\t\treturn this;\n\n\t}\n\n}\n\nexport { MorphAnimMesh };\n", "import { DoubleSide, FloatType, HalfFloatType, Mesh, MeshBasicMaterial, MeshPhongMaterial, PlaneGeometry, Scene, WebGLRenderTarget } from 'three';\nimport { potpack } from '../libs/potpack.module.js';\n\n/**\n * Progressive Light Map Accumulator, by [zalo](https://github.com/zalo/).\n *\n * To use, simply construct a `ProgressiveLightMap` object,\n * `plmap.addObjectsToLightMap(object)` an array of semi-static\n * objects and lights to the class once, and then call\n * `plmap.update(camera)` every frame to begin accumulating\n * lighting samples.\n *\n * This should begin accumulating lightmaps which apply to\n * your objects, so you can start jittering lighting to achieve\n * the texture-space effect you're looking for.\n *\n * This class can only be used with {@link WebGLRenderer}.\n * When using {@link WebGPURenderer}, import from `ProgressiveLightMapGPU.js`.\n *\n * @three_import import { ProgressiveLightMap } from 'three/addons/misc/ProgressiveLightMap.js';\n */\nclass ProgressiveLightMap {\n\n\t/**\n\t * Constructs a new progressive light map.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n \t * @param {number} [res=1024] - The side-long dimension of the total lightmap.\n\t */\n\tconstructor( renderer, res = 1024 ) {\n\n\t\t/**\n\t\t * The renderer.\n\t\t *\n\t\t * @type {WebGLRenderer}\n\t\t */\n\t\tthis.renderer = renderer;\n\n\t\t/**\n\t\t * The side-long dimension of the total lightmap.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1024\n\t\t */\n\t\tthis.res = res;\n\n\t\t// internals\n\n\t\tthis.lightMapContainers = [];\n\t\tthis.scene = new Scene();\n\t\tthis.buffer1Active = false;\n\t\tthis.firstUpdate = true;\n\t\tthis.labelMesh = null;\n\t\tthis.blurringPlane = null;\n\n\t\t// Create the Progressive LightMap Texture\n\t\tconst format = /(Android|iPad|iPhone|iPod)/g.test( navigator.userAgent ) ? HalfFloatType : FloatType;\n\t\tthis.progressiveLightMap1 = new WebGLRenderTarget( this.res, this.res, { type: format } );\n\t\tthis.progressiveLightMap2 = new WebGLRenderTarget( this.res, this.res, { type: format } );\n\t\tthis.progressiveLightMap2.texture.channel = 1;\n\n\t\t// Inject some spicy new logic into a standard phong material\n\t\tthis.uvMat = new MeshPhongMaterial();\n\t\tthis.uvMat.uniforms = {};\n\t\tthis.uvMat.onBeforeCompile = ( shader ) => {\n\n\t\t\t// Vertex Shader: Set Vertex Positions to the Unwrapped UV Positions\n\t\t\tshader.vertexShader =\n\t\t\t\t'attribute vec2 uv1;\\n' +\n\t\t\t\t'#define USE_LIGHTMAP\\n' +\n\t\t\t\t'#define LIGHTMAP_UV uv1\\n' +\n\t\t\t\tshader.vertexShader.slice( 0, - 1 ) +\n\t\t\t\t'\tgl_Position = vec4((LIGHTMAP_UV - 0.5) * 2.0, 1.0, 1.0); }';\n\n\t\t\t// Fragment Shader: Set Pixels to average in the Previous frame's Shadows\n\t\t\tconst bodyStart = shader.fragmentShader.indexOf( 'void main() {' );\n\t\t\tshader.fragmentShader =\n\t\t\t\t'#define USE_LIGHTMAP\\n' +\n\t\t\t\tshader.fragmentShader.slice( 0, bodyStart ) +\n\t\t\t\t'\tuniform sampler2D previousShadowMap;\\n\tuniform float averagingWindow;\\n' +\n\t\t\t\tshader.fragmentShader.slice( bodyStart - 1, - 1 ) +\n\t\t\t\t`\\nvec3 texelOld = texture2D(previousShadowMap, vLightMapUv).rgb;\n\t\t\t\tgl_FragColor.rgb = mix(texelOld, gl_FragColor.rgb, 1.0/averagingWindow);\n\t\t\t}`;\n\n\t\t\t// Set the Previous Frame's Texture Buffer and Averaging Window\n\t\t\tshader.uniforms.previousShadowMap = { value: this.progressiveLightMap1.texture };\n\t\t\tshader.uniforms.averagingWindow = { value: 100 };\n\n\t\t\tthis.uvMat.uniforms = shader.uniforms;\n\n\t\t\t// Set the new Shader to this\n\t\t\tthis.uvMat.userData.shader = shader;\n\n\t\t};\n\n\t}\n\n\t/**\n\t * Sets these objects' materials' lightmaps and modifies their uv1's.\n\t *\n\t * @param {Array<Object3D>} objects - An array of objects and lights to set up your lightmap.\n\t */\n\taddObjectsToLightMap( objects ) {\n\n\t\t// Prepare list of UV bounding boxes for packing later...\n\t\tthis.uv_boxes = []; const padding = 3 / this.res;\n\n\t\tfor ( let ob = 0; ob < objects.length; ob ++ ) {\n\n\t\t\tconst object = objects[ ob ];\n\n\t\t\t// If this object is a light, simply add it to the internal scene\n\t\t\tif ( object.isLight ) {\n\n\t\t\t\tthis.scene.attach( object ); continue;\n\n\t\t\t}\n\n\t\t\tif ( object.geometry.hasAttribute( 'uv' ) === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.ProgressiveLightMap: All lightmap objects need uvs.' ); continue;\n\n\t\t\t}\n\n\t\t\tif ( object.geometry.hasAttribute( 'normal' ) === false ) {\n\n\t\t\t\tconsole.warn( 'THREE.ProgressiveLightMap: All lightmap objects need normals.' ); continue;\n\n\t\t\t}\n\n\t\t\tif ( this.blurringPlane === null ) {\n\n\t\t\t\tthis._initializeBlurPlane( this.res, this.progressiveLightMap1 );\n\n\t\t\t}\n\n\t\t\t// Apply the lightmap to the object\n\t\t\tobject.material.lightMap = this.progressiveLightMap2.texture;\n\t\t\tobject.material.dithering = true;\n\t\t\tobject.castShadow = true;\n\t\t\tobject.receiveShadow = true;\n\t\t\tobject.renderOrder = 1000 + ob;\n\n\t\t\t// Prepare UV boxes for potpack\n\t\t\t// TODO: Size these by object surface area\n\t\t\tthis.uv_boxes.push( { w: 1 + ( padding * 2 ),\n\t\t\t\t\t\t\t\t  h: 1 + ( padding * 2 ), index: ob } );\n\n\t\t\tthis.lightMapContainers.push( { basicMat: object.material, object: object } );\n\n\t\t}\n\n\t\t// Pack the objects' lightmap UVs into the same global space\n\t\tconst dimensions = potpack( this.uv_boxes );\n\t\tthis.uv_boxes.forEach( ( box ) => {\n\n\t\t\tconst uv1 = objects[ box.index ].geometry.getAttribute( 'uv' ).clone();\n\t\t\tfor ( let i = 0; i < uv1.array.length; i += uv1.itemSize ) {\n\n\t\t\t\tuv1.array[ i ] = ( uv1.array[ i ] + box.x + padding ) / dimensions.w;\n\t\t\t\tuv1.array[ i + 1 ] = ( uv1.array[ i + 1 ] + box.y + padding ) / dimensions.h;\n\n\t\t\t}\n\n\t\t\tobjects[ box.index ].geometry.setAttribute( 'uv1', uv1 );\n\t\t\tobjects[ box.index ].geometry.getAttribute( 'uv1' ).needsUpdate = true;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * This function renders each mesh one at a time into their respective surface maps.\n\t *\n\t * @param {Camera} camera - The camera the scene is rendered with.\n\t * @param {number} [blendWindow=100] - When >1, samples will accumulate over time.\n\t * @param {boolean} [blurEdges=true] - Whether to fix UV Edges via blurring.\n\t */\n\tupdate( camera, blendWindow = 100, blurEdges = true ) {\n\n\t\tif ( this.blurringPlane === null ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// Store the original Render Target\n\t\tconst oldTarget = this.renderer.getRenderTarget();\n\n\t\t// The blurring plane applies blur to the seams of the lightmap\n\t\tthis.blurringPlane.visible = blurEdges;\n\n\t\t// Steal the Object3D from the real world to our special dimension\n\t\tfor ( let l = 0; l < this.lightMapContainers.length; l ++ ) {\n\n\t\t\tthis.lightMapContainers[ l ].object.oldScene =\n\t\t\t\tthis.lightMapContainers[ l ].object.parent;\n\t\t\tthis.scene.attach( this.lightMapContainers[ l ].object );\n\n\t\t}\n\n\t\t// Initialize everything\n\t\tif ( this.firstUpdate === true ) {\n\n\t\t\tthis.renderer.compile( this.scene, camera );\n\t\t\tthis.firstUpdate = false;\n\n\t\t}\n\n\t\t// Set each object's material to the UV Unwrapped Surface Mapping Version\n\t\tfor ( let l = 0; l < this.lightMapContainers.length; l ++ ) {\n\n\t\t\tthis.uvMat.uniforms.averagingWindow = { value: blendWindow };\n\t\t\tthis.lightMapContainers[ l ].object.material = this.uvMat;\n\t\t\tthis.lightMapContainers[ l ].object.oldFrustumCulled =\n\t\t\t\tthis.lightMapContainers[ l ].object.frustumCulled;\n\t\t\tthis.lightMapContainers[ l ].object.frustumCulled = false;\n\n\t\t}\n\n\t\t// Ping-pong two surface buffers for reading/writing\n\t\tconst activeMap = this.buffer1Active ? this.progressiveLightMap1 : this.progressiveLightMap2;\n\t\tconst inactiveMap = this.buffer1Active ? this.progressiveLightMap2 : this.progressiveLightMap1;\n\n\t\t// Render the object's surface maps\n\t\tthis.renderer.setRenderTarget( activeMap );\n\t\tthis.uvMat.uniforms.previousShadowMap = { value: inactiveMap.texture };\n\t\tthis.blurringPlane.material.uniforms.previousShadowMap = { value: inactiveMap.texture };\n\t\tthis.buffer1Active = ! this.buffer1Active;\n\t\tthis.renderer.render( this.scene, camera );\n\n\t\t// Restore the object's Real-time Material and add it back to the original world\n\t\tfor ( let l = 0; l < this.lightMapContainers.length; l ++ ) {\n\n\t\t\tthis.lightMapContainers[ l ].object.frustumCulled =\n\t\t\t\tthis.lightMapContainers[ l ].object.oldFrustumCulled;\n\t\t\tthis.lightMapContainers[ l ].object.material = this.lightMapContainers[ l ].basicMat;\n\t\t\tthis.lightMapContainers[ l ].object.oldScene.attach( this.lightMapContainers[ l ].object );\n\n\t\t}\n\n\t\t// Restore the original Render Target\n\t\tthis.renderer.setRenderTarget( oldTarget );\n\n\t}\n\n\t/**\n\t * Draws the lightmap in the main scene. Call this after adding the objects to it.\n\t *\n\t * @param {boolean} visible - Whether the debug plane should be visible\n\t * @param {Vector3} [position] - Where the debug plane should be drawn\n\t*/\n\tshowDebugLightmap( visible, position = undefined ) {\n\n\t\tif ( this.lightMapContainers.length === 0 ) {\n\n\t\t\tconsole.warn( 'THREE.ProgressiveLightMap: Call .showDebugLightmap() after adding the objects.' );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.labelMesh === null ) {\n\n\t\t\tconst labelMaterial = new MeshBasicMaterial( { map: this.progressiveLightMap1.texture, side: DoubleSide } );\n\t\t\tconst labelGeometry = new PlaneGeometry( 100, 100 );\n\t\t\tthis.labelMesh = new Mesh( labelGeometry, labelMaterial );\n\t\t\tthis.labelMesh.position.y = 250;\n\t\t\tthis.lightMapContainers[ 0 ].object.parent.add( this.labelMesh );\n\n\t\t}\n\n\t\tif ( position !== undefined ) {\n\n\t\t\tthis.labelMesh.position.copy( position );\n\n\t\t}\n\n\t\tthis.labelMesh.visible = visible;\n\n\t}\n\n\t/**\n\t * Creates the Blurring Plane.\n\t *\n\t * @private\n\t * @param {number} res - The square resolution of this object's lightMap.\n\t * @param {WebGLRenderTarget} lightMap - The lightmap to initialize the plane with.\n\t */\n\t_initializeBlurPlane( res, lightMap ) {\n\n\t\tconst blurMaterial = new MeshBasicMaterial();\n\t\tblurMaterial.uniforms = { previousShadowMap: { value: null },\n\t\t\t\t\t\t\t\t  pixelOffset: { value: 1.0 / res },\n\t\t\t\t\t\t\t\t  polygonOffset: true, polygonOffsetFactor: - 1, polygonOffsetUnits: 3.0 };\n\t\tblurMaterial.onBeforeCompile = ( shader ) => {\n\n\t\t\t// Vertex Shader: Set Vertex Positions to the Unwrapped UV Positions\n\t\t\tshader.vertexShader =\n\t\t\t\t'#define USE_UV\\n' +\n\t\t\t\tshader.vertexShader.slice( 0, - 1 ) +\n\t\t\t\t'\tgl_Position = vec4((uv - 0.5) * 2.0, 1.0, 1.0); }';\n\n\t\t\t// Fragment Shader: Set Pixels to 9-tap box blur the current frame's Shadows\n\t\t\tconst bodyStart\t= shader.fragmentShader.indexOf( 'void main() {' );\n\t\t\tshader.fragmentShader =\n\t\t\t\t'#define USE_UV\\n' +\n\t\t\t\tshader.fragmentShader.slice( 0, bodyStart ) +\n\t\t\t\t'\tuniform sampler2D previousShadowMap;\\n\tuniform float pixelOffset;\\n' +\n\t\t\t\tshader.fragmentShader.slice( bodyStart - 1, - 1 ) +\n\t\t\t\t\t`\tgl_FragColor.rgb = (\n\t\t\t\t\t\t\t\t\ttexture2D(previousShadowMap, vUv + vec2( pixelOffset,  0.0        )).rgb +\n\t\t\t\t\t\t\t\t\ttexture2D(previousShadowMap, vUv + vec2( 0.0        ,  pixelOffset)).rgb +\n\t\t\t\t\t\t\t\t\ttexture2D(previousShadowMap, vUv + vec2( 0.0        , -pixelOffset)).rgb +\n\t\t\t\t\t\t\t\t\ttexture2D(previousShadowMap, vUv + vec2(-pixelOffset,  0.0        )).rgb +\n\t\t\t\t\t\t\t\t\ttexture2D(previousShadowMap, vUv + vec2( pixelOffset,  pixelOffset)).rgb +\n\t\t\t\t\t\t\t\t\ttexture2D(previousShadowMap, vUv + vec2(-pixelOffset,  pixelOffset)).rgb +\n\t\t\t\t\t\t\t\t\ttexture2D(previousShadowMap, vUv + vec2( pixelOffset, -pixelOffset)).rgb +\n\t\t\t\t\t\t\t\t\ttexture2D(previousShadowMap, vUv + vec2(-pixelOffset, -pixelOffset)).rgb)/8.0;\n\t\t\t\t}`;\n\n\t\t\t// Set the LightMap Accumulation Buffer\n\t\t\tshader.uniforms.previousShadowMap = { value: lightMap.texture };\n\t\t\tshader.uniforms.pixelOffset = { value: 0.5 / res };\n\t\t\tblurMaterial.uniforms = shader.uniforms;\n\n\t\t\t// Set the new Shader to this\n\t\t\tblurMaterial.userData.shader = shader;\n\n\t\t};\n\n\t\tthis.blurringPlane = new Mesh( new PlaneGeometry( 1, 1 ), blurMaterial );\n\t\tthis.blurringPlane.name = 'Blurring Plane';\n\t\tthis.blurringPlane.frustumCulled = false;\n\t\tthis.blurringPlane.renderOrder = 0;\n\t\tthis.blurringPlane.material.depthWrite = false;\n\t\tthis.scene.add( this.blurringPlane );\n\n\t}\n\n\t/**\n\t * Frees all internal resources.\n\t */\n\tdispose() {\n\n\t\tthis.progressiveLightMap1.dispose();\n\t\tthis.progressiveLightMap2.dispose();\n\n\t\tthis.uvMat.dispose();\n\n\t\tif ( this.blurringPlane !== null ) {\n\n\t\t\tthis.blurringPlane.geometry.dispose();\n\t\t\tthis.blurringPlane.material.dispose();\n\n\t\t}\n\n\t\tif ( this.labelMesh !== null ) {\n\n\t\t\tthis.labelMesh.geometry.dispose();\n\t\t\tthis.labelMesh.material.dispose();\n\n\t\t}\n\n\t}\n\n}\n\nexport { ProgressiveLightMap };\n", "import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tColor,\n\tQuaternion,\n\tRaycaster,\n\tSRGBColorSpace,\n\tVector3\n} from 'three';\n\n/**\n * A procedural roller coaster geometry.\n *\n * @augments BufferGeometry\n * @three_import import { RollerCoasterGeometry } from 'three/addons/misc/RollerCoaster.js';\n */\nclass RollerCoasterGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new geometry.\n\t *\n\t * @param {Curve} curve - The curve to generate the geometry along.\n \t * @param {number} divisions - The number of divisions which defines the detail of the geometry.\n\t */\n\tconstructor( curve, divisions ) {\n\n\t\tsuper();\n\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst colors = [];\n\n\t\tconst color1 = [ 1, 1, 1 ];\n\t\tconst color2 = [ 1, 1, 0 ];\n\n\t\tconst up = new Vector3( 0, 1, 0 );\n\t\tconst forward = new Vector3();\n\t\tconst right = new Vector3();\n\n\t\tconst quaternion = new Quaternion();\n\t\tconst prevQuaternion = new Quaternion();\n\t\tprevQuaternion.setFromAxisAngle( up, Math.PI / 2 );\n\n\t\tconst point = new Vector3();\n\t\tconst prevPoint = new Vector3();\n\t\tprevPoint.copy( curve.getPointAt( 0 ) );\n\n\t\t// shapes\n\n\t\tconst step = [\n\t\t\tnew Vector3( - 0.225, 0, 0 ),\n\t\t\tnew Vector3( 0, - 0.050, 0 ),\n\t\t\tnew Vector3( 0, - 0.175, 0 ),\n\n\t\t\tnew Vector3( 0, - 0.050, 0 ),\n\t\t\tnew Vector3( 0.225, 0, 0 ),\n\t\t\tnew Vector3( 0, - 0.175, 0 )\n\t\t];\n\n\t\tconst PI2 = Math.PI * 2;\n\n\t\tlet sides = 5;\n\t\tconst tube1 = [];\n\n\t\tfor ( let i = 0; i < sides; i ++ ) {\n\n\t\t\tconst angle = ( i / sides ) * PI2;\n\t\t\ttube1.push( new Vector3( Math.sin( angle ) * 0.06, Math.cos( angle ) * 0.06, 0 ) );\n\n\t\t}\n\n\t\tsides = 6;\n\t\tconst tube2 = [];\n\n\t\tfor ( let i = 0; i < sides; i ++ ) {\n\n\t\t\tconst angle = ( i / sides ) * PI2;\n\t\t\ttube2.push( new Vector3( Math.sin( angle ) * 0.025, Math.cos( angle ) * 0.025, 0 ) );\n\n\t\t}\n\n\t\tconst vector = new Vector3();\n\t\tconst normal = new Vector3();\n\n\t\tfunction drawShape( shape, color ) {\n\n\t\t\tnormal.set( 0, 0, - 1 ).applyQuaternion( quaternion );\n\n\t\t\tfor ( let j = 0; j < shape.length; j ++ ) {\n\n\t\t\t\tvector.copy( shape[ j ] );\n\t\t\t\tvector.applyQuaternion( quaternion );\n\t\t\t\tvector.add( point );\n\n\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\t\t\t\tcolors.push( color[ 0 ], color[ 1 ], color[ 2 ] );\n\n\t\t\t}\n\n\t\t\tnormal.set( 0, 0, 1 ).applyQuaternion( quaternion );\n\n\t\t\tfor ( let j = shape.length - 1; j >= 0; j -- ) {\n\n\t\t\t\tvector.copy( shape[ j ] );\n\t\t\t\tvector.applyQuaternion( quaternion );\n\t\t\t\tvector.add( point );\n\n\t\t\t\tvertices.push( vector.x, vector.y, vector.z );\n\t\t\t\tnormals.push( normal.x, normal.y, normal.z );\n\t\t\t\tcolors.push( color[ 0 ], color[ 1 ], color[ 2 ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst vector1 = new Vector3();\n\t\tconst vector2 = new Vector3();\n\t\tconst vector3 = new Vector3();\n\t\tconst vector4 = new Vector3();\n\n\t\tconst normal1 = new Vector3();\n\t\tconst normal2 = new Vector3();\n\t\tconst normal3 = new Vector3();\n\t\tconst normal4 = new Vector3();\n\n\t\tfunction extrudeShape( shape, offset, color ) {\n\n\t\t\tfor ( let j = 0, jl = shape.length; j < jl; j ++ ) {\n\n\t\t\t\tconst point1 = shape[ j ];\n\t\t\t\tconst point2 = shape[ ( j + 1 ) % jl ];\n\n\t\t\t\tvector1.copy( point1 ).add( offset );\n\t\t\t\tvector1.applyQuaternion( quaternion );\n\t\t\t\tvector1.add( point );\n\n\t\t\t\tvector2.copy( point2 ).add( offset );\n\t\t\t\tvector2.applyQuaternion( quaternion );\n\t\t\t\tvector2.add( point );\n\n\t\t\t\tvector3.copy( point2 ).add( offset );\n\t\t\t\tvector3.applyQuaternion( prevQuaternion );\n\t\t\t\tvector3.add( prevPoint );\n\n\t\t\t\tvector4.copy( point1 ).add( offset );\n\t\t\t\tvector4.applyQuaternion( prevQuaternion );\n\t\t\t\tvector4.add( prevPoint );\n\n\t\t\t\tvertices.push( vector1.x, vector1.y, vector1.z );\n\t\t\t\tvertices.push( vector2.x, vector2.y, vector2.z );\n\t\t\t\tvertices.push( vector4.x, vector4.y, vector4.z );\n\n\t\t\t\tvertices.push( vector2.x, vector2.y, vector2.z );\n\t\t\t\tvertices.push( vector3.x, vector3.y, vector3.z );\n\t\t\t\tvertices.push( vector4.x, vector4.y, vector4.z );\n\n\t\t\t\t//\n\n\t\t\t\tnormal1.copy( point1 );\n\t\t\t\tnormal1.applyQuaternion( quaternion );\n\t\t\t\tnormal1.normalize();\n\n\t\t\t\tnormal2.copy( point2 );\n\t\t\t\tnormal2.applyQuaternion( quaternion );\n\t\t\t\tnormal2.normalize();\n\n\t\t\t\tnormal3.copy( point2 );\n\t\t\t\tnormal3.applyQuaternion( prevQuaternion );\n\t\t\t\tnormal3.normalize();\n\n\t\t\t\tnormal4.copy( point1 );\n\t\t\t\tnormal4.applyQuaternion( prevQuaternion );\n\t\t\t\tnormal4.normalize();\n\n\t\t\t\tnormals.push( normal1.x, normal1.y, normal1.z );\n\t\t\t\tnormals.push( normal2.x, normal2.y, normal2.z );\n\t\t\t\tnormals.push( normal4.x, normal4.y, normal4.z );\n\n\t\t\t\tnormals.push( normal2.x, normal2.y, normal2.z );\n\t\t\t\tnormals.push( normal3.x, normal3.y, normal3.z );\n\t\t\t\tnormals.push( normal4.x, normal4.y, normal4.z );\n\n\t\t\t\tcolors.push( color[ 0 ], color[ 1 ], color[ 2 ] );\n\t\t\t\tcolors.push( color[ 0 ], color[ 1 ], color[ 2 ] );\n\t\t\t\tcolors.push( color[ 0 ], color[ 1 ], color[ 2 ] );\n\n\t\t\t\tcolors.push( color[ 0 ], color[ 1 ], color[ 2 ] );\n\t\t\t\tcolors.push( color[ 0 ], color[ 1 ], color[ 2 ] );\n\t\t\t\tcolors.push( color[ 0 ], color[ 1 ], color[ 2 ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst offset = new Vector3();\n\n\t\tfor ( let i = 1; i <= divisions; i ++ ) {\n\n\t\t\tpoint.copy( curve.getPointAt( i / divisions ) );\n\n\t\t\tup.set( 0, 1, 0 );\n\n\t\t\tforward.subVectors( point, prevPoint ).normalize();\n\t\t\tright.crossVectors( up, forward ).normalize();\n\t\t\tup.crossVectors( forward, right );\n\n\t\t\tconst angle = Math.atan2( forward.x, forward.z );\n\n\t\t\tquaternion.setFromAxisAngle( up, angle );\n\n\t\t\tif ( i % 2 === 0 ) {\n\n\t\t\t\tdrawShape( step, color2 );\n\n\t\t\t}\n\n\t\t\textrudeShape( tube1, offset.set( 0, - 0.125, 0 ), color2 );\n\t\t\textrudeShape( tube2, offset.set( 0.2, 0, 0 ), color1 );\n\t\t\textrudeShape( tube2, offset.set( - 0.2, 0, 0 ), color1 );\n\n\t\t\tprevPoint.copy( point );\n\t\t\tprevQuaternion.copy( quaternion );\n\n\t\t}\n\n\t\t// console.log( vertices.length );\n\n\t\tthis.setAttribute( 'position', new BufferAttribute( new Float32Array( vertices ), 3 ) );\n\t\tthis.setAttribute( 'normal', new BufferAttribute( new Float32Array( normals ), 3 ) );\n\t\tthis.setAttribute( 'color', new BufferAttribute( new Float32Array( colors ), 3 ) );\n\n\t}\n\n}\n\n/**\n * A procedural roller coaster lifters geometry.\n *\n * @augments BufferGeometry\n * @three_import import { RollerCoasterLiftersGeometry } from 'three/addons/misc/RollerCoaster.js';\n */\nclass RollerCoasterLiftersGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new geometry.\n\t *\n\t * @param {Curve} curve - The curve to generate the geometry along.\n \t * @param {number} divisions - The number of divisions which defines the detail of the geometry.\n\t */\n\tconstructor( curve, divisions ) {\n\n\t\tsuper();\n\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\n\t\tconst quaternion = new Quaternion();\n\n\t\tconst up = new Vector3( 0, 1, 0 );\n\n\t\tconst point = new Vector3();\n\t\tconst tangent = new Vector3();\n\n\t\t// shapes\n\n\t\tconst tube1 = [\n\t\t\tnew Vector3( 0, 0.05, - 0.05 ),\n\t\t\tnew Vector3( 0, 0.05, 0.05 ),\n\t\t\tnew Vector3( 0, - 0.05, 0 )\n\t\t];\n\n\t\tconst tube2 = [\n\t\t\tnew Vector3( - 0.05, 0, 0.05 ),\n\t\t\tnew Vector3( - 0.05, 0, - 0.05 ),\n\t\t\tnew Vector3( 0.05, 0, 0 )\n\t\t];\n\n\t\tconst tube3 = [\n\t\t\tnew Vector3( 0.05, 0, - 0.05 ),\n\t\t\tnew Vector3( 0.05, 0, 0.05 ),\n\t\t\tnew Vector3( - 0.05, 0, 0 )\n\t\t];\n\n\t\tconst vector1 = new Vector3();\n\t\tconst vector2 = new Vector3();\n\t\tconst vector3 = new Vector3();\n\t\tconst vector4 = new Vector3();\n\n\t\tconst normal1 = new Vector3();\n\t\tconst normal2 = new Vector3();\n\t\tconst normal3 = new Vector3();\n\t\tconst normal4 = new Vector3();\n\n\t\tfunction extrudeShape( shape, fromPoint, toPoint ) {\n\n\t\t\tfor ( let j = 0, jl = shape.length; j < jl; j ++ ) {\n\n\t\t\t\tconst point1 = shape[ j ];\n\t\t\t\tconst point2 = shape[ ( j + 1 ) % jl ];\n\n\t\t\t\tvector1.copy( point1 );\n\t\t\t\tvector1.applyQuaternion( quaternion );\n\t\t\t\tvector1.add( fromPoint );\n\n\t\t\t\tvector2.copy( point2 );\n\t\t\t\tvector2.applyQuaternion( quaternion );\n\t\t\t\tvector2.add( fromPoint );\n\n\t\t\t\tvector3.copy( point2 );\n\t\t\t\tvector3.applyQuaternion( quaternion );\n\t\t\t\tvector3.add( toPoint );\n\n\t\t\t\tvector4.copy( point1 );\n\t\t\t\tvector4.applyQuaternion( quaternion );\n\t\t\t\tvector4.add( toPoint );\n\n\t\t\t\tvertices.push( vector1.x, vector1.y, vector1.z );\n\t\t\t\tvertices.push( vector2.x, vector2.y, vector2.z );\n\t\t\t\tvertices.push( vector4.x, vector4.y, vector4.z );\n\n\t\t\t\tvertices.push( vector2.x, vector2.y, vector2.z );\n\t\t\t\tvertices.push( vector3.x, vector3.y, vector3.z );\n\t\t\t\tvertices.push( vector4.x, vector4.y, vector4.z );\n\n\t\t\t\t//\n\n\t\t\t\tnormal1.copy( point1 );\n\t\t\t\tnormal1.applyQuaternion( quaternion );\n\t\t\t\tnormal1.normalize();\n\n\t\t\t\tnormal2.copy( point2 );\n\t\t\t\tnormal2.applyQuaternion( quaternion );\n\t\t\t\tnormal2.normalize();\n\n\t\t\t\tnormal3.copy( point2 );\n\t\t\t\tnormal3.applyQuaternion( quaternion );\n\t\t\t\tnormal3.normalize();\n\n\t\t\t\tnormal4.copy( point1 );\n\t\t\t\tnormal4.applyQuaternion( quaternion );\n\t\t\t\tnormal4.normalize();\n\n\t\t\t\tnormals.push( normal1.x, normal1.y, normal1.z );\n\t\t\t\tnormals.push( normal2.x, normal2.y, normal2.z );\n\t\t\t\tnormals.push( normal4.x, normal4.y, normal4.z );\n\n\t\t\t\tnormals.push( normal2.x, normal2.y, normal2.z );\n\t\t\t\tnormals.push( normal3.x, normal3.y, normal3.z );\n\t\t\t\tnormals.push( normal4.x, normal4.y, normal4.z );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst fromPoint = new Vector3();\n\t\tconst toPoint = new Vector3();\n\n\t\tfor ( let i = 1; i <= divisions; i ++ ) {\n\n\t\t\tpoint.copy( curve.getPointAt( i / divisions ) );\n\t\t\ttangent.copy( curve.getTangentAt( i / divisions ) );\n\n\t\t\tconst angle = Math.atan2( tangent.x, tangent.z );\n\n\t\t\tquaternion.setFromAxisAngle( up, angle );\n\n\t\t\t//\n\n\t\t\tif ( point.y > 10 ) {\n\n\t\t\t\tfromPoint.set( - 0.75, - 0.35, 0 );\n\t\t\t\tfromPoint.applyQuaternion( quaternion );\n\t\t\t\tfromPoint.add( point );\n\n\t\t\t\ttoPoint.set( 0.75, - 0.35, 0 );\n\t\t\t\ttoPoint.applyQuaternion( quaternion );\n\t\t\t\ttoPoint.add( point );\n\n\t\t\t\textrudeShape( tube1, fromPoint, toPoint );\n\n\t\t\t\tfromPoint.set( - 0.7, - 0.3, 0 );\n\t\t\t\tfromPoint.applyQuaternion( quaternion );\n\t\t\t\tfromPoint.add( point );\n\n\t\t\t\ttoPoint.set( - 0.7, - point.y, 0 );\n\t\t\t\ttoPoint.applyQuaternion( quaternion );\n\t\t\t\ttoPoint.add( point );\n\n\t\t\t\textrudeShape( tube2, fromPoint, toPoint );\n\n\t\t\t\tfromPoint.set( 0.7, - 0.3, 0 );\n\t\t\t\tfromPoint.applyQuaternion( quaternion );\n\t\t\t\tfromPoint.add( point );\n\n\t\t\t\ttoPoint.set( 0.7, - point.y, 0 );\n\t\t\t\ttoPoint.applyQuaternion( quaternion );\n\t\t\t\ttoPoint.add( point );\n\n\t\t\t\textrudeShape( tube3, fromPoint, toPoint );\n\n\t\t\t} else {\n\n\t\t\t\tfromPoint.set( 0, - 0.2, 0 );\n\t\t\t\tfromPoint.applyQuaternion( quaternion );\n\t\t\t\tfromPoint.add( point );\n\n\t\t\t\ttoPoint.set( 0, - point.y, 0 );\n\t\t\t\ttoPoint.applyQuaternion( quaternion );\n\t\t\t\ttoPoint.add( point );\n\n\t\t\t\textrudeShape( tube3, fromPoint, toPoint );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setAttribute( 'position', new BufferAttribute( new Float32Array( vertices ), 3 ) );\n\t\tthis.setAttribute( 'normal', new BufferAttribute( new Float32Array( normals ), 3 ) );\n\n\t}\n\n}\n\n/**\n * A procedural roller coaster shadow geometry.\n *\n * @augments BufferGeometry\n * @three_import import { RollerCoasterShadowGeometry } from 'three/addons/misc/RollerCoaster.js';\n */\nclass RollerCoasterShadowGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new geometry.\n\t *\n\t * @param {Curve} curve - The curve to generate the geometry along.\n \t * @param {number} divisions - The number of divisions which defines the detail of the geometry.\n\t */\n\tconstructor( curve, divisions ) {\n\n\t\tsuper();\n\n\t\tconst vertices = [];\n\n\t\tconst up = new Vector3( 0, 1, 0 );\n\t\tconst forward = new Vector3();\n\n\t\tconst quaternion = new Quaternion();\n\t\tconst prevQuaternion = new Quaternion();\n\t\tprevQuaternion.setFromAxisAngle( up, Math.PI / 2 );\n\n\t\tconst point = new Vector3();\n\n\t\tconst prevPoint = new Vector3();\n\t\tprevPoint.copy( curve.getPointAt( 0 ) );\n\t\tprevPoint.y = 0;\n\n\t\tconst vector1 = new Vector3();\n\t\tconst vector2 = new Vector3();\n\t\tconst vector3 = new Vector3();\n\t\tconst vector4 = new Vector3();\n\n\t\tfor ( let i = 1; i <= divisions; i ++ ) {\n\n\t\t\tpoint.copy( curve.getPointAt( i / divisions ) );\n\t\t\tpoint.y = 0;\n\n\t\t\tforward.subVectors( point, prevPoint );\n\n\t\t\tconst angle = Math.atan2( forward.x, forward.z );\n\n\t\t\tquaternion.setFromAxisAngle( up, angle );\n\n\t\t\tvector1.set( - 0.3, 0, 0 );\n\t\t\tvector1.applyQuaternion( quaternion );\n\t\t\tvector1.add( point );\n\n\t\t\tvector2.set( 0.3, 0, 0 );\n\t\t\tvector2.applyQuaternion( quaternion );\n\t\t\tvector2.add( point );\n\n\t\t\tvector3.set( 0.3, 0, 0 );\n\t\t\tvector3.applyQuaternion( prevQuaternion );\n\t\t\tvector3.add( prevPoint );\n\n\t\t\tvector4.set( - 0.3, 0, 0 );\n\t\t\tvector4.applyQuaternion( prevQuaternion );\n\t\t\tvector4.add( prevPoint );\n\n\t\t\tvertices.push( vector1.x, vector1.y, vector1.z );\n\t\t\tvertices.push( vector2.x, vector2.y, vector2.z );\n\t\t\tvertices.push( vector4.x, vector4.y, vector4.z );\n\n\t\t\tvertices.push( vector2.x, vector2.y, vector2.z );\n\t\t\tvertices.push( vector3.x, vector3.y, vector3.z );\n\t\t\tvertices.push( vector4.x, vector4.y, vector4.z );\n\n\t\t\tprevPoint.copy( point );\n\t\t\tprevQuaternion.copy( quaternion );\n\n\t\t}\n\n\t\tthis.setAttribute( 'position', new BufferAttribute( new Float32Array( vertices ), 3 ) );\n\n\t}\n\n}\n\n/**\n * A procedural sky geometry.\n *\n * @augments BufferGeometry\n * @three_import import { SkyGeometry } from 'three/addons/misc/RollerCoaster.js';\n */\nclass SkyGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new geometry.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tconst vertices = [];\n\n\t\tfor ( let i = 0; i < 100; i ++ ) {\n\n\t\t\tconst x = Math.random() * 800 - 400;\n\t\t\tconst y = Math.random() * 50 + 50;\n\t\t\tconst z = Math.random() * 800 - 400;\n\n\t\t\tconst size = Math.random() * 40 + 20;\n\n\t\t\tvertices.push( x - size, y, z - size );\n\t\t\tvertices.push( x + size, y, z - size );\n\t\t\tvertices.push( x - size, y, z + size );\n\n\t\t\tvertices.push( x + size, y, z - size );\n\t\t\tvertices.push( x + size, y, z + size );\n\t\t\tvertices.push( x - size, y, z + size );\n\n\t\t}\n\n\n\t\tthis.setAttribute( 'position', new BufferAttribute( new Float32Array( vertices ), 3 ) );\n\n\t}\n\n}\n\n/**\n * A procedural trees geometry.\n *\n * @augments BufferGeometry\n * @three_import import { TreesGeometry } from 'three/addons/misc/RollerCoaster.js';\n */\nclass TreesGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new geometry.\n\t *\n\t * @param {Mesh} landscape - A mesh representing the landscape. Trees will be positioned\n\t * randomly on the landscape's surface.\n\t */\n\tconstructor( landscape ) {\n\n\t\tsuper();\n\n\t\tconst vertices = [];\n\t\tconst colors = [];\n\n\t\tconst raycaster = new Raycaster();\n\t\traycaster.ray.direction.set( 0, - 1, 0 );\n\n\t\tconst _color = new Color();\n\n\t\tfor ( let i = 0; i < 2000; i ++ ) {\n\n\t\t\tconst x = Math.random() * 500 - 250;\n\t\t\tconst z = Math.random() * 500 - 250;\n\n\t\t\traycaster.ray.origin.set( x, 50, z );\n\n\t\t\tconst intersections = raycaster.intersectObject( landscape );\n\n\t\t\tif ( intersections.length === 0 ) continue;\n\n\t\t\tconst y = intersections[ 0 ].point.y;\n\n\t\t\tconst height = Math.random() * 5 + 0.5;\n\n\t\t\tlet angle = Math.random() * Math.PI * 2;\n\n\t\t\tvertices.push( x + Math.sin( angle ), y, z + Math.cos( angle ) );\n\t\t\tvertices.push( x, y + height, z );\n\t\t\tvertices.push( x + Math.sin( angle + Math.PI ), y, z + Math.cos( angle + Math.PI ) );\n\n\t\t\tangle += Math.PI / 2;\n\n\t\t\tvertices.push( x + Math.sin( angle ), y, z + Math.cos( angle ) );\n\t\t\tvertices.push( x, y + height, z );\n\t\t\tvertices.push( x + Math.sin( angle + Math.PI ), y, z + Math.cos( angle + Math.PI ) );\n\n\t\t\tconst random = Math.random() * 0.1;\n\n\t\t\tfor ( let j = 0; j < 6; j ++ ) {\n\n\t\t\t\t_color.setRGB( 0.2 + random, 0.4 + random, 0, SRGBColorSpace );\n\n\t\t\t\tcolors.push( _color.r, _color.g, _color.b );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setAttribute( 'position', new BufferAttribute( new Float32Array( vertices ), 3 ) );\n\t\tthis.setAttribute( 'color', new BufferAttribute( new Float32Array( colors ), 3 ) );\n\n\t}\n\n}\n\nexport { RollerCoasterGeometry, RollerCoasterLiftersGeometry, RollerCoasterShadowGeometry, SkyGeometry, TreesGeometry };\n", "import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tColor,\n\tDynamicDrawUsage,\n\tMatrix4,\n\tMesh,\n\tMeshStandardMaterial,\n\tVector3\n} from 'three';\n\n/**\n * @classdesc This module can be used to paint tube-like meshes\n * along a sequence of points. This module is used in a XR\n * painter demo.\n *\n * ```js\n * const painter = new TubePainter();\n * scene.add( painter.mesh );\n * ```\n *\n * @name TubePainter\n * @class\n * @three_import import { TubePainter } from 'three/addons/misc/TubePainter.js';\n */\nfunction TubePainter() {\n\n\tconst BUFFER_SIZE = 1000000 * 3;\n\n\tconst positions = new BufferAttribute( new Float32Array( BUFFER_SIZE ), 3 );\n\tpositions.usage = DynamicDrawUsage;\n\n\tconst normals = new BufferAttribute( new Float32Array( BUFFER_SIZE ), 3 );\n\tnormals.usage = DynamicDrawUsage;\n\n\tconst colors = new BufferAttribute( new Float32Array( BUFFER_SIZE ), 3 );\n\tcolors.usage = DynamicDrawUsage;\n\n\tconst geometry = new BufferGeometry();\n\tgeometry.setAttribute( 'position', positions );\n\tgeometry.setAttribute( 'normal', normals );\n\tgeometry.setAttribute( 'color', colors );\n\tgeometry.drawRange.count = 0;\n\n\tconst material = new MeshStandardMaterial( { vertexColors: true } );\n\n\tconst mesh = new Mesh( geometry, material );\n\tmesh.frustumCulled = false;\n\n\t//\n\n\tfunction getPoints( size ) {\n\n\t\tconst PI2 = Math.PI * 2;\n\n\t\tconst sides = 15;\n\t\tconst array = [];\n\t\tconst radius = 0.01 * size;\n\n\t\tfor ( let i = 0; i < sides; i ++ ) {\n\n\t\t\tconst angle = ( i / sides ) * PI2;\n\t\t\tarray.push( new Vector3( Math.sin( angle ) * radius, Math.cos( angle ) * radius, 0 ) );\n\n\t\t}\n\n\t\treturn array;\n\n\t}\n\n\t//\n\n\tconst vector = new Vector3();\n\n\tconst vector1 = new Vector3();\n\tconst vector2 = new Vector3();\n\tconst vector3 = new Vector3();\n\tconst vector4 = new Vector3();\n\n\tconst color1 = new Color( 0xffffff );\n\tconst color2 = new Color( 0xffffff );\n\n\tlet size1 = 1;\n\tlet size2 = 1;\n\n\tfunction addCap( position, matrix, isEndCap, capSize ) {\n\n\t\tlet count = geometry.drawRange.count;\n\n\t\tconst points = getPoints( capSize );\n\t\tconst sides = points.length;\n\t\tconst radius = 0.01 * capSize;\n\t\tconst latSegments = 4;\n\t\tconst directionSign = isEndCap ? - 1 : 1;\n\n\t\tfor ( let lat = 0; lat < latSegments; lat ++ ) {\n\n\t\t\tconst phi1 = ( lat / latSegments ) * Math.PI * 0.5;\n\t\t\tconst phi2 = ( ( lat + 1 ) / latSegments ) * Math.PI * 0.5;\n\n\t\t\tconst z1 = Math.sin( phi1 ) * radius * directionSign;\n\t\t\tconst r1 = Math.cos( phi1 ) * radius;\n\n\t\t\tconst z2 = Math.sin( phi2 ) * radius * directionSign;\n\t\t\tconst r2 = Math.cos( phi2 ) * radius;\n\n\t\t\tfor ( let i = 0; i < sides; i ++ ) {\n\n\t\t\t\tconst theta1 = ( i / sides ) * Math.PI * 2;\n\t\t\t\tconst theta2 = ( ( i + 1 ) / sides ) * Math.PI * 2;\n\n\t\t\t\t// First ring\n\t\t\t\tconst x1 = Math.sin( theta1 ) * r1;\n\t\t\t\tconst y1 = Math.cos( theta1 ) * r1;\n\n\t\t\t\tconst x2 = Math.sin( theta2 ) * r1;\n\t\t\t\tconst y2 = Math.cos( theta2 ) * r1;\n\n\t\t\t\t// Second ring\n\t\t\t\tconst x3 = Math.sin( theta1 ) * r2;\n\t\t\t\tconst y3 = Math.cos( theta1 ) * r2;\n\n\t\t\t\tconst x4 = Math.sin( theta2 ) * r2;\n\t\t\t\tconst y4 = Math.cos( theta2 ) * r2;\n\n\t\t\t\t// Transform to world space\n\t\t\t\tvector1.set( x1, y1, z1 ).applyMatrix4( matrix ).add( position );\n\t\t\t\tvector2.set( x2, y2, z1 ).applyMatrix4( matrix ).add( position );\n\t\t\t\tvector3.set( x3, y3, z2 ).applyMatrix4( matrix ).add( position );\n\t\t\t\tvector4.set( x4, y4, z2 ).applyMatrix4( matrix ).add( position );\n\n\t\t\t\t// First triangle\n\t\t\t\tnormal.set( x1, y1, z1 ).normalize().transformDirection( matrix );\n\t\t\t\tvector.set( x2, y2, z1 ).normalize().transformDirection( matrix );\n\t\t\t\tside.set( x3, y3, z2 ).normalize().transformDirection( matrix );\n\n\t\t\t\tif ( isEndCap ) {\n\n\t\t\t\t\tvector1.toArray( positions.array, count * 3 );\n\t\t\t\t\tvector2.toArray( positions.array, ( count + 1 ) * 3 );\n\t\t\t\t\tvector3.toArray( positions.array, ( count + 2 ) * 3 );\n\n\t\t\t\t\tnormal.toArray( normals.array, count * 3 );\n\t\t\t\t\tvector.toArray( normals.array, ( count + 1 ) * 3 );\n\t\t\t\t\tside.toArray( normals.array, ( count + 2 ) * 3 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvector1.toArray( positions.array, count * 3 );\n\t\t\t\t\tvector3.toArray( positions.array, ( count + 1 ) * 3 );\n\t\t\t\t\tvector2.toArray( positions.array, ( count + 2 ) * 3 );\n\n\t\t\t\t\tnormal.toArray( normals.array, count * 3 );\n\t\t\t\t\tside.toArray( normals.array, ( count + 1 ) * 3 );\n\t\t\t\t\tvector.toArray( normals.array, ( count + 2 ) * 3 );\n\n\t\t\t\t}\n\n\t\t\t\tcolor1.toArray( colors.array, count * 3 );\n\t\t\t\tcolor1.toArray( colors.array, ( count + 1 ) * 3 );\n\t\t\t\tcolor1.toArray( colors.array, ( count + 2 ) * 3 );\n\n\t\t\t\tcount += 3;\n\n\t\t\t\t// Second triangle\n\t\t\t\tif ( r2 > 0.001 ) {\n\n\t\t\t\t\tnormal.set( x2, y2, z1 ).normalize().transformDirection( matrix );\n\t\t\t\t\tvector.set( x4, y4, z2 ).normalize().transformDirection( matrix );\n\t\t\t\t\tside.set( x3, y3, z2 ).normalize().transformDirection( matrix );\n\n\t\t\t\t\tif ( isEndCap ) {\n\n\t\t\t\t\t\tvector2.toArray( positions.array, count * 3 );\n\t\t\t\t\t\tvector4.toArray( positions.array, ( count + 1 ) * 3 );\n\t\t\t\t\t\tvector3.toArray( positions.array, ( count + 2 ) * 3 );\n\n\t\t\t\t\t\tnormal.toArray( normals.array, count * 3 );\n\t\t\t\t\t\tvector.toArray( normals.array, ( count + 1 ) * 3 );\n\t\t\t\t\t\tside.toArray( normals.array, ( count + 2 ) * 3 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvector3.toArray( positions.array, count * 3 );\n\t\t\t\t\t\tvector4.toArray( positions.array, ( count + 1 ) * 3 );\n\t\t\t\t\t\tvector2.toArray( positions.array, ( count + 2 ) * 3 );\n\n\t\t\t\t\t\tside.toArray( normals.array, count * 3 );\n\t\t\t\t\t\tvector.toArray( normals.array, ( count + 1 ) * 3 );\n\t\t\t\t\t\tnormal.toArray( normals.array, ( count + 2 ) * 3 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tcolor1.toArray( colors.array, count * 3 );\n\t\t\t\t\tcolor1.toArray( colors.array, ( count + 1 ) * 3 );\n\t\t\t\t\tcolor1.toArray( colors.array, ( count + 2 ) * 3 );\n\n\t\t\t\t\tcount += 3;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry.drawRange.count = count;\n\n\t}\n\n\tfunction updateEndCap( position, matrix, capSize ) {\n\n\t\tif ( endCapStartIndex === null ) return;\n\n\t\tconst points = getPoints( capSize );\n\t\tconst sides = points.length;\n\t\tconst radius = 0.01 * capSize;\n\t\tconst latSegments = 4;\n\n\t\tlet count = endCapStartIndex;\n\n\t\tfor ( let lat = 0; lat < latSegments; lat ++ ) {\n\n\t\t\tconst phi1 = ( lat / latSegments ) * Math.PI * 0.5;\n\t\t\tconst phi2 = ( ( lat + 1 ) / latSegments ) * Math.PI * 0.5;\n\n\t\t\tconst z1 = - Math.sin( phi1 ) * radius;\n\t\t\tconst r1 = Math.cos( phi1 ) * radius;\n\n\t\t\tconst z2 = - Math.sin( phi2 ) * radius;\n\t\t\tconst r2 = Math.cos( phi2 ) * radius;\n\n\t\t\tfor ( let i = 0; i < sides; i ++ ) {\n\n\t\t\t\tconst theta1 = ( i / sides ) * Math.PI * 2;\n\t\t\t\tconst theta2 = ( ( i + 1 ) / sides ) * Math.PI * 2;\n\n\t\t\t\t// First ring\n\t\t\t\tconst x1 = Math.sin( theta1 ) * r1;\n\t\t\t\tconst y1 = Math.cos( theta1 ) * r1;\n\n\t\t\t\tconst x2 = Math.sin( theta2 ) * r1;\n\t\t\t\tconst y2 = Math.cos( theta2 ) * r1;\n\n\t\t\t\t// Second ring\n\t\t\t\tconst x3 = Math.sin( theta1 ) * r2;\n\t\t\t\tconst y3 = Math.cos( theta1 ) * r2;\n\n\t\t\t\tconst x4 = Math.sin( theta2 ) * r2;\n\t\t\t\tconst y4 = Math.cos( theta2 ) * r2;\n\n\t\t\t\t// Transform positions to world space\n\t\t\t\tvector1.set( x1, y1, z1 ).applyMatrix4( matrix ).add( position );\n\t\t\t\tvector2.set( x2, y2, z1 ).applyMatrix4( matrix ).add( position );\n\t\t\t\tvector3.set( x3, y3, z2 ).applyMatrix4( matrix ).add( position );\n\t\t\t\tvector4.set( x4, y4, z2 ).applyMatrix4( matrix ).add( position );\n\n\t\t\t\t// Transform normals to world space\n\t\t\t\tnormal.set( x1, y1, z1 ).normalize().transformDirection( matrix );\n\t\t\t\tvector.set( x2, y2, z1 ).normalize().transformDirection( matrix );\n\t\t\t\tside.set( x3, y3, z2 ).normalize().transformDirection( matrix );\n\n\t\t\t\t// First triangle\n\t\t\t\tvector1.toArray( positions.array, count * 3 );\n\t\t\t\tvector2.toArray( positions.array, ( count + 1 ) * 3 );\n\t\t\t\tvector3.toArray( positions.array, ( count + 2 ) * 3 );\n\n\t\t\t\tnormal.toArray( normals.array, count * 3 );\n\t\t\t\tvector.toArray( normals.array, ( count + 1 ) * 3 );\n\t\t\t\tside.toArray( normals.array, ( count + 2 ) * 3 );\n\n\t\t\t\tcolor1.toArray( colors.array, count * 3 );\n\t\t\t\tcolor1.toArray( colors.array, ( count + 1 ) * 3 );\n\t\t\t\tcolor1.toArray( colors.array, ( count + 2 ) * 3 );\n\n\t\t\t\tcount += 3;\n\n\t\t\t\t// Second triangle\n\t\t\t\tif ( r2 > 0.001 ) {\n\n\t\t\t\t\tnormal.set( x2, y2, z1 ).normalize().transformDirection( matrix );\n\t\t\t\t\tvector.set( x4, y4, z2 ).normalize().transformDirection( matrix );\n\t\t\t\t\tside.set( x3, y3, z2 ).normalize().transformDirection( matrix );\n\n\t\t\t\t\tvector2.toArray( positions.array, count * 3 );\n\t\t\t\t\tvector4.toArray( positions.array, ( count + 1 ) * 3 );\n\t\t\t\t\tvector3.toArray( positions.array, ( count + 2 ) * 3 );\n\n\t\t\t\t\tnormal.toArray( normals.array, count * 3 );\n\t\t\t\t\tvector.toArray( normals.array, ( count + 1 ) * 3 );\n\t\t\t\t\tside.toArray( normals.array, ( count + 2 ) * 3 );\n\n\t\t\t\t\tcolor1.toArray( colors.array, count * 3 );\n\t\t\t\t\tcolor1.toArray( colors.array, ( count + 1 ) * 3 );\n\t\t\t\t\tcolor1.toArray( colors.array, ( count + 2 ) * 3 );\n\n\t\t\t\t\tcount += 3;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tpositions.addUpdateRange( endCapStartIndex * 3, endCapVertexCount * 3 );\n\t\tnormals.addUpdateRange( endCapStartIndex * 3, endCapVertexCount * 3 );\n\t\tcolors.addUpdateRange( endCapStartIndex * 3, endCapVertexCount * 3 );\n\n\t}\n\n\tfunction stroke( position1, position2, matrix1, matrix2, size1, size2 ) {\n\n\t\tif ( position1.distanceToSquared( position2 ) === 0 ) return;\n\n\t\tlet count = geometry.drawRange.count;\n\n\t\tconst points1 = getPoints( size1 );\n\t\tconst points2 = getPoints( size2 );\n\n\t\tfor ( let i = 0, il = points2.length; i < il; i ++ ) {\n\n\t\t\tconst vertex1_2 = points2[ i ];\n\t\t\tconst vertex2_2 = points2[ ( i + 1 ) % il ];\n\t\t\tconst vertex1_1 = points1[ i ];\n\t\t\tconst vertex2_1 = points1[ ( i + 1 ) % il ];\n\n\t\t\tvector1.copy( vertex1_2 ).applyMatrix4( matrix2 ).add( position2 );\n\t\t\tvector2.copy( vertex2_2 ).applyMatrix4( matrix2 ).add( position2 );\n\t\t\tvector3.copy( vertex2_1 ).applyMatrix4( matrix1 ).add( position1 );\n\t\t\tvector4.copy( vertex1_1 ).applyMatrix4( matrix1 ).add( position1 );\n\n\t\t\tvector1.toArray( positions.array, ( count + 0 ) * 3 );\n\t\t\tvector2.toArray( positions.array, ( count + 1 ) * 3 );\n\t\t\tvector4.toArray( positions.array, ( count + 2 ) * 3 );\n\n\t\t\tvector2.toArray( positions.array, ( count + 3 ) * 3 );\n\t\t\tvector3.toArray( positions.array, ( count + 4 ) * 3 );\n\t\t\tvector4.toArray( positions.array, ( count + 5 ) * 3 );\n\n\t\t\tvector1.copy( vertex1_2 ).applyMatrix4( matrix2 ).normalize();\n\t\t\tvector2.copy( vertex2_2 ).applyMatrix4( matrix2 ).normalize();\n\t\t\tvector3.copy( vertex2_1 ).applyMatrix4( matrix1 ).normalize();\n\t\t\tvector4.copy( vertex1_1 ).applyMatrix4( matrix1 ).normalize();\n\n\t\t\tvector1.toArray( normals.array, ( count + 0 ) * 3 );\n\t\t\tvector2.toArray( normals.array, ( count + 1 ) * 3 );\n\t\t\tvector4.toArray( normals.array, ( count + 2 ) * 3 );\n\n\t\t\tvector2.toArray( normals.array, ( count + 3 ) * 3 );\n\t\t\tvector3.toArray( normals.array, ( count + 4 ) * 3 );\n\t\t\tvector4.toArray( normals.array, ( count + 5 ) * 3 );\n\n\t\t\tcolor2.toArray( colors.array, ( count + 0 ) * 3 );\n\t\t\tcolor2.toArray( colors.array, ( count + 1 ) * 3 );\n\t\t\tcolor1.toArray( colors.array, ( count + 2 ) * 3 );\n\n\t\t\tcolor2.toArray( colors.array, ( count + 3 ) * 3 );\n\t\t\tcolor1.toArray( colors.array, ( count + 4 ) * 3 );\n\t\t\tcolor1.toArray( colors.array, ( count + 5 ) * 3 );\n\n\t\t\tcount += 6;\n\n\t\t}\n\n\t\tgeometry.drawRange.count = count;\n\n\t}\n\n\t//\n\n\tconst direction = new Vector3();\n\tconst normal = new Vector3();\n\tconst side = new Vector3();\n\n\tconst point1 = new Vector3();\n\tconst point2 = new Vector3();\n\n\tconst matrix1 = new Matrix4();\n\tconst matrix2 = new Matrix4();\n\n\tconst lastNormal = new Vector3();\n\tconst prevDirection = new Vector3();\n\tconst rotationAxis = new Vector3();\n\n\tlet isFirstSegment = true;\n\n\tlet endCapStartIndex = null;\n\tlet endCapVertexCount = 0;\n\n\tfunction calculateRMF() {\n\n\t\tif ( isFirstSegment === true ) {\n\n\t\t\tif ( Math.abs( direction.y ) < 0.99 ) {\n\n\t\t\t\tvector.copy( direction ).multiplyScalar( direction.y );\n\t\t\t\tnormal.set( 0, 1, 0 ).sub( vector ).normalize();\n\n\t\t\t} else {\n\n\t\t\t\tvector.copy( direction ).multiplyScalar( direction.x );\n\t\t\t\tnormal.set( 1, 0, 0 ).sub( vector ).normalize();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\trotationAxis.crossVectors( prevDirection, direction );\n\n\t\t\tconst rotAxisLength = rotationAxis.length();\n\n\t\t\tif ( rotAxisLength > 0.0001 ) {\n\n\t\t\t\trotationAxis.divideScalar( rotAxisLength );\n\t\t\t\tvector.addVectors( prevDirection, direction );\n\t\t\t\tconst c1 = - 2.0 / ( 1.0 + prevDirection.dot( direction ) );\n\t\t\t\tconst dot = lastNormal.dot( vector );\n\t\t\t\tnormal.copy( lastNormal ).addScaledVector( vector, c1 * dot );\n\n\t\t\t} else {\n\n\t\t\t\tnormal.copy( lastNormal );\n\n\t\t\t}\n\n\t\t}\n\n\t\tside.crossVectors( direction, normal ).normalize();\n\t\tnormal.crossVectors( side, direction ).normalize();\n\n\t\tif ( isFirstSegment === false ) {\n\n\t\t\tconst smoothFactor = 0.3;\n\n\t\t\tnormal.lerp( lastNormal, smoothFactor ).normalize();\n\t\t\tside.crossVectors( direction, normal ).normalize();\n\t\t\tnormal.crossVectors( side, direction ).normalize();\n\n\t\t}\n\n\t\tlastNormal.copy( normal );\n\t\tprevDirection.copy( direction );\n\n\t\tmatrix1.makeBasis( side, normal, vector.copy( direction ).negate() );\n\n\t}\n\n\tfunction moveTo( position ) {\n\n\t\tpoint2.copy( position );\n\n\t\tlastNormal.set( 0, 1, 0 );\n\n\t\tisFirstSegment = true;\n\n\t\tendCapStartIndex = null;\n\t\tendCapVertexCount = 0;\n\n\t}\n\n\tfunction lineTo( position ) {\n\n\t\tpoint1.copy( position );\n\n\t\tdirection.subVectors( point1, point2 );\n\n\t\tconst length = direction.length();\n\n\t\tif ( length === 0 ) return;\n\n\t\tdirection.normalize();\n\n\t\tcalculateRMF();\n\n\t\tif ( isFirstSegment === true ) {\n\n\t\t\tcolor2.copy( color1 );\n\t\t\tsize2 = size1;\n\n\t\t\tmatrix2.copy( matrix1 );\n\n\t\t\taddCap( point2, matrix2, false, size2 );\n\n\t\t\t// End cap is added immediately after start cap and updated in-place\n\t\t\tendCapStartIndex = geometry.drawRange.count;\n\t\t\taddCap( point1, matrix1, true, size1 );\n\t\t\tendCapVertexCount = geometry.drawRange.count - endCapStartIndex;\n\n\t\t}\n\n\t\tstroke( point1, point2, matrix1, matrix2, size1, size2 );\n\n\t\tupdateEndCap( point1, matrix1, size1 );\n\n\t\tpoint2.copy( point1 );\n\t\tmatrix2.copy( matrix1 );\n\n\t\tcolor2.copy( color1 );\n\t\tsize2 = size1;\n\n\t\tisFirstSegment = false;\n\n\t}\n\n\tfunction setSize( value ) {\n\n\t\tsize1 = value;\n\n\t}\n\n\tfunction setColor( value ) {\n\n\t\tcolor1.copy( value );\n\n\t}\n\n\t//\n\n\tlet count = 0;\n\n\tfunction update() {\n\n\t\tconst start = count;\n\t\tconst end = geometry.drawRange.count;\n\n\t\tif ( start === end ) return;\n\n\t\tpositions.addUpdateRange( start * 3, ( end - start ) * 3 );\n\t\tpositions.needsUpdate = true;\n\n\t\tnormals.addUpdateRange( start * 3, ( end - start ) * 3 );\n\t\tnormals.needsUpdate = true;\n\n\t\tcolors.addUpdateRange( start * 3, ( end - start ) * 3 );\n\t\tcolors.needsUpdate = true;\n\n\t\tcount = end;\n\n\t}\n\n\treturn {\n\t\t/**\n\t\t * The \"painted\" tube mesh. Must be added to the scene.\n\t\t *\n\t\t * @name TubePainter#mesh\n\t\t * @type {Mesh}\n\t\t */\n\t\tmesh: mesh,\n\n\t\t/**\n\t\t * Moves the current painting position to the given value.\n\t\t *\n\t\t * @method\n\t\t * @name TubePainter#moveTo\n\t\t * @param {Vector3} position The new painting position.\n\t\t */\n\t\tmoveTo: moveTo,\n\n\t\t/**\n\t\t * Draw a stroke from the current position to the given one.\n\t\t * This method extends the tube while drawing with the XR\n\t\t * controllers.\n\t\t *\n\t\t * @method\n\t\t * @name TubePainter#lineTo\n\t\t * @param {Vector3} position The destination position.\n\t\t */\n\t\tlineTo: lineTo,\n\n\t\t/**\n\t\t * Sets the size of newly rendered tube segments.\n\t\t *\n\t\t * @method\n\t\t * @name TubePainter#setSize\n\t\t * @param {number} size The size.\n\t\t */\n\t\tsetSize: setSize,\n\n\t\t/**\n\t\t * Sets the color of newly rendered tube segments.\n\t\t *\n\t\t * @method\n\t\t * @name TubePainter#setColor\n\t\t * @param {Color} color The color.\n\t\t */\n\t\tsetColor: setColor,\n\n\t\t/**\n\t\t * Updates the internal geometry buffers so the new painted\n\t\t * segments are rendered.\n\t\t *\n\t\t * @method\n\t\t * @name TubePainter#update\n\t\t */\n\t\tupdate: update\n\t};\n\n}\n\nexport { TubePainter };\n", "// Original src: https://github.com/zz85/threejs-path-flow\nconst CHANNELS = 4;\nconst TEXTURE_WIDTH = 1024;\nconst TEXTURE_HEIGHT = 4;\n\nimport {\n\tDataTexture,\n\tDataUtils,\n\tRGBAFormat,\n\tHalfFloatType,\n\tRepeatWrapping,\n\tMesh,\n\tInstancedMesh,\n\tLinearFilter,\n\tDynamicDrawUsage,\n\tMatrix4\n} from 'three';\n\n/**\n * Make a new DataTexture to store the descriptions of the curves.\n *\n * @private\n * @param {number} numberOfCurves - The number of curves needed to be described by this texture.\n * @returns {DataTexture}\n */\nfunction initSplineTexture( numberOfCurves = 1 ) {\n\n\tconst dataArray = new Uint16Array( TEXTURE_WIDTH * TEXTURE_HEIGHT * numberOfCurves * CHANNELS );\n\tconst dataTexture = new DataTexture(\n\t\tdataArray,\n\t\tTEXTURE_WIDTH,\n\t\tTEXTURE_HEIGHT * numberOfCurves,\n\t\tRGBAFormat,\n\t\tHalfFloatType\n\t);\n\n\tdataTexture.wrapS = RepeatWrapping;\n\tdataTexture.wrapY = RepeatWrapping;\n\tdataTexture.magFilter = LinearFilter;\n\tdataTexture.minFilter = LinearFilter;\n\tdataTexture.needsUpdate = true;\n\n\treturn dataTexture;\n\n}\n\n/**\n * Write the curve description to the data texture.\n *\n * @private\n * @param {DataTexture} texture - The data texture to write to.\n * @param {Curve} splineCurve - The curve to describe.\n * @param {number} offset - Which curve slot to write to.\n */\nfunction updateSplineTexture( texture, splineCurve, offset = 0 ) {\n\n\tconst numberOfPoints = Math.floor( TEXTURE_WIDTH * ( TEXTURE_HEIGHT / 4 ) );\n\tsplineCurve.arcLengthDivisions = numberOfPoints / 2;\n\tsplineCurve.updateArcLengths();\n\tconst points = splineCurve.getSpacedPoints( numberOfPoints );\n\tconst frenetFrames = splineCurve.computeFrenetFrames( numberOfPoints, true );\n\n\tfor ( let i = 0; i < numberOfPoints; i ++ ) {\n\n\t\tconst rowOffset = Math.floor( i / TEXTURE_WIDTH );\n\t\tconst rowIndex = i % TEXTURE_WIDTH;\n\n\t\tlet pt = points[ i ];\n\t\tsetTextureValue( texture, rowIndex, pt.x, pt.y, pt.z, 0 + rowOffset + ( TEXTURE_HEIGHT * offset ) );\n\t\tpt = frenetFrames.tangents[ i ];\n\t\tsetTextureValue( texture, rowIndex, pt.x, pt.y, pt.z, 1 + rowOffset + ( TEXTURE_HEIGHT * offset ) );\n\t\tpt = frenetFrames.normals[ i ];\n\t\tsetTextureValue( texture, rowIndex, pt.x, pt.y, pt.z, 2 + rowOffset + ( TEXTURE_HEIGHT * offset ) );\n\t\tpt = frenetFrames.binormals[ i ];\n\t\tsetTextureValue( texture, rowIndex, pt.x, pt.y, pt.z, 3 + rowOffset + ( TEXTURE_HEIGHT * offset ) );\n\n\t}\n\n\ttexture.needsUpdate = true;\n\n}\n\nfunction setTextureValue( texture, index, x, y, z, o ) {\n\n\tconst image = texture.image;\n\tconst { data } = image;\n\tconst i = CHANNELS * TEXTURE_WIDTH * o; // Row Offset\n\tdata[ index * CHANNELS + i + 0 ] = DataUtils.toHalfFloat( x );\n\tdata[ index * CHANNELS + i + 1 ] = DataUtils.toHalfFloat( y );\n\tdata[ index * CHANNELS + i + 2 ] = DataUtils.toHalfFloat( z );\n\tdata[ index * CHANNELS + i + 3 ] = DataUtils.toHalfFloat( 1 );\n\n}\n\n/**\n * Create a new set of uniforms for describing the curve modifier.\n *\n * @param {DataTexture} splineTexture - Which holds the curve description.\n * @returns {Object} The uniforms object to be used in the shader.\n */\nfunction getUniforms( splineTexture ) {\n\n\tconst uniforms = {\n\t\tspineTexture: { value: splineTexture },\n\t\tpathOffset: { type: 'f', value: 0 }, // time of path curve\n\t\tpathSegment: { type: 'f', value: 1 }, // fractional length of path\n\t\tspineOffset: { type: 'f', value: 161 },\n\t\tspineLength: { type: 'f', value: 400 },\n\t\tflow: { type: 'i', value: 1 },\n\t};\n\treturn uniforms;\n\n}\n\nfunction modifyShader( material, uniforms, numberOfCurves = 1 ) {\n\n\tif ( material.__ok ) return;\n\tmaterial.__ok = true;\n\n\tmaterial.onBeforeCompile = ( shader ) => {\n\n\t\tif ( shader.__modified ) return;\n\t\tshader.__modified = true;\n\n\t\tObject.assign( shader.uniforms, uniforms );\n\n\t\tconst vertexShader = `\n\t\tuniform sampler2D spineTexture;\n\t\tuniform float pathOffset;\n\t\tuniform float pathSegment;\n\t\tuniform float spineOffset;\n\t\tuniform float spineLength;\n\t\tuniform int flow;\n\n\t\tfloat textureLayers = ${TEXTURE_HEIGHT * numberOfCurves}.;\n\t\tfloat textureStacks = ${TEXTURE_HEIGHT / 4}.;\n\n\t\t${shader.vertexShader}\n\t\t`\n\t\t// chunk import moved in front of modified shader below\n\t\t\t.replace( '#include <beginnormal_vertex>', '' )\n\n\t\t\t// vec3 transformedNormal declaration overridden below\n\t\t\t.replace( '#include <defaultnormal_vertex>', '' )\n\n\t\t\t// vec3 transformed declaration overridden below\n\t\t\t.replace( '#include <begin_vertex>', '' )\n\n\t\t\t// shader override\n\t\t\t.replace(\n\t\t\t\t/void\\s*main\\s*\\(\\)\\s*\\{/,\n\t\t\t\t`\nvoid main() {\n#include <beginnormal_vertex>\n\nvec4 worldPos = modelMatrix * vec4(position, 1.);\n\nbool bend = flow > 0;\nfloat xWeight = bend ? 0. : 1.;\n\n#ifdef USE_INSTANCING\nfloat pathOffsetFromInstanceMatrix = instanceMatrix[3][2];\nfloat spineLengthFromInstanceMatrix = instanceMatrix[3][0];\nfloat spinePortion = bend ? (worldPos.x + spineOffset) / spineLengthFromInstanceMatrix : 0.;\nfloat mt = (spinePortion * pathSegment + pathOffset + pathOffsetFromInstanceMatrix)*textureStacks;\n#else\nfloat spinePortion = bend ? (worldPos.x + spineOffset) / spineLength : 0.;\nfloat mt = (spinePortion * pathSegment + pathOffset)*textureStacks;\n#endif\n\nmt = mod(mt, textureStacks);\nfloat rowOffset = floor(mt);\n\n#ifdef USE_INSTANCING\nrowOffset += instanceMatrix[3][1] * ${TEXTURE_HEIGHT}.;\n#endif\n\nvec3 spinePos = texture2D(spineTexture, vec2(mt, (0. + rowOffset + 0.5) / textureLayers)).xyz;\nvec3 a =        texture2D(spineTexture, vec2(mt, (1. + rowOffset + 0.5) / textureLayers)).xyz;\nvec3 b =        texture2D(spineTexture, vec2(mt, (2. + rowOffset + 0.5) / textureLayers)).xyz;\nvec3 c =        texture2D(spineTexture, vec2(mt, (3. + rowOffset + 0.5) / textureLayers)).xyz;\nmat3 basis = mat3(a, b, c);\n\nvec3 transformed = basis\n\t* vec3(worldPos.x * xWeight, worldPos.y * 1., worldPos.z * 1.)\n\t+ spinePos;\n\nvec3 transformedNormal = normalMatrix * (basis * objectNormal);\n\t\t\t` ).replace(\n\t\t\t\t'#include <project_vertex>',\n\t\t\t\t`vec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n\t\t\t\tgl_Position = projectionMatrix * mvPosition;`\n\t\t\t);\n\n\t\tshader.vertexShader = vertexShader;\n\n\t};\n\n}\n\n/**\n * A modifier for making meshes bend around curves.\n *\n * This module can only be used with {@link WebGLRenderer}. When using {@link WebGPURenderer},\n * import the class from `CurveModifierGPU.js`.\n *\n * @three_import import { Flow } from 'three/addons/modifiers/CurveModifier.js';\n */\nexport class Flow {\n\n\t/**\n\t * Constructs a new Flow instance.\n\t *\n\t * @param {Mesh} mesh - The mesh to clone and modify to bend around the curve.\n\t * @param {number} numberOfCurves - The amount of space that should preallocated for additional curves.\n\t */\n\tconstructor( mesh, numberOfCurves = 1 ) {\n\n\t\tconst obj3D = mesh.clone();\n\t\tconst splineTexture = initSplineTexture( numberOfCurves );\n\t\tconst uniforms = getUniforms( splineTexture );\n\t\tobj3D.traverse( function ( child ) {\n\n\t\t\tif (\n\t\t\t\tchild instanceof Mesh ||\n\t\t\t\tchild instanceof InstancedMesh\n\t\t\t) {\n\n\t\t\t\tif ( Array.isArray( child.material ) ) {\n\n\t\t\t\t\tconst materials = [];\n\n\t\t\t\t\tfor ( const material of child.material ) {\n\n\t\t\t\t\t\tconst newMaterial = material.clone();\n\t\t\t\t\t\tmodifyShader( newMaterial, uniforms, numberOfCurves );\n\t\t\t\t\t\tmaterials.push( newMaterial );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tchild.material = materials;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tchild.material = child.material.clone();\n\t\t\t\t\tmodifyShader( child.material, uniforms, numberOfCurves );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t\tthis.curveArray = new Array( numberOfCurves );\n\t\tthis.curveLengthArray = new Array( numberOfCurves );\n\n\t\tthis.object3D = obj3D;\n\t\tthis.splineTexture = splineTexture;\n\t\tthis.uniforms = uniforms;\n\n\t}\n\n\t/**\n\t * Updates the curve for the given curve index.\n\t *\n\t * @param {number} index - The curve index.\n\t * @param {Curve} curve - The curve that should be used to bend the mesh.\n\t */\n\tupdateCurve( index, curve ) {\n\n\t\tif ( index >= this.curveArray.length ) throw Error( 'Flow: Index out of range.' );\n\t\tconst curveLength = curve.getLength();\n\t\tthis.uniforms.spineLength.value = curveLength;\n\t\tthis.curveLengthArray[ index ] = curveLength;\n\t\tthis.curveArray[ index ] = curve;\n\t\tupdateSplineTexture( this.splineTexture, curve, index );\n\n\t}\n\n\t/**\n\t * Moves the mesh along the curve.\n\t *\n\t * @param {number} amount - The offset.\n\t */\n\tmoveAlongCurve( amount ) {\n\n\t\tthis.uniforms.pathOffset.value += amount;\n\n\t}\n\n}\n\nconst _matrix = new Matrix4();\n\n/**\n * An instanced version of {@link Flow} for making meshes bend around curves, where the instances are placed on the curve.\n *\n * This module can only be used with {@link WebGLRenderer}.\n *\n * @augments Flow\n * @three_import import { InstancedFlow } from 'three/addons/modifiers/CurveModifier.js';\n */\nexport class InstancedFlow extends Flow {\n\n\t/**\n\t * Constructs a new InstancedFlow instance.\n\t *\n\t * @param {number} count - The number of instanced elements.\n\t * @param {number} curveCount - The number of curves to preallocate for.\n\t * @param {Geometry} geometry - The geometry to use for the instanced mesh.\n\t * @param {Material} material - The material to use for the instanced mesh.\n\t */\n\tconstructor( count, curveCount, geometry, material ) {\n\n\t\tconst mesh = new InstancedMesh(\n\t\t\tgeometry,\n\t\t\tmaterial,\n\t\t\tcount\n\t\t);\n\t\tmesh.instanceMatrix.setUsage( DynamicDrawUsage );\n\t\tmesh.frustumCulled = false;\n\t\tsuper( mesh, curveCount );\n\n\t\tthis.offsets = new Array( count ).fill( 0 );\n\t\tthis.whichCurve = new Array( count ).fill( 0 );\n\n\t}\n\n\t/**\n\t * The extra information about which curve and curve position is stored in the translation components of the matrix for the instanced objects\n\t * This writes that information to the matrix and marks it as needing update.\n\t *\n\t * @param {number} index - The index of tge instanced element to update.\n\t */\n\twriteChanges( index ) {\n\n\t\t_matrix.makeTranslation(\n\t\t\tthis.curveLengthArray[ this.whichCurve[ index ] ],\n\t\t\tthis.whichCurve[ index ],\n\t\t\tthis.offsets[ index ]\n\t\t);\n\t\tthis.object3D.setMatrixAt( index, _matrix );\n\t\tthis.object3D.instanceMatrix.needsUpdate = true;\n\n\t}\n\n\t/**\n\t * Move an individual element along the curve by a specific amount.\n\t *\n\t * @param {number} index - Which element to update.\n\t * @param {number} offset - The offset.\n\t */\n\tmoveIndividualAlongCurve( index, offset ) {\n\n\t\tthis.offsets[ index ] += offset;\n\t\tthis.writeChanges( index );\n\n\t}\n\n\t/**\n\t * Select which curve to use for an element.\n\t *\n\t * @param {number} index - The index of the instanced element to update.\n\t * @param {number} curveNo - The index of the curve it should use.\n\t */\n\tsetCurve( index, curveNo ) {\n\n\t\tif ( isNaN( curveNo ) ) throw Error( 'InstancedFlow: Curve index being set is Not a Number (NaN).' );\n\t\tthis.whichCurve[ index ] = curveNo;\n\t\tthis.writeChanges( index );\n\n\t}\n\n}\n", "import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tVector3\n} from 'three';\nimport * as BufferGeometryUtils from '../utils/BufferGeometryUtils.js';\n\nconst _A = new Vector3();\nconst _B = new Vector3();\nconst _C = new Vector3();\n\n/**\n * The modifier can be used to split faces at sharp edges. This allows to compute\n * normals without smoothing the edges which can lead to an improved visual result.\n *\n * ```js\n * const modifier = new EdgeSplitModifier();\n * geometry = modifier.modify( geometry, Math.PI * 0.4 );\n * ```\n *\n * @three_import import { EdgeSplitModifier } from 'three/addons/modifiers/EdgeSplitModifier.js';\n */\nclass EdgeSplitModifier {\n\n\t/**\n\t * Returns a new, modified version of the given geometry by applying an edge-split operation.\n\t * Please note that the resulting geometry is always indexed.\n\t *\n\t * @param {BufferGeometry} geometry - The geometry to modify.\n\t * @param {number} cutOffAngle - The cut off angle in radians.\n\t * @param {boolean} [tryKeepNormals=true] - Whether to try to keep normals or not.\n\t * @return {BufferGeometry} A new, modified geometry.\n\t */\n\tmodify( geometry, cutOffAngle, tryKeepNormals = true ) {\n\n\t\tfunction computeNormals() {\n\n\t\t\tnormals = new Float32Array( indexes.length * 3 );\n\n\t\t\tfor ( let i = 0; i < indexes.length; i += 3 ) {\n\n\t\t\t\tlet index = indexes[ i ];\n\n\t\t\t\t_A.set(\n\t\t\t\t\tpositions[ 3 * index ],\n\t\t\t\t\tpositions[ 3 * index + 1 ],\n\t\t\t\t\tpositions[ 3 * index + 2 ] );\n\n\t\t\t\tindex = indexes[ i + 1 ];\n\t\t\t\t_B.set(\n\t\t\t\t\tpositions[ 3 * index ],\n\t\t\t\t\tpositions[ 3 * index + 1 ],\n\t\t\t\t\tpositions[ 3 * index + 2 ] );\n\n\t\t\t\tindex = indexes[ i + 2 ];\n\t\t\t\t_C.set(\n\t\t\t\t\tpositions[ 3 * index ],\n\t\t\t\t\tpositions[ 3 * index + 1 ],\n\t\t\t\t\tpositions[ 3 * index + 2 ] );\n\n\t\t\t\t_C.sub( _B );\n\t\t\t\t_A.sub( _B );\n\n\t\t\t\tconst normal = _C.cross( _A ).normalize();\n\n\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\tnormals[ 3 * ( i + j ) ] = normal.x;\n\t\t\t\t\tnormals[ 3 * ( i + j ) + 1 ] = normal.y;\n\t\t\t\t\tnormals[ 3 * ( i + j ) + 2 ] = normal.z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tfunction mapPositionsToIndexes() {\n\n\t\t\tpointToIndexMap = Array( positions.length / 3 );\n\n\t\t\tfor ( let i = 0; i < indexes.length; i ++ ) {\n\n\t\t\t\tconst index = indexes[ i ];\n\n\t\t\t\tif ( pointToIndexMap[ index ] == null ) {\n\n\t\t\t\t\tpointToIndexMap[ index ] = [];\n\n\t\t\t\t}\n\n\t\t\t\tpointToIndexMap[ index ].push( i );\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tfunction edgeSplitToGroups( indexes, cutOff, firstIndex ) {\n\n\t\t\t_A.set( normals[ 3 * firstIndex ], normals[ 3 * firstIndex + 1 ], normals[ 3 * firstIndex + 2 ] ).normalize();\n\n\t\t\tconst result = {\n\t\t\t\tsplitGroup: [],\n\t\t\t\tcurrentGroup: [ firstIndex ]\n\t\t\t};\n\n\t\t\tfor ( const j of indexes ) {\n\n\t\t\t\tif ( j !== firstIndex ) {\n\n\t\t\t\t\t_B.set( normals[ 3 * j ], normals[ 3 * j + 1 ], normals[ 3 * j + 2 ] ).normalize();\n\n\t\t\t\t\tif ( _B.dot( _A ) < cutOff ) {\n\n\t\t\t\t\t\tresult.splitGroup.push( j );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tresult.currentGroup.push( j );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn result;\n\n\t\t}\n\n\n\t\tfunction edgeSplit( indexes, cutOff, original = null ) {\n\n\t\t\tif ( indexes.length === 0 ) return;\n\n\t\t\tconst groupResults = [];\n\n\t\t\tfor ( const index of indexes ) {\n\n\t\t\t\tgroupResults.push( edgeSplitToGroups( indexes, cutOff, index ) );\n\n\t\t\t}\n\n\t\t\tlet result = groupResults[ 0 ];\n\n\t\t\tfor ( const groupResult of groupResults ) {\n\n\t\t\t\tif ( groupResult.currentGroup.length > result.currentGroup.length ) {\n\n\t\t\t\t\tresult = groupResult;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t\tif ( original != null ) {\n\n\t\t\t\tsplitIndexes.push( {\n\t\t\t\t\toriginal: original,\n\t\t\t\t\tindexes: result.currentGroup\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tif ( result.splitGroup.length ) {\n\n\t\t\t\tedgeSplit( result.splitGroup, cutOff, original || result.currentGroup[ 0 ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet hadNormals = false;\n\t\tlet oldNormals = null;\n\n\t\tif ( geometry.attributes.normal ) {\n\n\t\t\thadNormals = true;\n\n\t\t\tgeometry = geometry.clone();\n\n\t\t\tif ( tryKeepNormals === true && geometry.index !== null ) {\n\n\t\t\t\toldNormals = geometry.attributes.normal.array;\n\n\t\t\t}\n\n\t\t\tgeometry.deleteAttribute( 'normal' );\n\n\t\t}\n\n\t\tif ( geometry.index == null ) {\n\n\t\t\tgeometry = BufferGeometryUtils.mergeVertices( geometry );\n\n\t\t}\n\n\t\tconst indexes = geometry.index.array;\n\t\tconst positions = geometry.getAttribute( 'position' ).array;\n\n\t\tlet normals;\n\t\tlet pointToIndexMap;\n\n\t\tcomputeNormals();\n\t\tmapPositionsToIndexes();\n\n\t\tconst splitIndexes = [];\n\n\t\tfor ( const vertexIndexes of pointToIndexMap ) {\n\n\t\t\tedgeSplit( vertexIndexes, Math.cos( cutOffAngle ) - 0.001 );\n\n\t\t}\n\n\t\tconst newAttributes = {};\n\t\tfor ( const name of Object.keys( geometry.attributes ) ) {\n\n\t\t\tconst oldAttribute = geometry.attributes[ name ];\n\t\t\tconst newArray = new oldAttribute.array.constructor( ( indexes.length + splitIndexes.length ) * oldAttribute.itemSize );\n\t\t\tnewArray.set( oldAttribute.array );\n\t\t\tnewAttributes[ name ] = new BufferAttribute( newArray, oldAttribute.itemSize, oldAttribute.normalized );\n\n\t\t}\n\n\t\tconst newIndexes = new Uint32Array( indexes.length );\n\t\tnewIndexes.set( indexes );\n\n\t\tfor ( let i = 0; i < splitIndexes.length; i ++ ) {\n\n\t\t\tconst split = splitIndexes[ i ];\n\t\t\tconst index = indexes[ split.original ];\n\n\t\t\tfor ( const attribute of Object.values( newAttributes ) ) {\n\n\t\t\t\tfor ( let j = 0; j < attribute.itemSize; j ++ ) {\n\n\t\t\t\t\tattribute.array[ ( indexes.length + i ) * attribute.itemSize + j ] =\n\t\t\t\t\t\tattribute.array[ index * attribute.itemSize + j ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( const j of split.indexes ) {\n\n\t\t\t\tnewIndexes[ j ] = indexes.length + i;\n\n\t\t\t}\n\n\t\t}\n\n\t\tgeometry = new BufferGeometry();\n\t\tgeometry.setIndex( new BufferAttribute( newIndexes, 1 ) );\n\n\t\tfor ( const name of Object.keys( newAttributes ) ) {\n\n\t\t\tgeometry.setAttribute( name, newAttributes[ name ] );\n\n\t\t}\n\n\t\tif ( hadNormals ) {\n\n\t\t\tgeometry.computeVertexNormals();\n\n\t\t\tif ( oldNormals !== null ) {\n\n\t\t\t\tconst changedNormals = new Array( oldNormals.length / 3 ).fill( false );\n\n\t\t\t\tfor ( const splitData of splitIndexes )\n\t\t\t\t\tchangedNormals[ splitData.original ] = true;\n\n\t\t\t\tfor ( let i = 0; i < changedNormals.length; i ++ ) {\n\n\t\t\t\t\tif ( changedNormals[ i ] === false ) {\n\n\t\t\t\t\t\tfor ( let j = 0; j < 3; j ++ )\n\t\t\t\t\t\t\tgeometry.attributes.normal.array[ 3 * i + j ] = oldNormals[ 3 * i + j ];\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn geometry;\n\n\t}\n\n}\n\n\n\nexport { EdgeSplitModifier };\n", "import {\n\tBufferGeometry,\n\tColor,\n\tFloat32BufferAttribute,\n\tVector2,\n\tVector3,\n\tVector4\n} from 'three';\nimport * as BufferGeometryUtils from '../utils/BufferGeometryUtils.js';\n\nconst _cb = new Vector3(), _ab = new Vector3();\n\n/**\n * This class can be used to modify a geometry by simplifying it. A typical use\n * case for such a modifier is automatic LOD generation.\n *\n * The implementation is based on [Progressive Mesh type Polygon Reduction Algorithm](https://web.archive.org/web/20230610044040/http://www.melax.com/polychop/)\n * by Stan Melax in 1998.\n *\n * ```js\n * const modifier = new SimplifyModifier();\n * geometry = modifier.modify( geometry );\n * ```\n *\n * @three_import import { SimplifyModifier } from 'three/addons/modifiers/SimplifyModifier.js';\n */\nclass SimplifyModifier {\n\n\t/**\n\t * Returns a new, modified version of the given geometry by applying a simplification.\n\t * Please note that the resulting geometry is always non-indexed.\n\t *\n\t * @param {BufferGeometry} geometry - The geometry to modify.\n\t * @param {number} count - The number of vertices to remove.\n\t * @return {BufferGeometry} A new, modified geometry.\n\t */\n\tmodify( geometry, count ) {\n\n\t\tgeometry = geometry.clone();\n\n\t\t// currently morphAttributes are not supported\n\t\tdelete geometry.morphAttributes.position;\n\t\tdelete geometry.morphAttributes.normal;\n\t\tconst attributes = geometry.attributes;\n\n\t\t// this modifier can only process indexed and non-indexed geometries with at least a position attribute\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tif ( name !== 'position' && name !== 'uv' && name !== 'normal' && name !== 'tangent' && name !== 'color' ) geometry.deleteAttribute( name );\n\n\t\t}\n\n\t\tgeometry = BufferGeometryUtils.mergeVertices( geometry );\n\n\t\t//\n\t\t// put data of original geometry in different data structures\n\t\t//\n\n\t\tconst vertices = [];\n\t\tconst faces = [];\n\n\t\t// add vertices\n\n\t\tconst positionAttribute = geometry.getAttribute( 'position' );\n\t\tconst uvAttribute = geometry.getAttribute( 'uv' );\n\t\tconst normalAttribute = geometry.getAttribute( 'normal' );\n\t\tconst tangentAttribute = geometry.getAttribute( 'tangent' );\n\t\tconst colorAttribute = geometry.getAttribute( 'color' );\n\n\t\tlet t = null;\n\t\tlet v2 = null;\n\t\tlet nor = null;\n\t\tlet col = null;\n\n\t\tfor ( let i = 0; i < positionAttribute.count; i ++ ) {\n\n\t\t\tconst v = new Vector3().fromBufferAttribute( positionAttribute, i );\n\t\t\tif ( uvAttribute ) {\n\n\t\t\t\tv2 = new Vector2().fromBufferAttribute( uvAttribute, i );\n\n\t\t\t}\n\n\t\t\tif ( normalAttribute ) {\n\n\t\t\t\tnor = new Vector3().fromBufferAttribute( normalAttribute, i );\n\n\t\t\t}\n\n\t\t\tif ( tangentAttribute ) {\n\n\t\t\t\tt = new Vector4().fromBufferAttribute( tangentAttribute, i );\n\n\t\t\t}\n\n\t\t\tif ( colorAttribute ) {\n\n\t\t\t\tcol = new Color().fromBufferAttribute( colorAttribute, i );\n\n\t\t\t}\n\n\t\t\tconst vertex = new Vertex( v, v2, nor, t, col );\n\t\t\tvertices.push( vertex );\n\n\t\t}\n\n\t\t// add faces\n\n\t\tlet index = geometry.getIndex();\n\n\t\tif ( index !== null ) {\n\n\t\t\tfor ( let i = 0; i < index.count; i += 3 ) {\n\n\t\t\t\tconst a = index.getX( i );\n\t\t\t\tconst b = index.getX( i + 1 );\n\t\t\t\tconst c = index.getX( i + 2 );\n\n\t\t\t\tconst triangle = new Triangle( vertices[ a ], vertices[ b ], vertices[ c ], a, b, c );\n\t\t\t\tfaces.push( triangle );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0; i < positionAttribute.count; i += 3 ) {\n\n\t\t\t\tconst a = i;\n\t\t\t\tconst b = i + 1;\n\t\t\t\tconst c = i + 2;\n\n\t\t\t\tconst triangle = new Triangle( vertices[ a ], vertices[ b ], vertices[ c ], a, b, c );\n\t\t\t\tfaces.push( triangle );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// compute all edge collapse costs\n\n\t\tfor ( let i = 0, il = vertices.length; i < il; i ++ ) {\n\n\t\t\tcomputeEdgeCostAtVertex( vertices[ i ] );\n\n\t\t}\n\n\t\tlet nextVertex;\n\n\t\tlet z = count;\n\n\t\twhile ( z -- ) {\n\n\t\t\tnextVertex = minimumCostEdge( vertices );\n\n\t\t\tif ( ! nextVertex ) {\n\n\t\t\t\tconsole.log( 'THREE.SimplifyModifier: No next vertex' );\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tcollapse( vertices, faces, nextVertex, nextVertex.collapseNeighbor );\n\n\t\t}\n\n\t\t//\n\n\t\tconst simplifiedGeometry = new BufferGeometry();\n\t\tconst position = [];\n\t\tconst uv = [];\n\t\tconst normal = [];\n\t\tconst tangent = [];\n\t\tconst color = [];\n\n\t\tindex = [];\n\n\t\t//\n\n\t\tfor ( let i = 0; i < vertices.length; i ++ ) {\n\n\t\t\tconst vertex = vertices[ i ];\n\t\t\tposition.push( vertex.position.x, vertex.position.y, vertex.position.z );\n\t\t\tif ( vertex.uv ) {\n\n\t\t\t\tuv.push( vertex.uv.x, vertex.uv.y );\n\n\t\t\t}\n\n\t\t\tif ( vertex.normal ) {\n\n\t\t\t\tnormal.push( vertex.normal.x, vertex.normal.y, vertex.normal.z );\n\n\t\t\t}\n\n\t\t\tif ( vertex.tangent ) {\n\n\t\t\t\ttangent.push( vertex.tangent.x, vertex.tangent.y, vertex.tangent.z, vertex.tangent.w );\n\n\t\t\t}\n\n\t\t\tif ( vertex.color ) {\n\n\t\t\t\tcolor.push( vertex.color.r, vertex.color.g, vertex.color.b );\n\n\t\t\t}\n\n\n\t\t\t// cache final index to GREATLY speed up faces reconstruction\n\t\t\tvertex.id = i;\n\n\t\t}\n\n\t\t//\n\n\t\tfor ( let i = 0; i < faces.length; i ++ ) {\n\n\t\t\tconst face = faces[ i ];\n\t\t\tindex.push( face.v1.id, face.v2.id, face.v3.id );\n\n\t\t}\n\n\t\tsimplifiedGeometry.setAttribute( 'position', new Float32BufferAttribute( position, 3 ) );\n\t\tif ( uv.length > 0 ) simplifiedGeometry.setAttribute( 'uv', new Float32BufferAttribute( uv, 2 ) );\n\t\tif ( normal.length > 0 ) simplifiedGeometry.setAttribute( 'normal', new Float32BufferAttribute( normal, 3 ) );\n\t\tif ( tangent.length > 0 ) simplifiedGeometry.setAttribute( 'tangent', new Float32BufferAttribute( tangent, 4 ) );\n\t\tif ( color.length > 0 ) simplifiedGeometry.setAttribute( 'color', new Float32BufferAttribute( color, 3 ) );\n\n\t\tsimplifiedGeometry.setIndex( index );\n\n\t\treturn simplifiedGeometry;\n\n\t}\n\n}\n\nfunction pushIfUnique( array, object ) {\n\n\tif ( array.indexOf( object ) === - 1 ) array.push( object );\n\n}\n\nfunction removeFromArray( array, object ) {\n\n\tconst k = array.indexOf( object );\n\tif ( k > - 1 ) array.splice( k, 1 );\n\n}\n\nfunction computeEdgeCollapseCost( u, v ) {\n\n\t// if we collapse edge uv by moving u to v then how\n\t// much different will the model change, i.e. the \"error\".\n\n\tconst edgelength = v.position.distanceTo( u.position );\n\tlet curvature = 0;\n\n\tconst sideFaces = [];\n\n\t// find the \"sides\" triangles that are on the edge uv\n\tfor ( let i = 0, il = u.faces.length; i < il; i ++ ) {\n\n\t\tconst face = u.faces[ i ];\n\n\t\tif ( face.hasVertex( v ) ) {\n\n\t\t\tsideFaces.push( face );\n\n\t\t}\n\n\t}\n\n\t// use the triangle facing most away from the sides\n\t// to determine our curvature term\n\tfor ( let i = 0, il = u.faces.length; i < il; i ++ ) {\n\n\t\tlet minCurvature = 1;\n\t\tconst face = u.faces[ i ];\n\n\t\tfor ( let j = 0; j < sideFaces.length; j ++ ) {\n\n\t\t\tconst sideFace = sideFaces[ j ];\n\t\t\t// use dot product of face normals.\n\t\t\tconst dotProd = face.normal.dot( sideFace.normal );\n\t\t\tminCurvature = Math.min( minCurvature, ( 1.001 - dotProd ) / 2 );\n\n\t\t}\n\n\t\tcurvature = Math.max( curvature, minCurvature );\n\n\t}\n\n\t// crude approach in attempt to preserve borders\n\t// though it seems not to be totally correct\n\tconst borders = 0;\n\n\tif ( sideFaces.length < 2 ) {\n\n\t\t// we add some arbitrary cost for borders,\n\t\t// borders += 10;\n\t\tcurvature = 1;\n\n\t}\n\n\tconst amt = edgelength * curvature + borders;\n\n\treturn amt;\n\n}\n\nfunction computeEdgeCostAtVertex( v ) {\n\n\t// compute the edge collapse cost for all edges that start\n\t// from vertex v.  Since we are only interested in reducing\n\t// the object by selecting the min cost edge at each step, we\n\t// only cache the cost of the least cost edge at this vertex\n\t// (in member variable collapse) as well as the value of the\n\t// cost (in member variable collapseCost).\n\n\tif ( v.neighbors.length === 0 ) {\n\n\t\t// collapse if no neighbors.\n\t\tv.collapseNeighbor = null;\n\t\tv.collapseCost = - 0.01;\n\n\t\treturn;\n\n\t}\n\n\tv.collapseCost = 100000;\n\tv.collapseNeighbor = null;\n\n\t// search all neighboring edges for \"least cost\" edge\n\tfor ( let i = 0; i < v.neighbors.length; i ++ ) {\n\n\t\tconst collapseCost = computeEdgeCollapseCost( v, v.neighbors[ i ] );\n\n\t\tif ( ! v.collapseNeighbor ) {\n\n\t\t\tv.collapseNeighbor = v.neighbors[ i ];\n\t\t\tv.collapseCost = collapseCost;\n\t\t\tv.minCost = collapseCost;\n\t\t\tv.totalCost = 0;\n\t\t\tv.costCount = 0;\n\n\t\t}\n\n\t\tv.costCount ++;\n\t\tv.totalCost += collapseCost;\n\n\t\tif ( collapseCost < v.minCost ) {\n\n\t\t\tv.collapseNeighbor = v.neighbors[ i ];\n\t\t\tv.minCost = collapseCost;\n\n\t\t}\n\n\t}\n\n\t// we average the cost of collapsing at this vertex\n\tv.collapseCost = v.totalCost / v.costCount;\n\t// v.collapseCost = v.minCost;\n\n}\n\nfunction removeVertex( v, vertices ) {\n\n\tconsole.assert( v.faces.length === 0 );\n\n\twhile ( v.neighbors.length ) {\n\n\t\tconst n = v.neighbors.pop();\n\t\tremoveFromArray( n.neighbors, v );\n\n\t}\n\n\tremoveFromArray( vertices, v );\n\n}\n\nfunction removeFace( f, faces ) {\n\n\tremoveFromArray( faces, f );\n\n\tif ( f.v1 ) removeFromArray( f.v1.faces, f );\n\tif ( f.v2 ) removeFromArray( f.v2.faces, f );\n\tif ( f.v3 ) removeFromArray( f.v3.faces, f );\n\n\t// TODO optimize this!\n\tconst vs = [ f.v1, f.v2, f.v3 ];\n\n\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\tconst v1 = vs[ i ];\n\t\tconst v2 = vs[ ( i + 1 ) % 3 ];\n\n\t\tif ( ! v1 || ! v2 ) continue;\n\n\t\tv1.removeIfNonNeighbor( v2 );\n\t\tv2.removeIfNonNeighbor( v1 );\n\n\t}\n\n}\n\nfunction collapse( vertices, faces, u, v ) {\n\n\t// Collapse the edge uv by moving vertex u onto v\n\n\tif ( ! v ) {\n\n\t\t// u is a vertex all by itself so just delete it..\n\t\tremoveVertex( u, vertices );\n\t\treturn;\n\n\t}\n\n\tif ( v.uv ) {\n\n\t\tu.uv.copy( v.uv );\n\n\t}\n\n\tif ( v.normal ) {\n\n\t\tv.normal.add( u.normal ).normalize();\n\n\t}\n\n\tif ( v.tangent ) {\n\n\t\tv.tangent.add( u.tangent ).normalize();\n\n\t}\n\n\tconst tmpVertices = [];\n\n\tfor ( let i = 0; i < u.neighbors.length; i ++ ) {\n\n\t\ttmpVertices.push( u.neighbors[ i ] );\n\n\t}\n\n\n\t// delete triangles on edge uv:\n\tfor ( let i = u.faces.length - 1; i >= 0; i -- ) {\n\n\t\tif ( u.faces[ i ] && u.faces[ i ].hasVertex( v ) ) {\n\n\t\t\tremoveFace( u.faces[ i ], faces );\n\n\t\t}\n\n\t}\n\n\t// update remaining triangles to have v instead of u\n\tfor ( let i = u.faces.length - 1; i >= 0; i -- ) {\n\n\t\tu.faces[ i ].replaceVertex( u, v );\n\n\t}\n\n\n\tremoveVertex( u, vertices );\n\n\t// recompute the edge collapse costs in neighborhood\n\tfor ( let i = 0; i < tmpVertices.length; i ++ ) {\n\n\t\tcomputeEdgeCostAtVertex( tmpVertices[ i ] );\n\n\t}\n\n}\n\n\n\nfunction minimumCostEdge( vertices ) {\n\n\t// O(n * n) approach. TODO optimize this\n\n\tlet least = vertices[ 0 ];\n\n\tfor ( let i = 0; i < vertices.length; i ++ ) {\n\n\t\tif ( vertices[ i ].collapseCost < least.collapseCost ) {\n\n\t\t\tleast = vertices[ i ];\n\n\t\t}\n\n\t}\n\n\treturn least;\n\n}\n\n// we use a triangle class to represent structure of face slightly differently\n\nclass Triangle {\n\n\tconstructor( v1, v2, v3, a, b, c ) {\n\n\t\tthis.a = a;\n\t\tthis.b = b;\n\t\tthis.c = c;\n\n\t\tthis.v1 = v1;\n\t\tthis.v2 = v2;\n\t\tthis.v3 = v3;\n\n\t\tthis.normal = new Vector3();\n\n\t\tthis.computeNormal();\n\n\t\tv1.faces.push( this );\n\t\tv1.addUniqueNeighbor( v2 );\n\t\tv1.addUniqueNeighbor( v3 );\n\n\t\tv2.faces.push( this );\n\t\tv2.addUniqueNeighbor( v1 );\n\t\tv2.addUniqueNeighbor( v3 );\n\n\n\t\tv3.faces.push( this );\n\t\tv3.addUniqueNeighbor( v1 );\n\t\tv3.addUniqueNeighbor( v2 );\n\n\t}\n\n\tcomputeNormal() {\n\n\t\tconst vA = this.v1.position;\n\t\tconst vB = this.v2.position;\n\t\tconst vC = this.v3.position;\n\n\t\t_cb.subVectors( vC, vB );\n\t\t_ab.subVectors( vA, vB );\n\t\t_cb.cross( _ab ).normalize();\n\n\t\tthis.normal.copy( _cb );\n\n\t}\n\n\thasVertex( v ) {\n\n\t\treturn v === this.v1 || v === this.v2 || v === this.v3;\n\n\t}\n\n\treplaceVertex( oldv, newv ) {\n\n\t\tif ( oldv === this.v1 ) this.v1 = newv;\n\t\telse if ( oldv === this.v2 ) this.v2 = newv;\n\t\telse if ( oldv === this.v3 ) this.v3 = newv;\n\n\t\tremoveFromArray( oldv.faces, this );\n\t\tnewv.faces.push( this );\n\n\n\t\toldv.removeIfNonNeighbor( this.v1 );\n\t\tthis.v1.removeIfNonNeighbor( oldv );\n\n\t\toldv.removeIfNonNeighbor( this.v2 );\n\t\tthis.v2.removeIfNonNeighbor( oldv );\n\n\t\toldv.removeIfNonNeighbor( this.v3 );\n\t\tthis.v3.removeIfNonNeighbor( oldv );\n\n\t\tthis.v1.addUniqueNeighbor( this.v2 );\n\t\tthis.v1.addUniqueNeighbor( this.v3 );\n\n\t\tthis.v2.addUniqueNeighbor( this.v1 );\n\t\tthis.v2.addUniqueNeighbor( this.v3 );\n\n\t\tthis.v3.addUniqueNeighbor( this.v1 );\n\t\tthis.v3.addUniqueNeighbor( this.v2 );\n\n\t\tthis.computeNormal();\n\n\t}\n\n}\n\nclass Vertex {\n\n\tconstructor( v, uv, normal, tangent, color ) {\n\n\t\tthis.position = v;\n\t\tthis.uv = uv;\n\t\tthis.normal = normal;\n\t\tthis.tangent = tangent;\n\t\tthis.color = color;\n\n\t\tthis.id = - 1; // external use position in vertices list (for e.g. face generation)\n\n\t\tthis.faces = []; // faces vertex is connected\n\t\tthis.neighbors = []; // neighbouring vertices aka \"adjacentVertices\"\n\n\t\t// these will be computed in computeEdgeCostAtVertex()\n\t\tthis.collapseCost = 0; // cost of collapsing this vertex, the less the better. aka objdist\n\t\tthis.collapseNeighbor = null; // best candidate for collapsing\n\n\t}\n\n\taddUniqueNeighbor( vertex ) {\n\n\t\tpushIfUnique( this.neighbors, vertex );\n\n\t}\n\n\tremoveIfNonNeighbor( n ) {\n\n\t\tconst neighbors = this.neighbors;\n\t\tconst faces = this.faces;\n\n\t\tconst offset = neighbors.indexOf( n );\n\n\t\tif ( offset === - 1 ) return;\n\n\t\tfor ( let i = 0; i < faces.length; i ++ ) {\n\n\t\t\tif ( faces[ i ].hasVertex( n ) ) return;\n\n\t\t}\n\n\t\tneighbors.splice( offset, 1 );\n\n\t}\n\n}\n\nexport { SimplifyModifier };\n", "import {\n\tBufferGeometry,\n\tColor,\n\tFloat32BufferAttribute,\n\tVector2,\n\tVector3\n} from 'three';\n\n/**\n * This class can be used to modify a geometry by breaking its edges if they\n * are longer than maximum length.\n *\n * ```js\n * const modifier = new TessellateModifier( 8, 6 );\n * geometry = modifier.modify( geometry );\n * ```\n *\n * @three_import import { TessellateModifier } from 'three/addons/modifiers/TessellateModifier.js';\n */\nclass TessellateModifier {\n\n\t/**\n\t * Constructs a new Tessellate modifier.\n\t *\n\t * @param {number} [maxEdgeLength=0.1] - The maximum edge length.\n\t * @param {number} [maxIterations=6] - The number of iterations.\n\t */\n\tconstructor( maxEdgeLength = 0.1, maxIterations = 6 ) {\n\n\t\t/**\n\t\t * The maximum edge length.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.1\n\t\t */\n\t\tthis.maxEdgeLength = maxEdgeLength;\n\n\t\t/**\n\t\t * The maximum edge length.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.1\n\t\t */\n\t\tthis.maxIterations = maxIterations;\n\n\t}\n\n\t/**\n\t * Returns a new, modified version of the given geometry by applying a tesselation.\n\t * Please note that the resulting geometry is always non-indexed.\n\t *\n\t * @param {BufferGeometry} geometry - The geometry to modify.\n\t * @return {BufferGeometry} A new, modified geometry.\n\t */\n\tmodify( geometry ) {\n\n\t\tif ( geometry.index !== null ) {\n\n\t\t\tgeometry = geometry.toNonIndexed();\n\n\t\t}\n\n\t\t//\n\n\t\tconst maxIterations = this.maxIterations;\n\t\tconst maxEdgeLengthSquared = this.maxEdgeLength * this.maxEdgeLength;\n\n\t\tconst va = new Vector3();\n\t\tconst vb = new Vector3();\n\t\tconst vc = new Vector3();\n\t\tconst vm = new Vector3();\n\t\tconst vs = [ va, vb, vc, vm ];\n\n\t\tconst na = new Vector3();\n\t\tconst nb = new Vector3();\n\t\tconst nc = new Vector3();\n\t\tconst nm = new Vector3();\n\t\tconst ns = [ na, nb, nc, nm ];\n\n\t\tconst ca = new Color();\n\t\tconst cb = new Color();\n\t\tconst cc = new Color();\n\t\tconst cm = new Color();\n\t\tconst cs = [ ca, cb, cc, cm ];\n\n\t\tconst ua = new Vector2();\n\t\tconst ub = new Vector2();\n\t\tconst uc = new Vector2();\n\t\tconst um = new Vector2();\n\t\tconst us = [ ua, ub, uc, um ];\n\n\t\tconst u2a = new Vector2();\n\t\tconst u2b = new Vector2();\n\t\tconst u2c = new Vector2();\n\t\tconst u2m = new Vector2();\n\t\tconst u2s = [ u2a, u2b, u2c, u2m ];\n\n\t\tconst attributes = geometry.attributes;\n\t\tconst hasNormals = attributes.normal !== undefined;\n\t\tconst hasColors = attributes.color !== undefined;\n\t\tconst hasUVs = attributes.uv !== undefined;\n\t\tconst hasUV1s = attributes.uv1 !== undefined;\n\n\t\tlet positions = attributes.position.array;\n\t\tlet normals = hasNormals ? attributes.normal.array : null;\n\t\tlet colors = hasColors ? attributes.color.array : null;\n\t\tlet uvs = hasUVs ? attributes.uv.array : null;\n\t\tlet uv1s = hasUV1s ? attributes.uv1.array : null;\n\n\t\tlet positions2 = positions;\n\t\tlet normals2 = normals;\n\t\tlet colors2 = colors;\n\t\tlet uvs2 = uvs;\n\t\tlet uv1s2 = uv1s;\n\n\t\tlet iteration = 0;\n\t\tlet tessellating = true;\n\n\t\tfunction addTriangle( a, b, c ) {\n\n\t\t\tconst v1 = vs[ a ];\n\t\t\tconst v2 = vs[ b ];\n\t\t\tconst v3 = vs[ c ];\n\n\t\t\tpositions2.push( v1.x, v1.y, v1.z );\n\t\t\tpositions2.push( v2.x, v2.y, v2.z );\n\t\t\tpositions2.push( v3.x, v3.y, v3.z );\n\n\t\t\tif ( hasNormals ) {\n\n\t\t\t\tconst n1 = ns[ a ];\n\t\t\t\tconst n2 = ns[ b ];\n\t\t\t\tconst n3 = ns[ c ];\n\n\t\t\t\tnormals2.push( n1.x, n1.y, n1.z );\n\t\t\t\tnormals2.push( n2.x, n2.y, n2.z );\n\t\t\t\tnormals2.push( n3.x, n3.y, n3.z );\n\n\t\t\t}\n\n\t\t\tif ( hasColors ) {\n\n\t\t\t\tconst c1 = cs[ a ];\n\t\t\t\tconst c2 = cs[ b ];\n\t\t\t\tconst c3 = cs[ c ];\n\n\t\t\t\tcolors2.push( c1.r, c1.g, c1.b );\n\t\t\t\tcolors2.push( c2.r, c2.g, c2.b );\n\t\t\t\tcolors2.push( c3.r, c3.g, c3.b );\n\n\t\t\t}\n\n\t\t\tif ( hasUVs ) {\n\n\t\t\t\tconst u1 = us[ a ];\n\t\t\t\tconst u2 = us[ b ];\n\t\t\t\tconst u3 = us[ c ];\n\n\t\t\t\tuvs2.push( u1.x, u1.y );\n\t\t\t\tuvs2.push( u2.x, u2.y );\n\t\t\t\tuvs2.push( u3.x, u3.y );\n\n\t\t\t}\n\n\t\t\tif ( hasUV1s ) {\n\n\t\t\t\tconst u21 = u2s[ a ];\n\t\t\t\tconst u22 = u2s[ b ];\n\t\t\t\tconst u23 = u2s[ c ];\n\n\t\t\t\tuv1s2.push( u21.x, u21.y );\n\t\t\t\tuv1s2.push( u22.x, u22.y );\n\t\t\t\tuv1s2.push( u23.x, u23.y );\n\n\t\t\t}\n\n\t\t}\n\n\t\twhile ( tessellating && iteration < maxIterations ) {\n\n\t\t\titeration ++;\n\t\t\ttessellating = false;\n\n\t\t\tpositions = positions2;\n\t\t\tpositions2 = [];\n\n\t\t\tif ( hasNormals ) {\n\n\t\t\t\tnormals = normals2;\n\t\t\t\tnormals2 = [];\n\n\t\t\t}\n\n\t\t\tif ( hasColors ) {\n\n\t\t\t\tcolors = colors2;\n\t\t\t\tcolors2 = [];\n\n\t\t\t}\n\n\t\t\tif ( hasUVs ) {\n\n\t\t\t\tuvs = uvs2;\n\t\t\t\tuvs2 = [];\n\n\t\t\t}\n\n\t\t\tif ( hasUV1s ) {\n\n\t\t\t\tuv1s = uv1s2;\n\t\t\t\tuv1s2 = [];\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, i2 = 0, il = positions.length; i < il; i += 9, i2 += 6 ) {\n\n\t\t\t\tva.fromArray( positions, i + 0 );\n\t\t\t\tvb.fromArray( positions, i + 3 );\n\t\t\t\tvc.fromArray( positions, i + 6 );\n\n\t\t\t\tif ( hasNormals ) {\n\n\t\t\t\t\tna.fromArray( normals, i + 0 );\n\t\t\t\t\tnb.fromArray( normals, i + 3 );\n\t\t\t\t\tnc.fromArray( normals, i + 6 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasColors ) {\n\n\t\t\t\t\tca.fromArray( colors, i + 0 );\n\t\t\t\t\tcb.fromArray( colors, i + 3 );\n\t\t\t\t\tcc.fromArray( colors, i + 6 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasUVs ) {\n\n\t\t\t\t\tua.fromArray( uvs, i2 + 0 );\n\t\t\t\t\tub.fromArray( uvs, i2 + 2 );\n\t\t\t\t\tuc.fromArray( uvs, i2 + 4 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasUV1s ) {\n\n\t\t\t\t\tu2a.fromArray( uv1s, i2 + 0 );\n\t\t\t\t\tu2b.fromArray( uv1s, i2 + 2 );\n\t\t\t\t\tu2c.fromArray( uv1s, i2 + 4 );\n\n\t\t\t\t}\n\n\t\t\t\tconst dab = va.distanceToSquared( vb );\n\t\t\t\tconst dbc = vb.distanceToSquared( vc );\n\t\t\t\tconst dac = va.distanceToSquared( vc );\n\n\t\t\t\tif ( dab > maxEdgeLengthSquared || dbc > maxEdgeLengthSquared || dac > maxEdgeLengthSquared ) {\n\n\t\t\t\t\ttessellating = true;\n\n\t\t\t\t\tif ( dab >= dbc && dab >= dac ) {\n\n\t\t\t\t\t\tvm.lerpVectors( va, vb, 0.5 );\n\t\t\t\t\t\tif ( hasNormals ) nm.lerpVectors( na, nb, 0.5 );\n\t\t\t\t\t\tif ( hasColors ) cm.lerpColors( ca, cb, 0.5 );\n\t\t\t\t\t\tif ( hasUVs ) um.lerpVectors( ua, ub, 0.5 );\n\t\t\t\t\t\tif ( hasUV1s ) u2m.lerpVectors( u2a, u2b, 0.5 );\n\n\t\t\t\t\t\taddTriangle( 0, 3, 2 );\n\t\t\t\t\t\taddTriangle( 3, 1, 2 );\n\n\t\t\t\t\t} else if ( dbc >= dab && dbc >= dac ) {\n\n\t\t\t\t\t\tvm.lerpVectors( vb, vc, 0.5 );\n\t\t\t\t\t\tif ( hasNormals ) nm.lerpVectors( nb, nc, 0.5 );\n\t\t\t\t\t\tif ( hasColors ) cm.lerpColors( cb, cc, 0.5 );\n\t\t\t\t\t\tif ( hasUVs ) um.lerpVectors( ub, uc, 0.5 );\n\t\t\t\t\t\tif ( hasUV1s ) u2m.lerpVectors( u2b, u2c, 0.5 );\n\n\t\t\t\t\t\taddTriangle( 0, 1, 3 );\n\t\t\t\t\t\taddTriangle( 3, 2, 0 );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvm.lerpVectors( va, vc, 0.5 );\n\t\t\t\t\t\tif ( hasNormals ) nm.lerpVectors( na, nc, 0.5 );\n\t\t\t\t\t\tif ( hasColors ) cm.lerpColors( ca, cc, 0.5 );\n\t\t\t\t\t\tif ( hasUVs ) um.lerpVectors( ua, uc, 0.5 );\n\t\t\t\t\t\tif ( hasUV1s ) u2m.lerpVectors( u2a, u2c, 0.5 );\n\n\t\t\t\t\t\taddTriangle( 0, 1, 3 );\n\t\t\t\t\t\taddTriangle( 3, 1, 2 );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\taddTriangle( 0, 1, 2 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst geometry2 = new BufferGeometry();\n\n\t\tgeometry2.setAttribute( 'position', new Float32BufferAttribute( positions2, 3 ) );\n\n\t\tif ( hasNormals ) {\n\n\t\t\tgeometry2.setAttribute( 'normal', new Float32BufferAttribute( normals2, 3 ) );\n\n\t\t}\n\n\t\tif ( hasColors ) {\n\n\t\t\tgeometry2.setAttribute( 'color', new Float32BufferAttribute( colors2, 3 ) );\n\n\t\t}\n\n\t\tif ( hasUVs ) {\n\n\t\t\tgeometry2.setAttribute( 'uv', new Float32BufferAttribute( uvs2, 2 ) );\n\n\t\t}\n\n\t\tif ( hasUV1s ) {\n\n\t\t\tgeometry2.setAttribute( 'uv1', new Float32BufferAttribute( uv1s2, 2 ) );\n\n\t\t}\n\n\t\treturn geometry2;\n\n\t}\n\n}\n\nexport { TessellateModifier };\n", "import { Mesh, MeshBasicMaterial, SphereGeometry, Vector3 } from 'three';\n\n/**\n * A ground-projected skybox.\n *\n * By default the object is centered at the camera, so it is often helpful to set\n * `skybox.position.y = height` to put the ground at the origin.\n *\n * ```js\n * const height = 15, radius = 100;\n *\n * const skybox = new GroundedSkybox( envMap, height, radius );\n * skybox.position.y = height;\n * scene.add( skybox );\n * ```\n *\n * @augments Mesh\n * @three_import import { GroundedSkybox } from 'three/addons/objects/GroundedSkybox.js';\n */\nclass GroundedSkybox extends Mesh {\n\n\t/**\n\t * Constructs a new ground-projected skybox.\n\t *\n\t * @param {Texture} map - The environment map to use.\n\t * @param {number} height - The height is how far the camera that took the photo was above the ground.\n\t * A larger value will magnify the downward part of the image.\n\t * @param {number} radius - The radius of the skybox. Must be large enough to ensure the scene's camera stays inside.\n\t * @param {number} [resolution=128] - The geometry resolution of the skybox.\n\t */\n\tconstructor( map, height, radius, resolution = 128 ) {\n\n\t\tif ( height <= 0 || radius <= 0 || resolution <= 0 ) {\n\n\t\t\tthrow new Error( 'GroundedSkybox height, radius, and resolution must be positive.' );\n\n\t\t}\n\n\t\tconst geometry = new SphereGeometry( radius, 2 * resolution, resolution );\n\t\tgeometry.scale( 1, 1, - 1 );\n\n\t\tconst pos = geometry.getAttribute( 'position' );\n\t\tconst tmp = new Vector3();\n\n\t\tfor ( let i = 0; i < pos.count; ++ i ) {\n\n\t\t\ttmp.fromBufferAttribute( pos, i );\n\t\t\tif ( tmp.y < 0 ) {\n\n\t\t\t\t// Smooth out the transition from flat floor to sphere:\n\t\t\t\tconst y1 = - height * 3 / 2;\n\t\t\t\tconst f =\n\t\t\t\t\t\ttmp.y < y1 ? - height / tmp.y : ( 1 - tmp.y * tmp.y / ( 3 * y1 * y1 ) );\n\t\t\t\ttmp.multiplyScalar( f );\n\t\t\t\ttmp.toArray( pos.array, 3 * i );\n\n\t\t\t}\n\n\t\t}\n\n\t\tpos.needsUpdate = true;\n\n\t\tsuper( geometry, new MeshBasicMaterial( { map, depthWrite: false } ) );\n\n\t}\n\n}\n\nexport { GroundedSkybox };\n", "import {\n\tAdditiveBlending,\n\tBox2,\n\tBufferGeometry,\n\tColor,\n\tFramebufferTexture,\n\tInterleavedBuffer,\n\tInterleavedBufferAttribute,\n\tMesh,\n\tMeshBasicMaterial,\n\tRawShaderMaterial,\n\tUnsignedByteType,\n\tVector2,\n\tVector3,\n\tVector4\n} from 'three';\n\n/**\n * Creates a simulated lens flare that tracks a light.\n *\n * Note that this class can only be used with {@link WebGLRenderer}.\n * When using {@link WebGPURenderer}, use {@link LensflareMesh}.\n *\n * ```js\n * const light = new THREE.PointLight( 0xffffff, 1.5, 2000 );\n *\n * const lensflare = new Lensflare();\n * lensflare.addElement( new LensflareElement( textureFlare0, 512, 0 ) );\n * lensflare.addElement( new LensflareElement( textureFlare1, 512, 0 ) );\n * lensflare.addElement( new LensflareElement( textureFlare2, 60, 0.6 ) );\n *\n * light.add( lensflare );\n * ```\n *\n * @augments Mesh\n * @three_import import { Lensflare } from 'three/addons/objects/Lensflare.js';\n */\nclass Lensflare extends Mesh {\n\n\t/**\n\t * Constructs a new lensflare.\n\t */\n\tconstructor() {\n\n\t\tsuper( Lensflare.Geometry, new MeshBasicMaterial( { opacity: 0, transparent: true } ) );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLensflare = true;\n\n\t\tthis.type = 'Lensflare';\n\n\t\t/**\n\t\t * Overwritten to disable view-frustum culling by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.frustumCulled = false;\n\n\t\t/**\n\t\t * Overwritten to make sure lensflares a rendered last.\n\t\t *\n\t\t * @type {number}\n\t\t * @default Infinity\n\t\t */\n\t\tthis.renderOrder = Infinity;\n\n\t\t//\n\n\t\tconst positionScreen = new Vector3();\n\t\tconst positionView = new Vector3();\n\n\t\t// textures\n\n\t\tconst tempMap = new FramebufferTexture( 16, 16 );\n\t\tconst occlusionMap = new FramebufferTexture( 16, 16 );\n\n\t\tlet currentType = UnsignedByteType;\n\n\t\t// material\n\n\t\tconst geometry = Lensflare.Geometry;\n\n\t\tconst material1a = new RawShaderMaterial( {\n\t\t\tuniforms: {\n\t\t\t\t'scale': { value: null },\n\t\t\t\t'screenPosition': { value: null }\n\t\t\t},\n\t\t\tvertexShader: /* glsl */`\n\n\t\t\t\tprecision highp float;\n\n\t\t\t\tuniform vec3 screenPosition;\n\t\t\t\tuniform vec2 scale;\n\n\t\t\t\tattribute vec3 position;\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tgl_Position = vec4( position.xy * scale + screenPosition.xy, screenPosition.z, 1.0 );\n\n\t\t\t\t}`,\n\n\t\t\tfragmentShader: /* glsl */`\n\n\t\t\t\tprecision highp float;\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tgl_FragColor = vec4( 1.0, 0.0, 1.0, 1.0 );\n\n\t\t\t\t}`,\n\t\t\tdepthTest: true,\n\t\t\tdepthWrite: false,\n\t\t\ttransparent: false\n\t\t} );\n\n\t\tconst material1b = new RawShaderMaterial( {\n\t\t\tuniforms: {\n\t\t\t\t'map': { value: tempMap },\n\t\t\t\t'scale': { value: null },\n\t\t\t\t'screenPosition': { value: null }\n\t\t\t},\n\t\t\tvertexShader: /* glsl */`\n\n\t\t\t\tprecision highp float;\n\n\t\t\t\tuniform vec3 screenPosition;\n\t\t\t\tuniform vec2 scale;\n\n\t\t\t\tattribute vec3 position;\n\t\t\t\tattribute vec2 uv;\n\n\t\t\t\tvarying vec2 vUV;\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvUV = uv;\n\n\t\t\t\t\tgl_Position = vec4( position.xy * scale + screenPosition.xy, screenPosition.z, 1.0 );\n\n\t\t\t\t}`,\n\n\t\t\tfragmentShader: /* glsl */`\n\n\t\t\t\tprecision highp float;\n\n\t\t\t\tuniform sampler2D map;\n\n\t\t\t\tvarying vec2 vUV;\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tgl_FragColor = texture2D( map, vUV );\n\n\t\t\t\t}`,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\ttransparent: false\n\t\t} );\n\n\t\t// the following object is used for occlusionMap generation\n\n\t\tconst mesh1 = new Mesh( geometry, material1a );\n\n\t\t//\n\n\t\tconst elements = [];\n\n\t\tconst shader = LensflareElement.Shader;\n\n\t\tconst material2 = new RawShaderMaterial( {\n\t\t\tname: shader.name,\n\t\t\tuniforms: {\n\t\t\t\t'map': { value: null },\n\t\t\t\t'occlusionMap': { value: occlusionMap },\n\t\t\t\t'color': { value: new Color( 0xffffff ) },\n\t\t\t\t'scale': { value: new Vector2() },\n\t\t\t\t'screenPosition': { value: new Vector3() }\n\t\t\t},\n\t\t\tvertexShader: shader.vertexShader,\n\t\t\tfragmentShader: shader.fragmentShader,\n\t\t\tblending: AdditiveBlending,\n\t\t\ttransparent: true,\n\t\t\tdepthWrite: false\n\t\t} );\n\n\t\tconst mesh2 = new Mesh( geometry, material2 );\n\n\t\t/**\n\t\t * Adds the given lensflare element to this instance.\n\t\t *\n\t\t * @param {LensflareElement} element - The element to add.\n\t\t */\n\t\tthis.addElement = function ( element ) {\n\n\t\t\telements.push( element );\n\n\t\t};\n\n\t\t//\n\n\t\tconst scale = new Vector2();\n\t\tconst screenPositionPixels = new Vector2();\n\t\tconst validArea = new Box2();\n\t\tconst viewport = new Vector4();\n\n\t\tthis.onBeforeRender = function ( renderer, scene, camera ) {\n\n\t\t\trenderer.getCurrentViewport( viewport );\n\n\t\t\tconst renderTarget = renderer.getRenderTarget();\n\t\t\tconst type = ( renderTarget !== null ) ? renderTarget.texture.type : UnsignedByteType;\n\n\t\t\tif ( currentType !== type ) {\n\n\t\t\t\ttempMap.dispose();\n\t\t\t\tocclusionMap.dispose();\n\n\t\t\t\ttempMap.type = occlusionMap.type = type;\n\n\t\t\t\tcurrentType = type;\n\n\t\t\t}\n\n\t\t\tconst invAspect = viewport.w / viewport.z;\n\t\t\tconst halfViewportWidth = viewport.z / 2.0;\n\t\t\tconst halfViewportHeight = viewport.w / 2.0;\n\n\t\t\tlet size = 16 / viewport.w;\n\t\t\tscale.set( size * invAspect, size );\n\n\t\t\tvalidArea.min.set( viewport.x, viewport.y );\n\t\t\tvalidArea.max.set( viewport.x + ( viewport.z - 16 ), viewport.y + ( viewport.w - 16 ) );\n\n\t\t\t// calculate position in screen space\n\n\t\t\tpositionView.setFromMatrixPosition( this.matrixWorld );\n\t\t\tpositionView.applyMatrix4( camera.matrixWorldInverse );\n\n\t\t\tif ( positionView.z > 0 ) return; // lensflare is behind the camera\n\n\t\t\tpositionScreen.copy( positionView ).applyMatrix4( camera.projectionMatrix );\n\n\t\t\t// horizontal and vertical coordinate of the lower left corner of the pixels to copy\n\n\t\t\tscreenPositionPixels.x = viewport.x + ( positionScreen.x * halfViewportWidth ) + halfViewportWidth - 8;\n\t\t\tscreenPositionPixels.y = viewport.y + ( positionScreen.y * halfViewportHeight ) + halfViewportHeight - 8;\n\n\t\t\t// screen cull\n\n\t\t\tif ( validArea.containsPoint( screenPositionPixels ) ) {\n\n\t\t\t\t// save current RGB to temp texture\n\n\t\t\t\trenderer.copyFramebufferToTexture( tempMap, screenPositionPixels );\n\n\t\t\t\t// render pink quad\n\n\t\t\t\tlet uniforms = material1a.uniforms;\n\t\t\t\tuniforms[ 'scale' ].value = scale;\n\t\t\t\tuniforms[ 'screenPosition' ].value = positionScreen;\n\n\t\t\t\trenderer.renderBufferDirect( camera, null, geometry, material1a, mesh1, null );\n\n\t\t\t\t// copy result to occlusionMap\n\n\t\t\t\trenderer.copyFramebufferToTexture( occlusionMap, screenPositionPixels );\n\n\t\t\t\t// restore graphics\n\n\t\t\t\tuniforms = material1b.uniforms;\n\t\t\t\tuniforms[ 'scale' ].value = scale;\n\t\t\t\tuniforms[ 'screenPosition' ].value = positionScreen;\n\n\t\t\t\trenderer.renderBufferDirect( camera, null, geometry, material1b, mesh1, null );\n\n\t\t\t\t// render elements\n\n\t\t\t\tconst vecX = - positionScreen.x * 2;\n\t\t\t\tconst vecY = - positionScreen.y * 2;\n\n\t\t\t\tfor ( let i = 0, l = elements.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst element = elements[ i ];\n\n\t\t\t\t\tconst uniforms = material2.uniforms;\n\n\t\t\t\t\tuniforms[ 'color' ].value.copy( element.color );\n\t\t\t\t\tuniforms[ 'map' ].value = element.texture;\n\t\t\t\t\tuniforms[ 'screenPosition' ].value.x = positionScreen.x + vecX * element.distance;\n\t\t\t\t\tuniforms[ 'screenPosition' ].value.y = positionScreen.y + vecY * element.distance;\n\n\t\t\t\t\tsize = element.size / viewport.w;\n\t\t\t\t\tconst invAspect = viewport.w / viewport.z;\n\n\t\t\t\t\tuniforms[ 'scale' ].value.set( size * invAspect, size );\n\n\t\t\t\t\tmaterial2.uniformsNeedUpdate = true;\n\n\t\t\t\t\trenderer.renderBufferDirect( camera, null, geometry, material2, mesh2, null );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Frees the GPU-related resources allocated by this instance. Call this\n\t\t * method whenever this instance is no longer used in your app.\n\t\t */\n\t\tthis.dispose = function () {\n\n\t\t\tmaterial1a.dispose();\n\t\t\tmaterial1b.dispose();\n\t\t\tmaterial2.dispose();\n\n\t\t\ttempMap.dispose();\n\t\t\tocclusionMap.dispose();\n\n\t\t\tfor ( let i = 0, l = elements.length; i < l; i ++ ) {\n\n\t\t\t\telements[ i ].texture.dispose();\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n}\n\n/**\n * Represents a single flare that can be added to a {@link Lensflare} container.\n *\n * @three_import import { LensflareElement } from 'three/addons/objects/Lensflare.js';\n */\nclass LensflareElement {\n\n\t/**\n\t * Constructs a new lensflare element.\n\t *\n\t * @param {Texture} texture - The flare's texture.\n\t * @param {number} [size=1] - The size in pixels.\n\t * @param {number} [distance=0] - The normalized distance (`[0,1]`) from the light source.\n\t * A value of `0` means the flare is located at light source.\n\t * @param {Color} [color] - The flare's color\n\t */\n\tconstructor( texture, size = 1, distance = 0, color = new Color( 0xffffff ) ) {\n\n\t\t/**\n\t\t * The flare's texture.\n\t\t *\n\t\t * @type {Texture}\n\t\t */\n\t\tthis.texture = texture;\n\n\t\t/**\n\t\t * The size in pixels.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.size = size;\n\n\t\t/**\n\t\t * The normalized distance (`[0,1]`) from the light source.\n\t\t * A value of `0` means the flare is located at light source.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.distance = distance;\n\n\t\t/**\n\t\t * The flare's color\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.color = color;\n\n\t}\n\n}\n\nLensflareElement.Shader = {\n\n\tname: 'LensflareElementShader',\n\n\tuniforms: {\n\n\t\t'map': { value: null },\n\t\t'occlusionMap': { value: null },\n\t\t'color': { value: null },\n\t\t'scale': { value: null },\n\t\t'screenPosition': { value: null }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tprecision highp float;\n\n\t\tuniform vec3 screenPosition;\n\t\tuniform vec2 scale;\n\n\t\tuniform sampler2D occlusionMap;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\n\n\t\tvarying vec2 vUV;\n\t\tvarying float vVisibility;\n\n\t\tvoid main() {\n\n\t\t\tvUV = uv;\n\n\t\t\tvec2 pos = position.xy;\n\n\t\t\tvec4 visibility = texture2D( occlusionMap, vec2( 0.1, 0.1 ) );\n\t\t\tvisibility += texture2D( occlusionMap, vec2( 0.5, 0.1 ) );\n\t\t\tvisibility += texture2D( occlusionMap, vec2( 0.9, 0.1 ) );\n\t\t\tvisibility += texture2D( occlusionMap, vec2( 0.9, 0.5 ) );\n\t\t\tvisibility += texture2D( occlusionMap, vec2( 0.9, 0.9 ) );\n\t\t\tvisibility += texture2D( occlusionMap, vec2( 0.5, 0.9 ) );\n\t\t\tvisibility += texture2D( occlusionMap, vec2( 0.1, 0.9 ) );\n\t\t\tvisibility += texture2D( occlusionMap, vec2( 0.1, 0.5 ) );\n\t\t\tvisibility += texture2D( occlusionMap, vec2( 0.5, 0.5 ) );\n\n\t\t\tvVisibility =        visibility.r / 9.0;\n\t\t\tvVisibility *= 1.0 - visibility.g / 9.0;\n\t\t\tvVisibility *=       visibility.b / 9.0;\n\n\t\t\tgl_Position = vec4( ( pos * scale + screenPosition.xy ).xy, screenPosition.z, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tprecision highp float;\n\n\t\tuniform sampler2D map;\n\t\tuniform vec3 color;\n\n\t\tvarying vec2 vUV;\n\t\tvarying float vVisibility;\n\n\t\tvoid main() {\n\n\t\t\tvec4 texture = texture2D( map, vUV );\n\t\t\ttexture.a *= vVisibility;\n\t\t\tgl_FragColor = texture;\n\t\t\tgl_FragColor.rgb *= color;\n\n\t\t}`\n\n};\n\nLensflare.Geometry = ( function () {\n\n\tconst geometry = new BufferGeometry();\n\n\tconst float32Array = new Float32Array( [\n\t\t- 1, - 1, 0, 0, 0,\n\t\t1, - 1, 0, 1, 0,\n\t\t1, 1, 0, 1, 1,\n\t\t- 1, 1, 0, 0, 1\n\t] );\n\n\tconst interleavedBuffer = new InterleavedBuffer( float32Array, 5 );\n\n\tgeometry.setIndex( [ 0, 1, 2,\t0, 2, 3 ] );\n\tgeometry.setAttribute( 'position', new InterleavedBufferAttribute( interleavedBuffer, 3, 0, false ) );\n\tgeometry.setAttribute( 'uv', new InterleavedBufferAttribute( interleavedBuffer, 2, 3, false ) );\n\n\treturn geometry;\n\n} )();\n\nexport { Lensflare, LensflareElement };\n", "import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tColor,\n\tDynamicDrawUsage,\n\tMesh,\n\tSphere,\n\tVector3\n} from 'three';\n\n/**\n * A marching cubes implementation.\n *\n * Port of: {@link http://webglsamples.org/blob/blob.html}\n *\n * @three_import import { MarchingCubes } from 'three/addons/objects/MarchingCubes.js';\n */\nclass MarchingCubes extends Mesh {\n\n\t/**\n\t * Constructs a new marching cubes instance.\n\t *\n\t * @param {number} resolution - The effect's resolution.\n\t * @param {Material} material - The cube's material.\n\t * @param {boolean} [enableUvs=false] - Whether texture coordinates should be animated or not.\n\t * @param {boolean} [enableColors=false] - Whether colors should be animated or not.\n\t * @param {number} [maxPolyCount=10000] - The maximum size of the geometry buffers.\n\t */\n\tconstructor( resolution, material, enableUvs = false, enableColors = false, maxPolyCount = 10000 ) {\n\n\t\tconst geometry = new BufferGeometry();\n\n\t\tsuper( geometry, material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMarchingCubes = true;\n\n\t\tconst scope = this;\n\n\t\t// temp buffers used in polygonize\n\n\t\tconst vlist = new Float32Array( 12 * 3 );\n\t\tconst nlist = new Float32Array( 12 * 3 );\n\t\tconst clist = new Float32Array( 12 * 3 );\n\n\t\t/**\n\t\t * Whether texture coordinates should be animated or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.enableUvs = enableUvs;\n\n\t\t/**\n\t\t * Whether colors should be animated or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.enableColors = enableColors;\n\n\t\t// functions have to be object properties\n\t\t// prototype functions kill performance\n\t\t// (tested and it was 4x slower !!!)\n\n\t\tthis.init = function ( resolution ) {\n\n\t\t\tthis.resolution = resolution;\n\n\t\t\t// parameters\n\n\t\t\tthis.isolation = 80.0;\n\n\t\t\t// size of field, 32 is pushing it in Javascript :)\n\n\t\t\tthis.size = resolution;\n\t\t\tthis.size2 = this.size * this.size;\n\t\t\tthis.size3 = this.size2 * this.size;\n\t\t\tthis.halfsize = this.size / 2.0;\n\n\t\t\t// deltas\n\n\t\t\tthis.delta = 2.0 / this.size;\n\t\t\tthis.yd = this.size;\n\t\t\tthis.zd = this.size2;\n\n\t\t\tthis.field = new Float32Array( this.size3 );\n\t\t\tthis.normal_cache = new Float32Array( this.size3 * 3 );\n\t\t\tthis.palette = new Float32Array( this.size3 * 3 );\n\n\t\t\t//\n\n\t\t\tthis.count = 0;\n\n\t\t\tconst maxVertexCount = maxPolyCount * 3;\n\n\t\t\tthis.positionArray = new Float32Array( maxVertexCount * 3 );\n\t\t\tconst positionAttribute = new BufferAttribute( this.positionArray, 3 );\n\t\t\tpositionAttribute.setUsage( DynamicDrawUsage );\n\t\t\tgeometry.setAttribute( 'position', positionAttribute );\n\n\t\t\tthis.normalArray = new Float32Array( maxVertexCount * 3 );\n\t\t\tconst normalAttribute = new BufferAttribute( this.normalArray, 3 );\n\t\t\tnormalAttribute.setUsage( DynamicDrawUsage );\n\t\t\tgeometry.setAttribute( 'normal', normalAttribute );\n\n\t\t\tif ( this.enableUvs ) {\n\n\t\t\t\tthis.uvArray = new Float32Array( maxVertexCount * 2 );\n\t\t\t\tconst uvAttribute = new BufferAttribute( this.uvArray, 2 );\n\t\t\t\tuvAttribute.setUsage( DynamicDrawUsage );\n\t\t\t\tgeometry.setAttribute( 'uv', uvAttribute );\n\n\t\t\t}\n\n\t\t\tif ( this.enableColors ) {\n\n\t\t\t\tthis.colorArray = new Float32Array( maxVertexCount * 3 );\n\t\t\t\tconst colorAttribute = new BufferAttribute( this.colorArray, 3 );\n\t\t\t\tcolorAttribute.setUsage( DynamicDrawUsage );\n\t\t\t\tgeometry.setAttribute( 'color', colorAttribute );\n\n\t\t\t}\n\n\t\t\tgeometry.boundingSphere = new Sphere( new Vector3(), 1 );\n\n\t\t};\n\n\t\t///////////////////////\n\t\t// Polygonization\n\t\t///////////////////////\n\n\t\tfunction lerp( a, b, t ) {\n\n\t\t\treturn a + ( b - a ) * t;\n\n\t\t}\n\n\t\tfunction VIntX( q, offset, isol, x, y, z, valp1, valp2, c_offset1, c_offset2 ) {\n\n\t\t\tconst mu = ( isol - valp1 ) / ( valp2 - valp1 ),\n\t\t\t\tnc = scope.normal_cache;\n\n\t\t\tvlist[ offset + 0 ] = x + mu * scope.delta;\n\t\t\tvlist[ offset + 1 ] = y;\n\t\t\tvlist[ offset + 2 ] = z;\n\n\t\t\tnlist[ offset + 0 ] = lerp( nc[ q + 0 ], nc[ q + 3 ], mu );\n\t\t\tnlist[ offset + 1 ] = lerp( nc[ q + 1 ], nc[ q + 4 ], mu );\n\t\t\tnlist[ offset + 2 ] = lerp( nc[ q + 2 ], nc[ q + 5 ], mu );\n\n\t\t\tclist[ offset + 0 ] = lerp( scope.palette[ c_offset1 * 3 + 0 ], scope.palette[ c_offset2 * 3 + 0 ], mu );\n\t\t\tclist[ offset + 1 ] = lerp( scope.palette[ c_offset1 * 3 + 1 ], scope.palette[ c_offset2 * 3 + 1 ], mu );\n\t\t\tclist[ offset + 2 ] = lerp( scope.palette[ c_offset1 * 3 + 2 ], scope.palette[ c_offset2 * 3 + 2 ], mu );\n\n\t\t}\n\n\t\tfunction VIntY( q, offset, isol, x, y, z, valp1, valp2, c_offset1, c_offset2 ) {\n\n\t\t\tconst mu = ( isol - valp1 ) / ( valp2 - valp1 ),\n\t\t\t\tnc = scope.normal_cache;\n\n\t\t\tvlist[ offset + 0 ] = x;\n\t\t\tvlist[ offset + 1 ] = y + mu * scope.delta;\n\t\t\tvlist[ offset + 2 ] = z;\n\n\t\t\tconst q2 = q + scope.yd * 3;\n\n\t\t\tnlist[ offset + 0 ] = lerp( nc[ q + 0 ], nc[ q2 + 0 ], mu );\n\t\t\tnlist[ offset + 1 ] = lerp( nc[ q + 1 ], nc[ q2 + 1 ], mu );\n\t\t\tnlist[ offset + 2 ] = lerp( nc[ q + 2 ], nc[ q2 + 2 ], mu );\n\n\t\t\tclist[ offset + 0 ] = lerp( scope.palette[ c_offset1 * 3 + 0 ], scope.palette[ c_offset2 * 3 + 0 ], mu );\n\t\t\tclist[ offset + 1 ] = lerp( scope.palette[ c_offset1 * 3 + 1 ], scope.palette[ c_offset2 * 3 + 1 ], mu );\n\t\t\tclist[ offset + 2 ] = lerp( scope.palette[ c_offset1 * 3 + 2 ], scope.palette[ c_offset2 * 3 + 2 ], mu );\n\n\t\t}\n\n\t\tfunction VIntZ( q, offset, isol, x, y, z, valp1, valp2, c_offset1, c_offset2 ) {\n\n\t\t\tconst mu = ( isol - valp1 ) / ( valp2 - valp1 ),\n\t\t\t\tnc = scope.normal_cache;\n\n\t\t\tvlist[ offset + 0 ] = x;\n\t\t\tvlist[ offset + 1 ] = y;\n\t\t\tvlist[ offset + 2 ] = z + mu * scope.delta;\n\n\t\t\tconst q2 = q + scope.zd * 3;\n\n\t\t\tnlist[ offset + 0 ] = lerp( nc[ q + 0 ], nc[ q2 + 0 ], mu );\n\t\t\tnlist[ offset + 1 ] = lerp( nc[ q + 1 ], nc[ q2 + 1 ], mu );\n\t\t\tnlist[ offset + 2 ] = lerp( nc[ q + 2 ], nc[ q2 + 2 ], mu );\n\n\t\t\tclist[ offset + 0 ] = lerp( scope.palette[ c_offset1 * 3 + 0 ], scope.palette[ c_offset2 * 3 + 0 ], mu );\n\t\t\tclist[ offset + 1 ] = lerp( scope.palette[ c_offset1 * 3 + 1 ], scope.palette[ c_offset2 * 3 + 1 ], mu );\n\t\t\tclist[ offset + 2 ] = lerp( scope.palette[ c_offset1 * 3 + 2 ], scope.palette[ c_offset2 * 3 + 2 ], mu );\n\n\t\t}\n\n\t\tfunction compNorm( q ) {\n\n\t\t\tconst q3 = q * 3;\n\n\t\t\tif ( scope.normal_cache[ q3 ] === 0.0 ) {\n\n\t\t\t\tscope.normal_cache[ q3 + 0 ] = scope.field[ q - 1 ] - scope.field[ q + 1 ];\n\t\t\t\tscope.normal_cache[ q3 + 1 ] =\n\t\t\t\t\tscope.field[ q - scope.yd ] - scope.field[ q + scope.yd ];\n\t\t\t\tscope.normal_cache[ q3 + 2 ] =\n\t\t\t\t\tscope.field[ q - scope.zd ] - scope.field[ q + scope.zd ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Returns total number of triangles. Fills triangles.\n\t\t// (this is where most of time is spent - it's inner work of O(n3) loop )\n\n\t\tfunction polygonize( fx, fy, fz, q, isol ) {\n\n\t\t\t// cache indices\n\t\t\tconst q1 = q + 1,\n\t\t\t\tqy = q + scope.yd,\n\t\t\t\tqz = q + scope.zd,\n\t\t\t\tq1y = q1 + scope.yd,\n\t\t\t\tq1z = q1 + scope.zd,\n\t\t\t\tqyz = q + scope.yd + scope.zd,\n\t\t\t\tq1yz = q1 + scope.yd + scope.zd;\n\n\t\t\tlet cubeindex = 0;\n\t\t\tconst field0 = scope.field[ q ],\n\t\t\t\tfield1 = scope.field[ q1 ],\n\t\t\t\tfield2 = scope.field[ qy ],\n\t\t\t\tfield3 = scope.field[ q1y ],\n\t\t\t\tfield4 = scope.field[ qz ],\n\t\t\t\tfield5 = scope.field[ q1z ],\n\t\t\t\tfield6 = scope.field[ qyz ],\n\t\t\t\tfield7 = scope.field[ q1yz ];\n\n\t\t\tif ( field0 < isol ) cubeindex |= 1;\n\t\t\tif ( field1 < isol ) cubeindex |= 2;\n\t\t\tif ( field2 < isol ) cubeindex |= 8;\n\t\t\tif ( field3 < isol ) cubeindex |= 4;\n\t\t\tif ( field4 < isol ) cubeindex |= 16;\n\t\t\tif ( field5 < isol ) cubeindex |= 32;\n\t\t\tif ( field6 < isol ) cubeindex |= 128;\n\t\t\tif ( field7 < isol ) cubeindex |= 64;\n\n\t\t\t// if cube is entirely in/out of the surface - bail, nothing to draw\n\n\t\t\tconst bits = edgeTable[ cubeindex ];\n\t\t\tif ( bits === 0 ) return 0;\n\n\t\t\tconst d = scope.delta,\n\t\t\t\tfx2 = fx + d,\n\t\t\t\tfy2 = fy + d,\n\t\t\t\tfz2 = fz + d;\n\n\t\t\t// top of the cube\n\n\t\t\tif ( bits & 1 ) {\n\n\t\t\t\tcompNorm( q );\n\t\t\t\tcompNorm( q1 );\n\t\t\t\tVIntX( q * 3, 0, isol, fx, fy, fz, field0, field1, q, q1 );\n\n\t\t\t}\n\n\t\t\tif ( bits & 2 ) {\n\n\t\t\t\tcompNorm( q1 );\n\t\t\t\tcompNorm( q1y );\n\t\t\t\tVIntY( q1 * 3, 3, isol, fx2, fy, fz, field1, field3, q1, q1y );\n\n\t\t\t}\n\n\t\t\tif ( bits & 4 ) {\n\n\t\t\t\tcompNorm( qy );\n\t\t\t\tcompNorm( q1y );\n\t\t\t\tVIntX( qy * 3, 6, isol, fx, fy2, fz, field2, field3, qy, q1y );\n\n\t\t\t}\n\n\t\t\tif ( bits & 8 ) {\n\n\t\t\t\tcompNorm( q );\n\t\t\t\tcompNorm( qy );\n\t\t\t\tVIntY( q * 3, 9, isol, fx, fy, fz, field0, field2, q, qy );\n\n\t\t\t}\n\n\t\t\t// bottom of the cube\n\n\t\t\tif ( bits & 16 ) {\n\n\t\t\t\tcompNorm( qz );\n\t\t\t\tcompNorm( q1z );\n\t\t\t\tVIntX( qz * 3, 12, isol, fx, fy, fz2, field4, field5, qz, q1z );\n\n\t\t\t}\n\n\t\t\tif ( bits & 32 ) {\n\n\t\t\t\tcompNorm( q1z );\n\t\t\t\tcompNorm( q1yz );\n\t\t\t\tVIntY(\n\t\t\t\t\tq1z * 3,\n\t\t\t\t\t15,\n\t\t\t\t\tisol,\n\t\t\t\t\tfx2,\n\t\t\t\t\tfy,\n\t\t\t\t\tfz2,\n\t\t\t\t\tfield5,\n\t\t\t\t\tfield7,\n\t\t\t\t\tq1z,\n\t\t\t\t\tq1yz\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\tif ( bits & 64 ) {\n\n\t\t\t\tcompNorm( qyz );\n\t\t\t\tcompNorm( q1yz );\n\t\t\t\tVIntX(\n\t\t\t\t\tqyz * 3,\n\t\t\t\t\t18,\n\t\t\t\t\tisol,\n\t\t\t\t\tfx,\n\t\t\t\t\tfy2,\n\t\t\t\t\tfz2,\n\t\t\t\t\tfield6,\n\t\t\t\t\tfield7,\n\t\t\t\t\tqyz,\n\t\t\t\t\tq1yz\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\tif ( bits & 128 ) {\n\n\t\t\t\tcompNorm( qz );\n\t\t\t\tcompNorm( qyz );\n\t\t\t\tVIntY( qz * 3, 21, isol, fx, fy, fz2, field4, field6, qz, qyz );\n\n\t\t\t}\n\n\t\t\t// vertical lines of the cube\n\t\t\tif ( bits & 256 ) {\n\n\t\t\t\tcompNorm( q );\n\t\t\t\tcompNorm( qz );\n\t\t\t\tVIntZ( q * 3, 24, isol, fx, fy, fz, field0, field4, q, qz );\n\n\t\t\t}\n\n\t\t\tif ( bits & 512 ) {\n\n\t\t\t\tcompNorm( q1 );\n\t\t\t\tcompNorm( q1z );\n\t\t\t\tVIntZ( q1 * 3, 27, isol, fx2, fy, fz, field1, field5, q1, q1z );\n\n\t\t\t}\n\n\t\t\tif ( bits & 1024 ) {\n\n\t\t\t\tcompNorm( q1y );\n\t\t\t\tcompNorm( q1yz );\n\t\t\t\tVIntZ(\n\t\t\t\t\tq1y * 3,\n\t\t\t\t\t30,\n\t\t\t\t\tisol,\n\t\t\t\t\tfx2,\n\t\t\t\t\tfy2,\n\t\t\t\t\tfz,\n\t\t\t\t\tfield3,\n\t\t\t\t\tfield7,\n\t\t\t\t\tq1y,\n\t\t\t\t\tq1yz\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\tif ( bits & 2048 ) {\n\n\t\t\t\tcompNorm( qy );\n\t\t\t\tcompNorm( qyz );\n\t\t\t\tVIntZ( qy * 3, 33, isol, fx, fy2, fz, field2, field6, qy, qyz );\n\n\t\t\t}\n\n\t\t\tcubeindex <<= 4; // re-purpose cubeindex into an offset into triTable\n\n\t\t\tlet o1,\n\t\t\t\to2,\n\t\t\t\to3,\n\t\t\t\tnumtris = 0,\n\t\t\t\ti = 0;\n\n\t\t\t// here is where triangles are created\n\n\t\t\twhile ( triTable[ cubeindex + i ] != - 1 ) {\n\n\t\t\t\to1 = cubeindex + i;\n\t\t\t\to2 = o1 + 1;\n\t\t\t\to3 = o1 + 2;\n\n\t\t\t\tposnormtriv(\n\t\t\t\t\tvlist,\n\t\t\t\t\tnlist,\n\t\t\t\t\tclist,\n\t\t\t\t\t3 * triTable[ o1 ],\n\t\t\t\t\t3 * triTable[ o2 ],\n\t\t\t\t\t3 * triTable[ o3 ]\n\t\t\t\t);\n\n\t\t\t\ti += 3;\n\t\t\t\tnumtris ++;\n\n\t\t\t}\n\n\t\t\treturn numtris;\n\n\t\t}\n\n\t\tfunction posnormtriv( pos, norm, colors, o1, o2, o3 ) {\n\n\t\t\tconst c = scope.count * 3;\n\n\t\t\t// positions\n\n\t\t\tscope.positionArray[ c + 0 ] = pos[ o1 ];\n\t\t\tscope.positionArray[ c + 1 ] = pos[ o1 + 1 ];\n\t\t\tscope.positionArray[ c + 2 ] = pos[ o1 + 2 ];\n\n\t\t\tscope.positionArray[ c + 3 ] = pos[ o2 ];\n\t\t\tscope.positionArray[ c + 4 ] = pos[ o2 + 1 ];\n\t\t\tscope.positionArray[ c + 5 ] = pos[ o2 + 2 ];\n\n\t\t\tscope.positionArray[ c + 6 ] = pos[ o3 ];\n\t\t\tscope.positionArray[ c + 7 ] = pos[ o3 + 1 ];\n\t\t\tscope.positionArray[ c + 8 ] = pos[ o3 + 2 ];\n\n\t\t\t// normals\n\n\t\t\tif ( scope.material.flatShading === true ) {\n\n\t\t\t\tconst nx = ( norm[ o1 + 0 ] + norm[ o2 + 0 ] + norm[ o3 + 0 ] ) / 3;\n\t\t\t\tconst ny = ( norm[ o1 + 1 ] + norm[ o2 + 1 ] + norm[ o3 + 1 ] ) / 3;\n\t\t\t\tconst nz = ( norm[ o1 + 2 ] + norm[ o2 + 2 ] + norm[ o3 + 2 ] ) / 3;\n\n\t\t\t\tscope.normalArray[ c + 0 ] = nx;\n\t\t\t\tscope.normalArray[ c + 1 ] = ny;\n\t\t\t\tscope.normalArray[ c + 2 ] = nz;\n\n\t\t\t\tscope.normalArray[ c + 3 ] = nx;\n\t\t\t\tscope.normalArray[ c + 4 ] = ny;\n\t\t\t\tscope.normalArray[ c + 5 ] = nz;\n\n\t\t\t\tscope.normalArray[ c + 6 ] = nx;\n\t\t\t\tscope.normalArray[ c + 7 ] = ny;\n\t\t\t\tscope.normalArray[ c + 8 ] = nz;\n\n\t\t\t} else {\n\n\t\t\t\tscope.normalArray[ c + 0 ] = norm[ o1 + 0 ];\n\t\t\t\tscope.normalArray[ c + 1 ] = norm[ o1 + 1 ];\n\t\t\t\tscope.normalArray[ c + 2 ] = norm[ o1 + 2 ];\n\n\t\t\t\tscope.normalArray[ c + 3 ] = norm[ o2 + 0 ];\n\t\t\t\tscope.normalArray[ c + 4 ] = norm[ o2 + 1 ];\n\t\t\t\tscope.normalArray[ c + 5 ] = norm[ o2 + 2 ];\n\n\t\t\t\tscope.normalArray[ c + 6 ] = norm[ o3 + 0 ];\n\t\t\t\tscope.normalArray[ c + 7 ] = norm[ o3 + 1 ];\n\t\t\t\tscope.normalArray[ c + 8 ] = norm[ o3 + 2 ];\n\n\t\t\t}\n\n\t\t\t// uvs\n\n\t\t\tif ( scope.enableUvs ) {\n\n\t\t\t\tconst d = scope.count * 2;\n\n\t\t\t\tscope.uvArray[ d + 0 ] = pos[ o1 + 0 ];\n\t\t\t\tscope.uvArray[ d + 1 ] = pos[ o1 + 2 ];\n\n\t\t\t\tscope.uvArray[ d + 2 ] = pos[ o2 + 0 ];\n\t\t\t\tscope.uvArray[ d + 3 ] = pos[ o2 + 2 ];\n\n\t\t\t\tscope.uvArray[ d + 4 ] = pos[ o3 + 0 ];\n\t\t\t\tscope.uvArray[ d + 5 ] = pos[ o3 + 2 ];\n\n\t\t\t}\n\n\t\t\t// colors\n\n\t\t\tif ( scope.enableColors ) {\n\n\t\t\t\tscope.colorArray[ c + 0 ] = colors[ o1 + 0 ];\n\t\t\t\tscope.colorArray[ c + 1 ] = colors[ o1 + 1 ];\n\t\t\t\tscope.colorArray[ c + 2 ] = colors[ o1 + 2 ];\n\n\t\t\t\tscope.colorArray[ c + 3 ] = colors[ o2 + 0 ];\n\t\t\t\tscope.colorArray[ c + 4 ] = colors[ o2 + 1 ];\n\t\t\t\tscope.colorArray[ c + 5 ] = colors[ o2 + 2 ];\n\n\t\t\t\tscope.colorArray[ c + 6 ] = colors[ o3 + 0 ];\n\t\t\t\tscope.colorArray[ c + 7 ] = colors[ o3 + 1 ];\n\t\t\t\tscope.colorArray[ c + 8 ] = colors[ o3 + 2 ];\n\n\t\t\t}\n\n\t\t\tscope.count += 3;\n\n\t\t}\n\n\t\t/////////////////////////////////////\n\t\t// Metaballs\n\t\t/////////////////////////////////////\n\n\t\t/**\n\t\t * Adds a reciprocal ball (nice and blobby) that, to be fast, fades to zero after\n\t\t * a fixed distance, determined by strength and subtract.\n\t\t *\n\t\t * @param {number} ballx - The x-coordinate of the ball.\n\t\t * @param {number} bally - The y-coordinate of the ball.\n\t\t * @param {number} ballz - The z-coordinate of the ball.\n\t\t * @param {number} strength - The strength factor.\n\t\t * @param {number} subtract - The subtract factor.\n\t\t * @param {Color} colors - The color.\n\t\t */\n\t\tthis.addBall = function ( ballx, bally, ballz, strength, subtract, colors ) {\n\n\t\t\tconst sign = Math.sign( strength );\n\t\t\tstrength = Math.abs( strength );\n\t\t\tconst userDefineColor = ! ( colors === undefined || colors === null );\n\t\t\tlet ballColor = new Color( ballx, bally, ballz );\n\n\t\t\tif ( userDefineColor ) {\n\n\t\t\t\ttry {\n\n\t\t\t\t\tballColor =\n\t\t\t\t\t\tcolors instanceof Color\n\t\t\t\t\t\t\t? colors\n\t\t\t\t\t\t\t: Array.isArray( colors )\n\t\t\t\t\t\t\t\t? new Color(\n\t\t\t\t\t\t\t\t\tMath.min( Math.abs( colors[ 0 ] ), 1 ),\n\t\t\t\t\t\t\t\t\tMath.min( Math.abs( colors[ 1 ] ), 1 ),\n\t\t\t\t\t\t\t\t\tMath.min( Math.abs( colors[ 2 ] ), 1 )\n\t\t\t\t\t\t\t  )\n\t\t\t\t\t\t\t\t: new Color( colors );\n\n\t\t\t\t} catch ( err ) {\n\n\t\t\t\t\tballColor = new Color( ballx, bally, ballz );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Let's solve the equation to find the radius:\n\t\t\t// 1.0 / (0.000001 + radius^2) * strength - subtract = 0\n\t\t\t// strength / (radius^2) = subtract\n\t\t\t// strength = subtract * radius^2\n\t\t\t// radius^2 = strength / subtract\n\t\t\t// radius = sqrt(strength / subtract)\n\n\t\t\tconst radius = this.size * Math.sqrt( strength / subtract ),\n\t\t\t\tzs = ballz * this.size,\n\t\t\t\tys = bally * this.size,\n\t\t\t\txs = ballx * this.size;\n\n\t\t\tlet min_z = Math.floor( zs - radius );\n\t\t\tif ( min_z < 1 ) min_z = 1;\n\t\t\tlet max_z = Math.floor( zs + radius );\n\t\t\tif ( max_z > this.size - 1 ) max_z = this.size - 1;\n\t\t\tlet min_y = Math.floor( ys - radius );\n\t\t\tif ( min_y < 1 ) min_y = 1;\n\t\t\tlet max_y = Math.floor( ys + radius );\n\t\t\tif ( max_y > this.size - 1 ) max_y = this.size - 1;\n\t\t\tlet min_x = Math.floor( xs - radius );\n\t\t\tif ( min_x < 1 ) min_x = 1;\n\t\t\tlet max_x = Math.floor( xs + radius );\n\t\t\tif ( max_x > this.size - 1 ) max_x = this.size - 1;\n\n\t\t\t// Don't polygonize in the outer layer because normals aren't\n\t\t\t// well-defined there.\n\n\t\t\tlet x, y, z, y_offset, z_offset, fx, fy, fz, fz2, fy2, val;\n\n\t\t\tfor ( z = min_z; z < max_z; z ++ ) {\n\n\t\t\t\tz_offset = this.size2 * z;\n\t\t\t\tfz = z / this.size - ballz;\n\t\t\t\tfz2 = fz * fz;\n\n\t\t\t\tfor ( y = min_y; y < max_y; y ++ ) {\n\n\t\t\t\t\ty_offset = z_offset + this.size * y;\n\t\t\t\t\tfy = y / this.size - bally;\n\t\t\t\t\tfy2 = fy * fy;\n\n\t\t\t\t\tfor ( x = min_x; x < max_x; x ++ ) {\n\n\t\t\t\t\t\tfx = x / this.size - ballx;\n\t\t\t\t\t\tval = strength / ( 0.000001 + fx * fx + fy2 + fz2 ) - subtract;\n\t\t\t\t\t\tif ( val > 0.0 ) {\n\n\t\t\t\t\t\t\tthis.field[ y_offset + x ] += val * sign;\n\n\t\t\t\t\t\t\t// optimization\n\t\t\t\t\t\t\t// http://www.geisswerks.com/ryan/BLOBS/blobs.html\n\t\t\t\t\t\t\tconst ratio =\n\t\t\t\t\t\t\t\tMath.sqrt( ( x - xs ) * ( x - xs ) + ( y - ys ) * ( y - ys ) + ( z - zs ) * ( z - zs ) ) / radius;\n\t\t\t\t\t\t\tconst contrib =\n\t\t\t\t\t\t\t\t1 - ratio * ratio * ratio * ( ratio * ( ratio * 6 - 15 ) + 10 );\n\t\t\t\t\t\t\tthis.palette[ ( y_offset + x ) * 3 + 0 ] += ballColor.r * contrib;\n\t\t\t\t\t\t\tthis.palette[ ( y_offset + x ) * 3 + 1 ] += ballColor.g * contrib;\n\t\t\t\t\t\t\tthis.palette[ ( y_offset + x ) * 3 + 2 ] += ballColor.b * contrib;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Adds a plane along the x-axis.\n\t\t *\n\t\t * @param {number} strength - The strength factor.\n\t\t * @param {number} subtract - The subtract factor.\n\t\t */\n\t\tthis.addPlaneX = function ( strength, subtract ) {\n\n\t\t\t// cache attribute lookups\n\t\t\tconst size = this.size,\n\t\t\t\tyd = this.yd,\n\t\t\t\tzd = this.zd,\n\t\t\t\tfield = this.field;\n\n\t\t\tlet x,\n\t\t\t\ty,\n\t\t\t\tz,\n\t\t\t\txx,\n\t\t\t\tval,\n\t\t\t\txdiv,\n\t\t\t\tcxy,\n\t\t\t\tdist = size * Math.sqrt( strength / subtract );\n\n\t\t\tif ( dist > size ) dist = size;\n\n\t\t\tfor ( x = 0; x < dist; x ++ ) {\n\n\t\t\t\txdiv = x / size;\n\t\t\t\txx = xdiv * xdiv;\n\t\t\t\tval = strength / ( 0.0001 + xx ) - subtract;\n\n\t\t\t\tif ( val > 0.0 ) {\n\n\t\t\t\t\tfor ( y = 0; y < size; y ++ ) {\n\n\t\t\t\t\t\tcxy = x + y * yd;\n\n\t\t\t\t\t\tfor ( z = 0; z < size; z ++ ) {\n\n\t\t\t\t\t\t\tfield[ zd * z + cxy ] += val;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Adds a plane along the y-axis.\n\t\t *\n\t\t * @param {number} strength - The strength factor.\n\t\t * @param {number} subtract - The subtract factor.\n\t\t */\n\t\tthis.addPlaneY = function ( strength, subtract ) {\n\n\t\t\t// cache attribute lookups\n\t\t\tconst size = this.size,\n\t\t\t\tyd = this.yd,\n\t\t\t\tzd = this.zd,\n\t\t\t\tfield = this.field;\n\n\t\t\tlet x,\n\t\t\t\ty,\n\t\t\t\tz,\n\t\t\t\tyy,\n\t\t\t\tval,\n\t\t\t\tydiv,\n\t\t\t\tcy,\n\t\t\t\tcxy,\n\t\t\t\tdist = size * Math.sqrt( strength / subtract );\n\n\t\t\tif ( dist > size ) dist = size;\n\n\t\t\tfor ( y = 0; y < dist; y ++ ) {\n\n\t\t\t\tydiv = y / size;\n\t\t\t\tyy = ydiv * ydiv;\n\t\t\t\tval = strength / ( 0.0001 + yy ) - subtract;\n\n\t\t\t\tif ( val > 0.0 ) {\n\n\t\t\t\t\tcy = y * yd;\n\n\t\t\t\t\tfor ( x = 0; x < size; x ++ ) {\n\n\t\t\t\t\t\tcxy = cy + x;\n\n\t\t\t\t\t\tfor ( z = 0; z < size; z ++ ) field[ zd * z + cxy ] += val;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Adds a plane along the z-axis.\n\t\t *\n\t\t * @param {number} strength - The strength factor.\n\t\t * @param {number} subtract - The subtract factor.\n\t\t */\n\t\tthis.addPlaneZ = function ( strength, subtract ) {\n\n\t\t\t// cache attribute lookups\n\n\t\t\tconst size = this.size,\n\t\t\t\tyd = this.yd,\n\t\t\t\tzd = this.zd,\n\t\t\t\tfield = this.field;\n\n\t\t\tlet x,\n\t\t\t\ty,\n\t\t\t\tz,\n\t\t\t\tzz,\n\t\t\t\tval,\n\t\t\t\tzdiv,\n\t\t\t\tcz,\n\t\t\t\tcyz,\n\t\t\t\tdist = size * Math.sqrt( strength / subtract );\n\n\t\t\tif ( dist > size ) dist = size;\n\n\t\t\tfor ( z = 0; z < dist; z ++ ) {\n\n\t\t\t\tzdiv = z / size;\n\t\t\t\tzz = zdiv * zdiv;\n\t\t\t\tval = strength / ( 0.0001 + zz ) - subtract;\n\t\t\t\tif ( val > 0.0 ) {\n\n\t\t\t\t\tcz = zd * z;\n\n\t\t\t\t\tfor ( y = 0; y < size; y ++ ) {\n\n\t\t\t\t\t\tcyz = cz + y * yd;\n\n\t\t\t\t\t\tfor ( x = 0; x < size; x ++ ) field[ cyz + x ] += val;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t/////////////////////////////////////\n\t\t// Updates\n\t\t/////////////////////////////////////\n\n\t\t/**\n\t\t * Sets the cell value for the given coordinates.\n\t\t *\n\t\t * @param {number} x - The x value.\n\t\t * @param {number} y - The y value.\n\t\t * @param {number} z - The z value.\n\t\t * @param {number} value - The value to set.\n\t\t */\n\t\tthis.setCell = function ( x, y, z, value ) {\n\n\t\t\tconst index = this.size2 * z + this.size * y + x;\n\t\t\tthis.field[ index ] = value;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the cell value for the given coordinates.\n\t\t *\n\t\t * @param {number} x - The x value.\n\t\t * @param {number} y - The y value.\n\t\t * @param {number} z - The z value.\n\t\t * @return {number} The value.\n\t\t */\n\t\tthis.getCell = function ( x, y, z ) {\n\n\t\t\tconst index = this.size2 * z + this.size * y + x;\n\t\t\treturn this.field[ index ];\n\n\t\t};\n\n\t\t/**\n\t\t * Applies a blur with the given intensity.\n\t\t *\n\t\t * @param {number} [intensity=1] - The intensity of the blur.\n\t\t */\n\t\tthis.blur = function ( intensity = 1 ) {\n\n\t\t\tconst field = this.field;\n\t\t\tconst fieldCopy = field.slice();\n\t\t\tconst size = this.size;\n\t\t\tconst size2 = this.size2;\n\t\t\tfor ( let x = 0; x < size; x ++ ) {\n\n\t\t\t\tfor ( let y = 0; y < size; y ++ ) {\n\n\t\t\t\t\tfor ( let z = 0; z < size; z ++ ) {\n\n\t\t\t\t\t\tconst index = size2 * z + size * y + x;\n\t\t\t\t\t\tlet val = fieldCopy[ index ];\n\t\t\t\t\t\tlet count = 1;\n\n\t\t\t\t\t\tfor ( let x2 = - 1; x2 <= 1; x2 += 2 ) {\n\n\t\t\t\t\t\t\tconst x3 = x2 + x;\n\t\t\t\t\t\t\tif ( x3 < 0 || x3 >= size ) continue;\n\n\t\t\t\t\t\t\tfor ( let y2 = - 1; y2 <= 1; y2 += 2 ) {\n\n\t\t\t\t\t\t\t\tconst y3 = y2 + y;\n\t\t\t\t\t\t\t\tif ( y3 < 0 || y3 >= size ) continue;\n\n\t\t\t\t\t\t\t\tfor ( let z2 = - 1; z2 <= 1; z2 += 2 ) {\n\n\t\t\t\t\t\t\t\t\tconst z3 = z2 + z;\n\t\t\t\t\t\t\t\t\tif ( z3 < 0 || z3 >= size ) continue;\n\n\t\t\t\t\t\t\t\t\tconst index2 = size2 * z3 + size * y3 + x3;\n\t\t\t\t\t\t\t\t\tconst val2 = fieldCopy[ index2 ];\n\n\t\t\t\t\t\t\t\t\tcount ++;\n\t\t\t\t\t\t\t\t\tval += intensity * ( val2 - val ) / count;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfield[ index ] = val;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Resets the effect.\n\t\t */\n\t\tthis.reset = function () {\n\n\t\t\t// wipe the normal cache\n\n\t\t\tfor ( let i = 0; i < this.size3; i ++ ) {\n\n\t\t\t\tthis.normal_cache[ i * 3 ] = 0.0;\n\t\t\t\tthis.field[ i ] = 0.0;\n\t\t\t\tthis.palette[ i * 3 ] = this.palette[ i * 3 + 1 ] = this.palette[\n\t\t\t\t\ti * 3 + 2\n\t\t\t\t] = 0.0;\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Updates the effect.\n\t\t */\n\t\tthis.update = function () {\n\n\t\t\tthis.count = 0;\n\n\t\t\t// Triangulate. Yeah, this is slow.\n\n\t\t\tconst smin2 = this.size - 2;\n\n\t\t\tfor ( let z = 1; z < smin2; z ++ ) {\n\n\t\t\t\tconst z_offset = this.size2 * z;\n\t\t\t\tconst fz = ( z - this.halfsize ) / this.halfsize; //+ 1\n\n\t\t\t\tfor ( let y = 1; y < smin2; y ++ ) {\n\n\t\t\t\t\tconst y_offset = z_offset + this.size * y;\n\t\t\t\t\tconst fy = ( y - this.halfsize ) / this.halfsize; //+ 1\n\n\t\t\t\t\tfor ( let x = 1; x < smin2; x ++ ) {\n\n\t\t\t\t\t\tconst fx = ( x - this.halfsize ) / this.halfsize; //+ 1\n\t\t\t\t\t\tconst q = y_offset + x;\n\n\t\t\t\t\t\t polygonize( fx, fy, fz, q, this.isolation );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// set the draw range to only the processed triangles\n\n\t\t\tthis.geometry.setDrawRange( 0, this.count );\n\n\t\t\t// update geometry data\n\n\t\t\tgeometry.getAttribute( 'position' ).needsUpdate = true;\n\t\t\tgeometry.getAttribute( 'normal' ).needsUpdate = true;\n\n\t\t\tif ( this.enableUvs ) geometry.getAttribute( 'uv' ).needsUpdate = true;\n\t\t\tif ( this.enableColors ) geometry.getAttribute( 'color' ).needsUpdate = true;\n\n\t\t\t// safety check\n\n\t\t\tif ( this.count / 3 > maxPolyCount ) console.warn( 'THREE.MarchingCubes: Geometry buffers too small for rendering. Please create an instance with a higher poly count.' );\n\n\t\t};\n\n\t\tthis.init( resolution );\n\n\t}\n\n}\n\n/////////////////////////////////////\n// Marching cubes lookup tables\n/////////////////////////////////////\n\n// These tables are straight from Paul Bourke's page:\n// http://paulbourke.net/geometry/polygonise/\n// who in turn got them from Cory Gene Bloyd.\n\nconst edgeTable = new Int32Array( [\n\t0x0, 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c,\n\t0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00,\n\t0x190, 0x99, 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c,\n\t0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90,\n\t0x230, 0x339, 0x33, 0x13a, 0x636, 0x73f, 0x435, 0x53c,\n\t0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30,\n\t0x3a0, 0x2a9, 0x1a3, 0xaa, 0x7a6, 0x6af, 0x5a5, 0x4ac,\n\t0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0,\n\t0x460, 0x569, 0x663, 0x76a, 0x66, 0x16f, 0x265, 0x36c,\n\t0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60,\n\t0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0xff, 0x3f5, 0x2fc,\n\t0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0,\n\t0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x55, 0x15c,\n\t0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950,\n\t0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0xcc,\n\t0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0,\n\t0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc,\n\t0xcc, 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0,\n\t0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c,\n\t0x15c, 0x55, 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650,\n\t0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc,\n\t0x2fc, 0x3f5, 0xff, 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0,\n\t0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c,\n\t0x36c, 0x265, 0x16f, 0x66, 0x76a, 0x663, 0x569, 0x460,\n\t0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac,\n\t0x4ac, 0x5a5, 0x6af, 0x7a6, 0xaa, 0x1a3, 0x2a9, 0x3a0,\n\t0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c,\n\t0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x33, 0x339, 0x230,\n\t0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c,\n\t0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x99, 0x190,\n\t0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c,\n\t0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x0 ] );\n\nconst triTable = new Int32Array( [\n\t- 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t0, 8, 3, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t0, 1, 9, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t1, 8, 3, 9, 8, 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t1, 2, 10, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t0, 8, 3, 1, 2, 10, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t9, 2, 10, 0, 2, 9, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t2, 8, 3, 2, 10, 8, 10, 9, 8, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t3, 11, 2, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t0, 11, 2, 8, 11, 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t1, 9, 0, 2, 3, 11, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t1, 11, 2, 1, 9, 11, 9, 8, 11, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t3, 10, 1, 11, 10, 3, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t0, 10, 1, 0, 8, 10, 8, 11, 10, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t3, 9, 0, 3, 11, 9, 11, 10, 9, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t9, 8, 10, 10, 8, 11, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t4, 7, 8, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t4, 3, 0, 7, 3, 4, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t0, 1, 9, 8, 4, 7, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t4, 1, 9, 4, 7, 1, 7, 3, 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t1, 2, 10, 8, 4, 7, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t3, 4, 7, 3, 0, 4, 1, 2, 10, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t9, 2, 10, 9, 0, 2, 8, 4, 7, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4, - 1, - 1, - 1, - 1,\n\t8, 4, 7, 3, 11, 2, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t11, 4, 7, 11, 2, 4, 2, 0, 4, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t9, 0, 1, 8, 4, 7, 2, 3, 11, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1, - 1, - 1, - 1, - 1,\n\t3, 10, 1, 3, 11, 10, 7, 8, 4, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4, - 1, - 1, - 1, - 1,\n\t4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3, - 1, - 1, - 1, - 1,\n\t4, 7, 11, 4, 11, 9, 9, 11, 10, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t9, 5, 4, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t9, 5, 4, 0, 8, 3, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t0, 5, 4, 1, 5, 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t8, 5, 4, 8, 3, 5, 3, 1, 5, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t1, 2, 10, 9, 5, 4, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t3, 0, 8, 1, 2, 10, 4, 9, 5, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t5, 2, 10, 5, 4, 2, 4, 0, 2, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8, - 1, - 1, - 1, - 1,\n\t9, 5, 4, 2, 3, 11, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t0, 11, 2, 0, 8, 11, 4, 9, 5, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t0, 5, 4, 0, 1, 5, 2, 3, 11, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5, - 1, - 1, - 1, - 1,\n\t10, 3, 11, 10, 1, 3, 9, 5, 4, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10, - 1, - 1, - 1, - 1,\n\t5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3, - 1, - 1, - 1, - 1,\n\t5, 4, 8, 5, 8, 10, 10, 8, 11, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t9, 7, 8, 5, 7, 9, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t9, 3, 0, 9, 5, 3, 5, 7, 3, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t0, 7, 8, 0, 1, 7, 1, 5, 7, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t1, 5, 3, 3, 5, 7, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t9, 7, 8, 9, 5, 7, 10, 1, 2, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3, - 1, - 1, - 1, - 1,\n\t8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2, - 1, - 1, - 1, - 1,\n\t2, 10, 5, 2, 5, 3, 3, 5, 7, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t7, 9, 5, 7, 8, 9, 3, 11, 2, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11, - 1, - 1, - 1, - 1,\n\t2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7, - 1, - 1, - 1, - 1,\n\t11, 2, 1, 11, 1, 7, 7, 1, 5, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11, - 1, - 1, - 1, - 1,\n\t5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0, - 1,\n\t11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0, - 1,\n\t11, 10, 5, 7, 11, 5, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t10, 6, 5, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t0, 8, 3, 5, 10, 6, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t9, 0, 1, 5, 10, 6, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t1, 8, 3, 1, 9, 8, 5, 10, 6, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t1, 6, 5, 2, 6, 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t1, 6, 5, 1, 2, 6, 3, 0, 8, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t9, 6, 5, 9, 0, 6, 0, 2, 6, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t5, 9, 8, 5, 8, 2, 5, 2, 6, 3, 2, 8, - 1, - 1, - 1, - 1,\n\t2, 3, 11, 10, 6, 5, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t11, 0, 8, 11, 2, 0, 10, 6, 5, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t0, 1, 9, 2, 3, 11, 5, 10, 6, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t5, 10, 6, 1, 9, 2, 9, 11, 2, 9, 8, 11, - 1, - 1, - 1, - 1,\n\t6, 3, 11, 6, 5, 3, 5, 1, 3, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t0, 8, 11, 0, 11, 5, 0, 5, 1, 5, 11, 6, - 1, - 1, - 1, - 1,\n\t3, 11, 6, 0, 3, 6, 0, 6, 5, 0, 5, 9, - 1, - 1, - 1, - 1,\n\t6, 5, 9, 6, 9, 11, 11, 9, 8, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t5, 10, 6, 4, 7, 8, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t4, 3, 0, 4, 7, 3, 6, 5, 10, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t1, 9, 0, 5, 10, 6, 8, 4, 7, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t10, 6, 5, 1, 9, 7, 1, 7, 3, 7, 9, 4, - 1, - 1, - 1, - 1,\n\t6, 1, 2, 6, 5, 1, 4, 7, 8, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t1, 2, 5, 5, 2, 6, 3, 0, 4, 3, 4, 7, - 1, - 1, - 1, - 1,\n\t8, 4, 7, 9, 0, 5, 0, 6, 5, 0, 2, 6, - 1, - 1, - 1, - 1,\n\t7, 3, 9, 7, 9, 4, 3, 2, 9, 5, 9, 6, 2, 6, 9, - 1,\n\t3, 11, 2, 7, 8, 4, 10, 6, 5, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t5, 10, 6, 4, 7, 2, 4, 2, 0, 2, 7, 11, - 1, - 1, - 1, - 1,\n\t0, 1, 9, 4, 7, 8, 2, 3, 11, 5, 10, 6, - 1, - 1, - 1, - 1,\n\t9, 2, 1, 9, 11, 2, 9, 4, 11, 7, 11, 4, 5, 10, 6, - 1,\n\t8, 4, 7, 3, 11, 5, 3, 5, 1, 5, 11, 6, - 1, - 1, - 1, - 1,\n\t5, 1, 11, 5, 11, 6, 1, 0, 11, 7, 11, 4, 0, 4, 11, - 1,\n\t0, 5, 9, 0, 6, 5, 0, 3, 6, 11, 6, 3, 8, 4, 7, - 1,\n\t6, 5, 9, 6, 9, 11, 4, 7, 9, 7, 11, 9, - 1, - 1, - 1, - 1,\n\t10, 4, 9, 6, 4, 10, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t4, 10, 6, 4, 9, 10, 0, 8, 3, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t10, 0, 1, 10, 6, 0, 6, 4, 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t8, 3, 1, 8, 1, 6, 8, 6, 4, 6, 1, 10, - 1, - 1, - 1, - 1,\n\t1, 4, 9, 1, 2, 4, 2, 6, 4, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t3, 0, 8, 1, 2, 9, 2, 4, 9, 2, 6, 4, - 1, - 1, - 1, - 1,\n\t0, 2, 4, 4, 2, 6, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t8, 3, 2, 8, 2, 4, 4, 2, 6, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t10, 4, 9, 10, 6, 4, 11, 2, 3, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t0, 8, 2, 2, 8, 11, 4, 9, 10, 4, 10, 6, - 1, - 1, - 1, - 1,\n\t3, 11, 2, 0, 1, 6, 0, 6, 4, 6, 1, 10, - 1, - 1, - 1, - 1,\n\t6, 4, 1, 6, 1, 10, 4, 8, 1, 2, 1, 11, 8, 11, 1, - 1,\n\t9, 6, 4, 9, 3, 6, 9, 1, 3, 11, 6, 3, - 1, - 1, - 1, - 1,\n\t8, 11, 1, 8, 1, 0, 11, 6, 1, 9, 1, 4, 6, 4, 1, - 1,\n\t3, 11, 6, 3, 6, 0, 0, 6, 4, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t6, 4, 8, 11, 6, 8, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t7, 10, 6, 7, 8, 10, 8, 9, 10, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t0, 7, 3, 0, 10, 7, 0, 9, 10, 6, 7, 10, - 1, - 1, - 1, - 1,\n\t10, 6, 7, 1, 10, 7, 1, 7, 8, 1, 8, 0, - 1, - 1, - 1, - 1,\n\t10, 6, 7, 10, 7, 1, 1, 7, 3, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t1, 2, 6, 1, 6, 8, 1, 8, 9, 8, 6, 7, - 1, - 1, - 1, - 1,\n\t2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9, - 1,\n\t7, 8, 0, 7, 0, 6, 6, 0, 2, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t7, 3, 2, 6, 7, 2, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7, - 1, - 1, - 1, - 1,\n\t2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7, - 1,\n\t1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11, - 1,\n\t11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1, - 1, - 1, - 1, - 1,\n\t8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6, - 1,\n\t0, 9, 1, 11, 6, 7, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0, - 1, - 1, - 1, - 1,\n\t7, 11, 6, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t7, 6, 11, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t3, 0, 8, 11, 7, 6, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t0, 1, 9, 11, 7, 6, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t8, 1, 9, 8, 3, 1, 11, 7, 6, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t10, 1, 2, 6, 11, 7, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t1, 2, 10, 3, 0, 8, 6, 11, 7, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t2, 9, 0, 2, 10, 9, 6, 11, 7, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8, - 1, - 1, - 1, - 1,\n\t7, 2, 3, 6, 2, 7, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t7, 0, 8, 7, 6, 0, 6, 2, 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t2, 7, 6, 2, 3, 7, 0, 1, 9, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6, - 1, - 1, - 1, - 1,\n\t10, 7, 6, 10, 1, 7, 1, 3, 7, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8, - 1, - 1, - 1, - 1,\n\t0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7, - 1, - 1, - 1, - 1,\n\t7, 6, 10, 7, 10, 8, 8, 10, 9, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t6, 8, 4, 11, 8, 6, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t3, 6, 11, 3, 0, 6, 0, 4, 6, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t8, 6, 11, 8, 4, 6, 9, 0, 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6, - 1, - 1, - 1, - 1,\n\t6, 8, 4, 6, 11, 8, 2, 10, 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6, - 1, - 1, - 1, - 1,\n\t4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9, - 1, - 1, - 1, - 1,\n\t10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3, - 1,\n\t8, 2, 3, 8, 4, 2, 4, 6, 2, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t0, 4, 2, 4, 6, 2, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8, - 1, - 1, - 1, - 1,\n\t1, 9, 4, 1, 4, 2, 2, 4, 6, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1, - 1, - 1, - 1, - 1,\n\t10, 1, 0, 10, 0, 6, 6, 0, 4, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3, - 1,\n\t10, 9, 4, 6, 10, 4, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t4, 9, 5, 7, 6, 11, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t0, 8, 3, 4, 9, 5, 11, 7, 6, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t5, 0, 1, 5, 4, 0, 7, 6, 11, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5, - 1, - 1, - 1, - 1,\n\t9, 5, 4, 10, 1, 2, 7, 6, 11, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5, - 1, - 1, - 1, - 1,\n\t7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2, - 1, - 1, - 1, - 1,\n\t3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6, - 1,\n\t7, 2, 3, 7, 6, 2, 5, 4, 9, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7, - 1, - 1, - 1, - 1,\n\t3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0, - 1, - 1, - 1, - 1,\n\t6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8, - 1,\n\t9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7, - 1, - 1, - 1, - 1,\n\t1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4, - 1,\n\t4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10, - 1,\n\t7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10, - 1, - 1, - 1, - 1,\n\t6, 9, 5, 6, 11, 9, 11, 8, 9, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5, - 1, - 1, - 1, - 1,\n\t0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11, - 1, - 1, - 1, - 1,\n\t6, 11, 3, 6, 3, 5, 5, 3, 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6, - 1, - 1, - 1, - 1,\n\t0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10, - 1,\n\t11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5, - 1,\n\t6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3, - 1, - 1, - 1, - 1,\n\t5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2, - 1, - 1, - 1, - 1,\n\t9, 5, 6, 9, 6, 0, 0, 6, 2, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8, - 1,\n\t1, 5, 6, 2, 1, 6, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6, - 1,\n\t10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0, - 1, - 1, - 1, - 1,\n\t0, 3, 8, 5, 6, 10, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t10, 5, 6, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t11, 5, 10, 7, 5, 11, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t11, 5, 10, 11, 7, 5, 8, 3, 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t5, 11, 7, 5, 10, 11, 1, 9, 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1, - 1, - 1, - 1, - 1,\n\t11, 1, 2, 11, 7, 1, 7, 5, 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11, - 1, - 1, - 1, - 1,\n\t9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7, - 1, - 1, - 1, - 1,\n\t7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2, - 1,\n\t2, 5, 10, 2, 3, 5, 3, 7, 5, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5, - 1, - 1, - 1, - 1,\n\t9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2, - 1, - 1, - 1, - 1,\n\t9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2, - 1,\n\t1, 3, 5, 3, 7, 5, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t0, 8, 7, 0, 7, 1, 1, 7, 5, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t9, 0, 3, 9, 3, 5, 5, 3, 7, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t9, 8, 7, 5, 9, 7, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t5, 8, 4, 5, 10, 8, 10, 11, 8, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0, - 1, - 1, - 1, - 1,\n\t0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5, - 1, - 1, - 1, - 1,\n\t10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4, - 1,\n\t2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8, - 1, - 1, - 1, - 1,\n\t0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11, - 1,\n\t0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5, - 1,\n\t9, 4, 5, 2, 11, 3, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4, - 1, - 1, - 1, - 1,\n\t5, 10, 2, 5, 2, 4, 4, 2, 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9, - 1,\n\t5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2, - 1, - 1, - 1, - 1,\n\t8, 4, 5, 8, 5, 3, 3, 5, 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t0, 4, 5, 1, 0, 5, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5, - 1, - 1, - 1, - 1,\n\t9, 4, 5, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t4, 11, 7, 4, 9, 11, 9, 10, 11, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11, - 1, - 1, - 1, - 1,\n\t1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11, - 1, - 1, - 1, - 1,\n\t3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4, - 1,\n\t4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2, - 1, - 1, - 1, - 1,\n\t9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3, - 1,\n\t11, 7, 4, 11, 4, 2, 2, 4, 0, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4, - 1, - 1, - 1, - 1,\n\t2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9, - 1, - 1, - 1, - 1,\n\t9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7, - 1,\n\t3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10, - 1,\n\t1, 10, 2, 8, 7, 4, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t4, 9, 1, 4, 1, 7, 7, 1, 3, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1, - 1, - 1, - 1, - 1,\n\t4, 0, 3, 7, 4, 3, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t4, 8, 7, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t9, 10, 8, 10, 11, 8, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t3, 0, 9, 3, 9, 11, 11, 9, 10, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t0, 1, 10, 0, 10, 8, 8, 10, 11, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t3, 1, 10, 11, 3, 10, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t1, 2, 11, 1, 11, 9, 9, 11, 8, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9, - 1, - 1, - 1, - 1,\n\t0, 2, 11, 8, 0, 11, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t3, 2, 11, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t2, 3, 8, 2, 8, 10, 10, 8, 9, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t9, 10, 2, 0, 9, 2, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8, - 1, - 1, - 1, - 1,\n\t1, 10, 2, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t1, 3, 8, 9, 1, 8, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t0, 9, 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t0, 3, 8, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1,\n\t- 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1, - 1 ] );\n\nexport { MarchingCubes, edgeTable, triTable };\n", "import {\n\tColor,\n\tMatrix4,\n\tMesh,\n\tPerspectiveCamera,\n\tPlane,\n\tShaderMaterial,\n\tUniformsUtils,\n\tVector3,\n\tVector4,\n\tWebGLRenderTarget,\n\tHalfFloatType\n} from 'three';\n\n/**\n * Can be used to create a flat, reflective surface like a mirror.\n *\n * Note that this class can only be used with {@link WebGLRenderer}.\n * When using {@link WebGPURenderer}, use {@link ReflectorNode}.\n *\n * ```js\n * const geometry = new THREE.PlaneGeometry( 100, 100 );\n *\n * const reflector = new Reflector( geometry, {\n * \tclipBias: 0.003,\n * \ttextureWidth: window.innerWidth * window.devicePixelRatio,\n * \ttextureHeight: window.innerHeight * window.devicePixelRatio,\n * \tcolor: 0xc1cbcb\n * } );\n *\n * scene.add( reflector );\n * ```\n *\n * @augments Mesh\n * @three_import import { Reflector } from 'three/addons/objects/Reflector.js';\n */\nclass Reflector extends Mesh {\n\n\t/**\n\t * Constructs a new reflector.\n\t *\n\t * @param {BufferGeometry} geometry - The reflector's geometry.\n\t * @param {Reflector~Options} [options] - The configuration options.\n\t */\n\tconstructor( geometry, options = {} ) {\n\n\t\tsuper( geometry );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isReflector = true;\n\n\t\tthis.type = 'Reflector';\n\n\t\t/**\n\t\t * Whether to force an update, no matter if the reflector\n\t\t * is in view or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.forceUpdate = false;\n\n\t\t/**\n\t\t * The reflector's virtual camera. This is used to render\n\t\t * the scene from the mirror's point of view.\n\t\t *\n\t\t * @type {PerspectiveCamera}\n\t\t */\n\t\tthis.camera = new PerspectiveCamera();\n\n\t\tconst scope = this;\n\n\t\tconst color = ( options.color !== undefined ) ? new Color( options.color ) : new Color( 0x7F7F7F );\n\t\tconst textureWidth = options.textureWidth || 512;\n\t\tconst textureHeight = options.textureHeight || 512;\n\t\tconst clipBias = options.clipBias || 0;\n\t\tconst shader = options.shader || Reflector.ReflectorShader;\n\t\tconst multisample = ( options.multisample !== undefined ) ? options.multisample : 4;\n\n\t\t//\n\n\t\tconst reflectorPlane = new Plane();\n\t\tconst normal = new Vector3();\n\t\tconst reflectorWorldPosition = new Vector3();\n\t\tconst cameraWorldPosition = new Vector3();\n\t\tconst rotationMatrix = new Matrix4();\n\t\tconst lookAtPosition = new Vector3( 0, 0, - 1 );\n\t\tconst clipPlane = new Vector4();\n\n\t\tconst view = new Vector3();\n\t\tconst target = new Vector3();\n\t\tconst q = new Vector4();\n\n\t\tconst textureMatrix = new Matrix4();\n\t\tconst virtualCamera = this.camera;\n\n\t\tconst renderTarget = new WebGLRenderTarget( textureWidth, textureHeight, { samples: multisample, type: HalfFloatType } );\n\n\t\tconst material = new ShaderMaterial( {\n\t\t\tname: ( shader.name !== undefined ) ? shader.name : 'unspecified',\n\t\t\tuniforms: UniformsUtils.clone( shader.uniforms ),\n\t\t\tfragmentShader: shader.fragmentShader,\n\t\t\tvertexShader: shader.vertexShader\n\t\t} );\n\n\t\tmaterial.uniforms[ 'tDiffuse' ].value = renderTarget.texture;\n\t\tmaterial.uniforms[ 'color' ].value = color;\n\t\tmaterial.uniforms[ 'textureMatrix' ].value = textureMatrix;\n\n\t\tthis.material = material;\n\n\t\tthis.onBeforeRender = function ( renderer, scene, camera ) {\n\n\t\t\treflectorWorldPosition.setFromMatrixPosition( scope.matrixWorld );\n\t\t\tcameraWorldPosition.setFromMatrixPosition( camera.matrixWorld );\n\n\t\t\trotationMatrix.extractRotation( scope.matrixWorld );\n\n\t\t\tnormal.set( 0, 0, 1 );\n\t\t\tnormal.applyMatrix4( rotationMatrix );\n\n\t\t\tview.subVectors( reflectorWorldPosition, cameraWorldPosition );\n\n\t\t\t// Avoid rendering when reflector is facing away unless forcing an update\n\t\t\tconst isFacingAway = view.dot( normal ) > 0;\n\n\t\t\tif ( isFacingAway === true && this.forceUpdate === false ) return;\n\n\t\t\tview.reflect( normal ).negate();\n\t\t\tview.add( reflectorWorldPosition );\n\n\t\t\trotationMatrix.extractRotation( camera.matrixWorld );\n\n\t\t\tlookAtPosition.set( 0, 0, - 1 );\n\t\t\tlookAtPosition.applyMatrix4( rotationMatrix );\n\t\t\tlookAtPosition.add( cameraWorldPosition );\n\n\t\t\ttarget.subVectors( reflectorWorldPosition, lookAtPosition );\n\t\t\ttarget.reflect( normal ).negate();\n\t\t\ttarget.add( reflectorWorldPosition );\n\n\t\t\tvirtualCamera.position.copy( view );\n\t\t\tvirtualCamera.up.set( 0, 1, 0 );\n\t\t\tvirtualCamera.up.applyMatrix4( rotationMatrix );\n\t\t\tvirtualCamera.up.reflect( normal );\n\t\t\tvirtualCamera.lookAt( target );\n\n\t\t\tvirtualCamera.far = camera.far; // Used in WebGLBackground\n\n\t\t\tvirtualCamera.updateMatrixWorld();\n\t\t\tvirtualCamera.projectionMatrix.copy( camera.projectionMatrix );\n\n\t\t\t// Update the texture matrix\n\t\t\ttextureMatrix.set(\n\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t);\n\t\t\ttextureMatrix.multiply( virtualCamera.projectionMatrix );\n\t\t\ttextureMatrix.multiply( virtualCamera.matrixWorldInverse );\n\t\t\ttextureMatrix.multiply( scope.matrixWorld );\n\n\t\t\t// Now update projection matrix with new clip plane, implementing code from: http://www.terathon.com/code/oblique.html\n\t\t\t// Paper explaining this technique: http://www.terathon.com/lengyel/Lengyel-Oblique.pdf\n\t\t\treflectorPlane.setFromNormalAndCoplanarPoint( normal, reflectorWorldPosition );\n\t\t\treflectorPlane.applyMatrix4( virtualCamera.matrixWorldInverse );\n\n\t\t\tclipPlane.set( reflectorPlane.normal.x, reflectorPlane.normal.y, reflectorPlane.normal.z, reflectorPlane.constant );\n\n\t\t\tconst projectionMatrix = virtualCamera.projectionMatrix;\n\n\t\t\tq.x = ( Math.sign( clipPlane.x ) + projectionMatrix.elements[ 8 ] ) / projectionMatrix.elements[ 0 ];\n\t\t\tq.y = ( Math.sign( clipPlane.y ) + projectionMatrix.elements[ 9 ] ) / projectionMatrix.elements[ 5 ];\n\t\t\tq.z = - 1.0;\n\t\t\tq.w = ( 1.0 + projectionMatrix.elements[ 10 ] ) / projectionMatrix.elements[ 14 ];\n\n\t\t\t// Calculate the scaled plane vector\n\t\t\tclipPlane.multiplyScalar( 2.0 / clipPlane.dot( q ) );\n\n\t\t\t// Replacing the third row of the projection matrix\n\t\t\tprojectionMatrix.elements[ 2 ] = clipPlane.x;\n\t\t\tprojectionMatrix.elements[ 6 ] = clipPlane.y;\n\t\t\tprojectionMatrix.elements[ 10 ] = clipPlane.z + 1.0 - clipBias;\n\t\t\tprojectionMatrix.elements[ 14 ] = clipPlane.w;\n\n\t\t\t// Render\n\t\t\tscope.visible = false;\n\n\t\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\t\tconst currentXrEnabled = renderer.xr.enabled;\n\t\t\tconst currentShadowAutoUpdate = renderer.shadowMap.autoUpdate;\n\n\t\t\trenderer.xr.enabled = false; // Avoid camera modification\n\t\t\trenderer.shadowMap.autoUpdate = false; // Avoid re-computing shadows\n\n\t\t\trenderer.setRenderTarget( renderTarget );\n\n\t\t\trenderer.state.buffers.depth.setMask( true ); // make sure the depth buffer is writable so it can be properly cleared, see #18897\n\n\t\t\tif ( renderer.autoClear === false ) renderer.clear();\n\t\t\trenderer.render( scene, virtualCamera );\n\n\t\t\trenderer.xr.enabled = currentXrEnabled;\n\t\t\trenderer.shadowMap.autoUpdate = currentShadowAutoUpdate;\n\n\t\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t\t\t// Restore viewport\n\n\t\t\tconst viewport = camera.viewport;\n\n\t\t\tif ( viewport !== undefined ) {\n\n\t\t\t\trenderer.state.viewport( viewport );\n\n\t\t\t}\n\n\t\t\tscope.visible = true;\n\t\t\tthis.forceUpdate = false;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the reflector's internal render target.\n\t\t *\n\t\t * @return {WebGLRenderTarget} The internal render target\n\t\t */\n\t\tthis.getRenderTarget = function () {\n\n\t\t\treturn renderTarget;\n\n\t\t};\n\n\t\t/**\n\t\t * Frees the GPU-related resources allocated by this instance. Call this\n\t\t * method whenever this instance is no longer used in your app.\n\t\t */\n\t\tthis.dispose = function () {\n\n\t\t\trenderTarget.dispose();\n\t\t\tscope.material.dispose();\n\n\t\t};\n\n\t}\n\n}\n\nReflector.ReflectorShader = {\n\n\tname: 'ReflectorShader',\n\n\tuniforms: {\n\n\t\t'color': {\n\t\t\tvalue: null\n\t\t},\n\n\t\t'tDiffuse': {\n\t\t\tvalue: null\n\t\t},\n\n\t\t'textureMatrix': {\n\t\t\tvalue: null\n\t\t}\n\n\t},\n\n\tvertexShader: /* glsl */`\n\t\tuniform mat4 textureMatrix;\n\t\tvarying vec4 vUv;\n\n\t\t#include <common>\n\t\t#include <logdepthbuf_pars_vertex>\n\n\t\tvoid main() {\n\n\t\t\tvUv = textureMatrix * vec4( position, 1.0 );\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t\t#include <logdepthbuf_vertex>\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\t\tuniform vec3 color;\n\t\tuniform sampler2D tDiffuse;\n\t\tvarying vec4 vUv;\n\n\t\t#include <logdepthbuf_pars_fragment>\n\n\t\tfloat blendOverlay( float base, float blend ) {\n\n\t\t\treturn( base < 0.5 ? ( 2.0 * base * blend ) : ( 1.0 - 2.0 * ( 1.0 - base ) * ( 1.0 - blend ) ) );\n\n\t\t}\n\n\t\tvec3 blendOverlay( vec3 base, vec3 blend ) {\n\n\t\t\treturn vec3( blendOverlay( base.r, blend.r ), blendOverlay( base.g, blend.g ), blendOverlay( base.b, blend.b ) );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\t#include <logdepthbuf_fragment>\n\n\t\t\tvec4 base = texture2DProj( tDiffuse, vUv );\n\t\t\tgl_FragColor = vec4( blendOverlay( base.rgb, color ), 1.0 );\n\n\t\t\t#include <tonemapping_fragment>\n\t\t\t#include <colorspace_fragment>\n\n\t\t}`\n};\n\n/**\n * Constructor options of `Reflector`.\n *\n * @typedef {Object} Reflector~Options\n * @property {number|Color|string} [color=0x7F7F7F] - The reflector's color.\n * @property {number} [textureWidth=512] - The texture width. A higher value results in more clear reflections but is also more expensive.\n * @property {number} [textureHeight=512] - The texture height. A higher value results in more clear reflections but is also more expensive.\n * @property {number} [clipBias=0] - The clip bias.\n * @property {Object} [shader] - Can be used to pass in a custom shader that defines how the reflective view is projected onto the reflector's geometry.\n * @property {number} [multisample=4] - How many samples to use for MSAA. `0` disables MSAA.\n **/\n\nexport { Reflector };\n", "import {\n\tColor,\n\tMatrix4,\n\tMesh,\n\tPerspectiveCamera,\n\tShaderMaterial,\n\tUniformsUtils,\n\tVector2,\n\tVector3,\n\tWebGLRenderTarget,\n\tDepthTexture,\n\tUnsignedShortType,\n\tNearestFilter,\n\tPlane,\n\tHalfFloatType\n} from 'three';\n\n/**\n * A special version of {@link Reflector} for usage with {@link SSRPass}.\n *\n * @augments Mesh\n * @three_import import { ReflectorForSSRPass } from 'three/addons/objects/ReflectorForSSRPass.js';\n */\nclass ReflectorForSSRPass extends Mesh {\n\n\t/**\n\t * Constructs a new reflector.\n\t *\n\t * @param {BufferGeometry} geometry - The reflector's geometry.\n\t * @param {ReflectorForSSRPass~Options} [options] - The configuration options.\n\t */\n\tconstructor( geometry, options = {} ) {\n\n\t\tsuper( geometry );\n\n\t\tthis.isReflectorForSSRPass = true;\n\n\t\tthis.type = 'ReflectorForSSRPass';\n\n\t\tconst scope = this;\n\n\t\tconst color = ( options.color !== undefined ) ? new Color( options.color ) : new Color( 0x7F7F7F );\n\t\tconst textureWidth = options.textureWidth || 512;\n\t\tconst textureHeight = options.textureHeight || 512;\n\t\tconst clipBias = options.clipBias || 0;\n\t\tconst shader = options.shader || ReflectorForSSRPass.ReflectorShader;\n\t\tconst useDepthTexture = options.useDepthTexture === true;\n\t\tconst yAxis = new Vector3( 0, 1, 0 );\n\t\tconst vecTemp0 = new Vector3();\n\t\tconst vecTemp1 = new Vector3();\n\n\t\t//\n\n\t\tscope.needsUpdate = false;\n\t\tscope.maxDistance = ReflectorForSSRPass.ReflectorShader.uniforms.maxDistance.value;\n\t\tscope.opacity = ReflectorForSSRPass.ReflectorShader.uniforms.opacity.value;\n\t\tscope.color = color;\n\t\tscope.resolution = options.resolution || new Vector2( window.innerWidth, window.innerHeight );\n\n\n\t\tscope._distanceAttenuation = ReflectorForSSRPass.ReflectorShader.defines.DISTANCE_ATTENUATION;\n\t\tObject.defineProperty( scope, 'distanceAttenuation', {\n\t\t\tget() {\n\n\t\t\t\treturn scope._distanceAttenuation;\n\n\t\t\t},\n\t\t\tset( val ) {\n\n\t\t\t\tif ( scope._distanceAttenuation === val ) return;\n\t\t\t\tscope._distanceAttenuation = val;\n\t\t\t\tscope.material.defines.DISTANCE_ATTENUATION = val;\n\t\t\t\tscope.material.needsUpdate = true;\n\n\t\t\t}\n\t\t} );\n\n\t\tscope._fresnel = ReflectorForSSRPass.ReflectorShader.defines.FRESNEL;\n\t\tObject.defineProperty( scope, 'fresnel', {\n\t\t\tget() {\n\n\t\t\t\treturn scope._fresnel;\n\n\t\t\t},\n\t\t\tset( val ) {\n\n\t\t\t\tif ( scope._fresnel === val ) return;\n\t\t\t\tscope._fresnel = val;\n\t\t\t\tscope.material.defines.FRESNEL = val;\n\t\t\t\tscope.material.needsUpdate = true;\n\n\t\t\t}\n\t\t} );\n\n\t\tconst normal = new Vector3();\n\t\tconst reflectorWorldPosition = new Vector3();\n\t\tconst cameraWorldPosition = new Vector3();\n\t\tconst rotationMatrix = new Matrix4();\n\t\tconst lookAtPosition = new Vector3( 0, 0, - 1 );\n\n\t\tconst view = new Vector3();\n\t\tconst target = new Vector3();\n\n\t\tconst textureMatrix = new Matrix4();\n\t\tconst virtualCamera = new PerspectiveCamera();\n\n\t\tlet depthTexture;\n\n\t\tif ( useDepthTexture ) {\n\n\t\t\tdepthTexture = new DepthTexture();\n\t\t\tdepthTexture.type = UnsignedShortType;\n\t\t\tdepthTexture.minFilter = NearestFilter;\n\t\t\tdepthTexture.magFilter = NearestFilter;\n\n\t\t}\n\n\t\tconst parameters = {\n\t\t\tdepthTexture: useDepthTexture ? depthTexture : null,\n\t\t\ttype: HalfFloatType\n\t\t};\n\n\t\tconst renderTarget = new WebGLRenderTarget( textureWidth, textureHeight, parameters );\n\n\t\tconst material = new ShaderMaterial( {\n\t\t\tname: ( shader.name !== undefined ) ? shader.name : 'unspecified',\n\t\t\ttransparent: useDepthTexture,\n\t\t\tdefines: Object.assign( {}, ReflectorForSSRPass.ReflectorShader.defines, {\n\t\t\t\tuseDepthTexture\n\t\t\t} ),\n\t\t\tuniforms: UniformsUtils.clone( shader.uniforms ),\n\t\t\tfragmentShader: shader.fragmentShader,\n\t\t\tvertexShader: shader.vertexShader\n\t\t} );\n\n\t\tmaterial.uniforms[ 'tDiffuse' ].value = renderTarget.texture;\n\t\tmaterial.uniforms[ 'color' ].value = scope.color;\n\t\tmaterial.uniforms[ 'textureMatrix' ].value = textureMatrix;\n\t\tif ( useDepthTexture ) {\n\n\t\t\tmaterial.uniforms[ 'tDepth' ].value = renderTarget.depthTexture;\n\n\t\t}\n\n\t\tthis.material = material;\n\n\t\tconst globalPlane = new Plane( new Vector3( 0, 1, 0 ), clipBias );\n\t\tconst globalPlanes = [ globalPlane ];\n\n\t\tthis.doRender = function ( renderer, scene, camera ) {\n\n\t\t\tmaterial.uniforms[ 'maxDistance' ].value = scope.maxDistance;\n\t\t\tmaterial.uniforms[ 'color' ].value = scope.color;\n\t\t\tmaterial.uniforms[ 'opacity' ].value = scope.opacity;\n\n\t\t\tvecTemp0.copy( camera.position ).normalize();\n\t\t\tvecTemp1.copy( vecTemp0 ).reflect( yAxis );\n\t\t\tmaterial.uniforms[ 'fresnelCoe' ].value = ( vecTemp0.dot( vecTemp1 ) + 1. ) / 2.; // TODO: Also need to use glsl viewPosition and viewNormal per pixel.\n\n\t\t\treflectorWorldPosition.setFromMatrixPosition( scope.matrixWorld );\n\t\t\tcameraWorldPosition.setFromMatrixPosition( camera.matrixWorld );\n\n\t\t\trotationMatrix.extractRotation( scope.matrixWorld );\n\n\t\t\tnormal.set( 0, 0, 1 );\n\t\t\tnormal.applyMatrix4( rotationMatrix );\n\n\t\t\tview.subVectors( reflectorWorldPosition, cameraWorldPosition );\n\n\t\t\t// Avoid rendering when reflector is facing away\n\n\t\t\tif ( view.dot( normal ) > 0 ) return;\n\n\t\t\tview.reflect( normal ).negate();\n\t\t\tview.add( reflectorWorldPosition );\n\n\t\t\trotationMatrix.extractRotation( camera.matrixWorld );\n\n\t\t\tlookAtPosition.set( 0, 0, - 1 );\n\t\t\tlookAtPosition.applyMatrix4( rotationMatrix );\n\t\t\tlookAtPosition.add( cameraWorldPosition );\n\n\t\t\ttarget.subVectors( reflectorWorldPosition, lookAtPosition );\n\t\t\ttarget.reflect( normal ).negate();\n\t\t\ttarget.add( reflectorWorldPosition );\n\n\t\t\tvirtualCamera.position.copy( view );\n\t\t\tvirtualCamera.up.set( 0, 1, 0 );\n\t\t\tvirtualCamera.up.applyMatrix4( rotationMatrix );\n\t\t\tvirtualCamera.up.reflect( normal );\n\t\t\tvirtualCamera.lookAt( target );\n\n\t\t\tvirtualCamera.far = camera.far; // Used in WebGLBackground\n\n\t\t\tvirtualCamera.updateMatrixWorld();\n\t\t\tvirtualCamera.projectionMatrix.copy( camera.projectionMatrix );\n\n\t\t\tmaterial.uniforms[ 'virtualCameraNear' ].value = camera.near;\n\t\t\tmaterial.uniforms[ 'virtualCameraFar' ].value = camera.far;\n\t\t\tmaterial.uniforms[ 'virtualCameraMatrixWorld' ].value = virtualCamera.matrixWorld;\n\t\t\tmaterial.uniforms[ 'virtualCameraProjectionMatrix' ].value = camera.projectionMatrix;\n\t\t\tmaterial.uniforms[ 'virtualCameraProjectionMatrixInverse' ].value = camera.projectionMatrixInverse;\n\t\t\tmaterial.uniforms[ 'resolution' ].value = scope.resolution;\n\n\t\t\t// Update the texture matrix\n\t\t\ttextureMatrix.set(\n\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t);\n\t\t\ttextureMatrix.multiply( virtualCamera.projectionMatrix );\n\t\t\ttextureMatrix.multiply( virtualCamera.matrixWorldInverse );\n\t\t\ttextureMatrix.multiply( scope.matrixWorld );\n\n\t\t\t// scope.visible = false;\n\n\t\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\t\tconst currentXrEnabled = renderer.xr.enabled;\n\t\t\tconst currentShadowAutoUpdate = renderer.shadowMap.autoUpdate;\n\t\t\tconst currentClippingPlanes = renderer.clippingPlanes;\n\n\t\t\trenderer.xr.enabled = false; // Avoid camera modification\n\t\t\trenderer.shadowMap.autoUpdate = false; // Avoid re-computing shadows\n\t\t\trenderer.clippingPlanes = globalPlanes;\n\n\t\t\trenderer.setRenderTarget( renderTarget );\n\n\t\t\trenderer.state.buffers.depth.setMask( true ); // make sure the depth buffer is writable so it can be properly cleared, see #18897\n\n\t\t\tif ( renderer.autoClear === false ) renderer.clear();\n\t\t\trenderer.render( scene, virtualCamera );\n\n\t\t\trenderer.xr.enabled = currentXrEnabled;\n\t\t\trenderer.shadowMap.autoUpdate = currentShadowAutoUpdate;\n\t\t\trenderer.clippingPlanes = currentClippingPlanes;\n\n\t\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t\t\t// Restore viewport\n\n\t\t\tconst viewport = camera.viewport;\n\n\t\t\tif ( viewport !== undefined ) {\n\n\t\t\t\trenderer.state.viewport( viewport );\n\n\t\t\t}\n\n\t\t\t// scope.visible = true;\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the reflector's internal render target.\n\t\t *\n\t\t * @return {WebGLRenderTarget} The internal render target\n\t\t */\n\t\tthis.getRenderTarget = function () {\n\n\t\t\treturn renderTarget;\n\n\t\t};\n\n\t\t/**\n\t\t * Frees the GPU-related resources allocated by this instance. Call this\n\t\t * method whenever this instance is no longer used in your app.\n\t\t */\n\t\tthis.dispose = function () {\n\n\t\t\trenderTarget.dispose();\n\t\t\tscope.material.dispose();\n\n\t\t};\n\n\t}\n\n}\n\nReflectorForSSRPass.ReflectorShader = {\n\n\tname: 'ReflectorShader',\n\n\tdefines: {\n\t\tDISTANCE_ATTENUATION: true,\n\t\tFRESNEL: true,\n\t},\n\n\tuniforms: {\n\n\t\tcolor: { value: null },\n\t\ttDiffuse: { value: null },\n\t\ttDepth: { value: null },\n\t\ttextureMatrix: { value: new Matrix4() },\n\t\tmaxDistance: { value: 180 },\n\t\topacity: { value: 0.5 },\n\t\tfresnelCoe: { value: null },\n\t\tvirtualCameraNear: { value: null },\n\t\tvirtualCameraFar: { value: null },\n\t\tvirtualCameraProjectionMatrix: { value: new Matrix4() },\n\t\tvirtualCameraMatrixWorld: { value: new Matrix4() },\n\t\tvirtualCameraProjectionMatrixInverse: { value: new Matrix4() },\n\t\tresolution: { value: new Vector2() },\n\n\t},\n\n\tvertexShader: /* glsl */`\n\t\tuniform mat4 textureMatrix;\n\t\tvarying vec4 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = textureMatrix * vec4( position, 1.0 );\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\t\tuniform vec3 color;\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform sampler2D tDepth;\n\t\tuniform float maxDistance;\n\t\tuniform float opacity;\n\t\tuniform float fresnelCoe;\n\t\tuniform float virtualCameraNear;\n\t\tuniform float virtualCameraFar;\n\t\tuniform mat4 virtualCameraProjectionMatrix;\n\t\tuniform mat4 virtualCameraProjectionMatrixInverse;\n\t\tuniform mat4 virtualCameraMatrixWorld;\n\t\tuniform vec2 resolution;\n\t\tvarying vec4 vUv;\n\t\t#include <packing>\n\t\tfloat blendOverlay( float base, float blend ) {\n\t\t\treturn( base < 0.5 ? ( 2.0 * base * blend ) : ( 1.0 - 2.0 * ( 1.0 - base ) * ( 1.0 - blend ) ) );\n\t\t}\n\t\tvec3 blendOverlay( vec3 base, vec3 blend ) {\n\t\t\treturn vec3( blendOverlay( base.r, blend.r ), blendOverlay( base.g, blend.g ), blendOverlay( base.b, blend.b ) );\n\t\t}\n\t\tfloat getDepth( const in vec2 uv ) {\n\t\t\treturn texture2D( tDepth, uv ).x;\n\t\t}\n\t\tfloat getViewZ( const in float depth ) {\n\t\t\treturn perspectiveDepthToViewZ( depth, virtualCameraNear, virtualCameraFar );\n\t\t}\n\t\tvec3 getViewPosition( const in vec2 uv, const in float depth/*clip space*/, const in float clipW ) {\n\t\t\tvec4 clipPosition = vec4( ( vec3( uv, depth ) - 0.5 ) * 2.0, 1.0 );//ndc\n\t\t\tclipPosition *= clipW; //clip\n\t\t\treturn ( virtualCameraProjectionMatrixInverse * clipPosition ).xyz;//view\n\t\t}\n\t\tvoid main() {\n\t\t\tvec4 base = texture2DProj( tDiffuse, vUv );\n\t\t\t#ifdef useDepthTexture\n\t\t\t\tvec2 uv=(gl_FragCoord.xy-.5)/resolution.xy;\n\t\t\t\tuv.x=1.-uv.x;\n\t\t\t\tfloat depth = texture2DProj( tDepth, vUv ).r;\n\t\t\t\tfloat viewZ = getViewZ( depth );\n\t\t\t\tfloat clipW = virtualCameraProjectionMatrix[2][3] * viewZ+virtualCameraProjectionMatrix[3][3];\n\t\t\t\tvec3 viewPosition=getViewPosition( uv, depth, clipW );\n\t\t\t\tvec3 worldPosition=(virtualCameraMatrixWorld*vec4(viewPosition,1)).xyz;\n\t\t\t\tif(worldPosition.y>maxDistance) discard;\n\t\t\t\tfloat op=opacity;\n\t\t\t\t#ifdef DISTANCE_ATTENUATION\n\t\t\t\t\tfloat ratio=1.-(worldPosition.y/maxDistance);\n\t\t\t\t\tfloat attenuation=ratio*ratio;\n\t\t\t\t\top=opacity*attenuation;\n\t\t\t\t#endif\n\t\t\t\t#ifdef FRESNEL\n\t\t\t\t\top*=fresnelCoe;\n\t\t\t\t#endif\n\t\t\t\tgl_FragColor = vec4( blendOverlay( base.rgb, color ), op );\n\t\t\t#else\n\t\t\t\tgl_FragColor = vec4( blendOverlay( base.rgb, color ), 1.0 );\n\t\t\t#endif\n\t\t}\n\t`,\n};\n\n/**\n * Constructor options of `ReflectorForSSRPass`.\n *\n * @typedef {Object} ReflectorForSSRPass~Options\n * @property {number|Color|string} [color=0x7F7F7F] - The reflector's color.\n * @property {number} [textureWidth=512] - The texture width. A higher value results in more clear reflections but is also more expensive.\n * @property {number} [textureHeight=512] - The texture height. A higher value results in more clear reflections but is also more expensive.\n * @property {number} [clipBias=0] - The clip bias.\n * @property {Object} [shader] - Can be used to pass in a custom shader that defines how the reflective view is projected onto the reflector's geometry.\n * @property {boolean} [useDepthTexture=true] - Whether to store depth values in a texture or not.\n * @property {Vector2} [resolution] - Resolution for the Reflector Pass.\n **/\n\nexport { ReflectorForSSRPass };\n", "import {\n\tColor,\n\tMatrix4,\n\tMesh,\n\tPerspectiveCamera,\n\tPlane,\n\tQuaternion,\n\tShaderMaterial,\n\tUniformsUtils,\n\tVector3,\n\tVector4,\n\tWebGLRenderTarget,\n\tHalfFloatType\n} from 'three';\n\n/**\n * Can be used to create a flat, refractive surface like for special\n * windows or water effects.\n *\n * Note that this class can only be used with {@link WebGLRenderer}.\n * When using {@link WebGPURenderer}, use {@link viewportSharedTexture}.\n *\n * ```js\n * const geometry = new THREE.PlaneGeometry( 100, 100 );\n *\n * const refractor = new Refractor( refractorGeometry, {\n * \tcolor: 0xcbcbcb,\n * \ttextureWidth: 1024,\n * \ttextureHeight: 1024\n * } );\n *\n * scene.add( refractor );\n * ```\n *\n * @augments Mesh\n * @three_import import { Refractor } from 'three/addons/objects/Refractor.js';\n */\nclass Refractor extends Mesh {\n\n\t/**\n\t * Constructs a new refractor.\n\t *\n\t * @param {BufferGeometry} geometry - The refractor's geometry.\n\t * @param {Refractor~Options} [options] - The configuration options.\n\t */\n\tconstructor( geometry, options = {} ) {\n\n\t\tsuper( geometry );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRefractor = true;\n\n\t\tthis.type = 'Refractor';\n\n\t\t/**\n\t\t * The reflector's virtual camera.\n\t\t *\n\t\t * @type {PerspectiveCamera}\n\t\t */\n\t\tthis.camera = new PerspectiveCamera();\n\n\t\tconst scope = this;\n\n\t\tconst color = ( options.color !== undefined ) ? new Color( options.color ) : new Color( 0x7F7F7F );\n\t\tconst textureWidth = options.textureWidth || 512;\n\t\tconst textureHeight = options.textureHeight || 512;\n\t\tconst clipBias = options.clipBias || 0;\n\t\tconst shader = options.shader || Refractor.RefractorShader;\n\t\tconst multisample = ( options.multisample !== undefined ) ? options.multisample : 4;\n\n\t\t//\n\n\t\tconst virtualCamera = this.camera;\n\t\tvirtualCamera.matrixAutoUpdate = false;\n\t\tvirtualCamera.userData.refractor = true;\n\n\t\t//\n\n\t\tconst refractorPlane = new Plane();\n\t\tconst textureMatrix = new Matrix4();\n\n\t\t// render target\n\n\t\tconst renderTarget = new WebGLRenderTarget( textureWidth, textureHeight, { samples: multisample, type: HalfFloatType } );\n\n\t\t// material\n\n\t\tthis.material = new ShaderMaterial( {\n\t\t\tname: ( shader.name !== undefined ) ? shader.name : 'unspecified',\n\t\t\tuniforms: UniformsUtils.clone( shader.uniforms ),\n\t\t\tvertexShader: shader.vertexShader,\n\t\t\tfragmentShader: shader.fragmentShader,\n\t\t\ttransparent: true // ensures, refractors are drawn from farthest to closest\n\t\t} );\n\n\t\tthis.material.uniforms[ 'color' ].value = color;\n\t\tthis.material.uniforms[ 'tDiffuse' ].value = renderTarget.texture;\n\t\tthis.material.uniforms[ 'textureMatrix' ].value = textureMatrix;\n\n\t\t// functions\n\n\t\tconst visible = ( function () {\n\n\t\t\tconst refractorWorldPosition = new Vector3();\n\t\t\tconst cameraWorldPosition = new Vector3();\n\t\t\tconst rotationMatrix = new Matrix4();\n\n\t\t\tconst view = new Vector3();\n\t\t\tconst normal = new Vector3();\n\n\t\t\treturn function visible( camera ) {\n\n\t\t\t\trefractorWorldPosition.setFromMatrixPosition( scope.matrixWorld );\n\t\t\t\tcameraWorldPosition.setFromMatrixPosition( camera.matrixWorld );\n\n\t\t\t\tview.subVectors( refractorWorldPosition, cameraWorldPosition );\n\n\t\t\t\trotationMatrix.extractRotation( scope.matrixWorld );\n\n\t\t\t\tnormal.set( 0, 0, 1 );\n\t\t\t\tnormal.applyMatrix4( rotationMatrix );\n\n\t\t\t\treturn view.dot( normal ) < 0;\n\n\t\t\t};\n\n\t\t} )();\n\n\t\tconst updateRefractorPlane = ( function () {\n\n\t\t\tconst normal = new Vector3();\n\t\t\tconst position = new Vector3();\n\t\t\tconst quaternion = new Quaternion();\n\t\t\tconst scale = new Vector3();\n\n\t\t\treturn function updateRefractorPlane() {\n\n\t\t\t\tscope.matrixWorld.decompose( position, quaternion, scale );\n\t\t\t\tnormal.set( 0, 0, 1 ).applyQuaternion( quaternion ).normalize();\n\n\t\t\t\t// flip the normal because we want to cull everything above the plane\n\n\t\t\t\tnormal.negate();\n\n\t\t\t\trefractorPlane.setFromNormalAndCoplanarPoint( normal, position );\n\n\t\t\t};\n\n\t\t} )();\n\n\t\tconst updateVirtualCamera = ( function () {\n\n\t\t\tconst clipPlane = new Plane();\n\t\t\tconst clipVector = new Vector4();\n\t\t\tconst q = new Vector4();\n\n\t\t\treturn function updateVirtualCamera( camera ) {\n\n\t\t\t\tvirtualCamera.matrixWorld.copy( camera.matrixWorld );\n\t\t\t\tvirtualCamera.matrixWorldInverse.copy( virtualCamera.matrixWorld ).invert();\n\t\t\t\tvirtualCamera.projectionMatrix.copy( camera.projectionMatrix );\n\t\t\t\tvirtualCamera.far = camera.far; // used in WebGLBackground\n\n\t\t\t\t// The following code creates an oblique view frustum for clipping.\n\t\t\t\t// see: Lengyel, Eric. \u201COblique View Frustum Depth Projection and Clipping\u201D.\n\t\t\t\t// Journal of Game Development, Vol. 1, No. 2 (2005), Charles River Media, pp. 5\u201316\n\n\t\t\t\tclipPlane.copy( refractorPlane );\n\t\t\t\tclipPlane.applyMatrix4( virtualCamera.matrixWorldInverse );\n\n\t\t\t\tclipVector.set( clipPlane.normal.x, clipPlane.normal.y, clipPlane.normal.z, clipPlane.constant );\n\n\t\t\t\t// calculate the clip-space corner point opposite the clipping plane and\n\t\t\t\t// transform it into camera space by multiplying it by the inverse of the projection matrix\n\n\t\t\t\tconst projectionMatrix = virtualCamera.projectionMatrix;\n\n\t\t\t\tq.x = ( Math.sign( clipVector.x ) + projectionMatrix.elements[ 8 ] ) / projectionMatrix.elements[ 0 ];\n\t\t\t\tq.y = ( Math.sign( clipVector.y ) + projectionMatrix.elements[ 9 ] ) / projectionMatrix.elements[ 5 ];\n\t\t\t\tq.z = - 1.0;\n\t\t\t\tq.w = ( 1.0 + projectionMatrix.elements[ 10 ] ) / projectionMatrix.elements[ 14 ];\n\n\t\t\t\t// calculate the scaled plane vector\n\n\t\t\t\tclipVector.multiplyScalar( 2.0 / clipVector.dot( q ) );\n\n\t\t\t\t// replacing the third row of the projection matrix\n\n\t\t\t\tprojectionMatrix.elements[ 2 ] = clipVector.x;\n\t\t\t\tprojectionMatrix.elements[ 6 ] = clipVector.y;\n\t\t\t\tprojectionMatrix.elements[ 10 ] = clipVector.z + 1.0 - clipBias;\n\t\t\t\tprojectionMatrix.elements[ 14 ] = clipVector.w;\n\n\t\t\t};\n\n\t\t} )();\n\n\t\t// This will update the texture matrix that is used for projective texture mapping in the shader.\n\t\t// see: http://developer.download.nvidia.com/assets/gamedev/docs/projective_texture_mapping.pdf\n\n\t\tfunction updateTextureMatrix( camera ) {\n\n\t\t\t// this matrix does range mapping to [ 0, 1 ]\n\n\t\t\ttextureMatrix.set(\n\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t);\n\n\t\t\t// we use \"Object Linear Texgen\", so we need to multiply the texture matrix T\n\t\t\t// (matrix above) with the projection and view matrix of the virtual camera\n\t\t\t// and the model matrix of the refractor\n\n\t\t\ttextureMatrix.multiply( camera.projectionMatrix );\n\t\t\ttextureMatrix.multiply( camera.matrixWorldInverse );\n\t\t\ttextureMatrix.multiply( scope.matrixWorld );\n\n\t\t}\n\n\t\t//\n\n\t\tfunction render( renderer, scene, camera ) {\n\n\t\t\tscope.visible = false;\n\n\t\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\t\tconst currentXrEnabled = renderer.xr.enabled;\n\t\t\tconst currentShadowAutoUpdate = renderer.shadowMap.autoUpdate;\n\n\t\t\trenderer.xr.enabled = false; // avoid camera modification\n\t\t\trenderer.shadowMap.autoUpdate = false; // avoid re-computing shadows\n\n\t\t\trenderer.setRenderTarget( renderTarget );\n\t\t\tif ( renderer.autoClear === false ) renderer.clear();\n\t\t\trenderer.render( scene, virtualCamera );\n\n\t\t\trenderer.xr.enabled = currentXrEnabled;\n\t\t\trenderer.shadowMap.autoUpdate = currentShadowAutoUpdate;\n\t\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t\t\t// restore viewport\n\n\t\t\tconst viewport = camera.viewport;\n\n\t\t\tif ( viewport !== undefined ) {\n\n\t\t\t\trenderer.state.viewport( viewport );\n\n\t\t\t}\n\n\t\t\tscope.visible = true;\n\n\t\t}\n\n\t\t//\n\n\t\tthis.onBeforeRender = function ( renderer, scene, camera ) {\n\n\t\t\t// ensure refractors are rendered only once per frame\n\n\t\t\tif ( camera.userData.refractor === true ) return;\n\n\t\t\t// avoid rendering when the refractor is viewed from behind\n\n\t\t\tif ( ! visible( camera ) === true ) return;\n\n\t\t\t// update\n\n\t\t\tupdateRefractorPlane();\n\n\t\t\tupdateTextureMatrix( camera );\n\n\t\t\tupdateVirtualCamera( camera );\n\n\t\t\trender( renderer, scene, camera );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns the reflector's internal render target.\n\t\t *\n\t\t * @return {WebGLRenderTarget} The internal render target\n\t\t */\n\t\tthis.getRenderTarget = function () {\n\n\t\t\treturn renderTarget;\n\n\t\t};\n\n\t\t/**\n\t\t * Frees the GPU-related resources allocated by this instance. Call this\n\t\t * method whenever this instance is no longer used in your app.\n\t\t */\n\t\tthis.dispose = function () {\n\n\t\t\trenderTarget.dispose();\n\t\t\tscope.material.dispose();\n\n\t\t};\n\n\t}\n\n}\n\nRefractor.RefractorShader = {\n\n\tname: 'RefractorShader',\n\n\tuniforms: {\n\n\t\t'color': {\n\t\t\tvalue: null\n\t\t},\n\n\t\t'tDiffuse': {\n\t\t\tvalue: null\n\t\t},\n\n\t\t'textureMatrix': {\n\t\t\tvalue: null\n\t\t}\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tuniform mat4 textureMatrix;\n\n\t\tvarying vec4 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = textureMatrix * vec4( position, 1.0 );\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform vec3 color;\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec4 vUv;\n\n\t\tfloat blendOverlay( float base, float blend ) {\n\n\t\t\treturn( base < 0.5 ? ( 2.0 * base * blend ) : ( 1.0 - 2.0 * ( 1.0 - base ) * ( 1.0 - blend ) ) );\n\n\t\t}\n\n\t\tvec3 blendOverlay( vec3 base, vec3 blend ) {\n\n\t\t\treturn vec3( blendOverlay( base.r, blend.r ), blendOverlay( base.g, blend.g ), blendOverlay( base.b, blend.b ) );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvec4 base = texture2DProj( tDiffuse, vUv );\n\t\t\tgl_FragColor = vec4( blendOverlay( base.rgb, color ), 1.0 );\n\n\t\t\t#include <tonemapping_fragment>\n\t\t\t#include <colorspace_fragment>\n\n\t\t}`\n\n};\n\n/**\n * Constructor options of `Refractor`.\n *\n * @typedef {Object} Refractor~Options\n * @property {number|Color|string} [color=0x7F7F7F] - The refractor's color.\n * @property {number} [textureWidth=512] - The texture width. A higher value results in more clear refractions but is also more expensive.\n * @property {number} [textureHeight=512] - The texture height. A higher value results in more clear refractions but is also more expensive.\n * @property {number} [clipBias=0] - The clip bias.\n * @property {Object} [shader] - Can be used to pass in a custom shader that defines how the refractive view is projected onto the reflector's geometry.\n * @property {number} [multisample=4] - How many samples to use for MSAA. `0` disables MSAA.\n **/\n\nexport { Refractor };\n", "import {\n\tMatrix4,\n\tMesh,\n\tMeshBasicMaterial,\n\tEqualStencilFunc,\n\tIncrementStencilOp\n} from 'three';\n\nconst _shadowMatrix = new Matrix4();\n\n/**\n * A Shadow Mesh that follows a shadow-casting mesh in the scene,\n * but is confined to a single plane. This technique can be used as\n * a very performant alternative to classic shadow mapping. However,\n * it has serious limitations like:\n *\n * - Shadows can only be casted on flat planes.\n * - No soft shadows support.\n *\n * ```js\n * const cubeShadow = new ShadowMesh( cube );\n * scene.add( cubeShadow );\n * ```\n *\n * @augments Mesh\n * @three_import import { ShadowMesh } from 'three/addons/objects/ShadowMesh.js';\n */\nclass ShadowMesh extends Mesh {\n\n\t/**\n\t * Constructs a new shadow mesh.\n\t *\n\t * @param {Mesh} mesh - The shadow-casting reference mesh.\n\t */\n\tconstructor( mesh ) {\n\n\t\tconst shadowMaterial = new MeshBasicMaterial( {\n\n\t\t\tcolor: 0x000000,\n\t\t\ttransparent: true,\n\t\t\topacity: 0.6,\n\t\t\tdepthWrite: false,\n\t\t\tstencilWrite: true,\n\t\t\tstencilFunc: EqualStencilFunc,\n\t\t\tstencilRef: 0,\n\t\t\tstencilZPass: IncrementStencilOp\n\n\t\t} );\n\n\t\tsuper( mesh.geometry, shadowMaterial );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isShadowMesh = true;\n\n\t\t/**\n\t\t * Represent the world matrix of the reference mesh.\n\t\t *\n\t\t * @type {Matrix4}\n\t\t */\n\t\tthis.meshMatrix = mesh.matrixWorld;\n\n\t\t/**\n\t\t * Overwritten to disable view-frustum culling by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.frustumCulled = false;\n\n\t\t/**\n\t\t * Overwritten to disable automatic matrix update. The local\n\t\t * matrix is computed manually in {@link ShadowMesh#update}.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.matrixAutoUpdate = false;\n\n\t}\n\n\t/**\n\t * Updates the shadow mesh so it follows its shadow-casting reference mesh.\n\t *\n\t * @param {Plane} plane - The plane onto the shadow mesh is projected.\n\t * @param {Vector4} lightPosition4D - The light position.\n\t */\n\tupdate( plane, lightPosition4D ) {\n\n\t\t// based on https://www.opengl.org/archives/resources/features/StencilTalk/tsld021.htm\n\n\t\tconst dot = plane.normal.x * lightPosition4D.x +\n\t\t\t  plane.normal.y * lightPosition4D.y +\n\t\t\t  plane.normal.z * lightPosition4D.z +\n\t\t\t  - plane.constant * lightPosition4D.w;\n\n\t\tconst sme = _shadowMatrix.elements;\n\n\t\tsme[ 0 ] = dot - lightPosition4D.x * plane.normal.x;\n\t\tsme[ 4 ] = - lightPosition4D.x * plane.normal.y;\n\t\tsme[ 8 ] = - lightPosition4D.x * plane.normal.z;\n\t\tsme[ 12 ] = - lightPosition4D.x * - plane.constant;\n\n\t\tsme[ 1 ] = - lightPosition4D.y * plane.normal.x;\n\t\tsme[ 5 ] = dot - lightPosition4D.y * plane.normal.y;\n\t\tsme[ 9 ] = - lightPosition4D.y * plane.normal.z;\n\t\tsme[ 13 ] = - lightPosition4D.y * - plane.constant;\n\n\t\tsme[ 2 ] = - lightPosition4D.z * plane.normal.x;\n\t\tsme[ 6 ] = - lightPosition4D.z * plane.normal.y;\n\t\tsme[ 10 ] = dot - lightPosition4D.z * plane.normal.z;\n\t\tsme[ 14 ] = - lightPosition4D.z * - plane.constant;\n\n\t\tsme[ 3 ] = - lightPosition4D.w * plane.normal.x;\n\t\tsme[ 7 ] = - lightPosition4D.w * plane.normal.y;\n\t\tsme[ 11 ] = - lightPosition4D.w * plane.normal.z;\n\t\tsme[ 15 ] = dot - lightPosition4D.w * - plane.constant;\n\n\t\tthis.matrix.multiplyMatrices( _shadowMatrix, this.meshMatrix );\n\n\t}\n\n}\n\nexport { ShadowMesh };\n", "import {\n\tBackSide,\n\tBoxGeometry,\n\tMesh,\n\tShaderMaterial,\n\tUniformsUtils,\n\tVector3\n} from 'three';\n\n/**\n * Represents a skydome for scene backgrounds. Based on [A Practical Analytic Model for Daylight](https://www.researchgate.net/publication/220720443_A_Practical_Analytic_Model_for_Daylight)\n * aka The Preetham Model, the de facto standard for analytical skydomes.\n *\n * Note that this class can only be used with {@link WebGLRenderer}.\n * When using {@link WebGPURenderer}, use {@link SkyMesh}.\n *\n * More references:\n *\n * - {@link http://simonwallner.at/project/atmospheric-scattering/}\n * - {@link http://blenderartists.org/forum/showthread.php?245954-preethams-sky-impementation-HDR}\n *\n *\n * ```js\n * const sky = new Sky();\n * sky.scale.setScalar( 10000 );\n * scene.add( sky );\n * ```\n *\n * @augments Mesh\n * @three_import import { Sky } from 'three/addons/objects/Sky.js';\n */\nclass Sky extends Mesh {\n\n\t/**\n\t * Constructs a new skydome.\n\t */\n\tconstructor() {\n\n\t\tconst shader = Sky.SkyShader;\n\n\t\tconst material = new ShaderMaterial( {\n\t\t\tname: shader.name,\n\t\t\tuniforms: UniformsUtils.clone( shader.uniforms ),\n\t\t\tvertexShader: shader.vertexShader,\n\t\t\tfragmentShader: shader.fragmentShader,\n\t\t\tside: BackSide,\n\t\t\tdepthWrite: false\n\t\t} );\n\n\t\tsuper( new BoxGeometry( 1, 1, 1 ), material );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSky = true;\n\n\t}\n\n}\n\nSky.SkyShader = {\n\n\tname: 'SkyShader',\n\n\tuniforms: {\n\t\t'turbidity': { value: 2 },\n\t\t'rayleigh': { value: 1 },\n\t\t'mieCoefficient': { value: 0.005 },\n\t\t'mieDirectionalG': { value: 0.8 },\n\t\t'sunPosition': { value: new Vector3() },\n\t\t'up': { value: new Vector3( 0, 1, 0 ) }\n\t},\n\n\tvertexShader: /* glsl */`\n\t\tuniform vec3 sunPosition;\n\t\tuniform float rayleigh;\n\t\tuniform float turbidity;\n\t\tuniform float mieCoefficient;\n\t\tuniform vec3 up;\n\n\t\tvarying vec3 vWorldPosition;\n\t\tvarying vec3 vSunDirection;\n\t\tvarying float vSunfade;\n\t\tvarying vec3 vBetaR;\n\t\tvarying vec3 vBetaM;\n\t\tvarying float vSunE;\n\n\t\t// constants for atmospheric scattering\n\t\tconst float e = 2.71828182845904523536028747135266249775724709369995957;\n\t\tconst float pi = 3.141592653589793238462643383279502884197169;\n\n\t\t// wavelength of used primaries, according to preetham\n\t\tconst vec3 lambda = vec3( 680E-9, 550E-9, 450E-9 );\n\t\t// this pre-calculation replaces older TotalRayleigh(vec3 lambda) function:\n\t\t// (8.0 * pow(pi, 3.0) * pow(pow(n, 2.0) - 1.0, 2.0) * (6.0 + 3.0 * pn)) / (3.0 * N * pow(lambda, vec3(4.0)) * (6.0 - 7.0 * pn))\n\t\tconst vec3 totalRayleigh = vec3( 5.804542996261093E-6, 1.3562911419845635E-5, 3.0265902468824876E-5 );\n\n\t\t// mie stuff\n\t\t// K coefficient for the primaries\n\t\tconst float v = 4.0;\n\t\tconst vec3 K = vec3( 0.686, 0.678, 0.666 );\n\t\t// MieConst = pi * pow( ( 2.0 * pi ) / lambda, vec3( v - 2.0 ) ) * K\n\t\tconst vec3 MieConst = vec3( 1.8399918514433978E14, 2.7798023919660528E14, 4.0790479543861094E14 );\n\n\t\t// earth shadow hack\n\t\t// cutoffAngle = pi / 1.95;\n\t\tconst float cutoffAngle = 1.6110731556870734;\n\t\tconst float steepness = 1.5;\n\t\tconst float EE = 1000.0;\n\n\t\tfloat sunIntensity( float zenithAngleCos ) {\n\t\t\tzenithAngleCos = clamp( zenithAngleCos, -1.0, 1.0 );\n\t\t\treturn EE * max( 0.0, 1.0 - pow( e, -( ( cutoffAngle - acos( zenithAngleCos ) ) / steepness ) ) );\n\t\t}\n\n\t\tvec3 totalMie( float T ) {\n\t\t\tfloat c = ( 0.2 * T ) * 10E-18;\n\t\t\treturn 0.434 * c * MieConst;\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvec4 worldPosition = modelMatrix * vec4( position, 1.0 );\n\t\t\tvWorldPosition = worldPosition.xyz;\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\tgl_Position.z = gl_Position.w; // set z to camera.far\n\n\t\t\tvSunDirection = normalize( sunPosition );\n\n\t\t\tvSunE = sunIntensity( dot( vSunDirection, up ) );\n\n\t\t\tvSunfade = 1.0 - clamp( 1.0 - exp( ( sunPosition.y / 450000.0 ) ), 0.0, 1.0 );\n\n\t\t\tfloat rayleighCoefficient = rayleigh - ( 1.0 * ( 1.0 - vSunfade ) );\n\n\t\t\t// extinction (absorption + out scattering)\n\t\t\t// rayleigh coefficients\n\t\t\tvBetaR = totalRayleigh * rayleighCoefficient;\n\n\t\t\t// mie coefficients\n\t\t\tvBetaM = totalMie( turbidity ) * mieCoefficient;\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\t\tvarying vec3 vWorldPosition;\n\t\tvarying vec3 vSunDirection;\n\t\tvarying float vSunfade;\n\t\tvarying vec3 vBetaR;\n\t\tvarying vec3 vBetaM;\n\t\tvarying float vSunE;\n\n\t\tuniform float mieDirectionalG;\n\t\tuniform vec3 up;\n\n\t\t// constants for atmospheric scattering\n\t\tconst float pi = 3.141592653589793238462643383279502884197169;\n\n\t\tconst float n = 1.0003; // refractive index of air\n\t\tconst float N = 2.545E25; // number of molecules per unit volume for air at 288.15K and 1013mb (sea level -45 celsius)\n\n\t\t// optical length at zenith for molecules\n\t\tconst float rayleighZenithLength = 8.4E3;\n\t\tconst float mieZenithLength = 1.25E3;\n\t\t// 66 arc seconds -> degrees, and the cosine of that\n\t\tconst float sunAngularDiameterCos = 0.999956676946448443553574619906976478926848692873900859324;\n\n\t\t// 3.0 / ( 16.0 * pi )\n\t\tconst float THREE_OVER_SIXTEENPI = 0.05968310365946075;\n\t\t// 1.0 / ( 4.0 * pi )\n\t\tconst float ONE_OVER_FOURPI = 0.07957747154594767;\n\n\t\tfloat rayleighPhase( float cosTheta ) {\n\t\t\treturn THREE_OVER_SIXTEENPI * ( 1.0 + pow( cosTheta, 2.0 ) );\n\t\t}\n\n\t\tfloat hgPhase( float cosTheta, float g ) {\n\t\t\tfloat g2 = pow( g, 2.0 );\n\t\t\tfloat inverse = 1.0 / pow( 1.0 - 2.0 * g * cosTheta + g2, 1.5 );\n\t\t\treturn ONE_OVER_FOURPI * ( ( 1.0 - g2 ) * inverse );\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvec3 direction = normalize( vWorldPosition - cameraPosition );\n\n\t\t\t// optical length\n\t\t\t// cutoff angle at 90 to avoid singularity in next formula.\n\t\t\tfloat zenithAngle = acos( max( 0.0, dot( up, direction ) ) );\n\t\t\tfloat inverse = 1.0 / ( cos( zenithAngle ) + 0.15 * pow( 93.885 - ( ( zenithAngle * 180.0 ) / pi ), -1.253 ) );\n\t\t\tfloat sR = rayleighZenithLength * inverse;\n\t\t\tfloat sM = mieZenithLength * inverse;\n\n\t\t\t// combined extinction factor\n\t\t\tvec3 Fex = exp( -( vBetaR * sR + vBetaM * sM ) );\n\n\t\t\t// in scattering\n\t\t\tfloat cosTheta = dot( direction, vSunDirection );\n\n\t\t\tfloat rPhase = rayleighPhase( cosTheta * 0.5 + 0.5 );\n\t\t\tvec3 betaRTheta = vBetaR * rPhase;\n\n\t\t\tfloat mPhase = hgPhase( cosTheta, mieDirectionalG );\n\t\t\tvec3 betaMTheta = vBetaM * mPhase;\n\n\t\t\tvec3 Lin = pow( vSunE * ( ( betaRTheta + betaMTheta ) / ( vBetaR + vBetaM ) ) * ( 1.0 - Fex ), vec3( 1.5 ) );\n\t\t\tLin *= mix( vec3( 1.0 ), pow( vSunE * ( ( betaRTheta + betaMTheta ) / ( vBetaR + vBetaM ) ) * Fex, vec3( 1.0 / 2.0 ) ), clamp( pow( 1.0 - dot( up, vSunDirection ), 5.0 ), 0.0, 1.0 ) );\n\n\t\t\t// nightsky\n\t\t\tfloat theta = acos( direction.y ); // elevation --> y-axis, [-pi/2, pi/2]\n\t\t\tfloat phi = atan( direction.z, direction.x ); // azimuth --> x-axis [-pi/2, pi/2]\n\t\t\tvec2 uv = vec2( phi, theta ) / vec2( 2.0 * pi, pi ) + vec2( 0.5, 0.0 );\n\t\t\tvec3 L0 = vec3( 0.1 ) * Fex;\n\n\t\t\t// composition + solar disc\n\t\t\tfloat sundisk = smoothstep( sunAngularDiameterCos, sunAngularDiameterCos + 0.00002, cosTheta );\n\t\t\tL0 += ( vSunE * 19000.0 * Fex ) * sundisk;\n\n\t\t\tvec3 texColor = ( Lin + L0 ) * 0.04 + vec3( 0.0, 0.0003, 0.00075 );\n\n\t\t\tvec3 retColor = pow( texColor, vec3( 1.0 / ( 1.2 + ( 1.2 * vSunfade ) ) ) );\n\n\t\t\tgl_FragColor = vec4( retColor, 1.0 );\n\n\t\t\t#include <tonemapping_fragment>\n\t\t\t#include <colorspace_fragment>\n\n\t\t}`\n\n};\n\nexport { Sky };\n", "import {\n\tColor,\n\tFrontSide,\n\tMatrix4,\n\tMesh,\n\tPerspectiveCamera,\n\tPlane,\n\tShaderMaterial,\n\tUniformsLib,\n\tUniformsUtils,\n\tVector3,\n\tVector4,\n\tWebGLRenderTarget\n} from 'three';\n\n/**\n * A basic flat, reflective water effect.\n *\n * Note that this class can only be used with {@link WebGLRenderer}.\n * When using {@link WebGPURenderer}, use {@link WaterMesh}.\n *\n * References:\n *\n * - [Flat mirror for three.js](https://github.com/Slayvin)\n * - [An implementation of water shader based on the flat mirror](https://home.adelphi.edu/~stemkoski/)\n * - [Water shader explanations in WebGL](http://29a.ch/slides/2012/webglwater/ )\n *\n * @augments Mesh\n * @three_import import { Water } from 'three/addons/objects/Water.js';\n */\nclass Water extends Mesh {\n\n\t/**\n\t * Constructs a new water instance.\n\t *\n\t * @param {BufferGeometry} geometry - The water's geometry.\n\t * @param {Water~Options} [options] - The configuration options.\n\t */\n\tconstructor( geometry, options = {} ) {\n\n\t\tsuper( geometry );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWater = true;\n\n\t\tconst scope = this;\n\n\t\tconst textureWidth = options.textureWidth !== undefined ? options.textureWidth : 512;\n\t\tconst textureHeight = options.textureHeight !== undefined ? options.textureHeight : 512;\n\n\t\tconst clipBias = options.clipBias !== undefined ? options.clipBias : 0.0;\n\t\tconst alpha = options.alpha !== undefined ? options.alpha : 1.0;\n\t\tconst time = options.time !== undefined ? options.time : 0.0;\n\t\tconst normalSampler = options.waterNormals !== undefined ? options.waterNormals : null;\n\t\tconst sunDirection = options.sunDirection !== undefined ? options.sunDirection : new Vector3( 0.70707, 0.70707, 0.0 );\n\t\tconst sunColor = new Color( options.sunColor !== undefined ? options.sunColor : 0xffffff );\n\t\tconst waterColor = new Color( options.waterColor !== undefined ? options.waterColor : 0x7F7F7F );\n\t\tconst eye = options.eye !== undefined ? options.eye : new Vector3( 0, 0, 0 );\n\t\tconst distortionScale = options.distortionScale !== undefined ? options.distortionScale : 20.0;\n\t\tconst side = options.side !== undefined ? options.side : FrontSide;\n\t\tconst fog = options.fog !== undefined ? options.fog : false;\n\n\t\t//\n\n\t\tconst mirrorPlane = new Plane();\n\t\tconst normal = new Vector3();\n\t\tconst mirrorWorldPosition = new Vector3();\n\t\tconst cameraWorldPosition = new Vector3();\n\t\tconst rotationMatrix = new Matrix4();\n\t\tconst lookAtPosition = new Vector3( 0, 0, - 1 );\n\t\tconst clipPlane = new Vector4();\n\n\t\tconst view = new Vector3();\n\t\tconst target = new Vector3();\n\t\tconst q = new Vector4();\n\n\t\tconst textureMatrix = new Matrix4();\n\n\t\tconst mirrorCamera = new PerspectiveCamera();\n\n\t\tconst renderTarget = new WebGLRenderTarget( textureWidth, textureHeight );\n\n\t\tconst mirrorShader = {\n\n\t\t\tname: 'MirrorShader',\n\n\t\t\tuniforms: UniformsUtils.merge( [\n\t\t\t\tUniformsLib[ 'fog' ],\n\t\t\t\tUniformsLib[ 'lights' ],\n\t\t\t\t{\n\t\t\t\t\t'normalSampler': { value: null },\n\t\t\t\t\t'mirrorSampler': { value: null },\n\t\t\t\t\t'alpha': { value: 1.0 },\n\t\t\t\t\t'time': { value: 0.0 },\n\t\t\t\t\t'size': { value: 1.0 },\n\t\t\t\t\t'distortionScale': { value: 20.0 },\n\t\t\t\t\t'textureMatrix': { value: new Matrix4() },\n\t\t\t\t\t'sunColor': { value: new Color( 0x7F7F7F ) },\n\t\t\t\t\t'sunDirection': { value: new Vector3( 0.70707, 0.70707, 0 ) },\n\t\t\t\t\t'eye': { value: new Vector3() },\n\t\t\t\t\t'waterColor': { value: new Color( 0x555555 ) }\n\t\t\t\t}\n\t\t\t] ),\n\n\t\t\tvertexShader: /* glsl */`\n\t\t\t\tuniform mat4 textureMatrix;\n\t\t\t\tuniform float time;\n\n\t\t\t\tvarying vec4 mirrorCoord;\n\t\t\t\tvarying vec4 worldPosition;\n\n\t\t\t\t#include <common>\n\t\t\t\t#include <fog_pars_vertex>\n\t\t\t\t#include <shadowmap_pars_vertex>\n\t\t\t\t#include <logdepthbuf_pars_vertex>\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tmirrorCoord = modelMatrix * vec4( position, 1.0 );\n\t\t\t\t\tworldPosition = mirrorCoord.xyzw;\n\t\t\t\t\tmirrorCoord = textureMatrix * mirrorCoord;\n\t\t\t\t\tvec4 mvPosition =  modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t\tgl_Position = projectionMatrix * mvPosition;\n\n\t\t\t\t#include <beginnormal_vertex>\n\t\t\t\t#include <defaultnormal_vertex>\n\t\t\t\t#include <logdepthbuf_vertex>\n\t\t\t\t#include <fog_vertex>\n\t\t\t\t#include <shadowmap_vertex>\n\t\t\t}`,\n\n\t\t\tfragmentShader: /* glsl */`\n\t\t\t\tuniform sampler2D mirrorSampler;\n\t\t\t\tuniform float alpha;\n\t\t\t\tuniform float time;\n\t\t\t\tuniform float size;\n\t\t\t\tuniform float distortionScale;\n\t\t\t\tuniform sampler2D normalSampler;\n\t\t\t\tuniform vec3 sunColor;\n\t\t\t\tuniform vec3 sunDirection;\n\t\t\t\tuniform vec3 eye;\n\t\t\t\tuniform vec3 waterColor;\n\n\t\t\t\tvarying vec4 mirrorCoord;\n\t\t\t\tvarying vec4 worldPosition;\n\n\t\t\t\tvec4 getNoise( vec2 uv ) {\n\t\t\t\t\tvec2 uv0 = ( uv / 103.0 ) + vec2(time / 17.0, time / 29.0);\n\t\t\t\t\tvec2 uv1 = uv / 107.0-vec2( time / -19.0, time / 31.0 );\n\t\t\t\t\tvec2 uv2 = uv / vec2( 8907.0, 9803.0 ) + vec2( time / 101.0, time / 97.0 );\n\t\t\t\t\tvec2 uv3 = uv / vec2( 1091.0, 1027.0 ) - vec2( time / 109.0, time / -113.0 );\n\t\t\t\t\tvec4 noise = texture2D( normalSampler, uv0 ) +\n\t\t\t\t\t\ttexture2D( normalSampler, uv1 ) +\n\t\t\t\t\t\ttexture2D( normalSampler, uv2 ) +\n\t\t\t\t\t\ttexture2D( normalSampler, uv3 );\n\t\t\t\t\treturn noise * 0.5 - 1.0;\n\t\t\t\t}\n\n\t\t\t\tvoid sunLight( const vec3 surfaceNormal, const vec3 eyeDirection, float shiny, float spec, float diffuse, inout vec3 diffuseColor, inout vec3 specularColor ) {\n\t\t\t\t\tvec3 reflection = normalize( reflect( -sunDirection, surfaceNormal ) );\n\t\t\t\t\tfloat direction = max( 0.0, dot( eyeDirection, reflection ) );\n\t\t\t\t\tspecularColor += pow( direction, shiny ) * sunColor * spec;\n\t\t\t\t\tdiffuseColor += max( dot( sunDirection, surfaceNormal ), 0.0 ) * sunColor * diffuse;\n\t\t\t\t}\n\n\t\t\t\t#include <common>\n\t\t\t\t#include <packing>\n\t\t\t\t#include <bsdfs>\n\t\t\t\t#include <fog_pars_fragment>\n\t\t\t\t#include <logdepthbuf_pars_fragment>\n\t\t\t\t#include <lights_pars_begin>\n\t\t\t\t#include <shadowmap_pars_fragment>\n\t\t\t\t#include <shadowmask_pars_fragment>\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\t#include <logdepthbuf_fragment>\n\t\t\t\t\tvec4 noise = getNoise( worldPosition.xz * size );\n\t\t\t\t\tvec3 surfaceNormal = normalize( noise.xzy * vec3( 1.5, 1.0, 1.5 ) );\n\n\t\t\t\t\tvec3 diffuseLight = vec3(0.0);\n\t\t\t\t\tvec3 specularLight = vec3(0.0);\n\n\t\t\t\t\tvec3 worldToEye = eye-worldPosition.xyz;\n\t\t\t\t\tvec3 eyeDirection = normalize( worldToEye );\n\t\t\t\t\tsunLight( surfaceNormal, eyeDirection, 100.0, 2.0, 0.5, diffuseLight, specularLight );\n\n\t\t\t\t\tfloat distance = length(worldToEye);\n\n\t\t\t\t\tvec2 distortion = surfaceNormal.xz * ( 0.001 + 1.0 / distance ) * distortionScale;\n\t\t\t\t\tvec3 reflectionSample = vec3( texture2D( mirrorSampler, mirrorCoord.xy / mirrorCoord.w + distortion ) );\n\n\t\t\t\t\tfloat theta = max( dot( eyeDirection, surfaceNormal ), 0.0 );\n\t\t\t\t\tfloat rf0 = 0.3;\n\t\t\t\t\tfloat reflectance = rf0 + ( 1.0 - rf0 ) * pow( ( 1.0 - theta ), 5.0 );\n\t\t\t\t\tvec3 scatter = max( 0.0, dot( surfaceNormal, eyeDirection ) ) * waterColor;\n\t\t\t\t\tvec3 albedo = mix( ( sunColor * diffuseLight * 0.3 + scatter ) * getShadowMask(), ( vec3( 0.1 ) + reflectionSample * 0.9 + reflectionSample * specularLight ), reflectance);\n\t\t\t\t\tvec3 outgoingLight = albedo;\n\t\t\t\t\tgl_FragColor = vec4( outgoingLight, alpha );\n\n\t\t\t\t\t#include <tonemapping_fragment>\n\t\t\t\t\t#include <colorspace_fragment>\n\t\t\t\t\t#include <fog_fragment>\t\n\t\t\t\t}`\n\n\t\t};\n\n\t\tconst material = new ShaderMaterial( {\n\t\t\tname: mirrorShader.name,\n\t\t\tuniforms: UniformsUtils.clone( mirrorShader.uniforms ),\n\t\t\tvertexShader: mirrorShader.vertexShader,\n\t\t\tfragmentShader: mirrorShader.fragmentShader,\n\t\t\tlights: true,\n\t\t\tside: side,\n\t\t\tfog: fog\n\t\t} );\n\n\t\tmaterial.uniforms[ 'mirrorSampler' ].value = renderTarget.texture;\n\t\tmaterial.uniforms[ 'textureMatrix' ].value = textureMatrix;\n\t\tmaterial.uniforms[ 'alpha' ].value = alpha;\n\t\tmaterial.uniforms[ 'time' ].value = time;\n\t\tmaterial.uniforms[ 'normalSampler' ].value = normalSampler;\n\t\tmaterial.uniforms[ 'sunColor' ].value = sunColor;\n\t\tmaterial.uniforms[ 'waterColor' ].value = waterColor;\n\t\tmaterial.uniforms[ 'sunDirection' ].value = sunDirection;\n\t\tmaterial.uniforms[ 'distortionScale' ].value = distortionScale;\n\n\t\tmaterial.uniforms[ 'eye' ].value = eye;\n\n\t\tscope.material = material;\n\n\t\tscope.onBeforeRender = function ( renderer, scene, camera ) {\n\n\t\t\tmirrorWorldPosition.setFromMatrixPosition( scope.matrixWorld );\n\t\t\tcameraWorldPosition.setFromMatrixPosition( camera.matrixWorld );\n\n\t\t\trotationMatrix.extractRotation( scope.matrixWorld );\n\n\t\t\tnormal.set( 0, 0, 1 );\n\t\t\tnormal.applyMatrix4( rotationMatrix );\n\n\t\t\tview.subVectors( mirrorWorldPosition, cameraWorldPosition );\n\n\t\t\t// Avoid rendering when mirror is facing away\n\n\t\t\tif ( view.dot( normal ) > 0 ) return;\n\n\t\t\tview.reflect( normal ).negate();\n\t\t\tview.add( mirrorWorldPosition );\n\n\t\t\trotationMatrix.extractRotation( camera.matrixWorld );\n\n\t\t\tlookAtPosition.set( 0, 0, - 1 );\n\t\t\tlookAtPosition.applyMatrix4( rotationMatrix );\n\t\t\tlookAtPosition.add( cameraWorldPosition );\n\n\t\t\ttarget.subVectors( mirrorWorldPosition, lookAtPosition );\n\t\t\ttarget.reflect( normal ).negate();\n\t\t\ttarget.add( mirrorWorldPosition );\n\n\t\t\tmirrorCamera.position.copy( view );\n\t\t\tmirrorCamera.up.set( 0, 1, 0 );\n\t\t\tmirrorCamera.up.applyMatrix4( rotationMatrix );\n\t\t\tmirrorCamera.up.reflect( normal );\n\t\t\tmirrorCamera.lookAt( target );\n\n\t\t\tmirrorCamera.far = camera.far; // Used in WebGLBackground\n\n\t\t\tmirrorCamera.updateMatrixWorld();\n\t\t\tmirrorCamera.projectionMatrix.copy( camera.projectionMatrix );\n\n\t\t\t// Update the texture matrix\n\t\t\ttextureMatrix.set(\n\t\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t\t);\n\t\t\ttextureMatrix.multiply( mirrorCamera.projectionMatrix );\n\t\t\ttextureMatrix.multiply( mirrorCamera.matrixWorldInverse );\n\n\t\t\t// Now update projection matrix with new clip plane, implementing code from: http://www.terathon.com/code/oblique.html\n\t\t\t// Paper explaining this technique: http://www.terathon.com/lengyel/Lengyel-Oblique.pdf\n\t\t\tmirrorPlane.setFromNormalAndCoplanarPoint( normal, mirrorWorldPosition );\n\t\t\tmirrorPlane.applyMatrix4( mirrorCamera.matrixWorldInverse );\n\n\t\t\tclipPlane.set( mirrorPlane.normal.x, mirrorPlane.normal.y, mirrorPlane.normal.z, mirrorPlane.constant );\n\n\t\t\tconst projectionMatrix = mirrorCamera.projectionMatrix;\n\n\t\t\tq.x = ( Math.sign( clipPlane.x ) + projectionMatrix.elements[ 8 ] ) / projectionMatrix.elements[ 0 ];\n\t\t\tq.y = ( Math.sign( clipPlane.y ) + projectionMatrix.elements[ 9 ] ) / projectionMatrix.elements[ 5 ];\n\t\t\tq.z = - 1.0;\n\t\t\tq.w = ( 1.0 + projectionMatrix.elements[ 10 ] ) / projectionMatrix.elements[ 14 ];\n\n\t\t\t// Calculate the scaled plane vector\n\t\t\tclipPlane.multiplyScalar( 2.0 / clipPlane.dot( q ) );\n\n\t\t\t// Replacing the third row of the projection matrix\n\t\t\tprojectionMatrix.elements[ 2 ] = clipPlane.x;\n\t\t\tprojectionMatrix.elements[ 6 ] = clipPlane.y;\n\t\t\tprojectionMatrix.elements[ 10 ] = clipPlane.z + 1.0 - clipBias;\n\t\t\tprojectionMatrix.elements[ 14 ] = clipPlane.w;\n\n\t\t\teye.setFromMatrixPosition( camera.matrixWorld );\n\n\t\t\t// Render\n\n\t\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\t\tconst currentXrEnabled = renderer.xr.enabled;\n\t\t\tconst currentShadowAutoUpdate = renderer.shadowMap.autoUpdate;\n\n\t\t\tscope.visible = false;\n\n\t\t\trenderer.xr.enabled = false; // Avoid camera modification and recursion\n\t\t\trenderer.shadowMap.autoUpdate = false; // Avoid re-computing shadows\n\n\t\t\trenderer.setRenderTarget( renderTarget );\n\n\t\t\trenderer.state.buffers.depth.setMask( true ); // make sure the depth buffer is writable so it can be properly cleared, see #18897\n\n\t\t\tif ( renderer.autoClear === false ) renderer.clear();\n\t\t\trenderer.render( scene, mirrorCamera );\n\n\t\t\tscope.visible = true;\n\n\t\t\trenderer.xr.enabled = currentXrEnabled;\n\t\t\trenderer.shadowMap.autoUpdate = currentShadowAutoUpdate;\n\n\t\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t\t\t// Restore viewport\n\n\t\t\tconst viewport = camera.viewport;\n\n\t\t\tif ( viewport !== undefined ) {\n\n\t\t\t\trenderer.state.viewport( viewport );\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n}\n\n/**\n * Constructor options of `Water`.\n *\n * @typedef {Object} Water~Options\n * @property {number} [textureWidth=512] - The texture width. A higher value results in more clear reflections but is also more expensive.\n * @property {number} [textureHeight=512] - The texture height. A higher value results in more clear reflections but is also more expensive.\n * @property {number} [clipBias=0] - The clip bias.\n * @property {number} [alpha=1] - The alpha value.\n * @property {number} [time=0] - The time value.\n * @property {?Texture} [waterNormals=null] - The water's normal map.\n * @property {Vector3} [sunDirection=(0.70707,0.70707,0.0)] - The sun direction.\n * @property {number|Color|string} [sunColor=0xffffff] - The sun color.\n * @property {number|Color|string} [waterColor=0x7F7F7F] - The water color.\n * @property {Vector3} [eye] - The eye vector.\n * @property {number} [distortionScale=20] - The distortion scale.\n * @property {(FrontSide|BackSide|DoubleSide)} [side=FrontSide] - The water material's `side` property.\n * @property {boolean} [fog=false] - Whether the water should be affected by fog or not.\n **/\n\nexport { Water };\n", "/**\n * @classdesc Can be used to include Ammo.js as a Physics engine into\n * `three.js` apps. Make sure to include `ammo.wasm.js` first:\n * ```\n * <script src=\"jsm/libs/ammo.wasm.js\"></script>\n * ```\n * It is then possible to initialize the API via:\n * ```js\n * const physics = await AmmoPhysics();\n * ```\n *\n * @name AmmoPhysics\n * @class\n * @hideconstructor\n * @three_import import { AmmoPhysics } from 'three/addons/physics/AmmoPhysics.js';\n */\nasync function AmmoPhysics() {\n\n\tif ( 'Ammo' in window === false ) {\n\n\t\tconsole.error( 'AmmoPhysics: Couldn\\'t find Ammo.js' );\n\t\treturn;\n\n\t}\n\n\tconst AmmoLib = await Ammo();\n\n\tconst frameRate = 60;\n\n\tconst collisionConfiguration = new AmmoLib.btDefaultCollisionConfiguration();\n\tconst dispatcher = new AmmoLib.btCollisionDispatcher( collisionConfiguration );\n\tconst broadphase = new AmmoLib.btDbvtBroadphase();\n\tconst solver = new AmmoLib.btSequentialImpulseConstraintSolver();\n\tconst world = new AmmoLib.btDiscreteDynamicsWorld( dispatcher, broadphase, solver, collisionConfiguration );\n\tworld.setGravity( new AmmoLib.btVector3( 0, - 9.8, 0 ) );\n\n\tconst worldTransform = new AmmoLib.btTransform();\n\n\t//\n\n\tfunction getShape( geometry ) {\n\n\t\tconst parameters = geometry.parameters;\n\n\t\t// TODO change type to is*\n\n\t\tif ( geometry.type === 'BoxGeometry' ) {\n\n\t\t\tconst sx = parameters.width !== undefined ? parameters.width / 2 : 0.5;\n\t\t\tconst sy = parameters.height !== undefined ? parameters.height / 2 : 0.5;\n\t\t\tconst sz = parameters.depth !== undefined ? parameters.depth / 2 : 0.5;\n\n\t\t\tconst shape = new AmmoLib.btBoxShape( new AmmoLib.btVector3( sx, sy, sz ) );\n\t\t\tshape.setMargin( 0.05 );\n\n\t\t\treturn shape;\n\n\t\t} else if ( geometry.type === 'SphereGeometry' || geometry.type === 'IcosahedronGeometry' ) {\n\n\t\t\tconst radius = parameters.radius !== undefined ? parameters.radius : 1;\n\n\t\t\tconst shape = new AmmoLib.btSphereShape( radius );\n\t\t\tshape.setMargin( 0.05 );\n\n\t\t\treturn shape;\n\n\t\t}\n\n\t\tconsole.error( 'AmmoPhysics: Unsupported geometry type:', geometry.type );\n\n\t\treturn null;\n\n\t}\n\n\tconst meshes = [];\n\tconst meshMap = new WeakMap();\n\n\tfunction addScene( scene ) {\n\n\t\tscene.traverse( function ( child ) {\n\n\t\t\tif ( child.isMesh ) {\n\n\t\t\t\tconst physics = child.userData.physics;\n\n\t\t\t\tif ( physics ) {\n\n\t\t\t\t\taddMesh( child, physics.mass, physics.restitution );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tfunction addMesh( mesh, mass = 0, restitution = 0 ) {\n\n\t\tconst shape = getShape( mesh.geometry );\n\n\t\tif ( shape !== null ) {\n\n\t\t\tif ( mesh.isInstancedMesh ) {\n\n\t\t\t\thandleInstancedMesh( mesh, shape, mass, restitution );\n\n\t\t\t} else if ( mesh.isMesh ) {\n\n\t\t\t\thandleMesh( mesh, shape, mass, restitution );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tfunction handleMesh( mesh, shape, mass, restitution ) {\n\n\t\tconst position = mesh.position;\n\t\tconst quaternion = mesh.quaternion;\n\n\t\tconst transform = new AmmoLib.btTransform();\n\t\ttransform.setIdentity();\n\t\ttransform.setOrigin( new AmmoLib.btVector3( position.x, position.y, position.z ) );\n\t\ttransform.setRotation( new AmmoLib.btQuaternion( quaternion.x, quaternion.y, quaternion.z, quaternion.w ) );\n\n\t\tconst motionState = new AmmoLib.btDefaultMotionState( transform );\n\n\t\tconst localInertia = new AmmoLib.btVector3( 0, 0, 0 );\n\t\tshape.calculateLocalInertia( mass, localInertia );\n\n\t\tconst rbInfo = new AmmoLib.btRigidBodyConstructionInfo( mass, motionState, shape, localInertia );\n\t\trbInfo.set_m_restitution( restitution );\n\n\t\tconst body = new AmmoLib.btRigidBody( rbInfo );\n\t\t// body.setFriction( 4 );\n\t\tworld.addRigidBody( body );\n\n\t\tif ( mass > 0 ) {\n\n\t\t\tmeshes.push( mesh );\n\t\t\tmeshMap.set( mesh, body );\n\n\t\t}\n\n\n\t}\n\n\tfunction handleInstancedMesh( mesh, shape, mass, restitution ) {\n\n\t\tconst array = mesh.instanceMatrix.array;\n\n\t\tconst bodies = [];\n\n\t\tfor ( let i = 0; i < mesh.count; i ++ ) {\n\n\t\t\tconst index = i * 16;\n\n\t\t\tconst transform = new AmmoLib.btTransform();\n\t\t\ttransform.setFromOpenGLMatrix( array.slice( index, index + 16 ) );\n\n\t\t\tconst motionState = new AmmoLib.btDefaultMotionState( transform );\n\n\t\t\tconst localInertia = new AmmoLib.btVector3( 0, 0, 0 );\n\t\t\tshape.calculateLocalInertia( mass, localInertia );\n\n\t\t\tconst rbInfo = new AmmoLib.btRigidBodyConstructionInfo( mass, motionState, shape, localInertia );\n\t\t\trbInfo.set_m_restitution( restitution );\n\n\t\t\tconst body = new AmmoLib.btRigidBody( rbInfo );\n\t\t\tworld.addRigidBody( body );\n\n\t\t\tbodies.push( body );\n\n\t\t}\n\n\t\tif ( mass > 0 ) {\n\n\t\t\tmeshes.push( mesh );\n\n\t\t\tmeshMap.set( mesh, bodies );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tfunction setMeshPosition( mesh, position, index = 0 ) {\n\n\t\tif ( mesh.isInstancedMesh ) {\n\n\t\t\tconst bodies = meshMap.get( mesh );\n\t\t\tconst body = bodies[ index ];\n\n\t\t\tbody.setAngularVelocity( new AmmoLib.btVector3( 0, 0, 0 ) );\n\t\t\tbody.setLinearVelocity( new AmmoLib.btVector3( 0, 0, 0 ) );\n\n\t\t\tworldTransform.setIdentity();\n\t\t\tworldTransform.setOrigin( new AmmoLib.btVector3( position.x, position.y, position.z ) );\n\t\t\tbody.setWorldTransform( worldTransform );\n\n\t\t} else if ( mesh.isMesh ) {\n\n\t\t\tconst body = meshMap.get( mesh );\n\n\t\t\tbody.setAngularVelocity( new AmmoLib.btVector3( 0, 0, 0 ) );\n\t\t\tbody.setLinearVelocity( new AmmoLib.btVector3( 0, 0, 0 ) );\n\n\t\t\tworldTransform.setIdentity();\n\t\t\tworldTransform.setOrigin( new AmmoLib.btVector3( position.x, position.y, position.z ) );\n\t\t\tbody.setWorldTransform( worldTransform );\n\n\t\t}\n\n\t}\n\n\t//\n\n\tlet lastTime = 0;\n\n\tfunction step() {\n\n\t\tconst time = performance.now();\n\n\t\tif ( lastTime > 0 ) {\n\n\t\t\tconst delta = ( time - lastTime ) / 1000;\n\n\t\t\tworld.stepSimulation( delta, 10 );\n\n\t\t\t//\n\n\t\t\tfor ( let i = 0, l = meshes.length; i < l; i ++ ) {\n\n\t\t\t\tconst mesh = meshes[ i ];\n\n\t\t\t\tif ( mesh.isInstancedMesh ) {\n\n\t\t\t\t\tconst array = mesh.instanceMatrix.array;\n\t\t\t\t\tconst bodies = meshMap.get( mesh );\n\n\t\t\t\t\tfor ( let j = 0; j < bodies.length; j ++ ) {\n\n\t\t\t\t\t\tconst body = bodies[ j ];\n\n\t\t\t\t\t\tconst motionState = body.getMotionState();\n\t\t\t\t\t\tmotionState.getWorldTransform( worldTransform );\n\n\t\t\t\t\t\tconst position = worldTransform.getOrigin();\n\t\t\t\t\t\tconst quaternion = worldTransform.getRotation();\n\n\t\t\t\t\t\tcompose( position, quaternion, array, j * 16 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tmesh.instanceMatrix.needsUpdate = true;\n\t\t\t\t\tmesh.computeBoundingSphere();\n\n\t\t\t\t} else if ( mesh.isMesh ) {\n\n\t\t\t\t\tconst body = meshMap.get( mesh );\n\n\t\t\t\t\tconst motionState = body.getMotionState();\n\t\t\t\t\tmotionState.getWorldTransform( worldTransform );\n\n\t\t\t\t\tconst position = worldTransform.getOrigin();\n\t\t\t\t\tconst quaternion = worldTransform.getRotation();\n\t\t\t\t\tmesh.position.set( position.x(), position.y(), position.z() );\n\t\t\t\t\tmesh.quaternion.set( quaternion.x(), quaternion.y(), quaternion.z(), quaternion.w() );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tlastTime = time;\n\n\t}\n\n\t// animate\n\n\tsetInterval( step, 1000 / frameRate );\n\n\treturn {\n\t\t/**\n\t\t * Adds the given scene to this physics simulation. Only meshes with a\n\t\t * `physics` object in their {@link Object3D#userData} field will be honored.\n\t\t * The object can be used to store the mass of the mesh. E.g.:\n\t\t * ```js\n\t\t * box.userData.physics = { mass: 1 };\n\t\t * ```\n\t\t *\n\t\t * @method\n\t\t * @name AmmoPhysics#addScene\n\t\t * @param {Object3D} scene The scene or any type of 3D object to add.\n\t\t */\n\t\taddScene: addScene,\n\n\t\t/**\n\t\t * Adds the given mesh to this physics simulation.\n\t\t *\n\t\t * @method\n\t\t * @name AmmoPhysics#addMesh\n\t\t * @param {Mesh} mesh The mesh to add.\n\t\t * @param {number} [mass=0] The mass in kg of the mesh.\n\t\t * @param {number} [restitution=0] The restitution of the mesh, usually from 0 to 1. Represents how \"bouncy\" objects are when they collide with each other.\n\t\t */\n\t\taddMesh: addMesh,\n\n\t\t/**\n\t\t * Set the position of the given mesh which is part of the physics simulation. Calling this\n\t\t * method will reset the current simulated velocity of the mesh.\n\t\t *\n\t\t * @method\n\t\t * @name AmmoPhysics#setMeshPosition\n\t\t * @param {Mesh} mesh The mesh to update the position for.\n\t\t * @param {Vector3} position - The new position.\n\t\t * @param {number} [index=0] - If the mesh is instanced, the index represents the instanced ID.\n\t\t */\n\t\tsetMeshPosition: setMeshPosition\n\t\t// addCompoundMesh\n\t};\n\n}\n\nfunction compose( position, quaternion, array, index ) {\n\n\tconst x = quaternion.x(), y = quaternion.y(), z = quaternion.z(), w = quaternion.w();\n\tconst x2 = x + x, y2 = y + y, z2 = z + z;\n\tconst xx = x * x2, xy = x * y2, xz = x * z2;\n\tconst yy = y * y2, yz = y * z2, zz = z * z2;\n\tconst wx = w * x2, wy = w * y2, wz = w * z2;\n\n\tarray[ index + 0 ] = ( 1 - ( yy + zz ) );\n\tarray[ index + 1 ] = ( xy + wz );\n\tarray[ index + 2 ] = ( xz - wy );\n\tarray[ index + 3 ] = 0;\n\n\tarray[ index + 4 ] = ( xy - wz );\n\tarray[ index + 5 ] = ( 1 - ( xx + zz ) );\n\tarray[ index + 6 ] = ( yz + wx );\n\tarray[ index + 7 ] = 0;\n\n\tarray[ index + 8 ] = ( xz + wy );\n\tarray[ index + 9 ] = ( yz - wx );\n\tarray[ index + 10 ] = ( 1 - ( xx + yy ) );\n\tarray[ index + 11 ] = 0;\n\n\tarray[ index + 12 ] = position.x();\n\tarray[ index + 13 ] = position.y();\n\tarray[ index + 14 ] = position.z();\n\tarray[ index + 15 ] = 1;\n\n}\n\nexport { AmmoPhysics };\n", "import { Clock, Vector3, Quaternion, Matrix4 } from 'three';\n\nconst RAPIER_PATH = 'https://cdn.skypack.dev/@dimforge/rapier3d-compat@0.17.3';\n\nconst frameRate = 60;\n\nconst _scale = new Vector3( 1, 1, 1 );\nconst ZERO = new Vector3();\n\nlet RAPIER = null;\n\nfunction getShape( geometry ) {\n\n\tconst parameters = geometry.parameters;\n\n\t// TODO change type to is*\n\n\tif ( geometry.type === 'RoundedBoxGeometry' ) {\n\n\t\tconst sx = parameters.width !== undefined ? parameters.width / 2 : 0.5;\n\t\tconst sy = parameters.height !== undefined ? parameters.height / 2 : 0.5;\n\t\tconst sz = parameters.depth !== undefined ? parameters.depth / 2 : 0.5;\n\t\tconst radius = parameters.radius !== undefined ? parameters.radius : 0.1;\n\n\t\treturn RAPIER.ColliderDesc.roundCuboid( sx - radius, sy - radius, sz - radius, radius );\n\n\t} else if ( geometry.type === 'BoxGeometry' ) {\n\n\t\tconst sx = parameters.width !== undefined ? parameters.width / 2 : 0.5;\n\t\tconst sy = parameters.height !== undefined ? parameters.height / 2 : 0.5;\n\t\tconst sz = parameters.depth !== undefined ? parameters.depth / 2 : 0.5;\n\n\t\treturn RAPIER.ColliderDesc.cuboid( sx, sy, sz );\n\n\t} else if ( geometry.type === 'SphereGeometry' || geometry.type === 'IcosahedronGeometry' ) {\n\n\t\tconst radius = parameters.radius !== undefined ? parameters.radius : 1;\n\t\treturn RAPIER.ColliderDesc.ball( radius );\n\n\t} else if ( geometry.type === 'CylinderGeometry' ) {\n\n\t\tconst radius = parameters.radiusBottom !== undefined ? parameters.radiusBottom : 0.5;\n\t\tconst length = parameters.height !== undefined ? parameters.height : 0.5;\n\n\t\treturn RAPIER.ColliderDesc.cylinder( length / 2, radius );\n\n\t} else if ( geometry.type === 'CapsuleGeometry' ) {\n\n\t\tconst radius = parameters.radius !== undefined ? parameters.radius : 0.5;\n\t\tconst length = parameters.height !== undefined ? parameters.height : 0.5;\n\n\t\treturn RAPIER.ColliderDesc.capsule( length / 2, radius );\n\n\t} else if ( geometry.type === 'BufferGeometry' ) {\n\n\t\tconst vertices = [];\n\t\tconst vertex = new Vector3();\n\t\tconst position = geometry.getAttribute( 'position' );\n\n\t\tfor ( let i = 0; i < position.count; i ++ ) {\n\n\t\t\tvertex.fromBufferAttribute( position, i );\n\t\t\tvertices.push( vertex.x, vertex.y, vertex.z );\n\n\t\t}\n\n\t\t// if the buffer is non-indexed, generate an index buffer\n\t\tconst indices = geometry.getIndex() === null\n\t\t\t? Uint32Array.from( Array( parseInt( vertices.length / 3 ) ).keys() )\n\t\t\t: geometry.getIndex().array;\n\n\t\treturn RAPIER.ColliderDesc.trimesh( vertices, indices );\n\n\t}\n\n\tconsole.error( 'RapierPhysics: Unsupported geometry type:', geometry.type );\n\n\treturn null;\n\n}\n\n/**\n * @classdesc Can be used to include Rapier as a Physics engine into\n * `three.js` apps. The API can be initialized via:\n * ```js\n * const physics = await RapierPhysics();\n * ```\n * The component automatically imports Rapier from a CDN so make sure\n * to use the component with an active Internet connection.\n *\n * @name RapierPhysics\n * @class\n * @hideconstructor\n * @three_import import { RapierPhysics } from 'three/addons/physics/RapierPhysics.js';\n */\nasync function RapierPhysics() {\n\n\tif ( RAPIER === null ) {\n\n\t\tRAPIER = await import( `${RAPIER_PATH}` );\n\t\tawait RAPIER.init();\n\n\t}\n\n\t// Docs: https://rapier.rs/docs/api/javascript/JavaScript3D/\n\n\tconst gravity = new Vector3( 0.0, - 9.81, 0.0 );\n\tconst world = new RAPIER.World( gravity );\n\n\tconst meshes = [];\n\tconst meshMap = new WeakMap();\n\n\tconst _vector = new Vector3();\n\tconst _quaternion = new Quaternion();\n\tconst _matrix = new Matrix4();\n\n\tfunction addScene( scene ) {\n\n\t\tscene.traverse( function ( child ) {\n\n\t\t\tif ( child.isMesh ) {\n\n\t\t\t\tconst physics = child.userData.physics;\n\n\t\t\t\tif ( physics ) {\n\n\t\t\t\t\taddMesh( child, physics.mass, physics.restitution );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\tfunction addMesh( mesh, mass = 0, restitution = 0 ) {\n\n\t\tconst shape = getShape( mesh.geometry );\n\n\t\tif ( shape === null ) return;\n\n\t\tshape.setMass( mass );\n\t\tshape.setRestitution( restitution );\n\n\t\tconst { body, collider } = mesh.isInstancedMesh\n\t\t\t? createInstancedBody( mesh, mass, shape )\n\t\t\t: createBody( mesh.position, mesh.quaternion, mass, shape );\n\n\t\tif ( ! mesh.userData.physics ) mesh.userData.physics = {};\n\n\t\tmesh.userData.physics.body = body;\n\t\tmesh.userData.physics.collider = collider;\n\n\t\tif ( mass > 0 ) {\n\n\t\t\tmeshes.push( mesh );\n\t\t\tmeshMap.set( mesh, { body, collider } );\n\n\t\t}\n\n\t}\n\n\tfunction removeMesh( mesh ) {\n\n\t\tconst index = meshes.indexOf( mesh );\n\n\t\tif ( index !== - 1 ) {\n\n\t\t\tmeshes.splice( index, 1 );\n\t\t\tmeshMap.delete( mesh );\n\n\t\t\tif ( ! mesh.userData.physics ) return;\n\n\t\t\tconst body = mesh.userData.physics.body;\n\t\t\tconst collider = mesh.userData.physics.collider;\n\n\t\t\tif ( body ) removeBody( body );\n\t\t\tif ( collider ) removeCollider( collider );\n\n\t\t}\n\n\t}\n\n\tfunction createInstancedBody( mesh, mass, shape ) {\n\n\t\tconst array = mesh.instanceMatrix.array;\n\n\t\tconst bodies = [];\n\t\tconst colliders = [];\n\n\t\tfor ( let i = 0; i < mesh.count; i ++ ) {\n\n\t\t\tconst position = _vector.fromArray( array, i * 16 + 12 );\n\t\t\tconst { body, collider } = createBody( position, null, mass, shape );\n\t\t\tbodies.push( body );\n\t\t\tcolliders.push( collider );\n\n\t\t}\n\n\t\treturn { body: bodies, collider: colliders };\n\n\t}\n\n\tfunction createBody( position, quaternion, mass, shape ) {\n\n\t\tconst desc = mass > 0 ? RAPIER.RigidBodyDesc.dynamic() : RAPIER.RigidBodyDesc.fixed();\n\t\tdesc.setTranslation( ...position );\n\t\tif ( quaternion !== null ) desc.setRotation( quaternion );\n\n\t\tconst body = world.createRigidBody( desc );\n\t\tconst collider = world.createCollider( shape, body );\n\n\t\treturn { body, collider };\n\n\t}\n\n\tfunction removeBody( body ) {\n\n\t\tif ( Array.isArray( body ) ) {\n\n\t\t\tfor ( let i = 0; i < body.length; i ++ ) {\n\n\t\t\t\tworld.removeRigidBody( body[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tworld.removeRigidBody( body );\n\n\t\t}\n\n\t}\n\n\tfunction removeCollider( collider ) {\n\n\t\tif ( Array.isArray( collider ) ) {\n\n\t\t\tfor ( let i = 0; i < collider.length; i ++ ) {\n\n\t\t\t\tworld.removeCollider( collider[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tworld.removeCollider( collider );\n\n\t\t}\n\n\t}\n\n\tfunction setMeshPosition( mesh, position, index = 0 ) {\n\n\t\tlet { body } = meshMap.get( mesh );\n\n\t\tif ( mesh.isInstancedMesh ) {\n\n\t\t\tbody = body[ index ];\n\n\t\t}\n\n\t\tbody.setAngvel( ZERO );\n\t\tbody.setLinvel( ZERO );\n\t\tbody.setTranslation( position );\n\n\t}\n\n\tfunction setMeshVelocity( mesh, velocity, index = 0 ) {\n\n\t\tlet { body } = meshMap.get( mesh );\n\n\t\tif ( mesh.isInstancedMesh ) {\n\n\t\t\tbody = body[ index ];\n\n\t\t}\n\n\t\tbody.setLinvel( velocity );\n\n\t}\n\n\tfunction addHeightfield( mesh, width, depth, heights, scale ) {\n\n\t\tconst shape = RAPIER.ColliderDesc.heightfield( width, depth, heights, scale );\n\n\t\tconst bodyDesc = RAPIER.RigidBodyDesc.fixed();\n\t\tbodyDesc.setTranslation( mesh.position.x, mesh.position.y, mesh.position.z );\n\t\tbodyDesc.setRotation( mesh.quaternion );\n\n\t\tconst body = world.createRigidBody( bodyDesc );\n\t\tworld.createCollider( shape, body );\n\n\t\tif ( ! mesh.userData.physics ) mesh.userData.physics = {};\n\t\tmesh.userData.physics.body = body;\n\n\t\treturn body;\n\n\t}\n\n\t//\n\n\tconst clock = new Clock();\n\n\tfunction step() {\n\n\t\tworld.timestep = clock.getDelta();\n\t\tworld.step();\n\n\t\t//\n\n\t\tfor ( let i = 0, l = meshes.length; i < l; i ++ ) {\n\n\t\t\tconst mesh = meshes[ i ];\n\n\t\t\tif ( mesh.isInstancedMesh ) {\n\n\t\t\t\tconst array = mesh.instanceMatrix.array;\n\t\t\t\tconst { body: bodies } = meshMap.get( mesh );\n\n\t\t\t\tfor ( let j = 0; j < bodies.length; j ++ ) {\n\n\t\t\t\t\tconst body = bodies[ j ];\n\n\t\t\t\t\tconst position = body.translation();\n\t\t\t\t\t_quaternion.copy( body.rotation() );\n\n\t\t\t\t\t_matrix.compose( position, _quaternion, _scale ).toArray( array, j * 16 );\n\n\t\t\t\t}\n\n\t\t\t\tmesh.instanceMatrix.needsUpdate = true;\n\t\t\t\tmesh.computeBoundingSphere();\n\n\t\t\t} else {\n\n\t\t\t\tconst { body } = meshMap.get( mesh );\n\n\t\t\t\tmesh.position.copy( body.translation() );\n\t\t\t\tmesh.quaternion.copy( body.rotation() );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// animate\n\n\tsetInterval( step, 1000 / frameRate );\n\n\treturn {\n\t\tRAPIER,\n\t\tworld,\n\t\t/**\n\t\t * Adds the given scene to this physics simulation. Only meshes with a\n\t\t * `physics` object in their {@link Object3D#userData} field will be honored.\n\t\t * The object can be used to store the mass and restitution of the mesh. E.g.:\n\t\t * ```js\n\t\t * box.userData.physics = { mass: 1, restitution: 0 };\n\t\t * ```\n\t\t *\n\t\t * @method\n\t\t * @name RapierPhysics#addScene\n\t\t * @param {Object3D} scene The scene or any type of 3D object to add.\n\t\t */\n\t\taddScene: addScene,\n\n\t\t/**\n\t\t * Adds the given mesh to this physics simulation.\n\t\t *\n\t\t * @method\n\t\t * @name RapierPhysics#addMesh\n\t\t * @param {Mesh} mesh The mesh to add.\n\t\t * @param {number} [mass=0] The mass in kg of the mesh.\n\t\t * @param {number} [restitution=0] The restitution of the mesh, usually from 0 to 1. Represents how \"bouncy\" objects are when they collide with each other.\n\t\t */\n\t\taddMesh: addMesh,\n\n\t\t/**\n\t\t * Removes the given mesh from this physics simulation.\n\t\t *\n\t\t * @method\n\t\t * @name RapierPhysics#removeMesh\n\t\t * @param {Mesh} mesh The mesh to remove.\n\t\t */\n\t\tremoveMesh: removeMesh,\n\n\t\t/**\n\t\t * Set the position of the given mesh which is part of the physics simulation. Calling this\n\t\t * method will reset the current simulated velocity of the mesh.\n\t\t *\n\t\t * @method\n\t\t * @name RapierPhysics#setMeshPosition\n\t\t * @param {Mesh} mesh The mesh to update the position for.\n\t\t * @param {Vector3} position - The new position.\n\t\t * @param {number} [index=0] - If the mesh is instanced, the index represents the instanced ID.\n\t\t */\n\t\tsetMeshPosition: setMeshPosition,\n\n\t\t/**\n\t\t * Set the velocity of the given mesh which is part of the physics simulation.\n\t\t *\n\t\t * @method\n\t\t * @name RapierPhysics#setMeshVelocity\n\t\t * @param {Mesh} mesh The mesh to update the velocity for.\n\t\t * @param {Vector3} velocity - The new velocity.\n\t\t * @param {number} [index=0] - If the mesh is instanced, the index represents the instanced ID.\n\t\t */\n\t\tsetMeshVelocity: setMeshVelocity,\n\n\t\t/**\n\t\t * Adds a heightfield terrain to the physics simulation.\n\t\t * \n\t\t * @method\n\t\t * @name RapierPhysics#addHeightfield\n\t\t * @param {Mesh} mesh - The Three.js mesh representing the terrain.\n\t\t * @param {number} width - The number of vertices along the width (x-axis) of the heightfield.\n\t\t * @param {number} depth - The number of vertices along the depth (z-axis) of the heightfield.\n\t\t * @param {Float32Array} heights - Array of height values for each vertex in the heightfield.\n\t\t * @param {Object} scale - Scale factors for the heightfield dimensions.\n\t\t * @param {number} scale.x - Scale factor for width.\n\t\t * @param {number} scale.y - Scale factor for height.\n\t\t * @param {number} scale.z - Scale factor for depth.\n\t\t * @returns {RigidBody} The created Rapier rigid body for the heightfield.\n\t\t */\n\t\taddHeightfield: addHeightfield\n\n\t};\n\n}\n\nexport { RapierPhysics };\n", "/**\n * @module CopyShader\n * @three_import import { CopyShader } from 'three/addons/shaders/CopyShader.js';\n */\n\n/**\n * Full-screen copy shader pass.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst CopyShader = {\n\n\tname: 'CopyShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'opacity': { value: 1.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform float opacity;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\t\t\tgl_FragColor = opacity * texel;\n\n\n\t\t}`\n\n};\n\nexport { CopyShader };\n", "/**\n * @module AfterimageShader\n * @three_import import { AfterimageShader } from 'three/addons/shaders/AfterimageShader.js';\n */\n\n/**\n * Inspired by [Three.js FBO motion trails](https://codepen.io/brunoimbrizi/pen/MoRJaN?page=1&).\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst AfterimageShader = {\n\n\tname: 'AfterimageShader',\n\n\tuniforms: {\n\n\t\t'damp': { value: 0.96 },\n\t\t'tOld': { value: null },\n\t\t'tNew': { value: null }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform float damp;\n\n\t\tuniform sampler2D tOld;\n\t\tuniform sampler2D tNew;\n\n\t\tvarying vec2 vUv;\n\n\t\tvec4 when_gt( vec4 x, float y ) {\n\n\t\t\treturn max( sign( x - y ), 0.0 );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvec4 texelOld = texture2D( tOld, vUv );\n\t\t\tvec4 texelNew = texture2D( tNew, vUv );\n\n\t\t\ttexelOld *= damp * when_gt( texelOld, 0.1 );\n\n\t\t\tgl_FragColor = max(texelNew, texelOld);\n\n\t\t}`\n\n};\n\nexport { AfterimageShader };\n", "import {\n\tHalfFloatType,\n\tNearestFilter,\n\tNoBlending,\n\tShaderMaterial,\n\tUniformsUtils,\n\tWebGLRenderTarget\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\nimport { CopyShader } from '../shaders/CopyShader.js';\nimport { AfterimageShader } from '../shaders/AfterimageShader.js';\n\n/**\n * Pass for a basic after image effect.\n *\n * ```js\n * const afterimagePass = new AfterimagePass( 0.9 );\n * composer.addPass( afterimagePass );\n * ```\n *\n * @augments Pass\n * @three_import import { AfterimagePass } from 'three/addons/postprocessing/AfterimagePass.js';\n */\nclass AfterimagePass extends Pass {\n\n\t/**\n\t * Constructs a new after image pass.\n\t *\n\t * @param {number} [damp=0.96] - The damping intensity. A higher value means a stronger after image effect.\n\t */\n\tconstructor( damp = 0.96 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The pass uniforms. Use this object if you want to update the\n\t\t * `damp` value at runtime.\n\t\t * ```js\n\t\t * pass.uniforms.damp.value = 0.9;\n\t\t * ```\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.uniforms = UniformsUtils.clone( AfterimageShader.uniforms );\n\n\t\tthis.damp = damp;\n\n\t\t/**\n\t\t * The composition material.\n\t\t *\n\t\t * @type {ShaderMaterial}\n\t\t */\n\t\tthis.compFsMaterial = new ShaderMaterial( {\n\n\t\t\tuniforms: this.uniforms,\n\t\t\tvertexShader: AfterimageShader.vertexShader,\n\t\t\tfragmentShader: AfterimageShader.fragmentShader\n\n\t\t} );\n\n\t\t/**\n\t\t * The copy material.\n\t\t *\n\t\t * @type {ShaderMaterial}\n\t\t */\n\t\tthis.copyFsMaterial = new ShaderMaterial( {\n\t\t\tuniforms: UniformsUtils.clone( CopyShader.uniforms ),\n\t\t\tvertexShader: CopyShader.vertexShader,\n\t\t\tfragmentShader: CopyShader.fragmentShader,\n\t\t\tblending: NoBlending,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false\n\t\t} );\n\n\t\t// internals\n\n\t\tthis._textureComp = new WebGLRenderTarget( window.innerWidth, window.innerHeight, {\n\t\t\tmagFilter: NearestFilter,\n\t\t\ttype: HalfFloatType\n\t\t} );\n\n\t\tthis._textureOld = new WebGLRenderTarget( window.innerWidth, window.innerHeight, {\n\t\t\tmagFilter: NearestFilter,\n\t\t\ttype: HalfFloatType\n\t\t} );\n\n\t\tthis._compFsQuad = new FullScreenQuad( this.compFsMaterial );\n\t\tthis._copyFsQuad = new FullScreenQuad( this.copyFsMaterial );\n\n\t}\n\n\t/**\n\t * The damping intensity, from 0.0 to 1.0. A higher value means a stronger after image effect.\n\t *\n\t * @type {number}\n\t */\n\tget damp() {\n\n\t\treturn this.uniforms[ 'damp' ].value;\n\n\t}\n\n\tset damp( value ) {\n\n\t\tthis.uniforms[ 'damp' ].value = value;\n\n\t}\n\n\t/**\n\t * Performs the after image pass.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( renderer, writeBuffer, readBuffer/*, deltaTime, maskActive*/ ) {\n\n\t\tthis.uniforms[ 'tOld' ].value = this._textureOld.texture;\n\t\tthis.uniforms[ 'tNew' ].value = readBuffer.texture;\n\n\t\trenderer.setRenderTarget( this._textureComp );\n\t\tthis._compFsQuad.render( renderer );\n\n\t\tthis._copyFsQuad.material.uniforms.tDiffuse.value = this._textureComp.texture;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\tthis._copyFsQuad.render( renderer );\n\n\t\t} else {\n\n\t\t\trenderer.setRenderTarget( writeBuffer );\n\n\t\t\tif ( this.clear ) renderer.clear();\n\n\t\t\tthis._copyFsQuad.render( renderer );\n\n\t\t}\n\n\t\t// Swap buffers.\n\t\tconst temp = this._textureOld;\n\t\tthis._textureOld = this._textureComp;\n\t\tthis._textureComp = temp;\n\t\t// Now textureOld contains the latest image, ready for the next frame.\n\n\t}\n\n\t/**\n\t * Sets the size of the pass.\n\t *\n\t * @param {number} width - The width to set.\n\t * @param {number} height - The height to set.\n\t */\n\tsetSize( width, height ) {\n\n\t\tthis._textureComp.setSize( width, height );\n\t\tthis._textureOld.setSize( width, height );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the pass is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis._textureComp.dispose();\n\t\tthis._textureOld.dispose();\n\n\t\tthis.compFsMaterial.dispose();\n\t\tthis.copyFsMaterial.dispose();\n\n\t\tthis._compFsQuad.dispose();\n\t\tthis._copyFsQuad.dispose();\n\n\t}\n\n}\n\nexport { AfterimagePass };\n", "import {\n\tVector2\n} from 'three';\n\n/**\n * @module ConvolutionShader\n * @three_import import { ConvolutionShader } from 'three/addons/shaders/ConvolutionShader.js';\n */\n\n/**\n * Convolution shader ported from o3d sample to WebGL / GLSL.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst ConvolutionShader = {\n\n\tname: 'ConvolutionShader',\n\n\tdefines: {\n\n\t\t'KERNEL_SIZE_FLOAT': '25.0',\n\t\t'KERNEL_SIZE_INT': '25'\n\n\t},\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'uImageIncrement': { value: new Vector2( 0.001953125, 0.0 ) },\n\t\t'cKernel': { value: [] }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tuniform vec2 uImageIncrement;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv - ( ( KERNEL_SIZE_FLOAT - 1.0 ) / 2.0 ) * uImageIncrement;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform float cKernel[ KERNEL_SIZE_INT ];\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform vec2 uImageIncrement;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec2 imageCoord = vUv;\n\t\t\tvec4 sum = vec4( 0.0, 0.0, 0.0, 0.0 );\n\n\t\t\tfor( int i = 0; i < KERNEL_SIZE_INT; i ++ ) {\n\n\t\t\t\tsum += texture2D( tDiffuse, imageCoord ) * cKernel[ i ];\n\t\t\t\timageCoord += uImageIncrement;\n\n\t\t\t}\n\n\t\t\tgl_FragColor = sum;\n\n\t\t}`\n};\n\nexport { ConvolutionShader };\n", "import {\n\tAdditiveBlending,\n\tHalfFloatType,\n\tShaderMaterial,\n\tUniformsUtils,\n\tVector2,\n\tWebGLRenderTarget\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\nimport { ConvolutionShader } from '../shaders/ConvolutionShader.js';\n\n/**\n * A pass for a basic Bloom effect.\n *\n * {@link UnrealBloomPass} produces a more advanced Bloom but is also\n * more expensive.\n *\n * ```js\n * const effectBloom = new BloomPass( 0.75 );\n * composer.addPass( effectBloom );\n * ```\n *\n * @augments Pass\n * @three_import import { BloomPass } from 'three/addons/postprocessing/BloomPass.js';\n */\nclass BloomPass extends Pass {\n\n\t/**\n\t * Constructs a new Bloom pass.\n\t *\n\t * @param {number} [strength=1] - The Bloom strength.\n\t * @param {number} [kernelSize=25] - The kernel size.\n\t * @param {number} [sigma=4] - The sigma.\n\t */\n\tconstructor( strength = 1, kernelSize = 25, sigma = 4 ) {\n\n\t\tsuper();\n\n\t\t// combine material\n\n\t\t/**\n\t\t * The combine pass uniforms.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.combineUniforms = UniformsUtils.clone( CombineShader.uniforms );\n\t\tthis.combineUniforms[ 'strength' ].value = strength;\n\n\t\t/**\n\t\t * The combine pass material.\n\t\t *\n\t\t * @type {ShaderMaterial}\n\t\t */\n\t\tthis.materialCombine = new ShaderMaterial( {\n\n\t\t\tname: CombineShader.name,\n\t\t\tuniforms: this.combineUniforms,\n\t\t\tvertexShader: CombineShader.vertexShader,\n\t\t\tfragmentShader: CombineShader.fragmentShader,\n\t\t\tblending: AdditiveBlending,\n\t\t\ttransparent: true\n\n\t\t} );\n\n\t\t// convolution material\n\n\t\tconst convolutionShader = ConvolutionShader;\n\n\t\t/**\n\t\t * The convolution pass uniforms.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.convolutionUniforms = UniformsUtils.clone( convolutionShader.uniforms );\n\n\t\tthis.convolutionUniforms[ 'uImageIncrement' ].value = BloomPass.blurX;\n\t\tthis.convolutionUniforms[ 'cKernel' ].value = buildKernel( sigma );\n\n\t\t/**\n\t\t * The convolution pass material.\n\t\t *\n\t\t * @type {ShaderMaterial}\n\t\t */\n\t\tthis.materialConvolution = new ShaderMaterial( {\n\n\t\t\tname: convolutionShader.name,\n\t\t\tuniforms: this.convolutionUniforms,\n\t\t\tvertexShader: convolutionShader.vertexShader,\n\t\t\tfragmentShader: convolutionShader.fragmentShader,\n\t\t\tdefines: {\n\t\t\t\t'KERNEL_SIZE_FLOAT': kernelSize.toFixed( 1 ),\n\t\t\t\t'KERNEL_SIZE_INT': kernelSize.toFixed( 0 )\n\t\t\t}\n\n\t\t} );\n\n\t\t/**\n\t\t * Overwritten to disable the swap.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsSwap = false;\n\n\t\t// internals\n\n\t\tthis._renderTargetX = new WebGLRenderTarget( 1, 1, { type: HalfFloatType } ); // will be resized later\n\t\tthis._renderTargetX.texture.name = 'BloomPass.x';\n\t\tthis._renderTargetY = new WebGLRenderTarget( 1, 1, { type: HalfFloatType } ); // will be resized later\n\t\tthis._renderTargetY.texture.name = 'BloomPass.y';\n\n\t\tthis._fsQuad = new FullScreenQuad( null );\n\n\t}\n\n\t/**\n\t * Performs the Bloom pass.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( renderer, writeBuffer, readBuffer, deltaTime, maskActive ) {\n\n\t\tif ( maskActive ) renderer.state.buffers.stencil.setTest( false );\n\n\t\t// Render quad with blurred scene into texture (convolution pass 1)\n\n\t\tthis._fsQuad.material = this.materialConvolution;\n\n\t\tthis.convolutionUniforms[ 'tDiffuse' ].value = readBuffer.texture;\n\t\tthis.convolutionUniforms[ 'uImageIncrement' ].value = BloomPass.blurX;\n\n\t\trenderer.setRenderTarget( this._renderTargetX );\n\t\trenderer.clear();\n\t\tthis._fsQuad.render( renderer );\n\n\n\t\t// Render quad with blurred scene into texture (convolution pass 2)\n\n\t\tthis.convolutionUniforms[ 'tDiffuse' ].value = this._renderTargetX.texture;\n\t\tthis.convolutionUniforms[ 'uImageIncrement' ].value = BloomPass.blurY;\n\n\t\trenderer.setRenderTarget( this._renderTargetY );\n\t\trenderer.clear();\n\t\tthis._fsQuad.render( renderer );\n\n\t\t// Render original scene with superimposed blur to texture\n\n\t\tthis._fsQuad.material = this.materialCombine;\n\n\t\tthis.combineUniforms[ 'tDiffuse' ].value = this._renderTargetY.texture;\n\n\t\tif ( maskActive ) renderer.state.buffers.stencil.setTest( true );\n\n\t\trenderer.setRenderTarget( readBuffer );\n\t\tif ( this.clear ) renderer.clear();\n\t\tthis._fsQuad.render( renderer );\n\n\t}\n\n\t/**\n\t * Sets the size of the pass.\n\t *\n\t * @param {number} width - The width to set.\n\t * @param {number} height - The height to set.\n\t */\n\tsetSize( width, height ) {\n\n\t\tthis._renderTargetX.setSize( width, height );\n\t\tthis._renderTargetY.setSize( width, height );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the pass is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis._renderTargetX.dispose();\n\t\tthis._renderTargetY.dispose();\n\n\t\tthis.materialCombine.dispose();\n\t\tthis.materialConvolution.dispose();\n\n\t\tthis._fsQuad.dispose();\n\n\t}\n\n}\n\nconst CombineShader = {\n\n\tname: 'CombineShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'strength': { value: 1.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform float strength;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\t\t\tgl_FragColor = strength * texel;\n\n\t\t}`\n\n};\n\nBloomPass.blurX = new Vector2( 0.001953125, 0.0 );\nBloomPass.blurY = new Vector2( 0.0, 0.001953125 );\n\n\nfunction gauss( x, sigma ) {\n\n\treturn Math.exp( - ( x * x ) / ( 2.0 * sigma * sigma ) );\n\n}\n\nfunction buildKernel( sigma ) {\n\n\t// We loop off the sqrt(2 * pi) * sigma term, since we're going to normalize anyway.\n\n\tconst kMaxKernelSize = 25;\n\tlet kernelSize = 2 * Math.ceil( sigma * 3.0 ) + 1;\n\n\tif ( kernelSize > kMaxKernelSize ) kernelSize = kMaxKernelSize;\n\n\tconst halfWidth = ( kernelSize - 1 ) * 0.5;\n\n\tconst values = new Array( kernelSize );\n\tlet sum = 0.0;\n\tfor ( let i = 0; i < kernelSize; ++ i ) {\n\n\t\tvalues[ i ] = gauss( i - halfWidth, sigma );\n\t\tsum += values[ i ];\n\n\t}\n\n\t// normalize the kernel\n\n\tfor ( let i = 0; i < kernelSize; ++ i ) values[ i ] /= sum;\n\n\treturn values;\n\n}\n\nexport { BloomPass };\n", "/**\n * @module BokehShader\n * @three_import import { BokehShader } from 'three/addons/shaders/BokehShader.js';\n */\n\n/**\n * Depth-of-field shader with bokeh ported from\n * [GLSL shader by Martins Upitis](http://artmartinsh.blogspot.com/2010/02/glsl-lens-blur-filter-with-bokeh.html).\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst BokehShader = {\n\n\tname: 'BokehShader',\n\n\tdefines: {\n\t\t'DEPTH_PACKING': 1,\n\t\t'PERSPECTIVE_CAMERA': 1,\n\t},\n\n\tuniforms: {\n\n\t\t'tColor': { value: null },\n\t\t'tDepth': { value: null },\n\t\t'focus': { value: 1.0 },\n\t\t'aspect': { value: 1.0 },\n\t\t'aperture': { value: 0.025 },\n\t\t'maxblur': { value: 0.01 },\n\t\t'nearClip': { value: 1.0 },\n\t\t'farClip': { value: 1000.0 },\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\t#include <common>\n\n\t\tvarying vec2 vUv;\n\n\t\tuniform sampler2D tColor;\n\t\tuniform sampler2D tDepth;\n\n\t\tuniform float maxblur; // max blur amount\n\t\tuniform float aperture; // aperture - bigger values for shallower depth of field\n\n\t\tuniform float nearClip;\n\t\tuniform float farClip;\n\n\t\tuniform float focus;\n\t\tuniform float aspect;\n\n\t\t#include <packing>\n\n\t\tfloat getDepth( const in vec2 screenPosition ) {\n\t\t\t#if DEPTH_PACKING == 1\n\t\t\treturn unpackRGBAToDepth( texture2D( tDepth, screenPosition ) );\n\t\t\t#else\n\t\t\treturn texture2D( tDepth, screenPosition ).x;\n\t\t\t#endif\n\t\t}\n\n\t\tfloat getViewZ( const in float depth ) {\n\t\t\t#if PERSPECTIVE_CAMERA == 1\n\t\t\treturn perspectiveDepthToViewZ( depth, nearClip, farClip );\n\t\t\t#else\n\t\t\treturn orthographicDepthToViewZ( depth, nearClip, farClip );\n\t\t\t#endif\n\t\t}\n\n\n\t\tvoid main() {\n\n\t\t\tvec2 aspectcorrect = vec2( 1.0, aspect );\n\n\t\t\tfloat viewZ = getViewZ( getDepth( vUv ) );\n\n\t\t\tfloat factor = ( focus + viewZ ); // viewZ is <= 0, so this is a difference equation\n\n\t\t\tvec2 dofblur = vec2 ( clamp( factor * aperture, -maxblur, maxblur ) );\n\n\t\t\tvec2 dofblur9 = dofblur * 0.9;\n\t\t\tvec2 dofblur7 = dofblur * 0.7;\n\t\t\tvec2 dofblur4 = dofblur * 0.4;\n\n\t\t\tvec4 col = vec4( 0.0 );\n\n\t\t\tcol += texture2D( tColor, vUv.xy );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2(  0.15,  0.37 ) * aspectcorrect ) * dofblur );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2( -0.37,  0.15 ) * aspectcorrect ) * dofblur );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2(  0.40,  0.0  ) * aspectcorrect ) * dofblur );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2(  0.37, -0.15 ) * aspectcorrect ) * dofblur );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2( -0.15,  0.37 ) * aspectcorrect ) * dofblur );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2(  0.37,  0.15 ) * aspectcorrect ) * dofblur );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2(  0.15, -0.37 ) * aspectcorrect ) * dofblur );\n\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2(  0.15,  0.37 ) * aspectcorrect ) * dofblur9 );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2( -0.37,  0.15 ) * aspectcorrect ) * dofblur9 );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2(  0.37, -0.15 ) * aspectcorrect ) * dofblur9 );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2( -0.15, -0.37 ) * aspectcorrect ) * dofblur9 );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2( -0.15,  0.37 ) * aspectcorrect ) * dofblur9 );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2(  0.37,  0.15 ) * aspectcorrect ) * dofblur9 );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2( -0.37, -0.15 ) * aspectcorrect ) * dofblur9 );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2(  0.15, -0.37 ) * aspectcorrect ) * dofblur9 );\n\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur7 );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2(  0.40,  0.0  ) * aspectcorrect ) * dofblur7 );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur7 );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur7 );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur7 );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur7 );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur7 );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur7 );\n\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2(  0.29,  0.29 ) * aspectcorrect ) * dofblur4 );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2(  0.4,   0.0  ) * aspectcorrect ) * dofblur4 );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2(  0.29, -0.29 ) * aspectcorrect ) * dofblur4 );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2(  0.0,  -0.4  ) * aspectcorrect ) * dofblur4 );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2( -0.29,  0.29 ) * aspectcorrect ) * dofblur4 );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2( -0.4,   0.0  ) * aspectcorrect ) * dofblur4 );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2( -0.29, -0.29 ) * aspectcorrect ) * dofblur4 );\n\t\t\tcol += texture2D( tColor, vUv.xy + ( vec2(  0.0,   0.4  ) * aspectcorrect ) * dofblur4 );\n\n\t\t\tgl_FragColor = col / 41.0;\n\t\t\tgl_FragColor.a = 1.0;\n\n\t\t}`\n\n};\n\nexport { BokehShader };\n", "import {\n\tColor,\n\tHalfFloatType,\n\tMeshDepthMaterial,\n\tNearestFilter,\n\tNoBlending,\n\tRGBADepthPacking,\n\tShaderMaterial,\n\tUniformsUtils,\n\tWebGLRenderTarget\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\nimport { BokehShader } from '../shaders/BokehShader.js';\n\n/**\n * Pass for creating depth of field (DOF) effect.\n *\n * ```js\n * const bokehPass = new BokehPass( scene, camera, {\n * \tfocus: 500\n * \taperture: 5,\n * \tmaxblur: 0.01\n * } );\n * composer.addPass( bokehPass );\n * ```\n *\n * @augments Pass\n * @three_import import { BokehPass } from 'three/addons/postprocessing/BokehPass.js';\n */\nclass BokehPass extends Pass {\n\n\t/**\n\t * Constructs a new Bokeh pass.\n\t *\n\t * @param {Scene} scene - The scene to render the DOF for.\n\t * @param {Camera} camera - The camera.\n\t * @param {BokehPass~Options} params - The pass options.\n\t */\n\tconstructor( scene, camera, params ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The scene to render the DOF for.\n\t\t *\n\t\t * @type {Scene}\n\t\t */\n\t\tthis.scene = scene;\n\n\t\t/**\n\t\t * The camera.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = camera;\n\n\t\tconst focus = ( params.focus !== undefined ) ? params.focus : 1.0;\n\t\tconst aperture = ( params.aperture !== undefined ) ? params.aperture : 0.025;\n\t\tconst maxblur = ( params.maxblur !== undefined ) ? params.maxblur : 1.0;\n\n\t\t// render targets\n\n\t\tthis._renderTargetDepth = new WebGLRenderTarget( 1, 1, { // will be resized later\n\t\t\tminFilter: NearestFilter,\n\t\t\tmagFilter: NearestFilter,\n\t\t\ttype: HalfFloatType\n\t\t} );\n\n\t\tthis._renderTargetDepth.texture.name = 'BokehPass.depth';\n\n\t\t// depth material\n\n\t\tthis._materialDepth = new MeshDepthMaterial();\n\t\tthis._materialDepth.depthPacking = RGBADepthPacking;\n\t\tthis._materialDepth.blending = NoBlending;\n\n\t\t// bokeh material\n\n\t\tconst bokehUniforms = UniformsUtils.clone( BokehShader.uniforms );\n\n\t\tbokehUniforms[ 'tDepth' ].value = this._renderTargetDepth.texture;\n\n\t\tbokehUniforms[ 'focus' ].value = focus;\n\t\tbokehUniforms[ 'aspect' ].value = camera.aspect;\n\t\tbokehUniforms[ 'aperture' ].value = aperture;\n\t\tbokehUniforms[ 'maxblur' ].value = maxblur;\n\t\tbokehUniforms[ 'nearClip' ].value = camera.near;\n\t\tbokehUniforms[ 'farClip' ].value = camera.far;\n\n\t\t/**\n\t\t * The pass bokeh material.\n\t\t *\n\t\t * @type {ShaderMaterial}\n\t\t */\n\t\tthis.materialBokeh = new ShaderMaterial( {\n\t\t\tdefines: Object.assign( {}, BokehShader.defines ),\n\t\t\tuniforms: bokehUniforms,\n\t\t\tvertexShader: BokehShader.vertexShader,\n\t\t\tfragmentShader: BokehShader.fragmentShader\n\t\t} );\n\n\t\t/**\n\t\t * The pass uniforms.  Use this object if you want to update the\n\t\t * `focus`, `aperture` or `maxblur` values at runtime.\n\t\t *\n\t\t * ```js\n\t\t * pass.uniforms.focus.value = focus;\n\t\t * pass.uniforms.aperture.value = aperture;\n\t\t * pass.uniforms.maxblur.value = maxblur;\n\t\t * ```\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.uniforms = bokehUniforms;\n\n\t\t// internals\n\n\t\tthis._fsQuad = new FullScreenQuad( this.materialBokeh );\n\n\t\tthis._oldClearColor = new Color();\n\n\t}\n\n\t/**\n\t * Performs the Bokeh pass.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( renderer, writeBuffer, readBuffer/*, deltaTime, maskActive*/ ) {\n\n\t\t// Render depth into texture\n\n\t\tthis.scene.overrideMaterial = this._materialDepth;\n\n\t\trenderer.getClearColor( this._oldClearColor );\n\t\tconst oldClearAlpha = renderer.getClearAlpha();\n\t\tconst oldAutoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\trenderer.setClearColor( 0xffffff );\n\t\trenderer.setClearAlpha( 1.0 );\n\t\trenderer.setRenderTarget( this._renderTargetDepth );\n\t\trenderer.clear();\n\t\trenderer.render( this.scene, this.camera );\n\n\t\t// Render bokeh composite\n\n\t\tthis.uniforms[ 'tColor' ].value = readBuffer.texture;\n\t\tthis.uniforms[ 'nearClip' ].value = this.camera.near;\n\t\tthis.uniforms[ 'farClip' ].value = this.camera.far;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t} else {\n\n\t\t\trenderer.setRenderTarget( writeBuffer );\n\t\t\trenderer.clear();\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t}\n\n\t\tthis.scene.overrideMaterial = null;\n\t\trenderer.setClearColor( this._oldClearColor );\n\t\trenderer.setClearAlpha( oldClearAlpha );\n\t\trenderer.autoClear = oldAutoClear;\n\n\t}\n\n\t/**\n\t * Sets the size of the pass.\n\t *\n\t * @param {number} width - The width to set.\n\t * @param {number} height - The height to set.\n\t */\n\tsetSize( width, height ) {\n\n\t\tthis.materialBokeh.uniforms[ 'aspect' ].value = width / height;\n\n\t\tthis._renderTargetDepth.setSize( width, height );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the pass is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis._renderTargetDepth.dispose();\n\n\t\tthis._materialDepth.dispose();\n\t\tthis.materialBokeh.dispose();\n\n\t\tthis._fsQuad.dispose();\n\n\t}\n\n}\n\n/**\n * Constructor options of `BokehPass`.\n *\n * @typedef {Object} BokehPass~Options\n * @property {number} [focus=1] - Defines the effect's focus which is the distance along the camera's look direction in world units.\n * @property {number} [aperture=0.025] - Defines the effect's aperture.\n * @property {number} [maxblur=1] - Defines the effect's maximum blur.\n **/\n\nexport { BokehPass };\n", "import {\n\tColor\n} from 'three';\nimport { Pass } from './Pass.js';\n\n/**\n * This class can be used to force a clear operation for the current read or\n * default framebuffer (when rendering to screen).\n *\n * ```js\n * const clearPass = new ClearPass();\n * composer.addPass( clearPass );\n * ```\n *\n * @augments Pass\n * @three_import import { ClearPass } from 'three/addons/postprocessing/ClearPass.js';\n */\nclass ClearPass extends Pass {\n\n\t/**\n\t * Constructs a new clear pass.\n\t *\n\t * @param {(number|Color|string)} [clearColor=0x000000] - The clear color.\n\t * @param {number} [clearAlpha=0] - The clear alpha.\n\t */\n\tconstructor( clearColor = 0x000000, clearAlpha = 0 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * Overwritten to disable the swap.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsSwap = false;\n\n\t\t/**\n\t\t * The clear color.\n\t\t *\n\t\t * @type {(number|Color|string)}\n\t\t * @default 0x000000\n\t\t */\n\t\tthis.clearColor = clearColor;\n\n\t\t/**\n\t\t * The clear alpha.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.clearAlpha = clearAlpha;\n\n\t\t// internals\n\n\t\tthis._oldClearColor = new Color();\n\n\t}\n\n\t/**\n\t * Performs the clear operation. This affects the current read or the default framebuffer.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\tlet oldClearAlpha;\n\n\t\tif ( this.clearColor ) {\n\n\t\t\trenderer.getClearColor( this._oldClearColor );\n\t\t\toldClearAlpha = renderer.getClearAlpha();\n\n\t\t\trenderer.setClearColor( this.clearColor, this.clearAlpha );\n\n\t\t}\n\n\t\trenderer.setRenderTarget( this.renderToScreen ? null : readBuffer );\n\t\trenderer.clear();\n\n\t\tif ( this.clearColor ) {\n\n\t\t\trenderer.setClearColor( this._oldClearColor, oldClearAlpha );\n\n\t\t}\n\n\t}\n\n}\n\nexport { ClearPass };\n", "import {\n\tBackSide,\n\tBoxGeometry,\n\tMesh,\n\tPerspectiveCamera,\n\tScene,\n\tShaderLib,\n\tShaderMaterial,\n\tUniformsUtils\n} from 'three';\nimport { Pass } from './Pass.js';\n\n/**\n * This pass can be used to render a cube texture over the entire screen.\n *\n * ```js\n * const cubeMap = new THREE.CubeTextureLoader().load( urls );\n *\n * const cubeTexturePass = new CubeTexturePass( camera, cubemap );\n * composer.addPass( cubeTexturePass );\n * ```\n *\n * @augments Pass\n * @three_import import { CubeTexturePass } from 'three/addons/postprocessing/CubeTexturePass.js';\n */\nclass CubeTexturePass extends Pass {\n\n\t/**\n\t * Constructs a new cube texture pass.\n\t *\n\t * @param {PerspectiveCamera} camera - The camera.\n\t * @param {CubeTexture} tCube - The cube texture to render.\n\t * @param {number} [opacity=1] - The opacity.\n\t */\n\tconstructor( camera, tCube, opacity = 1 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The camera.\n\t\t *\n\t\t * @type {PerspectiveCamera}\n\t\t */\n\t\tthis.camera = camera;\n\n\t\t/**\n\t\t * The cube texture to render.\n\t\t *\n\t\t * @type {CubeTexture}\n\t\t */\n\t\tthis.tCube = tCube;\n\n\t\t/**\n\t\t * The opacity.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.opacity = opacity;\n\n\t\t/**\n\t\t * Overwritten to disable the swap.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsSwap = false;\n\n\t\t// internals\n\n\t\tconst cubeShader = ShaderLib[ 'cube' ];\n\n\t\tthis._cubeMesh = new Mesh(\n\t\t\tnew BoxGeometry( 10, 10, 10 ),\n\t\t\tnew ShaderMaterial( {\n\t\t\t\tuniforms: UniformsUtils.clone( cubeShader.uniforms ),\n\t\t\t\tvertexShader: cubeShader.vertexShader,\n\t\t\t\tfragmentShader: cubeShader.fragmentShader,\n\t\t\t\tdepthTest: false,\n\t\t\t\tdepthWrite: false,\n\t\t\t\tside: BackSide\n\t\t\t} )\n\t\t);\n\n\t\tObject.defineProperty( this._cubeMesh.material, 'envMap', {\n\n\t\t\tget: function () {\n\n\t\t\t\treturn this.uniforms.tCube.value;\n\n\t\t\t}\n\n\t\t} );\n\n\t\tthis._cubeScene = new Scene();\n\t\tthis._cubeCamera = new PerspectiveCamera();\n\t\tthis._cubeScene.add( this._cubeMesh );\n\n\t}\n\n\t/**\n\t * Performs the cube texture pass.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( renderer, writeBuffer, readBuffer/*, deltaTime, maskActive*/ ) {\n\n\t\tconst oldAutoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tthis._cubeCamera.projectionMatrix.copy( this.camera.projectionMatrix );\n\t\tthis._cubeCamera.quaternion.setFromRotationMatrix( this.camera.matrixWorld );\n\n\t\tthis._cubeMesh.material.uniforms.tCube.value = this.tCube;\n\t\tthis._cubeMesh.material.uniforms.tFlip.value = ( this.tCube.isCubeTexture && this.tCube.isRenderTargetTexture === false ) ? - 1 : 1;\n\t\tthis._cubeMesh.material.uniforms.opacity.value = this.opacity;\n\t\tthis._cubeMesh.material.transparent = ( this.opacity < 1.0 );\n\n\t\trenderer.setRenderTarget( this.renderToScreen ? null : readBuffer );\n\t\tif ( this.clear ) renderer.clear();\n\t\trenderer.render( this._cubeScene, this._cubeCamera );\n\n\t\trenderer.autoClear = oldAutoClear;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the pass is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis._cubeMesh.geometry.dispose();\n\t\tthis._cubeMesh.material.dispose();\n\n\t}\n\n}\n\nexport { CubeTexturePass };\n", "import {\n\tVector2\n} from 'three';\n\n/**\n * @module DotScreenShader\n * @three_import import { DotScreenShader } from 'three/addons/shaders/DotScreenShader.js';\n */\n\n/**\n * Dot screen shader based on [glfx.js sepia shader](https://github.com/evanw/glfx.js).\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst DotScreenShader = {\n\n\tname: 'DotScreenShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'tSize': { value: new Vector2( 256, 256 ) },\n\t\t'center': { value: new Vector2( 0.5, 0.5 ) },\n\t\t'angle': { value: 1.57 },\n\t\t'scale': { value: 1.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform vec2 center;\n\t\tuniform float angle;\n\t\tuniform float scale;\n\t\tuniform vec2 tSize;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tfloat pattern() {\n\n\t\t\tfloat s = sin( angle ), c = cos( angle );\n\n\t\t\tvec2 tex = vUv * tSize - center;\n\t\t\tvec2 point = vec2( c * tex.x - s * tex.y, s * tex.x + c * tex.y ) * scale;\n\n\t\t\treturn ( sin( point.x ) * sin( point.y ) ) * 4.0;\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvec4 color = texture2D( tDiffuse, vUv );\n\n\t\t\tfloat average = ( color.r + color.g + color.b ) / 3.0;\n\n\t\t\tgl_FragColor = vec4( vec3( average * 10.0 - 5.0 + pattern() ), color.a );\n\n\t\t}`\n\n};\n\nexport { DotScreenShader };\n", "import {\n\tShaderMaterial,\n\tUniformsUtils\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\nimport { DotScreenShader } from '../shaders/DotScreenShader.js';\n\n/**\n * Pass for creating a dot-screen effect.\n *\n * ```js\n * const pass = new DotScreenPass( new THREE.Vector2( 0, 0 ), 0.5, 0.8 );\n * composer.addPass( pass );\n * ```\n *\n * @augments Pass\n * @three_import import { DotScreenPass } from 'three/addons/postprocessing/DotScreenPass.js';\n */\nclass DotScreenPass extends Pass {\n\n\t/**\n\t * Constructs a new dot screen pass.\n\t *\n\t * @param {Vector2} center - The center point.\n\t * @param {number} angle - The rotation of the effect in radians.\n\t * @param {number} scale - The scale of the effect. A higher value means smaller dots.\n\t */\n\tconstructor( center, angle, scale ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The pass uniforms. Use this object if you want to update the\n\t\t * `center`, `angle` or `scale` values at runtime.\n\t\t * ```js\n\t\t * pass.uniforms.center.value.copy( center );\n\t\t * pass.uniforms.angle.value = 0;\n\t\t * pass.uniforms.scale.value = 0.5;\n\t\t * ```\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.uniforms = UniformsUtils.clone( DotScreenShader.uniforms );\n\n\t\tif ( center !== undefined ) this.uniforms[ 'center' ].value.copy( center );\n\t\tif ( angle !== undefined ) this.uniforms[ 'angle' ].value = angle;\n\t\tif ( scale !== undefined ) this.uniforms[ 'scale' ].value = scale;\n\n\t\t/**\n\t\t * The pass material.\n\t\t *\n\t\t * @type {ShaderMaterial}\n\t\t */\n\t\tthis.material = new ShaderMaterial( {\n\n\t\t\tname: DotScreenShader.name,\n\t\t\tuniforms: this.uniforms,\n\t\t\tvertexShader: DotScreenShader.vertexShader,\n\t\t\tfragmentShader: DotScreenShader.fragmentShader\n\n\t\t} );\n\n\t\t// internals\n\n\t\tthis._fsQuad = new FullScreenQuad( this.material );\n\n\t}\n\n\t/**\n\t * Performs the dot screen pass.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\tthis.uniforms[ 'tDiffuse' ].value = readBuffer.texture;\n\t\tthis.uniforms[ 'tSize' ].value.set( readBuffer.width, readBuffer.height );\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t} else {\n\n\t\t\trenderer.setRenderTarget( writeBuffer );\n\t\t\tif ( this.clear ) renderer.clear();\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the pass is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.material.dispose();\n\n\t\tthis._fsQuad.dispose();\n\n\t}\n\n}\n\nexport { DotScreenPass };\n", "import {\n\tShaderMaterial,\n\tUniformsUtils\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\n\n/**\n * This pass can be used to create a post processing effect\n * with a raw GLSL shader object. Useful for implementing custom\n * effects.\n *\n * ```js\n * const fxaaPass = new ShaderPass( FXAAShader );\n * composer.addPass( fxaaPass );\n * ```\n *\n * @augments Pass\n * @three_import import { ShaderPass } from 'three/addons/postprocessing/ShaderPass.js';\n */\nclass ShaderPass extends Pass {\n\n\t/**\n\t * Constructs a new shader pass.\n\t *\n\t * @param {Object|ShaderMaterial} [shader] - A shader object holding vertex and fragment shader as well as\n\t * defines and uniforms. It's also valid to pass a custom shader material.\n\t * @param {string} [textureID='tDiffuse'] - The name of the texture uniform that should sample\n\t * the read buffer.\n\t */\n\tconstructor( shader, textureID = 'tDiffuse' ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The name of the texture uniform that should sample the read buffer.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'tDiffuse'\n\t\t */\n\t\tthis.textureID = textureID;\n\n\t\t/**\n\t\t * The pass uniforms.\n\t\t *\n\t\t * @type {?Object}\n\t\t */\n\t\tthis.uniforms = null;\n\n\t\t/**\n\t\t * The pass material.\n\t\t *\n\t\t * @type {?ShaderMaterial}\n\t\t */\n\t\tthis.material = null;\n\n\t\tif ( shader instanceof ShaderMaterial ) {\n\n\t\t\tthis.uniforms = shader.uniforms;\n\n\t\t\tthis.material = shader;\n\n\t\t} else if ( shader ) {\n\n\t\t\tthis.uniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t\tthis.material = new ShaderMaterial( {\n\n\t\t\t\tname: ( shader.name !== undefined ) ? shader.name : 'unspecified',\n\t\t\t\tdefines: Object.assign( {}, shader.defines ),\n\t\t\t\tuniforms: this.uniforms,\n\t\t\t\tvertexShader: shader.vertexShader,\n\t\t\t\tfragmentShader: shader.fragmentShader\n\n\t\t\t} );\n\n\t\t}\n\n\t\t// internals\n\n\t\tthis._fsQuad = new FullScreenQuad( this.material );\n\n\t}\n\n\t/**\n\t * Performs the shader pass.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\tif ( this.uniforms[ this.textureID ] ) {\n\n\t\t\tthis.uniforms[ this.textureID ].value = readBuffer.texture;\n\n\t\t}\n\n\t\tthis._fsQuad.material = this.material;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t} else {\n\n\t\t\trenderer.setRenderTarget( writeBuffer );\n\t\t\t// TODO: Avoid using autoClear properties, see https://github.com/mrdoob/three.js/pull/15571#issuecomment-465669600\n\t\t\tif ( this.clear ) renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the pass is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.material.dispose();\n\n\t\tthis._fsQuad.dispose();\n\n\t}\n\n}\n\nexport { ShaderPass };\n", "import { Pass } from './Pass.js';\n\n/**\n * This pass can be used to define a mask during post processing.\n * Meaning only areas of subsequent post processing are affected\n * which lie in the masking area of this pass. Internally, the masking\n * is implemented with the stencil buffer.\n *\n * ```js\n * const maskPass = new MaskPass( scene, camera );\n * composer.addPass( maskPass );\n * ```\n *\n * @augments Pass\n * @three_import import { MaskPass } from 'three/addons/postprocessing/MaskPass.js';\n */\nclass MaskPass extends Pass {\n\n\t/**\n\t * Constructs a new mask pass.\n\t *\n\t * @param {Scene} scene - The 3D objects in this scene will define the mask.\n\t * @param {Camera} camera - The camera.\n\t */\n\tconstructor( scene, camera ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The scene that defines the mask.\n\t\t *\n\t\t * @type {Scene}\n\t\t */\n\t\tthis.scene = scene;\n\n\t\t/**\n\t\t * The camera.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = camera;\n\n\t\t/**\n\t\t * Overwritten to perform a clear operation by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.clear = true;\n\n\t\t/**\n\t\t * Overwritten to disable the swap.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsSwap = false;\n\n\t\t/**\n\t\t * Whether to inverse the mask or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.inverse = false;\n\n\t}\n\n\t/**\n\t * Performs a mask pass with the configured scene and camera.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\tconst context = renderer.getContext();\n\t\tconst state = renderer.state;\n\n\t\t// don't update color or depth\n\n\t\tstate.buffers.color.setMask( false );\n\t\tstate.buffers.depth.setMask( false );\n\n\t\t// lock buffers\n\n\t\tstate.buffers.color.setLocked( true );\n\t\tstate.buffers.depth.setLocked( true );\n\n\t\t// set up stencil\n\n\t\tlet writeValue, clearValue;\n\n\t\tif ( this.inverse ) {\n\n\t\t\twriteValue = 0;\n\t\t\tclearValue = 1;\n\n\t\t} else {\n\n\t\t\twriteValue = 1;\n\t\t\tclearValue = 0;\n\n\t\t}\n\n\t\tstate.buffers.stencil.setTest( true );\n\t\tstate.buffers.stencil.setOp( context.REPLACE, context.REPLACE, context.REPLACE );\n\t\tstate.buffers.stencil.setFunc( context.ALWAYS, writeValue, 0xffffffff );\n\t\tstate.buffers.stencil.setClear( clearValue );\n\t\tstate.buffers.stencil.setLocked( true );\n\n\t\t// draw into the stencil buffer\n\n\t\trenderer.setRenderTarget( readBuffer );\n\t\tif ( this.clear ) renderer.clear();\n\t\trenderer.render( this.scene, this.camera );\n\n\t\trenderer.setRenderTarget( writeBuffer );\n\t\tif ( this.clear ) renderer.clear();\n\t\trenderer.render( this.scene, this.camera );\n\n\t\t// unlock color and depth buffer and make them writable for subsequent rendering/clearing\n\n\t\tstate.buffers.color.setLocked( false );\n\t\tstate.buffers.depth.setLocked( false );\n\n\t\tstate.buffers.color.setMask( true );\n\t\tstate.buffers.depth.setMask( true );\n\n\t\t// only render where stencil is set to 1\n\n\t\tstate.buffers.stencil.setLocked( false );\n\t\tstate.buffers.stencil.setFunc( context.EQUAL, 1, 0xffffffff ); // draw if == 1\n\t\tstate.buffers.stencil.setOp( context.KEEP, context.KEEP, context.KEEP );\n\t\tstate.buffers.stencil.setLocked( true );\n\n\t}\n\n}\n\n/**\n * This pass can be used to clear a mask previously defined with {@link MaskPass}.\n *\n * ```js\n * const clearPass = new ClearMaskPass();\n * composer.addPass( clearPass );\n * ```\n *\n * @augments Pass\n */\nclass ClearMaskPass extends Pass {\n\n\t/**\n\t * Constructs a new clear mask pass.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * Overwritten to disable the swap.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsSwap = false;\n\n\t}\n\n\t/**\n\t * Performs the clear of the currently defined mask.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( renderer /*, writeBuffer, readBuffer, deltaTime, maskActive */ ) {\n\n\t\trenderer.state.buffers.stencil.setLocked( false );\n\t\trenderer.state.buffers.stencil.setTest( false );\n\n\t}\n\n}\n\nexport { MaskPass, ClearMaskPass };\n", "import {\n\tClock,\n\tHalfFloatType,\n\tNoBlending,\n\tVector2,\n\tWebGLRenderTarget\n} from 'three';\nimport { CopyShader } from '../shaders/CopyShader.js';\nimport { ShaderPass } from './ShaderPass.js';\nimport { ClearMaskPass, MaskPass } from './MaskPass.js';\n\n/**\n * Used to implement post-processing effects in three.js.\n * The class manages a chain of post-processing passes to produce the final visual result.\n * Post-processing passes are executed in order of their addition/insertion.\n * The last pass is automatically rendered to screen.\n *\n * This module can only be used with {@link WebGLRenderer}.\n *\n * ```js\n * const composer = new EffectComposer( renderer );\n *\n * // adding some passes\n * const renderPass = new RenderPass( scene, camera );\n * composer.addPass( renderPass );\n *\n * const glitchPass = new GlitchPass();\n * composer.addPass( glitchPass );\n *\n * const outputPass = new OutputPass()\n * composer.addPass( outputPass );\n *\n * function animate() {\n *\n * \tcomposer.render(); // instead of renderer.render()\n *\n * }\n * ```\n *\n * @three_import import { EffectComposer } from 'three/addons/postprocessing/EffectComposer.js';\n */\nclass EffectComposer {\n\n\t/**\n\t * Constructs a new effect composer.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} [renderTarget] - This render target and a clone will\n\t * be used as the internal read and write buffers. If not given, the composer creates\n\t * the buffers automatically.\n\t */\n\tconstructor( renderer, renderTarget ) {\n\n\t\t/**\n\t\t * The renderer.\n\t\t *\n\t\t * @type {WebGLRenderer}\n\t\t */\n\t\tthis.renderer = renderer;\n\n\t\tthis._pixelRatio = renderer.getPixelRatio();\n\n\t\tif ( renderTarget === undefined ) {\n\n\t\t\tconst size = renderer.getSize( new Vector2() );\n\t\t\tthis._width = size.width;\n\t\t\tthis._height = size.height;\n\n\t\t\trenderTarget = new WebGLRenderTarget( this._width * this._pixelRatio, this._height * this._pixelRatio, { type: HalfFloatType } );\n\t\t\trenderTarget.texture.name = 'EffectComposer.rt1';\n\n\t\t} else {\n\n\t\t\tthis._width = renderTarget.width;\n\t\t\tthis._height = renderTarget.height;\n\n\t\t}\n\n\t\tthis.renderTarget1 = renderTarget;\n\t\tthis.renderTarget2 = renderTarget.clone();\n\t\tthis.renderTarget2.texture.name = 'EffectComposer.rt2';\n\n\t\t/**\n\t\t * A reference to the internal write buffer. Passes usually write\n\t\t * their result into this buffer.\n\t\t *\n\t\t * @type {WebGLRenderTarget}\n\t\t */\n\t\tthis.writeBuffer = this.renderTarget1;\n\n\t\t/**\n\t\t * A reference to the internal read buffer. Passes usually read\n\t\t * the previous render result from this buffer.\n\t\t *\n\t\t * @type {WebGLRenderTarget}\n\t\t */\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t\t/**\n\t\t * Whether the final pass is rendered to the screen (default framebuffer) or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.renderToScreen = true;\n\n\t\t/**\n\t\t * An array representing the (ordered) chain of post-processing passes.\n\t\t *\n\t\t * @type {Array<Pass>}\n\t\t */\n\t\tthis.passes = [];\n\n\t\t/**\n\t\t * A copy pass used for internal swap operations.\n\t\t *\n\t\t * @private\n\t\t * @type {ShaderPass}\n\t\t */\n\t\tthis.copyPass = new ShaderPass( CopyShader );\n\t\tthis.copyPass.material.blending = NoBlending;\n\n\t\t/**\n\t\t * The internal clock for managing time data.\n\t\t *\n\t\t * @private\n\t\t * @type {Clock}\n\t\t */\n\t\tthis.clock = new Clock();\n\n\t}\n\n\t/**\n\t * Swaps the internal read/write buffers.\n\t */\n\tswapBuffers() {\n\n\t\tconst tmp = this.readBuffer;\n\t\tthis.readBuffer = this.writeBuffer;\n\t\tthis.writeBuffer = tmp;\n\n\t}\n\n\t/**\n\t * Adds the given pass to the pass chain.\n\t *\n\t * @param {Pass} pass - The pass to add.\n\t */\n\taddPass( pass ) {\n\n\t\tthis.passes.push( pass );\n\t\tpass.setSize( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\n\t}\n\n\t/**\n\t * Inserts the given pass at a given index.\n\t *\n\t * @param {Pass} pass - The pass to insert.\n\t * @param {number} index - The index into the pass chain.\n\t */\n\tinsertPass( pass, index ) {\n\n\t\tthis.passes.splice( index, 0, pass );\n\t\tpass.setSize( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\n\t}\n\n\t/**\n\t * Removes the given pass from the pass chain.\n\t *\n\t * @param {Pass} pass - The pass to remove.\n\t */\n\tremovePass( pass ) {\n\n\t\tconst index = this.passes.indexOf( pass );\n\n\t\tif ( index !== - 1 ) {\n\n\t\t\tthis.passes.splice( index, 1 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns `true` if the pass for the given index is the last enabled pass in the pass chain.\n\t *\n\t * @param {number} passIndex - The pass index.\n\t * @return {boolean} Whether the pass for the given index is the last pass in the pass chain.\n\t */\n\tisLastEnabledPass( passIndex ) {\n\n\t\tfor ( let i = passIndex + 1; i < this.passes.length; i ++ ) {\n\n\t\t\tif ( this.passes[ i ].enabled ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Executes all enabled post-processing passes in order to produce the final frame.\n\t *\n\t * @param {number} deltaTime - The delta time in seconds. If not given, the composer computes\n\t * its own time delta value.\n\t */\n\trender( deltaTime ) {\n\n\t\t// deltaTime value is in seconds\n\n\t\tif ( deltaTime === undefined ) {\n\n\t\t\tdeltaTime = this.clock.getDelta();\n\n\t\t}\n\n\t\tconst currentRenderTarget = this.renderer.getRenderTarget();\n\n\t\tlet maskActive = false;\n\n\t\tfor ( let i = 0, il = this.passes.length; i < il; i ++ ) {\n\n\t\t\tconst pass = this.passes[ i ];\n\n\t\t\tif ( pass.enabled === false ) continue;\n\n\t\t\tpass.renderToScreen = ( this.renderToScreen && this.isLastEnabledPass( i ) );\n\t\t\tpass.render( this.renderer, this.writeBuffer, this.readBuffer, deltaTime, maskActive );\n\n\t\t\tif ( pass.needsSwap ) {\n\n\t\t\t\tif ( maskActive ) {\n\n\t\t\t\t\tconst context = this.renderer.getContext();\n\t\t\t\t\tconst stencil = this.renderer.state.buffers.stencil;\n\n\t\t\t\t\t//context.stencilFunc( context.NOTEQUAL, 1, 0xffffffff );\n\t\t\t\t\tstencil.setFunc( context.NOTEQUAL, 1, 0xffffffff );\n\n\t\t\t\t\tthis.copyPass.render( this.renderer, this.writeBuffer, this.readBuffer, deltaTime );\n\n\t\t\t\t\t//context.stencilFunc( context.EQUAL, 1, 0xffffffff );\n\t\t\t\t\tstencil.setFunc( context.EQUAL, 1, 0xffffffff );\n\n\t\t\t\t}\n\n\t\t\t\tthis.swapBuffers();\n\n\t\t\t}\n\n\t\t\tif ( MaskPass !== undefined ) {\n\n\t\t\t\tif ( pass instanceof MaskPass ) {\n\n\t\t\t\t\tmaskActive = true;\n\n\t\t\t\t} else if ( pass instanceof ClearMaskPass ) {\n\n\t\t\t\t\tmaskActive = false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.renderer.setRenderTarget( currentRenderTarget );\n\n\t}\n\n\t/**\n\t * Resets the internal state of the EffectComposer.\n\t *\n\t * @param {WebGLRenderTarget} [renderTarget] - This render target has the same purpose like\n\t * the one from the constructor. If set, it is used to setup the read and write buffers.\n\t */\n\treset( renderTarget ) {\n\n\t\tif ( renderTarget === undefined ) {\n\n\t\t\tconst size = this.renderer.getSize( new Vector2() );\n\t\t\tthis._pixelRatio = this.renderer.getPixelRatio();\n\t\t\tthis._width = size.width;\n\t\t\tthis._height = size.height;\n\n\t\t\trenderTarget = this.renderTarget1.clone();\n\t\t\trenderTarget.setSize( this._width * this._pixelRatio, this._height * this._pixelRatio );\n\n\t\t}\n\n\t\tthis.renderTarget1.dispose();\n\t\tthis.renderTarget2.dispose();\n\t\tthis.renderTarget1 = renderTarget;\n\t\tthis.renderTarget2 = renderTarget.clone();\n\n\t\tthis.writeBuffer = this.renderTarget1;\n\t\tthis.readBuffer = this.renderTarget2;\n\n\t}\n\n\t/**\n\t * Resizes the internal read and write buffers as well as all passes. Similar to {@link WebGLRenderer#setSize},\n\t * this method honors the current pixel ration.\n\t *\n\t * @param {number} width - The width in logical pixels.\n\t * @param {number} height - The height in logical pixels.\n\t */\n\tsetSize( width, height ) {\n\n\t\tthis._width = width;\n\t\tthis._height = height;\n\n\t\tconst effectiveWidth = this._width * this._pixelRatio;\n\t\tconst effectiveHeight = this._height * this._pixelRatio;\n\n\t\tthis.renderTarget1.setSize( effectiveWidth, effectiveHeight );\n\t\tthis.renderTarget2.setSize( effectiveWidth, effectiveHeight );\n\n\t\tfor ( let i = 0; i < this.passes.length; i ++ ) {\n\n\t\t\tthis.passes[ i ].setSize( effectiveWidth, effectiveHeight );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets device pixel ratio. This is usually used for HiDPI device to prevent blurring output.\n\t * Setting the pixel ratio will automatically resize the composer.\n\t *\n\t * @param {number} pixelRatio - The pixel ratio to set.\n\t */\n\tsetPixelRatio( pixelRatio ) {\n\n\t\tthis._pixelRatio = pixelRatio;\n\n\t\tthis.setSize( this._width, this._height );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the composer is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.renderTarget1.dispose();\n\t\tthis.renderTarget2.dispose();\n\n\t\tthis.copyPass.dispose();\n\n\t}\n\n}\n\nexport { EffectComposer };\n", "/**\n * @module FilmShader\n * @three_import import { FilmShader } from 'three/addons/shaders/FilmShader.js';\n */\n\n/**\n * TODO\n *\n * Used by {@link FilmPass}.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst FilmShader = {\n\n\tname: 'FilmShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'time': { value: 0.0 },\n\t\t'intensity': { value: 0.5 },\n\t\t'grayscale': { value: false }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\t#include <common>\n\n\t\tuniform float intensity;\n\t\tuniform bool grayscale;\n\t\tuniform float time;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 base = texture2D( tDiffuse, vUv );\n\n\t\t\tfloat noise = rand( fract( vUv + time ) );\n\n\t\t\tvec3 color = base.rgb + base.rgb * clamp( 0.1 + noise, 0.0, 1.0 );\n\n\t\t\tcolor = mix( base.rgb, color, intensity );\n\n\t\t\tif ( grayscale ) {\n\n\t\t\t\tcolor = vec3( luminance( color ) ); // assuming linear-srgb\n\n\t\t\t}\n\n\t\t\tgl_FragColor = vec4( color, base.a );\n\n\t\t}`,\n\n};\n\nexport { FilmShader };\n", "import {\n\tShaderMaterial,\n\tUniformsUtils\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\nimport { FilmShader } from '../shaders/FilmShader.js';\n\n/**\n * This pass can be used to create a film grain effect.\n *\n * ```js\n * const filmPass = new FilmPass();\n * composer.addPass( filmPass );\n * ```\n *\n * @augments Pass\n * @three_import import { FilmPass } from 'three/addons/postprocessing/FilmPass.js';\n */\nclass FilmPass extends Pass {\n\n\t/**\n\t * Constructs a new film pass.\n\t *\n\t * @param {number} [intensity=0.5] - The grain intensity in the range `[0,1]` (0 = no effect, 1 = full effect).\n\t * @param {boolean} [grayscale=false] - Whether to apply a grayscale effect or not.\n\t */\n\tconstructor( intensity = 0.5, grayscale = false ) {\n\n\t\tsuper();\n\n\t\tconst shader = FilmShader;\n\n\t\t/**\n\t\t * The pass uniforms. Use this object if you want to update the\n\t\t * `intensity` or `grayscale` values at runtime.\n\t\t * ```js\n\t\t * pass.uniforms.intensity.value = 1;\n\t\t * pass.uniforms.grayscale.value = true;\n\t\t * ```\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.uniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t/**\n\t\t * The pass material.\n\t\t *\n\t\t * @type {ShaderMaterial}\n\t\t */\n\t\tthis.material = new ShaderMaterial( {\n\n\t\t\tname: shader.name,\n\t\t\tuniforms: this.uniforms,\n\t\t\tvertexShader: shader.vertexShader,\n\t\t\tfragmentShader: shader.fragmentShader\n\n\t\t} );\n\n\t\tthis.uniforms.intensity.value = intensity;\n\t\tthis.uniforms.grayscale.value = grayscale;\n\n\t\t// internals\n\n\t\tthis._fsQuad = new FullScreenQuad( this.material );\n\n\t}\n\n\t/**\n\t * Performs the film pass.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( renderer, writeBuffer, readBuffer, deltaTime /*, maskActive */ ) {\n\n\t\tthis.uniforms[ 'tDiffuse' ].value = readBuffer.texture;\n\t\tthis.uniforms[ 'time' ].value += deltaTime;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t} else {\n\n\t\t\trenderer.setRenderTarget( writeBuffer );\n\t\t\tif ( this.clear ) renderer.clear();\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the pass is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.material.dispose();\n\n\t\tthis._fsQuad.dispose();\n\n\t}\n\n}\n\nexport { FilmPass };\n", "/**\n * @module DigitalGlitch\n * @three_import import { DigitalGlitch } from 'three/addons/shaders/DigitalGlitch.js';\n */\n\n/**\n * Digital glitch shader.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst DigitalGlitch = {\n\n\tname: 'DigitalGlitch',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null }, //diffuse texture\n\t\t'tDisp': { value: null }, //displacement texture for digital glitch squares\n\t\t'byp': { value: 0 }, //apply the glitch ?\n\t\t'amount': { value: 0.08 },\n\t\t'angle': { value: 0.02 },\n\t\t'seed': { value: 0.02 },\n\t\t'seed_x': { value: 0.02 }, //-1,1\n\t\t'seed_y': { value: 0.02 }, //-1,1\n\t\t'distortion_x': { value: 0.5 },\n\t\t'distortion_y': { value: 0.6 },\n\t\t'col_s': { value: 0.05 }\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\t\tvoid main() {\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform int byp; //should we apply the glitch ?\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform sampler2D tDisp;\n\n\t\tuniform float amount;\n\t\tuniform float angle;\n\t\tuniform float seed;\n\t\tuniform float seed_x;\n\t\tuniform float seed_y;\n\t\tuniform float distortion_x;\n\t\tuniform float distortion_y;\n\t\tuniform float col_s;\n\n\t\tvarying vec2 vUv;\n\n\n\t\tfloat rand(vec2 co){\n\t\t\treturn fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);\n\t\t}\n\n\t\tvoid main() {\n\t\t\tif(byp<1) {\n\t\t\t\tvec2 p = vUv;\n\t\t\t\tfloat xs = floor(gl_FragCoord.x / 0.5);\n\t\t\t\tfloat ys = floor(gl_FragCoord.y / 0.5);\n\t\t\t\t//based on staffantans glitch shader for unity https://github.com/staffantan/unityglitch\n\t\t\t\tfloat disp = texture2D(tDisp, p*seed*seed).r;\n\t\t\t\tif(p.y<distortion_x+col_s && p.y>distortion_x-col_s*seed) {\n\t\t\t\t\tif(seed_x>0.){\n\t\t\t\t\t\tp.y = 1. - (p.y + distortion_y);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tp.y = distortion_y;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(p.x<distortion_y+col_s && p.x>distortion_y-col_s*seed) {\n\t\t\t\t\tif(seed_y>0.){\n\t\t\t\t\t\tp.x=distortion_x;\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tp.x = 1. - (p.x + distortion_x);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tp.x+=disp*seed_x*(seed/5.);\n\t\t\t\tp.y+=disp*seed_y*(seed/5.);\n\t\t\t\t//base from RGB shift shader\n\t\t\t\tvec2 offset = amount * vec2( cos(angle), sin(angle));\n\t\t\t\tvec4 cr = texture2D(tDiffuse, p + offset);\n\t\t\t\tvec4 cga = texture2D(tDiffuse, p);\n\t\t\t\tvec4 cb = texture2D(tDiffuse, p - offset);\n\t\t\t\tgl_FragColor = vec4(cr.r, cga.g, cb.b, cga.a);\n\t\t\t\t//add noise\n\t\t\t\tvec4 snow = 200.*amount*vec4(rand(vec2(xs * seed,ys * seed*50.))*0.2);\n\t\t\t\tgl_FragColor = gl_FragColor+ snow;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tgl_FragColor=texture2D (tDiffuse, vUv);\n\t\t\t}\n\t\t}`\n\n};\n\nexport { DigitalGlitch };\n", "import {\n\tDataTexture,\n\tFloatType,\n\tMathUtils,\n\tRedFormat,\n\tShaderMaterial,\n\tUniformsUtils\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\nimport { DigitalGlitch } from '../shaders/DigitalGlitch.js';\n\n/**\n * Pass for creating a glitch effect.\n *\n * ```js\n * const glitchPass = new GlitchPass();\n * composer.addPass( glitchPass );\n * ```\n *\n * @augments Pass\n * @three_import import { GlitchPass } from 'three/addons/postprocessing/GlitchPass.js';\n */\nclass GlitchPass extends Pass {\n\n\t/**\n\t * Constructs a new glitch pass.\n\t *\n\t * @param {number} [dt_size=64] - The size of the displacement texture\n\t * for digital glitch squares.\n\t */\n\tconstructor( dt_size = 64 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The pass uniforms.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.uniforms = UniformsUtils.clone( DigitalGlitch.uniforms );\n\n\t\t/**\n\t\t * The pass material.\n\t\t *\n\t\t * @type {ShaderMaterial}\n\t\t */\n\t\tthis.material = new ShaderMaterial( {\n\t\t\tuniforms: this.uniforms,\n\t\t\tvertexShader: DigitalGlitch.vertexShader,\n\t\t\tfragmentShader: DigitalGlitch.fragmentShader\n\t\t} );\n\n\t\t/**\n\t\t * Whether to noticeably increase the effect intensity or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.goWild = false;\n\n\t\t// internals\n\n\t\tthis._heightMap = this._generateHeightmap( dt_size );\n\t\tthis.uniforms[ 'tDisp' ].value = this._heightMap;\n\n\t\tthis._fsQuad = new FullScreenQuad( this.material );\n\n\t\tthis._curF = 0;\n\t\tthis._randX = 0;\n\n\t\tthis._generateTrigger();\n\n\t}\n\n\t/**\n\t * Performs the glitch pass.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\tthis.uniforms[ 'tDiffuse' ].value = readBuffer.texture;\n\t\tthis.uniforms[ 'seed' ].value = Math.random(); // default seeding\n\t\tthis.uniforms[ 'byp' ].value = 0;\n\n\t\tif ( this._curF % this._randX == 0 || this.goWild == true ) {\n\n\t\t\tthis.uniforms[ 'amount' ].value = Math.random() / 30;\n\t\t\tthis.uniforms[ 'angle' ].value = MathUtils.randFloat( - Math.PI, Math.PI );\n\t\t\tthis.uniforms[ 'seed_x' ].value = MathUtils.randFloat( - 1, 1 );\n\t\t\tthis.uniforms[ 'seed_y' ].value = MathUtils.randFloat( - 1, 1 );\n\t\t\tthis.uniforms[ 'distortion_x' ].value = MathUtils.randFloat( 0, 1 );\n\t\t\tthis.uniforms[ 'distortion_y' ].value = MathUtils.randFloat( 0, 1 );\n\t\t\tthis._curF = 0;\n\t\t\tthis._generateTrigger();\n\n\t\t} else if ( this._curF % this._randX < this._randX / 5 ) {\n\n\t\t\tthis.uniforms[ 'amount' ].value = Math.random() / 90;\n\t\t\tthis.uniforms[ 'angle' ].value = MathUtils.randFloat( - Math.PI, Math.PI );\n\t\t\tthis.uniforms[ 'distortion_x' ].value = MathUtils.randFloat( 0, 1 );\n\t\t\tthis.uniforms[ 'distortion_y' ].value = MathUtils.randFloat( 0, 1 );\n\t\t\tthis.uniforms[ 'seed_x' ].value = MathUtils.randFloat( - 0.3, 0.3 );\n\t\t\tthis.uniforms[ 'seed_y' ].value = MathUtils.randFloat( - 0.3, 0.3 );\n\n\t\t} else if ( this.goWild == false ) {\n\n\t\t\tthis.uniforms[ 'byp' ].value = 1;\n\n\t\t}\n\n\t\tthis._curF ++;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t} else {\n\n\t\t\trenderer.setRenderTarget( writeBuffer );\n\t\t\tif ( this.clear ) renderer.clear();\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the pass is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.material.dispose();\n\n\t\tthis._heightMap.dispose();\n\n\t\tthis._fsQuad.dispose();\n\n\t}\n\n\t// internals\n\n\t_generateTrigger() {\n\n\t\tthis._randX = MathUtils.randInt( 120, 240 );\n\n\t}\n\n\t_generateHeightmap( dt_size ) {\n\n\t\tconst data_arr = new Float32Array( dt_size * dt_size );\n\t\tconst length = dt_size * dt_size;\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tconst val = MathUtils.randFloat( 0, 1 );\n\t\t\tdata_arr[ i ] = val;\n\n\t\t}\n\n\t\tconst texture = new DataTexture( data_arr, dt_size, dt_size, RedFormat, FloatType );\n\t\ttexture.needsUpdate = true;\n\t\treturn texture;\n\n\t}\n\n}\n\nexport { GlitchPass };\n", "import {\n\tDataTexture,\n\tMatrix4,\n\tRepeatWrapping,\n\tVector2,\n\tVector3,\n} from 'three';\n\n/**\n * @module GTAOShader\n * @three_import import { GTAOShader } from 'three/addons/shaders/GTAOShader.js';\n */\n\n/**\n * GTAO shader. Use by {@link GTAOPass}.\n *\n * References:\n * - [Practical Realtime Strategies for Accurate Indirect Occlusion](https://iryoku.com/downloads/Practical-Realtime-Strategies-for-Accurate-Indirect-Occlusion.pdf).\n * - [Horizon-Based Indirect Lighting (HBIL)](https://github.com/Patapom/GodComplex/blob/master/Tests/TestHBIL/2018%20Mayaux%20-%20Horizon-Based%20Indirect%20Lighting%20(HBIL).pdf)\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst GTAOShader = {\n\n\tname: 'GTAOShader',\n\n\tdefines: {\n\t\tPERSPECTIVE_CAMERA: 1,\n\t\tSAMPLES: 16,\n\t\tNORMAL_VECTOR_TYPE: 1,\n\t\tDEPTH_SWIZZLING: 'x',\n\t\tSCREEN_SPACE_RADIUS: 0,\n\t\tSCREEN_SPACE_RADIUS_SCALE: 100.0,\n\t\tSCENE_CLIP_BOX: 0,\n\t},\n\n\tuniforms: {\n\t\ttNormal: { value: null },\n\t\ttDepth: { value: null },\n\t\ttNoise: { value: null },\n\t\tresolution: { value: new Vector2() },\n\t\tcameraNear: { value: null },\n\t\tcameraFar: { value: null },\n\t\tcameraProjectionMatrix: { value: new Matrix4() },\n\t\tcameraProjectionMatrixInverse: { value: new Matrix4() },\n\t\tcameraWorldMatrix: { value: new Matrix4() },\n\t\tradius: { value: 0.25 },\n\t\tdistanceExponent: { value: 1. },\n\t\tthickness: { value: 1. },\n\t\tdistanceFallOff: { value: 1. },\n\t\tscale: { value: 1. },\n\t\tsceneBoxMin: { value: new Vector3( - 1, - 1, - 1 ) },\n\t\tsceneBoxMax: { value: new Vector3( 1, 1, 1 ) },\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\t\tvarying vec2 vUv;\n\t\tuniform highp sampler2D tNormal;\n\t\tuniform highp sampler2D tDepth;\n\t\tuniform sampler2D tNoise;\n\t\tuniform vec2 resolution;\n\t\tuniform float cameraNear;\n\t\tuniform float cameraFar;\n\t\tuniform mat4 cameraProjectionMatrix;\n\t\tuniform mat4 cameraProjectionMatrixInverse;\n\t\tuniform mat4 cameraWorldMatrix;\n\t\tuniform float radius;\n\t\tuniform float distanceExponent;\n\t\tuniform float thickness;\n\t\tuniform float distanceFallOff;\n\t\tuniform float scale;\n\t\t#if SCENE_CLIP_BOX == 1\n\t\t\tuniform vec3 sceneBoxMin;\n\t\t\tuniform vec3 sceneBoxMax;\n\t\t#endif\n\n\t\t#include <common>\n\t\t#include <packing>\n\n\t\t#ifndef FRAGMENT_OUTPUT\n\t\t#define FRAGMENT_OUTPUT vec4(vec3(ao), 1.)\n\t\t#endif\n\n\t\tvec3 getViewPosition(const in vec2 screenPosition, const in float depth) {\n\t\t\tvec4 clipSpacePosition = vec4(vec3(screenPosition, depth) * 2.0 - 1.0, 1.0);\n\t\t\tvec4 viewSpacePosition = cameraProjectionMatrixInverse * clipSpacePosition;\n\t\t\treturn viewSpacePosition.xyz / viewSpacePosition.w;\n\t\t}\n\n\t\tfloat getDepth(const vec2 uv) {\n\t\t\treturn textureLod(tDepth, uv.xy, 0.0).DEPTH_SWIZZLING;\n\t\t}\n\n\t\tfloat fetchDepth(const ivec2 uv) {\n\t\t\treturn texelFetch(tDepth, uv.xy, 0).DEPTH_SWIZZLING;\n\t\t}\n\n\t\tfloat getViewZ(const in float depth) {\n\t\t\t#if PERSPECTIVE_CAMERA == 1\n\t\t\t\treturn perspectiveDepthToViewZ(depth, cameraNear, cameraFar);\n\t\t\t#else\n\t\t\t\treturn orthographicDepthToViewZ(depth, cameraNear, cameraFar);\n\t\t\t#endif\n\t\t}\n\n\t\tvec3 computeNormalFromDepth(const vec2 uv) {\n\t\t\tvec2 size = vec2(textureSize(tDepth, 0));\n\t\t\tivec2 p = ivec2(uv * size);\n\t\t\tfloat c0 = fetchDepth(p);\n\t\t\tfloat l2 = fetchDepth(p - ivec2(2, 0));\n\t\t\tfloat l1 = fetchDepth(p - ivec2(1, 0));\n\t\t\tfloat r1 = fetchDepth(p + ivec2(1, 0));\n\t\t\tfloat r2 = fetchDepth(p + ivec2(2, 0));\n\t\t\tfloat b2 = fetchDepth(p - ivec2(0, 2));\n\t\t\tfloat b1 = fetchDepth(p - ivec2(0, 1));\n\t\t\tfloat t1 = fetchDepth(p + ivec2(0, 1));\n\t\t\tfloat t2 = fetchDepth(p + ivec2(0, 2));\n\t\t\tfloat dl = abs((2.0 * l1 - l2) - c0);\n\t\t\tfloat dr = abs((2.0 * r1 - r2) - c0);\n\t\t\tfloat db = abs((2.0 * b1 - b2) - c0);\n\t\t\tfloat dt = abs((2.0 * t1 - t2) - c0);\n\t\t\tvec3 ce = getViewPosition(uv, c0).xyz;\n\t\t\tvec3 dpdx = (dl < dr) ? ce - getViewPosition((uv - vec2(1.0 / size.x, 0.0)), l1).xyz : -ce + getViewPosition((uv + vec2(1.0 / size.x, 0.0)), r1).xyz;\n\t\t\tvec3 dpdy = (db < dt) ? ce - getViewPosition((uv - vec2(0.0, 1.0 / size.y)), b1).xyz : -ce + getViewPosition((uv + vec2(0.0, 1.0 / size.y)), t1).xyz;\n\t\t\treturn normalize(cross(dpdx, dpdy));\n\t\t}\n\n\t\tvec3 getViewNormal(const vec2 uv) {\n\t\t\t#if NORMAL_VECTOR_TYPE == 2\n\t\t\t\treturn normalize(textureLod(tNormal, uv, 0.).rgb);\n\t\t\t#elif NORMAL_VECTOR_TYPE == 1\n\t\t\t\treturn unpackRGBToNormal(textureLod(tNormal, uv, 0.).rgb);\n\t\t\t#else\n\t\t\t\treturn computeNormalFromDepth(uv);\n\t\t\t#endif\n\t\t}\n\n\t\tvec3 getSceneUvAndDepth(vec3 sampleViewPos) {\n\t\t\tvec4 sampleClipPos = cameraProjectionMatrix * vec4(sampleViewPos, 1.);\n\t\t\tvec2 sampleUv = sampleClipPos.xy / sampleClipPos.w * 0.5 + 0.5;\n\t\t\tfloat sampleSceneDepth = getDepth(sampleUv);\n\t\t\treturn vec3(sampleUv, sampleSceneDepth);\n\t\t}\n\n\t\tvoid main() {\n\t\t\tfloat depth = getDepth(vUv.xy);\n\t\t\tif (depth >= 1.0) {\n\t\t\t\tdiscard;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvec3 viewPos = getViewPosition(vUv, depth);\n\t\t\tvec3 viewNormal = getViewNormal(vUv);\n\n\t\t\tfloat radiusToUse = radius;\n\t\t\tfloat distanceFalloffToUse = thickness;\n\t\t\t#if SCREEN_SPACE_RADIUS == 1\n\t\t\t\tfloat radiusScale = getViewPosition(vec2(0.5 + float(SCREEN_SPACE_RADIUS_SCALE) / resolution.x, 0.0), depth).x;\n\t\t\t\tradiusToUse *= radiusScale;\n\t\t\t\tdistanceFalloffToUse *= radiusScale;\n\t\t\t#endif\n\n\t\t\t#if SCENE_CLIP_BOX == 1\n\t\t\t\tvec3 worldPos = (cameraWorldMatrix * vec4(viewPos, 1.0)).xyz;\n\t\t\t\tfloat boxDistance = length(max(vec3(0.0), max(sceneBoxMin - worldPos, worldPos - sceneBoxMax)));\n\t\t\t\tif (boxDistance > radiusToUse) {\n\t\t\t\t\tdiscard;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t#endif\n\n\t\t\tvec2 noiseResolution = vec2(textureSize(tNoise, 0));\n\t\t\tvec2 noiseUv = vUv * resolution / noiseResolution;\n\t\t\tvec4 noiseTexel = textureLod(tNoise, noiseUv, 0.0);\n\t\t\tvec3 randomVec = noiseTexel.xyz * 2.0 - 1.0;\n\t\t\tvec3 tangent = normalize(vec3(randomVec.xy, 0.));\n\t\t\tvec3 bitangent = vec3(-tangent.y, tangent.x, 0.);\n\t\t\tmat3 kernelMatrix = mat3(tangent, bitangent, vec3(0., 0., 1.));\n\n\t\t\tconst int DIRECTIONS = SAMPLES < 30 ? 3 : 5;\n\t\t\tconst int STEPS = (SAMPLES + DIRECTIONS - 1) / DIRECTIONS;\n\t\t\tfloat ao = 0.0;\n\t\t\tfor (int i = 0; i < DIRECTIONS; ++i) {\n\n\t\t\t\tfloat angle = float(i) / float(DIRECTIONS) * PI;\n\t\t\t\tvec4 sampleDir = vec4(cos(angle), sin(angle), 0., 0.5 + 0.5 * noiseTexel.w);\n\t\t\t\tsampleDir.xyz = normalize(kernelMatrix * sampleDir.xyz);\n\n\t\t\t\tvec3 viewDir = normalize(-viewPos.xyz);\n\t\t\t\tvec3 sliceBitangent = normalize(cross(sampleDir.xyz, viewDir));\n\t\t\t\tvec3 sliceTangent = cross(sliceBitangent, viewDir);\n\t\t\t\tvec3 normalInSlice = normalize(viewNormal - sliceBitangent * dot(viewNormal, sliceBitangent));\n\n\t\t\t\tvec3 tangentToNormalInSlice = cross(normalInSlice, sliceBitangent);\n\t\t\t\tvec2 cosHorizons = vec2(dot(viewDir, tangentToNormalInSlice), dot(viewDir, -tangentToNormalInSlice));\n\n\t\t\t\tfor (int j = 0; j < STEPS; ++j) {\n\t\t\t\t\tvec3 sampleViewOffset = sampleDir.xyz * radiusToUse * sampleDir.w * pow(float(j + 1) / float(STEPS), distanceExponent);\n\n\t\t\t\t\tvec3 sampleSceneUvDepth = getSceneUvAndDepth(viewPos + sampleViewOffset);\n\t\t\t\t\tvec3 sampleSceneViewPos = getViewPosition(sampleSceneUvDepth.xy, sampleSceneUvDepth.z);\n\t\t\t\t\tvec3 viewDelta = sampleSceneViewPos - viewPos;\n\t\t\t\t\tif (abs(viewDelta.z) < thickness) {\n\t\t\t\t\t\tfloat sampleCosHorizon = dot(viewDir, normalize(viewDelta));\n\t\t\t\t\t\tcosHorizons.x += max(0., (sampleCosHorizon - cosHorizons.x) * mix(1., 2. / float(j + 2), distanceFallOff));\n\t\t\t\t\t}\n\n\t\t\t\t\tsampleSceneUvDepth = getSceneUvAndDepth(viewPos - sampleViewOffset);\n\t\t\t\t\tsampleSceneViewPos = getViewPosition(sampleSceneUvDepth.xy, sampleSceneUvDepth.z);\n\t\t\t\t\tviewDelta = sampleSceneViewPos - viewPos;\n\t\t\t\t\tif (abs(viewDelta.z) < thickness) {\n\t\t\t\t\t\tfloat sampleCosHorizon = dot(viewDir, normalize(viewDelta));\n\t\t\t\t\t\tcosHorizons.y += max(0., (sampleCosHorizon - cosHorizons.y) * mix(1., 2. / float(j + 2), distanceFallOff));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tvec2 sinHorizons = sqrt(1. - cosHorizons * cosHorizons);\n\t\t\t\tfloat nx = dot(normalInSlice, sliceTangent);\n\t\t\t\tfloat ny = dot(normalInSlice, viewDir);\n\t\t\t\tfloat nxb = 1. / 2. * (acos(cosHorizons.y) - acos(cosHorizons.x) + sinHorizons.x * cosHorizons.x - sinHorizons.y * cosHorizons.y);\n\t\t\t\tfloat nyb = 1. / 2. * (2. - cosHorizons.x * cosHorizons.x - cosHorizons.y * cosHorizons.y);\n\t\t\t\tfloat occlusion = nx * nxb + ny * nyb;\n\t\t\t\tao += occlusion;\n\t\t\t}\n\n\t\t\tao = clamp(ao / float(DIRECTIONS), 0., 1.);\n\t\t#if SCENE_CLIP_BOX == 1\n\t\t\tao = mix(ao, 1., smoothstep(0., radiusToUse, boxDistance));\n\t\t#endif\n\t\t\tao = pow(ao, scale);\n\n\t\t\tgl_FragColor = FRAGMENT_OUTPUT;\n\t\t}`\n\n};\n\n/**\n * GTAO depth shader. Use by {@link GTAOPass}.\n *\n * @constant\n * @type {Object}\n */\nconst GTAODepthShader = {\n\n\tname: 'GTAODepthShader',\n\n\tdefines: {\n\t\tPERSPECTIVE_CAMERA: 1\n\t},\n\n\tuniforms: {\n\t\ttDepth: { value: null },\n\t\tcameraNear: { value: null },\n\t\tcameraFar: { value: null },\n\t},\n\n\tvertexShader: /* glsl */`\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\t\tuniform sampler2D tDepth;\n\t\tuniform float cameraNear;\n\t\tuniform float cameraFar;\n\t\tvarying vec2 vUv;\n\n\t\t#include <packing>\n\n\t\tfloat getLinearDepth( const in vec2 screenPosition ) {\n\t\t\t#if PERSPECTIVE_CAMERA == 1\n\t\t\t\tfloat fragCoordZ = texture2D( tDepth, screenPosition ).x;\n\t\t\t\tfloat viewZ = perspectiveDepthToViewZ( fragCoordZ, cameraNear, cameraFar );\n\t\t\t\treturn viewZToOrthographicDepth( viewZ, cameraNear, cameraFar );\n\t\t\t#else\n\t\t\t\treturn texture2D( tDepth, screenPosition ).x;\n\t\t\t#endif\n\t\t}\n\n\t\tvoid main() {\n\t\t\tfloat depth = getLinearDepth( vUv );\n\t\t\tgl_FragColor = vec4( vec3( 1.0 - depth ), 1.0 );\n\n\t\t}`\n\n};\n\n/**\n * GTAO blend shader. Use by {@link GTAOPass}.\n *\n * @constant\n * @type {Object}\n */\nconst GTAOBlendShader = {\n\n\tname: 'GTAOBlendShader',\n\n\tuniforms: {\n\t\ttDiffuse: { value: null },\n\t\tintensity: { value: 1.0 }\n\t},\n\n\tvertexShader: /* glsl */`\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\t\tuniform float intensity;\n\t\tuniform sampler2D tDiffuse;\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\t\t\tgl_FragColor = vec4(mix(vec3(1.), texel.rgb, intensity), texel.a);\n\t\t}`\n\n};\n\n\nfunction generateMagicSquareNoise( size = 5 ) {\n\n\tconst noiseSize = Math.floor( size ) % 2 === 0 ? Math.floor( size ) + 1 : Math.floor( size );\n\tconst magicSquare = generateMagicSquare( noiseSize );\n\tconst noiseSquareSize = magicSquare.length;\n\tconst data = new Uint8Array( noiseSquareSize * 4 );\n\n\tfor ( let inx = 0; inx < noiseSquareSize; ++ inx ) {\n\n\t\tconst iAng = magicSquare[ inx ];\n\t\tconst angle = ( 2 * Math.PI * iAng ) / noiseSquareSize;\n\t\tconst randomVec = new Vector3(\n\t\t\tMath.cos( angle ),\n\t\t\tMath.sin( angle ),\n\t\t\t0\n\t\t).normalize();\n\t\tdata[ inx * 4 ] = ( randomVec.x * 0.5 + 0.5 ) * 255;\n\t\tdata[ inx * 4 + 1 ] = ( randomVec.y * 0.5 + 0.5 ) * 255;\n\t\tdata[ inx * 4 + 2 ] = 127;\n\t\tdata[ inx * 4 + 3 ] = 255;\n\n\t}\n\n\tconst noiseTexture = new DataTexture( data, noiseSize, noiseSize );\n\tnoiseTexture.wrapS = RepeatWrapping;\n\tnoiseTexture.wrapT = RepeatWrapping;\n\tnoiseTexture.needsUpdate = true;\n\n\treturn noiseTexture;\n\n}\n\nfunction generateMagicSquare( size ) {\n\n\tconst noiseSize = Math.floor( size ) % 2 === 0 ? Math.floor( size ) + 1 : Math.floor( size );\n\tconst noiseSquareSize = noiseSize * noiseSize;\n\tconst magicSquare = Array( noiseSquareSize ).fill( 0 );\n\tlet i = Math.floor( noiseSize / 2 );\n\tlet j = noiseSize - 1;\n\n\tfor ( let num = 1; num <= noiseSquareSize; ) {\n\n\t\tif ( i === - 1 && j === noiseSize ) {\n\n\t\t\tj = noiseSize - 2;\n\t\t\ti = 0;\n\n\t\t} else {\n\n\t\t\tif ( j === noiseSize ) {\n\n\t\t\t\tj = 0;\n\n\t\t\t}\n\n\t\t\tif ( i < 0 ) {\n\n\t\t\t\ti = noiseSize - 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( magicSquare[ i * noiseSize + j ] !== 0 ) {\n\n\t\t\tj -= 2;\n\t\t\ti ++;\n\t\t\tcontinue;\n\n\t\t} else {\n\n\t\t\tmagicSquare[ i * noiseSize + j ] = num ++;\n\n\t\t}\n\n\t\tj ++;\n\t\ti --;\n\n\t}\n\n\treturn magicSquare;\n\n}\n\n\nexport { generateMagicSquareNoise, GTAOShader, GTAODepthShader, GTAOBlendShader };\n", "import {\n\tMatrix4,\n\tVector2,\n\tVector3,\n} from 'three';\n\n/**\n * @module PoissonDenoiseShader\n * @three_import import { PoissonDenoiseShader } from 'three/addons/shaders/PoissonDenoiseShader.js';\n */\n\n/**\n * Poisson Denoise Shader.\n *\n * References:\n * - [Self-Supervised Poisson-Gaussian Denoising](https://openaccess.thecvf.com/content/WACV2021/papers/Khademi_Self-Supervised_Poisson-Gaussian_Denoising_WACV_2021_paper.pdf).\n * - [Poisson2Sparse: Self-Supervised Poisson Denoising From a Single Image](https://arxiv.org/pdf/2206.01856.pdf)\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst PoissonDenoiseShader = {\n\n\tname: 'PoissonDenoiseShader',\n\n\tdefines: {\n\t\t'SAMPLES': 16,\n\t\t'SAMPLE_VECTORS': generatePdSamplePointInitializer( 16, 2, 1 ),\n\t\t'NORMAL_VECTOR_TYPE': 1,\n\t\t'DEPTH_VALUE_SOURCE': 0,\n\t},\n\n\tuniforms: {\n\t\t'tDiffuse': { value: null },\n\t\t'tNormal': { value: null },\n\t\t'tDepth': { value: null },\n\t\t'tNoise': { value: null },\n\t\t'resolution': { value: new Vector2() },\n\t\t'cameraProjectionMatrixInverse': { value: new Matrix4() },\n\t\t'lumaPhi': { value: 5. },\n\t\t'depthPhi': { value: 5. },\n\t\t'normalPhi': { value: 5. },\n\t\t'radius': { value: 4. },\n\t\t'index': { value: 0 }\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform sampler2D tNormal;\n\t\tuniform sampler2D tDepth;\n\t\tuniform sampler2D tNoise;\n\t\tuniform vec2 resolution;\n\t\tuniform mat4 cameraProjectionMatrixInverse;\n\t\tuniform float lumaPhi;\n\t\tuniform float depthPhi;\n\t\tuniform float normalPhi;\n\t\tuniform float radius;\n\t\tuniform int index;\n\n\t\t#include <common>\n\t\t#include <packing>\n\n\t\t#ifndef SAMPLE_LUMINANCE\n\t\t#define SAMPLE_LUMINANCE dot(vec3(0.2125, 0.7154, 0.0721), a)\n\t\t#endif\n\n\t\t#ifndef FRAGMENT_OUTPUT\n\t\t#define FRAGMENT_OUTPUT vec4(denoised, 1.)\n\t\t#endif\n\n\t\tfloat getLuminance(const in vec3 a) {\n\t\t\treturn SAMPLE_LUMINANCE;\n\t\t}\n\n\t\tconst vec3 poissonDisk[SAMPLES] = SAMPLE_VECTORS;\n\n\t\tvec3 getViewPosition(const in vec2 screenPosition, const in float depth) {\n\t\t\tvec4 clipSpacePosition = vec4(vec3(screenPosition, depth) * 2.0 - 1.0, 1.0);\n\t\t\tvec4 viewSpacePosition = cameraProjectionMatrixInverse * clipSpacePosition;\n\t\t\treturn viewSpacePosition.xyz / viewSpacePosition.w;\n\t\t}\n\n\t\tfloat getDepth(const vec2 uv) {\n\t\t#if DEPTH_VALUE_SOURCE == 1\n\t\t\treturn textureLod(tDepth, uv.xy, 0.0).a;\n\t\t#else\n\t\t\treturn textureLod(tDepth, uv.xy, 0.0).r;\n\t\t#endif\n\t\t}\n\n\t\tfloat fetchDepth(const ivec2 uv) {\n\t\t\t#if DEPTH_VALUE_SOURCE == 1\n\t\t\t\treturn texelFetch(tDepth, uv.xy, 0).a;\n\t\t\t#else\n\t\t\t\treturn texelFetch(tDepth, uv.xy, 0).r;\n\t\t\t#endif\n\t\t}\n\n\t\tvec3 computeNormalFromDepth(const vec2 uv) {\n\t\t\tvec2 size = vec2(textureSize(tDepth, 0));\n\t\t\tivec2 p = ivec2(uv * size);\n\t\t\tfloat c0 = fetchDepth(p);\n\t\t\tfloat l2 = fetchDepth(p - ivec2(2, 0));\n\t\t\tfloat l1 = fetchDepth(p - ivec2(1, 0));\n\t\t\tfloat r1 = fetchDepth(p + ivec2(1, 0));\n\t\t\tfloat r2 = fetchDepth(p + ivec2(2, 0));\n\t\t\tfloat b2 = fetchDepth(p - ivec2(0, 2));\n\t\t\tfloat b1 = fetchDepth(p - ivec2(0, 1));\n\t\t\tfloat t1 = fetchDepth(p + ivec2(0, 1));\n\t\t\tfloat t2 = fetchDepth(p + ivec2(0, 2));\n\t\t\tfloat dl = abs((2.0 * l1 - l2) - c0);\n\t\t\tfloat dr = abs((2.0 * r1 - r2) - c0);\n\t\t\tfloat db = abs((2.0 * b1 - b2) - c0);\n\t\t\tfloat dt = abs((2.0 * t1 - t2) - c0);\n\t\t\tvec3 ce = getViewPosition(uv, c0).xyz;\n\t\t\tvec3 dpdx = (dl < dr) ?  ce - getViewPosition((uv - vec2(1.0 / size.x, 0.0)), l1).xyz\n\t\t\t\t\t\t\t\t\t: -ce + getViewPosition((uv + vec2(1.0 / size.x, 0.0)), r1).xyz;\n\t\t\tvec3 dpdy = (db < dt) ?  ce - getViewPosition((uv - vec2(0.0, 1.0 / size.y)), b1).xyz\n\t\t\t\t\t\t\t\t\t: -ce + getViewPosition((uv + vec2(0.0, 1.0 / size.y)), t1).xyz;\n\t\t\treturn normalize(cross(dpdx, dpdy));\n\t\t}\n\n\t\tvec3 getViewNormal(const vec2 uv) {\n\t\t#if NORMAL_VECTOR_TYPE == 2\n\t\t\treturn normalize(textureLod(tNormal, uv, 0.).rgb);\n\t\t#elif NORMAL_VECTOR_TYPE == 1\n\t\t\treturn unpackRGBToNormal(textureLod(tNormal, uv, 0.).rgb);\n\t\t#else\n\t\t\treturn computeNormalFromDepth(uv);\n\t\t#endif\n\t\t}\n\n\t\tvoid denoiseSample(in vec3 center, in vec3 viewNormal, in vec3 viewPos, in vec2 sampleUv, inout vec3 denoised, inout float totalWeight) {\n\t\t\tvec4 sampleTexel = textureLod(tDiffuse, sampleUv, 0.0);\n\t\t\tfloat sampleDepth = getDepth(sampleUv);\n\t\t\tvec3 sampleNormal = getViewNormal(sampleUv);\n\t\t\tvec3 neighborColor = sampleTexel.rgb;\n\t\t\tvec3 viewPosSample = getViewPosition(sampleUv, sampleDepth);\n\n\t\t\tfloat normalDiff = dot(viewNormal, sampleNormal);\n\t\t\tfloat normalSimilarity = pow(max(normalDiff, 0.), normalPhi);\n\t\t\tfloat lumaDiff = abs(getLuminance(neighborColor) - getLuminance(center));\n\t\t\tfloat lumaSimilarity = max(1.0 - lumaDiff / lumaPhi, 0.0);\n\t\t\tfloat depthDiff = abs(dot(viewPos - viewPosSample, viewNormal));\n\t\t\tfloat depthSimilarity = max(1. - depthDiff / depthPhi, 0.);\n\t\t\tfloat w = lumaSimilarity * depthSimilarity * normalSimilarity;\n\n\t\t\tdenoised += w * neighborColor;\n\t\t\ttotalWeight += w;\n\t\t}\n\n\t\tvoid main() {\n\t\t\tfloat depth = getDepth(vUv.xy);\n\t\t\tvec3 viewNormal = getViewNormal(vUv);\n\t\t\tif (depth == 1. || dot(viewNormal, viewNormal) == 0.) {\n\t\t\t\tdiscard;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvec4 texel = textureLod(tDiffuse, vUv, 0.0);\n\t\t\tvec3 center = texel.rgb;\n\t\t\tvec3 viewPos = getViewPosition(vUv, depth);\n\n\t\t\tvec2 noiseResolution = vec2(textureSize(tNoise, 0));\n\t\t\tvec2 noiseUv = vUv * resolution / noiseResolution;\n\t\t\tvec4 noiseTexel = textureLod(tNoise, noiseUv, 0.0);\n      \t\tvec2 noiseVec = vec2(sin(noiseTexel[index % 4] * 2. * PI), cos(noiseTexel[index % 4] * 2. * PI));\n    \t\tmat2 rotationMatrix = mat2(noiseVec.x, -noiseVec.y, noiseVec.x, noiseVec.y);\n\n\t\t\tfloat totalWeight = 1.0;\n\t\t\tvec3 denoised = texel.rgb;\n\t\t\tfor (int i = 0; i < SAMPLES; i++) {\n\t\t\t\tvec3 sampleDir = poissonDisk[i];\n\t\t\t\tvec2 offset = rotationMatrix * (sampleDir.xy * (1. + sampleDir.z * (radius - 1.)) / resolution);\n\t\t\t\tvec2 sampleUv = vUv + offset;\n\t\t\t\tdenoiseSample(center, viewNormal, viewPos, sampleUv, denoised, totalWeight);\n\t\t\t}\n\n\t\t\tif (totalWeight > 0.) {\n\t\t\t\tdenoised /= totalWeight;\n\t\t\t}\n\t\t\tgl_FragColor = FRAGMENT_OUTPUT;\n\t\t}`\n\n};\n\nfunction generatePdSamplePointInitializer( samples, rings, radiusExponent ) {\n\n\tconst poissonDisk = generateDenoiseSamples(\n\t\tsamples,\n\t\trings,\n\t\tradiusExponent,\n\t);\n\n\tlet glslCode = 'vec3[SAMPLES](';\n\n\tfor ( let i = 0; i < samples; i ++ ) {\n\n\t\tconst sample = poissonDisk[ i ];\n\t\tglslCode += `vec3(${sample.x}, ${sample.y}, ${sample.z})${( i < samples - 1 ) ? ',' : ')'}`;\n\n\t}\n\n\treturn glslCode;\n\n}\n\nfunction generateDenoiseSamples( numSamples, numRings, radiusExponent ) {\n\n\tconst samples = [];\n\n\tfor ( let i = 0; i < numSamples; i ++ ) {\n\n\t\tconst angle = 2 * Math.PI * numRings * i / numSamples;\n\t\tconst radius = Math.pow( i / ( numSamples - 1 ), radiusExponent );\n\t\tsamples.push( new Vector3( Math.cos( angle ), Math.sin( angle ), radius ) );\n\n\t}\n\n\treturn samples;\n\n}\n\nexport { generatePdSamplePointInitializer, PoissonDenoiseShader };\n", "import {\n\tAddEquation,\n\tColor,\n\tCustomBlending,\n\tDataTexture,\n\tDepthTexture,\n\tDepthStencilFormat,\n\tDstAlphaFactor,\n\tDstColorFactor,\n\tHalfFloatType,\n\tMeshNormalMaterial,\n\tNearestFilter,\n\tNoBlending,\n\tRepeatWrapping,\n\tRGBAFormat,\n\tShaderMaterial,\n\tUniformsUtils,\n\tUnsignedByteType,\n\tUnsignedInt248Type,\n\tWebGLRenderTarget,\n\tZeroFactor\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\nimport { generateMagicSquareNoise, GTAOShader, GTAODepthShader, GTAOBlendShader } from '../shaders/GTAOShader.js';\nimport { generatePdSamplePointInitializer, PoissonDenoiseShader } from '../shaders/PoissonDenoiseShader.js';\nimport { CopyShader } from '../shaders/CopyShader.js';\nimport { SimplexNoise } from '../math/SimplexNoise.js';\n\n/**\n * A pass for an GTAO effect.\n *\n * `GTAOPass` provides better quality than {@link SSAOPass} but is also more expensive.\n *\n * ```js\n * const gtaoPass = new GTAOPass( scene, camera, width, height );\n * gtaoPass.output = GTAOPass.OUTPUT.Denoise;\n * composer.addPass( gtaoPass );\n * ```\n *\n * @augments Pass\n * @three_import import { GTAOPass } from 'three/addons/postprocessing/GTAOPass.js';\n */\nclass GTAOPass extends Pass {\n\n\t/**\n\t * Constructs a new GTAO pass.\n\t *\n\t * @param {Scene} scene - The scene to compute the AO for.\n\t * @param {Camera} camera - The camera.\n\t * @param {number} [width=512] - The width of the effect.\n\t * @param {number} [height=512] - The height of the effect.\n\t * @param {Object} [parameters] - The pass parameters.\n\t * @param {Object} [aoParameters] - The AO parameters.\n\t * @param {Object} [pdParameters] - The denoise parameters.\n\t */\n\tconstructor( scene, camera, width = 512, height = 512, parameters, aoParameters, pdParameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The width of the effect.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 512\n\t\t */\n\t\tthis.width = width;\n\n\t\t/**\n\t\t * The height of the effect.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 512\n\t\t */\n\t\tthis.height = height;\n\n\t\t/**\n\t\t * Overwritten to perform a clear operation by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.clear = true;\n\n\t\t/**\n\t\t * The camera.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = camera;\n\n\t\t/**\n\t\t * The scene to render the AO for.\n\t\t *\n\t\t * @type {Scene}\n\t\t */\n\t\tthis.scene = scene;\n\n\t\t/**\n\t\t * The output configuration.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.output = 0;\n\t\tthis._renderGBuffer = true;\n\t\tthis._visibilityCache = [];\n\n\t\t/**\n\t\t * The AO blend intensity.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.blendIntensity = 1.;\n\n\t\t/**\n\t\t * The number of Poisson Denoise rings.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2\n\t\t */\n\t\tthis.pdRings = 2.;\n\n\t\t/**\n\t\t * The Poisson Denoise radius exponent.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2\n\t\t */\n\t\tthis.pdRadiusExponent = 2.;\n\n\t\t/**\n\t\t * The Poisson Denoise sample count.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 16\n\t\t */\n\t\tthis.pdSamples = 16;\n\n\t\tthis.gtaoNoiseTexture = generateMagicSquareNoise();\n\t\tthis.pdNoiseTexture = this._generateNoise();\n\n\t\tthis.gtaoRenderTarget = new WebGLRenderTarget( this.width, this.height, { type: HalfFloatType } );\n\t\tthis.pdRenderTarget = this.gtaoRenderTarget.clone();\n\n\t\tthis.gtaoMaterial = new ShaderMaterial( {\n\t\t\tdefines: Object.assign( {}, GTAOShader.defines ),\n\t\t\tuniforms: UniformsUtils.clone( GTAOShader.uniforms ),\n\t\t\tvertexShader: GTAOShader.vertexShader,\n\t\t\tfragmentShader: GTAOShader.fragmentShader,\n\t\t\tblending: NoBlending,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t} );\n\t\tthis.gtaoMaterial.defines.PERSPECTIVE_CAMERA = this.camera.isPerspectiveCamera ? 1 : 0;\n\t\tthis.gtaoMaterial.uniforms.tNoise.value = this.gtaoNoiseTexture;\n\t\tthis.gtaoMaterial.uniforms.resolution.value.set( this.width, this.height );\n\t\tthis.gtaoMaterial.uniforms.cameraNear.value = this.camera.near;\n\t\tthis.gtaoMaterial.uniforms.cameraFar.value = this.camera.far;\n\n\t\tthis.normalMaterial = new MeshNormalMaterial();\n\t\tthis.normalMaterial.blending = NoBlending;\n\n\t\tthis.pdMaterial = new ShaderMaterial( {\n\t\t\tdefines: Object.assign( {}, PoissonDenoiseShader.defines ),\n\t\t\tuniforms: UniformsUtils.clone( PoissonDenoiseShader.uniforms ),\n\t\t\tvertexShader: PoissonDenoiseShader.vertexShader,\n\t\t\tfragmentShader: PoissonDenoiseShader.fragmentShader,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t} );\n\t\tthis.pdMaterial.uniforms.tDiffuse.value = this.gtaoRenderTarget.texture;\n\t\tthis.pdMaterial.uniforms.tNoise.value = this.pdNoiseTexture;\n\t\tthis.pdMaterial.uniforms.resolution.value.set( this.width, this.height );\n\t\tthis.pdMaterial.uniforms.lumaPhi.value = 10;\n\t\tthis.pdMaterial.uniforms.depthPhi.value = 2;\n\t\tthis.pdMaterial.uniforms.normalPhi.value = 3;\n\t\tthis.pdMaterial.uniforms.radius.value = 8;\n\n\t\tthis.depthRenderMaterial = new ShaderMaterial( {\n\t\t\tdefines: Object.assign( {}, GTAODepthShader.defines ),\n\t\t\tuniforms: UniformsUtils.clone( GTAODepthShader.uniforms ),\n\t\t\tvertexShader: GTAODepthShader.vertexShader,\n\t\t\tfragmentShader: GTAODepthShader.fragmentShader,\n\t\t\tblending: NoBlending\n\t\t} );\n\t\tthis.depthRenderMaterial.uniforms.cameraNear.value = this.camera.near;\n\t\tthis.depthRenderMaterial.uniforms.cameraFar.value = this.camera.far;\n\n\t\tthis.copyMaterial = new ShaderMaterial( {\n\t\t\tuniforms: UniformsUtils.clone( CopyShader.uniforms ),\n\t\t\tvertexShader: CopyShader.vertexShader,\n\t\t\tfragmentShader: CopyShader.fragmentShader,\n\t\t\ttransparent: true,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\tblendSrc: DstColorFactor,\n\t\t\tblendDst: ZeroFactor,\n\t\t\tblendEquation: AddEquation,\n\t\t\tblendSrcAlpha: DstAlphaFactor,\n\t\t\tblendDstAlpha: ZeroFactor,\n\t\t\tblendEquationAlpha: AddEquation\n\t\t} );\n\n\t\tthis.blendMaterial = new ShaderMaterial( {\n\t\t\tuniforms: UniformsUtils.clone( GTAOBlendShader.uniforms ),\n\t\t\tvertexShader: GTAOBlendShader.vertexShader,\n\t\t\tfragmentShader: GTAOBlendShader.fragmentShader,\n\t\t\ttransparent: true,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\tblending: CustomBlending,\n\t\t\tblendSrc: DstColorFactor,\n\t\t\tblendDst: ZeroFactor,\n\t\t\tblendEquation: AddEquation,\n\t\t\tblendSrcAlpha: DstAlphaFactor,\n\t\t\tblendDstAlpha: ZeroFactor,\n\t\t\tblendEquationAlpha: AddEquation\n\t\t} );\n\n\t\tthis._fsQuad = new FullScreenQuad( null );\n\n\t\tthis._originalClearColor = new Color();\n\n\t\tthis.setGBuffer( parameters ? parameters.depthTexture : undefined, parameters ? parameters.normalTexture : undefined );\n\n\t\tif ( aoParameters !== undefined ) {\n\n\t\t\tthis.updateGtaoMaterial( aoParameters );\n\n\t\t}\n\n\t\tif ( pdParameters !== undefined ) {\n\n\t\t\tthis.updatePdMaterial( pdParameters );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the size of the pass.\n\t *\n\t * @param {number} width - The width to set.\n\t * @param {number} height - The height to set.\n\t */\n\tsetSize( width, height ) {\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t\tthis.gtaoRenderTarget.setSize( width, height );\n\t\tthis.normalRenderTarget.setSize( width, height );\n\t\tthis.pdRenderTarget.setSize( width, height );\n\n\t\tthis.gtaoMaterial.uniforms.resolution.value.set( width, height );\n\t\tthis.gtaoMaterial.uniforms.cameraProjectionMatrix.value.copy( this.camera.projectionMatrix );\n\t\tthis.gtaoMaterial.uniforms.cameraProjectionMatrixInverse.value.copy( this.camera.projectionMatrixInverse );\n\n\t\tthis.pdMaterial.uniforms.resolution.value.set( width, height );\n\t\tthis.pdMaterial.uniforms.cameraProjectionMatrixInverse.value.copy( this.camera.projectionMatrixInverse );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the pass is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.gtaoNoiseTexture.dispose();\n\t\tthis.pdNoiseTexture.dispose();\n\t\tthis.normalRenderTarget.dispose();\n\t\tthis.gtaoRenderTarget.dispose();\n\t\tthis.pdRenderTarget.dispose();\n\t\tthis.normalMaterial.dispose();\n\t\tthis.pdMaterial.dispose();\n\t\tthis.copyMaterial.dispose();\n\t\tthis.depthRenderMaterial.dispose();\n\t\tthis._fsQuad.dispose();\n\n\t}\n\n\t/**\n\t * A texture holding the computed AO.\n\t *\n\t * @type {Texture}\n\t * @readonly\n\t */\n\tget gtaoMap() {\n\n\t\treturn this.pdRenderTarget.texture;\n\n\t}\n\n\t/**\n\t * Configures the GBuffer of this pass. If no arguments are passed,\n\t * the pass creates an internal render target for holding depth\n\t * and normal data.\n\t *\n\t * @param {DepthTexture} [depthTexture] - The depth texture.\n\t * @param {DepthTexture} [normalTexture] - The normal texture.\n\t */\n\tsetGBuffer( depthTexture, normalTexture ) {\n\n\t\tif ( depthTexture !== undefined ) {\n\n\t\t\tthis.depthTexture = depthTexture;\n\t\t\tthis.normalTexture = normalTexture;\n\t\t\tthis._renderGBuffer = false;\n\n\t\t} else {\n\n\t\t\tthis.depthTexture = new DepthTexture();\n\t\t\tthis.depthTexture.format = DepthStencilFormat;\n\t\t\tthis.depthTexture.type = UnsignedInt248Type;\n\t\t\tthis.normalRenderTarget = new WebGLRenderTarget( this.width, this.height, {\n\t\t\t\tminFilter: NearestFilter,\n\t\t\t\tmagFilter: NearestFilter,\n\t\t\t\ttype: HalfFloatType,\n\t\t\t\tdepthTexture: this.depthTexture\n\t\t\t} );\n\t\t\tthis.normalTexture = this.normalRenderTarget.texture;\n\t\t\tthis._renderGBuffer = true;\n\n\t\t}\n\n\t\tconst normalVectorType = ( this.normalTexture ) ? 1 : 0;\n\t\tconst depthValueSource = ( this.depthTexture === this.normalTexture ) ? 'w' : 'x';\n\n\t\tthis.gtaoMaterial.defines.NORMAL_VECTOR_TYPE = normalVectorType;\n\t\tthis.gtaoMaterial.defines.DEPTH_SWIZZLING = depthValueSource;\n\t\tthis.gtaoMaterial.uniforms.tNormal.value = this.normalTexture;\n\t\tthis.gtaoMaterial.uniforms.tDepth.value = this.depthTexture;\n\n\t\tthis.pdMaterial.defines.NORMAL_VECTOR_TYPE = normalVectorType;\n\t\tthis.pdMaterial.defines.DEPTH_SWIZZLING = depthValueSource;\n\t\tthis.pdMaterial.uniforms.tNormal.value = this.normalTexture;\n\t\tthis.pdMaterial.uniforms.tDepth.value = this.depthTexture;\n\n\t\tthis.depthRenderMaterial.uniforms.tDepth.value = this.normalRenderTarget.depthTexture;\n\n\t}\n\n\t/**\n\t * Configures the clip box of the GTAO shader with the given AABB.\n\t *\n\t * @param {?Box3} box - The AABB enclosing the scene that should receive AO. When passing\n\t * `null`, to clip box is used.\n\t */\n\tsetSceneClipBox( box ) {\n\n\t\tif ( box ) {\n\n\t\t\tthis.gtaoMaterial.needsUpdate = this.gtaoMaterial.defines.SCENE_CLIP_BOX !== 1;\n\t\t\tthis.gtaoMaterial.defines.SCENE_CLIP_BOX = 1;\n\t\t\tthis.gtaoMaterial.uniforms.sceneBoxMin.value.copy( box.min );\n\t\t\tthis.gtaoMaterial.uniforms.sceneBoxMax.value.copy( box.max );\n\n\t\t} else {\n\n\t\t\tthis.gtaoMaterial.needsUpdate = this.gtaoMaterial.defines.SCENE_CLIP_BOX === 0;\n\t\t\tthis.gtaoMaterial.defines.SCENE_CLIP_BOX = 0;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the GTAO material from the given parameter object.\n\t *\n\t * @param {Object} parameters - The GTAO material parameters.\n\t */\n\tupdateGtaoMaterial( parameters ) {\n\n\t\tif ( parameters.radius !== undefined ) {\n\n\t\t\tthis.gtaoMaterial.uniforms.radius.value = parameters.radius;\n\n\t\t}\n\n\t\tif ( parameters.distanceExponent !== undefined ) {\n\n\t\t\tthis.gtaoMaterial.uniforms.distanceExponent.value = parameters.distanceExponent;\n\n\t\t}\n\n\t\tif ( parameters.thickness !== undefined ) {\n\n\t\t\tthis.gtaoMaterial.uniforms.thickness.value = parameters.thickness;\n\n\t\t}\n\n\t\tif ( parameters.distanceFallOff !== undefined ) {\n\n\t\t\tthis.gtaoMaterial.uniforms.distanceFallOff.value = parameters.distanceFallOff;\n\t\t\tthis.gtaoMaterial.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( parameters.scale !== undefined ) {\n\n\t\t\tthis.gtaoMaterial.uniforms.scale.value = parameters.scale;\n\n\t\t}\n\n\t\tif ( parameters.samples !== undefined && parameters.samples !== this.gtaoMaterial.defines.SAMPLES ) {\n\n\t\t\tthis.gtaoMaterial.defines.SAMPLES = parameters.samples;\n\t\t\tthis.gtaoMaterial.needsUpdate = true;\n\n\t\t}\n\n\t\tif ( parameters.screenSpaceRadius !== undefined && ( parameters.screenSpaceRadius ? 1 : 0 ) !== this.gtaoMaterial.defines.SCREEN_SPACE_RADIUS ) {\n\n\t\t\tthis.gtaoMaterial.defines.SCREEN_SPACE_RADIUS = parameters.screenSpaceRadius ? 1 : 0;\n\t\t\tthis.gtaoMaterial.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the Denoise material from the given parameter object.\n\t *\n\t * @param {Object} parameters - The denoise parameters.\n\t */\n\tupdatePdMaterial( parameters ) {\n\n\t\tlet updateShader = false;\n\n\t\tif ( parameters.lumaPhi !== undefined ) {\n\n\t\t\tthis.pdMaterial.uniforms.lumaPhi.value = parameters.lumaPhi;\n\n\t\t}\n\n\t\tif ( parameters.depthPhi !== undefined ) {\n\n\t\t\tthis.pdMaterial.uniforms.depthPhi.value = parameters.depthPhi;\n\n\t\t}\n\n\t\tif ( parameters.normalPhi !== undefined ) {\n\n\t\t\tthis.pdMaterial.uniforms.normalPhi.value = parameters.normalPhi;\n\n\t\t}\n\n\t\tif ( parameters.radius !== undefined && parameters.radius !== this.radius ) {\n\n\t\t\tthis.pdMaterial.uniforms.radius.value = parameters.radius;\n\n\t\t}\n\n\t\tif ( parameters.radiusExponent !== undefined && parameters.radiusExponent !== this.pdRadiusExponent ) {\n\n\t\t\tthis.pdRadiusExponent = parameters.radiusExponent;\n\t\t\tupdateShader = true;\n\n\t\t}\n\n\t\tif ( parameters.rings !== undefined && parameters.rings !== this.pdRings ) {\n\n\t\t\tthis.pdRings = parameters.rings;\n\t\t\tupdateShader = true;\n\n\t\t}\n\n\t\tif ( parameters.samples !== undefined && parameters.samples !== this.pdSamples ) {\n\n\t\t\tthis.pdSamples = parameters.samples;\n\t\t\tupdateShader = true;\n\n\t\t}\n\n\t\tif ( updateShader ) {\n\n\t\t\tthis.pdMaterial.defines.SAMPLES = this.pdSamples;\n\t\t\tthis.pdMaterial.defines.SAMPLE_VECTORS = generatePdSamplePointInitializer( this.pdSamples, this.pdRings, this.pdRadiusExponent );\n\t\t\tthis.pdMaterial.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Performs the GTAO pass.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\t// render normals and depth (honor only meshes, points and lines do not contribute to AO)\n\n\t\tif ( this._renderGBuffer ) {\n\n\t\t\tthis._overrideVisibility();\n\t\t\tthis._renderOverride( renderer, this.normalMaterial, this.normalRenderTarget, 0x7777ff, 1.0 );\n\t\t\tthis._restoreVisibility();\n\n\t\t}\n\n\t\t// render AO\n\n\t\tthis.gtaoMaterial.uniforms.cameraNear.value = this.camera.near;\n\t\tthis.gtaoMaterial.uniforms.cameraFar.value = this.camera.far;\n\t\tthis.gtaoMaterial.uniforms.cameraProjectionMatrix.value.copy( this.camera.projectionMatrix );\n\t\tthis.gtaoMaterial.uniforms.cameraProjectionMatrixInverse.value.copy( this.camera.projectionMatrixInverse );\n\t\tthis.gtaoMaterial.uniforms.cameraWorldMatrix.value.copy( this.camera.matrixWorld );\n\t\tthis._renderPass( renderer, this.gtaoMaterial, this.gtaoRenderTarget, 0xffffff, 1.0 );\n\n\t\t// render poisson denoise\n\n\t\tthis.pdMaterial.uniforms.cameraProjectionMatrixInverse.value.copy( this.camera.projectionMatrixInverse );\n\t\tthis._renderPass( renderer, this.pdMaterial, this.pdRenderTarget, 0xffffff, 1.0 );\n\n\t\t// output result to screen\n\n\t\tswitch ( this.output ) {\n\n\t\t\tcase GTAOPass.OUTPUT.Off:\n\t\t\t\tbreak;\n\n\t\t\tcase GTAOPass.OUTPUT.Diffuse:\n\n\t\t\t\tthis.copyMaterial.uniforms.tDiffuse.value = readBuffer.texture;\n\t\t\t\tthis.copyMaterial.blending = NoBlending;\n\t\t\t\tthis._renderPass( renderer, this.copyMaterial, this.renderToScreen ? null : writeBuffer );\n\n\t\t\t\tbreak;\n\n\t\t\tcase GTAOPass.OUTPUT.AO:\n\n\t\t\t\tthis.copyMaterial.uniforms.tDiffuse.value = this.gtaoRenderTarget.texture;\n\t\t\t\tthis.copyMaterial.blending = NoBlending;\n\t\t\t\tthis._renderPass( renderer, this.copyMaterial, this.renderToScreen ? null : writeBuffer );\n\n\t\t\t\tbreak;\n\n\t\t\tcase GTAOPass.OUTPUT.Denoise:\n\n\t\t\t\tthis.copyMaterial.uniforms.tDiffuse.value = this.pdRenderTarget.texture;\n\t\t\t\tthis.copyMaterial.blending = NoBlending;\n\t\t\t\tthis._renderPass( renderer, this.copyMaterial, this.renderToScreen ? null : writeBuffer );\n\n\t\t\t\tbreak;\n\n\t\t\tcase GTAOPass.OUTPUT.Depth:\n\n\t\t\t\tthis.depthRenderMaterial.uniforms.cameraNear.value = this.camera.near;\n\t\t\t\tthis.depthRenderMaterial.uniforms.cameraFar.value = this.camera.far;\n\t\t\t\tthis._renderPass( renderer, this.depthRenderMaterial, this.renderToScreen ? null : writeBuffer );\n\n\t\t\t\tbreak;\n\n\t\t\tcase GTAOPass.OUTPUT.Normal:\n\n\t\t\t\tthis.copyMaterial.uniforms.tDiffuse.value = this.normalRenderTarget.texture;\n\t\t\t\tthis.copyMaterial.blending = NoBlending;\n\t\t\t\tthis._renderPass( renderer, this.copyMaterial, this.renderToScreen ? null : writeBuffer );\n\n\t\t\t\tbreak;\n\n\t\t\tcase GTAOPass.OUTPUT.Default:\n\n\t\t\t\tthis.copyMaterial.uniforms.tDiffuse.value = readBuffer.texture;\n\t\t\t\tthis.copyMaterial.blending = NoBlending;\n\t\t\t\tthis._renderPass( renderer, this.copyMaterial, this.renderToScreen ? null : writeBuffer );\n\n\t\t\t\tthis.blendMaterial.uniforms.intensity.value = this.blendIntensity;\n\t\t\t\tthis.blendMaterial.uniforms.tDiffuse.value = this.pdRenderTarget.texture;\n\t\t\t\tthis._renderPass( renderer, this.blendMaterial, this.renderToScreen ? null : writeBuffer );\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.warn( 'THREE.GTAOPass: Unknown output type.' );\n\n\t\t}\n\n\t}\n\n\t// internals\n\n\t_renderPass( renderer, passMaterial, renderTarget, clearColor, clearAlpha ) {\n\n\t\t// save original state\n\t\trenderer.getClearColor( this._originalClearColor );\n\t\tconst originalClearAlpha = renderer.getClearAlpha();\n\t\tconst originalAutoClear = renderer.autoClear;\n\n\t\trenderer.setRenderTarget( renderTarget );\n\n\t\t// setup pass state\n\t\trenderer.autoClear = false;\n\t\tif ( ( clearColor !== undefined ) && ( clearColor !== null ) ) {\n\n\t\t\trenderer.setClearColor( clearColor );\n\t\t\trenderer.setClearAlpha( clearAlpha || 0.0 );\n\t\t\trenderer.clear();\n\n\t\t}\n\n\t\tthis._fsQuad.material = passMaterial;\n\t\tthis._fsQuad.render( renderer );\n\n\t\t// restore original state\n\t\trenderer.autoClear = originalAutoClear;\n\t\trenderer.setClearColor( this._originalClearColor );\n\t\trenderer.setClearAlpha( originalClearAlpha );\n\n\t}\n\n\t_renderOverride( renderer, overrideMaterial, renderTarget, clearColor, clearAlpha ) {\n\n\t\trenderer.getClearColor( this._originalClearColor );\n\t\tconst originalClearAlpha = renderer.getClearAlpha();\n\t\tconst originalAutoClear = renderer.autoClear;\n\n\t\trenderer.setRenderTarget( renderTarget );\n\t\trenderer.autoClear = false;\n\n\t\tclearColor = overrideMaterial.clearColor || clearColor;\n\t\tclearAlpha = overrideMaterial.clearAlpha || clearAlpha;\n\n\t\tif ( ( clearColor !== undefined ) && ( clearColor !== null ) ) {\n\n\t\t\trenderer.setClearColor( clearColor );\n\t\t\trenderer.setClearAlpha( clearAlpha || 0.0 );\n\t\t\trenderer.clear();\n\n\t\t}\n\n\t\tthis.scene.overrideMaterial = overrideMaterial;\n\t\trenderer.render( this.scene, this.camera );\n\t\tthis.scene.overrideMaterial = null;\n\n\t\trenderer.autoClear = originalAutoClear;\n\t\trenderer.setClearColor( this._originalClearColor );\n\t\trenderer.setClearAlpha( originalClearAlpha );\n\n\t}\n\n\t_overrideVisibility() {\n\n\t\tconst scene = this.scene;\n\t\tconst cache = this._visibilityCache;\n\n\t\tscene.traverse( function ( object ) {\n\n\t\t\tif ( ( object.isPoints || object.isLine || object.isLine2 ) && object.visible ) {\n\n\t\t\t\tobject.visible = false;\n\t\t\t\tcache.push( object );\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\t_restoreVisibility() {\n\n\t\tconst cache = this._visibilityCache;\n\n\t\tfor ( let i = 0; i < cache.length; i ++ ) {\n\n\t\t\tcache[ i ].visible = true;\n\n\t\t}\n\n\t\tcache.length = 0;\n\n\t}\n\n\t_generateNoise( size = 64 ) {\n\n\t\tconst simplex = new SimplexNoise();\n\n\t\tconst arraySize = size * size * 4;\n\t\tconst data = new Uint8Array( arraySize );\n\n\t\tfor ( let i = 0; i < size; i ++ ) {\n\n\t\t\tfor ( let j = 0; j < size; j ++ ) {\n\n\t\t\t\tconst x = i;\n\t\t\t\tconst y = j;\n\n\t\t\t\tdata[ ( i * size + j ) * 4 ] = ( simplex.noise( x, y ) * 0.5 + 0.5 ) * 255;\n\t\t\t\tdata[ ( i * size + j ) * 4 + 1 ] = ( simplex.noise( x + size, y ) * 0.5 + 0.5 ) * 255;\n\t\t\t\tdata[ ( i * size + j ) * 4 + 2 ] = ( simplex.noise( x, y + size ) * 0.5 + 0.5 ) * 255;\n\t\t\t\tdata[ ( i * size + j ) * 4 + 3 ] = ( simplex.noise( x + size, y + size ) * 0.5 + 0.5 ) * 255;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst noiseTexture = new DataTexture( data, size, size, RGBAFormat, UnsignedByteType );\n\t\tnoiseTexture.wrapS = RepeatWrapping;\n\t\tnoiseTexture.wrapT = RepeatWrapping;\n\t\tnoiseTexture.needsUpdate = true;\n\n\t\treturn noiseTexture;\n\n\t}\n\n}\n\nGTAOPass.OUTPUT = {\n\t'Off': - 1,\n\t'Default': 0,\n\t'Diffuse': 1,\n\t'Depth': 2,\n\t'Normal': 3,\n\t'AO': 4,\n\t'Denoise': 5,\n};\n\nexport { GTAOPass };\n", "/**\n * @module HalftoneShader\n * @three_import import { HalftoneShader } from 'three/addons/shaders/HalftoneShader.js';\n */\n\n/**\n * RGB Halftone shader.\n *\n * Used by {@link HalftonePass}.\n *\n * Shape (1 = Dot, 2 = Ellipse, 3 = Line, 4 = Square)\n * Blending Mode (1 = Linear, 2 = Multiply, 3 = Add, 4 = Lighter, 5 = Darker)\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst HalftoneShader = {\n\n\tname: 'HalftoneShader',\n\n\tuniforms: {\n\t\t'tDiffuse': { value: null },\n\t\t'shape': { value: 1 },\n\t\t'radius': { value: 4 },\n\t\t'rotateR': { value: Math.PI / 12 * 1 },\n\t\t'rotateG': { value: Math.PI / 12 * 2 },\n\t\t'rotateB': { value: Math.PI / 12 * 3 },\n\t\t'scatter': { value: 0 },\n\t\t'width': { value: 1 },\n\t\t'height': { value: 1 },\n\t\t'blending': { value: 1 },\n\t\t'blendingMode': { value: 1 },\n\t\t'greyscale': { value: false },\n\t\t'disable': { value: false }\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUV;\n\n\t\tvoid main() {\n\n\t\t\tvUV = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\t#define SQRT2_MINUS_ONE 0.41421356\n\t\t#define SQRT2_HALF_MINUS_ONE 0.20710678\n\t\t#define PI2 6.28318531\n\t\t#define SHAPE_DOT 1\n\t\t#define SHAPE_ELLIPSE 2\n\t\t#define SHAPE_LINE 3\n\t\t#define SHAPE_SQUARE 4\n\t\t#define BLENDING_LINEAR 1\n\t\t#define BLENDING_MULTIPLY 2\n\t\t#define BLENDING_ADD 3\n\t\t#define BLENDING_LIGHTER 4\n\t\t#define BLENDING_DARKER 5\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform float radius;\n\t\tuniform float rotateR;\n\t\tuniform float rotateG;\n\t\tuniform float rotateB;\n\t\tuniform float scatter;\n\t\tuniform float width;\n\t\tuniform float height;\n\t\tuniform int shape;\n\t\tuniform bool disable;\n\t\tuniform float blending;\n\t\tuniform int blendingMode;\n\t\tvarying vec2 vUV;\n\t\tuniform bool greyscale;\n\t\tconst int samples = 8;\n\n\t\tfloat blend( float a, float b, float t ) {\n\n\t\t// linear blend\n\t\t\treturn a * ( 1.0 - t ) + b * t;\n\n\t\t}\n\n\t\tfloat hypot( float x, float y ) {\n\n\t\t// vector magnitude\n\t\t\treturn sqrt( x * x + y * y );\n\n\t\t}\n\n\t\tfloat rand( vec2 seed ){\n\n\t\t// get pseudo-random number\n\t\t\treturn fract( sin( dot( seed.xy, vec2( 12.9898, 78.233 ) ) ) * 43758.5453 );\n\n\t\t}\n\n\t\tfloat distanceToDotRadius( float channel, vec2 coord, vec2 normal, vec2 p, float angle, float rad_max ) {\n\n\t\t// apply shape-specific transforms\n\t\t\tfloat dist = hypot( coord.x - p.x, coord.y - p.y );\n\t\t\tfloat rad = channel;\n\n\t\t\tif ( shape == SHAPE_DOT ) {\n\n\t\t\t\trad = pow( abs( rad ), 1.125 ) * rad_max;\n\n\t\t\t} else if ( shape == SHAPE_ELLIPSE ) {\n\n\t\t\t\trad = pow( abs( rad ), 1.125 ) * rad_max;\n\n\t\t\t\tif ( dist != 0.0 ) {\n\t\t\t\t\tfloat dot_p = abs( ( p.x - coord.x ) / dist * normal.x + ( p.y - coord.y ) / dist * normal.y );\n\t\t\t\t\tdist = ( dist * ( 1.0 - SQRT2_HALF_MINUS_ONE ) ) + dot_p * dist * SQRT2_MINUS_ONE;\n\t\t\t\t}\n\n\t\t\t} else if ( shape == SHAPE_LINE ) {\n\n\t\t\t\trad = pow( abs( rad ), 1.5) * rad_max;\n\t\t\t\tfloat dot_p = ( p.x - coord.x ) * normal.x + ( p.y - coord.y ) * normal.y;\n\t\t\t\tdist = hypot( normal.x * dot_p, normal.y * dot_p );\n\n\t\t\t} else if ( shape == SHAPE_SQUARE ) {\n\n\t\t\t\tfloat theta = atan( p.y - coord.y, p.x - coord.x ) - angle;\n\t\t\t\tfloat sin_t = abs( sin( theta ) );\n\t\t\t\tfloat cos_t = abs( cos( theta ) );\n\t\t\t\trad = pow( abs( rad ), 1.4 );\n\t\t\t\trad = rad_max * ( rad + ( ( sin_t > cos_t ) ? rad - sin_t * rad : rad - cos_t * rad ) );\n\n\t\t\t}\n\n\t\t\treturn rad - dist;\n\n\t\t}\n\n\t\tstruct Cell {\n\n\t\t// grid sample positions\n\t\t\tvec2 normal;\n\t\t\tvec2 p1;\n\t\t\tvec2 p2;\n\t\t\tvec2 p3;\n\t\t\tvec2 p4;\n\t\t\tfloat samp2;\n\t\t\tfloat samp1;\n\t\t\tfloat samp3;\n\t\t\tfloat samp4;\n\n\t\t};\n\n\t\tvec4 getSample( vec2 point ) {\n\n\t\t// multi-sampled point\n\t\t\tvec4 tex = texture2D( tDiffuse, vec2( point.x / width, point.y / height ) );\n\t\t\tfloat base = rand( vec2( floor( point.x ), floor( point.y ) ) ) * PI2;\n\t\t\tfloat step = PI2 / float( samples );\n\t\t\tfloat dist = radius * 0.66;\n\n\t\t\tfor ( int i = 0; i < samples; ++i ) {\n\n\t\t\t\tfloat r = base + step * float( i );\n\t\t\t\tvec2 coord = point + vec2( cos( r ) * dist, sin( r ) * dist );\n\t\t\t\ttex += texture2D( tDiffuse, vec2( coord.x / width, coord.y / height ) );\n\n\t\t\t}\n\n\t\t\ttex /= float( samples ) + 1.0;\n\t\t\treturn tex;\n\n\t\t}\n\n\t\tfloat getDotColour( Cell c, vec2 p, int channel, float angle, float aa ) {\n\n\t\t// get colour for given point\n\t\t\tfloat dist_c_1, dist_c_2, dist_c_3, dist_c_4, res;\n\n\t\t\tif ( channel == 0 ) {\n\n\t\t\t\tc.samp1 = getSample( c.p1 ).r;\n\t\t\t\tc.samp2 = getSample( c.p2 ).r;\n\t\t\t\tc.samp3 = getSample( c.p3 ).r;\n\t\t\t\tc.samp4 = getSample( c.p4 ).r;\n\n\t\t\t} else if (channel == 1) {\n\n\t\t\t\tc.samp1 = getSample( c.p1 ).g;\n\t\t\t\tc.samp2 = getSample( c.p2 ).g;\n\t\t\t\tc.samp3 = getSample( c.p3 ).g;\n\t\t\t\tc.samp4 = getSample( c.p4 ).g;\n\n\t\t\t} else {\n\n\t\t\t\tc.samp1 = getSample( c.p1 ).b;\n\t\t\t\tc.samp3 = getSample( c.p3 ).b;\n\t\t\t\tc.samp2 = getSample( c.p2 ).b;\n\t\t\t\tc.samp4 = getSample( c.p4 ).b;\n\n\t\t\t}\n\n\t\t\tdist_c_1 = distanceToDotRadius( c.samp1, c.p1, c.normal, p, angle, radius );\n\t\t\tdist_c_2 = distanceToDotRadius( c.samp2, c.p2, c.normal, p, angle, radius );\n\t\t\tdist_c_3 = distanceToDotRadius( c.samp3, c.p3, c.normal, p, angle, radius );\n\t\t\tdist_c_4 = distanceToDotRadius( c.samp4, c.p4, c.normal, p, angle, radius );\n\t\t\tres = ( dist_c_1 > 0.0 ) ? clamp( dist_c_1 / aa, 0.0, 1.0 ) : 0.0;\n\t\t\tres += ( dist_c_2 > 0.0 ) ? clamp( dist_c_2 / aa, 0.0, 1.0 ) : 0.0;\n\t\t\tres += ( dist_c_3 > 0.0 ) ? clamp( dist_c_3 / aa, 0.0, 1.0 ) : 0.0;\n\t\t\tres += ( dist_c_4 > 0.0 ) ? clamp( dist_c_4 / aa, 0.0, 1.0 ) : 0.0;\n\t\t\tres = clamp( res, 0.0, 1.0 );\n\n\t\t\treturn res;\n\n\t\t}\n\n\t\tCell getReferenceCell( vec2 p, vec2 origin, float grid_angle, float step ) {\n\n\t\t// get containing cell\n\t\t\tCell c;\n\n\t\t// calc grid\n\t\t\tvec2 n = vec2( cos( grid_angle ), sin( grid_angle ) );\n\t\t\tfloat threshold = step * 0.5;\n\t\t\tfloat dot_normal = n.x * ( p.x - origin.x ) + n.y * ( p.y - origin.y );\n\t\t\tfloat dot_line = -n.y * ( p.x - origin.x ) + n.x * ( p.y - origin.y );\n\t\t\tvec2 offset = vec2( n.x * dot_normal, n.y * dot_normal );\n\t\t\tfloat offset_normal = mod( hypot( offset.x, offset.y ), step );\n\t\t\tfloat normal_dir = ( dot_normal < 0.0 ) ? 1.0 : -1.0;\n\t\t\tfloat normal_scale = ( ( offset_normal < threshold ) ? -offset_normal : step - offset_normal ) * normal_dir;\n\t\t\tfloat offset_line = mod( hypot( ( p.x - offset.x ) - origin.x, ( p.y - offset.y ) - origin.y ), step );\n\t\t\tfloat line_dir = ( dot_line < 0.0 ) ? 1.0 : -1.0;\n\t\t\tfloat line_scale = ( ( offset_line < threshold ) ? -offset_line : step - offset_line ) * line_dir;\n\n\t\t// get closest corner\n\t\t\tc.normal = n;\n\t\t\tc.p1.x = p.x - n.x * normal_scale + n.y * line_scale;\n\t\t\tc.p1.y = p.y - n.y * normal_scale - n.x * line_scale;\n\n\t\t// scatter\n\t\t\tif ( scatter != 0.0 ) {\n\n\t\t\t\tfloat off_mag = scatter * threshold * 0.5;\n\t\t\t\tfloat off_angle = rand( vec2( floor( c.p1.x ), floor( c.p1.y ) ) ) * PI2;\n\t\t\t\tc.p1.x += cos( off_angle ) * off_mag;\n\t\t\t\tc.p1.y += sin( off_angle ) * off_mag;\n\n\t\t\t}\n\n\t\t// find corners\n\t\t\tfloat normal_step = normal_dir * ( ( offset_normal < threshold ) ? step : -step );\n\t\t\tfloat line_step = line_dir * ( ( offset_line < threshold ) ? step : -step );\n\t\t\tc.p2.x = c.p1.x - n.x * normal_step;\n\t\t\tc.p2.y = c.p1.y - n.y * normal_step;\n\t\t\tc.p3.x = c.p1.x + n.y * line_step;\n\t\t\tc.p3.y = c.p1.y - n.x * line_step;\n\t\t\tc.p4.x = c.p1.x - n.x * normal_step + n.y * line_step;\n\t\t\tc.p4.y = c.p1.y - n.y * normal_step - n.x * line_step;\n\n\t\t\treturn c;\n\n\t\t}\n\n\t\tfloat blendColour( float a, float b, float t ) {\n\n\t\t// blend colours\n\t\t\tif ( blendingMode == BLENDING_LINEAR ) {\n\t\t\t\treturn blend( a, b, 1.0 - t );\n\t\t\t} else if ( blendingMode == BLENDING_ADD ) {\n\t\t\t\treturn blend( a, min( 1.0, a + b ), t );\n\t\t\t} else if ( blendingMode == BLENDING_MULTIPLY ) {\n\t\t\t\treturn blend( a, max( 0.0, a * b ), t );\n\t\t\t} else if ( blendingMode == BLENDING_LIGHTER ) {\n\t\t\t\treturn blend( a, max( a, b ), t );\n\t\t\t} else if ( blendingMode == BLENDING_DARKER ) {\n\t\t\t\treturn blend( a, min( a, b ), t );\n\t\t\t} else {\n\t\t\t\treturn blend( a, b, 1.0 - t );\n\t\t\t}\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tif ( ! disable ) {\n\n\t\t// setup\n\t\t\t\tvec2 p = vec2( vUV.x * width, vUV.y * height );\n\t\t\t\tvec2 origin = vec2( 0, 0 );\n\t\t\t\tfloat aa = ( radius < 2.5 ) ? radius * 0.5 : 1.25;\n\n\t\t// get channel samples\n\t\t\t\tCell cell_r = getReferenceCell( p, origin, rotateR, radius );\n\t\t\t\tCell cell_g = getReferenceCell( p, origin, rotateG, radius );\n\t\t\t\tCell cell_b = getReferenceCell( p, origin, rotateB, radius );\n\t\t\t\tfloat r = getDotColour( cell_r, p, 0, rotateR, aa );\n\t\t\t\tfloat g = getDotColour( cell_g, p, 1, rotateG, aa );\n\t\t\t\tfloat b = getDotColour( cell_b, p, 2, rotateB, aa );\n\n\t\t// blend with original\n\t\t\t\tvec4 colour = texture2D( tDiffuse, vUV );\n\t\t\t\tr = blendColour( r, colour.r, blending );\n\t\t\t\tg = blendColour( g, colour.g, blending );\n\t\t\t\tb = blendColour( b, colour.b, blending );\n\n\t\t\t\tif ( greyscale ) {\n\t\t\t\t\tr = g = b = (r + b + g) / 3.0;\n\t\t\t\t}\n\n\t\t\t\tgl_FragColor = vec4( r, g, b, 1.0 );\n\n\t\t\t} else {\n\n\t\t\t\tgl_FragColor = texture2D( tDiffuse, vUV );\n\n\t\t\t}\n\n\t\t}`\n\n};\n\nexport { HalftoneShader };\n", "import {\n\tShaderMaterial,\n\tUniformsUtils\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\nimport { HalftoneShader } from '../shaders/HalftoneShader.js';\n\n/**\n * Pass for creating a RGB halftone effect.\n *\n * ```js\n * const params = {\n * \tshape: 1,\n * \tradius: 4,\n * \trotateR: Math.PI / 12,\n * \trotateB: Math.PI / 12 * 2,\n * \trotateG: Math.PI / 12 * 3,\n * \tscatter: 0,\n * \tblending: 1,\n * \tblendingMode: 1,\n * \tgreyscale: false,\n * \tdisable: false\n * };\n * const halftonePass = new HalftonePass( params );\n * composer.addPass( halftonePass );\n * ```\n *\n * @augments Pass\n * @three_import import { HalftonePass } from 'three/addons/postprocessing/HalftonePass.js';\n */\nclass HalftonePass extends Pass {\n\n\t/**\n\t * Constructs a new halftone pass.\n\t *\n\t * @param {Object} params - The halftone shader parameter.\n\t */\n\tconstructor( params ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The pass uniforms.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t \tthis.uniforms = UniformsUtils.clone( HalftoneShader.uniforms );\n\n\t\t/**\n\t\t * The pass material.\n\t\t *\n\t\t * @type {ShaderMaterial}\n\t\t */\n\t \tthis.material = new ShaderMaterial( {\n\t \t\tuniforms: this.uniforms,\n\t \t\tfragmentShader: HalftoneShader.fragmentShader,\n\t \t\tvertexShader: HalftoneShader.vertexShader\n\t \t} );\n\n\n\t\tfor ( const key in params ) {\n\n\t\t\tif ( params.hasOwnProperty( key ) && this.uniforms.hasOwnProperty( key ) ) {\n\n\t\t\t\tthis.uniforms[ key ].value = params[ key ];\n\n\t\t\t}\n\n\t\t}\n\n\t\t// internals\n\n\t\tthis._fsQuad = new FullScreenQuad( this.material );\n\n\t}\n\n\t/**\n\t * Performs the halftone pass.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( renderer, writeBuffer, readBuffer/*, deltaTime, maskActive*/ ) {\n\n \t\tthis.material.uniforms[ 'tDiffuse' ].value = readBuffer.texture;\n\n \t\tif ( this.renderToScreen ) {\n\n \t\t\trenderer.setRenderTarget( null );\n \t\t\tthis._fsQuad.render( renderer );\n\n\t\t} else {\n\n \t\t\trenderer.setRenderTarget( writeBuffer );\n \t\t\tif ( this.clear ) renderer.clear();\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t}\n\n \t}\n\n\t/**\n\t * Sets the size of the pass.\n\t *\n\t * @param {number} width - The width to set.\n\t * @param {number} height - The height to set.\n\t */\n \tsetSize( width, height ) {\n\n \t\tthis.uniforms.width.value = width;\n \t\tthis.uniforms.height.value = height;\n\n \t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the pass is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.material.dispose();\n\n\t\tthis._fsQuad.dispose();\n\n\t}\n\n}\n\nexport { HalftonePass };\n", "import { ShaderPass } from './ShaderPass.js';\n\nconst LUTShader = {\n\n\tname: 'LUTShader',\n\n\tuniforms: {\n\n\t\tlut: { value: null },\n\t\tlutSize: { value: 0 },\n\n\t\ttDiffuse: { value: null },\n\t\tintensity: { value: 1.0 },\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}\n\n\t`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform float lutSize;\n\t\tuniform sampler3D lut;\n\n\t\tvarying vec2 vUv;\n\t\tuniform float intensity;\n\t\tuniform sampler2D tDiffuse;\n\t\tvoid main() {\n\n\t\t\tvec4 val = texture2D( tDiffuse, vUv );\n\t\t\tvec4 lutVal;\n\n\t\t\t// pull the sample in by half a pixel so the sample begins\n\t\t\t// at the center of the edge pixels.\n\t\t\tfloat pixelWidth = 1.0 / lutSize;\n\t\t\tfloat halfPixelWidth = 0.5 / lutSize;\n\t\t\tvec3 uvw = vec3( halfPixelWidth ) + val.rgb * ( 1.0 - pixelWidth );\n\n\n\t\t\tlutVal = vec4( texture( lut, uvw ).rgb, val.a );\n\n\t\t\tgl_FragColor = vec4( mix( val, lutVal, intensity ) );\n\n\t\t}\n\n\t`,\n\n};\n\n/**\n * Pass for color grading via lookup tables.\n *\n * ```js\n * const lutPass = new LUTPass( { lut: lut.texture3D } );\n * composer.addPass( lutPass );\n * ```\n *\n * @augments ShaderPass\n * @three_import import { LUTPass } from 'three/addons/postprocessing/LUTPass.js';\n */\nclass LUTPass extends ShaderPass {\n\n\t/**\n\t * Constructs a LUT pass.\n\t *\n\t * @param {{lut:Data3DTexture,intensity:number}} [options={}] - The pass options.\n\t */\n\tconstructor( options = {} ) {\n\n\t\tsuper( LUTShader );\n\n\t\t/**\n\t\t * The LUT as a 3D texture.\n\t\t *\n\t\t * @type {?Data3DTexture}\n\t\t * @default null\n\t\t */\n\t\tthis.lut = options.lut || null;\n\n\t\t/**\n\t\t * The intensity.\n\t\t *\n\t\t * @type {?number}\n\t\t * @default 1\n\t\t */\n\t\tthis.intensity = 'intensity' in options ? options.intensity : 1;\n\n\t}\n\n\tset lut( v ) {\n\n\t\tconst material = this.material;\n\n\t\tif ( v !== this.lut ) {\n\n\t\t\tmaterial.uniforms.lut.value = null;\n\n\t\t\tif ( v ) {\n\n\t\t\t\tmaterial.uniforms.lutSize.value = v.image.width;\n\t\t\t\tmaterial.uniforms.lut.value = v;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tget lut() {\n\n\t\treturn this.material.uniforms.lut.value;\n\n\t}\n\n\tset intensity( v ) {\n\n\t\tthis.material.uniforms.intensity.value = v;\n\n\t}\n\n\tget intensity() {\n\n\t\treturn this.material.uniforms.intensity.value;\n\n\t}\n\n}\n\nexport { LUTPass };\n", "import {\n\tAdditiveBlending,\n\tColor,\n\tDoubleSide,\n\tHalfFloatType,\n\tMatrix4,\n\tMeshDepthMaterial,\n\tNoBlending,\n\tRGBADepthPacking,\n\tShaderMaterial,\n\tUniformsUtils,\n\tVector2,\n\tVector3,\n\tWebGLRenderTarget\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\nimport { CopyShader } from '../shaders/CopyShader.js';\n\n/**\n * A pass for rendering outlines around selected objects.\n *\n * ```js\n * const resolution = new THREE.Vector2( window.innerWidth, window.innerHeight );\n * const outlinePass = new OutlinePass( resolution, scene, camera );\n * composer.addPass( outlinePass );\n * ```\n *\n * @augments Pass\n * @three_import import { OutlinePass } from 'three/addons/postprocessing/OutlinePass.js';\n */\nclass OutlinePass extends Pass {\n\n\t/**\n\t * Constructs a new outline pass.\n\t *\n\t * @param {Vector2} [resolution] - The effect's resolution.\n\t * @param {Scene} scene - The scene to render.\n\t * @param {Camera} camera - The camera.\n\t * @param {Array<Object3D>} [selectedObjects] - The selected 3D objects that should receive an outline.\n\t *\n\t */\n\tconstructor( resolution, scene, camera, selectedObjects ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The scene to render.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.renderScene = scene;\n\n\t\t/**\n\t\t * The camera.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.renderCamera = camera;\n\n\t\t/**\n\t\t * The selected 3D objects that should receive an outline.\n\t\t *\n\t\t * @type {Array<Object3D>}\n\t\t */\n\t\tthis.selectedObjects = selectedObjects !== undefined ? selectedObjects : [];\n\n\t\t/**\n\t\t * The visible edge color.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (1,1,1)\n\t\t */\n\t\tthis.visibleEdgeColor = new Color( 1, 1, 1 );\n\n\t\t/**\n\t\t * The hidden edge color.\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0.1,0.04,0.02)\n\t\t */\n\t\tthis.hiddenEdgeColor = new Color( 0.1, 0.04, 0.02 );\n\n\t\t/**\n\t\t * Can be used for an animated glow/pulse effect.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.edgeGlow = 0.0;\n\n\t\t/**\n\t\t * Whether to use a pattern texture for to highlight selected\n\t\t * 3D objects or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.usePatternTexture = false;\n\n\t\t/**\n\t\t * Can be used to highlight selected 3D objects. Requires to set\n\t\t * {@link OutlinePass#usePatternTexture} to `true`.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.patternTexture = null;\n\n\t\t/**\n\t\t * The edge thickness.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.edgeThickness = 1.0;\n\n\t\t/**\n\t\t * The edge strength.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 3\n\t\t */\n\t\tthis.edgeStrength = 3.0;\n\n\t\t/**\n\t\t * The downsample ratio. The effect can be rendered in a much\n\t\t * lower resolution than the beauty pass.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 2\n\t\t */\n\t\tthis.downSampleRatio = 2;\n\n\t\t/**\n\t\t * The pulse period.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.pulsePeriod = 0;\n\n\t\tthis._visibilityCache = new Map();\n\t\tthis._selectionCache = new Set();\n\n\t\t/**\n\t\t * The effect's resolution.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (256,256)\n\t\t */\n\t\tthis.resolution = ( resolution !== undefined ) ? new Vector2( resolution.x, resolution.y ) : new Vector2( 256, 256 );\n\n\t\tconst resx = Math.round( this.resolution.x / this.downSampleRatio );\n\t\tconst resy = Math.round( this.resolution.y / this.downSampleRatio );\n\n\t\tthis.renderTargetMaskBuffer = new WebGLRenderTarget( this.resolution.x, this.resolution.y );\n\t\tthis.renderTargetMaskBuffer.texture.name = 'OutlinePass.mask';\n\t\tthis.renderTargetMaskBuffer.texture.generateMipmaps = false;\n\n\t\tthis.depthMaterial = new MeshDepthMaterial();\n\t\tthis.depthMaterial.side = DoubleSide;\n\t\tthis.depthMaterial.depthPacking = RGBADepthPacking;\n\t\tthis.depthMaterial.blending = NoBlending;\n\n\t\tthis.prepareMaskMaterial = this._getPrepareMaskMaterial();\n\t\tthis.prepareMaskMaterial.side = DoubleSide;\n\t\tthis.prepareMaskMaterial.fragmentShader = replaceDepthToViewZ( this.prepareMaskMaterial.fragmentShader, this.renderCamera );\n\n\t\tthis.renderTargetDepthBuffer = new WebGLRenderTarget( this.resolution.x, this.resolution.y, { type: HalfFloatType } );\n\t\tthis.renderTargetDepthBuffer.texture.name = 'OutlinePass.depth';\n\t\tthis.renderTargetDepthBuffer.texture.generateMipmaps = false;\n\n\t\tthis.renderTargetMaskDownSampleBuffer = new WebGLRenderTarget( resx, resy, { type: HalfFloatType } );\n\t\tthis.renderTargetMaskDownSampleBuffer.texture.name = 'OutlinePass.depthDownSample';\n\t\tthis.renderTargetMaskDownSampleBuffer.texture.generateMipmaps = false;\n\n\t\tthis.renderTargetBlurBuffer1 = new WebGLRenderTarget( resx, resy, { type: HalfFloatType } );\n\t\tthis.renderTargetBlurBuffer1.texture.name = 'OutlinePass.blur1';\n\t\tthis.renderTargetBlurBuffer1.texture.generateMipmaps = false;\n\t\tthis.renderTargetBlurBuffer2 = new WebGLRenderTarget( Math.round( resx / 2 ), Math.round( resy / 2 ), { type: HalfFloatType } );\n\t\tthis.renderTargetBlurBuffer2.texture.name = 'OutlinePass.blur2';\n\t\tthis.renderTargetBlurBuffer2.texture.generateMipmaps = false;\n\n\t\tthis.edgeDetectionMaterial = this._getEdgeDetectionMaterial();\n\t\tthis.renderTargetEdgeBuffer1 = new WebGLRenderTarget( resx, resy, { type: HalfFloatType } );\n\t\tthis.renderTargetEdgeBuffer1.texture.name = 'OutlinePass.edge1';\n\t\tthis.renderTargetEdgeBuffer1.texture.generateMipmaps = false;\n\t\tthis.renderTargetEdgeBuffer2 = new WebGLRenderTarget( Math.round( resx / 2 ), Math.round( resy / 2 ), { type: HalfFloatType } );\n\t\tthis.renderTargetEdgeBuffer2.texture.name = 'OutlinePass.edge2';\n\t\tthis.renderTargetEdgeBuffer2.texture.generateMipmaps = false;\n\n\t\tconst MAX_EDGE_THICKNESS = 4;\n\t\tconst MAX_EDGE_GLOW = 4;\n\n\t\tthis.separableBlurMaterial1 = this._getSeparableBlurMaterial( MAX_EDGE_THICKNESS );\n\t\tthis.separableBlurMaterial1.uniforms[ 'texSize' ].value.set( resx, resy );\n\t\tthis.separableBlurMaterial1.uniforms[ 'kernelRadius' ].value = 1;\n\t\tthis.separableBlurMaterial2 = this._getSeparableBlurMaterial( MAX_EDGE_GLOW );\n\t\tthis.separableBlurMaterial2.uniforms[ 'texSize' ].value.set( Math.round( resx / 2 ), Math.round( resy / 2 ) );\n\t\tthis.separableBlurMaterial2.uniforms[ 'kernelRadius' ].value = MAX_EDGE_GLOW;\n\n\t\t// Overlay material\n\t\tthis.overlayMaterial = this._getOverlayMaterial();\n\n\t\t// copy material\n\n\t\tconst copyShader = CopyShader;\n\n\t\tthis.copyUniforms = UniformsUtils.clone( copyShader.uniforms );\n\n\t\tthis.materialCopy = new ShaderMaterial( {\n\t\t\tuniforms: this.copyUniforms,\n\t\t\tvertexShader: copyShader.vertexShader,\n\t\t\tfragmentShader: copyShader.fragmentShader,\n\t\t\tblending: NoBlending,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false\n\t\t} );\n\n\t\tthis.enabled = true;\n\t\tthis.needsSwap = false;\n\n\t\tthis._oldClearColor = new Color();\n\t\tthis.oldClearAlpha = 1;\n\n\t\tthis._fsQuad = new FullScreenQuad( null );\n\n\t\tthis.tempPulseColor1 = new Color();\n\t\tthis.tempPulseColor2 = new Color();\n\t\tthis.textureMatrix = new Matrix4();\n\n\t\tfunction replaceDepthToViewZ( string, camera ) {\n\n\t\t\tconst type = camera.isPerspectiveCamera ? 'perspective' : 'orthographic';\n\n\t\t\treturn string.replace( /DEPTH_TO_VIEW_Z/g, type + 'DepthToViewZ' );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the pass is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.renderTargetMaskBuffer.dispose();\n\t\tthis.renderTargetDepthBuffer.dispose();\n\t\tthis.renderTargetMaskDownSampleBuffer.dispose();\n\t\tthis.renderTargetBlurBuffer1.dispose();\n\t\tthis.renderTargetBlurBuffer2.dispose();\n\t\tthis.renderTargetEdgeBuffer1.dispose();\n\t\tthis.renderTargetEdgeBuffer2.dispose();\n\n\t\tthis.depthMaterial.dispose();\n\t\tthis.prepareMaskMaterial.dispose();\n\t\tthis.edgeDetectionMaterial.dispose();\n\t\tthis.separableBlurMaterial1.dispose();\n\t\tthis.separableBlurMaterial2.dispose();\n\t\tthis.overlayMaterial.dispose();\n\t\tthis.materialCopy.dispose();\n\n\t\tthis._fsQuad.dispose();\n\n\t}\n\n\t/**\n\t * Sets the size of the pass.\n\t *\n\t * @param {number} width - The width to set.\n\t * @param {number} height - The height to set.\n\t */\n\tsetSize( width, height ) {\n\n\t\tthis.renderTargetMaskBuffer.setSize( width, height );\n\t\tthis.renderTargetDepthBuffer.setSize( width, height );\n\n\t\tlet resx = Math.round( width / this.downSampleRatio );\n\t\tlet resy = Math.round( height / this.downSampleRatio );\n\t\tthis.renderTargetMaskDownSampleBuffer.setSize( resx, resy );\n\t\tthis.renderTargetBlurBuffer1.setSize( resx, resy );\n\t\tthis.renderTargetEdgeBuffer1.setSize( resx, resy );\n\t\tthis.separableBlurMaterial1.uniforms[ 'texSize' ].value.set( resx, resy );\n\n\t\tresx = Math.round( resx / 2 );\n\t\tresy = Math.round( resy / 2 );\n\n\t\tthis.renderTargetBlurBuffer2.setSize( resx, resy );\n\t\tthis.renderTargetEdgeBuffer2.setSize( resx, resy );\n\n\t\tthis.separableBlurMaterial2.uniforms[ 'texSize' ].value.set( resx, resy );\n\n\t}\n\n\t/**\n\t * Performs the Outline pass.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( renderer, writeBuffer, readBuffer, deltaTime, maskActive ) {\n\n\t\tif ( this.selectedObjects.length > 0 ) {\n\n\t\t\trenderer.getClearColor( this._oldClearColor );\n\t\t\tthis.oldClearAlpha = renderer.getClearAlpha();\n\t\t\tconst oldAutoClear = renderer.autoClear;\n\n\t\t\trenderer.autoClear = false;\n\n\t\t\tif ( maskActive ) renderer.state.buffers.stencil.setTest( false );\n\n\t\t\trenderer.setClearColor( 0xffffff, 1 );\n\n\t\t\tthis._updateSelectionCache();\n\n\t\t\t// Make selected objects invisible\n\t\t\tthis._changeVisibilityOfSelectedObjects( false );\n\n\t\t\tconst currentBackground = this.renderScene.background;\n\t\t\tconst currentOverrideMaterial = this.renderScene.overrideMaterial;\n\t\t\tthis.renderScene.background = null;\n\n\t\t\t// 1. Draw Non Selected objects in the depth buffer\n\t\t\tthis.renderScene.overrideMaterial = this.depthMaterial;\n\t\t\trenderer.setRenderTarget( this.renderTargetDepthBuffer );\n\t\t\trenderer.clear();\n\t\t\trenderer.render( this.renderScene, this.renderCamera );\n\n\t\t\t// Make selected objects visible\n\t\t\tthis._changeVisibilityOfSelectedObjects( true );\n\t\t\tthis._visibilityCache.clear();\n\n\t\t\t// Update Texture Matrix for Depth compare\n\t\t\tthis._updateTextureMatrix();\n\n\t\t\t// Make non selected objects invisible, and draw only the selected objects, by comparing the depth buffer of non selected objects\n\t\t\tthis._changeVisibilityOfNonSelectedObjects( false );\n\t\t\tthis.renderScene.overrideMaterial = this.prepareMaskMaterial;\n\t\t\tthis.prepareMaskMaterial.uniforms[ 'cameraNearFar' ].value.set( this.renderCamera.near, this.renderCamera.far );\n\t\t\tthis.prepareMaskMaterial.uniforms[ 'depthTexture' ].value = this.renderTargetDepthBuffer.texture;\n\t\t\tthis.prepareMaskMaterial.uniforms[ 'textureMatrix' ].value = this.textureMatrix;\n\t\t\trenderer.setRenderTarget( this.renderTargetMaskBuffer );\n\t\t\trenderer.clear();\n\t\t\trenderer.render( this.renderScene, this.renderCamera );\n\t\t\tthis._changeVisibilityOfNonSelectedObjects( true );\n\t\t\tthis._visibilityCache.clear();\n\t\t\tthis._selectionCache.clear();\n\n\t\t\tthis.renderScene.background = currentBackground;\n\t\t\tthis.renderScene.overrideMaterial = currentOverrideMaterial;\n\n\t\t\t// 2. Downsample to Half resolution\n\t\t\tthis._fsQuad.material = this.materialCopy;\n\t\t\tthis.copyUniforms[ 'tDiffuse' ].value = this.renderTargetMaskBuffer.texture;\n\t\t\trenderer.setRenderTarget( this.renderTargetMaskDownSampleBuffer );\n\t\t\trenderer.clear();\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t\tthis.tempPulseColor1.copy( this.visibleEdgeColor );\n\t\t\tthis.tempPulseColor2.copy( this.hiddenEdgeColor );\n\n\t\t\tif ( this.pulsePeriod > 0 ) {\n\n\t\t\t\tconst scalar = ( 1 + 0.25 ) / 2 + Math.cos( performance.now() * 0.01 / this.pulsePeriod ) * ( 1.0 - 0.25 ) / 2;\n\t\t\t\tthis.tempPulseColor1.multiplyScalar( scalar );\n\t\t\t\tthis.tempPulseColor2.multiplyScalar( scalar );\n\n\t\t\t}\n\n\t\t\t// 3. Apply Edge Detection Pass\n\t\t\tthis._fsQuad.material = this.edgeDetectionMaterial;\n\t\t\tthis.edgeDetectionMaterial.uniforms[ 'maskTexture' ].value = this.renderTargetMaskDownSampleBuffer.texture;\n\t\t\tthis.edgeDetectionMaterial.uniforms[ 'texSize' ].value.set( this.renderTargetMaskDownSampleBuffer.width, this.renderTargetMaskDownSampleBuffer.height );\n\t\t\tthis.edgeDetectionMaterial.uniforms[ 'visibleEdgeColor' ].value = this.tempPulseColor1;\n\t\t\tthis.edgeDetectionMaterial.uniforms[ 'hiddenEdgeColor' ].value = this.tempPulseColor2;\n\t\t\trenderer.setRenderTarget( this.renderTargetEdgeBuffer1 );\n\t\t\trenderer.clear();\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t\t// 4. Apply Blur on Half res\n\t\t\tthis._fsQuad.material = this.separableBlurMaterial1;\n\t\t\tthis.separableBlurMaterial1.uniforms[ 'colorTexture' ].value = this.renderTargetEdgeBuffer1.texture;\n\t\t\tthis.separableBlurMaterial1.uniforms[ 'direction' ].value = OutlinePass.BlurDirectionX;\n\t\t\tthis.separableBlurMaterial1.uniforms[ 'kernelRadius' ].value = this.edgeThickness;\n\t\t\trenderer.setRenderTarget( this.renderTargetBlurBuffer1 );\n\t\t\trenderer.clear();\n\t\t\tthis._fsQuad.render( renderer );\n\t\t\tthis.separableBlurMaterial1.uniforms[ 'colorTexture' ].value = this.renderTargetBlurBuffer1.texture;\n\t\t\tthis.separableBlurMaterial1.uniforms[ 'direction' ].value = OutlinePass.BlurDirectionY;\n\t\t\trenderer.setRenderTarget( this.renderTargetEdgeBuffer1 );\n\t\t\trenderer.clear();\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t\t// Apply Blur on quarter res\n\t\t\tthis._fsQuad.material = this.separableBlurMaterial2;\n\t\t\tthis.separableBlurMaterial2.uniforms[ 'colorTexture' ].value = this.renderTargetEdgeBuffer1.texture;\n\t\t\tthis.separableBlurMaterial2.uniforms[ 'direction' ].value = OutlinePass.BlurDirectionX;\n\t\t\trenderer.setRenderTarget( this.renderTargetBlurBuffer2 );\n\t\t\trenderer.clear();\n\t\t\tthis._fsQuad.render( renderer );\n\t\t\tthis.separableBlurMaterial2.uniforms[ 'colorTexture' ].value = this.renderTargetBlurBuffer2.texture;\n\t\t\tthis.separableBlurMaterial2.uniforms[ 'direction' ].value = OutlinePass.BlurDirectionY;\n\t\t\trenderer.setRenderTarget( this.renderTargetEdgeBuffer2 );\n\t\t\trenderer.clear();\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t\t// Blend it additively over the input texture\n\t\t\tthis._fsQuad.material = this.overlayMaterial;\n\t\t\tthis.overlayMaterial.uniforms[ 'maskTexture' ].value = this.renderTargetMaskBuffer.texture;\n\t\t\tthis.overlayMaterial.uniforms[ 'edgeTexture1' ].value = this.renderTargetEdgeBuffer1.texture;\n\t\t\tthis.overlayMaterial.uniforms[ 'edgeTexture2' ].value = this.renderTargetEdgeBuffer2.texture;\n\t\t\tthis.overlayMaterial.uniforms[ 'patternTexture' ].value = this.patternTexture;\n\t\t\tthis.overlayMaterial.uniforms[ 'edgeStrength' ].value = this.edgeStrength;\n\t\t\tthis.overlayMaterial.uniforms[ 'edgeGlow' ].value = this.edgeGlow;\n\t\t\tthis.overlayMaterial.uniforms[ 'usePatternTexture' ].value = this.usePatternTexture;\n\n\n\t\t\tif ( maskActive ) renderer.state.buffers.stencil.setTest( true );\n\n\t\t\trenderer.setRenderTarget( readBuffer );\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t\trenderer.setClearColor( this._oldClearColor, this.oldClearAlpha );\n\t\t\trenderer.autoClear = oldAutoClear;\n\n\t\t}\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\tthis._fsQuad.material = this.materialCopy;\n\t\t\tthis.copyUniforms[ 'tDiffuse' ].value = readBuffer.texture;\n\t\t\trenderer.setRenderTarget( null );\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t}\n\n\t}\n\n\t// internals\n\n\t_updateSelectionCache() {\n\n\t\tconst cache = this._selectionCache;\n\n\t\tfunction gatherSelectedMeshesCallBack( object ) {\n\n\t\t\tif ( object.isMesh ) cache.add( object );\n\n\t\t}\n\n\t\tcache.clear();\n\n\t\tfor ( let i = 0; i < this.selectedObjects.length; i ++ ) {\n\n\t\t\tconst selectedObject = this.selectedObjects[ i ];\n\t\t\tselectedObject.traverse( gatherSelectedMeshesCallBack );\n\n\t\t}\n\n\t}\n\n\t_changeVisibilityOfSelectedObjects( bVisible ) {\n\n\t\tconst cache = this._visibilityCache;\n\n\t\tfor ( const mesh of this._selectionCache ) {\n\n\t\t\tif ( bVisible === true ) {\n\n\t\t\t\tmesh.visible = cache.get( mesh );\n\n\t\t\t} else {\n\n\t\t\t\tcache.set( mesh, mesh.visible );\n\t\t\t\tmesh.visible = bVisible;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t_changeVisibilityOfNonSelectedObjects( bVisible ) {\n\n\t\tconst visibilityCache = this._visibilityCache;\n\t\tconst selectionCache = this._selectionCache;\n\n\t\tfunction VisibilityChangeCallBack( object ) {\n\n\t\t\tif ( object.isPoints || object.isLine || object.isLine2 ) {\n\n\t\t\t\t// the visibility of points and lines is always set to false in order to\n\t\t\t\t// not affect the outline computation\n\n\t\t\t\tif ( bVisible === true ) {\n\n\t\t\t\t\tobject.visible = visibilityCache.get( object ); // restore\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvisibilityCache.set( object, object.visible );\n\t\t\t\t\tobject.visible = bVisible;\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isMesh || object.isSprite ) {\n\n\t\t\t\t// only meshes and sprites are supported by OutlinePass\n\n\t\t\t\tif ( ! selectionCache.has( object ) ) {\n\n\t\t\t\t\tconst visibility = object.visible;\n\n\t\t\t\t\tif ( bVisible === false || visibilityCache.get( object ) === true ) {\n\n\t\t\t\t\t\tobject.visible = bVisible;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvisibilityCache.set( object, visibility );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.renderScene.traverse( VisibilityChangeCallBack );\n\n\t}\n\n\t_updateTextureMatrix() {\n\n\t\tthis.textureMatrix.set( 0.5, 0.0, 0.0, 0.5,\n\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t0.0, 0.0, 0.0, 1.0 );\n\t\tthis.textureMatrix.multiply( this.renderCamera.projectionMatrix );\n\t\tthis.textureMatrix.multiply( this.renderCamera.matrixWorldInverse );\n\n\t}\n\n\t_getPrepareMaskMaterial() {\n\n\t\treturn new ShaderMaterial( {\n\n\t\t\tuniforms: {\n\t\t\t\t'depthTexture': { value: null },\n\t\t\t\t'cameraNearFar': { value: new Vector2( 0.5, 0.5 ) },\n\t\t\t\t'textureMatrix': { value: null }\n\t\t\t},\n\n\t\t\tvertexShader:\n\t\t\t\t`#include <batching_pars_vertex>\n\t\t\t\t#include <morphtarget_pars_vertex>\n\t\t\t\t#include <skinning_pars_vertex>\n\n\t\t\t\tvarying vec4 projTexCoord;\n\t\t\t\tvarying vec4 vPosition;\n\t\t\t\tuniform mat4 textureMatrix;\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\t#include <batching_vertex>\n\t\t\t\t\t#include <skinbase_vertex>\n\t\t\t\t\t#include <begin_vertex>\n\t\t\t\t\t#include <morphtarget_vertex>\n\t\t\t\t\t#include <skinning_vertex>\n\t\t\t\t\t#include <project_vertex>\n\n\t\t\t\t\tvPosition = mvPosition;\n\n\t\t\t\t\tvec4 worldPosition = vec4( transformed, 1.0 );\n\n\t\t\t\t\t#ifdef USE_INSTANCING\n\n\t\t\t\t\t\tworldPosition = instanceMatrix * worldPosition;\n\n\t\t\t\t\t#endif\n\n\t\t\t\t\tworldPosition = modelMatrix * worldPosition;\n\n\t\t\t\t\tprojTexCoord = textureMatrix * worldPosition;\n\n\t\t\t\t}`,\n\n\t\t\tfragmentShader:\n\t\t\t\t`#include <packing>\n\t\t\t\tvarying vec4 vPosition;\n\t\t\t\tvarying vec4 projTexCoord;\n\t\t\t\tuniform sampler2D depthTexture;\n\t\t\t\tuniform vec2 cameraNearFar;\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tfloat depth = unpackRGBAToDepth(texture2DProj( depthTexture, projTexCoord ));\n\t\t\t\t\tfloat viewZ = - DEPTH_TO_VIEW_Z( depth, cameraNearFar.x, cameraNearFar.y );\n\t\t\t\t\tfloat depthTest = (-vPosition.z > viewZ) ? 1.0 : 0.0;\n\t\t\t\t\tgl_FragColor = vec4(0.0, depthTest, 1.0, 1.0);\n\n\t\t\t\t}`\n\n\t\t} );\n\n\t}\n\n\t_getEdgeDetectionMaterial() {\n\n\t\treturn new ShaderMaterial( {\n\n\t\t\tuniforms: {\n\t\t\t\t'maskTexture': { value: null },\n\t\t\t\t'texSize': { value: new Vector2( 0.5, 0.5 ) },\n\t\t\t\t'visibleEdgeColor': { value: new Vector3( 1.0, 1.0, 1.0 ) },\n\t\t\t\t'hiddenEdgeColor': { value: new Vector3( 1.0, 1.0, 1.0 ) },\n\t\t\t},\n\n\t\t\tvertexShader:\n\t\t\t\t`varying vec2 vUv;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,\n\n\t\t\tfragmentShader:\n\t\t\t\t`varying vec2 vUv;\n\n\t\t\t\tuniform sampler2D maskTexture;\n\t\t\t\tuniform vec2 texSize;\n\t\t\t\tuniform vec3 visibleEdgeColor;\n\t\t\t\tuniform vec3 hiddenEdgeColor;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvec2 invSize = 1.0 / texSize;\n\t\t\t\t\tvec4 uvOffset = vec4(1.0, 0.0, 0.0, 1.0) * vec4(invSize, invSize);\n\t\t\t\t\tvec4 c1 = texture2D( maskTexture, vUv + uvOffset.xy);\n\t\t\t\t\tvec4 c2 = texture2D( maskTexture, vUv - uvOffset.xy);\n\t\t\t\t\tvec4 c3 = texture2D( maskTexture, vUv + uvOffset.yw);\n\t\t\t\t\tvec4 c4 = texture2D( maskTexture, vUv - uvOffset.yw);\n\t\t\t\t\tfloat diff1 = (c1.r - c2.r)*0.5;\n\t\t\t\t\tfloat diff2 = (c3.r - c4.r)*0.5;\n\t\t\t\t\tfloat d = length( vec2(diff1, diff2) );\n\t\t\t\t\tfloat a1 = min(c1.g, c2.g);\n\t\t\t\t\tfloat a2 = min(c3.g, c4.g);\n\t\t\t\t\tfloat visibilityFactor = min(a1, a2);\n\t\t\t\t\tvec3 edgeColor = 1.0 - visibilityFactor > 0.001 ? visibleEdgeColor : hiddenEdgeColor;\n\t\t\t\t\tgl_FragColor = vec4(edgeColor, 1.0) * vec4(d);\n\t\t\t\t}`\n\t\t} );\n\n\t}\n\n\t_getSeparableBlurMaterial( maxRadius ) {\n\n\t\treturn new ShaderMaterial( {\n\n\t\t\tdefines: {\n\t\t\t\t'MAX_RADIUS': maxRadius,\n\t\t\t},\n\n\t\t\tuniforms: {\n\t\t\t\t'colorTexture': { value: null },\n\t\t\t\t'texSize': { value: new Vector2( 0.5, 0.5 ) },\n\t\t\t\t'direction': { value: new Vector2( 0.5, 0.5 ) },\n\t\t\t\t'kernelRadius': { value: 1.0 }\n\t\t\t},\n\n\t\t\tvertexShader:\n\t\t\t\t`varying vec2 vUv;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,\n\n\t\t\tfragmentShader:\n\t\t\t\t`#include <common>\n\t\t\t\tvarying vec2 vUv;\n\t\t\t\tuniform sampler2D colorTexture;\n\t\t\t\tuniform vec2 texSize;\n\t\t\t\tuniform vec2 direction;\n\t\t\t\tuniform float kernelRadius;\n\n\t\t\t\tfloat gaussianPdf(in float x, in float sigma) {\n\t\t\t\t\treturn 0.39894 * exp( -0.5 * x * x/( sigma * sigma))/sigma;\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvec2 invSize = 1.0 / texSize;\n\t\t\t\t\tfloat sigma = kernelRadius/2.0;\n\t\t\t\t\tfloat weightSum = gaussianPdf(0.0, sigma);\n\t\t\t\t\tvec4 diffuseSum = texture2D( colorTexture, vUv) * weightSum;\n\t\t\t\t\tvec2 delta = direction * invSize * kernelRadius/float(MAX_RADIUS);\n\t\t\t\t\tvec2 uvOffset = delta;\n\t\t\t\t\tfor( int i = 1; i <= MAX_RADIUS; i ++ ) {\n\t\t\t\t\t\tfloat x = kernelRadius * float(i) / float(MAX_RADIUS);\n\t\t\t\t\t\tfloat w = gaussianPdf(x, sigma);\n\t\t\t\t\t\tvec4 sample1 = texture2D( colorTexture, vUv + uvOffset);\n\t\t\t\t\t\tvec4 sample2 = texture2D( colorTexture, vUv - uvOffset);\n\t\t\t\t\t\tdiffuseSum += ((sample1 + sample2) * w);\n\t\t\t\t\t\tweightSum += (2.0 * w);\n\t\t\t\t\t\tuvOffset += delta;\n\t\t\t\t\t}\n\t\t\t\t\tgl_FragColor = diffuseSum/weightSum;\n\t\t\t\t}`\n\t\t} );\n\n\t}\n\n\t_getOverlayMaterial() {\n\n\t\treturn new ShaderMaterial( {\n\n\t\t\tuniforms: {\n\t\t\t\t'maskTexture': { value: null },\n\t\t\t\t'edgeTexture1': { value: null },\n\t\t\t\t'edgeTexture2': { value: null },\n\t\t\t\t'patternTexture': { value: null },\n\t\t\t\t'edgeStrength': { value: 1.0 },\n\t\t\t\t'edgeGlow': { value: 1.0 },\n\t\t\t\t'usePatternTexture': { value: 0.0 }\n\t\t\t},\n\n\t\t\tvertexShader:\n\t\t\t\t`varying vec2 vUv;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,\n\n\t\t\tfragmentShader:\n\t\t\t\t`varying vec2 vUv;\n\n\t\t\t\tuniform sampler2D maskTexture;\n\t\t\t\tuniform sampler2D edgeTexture1;\n\t\t\t\tuniform sampler2D edgeTexture2;\n\t\t\t\tuniform sampler2D patternTexture;\n\t\t\t\tuniform float edgeStrength;\n\t\t\t\tuniform float edgeGlow;\n\t\t\t\tuniform bool usePatternTexture;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvec4 edgeValue1 = texture2D(edgeTexture1, vUv);\n\t\t\t\t\tvec4 edgeValue2 = texture2D(edgeTexture2, vUv);\n\t\t\t\t\tvec4 maskColor = texture2D(maskTexture, vUv);\n\t\t\t\t\tvec4 patternColor = texture2D(patternTexture, 6.0 * vUv);\n\t\t\t\t\tfloat visibilityFactor = 1.0 - maskColor.g > 0.0 ? 1.0 : 0.5;\n\t\t\t\t\tvec4 edgeValue = edgeValue1 + edgeValue2 * edgeGlow;\n\t\t\t\t\tvec4 finalColor = edgeStrength * maskColor.r * edgeValue;\n\t\t\t\t\tif(usePatternTexture)\n\t\t\t\t\t\tfinalColor += + visibilityFactor * (1.0 - maskColor.r) * (1.0 - patternColor.r);\n\t\t\t\t\tgl_FragColor = finalColor;\n\t\t\t\t}`,\n\t\t\tblending: AdditiveBlending,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\ttransparent: true\n\t\t} );\n\n\t}\n\n}\n\nOutlinePass.BlurDirectionX = new Vector2( 1.0, 0.0 );\nOutlinePass.BlurDirectionY = new Vector2( 0.0, 1.0 );\n\nexport { OutlinePass };\n", "/**\n * @module OutputShader\n * @three_import import { OutputShader } from 'three/addons/shaders/OutputShader.js';\n */\n\n/**\n * Performs tone mapping and color space conversion for\n * FX workflows.\n *\n * Used by {@link OutputPass}.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst OutputShader = {\n\n\tname: 'OutputShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'toneMappingExposure': { value: 1 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\t\tprecision highp float;\n\n\t\tuniform mat4 modelViewMatrix;\n\t\tuniform mat4 projectionMatrix;\n\n\t\tattribute vec3 position;\n\t\tattribute vec2 uv;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tprecision highp float;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\t#include <tonemapping_pars_fragment>\n\t\t#include <colorspace_pars_fragment>\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = texture2D( tDiffuse, vUv );\n\n\t\t\t// tone mapping\n\n\t\t\t#ifdef LINEAR_TONE_MAPPING\n\n\t\t\t\tgl_FragColor.rgb = LinearToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( REINHARD_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = ReinhardToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( CINEON_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = CineonToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( ACES_FILMIC_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = ACESFilmicToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( AGX_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = AgXToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( NEUTRAL_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = NeutralToneMapping( gl_FragColor.rgb );\n\n\t\t\t#elif defined( CUSTOM_TONE_MAPPING )\n\n\t\t\t\tgl_FragColor.rgb = CustomToneMapping( gl_FragColor.rgb );\n\n\t\t\t#endif\n\n\t\t\t// color space\n\n\t\t\t#ifdef SRGB_TRANSFER\n\n\t\t\t\tgl_FragColor = sRGBTransferOETF( gl_FragColor );\n\n\t\t\t#endif\n\n\t\t}`\n\n};\n\nexport { OutputShader };\n", "import {\n\tColorManagement,\n\tRawShaderMaterial,\n\tUniformsUtils,\n\tLinearToneMapping,\n\tReinhardToneMapping,\n\tCineonToneMapping,\n\tAgXToneMapping,\n\tACESFilmicToneMapping,\n\tNeutralToneMapping,\n\tCustomToneMapping,\n\tSRGBTransfer\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\nimport { OutputShader } from '../shaders/OutputShader.js';\n\n/**\n * This pass is responsible for including tone mapping and color space conversion\n * into your pass chain. In most cases, this pass should be included at the end\n * of each pass chain. If a pass requires sRGB input (e.g. like FXAA), the pass\n * must follow `OutputPass` in the pass chain.\n *\n * The tone mapping and color space settings are extracted from the renderer.\n *\n * ```js\n * const outputPass = new OutputPass();\n * composer.addPass( outputPass );\n * ```\n *\n * @augments Pass\n * @three_import import { OutputPass } from 'three/addons/postprocessing/OutputPass.js';\n */\nclass OutputPass extends Pass {\n\n\t/**\n\t * Constructs a new output pass.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag indicates that this is an output pass.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isOutputPass = true;\n\n\t\t/**\n\t\t * The pass uniforms.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.uniforms = UniformsUtils.clone( OutputShader.uniforms );\n\n\t\t/**\n\t\t * The pass material.\n\t\t *\n\t\t * @type {RawShaderMaterial}\n\t\t */\n\t\tthis.material = new RawShaderMaterial( {\n\t\t\tname: OutputShader.name,\n\t\t\tuniforms: this.uniforms,\n\t\t\tvertexShader: OutputShader.vertexShader,\n\t\t\tfragmentShader: OutputShader.fragmentShader\n\t\t} );\n\n\t\t// internals\n\n\t\tthis._fsQuad = new FullScreenQuad( this.material );\n\n\t\tthis._outputColorSpace = null;\n\t\tthis._toneMapping = null;\n\n\t}\n\n\t/**\n\t * Performs the output pass.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( renderer, writeBuffer, readBuffer/*, deltaTime, maskActive */ ) {\n\n\t\tthis.uniforms[ 'tDiffuse' ].value = readBuffer.texture;\n\t\tthis.uniforms[ 'toneMappingExposure' ].value = renderer.toneMappingExposure;\n\n\t\t// rebuild defines if required\n\n\t\tif ( this._outputColorSpace !== renderer.outputColorSpace || this._toneMapping !== renderer.toneMapping ) {\n\n\t\t\tthis._outputColorSpace = renderer.outputColorSpace;\n\t\t\tthis._toneMapping = renderer.toneMapping;\n\n\t\t\tthis.material.defines = {};\n\n\t\t\tif ( ColorManagement.getTransfer( this._outputColorSpace ) === SRGBTransfer ) this.material.defines.SRGB_TRANSFER = '';\n\n\t\t\tif ( this._toneMapping === LinearToneMapping ) this.material.defines.LINEAR_TONE_MAPPING = '';\n\t\t\telse if ( this._toneMapping === ReinhardToneMapping ) this.material.defines.REINHARD_TONE_MAPPING = '';\n\t\t\telse if ( this._toneMapping === CineonToneMapping ) this.material.defines.CINEON_TONE_MAPPING = '';\n\t\t\telse if ( this._toneMapping === ACESFilmicToneMapping ) this.material.defines.ACES_FILMIC_TONE_MAPPING = '';\n\t\t\telse if ( this._toneMapping === AgXToneMapping ) this.material.defines.AGX_TONE_MAPPING = '';\n\t\t\telse if ( this._toneMapping === NeutralToneMapping ) this.material.defines.NEUTRAL_TONE_MAPPING = '';\n\t\t\telse if ( this._toneMapping === CustomToneMapping ) this.material.defines.CUSTOM_TONE_MAPPING = '';\n\n\t\t\tthis.material.needsUpdate = true;\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this.renderToScreen === true ) {\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t} else {\n\n\t\t\trenderer.setRenderTarget( writeBuffer );\n\t\t\tif ( this.clear ) renderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the pass is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.material.dispose();\n\t\tthis._fsQuad.dispose();\n\n\t}\n\n}\n\nexport { OutputPass };\n", "import {\n\tColor\n} from 'three';\nimport { Pass } from './Pass.js';\n\n/**\n * This class represents a render pass. It takes a camera and a scene and produces\n * a beauty pass for subsequent post processing effects.\n *\n * ```js\n * const renderPass = new RenderPass( scene, camera );\n * composer.addPass( renderPass );\n * ```\n *\n * @augments Pass\n * @three_import import { RenderPass } from 'three/addons/postprocessing/RenderPass.js';\n */\nclass RenderPass extends Pass {\n\n\t/**\n\t * Constructs a new render pass.\n\t *\n\t * @param {Scene} scene - The scene to render.\n\t * @param {Camera} camera - The camera.\n\t * @param {?Material} [overrideMaterial=null] - The override material. If set, this material is used\n\t * for all objects in the scene.\n\t * @param {?(number|Color|string)} [clearColor=null] - The clear color of the render pass.\n\t * @param {?number} [clearAlpha=null] - The clear alpha of the render pass.\n\t */\n\tconstructor( scene, camera, overrideMaterial = null, clearColor = null, clearAlpha = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The scene to render.\n\t\t *\n\t\t * @type {Scene}\n\t\t */\n\t\tthis.scene = scene;\n\n\t\t/**\n\t\t * The camera.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = camera;\n\n\t\t/**\n\t\t * The override material. If set, this material is used\n\t\t * for all objects in the scene.\n\t\t *\n\t\t * @type {?Material}\n\t\t * @default null\n\t\t */\n\t\tthis.overrideMaterial = overrideMaterial;\n\n\t\t/**\n\t\t * The clear color of the render pass.\n\t\t *\n\t\t * @type {?(number|Color|string)}\n\t\t * @default null\n\t\t */\n\t\tthis.clearColor = clearColor;\n\n\t\t/**\n\t\t * The clear alpha of the render pass.\n\t\t *\n\t\t * @type {?number}\n\t\t * @default null\n\t\t */\n\t\tthis.clearAlpha = clearAlpha;\n\n\t\t/**\n\t\t * Overwritten to perform a clear operation by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.clear = true;\n\n\t\t/**\n\t\t * If set to `true`, only the depth can be cleared when `clear` is to `false`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clearDepth = false;\n\n\t\t/**\n\t\t * Overwritten to disable the swap.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsSwap = false;\n\n\t\t/**\n\t\t * This flag indicates that this pass renders the scene itself.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRenderPass = true;\n\n\t\tthis._oldClearColor = new Color();\n\n\t}\n\n\t/**\n\t * Performs a beauty pass with the configured scene and camera.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\tconst oldAutoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tlet oldClearAlpha, oldOverrideMaterial;\n\n\t\tif ( this.overrideMaterial !== null ) {\n\n\t\t\toldOverrideMaterial = this.scene.overrideMaterial;\n\n\t\t\tthis.scene.overrideMaterial = this.overrideMaterial;\n\n\t\t}\n\n\t\tif ( this.clearColor !== null ) {\n\n\t\t\trenderer.getClearColor( this._oldClearColor );\n\t\t\trenderer.setClearColor( this.clearColor, renderer.getClearAlpha() );\n\n\t\t}\n\n\t\tif ( this.clearAlpha !== null ) {\n\n\t\t\toldClearAlpha = renderer.getClearAlpha();\n\t\t\trenderer.setClearAlpha( this.clearAlpha );\n\n\t\t}\n\n\t\tif ( this.clearDepth == true ) {\n\n\t\t\trenderer.clearDepth();\n\n\t\t}\n\n\t\trenderer.setRenderTarget( this.renderToScreen ? null : readBuffer );\n\n\t\tif ( this.clear === true ) {\n\n\t\t\t// TODO: Avoid using autoClear properties, see https://github.com/mrdoob/three.js/pull/15571#issuecomment-465669600\n\t\t\trenderer.clear( renderer.autoClearColor, renderer.autoClearDepth, renderer.autoClearStencil );\n\n\t\t}\n\n\t\trenderer.render( this.scene, this.camera );\n\n\t\t// restore\n\n\t\tif ( this.clearColor !== null ) {\n\n\t\t\trenderer.setClearColor( this._oldClearColor );\n\n\t\t}\n\n\t\tif ( this.clearAlpha !== null ) {\n\n\t\t\trenderer.setClearAlpha( oldClearAlpha );\n\n\t\t}\n\n\t\tif ( this.overrideMaterial !== null ) {\n\n\t\t\tthis.scene.overrideMaterial = oldOverrideMaterial;\n\n\t\t}\n\n\t\trenderer.autoClear = oldAutoClear;\n\n\t}\n\n}\n\nexport { RenderPass };\n", "import {\n\tWebGLRenderTarget,\n\tMeshNormalMaterial,\n\tShaderMaterial,\n\tVector2,\n\tVector4,\n\tDepthTexture,\n\tNearestFilter,\n\tHalfFloatType\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\n\n/**\n * A special type of render pass that produces a pixelated beauty pass.\n *\n * ```js\n * const renderPixelatedPass = new RenderPixelatedPass( 6, scene, camera );\n * composer.addPass( renderPixelatedPass );\n * ```\n *\n * @augments Pass\n * @three_import import { RenderPixelatedPass } from 'three/addons/postprocessing/RenderPixelatedPass.js';\n */\nclass RenderPixelatedPass extends Pass {\n\n\t/**\n\t * Constructs a new render pixelated pass.\n\t *\n\t * @param {number} pixelSize - The effect's pixel size.\n\t * @param {Scene} scene - The scene to render.\n\t * @param {Camera} camera - The camera.\n\t * @param {{normalEdgeStrength:number,depthEdgeStrength:number}} options - The pass options.\n\t */\n\tconstructor( pixelSize, scene, camera, options = {} ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The effect's pixel size.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.pixelSize = pixelSize;\n\n\t\t/**\n\t\t * The scene to render.\n\t\t *\n\t\t * @type {Scene}\n\t\t */\n\t\tthis.scene = scene;\n\n\t\t/**\n\t\t * The camera.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = camera;\n\n\t\t/**\n\t\t * The normal edge strength.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.3\n\t\t */\n\t\tthis.normalEdgeStrength = options.normalEdgeStrength || 0.3;\n\n\t\t/**\n\t\t * The normal edge strength.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.4\n\t\t */\n\t\tthis.depthEdgeStrength = options.depthEdgeStrength || 0.4;\n\n\t\t/**\n\t\t * The pixelated material.\n\t\t *\n\t\t * @type {ShaderMaterial}\n\t\t */\n\t\tthis.pixelatedMaterial = this._createPixelatedMaterial();\n\n\t\t// internals\n\n\t\tthis._resolution = new Vector2();\n\t\tthis._renderResolution = new Vector2();\n\n\t\tthis._normalMaterial = new MeshNormalMaterial();\n\n\t\tthis._beautyRenderTarget = new WebGLRenderTarget();\n\t\tthis._beautyRenderTarget.texture.minFilter = NearestFilter;\n\t\tthis._beautyRenderTarget.texture.magFilter = NearestFilter;\n\t\tthis._beautyRenderTarget.texture.type = HalfFloatType;\n\t\tthis._beautyRenderTarget.depthTexture = new DepthTexture();\n\n\t\tthis._normalRenderTarget = new WebGLRenderTarget();\n\t\tthis._normalRenderTarget.texture.minFilter = NearestFilter;\n\t\tthis._normalRenderTarget.texture.magFilter = NearestFilter;\n\t\tthis._normalRenderTarget.texture.type = HalfFloatType;\n\n\t\tthis._fsQuad = new FullScreenQuad( this.pixelatedMaterial );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the pass is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis._beautyRenderTarget.dispose();\n\t\tthis._normalRenderTarget.dispose();\n\n\t\tthis.pixelatedMaterial.dispose();\n\t\tthis._normalMaterial.dispose();\n\n\t\tthis._fsQuad.dispose();\n\n\t}\n\n\t/**\n\t * Sets the size of the pass.\n\t *\n\t * @param {number} width - The width to set.\n\t * @param {number} height - The height to set.\n\t */\n\tsetSize( width, height ) {\n\n\t\tthis._resolution.set( width, height );\n\t\tthis._renderResolution.set( ( width / this.pixelSize ) | 0, ( height / this.pixelSize ) | 0 );\n\t\tconst { x, y } = this._renderResolution;\n\t\tthis._beautyRenderTarget.setSize( x, y );\n\t\tthis._normalRenderTarget.setSize( x, y );\n\t\tthis._fsQuad.material.uniforms.resolution.value.set( x, y, 1 / x, 1 / y );\n\n\t}\n\n\t/**\n\t * Sets the effect's pixel size.\n\t *\n\t * @param {number} pixelSize - The pixel size to set.\n\t */\n\tsetPixelSize( pixelSize ) {\n\n\t\tthis.pixelSize = pixelSize;\n\t\tthis.setSize( this._resolution.x, this._resolution.y );\n\n\t}\n\n\t/**\n\t * Performs the pixelation pass.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( renderer, writeBuffer/*, readBuffer , deltaTime, maskActive */ ) {\n\n\t\tconst uniforms = this._fsQuad.material.uniforms;\n\t\tuniforms.normalEdgeStrength.value = this.normalEdgeStrength;\n\t\tuniforms.depthEdgeStrength.value = this.depthEdgeStrength;\n\n\t\trenderer.setRenderTarget( this._beautyRenderTarget );\n\t\trenderer.render( this.scene, this.camera );\n\n\t\tconst overrideMaterial_old = this.scene.overrideMaterial;\n\t\trenderer.setRenderTarget( this._normalRenderTarget );\n\t\tthis.scene.overrideMaterial = this._normalMaterial;\n\t\trenderer.render( this.scene, this.camera );\n\t\tthis.scene.overrideMaterial = overrideMaterial_old;\n\n\t\tuniforms.tDiffuse.value = this._beautyRenderTarget.texture;\n\t\tuniforms.tDepth.value = this._beautyRenderTarget.depthTexture;\n\t\tuniforms.tNormal.value = this._normalRenderTarget.texture;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.setRenderTarget( null );\n\n\t\t} else {\n\n\t\t\trenderer.setRenderTarget( writeBuffer );\n\n\t\t\tif ( this.clear ) renderer.clear();\n\n\t\t}\n\n\t\tthis._fsQuad.render( renderer );\n\n\t}\n\n\t// internals\n\n\t_createPixelatedMaterial() {\n\n\t\treturn new ShaderMaterial( {\n\t\t\tuniforms: {\n\t\t\t\ttDiffuse: { value: null },\n\t\t\t\ttDepth: { value: null },\n\t\t\t\ttNormal: { value: null },\n\t\t\t\tresolution: { value: new Vector4() },\n\t\t\t\tnormalEdgeStrength: { value: 0 },\n\t\t\t\tdepthEdgeStrength: { value: 0 }\n\t\t\t},\n\t\t\tvertexShader: /* glsl */`\n\t\t\t\tvarying vec2 vUv;\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t\t\t}\n\t\t\t`,\n\t\t\tfragmentShader: /* glsl */`\n\t\t\t\tuniform sampler2D tDiffuse;\n\t\t\t\tuniform sampler2D tDepth;\n\t\t\t\tuniform sampler2D tNormal;\n\t\t\t\tuniform vec4 resolution;\n\t\t\t\tuniform float normalEdgeStrength;\n\t\t\t\tuniform float depthEdgeStrength;\n\t\t\t\tvarying vec2 vUv;\n\n\t\t\t\tfloat getDepth(int x, int y) {\n\n\t\t\t\t\treturn texture2D( tDepth, vUv + vec2(x, y) * resolution.zw ).r;\n\n\t\t\t\t}\n\n\t\t\t\tvec3 getNormal(int x, int y) {\n\n\t\t\t\t\treturn texture2D( tNormal, vUv + vec2(x, y) * resolution.zw ).rgb * 2.0 - 1.0;\n\n\t\t\t\t}\n\n\t\t\t\tfloat depthEdgeIndicator(float depth, vec3 normal) {\n\n\t\t\t\t\tfloat diff = 0.0;\n\t\t\t\t\tdiff += clamp(getDepth(1, 0) - depth, 0.0, 1.0);\n\t\t\t\t\tdiff += clamp(getDepth(-1, 0) - depth, 0.0, 1.0);\n\t\t\t\t\tdiff += clamp(getDepth(0, 1) - depth, 0.0, 1.0);\n\t\t\t\t\tdiff += clamp(getDepth(0, -1) - depth, 0.0, 1.0);\n\t\t\t\t\treturn floor(smoothstep(0.01, 0.02, diff) * 2.) / 2.;\n\n\t\t\t\t}\n\n\t\t\t\tfloat neighborNormalEdgeIndicator(int x, int y, float depth, vec3 normal) {\n\n\t\t\t\t\tfloat depthDiff = getDepth(x, y) - depth;\n\t\t\t\t\tvec3 neighborNormal = getNormal(x, y);\n\n\t\t\t\t\t// Edge pixels should yield to faces who's normals are closer to the bias normal.\n\t\t\t\t\tvec3 normalEdgeBias = vec3(1., 1., 1.); // This should probably be a parameter.\n\t\t\t\t\tfloat normalDiff = dot(normal - neighborNormal, normalEdgeBias);\n\t\t\t\t\tfloat normalIndicator = clamp(smoothstep(-.01, .01, normalDiff), 0.0, 1.0);\n\n\t\t\t\t\t// Only the shallower pixel should detect the normal edge.\n\t\t\t\t\tfloat depthIndicator = clamp(sign(depthDiff * .25 + .0025), 0.0, 1.0);\n\n\t\t\t\t\treturn (1.0 - dot(normal, neighborNormal)) * depthIndicator * normalIndicator;\n\n\t\t\t\t}\n\n\t\t\t\tfloat normalEdgeIndicator(float depth, vec3 normal) {\n\n\t\t\t\t\tfloat indicator = 0.0;\n\n\t\t\t\t\tindicator += neighborNormalEdgeIndicator(0, -1, depth, normal);\n\t\t\t\t\tindicator += neighborNormalEdgeIndicator(0, 1, depth, normal);\n\t\t\t\t\tindicator += neighborNormalEdgeIndicator(-1, 0, depth, normal);\n\t\t\t\t\tindicator += neighborNormalEdgeIndicator(1, 0, depth, normal);\n\n\t\t\t\t\treturn step(0.1, indicator);\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\n\t\t\t\t\tfloat depth = 0.0;\n\t\t\t\t\tvec3 normal = vec3(0.0);\n\n\t\t\t\t\tif (depthEdgeStrength > 0.0 || normalEdgeStrength > 0.0) {\n\n\t\t\t\t\t\tdepth = getDepth(0, 0);\n\t\t\t\t\t\tnormal = getNormal(0, 0);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tfloat dei = 0.0;\n\t\t\t\t\tif (depthEdgeStrength > 0.0)\n\t\t\t\t\t\tdei = depthEdgeIndicator(depth, normal);\n\n\t\t\t\t\tfloat nei = 0.0;\n\t\t\t\t\tif (normalEdgeStrength > 0.0)\n\t\t\t\t\t\tnei = normalEdgeIndicator(depth, normal);\n\n\t\t\t\t\tfloat Strength = dei > 0.0 ? (1.0 - depthEdgeStrength * dei) : (1.0 + normalEdgeStrength * nei);\n\n\t\t\t\t\tgl_FragColor = texel * Strength;\n\n\t\t\t\t}\n\t\t\t`\n\t\t} );\n\n\t}\n\n}\n\nexport { RenderPixelatedPass };\n", "import {\n\tMatrix4,\n\tVector2\n} from 'three';\n\n/**\n * @module SAOShader\n * @three_import import { SAOShader } from 'three/addons/shaders/SAOShader.js';\n */\n\n/**\n * SAO shader.\n *\n * Used by {@link SAOPass}.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst SAOShader = {\n\n\tname: 'SAOShader',\n\n\tdefines: {\n\t\t'NUM_SAMPLES': 7,\n\t\t'NUM_RINGS': 4,\n\t\t'DIFFUSE_TEXTURE': 0,\n\t\t'PERSPECTIVE_CAMERA': 1\n\t},\n\n\tuniforms: {\n\n\t\t'tDepth': { value: null },\n\t\t'tDiffuse': { value: null },\n\t\t'tNormal': { value: null },\n\t\t'size': { value: new Vector2( 512, 512 ) },\n\n\t\t'cameraNear': { value: 1 },\n\t\t'cameraFar': { value: 100 },\n\t\t'cameraProjectionMatrix': { value: new Matrix4() },\n\t\t'cameraInverseProjectionMatrix': { value: new Matrix4() },\n\n\t\t'scale': { value: 1.0 },\n\t\t'intensity': { value: 0.1 },\n\t\t'bias': { value: 0.5 },\n\n\t\t'minResolution': { value: 0.0 },\n\t\t'kernelRadius': { value: 100.0 },\n\t\t'randomSeed': { value: 0.0 }\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\t\t#include <common>\n\n\t\tvarying vec2 vUv;\n\n\t\t#if DIFFUSE_TEXTURE == 1\n\t\tuniform sampler2D tDiffuse;\n\t\t#endif\n\n\t\tuniform highp sampler2D tDepth;\n\t\tuniform highp sampler2D tNormal;\n\n\t\tuniform float cameraNear;\n\t\tuniform float cameraFar;\n\t\tuniform mat4 cameraProjectionMatrix;\n\t\tuniform mat4 cameraInverseProjectionMatrix;\n\n\t\tuniform float scale;\n\t\tuniform float intensity;\n\t\tuniform float bias;\n\t\tuniform float kernelRadius;\n\t\tuniform float minResolution;\n\t\tuniform vec2 size;\n\t\tuniform float randomSeed;\n\n\t\t// RGBA depth\n\n\t\t#include <packing>\n\n\t\tvec4 getDefaultColor( const in vec2 screenPosition ) {\n\t\t\t#if DIFFUSE_TEXTURE == 1\n\t\t\treturn texture2D( tDiffuse, vUv );\n\t\t\t#else\n\t\t\treturn vec4( 1.0 );\n\t\t\t#endif\n\t\t}\n\n\t\tfloat getDepth( const in vec2 screenPosition ) {\n\t\t\treturn texture2D( tDepth, screenPosition ).x;\n\t\t}\n\n\t\tfloat getViewZ( const in float depth ) {\n\t\t\t#if PERSPECTIVE_CAMERA == 1\n\t\t\treturn perspectiveDepthToViewZ( depth, cameraNear, cameraFar );\n\t\t\t#else\n\t\t\treturn orthographicDepthToViewZ( depth, cameraNear, cameraFar );\n\t\t\t#endif\n\t\t}\n\n\t\tvec3 getViewPosition( const in vec2 screenPosition, const in float depth, const in float viewZ ) {\n\t\t\tfloat clipW = cameraProjectionMatrix[2][3] * viewZ + cameraProjectionMatrix[3][3];\n\t\t\tvec4 clipPosition = vec4( ( vec3( screenPosition, depth ) - 0.5 ) * 2.0, 1.0 );\n\t\t\tclipPosition *= clipW; // unprojection.\n\n\t\t\treturn ( cameraInverseProjectionMatrix * clipPosition ).xyz;\n\t\t}\n\n\t\tvec3 getViewNormal( const in vec3 viewPosition, const in vec2 screenPosition ) {\n\t\t\treturn unpackRGBToNormal( texture2D( tNormal, screenPosition ).xyz );\n\t\t}\n\n\t\tfloat scaleDividedByCameraFar;\n\t\tfloat minResolutionMultipliedByCameraFar;\n\n\t\tfloat getOcclusion( const in vec3 centerViewPosition, const in vec3 centerViewNormal, const in vec3 sampleViewPosition ) {\n\t\t\tvec3 viewDelta = sampleViewPosition - centerViewPosition;\n\t\t\tfloat viewDistance = length( viewDelta );\n\t\t\tfloat scaledScreenDistance = scaleDividedByCameraFar * viewDistance;\n\n\t\t\treturn max(0.0, (dot(centerViewNormal, viewDelta) - minResolutionMultipliedByCameraFar) / scaledScreenDistance - bias) / (1.0 + pow2( scaledScreenDistance ) );\n\t\t}\n\n\t\t// moving costly divides into consts\n\t\tconst float ANGLE_STEP = PI2 * float( NUM_RINGS ) / float( NUM_SAMPLES );\n\t\tconst float INV_NUM_SAMPLES = 1.0 / float( NUM_SAMPLES );\n\n\t\tfloat getAmbientOcclusion( const in vec3 centerViewPosition ) {\n\t\t\t// precompute some variables require in getOcclusion.\n\t\t\tscaleDividedByCameraFar = scale / cameraFar;\n\t\t\tminResolutionMultipliedByCameraFar = minResolution * cameraFar;\n\t\t\tvec3 centerViewNormal = getViewNormal( centerViewPosition, vUv );\n\n\t\t\t// jsfiddle that shows sample pattern: https://jsfiddle.net/a16ff1p7/\n\t\t\tfloat angle = rand( vUv + randomSeed ) * PI2;\n\t\t\tvec2 radius = vec2( kernelRadius * INV_NUM_SAMPLES ) / size;\n\t\t\tvec2 radiusStep = radius;\n\n\t\t\tfloat occlusionSum = 0.0;\n\t\t\tfloat weightSum = 0.0;\n\n\t\t\tfor( int i = 0; i < NUM_SAMPLES; i ++ ) {\n\t\t\t\tvec2 sampleUv = vUv + vec2( cos( angle ), sin( angle ) ) * radius;\n\t\t\t\tradius += radiusStep;\n\t\t\t\tangle += ANGLE_STEP;\n\n\t\t\t\tfloat sampleDepth = getDepth( sampleUv );\n\t\t\t\tif( sampleDepth >= ( 1.0 - EPSILON ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tfloat sampleViewZ = getViewZ( sampleDepth );\n\t\t\t\tvec3 sampleViewPosition = getViewPosition( sampleUv, sampleDepth, sampleViewZ );\n\t\t\t\tocclusionSum += getOcclusion( centerViewPosition, centerViewNormal, sampleViewPosition );\n\t\t\t\tweightSum += 1.0;\n\t\t\t}\n\n\t\t\tif( weightSum == 0.0 ) discard;\n\n\t\t\treturn occlusionSum * ( intensity / weightSum );\n\t\t}\n\n\t\tvoid main() {\n\t\t\tfloat centerDepth = getDepth( vUv );\n\t\t\tif( centerDepth >= ( 1.0 - EPSILON ) ) {\n\t\t\t\tdiscard;\n\t\t\t}\n\n\t\t\tfloat centerViewZ = getViewZ( centerDepth );\n\t\t\tvec3 viewPosition = getViewPosition( vUv, centerDepth, centerViewZ );\n\n\t\t\tfloat ambientOcclusion = getAmbientOcclusion( viewPosition );\n\n\t\t\tgl_FragColor = getDefaultColor( vUv );\n\t\t\tgl_FragColor.xyz *=  1.0 - ambientOcclusion;\n\t\t}`\n\n};\n\nexport { SAOShader };\n", "import {\n\tVector2\n} from 'three';\n\n/**\n * @module DepthLimitedBlurShader\n * @three_import import { DepthLimitedBlurShader, BlurShaderUtils } from 'three/addons/shaders/DepthLimitedBlurShader.js';\n */\n\n/**\n * TODO\n *\n * Used by {@link SAOPass}.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst DepthLimitedBlurShader = {\n\n\tname: 'DepthLimitedBlurShader',\n\n\tdefines: {\n\t\t'KERNEL_RADIUS': 4,\n\t\t'DEPTH_PACKING': 1,\n\t\t'PERSPECTIVE_CAMERA': 1\n\t},\n\n\tuniforms: {\n\t\t'tDiffuse': { value: null },\n\t\t'size': { value: new Vector2( 512, 512 ) },\n\t\t'sampleUvOffsets': { value: [ new Vector2( 0, 0 ) ] },\n\t\t'sampleWeights': { value: [ 1.0 ] },\n\t\t'tDepth': { value: null },\n\t\t'cameraNear': { value: 10 },\n\t\t'cameraFar': { value: 1000 },\n\t\t'depthCutoff': { value: 10 },\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\t#include <common>\n\n\t\tuniform vec2 size;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec2 vInvSize;\n\n\t\tvoid main() {\n\t\t\tvUv = uv;\n\t\t\tvInvSize = 1.0 / size;\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\t#include <common>\n\t\t#include <packing>\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform sampler2D tDepth;\n\n\t\tuniform float cameraNear;\n\t\tuniform float cameraFar;\n\t\tuniform float depthCutoff;\n\n\t\tuniform vec2 sampleUvOffsets[ KERNEL_RADIUS + 1 ];\n\t\tuniform float sampleWeights[ KERNEL_RADIUS + 1 ];\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec2 vInvSize;\n\n\t\tfloat getDepth( const in vec2 screenPosition ) {\n\t\t\t#if DEPTH_PACKING == 1\n\t\t\treturn unpackRGBAToDepth( texture2D( tDepth, screenPosition ) );\n\t\t\t#else\n\t\t\treturn texture2D( tDepth, screenPosition ).x;\n\t\t\t#endif\n\t\t}\n\n\t\tfloat getViewZ( const in float depth ) {\n\t\t\t#if PERSPECTIVE_CAMERA == 1\n\t\t\treturn perspectiveDepthToViewZ( depth, cameraNear, cameraFar );\n\t\t\t#else\n\t\t\treturn orthographicDepthToViewZ( depth, cameraNear, cameraFar );\n\t\t\t#endif\n\t\t}\n\n\t\tvoid main() {\n\t\t\tfloat depth = getDepth( vUv );\n\t\t\tif( depth >= ( 1.0 - EPSILON ) ) {\n\t\t\t\tdiscard;\n\t\t\t}\n\n\t\t\tfloat centerViewZ = -getViewZ( depth );\n\t\t\tbool rBreak = false, lBreak = false;\n\n\t\t\tfloat weightSum = sampleWeights[0];\n\t\t\tvec4 diffuseSum = texture2D( tDiffuse, vUv ) * weightSum;\n\n\t\t\tfor( int i = 1; i <= KERNEL_RADIUS; i ++ ) {\n\n\t\t\t\tfloat sampleWeight = sampleWeights[i];\n\t\t\t\tvec2 sampleUvOffset = sampleUvOffsets[i] * vInvSize;\n\n\t\t\t\tvec2 sampleUv = vUv + sampleUvOffset;\n\t\t\t\tfloat viewZ = -getViewZ( getDepth( sampleUv ) );\n\n\t\t\t\tif( abs( viewZ - centerViewZ ) > depthCutoff ) rBreak = true;\n\n\t\t\t\tif( ! rBreak ) {\n\t\t\t\t\tdiffuseSum += texture2D( tDiffuse, sampleUv ) * sampleWeight;\n\t\t\t\t\tweightSum += sampleWeight;\n\t\t\t\t}\n\n\t\t\t\tsampleUv = vUv - sampleUvOffset;\n\t\t\t\tviewZ = -getViewZ( getDepth( sampleUv ) );\n\n\t\t\t\tif( abs( viewZ - centerViewZ ) > depthCutoff ) lBreak = true;\n\n\t\t\t\tif( ! lBreak ) {\n\t\t\t\t\tdiffuseSum += texture2D( tDiffuse, sampleUv ) * sampleWeight;\n\t\t\t\t\tweightSum += sampleWeight;\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgl_FragColor = diffuseSum / weightSum;\n\t\t}`\n\n};\n\nconst BlurShaderUtils = {\n\n\tcreateSampleWeights: function ( kernelRadius, stdDev ) {\n\n\t\tconst weights = [];\n\n\t\tfor ( let i = 0; i <= kernelRadius; i ++ ) {\n\n\t\t\tweights.push( gaussian( i, stdDev ) );\n\n\t\t}\n\n\t\treturn weights;\n\n\t},\n\n\tcreateSampleOffsets: function ( kernelRadius, uvIncrement ) {\n\n\t\tconst offsets = [];\n\n\t\tfor ( let i = 0; i <= kernelRadius; i ++ ) {\n\n\t\t\toffsets.push( uvIncrement.clone().multiplyScalar( i ) );\n\n\t\t}\n\n\t\treturn offsets;\n\n\t},\n\n\tconfigure: function ( material, kernelRadius, stdDev, uvIncrement ) {\n\n\t\tmaterial.defines[ 'KERNEL_RADIUS' ] = kernelRadius;\n\t\tmaterial.uniforms[ 'sampleUvOffsets' ].value = BlurShaderUtils.createSampleOffsets( kernelRadius, uvIncrement );\n\t\tmaterial.uniforms[ 'sampleWeights' ].value = BlurShaderUtils.createSampleWeights( kernelRadius, stdDev );\n\t\tmaterial.needsUpdate = true;\n\n\t}\n\n};\n\nfunction gaussian( x, stdDev ) {\n\n\treturn Math.exp( - ( x * x ) / ( 2.0 * ( stdDev * stdDev ) ) ) / ( Math.sqrt( 2.0 * Math.PI ) * stdDev );\n\n}\n\nexport { DepthLimitedBlurShader, BlurShaderUtils };\n", "import {\n\tAddEquation,\n\tColor,\n\tCustomBlending,\n\tDepthTexture,\n\tDstAlphaFactor,\n\tDstColorFactor,\n\tHalfFloatType,\n\tMeshNormalMaterial,\n\tNearestFilter,\n\tNoBlending,\n\tShaderMaterial,\n\tUniformsUtils,\n\tDepthStencilFormat,\n\tUnsignedInt248Type,\n\tVector2,\n\tWebGLRenderTarget,\n\tZeroFactor\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\nimport { SAOShader } from '../shaders/SAOShader.js';\nimport { BlurShaderUtils, DepthLimitedBlurShader } from '../shaders/DepthLimitedBlurShader.js';\nimport { CopyShader } from '../shaders/CopyShader.js';\n\n/**\n * A SAO implementation inspired from @bhouston previous SAO work.\n *\n * `SAOPass` provides better quality than {@link SSAOPass} but is also more expensive.\n *\n * ```js\n * const saoPass = new SAOPass( scene, camera );\n * composer.addPass( saoPass );\n * ```\n *\n * @augments Pass\n * @three_import import { SAOPass } from 'three/addons/postprocessing/SAOPass.js';\n */\nclass SAOPass extends Pass {\n\n\t/**\n\t * Constructs a new SAO pass.\n\t *\n\t * @param {Scene} scene - The scene to compute the AO for.\n\t * @param {Camera} camera - The camera.\n\t * @param {Vector2} [resolution] - The effect's resolution.\n\t */\n\tconstructor( scene, camera, resolution = new Vector2( 256, 256 ) ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The scene to render the AO for.\n\t\t *\n\t\t * @type {Scene}\n\t\t */\n\t\tthis.scene = scene;\n\n\t\t/**\n\t\t * The camera.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = camera;\n\n\t\t/**\n\t\t * Overwritten to perform a clear operation by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.clear = true;\n\n\t\t/**\n\t\t * Overwritten to disable the swap.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsSwap = false;\n\n\t\tthis._originalClearColor = new Color();\n\t\tthis._oldClearColor = new Color();\n\t\tthis._oldClearAlpha = 1;\n\n\t\t/**\n\t\t * The SAO parameter.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.params = {\n\t\t\toutput: 0,\n\t\t\tsaoBias: 0.5,\n\t\t\tsaoIntensity: 0.18,\n\t\t\tsaoScale: 1,\n\t\t\tsaoKernelRadius: 100,\n\t\t\tsaoMinResolution: 0,\n\t\t\tsaoBlur: true,\n\t\t\tsaoBlurRadius: 8,\n\t\t\tsaoBlurStdDev: 4,\n\t\t\tsaoBlurDepthCutoff: 0.01\n\t\t};\n\n\t\t/**\n\t\t * The effect's resolution.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (256,256)\n\t\t */\n\t\tthis.resolution = new Vector2( resolution.x, resolution.y );\n\n\t\tthis.saoRenderTarget = new WebGLRenderTarget( this.resolution.x, this.resolution.y, { type: HalfFloatType } );\n\t\tthis.blurIntermediateRenderTarget = this.saoRenderTarget.clone();\n\n\t\tconst depthTexture = new DepthTexture();\n\t\tdepthTexture.format = DepthStencilFormat;\n\t\tdepthTexture.type = UnsignedInt248Type;\n\n\t\tthis.normalRenderTarget = new WebGLRenderTarget( this.resolution.x, this.resolution.y, {\n\t\t\tminFilter: NearestFilter,\n\t\t\tmagFilter: NearestFilter,\n\t\t\ttype: HalfFloatType,\n\t\t\tdepthTexture: depthTexture\n\t\t} );\n\n\t\tthis.normalMaterial = new MeshNormalMaterial();\n\t\tthis.normalMaterial.blending = NoBlending;\n\n\t\tthis.saoMaterial = new ShaderMaterial( {\n\t\t\tdefines: Object.assign( {}, SAOShader.defines ),\n\t\t\tfragmentShader: SAOShader.fragmentShader,\n\t\t\tvertexShader: SAOShader.vertexShader,\n\t\t\tuniforms: UniformsUtils.clone( SAOShader.uniforms )\n\t\t} );\n\t\tthis.saoMaterial.defines[ 'PERSPECTIVE_CAMERA' ] = this.camera.isPerspectiveCamera ? 1 : 0;\n\t\tthis.saoMaterial.uniforms[ 'tDepth' ].value = depthTexture;\n\t\tthis.saoMaterial.uniforms[ 'tNormal' ].value = this.normalRenderTarget.texture;\n\t\tthis.saoMaterial.uniforms[ 'size' ].value.set( this.resolution.x, this.resolution.y );\n\t\tthis.saoMaterial.uniforms[ 'cameraInverseProjectionMatrix' ].value.copy( this.camera.projectionMatrixInverse );\n\t\tthis.saoMaterial.uniforms[ 'cameraProjectionMatrix' ].value = this.camera.projectionMatrix;\n\t\tthis.saoMaterial.blending = NoBlending;\n\n\t\tthis.vBlurMaterial = new ShaderMaterial( {\n\t\t\tuniforms: UniformsUtils.clone( DepthLimitedBlurShader.uniforms ),\n\t\t\tdefines: Object.assign( {}, DepthLimitedBlurShader.defines ),\n\t\t\tvertexShader: DepthLimitedBlurShader.vertexShader,\n\t\t\tfragmentShader: DepthLimitedBlurShader.fragmentShader\n\t\t} );\n\t\tthis.vBlurMaterial.defines[ 'DEPTH_PACKING' ] = 0;\n\t\tthis.vBlurMaterial.defines[ 'PERSPECTIVE_CAMERA' ] = this.camera.isPerspectiveCamera ? 1 : 0;\n\t\tthis.vBlurMaterial.uniforms[ 'tDiffuse' ].value = this.saoRenderTarget.texture;\n\t\tthis.vBlurMaterial.uniforms[ 'tDepth' ].value = depthTexture;\n\t\tthis.vBlurMaterial.uniforms[ 'size' ].value.set( this.resolution.x, this.resolution.y );\n\t\tthis.vBlurMaterial.blending = NoBlending;\n\n\t\tthis.hBlurMaterial = new ShaderMaterial( {\n\t\t\tuniforms: UniformsUtils.clone( DepthLimitedBlurShader.uniforms ),\n\t\t\tdefines: Object.assign( {}, DepthLimitedBlurShader.defines ),\n\t\t\tvertexShader: DepthLimitedBlurShader.vertexShader,\n\t\t\tfragmentShader: DepthLimitedBlurShader.fragmentShader\n\t\t} );\n\t\tthis.hBlurMaterial.defines[ 'DEPTH_PACKING' ] = 0;\n\t\tthis.hBlurMaterial.defines[ 'PERSPECTIVE_CAMERA' ] = this.camera.isPerspectiveCamera ? 1 : 0;\n\t\tthis.hBlurMaterial.uniforms[ 'tDiffuse' ].value = this.blurIntermediateRenderTarget.texture;\n\t\tthis.hBlurMaterial.uniforms[ 'tDepth' ].value = depthTexture;\n\t\tthis.hBlurMaterial.uniforms[ 'size' ].value.set( this.resolution.x, this.resolution.y );\n\t\tthis.hBlurMaterial.blending = NoBlending;\n\n\t\tthis.materialCopy = new ShaderMaterial( {\n\t\t\tuniforms: UniformsUtils.clone( CopyShader.uniforms ),\n\t\t\tvertexShader: CopyShader.vertexShader,\n\t\t\tfragmentShader: CopyShader.fragmentShader,\n\t\t\tblending: NoBlending\n\t\t} );\n\t\tthis.materialCopy.transparent = true;\n\t\tthis.materialCopy.depthTest = false;\n\t\tthis.materialCopy.depthWrite = false;\n\t\tthis.materialCopy.blending = CustomBlending;\n\t\tthis.materialCopy.blendSrc = DstColorFactor;\n\t\tthis.materialCopy.blendDst = ZeroFactor;\n\t\tthis.materialCopy.blendEquation = AddEquation;\n\t\tthis.materialCopy.blendSrcAlpha = DstAlphaFactor;\n\t\tthis.materialCopy.blendDstAlpha = ZeroFactor;\n\t\tthis.materialCopy.blendEquationAlpha = AddEquation;\n\n\t\tthis.fsQuad = new FullScreenQuad( null );\n\n\t}\n\n\t/**\n\t * Performs the SAO pass.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( renderer, writeBuffer, readBuffer/*, deltaTime, maskActive*/ ) {\n\n\t\t// Rendering readBuffer first when rendering to screen\n\t\tif ( this.renderToScreen ) {\n\n\t\t\tthis.materialCopy.blending = NoBlending;\n\t\t\tthis.materialCopy.uniforms[ 'tDiffuse' ].value = readBuffer.texture;\n\t\t\tthis.materialCopy.needsUpdate = true;\n\t\t\tthis._renderPass( renderer, this.materialCopy, null );\n\n\t\t}\n\n\t\trenderer.getClearColor( this._oldClearColor );\n\t\tthis._oldClearAlpha = renderer.getClearAlpha();\n\t\tconst oldAutoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tthis.saoMaterial.uniforms[ 'bias' ].value = this.params.saoBias;\n\t\tthis.saoMaterial.uniforms[ 'intensity' ].value = this.params.saoIntensity;\n\t\tthis.saoMaterial.uniforms[ 'scale' ].value = this.params.saoScale;\n\t\tthis.saoMaterial.uniforms[ 'kernelRadius' ].value = this.params.saoKernelRadius;\n\t\tthis.saoMaterial.uniforms[ 'minResolution' ].value = this.params.saoMinResolution;\n\t\tthis.saoMaterial.uniforms[ 'cameraNear' ].value = this.camera.near;\n\t\tthis.saoMaterial.uniforms[ 'cameraFar' ].value = this.camera.far;\n\t\t// this.saoMaterial.uniforms['randomSeed'].value = Math.random();\n\n\t\tconst depthCutoff = this.params.saoBlurDepthCutoff * ( this.camera.far - this.camera.near );\n\t\tthis.vBlurMaterial.uniforms[ 'depthCutoff' ].value = depthCutoff;\n\t\tthis.hBlurMaterial.uniforms[ 'depthCutoff' ].value = depthCutoff;\n\n\t\tthis.vBlurMaterial.uniforms[ 'cameraNear' ].value = this.camera.near;\n\t\tthis.vBlurMaterial.uniforms[ 'cameraFar' ].value = this.camera.far;\n\t\tthis.hBlurMaterial.uniforms[ 'cameraNear' ].value = this.camera.near;\n\t\tthis.hBlurMaterial.uniforms[ 'cameraFar' ].value = this.camera.far;\n\n\t\tthis.params.saoBlurRadius = Math.floor( this.params.saoBlurRadius );\n\t\tif ( ( this.prevStdDev !== this.params.saoBlurStdDev ) || ( this.prevNumSamples !== this.params.saoBlurRadius ) ) {\n\n\t\t\tBlurShaderUtils.configure( this.vBlurMaterial, this.params.saoBlurRadius, this.params.saoBlurStdDev, new Vector2( 0, 1 ) );\n\t\t\tBlurShaderUtils.configure( this.hBlurMaterial, this.params.saoBlurRadius, this.params.saoBlurStdDev, new Vector2( 1, 0 ) );\n\t\t\tthis.prevStdDev = this.params.saoBlurStdDev;\n\t\t\tthis.prevNumSamples = this.params.saoBlurRadius;\n\n\t\t}\n\n\t\t// render normal and depth\n\t\tthis._renderOverride( renderer, this.normalMaterial, this.normalRenderTarget, 0x7777ff, 1.0 );\n\n\t\t// Rendering SAO texture\n\t\tthis._renderPass( renderer, this.saoMaterial, this.saoRenderTarget, 0xffffff, 1.0 );\n\n\t\t// Blurring SAO texture\n\t\tif ( this.params.saoBlur ) {\n\n\t\t\tthis._renderPass( renderer, this.vBlurMaterial, this.blurIntermediateRenderTarget, 0xffffff, 1.0 );\n\t\t\tthis._renderPass( renderer, this.hBlurMaterial, this.saoRenderTarget, 0xffffff, 1.0 );\n\n\t\t}\n\n\t\tconst outputMaterial = this.materialCopy;\n\n\t\t// Setting up SAO rendering\n\t\tif ( this.params.output === SAOPass.OUTPUT.Normal ) {\n\n\t\t\tthis.materialCopy.uniforms[ 'tDiffuse' ].value = this.normalRenderTarget.texture;\n\t\t\tthis.materialCopy.needsUpdate = true;\n\n\t\t} else {\n\n\t\t\tthis.materialCopy.uniforms[ 'tDiffuse' ].value = this.saoRenderTarget.texture;\n\t\t\tthis.materialCopy.needsUpdate = true;\n\n\t\t}\n\n\t\t// Blending depends on output\n\t\tif ( this.params.output === SAOPass.OUTPUT.Default ) {\n\n\t\t\toutputMaterial.blending = CustomBlending;\n\n\t\t} else {\n\n\t\t\toutputMaterial.blending = NoBlending;\n\n\t\t}\n\n\t\t// Rendering SAOPass result on top of previous pass\n\t\tthis._renderPass( renderer, outputMaterial, this.renderToScreen ? null : readBuffer );\n\n\t\trenderer.setClearColor( this._oldClearColor, this._oldClearAlpha );\n\t\trenderer.autoClear = oldAutoClear;\n\n\t}\n\n\t/**\n\t * Sets the size of the pass.\n\t *\n\t * @param {number} width - The width to set.\n\t * @param {number} height - The height to set.\n\t */\n\tsetSize( width, height ) {\n\n\t\tthis.saoRenderTarget.setSize( width, height );\n\t\tthis.blurIntermediateRenderTarget.setSize( width, height );\n\t\tthis.normalRenderTarget.setSize( width, height );\n\n\t\tthis.saoMaterial.uniforms[ 'size' ].value.set( width, height );\n\t\tthis.saoMaterial.uniforms[ 'cameraInverseProjectionMatrix' ].value.copy( this.camera.projectionMatrixInverse );\n\t\tthis.saoMaterial.uniforms[ 'cameraProjectionMatrix' ].value = this.camera.projectionMatrix;\n\t\tthis.saoMaterial.needsUpdate = true;\n\n\t\tthis.vBlurMaterial.uniforms[ 'size' ].value.set( width, height );\n\t\tthis.vBlurMaterial.needsUpdate = true;\n\n\t\tthis.hBlurMaterial.uniforms[ 'size' ].value.set( width, height );\n\t\tthis.hBlurMaterial.needsUpdate = true;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the pass is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.saoRenderTarget.dispose();\n\t\tthis.blurIntermediateRenderTarget.dispose();\n\t\tthis.normalRenderTarget.dispose();\n\n\t\tthis.normalMaterial.dispose();\n\t\tthis.saoMaterial.dispose();\n\t\tthis.vBlurMaterial.dispose();\n\t\tthis.hBlurMaterial.dispose();\n\t\tthis.materialCopy.dispose();\n\n\t\tthis.fsQuad.dispose();\n\n\t}\n\n\t// internal\n\n\t_renderPass( renderer, passMaterial, renderTarget, clearColor, clearAlpha ) {\n\n\t\t// save original state\n\t\trenderer.getClearColor( this._originalClearColor );\n\t\tconst originalClearAlpha = renderer.getClearAlpha();\n\t\tconst originalAutoClear = renderer.autoClear;\n\n\t\trenderer.setRenderTarget( renderTarget );\n\n\t\t// setup pass state\n\t\trenderer.autoClear = false;\n\t\tif ( ( clearColor !== undefined ) && ( clearColor !== null ) ) {\n\n\t\t\trenderer.setClearColor( clearColor );\n\t\t\trenderer.setClearAlpha( clearAlpha || 0.0 );\n\t\t\trenderer.clear();\n\n\t\t}\n\n\t\tthis.fsQuad.material = passMaterial;\n\t\tthis.fsQuad.render( renderer );\n\n\t\t// restore original state\n\t\trenderer.autoClear = originalAutoClear;\n\t\trenderer.setClearColor( this._originalClearColor );\n\t\trenderer.setClearAlpha( originalClearAlpha );\n\n\t}\n\n\t_renderOverride( renderer, overrideMaterial, renderTarget, clearColor, clearAlpha ) {\n\n\t\trenderer.getClearColor( this._originalClearColor );\n\t\tconst originalClearAlpha = renderer.getClearAlpha();\n\t\tconst originalAutoClear = renderer.autoClear;\n\n\t\trenderer.setRenderTarget( renderTarget );\n\t\trenderer.autoClear = false;\n\n\t\tclearColor = overrideMaterial.clearColor || clearColor;\n\t\tclearAlpha = overrideMaterial.clearAlpha || clearAlpha;\n\t\tif ( ( clearColor !== undefined ) && ( clearColor !== null ) ) {\n\n\t\t\trenderer.setClearColor( clearColor );\n\t\t\trenderer.setClearAlpha( clearAlpha || 0.0 );\n\t\t\trenderer.clear();\n\n\t\t}\n\n\t\tthis.scene.overrideMaterial = overrideMaterial;\n\t\trenderer.render( this.scene, this.camera );\n\t\tthis.scene.overrideMaterial = null;\n\n\t\t// restore original state\n\t\trenderer.autoClear = originalAutoClear;\n\t\trenderer.setClearColor( this._originalClearColor );\n\t\trenderer.setClearAlpha( originalClearAlpha );\n\n\t}\n\n}\n\nSAOPass.OUTPUT = {\n\t'Default': 0,\n\t'SAO': 1,\n\t'Normal': 2\n};\n\nexport { SAOPass };\n", "import {\n\tVector2\n} from 'three';\n\n/**\n * WebGL port of Subpixel Morphological Antialiasing (SMAA) v2.8\n * Preset: SMAA 1x Medium (with color edge detection)\n *\n * References:\n * - {@link https://github.com/iryoku/smaa/releases/tag/v2.8}\n *\n * @module SMAAShader\n * @three_import import { SMAAShader } from 'three/addons/shaders/SMAAShader.js';\n */\n\n/**\n * SMAA Edges shader.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst SMAAEdgesShader = {\n\n\tname: 'SMAAEdgesShader',\n\n\tdefines: {\n\n\t\t'SMAA_THRESHOLD': '0.1'\n\n\t},\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'resolution': { value: new Vector2( 1 / 1024, 1 / 512 ) }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tuniform vec2 resolution;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec4 vOffset[ 3 ];\n\n\t\tvoid SMAAEdgeDetectionVS( vec2 texcoord ) {\n\t\t\tvOffset[ 0 ] = texcoord.xyxy + resolution.xyxy * vec4( -1.0, 0.0, 0.0,  1.0 ); // WebGL port note: Changed sign in W component\n\t\t\tvOffset[ 1 ] = texcoord.xyxy + resolution.xyxy * vec4(  1.0, 0.0, 0.0, -1.0 ); // WebGL port note: Changed sign in W component\n\t\t\tvOffset[ 2 ] = texcoord.xyxy + resolution.xyxy * vec4( -2.0, 0.0, 0.0,  2.0 ); // WebGL port note: Changed sign in W component\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tSMAAEdgeDetectionVS( vUv );\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec4 vOffset[ 3 ];\n\n\t\tvec4 SMAAColorEdgeDetectionPS( vec2 texcoord, vec4 offset[3], sampler2D colorTex ) {\n\t\t\tvec2 threshold = vec2( SMAA_THRESHOLD, SMAA_THRESHOLD );\n\n\t\t\t// Calculate color deltas:\n\t\t\tvec4 delta;\n\t\t\tvec3 C = texture2D( colorTex, texcoord ).rgb;\n\n\t\t\tvec3 Cleft = texture2D( colorTex, offset[0].xy ).rgb;\n\t\t\tvec3 t = abs( C - Cleft );\n\t\t\tdelta.x = max( max( t.r, t.g ), t.b );\n\n\t\t\tvec3 Ctop = texture2D( colorTex, offset[0].zw ).rgb;\n\t\t\tt = abs( C - Ctop );\n\t\t\tdelta.y = max( max( t.r, t.g ), t.b );\n\n\t\t\t// We do the usual threshold:\n\t\t\tvec2 edges = step( threshold, delta.xy );\n\n\t\t\t// Then discard if there is no edge:\n\t\t\tif ( dot( edges, vec2( 1.0, 1.0 ) ) == 0.0 )\n\t\t\t\tdiscard;\n\n\t\t\t// Calculate right and bottom deltas:\n\t\t\tvec3 Cright = texture2D( colorTex, offset[1].xy ).rgb;\n\t\t\tt = abs( C - Cright );\n\t\t\tdelta.z = max( max( t.r, t.g ), t.b );\n\n\t\t\tvec3 Cbottom  = texture2D( colorTex, offset[1].zw ).rgb;\n\t\t\tt = abs( C - Cbottom );\n\t\t\tdelta.w = max( max( t.r, t.g ), t.b );\n\n\t\t\t// Calculate the maximum delta in the direct neighborhood:\n\t\t\tfloat maxDelta = max( max( max( delta.x, delta.y ), delta.z ), delta.w );\n\n\t\t\t// Calculate left-left and top-top deltas:\n\t\t\tvec3 Cleftleft  = texture2D( colorTex, offset[2].xy ).rgb;\n\t\t\tt = abs( C - Cleftleft );\n\t\t\tdelta.z = max( max( t.r, t.g ), t.b );\n\n\t\t\tvec3 Ctoptop = texture2D( colorTex, offset[2].zw ).rgb;\n\t\t\tt = abs( C - Ctoptop );\n\t\t\tdelta.w = max( max( t.r, t.g ), t.b );\n\n\t\t\t// Calculate the final maximum delta:\n\t\t\tmaxDelta = max( max( maxDelta, delta.z ), delta.w );\n\n\t\t\t// Local contrast adaptation in action:\n\t\t\tedges.xy *= step( 0.5 * maxDelta, delta.xy );\n\n\t\t\treturn vec4( edges, 0.0, 0.0 );\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = SMAAColorEdgeDetectionPS( vUv, vOffset, tDiffuse );\n\n\t\t}`\n\n};\n\n/**\n * SMAA Weights shader.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst SMAAWeightsShader = {\n\n\tname: 'SMAAWeightsShader',\n\n\tdefines: {\n\n\t\t'SMAA_MAX_SEARCH_STEPS': '8',\n\t\t'SMAA_AREATEX_MAX_DISTANCE': '16',\n\t\t'SMAA_AREATEX_PIXEL_SIZE': '( 1.0 / vec2( 160.0, 560.0 ) )',\n\t\t'SMAA_AREATEX_SUBTEX_SIZE': '( 1.0 / 7.0 )'\n\n\t},\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'tArea': { value: null },\n\t\t'tSearch': { value: null },\n\t\t'resolution': { value: new Vector2( 1 / 1024, 1 / 512 ) }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tuniform vec2 resolution;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec4 vOffset[ 3 ];\n\t\tvarying vec2 vPixcoord;\n\n\t\tvoid SMAABlendingWeightCalculationVS( vec2 texcoord ) {\n\t\t\tvPixcoord = texcoord / resolution;\n\n\t\t\t// We will use these offsets for the searches later on (see @PSEUDO_GATHER4):\n\t\t\tvOffset[ 0 ] = texcoord.xyxy + resolution.xyxy * vec4( -0.25, 0.125, 1.25, 0.125 ); // WebGL port note: Changed sign in Y and W components\n\t\t\tvOffset[ 1 ] = texcoord.xyxy + resolution.xyxy * vec4( -0.125, 0.25, -0.125, -1.25 ); // WebGL port note: Changed sign in Y and W components\n\n\t\t\t// And these for the searches, they indicate the ends of the loops:\n\t\t\tvOffset[ 2 ] = vec4( vOffset[ 0 ].xz, vOffset[ 1 ].yw ) + vec4( -2.0, 2.0, -2.0, 2.0 ) * resolution.xxyy * float( SMAA_MAX_SEARCH_STEPS );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tSMAABlendingWeightCalculationVS( vUv );\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\t#define SMAASampleLevelZeroOffset( tex, coord, offset ) texture2D( tex, coord + float( offset ) * resolution, 0.0 )\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform sampler2D tArea;\n\t\tuniform sampler2D tSearch;\n\t\tuniform vec2 resolution;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec4 vOffset[3];\n\t\tvarying vec2 vPixcoord;\n\n\t\t#if __VERSION__ == 100\n\t\tvec2 round( vec2 x ) {\n\t\t\treturn sign( x ) * floor( abs( x ) + 0.5 );\n\t\t}\n\t\t#endif\n\n\t\tfloat SMAASearchLength( sampler2D searchTex, vec2 e, float bias, float scale ) {\n\t\t\t// Not required if searchTex accesses are set to point:\n\t\t\t// float2 SEARCH_TEX_PIXEL_SIZE = 1.0 / float2(66.0, 33.0);\n\t\t\t// e = float2(bias, 0.0) + 0.5 * SEARCH_TEX_PIXEL_SIZE +\n\t\t\t//     e * float2(scale, 1.0) * float2(64.0, 32.0) * SEARCH_TEX_PIXEL_SIZE;\n\t\t\te.r = bias + e.r * scale;\n\t\t\treturn 255.0 * texture2D( searchTex, e, 0.0 ).r;\n\t\t}\n\n\t\tfloat SMAASearchXLeft( sampler2D edgesTex, sampler2D searchTex, vec2 texcoord, float end ) {\n\t\t\t/**\n\t\t\t\t* @PSEUDO_GATHER4\n\t\t\t\t* This texcoord has been offset by (-0.25, -0.125) in the vertex shader to\n\t\t\t\t* sample between edge, thus fetching four edges in a row.\n\t\t\t\t* Sampling with different offsets in each direction allows to disambiguate\n\t\t\t\t* which edges are active from the four fetched ones.\n\t\t\t\t*/\n\t\t\tvec2 e = vec2( 0.0, 1.0 );\n\n\t\t\tfor ( int i = 0; i < SMAA_MAX_SEARCH_STEPS; i ++ ) { // WebGL port note: Changed while to for\n\t\t\t\te = texture2D( edgesTex, texcoord, 0.0 ).rg;\n\t\t\t\ttexcoord -= vec2( 2.0, 0.0 ) * resolution;\n\t\t\t\tif ( ! ( texcoord.x > end && e.g > 0.8281 && e.r == 0.0 ) ) break;\n\t\t\t}\n\n\t\t\t// We correct the previous (-0.25, -0.125) offset we applied:\n\t\t\ttexcoord.x += 0.25 * resolution.x;\n\n\t\t\t// The searches are bias by 1, so adjust the coords accordingly:\n\t\t\ttexcoord.x += resolution.x;\n\n\t\t\t// Disambiguate the length added by the last step:\n\t\t\ttexcoord.x += 2.0 * resolution.x; // Undo last step\n\t\t\ttexcoord.x -= resolution.x * SMAASearchLength(searchTex, e, 0.0, 0.5);\n\n\t\t\treturn texcoord.x;\n\t\t}\n\n\t\tfloat SMAASearchXRight( sampler2D edgesTex, sampler2D searchTex, vec2 texcoord, float end ) {\n\t\t\tvec2 e = vec2( 0.0, 1.0 );\n\n\t\t\tfor ( int i = 0; i < SMAA_MAX_SEARCH_STEPS; i ++ ) { // WebGL port note: Changed while to for\n\t\t\t\te = texture2D( edgesTex, texcoord, 0.0 ).rg;\n\t\t\t\ttexcoord += vec2( 2.0, 0.0 ) * resolution;\n\t\t\t\tif ( ! ( texcoord.x < end && e.g > 0.8281 && e.r == 0.0 ) ) break;\n\t\t\t}\n\n\t\t\ttexcoord.x -= 0.25 * resolution.x;\n\t\t\ttexcoord.x -= resolution.x;\n\t\t\ttexcoord.x -= 2.0 * resolution.x;\n\t\t\ttexcoord.x += resolution.x * SMAASearchLength( searchTex, e, 0.5, 0.5 );\n\n\t\t\treturn texcoord.x;\n\t\t}\n\n\t\tfloat SMAASearchYUp( sampler2D edgesTex, sampler2D searchTex, vec2 texcoord, float end ) {\n\t\t\tvec2 e = vec2( 1.0, 0.0 );\n\n\t\t\tfor ( int i = 0; i < SMAA_MAX_SEARCH_STEPS; i ++ ) { // WebGL port note: Changed while to for\n\t\t\t\te = texture2D( edgesTex, texcoord, 0.0 ).rg;\n\t\t\t\ttexcoord += vec2( 0.0, 2.0 ) * resolution; // WebGL port note: Changed sign\n\t\t\t\tif ( ! ( texcoord.y > end && e.r > 0.8281 && e.g == 0.0 ) ) break;\n\t\t\t}\n\n\t\t\ttexcoord.y -= 0.25 * resolution.y; // WebGL port note: Changed sign\n\t\t\ttexcoord.y -= resolution.y; // WebGL port note: Changed sign\n\t\t\ttexcoord.y -= 2.0 * resolution.y; // WebGL port note: Changed sign\n\t\t\ttexcoord.y += resolution.y * SMAASearchLength( searchTex, e.gr, 0.0, 0.5 ); // WebGL port note: Changed sign\n\n\t\t\treturn texcoord.y;\n\t\t}\n\n\t\tfloat SMAASearchYDown( sampler2D edgesTex, sampler2D searchTex, vec2 texcoord, float end ) {\n\t\t\tvec2 e = vec2( 1.0, 0.0 );\n\n\t\t\tfor ( int i = 0; i < SMAA_MAX_SEARCH_STEPS; i ++ ) { // WebGL port note: Changed while to for\n\t\t\t\te = texture2D( edgesTex, texcoord, 0.0 ).rg;\n\t\t\t\ttexcoord -= vec2( 0.0, 2.0 ) * resolution; // WebGL port note: Changed sign\n\t\t\t\tif ( ! ( texcoord.y < end && e.r > 0.8281 && e.g == 0.0 ) ) break;\n\t\t\t}\n\n\t\t\ttexcoord.y += 0.25 * resolution.y; // WebGL port note: Changed sign\n\t\t\ttexcoord.y += resolution.y; // WebGL port note: Changed sign\n\t\t\ttexcoord.y += 2.0 * resolution.y; // WebGL port note: Changed sign\n\t\t\ttexcoord.y -= resolution.y * SMAASearchLength( searchTex, e.gr, 0.5, 0.5 ); // WebGL port note: Changed sign\n\n\t\t\treturn texcoord.y;\n\t\t}\n\n\t\tvec2 SMAAArea( sampler2D areaTex, vec2 dist, float e1, float e2, float offset ) {\n\t\t\t// Rounding prevents precision errors of bilinear filtering:\n\t\t\tvec2 texcoord = float( SMAA_AREATEX_MAX_DISTANCE ) * round( 4.0 * vec2( e1, e2 ) ) + dist;\n\n\t\t\t// We do a scale and bias for mapping to texel space:\n\t\t\ttexcoord = SMAA_AREATEX_PIXEL_SIZE * texcoord + ( 0.5 * SMAA_AREATEX_PIXEL_SIZE );\n\n\t\t\t// Move to proper place, according to the subpixel offset:\n\t\t\ttexcoord.y += SMAA_AREATEX_SUBTEX_SIZE * offset;\n\n\t\t\treturn texture2D( areaTex, texcoord, 0.0 ).rg;\n\t\t}\n\n\t\tvec4 SMAABlendingWeightCalculationPS( vec2 texcoord, vec2 pixcoord, vec4 offset[ 3 ], sampler2D edgesTex, sampler2D areaTex, sampler2D searchTex, ivec4 subsampleIndices ) {\n\t\t\tvec4 weights = vec4( 0.0, 0.0, 0.0, 0.0 );\n\n\t\t\tvec2 e = texture2D( edgesTex, texcoord ).rg;\n\n\t\t\tif ( e.g > 0.0 ) { // Edge at north\n\t\t\t\tvec2 d;\n\n\t\t\t\t// Find the distance to the left:\n\t\t\t\tvec2 coords;\n\t\t\t\tcoords.x = SMAASearchXLeft( edgesTex, searchTex, offset[ 0 ].xy, offset[ 2 ].x );\n\t\t\t\tcoords.y = offset[ 1 ].y; // offset[1].y = texcoord.y - 0.25 * resolution.y (@CROSSING_OFFSET)\n\t\t\t\td.x = coords.x;\n\n\t\t\t\t// Now fetch the left crossing edges, two at a time using bilinear\n\t\t\t\t// filtering. Sampling at -0.25 (see @CROSSING_OFFSET) enables to\n\t\t\t\t// discern what value each edge has:\n\t\t\t\tfloat e1 = texture2D( edgesTex, coords, 0.0 ).r;\n\n\t\t\t\t// Find the distance to the right:\n\t\t\t\tcoords.x = SMAASearchXRight( edgesTex, searchTex, offset[ 0 ].zw, offset[ 2 ].y );\n\t\t\t\td.y = coords.x;\n\n\t\t\t\t// We want the distances to be in pixel units (doing this here allow to\n\t\t\t\t// better interleave arithmetic and memory accesses):\n\t\t\t\td = d / resolution.x - pixcoord.x;\n\n\t\t\t\t// SMAAArea below needs a sqrt, as the areas texture is compressed\n\t\t\t\t// quadratically:\n\t\t\t\tvec2 sqrt_d = sqrt( abs( d ) );\n\n\t\t\t\t// Fetch the right crossing edges:\n\t\t\t\tcoords.y -= 1.0 * resolution.y; // WebGL port note: Added\n\t\t\t\tfloat e2 = SMAASampleLevelZeroOffset( edgesTex, coords, ivec2( 1, 0 ) ).r;\n\n\t\t\t\t// Ok, we know how this pattern looks like, now it is time for getting\n\t\t\t\t// the actual area:\n\t\t\t\tweights.rg = SMAAArea( areaTex, sqrt_d, e1, e2, float( subsampleIndices.y ) );\n\t\t\t}\n\n\t\t\tif ( e.r > 0.0 ) { // Edge at west\n\t\t\t\tvec2 d;\n\n\t\t\t\t// Find the distance to the top:\n\t\t\t\tvec2 coords;\n\n\t\t\t\tcoords.y = SMAASearchYUp( edgesTex, searchTex, offset[ 1 ].xy, offset[ 2 ].z );\n\t\t\t\tcoords.x = offset[ 0 ].x; // offset[1].x = texcoord.x - 0.25 * resolution.x;\n\t\t\t\td.x = coords.y;\n\n\t\t\t\t// Fetch the top crossing edges:\n\t\t\t\tfloat e1 = texture2D( edgesTex, coords, 0.0 ).g;\n\n\t\t\t\t// Find the distance to the bottom:\n\t\t\t\tcoords.y = SMAASearchYDown( edgesTex, searchTex, offset[ 1 ].zw, offset[ 2 ].w );\n\t\t\t\td.y = coords.y;\n\n\t\t\t\t// We want the distances to be in pixel units:\n\t\t\t\td = d / resolution.y - pixcoord.y;\n\n\t\t\t\t// SMAAArea below needs a sqrt, as the areas texture is compressed\n\t\t\t\t// quadratically:\n\t\t\t\tvec2 sqrt_d = sqrt( abs( d ) );\n\n\t\t\t\t// Fetch the bottom crossing edges:\n\t\t\t\tcoords.y -= 1.0 * resolution.y; // WebGL port note: Added\n\t\t\t\tfloat e2 = SMAASampleLevelZeroOffset( edgesTex, coords, ivec2( 0, 1 ) ).g;\n\n\t\t\t\t// Get the area for this direction:\n\t\t\t\tweights.ba = SMAAArea( areaTex, sqrt_d, e1, e2, float( subsampleIndices.x ) );\n\t\t\t}\n\n\t\t\treturn weights;\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = SMAABlendingWeightCalculationPS( vUv, vPixcoord, vOffset, tDiffuse, tArea, tSearch, ivec4( 0.0 ) );\n\n\t\t}`\n\n};\n\n/**\n * SMAA Blend shader.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst SMAABlendShader = {\n\n\tname: 'SMAABlendShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'tColor': { value: null },\n\t\t'resolution': { value: new Vector2( 1 / 1024, 1 / 512 ) }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tuniform vec2 resolution;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec4 vOffset[ 2 ];\n\n\t\tvoid SMAANeighborhoodBlendingVS( vec2 texcoord ) {\n\t\t\tvOffset[ 0 ] = texcoord.xyxy + resolution.xyxy * vec4( -1.0, 0.0, 0.0, 1.0 ); // WebGL port note: Changed sign in W component\n\t\t\tvOffset[ 1 ] = texcoord.xyxy + resolution.xyxy * vec4( 1.0, 0.0, 0.0, -1.0 ); // WebGL port note: Changed sign in W component\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tSMAANeighborhoodBlendingVS( vUv );\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform sampler2D tColor;\n\t\tuniform vec2 resolution;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec4 vOffset[ 2 ];\n\n\t\tvec4 SMAANeighborhoodBlendingPS( vec2 texcoord, vec4 offset[ 2 ], sampler2D colorTex, sampler2D blendTex ) {\n\t\t\t// Fetch the blending weights for current pixel:\n\t\t\tvec4 a;\n\t\t\ta.xz = texture2D( blendTex, texcoord ).xz;\n\t\t\ta.y = texture2D( blendTex, offset[ 1 ].zw ).g;\n\t\t\ta.w = texture2D( blendTex, offset[ 1 ].xy ).a;\n\n\t\t\t// Is there any blending weight with a value greater than 0.0?\n\t\t\tif ( dot(a, vec4( 1.0, 1.0, 1.0, 1.0 )) < 1e-5 ) {\n\t\t\t\treturn texture2D( colorTex, texcoord, 0.0 );\n\t\t\t} else {\n\t\t\t\t// Up to 4 lines can be crossing a pixel (one through each edge). We\n\t\t\t\t// favor blending by choosing the line with the maximum weight for each\n\t\t\t\t// direction:\n\t\t\t\tvec2 offset;\n\t\t\t\toffset.x = a.a > a.b ? a.a : -a.b; // left vs. right\n\t\t\t\toffset.y = a.g > a.r ? -a.g : a.r; // top vs. bottom // WebGL port note: Changed signs\n\n\t\t\t\t// Then we go in the direction that has the maximum weight:\n\t\t\t\tif ( abs( offset.x ) > abs( offset.y )) { // horizontal vs. vertical\n\t\t\t\t\toffset.y = 0.0;\n\t\t\t\t} else {\n\t\t\t\t\toffset.x = 0.0;\n\t\t\t\t}\n\n\t\t\t\t// Fetch the opposite color and lerp by hand:\n\t\t\t\tvec4 C = texture2D( colorTex, texcoord, 0.0 );\n\t\t\t\ttexcoord += sign( offset ) * resolution;\n\t\t\t\tvec4 Cop = texture2D( colorTex, texcoord, 0.0 );\n\t\t\t\tfloat s = abs( offset.x ) > abs( offset.y ) ? abs( offset.x ) : abs( offset.y );\n\n\t\t\t\t// WebGL port note: Added gamma correction\n\t\t\t\tC.xyz = pow(C.xyz, vec3(2.2));\n\t\t\t\tCop.xyz = pow(Cop.xyz, vec3(2.2));\n\t\t\t\tvec4 mixed = mix(C, Cop, s);\n\t\t\t\tmixed.xyz = pow(mixed.xyz, vec3(1.0 / 2.2));\n\n\t\t\t\treturn mixed;\n\t\t\t}\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = SMAANeighborhoodBlendingPS( vUv, vOffset, tColor, tDiffuse );\n\n\t\t}`\n\n};\n\nexport { SMAAEdgesShader, SMAAWeightsShader, SMAABlendShader };\n", "import {\n\tHalfFloatType,\n\tLinearFilter,\n\tNearestFilter,\n\tShaderMaterial,\n\tTexture,\n\tUniformsUtils,\n\tWebGLRenderTarget\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\nimport { SMAABlendShader, SMAAEdgesShader, SMAAWeightsShader } from '../shaders/SMAAShader.js';\n\n/**\n * A pass for applying SMAA. Unlike {@link FXAAPass}, `SMAAPass` operates in\n * `linear-srgb` so this pass must be executed before {@link OutputPass}.\n *\n * ```js\n * const smaaPass = new SMAAPass();\n * composer.addPass( smaaPass );\n * ```\n *\n * @augments Pass\n * @three_import import { SMAAPass } from 'three/addons/postprocessing/SMAAPass.js';\n */\nclass SMAAPass extends Pass {\n\n\t/**\n\t * Constructs a new SMAA pass.\n\t */\n\tconstructor( ) {\n\n\t\tsuper();\n\n\t\t// render targets\n\n\t\tthis._edgesRT = new WebGLRenderTarget( 1, 1, {\n\t\t\tdepthBuffer: false,\n\t\t\ttype: HalfFloatType\n\t\t} );\n\t\tthis._edgesRT.texture.name = 'SMAAPass.edges';\n\n\t\tthis._weightsRT = new WebGLRenderTarget( 1, 1, {\n\t\t\tdepthBuffer: false,\n\t\t\ttype: HalfFloatType\n\t\t} );\n\t\tthis._weightsRT.texture.name = 'SMAAPass.weights';\n\n\t\t// textures\n\t\tconst scope = this;\n\n\t\tconst areaTextureImage = new Image();\n\t\tareaTextureImage.src = this._getAreaTexture();\n\t\tareaTextureImage.onload = function () {\n\n\t\t\t// assigning data to HTMLImageElement.src is asynchronous (see #15162)\n\t\t\tscope._areaTexture.needsUpdate = true;\n\n\t\t};\n\n\t\tthis._areaTexture = new Texture();\n\t\tthis._areaTexture.name = 'SMAAPass.area';\n\t\tthis._areaTexture.image = areaTextureImage;\n\t\tthis._areaTexture.minFilter = LinearFilter;\n\t\tthis._areaTexture.generateMipmaps = false;\n\t\tthis._areaTexture.flipY = false;\n\n\t\tconst searchTextureImage = new Image();\n\t\tsearchTextureImage.src = this._getSearchTexture();\n\t\tsearchTextureImage.onload = function () {\n\n\t\t\t// assigning data to HTMLImageElement.src is asynchronous (see #15162)\n\t\t\tscope._searchTexture.needsUpdate = true;\n\n\t\t};\n\n\t\tthis._searchTexture = new Texture();\n\t\tthis._searchTexture.name = 'SMAAPass.search';\n\t\tthis._searchTexture.image = searchTextureImage;\n\t\tthis._searchTexture.magFilter = NearestFilter;\n\t\tthis._searchTexture.minFilter = NearestFilter;\n\t\tthis._searchTexture.generateMipmaps = false;\n\t\tthis._searchTexture.flipY = false;\n\n\t\t// materials - pass 1\n\n\t\tthis._uniformsEdges = UniformsUtils.clone( SMAAEdgesShader.uniforms );\n\n\t\tthis._materialEdges = new ShaderMaterial( {\n\t\t\tdefines: Object.assign( {}, SMAAEdgesShader.defines ),\n\t\t\tuniforms: this._uniformsEdges,\n\t\t\tvertexShader: SMAAEdgesShader.vertexShader,\n\t\t\tfragmentShader: SMAAEdgesShader.fragmentShader\n\t\t} );\n\n\t\t// materials - pass 2\n\n\t\tthis._uniformsWeights = UniformsUtils.clone( SMAAWeightsShader.uniforms );\n\n\t\tthis._uniformsWeights[ 'tDiffuse' ].value = this._edgesRT.texture;\n\t\tthis._uniformsWeights[ 'tArea' ].value = this._areaTexture;\n\t\tthis._uniformsWeights[ 'tSearch' ].value = this._searchTexture;\n\n\t\tthis._materialWeights = new ShaderMaterial( {\n\t\t\tdefines: Object.assign( {}, SMAAWeightsShader.defines ),\n\t\t\tuniforms: this._uniformsWeights,\n\t\t\tvertexShader: SMAAWeightsShader.vertexShader,\n\t\t\tfragmentShader: SMAAWeightsShader.fragmentShader\n\t\t} );\n\n\t\t// materials - pass 3\n\n\t\tthis._uniformsBlend = UniformsUtils.clone( SMAABlendShader.uniforms );\n\t\tthis._uniformsBlend[ 'tDiffuse' ].value = this._weightsRT.texture;\n\n\t\tthis._materialBlend = new ShaderMaterial( {\n\t\t\tuniforms: this._uniformsBlend,\n\t\t\tvertexShader: SMAABlendShader.vertexShader,\n\t\t\tfragmentShader: SMAABlendShader.fragmentShader\n\t\t} );\n\n\t\tthis._fsQuad = new FullScreenQuad( null );\n\n\t}\n\n\t/**\n\t * Performs the SMAA pass.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( renderer, writeBuffer, readBuffer/*, deltaTime, maskActive*/ ) {\n\n\t\t// pass 1\n\n\t\tthis._uniformsEdges[ 'tDiffuse' ].value = readBuffer.texture;\n\n\t\tthis._fsQuad.material = this._materialEdges;\n\n\t\trenderer.setRenderTarget( this._edgesRT );\n\t\tif ( this.clear ) renderer.clear();\n\t\tthis._fsQuad.render( renderer );\n\n\t\t// pass 2\n\n\t\tthis._fsQuad.material = this._materialWeights;\n\n\t\trenderer.setRenderTarget( this._weightsRT );\n\t\tif ( this.clear ) renderer.clear();\n\t\tthis._fsQuad.render( renderer );\n\n\t\t// pass 3\n\n\t\tthis._uniformsBlend[ 'tColor' ].value = readBuffer.texture;\n\n\t\tthis._fsQuad.material = this._materialBlend;\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t} else {\n\n\t\t\trenderer.setRenderTarget( writeBuffer );\n\t\t\tif ( this.clear ) renderer.clear();\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the size of the pass.\n\t *\n\t * @param {number} width - The width to set.\n\t * @param {number} height - The height to set.\n\t */\n\tsetSize( width, height ) {\n\n\t\tthis._edgesRT.setSize( width, height );\n\t\tthis._weightsRT.setSize( width, height );\n\n\t\tthis._materialEdges.uniforms[ 'resolution' ].value.set( 1 / width, 1 / height );\n\t\tthis._materialWeights.uniforms[ 'resolution' ].value.set( 1 / width, 1 / height );\n\t\tthis._materialBlend.uniforms[ 'resolution' ].value.set( 1 / width, 1 / height );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the pass is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis._edgesRT.dispose();\n\t\tthis._weightsRT.dispose();\n\n\t\tthis._areaTexture.dispose();\n\t\tthis._searchTexture.dispose();\n\n\t\tthis._materialEdges.dispose();\n\t\tthis._materialWeights.dispose();\n\t\tthis._materialBlend.dispose();\n\n\t\tthis._fsQuad.dispose();\n\n\t}\n\n\t// internals\n\n\t_getAreaTexture() {\n\n\t\treturn 'data:image/png;base64,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';\n\n\t}\n\n\t_getSearchTexture() {\n\n\t\treturn 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEIAAAAhCAAAAABIXyLAAAAAOElEQVRIx2NgGAWjYBSMglEwEICREYRgFBZBqDCSLA2MGPUIVQETE9iNUAqLR5gIeoQKRgwXjwAAGn4AtaFeYLEAAAAASUVORK5CYII=';\n\n\t}\n\n}\n\nexport { SMAAPass };\n", "import {\n\tAdditiveBlending,\n\tColor,\n\tHalfFloatType,\n\tShaderMaterial,\n\tUniformsUtils,\n\tWebGLRenderTarget\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\nimport { CopyShader } from '../shaders/CopyShader.js';\n\n/**\n * Supersample Anti-Aliasing Render Pass.\n *\n * This manual approach to SSAA re-renders the scene ones for each sample with camera jitter and accumulates the results.\n *\n * ```js\n * const ssaaRenderPass = new SSAARenderPass( scene, camera );\n * ssaaRenderPass.sampleLevel = 3;\n * composer.addPass( ssaaRenderPass );\n * ```\n *\n * @augments Pass\n * @three_import import { SSAARenderPass } from 'three/addons/postprocessing/SSAARenderPass.js';\n */\nclass SSAARenderPass extends Pass {\n\n\t/**\n\t * Constructs a new SSAA render pass.\n\t *\n\t * @param {Scene} scene - The scene to render.\n\t * @param {Camera} camera - The camera.\n\t * @param {?(number|Color|string)} [clearColor=0x000000] - The clear color of the render pass.\n\t * @param {?number} [clearAlpha=0] - The clear alpha of the render pass.\n\t */\n\tconstructor( scene, camera, clearColor = 0x000000, clearAlpha = 0 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The scene to render.\n\t\t *\n\t\t * @type {Scene}\n\t\t */\n\t\tthis.scene = scene;\n\n\t\t/**\n\t\t * The camera.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = camera;\n\n\t\t/**\n\t\t * The sample level. Specified as n, where the number of\n\t\t * samples is 2^n, so sampleLevel = 4, is 2^4 samples, 16.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 4\n\t\t */\n\t\tthis.sampleLevel = 4;\n\n\t\t/**\n\t\t * Whether the pass should be unbiased or not. This property has the most\n\t\t * visible effect when rendering to a RGBA8 buffer because it mitigates\n\t\t * rounding errors. By default RGBA16F is used.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.unbiased = true;\n\n\t\t/**\n\t\t * Whether to use a stencil buffer or not. This property can't\n\t\t * be changed after the first render.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.stencilBuffer = false;\n\n\t\t/**\n\t\t * The clear color of the render pass.\n\t\t *\n\t\t * @type {?(number|Color|string)}\n\t\t * @default 0x000000\n\t\t */\n\t\tthis.clearColor = clearColor;\n\n\t\t/**\n\t\t * The clear alpha of the render pass.\n\t\t *\n\t\t * @type {?number}\n\t\t * @default 0\n\t\t */\n\t\tthis.clearAlpha = clearAlpha;\n\n\t\t// internals\n\n\t\tthis._sampleRenderTarget = null;\n\n\t\tthis._oldClearColor = new Color();\n\n\t\tthis._copyUniforms = UniformsUtils.clone( CopyShader.uniforms );\n\n\t\tthis._copyMaterial = new ShaderMaterial(\t{\n\t\t\tuniforms: this._copyUniforms,\n\t\t\tvertexShader: CopyShader.vertexShader,\n\t\t\tfragmentShader: CopyShader.fragmentShader,\n\t\t\ttransparent: true,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\tpremultipliedAlpha: true,\n\t\t\tblending: AdditiveBlending\n\t\t} );\n\n\t\tthis._fsQuad = new FullScreenQuad( this._copyMaterial );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the pass is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tif ( this._sampleRenderTarget ) {\n\n\t\t\tthis._sampleRenderTarget.dispose();\n\t\t\tthis._sampleRenderTarget = null;\n\n\t\t}\n\n\t\tthis._copyMaterial.dispose();\n\n\t\tthis._fsQuad.dispose();\n\n\t}\n\n\t/**\n\t * Sets the size of the pass.\n\t *\n\t * @param {number} width - The width to set.\n\t * @param {number} height - The height to set.\n\t */\n\tsetSize( width, height ) {\n\n\t\tif ( this._sampleRenderTarget )\tthis._sampleRenderTarget.setSize( width, height );\n\n\t}\n\n\t/**\n\t * Performs the SSAA render pass.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( renderer, writeBuffer, readBuffer/*, deltaTime, maskActive */ ) {\n\n\t\tif ( ! this._sampleRenderTarget ) {\n\n\t\t\tthis._sampleRenderTarget = new WebGLRenderTarget( readBuffer.width, readBuffer.height, { type: HalfFloatType, stencilBuffer: this.stencilBuffer } );\n\t\t\tthis._sampleRenderTarget.texture.name = 'SSAARenderPass.sample';\n\n\t\t}\n\n\t\tconst jitterOffsets = _JitterVectors[ Math.max( 0, Math.min( this.sampleLevel, 5 ) ) ];\n\n\t\tconst autoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\trenderer.getClearColor( this._oldClearColor );\n\t\tconst oldClearAlpha = renderer.getClearAlpha();\n\n\t\tconst baseSampleWeight = 1.0 / jitterOffsets.length;\n\t\tconst roundingRange = 1 / 32;\n\t\tthis._copyUniforms[ 'tDiffuse' ].value = this._sampleRenderTarget.texture;\n\n\t\tconst viewOffset = {\n\n\t\t\tfullWidth: readBuffer.width,\n\t\t\tfullHeight: readBuffer.height,\n\t\t\toffsetX: 0,\n\t\t\toffsetY: 0,\n\t\t\twidth: readBuffer.width,\n\t\t\theight: readBuffer.height\n\n\t\t};\n\n\t\tconst originalViewOffset = Object.assign( {}, this.camera.view );\n\n\t\tif ( originalViewOffset.enabled ) Object.assign( viewOffset, originalViewOffset );\n\n\t\t// render the scene multiple times, each slightly jitter offset from the last and accumulate the results.\n\t\tfor ( let i = 0; i < jitterOffsets.length; i ++ ) {\n\n\t\t\tconst jitterOffset = jitterOffsets[ i ];\n\n\t\t\tif ( this.camera.setViewOffset ) {\n\n\t\t\t\tthis.camera.setViewOffset(\n\n\t\t\t\t\tviewOffset.fullWidth, viewOffset.fullHeight,\n\n\t\t\t\t\tviewOffset.offsetX + jitterOffset[ 0 ] * 0.0625, viewOffset.offsetY + jitterOffset[ 1 ] * 0.0625, // 0.0625 = 1 / 16\n\n\t\t\t\t\tviewOffset.width, viewOffset.height\n\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\tlet sampleWeight = baseSampleWeight;\n\n\t\t\tif ( this.unbiased ) {\n\n\t\t\t\t// the theory is that equal weights for each sample lead to an accumulation of rounding errors.\n\t\t\t\t// The following equation varies the sampleWeight per sample so that it is uniformly distributed\n\t\t\t\t// across a range of values whose rounding errors cancel each other out.\n\n\t\t\t\tconst uniformCenteredDistribution = ( - 0.5 + ( i + 0.5 ) / jitterOffsets.length );\n\t\t\t\tsampleWeight += roundingRange * uniformCenteredDistribution;\n\n\t\t\t}\n\n\t\t\tthis._copyUniforms[ 'opacity' ].value = sampleWeight;\n\t\t\trenderer.setClearColor( this.clearColor, this.clearAlpha );\n\t\t\trenderer.setRenderTarget( this._sampleRenderTarget );\n\t\t\trenderer.clear();\n\t\t\trenderer.render( this.scene, this.camera );\n\n\t\t\trenderer.setRenderTarget( this.renderToScreen ? null : writeBuffer );\n\n\t\t\tif ( i === 0 ) {\n\n\t\t\t\trenderer.setClearColor( 0x000000, 0.0 );\n\t\t\t\trenderer.clear();\n\n\t\t\t}\n\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t}\n\n\t\tif ( this.camera.setViewOffset && originalViewOffset.enabled ) {\n\n\t\t\tthis.camera.setViewOffset(\n\n\t\t\t\toriginalViewOffset.fullWidth, originalViewOffset.fullHeight,\n\n\t\t\t\toriginalViewOffset.offsetX, originalViewOffset.offsetY,\n\n\t\t\t\toriginalViewOffset.width, originalViewOffset.height\n\n\t\t\t);\n\n\t\t} else if ( this.camera.clearViewOffset ) {\n\n\t\t\tthis.camera.clearViewOffset();\n\n\t\t}\n\n\t\trenderer.autoClear = autoClear;\n\t\trenderer.setClearColor( this._oldClearColor, oldClearAlpha );\n\n\t}\n\n}\n\n\n// These jitter vectors are specified in integers because it is easier.\n// I am assuming a [-8,8) integer grid, but it needs to be mapped onto [-0.5,0.5)\n// before being used, thus these integers need to be scaled by 1/16.\n//\n// Sample patterns reference: https://msdn.microsoft.com/en-us/library/windows/desktop/ff476218%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396\nconst _JitterVectors = [\n\t[\n\t\t[ 0, 0 ]\n\t],\n\t[\n\t\t[ 4, 4 ], [ - 4, - 4 ]\n\t],\n\t[\n\t\t[ - 2, - 6 ], [ 6, - 2 ], [ - 6, 2 ], [ 2, 6 ]\n\t],\n\t[\n\t\t[ 1, - 3 ], [ - 1, 3 ], [ 5, 1 ], [ - 3, - 5 ],\n\t\t[ - 5, 5 ], [ - 7, - 1 ], [ 3, 7 ], [ 7, - 7 ]\n\t],\n\t[\n\t\t[ 1, 1 ], [ - 1, - 3 ], [ - 3, 2 ], [ 4, - 1 ],\n\t\t[ - 5, - 2 ], [ 2, 5 ], [ 5, 3 ], [ 3, - 5 ],\n\t\t[ - 2, 6 ], [ 0, - 7 ], [ - 4, - 6 ], [ - 6, 4 ],\n\t\t[ - 8, 0 ], [ 7, - 4 ], [ 6, 7 ], [ - 7, - 8 ]\n\t],\n\t[\n\t\t[ - 4, - 7 ], [ - 7, - 5 ], [ - 3, - 5 ], [ - 5, - 4 ],\n\t\t[ - 1, - 4 ], [ - 2, - 2 ], [ - 6, - 1 ], [ - 4, 0 ],\n\t\t[ - 7, 1 ], [ - 1, 2 ], [ - 6, 3 ], [ - 3, 3 ],\n\t\t[ - 7, 6 ], [ - 3, 6 ], [ - 5, 7 ], [ - 1, 7 ],\n\t\t[ 5, - 7 ], [ 1, - 6 ], [ 6, - 5 ], [ 4, - 4 ],\n\t\t[ 2, - 3 ], [ 7, - 2 ], [ 1, - 1 ], [ 4, - 1 ],\n\t\t[ 2, 1 ], [ 6, 2 ], [ 0, 4 ], [ 4, 4 ],\n\t\t[ 2, 5 ], [ 7, 5 ], [ 5, 6 ], [ 3, 7 ]\n\t]\n];\n\nexport { SSAARenderPass };\n", "import {\n\tMatrix4,\n\tVector2\n} from 'three';\n\n/**\n * @module SSAOShader\n * @three_import import { SSAOShader } from 'three/addons/shaders/SSAOShader.js';\n */\n\n/**\n * SSAO shader.\n *\n * References:\n * - {@link http://john-chapman-graphics.blogspot.com/2013/01/ssao-tutorial.html}\n * - {@link https://learnopengl.com/Advanced-Lighting/SSAO}\n * - {@link https://github.com/McNopper/OpenGL/blob/master/Example28/shader/ssao.frag.glsl}\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst SSAOShader = {\n\n\tname: 'SSAOShader',\n\n\tdefines: {\n\t\t'PERSPECTIVE_CAMERA': 1,\n\t\t'KERNEL_SIZE': 32\n\t},\n\n\tuniforms: {\n\n\t\t'tNormal': { value: null },\n\t\t'tDepth': { value: null },\n\t\t'tNoise': { value: null },\n\t\t'kernel': { value: null },\n\t\t'cameraNear': { value: null },\n\t\t'cameraFar': { value: null },\n\t\t'resolution': { value: new Vector2() },\n\t\t'cameraProjectionMatrix': { value: new Matrix4() },\n\t\t'cameraInverseProjectionMatrix': { value: new Matrix4() },\n\t\t'kernelRadius': { value: 8 },\n\t\t'minDistance': { value: 0.005 },\n\t\t'maxDistance': { value: 0.05 },\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\t\tuniform highp sampler2D tNormal;\n\t\tuniform highp sampler2D tDepth;\n\t\tuniform sampler2D tNoise;\n\n\t\tuniform vec3 kernel[ KERNEL_SIZE ];\n\n\t\tuniform vec2 resolution;\n\n\t\tuniform float cameraNear;\n\t\tuniform float cameraFar;\n\t\tuniform mat4 cameraProjectionMatrix;\n\t\tuniform mat4 cameraInverseProjectionMatrix;\n\n\t\tuniform float kernelRadius;\n\t\tuniform float minDistance; // avoid artifacts caused by neighbour fragments with minimal depth difference\n\t\tuniform float maxDistance; // avoid the influence of fragments which are too far away\n\n\t\tvarying vec2 vUv;\n\n\t\t#include <packing>\n\n\t\tfloat getDepth( const in vec2 screenPosition ) {\n\n\t\t\treturn texture2D( tDepth, screenPosition ).x;\n\n\t\t}\n\n\t\tfloat getLinearDepth( const in vec2 screenPosition ) {\n\n\t\t\t#if PERSPECTIVE_CAMERA == 1\n\n\t\t\t\tfloat fragCoordZ = texture2D( tDepth, screenPosition ).x;\n\t\t\t\tfloat viewZ = perspectiveDepthToViewZ( fragCoordZ, cameraNear, cameraFar );\n\t\t\t\treturn viewZToOrthographicDepth( viewZ, cameraNear, cameraFar );\n\n\t\t\t#else\n\n\t\t\t\treturn texture2D( tDepth, screenPosition ).x;\n\n\t\t\t#endif\n\n\t\t}\n\n\t\tfloat getViewZ( const in float depth ) {\n\n\t\t\t#if PERSPECTIVE_CAMERA == 1\n\n\t\t\t\treturn perspectiveDepthToViewZ( depth, cameraNear, cameraFar );\n\n\t\t\t#else\n\n\t\t\t\treturn orthographicDepthToViewZ( depth, cameraNear, cameraFar );\n\n\t\t\t#endif\n\n\t\t}\n\n\t\tvec3 getViewPosition( const in vec2 screenPosition, const in float depth, const in float viewZ ) {\n\n\t\t\tfloat clipW = cameraProjectionMatrix[2][3] * viewZ + cameraProjectionMatrix[3][3];\n\n\t\t\tvec4 clipPosition = vec4( ( vec3( screenPosition, depth ) - 0.5 ) * 2.0, 1.0 );\n\n\t\t\tclipPosition *= clipW; // unprojection.\n\n\t\t\treturn ( cameraInverseProjectionMatrix * clipPosition ).xyz;\n\n\t\t}\n\n\t\tvec3 getViewNormal( const in vec2 screenPosition ) {\n\n\t\t\treturn unpackRGBToNormal( texture2D( tNormal, screenPosition ).xyz );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tfloat depth = getDepth( vUv );\n\n\t\t\tif ( depth == 1.0 ) {\n\n\t\t\t\tgl_FragColor = vec4( 1.0 ); // don't influence background\n\n\t\t\t} else {\n\n\t\t\t\tfloat viewZ = getViewZ( depth );\n\n\t\t\t\tvec3 viewPosition = getViewPosition( vUv, depth, viewZ );\n\t\t\t\tvec3 viewNormal = getViewNormal( vUv );\n\n\t\t\t\tvec2 noiseScale = vec2( resolution.x / 4.0, resolution.y / 4.0 );\n\t\t\t\tvec3 random = vec3( texture2D( tNoise, vUv * noiseScale ).r );\n\n\t\t\t\t// compute matrix used to reorient a kernel vector\n\n\t\t\t\tvec3 tangent = normalize( random - viewNormal * dot( random, viewNormal ) );\n\t\t\t\tvec3 bitangent = cross( viewNormal, tangent );\n\t\t\t\tmat3 kernelMatrix = mat3( tangent, bitangent, viewNormal );\n\n\t\t\t\tfloat occlusion = 0.0;\n\n\t\t\t\tfor ( int i = 0; i < KERNEL_SIZE; i ++ ) {\n\n\t\t\t\t\tvec3 sampleVector = kernelMatrix * kernel[ i ]; // reorient sample vector in view space\n\t\t\t\t\tvec3 samplePoint = viewPosition + ( sampleVector * kernelRadius ); // calculate sample point\n\n\t\t\t\t\tvec4 samplePointNDC = cameraProjectionMatrix * vec4( samplePoint, 1.0 ); // project point and calculate NDC\n\t\t\t\t\tsamplePointNDC /= samplePointNDC.w;\n\n\t\t\t\t\tvec2 samplePointUv = samplePointNDC.xy * 0.5 + 0.5; // compute uv coordinates\n\n\t\t\t\t\tfloat realDepth = getLinearDepth( samplePointUv ); // get linear depth from depth texture\n\t\t\t\t\tfloat sampleDepth = viewZToOrthographicDepth( samplePoint.z, cameraNear, cameraFar ); // compute linear depth of the sample view Z value\n\t\t\t\t\tfloat delta = sampleDepth - realDepth;\n\n\t\t\t\t\tif ( delta > minDistance && delta < maxDistance ) { // if fragment is before sample point, increase occlusion\n\n\t\t\t\t\t\tocclusion += 1.0;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tocclusion = clamp( occlusion / float( KERNEL_SIZE ), 0.0, 1.0 );\n\n\t\t\t\tgl_FragColor = vec4( vec3( 1.0 - occlusion ), 1.0 );\n\n\t\t\t}\n\n\t\t}`\n\n};\n\n/**\n * SSAO depth shader.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst SSAODepthShader = {\n\n\tname: 'SSAODepthShader',\n\n\tdefines: {\n\t\t'PERSPECTIVE_CAMERA': 1\n\t},\n\n\tuniforms: {\n\n\t\t'tDepth': { value: null },\n\t\t'cameraNear': { value: null },\n\t\t'cameraFar': { value: null },\n\n\t},\n\n\tvertexShader:\n\n\t\t`varying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader:\n\n\t\t`uniform sampler2D tDepth;\n\n\t\tuniform float cameraNear;\n\t\tuniform float cameraFar;\n\n\t\tvarying vec2 vUv;\n\n\t\t#include <packing>\n\n\t\tfloat getLinearDepth( const in vec2 screenPosition ) {\n\n\t\t\t#if PERSPECTIVE_CAMERA == 1\n\n\t\t\t\tfloat fragCoordZ = texture2D( tDepth, screenPosition ).x;\n\t\t\t\tfloat viewZ = perspectiveDepthToViewZ( fragCoordZ, cameraNear, cameraFar );\n\t\t\t\treturn viewZToOrthographicDepth( viewZ, cameraNear, cameraFar );\n\n\t\t\t#else\n\n\t\t\t\treturn texture2D( tDepth, screenPosition ).x;\n\n\t\t\t#endif\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tfloat depth = getLinearDepth( vUv );\n\t\t\tgl_FragColor = vec4( vec3( 1.0 - depth ), 1.0 );\n\n\t\t}`\n\n};\n\n/**\n * SSAO blur shader.\n *\n * @constant\n * @type {Object}\n */\nconst SSAOBlurShader = {\n\n\tname: 'SSAOBlurShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'resolution': { value: new Vector2() }\n\n\t},\n\n\tvertexShader:\n\n\t\t`varying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader:\n\n\t\t`uniform sampler2D tDiffuse;\n\n\t\tuniform vec2 resolution;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec2 texelSize = ( 1.0 / resolution );\n\t\t\tfloat result = 0.0;\n\n\t\t\tfor ( int i = - 2; i <= 2; i ++ ) {\n\n\t\t\t\tfor ( int j = - 2; j <= 2; j ++ ) {\n\n\t\t\t\t\tvec2 offset = ( vec2( float( i ), float( j ) ) ) * texelSize;\n\t\t\t\t\tresult += texture2D( tDiffuse, vUv + offset ).r;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tgl_FragColor = vec4( vec3( result / ( 5.0 * 5.0 ) ), 1.0 );\n\n\t\t}`\n\n};\n\nexport { SSAOShader, SSAODepthShader, SSAOBlurShader };\n", "import {\n\tAddEquation,\n\tColor,\n\tCustomBlending,\n\tDataTexture,\n\tDepthTexture,\n\tDstAlphaFactor,\n\tDstColorFactor,\n\tFloatType,\n\tHalfFloatType,\n\tMathUtils,\n\tMeshNormalMaterial,\n\tNearestFilter,\n\tNoBlending,\n\tRedFormat,\n\tDepthStencilFormat,\n\tUnsignedInt248Type,\n\tRepeatWrapping,\n\tShaderMaterial,\n\tUniformsUtils,\n\tVector3,\n\tWebGLRenderTarget,\n\tZeroFactor\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\nimport { SimplexNoise } from '../math/SimplexNoise.js';\nimport { SSAOBlurShader, SSAODepthShader, SSAOShader } from '../shaders/SSAOShader.js';\nimport { CopyShader } from '../shaders/CopyShader.js';\n\n/**\n * A pass for a basic SSAO effect.\n *\n * {@link SAOPass} and {@link GTAPass} produce a more advanced AO but are also\n * more expensive.\n *\n * ```js\n * const ssaoPass = new SSAOPass( scene, camera, width, height );\n * composer.addPass( ssaoPass );\n * ```\n *\n * @augments Pass\n * @three_import import { SSAOPass } from 'three/addons/postprocessing/SSAOPass.js';\n */\nclass SSAOPass extends Pass {\n\n\t/**\n\t * Constructs a new SSAO pass.\n\t *\n\t * @param {Scene} scene - The scene to compute the AO for.\n\t * @param {Camera} camera - The camera.\n\t * @param {number} [width=512] - The width of the effect.\n\t * @param {number} [height=512] - The height of the effect.\n\t * @param {number} [kernelSize=32] - The kernel size.\n\t */\n\tconstructor( scene, camera, width = 512, height = 512, kernelSize = 32 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The width of the effect.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 512\n\t\t */\n\t\tthis.width = width;\n\n\t\t/**\n\t\t * The height of the effect.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 512\n\t\t */\n\t\tthis.height = height;\n\n\t\t/**\n\t\t * Overwritten to perform a clear operation by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.clear = true;\n\n\t\t/**\n\t\t * Overwritten to disable the swap.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsSwap = false;\n\n\t\t/**\n\t\t * The camera.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = camera;\n\n\t\t/**\n\t\t * The scene to render the AO for.\n\t\t *\n\t\t * @type {Scene}\n\t\t */\n\t\tthis.scene = scene;\n\n\t\t/**\n\t\t * The kernel radius controls how wide the\n\t\t * AO spreads.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 8\n\t\t */\n\t\tthis.kernelRadius = 8;\n\t\tthis.kernel = [];\n\t\tthis.noiseTexture = null;\n\n\t\t/**\n\t\t * The output configuration.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.output = 0;\n\n\t\t/**\n\t\t * Defines the minimum distance that should be\n\t\t * affected by the AO.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.005\n\t\t */\n\t\tthis.minDistance = 0.005;\n\n\t\t/**\n\t\t * Defines the maximum distance that should be\n\t\t * affected by the AO.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.1\n\t\t */\n\t\tthis.maxDistance = 0.1;\n\n\t\tthis._visibilityCache = [];\n\n\t\t//\n\n\t\tthis._generateSampleKernel( kernelSize );\n\t\tthis._generateRandomKernelRotations();\n\n\t\t// depth texture\n\n\t\tconst depthTexture = new DepthTexture();\n\t\tdepthTexture.format = DepthStencilFormat;\n\t\tdepthTexture.type = UnsignedInt248Type;\n\n\t\t// normal render target with depth buffer\n\n\t\tthis.normalRenderTarget = new WebGLRenderTarget( this.width, this.height, {\n\t\t\tminFilter: NearestFilter,\n\t\t\tmagFilter: NearestFilter,\n\t\t\ttype: HalfFloatType,\n\t\t\tdepthTexture: depthTexture\n\t\t} );\n\n\t\t// ssao render target\n\n\t\tthis.ssaoRenderTarget = new WebGLRenderTarget( this.width, this.height, { type: HalfFloatType } );\n\n\t\tthis.blurRenderTarget = this.ssaoRenderTarget.clone();\n\n\t\t// ssao material\n\n\t\tthis.ssaoMaterial = new ShaderMaterial( {\n\t\t\tdefines: Object.assign( {}, SSAOShader.defines ),\n\t\t\tuniforms: UniformsUtils.clone( SSAOShader.uniforms ),\n\t\t\tvertexShader: SSAOShader.vertexShader,\n\t\t\tfragmentShader: SSAOShader.fragmentShader,\n\t\t\tblending: NoBlending\n\t\t} );\n\n\t\tthis.ssaoMaterial.defines[ 'KERNEL_SIZE' ] = kernelSize;\n\n\t\tthis.ssaoMaterial.uniforms[ 'tNormal' ].value = this.normalRenderTarget.texture;\n\t\tthis.ssaoMaterial.uniforms[ 'tDepth' ].value = this.normalRenderTarget.depthTexture;\n\t\tthis.ssaoMaterial.uniforms[ 'tNoise' ].value = this.noiseTexture;\n\t\tthis.ssaoMaterial.uniforms[ 'kernel' ].value = this.kernel;\n\t\tthis.ssaoMaterial.uniforms[ 'cameraNear' ].value = this.camera.near;\n\t\tthis.ssaoMaterial.uniforms[ 'cameraFar' ].value = this.camera.far;\n\t\tthis.ssaoMaterial.uniforms[ 'resolution' ].value.set( this.width, this.height );\n\t\tthis.ssaoMaterial.uniforms[ 'cameraProjectionMatrix' ].value.copy( this.camera.projectionMatrix );\n\t\tthis.ssaoMaterial.uniforms[ 'cameraInverseProjectionMatrix' ].value.copy( this.camera.projectionMatrixInverse );\n\n\t\t// normal material\n\n\t\tthis.normalMaterial = new MeshNormalMaterial();\n\t\tthis.normalMaterial.blending = NoBlending;\n\n\t\t// blur material\n\n\t\tthis.blurMaterial = new ShaderMaterial( {\n\t\t\tdefines: Object.assign( {}, SSAOBlurShader.defines ),\n\t\t\tuniforms: UniformsUtils.clone( SSAOBlurShader.uniforms ),\n\t\t\tvertexShader: SSAOBlurShader.vertexShader,\n\t\t\tfragmentShader: SSAOBlurShader.fragmentShader\n\t\t} );\n\t\tthis.blurMaterial.uniforms[ 'tDiffuse' ].value = this.ssaoRenderTarget.texture;\n\t\tthis.blurMaterial.uniforms[ 'resolution' ].value.set( this.width, this.height );\n\n\t\t// material for rendering the depth\n\n\t\tthis.depthRenderMaterial = new ShaderMaterial( {\n\t\t\tdefines: Object.assign( {}, SSAODepthShader.defines ),\n\t\t\tuniforms: UniformsUtils.clone( SSAODepthShader.uniforms ),\n\t\t\tvertexShader: SSAODepthShader.vertexShader,\n\t\t\tfragmentShader: SSAODepthShader.fragmentShader,\n\t\t\tblending: NoBlending\n\t\t} );\n\t\tthis.depthRenderMaterial.uniforms[ 'tDepth' ].value = this.normalRenderTarget.depthTexture;\n\t\tthis.depthRenderMaterial.uniforms[ 'cameraNear' ].value = this.camera.near;\n\t\tthis.depthRenderMaterial.uniforms[ 'cameraFar' ].value = this.camera.far;\n\n\t\t// material for rendering the content of a render target\n\n\t\tthis.copyMaterial = new ShaderMaterial( {\n\t\t\tuniforms: UniformsUtils.clone( CopyShader.uniforms ),\n\t\t\tvertexShader: CopyShader.vertexShader,\n\t\t\tfragmentShader: CopyShader.fragmentShader,\n\t\t\ttransparent: true,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\tblendSrc: DstColorFactor,\n\t\t\tblendDst: ZeroFactor,\n\t\t\tblendEquation: AddEquation,\n\t\t\tblendSrcAlpha: DstAlphaFactor,\n\t\t\tblendDstAlpha: ZeroFactor,\n\t\t\tblendEquationAlpha: AddEquation\n\t\t} );\n\n\t\t// internals\n\n\t\tthis._fsQuad = new FullScreenQuad( null );\n\n\t\tthis._originalClearColor = new Color();\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the pass is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\t// dispose render targets\n\n\t\tthis.normalRenderTarget.dispose();\n\t\tthis.ssaoRenderTarget.dispose();\n\t\tthis.blurRenderTarget.dispose();\n\n\t\t// dispose materials\n\n\t\tthis.normalMaterial.dispose();\n\t\tthis.blurMaterial.dispose();\n\t\tthis.copyMaterial.dispose();\n\t\tthis.depthRenderMaterial.dispose();\n\n\t\t// dispose full screen quad\n\n\t\tthis._fsQuad.dispose();\n\n\t}\n\n\t/**\n\t * Performs the SSAO pass.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\t// render normals and depth (honor only meshes, points and lines do not contribute to SSAO)\n\n\t\tthis._overrideVisibility();\n\t\tthis._renderOverride( renderer, this.normalMaterial, this.normalRenderTarget, 0x7777ff, 1.0 );\n\t\tthis._restoreVisibility();\n\n\t\t// render SSAO\n\n\t\tthis.ssaoMaterial.uniforms[ 'kernelRadius' ].value = this.kernelRadius;\n\t\tthis.ssaoMaterial.uniforms[ 'minDistance' ].value = this.minDistance;\n\t\tthis.ssaoMaterial.uniforms[ 'maxDistance' ].value = this.maxDistance;\n\t\tthis._renderPass( renderer, this.ssaoMaterial, this.ssaoRenderTarget );\n\n\t\t// render blur\n\n\t\tthis._renderPass( renderer, this.blurMaterial, this.blurRenderTarget );\n\n\t\t// output result to screen\n\n\t\tswitch ( this.output ) {\n\n\t\t\tcase SSAOPass.OUTPUT.SSAO:\n\n\t\t\t\tthis.copyMaterial.uniforms[ 'tDiffuse' ].value = this.ssaoRenderTarget.texture;\n\t\t\t\tthis.copyMaterial.blending = NoBlending;\n\t\t\t\tthis._renderPass( renderer, this.copyMaterial, this.renderToScreen ? null : readBuffer );\n\n\t\t\t\tbreak;\n\n\t\t\tcase SSAOPass.OUTPUT.Blur:\n\n\t\t\t\tthis.copyMaterial.uniforms[ 'tDiffuse' ].value = this.blurRenderTarget.texture;\n\t\t\t\tthis.copyMaterial.blending = NoBlending;\n\t\t\t\tthis._renderPass( renderer, this.copyMaterial, this.renderToScreen ? null : readBuffer );\n\n\t\t\t\tbreak;\n\n\t\t\tcase SSAOPass.OUTPUT.Depth:\n\n\t\t\t\tthis._renderPass( renderer, this.depthRenderMaterial, this.renderToScreen ? null : readBuffer );\n\n\t\t\t\tbreak;\n\n\t\t\tcase SSAOPass.OUTPUT.Normal:\n\n\t\t\t\tthis.copyMaterial.uniforms[ 'tDiffuse' ].value = this.normalRenderTarget.texture;\n\t\t\t\tthis.copyMaterial.blending = NoBlending;\n\t\t\t\tthis._renderPass( renderer, this.copyMaterial, this.renderToScreen ? null : readBuffer );\n\n\t\t\t\tbreak;\n\n\t\t\tcase SSAOPass.OUTPUT.Default:\n\n\t\t\t\tthis.copyMaterial.uniforms[ 'tDiffuse' ].value = this.blurRenderTarget.texture;\n\t\t\t\tthis.copyMaterial.blending = CustomBlending;\n\t\t\t\tthis._renderPass( renderer, this.copyMaterial, this.renderToScreen ? null : readBuffer );\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.warn( 'THREE.SSAOPass: Unknown output type.' );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the size of the pass.\n\t *\n\t * @param {number} width - The width to set.\n\t * @param {number} height - The height to set.\n\t */\n\tsetSize( width, height ) {\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t\tthis.ssaoRenderTarget.setSize( width, height );\n\t\tthis.normalRenderTarget.setSize( width, height );\n\t\tthis.blurRenderTarget.setSize( width, height );\n\n\t\tthis.ssaoMaterial.uniforms[ 'resolution' ].value.set( width, height );\n\t\tthis.ssaoMaterial.uniforms[ 'cameraProjectionMatrix' ].value.copy( this.camera.projectionMatrix );\n\t\tthis.ssaoMaterial.uniforms[ 'cameraInverseProjectionMatrix' ].value.copy( this.camera.projectionMatrixInverse );\n\n\t\tthis.blurMaterial.uniforms[ 'resolution' ].value.set( width, height );\n\n\t}\n\n\t// internals\n\n\t_renderPass( renderer, passMaterial, renderTarget, clearColor, clearAlpha ) {\n\n\t\t// save original state\n\t\trenderer.getClearColor( this._originalClearColor );\n\t\tconst originalClearAlpha = renderer.getClearAlpha();\n\t\tconst originalAutoClear = renderer.autoClear;\n\n\t\trenderer.setRenderTarget( renderTarget );\n\n\t\t// setup pass state\n\t\trenderer.autoClear = false;\n\t\tif ( ( clearColor !== undefined ) && ( clearColor !== null ) ) {\n\n\t\t\trenderer.setClearColor( clearColor );\n\t\t\trenderer.setClearAlpha( clearAlpha || 0.0 );\n\t\t\trenderer.clear();\n\n\t\t}\n\n\t\tthis._fsQuad.material = passMaterial;\n\t\tthis._fsQuad.render( renderer );\n\n\t\t// restore original state\n\t\trenderer.autoClear = originalAutoClear;\n\t\trenderer.setClearColor( this._originalClearColor );\n\t\trenderer.setClearAlpha( originalClearAlpha );\n\n\t}\n\n\t_renderOverride( renderer, overrideMaterial, renderTarget, clearColor, clearAlpha ) {\n\n\t\trenderer.getClearColor( this._originalClearColor );\n\t\tconst originalClearAlpha = renderer.getClearAlpha();\n\t\tconst originalAutoClear = renderer.autoClear;\n\n\t\trenderer.setRenderTarget( renderTarget );\n\t\trenderer.autoClear = false;\n\n\t\tclearColor = overrideMaterial.clearColor || clearColor;\n\t\tclearAlpha = overrideMaterial.clearAlpha || clearAlpha;\n\n\t\tif ( ( clearColor !== undefined ) && ( clearColor !== null ) ) {\n\n\t\t\trenderer.setClearColor( clearColor );\n\t\t\trenderer.setClearAlpha( clearAlpha || 0.0 );\n\t\t\trenderer.clear();\n\n\t\t}\n\n\t\tthis.scene.overrideMaterial = overrideMaterial;\n\t\trenderer.render( this.scene, this.camera );\n\t\tthis.scene.overrideMaterial = null;\n\n\t\t// restore original state\n\n\t\trenderer.autoClear = originalAutoClear;\n\t\trenderer.setClearColor( this._originalClearColor );\n\t\trenderer.setClearAlpha( originalClearAlpha );\n\n\t}\n\n\t_generateSampleKernel( kernelSize ) {\n\n\t\tconst kernel = this.kernel;\n\n\t\tfor ( let i = 0; i < kernelSize; i ++ ) {\n\n\t\t\tconst sample = new Vector3();\n\t\t\tsample.x = ( Math.random() * 2 ) - 1;\n\t\t\tsample.y = ( Math.random() * 2 ) - 1;\n\t\t\tsample.z = Math.random();\n\n\t\t\tsample.normalize();\n\n\t\t\tlet scale = i / kernelSize;\n\t\t\tscale = MathUtils.lerp( 0.1, 1, scale * scale );\n\t\t\tsample.multiplyScalar( scale );\n\n\t\t\tkernel.push( sample );\n\n\t\t}\n\n\t}\n\n\t_generateRandomKernelRotations() {\n\n\t\tconst width = 4, height = 4;\n\n\t\tconst simplex = new SimplexNoise();\n\n\t\tconst size = width * height;\n\t\tconst data = new Float32Array( size );\n\n\t\tfor ( let i = 0; i < size; i ++ ) {\n\n\t\t\tconst x = ( Math.random() * 2 ) - 1;\n\t\t\tconst y = ( Math.random() * 2 ) - 1;\n\t\t\tconst z = 0;\n\n\t\t\tdata[ i ] = simplex.noise3d( x, y, z );\n\n\t\t}\n\n\t\tthis.noiseTexture = new DataTexture( data, width, height, RedFormat, FloatType );\n\t\tthis.noiseTexture.wrapS = RepeatWrapping;\n\t\tthis.noiseTexture.wrapT = RepeatWrapping;\n\t\tthis.noiseTexture.needsUpdate = true;\n\n\t}\n\n\t_overrideVisibility() {\n\n\t\tconst scene = this.scene;\n\t\tconst cache = this._visibilityCache;\n\n\t\tscene.traverse( function ( object ) {\n\n\t\t\tif ( ( object.isPoints || object.isLine || object.isLine2 ) && object.visible ) {\n\n\t\t\t\tobject.visible = false;\n\t\t\t\tcache.push( object );\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\t_restoreVisibility() {\n\n\t\tconst cache = this._visibilityCache;\n\n\t\tfor ( let i = 0; i < cache.length; i ++ ) {\n\n\t\t\tcache[ i ].visible = true;\n\n\t\t}\n\n\t\tcache.length = 0;\n\n\t}\n\n}\n\nSSAOPass.OUTPUT = {\n\t'Default': 0,\n\t'SSAO': 1,\n\t'Blur': 2,\n\t'Depth': 3,\n\t'Normal': 4\n};\n\nexport { SSAOPass };\n", "import {\n\tMatrix4,\n\tVector2\n} from 'three';\n\n\n/**\n * A collection of shaders used for SSR.\n *\n * References:\n * - [3D Game Shaders For Beginners, Screen Space Reflection (SSR)](https://lettier.github.io/3d-game-shaders-for-beginners/screen-space-reflection.html).\n *\n * @module SSRShader\n * @three_import import * as SSRShader from 'three/addons/shaders/SSRShader.js';\n */\n\n/**\n * SSR shader.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst SSRShader = {\n\n\tname: 'SSRShader',\n\n\tdefines: {\n\t\tMAX_STEP: 0,\n\t\tPERSPECTIVE_CAMERA: true,\n\t\tDISTANCE_ATTENUATION: true,\n\t\tFRESNEL: true,\n\t\tINFINITE_THICK: false,\n\t\tSELECTIVE: false,\n\t},\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'tNormal': { value: null },\n\t\t'tMetalness': { value: null },\n\t\t'tDepth': { value: null },\n\t\t'cameraNear': { value: null },\n\t\t'cameraFar': { value: null },\n\t\t'resolution': { value: new Vector2() },\n\t\t'cameraProjectionMatrix': { value: new Matrix4() },\n\t\t'cameraInverseProjectionMatrix': { value: new Matrix4() },\n\t\t'opacity': { value: .5 },\n\t\t'maxDistance': { value: 180 },\n\t\t'cameraRange': { value: 0 },\n\t\t'thickness': { value: .018 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}\n\n\t`,\n\n\tfragmentShader: /* glsl */`\n\t\t// precision highp float;\n\t\tprecision highp sampler2D;\n\t\tvarying vec2 vUv;\n\t\tuniform sampler2D tDepth;\n\t\tuniform sampler2D tNormal;\n\t\tuniform sampler2D tMetalness;\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform float cameraRange;\n\t\tuniform vec2 resolution;\n\t\tuniform float opacity;\n\t\tuniform float cameraNear;\n\t\tuniform float cameraFar;\n\t\tuniform float maxDistance;\n\t\tuniform float thickness;\n\t\tuniform mat4 cameraProjectionMatrix;\n\t\tuniform mat4 cameraInverseProjectionMatrix;\n\t\t#include <packing>\n\t\tfloat pointToLineDistance(vec3 x0, vec3 x1, vec3 x2) {\n\t\t\t//x0: point, x1: linePointA, x2: linePointB\n\t\t\t//https://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html\n\t\t\treturn length(cross(x0-x1,x0-x2))/length(x2-x1);\n\t\t}\n\t\tfloat pointPlaneDistance(vec3 point,vec3 planePoint,vec3 planeNormal){\n\t\t\t// https://mathworld.wolfram.com/Point-PlaneDistance.html\n\t\t\t//// https://en.wikipedia.org/wiki/Plane_(geometry)\n\t\t\t//// http://paulbourke.net/geometry/pointlineplane/\n\t\t\tfloat a=planeNormal.x,b=planeNormal.y,c=planeNormal.z;\n\t\t\tfloat x0=point.x,y0=point.y,z0=point.z;\n\t\t\tfloat x=planePoint.x,y=planePoint.y,z=planePoint.z;\n\t\t\tfloat d=-(a*x+b*y+c*z);\n\t\t\tfloat distance=(a*x0+b*y0+c*z0+d)/sqrt(a*a+b*b+c*c);\n\t\t\treturn distance;\n\t\t}\n\t\tfloat getDepth( const in vec2 uv ) {\n\t\t\treturn texture2D( tDepth, uv ).x;\n\t\t}\n\t\tfloat getViewZ( const in float depth ) {\n\t\t\t#ifdef PERSPECTIVE_CAMERA\n\t\t\t\treturn perspectiveDepthToViewZ( depth, cameraNear, cameraFar );\n\t\t\t#else\n\t\t\t\treturn orthographicDepthToViewZ( depth, cameraNear, cameraFar );\n\t\t\t#endif\n\t\t}\n\t\tvec3 getViewPosition( const in vec2 uv, const in float depth/*clip space*/, const in float clipW ) {\n\t\t\tvec4 clipPosition = vec4( ( vec3( uv, depth ) - 0.5 ) * 2.0, 1.0 );//ndc\n\t\t\tclipPosition *= clipW; //clip\n\t\t\treturn ( cameraInverseProjectionMatrix * clipPosition ).xyz;//view\n\t\t}\n\t\tvec3 getViewNormal( const in vec2 uv ) {\n\t\t\treturn unpackRGBToNormal( texture2D( tNormal, uv ).xyz );\n\t\t}\n\t\tvec2 viewPositionToXY(vec3 viewPosition){\n\t\t\tvec2 xy;\n\t\t\tvec4 clip=cameraProjectionMatrix*vec4(viewPosition,1);\n\t\t\txy=clip.xy;//clip\n\t\t\tfloat clipW=clip.w;\n\t\t\txy/=clipW;//NDC\n\t\t\txy=(xy+1.)/2.;//uv\n\t\t\txy*=resolution;//screen\n\t\t\treturn xy;\n\t\t}\n\t\tvoid main(){\n\t\t\t#ifdef SELECTIVE\n\t\t\t\tfloat metalness=texture2D(tMetalness,vUv).r;\n\t\t\t\tif(metalness==0.) return;\n\t\t\t#endif\n\n\t\t\tfloat depth = getDepth( vUv );\n\t\t\tfloat viewZ = getViewZ( depth );\n\t\t\tif(-viewZ>=cameraFar) return;\n\n\t\t\tfloat clipW = cameraProjectionMatrix[2][3] * viewZ+cameraProjectionMatrix[3][3];\n\t\t\tvec3 viewPosition=getViewPosition( vUv, depth, clipW );\n\n\t\t\tvec2 d0=gl_FragCoord.xy;\n\t\t\tvec2 d1;\n\n\t\t\tvec3 viewNormal=getViewNormal( vUv );\n\n\t\t\t#ifdef PERSPECTIVE_CAMERA\n\t\t\t\tvec3 viewIncidentDir=normalize(viewPosition);\n\t\t\t\tvec3 viewReflectDir=reflect(viewIncidentDir,viewNormal);\n\t\t\t#else\n\t\t\t\tvec3 viewIncidentDir=vec3(0,0,-1);\n\t\t\t\tvec3 viewReflectDir=reflect(viewIncidentDir,viewNormal);\n\t\t\t#endif\n\n\t\t\tfloat maxReflectRayLen=maxDistance/dot(-viewIncidentDir,viewNormal);\n\t\t\t// dot(a,b)==length(a)*length(b)*cos(theta) // https://www.mathsisfun.com/algebra/vectors-dot-product.html\n\t\t\t// if(a.isNormalized&&b.isNormalized) dot(a,b)==cos(theta)\n\t\t\t// maxDistance/maxReflectRayLen=cos(theta)\n\t\t\t// maxDistance/maxReflectRayLen==dot(a,b)\n\t\t\t// maxReflectRayLen==maxDistance/dot(a,b)\n\n\t\t\tvec3 d1viewPosition=viewPosition+viewReflectDir*maxReflectRayLen;\n\t\t\t#ifdef PERSPECTIVE_CAMERA\n\t\t\t\tif(d1viewPosition.z>-cameraNear){\n\t\t\t\t\t//https://tutorial.math.lamar.edu/Classes/CalcIII/EqnsOfLines.aspx\n\t\t\t\t\tfloat t=(-cameraNear-viewPosition.z)/viewReflectDir.z;\n\t\t\t\t\td1viewPosition=viewPosition+viewReflectDir*t;\n\t\t\t\t}\n\t\t\t#endif\n\t\t\td1=viewPositionToXY(d1viewPosition);\n\n\t\t\tfloat totalLen=length(d1-d0);\n\t\t\tfloat xLen=d1.x-d0.x;\n\t\t\tfloat yLen=d1.y-d0.y;\n\t\t\tfloat totalStep=max(abs(xLen),abs(yLen));\n\t\t\tfloat xSpan=xLen/totalStep;\n\t\t\tfloat ySpan=yLen/totalStep;\n\t\t\tfor(float i=0.;i<float(MAX_STEP);i++){\n\t\t\t\tif(i>=totalStep) break;\n\t\t\t\tvec2 xy=vec2(d0.x+i*xSpan,d0.y+i*ySpan);\n\t\t\t\tif(xy.x<0.||xy.x>resolution.x||xy.y<0.||xy.y>resolution.y) break;\n\t\t\t\tfloat s=length(xy-d0)/totalLen;\n\t\t\t\tvec2 uv=xy/resolution;\n\n\t\t\t\tfloat d = getDepth(uv);\n\t\t\t\tfloat vZ = getViewZ( d );\n\t\t\t\tif(-vZ>=cameraFar) continue;\n\t\t\t\tfloat cW = cameraProjectionMatrix[2][3] * vZ+cameraProjectionMatrix[3][3];\n\t\t\t\tvec3 vP=getViewPosition( uv, d, cW );\n\n\t\t\t\t#ifdef PERSPECTIVE_CAMERA\n\t\t\t\t\t// https://comp.nus.edu.sg/~lowkl/publications/lowk_persp_interp_techrep.pdf\n\t\t\t\t\tfloat recipVPZ=1./viewPosition.z;\n\t\t\t\t\tfloat viewReflectRayZ=1./(recipVPZ+s*(1./d1viewPosition.z-recipVPZ));\n\t\t\t\t#else\n\t\t\t\t\tfloat viewReflectRayZ=viewPosition.z+s*(d1viewPosition.z-viewPosition.z);\n\t\t\t\t#endif\n\n\t\t\t\t// if(viewReflectRayZ>vZ) continue; // will cause \"npm run make-screenshot webgl_postprocessing_ssr\" high probability hang.\n\t\t\t\t// https://github.com/mrdoob/three.js/pull/21539#issuecomment-821061164\n\t\t\t\tif(viewReflectRayZ<=vZ){\n\n\t\t\t\t\tbool hit;\n\t\t\t\t\t#ifdef INFINITE_THICK\n\t\t\t\t\t\thit=true;\n\t\t\t\t\t#else\n\t\t\t\t\t\tfloat away=pointToLineDistance(vP,viewPosition,d1viewPosition);\n\n\t\t\t\t\t\tfloat minThickness;\n\t\t\t\t\t\tvec2 xyNeighbor=xy;\n\t\t\t\t\t\txyNeighbor.x+=1.;\n\t\t\t\t\t\tvec2 uvNeighbor=xyNeighbor/resolution;\n\t\t\t\t\t\tvec3 vPNeighbor=getViewPosition(uvNeighbor,d,cW);\n\t\t\t\t\t\tminThickness=vPNeighbor.x-vP.x;\n\t\t\t\t\t\tminThickness*=3.;\n\t\t\t\t\t\tfloat tk=max(minThickness,thickness);\n\n\t\t\t\t\t\thit=away<=tk;\n\t\t\t\t\t#endif\n\n\t\t\t\t\tif(hit){\n\t\t\t\t\t\tvec3 vN=getViewNormal( uv );\n\t\t\t\t\t\tif(dot(viewReflectDir,vN)>=0.) continue;\n\t\t\t\t\t\tfloat distance=pointPlaneDistance(vP,viewPosition,viewNormal);\n\t\t\t\t\t\tif(distance>maxDistance) break;\n\t\t\t\t\t\tfloat op=opacity;\n\t\t\t\t\t\t#ifdef DISTANCE_ATTENUATION\n\t\t\t\t\t\t\tfloat ratio=1.-(distance/maxDistance);\n\t\t\t\t\t\t\tfloat attenuation=ratio*ratio;\n\t\t\t\t\t\t\top=opacity*attenuation;\n\t\t\t\t\t\t#endif\n\t\t\t\t\t\t#ifdef FRESNEL\n\t\t\t\t\t\t\tfloat fresnelCoe=(dot(viewIncidentDir,viewReflectDir)+1.)/2.;\n\t\t\t\t\t\t\top*=fresnelCoe;\n\t\t\t\t\t\t#endif\n\t\t\t\t\t\tvec4 reflectColor=texture2D(tDiffuse,uv);\n\t\t\t\t\t\tgl_FragColor.xyz=reflectColor.xyz;\n\t\t\t\t\t\tgl_FragColor.a=op;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t`\n\n};\n\n/**\n * SSR Depth shader.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst SSRDepthShader = {\n\n\tname: 'SSRDepthShader',\n\n\tdefines: {\n\t\t'PERSPECTIVE_CAMERA': 1\n\t},\n\n\tuniforms: {\n\n\t\t'tDepth': { value: null },\n\t\t'cameraNear': { value: null },\n\t\t'cameraFar': { value: null },\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}\n\n\t`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDepth;\n\n\t\tuniform float cameraNear;\n\t\tuniform float cameraFar;\n\n\t\tvarying vec2 vUv;\n\n\t\t#include <packing>\n\n\t\tfloat getLinearDepth( const in vec2 uv ) {\n\n\t\t\t#if PERSPECTIVE_CAMERA == 1\n\n\t\t\t\tfloat fragCoordZ = texture2D( tDepth, uv ).x;\n\t\t\t\tfloat viewZ = perspectiveDepthToViewZ( fragCoordZ, cameraNear, cameraFar );\n\t\t\t\treturn viewZToOrthographicDepth( viewZ, cameraNear, cameraFar );\n\n\t\t\t#else\n\n\t\t\t\treturn texture2D( tDepth, uv ).x;\n\n\t\t\t#endif\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tfloat depth = getLinearDepth( vUv );\n\t\t\tfloat d = 1.0 - depth;\n\t\t\t// d=(d-.999)*1000.;\n\t\t\tgl_FragColor = vec4( vec3( d ), 1.0 );\n\n\t\t}\n\n\t`\n\n};\n\n/**\n * SSR Blur shader.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst SSRBlurShader = {\n\n\tname: 'SSRBlurShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'resolution': { value: new Vector2() },\n\t\t'opacity': { value: .5 },\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}\n\n\t`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform vec2 resolution;\n\t\tvarying vec2 vUv;\n\t\tvoid main() {\n\t\t\t//reverse engineering from PhotoShop blur filter, then change coefficient\n\n\t\t\tvec2 texelSize = ( 1.0 / resolution );\n\n\t\t\tvec4 c=texture2D(tDiffuse,vUv);\n\n\t\t\tvec2 offset;\n\n\t\t\toffset=(vec2(-1,0))*texelSize;\n\t\t\tvec4 cl=texture2D(tDiffuse,vUv+offset);\n\n\t\t\toffset=(vec2(1,0))*texelSize;\n\t\t\tvec4 cr=texture2D(tDiffuse,vUv+offset);\n\n\t\t\toffset=(vec2(0,-1))*texelSize;\n\t\t\tvec4 cb=texture2D(tDiffuse,vUv+offset);\n\n\t\t\toffset=(vec2(0,1))*texelSize;\n\t\t\tvec4 ct=texture2D(tDiffuse,vUv+offset);\n\n\t\t\t// float coeCenter=.5;\n\t\t\t// float coeSide=.125;\n\t\t\tfloat coeCenter=.2;\n\t\t\tfloat coeSide=.2;\n\t\t\tfloat a=c.a*coeCenter+cl.a*coeSide+cr.a*coeSide+cb.a*coeSide+ct.a*coeSide;\n\t\t\tvec3 rgb=(c.rgb*c.a*coeCenter+cl.rgb*cl.a*coeSide+cr.rgb*cr.a*coeSide+cb.rgb*cb.a*coeSide+ct.rgb*ct.a*coeSide)/a;\n\t\t\tgl_FragColor=vec4(rgb,a);\n\n\t\t}\n\t`\n\n\n};\n\nexport { SSRShader, SSRDepthShader, SSRBlurShader };\n", "import {\n\tAddEquation,\n\tColor,\n\tNormalBlending,\n\tDepthTexture,\n\tSrcAlphaFactor,\n\tOneMinusSrcAlphaFactor,\n\tMeshNormalMaterial,\n\tMeshBasicMaterial,\n\tNearestFilter,\n\tNoBlending,\n\tShaderMaterial,\n\tUniformsUtils,\n\tUnsignedShortType,\n\tWebGLRenderTarget,\n\tHalfFloatType,\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\nimport { SSRBlurShader, SSRDepthShader, SSRShader } from '../shaders/SSRShader.js';\nimport { CopyShader } from '../shaders/CopyShader.js';\n\n/**\n * A pass for a basic SSR effect.\n *\n * ```js\n * const ssrPass = new SSRPass( {\n * \trenderer,\n * \tscene,\n * \tcamera,\n * \twidth: innerWidth,\n * \theight: innerHeight\n * } );\n * composer.addPass( ssrPass );\n * ```\n *\n * @augments Pass\n * @three_import import { SSRPass } from 'three/addons/postprocessing/SSRPass.js';\n */\nclass SSRPass extends Pass {\n\n\t/**\n\t * Constructs a new SSR pass.\n\t *\n\t * @param {SSRPass~Options} options - The pass options.\n\t */\n\tconstructor( { renderer, scene, camera, width = 512, height = 512, selects = null, bouncing = false, groundReflector = null } ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The width of the effect.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 512\n\t\t */\n\t\tthis.width = width;\n\n\t\t/**\n\t\t * The height of the effect.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 512\n\t\t */\n\t\tthis.height = height;\n\n\t\t/**\n\t\t * Overwritten to perform a clear operation by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.clear = true;\n\n\t\t/**\n\t\t * The renderer.\n\t\t *\n\t\t * @type {WebGLRenderer}\n\t\t */\n\t\tthis.renderer = renderer;\n\n\t\t/**\n\t\t * The scene to render.\n\t\t *\n\t\t * @type {Scene}\n\t\t */\n\t\tthis.scene = scene;\n\n\t\t/**\n\t\t * The camera.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = camera;\n\n\t\t/**\n\t\t * The ground reflector.\n\t\t *\n\t\t * @type {?ReflectorForSSRPass}\n\t\t * @default 0\n\t\t */\n\t\tthis.groundReflector = groundReflector;\n\n\t\t/**\n\t\t * The opacity.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.5\n\t\t */\n\t\tthis.opacity = SSRShader.uniforms.opacity.value;\n\n\t\t/**\n\t\t * The output configuration.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.output = 0;\n\n\t\t/**\n\t\t * Controls how far a fragment can reflect.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 180\n\t\t */\n\t\tthis.maxDistance = SSRShader.uniforms.maxDistance.value;\n\n\t\t/**\n\t\t * Controls the cutoff between what counts as a\n\t\t * possible reflection hit and what does not.\n\t\t *\n\t\t * @type {number}\n\t\t * @default .018\n\t\t */\n\t\tthis.thickness = SSRShader.uniforms.thickness.value;\n\n\t\tthis.tempColor = new Color();\n\n\t\tthis._selects = selects;\n\n\t\tthis._resolutionScale = 1;\n\n\t\t/**\n\t\t * Whether the pass is selective or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.selective = Array.isArray( this._selects );\n\n\t\t/**\n\t\t * Which 3D objects should be affected by SSR. If not set, the entire scene is affected.\n\t\t *\n\t\t * @name SSRPass#selects\n\t\t * @type {?Array<Object3D>}\n\t\t * @default null\n\t\t */\n\t\tObject.defineProperty( this, 'selects', {\n\t\t\tget() {\n\n\t\t\t\treturn this._selects;\n\n\t\t\t},\n\t\t\tset( val ) {\n\n\t\t\t\tif ( this._selects === val ) return;\n\t\t\t\tthis._selects = val;\n\t\t\t\tif ( Array.isArray( val ) ) {\n\n\t\t\t\t\tthis.selective = true;\n\t\t\t\t\tthis.ssrMaterial.defines.SELECTIVE = true;\n\t\t\t\t\tthis.ssrMaterial.needsUpdate = true;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.selective = false;\n\t\t\t\t\tthis.ssrMaterial.defines.SELECTIVE = false;\n\t\t\t\t\tthis.ssrMaterial.needsUpdate = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t} );\n\n\t\tthis._bouncing = bouncing;\n\n\t\t/**\n\t\t * Whether bouncing is enabled or not.\n\t\t *\n\t\t * @name SSRPass#bouncing\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tObject.defineProperty( this, 'bouncing', {\n\t\t\tget() {\n\n\t\t\t\treturn this._bouncing;\n\n\t\t\t},\n\t\t\tset( val ) {\n\n\t\t\t\tif ( this._bouncing === val ) return;\n\t\t\t\tthis._bouncing = val;\n\t\t\t\tif ( val ) {\n\n\t\t\t\t\tthis.ssrMaterial.uniforms[ 'tDiffuse' ].value = this.prevRenderTarget.texture;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.ssrMaterial.uniforms[ 'tDiffuse' ].value = this.beautyRenderTarget.texture;\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t} );\n\n\t\t/**\n\t\t * Whether to blur reflections or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.blur = true;\n\n\t\tthis._distanceAttenuation = SSRShader.defines.DISTANCE_ATTENUATION;\n\n\t\t/**\n\t\t * Whether to use distance attenuation or not.\n\t\t *\n\t\t * @name SSRPass#distanceAttenuation\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tObject.defineProperty( this, 'distanceAttenuation', {\n\t\t\tget() {\n\n\t\t\t\treturn this._distanceAttenuation;\n\n\t\t\t},\n\t\t\tset( val ) {\n\n\t\t\t\tif ( this._distanceAttenuation === val ) return;\n\t\t\t\tthis._distanceAttenuation = val;\n\t\t\t\tthis.ssrMaterial.defines.DISTANCE_ATTENUATION = val;\n\t\t\t\tthis.ssrMaterial.needsUpdate = true;\n\n\t\t\t}\n\t\t} );\n\n\n\t\tthis._fresnel = SSRShader.defines.FRESNEL;\n\n\t\t/**\n\t\t * Whether to use fresnel or not.\n\t\t *\n\t\t * @name SSRPass#fresnel\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tObject.defineProperty( this, 'fresnel', {\n\t\t\tget() {\n\n\t\t\t\treturn this._fresnel;\n\n\t\t\t},\n\t\t\tset( val ) {\n\n\t\t\t\tif ( this._fresnel === val ) return;\n\t\t\t\tthis._fresnel = val;\n\t\t\t\tthis.ssrMaterial.defines.FRESNEL = val;\n\t\t\t\tthis.ssrMaterial.needsUpdate = true;\n\n\t\t\t}\n\t\t} );\n\n\t\tthis._infiniteThick = SSRShader.defines.INFINITE_THICK;\n\n\t\t/**\n\t\t * Whether to use infinite thickness or not.\n\t\t *\n\t\t * @name SSRPass#infiniteThick\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tObject.defineProperty( this, 'infiniteThick', {\n\t\t\tget() {\n\n\t\t\t\treturn this._infiniteThick;\n\n\t\t\t},\n\t\t\tset( val ) {\n\n\t\t\t\tif ( this._infiniteThick === val ) return;\n\t\t\t\tthis._infiniteThick = val;\n\t\t\t\tthis.ssrMaterial.defines.INFINITE_THICK = val;\n\t\t\t\tthis.ssrMaterial.needsUpdate = true;\n\n\t\t\t}\n\t\t} );\n\n\t\t// beauty render target with depth buffer\n\n\t\tconst depthTexture = new DepthTexture();\n\t\tdepthTexture.type = UnsignedShortType;\n\t\tdepthTexture.minFilter = NearestFilter;\n\t\tdepthTexture.magFilter = NearestFilter;\n\n\t\tthis.beautyRenderTarget = new WebGLRenderTarget( this.width, this.height, {\n\t\t\tminFilter: NearestFilter,\n\t\t\tmagFilter: NearestFilter,\n\t\t\ttype: HalfFloatType,\n\t\t\tdepthTexture: depthTexture,\n\t\t\tdepthBuffer: true\n\t\t} );\n\n\t\t//for bouncing\n\t\tthis.prevRenderTarget = new WebGLRenderTarget( this.width, this.height, {\n\t\t\tminFilter: NearestFilter,\n\t\t\tmagFilter: NearestFilter\n\t\t} );\n\n\t\t// normal render target\n\n\t\tthis.normalRenderTarget = new WebGLRenderTarget( this.width, this.height, {\n\t\t\tminFilter: NearestFilter,\n\t\t\tmagFilter: NearestFilter,\n\t\t\ttype: HalfFloatType,\n\t\t} );\n\n\t\t// metalness render target\n\n\t\tthis.metalnessRenderTarget = new WebGLRenderTarget( this.width, this.height, {\n\t\t\tminFilter: NearestFilter,\n\t\t\tmagFilter: NearestFilter,\n\t\t\ttype: HalfFloatType,\n\t\t} );\n\n\n\n\t\t// ssr render target\n\n\t\tthis.ssrRenderTarget = new WebGLRenderTarget( this.width, this.height, {\n\t\t\tminFilter: NearestFilter,\n\t\t\tmagFilter: NearestFilter\n\t\t} );\n\n\t\tthis.blurRenderTarget = this.ssrRenderTarget.clone();\n\t\tthis.blurRenderTarget2 = this.ssrRenderTarget.clone();\n\t\t// this.blurRenderTarget3 = this.ssrRenderTarget.clone();\n\n\t\t// ssr material\n\n\t\tthis.ssrMaterial = new ShaderMaterial( {\n\t\t\tdefines: Object.assign( {}, SSRShader.defines, {\n\t\t\t\tMAX_STEP: Math.sqrt( this.width * this.width + this.height * this.height )\n\t\t\t} ),\n\t\t\tuniforms: UniformsUtils.clone( SSRShader.uniforms ),\n\t\t\tvertexShader: SSRShader.vertexShader,\n\t\t\tfragmentShader: SSRShader.fragmentShader,\n\t\t\tblending: NoBlending\n\t\t} );\n\n\t\tthis.ssrMaterial.uniforms[ 'tDiffuse' ].value = this.beautyRenderTarget.texture;\n\t\tthis.ssrMaterial.uniforms[ 'tNormal' ].value = this.normalRenderTarget.texture;\n\t\tthis.ssrMaterial.defines.SELECTIVE = this.selective;\n\t\tthis.ssrMaterial.needsUpdate = true;\n\t\tthis.ssrMaterial.uniforms[ 'tMetalness' ].value = this.metalnessRenderTarget.texture;\n\t\tthis.ssrMaterial.uniforms[ 'tDepth' ].value = this.beautyRenderTarget.depthTexture;\n\t\tthis.ssrMaterial.uniforms[ 'cameraNear' ].value = this.camera.near;\n\t\tthis.ssrMaterial.uniforms[ 'cameraFar' ].value = this.camera.far;\n\t\tthis.ssrMaterial.uniforms[ 'thickness' ].value = this.thickness;\n\t\tthis.ssrMaterial.uniforms[ 'resolution' ].value.set( this.width, this.height );\n\t\tthis.ssrMaterial.uniforms[ 'cameraProjectionMatrix' ].value.copy( this.camera.projectionMatrix );\n\t\tthis.ssrMaterial.uniforms[ 'cameraInverseProjectionMatrix' ].value.copy( this.camera.projectionMatrixInverse );\n\n\t\t// normal material\n\n\t\tthis.normalMaterial = new MeshNormalMaterial();\n\t\tthis.normalMaterial.blending = NoBlending;\n\n\t\t// metalnessOn material\n\n\t\tthis.metalnessOnMaterial = new MeshBasicMaterial( {\n\t\t\tcolor: 'white'\n\t\t} );\n\n\t\t// metalnessOff material\n\n\t\tthis.metalnessOffMaterial = new MeshBasicMaterial( {\n\t\t\tcolor: 'black'\n\t\t} );\n\n\t\t// blur material\n\n\t\tthis.blurMaterial = new ShaderMaterial( {\n\t\t\tdefines: Object.assign( {}, SSRBlurShader.defines ),\n\t\t\tuniforms: UniformsUtils.clone( SSRBlurShader.uniforms ),\n\t\t\tvertexShader: SSRBlurShader.vertexShader,\n\t\t\tfragmentShader: SSRBlurShader.fragmentShader\n\t\t} );\n\t\tthis.blurMaterial.uniforms[ 'tDiffuse' ].value = this.ssrRenderTarget.texture;\n\t\tthis.blurMaterial.uniforms[ 'resolution' ].value.set( this.width, this.height );\n\n\t\t// blur material 2\n\n\t\tthis.blurMaterial2 = new ShaderMaterial( {\n\t\t\tdefines: Object.assign( {}, SSRBlurShader.defines ),\n\t\t\tuniforms: UniformsUtils.clone( SSRBlurShader.uniforms ),\n\t\t\tvertexShader: SSRBlurShader.vertexShader,\n\t\t\tfragmentShader: SSRBlurShader.fragmentShader\n\t\t} );\n\t\tthis.blurMaterial2.uniforms[ 'tDiffuse' ].value = this.blurRenderTarget.texture;\n\t\tthis.blurMaterial2.uniforms[ 'resolution' ].value.set( this.width, this.height );\n\n\t\t// // blur material 3\n\n\t\t// this.blurMaterial3 = new ShaderMaterial({\n\t\t//   defines: Object.assign({}, SSRBlurShader.defines),\n\t\t//   uniforms: UniformsUtils.clone(SSRBlurShader.uniforms),\n\t\t//   vertexShader: SSRBlurShader.vertexShader,\n\t\t//   fragmentShader: SSRBlurShader.fragmentShader\n\t\t// });\n\t\t// this.blurMaterial3.uniforms['tDiffuse'].value = this.blurRenderTarget2.texture;\n\t\t// this.blurMaterial3.uniforms['resolution'].value.set(this.width, this.height);\n\n\t\t// material for rendering the depth\n\n\t\tthis.depthRenderMaterial = new ShaderMaterial( {\n\t\t\tdefines: Object.assign( {}, SSRDepthShader.defines ),\n\t\t\tuniforms: UniformsUtils.clone( SSRDepthShader.uniforms ),\n\t\t\tvertexShader: SSRDepthShader.vertexShader,\n\t\t\tfragmentShader: SSRDepthShader.fragmentShader,\n\t\t\tblending: NoBlending\n\t\t} );\n\t\tthis.depthRenderMaterial.uniforms[ 'tDepth' ].value = this.beautyRenderTarget.depthTexture;\n\t\tthis.depthRenderMaterial.uniforms[ 'cameraNear' ].value = this.camera.near;\n\t\tthis.depthRenderMaterial.uniforms[ 'cameraFar' ].value = this.camera.far;\n\n\t\t// material for rendering the content of a render target\n\n\t\tthis.copyMaterial = new ShaderMaterial( {\n\t\t\tuniforms: UniformsUtils.clone( CopyShader.uniforms ),\n\t\t\tvertexShader: CopyShader.vertexShader,\n\t\t\tfragmentShader: CopyShader.fragmentShader,\n\t\t\ttransparent: true,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\tblendSrc: SrcAlphaFactor,\n\t\t\tblendDst: OneMinusSrcAlphaFactor,\n\t\t\tblendEquation: AddEquation,\n\t\t\tblendSrcAlpha: SrcAlphaFactor,\n\t\t\tblendDstAlpha: OneMinusSrcAlphaFactor,\n\t\t\tblendEquationAlpha: AddEquation,\n\t\t\t// premultipliedAlpha:true,\n\t\t} );\n\n\t\tthis.fsQuad = new FullScreenQuad( null );\n\n\t\tthis.originalClearColor = new Color();\n\n\t}\n\n\n\t/**\n\t * The resolution scale. Valid values are in the range\n\t * `[0,1]`. `1` means best quality but also results in\n\t * more computational overhead. Setting to `0.5` means\n\t * the effect is computed in half-resolution.\n\t *\n\t * @type {number}\n\t * @default 1\n\t */\n\tget resolutionScale() {\n\n\t\treturn this._resolutionScale;\n\n\t}\n\n\tset resolutionScale( value ) {\n\n\t\tthis._resolutionScale = value;\n\t\tthis.setSize( this.width, this.height ); // force a resize when resolution scaling changes\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the pass is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\t// dispose render targets\n\n\t\tthis.beautyRenderTarget.dispose();\n\t\tthis.prevRenderTarget.dispose();\n\t\tthis.normalRenderTarget.dispose();\n\t\tthis.metalnessRenderTarget.dispose();\n\t\tthis.ssrRenderTarget.dispose();\n\t\tthis.blurRenderTarget.dispose();\n\t\tthis.blurRenderTarget2.dispose();\n\t\t// this.blurRenderTarget3.dispose();\n\n\t\t// dispose materials\n\n\t\tthis.normalMaterial.dispose();\n\t\tthis.metalnessOnMaterial.dispose();\n\t\tthis.metalnessOffMaterial.dispose();\n\t\tthis.blurMaterial.dispose();\n\t\tthis.blurMaterial2.dispose();\n\t\tthis.copyMaterial.dispose();\n\t\tthis.depthRenderMaterial.dispose();\n\n\t\t// dispose full screen quad\n\n\t\tthis.fsQuad.dispose();\n\n\t}\n\n\t/**\n\t * Performs the SSR pass.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( renderer, writeBuffer /*, readBuffer, deltaTime, maskActive */ ) {\n\n\t\t// render beauty and depth\n\n\t\trenderer.setRenderTarget( this.beautyRenderTarget );\n\t\trenderer.clear();\n\t\tif ( this.groundReflector ) {\n\n\t\t\tthis.groundReflector.visible = false;\n\t\t\tthis.groundReflector.doRender( this.renderer, this.scene, this.camera );\n\t\t\tthis.groundReflector.visible = true;\n\n\t\t}\n\n\t\trenderer.render( this.scene, this.camera );\n\t\tif ( this.groundReflector ) this.groundReflector.visible = false;\n\n\t\t// render normals\n\n\t\tthis._renderOverride( renderer, this.normalMaterial, this.normalRenderTarget, 0, 0 );\n\n\t\t// render metalnesses\n\n\t\tif ( this.selective ) {\n\n\t\t\tthis._renderMetalness( renderer, this.metalnessOnMaterial, this.metalnessRenderTarget, 0, 0 );\n\n\t\t}\n\n\t\t// render SSR\n\n\t\tthis.ssrMaterial.uniforms[ 'opacity' ].value = this.opacity;\n\t\tthis.ssrMaterial.uniforms[ 'maxDistance' ].value = this.maxDistance;\n\t\tthis.ssrMaterial.uniforms[ 'thickness' ].value = this.thickness;\n\t\tthis._renderPass( renderer, this.ssrMaterial, this.ssrRenderTarget );\n\n\n\t\t// render blur\n\n\t\tif ( this.blur ) {\n\n\t\t\tthis._renderPass( renderer, this.blurMaterial, this.blurRenderTarget );\n\t\t\tthis._renderPass( renderer, this.blurMaterial2, this.blurRenderTarget2 );\n\t\t\t// this._renderPass(renderer, this.blurMaterial3, this.blurRenderTarget3);\n\n\t\t}\n\n\t\t// output result to screen\n\n\t\tswitch ( this.output ) {\n\n\t\t\tcase SSRPass.OUTPUT.Default:\n\n\t\t\t\tif ( this.bouncing ) {\n\n\t\t\t\t\tthis.copyMaterial.uniforms[ 'tDiffuse' ].value = this.beautyRenderTarget.texture;\n\t\t\t\t\tthis.copyMaterial.blending = NoBlending;\n\t\t\t\t\tthis._renderPass( renderer, this.copyMaterial, this.prevRenderTarget );\n\n\t\t\t\t\tif ( this.blur )\n\t\t\t\t\t\tthis.copyMaterial.uniforms[ 'tDiffuse' ].value = this.blurRenderTarget2.texture;\n\t\t\t\t\telse\n\t\t\t\t\t\tthis.copyMaterial.uniforms[ 'tDiffuse' ].value = this.ssrRenderTarget.texture;\n\t\t\t\t\tthis.copyMaterial.blending = NormalBlending;\n\t\t\t\t\tthis._renderPass( renderer, this.copyMaterial, this.prevRenderTarget );\n\n\t\t\t\t\tthis.copyMaterial.uniforms[ 'tDiffuse' ].value = this.prevRenderTarget.texture;\n\t\t\t\t\tthis.copyMaterial.blending = NoBlending;\n\t\t\t\t\tthis._renderPass( renderer, this.copyMaterial, this.renderToScreen ? null : writeBuffer );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis.copyMaterial.uniforms[ 'tDiffuse' ].value = this.beautyRenderTarget.texture;\n\t\t\t\t\tthis.copyMaterial.blending = NoBlending;\n\t\t\t\t\tthis._renderPass( renderer, this.copyMaterial, this.renderToScreen ? null : writeBuffer );\n\n\t\t\t\t\tif ( this.blur )\n\t\t\t\t\t\tthis.copyMaterial.uniforms[ 'tDiffuse' ].value = this.blurRenderTarget2.texture;\n\t\t\t\t\telse\n\t\t\t\t\t\tthis.copyMaterial.uniforms[ 'tDiffuse' ].value = this.ssrRenderTarget.texture;\n\t\t\t\t\tthis.copyMaterial.blending = NormalBlending;\n\t\t\t\t\tthis._renderPass( renderer, this.copyMaterial, this.renderToScreen ? null : writeBuffer );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\tcase SSRPass.OUTPUT.SSR:\n\n\t\t\t\tif ( this.blur )\n\t\t\t\t\tthis.copyMaterial.uniforms[ 'tDiffuse' ].value = this.blurRenderTarget2.texture;\n\t\t\t\telse\n\t\t\t\t\tthis.copyMaterial.uniforms[ 'tDiffuse' ].value = this.ssrRenderTarget.texture;\n\t\t\t\tthis.copyMaterial.blending = NoBlending;\n\t\t\t\tthis._renderPass( renderer, this.copyMaterial, this.renderToScreen ? null : writeBuffer );\n\n\t\t\t\tif ( this.bouncing ) {\n\n\t\t\t\t\tif ( this.blur )\n\t\t\t\t\t\tthis.copyMaterial.uniforms[ 'tDiffuse' ].value = this.blurRenderTarget2.texture;\n\t\t\t\t\telse\n\t\t\t\t\t\tthis.copyMaterial.uniforms[ 'tDiffuse' ].value = this.beautyRenderTarget.texture;\n\t\t\t\t\tthis.copyMaterial.blending = NoBlending;\n\t\t\t\t\tthis._renderPass( renderer, this.copyMaterial, this.prevRenderTarget );\n\n\t\t\t\t\tthis.copyMaterial.uniforms[ 'tDiffuse' ].value = this.ssrRenderTarget.texture;\n\t\t\t\t\tthis.copyMaterial.blending = NormalBlending;\n\t\t\t\t\tthis._renderPass( renderer, this.copyMaterial, this.prevRenderTarget );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase SSRPass.OUTPUT.Beauty:\n\n\t\t\t\tthis.copyMaterial.uniforms[ 'tDiffuse' ].value = this.beautyRenderTarget.texture;\n\t\t\t\tthis.copyMaterial.blending = NoBlending;\n\t\t\t\tthis._renderPass( renderer, this.copyMaterial, this.renderToScreen ? null : writeBuffer );\n\n\t\t\t\tbreak;\n\n\t\t\tcase SSRPass.OUTPUT.Depth:\n\n\t\t\t\tthis._renderPass( renderer, this.depthRenderMaterial, this.renderToScreen ? null : writeBuffer );\n\n\t\t\t\tbreak;\n\n\t\t\tcase SSRPass.OUTPUT.Normal:\n\n\t\t\t\tthis.copyMaterial.uniforms[ 'tDiffuse' ].value = this.normalRenderTarget.texture;\n\t\t\t\tthis.copyMaterial.blending = NoBlending;\n\t\t\t\tthis._renderPass( renderer, this.copyMaterial, this.renderToScreen ? null : writeBuffer );\n\n\t\t\t\tbreak;\n\n\t\t\tcase SSRPass.OUTPUT.Metalness:\n\n\t\t\t\tthis.copyMaterial.uniforms[ 'tDiffuse' ].value = this.metalnessRenderTarget.texture;\n\t\t\t\tthis.copyMaterial.blending = NoBlending;\n\t\t\t\tthis._renderPass( renderer, this.copyMaterial, this.renderToScreen ? null : writeBuffer );\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tconsole.warn( 'THREE.SSRPass: Unknown output type.' );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the size of the pass.\n\t *\n\t * @param {number} width - The width to set.\n\t * @param {number} height - The height to set.\n\t */\n\tsetSize( width, height ) {\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t\tconst effectiveWidth = Math.round( this.resolutionScale * width );\n\t\tconst effectiveHeight = Math.round( this.resolutionScale * height );\n\n\t\tthis.ssrMaterial.defines.MAX_STEP = Math.sqrt( effectiveWidth * effectiveWidth + effectiveHeight * effectiveHeight );\n\t\tthis.ssrMaterial.needsUpdate = true;\n\n\t\tthis.beautyRenderTarget.setSize( width, height );\n\t\tthis.normalRenderTarget.setSize( width, height );\n\t\tthis.metalnessRenderTarget.setSize( width, height );\n\t\tthis.ssrRenderTarget.setSize( effectiveWidth, effectiveHeight );\n\t\tthis.prevRenderTarget.setSize( effectiveWidth, effectiveHeight );\n\t\tthis.blurRenderTarget.setSize( effectiveWidth, effectiveHeight );\n\t\tthis.blurRenderTarget2.setSize( effectiveWidth, effectiveHeight );\n\t\t// this.blurRenderTarget3.setSize(width, height);\n\n\t\tthis.ssrMaterial.uniforms[ 'resolution' ].value.set( effectiveWidth, effectiveHeight );\n\t\tthis.ssrMaterial.uniforms[ 'cameraProjectionMatrix' ].value.copy( this.camera.projectionMatrix );\n\t\tthis.ssrMaterial.uniforms[ 'cameraInverseProjectionMatrix' ].value.copy( this.camera.projectionMatrixInverse );\n\n\t\tthis.blurMaterial.uniforms[ 'resolution' ].value.set( effectiveWidth, effectiveHeight );\n\t\tthis.blurMaterial2.uniforms[ 'resolution' ].value.set( effectiveWidth, effectiveHeight );\n\n\t}\n\n\t// internals\n\n\t_renderPass( renderer, passMaterial, renderTarget, clearColor, clearAlpha ) {\n\n\t\t// save original state\n\t\tthis.originalClearColor.copy( renderer.getClearColor( this.tempColor ) );\n\t\tconst originalClearAlpha = renderer.getClearAlpha( this.tempColor );\n\t\tconst originalAutoClear = renderer.autoClear;\n\n\t\trenderer.setRenderTarget( renderTarget );\n\n\t\t// setup pass state\n\t\trenderer.autoClear = false;\n\t\tif ( ( clearColor !== undefined ) && ( clearColor !== null ) ) {\n\n\t\t\trenderer.setClearColor( clearColor );\n\t\t\trenderer.setClearAlpha( clearAlpha || 0.0 );\n\t\t\trenderer.clear();\n\n\t\t}\n\n\t\tthis.fsQuad.material = passMaterial;\n\t\tthis.fsQuad.render( renderer );\n\n\t\t// restore original state\n\t\trenderer.autoClear = originalAutoClear;\n\t\trenderer.setClearColor( this.originalClearColor );\n\t\trenderer.setClearAlpha( originalClearAlpha );\n\n\t}\n\n\t_renderOverride( renderer, overrideMaterial, renderTarget, clearColor, clearAlpha ) {\n\n\t\tthis.originalClearColor.copy( renderer.getClearColor( this.tempColor ) );\n\t\tconst originalClearAlpha = renderer.getClearAlpha( this.tempColor );\n\t\tconst originalAutoClear = renderer.autoClear;\n\n\t\trenderer.setRenderTarget( renderTarget );\n\t\trenderer.autoClear = false;\n\n\t\tclearColor = overrideMaterial.clearColor || clearColor;\n\t\tclearAlpha = overrideMaterial.clearAlpha || clearAlpha;\n\n\t\tif ( ( clearColor !== undefined ) && ( clearColor !== null ) ) {\n\n\t\t\trenderer.setClearColor( clearColor );\n\t\t\trenderer.setClearAlpha( clearAlpha || 0.0 );\n\t\t\trenderer.clear();\n\n\t\t}\n\n\t\tthis.scene.overrideMaterial = overrideMaterial;\n\t\trenderer.render( this.scene, this.camera );\n\t\tthis.scene.overrideMaterial = null;\n\n\t\t// restore original state\n\n\t\trenderer.autoClear = originalAutoClear;\n\t\trenderer.setClearColor( this.originalClearColor );\n\t\trenderer.setClearAlpha( originalClearAlpha );\n\n\t}\n\n\t_renderMetalness( renderer, overrideMaterial, renderTarget, clearColor, clearAlpha ) {\n\n\t\tthis.originalClearColor.copy( renderer.getClearColor( this.tempColor ) );\n\t\tconst originalClearAlpha = renderer.getClearAlpha( this.tempColor );\n\t\tconst originalAutoClear = renderer.autoClear;\n\t\tconst originalBackground = this.scene.background;\n\t\tconst originalFog = this.scene.fog;\n\n\t\trenderer.setRenderTarget( renderTarget );\n\t\trenderer.autoClear = false;\n\t\tthis.scene.background = null;\n\t\tthis.scene.fog = null;\n\n\t\tclearColor = overrideMaterial.clearColor || clearColor;\n\t\tclearAlpha = overrideMaterial.clearAlpha || clearAlpha;\n\n\t\tif ( ( clearColor !== undefined ) && ( clearColor !== null ) ) {\n\n\t\t\trenderer.setClearColor( clearColor );\n\t\t\trenderer.setClearAlpha( clearAlpha || 0.0 );\n\t\t\trenderer.clear();\n\n\t\t}\n\n\t\tthis.scene.traverseVisible( child => {\n\n\t\t\tchild._SSRPassBackupMaterial = child.material;\n\t\t\tif ( this._selects.includes( child ) ) {\n\n\t\t\t\tchild.material = this.metalnessOnMaterial;\n\n\t\t\t} else {\n\n\t\t\t\tchild.material = this.metalnessOffMaterial;\n\n\t\t\t}\n\n\t\t} );\n\t\trenderer.render( this.scene, this.camera );\n\t\tthis.scene.traverseVisible( child => {\n\n\t\t\tchild.material = child._SSRPassBackupMaterial;\n\n\t\t} );\n\n\t\t// restore original state\n\n\t\trenderer.autoClear = originalAutoClear;\n\t\trenderer.setClearColor( this.originalClearColor );\n\t\trenderer.setClearAlpha( originalClearAlpha );\n\t\tthis.scene.background = originalBackground;\n\t\tthis.scene.fog = originalFog;\n\n\t}\n\n}\n\n/**\n * Constructor options of `SSRPass`.\n *\n * @typedef {Object} SSRPass~Options\n * @property {WebGLRenderer} renderer - The renderer.\n * @property {Scene} scene - The scene to render.\n * @property {Camera} camera - The camera.\n * @property {number} [width=512] - The width of the effect.\n * @property {number} [height=512] - The width of the effect.\n * @property {?Array<Object3D>} [selects=null] - Which 3D objects should be affected by SSR. If not set, the entire scene is affected.\n * @property {boolean} [bouncing=false] - Whether bouncing is enabled or not.\n * @property {?ReflectorForSSRPass} [groundReflector=null] - A ground reflector.\n **/\n\nSSRPass.OUTPUT = {\n\t'Default': 0,\n\t'SSR': 1,\n\t'Beauty': 3,\n\t'Depth': 4,\n\t'Normal': 5,\n\t'Metalness': 7,\n};\n\nexport { SSRPass };\n", "import {\n\tHalfFloatType,\n\tNoBlending,\n\tShaderMaterial,\n\tUniformsUtils,\n\tWebGLRenderTarget\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\nimport { CopyShader } from '../shaders/CopyShader.js';\n\n/**\n * A pass that saves the contents of the current read buffer in a render target.\n *\n * ```js\n * const savePass = new SavePass( customRenderTarget );\n * composer.addPass( savePass );\n * ```\n *\n * @augments Pass\n * @three_import import { SavePass } from 'three/addons/postprocessing/SavePass.js';\n */\nclass SavePass extends Pass {\n\n\t/**\n\t * Constructs a new save pass.\n\t *\n\t * @param {WebGLRenderTarget} [renderTarget] - The render target for saving the read buffer.\n\t * If not provided, the pass automatically creates a render target.\n\t */\n\tconstructor( renderTarget ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The pass uniforms.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.uniforms = UniformsUtils.clone( CopyShader.uniforms );\n\n\t\t/**\n\t\t * The pass material.\n\t\t *\n\t\t * @type {ShaderMaterial}\n\t\t */\n\t\tthis.material = new ShaderMaterial( {\n\n\t\t\tuniforms: this.uniforms,\n\t\t\tvertexShader: CopyShader.vertexShader,\n\t\t\tfragmentShader: CopyShader.fragmentShader,\n\t\t\tblending: NoBlending\n\n\t\t} );\n\n\t\t/**\n\t\t * The render target which is used to save the read buffer.\n\t\t *\n\t\t * @type {WebGLRenderTarget}\n\t\t */\n\t\tthis.renderTarget = renderTarget;\n\n\t\tif ( this.renderTarget === undefined ) {\n\n\t\t\tthis.renderTarget = new WebGLRenderTarget( 1, 1, { type: HalfFloatType } ); // will be resized later\n\t\t\tthis.renderTarget.texture.name = 'SavePass.rt';\n\n\t\t}\n\n\t\t/**\n\t\t * Overwritten to disable the swap.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsSwap = false;\n\n\t\t// internals\n\n\t\tthis._fsQuad = new FullScreenQuad( this.material );\n\n\t}\n\n\t/**\n\t * Performs the save pass.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( renderer, writeBuffer, readBuffer/*, deltaTime, maskActive */ ) {\n\n\t\tthis.uniforms[ 'tDiffuse' ].value = readBuffer.texture;\n\n\t\trenderer.setRenderTarget( this.renderTarget );\n\t\tif ( this.clear ) renderer.clear();\n\t\tthis._fsQuad.render( renderer );\n\n\t}\n\n\t/**\n\t * Sets the size of the pass.\n\t *\n\t * @param {number} width - The width to set.\n\t * @param {number} height - The height to set.\n\t */\n\tsetSize( width, height ) {\n\n\t\tthis.renderTarget.setSize( width, height );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the pass is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.renderTarget.dispose();\n\n\t\tthis.material.dispose();\n\n\t\tthis._fsQuad.dispose();\n\n\t}\n\n}\n\nexport { SavePass };\n", "import {\n\tHalfFloatType,\n\tWebGLRenderTarget\n} from 'three';\nimport { SSAARenderPass } from './SSAARenderPass.js';\n\n/**\n *\n * Temporal Anti-Aliasing Render Pass.\n *\n * When there is no motion in the scene, the TAA render pass accumulates jittered camera\n * samples across frames to create a high quality anti-aliased result.\n *\n * Note: This effect uses no reprojection so it is no TRAA implementation.\n *\n * ```js\n * const taaRenderPass = new TAARenderPass( scene, camera );\n * taaRenderPass.unbiased = false;\n * composer.addPass( taaRenderPass );\n * ```\n *\n * @augments SSAARenderPass\n * @three_import import { TAARenderPass } from 'three/addons/postprocessing/TAARenderPass.js';\n */\nclass TAARenderPass extends SSAARenderPass {\n\n\t/**\n\t * Constructs a new TAA render pass.\n\t *\n\t * @param {Scene} scene - The scene to render.\n\t * @param {Camera} camera - The camera.\n\t * @param {?(number|Color|string)} [clearColor=0x000000] - The clear color of the render pass.\n\t * @param {?number} [clearAlpha=0] - The clear alpha of the render pass.\n\t */\n\tconstructor( scene, camera, clearColor, clearAlpha ) {\n\n\t\tsuper( scene, camera, clearColor, clearAlpha );\n\n\t\t/**\n\t\t * Overwritten and set to 0 by default.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.sampleLevel = 0;\n\n\t\t/**\n\t\t * Whether to accumulate frames or not. This enables\n\t\t * the TAA.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.accumulate = false;\n\n\t\t/**\n\t\t * The accumulation index.\n\t\t *\n\t\t * @type {number}\n\t\t * @default -1\n\t\t */\n\t\tthis.accumulateIndex = - 1;\n\n\t\t// internals\n\n\t\tthis._sampleRenderTarget = null;\n\t\tthis._holdRenderTarget = null;\n\n\t}\n\n\t/**\n\t * Performs the TAA render pass.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( renderer, writeBuffer, readBuffer, deltaTime/*, maskActive*/ ) {\n\n\t\tif ( this.accumulate === false ) {\n\n\t\t\tsuper.render( renderer, writeBuffer, readBuffer, deltaTime );\n\n\t\t\tthis.accumulateIndex = - 1;\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst jitterOffsets = _JitterVectors[ 5 ];\n\n\t\tif ( this._sampleRenderTarget === null ) {\n\n\t\t\tthis._sampleRenderTarget = new WebGLRenderTarget( readBuffer.width, readBuffer.height, { type: HalfFloatType } );\n\t\t\tthis._sampleRenderTarget.texture.name = 'TAARenderPass.sample';\n\n\t\t}\n\n\t\tif ( this._holdRenderTarget === null ) {\n\n\t\t\tthis._holdRenderTarget = new WebGLRenderTarget( readBuffer.width, readBuffer.height, { type: HalfFloatType } );\n\t\t\tthis._holdRenderTarget.texture.name = 'TAARenderPass.hold';\n\n\t\t}\n\n\t\tif ( this.accumulateIndex === - 1 ) {\n\n\t\t\tsuper.render( renderer, this._holdRenderTarget, readBuffer, deltaTime );\n\n\t\t\tthis.accumulateIndex = 0;\n\n\t\t}\n\n\t\tconst autoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\trenderer.getClearColor( this._oldClearColor );\n\t\tconst oldClearAlpha = renderer.getClearAlpha();\n\n\t\tconst sampleWeight = 1.0 / ( jitterOffsets.length );\n\n\t\tif ( this.accumulateIndex >= 0 && this.accumulateIndex < jitterOffsets.length ) {\n\n\t\t\tthis._copyUniforms[ 'opacity' ].value = sampleWeight;\n\t\t\tthis._copyUniforms[ 'tDiffuse' ].value = writeBuffer.texture;\n\n\t\t\t// render the scene multiple times, each slightly jitter offset from the last and accumulate the results.\n\t\t\tconst numSamplesPerFrame = Math.pow( 2, this.sampleLevel );\n\t\t\tfor ( let i = 0; i < numSamplesPerFrame; i ++ ) {\n\n\t\t\t\tconst j = this.accumulateIndex;\n\t\t\t\tconst jitterOffset = jitterOffsets[ j ];\n\n\t\t\t\tif ( this.camera.setViewOffset ) {\n\n\t\t\t\t\tthis.camera.setViewOffset( readBuffer.width, readBuffer.height,\n\t\t\t\t\t\tjitterOffset[ 0 ] * 0.0625, jitterOffset[ 1 ] * 0.0625, // 0.0625 = 1 / 16\n\t\t\t\t\t\treadBuffer.width, readBuffer.height );\n\n\t\t\t\t}\n\n\t\t\t\trenderer.setRenderTarget( writeBuffer );\n\t\t\t\trenderer.setClearColor( this.clearColor, this.clearAlpha );\n\t\t\t\trenderer.clear();\n\t\t\t\trenderer.render( this.scene, this.camera );\n\n\t\t\t\trenderer.setRenderTarget( this._sampleRenderTarget );\n\t\t\t\tif ( this.accumulateIndex === 0 ) {\n\n\t\t\t\t\trenderer.setClearColor( 0x000000, 0.0 );\n\t\t\t\t\trenderer.clear();\n\n\t\t\t\t}\n\n\t\t\t\tthis._fsQuad.render( renderer );\n\n\t\t\t\tthis.accumulateIndex ++;\n\n\t\t\t\tif ( this.accumulateIndex >= jitterOffsets.length ) break;\n\n\t\t\t}\n\n\t\t\tif ( this.camera.clearViewOffset ) this.camera.clearViewOffset();\n\n\t\t}\n\n\t\trenderer.setClearColor( this.clearColor, this.clearAlpha );\n\t\tconst accumulationWeight = this.accumulateIndex * sampleWeight;\n\n\t\tif ( accumulationWeight > 0 ) {\n\n\t\t\tthis._copyUniforms[ 'opacity' ].value = 1.0;\n\t\t\tthis._copyUniforms[ 'tDiffuse' ].value = this._sampleRenderTarget.texture;\n\t\t\trenderer.setRenderTarget( writeBuffer );\n\t\t\trenderer.clear();\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t}\n\n\t\tif ( accumulationWeight < 1.0 ) {\n\n\t\t\tthis._copyUniforms[ 'opacity' ].value = 1.0 - accumulationWeight;\n\t\t\tthis._copyUniforms[ 'tDiffuse' ].value = this._holdRenderTarget.texture;\n\t\t\trenderer.setRenderTarget( writeBuffer );\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t}\n\n\t\trenderer.autoClear = autoClear;\n\t\trenderer.setClearColor( this._oldClearColor, oldClearAlpha );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the pass is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tsuper.dispose();\n\n\t\tif ( this._holdRenderTarget ) this._holdRenderTarget.dispose();\n\n\t}\n\n}\n\nconst _JitterVectors = [\n\t[\n\t\t[ 0, 0 ]\n\t],\n\t[\n\t\t[ 4, 4 ], [ - 4, - 4 ]\n\t],\n\t[\n\t\t[ - 2, - 6 ], [ 6, - 2 ], [ - 6, 2 ], [ 2, 6 ]\n\t],\n\t[\n\t\t[ 1, - 3 ], [ - 1, 3 ], [ 5, 1 ], [ - 3, - 5 ],\n\t\t[ - 5, 5 ], [ - 7, - 1 ], [ 3, 7 ], [ 7, - 7 ]\n\t],\n\t[\n\t\t[ 1, 1 ], [ - 1, - 3 ], [ - 3, 2 ], [ 4, - 1 ],\n\t\t[ - 5, - 2 ], [ 2, 5 ], [ 5, 3 ], [ 3, - 5 ],\n\t\t[ - 2, 6 ], [ 0, - 7 ], [ - 4, - 6 ], [ - 6, 4 ],\n\t\t[ - 8, 0 ], [ 7, - 4 ], [ 6, 7 ], [ - 7, - 8 ]\n\t],\n\t[\n\t\t[ - 4, - 7 ], [ - 7, - 5 ], [ - 3, - 5 ], [ - 5, - 4 ],\n\t\t[ - 1, - 4 ], [ - 2, - 2 ], [ - 6, - 1 ], [ - 4, 0 ],\n\t\t[ - 7, 1 ], [ - 1, 2 ], [ - 6, 3 ], [ - 3, 3 ],\n\t\t[ - 7, 6 ], [ - 3, 6 ], [ - 5, 7 ], [ - 1, 7 ],\n\t\t[ 5, - 7 ], [ 1, - 6 ], [ 6, - 5 ], [ 4, - 4 ],\n\t\t[ 2, - 3 ], [ 7, - 2 ], [ 1, - 1 ], [ 4, - 1 ],\n\t\t[ 2, 1 ], [ 6, 2 ], [ 0, 4 ], [ 4, 4 ],\n\t\t[ 2, 5 ], [ 7, 5 ], [ 5, 6 ], [ 3, 7 ]\n\t]\n];\n\nexport { TAARenderPass };\n", "import {\n\tShaderMaterial,\n\tUniformsUtils\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\nimport { CopyShader } from '../shaders/CopyShader.js';\n\n/**\n * This pass can be used to render a texture over the entire screen.\n *\n * ```js\n * const texture = new THREE.TextureLoader().load( 'textures/2294472375_24a3b8ef46_o.jpg' );\n * texture.colorSpace = THREE.SRGBColorSpace;\n *\n * const texturePass = new TexturePass( texture );\n * composer.addPass( texturePass );\n * ```\n *\n * @augments Pass\n * @three_import import { TexturePass } from 'three/addons/postprocessing/TexturePass.js';\n */\nclass TexturePass extends Pass {\n\n\t/**\n\t * Constructs a new texture pass.\n\t *\n\t * @param {Texture} map - The texture to render.\n\t * @param {number} [opacity=1] - The opacity.\n\t */\n\tconstructor( map, opacity = 1 ) {\n\n\t\tsuper();\n\n\t\tconst shader = CopyShader;\n\n\t\t/**\n\t\t * The texture to render.\n\t\t *\n\t\t * @type {Texture}\n\t\t */\n\t\tthis.map = map;\n\n\t\t/**\n\t\t * The opacity.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.opacity = opacity;\n\n\t\t/**\n\t\t * Overwritten to disable the swap.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsSwap = false;\n\n\t\t/**\n\t\t * The pass uniforms.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.uniforms = UniformsUtils.clone( shader.uniforms );\n\n\t\t/**\n\t\t * The pass material.\n\t\t *\n\t\t * @type {ShaderMaterial}\n\t\t */\n\t\tthis.material = new ShaderMaterial( {\n\n\t\t\tuniforms: this.uniforms,\n\t\t\tvertexShader: shader.vertexShader,\n\t\t\tfragmentShader: shader.fragmentShader,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\tpremultipliedAlpha: true\n\n\t\t} );\n\n\t\t// internals\n\n\t\tthis._fsQuad = new FullScreenQuad( null );\n\n\t}\n\n\t/**\n\t * Performs the texture pass.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( renderer, writeBuffer, readBuffer /*, deltaTime, maskActive */ ) {\n\n\t\tconst oldAutoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tthis._fsQuad.material = this.material;\n\n\t\tthis.uniforms[ 'opacity' ].value = this.opacity;\n\t\tthis.uniforms[ 'tDiffuse' ].value = this.map;\n\t\tthis.material.transparent = ( this.opacity < 1.0 );\n\n\t\trenderer.setRenderTarget( this.renderToScreen ? null : readBuffer );\n\t\tif ( this.clear ) renderer.clear();\n\t\tthis._fsQuad.render( renderer );\n\n\t\trenderer.autoClear = oldAutoClear;\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the pass is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis.material.dispose();\n\t\tthis._fsQuad.dispose();\n\n\t}\n\n}\n\nexport { TexturePass };\n", "import {\n\tColor\n} from 'three';\n\n/**\n * @module LuminosityHighPassShader\n * @three_import import { LuminosityHighPassShader } from 'three/addons/shaders/LuminosityHighPassShader.js';\n */\n\n/**\n * Luminosity high pass shader.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst LuminosityHighPassShader = {\n\n\tname: 'LuminosityHighPassShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'luminosityThreshold': { value: 1.0 },\n\t\t'smoothWidth': { value: 1.0 },\n\t\t'defaultColor': { value: new Color( 0x000000 ) },\n\t\t'defaultOpacity': { value: 0.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform vec3 defaultColor;\n\t\tuniform float defaultOpacity;\n\t\tuniform float luminosityThreshold;\n\t\tuniform float smoothWidth;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\n\t\t\tfloat v = luminance( texel.xyz );\n\n\t\t\tvec4 outputColor = vec4( defaultColor.rgb, defaultOpacity );\n\n\t\t\tfloat alpha = smoothstep( luminosityThreshold, luminosityThreshold + smoothWidth, v );\n\n\t\t\tgl_FragColor = mix( outputColor, texel, alpha );\n\n\t\t}`\n\n};\n\nexport { LuminosityHighPassShader };\n", "import {\n\tAdditiveBlending,\n\tColor,\n\tHalfFloatType,\n\tMeshBasicMaterial,\n\tShaderMaterial,\n\tUniformsUtils,\n\tVector2,\n\tVector3,\n\tWebGLRenderTarget\n} from 'three';\nimport { Pass, FullScreenQuad } from './Pass.js';\nimport { CopyShader } from '../shaders/CopyShader.js';\nimport { LuminosityHighPassShader } from '../shaders/LuminosityHighPassShader.js';\n\n/**\n * This pass is inspired by the bloom pass of Unreal Engine. It creates a\n * mip map chain of bloom textures and blurs them with different radii. Because\n * of the weighted combination of mips, and because larger blurs are done on\n * higher mips, this effect provides good quality and performance.\n *\n * When using this pass, tone mapping must be enabled in the renderer settings.\n *\n * Reference:\n * - [Bloom in Unreal Engine](https://docs.unrealengine.com/latest/INT/Engine/Rendering/PostProcessEffects/Bloom/)\n *\n * ```js\n * const resolution = new THREE.Vector2( window.innerWidth, window.innerHeight );\n * const bloomPass = new UnrealBloomPass( resolution, 1.5, 0.4, 0.85 );\n * composer.addPass( bloomPass );\n * ```\n *\n * @augments Pass\n * @three_import import { UnrealBloomPass } from 'three/addons/postprocessing/UnrealBloomPass.js';\n */\nclass UnrealBloomPass extends Pass {\n\n\t/**\n\t * Constructs a new Unreal Bloom pass.\n\t *\n\t * @param {Vector2} [resolution] - The effect's resolution.\n\t * @param {number} [strength=1] - The Bloom strength.\n\t * @param {number} radius - The Bloom radius.\n\t * @param {number} threshold - The luminance threshold limits which bright areas contribute to the Bloom effect.\n\t */\n\tconstructor( resolution, strength = 1, radius, threshold ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The Bloom strength.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.strength = strength;\n\n\t\t/**\n\t\t * The Bloom radius. Must be in the range `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.radius = radius;\n\n\t\t/**\n\t\t * The luminance threshold limits which bright areas contribute to the Bloom effect.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.threshold = threshold;\n\n\t\t/**\n\t\t * The effect's resolution.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (256,256)\n\t\t */\n\t\tthis.resolution = ( resolution !== undefined ) ? new Vector2( resolution.x, resolution.y ) : new Vector2( 256, 256 );\n\n\t\t/**\n\t\t * The effect's clear color\n\t\t *\n\t\t * @type {Color}\n\t\t * @default (0,0,0)\n\t\t */\n\t\tthis.clearColor = new Color( 0, 0, 0 );\n\n\t\t/**\n\t\t * Overwritten to disable the swap.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsSwap = false;\n\n\t\t// internals\n\n\t\t// render targets\n\t\tthis.renderTargetsHorizontal = [];\n\t\tthis.renderTargetsVertical = [];\n\t\tthis.nMips = 5;\n\t\tlet resx = Math.round( this.resolution.x / 2 );\n\t\tlet resy = Math.round( this.resolution.y / 2 );\n\n\t\tthis.renderTargetBright = new WebGLRenderTarget( resx, resy, { type: HalfFloatType } );\n\t\tthis.renderTargetBright.texture.name = 'UnrealBloomPass.bright';\n\t\tthis.renderTargetBright.texture.generateMipmaps = false;\n\n\t\tfor ( let i = 0; i < this.nMips; i ++ ) {\n\n\t\t\tconst renderTargetHorizontal = new WebGLRenderTarget( resx, resy, { type: HalfFloatType } );\n\n\t\t\trenderTargetHorizontal.texture.name = 'UnrealBloomPass.h' + i;\n\t\t\trenderTargetHorizontal.texture.generateMipmaps = false;\n\n\t\t\tthis.renderTargetsHorizontal.push( renderTargetHorizontal );\n\n\t\t\tconst renderTargetVertical = new WebGLRenderTarget( resx, resy, { type: HalfFloatType } );\n\n\t\t\trenderTargetVertical.texture.name = 'UnrealBloomPass.v' + i;\n\t\t\trenderTargetVertical.texture.generateMipmaps = false;\n\n\t\t\tthis.renderTargetsVertical.push( renderTargetVertical );\n\n\t\t\tresx = Math.round( resx / 2 );\n\n\t\t\tresy = Math.round( resy / 2 );\n\n\t\t}\n\n\t\t// luminosity high pass material\n\n\t\tconst highPassShader = LuminosityHighPassShader;\n\t\tthis.highPassUniforms = UniformsUtils.clone( highPassShader.uniforms );\n\n\t\tthis.highPassUniforms[ 'luminosityThreshold' ].value = threshold;\n\t\tthis.highPassUniforms[ 'smoothWidth' ].value = 0.01;\n\n\t\tthis.materialHighPassFilter = new ShaderMaterial( {\n\t\t\tuniforms: this.highPassUniforms,\n\t\t\tvertexShader: highPassShader.vertexShader,\n\t\t\tfragmentShader: highPassShader.fragmentShader\n\t\t} );\n\n\t\t// gaussian blur materials\n\n\t\tthis.separableBlurMaterials = [];\n\t\t// These sizes have been changed to account for the altered coefficients-calculation to avoid blockiness,\n\t\t// while retaining the same blur-strength. For details see https://github.com/mrdoob/three.js/pull/31528\n\t\tconst kernelSizeArray = [ 6, 10, 14, 18, 22 ];\n\t\tresx = Math.round( this.resolution.x / 2 );\n\t\tresy = Math.round( this.resolution.y / 2 );\n\n\t\tfor ( let i = 0; i < this.nMips; i ++ ) {\n\n\t\t\tthis.separableBlurMaterials.push( this._getSeparableBlurMaterial( kernelSizeArray[ i ] ) );\n\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'invSize' ].value = new Vector2( 1 / resx, 1 / resy );\n\n\t\t\tresx = Math.round( resx / 2 );\n\n\t\t\tresy = Math.round( resy / 2 );\n\n\t\t}\n\n\t\t// composite material\n\n\t\tthis.compositeMaterial = this._getCompositeMaterial( this.nMips );\n\t\tthis.compositeMaterial.uniforms[ 'blurTexture1' ].value = this.renderTargetsVertical[ 0 ].texture;\n\t\tthis.compositeMaterial.uniforms[ 'blurTexture2' ].value = this.renderTargetsVertical[ 1 ].texture;\n\t\tthis.compositeMaterial.uniforms[ 'blurTexture3' ].value = this.renderTargetsVertical[ 2 ].texture;\n\t\tthis.compositeMaterial.uniforms[ 'blurTexture4' ].value = this.renderTargetsVertical[ 3 ].texture;\n\t\tthis.compositeMaterial.uniforms[ 'blurTexture5' ].value = this.renderTargetsVertical[ 4 ].texture;\n\t\tthis.compositeMaterial.uniforms[ 'bloomStrength' ].value = strength;\n\t\tthis.compositeMaterial.uniforms[ 'bloomRadius' ].value = 0.1;\n\n\t\tconst bloomFactors = [ 1.0, 0.8, 0.6, 0.4, 0.2 ];\n\t\tthis.compositeMaterial.uniforms[ 'bloomFactors' ].value = bloomFactors;\n\t\tthis.bloomTintColors = [ new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ), new Vector3( 1, 1, 1 ) ];\n\t\tthis.compositeMaterial.uniforms[ 'bloomTintColors' ].value = this.bloomTintColors;\n\n\t\t// blend material\n\n\t\tthis.copyUniforms = UniformsUtils.clone( CopyShader.uniforms );\n\n\t\tthis.blendMaterial = new ShaderMaterial( {\n\t\t\tuniforms: this.copyUniforms,\n\t\t\tvertexShader: CopyShader.vertexShader,\n\t\t\tfragmentShader: CopyShader.fragmentShader,\n\t\t\tpremultipliedAlpha: true,\n\t\t\tblending: AdditiveBlending,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\ttransparent: true\n\t\t} );\n\n\t\tthis._oldClearColor = new Color();\n\t\tthis._oldClearAlpha = 1;\n\n\t\tthis._basic = new MeshBasicMaterial();\n\n\t\tthis._fsQuad = new FullScreenQuad( null );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever the pass is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tfor ( let i = 0; i < this.renderTargetsHorizontal.length; i ++ ) {\n\n\t\t\tthis.renderTargetsHorizontal[ i ].dispose();\n\n\t\t}\n\n\t\tfor ( let i = 0; i < this.renderTargetsVertical.length; i ++ ) {\n\n\t\t\tthis.renderTargetsVertical[ i ].dispose();\n\n\t\t}\n\n\t\tthis.renderTargetBright.dispose();\n\n\t\t//\n\n\t\tfor ( let i = 0; i < this.separableBlurMaterials.length; i ++ ) {\n\n\t\t\tthis.separableBlurMaterials[ i ].dispose();\n\n\t\t}\n\n\t\tthis.compositeMaterial.dispose();\n\t\tthis.blendMaterial.dispose();\n\t\tthis._basic.dispose();\n\n\t\t//\n\n\t\tthis._fsQuad.dispose();\n\n\t}\n\n\t/**\n\t * Sets the size of the pass.\n\t *\n\t * @param {number} width - The width to set.\n\t * @param {number} height - The height to set.\n\t */\n\tsetSize( width, height ) {\n\n\t\tlet resx = Math.round( width / 2 );\n\t\tlet resy = Math.round( height / 2 );\n\n\t\tthis.renderTargetBright.setSize( resx, resy );\n\n\t\tfor ( let i = 0; i < this.nMips; i ++ ) {\n\n\t\t\tthis.renderTargetsHorizontal[ i ].setSize( resx, resy );\n\t\t\tthis.renderTargetsVertical[ i ].setSize( resx, resy );\n\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'invSize' ].value = new Vector2( 1 / resx, 1 / resy );\n\n\t\t\tresx = Math.round( resx / 2 );\n\t\t\tresy = Math.round( resy / 2 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Performs the Bloom pass.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {WebGLRenderTarget} writeBuffer - The write buffer. This buffer is intended as the rendering\n\t * destination for the pass.\n\t * @param {WebGLRenderTarget} readBuffer - The read buffer. The pass can access the result from the\n\t * previous pass from this buffer.\n\t * @param {number} deltaTime - The delta time in seconds.\n\t * @param {boolean} maskActive - Whether masking is active or not.\n\t */\n\trender( renderer, writeBuffer, readBuffer, deltaTime, maskActive ) {\n\n\t\trenderer.getClearColor( this._oldClearColor );\n\t\tthis._oldClearAlpha = renderer.getClearAlpha();\n\t\tconst oldAutoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\trenderer.setClearColor( this.clearColor, 0 );\n\n\t\tif ( maskActive ) renderer.state.buffers.stencil.setTest( false );\n\n\t\t// Render input to screen\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\tthis._fsQuad.material = this._basic;\n\t\t\tthis._basic.map = readBuffer.texture;\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\trenderer.clear();\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t}\n\n\t\t// 1. Extract Bright Areas\n\n\t\tthis.highPassUniforms[ 'tDiffuse' ].value = readBuffer.texture;\n\t\tthis.highPassUniforms[ 'luminosityThreshold' ].value = this.threshold;\n\t\tthis._fsQuad.material = this.materialHighPassFilter;\n\n\t\trenderer.setRenderTarget( this.renderTargetBright );\n\t\trenderer.clear();\n\t\tthis._fsQuad.render( renderer );\n\n\t\t// 2. Blur All the mips progressively\n\n\t\tlet inputRenderTarget = this.renderTargetBright;\n\n\t\tfor ( let i = 0; i < this.nMips; i ++ ) {\n\n\t\t\tthis._fsQuad.material = this.separableBlurMaterials[ i ];\n\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'colorTexture' ].value = inputRenderTarget.texture;\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'direction' ].value = UnrealBloomPass.BlurDirectionX;\n\t\t\trenderer.setRenderTarget( this.renderTargetsHorizontal[ i ] );\n\t\t\trenderer.clear();\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'colorTexture' ].value = this.renderTargetsHorizontal[ i ].texture;\n\t\t\tthis.separableBlurMaterials[ i ].uniforms[ 'direction' ].value = UnrealBloomPass.BlurDirectionY;\n\t\t\trenderer.setRenderTarget( this.renderTargetsVertical[ i ] );\n\t\t\trenderer.clear();\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t\tinputRenderTarget = this.renderTargetsVertical[ i ];\n\n\t\t}\n\n\t\t// Composite All the mips\n\n\t\tthis._fsQuad.material = this.compositeMaterial;\n\t\tthis.compositeMaterial.uniforms[ 'bloomStrength' ].value = this.strength;\n\t\tthis.compositeMaterial.uniforms[ 'bloomRadius' ].value = this.radius;\n\t\tthis.compositeMaterial.uniforms[ 'bloomTintColors' ].value = this.bloomTintColors;\n\n\t\trenderer.setRenderTarget( this.renderTargetsHorizontal[ 0 ] );\n\t\trenderer.clear();\n\t\tthis._fsQuad.render( renderer );\n\n\t\t// Blend it additively over the input texture\n\n\t\tthis._fsQuad.material = this.blendMaterial;\n\t\tthis.copyUniforms[ 'tDiffuse' ].value = this.renderTargetsHorizontal[ 0 ].texture;\n\n\t\tif ( maskActive ) renderer.state.buffers.stencil.setTest( true );\n\n\t\tif ( this.renderToScreen ) {\n\n\t\t\trenderer.setRenderTarget( null );\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t} else {\n\n\t\t\trenderer.setRenderTarget( readBuffer );\n\t\t\tthis._fsQuad.render( renderer );\n\n\t\t}\n\n\t\t// Restore renderer settings\n\n\t\trenderer.setClearColor( this._oldClearColor, this._oldClearAlpha );\n\t\trenderer.autoClear = oldAutoClear;\n\n\t}\n\n\t// internals\n\n\t_getSeparableBlurMaterial( kernelRadius ) {\n\n\t\tconst coefficients = [];\n\t\tconst sigma = kernelRadius / 3;\n\n\t\tfor ( let i = 0; i < kernelRadius; i ++ ) {\n\n\t\t\tcoefficients.push( 0.39894 * Math.exp( - 0.5 * i * i / ( sigma * sigma ) ) / sigma );\n\n\t\t}\n\n\t\treturn new ShaderMaterial( {\n\n\t\t\tdefines: {\n\t\t\t\t'KERNEL_RADIUS': kernelRadius\n\t\t\t},\n\n\t\t\tuniforms: {\n\t\t\t\t'colorTexture': { value: null },\n\t\t\t\t'invSize': { value: new Vector2( 0.5, 0.5 ) }, // inverse texture size\n\t\t\t\t'direction': { value: new Vector2( 0.5, 0.5 ) },\n\t\t\t\t'gaussianCoefficients': { value: coefficients } // precomputed Gaussian coefficients\n\t\t\t},\n\n\t\t\tvertexShader: /* glsl */`\n\n\t\t\t\tvarying vec2 vUv;\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t\t\t}`,\n\n\t\t\tfragmentShader: /* glsl */`\n\n\t\t\t\t#include <common>\n\n\t\t\t\tvarying vec2 vUv;\n\n\t\t\t\tuniform sampler2D colorTexture;\n\t\t\t\tuniform vec2 invSize;\n\t\t\t\tuniform vec2 direction;\n\t\t\t\tuniform float gaussianCoefficients[KERNEL_RADIUS];\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tfloat weightSum = gaussianCoefficients[0];\n\t\t\t\t\tvec3 diffuseSum = texture2D( colorTexture, vUv ).rgb * weightSum;\n\n\t\t\t\t\tfor ( int i = 1; i < KERNEL_RADIUS; i ++ ) {\n\n\t\t\t\t\t\tfloat x = float( i );\n\t\t\t\t\t\tfloat w = gaussianCoefficients[i];\n\t\t\t\t\t\tvec2 uvOffset = direction * invSize * x;\n\t\t\t\t\t\tvec3 sample1 = texture2D( colorTexture, vUv + uvOffset ).rgb;\n\t\t\t\t\t\tvec3 sample2 = texture2D( colorTexture, vUv - uvOffset ).rgb;\n\t\t\t\t\t\tdiffuseSum += ( sample1 + sample2 ) * w;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgl_FragColor = vec4( diffuseSum, 1.0 );\n\n\t\t\t\t}`\n\t\t} );\n\n\t}\n\n\t_getCompositeMaterial( nMips ) {\n\n\t\treturn new ShaderMaterial( {\n\n\t\t\tdefines: {\n\t\t\t\t'NUM_MIPS': nMips\n\t\t\t},\n\n\t\t\tuniforms: {\n\t\t\t\t'blurTexture1': { value: null },\n\t\t\t\t'blurTexture2': { value: null },\n\t\t\t\t'blurTexture3': { value: null },\n\t\t\t\t'blurTexture4': { value: null },\n\t\t\t\t'blurTexture5': { value: null },\n\t\t\t\t'bloomStrength': { value: 1.0 },\n\t\t\t\t'bloomFactors': { value: null },\n\t\t\t\t'bloomTintColors': { value: null },\n\t\t\t\t'bloomRadius': { value: 0.0 }\n\t\t\t},\n\n\t\t\tvertexShader: /* glsl */`\n\n\t\t\t\tvarying vec2 vUv;\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t\t\t}`,\n\n\t\t\tfragmentShader: /* glsl */`\n\n\t\t\t\tvarying vec2 vUv;\n\n\t\t\t\tuniform sampler2D blurTexture1;\n\t\t\t\tuniform sampler2D blurTexture2;\n\t\t\t\tuniform sampler2D blurTexture3;\n\t\t\t\tuniform sampler2D blurTexture4;\n\t\t\t\tuniform sampler2D blurTexture5;\n\t\t\t\tuniform float bloomStrength;\n\t\t\t\tuniform float bloomRadius;\n\t\t\t\tuniform float bloomFactors[NUM_MIPS];\n\t\t\t\tuniform vec3 bloomTintColors[NUM_MIPS];\n\n\t\t\t\tfloat lerpBloomFactor( const in float factor ) {\n\n\t\t\t\t\tfloat mirrorFactor = 1.2 - factor;\n\t\t\t\t\treturn mix( factor, mirrorFactor, bloomRadius );\n\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\t// 3.0 for backwards compatibility with previous alpha-based intensity\n\t\t\t\t\tvec3 bloom = 3.0 * bloomStrength * (\n\t\t\t\t\t\tlerpBloomFactor( bloomFactors[ 0 ] ) * bloomTintColors[ 0 ] * texture2D( blurTexture1, vUv ).rgb +\n\t\t\t\t\t\tlerpBloomFactor( bloomFactors[ 1 ] ) * bloomTintColors[ 1 ] * texture2D( blurTexture2, vUv ).rgb +\n\t\t\t\t\t\tlerpBloomFactor( bloomFactors[ 2 ] ) * bloomTintColors[ 2 ] * texture2D( blurTexture3, vUv ).rgb +\n\t\t\t\t\t\tlerpBloomFactor( bloomFactors[ 3 ] ) * bloomTintColors[ 3 ] * texture2D( blurTexture4, vUv ).rgb +\n\t\t\t\t\t\tlerpBloomFactor( bloomFactors[ 4 ] ) * bloomTintColors[ 4 ] * texture2D( blurTexture5, vUv ).rgb\n\t\t\t\t\t);\n\n\t\t\t\t\tfloat bloomAlpha = max( bloom.r, max( bloom.g, bloom.b ) );\n\t\t\t\t\tgl_FragColor = vec4( bloom, bloomAlpha );\n\n\t\t\t\t}`\n\t\t} );\n\n\t}\n\n}\n\nUnrealBloomPass.BlurDirectionX = new Vector2( 1.0, 0.0 );\nUnrealBloomPass.BlurDirectionY = new Vector2( 0.0, 1.0 );\n\nexport { UnrealBloomPass };\n", "import {\n\tMatrix4,\n\tObject3D,\n\tVector2,\n\tVector3\n} from 'three';\n\n/**\n * The only type of 3D object that is supported by {@link CSS2DRenderer}.\n *\n * @augments Object3D\n * @three_import import { CSS2DObject } from 'three/addons/renderers/CSS2DRenderer.js';\n */\nclass CSS2DObject extends Object3D {\n\n\t/**\n\t * Constructs a new CSS2D object.\n\t *\n\t * @param {HTMLElement} [element] - The DOM element.\n\t */\n\tconstructor( element = document.createElement( 'div' ) ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCSS2DObject = true;\n\n\t\t/**\n\t\t * The DOM element which defines the appearance of this 3D object.\n\t\t *\n\t\t * @type {HTMLElement}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.element = element;\n\n\t\tthis.element.style.position = 'absolute';\n\t\tthis.element.style.userSelect = 'none';\n\n\t\tthis.element.setAttribute( 'draggable', false );\n\n\t\t/**\n\t\t * The 3D objects center point.\n\t\t * `( 0, 0 )` is the lower left, `( 1, 1 )` is the top right.\n\t\t *\n\t\t * @type {Vector2}\n\t\t * @default (0.5,0.5)\n\t\t */\n\t\tthis.center = new Vector2( 0.5, 0.5 );\n\n\t\tthis.addEventListener( 'removed', function () {\n\n\t\t\tthis.traverse( function ( object ) {\n\n\t\t\t\tif (\n\t\t\t\t\tobject.element &&\n\t\t\t\t\tobject.element instanceof object.element.ownerDocument.defaultView.Element &&\n\t\t\t\t\tobject.element.parentNode !== null\n\t\t\t\t) {\n\n\t\t\t\t\tobject.element.remove();\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.element = source.element.cloneNode( true );\n\n\t\tthis.center = source.center;\n\n\t\treturn this;\n\n\t}\n\n}\n\n//\n\nconst _vector = new Vector3();\nconst _viewMatrix = new Matrix4();\nconst _viewProjectionMatrix = new Matrix4();\nconst _a = new Vector3();\nconst _b = new Vector3();\n\n/**\n * This renderer is a simplified version of {@link CSS3DRenderer}. The only transformation that is\n * supported is translation.\n *\n * The renderer is very useful if you want to combine HTML based labels with 3D objects. Here too,\n * the respective DOM elements are wrapped into an instance of {@link CSS2DObject} and added to the\n * scene graph. All other types of renderable 3D objects (like meshes or point clouds) are ignored.\n *\n * `CSS2DRenderer` only supports 100% browser and display zoom.\n *\n * @three_import import { CSS2DRenderer } from 'three/addons/renderers/CSS2DRenderer.js';\n */\nclass CSS2DRenderer {\n\n\t/**\n\t * Constructs a new CSS2D renderer.\n\t *\n\t * @param {CSS2DRenderer~Parameters} [parameters] - The parameters.\n\t */\n\tconstructor( parameters = {} ) {\n\n\t\tconst _this = this;\n\n\t\tlet _width, _height;\n\t\tlet _widthHalf, _heightHalf;\n\n\t\tconst cache = {\n\t\t\tobjects: new WeakMap()\n\t\t};\n\n\t\tconst domElement = parameters.element !== undefined ? parameters.element : document.createElement( 'div' );\n\n\t\tdomElement.style.overflow = 'hidden';\n\n\t\t/**\n\t\t * The DOM where the renderer appends its child-elements.\n\t\t *\n\t\t * @type {HTMLElement}\n\t\t */\n\t\tthis.domElement = domElement;\n\n\t\t/**\n\t\t * Controls whether the renderer assigns `z-index` values to CSS2DObject DOM elements.\n\t\t * If set to `true`, z-index values are assigned first based on the `renderOrder`\n\t\t * and secondly - the distance to the camera. If set to `false`, no z-index values are assigned.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sortObjects = true;\n\n\t\t/**\n\t\t * Returns an object containing the width and height of the renderer.\n\t\t *\n\t\t * @return {{width:number,height:number}} The size of the renderer.\n\t\t */\n\t\tthis.getSize = function () {\n\n\t\t\treturn {\n\t\t\t\twidth: _width,\n\t\t\t\theight: _height\n\t\t\t};\n\n\t\t};\n\n\t\t/**\n\t\t * Renders the given scene using the given camera.\n\t\t *\n\t\t * @param {Object3D} scene - A scene or any other type of 3D object.\n\t\t * @param {Camera} camera - The camera.\n\t\t */\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();\n\t\t\tif ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();\n\n\t\t\t_viewMatrix.copy( camera.matrixWorldInverse );\n\t\t\t_viewProjectionMatrix.multiplyMatrices( camera.projectionMatrix, _viewMatrix );\n\n\t\t\trenderObject( scene, scene, camera );\n\t\t\tif ( this.sortObjects ) zOrder( scene );\n\n\t\t};\n\n\t\t/**\n\t\t * Resizes the renderer to the given width and height.\n\t\t *\n\t\t * @param {number} width - The width of the renderer.\n\t\t * @param {number} height - The height of the renderer.\n\t\t */\n\t\tthis.setSize = function ( width, height ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\n\t\t\t_widthHalf = _width / 2;\n\t\t\t_heightHalf = _height / 2;\n\n\t\t\tdomElement.style.width = width + 'px';\n\t\t\tdomElement.style.height = height + 'px';\n\n\t\t};\n\n\t\tfunction hideObject( object ) {\n\n\t\t\tif ( object.isCSS2DObject ) object.element.style.display = 'none';\n\n\t\t\tfor ( let i = 0, l = object.children.length; i < l; i ++ ) {\n\n\t\t\t\thideObject( object.children[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObject( object, scene, camera ) {\n\n\t\t\tif ( object.visible === false ) {\n\n\t\t\t\thideObject( object );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( object.isCSS2DObject ) {\n\n\t\t\t\t_vector.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t_vector.applyMatrix4( _viewProjectionMatrix );\n\n\t\t\t\tconst visible = ( _vector.z >= - 1 && _vector.z <= 1 ) && ( object.layers.test( camera.layers ) === true );\n\n\t\t\t\tconst element = object.element;\n\t\t\t\telement.style.display = visible === true ? '' : 'none';\n\n\t\t\t\tif ( visible === true ) {\n\n\t\t\t\t\tobject.onBeforeRender( _this, scene, camera );\n\n\t\t\t\t\telement.style.transform = 'translate(' + ( - 100 * object.center.x ) + '%,' + ( - 100 * object.center.y ) + '%)' + 'translate(' + ( _vector.x * _widthHalf + _widthHalf ) + 'px,' + ( - _vector.y * _heightHalf + _heightHalf ) + 'px)';\n\n\t\t\t\t\tif ( element.parentNode !== domElement ) {\n\n\t\t\t\t\t\tdomElement.appendChild( element );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobject.onAfterRender( _this, scene, camera );\n\n\t\t\t\t}\n\n\t\t\t\tconst objectData = {\n\t\t\t\t\tdistanceToCameraSquared: getDistanceToSquared( camera, object )\n\t\t\t\t};\n\n\t\t\t\tcache.objects.set( object, objectData );\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = object.children.length; i < l; i ++ ) {\n\n\t\t\t\trenderObject( object.children[ i ], scene, camera );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction getDistanceToSquared( object1, object2 ) {\n\n\t\t\t_a.setFromMatrixPosition( object1.matrixWorld );\n\t\t\t_b.setFromMatrixPosition( object2.matrixWorld );\n\n\t\t\treturn _a.distanceToSquared( _b );\n\n\t\t}\n\n\t\tfunction filterAndFlatten( scene ) {\n\n\t\t\tconst result = [];\n\n\t\t\tscene.traverseVisible( function ( object ) {\n\n\t\t\t\tif ( object.isCSS2DObject ) result.push( object );\n\n\t\t\t} );\n\n\t\t\treturn result;\n\n\t\t}\n\n\t\tfunction zOrder( scene ) {\n\n\t\t\tconst sorted = filterAndFlatten( scene ).sort( function ( a, b ) {\n\n\t\t\t\tif ( a.renderOrder !== b.renderOrder ) {\n\n\t\t\t\t\treturn b.renderOrder - a.renderOrder;\n\n\t\t\t\t}\n\n\t\t\t\tconst distanceA = cache.objects.get( a ).distanceToCameraSquared;\n\t\t\t\tconst distanceB = cache.objects.get( b ).distanceToCameraSquared;\n\n\t\t\t\treturn distanceA - distanceB;\n\n\t\t\t} );\n\n\t\t\tconst zMax = sorted.length;\n\n\t\t\tfor ( let i = 0, l = sorted.length; i < l; i ++ ) {\n\n\t\t\t\tsorted[ i ].element.style.zIndex = zMax - i;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Constructor parameters of `CSS2DRenderer`.\n *\n * @typedef {Object} CSS2DRenderer~Parameters\n * @property {HTMLElement} [element] - A DOM element where the renderer appends its child-elements.\n * If not passed in here, a new div element will be created.\n **/\n\nexport { CSS2DObject, CSS2DRenderer };\n", "import {\n\tMatrix4,\n\tObject3D,\n\tQuaternion,\n\tVector3\n} from 'three';\n\n// Based on http://www.emagix.net/academic/mscs-project/item/camera-sync-with-css3-and-webgl-threejs\n\nconst _position = new Vector3();\nconst _quaternion = new Quaternion();\nconst _scale = new Vector3();\n\n/**\n * The base 3D object that is supported by {@link CSS3DRenderer}.\n *\n * @augments Object3D\n * @three_import import { CSS3DObject } from 'three/addons/renderers/CSS3DRenderer.js';\n */\nclass CSS3DObject extends Object3D {\n\n\t/**\n\t * Constructs a new CSS3D object.\n\t *\n\t * @param {HTMLElement} [element] - The DOM element.\n\t */\n\tconstructor( element = document.createElement( 'div' ) ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCSS3DObject = true;\n\n\t\t/**\n\t\t * The DOM element which defines the appearance of this 3D object.\n\t\t *\n\t\t * @type {HTMLElement}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.element = element;\n\t\tthis.element.style.position = 'absolute';\n\t\tthis.element.style.pointerEvents = 'auto';\n\t\tthis.element.style.userSelect = 'none';\n\n\t\tthis.element.setAttribute( 'draggable', false );\n\n\t\tthis.addEventListener( 'removed', function () {\n\n\t\t\tthis.traverse( function ( object ) {\n\n\t\t\t\tif (\n\t\t\t\t\tobject.element &&\n\t\t\t\t\tobject.element instanceof object.element.ownerDocument.defaultView.Element &&\n\t\t\t\t\tobject.element.parentNode !== null\n\t\t\t\t) {\n\n\t\t\t\t\tobject.element.remove();\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.element = source.element.cloneNode( true );\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A specialized version of {@link CSS3DObject} that represents\n * DOM elements as sprites.\n *\n * @augments CSS3DObject\n * @three_import import { CSS3DSprite } from 'three/addons/renderers/CSS3DRenderer.js';\n */\nclass CSS3DSprite extends CSS3DObject {\n\n\t/**\n\t * Constructs a new CSS3D sprite object.\n\t *\n\t * @param {HTMLElement} [element] - The DOM element.\n\t */\n\tconstructor( element ) {\n\n\t\tsuper( element );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCSS3DSprite = true;\n\n\t\t/**\n\t\t * The sprite's rotation in radians.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.rotation2D = 0;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.rotation2D = source.rotation2D;\n\n\t\treturn this;\n\n\t}\n\n}\n\n//\n\nconst _matrix = new Matrix4();\nconst _matrix2 = new Matrix4();\n\n/**\n * This renderer can be used to apply hierarchical 3D transformations to DOM elements\n * via the CSS3 [transform](https://www.w3schools.com/cssref/css3_pr_transform.asp) property.\n * `CSS3DRenderer` is particularly interesting if you want to apply 3D effects to a website without\n * canvas based rendering. It can also be used in order to combine DOM elements with WebGLcontent.\n *\n * There are, however, some important limitations:\n *\n * - It's not possible to use the material system of *three.js*.\n * - It's also not possible to use geometries.\n * - The renderer only supports 100% browser and display zoom.\n *\n * So `CSS3DRenderer` is just focused on ordinary DOM elements. These elements are wrapped into special\n * 3D objects ({@link CSS3DObject} or {@link CSS3DSprite}) and then added to the scene graph.\n *\n * @three_import import { CSS3DRenderer } from 'three/addons/renderers/CSS3DRenderer.js';\n */\nclass CSS3DRenderer {\n\n\t/**\n\t * Constructs a new CSS3D renderer.\n\t *\n\t * @param {CSS3DRenderer~Parameters} [parameters] - The parameters.\n\t */\n\tconstructor( parameters = {} ) {\n\n\t\tconst _this = this;\n\n\t\tlet _width, _height;\n\t\tlet _widthHalf, _heightHalf;\n\n\t\tconst cache = {\n\t\t\tcamera: { style: '' },\n\t\t\tobjects: new WeakMap()\n\t\t};\n\n\t\tconst domElement = parameters.element !== undefined ? parameters.element : document.createElement( 'div' );\n\n\t\tdomElement.style.overflow = 'hidden';\n\n\t\t/**\n\t\t * The DOM where the renderer appends its child-elements.\n\t\t *\n\t\t * @type {HTMLElement}\n\t\t */\n\t\tthis.domElement = domElement;\n\n\t\tconst viewElement = document.createElement( 'div' );\n\t\tviewElement.style.transformOrigin = '0 0';\n\t\tviewElement.style.pointerEvents = 'none';\n\t\tdomElement.appendChild( viewElement );\n\n\t\tconst cameraElement = document.createElement( 'div' );\n\n\t\tcameraElement.style.transformStyle = 'preserve-3d';\n\n\t\tviewElement.appendChild( cameraElement );\n\n\t\t/**\n\t\t * Returns an object containing the width and height of the renderer.\n\t\t *\n\t\t * @return {{width:number,height:number}} The size of the renderer.\n\t\t */\n\t\tthis.getSize = function () {\n\n\t\t\treturn {\n\t\t\t\twidth: _width,\n\t\t\t\theight: _height\n\t\t\t};\n\n\t\t};\n\n\t\t/**\n\t\t * Renders the given scene using the given camera.\n\t\t *\n\t\t * @param {Object3D} scene - A scene or any other type of 3D object.\n\t\t * @param {Camera} camera - The camera.\n\t\t */\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tconst fov = camera.projectionMatrix.elements[ 5 ] * _heightHalf;\n\n\t\t\tif ( camera.view && camera.view.enabled ) {\n\n\t\t\t\t// view offset\n\t\t\t\tviewElement.style.transform = `translate( ${ - camera.view.offsetX * ( _width / camera.view.width ) }px, ${ - camera.view.offsetY * ( _height / camera.view.height ) }px )`;\n\n\t\t\t\t// view fullWidth and fullHeight, view width and height\n\t\t\t\tviewElement.style.transform += `scale( ${ camera.view.fullWidth / camera.view.width }, ${ camera.view.fullHeight / camera.view.height } )`;\n\n\t\t\t} else {\n\n\t\t\t\tviewElement.style.transform = '';\n\n\t\t\t}\n\n\t\t\tif ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();\n\t\t\tif ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();\n\n\t\t\tlet tx, ty;\n\n\t\t\tif ( camera.isOrthographicCamera ) {\n\n\t\t\t\ttx = - ( camera.right + camera.left ) / 2;\n\t\t\t\tty = ( camera.top + camera.bottom ) / 2;\n\n\t\t\t}\n\n\t\t\tconst scaleByViewOffset = camera.view && camera.view.enabled ? camera.view.height / camera.view.fullHeight : 1;\n\t\t\tconst cameraCSSMatrix = camera.isOrthographicCamera ?\n\t\t\t\t`scale( ${ scaleByViewOffset } )` + 'scale(' + fov + ')' + 'translate(' + epsilon( tx ) + 'px,' + epsilon( ty ) + 'px)' + getCameraCSSMatrix( camera.matrixWorldInverse ) :\n\t\t\t\t`scale( ${ scaleByViewOffset } )` + 'translateZ(' + fov + 'px)' + getCameraCSSMatrix( camera.matrixWorldInverse );\n\t\t\tconst perspective = camera.isPerspectiveCamera ? 'perspective(' + fov + 'px) ' : '';\n\n\t\t\tconst style = perspective + cameraCSSMatrix +\n\t\t\t\t'translate(' + _widthHalf + 'px,' + _heightHalf + 'px)';\n\n\t\t\tif ( cache.camera.style !== style ) {\n\n\t\t\t\tcameraElement.style.transform = style;\n\n\t\t\t\tcache.camera.style = style;\n\n\t\t\t}\n\n\t\t\trenderObject( scene, scene, camera, cameraCSSMatrix );\n\n\t\t};\n\n\t\t/**\n\t\t * Resizes the renderer to the given width and height.\n\t\t *\n\t\t * @param {number} width - The width of the renderer.\n\t\t * @param {number} height - The height of the renderer.\n\t\t */\n\t\tthis.setSize = function ( width, height ) {\n\n\t\t\t_width = width;\n\t\t\t_height = height;\n\t\t\t_widthHalf = _width / 2;\n\t\t\t_heightHalf = _height / 2;\n\n\t\t\tdomElement.style.width = width + 'px';\n\t\t\tdomElement.style.height = height + 'px';\n\n\t\t\tviewElement.style.width = width + 'px';\n\t\t\tviewElement.style.height = height + 'px';\n\n\t\t\tcameraElement.style.width = width + 'px';\n\t\t\tcameraElement.style.height = height + 'px';\n\n\t\t};\n\n\t\tfunction epsilon( value ) {\n\n\t\t\treturn Math.abs( value ) < 1e-10 ? 0 : value;\n\n\t\t}\n\n\t\tfunction getCameraCSSMatrix( matrix ) {\n\n\t\t\tconst elements = matrix.elements;\n\n\t\t\treturn 'matrix3d(' +\n\t\t\t\tepsilon( elements[ 0 ] ) + ',' +\n\t\t\t\tepsilon( - elements[ 1 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 2 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 3 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 4 ] ) + ',' +\n\t\t\t\tepsilon( - elements[ 5 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 6 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 7 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 8 ] ) + ',' +\n\t\t\t\tepsilon( - elements[ 9 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 10 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 11 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 12 ] ) + ',' +\n\t\t\t\tepsilon( - elements[ 13 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 14 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 15 ] ) +\n\t\t\t')';\n\n\t\t}\n\n\t\tfunction getObjectCSSMatrix( matrix ) {\n\n\t\t\tconst elements = matrix.elements;\n\t\t\tconst matrix3d = 'matrix3d(' +\n\t\t\t\tepsilon( elements[ 0 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 1 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 2 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 3 ] ) + ',' +\n\t\t\t\tepsilon( - elements[ 4 ] ) + ',' +\n\t\t\t\tepsilon( - elements[ 5 ] ) + ',' +\n\t\t\t\tepsilon( - elements[ 6 ] ) + ',' +\n\t\t\t\tepsilon( - elements[ 7 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 8 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 9 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 10 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 11 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 12 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 13 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 14 ] ) + ',' +\n\t\t\t\tepsilon( elements[ 15 ] ) +\n\t\t\t')';\n\n\t\t\treturn 'translate(-50%,-50%)' + matrix3d;\n\n\t\t}\n\n\t\tfunction hideObject( object ) {\n\n\t\t\tif ( object.isCSS3DObject ) object.element.style.display = 'none';\n\n\t\t\tfor ( let i = 0, l = object.children.length; i < l; i ++ ) {\n\n\t\t\t\thideObject( object.children[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderObject( object, scene, camera, cameraCSSMatrix ) {\n\n\t\t\tif ( object.visible === false ) {\n\n\t\t\t\thideObject( object );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tif ( object.isCSS3DObject ) {\n\n\t\t\t\tconst visible = ( object.layers.test( camera.layers ) === true );\n\n\t\t\t\tconst element = object.element;\n\t\t\t\telement.style.display = visible === true ? '' : 'none';\n\n\t\t\t\tif ( visible === true ) {\n\n\t\t\t\t\tobject.onBeforeRender( _this, scene, camera );\n\n\t\t\t\t\tlet style;\n\n\t\t\t\t\tif ( object.isCSS3DSprite ) {\n\n\t\t\t\t\t\t// http://swiftcoder.wordpress.com/2008/11/25/constructing-a-billboard-matrix/\n\n\t\t\t\t\t\t_matrix.copy( camera.matrixWorldInverse );\n\t\t\t\t\t\t_matrix.transpose();\n\n\t\t\t\t\t\tif ( object.rotation2D !== 0 ) _matrix.multiply( _matrix2.makeRotationZ( object.rotation2D ) );\n\n\t\t\t\t\t\tobject.matrixWorld.decompose( _position, _quaternion, _scale );\n\t\t\t\t\t\t_matrix.setPosition( _position );\n\t\t\t\t\t\t_matrix.scale( _scale );\n\n\t\t\t\t\t\t_matrix.elements[ 3 ] = 0;\n\t\t\t\t\t\t_matrix.elements[ 7 ] = 0;\n\t\t\t\t\t\t_matrix.elements[ 11 ] = 0;\n\t\t\t\t\t\t_matrix.elements[ 15 ] = 1;\n\n\t\t\t\t\t\tstyle = getObjectCSSMatrix( _matrix );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tstyle = getObjectCSSMatrix( object.matrixWorld );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst cachedObject = cache.objects.get( object );\n\n\t\t\t\t\tif ( cachedObject === undefined || cachedObject.style !== style ) {\n\n\t\t\t\t\t\telement.style.transform = style;\n\n\t\t\t\t\t\tconst objectData = { style: style };\n\t\t\t\t\t\tcache.objects.set( object, objectData );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( element.parentNode !== cameraElement ) {\n\n\t\t\t\t\t\tcameraElement.appendChild( element );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tobject.onAfterRender( _this, scene, camera );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, l = object.children.length; i < l; i ++ ) {\n\n\t\t\t\trenderObject( object.children[ i ], scene, camera, cameraCSSMatrix );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Constructor parameters of `CSS3DRenderer`.\n *\n * @typedef {Object} CSS3DRenderer~Parameters\n * @property {HTMLElement} [element] - A DOM element where the renderer appends its child-elements.\n * If not passed in here, a new div element will be created.\n **/\n\nexport { CSS3DObject, CSS3DSprite, CSS3DRenderer };\n", "import {\n\tBox3,\n\tColor,\n\tDoubleSide,\n\tFrustum,\n\tMatrix3,\n\tMatrix4,\n\tVector2,\n\tVector3,\n\tVector4\n} from 'three';\n\nclass RenderableObject {\n\n\tconstructor() {\n\n\t\tthis.id = 0;\n\n\t\tthis.object = null;\n\t\tthis.z = 0;\n\t\tthis.renderOrder = 0;\n\n\t}\n\n}\n\n//\n\nclass RenderableFace {\n\n\tconstructor() {\n\n\t\tthis.id = 0;\n\n\t\tthis.v1 = new RenderableVertex();\n\t\tthis.v2 = new RenderableVertex();\n\t\tthis.v3 = new RenderableVertex();\n\n\t\tthis.normalModel = new Vector3();\n\n\t\tthis.vertexNormalsModel = [ new Vector3(), new Vector3(), new Vector3() ];\n\t\tthis.vertexNormalsLength = 0;\n\n\t\tthis.color = new Color();\n\t\tthis.material = null;\n\t\tthis.uvs = [ new Vector2(), new Vector2(), new Vector2() ];\n\n\t\tthis.z = 0;\n\t\tthis.renderOrder = 0;\n\n\t}\n\n}\n\n//\n\nclass RenderableVertex {\n\n\tconstructor() {\n\n\t\tthis.position = new Vector3();\n\t\tthis.positionWorld = new Vector3();\n\t\tthis.positionScreen = new Vector4();\n\n\t\tthis.visible = true;\n\n\t}\n\n\tcopy( vertex ) {\n\n\t\tthis.positionWorld.copy( vertex.positionWorld );\n\t\tthis.positionScreen.copy( vertex.positionScreen );\n\n\t}\n\n}\n\n//\n\nclass RenderableLine {\n\n\tconstructor() {\n\n\t\tthis.id = 0;\n\n\t\tthis.v1 = new RenderableVertex();\n\t\tthis.v2 = new RenderableVertex();\n\n\t\tthis.vertexColors = [ new Color(), new Color() ];\n\t\tthis.material = null;\n\n\t\tthis.z = 0;\n\t\tthis.renderOrder = 0;\n\n\t}\n\n}\n\n//\n\nclass RenderableSprite {\n\n\tconstructor() {\n\n\t\tthis.id = 0;\n\n\t\tthis.object = null;\n\n\t\tthis.x = 0;\n\t\tthis.y = 0;\n\t\tthis.z = 0;\n\n\t\tthis.rotation = 0;\n\t\tthis.scale = new Vector2();\n\n\t\tthis.material = null;\n\t\tthis.renderOrder = 0;\n\n\t}\n\n}\n\n/**\n * This class can project a given scene in 3D space into a 2D representation\n * used for rendering with a 2D API. `Projector` is currently used by {@link SVGRenderer}\n * and was previously used by the legacy `CanvasRenderer`.\n *\n * @three_import import { Projector } from 'three/addons/renderers/Projector.js';\n */\nclass Projector {\n\n\t/**\n\t * Constructs a new projector.\n\t */\n\tconstructor() {\n\n\t\tlet _object, _objectCount, _objectPoolLength = 0,\n\t\t\t_vertex, _vertexCount, _vertexPoolLength = 0,\n\t\t\t_face, _faceCount, _facePoolLength = 0,\n\t\t\t_line, _lineCount, _linePoolLength = 0,\n\t\t\t_sprite, _spriteCount, _spritePoolLength = 0,\n\t\t\t_modelMatrix, _clipInput = [], _clipOutput = [];\n\n\t\tconst\n\n\t\t\t_renderData = { objects: [], lights: [], elements: [] },\n\n\t\t\t_vector3 = new Vector3(),\n\t\t\t_vector4 = new Vector4(),\n\n\t\t\t_clipBox = new Box3( new Vector3( - 1, - 1, - 1 ), new Vector3( 1, 1, 1 ) ),\n\t\t\t_boundingBox = new Box3(),\n\t\t\t_points3 = new Array( 3 ),\n\n\t\t\t_viewMatrix = new Matrix4(),\n\t\t\t_viewProjectionMatrix = new Matrix4(),\n\n\t\t\t_modelViewProjectionMatrix = new Matrix4(),\n\n\t\t\t_frustum = new Frustum(),\n\n\t\t\t_objectPool = [], _vertexPool = [], _facePool = [], _linePool = [], _spritePool = [],\n\n\t\t\t_clipVertexPool = [],\n\t\t\t_clipPos1 = new Vector4(),\n\t\t\t_clipPos2 = new Vector4(),\n\t\t\t_clipPos3 = new Vector4(),\n\t\t\t_screenVertexPool = [],\n\t\t\t_clipInputVertices = [ null, null, null ],\n\n\t\t\t_clipPlanes = [\n\t\t\t\t{ sign: + 1 },\n\t\t\t\t{ sign: - 1 }\n\t\t\t];\n\n\t\t//\n\n\t\tfunction RenderList() {\n\n\t\t\tconst normals = [];\n\t\t\tconst colors = [];\n\t\t\tconst uvs = [];\n\n\t\t\tlet object = null;\n\n\t\t\tconst normalMatrix = new Matrix3();\n\n\t\t\tfunction setObject( value ) {\n\n\t\t\t\tobject = value;\n\n\t\t\t\tnormalMatrix.getNormalMatrix( object.matrixWorld );\n\n\t\t\t\tnormals.length = 0;\n\t\t\t\tcolors.length = 0;\n\t\t\t\tuvs.length = 0;\n\n\t\t\t}\n\n\t\t\tfunction projectVertex( vertex ) {\n\n\t\t\t\tconst position = vertex.position;\n\t\t\t\tconst positionWorld = vertex.positionWorld;\n\t\t\t\tconst positionScreen = vertex.positionScreen;\n\n\t\t\t\tpositionWorld.copy( position ).applyMatrix4( _modelMatrix );\n\t\t\t\tpositionScreen.copy( positionWorld ).applyMatrix4( _viewProjectionMatrix );\n\n\t\t\t\tconst invW = 1 / positionScreen.w;\n\n\t\t\t\tpositionScreen.x *= invW;\n\t\t\t\tpositionScreen.y *= invW;\n\t\t\t\tpositionScreen.z *= invW;\n\n\t\t\t\tvertex.visible = positionScreen.x >= - 1 && positionScreen.x <= 1 &&\n\t\t\t\t\t\t positionScreen.y >= - 1 && positionScreen.y <= 1 &&\n\t\t\t\t\t\t positionScreen.z >= - 1 && positionScreen.z <= 1;\n\n\t\t\t}\n\n\t\t\tfunction pushVertex( x, y, z ) {\n\n\t\t\t\t_vertex = getNextVertexInPool();\n\t\t\t\t_vertex.position.set( x, y, z );\n\n\t\t\t\tprojectVertex( _vertex );\n\n\t\t\t}\n\n\t\t\tfunction pushNormal( x, y, z ) {\n\n\t\t\t\tnormals.push( x, y, z );\n\n\t\t\t}\n\n\t\t\tfunction pushColor( r, g, b ) {\n\n\t\t\t\tcolors.push( r, g, b );\n\n\t\t\t}\n\n\t\t\tfunction pushUv( x, y ) {\n\n\t\t\t\tuvs.push( x, y );\n\n\t\t\t}\n\n\t\t\tfunction checkTriangleVisibility( v1, v2, v3 ) {\n\n\t\t\t\tif ( v1.visible === true || v2.visible === true || v3.visible === true ) return true;\n\n\t\t\t\t_points3[ 0 ] = v1.positionScreen;\n\t\t\t\t_points3[ 1 ] = v2.positionScreen;\n\t\t\t\t_points3[ 2 ] = v3.positionScreen;\n\n\t\t\t\treturn _clipBox.intersectsBox( _boundingBox.setFromPoints( _points3 ) );\n\n\t\t\t}\n\n\t\t\tfunction checkBackfaceCulling( v1, v2, v3 ) {\n\n\t\t\t\treturn ( ( v3.positionScreen.x - v1.positionScreen.x ) *\n\t\t\t\t\t    ( v2.positionScreen.y - v1.positionScreen.y ) -\n\t\t\t\t\t    ( v3.positionScreen.y - v1.positionScreen.y ) *\n\t\t\t\t\t    ( v2.positionScreen.x - v1.positionScreen.x ) ) < 0;\n\n\t\t\t}\n\n\t\t\tfunction pushLine( a, b ) {\n\n\t\t\t\tconst v1 = _vertexPool[ a ];\n\t\t\t\tconst v2 = _vertexPool[ b ];\n\n\t\t\t\t// Clip\n\n\t\t\t\tv1.positionScreen.copy( v1.position ).applyMatrix4( _modelViewProjectionMatrix );\n\t\t\t\tv2.positionScreen.copy( v2.position ).applyMatrix4( _modelViewProjectionMatrix );\n\n\t\t\t\tif ( clipLine( v1.positionScreen, v2.positionScreen ) === true ) {\n\n\t\t\t\t\t// Perform the perspective divide\n\t\t\t\t\tv1.positionScreen.multiplyScalar( 1 / v1.positionScreen.w );\n\t\t\t\t\tv2.positionScreen.multiplyScalar( 1 / v2.positionScreen.w );\n\n\t\t\t\t\t_line = getNextLineInPool();\n\t\t\t\t\t_line.id = object.id;\n\t\t\t\t\t_line.v1.copy( v1 );\n\t\t\t\t\t_line.v2.copy( v2 );\n\t\t\t\t\t_line.z = Math.max( v1.positionScreen.z, v2.positionScreen.z );\n\t\t\t\t\t_line.renderOrder = object.renderOrder;\n\n\t\t\t\t\t_line.material = object.material;\n\n\t\t\t\t\tif ( object.material.vertexColors ) {\n\n\t\t\t\t\t\t_line.vertexColors[ 0 ].fromArray( colors, a * 3 );\n\t\t\t\t\t\t_line.vertexColors[ 1 ].fromArray( colors, b * 3 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t_renderData.elements.push( _line );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfunction pushTriangle( a, b, c, material ) {\n\n\t\t\t\tconst v1 = _vertexPool[ a ];\n\t\t\t\tconst v2 = _vertexPool[ b ];\n\t\t\t\tconst v3 = _vertexPool[ c ];\n\n\t\t\t\t// Get homogeneous clip space positions (before perspective divide)\n\t\t\t\t_clipPos1.copy( v1.positionWorld ).applyMatrix4( _viewProjectionMatrix );\n\t\t\t\t_clipPos2.copy( v2.positionWorld ).applyMatrix4( _viewProjectionMatrix );\n\t\t\t\t_clipPos3.copy( v3.positionWorld ).applyMatrix4( _viewProjectionMatrix );\n\n\t\t\t\t// Check if triangle needs clipping\n\t\t\t\tconst nearDist1 = _clipPos1.z + _clipPos1.w;\n\t\t\t\tconst nearDist2 = _clipPos2.z + _clipPos2.w;\n\t\t\t\tconst nearDist3 = _clipPos3.z + _clipPos3.w;\n\t\t\t\tconst farDist1 = - _clipPos1.z + _clipPos1.w;\n\t\t\t\tconst farDist2 = - _clipPos2.z + _clipPos2.w;\n\t\t\t\tconst farDist3 = - _clipPos3.z + _clipPos3.w;\n\n\t\t\t\t// Check if completely outside\n\t\t\t\tif ( ( nearDist1 < 0 && nearDist2 < 0 && nearDist3 < 0 ) ||\n\t\t\t\t\t( farDist1 < 0 && farDist2 < 0 && farDist3 < 0 ) ) {\n\n\t\t\t\t\treturn; // Triangle completely clipped\n\n\t\t\t\t}\n\n\t\t\t\t// Check if completely inside (no clipping needed)\n\t\t\t\tif ( nearDist1 >= 0 && nearDist2 >= 0 && nearDist3 >= 0 &&\n\t\t\t\t\tfarDist1 >= 0 && farDist2 >= 0 && farDist3 >= 0 ) {\n\n\t\t\t\t\t// No clipping needed - use original path\n\t\t\t\t\tif ( checkTriangleVisibility( v1, v2, v3 ) === false ) return;\n\n\t\t\t\t\tif ( material.side === DoubleSide || checkBackfaceCulling( v1, v2, v3 ) === true ) {\n\n\t\t\t\t\t\t_face = getNextFaceInPool();\n\n\t\t\t\t\t\t_face.id = object.id;\n\t\t\t\t\t\t_face.v1.copy( v1 );\n\t\t\t\t\t\t_face.v2.copy( v2 );\n\t\t\t\t\t\t_face.v3.copy( v3 );\n\t\t\t\t\t\t_face.z = ( v1.positionScreen.z + v2.positionScreen.z + v3.positionScreen.z ) / 3;\n\t\t\t\t\t\t_face.renderOrder = object.renderOrder;\n\n\t\t\t\t\t\t// face normal\n\t\t\t\t\t\t_vector3.subVectors( v3.position, v2.position );\n\t\t\t\t\t\t_vector4.subVectors( v1.position, v2.position );\n\t\t\t\t\t\t_vector3.cross( _vector4 );\n\t\t\t\t\t\t_face.normalModel.copy( _vector3 );\n\t\t\t\t\t\t_face.normalModel.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t\t\tfor ( let i = 0; i < 3; i ++ ) {\n\n\t\t\t\t\t\t\tconst normal = _face.vertexNormalsModel[ i ];\n\t\t\t\t\t\t\tnormal.fromArray( normals, arguments[ i ] * 3 );\n\t\t\t\t\t\t\tnormal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t\t\t\tconst uv = _face.uvs[ i ];\n\t\t\t\t\t\t\tuv.fromArray( uvs, arguments[ i ] * 2 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t_face.vertexNormalsLength = 3;\n\n\t\t\t\t\t\t_face.material = material;\n\n\t\t\t\t\t\tif ( material.vertexColors ) {\n\n\t\t\t\t\t\t\t_face.color.fromArray( colors, a * 3 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t_renderData.elements.push( _face );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\t// Triangle needs clipping\n\t\t\t\t_clipInputVertices[ 0 ] = _clipPos1;\n\t\t\t\t_clipInputVertices[ 1 ] = _clipPos2;\n\t\t\t\t_clipInputVertices[ 2 ] = _clipPos3;\n\t\t\t\tconst clippedCount = clipTriangle( _clipInputVertices );\n\n\t\t\t\tif ( clippedCount < 3 ) return; // Triangle completely clipped\n\n\t\t\t\t// Perform perspective divide on clipped vertices and create screen vertices\n\t\t\t\tfor ( let i = 0; i < clippedCount; i ++ ) {\n\n\t\t\t\t\tconst cv = _clipInput[ i ];\n\n\t\t\t\t\t// Get or create renderable vertex from pool\n\t\t\t\t\tlet sv = _screenVertexPool[ i ];\n\t\t\t\t\tif ( ! sv ) {\n\n\t\t\t\t\t\tsv = new RenderableVertex();\n\t\t\t\t\t\t_screenVertexPool[ i ] = sv;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Perform perspective divide\n\t\t\t\t\tconst invW = 1 / cv.w;\n\t\t\t\t\tsv.positionScreen.set( cv.x * invW, cv.y * invW, cv.z * invW, 1 );\n\n\t\t\t\t\t// Interpolate world position (simplified - using weighted average based on barycentric-like coords)\n\t\t\t\t\t// For a proper implementation, we'd need to track interpolation weights\n\t\t\t\t\tsv.positionWorld.copy( v1.positionWorld );\n\n\t\t\t\t\tsv.visible = true;\n\n\t\t\t\t}\n\n\t\t\t\t// Triangulate the clipped polygon (simple fan triangulation)\n\t\t\t\tfor ( let i = 1; i < clippedCount - 1; i ++ ) {\n\n\t\t\t\t\tconst tv1 = _screenVertexPool[ 0 ];\n\t\t\t\t\tconst tv2 = _screenVertexPool[ i ];\n\t\t\t\t\tconst tv3 = _screenVertexPool[ i + 1 ];\n\n\t\t\t\t\tif ( material.side === DoubleSide || checkBackfaceCulling( tv1, tv2, tv3 ) === true ) {\n\n\t\t\t\t\t\t_face = getNextFaceInPool();\n\n\t\t\t\t\t\t_face.id = object.id;\n\t\t\t\t\t\t_face.v1.copy( tv1 );\n\t\t\t\t\t\t_face.v2.copy( tv2 );\n\t\t\t\t\t\t_face.v3.copy( tv3 );\n\t\t\t\t\t\t_face.z = ( tv1.positionScreen.z + tv2.positionScreen.z + tv3.positionScreen.z ) / 3;\n\t\t\t\t\t\t_face.renderOrder = object.renderOrder;\n\n\t\t\t\t\t\t// face normal - use original triangle's normal\n\t\t\t\t\t\t_vector3.subVectors( v3.position, v2.position );\n\t\t\t\t\t\t_vector4.subVectors( v1.position, v2.position );\n\t\t\t\t\t\t_vector3.cross( _vector4 );\n\t\t\t\t\t\t_face.normalModel.copy( _vector3 );\n\t\t\t\t\t\t_face.normalModel.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t\t\t// Use original vertex normals and UVs (simplified - proper impl would interpolate)\n\t\t\t\t\t\tfor ( let j = 0; j < 3; j ++ ) {\n\n\t\t\t\t\t\t\tconst normal = _face.vertexNormalsModel[ j ];\n\t\t\t\t\t\t\tnormal.fromArray( normals, arguments[ j ] * 3 );\n\t\t\t\t\t\t\tnormal.applyMatrix3( normalMatrix ).normalize();\n\n\t\t\t\t\t\t\tconst uv = _face.uvs[ j ];\n\t\t\t\t\t\t\tuv.fromArray( uvs, arguments[ j ] * 2 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t_face.vertexNormalsLength = 3;\n\n\t\t\t\t\t\t_face.material = material;\n\n\t\t\t\t\t\tif ( material.vertexColors ) {\n\n\t\t\t\t\t\t\t_face.color.fromArray( colors, a * 3 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t_renderData.elements.push( _face );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tsetObject: setObject,\n\t\t\t\tprojectVertex: projectVertex,\n\t\t\t\tcheckTriangleVisibility: checkTriangleVisibility,\n\t\t\t\tcheckBackfaceCulling: checkBackfaceCulling,\n\t\t\t\tpushVertex: pushVertex,\n\t\t\t\tpushNormal: pushNormal,\n\t\t\t\tpushColor: pushColor,\n\t\t\t\tpushUv: pushUv,\n\t\t\t\tpushLine: pushLine,\n\t\t\t\tpushTriangle: pushTriangle\n\t\t\t};\n\n\t\t}\n\n\t\tconst renderList = new RenderList();\n\n\t\tfunction projectObject( object ) {\n\n\t\t\tif ( object.visible === false ) return;\n\n\t\t\tif ( object.isLight ) {\n\n\t\t\t\t_renderData.lights.push( object );\n\n\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\tif ( object.material.visible === false ) return;\n\t\t\t\tif ( object.frustumCulled === true && _frustum.intersectsObject( object ) === false ) return;\n\n\t\t\t\taddObject( object );\n\n\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\tif ( object.material.visible === false ) return;\n\t\t\t\tif ( object.frustumCulled === true && _frustum.intersectsSprite( object ) === false ) return;\n\n\t\t\t\taddObject( object );\n\n\t\t\t}\n\n\t\t\tconst children = object.children;\n\n\t\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\t\tprojectObject( children[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction addObject( object ) {\n\n\t\t\t_object = getNextObjectInPool();\n\t\t\t_object.id = object.id;\n\t\t\t_object.object = object;\n\n\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld );\n\t\t\t_vector3.applyMatrix4( _viewProjectionMatrix );\n\t\t\t_object.z = _vector3.z;\n\t\t\t_object.renderOrder = object.renderOrder;\n\n\t\t\t_renderData.objects.push( _object );\n\n\t\t}\n\n\t\t/**\n\t\t * Projects the given scene in 3D space into a 2D representation. The result\n\t\t * is an object with renderable items.\n\t\t *\n\t\t * @param {Object3D} scene - A scene or any other type of 3D object.\n\t\t * @param {Camera} camera - The camera.\n\t\t * @param {boolean} sortObjects - Whether to sort objects or not.\n\t\t * @param {boolean} sortElements - Whether to sort elements (faces, lines and sprites) or not.\n\t\t * @return {{objects:Array<Objects>,lights:Array<Objects>,elements:Array<Objects>}} The projected scene as renderable objects.\n\t\t */\n\t\tthis.projectScene = function ( scene, camera, sortObjects, sortElements ) {\n\n\t\t\t_faceCount = 0;\n\t\t\t_lineCount = 0;\n\t\t\t_spriteCount = 0;\n\n\t\t\t_renderData.elements.length = 0;\n\n\t\t\tif ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();\n\t\t\tif ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();\n\n\t\t\t_viewMatrix.copy( camera.matrixWorldInverse );\n\t\t\t_viewProjectionMatrix.multiplyMatrices( camera.projectionMatrix, _viewMatrix );\n\n\t\t\t_frustum.setFromProjectionMatrix( _viewProjectionMatrix );\n\n\t\t\t//\n\n\t\t\t_objectCount = 0;\n\n\t\t\t_renderData.objects.length = 0;\n\t\t\t_renderData.lights.length = 0;\n\n\t\t\tprojectObject( scene );\n\n\t\t\tif ( sortObjects === true ) {\n\n\t\t\t\tpainterSortStable( _renderData.objects, 0, _renderData.objects.length );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tconst objects = _renderData.objects;\n\n\t\t\tfor ( let o = 0, ol = objects.length; o < ol; o ++ ) {\n\n\t\t\t\tconst object = objects[ o ].object;\n\t\t\t\tconst geometry = object.geometry;\n\n\t\t\t\trenderList.setObject( object );\n\n\t\t\t\t_modelMatrix = object.matrixWorld;\n\n\t\t\t\t_vertexCount = 0;\n\n\t\t\t\tif ( object.isMesh ) {\n\n\t\t\t\t\tlet material = object.material;\n\n\t\t\t\t\tconst isMultiMaterial = Array.isArray( material );\n\n\t\t\t\t\tconst attributes = geometry.attributes;\n\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\tif ( attributes.position === undefined ) continue;\n\n\t\t\t\t\tconst positions = attributes.position.array;\n\n\t\t\t\t\tfor ( let i = 0, l = positions.length; i < l; i += 3 ) {\n\n\t\t\t\t\t\tlet x = positions[ i ];\n\t\t\t\t\t\tlet y = positions[ i + 1 ];\n\t\t\t\t\t\tlet z = positions[ i + 2 ];\n\n\t\t\t\t\t\tconst morphTargets = geometry.morphAttributes.position;\n\n\t\t\t\t\t\tif ( morphTargets !== undefined ) {\n\n\t\t\t\t\t\t\tconst morphTargetsRelative = geometry.morphTargetsRelative;\n\t\t\t\t\t\t\tconst morphInfluences = object.morphTargetInfluences;\n\n\t\t\t\t\t\t\tfor ( let t = 0, tl = morphTargets.length; t < tl; t ++ ) {\n\n\t\t\t\t\t\t\t\tconst influence = morphInfluences[ t ];\n\n\t\t\t\t\t\t\t\tif ( influence === 0 ) continue;\n\n\t\t\t\t\t\t\t\tconst target = morphTargets[ t ];\n\n\t\t\t\t\t\t\t\tif ( morphTargetsRelative ) {\n\n\t\t\t\t\t\t\t\t\tx += target.getX( i / 3 ) * influence;\n\t\t\t\t\t\t\t\t\ty += target.getY( i / 3 ) * influence;\n\t\t\t\t\t\t\t\t\tz += target.getZ( i / 3 ) * influence;\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tx += ( target.getX( i / 3 ) - positions[ i ] ) * influence;\n\t\t\t\t\t\t\t\t\ty += ( target.getY( i / 3 ) - positions[ i + 1 ] ) * influence;\n\t\t\t\t\t\t\t\t\tz += ( target.getZ( i / 3 ) - positions[ i + 2 ] ) * influence;\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\trenderList.pushVertex( x, y, z );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attributes.normal !== undefined ) {\n\n\t\t\t\t\t\tconst normals = attributes.normal.array;\n\n\t\t\t\t\t\tfor ( let i = 0, l = normals.length; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\trenderList.pushNormal( normals[ i ], normals[ i + 1 ], normals[ i + 2 ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attributes.color !== undefined ) {\n\n\t\t\t\t\t\tconst colors = attributes.color.array;\n\n\t\t\t\t\t\tfor ( let i = 0, l = colors.length; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\trenderList.pushColor( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( attributes.uv !== undefined ) {\n\n\t\t\t\t\t\tconst uvs = attributes.uv.array;\n\n\t\t\t\t\t\tfor ( let i = 0, l = uvs.length; i < l; i += 2 ) {\n\n\t\t\t\t\t\t\trenderList.pushUv( uvs[ i ], uvs[ i + 1 ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t\t\tconst indices = geometry.index.array;\n\n\t\t\t\t\t\tif ( groups.length > 0 ) {\n\n\t\t\t\t\t\t\tfor ( let g = 0; g < groups.length; g ++ ) {\n\n\t\t\t\t\t\t\t\tconst group = groups[ g ];\n\n\t\t\t\t\t\t\t\tmaterial = isMultiMaterial === true\n\t\t\t\t\t\t\t\t\t ? object.material[ group.materialIndex ]\n\t\t\t\t\t\t\t\t\t : object.material;\n\n\t\t\t\t\t\t\t\tif ( material === undefined ) continue;\n\n\t\t\t\t\t\t\t\tfor ( let i = group.start, l = group.start + group.count; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\t\t\trenderList.pushTriangle( indices[ i ], indices[ i + 1 ], indices[ i + 2 ], material );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0, l = indices.length; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\t\trenderList.pushTriangle( indices[ i ], indices[ i + 1 ], indices[ i + 2 ], material );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tif ( groups.length > 0 ) {\n\n\t\t\t\t\t\t\tfor ( let g = 0; g < groups.length; g ++ ) {\n\n\t\t\t\t\t\t\t\tconst group = groups[ g ];\n\n\t\t\t\t\t\t\t\tmaterial = isMultiMaterial === true\n\t\t\t\t\t\t\t\t\t ? object.material[ group.materialIndex ]\n\t\t\t\t\t\t\t\t\t : object.material;\n\n\t\t\t\t\t\t\t\tif ( material === undefined ) continue;\n\n\t\t\t\t\t\t\t\tfor ( let i = group.start, l = group.start + group.count; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\t\t\trenderList.pushTriangle( i, i + 1, i + 2, material );\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tfor ( let i = 0, l = positions.length / 3; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\t\trenderList.pushTriangle( i, i + 1, i + 2, material );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isLine ) {\n\n\t\t\t\t\t_modelViewProjectionMatrix.multiplyMatrices( _viewProjectionMatrix, _modelMatrix );\n\n\t\t\t\t\tconst attributes = geometry.attributes;\n\n\t\t\t\t\tif ( attributes.position !== undefined ) {\n\n\t\t\t\t\t\tconst positions = attributes.position.array;\n\n\t\t\t\t\t\tfor ( let i = 0, l = positions.length; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\trenderList.pushVertex( positions[ i ], positions[ i + 1 ], positions[ i + 2 ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( attributes.color !== undefined ) {\n\n\t\t\t\t\t\t\tconst colors = attributes.color.array;\n\n\t\t\t\t\t\t\tfor ( let i = 0, l = colors.length; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\t\trenderList.pushColor( colors[ i ], colors[ i + 1 ], colors[ i + 2 ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( geometry.index !== null ) {\n\n\t\t\t\t\t\t\tconst indices = geometry.index.array;\n\n\t\t\t\t\t\t\tfor ( let i = 0, l = indices.length; i < l; i += 2 ) {\n\n\t\t\t\t\t\t\t\trenderList.pushLine( indices[ i ], indices[ i + 1 ] );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tconst step = object.isLineSegments ? 2 : 1;\n\n\t\t\t\t\t\t\tfor ( let i = 0, l = ( positions.length / 3 ) - 1; i < l; i += step ) {\n\n\t\t\t\t\t\t\t\trenderList.pushLine( i, i + 1 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isPoints ) {\n\n\t\t\t\t\t_modelViewProjectionMatrix.multiplyMatrices( _viewProjectionMatrix, _modelMatrix );\n\n\t\t\t\t\tconst attributes = geometry.attributes;\n\n\t\t\t\t\tif ( attributes.position !== undefined ) {\n\n\t\t\t\t\t\tconst positions = attributes.position.array;\n\n\t\t\t\t\t\tfor ( let i = 0, l = positions.length; i < l; i += 3 ) {\n\n\t\t\t\t\t\t\t_vector4.set( positions[ i ], positions[ i + 1 ], positions[ i + 2 ], 1 );\n\t\t\t\t\t\t\t_vector4.applyMatrix4( _modelViewProjectionMatrix );\n\n\t\t\t\t\t\t\tpushPoint( _vector4, object, camera );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\t\t\t\t\t_vector4.set( _modelMatrix.elements[ 12 ], _modelMatrix.elements[ 13 ], _modelMatrix.elements[ 14 ], 1 );\n\t\t\t\t\t_vector4.applyMatrix4( _viewProjectionMatrix );\n\n\t\t\t\t\tpushPoint( _vector4, object, camera );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( sortElements === true ) {\n\n\t\t\t\tpainterSortStable( _renderData.elements, 0, _renderData.elements.length );\n\n\t\t\t}\n\n\t\t\treturn _renderData;\n\n\t\t};\n\n\t\tfunction pushPoint( _vector4, object, camera ) {\n\n\t\t\tconst invW = 1 / _vector4.w;\n\n\t\t\t_vector4.z *= invW;\n\n\t\t\tif ( _vector4.z >= - 1 && _vector4.z <= 1 ) {\n\n\t\t\t\t_sprite = getNextSpriteInPool();\n\t\t\t\t_sprite.id = object.id;\n\t\t\t\t_sprite.x = _vector4.x * invW;\n\t\t\t\t_sprite.y = _vector4.y * invW;\n\t\t\t\t_sprite.z = _vector4.z;\n\t\t\t\t_sprite.renderOrder = object.renderOrder;\n\t\t\t\t_sprite.object = object;\n\n\t\t\t\t_sprite.rotation = object.rotation;\n\n\t\t\t\t_sprite.scale.x = object.scale.x * Math.abs( _sprite.x - ( _vector4.x + camera.projectionMatrix.elements[ 0 ] ) / ( _vector4.w + camera.projectionMatrix.elements[ 12 ] ) );\n\t\t\t\t_sprite.scale.y = object.scale.y * Math.abs( _sprite.y - ( _vector4.y + camera.projectionMatrix.elements[ 5 ] ) / ( _vector4.w + camera.projectionMatrix.elements[ 13 ] ) );\n\n\t\t\t\t_sprite.material = object.material;\n\n\t\t\t\t_renderData.elements.push( _sprite );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Pools\n\n\t\tfunction getNextObjectInPool() {\n\n\t\t\tif ( _objectCount === _objectPoolLength ) {\n\n\t\t\t\tconst object = new RenderableObject();\n\t\t\t\t_objectPool.push( object );\n\t\t\t\t_objectPoolLength ++;\n\t\t\t\t_objectCount ++;\n\t\t\t\treturn object;\n\n\t\t\t}\n\n\t\t\treturn _objectPool[ _objectCount ++ ];\n\n\t\t}\n\n\t\tfunction getNextVertexInPool() {\n\n\t\t\tif ( _vertexCount === _vertexPoolLength ) {\n\n\t\t\t\tconst vertex = new RenderableVertex();\n\t\t\t\t_vertexPool.push( vertex );\n\t\t\t\t_vertexPoolLength ++;\n\t\t\t\t_vertexCount ++;\n\t\t\t\treturn vertex;\n\n\t\t\t}\n\n\t\t\treturn _vertexPool[ _vertexCount ++ ];\n\n\t\t}\n\n\t\tfunction getNextFaceInPool() {\n\n\t\t\tif ( _faceCount === _facePoolLength ) {\n\n\t\t\t\tconst face = new RenderableFace();\n\t\t\t\t_facePool.push( face );\n\t\t\t\t_facePoolLength ++;\n\t\t\t\t_faceCount ++;\n\t\t\t\treturn face;\n\n\t\t\t}\n\n\t\t\treturn _facePool[ _faceCount ++ ];\n\n\n\t\t}\n\n\t\tfunction getNextLineInPool() {\n\n\t\t\tif ( _lineCount === _linePoolLength ) {\n\n\t\t\t\tconst line = new RenderableLine();\n\t\t\t\t_linePool.push( line );\n\t\t\t\t_linePoolLength ++;\n\t\t\t\t_lineCount ++;\n\t\t\t\treturn line;\n\n\t\t\t}\n\n\t\t\treturn _linePool[ _lineCount ++ ];\n\n\t\t}\n\n\t\tfunction getNextSpriteInPool() {\n\n\t\t\tif ( _spriteCount === _spritePoolLength ) {\n\n\t\t\t\tconst sprite = new RenderableSprite();\n\t\t\t\t_spritePool.push( sprite );\n\t\t\t\t_spritePoolLength ++;\n\t\t\t\t_spriteCount ++;\n\t\t\t\treturn sprite;\n\n\t\t\t}\n\n\t\t\treturn _spritePool[ _spriteCount ++ ];\n\n\t\t}\n\n\t\t//\n\n\t\tfunction painterSort( a, b ) {\n\n\t\t\tif ( a.renderOrder !== b.renderOrder ) {\n\n\t\t\t\treturn a.renderOrder - b.renderOrder;\n\n\t\t\t} else if ( a.z !== b.z ) {\n\n\t\t\t\treturn b.z - a.z;\n\n\t\t\t} else if ( a.id !== b.id ) {\n\n\t\t\t\treturn a.id - b.id;\n\n\t\t\t} else {\n\n\t\t\t\treturn 0;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction painterSortStable( array, start, length ) {\n\n\t\t\t// A stable insertion sort for sorting render items\n\t\t\t// This avoids the GC overhead of Array.prototype.sort()\n\n\t\t\tfor ( let i = start + 1; i < start + length; i ++ ) {\n\n\t\t\t\tconst item = array[ i ];\n\t\t\t\tlet j = i - 1;\n\n\t\t\t\twhile ( j >= start && painterSort( array[ j ], item ) > 0 ) {\n\n\t\t\t\t\tarray[ j + 1 ] = array[ j ];\n\t\t\t\t\tj --;\n\n\t\t\t\t}\n\n\t\t\t\tarray[ j + 1 ] = item;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Sutherland-Hodgman triangle clipping in homogeneous clip space\n\t\t// Returns count of vertices in clipped polygon (0 if completely clipped, 3+ if partially clipped)\n\t\t// Result vertices are in _clipInput array\n\t\tfunction clipTriangle( vertices ) {\n\n\t\t\t// Initialize input with the three input vertices\n\t\t\t_clipInput[ 0 ] = vertices[ 0 ];\n\t\t\t_clipInput[ 1 ] = vertices[ 1 ];\n\t\t\t_clipInput[ 2 ] = vertices[ 2 ];\n\n\t\t\tlet inputCount = 3;\n\t\t\tlet outputCount = 0;\n\n\t\t\tfor ( let p = 0; p < _clipPlanes.length; p ++ ) {\n\n\t\t\t\tconst plane = _clipPlanes[ p ];\n\t\t\t\toutputCount = 0;\n\n\t\t\t\tif ( inputCount === 0 ) break;\n\n\t\t\t\tfor ( let i = 0; i < inputCount; i ++ ) {\n\n\t\t\t\t\tconst v1 = _clipInput[ i ];\n\t\t\t\t\tconst v2 = _clipInput[ ( i + 1 ) % inputCount ];\n\n\t\t\t\t\tconst d1 = plane.sign * v1.z + v1.w;\n\t\t\t\t\tconst d2 = plane.sign * v2.z + v2.w;\n\n\t\t\t\t\tconst v1Inside = d1 >= 0;\n\t\t\t\t\tconst v2Inside = d2 >= 0;\n\n\t\t\t\t\tif ( v1Inside && v2Inside ) {\n\n\t\t\t\t\t\t// Both inside - add v1\n\t\t\t\t\t\t_clipOutput[ outputCount ++ ] = v1;\n\n\t\t\t\t\t} else if ( v1Inside && ! v2Inside ) {\n\n\t\t\t\t\t\t// v1 inside, v2 outside - add v1 and intersection\n\t\t\t\t\t\t_clipOutput[ outputCount ++ ] = v1;\n\n\t\t\t\t\t\tconst t = d1 / ( d1 - d2 );\n\t\t\t\t\t\tlet intersection = _clipVertexPool[ outputCount ];\n\t\t\t\t\t\tif ( ! intersection ) {\n\n\t\t\t\t\t\t\tintersection = new Vector4();\n\t\t\t\t\t\t\t_clipVertexPool[ outputCount ] = intersection;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tintersection.lerpVectors( v1, v2, t );\n\t\t\t\t\t\t_clipOutput[ outputCount ++ ] = intersection;\n\n\t\t\t\t\t} else if ( ! v1Inside && v2Inside ) {\n\n\t\t\t\t\t\t// v1 outside, v2 inside - add intersection only\n\t\t\t\t\t\tconst t = d1 / ( d1 - d2 );\n\t\t\t\t\t\tlet intersection = _clipVertexPool[ outputCount ];\n\t\t\t\t\t\tif ( ! intersection ) {\n\n\t\t\t\t\t\t\tintersection = new Vector4();\n\t\t\t\t\t\t\t_clipVertexPool[ outputCount ] = intersection;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tintersection.lerpVectors( v1, v2, t );\n\t\t\t\t\t\t_clipOutput[ outputCount ++ ] = intersection;\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// Both outside - add nothing\n\n\t\t\t\t}\n\n\t\t\t\t// Swap input/output\n\t\t\t\tconst temp = _clipInput;\n\t\t\t\t_clipInput = _clipOutput;\n\t\t\t\t_clipOutput = temp;\n\t\t\t\tinputCount = outputCount;\n\n\t\t\t}\n\n\t\t\treturn inputCount;\n\n\t\t}\n\n\t\tfunction clipLine( s1, s2 ) {\n\n\t\t\tlet alpha1 = 0, alpha2 = 1;\n\n\t\t\t// Calculate the boundary coordinate of each vertex for the near and far clip planes,\n\t\t\t// Z = -1 and Z = +1, respectively.\n\n\t\t\tconst bc1near = s1.z + s1.w,\n\t\t\t\tbc2near = s2.z + s2.w,\n\t\t\t\tbc1far = - s1.z + s1.w,\n\t\t\t\tbc2far = - s2.z + s2.w;\n\n\t\t\tif ( bc1near >= 0 && bc2near >= 0 && bc1far >= 0 && bc2far >= 0 ) {\n\n\t\t\t\t// Both vertices lie entirely within all clip planes.\n\t\t\t\treturn true;\n\n\t\t\t} else if ( ( bc1near < 0 && bc2near < 0 ) || ( bc1far < 0 && bc2far < 0 ) ) {\n\n\t\t\t\t// Both vertices lie entirely outside one of the clip planes.\n\t\t\t\treturn false;\n\n\t\t\t} else {\n\n\t\t\t\t// The line segment spans at least one clip plane.\n\n\t\t\t\tif ( bc1near < 0 ) {\n\n\t\t\t\t\t// v1 lies outside the near plane, v2 inside\n\t\t\t\t\talpha1 = Math.max( alpha1, bc1near / ( bc1near - bc2near ) );\n\n\t\t\t\t} else if ( bc2near < 0 ) {\n\n\t\t\t\t\t// v2 lies outside the near plane, v1 inside\n\t\t\t\t\talpha2 = Math.min( alpha2, bc1near / ( bc1near - bc2near ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( bc1far < 0 ) {\n\n\t\t\t\t\t// v1 lies outside the far plane, v2 inside\n\t\t\t\t\talpha1 = Math.max( alpha1, bc1far / ( bc1far - bc2far ) );\n\n\t\t\t\t} else if ( bc2far < 0 ) {\n\n\t\t\t\t\t// v2 lies outside the far plane, v2 inside\n\t\t\t\t\talpha2 = Math.min( alpha2, bc1far / ( bc1far - bc2far ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( alpha2 < alpha1 ) {\n\n\t\t\t\t\t// The line segment spans two boundaries, but is outside both of them.\n\t\t\t\t\t// (This can't happen when we're only clipping against just near/far but good\n\t\t\t\t\t//  to leave the check here for future usage if other clip planes are added.)\n\t\t\t\t\treturn false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// Update the s1 and s2 vertices to match the clipped line segment.\n\t\t\t\t\ts1.lerp( s2, alpha1 );\n\t\t\t\t\ts2.lerp( s1, 1 - alpha2 );\n\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nexport { RenderableObject, RenderableFace, RenderableVertex, RenderableLine, RenderableSprite, Projector };\n", "import {\n\tBox2,\n\tCamera,\n\tColor,\n\tMatrix3,\n\tMatrix4,\n\tObject3D,\n\tSRGBColorSpace,\n\tVector3\n} from 'three';\n\nimport {\n\tProjector,\n\tRenderableFace,\n\tRenderableLine,\n\tRenderableSprite\n} from './Projector.js';\n\n/**\n * Can be used to wrap SVG elements into a 3D object.\n *\n * @augments Object3D\n * @three_import import { SVGObject } from 'three/addons/renderers/SVGRenderer.js';\n */\nclass SVGObject extends Object3D {\n\n\t/**\n\t * Constructs a new SVG object.\n\t *\n\t * @param {SVGElement} node - The SVG element.\n\t */\n\tconstructor( node ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSVGObject = true;\n\n\t\t/**\n\t\t * This SVG element.\n\t\t *\n\t\t * @type {SVGElement}\n\t\t */\n\t\tthis.node = node;\n\n\t}\n\n}\n\n/**\n * This renderer an be used to render geometric data using SVG. The produced vector\n * graphics are particular useful in the following use cases:\n *\n * - Animated logos or icons.\n * - Interactive 2D/3D diagrams or graphs.\n * - Interactive maps.\n * - Complex or animated user interfaces.\n *\n * `SVGRenderer` has various advantages. It produces crystal-clear and sharp output which\n * is independent of the actual viewport resolution.SVG elements can be styled via CSS.\n * And they have good accessibility since it's possible to add metadata like title or description\n * (useful for search engines or screen readers).\n *\n * There are, however, some important limitations:\n * - No advanced shading.\n * - No texture support.\n * - No shadow support.\n *\n * @three_import import { SVGRenderer } from 'three/addons/renderers/SVGRenderer.js';\n */\nclass SVGRenderer {\n\n\t/**\n\t * Constructs a new SVG renderer.\n\t */\n\tconstructor() {\n\n\t\tlet _renderData, _elements, _lights,\n\t\t\t_svgWidth, _svgHeight, _svgWidthHalf, _svgHeightHalf,\n\n\t\t\t_v1, _v2, _v3,\n\n\t\t\t_svgNode,\n\t\t\t_pathCount = 0,\n\t\t\t_svgObjectCount = 0,\n\t\t\t_renderListCount = 0,\n\n\t\t\t_precision = null,\n\t\t\t_quality = 1,\n\n\t\t\t_currentPath, _currentStyle;\n\n\t\tconst _this = this,\n\t\t\t_clipBox = new Box2(),\n\t\t\t_elemBox = new Box2(),\n\n\t\t\t_color = new Color(),\n\t\t\t_diffuseColor = new Color(),\n\t\t\t_ambientLight = new Color(),\n\t\t\t_directionalLights = new Color(),\n\t\t\t_pointLights = new Color(),\n\t\t\t_clearColor = new Color(),\n\n\t\t\t_vector3 = new Vector3(), // Needed for PointLight\n\t\t\t_centroid = new Vector3(),\n\t\t\t_normal = new Vector3(),\n\t\t\t_normalViewMatrix = new Matrix3(),\n\n\t\t\t_viewMatrix = new Matrix4(),\n\t\t\t_viewProjectionMatrix = new Matrix4(),\n\n\t\t\t_svgPathPool = [],\n\t\t\t_svgObjectsPool = [],\n\t\t\t_renderListPool = [],\n\n\t\t\t_projector = new Projector(),\n\t\t\t_svg = document.createElementNS( 'http://www.w3.org/2000/svg', 'svg' );\n\n\t\t/**\n\t\t * The DOM where the renderer appends its child-elements.\n\t\t *\n\t\t * @type {SVGSVGElement}\n\t\t */\n\t\tthis.domElement = _svg;\n\n\t\t/**\n\t\t * Whether to automatically perform a clear before a render call or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClear = true;\n\n\t\t/**\n\t\t * Whether to sort 3D objects or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sortObjects = true;\n\n\t\t/**\n\t\t * Whether to sort elements or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sortElements = true;\n\n\t\t/**\n\t\t * Number of fractional pixels to enlarge polygons in order to\n\t\t * prevent anti-aliasing gaps. Range is `[0,1]`.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0.5\n\t\t */\n\t\tthis.overdraw = 0.5;\n\n\t\t/**\n\t\t * The output color space.\n\t\t *\n\t\t * @type {(SRGBColorSpace|LinearSRGBColorSpace)}\n\t\t * @default SRGBColorSpace\n\t\t */\n\t\tthis.outputColorSpace = SRGBColorSpace;\n\n\t\t/**\n\t\t * Provides information about the number of\n\t\t * rendered vertices and faces.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.info = {\n\n\t\t\trender: {\n\n\t\t\t\tvertices: 0,\n\t\t\t\tfaces: 0\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the render quality. Setting to `high` means This value indicates that the browser\n\t\t * tries to improve the SVG quality over rendering speed and geometric precision.\n\t\t *\n\t\t * @param {('low'|'high')} quality - The quality.\n\t\t */\n\t\tthis.setQuality = function ( quality ) {\n\n\t\t\tswitch ( quality ) {\n\n\t\t\t\tcase 'high': _quality = 1; break;\n\t\t\t\tcase 'low': _quality = 0; break;\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the clear color.\n\t\t *\n\t\t * @param {(number|Color|string)} color - The clear color to set.\n\t\t */\n\t\tthis.setClearColor = function ( color ) {\n\n\t\t\t_clearColor.set( color );\n\n\t\t};\n\n\t\tthis.setPixelRatio = function () {};\n\n\t\t/**\n\t\t * Resizes the renderer to the given width and height.\n\t\t *\n\t\t * @param {number} width - The width of the renderer.\n\t\t * @param {number} height - The height of the renderer.\n\t\t */\n\t\tthis.setSize = function ( width, height ) {\n\n\t\t\t_svgWidth = width; _svgHeight = height;\n\t\t\t_svgWidthHalf = _svgWidth / 2; _svgHeightHalf = _svgHeight / 2;\n\n\t\t\t_svg.setAttribute( 'viewBox', ( - _svgWidthHalf ) + ' ' + ( - _svgHeightHalf ) + ' ' + _svgWidth + ' ' + _svgHeight );\n\t\t\t_svg.setAttribute( 'width', _svgWidth );\n\t\t\t_svg.setAttribute( 'height', _svgHeight );\n\n\t\t\t_clipBox.min.set( - _svgWidthHalf, - _svgHeightHalf );\n\t\t\t_clipBox.max.set( _svgWidthHalf, _svgHeightHalf );\n\n\t\t};\n\n\t\t/**\n\t\t * Returns an object containing the width and height of the renderer.\n\t\t *\n\t\t * @return {{width:number,height:number}} The size of the renderer.\n\t\t */\n\t\tthis.getSize = function () {\n\n\t\t\treturn {\n\t\t\t\twidth: _svgWidth,\n\t\t\t\theight: _svgHeight\n\t\t\t};\n\n\t\t};\n\n\t\t/**\n\t\t * Sets the precision of the data used to create a paths.\n\t\t *\n\t\t * @param {number} precision - The precision to set.\n\t\t */\n\t\tthis.setPrecision = function ( precision ) {\n\n\t\t\t_precision = precision;\n\n\t\t};\n\n\t\tfunction removeChildNodes() {\n\n\t\t\t_pathCount = 0;\n\n\t\t\twhile ( _svg.childNodes.length > 0 ) {\n\n\t\t\t\t_svg.removeChild( _svg.childNodes[ 0 ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction convert( c ) {\n\n\t\t\treturn _precision !== null ? c.toFixed( _precision ) : c;\n\n\t\t}\n\n\t\tfunction renderSort( a, b ) {\n\n\t\t\tconst aOrder = a.data.renderOrder !== undefined ? a.data.renderOrder : 0;\n\t\t\tconst bOrder = b.data.renderOrder !== undefined ? b.data.renderOrder : 0;\n\n\t\t\tif ( aOrder !== bOrder ) {\n\n\t\t\t\treturn aOrder - bOrder;\n\n\t\t\t} else {\n\n\t\t\t\tconst aZ = a.data.z !== undefined ? a.data.z : 0;\n\t\t\t\tconst bZ = b.data.z !== undefined ? b.data.z : 0;\n\n\t\t\t\treturn bZ - aZ; // Painter's algorithm: far to near\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction arraySortStable( array, start, length ) {\n\n\t\t\t// A stable insertion sort for sorting the render list\n\t\t\t// This avoids the GC overhead of Array.prototype.sort()\n\n\t\t\tfor ( let i = start + 1; i < start + length; i ++ ) {\n\n\t\t\t\tconst item = array[ i ];\n\t\t\t\tlet j = i - 1;\n\n\t\t\t\twhile ( j >= start && renderSort( array[ j ], item ) > 0 ) {\n\n\t\t\t\t\tarray[ j + 1 ] = array[ j ];\n\t\t\t\t\tj --;\n\n\t\t\t\t}\n\n\t\t\t\tarray[ j + 1 ] = item;\n\n\t\t\t}\n\n\t\t}\n\n\t\t/**\n\t\t * Performs a manual clear with the defined clear color.\n\t\t */\n\t\tthis.clear = function () {\n\n\t\t\tremoveChildNodes();\n\t\t\t_svg.style.backgroundColor = _clearColor.getStyle( _this.outputColorSpace );\n\n\t\t};\n\n\t\t/**\n\t\t * Renders the given scene using the given camera.\n\t\t *\n\t\t * @param {Object3D} scene - A scene or any other type of 3D object.\n\t\t * @param {Camera} camera - The camera.\n\t\t */\n\t\tthis.render = function ( scene, camera ) {\n\n\t\t\tif ( camera instanceof Camera === false ) {\n\n\t\t\t\tconsole.error( 'THREE.SVGRenderer.render: camera is not an instance of Camera.' );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tconst background = scene.background;\n\n\t\t\tif ( background && background.isColor ) {\n\n\t\t\t\tremoveChildNodes();\n\t\t\t\t_svg.style.backgroundColor = background.getStyle( _this.outputColorSpace );\n\n\t\t\t} else if ( this.autoClear === true ) {\n\n\t\t\t\tthis.clear();\n\n\t\t\t}\n\n\t\t\t_this.info.render.vertices = 0;\n\t\t\t_this.info.render.faces = 0;\n\n\t\t\t_viewMatrix.copy( camera.matrixWorldInverse );\n\t\t\t_viewProjectionMatrix.multiplyMatrices( camera.projectionMatrix, _viewMatrix );\n\n\t\t\t_renderData = _projector.projectScene( scene, camera, this.sortObjects, this.sortElements );\n\t\t\t_elements = _renderData.elements;\n\t\t\t_lights = _renderData.lights;\n\n\t\t\t_normalViewMatrix.getNormalMatrix( camera.matrixWorldInverse );\n\n\t\t\tcalculateLights( _lights );\n\n\t\t\t_renderListCount = 0;\n\n\t\t\tfor ( let e = 0, el = _elements.length; e < el; e ++ ) {\n\n\t\t\t\tconst element = _elements[ e ];\n\t\t\t\tconst material = element.material;\n\n\t\t\t\tif ( material === undefined || material.opacity === 0 ) continue;\n\n\t\t\t\tgetRenderItem( _renderListCount ++, 'element', element, material );\n\n\t\t\t}\n\n\t\t\t_svgObjectCount = 0;\n\n\t\t\tscene.traverseVisible( function ( object ) {\n\n\t\t\t\tif ( object.isSVGObject ) {\n\n\t\t\t\t\t_vector3.setFromMatrixPosition( object.matrixWorld );\n\t\t\t\t\t_vector3.applyMatrix4( _viewProjectionMatrix );\n\n\t\t\t\t\tif ( _vector3.z < - 1 || _vector3.z > 1 ) return;\n\n\t\t\t\t\tconst x = _vector3.x * _svgWidthHalf;\n\t\t\t\t\tconst y = - _vector3.y * _svgHeightHalf;\n\n\t\t\t\t\tconst svgObject = getSVGObjectData( _svgObjectCount ++ );\n\n\t\t\t\t\tsvgObject.node = object.node;\n\t\t\t\t\tsvgObject.x = x;\n\t\t\t\t\tsvgObject.y = y;\n\t\t\t\t\tsvgObject.z = _vector3.z;\n\t\t\t\t\tsvgObject.renderOrder = object.renderOrder;\n\n\t\t\t\t\tgetRenderItem( _renderListCount ++, 'svgObject', svgObject, null );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\tif ( this.sortElements ) {\n\n\t\t\t\tarraySortStable( _renderListPool, 0, _renderListCount );\n\n\t\t\t}\n\n\t\t\t// Reset accumulated path\n\t\t\t_currentPath = '';\n\t\t\t_currentStyle = '';\n\n\t\t\t// Render in sorted order\n\t\t\tfor ( let i = 0; i < _renderListCount; i ++ ) {\n\n\t\t\t\tconst item = _renderListPool[ i ];\n\n\t\t\t\tif ( item.type === 'svgObject' ) {\n\n\t\t\t\t\tflushPath(); // Flush any accumulated paths before inserting SVG node\n\n\t\t\t\t\tconst svgObject = item.data;\n\t\t\t\t\tconst node = svgObject.node;\n\t\t\t\t\tnode.setAttribute( 'transform', 'translate(' + svgObject.x + ',' + svgObject.y + ')' );\n\t\t\t\t\t_svg.appendChild( node );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst element = item.data;\n\t\t\t\t\tconst material = item.material;\n\n\t\t\t\t\t_elemBox.makeEmpty();\n\n\t\t\t\t\tif ( element instanceof RenderableSprite ) {\n\n\t\t\t\t\t\t_v1 = element;\n\t\t\t\t\t\t_v1.x *= _svgWidthHalf; _v1.y *= - _svgHeightHalf;\n\n\t\t\t\t\t\trenderSprite( _v1, element, material );\n\n\t\t\t\t\t} else if ( element instanceof RenderableLine ) {\n\n\t\t\t\t\t\t_v1 = element.v1; _v2 = element.v2;\n\n\t\t\t\t\t\t_v1.positionScreen.x *= _svgWidthHalf; _v1.positionScreen.y *= - _svgHeightHalf;\n\t\t\t\t\t\t_v2.positionScreen.x *= _svgWidthHalf; _v2.positionScreen.y *= - _svgHeightHalf;\n\n\t\t\t\t\t\t_elemBox.setFromPoints( [ _v1.positionScreen, _v2.positionScreen ] );\n\n\t\t\t\t\t\tif ( _clipBox.intersectsBox( _elemBox ) === true ) {\n\n\t\t\t\t\t\t\trenderLine( _v1, _v2, material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( element instanceof RenderableFace ) {\n\n\t\t\t\t\t\t_v1 = element.v1; _v2 = element.v2; _v3 = element.v3;\n\n\t\t\t\t\t\t_v1.positionScreen.x *= _svgWidthHalf; _v1.positionScreen.y *= - _svgHeightHalf;\n\t\t\t\t\t\t_v2.positionScreen.x *= _svgWidthHalf; _v2.positionScreen.y *= - _svgHeightHalf;\n\t\t\t\t\t\t_v3.positionScreen.x *= _svgWidthHalf; _v3.positionScreen.y *= - _svgHeightHalf;\n\n\t\t\t\t\t\tif ( this.overdraw > 0 ) {\n\n\t\t\t\t\t\t\texpand( _v1.positionScreen, _v2.positionScreen, this.overdraw );\n\t\t\t\t\t\t\texpand( _v2.positionScreen, _v3.positionScreen, this.overdraw );\n\t\t\t\t\t\t\texpand( _v3.positionScreen, _v1.positionScreen, this.overdraw );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t_elemBox.setFromPoints( [\n\t\t\t\t\t\t\t_v1.positionScreen,\n\t\t\t\t\t\t\t_v2.positionScreen,\n\t\t\t\t\t\t\t_v3.positionScreen\n\t\t\t\t\t\t] );\n\n\t\t\t\t\t\tif ( _clipBox.intersectsBox( _elemBox ) === true ) {\n\n\t\t\t\t\t\t\trenderFace3( _v1, _v2, _v3, element, material );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tflushPath(); // Flush any remaining paths\n\n\t\t};\n\n\t\tfunction calculateLights( lights ) {\n\n\t\t\t_ambientLight.setRGB( 0, 0, 0 );\n\t\t\t_directionalLights.setRGB( 0, 0, 0 );\n\t\t\t_pointLights.setRGB( 0, 0, 0 );\n\n\t\t\tfor ( let l = 0, ll = lights.length; l < ll; l ++ ) {\n\n\t\t\t\tconst light = lights[ l ];\n\t\t\t\tconst lightColor = light.color;\n\n\t\t\t\tif ( light.isAmbientLight ) {\n\n\t\t\t\t\t_ambientLight.r += lightColor.r;\n\t\t\t\t\t_ambientLight.g += lightColor.g;\n\t\t\t\t\t_ambientLight.b += lightColor.b;\n\n\t\t\t\t} else if ( light.isDirectionalLight ) {\n\n\t\t\t\t\t_directionalLights.r += lightColor.r;\n\t\t\t\t\t_directionalLights.g += lightColor.g;\n\t\t\t\t\t_directionalLights.b += lightColor.b;\n\n\t\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\t\t_pointLights.r += lightColor.r;\n\t\t\t\t\t_pointLights.g += lightColor.g;\n\t\t\t\t\t_pointLights.b += lightColor.b;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction calculateLight( lights, position, normal, color ) {\n\n\t\t\tfor ( let l = 0, ll = lights.length; l < ll; l ++ ) {\n\n\t\t\t\tconst light = lights[ l ];\n\t\t\t\tconst lightColor = light.color;\n\n\t\t\t\tif ( light.isDirectionalLight ) {\n\n\t\t\t\t\tconst lightPosition = _vector3.setFromMatrixPosition( light.matrixWorld ).normalize();\n\n\t\t\t\t\tlet amount = normal.dot( lightPosition );\n\n\t\t\t\t\tif ( amount <= 0 ) continue;\n\n\t\t\t\t\tamount *= light.intensity;\n\n\t\t\t\t\tcolor.r += lightColor.r * amount;\n\t\t\t\t\tcolor.g += lightColor.g * amount;\n\t\t\t\t\tcolor.b += lightColor.b * amount;\n\n\t\t\t\t} else if ( light.isPointLight ) {\n\n\t\t\t\t\tconst lightPosition = _vector3.setFromMatrixPosition( light.matrixWorld );\n\n\t\t\t\t\tlet amount = normal.dot( _vector3.subVectors( lightPosition, position ).normalize() );\n\n\t\t\t\t\tif ( amount <= 0 ) continue;\n\n\t\t\t\t\tamount *= light.distance == 0 ? 1 : 1 - Math.min( position.distanceTo( lightPosition ) / light.distance, 1 );\n\n\t\t\t\t\tif ( amount == 0 ) continue;\n\n\t\t\t\t\tamount *= light.intensity;\n\n\t\t\t\t\tcolor.r += lightColor.r * amount;\n\t\t\t\t\tcolor.g += lightColor.g * amount;\n\t\t\t\t\tcolor.b += lightColor.b * amount;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderSprite( v1, element, material ) {\n\n\t\t\tlet scaleX = element.scale.x * _svgWidthHalf;\n\t\t\tlet scaleY = element.scale.y * _svgHeightHalf;\n\n\t\t\tif ( material.isPointsMaterial ) {\n\n\t\t\t\tscaleX *= material.size;\n\t\t\t\tscaleY *= material.size;\n\n\t\t\t}\n\n\t\t\tconst path = 'M' + convert( v1.x - scaleX * 0.5 ) + ',' + convert( v1.y - scaleY * 0.5 ) + 'h' + convert( scaleX ) + 'v' + convert( scaleY ) + 'h' + convert( - scaleX ) + 'z';\n\t\t\tlet style = '';\n\n\t\t\tif ( material.isSpriteMaterial || material.isPointsMaterial ) {\n\n\t\t\t\tstyle = 'fill:' + material.color.getStyle( _this.outputColorSpace ) + ';fill-opacity:' + material.opacity;\n\n\t\t\t}\n\n\t\t\taddPath( style, path );\n\n\t\t}\n\n\t\tfunction renderLine( v1, v2, material ) {\n\n\t\t\tconst path = 'M' + convert( v1.positionScreen.x ) + ',' + convert( v1.positionScreen.y ) + 'L' + convert( v2.positionScreen.x ) + ',' + convert( v2.positionScreen.y );\n\n\t\t\tif ( material.isLineBasicMaterial ) {\n\n\t\t\t\tlet style = 'fill:none;stroke:' + material.color.getStyle( _this.outputColorSpace ) + ';stroke-opacity:' + material.opacity + ';stroke-width:' + material.linewidth + ';stroke-linecap:' + material.linecap;\n\n\t\t\t\tif ( material.isLineDashedMaterial ) {\n\n\t\t\t\t\tstyle = style + ';stroke-dasharray:' + material.dashSize + ',' + material.gapSize;\n\n\t\t\t\t}\n\n\t\t\t\taddPath( style, path );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction renderFace3( v1, v2, v3, element, material ) {\n\n\t\t\t_this.info.render.vertices += 3;\n\t\t\t_this.info.render.faces ++;\n\n\t\t\tconst path = 'M' + convert( v1.positionScreen.x ) + ',' + convert( v1.positionScreen.y ) + 'L' + convert( v2.positionScreen.x ) + ',' + convert( v2.positionScreen.y ) + 'L' + convert( v3.positionScreen.x ) + ',' + convert( v3.positionScreen.y ) + 'z';\n\t\t\tlet style = '';\n\n\t\t\tif ( material.isMeshBasicMaterial ) {\n\n\t\t\t\t_color.copy( material.color );\n\n\t\t\t\tif ( material.vertexColors ) {\n\n\t\t\t\t\t_color.multiply( element.color );\n\n\t\t\t\t}\n\n\t\t\t} else if ( material.isMeshLambertMaterial || material.isMeshPhongMaterial || material.isMeshStandardMaterial ) {\n\n\t\t\t\t_diffuseColor.copy( material.color );\n\n\t\t\t\tif ( material.vertexColors ) {\n\n\t\t\t\t\t_diffuseColor.multiply( element.color );\n\n\t\t\t\t}\n\n\t\t\t\t_color.copy( _ambientLight );\n\n\t\t\t\t_centroid.copy( v1.positionWorld ).add( v2.positionWorld ).add( v3.positionWorld ).divideScalar( 3 );\n\n\t\t\t\tcalculateLight( _lights, _centroid, element.normalModel, _color );\n\n\t\t\t\t_color.multiply( _diffuseColor ).add( material.emissive );\n\n\t\t\t} else if ( material.isMeshNormalMaterial ) {\n\n\t\t\t\t_normal.copy( element.normalModel ).applyMatrix3( _normalViewMatrix ).normalize();\n\n\t\t\t\t_color.setRGB( _normal.x, _normal.y, _normal.z ).multiplyScalar( 0.5 ).addScalar( 0.5 );\n\n\t\t\t}\n\n\t\t\tif ( material.wireframe ) {\n\n\t\t\t\tstyle = 'fill:none;stroke:' + _color.getStyle( _this.outputColorSpace ) + ';stroke-opacity:' + material.opacity + ';stroke-width:' + material.wireframeLinewidth + ';stroke-linecap:' + material.wireframeLinecap + ';stroke-linejoin:' + material.wireframeLinejoin;\n\n\t\t\t} else {\n\n\t\t\t\tstyle = 'fill:' + _color.getStyle( _this.outputColorSpace ) + ';fill-opacity:' + material.opacity;\n\n\t\t\t}\n\n\t\t\taddPath( style, path );\n\n\t\t}\n\n\t\t// Hide anti-alias gaps\n\n\t\tfunction expand( v1, v2, pixels ) {\n\n\t\t\tlet x = v2.x - v1.x, y = v2.y - v1.y;\n\t\t\tconst det = x * x + y * y;\n\n\t\t\tif ( det === 0 ) return;\n\n\t\t\tconst idet = pixels / Math.sqrt( det );\n\n\t\t\tx *= idet; y *= idet;\n\n\t\t\tv2.x += x; v2.y += y;\n\t\t\tv1.x -= x; v1.y -= y;\n\n\t\t}\n\n\t\tfunction addPath( style, path ) {\n\n\t\t\tif ( _currentStyle === style ) {\n\n\t\t\t\t_currentPath += path;\n\n\t\t\t} else {\n\n\t\t\t\tflushPath();\n\n\t\t\t\t_currentStyle = style;\n\t\t\t\t_currentPath = path;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction flushPath() {\n\n\t\t\tif ( _currentPath ) {\n\n\t\t\t\t_svgNode = getPathNode( _pathCount ++ );\n\t\t\t\t_svgNode.setAttribute( 'd', _currentPath );\n\t\t\t\t_svgNode.setAttribute( 'style', _currentStyle );\n\t\t\t\t_svg.appendChild( _svgNode );\n\n\t\t\t}\n\n\t\t\t_currentPath = '';\n\t\t\t_currentStyle = '';\n\n\t\t}\n\n\t\tfunction getPathNode( id ) {\n\n\t\t\tlet path = _svgPathPool[ id ];\n\n\t\t\tif ( path === undefined ) {\n\n\t\t\t\tpath = document.createElementNS( 'http://www.w3.org/2000/svg', 'path' );\n\n\t\t\t\tif ( _quality == 0 ) {\n\n\t\t\t\t\tpath.setAttribute( 'shape-rendering', 'crispEdges' ); //optimizeSpeed\n\n\t\t\t\t}\n\n\t\t\t\t_svgPathPool[ id ] = path;\n\n\t\t\t}\n\n\t\t\treturn path;\n\n\t\t}\n\n\t\tfunction getSVGObjectData( id ) {\n\n\t\t\tlet svgObject = _svgObjectsPool[ id ];\n\n\t\t\tif ( svgObject === undefined ) {\n\n\t\t\t\tsvgObject = {\n\t\t\t\t\tnode: null,\n\t\t\t\t\tx: 0,\n\t\t\t\t\ty: 0,\n\t\t\t\t\tz: 0,\n\t\t\t\t\trenderOrder: 0\n\t\t\t\t};\n\n\t\t\t\t_svgObjectsPool[ id ] = svgObject;\n\n\t\t\t}\n\n\t\t\treturn svgObject;\n\n\t\t}\n\n\t\tfunction getRenderItem( id, type, data, material ) {\n\n\t\t\tlet item = _renderListPool[ id ];\n\n\t\t\tif ( item === undefined ) {\n\n\t\t\t\titem = {\n\t\t\t\t\ttype: type,\n\t\t\t\t\tdata: data,\n\t\t\t\t\tmaterial: material\n\t\t\t\t};\n\n\t\t\t\t_renderListPool[ id ] = item;\n\n\t\t\t\treturn item;\n\n\t\t\t}\n\n\t\t\titem.type = type;\n\t\t\titem.data = data;\n\t\t\titem.material = material;\n\n\t\t\treturn item;\n\n\t\t}\n\n\t}\n\n}\n\nexport { SVGObject, SVGRenderer };\n", "/**\n * @module ACESFilmicToneMappingShader\n * @three_import import { ACESFilmicToneMappingShader } from 'three/addons/shaders/ACESFilmicToneMappingShader.js';\n */\n\n/**\n * ACES Filmic Tone Mapping Shader by Stephen Hill.\n * Reference: [ltc_blit.fs](https://github.com/selfshadow/ltc_code/blob/master/webgl/shaders/ltc/ltc_blit.fs)\n *\n * This implementation of ACES is modified to accommodate a brighter viewing environment.\n * The scale factor of 1/0.6 is subjective. See discussion in #19621.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst ACESFilmicToneMappingShader = {\n\n\tname: 'ACESFilmicToneMappingShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'exposure': { value: 1.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\t#define saturate(a) clamp( a, 0.0, 1.0 )\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tuniform float exposure;\n\n\t\tvarying vec2 vUv;\n\n\t\tvec3 RRTAndODTFit( vec3 v ) {\n\n\t\t\tvec3 a = v * ( v + 0.0245786 ) - 0.000090537;\n\t\t\tvec3 b = v * ( 0.983729 * v + 0.4329510 ) + 0.238081;\n\t\t\treturn a / b;\n\n\t\t}\n\n\t\tvec3 ACESFilmicToneMapping( vec3 color ) {\n\n\t\t// sRGB => XYZ => D65_2_D60 => AP1 => RRT_SAT\n\t\t\tconst mat3 ACESInputMat = mat3(\n\t\t\t\tvec3( 0.59719, 0.07600, 0.02840 ), // transposed from source\n\t\t\t\tvec3( 0.35458, 0.90834, 0.13383 ),\n\t\t\t\tvec3( 0.04823, 0.01566, 0.83777 )\n\t\t\t);\n\n\t\t// ODT_SAT => XYZ => D60_2_D65 => sRGB\n\t\t\tconst mat3 ACESOutputMat = mat3(\n\t\t\t\tvec3(  1.60475, -0.10208, -0.00327 ), // transposed from source\n\t\t\t\tvec3( -0.53108,  1.10813, -0.07276 ),\n\t\t\t\tvec3( -0.07367, -0.00605,  1.07602 )\n\t\t\t);\n\n\t\t\tcolor = ACESInputMat * color;\n\n\t\t// Apply RRT and ODT\n\t\t\tcolor = RRTAndODTFit( color );\n\n\t\t\tcolor = ACESOutputMat * color;\n\n\t\t// Clamp to [0, 1]\n\t\t\treturn saturate( color );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tvec4 tex = texture2D( tDiffuse, vUv );\n\n\t\t\ttex.rgb *= exposure / 0.6; // pre-exposed, outside of the tone mapping function\n\n\t\t\tgl_FragColor = vec4( ACESFilmicToneMapping( tex.rgb ), tex.a );\n\n\t\t}`\n\n};\n\nexport { ACESFilmicToneMappingShader };\n", "/**\n * @module BasicShader\n * @three_import import { BasicShader } from 'three/addons/shaders/BasicShader.js';\n */\n\n/**\n * Simple shader for testing.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst BasicShader = {\n\n\tname: 'BasicShader',\n\n\tuniforms: {},\n\n\tvertexShader: /* glsl */`\n\n\t\tvoid main() {\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = vec4( 1.0, 0.0, 0.0, 0.5 );\n\n\t\t}`\n\n};\n\nexport { BasicShader };\n", "\n/**\n * @module BleachBypassShader\n * @three_import import { BleachBypassShader } from 'three/addons/shaders/BleachBypassShader.js';\n */\n\n/**\n * Bleach bypass shader [http://en.wikipedia.org/wiki/Bleach_bypass] based on\n * [Nvidia Shader library](http://developer.download.nvidia.com/shaderlibrary/webpages/shader_library.html#post_bleach_bypass).\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst BleachBypassShader = {\n\n\tname: 'BleachBypassShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'opacity': { value: 1.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform float opacity;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 base = texture2D( tDiffuse, vUv );\n\n\t\t\tfloat lum = luminance( base.rgb );\n\t\t\tvec3 blend = vec3( lum );\n\n\t\t\tfloat L = min( 1.0, max( 0.0, 10.0 * ( lum - 0.45 ) ) );\n\n\t\t\tvec3 result1 = 2.0 * base.rgb * blend;\n\t\t\tvec3 result2 = 1.0 - 2.0 * ( 1.0 - blend ) * ( 1.0 - base.rgb );\n\n\t\t\tvec3 newColor = mix( result1, result2, L );\n\n\t\t\tfloat A2 = opacity * base.a;\n\t\t\tvec3 mixRGB = A2 * newColor.rgb;\n\t\t\tmixRGB += ( ( 1.0 - A2 ) * base.rgb );\n\n\t\t\tgl_FragColor = vec4( mixRGB, base.a );\n\n\t\t}`\n\n};\n\nexport { BleachBypassShader };\n", "/**\n * @module BlendShader\n * @three_import import { BlendShader } from 'three/addons/shaders/BlendShader.js';\n */\n\n/**\n * Blends two textures.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst BlendShader = {\n\n\tname: 'BlendShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse1': { value: null },\n\t\t'tDiffuse2': { value: null },\n\t\t'mixRatio': { value: 0.5 },\n\t\t'opacity': { value: 1.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform float opacity;\n\t\tuniform float mixRatio;\n\n\t\tuniform sampler2D tDiffuse1;\n\t\tuniform sampler2D tDiffuse2;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 texel1 = texture2D( tDiffuse1, vUv );\n\t\t\tvec4 texel2 = texture2D( tDiffuse2, vUv );\n\t\t\tgl_FragColor = opacity * mix( texel1, texel2, mixRatio );\n\n\t\t}`\n\n};\n\nexport { BlendShader };\n", "/**\n * @module BrightnessContrastShader\n * @three_import import { BrightnessContrastShader } from 'three/addons/shaders/BrightnessContrastShader.js';\n */\n\n/**\n * Brightness and contrast adjustment {@link https://github.com/evanw/glfx.js}.\n * Brightness: -1 to 1 (-1 is solid black, 0 is no change, and 1 is solid white)\n * Contrast: -1 to 1 (-1 is solid gray, 0 is no change, and 1 is maximum contrast)\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst BrightnessContrastShader = {\n\n\tname: 'BrightnessContrastShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'brightness': { value: 0 },\n\t\t'contrast': { value: 0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform float brightness;\n\t\tuniform float contrast;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = texture2D( tDiffuse, vUv );\n\n\t\t\tgl_FragColor.rgb += brightness;\n\n\t\t\tif (contrast > 0.0) {\n\t\t\t\tgl_FragColor.rgb = (gl_FragColor.rgb - 0.5) / (1.0 - contrast) + 0.5;\n\t\t\t} else {\n\t\t\t\tgl_FragColor.rgb = (gl_FragColor.rgb - 0.5) * (1.0 + contrast) + 0.5;\n\t\t\t}\n\n\t\t}`\n\n};\n\nexport { BrightnessContrastShader };\n", "import {\n\tVector3\n} from 'three';\n\n/**\n * @module ColorCorrectionShader\n * @three_import import { ColorCorrectionShader } from 'three/addons/shaders/ColorCorrectionShader.js';\n */\n\n/**\n * Color correction shader.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst ColorCorrectionShader = {\n\n\tname: 'ColorCorrectionShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'powRGB': { value: new Vector3( 2, 2, 2 ) },\n\t\t'mulRGB': { value: new Vector3( 1, 1, 1 ) },\n\t\t'addRGB': { value: new Vector3( 0, 0, 0 ) }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform vec3 powRGB;\n\t\tuniform vec3 mulRGB;\n\t\tuniform vec3 addRGB;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = texture2D( tDiffuse, vUv );\n\t\t\tgl_FragColor.rgb = mulRGB * pow( ( gl_FragColor.rgb + addRGB ), powRGB );\n\n\t\t}`\n\n};\n\nexport { ColorCorrectionShader };\n", "import {\n\tColor\n} from 'three';\n\n/**\n * @module ColorifyShader\n * @three_import import { ColorifyShader } from 'three/addons/shaders/ColorifyShader.js';\n */\n\n/**\n * Colorify shader.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst ColorifyShader = {\n\n\tname: 'ColorifyShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'color': { value: new Color( 0xffffff ) }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform vec3 color;\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\n\t\t\tfloat v = luminance( texel.xyz );\n\n\t\t\tgl_FragColor = vec4( v * color, texel.w );\n\n\t\t}`\n\n};\n\nexport { ColorifyShader };\n", "/**\n * @module DOFMipMapShader\n * @three_import import { DOFMipMapShader } from 'three/addons/shaders/DOFMipMapShader.js';\n */\n\n/**\n * Depth-of-field shader using mipmaps from Matt Handley @applmak.\n *\n * Requires power-of-2 sized render target with enabled mipmaps.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst DOFMipMapShader = {\n\n\tname: 'DOFMipMapShader',\n\n\tuniforms: {\n\n\t\t'tColor': { value: null },\n\t\t'tDepth': { value: null },\n\t\t'focus': { value: 1.0 },\n\t\t'maxblur': { value: 1.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform float focus;\n\t\tuniform float maxblur;\n\n\t\tuniform sampler2D tColor;\n\t\tuniform sampler2D tDepth;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 depth = texture2D( tDepth, vUv );\n\n\t\t\tfloat factor = depth.x - focus;\n\n\t\t\tvec4 col = texture2D( tColor, vUv, 2.0 * maxblur * abs( focus - depth.x ) );\n\n\t\t\tgl_FragColor = col;\n\t\t\tgl_FragColor.a = 1.0;\n\n\t\t}`\n\n};\n\nexport { DOFMipMapShader };\n", "/**\n * @module ExposureShader\n * @three_import import { ExposureShader } from 'three/addons/shaders/ExposureShader.js';\n */\n\n/**\n * TODO\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst ExposureShader = {\n\n\tname: 'ExposureShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'exposure': { value: 1.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform float exposure;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = texture2D( tDiffuse, vUv );\n\t\t\tgl_FragColor.rgb *= exposure;\n\n\t\t}`\n\n};\n\nexport { ExposureShader };\n", "import {\n\tVector2\n} from 'three';\n\n/**\n * @module FXAAShader\n * @three_import import { FXAAShader } from 'three/addons/shaders/FXAAShader.js';\n */\n\n/**\n * FXAA algorithm from NVIDIA, C# implementation by Jasper Flick, GLSL port by Dave Hoskins.\n *\n * References:\n * - {@link http://developer.download.nvidia.com/assets/gamedev/files/sdk/11/FXAA_WhitePaper.pdf}.\n * - {@link https://catlikecoding.com/unity/tutorials/advanced-rendering/fxaa/}.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst FXAAShader = {\n\n\tname: 'FXAAShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'resolution': { value: new Vector2( 1 / 1024, 1 / 512 ) }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform vec2 resolution;\n\t\tvarying vec2 vUv;\n\n\t\t#define EDGE_STEP_COUNT 6\n\t\t#define EDGE_GUESS 8.0\n\t\t#define EDGE_STEPS 1.0, 1.5, 2.0, 2.0, 2.0, 4.0\n\t\tconst float edgeSteps[EDGE_STEP_COUNT] = float[EDGE_STEP_COUNT]( EDGE_STEPS );\n\n\t\tfloat _ContrastThreshold = 0.0312;\n\t\tfloat _RelativeThreshold = 0.063;\n\t\tfloat _SubpixelBlending = 1.0;\n\n\t\tvec4 Sample( sampler2D  tex2D, vec2 uv ) {\n\n\t\t\treturn texture( tex2D, uv );\n\n\t\t}\n\n\t\tfloat SampleLuminance( sampler2D tex2D, vec2 uv ) {\n\n\t\t\treturn dot( Sample( tex2D, uv ).rgb, vec3( 0.3, 0.59, 0.11 ) );\n\n\t\t}\n\n\t\tfloat SampleLuminance( sampler2D tex2D, vec2 texSize, vec2 uv, float uOffset, float vOffset ) {\n\n\t\t\tuv += texSize * vec2(uOffset, vOffset);\n\t\t\treturn SampleLuminance(tex2D, uv);\n\n\t\t}\n\n\t\tstruct LuminanceData {\n\n\t\t\tfloat m, n, e, s, w;\n\t\t\tfloat ne, nw, se, sw;\n\t\t\tfloat highest, lowest, contrast;\n\n\t\t};\n\n\t\tLuminanceData SampleLuminanceNeighborhood( sampler2D tex2D, vec2 texSize, vec2 uv ) {\n\n\t\t\tLuminanceData l;\n\t\t\tl.m = SampleLuminance( tex2D, uv );\n\t\t\tl.n = SampleLuminance( tex2D, texSize, uv,  0.0,  1.0 );\n\t\t\tl.e = SampleLuminance( tex2D, texSize, uv,  1.0,  0.0 );\n\t\t\tl.s = SampleLuminance( tex2D, texSize, uv,  0.0, -1.0 );\n\t\t\tl.w = SampleLuminance( tex2D, texSize, uv, -1.0,  0.0 );\n\n\t\t\tl.ne = SampleLuminance( tex2D, texSize, uv,  1.0,  1.0 );\n\t\t\tl.nw = SampleLuminance( tex2D, texSize, uv, -1.0,  1.0 );\n\t\t\tl.se = SampleLuminance( tex2D, texSize, uv,  1.0, -1.0 );\n\t\t\tl.sw = SampleLuminance( tex2D, texSize, uv, -1.0, -1.0 );\n\n\t\t\tl.highest = max( max( max( max( l.n, l.e ), l.s ), l.w ), l.m );\n\t\t\tl.lowest = min( min( min( min( l.n, l.e ), l.s ), l.w ), l.m );\n\t\t\tl.contrast = l.highest - l.lowest;\n\t\t\treturn l;\n\n\t\t}\n\n\t\tbool ShouldSkipPixel( LuminanceData l ) {\n\n\t\t\tfloat threshold = max( _ContrastThreshold, _RelativeThreshold * l.highest );\n\t\t\treturn l.contrast < threshold;\n\n\t\t}\n\n\t\tfloat DeterminePixelBlendFactor( LuminanceData l ) {\n\n\t\t\tfloat f = 2.0 * ( l.n + l.e + l.s + l.w );\n\t\t\tf += l.ne + l.nw + l.se + l.sw;\n\t\t\tf *= 1.0 / 12.0;\n\t\t\tf = abs( f - l.m );\n\t\t\tf = clamp( f / l.contrast, 0.0, 1.0 );\n\n\t\t\tfloat blendFactor = smoothstep( 0.0, 1.0, f );\n\t\t\treturn blendFactor * blendFactor * _SubpixelBlending;\n\n\t\t}\n\n\t\tstruct EdgeData {\n\n\t\t\tbool isHorizontal;\n\t\t\tfloat pixelStep;\n\t\t\tfloat oppositeLuminance, gradient;\n\n\t\t};\n\n\t\tEdgeData DetermineEdge( vec2 texSize, LuminanceData l ) {\n\n\t\t\tEdgeData e;\n\t\t\tfloat horizontal =\n\t\t\t\tabs( l.n + l.s - 2.0 * l.m ) * 2.0 +\n\t\t\t\tabs( l.ne + l.se - 2.0 * l.e ) +\n\t\t\t\tabs( l.nw + l.sw - 2.0 * l.w );\n\t\t\tfloat vertical =\n\t\t\t\tabs( l.e + l.w - 2.0 * l.m ) * 2.0 +\n\t\t\t\tabs( l.ne + l.nw - 2.0 * l.n ) +\n\t\t\t\tabs( l.se + l.sw - 2.0 * l.s );\n\t\t\te.isHorizontal = horizontal >= vertical;\n\n\t\t\tfloat pLuminance = e.isHorizontal ? l.n : l.e;\n\t\t\tfloat nLuminance = e.isHorizontal ? l.s : l.w;\n\t\t\tfloat pGradient = abs( pLuminance - l.m );\n\t\t\tfloat nGradient = abs( nLuminance - l.m );\n\n\t\t\te.pixelStep = e.isHorizontal ? texSize.y : texSize.x;\n\n\t\t\tif (pGradient < nGradient) {\n\n\t\t\t\te.pixelStep = -e.pixelStep;\n\t\t\t\te.oppositeLuminance = nLuminance;\n\t\t\t\te.gradient = nGradient;\n\n\t\t\t} else {\n\n\t\t\t\te.oppositeLuminance = pLuminance;\n\t\t\t\te.gradient = pGradient;\n\n\t\t\t}\n\n\t\t\treturn e;\n\n\t\t}\n\n\t\tfloat DetermineEdgeBlendFactor( sampler2D  tex2D, vec2 texSize, LuminanceData l, EdgeData e, vec2 uv ) {\n\n\t\t\tvec2 uvEdge = uv;\n\t\t\tvec2 edgeStep;\n\t\t\tif (e.isHorizontal) {\n\n\t\t\t\tuvEdge.y += e.pixelStep * 0.5;\n\t\t\t\tedgeStep = vec2( texSize.x, 0.0 );\n\n\t\t\t} else {\n\n\t\t\t\tuvEdge.x += e.pixelStep * 0.5;\n\t\t\t\tedgeStep = vec2( 0.0, texSize.y );\n\n\t\t\t}\n\n\t\t\tfloat edgeLuminance = ( l.m + e.oppositeLuminance ) * 0.5;\n\t\t\tfloat gradientThreshold = e.gradient * 0.25;\n\n\t\t\tvec2 puv = uvEdge + edgeStep * edgeSteps[0];\n\t\t\tfloat pLuminanceDelta = SampleLuminance( tex2D, puv ) - edgeLuminance;\n\t\t\tbool pAtEnd = abs( pLuminanceDelta ) >= gradientThreshold;\n\n\t\t\tfor ( int i = 1; i < EDGE_STEP_COUNT && !pAtEnd; i++ ) {\n\n\t\t\t\tpuv += edgeStep * edgeSteps[i];\n\t\t\t\tpLuminanceDelta = SampleLuminance( tex2D, puv ) - edgeLuminance;\n\t\t\t\tpAtEnd = abs( pLuminanceDelta ) >= gradientThreshold;\n\n\t\t\t}\n\n\t\t\tif ( !pAtEnd ) {\n\n\t\t\t\tpuv += edgeStep * EDGE_GUESS;\n\n\t\t\t}\n\n\t\t\tvec2 nuv = uvEdge - edgeStep * edgeSteps[0];\n\t\t\tfloat nLuminanceDelta = SampleLuminance( tex2D, nuv ) - edgeLuminance;\n\t\t\tbool nAtEnd = abs( nLuminanceDelta ) >= gradientThreshold;\n\n\t\t\tfor ( int i = 1; i < EDGE_STEP_COUNT && !nAtEnd; i++ ) {\n\n\t\t\t\tnuv -= edgeStep * edgeSteps[i];\n\t\t\t\tnLuminanceDelta = SampleLuminance( tex2D, nuv ) - edgeLuminance;\n\t\t\t\tnAtEnd = abs( nLuminanceDelta ) >= gradientThreshold;\n\n\t\t\t}\n\n\t\t\tif ( !nAtEnd ) {\n\n\t\t\t\tnuv -= edgeStep * EDGE_GUESS;\n\n\t\t\t}\n\n\t\t\tfloat pDistance, nDistance;\n\t\t\tif ( e.isHorizontal ) {\n\n\t\t\t\tpDistance = puv.x - uv.x;\n\t\t\t\tnDistance = uv.x - nuv.x;\n\n\t\t\t} else {\n\n\t\t\t\tpDistance = puv.y - uv.y;\n\t\t\t\tnDistance = uv.y - nuv.y;\n\n\t\t\t}\n\n\t\t\tfloat shortestDistance;\n\t\t\tbool deltaSign;\n\t\t\tif ( pDistance <= nDistance ) {\n\n\t\t\t\tshortestDistance = pDistance;\n\t\t\t\tdeltaSign = pLuminanceDelta >= 0.0;\n\n\t\t\t} else {\n\n\t\t\t\tshortestDistance = nDistance;\n\t\t\t\tdeltaSign = nLuminanceDelta >= 0.0;\n\n\t\t\t}\n\n\t\t\tif ( deltaSign == ( l.m - edgeLuminance >= 0.0 ) ) {\n\n\t\t\t\treturn 0.0;\n\n\t\t\t}\n\n\t\t\treturn 0.5 - shortestDistance / ( pDistance + nDistance );\n\n\t\t}\n\n\t\tvec4 ApplyFXAA( sampler2D  tex2D, vec2 texSize, vec2 uv ) {\n\n\t\t\tLuminanceData luminance = SampleLuminanceNeighborhood( tex2D, texSize, uv );\n\t\t\tif ( ShouldSkipPixel( luminance ) ) {\n\n\t\t\t\treturn Sample( tex2D, uv );\n\n\t\t\t}\n\n\t\t\tfloat pixelBlend = DeterminePixelBlendFactor( luminance );\n\t\t\tEdgeData edge = DetermineEdge( texSize, luminance );\n\t\t\tfloat edgeBlend = DetermineEdgeBlendFactor( tex2D, texSize, luminance, edge, uv );\n\t\t\tfloat finalBlend = max( pixelBlend, edgeBlend );\n\n\t\t\tif (edge.isHorizontal) {\n\n\t\t\t\tuv.y += edge.pixelStep * finalBlend;\n\n\t\t\t} else {\n\n\t\t\t\tuv.x += edge.pixelStep * finalBlend;\n\n\t\t\t}\n\n\t\t\treturn Sample( tex2D, uv );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = ApplyFXAA( tDiffuse, resolution.xy, vUv );\n\n\t\t}`\n\n};\n\nexport { FXAAShader };\n", "/**\n * @module FocusShader\n * @three_import import { FocusShader } from 'three/addons/shaders/FocusShader.js';\n */\n\n/**\n * Focus shader based on [PaintEffect postprocess from ro.me](http://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js).\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst FocusShader = {\n\n\tname: 'FocusShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'screenWidth': { value: 1024 },\n\t\t'screenHeight': { value: 1024 },\n\t\t'sampleDistance': { value: 0.94 },\n\t\t'waveFactor': { value: 0.00125 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform float screenWidth;\n\t\tuniform float screenHeight;\n\t\tuniform float sampleDistance;\n\t\tuniform float waveFactor;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 color, org, tmp, add;\n\t\t\tfloat sample_dist, f;\n\t\t\tvec2 vin;\n\t\t\tvec2 uv = vUv;\n\n\t\t\tadd = color = org = texture2D( tDiffuse, uv );\n\n\t\t\tvin = ( uv - vec2( 0.5 ) ) * vec2( 1.4 );\n\t\t\tsample_dist = dot( vin, vin ) * 2.0;\n\n\t\t\tf = ( waveFactor * 100.0 + sample_dist ) * sampleDistance * 4.0;\n\n\t\t\tvec2 sampleSize = vec2(  1.0 / screenWidth, 1.0 / screenHeight ) * vec2( f );\n\n\t\t\tadd += tmp = texture2D( tDiffuse, uv + vec2( 0.111964, 0.993712 ) * sampleSize );\n\t\t\tif( tmp.b < color.b ) color = tmp;\n\n\t\t\tadd += tmp = texture2D( tDiffuse, uv + vec2( 0.846724, 0.532032 ) * sampleSize );\n\t\t\tif( tmp.b < color.b ) color = tmp;\n\n\t\t\tadd += tmp = texture2D( tDiffuse, uv + vec2( 0.943883, -0.330279 ) * sampleSize );\n\t\t\tif( tmp.b < color.b ) color = tmp;\n\n\t\t\tadd += tmp = texture2D( tDiffuse, uv + vec2( 0.330279, -0.943883 ) * sampleSize );\n\t\t\tif( tmp.b < color.b ) color = tmp;\n\n\t\t\tadd += tmp = texture2D( tDiffuse, uv + vec2( -0.532032, -0.846724 ) * sampleSize );\n\t\t\tif( tmp.b < color.b ) color = tmp;\n\n\t\t\tadd += tmp = texture2D( tDiffuse, uv + vec2( -0.993712, -0.111964 ) * sampleSize );\n\t\t\tif( tmp.b < color.b ) color = tmp;\n\n\t\t\tadd += tmp = texture2D( tDiffuse, uv + vec2( -0.707107, 0.707107 ) * sampleSize );\n\t\t\tif( tmp.b < color.b ) color = tmp;\n\n\t\t\tcolor = color * vec4( 2.0 ) - ( add / vec4( 8.0 ) );\n\t\t\tcolor = color + ( add / vec4( 8.0 ) - color ) * ( vec4( 1.0 ) - vec4( sample_dist * 0.5 ) );\n\n\t\t\tgl_FragColor = vec4( color.rgb * color.rgb * vec3( 0.95 ) + color.rgb, 1.0 );\n\n\t\t}`\n\n};\n\nexport { FocusShader };\n", "import {\n\tVector2\n} from 'three';\n\n/**\n * @module FreiChenShader\n * @three_import import { FreiChenShader } from 'three/addons/shaders/FreiChenShader.js';\n */\n\n/**\n * Edge Detection Shader using Frei-Chen filter.\n * Based on {@link http://rastergrid.com/blog/2011/01/frei-chen-edge-detector}.\n *\n * aspect: vec2 of (1/width, 1/height)\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst FreiChenShader = {\n\n\tname: 'FreiChenShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'aspect': { value: new Vector2( 512, 512 ) }\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tvarying vec2 vUv;\n\n\t\tuniform vec2 aspect;\n\n\t\tvec2 texel = vec2( 1.0 / aspect.x, 1.0 / aspect.y );\n\n\n\t\tmat3 G[9];\n\n\t\t// hard coded matrix values!!!! as suggested in https://github.com/neilmendoza/ofxPostProcessing/blob/master/src/EdgePass.cpp#L45\n\n\t\tconst mat3 g0 = mat3( 0.3535533845424652, 0, -0.3535533845424652, 0.5, 0, -0.5, 0.3535533845424652, 0, -0.3535533845424652 );\n\t\tconst mat3 g1 = mat3( 0.3535533845424652, 0.5, 0.3535533845424652, 0, 0, 0, -0.3535533845424652, -0.5, -0.3535533845424652 );\n\t\tconst mat3 g2 = mat3( 0, 0.3535533845424652, -0.5, -0.3535533845424652, 0, 0.3535533845424652, 0.5, -0.3535533845424652, 0 );\n\t\tconst mat3 g3 = mat3( 0.5, -0.3535533845424652, 0, -0.3535533845424652, 0, 0.3535533845424652, 0, 0.3535533845424652, -0.5 );\n\t\tconst mat3 g4 = mat3( 0, -0.5, 0, 0.5, 0, 0.5, 0, -0.5, 0 );\n\t\tconst mat3 g5 = mat3( -0.5, 0, 0.5, 0, 0, 0, 0.5, 0, -0.5 );\n\t\tconst mat3 g6 = mat3( 0.1666666716337204, -0.3333333432674408, 0.1666666716337204, -0.3333333432674408, 0.6666666865348816, -0.3333333432674408, 0.1666666716337204, -0.3333333432674408, 0.1666666716337204 );\n\t\tconst mat3 g7 = mat3( -0.3333333432674408, 0.1666666716337204, -0.3333333432674408, 0.1666666716337204, 0.6666666865348816, 0.1666666716337204, -0.3333333432674408, 0.1666666716337204, -0.3333333432674408 );\n\t\tconst mat3 g8 = mat3( 0.3333333432674408, 0.3333333432674408, 0.3333333432674408, 0.3333333432674408, 0.3333333432674408, 0.3333333432674408, 0.3333333432674408, 0.3333333432674408, 0.3333333432674408 );\n\n\t\tvoid main(void)\n\t\t{\n\n\t\t\tG[0] = g0,\n\t\t\tG[1] = g1,\n\t\t\tG[2] = g2,\n\t\t\tG[3] = g3,\n\t\t\tG[4] = g4,\n\t\t\tG[5] = g5,\n\t\t\tG[6] = g6,\n\t\t\tG[7] = g7,\n\t\t\tG[8] = g8;\n\n\t\t\tmat3 I;\n\t\t\tfloat cnv[9];\n\t\t\tvec3 sample;\n\n\t\t/* fetch the 3x3 neighbourhood and use the RGB vector's length as intensity value */\n\t\t\tfor (float i=0.0; i<3.0; i++) {\n\t\t\t\tfor (float j=0.0; j<3.0; j++) {\n\t\t\t\t\tsample = texture2D(tDiffuse, vUv + texel * vec2(i-1.0,j-1.0) ).rgb;\n\t\t\t\t\tI[int(i)][int(j)] = length(sample);\n\t\t\t\t}\n\t\t\t}\n\n\t\t/* calculate the convolution values for all the masks */\n\t\t\tfor (int i=0; i<9; i++) {\n\t\t\t\tfloat dp3 = dot(G[i][0], I[0]) + dot(G[i][1], I[1]) + dot(G[i][2], I[2]);\n\t\t\t\tcnv[i] = dp3 * dp3;\n\t\t\t}\n\n\t\t\tfloat M = (cnv[0] + cnv[1]) + (cnv[2] + cnv[3]);\n\t\t\tfloat S = (cnv[4] + cnv[5]) + (cnv[6] + cnv[7]) + (cnv[8] + M);\n\n\t\t\tgl_FragColor = vec4(vec3(sqrt(M/S)), 1.0);\n\t\t}`\n\n};\n\nexport { FreiChenShader };\n", "/**\n * @module GammaCorrectionShader\n * @three_import import { GammaCorrectionShader } from 'three/addons/shaders/GammaCorrectionShader.js';\n */\n\n/**\n * Gamma Correction Shader\n *\n * References:\n * - {@link http://en.wikipedia.org/wiki/gamma_correction}.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst GammaCorrectionShader = {\n\n\tname: 'GammaCorrectionShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 tex = texture2D( tDiffuse, vUv );\n\n\t\t\tgl_FragColor = sRGBTransferOETF( tex );\n\n\t\t}`\n\n};\n\nexport { GammaCorrectionShader };\n", "import {\n\tColor,\n\tVector3\n} from 'three';\n\n/**\n * @module GodRaysShader\n * @three_import import * as GodRaysShader from 'three/addons/shaders/GodRaysShader.js';\n */\n\n/**\n * God-rays (crepuscular rays)\n *\n * Similar implementation to the one used by Crytek for CryEngine 2 [Sousa2008].\n * Blurs a mask generated from the depth map along radial lines emanating from the light\n * source. The blur repeatedly applies a blur filter of increasing support but constant\n * sample count to produce a blur filter with large support.\n *\n * My implementation performs 3 passes, similar to the implementation from Sousa. I found\n * just 6 samples per pass produced acceptable results. The blur is applied three times,\n * with decreasing filter support. The result is equivalent to a single pass with\n * 6*6*6 = 216 samples.\n *\n * References:\n * - [Sousa2008, Crysis Next Gen Effects, GDC2008](http://www.crytek.com/sites/default/files/GDC08_SousaT_CrysisEffects.ppt).\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst GodRaysDepthMaskShader = {\n\n\tname: 'GodRaysDepthMaskShader',\n\n\tuniforms: {\n\n\t\ttInput: {\n\t\t\tvalue: null\n\t\t}\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t vUv = uv;\n\t\t gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t }`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tuniform sampler2D tInput;\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = vec4( 1.0 ) - texture2D( tInput, vUv );\n\n\t\t}`\n\n};\n\n\n/**\n * The god-ray generation shader.\n *\n * First pass:\n *\n * The depth map is blurred along radial lines towards the \"sun\". The\n * output is written to a temporary render target (I used a 1/4 sized\n * target).\n *\n * Pass two & three:\n *\n * The results of the previous pass are re-blurred, each time with a\n * decreased distance between samples.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst GodRaysGenerateShader = {\n\n\tname: 'GodRaysGenerateShader',\n\n\tuniforms: {\n\n\t\ttInput: {\n\t\t\tvalue: null\n\t\t},\n\t\tfStepSize: {\n\t\t\tvalue: 1.0\n\t\t},\n\t\tvSunPositionScreenSpace: {\n\t\t\tvalue: new Vector3()\n\t\t}\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t vUv = uv;\n\t\t gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t }`,\n\n\tfragmentShader: /* glsl */`\n\n\t\t#define TAPS_PER_PASS 6.0\n\n\t\tvarying vec2 vUv;\n\n\t\tuniform sampler2D tInput;\n\n\t\tuniform vec3 vSunPositionScreenSpace;\n\t\tuniform float fStepSize; // filter step size\n\n\t\tvoid main() {\n\n\t\t// delta from current pixel to \"sun\" position\n\n\t\t\tvec2 delta = vSunPositionScreenSpace.xy - vUv;\n\t\t\tfloat dist = length( delta );\n\n\t\t// Step vector (uv space)\n\n\t\t\tvec2 stepv = fStepSize * delta / dist;\n\n\t\t// Number of iterations between pixel and sun\n\n\t\t\tfloat iters = dist/fStepSize;\n\n\t\t\tvec2 uv = vUv.xy;\n\t\t\tfloat col = 0.0;\n\n\t\t// This breaks ANGLE in Chrome 22\n\t\t//\t- see http://code.google.com/p/chromium/issues/detail?id=153105\n\n\t\t/*\n\t\t// Unrolling didn't do much on my hardware (ATI Mobility Radeon 3450),\n\t\t// so i've just left the loop\n\n\t\t\"for ( float i = 0.0; i < TAPS_PER_PASS; i += 1.0 ) {\",\n\n\t\t// Accumulate samples, making sure we don't walk past the light source.\n\n\t\t// The check for uv.y < 1 would not be necessary with \"border\" UV wrap\n\t\t// mode, with a black border color. I don't think this is currently\n\t\t// exposed by three.js. As a result there might be artifacts when the\n\t\t// sun is to the left, right or bottom of screen as these cases are\n\t\t// not specifically handled.\n\n\t\t\"\tcol += ( i <= iters && uv.y < 1.0 ? texture2D( tInput, uv ).r : 0.0 );\",\n\t\t\"\tuv += stepv;\",\n\n\t\t\"}\",\n\t\t*/\n\n\t\t// Unrolling loop manually makes it work in ANGLE\n\n\t\t\tfloat f = min( 1.0, max( vSunPositionScreenSpace.z / 1000.0, 0.0 ) ); // used to fade out godrays\n\n\t\t\tif ( 0.0 <= iters && uv.y < 1.0 ) col += texture2D( tInput, uv ).r * f;\n\t\t\tuv += stepv;\n\n\t\t\tif ( 1.0 <= iters && uv.y < 1.0 ) col += texture2D( tInput, uv ).r * f;\n\t\t\tuv += stepv;\n\n\t\t\tif ( 2.0 <= iters && uv.y < 1.0 ) col += texture2D( tInput, uv ).r * f;\n\t\t\tuv += stepv;\n\n\t\t\tif ( 3.0 <= iters && uv.y < 1.0 ) col += texture2D( tInput, uv ).r * f;\n\t\t\tuv += stepv;\n\n\t\t\tif ( 4.0 <= iters && uv.y < 1.0 ) col += texture2D( tInput, uv ).r * f;\n\t\t\tuv += stepv;\n\n\t\t\tif ( 5.0 <= iters && uv.y < 1.0 ) col += texture2D( tInput, uv ).r * f;\n\t\t\tuv += stepv;\n\n\t\t// Should technically be dividing by 'iters but 'TAPS_PER_PASS' smooths out\n\t\t// objectionable artifacts, in particular near the sun position. The side\n\t\t// effect is that the result is darker than it should be around the sun, as\n\t\t// TAPS_PER_PASS is greater than the number of samples actually accumulated.\n\t\t// When the result is inverted (in the shader 'godrays_combine this produces\n\t\t// a slight bright spot at the position of the sun, even when it is occluded.\n\n\t\t\tgl_FragColor = vec4( col/TAPS_PER_PASS );\n\t\t\tgl_FragColor.a = 1.0;\n\n\t\t}`\n\n};\n\n/**\n * Additively applies god rays from texture tGodRays to a background (tColors).\n * fGodRayIntensity attenuates the god rays.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst GodRaysCombineShader = {\n\n\tname: 'GodRaysCombineShader',\n\n\tuniforms: {\n\n\t\ttColors: {\n\t\t\tvalue: null\n\t\t},\n\n\t\ttGodRays: {\n\t\t\tvalue: null\n\t\t},\n\n\t\tfGodRayIntensity: {\n\t\t\tvalue: 0.69\n\t\t}\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tuniform sampler2D tColors;\n\t\tuniform sampler2D tGodRays;\n\n\t\tuniform float fGodRayIntensity;\n\n\t\tvoid main() {\n\n\t\t// Since THREE.MeshDepthMaterial renders foreground objects white and background\n\t\t// objects black, the god-rays will be white streaks. Therefore value is inverted\n\t\t// before being combined with tColors\n\n\t\t\tgl_FragColor = texture2D( tColors, vUv ) + fGodRayIntensity * vec4( 1.0 - texture2D( tGodRays, vUv ).r );\n\t\t\tgl_FragColor.a = 1.0;\n\n\t\t}`\n\n};\n\n\n/**\n * A dodgy sun/sky shader. Makes a bright spot at the sun location. Would be\n * cheaper/faster/simpler to implement this as a simple sun sprite.\n *\n * @constant\n * @type {Object}\n */\nconst GodRaysFakeSunShader = {\n\n\tname: 'GodRaysFakeSunShader',\n\n\tuniforms: {\n\n\t\tvSunPositionScreenSpace: {\n\t\t\tvalue: new Vector3()\n\t\t},\n\n\t\tfAspect: {\n\t\t\tvalue: 1.0\n\t\t},\n\n\t\tsunColor: {\n\t\t\tvalue: new Color( 0xffee00 )\n\t\t},\n\n\t\tbgColor: {\n\t\t\tvalue: new Color( 0x000000 )\n\t\t}\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tuniform vec3 vSunPositionScreenSpace;\n\t\tuniform float fAspect;\n\n\t\tuniform vec3 sunColor;\n\t\tuniform vec3 bgColor;\n\n\t\tvoid main() {\n\n\t\t\tvec2 diff = vUv - vSunPositionScreenSpace.xy;\n\n\t\t// Correct for aspect ratio\n\n\t\t\tdiff.x *= fAspect;\n\n\t\t\tfloat prop = clamp( length( diff ) / 0.5, 0.0, 1.0 );\n\t\t\tprop = 0.35 * pow( 1.0 - prop, 3.0 );\n\n\t\t\tgl_FragColor.xyz = ( vSunPositionScreenSpace.z > 0.0 ) ? mix( sunColor, bgColor, 1.0 - prop ) : bgColor;\n\t\t\tgl_FragColor.w = 1.0;\n\n\t\t}`\n\n};\n\nexport { GodRaysDepthMaskShader, GodRaysGenerateShader, GodRaysCombineShader, GodRaysFakeSunShader };\n", "/**\n * @module HorizontalBlurShader\n * @three_import import { HorizontalBlurShader } from 'three/addons/shaders/HorizontalBlurShader.js';\n */\n\n/**\n * Two pass Gaussian blur filter (horizontal and vertical blur shaders).\n *\n * References:\n * - {@link http://www.cake23.de/traveling-wavefronts-lit-up.html}.\n *\n * - 9 samples per pass\n * - standard deviation 2.7\n * - \"h\" and \"v\" parameters should be set to \"1 / width\" and \"1 / height\"\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst HorizontalBlurShader = {\n\n\tname: 'HorizontalBlurShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'h': { value: 1.0 / 512.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform float h;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 sum = vec4( 0.0 );\n\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x - 4.0 * h, vUv.y ) ) * 0.051;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x - 3.0 * h, vUv.y ) ) * 0.0918;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x - 2.0 * h, vUv.y ) ) * 0.12245;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x - 1.0 * h, vUv.y ) ) * 0.1531;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y ) ) * 0.1633;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x + 1.0 * h, vUv.y ) ) * 0.1531;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x + 2.0 * h, vUv.y ) ) * 0.12245;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x + 3.0 * h, vUv.y ) ) * 0.0918;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * h, vUv.y ) ) * 0.051;\n\n\t\t\tgl_FragColor = sum;\n\n\t\t}`\n\n};\n\nexport { HorizontalBlurShader };\n", "/**\n * @module HorizontalTiltShiftShader\n * @three_import import { HorizontalTiltShiftShader } from 'three/addons/shaders/HorizontalTiltShiftShader.js';\n */\n\n/**\n * Simple fake tilt-shift effect, modulating two pass Gaussian blur (see above) by vertical position.\n *\n * - 9 samples per pass\n * - standard deviation 2.7\n * - \"h\" and \"v\" parameters should be set to \"1 / width\" and \"1 / height\"\n * - \"r\" parameter control where \"focused\" horizontal line lies\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst HorizontalTiltShiftShader = {\n\n\tname: 'HorizontalTiltShiftShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'h': { value: 1.0 / 512.0 },\n\t\t'r': { value: 0.35 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform float h;\n\t\tuniform float r;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 sum = vec4( 0.0 );\n\n\t\t\tfloat hh = h * abs( r - vUv.y );\n\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x - 4.0 * hh, vUv.y ) ) * 0.051;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x - 3.0 * hh, vUv.y ) ) * 0.0918;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x - 2.0 * hh, vUv.y ) ) * 0.12245;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x - 1.0 * hh, vUv.y ) ) * 0.1531;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y ) ) * 0.1633;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x + 1.0 * hh, vUv.y ) ) * 0.1531;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x + 2.0 * hh, vUv.y ) ) * 0.12245;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x + 3.0 * hh, vUv.y ) ) * 0.0918;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x + 4.0 * hh, vUv.y ) ) * 0.051;\n\n\t\t\tgl_FragColor = sum;\n\n\t\t}`\n\n};\n\nexport { HorizontalTiltShiftShader };\n", "/**\n * @module HueSaturationShader\n * @three_import import { HueSaturationShader } from 'three/addons/shaders/HueSaturationShader.js';\n */\n\n/**\n * Hue and saturation adjustment, {@link https://github.com/evanw/glfx.js}.\n *\n * hue: -1 to 1 (-1 is 180 degrees in the negative direction, 0 is no change, etc.\n * saturation: -1 to 1 (-1 is solid gray, 0 is no change, and 1 is maximum contrast)\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst HueSaturationShader = {\n\n\tname: 'HueSaturationShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'hue': { value: 0 },\n\t\t'saturation': { value: 0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform float hue;\n\t\tuniform float saturation;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tgl_FragColor = texture2D( tDiffuse, vUv );\n\n\t\t\t// hue\n\t\t\tfloat angle = hue * 3.14159265;\n\t\t\tfloat s = sin(angle), c = cos(angle);\n\t\t\tvec3 weights = (vec3(2.0 * c, -sqrt(3.0) * s - c, sqrt(3.0) * s - c) + 1.0) / 3.0;\n\t\t\tfloat len = length(gl_FragColor.rgb);\n\t\t\tgl_FragColor.rgb = vec3(\n\t\t\t\tdot(gl_FragColor.rgb, weights.xyz),\n\t\t\t\tdot(gl_FragColor.rgb, weights.zxy),\n\t\t\t\tdot(gl_FragColor.rgb, weights.yzx)\n\t\t\t);\n\n\t\t\t// saturation\n\t\t\tfloat average = (gl_FragColor.r + gl_FragColor.g + gl_FragColor.b) / 3.0;\n\t\t\tif (saturation > 0.0) {\n\t\t\t\tgl_FragColor.rgb += (average - gl_FragColor.rgb) * (1.0 - 1.0 / (1.001 - saturation));\n\t\t\t} else {\n\t\t\t\tgl_FragColor.rgb += (average - gl_FragColor.rgb) * (-saturation);\n\t\t\t}\n\n\t\t}`\n\n};\n\nexport { HueSaturationShader };\n", "/**\n * @module KaleidoShader\n * @three_import import { KaleidoShader } from 'three/addons/shaders/KaleidoShader.js';\n */\n\n/**\n * Kaleidoscope Shader.\n * Radial reflection around center point\n * Ported from: {@link http://pixelshaders.com/editor/}\n * by [Toby Schachman](http://tobyschachman.com/)\n *\n * sides: number of reflections\n * angle: initial angle in radians\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst KaleidoShader = {\n\n\tname: 'KaleidoShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'sides': { value: 6.0 },\n\t\t'angle': { value: 0.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform float sides;\n\t\tuniform float angle;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec2 p = vUv - 0.5;\n\t\t\tfloat r = length(p);\n\t\t\tfloat a = atan(p.y, p.x) + angle;\n\t\t\tfloat tau = 2. * 3.1416 ;\n\t\t\ta = mod(a, tau/sides);\n\t\t\ta = abs(a - tau/sides/2.) ;\n\t\t\tp = r * vec2(cos(a), sin(a));\n\t\t\tvec4 color = texture2D(tDiffuse, p + 0.5);\n\t\t\tgl_FragColor = color;\n\n\t\t}`\n\n};\n\nexport { KaleidoShader };\n", "/**\n * @module LuminosityShader\n * @three_import import { LuminosityShader } from 'three/addons/shaders/LuminosityShader.js';\n */\n\n/**\n * Luminosity shader.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst LuminosityShader = {\n\n\tname: 'LuminosityShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\t#include <common>\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\n\t\t\tfloat l = luminance( texel.rgb );\n\n\t\t\tgl_FragColor = vec4( l, l, l, texel.w );\n\n\t\t}`\n\n};\n\nexport { LuminosityShader };\n", "/**\n * @module MirrorShader\n * @three_import import { MirrorShader } from 'three/addons/shaders/MirrorShader.js';\n */\n\n/**\n * Copies half the input to the other half.\n *\n * side: side of input to mirror (0 = left, 1 = right, 2 = top, 3 = bottom).\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst MirrorShader = {\n\n\tname: 'MirrorShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'side': { value: 1 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform int side;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec2 p = vUv;\n\t\t\tif (side == 0){\n\t\t\t\tif (p.x > 0.5) p.x = 1.0 - p.x;\n\t\t\t}else if (side == 1){\n\t\t\t\tif (p.x < 0.5) p.x = 1.0 - p.x;\n\t\t\t}else if (side == 2){\n\t\t\t\tif (p.y < 0.5) p.y = 1.0 - p.y;\n\t\t\t}else if (side == 3){\n\t\t\t\tif (p.y > 0.5) p.y = 1.0 - p.y;\n\t\t\t}\n\t\t\tvec4 color = texture2D(tDiffuse, p);\n\t\t\tgl_FragColor = color;\n\n\t\t}`\n\n};\n\nexport { MirrorShader };\n", "import {\n\tVector2\n} from 'three';\n\n/**\n * @module NormalMapShader\n * @three_import import { NormalMapShader } from 'three/addons/shaders/NormalMapShader.js';\n */\n\n/**\n * Normal map shader, compute normals from heightmap.\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst NormalMapShader = {\n\n\tname: 'NormalMapShader',\n\n\tuniforms: {\n\n\t\t'heightMap': { value: null },\n\t\t'resolution': { value: new Vector2( 512, 512 ) },\n\t\t'scale': { value: new Vector2( 1, 1 ) },\n\t\t'height': { value: 0.05 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform float height;\n\t\tuniform vec2 resolution;\n\t\tuniform sampler2D heightMap;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tfloat val = texture2D( heightMap, vUv ).x;\n\n\t\t\tfloat valU = texture2D( heightMap, vUv + vec2( 1.0 / resolution.x, 0.0 ) ).x;\n\t\t\tfloat valV = texture2D( heightMap, vUv + vec2( 0.0, 1.0 / resolution.y ) ).x;\n\n\t\t\tgl_FragColor = vec4( ( 0.5 * normalize( vec3( val - valU, val - valV, height  ) ) + 0.5 ), 1.0 );\n\n\t\t}`\n\n};\n\nexport { NormalMapShader };\n", "/**\n * @module RGBShiftShader\n * @three_import import { RGBShiftShader } from 'three/addons/shaders/RGBShiftShader.js';\n */\n\n/**\n * RGB Shift Shader\n * Shifts red and blue channels from center in opposite directions\n * Ported from https://web.archive.org/web/20090820185047/http://kriss.cx/tom/2009/05/rgb-shift/\n * by Tom Butterworth / https://web.archive.org/web/20090810054752/http://kriss.cx/tom/\n *\n * amount: shift distance (1 is width of input)\n * angle: shift angle in radians\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst RGBShiftShader = {\n\n\tname: 'RGBShiftShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'amount': { value: 0.005 },\n\t\t'angle': { value: 0.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform float amount;\n\t\tuniform float angle;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec2 offset = amount * vec2( cos(angle), sin(angle));\n\t\t\tvec4 cr = texture2D(tDiffuse, vUv + offset);\n\t\t\tvec4 cga = texture2D(tDiffuse, vUv);\n\t\t\tvec4 cb = texture2D(tDiffuse, vUv - offset);\n\t\t\tgl_FragColor = vec4(cr.r, cga.g, cb.b, cga.a);\n\n\t\t}`\n\n};\n\nexport { RGBShiftShader };\n", "/**\n * @module SepiaShader\n * @three_import import { SepiaShader } from 'three/addons/shaders/SepiaShader.js';\n */\n\n/**\n * Sepia tone shader based on [glfx.js sepia shader](https://github.com/evanw/glfx.js).\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst SepiaShader = {\n\n\tname: 'SepiaShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'amount': { value: 1.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform float amount;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 color = texture2D( tDiffuse, vUv );\n\t\t\tvec3 c = color.rgb;\n\n\t\t\tcolor.r = dot( c, vec3( 1.0 - 0.607 * amount, 0.769 * amount, 0.189 * amount ) );\n\t\t\tcolor.g = dot( c, vec3( 0.349 * amount, 1.0 - 0.314 * amount, 0.168 * amount ) );\n\t\t\tcolor.b = dot( c, vec3( 0.272 * amount, 0.534 * amount, 1.0 - 0.869 * amount ) );\n\n\t\t\tgl_FragColor = vec4( min( vec3( 1.0 ), color.rgb ), color.a );\n\n\t\t}`\n\n};\n\nexport { SepiaShader };\n", "import {\n\tVector2\n} from 'three';\n\n/**\n * @module SobelOperatorShader\n * @three_import import { SobelOperatorShader } from 'three/addons/shaders/SobelOperatorShader.js';\n */\n\n/**\n * Sobel Edge Detection (see {@link https://youtu.be/uihBwtPIBxM}).\n *\n * As mentioned in the video the Sobel operator expects a grayscale image as input.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst SobelOperatorShader = {\n\n\tname: 'SobelOperatorShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'resolution': { value: new Vector2() }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform vec2 resolution;\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec2 texel = vec2( 1.0 / resolution.x, 1.0 / resolution.y );\n\n\t\t// kernel definition (in glsl matrices are filled in column-major order)\n\n\t\t\tconst mat3 Gx = mat3( -1, -2, -1, 0, 0, 0, 1, 2, 1 ); // x direction kernel\n\t\t\tconst mat3 Gy = mat3( -1, 0, 1, -2, 0, 2, -1, 0, 1 ); // y direction kernel\n\n\t\t// fetch the 3x3 neighbourhood of a fragment\n\n\t\t// first column\n\n\t\t\tfloat tx0y0 = texture2D( tDiffuse, vUv + texel * vec2( -1, -1 ) ).r;\n\t\t\tfloat tx0y1 = texture2D( tDiffuse, vUv + texel * vec2( -1,  0 ) ).r;\n\t\t\tfloat tx0y2 = texture2D( tDiffuse, vUv + texel * vec2( -1,  1 ) ).r;\n\n\t\t// second column\n\n\t\t\tfloat tx1y0 = texture2D( tDiffuse, vUv + texel * vec2(  0, -1 ) ).r;\n\t\t\tfloat tx1y1 = texture2D( tDiffuse, vUv + texel * vec2(  0,  0 ) ).r;\n\t\t\tfloat tx1y2 = texture2D( tDiffuse, vUv + texel * vec2(  0,  1 ) ).r;\n\n\t\t// third column\n\n\t\t\tfloat tx2y0 = texture2D( tDiffuse, vUv + texel * vec2(  1, -1 ) ).r;\n\t\t\tfloat tx2y1 = texture2D( tDiffuse, vUv + texel * vec2(  1,  0 ) ).r;\n\t\t\tfloat tx2y2 = texture2D( tDiffuse, vUv + texel * vec2(  1,  1 ) ).r;\n\n\t\t// gradient value in x direction\n\n\t\t\tfloat valueGx = Gx[0][0] * tx0y0 + Gx[1][0] * tx1y0 + Gx[2][0] * tx2y0 +\n\t\t\t\tGx[0][1] * tx0y1 + Gx[1][1] * tx1y1 + Gx[2][1] * tx2y1 +\n\t\t\t\tGx[0][2] * tx0y2 + Gx[1][2] * tx1y2 + Gx[2][2] * tx2y2;\n\n\t\t// gradient value in y direction\n\n\t\t\tfloat valueGy = Gy[0][0] * tx0y0 + Gy[1][0] * tx1y0 + Gy[2][0] * tx2y0 +\n\t\t\t\tGy[0][1] * tx0y1 + Gy[1][1] * tx1y1 + Gy[2][1] * tx2y1 +\n\t\t\t\tGy[0][2] * tx0y2 + Gy[1][2] * tx1y2 + Gy[2][2] * tx2y2;\n\n\t\t// magnitude of the total gradient\n\n\t\t\tfloat G = sqrt( ( valueGx * valueGx ) + ( valueGy * valueGy ) );\n\n\t\t\tgl_FragColor = vec4( vec3( G ), 1 );\n\n\t\t}`\n\n};\n\nexport { SobelOperatorShader };\n", "import {\n\tColor,\n\tShaderChunk,\n\tShaderLib,\n\tUniformsUtils\n} from 'three';\n\nfunction replaceAll( string, find, replace ) {\n\n\treturn string.split( find ).join( replace );\n\n}\n\nconst meshphong_frag_head = ShaderChunk[ 'meshphong_frag' ].slice( 0, ShaderChunk[ 'meshphong_frag' ].indexOf( 'void main() {' ) );\nconst meshphong_frag_body = ShaderChunk[ 'meshphong_frag' ].slice( ShaderChunk[ 'meshphong_frag' ].indexOf( 'void main() {' ) );\n\n/**\n * @module SubsurfaceScatteringShader\n * @three_import import { SubsurfaceScatteringShader } from 'three/addons/shaders/SubsurfaceScatteringShader.js';\n */\n\n/**\n * Subsurface Scattering shader.\n *\n * Based on GDC 2011 \u2013 [Approximating Translucency for a Fast, Cheap and Convincing Subsurface Scattering Look](https://colinbarrebrisebois.com/2011/03/07/gdc-2011-approximating-translucency-for-a-fast-cheap-and-convincing-subsurface-scattering-look/)\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst SubsurfaceScatteringShader = {\n\n\tname: 'SubsurfaceScatteringShader',\n\n\tuniforms: UniformsUtils.merge( [\n\t\tShaderLib[ 'phong' ].uniforms,\n\t\t{\n\t\t\t'thicknessMap': { value: null },\n\t\t\t'thicknessColor': { value: new Color( 0xffffff ) },\n\t\t\t'thicknessDistortion': { value: 0.1 },\n\t\t\t'thicknessAmbient': { value: 0.0 },\n\t\t\t'thicknessAttenuation': { value: 0.1 },\n\t\t\t'thicknessPower': { value: 2.0 },\n\t\t\t'thicknessScale': { value: 10.0 }\n\t\t}\n\n\t] ),\n\n\tvertexShader: [\n\t\t'#define USE_UV',\n\t\tShaderChunk[ 'meshphong_vert' ],\n\t].join( '\\n' ),\n\n\tfragmentShader: [\n\t\t'#define USE_UV',\n\t\t'#define SUBSURFACE',\n\n\t\tmeshphong_frag_head,\n\n\t\t'uniform sampler2D thicknessMap;',\n\t\t'uniform float thicknessPower;',\n\t\t'uniform float thicknessScale;',\n\t\t'uniform float thicknessDistortion;',\n\t\t'uniform float thicknessAmbient;',\n\t\t'uniform float thicknessAttenuation;',\n\t\t'uniform vec3 thicknessColor;',\n\n\t\t'void RE_Direct_Scattering(const in IncidentLight directLight, const in vec2 uv, const in vec3 geometryPosition, const in vec3 geometryNormal, const in vec3 geometryViewDir, const in vec3 geometryClearcoatNormal, inout ReflectedLight reflectedLight) {',\n\t\t'\tvec3 thickness = thicknessColor * texture2D(thicknessMap, uv).r;',\n\t\t'\tvec3 scatteringHalf = normalize(directLight.direction + (geometryNormal * thicknessDistortion));',\n\t\t'\tfloat scatteringDot = pow(saturate(dot(geometryViewDir, -scatteringHalf)), thicknessPower) * thicknessScale;',\n\t\t'\tvec3 scatteringIllu = (scatteringDot + thicknessAmbient) * thickness;',\n\t\t'\treflectedLight.directDiffuse += scatteringIllu * thicknessAttenuation * directLight.color;',\n\t\t'}',\n\n\t\tmeshphong_frag_body.replace( '#include <lights_fragment_begin>',\n\n\t\t\treplaceAll(\n\t\t\t\tShaderChunk[ 'lights_fragment_begin' ],\n\t\t\t\t'RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );',\n\t\t\t\t[\n\t\t\t\t\t'RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );',\n\n\t\t\t\t\t'#if defined( SUBSURFACE ) && defined( USE_UV )',\n\t\t\t\t\t' RE_Direct_Scattering(directLight, vUv, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, reflectedLight);',\n\t\t\t\t\t'#endif',\n\t\t\t\t].join( '\\n' )\n\t\t\t),\n\n\t\t),\n\n\t].join( '\\n' ),\n\n};\n\nexport { SubsurfaceScatteringShader };\n", "/**\n * @module TriangleBlurShader\n * @three_import import { TriangleBlurShader } from 'three/addons/shaders/TriangleBlurShader.js';\n */\n\n/**\n * Simulates the look of the two-strip technicolor process popular in early 20th century films.\n * More historical info here: {@link http://www.widescreenmuseum.com/oldcolor/technicolor1.htm}\n * Demo here: {@link http://charliehoey.com/technicolor_shader/shader_test.html}\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst TechnicolorShader = {\n\n\tname: 'TechnicolorShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 tex = texture2D( tDiffuse, vec2( vUv.x, vUv.y ) );\n\t\t\tvec4 newTex = vec4(tex.r, (tex.g + tex.b) * .5, (tex.g + tex.b) * .5, 1.0);\n\n\t\t\tgl_FragColor = newTex;\n\n\t\t}`\n\n};\n\nexport { TechnicolorShader };\n", "import {\n\tColor,\n\tVector3\n} from 'three';\n\n/**\n * Collection of toon shaders.\n *\n * @module TriangleBlurShader\n * @three_import import * as ToonShader from 'three/addons/shaders/ToonShader.js';\n */\n\n/**\n * Toon1 shader.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst ToonShader1 = {\n\n\tname: 'ToonShader1',\n\n\tuniforms: {\n\n\t\t'uDirLightPos': { value: new Vector3() },\n\t\t'uDirLightColor': { value: new Color( 0xeeeeee ) },\n\n\t\t'uAmbientLightColor': { value: new Color( 0x050505 ) },\n\n\t\t'uBaseColor': { value: new Color( 0xffffff ) }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec3 vNormal;\n\t\tvarying vec3 vRefract;\n\n\t\tvoid main() {\n\n\t\t\tvec4 worldPosition = modelMatrix * vec4( position, 1.0 );\n\t\t\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\n\t\t\tvec3 worldNormal = normalize ( mat3( modelMatrix[0].xyz, modelMatrix[1].xyz, modelMatrix[2].xyz ) * normal );\n\n\t\t\tvNormal = normalize( normalMatrix * normal );\n\n\t\t\tvec3 I = worldPosition.xyz - cameraPosition;\n\t\t\tvRefract = refract( normalize( I ), worldNormal, 1.02 );\n\n\t\t\tgl_Position = projectionMatrix * mvPosition;\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform vec3 uBaseColor;\n\n\t\tuniform vec3 uDirLightPos;\n\t\tuniform vec3 uDirLightColor;\n\n\t\tuniform vec3 uAmbientLightColor;\n\n\t\tvarying vec3 vNormal;\n\n\t\tvarying vec3 vRefract;\n\n\t\tvoid main() {\n\n\t\t\tfloat directionalLightWeighting = max( dot( normalize( vNormal ), uDirLightPos ), 0.0);\n\t\t\tvec3 lightWeighting = uAmbientLightColor + uDirLightColor * directionalLightWeighting;\n\n\t\t\tfloat intensity = smoothstep( - 0.5, 1.0, pow( length(lightWeighting), 20.0 ) );\n\t\t\tintensity += length(lightWeighting) * 0.2;\n\n\t\t\tfloat cameraWeighting = dot( normalize( vNormal ), vRefract );\n\t\t\tintensity += pow( 1.0 - length( cameraWeighting ), 6.0 );\n\t\t\tintensity = intensity * 0.2 + 0.3;\n\n\t\t\tif ( intensity < 0.50 ) {\n\n\t\t\t\tgl_FragColor = vec4( 2.0 * intensity * uBaseColor, 1.0 );\n\n\t\t\t} else {\n\n\t\t\t\tgl_FragColor = vec4( 1.0 - 2.0 * ( 1.0 - intensity ) * ( 1.0 - uBaseColor ), 1.0 );\n\n\t\t\t}\n\n\t\t\t#include <colorspace_fragment>\n\n\t\t}`\n\n};\n/**\n * Toon2 shader.\n *\n * @constant\n * @type {Object}\n */\nconst ToonShader2 = {\n\n\tuniforms: {\n\n\t\t'uDirLightPos': { value: new Vector3() },\n\t\t'uDirLightColor': { value: new Color( 0xeeeeee ) },\n\n\t\t'uAmbientLightColor': { value: new Color( 0x050505 ) },\n\n\t\t'uBaseColor': { value: new Color( 0xeeeeee ) },\n\t\t'uLineColor1': { value: new Color( 0x808080 ) },\n\t\t'uLineColor2': { value: new Color( 0x000000 ) },\n\t\t'uLineColor3': { value: new Color( 0x000000 ) },\n\t\t'uLineColor4': { value: new Color( 0x000000 ) }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec3 vNormal;\n\n\t\tvoid main() {\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\tvNormal = normalize( normalMatrix * normal );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform vec3 uBaseColor;\n\t\tuniform vec3 uLineColor1;\n\t\tuniform vec3 uLineColor2;\n\t\tuniform vec3 uLineColor3;\n\t\tuniform vec3 uLineColor4;\n\n\t\tuniform vec3 uDirLightPos;\n\t\tuniform vec3 uDirLightColor;\n\n\t\tuniform vec3 uAmbientLightColor;\n\n\t\tvarying vec3 vNormal;\n\n\t\tvoid main() {\n\n\t\t\tfloat camera = max( dot( normalize( vNormal ), vec3( 0.0, 0.0, 1.0 ) ), 0.4);\n\t\t\tfloat light = max( dot( normalize( vNormal ), uDirLightPos ), 0.0);\n\n\t\t\tgl_FragColor = vec4( uBaseColor, 1.0 );\n\n\t\t\tif ( length(uAmbientLightColor + uDirLightColor * light) < 1.00 ) {\n\n\t\t\t\tgl_FragColor *= vec4( uLineColor1, 1.0 );\n\n\t\t\t}\n\n\t\t\tif ( length(uAmbientLightColor + uDirLightColor * camera) < 0.50 ) {\n\n\t\t\t\tgl_FragColor *= vec4( uLineColor2, 1.0 );\n\n\t\t\t}\n\n\t\t\t#include <colorspace_fragment>\n\n\t\t}`\n\n};\n\n/**\n * Toon Hatching shader.\n *\n * @constant\n * @type {Object}\n */\nconst ToonShaderHatching = {\n\n\tuniforms: {\n\n\t\t'uDirLightPos':\t{ value: new Vector3() },\n\t\t'uDirLightColor': { value: new Color( 0xeeeeee ) },\n\n\t\t'uAmbientLightColor': { value: new Color( 0x050505 ) },\n\n\t\t'uBaseColor': { value: new Color( 0xffffff ) },\n\t\t'uLineColor1': { value: new Color( 0x000000 ) },\n\t\t'uLineColor2': { value: new Color( 0x000000 ) },\n\t\t'uLineColor3': { value: new Color( 0x000000 ) },\n\t\t'uLineColor4': { value: new Color( 0x000000 ) }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec3 vNormal;\n\n\t\tvoid main() {\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\tvNormal = normalize( normalMatrix * normal );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform vec3 uBaseColor;\n\t\tuniform vec3 uLineColor1;\n\t\tuniform vec3 uLineColor2;\n\t\tuniform vec3 uLineColor3;\n\t\tuniform vec3 uLineColor4;\n\n\t\tuniform vec3 uDirLightPos;\n\t\tuniform vec3 uDirLightColor;\n\n\t\tuniform vec3 uAmbientLightColor;\n\n\t\tvarying vec3 vNormal;\n\n\t\tvoid main() {\n\n\t\t\tfloat directionalLightWeighting = max( dot( normalize(vNormal), uDirLightPos ), 0.0);\n\t\t\tvec3 lightWeighting = uAmbientLightColor + uDirLightColor * directionalLightWeighting;\n\n\t\t\tgl_FragColor = vec4( uBaseColor, 1.0 );\n\n\t\t\tif ( length(lightWeighting) < 1.00 ) {\n\n\t\t\t\tif ( mod(gl_FragCoord.x + gl_FragCoord.y, 10.0) == 0.0) {\n\n\t\t\t\t\tgl_FragColor = vec4( uLineColor1, 1.0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( length(lightWeighting) < 0.75 ) {\n\n\t\t\t\tif (mod(gl_FragCoord.x - gl_FragCoord.y, 10.0) == 0.0) {\n\n\t\t\t\t\tgl_FragColor = vec4( uLineColor2, 1.0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( length(lightWeighting) < 0.50 ) {\n\n\t\t\t\tif (mod(gl_FragCoord.x + gl_FragCoord.y - 5.0, 10.0) == 0.0) {\n\n\t\t\t\t\tgl_FragColor = vec4( uLineColor3, 1.0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( length(lightWeighting) < 0.3465 ) {\n\n\t\t\t\tif (mod(gl_FragCoord.x - gl_FragCoord.y - 5.0, 10.0) == 0.0) {\n\n\t\t\t\t\tgl_FragColor = vec4( uLineColor4, 1.0 );\n\n\t\t\t}\n\n\t\t\t}\n\n\t\t\t#include <colorspace_fragment>\n\n\t\t}`\n\n};\n\n/**\n * Toon Dotted shader.\n *\n * @constant\n * @type {Object}\n */\nconst ToonShaderDotted = {\n\n\tuniforms: {\n\n\t\t'uDirLightPos':\t{ value: new Vector3() },\n\t\t'uDirLightColor': { value: new Color( 0xeeeeee ) },\n\n\t\t'uAmbientLightColor': { value: new Color( 0x050505 ) },\n\n\t\t'uBaseColor': { value: new Color( 0xffffff ) },\n\t\t'uLineColor1': { value: new Color( 0x000000 ) }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec3 vNormal;\n\n\t\tvoid main() {\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\tvNormal = normalize( normalMatrix * normal );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform vec3 uBaseColor;\n\t\tuniform vec3 uLineColor1;\n\t\tuniform vec3 uLineColor2;\n\t\tuniform vec3 uLineColor3;\n\t\tuniform vec3 uLineColor4;\n\n\t\tuniform vec3 uDirLightPos;\n\t\tuniform vec3 uDirLightColor;\n\n\t\tuniform vec3 uAmbientLightColor;\n\n\t\tvarying vec3 vNormal;\n\n\t\tvoid main() {\n\n\t\t\tfloat directionalLightWeighting = max( dot( normalize(vNormal), uDirLightPos ), 0.0);\n\t\t\tvec3 lightWeighting = uAmbientLightColor + uDirLightColor * directionalLightWeighting;\n\n\t\t\tgl_FragColor = vec4( uBaseColor, 1.0 );\n\n\t\t\tif ( length(lightWeighting) < 1.00 ) {\n\n\t\t\t\tif ( ( mod(gl_FragCoord.x, 4.001) + mod(gl_FragCoord.y, 4.0) ) > 6.00 ) {\n\n\t\t\t\t\tgl_FragColor = vec4( uLineColor1, 1.0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( length(lightWeighting) < 0.50 ) {\n\n\t\t\t\tif ( ( mod(gl_FragCoord.x + 2.0, 4.001) + mod(gl_FragCoord.y + 2.0, 4.0) ) > 6.00 ) {\n\n\t\t\t\t\tgl_FragColor = vec4( uLineColor1, 1.0 );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t#include <colorspace_fragment>\n\n\t\t}`\n\n};\n\nexport { ToonShader1, ToonShader2, ToonShaderHatching, ToonShaderDotted };\n", "import {\n\tVector2\n} from 'three';\n\n/**\n * @module TriangleBlurShader\n * @three_import import { TriangleBlurShader } from 'three/addons/shaders/TriangleBlurShader.js';\n */\n\n/**\n * Triangle blur shader based on [glfx.js triangle blur shader](https://github.com/evanw/glfx.js).\n *\n * A basic blur filter, which convolves the image with a\n * pyramid filter. The pyramid filter is separable and is applied as two\n * perpendicular triangle filters.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst TriangleBlurShader = {\n\n\tname: 'TriangleBlurShader',\n\n\tuniforms: {\n\n\t\t'texture': { value: null },\n\t\t'delta': { value: new Vector2( 1, 1 ) }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\t#include <common>\n\n\t\t#define ITERATIONS 10.0\n\n\t\tuniform sampler2D texture;\n\t\tuniform vec2 delta;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 color = vec4( 0.0 );\n\n\t\t\tfloat total = 0.0;\n\n\t\t// randomize the lookup values to hide the fixed number of samples\n\n\t\t\tfloat offset = rand( vUv );\n\n\t\t\tfor ( float t = -ITERATIONS; t <= ITERATIONS; t ++ ) {\n\n\t\t\t\tfloat percent = ( t + offset - 0.5 ) / ITERATIONS;\n\t\t\t\tfloat weight = 1.0 - abs( percent );\n\n\t\t\t\tcolor += texture2D( texture, vUv + delta * percent ) * weight;\n\t\t\t\ttotal += weight;\n\n\t\t\t}\n\n\t\t\tgl_FragColor = color / total;\n\n\t\t}`\n\n};\n\nexport { TriangleBlurShader };\n", "/**\n * @module UnpackDepthRGBAShader\n * @three_import import { UnpackDepthRGBAShader } from 'three/addons/shaders/UnpackDepthRGBAShader.js';\n */\n\n/**\n * Depth visualization shader that shows depth values as monochrome color.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst UnpackDepthRGBAShader = {\n\n\tname: 'UnpackDepthRGBAShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'opacity': { value: 1.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform float opacity;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tfloat depth = texture2D( tDiffuse, vUv ).r;\n\n\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\n\t\t\t\tgl_FragColor = vec4( vec3( depth ), opacity );\n\n\t\t\t#else\n\n\t\t\t\tgl_FragColor = vec4( vec3( 1.0 - depth ), opacity );\n\n\t\t\t#endif\n\n\t\t}`\n\n};\n\nexport { UnpackDepthRGBAShader };\n", "import {\n\tUniformsLib,\n\tUniformsUtils,\n\tMatrix4\n} from 'three';\n\n/**\n * @module VelocityShader\n * @three_import import { VelocityShader } from 'three/addons/shaders/VelocityShader.js';\n */\n\n/**\n * Mesh velocity shader by @bhouston.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst VelocityShader = {\n\n\tname: 'VelocityShader',\n\n\tuniforms: UniformsUtils.merge( [\n\t\tUniformsLib.common,\n\t\tUniformsLib.displacementmap,\n\t\t{\n\t\t\tmodelMatrixPrev: { value: new Matrix4() },\n\t\t\tcurrentProjectionViewMatrix: { value: new Matrix4() },\n\t\t\tpreviousProjectionViewMatrix: { value: new Matrix4() }\n\t\t}\n\t] ),\n\n\tvertexShader: /* glsl */`\n#define NORMAL\n\n#if defined( FLAT_SHADED ) || defined( USE_BUMPMAP ) || defined( USE_NORMALMAP_TANGENTSPACE )\n\n\tvarying vec3 vViewPosition;\n\n#endif\n\n#include <common>\n#include <packing>\n#include <uv_pars_vertex>\n#include <displacementmap_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nuniform mat4 previousProjectionViewMatrix;\nuniform mat4 currentProjectionViewMatrix;\n\nuniform mat4 modelMatrixPrev;\n\nvarying vec4 clipPositionCurrent;\nvarying vec4 clipPositionPrevious;\n\nvoid main() {\n\n\n\t#include <uv_vertex>\n\n\t#include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <displacementmap_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\n#ifdef USE_SKINNING\n\n\tvec4 mvPosition = modelViewMatrix * skinned;\n\tclipPositionCurrent  = currentProjectionViewMatrix * modelMatrix * skinned;\n\tclipPositionPrevious = previousProjectionViewMatrix * modelMatrixPrev * skinned;\n\n#else\n\n\tvec4 mvPosition = modelViewMatrix * vec4( transformed, 1.0 );\n\tclipPositionCurrent  = currentProjectionViewMatrix * modelMatrix * vec4( transformed, 1.0 );\n\tclipPositionPrevious = previousProjectionViewMatrix * modelMatrixPrev * vec4( transformed, 1.0 );\n\n#endif\n\n\tgl_Position = projectionMatrix * mvPosition;\n\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n}\n`,\n\tfragmentShader: /* glsl */`\n#define NORMAL\n\nuniform float opacity;\n\n#include <packing>\n#include <uv_pars_fragment>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvarying vec4 clipPositionCurrent;\nvarying vec4 clipPositionPrevious;\n\nvoid main() {\n\n\tvec4 diffuseColor = vec4( 1.0 );\n\tdiffuseColor.a = opacity;\n\n\t#include <map_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\n\tvec2 ndcPositionCurrent  = clipPositionCurrent.xy/clipPositionCurrent.w;\n\tvec2 ndcPositionPrevious = clipPositionPrevious.xy/clipPositionPrevious.w;\n\tvec2 vel = ( ndcPositionCurrent - ndcPositionPrevious ) * 0.5;\n\tvel = vel * 0.5 + 0.5;\n\tvec2 v1 = packDepthToRG(vel.x);\n\tvec2 v2 = packDepthToRG(vel.y);\n\tgl_FragColor = vec4(v1.x, v1.y, v2.x, v2.y);\n\n\t#include <logdepthbuf_fragment>\n\n}\n\n`\n};\n\nexport { VelocityShader };\n", "/**\n * @module VerticalBlurShader\n * @three_import import { VerticalBlurShader } from 'three/addons/shaders/VerticalBlurShader.js';\n */\n\n/**\n * Two pass Gaussian blur filter (horizontal and vertical blur shaders)\n * - see {@link http://www.cake23.de/traveling-wavefronts-lit-up.html}\n *\n * - 9 samples per pass\n * - standard deviation 2.7\n * - \"h\" and \"v\" parameters should be set to \"1 / width\" and \"1 / height\"\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst VerticalBlurShader = {\n\n\tname: 'VerticalBlurShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'v': { value: 1.0 / 512.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform float v;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 sum = vec4( 0.0 );\n\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 4.0 * v ) ) * 0.051;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 3.0 * v ) ) * 0.0918;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 2.0 * v ) ) * 0.12245;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 1.0 * v ) ) * 0.1531;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y ) ) * 0.1633;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 1.0 * v ) ) * 0.1531;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 2.0 * v ) ) * 0.12245;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 3.0 * v ) ) * 0.0918;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * v ) ) * 0.051;\n\n\t\t\tgl_FragColor = sum;\n\n\t\t}`\n\n};\n\nexport { VerticalBlurShader };\n", "/**\n * @module VerticalTiltShiftShader\n * @three_import import { VerticalTiltShiftShader } from 'three/addons/shaders/VerticalTiltShiftShader.js';\n */\n\n/**\n * Simple fake tilt-shift effect, modulating two pass Gaussian blur (see above) by vertical position\n *\n * - 9 samples per pass\n * - standard deviation 2.7\n * - \"h\" and \"v\" parameters should be set to \"1 / width\" and \"1 / height\"\n * - \"r\" parameter control where \"focused\" horizontal line lies\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst VerticalTiltShiftShader = {\n\n\tname: 'VerticalTiltShiftShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'v': { value: 1.0 / 512.0 },\n\t\t'r': { value: 0.35 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform float v;\n\t\tuniform float r;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 sum = vec4( 0.0 );\n\n\t\t\tfloat vv = v * abs( r - vUv.y );\n\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 4.0 * vv ) ) * 0.051;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 3.0 * vv ) ) * 0.0918;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 2.0 * vv ) ) * 0.12245;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y - 1.0 * vv ) ) * 0.1531;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y ) ) * 0.1633;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 1.0 * vv ) ) * 0.1531;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 2.0 * vv ) ) * 0.12245;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 3.0 * vv ) ) * 0.0918;\n\t\t\tsum += texture2D( tDiffuse, vec2( vUv.x, vUv.y + 4.0 * vv ) ) * 0.051;\n\n\t\t\tgl_FragColor = sum;\n\n\t\t}`\n\n};\n\nexport { VerticalTiltShiftShader };\n", "/**\n * @module VignetteShader\n * @three_import import { VignetteShader } from 'three/addons/shaders/VignetteShader.js';\n */\n\n/**\n * Based on [PaintEffect postprocess from ro.me](http://code.google.com/p/3-dreams-of-black/source/browse/deploy/js/effects/PaintEffect.js).\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst VignetteShader = {\n\n\tname: 'VignetteShader',\n\n\tuniforms: {\n\n\t\t'tDiffuse': { value: null },\n\t\t'offset': { value: 1.0 },\n\t\t'darkness': { value: 1.0 }\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform float offset;\n\t\tuniform float darkness;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\t// Eskil's vignette\n\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\t\t\tvec2 uv = ( vUv - vec2( 0.5 ) ) * vec2( offset );\n\t\t\tgl_FragColor = vec4( mix( texel.rgb, vec3( 1.0 - darkness ), dot( uv, uv ) ), texel.a );\n\n\t\t}`\n\n};\n\nexport { VignetteShader };\n", "import {\n\tVector2,\n\tVector3\n} from 'three';\n\n/**\n * @module VolumeShader\n * @three_import import { VolumeRenderShader1 } from 'three/addons/shaders/VolumeShader.js';\n */\n\n/**\n * Shaders to render 3D volumes using raycasting.\n * The applied techniques are based on similar implementations in the Visvis and Vispy projects.\n * This is not the only approach, therefore it's marked 1.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst VolumeRenderShader1 = {\n\n\tname: 'VolumeRenderShader1',\n\n\tuniforms: {\n\t\t'u_size': { value: new Vector3( 1, 1, 1 ) },\n\t\t'u_renderstyle': { value: 0 },\n\t\t'u_renderthreshold': { value: 0.5 },\n\t\t'u_clim': { value: new Vector2( 1, 1 ) },\n\t\t'u_data': { value: null },\n\t\t'u_cmdata': { value: null }\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tvarying vec4 v_nearpos;\n\t\tvarying vec4 v_farpos;\n\t\tvarying vec3 v_position;\n\n\t\tvoid main() {\n\t\t\t\t// Prepare transforms to map to \"camera view\". See also:\n\t\t\t\t// https://threejs.org/docs/#api/renderers/webgl/WebGLProgram\n\t\t\t\tmat4 viewtransformf = modelViewMatrix;\n\t\t\t\tmat4 viewtransformi = inverse(modelViewMatrix);\n\n\t\t\t\t// Project local vertex coordinate to camera position. Then do a step\n\t\t\t\t// backward (in cam coords) to the near clipping plane, and project back. Do\n\t\t\t\t// the same for the far clipping plane. This gives us all the information we\n\t\t\t\t// need to calculate the ray and truncate it to the viewing cone.\n\t\t\t\tvec4 position4 = vec4(position, 1.0);\n\t\t\t\tvec4 pos_in_cam = viewtransformf * position4;\n\n\t\t\t\t// Intersection of ray and near clipping plane (z = -1 in clip coords)\n\t\t\t\tpos_in_cam.z = -pos_in_cam.w;\n\t\t\t\tv_nearpos = viewtransformi * pos_in_cam;\n\n\t\t\t\t// Intersection of ray and far clipping plane (z = +1 in clip coords)\n\t\t\t\tpos_in_cam.z = pos_in_cam.w;\n\t\t\t\tv_farpos = viewtransformi * pos_in_cam;\n\n\t\t\t\t// Set varyings and output pos\n\t\t\t\tv_position = position;\n\t\t\t\tgl_Position = projectionMatrix * viewMatrix * modelMatrix * position4;\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\t\t\tprecision highp float;\n\t\t\t\tprecision mediump sampler3D;\n\n\t\t\t\tuniform vec3 u_size;\n\t\t\t\tuniform int u_renderstyle;\n\t\t\t\tuniform float u_renderthreshold;\n\t\t\t\tuniform vec2 u_clim;\n\n\t\t\t\tuniform sampler3D u_data;\n\t\t\t\tuniform sampler2D u_cmdata;\n\n\t\t\t\tvarying vec3 v_position;\n\t\t\t\tvarying vec4 v_nearpos;\n\t\t\t\tvarying vec4 v_farpos;\n\n\t\t\t\t// The maximum distance through our rendering volume is sqrt(3).\n\t\t\t\tconst int MAX_STEPS = 887;\t// 887 for 512^3, 1774 for 1024^3\n\t\t\t\tconst int REFINEMENT_STEPS = 4;\n\t\t\t\tconst float relative_step_size = 1.0;\n\t\t\t\tconst vec4 ambient_color = vec4(0.2, 0.4, 0.2, 1.0);\n\t\t\t\tconst vec4 diffuse_color = vec4(0.8, 0.2, 0.2, 1.0);\n\t\t\t\tconst vec4 specular_color = vec4(1.0, 1.0, 1.0, 1.0);\n\t\t\t\tconst float shininess = 40.0;\n\n\t\t\t\tvoid cast_mip(vec3 start_loc, vec3 step, int nsteps, vec3 view_ray);\n\t\t\t\tvoid cast_iso(vec3 start_loc, vec3 step, int nsteps, vec3 view_ray);\n\n\t\t\t\tfloat sample1(vec3 texcoords);\n\t\t\t\tvec4 apply_colormap(float val);\n\t\t\t\tvec4 add_lighting(float val, vec3 loc, vec3 step, vec3 view_ray);\n\n\n\t\t\t\tvoid main() {\n\t\t\t\t\t\t// Normalize clipping plane info\n\t\t\t\t\t\tvec3 farpos = v_farpos.xyz / v_farpos.w;\n\t\t\t\t\t\tvec3 nearpos = v_nearpos.xyz / v_nearpos.w;\n\n\t\t\t\t\t\t// Calculate unit vector pointing in the view direction through this fragment.\n\t\t\t\t\t\tvec3 view_ray = normalize(nearpos.xyz - farpos.xyz);\n\n\t\t\t\t\t\t// Compute the (negative) distance to the front surface or near clipping plane.\n\t\t\t\t\t\t// v_position is the back face of the cuboid, so the initial distance calculated in the dot\n\t\t\t\t\t\t// product below is the distance from near clip plane to the back of the cuboid\n\t\t\t\t\t\tfloat distance = dot(nearpos - v_position, view_ray);\n\t\t\t\t\t\tdistance = max(distance, min((-0.5 - v_position.x) / view_ray.x,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(u_size.x - 0.5 - v_position.x) / view_ray.x));\n\t\t\t\t\t\tdistance = max(distance, min((-0.5 - v_position.y) / view_ray.y,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(u_size.y - 0.5 - v_position.y) / view_ray.y));\n\t\t\t\t\t\tdistance = max(distance, min((-0.5 - v_position.z) / view_ray.z,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t(u_size.z - 0.5 - v_position.z) / view_ray.z));\n\n\t\t\t\t\t\t// Now we have the starting position on the front surface\n\t\t\t\t\t\tvec3 front = v_position + view_ray * distance;\n\n\t\t\t\t\t\t// Decide how many steps to take\n\t\t\t\t\t\tint nsteps = int(-distance / relative_step_size + 0.5);\n\t\t\t\t\t\tif ( nsteps < 1 )\n\t\t\t\t\t\t\t\tdiscard;\n\n\t\t\t\t\t\t// Get starting location and step vector in texture coordinates\n\t\t\t\t\t\tvec3 step = ((v_position - front) / u_size) / float(nsteps);\n\t\t\t\t\t\tvec3 start_loc = front / u_size;\n\n\t\t\t\t\t\t// For testing: show the number of steps. This helps to establish\n\t\t\t\t\t\t// whether the rays are correctly oriented\n\t\t\t\t\t\t//'gl_FragColor = vec4(0.0, float(nsteps) / 1.0 / u_size.x, 1.0, 1.0);\n\t\t\t\t\t\t//'return;\n\n\t\t\t\t\t\tif (u_renderstyle == 0)\n\t\t\t\t\t\t\t\tcast_mip(start_loc, step, nsteps, view_ray);\n\t\t\t\t\t\telse if (u_renderstyle == 1)\n\t\t\t\t\t\t\t\tcast_iso(start_loc, step, nsteps, view_ray);\n\n\t\t\t\t\t\tif (gl_FragColor.a < 0.05)\n\t\t\t\t\t\t\t\tdiscard;\n\t\t\t\t}\n\n\n\t\t\t\tfloat sample1(vec3 texcoords) {\n\t\t\t\t\t\t/* Sample float value from a 3D texture. Assumes intensity data. */\n\t\t\t\t\t\treturn texture(u_data, texcoords.xyz).r;\n\t\t\t\t}\n\n\n\t\t\t\tvec4 apply_colormap(float val) {\n\t\t\t\t\t\tval = (val - u_clim[0]) / (u_clim[1] - u_clim[0]);\n\t\t\t\t\t\treturn texture2D(u_cmdata, vec2(val, 0.5));\n\t\t\t\t}\n\n\n\t\t\t\tvoid cast_mip(vec3 start_loc, vec3 step, int nsteps, vec3 view_ray) {\n\n\t\t\t\t\t\tfloat max_val = -1e6;\n\t\t\t\t\t\tint max_i = 100;\n\t\t\t\t\t\tvec3 loc = start_loc;\n\n\t\t\t\t\t\t// Enter the raycasting loop. In WebGL 1 the loop index cannot be compared with\n\t\t\t\t\t\t// non-constant expression. So we use a hard-coded max, and an additional condition\n\t\t\t\t\t\t// inside the loop.\n\t\t\t\t\t\tfor (int iter=0; iter<MAX_STEPS; iter++) {\n\t\t\t\t\t\t\t\tif (iter >= nsteps)\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t// Sample from the 3D texture\n\t\t\t\t\t\t\t\tfloat val = sample1(loc);\n\t\t\t\t\t\t\t\t// Apply MIP operation\n\t\t\t\t\t\t\t\tif (val > max_val) {\n\t\t\t\t\t\t\t\t\t\tmax_val = val;\n\t\t\t\t\t\t\t\t\t\tmax_i = iter;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Advance location deeper into the volume\n\t\t\t\t\t\t\t\tloc += step;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Refine location, gives crispier images\n\t\t\t\t\t\tvec3 iloc = start_loc + step * (float(max_i) - 0.5);\n\t\t\t\t\t\tvec3 istep = step / float(REFINEMENT_STEPS);\n\t\t\t\t\t\tfor (int i=0; i<REFINEMENT_STEPS; i++) {\n\t\t\t\t\t\t\t\tmax_val = max(max_val, sample1(iloc));\n\t\t\t\t\t\t\t\tiloc += istep;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Resolve final color\n\t\t\t\t\t\tgl_FragColor = apply_colormap(max_val);\n\t\t\t\t}\n\n\n\t\t\t\tvoid cast_iso(vec3 start_loc, vec3 step, int nsteps, vec3 view_ray) {\n\n\t\t\t\t\t\tgl_FragColor = vec4(0.0);\t// init transparent\n\t\t\t\t\t\tvec4 color3 = vec4(0.0);\t// final color\n\t\t\t\t\t\tvec3 dstep = 1.5 / u_size;\t// step to sample derivative\n\t\t\t\t\t\tvec3 loc = start_loc;\n\n\t\t\t\t\t\tfloat low_threshold = u_renderthreshold - 0.02 * (u_clim[1] - u_clim[0]);\n\n\t\t\t\t\t\t// Enter the raycasting loop. In WebGL 1 the loop index cannot be compared with\n\t\t\t\t\t\t// non-constant expression. So we use a hard-coded max, and an additional condition\n\t\t\t\t\t\t// inside the loop.\n\t\t\t\t\t\tfor (int iter=0; iter<MAX_STEPS; iter++) {\n\t\t\t\t\t\t\t\tif (iter >= nsteps)\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\t// Sample from the 3D texture\n\t\t\t\t\t\t\t\tfloat val = sample1(loc);\n\n\t\t\t\t\t\t\t\tif (val > low_threshold) {\n\t\t\t\t\t\t\t\t\t\t// Take the last interval in smaller steps\n\t\t\t\t\t\t\t\t\t\tvec3 iloc = loc - 0.5 * step;\n\t\t\t\t\t\t\t\t\t\tvec3 istep = step / float(REFINEMENT_STEPS);\n\t\t\t\t\t\t\t\t\t\tfor (int i=0; i<REFINEMENT_STEPS; i++) {\n\t\t\t\t\t\t\t\t\t\t\t\tval = sample1(iloc);\n\t\t\t\t\t\t\t\t\t\t\t\tif (val > u_renderthreshold) {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tgl_FragColor = add_lighting(val, iloc, dstep, view_ray);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t\tiloc += istep;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// Advance location deeper into the volume\n\t\t\t\t\t\t\t\tloc += step;\n\t\t\t\t\t\t}\n\t\t\t\t}\n\n\n\t\t\t\tvec4 add_lighting(float val, vec3 loc, vec3 step, vec3 view_ray)\n\t\t\t\t{\n\t\t\t\t\t// Calculate color by incorporating lighting\n\n\t\t\t\t\t\t// View direction\n\t\t\t\t\t\tvec3 V = normalize(view_ray);\n\n\t\t\t\t\t\t// calculate normal vector from gradient\n\t\t\t\t\t\tvec3 N;\n\t\t\t\t\t\tfloat val1, val2;\n\t\t\t\t\t\tval1 = sample1(loc + vec3(-step[0], 0.0, 0.0));\n\t\t\t\t\t\tval2 = sample1(loc + vec3(+step[0], 0.0, 0.0));\n\t\t\t\t\t\tN[0] = val1 - val2;\n\t\t\t\t\t\tval = max(max(val1, val2), val);\n\t\t\t\t\t\tval1 = sample1(loc + vec3(0.0, -step[1], 0.0));\n\t\t\t\t\t\tval2 = sample1(loc + vec3(0.0, +step[1], 0.0));\n\t\t\t\t\t\tN[1] = val1 - val2;\n\t\t\t\t\t\tval = max(max(val1, val2), val);\n\t\t\t\t\t\tval1 = sample1(loc + vec3(0.0, 0.0, -step[2]));\n\t\t\t\t\t\tval2 = sample1(loc + vec3(0.0, 0.0, +step[2]));\n\t\t\t\t\t\tN[2] = val1 - val2;\n\t\t\t\t\t\tval = max(max(val1, val2), val);\n\n\t\t\t\t\t\tfloat gm = length(N); // gradient magnitude\n\t\t\t\t\t\tN = normalize(N);\n\n\t\t\t\t\t\t// Flip normal so it points towards viewer\n\t\t\t\t\t\tfloat Nselect = float(dot(N, V) > 0.0);\n\t\t\t\t\t\tN = (2.0 * Nselect - 1.0) * N;\t// ==\tNselect * N - (1.0-Nselect)*N;\n\n\t\t\t\t\t\t// Init colors\n\t\t\t\t\t\tvec4 ambient_color = vec4(0.0, 0.0, 0.0, 0.0);\n\t\t\t\t\t\tvec4 diffuse_color = vec4(0.0, 0.0, 0.0, 0.0);\n\t\t\t\t\t\tvec4 specular_color = vec4(0.0, 0.0, 0.0, 0.0);\n\n\t\t\t\t\t\t// note: could allow multiple lights\n\t\t\t\t\t\tfor (int i=0; i<1; i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t // Get light direction (make sure to prevent zero division)\n\t\t\t\t\t\t\t\tvec3 L = normalize(view_ray);\t//lightDirs[i];\n\t\t\t\t\t\t\t\tfloat lightEnabled = float( length(L) > 0.0 );\n\t\t\t\t\t\t\t\tL = normalize(L + (1.0 - lightEnabled));\n\n\t\t\t\t\t\t\t\t// Calculate lighting properties\n\t\t\t\t\t\t\t\tfloat lambertTerm = clamp(dot(N, L), 0.0, 1.0);\n\t\t\t\t\t\t\t\tvec3 H = normalize(L+V); // Halfway vector\n\t\t\t\t\t\t\t\tfloat specularTerm = pow(max(dot(H, N), 0.0), shininess);\n\n\t\t\t\t\t\t\t\t// Calculate mask\n\t\t\t\t\t\t\t\tfloat mask1 = lightEnabled;\n\n\t\t\t\t\t\t\t\t// Calculate colors\n\t\t\t\t\t\t\t\tambient_color +=\tmask1 * ambient_color;\t// * gl_LightSource[i].ambient;\n\t\t\t\t\t\t\t\tdiffuse_color +=\tmask1 * lambertTerm;\n\t\t\t\t\t\t\t\tspecular_color += mask1 * specularTerm * specular_color;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Calculate final color by componing different components\n\t\t\t\t\t\tvec4 final_color;\n\t\t\t\t\t\tvec4 color = apply_colormap(val);\n\t\t\t\t\t\tfinal_color = color * (ambient_color + diffuse_color) + specular_color;\n\t\t\t\t\t\tfinal_color.a = color.a;\n\t\t\t\t\t\treturn final_color;\n\t\t\t\t}`\n\n};\n\nexport { VolumeRenderShader1 };\n", "/**\n * @module WaterRefractionShader\n * @three_import import { WaterRefractionShader } from 'three/addons/shaders/WaterRefractionShader.js';\n */\n\n/**\n * Basic water refraction shader.\n *\n * @constant\n * @type {ShaderMaterial~Shader}\n */\nconst WaterRefractionShader = {\n\n\tname: 'WaterRefractionShader',\n\n\tuniforms: {\n\n\t\t'color': {\n\t\t\tvalue: null\n\t\t},\n\n\t\t'time': {\n\t\t\tvalue: 0\n\t\t},\n\n\t\t'tDiffuse': {\n\t\t\tvalue: null\n\t\t},\n\n\t\t'tDudv': {\n\t\t\tvalue: null\n\t\t},\n\n\t\t'textureMatrix': {\n\t\t\tvalue: null\n\t\t}\n\n\t},\n\n\tvertexShader: /* glsl */`\n\n\t\tuniform mat4 textureMatrix;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec4 vUvRefraction;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\n\t\t\tvUvRefraction = textureMatrix * vec4( position, 1.0 );\n\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}`,\n\n\tfragmentShader: /* glsl */`\n\n\t\tuniform vec3 color;\n\t\tuniform float time;\n\t\tuniform sampler2D tDiffuse;\n\t\tuniform sampler2D tDudv;\n\n\t\tvarying vec2 vUv;\n\t\tvarying vec4 vUvRefraction;\n\n\t\tfloat blendOverlay( float base, float blend ) {\n\n\t\t\treturn( base < 0.5 ? ( 2.0 * base * blend ) : ( 1.0 - 2.0 * ( 1.0 - base ) * ( 1.0 - blend ) ) );\n\n\t\t}\n\n\t\tvec3 blendOverlay( vec3 base, vec3 blend ) {\n\n\t\t\treturn vec3( blendOverlay( base.r, blend.r ), blendOverlay( base.g, blend.g ),blendOverlay( base.b, blend.b ) );\n\n\t\t}\n\n\t\tvoid main() {\n\n\t\t float waveStrength = 0.5;\n\t\t float waveSpeed = 0.03;\n\n\t\t\t// simple distortion (ripple) via dudv map (see https://www.youtube.com/watch?v=6B7IF6GOu7s)\n\n\t\t\tvec2 distortedUv = texture2D( tDudv, vec2( vUv.x + time * waveSpeed, vUv.y ) ).rg * waveStrength;\n\t\t\tdistortedUv = vUv.xy + vec2( distortedUv.x, distortedUv.y + time * waveSpeed );\n\t\t\tvec2 distortion = ( texture2D( tDudv, distortedUv ).rg * 2.0 - 1.0 ) * waveStrength;\n\n\t\t\t// new uv coords\n\n\t\t\tvec4 uv = vec4( vUvRefraction );\n\t\t\tuv.xy += distortion;\n\n\t\t\tvec4 base = texture2DProj( tDiffuse, uv );\n\n\t\t\tgl_FragColor = vec4( blendOverlay( base.rgb, color ), 1.0 );\n\n\t\t\t#include <tonemapping_fragment>\n\t\t\t#include <colorspace_fragment>\n\n\t\t}`\n\n};\n\nexport { WaterRefractionShader };\n", "/**\n * Utility class for generating a flakes texture image. This image might be used\n * as a normal map to produce a car paint like effect.\n *\n * @three_import import { FlakesTexture } from 'three/addons/textures/FlakesTexture.js';\n */\nclass FlakesTexture {\n\n\t/**\n\t * Generates a new flakes texture image. The result is a canvas\n\t * that can be used as an input for {@link CanvasTexture}.\n\t *\n\t * @param {number} [width=512] - The width of the image.\n\t * @param {number} [height=512] - The height of the image.\n\t * @return {HTMLCanvasElement} The generated image.\n\t */\n\tconstructor( width = 512, height = 512 ) {\n\n\t\tconst canvas = document.createElement( 'canvas' );\n\t\tcanvas.width = width;\n\t\tcanvas.height = height;\n\n\t\tconst context = canvas.getContext( '2d' );\n\t\tcontext.fillStyle = 'rgb(127,127,255)';\n\t\tcontext.fillRect( 0, 0, width, height );\n\n\t\tfor ( let i = 0; i < 4000; i ++ ) {\n\n\t\t\tconst x = Math.random() * width;\n\t\t\tconst y = Math.random() * height;\n\t\t\tconst r = Math.random() * 3 + 3;\n\n\t\t\tlet nx = Math.random() * 2 - 1;\n\t\t\tlet ny = Math.random() * 2 - 1;\n\t\t\tlet nz = 1.5;\n\n\t\t\tconst l = Math.sqrt( nx * nx + ny * ny + nz * nz );\n\n\t\t\tnx /= l; ny /= l; nz /= l;\n\n\t\t\tcontext.fillStyle = 'rgb(' + ( nx * 127 + 127 ) + ',' + ( ny * 127 + 127 ) + ',' + ( nz * 255 ) + ')';\n\t\t\tcontext.beginPath();\n\t\t\tcontext.arc( x, y, r, 0, Math.PI * 2 );\n\t\t\tcontext.fill();\n\n\t\t}\n\n\t\treturn canvas;\n\n\t}\n\n}\n\nexport { FlakesTexture };\n", "import {\n\tMathUtils,\n\tQuaternion,\n\tVector3\n} from 'three';\n\n/**\n * @module CameraUtils\n * @three_import import * as CameraUtils from 'three/addons/utils/CameraUtils.js';\n */\n\nconst _va = /*@__PURE__*/ new Vector3(), // from pe to pa\n\t_vb = /*@__PURE__*/ new Vector3(), // from pe to pb\n\t_vc = /*@__PURE__*/ new Vector3(), // from pe to pc\n\t_vr = /*@__PURE__*/ new Vector3(), // right axis of screen\n\t_vu = /*@__PURE__*/ new Vector3(), // up axis of screen\n\t_vn = /*@__PURE__*/ new Vector3(), // normal vector of screen\n\t_vec = /*@__PURE__*/ new Vector3(), // temporary vector\n\t_quat = /*@__PURE__*/ new Quaternion(); // temporary quaternion\n\n\n/**\n * Set projection matrix and the orientation of a perspective camera\n * to exactly frame the corners of an arbitrary rectangle.\n * NOTE: This function ignores the standard parameters;\n * do not call `updateProjectionMatrix()` after this.\n *\n * @param {PerspectiveCamera} camera - The camera.\n * @param {Vector3} bottomLeftCorner - The bottom-left corner point.\n * @param {Vector3} bottomRightCorner - The bottom-right corner point.\n * @param {Vector3} topLeftCorner - The top-left corner point.\n * @param {boolean} [estimateViewFrustum=false] - If set to `true`, the function tries to estimate the camera's FOV.\n */\nfunction frameCorners( camera, bottomLeftCorner, bottomRightCorner, topLeftCorner, estimateViewFrustum = false ) {\n\n\tconst pa = bottomLeftCorner, pb = bottomRightCorner, pc = topLeftCorner;\n\tconst pe = camera.position; // eye position\n\tconst n = camera.near; // distance of near clipping plane\n\tconst f = camera.far; //distance of far clipping plane\n\n\t_vr.copy( pb ).sub( pa ).normalize();\n\t_vu.copy( pc ).sub( pa ).normalize();\n\t_vn.crossVectors( _vr, _vu ).normalize();\n\n\t_va.copy( pa ).sub( pe ); // from pe to pa\n\t_vb.copy( pb ).sub( pe ); // from pe to pb\n\t_vc.copy( pc ).sub( pe ); // from pe to pc\n\n\tconst d = - _va.dot( _vn );\t// distance from eye to screen\n\tconst l = _vr.dot( _va ) * n / d; // distance to left screen edge\n\tconst r = _vr.dot( _vb ) * n / d; // distance to right screen edge\n\tconst b = _vu.dot( _va ) * n / d; // distance to bottom screen edge\n\tconst t = _vu.dot( _vc ) * n / d; // distance to top screen edge\n\n\t// Set the camera rotation to match the focal plane to the corners' plane\n\t_quat.setFromUnitVectors( _vec.set( 0, 1, 0 ), _vu );\n\tcamera.quaternion.setFromUnitVectors( _vec.set( 0, 0, 1 ).applyQuaternion( _quat ), _vn ).multiply( _quat );\n\n\t// Set the off-axis projection matrix to match the corners\n\tcamera.projectionMatrix.set( 2.0 * n / ( r - l ), 0.0,\n\t\t( r + l ) / ( r - l ), 0.0, 0.0,\n\t\t2.0 * n / ( t - b ),\n\t\t( t + b ) / ( t - b ), 0.0, 0.0, 0.0,\n\t\t( f + n ) / ( n - f ),\n\t\t2.0 * f * n / ( n - f ), 0.0, 0.0, - 1.0, 0.0 );\n\tcamera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();\n\n\t// FoV estimation to fix frustum culling\n\tif ( estimateViewFrustum ) {\n\n\t\t// Set fieldOfView to a conservative estimate\n\t\t// to make frustum tall/wide enough to encompass it\n\t\tcamera.fov =\n\t\t\tMathUtils.RAD2DEG / Math.min( 1.0, camera.aspect ) *\n\t\t\tMath.atan( ( _vec.copy( pb ).sub( pa ).length() +\n\t\t\t\t\t\t\t( _vec.copy( pc ).sub( pa ).length() ) ) / _va.length() );\n\n\t}\n\n}\n\nexport { frameCorners };\n", "import {\n\tBufferAttribute,\n\tMatrix3,\n\tMatrix4,\n\tVector3\n} from 'three';\n\n/**\n * @module GeometryCompressionUtils\n * @three_import import * as GeometryCompressionUtils from 'three/addons/utils/GeometryCompressionUtils.js';\n */\n\n// Octahedron and Quantization encodings based on work by: https://github.com/tsherif/mesh-quantization-example\n\n/**\n * Compressed the given geometry's `normal` attribute by the selected encode method.\n *\n * @param {BufferGeometry} geometry - The geometry whose normals should be compressed.\n * @param {('DEFAULT'|'OCT1Byte'|'OCT2Byte'|'ANGLES')} encodeMethod - The compression method.\n */\nfunction compressNormals( geometry, encodeMethod ) {\n\n\tconst normal = geometry.attributes.normal;\n\n\tif ( ! normal ) {\n\n\t\tconsole.error( 'THREE.GeometryCompressionUtils.compressNormals(): Geometry must contain normal attribute.' );\n\n\t}\n\n\tif ( normal.isPacked ) return;\n\n\tif ( normal.itemSize != 3 ) {\n\n\t\tconsole.error( 'THREE.GeometryCompressionUtils.compressNormals(): normal.itemSize is not 3, which cannot be encoded.' );\n\n\t}\n\n\tconst array = normal.array;\n\tconst count = normal.count;\n\n\tlet result;\n\tif ( encodeMethod == 'DEFAULT' ) {\n\n\t\t// TODO: Add 1 byte to the result, making the encoded length to be 4 bytes.\n\t\tresult = new Uint8Array( count * 3 );\n\n\t\tfor ( let idx = 0; idx < array.length; idx += 3 ) {\n\n\t\t\tconst encoded = defaultEncode( array[ idx ], array[ idx + 1 ], array[ idx + 2 ], 1 );\n\n\t\t\tresult[ idx + 0 ] = encoded[ 0 ];\n\t\t\tresult[ idx + 1 ] = encoded[ 1 ];\n\t\t\tresult[ idx + 2 ] = encoded[ 2 ];\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'normal', new BufferAttribute( result, 3, true ) );\n\t\tgeometry.attributes.normal.bytes = result.length * 1;\n\n\t} else if ( encodeMethod == 'OCT1Byte' ) {\n\n\n\t\t// It is not recommended to use 1-byte octahedron normals encoding unless you want to extremely reduce the memory usage\n\t\t// As it makes vertex data not aligned to a 4 byte boundary which may harm some WebGL implementations and sometimes the normal distortion is visible\n\t\t// Please refer to @zeux 's comments in https://github.com/mrdoob/three.js/pull/18208\n\n\t\tresult = new Int8Array( count * 2 );\n\n\t\tfor ( let idx = 0; idx < array.length; idx += 3 ) {\n\n\t\t\tconst encoded = octEncodeBest( array[ idx ], array[ idx + 1 ], array[ idx + 2 ], 1 );\n\n\t\t\tresult[ idx / 3 * 2 + 0 ] = encoded[ 0 ];\n\t\t\tresult[ idx / 3 * 2 + 1 ] = encoded[ 1 ];\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'normal', new BufferAttribute( result, 2, true ) );\n\t\tgeometry.attributes.normal.bytes = result.length * 1;\n\n\t} else if ( encodeMethod == 'OCT2Byte' ) {\n\n\t\tresult = new Int16Array( count * 2 );\n\n\t\tfor ( let idx = 0; idx < array.length; idx += 3 ) {\n\n\t\t\tconst encoded = octEncodeBest( array[ idx ], array[ idx + 1 ], array[ idx + 2 ], 2 );\n\n\t\t\tresult[ idx / 3 * 2 + 0 ] = encoded[ 0 ];\n\t\t\tresult[ idx / 3 * 2 + 1 ] = encoded[ 1 ];\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'normal', new BufferAttribute( result, 2, true ) );\n\t\tgeometry.attributes.normal.bytes = result.length * 2;\n\n\t} else if ( encodeMethod == 'ANGLES' ) {\n\n\t\tresult = new Uint16Array( count * 2 );\n\n\t\tfor ( let idx = 0; idx < array.length; idx += 3 ) {\n\n\t\t\tconst encoded = anglesEncode( array[ idx ], array[ idx + 1 ], array[ idx + 2 ] );\n\n\t\t\tresult[ idx / 3 * 2 + 0 ] = encoded[ 0 ];\n\t\t\tresult[ idx / 3 * 2 + 1 ] = encoded[ 1 ];\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'normal', new BufferAttribute( result, 2, true ) );\n\t\tgeometry.attributes.normal.bytes = result.length * 2;\n\n\t} else {\n\n\t\tconsole.error( 'Unrecognized encoding method, should be `DEFAULT` or `ANGLES` or `OCT`. ' );\n\n\t}\n\n\tgeometry.attributes.normal.needsUpdate = true;\n\tgeometry.attributes.normal.isPacked = true;\n\tgeometry.attributes.normal.packingMethod = encodeMethod;\n\n}\n\n/**\n * Compressed the given geometry's `position` attribute.\n *\n * @param {BufferGeometry} geometry - The geometry whose position values should be compressed.\n */\nfunction compressPositions( geometry ) {\n\n\tconst position = geometry.attributes.position;\n\n\tif ( ! position ) {\n\n\t\tconsole.error( 'THREE.GeometryCompressionUtils.compressPositions(): Geometry must contain position attribute.' );\n\n\t}\n\n\tif ( position.isPacked ) return;\n\n\tif ( position.itemSize != 3 ) {\n\n\t\tconsole.error( 'THREE.GeometryCompressionUtils.compressPositions(): position.itemSize is not 3, which cannot be packed.' );\n\n\t}\n\n\tconst array = position.array;\n\tconst encodingBytes = 2;\n\n\tconst result = quantizedEncode( array, encodingBytes );\n\n\tconst quantized = result.quantized;\n\n\t// IMPORTANT: calculate original geometry bounding info first, before updating packed positions\n\tif ( geometry.boundingBox == null ) geometry.computeBoundingBox();\n\tif ( geometry.boundingSphere == null ) geometry.computeBoundingSphere();\n\n\tgeometry.setAttribute( 'position', new BufferAttribute( quantized, 3 ) );\n\tgeometry.attributes.position.isPacked = true;\n\tgeometry.attributes.position.needsUpdate = true;\n\tgeometry.attributes.position.bytes = quantized.length * encodingBytes;\n\n}\n\n/**\n * Compressed the given geometry's `uv` attribute.\n *\n * @param {BufferGeometry} geometry - The geometry whose texture coordinates should be compressed.\n */\nfunction compressUvs( geometry ) {\n\n\tconst uvs = geometry.attributes.uv;\n\n\tif ( ! uvs ) {\n\n\t\tconsole.error( 'THREE.GeometryCompressionUtils.compressUvs(): Geometry must contain uv attribute.' );\n\n\t}\n\n\tif ( uvs.isPacked ) return;\n\n\tconst range = { min: Infinity, max: - Infinity };\n\n\tconst array = uvs.array;\n\n\tfor ( let i = 0; i < array.length; i ++ ) {\n\n\t\trange.min = Math.min( range.min, array[ i ] );\n\t\trange.max = Math.max( range.max, array[ i ] );\n\n\t}\n\n\tlet result;\n\n\tif ( range.min >= - 1.0 && range.max <= 1.0 ) {\n\n\t\t// use default encoding method\n\t\tresult = new Uint16Array( array.length );\n\n\t\tfor ( let i = 0; i < array.length; i += 2 ) {\n\n\t\t\tconst encoded = defaultEncode( array[ i ], array[ i + 1 ], 0, 2 );\n\n\t\t\tresult[ i ] = encoded[ 0 ];\n\t\t\tresult[ i + 1 ] = encoded[ 1 ];\n\n\t\t}\n\n\t\tgeometry.setAttribute( 'uv', new BufferAttribute( result, 2, true ) );\n\t\tgeometry.attributes.uv.isPacked = true;\n\t\tgeometry.attributes.uv.needsUpdate = true;\n\t\tgeometry.attributes.uv.bytes = result.length * 2;\n\n\t} else {\n\n\t\t// use quantized encoding method\n\t\tresult = quantizedEncodeUV( array, 2 );\n\n\t\tgeometry.setAttribute( 'uv', new BufferAttribute( result.quantized, 2 ) );\n\t\tgeometry.attributes.uv.isPacked = true;\n\t\tgeometry.attributes.uv.needsUpdate = true;\n\t\tgeometry.attributes.uv.bytes = result.quantized.length * 2;\n\n\t}\n\n}\n\n\n// Encoding functions\n\nfunction defaultEncode( x, y, z, bytes ) {\n\n\tif ( bytes == 1 ) {\n\n\t\tconst tmpx = Math.round( ( x + 1 ) * 0.5 * 255 );\n\t\tconst tmpy = Math.round( ( y + 1 ) * 0.5 * 255 );\n\t\tconst tmpz = Math.round( ( z + 1 ) * 0.5 * 255 );\n\t\treturn new Uint8Array( [ tmpx, tmpy, tmpz ] );\n\n\t} else if ( bytes == 2 ) {\n\n\t\tconst tmpx = Math.round( ( x + 1 ) * 0.5 * 65535 );\n\t\tconst tmpy = Math.round( ( y + 1 ) * 0.5 * 65535 );\n\t\tconst tmpz = Math.round( ( z + 1 ) * 0.5 * 65535 );\n\t\treturn new Uint16Array( [ tmpx, tmpy, tmpz ] );\n\n\t} else {\n\n\t\tconsole.error( 'number of bytes must be 1 or 2' );\n\n\t}\n\n}\n\n// for `Angles` encoding\nfunction anglesEncode( x, y, z ) {\n\n\tconst normal0 = parseInt( 0.5 * ( 1.0 + Math.atan2( y, x ) / Math.PI ) * 65535 );\n\tconst normal1 = parseInt( 0.5 * ( 1.0 + z ) * 65535 );\n\treturn new Uint16Array( [ normal0, normal1 ] );\n\n}\n\n// for `Octahedron` encoding\nfunction octEncodeBest( x, y, z, bytes ) {\n\n\tlet oct, dec, best, currentCos, bestCos;\n\n\t// Test various combinations of ceil and floor\n\t// to minimize rounding errors\n\tbest = oct = octEncodeVec3( x, y, z, 'floor', 'floor' );\n\tdec = octDecodeVec2( oct );\n\tbestCos = dot( x, y, z, dec );\n\n\toct = octEncodeVec3( x, y, z, 'ceil', 'floor' );\n\tdec = octDecodeVec2( oct );\n\tcurrentCos = dot( x, y, z, dec );\n\n\tif ( currentCos > bestCos ) {\n\n\t\tbest = oct;\n\t\tbestCos = currentCos;\n\n\t}\n\n\toct = octEncodeVec3( x, y, z, 'floor', 'ceil' );\n\tdec = octDecodeVec2( oct );\n\tcurrentCos = dot( x, y, z, dec );\n\n\tif ( currentCos > bestCos ) {\n\n\t\tbest = oct;\n\t\tbestCos = currentCos;\n\n\t}\n\n\toct = octEncodeVec3( x, y, z, 'ceil', 'ceil' );\n\tdec = octDecodeVec2( oct );\n\tcurrentCos = dot( x, y, z, dec );\n\n\tif ( currentCos > bestCos ) {\n\n\t\tbest = oct;\n\n\t}\n\n\treturn best;\n\n\tfunction octEncodeVec3( x0, y0, z0, xfunc, yfunc ) {\n\n\t\tlet x = x0 / ( Math.abs( x0 ) + Math.abs( y0 ) + Math.abs( z0 ) );\n\t\tlet y = y0 / ( Math.abs( x0 ) + Math.abs( y0 ) + Math.abs( z0 ) );\n\n\t\tif ( z < 0 ) {\n\n\t\t\tconst tempx = ( 1 - Math.abs( y ) ) * ( x >= 0 ? 1 : - 1 );\n\t\t\tconst tempy = ( 1 - Math.abs( x ) ) * ( y >= 0 ? 1 : - 1 );\n\n\t\t\tx = tempx;\n\t\t\ty = tempy;\n\n\t\t\tlet diff = 1 - Math.abs( x ) - Math.abs( y );\n\t\t\tif ( diff > 0 ) {\n\n\t\t\t\tdiff += 0.001;\n\t\t\t\tx += x > 0 ? diff / 2 : - diff / 2;\n\t\t\t\ty += y > 0 ? diff / 2 : - diff / 2;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( bytes == 1 ) {\n\n\t\t\treturn new Int8Array( [\n\t\t\t\tMath[ xfunc ]( x * 127.5 + ( x < 0 ? 1 : 0 ) ),\n\t\t\t\tMath[ yfunc ]( y * 127.5 + ( y < 0 ? 1 : 0 ) )\n\t\t\t] );\n\n\t\t}\n\n\t\tif ( bytes == 2 ) {\n\n\t\t\treturn new Int16Array( [\n\t\t\t\tMath[ xfunc ]( x * 32767.5 + ( x < 0 ? 1 : 0 ) ),\n\t\t\t\tMath[ yfunc ]( y * 32767.5 + ( y < 0 ? 1 : 0 ) )\n\t\t\t] );\n\n\t\t}\n\n\n\t}\n\n\tfunction octDecodeVec2( oct ) {\n\n\t\tlet x = oct[ 0 ];\n\t\tlet y = oct[ 1 ];\n\n\t\tif ( bytes == 1 ) {\n\n\t\t\tx /= x < 0 ? 127 : 128;\n\t\t\ty /= y < 0 ? 127 : 128;\n\n\t\t} else if ( bytes == 2 ) {\n\n\t\t\tx /= x < 0 ? 32767 : 32768;\n\t\t\ty /= y < 0 ? 32767 : 32768;\n\n\t\t}\n\n\n\t\tconst z = 1 - Math.abs( x ) - Math.abs( y );\n\n\t\tif ( z < 0 ) {\n\n\t\t\tconst tmpx = x;\n\t\t\tx = ( 1 - Math.abs( y ) ) * ( x >= 0 ? 1 : - 1 );\n\t\t\ty = ( 1 - Math.abs( tmpx ) ) * ( y >= 0 ? 1 : - 1 );\n\n\t\t}\n\n\t\tconst length = Math.sqrt( x * x + y * y + z * z );\n\n\t\treturn [\n\t\t\tx / length,\n\t\t\ty / length,\n\t\t\tz / length\n\t\t];\n\n\t}\n\n\tfunction dot( x, y, z, vec3 ) {\n\n\t\treturn x * vec3[ 0 ] + y * vec3[ 1 ] + z * vec3[ 2 ];\n\n\t}\n\n}\n\nfunction quantizedEncode( array, bytes ) {\n\n\tlet quantized, segments;\n\n\tif ( bytes == 1 ) {\n\n\t\tquantized = new Uint8Array( array.length );\n\t\tsegments = 255;\n\n\t} else if ( bytes == 2 ) {\n\n\t\tquantized = new Uint16Array( array.length );\n\t\tsegments = 65535;\n\n\t} else {\n\n\t\tconsole.error( 'number of bytes error! ' );\n\n\t}\n\n\tconst decodeMat = new Matrix4();\n\n\tconst min = new Float32Array( 3 );\n\tconst max = new Float32Array( 3 );\n\n\tmin[ 0 ] = min[ 1 ] = min[ 2 ] = Number.MAX_VALUE;\n\tmax[ 0 ] = max[ 1 ] = max[ 2 ] = - Number.MAX_VALUE;\n\n\tfor ( let i = 0; i < array.length; i += 3 ) {\n\n\t\tmin[ 0 ] = Math.min( min[ 0 ], array[ i + 0 ] );\n\t\tmin[ 1 ] = Math.min( min[ 1 ], array[ i + 1 ] );\n\t\tmin[ 2 ] = Math.min( min[ 2 ], array[ i + 2 ] );\n\t\tmax[ 0 ] = Math.max( max[ 0 ], array[ i + 0 ] );\n\t\tmax[ 1 ] = Math.max( max[ 1 ], array[ i + 1 ] );\n\t\tmax[ 2 ] = Math.max( max[ 2 ], array[ i + 2 ] );\n\n\t}\n\n\tdecodeMat.scale( new Vector3(\n\t\t( max[ 0 ] - min[ 0 ] ) / segments,\n\t\t( max[ 1 ] - min[ 1 ] ) / segments,\n\t\t( max[ 2 ] - min[ 2 ] ) / segments\n\t) );\n\n\tdecodeMat.elements[ 12 ] = min[ 0 ];\n\tdecodeMat.elements[ 13 ] = min[ 1 ];\n\tdecodeMat.elements[ 14 ] = min[ 2 ];\n\n\tdecodeMat.transpose();\n\n\n\tconst multiplier = new Float32Array( [\n\t\tmax[ 0 ] !== min[ 0 ] ? segments / ( max[ 0 ] - min[ 0 ] ) : 0,\n\t\tmax[ 1 ] !== min[ 1 ] ? segments / ( max[ 1 ] - min[ 1 ] ) : 0,\n\t\tmax[ 2 ] !== min[ 2 ] ? segments / ( max[ 2 ] - min[ 2 ] ) : 0\n\t] );\n\n\tfor ( let i = 0; i < array.length; i += 3 ) {\n\n\t\tquantized[ i + 0 ] = Math.floor( ( array[ i + 0 ] - min[ 0 ] ) * multiplier[ 0 ] );\n\t\tquantized[ i + 1 ] = Math.floor( ( array[ i + 1 ] - min[ 1 ] ) * multiplier[ 1 ] );\n\t\tquantized[ i + 2 ] = Math.floor( ( array[ i + 2 ] - min[ 2 ] ) * multiplier[ 2 ] );\n\n\t}\n\n\treturn {\n\t\tquantized: quantized,\n\t\tdecodeMat: decodeMat\n\t};\n\n}\n\nfunction quantizedEncodeUV( array, bytes ) {\n\n\tlet quantized, segments;\n\n\tif ( bytes == 1 ) {\n\n\t\tquantized = new Uint8Array( array.length );\n\t\tsegments = 255;\n\n\t} else if ( bytes == 2 ) {\n\n\t\tquantized = new Uint16Array( array.length );\n\t\tsegments = 65535;\n\n\t} else {\n\n\t\tconsole.error( 'number of bytes error! ' );\n\n\t}\n\n\tconst decodeMat = new Matrix3();\n\n\tconst min = new Float32Array( 2 );\n\tconst max = new Float32Array( 2 );\n\n\tmin[ 0 ] = min[ 1 ] = Number.MAX_VALUE;\n\tmax[ 0 ] = max[ 1 ] = - Number.MAX_VALUE;\n\n\tfor ( let i = 0; i < array.length; i += 2 ) {\n\n\t\tmin[ 0 ] = Math.min( min[ 0 ], array[ i + 0 ] );\n\t\tmin[ 1 ] = Math.min( min[ 1 ], array[ i + 1 ] );\n\t\tmax[ 0 ] = Math.max( max[ 0 ], array[ i + 0 ] );\n\t\tmax[ 1 ] = Math.max( max[ 1 ], array[ i + 1 ] );\n\n\t}\n\n\tdecodeMat.scale(\n\t\t( max[ 0 ] - min[ 0 ] ) / segments,\n\t\t( max[ 1 ] - min[ 1 ] ) / segments\n\t);\n\n\tdecodeMat.elements[ 6 ] = min[ 0 ];\n\tdecodeMat.elements[ 7 ] = min[ 1 ];\n\n\tdecodeMat.transpose();\n\n\tconst multiplier = new Float32Array( [\n\t\tmax[ 0 ] !== min[ 0 ] ? segments / ( max[ 0 ] - min[ 0 ] ) : 0,\n\t\tmax[ 1 ] !== min[ 1 ] ? segments / ( max[ 1 ] - min[ 1 ] ) : 0\n\t] );\n\n\tfor ( let i = 0; i < array.length; i += 2 ) {\n\n\t\tquantized[ i + 0 ] = Math.floor( ( array[ i + 0 ] - min[ 0 ] ) * multiplier[ 0 ] );\n\t\tquantized[ i + 1 ] = Math.floor( ( array[ i + 1 ] - min[ 1 ] ) * multiplier[ 1 ] );\n\n\t}\n\n\treturn {\n\t\tquantized: quantized,\n\t\tdecodeMat: decodeMat\n\t};\n\n}\n\n\n\nexport {\n\tcompressNormals,\n\tcompressPositions,\n\tcompressUvs,\n};\n", "import { Vector3 } from 'three';\n\n/**\n * @module GeometryUtils\n * @three_import import * as GeometryUtils from 'three/addons/utils/GeometryUtils.js';\n */\n\n/**\n * Generates 2D-Coordinates along a Hilbert curve.\n *\n * Based on work by: {@link http://www.openprocessing.org/sketch/15493}\n *\n * @param {Vector3} [center] - Center of Hilbert curve.\n * @param {number} [size=10] - Total width of Hilbert curve.\n * @param {number} [iterations=10] - Number of subdivisions.\n * @param {number} [v0=0] - Corner index -X, -Z.\n * @param {number} [v1=1] - Corner index -X, +Z.\n * @param {number} [v2=2] - Corner index +X, +Z.\n * @param {number} [v3=3] - Corner index +X, -Z.\n * @returns {Array<Vector3>} The Hilbert curve points.\n */\nfunction hilbert2D( center = new Vector3( 0, 0, 0 ), size = 10, iterations = 1, v0 = 0, v1 = 1, v2 = 2, v3 = 3 ) {\n\n\tconst half = size / 2;\n\n\tconst vec_s = [\n\t\tnew Vector3( center.x - half, center.y, center.z - half ),\n\t\tnew Vector3( center.x - half, center.y, center.z + half ),\n\t\tnew Vector3( center.x + half, center.y, center.z + half ),\n\t\tnew Vector3( center.x + half, center.y, center.z - half )\n\t];\n\n\tconst vec = [\n\t\tvec_s[ v0 ],\n\t\tvec_s[ v1 ],\n\t\tvec_s[ v2 ],\n\t\tvec_s[ v3 ]\n\t];\n\n\t// Recurse iterations\n\tif ( 0 <= -- iterations ) {\n\n\t\treturn [\n\t\t\t...hilbert2D( vec[ 0 ], half, iterations, v0, v3, v2, v1 ),\n\t\t\t...hilbert2D( vec[ 1 ], half, iterations, v0, v1, v2, v3 ),\n\t\t\t...hilbert2D( vec[ 2 ], half, iterations, v0, v1, v2, v3 ),\n\t\t\t...hilbert2D( vec[ 3 ], half, iterations, v2, v1, v0, v3 )\n\t\t];\n\n\t}\n\n\t// Return complete Hilbert Curve.\n\treturn vec;\n\n}\n\n/**\n * Generates 3D-Coordinates along a Hilbert curve.\n *\n * Based on work by: {@link https://openprocessing.org/user/5654}\n *\n * @param {Vector3} [center] - Center of Hilbert curve.\n * @param {number} [size=10] - Total width of Hilbert curve.\n * @param {number} [iterations=1] - Number of subdivisions.\n * @param {number} [v0=0] - Corner index -X, +Y, -Z.\n * @param {number} [v1=1] - Corner index -X, +Y, +Z.\n * @param {number} [v2=2] - Corner index -X, -Y, +Z.\n * @param {number} [v3=3] - Corner index -X, -Y, -Z.\n * @param {number} [v4=4] - Corner index +X, -Y, -Z.\n * @param {number} [v5=5] - Corner index +X, -Y, +Z.\n * @param {number} [v6=6] - Corner index +X, +Y, +Z.\n * @param {number} [v7=7] - Corner index +X, +Y, -Z.\n * @returns {Array<Vector3>}  - The Hilbert curve points.\n */\nfunction hilbert3D( center = new Vector3( 0, 0, 0 ), size = 10, iterations = 1, v0 = 0, v1 = 1, v2 = 2, v3 = 3, v4 = 4, v5 = 5, v6 = 6, v7 = 7 ) {\n\n\t// Default Vars\n\tconst half = size / 2;\n\n\tconst vec_s = [\n\t\tnew Vector3( center.x - half, center.y + half, center.z - half ),\n\t\tnew Vector3( center.x - half, center.y + half, center.z + half ),\n\t\tnew Vector3( center.x - half, center.y - half, center.z + half ),\n\t\tnew Vector3( center.x - half, center.y - half, center.z - half ),\n\t\tnew Vector3( center.x + half, center.y - half, center.z - half ),\n\t\tnew Vector3( center.x + half, center.y - half, center.z + half ),\n\t\tnew Vector3( center.x + half, center.y + half, center.z + half ),\n\t\tnew Vector3( center.x + half, center.y + half, center.z - half )\n\t];\n\n\tconst vec = [\n\t\tvec_s[ v0 ],\n\t\tvec_s[ v1 ],\n\t\tvec_s[ v2 ],\n\t\tvec_s[ v3 ],\n\t\tvec_s[ v4 ],\n\t\tvec_s[ v5 ],\n\t\tvec_s[ v6 ],\n\t\tvec_s[ v7 ]\n\t];\n\n\t// Recurse iterations\n\tif ( -- iterations >= 0 ) {\n\n\t\treturn [\n\t\t\t...hilbert3D( vec[ 0 ], half, iterations, v0, v3, v4, v7, v6, v5, v2, v1 ),\n\t\t\t...hilbert3D( vec[ 1 ], half, iterations, v0, v7, v6, v1, v2, v5, v4, v3 ),\n\t\t\t...hilbert3D( vec[ 2 ], half, iterations, v0, v7, v6, v1, v2, v5, v4, v3 ),\n\t\t\t...hilbert3D( vec[ 3 ], half, iterations, v2, v3, v0, v1, v6, v7, v4, v5 ),\n\t\t\t...hilbert3D( vec[ 4 ], half, iterations, v2, v3, v0, v1, v6, v7, v4, v5 ),\n\t\t\t...hilbert3D( vec[ 5 ], half, iterations, v4, v3, v2, v5, v6, v1, v0, v7 ),\n\t\t\t...hilbert3D( vec[ 6 ], half, iterations, v4, v3, v2, v5, v6, v1, v0, v7 ),\n\t\t\t...hilbert3D( vec[ 7 ], half, iterations, v6, v5, v2, v1, v0, v3, v4, v7 )\n\t\t];\n\n\t}\n\n\t// Return complete Hilbert Curve.\n\treturn vec;\n\n}\n\n/**\n * Generates a Gosper curve (lying in the XY plane).\n *\n * Reference: {@link https://gist.github.com/nitaku/6521802}\n *\n * @param {number} [size=1] - The size of a single gosper island.\n * @return {Array<number>} The gosper island points.\n */\nfunction gosper( size = 1 ) {\n\n\tfunction fractalize( config ) {\n\n\t\tlet output;\n\t\tlet input = config.axiom;\n\n\t\tfor ( let i = 0, il = config.steps; 0 <= il ? i < il : i > il; 0 <= il ? i ++ : i -- ) {\n\n\t\t\toutput = '';\n\n\t\t\tfor ( let j = 0, jl = input.length; j < jl; j ++ ) {\n\n\t\t\t\tconst char = input[ j ];\n\n\t\t\t\tif ( char in config.rules ) {\n\n\t\t\t\t\toutput += config.rules[ char ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\toutput += char;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tinput = output;\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n\tfunction toPoints( config ) {\n\n\t\tlet currX = 0, currY = 0;\n\t\tlet angle = 0;\n\t\tconst path = [ 0, 0, 0 ];\n\t\tconst fractal = config.fractal;\n\n\t\tfor ( let i = 0, l = fractal.length; i < l; i ++ ) {\n\n\t\t\tconst char = fractal[ i ];\n\n\t\t\tif ( char === '+' ) {\n\n\t\t\t\tangle += config.angle;\n\n\t\t\t} else if ( char === '-' ) {\n\n\t\t\t\tangle -= config.angle;\n\n\t\t\t} else if ( char === 'F' ) {\n\n\t\t\t\tcurrX += config.size * Math.cos( angle );\n\t\t\t\tcurrY += - config.size * Math.sin( angle );\n\t\t\t\tpath.push( currX, currY, 0 );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn path;\n\n\t}\n\n\t//\n\n\tconst gosper = fractalize( {\n\t\taxiom: 'A',\n\t\tsteps: 4,\n\t\trules: {\n\t\t\tA: 'A+BF++BF-FA--FAFA-BF+',\n\t\t\tB: '-FA+BFBF++BF+FA--FA-B'\n\t\t}\n\t} );\n\n\tconst points = toPoints( {\n\t\tfractal: gosper,\n\t\tsize: size,\n\t\tangle: Math.PI / 3 // 60 degrees\n\t} );\n\n\treturn points;\n\n}\n\n\n\nexport {\n\thilbert2D,\n\thilbert3D,\n\tgosper,\n};\n", "import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tGroup,\n\tLineSegments,\n\tMatrix3,\n\tMesh\n} from 'three';\n\nimport { mergeGeometries } from './BufferGeometryUtils.js';\n\n/**\n * Utility class for LDraw models.\n *\n * @three_import import { LDrawUtils } from 'three/addons/utils/LDrawUtils.js';\n */\nclass LDrawUtils {\n\n\t/**\n\t * Merges geometries in the given object by materials and returns a new group object.\n\t * Use on not indexed geometries. The object buffers reference the old object ones.\n\t * Special treatment is done to the conditional lines generated by LDrawLoader.\n\t *\n\t * @param {Object3D} object - The object to merge.\n\t * @returns {Group} The merged object.\n\t */\n\tstatic mergeObject( object ) {\n\n\t\tfunction extractGroup( geometry, group, elementSize, isConditionalLine ) {\n\n\t\t\t// Extracts a group from a geometry as a new geometry (with attribute buffers referencing original buffers)\n\n\t\t\tconst newGeometry = new BufferGeometry();\n\n\t\t\tconst originalPositions = geometry.getAttribute( 'position' ).array;\n\t\t\tconst originalNormals = elementSize === 3 ? geometry.getAttribute( 'normal' ).array : null;\n\n\t\t\tconst numVertsGroup = Math.min( group.count, Math.floor( originalPositions.length / 3 ) - group.start );\n\t\t\tconst vertStart = group.start * 3;\n\t\t\tconst vertEnd = ( group.start + numVertsGroup ) * 3;\n\n\t\t\tconst positions = originalPositions.subarray( vertStart, vertEnd );\n\t\t\tconst normals = originalNormals !== null ? originalNormals.subarray( vertStart, vertEnd ) : null;\n\n\t\t\tnewGeometry.setAttribute( 'position', new BufferAttribute( positions, 3 ) );\n\t\t\tif ( normals !== null ) newGeometry.setAttribute( 'normal', new BufferAttribute( normals, 3 ) );\n\n\t\t\tif ( isConditionalLine ) {\n\n\t\t\t\tconst controlArray0 = geometry.getAttribute( 'control0' ).array.subarray( vertStart, vertEnd );\n\t\t\t\tconst controlArray1 = geometry.getAttribute( 'control1' ).array.subarray( vertStart, vertEnd );\n\t\t\t\tconst directionArray = geometry.getAttribute( 'direction' ).array.subarray( vertStart, vertEnd );\n\n\t\t\t\tnewGeometry.setAttribute( 'control0', new BufferAttribute( controlArray0, 3, false ) );\n\t\t\t\tnewGeometry.setAttribute( 'control1', new BufferAttribute( controlArray1, 3, false ) );\n\t\t\t\tnewGeometry.setAttribute( 'direction', new BufferAttribute( directionArray, 3, false ) );\n\n\t\t\t}\n\n\t\t\treturn newGeometry;\n\n\t\t}\n\n\t\tfunction addGeometry( mat, geometry, geometries ) {\n\n\t\t\tconst geoms = geometries[ mat.uuid ];\n\t\t\tif ( ! geoms ) {\n\n\t\t\t\tgeometries[ mat.uuid ] = {\n\t\t\t\t\tmat: mat,\n\t\t\t\t\tarr: [ geometry ]\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tgeoms.arr.push( geometry );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction permuteAttribute( attribute, elemSize ) {\n\n\t\t\t// Permutes first two vertices of each attribute element\n\n\t\t\tif ( ! attribute ) return;\n\n\t\t\tconst verts = attribute.array;\n\t\t\tconst numVerts = Math.floor( verts.length / 3 );\n\t\t\tlet offset = 0;\n\t\t\tfor ( let i = 0; i < numVerts; i ++ ) {\n\n\t\t\t\tconst x = verts[ offset ];\n\t\t\t\tconst y = verts[ offset + 1 ];\n\t\t\t\tconst z = verts[ offset + 2 ];\n\n\t\t\t\tverts[ offset ] = verts[ offset + 3 ];\n\t\t\t\tverts[ offset + 1 ] = verts[ offset + 4 ];\n\t\t\t\tverts[ offset + 2 ] = verts[ offset + 5 ];\n\n\t\t\t\tverts[ offset + 3 ] = x;\n\t\t\t\tverts[ offset + 4 ] = y;\n\t\t\t\tverts[ offset + 5 ] = z;\n\n\t\t\t\toffset += elemSize * 3;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Traverse the object hierarchy collecting geometries and transforming them to world space\n\n\t\tconst meshGeometries = {};\n\t\tconst linesGeometries = {};\n\t\tconst condLinesGeometries = {};\n\n\t\tobject.updateMatrixWorld( true );\n\t\tconst normalMatrix = new Matrix3();\n\n\t\tobject.traverse( c => {\n\n\t\t\tif ( c.isMesh | c.isLineSegments ) {\n\n\t\t\t\tconst elemSize = c.isMesh ? 3 : 2;\n\n\t\t\t\tconst geometry = c.geometry.clone();\n\t\t\t\tconst matrixIsInverted = c.matrixWorld.determinant() < 0;\n\t\t\t\tif ( matrixIsInverted ) {\n\n\t\t\t\t\tpermuteAttribute( geometry.attributes.position, elemSize );\n\t\t\t\t\tpermuteAttribute( geometry.attributes.normal, elemSize );\n\n\t\t\t\t}\n\n\t\t\t\tgeometry.applyMatrix4( c.matrixWorld );\n\n\t\t\t\tif ( c.isConditionalLine ) {\n\n\t\t\t\t\tgeometry.attributes.control0.applyMatrix4( c.matrixWorld );\n\t\t\t\t\tgeometry.attributes.control1.applyMatrix4( c.matrixWorld );\n\t\t\t\t\tnormalMatrix.getNormalMatrix( c.matrixWorld );\n\t\t\t\t\tgeometry.attributes.direction.applyNormalMatrix( normalMatrix );\n\n\t\t\t\t}\n\n\t\t\t\tconst geometries = c.isMesh ? meshGeometries : ( c.isConditionalLine ? condLinesGeometries : linesGeometries );\n\n\t\t\t\tif ( Array.isArray( c.material ) ) {\n\n\t\t\t\t\tfor ( const groupIndex in geometry.groups ) {\n\n\t\t\t\t\t\tconst group = geometry.groups[ groupIndex ];\n\t\t\t\t\t\tconst mat = c.material[ group.materialIndex ];\n\t\t\t\t\t\tconst newGeometry = extractGroup( geometry, group, elemSize, c.isConditionalLine );\n\t\t\t\t\t\taddGeometry( mat, newGeometry, geometries );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\taddGeometry( c.material, geometry, geometries );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t\t// Create object with merged geometries\n\n\t\tconst mergedObject = new Group();\n\n\t\tconst meshMaterialsIds = Object.keys( meshGeometries );\n\t\tfor ( const meshMaterialsId of meshMaterialsIds ) {\n\n\t\t\tconst meshGeometry = meshGeometries[ meshMaterialsId ];\n\t\t\tconst mergedGeometry = mergeGeometries( meshGeometry.arr );\n\t\t\tmergedObject.add( new Mesh( mergedGeometry, meshGeometry.mat ) );\n\n\t\t}\n\n\t\tconst linesMaterialsIds = Object.keys( linesGeometries );\n\t\tfor ( const linesMaterialsId of linesMaterialsIds ) {\n\n\t\t\tconst lineGeometry = linesGeometries[ linesMaterialsId ];\n\t\t\tconst mergedGeometry = mergeGeometries( lineGeometry.arr );\n\t\t\tmergedObject.add( new LineSegments( mergedGeometry, lineGeometry.mat ) );\n\n\t\t}\n\n\t\tconst condLinesMaterialsIds = Object.keys( condLinesGeometries );\n\t\tfor ( const condLinesMaterialsId of condLinesMaterialsIds ) {\n\n\t\t\tconst condLineGeometry = condLinesGeometries[ condLinesMaterialsId ];\n\t\t\tconst mergedGeometry = mergeGeometries( condLineGeometry.arr );\n\t\t\tconst condLines = new LineSegments( mergedGeometry, condLineGeometry.mat );\n\t\t\tcondLines.isConditionalLine = true;\n\t\t\tmergedObject.add( condLines );\n\n\t\t}\n\n\t\tmergedObject.userData.constructionStep = 0;\n\t\tmergedObject.userData.numConstructionSteps = 1;\n\n\t\treturn mergedObject;\n\n\t}\n\n}\n\nexport { LDrawUtils };\n", "import {\n\tBufferAttribute,\n\tBufferGeometry,\n\tColor,\n\tGroup,\n\tMatrix4,\n\tMesh,\n\tVector3\n} from 'three';\n\nimport { mergeGroups, deepCloneAttribute } from './BufferGeometryUtils.js';\n\n/**\n * @module SceneUtils\n * @three_import import * as SceneUtils from 'three/addons/utils/SceneUtils.js';\n */\n\nconst _color = /*@__PURE__*/new Color();\nconst _matrix = /*@__PURE__*/new Matrix4();\n\n/**\n * This function creates a mesh for each instance of the given instanced mesh and\n * adds it to a group. Each mesh will honor the current 3D transformation of its\n * corresponding instance.\n *\n * @param {InstancedMesh} instancedMesh - The instanced mesh.\n * @return {Group} A group of meshes.\n */\nfunction createMeshesFromInstancedMesh( instancedMesh ) {\n\n\tconst group = new Group();\n\n\tconst count = instancedMesh.count;\n\tconst geometry = instancedMesh.geometry;\n\tconst material = instancedMesh.material;\n\n\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\tconst mesh = new Mesh( geometry, material );\n\n\t\tinstancedMesh.getMatrixAt( i, mesh.matrix );\n\t\tmesh.matrix.decompose( mesh.position, mesh.quaternion, mesh.scale );\n\n\t\tgroup.add( mesh );\n\n\t}\n\n\tgroup.copy( instancedMesh );\n\tgroup.updateMatrixWorld(); // ensure correct world matrices of meshes\n\n\treturn group;\n\n}\n\n/**\n * This function creates a mesh for each geometry-group of the given multi-material mesh and\n * adds it to a group.\n *\n * @param {Mesh} mesh - The multi-material mesh.\n * @return {Group} A group of meshes.\n */\nfunction createMeshesFromMultiMaterialMesh( mesh ) {\n\n\tif ( Array.isArray( mesh.material ) === false ) {\n\n\t\tconsole.warn( 'THREE.SceneUtils.createMeshesFromMultiMaterialMesh(): The given mesh has no multiple materials.' );\n\t\treturn mesh;\n\n\t}\n\n\tconst object = new Group();\n\tobject.copy( mesh );\n\n\t// merge groups (which automatically sorts them)\n\n\tconst geometry = mergeGroups( mesh.geometry );\n\n\tconst index = geometry.index;\n\tconst groups = geometry.groups;\n\tconst attributeNames = Object.keys( geometry.attributes );\n\n\t// create a mesh for each group by extracting the buffer data into a new geometry\n\n\tfor ( let i = 0; i < groups.length; i ++ ) {\n\n\t\tconst group = groups[ i ];\n\n\t\tconst start = group.start;\n\t\tconst end = start + group.count;\n\n\t\tconst newGeometry = new BufferGeometry();\n\t\tconst newMaterial = mesh.material[ group.materialIndex ];\n\n\t\t// process all buffer attributes\n\n\t\tfor ( let j = 0; j < attributeNames.length; j ++ ) {\n\n\t\t\tconst name = attributeNames[ j ];\n\t\t\tconst attribute = geometry.attributes[ name ];\n\t\t\tconst itemSize = attribute.itemSize;\n\n\t\t\tconst newLength = group.count * itemSize;\n\t\t\tconst type = attribute.array.constructor;\n\n\t\t\tconst newArray = new type( newLength );\n\t\t\tconst newAttribute = new BufferAttribute( newArray, itemSize );\n\n\t\t\tfor ( let k = start, n = 0; k < end; k ++, n ++ ) {\n\n\t\t\t\tconst ind = index.getX( k );\n\n\t\t\t\tif ( itemSize >= 1 ) newAttribute.setX( n, attribute.getX( ind ) );\n\t\t\t\tif ( itemSize >= 2 ) newAttribute.setY( n, attribute.getY( ind ) );\n\t\t\t\tif ( itemSize >= 3 ) newAttribute.setZ( n, attribute.getZ( ind ) );\n\t\t\t\tif ( itemSize >= 4 ) newAttribute.setW( n, attribute.getW( ind ) );\n\n\t\t\t}\n\n\n\t\t\tnewGeometry.setAttribute( name, newAttribute );\n\n\t\t}\n\n\t\tconst newMesh = new Mesh( newGeometry, newMaterial );\n\t\tobject.add( newMesh );\n\n\t}\n\n\treturn object;\n\n}\n\n/**\n * This function represents an alternative way to create 3D objects with multiple materials.\n * Normally, {@link BufferGeometry#groups} are used which might introduce issues e.g. when\n * exporting the object to a 3D format. This function accepts a geometry and an array of\n * materials and creates for each material a mesh that is added to a group.\n *\n * @param {BufferGeometry} geometry - The geometry.\n * @param {Array<Material>} materials - An array of materials.\n * @return {Group} A group representing a multi-material object.\n */\nfunction createMultiMaterialObject( geometry, materials ) {\n\n\tconst group = new Group();\n\n\tfor ( let i = 0, l = materials.length; i < l; i ++ ) {\n\n\t\tgroup.add( new Mesh( geometry, materials[ i ] ) );\n\n\t}\n\n\treturn group;\n\n}\n\n\n/**\n * Executes a reducer function for each vertex of the given 3D object.\n * `reduceVertices()` returns a single value: the function's accumulated result.\n *\n * @param {Object3D} object - The 3D object that should be processed. It must have a\n * geometry with a `position` attribute.\n * @param {function(number,Vector3):number} func - The reducer function. First argument\n * is the current value, second argument the current vertex.\n * @param {any} initialValue - The initial value.\n * @return {any} The result.\n */\nfunction reduceVertices( object, func, initialValue ) {\n\n\tlet value = initialValue;\n\tconst vertex = new Vector3();\n\n\tobject.updateWorldMatrix( true, true );\n\n\tobject.traverseVisible( ( child ) => {\n\n\t\tconst { geometry } = child;\n\n\t\tif ( geometry !== undefined ) {\n\n\t\t\tconst { position } = geometry.attributes;\n\n\t\t\tif ( position !== undefined ) {\n\n\t\t\t\tfor ( let i = 0, l = position.count; i < l; i ++ ) {\n\n\t\t\t\t\tif ( child.isMesh ) {\n\n\t\t\t\t\t\tchild.getVertexPosition( i, vertex );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvertex.fromBufferAttribute( position, i );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( ! child.isSkinnedMesh ) {\n\n\t\t\t\t\t\tvertex.applyMatrix4( child.matrixWorld );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvalue = func( value, vertex );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t} );\n\n\treturn value;\n\n}\n\n/**\n * Sorts the instances of the given instanced mesh.\n *\n * @param {InstancedMesh} mesh - The instanced mesh to sort.\n * @param {function(number, number):number} compareFn - A custom compare function for the sort.\n */\nfunction sortInstancedMesh( mesh, compareFn ) {\n\n\t// store copy of instanced attributes for lookups\n\n\tconst instanceMatrixRef = deepCloneAttribute( mesh.instanceMatrix );\n\tconst instanceColorRef = mesh.instanceColor ? deepCloneAttribute( mesh.instanceColor ) : null;\n\n\tconst attributeRefs = new Map();\n\n\tfor ( const name in mesh.geometry.attributes ) {\n\n\t\tconst attribute = mesh.geometry.attributes[ name ];\n\n\t\tif ( attribute.isInstancedBufferAttribute ) {\n\n\t\t\tattributeRefs.set( attribute, deepCloneAttribute( attribute ) );\n\n\t\t}\n\n\t}\n\n\n\t// compute sort order\n\n\tconst tokens = [];\n\n\tfor ( let i = 0; i < mesh.count; i ++ ) tokens.push( i );\n\n\ttokens.sort( compareFn );\n\n\n\t// apply sort order\n\n\tfor ( let i = 0; i < tokens.length; i ++ ) {\n\n\t\tconst refIndex = tokens[ i ];\n\n\t\t_matrix.fromArray( instanceMatrixRef.array, refIndex * mesh.instanceMatrix.itemSize );\n\t\t_matrix.toArray( mesh.instanceMatrix.array, i * mesh.instanceMatrix.itemSize );\n\n\t\tif ( mesh.instanceColor ) {\n\n\t\t\t_color.fromArray( instanceColorRef.array, refIndex * mesh.instanceColor.itemSize );\n\t\t\t_color.toArray( mesh.instanceColor.array, i * mesh.instanceColor.itemSize );\n\n\t\t}\n\n\t\tfor ( const name in mesh.geometry.attributes ) {\n\n\t\t\tconst attribute = mesh.geometry.attributes[ name ];\n\n\t\t\tif ( attribute.isInstancedBufferAttribute ) {\n\n\t\t\t\tconst attributeRef = attributeRefs.get( attribute );\n\n\t\t\t\tattribute.setX( i, attributeRef.getX( refIndex ) );\n\t\t\t\tif ( attribute.itemSize > 1 ) attribute.setY( i, attributeRef.getY( refIndex ) );\n\t\t\t\tif ( attribute.itemSize > 2 ) attribute.setZ( i, attributeRef.getZ( refIndex ) );\n\t\t\t\tif ( attribute.itemSize > 3 ) attribute.setW( i, attributeRef.getW( refIndex ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Generator based alternative to {@link Object3D#traverse}.\n *\n * @param {Object3D} object - Object to traverse.\n * @yields {Object3D} Objects that passed the filter condition.\n */\nfunction* traverseGenerator( object ) {\n\n\tyield object;\n\n\tconst children = object.children;\n\n\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\tyield* traverseGenerator( children[ i ] );\n\n\t}\n\n}\n\n/**\n * Generator based alternative to {@link Object3D#traverseVisible}.\n *\n * @param {Object3D} object Object to traverse.\n * @yields {Object3D} Objects that passed the filter condition.\n */\nfunction* traverseVisibleGenerator( object ) {\n\n\tif ( object.visible === false ) return;\n\n\tyield object;\n\n\tconst children = object.children;\n\n\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\tyield* traverseVisibleGenerator( children[ i ] );\n\n\t}\n\n}\n\n/**\n * Generator based alternative to {@link Object3D#traverseAncestors}.\n *\n * @param {Object3D} object Object to traverse.\n * @yields {Object3D} Objects that passed the filter condition.\n */\nfunction* traverseAncestorsGenerator( object ) {\n\n\tconst parent = object.parent;\n\n\tif ( parent !== null ) {\n\n\t\tyield parent;\n\n\t\tyield* traverseAncestorsGenerator( parent );\n\n\t}\n\n}\n\nexport {\n\tcreateMeshesFromInstancedMesh,\n\tcreateMeshesFromMultiMaterialMesh,\n\tcreateMultiMaterialObject,\n\treduceVertices,\n\tsortInstancedMesh,\n\ttraverseGenerator,\n\ttraverseVisibleGenerator,\n\ttraverseAncestorsGenerator\n};\n", "import {\n\tDoubleSide,\n\tCanvasTexture,\n\tMesh,\n\tMeshBasicMaterial,\n\tOrthographicCamera,\n\tPlaneGeometry,\n\tScene,\n\tShaderMaterial\n} from 'three';\n\n/**\n * This is a helper for visualising a given light's shadow map.\n * It works for shadow casting lights: DirectionalLight and SpotLight.\n * It renders out the shadow map and displays it on a HUD.\n *\n * This module can only be used with {@link WebGLRenderer}. When using {@link WebGPURenderer},\n * import the class from `ShadowMapViewerGPU.js`.\n *\n * ```js\n * const lightShadowMapViewer = new ShadowMapViewer( light );\n * lightShadowMapViewer.position.x = 10;\n * lightShadowMapViewer.position.y = SCREEN_HEIGHT - ( SHADOW_MAP_HEIGHT / 4 ) - 10;\n * lightShadowMapViewer.size.width = SHADOW_MAP_WIDTH / 4;\n * lightShadowMapViewer.size.height = SHADOW_MAP_HEIGHT / 4;\n * lightShadowMapViewer.update();\n * ```\n *\n * @three_import import { ShadowMapViewer } from 'three/addons/utils/ShadowMapViewer.js';\n */\nclass ShadowMapViewer {\n\n\t/**\n\t * Constructs a new shadow map viewer.\n\t *\n\t * @param {Light} light - The shadow casting light.\n\t */\n\tconstructor( light ) {\n\n\t\t//- Internals\n\t\tconst scope = this;\n\t\tconst doRenderLabel = ( light.name !== undefined && light.name !== '' );\n\t\tlet userAutoClearSetting;\n\n\t\t//Holds the initial position and dimension of the HUD\n\t\tconst frame = {\n\t\t\tx: 10,\n\t\t\ty: 10,\n\t\t\twidth: 256,\n\t\t\theight: 256\n\t\t};\n\n\t\tconst camera = new OrthographicCamera( window.innerWidth / - 2, window.innerWidth / 2, window.innerHeight / 2, window.innerHeight / - 2, 1, 10 );\n\t\tcamera.position.set( 0, 0, 2 );\n\t\tconst scene = new Scene();\n\n\t\t//HUD for shadow map\n\t\tconst material = new ShaderMaterial( {\n\t\t\tuniforms: {\n\t\t\t\ttDiffuse: { value: null },\n\t\t\t\topacity: { value: 1.0 }\n\t\t\t},\n\t\t\tvertexShader: /* glsl */`\n\t\t\t\tvarying vec2 vUv;\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}`,\n\t\t\tfragmentShader: /* glsl */`\n\t\t\t\tuniform float opacity;\n\t\t\t\tuniform sampler2D tDiffuse;\n\t\t\t\tvarying vec2 vUv;\n\t\t\t\tvoid main() {\n\t\t\t\t\tfloat depth = texture2D( tDiffuse, vUv ).r;\n\t\t\t\t\t#ifdef USE_REVERSED_DEPTH_BUFFER\n\t\t\t\t\t\tgl_FragColor = vec4( vec3( depth ), opacity );\n\t\t\t\t\t#else\n\t\t\t\t\t\tgl_FragColor = vec4( vec3( 1.0 - depth ), opacity );\n\t\t\t\t\t#endif\n\t\t\t\t}`\n\t\t} );\n\t\tconst plane = new PlaneGeometry( frame.width, frame.height );\n\t\tconst mesh = new Mesh( plane, material );\n\n\t\tscene.add( mesh );\n\n\n\t\t//Label for light's name\n\t\tlet labelCanvas, labelMesh;\n\n\t\tif ( doRenderLabel ) {\n\n\t\t\tlabelCanvas = document.createElement( 'canvas' );\n\n\t\t\tconst context = labelCanvas.getContext( '2d' );\n\t\t\tcontext.font = 'Bold 20px Arial';\n\n\t\t\tconst labelWidth = context.measureText( light.name ).width;\n\t\t\tlabelCanvas.width = labelWidth;\n\t\t\tlabelCanvas.height = 25;\t//25 to account for g, p, etc.\n\n\t\t\tcontext.font = 'Bold 20px Arial';\n\t\t\tcontext.fillStyle = 'rgba( 255, 0, 0, 1 )';\n\t\t\tcontext.fillText( light.name, 0, 20 );\n\n\t\t\tconst labelTexture = new CanvasTexture( labelCanvas );\n\n\t\t\tconst labelMaterial = new MeshBasicMaterial( { map: labelTexture, side: DoubleSide, transparent: true } );\n\n\t\t\tconst labelPlane = new PlaneGeometry( labelCanvas.width, labelCanvas.height );\n\t\t\tlabelMesh = new Mesh( labelPlane, labelMaterial );\n\n\t\t\tscene.add( labelMesh );\n\n\t\t}\n\n\n\t\tfunction resetPosition() {\n\n\t\t\tscope.position.set( scope.position.x, scope.position.y );\n\n\t\t}\n\n\t\t/**\n\t\t * Whether to display the shadow map viewer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enabled = true;\n\n\t\t/**\n\t\t * The size of the viewer. When changing this property, make sure\n\t\t * to call {@link ShadowMapViewer#update}.\n\t\t *\n\t\t * @type {{width:number,height:number}}\n\t\t * @default true\n\t\t */\n\t\tthis.size = {\n\t\t\twidth: frame.width,\n\t\t\theight: frame.height,\n\t\t\tset: function ( width, height ) {\n\n\t\t\t\tthis.width = width;\n\t\t\t\tthis.height = height;\n\n\t\t\t\tmesh.scale.set( this.width / frame.width, this.height / frame.height, 1 );\n\n\t\t\t\t//Reset the position as it is off when we scale stuff\n\t\t\t\tresetPosition();\n\n\t\t\t}\n\t\t};\n\n\t\t/**\n\t\t * The position of the viewer. When changing this property, make sure\n\t\t * to call {@link ShadowMapViewer#update}.\n\t\t *\n\t\t * @type {{x:number,y:number, set:function(number,number)}}\n\t\t * @default true\n\t\t */\n\t\tthis.position = {\n\t\t\tx: frame.x,\n\t\t\ty: frame.y,\n\t\t\tset: function ( x, y ) {\n\n\t\t\t\tthis.x = x;\n\t\t\t\tthis.y = y;\n\n\t\t\t\tconst width = scope.size.width;\n\t\t\t\tconst height = scope.size.height;\n\n\t\t\t\tmesh.position.set( - window.innerWidth / 2 + width / 2 + this.x, window.innerHeight / 2 - height / 2 - this.y, 0 );\n\n\t\t\t\tif ( doRenderLabel ) labelMesh.position.set( mesh.position.x, mesh.position.y - scope.size.height / 2 + labelCanvas.height / 2, 0 );\n\n\t\t\t}\n\t\t};\n\n\t\t/**\n\t\t * Renders the viewer. This method must be called in the app's animation loop.\n\t\t *\n\t\t * @param {WebGLRenderer} renderer - The renderer.\n\t\t */\n\t\tthis.render = function ( renderer ) {\n\n\t\t\tif ( this.enabled ) {\n\n\t\t\t\t//Because a light's .shadowMap is only initialised after the first render pass\n\t\t\t\t//we have to make sure the correct map is sent into the shader, otherwise we\n\t\t\t\t//always end up with the scene's first added shadow casting light's shadowMap\n\t\t\t\t//in the shader\n\t\t\t\t//See: https://github.com/mrdoob/three.js/issues/5932\n\t\t\t\tmaterial.uniforms.tDiffuse.value = light.shadow.map.texture;\n\n\t\t\t\tuserAutoClearSetting = renderer.autoClear;\n\t\t\t\trenderer.autoClear = false; // To allow render overlay\n\t\t\t\trenderer.clearDepth();\n\t\t\t\trenderer.render( scene, camera );\n\t\t\t\trenderer.autoClear = userAutoClearSetting;\t//Restore user's setting\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Resizes the viewer. This method should be called whenever the app's\n\t\t * window is resized.\n\t\t */\n\t\tthis.updateForWindowResize = function () {\n\n\t\t\tif ( this.enabled ) {\n\n\t\t\t\t camera.left = window.innerWidth / - 2;\n\t\t\t\t camera.right = window.innerWidth / 2;\n\t\t\t\t camera.top = window.innerHeight / 2;\n\t\t\t\t camera.bottom = window.innerHeight / - 2;\n\t\t\t\t camera.updateProjectionMatrix();\n\n\t\t\t\t this.update();\n\n\t\t\t}\n\n\t\t};\n\n\t\t/**\n\t\t * Updates the viewer.\n\t\t */\n\t\tthis.update = function () {\n\n\t\t\tthis.position.set( this.position.x, this.position.y );\n\t\t\tthis.size.set( this.size.width, this.size.height );\n\n\t\t};\n\n\t\t//Force an update to set position/size\n\t\tthis.update();\n\n\t}\n\n}\n\n\nexport { ShadowMapViewer };\n", "import {\n\tAnimationClip,\n\tAnimationMixer,\n\tMatrix4,\n\tQuaternion,\n\tQuaternionKeyframeTrack,\n\tSkeletonHelper,\n\tVector3,\n\tVectorKeyframeTrack\n} from 'three';\n\n/**\n * @module SkeletonUtils\n * @three_import import * as SkeletonUtils from 'three/addons/utils/SkeletonUtils.js';\n */\n\nfunction getBoneName( bone, options ) {\n\n\tif ( options.getBoneName !== undefined ) {\n\n\t\treturn options.getBoneName( bone );\n\n\t}\n\n\treturn options.names[ bone.name ];\n\n}\n\n/**\n * Retargets the skeleton from the given source 3D object to the\n * target 3D object.\n *\n * @param {Object3D} target - The target 3D object.\n * @param {Object3D} source - The source 3D object.\n * @param {module:SkeletonUtils~RetargetOptions} options - The options.\n */\nfunction retarget( target, source, options = {} ) {\n\n\tconst quat = new Quaternion(),\n\t\tscale = new Vector3(),\n\t\trelativeMatrix = new Matrix4(),\n\t\tglobalMatrix = new Matrix4();\n\n\toptions.preserveBoneMatrix = options.preserveBoneMatrix !== undefined ? options.preserveBoneMatrix : true;\n\toptions.preserveBonePositions = options.preserveBonePositions !== undefined ? options.preserveBonePositions : true;\n\toptions.useTargetMatrix = options.useTargetMatrix !== undefined ? options.useTargetMatrix : false;\n\toptions.hip = options.hip !== undefined ? options.hip : 'hip';\n\toptions.hipInfluence = options.hipInfluence !== undefined ? options.hipInfluence : new Vector3( 1, 1, 1 );\n\toptions.scale = options.scale !== undefined ? options.scale : 1;\n\toptions.names = options.names || {};\n\n\tconst sourceBones = source.isObject3D ? source.skeleton.bones : getBones( source ),\n\t\tbones = target.isObject3D ? target.skeleton.bones : getBones( target );\n\n\tlet bone, name, boneTo,\n\t\tbonesPosition;\n\n\t// reset bones\n\n\tif ( target.isObject3D ) {\n\n\t\ttarget.skeleton.pose();\n\n\t} else {\n\n\t\toptions.useTargetMatrix = true;\n\t\toptions.preserveBoneMatrix = false;\n\n\t}\n\n\tif ( options.preserveBonePositions ) {\n\n\t\tbonesPosition = [];\n\n\t\tfor ( let i = 0; i < bones.length; i ++ ) {\n\n\t\t\tbonesPosition.push( bones[ i ].position.clone() );\n\n\t\t}\n\n\t}\n\n\tif ( options.preserveBoneMatrix ) {\n\n\t\t// reset matrix\n\n\t\ttarget.updateMatrixWorld();\n\n\t\ttarget.matrixWorld.identity();\n\n\t\t// reset children matrix\n\n\t\tfor ( let i = 0; i < target.children.length; ++ i ) {\n\n\t\t\ttarget.children[ i ].updateMatrixWorld( true );\n\n\t\t}\n\n\t}\n\n\tfor ( let i = 0; i < bones.length; ++ i ) {\n\n\t\tbone = bones[ i ];\n\t\tname = getBoneName( bone, options );\n\n\t\tboneTo = getBoneByName( name, sourceBones );\n\n\t\tglobalMatrix.copy( bone.matrixWorld );\n\n\t\tif ( boneTo ) {\n\n\t\t\tboneTo.updateMatrixWorld();\n\n\t\t\tif ( options.useTargetMatrix ) {\n\n\t\t\t\trelativeMatrix.copy( boneTo.matrixWorld );\n\n\t\t\t} else {\n\n\t\t\t\trelativeMatrix.copy( target.matrixWorld ).invert();\n\t\t\t\trelativeMatrix.multiply( boneTo.matrixWorld );\n\n\t\t\t}\n\n\t\t\t// ignore scale to extract rotation\n\n\t\t\tscale.setFromMatrixScale( relativeMatrix );\n\t\t\trelativeMatrix.scale( scale.set( 1 / scale.x, 1 / scale.y, 1 / scale.z ) );\n\n\t\t\t// apply to global matrix\n\n\t\t\tglobalMatrix.makeRotationFromQuaternion( quat.setFromRotationMatrix( relativeMatrix ) );\n\n\t\t\tif ( target.isObject3D ) {\n\n\t\t\t\tif ( options.localOffsets ) {\n\n\t\t\t\t\tif ( options.localOffsets[ bone.name ] ) {\n\n\t\t\t\t\t\tglobalMatrix.multiply( options.localOffsets[ bone.name ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tglobalMatrix.copyPosition( relativeMatrix );\n\n\t\t}\n\n\t\tif ( name === options.hip ) {\n\n\t\t\tglobalMatrix.elements[ 12 ] *= options.scale * options.hipInfluence.x;\n\t\t\tglobalMatrix.elements[ 13 ] *= options.scale * options.hipInfluence.y;\n\t\t\tglobalMatrix.elements[ 14 ] *= options.scale * options.hipInfluence.z;\n\n\t\t\tif ( options.hipPosition !== undefined ) {\n\n\t\t\t\tglobalMatrix.elements[ 12 ] += options.hipPosition.x * options.scale;\n\t\t\t\tglobalMatrix.elements[ 13 ] += options.hipPosition.y * options.scale;\n\t\t\t\tglobalMatrix.elements[ 14 ] += options.hipPosition.z * options.scale;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( bone.parent ) {\n\n\t\t\tbone.matrix.copy( bone.parent.matrixWorld ).invert();\n\t\t\tbone.matrix.multiply( globalMatrix );\n\n\t\t} else {\n\n\t\t\tbone.matrix.copy( globalMatrix );\n\n\t\t}\n\n\t\tbone.matrix.decompose( bone.position, bone.quaternion, bone.scale );\n\n\t\tbone.updateMatrixWorld();\n\n\t}\n\n\tif ( options.preserveBonePositions ) {\n\n\t\tfor ( let i = 0; i < bones.length; ++ i ) {\n\n\t\t\tbone = bones[ i ];\n\t\t\tname = getBoneName( bone, options ) || bone.name;\n\n\t\t\tif ( name !== options.hip ) {\n\n\t\t\t\tbone.position.copy( bonesPosition[ i ] );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tif ( options.preserveBoneMatrix ) {\n\n\t\t// restore matrix\n\n\t\ttarget.updateMatrixWorld( true );\n\n\t}\n\n}\n\n/**\n * Retargets the animation clip of the source object to the\n * target 3D object.\n *\n * @param {Object3D} target - The target 3D object.\n * @param {Object3D} source - The source 3D object.\n * @param {AnimationClip} clip - The animation clip.\n * @param {module:SkeletonUtils~RetargetOptions} options - The options.\n * @return {AnimationClip} The retargeted animation clip.\n */\nfunction retargetClip( target, source, clip, options = {} ) {\n\n\toptions.useFirstFramePosition = options.useFirstFramePosition !== undefined ? options.useFirstFramePosition : false;\n\n\t// Calculate the fps from the source clip based on the track with the most frames, unless fps is already provided.\n\toptions.fps = options.fps !== undefined ? options.fps : ( Math.max( ...clip.tracks.map( track => track.times.length ) ) / clip.duration );\n\toptions.names = options.names || [];\n\n\tif ( ! source.isObject3D ) {\n\n\t\tsource = getHelperFromSkeleton( source );\n\n\t}\n\n\tconst numFrames = Math.round( clip.duration * ( options.fps / 1000 ) * 1000 ),\n\t\tdelta = clip.duration / ( numFrames - 1 ),\n\t\tconvertedTracks = [],\n\t\tmixer = new AnimationMixer( source ),\n\t\tbones = getBones( target.skeleton ),\n\t\tboneDatas = [];\n\n\tlet positionOffset,\n\t\tbone, boneTo, boneData,\n\t\tname;\n\n\tmixer.clipAction( clip ).play();\n\n\t// trim\n\n\tlet start = 0, end = numFrames;\n\n\tif ( options.trim !== undefined ) {\n\n\t\tstart = Math.round( options.trim[ 0 ] * options.fps );\n\t\tend = Math.min( Math.round( options.trim[ 1 ] * options.fps ), numFrames ) - start;\n\n\t\tmixer.update( options.trim[ 0 ] );\n\n\t} else {\n\n\t\tmixer.update( 0 );\n\n\t}\n\n\tsource.updateMatrixWorld();\n\n\t//\n\n\tfor ( let frame = 0; frame < end; ++ frame ) {\n\n\t\tconst time = frame * delta;\n\n\t\tretarget( target, source, options );\n\n\t\tfor ( let j = 0; j < bones.length; ++ j ) {\n\n\t\t\tbone = bones[ j ];\n\t\t\tname = getBoneName( bone, options ) || bone.name;\n\t\t\tboneTo = getBoneByName( name, source.skeleton );\n\n\t\t\tif ( boneTo ) {\n\n\t\t\t\tboneData = boneDatas[ j ] = boneDatas[ j ] || { bone: bone };\n\n\t\t\t\tif ( options.hip === name ) {\n\n\t\t\t\t\tif ( ! boneData.pos ) {\n\n\t\t\t\t\t\tboneData.pos = {\n\t\t\t\t\t\t\ttimes: new Float32Array( end ),\n\t\t\t\t\t\t\tvalues: new Float32Array( end * 3 )\n\t\t\t\t\t\t};\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( options.useFirstFramePosition ) {\n\n\t\t\t\t\t\tif ( frame === 0 ) {\n\n\t\t\t\t\t\t\tpositionOffset = bone.position.clone();\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbone.position.sub( positionOffset );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tboneData.pos.times[ frame ] = time;\n\n\t\t\t\t\tbone.position.toArray( boneData.pos.values, frame * 3 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! boneData.quat ) {\n\n\t\t\t\t\tboneData.quat = {\n\t\t\t\t\t\ttimes: new Float32Array( end ),\n\t\t\t\t\t\tvalues: new Float32Array( end * 4 )\n\t\t\t\t\t};\n\n\t\t\t\t}\n\n\t\t\t\tboneData.quat.times[ frame ] = time;\n\n\t\t\t\tbone.quaternion.toArray( boneData.quat.values, frame * 4 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( frame === end - 2 ) {\n\n\t\t\t// last mixer update before final loop iteration\n\t\t\t// make sure we do not go over or equal to clip duration\n\t\t\tmixer.update( delta - 0.0000001 );\n\n\t\t} else {\n\n\t\t\tmixer.update( delta );\n\n\t\t}\n\n\t\tsource.updateMatrixWorld();\n\n\t}\n\n\tfor ( let i = 0; i < boneDatas.length; ++ i ) {\n\n\t\tboneData = boneDatas[ i ];\n\n\t\tif ( boneData ) {\n\n\t\t\tif ( boneData.pos ) {\n\n\t\t\t\tconvertedTracks.push( new VectorKeyframeTrack(\n\t\t\t\t\t'.bones[' + boneData.bone.name + '].position',\n\t\t\t\t\tboneData.pos.times,\n\t\t\t\t\tboneData.pos.values\n\t\t\t\t) );\n\n\t\t\t}\n\n\t\t\tconvertedTracks.push( new QuaternionKeyframeTrack(\n\t\t\t\t'.bones[' + boneData.bone.name + '].quaternion',\n\t\t\t\tboneData.quat.times,\n\t\t\t\tboneData.quat.values\n\t\t\t) );\n\n\t\t}\n\n\t}\n\n\tmixer.uncacheAction( clip );\n\n\treturn new AnimationClip( clip.name, - 1, convertedTracks );\n\n}\n\n/**\n * Clones the given 3D object and its descendants, ensuring that any `SkinnedMesh` instances are\n * correctly associated with their bones. Bones are also cloned, and must be descendants of the\n * object passed to this method. Other data, like geometries and materials, are reused by reference.\n *\n * @param {Object3D} source - The 3D object to clone.\n * @return {Object3D} The cloned 3D object.\n */\nfunction clone( source ) {\n\n\tconst sourceLookup = new Map();\n\tconst cloneLookup = new Map();\n\n\tconst clone = source.clone();\n\n\tparallelTraverse( source, clone, function ( sourceNode, clonedNode ) {\n\n\t\tsourceLookup.set( clonedNode, sourceNode );\n\t\tcloneLookup.set( sourceNode, clonedNode );\n\n\t} );\n\n\tclone.traverse( function ( node ) {\n\n\t\tif ( ! node.isSkinnedMesh ) return;\n\n\t\tconst clonedMesh = node;\n\t\tconst sourceMesh = sourceLookup.get( node );\n\t\tconst sourceBones = sourceMesh.skeleton.bones;\n\n\t\tclonedMesh.skeleton = sourceMesh.skeleton.clone();\n\t\tclonedMesh.bindMatrix.copy( sourceMesh.bindMatrix );\n\n\t\tclonedMesh.skeleton.bones = sourceBones.map( function ( bone ) {\n\n\t\t\treturn cloneLookup.get( bone );\n\n\t\t} );\n\n\t\tclonedMesh.bind( clonedMesh.skeleton, clonedMesh.bindMatrix );\n\n\t} );\n\n\treturn clone;\n\n}\n\n// internal helper\n\nfunction getBoneByName( name, skeleton ) {\n\n\tfor ( let i = 0, bones = getBones( skeleton ); i < bones.length; i ++ ) {\n\n\t\tif ( name === bones[ i ].name )\n\n\t\t\treturn bones[ i ];\n\n\t}\n\n}\n\nfunction getBones( skeleton ) {\n\n\treturn Array.isArray( skeleton ) ? skeleton : skeleton.bones;\n\n}\n\n\nfunction getHelperFromSkeleton( skeleton ) {\n\n\tconst source = new SkeletonHelper( skeleton.bones[ 0 ] );\n\tsource.skeleton = skeleton;\n\n\treturn source;\n\n}\n\nfunction parallelTraverse( a, b, callback ) {\n\n\tcallback( a, b );\n\n\tfor ( let i = 0; i < a.children.length; i ++ ) {\n\n\t\tparallelTraverse( a.children[ i ], b.children[ i ], callback );\n\n\t}\n\n}\n\n/**\n * Retarget options of `SkeletonUtils`.\n *\n * @typedef {Object} module:SkeletonUtils~RetargetOptions\n * @property {boolean} [useFirstFramePosition=false] - Whether to use the position of the first frame or not.\n * @property {number} [fps] - The FPS of the clip.\n * @property {Object<string,string>} [names] - A dictionary for mapping target to source bone names.\n * @property {function(string):string} [getBoneName] - A function for mapping bone names. Alternative to `names`.\n * @property {Array<number>} [trim] - Whether to trim the clip or not. If set the array should hold two values for the start and end.\n * @property {boolean} [preserveBoneMatrix=true] - Whether to preserve bone matrices or not.\n * @property {boolean} [preserveBonePositions=true] - Whether to preserve bone positions or not.\n * @property {boolean} [useTargetMatrix=false] - Whether to use the target matrix or not.\n * @property {string} [hip='hip'] - The name of the source's hip bone.\n * @property {Vector3} [hipInfluence=(1,1,1)] - The hip influence.\n * @property {number} [scale=1] - The scale.\n **/\n\nexport {\n\tretarget,\n\tretargetClip,\n\tclone,\n};\n", "\n/**\n * @module SortUtils\n * @three_import import * as SortUtils from 'three/addons/utils/SortUtils.js';\n */\n\nconst POWER = 3;\nconst BIT_MAX = 32;\nconst BIN_BITS = 1 << POWER;\nconst BIN_SIZE = 1 << BIN_BITS;\nconst BIN_MAX = BIN_SIZE - 1;\nconst ITERATIONS = BIT_MAX / BIN_BITS;\n\nconst bins = new Array( ITERATIONS );\nconst bins_buffer = new ArrayBuffer( ( ITERATIONS + 1 ) * BIN_SIZE * 4 );\n\nlet c = 0;\nfor ( let i = 0; i < ( ITERATIONS + 1 ); i ++ ) {\n\n\tbins[ i ] = new Uint32Array( bins_buffer, c, BIN_SIZE );\n\tc += BIN_SIZE * 4;\n\n}\n\nconst defaultGet = ( el ) => el;\n\n/**\n * Hybrid radix sort from.\n *\n * - {@link https://gist.github.com/sciecode/93ed864dd77c5c8803c6a86698d68dab}\n * - {@link https://github.com/mrdoob/three.js/pull/27202#issuecomment-1817640271}\n *\n * Expects unsigned 32b integer values.\n *\n * @function\n * @param {Array<Object>} arr - The array to sort.\n * @param {Object} opt - The options\n */\nexport const radixSort = ( arr, opt ) => {\n\n\tconst len = arr.length;\n\n\tconst options = opt || {};\n\tconst aux = options.aux || new arr.constructor( len );\n\tconst get = options.get || defaultGet;\n\n\tconst data = [ arr, aux ];\n\n\tlet compare, accumulate, recurse;\n\n\tif ( options.reversed ) {\n\n\t\tcompare = ( a, b ) => a < b;\n\t\taccumulate = ( bin ) => {\n\n\t\t\tfor ( let j = BIN_SIZE - 2; j >= 0; j -- )\n\t\t\t\tbin[ j ] += bin[ j + 1 ];\n\n\t\t};\n\n\t\trecurse = ( cache, depth, start ) => {\n\n\t\t\tlet prev = 0;\n\t\t\tfor ( let j = BIN_MAX; j >= 0; j -- ) {\n\n\t\t\t\tconst cur = cache[ j ], diff = cur - prev;\n\t\t\t\tif ( diff != 0 ) {\n\n\t\t\t\t\tif ( diff > 32 )\n\t\t\t\t\t\tradixSortBlock( depth + 1, start + prev, diff );\n\t\t\t\t\telse\n\t\t\t\t\t\tinsertionSortBlock( depth + 1, start + prev, diff );\n\t\t\t\t\tprev = cur;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t} else {\n\n\t\tcompare = ( a, b ) => a > b;\n\t\taccumulate = ( bin ) => {\n\n\t\t\tfor ( let j = 1; j < BIN_SIZE; j ++ )\n\t\t\t\tbin[ j ] += bin[ j - 1 ];\n\n\t\t};\n\n\t\trecurse = ( cache, depth, start ) => {\n\n\t\t\tlet prev = 0;\n\t\t\tfor ( let j = 0; j < BIN_SIZE; j ++ ) {\n\n\t\t\t\tconst cur = cache[ j ], diff = cur - prev;\n\t\t\t\tif ( diff != 0 ) {\n\n\t\t\t\t\tif ( diff > 32 )\n\t\t\t\t\t\tradixSortBlock( depth + 1, start + prev, diff );\n\t\t\t\t\telse\n\t\t\t\t\t\tinsertionSortBlock( depth + 1, start + prev, diff );\n\t\t\t\t\tprev = cur;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t};\n\n\t}\n\n\tconst insertionSortBlock = ( depth, start, len ) => {\n\n\t\tconst a = data[ depth & 1 ];\n\t\tconst b = data[ ( depth + 1 ) & 1 ];\n\n\t\tfor ( let j = start + 1; j < start + len; j ++ ) {\n\n\t\t\tconst p = a[ j ], t = get( p ) >>> 0;\n\t\t\tlet i = j;\n\t\t\twhile ( i > start ) {\n\n\t\t\t\tif ( compare( get( a[ i - 1 ] ) >>> 0, t ) )\n\t\t\t\t\ta[ i ] = a[ -- i ];\n\t\t\t\telse\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\ta[ i ] = p;\n\n\t\t}\n\n\t\tif ( ( depth & 1 ) == 1 ) {\n\n\t\t\tfor ( let i = start; i < start + len; i ++ )\n\t\t\t\tb[ i ] = a[ i ];\n\n\t\t}\n\n\t};\n\n\tconst radixSortBlock = ( depth, start, len ) => {\n\n\t\tconst a = data[ depth & 1 ];\n\t\tconst b = data[ ( depth + 1 ) & 1 ];\n\n\t\tconst shift = ( 3 - depth ) << POWER;\n\t\tconst end = start + len;\n\n\t\tconst cache = bins[ depth ];\n\t\tconst bin = bins[ depth + 1 ];\n\n\t\tbin.fill( 0 );\n\n\t\tfor ( let j = start; j < end; j ++ )\n\t\t\tbin[ ( get( a[ j ] ) >>> shift ) & BIN_MAX ] ++;\n\n\t\taccumulate( bin );\n\n\t\tcache.set( bin );\n\n\t\tfor ( let j = end - 1; j >= start; j -- )\n\t\t\tb[ start + -- bin[ ( get( a[ j ] ) >>> shift ) & BIN_MAX ] ] = a[ j ];\n\n\t\tif ( depth == ITERATIONS - 1 ) return;\n\n\t\trecurse( cache, depth, start );\n\n\t};\n\n\tradixSortBlock( 0, 0, len );\n\n};\n", "import {\n\tPlaneGeometry,\n\tShaderMaterial,\n\tUniform,\n\tMesh,\n\tPerspectiveCamera,\n\tScene,\n\tWebGLRenderer,\n\tCanvasTexture,\n\tSRGBColorSpace\n} from 'three';\n\n/**\n * @module WebGLTextureUtils\n * @three_import import * as WebGLTextureUtils from 'three/addons/utils/WebGLTextureUtils.js';\n */\n\nlet _renderer;\nlet fullscreenQuadGeometry;\nlet fullscreenQuadMaterial;\nlet fullscreenQuad;\n\n/**\n * Returns an uncompressed version of the given compressed texture.\n *\n * This module can only be used with {@link WebGLRenderer}. When using {@link WebGPURenderer},\n * import the function from {@link WebGPUTextureUtils}.\n *\n * @param {CompressedTexture} texture - The compressed texture.\n * @param {number} [maxTextureSize=Infinity] - The maximum size of the uncompressed texture.\n * @param {?WebGLRenderer} [renderer=null] - A reference to a renderer.\n * @return {CanvasTexture} The uncompressed texture.\n */\nexport function decompress( texture, maxTextureSize = Infinity, renderer = null ) {\n\n\tif ( ! fullscreenQuadGeometry ) fullscreenQuadGeometry = new PlaneGeometry( 2, 2, 1, 1 );\n\tif ( ! fullscreenQuadMaterial ) fullscreenQuadMaterial = new ShaderMaterial( {\n\t\tuniforms: { blitTexture: new Uniform( texture ) },\n\t\tvertexShader: `\n\t\t\tvarying vec2 vUv;\n\t\t\tvoid main(){\n\t\t\t\tvUv = uv;\n\t\t\t\tgl_Position = vec4(position.xy * 1.0,0.,.999999);\n\t\t\t}`,\n\t\tfragmentShader: `\n\t\t\tuniform sampler2D blitTexture; \n\t\t\tvarying vec2 vUv;\n\n\t\t\tvoid main(){ \n\t\t\t\tgl_FragColor = vec4(vUv.xy, 0, 1);\n\t\t\t\t\n\t\t\t\t#ifdef IS_SRGB\n\t\t\t\tgl_FragColor = sRGBTransferOETF( texture2D( blitTexture, vUv) );\n\t\t\t\t#else\n\t\t\t\tgl_FragColor = texture2D( blitTexture, vUv);\n\t\t\t\t#endif\n\t\t\t}`\n\t} );\n\n\tfullscreenQuadMaterial.uniforms.blitTexture.value = texture;\n\tfullscreenQuadMaterial.defines.IS_SRGB = texture.colorSpace == SRGBColorSpace;\n\tfullscreenQuadMaterial.needsUpdate = true;\n\n\tif ( ! fullscreenQuad ) {\n\n\t\tfullscreenQuad = new Mesh( fullscreenQuadGeometry, fullscreenQuadMaterial );\n\t\tfullscreenQuad.frustumCulled = false;\n\n\t}\n\n\tconst _camera = new PerspectiveCamera();\n\tconst _scene = new Scene();\n\t_scene.add( fullscreenQuad );\n\n\tif ( renderer === null ) {\n\n\t\trenderer = _renderer = new WebGLRenderer( { antialias: false } );\n\n\t}\n\n\tconst width = Math.min( texture.image.width, maxTextureSize );\n\tconst height = Math.min( texture.image.height, maxTextureSize );\n\n\trenderer.setSize( width, height );\n\trenderer.clear();\n\trenderer.render( _scene, _camera );\n\n\tconst canvas = document.createElement( 'canvas' );\n\tconst context = canvas.getContext( '2d' );\n\n\tcanvas.width = width;\n\tcanvas.height = height;\n\n\tcontext.drawImage( renderer.domElement, 0, 0, width, height );\n\n\tconst readableTexture = new CanvasTexture( canvas );\n\n\treadableTexture.minFilter = texture.minFilter;\n\treadableTexture.magFilter = texture.magFilter;\n\treadableTexture.wrapS = texture.wrapS;\n\treadableTexture.wrapT = texture.wrapT;\n\treadableTexture.colorSpace = texture.colorSpace;\n\treadableTexture.name = texture.name;\n\n\tif ( _renderer ) {\n\n\t\t_renderer.forceContextLoss();\n\t\t_renderer.dispose();\n\t\t_renderer = null;\n\n\t}\n\n\treturn readableTexture;\n\n}\n", "import {\n\tVector2\n} from 'three';\n\n/**\n * @module UVsDebug\n * @three_import import { UVsDebug } from 'three/addons/utils/UVsDebug.js';\n */\n\n/**\n * Function for \"unwrapping\" and debugging three.js geometries UV mapping.\n *\n * ```js\n * document.body.appendChild( UVsDebug( new THREE.SphereGeometry() ) );\n * ```\n *\n * @param {BufferGeometry} geometry - The geometry whose uv coordinates should be inspected.\n * @param {number} [size=1024] - The size of the debug canvas.\n * @return {HTMLCanvasElement} A canvas element with visualized uv coordinates.\n */\nfunction UVsDebug( geometry, size = 1024 ) {\n\n\t// handles wrapping of uv.x > 1 only\n\n\tconst abc = 'abc';\n\tconst a = new Vector2();\n\tconst b = new Vector2();\n\n\tconst uvs = [\n\t\tnew Vector2(),\n\t\tnew Vector2(),\n\t\tnew Vector2()\n\t];\n\n\tconst face = [];\n\n\tconst canvas = document.createElement( 'canvas' );\n\tconst width = size; // power of 2 required for wrapping\n\tconst height = size;\n\tcanvas.width = width;\n\tcanvas.height = height;\n\n\tconst ctx = canvas.getContext( '2d' );\n\tctx.lineWidth = 1;\n\tctx.strokeStyle = 'rgb( 63, 63, 63 )';\n\tctx.textAlign = 'center';\n\n\t// paint background white\n\n\tctx.fillStyle = 'rgb( 255, 255, 255 )';\n\tctx.fillRect( 0, 0, width, height );\n\n\tconst index = geometry.index;\n\tconst uvAttribute = geometry.attributes.uv;\n\n\tif ( index ) {\n\n\t\t// indexed geometry\n\n\t\tfor ( let i = 0, il = index.count; i < il; i += 3 ) {\n\n\t\t\tface[ 0 ] = index.getX( i );\n\t\t\tface[ 1 ] = index.getX( i + 1 );\n\t\t\tface[ 2 ] = index.getX( i + 2 );\n\n\t\t\tuvs[ 0 ].fromBufferAttribute( uvAttribute, face[ 0 ] );\n\t\t\tuvs[ 1 ].fromBufferAttribute( uvAttribute, face[ 1 ] );\n\t\t\tuvs[ 2 ].fromBufferAttribute( uvAttribute, face[ 2 ] );\n\n\t\t\tprocessFace( face, uvs, i / 3 );\n\n\t\t}\n\n\t} else {\n\n\t\t// non-indexed geometry\n\n\t\tfor ( let i = 0, il = uvAttribute.count; i < il; i += 3 ) {\n\n\t\t\tface[ 0 ] = i;\n\t\t\tface[ 1 ] = i + 1;\n\t\t\tface[ 2 ] = i + 2;\n\n\t\t\tuvs[ 0 ].fromBufferAttribute( uvAttribute, face[ 0 ] );\n\t\t\tuvs[ 1 ].fromBufferAttribute( uvAttribute, face[ 1 ] );\n\t\t\tuvs[ 2 ].fromBufferAttribute( uvAttribute, face[ 2 ] );\n\n\t\t\tprocessFace( face, uvs, i / 3 );\n\n\t\t}\n\n\t}\n\n\treturn canvas;\n\n\tfunction processFace( face, uvs, index ) {\n\n\t\t// draw contour of face\n\n\t\tctx.beginPath();\n\n\t\ta.set( 0, 0 );\n\n\t\tfor ( let j = 0, jl = uvs.length; j < jl; j ++ ) {\n\n\t\t\tconst uv = uvs[ j ];\n\n\t\t\ta.x += uv.x;\n\t\t\ta.y += uv.y;\n\n\t\t\tif ( j === 0 ) {\n\n\t\t\t\tctx.moveTo( uv.x * ( width - 2 ) + 0.5, ( 1 - uv.y ) * ( height - 2 ) + 0.5 );\n\n\t\t\t} else {\n\n\t\t\t\tctx.lineTo( uv.x * ( width - 2 ) + 0.5, ( 1 - uv.y ) * ( height - 2 ) + 0.5 );\n\n\t\t\t}\n\n\t\t}\n\n\t\tctx.closePath();\n\t\tctx.stroke();\n\n\t\t// calculate center of face\n\n\t\ta.divideScalar( uvs.length );\n\n\t\t// label the face number\n\n\t\tctx.font = '18px Arial';\n\t\tctx.fillStyle = 'rgb( 63, 63, 63 )';\n\t\tctx.fillText( index, a.x * width, ( 1 - a.y ) * height );\n\n\t\tif ( a.x > 0.95 ) {\n\n\t\t\t// wrap x // 0.95 is arbitrary\n\n\t\t\tctx.fillText( index, ( a.x % 1 ) * width, ( 1 - a.y ) * height );\n\n\t\t}\n\n\t\t//\n\n\t\tctx.font = '12px Arial';\n\t\tctx.fillStyle = 'rgb( 191, 191, 191 )';\n\n\t\t// label uv edge orders\n\n\t\tfor ( let j = 0, jl = uvs.length; j < jl; j ++ ) {\n\n\t\t\tconst uv = uvs[ j ];\n\t\t\tb.addVectors( a, uv ).divideScalar( 2 );\n\n\t\t\tconst vnum = face[ j ];\n\t\t\tctx.fillText( abc[ j ] + vnum, b.x * width, ( 1 - b.y ) * height );\n\n\t\t\tif ( b.x > 0.95 ) {\n\n\t\t\t\t// wrap x\n\n\t\t\t\tctx.fillText( abc[ j ] + vnum, ( b.x % 1 ) * width, ( 1 - b.y ) * height );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nexport { UVsDebug };\n", "/**\n * A utility class for creating a button that allows to initiate\n * immersive AR sessions based on WebXR. The button can be created\n * with a factory method and then appended ot the website's DOM.\n *\n * ```js\n * document.body.appendChild( ARButton.createButton( renderer ) );\n * ```\n *\n * @hideconstructor\n * @three_import import { ARButton } from 'three/addons/webxr/ARButton.js';\n */\nclass ARButton {\n\n\t/**\n\t * Constructs a new AR button.\n\t *\n\t * @param {WebGLRenderer|WebGPURenderer} renderer - The renderer.\n\t * @param {XRSessionInit} [sessionInit] - The a configuration object for the AR session.\n\t * @return {HTMLElement} The button or an error message if `immersive-ar` isn't supported.\n\t */\n\tstatic createButton( renderer, sessionInit = {} ) {\n\n\t\tconst button = document.createElement( 'button' );\n\n\t\tfunction showStartAR( /*device*/ ) {\n\n\t\t\tif ( sessionInit.domOverlay === undefined ) {\n\n\t\t\t\tconst overlay = document.createElement( 'div' );\n\t\t\t\toverlay.style.display = 'none';\n\t\t\t\tdocument.body.appendChild( overlay );\n\n\t\t\t\tconst svg = document.createElementNS( 'http://www.w3.org/2000/svg', 'svg' );\n\t\t\t\tsvg.setAttribute( 'width', 38 );\n\t\t\t\tsvg.setAttribute( 'height', 38 );\n\t\t\t\tsvg.style.position = 'absolute';\n\t\t\t\tsvg.style.right = '20px';\n\t\t\t\tsvg.style.top = '20px';\n\t\t\t\tsvg.addEventListener( 'click', function () {\n\n\t\t\t\t\tcurrentSession.end();\n\n\t\t\t\t} );\n\t\t\t\toverlay.appendChild( svg );\n\n\t\t\t\tconst path = document.createElementNS( 'http://www.w3.org/2000/svg', 'path' );\n\t\t\t\tpath.setAttribute( 'd', 'M 12,12 L 28,28 M 28,12 12,28' );\n\t\t\t\tpath.setAttribute( 'stroke', '#fff' );\n\t\t\t\tpath.setAttribute( 'stroke-width', 2 );\n\t\t\t\tsvg.appendChild( path );\n\n\t\t\t\tif ( sessionInit.optionalFeatures === undefined ) {\n\n\t\t\t\t\tsessionInit.optionalFeatures = [];\n\n\t\t\t\t}\n\n\t\t\t\tsessionInit.optionalFeatures.push( 'dom-overlay' );\n\t\t\t\tsessionInit.domOverlay = { root: overlay };\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tlet currentSession = null;\n\n\t\t\tasync function onSessionStarted( session ) {\n\n\t\t\t\tsession.addEventListener( 'end', onSessionEnded );\n\n\t\t\t\trenderer.xr.setReferenceSpaceType( 'local' );\n\n\t\t\t\tawait renderer.xr.setSession( session );\n\n\t\t\t\tbutton.textContent = 'STOP AR';\n\t\t\t\tsessionInit.domOverlay.root.style.display = '';\n\n\t\t\t\tcurrentSession = session;\n\n\t\t\t}\n\n\t\t\tfunction onSessionEnded( /*event*/ ) {\n\n\t\t\t\tcurrentSession.removeEventListener( 'end', onSessionEnded );\n\n\t\t\t\tbutton.textContent = 'START AR';\n\t\t\t\tsessionInit.domOverlay.root.style.display = 'none';\n\n\t\t\t\tcurrentSession = null;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tbutton.style.display = '';\n\n\t\t\tbutton.style.cursor = 'pointer';\n\t\t\tbutton.style.left = 'calc(50% - 50px)';\n\t\t\tbutton.style.width = '100px';\n\n\t\t\tbutton.textContent = 'START AR';\n\n\t\t\tbutton.onmouseenter = function () {\n\n\t\t\t\tbutton.style.opacity = '1.0';\n\n\t\t\t};\n\n\t\t\tbutton.onmouseleave = function () {\n\n\t\t\t\tbutton.style.opacity = '0.5';\n\n\t\t\t};\n\n\t\t\tbutton.onclick = function () {\n\n\t\t\t\tif ( currentSession === null ) {\n\n\t\t\t\t\tnavigator.xr.requestSession( 'immersive-ar', sessionInit ).then( onSessionStarted );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcurrentSession.end();\n\n\t\t\t\t\tif ( navigator.xr.offerSession !== undefined ) {\n\n\t\t\t\t\t\tnavigator.xr.offerSession( 'immersive-ar', sessionInit )\n\t\t\t\t\t\t\t.then( onSessionStarted )\n\t\t\t\t\t\t\t.catch( ( err ) => {\n\n\t\t\t\t\t\t\t\tconsole.warn( err );\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t\tif ( navigator.xr.offerSession !== undefined ) {\n\n\t\t\t\tnavigator.xr.offerSession( 'immersive-ar', sessionInit )\n\t\t\t\t\t.then( onSessionStarted )\n\t\t\t\t\t.catch( ( err ) => {\n\n\t\t\t\t\t\tconsole.warn( err );\n\n\t\t\t\t\t} );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction disableButton() {\n\n\t\t\tbutton.style.display = '';\n\n\t\t\tbutton.style.cursor = 'auto';\n\t\t\tbutton.style.left = 'calc(50% - 75px)';\n\t\t\tbutton.style.width = '150px';\n\n\t\t\tbutton.onmouseenter = null;\n\t\t\tbutton.onmouseleave = null;\n\n\t\t\tbutton.onclick = null;\n\n\t\t}\n\n\t\tfunction showARNotSupported() {\n\n\t\t\tdisableButton();\n\n\t\t\tbutton.textContent = 'AR NOT SUPPORTED';\n\n\t\t}\n\n\t\tfunction showARNotAllowed( exception ) {\n\n\t\t\tdisableButton();\n\n\t\t\tconsole.warn( 'Exception when trying to call xr.isSessionSupported', exception );\n\n\t\t\tbutton.textContent = 'AR NOT ALLOWED';\n\n\t\t}\n\n\t\tfunction stylizeElement( element ) {\n\n\t\t\telement.style.position = 'absolute';\n\t\t\telement.style.bottom = '20px';\n\t\t\telement.style.padding = '12px 6px';\n\t\t\telement.style.border = '1px solid #fff';\n\t\t\telement.style.borderRadius = '4px';\n\t\t\telement.style.background = 'rgba(0,0,0,0.1)';\n\t\t\telement.style.color = '#fff';\n\t\t\telement.style.font = 'normal 13px sans-serif';\n\t\t\telement.style.textAlign = 'center';\n\t\t\telement.style.opacity = '0.5';\n\t\t\telement.style.outline = 'none';\n\t\t\telement.style.zIndex = '999';\n\n\t\t}\n\n\t\tif ( 'xr' in navigator ) {\n\n\t\t\tbutton.id = 'ARButton';\n\t\t\tbutton.style.display = 'none';\n\n\t\t\tstylizeElement( button );\n\n\t\t\tnavigator.xr.isSessionSupported( 'immersive-ar' ).then( function ( supported ) {\n\n\t\t\t\tsupported ? showStartAR() : showARNotSupported();\n\n\t\t\t} ).catch( showARNotAllowed );\n\n\t\t\treturn button;\n\n\t\t} else {\n\n\t\t\tconst message = document.createElement( 'a' );\n\n\t\t\tif ( window.isSecureContext === false ) {\n\n\t\t\t\tmessage.href = document.location.href.replace( /^http:/, 'https:' );\n\t\t\t\tmessage.innerHTML = 'WEBXR NEEDS HTTPS'; // TODO Improve message\n\n\t\t\t} else {\n\n\t\t\t\tmessage.href = 'https://immersiveweb.dev/';\n\t\t\t\tmessage.innerHTML = 'WEBXR NOT AVAILABLE';\n\n\t\t\t}\n\n\t\t\tmessage.style.left = 'calc(50% - 90px)';\n\t\t\tmessage.style.width = '180px';\n\t\t\tmessage.style.textDecoration = 'none';\n\n\t\t\tstylizeElement( message );\n\n\t\t\treturn message;\n\n\t\t}\n\n\t}\n\n}\n\nexport { ARButton };\n", "import { GLTFLoader } from '../loaders/GLTFLoader.js';\n\nconst DEFAULT_HAND_PROFILE_PATH = 'https://cdn.jsdelivr.net/npm/@webxr-input-profiles/assets@1.0/dist/profiles/generic-hand/';\n\n/**\n * Represents one of the hand model types {@link XRHandModelFactory} might produce\n * depending on the selected profile. `XRHandMeshModel` represents a hand with a\n * custom asset.\n *\n * @three_import import { XRHandMeshModel } from 'three/addons/webxr/XRHandMeshModel.js';\n */\nclass XRHandMeshModel {\n\n\t/**\n\t * Constructs a new XR hand mesh model.\n\t *\n\t * @param {XRHandModel} handModel - The hand model.\n\t * @param {Group} controller - The WebXR controller.\n\t * @param {?string} path - The model path.\n\t * @param {XRHandedness} handedness - The handedness of the XR input source.\n\t * @param {?Loader} [loader=null] - The loader. If not provided, an instance of `GLTFLoader` will be used to load models.\n\t * @param {?Function} [onLoad=null] - A callback that is executed when a controller model has been loaded.\n\t */\n\tconstructor( handModel, controller, path, handedness, loader = null, onLoad = null ) {\n\n\t\t/**\n\t\t * The WebXR controller.\n\t\t *\n\t\t * @type {Group}\n\t\t */\n\t\tthis.controller = controller;\n\n\t\t/**\n\t\t * The hand model.\n\t\t *\n\t\t * @type {XRHandModel}\n\t\t */\n\t\tthis.handModel = handModel;\n\n\t\t/**\n\t\t * An array of bones representing the bones\n\t\t * of the hand skeleton.\n\t\t *\n\t\t * @type {Array<Bone>}\n\t\t */\n\t\tthis.bones = [];\n\n\t\tif ( loader === null ) {\n\n\t\t\tloader = new GLTFLoader();\n\t\t\tloader.setPath( path || DEFAULT_HAND_PROFILE_PATH );\n\n\t\t}\n\n\t\tloader.load( `${handedness}.glb`, gltf => {\n\n\t\t\tconst object = gltf.scene.children[ 0 ];\n\t\t\tthis.handModel.add( object );\n\n\t\t\tconst mesh = object.getObjectByProperty( 'type', 'SkinnedMesh' );\n\t\t\tmesh.frustumCulled = false;\n\t\t\tmesh.castShadow = true;\n\t\t\tmesh.receiveShadow = true;\n\n\t\t\tconst joints = [\n\t\t\t\t'wrist',\n\t\t\t\t'thumb-metacarpal',\n\t\t\t\t'thumb-phalanx-proximal',\n\t\t\t\t'thumb-phalanx-distal',\n\t\t\t\t'thumb-tip',\n\t\t\t\t'index-finger-metacarpal',\n\t\t\t\t'index-finger-phalanx-proximal',\n\t\t\t\t'index-finger-phalanx-intermediate',\n\t\t\t\t'index-finger-phalanx-distal',\n\t\t\t\t'index-finger-tip',\n\t\t\t\t'middle-finger-metacarpal',\n\t\t\t\t'middle-finger-phalanx-proximal',\n\t\t\t\t'middle-finger-phalanx-intermediate',\n\t\t\t\t'middle-finger-phalanx-distal',\n\t\t\t\t'middle-finger-tip',\n\t\t\t\t'ring-finger-metacarpal',\n\t\t\t\t'ring-finger-phalanx-proximal',\n\t\t\t\t'ring-finger-phalanx-intermediate',\n\t\t\t\t'ring-finger-phalanx-distal',\n\t\t\t\t'ring-finger-tip',\n\t\t\t\t'pinky-finger-metacarpal',\n\t\t\t\t'pinky-finger-phalanx-proximal',\n\t\t\t\t'pinky-finger-phalanx-intermediate',\n\t\t\t\t'pinky-finger-phalanx-distal',\n\t\t\t\t'pinky-finger-tip',\n\t\t\t];\n\n\t\t\tjoints.forEach( jointName => {\n\n\t\t\t\tconst bone = object.getObjectByName( jointName );\n\n\t\t\t\tif ( bone !== undefined ) {\n\n\t\t\t\t\tbone.jointName = jointName;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconsole.warn( `Couldn't find ${jointName} in ${handedness} hand mesh` );\n\n\t\t\t\t}\n\n\t\t\t\tthis.bones.push( bone );\n\n\t\t\t} );\n\n\t\t\tif ( onLoad ) onLoad( object );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Updates the mesh based on the tracked XR joints data.\n\t */\n\tupdateMesh() {\n\n\t\t// XR Joints\n\t\tconst XRJoints = this.controller.joints;\n\n\t\tfor ( let i = 0; i < this.bones.length; i ++ ) {\n\n\t\t\tconst bone = this.bones[ i ];\n\n\t\t\tif ( bone ) {\n\n\t\t\t\tconst XRJoint = XRJoints[ bone.jointName ];\n\n\t\t\t\tif ( XRJoint.visible ) {\n\n\t\t\t\t\tconst position = XRJoint.position;\n\n\t\t\t\t\tbone.position.copy( position );\n\t\t\t\t\tbone.quaternion.copy( XRJoint.quaternion );\n\t\t\t\t\t// bone.scale.setScalar( XRJoint.jointRadius || defaultRadius );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nexport { XRHandMeshModel };\n", "import { Object3D, Sphere, Box3 } from 'three';\nimport { XRHandMeshModel } from './XRHandMeshModel.js';\n\nconst TOUCH_RADIUS = 0.01;\nconst POINTING_JOINT = 'index-finger-tip';\n\n/**\n * Represents an Oculus hand model.\n *\n * @augments Object3D\n * @three_import import { OculusHandModel } from 'three/addons/webxr/OculusHandModel.js';\n */\nclass OculusHandModel extends Object3D {\n\n\t/**\n\t * Constructs a new Oculus hand model.\n\t *\n\t * @param {Group} controller - The hand controller.\n\t * @param {?Loader} [loader=null] - A loader that is used to load hand models.\n\t * @param {?Function} [onLoad=null] - A callback that is executed when a hand model has been loaded.\n\t */\n\tconstructor( controller, loader = null, onLoad = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The hand controller.\n\t\t *\n\t\t * @type {Group}\n\t\t */\n\t\tthis.controller = controller;\n\n\t\t/**\n\t\t * The motion controller.\n\t\t *\n\t\t * @type {?MotionController}\n\t\t * @default null\n\t\t */\n\t\tthis.motionController = null;\n\n\t\t/**\n\t\t * The model's environment map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * A loader that is used to load hand models.\n\t\t *\n\t\t * @type {?Loader}\n\t\t * @default null\n\t\t */\n\t\tthis.loader = loader;\n\n\t\t/**\n\t\t * A callback that is executed when a hand model has been loaded.\n\t\t *\n\t\t * @type {?Function}\n\t\t * @default null\n\t\t */\n\t\tthis.onLoad = onLoad;\n\n\t\t/**\n\t\t * The path to the model repository.\n\t\t *\n\t\t * @type {?string}\n\t\t * @default null\n\t\t */\n\t\tthis.path = null;\n\n\t\t/**\n\t\t * The model mesh.\n\t\t *\n\t\t * @type {Mesh}\n\t\t * @default null\n\t\t */\n\t\tthis.mesh = null;\n\n\t\tcontroller.addEventListener( 'connected', ( event ) => {\n\n\t\t\tconst xrInputSource = event.data;\n\n\t\t\tif ( xrInputSource.hand && ! this.motionController ) {\n\n\t\t\t\tthis.xrInputSource = xrInputSource;\n\n\t\t\t\tthis.motionController = new XRHandMeshModel( this, controller, this.path, xrInputSource.handedness, this.loader, this.onLoad );\n\n\t\t\t}\n\n\t\t} );\n\n\t\tcontroller.addEventListener( 'disconnected', () => {\n\n\t\t\tthis.clear();\n\t\t\tthis.motionController = null;\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Overwritten with a custom implementation. Makes sure the motion controller updates the mesh.\n\t *\n\t * @param {boolean} [force=false] - When set to `true`, a recomputation of world matrices is forced even\n\t * when {@link Object3D#matrixWorldAutoUpdate} is set to `false`.\n\t */\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.motionController ) {\n\n\t\t\tthis.motionController.updateMesh();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the pointer position which is the position of the index finger tip.\n\t *\n\t * @return {?Vector3} The pointer position. Returns `null` if not index finger tip joint was found.\n\t */\n\tgetPointerPosition() {\n\n\t\tconst indexFingerTip = this.controller.joints[ POINTING_JOINT ];\n\t\tif ( indexFingerTip ) {\n\n\t\t\treturn indexFingerTip.position;\n\n\t\t} else {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns `true` if the current pointer position (the index finger tip) intersections\n\t * with the given box object.\n\t *\n\t *  @param {Mesh} boxObject - The box object.\n\t * @return {boolean} Whether an intersection was found or not.\n\t */\n\tintersectBoxObject( boxObject ) {\n\n\t\tconst pointerPosition = this.getPointerPosition();\n\t\tif ( pointerPosition ) {\n\n\t\t\tconst indexSphere = new Sphere( pointerPosition, TOUCH_RADIUS );\n\t\t\tconst box = new Box3().setFromObject( boxObject );\n\t\t\treturn indexSphere.intersectsBox( box );\n\n\t\t} else {\n\n\t\t\treturn false;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Executed actions depending on the interaction state with\n\t * the given button.\n\t *\n\t *  @param {Object} button - The button.\n\t */\n\tcheckButton( button ) {\n\n\t\tif ( this.intersectBoxObject( button ) ) {\n\n\t\t\tbutton.onPress();\n\n\t\t} else {\n\n\t\t\tbutton.onClear();\n\n\t\t}\n\n\t\tif ( button.isPressed() ) {\n\n\t\t\tbutton.whilePressed();\n\n\t\t}\n\n\t}\n\n}\n\nexport { OculusHandModel };\n", "import { BufferGeometry, Float32BufferAttribute, Matrix4, Mesh, MeshBasicMaterial, Object3D, Raycaster, SphereGeometry, Vector3 } from 'three';\n\nconst PINCH_MAX = 0.05;\nconst PINCH_THRESHOLD = 0.02;\nconst PINCH_MIN = 0.01;\nconst POINTER_ADVANCE_MAX = 0.02;\nconst POINTER_OPACITY_MAX = 1;\nconst POINTER_OPACITY_MIN = 0.4;\nconst POINTER_FRONT_RADIUS = 0.002;\nconst POINTER_REAR_RADIUS = 0.01;\nconst POINTER_REAR_RADIUS_MIN = 0.003;\nconst POINTER_LENGTH = 0.035;\nconst POINTER_SEGMENTS = 16;\nconst POINTER_RINGS = 12;\nconst POINTER_HEMISPHERE_ANGLE = 110;\nconst YAXIS = /* @__PURE__ */ new Vector3( 0, 1, 0 );\nconst ZAXIS = /* @__PURE__ */ new Vector3( 0, 0, 1 );\n\nconst CURSOR_RADIUS = 0.02;\nconst CURSOR_MAX_DISTANCE = 1.5;\n\n/**\n * Represents an Oculus hand pointer model.\n *\n * @augments Object3D\n * @three_import import { OculusHandPointerModel } from 'three/addons/webxr/OculusHandPointerModel.js';\n */\nclass OculusHandPointerModel extends Object3D {\n\n\t/**\n\t * Constructs a new Oculus hand model.\n\t *\n\t * @param {Group} hand - The hand controller.\n\t * @param {Group} controller - The WebXR controller in target ray space.\n\t */\n\tconstructor( hand, controller ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The hand controller.\n\t\t *\n\t\t * @type {Group}\n\t\t */\n\t\tthis.hand = hand;\n\n\t\t/**\n\t\t * The WebXR controller in target ray space.\n\t\t *\n\t\t * @type {Group}\n\t\t */\n\t\tthis.controller = controller;\n\n\t\t// Unused\n\t\tthis.motionController = null;\n\t\tthis.envMap = null;\n\t\tthis.mesh = null;\n\n\t\t/**\n\t\t * The pointer geometry.\n\t\t *\n\t\t * @type {?BufferGeometry}\n\t\t * @default null\n\t\t */\n\t\tthis.pointerGeometry = null;\n\n\t\t/**\n\t\t * The pointer mesh.\n\t\t *\n\t\t * @type {?Mesh}\n\t\t * @default null\n\t\t */\n\t\tthis.pointerMesh = null;\n\n\t\t/**\n\t\t * The pointer object that holds the pointer mesh.\n\t\t *\n\t\t * @type {?Object3D}\n\t\t * @default null\n\t\t */\n\t\tthis.pointerObject = null;\n\n\t\t/**\n\t\t * Whether the model is pinched or not.\n\t\t *\n\t\t * @type {?boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.pinched = false;\n\n\t\t/**\n\t\t * Whether the model is attached or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.attached = false;\n\n\t\t/**\n\t\t * The cursor object.\n\t\t *\n\t\t * @type {?Mesh}\n\t\t * @default null\n\t\t */\n\t\tthis.cursorObject = null;\n\n\t\t/**\n\t\t * The internal raycaster used for detecting\n\t\t * intersections.\n\t\t *\n\t\t * @type {?Raycaster}\n\t\t * @default null\n\t\t */\n\t\tthis.raycaster = null;\n\n\t\tthis._onConnected = this._onConnected.bind( this );\n\t\tthis._onDisconnected = this._onDisconnected.bind( this );\n\t\tthis.hand.addEventListener( 'connected', this._onConnected );\n\t\tthis.hand.addEventListener( 'disconnected', this._onDisconnected );\n\n\t}\n\n\t_onConnected( event ) {\n\n\t\tconst xrInputSource = event.data;\n\t\tif ( xrInputSource.hand ) {\n\n\t\t\tthis.visible = true;\n\t\t\tthis.xrInputSource = xrInputSource;\n\n\t\t\tthis.createPointer();\n\n\t\t}\n\n\t}\n\n\t_onDisconnected() {\n\n\t\tthis.visible = false;\n\t\tthis.xrInputSource = null;\n\n\t\tif ( this.pointerGeometry ) this.pointerGeometry.dispose();\n\t\tif ( this.pointerMesh && this.pointerMesh.material ) this.pointerMesh.material.dispose();\n\n\t\tthis.clear();\n\n\t}\n\n\t_drawVerticesRing( vertices, baseVector, ringIndex ) {\n\n\t\tconst segmentVector = baseVector.clone();\n\t\tfor ( let i = 0; i < POINTER_SEGMENTS; i ++ ) {\n\n\t\t\tsegmentVector.applyAxisAngle( ZAXIS, ( Math.PI * 2 ) / POINTER_SEGMENTS );\n\t\t\tconst vid = ringIndex * POINTER_SEGMENTS + i;\n\t\t\tvertices[ 3 * vid ] = segmentVector.x;\n\t\t\tvertices[ 3 * vid + 1 ] = segmentVector.y;\n\t\t\tvertices[ 3 * vid + 2 ] = segmentVector.z;\n\n\t\t}\n\n\t}\n\n\t_updatePointerVertices( rearRadius ) {\n\n\t\tconst vertices = this.pointerGeometry.attributes.position.array;\n\t\t// first ring for front face\n\t\tconst frontFaceBase = new Vector3(\n\t\t\tPOINTER_FRONT_RADIUS,\n\t\t\t0,\n\t\t\t- 1 * ( POINTER_LENGTH - rearRadius )\n\t\t);\n\t\tthis._drawVerticesRing( vertices, frontFaceBase, 0 );\n\n\t\t// rings for rear hemisphere\n\t\tconst rearBase = new Vector3(\n\t\t\tMath.sin( ( Math.PI * POINTER_HEMISPHERE_ANGLE ) / 180 ) * rearRadius,\n\t\t\tMath.cos( ( Math.PI * POINTER_HEMISPHERE_ANGLE ) / 180 ) * rearRadius,\n\t\t\t0\n\t\t);\n\t\tfor ( let i = 0; i < POINTER_RINGS; i ++ ) {\n\n\t\t\tthis._drawVerticesRing( vertices, rearBase, i + 1 );\n\t\t\trearBase.applyAxisAngle(\n\t\t\t\tYAXIS,\n\t\t\t\t( Math.PI * POINTER_HEMISPHERE_ANGLE ) / 180 / ( POINTER_RINGS * - 2 )\n\t\t\t);\n\n\t\t}\n\n\t\t// front and rear face center vertices\n\t\tconst frontCenterIndex = POINTER_SEGMENTS * ( 1 + POINTER_RINGS );\n\t\tconst rearCenterIndex = POINTER_SEGMENTS * ( 1 + POINTER_RINGS ) + 1;\n\t\tconst frontCenter = new Vector3(\n\t\t\t0,\n\t\t\t0,\n\t\t\t- 1 * ( POINTER_LENGTH - rearRadius )\n\t\t);\n\t\tvertices[ frontCenterIndex * 3 ] = frontCenter.x;\n\t\tvertices[ frontCenterIndex * 3 + 1 ] = frontCenter.y;\n\t\tvertices[ frontCenterIndex * 3 + 2 ] = frontCenter.z;\n\t\tconst rearCenter = new Vector3( 0, 0, rearRadius );\n\t\tvertices[ rearCenterIndex * 3 ] = rearCenter.x;\n\t\tvertices[ rearCenterIndex * 3 + 1 ] = rearCenter.y;\n\t\tvertices[ rearCenterIndex * 3 + 2 ] = rearCenter.z;\n\n\t\tthis.pointerGeometry.setAttribute(\n\t\t\t'position',\n\t\t\tnew Float32BufferAttribute( vertices, 3 )\n\t\t);\n\t\t// verticesNeedUpdate = true;\n\n\t}\n\n\t/**\n\t * Creates a pointer mesh and adds it to this model.\n\t */\n\tcreatePointer() {\n\n\t\tlet i, j;\n\t\tconst vertices = new Array(\n\t\t\t( ( POINTER_RINGS + 1 ) * POINTER_SEGMENTS + 2 ) * 3\n\t\t).fill( 0 );\n\t\t// const vertices = [];\n\t\tconst indices = [];\n\t\tthis.pointerGeometry = new BufferGeometry();\n\n\t\tthis.pointerGeometry.setAttribute(\n\t\t\t'position',\n\t\t\tnew Float32BufferAttribute( vertices, 3 )\n\t\t);\n\n\t\tthis._updatePointerVertices( POINTER_REAR_RADIUS );\n\n\t\t// construct faces to connect rings\n\t\tfor ( i = 0; i < POINTER_RINGS; i ++ ) {\n\n\t\t\tfor ( j = 0; j < POINTER_SEGMENTS - 1; j ++ ) {\n\n\t\t\t\tindices.push(\n\t\t\t\t\ti * POINTER_SEGMENTS + j,\n\t\t\t\t\ti * POINTER_SEGMENTS + j + 1,\n\t\t\t\t\t( i + 1 ) * POINTER_SEGMENTS + j\n\t\t\t\t);\n\t\t\t\tindices.push(\n\t\t\t\t\ti * POINTER_SEGMENTS + j + 1,\n\t\t\t\t\t( i + 1 ) * POINTER_SEGMENTS + j + 1,\n\t\t\t\t\t( i + 1 ) * POINTER_SEGMENTS + j\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\tindices.push(\n\t\t\t\t( i + 1 ) * POINTER_SEGMENTS - 1,\n\t\t\t\ti * POINTER_SEGMENTS,\n\t\t\t\t( i + 2 ) * POINTER_SEGMENTS - 1\n\t\t\t);\n\t\t\tindices.push(\n\t\t\t\ti * POINTER_SEGMENTS,\n\t\t\t\t( i + 1 ) * POINTER_SEGMENTS,\n\t\t\t\t( i + 2 ) * POINTER_SEGMENTS - 1\n\t\t\t);\n\n\t\t}\n\n\t\t// construct front and rear face\n\t\tconst frontCenterIndex = POINTER_SEGMENTS * ( 1 + POINTER_RINGS );\n\t\tconst rearCenterIndex = POINTER_SEGMENTS * ( 1 + POINTER_RINGS ) + 1;\n\n\t\tfor ( i = 0; i < POINTER_SEGMENTS - 1; i ++ ) {\n\n\t\t\tindices.push( frontCenterIndex, i + 1, i );\n\t\t\tindices.push(\n\t\t\t\trearCenterIndex,\n\t\t\t\ti + POINTER_SEGMENTS * POINTER_RINGS,\n\t\t\t\ti + POINTER_SEGMENTS * POINTER_RINGS + 1\n\t\t\t);\n\n\t\t}\n\n\t\tindices.push( frontCenterIndex, 0, POINTER_SEGMENTS - 1 );\n\t\tindices.push(\n\t\t\trearCenterIndex,\n\t\t\tPOINTER_SEGMENTS * ( POINTER_RINGS + 1 ) - 1,\n\t\t\tPOINTER_SEGMENTS * POINTER_RINGS\n\t\t);\n\n\t\tconst material = new MeshBasicMaterial();\n\t\tmaterial.transparent = true;\n\t\tmaterial.opacity = POINTER_OPACITY_MIN;\n\n\t\tthis.pointerGeometry.setIndex( indices );\n\n\t\tthis.pointerMesh = new Mesh( this.pointerGeometry, material );\n\n\t\tthis.pointerMesh.position.set( 0, 0, - 1 * POINTER_REAR_RADIUS );\n\t\tthis.pointerObject = new Object3D();\n\t\tthis.pointerObject.add( this.pointerMesh );\n\n\t\tthis.raycaster = new Raycaster();\n\n\t\t// create cursor\n\t\tconst cursorGeometry = new SphereGeometry( CURSOR_RADIUS, 10, 10 );\n\t\tconst cursorMaterial = new MeshBasicMaterial();\n\t\tcursorMaterial.transparent = true;\n\t\tcursorMaterial.opacity = POINTER_OPACITY_MIN;\n\n\t\tthis.cursorObject = new Mesh( cursorGeometry, cursorMaterial );\n\t\tthis.pointerObject.add( this.cursorObject );\n\n\t\tthis.add( this.pointerObject );\n\n\t}\n\n\t_updateRaycaster() {\n\n\t\tif ( this.raycaster ) {\n\n\t\t\tconst pointerMatrix = this.pointerObject.matrixWorld;\n\t\t\tconst tempMatrix = new Matrix4();\n\t\t\ttempMatrix.identity().extractRotation( pointerMatrix );\n\t\t\tthis.raycaster.ray.origin.setFromMatrixPosition( pointerMatrix );\n\t\t\tthis.raycaster.ray.direction.set( 0, 0, - 1 ).applyMatrix4( tempMatrix );\n\n\t\t}\n\n\t}\n\n\t_updatePointer() {\n\n\t\tthis.pointerObject.visible = this.controller.visible;\n\t\tconst indexTip = this.hand.joints[ 'index-finger-tip' ];\n\t\tconst thumbTip = this.hand.joints[ 'thumb-tip' ];\n\t\tconst distance = indexTip.position.distanceTo( thumbTip.position );\n\t\tconst position = indexTip.position\n\t\t\t.clone()\n\t\t\t.add( thumbTip.position )\n\t\t\t.multiplyScalar( 0.5 );\n\t\tthis.pointerObject.position.copy( position );\n\t\tthis.pointerObject.quaternion.copy( this.controller.quaternion );\n\n\t\tthis.pinched = distance <= PINCH_THRESHOLD;\n\n\t\tconst pinchScale = ( distance - PINCH_MIN ) / ( PINCH_MAX - PINCH_MIN );\n\t\tconst focusScale = ( distance - PINCH_MIN ) / ( PINCH_THRESHOLD - PINCH_MIN );\n\t\tif ( pinchScale > 1 ) {\n\n\t\t\tthis._updatePointerVertices( POINTER_REAR_RADIUS );\n\t\t\tthis.pointerMesh.position.set( 0, 0, - 1 * POINTER_REAR_RADIUS );\n\t\t\tthis.pointerMesh.material.opacity = POINTER_OPACITY_MIN;\n\n\t\t} else if ( pinchScale > 0 ) {\n\n\t\t\tconst rearRadius =\n        ( POINTER_REAR_RADIUS - POINTER_REAR_RADIUS_MIN ) * pinchScale +\n        POINTER_REAR_RADIUS_MIN;\n\t\t\tthis._updatePointerVertices( rearRadius );\n\t\t\tif ( focusScale < 1 ) {\n\n\t\t\t\tthis.pointerMesh.position.set(\n\t\t\t\t\t0,\n\t\t\t\t\t0,\n\t\t\t\t\t- 1 * rearRadius - ( 1 - focusScale ) * POINTER_ADVANCE_MAX\n\t\t\t\t);\n\t\t\t\tthis.pointerMesh.material.opacity =\n          POINTER_OPACITY_MIN +\n          ( 1 - focusScale ) * ( POINTER_OPACITY_MAX - POINTER_OPACITY_MIN );\n\n\t\t\t} else {\n\n\t\t\t\tthis.pointerMesh.position.set( 0, 0, - 1 * rearRadius );\n\t\t\t\tthis.pointerMesh.material.opacity = POINTER_OPACITY_MIN;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis._updatePointerVertices( POINTER_REAR_RADIUS_MIN );\n\t\t\tthis.pointerMesh.position.set(\n\t\t\t\t0,\n\t\t\t\t0,\n\t\t\t\t- 1 * POINTER_REAR_RADIUS_MIN - POINTER_ADVANCE_MAX\n\t\t\t);\n\t\t\tthis.pointerMesh.material.opacity = POINTER_OPACITY_MAX;\n\n\t\t}\n\n\t\tthis.cursorObject.material.opacity = this.pointerMesh.material.opacity;\n\n\t}\n\n\t/**\n\t * Overwritten with a custom implementation. Makes sure the internal pointer and raycaster are updated.\n\t *\n\t * @param {boolean} [force=false] - When set to `true`, a recomputation of world matrices is forced even\n\t * when {@link Object3D#matrixWorldAutoUpdate} is set to `false`.\n\t */\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\t\tif ( this.pointerGeometry ) {\n\n\t\t\tthis._updatePointer();\n\t\t\tthis._updateRaycaster();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns `true` is the model is pinched.\n\t *\n\t * @return {boolean} Whether the model is pinched or not.\n\t */\n\tisPinched() {\n\n\t\treturn this.pinched;\n\n\t}\n\n\t/**\n\t * Sets the attached state.\n\t *\n\t * @param {boolean} attached - Whether the model is attached or not.\n\t */\n\tsetAttached( attached ) {\n\n\t\tthis.attached = attached;\n\n\t}\n\n\t/**\n\t * Returns `true` is the model is attached.\n\t *\n\t * @return {boolean} Whether the model is attached or not.\n\t */\n\tisAttached() {\n\n\t\treturn this.attached;\n\n\t}\n\n\t/**\n\t * Performs an intersection test with the model's raycaster and the given object.\n\t *\n\t * @param {Object3D} object - The 3D object to check for intersection with the ray.\n\t * @param {boolean} [recursive=true] - If set to `true`, it also checks all descendants.\n\t * Otherwise it only checks intersection with the object.\n\t * @return {Array<Raycaster~Intersection>} An array holding the intersection points.\n\t */\n\tintersectObject( object, recursive = true ) {\n\n\t\tif ( this.raycaster ) {\n\n\t\t\treturn this.raycaster.intersectObject( object, recursive );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Performs an intersection test with the model's raycaster and the given objects.\n\t *\n\t * @param {Array<Object3D>} objects - The 3D objects to check for intersection with the ray.\n\t * @param {boolean} [recursive=true] - If set to `true`, it also checks all descendants.\n\t * Otherwise it only checks intersection with the object.\n\t * @return {Array<Raycaster~Intersection>} An array holding the intersection points.\n\t */\n\tintersectObjects( objects, recursive = true ) {\n\n\t\tif ( this.raycaster ) {\n\n\t\t\treturn this.raycaster.intersectObjects( objects, recursive );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks for intersections between the model's raycaster and the given objects. The method\n\t * updates the cursor object to the intersection point.\n\t *\n\t * @param {Array<Object3D>} objects - The 3D objects to check for intersection with the ray.\n\t * @param {boolean} [recursive=false] - If set to `true`, it also checks all descendants.\n\t * Otherwise it only checks intersection with the object.\n\t */\n\tcheckIntersections( objects, recursive = false ) {\n\n\t\tif ( this.raycaster && ! this.attached ) {\n\n\t\t\tconst intersections = this.raycaster.intersectObjects( objects, recursive );\n\t\t\tconst direction = new Vector3( 0, 0, - 1 );\n\t\t\tif ( intersections.length > 0 ) {\n\n\t\t\t\tconst intersection = intersections[ 0 ];\n\t\t\t\tconst distance = intersection.distance;\n\t\t\t\tthis.cursorObject.position.copy( direction.multiplyScalar( distance ) );\n\n\t\t\t} else {\n\n\t\t\t\tthis.cursorObject.position.copy( direction.multiplyScalar( CURSOR_MAX_DISTANCE ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the cursor to the given distance.\n\t *\n\t * @param {number} distance - The distance to set the cursor to.\n\t */\n\tsetCursor( distance ) {\n\n\t\tconst direction = new Vector3( 0, 0, - 1 );\n\t\tif ( this.raycaster && ! this.attached ) {\n\n\t\t\tthis.cursorObject.position.copy( direction.multiplyScalar( distance ) );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t */\n\tdispose() {\n\n\t\tthis._onDisconnected();\n\t\tthis.hand.removeEventListener( 'connected', this._onConnected );\n\t\tthis.hand.removeEventListener( 'disconnected', this._onDisconnected );\n\n\t}\n\n}\n\nexport { OculusHandPointerModel };\n", "import { DoubleSide, Mesh, MeshBasicMaterial, PlaneGeometry, Texture } from 'three';\n\n/**\n * @module Text2D\n * @three_import import * as Text2D from 'three/addons/webxr/Text2D.js';\n */\n\n/**\n * A helper function for creating a simple plane mesh\n * that can be used as a text label. The mesh's material\n * holds a canvas texture that displays the given message.\n *\n * @param {string} message - The message to display.\n * @param {number} height - The labels height.\n * @return {Mesh} The plane mesh representing a text label.\n */\nfunction createText( message, height ) {\n\n\tconst canvas = document.createElement( 'canvas' );\n\tconst context = canvas.getContext( '2d' );\n\tlet metrics = null;\n\tconst textHeight = 100;\n\tcontext.font = 'normal ' + textHeight + 'px Arial';\n\tmetrics = context.measureText( message );\n\tconst textWidth = metrics.width;\n\tcanvas.width = textWidth;\n\tcanvas.height = textHeight;\n\tcontext.font = 'normal ' + textHeight + 'px Arial';\n\tcontext.textAlign = 'center';\n\tcontext.textBaseline = 'middle';\n\tcontext.fillStyle = '#ffffff';\n\tcontext.fillText( message, textWidth / 2, textHeight / 2 );\n\n\tconst texture = new Texture( canvas );\n\ttexture.needsUpdate = true;\n\n\tconst material = new MeshBasicMaterial( {\n\t\tcolor: 0xffffff,\n\t\tside: DoubleSide,\n\t\tmap: texture,\n\t\ttransparent: true,\n\t} );\n\tconst geometry = new PlaneGeometry(\n\t\t( height * textWidth ) / textHeight,\n\t\theight\n\t);\n\tconst plane = new Mesh( geometry, material );\n\treturn plane;\n\n}\n\nexport { createText };\n", "/**\n * A utility class for creating a button that allows to initiate\n * immersive VR sessions based on WebXR. The button can be created\n * with a factory method and then appended ot the website's DOM.\n *\n * ```js\n * document.body.appendChild( VRButton.createButton( renderer ) );\n * ```\n *\n * @hideconstructor\n * @three_import import { VRButton } from 'three/addons/webxr/VRButton.js';\n */\nclass VRButton {\n\n\t/**\n\t * Constructs a new VR button.\n\t *\n\t * @param {WebGLRenderer|WebGPURenderer} renderer - The renderer.\n\t * @param {XRSessionInit} [sessionInit] - The a configuration object for the AR session.\n\t * @return {HTMLElement} The button or an error message if `immersive-ar` isn't supported.\n\t */\n\tstatic createButton( renderer, sessionInit = {} ) {\n\n\t\tconst button = document.createElement( 'button' );\n\n\t\tfunction showEnterVR( /*device*/ ) {\n\n\t\t\tlet currentSession = null;\n\n\t\t\tasync function onSessionStarted( session ) {\n\n\t\t\t\tsession.addEventListener( 'end', onSessionEnded );\n\n\t\t\t\tawait renderer.xr.setSession( session );\n\t\t\t\tbutton.textContent = 'EXIT VR';\n\n\t\t\t\tcurrentSession = session;\n\n\t\t\t}\n\n\t\t\tfunction onSessionEnded( /*event*/ ) {\n\n\t\t\t\tcurrentSession.removeEventListener( 'end', onSessionEnded );\n\n\t\t\t\tbutton.textContent = 'ENTER VR';\n\n\t\t\t\tcurrentSession = null;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tbutton.style.display = '';\n\n\t\t\tbutton.style.cursor = 'pointer';\n\t\t\tbutton.style.left = 'calc(50% - 50px)';\n\t\t\tbutton.style.width = '100px';\n\n\t\t\tbutton.textContent = 'ENTER VR';\n\n\t\t\t// WebXR's requestReferenceSpace only works if the corresponding feature\n\t\t\t// was requested at session creation time. For simplicity, just ask for\n\t\t\t// the interesting ones as optional features, but be aware that the\n\t\t\t// requestReferenceSpace call will fail if it turns out to be unavailable.\n\t\t\t// ('local' is always available for immersive sessions and doesn't need to\n\t\t\t// be requested separately.)\n\n\t\t\tconst sessionOptions = {\n\t\t\t\t...sessionInit,\n\t\t\t\toptionalFeatures: [\n\t\t\t\t\t'local-floor',\n\t\t\t\t\t'bounded-floor',\n\t\t\t\t\t'layers',\n\t\t\t\t\t...( sessionInit.optionalFeatures || [] )\n\t\t\t\t],\n\t\t\t};\n\n\t\t\tbutton.onmouseenter = function () {\n\n\t\t\t\tbutton.style.opacity = '1.0';\n\n\t\t\t};\n\n\t\t\tbutton.onmouseleave = function () {\n\n\t\t\t\tbutton.style.opacity = '0.5';\n\n\t\t\t};\n\n\t\t\tbutton.onclick = function () {\n\n\t\t\t\tif ( currentSession === null ) {\n\n\t\t\t\t\tnavigator.xr.requestSession( 'immersive-vr', sessionOptions ).then( onSessionStarted );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcurrentSession.end();\n\n\t\t\t\t\tif ( navigator.xr.offerSession !== undefined ) {\n\n\t\t\t\t\t\tnavigator.xr.offerSession( 'immersive-vr', sessionOptions )\n\t\t\t\t\t\t\t.then( onSessionStarted )\n\t\t\t\t\t\t\t.catch( ( err ) => {\n\n\t\t\t\t\t\t\t\tconsole.warn( err );\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t\tif ( navigator.xr.offerSession !== undefined ) {\n\n\t\t\t\tnavigator.xr.offerSession( 'immersive-vr', sessionOptions )\n\t\t\t\t\t.then( onSessionStarted )\n\t\t\t\t\t.catch( ( err ) => {\n\n\t\t\t\t\t\tconsole.warn( err );\n\n\t\t\t\t\t} );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction disableButton() {\n\n\t\t\tbutton.style.display = '';\n\n\t\t\tbutton.style.cursor = 'auto';\n\t\t\tbutton.style.left = 'calc(50% - 75px)';\n\t\t\tbutton.style.width = '150px';\n\n\t\t\tbutton.onmouseenter = null;\n\t\t\tbutton.onmouseleave = null;\n\n\t\t\tbutton.onclick = null;\n\n\t\t}\n\n\t\tfunction showWebXRNotFound() {\n\n\t\t\tdisableButton();\n\n\t\t\tbutton.textContent = 'VR NOT SUPPORTED';\n\n\t\t}\n\n\t\tfunction showVRNotAllowed( exception ) {\n\n\t\t\tdisableButton();\n\n\t\t\tconsole.warn( 'Exception when trying to call xr.isSessionSupported', exception );\n\n\t\t\tbutton.textContent = 'VR NOT ALLOWED';\n\n\t\t}\n\n\t\tfunction stylizeElement( element ) {\n\n\t\t\telement.style.position = 'absolute';\n\t\t\telement.style.bottom = '20px';\n\t\t\telement.style.padding = '12px 6px';\n\t\t\telement.style.border = '1px solid #fff';\n\t\t\telement.style.borderRadius = '4px';\n\t\t\telement.style.background = 'rgba(0,0,0,0.1)';\n\t\t\telement.style.color = '#fff';\n\t\t\telement.style.font = 'normal 13px sans-serif';\n\t\t\telement.style.textAlign = 'center';\n\t\t\telement.style.opacity = '0.5';\n\t\t\telement.style.outline = 'none';\n\t\t\telement.style.zIndex = '999';\n\n\t\t}\n\n\t\tif ( 'xr' in navigator ) {\n\n\t\t\tbutton.id = 'VRButton';\n\t\t\tbutton.style.display = 'none';\n\n\t\t\tstylizeElement( button );\n\n\t\t\tnavigator.xr.isSessionSupported( 'immersive-vr' ).then( function ( supported ) {\n\n\t\t\t\tsupported ? showEnterVR() : showWebXRNotFound();\n\n\t\t\t\tif ( supported && VRButton.xrSessionIsGranted ) {\n\n\t\t\t\t\tbutton.click();\n\n\t\t\t\t}\n\n\t\t\t} ).catch( showVRNotAllowed );\n\n\t\t\treturn button;\n\n\t\t} else {\n\n\t\t\tconst message = document.createElement( 'a' );\n\n\t\t\tif ( window.isSecureContext === false ) {\n\n\t\t\t\tmessage.href = document.location.href.replace( /^http:/, 'https:' );\n\t\t\t\tmessage.innerHTML = 'WEBXR NEEDS HTTPS'; // TODO Improve message\n\n\t\t\t} else {\n\n\t\t\t\tmessage.href = 'https://immersiveweb.dev/';\n\t\t\t\tmessage.innerHTML = 'WEBXR NOT AVAILABLE';\n\n\t\t\t}\n\n\t\t\tmessage.style.left = 'calc(50% - 90px)';\n\t\t\tmessage.style.width = '180px';\n\t\t\tmessage.style.textDecoration = 'none';\n\n\t\t\tstylizeElement( message );\n\n\t\t\treturn message;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Registers a `sessiongranted` event listener. When a session is granted, the {@link VRButton#xrSessionIsGranted}\n\t * flag will evaluate to `true`. This method is automatically called by the module itself so there\n\t * should be no need to use it on app level.\n\t */\n\tstatic registerSessionGrantedListener() {\n\n\t\tif ( typeof navigator !== 'undefined' && 'xr' in navigator ) {\n\n\t\t\t// WebXRViewer (based on Firefox) has a bug where addEventListener\n\t\t\t// throws a silent exception and aborts execution entirely.\n\t\t\tif ( /WebXRViewer\\//i.test( navigator.userAgent ) ) return;\n\n\t\t\tnavigator.xr.addEventListener( 'sessiongranted', () => {\n\n\t\t\t\tVRButton.xrSessionIsGranted = true;\n\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Whether a XR session has been granted or not.\n *\n * @static\n * @type {boolean}\n * @default false\n */\nVRButton.xrSessionIsGranted = false;\nVRButton.registerSessionGrantedListener();\n\nexport { VRButton };\n", "/**\n * A utility class for creating a button that allows to initiate\n * immersive XR sessions based on WebXR. The button can be created\n * with a factory method and then appended ot the website's DOM.\n *\n * ```js\n * document.body.appendChild( XRButton.createButton( renderer ) );\n * ```\n *\n * Compared to {@link ARButton} and {@link VRButton}, this class will\n * try to offer an immersive AR session first. If the device does not\n * support this type of session, it uses an immersive VR session.\n *\n * @hideconstructor\n * @three_import import { XRButton } from 'three/addons/webxr/XRButton.js';\n */\nclass XRButton {\n\n\t/**\n\t * Constructs a new XR button.\n\t *\n\t * @param {WebGLRenderer|WebGPURenderer} renderer - The renderer.\n\t * @param {XRSessionInit} [sessionInit] - The a configuration object for the AR session.\n\t * @return {HTMLElement} The button or an error message if WebXR isn't supported.\n\t */\n\tstatic createButton( renderer, sessionInit = {} ) {\n\n\t\tconst button = document.createElement( 'button' );\n\n\t\tfunction showStartXR( mode ) {\n\n\t\t\tlet currentSession = null;\n\n\t\t\tasync function onSessionStarted( session ) {\n\n\t\t\t\tsession.addEventListener( 'end', onSessionEnded );\n\n\t\t\t\tawait renderer.xr.setSession( session );\n\n\t\t\t\tbutton.textContent = 'STOP XR';\n\n\t\t\t\tcurrentSession = session;\n\n\t\t\t}\n\n\t\t\tfunction onSessionEnded( /*event*/ ) {\n\n\t\t\t\tcurrentSession.removeEventListener( 'end', onSessionEnded );\n\n\t\t\t\tbutton.textContent = 'START XR';\n\n\t\t\t\tcurrentSession = null;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tbutton.style.display = '';\n\n\t\t\tbutton.style.cursor = 'pointer';\n\t\t\tbutton.style.left = 'calc(50% - 50px)';\n\t\t\tbutton.style.width = '100px';\n\n\t\t\tbutton.textContent = 'START XR';\n\n\t\t\tconst sessionOptions = {\n\t\t\t\t...sessionInit,\n\t\t\t\toptionalFeatures: [\n\t\t\t\t\t'local-floor',\n\t\t\t\t\t'bounded-floor',\n\t\t\t\t\t'layers',\n\t\t\t\t\t...( sessionInit.optionalFeatures || [] )\n\t\t\t\t],\n\t\t\t};\n\n\t\t\tbutton.onmouseenter = function () {\n\n\t\t\t\tbutton.style.opacity = '1.0';\n\n\t\t\t};\n\n\t\t\tbutton.onmouseleave = function () {\n\n\t\t\t\tbutton.style.opacity = '0.5';\n\n\t\t\t};\n\n\t\t\tbutton.onclick = function () {\n\n\t\t\t\tif ( currentSession === null ) {\n\n\t\t\t\t\tnavigator.xr.requestSession( mode, sessionOptions )\n\t\t\t\t\t\t.then( onSessionStarted );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcurrentSession.end();\n\n\t\t\t\t\tif ( navigator.xr.offerSession !== undefined ) {\n\n\t\t\t\t\t\tnavigator.xr.offerSession( mode, sessionOptions )\n\t\t\t\t\t\t\t.then( onSessionStarted )\n\t\t\t\t\t\t\t.catch( ( err ) => {\n\n\t\t\t\t\t\t\t\tconsole.warn( err );\n\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t\tif ( navigator.xr.offerSession !== undefined ) {\n\n\t\t\t\tnavigator.xr.offerSession( mode, sessionOptions )\n\t\t\t\t\t.then( onSessionStarted )\n\t\t\t\t\t.catch( ( err ) => {\n\n\t\t\t\t\t\tconsole.warn( err );\n\n\t\t\t\t\t} );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfunction disableButton() {\n\n\t\t\tbutton.style.display = '';\n\n\t\t\tbutton.style.cursor = 'auto';\n\t\t\tbutton.style.left = 'calc(50% - 75px)';\n\t\t\tbutton.style.width = '150px';\n\n\t\t\tbutton.onmouseenter = null;\n\t\t\tbutton.onmouseleave = null;\n\n\t\t\tbutton.onclick = null;\n\n\t\t}\n\n\t\tfunction showXRNotSupported() {\n\n\t\t\tdisableButton();\n\n\t\t\tbutton.textContent = 'XR NOT SUPPORTED';\n\n\t\t}\n\n\t\tfunction showXRNotAllowed( exception ) {\n\n\t\t\tdisableButton();\n\n\t\t\tconsole.warn( 'Exception when trying to call xr.isSessionSupported', exception );\n\n\t\t\tbutton.textContent = 'XR NOT ALLOWED';\n\n\t\t}\n\n\t\tfunction stylizeElement( element ) {\n\n\t\t\telement.style.position = 'absolute';\n\t\t\telement.style.bottom = '20px';\n\t\t\telement.style.padding = '12px 6px';\n\t\t\telement.style.border = '1px solid #fff';\n\t\t\telement.style.borderRadius = '4px';\n\t\t\telement.style.background = 'rgba(0,0,0,0.1)';\n\t\t\telement.style.color = '#fff';\n\t\t\telement.style.font = 'normal 13px sans-serif';\n\t\t\telement.style.textAlign = 'center';\n\t\t\telement.style.opacity = '0.5';\n\t\t\telement.style.outline = 'none';\n\t\t\telement.style.zIndex = '999';\n\n\t\t}\n\n\t\tif ( 'xr' in navigator ) {\n\n\t\t\tbutton.id = 'XRButton';\n\t\t\tbutton.style.display = 'none';\n\n\t\t\tstylizeElement( button );\n\n\t\t\tnavigator.xr.isSessionSupported( 'immersive-ar' )\n\t\t\t\t.then( function ( supported ) {\n\n\t\t\t\t\tif ( supported ) {\n\n\t\t\t\t\t\tshowStartXR( 'immersive-ar' );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tnavigator.xr.isSessionSupported( 'immersive-vr' )\n\t\t\t\t\t\t\t.then( function ( supported ) {\n\n\t\t\t\t\t\t\t\tif ( supported ) {\n\n\t\t\t\t\t\t\t\t\tshowStartXR( 'immersive-vr' );\n\n\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\tshowXRNotSupported();\n\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t} ).catch( showXRNotAllowed );\n\n\t\t\t\t\t}\n\n\t\t\t\t} ).catch( showXRNotAllowed );\n\n\t\t\treturn button;\n\n\t\t} else {\n\n\t\t\tconst message = document.createElement( 'a' );\n\n\t\t\tif ( window.isSecureContext === false ) {\n\n\t\t\t\tmessage.href = document.location.href.replace( /^http:/, 'https:' );\n\t\t\t\tmessage.innerHTML = 'WEBXR NEEDS HTTPS'; // TODO Improve message\n\n\t\t\t} else {\n\n\t\t\t\tmessage.href = 'https://immersiveweb.dev/';\n\t\t\t\tmessage.innerHTML = 'WEBXR NOT AVAILABLE';\n\n\t\t\t}\n\n\t\t\tmessage.style.left = 'calc(50% - 90px)';\n\t\t\tmessage.style.width = '180px';\n\t\t\tmessage.style.textDecoration = 'none';\n\n\t\t\tstylizeElement( message );\n\n\t\t\treturn message;\n\n\t\t}\n\n\t}\n\n}\n\nexport { XRButton };\n", "import {\n\tMesh,\n\tMeshBasicMaterial,\n\tObject3D,\n\tSphereGeometry,\n} from 'three';\n\nimport { GLTFLoader } from '../loaders/GLTFLoader.js';\n\nimport {\n\tConstants as MotionControllerConstants,\n\tfetchProfile,\n\tMotionController\n} from '../libs/motion-controllers.module.js';\n\nconst DEFAULT_PROFILES_PATH = 'https://cdn.jsdelivr.net/npm/@webxr-input-profiles/assets@1.0/dist/profiles';\nconst DEFAULT_PROFILE = 'generic-trigger';\n\n/**\n * Represents a XR controller model.\n *\n * @augments Object3D\n */\nclass XRControllerModel extends Object3D {\n\n\t/**\n\t * Constructs a new XR controller model.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The motion controller.\n\t\t *\n\t\t * @type {?MotionController}\n\t\t * @default null\n\t\t */\n\t\tthis.motionController = null;\n\n\t\t/**\n\t\t * The controller's environment map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t}\n\n\t/**\n\t * Sets an environment map that is applied to the controller model.\n\t *\n\t * @param {?Texture} envMap - The environment map to apply.\n\t * @return {XRControllerModel} A reference to this instance.\n\t */\n\tsetEnvironmentMap( envMap ) {\n\n\t\tif ( this.envMap == envMap ) {\n\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.envMap = envMap;\n\t\tthis.traverse( ( child ) => {\n\n\t\t\tif ( child.isMesh ) {\n\n\t\t\t\tchild.material.envMap = this.envMap;\n\t\t\t\tchild.material.needsUpdate = true;\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Overwritten with a custom implementation. Polls data from the XRInputSource and updates the\n\t * model's components to match the real world data.\n\t *\n\t * @param {boolean} [force=false] - When set to `true`, a recomputation of world matrices is forced even\n\t * when {@link Object3D#matrixWorldAutoUpdate} is set to `false`.\n\t */\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( ! this.motionController ) return;\n\n\t\t// Cause the MotionController to poll the Gamepad for data\n\t\tthis.motionController.updateFromGamepad();\n\n\t\t// Update the 3D model to reflect the button, thumbstick, and touchpad state\n\t\tObject.values( this.motionController.components ).forEach( ( component ) => {\n\n\t\t\t// Update node data based on the visual responses' current states\n\t\t\tObject.values( component.visualResponses ).forEach( ( visualResponse ) => {\n\n\t\t\t\tconst { valueNode, minNode, maxNode, value, valueNodeProperty } = visualResponse;\n\n\t\t\t\t// Skip if the visual response node is not found. No error is needed,\n\t\t\t\t// because it will have been reported at load time.\n\t\t\t\tif ( ! valueNode ) return;\n\n\t\t\t\t// Calculate the new properties based on the weight supplied\n\t\t\t\tif ( valueNodeProperty === MotionControllerConstants.VisualResponseProperty.VISIBILITY ) {\n\n\t\t\t\t\tvalueNode.visible = value;\n\n\t\t\t\t} else if ( valueNodeProperty === MotionControllerConstants.VisualResponseProperty.TRANSFORM ) {\n\n\t\t\t\t\tvalueNode.quaternion.slerpQuaternions(\n\t\t\t\t\t\tminNode.quaternion,\n\t\t\t\t\t\tmaxNode.quaternion,\n\t\t\t\t\t\tvalue\n\t\t\t\t\t);\n\n\t\t\t\t\tvalueNode.position.lerpVectors(\n\t\t\t\t\t\tminNode.position,\n\t\t\t\t\t\tmaxNode.position,\n\t\t\t\t\t\tvalue\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n}\n\n/**\n * Walks the model's tree to find the nodes needed to animate the components and\n * saves them to the motionController components for use in the frame loop. When\n * touchpads are found, attaches a touch dot to them.\n *\n * @private\n * @param {MotionController} motionController\n * @param {Object3D} scene\n */\nfunction findNodes( motionController, scene ) {\n\n\t// Loop through the components and find the nodes needed for each components' visual responses\n\tObject.values( motionController.components ).forEach( ( component ) => {\n\n\t\tconst { type, touchPointNodeName, visualResponses } = component;\n\n\t\tif ( type === MotionControllerConstants.ComponentType.TOUCHPAD ) {\n\n\t\t\tcomponent.touchPointNode = scene.getObjectByName( touchPointNodeName );\n\t\t\tif ( component.touchPointNode ) {\n\n\t\t\t\t// Attach a touch dot to the touchpad.\n\t\t\t\tconst sphereGeometry = new SphereGeometry( 0.001 );\n\t\t\t\tconst material = new MeshBasicMaterial( { color: 0x0000FF } );\n\t\t\t\tconst sphere = new Mesh( sphereGeometry, material );\n\t\t\t\tcomponent.touchPointNode.add( sphere );\n\n\t\t\t} else {\n\n\t\t\t\tconsole.warn( `Could not find touch dot, ${component.touchPointNodeName}, in touchpad component ${component.id}` );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Loop through all the visual responses to be applied to this component\n\t\tObject.values( visualResponses ).forEach( ( visualResponse ) => {\n\n\t\t\tconst { valueNodeName, minNodeName, maxNodeName, valueNodeProperty } = visualResponse;\n\n\t\t\t// If animating a transform, find the two nodes to be interpolated between.\n\t\t\tif ( valueNodeProperty === MotionControllerConstants.VisualResponseProperty.TRANSFORM ) {\n\n\t\t\t\tvisualResponse.minNode = scene.getObjectByName( minNodeName );\n\t\t\t\tvisualResponse.maxNode = scene.getObjectByName( maxNodeName );\n\n\t\t\t\t// If the extents cannot be found, skip this animation\n\t\t\t\tif ( ! visualResponse.minNode ) {\n\n\t\t\t\t\tconsole.warn( `Could not find ${minNodeName} in the model` );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( ! visualResponse.maxNode ) {\n\n\t\t\t\t\tconsole.warn( `Could not find ${maxNodeName} in the model` );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// If the target node cannot be found, skip this animation\n\t\t\tvisualResponse.valueNode = scene.getObjectByName( valueNodeName );\n\t\t\tif ( ! visualResponse.valueNode ) {\n\n\t\t\t\tconsole.warn( `Could not find ${valueNodeName} in the model` );\n\n\t\t\t}\n\n\t\t} );\n\n\t} );\n\n}\n\nfunction addAssetSceneToControllerModel( controllerModel, scene ) {\n\n\t// Find the nodes needed for animation and cache them on the motionController.\n\tfindNodes( controllerModel.motionController, scene );\n\n\t// Apply any environment map that the mesh already has set.\n\tif ( controllerModel.envMap ) {\n\n\t\tscene.traverse( ( child ) => {\n\n\t\t\tif ( child.isMesh ) {\n\n\t\t\t\tchild.material.envMap = controllerModel.envMap;\n\t\t\t\tchild.material.needsUpdate = true;\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\t// Add the glTF scene to the controllerModel.\n\tcontrollerModel.add( scene );\n\n}\n\n/**\n * Allows to create controller models for WebXR controllers that can be added as a visual\n * representation to your scene. `XRControllerModelFactory` will automatically fetch controller\n * models that match what the user is holding as closely as possible. The models should be\n * attached to the object returned from getControllerGrip in order to match the orientation of\n * the held device.\n *\n * This module depends on the [motion-controllers](https://github.com/immersive-web/webxr-input-profiles/blob/main/packages/motion-controllers/README.md)\n * third-part library.\n *\n * ```js\n * const controllerModelFactory = new XRControllerModelFactory();\n *\n * const controllerGrip = renderer.xr.getControllerGrip( 0 );\n * controllerGrip.add( controllerModelFactory.createControllerModel( controllerGrip ) );\n * scene.add( controllerGrip );\n * ```\n *\n * @three_import import { XRControllerModelFactory } from 'three/addons/webxr/XRControllerModelFactory.js';\n */\nclass XRControllerModelFactory {\n\n\t/**\n\t * Constructs a new XR controller model factory.\n\t *\n\t * @param {?GLTFLoader} [gltfLoader=null] - A glTF loader that is used to load controller models.\n\t * @param {?Function} [onLoad=null] - A callback that is executed when a controller model has been loaded.\n\t */\n\tconstructor( gltfLoader = null, onLoad = null ) {\n\n\t\t/**\n\t\t * A glTF loader that is used to load controller models.\n\t\t *\n\t\t * @type {?GLTFLoader}\n\t\t * @default null\n\t\t */\n\t\tthis.gltfLoader = gltfLoader;\n\n\t\t/**\n\t\t * The path to the model repository.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.path = DEFAULT_PROFILES_PATH;\n\t\tthis._assetCache = {};\n\n\t\t/**\n\t\t * A callback that is executed when a controller model has been loaded.\n\t\t *\n\t\t * @type {?Function}\n\t\t * @default null\n\t\t */\n\t\tthis.onLoad = onLoad;\n\n\t\t// If a GLTFLoader wasn't supplied to the constructor create a new one.\n\t\tif ( ! this.gltfLoader ) {\n\n\t\t\tthis.gltfLoader = new GLTFLoader();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the path to the model repository.\n\t *\n\t * @param {string} path - The path to set.\n\t * @return {XRControllerModelFactory} A reference to this instance.\n\t */\n\tsetPath( path ) {\n\n\t\tthis.path = path;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a controller model for the given WebXR controller.\n\t *\n\t * @param {Group} controller - The controller.\n\t * @return {XRControllerModel} The XR controller model.\n\t */\n\tcreateControllerModel( controller ) {\n\n\t\tconst controllerModel = new XRControllerModel();\n\t\tlet scene = null;\n\n\t\tcontroller.addEventListener( 'connected', ( event ) => {\n\n\t\t\tconst xrInputSource = event.data;\n\n\t\t\tif ( xrInputSource.targetRayMode !== 'tracked-pointer' || ! xrInputSource.gamepad || xrInputSource.hand ) return;\n\n\t\t\tfetchProfile( xrInputSource, this.path, DEFAULT_PROFILE ).then( ( { profile, assetPath } ) => {\n\n\t\t\t\tcontrollerModel.motionController = new MotionController(\n\t\t\t\t\txrInputSource,\n\t\t\t\t\tprofile,\n\t\t\t\t\tassetPath\n\t\t\t\t);\n\n\t\t\t\tconst cachedAsset = this._assetCache[ controllerModel.motionController.assetUrl ];\n\t\t\t\tif ( cachedAsset ) {\n\n\t\t\t\t\tscene = cachedAsset.scene.clone();\n\n\t\t\t\t\taddAssetSceneToControllerModel( controllerModel, scene );\n\n\t\t\t\t\tif ( this.onLoad ) this.onLoad( scene );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( ! this.gltfLoader ) {\n\n\t\t\t\t\t\tthrow new Error( 'GLTFLoader not set.' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.gltfLoader.setPath( '' );\n\t\t\t\t\tthis.gltfLoader.load( controllerModel.motionController.assetUrl, ( asset ) => {\n\n\t\t\t\t\t\tthis._assetCache[ controllerModel.motionController.assetUrl ] = asset;\n\n\t\t\t\t\t\tscene = asset.scene.clone();\n\n\t\t\t\t\t\taddAssetSceneToControllerModel( controllerModel, scene );\n\n\t\t\t\t\t\tif ( this.onLoad ) this.onLoad( scene );\n\n\t\t\t\t\t},\n\t\t\t\t\tnull,\n\t\t\t\t\t() => {\n\n\t\t\t\t\t\tthrow new Error( `Asset ${controllerModel.motionController.assetUrl} missing or malformed.` );\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t} ).catch( ( err ) => {\n\n\t\t\t\tconsole.warn( err );\n\n\t\t\t} );\n\n\t\t} );\n\n\t\tcontroller.addEventListener( 'disconnected', () => {\n\n\t\t\tcontrollerModel.motionController = null;\n\t\t\tcontrollerModel.remove( scene );\n\t\t\tscene = null;\n\n\t\t} );\n\n\t\treturn controllerModel;\n\n\t}\n\n}\n\nexport { XRControllerModelFactory };\n", "import {\n\tDirectionalLight,\n\tGroup,\n\tLightProbe,\n\tWebGLCubeRenderTarget\n} from 'three';\n\nclass SessionLightProbe {\n\n\tconstructor( xrLight, renderer, lightProbe, environmentEstimation, estimationStartCallback ) {\n\n\t\tthis.xrLight = xrLight;\n\t\tthis.renderer = renderer;\n\t\tthis.lightProbe = lightProbe;\n\t\tthis.xrWebGLBinding = null;\n\t\tthis.estimationStartCallback = estimationStartCallback;\n\t\tthis.frameCallback = this.onXRFrame.bind( this );\n\n\t\tconst session = renderer.xr.getSession();\n\n\t\t// If the XRWebGLBinding class is available then we can also query an\n\t\t// estimated reflection cube map.\n\t\tif ( environmentEstimation && 'XRWebGLBinding' in window ) {\n\n\t\t\t// This is the simplest way I know of to initialize a WebGL cubemap in Three.\n\t\t\tconst cubeRenderTarget = new WebGLCubeRenderTarget( 16 );\n\t\t\txrLight.environment = cubeRenderTarget.texture;\n\n\t\t\tconst gl = renderer.getContext();\n\n\t\t\t// Ensure that we have any extensions needed to use the preferred cube map format.\n\t\t\tswitch ( session.preferredReflectionFormat ) {\n\n\t\t\t\tcase 'srgba8':\n\t\t\t\t\tgl.getExtension( 'EXT_sRGB' );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'rgba16f':\n\t\t\t\t\tgl.getExtension( 'OES_texture_half_float' );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tthis.xrWebGLBinding = new XRWebGLBinding( session, gl );\n\n\t\t\tthis.lightProbe.addEventListener( 'reflectionchange', () => {\n\n\t\t\t\tthis.updateReflection();\n\n\t\t\t} );\n\n\t\t}\n\n\t\t// Start monitoring the XR animation frame loop to look for lighting\n\t\t// estimation changes.\n\t\tsession.requestAnimationFrame( this.frameCallback );\n\n\t}\n\n\tupdateReflection() {\n\n\t\tconst textureProperties = this.renderer.properties.get( this.xrLight.environment );\n\n\t\tif ( textureProperties ) {\n\n\t\t\tconst cubeMap = this.xrWebGLBinding.getReflectionCubeMap( this.lightProbe );\n\n\t\t\tif ( cubeMap ) {\n\n\t\t\t\ttextureProperties.__webglTexture = cubeMap;\n\n\t\t\t\tthis.xrLight.environment.needsPMREMUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tonXRFrame( time, xrFrame ) {\n\n\t\t// If either this object or the XREstimatedLight has been destroyed, stop\n\t\t// running the frame loop.\n\t\tif ( ! this.xrLight ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst session = xrFrame.session;\n\t\tsession.requestAnimationFrame( this.frameCallback );\n\n\t\tconst lightEstimate = xrFrame.getLightEstimate( this.lightProbe );\n\t\tif ( lightEstimate ) {\n\n\t\t\t// We can copy the estimate's spherical harmonics array directly into the light probe.\n\t\t\tthis.xrLight.lightProbe.sh.fromArray( lightEstimate.sphericalHarmonicsCoefficients );\n\t\t\tthis.xrLight.lightProbe.intensity = 1.0;\n\n\t\t\t// For the directional light we have to normalize the color and set the scalar as the\n\t\t\t// intensity, since WebXR can return color values that exceed 1.0.\n\t\t\tconst intensityScalar = Math.max( 1.0,\n\t\t\t\tMath.max( lightEstimate.primaryLightIntensity.x,\n\t\t\t\t\tMath.max( lightEstimate.primaryLightIntensity.y,\n\t\t\t\t\t\tlightEstimate.primaryLightIntensity.z ) ) );\n\n\t\t\tthis.xrLight.directionalLight.color.setRGB(\n\t\t\t\tlightEstimate.primaryLightIntensity.x / intensityScalar,\n\t\t\t\tlightEstimate.primaryLightIntensity.y / intensityScalar,\n\t\t\t\tlightEstimate.primaryLightIntensity.z / intensityScalar );\n\t\t\tthis.xrLight.directionalLight.intensity = intensityScalar;\n\t\t\tthis.xrLight.directionalLight.position.copy( lightEstimate.primaryLightDirection );\n\n\t\t\tif ( this.estimationStartCallback ) {\n\n\t\t\t\tthis.estimationStartCallback();\n\t\t\t\tthis.estimationStartCallback = null;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tdispose() {\n\n\t\tthis.xrLight = null;\n\t\tthis.renderer = null;\n\t\tthis.lightProbe = null;\n\t\tthis.xrWebGLBinding = null;\n\n\t}\n\n}\n\n/**\n * This class can be used to represent the environmental light of\n * a XR session. It relies on the WebXR Lighting Estimation API.\n *\n * @augments Group\n * @three_import import { XREstimatedLight } from 'three/addons/webxr/XREstimatedLight.js';\n */\nexport class XREstimatedLight extends Group {\n\n\t/**\n\t * Constructs a new light.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer.\n\t * @param {boolean} [environmentEstimation=true] - Whether to use environment estimation or not.\n\t */\n\tconstructor( renderer, environmentEstimation = true ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The light probe that represents the estimated light.\n\t\t *\n\t\t * @type {LightProbe}\n\t\t */\n\t\tthis.lightProbe = new LightProbe();\n\t\tthis.lightProbe.intensity = 0;\n\t\tthis.add( this.lightProbe );\n\n\t\t/**\n\t\t * Represents the primary light from the XR environment.\n\t\t *\n\t\t * @type {DirectionalLight}\n\t\t */\n\t\tthis.directionalLight = new DirectionalLight();\n\t\tthis.directionalLight.intensity = 0;\n\t\tthis.add( this.directionalLight );\n\n\t\t/**\n\t\t * Will be set to a cube map in the SessionLightProbe if environment estimation is\n\t\t * available and requested.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.environment = null;\n\n\t\tlet sessionLightProbe = null;\n\t\tlet estimationStarted = false;\n\t\trenderer.xr.addEventListener( 'sessionstart', () => {\n\n\t\t\tconst session = renderer.xr.getSession();\n\n\t\t\tif ( 'requestLightProbe' in session ) {\n\n\t\t\t\tsession.requestLightProbe( {\n\n\t\t\t\t\treflectionFormat: session.preferredReflectionFormat\n\n\t\t\t\t} ).then( ( probe ) => {\n\n\t\t\t\t\tsessionLightProbe = new SessionLightProbe( this, renderer, probe, environmentEstimation, () => {\n\n\t\t\t\t\t\testimationStarted = true;\n\n\t\t\t\t\t\t// Fired to indicate that the estimated lighting values are now being updated.\n\t\t\t\t\t\tthis.dispatchEvent( { type: 'estimationstart' } );\n\n\t\t\t\t\t} );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t} );\n\n\t\trenderer.xr.addEventListener( 'sessionend', () => {\n\n\t\t\tif ( sessionLightProbe ) {\n\n\t\t\t\tsessionLightProbe.dispose();\n\t\t\t\tsessionLightProbe = null;\n\n\t\t\t}\n\n\t\t\tif ( estimationStarted ) {\n\n\t\t\t\t// Fired to indicate that the estimated lighting values are no longer being updated.\n\t\t\t\tthis.dispatchEvent( { type: 'estimationend' } );\n\n\t\t\t}\n\n\t\t} );\n\n\t\t/**\n\t\t * Frees the GPU-related resources allocated by this instance. Call this\n\t\t * method whenever this instance is no longer used in your app.\n\t\t */\n\t\tthis.dispose = () => {\n\n\t\t\tif ( sessionLightProbe ) {\n\n\t\t\t\tsessionLightProbe.dispose();\n\t\t\t\tsessionLightProbe = null;\n\n\t\t\t}\n\n\t\t\tthis.remove( this.lightProbe );\n\t\t\tthis.lightProbe = null;\n\n\t\t\tthis.remove( this.directionalLight );\n\t\t\tthis.directionalLight = null;\n\n\t\t\tthis.environment = null;\n\n\t\t};\n\n\t}\n\n}\n", "import {\n\tDynamicDrawUsage,\n\tSphereGeometry,\n\tBoxGeometry,\n\tMeshStandardMaterial,\n\tInstancedMesh,\n\tMatrix4,\n\tVector3\n} from 'three';\n\nconst _matrix = new Matrix4();\nconst _vector = new Vector3();\n\n/**\n * Represents one of the hand model types {@link XRHandModelFactory} might produce\n * depending on the selected profile. `XRHandPrimitiveModel` represents a hand\n * with sphere or box primitives according to the selected `primitive` option.\n *\n * @three_import import { XRHandPrimitiveModel } from 'three/addons/webxr/XRHandPrimitiveModel.js';\n */\nclass XRHandPrimitiveModel {\n\n\t/**\n\t * Constructs a new XR hand primitive model.\n\t *\n\t * @param {XRHandModel} handModel - The hand model.\n\t * @param {Group} controller - The WebXR controller.\n\t * @param {string} path - The model path.\n\t * @param {XRHandedness} handedness - The handedness of the XR input source.\n\t * @param {XRHandPrimitiveModel~Options} options - The model options.\n\t */\n\tconstructor( handModel, controller, path, handedness, options ) {\n\n\t\t/**\n\t\t * The WebXR controller.\n\t\t *\n\t\t * @type {Group}\n\t\t */\n\t\tthis.controller = controller;\n\n\t\t/**\n\t\t * The hand model.\n\t\t *\n\t\t * @type {XRHandModel}\n\t\t */\n\t\tthis.handModel = handModel;\n\n\t\t/**\n\t\t * The model's environment map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\tlet geometry;\n\n\t\tif ( ! options || ! options.primitive || options.primitive === 'sphere' ) {\n\n\t\t\tgeometry = new SphereGeometry( 1, 10, 10 );\n\n\t\t} else if ( options.primitive === 'box' ) {\n\n\t\t\tgeometry = new BoxGeometry( 1, 1, 1 );\n\n\t\t}\n\n\t\tconst material = new MeshStandardMaterial();\n\n\t\tthis.handMesh = new InstancedMesh( geometry, material, 30 );\n\t\tthis.handMesh.frustumCulled = false;\n\t\tthis.handMesh.instanceMatrix.setUsage( DynamicDrawUsage ); // will be updated every frame\n\t\tthis.handMesh.castShadow = true;\n\t\tthis.handMesh.receiveShadow = true;\n\t\tthis.handModel.add( this.handMesh );\n\n\t\tthis.joints = [\n\t\t\t'wrist',\n\t\t\t'thumb-metacarpal',\n\t\t\t'thumb-phalanx-proximal',\n\t\t\t'thumb-phalanx-distal',\n\t\t\t'thumb-tip',\n\t\t\t'index-finger-metacarpal',\n\t\t\t'index-finger-phalanx-proximal',\n\t\t\t'index-finger-phalanx-intermediate',\n\t\t\t'index-finger-phalanx-distal',\n\t\t\t'index-finger-tip',\n\t\t\t'middle-finger-metacarpal',\n\t\t\t'middle-finger-phalanx-proximal',\n\t\t\t'middle-finger-phalanx-intermediate',\n\t\t\t'middle-finger-phalanx-distal',\n\t\t\t'middle-finger-tip',\n\t\t\t'ring-finger-metacarpal',\n\t\t\t'ring-finger-phalanx-proximal',\n\t\t\t'ring-finger-phalanx-intermediate',\n\t\t\t'ring-finger-phalanx-distal',\n\t\t\t'ring-finger-tip',\n\t\t\t'pinky-finger-metacarpal',\n\t\t\t'pinky-finger-phalanx-proximal',\n\t\t\t'pinky-finger-phalanx-intermediate',\n\t\t\t'pinky-finger-phalanx-distal',\n\t\t\t'pinky-finger-tip'\n\t\t];\n\n\t}\n\n\t/**\n\t * Updates the mesh based on the tracked XR joints data.\n\t */\n\tupdateMesh() {\n\n\t\tconst defaultRadius = 0.008;\n\t\tconst joints = this.controller.joints;\n\n\t\tlet count = 0;\n\n\t\tfor ( let i = 0; i < this.joints.length; i ++ ) {\n\n\t\t\tconst joint = joints[ this.joints[ i ] ];\n\n\t\t\tif ( joint.visible ) {\n\n\t\t\t\t_vector.setScalar( joint.jointRadius || defaultRadius );\n\t\t\t\t_matrix.compose( joint.position, joint.quaternion, _vector );\n\t\t\t\tthis.handMesh.setMatrixAt( i, _matrix );\n\n\t\t\t\tcount ++;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.handMesh.count = count;\n\t\tthis.handMesh.instanceMatrix.needsUpdate = true;\n\n\t}\n\n}\n\n/**\n * Constructor options of `XRHandPrimitiveModel`.\n *\n * @typedef {Object} XRHandPrimitiveModel~Options\n * @property {('box'|'sphere')} [primitive] - The primitive type.\n **/\n\nexport { XRHandPrimitiveModel };\n", "import {\n\tObject3D\n} from 'three';\n\nimport {\n\tXRHandPrimitiveModel\n} from './XRHandPrimitiveModel.js';\n\nimport {\n\tXRHandMeshModel\n} from './XRHandMeshModel.js';\n\n/**\n * Represents a XR hand model.\n *\n * @augments Object3D\n */\nclass XRHandModel extends Object3D {\n\n\t/**\n\t * Constructs a new XR hand model.\n\t *\n\t * @param {Group} controller - The hand controller.\n\t */\n\tconstructor( controller ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The hand controller.\n\t\t *\n\t\t * @type {Group}\n\t\t */\n\t\tthis.controller = controller;\n\n\t\t/**\n\t\t * The motion controller.\n\t\t *\n\t\t * @type {?MotionController}\n\t\t * @default null\n\t\t */\n\t\tthis.motionController = null;\n\n\t\t/**\n\t\t * The controller's environment map.\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.envMap = null;\n\n\t\t/**\n\t\t * The model mesh.\n\t\t *\n\t\t * @type {Mesh}\n\t\t * @default null\n\t\t */\n\t\tthis.mesh = null;\n\n\t}\n\n\t/**\n\t * Overwritten with a custom implementation. Makes sure the motion controller updates the mesh.\n\t *\n\t * @param {boolean} [force=false] - When set to `true`, a recomputation of world matrices is forced even\n\t * when {@link Object3D#matrixWorldAutoUpdate} is set to `false`.\n\t */\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tif ( this.motionController ) {\n\n\t\t\tthis.motionController.updateMesh();\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Similar to {@link XRControllerModelFactory}, this class allows to create hand models\n * for WebXR controllers that can be added as a visual representation to your scene.\n *\n * ```js\n * const handModelFactory = new XRHandModelFactory();\n *\n * const hand = renderer.xr.getHand( 0 );\n * hand.add( handModelFactory.createHandModel( hand ) );\n * scene.add( hand );\n * ```\n *\n * @three_import import { XRHandModelFactory } from 'three/addons/webxr/XRHandModelFactory.js';\n */\nclass XRHandModelFactory {\n\n\t/**\n\t * Constructs a new XR hand model factory.\n\t *\n\t * @param {?GLTFLoader} [gltfLoader=null] - A glTF loader that is used to load hand models.\n\t * @param {?Function} [onLoad=null] - A callback that is executed when a hand model has been loaded.\n\t */\n\tconstructor( gltfLoader = null, onLoad = null ) {\n\n\t\t/**\n\t\t * A glTF loader that is used to load hand models.\n\t\t *\n\t\t * @type {?GLTFLoader}\n\t\t * @default null\n\t\t */\n\t\tthis.gltfLoader = gltfLoader;\n\n\t\t/**\n\t\t * The path to the model repository.\n\t\t *\n\t\t * @type {?string}\n\t\t * @default null\n\t\t */\n\t\tthis.path = null;\n\n\t\t/**\n\t\t * A callback that is executed when a hand model has been loaded.\n\t\t *\n\t\t * @type {?Function}\n\t\t * @default null\n\t\t */\n\t\tthis.onLoad = onLoad;\n\n\t}\n\n\t/**\n\t * Sets the path to the hand model repository.\n\t *\n\t * @param {string} path - The path to set.\n\t * @return {XRHandModelFactory} A reference to this instance.\n\t */\n\tsetPath( path ) {\n\n\t\tthis.path = path;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a controller model for the given WebXR hand controller.\n\t *\n\t * @param {Group} controller - The hand controller.\n\t * @param {('spheres'|'boxes'|'mesh')} [profile] - The model profile that defines the model type.\n\t * @return {XRHandModel} The XR hand model.\n\t */\n\tcreateHandModel( controller, profile ) {\n\n\t\tconst handModel = new XRHandModel( controller );\n\n\t\tcontroller.addEventListener( 'connected', ( event ) => {\n\n\t\t\tconst xrInputSource = event.data;\n\n\t\t\tif ( xrInputSource.hand && ! handModel.motionController ) {\n\n\t\t\t\thandModel.xrInputSource = xrInputSource;\n\n\t\t\t\t// @todo Detect profile if not provided\n\t\t\t\tif ( profile === undefined || profile === 'spheres' ) {\n\n\t\t\t\t\thandModel.motionController = new XRHandPrimitiveModel( handModel, controller, this.path, xrInputSource.handedness, { primitive: 'sphere' } );\n\n\t\t\t\t} else if ( profile === 'boxes' ) {\n\n\t\t\t\t\thandModel.motionController = new XRHandPrimitiveModel( handModel, controller, this.path, xrInputSource.handedness, { primitive: 'box' } );\n\n\t\t\t\t} else if ( profile === 'mesh' ) {\n\n\t\t\t\t\thandModel.motionController = new XRHandMeshModel( handModel, controller, this.path, xrInputSource.handedness, this.gltfLoader, this.onLoad );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} );\n\n\t\tcontroller.addEventListener( 'disconnected', () => {\n\n\t\t\thandModel.clear();\n\t\t\thandModel.motionController = null;\n\n\t\t} );\n\n\t\treturn handModel;\n\n\t}\n\n}\n\nexport { XRHandModelFactory };\n", "import {\n\tBoxGeometry,\n\tMatrix4,\n\tMesh,\n\tMeshBasicMaterial,\n\tObject3D\n} from 'three';\n\n/**\n * A utility class for the WebXR Plane Detection Module. If planes\n * are detected by WebXR, this class will automatically add them\n * as thin box meshes to the scene when below code snippet is used.\n *\n * ```js\n * const planes = new XRPlanes( renderer );\n * scene.add( planes );\n * ```\n *\n * @augments Object3D\n * @three_import import { XRPlanes } from 'three/addons/webxr/XRPlanes.js';\n */\nclass XRPlanes extends Object3D {\n\n\t/**\n\t * Constructs a new XR plane container.\n\t *\n\t * @param {WebGLRenderer|WebGPURenderer} renderer - The renderer.\n\t */\n\tconstructor( renderer ) {\n\n\t\tsuper();\n\n\t\tconst matrix = new Matrix4();\n\n\t\tconst currentPlanes = new Map();\n\n\t\tconst xr = renderer.xr;\n\n\t\txr.addEventListener( 'planesdetected', event => {\n\n\t\t\tconst frame = event.data;\n\t\t\tconst planes = frame.detectedPlanes;\n\n\t\t\tconst referenceSpace = xr.getReferenceSpace();\n\n\t\t\tlet planeschanged = false;\n\n\t\t\tfor ( const [ plane, mesh ] of currentPlanes ) {\n\n\t\t\t\tif ( planes.has( plane ) === false ) {\n\n\t\t\t\t\tmesh.geometry.dispose();\n\t\t\t\t\tmesh.material.dispose();\n\t\t\t\t\tthis.remove( mesh );\n\n\t\t\t\t\tcurrentPlanes.delete( plane );\n\n\t\t\t\t\tplaneschanged = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( const plane of planes ) {\n\n\t\t\t\tif ( currentPlanes.has( plane ) === false ) {\n\n\t\t\t\t\tconst pose = frame.getPose( plane.planeSpace, referenceSpace );\n\t\t\t\t\tmatrix.fromArray( pose.transform.matrix );\n\n\t\t\t\t\tconst polygon = plane.polygon;\n\n\t\t\t\t\tlet minX = Number.MAX_SAFE_INTEGER;\n\t\t\t\t\tlet maxX = Number.MIN_SAFE_INTEGER;\n\t\t\t\t\tlet minZ = Number.MAX_SAFE_INTEGER;\n\t\t\t\t\tlet maxZ = Number.MIN_SAFE_INTEGER;\n\n\t\t\t\t\tfor ( const point of polygon ) {\n\n\t\t\t\t\t\tminX = Math.min( minX, point.x );\n\t\t\t\t\t\tmaxX = Math.max( maxX, point.x );\n\t\t\t\t\t\tminZ = Math.min( minZ, point.z );\n\t\t\t\t\t\tmaxZ = Math.max( maxZ, point.z );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst width = maxX - minX;\n\t\t\t\t\tconst height = maxZ - minZ;\n\n\t\t\t\t\tconst geometry = new BoxGeometry( width, 0.01, height );\n\t\t\t\t\tconst material = new MeshBasicMaterial( { color: 0xffffff * Math.random() } );\n\n\t\t\t\t\tconst mesh = new Mesh( geometry, material );\n\t\t\t\t\tmesh.position.setFromMatrixPosition( matrix );\n\t\t\t\t\tmesh.quaternion.setFromRotationMatrix( matrix );\n\t\t\t\t\tthis.add( mesh );\n\n\t\t\t\t\tcurrentPlanes.set( plane, mesh );\n\n\t\t\t\t\tplaneschanged = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( planeschanged ) {\n\n\t\t\t\tthis.dispatchEvent( { type: 'planeschanged' } );\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n}\n\nexport { XRPlanes };\n", "export * from './animation/AnimationClipCreator.js';\nexport * from './animation/CCDIKSolver.js';\n\nexport { default as WebGL } from './capabilities/WebGL.js';\n\nexport * from './controls/ArcballControls.js';\nexport * from './controls/DragControls.js';\nexport * from './controls/FirstPersonControls.js';\nexport * from './controls/FlyControls.js';\nexport * from './controls/MapControls.js';\nexport * from './controls/OrbitControls.js';\nexport * from './controls/PointerLockControls.js';\nexport * from './controls/TrackballControls.js';\nexport * from './controls/TransformControls.js';\n\nexport * from './csm/CSM.js';\nexport * from './csm/CSMFrustum.js';\nexport * from './csm/CSMHelper.js';\nexport * from './csm/CSMShader.js';\n\nexport * as Curves from './curves/CurveExtras.js';\nexport * from './curves/NURBSCurve.js';\nexport * from './curves/NURBSSurface.js';\nexport * from './curves/NURBSVolume.js';\nexport * as NURBSUtils from './curves/NURBSUtils.js';\n\nexport * from './effects/AnaglyphEffect.js';\nexport * from './effects/AsciiEffect.js';\nexport * from './effects/OutlineEffect.js';\nexport * from './effects/ParallaxBarrierEffect.js';\nexport * from './effects/StereoEffect.js';\n\nexport * from './environments/DebugEnvironment.js';\nexport * from './environments/RoomEnvironment.js';\n\nexport * from './exporters/DRACOExporter.js';\nexport * from './exporters/EXRExporter.js';\nexport * from './exporters/GLTFExporter.js';\nexport * from './exporters/KTX2Exporter.js';\nexport * from './exporters/OBJExporter.js';\nexport * from './exporters/PLYExporter.js';\nexport * from './exporters/STLExporter.js';\nexport * from './exporters/USDZExporter.js';\n\nexport * from './geometries/BoxLineGeometry.js';\nexport * from './geometries/ConvexGeometry.js';\nexport * from './geometries/DecalGeometry.js';\nexport * from './geometries/ParametricFunctions.js';\nexport * from './geometries/ParametricGeometry.js';\nexport * from './geometries/RoundedBoxGeometry.js';\nexport * from './geometries/TeapotGeometry.js';\nexport * from './geometries/TextGeometry.js';\n\nexport * from './helpers/LightProbeHelper.js';\nexport * from './helpers/OctreeHelper.js';\nexport * from './helpers/PositionalAudioHelper.js';\nexport * from './helpers/RectAreaLightHelper.js';\nexport * from './helpers/TextureHelper.js';\nexport * from './helpers/VertexNormalsHelper.js';\nexport * from './helpers/VertexTangentsHelper.js';\nexport * from './helpers/ViewHelper.js';\n\nexport * from './interactive/HTMLMesh.js';\nexport * from './interactive/InteractiveGroup.js';\nexport * from './interactive/SelectionBox.js';\nexport * from './interactive/SelectionHelper.js';\n\nexport * from './lights/LightProbeGenerator.js';\nexport * from './lights/RectAreaLightTexturesLib.js';\nexport * from './lights/RectAreaLightUniformsLib.js';\n\nexport * from './lines/Line2.js';\nexport * from './lines/LineGeometry.js';\nexport * from './lines/LineMaterial.js';\nexport * from './lines/LineSegments2.js';\nexport * from './lines/LineSegmentsGeometry.js';\nexport * from './lines/Wireframe.js';\nexport * from './lines/WireframeGeometry2.js';\n\nexport * from './loaders/3DMLoader.js';\nexport * from './loaders/3MFLoader.js';\nexport * from './loaders/AMFLoader.js';\nexport * from './loaders/BVHLoader.js';\nexport * from './loaders/ColladaLoader.js';\nexport * from './loaders/DDSLoader.js';\nexport * from './loaders/DRACOLoader.js';\nexport * from './loaders/EXRLoader.js';\nexport * from './loaders/FBXLoader.js';\nexport * from './loaders/FontLoader.js';\nexport * from './loaders/GCodeLoader.js';\nexport * from './loaders/GLTFLoader.js';\nexport * from './loaders/HDRLoader.js';\nexport * from './loaders/HDRCubeTextureLoader.js';\nexport * from './loaders/IESLoader.js';\nexport * from './loaders/KMZLoader.js';\nexport * from './loaders/KTX2Loader.js';\nexport * from './loaders/KTXLoader.js';\nexport * from './loaders/LDrawLoader.js';\nexport * from './loaders/LUT3dlLoader.js';\nexport * from './loaders/LUTCubeLoader.js';\nexport * from './loaders/LWOLoader.js';\nexport * from './loaders/LottieLoader.js';\nexport * from './loaders/MD2Loader.js';\nexport * from './loaders/MDDLoader.js';\nexport * from './loaders/MTLLoader.js';\nexport * from './loaders/NRRDLoader.js';\nexport * from './loaders/OBJLoader.js';\nexport * from './loaders/PCDLoader.js';\nexport * from './loaders/PDBLoader.js';\nexport * from './loaders/PLYLoader.js';\nexport * from './loaders/PVRLoader.js';\nexport * from './loaders/RGBELoader.js';\nexport * from './loaders/UltraHDRLoader.js';\nexport * from './loaders/STLLoader.js';\nexport * from './loaders/SVGLoader.js';\nexport * from './loaders/TDSLoader.js';\nexport * from './loaders/TGALoader.js';\nexport * from './loaders/TIFFLoader.js';\nexport * from './loaders/TTFLoader.js';\nexport * from './loaders/USDLoader.js';\nexport * from './loaders/VOXLoader.js';\nexport * from './loaders/VRMLLoader.js';\nexport * from './loaders/VTKLoader.js';\nexport * from './loaders/XYZLoader.js';\n\nexport * from './materials/MeshGouraudMaterial.js';\nexport * from './materials/LDrawConditionalLineMaterial.js';\nexport * from './materials/MeshPostProcessingMaterial.js';\n\nexport * from './math/Capsule.js';\nexport * from './math/ColorConverter.js';\nexport * from './math/ConvexHull.js';\nexport * from './math/ImprovedNoise.js';\nexport * from './math/Lut.js';\nexport * from './math/MeshSurfaceSampler.js';\nexport * from './math/OBB.js';\nexport * from './math/Octree.js';\nexport * from './math/SimplexNoise.js';\n\nexport * from './misc/ConvexObjectBreaker.js';\nexport * from './misc/GPUComputationRenderer.js';\nexport * from './misc/Gyroscope.js';\nexport * from './misc/MD2Character.js';\nexport * from './misc/MD2CharacterComplex.js';\nexport * from './misc/MorphAnimMesh.js';\nexport * from './misc/MorphBlendMesh.js';\nexport * from './misc/ProgressiveLightMap.js';\nexport * from './misc/RollerCoaster.js';\nexport * from './misc/TubePainter.js';\nexport * from './misc/Volume.js';\nexport * from './misc/VolumeSlice.js';\n\nexport * from './modifiers/CurveModifier.js';\nexport * from './modifiers/EdgeSplitModifier.js';\nexport * from './modifiers/SimplifyModifier.js';\nexport * from './modifiers/TessellateModifier.js';\n\nexport * from './objects/GroundedSkybox.js';\nexport * from './objects/Lensflare.js';\nexport * from './objects/MarchingCubes.js';\nexport * from './objects/Reflector.js';\nexport * from './objects/ReflectorForSSRPass.js';\nexport * from './objects/Refractor.js';\nexport * from './objects/ShadowMesh.js';\nexport * from './objects/Sky.js';\nexport * from './objects/Water.js';\nexport { Water as Water2 } from './objects/Water2.js';\n\nexport * from './physics/AmmoPhysics.js';\nexport * from './physics/RapierPhysics.js';\n\nexport * from './postprocessing/AfterimagePass.js';\nexport * from './postprocessing/BloomPass.js';\nexport * from './postprocessing/BokehPass.js';\nexport * from './postprocessing/ClearPass.js';\nexport * from './postprocessing/CubeTexturePass.js';\nexport * from './postprocessing/DotScreenPass.js';\nexport * from './postprocessing/EffectComposer.js';\nexport * from './postprocessing/FilmPass.js';\nexport * from './postprocessing/GlitchPass.js';\nexport * from './postprocessing/GTAOPass.js';\nexport * from './postprocessing/HalftonePass.js';\nexport * from './postprocessing/LUTPass.js';\nexport * from './postprocessing/MaskPass.js';\nexport * from './postprocessing/OutlinePass.js';\nexport * from './postprocessing/OutputPass.js';\nexport * from './postprocessing/Pass.js';\nexport * from './postprocessing/RenderPass.js';\nexport * from './postprocessing/RenderPixelatedPass.js';\nexport * from './postprocessing/SAOPass.js';\nexport * from './postprocessing/SMAAPass.js';\nexport * from './postprocessing/SSAARenderPass.js';\nexport * from './postprocessing/SSAOPass.js';\nexport * from './postprocessing/SSRPass.js';\nexport * from './postprocessing/SavePass.js';\nexport * from './postprocessing/ShaderPass.js';\nexport * from './postprocessing/TAARenderPass.js';\nexport * from './postprocessing/TexturePass.js';\nexport * from './postprocessing/UnrealBloomPass.js';\n\nexport * from './renderers/CSS2DRenderer.js';\nexport * from './renderers/CSS3DRenderer.js';\nexport * from './renderers/Projector.js';\nexport * from './renderers/SVGRenderer.js';\n\nexport * from './shaders/ACESFilmicToneMappingShader.js';\nexport * from './shaders/AfterimageShader.js';\nexport * from './shaders/BasicShader.js';\nexport * from './shaders/BleachBypassShader.js';\nexport * from './shaders/BlendShader.js';\nexport * from './shaders/BokehShader.js';\nexport { BokehShader as BokehShader2 } from './shaders/BokehShader2.js';\nexport * from './shaders/BrightnessContrastShader.js';\nexport * from './shaders/ColorCorrectionShader.js';\nexport * from './shaders/ColorifyShader.js';\nexport * from './shaders/ConvolutionShader.js';\nexport * from './shaders/CopyShader.js';\nexport * from './shaders/DOFMipMapShader.js';\nexport * from './shaders/DepthLimitedBlurShader.js';\nexport * from './shaders/DigitalGlitch.js';\nexport * from './shaders/DotScreenShader.js';\nexport * from './shaders/ExposureShader.js';\nexport * from './shaders/FXAAShader.js';\nexport * from './shaders/FilmShader.js';\nexport * from './shaders/FocusShader.js';\nexport * from './shaders/FreiChenShader.js';\nexport * from './shaders/GammaCorrectionShader.js';\nexport * from './shaders/GodRaysShader.js';\nexport * from './shaders/GTAOShader.js';\nexport * from './shaders/HalftoneShader.js';\nexport * from './shaders/HorizontalBlurShader.js';\nexport * from './shaders/HorizontalTiltShiftShader.js';\nexport * from './shaders/HueSaturationShader.js';\nexport * from './shaders/KaleidoShader.js';\nexport * from './shaders/LuminosityHighPassShader.js';\nexport * from './shaders/LuminosityShader.js';\nexport * from './shaders/MirrorShader.js';\nexport * from './shaders/NormalMapShader.js';\nexport * from './shaders/OutputShader.js';\nexport * from './shaders/RGBShiftShader.js';\nexport * from './shaders/SAOShader.js';\nexport * from './shaders/SMAAShader.js';\nexport * from './shaders/SSAOShader.js';\nexport * from './shaders/SSRShader.js';\nexport * from './shaders/SepiaShader.js';\nexport * from './shaders/SobelOperatorShader.js';\nexport * from './shaders/SubsurfaceScatteringShader.js';\nexport * from './shaders/TechnicolorShader.js';\nexport * from './shaders/ToonShader.js';\nexport * from './shaders/TriangleBlurShader.js';\nexport * from './shaders/UnpackDepthRGBAShader.js';\nexport * from './shaders/VelocityShader.js';\nexport * from './shaders/VerticalBlurShader.js';\nexport * from './shaders/VerticalTiltShiftShader.js';\nexport * from './shaders/VignetteShader.js';\nexport * from './shaders/VolumeShader.js';\nexport * from './shaders/WaterRefractionShader.js';\n\nexport * from './textures/FlakesTexture.js';\n\nexport * as BufferGeometryUtils from './utils/BufferGeometryUtils.js';\nexport * as CameraUtils from './utils/CameraUtils.js';\nexport * as GeometryCompressionUtils from './utils/GeometryCompressionUtils.js';\nexport * as GeometryUtils from './utils/GeometryUtils.js';\nexport * from './utils/LDrawUtils.js';\nexport * as SceneUtils from './utils/SceneUtils.js';\nexport * from './utils/ShadowMapViewer.js';\nexport * as SkeletonUtils from './utils/SkeletonUtils.js';\nexport * as SortUtils from './utils/SortUtils.js';\nexport * from './utils/WebGLTextureUtils.js';\nexport * from './utils/UVsDebug.js';\nexport * from './utils/WorkerPool.js';\n\nexport * from './webxr/ARButton.js';\nexport * from './webxr/OculusHandModel.js';\nexport * from './webxr/OculusHandPointerModel.js';\nexport * from './webxr/Text2D.js';\nexport * from './webxr/VRButton.js';\nexport * from './webxr/XRButton.js';\nexport * from './webxr/XRControllerModelFactory.js';\nexport * from './webxr/XREstimatedLight.js';\nexport * from './webxr/XRHandMeshModel.js';\nexport * from './webxr/XRHandModelFactory.js';\nexport * from './webxr/XRHandPrimitiveModel.js';\nexport * from './webxr/XRPlanes.js';\n", "/*!\n * @file Extensions for Three.js to help allow per-bone scaling of skeletons.\n * @author Arian Kordi <https://github.com/ariankordi>\n */\n\n// @ts-check\n/*\nHelpful references:\n- [ ] https://github.com/lo-th/phy/blob/main/src/3TH/character/SkeletonExtand.js\n- [ ] https://github.com/lo-th/lab/blob/master/src/lth/Skeleton_Add.js\n- [ ] https://github.com/lo-th/Avatar.lab/blob/gh-pages/src/skeleton.js\nAuthor of the THREE.Skeleton.prototype.update override, and\nthus this entire method for scaling a model, is lo-th.\nAll other references I found on GitHub were simply copying his code.\n*/\n\nimport * as THREE from 'three';\n\n// // ---------------------------------------------------------------------\n// //  Extensions for Skeleton Scaling\n// // ---------------------------------------------------------------------\n\n/**\n * A description for a model attached to a bone on a {@link THREE.Skeleton}.\n * This kind of attachment will follow the position of a scaled bone\n * while also allowing the attached model to maintain its own separate scale.\n * @typedef {{\n * obj: THREE.Object3D,\n * boneIdx: number,\n * localScale: THREE.Vector3|null\n * }} SkeletonAttachment\n */\n\n/**\n * Custom version of {@link THREE.Skeleton} to add attachments.\n * @typedef {THREE.Skeleton & {\n * _attachments: Array<SkeletonAttachment>|undefined,\n * attach: function(THREE.Object3D, string, boolean=): void,\n * detach: function(THREE.Object3D): void\n * detachAll: function(): void\n * }} SkeletonWithAttachments\n */\n\n/**\n * Custom version of {@link THREE.Bone} with custom scaling properties.\n * Note that the misspelled \"scalling\" name is still used from lo-th's original code.\n * @typedef {THREE.Bone & {\n * scalling: THREE.Vector3|undefined,\n * scaleForRootAdjust: THREE.Vector3Like|undefined,\n * }} BoneWithScaling\n */\n\n/**\n * Adds extensions (override functions) to the THREE.Skeleton namespace ({@link THREE.Skeleton})\n * to enable hierarchical per-bone local scaling for Three.js skeletons.\n * @param {typeof THREE.Skeleton} Skeleton - The THREE.Skeleton class.\n */\nfunction addSkeletonScalingExtensions(Skeleton) {\n\tif (/** @type {SkeletonWithAttachments} */ (Skeleton.prototype)._attachments) {\n\t\tconsole.warn('addSkeletonScalingExtensions: Already run, skipping.');\n\t\treturn; // Already run, skip this.\n\t}\n\n\t// Replace function that runs every time a skeleton is updated.\n\t// Original function (r178, 2025, functionality is simple):\n\t// https://github.com/mrdoob/three.js/blob/e117b283555e0ccc5034fa5193b951bc987280ed/src/objects/Skeleton.js#L198\n\tSkeleton.prototype.update = (function () {\n\t\t// Static, shared variables to be used temporarily for every run.\n\n\t\t/** @readonly */ // - (Below two are defined in three.js Skeleton.js)\n\t\tconst _identityMatrix = /* @__PURE__ */ new THREE.Matrix4().identity();\n\t\t// Used in main bone scale loop:\n\t\tconst _offsetMatrix = /* @__PURE__ */ new THREE.Matrix4();\n\n\t\tconst scaleMatrix = /* @__PURE__ */ new THREE.Matrix4();\n\t\tconst posVec = /* @__PURE__ */ new THREE.Vector3();\n\n\t\t// Used for decomposing/composing when updating attachments:\n\t\tconst tmpQuat = /* @__PURE__ */ new THREE.Quaternion();\n\t\tconst tmpTrans = /* @__PURE__ */ new THREE.Vector3();\n\n\t\t/**\n\t\t * Adjusts translation, if the parent is the root (skl_root).\n\t\t * @param {BoneWithScaling} bone - The bone to check/adjust for.\n\t\t * @param {THREE.Matrix4} matrix - The local matrix.\n\t\t */\n\t\tfunction adjustTranslationForRoot(bone, matrix) {\n\t\t\t// Run if: this bone has a parent bone, and the parent is skl_root.\n\t\t\tif (!bone.scalling || !(bone.parent instanceof THREE.Bone) ||\n\t\t\t\t// scaleForRootAdjust being present indicates that parent is the root.\n\t\t\t\t!(/** @type {BoneWithScaling} */ (bone.parent).scaleForRootAdjust)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// if (!bone.scalling || !bone.isScallingRoot) return;\n\n\t\t\t// Get translation/W-axis from matrix.\n\t\t\tconst translation = tmpTrans.setFromMatrixPosition(matrix);\n\t\t\t// Use the scale vector to adjust translation.\n\t\t\tconst scale = /** @type {THREE.Vector3Like} */\n\t\t\t\t(/** @type {BoneWithScaling} */ (bone.parent).scaleForRootAdjust);\n\n\t\t\t// Multiply translation by YYX axes:\n\t\t\ttranslation.x *= scale.y;\n\t\t\ttranslation.y *= scale.y;\n\t\t\ttranslation.z *= scale.x;\n\t\t\t// Move Y down to keep the model's root (legs) planted.\n\t\t\ttranslation.y += (scale.x - scale.y); //* 1.0;\n\t\t\t// 1.0 = Local-to-world scale of the body model.\n\n\t\t\tmatrix.setPosition(translation); // Set translation back on matrix.\n\t\t}\n\n\t\t/**\n\t\t * @param {Array<SkeletonAttachment>} attachments - The attachment array.\n\t\t * @param {Parameters<typeof THREE.Matrix4.prototype.fromArray>[0]} boneMatrices -\n\t\t * The raw matrices array to update the attachment with.\n\t\t */\n\t\tfunction updateAttachments(attachments, boneMatrices) {\n\t\t\tfor (const at of attachments) {\n\t\t\t\t// _offsetMatrix - Temporary matrix for the bone's worldMatrix.\n\t\t\t\t// scaleMatrix - Temporary matrix for the inverted parent.\n\n\t\t\t\t// Get the world matrix of the bone we just fed to skinning:\n\t\t\t\t_offsetMatrix.fromArray(boneMatrices, at.boneIdx * 16); // Already scaled.\n\n\t\t\t\t// The caller wants to preserve the attachment's own local scale.\n\t\t\t\tif (at.localScale) {\n\t\t\t\t\t// Remove the bone's scale by re-composing with the local scale.\n\t\t\t\t\t_offsetMatrix.decompose(tmpTrans, tmpQuat, posVec);\n\t\t\t\t\t_offsetMatrix.compose(tmpTrans, tmpQuat, at.localScale);\n\t\t\t\t}\n\n\t\t\t\t// Copy bone-space to world-space for the attachment.\n\t\t\t\t// at.obj.matrixWorld.copy(_offsetMatrix);// .multiply(at.local);\n\t\t\t\t// at.obj.matrixWorldNeedsUpdate = false; // Make the matrix stay put.\n\n\t\t\t\t/** The world matrix of the object's parent, or identity if there is none. */\n\t\t\t\tconst parentWorld = at.obj.parent ? at.obj.parent.matrixWorld : _identityMatrix;\n\t\t\t\tscaleMatrix.copy(parentWorld).invert(); // Convert world to local matrix.\n\n\t\t\t\t// Multiply two matrices and store result in the object's matrix.\n\t\t\t\tat.obj.matrix.multiplyMatrices(scaleMatrix, _offsetMatrix);\n\t\t\t\tat.obj.updateMatrixWorld(true); // Update now. (Not recommended to change directly.)\n\t\t\t}\n\t\t}\n\n\t\t/**\n\t\t * Override of the update function to apply per-bone scaling and attachments.\n\t\t * In the author (https://github.com/lo-th)'s words: \"force local scalling\"\n\t\t * From lab (2019): https://github.com/lo-th/lab/blob/5e8949f3202a952df2269e80f40a93f362cf22aa/src/lth/Skeleton_Add.js#L136\n\t\t * From Avatar.lab (2017): https://github.com/lo-th/Avatar.lab/blob/e96e7f3862c04feb7ce9fb6744561ffb8661fb21/src/skeleton.js#L5\n\t\t * @this {SkeletonWithAttachments}\n\t\t */\n\t\treturn function update() {\n\t\t\tconsole.assert(this.boneMatrices instanceof Float32Array); // Enforce non-null.\n\t\t\tconst boneMatrices = /** @type {Float32Array} */ (this.boneMatrices);\n\n\t\t\t// For each bone, calculate the matrixWorld and then apply custom per-bone scaling.\n\t\t\tfor (let i = 0; i < this.bones.length; i++) { // Flatten bone matrices to array.\n\t\t\t\tconst bone = /** @type {BoneWithScaling|undefined} */ (this.bones[i]);\n\t\t\t\t/** Current bone's matrixWorld. It will be re-assigned if there is scaling. */\n\t\t\t\tlet matrixWorld = bone ? bone.matrixWorld : _identityMatrix;\n\n\t\t\t\t// If the bone has \"scalling\" (note spelling!), apply it to the bone.\n\t\t\t\tif (bone && bone.scalling) {\n\t\t\t\t\tmatrixWorld = _offsetMatrix.copy(matrixWorld).scale(bone.scalling);\n\n\t\t\t\t\t// Adjust translation for the root (skl_root).\n\t\t\t\t\t// if (bone.parent && bone.parent instanceof THREE.Bone &&\n\t\t\t\t\t//\t bone.scalling && /** @type {BoneWithScaling} */ (bone.parent)\n\t\t\t\t\t//\t .isScallingRoot) {\n\t\t\t\t\tadjustTranslationForRoot(bone, matrixWorld);\n\n\t\t\t\t\t// Adjust translation for children so they follow the scaled parent.\n\t\t\t\t\tfor (const child of bone.children) {\n\t\t\t\t\t\tscaleMatrix.copy(matrixWorld).multiply(child.matrix);\n\t\t\t\t\t\tposVec.setFromMatrixPosition(scaleMatrix);\n\t\t\t\t\t\tchild.matrixWorld.setPosition(posVec);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Update boneMatrices[] (like the original update function)\n\t\t\t\t_offsetMatrix.multiplyMatrices(matrixWorld, this.boneInverses[i]);\n\t\t\t\t_offsetMatrix.toArray(boneMatrices, i * 16);\n\t\t\t}\n\n\t\t\t// Update all registered attachments after bones are updated.\n\t\t\tif (this._attachments) {\n\t\t\t\tupdateAttachments(this._attachments, boneMatrices);\n\t\t\t}\n\n\t\t\t// Finally, update boneTexture (like the original update function)\n\t\t\tif (this.boneTexture) {\n\t\t\t\tthis.boneTexture.needsUpdate = true;\n\t\t\t}\n\t\t};\n\t})();\n\n\t// Define SkeletonWithAttachments extensions.\n\n\t/** @type {SkeletonWithAttachments} */ (Skeleton.prototype).attach =\n\t/**\n\t * @param {THREE.Object3D} obj - The Object3D to attach (SkinnedMesh, glTF scene, etc.)\n\t * @param {string} boneName - Bone name to look up once.\n\t * @param {boolean} [useBoneScale] - If this is false, then the bone's individual\n\t * scale is ignored, and the object's local scale will be used when attaching.\n\t * @throws {Error} Throws if the bone specified in `boneName` cannot be found.\n\t * @this {SkeletonWithAttachments}\n\t */\n\tfunction (obj, boneName, useBoneScale = false) {\n\t\tconst boneIdx = this.bones.findIndex(b => b.name === boneName);\n\t\tif (boneIdx === -1) {\n\t\t\tthrow new Error(`Bone '${boneName}' not found.`);\n\t\t}\n\n\t\t// Turn off auto\u2010updates so our manual matrix stays put.\n\t\tobj.matrixAutoUpdate = false;\n\t\t// obj.matrixWorldAutoUpdate = false; // Not modifying matrixWorld directly.\n\n\t\tconst localScale = useBoneScale ? null : obj.scale;\n\t\t/** @type {SkeletonAttachment} */\n\t\tconst att = { obj, boneIdx, localScale };\n\n\t\t// Add the attachment or create the _attachments array.\n\t\tif (this._attachments) {\n\t\t\tthis._attachments.push(att);\n\t\t} else {\n\t\t\tthis._attachments = [att];\n\t\t}\n\t\t// this.update(); // Update the attachment instantly. (Not needed)\n\t};\n\n\t/** @type {SkeletonWithAttachments} */ (Skeleton.prototype).detach =\n\t/**\n\t * @param {THREE.Object3D} obj - The object to detach.\n\t * @this {SkeletonWithAttachments}\n\t */\n\tfunction (obj) {\n\t\tif (this._attachments) {\n\t\t\tthis._attachments = this._attachments.filter(a => a.obj !== obj);\n\t\t}\n\t};\n\n\t/** @type {SkeletonWithAttachments} */ (Skeleton.prototype).detachAll =\n\tfunction () {\n\t\tthis._attachments = null;\n\t};\n}\n\nexport { addSkeletonScalingExtensions };\n", "/*!\n * @file Descriptions (tables) of how to scale\n * different Mii body models and their bone names.\n * @author Arian Kordi <https://github.com/ariankordi>\n */\n\n// @ts-check\n\nimport * as THREE from 'three';\n\n/** @typedef {import('./SkeletonScalingExtensions.js').BoneWithScaling} BoneWithScaling */\n\n// // ---------------------------------------------------------------------\n// //  Descriptions for Body Model Scaling\n// // ---------------------------------------------------------------------\n\n/**\n * Describes the ways in which to apply the scale vector on\n * the model's bones. Each array represents names of bones.\n * @typedef {Object} ModelScaleDesc\n * @property {Array<string>|null} xyz - List of bones that should be scaled with the unmodified scale vector.\n * If null, then all bones will receive the unmodified scale vector, unless ones excluded in `none`.\n * @property {Array<string>} xyzYMin1 - List of bones that should be scaled with all three dimensions\n * of the scale vector, but with Y clamped to a minimum of 1.0. Used for the head bone (cosmetic neck).\n * @property {Array<string>|null} yxz - List of bones that should be scaled using the scale vector with Y and X swapped.\n * If null, then all bones will receive the the vector with Y and X swapped, unless ones excluded in `none`.\n * @property {Array<string>} scalar - List of bones that should be scaled uniformly using X for all dimensions.\n * @property {Array<string>|null} none - List of bones that should receive no additional scale.\n * Only applicable if `xyz` or `yxz` are non-null.\n * @property {string} root - The name of the root bone for which to adjust translation\n * (usually something along the lines of \"skl_root\").\n * @property {string} head - The name of the bone for which to attach the model's head.\n * NOTE: The head bone is not necessarily used for scaling, but is provided here for convenience.\n * @property {string} shadow - The name of a bone that is planted at the bottom of\n * the skeleton, and receives scalar scale. This is used for attaching the shadow model.\n */\n\n/**\n * Scaling description for the body model used in the editor.\n * Tested with Wii U (MiiBodyMiddle.bfres) and Switch (MiiBodyHigh.bfres) body models.\n * Also tested with the Wii (Mii Channel) body model, and the 3DS body should work too.\n * This model is mostly unused outside of system titles and certain first-party Wii channels (Wii Room).\n * Main reference: mii_VariableIconBodyImpl.o from NintendoSDK,\n * void nn::mii::detail::`anonymous namespace'::UpdateScale(class nn::util::Vector3f *,\n * enum nn::mii::detail::VriableIconBodyBoneKind, struct nn::util::Float3 const &)\n * @type {ModelScaleDesc}\n */\nconst editorBodyScaleDesc = {\n\troot: 'skl_root', // Adjust translation based on skl_root.\n\thead: 'head', // Head bone.\n\txyz: null, // Let all bones receive full XYZ scale by default.\n\txyzYMin1: ['head'], // Prevent neck from appearing too short.\n\t// The arms and elbows receive YXZ scale.\n\tyxz: ['arm_l1', 'arm_l2', 'arm_r1', 'arm_r2', 'elbow_l', 'elbow_r'],\n\t// Wrist, Shoulder, Ankle, Knee\n\tscalar: ['wrist_l', 'wrist_r', 'shoulder_l', 'shoulder_r',\n\t\t'ankle_l', 'ankle_r', 'knee_l', 'knee_r',\n\t\t'body'], // The shadow, which receives scalar scale, can be attached to body.\n\tshadow: 'body',\n\tnone: ['all_root'] // Do not scale all_root.\n\t// NOTE: Bone whitelist or blacklist? This is using blacklist, but perhaps\n\t// for models with more bones/roots, a whitelist will cause less problems.\n};\n// How is the shadow scaled in the editor?\n\n/**\n * Scaling description for the body model used in Miitomo, which\n * is similar to the model used in Tomodachi Life 3DS.\n * In contrast to the editor body, its bones use YXZ scale by default.\n * Reference: FUN_005357f0 in libcocos2dcpp.so 2.4.0 (inlined anim lerp/body scaling)\n * @type {ModelScaleDesc}\n */\nconst archBodyScaleDesc = {\n\troot: 'Skl_Root',\n\thead: 'Head', // Head bone. Note that there is also \"z_Head\".\n\txyz: [], // No bones are receiving XYZ scale.\n\txyzYMin1: [],\n\tyxz: null, // All bones receive YXZ scale by default.\n\t// Wrist, Ankle (no shoulders, knees)\n\tscalar: ['Ankle_R', 'Ankle_L', 'Wrist_R', 'Wrist_L'],\n\tshadow: 'Waist', // TODO: Need to find a good shadow anchor. How did this work originally?\n\t// Above are referenced in body scale func. (Other bones are not mentioned by strings)\n\t// At the beginning of body scale func, jointRoot and Head are skipped.\n\tnone: ['jointRoot', 'Head', 'nw4f_root'/** < For Super Mario Maker 2 bfres */]\n};\n\n/**\n * Detects and returns the appropriate {@link ModelScaleDesc} for the body model.\n * Currently just differentiates between editor's body model and Miitomo body model.\n * @param {THREE.Object3D} object - The model for which to detect the description.\n * @returns {ModelScaleDesc} The `ModelScaleDesc` that was detected.\n * @throws {Error} Throws if the `ModelScaleDesc` could not be detected.\n */\nfunction detectModelDesc(object) {\n\t/** @type {ModelScaleDesc|null} */\n\tlet desc = null;\n\n\t// Since the name/capitalization of skl_root differs,\n\t// this will be used to differentiate between editor and Miitomo body.\n\tobject.traverse((bone) => {\n\t\t// if (!(bone instanceof THREE.Bone)) {\n\t\t// \treturn;\n\t\t// }\n\t\t// ^^ may not work reliably? because some are nodes...?\n\t\tswitch (bone.name) {\n\t\t\tcase 'Skl_Root':\n\t\t\t\tdesc = archBodyScaleDesc;\n\t\t\t\tbreak;\n\t\t\tcase 'skl_root':\n\t\t\t\tdesc = editorBodyScaleDesc;\n\t\t\t\tbreak;\n\t\t}\n\t});\n\n\tif (!desc) {\n\t\tthrow new Error('detectModelDesc: Could not detect based on bone names.');\n\t}\n\n\treturn desc;\n}\n\n/**\n * Apply scaling to a model's bones based on a given scale description.\n * If there are multiple SkinnedMeshes, make sure the bones are shared\n * between them by checking the IDs. Otherwise, this needs to run for every SkinnedMesh.\n * @param {THREE.Object3D} object - The model to apply scaling to.\n * @param {THREE.Vector3Like} scaleVector - The base scale vector.\n * @param {ModelScaleDesc} desc - Scaling behavior descriptor for the model.\n */\nfunction applyScaleDesc(object, scaleVector, desc) {\n\t// Handle the input as an object with multiple SkinnedMeshes.\n\tobject.traverse((node) => {\n\t\tif (node instanceof THREE.SkinnedMesh) {\n\t\t\tconst skl = /** @type {THREE.SkinnedMesh} */ (node).skeleton;\n\t\t\tapplyScaleDescToBones(skl.bones, scaleVector, desc);\n\n\t\t\t// Eager skeleton update (to avoid deferred frame-lagged updates).\n\t\t\t// It will still update without this, but the update will be delayed.\n\t\t\tskl.update();\n\t\t}\n\t});\n\t// model.traverse(node =>\n\t// \tnode instanceof THREE.SkinnedMesh &&\n\t// \t\t// On all SkinnedMeshes, apply to each skeleton.\n\t// \t\tapplyScaleDescToBones(/** @type {THREE.SkinnedMesh} */(node)\n\t// \t\t\t.skeleton.bones, scaleVector, desc));\n}\n\n/**\n * Apply scaling to the array of bones based on a given scale description.\n * @param {Array<THREE.Bone>} bones - The array of bones to apply scaling to.\n * This comes from {@link THREE.SkinnedMesh.prototype.skeleton.bones}.\n * @param {THREE.Vector3Like} scaleVector - The base scale vector.\n * @param {ModelScaleDesc} desc - Scaling behavior descriptor for the model.\n * @throws {Error} Throws if addSkeletonScalingExtensions has not been called yet.\n */\nfunction applyScaleDescToBones(bones, scaleVector, desc) {\n\tif (!('attach' in THREE.Skeleton.prototype)) { // Notify the caller if this won't work.\n\t\tthrow new Error('applyScaleDesc: This function to apply \"scalling\" has no effect, until \"addSkeletonScalingExtensions\" is run to patch THREE.Skeleton.prototype to allow per-bone scaling. Try running that first.');\n\t}\n\n\tfor (const bone of /** @type {Array<BoneWithScaling>} */ (bones)) {\n\t\tconst name = bone.name;\n\n\t\t// Mark root to be used for translation adjustment.\n\t\tif (name === desc.root) {\n\t\t\tbone.scaleForRootAdjust = scaleVector; // Set scale vector to be used.\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Skip if explicitly listed in `none`.\n\t\tif (desc.none?.includes(bone.name)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t/** Final scale vector to be determined for the bone. */\n\t\tconst scale = new THREE.Vector3();\n\n\t\t// Test for XYZ, YXZ, Y-clamp, and scalar.\n\t\tif (desc.xyz?.includes(name)) {\n\t\t\t// console.debug('xyz:', name);\n\t\t\tscale.set(scaleVector.x, scaleVector.y, scaleVector.z);\n\t\t} else if (desc.yxz?.includes(name)) {\n\t\t\t// console.debug('yxz:', name);\n\t\t\tscale.set(scaleVector.y, scaleVector.x, scaleVector.z);\n\t\t} else if (desc.scalar.includes(name)) {\n\t\t\t// console.debug('scalar:', name);\n\t\t\tscale.setScalar(scaleVector.x);\n\t\t} else if (desc.xyzYMin1.includes(name)) {\n\t\t\tscale.set(scaleVector.x, Math.max(scaleVector.y, 1), scaleVector.z);\n\t\t} else {\n\t\t\t// Default: Either xyz, yxz, or no scale.\n\t\t\tif (desc.xyz === null) {\n\t\t\t\t// console.debug('xyz:', name);\n\t\t\t\tscale.set(scaleVector.x, scaleVector.y, scaleVector.z);\n\t\t\t} else if (desc.yxz === null) {\n\t\t\t\t// console.debug('yxz:', name);\n\t\t\t\tscale.set(scaleVector.y, scaleVector.x, scaleVector.z);\n\t\t\t}\n\t\t\t// Else, do not set scale.\n\t\t}\n\n\t\tbone.scalling = scale;\n\t}\n}\n\nexport {\n\teditorBodyScaleDesc,\n\tarchBodyScaleDesc,\n\tdetectModelDesc,\n\tapplyScaleDesc,\n\tapplyScaleDescToBones\n};\n", "/**\n * @file Contains functions to help attach a Mii body model\n * to its head, apply materials, and draw an icon. Taken from a jsfiddle\n * a jsfiddle I made to draw the Mii with body scaling and shaders.\n * This may later be broken into more concise snippets in FFL.js itself.\n * @author Arian Kordi <https://github.com/ariankordi>\n */\n// @ts-check\n\nimport * as THREE from 'three';\nimport { applyScaleDescToBones } from './ModelScaleDesc.js';\n\n// Imports for standalone JSDoc types.\n/**\n * @typedef {import('../materials/SampleShaderMaterial.js').SampleShaderMaterialColorInfo} SampleShaderMaterialColorInfo\n * @typedef {import('./SkeletonScalingExtensions.js').SkeletonWithAttachments} SkeletonWithAttachments\n * @typedef {import('./ModelScaleDesc.js').ModelScaleDesc} ModelScaleDesc\n * @typedef {import('../ffl.js').MaterialConstructor} MaterialConstructor\n */\n\n/**\n * A body model with its ModelScaleDesc and animations altogether.\n * @typedef {Object} BodyModel\n * @property {THREE.Object3D} model\n * @property {Array<THREE.AnimationClip>} animations - AnimationClips from the glTF.\n * @property {ModelScaleDesc} scaleDesc\n * @property {THREE.AnimationMixer} mixer\n */\n\n// // ---------------------------------------------------------------------\n// //  Model Loading Helpers\n// // ---------------------------------------------------------------------\n\n/**\n * Async wrapper to load a GLTF model from URL.\n * @param {string} url - The URL to load the glTF model from.\n * @returns {Promise<import('three/examples/jsm/loaders/GLTFLoader.js').GLTF>}\n * The GLTF object. `gltf.scene` contains the mesh group.\n */\n// const loadGLTF = async url =>\n// \tnew Promise((resolve, reject) => {\n// \t\tnew GLTFLoader().load(url, resolve, undefined, reject);\n// \t});\n\n// // ---------------------------------------------------------------------\n// //  Body Model Setup\n// // ---------------------------------------------------------------------\n\n/**\n * Searches the Object3D for a SkinnedMesh that contains the given bone.\n * @param {THREE.Object3D} root - Where to search for the SkinnedMesh.\n * @param {string} boneName - Name of the bone in the parent SkinnedMesh to find.\n * @returns {THREE.SkinnedMesh|null} The SkinnedMesh containing the bone, or null if it was not found.\n */\nfunction findSkinnedMeshWithBone(root, boneName) {\n\tlet found = /** @type {THREE.SkinnedMesh|null} */ (null);\n\troot.traverse((node) => {\n\t\tif (!found && node instanceof THREE.SkinnedMesh &&\n\t\t\tnode.skeleton.bones.some(bone => bone.name === boneName)) {\n\t\t\tfound = node;\n\t\t}\n\t});\n\treturn found;\n}\n\n/**\n * Finds body and pants meshes, and applies modulateMode/modulateType.\n * @param {THREE.Object3D} model - The body model meshes.\n */\nfunction applyModulateToBody(model) {\n\t/** @type {THREE.SkinnedMesh|null} */\n\tlet lastSkinnedMesh = null;\n\t// To find the pants, let's find the last SkinndMesh and assume that's it.\n\tmodel.traverse((node) => {\n\t\tif (node instanceof THREE.SkinnedMesh) {\n\t\t\tlastSkinnedMesh = node;\n\t\t}\n\t});\n\t// (TODO: This method will NOT WORK for body models extracted from Miitomo PODs.)\n\n\tlet meshIndex = 0;\n\tmodel.traverse((mesh) => {\n\t\t// The reason this is identifying SkinnedMesh instead of just Mesh\n\t\t// is to avoid detecting the head model. But, if the head is also\n\t\t// a SkinnedMesh and it's attached to the body, then it will catch here.\n\t\tif (!(mesh instanceof THREE.SkinnedMesh)) {\n\t\t\treturn;\n\t\t}\n\n\t\t/**\n\t\t * Assume that the mesh is pants if it is the last\n\t\t * skinned mesh, or even. Otherwise, a it's the body.\n\t\t */\n\t\tconst isPants = lastSkinnedMesh\n\t\t\t? mesh.id === lastSkinnedMesh.id\n\t\t\t// If there is no lastSkinnedMesh, then assume this\n\t\t\t// is the pants if it is the second mesh.\n\t\t\t: (meshIndex % 2 === 0);\n\n\t\tmesh.geometry.userData.modulateMode = 0; // Constant color/opaque.\n\t\tmesh.geometry.userData.modulateType = isPants\n\t\t\t? 10 // Pants\n\t\t\t: 9; // Body\n\n\t\tmeshIndex++;\n\t});\n}\n\n/**\n * Applies colors and the current material to the body/pants.\n * @param {BodyModel} body - The body model to prepare.\n * @param {MaterialConstructor} mat - The material to apply on the body model.\n * @param {THREE.Color} favoriteColor - The favorite color of the CharModel.\n * @param {THREE.Vector3Like} bodyScale - The vector to scale the body model with.\n * @param {THREE.Color} pantsColor - The pants color for the body.\n */\nfunction prepareBodyForCharModel(body, mat, favoriteColor, bodyScale, pantsColor) {\n\tapplyModulateToBody(body.model); // Add modulateMode/modulateType.\n\tapplyMaterialToGroup(body.model, mat, null); // TODO: info.colorInfo);\n\n\t// Set the colors on the body model.\n\tbody.model.traverse((mesh) => {\n\t\t// The reason this is identifying SkinnedMesh instead of just Mesh\n\t\t// is to avoid detecting the head model. But, if the head is also\n\t\t// a SkinnedMesh and it's attached to the body, then it will catch here.\n\t\tif (!(mesh instanceof THREE.SkinnedMesh) ||\n\t\t\t!('modulateType' in mesh.geometry.userData)) {\n\t\t\treturn;\n\t\t}\n\t\tif (mesh.geometry.userData.modulateType === 9) { // Body\n\t\t\tmesh.material.color = favoriteColor;\n\t\t} else if (mesh.geometry.userData.modulateType === 10) { // Pants\n\t\t\tmesh.material.color = pantsColor;\n\t\t}\n\t});\n\n\tconst skinned = body.model.getObjectByProperty('type', 'SkinnedMesh');\n\tif (skinned && skinned instanceof THREE.SkinnedMesh) {\n\t\tconst skl = skinned.skeleton;\n\t\tapplyScaleDescToBones(skl.bones, bodyScale, body.scaleDesc);\n\t\tskl.update(); // Eagerly update the skeleton to avoid a delay.\n\t}\n}\n\n/** The absolute world-scale of the head divided by the body's scale. */\nconst headToBodyScale = 10 / 7;\n\n/**\n * Attaches the head model to the body model's head bone.\n * Also calls {@link SkeletonWithAttachments.attach} so that the head\n * model's position follows the scaled head bone without getting scaled itself.\n * @param {BodyModel} body - The body model to attach the head ot.\n * @param {THREE.Group} head - The head (CharModel) to attach.\n * @throws {Error} Throws if the head bone or SkinnedMesh was not found.\n */\nfunction attachHeadToBody(body, head) {\n\t//  * @param {string} headBoneName - The name of the head bone from {@link typeof ModelScaleDesc.head}.\n\tconst headBoneName = body.scaleDesc.head;\n\tif (headBoneName === 'Head') {\n\t\tconsole.error('TODO: Head is not attached correctly to the Miitomo body. Skipping it so you can see what the model looks like anyway.');\n\t\treturn;\n\t}\n\n\tconst headBone = body.model.getObjectByName(headBoneName);\n\tif (!headBone || !(headBone instanceof THREE.Bone)) {\n\t\tthrow new Error('Head bone not found.');\n\t}\n\t// Locate the skeleton in the SkinnedMesh, needed to call attach().\n\tconst skinnedMesh = findSkinnedMeshWithBone(body.model, headBoneName);\n\tif (!skinnedMesh) {\n\t\tthrow new Error('No skinned mesh with head bone.');\n\t}\n\tconst skeleton = /** @type {SkeletonWithAttachments} */ (skinnedMesh.skeleton);\n\n\t// Set head to body scale ratio.\n\t// Multiply by 0.1, assuming the body's world scale was normalized to 1.0.\n\thead.scale.multiplyScalar(0.1 * headToBodyScale);\n\n\t// Add the model to the scene, and attach it to the SkeletonWithAttachments.\n\theadBone.add(head); // This will render it.\n\tskeleton.attach(head, headBoneName); // This positions it with the scaled bone.\n}\n\n// // ---------------------------------------------------------------------\n// //  Shader/Material Class Helpers\n// // ---------------------------------------------------------------------\n\n/**\n * Applies a new material class to the mesh and applying existing\n * parameters from the old material and userData to an FFL-compatible material.\n * Also see `onShaderMaterialChange` from FFL.js/examples/demo-basic.js.\n * @param {THREE.Mesh} mesh - The mesh to apply the material to.\n * @param {MaterialConstructor} newMatClass - The new material class to apply.\n * @param {SampleShaderMaterialColorInfo|null} colorInfo - Specific object needed for SampleShaderMaterial.\n */\nfunction applyMaterialClassToMesh(mesh, newMatClass, colorInfo) {\n\t/** Whether the new material supports FFL swizzling. */\n\tconst forFFLMaterial = 'modulateMode' in newMatClass.prototype;\n\t// Recreate material with same parameters but using the new shader class.\n\tconst oldMat = /** @type {THREE.MeshBasicMaterial} */ (mesh.material);\n\t/** Get modulateMode/Type */\n\tconst userData = mesh.geometry.userData;\n\n\t/** Do not include the parameters if forFFLMaterial is false. */\n\tconst modulateModeType = forFFLMaterial\n\t\t? { // modulateMode/Type will be used from the userData or old material.\n\t\t\tmodulateMode: 'modulateMode' in oldMat ? oldMat.modulateMode : userData.modulateMode ?? 0,\n\t\t\t// This setter will set side too:\n\t\t\tmodulateType: 'modulateType' in oldMat ? oldMat.modulateType : userData.modulateType ?? 0\n\t\t}\n\t\t: {};\n\n\t/**\n\t * Parameters for the shader material. Using SampleShaderMaterialParameters\n\t * as a lowest common denominator, but others can also be used.\n\t * @type {import('three').MeshBasicMaterialParameters\n\t * & import('../materials/SampleShaderMaterial.js').SampleShaderMaterialParameters}\n\t */\n\tconst params = {\n\t\t// _side = original side from LUTShaderMaterial, must be set first\n\t\tside: ('_side' in oldMat) ? /** @type {THREE.Side} */ (oldMat._side) : oldMat.side,\n\t\t...modulateModeType,\n\t\tcolor: oldMat.color, // should be after modulateType\n\t\ttransparent: Boolean(oldMat.transparent || oldMat.alphaTest)\n\t};\n\tif (oldMat.map) {\n\t\tparams.map = oldMat.map;\n\t}\n\n\tif ('modulateType' in userData) {\n\t\tparams.modulateMode = userData.modulateMode ?? 0;\n\t\tparams.modulateType = userData.modulateType;\n\t}\n\tif (colorInfo && 'colorInfo' in newMatClass.prototype) {\n\t\t// console.debug('got colorinfo on', mesh)\n\t\tparams.colorInfo = colorInfo;\n\t}\n\n\tmesh.material = new newMatClass(params);\n\toldMat.dispose(); // Dispose the old material, keeping the map.\n\n\t// HACK: For SampleShaderMaterial with glTF head models, let's not\n\t// set drawType uniform to faceline. TODO: Specifically only\n\t// needs to be done if it's not from FFL.js, and, if faceline\n\t// color is not transparent (will also result in beards having wrong color)\n\t/*\n\tif (mesh.material instanceof SampleShaderMaterial &&\n\t\tuserData.modulateType === 0) {\n\t\t// TODO: This will also break if you request: /miis/image.glb?shaderType=switch&data=\n\t\t// 0804400308040402020C0308060406020A0000020000000804100A01001E4004000214031304170D06020A040109\n\t\t// (Should we automatically include &shaderType=switch when SampleShaderMaterial is detected?)\n\t\tmesh.material.uniforms.drawType.value = 0;\n\t}\n\t*/\n}\n\n/**\n * Calls {@link applyMaterialClassToMesh} on a group of multiple\n * meshes (head or body model), using the name of the material.\n * @param {THREE.Object3D} group - The group to apply the material to.\n * @param {MaterialConstructor} newMatClass - The new material class to apply.\n * @param {SampleShaderMaterialColorInfo|null} colorInfo - Needed for SampleShaderMaterial.\n * @returns {void}\n */\nconst applyMaterialToGroup = (group, newMatClass, colorInfo) =>\n\tgroup.traverse(node =>\n\t\t(node instanceof THREE.Mesh) &&\n\t\tapplyMaterialClassToMesh(node, newMatClass, colorInfo)\n\t);\n\n/**\n * Disposes geometry, material and map, and skeleton.\n * @param {THREE.Object3D} model - The group of meshes or SkinnedMeshes to dispose.\n */\nfunction disposeModel(model) {\n\tmodel.traverse((node) => {\n\t\tif (node instanceof THREE.Mesh) {\n\t\t\tnode.geometry.dispose();\n\t\t\tif (node.material instanceof THREE.Material) {\n\t\t\t\tconst map = /** @type {THREE.MeshBasicMaterial} */ (node.material).map;\n\t\t\t\tif (map) {\n\t\t\t\t\tmap.dispose();\n\t\t\t\t}\n\t\t\t\tnode.material.dispose();\n\t\t\t}\n\t\t}\n\t\t// Additionally dispose skeleton if it is a SkinnedMesh.\n\t\tif (node instanceof THREE.SkinnedMesh && node.skeleton) {\n\t\t\tnode.skeleton.dispose();\n\t\t}\n\t});\n}\n\n// // ---------------------------------------------------------------------\n// //  Icon Camera Helpers\n// // ---------------------------------------------------------------------\n\n/**\n * Intended to match Wii U Mii Maker, and therefore also account/NNAS/cdn-mii 1.0.0 renders.\n * Parameters are from FUN_02086e94 in ffl_app.rpx, search for 57.553 / 0x42663646\n * @returns {THREE.PerspectiveCamera} Camera for the face only view.\n */\nfunction getFaceCamera() {\n\t// Create camera with 15 degrees FOV.\n\tconst camera = new THREE.PerspectiveCamera(15, 1 /* square */, 50, 1000);\n\t// Intended to be used with the head at 0.14 (<- exact) scale.\n\tcamera.position.set(0, 4.805, 57.553); // 4.205 + 0.6\n\treturn camera;\n}\n\n/**\n * Gets whole body camera that accounts for the height.\n * Performs Z-position interpolation like in FUN_02086e94 in ffl_app.rpx (Wii U Mii Maker).\n * @param {number} aspect - Aspect ratio for the camera.\n * @param {number} height - Height value of the CharModel to use in interpolation.\n * @returns {THREE.PerspectiveCamera} Camera for the whole body view.\n */\nfunction getWholeBodyCamera(aspect, height) {\n\t// Create camera with 15 degrees FOV.\n\tconst camera = new THREE.PerspectiveCamera(15, aspect);\n\n\t// These values are usually included in this order within a table.\n\tconst yOffset = 0;\n\tconst yFactor1 = 10.85;\n\tconst yFactor2 = 90;\n\t// const fovy = 15.0;\n\tconst coefficientZMin = 0.85;\n\tconst coefficientZMax = 1.32;\n\n\tconst rootHeight = 0;\n\t/** Camera Y position. */\n\tconst y = (yFactor1 - rootHeight) *\n\t\t(height / 64 * 0.15 + 0.85) + rootHeight;\n\n\t/** Height normalized to [-1, 1] range. */\n\tconst heightFactor = (height / 127 - 0.5) * 2;\n\t/** Camera Z position / zoom. */\n\tlet z = ((coefficientZMax + coefficientZMin) * 0.5 - 1) * heightFactor *\n\t\theightFactor + (coefficientZMax - coefficientZMin) * 0.5 * heightFactor + 1;\n\tz *= yFactor2;\n\n\tcamera.position.set(0, y + yOffset, z);\n\treturn camera;\n}\n\n/**\n * Moves the position of the camera up so that the head is in center.\n * @param {THREE.Camera} camera - The camera whose position to move.\n * @param {BodyModel} body - The body model.\n */\nfunction adjustCameraForBodyHead(camera, body) {\n\tbody.model.updateMatrixWorld(); // Propagate transforms.\n\t// Forced skeleton update to account for body scaling.\n\tbody.model.traverse(s => s instanceof THREE.SkinnedMesh && s.skeleton.update());\n\n\tconst head = /** @type {THREE.Bone} */ (body.model.getObjectByName(body.scaleDesc.head));\n\t// const root = /** @type {THREE.Bone} */ (body.model.getObjectByName(body.scaleDesc.root));\n\tconsole.assert(head);// && root);\n\t// Get the world translation of the body's root, and the head position.\n\tconst headPos = new THREE.Vector3().setFromMatrixPosition(head.matrixWorld);\n\tconst rootPos = new THREE.Vector3().setFromMatrixPosition(body.model.matrixWorld);\n\n\tcamera.position.y += headPos.y - rootPos.y; // Move the camera up.\n}\n\nexport {\n\tprepareBodyForCharModel,\n\tattachHeadToBody,\n\tapplyMaterialToGroup,\n\tdisposeModel,\n\tgetFaceCamera,\n\tgetWholeBodyCamera,\n\tadjustCameraForBodyHead\n};\n", "/*!\n * Bindings for FFL, a Mii renderer, in JavaScript.\n * Uses the FFL decompilation by aboood40091.\n * https://github.com/ariankordi/FFL.js\n * @author Arian Kordi <https://github.com/ariankordi>\n */\n// @ts-check\n\nimport * as THREE from 'three';\n\n/**\n * Generic type for both types of Three.js renderer.\n * @typedef {import('three/webgpu').Renderer|THREE.WebGLRenderer} Renderer\n */\n\n// // ---------------------------------------------------------------------\n// //  Emscripten Module Type\n// // ---------------------------------------------------------------------\n// TODO PATH: src/ModuleType.js\n\n/**\n * Emscripten \"Module\" type.\n * https://github.com/DefinitelyTyped/DefinitelyTyped/blob/c03bddd4d3c7774d00fa256a9e165d68c7534ccc/types/emscripten/index.d.ts#L26\n * This lists common Emscripten methods for interacting with memory,\n * as well as functions used in the FFL library itself.\n * @typedef {Object} Module\n * @property {function(): void} onRuntimeInitialized\n * @property {function(object): void} destroy\n * @property {boolean|null} calledRun\n * // USE_TYPED_ARRAYS == 2\n * @property {Uint8Array} HEAPU8\n * @property {Uint32Array} HEAPU32\n * @property {Float32Array} HEAPF32\n * @property {Int8Array} HEAP8 - Used for some vertex attributes.\n * @property {Uint16Array} HEAPU16 - Used for index buffer.\n * Runtime methods:\n * @property {function(number): number} _malloc\n * @property {function(number): void} _free\n * @property {function((...args: *[]) => *, string=): number} addFunction\n * @property {function(number): void} removeFunction\n * @property {undefined|function(): void} _exit - Only included with a certain Emscripten linker flag.\n *\n * ------------------------------- FFL Bindings -------------------------------\n * Utilized functions:\n * @property {function(number, number, number, number): *} _FFLInitCharModelCPUStepWithCallback\n * @property {function(number): *} _FFLDeleteCharModel\n * @property {function(number, number, number, number): *} _FFLiGetRandomCharInfo\n * @property {function(number, number): *} _FFLpGetCharInfoFromStoreData\n * @property {function(number, number): *} _FFLpGetCharInfoFromMiiDataOfficialRFL\n * @property {function(number, number): *} _FFLInitRes\n * @property {function(): *} _FFLInitResGPUStep\n * @property {function(): *} _FFLExit\n * @property {function(number, number): *} _FFLGetFavoriteColor\n * @property {function(number, number): *} _FFLGetFacelineColor\n * @property {function(boolean): *} _FFLSetTextureFlipY\n * @property {function(boolean): *} _FFLSetNormalIsSnorm8_8_8_8\n * @property {function(boolean): *} _FFLSetFrontCullForFlipX\n * @property {function(number): *} _FFLSetTextureCallback\n * @property {function(number): *} _FFLiDeleteTextureTempObject\n * @property {function(number, number, number): *} _FFLiDeleteTempObjectMaskTextures\n * @property {function(number, number, number): *} _FFLiDeleteTempObjectFacelineTexture\n * @property {function(number): *} _FFLiInvalidateTempObjectFacelineTexture\n * @property {function(number): *} _FFLiInvalidateRawMask\n * @property {function(number, boolean): *} _FFLiVerifyCharInfoWithReason\n * These functions are NOT called directly:\n * @property {function(number): *} _FFLiiGetEyeRotateOffset\n * @property {function(number): *} _FFLiiGetEyebrowRotateOffset\n * @property {function(number): *} _FFLSetLinearGammaMode\n * @property {function(number, number): *} _FFLpGetStoreDataFromCharInfo\n * @property {function(number, number, number, number, boolean): *} _FFLGetAdditionalInfo -\n * The output is encoded in a bitfield that has to be decoded, so it's not used now,\n * but to get \"additional info\" would be nice in general.\n * @package\n */\n\n// // ---------------------------------------------------------------------\n// //  Enum Definitions\n// // ---------------------------------------------------------------------\n// TODO PATH: src/Enums.js\n\n/**\n * Result type for Face Library functions (not the real FFL enum).\n * Reference: https://github.com/aboood40091/ffl/blob/master/include/nn/ffl/FFLResult.h\n * @enum {number}\n * @package\n */\nconst FFLResult = {\n\tOK: 0,\n\tERROR: 1,\n\tHDB_EMPTY: 2,\n\tFILE_INVALID: 3,\n\tMANAGER_NOT_CONSTRUCT: 4,\n\tFILE_LOAD_ERROR: 5,\n\t// : 6,\n\tFILE_SAVE_ERROR: 7,\n\t// : 8,\n\tRES_FS_ERROR: 9,\n\tODB_EMPTY: 10,\n\t// :  11,\n\tOUT_OF_MEMORY: 12,\n\t// :  13,\n\t// :  14,\n\t// :  15,\n\t// :  16,\n\tUNKNOWN_17: 17,\n\tFS_ERROR: 18,\n\tFS_NOT_FOUND: 19,\n\tMAX: 20\n};\n\n/**\n * Indicates how the shape should be colored by the fragment shader.\n * @enum {number}\n * @public\n */\nconst FFLModulateMode = {\n\t/** No Texture, Has Color (R) */\n\tCONSTANT: 0,\n\t/** Has Texture, No Color */\n\tTEXTURE_DIRECT: 1,\n\t/** Has Texture, Has Color (R + G + B) */\n\tRGB_LAYERED: 2,\n\t/** Has Texture, Has Color (R) */\n\tALPHA: 3,\n\t/** Has Texture, Has Color (R) */\n\tLUMINANCE_ALPHA: 4,\n\t/** Has Texture, Has Color (R) */\n\tALPHA_OPA: 5\n};\n\n/**\n * This is the type of shape to be rendered.\n * It's separated into: opaque, translucent,\n * and past SHAPE_MAX is for faceline/mask.\n * @enum {number}\n * @public\n */\nconst FFLModulateType = {\n\tSHAPE_FACELINE: 0,\n\tSHAPE_BEARD: 1,\n\tSHAPE_NOSE: 2,\n\tSHAPE_FOREHEAD: 3,\n\tSHAPE_HAIR: 4,\n\tSHAPE_CAP: 5,\n\tSHAPE_MASK: 6,\n\tSHAPE_NOSELINE: 7,\n\tSHAPE_GLASS: 8,\n\tMUSTACHE: 9,\n\tMOUTH: 10,\n\tEYEBROW: 11,\n\tEYE: 12,\n\tMOLE: 13,\n\tFACE_MAKE: 14,\n\tFACE_LINE: 15,\n\tFACE_BEARD: 16,\n\tFILL: 17,\n\tSHAPE_MAX: 9\n};\n\n/**\n * IDs corresponding to expressions.\n * Reference: https://github.com/ariankordi/ffl/blob/nsmbu-win-port-linux64/include/nn/ffl/FFLExpression.h\n * @enum {number}\n * @public\n */\nconst FFLExpression = {\n\tNORMAL: 0,\n\tSMILE: 1,\n\tANGER: 2,\n\t/** Primary name for expression 3. */\n\tSORROW: 3,\n\tPUZZLED: 3,\n\t/** Primary name for expression 4. */\n\tSURPRISE: 4,\n\tSURPRISED: 4,\n\tBLINK: 5,\n\tOPEN_MOUTH: 6,\n\t/** Primary name for expression 7. */\n\tSMILE_OPEN_MOUTH: 7,\n\tHAPPY: 7,\n\tANGER_OPEN_MOUTH: 8,\n\tSORROW_OPEN_MOUTH: 9,\n\tSURPRISE_OPEN_MOUTH: 10,\n\tBLINK_OPEN_MOUTH: 11,\n\tWINK_LEFT: 12,\n\tWINK_RIGHT: 13,\n\tWINK_LEFT_OPEN_MOUTH: 14,\n\tWINK_RIGHT_OPEN_MOUTH: 15,\n\t/** Primary name for expression 16. */\n\tLIKE_WINK_LEFT: 16,\n\tLIKE: 16,\n\tLIKE_WINK_RIGHT: 17,\n\tFRUSTRATED: 18,\n\n\t// Additional expressions from AFL.\n\t// Enum names are completely made up.\n\tBORED: 19,\n\tBORED_OPEN_MOUTH: 20,\n\tSIGH_MOUTH_STRAIGHT: 21,\n\tSIGH: 22,\n\tDISGUSTED_MOUTH_STRAIGHT: 23,\n\tDISGUSTED: 24,\n\tLOVE: 25,\n\tLOVE_OPEN_MOUTH: 26,\n\tDETERMINED_MOUTH_STRAIGHT: 27,\n\tDETERMINED: 28,\n\tCRY_MOUTH_STRAIGHT: 29,\n\tCRY: 30,\n\tBIG_SMILE_MOUTH_STRAIGHT: 31,\n\tBIG_SMILE: 32,\n\tCHEEKY: 33,\n\tCHEEKY_DUPLICATE: 34,\n\tJOJO_EYES_FUNNY_MOUTH: 35,\n\tJOJO_EYES_FUNNY_MOUTH_OPEN: 36,\n\tSMUG: 37,\n\tSMUG_OPEN_MOUTH: 38,\n\tRESOLVE: 39,\n\tRESOLVE_OPEN_MOUTH: 40,\n\tUNBELIEVABLE: 41,\n\tUNBELIEVABLE_DUPLICATE: 42,\n\tCUNNING: 43,\n\tCUNNING_DUPLICATE: 44,\n\tRASPBERRY: 45,\n\tRASPBERRY_DUPLICATE: 46,\n\tINNOCENT: 47,\n\tINNOCENT_DUPLICATE: 48,\n\tCAT: 49,\n\tCAT_DUPLICATE: 50,\n\tDOG: 51,\n\tDOG_DUPLICATE: 52,\n\tTASTY: 53,\n\tTASTY_DUPLICATE: 54,\n\tMONEY_MOUTH_STRAIGHT: 55,\n\tMONEY: 56,\n\tSPIRAL_MOUTH_STRAIGHT: 57,\n\tCONFUSED: 58,\n\tCHEERFUL_MOUTH_STRAIGHT: 59,\n\tCHEERFUL: 60,\n\tBLANK_61: 61,\n\tBLANK_62: 62,\n\tGRUMBLE_MOUTH_STRAIGHT: 63,\n\tGRUMBLE: 64,\n\tMOVED_MOUTH_STRAIGHT: 65,\n\tMOVED: 66,\n\tSINGING_MOUTH_SMALL: 67,\n\tSINGING: 68,\n\tSTUNNED: 69,\n\n\tMAX: 70\n};\n\n/**\n * Flags that modify how the head model is created.\n * These go in {@link FFLCharModelDesc.modelFlag}.\n * @enum {number}\n * @public\n */\nconst FFLModelFlag = {\n\t/** Default model setting. */\n\tNORMAL: 1, // 1 << 0\n\t/** Uses a variant of hair designed for hats. */\n\tHAT: 1 << 1,\n\t/** Discards hair from the model, used for helmets and similar headwear. */\n\tFACE_ONLY: 1 << 2,\n\t/** Limits Z depth on the nose, useful for helmets and similar headwear. */\n\tFLATTEN_NOSE: 1 << 3,\n\t/** Enables the model's expression flag to use expressions beyond 32. */\n\tNEW_EXPRESSIONS: 1 << 4,\n\t/**\n\t * This flag only generates new textures when initializing a CharModel\n\t * but does not initialize shapes.\n\t * **Note:** This means you cannot use DrawOpa/Xlu when this is set.\n\t */\n\tNEW_MASK_ONLY: 1 << 5\n};\n\n// The enums below are only for FFLiGetRandomCharInfo.\n// Hence, why each one has a value called ALL.\n\n/** @enum {number} */\nconst FFLGender = {\n\tMALE: 0,\n\tFEMALE: 1,\n\tALL: 2\n};\n\n/** @enum {number} */\nconst FFLAge = {\n\tCHILD: 0,\n\tADULT: 1,\n\tELDER: 2,\n\tALL: 3\n};\n\n/** @enum {number} */\nconst FFLRace = {\n\tBLACK: 0,\n\tWHITE: 1,\n\tASIAN: 2,\n\tALL: 3\n};\n\n// // ---------------------------------------------------------------------\n// // CharInfo Unpacking, Verification, Random\n// // ---------------------------------------------------------------------\n// TODO PATH: src/CharInfo.js\n\nconst FFLiCharInfo_size = 288;\n/* eslint-disable jsdoc/require-returns-type -- Allow TS to predict return type. */\n/**\n * @param {Uint8Array} u8 - module.HEAPU8\n * @param {number} ptr - Pointer to the type.\n * @returns Object form of FFLiCharInfo.\n * @package\n */\nfunction _unpackFFLiCharInfo(u8, ptr) {\n\t/* eslint-enable jsdoc/require-returns-type -- defined above */\n\tconst view = new DataView(u8.buffer, ptr);\n\tconst name = new TextDecoder('utf-16le').decode(new Uint16Array(u8.buffer, ptr + 180, 11));\n\tconst creator = new TextDecoder('utf-16le').decode(new Uint16Array(u8.buffer, ptr + 202, 11));\n\tconst createID = new Uint8Array(u8.buffer, 264, 10);\n\tconst authorID = new Uint8Array(u8.buffer, 280, 8);\n\treturn {\n\t\tmiiVersion: view.getInt32(0, true),\n\t\tfaceType: view.getInt32(4, true),\n\t\tfaceColor: view.getInt32(8, true),\n\t\tfaceTex: view.getInt32(12, true),\n\t\tfaceMake: view.getInt32(16, true),\n\t\thairType: view.getInt32(20, true),\n\t\thairColor: view.getInt32(24, true),\n\t\thairFlip: view.getInt32(28, true),\n\t\teyeType: view.getInt32(32, true),\n\t\teyeColor: view.getInt32(36, true),\n\t\teyeScale: view.getInt32(40, true),\n\t\teyeAspect: view.getInt32(44, true),\n\t\teyeRotate: view.getInt32(48, true),\n\t\teyeX: view.getInt32(52, true),\n\t\teyeY: view.getInt32(56, true),\n\t\teyebrowType: view.getInt32(60, true),\n\t\teyebrowColor: view.getInt32(64, true),\n\t\teyebrowScale: view.getInt32(68, true),\n\t\teyebrowAspect: view.getInt32(72, true),\n\t\teyebrowRotate: view.getInt32(76, true),\n\t\teyebrowX: view.getInt32(80, true),\n\t\teyebrowY: view.getInt32(84, true),\n\t\tnoseType: view.getInt32(88, true),\n\t\tnoseScale: view.getInt32(92, true),\n\t\tnoseY: view.getInt32(96, true),\n\t\tmouthType: view.getInt32(100, true),\n\t\tmouthColor: view.getInt32(104, true),\n\t\tmouthScale: view.getInt32(108, true),\n\t\tmouthAspect: view.getInt32(112, true),\n\t\tmouthY: view.getInt32(116, true),\n\t\tbeardMustache: view.getInt32(120, true),\n\t\tbeardType: view.getInt32(124, true),\n\t\tbeardColor: view.getInt32(128, true),\n\t\tbeardScale: view.getInt32(132, true),\n\t\tbeardY: view.getInt32(136, true),\n\t\tglassType: view.getInt32(140, true),\n\t\tglassColor: view.getInt32(144, true),\n\t\tglassScale: view.getInt32(148, true),\n\t\tglassY: view.getInt32(152, true),\n\t\tmoleType: view.getInt32(156, true),\n\t\tmoleScale: view.getInt32(160, true),\n\t\tmoleX: view.getInt32(164, true),\n\t\tmoleY: view.getInt32(168, true),\n\t\theight: view.getInt32(172, true),\n\t\tbuild: view.getInt32(176, true),\n\t\tname,\n\t\tcreator,\n\t\tgender: view.getInt32(224, true),\n\t\tbirthMonth: view.getInt32(228, true),\n\t\tbirthDay: view.getInt32(232, true),\n\t\tfavoriteColor: view.getInt32(236, true),\n\t\tfavorite: view.getUint8(240),\n\t\tcopyable: view.getUint8(241),\n\t\tngWord: view.getUint8(242),\n\t\tlocalonly: view.getUint8(243),\n\t\tregionMove: view.getInt32(244, true),\n\t\tfontRegion: view.getInt32(248, true),\n\t\troomIndex: view.getInt32(252, true),\n\t\tpositionInRoom: view.getInt32(256, true),\n\t\tbirthPlatform: view.getInt32(260, true),\n\t\tcreateID,\n\t\tpadding_0: view.getUint16(274, true),\n\t\tauthorType: view.getInt32(276, true),\n\t\tauthorID\n\t};\n}\n\n/** @typedef {ReturnType<_unpackFFLiCharInfo>} FFLiCharInfo */\n\n/**\n * Size of FFLStoreData, the 3DS/Wii U Mii data format. (Not included)\n * @public\n */\n/** sizeof(FFLStoreData) */\nconst FFLStoreData_size = 96;\n\n/**\n * Validates the input CharInfo by calling FFLiVerifyCharInfoWithReason.\n * @param {Uint8Array|number} data - FFLiCharInfo structure as bytes or pointer.\n * @param {FFL} ffl - FFL module/resource state.\n * @param {boolean} verifyName - Whether the name and creator name should be verified.\n * @returns {void} Returns nothing if verification passes.\n * @throws {FFLiVerifyReasonException} Throws if the result is not 0 (FFLI_VERIFY_REASON_OK).\n * @public\n */\nfunction verifyCharInfo(data, ffl, verifyName = false) {\n\tconst mod = ffl.module;\n\t// Resolve charInfoPtr as pointer to CharInfo.\n\tlet charInfoPtr = 0;\n\tlet charInfoAllocated = false;\n\t// Assume that number means pointer.\n\tif (typeof data === 'number') {\n\t\tcharInfoPtr = data;\n\t\tcharInfoAllocated = false;\n\t} else {\n\t\t// Assume everything else means Uint8Array. TODO: untested\n\t\tcharInfoAllocated = true;\n\t\t// Allocate and copy CharInfo.\n\t\tcharInfoPtr = mod._malloc(FFLiCharInfo_size);\n\t\tmod.HEAPU8.set(data, charInfoPtr);\n\t}\n\tconst result = mod._FFLiVerifyCharInfoWithReason(charInfoPtr, verifyName);\n\t// Free CharInfo as soon as the function returns.\n\tif (charInfoAllocated) {\n\t\tmod._free(charInfoPtr);\n\t}\n\n\tif (result !== 0) {\n\t\t// Reference: https://github.com/aboood40091/ffl/blob/master/include/nn/ffl/detail/FFLiCharInfo.h#L90\n\t\tthrow new FFLiVerifyReasonException(result);\n\t}\n}\n\n/**\n * Generates a random FFLiCharInfo instance calling FFLiGetRandomCharInfo.\n * @param {FFL} ffl - FFL module/resource state.\n * @param {FFLGender} gender - Gender of the character.\n * @param {FFLAge} age - Age of the character.\n * @param {FFLRace} race - Race of the character.\n * @returns {Uint8Array} The random FFLiCharInfo.\n */\nfunction getRandomCharInfo(ffl, gender = FFLGender.ALL, age = FFLAge.ALL, race = FFLRace.ALL) {\n\tconst mod = ffl.module;\n\tconst ptr = mod._malloc(FFLiCharInfo_size);\n\tmod._FFLiGetRandomCharInfo(ptr, gender, age, race);\n\tconst result = mod.HEAPU8.slice(ptr, ptr + FFLiCharInfo_size);\n\tmod._free(ptr);\n\treturn result;\n}\n\n// ---------------------- Common Color Mask Definitions ----------------------\n\n/** @package */\nconst commonColorEnableMask = (1 << 31);\n\n/**\n * Applies (unofficial) mask: FFLI_NN_MII_COMMON_COLOR_ENABLE_MASK\n * to a common color index to indicate to FFL which color table it should use.\n * @param {number} color - The color index to flag.\n * @returns {number} The flagged color index to use in FFLiCharinfo.\n */\nconst commonColorMask = color => color | commonColorEnableMask;\n\n/**\n * Removes (unofficial) mask: FFLI_NN_MII_COMMON_COLOR_ENABLE_MASK\n * to a common color index to reveal the original common color index.\n * @param {number} color - The flagged color index.\n * @returns {number} The original color index before flagging.\n */\n// const commonColorUnmask = color => (color & ~commonColorEnableMask) === 0\n// Only unmask color if the mask is enabled.\n// \t? color\n// \t: color & ~commonColorEnableMask;\n\n// EXPORTS: _unpackFFLiCharInfo, verifyCharInfo, getRandomCharInfo, commonColorMask\n\n// // ---------------------------------------------------------------------\n// //  Texture Management\n// // ---------------------------------------------------------------------\n// TODO PATH: src/TextureManager.js\n/**\n * Manages THREE.Texture objects created via FFL.\n * Must be instantiated after FFL is fully initialized.\n * @package\n */\nclass TextureManager {\n\t/**\n\t * Global that controls if texture creation should be changed\n\t * to account for WebGL 1.0. (Shapes should be fine)\n\t * @public\n\t */\n\tstatic isWebGL1 = false;\n\n\t/**\n\t * Constructs the TextureManager. This MUST be created after initializing FFL.\n\t * @param {Module} module - The Emscripten module.\n\t * @param {boolean} [setToFFLGlobal] - Whether or not to call FFLSetTextureCallback on the constructed callback.\n\t */\n\tconstructor(module, setToFFLGlobal = false) {\n\t\t/**\n\t\t * @type {Module}\n\t\t * @private\n\t\t */\n\t\tthis._module = module;\n\t\t/**\n\t\t * Internal map of texture ID to THREE.Texture.\n\t\t * @type {Map<number, THREE.Texture>}\n\t\t * @private\n\t\t */\n\t\tthis._textures = new Map();\n\t\t/** @public */\n\t\tthis.callbackPtr = 0;\n\n\t\t// Create and set texture callback instance.\n\t\tthis._setTextureCallback();\n\t\tif (setToFFLGlobal) {\n\t\t\t// Set texture callback globally within FFL if chosen.\n\t\t\tmodule._FFLSetTextureCallback(this.callbackPtr);\n\t\t}\n\t}\n\n\t/** @typedef {ReturnType<TextureManager._unpackFFLTextureInfo>} FFLTextureInfo */\n\n\t/* eslint-disable jsdoc/require-returns-type -- Allow TS to predict return type. */\n\t/**\n\t * @param {Uint8Array} u8 - module.HEAPU8\n\t * @param {number} ptr - Pointer to the type.\n\t * @returns Object form of FFLTextureInfo.\n\t * @private\n\t */\n\tstatic _unpackFFLTextureInfo(u8, ptr) {\n\t\t/* eslint-enable jsdoc/require-returns-type -- defined above */\n\t\tconst view = new DataView(u8.buffer, ptr);\n\t\treturn {\n\t\t\twidth: view.getUint16(0, true),\n\t\t\theight: view.getUint16(2, true),\n\t\t\tmipCount: view.getUint8(4),\n\t\t\tformat: view.getUint8(5),\n\t\t\t// isGX2Tiled, _padding\n\t\t\timageSize: view.getUint32(8, true),\n\t\t\timagePtr: view.getUint32(12, true),\n\t\t\tmipSize: view.getUint32(16, true),\n\t\t\tmipPtr: view.getUint32(20, true),\n\t\t\tmipLevelOffset: new Uint32Array(u8.buffer, ptr + 24, 13)\n\t\t};\n\t}\n\n\t/**\n\t * Allocates and packs an FFLTextureCallback instance from callback function pointers.\n\t * @param {Module} module - The Emscripten module.\n\t * @param {number} createCallback - Function pointer for the create callback.\n\t * @param {number} deleteCallback - Function pointer for the delete callback.\n\t * @returns {number} Pointer to the FFLTextureCallback.\n\t * Note that you MUST free this after using it (done in {@link TextureManager.disposeCallback}).\n\t * @private\n\t */\n\tstatic _allocateTextureCallback(module, createCallback, deleteCallback) {\n\t\t// this would usually be in a func called something like _packFFLTextureCallback\n\t\tconst FFLTextureCallback_size = 16;\n\t\tconst u8 = new Uint8Array(FFLTextureCallback_size);\n\t\tconst view = new DataView(u8.buffer);\n\t\tview.setUint32(8, createCallback, true); // pCreateFunc\n\t\tview.setUint32(12, deleteCallback, true); // pDeleteFunc\n\t\tconst ptr = module._malloc(FFLTextureCallback_size);\n\t\tmodule.HEAPU8.set(u8, ptr);\n\t\treturn ptr;\n\t}\n\n\t/**\n\t * Creates the create/delete functions in Emscripten and allocates and sets\n\t * the FFLTextureCallback object as {@link TextureManager.callbackPtr}.\n\t */\n\t_setTextureCallback() {\n\t\tconst mod = this._module;\n\t\t// Bind the callbacks to this instance.\n\t\t/** @private */\n\t\tthis._createCallback = mod.addFunction(this._textureCreateFunc.bind(this), 'vppp');\n\n\t\tthis.callbackPtr = TextureManager._allocateTextureCallback(mod,\n\t\t\tthis._createCallback, this._deleteCallback || 0);\n\t}\n\n\t/**\n\t * @param {number} format - Enum value for FFLTextureFormat.\n\t * @returns {THREE.PixelFormat} Three.js texture format constant.\n\t * Note that this function won't work on WebGL1Renderer in Three.js r137-r162\n\t * since R and RG textures need to use Luminance(Alpha)Format\n\t * (you'd somehow need to detect which renderer is used)\n\t * @private\n\t */\n\tstatic _getTextureFormat(format) {\n\t\t// Map FFLTextureFormat to Three.js texture formats.\n\n\t\t// THREE.RGFormat did not work for me on Three.js r136/older.\n\t\tconst useOldFormats = Number(THREE.REVISION) <= 136 || TextureManager.isWebGL1;\n\t\tconst r8 = useOldFormats\n\t\t\t? /** @type {THREE.PixelFormat} */ (1024) // THREE.LuminanceFormat\n\t\t\t: THREE.RedFormat;\n\t\tconst r8g8 = useOldFormats\n\t\t// NOTE: Using THREE.LuminanceAlphaFormat before it\n\t\t// was removed on WebGL 1.0/2.0 causes the texture\n\t\t// to be converted to RGBA resulting in two issues.\n\t\t// 1. There is a black outline around glasses\n\t\t// 2. For glasses that have an inner color, the color is wrongly applied to the frames as well.\n\t\t\t? /** @type {THREE.PixelFormat} */ (1025) // THREE.LuminanceAlphaFormat\n\t\t\t: THREE.RGFormat;\n\n\t\tconst textureFormatToThreeFormat = [\n\t\t\tr8, // R8_UNORM = 0\n\t\t\tr8g8, // R8_G8_UNORM = 1\n\t\t\tTHREE.RGBAFormat // R8_G8_B8_A8_UNORM = 2\n\t\t];\n\n\t\t// Determine the data format from the table.\n\t\tconst dataFormat = textureFormatToThreeFormat[format];\n\t\tconsole.assert(dataFormat !== undefined, `_textureCreateFunc: Unexpected FFLTextureFormat value: ${format}`);\n\t\treturn dataFormat;\n\t}\n\n\t/**\n\t * @param {number} _ - Originally pObj, unused here.\n\t * @param {number} textureInfoPtr - Pointer to {@link FFLTextureInfo}.\n\t * @param {number} texturePtrPtr - Pointer to the texture handle (pTexture2D).\n\t * @private\n\t */\n\t_textureCreateFunc(_, textureInfoPtr, texturePtrPtr) {\n\t\tconst textureInfo = TextureManager._unpackFFLTextureInfo(\n\t\t\tthis._module.HEAPU8, textureInfoPtr);\n\t\t// console.debug(`_textureCreateFunc: width=${textureInfo.width}, ` +\n\t\t// `height=${textureInfo.height}, format=${textureInfo.format}, ` +\n\t\t// `imageSize=${textureInfo.imageSize}, mipCount=${textureInfo.mipCount}`);\n\n\t\t/** Resolve THREE.PixelFormat. */\n\t\tconst format = TextureManager._getTextureFormat(textureInfo.format);\n\t\t// Copy image data from HEAPU8 via slice. This is base level/mip level 0.\n\t\tconst imageData = this._module.HEAPU8.slice(textureInfo.imagePtr,\n\t\t\ttextureInfo.imagePtr + textureInfo.imageSize);\n\n\t\t/**\n\t\t * Determine whether mipmaps can be used at all.\n\t\t * Implemented in Three.js r137 and only works properly on r138.\n\t\t *\n\t\t * This is also disabled for WebGL 1.0, since there are some NPOT textures.\n\t\t * Those aren't supposed to have mipmaps e.g., glass, but I found that\n\t\t * while in OpenGL ES 2, some textures that didn't wrap could have mips with\n\t\t * NPOT, this didn't work in WebGL 1.0.\n\t\t */\n\t\tconst canUseMipmaps = Number(THREE.REVISION) >= 138 && !TextureManager.isWebGL1;\n\t\t// Actually use mipmaps if the mip count is over 1.\n\t\tconst useMipmaps = textureInfo.mipCount > 1 && canUseMipmaps;\n\n\t\t// Create new THREE.Texture with the specified format.\n\t\tconst texture = new THREE.DataTexture(useMipmaps ? null : imageData,\n\t\t\ttextureInfo.width, textureInfo.height, format, THREE.UnsignedByteType);\n\n\t\ttexture.magFilter = THREE.LinearFilter;\n\t\t// texture.generateMipmaps = true; // not necessary at higher resolutions\n\t\ttexture.minFilter = THREE.LinearFilter;\n\n\t\tif (useMipmaps) {\n\t\t\t// Add base texture.\n\t\t\ttexture.mipmaps = [{\n\t\t\t\tdata: imageData,\n\t\t\t\twidth: textureInfo.width,\n\t\t\t\theight: textureInfo.height\n\t\t\t}];\n\t\t\t// Enable filtering option for mipmap and add levels.\n\t\t\ttexture.minFilter = THREE.LinearMipmapLinearFilter;\n\t\t\ttexture.generateMipmaps = false;\n\t\t\tthis._addMipmaps(texture, textureInfo);\n\t\t}\n\n\t\ttexture.needsUpdate = true;\n\t\tthis.set(texture.id, texture);\n\t\tthis._module.HEAPU32[texturePtrPtr / 4] = texture.id;\n\t}\n\n\t/**\n\t * @param {THREE.Texture} texture - Texture to upload mipmaps into.\n\t * @param {FFLTextureInfo} textureInfo - FFLTextureInfo object representing this texture.\n\t * @private\n\t */\n\t_addMipmaps(texture, textureInfo) {\n\t\t// Make sure mipPtr is not null.\n\t\tconsole.assert(textureInfo.mipPtr, '_addMipmaps: mipPtr is null, so the caller incorrectly assumed this texture has mipmaps');\n\n\t\t// Iterate through mip levels starting from 1 (base level is mip level 0).\n\t\tfor (let mipLevel = 1; mipLevel < textureInfo.mipCount; mipLevel++) {\n\t\t\t// Calculate the offset for the current mip level.\n\t\t\tconst mipOffset = textureInfo.mipLevelOffset[mipLevel - 1];\n\n\t\t\t// Calculate dimensions of the current mip level.\n\t\t\tconst mipWidth = Math.max(1, textureInfo.width >> mipLevel);\n\t\t\tconst mipHeight = Math.max(1, textureInfo.height >> mipLevel);\n\n\t\t\t// Get the offset of the next mipmap and calculate end offset.\n\t\t\tconst nextMipOffset = textureInfo.mipLevelOffset[mipLevel] || textureInfo.mipSize;\n\t\t\tconst end = textureInfo.mipPtr + nextMipOffset;\n\n\t\t\t// Copy the data from the heap.\n\t\t\tconst start = textureInfo.mipPtr + mipOffset;\n\t\t\tconst mipData = this._module.HEAPU8.slice(start, end);\n\n\t\t\t// console.debug(`  - Mip ${mipLevel}: ${mipWidth}x${mipHeight}, `\n\t\t\t// + `offset=${mipOffset}, range=${start}-${end}`);\n\t\t\t// console.debug(uint8ArrayToBase64(mipData)); // will leak the data\n\n\t\t\t// Push this mip level data into the texture's mipmaps array.\n\t\t\t// @ts-ignore - data = \"CompressedTextureMipmap & CubeTexture & HTMLCanvasElement\"\n\t\t\ttexture.mipmaps.push({\n\t\t\t\tdata: mipData, // Should still accept Uint8Array.\n\t\t\t\twidth: mipWidth,\n\t\t\t\theight: mipHeight\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * @param {number} id - ID assigned to the texture.\n\t * @returns {THREE.Texture|null|undefined} Returns the texture if it is found.\n\t * @public\n\t */\n\tget(id) {\n\t\treturn this._textures.get(id);\n\t}\n\n\t/**\n\t * @param {number} id - ID assigned to the texture.\n\t * @param {THREE.Texture} texture - Texture to add.\n\t * @public\n\t */\n\tset(id, texture) {\n\t\t// Set texture with an override for dispose.\n\t\tconst disposeReal = texture.dispose.bind(texture);\n\t\ttexture.dispose = () => {\n\t\t\t// Remove this texture from the map after disposing.\n\t\t\tdisposeReal();\n\t\t\tthis.delete(id); // this = TextureManager\n\t\t};\n\n\t\tthis._textures.set(id, texture);\n\t}\n\n\t/**\n\t * @param {number} id - ID assigned to the texture.\n\t * @public\n\t */\n\tdelete(id) {\n\t\t// Get texture from array instead of with get()\n\t\t// because it's okay if it was already deleted.\n\t\tconst texture = this._textures.get(id);\n\t\tif (texture) {\n\t\t\t// This is assuming the texture has already been disposed.\n\t\t\t/** @type {Object<string, *>} */ (texture).source = null;\n\t\t\t/** @type {Object<string, *>} */ (texture).mipmaps = null;\n\t\t\tthis._textures.delete(id);\n\t\t}\n\t}\n\n\t/**\n\t * Disposes/frees the FFLTextureCallback along with\n\t * removing the created Emscripten functions.\n\t * @public\n\t */\n\tdisposeCallback() {\n\t\t// if (!this._module) {\n\t\t// \treturn;\n\t\t// }\n\t\tif (this.callbackPtr) {\n\t\t\tthis._module._free(this.callbackPtr);\n\t\t\tthis.callbackPtr = 0;\n\t\t}\n\t\tif (this._deleteCallback) {\n\t\t\tthis._module.removeFunction(this._deleteCallback);\n\t\t\tthis._deleteCallback = 0;\n\t\t}\n\t\t// should always exist?:\n\t\tif (this._createCallback) {\n\t\t\tthis._module.removeFunction(this._createCallback);\n\t\t\tthis._createCallback = 0;\n\t\t}\n\t\t// this._module = null;\n\t}\n\n\t/**\n\t * Disposes of all textures and frees the FFLTextureCallback.\n\t * @public\n\t */\n\tdispose() {\n\t\t// Dispose of all stored textures.\n\t\tfor (const tex of this._textures) {\n\t\t\ttex[1].dispose();\n\t\t}\n\n\t\t// Clear texture map.\n\t\tthis._textures.clear();\n\t\t// Free texture callback.\n\t\tthis.disposeCallback();\n\t}\n}\n\n// // ---------------------------------------------------------------------\n// //  Classes for FFL Exceptions\n// // ---------------------------------------------------------------------\n// TODO PATH: src/Exceptions.js\n\n/**\n * Base exception type for all exceptions based on FFLResult.\n * https://github.com/ariankordi/FFLSharp/blob/master/FFLSharp.FFLManager/FFLExceptions.cs\n * https://github.com/aboood40091/ffl/blob/master/include/nn/ffl/FFLResult.h\n */\nclass FFLResultException extends Error {\n\t/**\n\t * @param {number|FFLResult} result - The returned {@link FFLResult}.\n\t * @param {string} [funcName] - The name of the function that was called.\n\t * @param {string} [message] - An optional message for the exception.\n\t */\n\tconstructor(result, funcName, message) {\n\t\tif (!message) {\n\t\t\tmessage = funcName\n\t\t\t\t? `${funcName} failed with FFLResult: ${result}`\n\t\t\t\t: `From FFLResult: ${result}`;\n\t\t}\n\t\tsuper(message);\n\t\t/** The stored {@link FFLResult} code. */\n\t\tthis.result = result;\n\t}\n\n\t/**\n\t * Throws an exception if the {@link FFLResult} is not OK.\n\t * @param {number} result - The {@link FFLResult} from an FFL function.\n\t * @param {string} [funcName] - The name of the function that was called.\n\t * @throws {FFLResultException|FFLResultWrongParam|FFLResultBroken|FFLResultNotAvailable|FFLResultFatal}\n\t */\n\tstatic handleResult(result, funcName) {\n\t\tswitch (result) {\n\t\t\tcase FFLResult.ERROR: // FFL_RESULT_WRONG_PARAM\n\t\t\t\tthrow new FFLResultWrongParam(funcName);\n\t\t\tcase FFLResult.FILE_INVALID: // FFL_RESULT_BROKEN\n\t\t\t\tthrow new FFLResultBroken(funcName);\n\t\t\tcase FFLResult.MANAGER_NOT_CONSTRUCT: // FFL_RESULT_NOT_AVAILABLE\n\t\t\t\tthrow new FFLResultNotAvailable(funcName);\n\t\t\tcase FFLResult.FILE_LOAD_ERROR: // FFL_RESULT_FATAL\n\t\t\t\tthrow new FFLResultFatal(funcName);\n\t\t\tcase FFLResult.OK: // FFL_RESULT_OK\n\t\t\t\treturn; // All is OK.\n\t\t\tdefault:\n\t\t\t\tthrow new FFLResultException(result, funcName);\n\t\t}\n\t}\n}\n\n/**\n * Exception reflecting FFL_RESULT_WRONG_PARAM / FFL_RESULT_ERROR.\n * This is the most common error thrown in FFL. It usually\n * means that input parameters are invalid.\n * So many cases this is thrown: parts index is out of bounds,\n * CharModelCreateParam is malformed, FFLDataSource is invalid, FFLInitResEx\n * parameters are null or invalid... Many different causes, very much an annoying error.\n */\nclass FFLResultWrongParam extends FFLResultException {\n\t/** @param {string} [funcName] - Name of the function where the result originated. */\n\tconstructor(funcName) {\n\t\tsuper(FFLResult.ERROR, funcName, `${funcName} returned FFL_RESULT_WRONG_PARAM. This usually means parameters going into that function were invalid.`);\n\t}\n}\n\n/** Exception reflecting FFL_RESULT_BROKEN / FFL_RESULT_FILE_INVALID. */\nclass FFLResultBroken extends FFLResultException {\n\t/**\n\t * @param {string} [funcName] - Name of the function where the result originated.\n\t * @param {string} [message] - An optional message for the exception.\n\t */\n\tconstructor(funcName, message) {\n\t\tsuper(FFLResult.FILE_INVALID, funcName, message || `${funcName} returned FFL_RESULT_BROKEN. This usually indicates invalid underlying data.`);\n\t}\n}\n\n/** Exception when resource header verification fails. */\nclass BrokenInitRes extends FFLResultBroken {\n\tconstructor() {\n\t\tsuper('FFLInitRes', 'The header for the FFL resource is probably invalid. Check the version and magic, should be \"FFRA\" or \"ARFF\".');\n\t}\n}\n\n/**\n * Exception reflecting FFL_RESULT_NOT_AVAILABLE / FFL_RESULT_MANAGER_NOT_CONSTRUCT.\n * This is seen when FFLiManager is not constructed, which it is not when FFLInitResEx fails\n * or was never called to begin with.\n */\nclass FFLResultNotAvailable extends FFLResultException {\n\t/** @param {string} [funcName] - Name of the function where the result originated. */\n\tconstructor(funcName) {\n\t\tsuper(FFLResult.MANAGER_NOT_CONSTRUCT, funcName, `Tried to call FFL function ${funcName} when FFLManager is not constructed (FFL is not initialized properly).`);\n\t}\n}\n\n/**\n * Exception reflecting FFL_RESULT_FATAL / FFL_RESULT_FILE_LOAD_ERROR.\n * This error indicates database file load errors or failures from FFLiResourceLoader (decompression? misalignment?)\n */\nclass FFLResultFatal extends FFLResultException {\n\t/** @param {string} [funcName] - Name of the function where the result originated. */\n\tconstructor(funcName) {\n\t\tsuper(FFLResult.FILE_LOAD_ERROR, funcName, `Failed to uncompress or load a specific asset from the FFL resource file during call to ${funcName}`);\n\t}\n}\n\n/**\n * Exception thrown by the result of FFLiVerifyCharInfoWithReason.\n * Reference: https://github.com/aboood40091/ffl/blob/master/include/nn/ffl/detail/FFLiCharInfo.h#L90\n */\nclass FFLiVerifyReasonException extends Error {\n\t/** @param {number} result - The FFLiVerifyReason code from FFLiVerifyCharInfoWithReason. */\n\tconstructor(result) {\n\t\tsuper(`FFLiVerifyCharInfoWithReason (CharInfo verification) failed with result: ${result}`);\n\t\t/** The stored FFLiVerifyReason code. */\n\t\tthis.result = result;\n\t}\n}\n\n/**\n * Exception thrown when the mask is set to an expression that\n * the {@link CharModel} was never initialized to, which can't happen\n * because that mask texture does not exist on the {@link CharModel}.\n * @augments {Error}\n */\nclass ExpressionNotSet extends Error {\n\t/** @param {FFLExpression} expression - The attempted expression. */\n\tconstructor(expression) {\n\t\tsuper(`Attempted to set expression ${expression}, but the mask for that expression does not exist. You must reinitialize the CharModel with this expression in the expression flags before using it.`);\n\t\tthis.expression = expression;\n\t}\n}\n\n// // ---------------------------------------------------------------------\n// //  FFL Initialization\n// // ---------------------------------------------------------------------\n// TODO PATH: src/Initialization.js\n\n/**\n * Class for initializing FFL.js.\n * The instance of this class is meant to be passed when creating\n * CharModels or to functions that need the {@link Module}.\n */\nclass FFL {\n\t/**\n\t * Resource type to load single resource into = FFL_RESOURCE_TYPE_HIGH\n\t * @package\n\t */\n\tstatic singleResourceType = 1;\n\n\t/**\n\t * Initializes FFL by copying the resource into heap and calling FFLInitRes.\n\t * It will first wait for the Emscripten module to be ready.\n\t * @param {Uint8Array|Response} resource - The FFL resource data. Use a Uint8Array\n\t * if you have the raw bytes, or a fetch response containing the FFL resource file.\n\t * @param {Module|Promise<Module>|function(): Promise<Module>} moduleOrPromise - The Emscripten module\n\t * by itself (window.Module when MODULARIZE=0), as a promise (window.Module() when MODULARIZE=1),\n\t * or as a function returning a promise (window.Module when MODULARIZE=1).\n\t * @returns {Promise<FFL>} Resolves when FFL is fully initialized.\n\t * returning the final Emscripten {@link Module} instance and the FFLResourceDesc buffer\n\t * that can later be passed into `FFL.dispose()`.\n\t * @public\n\t */\n\tstatic async initWithResource(resource, moduleOrPromise) {\n\t\t// console.debug('FFL.initWithResource: Entrypoint, waiting for module to be ready.');\n\n\t\t/**\n\t\t * Pointer to the FFLResourceDesc structure to free when FFLInitRes call is done.\n\t\t * @type {number}\n\t\t */\n\t\tlet resourceDescPtr = 0;\n\n\t\t/**\n\t\t * The Emscripten Module instance to set and return at the end.\n\t\t * @type {Module}\n\t\t */\n\t\tlet module;\n\t\t// Resolve moduleOrPromise to the Module instance.\n\t\tif (typeof moduleOrPromise === 'function') {\n\t\t\t// Assume this function gets the promise of the module.\n\t\t\tmoduleOrPromise = moduleOrPromise();\n\t\t}\n\t\tmodule = (moduleOrPromise instanceof Promise)\n\t\t\t// Await if this is now a promise.\n\t\t\t? module = await moduleOrPromise\n\t\t\t// Otherwise, assume it is already the module.\n\t\t\t: module = moduleOrPromise;\n\n\t\t// Wait for the Emscripten runtime to be ready if it isn't already.\n\t\tif (!module.calledRun && !module.onRuntimeInitialized) {\n\t\t\t// calledRun is not defined. Set onRuntimeInitialized and wait for it in a new promise.\n\t\t\tawait new Promise((resolve) => {\n\t\t\t\t/** If onRuntimeInitialized is not defined on module, add it. */\n\t\t\t\tmodule.onRuntimeInitialized = () => {\n\t\t\t\t\t// console.debug('FFL.initWithResource: Emscripten runtime initialized, resolving.');\n\t\t\t\t\tresolve(null);\n\t\t\t\t};\n\t\t\t\t// console.debug(`FFL.initWithResource: module.calledRun: ${module.calledRun}, ` +\n\t\t\t\t// \t`module.onRuntimeInitialized:\\n${module.onRuntimeInitialized}\\n // ^^ assigned and waiting.`);\n\t\t\t\t// If you are stuck here, the object passed in may not actually be an Emscripten module?\n\t\t\t});\n\t\t} else {\n\t\t\t// console.debug('FFL.initWithResource: Assuming module is ready.');\n\t\t}\n\n\t\t// Module should be ready after this point, begin loading the resource.\n\t\t/** @type {FFLResourceDesc|null} */\n\t\tlet desc = null;\n\t\ttry {\n\t\t\t// If resource is itself a promise (fetch() result), wait for it to finish.\n\t\t\tif (resource instanceof Promise) {\n\t\t\t\tresource = await resource;\n\t\t\t}\n\n\t\t\t// Load the resource (Uint8Array/fetch Response) into heap.\n\t\t\tconst { pointer: heapPtr, size: heapSize } =\n\t\t\t\tawait FFL._loadDataIntoHeap(resource, module);\n\t\t\t// console.debug(`FFL.initWithResource: Resource loaded into heap. Pointer: ${heapPtr}, Size: ${heapSize}`);\n\n\t\t\t// Initialize and pack FFLResourceDesc.\n\t\t\tdesc = { pData: [0, 0], size: [0, 0] };\n\t\t\tdesc.pData[FFL.singleResourceType] = heapPtr;\n\t\t\tdesc.size[FFL.singleResourceType] = heapSize;\n\n\t\t\tconst resourceDescData = FFL._packFFLResourceDesc(desc);\n\t\t\tresourceDescPtr = module._malloc(this.FFLResourceDesc_size);\n\t\t\tmodule.HEAPU8.set(resourceDescData, resourceDescPtr);\n\n\t\t\t// Call FFL initialization using: FFL_FONT_REGION_JP_US_EU = 0\n\t\t\tconst result = module._FFLInitRes(0, resourceDescPtr);\n\n\t\t\t// Handle failed result.\n\t\t\tif (result === FFLResult.FILE_INVALID) { // FFL_RESULT_BROKEN\n\t\t\t\tthrow new BrokenInitRes();\n\t\t\t}\n\t\t\tFFLResultException.handleResult(result, 'FFLInitRes');\n\n\t\t\t// Set required globals in FFL.\n\t\t\tmodule._FFLInitResGPUStep(); // CanInitCharModel will fail if not called.\n\t\t\tmodule._FFLSetNormalIsSnorm8_8_8_8(true); // Set normal format to FFLiSnorm8_8_8_8.\n\t\t\tmodule._FFLSetTextureFlipY(true); // Set textures to be flipped for OpenGL.\n\n\t\t\t// Requires refactoring:\n\t\t\t// module._FFLSetScale(0.1); // Sets model scale back to 1.0.\n\t\t\t// module._FFLSetLinearGammaMode(1); // Use linear gamma.\n\t\t\t// I don't think ^^ will work because the shaders need sRGB\n\t\t} catch (error) {\n\t\t\t// Cleanup on error.\n\t\t\tFFL._freeResource(desc, module);\n\t\t\tresourceDescPtr && module._free(resourceDescPtr);\n\t\t\tconsole.error('FFL.initWithResource failed:', error);\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\t// Always free the FFLResourceDesc struct itself.\n\t\t\tresourceDescPtr && module._free(resourceDescPtr);\n\t\t}\n\n\t\t// Return final Emscripten module and FFLResourceDesc object.\n\t\treturn new FFL(module, desc);\n\t}\n\n\t/**\n\t * @typedef {Object} FFLResourceDesc\n\t * @property {Array<number>} pData\n\t * @property {Array<number>} size\n\t * @private\n\t */\n\t/** @private */\n\tstatic FFLResourceDesc_size = 16;\n\t/**\n\t * @param {FFLResourceDesc} obj - Object form of FFLResourceDesc.\n\t * @returns {Uint8Array} Byte form of FFLResourceDesc.\n\t * @private\n\t */\n\tstatic _packFFLResourceDesc(obj) {\n\t\tconst u8 = new Uint8Array(this.FFLResourceDesc_size);\n\t\tconst view = new DataView(u8.buffer);\n\t\tview.setUint32(0, obj.pData[0], true);\n\t\tview.setUint32(4, obj.pData[1], true);\n\t\tview.setUint32(8, obj.size[0], true);\n\t\tview.setUint32(12, obj.size[1], true);\n\t\treturn u8;\n\t}\n\n\t/**\n\t * Loads data from TypedArray or fetch response directly into Emscripten heap.\n\t * If passed a fetch response, it streams it directly into memory and avoids copying.\n\t * @param {ArrayBuffer|Uint8Array|Response} resource - The resource data.\n\t * Use a Fetch response to stream directly, or a Uint8Array if you only have the raw bytes.\n\t * @param {Module} module - The Emscripten module instance.\n\t * @returns {Promise<{pointer: number, size: number}>} Pointer and size of the allocated heap memory.\n\t * @throws {Error} resource must be a Uint8Array or fetch that can be streamed and has Content-Length.\n\t * @private\n\t */\n\tstatic async _loadDataIntoHeap(resource, module) {\n\t\t// These need to be accessible by the catch statement:\n\t\tlet heapSize;\n\t\tlet heapPtr;\n\t\ttry {\n\t\t\t// Copy resource into heap.\n\t\t\tif (resource instanceof ArrayBuffer) {\n\t\t\t\tresource = new Uint8Array(resource);\n\t\t\t}\n\t\t\tif (resource instanceof Uint8Array) {\n\t\t\t\t// Comes in as Uint8Array, allocate and set it.\n\t\t\t\theapSize = resource.length;\n\t\t\t\theapPtr = module._malloc(heapSize);\n\t\t\t\t// console.debug(`_loadDataIntoHeap: Loading from buffer. Size: ${heapSize}, Pointer: ${heapPtr}`);\n\t\t\t\t// Allocate and set this area in the heap as the passed buffer.\n\t\t\t\tmodule.HEAPU8.set(resource, heapPtr);\n\t\t\t} else if (resource instanceof Response) {\n\t\t\t\t// Handle as fetch response.\n\t\t\t\tif (!resource.ok) {\n\t\t\t\t\tthrow new Error(`_loadDataIntoHeap: Failed to fetch resource at URL = ${resource.url}, response code = ${resource.status}`);\n\t\t\t\t}\n\t\t\t\t// Throw an error if it response body cannot be streamed.\n\t\t\t\tif (!resource.body) {\n\t\t\t\t\tthrow new Error(`_loadDataIntoHeap: Fetch response body is null (resource.body = ${resource.body})`);\n\t\t\t\t}\n\t\t\t\t// Get the total size of the resource from the headers.\n\t\t\t\tconst contentLength = resource.headers.get('Content-Length');\n\t\t\t\tif (!contentLength) {\n\t\t\t\t\t// Cannot stream the response. Read as ArrayBuffer and re-invoke function.\n\t\t\t\t\tconsole.debug('_loadDataIntoHeap: Fetch response is missing Content-Length, falling back to reading as ArrayBuffer.');\n\t\t\t\t\treturn FFL._loadDataIntoHeap(await resource.arrayBuffer(), module);\n\t\t\t\t}\n\n\t\t\t\t// Allocate into heap using the Content-Length.\n\t\t\t\theapSize = Number.parseInt(contentLength, 10);\n\t\t\t\theapPtr = module._malloc(heapSize);\n\n\t\t\t\t// console.debug(`loadDataIntoHeap: Streaming from fetch response. ` +\n\t\t\t\t// \t`Size: ${heapSize}, pointer: ${heapPtr}, URL: ${resource.url}`);\n\n\t\t\t\t// Begin reading and streaming chunks into the heap.\n\t\t\t\tconst reader = resource.body.getReader();\n\t\t\t\tlet offset = heapPtr;\n\t\t\t\twhile (true) {\n\t\t\t\t\tconst { done, value } = await reader.read();\n\t\t\t\t\tif (done) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t// Copy value directly into HEAPU8 with offset.\n\t\t\t\t\tmodule.HEAPU8.set(value, offset);\n\t\t\t\t\toffset += value.length;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthrow new TypeError('loadDataIntoHeap: type is not Uint8Array or Response');\n\t\t\t}\n\n\t\t\treturn { pointer: heapPtr, size: heapSize };\n\t\t} catch (error) {\n\t\t\t// Free memory upon exception, if allocated.\n\t\t\tif (heapPtr) {\n\t\t\t\tmodule._free(heapPtr);\n\t\t\t}\n\t\t\tthrow error;\n\t\t}\n\t}\n\n\t/**\n\t * Frees all pData pointers within FFLResourceDesc.\n\t * @param {FFLResourceDesc|null} desc - Resource description containing pointers.\n\t * @param {Module} module - Emscripten module to call _free on.\n\t * @private\n\t */\n\tstatic _freeResource(desc, module) {\n\t\tif (!desc) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Access pData, the first pointer array.\n\t\tfor (let i = 0; i < 2/* FFLResourceType.MAX */; i++) {\n\t\t\tconst p = desc.pData[i];\n\t\t\tif (p) {\n\t\t\t\tmodule._free(p); // Free pData and set to 0.\n\t\t\t\tdesc.pData[i] = 0;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * @param {Module} module - Emscripten module.\n\t * @param {FFLResourceDesc} resourceDesc - FFLResourceDesc to free later.\n\t * @private\n\t */\n\tconstructor(module, resourceDesc) {\n\t\t/** @package */\n\t\tthis.module = module;\n\t\t/** @package */\n\t\tthis.resourceDesc = resourceDesc;\n\t}\n\n\t/**\n\t * Frees the FFL resource from WASM memory.\n\t * @public\n\t */\n\tdispose() {\n\t\t// console.debug('FFL.dispose called, resourceDesc:', resourceDesc);\n\n\t\t// All CharModels must be deleted before this point.\n\t\tconst result = this.module._FFLExit();\n\t\tFFLResultException.handleResult(result, 'FFLExit');\n\n\t\t// Free resources in heap after FFLExit().\n\t\tFFL._freeResource(this.resourceDesc, this.module);\n\n\t\t// Exit the module...? Is this even necessary?\n\t\tif (this.module._exit) {\n\t\t\tthis.module._exit();\n\t\t} else {\n\t\t\t// console.debug('FFL.dispose: not calling module._exit = ', module._exit);\n\t\t}\n\t}\n\n\t/**\n\t * Sets the state for whether WebGL 1.0 or WebGPU is being used.\n\t * Otherwise, textures will appear wrong when not using WebGL 2.0.\n\t * @param {Renderer} renderer - The WebGLRenderer or WebGPURenderer.\n\t * @public\n\t */\n\tsetRenderer(renderer) {\n\t\tconsole.assert(renderer && this.module, `setRendererState: The renderer and module must both be valid.`);\n\t\tif ('capabilities' in renderer &&\n\t\t\t!(/** @type {THREE.WebGLCapabilities} */ (renderer.capabilities).isWebGL2)) {\n\t\t\tTextureManager.isWebGL1 = true;\n\t\t} else if (_isWebGPU(renderer)) {\n\t\t\tthis.module._FFLSetTextureFlipY(false);\n\t\t}\n\t}\n\n\t/*\n\tsetLinearGammaMode(mode) {\n\t\tthis._gammaModeIsLinear = mode;\n\t\tthis._module._FFLSetLinearGammaMode(mode ? 1 : 0);\n\t}\n\t*/\n\n\t// TODO: Should there be methods for \"createCharModel\", \"createModelIcon\"...\n\t// Like, what if this were the only export?\n}\n\n// // ---------------------------------------------------------------------\n// //  CharModel Handling\n// // ---------------------------------------------------------------------\n// TODO PATH: src/CharModel.js\n\n/** @typedef {function(new: THREE.Material, ...*): THREE.Material} MaterialConstructor */\n\n/** @package */ const FFLColor_size = 16;\n/** @package */ const FFLAdditionalInfo_size = 80;\n/**\n * Converts an FFLColor pointer to a THREE.Color.\n * @param {Float32Array} f32 - HEAPF32 buffer view within {@link Module}.\n * @param {number} colorPtr - The pointer to the color.\n * @returns {THREE.Color} The RGB color.\n * @package\n */\nconst _getFFLColor = (f32, colorPtr) =>\n\tnew THREE.Color().fromArray(f32, colorPtr / 4);\n\n/**\n * Class for creating and maintaining a Mii head model,\n * also known as the \"CharModel\". Once constructed, a Three.js\n * model group is provided in {@link CharModel.meshes}.\n * @public\n */\nclass CharModel {\n\t/**\n\t * Creates a CharModel from data and FFLCharModelDesc.\n\t * Don't forget to call `dispose()` on the CharModel when you are done with it.\n\t * @param {FFL} ffl - FFL module/resource state.\n\t * @param {Uint8Array} data - Character data. Accepted types:\n\t * FFLStoreData, RFLCharData, StudioCharInfo, FFLiCharInfo as Uint8Array\n\t * @param {CharModelDescOrExpressionFlag} descOrExpFlag - Either a new {@link FFLCharModelDesc},\n\t * an array of expressions, a single expression, or an\n\t * expression flag (Uint32Array). Default: {@link FFLCharModelDescDefault}\n\t * @param {MaterialConstructor} materialClass - Class for the material (constructor). It must be compatible\n\t * with FFL, so if your material isn't, try: {@link TextureShaderMaterial}, FFL/LUTShaderMaterial\n\t * @param {Renderer} [renderer] - The Three.js renderer used for the render textures.\n\t * If this is not provided, you must call {@link CharModel.initTextures}.\n\t * @param {boolean} [verify] - Whether the CharInfo provided should be verified.\n\t * @throws {FFLResultException|FFLiVerifyReasonException|Error} Throws if `module`, `modelDesc`,\n\t * or `data` is invalid, CharInfo verification fails, or CharModel creation fails otherwise.\n\t */\n\tconstructor(ffl, data, descOrExpFlag, materialClass, renderer, verify = true) {\n\t\t// Verify arguments.\n\t\tif (!ffl || !ffl.module || !ffl.module._malloc) {\n\t\t\tthrow new Error('CharModel: Invalid `ffl` parameter passed in.');\n\t\t}\n\t\tif (!data) {\n\t\t\tthrow new Error('CharModel: data is null or undefined.');\n\t\t}\n\n\t\t// Set private properties.\n\n\t\t/** @private */\n\t\tthis._module = ffl.module;\n\t\t/**\n\t\t * The data used to construct the CharModel.\n\t\t * @type {ConstructorParameters<typeof CharModel>[1]}\n\t\t * @private\n\t\t */\n\t\tthis._data = data;\n\t\t/**\n\t\t * @type {MaterialConstructor}\n\t\t * @package\n\t\t */\n\t\tthis._materialClass = materialClass;\n\n\t\t// Initialize FFLCharModel.\n\n\t\tconst modelSourcePtr = this._module._malloc(FFLCharModelSource_size);\n\t\tconst modelDescPtr = this._module._malloc(CharModel.FFLCharModelDesc_size);\n\t\t/**\n\t\t * Pointer to the FFLiCharModel in memory, set to null when deleted.\n\t\t * @private\n\t\t */\n\t\tthis._ptr = this._module._malloc(CharModel.FFLiCharModel_size);\n\n\t\t// this._data = getRandomCharInfo(ffl, FFLGender.ALL, FFLAge.ALL, FFLRace.ALL);\n\t\t// console.debug('getRandomCharInfo result:', FFLiCharInfo.unpack(data));\n\t\t// Get FFLCharModelSource. This function converts and allocates FFLiCharInfo.\n\t\tconst modelSource = _allocateModelSource(this._data, this._module);\n\t\t/** Get pBuffer to free it later. */\n\t\tconst charInfoPtr = modelSource.pBuffer;\n\t\tconst modelSourceBuffer = CharModel._packFFLCharModelSource(modelSource);\n\t\tthis._module.HEAPU8.set(modelSourceBuffer, modelSourcePtr);\n\n\t\t/** @private */\n\t\tthis._modelDesc = CharModel._descOrExpFlagToModelDesc(descOrExpFlag);\n\t\t// This is needed to enable expressions past 19.\n\t\tthis._modelDesc.modelFlag |= FFLModelFlag.NEW_EXPRESSIONS;\n\n\t\tconst modelDescBuffer = CharModel._packFFLCharModelDesc(this._modelDesc);\n\t\tthis._module.HEAPU8.set(modelDescBuffer, modelDescPtr);\n\n\t\t// At this point, CharModelSource/CharModelDesc are allocated. Create FFLCharModel.\n\t\ttry {\n\t\t\t// Verify CharInfo before creating.\n\t\t\tif (verify) {\n\t\t\t\tverifyCharInfo(charInfoPtr, ffl, false); // Don't verify name.\n\t\t\t}\n\n\t\t\t/**\n\t\t\t * Local per-model TextureManager instance.\n\t\t\t * @private\n\t\t\t */\n\t\t\tthis._textureManager = new TextureManager(this._module, false);\n\n\t\t\t// Call FFLInitCharModelCPUStep and check the result.\n\t\t\tconst result = this._module._FFLInitCharModelCPUStepWithCallback(this._ptr,\n\t\t\t\tmodelSourcePtr, modelDescPtr, this._textureManager.callbackPtr);\n\t\t\tFFLResultException.handleResult(result, 'FFLInitCharModelCPUStep');\n\t\t} catch (error) {\n\t\t\t(this._textureManager) && this._textureManager.dispose();\n\t\t\t// Free CharModel prematurely.\n\t\t\tthis._module._free(this._ptr);\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\t// Free temporary allocations.\n\t\t\tthis._module._free(modelSourcePtr);\n\t\t\tthis._module._free(modelDescPtr);\n\t\t\tthis._module._free(charInfoPtr);\n\t\t\t// Callback itself is longer read by FFL.\n\t\t\t(this._textureManager) && this._textureManager.disposeCallback();\n\t\t}\n\n\t\t// console.debug(`createCharModel: Initialized for ` +\n\t\t// `\"${charModel.this.charInfo.name}\", ptr =`, charModelPtr);\n\n\t\t// End initialization of FFLCharModel. Further construct the CharModel class.\n\n\t\t// this._model = CharModel._unpackFFLiCharModel(module.HEAPU8, this._ptr);\n\t\t/**\n\t\t * Representation of the underlying FFLCharModel instance.\n\t\t * @private\n\t\t */\n\t\tthis._model = new CharModelAccessor(this._module, this._ptr, this._modelDesc);\n\n\t\t/** @private */\n\t\tthis._isTexOnly = this._model.isTexOnly();\n\n\t\t// Add RenderTargets for faceline and mask.\n\t\t/**\n\t\t * @type {THREE.RenderTarget|null}\n\t\t * @private\n\t\t */\n\t\tthis._facelineTarget = null;\n\t\t/**\n\t\t * Array of RenderTargets for mask textures.\n\t\t * Accessible for debugging (see demo-basic).\n\t\t * @type {Array<THREE.RenderTarget|null>}\n\t\t * @package\n\t\t */\n\t\tthis._maskTargets = Array.from({ length: FFLExpression.MAX }).fill(null);\n\t\t/**\n\t\t * List of enabled expressions that can be set with {@link CharModel.setExpression}.\n\t\t * @type {Uint32Array}\n\t\t * @public\n\t\t */\n\t\tthis.expressions = this._model.getMaskRenderTextures()\n\t\t\t// expressions is a list of expression indices, where each index is non-null here.\n\t\t\t.map((val, idx) =>\n\t\t\t\t// If the value is 0 (null), map it.\n\t\t\t\tval === 0 ? FFLExpression.MAX : idx)\n\t\t\t.filter(i => i !== FFLExpression.MAX); // MAX = null, filter them out.\n\t\t/** @private */\n\t\tthis._expression = this._model.getExpression();\n\t\t/**\n\t\t * Skin/face color for this model.\n\t\t * @type {THREE.Color}\n\t\t * @readonly\n\t\t * @public\n\t\t */\n\t\tthis.facelineColor = /* @__PURE__ */ new THREE.Color();\n\t\t/**\n\t\t * Contains the CharInfo of the model.\n\t\t * Changes to this will not be reflected whatsoever.\n\t\t * @readonly\n\t\t * @returns {FFLiCharInfo} The CharInfo of the model.\n\t\t * @public\n\t\t */\n\t\tthis.charInfo = this._model.getCharInfo();\n\t\t/**\n\t\t * Group of THREE.Mesh objects representing the CharModel.\n\t\t * @type {THREE.Group}\n\t\t * @readonly\n\t\t * @public\n\t\t */\n\t\tthis.meshes = new THREE.Group();\n\n\t\t// Populate this.meshes.\n\t\t// NOTE: The properties defined below this will not be available\n\t\t// in this function. However, they will be treated as if they're\n\t\t// always available in the class.\n\t\tthis._addCharModelMeshes(this._module);\n\n\t\t// Populate facelineColor from FFLAdditionalInfo.\n\t\tconst infoPtr = this._module._malloc(FFLAdditionalInfo_size);\n\t\t// this._module._FFLGetFacelineColor(colorPtr, this._model.getCharInfo().faceColor);\n\t\tif (this._module._FFLGetAdditionalInfo(infoPtr,\n\t\t\t/* dataSource = DIRECT_POINTER */ 6, this._ptr, 0, false) === FFLResult.OK) {\n\t\t\tthis.facelineColor.fromArray(this._module.HEAPF32,\n\t\t\t\t(infoPtr + 0x38) / 4 /* = offsetof(FFLAdditionalInfo.skinColor) */);\n\t\t}\n\t\tthis._module._free(infoPtr);\n\n\t\t/**\n\t\t * Favorite color, also used for hats and body.\n\t\t * @readonly\n\t\t * @public\n\t\t */\n\t\tthis.favoriteColor = this._getFavoriteColor();\n\t\t/**\n\t\t * The parameters in which to transform hats and other accessories.\n\t\t * @readonly\n\t\t * @public\n\t\t */\n\t\tthis.partsTransform = this._model.getPartsTransform();\n\t\t// Set boundingBox getter (\"this\" = CharModel), dummy geometry needed\n\t\t// this.meshes.geometry = { }; // NOTE: is this a good idea?\n\t\t// Object.defineProperty(this.meshes.geometry, 'boundingBox',\n\t\t// { get: () => this.boundingBox }); // NOTE: box is too large using this\n\t\t/**\n\t\t * Bounding box of the model.\n\t\t * This needs to be used instead of the Three.js built-in method\n\t\t * for getting bounding boxes, since this excludes invisible shapes.\n\t\t * @public\n\t\t */\n\t\tthis.boundingBox = this._getBoundingBox();\n\n\t\t// Optionally initialize textures if the renderer was provided.\n\t\tif (renderer) {\n\t\t\t// Do this after accessing this._model, as it gets deleted after this.\n\t\t\tthis.initTextures(renderer, this._materialTextureClass);\n\t\t}\n\t}\n\n\t/** @typedef {THREE.Mesh<THREE.BufferGeometry, THREE.MeshBasicMaterial>} MeshWithTexture */\n\n\t// Public methods:\n\n\t/**\n\t * Initializes textures (faceline and mask) for a CharModel.\n\t * Calling this is not necessary, unless you haven't provided\n\t * renderer to the constructor (e.g. you want them to be separate).\n\t * This ends up drawing faceline and mask textures.\n\t * @param {Renderer} renderer - The Three.js renderer.\n\t * @param {MaterialConstructor} materialClass - The material class (e.g., FFLShaderMaterial).\n\t */\n\tinitTextures(renderer, materialClass = this._materialClass) {\n\t\tconsole.assert(this._materialTextureClass === undefined,\n\t\t\t'CharModel.initTextures: This has already run. Avoid calling it twice. This will also get called automatically if renderer is passed to the constructor.');\n\t\t/**\n\t\t * Material class used to initialize textures specifically.\n\t\t * @type {MaterialConstructor}\n\t\t * @private\n\t\t */\n\t\tthis._materialTextureClass = materialClass; // Material for render textures.\n\n\t\tconst faceTarget = CharModelTextures.initialize(\n\t\t\tthis._model, renderer, this._module,\n\t\t\tthis._textureManager, this._materialTextureClass,\n\t\t\tthis._maskTargets, this.facelineColor);\n\t\t(faceTarget) && this._setFaceline(faceTarget);\n\n\t\t// Finalize CharModel, deleting and freeing it.\n\t\tthis._finalizeCharModel();\n\t\t// Update the expression to refresh the mask texture.\n\t\tthis.setExpression(this.expression);\n\n\t\t// Determine whether textures should be converted to RGBA depending on the material.\n\t\tif (!matSupportsFFL(this._materialClass)) {\n\t\t\tif (matSupportsFFL(this._materialTextureClass)) {\n\t\t\t\tModelTexturesConverter.convModelTexturesToRGBA(this,\n\t\t\t\t\trenderer, this._materialTextureClass);\n\t\t\t} else {\n\t\t\t\tconsole.error('CharModel._materialClass does not support modulateMode (no getter), but the _materialTextureClass is either the same or also does not support modulateMode. as a result, textures will have wrong colors');\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Updates the given CharModel with new data and a new ModelDesc or expression flag.\n\t * If `descOrExpFlag` is an array, it is treated as the new expression flag while inheriting the rest\n\t * of the ModelDesc from the existing CharModel.\n\t * @param {CharModel} charModel - The existing CharModel instance.\n\t * @param {Uint8Array|null} newData - The new raw charInfo data, or null to use the original.\n\t * @param {Renderer} renderer - The Three.js renderer.\n\t * @param {CharModelDescOrExpressionFlag} [descOrExpFlag] - Either a new {@link FFLCharModelDesc},\n\t * an array of expressions, a single expression, or an expression flag (Uint32Array).\n\t * @param {Object} [options] - Options for updating the model.\n\t * @param {boolean} [options.texOnly] - Whether to only update the mask and faceline textures in the CharModel.\n\t * @param {boolean} [options.verify] - Whether the CharInfo provided should be verified.\n\t * @param {MaterialConstructor|null} [options.materialTextureClass] - The new materialTextureClass to change to.\n\t * @returns {CharModel} The updated CharModel instance.\n\t * @throws {Error} Unexpected type for descOrExpFlag, newData is null\n\t * @todo TODO: Should `newData` just pass the charInfo object instance instead of \"_data\"?\n\t */\n\tstatic update(charModel, newData, renderer,\n\t\tdescOrExpFlag = null, {\n\t\t\ttexOnly = false, verify = true,\n\t\t\tmaterialTextureClass = null\n\t\t} = {}) {\n\t\tnewData = newData || charModel._data;\n\t\tif (!newData) {\n\t\t\tthrow new Error('updateCharModel: newData is null.');\n\t\t}\n\n\t\t/** The new or updated CharModelDesc with the new expression specified. */\n\t\tconst newModelDesc = CharModel._descOrExpFlagToModelDesc(\n\t\t\tdescOrExpFlag, charModel._modelDesc);\n\n\t\tif (texOnly) {\n\t\t\t// Updating textures only. Set respective flag.\n\t\t\t// console.debug(`updateCharModel: Updating ONLY textures for model ` +\n\t\t\t// `\"${charModel.charInfo.name}\", ptr =`, charModel._ptr);\n\t\t\t// NOTE: This flag will only take effect if your FFL is built with -D FFL_ENABLE_NEW_MASK_ONLY_FLAG=ON.\n\t\t\tnewModelDesc.modelFlag |= FFLModelFlag.NEW_MASK_ONLY;\n\t\t} else {\n\t\t\t// Dispose of the old CharModel.\n\t\t\tcharModel.dispose();\n\t\t}\n\n\t\t// Create a new CharModel with the new data and ModelDesc.\n\t\tconst newCharModel = new CharModel(/** @type {FFL} */ ({ module: charModel._module }),\n\t\t\tnewData, newModelDesc, charModel._materialClass, undefined, verify);\n\n\t\t// Initialize its textures unconditionally.\n\t\tnewCharModel.initTextures(renderer,\n\t\t\tmaterialTextureClass || charModel._materialTextureClass);\n\n\t\t// Handle textures only case, where new CharModel has textures and old one has shapes.\n\t\tif (texOnly) {\n\t\t\tcharModel.disposeTargets(); // Dispose textures on destination model (will be replaced).\n\n\t\t\t// Transfer faceline and mask targets.\n\t\t\tcharModel._facelineTarget = newCharModel._facelineTarget;\n\t\t\tcharModel._maskTargets = newCharModel._maskTargets;\n\n\t\t\t// Set new CharModel and unset texture only flag.\n\t\t\tcharModel._model = newCharModel._model;\n\t\t\tcharModel._modelDesc = newModelDesc;\n\t\t\tcharModel._modelDesc.modelFlag &= ~FFLModelFlag.NEW_MASK_ONLY;\n\t\t\tcharModel.expressions = newCharModel.expressions;\n\t\t\tcharModel._expression = newCharModel._expression;\n\t\t\t// Apply new faceline and mask to old shapes.\n\t\t\tif (newCharModel._facelineTarget) {\n\t\t\t\tcharModel._setFaceline(newCharModel._facelineTarget);\n\t\t\t}\n\t\t\tcharModel.setExpression(newCharModel.expression);\n\n\t\t\treturn charModel; // Source CharModel has new CharModel's textures.\n\t\t}\n\n\t\treturn newCharModel; // Return new or modified CharModel.\n\t}\n\n\t/**\n\t * Disposes the CharModel and removes all associated resources.\n\t * @param {boolean} [disposeTargets] - Whether or not to dispose of mask and faceline render targets.\n\t * @public\n\t */\n\tdispose(disposeTargets = true) {\n\t\tthis._finalizeCharModel(); // Should've been called already\n\t\t// Dispose meshes: materials, geometries, textures.\n\t\tif (this.meshes) {\n\t\t\t// Break these references first (still in meshes)\n\t\t\tthis._facelineMesh = null;\n\t\t\tthis._maskMesh = null;\n\t\t\t_disposeMany(this.meshes);\n\t\t\t// @ts-expect-error - null not assignable. Always non-null except disposed.\n\t\t\tthis.meshes = null;\n\t\t}\n\t\t// Dispose render textures.\n\t\tif (disposeTargets) {\n\t\t\tthis.disposeTargets();\n\t\t}\n\t\tif (this._textureManager) {\n\t\t\tthis._textureManager.dispose();\n\t\t\t// Null out reference to TextureManager, assuming\n\t\t\t// all textures within are already deleted by now.\n\t\t\t// @ts-expect-error - null not assignable. Always non-null except disposed.\n\t\t\tthis._textureManager = null;\n\t\t}\n\t}\n\n\t/**\n\t * Disposes RenderTargets for textures created by the CharModel.\n\t * @public\n\t */\n\tdisposeTargets() {\n\t\t// Dispose RenderTargets.\n\t\tif (this._facelineTarget) {\n\t\t\t// console.debug(`Disposing target ${this._facelineTarget.texture.id} for faceline`);\n\t\t\tthis._facelineTarget.dispose();\n\t\t\tthis._facelineTarget = null;\n\t\t}\n\n\t\tfor (const [i, target] of this._maskTargets.entries()) {\n\t\t\tif (target) {\n\t\t\t\t// console.debug(`Disposing target ${target.texture.id} for mask ${i}`);\n\t\t\t\ttarget.dispose();\n\t\t\t\tthis._maskTargets[i] = null;\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Sets the expression for this CharModel and updates the corresponding mask texture.\n\t * @param {FFLExpression} expression - The new expression index.\n\t * @throws {Error} CharModel must have been initialized with the\n\t * expression enabled in the flag and have XLU_MASK in meshes.\n\t * @public\n\t */\n\tsetExpression(expression) {\n\t\t/** or getMaskTexture()? */\n\t\tconst target = this._maskTargets[expression];\n\t\tif (!target || !target.texture) {\n\t\t\tthrow new ExpressionNotSet(expression);\n\t\t}\n\t\t/** @private */\n\t\tthis._expression = expression;\n\t\tif (this._isTexOnly) {\n\t\t\treturn;\n\t\t}\n\t\tconst mesh = /** @type {null|THREE.Mesh<THREE.BufferGeometry, THREE.MeshBasicMaterial>} */\n\t\t\t(this._maskMesh);\n\t\tif (!mesh) {\n\t\t\t// So there is no mask mesh, which is not supposed to happen...\n\t\t\t// ... except for when the expression is 61 or 62, in which case just return.\n\t\t\tif (expression === FFLExpression.BLANK_61 || expression === FFLExpression.BLANK_62) {\n\t\t\t\treturn; // Drop out without throwing or setting expression.\n\t\t\t}\n\t\t\tthrow new Error('setExpression: mask mesh does not exist, cannot set expression on it');\n\t\t}\n\t\t// Update texture and material.\n\t\t/** @type {THREE.Texture & {_target:THREE.RenderTarget}} */\n\t\t(target.texture)._target = target;\n\t\tmesh.material.map = target.texture;\n\t\tmesh.material.needsUpdate = true;\n\t}\n\n\t/**\n\t * Gets the faceline texture, or the texture that wraps around\n\t * the faceline shape (opaque, the one hair is placed atop).\n\t * Not to be confused with the texture containing facial features\n\t * such as eyes, mouth, etc. which is the mask.\n\t * The faceline texture may not exist if it is not needed, in which\n\t * case the faceline color is used directly, see property CharModel.facelineColor.\n\t * @returns {THREE.RenderTarget|null} The faceline render target, or null if it does not exist,\n\t * in which case CharModel.facelineColor should be used. Access .texture on this object to\n\t * get a {@link THREE.Texture} from it. It becomes invalid if the CharModel is disposed.\n\t */\n\tgetFaceline() { // getFaceTexture / \"FFLiGetFaceTextureFromCharModel\"\n\t\t// Return the render target if it exists.\n\t\tif (this._facelineTarget) {\n\t\t\treturn this._facelineTarget;\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Gets the mask texture, or the texture containing facial\n\t * features such as eyes, mouth, eyebrows, etc. This is wrapped\n\t * around the mask shape, which is a transparent shape\n\t * placed in front of the head model.\n\t * @param {FFLExpression} expression - The desired expression, or the current expression.\n\t * @returns {THREE.RenderTarget|null} The mask render target for the given expression,\n\t * or null if the CharModel was not initialized with that expression.\n\t * Access .texture on this object to get a {@link THREE.Texture} from it.\n\t * It becomes invalid if the CharModel is disposed.\n\t */\n\tgetMask(expression = this.expression) { // getMaskTexture\n\t\t// Return the render target if it exists.\n\t\tif (this._maskTargets && this._maskTargets[expression]) {\n\t\t\treturn this._maskTargets[expression];\n\t\t}\n\t\treturn null;\n\t}\n\n\t/**\n\t * Gets a vector in which to scale the body model for this CharModel.\n\t * @returns {THREE.Vector3Like} Scale vector for the body model.\n\t * @public\n\t */\n\tgetBodyScale() {\n\t\tconst build = this.charInfo.build;\n\t\tconst height = this.charInfo.height;\n\n\t\t// calculated here in mii_VariableIconBodyImpl.cpp:\n\t\t// void nn::mii::detail::`anonymous namespace'::GetBodyScale(struct nn::util::Float3 *, int, int)\n\t\t// also in Mii Maker USA (0x000500101004A100 v50 ffl_app.rpx): FUN_020737b8\n\t\tconst m = 128;\n\t\tconst x = (build * (height * (0.47 / m) + 0.4)) / m +\n\t\t\theight * (0.23 / m) + 0.4;\n\t\tconst y = (height * (0.77 / m)) + 0.5;\n\n\t\treturn { x, y, z: x }; // z is always set to x\n\t}\n\n\t/**\n\t * Gets the ColorInfo object needed for SampleShaderMaterial.\n\t * @param {boolean} isSpecial - Determines the pants color, gold if special or gray otherwise.\n\t * @returns {import('./materials/SampleShaderMaterial.js').SampleShaderMaterialColorInfo}\n\t * The colorInfo object needed by SampleShaderMaterial.\n\t * @public\n\t */\n\tgetColorInfo(isSpecial = false) {\n\t\treturn {\n\t\t\tfacelineColor: this.charInfo.faceColor,\n\t\t\tfavoriteColor: this.charInfo.favoriteColor,\n\t\t\thairColor: this.charInfo.hairColor,\n\t\t\tbeardColor: this.charInfo.beardColor,\n\t\t\tpantsColor: isSpecial\n\t\t\t\t? PantsColor.GoldSpecial\n\t\t\t\t: PantsColor.GrayNormal\n\t\t};\n\t}\n\n\t/**\n\t * Serializes the CharModel data to FFLStoreData.\n\t * @returns {Uint8Array} The exported FFLStoreData.\n\t * @throws {Error} Throws if call to _FFLpGetStoreDataFromCharInfo\n\t * returns false, usually when CharInfo verification fails.\n\t * @public\n\t * @todo TODO: Can they edit the CharInfo to justify this method so they can get it out?\n\t */\n\t/*\n\tgetStoreData() {\n\t\t// Serialize the CharInfo.\n\t\tconst charInfoData = FFLiCharInfo.pack(this._model.charInfo);\n\n\t\tconst mod = this._module;\n\t\t// Allocate function arguments.\n\t\tconst charInfoInPtr = mod._malloc(FFLiCharInfo_size);\n\t\tconst storeDataOutPtr = mod._malloc(FFLStoreData_size);\n\t\tmod.HEAPU8.set(charInfoData, charInfoInPtr);\n\n\t\t// Call conversion function.\n\t\tconst result = mod._FFLpGetStoreDataFromCharInfo(storeDataOutPtr, charInfoInPtr);\n\t\t// Free and return data.\n\t\tconst storeData = mod.HEAPU8.slice(storeDataOutPtr, storeDataOutPtr + FFLStoreData_size);\n\t\tmod._free(charInfoInPtr);\n\t\tmod._free(storeDataOutPtr);\n\n\t\tif (!result) {\n\t\t\t// call to FFLpGetStoreDataFromCharInfo returned false, CharInfo verification probably failed\n\t\t\tthrow new Error('getStoreData: Input data failed verification.');\n\t\t}\n\n\t\treturn storeData;\n\t}\n\t*/\n\n\t// Accessor methods:\n\n\t/**\n\t * The current expression for this CharModel.\n\t * Read-only. Use setExpression to set the expression.\n\t * @returns {FFLExpression} The current expression.\n\t * @public\n\t */\n\tget expression() {\n\t\treturn this._expression;\n\t}\n\n\t/**\n\t * @returns {FFLGender} Gender as 0 = male, 1 = female\n\t * @public\n\t */\n\tget gender() {\n\t\treturn this.charInfo.gender;\n\t}\n\n\t// Struct related properties/methods:\n\n\t/** @private */\n\tstatic FFLiCharModel_size = 2156;\n\n\t/** @private */\n\tstatic FFLCharModelDesc_size = 24;\n\n\t/**\n\t * Used to index DrawParam array in FFLiCharModel.\n\t * @private\n\t */\n\tstatic FFLiShapeType = {\n\t\tOPA_BEARD: 0,\n\t\tOPA_FACELINE: 1,\n\t\tOPA_HAIR_NORMAL: 2,\n\t\tOPA_FOREHEAD_NORMAL: 3,\n\t\tXLU_MASK: 4,\n\t\tXLU_NOSELINE: 5,\n\t\tOPA_NOSE: 6,\n\t\tOPA_HAT_NORMAL: 7,\n\t\tXLU_GLASS: 8,\n\t\tOPA_HAIR_CAP: 9,\n\t\tOPA_FOREHEAD_CAP: 10,\n\t\tOPA_HAT_CAP: 11,\n\t\tMAX: 12\n\t};\n\n\t/**\n\t * @param {FFLCharModelDesc} obj - Object form of FFLCharModelDesc.\n\t * @returns {Uint8Array} Byte form of FFLCharModelDesc.\n\t * @private\n\t */\n\tstatic _packFFLCharModelDesc(obj) {\n\t\tconst u8 = new Uint8Array(this.FFLCharModelDesc_size);\n\t\tconst view = new DataView(u8.buffer);\n\t\tview.setUint32(0, obj.resolution, true);\n\t\tconst flag = obj.allExpressionFlag;\n\t\tview.setUint32(4, flag[0], true);\n\t\tview.setUint32(8, flag[1], true);\n\t\tview.setUint32(12, flag[2], true);\n\t\tview.setUint32(16, obj.modelFlag, true);\n\t\tview.setUint32(20, FFL.singleResourceType, /* obj.resourceType */ true);\n\t\treturn u8;\n\t}\n\n\t/**\n\t * @param {FFLCharModelSource} obj - Object form of FFLCharModelSource.\n\t * @returns {Uint8Array} Byte form of FFLCharModelSource.\n\t * @private\n\t */\n\tstatic _packFFLCharModelSource(obj) {\n\t\tconst u8 = new Uint8Array(FFLCharModelSource_size);\n\t\tconst view = new DataView(u8.buffer);\n\t\tview.setUint32(0, obj.dataSource >>> 0, true);\n\t\tview.setUint32(4, obj.pBuffer, true);\n\t\t// view.setUint16(8, obj.index, true);\n\t\treturn u8;\n\t}\n\n\t// Private methods:\n\n\t/**\n\t * Converts an expression flag, expression, array of expressions, or object to {@link FFLCharModelDesc}.\n\t * Uses the `defaultDesc` as a fallback to return if input is null or applies expression to it.\n\t * @param {CharModelDescOrExpressionFlag} [descOrExpFlag] - Either a new {@link FFLCharModelDesc},\n\t * an array of expressions, a single expression, or an expression flag (Uint32Array).\n\t * @param {FFLCharModelDesc} [defaultDesc] - Fallback if descOrExpFlag is null or expression flag only.\n\t * @returns {FFLCharModelDesc} The CharModelDesc with the expression applied, or the default.\n\t * @throws {TypeError} Throws if `descOrExpFlag` is an unexpected type.\n\t * @private\n\t */\n\tstatic _descOrExpFlagToModelDesc(descOrExpFlag, defaultDesc = FFLCharModelDescDefault) {\n\t\tif (!descOrExpFlag && typeof descOrExpFlag !== 'number') {\n\t\t\treturn defaultDesc; // Use default if input is falsy.\n\t\t}\n\n\t\t// Convert descOrExpFlag to an expression flag if needed.\n\t\tif (typeof descOrExpFlag === 'number' || Array.isArray(descOrExpFlag)) {\n\t\t\t// Array of expressions or single expression was passed in.\n\t\t\tdescOrExpFlag = makeExpressionFlag(descOrExpFlag);\n\t\t}\n\n\t\t/** Shallow clone of {@link defaultDesc}. */\n\t\tlet newModelDesc = Object.assign({}, defaultDesc);\n\n\t\t// Process descOrExpFlag based on what it is.\n\t\tif (descOrExpFlag instanceof Uint32Array) {\n\t\t\t// If this is already an expression flag (Uint32Array),\n\t\t\t// or set to one previously, use it with existing CharModelDesc.\n\t\t\tnewModelDesc.allExpressionFlag = descOrExpFlag;\n\t\t} else if (typeof descOrExpFlag === 'object') {\n\t\t\t// Assume that descOrExpFlag is a new FFLCharModelDesc.\n\t\t\tnewModelDesc = /** @type {FFLCharModelDesc} */ (descOrExpFlag);\n\t\t} else {\n\t\t\tthrow new TypeError('Unexpected type for descOrExpFlag');\n\t\t}\n\n\t\treturn newModelDesc;\n\t}\n\n\t/**\n\t * This is the method that populates meshes\n\t * from the internal FFLiCharModel instance.\n\t * @param {Module} module - Module to pass to DrawParam.toMesh to access mesh data.\n\t * @private\n\t */\n\t_addCharModelMeshes(module) {\n\t\tconsole.assert(this.meshes, '_addCharModelMeshes: this.meshes is null or undefined, was this CharModel disposed?');\n\n\t\t/** @type {import('./materials/SampleShaderMaterial.js').SampleShaderMaterialColorInfo|null} */\n\t\tlet colorInfo = null;\n\t\t// Prepare colorInfo from CharModel if it is needed on the mesh's material.\n\t\tif ('colorInfo' in this._materialClass.prototype) {\n\t\t\tcolorInfo = this.getColorInfo();\n\t\t}\n\n\t\t// Add all meshes in the CharModel to the class instance.\n\t\tfor (let shapeType = 0; shapeType < CharModel.FFLiShapeType.MAX; shapeType++) {\n\t\t\t// Iterate through all DrawParams and convert to THREE.Mesh.\n\t\t\tconst ptr = this._model.getDrawParamPtr(shapeType);\n\t\t\tconst drawParam = new DrawParam(module.HEAPU8, ptr);\n\n\t\t\t// Skip shape if it's not empty.\n\t\t\tif (!drawParam.primitiveParam.indexCount) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst mesh = drawParam.toMesh(this._materialClass,\n\t\t\t\tmodule, this._textureManager);\n\t\t\t// Use FFLModulateType to indicate render order.\n\t\t\tmesh.renderOrder = drawParam.modulateParam.type + 1;\n\t\t\t// renderOrder = 0 is sometimes unexpected, so let's make this one-indexed.\n\n\t\t\t// Assign colorInfo from the CharModel.\n\t\t\tif ('colorInfo' in mesh.material) {\n\t\t\t\tmesh.material.colorInfo = colorInfo;\n\t\t\t}\n\n\t\t\t// Set faceline and mask meshes to use later.\n\t\t\tswitch (shapeType) {\n\t\t\t\tcase CharModel.FFLiShapeType.OPA_FACELINE:\n\t\t\t\t\t/** @private */\n\t\t\t\t\tthis._facelineMesh = mesh;\n\t\t\t\t\tbreak;\n\t\t\t\tcase CharModel.FFLiShapeType.XLU_MASK:\n\t\t\t\t\t/** @private */\n\t\t\t\t\tthis._maskMesh = mesh;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// mesh.name = Object.keys(FFLiShapeType)[shapeType];\n\n\t\t\tthis.meshes.add(mesh); // Add the mesh or null.\n\t\t}\n\t}\n\n\t/**\n\t * Calculates the bounding box from the meshes.\n\t * @returns {THREE.Box3} The bounding box.\n\t * @private\n\t */\n\t_getBoundingBox() {\n\t\t// Note: FFL includes three different bounding boxes for each\n\t\t// FFLModelType. This only creates one box per CharModel.\n\t\tconst excludeFromBox = /* @__PURE__ */ new Set([\n\t\t\tFFLModulateType.SHAPE_MASK, FFLModulateType.SHAPE_GLASS]);\n\t\t// Create bounding box selectively excluding mask and glass.\n\t\tconst box = /* @__PURE__ */ new THREE.Box3();\n\n\t\tfor (const child of /** @type {Array<THREE.Mesh>} */ (this.meshes.children)) {\n\t\t\t// Exclude meshes whose modulateType are in excludeFromBox.\n\t\t\tif (excludeFromBox.has(child.geometry.userData.modulateType)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\t// Expand the box.\n\t\t\tbox.expandByObject(child);\n\t\t}\n\n\t\treturn box;\n\t}\n\n\t/**\n\t * @returns {THREE.Color} The favorite color as THREE.Color.\n\t * @private\n\t */\n\t_getFavoriteColor() {\n\t\tconst mod = this._module;\n\t\tconst favoriteColor = this.charInfo.favoriteColor;\n\t\t/** Allocate return pointer. */\n\t\tconst colorPtr = mod._malloc(FFLColor_size);\n\t\tmod._FFLGetFavoriteColor(colorPtr, favoriteColor); // Get favoriteColor from CharInfo.\n\t\tconst color = _getFFLColor(mod.HEAPF32, colorPtr);\n\t\tmod._free(colorPtr);\n\t\treturn color;\n\t}\n\n\t/**\n\t * Frees and deletes the FFLCharModel, which can be done after rendering textures.\n\t * This is not the same as `dispose()` which cleans up the scene.\n\t * @private\n\t */\n\t_finalizeCharModel() {\n\t\tif (this._ptr) {\n\t\t\tthis._module._FFLDeleteCharModel(this._ptr);\n\t\t\tthis._module._free(this._ptr);\n\t\t\tthis._ptr = 0;\n\t\t}\n\t\t// @ts-expect-error - null not assignable. Always non-null except disposed.\n\t\tthis._model = null;\n\t}\n\n\t/**\n\t * Sets the faceline texture from the RenderTarget.\n\t * @param {THREE.RenderTarget} target - RenderTarget for the faceline texture.\n\t * @throws {Error} CharModel must be initialized with OPA_FACELINE in meshes.\n\t * @private\n\t */\n\t_setFaceline(target) {\n\t\tconsole.assert(target && target.texture, '_setFaceline: passed in RenderTarget is invalid');\n\t\tthis._facelineTarget = target; // Store for later disposal.\n\t\tif (this._isTexOnly) {\n\t\t\treturn;\n\t\t}\n\t\tconst mesh = /** @type {THREE.Mesh<THREE.BufferGeometry, THREE.MeshBasicMaterial>} */\n\t\t\t(this._facelineMesh);\n\t\tconsole.assert(mesh, '_setFaceline: faceline shape does not exist');\n\n\t\t// Update texture and material.\n\t\t/** @type {THREE.Texture & {_target: THREE.RenderTarget}} */ (target.texture)\n\t\t\t._target = target;\n\t\tmesh.material.map = target.texture;\n\t\tmesh.material.needsUpdate = true;\n\t}\n}\n\n// EXPORTS: _getFFLColor, CharModel\n\n// // ---------------------------------------------------------------------\n// //  Body Related (consider moving out? maybe move getBodyScale here?)\n// // ---------------------------------------------------------------------\n// TODO PATH: src/Body.js\n\n/** @enum {number} */\nconst PantsColor = {\n\tGrayNormal: 0,\n\tBluePresent: 1,\n\tRedRegular: 2,\n\tGoldSpecial: 3\n};\n\n/** @type {Object<PantsColor, THREE.Color>} */\nconst pantsColors = {\n\t[PantsColor.GrayNormal]: /* @__PURE__ */ new THREE.Color(0x40474E),\n\t[PantsColor.BluePresent]: /* @__PURE__ */ new THREE.Color(0x28407A),\n\t[PantsColor.RedRegular]: /* @__PURE__ */ new THREE.Color(0x702015),\n\t[PantsColor.GoldSpecial]: /* @__PURE__ */ new THREE.Color(0xC0A030)\n};\n\n// // ---------------------------------------------------------------------\n// //  CharModelAccessor for Model Internals\n// // ---------------------------------------------------------------------\n// TODO PATH: src/CharModelAccessor.js\n\n/** @package */\nconst FFLDrawParam_size = 104;\n\n/** @package */\nclass CharModelAccessor {\n\t/**\n\t * @param {Module} module - The Emscripten module.\n\t * @param {number} ptr - Pointer to the type.\n\t * @param {FFLCharModelDesc} desc - FFLCharModelDesc\n\t */\n\tconstructor(module, ptr, desc) {\n\t\t/** @private */\n\t\tthis._module = module;\n\t\t/** @private */\n\t\tthis._dv = new DataView(module.HEAPU8.buffer, ptr);\n\t\t/** @public */\n\t\tthis.ptr = ptr;\n\t\t/** @public */\n\t\tthis.modelDesc = desc;\n\t}\n\n\t// charInfo\n\n\tgetCharInfo() {\n\t\treturn _unpackFFLiCharInfo(this._module.HEAPU8, this.ptr/* charInfo = offset 0 */);\n\t}\n\n\t// charModelDesc (resolution, expression, modelFlag), expression\n\n\t/**\n\t * Get the texture resolution.\n\t * @returns {number} The texture resolution.\n\t * @package\n\t */\n\tgetResolution() {\n\t\treturn this.modelDesc.resolution & 0x3fffffff; // FFL_RESOLUTION_MASK\n\t}\n\n\t/**\n\t * @returns {number} Pointer to charModelDesc.allExpressionFlag.\n\t * @public\n\t */\n\tgetExpressionFlagPtr() {\n\t\treturn this.ptr + 0x120 /* charModelDesc */ + 4/* allExpressionFlag */;\n\t}\n\n\t/**\n\t * Returns the value for whether the CharModel was created without shapes.\n\t * @returns {boolean} Whether the CharModel was created without shapes.\n\t * @package\n\t */\n\tisTexOnly() {\n\t\treturn (this.modelDesc.modelFlag & FFLModelFlag.NEW_MASK_ONLY) !== 0;\n\t}\n\n\t/**\n\t * @returns {number} The current expression for this CharModel.\n\t * @public\n\t */\n\tgetExpression() {\n\t\treturn this._dv.getUint32(0x138, true);\n\t}\n\n\t// pTextureTempObject\n\n\tgetTempObjectPtr() {\n\t\treturn this._dv.getUint32(0x013c, true); // pTextureTempObject\n\t}\n\n\t/**\n\t * @returns {number} Pointer to pTextureTempObject->facelineTexture.\n\t * @public\n\t */\n\tgetFacelineTempObjectPtr() {\n\t\treturn this.getTempObjectPtr() + 0x388/* facelineTexture */;\n\t}\n\n\t/**\n\t * @returns {number} Pointer to pTextureTempObject->maskTextures.\n\t * @public\n\t */\n\tgetMaskTempObjectPtr() {\n\t\treturn this.getTempObjectPtr(); // offset of maskTextures is 0\n\t}\n\n\t/**\n\t * @returns {Uint32Array} Array of pointers to DrawParams for each expression's mask.\n\t * @public\n\t */\n\tgetMaskDrawParamPtrs() {\n\t\t/** offset = maskTextures (0)->pRawMaskDrawParam */\n\t\tconst ptr = this.getTempObjectPtr() + 0x154;\n\t\t// pRawMaskDrawParam = void*[FFL_EXPRESSION_MAX]\n\t\treturn new Uint32Array(this._module.HEAPU8.buffer, ptr, FFLExpression.MAX);\n\t}\n\n\t// drawParam\n\n\t/**\n\t * @param {number} shapeType - FFLiShapeType\n\t * @returns {number} Pointer to the FFLDrawParam.\n\t */\n\tgetDrawParamPtr(shapeType) {\n\t\treturn this.ptr + 0x0140 /* drawParam */ + (FFLDrawParam_size * shapeType);\n\t}\n\n\t// maskTextures\n\n\t/**\n\t * @returns {Uint32Array} Pointers to FFLiRenderTexture for each mask's expression.\n\t * @public\n\t */\n\tgetMaskRenderTextures() {\n\t\tconst pRenderTextures = new Uint32Array(FFLExpression.MAX);\n\t\tfor (let i = 0; i < FFLExpression.MAX; i++) {\n\t\t\tpRenderTextures[i] = this._dv.getUint32(0x66c + // maskTextures->pRenderTextures\n\t\t\t\t(4 * i), true);\n\t\t}\n\t\treturn pRenderTextures;\n\t}\n\n\t// partsTransform\n\n\t/**\n\t * PartsTransform with THREE.Vector3 type.\n\t * @typedef {Object<string, THREE.Vector3>} PartsTransform\n\t * @property {THREE.Vector3} hatTranslate\n\t * @property {THREE.Vector3} headFrontRotate\n\t * @property {THREE.Vector3} headFrontTranslate\n\t * @property {THREE.Vector3} headSideRotate\n\t * @property {THREE.Vector3} headSideTranslate\n\t * @property {THREE.Vector3} headTopRotate\n\t * @property {THREE.Vector3} headTopTranslate\n\t * @public\n\t */\n\t/**\n\t * Accesses partsTransform in FFLiCharModel,\n\t * converting every FFLVec3 to THREE.Vector3.\n\t * @returns {PartsTransform} PartsTransform using THREE.Vector3 as keys.\n\t * @public\n\t */\n\tgetPartsTransform() {\n\t\tconst array = new Float32Array(this._module.HEAPU8.buffer, this.ptr + 0x7a8);\n\t\tconst getVec3 = (/** @type {number} */ offset) =>\n\t\t\tnew THREE.Vector3().fromArray(array, offset);\n\t\treturn {\n\t\t\thatTranslate: getVec3(0),\n\t\t\theadFrontRotate: getVec3(3),\n\t\t\theadFrontTranslate: getVec3(6),\n\t\t\theadSideRotate: getVec3(9),\n\t\t\theadSideTranslate: getVec3(12),\n\t\t\theadTopRotate: getVec3(15),\n\t\t\theadTopTranslate: getVec3(18)\n\t\t};\n\t}\n}\n\n// EXPORTS: CharModelAccessor, FFLDrawParam_size\n\n// // ---------------------------------------------------------------------\n// //  CharModel Creation Parameters\n// // ---------------------------------------------------------------------\n// TODO PATH: src/CharModelCreateParam.js\n\n/** @typedef {FFLCharModelDesc|Array<FFLExpression>|FFLExpression|Uint32Array|null} CharModelDescOrExpressionFlag */\n\nconst FFLCharModelSource_size = 10;\n/**\n * @typedef {Object} FFLCharModelSource\n * @property {number} dataSource - Originally FFLDataSource enum.\n * @property {number} pBuffer\n * @property {number} index - Only for default, official, MiddleDB; unneeded for raw data\n */\n\n/**\n * NOTE: FFLResourceType has been removed from here.\n * @typedef {Object} FFLCharModelDesc\n * @property {number} resolution - Texture resolution for faceline/mask. It's recommended to only use powers of two.\n * @property {Uint32Array} allExpressionFlag - Expression flag, created by {@link makeExpressionFlag}\n * @property {FFLModelFlag} modelFlag\n */\n\n/**\n * Converts the input data and allocates it into FFLCharModelSource.\n * Note that this allocates pBuffer so you must free it when you are done.\n * @param {ConstructorParameters<typeof CharModel>[1]} data - Data input.\n * @param {Module} module - Module to allocate and access the buffer through.\n * @returns {FFLCharModelSource} The CharModelSource with the data specified.\n * @throws {Error} data must be Uint8Array. Data must be a known type.\n * @package\n * @todo TODO: This used to support FFLiCharInfo as an object. Should it still do so?\n */\nfunction _allocateModelSource(data, module) {\n\t/** Allocate maximum size. */\n\tconst bufferPtr = module._malloc(FFLiCharInfo_size);\n\n\t// Create modelSource.\n\tconst modelSource = {\n\t\t// FFLDataSource.BUFFER (5) = copies and verifies\n\t\t// FFLDataSource.DIRECT_POINTER (6) = use without verification.\n\t\tdataSource: 6, // DIRECT_POINTER - Takes FFLiCharInfo.\n\t\tpBuffer: bufferPtr,\n\t\tindex: 0 // unneeded for raw data\n\t};\n\n\t// module._FFLiGetRandomCharInfo(bufferPtr, FFLGender.FEMALE, FFLAge.ALL, FFLRace.WHITE); return modelSource;\n\n\t// Check type of data.\n\t/*\n\tif (!(data instanceof Uint8Array)) {\n\t\ttry {\n\t\t\tif (typeof data !== 'object') {\n\t\t\t\tthrow new Error('_allocateModelSource: data passed in is not FFLiCharInfo object or Uint8Array');\n\t\t\t}\n\t\t\t// Assume that this is FFLiCharInfo as an object.\n\t\t\t// Deserialize to Uint8Array.\n\t\t\tdata = FFLiCharInfo.pack(data);\n\t\t} catch (e) {\n\t\t\tmodule._free(bufferPtr);\n\t\t\tthrow e;\n\t\t}\n\t}\n\t*/\n\n\t/** @param {Uint8Array} src - Source data in StudioCharInfo format. */\n\tfunction setStudioData(src) {\n\t\t// studio raw, decode it to charinfo\n\t\tconst charInfoData = _studioToFFLiCharInfo(src);\n\t\tmodule.HEAPU8.set(charInfoData, bufferPtr);\n\t}\n\n\t/**\n\t * Gets CharInfo from calling a function.\n\t * @param {Uint8Array} data - The input data.\n\t * @param {number} size - The size to allocate.\n\t * @param {string} funcName - The function on the module to call.\n\t * @throws {Error} Throws if the function returned false.\n\t * @private\n\t */\n\tfunction callGetCharInfoFunc(data, size, funcName) {\n\t\tconst dataPtr = module._malloc(size);\n\t\tmodule.HEAPU8.set(data, dataPtr);\n\t\t// @ts-ignore - Module cannot be indexed by string. NOTE: The function MUST exist.\n\t\tconst result = module[funcName](bufferPtr, dataPtr);\n\t\tmodule._free(dataPtr);\n\t\tif (!result) {\n\t\t\tmodule._free(bufferPtr);\n\t\t\tthrow new Error(`_allocateModelSource: call to ${funcName} returned false, CharInfo verification probably failed`);\n\t\t}\n\t}\n\n\t// data should be Uint8Array at this point.\n\n\t// Enumerate through supported data types.\n\tswitch (data.length) {\n\t\tcase FFLStoreData_size: { // sizeof(FFLStoreData)\n\t\t\t// modelSource.dataSource = FFLDataSource.STORE_DATA;\n\t\t\t// Convert FFLStoreData to FFLiCharInfo instead.\n\t\t\tcallGetCharInfoFunc(data, FFLStoreData_size, '_FFLpGetCharInfoFromStoreData');\n\t\t\tbreak;\n\t\t}\n\t\tcase 74: // sizeof(RFLCharData)\n\t\tcase 76: { // sizeof(RFLStoreData)\n\t\t\tcallGetCharInfoFunc(data, 74, '_FFLpGetCharInfoFromMiiDataOfficialRFL');\n\t\t\tbreak;\n\t\t}\n\t\tcase FFLiCharInfo_size:\n\t\t\t// modelSource.dataSource = FFLDataSource.BUFFER; // Default option.\n\t\t\tmodule.HEAPU8.set(data, bufferPtr); // Copy data into heap.\n\t\t\tbreak;\n\t\tcase 46 + 1: {\n\t\t\t// studio data obfuscated\n\t\t\tdata = _studioURLObfuscationDecode(data);\n\t\t\tsetStudioData(data);\n\t\t\tbreak;\n\t\t}\n\t\tcase 46: {\n\t\t\t// studio data raw\n\t\t\tsetStudioData(data);\n\t\t\tbreak;\n\t\t}\n\t\t// Unsupported types.\n\t\tcase 88:\n\t\t\tthrow new Error('_allocateModelSource: NX CharInfo is not supported.');\n\t\t\t// module.HEAPU8.set(_nxCharInfoToFFLiCharInfo(data), bufferPtr);\n\t\t\t// break;\n\t\tcase 48:\n\t\tcase 68:\n\t\t\tthrow new Error('_allocateModelSource: NX CoreData/StoreData is not supported.');\n\t\tcase 92:\n\t\tcase 72:\n\t\t\tthrow new Error('_allocateModelSource: Input needs to be padded to 96 bytes with checksum (FFLStoreData).');\n\t\tdefault: {\n\t\t\tmodule._free(bufferPtr);\n\t\t\tthrow new Error(`_allocateModelSource: Unknown length for character data: ${data.length}`);\n\t\t}\n\t}\n\n\treturn modelSource; // NOTE: pBuffer must be freed.\n}\n\n/**\n * Static default for FFLCharModelDesc.\n * @type {FFLCharModelDesc}\n * @readonly\n * @public\n */\nconst FFLCharModelDescDefault = {\n\t/** Typical default. */\n\tresolution: 512,\n\t/** Normal expression. */\n\tallExpressionFlag: new Uint32Array([1, 0, 0]),\n\tmodelFlag: FFLModelFlag.NORMAL\n};\n\n/**\n * Creates an expression flag to be used in FFLCharModelDesc.\n * Use this whenever you need to describe which expression,\n * or expressions, you want to be able to use in the CharModel.\n * @param {Array<FFLExpression>|FFLExpression} expressions - Either a single expression\n * index or an array of expression indices. See {@link FFLExpression} for min/max.\n * @returns {Uint32Array} FFLAllExpressionFlag type of three 32-bit integers.\n * @throws {Error} expressions must be in range and less than {@link FFLExpression.MAX}.\n */\nfunction makeExpressionFlag(expressions) {\n\t/**\n\t * @param {FFLExpression} i - Expression index to check.\n\t * @throws {Error} input out of range\n\t */\n\tfunction checkRange(i) {\n\t\tif (i >= FFLExpression.MAX) {\n\t\t\tthrow new Error(`makeExpressionFlag: input out of range: got ${i}, max: ${FFLExpression.MAX}`);\n\t\t}\n\t}\n\n\t/** FFLAllExpressionFlag */\n\tconst flags = /* @__PURE__ */ new Uint32Array([0, 0, 0]);\n\tlet checkForChangeShapes = true;\n\n\t// Set single expression.\n\tif (typeof expressions === 'number') {\n\t\t// Make expressions into an array.\n\t\texpressions = [expressions];\n\t\tcheckForChangeShapes = false; // Single expression, do not check this\n\t\t// Fall-through.\n\t} else if (!Array.isArray(expressions)) {\n\t\tthrow new TypeError('makeExpressionFlag: expected array or single number');\n\t}\n\n\t// Set multiple expressions in an array.\n\tfor (const index of expressions) {\n\t\tcheckRange(index);\n\t\tif (checkForChangeShapes) {\n\t\t\tcheckExpressionChangesShapes(index, true); // Warn if the expression changes shapes.\n\t\t}\n\t\t/** Determine which 32-bit block. */\n\t\tconst part = Math.floor(index / 32);\n\t\t/** Determine the bit within the block. */\n\t\tconst bitIndex = index % 32;\n\n\t\tflags[part] |= (1 << bitIndex); // Set the bit.\n\t}\n\treturn flags;\n}\n\n/**\n * Checks if the expression index disables any shapes in the\n * CharModel, meant to be used when setting multiple indices.\n * @param {FFLExpression} i - Expression index to check.\n * @param {boolean} [warn] - Whether to log using {@link console.warn}.\n * @returns {boolean} Whether the expression changes shapes.\n */\nfunction checkExpressionChangesShapes(i, warn = false) {\n\t/** Expressions disabling nose: dog/cat, blank */\n\tconst expressionsDisablingNose = /* @__PURE__ */ new Set([49, 50, 51, 52, 61, 62]);\n\t/** Expressions disabling mask: blank */\n\tconst expressionsDisablingMask = /* @__PURE__ */ new Set([61, 62]);\n\n\tconst prefix = `checkExpressionChangesShapes: An expression was enabled (${i}) that is meant to disable nose or mask shape for the entire CharModel, so it is only recommended to set this as a single expression rather than as one of multiple.`;\n\tif (expressionsDisablingMask.has(i)) {\n\t\twarn && console.warn(`${prefix} (in this case, MASK SHAPE so there is supposed to be NO FACE)`);\n\t\treturn true;\n\t}\n\tif (expressionsDisablingNose.has(i)) {\n\t\twarn && console.warn(`${prefix} (nose shape)`);\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\n// EXPORT: FFLCharModelDescDefault, _allocateModelSource, checkExpressionChangesShapes, makeExpressionFlag\n\n// // ---------------------------------------------------------------------\n// //  DrawParam Reading\n// // ---------------------------------------------------------------------\n// TODO PATH: src/DrawParam.js\n\n/**\n * @param {Function} material - Class constructor for the material to test.\n * @returns {boolean} Whether or not the material class supports FFL swizzled (modulateMode) textures.\n * @public\n */\nconst matSupportsFFL = material => 'modulateMode' in material.prototype;\n\n/**\n * Interprets and converts FFLDrawParam, which\n * represents a mesh/draw call, for use with Three.js.\n * @package\n */\nclass DrawParam {\n\t// Define FFL types needed.\n\n\t/** @private */\n\tstatic FFLAttributeBufferType = {\n\t\tPOSITION: 0,\n\t\tTEXCOORD: 1,\n\t\tNORMAL: 2,\n\t\tTANGENT: 3,\n\t\tCOLOR: 4,\n\t\tMAX: 5\n\t};\n\t/**\n\t * @typedef {Object} FFLAttributeBuffer\n\t * @property {number} size\n\t * @property {number} stride\n\t * @property {number} ptr\n\t */\n\t/**\n\t * @typedef {Object} FFLModulateParam\n\t * @property {FFLModulateMode} mode\n\t * @property {FFLModulateType} type\n\t * @property {number} pColorR - Pointer to FFLColor\n\t * @property {number} pColorG - Pointer to FFLColor\n\t * @property {number} pColorB - Pointer to FFLColor\n\t * @property {number} pTexture2D\n\t */\n\t/**\n\t * @typedef {Object} FFLPrimitiveParam\n\t * @property {number} primitiveType\n\t * @property {number} indexCount\n\t * @property {number} pAdjustMatrix\n\t * @property {number} pIndexBuffer\n\t */\n\t/**\n\t * @typedef {Object} FFLDrawParam\n\t * @property {Array<FFLAttributeBuffer>} attributeBuffers\n\t * @property {FFLModulateParam} modulateParam\n\t * @property {number} cullMode\n\t * @property {FFLPrimitiveParam} primitiveParam\n\t * @private\n\t */\n\n\t// Public methods to unpack and convert DrawParam.\n\n\t/**\n\t * @param {Uint8Array} u8 - module.HEAPU8\n\t * @param {number} ptr - Pointer to the FFLDrawParam.\n\t */\n\tconstructor(u8, ptr) {\n\t\t// _unpackFFLDrawParam\n\t\tconst view = new DataView(u8.buffer, ptr);\n\t\tconst FFLAttributeBuffer_size = 12;\n\t\tthis.attributeBuffers = Array.from({ length: DrawParam.FFLAttributeBufferType.MAX });\n\t\tfor (let i = 0; i < this.attributeBuffers.length; i++) {\n\t\t\tthis.attributeBuffers[i] = {\n\t\t\t\tsize: view.getUint32((i * FFLAttributeBuffer_size) + 0, true),\n\t\t\t\tstride: view.getUint32((i * FFLAttributeBuffer_size) + 4, true),\n\t\t\t\tptr: view.getUint32((i * FFLAttributeBuffer_size) + 8, true)\n\t\t\t};\n\t\t}\n\t\tthis.modulateParam = {\n\t\t\tmode: view.getUint32(60, true),\n\t\t\ttype: view.getUint32(60 + 4, true),\n\t\t\tpColorR: view.getUint32(60 + 8, true),\n\t\t\tpColorG: view.getUint32(60 + 12, true),\n\t\t\tpColorB: view.getUint32(60 + 16, true),\n\t\t\tpTexture2D: view.getUint32(60 + 20, true)\n\t\t};\n\t\tthis.primitiveParam = {\n\t\t\tprimitiveType: view.getUint32(88, true),\n\t\t\tindexCount: view.getUint32(88 + 4, true),\n\t\t\tpAdjustMatrix: view.getUint32(88 + 8, true),\n\t\t\tpIndexBuffer: view.getUint32(88 + 12, true)\n\t\t};\n\t\tthis.cullMode = view.getUint32(84, true);\n\t}\n\n\t/**\n\t * Converts FFLDrawParam into a THREE.Mesh.\n\t * Binds geometry, texture, and material parameters.\n\t * @param {MaterialConstructor} materialClass - Class for the material (constructor).\n\t * @param {Module} module - The Emscripten module.\n\t * @param {TextureManager} texManager - The {@link TextureManager} instance\n\t * for which to look for textures referenced by the DrawParam.\n\t * @returns {THREE.Mesh} The THREE.Mesh instance.\n\t * @public\n\t */\n\ttoMesh(materialClass, module, texManager) {\n\t\tconsole.assert(texManager, 'DrawParam.toMesh: Passed in TextureManager is null or undefined, is it constructed?');\n\t\tconsole.assert(typeof materialClass === 'function', 'DrawParam.toMesh: materialClass is unexpectedly not a function.');\n\n\t\t// Skip if the index count is 0, indicating no shape data.\n\t\tconsole.assert(this.primitiveParam.indexCount, 'DrawParam.toMesh: Index count is 0, indicating shape is empty. Check that before it gets passed into this function.');\n\n\t\t// Bind geometry data.\n\t\tconst geometry = DrawParam._bindDrawParamGeometry(this.attributeBuffers,\n\t\t\tthis.primitiveParam, module);\n\n\t\t// HACK: Allow the material class to modify the geometry if it needs to.\n\t\tif ('modifyBufferGeometry' in materialClass && // Static function\n\t\t\ttypeof materialClass.modifyBufferGeometry === 'function') {\n\t\t\tmaterialClass.modifyBufferGeometry(this, geometry);\n\t\t}\n\n\t\t// Determine cull mode by mapping FFLCullMode to THREE.Side.\n\t\t/** @type {Array<THREE.Side>} */\n\t\tconst cullModeToThreeSide = [\n\t\t\tTHREE.DoubleSide, // NONE\n\t\t\tTHREE.FrontSide, // BACK\n\t\t\tTHREE.BackSide, // FRONT\n\t\t\t// Used by faceline/mask 2D planes for some reason:\n\t\t\tTHREE.DoubleSide // MAX\n\t\t];\n\t\tconst side = cullModeToThreeSide[this.cullMode];\n\t\tconsole.assert(side !== undefined, `DrawParam.toMesh: Unexpected value for FFLCullMode: ${this.cullMode}`);\n\t\t// Get texture.\n\t\tconst texture = DrawParam._getTextureFromModulateParam(this.modulateParam, texManager);\n\n\t\t// Apply modulateParam material parameters.\n\t\tconst isFFLMaterial = matSupportsFFL(materialClass);\n\t\tconst params = DrawParam._applyModulateParam(this.modulateParam, module, isFFLMaterial);\n\t\t// Create object for material parameters.\n\t\tconst materialParam = {\n\t\t\tside: side,\n\t\t\t// Apply texture.\n\t\t\tmap: texture,\n\t\t\t...params\n\t\t};\n\n\t\t// Special case for if tangent (NEEDED for anisotropic) is missing, and...\n\t\tif (geometry.attributes.tangent === undefined && // \"_color\" can be tested too.\n\t\t\t// ... material is FFLShaderMaterial. Which is the only one using that attribute.\n\t\t\t'useSpecularModeBlinn' in materialClass.prototype) {\n\t\t\t/** @type {import('./materials/FFLShaderMaterial.js').FFLShaderMaterialParameters} */\n\t\t\t(materialParam).useSpecularModeBlinn = true;\n\t\t}\n\n\t\t// Create material using the provided materialClass.\n\t\tconst material = new materialClass(materialParam);\n\t\t// Create mesh and set userData.modulateType.\n\t\tconst mesh = new THREE.Mesh(geometry, material);\n\n\t\t// Apply pAdjustMatrix transformations if it is not null.\n\t\tconst pMtx = this.primitiveParam.pAdjustMatrix;\n\t\tif (pMtx !== 0) {\n\t\t\tDrawParam._applyAdjustMatrixToMesh(pMtx, mesh, module.HEAPF32);\n\t\t}\n\n\t\t// Set properties that can be used to reconstruct the material in userData.\n\t\t// NOTE: These are only in geometry (primitive) because FFL-Testing does the same, see:\n\t\t// https://github.com/ariankordi/FFL-Testing/blob/2219f64473ac8312bab539cd05c00f88c14d2ffd/src/GLTFExportCallback.cpp#L828\n\t\tif (mesh.geometry.userData) {\n\t\t\t// Set modulateMode/modulateType (not modulateColor or cullMode).\n\t\t\tmesh.geometry.userData.modulateMode = this.modulateParam.mode;\n\t\t\tmesh.geometry.userData.modulateType = this.modulateParam.type;\n\t\t\t// Note that color is a part of THREE.Material and will most always be there\n\t\t\tmesh.geometry.userData.modulateColor = params.color instanceof THREE.Color\n\t\t\t\t? [params.color.r, params.color.g, params.color.b, 1]\n\t\t\t\t: [1, 1, 1, 1];\n\t\t\tmesh.geometry.userData.cullMode = this.cullMode;\n\t\t}\n\t\treturn mesh;\n\t}\n\n\t// Private methods.\n\n\t/**\n\t * Binds attributes from DrawParam into a new THREE.BufferGeometry.\n\t * @param {Array<FFLAttributeBuffer>} attributes - {@link FFLDrawParam.attributeBuffers}\n\t * @param {FFLPrimitiveParam} primitiveParam - {@link FFLDrawParam.primitiveParam}\n\t * @param {Module} module - The Emscripten module from which to read the heap.\n\t * @param {THREE.BufferGeometry} [geometry] - The BufferGeometry to populate.\n\t * @returns {THREE.BufferGeometry} The populated BufferGeometry.\n\t * @private\n\t */\n\tstatic _bindDrawParamGeometry(attributes, primitiveParam, module,\n\t\tgeometry = new THREE.BufferGeometry()) {\n\t\t// Bind indices.\n\t\tconst indexPtr = primitiveParam.pIndexBuffer / 2;\n\t\tconst indices = module.HEAPU16.slice(\n\t\t\tindexPtr, indexPtr + primitiveParam.indexCount);\n\t\tgeometry.setIndex(new THREE.Uint16BufferAttribute(indices, 1));\n\n\t\t// Assign short names to each attribute buffer.\n\t\tconst bt = DrawParam.FFLAttributeBufferType;\n\t\tconst pos = attributes[bt.POSITION];\n\t\tconsole.assert(pos.size, '_bindDrawParamGeometry: Position buffer must not be empty.');\n\t\t/** Whether or not attributes are using float16 format. */\n\t\tconst isHalfFloat = pos.stride < 16;\n\t\t// NOTE: The float16 format used has 3 components, which\n\t\t// is not actually a supported configuration for WebGPU. Whoops!\n\n\t\tconst txc = attributes[bt.TEXCOORD];\n\t\tconst nrm = attributes[bt.NORMAL];\n\t\tconst tan = attributes[bt.TANGENT];\n\t\tconst col = attributes[bt.COLOR];\n\n\t\t// Position: 3 floats with last 4 bytes unused.\n\t\tconst posEnd = pos.ptr + pos.size;\n\t\tconst posAttribute = isHalfFloat\n\t\t\t? new THREE.Float16BufferAttribute(\n\t\t\t\tmodule.HEAPU16.slice(pos.ptr / 2, posEnd / 2), 3)\n\t\t\t: new THREE.InterleavedBufferAttribute(\n\t\t\t\tnew THREE.InterleavedBuffer(\n\t\t\t\t\tmodule.HEAPF32.slice(pos.ptr / 4, posEnd / 4), 4), 3, 0);\n\t\t// Only works on Three.js r109 and above (previously used addAttribute which can be remapped)\n\t\tgeometry.setAttribute('position', posAttribute);\n\n\t\t// Texcoord: 2 floats.\n\t\tif (txc.size) {\n\t\t\tconst end = txc.ptr + txc.size;\n\t\t\tconst attr = isHalfFloat\n\t\t\t\t? new THREE.Float16BufferAttribute(\n\t\t\t\t\tmodule.HEAPU16.slice(txc.ptr / 2, end / 2), 2)\n\t\t\t\t: new THREE.Float32BufferAttribute(\n\t\t\t\t\tmodule.HEAPF32.slice(txc.ptr / 4, end / 4), 2);\n\t\t\tgeometry.setAttribute('uv', attr);\n\t\t}\n\n\t\t// Normal: Converted by FFL to R8_G8_B8_A8_SNORM.\n\t\t// May be usable directly as GL_INT_2_10_10_10_REV / 0x8D9F\n\t\t// using THREE.GLBufferAttribute on WebGL 2.\n\t\tif (nrm.size) {\n\t\t\tgeometry.setAttribute('normal', new THREE.Int8BufferAttribute(\n\t\t\t\tmodule.HEAP8.slice(nrm.ptr, nrm.ptr + nrm.size),\n\t\t\t\tnrm.stride, true));\n\t\t}\n\n\t\t// Tangent: R8_G8_B8_A8_SNORM.\n\t\tif (tan.size) {\n\t\t\tgeometry.setAttribute('tangent', new THREE.Int8BufferAttribute(\n\t\t\t\tmodule.HEAP8.slice(tan.ptr, tan.ptr + tan.size),\n\t\t\t\ttan.stride, true));\n\t\t}\n\n\t\t// Color: R8_G8_B8_A8_UNORM.\n\t\t// The buffer is only present if stride is greater than 0.\n\t\tif (col.size && col.stride > 0) {\n\t\t\t// Use \"_color\" because NOTE this is what the FFL-Testing exports and existing shaders do\n\t\t\tgeometry.setAttribute('_color', new THREE.Uint8BufferAttribute(\n\t\t\t\tmodule.HEAPU8.slice(col.ptr, col.ptr + col.size),\n\t\t\t\tcol.stride, true));\n\t\t\t// Does not handle values for u_color other\n\t\t\t// than the default 0/0/0/1 (custom u_parameter_mode).\n\t\t}\n\n\t\treturn geometry;\n\t}\n\n\t/**\n\t * Retrieves a texture from ModulateParam.\n\t * Does not assign texture for faceline or mask types.\n\t * @param {FFLModulateParam} modulateParam - drawParam.modulateParam.\n\t * @param {TextureManager} textureManager - The {@link TextureManager} instance\n\t * for which to look for the texture referenced.\n\t * @returns {THREE.Texture|null} The texture if found.\n\t * @private\n\t */\n\tstatic _getTextureFromModulateParam(modulateParam, textureManager) {\n\t\t// Only assign texture if pTexture2D is not null.\n\t\tif (!modulateParam.pTexture2D ||\n\t\t\t// The pointer will be set to just \"1\" for\n\t\t\t// faceline and mask textures that are supposed\n\t\t\t// to be targets (FFL_TEXTURE_PLACEHOLDER, FFLI_RENDER_TEXTURE_PLACEHOLDER)\n\t\t\tmodulateParam.pTexture2D === 1) {\n\t\t\treturn null; // No texture to bind.\n\t\t}\n\t\tconst texturePtr = modulateParam.pTexture2D;\n\t\tconst texture = /** @type {THREE.Texture} */ (textureManager.get(texturePtr));\n\t\tconsole.assert(texture, `_getTextureFromModulateParam: Texture not found for ${texturePtr}.`);\n\t\t// Selective apply mirrored repeat (not supported on NPOT/mipmap textures for WebGL 1.0)\n\t\tconst applyMirrorTypes = /* @__PURE__ */ new Set([FFLModulateType.SHAPE_FACELINE,\n\t\t\tFFLModulateType.SHAPE_CAP, FFLModulateType.SHAPE_GLASS]);\n\t\t// ^^ Faceline, cap, and glass. NOTE that faceline texture won't go through here\n\t\tif (applyMirrorTypes.has(modulateParam.type)) {\n\t\t\ttexture.wrapS = THREE.MirroredRepeatWrapping;\n\t\t\ttexture.wrapT = THREE.MirroredRepeatWrapping;\n\t\t\ttexture.needsUpdate = true;\n\t\t}\n\t\treturn texture;\n\t}\n\n\t/* eslint-disable jsdoc/require-returns-type -- Allow TS to predict return type. */\n\t/**\n\t * Retrieves blending parameters based on the FFLModulateType.\n\t * Will only actually return anything for mask and faceline shapes.\n\t * @param {FFLModulateType} modulateType - The modulate type.\n\t * @param {FFLModulateMode} [modulateMode] - The modulate mode, used to\n\t * differentiate body/pants modulate types from mask modulate types.\n\t * @returns An object containing blending parameters for\n\t * the Three.js material constructor, or an empty object.\n\t * @throws {Error} Unknown modulate type\n\t * @private\n\t */\n\tstatic _getBlendOptionsFromModulateType(modulateType, modulateMode) {\n\t\t/*\n\t\tif (modulateType >= FFLModulateType.SHAPE_FACELINE &&\n\t\t\tmodulateType <= FFLModulateType.SHAPE_CAP) {\n\t\t\t// Opaque (DrawOpa)\n\t\t\t// glTF alphaMode: OPAQUE\n\t\t\treturn {\n\t\t\t\tblending: THREE.CustomBlending,\n\t\t\t\tblendSrcAlpha: THREE.SrcAlphaFactor,\n\t\t\t\tblendDstAlpha: THREE.OneFactor\n\t\t\t};\n\t\t} else if (modulateType >= FFLModulateType.SHAPE_MASK &&\n\t\t\tmodulateType <= FFLModulateType.SHAPE_GLASS) {\n\t\t\t// Translucent (DrawXlu)\n\t\t\t// glTF alphaMode: MASK (TEXTURE_DIRECT), or BLEND (LUMINANCE_ALPHA)?\n\t\t\treturn {\n\t\t\t\tblending: THREE.CustomBlending,\n\t\t\t\tblendSrc: THREE.SrcAlphaFactor,\n\t\t\t\tblendDst: THREE.OneMinusSrcAlphaFactor,\n\t\t\t\tblendDstAlpha: THREE.OneFactor,\n\t\t\t\t// transparent: true\n\t\t\t\tdepthWrite: false // kept on inside of LUTShaderMaterial\n\t\t\t};\n\t\t} else\n\t\t*/\n\t\tif (modulateMode !== 0 && modulateType >= FFLModulateType.SHAPE_MAX &&\n\t\t\tmodulateType <= FFLModulateType.MOLE) {\n\t\t\t// Mask Textures\n\t\t\treturn {\n\t\t\t\tblending: THREE.CustomBlending,\n\t\t\t\tblendSrc: THREE.OneMinusDstAlphaFactor,\n\t\t\t\tblendSrcAlpha: THREE.SrcAlphaFactor,\n\t\t\t\tblendDst: THREE.DstAlphaFactor\n\t\t\t};\n\t\t} else if (modulateMode !== 0 && modulateType >= FFLModulateType.FACE_MAKE &&\n\t\t\tmodulateType <= FFLModulateType.FILL) {\n\t\t\t// Faceline Texture\n\t\t\treturn {\n\t\t\t\tblending: THREE.CustomBlending,\n\t\t\t\tblendSrc: THREE.SrcAlphaFactor,\n\t\t\t\tblendDst: THREE.OneMinusSrcAlphaFactor,\n\t\t\t\tblendSrcAlpha: THREE.OneFactor,\n\t\t\t\tblendDstAlpha: THREE.OneFactor\n\t\t\t};\n\t\t}\n\t\treturn {};\n\t\t// No blending options needed.\n\t\t// else {\n\t\t// \tthrow new Error(`_getBlendOptionsFromModulateType: Unknown modulate type: ${modulateType}`);\n\t\t// }\n\t}\n\n\t/**\n\t * Returns an object of parameters for a Three.js material constructor, based on {@link FFLModulateParam}.\n\t * @param {FFLModulateParam} modulateParam - Property `modulateParam` of FFLDrawParam.\n\t * @param {Module} module - The Emscripten module for accessing color pointers in heap.\n\t * @param {boolean} [forFFLMaterial] - Whether or not to include\n\t * modulateMode/Type parameters for material parameters.\n\t * @returns Parameters for creating a Three.js material.\n\t * @private\n\t */\n\tstatic _applyModulateParam(modulateParam, module, forFFLMaterial = true) {\n\t\t/* eslint-enable jsdoc/require-returns-type -- Allow TS to predict return type. */\n\t\t// Apply constant colors.\n\n\t\tconst f32 = module.HEAPF32;\n\t\tconst color = modulateParam.pColorR\n\t\t\t? _getFFLColor(f32, modulateParam.pColorR)\n\t\t\t: null;\n\n\t\t// Set transparent property for Xlu/mask and higher.\n\t\tconst transparent = modulateParam.type >= FFLModulateType.SHAPE_MASK;\n\n\t\t// Disable lighting if this is a 2D plane (mask/faceline) and not opaque (body/pants).\n\t\tconst lightEnable = !(modulateParam.type >= FFLModulateType.SHAPE_MAX &&\n\t\t\tmodulateParam.mode !== FFLModulateMode.CONSTANT);\n\n\t\t/** Do not include the parameters if forFFLMaterial is false. */\n\t\tconst modulateModeType = forFFLMaterial\n\t\t\t? {\n\t\t\t\tmodulateMode: modulateParam.mode,\n\t\t\t\tmodulateType: modulateParam.type // need this set before color.\n\t\t\t}\n\t\t\t: {};\n\n\t\t// Not applying map here, that happens in _getTextureFromModulateParam.\n\t\t/** @type {TextureShaderMaterialParameters} */\n\t\tconst param = Object.assign(modulateModeType, {\n\t\t\t// Common Three.js material parameters.\n\t\t\tcolor,\n\t\t\ttransparent: transparent,\n\t\t\t// Depth writing is disabled for DrawXlu stage however\n\t\t\t// it is kept enabled in LUTShaderMaterial because its\n\t\t\t// alpha testing chooses to not write depth. Since we are\n\t\t\t// disabling it anyway, that means shapes NEED to be in order\n\t\t\tdepthWrite: !transparent,\n\n\t\t\t// Apply blending options (for mask/faceline) based on modulateType.\n\t\t\t...DrawParam._getBlendOptionsFromModulateType(modulateParam.type, modulateParam.mode)\n\t\t});\n\n\t\tmodulateParam.pColorG && (param.colorG = _getFFLColor(f32, modulateParam.pColorG));\n\t\tmodulateParam.pColorB && (param.colorB = _getFFLColor(f32, modulateParam.pColorB));\n\n\t\t// only for mask/faceline which should not be drawn in non-ffl materials:\n\t\tif (!lightEnable) {\n\t\t\t// Only set lightEnable if it is not default.\n\t\t\t/** @type {Object<string, *>} */ (param).lightEnable = lightEnable;\n\t\t}\n\t\treturn param;\n\t}\n\n\t/**\n\t * Applies transformations in pAdjustMatrix within a FFLDrawParam to a mesh.\n\t * @param {number} pMtx - Pointer to rio::Matrix34f.\n\t * @param {THREE.Object3D} mesh - The mesh to apply transformations to.\n\t * @param {Float32Array} heapF32 - HEAPF32 buffer view within {@link Module}.\n\t * @private\n\t */\n\tstatic _applyAdjustMatrixToMesh(pMtx, mesh, heapF32) {\n\t\t// console.debug('DrawParam.toMesh: shape has pAdjustMatrix: ', m);\n\t\t// rio::Matrix34f = 12 floats\n\t\tconst m = new Float32Array(heapF32.buffer, pMtx, 12);\n\t\t// Set position and scale from matrix. (FFLiAdjustShape does no rotation)\n\t\t// Effectively decomposes the 3x4 column-major elements.\n\t\tmesh.scale.set(m[0], m[5], m[10]);\n\t\tmesh.position.set(m[3], m[7], m[11]);\n\t}\n}\n\n// // ---------------------------------------------------------------------\n// //  CharModel Render Textures\n// // ---------------------------------------------------------------------\n// TODO PATH: src/CharModelTextures.js\n\n/** @package */\nconst CharModelTextures = {\n\t/**\n\t * Initializes textures (faceline and mask) for a CharModel.\n\t * Calls private functions to draw faceline and mask textures.\n\t * At the end, calls setExpression to update the mask texture.\n\t * Note that this is a separate function due to needing renderer parameter.\n\t * @param {CharModelAccessor} charModel - FFLiCharModel representation.\n\t * @param {Renderer} renderer - The Three.js renderer.\n\t * @param {Module} module - The Emscripten module.\n\t * @param {TextureManager} texMgr - TextureManager instance for making a mesh.\n\t * @param {MaterialConstructor} matTexClass - The material class for textures.\n\t * @param {Array<THREE.RenderTarget|null>} maskTargets - Array of mask render targets to set.\n\t * @param {THREE.Color} faceColor - The faceline color.\n\t * @returns {THREE.RenderTarget|null} The faceline texture's render target.\n\t * @public\n\t */\n\tinitialize(charModel, renderer, module,\n\t\ttexMgr, matTexClass, maskTargets, faceColor) {\n\t\t// Check if the passed in renderer is valid by checking the \"render\" property.\n\t\tconsole.assert(renderer.render !== undefined,\n\t\t\t'CharModelTextures: renderer is an unexpected type (cannot find .render).');\n\n\t\tconst pRawMaskDrawParam = charModel.getMaskDrawParamPtrs();\n\n\t\t// Draw faceline texture if applicable.\n\t\tconst faceTarget = CharModelTextures._drawFacelineTexture(charModel, renderer,\n\t\t\tmodule, texMgr, faceColor, matTexClass);\n\t\t// (faceTarget) && this._setFaceline(charModel, faceTarget); // Apply texture to mesh.\n\n\t\t// Warn if renderer.alpha is not set to true.\n\t\tconst clearAlpha = renderer.getClearAlpha();\n\t\t(clearAlpha !== 0) && renderer.setClearAlpha(0); // Override clearAlpha to 0.\n\n\t\t// Draw mask textures for all expressions.\n\t\tCharModelTextures._drawMaskTextures(charModel, pRawMaskDrawParam, maskTargets,\n\t\t\trenderer, module, texMgr, matTexClass);\n\t\t// (CharModel can be finalized after this.)\n\n\t\t// Set clearAlpha back.\n\t\t(clearAlpha !== 0) && renderer.setClearAlpha(clearAlpha);\n\n\t\treturn faceTarget;\n\t},\n\n\t// Unpacking structs.\n\n\t/**\n\t * Count of parts in the FFLiFacelineTextureTempObject.\n\t * As of Nov. 2025, this is now in the order it should be drawn.\n\t * Previously it was not, requiring an enum and reordering.\n\t * @private\n\t */\n\tFacelinePartCount: 3,\n\t/**\n\t * Count of parts in the FFLiRawMaskDrawParam, also now draw order like above.\n\t * This is really 9, but \"fill\" (alpha clear) is being excluded.\n\t * @private\n\t */\n\tMaskPartCount: 8,\n\n\t/**\n\t * @param {Uint8Array} u8 - module.HEAPU8\n\t * @param {number} ptr - Pointer to the type.\n\t * @param {number} count - Length of the DrawParam array.\n\t * @returns {Array<DrawParam>} Array of DrawParams.\n\t * @private\n\t * @todo TODO: Would this unpack method\n\t * - be more appropriate in CharModelAccessor?\n\t * - rather return pointers than construct new DrawParam?\n\t */\n\t_unpackDrawParamArray(u8, ptr, count) {\n\t\tconst params = Array.from({ length: count });\n\t\tfor (let type = 0; type < count; type++) {\n\t\t\t// const p = ptr + 4 + ((4 + FFLDrawParam_size) * type);\n\t\t\t// Previously the members were not linear in a row, but now it is.\n\t\t\tconst p = ptr + (FFLDrawParam_size * type);\n\t\t\tparams[type] = new DrawParam(u8, p);\n\t\t}\n\t\treturn params;\n\t},\n\n\t// Private methods to draw individual parts.\n\n\t/**\n\t * Draws and applies the faceline texture for the CharModel.\n\t * @param {CharModelAccessor} charModel - FFLiCharModel representation.\n\t * @param {Renderer} renderer - The renderer.\n\t * @param {Module} module - The Emscripten module.\n\t * @param {TextureManager} texMgr - TextureManager instance for making a mesh.\n\t * @param {THREE.Color} color - Faceline color.\n\t * @param {MaterialConstructor} materialClass - The material class (e.g., FFLShaderMaterial).\n\t * @returns {THREE.RenderTarget|null} The faceline texture's render target.\n\t * @private\n\t */\n\t_drawFacelineTexture(charModel, renderer, module, texMgr, color, materialClass) {\n\t\t// Invalidate faceline texture before drawing (ensures correctness)\n\t\tconst facelineTempObjectPtr = charModel.getFacelineTempObjectPtr();\n\t\tmodule._FFLiInvalidateTempObjectFacelineTexture(facelineTempObjectPtr);\n\n\t\tconst params = CharModelTextures._unpackDrawParamArray(\n\t\t\tmodule.HEAPU8, facelineTempObjectPtr, CharModelTextures.FacelinePartCount);\n\t\t// Gather the drawParams that make up the faceline texture.\n\t\tconst drawParams = params.filter(dp => dp && dp.modulateParam.pTexture2D !== 0);\n\t\t// Note that for faceline DrawParams to not be empty,\n\t\t// it must have a texture. For other DrawParams to not\n\t\t// be empty they simply need to have a non-zero index count.\n\t\tif (drawParams.length === 0) {\n\t\t\t// console.debug('_drawFacelineTexture: Skipping faceline texture.');\n\t\t\treturn null;\n\t\t}\n\n\t\t// Create an offscreen scene.\n\t\tconst offscreenScene = new THREE.Scene();\n\t\toffscreenScene.background = color; // Use faceline color from CharModel.\n\n\t\tfor (const param of drawParams) {\n\t\t\toffscreenScene.add(param.toMesh(materialClass, module, texMgr));\n\t\t}\n\n\t\t// Determine if the alpha value needs to be 0.\n\t\tif ('needsFacelineAlpha' in materialClass && materialClass.needsFacelineAlpha) {\n\t\t\t// Three.js does not allow setting an RGB color with alpha value to 0.\n\t\t\t// Therefore, we need to use a plane with a color and opacity of 0.\n\t\t\tconst mesh = _getBGClearMesh(color);\n\t\t\tmesh.renderOrder = -1; // Render this before anything else.\n\t\t\toffscreenScene.add(mesh);\n\t\t}\n\n\t\t// Render scene to texture.\n\t\tconst height = charModel.getResolution();\n\t\tconst width = height / 2;\n\t\t// Configure the RenderTarget for no depth/stencil.\n\t\tconst options = {\n\t\t\tdepthBuffer: false,\n\t\t\tstencilBuffer: false,\n\t\t\t// Use mirrored repeat wrapping.\n\t\t\twrapS: THREE.MirroredRepeatWrapping,\n\t\t\twrapT: THREE.MirroredRepeatWrapping\n\t\t};\n\n\t\tconst target = createAndRenderToTarget(offscreenScene,\n\t\t\t_getIdentCamera(), renderer, width, height, options);\n\n\t\t// console.debug(`Creating target ${target.texture.id} for faceline`);\n\n\t\t// Delete temp faceline object to free resources.\n\t\tmodule._FFLiDeleteTempObjectFacelineTexture(facelineTempObjectPtr,\n\t\t\tcharModel.ptr, FFL.singleResourceType); // charModel.modelDesc.resourceType);\n\t\t_disposeMany(offscreenScene); // Dispose meshes in scene.\n\t\treturn target;\n\t},\n\n\t/**\n\t * Iterates through mask textures and draws each mask texture.\n\t * @param {CharModelAccessor} charModel - FFLiCharModel representation.\n\t * @param {Uint32Array} maskParams - Pointers to DrawParams for each mask.\n\t * @param {Array<THREE.RenderTarget|null>} targets - Array of mask render targets to set.\n\t * @param {Renderer} renderer - The renderer.\n\t * @param {Module} module - The Emscripten module.\n\t * @param {TextureManager} texMgr - TextureManager instance for making a mesh.\n\t * @param {MaterialConstructor} materialClass - The material class (e.g., FFLShaderMaterial).\n\t * @private\n\t */\n\t_drawMaskTextures(charModel, maskParams,\n\t\ttargets, renderer, module, texMgr, materialClass) {\n\t\tconst maskTempObjectPtr = charModel.getMaskTempObjectPtr();\n\t\tconst expressionFlagPtr = charModel.getExpressionFlagPtr();\n\n\t\t// Collect all scenes and only dispose them at the end.\n\t\t/** @type {Array<THREE.Scene>} */\n\t\tconst scenes = [];\n\n\t\t// Iterate to find out which masks are needed.\n\t\tfor (let i = 0; i < maskParams.length; i++) {\n\t\t\t// If pointer is null, no mask is needed in this slot.\n\t\t\tif (maskParams[i] === 0) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst maskParamPtr = maskParams[i];\n\t\t\tconst rawMaskDrawParam = CharModelTextures._unpackDrawParamArray(\n\t\t\t\tmodule.HEAPU8, maskParamPtr, CharModelTextures.MaskPartCount);\n\t\t\tmodule._FFLiInvalidateRawMask(maskParamPtr);\n\n\t\t\tconst res = charModel.getResolution();\n\t\t\tconst { target, scene } = CharModelTextures._drawMaskTexture(res,\n\t\t\t\trawMaskDrawParam, renderer, module, texMgr, materialClass);\n\t\t\t// console.debug(`Creating target ${target.texture.id} for mask ${i}`);\n\t\t\ttargets[i] = target;\n\n\t\t\tscenes.push(scene);\n\t\t}\n\n\t\t// Some textures are shared which is why this\n\t\t// needs to be done given that disposeMeshes\n\t\t// unconditionally deletes textures.\n\t\tfor (const scene of scenes) {\n\t\t\t_disposeMany(scene);\n\t\t}\n\n\t\tmodule._FFLiDeleteTempObjectMaskTextures(maskTempObjectPtr,\n\t\t\texpressionFlagPtr, FFL.singleResourceType); // charModel.modelDesc.resourceType);\n\t\tmodule._FFLiDeleteTextureTempObject(charModel.ptr);\n\t},\n\n\t/**\n\t * Draws a single mask texture based on a RawMaskDrawParam.\n\t * Note that the caller needs to dispose meshes within the returned scene.\n\t * @param {number} resolution - Width and height of the mask texture.\n\t * @param {Array<DrawParam>} rawMaskParam - The RawMaskDrawParam.\n\t * @param {Renderer} renderer - The renderer.\n\t * @param {Module} module - The Emscripten module.\n\t * @param {TextureManager} texMgr - TextureManager instance for making a mesh.\n\t * @param {MaterialConstructor} materialClass - The material class (e.g., FFLShaderMaterial).\n\t * @returns {{target: THREE.RenderTarget, scene: THREE.Scene}}\n\t * The RenderTarget and scene of this mask texture.\n\t * @private\n\t */\n\t_drawMaskTexture(resolution, rawMaskParam, renderer, module, texMgr, materialClass) {\n\t\tconst drawParams = rawMaskParam.filter(dp => dp && dp.primitiveParam.indexCount !== 0);\n\t\tconsole.assert(drawParams.length, '_drawMaskTexture: All DrawParams are empty.');\n\t\t// Configure the RenderTarget for no depth/stencil.\n\t\tconst options = {\n\t\t\tdepthBuffer: false,\n\t\t\tstencilBuffer: false\n\t\t};\n\t\t// Create an offscreen transparent scene for 2D mask rendering.\n\t\tconst offscreenScene = new THREE.Scene();\n\t\toffscreenScene.background = null;\n\t\tfor (const param of drawParams) {\n\t\t\toffscreenScene.add(param.toMesh(materialClass, module, texMgr));\n\t\t}\n\n\t\tconst target = createAndRenderToTarget(offscreenScene,\n\t\t\t_getIdentCamera(), renderer, resolution, resolution, options);\n\n\t\treturn { target, scene: offscreenScene };\n\t\t// Caller needs to dispose meshes in scene.\n\t}\n};\n\n// // ---------------------------------------------------------------------\n// //  CharModel Modulate Texture Converter\n// // ---------------------------------------------------------------------\n// TODO PATH: src/ModelTexturesConverter.js\n\n/**\n * Gets a plane whose color and opacity can be set.\n * This can be used to simulate background clear, or specifically\n * to set the background's color to a value but alpha to 0.\n * @param {THREE.Color} color - The color of the plane.\n * @param {number} [opacity] - The opacity of the plane, default is transparent.\n * @returns {THREE.Mesh} The plane with the color and opacity specified.\n * @package\n */\nconst _getBGClearMesh = (color, opacity = 0) =>\n\tnew THREE.Mesh(new THREE.PlaneGeometry(2, 2),\n\t\tnew THREE.MeshBasicMaterial({\n\t\t\tcolor, opacity,\n\t\t\ttransparent: true,\n\t\t\tblending: THREE.NoBlending\n\t\t})\n\t);\n\n/**\n * Utilities for converting textures within a CharModel.\n * {@link ModelTexturesConverter.convModelTexturesToRGBA} adds colors to textures so\n * they can be used with any material, or a model export.\n * {@link ModelTexturesConverter.convModelTargetsToDataTex} adds texture data by converting\n * render targets to {@link THREE.DataTexture}, allowing exports.\n */\nconst ModelTexturesConverter = {\n\t/**\n\t * Converts a CharModel's textures, including ones that may be using swizzled modulateMode\n\t * textures that are R/RG format, to RGBA and also applying colors, so that\n\t * the CharModel can be rendered without a material that supports modulateMode.\n\t * @param {CharModel} charModel - The CharModel whose textures to convert.\n\t * @param {Renderer} renderer - The renderer.\n\t * @param {MaterialConstructor} materialTextureClass - The material class that draws the new texture.\n\t * @public\n\t */\n\tconvModelTexturesToRGBA(charModel, renderer, materialTextureClass) {\n\t\tconst convertTextureForTypes = /* @__PURE__ */ new Set([FFLModulateType.SHAPE_CAP,\n\t\t\tFFLModulateType.SHAPE_NOSELINE, FFLModulateType.SHAPE_GLASS]);\n\n\t\tfor (const mesh of /** @type {Array<MeshWithTexture>} */ (charModel.meshes.children)) {\n\t\t\tif (mesh.geometry.userData.modulateType !== undefined &&\n\t\t\t\tmesh.material.map &&\n\t\t\t\tconvertTextureForTypes.has(mesh.geometry.userData.modulateType)\n\t\t\t) {\n\t\t\t\tconst target = this._texDrawRGBATarget(renderer, mesh.material,\n\t\t\t\t\tmesh.geometry.userData, materialTextureClass);\n\n\t\t\t\t// NOTE: The target needs to be disposed after this.\n\t\t\t\t// Everything in _maskTargets is already disposed, and\n\t\t\t\t// additional entries will be ignored. So, that is where these go.\n\t\t\t\tcharModel._maskTargets.push(target);\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Takes the texture in `material` and draws it using `materialTextureClass`, using\n\t * the modulateMode property in `userData`, using the `renderer` and sets it back\n\t * in the `material`. So it converts a swizzled (using modulateMode) texture to RGBA.\n\t * NOTE: Does NOT handle mipmaps. But these textures\n\t * usually do not have mipmaps anyway so it's fine\n\t * @param {Renderer} renderer - The renderer.\n\t * @param {THREE.MeshBasicMaterial} material - The original material of the mesh.\n\t * @param {Object<string, *>} userData - The original mesh.geometry.userData to get modulateMode/Type from.\n\t * @param {MaterialConstructor} materialTextureClass - The material class that draws the new texture.\n\t * @returns {THREE.RenderTarget} The RenderTarget of the final RGBA texture.\n\t * @private\n\t */\n\t_texDrawRGBATarget(renderer, material, userData, materialTextureClass) {\n\t\tconst scene = new THREE.Scene();\n\t\t// Simulate clearing the background with this color, but opacity of 0.\n\t\tconst bgClearRGBMesh = _getBGClearMesh(material.color);\n\t\tscene.add(bgClearRGBMesh); // Must be drawn first.\n\n\t\tconsole.assert(material.map, '_texDrawRGBATarget: material.map is null or undefined');\n\t\t/** Shortcut to the existing texture. */\n\t\tconst tex = /** @type {THREE.Texture} */ (material.map);\n\t\t// This material is solely for the texture itself and not the shape.\n\t\t// It actually does not need color set on it, or modulate type (blending)\n\t\tconst texMat = new materialTextureClass({\n\t\t\tmap: tex,\n\t\t\tmodulateMode: userData.modulateMode,\n\t\t\tcolor: material.color,\n\t\t\tside: THREE.DoubleSide,\n\t\t\tlightEnable: false\n\t\t});\n\t\ttexMat.blending = THREE.NoBlending;\n\t\ttexMat.transparent = true;\n\n\t\tconst plane = new THREE.PlaneGeometry(2, 2);\n\t\tconst textureMesh = new THREE.Mesh(plane, texMat);\n\t\tscene.add(textureMesh);\n\n\t\tconst flipY = _isWebGPU(renderer);\n\t\tconst target = createAndRenderToTarget(scene,\n\t\t\t_getIdentCamera(flipY), renderer,\n\t\t\ttex.image.width, tex.image.height, {\n\t\t\t\twrapS: tex.wrapS, wrapT: tex.wrapT, // Preserve wrap.\n\t\t\t\tdepthBuffer: false, stencilBuffer: false\n\t\t\t});\n\n\t\t/** @type {THREE.Texture & {_target: THREE.RenderTarget}} */\n\t\t(target.texture)._target = target;\n\n\t\t// Dispose previous texture and replace with this one.\n\t\t/** @type {THREE.Texture} */ (material.map).dispose();\n\t\tmaterial.map = target.texture;\n\t\t// Set color to default and modulateMode to TEXTURE_DIRECT.\n\t\tmaterial.color = /* @__PURE__ */ new THREE.Color(1, 1, 1);\n\t\tuserData.modulateMode = 1;\n\n\t\treturn target; // Caller is responsible for disposing the RenderTarget.\n\t},\n\n\t/**\n\t * Converts all textures in the CharModel that are associated\n\t * with RenderTargets into THREE.DataTextures, so that the\n\t * CharModel can be exported using e.g., GLTFExporter.\n\t * @param {CharModel} charModel - The CharModel whose textures to convert.\n\t * @param {Renderer} renderer - The renderer.\n\t * @public\n\t */\n\tasync convModelTargetsToDataTex(charModel, renderer) {\n\t\tfor (const mesh of /** @type {Array<MeshWithTexture>} */ (charModel.meshes.children)) {\n\t\t\tconst tex = /** @type {THREE.Texture|null} */ (mesh.material.map);\n\t\t\tif (!tex) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconsole.assert(tex.format === THREE.RGBAFormat,\n\t\t\t\t'convModelTargetsToDataTex: found a texture that is not of format THREE.RGBAFormat, but, this function is only meant to be used if all textures in CharModel meshes are RGBA (so render targets)...');\n\t\t\tconst target = /** @type {THREE.Texture & {_target: THREE.RenderTarget}} */\n\t\t\t\t(tex)._target;\n\t\t\tconsole.assert(target, 'convModelTargetsToDataTex: mesh.material.map (texture)._target is null or undefined.');\n\n\t\t\t// This diverges between WebGPURenderer and WebGLRenderer.\n\t\t\t// Reference: https://github.com/mrdoob/three.js/blob/2a0228c066a7fe4bce0f1d12b3e5bd4058dcc218/examples/jsm/exporters/KTX2Exporter.js#L281\n\t\t\t// TODO: Untested.\n\t\t\tconst data = _isWebGPU(renderer)\n\t\t\t\t? await /** @type {import('three/webgpu').WebGPURenderer} */\n\t\t\t\t(renderer).readRenderTargetPixelsAsync(target, 0, 0,\n\t\t\t\t\ttex.image.width, tex.image.height)\n\t\t\t\t: await /** @type {THREE.WebGLRenderer} */\n\t\t\t\t(renderer).readRenderTargetPixelsAsync(\n\t\t\t\t\t/** @type {THREE.WebGLRenderTarget} */ (target), 0, 0,\n\t\t\t\t\ttex.image.width, tex.image.height,\n\t\t\t\t\t// Create a new RGBA buffer here, since\n\t\t\t\t\t// the function should return it anyway.\n\t\t\t\t\tnew Uint8Array(tex.image.width * tex.image.height * 4));\n\n\t\t\t// Construct new THREE.DataTexture from the read data.\n\t\t\t// So... draw the texture, download it out, and upload it again.\n\t\t\tconst dataTex = new THREE.DataTexture(data, tex.image.width,\n\t\t\t\ttex.image.height, THREE.RGBAFormat, THREE.UnsignedByteType);\n\t\t\t// Copy wrap and filtering options.\n\t\t\tdataTex.wrapS = tex.wrapS;\n\t\t\tdataTex.wrapT = tex.wrapT;\n\t\t\tdataTex.minFilter = tex.minFilter;\n\t\t\tdataTex.magFilter = tex.magFilter;\n\n\t\t\tdataTex.needsUpdate = true;\n\t\t\tmesh.material.map = dataTex;\n\t\t}\n\t\t// The original render targets are no longer needed now, dispose them.\n\t\tcharModel.disposeTargets();\n\t\t// Note that expressions cannot be set on the CharModel anymore.\n\t}\n};\n\n// // ---------------------------------------------------------------------\n// //  TextureShaderMaterial Class\n// // ---------------------------------------------------------------------\n// TODO PATH: src/TextureShaderMaterial.js\n\n/**\n * A material class that renders FFL swizzled (modulateMode) textures.\n * Has no lighting whatsoever, just meant to render 2D planes.\n * @augments {THREE.ShaderMaterial}\n */\nclass TextureShaderMaterial extends THREE.ShaderMaterial {\n\t/**\n\t * @typedef {Object} TextureShaderMaterialParameters\n\t * @property {FFLModulateMode} [modulateMode] - Modulate mode.\n\t * @property {FFLModulateType} [modulateType] - Modulate type.\n\t * @property {THREE.Color|null} [color] - Constant color.\n\t * @property {THREE.Color} [colorG]\n\t * @property {THREE.Color} [colorB]\n\t */\n\n\t/**\n\t * The material constructor.\n\t * @param {THREE.ShaderMaterialParameters & TextureShaderMaterialParameters} [options] -\n\t * Parameters for the material.\n\t */\n\tconstructor(options = {}) {\n\t\t// Set default uniforms.\n\t\t/** @type {Object<string, THREE.IUniform>} */\n\t\tconst uniforms = {\n\t\t\topacity: { value: 1 }\n\t\t};\n\t\tconst blankMatrix3 = { value: /* @__PURE__ */ new THREE.Matrix3() };\n\t\tif (Number(THREE.REVISION) < 151) {\n\t\t\tuniforms.uvTransform = blankMatrix3;\n\t\t} else {\n\t\t\tuniforms.mapTransform = blankMatrix3;\n\t\t}\n\n\t\t// Construct the ShaderMaterial using the shader source.\n\t\tsuper({\n\t\t\tvertexShader: /* glsl */`\n\t\t\t\t#include <common>\n\t\t\t\t#include <uv_pars_vertex>\n\n\t\t\t\tvoid main() {\n\t\t\t\t\t#include <begin_vertex>\n\t\t\t\t\t#include <uv_vertex>\n\t\t\t\t\t#include <project_vertex>\n\t\t\t\t}`,\n\t\t\tfragmentShader: /* glsl */`\n\t\t\t\t#include <common>\n\t\t\t\t#include <uv_pars_fragment>\n\t\t\t\t#include <map_pars_fragment>\n\t\t\t\tuniform vec3 diffuse;\n\t\t\t\tuniform float opacity;\n\t\t\t\tuniform int modulateMode;\n\t\t\t\tuniform vec3 colorG;\n\t\t\t\tuniform vec3 colorB;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvec4 diffuseColor = vec4( diffuse, opacity );\n\n\t\t\t\t\t#include <map_fragment>\n\t\t\t\t\t#include <alphamap_fragment>\n#ifdef USE_MAP\n\t\t\t\t\tif (modulateMode == 2) { // RGB_LAYERED\n\t\t\t\t\t\tvec3 rgb = diffuse.rgb * pixel.r +\n\t\t\t\t\t\t\t\t\tcolorG.rgb * pixel.g +\n\t\t\t\t\t\t\t\t\tcolorB.rgb * pixel.b;\n\t\t\t\t\t\tcolor = vec4(rgb, pixel.a);\n\t\t\t\t\t} else if (modulateMode == 3) { // ALPHA\n\t\t\t\t\t\tcolor = vec4(diffuse.rgb * pixel.r, pixel.r);\n\t\t\t\t\t} else if (modulateMode == 4) { // LUMINANCE_ALPHA (glass)\n\t\t\t\t\t\tcolor = vec4(diffuse.rgb * pixel.g, pixel.r);\n\t\t\t\t\t} else if (modulateMode == 5) { // ALPHA_OPA (cap)\n\t\t\t\t\t\tcolor = vec4(diffuse.rgb * pixel.r, 1.0);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (modulateMode != 0 && color.a == 0.0) { // != CONSTANT\n\t\t\t\t\t\tdiscard; // Alpha discard for mask texture.\n\t\t\t\t\t}\n#endif\n\t\t\t\t\tgl_FragColor = diffuseColor;\n\t\t\t\t\t//#include <colorspace_fragment>\n\t\t\t\t}`,\n\t\t\tuniforms: uniforms\n\t\t});\n\t\t// Set defaults so that they are considered valid parameters.\n\t\tthis.color = /* @__PURE__ */ new THREE.Color();\n\t\tthis.colorG = /* @__PURE__ */ new THREE.Color();\n\t\tthis.colorB = /* @__PURE__ */ new THREE.Color();\n\t\tthis.lightEnable = false;\n\t\tthis.modulateType = 0;\n\n\t\t// Use the setters to set the rest of the uniforms.\n\t\tthis.setValues(options);\n\t}\n\n\t/** @returns {THREE.Color|undefined} The color. */\n\tget color() {\n\t\treturn this.uniforms.diffuse ? this.uniforms.diffuse.value : undefined;\n\t}\n\n\tset color(/** @type {THREE.Color} */ value) {\n\t\tthis.uniforms.diffuse = { value: value };\n\t}\n\n\t/** @returns {THREE.Color|undefined} colorG color if defined. */\n\tget colorG() {\n\t\treturn this.uniforms.colorG ? this.uniforms.colorG.value : undefined;\n\t}\n\n\tset colorG(/** @type {THREE.Color} */ value) {\n\t\tthis.uniforms.colorG = { value };\n\t}\n\n\t/** @returns {THREE.Color|undefined} colorB color if defined. */\n\tget colorB() {\n\t\treturn this.uniforms.colorB ? this.uniforms.colorB.value : undefined;\n\t}\n\n\tset colorB(/** @type {THREE.Color} */ value) {\n\t\tthis.uniforms.colorB = { value };\n\t}\n\n\t/** @returns {FFLModulateMode|null} The modulateMode value, or null if it is unset. */\n\tget modulateMode() {\n\t\treturn this.uniforms.modulateMode ? this.uniforms.modulateMode.value : null;\n\t}\n\n\t/** @param {FFLModulateMode} value - The new modulateMode value. */\n\tset modulateMode(value) {\n\t\tthis.uniforms.modulateMode = { value: value };\n\t}\n\n\t/** @returns {THREE.Texture|null} The texture map, or null if it is unset. */\n\tget map() {\n\t\treturn this.uniforms.map ? this.uniforms.map.value : null;\n\t}\n\n\t/** @param {THREE.Texture} value - The new texture map. */\n\tset map(value) {\n\t\tthis.uniforms.map = { value: value };\n\t}\n}\n\n// // ---------------------------------------------------------------------\n// //  Scene/Render Target Handling\n// // ---------------------------------------------------------------------\n// TODO PATH: src/RenderTargetUtils.js\n\n/**\n * @param {Renderer} renderer - The input renderer.\n * @returns {boolean} Whether the renderer is THREE.WebGPURenderer.\n * @package\n */\nconst _isWebGPU = renderer => 'isWebGPURenderer' in renderer;\n\n/**\n * Returns a camera that is effectively the same as\n * if you used identity MVP matrix, for rendering 2D planes.\n * @param {boolean} flipY - Flip the Y axis. Default is oriented for OpenGL.\n * @returns {THREE.OrthographicCamera} The orthographic camera.\n * @package\n */\nfunction _getIdentCamera(flipY = false) {\n\t// Create an orthographic camera with bounds [-1, 1] in x and y.\n\tconst camera = new THREE.OrthographicCamera(-1, 1,\n\t\t// Use [1, -1] except when using flipY.\n\t\t(flipY ? -1 : 1), (flipY ? 1 : -1), 0.1, 10);\n\tcamera.position.z = 1;\n\treturn camera;\n}\n\n/**\n * Creates a Three.js RenderTarget, renders the scene with\n * the given camera, and returns the render target.\n * @param {THREE.Scene} scene - The scene to render.\n * @param {THREE.Camera} camera - The camera to use.\n * @param {Renderer} renderer - The renderer.\n * @param {number} width - Desired width of the target.\n * @param {number} height - Desired height of the target.\n * @param {Object} [targetOptions] - Optional options for the render target.\n * @returns {THREE.RenderTarget} The render target (which contains .texture).\n */\nfunction createAndRenderToTarget(scene, camera, renderer, width, height, targetOptions = {}) {\n\t// Set default options for the RenderTarget.\n\tconst options = {\n\t\tminFilter: THREE.LinearFilter,\n\t\tmagFilter: THREE.LinearFilter,\n\t\t...targetOptions\n\t};\n\n\tconst renderTarget = _isWebGPU(renderer)\n\t\t? new THREE.RenderTarget(width, height, options)\n\t\t: new THREE.WebGLRenderTarget(width, height, options);\n\t// Get previous render target to switch back to.\n\tconst prevTarget = renderer.getRenderTarget();\n\n\t// Forcing the generic \"Renderer\" type here to resolve\n\t// some confusion between RenderTarget and WebGLRenderTarget.\n\t/** @type {import('three/webgpu').Renderer} */ (renderer)\n\t\t.setRenderTarget(renderTarget); // Set new target.\n\trenderer.render(scene, camera); // Render.\n\t/** @type {import('three/webgpu').Renderer} */ (renderer)\n\t\t.setRenderTarget(prevTarget); // Set previous target.\n\treturn renderTarget; // This needs to be disposed when done.\n}\n\n/**\n * Disposes meshes in a {@link THREE.Object3D} and removes them from the {@link THREE.Scene} specified.\n * @param {THREE.Scene|THREE.Object3D} group - The scene or group to dispose meshes from.\n * @param {THREE.Scene} [scene] - The scene to remove the meshes from, if provided.\n * @package\n */\nfunction _disposeMany(group, scene) {\n\t// Taken from: https://github.com/igvteam/spacewalk/blob/21c0a9da27f121a54e0cf6c0d4a23a9cf80e6623/js/utils/utils.js#L135C10-L135C29\n\n\t/**\n\t * Disposes a single material along with its texture map.\n\t * @param {THREE.MeshBasicMaterial} material - The material with `map` property to dispose.\n\t */\n\tfunction disposeMaterial(material) {\n\t\t// Dispose texture in material.\n\t\tif (material.map) {\n\t\t\t// console.debug('Disposing texture ', child.material.map.id);\n\t\t\t// If this was created by TextureManager\n\t\t\t// then it overrides dispose() to also\n\t\t\t// remove itself from the TextureManager map.\n\t\t\tmaterial.map.dispose();\n\t\t}\n\t\tmaterial.dispose(); // Dispose material itself.\n\t}\n\n\t// Traverse all children of the scene/group/THREE.Object3D.\n\tgroup.traverse((child) => {\n\t\tif (!(child instanceof THREE.Mesh)) {\n\t\t\t// Only dispose of meshes.\n\t\t\treturn;\n\t\t}\n\t\t// Dispose geometry, material, and texture.\n\t\tif (child.geometry) {\n\t\t\tchild.geometry.dispose();\n\t\t}\n\n\t\tif (child.material) {\n\t\t\t// Dispose depending on if it is an array or not.\n\t\t\tif (Array.isArray(child.material)) {\n\t\t\t\t// Assume that materials are compatible with THREE.MeshBasicMaterial for .map.\n\t\t\t\tfor (const material of child.material) {\n\t\t\t\t\tdisposeMaterial(/** @type {THREE.MeshBasicMaterial} */ (material));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdisposeMaterial(/** @type {THREE.MeshBasicMaterial} */(child.material));\n\t\t\t}\n\t\t}\n\t});\n\n\t// If this is a scene, remove this group/Object3D from it.\n\tif (scene && scene instanceof THREE.Scene) {\n\t\tscene.remove(group);\n\t}\n\n\t// Set group and its children to null to break references.\n\tgroup.children = [];\n}\n\n// // ---------------------------------------------------------------------\n// //  CharModel Icon Creation\n// // ---------------------------------------------------------------------\n// TODO PATH: src/ModelIcon.js\n\nconst ModelIcon = {\n\t/**\n\t * Creates an icon of the CharModel with the specified view type.\n\t * @param {CharModel} charModel - The CharModel instance.\n\t * @param {Renderer} renderer - The renderer.\n\t * @param {Object} [options] - Optional settings for rendering the icon.\n\t * @param {number} [options.width] - Desired icon width in pixels.\n\t * @param {number} [options.height] - Desired icon height in pixels.\n\t * @param {THREE.Scene} [options.scene] - Optional scene\n\t * if you want to provide your own (e.g., with background, or models).\n\t * @param {THREE.Camera} [options.camera] - Optional camera\n\t * to use instead of the default.\n\t * @param {HTMLCanvasElement} [options.canvas] - Optional canvas\n\t * to draw into. Creates a new canvas if this does not exist.\n\t * @returns {HTMLCanvasElement} The canvas containing the icon.\n\t * @public\n\t */\n\tcreate(charModel, renderer, options = {}) {\n\t\t// Set locals from options object.\n\t\tlet {\n\t\t\twidth = 256,\n\t\t\theight = 256,\n\t\t\tscene,\n\t\t\tcamera,\n\t\t\tcanvas\n\t\t} = options;\n\n\t\t// Create an offscreen scene for the icon if one is not provided.\n\t\tif (!scene) {\n\t\t\tscene = new THREE.Scene();\n\t\t\tscene.background = null; // Transparent background.\n\t\t}\n\t\t// Add meshes from the CharModel.\n\t\tscene.add(charModel.meshes.clone());\n\t\t// If the meshes aren't cloned then they disappear from the\n\t\t// primary scene, however geometry/material etc are same\n\n\t\t// Get camera based on viewType parameter.\n\t\tif (!camera) {\n\t\t\tcamera = this.getCamera();\n\t\t}\n\n\t\tconst state = this._saveRendererState(renderer);\n\n\t\trenderer.setRenderTarget(null); // Switch to primary target.\n\t\trenderer.setSize(width, height, false);\n\t\trenderer.render(scene, camera); // Render scene.\n\n\t\tcanvas = this._copyRendererToCanvas(renderer, canvas); // Populate canvas.\n\n\t\tthis._restoreRendererState(renderer, state);\n\t\treturn canvas;\n\t\t// Caller needs to dispose CharModel.\n\t},\n\n\t/** @returns {THREE.PerspectiveCamera} The camera for FFLMakeIcon. */\n\tgetCamera() {\n\t\t/** rad2deg(Math.atan2(43.2 / aspect, 500) / 0.5); */\n\t\tconst fovY = 9.8762;\n\t\tconst camera = new THREE.PerspectiveCamera(fovY, 1 /* aspect = square */, 500, 1000);\n\t\tcamera.position.set(0, 34.5, 600);\n\t\treturn camera;\n\t},\n\n\t// Utilities for exporting to a texture.\n\n\t/**\n\t * Generic utility for rendering a texture to a canvas.\n\t * The canvas can then further be converted to bytes via dataURL or Blob.\n\t * If no canvas is provided, a new one is created.\n\t * @param {THREE.Texture} texture - The texture to render.\n\t * @param {Renderer} renderer - The renderer.\n\t * @param {Object} [options] - Options for canvas output.\n\t * @param {boolean} [options.flipY] - Flip the Y axis. Default is oriented for OpenGL.\n\t * @param {HTMLCanvasElement} [options.canvas] - Optional canvas to draw into.\n\t * Creates a new canvas if this does not exist.\n\t * @returns {HTMLCanvasElement} The canvas containing the rendered texture.\n\t * @public\n\t */\n\ttextureToCanvas(texture, renderer, { flipY = true, canvas } = {}) {\n\t\t// Create a new scene using a full-screen quad.\n\t\tconst scene = new THREE.Scene();\n\t\tscene.background = null; // Transparent background.\n\t\t// Assign a transparent, textured, and double-sided material.\n\t\tconst material = new THREE.MeshBasicMaterial({\n\t\t\tside: THREE.DoubleSide, map: texture, transparent: true\n\t\t});\n\t\t\t/** Full-screen quad. */\n\t\tconst plane = new THREE.PlaneGeometry(2, 2);\n\t\tconst mesh = new THREE.Mesh(plane, material);\n\t\tscene.add(mesh);\n\t\t/** Orthographic camera filling whole screen. */\n\t\tconst camera = _getIdentCamera(flipY);\n\n\t\t// Get previous render target, color space, and size.\n\t\tconst state = this._saveRendererState(renderer);\n\n\t\t// Render to the main canvas to extract pixels.\n\t\trenderer.setRenderTarget(null); // Render to primary target.\n\t\t// Get width and set it on renderer.\n\t\tconst { width, height } = texture.image;\n\t\trenderer.setSize(width, height, false);\n\t\t// Use working color space.\n\t\trenderer.outputColorSpace = THREE.ColorManagement ? THREE.ColorManagement.workingColorSpace : '';\n\t\trenderer.render(scene, camera);\n\n\t\tcanvas = this._copyRendererToCanvas(renderer, canvas); // Populate canvas.\n\n\t\t// Cleanup and restore renderer state.\n\t\tmaterial.dispose();\n\t\tplane.dispose();\n\t\tscene.remove(mesh);\n\t\tthis._restoreRendererState(renderer, state);\n\n\t\treturn canvas; // Either a new canvas or the same one.\n\t},\n\n\t/**\n\t * Saves the current renderer state and returns an object to restore it later.\n\t * @param {Renderer} renderer - The renderer to save state from.\n\t * @returns {{target: THREE.RenderTarget|THREE.WebGLRenderTarget|null,\n\t * colorSpace: THREE.ColorSpace, size: THREE.Vector2}}\n\t * The saved state object.\n\t * @private\n\t */\n\t_saveRendererState(renderer) {\n\t\tconst size = /* @__PURE__ */ new THREE.Vector2();\n\t\trenderer.getSize(size);\n\n\t\treturn {\n\t\t\ttarget: renderer.getRenderTarget(),\n\t\t\tcolorSpace: /** @type {THREE.ColorSpace} */ (renderer.outputColorSpace),\n\t\t\tsize\n\t\t};\n\t},\n\n\t/**\n\t * Restores a renderer's state from a saved state object.\n\t * @param {Renderer} renderer - The renderer to restore state to.\n\t * @param {ReturnType<typeof this._saveRendererState>} state -\n\t * The saved state object.\n\t * @private\n\t */\n\t_restoreRendererState(renderer, state) {\n\t\t/** @type {import('three/webgpu').Renderer} */ (renderer)\n\t\t\t.setRenderTarget(state.target);\n\t\trenderer.outputColorSpace = state.colorSpace;\n\t\trenderer.setSize(state.size.x, state.size.y, false);\n\t},\n\n\t/**\n\t * Copies the renderer's framebuffer to a canvas.\n\t * @param {Renderer} renderer - The renderer.\n\t * @param {HTMLCanvasElement} [canvas] - Optional target canvas. If not provided, a new one is created.\n\t * @returns {HTMLCanvasElement} The canvas containing the rendered output.\n\t * @throws {Error} Throws if the canvas is invalid, yet not undefined.\n\t * @private\n\t */\n\t_copyRendererToCanvas(renderer, canvas) {\n\t\tconst sourceCanvas = renderer.domElement;\n\t\t// If the target canvas is not simply undefined, it's null, then error out.\n\t\tif (canvas !== undefined && !(canvas instanceof HTMLCanvasElement)) {\n\t\t\tthrow new Error('copyRendererToCanvas: canvas is neither a valid canvas nor undefined.');\n\t\t}\n\t\tconst targetCanvas = canvas || document.createElement('canvas');\n\t\ttargetCanvas.width = sourceCanvas.width;\n\t\ttargetCanvas.height = sourceCanvas.height;\n\t\t// NOTE: Line below guarantees the canvas to be valid.\n\t\t/** @type {CanvasRenderingContext2D} */ (targetCanvas.getContext('2d'))\n\t\t\t.drawImage(sourceCanvas, 0, 0);\n\n\t\treturn targetCanvas;\n\t}\n};\n\n// // ---------------------------------------------------------------------\n// //  StudioCharInfo Definition, Conversion\n// // ---------------------------------------------------------------------\n// TODO PATH: src/StudioCharInfo.js\n\n/**\n * Converts StudioCharInfo to FFLiCharInfo type needed by FFL internally.\n * @param {Uint8Array} src - The raw, un-obfuscated StudioCharInfo data.\n * @returns {Uint8Array} Byte form of FFLiCharInfo.\n * @package\n */\nfunction _studioToFFLiCharInfo(src) {\n\t// This function was created by originally writing it in C\n\t// reading/writing raw structs, then decompiling and porting to JS.\n\n\t// Also, most of the destination fields are 32-bit but this\n\t// is choosing to set the (little-endian) least significant byte.\n\t// This should be fine, since the source fields are 8 bits each.\n\t// Those result in an otherwise smaller function, at the cost\n\t// of being severely unreadable.\n\tconst dst = new Uint8Array(FFLiCharInfo_size);\n\tconst view = new DataView(dst.buffer);\n\tview.setUint32(0x80, commonColorMask(src[0]), true); // beardColor\n\tdst[0x7c] = src[1];\n\tdst[0xb0] = src[2];\n\tdst[0x2c] = src[3];\n\tview.setUint32(0x24, commonColorMask(src[4]), true); // eyeColor\n\tdst[0x30] = src[5];\n\tdst[0x28] = src[6];\n\tdst[0x20] = src[7];\n\tdst[0x34] = src[8];\n\tdst[0x38] = src[9];\n\tdst[0x48] = src[10];\n\tview.setUint32(0x40, commonColorMask(src[0xb]), true); // eyebrowColor\n\tdst[0x4c] = src[0xc];\n\tdst[0x44] = src[0xd];\n\tdst[0x3c] = src[0xe];\n\tdst[0x50] = src[0xf];\n\tdst[0x54] = src[0x10];\n\tdst[8] = src[0x11];\n\tdst[0x10] = src[0x12];\n\tdst[4] = src[0x13];\n\tdst[0xc] = src[0x14];\n\tdst[0xec] = src[0x15];\n\tdst[0xe0] = src[0x16];\n\tview.setUint32(0x90, commonColorMask(src[0x17]), true); // glassColor\n\tdst[0x94] = src[0x18];\n\tdst[0x8c] = src[0x19];\n\tdst[0x98] = src[0x1a];\n\tview.setUint32(0x18, commonColorMask(src[0x1b]), true); // hairColor\n\tdst[0x1c] = src[0x1c];\n\tdst[0x14] = src[0x1d];\n\tdst[0xac] = src[0x1e];\n\tdst[0xa0] = src[0x1f];\n\tdst[0x9c] = src[0x20];\n\tdst[0xa4] = src[0x21];\n\tdst[0xa8] = src[0x22];\n\tdst[0x70] = src[0x23];\n\tview.setUint32(0x68, commonColorMask(src[0x24]), true); // mouthColor\n\tdst[0x6c] = src[0x25];\n\tdst[100] = src[0x26];\n\tdst[0x74] = src[0x27];\n\tdst[0x84] = src[0x28];\n\tdst[0x78] = src[0x29];\n\tdst[0x88] = src[0x2a];\n\tdst[0x5c] = src[0x2b];\n\tdst[0x58] = src[0x2c];\n\tdst[0x60] = src[0x2d];\n\tdst[0x104] = 3;\n\treturn dst;\n}\n\n/**\n * @param {Uint8Array} data - Obfuscated Studio URL data.\n * @returns {Uint8Array} Decoded Uint8Array representing CharInfoStudio.\n * @package\n */\nfunction _studioURLObfuscationDecode(data) {\n\tconst decodedData = new Uint8Array(data);\n\tconst random = decodedData[0];\n\tlet previous = random;\n\n\tfor (let i = 1; i < 48; i++) {\n\t\tconst encodedByte = decodedData[i];\n\t\tconst original = (encodedByte - 7 + 256) % 256;\n\t\tdecodedData[i - 1] = original ^ previous;\n\t\tprevious = encodedByte;\n\t}\n\n\treturn decodedData.slice(0, 46); // Clamp to StudioCharInfo.size\n}\n\n// Module exports.\nexport {\n\t// Generic enums\n\tFFLModulateMode,\n\tFFLModulateType,\n\tFFLExpression,\n\tFFLModelFlag,\n\n\t// Exception types\n\tFFLResultException,\n\tFFLiVerifyReasonException,\n\tExpressionNotSet,\n\n\t// Types for CharModel initialization\n\tFFLCharModelDescDefault,\n\n\t// Begin public methods\n\tFFL,\n\tverifyCharInfo,\n\tgetRandomCharInfo,\n\tmakeExpressionFlag,\n\tcheckExpressionChangesShapes,\n\n\t// CharModel creation\n\tCharModel,\n\tcreateAndRenderToTarget,\n\tmatSupportsFFL,\n\n\t// Icon rendering\n\tModelIcon,\n\n\t// Pants colors for body rendering\n\tPantsColor,\n\tpantsColors,\n\n\t// Enums for getRandomCharInfo\n\tFFLGender,\n\tFFLAge,\n\tFFLRace,\n\n\t// CharModel helpers for exporting models\n\tTextureShaderMaterial,\n\tModelTexturesConverter\n};\n", "/**\n * @license\n * Copyright 2010-2025 Three.js Authors\n * SPDX-License-Identifier: MIT\n */\nimport { Color, Vector2, Vector3, Vector4, Matrix2, Matrix3, Matrix4, error, EventDispatcher, MathUtils, warn, WebGLCoordinateSystem, WebGPUCoordinateSystem, ColorManagement, SRGBTransfer, NoToneMapping, StaticDrawUsage, InterleavedBufferAttribute, InterleavedBuffer, DynamicDrawUsage, NoColorSpace, log as log$1, warnOnce, Texture, UnsignedIntType, IntType, NearestFilter, Sphere, BackSide, DoubleSide, Euler, CubeTexture, CubeReflectionMapping, CubeRefractionMapping, TangentSpaceNormalMap, NoNormalPacking, NormalRGPacking, NormalGAPacking, ObjectSpaceNormalMap, RGFormat, RED_GREEN_RGTC2_Format, RG11_EAC_Format, InstancedInterleavedBuffer, InstancedBufferAttribute, DataArrayTexture, FloatType, FramebufferTexture, LinearMipmapLinearFilter, DepthTexture, Material, LineBasicMaterial, LineDashedMaterial, NoBlending, MeshNormalMaterial, SRGBColorSpace, WebGLCubeRenderTarget, BoxGeometry, Mesh, Scene, LinearFilter, CubeCamera, EquirectangularReflectionMapping, EquirectangularRefractionMapping, AddOperation, MixOperation, MultiplyOperation, MeshBasicMaterial, MeshLambertMaterial, MeshPhongMaterial, DataTexture, HalfFloatType, ClampToEdgeWrapping, BufferGeometry, OrthographicCamera, PerspectiveCamera, RenderTarget, LinearSRGBColorSpace, RGBAFormat, CubeUVReflectionMapping, BufferAttribute, MeshStandardMaterial, MeshPhysicalMaterial, MeshToonMaterial, MeshMatcapMaterial, SpriteMaterial, PointsMaterial, ShadowMaterial, Uint32BufferAttribute, Uint16BufferAttribute, arrayNeedsUint32, Camera, DepthStencilFormat, DepthFormat, UnsignedInt248Type, UnsignedByteType, Plane, Object3D, LinearMipMapLinearFilter, Float32BufferAttribute, UVMapping, VSMShadowMap, LessCompare, BasicShadowMap, CubeDepthTexture, SphereGeometry, NormalBlending, LinearMipmapNearestFilter, NearestMipmapLinearFilter, Float16BufferAttribute, REVISION, ArrayCamera, PlaneGeometry, FrontSide, CustomBlending, AddEquation, ZeroFactor, CylinderGeometry, Quaternion, WebXRController, RAD2DEG, PCFShadowMap, FrustumArray, Frustum, RedIntegerFormat, RedFormat, ShortType, ByteType, UnsignedShortType, RGIntegerFormat, RGBIntegerFormat, RGBFormat, RGBAIntegerFormat, TimestampQuery, createCanvasElement, ReverseSubtractEquation, SubtractEquation, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, DstAlphaFactor, DstColorFactor, SrcAlphaSaturateFactor, SrcAlphaFactor, SrcColorFactor, OneFactor, CullFaceNone, CullFaceBack, CullFaceFront, MultiplyBlending, SubtractiveBlending, AdditiveBlending, NotEqualDepth, GreaterDepth, GreaterEqualDepth, EqualDepth, LessEqualDepth, LessDepth, AlwaysDepth, NeverDepth, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedInt5999Type, UnsignedInt101111Type, AlphaFormat, RGB_S3TC_DXT1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGB_PVRTC_4BPPV1_Format, RGB_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_PVRTC_2BPPV1_Format, RGB_ETC1_Format, RGB_ETC2_Format, RGBA_ETC2_EAC_Format, R11_EAC_Format, SIGNED_R11_EAC_Format, SIGNED_RG11_EAC_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_10x10_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_BPTC_Format, RED_RGTC1_Format, SIGNED_RED_RGTC1_Format, SIGNED_RED_GREEN_RGTC2_Format, MirroredRepeatWrapping, RepeatWrapping, NearestMipmapNearestFilter, NotEqualCompare, GreaterCompare, GreaterEqualCompare, EqualCompare, LessEqualCompare, AlwaysCompare, NeverCompare, LinearTransfer, getByteLength, isTypedArray, NotEqualStencilFunc, GreaterStencilFunc, GreaterEqualStencilFunc, EqualStencilFunc, LessEqualStencilFunc, LessStencilFunc, AlwaysStencilFunc, NeverStencilFunc, DecrementWrapStencilOp, IncrementWrapStencilOp, DecrementStencilOp, IncrementStencilOp, InvertStencilOp, ReplaceStencilOp, ZeroStencilOp, KeepStencilOp, MaxEquation, MinEquation, SpotLight, PointLight, DirectionalLight, RectAreaLight, AmbientLight, HemisphereLight, LightProbe, LinearToneMapping, ReinhardToneMapping, CineonToneMapping, ACESFilmicToneMapping, AgXToneMapping, NeutralToneMapping, Group, Loader, FileLoader, MaterialLoader, ObjectLoader } from './three.core.js';\nexport { AdditiveAnimationBlendMode, AnimationAction, AnimationClip, AnimationLoader, AnimationMixer, AnimationObjectGroup, AnimationUtils, ArcCurve, ArrowHelper, AttachedBindMode, Audio, AudioAnalyser, AudioContext, AudioListener, AudioLoader, AxesHelper, BasicDepthPacking, BatchedMesh, Bone, BooleanKeyframeTrack, Box2, Box3, Box3Helper, BoxHelper, BufferGeometryLoader, Cache, CameraHelper, CanvasTexture, CapsuleGeometry, CatmullRomCurve3, CircleGeometry, Clock, ColorKeyframeTrack, CompressedArrayTexture, CompressedCubeTexture, CompressedTexture, CompressedTextureLoader, ConeGeometry, ConstantAlphaFactor, ConstantColorFactor, Controls, CubeTextureLoader, CubicBezierCurve, CubicBezierCurve3, CubicInterpolant, CullFaceFrontBack, Curve, CurvePath, CustomToneMapping, Cylindrical, Data3DTexture, DataTextureLoader, DataUtils, DefaultLoadingManager, DetachedBindMode, DirectionalLightHelper, DiscreteInterpolant, DodecahedronGeometry, DynamicCopyUsage, DynamicReadUsage, EdgesGeometry, EllipseCurve, ExternalTexture, ExtrudeGeometry, Fog, FogExp2, GLBufferAttribute, GLSL1, GLSL3, GridHelper, HemisphereLightHelper, IcosahedronGeometry, ImageBitmapLoader, ImageLoader, ImageUtils, InstancedBufferGeometry, InstancedMesh, Int16BufferAttribute, Int32BufferAttribute, Int8BufferAttribute, Interpolant, InterpolateDiscrete, InterpolateLinear, InterpolateSmooth, InterpolationSamplingMode, InterpolationSamplingType, KeyframeTrack, LOD, LatheGeometry, Layers, Light, Line, Line3, LineCurve, LineCurve3, LineLoop, LineSegments, LinearInterpolant, LinearMipMapNearestFilter, LoaderUtils, LoadingManager, LoopOnce, LoopPingPong, LoopRepeat, MOUSE, MeshDepthMaterial, MeshDistanceMaterial, NearestMipMapLinearFilter, NearestMipMapNearestFilter, NormalAnimationBlendMode, NumberKeyframeTrack, OctahedronGeometry, OneMinusConstantAlphaFactor, OneMinusConstantColorFactor, PCFSoftShadowMap, Path, PlaneHelper, PointLightHelper, Points, PolarGridHelper, PolyhedronGeometry, PositionalAudio, PropertyBinding, PropertyMixer, QuadraticBezierCurve, QuadraticBezierCurve3, QuaternionKeyframeTrack, QuaternionLinearInterpolant, RGBADepthPacking, RGBDepthPacking, RGB_BPTC_SIGNED_Format, RGB_BPTC_UNSIGNED_Format, RGDepthPacking, RawShaderMaterial, Ray, Raycaster, RenderTarget3D, RingGeometry, ShaderMaterial, Shape, ShapeGeometry, ShapePath, ShapeUtils, Skeleton, SkeletonHelper, SkinnedMesh, Source, Spherical, SphericalHarmonics3, SplineCurve, SpotLightHelper, Sprite, StaticCopyUsage, StaticReadUsage, StereoCamera, StreamCopyUsage, StreamDrawUsage, StreamReadUsage, StringKeyframeTrack, TOUCH, TetrahedronGeometry, TextureLoader, TextureUtils, Timer, TorusGeometry, TorusKnotGeometry, Triangle, TriangleFanDrawMode, TriangleStripDrawMode, TrianglesDrawMode, TubeGeometry, Uint8BufferAttribute, Uint8ClampedBufferAttribute, Uniform, UniformsGroup, VectorKeyframeTrack, VideoFrameTexture, VideoTexture, WebGL3DRenderTarget, WebGLArrayRenderTarget, WebGLRenderTarget, WireframeGeometry, WrapAroundEnding, ZeroCurvatureEnding, ZeroSlopeEnding, getConsoleFunction, setConsoleFunction } from './three.core.js';\n\nconst refreshUniforms = [\n\t'alphaMap',\n\t'alphaTest',\n\t'anisotropy',\n\t'anisotropyMap',\n\t'anisotropyRotation',\n\t'aoMap',\n\t'aoMapIntensity',\n\t'attenuationColor',\n\t'attenuationDistance',\n\t'bumpMap',\n\t'clearcoat',\n\t'clearcoatMap',\n\t'clearcoatNormalMap',\n\t'clearcoatNormalScale',\n\t'clearcoatRoughness',\n\t'color',\n\t'dispersion',\n\t'displacementMap',\n\t'emissive',\n\t'emissiveIntensity',\n\t'emissiveMap',\n\t'envMap',\n\t'envMapIntensity',\n\t'gradientMap',\n\t'ior',\n\t'iridescence',\n\t'iridescenceIOR',\n\t'iridescenceMap',\n\t'iridescenceThicknessMap',\n\t'lightMap',\n\t'lightMapIntensity',\n\t'map',\n\t'matcap',\n\t'metalness',\n\t'metalnessMap',\n\t'normalMap',\n\t'normalScale',\n\t'opacity',\n\t'roughness',\n\t'roughnessMap',\n\t'sheen',\n\t'sheenColor',\n\t'sheenColorMap',\n\t'sheenRoughnessMap',\n\t'shininess',\n\t'specular',\n\t'specularColor',\n\t'specularColorMap',\n\t'specularIntensity',\n\t'specularIntensityMap',\n\t'specularMap',\n\t'thickness',\n\t'transmission',\n\t'transmissionMap'\n];\n\n\n/**\n * A WeakMap to cache lights data for node materials.\n * Cache lights data by render ID to avoid unnecessary recalculations.\n *\n * @private\n * @type {WeakMap<LightsNode,Object>}\n */\nconst _lightsCache = new WeakMap();\n\n/**\n * This class is used by {@link WebGPURenderer} as management component.\n * It's primary purpose is to determine whether render objects require a\n * refresh right before they are going to be rendered or not.\n */\nclass NodeMaterialObserver {\n\n\t/**\n\t * Constructs a new node material observer.\n\t *\n\t * @param {NodeBuilder} builder - The node builder.\n\t */\n\tconstructor( builder ) {\n\n\t\t/**\n\t\t * A node material can be used by more than one render object so the\n\t\t * monitor must maintain a list of render objects.\n\t\t *\n\t\t * @type {WeakMap<RenderObject,Object>}\n\t\t */\n\t\tthis.renderObjects = new WeakMap();\n\n\t\t/**\n\t\t * Whether the material uses node objects or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.hasNode = this.containsNode( builder );\n\n\t\t/**\n\t\t * Whether the node builder's 3D object is animated or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.hasAnimation = builder.object.isSkinnedMesh === true;\n\n\t\t/**\n\t\t * A list of all possible material uniforms\n\t\t *\n\t\t * @type {Array<string>}\n\t\t */\n\t\tthis.refreshUniforms = refreshUniforms;\n\n\t\t/**\n\t\t * Holds the current render ID from the node frame.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.renderId = 0;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given render object is verified for the first time of this observer.\n\t *\n\t * @param {RenderObject} renderObject - The render object.\n\t * @return {boolean} Whether the given render object is verified for the first time of this observer.\n\t */\n\tfirstInitialization( renderObject ) {\n\n\t\tconst hasInitialized = this.renderObjects.has( renderObject );\n\n\t\tif ( hasInitialized === false ) {\n\n\t\t\tthis.getRenderObjectData( renderObject );\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Returns `true` if the current rendering produces motion vectors.\n\t *\n\t * @param {Renderer} renderer - The renderer.\n\t * @return {boolean} Whether the current rendering produces motion vectors or not.\n\t */\n\tneedsVelocity( renderer ) {\n\n\t\tconst mrt = renderer.getMRT();\n\n\t\treturn ( mrt !== null && mrt.has( 'velocity' ) );\n\n\t}\n\n\t/**\n\t * Returns monitoring data for the given render object.\n\t *\n\t * @param {RenderObject} renderObject - The render object.\n\t * @return {Object} The monitoring data.\n\t */\n\tgetRenderObjectData( renderObject ) {\n\n\t\tlet data = this.renderObjects.get( renderObject );\n\n\t\tif ( data === undefined ) {\n\n\t\t\tconst { geometry, material, object } = renderObject;\n\n\t\t\tdata = {\n\t\t\t\tmaterial: this.getMaterialData( material ),\n\t\t\t\tgeometry: {\n\t\t\t\t\tid: geometry.id,\n\t\t\t\t\tattributes: this.getAttributesData( geometry.attributes ),\n\t\t\t\t\tindexVersion: geometry.index ? geometry.index.version : null,\n\t\t\t\t\tdrawRange: { start: geometry.drawRange.start, count: geometry.drawRange.count }\n\t\t\t\t},\n\t\t\t\tworldMatrix: object.matrixWorld.clone()\n\t\t\t};\n\n\t\t\tif ( object.center ) {\n\n\t\t\t\tdata.center = object.center.clone();\n\n\t\t\t}\n\n\t\t\tif ( object.morphTargetInfluences ) {\n\n\t\t\t\tdata.morphTargetInfluences = object.morphTargetInfluences.slice();\n\n\t\t\t}\n\n\t\t\tif ( renderObject.bundle !== null ) {\n\n\t\t\t\tdata.version = renderObject.bundle.version;\n\n\t\t\t}\n\n\t\t\tif ( data.material.transmission > 0 ) {\n\n\t\t\t\tconst { width, height } = renderObject.context;\n\n\t\t\t\tdata.bufferWidth = width;\n\t\t\t\tdata.bufferHeight = height;\n\n\t\t\t}\n\n\t\t\tdata.lights = this.getLightsData( renderObject.lightsNode.getLights() );\n\n\t\t\tthis.renderObjects.set( renderObject, data );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Returns an attribute data structure holding the attributes versions for\n\t * monitoring.\n\t *\n\t * @param {Object} attributes - The geometry attributes.\n\t * @return {Object} An object for monitoring the versions of attributes.\n\t */\n\tgetAttributesData( attributes ) {\n\n\t\tconst attributesData = {};\n\n\t\tfor ( const name in attributes ) {\n\n\t\t\tconst attribute = attributes[ name ];\n\n\t\t\tattributesData[ name ] = {\n\t\t\t\tversion: attribute.version\n\t\t\t};\n\n\t\t}\n\n\t\treturn attributesData;\n\n\t}\n\n\t/**\n\t * Returns `true` if the node builder's material uses\n\t * node properties.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {boolean} Whether the node builder's material uses node properties or not.\n\t */\n\tcontainsNode( builder ) {\n\n\t\tconst material = builder.material;\n\n\t\tfor ( const property in material ) {\n\n\t\t\tif ( material[ property ] && material[ property ].isNode )\n\t\t\t\treturn true;\n\n\t\t}\n\n\t\tif ( builder.context.modelViewMatrix || builder.context.modelNormalViewMatrix || builder.context.getAO || builder.context.getShadow )\n\t\t\treturn true;\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Returns a material data structure holding the material property values for\n\t * monitoring.\n\t *\n\t * @param {Material} material - The material.\n\t * @return {Object} An object for monitoring material properties.\n\t */\n\tgetMaterialData( material ) {\n\n\t\tconst data = {};\n\n\t\tfor ( const property of this.refreshUniforms ) {\n\n\t\t\tconst value = material[ property ];\n\n\t\t\tif ( value === null || value === undefined ) continue;\n\n\t\t\tif ( typeof value === 'object' && value.clone !== undefined ) {\n\n\t\t\t\tif ( value.isTexture === true ) {\n\n\t\t\t\t\tdata[ property ] = { id: value.id, version: value.version };\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdata[ property ] = value.clone();\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tdata[ property ] = value;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given render object has not changed its state.\n\t *\n\t * @param {RenderObject} renderObject - The render object.\n\t * @param {Array<Light>} lightsData - The current material lights.\n\t * @return {boolean} Whether the given render object has changed its state or not.\n\t */\n\tequals( renderObject, lightsData ) {\n\n\t\tconst { object, material, geometry } = renderObject;\n\n\t\tconst renderObjectData = this.getRenderObjectData( renderObject );\n\n\t\t// world matrix\n\n\t\tif ( renderObjectData.worldMatrix.equals( object.matrixWorld ) !== true ) {\n\n\t\t\trenderObjectData.worldMatrix.copy( object.matrixWorld );\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// material\n\n\t\tconst materialData = renderObjectData.material;\n\n\t\tfor ( const property in materialData ) {\n\n\t\t\tconst value = materialData[ property ];\n\t\t\tconst mtlValue = material[ property ];\n\n\t\t\tif ( value.equals !== undefined ) {\n\n\t\t\t\tif ( value.equals( mtlValue ) === false ) {\n\n\t\t\t\t\tvalue.copy( mtlValue );\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t} else if ( mtlValue.isTexture === true ) {\n\n\t\t\t\tif ( value.id !== mtlValue.id || value.version !== mtlValue.version ) {\n\n\t\t\t\t\tvalue.id = mtlValue.id;\n\t\t\t\t\tvalue.version = mtlValue.version;\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t} else if ( value !== mtlValue ) {\n\n\t\t\t\tmaterialData[ property ] = mtlValue;\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( materialData.transmission > 0 ) {\n\n\t\t\tconst { width, height } = renderObject.context;\n\n\t\t\tif ( renderObjectData.bufferWidth !== width || renderObjectData.bufferHeight !== height ) {\n\n\t\t\t\trenderObjectData.bufferWidth = width;\n\t\t\t\trenderObjectData.bufferHeight = height;\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// geometry\n\n\t\tconst storedGeometryData = renderObjectData.geometry;\n\t\tconst attributes = geometry.attributes;\n\t\tconst storedAttributes = storedGeometryData.attributes;\n\n\t\tconst storedAttributeNames = Object.keys( storedAttributes );\n\t\tconst currentAttributeNames = Object.keys( attributes );\n\n\t\tif ( storedGeometryData.id !== geometry.id ) {\n\n\t\t\tstoredGeometryData.id = geometry.id;\n\t\t\treturn false;\n\n\t\t}\n\n\t\tif ( storedAttributeNames.length !== currentAttributeNames.length ) {\n\n\t\t\trenderObjectData.geometry.attributes = this.getAttributesData( attributes );\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// compare each attribute\n\n\t\tfor ( const name of storedAttributeNames ) {\n\n\t\t\tconst storedAttributeData = storedAttributes[ name ];\n\t\t\tconst attribute = attributes[ name ];\n\n\t\t\tif ( attribute === undefined ) {\n\n\t\t\t\t// attribute was removed\n\t\t\t\tdelete storedAttributes[ name ];\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t\tif ( storedAttributeData.version !== attribute.version ) {\n\n\t\t\t\tstoredAttributeData.version = attribute.version;\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// check index\n\n\t\tconst index = geometry.index;\n\t\tconst storedIndexVersion = storedGeometryData.indexVersion;\n\t\tconst currentIndexVersion = index ? index.version : null;\n\n\t\tif ( storedIndexVersion !== currentIndexVersion ) {\n\n\t\t\tstoredGeometryData.indexVersion = currentIndexVersion;\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// check drawRange\n\n\t\tif ( storedGeometryData.drawRange.start !== geometry.drawRange.start || storedGeometryData.drawRange.count !== geometry.drawRange.count ) {\n\n\t\t\tstoredGeometryData.drawRange.start = geometry.drawRange.start;\n\t\t\tstoredGeometryData.drawRange.count = geometry.drawRange.count;\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// morph targets\n\n\t\tif ( renderObjectData.morphTargetInfluences ) {\n\n\t\t\tlet morphChanged = false;\n\n\t\t\tfor ( let i = 0; i < renderObjectData.morphTargetInfluences.length; i ++ ) {\n\n\t\t\t\tif ( renderObjectData.morphTargetInfluences[ i ] !== object.morphTargetInfluences[ i ] ) {\n\n\t\t\t\t\trenderObjectData.morphTargetInfluences[ i ] = object.morphTargetInfluences[ i ];\n\t\t\t\t\tmorphChanged = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( morphChanged ) return false;\n\n\t\t}\n\n\t\t// lights\n\n\t\tif ( renderObjectData.lights ) {\n\n\t\t\tfor ( let i = 0; i < lightsData.length; i ++ ) {\n\n\t\t\t\tif ( renderObjectData.lights[ i ].map !== lightsData[ i ].map ) {\n\n\t\t\t\t\treturn false;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// center\n\n\t\tif ( renderObjectData.center ) {\n\n\t\t\tif ( renderObjectData.center.equals( object.center ) === false ) {\n\n\t\t\t\trenderObjectData.center.copy( object.center );\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// bundle\n\n\t\tif ( renderObject.bundle !== null ) {\n\n\t\t\trenderObjectData.version = renderObject.bundle.version;\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Returns the lights data for the given material lights.\n\t *\n\t * @param {Array<Light>} materialLights - The material lights.\n\t * @return {Array<Object>} The lights data for the given material lights.\n\t */\n\tgetLightsData( materialLights ) {\n\n\t\tconst lights = [];\n\n\t\tfor ( const light of materialLights ) {\n\n\t\t\tif ( light.isSpotLight === true && light.map !== null ) {\n\n\t\t\t\t// only add lights that have a map\n\n\t\t\t\tlights.push( { map: light.map.version } );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn lights;\n\n\t}\n\n\t/**\n\t * Returns the lights for the given lights node and render ID.\n\t *\n\t * @param {LightsNode} lightsNode - The lights node.\n\t * @param {number} renderId - The render ID.\n\t * @return {Array<Object>} The lights for the given lights node and render ID.\n\t */\n\tgetLights( lightsNode, renderId ) {\n\n\t\tif ( _lightsCache.has( lightsNode ) ) {\n\n\t\t\tconst cached = _lightsCache.get( lightsNode );\n\n\t\t\tif ( cached.renderId === renderId ) {\n\n\t\t\t\treturn cached.lightsData;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst lightsData = this.getLightsData( lightsNode.getLights() );\n\n\t\t_lightsCache.set( lightsNode, { renderId, lightsData } );\n\n\t\treturn lightsData;\n\n\t}\n\n\t/**\n\t * Checks if the given render object requires a refresh.\n\t *\n\t * @param {RenderObject} renderObject - The render object.\n\t * @param {NodeFrame} nodeFrame - The current node frame.\n\t * @return {boolean} Whether the given render object requires a refresh or not.\n\t */\n\tneedsRefresh( renderObject, nodeFrame ) {\n\n\t\tif ( this.hasNode || this.hasAnimation || this.firstInitialization( renderObject ) || this.needsVelocity( nodeFrame.renderer ) )\n\t\t\treturn true;\n\n\t\tconst { renderId } = nodeFrame;\n\n\t\tif ( this.renderId !== renderId ) {\n\n\t\t\tthis.renderId = renderId;\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\tconst isStatic = renderObject.object.static === true;\n\t\tconst isBundle = renderObject.bundle !== null && renderObject.bundle.static === true && this.getRenderObjectData( renderObject ).version === renderObject.bundle.version;\n\n\t\tif ( isStatic || isBundle )\n\t\t\treturn false;\n\n\t\tconst lightsData = this.getLights( renderObject.lightsNode, renderId );\n\t\tconst notEqual = this.equals( renderObject, lightsData ) !== true;\n\n\t\treturn notEqual;\n\n\t}\n\n}\n\n// cyrb53 (c) 2018 bryc (github.com/bryc). License: Public domain. Attribution appreciated.\n// A fast and simple 64-bit (or 53-bit) string hash function with decent collision resistance.\n// Largely inspired by MurmurHash2/3, but with a focus on speed/simplicity.\n// See https://stackoverflow.com/questions/7616461/generate-a-hash-from-string-in-javascript/52171480#52171480\n// https://github.com/bryc/code/blob/master/jshash/experimental/cyrb53.js\nfunction cyrb53( value, seed = 0 ) {\n\n\tlet h1 = 0xdeadbeef ^ seed, h2 = 0x41c6ce57 ^ seed;\n\n\tif ( value instanceof Array ) {\n\n\t\tfor ( let i = 0, val; i < value.length; i ++ ) {\n\n\t\t\tval = value[ i ];\n\t\t\th1 = Math.imul( h1 ^ val, 2654435761 );\n\t\t\th2 = Math.imul( h2 ^ val, 1597334677 );\n\n\t\t}\n\n\t} else {\n\n\t\tfor ( let i = 0, ch; i < value.length; i ++ ) {\n\n\t\t\tch = value.charCodeAt( i );\n\t\t\th1 = Math.imul( h1 ^ ch, 2654435761 );\n\t\t\th2 = Math.imul( h2 ^ ch, 1597334677 );\n\n\t\t}\n\n\t}\n\n\th1 = Math.imul( h1 ^ ( h1 >>> 16 ), 2246822507 );\n\th1 ^= Math.imul( h2 ^ ( h2 >>> 13 ), 3266489909 );\n\th2 = Math.imul( h2 ^ ( h2 >>> 16 ), 2246822507 );\n\th2 ^= Math.imul( h1 ^ ( h1 >>> 13 ), 3266489909 );\n\n\treturn 4294967296 * ( 2097151 & h2 ) + ( h1 >>> 0 );\n\n}\n\n/**\n * Computes a hash for the given string.\n *\n * @private\n * @method\n * @param {string} str - The string to be hashed.\n * @return {number} The hash.\n */\nconst hashString = ( str ) => cyrb53( str );\n\n/**\n * Computes a hash for the given array.\n *\n * @private\n * @method\n * @param {Array<number>} array - The array to be hashed.\n * @return {number} The hash.\n */\nconst hashArray = ( array ) => cyrb53( array );\n\n/**\n * Computes a hash for the given list of parameters.\n *\n * @private\n * @method\n * @param {...number} params - A list of parameters.\n * @return {number} The hash.\n */\nconst hash$1 = ( ...params ) => cyrb53( params );\n\nconst typeFromLength = /*@__PURE__*/ new Map( [\n\t[ 1, 'float' ],\n\t[ 2, 'vec2' ],\n\t[ 3, 'vec3' ],\n\t[ 4, 'vec4' ],\n\t[ 9, 'mat3' ],\n\t[ 16, 'mat4' ]\n] );\n\nconst dataFromObject = /*@__PURE__*/ new WeakMap();\n\n/**\n * Returns the data type for the given the length.\n *\n * @private\n * @method\n * @param {number} length - The length.\n * @return {string} The data type.\n */\nfunction getTypeFromLength( length ) {\n\n\treturn typeFromLength.get( length );\n\n}\n\n/**\n * Returns the typed array for the given data type.\n *\n * @private\n * @method\n * @param {string} type - The data type.\n * @return {TypedArray} The typed array.\n */\nfunction getTypedArrayFromType( type ) {\n\n\t// Handle component type for vectors and matrices\n\tif ( /[iu]?vec\\d/.test( type ) ) {\n\n\t\t// Handle int vectors\n\t\tif ( type.startsWith( 'ivec' ) ) return Int32Array;\n\t\t// Handle uint vectors\n\t\tif ( type.startsWith( 'uvec' ) ) return Uint32Array;\n\t\t// Default to float vectors\n\t\treturn Float32Array;\n\n\t}\n\n\t// Handle matrices (always float)\n\tif ( /mat\\d/.test( type ) ) return Float32Array;\n\n\t// Basic types\n\tif ( /float/.test( type ) ) return Float32Array;\n\tif ( /uint/.test( type ) ) return Uint32Array;\n\tif ( /int/.test( type ) ) return Int32Array;\n\n\tthrow new Error( `THREE.NodeUtils: Unsupported type: ${type}` );\n\n}\n\n/**\n * Returns the length for the given data type.\n *\n * @private\n * @method\n * @param {string} type - The data type.\n * @return {number} The length.\n */\nfunction getLengthFromType( type ) {\n\n\tif ( /float|int|uint/.test( type ) ) return 1;\n\tif ( /vec2/.test( type ) ) return 2;\n\tif ( /vec3/.test( type ) ) return 3;\n\tif ( /vec4/.test( type ) ) return 4;\n\tif ( /mat2/.test( type ) ) return 4;\n\tif ( /mat3/.test( type ) ) return 9;\n\tif ( /mat4/.test( type ) ) return 16;\n\n\terror( 'TSL: Unsupported type:', type );\n\n}\n\n/**\n * Returns the gpu memory length for the given data type.\n *\n * @private\n * @method\n * @param {string} type - The data type.\n * @return {number} The length.\n */\nfunction getMemoryLengthFromType( type ) {\n\n\tif ( /float|int|uint/.test( type ) ) return 1;\n\tif ( /vec2/.test( type ) ) return 2;\n\tif ( /vec3/.test( type ) ) return 3;\n\tif ( /vec4/.test( type ) ) return 4;\n\tif ( /mat2/.test( type ) ) return 4;\n\tif ( /mat3/.test( type ) ) return 12;\n\tif ( /mat4/.test( type ) ) return 16;\n\n\terror( 'TSL: Unsupported type:', type );\n\n}\n\n/**\n * Returns the alignment requirement for the given data type.\n *\n * @private\n * @method\n * @param {string} type - The data type.\n * @return {number} The alignment requirement in bytes.\n */\nfunction getAlignmentFromType( type ) {\n\n\tif ( /float|int|uint/.test( type ) ) return 4;\n\tif ( /vec2/.test( type ) ) return 8;\n\tif ( /vec3/.test( type ) ) return 16;\n\tif ( /vec4/.test( type ) ) return 16;\n\tif ( /mat2/.test( type ) ) return 8;\n\tif ( /mat3/.test( type ) ) return 16;\n\tif ( /mat4/.test( type ) ) return 16;\n\n\terror( 'TSL: Unsupported type:', type );\n\n}\n\n/**\n * Returns the data type for the given value.\n *\n * @private\n * @method\n * @param {any} value - The value.\n * @return {?string} The data type.\n */\nfunction getValueType( value ) {\n\n\tif ( value === undefined || value === null ) return null;\n\n\tconst typeOf = typeof value;\n\n\tif ( value.isNode === true ) {\n\n\t\treturn 'node';\n\n\t} else if ( typeOf === 'number' ) {\n\n\t\treturn 'float';\n\n\t} else if ( typeOf === 'boolean' ) {\n\n\t\treturn 'bool';\n\n\t} else if ( typeOf === 'string' ) {\n\n\t\treturn 'string';\n\n\t} else if ( typeOf === 'function' ) {\n\n\t\treturn 'shader';\n\n\t} else if ( value.isVector2 === true ) {\n\n\t\treturn 'vec2';\n\n\t} else if ( value.isVector3 === true ) {\n\n\t\treturn 'vec3';\n\n\t} else if ( value.isVector4 === true ) {\n\n\t\treturn 'vec4';\n\n\t} else if ( value.isMatrix2 === true ) {\n\n\t\treturn 'mat2';\n\n\t} else if ( value.isMatrix3 === true ) {\n\n\t\treturn 'mat3';\n\n\t} else if ( value.isMatrix4 === true ) {\n\n\t\treturn 'mat4';\n\n\t} else if ( value.isColor === true ) {\n\n\t\treturn 'color';\n\n\t} else if ( value instanceof ArrayBuffer ) {\n\n\t\treturn 'ArrayBuffer';\n\n\t}\n\n\treturn null;\n\n}\n\n/**\n * Returns the value/object for the given data type and parameters.\n *\n * @private\n * @method\n * @param {string} type - The given type.\n * @param {...any} params - A parameter list.\n * @return {any} The value/object.\n */\nfunction getValueFromType( type, ...params ) {\n\n\tconst last4 = type ? type.slice( -4 ) : undefined;\n\n\tif ( params.length === 1 ) { // ensure same behaviour as in NodeBuilder.format()\n\n\t\tif ( last4 === 'vec2' ) params = [ params[ 0 ], params[ 0 ] ];\n\t\telse if ( last4 === 'vec3' ) params = [ params[ 0 ], params[ 0 ], params[ 0 ] ];\n\t\telse if ( last4 === 'vec4' ) params = [ params[ 0 ], params[ 0 ], params[ 0 ], params[ 0 ] ];\n\n\t}\n\n\tif ( type === 'color' ) {\n\n\t\treturn new Color( ...params );\n\n\t} else if ( last4 === 'vec2' ) {\n\n\t\treturn new Vector2( ...params );\n\n\t} else if ( last4 === 'vec3' ) {\n\n\t\treturn new Vector3( ...params );\n\n\t} else if ( last4 === 'vec4' ) {\n\n\t\treturn new Vector4( ...params );\n\n\t} else if ( last4 === 'mat2' ) {\n\n\t\treturn new Matrix2( ...params );\n\n\t} else if ( last4 === 'mat3' ) {\n\n\t\treturn new Matrix3( ...params );\n\n\t} else if ( last4 === 'mat4' ) {\n\n\t\treturn new Matrix4( ...params );\n\n\t} else if ( type === 'bool' ) {\n\n\t\treturn params[ 0 ] || false;\n\n\t} else if ( ( type === 'float' ) || ( type === 'int' ) || ( type === 'uint' ) ) {\n\n\t\treturn params[ 0 ] || 0;\n\n\t} else if ( type === 'string' ) {\n\n\t\treturn params[ 0 ] || '';\n\n\t} else if ( type === 'ArrayBuffer' ) {\n\n\t\treturn base64ToArrayBuffer( params[ 0 ] );\n\n\t}\n\n\treturn null;\n\n}\n\n/**\n * Gets the object data that can be shared between different rendering steps.\n *\n * @private\n * @param {Object} object - The object to get the data for.\n * @return {Object} The object data.\n */\nfunction getDataFromObject( object ) {\n\n\tlet data = dataFromObject.get( object );\n\n\tif ( data === undefined ) {\n\n\t\tdata = {};\n\t\tdataFromObject.set( object, data );\n\n\t}\n\n\treturn data;\n\n}\n\n/**\n * Converts the given array buffer to a Base64 string.\n *\n * @private\n * @method\n * @param {ArrayBuffer} arrayBuffer - The array buffer.\n * @return {string} The Base64 string.\n */\nfunction arrayBufferToBase64( arrayBuffer ) {\n\n\tlet chars = '';\n\n\tconst array = new Uint8Array( arrayBuffer );\n\n\tfor ( let i = 0; i < array.length; i ++ ) {\n\n\t\tchars += String.fromCharCode( array[ i ] );\n\n\t}\n\n\treturn btoa( chars );\n\n}\n\n/**\n * Converts the given Base64 string to an array buffer.\n *\n * @private\n * @method\n * @param {string} base64 - The Base64 string.\n * @return {ArrayBuffer} The array buffer.\n */\nfunction base64ToArrayBuffer( base64 ) {\n\n\treturn Uint8Array.from( atob( base64 ), c => c.charCodeAt( 0 ) ).buffer;\n\n}\n\nvar NodeUtils = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tarrayBufferToBase64: arrayBufferToBase64,\n\tbase64ToArrayBuffer: base64ToArrayBuffer,\n\tgetAlignmentFromType: getAlignmentFromType,\n\tgetDataFromObject: getDataFromObject,\n\tgetLengthFromType: getLengthFromType,\n\tgetMemoryLengthFromType: getMemoryLengthFromType,\n\tgetTypeFromLength: getTypeFromLength,\n\tgetTypedArrayFromType: getTypedArrayFromType,\n\tgetValueFromType: getValueFromType,\n\tgetValueType: getValueType,\n\thash: hash$1,\n\thashArray: hashArray,\n\thashString: hashString\n});\n\n/**\n * Possible shader stages.\n *\n * @property {string} VERTEX The vertex shader stage.\n * @property {string} FRAGMENT The fragment shader stage.\n */\nconst NodeShaderStage = {\n\tVERTEX: 'vertex',\n\tFRAGMENT: 'fragment'\n};\n\n/**\n * Update types of a node.\n *\n * @property {string} NONE The update method is not executed.\n * @property {string} FRAME The update method is executed per frame.\n * @property {string} RENDER The update method is executed per render. A frame might be produced by multiple render calls so this value allows more detailed updates than FRAME.\n * @property {string} OBJECT The update method is executed per {@link Object3D} that uses the node for rendering.\n */\nconst NodeUpdateType = {\n\tNONE: 'none',\n\tFRAME: 'frame',\n\tRENDER: 'render',\n\tOBJECT: 'object'\n};\n\n/**\n * Data types of a node.\n *\n * @property {string} BOOLEAN Boolean type.\n * @property {string} INTEGER Integer type.\n * @property {string} FLOAT Float type.\n * @property {string} VECTOR2 Two-dimensional vector type.\n * @property {string} VECTOR3 Three-dimensional vector type.\n * @property {string} VECTOR4 Four-dimensional vector type.\n * @property {string} MATRIX2 2x2 matrix type.\n * @property {string} MATRIX3 3x3 matrix type.\n * @property {string} MATRIX4 4x4 matrix type.\n */\nconst NodeType = {\n\tBOOLEAN: 'bool',\n\tINTEGER: 'int',\n\tFLOAT: 'float',\n\tVECTOR2: 'vec2',\n\tVECTOR3: 'vec3',\n\tVECTOR4: 'vec4',\n\tMATRIX2: 'mat2',\n\tMATRIX3: 'mat3',\n\tMATRIX4: 'mat4'\n};\n\n/**\n * Access types of a node. These are relevant for compute and storage usage.\n *\n * @property {string} READ_ONLY Read-only access\n * @property {string} WRITE_ONLY Write-only access.\n * @property {string} READ_WRITE Read and write access.\n */\nconst NodeAccess = {\n\tREAD_ONLY: 'readOnly',\n\tWRITE_ONLY: 'writeOnly',\n\tREAD_WRITE: 'readWrite',\n};\n\nconst defaultShaderStages = [ 'fragment', 'vertex' ];\nconst defaultBuildStages = [ 'setup', 'analyze', 'generate' ];\nconst shaderStages = [ ...defaultShaderStages, 'compute' ];\nconst vectorComponents = [ 'x', 'y', 'z', 'w' ];\n\nconst _parentBuildStage = {\n\tanalyze: 'setup',\n\tgenerate: 'analyze'\n};\n\nlet _nodeId = 0;\n\n/**\n * Base class for all nodes.\n *\n * @augments EventDispatcher\n */\nclass Node extends EventDispatcher {\n\n\tstatic get type() {\n\n\t\treturn 'Node';\n\n\t}\n\n\t/**\n\t * Constructs a new node.\n\t *\n\t * @param {?string} nodeType - The node type.\n\t */\n\tconstructor( nodeType = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The node type. This represents the result type of the node (e.g. `float` or `vec3`).\n\t\t *\n\t\t * @type {?string}\n\t\t * @default null\n\t\t */\n\t\tthis.nodeType = nodeType;\n\n\t\t/**\n\t\t * The update type of the node's {@link Node#update} method. Possible values are listed in {@link NodeUpdateType}.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'none'\n\t\t */\n\t\tthis.updateType = NodeUpdateType.NONE;\n\n\t\t/**\n\t\t * The update type of the node's {@link Node#updateBefore} method. Possible values are listed in {@link NodeUpdateType}.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'none'\n\t\t */\n\t\tthis.updateBeforeType = NodeUpdateType.NONE;\n\n\t\t/**\n\t\t * The update type of the node's {@link Node#updateAfter} method. Possible values are listed in {@link NodeUpdateType}.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'none'\n\t\t */\n\t\tthis.updateAfterType = NodeUpdateType.NONE;\n\n\t\t/**\n\t\t * The UUID of the node.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t */\n\t\tthis.uuid = MathUtils.generateUUID();\n\n\t\t/**\n\t\t * The version of the node. The version automatically is increased when {@link Node#needsUpdate} is set to `true`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\n\t\t/**\n\t\t * The name of the node.\n\t\t *\n\t\t * @type {string}\n\t\t * @default ''\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * Whether this node is global or not. This property is relevant for the internal\n\t\t * node caching system. All nodes which should be declared just once should\n\t\t * set this flag to `true` (a typical example is {@link AttributeNode}).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.global = false;\n\n\t\t/**\n\t\t * Create a list of parents for this node during the build process.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.parents = false;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isNode = true;\n\n\t\t// private\n\n\t\tthis._beforeNodes = null;\n\n\t\t/**\n\t\t * The cache key of this node.\n\t\t *\n\t\t * @private\n\t\t * @type {?number}\n\t\t * @default null\n\t\t */\n\t\tthis._cacheKey = null;\n\n\t\t/**\n\t\t * The cache key 's version.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis._cacheKeyVersion = 0;\n\n\t\tObject.defineProperty( this, 'id', { value: _nodeId ++ } );\n\n\t}\n\n\t/**\n\t * Set this property to `true` when the node should be regenerated.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) {\n\n\t\t\tthis.version ++;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * The type of the class. The value is usually the constructor name.\n\t *\n\t * @type {string}\n \t * @readonly\n\t */\n\tget type() {\n\n\t\treturn this.constructor.type;\n\n\t}\n\n\t/**\n\t * Convenient method for defining {@link Node#update}.\n\t *\n\t * @param {Function} callback - The update method.\n\t * @param {string} updateType - The update type.\n\t * @return {Node} A reference to this node.\n\t */\n\tonUpdate( callback, updateType ) {\n\n\t\tthis.updateType = updateType;\n\t\tthis.update = callback.bind( this );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Convenient method for defining {@link Node#update}. Similar to {@link Node#onUpdate}, but\n\t * this method automatically sets the update type to `FRAME`.\n\t *\n\t * @param {Function} callback - The update method.\n\t * @return {Node} A reference to this node.\n\t */\n\tonFrameUpdate( callback ) {\n\n\t\treturn this.onUpdate( callback, NodeUpdateType.FRAME );\n\n\t}\n\n\t/**\n\t * Convenient method for defining {@link Node#update}. Similar to {@link Node#onUpdate}, but\n\t * this method automatically sets the update type to `RENDER`.\n\t *\n\t * @param {Function} callback - The update method.\n\t * @return {Node} A reference to this node.\n\t */\n\tonRenderUpdate( callback ) {\n\n\t\treturn this.onUpdate( callback, NodeUpdateType.RENDER );\n\n\t}\n\n\t/**\n\t * Convenient method for defining {@link Node#update}. Similar to {@link Node#onUpdate}, but\n\t * this method automatically sets the update type to `OBJECT`.\n\t *\n\t * @param {Function} callback - The update method.\n\t * @return {Node} A reference to this node.\n\t */\n\tonObjectUpdate( callback ) {\n\n\t\treturn this.onUpdate( callback, NodeUpdateType.OBJECT );\n\n\t}\n\n\t/**\n\t * Convenient method for defining {@link Node#updateReference}.\n\t *\n\t * @param {Function} callback - The update method.\n\t * @return {Node} A reference to this node.\n\t */\n\tonReference( callback ) {\n\n\t\tthis.updateReference = callback.bind( this );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Nodes might refer to other objects like materials. This method allows to dynamically update the reference\n\t * to such objects based on a given state (e.g. the current node frame or builder).\n\t *\n\t * @param {any} state - This method can be invocated in different contexts so `state` can refer to any object type.\n\t * @return {any} The updated reference.\n\t */\n\tupdateReference( /*state*/ ) {\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * By default this method returns the value of the {@link Node#global} flag. This method\n\t * can be overwritten in derived classes if an analytical way is required to determine the\n\t * global cache referring to the current shader-stage.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {boolean} Whether this node is global or not.\n\t */\n\tisGlobal( /*builder*/ ) {\n\n\t\treturn this.global;\n\n\t}\n\n\t/**\n\t * Generator function that can be used to iterate over the child nodes.\n\t *\n\t * @generator\n\t * @yields {Node} A child node.\n\t */\n\t* getChildren() {\n\n\t\tfor ( const { childNode } of this._getChildren() ) {\n\n\t\t\tyield childNode;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Calling this method dispatches the `dispose` event. This event can be used\n\t * to register event listeners for clean up tasks.\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\t/**\n\t * Callback for {@link Node#traverse}.\n\t *\n\t * @callback traverseCallback\n\t * @param {Node} node - The current node.\n\t */\n\n\t/**\n\t * Can be used to traverse through the node's hierarchy.\n\t *\n\t * @param {traverseCallback} callback - A callback that is executed per node.\n\t */\n\ttraverse( callback ) {\n\n\t\tcallback( this );\n\n\t\tfor ( const childNode of this.getChildren() ) {\n\n\t\t\tchildNode.traverse( callback );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the child nodes of this node.\n\t *\n\t * @private\n\t * @param {Set<Node>} [ignores=new Set()] - A set of nodes to ignore during the search to avoid circular references.\n\t * @returns {Array<Object>} An array of objects describing the child nodes.\n\t */\n\t_getChildren( ignores = new Set() ) {\n\n\t\tconst children = [];\n\n\t\t// avoid circular references\n\t\tignores.add( this );\n\n\t\tfor ( const property of Object.getOwnPropertyNames( this ) ) {\n\n\t\t\tconst object = this[ property ];\n\n\t\t\t// Ignore private properties and ignored nodes.\n\t\t\tif ( property.startsWith( '_' ) === true || ignores.has( object ) ) continue;\n\n\t\t\tif ( Array.isArray( object ) === true ) {\n\n\t\t\t\tfor ( let i = 0; i < object.length; i ++ ) {\n\n\t\t\t\t\tconst child = object[ i ];\n\n\t\t\t\t\tif ( child && child.isNode === true ) {\n\n\t\t\t\t\t\tchildren.push( { property, index: i, childNode: child } );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( object && object.isNode === true ) {\n\n\t\t\t\tchildren.push( { property, childNode: object } );\n\n\t\t\t} else if ( object && Object.getPrototypeOf( object ) === Object.prototype ) {\n\n\t\t\t\tfor ( const subProperty in object ) {\n\n\t\t\t\t\t// Ignore private sub-properties.\n\t\t\t\t\tif ( subProperty.startsWith( '_' ) === true ) continue;\n\n\t\t\t\t\tconst child = object[ subProperty ];\n\n\t\t\t\t\tif ( child && child.isNode === true ) {\n\n\t\t\t\t\t\tchildren.push( { property, index: subProperty, childNode: child } );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\treturn children;\n\n\t}\n\n\t/**\n\t * Returns the cache key for this node.\n\t *\n\t * @param {boolean} [force=false] - When set to `true`, a recomputation of the cache key is forced.\n\t * @param {Set<Node>} [ignores=null] - A set of nodes to ignore during the computation of the cache key.\n\t * @return {number} The cache key of the node.\n\t */\n\tgetCacheKey( force = false, ignores = null ) {\n\n\t\tforce = force || this.version !== this._cacheKeyVersion;\n\n\t\tif ( force === true || this._cacheKey === null ) {\n\n\t\t\tif ( ignores === null ) ignores = new Set();\n\n\t\t\t//\n\n\t\t\tconst values = [];\n\n\t\t\tfor ( const { property, childNode } of this._getChildren( ignores ) ) {\n\n\t\t\t\tvalues.push( hashString( property.slice( 0, -4 ) ), childNode.getCacheKey( force, ignores ) );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tthis._cacheKey = hash$1( hashArray( values ), this.customCacheKey() );\n\t\t\tthis._cacheKeyVersion = this.version;\n\n\t\t}\n\n\t\treturn this._cacheKey;\n\n\t}\n\n\t/**\n\t * Generate a custom cache key for this node.\n\t *\n\t * @return {number} The cache key of the node.\n\t */\n\tcustomCacheKey() {\n\n\t\treturn this.id;\n\n\t}\n\n\t/**\n\t * Returns the references to this node which is by default `this`.\n\t *\n\t * @return {Node} A reference to this node.\n\t */\n\tgetScope() {\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the hash of the node which is used to identify the node. By default it's\n\t * the {@link Node#uuid} however derived node classes might have to overwrite this method\n\t * depending on their implementation.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The hash.\n\t */\n\tgetHash( /*builder*/ ) {\n\n\t\treturn this.uuid;\n\n\t}\n\n\t/**\n\t * Returns the update type of {@link Node#update}.\n\t *\n\t * @return {NodeUpdateType} The update type.\n\t */\n\tgetUpdateType() {\n\n\t\treturn this.updateType;\n\n\t}\n\n\t/**\n\t * Returns the update type of {@link Node#updateBefore}.\n\t *\n\t * @return {NodeUpdateType} The update type.\n\t */\n\tgetUpdateBeforeType() {\n\n\t\treturn this.updateBeforeType;\n\n\t}\n\n\t/**\n\t * Returns the update type of {@link Node#updateAfter}.\n\t *\n\t * @return {NodeUpdateType} The update type.\n\t */\n\tgetUpdateAfterType() {\n\n\t\treturn this.updateAfterType;\n\n\t}\n\n\t/**\n\t * Certain types are composed of multiple elements. For example a `vec3`\n\t * is composed of three `float` values. This method returns the type of\n\t * these elements.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The type of the node.\n\t */\n\tgetElementType( builder ) {\n\n\t\tconst type = this.getNodeType( builder );\n\t\tconst elementType = builder.getElementType( type );\n\n\t\treturn elementType;\n\n\t}\n\n\t/**\n\t * Returns the node member type for the given name.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @param {string} name - The name of the member.\n\t * @return {string} The type of the node.\n\t */\n\tgetMemberType( /*builder, name*/ ) {\n\n\t\treturn 'void';\n\n\t}\n\n\t/**\n\t * Returns the node's type.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The type of the node.\n\t */\n\tgetNodeType( builder ) {\n\n\t\tconst nodeProperties = builder.getNodeProperties( this );\n\n\t\tif ( nodeProperties.outputNode ) {\n\n\t\t\treturn nodeProperties.outputNode.getNodeType( builder );\n\n\t\t}\n\n\t\treturn this.nodeType;\n\n\t}\n\n\t/**\n\t * This method is used during the build process of a node and ensures\n\t * equal nodes are not built multiple times but just once. For example if\n\t * `attribute( 'uv' )` is used multiple times by the user, the build\n\t * process makes sure to process just the first node.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {Node} The shared node if possible. Otherwise `this` is returned.\n\t */\n\tgetShared( builder ) {\n\n\t\tconst hash = this.getHash( builder );\n\t\tconst nodeFromHash = builder.getNodeFromHash( hash );\n\n\t\treturn nodeFromHash || this;\n\n\t}\n\n\t/**\n\t * Returns the number of elements in the node array.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {?number} The number of elements in the node array.\n\t */\n\tgetArrayCount( /*builder*/ ) {\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Represents the setup stage which is the first step of the build process, see {@link Node#build} method.\n\t * This method is often overwritten in derived modules to prepare the node which is used as a node's output/result.\n\t * If an output node is prepared, then it must be returned in the `return` statement of the derived module's setup function.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {?Node} The output node.\n\t */\n\tsetup( builder ) {\n\n\t\tconst nodeProperties = builder.getNodeProperties( this );\n\n\t\tlet index = 0;\n\n\t\tfor ( const childNode of this.getChildren() ) {\n\n\t\t\tnodeProperties[ 'node' + index ++ ] = childNode;\n\n\t\t}\n\n\t\t// return a outputNode if exists or null\n\n\t\treturn nodeProperties.outputNode || null;\n\n\t}\n\n\t/**\n\t * Represents the analyze stage which is the second step of the build process, see {@link Node#build} method.\n\t * This stage analyzes the node hierarchy and ensures descendent nodes are built.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @param {?Node} output - The target output node.\n\t */\n\tanalyze( builder, output = null ) {\n\n\t\tconst usageCount = builder.increaseUsage( this );\n\n\t\tif ( this.parents === true ) {\n\n\t\t\tconst nodeData = builder.getDataFromNode( this, 'any' );\n\t\t\tnodeData.stages = nodeData.stages || {};\n\t\t\tnodeData.stages[ builder.shaderStage ] = nodeData.stages[ builder.shaderStage ] || [];\n\t\t\tnodeData.stages[ builder.shaderStage ].push( output );\n\n\t\t}\n\n\t\tif ( usageCount === 1 ) {\n\n\t\t\t// node flow children\n\n\t\t\tconst nodeProperties = builder.getNodeProperties( this );\n\n\t\t\tfor ( const childNode of Object.values( nodeProperties ) ) {\n\n\t\t\t\tif ( childNode && childNode.isNode === true ) {\n\n\t\t\t\t\tchildNode.build( builder, this );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Represents the generate stage which is the third step of the build process, see {@link Node#build} method.\n\t * This state builds the output node and returns the resulting shader string.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @param {?string} [output] - Can be used to define the output type.\n\t * @return {?string} The generated shader string.\n\t */\n\tgenerate( builder, output ) {\n\n\t\tconst { outputNode } = builder.getNodeProperties( this );\n\n\t\tif ( outputNode && outputNode.isNode === true ) {\n\n\t\t\treturn outputNode.build( builder, output );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * The method can be implemented to update the node's internal state before it is used to render an object.\n\t * The {@link Node#updateBeforeType} property defines how often the update is executed.\n\t *\n\t * @abstract\n\t * @param {NodeFrame} frame - A reference to the current node frame.\n\t * @return {?boolean} An optional bool that indicates whether the implementation actually performed an update or not (e.g. due to caching).\n\t */\n\tupdateBefore( /*frame*/ ) {\n\n\t\twarn( 'Abstract function.' );\n\n\t}\n\n\t/**\n\t * The method can be implemented to update the node's internal state after it was used to render an object.\n\t * The {@link Node#updateAfterType} property defines how often the update is executed.\n\t *\n\t * @abstract\n\t * @param {NodeFrame} frame - A reference to the current node frame.\n\t * @return {?boolean} An optional bool that indicates whether the implementation actually performed an update or not (e.g. due to caching).\n\t */\n\tupdateAfter( /*frame*/ ) {\n\n\t\twarn( 'Abstract function.' );\n\n\t}\n\n\t/**\n\t * The method can be implemented to update the node's internal state when it is used to render an object.\n\t * The {@link Node#updateType} property defines how often the update is executed.\n\t *\n\t * @abstract\n\t * @param {NodeFrame} frame - A reference to the current node frame.\n\t * @return {?boolean} An optional bool that indicates whether the implementation actually performed an update or not (e.g. due to caching).\n\t */\n\tupdate( /*frame*/ ) {\n\n\t\twarn( 'Abstract function.' );\n\n\t}\n\n\tbefore( node ) {\n\n\t\tif ( this._beforeNodes === null ) this._beforeNodes = [];\n\n\t\tthis._beforeNodes.push( node );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * This method performs the build of a node. The behavior and return value depend on the current build stage:\n\t * - **setup**: Prepares the node and its children for the build process. This process can also create new nodes. Returns the node itself or a variant.\n\t * - **analyze**: Analyzes the node hierarchy for optimizations in the code generation stage. Returns `null`.\n\t * - **generate**: Generates the shader code for the node. Returns the generated shader string.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @param {?(string|Node)} [output=null] - Can be used to define the output type.\n\t * @return {?(Node|string)} The result of the build process, depending on the build stage.\n\t */\n\tbuild( builder, output = null ) {\n\n\t\tconst refNode = this.getShared( builder );\n\n\t\tif ( this !== refNode ) {\n\n\t\t\treturn refNode.build( builder, output );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( this._beforeNodes !== null ) {\n\n\t\t\tconst currentBeforeNodes = this._beforeNodes;\n\n\t\t\tthis._beforeNodes = null;\n\n\t\t\tfor ( const beforeNode of currentBeforeNodes ) {\n\n\t\t\t\tbeforeNode.build( builder, output );\n\n\t\t\t}\n\n\t\t\tthis._beforeNodes = currentBeforeNodes;\n\n\t\t}\n\n\t\t//\n\n\t\tconst nodeData = builder.getDataFromNode( this );\n\t\tnodeData.buildStages = nodeData.buildStages || {};\n\t\tnodeData.buildStages[ builder.buildStage ] = true;\n\n\t\tconst parentBuildStage = _parentBuildStage[ builder.buildStage ];\n\n\t\tif ( parentBuildStage && nodeData.buildStages[ parentBuildStage ] !== true ) {\n\n\t\t\t// force parent build stage (setup or analyze)\n\n\t\t\tconst previousBuildStage = builder.getBuildStage();\n\n\t\t\tbuilder.setBuildStage( parentBuildStage );\n\n\t\t\tthis.build( builder );\n\n\t\t\tbuilder.setBuildStage( previousBuildStage );\n\n\t\t}\n\n\t\t//\n\n\t\tbuilder.addNode( this );\n\t\tbuilder.addChain( this );\n\n\t\t/* Build stages expected results:\n\t\t\t- \"setup\"\t\t-> Node\n\t\t\t- \"analyze\"\t\t-> null\n\t\t\t- \"generate\"\t-> String\n\t\t*/\n\t\tlet result = null;\n\n\t\tconst buildStage = builder.getBuildStage();\n\n\t\tif ( buildStage === 'setup' ) {\n\n\t\t\tthis.updateReference( builder );\n\n\t\t\tconst properties = builder.getNodeProperties( this );\n\n\t\t\tif ( properties.initialized !== true ) {\n\n\t\t\t\t//const stackNodesBeforeSetup = builder.stack.nodes.length;\n\n\t\t\t\tproperties.initialized = true;\n\t\t\t\tproperties.outputNode = this.setup( builder ) || properties.outputNode || null;\n\n\t\t\t\t/*if ( isNodeOutput && builder.stack.nodes.length !== stackNodesBeforeSetup ) {\n\n\t\t\t\t\t// !! no outputNode !!\n\t\t\t\t\t//outputNode = builder.stack;\n\n\t\t\t\t}*/\n\n\t\t\t\tfor ( const childNode of Object.values( properties ) ) {\n\n\t\t\t\t\tif ( childNode && childNode.isNode === true ) {\n\n\t\t\t\t\t\tif ( childNode.parents === true ) {\n\n\t\t\t\t\t\t\tconst childProperties = builder.getNodeProperties( childNode );\n\t\t\t\t\t\t\tchildProperties.parents = childProperties.parents || [];\n\t\t\t\t\t\t\tchildProperties.parents.push( this );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tchildNode.build( builder );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tresult = properties.outputNode;\n\n\t\t} else if ( buildStage === 'analyze' ) {\n\n\t\t\tthis.analyze( builder, output );\n\n\t\t} else if ( buildStage === 'generate' ) {\n\n\t\t\t// If generate has just one argument, it means the output type is not required.\n\t\t\t// This means that the node does not handle output conversions internally,\n\t\t\t// so the value is stored in a cache and the builder handles the conversion\n\t\t\t// for all requested output types.\n\n\t\t\tconst isGenerateOnce = this.generate.length < 2;\n\n\t\t\tif ( isGenerateOnce ) {\n\n\t\t\t\tconst type = this.getNodeType( builder );\n\t\t\t\tconst nodeData = builder.getDataFromNode( this );\n\n\t\t\t\tresult = nodeData.snippet;\n\n\t\t\t\tif ( result === undefined ) {\n\n\t\t\t\t\tif ( nodeData.generated === undefined ) {\n\n\t\t\t\t\t\tnodeData.generated = true;\n\n\t\t\t\t\t\tresult = this.generate( builder ) || '';\n\n\t\t\t\t\t\tnodeData.snippet = result;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\twarn( 'Node: Recursion detected.', this );\n\n\t\t\t\t\t\tresult = '/* Recursion detected. */';\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( nodeData.flowCodes !== undefined && builder.context.nodeBlock !== undefined ) {\n\n\t\t\t\t\tbuilder.addFlowCodeHierarchy( this, builder.context.nodeBlock );\n\n\t\t\t\t}\n\n\t\t\t\tresult = builder.format( result, type, output );\n\n\t\t\t} else {\n\n\t\t\t\tresult = this.generate( builder, output ) || '';\n\n\t\t\t}\n\n\t\t\tif ( result === '' && output !== null && output !== 'void' && output !== 'OutputType' ) {\n\n\t\t\t\t// if no snippet is generated, return a default value\n\n\t\t\t\terror( `TSL: Invalid generated code, expected a \"${ output }\".` );\n\n\t\t\t\tresult = builder.generateConst( output );\n\n\t\t\t}\n\n\t\t}\n\n\t\tbuilder.removeChain( this );\n\t\tbuilder.addSequentialNode( this );\n\n\t\treturn result;\n\n\t}\n\n\t/**\n\t * Returns the child nodes as a JSON object.\n\t *\n\t * @return {Generator<Object>} An iterable list of serialized child objects as JSON.\n\t */\n\tgetSerializeChildren() {\n\n\t\treturn this._getChildren();\n\n\t}\n\n\t/**\n\t * Serializes the node to JSON.\n\t *\n\t * @param {Object} json - The output JSON object.\n\t */\n\tserialize( json ) {\n\n\t\tconst nodeChildren = this.getSerializeChildren();\n\n\t\tconst inputNodes = {};\n\n\t\tfor ( const { property, index, childNode } of nodeChildren ) {\n\n\t\t\tif ( index !== undefined ) {\n\n\t\t\t\tif ( inputNodes[ property ] === undefined ) {\n\n\t\t\t\t\tinputNodes[ property ] = Number.isInteger( index ) ? [] : {};\n\n\t\t\t\t}\n\n\t\t\t\tinputNodes[ property ][ index ] = childNode.toJSON( json.meta ).uuid;\n\n\t\t\t} else {\n\n\t\t\t\tinputNodes[ property ] = childNode.toJSON( json.meta ).uuid;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( Object.keys( inputNodes ).length > 0 ) {\n\n\t\t\tjson.inputNodes = inputNodes;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Deserializes the node from the given JSON.\n\t *\n\t * @param {Object} json - The JSON object.\n\t */\n\tdeserialize( json ) {\n\n\t\tif ( json.inputNodes !== undefined ) {\n\n\t\t\tconst nodes = json.meta.nodes;\n\n\t\t\tfor ( const property in json.inputNodes ) {\n\n\t\t\t\tif ( Array.isArray( json.inputNodes[ property ] ) ) {\n\n\t\t\t\t\tconst inputArray = [];\n\n\t\t\t\t\tfor ( const uuid of json.inputNodes[ property ] ) {\n\n\t\t\t\t\t\tinputArray.push( nodes[ uuid ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis[ property ] = inputArray;\n\n\t\t\t\t} else if ( typeof json.inputNodes[ property ] === 'object' ) {\n\n\t\t\t\t\tconst inputObject = {};\n\n\t\t\t\t\tfor ( const subProperty in json.inputNodes[ property ] ) {\n\n\t\t\t\t\t\tconst uuid = json.inputNodes[ property ][ subProperty ];\n\n\t\t\t\t\t\tinputObject[ subProperty ] = nodes[ uuid ];\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis[ property ] = inputObject;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst uuid = json.inputNodes[ property ];\n\n\t\t\t\t\tthis[ property ] = nodes[ uuid ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes the node into the three.js JSON Object/Scene format.\n\t *\n\t * @param {?Object} meta - An optional JSON object that already holds serialized data from other scene objects.\n\t * @return {Object} The serialized node.\n\t */\n\ttoJSON( meta ) {\n\n\t\tconst { uuid, type } = this;\n\t\tconst isRoot = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( isRoot ) {\n\n\t\t\tmeta = {\n\t\t\t\ttextures: {},\n\t\t\t\timages: {},\n\t\t\t\tnodes: {}\n\t\t\t};\n\n\t\t}\n\n\t\t// serialize\n\n\t\tlet data = meta.nodes[ uuid ];\n\n\t\tif ( data === undefined ) {\n\n\t\t\tdata = {\n\t\t\t\tuuid,\n\t\t\t\ttype,\n\t\t\t\tmeta,\n\t\t\t\tmetadata: {\n\t\t\t\t\tversion: 4.7,\n\t\t\t\t\ttype: 'Node',\n\t\t\t\t\tgenerator: 'Node.toJSON'\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tif ( isRoot !== true ) meta.nodes[ data.uuid ] = data;\n\n\t\t\tthis.serialize( data );\n\n\t\t\tdelete data.meta;\n\n\t\t}\n\n\t\t// TODO: Copied from Object3D.toJSON\n\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t\tif ( isRoot ) {\n\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\t\t\tconst nodes = extractFromCache( meta.nodes );\n\n\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\tif ( images.length > 0 ) data.images = images;\n\t\t\tif ( nodes.length > 0 ) data.nodes = nodes;\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Base class for representing element access on an array-like\n * node data structures.\n *\n * @augments Node\n */\nclass ArrayElementNode extends Node { // @TODO: If extending from TempNode it breaks webgpu_compute\n\n\tstatic get type() {\n\n\t\treturn 'ArrayElementNode';\n\n\t}\n\n\t/**\n\t * Constructs an array element node.\n\t *\n\t * @param {Node} node - The array-like node.\n\t * @param {Node} indexNode - The index node that defines the element access.\n\t */\n\tconstructor( node, indexNode ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The array-like node.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.node = node;\n\n\t\t/**\n\t\t * The index node that defines the element access.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.indexNode = indexNode;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isArrayElementNode = true;\n\n\t}\n\n\t/**\n\t * This method is overwritten since the node type is inferred from the array-like node.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The node type.\n\t */\n\tgetNodeType( builder ) {\n\n\t\treturn this.node.getElementType( builder );\n\n\t}\n\n\t/**\n\t * This method is overwritten since the member type is inferred from the array-like node.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @param {string} name - The member name.\n\t * @return {string} The member type.\n\t */\n\tgetMemberType( builder, name ) {\n\n\t\treturn this.node.getMemberType( builder, name );\n\n\t}\n\n\tgenerate( builder ) {\n\n\t\tconst indexType = this.indexNode.getNodeType( builder );\n\n\t\tconst nodeSnippet = this.node.build( builder );\n\t\tconst indexSnippet = this.indexNode.build( builder, ! builder.isVector( indexType ) && builder.isInteger( indexType ) ? indexType : 'uint' );\n\n\t\treturn `${ nodeSnippet }[ ${ indexSnippet } ]`;\n\n\t}\n\n}\n\n/**\n * This module is part of the TSL core and usually not used in app level code.\n * It represents a convert operation during the shader generation process\n * meaning it converts the data type of a node to a target data type.\n *\n * @augments Node\n */\nclass ConvertNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'ConvertNode';\n\n\t}\n\n\t/**\n\t * Constructs a new convert node.\n\t *\n\t * @param {Node} node - The node which type should be converted.\n\t * @param {string} convertTo - The target node type. Multiple types can be defined by separating them with a `|` sign.\n\t */\n\tconstructor( node, convertTo ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The node which type should be converted.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.node = node;\n\n\t\t/**\n\t\t * The target node type. Multiple types can be defined by separating them with a `|` sign.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.convertTo = convertTo;\n\n\t}\n\n\t/**\n\t * This method is overwritten since the implementation tries to infer the best\n\t * matching type from the {@link ConvertNode#convertTo} property.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The node type.\n\t */\n\tgetNodeType( builder ) {\n\n\t\tconst requestType = this.node.getNodeType( builder );\n\n\t\tlet convertTo = null;\n\n\t\tfor ( const overloadingType of this.convertTo.split( '|' ) ) {\n\n\t\t\tif ( convertTo === null || builder.getTypeLength( requestType ) === builder.getTypeLength( overloadingType ) ) {\n\n\t\t\t\tconvertTo = overloadingType;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn convertTo;\n\n\t}\n\n\tserialize( data ) {\n\n\t\tsuper.serialize( data );\n\n\t\tdata.convertTo = this.convertTo;\n\n\t}\n\n\tdeserialize( data ) {\n\n\t\tsuper.deserialize( data );\n\n\t\tthis.convertTo = data.convertTo;\n\n\t}\n\n\tgenerate( builder, output ) {\n\n\t\tconst node = this.node;\n\t\tconst type = this.getNodeType( builder );\n\n\t\tconst snippet = node.build( builder, type );\n\n\t\treturn builder.format( snippet, type, output );\n\n\t}\n\n}\n\n/**\n * This module uses cache management to create temporary variables\n * if the node is used more than once to prevent duplicate calculations.\n *\n * The class acts as a base class for many other nodes types.\n *\n * @augments Node\n */\nclass TempNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'TempNode';\n\n\t}\n\n\t/**\n\t * Constructs a temp node.\n\t *\n\t * @param {?string} nodeType - The node type.\n\t */\n\tconstructor( nodeType = null ) {\n\n\t\tsuper( nodeType );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isTempNode = true;\n\n\t}\n\n\t/**\n\t * Whether this node is used more than once in context of other nodes.\n\t *\n\t * @param {NodeBuilder} builder - The node builder.\n\t * @return {boolean} A flag that indicates if there is more than one dependency to other nodes.\n\t */\n\thasDependencies( builder ) {\n\n\t\treturn builder.getDataFromNode( this ).usageCount > 1;\n\n\t}\n\n\tbuild( builder, output ) {\n\n\t\tconst buildStage = builder.getBuildStage();\n\n\t\tif ( buildStage === 'generate' ) {\n\n\t\t\tconst type = builder.getVectorType( this.getNodeType( builder, output ) );\n\t\t\tconst nodeData = builder.getDataFromNode( this );\n\n\t\t\tif ( nodeData.propertyName !== undefined ) {\n\n\t\t\t\treturn builder.format( nodeData.propertyName, type, output );\n\n\t\t\t} else if ( type !== 'void' && output !== 'void' && this.hasDependencies( builder ) ) {\n\n\t\t\t\tconst snippet = super.build( builder, type );\n\n\t\t\t\tconst nodeVar = builder.getVarFromNode( this, null, type );\n\t\t\t\tconst propertyName = builder.getPropertyName( nodeVar );\n\n\t\t\t\tbuilder.addLineFlowCode( `${ propertyName } = ${ snippet }`, this );\n\n\t\t\t\tnodeData.snippet = snippet;\n\t\t\t\tnodeData.propertyName = propertyName;\n\n\t\t\t\treturn builder.format( nodeData.propertyName, type, output );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn super.build( builder, output );\n\n\t}\n\n}\n\n/**\n * This module is part of the TSL core and usually not used in app level code.\n * It represents a join operation during the shader generation process.\n * For example in can compose/join two single floats into a `vec2` type.\n *\n * @augments TempNode\n */\nclass JoinNode extends TempNode {\n\n\tstatic get type() {\n\n\t\treturn 'JoinNode';\n\n\t}\n\n\t/**\n\t * Constructs a new join node.\n\t *\n\t * @param {Array<Node>} nodes - An array of nodes that should be joined.\n\t * @param {?string} [nodeType=null] - The node type.\n\t */\n\tconstructor( nodes = [], nodeType = null ) {\n\n\t\tsuper( nodeType );\n\n\t\t/**\n\t\t * An array of nodes that should be joined.\n\t\t *\n\t\t * @type {Array<Node>}\n\t\t */\n\t\tthis.nodes = nodes;\n\n\t}\n\n\t/**\n\t * This method is overwritten since the node type must be inferred from the\n\t * joined data length if not explicitly defined.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The node type.\n\t */\n\tgetNodeType( builder ) {\n\n\t\tif ( this.nodeType !== null ) {\n\n\t\t\treturn builder.getVectorType( this.nodeType );\n\n\t\t}\n\n\t\treturn builder.getTypeFromLength( this.nodes.reduce( ( count, cur ) => count + builder.getTypeLength( cur.getNodeType( builder ) ), 0 ) );\n\n\t}\n\n\tgenerate( builder, output ) {\n\n\t\tconst type = this.getNodeType( builder );\n\t\tconst maxLength = builder.getTypeLength( type );\n\n\t\tconst nodes = this.nodes;\n\n\t\tconst primitiveType = builder.getComponentType( type );\n\n\t\tconst snippetValues = [];\n\n\t\tlet length = 0;\n\n\t\tfor ( const input of nodes ) {\n\n\t\t\tif ( length >= maxLength ) {\n\n\t\t\t\terror( `TSL: Length of parameters exceeds maximum length of function '${ type }()' type.` );\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tlet inputType = input.getNodeType( builder );\n\t\t\tlet inputTypeLength = builder.getTypeLength( inputType );\n\t\t\tlet inputSnippet;\n\n\t\t\tif ( length + inputTypeLength > maxLength ) {\n\n\t\t\t\terror( `TSL: Length of '${ type }()' data exceeds maximum length of output type.` );\n\n\t\t\t\tinputTypeLength = maxLength - length;\n\t\t\t\tinputType = builder.getTypeFromLength( inputTypeLength );\n\n\t\t\t}\n\n\t\t\tlength += inputTypeLength;\n\t\t\tinputSnippet = input.build( builder, inputType );\n\n\t\t\tconst inputPrimitiveType = builder.getComponentType( inputType );\n\n\t\t\tif ( inputPrimitiveType !== primitiveType ) {\n\n\t\t\t\tconst targetType = builder.getTypeFromLength( inputTypeLength, primitiveType );\n\n\t\t\t\tinputSnippet = builder.format( inputSnippet, inputType, targetType );\n\n\t\t\t}\n\n\t\t\tsnippetValues.push( inputSnippet );\n\n\t\t}\n\n\t\tconst snippet = `${ builder.getType( type ) }( ${ snippetValues.join( ', ' ) } )`;\n\n\t\treturn builder.format( snippet, type, output );\n\n\t}\n\n}\n\nconst _stringVectorComponents = vectorComponents.join( '' );\n\n/**\n * This module is part of the TSL core and usually not used in app level code.\n * `SplitNode` represents a property access operation which means it is\n * used to implement any `.xyzw`, `.rgba` and `stpq` usage on node objects.\n * For example:\n * ```js\n * const redValue = color.r;\n * ```\n *\n * @augments Node\n */\nclass SplitNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'SplitNode';\n\n\t}\n\n\t/**\n\t * Constructs a new split node.\n\t *\n\t * @param {Node} node - The node that should be accessed.\n\t * @param {string} [components='x'] - The components that should be accessed.\n\t */\n\tconstructor( node, components = 'x' ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The node that should be accessed.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.node = node;\n\n\t\t/**\n\t\t * The components that should be accessed.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.components = components;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSplitNode = true;\n\n\t}\n\n\t/**\n\t * Returns the vector length which is computed based on the requested components.\n\t *\n\t * @return {number} The vector length.\n\t */\n\tgetVectorLength() {\n\n\t\tlet vectorLength = this.components.length;\n\n\t\tfor ( const c of this.components ) {\n\n\t\t\tvectorLength = Math.max( vectorComponents.indexOf( c ) + 1, vectorLength );\n\n\t\t}\n\n\t\treturn vectorLength;\n\n\t}\n\n\t/**\n\t * Returns the component type of the node's type.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The component type.\n\t */\n\tgetComponentType( builder ) {\n\n\t\treturn builder.getComponentType( this.node.getNodeType( builder ) );\n\n\t}\n\n\t/**\n\t * This method is overwritten since the node type is inferred from requested components.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The node type.\n\t */\n\tgetNodeType( builder ) {\n\n\t\treturn builder.getTypeFromLength( this.components.length, this.getComponentType( builder ) );\n\n\t}\n\n\t/**\n\t * Returns the scope of the node.\n\t *\n\t * @return {Node} The scope of the node.\n\t */\n\tgetScope() {\n\n\t\treturn this.node.getScope();\n\n\t}\n\n\tgenerate( builder, output ) {\n\n\t\tconst node = this.node;\n\t\tconst nodeTypeLength = builder.getTypeLength( node.getNodeType( builder ) );\n\n\t\tlet snippet = null;\n\n\t\tif ( nodeTypeLength > 1 ) {\n\n\t\t\tlet type = null;\n\n\t\t\tconst componentsLength = this.getVectorLength();\n\n\t\t\tif ( componentsLength >= nodeTypeLength ) {\n\n\t\t\t\t// needed expand the input node\n\n\t\t\t\ttype = builder.getTypeFromLength( this.getVectorLength(), this.getComponentType( builder ) );\n\n\t\t\t}\n\n\t\t\tconst nodeSnippet = node.build( builder, type );\n\n\t\t\tif ( this.components.length === nodeTypeLength && this.components === _stringVectorComponents.slice( 0, this.components.length ) ) {\n\n\t\t\t\t// unnecessary swizzle\n\n\t\t\t\tsnippet = builder.format( nodeSnippet, type, output );\n\n\t\t\t} else {\n\n\t\t\t\tsnippet = builder.format( `${nodeSnippet}.${this.components}`, this.getNodeType( builder ), output );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// ignore .components if .node returns float/integer\n\n\t\t\tsnippet = node.build( builder, output );\n\n\t\t}\n\n\t\treturn snippet;\n\n\t}\n\n\tserialize( data ) {\n\n\t\tsuper.serialize( data );\n\n\t\tdata.components = this.components;\n\n\t}\n\n\tdeserialize( data ) {\n\n\t\tsuper.deserialize( data );\n\n\t\tthis.components = data.components;\n\n\t}\n\n}\n\n/**\n * This module is part of the TSL core and usually not used in app level code.\n * `SetNode` represents a set operation which means it is used to implement any\n * `setXYZW()`, `setRGBA()` and `setSTPQ()` method invocations on node objects.\n * For example:\n * ```js\n * materialLine.colorNode = color( 0, 0, 0 ).setR( float( 1 ) );\n * ```\n *\n * @augments TempNode\n */\nclass SetNode extends TempNode {\n\n\tstatic get type() {\n\n\t\treturn 'SetNode';\n\n\t}\n\n\t/**\n\t * Constructs a new set node.\n\t *\n\t * @param {Node} sourceNode - The node that should be updated.\n\t * @param {string} components - The components that should be updated.\n\t * @param {Node} targetNode - The value node.\n\t */\n\tconstructor( sourceNode, components, targetNode ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The node that should be updated.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.sourceNode = sourceNode;\n\n\t\t/**\n\t\t * The components that should be updated.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.components = components;\n\n\t\t/**\n\t\t * The value node.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.targetNode = targetNode;\n\n\t}\n\n\t/**\n\t * This method is overwritten since the node type is inferred from {@link SetNode#sourceNode}.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The node type.\n\t */\n\tgetNodeType( builder ) {\n\n\t\treturn this.sourceNode.getNodeType( builder );\n\n\t}\n\n\tgenerate( builder ) {\n\n\t\tconst { sourceNode, components, targetNode } = this;\n\n\t\tconst sourceType = this.getNodeType( builder );\n\n\t\tconst componentType = builder.getComponentType( targetNode.getNodeType( builder ) );\n\t\tconst targetType = builder.getTypeFromLength( components.length, componentType );\n\n\t\tconst targetSnippet = targetNode.build( builder, targetType );\n\t\tconst sourceSnippet = sourceNode.build( builder, sourceType );\n\n\t\tconst length = builder.getTypeLength( sourceType );\n\t\tconst snippetValues = [];\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tconst component = vectorComponents[ i ];\n\n\t\t\tif ( component === components[ 0 ] ) {\n\n\t\t\t\tsnippetValues.push( targetSnippet );\n\n\t\t\t\ti += components.length - 1;\n\n\t\t\t} else {\n\n\t\t\t\tsnippetValues.push( sourceSnippet + '.' + component );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn `${ builder.getType( sourceType ) }( ${ snippetValues.join( ', ' ) } )`;\n\n\t}\n\n}\n\n/**\n * This module is part of the TSL core and usually not used in app level code.\n * It represents a flip operation during the shader generation process\n * meaning it flips normalized values with the following formula:\n * ```\n * x = 1 - x;\n * ```\n * `FlipNode` is internally used to implement any `flipXYZW()`, `flipRGBA()` and\n * `flipSTPQ()` method invocations on node objects. For example:\n * ```js\n * uvNode = uvNode.flipY();\n * ```\n *\n * @augments TempNode\n */\nclass FlipNode extends TempNode {\n\n\tstatic get type() {\n\n\t\treturn 'FlipNode';\n\n\t}\n\n\t/**\n\t * Constructs a new flip node.\n\t *\n\t * @param {Node} sourceNode - The node which component(s) should be flipped.\n\t * @param {string} components - The components that should be flipped e.g. `'x'` or `'xy'`.\n\t */\n\tconstructor( sourceNode, components ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The node which component(s) should be flipped.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.sourceNode = sourceNode;\n\n\t\t/**\n\t\t * The components that should be flipped e.g. `'x'` or `'xy'`.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.components = components;\n\n\t}\n\n\t/**\n\t * This method is overwritten since the node type is inferred from the source node.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The node type.\n\t */\n\tgetNodeType( builder ) {\n\n\t\treturn this.sourceNode.getNodeType( builder );\n\n\t}\n\n\tgenerate( builder ) {\n\n\t\tconst { components, sourceNode } = this;\n\n\t\tconst sourceType = this.getNodeType( builder );\n\t\tconst sourceSnippet = sourceNode.build( builder );\n\n\t\tconst sourceCache = builder.getVarFromNode( this );\n\t\tconst sourceProperty = builder.getPropertyName( sourceCache );\n\n\t\tbuilder.addLineFlowCode( sourceProperty + ' = ' + sourceSnippet, this );\n\n\t\tconst length = builder.getTypeLength( sourceType );\n\t\tconst snippetValues = [];\n\n\t\tlet componentIndex = 0;\n\n\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\tconst component = vectorComponents[ i ];\n\n\t\t\tif ( component === components[ componentIndex ] ) {\n\n\t\t\t\tsnippetValues.push( '1.0 - ' + ( sourceProperty + '.' + component ) );\n\n\t\t\t\tcomponentIndex ++;\n\n\t\t\t} else {\n\n\t\t\t\tsnippetValues.push( sourceProperty + '.' + component );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn `${ builder.getType( sourceType ) }( ${ snippetValues.join( ', ' ) } )`;\n\n\t}\n\n}\n\n/**\n * Base class for representing data input nodes.\n *\n * @augments Node\n */\nclass InputNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'InputNode';\n\n\t}\n\n\t/**\n\t * Constructs a new input node.\n\t *\n\t * @param {any} value - The value of this node. This can be any JS primitive, functions, array buffers or even three.js objects (vector, matrices, colors).\n\t * @param {?string} nodeType - The node type. If no explicit type is defined, the node tries to derive the type from its value.\n\t */\n\tconstructor( value, nodeType = null ) {\n\n\t\tsuper( nodeType );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isInputNode = true;\n\n\t\t/**\n\t\t * The value of this node. This can be any JS primitive, functions, array buffers or even three.js objects (vector, matrices, colors).\n\t\t *\n\t\t * @type {any}\n\t\t */\n\t\tthis.value = value;\n\n\t\t/**\n\t\t * The precision of the value in the shader.\n\t\t *\n\t\t * @type {?('low'|'medium'|'high')}\n\t\t * @default null\n\t\t */\n\t\tthis.precision = null;\n\n\t}\n\n\tgetNodeType( /*builder*/ ) {\n\n\t\tif ( this.nodeType === null ) {\n\n\t\t\treturn getValueType( this.value );\n\n\t\t}\n\n\t\treturn this.nodeType;\n\n\t}\n\n\t/**\n\t * Returns the input type of the node which is by default the node type. Derived modules\n\t * might overwrite this method and use a fixed type or compute one analytically.\n\t *\n\t * A typical example for different input and node types are textures. The input type of a\n\t * normal RGBA texture is `texture` whereas its node type is `vec4`.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The input type.\n\t */\n\tgetInputType( builder ) {\n\n\t\treturn this.getNodeType( builder );\n\n\t}\n\n\t/**\n\t * Sets the precision to the given value. The method can be\n\t * overwritten in derived classes if the final precision must be computed\n\t * analytically.\n\t *\n\t * @param {('low'|'medium'|'high')} precision - The precision of the input value in the shader.\n\t * @return {InputNode} A reference to this node.\n\t */\n\tsetPrecision( precision ) {\n\n\t\tthis.precision = precision;\n\n\t\treturn this;\n\n\t}\n\n\tserialize( data ) {\n\n\t\tsuper.serialize( data );\n\n\t\tdata.value = this.value;\n\n\t\tif ( this.value && this.value.toArray ) data.value = this.value.toArray();\n\n\t\tdata.valueType = getValueType( this.value );\n\t\tdata.nodeType = this.nodeType;\n\n\t\tif ( data.valueType === 'ArrayBuffer' ) data.value = arrayBufferToBase64( data.value );\n\n\t\tdata.precision = this.precision;\n\n\t}\n\n\tdeserialize( data ) {\n\n\t\tsuper.deserialize( data );\n\n\t\tthis.nodeType = data.nodeType;\n\t\tthis.value = Array.isArray( data.value ) ? getValueFromType( data.valueType, ...data.value ) : data.value;\n\n\t\tthis.precision = data.precision || null;\n\n\t\tif ( this.value && this.value.fromArray ) this.value = this.value.fromArray( data.value );\n\n\t}\n\n\tgenerate( /*builder, output*/ ) {\n\n\t\twarn( 'Abstract function.' );\n\n\t}\n\n}\n\nconst _regNum = /float|u?int/;\n\n/**\n * Class for representing a constant value in the shader.\n *\n * @augments InputNode\n */\nclass ConstNode extends InputNode {\n\n\tstatic get type() {\n\n\t\treturn 'ConstNode';\n\n\t}\n\n\t/**\n\t * Constructs a new input node.\n\t *\n\t * @param {any} value - The value of this node. Usually a JS primitive or three.js object (vector, matrix, color).\n\t * @param {?string} nodeType - The node type. If no explicit type is defined, the node tries to derive the type from its value.\n\t */\n\tconstructor( value, nodeType = null ) {\n\n\t\tsuper( value, nodeType );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isConstNode = true;\n\n\t}\n\n\t/**\n\t * Generates the shader string of the value with the current node builder.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The generated value as a shader string.\n\t */\n\tgenerateConst( builder ) {\n\n\t\treturn builder.generateConst( this.getNodeType( builder ), this.value );\n\n\t}\n\n\tgenerate( builder, output ) {\n\n\t\tconst type = this.getNodeType( builder );\n\n\t\tif ( _regNum.test( type ) && _regNum.test( output ) ) {\n\n\t\t\treturn builder.generateConst( output, this.value );\n\n\t\t}\n\n\t\treturn builder.format( this.generateConst( builder ), type, output );\n\n\t}\n\n}\n\n/**\n * Base class for representing member access on an object-like\n * node data structures.\n *\n * @augments Node\n */\nclass MemberNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'MemberNode';\n\n\t}\n\n\t/**\n\t * Constructs a member node.\n\t *\n\t * @param {Node} structNode - The struct node.\n\t * @param {string} property - The property name.\n\t */\n\tconstructor( structNode, property ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The struct node.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.structNode = structNode;\n\n\t\t/**\n\t\t * The property name.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.property = property;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMemberNode = true;\n\n\t}\n\n\thasMember( builder ) {\n\n\t\tif ( this.structNode.isMemberNode ) {\n\n\t\t\tif ( this.structNode.hasMember( builder ) === false ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this.structNode.getMemberType( builder, this.property ) !== 'void';\n\n\t}\n\n\tgetNodeType( builder ) {\n\n\t\tif ( this.hasMember( builder ) === false ) {\n\n\t\t\t// default type if member does not exist\n\n\t\t\treturn 'float';\n\n\t\t}\n\n\t\treturn this.structNode.getMemberType( builder, this.property );\n\n\t}\n\n\tgetMemberType( builder, name ) {\n\n\t\tif ( this.hasMember( builder ) === false ) {\n\n\t\t\t// default type if member does not exist\n\n\t\t\treturn 'float';\n\n\t\t}\n\n\t\tconst type = this.getNodeType( builder );\n\t\tconst struct = builder.getStructTypeNode( type );\n\n\t\treturn struct.getMemberType( builder, name );\n\n\t}\n\n\tgenerate( builder ) {\n\n\t\tif ( this.hasMember( builder ) === false ) {\n\n\t\t\twarn( `TSL: Member \"${ this.property }\" does not exist in struct.` );\n\n\t\t\tconst type = this.getNodeType( builder );\n\n\t\t\treturn builder.generateConst( type );\n\n\t\t}\n\n\t\tconst propertyName = this.structNode.build( builder );\n\n\t\treturn propertyName + '.' + this.property;\n\n\t}\n\n}\n\nlet currentStack = null;\n\nconst NodeElements = new Map();\n\n// Extend Node Class for TSL using prototype\n\nfunction addMethodChaining( name, nodeElement ) {\n\n\tif ( NodeElements.has( name ) ) {\n\n\t\twarn( `TSL: Redefinition of method chaining '${ name }'.` );\n\t\treturn;\n\n\t}\n\n\tif ( typeof nodeElement !== 'function' ) throw new Error( `THREE.TSL: Node element ${ name } is not a function` );\n\n\tNodeElements.set( name, nodeElement );\n\n\tif ( name !== 'assign' ) {\n\n\t\t// Changing Node prototype to add method chaining\n\n\t\tNode.prototype[ name ] = function ( ...params ) {\n\n\t\t\t//if ( name === 'toVarIntent' ) return this;\n\n\t\t\treturn this.isStackNode ? this.addToStack( nodeElement( ...params ) ) : nodeElement( this, ...params );\n\n\t\t};\n\n\t\t// Adding assign method chaining\n\n\t\tNode.prototype[ name + 'Assign' ] = function ( ...params ) {\n\n\t\t\treturn this.isStackNode ? this.assign( params[ 0 ], nodeElement( ...params ) ) : this.assign( nodeElement( this, ...params ) );\n\n\t\t};\n\n\t}\n\n}\n\nconst parseSwizzle = ( props ) => props.replace( /r|s/g, 'x' ).replace( /g|t/g, 'y' ).replace( /b|p/g, 'z' ).replace( /a|q/g, 'w' );\nconst parseSwizzleAndSort = ( props ) => parseSwizzle( props ).split( '' ).sort().join( '' );\n\nNode.prototype.assign = function ( ...params ) {\n\n\tif ( this.isStackNode !== true ) {\n\n\t\tif ( currentStack !== null ) {\n\n\t\t\tcurrentStack.assign( this, ...params );\n\n\t\t} else {\n\n\t\t\terror( 'TSL: No stack defined for assign operation. Make sure the assign is inside a Fn().' );\n\n\t\t}\n\n\t\treturn this;\n\n\t} else {\n\n\t\tconst nodeElement = NodeElements.get( 'assign' );\n\n\t\treturn this.addToStack( nodeElement( ...params ) );\n\n\t}\n\n};\n\nNode.prototype.toVarIntent = function () {\n\n\treturn this;\n\n};\n\nNode.prototype.get = function ( value ) {\n\n\treturn new MemberNode( this, value );\n\n};\n\n// Cache prototype for TSL\n\nconst proto = {};\n\n// Set swizzle properties for xyzw, rgba, and stpq.\n\nfunction setProtoSwizzle( property, altA, altB ) {\n\n\t// swizzle properties\n\n\tproto[ property ] = proto[ altA ] = proto[ altB ] = {\n\n\t\tget() {\n\n\t\t\tthis._cache = this._cache || {};\n\n\t\t\t//\n\n\t\t\tlet split = this._cache[ property ];\n\n\t\t\tif ( split === undefined ) {\n\n\t\t\t\tsplit = new SplitNode( this, property );\n\n\t\t\t\tthis._cache[ property ] = split;\n\n\t\t\t}\n\n\t\t\treturn split;\n\n\t\t},\n\n\t\tset( value ) {\n\n\t\t\tthis[ property ].assign( nodeObject( value ) );\n\n\t\t}\n\n\t};\n\n\t// set properties ( swizzle ) and sort to xyzw sequence\n\n\tconst propUpper = property.toUpperCase();\n\tconst altAUpper = altA.toUpperCase();\n\tconst altBUpper = altB.toUpperCase();\n\n\t// Set methods for swizzle properties\n\n\tNode.prototype[ 'set' + propUpper ] = Node.prototype[ 'set' + altAUpper ] = Node.prototype[ 'set' + altBUpper ] = function ( value ) {\n\n\t\tconst swizzle = parseSwizzleAndSort( property );\n\n\t\treturn new SetNode( this, swizzle, nodeObject( value ) );\n\n\t};\n\n\t// Set methods for flip properties\n\n\tNode.prototype[ 'flip' + propUpper ] = Node.prototype[ 'flip' + altAUpper ] = Node.prototype[ 'flip' + altBUpper ] = function () {\n\n\t\tconst swizzle = parseSwizzleAndSort( property );\n\n\t\treturn new FlipNode( this, swizzle );\n\n\t};\n\n}\n\nconst swizzleA = [ 'x', 'y', 'z', 'w' ];\nconst swizzleB = [ 'r', 'g', 'b', 'a' ];\nconst swizzleC = [ 's', 't', 'p', 'q' ];\n\nfor ( let a = 0; a < 4; a ++ ) {\n\n\tlet prop = swizzleA[ a ];\n\tlet altA = swizzleB[ a ];\n\tlet altB = swizzleC[ a ];\n\n\tsetProtoSwizzle( prop, altA, altB );\n\n\tfor ( let b = 0; b < 4; b ++ ) {\n\n\t\tprop = swizzleA[ a ] + swizzleA[ b ];\n\t\taltA = swizzleB[ a ] + swizzleB[ b ];\n\t\taltB = swizzleC[ a ] + swizzleC[ b ];\n\n\t\tsetProtoSwizzle( prop, altA, altB );\n\n\t\tfor ( let c = 0; c < 4; c ++ ) {\n\n\t\t\tprop = swizzleA[ a ] + swizzleA[ b ] + swizzleA[ c ];\n\t\t\taltA = swizzleB[ a ] + swizzleB[ b ] + swizzleB[ c ];\n\t\t\taltB = swizzleC[ a ] + swizzleC[ b ] + swizzleC[ c ];\n\n\t\t\tsetProtoSwizzle( prop, altA, altB );\n\n\t\t\tfor ( let d = 0; d < 4; d ++ ) {\n\n\t\t\t\tprop = swizzleA[ a ] + swizzleA[ b ] + swizzleA[ c ] + swizzleA[ d ];\n\t\t\t\taltA = swizzleB[ a ] + swizzleB[ b ] + swizzleB[ c ] + swizzleB[ d ];\n\t\t\t\taltB = swizzleC[ a ] + swizzleC[ b ] + swizzleC[ c ] + swizzleC[ d ];\n\n\t\t\t\tsetProtoSwizzle( prop, altA, altB );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\n// Set/get static properties for array elements (0-31).\n\nfor ( let i = 0; i < 32; i ++ ) {\n\n\tproto[ i ] = {\n\n\t\tget() {\n\n\t\t\tthis._cache = this._cache || {};\n\n\t\t\t//\n\n\t\t\tlet element = this._cache[ i ];\n\n\t\t\tif ( element === undefined ) {\n\n\t\t\t\telement = new ArrayElementNode( this, new ConstNode( i, 'uint' ) );\n\n\t\t\t\tthis._cache[ i ] = element;\n\n\t\t\t}\n\n\t\t\treturn element;\n\n\t\t},\n\n\t\tset( value ) {\n\n\t\t\tthis[ i ].assign( nodeObject( value ) );\n\n\t\t}\n\n\t};\n\n}\n\n/*\n// Set properties for width, height, and depth.\n\nfunction setProtoProperty( property, target ) {\n\n\tproto[ property ] = {\n\n\t\tget() {\n\n\t\t\tthis._cache = this._cache || {};\n\n\t\t\t//\n\n\t\t\tlet split = this._cache[ target ];\n\n\t\t\tif ( split === undefined ) {\n\n\t\t\t\tsplit = new SplitNode( this, target );\n\n\t\t\t\tthis._cache[ target ] = split;\n\n\t\t\t}\n\n\t\t\treturn split;\n\n\t\t},\n\n\t\tset( value ) {\n\n\t\t\tthis[ target ].assign( nodeObject( value ) );\n\n\t\t}\n\n\t};\n\n}\n\nsetProtoProperty( 'width', 'x' );\nsetProtoProperty( 'height', 'y' );\nsetProtoProperty( 'depth', 'z' );\n*/\n\nObject.defineProperties( Node.prototype, proto );\n\n// --- FINISH ---\n\nconst nodeBuilderFunctionsCacheMap = new WeakMap();\n\nconst ShaderNodeObject = function ( obj, altType = null ) {\n\n\tconst type = getValueType( obj );\n\n\tif ( type === 'node' ) {\n\n\t\treturn obj;\n\n\t} else if ( ( altType === null && ( type === 'float' || type === 'boolean' ) ) || ( type && type !== 'shader' && type !== 'string' ) ) {\n\n\t\treturn nodeObject( getConstNode( obj, altType ) );\n\n\t} else if ( type === 'shader' ) {\n\n\t\treturn obj.isFn ? obj : Fn( obj );\n\n\t}\n\n\treturn obj;\n\n};\n\nconst ShaderNodeObjects = function ( objects, altType = null ) {\n\n\tfor ( const name in objects ) {\n\n\t\tobjects[ name ] = nodeObject( objects[ name ], altType );\n\n\t}\n\n\treturn objects;\n\n};\n\nconst ShaderNodeArray = function ( array, altType = null ) {\n\n\tconst len = array.length;\n\n\tfor ( let i = 0; i < len; i ++ ) {\n\n\t\tarray[ i ] = nodeObject( array[ i ], altType );\n\n\t}\n\n\treturn array;\n\n};\n\nconst ShaderNodeProxy = function ( NodeClass, scope = null, factor = null, settings = null ) {\n\n\tfunction assignNode( node ) {\n\n\t\tif ( settings !== null ) {\n\n\t\t\tnode = nodeObject( Object.assign( node, settings ) );\n\n\t\t\tif ( settings.intent === true ) {\n\n\t\t\t\tnode = node.toVarIntent();\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tnode = nodeObject( node );\n\n\t\t}\n\n\t\treturn node;\n\n\n\t}\n\n\tlet fn, name = scope, minParams, maxParams;\n\n\tfunction verifyParamsLimit( params ) {\n\n\t\tlet tslName;\n\n\t\tif ( name ) tslName = /[a-z]/i.test( name ) ? name + '()' : name;\n\t\telse tslName = NodeClass.type;\n\n\t\tif ( minParams !== undefined && params.length < minParams ) {\n\n\t\t\terror( `TSL: \"${ tslName }\" parameter length is less than minimum required.` );\n\n\t\t\treturn params.concat( new Array( minParams - params.length ).fill( 0 ) );\n\n\t\t} else if ( maxParams !== undefined && params.length > maxParams ) {\n\n\t\t\terror( `TSL: \"${ tslName }\" parameter length exceeds limit.` );\n\n\t\t\treturn params.slice( 0, maxParams );\n\n\t\t}\n\n\t\treturn params;\n\n\t}\n\n\tif ( scope === null ) {\n\n\t\tfn = ( ...params ) => {\n\n\t\t\treturn assignNode( new NodeClass( ...nodeArray( verifyParamsLimit( params ) ) ) );\n\n\t\t};\n\n\t} else if ( factor !== null ) {\n\n\t\tfactor = nodeObject( factor );\n\n\t\tfn = ( ...params ) => {\n\n\t\t\treturn assignNode( new NodeClass( scope, ...nodeArray( verifyParamsLimit( params ) ), factor ) );\n\n\t\t};\n\n\t} else {\n\n\t\tfn = ( ...params ) => {\n\n\t\t\treturn assignNode( new NodeClass( scope, ...nodeArray( verifyParamsLimit( params ) ) ) );\n\n\t\t};\n\n\t}\n\n\tfn.setParameterLength = ( ...params ) => {\n\n\t\tif ( params.length === 1 ) minParams = maxParams = params[ 0 ];\n\t\telse if ( params.length === 2 ) [ minParams, maxParams ] = params;\n\n\t\treturn fn;\n\n\t};\n\n\tfn.setName = ( value ) => {\n\n\t\tname = value;\n\n\t\treturn fn;\n\n\t};\n\n\treturn fn;\n\n};\n\nconst ShaderNodeImmutable = function ( NodeClass, ...params ) {\n\n\treturn new NodeClass( ...nodeArray( params ) );\n\n};\n\nclass ShaderCallNodeInternal extends Node {\n\n\tconstructor( shaderNode, rawInputs ) {\n\n\t\tsuper();\n\n\t\tthis.shaderNode = shaderNode;\n\t\tthis.rawInputs = rawInputs;\n\n\t\tthis.isShaderCallNodeInternal = true;\n\n\t}\n\n\tgetNodeType( builder ) {\n\n\t\treturn this.shaderNode.nodeType || this.getOutputNode( builder ).getNodeType( builder );\n\n\t}\n\n\tgetElementType( builder ) {\n\n\t\treturn this.getOutputNode( builder ).getElementType( builder );\n\n\t}\n\n\tgetMemberType( builder, name ) {\n\n\t\treturn this.getOutputNode( builder ).getMemberType( builder, name );\n\n\t}\n\n\tcall( builder ) {\n\n\t\tconst { shaderNode, rawInputs } = this;\n\n\t\tconst properties = builder.getNodeProperties( shaderNode );\n\n\t\tconst subBuild = builder.getClosestSubBuild( shaderNode.subBuilds ) || '';\n\t\tconst subBuildProperty = subBuild || 'default';\n\n\t\tif ( properties[ subBuildProperty ] ) {\n\n\t\t\treturn properties[ subBuildProperty ];\n\n\t\t}\n\n\t\t//\n\n\t\tconst previousSubBuildFn = builder.subBuildFn;\n\t\tconst previousFnCall = builder.fnCall;\n\n\t\tbuilder.subBuildFn = subBuild;\n\t\tbuilder.fnCall = this;\n\n\t\tlet result = null;\n\n\t\tif ( shaderNode.layout ) {\n\n\t\t\tlet functionNodesCacheMap = nodeBuilderFunctionsCacheMap.get( builder.constructor );\n\n\t\t\tif ( functionNodesCacheMap === undefined ) {\n\n\t\t\t\tfunctionNodesCacheMap = new WeakMap();\n\n\t\t\t\tnodeBuilderFunctionsCacheMap.set( builder.constructor, functionNodesCacheMap );\n\n\t\t\t}\n\n\t\t\tlet functionNode = functionNodesCacheMap.get( shaderNode );\n\n\t\t\tif ( functionNode === undefined ) {\n\n\t\t\t\tfunctionNode = nodeObject( builder.buildFunctionNode( shaderNode ) );\n\n\t\t\t\tfunctionNodesCacheMap.set( shaderNode, functionNode );\n\n\t\t\t}\n\n\t\t\tbuilder.addInclude( functionNode );\n\n\t\t\t//\n\n\t\t\tconst inputs = rawInputs ? getLayoutParameters( rawInputs ) : null;\n\n\t\t\tresult = nodeObject( functionNode.call( inputs ) );\n\n\t\t} else {\n\n\t\t\tconst secureNodeBuilder = new Proxy( builder, {\n\n\t\t\t\tget: ( target, property, receiver ) => {\n\n\t\t\t\t\tlet value;\n\n\t\t\t\t\tif ( Symbol.iterator === property ) {\n\n\t\t\t\t\t\tvalue = function* () {\n\n\t\t\t\t\t\t\tyield undefined;\n\n\t\t\t\t\t\t};\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tvalue = Reflect.get( target, property, receiver );\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn value;\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t\t//\n\n\t\t\tconst inputs = rawInputs ? getProxyParameters( rawInputs ) : null;\n\n\t\t\tconst hasParameters = Array.isArray( rawInputs ) ? rawInputs.length > 0 : rawInputs !== null;\n\n\t\t\tconst jsFunc = shaderNode.jsFunc;\n\t\t\tconst outputNode = hasParameters || jsFunc.length > 1 ? jsFunc( inputs, secureNodeBuilder ) : jsFunc( secureNodeBuilder );\n\n\t\t\tresult = nodeObject( outputNode );\n\n\t\t}\n\n\t\tbuilder.subBuildFn = previousSubBuildFn;\n\t\tbuilder.fnCall = previousFnCall;\n\n\t\tif ( shaderNode.once ) {\n\n\t\t\tproperties[ subBuildProperty ] = result;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tsetupOutput( builder ) {\n\n\t\tbuilder.addStack();\n\n\t\tbuilder.stack.outputNode = this.call( builder );\n\n\t\treturn builder.removeStack();\n\n\t}\n\n\tgetOutputNode( builder ) {\n\n\t\tconst properties = builder.getNodeProperties( this );\n\t\tconst subBuildOutput = builder.getSubBuildOutput( this );\n\n\t\tproperties[ subBuildOutput ] = properties[ subBuildOutput ] || this.setupOutput( builder );\n\t\tproperties[ subBuildOutput ].subBuild = builder.getClosestSubBuild( this );\n\n\t\treturn properties[ subBuildOutput ];\n\n\t}\n\n\tbuild( builder, output = null ) {\n\n\t\tlet result = null;\n\n\t\tconst buildStage = builder.getBuildStage();\n\t\tconst properties = builder.getNodeProperties( this );\n\n\t\tconst subBuildOutput = builder.getSubBuildOutput( this );\n\t\tconst outputNode = this.getOutputNode( builder );\n\n\t\tconst previousFnCall = builder.fnCall;\n\n\t\tbuilder.fnCall = this;\n\n\t\tif ( buildStage === 'setup' ) {\n\n\t\t\tconst subBuildInitialized = builder.getSubBuildProperty( 'initialized', this );\n\n\t\t\tif ( properties[ subBuildInitialized ] !== true ) {\n\n\t\t\t\tproperties[ subBuildInitialized ] = true;\n\n\t\t\t\tproperties[ subBuildOutput ] = this.getOutputNode( builder );\n\t\t\t\tproperties[ subBuildOutput ].build( builder );\n\n\t\t\t\t// If the shaderNode has subBuilds, add them to the chaining nodes\n\t\t\t\t// so they can be built later in the build process.\n\n\t\t\t\tif ( this.shaderNode.subBuilds ) {\n\n\t\t\t\t\tfor ( const node of builder.chaining ) {\n\n\t\t\t\t\t\tconst nodeData = builder.getDataFromNode( node, 'any' );\n\t\t\t\t\t\tnodeData.subBuilds = nodeData.subBuilds || new Set();\n\n\t\t\t\t\t\tfor ( const subBuild of this.shaderNode.subBuilds ) {\n\n\t\t\t\t\t\t\tnodeData.subBuilds.add( subBuild );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t//builder.getDataFromNode( node ).subBuilds = nodeData.subBuilds;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tresult = properties[ subBuildOutput ];\n\n\t\t} else if ( buildStage === 'analyze' ) {\n\n\t\t\toutputNode.build( builder, output );\n\n\t\t} else if ( buildStage === 'generate' ) {\n\n\t\t\tresult = outputNode.build( builder, output ) || '';\n\n\t\t}\n\n\t\tbuilder.fnCall = previousFnCall;\n\n\t\treturn result;\n\n\t}\n\n}\n\nfunction getLayoutParameters( params ) {\n\n\tlet output;\n\n\tnodeObjects( params );\n\n\tconst isArrayAsParameter = params[ 0 ] && ( params[ 0 ].isNode || Object.getPrototypeOf( params[ 0 ] ) !== Object.prototype );\n\n\tif ( isArrayAsParameter ) {\n\n\t\toutput = [ ...params ];\n\n\t} else {\n\n\t\toutput = params[ 0 ];\n\n\t}\n\n\treturn output;\n\n}\n\nfunction getProxyParameters( params ) {\n\n\tlet index = 0;\n\n\tnodeObjects( params );\n\n\treturn new Proxy( params, {\n\n\t\tget: ( target, property, receiver ) => {\n\n\t\t\tlet value;\n\n\t\t\tif ( property === 'length' ) {\n\n\t\t\t\tvalue = params.length;\n\n\t\t\t\treturn value;\n\n\t\t\t}\n\n\t\t\tif ( Symbol.iterator === property ) {\n\n\t\t\t\tvalue = function* () {\n\n\t\t\t\t\tfor ( const inputNode of params ) {\n\n\t\t\t\t\t\tyield nodeObject( inputNode );\n\n\t\t\t\t\t}\n\n\t\t\t\t};\n\n\t\t\t} else {\n\n\t\t\t\tif ( params.length > 0 ) {\n\n\t\t\t\t\tif ( Object.getPrototypeOf( params[ 0 ] ) === Object.prototype ) {\n\n\t\t\t\t\t\tconst objectTarget = params[ 0 ];\n\n\t\t\t\t\t\tif ( objectTarget[ property ] === undefined ) {\n\n\t\t\t\t\t\t\tvalue = objectTarget[ index ++ ];\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvalue = Reflect.get( objectTarget, property, receiver );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( params[ 0 ] instanceof Node ) {\n\n\t\t\t\t\t\tif ( params[ property ] === undefined ) {\n\n\t\t\t\t\t\t\tvalue = params[ index ++ ];\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tvalue = Reflect.get( params, property, receiver );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvalue = Reflect.get( target, property, receiver );\n\n\t\t\t\t}\n\n\t\t\t\tvalue = nodeObject( value );\n\n\t\t\t}\n\n\t\t\treturn value;\n\n\t\t}\n\n\t} );\n\n}\n\nclass ShaderNodeInternal extends Node {\n\n\tconstructor( jsFunc, nodeType ) {\n\n\t\tsuper( nodeType );\n\n\t\tthis.jsFunc = jsFunc;\n\t\tthis.layout = null;\n\n\t\tthis.global = true;\n\n\t\tthis.once = false;\n\n\t}\n\n\tsetLayout( layout ) {\n\n\t\tthis.layout = layout;\n\n\t\treturn this;\n\n\t}\n\n\tgetLayout() {\n\n\t\treturn this.layout;\n\n\t}\n\n\tcall( rawInputs = null ) {\n\n\t\treturn new ShaderCallNodeInternal( this, rawInputs );\n\n\t}\n\n\tsetup() {\n\n\t\treturn this.call();\n\n\t}\n\n}\n\nconst bools = [ false, true ];\nconst uints = [ 0, 1, 2, 3 ];\nconst ints = [ -1, -2 ];\nconst floats = [ 0.5, 1.5, 1 / 3, 1e-6, 1e6, Math.PI, Math.PI * 2, 1 / Math.PI, 2 / Math.PI, 1 / ( Math.PI * 2 ), Math.PI / 2 ];\n\nconst boolsCacheMap = new Map();\nfor ( const bool of bools ) boolsCacheMap.set( bool, new ConstNode( bool ) );\n\nconst uintsCacheMap = new Map();\nfor ( const uint of uints ) uintsCacheMap.set( uint, new ConstNode( uint, 'uint' ) );\n\nconst intsCacheMap = new Map( [ ...uintsCacheMap ].map( el => new ConstNode( el.value, 'int' ) ) );\nfor ( const int of ints ) intsCacheMap.set( int, new ConstNode( int, 'int' ) );\n\nconst floatsCacheMap = new Map( [ ...intsCacheMap ].map( el => new ConstNode( el.value ) ) );\nfor ( const float of floats ) floatsCacheMap.set( float, new ConstNode( float ) );\nfor ( const float of floats ) floatsCacheMap.set( - float, new ConstNode( - float ) );\n\nconst cacheMaps = { bool: boolsCacheMap, uint: uintsCacheMap, ints: intsCacheMap, float: floatsCacheMap };\n\nconst constNodesCacheMap = new Map( [ ...boolsCacheMap, ...floatsCacheMap ] );\n\nconst getConstNode = ( value, type ) => {\n\n\tif ( constNodesCacheMap.has( value ) ) {\n\n\t\treturn constNodesCacheMap.get( value );\n\n\t} else if ( value.isNode === true ) {\n\n\t\treturn value;\n\n\t} else {\n\n\t\treturn new ConstNode( value, type );\n\n\t}\n\n};\n\nconst ConvertType = function ( type, cacheMap = null ) {\n\n\treturn ( ...params ) => {\n\n\t\tfor ( const param of params ) {\n\n\t\t\tif ( param === undefined ) {\n\n\t\t\t\terror( `TSL: Invalid parameter for the type \"${ type }\".` );\n\n\t\t\t\treturn new ConstNode( 0, type );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( params.length === 0 || ( ! [ 'bool', 'float', 'int', 'uint' ].includes( type ) && params.every( param => {\n\n\t\t\tconst paramType = typeof param;\n\n\t\t\treturn paramType !== 'object' && paramType !== 'function';\n\n\t\t} ) ) ) {\n\n\t\t\tparams = [ getValueFromType( type, ...params ) ];\n\n\t\t}\n\n\t\tif ( params.length === 1 && cacheMap !== null && cacheMap.has( params[ 0 ] ) ) {\n\n\t\t\treturn nodeObjectIntent( cacheMap.get( params[ 0 ] ) );\n\n\t\t}\n\n\t\tif ( params.length === 1 ) {\n\n\t\t\tconst node = getConstNode( params[ 0 ], type );\n\t\t\tif ( node.nodeType === type ) return nodeObjectIntent( node );\n\t\t\treturn nodeObjectIntent( new ConvertNode( node, type ) );\n\n\t\t}\n\n\t\tconst nodes = params.map( param => getConstNode( param ) );\n\t\treturn nodeObjectIntent( new JoinNode( nodes, type ) );\n\n\t};\n\n};\n\n// exports\n\nconst defined = ( v ) => typeof v === 'object' && v !== null ? v.value : v; // TODO: remove boolean conversion and defined function\n\n// utils\n\nconst getConstNodeType = ( value ) => ( value !== undefined && value !== null ) ? ( value.nodeType || value.convertTo || ( typeof value === 'string' ? value : null ) ) : null;\n\n// shader node base\n\nfunction ShaderNode( jsFunc, nodeType ) {\n\n\treturn new ShaderNodeInternal( jsFunc, nodeType );\n\n}\n\nconst nodeObject = ( val, altType = null ) => /* new */ ShaderNodeObject( val, altType );\nconst nodeObjectIntent = ( val, altType = null ) => /* new */ nodeObject( val, altType ).toVarIntent();\nconst nodeObjects = ( val, altType = null ) => new ShaderNodeObjects( val, altType );\nconst nodeArray = ( val, altType = null ) => new ShaderNodeArray( val, altType );\nconst nodeProxy = ( NodeClass, scope = null, factor = null, settings = null ) => new ShaderNodeProxy( NodeClass, scope, factor, settings );\nconst nodeImmutable = ( NodeClass, ...params ) => new ShaderNodeImmutable( NodeClass, ...params );\nconst nodeProxyIntent = ( NodeClass, scope = null, factor = null, settings = {} ) => new ShaderNodeProxy( NodeClass, scope, factor, { ...settings, intent: true } );\n\nlet fnId = 0;\n\nclass FnNode extends Node {\n\n\tconstructor( jsFunc, layout = null ) {\n\n\t\tsuper();\n\n\t\tlet nodeType = null;\n\n\t\tif ( layout !== null ) {\n\n\t\t\tif ( typeof layout === 'object' ) {\n\n\t\t\t\tnodeType = layout.return;\n\n\t\t\t} else {\n\n\t\t\t\tif ( typeof layout === 'string' ) {\n\n\t\t\t\t\tnodeType = layout;\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( 'TSL: Invalid layout type.' );\n\n\t\t\t\t}\n\n\t\t\t\tlayout = null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.shaderNode = new ShaderNode( jsFunc, nodeType );\n\n\t\tif ( layout !== null ) {\n\n\t\t\tthis.setLayout( layout );\n\n\t\t}\n\n\t\tthis.isFn = true;\n\n\t}\n\n\tsetLayout( layout ) {\n\n\t\tconst nodeType = this.shaderNode.nodeType;\n\n\t\tif ( typeof layout.inputs !== 'object' ) {\n\n\t\t\tconst fullLayout = {\n\t\t\t\tname: 'fn' + fnId ++,\n\t\t\t\ttype: nodeType,\n\t\t\t\tinputs: []\n\t\t\t};\n\n\t\t\tfor ( const name in layout ) {\n\n\t\t\t\tif ( name === 'return' ) continue;\n\n\t\t\t\tfullLayout.inputs.push( {\n\t\t\t\t\tname: name,\n\t\t\t\t\ttype: layout[ name ]\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tlayout = fullLayout;\n\n\t\t}\n\n\t\tthis.shaderNode.setLayout( layout );\n\n\t\treturn this;\n\n\t}\n\n\tgetNodeType( builder ) {\n\n\t\treturn this.shaderNode.getNodeType( builder ) || 'float';\n\n\t}\n\n\tcall( ...params ) {\n\n\t\tconst fnCall = this.shaderNode.call( params );\n\n\t\tif ( this.shaderNode.nodeType === 'void' ) fnCall.toStack();\n\n\t\treturn fnCall.toVarIntent();\n\n\t}\n\n\tonce( subBuilds = null ) {\n\n\t\tthis.shaderNode.once = true;\n\t\tthis.shaderNode.subBuilds = subBuilds;\n\n\t\treturn this;\n\n\t}\n\n\tgenerate( builder ) {\n\n\t\tconst type = this.getNodeType( builder );\n\n\t\terror( 'TSL: \"Fn()\" was declared but not invoked. Try calling it like \"Fn()( ...params )\".' );\n\n\t\treturn builder.generateConst( type );\n\n\t}\n\n}\n\nfunction Fn( jsFunc, layout = null ) {\n\n\tconst instance = new FnNode( jsFunc, layout );\n\n\treturn new Proxy( () => {}, {\n\n\t\tapply( target, thisArg, params ) {\n\n\t\t\treturn instance.call( ...params );\n\n\t\t},\n\n\t\tget( target, prop, receiver ) {\n\n\t\t\treturn Reflect.get( instance, prop, receiver );\n\n\t\t},\n\n\t\tset( target, prop, value, receiver ) {\n\n\t\t\treturn Reflect.set( instance, prop, value, receiver );\n\n\t\t}\n\n\t} );\n\n}\n\n//\n\nconst setCurrentStack = ( stack ) => {\n\n\tcurrentStack = stack;\n\n};\n\nconst getCurrentStack = () => currentStack;\n\n/**\n * Represent a conditional node using if/else statements.\n *\n * ```js\n * If( condition, function )\n * \t.ElseIf( condition, function )\n * \t.Else( function )\n * ```\n * @tsl\n * @function\n * @param {...any} params - The parameters for the conditional node.\n * @returns {StackNode} The conditional node.\n */\nconst If = ( ...params ) => currentStack.If( ...params );\n\n/**\n * Represent a conditional node using switch/case statements.\n *\n * ```js\n * Switch( value )\n * \t.Case( 1, function )\n * \t.Case( 2, 3, 4, function )\n * \t.Default( function )\n * ```\n * @tsl\n * @function\n * @param {...any} params - The parameters for the conditional node.\n * @returns {StackNode} The conditional node.\n */\nconst Switch = ( ...params ) => currentStack.Switch( ...params );\n\n/**\n * Add the given node to the current stack.\n *\n * @param {Node} node - The node to add.\n * @returns {Node} The node that was added to the stack.\n */\nfunction Stack( node ) {\n\n\tif ( currentStack ) currentStack.addToStack( node );\n\n\treturn node;\n\n}\n\naddMethodChaining( 'toStack', Stack );\n\n// types\n\nconst color = new ConvertType( 'color' );\n\nconst float = new ConvertType( 'float', cacheMaps.float );\nconst int = new ConvertType( 'int', cacheMaps.ints );\nconst uint = new ConvertType( 'uint', cacheMaps.uint );\nconst bool = new ConvertType( 'bool', cacheMaps.bool );\n\nconst vec2 = new ConvertType( 'vec2' );\nconst ivec2 = new ConvertType( 'ivec2' );\nconst uvec2 = new ConvertType( 'uvec2' );\nconst bvec2 = new ConvertType( 'bvec2' );\n\nconst vec3 = new ConvertType( 'vec3' );\nconst ivec3 = new ConvertType( 'ivec3' );\nconst uvec3 = new ConvertType( 'uvec3' );\nconst bvec3 = new ConvertType( 'bvec3' );\n\nconst vec4 = new ConvertType( 'vec4' );\nconst ivec4 = new ConvertType( 'ivec4' );\nconst uvec4 = new ConvertType( 'uvec4' );\nconst bvec4 = new ConvertType( 'bvec4' );\n\nconst mat2 = new ConvertType( 'mat2' );\nconst mat3 = new ConvertType( 'mat3' );\nconst mat4 = new ConvertType( 'mat4' );\n\nconst string = ( value = '' ) => new ConstNode( value, 'string' );\nconst arrayBuffer = ( value ) => new ConstNode( value, 'ArrayBuffer' );\n\naddMethodChaining( 'toColor', color );\naddMethodChaining( 'toFloat', float );\naddMethodChaining( 'toInt', int );\naddMethodChaining( 'toUint', uint );\naddMethodChaining( 'toBool', bool );\naddMethodChaining( 'toVec2', vec2 );\naddMethodChaining( 'toIVec2', ivec2 );\naddMethodChaining( 'toUVec2', uvec2 );\naddMethodChaining( 'toBVec2', bvec2 );\naddMethodChaining( 'toVec3', vec3 );\naddMethodChaining( 'toIVec3', ivec3 );\naddMethodChaining( 'toUVec3', uvec3 );\naddMethodChaining( 'toBVec3', bvec3 );\naddMethodChaining( 'toVec4', vec4 );\naddMethodChaining( 'toIVec4', ivec4 );\naddMethodChaining( 'toUVec4', uvec4 );\naddMethodChaining( 'toBVec4', bvec4 );\naddMethodChaining( 'toMat2', mat2 );\naddMethodChaining( 'toMat3', mat3 );\naddMethodChaining( 'toMat4', mat4 );\n\n// basic nodes\n\nconst element = /*@__PURE__*/ nodeProxy( ArrayElementNode ).setParameterLength( 2 );\nconst convert = ( node, types ) => nodeObject( new ConvertNode( nodeObject( node ), types ) );\nconst split = ( node, channels ) => nodeObject( new SplitNode( nodeObject( node ), channels ) );\n\naddMethodChaining( 'element', element );\naddMethodChaining( 'convert', convert );\n\n// deprecated\n\n/**\n * @tsl\n * @function\n * @deprecated since r176. Use {@link Stack} instead.\n *\n * @param {Node} node - The node to add.\n * @returns {Function}\n */\nconst append = ( node ) => { // @deprecated, r176\n\n\twarn( 'TSL: append() has been renamed to Stack().' );\n\treturn Stack( node );\n\n};\n\naddMethodChaining( 'append', ( node ) => { // @deprecated, r176\n\n\twarn( 'TSL: .append() has been renamed to .toStack().' );\n\treturn Stack( node );\n\n} );\n\n/**\n * This class represents a shader property. It can be used\n * to explicitly define a property and assign a value to it.\n *\n * ```js\n * const threshold = property( 'float', 'threshold' ).assign( THRESHOLD );\n *```\n * `PropertyNode` is used by the engine to predefined common material properties\n * for TSL code.\n *\n * @augments Node\n */\nclass PropertyNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'PropertyNode';\n\n\t}\n\n\t/**\n\t * Constructs a new property node.\n\t *\n\t * @param {string} nodeType - The type of the node.\n\t * @param {?string} [name=null] - The name of the property in the shader.\n\t * @param {boolean} [varying=false] - Whether this property is a varying or not.\n\t */\n\tconstructor( nodeType, name = null, varying = false ) {\n\n\t\tsuper( nodeType );\n\n\t\t/**\n\t\t * The name of the property in the shader. If no name is defined,\n\t\t * the node system auto-generates one.\n\t\t *\n\t\t * @type {?string}\n\t\t * @default null\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * Whether this property is a varying or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.varying = varying;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPropertyNode = true;\n\n\t\t/**\n\t\t * This flag is used for global cache.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.global = true;\n\n\t}\n\n\tcustomCacheKey() {\n\n\t\treturn hashString( this.type + ':' + ( this.name || '' ) + ':' + ( this.varying ? '1' : '0' ) );\n\n\t}\n\n\tgetHash( builder ) {\n\n\t\treturn this.name || super.getHash( builder );\n\n\t}\n\n\tgenerate( builder ) {\n\n\t\tlet nodeVar;\n\n\t\tif ( this.varying === true ) {\n\n\t\t\tnodeVar = builder.getVaryingFromNode( this, this.name );\n\t\t\tnodeVar.needsInterpolation = true;\n\n\t\t} else {\n\n\t\t\tnodeVar = builder.getVarFromNode( this, this.name );\n\n\t\t}\n\n\t\treturn builder.getPropertyName( nodeVar );\n\n\t}\n\n}\n\n/**\n * TSL function for creating a property node.\n *\n * @tsl\n * @function\n * @param {string} type - The type of the node.\n * @param {?string} [name=null] - The name of the property in the shader.\n * @returns {PropertyNode}\n */\nconst property = ( type, name ) => new PropertyNode( type, name );\n\n/**\n * TSL function for creating a varying property node.\n *\n * @tsl\n * @function\n * @param {string} type - The type of the node.\n * @param {?string} [name=null] - The name of the varying in the shader.\n * @returns {PropertyNode}\n */\nconst varyingProperty = ( type, name ) => new PropertyNode( type, name, true );\n\n/**\n * TSL object that represents the shader variable `DiffuseColor`.\n *\n * @tsl\n * @type {PropertyNode<vec4>}\n */\nconst diffuseColor = /*@__PURE__*/ nodeImmutable( PropertyNode, 'vec4', 'DiffuseColor' );\n\n/**\n * TSL object that represents the shader variable `DiffuseContribution`.\n *\n * @tsl\n * @type {PropertyNode<vec3>}\n */\nconst diffuseContribution = /*@__PURE__*/ nodeImmutable( PropertyNode, 'vec3', 'DiffuseContribution' );\n\n/**\n * TSL object that represents the shader variable `EmissiveColor`.\n *\n * @tsl\n * @type {PropertyNode<vec3>}\n */\nconst emissive = /*@__PURE__*/ nodeImmutable( PropertyNode, 'vec3', 'EmissiveColor' );\n\n/**\n * TSL object that represents the shader variable `Roughness`.\n *\n * @tsl\n * @type {PropertyNode<float>}\n */\nconst roughness = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'Roughness' );\n\n/**\n * TSL object that represents the shader variable `Metalness`.\n *\n * @tsl\n * @type {PropertyNode<float>}\n */\nconst metalness = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'Metalness' );\n\n/**\n * TSL object that represents the shader variable `Clearcoat`.\n *\n * @tsl\n * @type {PropertyNode<float>}\n */\nconst clearcoat = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'Clearcoat' );\n\n/**\n * TSL object that represents the shader variable `ClearcoatRoughness`.\n *\n * @tsl\n * @type {PropertyNode<float>}\n */\nconst clearcoatRoughness = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'ClearcoatRoughness' );\n\n/**\n * TSL object that represents the shader variable `Sheen`.\n *\n * @tsl\n * @type {PropertyNode<vec3>}\n */\nconst sheen = /*@__PURE__*/ nodeImmutable( PropertyNode, 'vec3', 'Sheen' );\n\n/**\n * TSL object that represents the shader variable `SheenRoughness`.\n *\n * @tsl\n * @type {PropertyNode<float>}\n */\nconst sheenRoughness = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'SheenRoughness' );\n\n/**\n * TSL object that represents the shader variable `Iridescence`.\n *\n * @tsl\n * @type {PropertyNode<float>}\n */\nconst iridescence = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'Iridescence' );\n\n/**\n * TSL object that represents the shader variable `IridescenceIOR`.\n *\n * @tsl\n * @type {PropertyNode<float>}\n */\nconst iridescenceIOR = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'IridescenceIOR' );\n\n/**\n * TSL object that represents the shader variable `IridescenceThickness`.\n *\n * @tsl\n * @type {PropertyNode<float>}\n */\nconst iridescenceThickness = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'IridescenceThickness' );\n\n/**\n * TSL object that represents the shader variable `AlphaT`.\n *\n * @tsl\n * @type {PropertyNode<float>}\n */\nconst alphaT = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'AlphaT' );\n\n/**\n * TSL object that represents the shader variable `Anisotropy`.\n *\n * @tsl\n * @type {PropertyNode<float>}\n */\nconst anisotropy = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'Anisotropy' );\n\n/**\n * TSL object that represents the shader variable `AnisotropyT`.\n *\n * @tsl\n * @type {PropertyNode<vec3>}\n */\nconst anisotropyT = /*@__PURE__*/ nodeImmutable( PropertyNode, 'vec3', 'AnisotropyT' );\n\n/**\n * TSL object that represents the shader variable `AnisotropyB`.\n *\n * @tsl\n * @type {PropertyNode<vec3>}\n */\nconst anisotropyB = /*@__PURE__*/ nodeImmutable( PropertyNode, 'vec3', 'AnisotropyB' );\n\n/**\n * TSL object that represents the shader variable `SpecularColor`.\n *\n * @tsl\n * @type {PropertyNode<color>}\n */\nconst specularColor = /*@__PURE__*/ nodeImmutable( PropertyNode, 'color', 'SpecularColor' );\n\n/**\n * TSL object that represents the shader variable `SpecularColorBlended`.\n *\n * @tsl\n * @type {PropertyNode<color>}\n */\nconst specularColorBlended = /*@__PURE__*/ nodeImmutable( PropertyNode, 'color', 'SpecularColorBlended' );\n\n/**\n * TSL object that represents the shader variable `SpecularF90`.\n *\n * @tsl\n * @type {PropertyNode<float>}\n */\nconst specularF90 = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'SpecularF90' );\n\n/**\n * TSL object that represents the shader variable `Shininess`.\n *\n * @tsl\n * @type {PropertyNode<float>}\n */\nconst shininess = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'Shininess' );\n\n/**\n * TSL object that represents the shader variable `Output`.\n *\n * @tsl\n * @type {PropertyNode<vec4>}\n */\nconst output = /*@__PURE__*/ nodeImmutable( PropertyNode, 'vec4', 'Output' );\n\n/**\n * TSL object that represents the shader variable `dashSize`.\n *\n * @tsl\n * @type {PropertyNode<float>}\n */\nconst dashSize = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'dashSize' );\n\n/**\n * TSL object that represents the shader variable `gapSize`.\n *\n * @tsl\n * @type {PropertyNode<float>}\n */\nconst gapSize = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'gapSize' );\n\n/**\n * TSL object that represents the shader variable `pointWidth`.\n *\n * @tsl\n * @type {PropertyNode<float>}\n */\nconst pointWidth = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'pointWidth' );\n\n/**\n * TSL object that represents the shader variable `IOR`.\n *\n * @tsl\n * @type {PropertyNode<float>}\n */\nconst ior = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'IOR' );\n\n/**\n * TSL object that represents the shader variable `Transmission`.\n *\n * @tsl\n * @type {PropertyNode<float>}\n */\nconst transmission = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'Transmission' );\n\n/**\n * TSL object that represents the shader variable `Thickness`.\n *\n * @tsl\n * @type {PropertyNode<float>}\n */\nconst thickness = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'Thickness' );\n\n/**\n * TSL object that represents the shader variable `AttenuationDistance`.\n *\n * @tsl\n * @type {PropertyNode<float>}\n */\nconst attenuationDistance = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'AttenuationDistance' );\n\n/**\n * TSL object that represents the shader variable `AttenuationColor`.\n *\n * @tsl\n * @type {PropertyNode<color>}\n */\nconst attenuationColor = /*@__PURE__*/ nodeImmutable( PropertyNode, 'color', 'AttenuationColor' );\n\n/**\n * TSL object that represents the shader variable `Dispersion`.\n *\n * @tsl\n * @type {PropertyNode<float>}\n */\nconst dispersion = /*@__PURE__*/ nodeImmutable( PropertyNode, 'float', 'Dispersion' );\n\n/**\n * This node can be used to group single instances of {@link UniformNode}\n * and manage them as a uniform buffer.\n *\n * In most cases, the predefined nodes `objectGroup`, `renderGroup` and `frameGroup`\n * will be used when defining the {@link UniformNode#groupNode} property.\n *\n * - `objectGroup`: Uniform buffer per object.\n * - `renderGroup`: Shared uniform buffer, updated once per render call.\n * - `frameGroup`: Shared uniform buffer, updated once per frame.\n *\n * @augments Node\n */\nclass UniformGroupNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'UniformGroupNode';\n\n\t}\n\n\t/**\n\t * Constructs a new uniform group node.\n\t *\n\t * @param {string} name - The name of the uniform group node.\n\t * @param {boolean} [shared=false] - Whether this uniform group node is shared or not.\n\t * @param {number} [order=1] - Influences the internal sorting.\n\t */\n\tconstructor( name, shared = false, order = 1 ) {\n\n\t\tsuper( 'string' );\n\n\t\t/**\n\t\t * The name of the uniform group node.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * Whether this uniform group node is shared or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.shared = shared;\n\n\t\t/**\n\t\t * Influences the internal sorting.\n\t\t * TODO: Add details when this property should be changed.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.order = order;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isUniformGroup = true;\n\n\t}\n\n\tserialize( data ) {\n\n\t\tsuper.serialize( data );\n\n\t\tdata.name = this.name;\n\t\tdata.version = this.version;\n\t\tdata.shared = this.shared;\n\n\t}\n\n\tdeserialize( data ) {\n\n\t\tsuper.deserialize( data );\n\n\t\tthis.name = data.name;\n\t\tthis.version = data.version;\n\t\tthis.shared = data.shared;\n\n\t}\n\n}\n\n/**\n * TSL function for creating a uniform group node with the given name.\n *\n * @tsl\n * @function\n * @param {string} name - The name of the uniform group node.\n * @returns {UniformGroupNode}\n */\nconst uniformGroup = ( name ) => new UniformGroupNode( name );\n\n/**\n * TSL function for creating a shared uniform group node with the given name and order.\n *\n * @tsl\n * @function\n * @param {string} name - The name of the uniform group node.\n * @param {number} [order=0] - Influences the internal sorting.\n * @returns {UniformGroupNode}\n */\nconst sharedUniformGroup = ( name, order = 0 ) => new UniformGroupNode( name, true, order );\n\n/**\n * TSL object that represents a shared uniform group node which is updated once per frame.\n *\n * @tsl\n * @type {UniformGroupNode}\n */\nconst frameGroup = /*@__PURE__*/ sharedUniformGroup( 'frame' );\n\n/**\n * TSL object that represents a shared uniform group node which is updated once per render.\n *\n * @tsl\n * @type {UniformGroupNode}\n */\nconst renderGroup = /*@__PURE__*/ sharedUniformGroup( 'render' );\n\n/**\n * TSL object that represents a uniform group node which is updated once per object.\n *\n * @tsl\n * @type {UniformGroupNode}\n */\nconst objectGroup = /*@__PURE__*/ uniformGroup( 'object' );\n\n/**\n * Class for representing a uniform.\n *\n * @augments InputNode\n */\nclass UniformNode extends InputNode {\n\n\tstatic get type() {\n\n\t\treturn 'UniformNode';\n\n\t}\n\n\t/**\n\t * Constructs a new uniform node.\n\t *\n\t * @param {any} value - The value of this node. Usually a JS primitive or three.js object (vector, matrix, color, texture).\n\t * @param {?string} nodeType - The node type. If no explicit type is defined, the node tries to derive the type from its value.\n\t */\n\tconstructor( value, nodeType = null ) {\n\n\t\tsuper( value, nodeType );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isUniformNode = true;\n\n\t\t/**\n\t\t * The name or label of the uniform.\n\t\t *\n\t\t * @type {string}\n\t\t * @default ''\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The uniform group of this uniform. By default, uniforms are\n\t\t * managed per object but they might belong to a shared group\n\t\t * which is updated per frame or render call.\n\t\t *\n\t\t * @type {UniformGroupNode}\n\t\t */\n\t\tthis.groupNode = objectGroup;\n\n\t}\n\n\t/**\n\t * Sets the {@link UniformNode#name} property.\n\t *\n\t * @param {string} name - The name of the uniform.\n\t * @return {UniformNode} A reference to this node.\n\t */\n\tsetName( name ) {\n\n\t\tthis.name = name;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the {@link UniformNode#name} property.\n\t *\n\t * @deprecated\n\t * @param {string} name - The name of the uniform.\n\t * @return {UniformNode} A reference to this node.\n\t */\n\tlabel( name ) {\n\n\t\twarn( 'TSL: \"label()\" has been deprecated. Use \"setName()\" instead.' ); // @deprecated r179\n\n\t\treturn this.setName( name );\n\n\t}\n\n\t/**\n\t * Sets the {@link UniformNode#groupNode} property.\n\t *\n\t * @param {UniformGroupNode} group - The uniform group.\n\t * @return {UniformNode} A reference to this node.\n\t */\n\tsetGroup( group ) {\n\n\t\tthis.groupNode = group;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the {@link UniformNode#groupNode}.\n\t *\n\t * @return {UniformGroupNode} The uniform group.\n\t */\n\tgetGroup() {\n\n\t\treturn this.groupNode;\n\n\t}\n\n\t/**\n\t * By default, this method returns the result of {@link Node#getHash} but derived\n\t * classes might overwrite this method with a different implementation.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The uniform hash.\n\t */\n\tgetUniformHash( builder ) {\n\n\t\treturn this.getHash( builder );\n\n\t}\n\n\tonUpdate( callback, updateType ) {\n\n\t\tcallback = callback.bind( this );\n\n\t\treturn super.onUpdate( ( frame ) => {\n\n\t\t\tconst value = callback( frame, this );\n\n\t\t\tif ( value !== undefined ) {\n\n\t\t\t\tthis.value = value;\n\n\t\t\t}\n\n\t \t}, updateType );\n\n\t}\n\n\tgetInputType( builder ) {\n\n\t\tlet type = super.getInputType( builder );\n\n\t\tif ( type === 'bool' ) {\n\n\t\t\ttype = 'uint';\n\n\t\t}\n\n\t\treturn type;\n\n\t}\n\n\tgenerate( builder, output ) {\n\n\t\tconst type = this.getNodeType( builder );\n\n\t\tconst hash = this.getUniformHash( builder );\n\n\t\tlet sharedNode = builder.getNodeFromHash( hash );\n\n\t\tif ( sharedNode === undefined ) {\n\n\t\t\tbuilder.setHashNode( this, hash );\n\n\t\t\tsharedNode = this;\n\n\t\t}\n\n\t\tconst sharedNodeType = sharedNode.getInputType( builder );\n\n\t\tconst nodeUniform = builder.getUniformFromNode( sharedNode, sharedNodeType, builder.shaderStage, this.name || builder.context.nodeName );\n\t\tconst uniformName = builder.getPropertyName( nodeUniform );\n\n\t\tif ( builder.context.nodeName !== undefined ) delete builder.context.nodeName;\n\n\t\t//\n\n\t\tlet snippet = uniformName;\n\n\t\tif ( type === 'bool' ) {\n\n\t\t\t// cache to variable\n\n\t\t\tconst nodeData = builder.getDataFromNode( this );\n\n\t\t\tlet propertyName = nodeData.propertyName;\n\n\t\t\tif ( propertyName === undefined ) {\n\n\t\t\t\tconst nodeVar = builder.getVarFromNode( this, null, 'bool' );\n\t\t\t\tpropertyName = builder.getPropertyName( nodeVar );\n\n\t\t\t\tnodeData.propertyName = propertyName;\n\n\t\t\t\tsnippet = builder.format( uniformName, sharedNodeType, type );\n\n\t\t\t\tbuilder.addLineFlowCode( `${ propertyName } = ${ snippet }`, this );\n\n\t\t\t}\n\n\t\t\tsnippet = propertyName;\n\n\t\t}\n\n\t\treturn builder.format( snippet, type, output );\n\n\t}\n\n}\n\n/**\n * TSL function for creating a uniform node.\n *\n * @tsl\n * @function\n * @param {any|string} value - The value of this uniform or your type. Usually a JS primitive or three.js object (vector, matrix, color, texture).\n * @param {string} [type] - The node type. If no explicit type is defined, the node tries to derive the type from its value.\n * @returns {UniformNode}\n */\nconst uniform = ( value, type ) => {\n\n\tconst nodeType = getConstNodeType( type || value );\n\n\tif ( nodeType === value ) {\n\n\t\t// if the value is a type but no having a value\n\n\t\tvalue = getValueFromType( nodeType );\n\n\t}\n\n\tif ( value && value.isNode === true ) {\n\n\t\tlet v = value.value;\n\n\t\tvalue.traverse( n => {\n\n\t\t\tif ( n.isConstNode === true ) {\n\n\t\t\t\tv = n.value;\n\n\t\t\t}\n\n\t\t} );\n\n\t\tvalue = v;\n\n\t}\n\n\treturn new UniformNode( value, nodeType );\n\n};\n\n/**\n * ArrayNode represents a collection of nodes, typically created using the {@link array} function.\n * ```js\n * const colors = array( [\n * \tvec3( 1, 0, 0 ),\n * \tvec3( 0, 1, 0 ),\n * \tvec3( 0, 0, 1 )\n * ] );\n *\n * const redColor = tintColors.element( 0 );\n * ```\n *\n * @augments TempNode\n */\nclass ArrayNode extends TempNode {\n\n\tstatic get type() {\n\n\t\treturn 'ArrayNode';\n\n\t}\n\n\t/**\n\t * Constructs a new array node.\n\t *\n\t * @param {?string} nodeType - The data type of the elements.\n\t * @param {number} count - Size of the array.\n\t * @param {?Array<Node>} [values=null] - Array default values.\n\t */\n\tconstructor( nodeType, count, values = null ) {\n\n\t\tsuper( nodeType );\n\n\t\t/**\n\t\t * Array size.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.count = count;\n\n\t\t/**\n\t\t * Array default values.\n\t\t *\n\t\t * @type {?Array<Node>}\n\t\t */\n\t\tthis.values = values;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isArrayNode = true;\n\n\t}\n\n\t/**\n\t * Returns the number of elements in the node array.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {number} The number of elements in the node array.\n\t */\n\tgetArrayCount( /*builder*/ ) {\n\n\t\treturn this.count;\n\n\t}\n\n\t/**\n\t * Returns the node's type.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The type of the node.\n\t */\n\tgetNodeType( builder ) {\n\n\t\tif ( this.nodeType === null ) {\n\n\t\t\treturn this.values[ 0 ].getNodeType( builder );\n\n\t\t}\n\n\t\treturn this.nodeType;\n\n\t}\n\n\t/**\n\t * Returns the node's type.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The type of the node.\n\t */\n\tgetElementType( builder ) {\n\n\t\treturn this.getNodeType( builder );\n\n\t}\n\n\t/**\n\t * Returns the type of a member variable.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @param {string} name - The name of the member variable.\n\t * @return {string} The type of the member variable.\n\t */\n\tgetMemberType( builder, name ) {\n\n\t\tif ( this.nodeType === null ) {\n\n\t\t\treturn this.values[ 0 ].getMemberType( builder, name );\n\n\t\t}\n\n\t\treturn super.getMemberType( builder, name );\n\n\t}\n\n\t/**\n\t * This method builds the output node and returns the resulting array as a shader string.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The generated shader string.\n\t */\n\tgenerate( builder ) {\n\n\t\tconst type = this.getNodeType( builder );\n\n\t\treturn builder.generateArray( type, this.count, this.values );\n\n\t}\n\n}\n\n/**\n * TSL function for creating an array node.\n *\n * @tsl\n * @function\n * @param {string|Array<Node>} nodeTypeOrValues - A string representing the element type (e.g., 'vec3')\n * or an array containing the default values (e.g., [ vec3() ]).\n * @param {?number} [count] - Size of the array.\n * @returns {ArrayNode}\n */\nconst array = ( ...params ) => {\n\n\tlet node;\n\n\tif ( params.length === 1 ) {\n\n\t\tconst values = params[ 0 ];\n\n\t\tnode = new ArrayNode( null, values.length, values );\n\n\t} else {\n\n\t\tconst nodeType = params[ 0 ];\n\t\tconst count = params[ 1 ];\n\n\t\tnode = new ArrayNode( nodeType, count );\n\n\t}\n\n\treturn nodeObject( node );\n\n};\n\naddMethodChaining( 'toArray', ( node, count ) => array( Array( count ).fill( node ) ) );\n\n/**\n * These node represents an assign operation. Meaning a node is assigned\n * to another node.\n *\n * @augments TempNode\n */\nclass AssignNode extends TempNode {\n\n\tstatic get type() {\n\n\t\treturn 'AssignNode';\n\n\t}\n\n\t/**\n\t * Constructs a new assign node.\n\t *\n\t * @param {Node} targetNode - The target node.\n\t * @param {Node} sourceNode - The source type.\n\t */\n\tconstructor( targetNode, sourceNode ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The target node.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.targetNode = targetNode;\n\n\t\t/**\n\t\t * The source node.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.sourceNode = sourceNode;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isAssignNode = true;\n\n\t}\n\n\t/**\n\t * Whether this node is used more than once in context of other nodes. This method\n\t * is overwritten since it always returns `false` (assigns are unique).\n\t *\n\t * @return {boolean} A flag that indicates if there is more than one dependency to other nodes. Always `false`.\n\t */\n\thasDependencies() {\n\n\t\treturn false;\n\n\t}\n\n\tgetNodeType( builder, output ) {\n\n\t\treturn output !== 'void' ? this.targetNode.getNodeType( builder ) : 'void';\n\n\t}\n\n\t/**\n\t * Whether a split is required when assigning source to target. This can happen when the component length of\n\t * target and source data type does not match.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {boolean} Whether a split is required when assigning source to target.\n\t */\n\tneedsSplitAssign( builder ) {\n\n\t\tconst { targetNode } = this;\n\n\t\tif ( builder.isAvailable( 'swizzleAssign' ) === false && targetNode.isSplitNode && targetNode.components.length > 1 ) {\n\n\t\t\tconst targetLength = builder.getTypeLength( targetNode.node.getNodeType( builder ) );\n\t\t\tconst assignDifferentVector = vectorComponents.join( '' ).slice( 0, targetLength ) !== targetNode.components;\n\n\t\t\treturn assignDifferentVector;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\tsetup( builder ) {\n\n\t\tconst { targetNode, sourceNode } = this;\n\n\t\tconst scope = targetNode.getScope();\n\n\t\tconst scopeData = builder.getDataFromNode( scope );\n\t\tscopeData.assign = true;\n\n\t\tconst properties = builder.getNodeProperties( this );\n\t\tproperties.sourceNode = sourceNode;\n\t\tproperties.targetNode = targetNode.context( { assign: true } );\n\n\t}\n\n\tgenerate( builder, output ) {\n\n\t\tconst { targetNode, sourceNode } = builder.getNodeProperties( this );\n\n\t\tconst needsSplitAssign = this.needsSplitAssign( builder );\n\n\t\tconst target = targetNode.build( builder );\n\t\tconst targetType = targetNode.getNodeType( builder );\n\n\t\tconst source = sourceNode.build( builder, targetType );\n\t\tconst sourceType = sourceNode.getNodeType( builder );\n\n\t\tconst nodeData = builder.getDataFromNode( this );\n\n\t\t//\n\n\t\tlet snippet;\n\n\t\tif ( nodeData.initialized === true ) {\n\n\t\t\tif ( output !== 'void' ) {\n\n\t\t\t\tsnippet = target;\n\n\t\t\t}\n\n\t\t} else if ( needsSplitAssign ) {\n\n\t\t\tconst sourceVar = builder.getVarFromNode( this, null, targetType );\n\t\t\tconst sourceProperty = builder.getPropertyName( sourceVar );\n\n\t\t\tbuilder.addLineFlowCode( `${ sourceProperty } = ${ source }`, this );\n\n\t\t\tconst splitNode = targetNode.node;\n\t\t\tconst splitTargetNode = splitNode.node.context( { assign: true } );\n\n\t\t\tconst targetRoot = splitTargetNode.build( builder );\n\n\t\t\tfor ( let i = 0; i < splitNode.components.length; i ++ ) {\n\n\t\t\t\tconst component = splitNode.components[ i ];\n\n\t\t\t\tbuilder.addLineFlowCode( `${ targetRoot }.${ component } = ${ sourceProperty }[ ${ i } ]`, this );\n\n\t\t\t}\n\n\t\t\tif ( output !== 'void' ) {\n\n\t\t\t\tsnippet = target;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tsnippet = `${ target } = ${ source }`;\n\n\t\t\tif ( output === 'void' || sourceType === 'void' ) {\n\n\t\t\t\tbuilder.addLineFlowCode( snippet, this );\n\n\t\t\t\tif ( output !== 'void' ) {\n\n\t\t\t\t\tsnippet = target;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tnodeData.initialized = true;\n\n\t\treturn builder.format( snippet, targetType, output );\n\n\t}\n\n}\n\n/**\n * TSL function for creating an assign node.\n *\n * @tsl\n * @function\n * @param {Node} targetNode - The target node.\n * @param {Node} sourceNode - The source type.\n * @returns {AssignNode}\n */\nconst assign = /*@__PURE__*/ nodeProxy( AssignNode ).setParameterLength( 2 );\n\naddMethodChaining( 'assign', assign );\n\n/**\n * This module represents the call of a {@link FunctionNode}. Developers are usually not confronted\n * with this module since they use the predefined TSL syntax `wgslFn` and `glslFn` which encapsulate\n * this logic.\n *\n * @augments TempNode\n */\nclass FunctionCallNode extends TempNode {\n\n\tstatic get type() {\n\n\t\treturn 'FunctionCallNode';\n\n\t}\n\n\t/**\n\t * Constructs a new function call node.\n\t *\n\t * @param {?FunctionNode} functionNode - The function node.\n\t * @param {Object<string, Node>} [parameters={}] - The parameters for the function call.\n\t */\n\tconstructor( functionNode = null, parameters = {} ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The function node.\n\t\t *\n\t\t * @type {?FunctionNode}\n\t\t * @default null\n\t\t */\n\t\tthis.functionNode = functionNode;\n\n\t\t/**\n\t\t * The parameters of the function call.\n\t\t *\n\t\t * @type {Object<string, Node>}\n\t\t * @default {}\n\t\t */\n\t\tthis.parameters = parameters;\n\n\t}\n\n\t/**\n\t * Sets the parameters of the function call node.\n\t *\n\t * @param {Object<string, Node>} parameters - The parameters to set.\n\t * @return {FunctionCallNode} A reference to this node.\n\t */\n\tsetParameters( parameters ) {\n\n\t\tthis.parameters = parameters;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the parameters of the function call node.\n\t *\n\t * @return {Object<string, Node>} The parameters of this node.\n\t */\n\tgetParameters() {\n\n\t\treturn this.parameters;\n\n\t}\n\n\t/**\n\t * Returns the type of this function call node.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @returns {string} The type of this node.\n\t */\n\tgetNodeType( builder ) {\n\n\t\treturn this.functionNode.getNodeType( builder );\n\n\t}\n\n\t/**\n\t * Returns the function node of this function call node.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @param {string} [name] - The name of the member.\n\t * @returns {string} The type of the member.\n\t */\n\tgetMemberType( builder, name ) {\n\n\t\treturn this.functionNode.getMemberType( builder, name );\n\n\t}\n\n\tgenerate( builder ) {\n\n\t\tconst params = [];\n\n\t\tconst functionNode = this.functionNode;\n\n\t\tconst inputs = functionNode.getInputs( builder );\n\t\tconst parameters = this.parameters;\n\n\t\tconst generateInput = ( node, inputNode ) => {\n\n\t\t\tconst type = inputNode.type;\n\t\t\tconst pointer = type === 'pointer';\n\n\t\t\tlet output;\n\n\t\t\tif ( pointer ) output = '&' + node.build( builder );\n\t\t\telse output = node.build( builder, type );\n\n\t\t\treturn output;\n\n\t\t};\n\n\t\tif ( Array.isArray( parameters ) ) {\n\n\t\t\tif ( parameters.length > inputs.length ) {\n\n\t\t\t\terror( 'TSL: The number of provided parameters exceeds the expected number of inputs in \\'Fn()\\'.' );\n\n\t\t\t\tparameters.length = inputs.length;\n\n\t\t\t} else if ( parameters.length < inputs.length ) {\n\n\t\t\t\terror( 'TSL: The number of provided parameters is less than the expected number of inputs in \\'Fn()\\'.' );\n\n\t\t\t\twhile ( parameters.length < inputs.length ) {\n\n\t\t\t\t\tparameters.push( float( 0 ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0; i < parameters.length; i ++ ) {\n\n\t\t\t\tparams.push( generateInput( parameters[ i ], inputs[ i ] ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tfor ( const inputNode of inputs ) {\n\n\t\t\t\tconst node = parameters[ inputNode.name ];\n\n\t\t\t\tif ( node !== undefined ) {\n\n\t\t\t\t\tparams.push( generateInput( node, inputNode ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( `TSL: Input '${ inputNode.name }' not found in \\'Fn()\\'.` );\n\n\t\t\t\t\tparams.push( generateInput( float( 0 ), inputNode ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst functionName = functionNode.build( builder, 'property' );\n\n\t\treturn `${ functionName }( ${ params.join( ', ' ) } )`;\n\n\t}\n\n}\n\nconst call = ( func, ...params ) => {\n\n\tparams = params.length > 1 || ( params[ 0 ] && params[ 0 ].isNode === true ) ? nodeArray( params ) : nodeObjects( params[ 0 ] );\n\n\treturn new FunctionCallNode( nodeObject( func ), params );\n\n};\n\naddMethodChaining( 'call', call );\n\nconst _vectorOperators = {\n\t'==': 'equal',\n\t'!=': 'notEqual',\n\t'<': 'lessThan',\n\t'>': 'greaterThan',\n\t'<=': 'lessThanEqual',\n\t'>=': 'greaterThanEqual',\n\t'%': 'mod'\n};\n\n/**\n * This node represents basic mathematical and logical operations like addition,\n * subtraction or comparisons (e.g. `equal()`).\n *\n * @augments TempNode\n */\nclass OperatorNode extends TempNode {\n\n\tstatic get type() {\n\n\t\treturn 'OperatorNode';\n\n\t}\n\n\t/**\n\t * Constructs a new operator node.\n\t *\n\t * @param {string} op - The operator.\n\t * @param {Node} aNode - The first input.\n\t * @param {Node} bNode - The second input.\n\t * @param {...Node} params - Additional input parameters.\n\t */\n\tconstructor( op, aNode, bNode, ...params ) {\n\n\t\tsuper();\n\n\t\tif ( params.length > 0 ) {\n\n\t\t\tlet finalOp = new OperatorNode( op, aNode, bNode );\n\n\t\t\tfor ( let i = 0; i < params.length - 1; i ++ ) {\n\n\t\t\t\tfinalOp = new OperatorNode( op, finalOp, params[ i ] );\n\n\t\t\t}\n\n\t\t\taNode = finalOp;\n\t\t\tbNode = params[ params.length - 1 ];\n\n\t\t}\n\n\t\t/**\n\t\t * The operator.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.op = op;\n\n\t\t/**\n\t\t * The first input.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.aNode = aNode;\n\n\t\t/**\n\t\t * The second input.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.bNode = bNode;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isOperatorNode = true;\n\n\t}\n\n\t/**\n\t * Returns the operator method name.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @param {string} output - The output type.\n\t * @returns {string} The operator method name.\n\t */\n\tgetOperatorMethod( builder, output ) {\n\n\t\treturn builder.getMethod( _vectorOperators[ this.op ], output );\n\n\t}\n\n\t/**\n\t * This method is overwritten since the node type is inferred from the operator\n\t * and the input node types.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @param {?string} [output=null] - The output type.\n\t * @return {string} The node type.\n\t */\n\tgetNodeType( builder, output = null ) {\n\n\t\tconst op = this.op;\n\n\t\tconst aNode = this.aNode;\n\t\tconst bNode = this.bNode;\n\n\t\tconst typeA = aNode.getNodeType( builder );\n\t\tconst typeB = bNode ? bNode.getNodeType( builder ) : null;\n\n\t\tif ( typeA === 'void' || typeB === 'void' ) {\n\n\t\t\treturn output || 'void';\n\n\t\t} else if ( op === '%' ) {\n\n\t\t\treturn typeA;\n\n\t\t} else if ( op === '~' || op === '&' || op === '|' || op === '^' || op === '>>' || op === '<<' ) {\n\n\t\t\treturn builder.getIntegerType( typeA );\n\n\t\t} else if ( op === '!' || op === '&&' || op === '||' || op === '^^' ) {\n\n\t\t\treturn 'bool';\n\n\t\t} else if ( op === '==' || op === '!=' || op === '<' || op === '>' || op === '<=' || op === '>=' ) {\n\n\t\t\tconst typeLength = Math.max( builder.getTypeLength( typeA ), builder.getTypeLength( typeB ) );\n\n\t\t\treturn typeLength > 1 ? `bvec${ typeLength }` : 'bool';\n\n\t\t} else {\n\n\t\t\t// Handle matrix operations\n\n\t\t\tif ( builder.isMatrix( typeA ) ) {\n\n\t\t\t\tif ( typeB === 'float' ) {\n\n\t\t\t\t\treturn typeA; // matrix * scalar = matrix\n\n\t\t\t\t} else if ( builder.isVector( typeB ) ) {\n\n\t\t\t\t\treturn builder.getVectorFromMatrix( typeA ); // matrix * vector\n\n\t\t\t\t} else if ( builder.isMatrix( typeB ) ) {\n\n\t\t\t\t\treturn typeA; // matrix * matrix\n\n\t\t\t\t}\n\n\t\t\t} else if ( builder.isMatrix( typeB ) ) {\n\n\t\t\t\tif ( typeA === 'float' ) {\n\n\t\t\t\t\treturn typeB; // scalar * matrix = matrix\n\n\t\t\t\t} else if ( builder.isVector( typeA ) ) {\n\n\t\t\t\t\treturn builder.getVectorFromMatrix( typeB ); // vector * matrix\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// Handle non-matrix cases\n\n\t\t\tif ( builder.getTypeLength( typeB ) > builder.getTypeLength( typeA ) ) {\n\n\t\t\t\t// anytype x anytype: use the greater length vector\n\n\t\t\t\treturn typeB;\n\n\t\t\t}\n\n\t\t\treturn typeA;\n\n\t\t}\n\n\t}\n\n\tgenerate( builder, output ) {\n\n\t\tconst op = this.op;\n\n\t\tconst { aNode, bNode } = this;\n\n\t\tconst type = this.getNodeType( builder, output );\n\n\t\tlet typeA = null;\n\t\tlet typeB = null;\n\n\t\tif ( type !== 'void' ) {\n\n\t\t\ttypeA = aNode.getNodeType( builder );\n\t\t\ttypeB = bNode ? bNode.getNodeType( builder ) : null;\n\n\t\t\tif ( op === '<' || op === '>' || op === '<=' || op === '>=' || op === '==' || op === '!=' ) {\n\n\t\t\t\tif ( builder.isVector( typeA ) ) {\n\n\t\t\t\t\ttypeB = typeA;\n\n\t\t\t\t} else if ( builder.isVector( typeB ) ) {\n\n\t\t\t\t\ttypeA = typeB;\n\n\t\t\t\t} else if ( typeA !== typeB ) {\n\n\t\t\t\t\ttypeA = typeB = 'float';\n\n\t\t\t\t}\n\n\t\t\t} else if ( op === '>>' || op === '<<' ) {\n\n\t\t\t\ttypeA = type;\n\t\t\t\ttypeB = builder.changeComponentType( typeB, 'uint' );\n\n\t\t\t} else if ( op === '%' ) {\n\n\t\t\t\ttypeA = type;\n\t\t\t\ttypeB = builder.isInteger( typeA ) && builder.isInteger( typeB ) ? typeB : typeA;\n\n\t\t\t} else if ( builder.isMatrix( typeA ) ) {\n\n\t\t\t\tif ( typeB === 'float' ) {\n\n\t\t\t\t\t// Keep matrix type for typeA, but ensure typeB stays float\n\n\t\t\t\t\ttypeB = 'float';\n\n\t\t\t\t} else if ( builder.isVector( typeB ) ) {\n\n\t\t\t\t\t// matrix x vector\n\t\t\t\t\ttypeB = builder.getVectorFromMatrix( typeA );\n\n\t\t\t\t} else if ( builder.isMatrix( typeB ) ) ; else {\n\n\t\t\t\t\ttypeA = typeB = type;\n\n\t\t\t\t}\n\n\t\t\t} else if ( builder.isMatrix( typeB ) ) {\n\n\t\t\t\tif ( typeA === 'float' ) {\n\n\t\t\t\t\t// Keep matrix type for typeB, but ensure typeA stays float\n\n\t\t\t\t\ttypeA = 'float';\n\n\t\t\t\t} else if ( builder.isVector( typeA ) ) {\n\n\t\t\t\t\t// vector x matrix\n\n\t\t\t\t\ttypeA = builder.getVectorFromMatrix( typeB );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttypeA = typeB = type;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// anytype x anytype\n\n\t\t\t\ttypeA = typeB = type;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\ttypeA = typeB = type;\n\n\t\t}\n\n\t\tconst a = aNode.build( builder, typeA );\n\t\tconst b = bNode ? bNode.build( builder, typeB ) : null;\n\n\t\tconst fnOpSnippet = builder.getFunctionOperator( op );\n\n\t\tif ( output !== 'void' ) {\n\n\t\t\tconst isGLSL = builder.renderer.coordinateSystem === WebGLCoordinateSystem;\n\n\t\t\tif ( op === '==' || op === '!=' || op === '<' || op === '>' || op === '<=' || op === '>=' ) {\n\n\t\t\t\tif ( isGLSL ) {\n\n\t\t\t\t\tif ( builder.isVector( typeA ) ) {\n\n\t\t\t\t\t\treturn builder.format( `${ this.getOperatorMethod( builder, output ) }( ${ a }, ${ b } )`, type, output );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\treturn builder.format( `( ${ a } ${ op } ${ b } )`, type, output );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// WGSL\n\n\t\t\t\t\treturn builder.format( `( ${ a } ${ op } ${ b } )`, type, output );\n\n\t\t\t\t}\n\n\t\t\t} else if ( op === '%' ) {\n\n\t\t\t\tif ( builder.isInteger( typeB ) ) {\n\n\t\t\t\t\treturn builder.format( `( ${ a } % ${ b } )`, type, output );\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn builder.format( `${ this.getOperatorMethod( builder, type ) }( ${ a }, ${ b } )`, type, output );\n\n\t\t\t\t}\n\n\t\t\t} else if ( op === '!' || op === '~' ) {\n\n\t\t\t\treturn builder.format( `(${op}${a})`, typeA, output );\n\n\t\t\t} else if ( fnOpSnippet ) {\n\n\t\t\t\treturn builder.format( `${ fnOpSnippet }( ${ a }, ${ b } )`, type, output );\n\n\t\t\t} else {\n\n\t\t\t\t// Handle matrix operations\n\n\t\t\t\tif ( builder.isMatrix( typeA ) && typeB === 'float' ) {\n\n\t\t\t\t\treturn builder.format( `( ${ b } ${ op } ${ a } )`, type, output );\n\n\t\t\t\t} else if ( typeA === 'float' && builder.isMatrix( typeB ) ) {\n\n\t\t\t\t\treturn builder.format( `${ a } ${ op } ${ b }`, type, output );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlet snippet = `( ${ a } ${ op } ${ b } )`;\n\n\t\t\t\t\tif ( ! isGLSL && type === 'bool' && builder.isVector( typeA ) && builder.isVector( typeB ) ) {\n\n\t\t\t\t\t\tsnippet = `all${ snippet }`;\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn builder.format( snippet, type, output );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( typeA !== 'void' ) {\n\n\t\t\tif ( fnOpSnippet ) {\n\n\t\t\t\treturn builder.format( `${ fnOpSnippet }( ${ a }, ${ b } )`, type, output );\n\n\t\t\t} else {\n\n\t\t\t\tif ( builder.isMatrix( typeA ) && typeB === 'float' ) {\n\n\t\t\t\t\treturn builder.format( `${ b } ${ op } ${ a }`, type, output );\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn builder.format( `${ a } ${ op } ${ b }`, type, output );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tserialize( data ) {\n\n\t\tsuper.serialize( data );\n\n\t\tdata.op = this.op;\n\n\t}\n\n\tdeserialize( data ) {\n\n\t\tsuper.deserialize( data );\n\n\t\tthis.op = data.op;\n\n\t}\n\n}\n\n/**\n * Returns the addition of two or more value.\n *\n * @tsl\n * @function\n * @param {Node} a - The first input.\n * @param {Node} b - The second input.\n * @param {...Node} params - Additional input parameters.\n * @returns {OperatorNode}\n */\nconst add = /*@__PURE__*/ nodeProxyIntent( OperatorNode, '+' ).setParameterLength( 2, Infinity ).setName( 'add' );\n\n/**\n * Returns the subtraction of two or more value.\n *\n * @tsl\n * @function\n * @param {Node} a - The first input.\n * @param {Node} b - The second input.\n * @param {...Node} params - Additional input parameters.\n * @returns {OperatorNode}\n */\nconst sub = /*@__PURE__*/ nodeProxyIntent( OperatorNode, '-' ).setParameterLength( 2, Infinity ).setName( 'sub' );\n\n/**\n * Returns the multiplication of two or more value.\n *\n * @tsl\n * @function\n * @param {Node} a - The first input.\n * @param {Node} b - The second input.\n * @param {...Node} params - Additional input parameters.\n * @returns {OperatorNode}\n */\nconst mul = /*@__PURE__*/ nodeProxyIntent( OperatorNode, '*' ).setParameterLength( 2, Infinity ).setName( 'mul' );\n\n/**\n * Returns the division of two or more value.\n *\n * @tsl\n * @function\n * @param {Node} a - The first input.\n * @param {Node} b - The second input.\n * @param {...Node} params - Additional input parameters.\n * @returns {OperatorNode}\n */\nconst div = /*@__PURE__*/ nodeProxyIntent( OperatorNode, '/' ).setParameterLength( 2, Infinity ).setName( 'div' );\n\n/**\n * Computes the remainder of dividing the first node by the second one.\n *\n * @tsl\n * @function\n * @param {Node} a - The first input.\n * @param {Node} b - The second input.\n * @returns {OperatorNode}\n */\nconst mod = /*@__PURE__*/ nodeProxyIntent( OperatorNode, '%' ).setParameterLength( 2 ).setName( 'mod' );\n\n/**\n * Checks if two nodes are equal.\n *\n * @tsl\n * @function\n * @param {Node} a - The first input.\n * @param {Node} b - The second input.\n * @returns {OperatorNode}\n */\nconst equal = /*@__PURE__*/ nodeProxyIntent( OperatorNode, '==' ).setParameterLength( 2 ).setName( 'equal' );\n\n/**\n * Checks if two nodes are not equal.\n *\n * @tsl\n * @function\n * @param {Node} a - The first input.\n * @param {Node} b - The second input.\n * @returns {OperatorNode}\n */\nconst notEqual = /*@__PURE__*/ nodeProxyIntent( OperatorNode, '!=' ).setParameterLength( 2 ).setName( 'notEqual' );\n\n/**\n * Checks if the first node is less than the second.\n *\n * @tsl\n * @function\n * @param {Node} a - The first input.\n * @param {Node} b - The second input.\n * @returns {OperatorNode}\n */\nconst lessThan = /*@__PURE__*/ nodeProxyIntent( OperatorNode, '<' ).setParameterLength( 2 ).setName( 'lessThan' );\n\n/**\n * Checks if the first node is greater than the second.\n *\n * @tsl\n * @function\n * @param {Node} a - The first input.\n * @param {Node} b - The second input.\n * @returns {OperatorNode}\n */\nconst greaterThan = /*@__PURE__*/ nodeProxyIntent( OperatorNode, '>' ).setParameterLength( 2 ).setName( 'greaterThan' );\n\n/**\n * Checks if the first node is less than or equal to the second.\n *\n * @tsl\n * @function\n * @param {Node} a - The first input.\n * @param {Node} b - The second input.\n * @returns {OperatorNode}\n */\nconst lessThanEqual = /*@__PURE__*/ nodeProxyIntent( OperatorNode, '<=' ).setParameterLength( 2 ).setName( 'lessThanEqual' );\n\n/**\n * Checks if the first node is greater than or equal to the second.\n *\n * @tsl\n * @function\n * @param {Node} a - The first input.\n * @param {Node} b - The second input.\n * @returns {OperatorNode}\n */\nconst greaterThanEqual = /*@__PURE__*/ nodeProxyIntent( OperatorNode, '>=' ).setParameterLength( 2 ).setName( 'greaterThanEqual' );\n\n/**\n * Performs a logical AND operation on multiple nodes.\n *\n * @tsl\n * @function\n * @param {...Node} nodes - The input nodes to be combined using AND.\n * @returns {OperatorNode}\n */\nconst and = /*@__PURE__*/ nodeProxyIntent( OperatorNode, '&&' ).setParameterLength( 2, Infinity ).setName( 'and' );\n\n/**\n * Performs a logical OR operation on multiple nodes.\n *\n * @tsl\n * @function\n * @param {...Node} nodes - The input nodes to be combined using OR.\n * @returns {OperatorNode}\n */\nconst or = /*@__PURE__*/ nodeProxyIntent( OperatorNode, '||' ).setParameterLength( 2, Infinity ).setName( 'or' );\n\n/**\n * Performs logical NOT on a node.\n *\n * @tsl\n * @function\n * @param {Node} value - The value.\n * @returns {OperatorNode}\n */\nconst not = /*@__PURE__*/ nodeProxyIntent( OperatorNode, '!' ).setParameterLength( 1 ).setName( 'not' );\n\n/**\n * Performs logical XOR on two nodes.\n *\n * @tsl\n * @function\n * @param {Node} a - The first input.\n * @param {Node} b - The second input.\n * @returns {OperatorNode}\n */\nconst xor = /*@__PURE__*/ nodeProxyIntent( OperatorNode, '^^' ).setParameterLength( 2 ).setName( 'xor' );\n\n/**\n * Performs bitwise AND on two nodes.\n *\n * @tsl\n * @function\n * @param {Node} a - The first input.\n * @param {Node} b - The second input.\n * @returns {OperatorNode}\n */\nconst bitAnd = /*@__PURE__*/ nodeProxyIntent( OperatorNode, '&' ).setParameterLength( 2 ).setName( 'bitAnd' );\n\n/**\n * Performs bitwise NOT on a node.\n *\n * @tsl\n * @function\n * @param {Node} a - The first input.\n * @param {Node} b - The second input.\n * @returns {OperatorNode}\n */\nconst bitNot = /*@__PURE__*/ nodeProxyIntent( OperatorNode, '~' ).setParameterLength( 1 ).setName( 'bitNot' );\n\n/**\n * Performs bitwise OR on two nodes.\n *\n * @tsl\n * @function\n * @param {Node} a - The first input.\n * @param {Node} b - The second input.\n * @returns {OperatorNode}\n */\nconst bitOr = /*@__PURE__*/ nodeProxyIntent( OperatorNode, '|' ).setParameterLength( 2 ).setName( 'bitOr' );\n\n/**\n * Performs bitwise XOR on two nodes.\n *\n * @tsl\n * @function\n * @param {Node} a - The first input.\n * @param {Node} b - The second input.\n * @returns {OperatorNode}\n */\nconst bitXor = /*@__PURE__*/ nodeProxyIntent( OperatorNode, '^' ).setParameterLength( 2 ).setName( 'bitXor' );\n\n/**\n * Shifts a node to the left.\n *\n * @tsl\n * @function\n * @param {Node} a - The node to shift.\n * @param {Node} b - The value to shift.\n * @returns {OperatorNode}\n */\nconst shiftLeft = /*@__PURE__*/ nodeProxyIntent( OperatorNode, '<<' ).setParameterLength( 2 ).setName( 'shiftLeft' );\n\n/**\n * Shifts a node to the right.\n *\n * @tsl\n * @function\n * @param {Node} a - The node to shift.\n * @param {Node} b - The value to shift.\n * @returns {OperatorNode}\n */\nconst shiftRight = /*@__PURE__*/ nodeProxyIntent( OperatorNode, '>>' ).setParameterLength( 2 ).setName( 'shiftRight' );\n\n/**\n * Increments a node by 1.\n *\n * @tsl\n * @function\n * @param {Node} a - The node to increment.\n * @returns {OperatorNode}\n */\nconst incrementBefore = Fn( ( [ a ] ) => {\n\n\ta.addAssign( 1 );\n\treturn a;\n\n} );\n\n/**\n * Decrements a node by 1.\n *\n * @tsl\n * @function\n * @param {Node} a - The node to decrement.\n * @returns {OperatorNode}\n */\nconst decrementBefore = Fn( ( [ a ] ) => {\n\n\ta.subAssign( 1 );\n\treturn a;\n\n} );\n\n/**\n * Increments a node by 1 and returns the previous value.\n *\n * @tsl\n * @function\n * @param {Node} a - The node to increment.\n * @returns {OperatorNode}\n */\nconst increment = /*@__PURE__*/ Fn( ( [ a ] ) => {\n\n\tconst temp = int( a ).toConst();\n\ta.addAssign( 1 );\n\treturn temp;\n\n} );\n\n/**\n * Decrements a node by 1 and returns the previous value.\n *\n * @tsl\n * @function\n * @param {Node} a - The node to decrement.\n * @returns {OperatorNode}\n */\nconst decrement = /*@__PURE__*/ Fn( ( [ a ] ) => {\n\n\tconst temp = int( a ).toConst();\n\ta.subAssign( 1 );\n\treturn temp;\n\n} );\n\naddMethodChaining( 'add', add );\naddMethodChaining( 'sub', sub );\naddMethodChaining( 'mul', mul );\naddMethodChaining( 'div', div );\naddMethodChaining( 'mod', mod );\naddMethodChaining( 'equal', equal );\naddMethodChaining( 'notEqual', notEqual );\naddMethodChaining( 'lessThan', lessThan );\naddMethodChaining( 'greaterThan', greaterThan );\naddMethodChaining( 'lessThanEqual', lessThanEqual );\naddMethodChaining( 'greaterThanEqual', greaterThanEqual );\naddMethodChaining( 'and', and );\naddMethodChaining( 'or', or );\naddMethodChaining( 'not', not );\naddMethodChaining( 'xor', xor );\naddMethodChaining( 'bitAnd', bitAnd );\naddMethodChaining( 'bitNot', bitNot );\naddMethodChaining( 'bitOr', bitOr );\naddMethodChaining( 'bitXor', bitXor );\naddMethodChaining( 'shiftLeft', shiftLeft );\naddMethodChaining( 'shiftRight', shiftRight );\n\naddMethodChaining( 'incrementBefore', incrementBefore );\naddMethodChaining( 'decrementBefore', decrementBefore );\naddMethodChaining( 'increment', increment );\naddMethodChaining( 'decrement', decrement );\n\n/**\n * @tsl\n * @function\n * @deprecated since r175. Use {@link mod} instead.\n *\n * @param {Node} a - The first input.\n * @param {Node} b - The second input.\n * @returns {OperatorNode}\n */\nconst modInt = ( a, b ) => { // @deprecated, r175\n\n\twarn( 'TSL: \"modInt()\" is deprecated. Use \"mod( int( ... ) )\" instead.' );\n\treturn mod( int( a ), int( b ) );\n\n};\n\naddMethodChaining( 'modInt', modInt );\n\n/**\n * This node represents a variety of mathematical methods available in shaders.\n * They are divided into three categories:\n *\n * - Methods with one input like `sin`, `cos` or `normalize`.\n * - Methods with two inputs like `dot`, `cross` or `pow`.\n * - Methods with three inputs like `mix`, `clamp` or `smoothstep`.\n *\n * @augments TempNode\n */\nclass MathNode extends TempNode {\n\n\tstatic get type() {\n\n\t\treturn 'MathNode';\n\n\t}\n\n\t/**\n\t * Constructs a new math node.\n\t *\n\t * @param {string} method - The method name.\n\t * @param {Node} aNode - The first input.\n\t * @param {?Node} [bNode=null] - The second input.\n\t * @param {?Node} [cNode=null] - The third input.\n\t */\n\tconstructor( method, aNode, bNode = null, cNode = null ) {\n\n\t\tsuper();\n\n\t\t// Allow the max() and min() functions to take an arbitrary number of arguments.\n\n\t\tif ( ( method === MathNode.MAX || method === MathNode.MIN ) && arguments.length > 3 ) {\n\n\t\t\tlet finalOp = new MathNode( method, aNode, bNode );\n\n\t\t\tfor ( let i = 2; i < arguments.length - 1; i ++ ) {\n\n\t\t\t\tfinalOp = new MathNode( method, finalOp, arguments[ i ] );\n\n\t\t\t}\n\n\t\t\taNode = finalOp;\n\t\t\tbNode = arguments[ arguments.length - 1 ];\n\t\t\tcNode = null;\n\n\t\t}\n\n\t\t/**\n\t\t * The method name.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.method = method;\n\n\t\t/**\n\t\t * The first input.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.aNode = aNode;\n\n\t\t/**\n\t\t * The second input.\n\t\t *\n\t\t * @type {?Node}\n\t\t * @default null\n\t\t */\n\t\tthis.bNode = bNode;\n\n\t\t/**\n\t\t * The third input.\n\t\t *\n\t\t * @type {?Node}\n\t\t * @default null\n\t\t */\n\t\tthis.cNode = cNode;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMathNode = true;\n\n\t}\n\n\t/**\n\t * The input type is inferred from the node types of the input nodes.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The input type.\n\t */\n\tgetInputType( builder ) {\n\n\t\tconst aType = this.aNode.getNodeType( builder );\n\t\tconst bType = this.bNode ? this.bNode.getNodeType( builder ) : null;\n\t\tconst cType = this.cNode ? this.cNode.getNodeType( builder ) : null;\n\n\t\tconst aLen = builder.isMatrix( aType ) ? 0 : builder.getTypeLength( aType );\n\t\tconst bLen = builder.isMatrix( bType ) ? 0 : builder.getTypeLength( bType );\n\t\tconst cLen = builder.isMatrix( cType ) ? 0 : builder.getTypeLength( cType );\n\n\t\tif ( aLen > bLen && aLen > cLen ) {\n\n\t\t\treturn aType;\n\n\t\t} else if ( bLen > cLen ) {\n\n\t\t\treturn bType;\n\n\t\t} else if ( cLen > aLen ) {\n\n\t\t\treturn cType;\n\n\t\t}\n\n\t\treturn aType;\n\n\t}\n\n\t/**\n\t * The selected method as well as the input type determine the node type of this node.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The node type.\n\t */\n\tgetNodeType( builder ) {\n\n\t\tconst method = this.method;\n\n\t\tif ( method === MathNode.LENGTH || method === MathNode.DISTANCE || method === MathNode.DOT ) {\n\n\t\t\treturn 'float';\n\n\t\t} else if ( method === MathNode.CROSS ) {\n\n\t\t\treturn 'vec3';\n\n\t\t} else if ( method === MathNode.ALL || method === MathNode.ANY ) {\n\n\t\t\treturn 'bool';\n\n\t\t} else if ( method === MathNode.EQUALS ) {\n\n\t\t\treturn builder.changeComponentType( this.aNode.getNodeType( builder ), 'bool' );\n\n\t\t} else {\n\n\t\t\treturn this.getInputType( builder );\n\n\t\t}\n\n\t}\n\n\tsetup( builder ) {\n\n\t\tconst { aNode, bNode, method } = this;\n\n\t\tlet outputNode = null;\n\n\t\tif ( method === MathNode.ONE_MINUS ) {\n\n\t\t\toutputNode = sub( 1.0, aNode );\n\n\t\t} else if ( method === MathNode.RECIPROCAL ) {\n\n\t\t\toutputNode = div( 1.0, aNode );\n\n\t\t} else if ( method === MathNode.DIFFERENCE ) {\n\n\t\t\toutputNode = abs( sub( aNode, bNode ) );\n\n\t\t} else if ( method === MathNode.TRANSFORM_DIRECTION ) {\n\n\t\t\t// dir can be either a direction vector or a normal vector\n\t\t\t// upper-left 3x3 of matrix is assumed to be orthogonal\n\n\t\t\tlet tA = aNode;\n\t\t\tlet tB = bNode;\n\n\t\t\tif ( builder.isMatrix( tA.getNodeType( builder ) ) ) {\n\n\t\t\t\ttB = vec4( vec3( tB ), 0.0 );\n\n\t\t\t} else {\n\n\t\t\t\ttA = vec4( vec3( tA ), 0.0 );\n\n\t\t\t}\n\n\t\t\tconst mulNode = mul( tA, tB ).xyz;\n\n\t\t\toutputNode = normalize( mulNode );\n\n\t\t}\n\n\t\tif ( outputNode !== null ) {\n\n\t\t\treturn outputNode;\n\n\t\t} else {\n\n\t\t\treturn super.setup( builder );\n\n\t\t}\n\n\t}\n\n\tgenerate( builder, output ) {\n\n\t\tconst properties = builder.getNodeProperties( this );\n\n\t\tif ( properties.outputNode ) {\n\n\t\t\treturn super.generate( builder, output );\n\n\t\t}\n\n\t\tlet method = this.method;\n\n\t\tconst type = this.getNodeType( builder );\n\t\tconst inputType = this.getInputType( builder );\n\n\t\tconst a = this.aNode;\n\t\tconst b = this.bNode;\n\t\tconst c = this.cNode;\n\n\t\tconst coordinateSystem = builder.renderer.coordinateSystem;\n\n\t\tif ( method === MathNode.NEGATE ) {\n\n\t\t\treturn builder.format( '( - ' + a.build( builder, inputType ) + ' )', type, output );\n\n\t\t} else {\n\n\t\t\tconst params = [];\n\n\t\t\tif ( method === MathNode.CROSS ) {\n\n\t\t\t\tparams.push(\n\t\t\t\t\ta.build( builder, type ),\n\t\t\t\t\tb.build( builder, type )\n\t\t\t\t);\n\n\t\t\t} else if ( coordinateSystem === WebGLCoordinateSystem && method === MathNode.STEP ) {\n\n\t\t\t\tparams.push(\n\t\t\t\t\ta.build( builder, builder.getTypeLength( a.getNodeType( builder ) ) === 1 ? 'float' : inputType ),\n\t\t\t\t\tb.build( builder, inputType )\n\t\t\t\t);\n\n\t\t\t} else if ( coordinateSystem === WebGLCoordinateSystem && ( method === MathNode.MIN || method === MathNode.MAX ) ) {\n\n\t\t\t\tparams.push(\n\t\t\t\t\ta.build( builder, inputType ),\n\t\t\t\t\tb.build( builder, builder.getTypeLength( b.getNodeType( builder ) ) === 1 ? 'float' : inputType )\n\t\t\t\t);\n\n\t\t\t} else if ( method === MathNode.REFRACT ) {\n\n\t\t\t\tparams.push(\n\t\t\t\t\ta.build( builder, inputType ),\n\t\t\t\t\tb.build( builder, inputType ),\n\t\t\t\t\tc.build( builder, 'float' )\n\t\t\t\t);\n\n\t\t\t} else if ( method === MathNode.MIX ) {\n\n\t\t\t\tparams.push(\n\t\t\t\t\ta.build( builder, inputType ),\n\t\t\t\t\tb.build( builder, inputType ),\n\t\t\t\t\tc.build( builder, builder.getTypeLength( c.getNodeType( builder ) ) === 1 ? 'float' : inputType )\n\t\t\t\t);\n\n\t\t\t} else {\n\n\t\t\t\tif ( coordinateSystem === WebGPUCoordinateSystem && method === MathNode.ATAN && b !== null ) {\n\n\t\t\t\t\tmethod = 'atan2';\n\n\t\t\t\t}\n\n\t\t\t\tif ( builder.shaderStage !== 'fragment' && ( method === MathNode.DFDX || method === MathNode.DFDY ) ) {\n\n\t\t\t\t\twarn( `TSL: '${ method }' is not supported in the ${ builder.shaderStage } stage.` );\n\n\t\t\t\t\tmethod = '/*' + method + '*/';\n\n\t\t\t\t}\n\n\t\t\t\tparams.push( a.build( builder, inputType ) );\n\t\t\t\tif ( b !== null ) params.push( b.build( builder, inputType ) );\n\t\t\t\tif ( c !== null ) params.push( c.build( builder, inputType ) );\n\n\t\t\t}\n\n\t\t\treturn builder.format( `${ builder.getMethod( method, type ) }( ${params.join( ', ' )} )`, type, output );\n\n\t\t}\n\n\t}\n\n\tserialize( data ) {\n\n\t\tsuper.serialize( data );\n\n\t\tdata.method = this.method;\n\n\t}\n\n\tdeserialize( data ) {\n\n\t\tsuper.deserialize( data );\n\n\t\tthis.method = data.method;\n\n\t}\n\n}\n\n// 1 input\n\nMathNode.ALL = 'all';\nMathNode.ANY = 'any';\n\nMathNode.RADIANS = 'radians';\nMathNode.DEGREES = 'degrees';\nMathNode.EXP = 'exp';\nMathNode.EXP2 = 'exp2';\nMathNode.LOG = 'log';\nMathNode.LOG2 = 'log2';\nMathNode.SQRT = 'sqrt';\nMathNode.INVERSE_SQRT = 'inversesqrt';\nMathNode.FLOOR = 'floor';\nMathNode.CEIL = 'ceil';\nMathNode.NORMALIZE = 'normalize';\nMathNode.FRACT = 'fract';\nMathNode.SIN = 'sin';\nMathNode.COS = 'cos';\nMathNode.TAN = 'tan';\nMathNode.ASIN = 'asin';\nMathNode.ACOS = 'acos';\nMathNode.ATAN = 'atan';\nMathNode.ABS = 'abs';\nMathNode.SIGN = 'sign';\nMathNode.LENGTH = 'length';\nMathNode.NEGATE = 'negate';\nMathNode.ONE_MINUS = 'oneMinus';\nMathNode.DFDX = 'dFdx';\nMathNode.DFDY = 'dFdy';\nMathNode.ROUND = 'round';\nMathNode.RECIPROCAL = 'reciprocal';\nMathNode.TRUNC = 'trunc';\nMathNode.FWIDTH = 'fwidth';\nMathNode.TRANSPOSE = 'transpose';\nMathNode.DETERMINANT = 'determinant';\nMathNode.INVERSE = 'inverse';\n\n// 2 inputs\n\nMathNode.EQUALS = 'equals';\nMathNode.MIN = 'min';\nMathNode.MAX = 'max';\nMathNode.STEP = 'step';\nMathNode.REFLECT = 'reflect';\nMathNode.DISTANCE = 'distance';\nMathNode.DIFFERENCE = 'difference';\nMathNode.DOT = 'dot';\nMathNode.CROSS = 'cross';\nMathNode.POW = 'pow';\nMathNode.TRANSFORM_DIRECTION = 'transformDirection';\n\n// 3 inputs\n\nMathNode.MIX = 'mix';\nMathNode.CLAMP = 'clamp';\nMathNode.REFRACT = 'refract';\nMathNode.SMOOTHSTEP = 'smoothstep';\nMathNode.FACEFORWARD = 'faceforward';\n\n// 1 inputs\n\n/**\n * A small value used to handle floating-point precision errors.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst EPSILON = /*@__PURE__*/ float( 1e-6 );\n\n/**\n * Represents infinity.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst INFINITY = /*@__PURE__*/ float( 1e6 );\n\n/**\n * Represents PI.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst PI = /*@__PURE__*/ float( Math.PI );\n\n/**\n * Represents PI * 2. Please use the non-deprecated version `TWO_PI`.\n *\n * @tsl\n * @deprecated\n * @type {Node<float>}\n */\nconst PI2 = /*@__PURE__*/ float( Math.PI * 2 ); // @deprecated r181\n\n/**\n * Represents PI * 2.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst TWO_PI = /*@__PURE__*/ float( Math.PI * 2 );\n\n/**\n * Represents PI / 2.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst HALF_PI = /*@__PURE__*/ float( Math.PI * 0.5 );\n\n/**\n * Returns `true` if all components of `x` are `true`.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The parameter.\n * @returns {Node<bool>}\n */\nconst all = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.ALL ).setParameterLength( 1 );\n\n/**\n * Returns `true` if any components of `x` are `true`.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The parameter.\n * @returns {Node<bool>}\n */\nconst any = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.ANY ).setParameterLength( 1 );\n\n/**\n * Converts a quantity in degrees to radians.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The input in degrees.\n * @returns {Node}\n */\nconst radians = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.RADIANS ).setParameterLength( 1 );\n\n/**\n * Convert a quantity in radians to degrees.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The input in radians.\n * @returns {Node}\n */\nconst degrees = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.DEGREES ).setParameterLength( 1 );\n\n/**\n * Returns the natural exponentiation of the parameter.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The parameter.\n * @returns {Node}\n */\nconst exp = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.EXP ).setParameterLength( 1 );\n\n/**\n * Returns 2 raised to the power of the parameter.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The parameter.\n * @returns {Node}\n */\nconst exp2 = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.EXP2 ).setParameterLength( 1 );\n\n/**\n * Returns the natural logarithm of the parameter.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The parameter.\n * @returns {Node}\n */\nconst log = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.LOG ).setParameterLength( 1 );\n\n/**\n * Returns the base 2 logarithm of the parameter.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The parameter.\n * @returns {Node}\n */\nconst log2 = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.LOG2 ).setParameterLength( 1 );\n\n/**\n * Returns the square root of the parameter.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The parameter.\n * @returns {Node}\n */\nconst sqrt = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.SQRT ).setParameterLength( 1 );\n\n/**\n * Returns the inverse of the square root of the parameter.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The parameter.\n * @returns {Node}\n */\nconst inverseSqrt = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.INVERSE_SQRT ).setParameterLength( 1 );\n\n/**\n * Finds the nearest integer less than or equal to the parameter.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The parameter.\n * @returns {Node}\n */\nconst floor = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.FLOOR ).setParameterLength( 1 );\n\n/**\n * Finds the nearest integer that is greater than or equal to the parameter.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The parameter.\n * @returns {Node}\n */\nconst ceil = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.CEIL ).setParameterLength( 1 );\n\n/**\n * Calculates the unit vector in the same direction as the original vector.\n *\n * @tsl\n * @function\n * @param {Node} x - The input vector.\n * @returns {Node}\n */\nconst normalize = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.NORMALIZE ).setParameterLength( 1 );\n\n/**\n * Computes the fractional part of the parameter.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The parameter.\n * @returns {Node}\n */\nconst fract = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.FRACT ).setParameterLength( 1 );\n\n/**\n * Returns the sine of the parameter.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The parameter.\n * @returns {Node}\n */\nconst sin = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.SIN ).setParameterLength( 1 );\n\n/**\n * Returns the cosine of the parameter.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The parameter.\n * @returns {Node}\n */\nconst cos = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.COS ).setParameterLength( 1 );\n\n/**\n * Returns the tangent of the parameter.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The parameter.\n * @returns {Node}\n */\nconst tan = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.TAN ).setParameterLength( 1 );\n\n/**\n * Returns the arcsine of the parameter.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The parameter.\n * @returns {Node}\n */\nconst asin = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.ASIN ).setParameterLength( 1 );\n\n/**\n * Returns the arccosine of the parameter.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The parameter.\n * @returns {Node}\n */\nconst acos = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.ACOS ).setParameterLength( 1 );\n\n/**\n * Returns the arc-tangent of the parameter.\n * If two parameters are provided, the result is `atan2(y/x)`.\n *\n * @tsl\n * @function\n * @param {Node | number} y - The y parameter.\n * @param {?(Node | number)} x - The x parameter.\n * @returns {Node}\n */\nconst atan = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.ATAN ).setParameterLength( 1, 2 );\n\n/**\n * Returns the absolute value of the parameter.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The parameter.\n * @returns {Node}\n */\nconst abs = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.ABS ).setParameterLength( 1 );\n\n/**\n * Extracts the sign of the parameter.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The parameter.\n * @returns {Node}\n */\nconst sign = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.SIGN ).setParameterLength( 1 );\n\n/**\n * Calculates the length of a vector.\n *\n * @tsl\n * @function\n * @param {Node} x - The parameter.\n * @returns {Node<float>}\n */\nconst length = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.LENGTH ).setParameterLength( 1 );\n\n/**\n * Negates the value of the parameter (-x).\n *\n * @tsl\n * @function\n * @param {Node | number} x - The parameter.\n * @returns {Node}\n */\nconst negate = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.NEGATE ).setParameterLength( 1 );\n\n/**\n * Return `1` minus the parameter.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The parameter.\n * @returns {Node}\n */\nconst oneMinus = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.ONE_MINUS ).setParameterLength( 1 );\n\n/**\n * Returns the partial derivative of the parameter with respect to x.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The parameter.\n * @returns {Node}\n */\nconst dFdx = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.DFDX ).setParameterLength( 1 );\n\n/**\n * Returns the partial derivative of the parameter with respect to y.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The parameter.\n * @returns {Node}\n */\nconst dFdy = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.DFDY ).setParameterLength( 1 );\n\n/**\n * Rounds the parameter to the nearest integer.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The parameter.\n * @returns {Node}\n */\nconst round = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.ROUND ).setParameterLength( 1 );\n\n/**\n * Returns the reciprocal of the parameter `(1/x)`.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The parameter.\n * @returns {Node}\n */\nconst reciprocal = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.RECIPROCAL ).setParameterLength( 1 );\n\n/**\n * Truncates the parameter, removing the fractional part.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The parameter.\n * @returns {Node}\n */\nconst trunc = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.TRUNC ).setParameterLength( 1 );\n\n/**\n * Returns the sum of the absolute derivatives in x and y.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The parameter.\n * @returns {Node}\n */\nconst fwidth = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.FWIDTH ).setParameterLength( 1 );\n\n/**\n * Returns the transpose of a matrix.\n *\n * @tsl\n * @function\n * @param {Node<mat2|mat3|mat4>} x - The parameter.\n * @returns {Node}\n */\nconst transpose = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.TRANSPOSE ).setParameterLength( 1 );\n\n/**\n * Returns the determinant of a matrix.\n *\n * @tsl\n * @function\n * @param {Node<mat2|mat3|mat4>} x - The parameter.\n * @returns {Node<float>}\n */\nconst determinant = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.DETERMINANT ).setParameterLength( 1 );\n\n/**\n * Returns the inverse of a matrix.\n *\n * @tsl\n * @function\n * @param {Node<mat2|mat3|mat4>} x - The parameter.\n * @returns {Node<mat2|mat3|mat4>}\n */\nconst inverse = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.INVERSE ).setParameterLength( 1 );\n\n// 2 inputs\n\n/**\n * Returns `true` if `x` equals `y`.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The first parameter.\n * @param {Node | number} y - The second parameter.\n * @deprecated since r175. Use {@link equal} instead.\n * @returns {Node<bool>}\n */\nconst equals = ( x, y ) => { // @deprecated, r172\n\n\twarn( 'TSL: \"equals\" is deprecated. Use \"equal\" inside a vector instead, like: \"bvec*( equal( ... ) )\"' );\n\treturn equal( x, y );\n\n};\n\n/**\n * Returns the least of the given values.\n *\n * @tsl\n * @function\n * @param {...(Node | number)} values - The values to compare.\n * @returns {Node}\n */\nconst min$1 = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.MIN ).setParameterLength( 2, Infinity );\n\n/**\n * Returns the greatest of the given values.\n *\n * @tsl\n * @function\n * @param {...(Node | number)} values - The values to compare.\n * @returns {Node}\n */\nconst max$1 = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.MAX ).setParameterLength( 2, Infinity );\n\n/**\n * Generate a step function by comparing two values.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The y parameter.\n * @param {Node | number} y - The x parameter.\n * @returns {Node}\n */\nconst step = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.STEP ).setParameterLength( 2 );\n\n/**\n * Calculates the reflection direction for an incident vector.\n *\n * @tsl\n * @function\n * @param {Node<vec2|vec3|vec4>} I - The incident vector.\n * @param {Node<vec2|vec3|vec4>} N - The normal vector.\n * @returns {Node<vec2|vec3|vec4>}\n */\nconst reflect = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.REFLECT ).setParameterLength( 2 );\n\n/**\n * Calculates the distance between two points.\n *\n * @tsl\n * @function\n * @param {Node<vec2|vec3|vec4>} x - The first point.\n * @param {Node<vec2|vec3|vec4>} y - The second point.\n * @returns {Node<float>}\n */\nconst distance = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.DISTANCE ).setParameterLength( 2 );\n\n/**\n * Calculates the absolute difference between two values.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The first parameter.\n * @param {Node | number} y - The second parameter.\n * @returns {Node}\n */\nconst difference = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.DIFFERENCE ).setParameterLength( 2 );\n\n/**\n * Calculates the dot product of two vectors.\n *\n * @tsl\n * @function\n * @param {Node<vec2|vec3|vec4>} x - The first vector.\n * @param {Node<vec2|vec3|vec4>} y - The second vector.\n * @returns {Node<float>}\n */\nconst dot = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.DOT ).setParameterLength( 2 );\n\n/**\n * Calculates the cross product of two vectors.\n *\n * @tsl\n * @function\n * @param {Node<vec2|vec3>} x - The first vector.\n * @param {Node<vec2|vec3>} y - The second vector.\n * @returns {Node<float|vec3>}\n */\nconst cross = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.CROSS ).setParameterLength( 2 );\n\n/**\n * Return the value of the first parameter raised to the power of the second one.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The first parameter.\n * @param {Node | number} y - The second parameter.\n * @returns {Node}\n */\nconst pow = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.POW ).setParameterLength( 2 );\n\n/**\n * Returns the square of the parameter.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The first parameter.\n * @returns {Node}\n */\nconst pow2 = ( x ) => mul( x, x );\n\n/**\n * Returns the cube of the parameter.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The first parameter.\n * @returns {Node}\n */\nconst pow3 = ( x ) => mul( x, x, x );\n\n/**\n * Returns the fourth power of the parameter.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The first parameter.\n * @returns {Node}\n */\nconst pow4 = ( x ) => mul( x, x, x, x );\n\n/**\n * Transforms the direction of a vector by a matrix and then normalizes the result.\n *\n * @tsl\n * @function\n * @param {Node<vec2|vec3|vec4>} direction - The direction vector.\n * @param {Node<mat2|mat3|mat4>} matrix - The transformation matrix.\n * @returns {Node}\n */\nconst transformDirection = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.TRANSFORM_DIRECTION ).setParameterLength( 2 );\n\n/**\n * Returns the cube root of a number.\n *\n * @tsl\n * @function\n * @param {Node | number} a - The first parameter.\n * @returns {Node}\n */\nconst cbrt = ( a ) => mul( sign( a ), pow( abs( a ), 1.0 / 3.0 ) );\n\n/**\n * Calculate the squared length of a vector.\n *\n * @tsl\n * @function\n * @param {Node<vec2|vec3|vec4>} a - The vector.\n * @returns {Node<float>}\n */\nconst lengthSq = ( a ) => dot( a, a );\n\n/**\n * Linearly interpolates between two values.\n *\n * @tsl\n * @function\n * @param {Node | number} a - The first parameter.\n * @param {Node | number} b - The second parameter.\n * @param {Node | number} t - The interpolation value.\n * @returns {Node}\n */\nconst mix = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.MIX ).setParameterLength( 3 );\n\n/**\n * Constrains a value to lie between two further values.\n *\n * @tsl\n * @function\n * @param {Node | number} value - The value to constrain.\n * @param {Node | number} [low=0] - The lower bound.\n * @param {Node | number} [high=1] - The upper bound.\n * @returns {Node}\n */\nconst clamp = ( value, low = 0, high = 1 ) => nodeObject( new MathNode( MathNode.CLAMP, nodeObject( value ), nodeObject( low ), nodeObject( high ) ) );\n\n/**\n * Constrains a value between `0` and `1`.\n *\n * @tsl\n * @function\n * @param {Node | number} value - The value to constrain.\n * @returns {Node}\n */\nconst saturate = ( value ) => clamp( value );\n\n/**\n * Calculates the refraction direction for an incident vector.\n *\n * @tsl\n * @function\n * @param {Node<vec2|vec3|vec4>} I - The incident vector.\n * @param {Node<vec2|vec3|vec4>} N - The normal vector.\n * @param {Node<float>} eta - The ratio of indices of refraction.\n * @returns {Node<vec2|vec3|vec4>}\n */\nconst refract = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.REFRACT ).setParameterLength( 3 );\n\n/**\n * Performs a Hermite interpolation between two values.\n *\n * @tsl\n * @function\n * @param {Node | number} low - The value of the lower edge of the Hermite function.\n * @param {Node | number} high - The value of the upper edge of the Hermite function.\n * @param {Node | number} x - The source value for interpolation.\n * @returns {Node}\n */\nconst smoothstep = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.SMOOTHSTEP ).setParameterLength( 3 );\n\n/**\n * Returns a vector pointing in the same direction as another.\n *\n * @tsl\n * @function\n * @param {Node<vec2|vec3|vec4>} N - The vector to orient.\n * @param {Node<vec2|vec3|vec4>} I - The incident vector.\n * @param {Node<vec2|vec3|vec4>} Nref - The reference vector.\n * @returns {Node<vec2|vec3|vec4>}\n */\nconst faceForward = /*@__PURE__*/ nodeProxyIntent( MathNode, MathNode.FACEFORWARD ).setParameterLength( 3 );\n\n/**\n * Returns a random value for the given uv.\n *\n * @tsl\n * @function\n * @param {Node<vec2>} uv - The uv node.\n * @returns {Node<float>}\n */\nconst rand = /*@__PURE__*/ Fn( ( [ uv ] ) => {\n\n\tconst a = 12.9898, b = 78.233, c = 43758.5453;\n\tconst dt = dot( uv.xy, vec2( a, b ) ), sn = mod( dt, PI );\n\n\treturn fract( sin( sn ).mul( c ) );\n\n} );\n\n/**\n * Alias for `mix()` with a different parameter order.\n *\n * @tsl\n * @function\n * @param {Node | number} t - The interpolation value.\n * @param {Node | number} e1 - The first parameter.\n * @param {Node | number} e2 - The second parameter.\n * @returns {Node}\n */\nconst mixElement = ( t, e1, e2 ) => mix( e1, e2, t );\n\n/**\n * Alias for `smoothstep()` with a different parameter order.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The source value for interpolation.\n * @param {Node | number} low - The value of the lower edge of the Hermite function.\n * @param {Node | number} high - The value of the upper edge of the Hermite function.\n * @returns {Node}\n */\nconst smoothstepElement = ( x, low, high ) => smoothstep( low, high, x );\n\n/**\n * Alias for `step()` with a different parameter order.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The source value for interpolation.\n * @param {Node | number} edge - The edge value.\n * @returns {Node}\n */\nconst stepElement = ( x, edge ) => step( edge, x );\n\n/**\n * Returns the arc-tangent of the quotient of its parameters.\n *\n * @tsl\n * @function\n * @deprecated since r172. Use {@link atan} instead.\n *\n * @param {Node | number} y - The y parameter.\n * @param {Node | number} x - The x parameter.\n * @returns {Node}\n */\nconst atan2 = ( y, x ) => { // @deprecated, r172\n\n\twarn( 'TSL: \"atan2\" is overloaded. Use \"atan\" instead.' );\n\treturn atan( y, x );\n\n};\n\n// GLSL alias function\n\nconst faceforward = faceForward;\nconst inversesqrt = inverseSqrt;\n\n// Method chaining\n\naddMethodChaining( 'all', all );\naddMethodChaining( 'any', any );\naddMethodChaining( 'equals', equals );\n\naddMethodChaining( 'radians', radians );\naddMethodChaining( 'degrees', degrees );\naddMethodChaining( 'exp', exp );\naddMethodChaining( 'exp2', exp2 );\naddMethodChaining( 'log', log );\naddMethodChaining( 'log2', log2 );\naddMethodChaining( 'sqrt', sqrt );\naddMethodChaining( 'inverseSqrt', inverseSqrt );\naddMethodChaining( 'floor', floor );\naddMethodChaining( 'ceil', ceil );\naddMethodChaining( 'normalize', normalize );\naddMethodChaining( 'fract', fract );\naddMethodChaining( 'sin', sin );\naddMethodChaining( 'cos', cos );\naddMethodChaining( 'tan', tan );\naddMethodChaining( 'asin', asin );\naddMethodChaining( 'acos', acos );\naddMethodChaining( 'atan', atan );\naddMethodChaining( 'abs', abs );\naddMethodChaining( 'sign', sign );\naddMethodChaining( 'length', length );\naddMethodChaining( 'lengthSq', lengthSq );\naddMethodChaining( 'negate', negate );\naddMethodChaining( 'oneMinus', oneMinus );\naddMethodChaining( 'dFdx', dFdx );\naddMethodChaining( 'dFdy', dFdy );\naddMethodChaining( 'round', round );\naddMethodChaining( 'reciprocal', reciprocal );\naddMethodChaining( 'trunc', trunc );\naddMethodChaining( 'fwidth', fwidth );\naddMethodChaining( 'atan2', atan2 );\naddMethodChaining( 'min', min$1 );\naddMethodChaining( 'max', max$1 );\naddMethodChaining( 'step', stepElement );\naddMethodChaining( 'reflect', reflect );\naddMethodChaining( 'distance', distance );\naddMethodChaining( 'dot', dot );\naddMethodChaining( 'cross', cross );\naddMethodChaining( 'pow', pow );\naddMethodChaining( 'pow2', pow2 );\naddMethodChaining( 'pow3', pow3 );\naddMethodChaining( 'pow4', pow4 );\naddMethodChaining( 'transformDirection', transformDirection );\naddMethodChaining( 'mix', mixElement );\naddMethodChaining( 'clamp', clamp );\naddMethodChaining( 'refract', refract );\naddMethodChaining( 'smoothstep', smoothstepElement );\naddMethodChaining( 'faceForward', faceForward );\naddMethodChaining( 'difference', difference );\naddMethodChaining( 'saturate', saturate );\naddMethodChaining( 'cbrt', cbrt );\naddMethodChaining( 'transpose', transpose );\naddMethodChaining( 'determinant', determinant );\naddMethodChaining( 'inverse', inverse );\naddMethodChaining( 'rand', rand );\n\n/**\n * Represents a logical `if/else` statement. Can be used as an alternative\n * to the `If()`/`Else()` syntax.\n *\n * The corresponding TSL `select()` looks like so:\n * ```js\n * velocity = position.greaterThanEqual( limit ).select( velocity.negate(), velocity );\n * ```\n * The `select()` method is called in a chaining fashion on a condition. The parameter nodes of `select()`\n * determine the outcome of the entire statement.\n *\n * @augments Node\n */\nclass ConditionalNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'ConditionalNode';\n\n\t}\n\n\t/**\n\t * Constructs a new conditional node.\n\t *\n\t * @param {Node} condNode - The node that defines the condition.\n\t * @param {Node} ifNode - The node that is evaluate when the condition ends up `true`.\n\t * @param {?Node} [elseNode=null] - The node that is evaluate when the condition ends up `false`.\n\t */\n\tconstructor( condNode, ifNode, elseNode = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The node that defines the condition.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.condNode = condNode;\n\n\t\t/**\n\t\t * The node that is evaluate when the condition ends up `true`.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.ifNode = ifNode;\n\n\t\t/**\n\t\t * The node that is evaluate when the condition ends up `false`.\n\t\t *\n\t\t * @type {?Node}\n\t\t * @default null\n\t\t */\n\t\tthis.elseNode = elseNode;\n\n\t}\n\n\t/**\n\t * This method is overwritten since the node type is inferred from the if/else\n\t * nodes.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The node type.\n\t */\n\tgetNodeType( builder ) {\n\n\t\tconst { ifNode, elseNode } = builder.getNodeProperties( this );\n\n\t\tif ( ifNode === undefined ) {\n\n\t\t\t// fallback setup\n\n\t\t\tbuilder.flowBuildStage( this, 'setup' );\n\n\t\t\treturn this.getNodeType( builder );\n\n\t\t}\n\n\t\tconst ifType = ifNode.getNodeType( builder );\n\n\t\tif ( elseNode !== null ) {\n\n\t\t\tconst elseType = elseNode.getNodeType( builder );\n\n\t\t\tif ( builder.getTypeLength( elseType ) > builder.getTypeLength( ifType ) ) {\n\n\t\t\t\treturn elseType;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn ifType;\n\n\t}\n\n\tsetup( builder ) {\n\n\t\tconst condNode = this.condNode;\n\t\tconst ifNode = this.ifNode.isolate();\n\t\tconst elseNode = this.elseNode ? this.elseNode.isolate() : null;\n\n\t\t//\n\n\t\tconst currentNodeBlock = builder.context.nodeBlock;\n\n\t\tbuilder.getDataFromNode( ifNode ).parentNodeBlock = currentNodeBlock;\n\t\tif ( elseNode !== null ) builder.getDataFromNode( elseNode ).parentNodeBlock = currentNodeBlock;\n\n\t\t//\n\n\t\tconst isUniformFlow = builder.context.uniformFlow;\n\n\t\tconst properties = builder.getNodeProperties( this );\n\t\tproperties.condNode = condNode;\n\t\tproperties.ifNode = isUniformFlow ? ifNode : ifNode.context( { nodeBlock: ifNode } );\n\t\tproperties.elseNode = elseNode ? ( isUniformFlow ? elseNode : elseNode.context( { nodeBlock: elseNode } ) ) : null;\n\n\t}\n\n\tgenerate( builder, output ) {\n\n\t\tconst type = this.getNodeType( builder );\n\n\t\tconst nodeData = builder.getDataFromNode( this );\n\n\t\tif ( nodeData.nodeProperty !== undefined ) {\n\n\t\t\treturn nodeData.nodeProperty;\n\n\t\t}\n\n\t\tconst { condNode, ifNode, elseNode } = builder.getNodeProperties( this );\n\n\t\tconst functionNode = builder.currentFunctionNode;\n\t\tconst needsOutput = output !== 'void';\n\t\tconst nodeProperty = needsOutput ? property( type ).build( builder ) : '';\n\n\t\tnodeData.nodeProperty = nodeProperty;\n\n\t\tconst nodeSnippet = condNode.build( builder, 'bool' );\n\t\tconst isUniformFlow = builder.context.uniformFlow;\n\n\t\tif ( isUniformFlow && elseNode !== null ) {\n\n\t\t\tconst ifSnippet = ifNode.build( builder, type );\n\t\t\tconst elseSnippet = elseNode.build( builder, type );\n\n\t\t\tconst mathSnippet = builder.getTernary( nodeSnippet, ifSnippet, elseSnippet );\n\n\t\t\t// TODO: If node property already exists return something else\n\n\t\t\treturn builder.format( mathSnippet, type, output );\n\n\t\t}\n\n\t\tbuilder.addFlowCode( `\\n${ builder.tab }if ( ${ nodeSnippet } ) {\\n\\n` ).addFlowTab();\n\n\t\tlet ifSnippet = ifNode.build( builder, type );\n\n\t\tif ( ifSnippet ) {\n\n\t\t\tif ( needsOutput ) {\n\n\t\t\t\tifSnippet = nodeProperty + ' = ' + ifSnippet + ';';\n\n\t\t\t} else {\n\n\t\t\t\tifSnippet = 'return ' + ifSnippet + ';';\n\n\t\t\t\tif ( functionNode === null ) {\n\n\t\t\t\t\twarn( 'TSL: Return statement used in an inline \\'Fn()\\'. Define a layout struct to allow return values.' );\n\n\t\t\t\t\tifSnippet = '// ' + ifSnippet;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tbuilder.removeFlowTab().addFlowCode( builder.tab + '\\t' + ifSnippet + '\\n\\n' + builder.tab + '}' );\n\n\t\tif ( elseNode !== null ) {\n\n\t\t\tbuilder.addFlowCode( ' else {\\n\\n' ).addFlowTab();\n\n\t\t\tlet elseSnippet = elseNode.build( builder, type );\n\n\t\t\tif ( elseSnippet ) {\n\n\t\t\t\tif ( needsOutput ) {\n\n\t\t\t\t\telseSnippet = nodeProperty + ' = ' + elseSnippet + ';';\n\n\t\t\t\t} else {\n\n\t\t\t\t\telseSnippet = 'return ' + elseSnippet + ';';\n\n\t\t\t\t\tif ( functionNode === null ) {\n\n\t\t\t\t\t\twarn( 'TSL: Return statement used in an inline \\'Fn()\\'. Define a layout struct to allow return values.' );\n\n\t\t\t\t\t\telseSnippet = '// ' + elseSnippet;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tbuilder.removeFlowTab().addFlowCode( builder.tab + '\\t' + elseSnippet + '\\n\\n' + builder.tab + '}\\n\\n' );\n\n\t\t} else {\n\n\t\t\tbuilder.addFlowCode( '\\n\\n' );\n\n\t\t}\n\n\t\treturn builder.format( nodeProperty, type, output );\n\n\t}\n\n}\n\n/**\n * TSL function for creating a conditional node.\n *\n * @tsl\n * @function\n * @param {Node} condNode - The node that defines the condition.\n * @param {Node} ifNode - The node that is evaluate when the condition ends up `true`.\n * @param {?Node} [elseNode=null] - The node that is evaluate when the condition ends up `false`.\n * @returns {ConditionalNode}\n */\nconst select = /*@__PURE__*/ nodeProxy( ConditionalNode ).setParameterLength( 2, 3 );\n\naddMethodChaining( 'select', select );\n\n/**\n * This node can be used as a context management component for another node.\n * {@link NodeBuilder} performs its node building process in a specific context and\n * this node allows the modify the context. A typical use case is to overwrite `getUV()` e.g.:\n *\n * ```js\n *node.context( { getUV: () => customCoord } );\n *\\// or\n *material.contextNode = context( { getUV: () => customCoord } );\n *\\// or\n *renderer.contextNode = context( { getUV: () => customCoord } );\n *\\// or\n *scenePass.contextNode = context( { getUV: () => customCoord } );\n *```\n * @augments Node\n */\nclass ContextNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'ContextNode';\n\n\t}\n\n\t/**\n\t * Constructs a new context node.\n\t *\n\t * @param {Node} node - The node whose context should be modified.\n\t * @param {Object} [value={}] - The modified context data.\n\t */\n\tconstructor( node = null, value = {} ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isContextNode = true;\n\n\t\t/**\n\t\t * The node whose context should be modified.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.node = node;\n\n\t\t/**\n\t\t * The modified context data.\n\t\t *\n\t\t * @type {Object}\n\t\t * @default {}\n\t\t */\n\t\tthis.value = value;\n\n\t}\n\n\t/**\n\t * This method is overwritten to ensure it returns the reference to {@link ContextNode#node}.\n\t *\n\t * @return {Node} A reference to {@link ContextNode#node}.\n\t */\n\tgetScope() {\n\n\t\treturn this.node.getScope();\n\n\t}\n\n\t/**\n\t * This method is overwritten to ensure it returns the type of {@link ContextNode#node}.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The node type.\n\t */\n\tgetNodeType( builder ) {\n\n\t\treturn this.node.getNodeType( builder );\n\n\t}\n\n\t/**\n\t * Gathers the context data from all parent context nodes.\n\t *\n\t * @return {Object} The gathered context data.\n\t */\n\tgetFlowContextData() {\n\n\t\tconst children = [];\n\n\t\tthis.traverse( ( node ) => {\n\n\t\t\tif ( node.isContextNode === true ) {\n\n\t\t\t\tchildren.push( node.value );\n\n\t\t\t}\n\n\t\t} );\n\n\t\treturn Object.assign( {}, ...children );\n\n\t}\n\n\t/**\n\t * This method is overwritten to ensure it returns the member type of {@link ContextNode#node}.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @param {string} name - The member name.\n\t * @returns {string} The member type.\n\t */\n\tgetMemberType( builder, name ) {\n\n\t\treturn this.node.getMemberType( builder, name );\n\n\t}\n\n\tanalyze( builder ) {\n\n\t\tconst previousContext = builder.addContext( this.value );\n\n\t\tthis.node.build( builder );\n\n\t\tbuilder.setContext( previousContext );\n\n\t}\n\n\tsetup( builder ) {\n\n\t\tconst previousContext = builder.addContext( this.value );\n\n\t\tthis.node.build( builder );\n\n\t\tbuilder.setContext( previousContext );\n\n\t}\n\n\tgenerate( builder, output ) {\n\n\t\tconst previousContext = builder.addContext( this.value );\n\n\t\tconst snippet = this.node.build( builder, output );\n\n\t\tbuilder.setContext( previousContext );\n\n\t\treturn snippet;\n\n\t}\n\n}\n\n/**\n * TSL function for creating a context node.\n *\n * @tsl\n * @function\n * @param {Node|Object} [nodeOrValue={}] - The node whose context should be modified or the modified context data.\n * @param {Object} [value={}] - The modified context data.\n * @returns {ContextNode}\n */\nconst context = ( nodeOrValue = null, value = {} ) => {\n\n\tlet node = nodeOrValue;\n\n\tif ( node === null || node.isNode !== true ) {\n\n\t\tvalue = node || value;\n\t\tnode = null;\n\n\t}\n\n\treturn new ContextNode( node, value );\n\n};\n\n/**\n * TSL function for defining a uniformFlow context value for a given node.\n *\n * @tsl\n * @function\n * @param {Node} node - The node whose dependencies should all execute within a uniform control-flow path.\n * @returns {ContextNode}\n */\nconst uniformFlow = ( node ) => context( node, { uniformFlow: true } );\n\n/**\n * TSL function for defining a name for the context value for a given node.\n *\n * @tsl\n * @function\n * @param {Node} node - The node whose context should be modified.\n * @param {string} name - The name to set.\n * @returns {ContextNode}\n */\nconst setName = ( node, name ) => context( node, { nodeName: name } );\n\n/**\n * TSL function for defining a built-in shadow context for a given node.\n *\n * @tsl\n * @function\n * @param {ShadowNode} shadowNode - The shadow node representing the light's shadow.\n * @param {Light} light - The light associated with the shadow.\n * @param {Node} [node=null] - The node whose context should be modified.\n * @returns {ContextNode}\n */\nfunction builtinShadowContext( shadowNode, light, node = null ) {\n\n\treturn context( node, {\n\n\t\tgetShadow: ( { light: shadowLight, shadowColorNode } ) => {\n\n\t\t\tif ( light === shadowLight ) {\n\n\t\t\t\treturn shadowColorNode.mul( shadowNode );\n\n\t\t\t}\n\n\t\t\treturn shadowColorNode;\n\n\t\t}\n\n\t} );\n\n}\n\n/**\n * TSL function for defining a built-in ambient occlusion context for a given node.\n *\n * @tsl\n * @function\n * @param {Node} aoNode - The ambient occlusion value node to apply.\n * @param {Node} [node=null] - The node whose context should be modified.\n * @returns {ContextNode}\n */\nfunction builtinAOContext( aoNode, node = null ) {\n\n\treturn context( node, {\n\n\t\tgetAO: ( inputNode, { material } ) => {\n\n\t\t\tif ( material.transparent === true ) return inputNode;\n\n\t\t\treturn inputNode !== null ? inputNode.mul( aoNode ) : aoNode;\n\n\t\t}\n\n\t} );\n\n}\n\n/**\n * TSL function for defining a label context value for a given node.\n *\n * @tsl\n * @function\n * @deprecated\n * @param {Node} node - The node whose context should be modified.\n * @param {string} name - The name/label to set.\n * @returns {ContextNode}\n */\nfunction label( node, name ) {\n\n\twarn( 'TSL: \"label()\" has been deprecated. Use \"setName()\" instead.' ); // @deprecated r179\n\n\treturn setName( node, name );\n\n}\n\naddMethodChaining( 'context', context );\naddMethodChaining( 'label', label );\naddMethodChaining( 'uniformFlow', uniformFlow );\naddMethodChaining( 'setName', setName );\naddMethodChaining( 'builtinShadowContext', ( node, shadowNode, light ) => builtinShadowContext( shadowNode, light, node ) );\naddMethodChaining( 'builtinAOContext', ( node, aoValue ) => builtinAOContext( aoValue, node ) );\n\n/**\n * Class for representing shader variables as nodes. Variables are created from\n * existing nodes like the following:\n *\n * ```js\n * const depth = sampleDepth( uvNode ).toVar( 'depth' );\n * ```\n *\n * @augments Node\n */\nclass VarNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'VarNode';\n\n\t}\n\n\t/**\n\t * Constructs a new variable node.\n\t *\n\t * @param {Node} node - The node for which a variable should be created.\n\t * @param {?string} [name=null] - The name of the variable in the shader.\n\t * @param {boolean} [readOnly=false] - The read-only flag.\n\t */\n\tconstructor( node, name = null, readOnly = false ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The node for which a variable should be created.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.node = node;\n\n\t\t/**\n\t\t * The name of the variable in the shader. If no name is defined,\n\t\t * the node system auto-generates one.\n\t\t *\n\t\t * @type {?string}\n\t\t * @default null\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * `VarNode` sets this property to `true` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.global = true;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isVarNode = true;\n\n\t\t/**\n\t\t *\n\t\t * The read-only flag.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.readOnly = readOnly;\n\n\t\t/**\n\t\t *\n\t\t * Add this flag to the node system to indicate that this node require parents.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.parents = true;\n\n\t\t/**\n\t\t * This flag is used to indicate that this node is used for intent.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.intent = false;\n\n\t}\n\n\t/**\n\t * Sets the intent flag for this node.\n\t *\n\t * This flag is used to indicate that this node is used for intent\n\t * and should not be built directly. Instead, it is used to indicate that\n\t * the node should be treated as a variable intent.\n\t *\n\t * It's useful for assigning variables without needing creating a new variable node.\n\t *\n\t * @param {boolean} value - The value to set for the intent flag.\n\t * @returns {VarNode} This node.\n\t */\n\tsetIntent( value ) {\n\n\t\tthis.intent = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Checks if this node is used for intent.\n\t *\n\t * @param {NodeBuilder} builder - The node builder.\n\t * @returns {boolean} Whether this node is used for intent.\n\t */\n\tisIntent( builder ) {\n\n\t\tconst data = builder.getDataFromNode( this );\n\n\t\tif ( data.forceDeclaration === true ) return false;\n\n\t\treturn this.intent;\n\n\t}\n\n\t/**\n\t * Returns the intent flag of this node.\n\t *\n\t * @return {boolean} The intent flag.\n\t */\n\tgetIntent() {\n\n\t\treturn this.intent;\n\n\t}\n\n\tgetMemberType( builder, name ) {\n\n\t\treturn this.node.getMemberType( builder, name );\n\n\t}\n\n\tgetElementType( builder ) {\n\n\t\treturn this.node.getElementType( builder );\n\n\t}\n\n\tgetNodeType( builder ) {\n\n\t\treturn this.node.getNodeType( builder );\n\n\t}\n\n\tgetArrayCount( builder ) {\n\n\t\treturn this.node.getArrayCount( builder );\n\n\t}\n\n\tisAssign( builder ) {\n\n\t\tconst data = builder.getDataFromNode( this );\n\n\t\treturn data.assign;\n\n\t}\n\n\tbuild( ...params ) {\n\n\t\tconst builder = params[ 0 ];\n\n\t\tif ( this._hasStack( builder ) === false && builder.buildStage === 'setup' ) {\n\n\t\t\tif ( builder.context.nodeLoop || builder.context.nodeBlock ) {\n\n\t\t\t\tlet addBefore = false;\n\n\t\t\t\tif ( this.node.isShaderCallNodeInternal && this.node.shaderNode.getLayout() === null ) {\n\n\t\t\t\t\tif ( builder.fnCall && builder.fnCall.shaderNode ) {\n\n\t\t\t\t\t\tconst shaderNodeData = builder.getDataFromNode( this.node.shaderNode );\n\n\t\t\t\t\t\tif ( shaderNodeData.hasLoop ) {\n\n\t\t\t\t\t\t\tconst data = builder.getDataFromNode( this );\n\t\t\t\t\t\t\tdata.forceDeclaration = true;\n\n\t\t\t\t\t\t\taddBefore = true;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst baseStack = builder.getBaseStack();\n\n\t\t\t\tif ( addBefore ) {\n\n\t\t\t\t\tbaseStack.addToStackBefore( this );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbaseStack.addToStack( this );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.isIntent( builder ) ) {\n\n\t\t\tif ( this.isAssign( builder ) !== true ) {\n\n\t\t\t\treturn this.node.build( ...params );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn super.build( ...params );\n\n\t}\n\n\tgenerate( builder ) {\n\n\t\tconst { node, name, readOnly } = this;\n\t\tconst { renderer } = builder;\n\n\t\tconst isWebGPUBackend = renderer.backend.isWebGPUBackend === true;\n\n\t\tlet isDeterministic = false;\n\t\tlet shouldTreatAsReadOnly = false;\n\n\t\tif ( readOnly ) {\n\n\t\t\tisDeterministic = builder.isDeterministic( node );\n\n\t\t\tshouldTreatAsReadOnly = isWebGPUBackend ? readOnly : isDeterministic;\n\n\t\t}\n\n\t\tconst nodeType = this.getNodeType( builder );\n\n\t\tif ( nodeType == 'void' ) {\n\n\t\t\tif ( this.isIntent( builder ) !== true ) {\n\n\t\t\t\terror( 'TSL: \".toVar()\" can not be used with void type.' );\n\n\t\t\t}\n\n\t\t\tconst snippet = node.build( builder );\n\n\t\t\treturn snippet;\n\n\t\t}\n\n\t\tconst vectorType = builder.getVectorType( nodeType );\n\t\tconst snippet = node.build( builder, vectorType );\n\n\t\tconst nodeVar = builder.getVarFromNode( this, name, vectorType, undefined, shouldTreatAsReadOnly );\n\n\t\tconst propertyName = builder.getPropertyName( nodeVar );\n\n\t\tlet declarationPrefix = propertyName;\n\n\t\tif ( shouldTreatAsReadOnly ) {\n\n\t\t\tif ( isWebGPUBackend ) {\n\n\t\t\t\tdeclarationPrefix = isDeterministic\n\t\t\t\t\t? `const ${ propertyName }`\n\t\t\t\t\t: `let ${ propertyName }`;\n\n\t\t\t} else {\n\n\t\t\t\tconst count = node.getArrayCount( builder );\n\n\t\t\t\tdeclarationPrefix = `const ${ builder.getVar( nodeVar.type, propertyName, count ) }`;\n\n\t\t\t}\n\n\t\t}\n\n\t\tbuilder.addLineFlowCode( `${ declarationPrefix } = ${ snippet }`, this );\n\n\t\treturn propertyName;\n\n\t}\n\n\t_hasStack( builder ) {\n\n\t\tconst nodeData = builder.getDataFromNode( this );\n\n\t\treturn nodeData.stack !== undefined;\n\n\t}\n\n}\n\n/**\n * TSL function for creating a var node.\n *\n * @tsl\n * @function\n * @param {Node} node - The node for which a variable should be created.\n * @param {?string} name - The name of the variable in the shader.\n * @returns {VarNode}\n */\nconst createVar = /*@__PURE__*/ nodeProxy( VarNode );\n\n/**\n * TSL function for creating a var node.\n *\n * @tsl\n * @function\n * @param {Node} node - The node for which a variable should be created.\n * @param {?string} name - The name of the variable in the shader.\n * @returns {VarNode}\n */\nconst Var = ( node, name = null ) => createVar( node, name ).toStack();\n\n/**\n * TSL function for creating a const node.\n *\n * @tsl\n * @function\n * @param {Node} node - The node for which a constant should be created.\n * @param {?string} name - The name of the constant in the shader.\n * @returns {VarNode}\n */\nconst Const = ( node, name = null ) => createVar( node, name, true ).toStack();\n\n//\n//\n\n/**\n * TSL function for creating a var intent node.\n *\n * @tsl\n * @function\n * @param {Node} node - The node for which a variable should be created.\n * @param {?string} name - The name of the variable in the shader.\n * @returns {VarNode}\n */\nconst VarIntent = ( node ) => {\n\n\treturn createVar( node ).setIntent( true ).toStack();\n\n};\n\n// Method chaining\n\naddMethodChaining( 'toVar', Var );\naddMethodChaining( 'toConst', Const );\naddMethodChaining( 'toVarIntent', VarIntent );\n\n/**\n * This node is used to build a sub-build in the node system.\n *\n * @augments Node\n * @param {Node} node - The node to be built in the sub-build.\n * @param {string} name - The name of the sub-build.\n * @param {?string} [nodeType=null] - The type of the node, if known.\n */\nclass SubBuildNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'SubBuild';\n\n\t}\n\n\tconstructor( node, name, nodeType = null ) {\n\n\t\tsuper( nodeType );\n\n\t\t/**\n\t\t * The node to be built in the sub-build.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.node = node;\n\n\t\t/**\n\t\t * The name of the sub-build.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSubBuildNode = true;\n\n\t}\n\n\tgetNodeType( builder ) {\n\n\t\tif ( this.nodeType !== null ) return this.nodeType;\n\n\t\tbuilder.addSubBuild( this.name );\n\n\t\tconst nodeType = this.node.getNodeType( builder );\n\n\t\tbuilder.removeSubBuild();\n\n\t\treturn nodeType;\n\n\t}\n\n\tbuild( builder, ...params ) {\n\n\t\tbuilder.addSubBuild( this.name );\n\n\t\tconst data = this.node.build( builder, ...params );\n\n\t\tbuilder.removeSubBuild();\n\n\t\treturn data;\n\n\t}\n\n}\n\n/**\n * Creates a new sub-build node.\n *\n * @tsl\n * @function\n * @param {Node} node - The node to be built in the sub-build.\n * @param {string} name - The name of the sub-build.\n * @param {?string} [type=null] - The type of the node, if known.\n * @returns {Node} A node object wrapping the SubBuildNode instance.\n */\nconst subBuild = ( node, name, type = null ) => nodeObject( new SubBuildNode( nodeObject( node ), name, type ) );\n\n/**\n * Class for representing shader varyings as nodes. Varyings are create from\n * existing nodes like the following:\n *\n * ```js\n * const positionLocal = positionGeometry.toVarying( 'vPositionLocal' );\n * ```\n *\n * @augments Node\n */\nclass VaryingNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'VaryingNode';\n\n\t}\n\n\t/**\n\t * Constructs a new varying node.\n\t *\n\t * @param {Node} node - The node for which a varying should be created.\n\t * @param {?string} name - The name of the varying in the shader.\n\t */\n\tconstructor( node, name = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The node for which a varying should be created.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.node = node;\n\n\t\t/**\n\t\t * The name of the varying in the shader. If no name is defined,\n\t\t * the node system auto-generates one.\n\t\t *\n\t\t * @type {?string}\n\t\t * @default null\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isVaryingNode = true;\n\n\t\t/**\n\t\t * The interpolation type of the varying data.\n\t\t *\n\t\t * @type {?string}\n\t\t * @default null\n\t\t */\n\t\tthis.interpolationType = null;\n\n\t\t/**\n\t\t * The interpolation sampling type of varying data.\n\t\t *\n\t\t * @type {?string}\n\t\t * @default null\n\t\t */\n\t\tthis.interpolationSampling = null;\n\n\t\t/**\n\t\t * This flag is used for global cache.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.global = true;\n\n\t}\n\n\t/**\n\t * Defines the interpolation type of the varying.\n\t *\n\t * @param {string} type - The interpolation type.\n\t * @param {?string} sampling - The interpolation sampling type\n\t * @return {VaryingNode} A reference to this node.\n\t */\n\tsetInterpolation( type, sampling = null ) {\n\n\t\tthis.interpolationType = type;\n\t\tthis.interpolationSampling = sampling;\n\n\t\treturn this;\n\n\t}\n\n\tgetHash( builder ) {\n\n\t\treturn this.name || super.getHash( builder );\n\n\t}\n\n\tgetNodeType( builder ) {\n\n\t\t// VaryingNode is auto type\n\n\t\treturn this.node.getNodeType( builder );\n\n\t}\n\n\t/**\n\t * This method performs the setup of a varying node with the current node builder.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {NodeVarying} The node varying from the node builder.\n\t */\n\tsetupVarying( builder ) {\n\n\t\tconst properties = builder.getNodeProperties( this );\n\n\t\tlet varying = properties.varying;\n\n\t\tif ( varying === undefined ) {\n\n\t\t\tconst name = this.name;\n\t\t\tconst type = this.getNodeType( builder );\n\t\t\tconst interpolationType = this.interpolationType;\n\t\t\tconst interpolationSampling = this.interpolationSampling;\n\n\t\t\tproperties.varying = varying = builder.getVaryingFromNode( this, name, type, interpolationType, interpolationSampling );\n\t\t\tproperties.node = subBuild( this.node, 'VERTEX' );\n\n\t\t}\n\n\t\t// this property can be used to check if the varying can be optimized for a variable\n\t\tvarying.needsInterpolation || ( varying.needsInterpolation = ( builder.shaderStage === 'fragment' ) );\n\n\t\treturn varying;\n\n\t}\n\n\tsetup( builder ) {\n\n\t\tthis.setupVarying( builder );\n\n\t\tbuilder.flowNodeFromShaderStage( NodeShaderStage.VERTEX, this.node );\n\n\t}\n\n\tanalyze( builder ) {\n\n\t\tthis.setupVarying( builder );\n\n\t\tbuilder.flowNodeFromShaderStage( NodeShaderStage.VERTEX, this.node );\n\n\t}\n\n\tgenerate( builder ) {\n\n\t\tconst propertyKey = builder.getSubBuildProperty( 'property', builder.currentStack );\n\t\tconst properties = builder.getNodeProperties( this );\n\t\tconst varying = this.setupVarying( builder );\n\n\t\tif ( properties[ propertyKey ] === undefined ) {\n\n\t\t\tconst type = this.getNodeType( builder );\n\t\t\tconst propertyName = builder.getPropertyName( varying, NodeShaderStage.VERTEX );\n\n\t\t\t// force node run in vertex stage\n\t\t\tbuilder.flowNodeFromShaderStage( NodeShaderStage.VERTEX, properties.node, type, propertyName );\n\n\t\t\tproperties[ propertyKey ] = propertyName;\n\n\t\t}\n\n\t\treturn builder.getPropertyName( varying );\n\n\t}\n\n}\n\n/**\n * TSL function for creating a varying node.\n *\n * @tsl\n * @function\n * @param {Node} node - The node for which a varying should be created.\n * @param {?string} name - The name of the varying in the shader.\n * @returns {VaryingNode}\n */\nconst varying = /*@__PURE__*/ nodeProxy( VaryingNode ).setParameterLength( 1, 2 );\n\n/**\n * Computes a node in the vertex stage.\n *\n * @tsl\n * @function\n * @param {Node} node - The node which should be executed in the vertex stage.\n * @returns {VaryingNode}\n */\nconst vertexStage = ( node ) => varying( node );\n\naddMethodChaining( 'toVarying', varying );\naddMethodChaining( 'toVertexStage', vertexStage );\n\n// Deprecated\n\naddMethodChaining( 'varying', ( ...params ) => { // @deprecated, r173\n\n\twarn( 'TSL: .varying() has been renamed to .toVarying().' );\n\treturn varying( ...params );\n\n} );\n\naddMethodChaining( 'vertexStage', ( ...params ) => { // @deprecated, r173\n\n\twarn( 'TSL: .vertexStage() has been renamed to .toVertexStage().' );\n\treturn varying( ...params );\n\n} );\n\n/**\n * Converts the given color value from sRGB to linear-sRGB color space.\n *\n * @tsl\n * @function\n * @param {Node<vec3>} color - The sRGB color.\n * @return {Node<vec3>} The linear-sRGB color.\n */\nconst sRGBTransferEOTF = /*@__PURE__*/ Fn( ( [ color ] ) => {\n\n\tconst a = color.mul( 0.9478672986 ).add( 0.0521327014 ).pow( 2.4 );\n\tconst b = color.mul( 0.0773993808 );\n\tconst factor = color.lessThanEqual( 0.04045 );\n\n\tconst rgbResult = mix( a, b, factor );\n\n\treturn rgbResult;\n\n} ).setLayout( {\n\tname: 'sRGBTransferEOTF',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'color', type: 'vec3' }\n\t]\n} );\n\n/**\n * Converts the given color value from linear-sRGB to sRGB color space.\n *\n * @tsl\n * @function\n * @param {Node<vec3>} color - The linear-sRGB color.\n * @return {Node<vec3>} The sRGB color.\n */\nconst sRGBTransferOETF = /*@__PURE__*/ Fn( ( [ color ] ) => {\n\n\tconst a = color.pow( 0.41666 ).mul( 1.055 ).sub( 0.055 );\n\tconst b = color.mul( 12.92 );\n\tconst factor = color.lessThanEqual( 0.0031308 );\n\n\tconst rgbResult = mix( a, b, factor );\n\n\treturn rgbResult;\n\n} ).setLayout( {\n\tname: 'sRGBTransferOETF',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'color', type: 'vec3' }\n\t]\n} );\n\nconst WORKING_COLOR_SPACE = 'WorkingColorSpace';\nconst OUTPUT_COLOR_SPACE = 'OutputColorSpace';\n\n/**\n * This node represents a color space conversion. Meaning it converts\n * a color value from a source to a target color space.\n *\n * @augments TempNode\n */\nclass ColorSpaceNode extends TempNode {\n\n\tstatic get type() {\n\n\t\treturn 'ColorSpaceNode';\n\n\t}\n\n\t/**\n\t * Constructs a new color space node.\n\t *\n\t * @param {Node} colorNode - Represents the color to convert.\n\t * @param {string} source - The source color space.\n\t * @param {string} target - The target color space.\n\t */\n\tconstructor( colorNode, source, target ) {\n\n\t\tsuper( 'vec4' );\n\n\t\t/**\n\t\t * Represents the color to convert.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.colorNode = colorNode;\n\n\t\t/**\n\t\t * The source color space.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.source = source;\n\n\t\t/**\n\t\t * The target color space.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.target = target;\n\n\t}\n\n\t/**\n\t * This method resolves the constants `WORKING_COLOR_SPACE` and\n\t * `OUTPUT_COLOR_SPACE` based on the current configuration of the\n\t * color management and renderer.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @param {string} colorSpace - The color space to resolve.\n\t * @return {string} The resolved color space.\n\t */\n\tresolveColorSpace( builder, colorSpace ) {\n\n\t\tif ( colorSpace === WORKING_COLOR_SPACE ) {\n\n\t\t\treturn ColorManagement.workingColorSpace;\n\n\t\t} else if ( colorSpace === OUTPUT_COLOR_SPACE ) {\n\n\t\t\treturn builder.context.outputColorSpace || builder.renderer.outputColorSpace;\n\n\t\t}\n\n\t\treturn colorSpace;\n\n\t}\n\n\tsetup( builder ) {\n\n\t\tconst { colorNode } = this;\n\n\t\tconst source = this.resolveColorSpace( builder, this.source );\n\t\tconst target = this.resolveColorSpace( builder, this.target );\n\n\t\tlet outputNode = colorNode;\n\n\t\tif ( ColorManagement.enabled === false || source === target || ! source || ! target ) {\n\n\t\t\treturn outputNode;\n\n\t\t}\n\n\t\tif ( ColorManagement.getTransfer( source ) === SRGBTransfer ) {\n\n\t\t\toutputNode = vec4( sRGBTransferEOTF( outputNode.rgb ), outputNode.a );\n\n\t\t}\n\n\t\tif ( ColorManagement.getPrimaries( source ) !== ColorManagement.getPrimaries( target ) ) {\n\n\t\t\toutputNode = vec4(\n\t\t\t\tmat3( ColorManagement._getMatrix( new Matrix3(), source, target ) ).mul( outputNode.rgb ),\n\t\t\t\toutputNode.a\n\t\t\t);\n\n\t\t}\n\n\t\tif ( ColorManagement.getTransfer( target ) === SRGBTransfer ) {\n\n\t\t\toutputNode = vec4( sRGBTransferOETF( outputNode.rgb ), outputNode.a );\n\n\t\t}\n\n\t\treturn outputNode;\n\n\t}\n\n}\n\n/**\n * TSL function for converting a given color node from the current working color space to the given color space.\n *\n * @tsl\n * @function\n * @param {Node} node - Represents the node to convert.\n * @param {string} targetColorSpace - The target color space.\n * @returns {ColorSpaceNode}\n */\nconst workingToColorSpace = ( node, targetColorSpace ) => nodeObject( new ColorSpaceNode( nodeObject( node ), WORKING_COLOR_SPACE, targetColorSpace ) );\n\n/**\n * TSL function for converting a given color node from the given color space to the current working color space.\n *\n * @tsl\n * @function\n * @param {Node} node - Represents the node to convert.\n * @param {string} sourceColorSpace - The source color space.\n * @returns {ColorSpaceNode}\n */\nconst colorSpaceToWorking = ( node, sourceColorSpace ) => nodeObject( new ColorSpaceNode( nodeObject( node ), sourceColorSpace, WORKING_COLOR_SPACE ) );\n\n/**\n * TSL function for converting a given color node from one color space to another one.\n *\n * @tsl\n * @function\n * @param {Node} node - Represents the node to convert.\n * @param {string} sourceColorSpace - The source color space.\n * @param {string} targetColorSpace - The target color space.\n * @returns {ColorSpaceNode}\n */\nconst convertColorSpace = ( node, sourceColorSpace, targetColorSpace ) => nodeObject( new ColorSpaceNode( nodeObject( node ), sourceColorSpace, targetColorSpace ) );\n\naddMethodChaining( 'workingToColorSpace', workingToColorSpace );\naddMethodChaining( 'colorSpaceToWorking', colorSpaceToWorking );\n\n// TODO: Avoid duplicated code and use only ReferenceBaseNode or ReferenceNode\n\n/**\n * This class is only relevant if the referenced property is array-like.\n * In this case, `ReferenceElementNode` allows to refer to a specific\n * element inside the data structure via an index.\n *\n * @augments ArrayElementNode\n */\nlet ReferenceElementNode$1 = class ReferenceElementNode extends ArrayElementNode {\n\n\tstatic get type() {\n\n\t\treturn 'ReferenceElementNode';\n\n\t}\n\n\t/**\n\t * Constructs a new reference element node.\n\t *\n\t * @param {ReferenceBaseNode} referenceNode - The reference node.\n\t * @param {Node} indexNode - The index node that defines the element access.\n\t */\n\tconstructor( referenceNode, indexNode ) {\n\n\t\tsuper( referenceNode, indexNode );\n\n\t\t/**\n\t\t * Similar to {@link ReferenceBaseNode#reference}, an additional\n\t\t * property references to the current node.\n\t\t *\n\t\t * @type {?ReferenceBaseNode}\n\t\t * @default null\n\t\t */\n\t\tthis.referenceNode = referenceNode;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isReferenceElementNode = true;\n\n\t}\n\n\t/**\n\t * This method is overwritten since the node type is inferred from\n\t * the uniform type of the reference node.\n\t *\n\t * @return {string} The node type.\n\t */\n\tgetNodeType() {\n\n\t\treturn this.referenceNode.uniformType;\n\n\t}\n\n\tgenerate( builder ) {\n\n\t\tconst snippet = super.generate( builder );\n\t\tconst arrayType = this.referenceNode.getNodeType();\n\t\tconst elementType = this.getNodeType();\n\n\t\treturn builder.format( snippet, arrayType, elementType );\n\n\t}\n\n};\n\n/**\n * Base class for nodes which establishes a reference to a property of another object.\n * In this way, the value of the node is automatically linked to the value of\n * referenced object. Reference nodes internally represent the linked value\n * as a uniform.\n *\n * @augments Node\n */\nclass ReferenceBaseNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'ReferenceBaseNode';\n\n\t}\n\n\t/**\n\t * Constructs a new reference base node.\n\t *\n\t * @param {string} property - The name of the property the node refers to.\n\t * @param {string} uniformType - The uniform type that should be used to represent the property value.\n\t * @param {?Object} [object=null] - The object the property belongs to.\n\t * @param {?number} [count=null] - When the linked property is an array-like, this parameter defines its length.\n\t */\n\tconstructor( property, uniformType, object = null, count = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The name of the property the node refers to.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.property = property;\n\n\t\t/**\n\t\t * The uniform type that should be used to represent the property value.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.uniformType = uniformType;\n\n\t\t/**\n\t\t * The object the property belongs to.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.object = object;\n\n\t\t/**\n\t\t * When the linked property is an array, this parameter defines its length.\n\t\t *\n\t\t * @type {?number}\n\t\t * @default null\n\t\t */\n\t\tthis.count = count;\n\n\t\t/**\n\t\t * The property name might have dots so nested properties can be referred.\n\t\t * The hierarchy of the names is stored inside this array.\n\t\t *\n\t\t * @type {Array<string>}\n\t\t */\n\t\tthis.properties = property.split( '.' );\n\n\t\t/**\n\t\t * Points to the current referred object. This property exists next to {@link ReferenceNode#object}\n\t\t * since the final reference might be updated from calling code.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.reference = object;\n\n\t\t/**\n\t\t * The uniform node that holds the value of the reference node.\n\t\t *\n\t\t * @type {UniformNode}\n\t\t * @default null\n\t\t */\n\t\tthis.node = null;\n\n\t\t/**\n\t\t * The uniform group of the internal uniform.\n\t\t *\n\t\t * @type {UniformGroupNode}\n\t\t * @default null\n\t\t */\n\t\tthis.group = null;\n\n\t\t/**\n\t\t * Overwritten since reference nodes are updated per object.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'object'\n\t\t */\n\t\tthis.updateType = NodeUpdateType.OBJECT;\n\n\t}\n\n\t/**\n\t * Sets the uniform group for this reference node.\n\t *\n\t * @param {UniformGroupNode} group - The uniform group to set.\n\t * @return {ReferenceBaseNode} A reference to this node.\n\t */\n\tsetGroup( group ) {\n\n\t\tthis.group = group;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * When the referred property is array-like, this method can be used\n\t * to access elements via an index node.\n\t *\n\t * @param {IndexNode} indexNode - indexNode.\n\t * @return {ReferenceElementNode} A reference to an element.\n\t */\n\telement( indexNode ) {\n\n\t\treturn new ReferenceElementNode$1( this, nodeObject( indexNode ) );\n\n\t}\n\n\t/**\n\t * Sets the node type which automatically defines the internal\n\t * uniform type.\n\t *\n\t * @param {string} uniformType - The type to set.\n\t */\n\tsetNodeType( uniformType ) {\n\n\t\tconst node = uniform( null, uniformType );\n\n\t\tif ( this.group !== null ) {\n\n\t\t\tnode.setGroup( this.group );\n\n\t\t}\n\n\t\tthis.node = node;\n\n\t}\n\n\t/**\n\t * This method is overwritten since the node type is inferred from\n\t * the type of the reference node.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The node type.\n\t */\n\tgetNodeType( builder ) {\n\n\t\tif ( this.node === null ) {\n\n\t\t\tthis.updateReference( builder );\n\t\t\tthis.updateValue();\n\n\t\t}\n\n\t\treturn this.node.getNodeType( builder );\n\n\t}\n\n\t/**\n\t * Returns the property value from the given referred object.\n\t *\n\t * @param {Object} [object=this.reference] - The object to retrieve the property value from.\n\t * @return {any} The value.\n\t */\n\tgetValueFromReference( object = this.reference ) {\n\n\t\tconst { properties } = this;\n\n\t\tlet value = object[ properties[ 0 ] ];\n\n\t\tfor ( let i = 1; i < properties.length; i ++ ) {\n\n\t\t\tvalue = value[ properties[ i ] ];\n\n\t\t}\n\n\t\treturn value;\n\n\t}\n\n\t/**\n\t * Allows to update the reference based on the given state. The state is only\n\t * evaluated {@link ReferenceBaseNode#object} is not set.\n\t *\n\t * @param {(NodeFrame|NodeBuilder)} state - The current state.\n\t * @return {Object} The updated reference.\n\t */\n\tupdateReference( state ) {\n\n\t\tthis.reference = this.object !== null ? this.object : state.object;\n\n\t\treturn this.reference;\n\n\t}\n\n\t/**\n\t * The output of the reference node is the internal uniform node.\n\t *\n\t * @return {UniformNode} The output node.\n\t */\n\tsetup() {\n\n\t\tthis.updateValue();\n\n\t\treturn this.node;\n\n\t}\n\n\t/**\n\t * Overwritten to update the internal uniform value.\n\t *\n\t * @param {NodeFrame} frame - A reference to the current node frame.\n\t */\n\tupdate( /*frame*/ ) {\n\n\t\tthis.updateValue();\n\n\t}\n\n\t/**\n\t * Retrieves the value from the referred object property and uses it\n\t * to updated the internal uniform.\n\t */\n\tupdateValue() {\n\n\t\tif ( this.node === null ) this.setNodeType( this.uniformType );\n\n\t\tconst value = this.getValueFromReference();\n\n\t\tif ( Array.isArray( value ) ) {\n\n\t\t\tthis.node.array = value;\n\n\t\t} else {\n\n\t\t\tthis.node.value = value;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * TSL function for creating a reference base node.\n *\n * @tsl\n * @function\n * @param {string} name - The name of the property the node refers to.\n * @param {string} type - The uniform type that should be used to represent the property value.\n * @param {Object} object - The object the property belongs to.\n * @returns {ReferenceBaseNode}\n */\nconst reference$1 = ( name, type, object ) => new ReferenceBaseNode( name, type, object );\n\n/**\n * This node is a special type of reference node which is intended\n * for linking renderer properties with node values.\n * ```js\n * const exposureNode = rendererReference( 'toneMappingExposure', 'float', renderer );\n * ```\n * When changing `renderer.toneMappingExposure`, the node value of `exposureNode` will\n * automatically be updated.\n *\n * @augments ReferenceBaseNode\n */\nclass RendererReferenceNode extends ReferenceBaseNode {\n\n\tstatic get type() {\n\n\t\treturn 'RendererReferenceNode';\n\n\t}\n\n\t/**\n\t * Constructs a new renderer reference node.\n\t *\n\t * @param {string} property - The name of the property the node refers to.\n\t * @param {string} inputType - The uniform type that should be used to represent the property value.\n\t * @param {?Renderer} [renderer=null] - The renderer the property belongs to. When no renderer is set,\n\t * the node refers to the renderer of the current state.\n\t */\n\tconstructor( property, inputType, renderer = null ) {\n\n\t\tsuper( property, inputType, renderer );\n\n\t\t/**\n\t\t * The renderer the property belongs to. When no renderer is set,\n\t\t * the node refers to the renderer of the current state.\n\t\t *\n\t\t * @type {?Renderer}\n\t\t * @default null\n\t\t */\n\t\tthis.renderer = renderer;\n\n\t\tthis.setGroup( renderGroup );\n\n\t}\n\n\t/**\n\t * Updates the reference based on the given state. The state is only evaluated\n\t * {@link RendererReferenceNode#renderer} is not set.\n\t *\n\t * @param {(NodeFrame|NodeBuilder)} state - The current state.\n\t * @return {Object} The updated reference.\n\t */\n\tupdateReference( state ) {\n\n\t\tthis.reference = this.renderer !== null ? this.renderer : state.renderer;\n\n\t\treturn this.reference;\n\n\t}\n\n}\n\n/**\n * TSL function for creating a renderer reference node.\n *\n * @tsl\n * @function\n * @param {string} name - The name of the property the node refers to.\n * @param {string} type - The uniform type that should be used to represent the property value.\n * @param {?Renderer} [renderer=null] - The renderer the property belongs to. When no renderer is set,\n * the node refers to the renderer of the current state.\n * @returns {RendererReferenceNode}\n */\nconst rendererReference = ( name, type, renderer = null ) => new RendererReferenceNode( name, type, renderer );\n\n/**\n * This node represents a tone mapping operation.\n *\n * @augments TempNode\n */\nclass ToneMappingNode extends TempNode {\n\n\tstatic get type() {\n\n\t\treturn 'ToneMappingNode';\n\n\t}\n\n\t/**\n\t * Constructs a new tone mapping node.\n\t *\n\t * @param {number} toneMapping - The tone mapping type.\n\t * @param {Node} exposureNode - The tone mapping exposure.\n\t * @param {Node} [colorNode=null] - The color node to process.\n\t */\n\tconstructor( toneMapping, exposureNode = toneMappingExposure, colorNode = null ) {\n\n\t\tsuper( 'vec3' );\n\n\t\t/**\n\t\t * The tone mapping type.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t */\n\t\tthis._toneMapping = toneMapping;\n\n\t\t/**\n\t\t * The tone mapping exposure.\n\t\t *\n\t\t * @type {Node}\n\t\t * @default null\n\t\t */\n\t\tthis.exposureNode = exposureNode;\n\n\t\t/**\n\t\t * Represents the color to process.\n\t\t *\n\t\t * @type {?Node}\n\t\t * @default null\n\t\t */\n\t\tthis.colorNode = colorNode;\n\n\t}\n\n\t/**\n\t * Overwrites the default `customCacheKey()` implementation by including the tone\n\t * mapping type into the cache key.\n\t *\n\t * @return {number} The hash.\n\t */\n\tcustomCacheKey() {\n\n\t\treturn hash$1( this._toneMapping );\n\n\t}\n\n\t/**\n\t * Sets the tone mapping type.\n\t *\n\t * @param {number} value - The tone mapping type.\n\t * @return {ToneMappingNode} A reference to this node.\n\t */\n\tsetToneMapping( value ) {\n\n\t\tthis._toneMapping = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Gets the tone mapping type.\n\t *\n\t * @returns {number} The tone mapping type.\n\t */\n\tgetToneMapping() {\n\n\t\treturn this._toneMapping;\n\n\t}\n\n\tsetup( builder ) {\n\n\t\tconst colorNode = this.colorNode || builder.context.color;\n\t\tconst toneMapping = this._toneMapping;\n\n\t\tif ( toneMapping === NoToneMapping ) return colorNode;\n\n\t\tlet outputNode = null;\n\n\t\tconst toneMappingFn = builder.renderer.library.getToneMappingFunction( toneMapping );\n\n\t\tif ( toneMappingFn !== null ) {\n\n\t\t\toutputNode = vec4( toneMappingFn( colorNode.rgb, this.exposureNode ), colorNode.a );\n\n\t\t} else {\n\n\t\t\terror( 'ToneMappingNode: Unsupported Tone Mapping configuration.', toneMapping );\n\n\t\t\toutputNode = colorNode;\n\n\t\t}\n\n\t\treturn outputNode;\n\n\t}\n\n}\n\n/**\n * TSL function for creating a tone mapping node.\n *\n * @tsl\n * @function\n * @param {number} mapping - The tone mapping type.\n * @param {Node<float> | number} exposure - The tone mapping exposure.\n * @param {Node<vec3> | Color} color - The color node to process.\n * @returns {ToneMappingNode<vec3>}\n */\nconst toneMapping = ( mapping, exposure, color ) => nodeObject( new ToneMappingNode( mapping, nodeObject( exposure ), nodeObject( color ) ) );\n\n/**\n * TSL object that represents the global tone mapping exposure of the renderer.\n *\n * @tsl\n * @type {RendererReferenceNode<vec3>}\n */\nconst toneMappingExposure = /*@__PURE__*/ rendererReference( 'toneMappingExposure', 'float' );\n\naddMethodChaining( 'toneMapping', ( color, mapping, exposure ) => toneMapping( mapping, exposure, color ) );\n\n/**\n * Internal buffer attribute library.\n *\n * @private\n * @type {WeakMap<TypedArray, InterleavedBuffer>}\n */\nconst _bufferLib = new WeakMap();\n\n/**\n * Internal method for retrieving or creating interleaved buffers.\n *\n * @private\n * @param {TypedArray} value - The attribute data.\n * @param {number} itemSize - The attribute item size.\n * @returns {InterleavedBuffer} The interleaved buffer.\n */\nfunction _getBufferAttribute( value, itemSize ) {\n\n\tlet buffer = _bufferLib.get( value );\n\n\tif ( buffer === undefined ) {\n\n\t\tbuffer = new InterleavedBuffer( value, itemSize );\n\n\t\t_bufferLib.set( value, buffer );\n\n\t}\n\n\treturn buffer;\n\n}\n\n/**\n * In earlier `three.js` versions it was only possible to define attribute data\n * on geometry level. With `BufferAttributeNode`, it is also possible to do this\n * on the node level.\n * ```js\n * const geometry = new THREE.PlaneGeometry();\n * const positionAttribute = geometry.getAttribute( 'position' );\n *\n * const colors = [];\n * for ( let i = 0; i < position.count; i ++ ) {\n * \tcolors.push( 1, 0, 0 );\n * }\n *\n * material.colorNode = bufferAttribute( new THREE.Float32BufferAttribute( colors, 3 ) );\n * ```\n * This new approach is especially interesting when geometry data are generated via\n * compute shaders. The below line converts a storage buffer into an attribute node.\n * ```js\n * material.positionNode = positionBuffer.toAttribute();\n * ```\n * @augments InputNode\n */\nclass BufferAttributeNode extends InputNode {\n\n\tstatic get type() {\n\n\t\treturn 'BufferAttributeNode';\n\n\t}\n\n\t/**\n\t * Constructs a new buffer attribute node.\n\t *\n\t * @param {BufferAttribute|InterleavedBuffer|TypedArray} value - The attribute data.\n\t * @param {?string} [bufferType=null] - The buffer type (e.g. `'vec3'`).\n\t * @param {number} [bufferStride=0] - The buffer stride.\n\t * @param {number} [bufferOffset=0] - The buffer offset.\n\t */\n\tconstructor( value, bufferType = null, bufferStride = 0, bufferOffset = 0 ) {\n\n\t\tsuper( value, bufferType );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBufferNode = true;\n\n\t\t/**\n\t\t * The buffer type (e.g. `'vec3'`).\n\t\t *\n\t\t * @type {?string}\n\t\t * @default null\n\t\t */\n\t\tthis.bufferType = bufferType;\n\n\t\t/**\n\t\t * The buffer stride.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.bufferStride = bufferStride;\n\n\t\t/**\n\t\t * The buffer offset.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.bufferOffset = bufferOffset;\n\n\t\t/**\n\t\t * The usage property. Set this to `THREE.DynamicDrawUsage` via `.setUsage()`,\n\t\t * if you are planning to update the attribute data per frame.\n\t\t *\n\t\t * @type {number}\n\t\t * @default StaticDrawUsage\n\t\t */\n\t\tthis.usage = StaticDrawUsage;\n\n\t\t/**\n\t\t * Whether the attribute is instanced or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.instanced = false;\n\n\t\t/**\n\t\t * A reference to the buffer attribute.\n\t\t *\n\t\t * @type {?BufferAttribute}\n\t\t * @default null\n\t\t */\n\t\tthis.attribute = null;\n\n\t\t/**\n\t\t * `BufferAttributeNode` sets this property to `true` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.global = true;\n\n\t\tif ( value && value.isBufferAttribute === true && value.itemSize <= 4 ) {\n\n\t\t\tthis.attribute = value;\n\t\t\tthis.usage = value.usage;\n\t\t\tthis.instanced = value.isInstancedBufferAttribute;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * This method is overwritten since the attribute data might be shared\n\t * and thus the hash should be shared as well.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The hash.\n\t */\n\tgetHash( builder ) {\n\n\t\tif ( this.bufferStride === 0 && this.bufferOffset === 0 ) {\n\n\t\t\tlet bufferData = builder.globalCache.getData( this.value );\n\n\t\t\tif ( bufferData === undefined ) {\n\n\t\t\t\tbufferData = {\n\t\t\t\t\tnode: this\n\t\t\t\t};\n\n\t\t\t\tbuilder.globalCache.setData( this.value, bufferData );\n\n\t\t\t}\n\n\t\t\treturn bufferData.node.uuid;\n\n\t\t}\n\n\t\treturn this.uuid;\n\n\t}\n\n\t/**\n\t * This method is overwritten since the node type is inferred from\n\t * the buffer attribute.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The node type.\n\t */\n\tgetNodeType( builder ) {\n\n\t\tif ( this.bufferType === null ) {\n\n\t\t\tthis.bufferType = builder.getTypeFromAttribute( this.attribute );\n\n\t\t}\n\n\t\treturn this.bufferType;\n\n\t}\n\n\t/**\n\t * Depending on which value was passed to the node, `setup()` behaves\n\t * differently. If no instance of `BufferAttribute` was passed, the method\n\t * creates an internal attribute and configures it respectively.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tsetup( builder ) {\n\n\t\tif ( this.attribute !== null ) return;\n\n\t\t//\n\n\t\tconst type = this.getNodeType( builder );\n\t\tconst itemSize = builder.getTypeLength( type );\n\t\tconst value = this.value;\n\t\tconst stride = this.bufferStride || itemSize;\n\t\tconst offset = this.bufferOffset;\n\n\t\tlet buffer;\n\n\t\tif ( value.isInterleavedBuffer === true ) {\n\n\t\t\tbuffer = value;\n\n\t\t} else if ( value.isBufferAttribute === true ) {\n\n\t\t\tbuffer = _getBufferAttribute( value.array, stride );\n\n\t\t} else {\n\n\t\t\tbuffer = _getBufferAttribute( value, stride );\n\n\t\t}\n\n\t\tconst bufferAttribute = new InterleavedBufferAttribute( buffer, itemSize, offset );\n\n\t\tbuffer.setUsage( this.usage );\n\n\t\tthis.attribute = bufferAttribute;\n\t\tthis.attribute.isInstancedBufferAttribute = this.instanced; // @TODO: Add a possible: InstancedInterleavedBufferAttribute\n\n\t}\n\n\t/**\n\t * Generates the code snippet of the buffer attribute node.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The generated code snippet.\n\t */\n\tgenerate( builder ) {\n\n\t\tconst nodeType = this.getNodeType( builder );\n\n\t\tconst nodeAttribute = builder.getBufferAttributeFromNode( this, nodeType );\n\t\tconst propertyName = builder.getPropertyName( nodeAttribute );\n\n\t\tlet output = null;\n\n\t\tif ( builder.shaderStage === 'vertex' || builder.shaderStage === 'compute' ) {\n\n\t\t\tthis.name = propertyName;\n\n\t\t\toutput = propertyName;\n\n\t\t} else {\n\n\t\t\tconst nodeVarying = varying( this );\n\n\t\t\toutput = nodeVarying.build( builder, nodeType );\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n\t/**\n\t * Overwrites the default implementation to return a fixed value `'bufferAttribute'`.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The input type.\n\t */\n\tgetInputType( /*builder*/ ) {\n\n\t\treturn 'bufferAttribute';\n\n\t}\n\n\t/**\n\t * Sets the `usage` property to the given value.\n\t *\n\t * @param {number} value - The usage to set.\n\t * @return {BufferAttributeNode} A reference to this node.\n\t */\n\tsetUsage( value ) {\n\n\t\tthis.usage = value;\n\n\t\tif ( this.attribute && this.attribute.isBufferAttribute === true ) {\n\n\t\t\tthis.attribute.usage = value;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the `instanced` property to the given value.\n\t *\n\t * @param {boolean} value - The value to set.\n\t * @return {BufferAttributeNode} A reference to this node.\n\t */\n\tsetInstanced( value ) {\n\n\t\tthis.instanced = value;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * Internal method for creating buffer attribute nodes.\n *\n * @private\n * @param {BufferAttribute|InterleavedBuffer|TypedArray} array - The attribute data.\n * @param {?string} [type=null] - The buffer type (e.g. `'vec3'`).\n * @param {number} [stride=0] - The buffer stride.\n * @param {number} [offset=0] - The buffer offset.\n * @param {number} [usage=StaticDrawUsage] - The buffer usage.\n * @param {boolean} [instanced=false] - Whether the buffer is instanced.\n * @returns {BufferAttributeNode|Node} The buffer attribute node.\n */\nfunction createBufferAttribute( array, type = null, stride = 0, offset = 0, usage = StaticDrawUsage, instanced = false ) {\n\n\tif ( type === 'mat3' || ( type === null && array.itemSize === 9 ) ) {\n\n\t\treturn mat3(\n\t\t\tnew BufferAttributeNode( array, 'vec3', 9, 0 ).setUsage( usage ).setInstanced( instanced ),\n\t\t\tnew BufferAttributeNode( array, 'vec3', 9, 3 ).setUsage( usage ).setInstanced( instanced ),\n\t\t\tnew BufferAttributeNode( array, 'vec3', 9, 6 ).setUsage( usage ).setInstanced( instanced )\n\t\t);\n\n\t} else if ( type === 'mat4' || ( type === null && array.itemSize === 16 ) ) {\n\n\t\treturn mat4(\n\t\t\tnew BufferAttributeNode( array, 'vec4', 16, 0 ).setUsage( usage ).setInstanced( instanced ),\n\t\t\tnew BufferAttributeNode( array, 'vec4', 16, 4 ).setUsage( usage ).setInstanced( instanced ),\n\t\t\tnew BufferAttributeNode( array, 'vec4', 16, 8 ).setUsage( usage ).setInstanced( instanced ),\n\t\t\tnew BufferAttributeNode( array, 'vec4', 16, 12 ).setUsage( usage ).setInstanced( instanced )\n\t\t);\n\n\t}\n\n\treturn new BufferAttributeNode( array, type, stride, offset );\n\n}\n\n/**\n * TSL function for creating a buffer attribute node.\n *\n * @tsl\n * @function\n * @param {BufferAttribute|InterleavedBuffer|TypedArray} array - The attribute data.\n * @param {?string} [type=null] - The buffer type (e.g. `'vec3'`).\n * @param {number} [stride=0] - The buffer stride.\n * @param {number} [offset=0] - The buffer offset.\n * @returns {BufferAttributeNode|Node}\n */\nconst bufferAttribute = ( array, type = null, stride = 0, offset = 0 ) => createBufferAttribute( array, type, stride, offset );\n\n/**\n * TSL function for creating a buffer attribute node but with dynamic draw usage.\n * Use this function if attribute data are updated per frame.\n *\n * @tsl\n * @function\n * @param {BufferAttribute|InterleavedBuffer|TypedArray} array - The attribute data.\n * @param {?string} [type=null] - The buffer type (e.g. `'vec3'`).\n * @param {number} [stride=0] - The buffer stride.\n * @param {number} [offset=0] - The buffer offset.\n * @returns {BufferAttributeNode|Node}\n */\nconst dynamicBufferAttribute = ( array, type = null, stride = 0, offset = 0 ) => createBufferAttribute( array, type, stride, offset, DynamicDrawUsage );\n\n/**\n * TSL function for creating a buffer attribute node but with enabled instancing\n *\n * @tsl\n * @function\n * @param {BufferAttribute|InterleavedBuffer|TypedArray} array - The attribute data.\n * @param {?string} [type=null] - The buffer type (e.g. `'vec3'`).\n * @param {number} [stride=0] - The buffer stride.\n * @param {number} [offset=0] - The buffer offset.\n * @returns {BufferAttributeNode|Node}\n */\nconst instancedBufferAttribute = ( array, type = null, stride = 0, offset = 0 ) => createBufferAttribute( array, type, stride, offset, StaticDrawUsage, true );\n\n/**\n * TSL function for creating a buffer attribute node but with dynamic draw usage and enabled instancing\n *\n * @tsl\n * @function\n * @param {BufferAttribute|InterleavedBuffer|TypedArray} array - The attribute data.\n * @param {?string} [type=null] - The buffer type (e.g. `'vec3'`).\n * @param {number} [stride=0] - The buffer stride.\n * @param {number} [offset=0] - The buffer offset.\n * @returns {BufferAttributeNode|Node}\n */\nconst instancedDynamicBufferAttribute = ( array, type = null, stride = 0, offset = 0 ) => createBufferAttribute( array, type, stride, offset, DynamicDrawUsage, true );\n\naddMethodChaining( 'toAttribute', ( bufferNode ) => bufferAttribute( bufferNode.value ) );\n\n/**\n * TODO\n *\n * @augments Node\n */\nclass ComputeNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'ComputeNode';\n\n\t}\n\n\t/**\n\t * Constructs a new compute node.\n\t *\n\t * @param {Node} computeNode - TODO\n\t * @param {Array<number>} workgroupSize - TODO.\n\t */\n\tconstructor( computeNode, workgroupSize ) {\n\n\t\tsuper( 'void' );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isComputeNode = true;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.computeNode = computeNode;\n\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {Array<number>}\n\t\t * @default [ 64 ]\n\t\t */\n\t\tthis.workgroupSize = workgroupSize;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number|Array<number>}\n\t\t */\n\t\tthis.count = null;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.version = 1;\n\n\t\t/**\n\t\t * The name or label of the uniform.\n\t\t *\n\t\t * @type {string}\n\t\t * @default ''\n\t\t */\n\t\tthis.name = '';\n\n\t\t/**\n\t\t * The `updateBeforeType` is set to `NodeUpdateType.OBJECT` since {@link ComputeNode#updateBefore}\n\t\t * is executed once per object by default.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'object'\n\t\t */\n\t\tthis.updateBeforeType = NodeUpdateType.OBJECT;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {?Function}\n\t\t */\n\t\tthis.onInitFunction = null;\n\n\t}\n\n\t/**\n\t * TODO\n\t *\n\t * @param {number|Array<number>} count - Array with [ x, y, z ] values for dispatch or a single number for the count\n\t * @return {ComputeNode}\n\t */\n\tsetCount( count ) {\n\n\t\tthis.count = count;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * TODO\n\t *\n\t * @return {number|Array<number>}\n\t */\n\tgetCount() {\n\n\t\treturn this.count;\n\n\t}\n\n\t/**\n\t * Executes the `dispose` event for this node.\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n\t/**\n\t * Sets the {@link ComputeNode#name} property.\n\t *\n\t * @param {string} name - The name of the uniform.\n\t * @return {ComputeNode} A reference to this node.\n\t */\n\tsetName( name ) {\n\n\t\tthis.name = name;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the {@link ComputeNode#name} property.\n\t *\n\t * @deprecated\n\t * @param {string} name - The name of the uniform.\n\t * @return {ComputeNode} A reference to this node.\n\t */\n\tlabel( name ) {\n\n\t\twarn( 'TSL: \"label()\" has been deprecated. Use \"setName()\" instead.' ); // @deprecated r179\n\n\t\treturn this.setName( name );\n\n\t}\n\n\t/**\n\t * TODO\n\t *\n\t * @param {Function} callback - TODO.\n\t * @return {ComputeNode} A reference to this node.\n\t */\n\tonInit( callback ) {\n\n\t\tthis.onInitFunction = callback;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * The method execute the compute for this node.\n\t *\n\t * @param {NodeFrame} frame - A reference to the current node frame.\n\t */\n\tupdateBefore( { renderer } ) {\n\n\t\trenderer.compute( this );\n\n\t}\n\n\tsetup( builder ) {\n\n\t\tconst result = this.computeNode.build( builder );\n\n\t\tif ( result ) {\n\n\t\t\tconst properties = builder.getNodeProperties( this );\n\t\t\tproperties.outputComputeNode = result.outputNode;\n\n\t\t\tresult.outputNode = null;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tgenerate( builder, output ) {\n\n\t\tconst { shaderStage } = builder;\n\n\t\tif ( shaderStage === 'compute' ) {\n\n\t\t\tconst snippet = this.computeNode.build( builder, 'void' );\n\n\t\t\tif ( snippet !== '' ) {\n\n\t\t\t\tbuilder.addLineFlowCode( snippet, this );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst properties = builder.getNodeProperties( this );\n\t\t\tconst outputComputeNode = properties.outputComputeNode;\n\n\t\t\tif ( outputComputeNode ) {\n\n\t\t\t\treturn outputComputeNode.build( builder, output );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * TSL function for creating a compute kernel node.\n *\n * @tsl\n * @function\n * @param {Node} node - TODO\n * @param {Array<number>} [workgroupSize=[64]] - TODO.\n * @returns {AtomicFunctionNode}\n */\nconst computeKernel = ( node, workgroupSize = [ 64 ] ) => {\n\n\tif ( workgroupSize.length === 0 || workgroupSize.length > 3 ) {\n\n\t\terror( 'TSL: compute() workgroupSize must have 1, 2, or 3 elements' );\n\n\t}\n\n\tfor ( let i = 0; i < workgroupSize.length; i ++ ) {\n\n\t\tconst val = workgroupSize[ i ];\n\n\t\tif ( typeof val !== 'number' || val <= 0 || ! Number.isInteger( val ) ) {\n\n\t\t\terror( `TSL: compute() workgroupSize element at index [ ${ i } ] must be a positive integer` );\n\n\t\t}\n\n\t}\n\n\t// Implicit fill-up to [ x, y, z ] with 1s, just like WGSL treats @workgroup_size when fewer dimensions are specified\n\n\twhile ( workgroupSize.length < 3 ) workgroupSize.push( 1 );\n\n\t//\n\n\treturn nodeObject( new ComputeNode( nodeObject( node ), workgroupSize ) );\n\n};\n\n/**\n * TSL function for creating a compute node.\n *\n * @tsl\n * @function\n * @param {Node} node - TODO\n * @param {number|Array<number>} count - TODO.\n * @param {Array<number>} [workgroupSize=[64]] - TODO.\n * @returns {AtomicFunctionNode}\n */\nconst compute = ( node, count, workgroupSize ) => computeKernel( node, workgroupSize ).setCount( count );\n\naddMethodChaining( 'compute', compute );\naddMethodChaining( 'computeKernel', computeKernel );\n\n/**\n * This node can be used as a cache management component for another node.\n * Caching is in general used by default in {@link NodeBuilder} but this node\n * allows the usage of a shared parent cache during the build process.\n *\n * @augments Node\n */\nclass IsolateNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'IsolateNode';\n\n\t}\n\n\t/**\n\t * Constructs a new cache node.\n\t *\n\t * @param {Node} node - The node that should be cached.\n\t * @param {boolean} [parent=true] - Whether this node refers to a shared parent cache or not.\n\t */\n\tconstructor( node, parent = true ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The node that should be cached.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.node = node;\n\n\t\t/**\n\t\t * Whether this node refers to a shared parent cache or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.parent = parent;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isIsolateNode = true;\n\n\t}\n\n\tgetNodeType( builder ) {\n\n\t\tconst previousCache = builder.getCache();\n\t\tconst cache = builder.getCacheFromNode( this, this.parent );\n\n\t\tbuilder.setCache( cache );\n\n\t\tconst nodeType = this.node.getNodeType( builder );\n\n\t\tbuilder.setCache( previousCache );\n\n\t\treturn nodeType;\n\n\t}\n\n\tbuild( builder, ...params ) {\n\n\t\tconst previousCache = builder.getCache();\n\t\tconst cache = builder.getCacheFromNode( this, this.parent );\n\n\t\tbuilder.setCache( cache );\n\n\t\tconst data = this.node.build( builder, ...params );\n\n\t\tbuilder.setCache( previousCache );\n\n\t\treturn data;\n\n\t}\n\n\tsetParent( parent ) {\n\n\t\tthis.parent = parent;\n\n\t\treturn this;\n\n\t}\n\n\tgetParent() {\n\n\t\treturn this.parent;\n\n\t}\n\n}\n\n/**\n * TSL function for creating a cache node.\n *\n * @tsl\n * @function\n * @param {Node} node - The node that should be cached.\n * @returns {IsolateNode}\n */\nconst isolate = ( node ) => new IsolateNode( nodeObject( node ) );\n\n/**\n * TSL function for creating a cache node.\n *\n * @tsl\n * @function\n * @deprecated\n * @param {Node} node - The node that should be cached.\n * @param {boolean} [parent=true] - Whether this node refers to a shared parent cache or not.\n * @returns {IsolateNode}\n */\nfunction cache( node, parent = true ) {\n\n\twarn( 'TSL: \"cache()\" has been deprecated. Use \"isolate()\" instead.' ); // @deprecated r181\n\n\treturn isolate( node ).setParent( parent );\n\n}\n\naddMethodChaining( 'cache', cache );\naddMethodChaining( 'isolate', isolate );\n\n/**\n * The class generates the code of a given node but returns another node in the output.\n * This can be used to call a method or node that does not return a value, i.e.\n * type `void` on an input where returning a value is required. Example:\n *\n * ```js\n * material.colorNode = myColor.bypass( runVoidFn() )\n *```\n *\n * @augments Node\n */\nclass BypassNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'BypassNode';\n\n\t}\n\n\t/**\n\t * Constructs a new bypass node.\n\t *\n\t * @param {Node} outputNode - The output node.\n\t * @param {Node} callNode - The call node.\n\t */\n\tconstructor( outputNode, callNode ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBypassNode = true;\n\n\t\t/**\n\t\t * The output node.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.outputNode = outputNode;\n\n\t\t/**\n\t\t * The call node.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.callNode = callNode;\n\n\t}\n\n\tgetNodeType( builder ) {\n\n\t\treturn this.outputNode.getNodeType( builder );\n\n\t}\n\n\tgenerate( builder ) {\n\n\t\tconst snippet = this.callNode.build( builder, 'void' );\n\n\t\tif ( snippet !== '' ) {\n\n\t\t\tbuilder.addLineFlowCode( snippet, this );\n\n\t\t}\n\n\t\treturn this.outputNode.build( builder );\n\n\t}\n\n}\n\n/**\n * TSL function for creating a bypass node.\n *\n * @tsl\n * @function\n * @param {Node} outputNode - The output node.\n * @param {Node} callNode - The call node.\n * @returns {BypassNode}\n */\nconst bypass = /*@__PURE__*/ nodeProxy( BypassNode ).setParameterLength( 2 );\n\naddMethodChaining( 'bypass', bypass );\n\n/**\n * This node allows to remap a node value from one range into another. E.g a value of\n * `0.4` in the range `[ 0.3, 0.5 ]` should be remapped into the normalized range `[ 0, 1 ]`.\n * `RemapNode` takes care of that and converts the original value of `0.4` to `0.5`.\n *\n * @augments Node\n */\nclass RemapNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'RemapNode';\n\n\t}\n\n\t/**\n\t * Constructs a new remap node.\n\t *\n\t * @param {Node} node - The node that should be remapped.\n\t * @param {Node} inLowNode - The source or current lower bound of the range.\n\t * @param {Node} inHighNode - The source or current upper bound of the range.\n\t * @param {Node} [outLowNode=float(0)] - The target lower bound of the range.\n\t * @param {Node} [outHighNode=float(1)] - The target upper bound of the range.\n\t */\n\tconstructor( node, inLowNode, inHighNode, outLowNode = float( 0 ), outHighNode = float( 1 ) ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The node that should be remapped.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.node = node;\n\n\t\t/**\n\t\t * The source or current lower bound of the range.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.inLowNode = inLowNode;\n\n\t\t/**\n\t\t * The source or current upper bound of the range.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.inHighNode = inHighNode;\n\n\t\t/**\n\t\t * The target lower bound of the range.\n\t\t *\n\t\t * @type {Node}\n\t\t * @default float(0)\n\t\t */\n\t\tthis.outLowNode = outLowNode;\n\n\t\t/**\n\t\t * The target upper bound of the range.\n\t\t *\n\t\t * @type {Node}\n\t\t * @default float(1)\n\t\t */\n\t\tthis.outHighNode = outHighNode;\n\n\t\t/**\n\t\t * Whether the node value should be clamped before\n\t\t * remapping it to the target range.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.doClamp = true;\n\n\t}\n\n\tsetup() {\n\n\t\tconst { node, inLowNode, inHighNode, outLowNode, outHighNode, doClamp } = this;\n\n\t\tlet t = node.sub( inLowNode ).div( inHighNode.sub( inLowNode ) );\n\n\t\tif ( doClamp === true ) t = t.clamp();\n\n\t\treturn t.mul( outHighNode.sub( outLowNode ) ).add( outLowNode );\n\n\t}\n\n}\n\n/**\n * TSL function for creating a remap node.\n *\n * @tsl\n * @function\n * @param {Node} node - The node that should be remapped.\n * @param {Node} inLowNode - The source or current lower bound of the range.\n * @param {Node} inHighNode - The source or current upper bound of the range.\n * @param {?Node} [outLowNode=float(0)] - The target lower bound of the range.\n * @param {?Node} [outHighNode=float(1)] - The target upper bound of the range.\n * @returns {RemapNode}\n */\nconst remap = /*@__PURE__*/ nodeProxy( RemapNode, null, null, { doClamp: false } ).setParameterLength( 3, 5 );\n\n/**\n * TSL function for creating a remap node, but with enabled clamping.\n *\n * @tsl\n * @function\n * @param {Node} node - The node that should be remapped.\n * @param {Node} inLowNode - The source or current lower bound of the range.\n * @param {Node} inHighNode - The source or current upper bound of the range.\n * @param {?Node} [outLowNode=float(0)] - The target lower bound of the range.\n * @param {?Node} [outHighNode=float(1)] - The target upper bound of the range.\n * @returns {RemapNode}\n */\nconst remapClamp = /*@__PURE__*/ nodeProxy( RemapNode ).setParameterLength( 3, 5 );\n\naddMethodChaining( 'remap', remap );\naddMethodChaining( 'remapClamp', remapClamp );\n\n/**\n * This class can be used to implement basic expressions in shader code.\n * Basic examples for that are `return`, `continue` or `discard` statements.\n *\n * @augments Node\n */\nclass ExpressionNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'ExpressionNode';\n\n\t}\n\n\t/**\n\t * Constructs a new expression node.\n\t *\n\t * @param {string} [snippet=''] - The native code snippet.\n\t * @param {string} [nodeType='void'] - The node type.\n\t */\n\tconstructor( snippet = '', nodeType = 'void' ) {\n\n\t\tsuper( nodeType );\n\n\t\t/**\n\t\t * The native code snippet.\n\t\t *\n\t\t * @type {string}\n\t\t * @default ''\n\t\t */\n\t\tthis.snippet = snippet;\n\n\t}\n\n\tgenerate( builder, output ) {\n\n\t\tconst type = this.getNodeType( builder );\n\t\tconst snippet = this.snippet;\n\n\t\tif ( type === 'void' ) {\n\n\t\t\tbuilder.addLineFlowCode( snippet, this );\n\n\t\t} else {\n\n\t\t\treturn builder.format( snippet, type, output );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * TSL function for creating an expression node.\n *\n * @tsl\n * @function\n * @param {string} [snippet] - The native code snippet.\n * @param {?string} [nodeType='void'] - The node type.\n * @returns {ExpressionNode}\n */\nconst expression = /*@__PURE__*/ nodeProxy( ExpressionNode ).setParameterLength( 1, 2 );\n\n/**\n * Represents a `discard` shader operation in TSL.\n *\n * @tsl\n * @function\n * @param {?ConditionalNode} conditional - An optional conditional node. It allows to decide whether the discard should be executed or not.\n * @return {Node} The `discard` expression.\n */\nconst Discard = ( conditional ) => ( conditional ? select( conditional, expression( 'discard' ) ) : expression( 'discard' ) ).toStack();\n\n/**\n * Represents a `return` shader operation in TSL.\n *\n * @tsl\n * @function\n * @return {ExpressionNode} The `return` expression.\n */\nconst Return = () => expression( 'return' ).toStack();\n\naddMethodChaining( 'discard', Discard );\n\n/**\n * Normally, tone mapping and color conversion happens automatically\n * before outputting pixel too the default (screen) framebuffer. In certain\n * post processing setups this happens to late because certain effects\n * require e.g. sRGB input. For such scenarios, `RenderOutputNode` can be used\n * to apply tone mapping and color space conversion at an arbitrary point\n * in the effect chain.\n *\n * When applying tone mapping and color space conversion manually with this node,\n * you have to set {@link PostProcessing#outputColorTransform} to `false`.\n *\n * ```js\n * const postProcessing = new PostProcessing( renderer );\n * postProcessing.outputColorTransform = false;\n *\n * const scenePass = pass( scene, camera );\n * const outputPass = renderOutput( scenePass );\n *\n * postProcessing.outputNode = outputPass;\n * ```\n *\n * @augments TempNode\n */\nclass RenderOutputNode extends TempNode {\n\n\tstatic get type() {\n\n\t\treturn 'RenderOutputNode';\n\n\t}\n\n\t/**\n\t * Constructs a new render output node.\n\t *\n\t * @param {Node} colorNode - The color node to process.\n\t * @param {?number} toneMapping - The tone mapping type.\n\t * @param {?string} outputColorSpace - The output color space.\n\t */\n\tconstructor( colorNode, toneMapping, outputColorSpace ) {\n\n\t\tsuper( 'vec4' );\n\n\t\t/**\n\t\t * The color node to process.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.colorNode = colorNode;\n\n\t\t/**\n\t\t * The tone mapping type.\n\t\t *\n\t\t * @private\n\t\t * @type {?number}\n\t\t */\n\t\tthis._toneMapping = toneMapping;\n\n\t\t/**\n\t\t * The output color space.\n\t\t *\n\t\t * @type {?string}\n\t\t */\n\t\tthis.outputColorSpace = outputColorSpace;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRenderOutputNode = true;\n\n\t}\n\n\t/**\n\t * Sets the tone mapping type.\n\t *\n\t * @param {number} value - The tone mapping type.\n\t * @return {ToneMappingNode} A reference to this node.\n\t */\n\tsetToneMapping( value ) {\n\n\t\tthis._toneMapping = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Gets the tone mapping type.\n\t *\n\t * @returns {number} The tone mapping type.\n\t */\n\tgetToneMapping() {\n\n\t\treturn this._toneMapping;\n\n\t}\n\n\tsetup( { context } ) {\n\n\t\tlet outputNode = this.colorNode || context.color;\n\n\t\t// tone mapping\n\n\t\tconst toneMapping = ( this._toneMapping !== null ? this._toneMapping : context.toneMapping ) || NoToneMapping;\n\t\tconst outputColorSpace = ( this.outputColorSpace !== null ? this.outputColorSpace : context.outputColorSpace ) || NoColorSpace;\n\n\t\tif ( toneMapping !== NoToneMapping ) {\n\n\t\t\toutputNode = outputNode.toneMapping( toneMapping );\n\n\t\t}\n\n\t\t// working to output color space\n\n\t\tif ( outputColorSpace !== NoColorSpace && outputColorSpace !== ColorManagement.workingColorSpace ) {\n\n\t\t\toutputNode = outputNode.workingToColorSpace( outputColorSpace );\n\n\t\t}\n\n\t\treturn outputNode;\n\n\t}\n\n}\n\n/**\n * TSL function for creating a posterize node.\n *\n * @tsl\n * @function\n * @param {Node} color - The color node to process.\n * @param {?number} [toneMapping=null] - The tone mapping type.\n * @param {?string} [outputColorSpace=null] - The output color space.\n * @returns {RenderOutputNode}\n */\nconst renderOutput = ( color, toneMapping = null, outputColorSpace = null ) => nodeObject( new RenderOutputNode( nodeObject( color ), toneMapping, outputColorSpace ) );\n\naddMethodChaining( 'renderOutput', renderOutput );\n\nclass DebugNode extends TempNode {\n\n\tstatic get type() {\n\n\t\treturn 'DebugNode';\n\n\t}\n\n\tconstructor( node, callback = null ) {\n\n\t\tsuper();\n\n\t\tthis.node = node;\n\t\tthis.callback = callback;\n\n\t}\n\n\tgetNodeType( builder ) {\n\n\t\treturn this.node.getNodeType( builder );\n\n\t}\n\n\tsetup( builder ) {\n\n\t\treturn this.node.build( builder );\n\n\t}\n\n\tanalyze( builder ) {\n\n\t\treturn this.node.build( builder );\n\n\t}\n\n\tgenerate( builder ) {\n\n\t\tconst callback = this.callback;\n\t\tconst snippet = this.node.build( builder );\n\n\t\tconst title = '--- TSL debug - ' + builder.shaderStage + ' shader ---';\n\t\tconst border = '-'.repeat( title.length );\n\n\t\tlet code = '';\n\t\tcode += '// #' + title + '#\\n';\n\t\tcode += builder.flow.code.replace( /^\\t/mg, '' ) + '\\n';\n\t\tcode += '/* ... */ ' + snippet + ' /* ... */\\n';\n\t\tcode += '// #' + border + '#\\n';\n\n\t\tif ( callback !== null ) {\n\n\t\t\tcallback( builder, code );\n\n\t\t} else {\n\n\t\t\tlog$1( code );\n\n\t\t}\n\n\t\treturn snippet;\n\n\t}\n\n}\n\n/**\n * TSL function for creating a debug node.\n *\n * @tsl\n * @function\n * @param {Node} node - The node to debug.\n * @param {?Function} [callback=null] - Optional callback function to handle the debug output.\n * @returns {DebugNode}\n */\nconst debug = ( node, callback = null ) => nodeObject( new DebugNode( nodeObject( node ), callback ) ).toStack();\n\naddMethodChaining( 'debug', debug );\n\n/**\n * InspectorBase is the base class for all inspectors.\n *\n * @class InspectorBase\n */\nclass InspectorBase {\n\n\t/**\n\t * Creates a new InspectorBase.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The renderer associated with this inspector.\n\t\t *\n\t\t * @type {WebGLRenderer}\n\t\t * @private\n\t\t */\n\t\tthis._renderer = null;\n\n\t\t/**\n\t\t * The current frame being processed.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.currentFrame = null;\n\n\t}\n\n\t/**\n\t * Returns the node frame for the current renderer.\n\t *\n\t * @return {Object} The node frame.\n\t */\n\tget nodeFrame() {\n\n\t\treturn this._renderer._nodes.nodeFrame;\n\n\t}\n\n\t/**\n\t * Sets the renderer for this inspector.\n\t *\n\t * @param {WebGLRenderer} renderer - The renderer to associate with this inspector.\n\t * @return {InspectorBase} This inspector instance.\n\t */\n\tsetRenderer( renderer ) {\n\n\t\tthis._renderer = renderer;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the renderer associated with this inspector.\n\t *\n\t * @return {WebGLRenderer} The associated renderer.\n\t */\n\tgetRenderer() {\n\n\t\treturn this._renderer;\n\n\t}\n\n\t/**\n\t * Initializes the inspector.\n\t */\n\tinit() { }\n\n\t/**\n\t * Called when a frame begins.\n\t */\n\tbegin() { }\n\n\t/**\n\t * Called when a frame ends.\n\t */\n\tfinish() { }\n\n\t/**\n\t * Inspects a node.\n\t *\n\t * @param {Node} node - The node to inspect.\n\t */\n\tinspect( /*node*/ ) { }\n\n\t/**\n\t * When a compute operation is performed.\n\t *\n\t * @param {ComputeNode} computeNode - The compute node being executed.\n\t * @param {number|Array<number>} dispatchSizeOrCount - The dispatch size or count.\n\t */\n\tcomputeAsync( /*computeNode, dispatchSizeOrCount*/ ) { }\n\n\t/**\n\t * Called when a compute operation begins.\n\t *\n\t * @param {string} uid - A unique identifier for the render context.\n\t * @param {ComputeNode} computeNode - The compute node being executed.\n\t */\n\tbeginCompute( /*uid, computeNode*/ ) { }\n\n\t/**\n\t * Called when a compute operation ends.\n\t *\n\t * @param {string} uid - A unique identifier for the render context.\n\t * @param {ComputeNode} computeNode - The compute node being executed.\n\t */\n\tfinishCompute( /*uid*/ ) { }\n\n\t/**\n\t * Called when a render operation begins.\n\t *\n\t * @param {string} uid - A unique identifier for the render context.\n\t * @param {Scene} scene - The scene being rendered.\n\t * @param {Camera} camera - The camera being used for rendering.\n\t * @param {?WebGLRenderTarget} renderTarget - The render target, if any.\n\t */\n\tbeginRender( /*uid, scene, camera, renderTarget*/ ) { }\n\n\t/**\n\t * Called when an animation loop ends.\n\t *\n\t * @param {string} uid - A unique identifier for the render context.\n\t */\n\tfinishRender( /*uid*/ ) { }\n\n\t/**\n\t * Called when a texture copy operation is performed.\n\t *\n\t * @param {Texture} srcTexture - The source texture.\n\t * @param {Texture} dstTexture - The destination texture.\n\t */\n\tcopyTextureToTexture( /*srcTexture, dstTexture*/ ) { }\n\n\t/**\n\t * Called when a framebuffer copy operation is performed.\n\t *\n\t * @param {Texture} framebufferTexture - The texture associated with the framebuffer.\n\t */\n\tcopyFramebufferToTexture( /*framebufferTexture*/ ) { }\n\n}\n\n/**\n * InspectorNode is a wrapper node that allows inspection of node values during rendering.\n * It can be used to debug or analyze node outputs in the rendering pipeline.\n *\n * @augments Node\n */\nclass InspectorNode extends Node {\n\n\t/**\n\t * Returns the type of the node.\n\t *\n\t * @returns {string}\n\t */\n\tstatic get type() {\n\n\t\treturn 'InspectorNode';\n\n\t}\n\n\t/**\n\t * Creates an InspectorNode.\n\t *\n\t * @param {Node} node - The node to inspect.\n\t * @param {string} [name=''] - Optional name for the inspector node.\n\t * @param {Function|null} [callback=null] - Optional callback to modify the node during setup.\n\t */\n\tconstructor( node, name = '', callback = null ) {\n\n\t\tsuper();\n\n\t\tthis.node = node;\n\t\tthis.name = name;\n\t\tthis.callback = callback;\n\n\t\tthis.updateType = NodeUpdateType.FRAME;\n\n\t\tthis.isInspectorNode = true;\n\n\t}\n\n\t/**\n\t * Returns the name of the inspector node.\n\t *\n\t * @returns {string}\n\t */\n\tgetName() {\n\n\t\treturn this.name || this.node.name;\n\n\t}\n\n\t/**\n\t * Updates the inspector node, allowing inspection of the wrapped node.\n\t *\n\t * @param {NodeFrame} frame - A reference to the current node frame.\n\t */\n\tupdate( frame ) {\n\n\t\tframe.renderer.inspector.inspect( this );\n\n\t}\n\n\t/**\n\t * Returns the type of the wrapped node.\n\t *\n\t * @param {NodeBuilder} builder - The node builder.\n\t * @returns {string}\n\t */\n\tgetNodeType( builder ) {\n\n\t\treturn this.node.getNodeType( builder );\n\n\t}\n\n\t/**\n\t * Sets up the inspector node.\n\t *\n\t * @param {NodeBuilder} builder - The node builder.\n\t * @returns {Node} The setup node.\n\t */\n\tsetup( builder ) {\n\n\t\tlet node = this.node;\n\n\t\tif ( builder.context.inspector === true && this.callback !== null ) {\n\n\t\t\tnode = this.callback( node );\n\n\t\t}\n\n\t\tif ( builder.renderer.backend.isWebGPUBackend !== true && builder.renderer.inspector.constructor !== InspectorBase ) {\n\n\t\t\twarnOnce( 'TSL: \".toInspector()\" is only available with WebGPU.' );\n\n\t\t}\n\n\t\treturn node;\n\n\t}\n\n}\n\n/**\n * Creates an inspector node to wrap around a given node for inspection purposes.\n *\n * @tsl\n * @param {Node} node - The node to inspect.\n * @param {string} [name=''] - Optional name for the inspector node.\n * @param {Function|null} [callback=null] - Optional callback to modify the node during setup.\n * @returns {Node} The inspector node.\n */\nfunction inspector( node, name = '', callback = null ) {\n\n\tnode = nodeObject( node );\n\n\treturn node.before( new InspectorNode( node, name, callback ) );\n\n}\n\naddMethodChaining( 'toInspector', inspector );\n\nfunction addNodeElement( name/*, nodeElement*/ ) {\n\n\twarn( 'TSL: AddNodeElement has been removed in favor of tree-shaking. Trying add', name );\n\n}\n\n/**\n * Base class for representing shader attributes as nodes.\n *\n * @augments Node\n */\nclass AttributeNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'AttributeNode';\n\n\t}\n\n\t/**\n\t * Constructs a new attribute node.\n\t *\n\t * @param {string} attributeName - The name of the attribute.\n\t * @param {?string} nodeType - The node type.\n\t */\n\tconstructor( attributeName, nodeType = null ) {\n\n\t\tsuper( nodeType );\n\n\t\t/**\n\t\t * `AttributeNode` sets this property to `true` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.global = true;\n\n\t\tthis._attributeName = attributeName;\n\n\t}\n\n\tgetHash( builder ) {\n\n\t\treturn this.getAttributeName( builder );\n\n\t}\n\n\tgetNodeType( builder ) {\n\n\t\tlet nodeType = this.nodeType;\n\n\t\tif ( nodeType === null ) {\n\n\t\t\tconst attributeName = this.getAttributeName( builder );\n\n\t\t\tif ( builder.hasGeometryAttribute( attributeName ) ) {\n\n\t\t\t\tconst attribute = builder.geometry.getAttribute( attributeName );\n\n\t\t\t\tnodeType = builder.getTypeFromAttribute( attribute );\n\n\t\t\t} else {\n\n\t\t\t\tnodeType = 'float';\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn nodeType;\n\n\t}\n\n\t/**\n\t * Sets the attribute name to the given value. The method can be\n\t * overwritten in derived classes if the final name must be computed\n\t * analytically.\n\t *\n\t * @param {string} attributeName - The name of the attribute.\n\t * @return {AttributeNode} A reference to this node.\n\t */\n\tsetAttributeName( attributeName ) {\n\n\t\tthis._attributeName = attributeName;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the attribute name of this node. The method can be\n\t * overwritten in derived classes if the final name must be computed\n\t * analytically.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The attribute name.\n\t */\n\tgetAttributeName( /*builder*/ ) {\n\n\t\treturn this._attributeName;\n\n\t}\n\n\tgenerate( builder ) {\n\n\t\tconst attributeName = this.getAttributeName( builder );\n\t\tconst nodeType = this.getNodeType( builder );\n\t\tconst geometryAttribute = builder.hasGeometryAttribute( attributeName );\n\n\t\tif ( geometryAttribute === true ) {\n\n\t\t\tconst attribute = builder.geometry.getAttribute( attributeName );\n\t\t\tconst attributeType = builder.getTypeFromAttribute( attribute );\n\n\t\t\tconst nodeAttribute = builder.getAttribute( attributeName, attributeType );\n\n\t\t\tif ( builder.shaderStage === 'vertex' ) {\n\n\t\t\t\treturn builder.format( nodeAttribute.name, attributeType, nodeType );\n\n\t\t\t} else {\n\n\t\t\t\tconst nodeVarying = varying( this );\n\n\t\t\t\treturn nodeVarying.build( builder, nodeType );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\twarn( `AttributeNode: Vertex attribute \"${ attributeName }\" not found on geometry.` );\n\n\t\t\treturn builder.generateConst( nodeType );\n\n\t\t}\n\n\t}\n\n\tserialize( data ) {\n\n\t\tsuper.serialize( data );\n\n\t\tdata.global = this.global;\n\t\tdata._attributeName = this._attributeName;\n\n\t}\n\n\tdeserialize( data ) {\n\n\t\tsuper.deserialize( data );\n\n\t\tthis.global = data.global;\n\t\tthis._attributeName = data._attributeName;\n\n\t}\n\n}\n\n/**\n * TSL function for creating an attribute node.\n *\n * @tsl\n * @function\n * @param {string} name - The name of the attribute.\n * @param {?string} [nodeType=null] - The node type.\n * @returns {AttributeNode}\n */\nconst attribute = ( name, nodeType = null ) => new AttributeNode( name, nodeType );\n\n/**\n * TSL function for creating an uv attribute node with the given index.\n *\n * @tsl\n * @function\n * @param {number} [index=0] - The uv index.\n * @return {AttributeNode<vec2>} The uv attribute node.\n */\nconst uv$1 = ( index = 0 ) => attribute( 'uv' + ( index > 0 ? index : '' ), 'vec2' );\n\n/**\n * A node that represents the dimensions of a texture. The texture size is\n * retrieved in the shader via built-in shader functions like `textureDimensions()`\n * or `textureSize()`.\n *\n * @augments Node\n */\nclass TextureSizeNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'TextureSizeNode';\n\n\t}\n\n\t/**\n\t * Constructs a new texture size node.\n\t *\n\t * @param {TextureNode} textureNode - A texture node which size should be retrieved.\n\t * @param {?Node<int>} [levelNode=null] - A level node which defines the requested mip.\n\t */\n\tconstructor( textureNode, levelNode = null ) {\n\n\t\tsuper( 'uvec2' );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isTextureSizeNode = true;\n\n\t\t/**\n\t\t * A texture node which size should be retrieved.\n\t\t *\n\t\t * @type {TextureNode}\n\t\t */\n\t\tthis.textureNode = textureNode;\n\n\t\t/**\n\t\t * A level node which defines the requested mip.\n\t\t *\n\t\t * @type {Node<int>}\n\t\t * @default null\n\t\t */\n\t\tthis.levelNode = levelNode;\n\n\t}\n\n\tgenerate( builder, output ) {\n\n\t\tconst textureProperty = this.textureNode.build( builder, 'property' );\n\t\tconst level = this.levelNode === null ? '0' : this.levelNode.build( builder, 'int' );\n\n\t\treturn builder.format( `${ builder.getMethod( 'textureDimensions' ) }( ${ textureProperty }, ${ level } )`, this.getNodeType( builder ), output );\n\n\t}\n\n}\n\n/**\n * TSL function for creating a texture size node.\n *\n * @tsl\n * @function\n * @param {TextureNode} textureNode - A texture node which size should be retrieved.\n * @param {?Node<int>} [levelNode=null] - A level node which defines the requested mip.\n * @returns {TextureSizeNode}\n */\nconst textureSize = /*@__PURE__*/ nodeProxy( TextureSizeNode ).setParameterLength( 1, 2 );\n\n/**\n * A special type of uniform node that computes the\n * maximum mipmap level for a given texture node.\n *\n * ```js\n * const level = maxMipLevel( textureNode );\n * ```\n *\n * @augments UniformNode\n */\nclass MaxMipLevelNode extends UniformNode {\n\n\tstatic get type() {\n\n\t\treturn 'MaxMipLevelNode';\n\n\t}\n\n\t/**\n\t * Constructs a new max mip level node.\n\t *\n\t * @param {TextureNode} textureNode - The texture node to compute the max mip level for.\n\t */\n\tconstructor( textureNode ) {\n\n\t\tsuper( 0 );\n\n\t\t/**\n\t\t * The texture node to compute the max mip level for.\n\t\t *\n\t\t * @private\n\t\t * @type {TextureNode}\n\t\t */\n\t\tthis._textureNode = textureNode;\n\n\t\t/**\n\t\t * The `updateType` is set to `NodeUpdateType.FRAME` since the node updates\n\t\t * the texture once per frame in its {@link MaxMipLevelNode#update} method.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'frame'\n\t\t */\n\t\tthis.updateType = NodeUpdateType.FRAME;\n\n\t}\n\n\t/**\n\t * The texture node to compute the max mip level for.\n\t *\n\t * @readonly\n\t * @type {TextureNode}\n\t */\n\tget textureNode() {\n\n\t\treturn this._textureNode;\n\n\t}\n\n\t/**\n\t * The texture.\n\t *\n\t * @readonly\n\t * @type {Texture}\n\t */\n\tget texture() {\n\n\t\treturn this._textureNode.value;\n\n\t}\n\n\tupdate() {\n\n\t\tconst texture = this.texture;\n\t\tconst images = texture.images;\n\t\tconst image = ( images && images.length > 0 ) ? ( ( images[ 0 ] && images[ 0 ].image ) || images[ 0 ] ) : texture.image;\n\n\t\tif ( image && image.width !== undefined ) {\n\n\t\t\tconst { width, height } = image;\n\n\t\t\tthis.value = Math.log2( Math.max( width, height ) );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * TSL function for creating a max mip level node.\n *\n * @tsl\n * @function\n * @param {TextureNode} textureNode - The texture node to compute the max mip level for.\n * @returns {MaxMipLevelNode}\n */\nconst maxMipLevel = /*@__PURE__*/ nodeProxy( MaxMipLevelNode ).setParameterLength( 1 );\n\nconst EmptyTexture$1 = /*@__PURE__*/ new Texture();\n\n/**\n * This type of uniform node represents a 2D texture.\n *\n * @augments UniformNode\n */\nclass TextureNode extends UniformNode {\n\n\tstatic get type() {\n\n\t\treturn 'TextureNode';\n\n\t}\n\n\t/**\n\t * Constructs a new texture node.\n\t *\n\t * @param {Texture} [value=EmptyTexture] - The texture.\n\t * @param {?Node<vec2|vec3>} [uvNode=null] - The uv node.\n\t * @param {?Node<int>} [levelNode=null] - The level node.\n\t * @param {?Node<float>} [biasNode=null] - The bias node.\n\t */\n\tconstructor( value = EmptyTexture$1, uvNode = null, levelNode = null, biasNode = null ) {\n\n\t\tsuper( value );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isTextureNode = true;\n\n\t\t/**\n\t\t * Represents the texture coordinates.\n\t\t *\n\t\t * @type {?Node<vec2|vec3>}\n\t\t * @default null\n\t\t */\n\t\tthis.uvNode = uvNode;\n\n\t\t/**\n\t\t * Represents the mip level that should be selected.\n\t\t *\n\t\t * @type {?Node<int>}\n\t\t * @default null\n\t\t */\n\t\tthis.levelNode = levelNode;\n\n\t\t/**\n\t\t * Represents the bias to be applied during level-of-detail computation.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.biasNode = biasNode;\n\n\t\t/**\n\t\t * Represents a reference value a texture sample is compared to.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.compareNode = null;\n\n\t\t/**\n\t\t * When using texture arrays, the depth node defines the layer to select.\n\t\t *\n\t\t * @type {?Node<int>}\n\t\t * @default null\n\t\t */\n\t\tthis.depthNode = null;\n\n\t\t/**\n\t\t * When defined, a texture is sampled using explicit gradients.\n\t\t *\n\t\t * @type {?Array<Node<vec2>>}\n\t\t * @default null\n\t\t */\n\t\tthis.gradNode = null;\n\n\t\t/**\n\t\t * Represents the optional texel offset applied to the unnormalized texture\n\t\t * coordinate before sampling the texture.\n\t\t *\n\t\t * @type {?Node<ivec2|ivec3>}\n\t\t * @default null\n\t\t */\n\t\tthis.offsetNode = null;\n\n\t\t/**\n\t\t * Whether texture values should be sampled or fetched.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sampler = true;\n\n\t\t/**\n\t\t * Whether the uv transformation matrix should be\n\t\t * automatically updated or not. Use `setUpdateMatrix()`\n\t\t * if you want to change the value of the property.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.updateMatrix = false;\n\n\t\t/**\n\t\t * By default the `update()` method is not executed. Depending on\n\t\t * whether a uv transformation matrix and/or flipY is applied, `update()`\n\t\t * is executed per object.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'none'\n\t\t */\n\t\tthis.updateType = NodeUpdateType.NONE;\n\n\t\t/**\n\t\t * The reference node.\n\t\t *\n\t\t * @type {?Node}\n\t\t * @default null\n\t\t */\n\t\tthis.referenceNode = null;\n\n\t\t/**\n\t\t * The texture value is stored in a private property.\n\t\t *\n\t\t * @private\n\t\t * @type {Texture}\n\t\t */\n\t\tthis._value = value;\n\n\t\t/**\n\t\t * The uniform node that represents the uv transformation matrix.\n\t\t *\n\t\t * @private\n\t\t * @type {?UniformNode<mat3>}\n\t\t * @default null\n\t\t */\n\t\tthis._matrixUniform = null;\n\n\t\t/**\n\t\t * The uniform node that represents the y-flip. Only required for WebGL.\n\t\t *\n\t\t * @private\n\t\t * @type {?UniformNode<bool>}\n\t\t * @default null\n\t\t */\n\t\tthis._flipYUniform = null;\n\n\t\tthis.setUpdateMatrix( uvNode === null );\n\n\t}\n\n\tset value( value ) {\n\n\t\tif ( this.referenceNode ) {\n\n\t\t\tthis.referenceNode.value = value;\n\n\t\t} else {\n\n\t\t\tthis._value = value;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * The texture value.\n\t *\n\t * @type {Texture}\n\t */\n\tget value() {\n\n\t\treturn this.referenceNode ? this.referenceNode.value : this._value;\n\n\t}\n\n\t/**\n\t * Overwritten since the uniform hash is defined by the texture's UUID.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The uniform hash.\n\t */\n\tgetUniformHash( /*builder*/ ) {\n\n\t\treturn this.value.uuid;\n\n\t}\n\n\t/**\n\t * Overwritten since the node type is inferred from the texture type.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The node type.\n\t */\n\tgetNodeType( /*builder*/ ) {\n\n\t\tif ( this.value.isDepthTexture === true ) return 'float';\n\n\t\tif ( this.value.type === UnsignedIntType ) {\n\n\t\t\treturn 'uvec4';\n\n\t\t} else if ( this.value.type === IntType ) {\n\n\t\t\treturn 'ivec4';\n\n\t\t}\n\n\t\treturn 'vec4';\n\n\t}\n\n\t/**\n\t * Overwrites the default implementation to return a fixed value `'texture'`.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The input type.\n\t */\n\tgetInputType( /*builder*/ ) {\n\n\t\treturn 'texture';\n\n\t}\n\n\t/**\n\t * Returns a default uvs based on the current texture's channel.\n\t *\n\t * @return {AttributeNode<vec2>} The default uvs.\n\t */\n\tgetDefaultUV() {\n\n\t\treturn uv$1( this.value.channel );\n\n\t}\n\n\t/**\n\t * Overwritten to always return the texture reference of the node.\n\t *\n\t * @param {any} state - This method can be invocated in different contexts so `state` can refer to any object type.\n\t * @return {Texture} The texture reference.\n\t */\n\tupdateReference( /*state*/ ) {\n\n\t\treturn this.value;\n\n\t}\n\n\t/**\n\t * Transforms the given uv node with the texture transformation matrix.\n\t *\n\t * @param {Node} uvNode - The uv node to transform.\n\t * @return {Node} The transformed uv node.\n\t */\n\tgetTransformedUV( uvNode ) {\n\n\t\tif ( this._matrixUniform === null ) this._matrixUniform = uniform( this.value.matrix );\n\n\t\treturn this._matrixUniform.mul( vec3( uvNode, 1 ) ).xy;\n\n\t}\n\n\t/**\n\t * Defines whether the uv transformation matrix should automatically be updated or not.\n\t *\n\t * @param {boolean} value - The update toggle.\n\t * @return {TextureNode} A reference to this node.\n\t */\n\tsetUpdateMatrix( value ) {\n\n\t\tthis.updateMatrix = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Setups the uv node. Depending on the backend as well as texture's image and type, it might be necessary\n\t * to modify the uv node for correct sampling.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @param {Node} uvNode - The uv node to setup.\n\t * @return {Node} The updated uv node.\n\t */\n\tsetupUV( builder, uvNode ) {\n\n\t\tif ( builder.isFlipY() ) {\n\n\t\t\tif ( this._flipYUniform === null ) this._flipYUniform = uniform( false );\n\n\t\t\tuvNode = uvNode.toVar();\n\n\t\t\tif ( this.sampler ) {\n\n\t\t\t\tuvNode = this._flipYUniform.select( uvNode.flipY(), uvNode );\n\n\t\t\t} else {\n\n\t\t\t\tuvNode = this._flipYUniform.select( uvNode.setY( int( textureSize( this, this.levelNode ).y ).sub( uvNode.y ).sub( 1 ) ), uvNode );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn uvNode;\n\n\t}\n\n\t/**\n\t * Setups texture node by preparing the internal nodes for code generation.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tsetup( builder ) {\n\n\t\tconst properties = builder.getNodeProperties( this );\n\t\tproperties.referenceNode = this.referenceNode;\n\n\t\t//\n\n\t\tconst texture = this.value;\n\n\t\tif ( ! texture || texture.isTexture !== true ) {\n\n\t\t\tthrow new Error( 'THREE.TSL: `texture( value )` function expects a valid instance of THREE.Texture().' );\n\n\t\t}\n\n\t\t//\n\n\t\tconst uvNode = Fn( () => {\n\n\t\t\tlet uvNode = this.uvNode;\n\n\t\t\tif ( ( uvNode === null || builder.context.forceUVContext === true ) && builder.context.getUV ) {\n\n\t\t\t\tuvNode = builder.context.getUV( this, builder );\n\n\t\t\t}\n\n\t\t\tif ( ! uvNode ) uvNode = this.getDefaultUV();\n\n\t\t\tif ( this.updateMatrix === true ) {\n\n\t\t\t\tuvNode = this.getTransformedUV( uvNode );\n\n\t\t\t}\n\n\t\t\tuvNode = this.setupUV( builder, uvNode );\n\n\t\t\t//\n\n\t\t\tthis.updateType = ( this._matrixUniform !== null || this._flipYUniform !== null ) ? NodeUpdateType.OBJECT : NodeUpdateType.NONE;\n\n\t\t\t//\n\n\t\t\treturn uvNode;\n\n\t\t} )();\n\n\t\t//\n\n\t\tlet levelNode = this.levelNode;\n\n\t\tif ( levelNode === null && builder.context.getTextureLevel ) {\n\n\t\t\tlevelNode = builder.context.getTextureLevel( this );\n\n\t\t}\n\n\t\t//\n\n\t\tproperties.uvNode = uvNode;\n\t\tproperties.levelNode = levelNode;\n\t\tproperties.biasNode = this.biasNode;\n\t\tproperties.compareNode = this.compareNode;\n\t\tproperties.gradNode = this.gradNode;\n\t\tproperties.depthNode = this.depthNode;\n\t\tproperties.offsetNode = this.offsetNode;\n\n\t}\n\n\t/**\n\t * Generates the uv code snippet.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @param {Node} uvNode - The uv node to generate code for.\n\t * @return {string} The generated code snippet.\n\t */\n\tgenerateUV( builder, uvNode ) {\n\n\t\treturn uvNode.build( builder, this.sampler === true ? 'vec2' : 'ivec2' );\n\n\t}\n\n\t/**\n\t * Generates the offset code snippet.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @param {Node} offsetNode - The offset node to generate code for.\n\t * @return {string} The generated code snippet.\n\t */\n\tgenerateOffset( builder, offsetNode ) {\n\n\t\treturn offsetNode.build( builder, 'ivec2' );\n\n\t}\n\n\t/**\n\t * Generates the snippet for the texture sampling.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @param {string} textureProperty - The texture property.\n\t * @param {string} uvSnippet - The uv snippet.\n\t * @param {?string} levelSnippet - The level snippet.\n\t * @param {?string} biasSnippet - The bias snippet.\n\t * @param {?string} depthSnippet - The depth snippet.\n\t * @param {?string} compareSnippet - The compare snippet.\n\t * @param {?Array<string>} gradSnippet - The grad snippet.\n\t * @param {?string} offsetSnippet - The offset snippet.\n\t * @return {string} The generated code snippet.\n\t */\n\tgenerateSnippet( builder, textureProperty, uvSnippet, levelSnippet, biasSnippet, depthSnippet, compareSnippet, gradSnippet, offsetSnippet ) {\n\n\t\tconst texture = this.value;\n\n\t\tlet snippet;\n\n\t\tif ( biasSnippet ) {\n\n\t\t\tsnippet = builder.generateTextureBias( texture, textureProperty, uvSnippet, biasSnippet, depthSnippet, offsetSnippet );\n\n\t\t} else if ( gradSnippet ) {\n\n\t\t\tsnippet = builder.generateTextureGrad( texture, textureProperty, uvSnippet, gradSnippet, depthSnippet, offsetSnippet );\n\n\t\t} else if ( compareSnippet ) {\n\n\t\t\tsnippet = builder.generateTextureCompare( texture, textureProperty, uvSnippet, compareSnippet, depthSnippet, offsetSnippet );\n\n\t\t} else if ( this.sampler === false ) {\n\n\t\t\tsnippet = builder.generateTextureLoad( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet, offsetSnippet );\n\n\t\t} else if ( levelSnippet ) {\n\n\t\t\tsnippet = builder.generateTextureLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet, offsetSnippet );\n\n\t\t} else {\n\n\t\t\tsnippet = builder.generateTexture( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet );\n\n\t\t}\n\n\t\treturn snippet;\n\n\t}\n\n\t/**\n\t * Generates the code snippet of the texture node.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @param {string} output - The current output.\n\t * @return {string} The generated code snippet.\n\t */\n\tgenerate( builder, output ) {\n\n\t\tconst texture = this.value;\n\n\t\tconst properties = builder.getNodeProperties( this );\n\t\tconst textureProperty = super.generate( builder, 'property' );\n\n\t\tif ( /^sampler/.test( output ) ) {\n\n\t\t\treturn textureProperty + '_sampler';\n\n\t\t} else if ( builder.isReference( output ) ) {\n\n\t\t\treturn textureProperty;\n\n\t\t} else {\n\n\t\t\tconst nodeData = builder.getDataFromNode( this );\n\n\t\t\tlet propertyName = nodeData.propertyName;\n\n\t\t\tif ( propertyName === undefined ) {\n\n\t\t\t\tconst { uvNode, levelNode, biasNode, compareNode, depthNode, gradNode, offsetNode } = properties;\n\n\t\t\t\tconst uvSnippet = this.generateUV( builder, uvNode );\n\t\t\t\tconst levelSnippet = levelNode ? levelNode.build( builder, 'float' ) : null;\n\t\t\t\tconst biasSnippet = biasNode ? biasNode.build( builder, 'float' ) : null;\n\t\t\t\tconst depthSnippet = depthNode ? depthNode.build( builder, 'int' ) : null;\n\t\t\t\tconst compareSnippet = compareNode ? compareNode.build( builder, 'float' ) : null;\n\t\t\t\tconst gradSnippet = gradNode ? [ gradNode[ 0 ].build( builder, 'vec2' ), gradNode[ 1 ].build( builder, 'vec2' ) ] : null;\n\t\t\t\tconst offsetSnippet = offsetNode ? this.generateOffset( builder, offsetNode ) : null;\n\n\t\t\t\tconst nodeVar = builder.getVarFromNode( this );\n\n\t\t\t\tpropertyName = builder.getPropertyName( nodeVar );\n\n\t\t\t\tconst snippet = this.generateSnippet( builder, textureProperty, uvSnippet, levelSnippet, biasSnippet, depthSnippet, compareSnippet, gradSnippet, offsetSnippet );\n\n\t\t\t\tbuilder.addLineFlowCode( `${propertyName} = ${snippet}`, this );\n\n\t\t\t\tnodeData.snippet = snippet;\n\t\t\t\tnodeData.propertyName = propertyName;\n\n\t\t\t}\n\n\t\t\tlet snippet = propertyName;\n\t\t\tconst nodeType = this.getNodeType( builder );\n\n\t\t\tif ( builder.needsToWorkingColorSpace( texture ) ) {\n\n\t\t\t\tsnippet = colorSpaceToWorking( expression( snippet, nodeType ), texture.colorSpace ).setup( builder ).build( builder, nodeType );\n\n\t\t\t}\n\n\t\t\treturn builder.format( snippet, nodeType, output );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the sampler value.\n\t *\n\t * @param {boolean} value - The sampler value to set.\n\t * @return {TextureNode} A reference to this texture node.\n\t */\n\tsetSampler( value ) {\n\n\t\tthis.sampler = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the sampler value.\n\t *\n\t * @return {boolean} The sampler value.\n\t */\n\tgetSampler() {\n\n\t\treturn this.sampler;\n\n\t}\n\n\t// @TODO: Move to TSL\n\n\t/**\n\t * @function\n\t * @deprecated since r172. Use {@link TextureNode#sample} instead.\n\t *\n\t * @param {Node} uvNode - The uv node.\n\t * @return {TextureNode} A texture node representing the texture sample.\n\t */\n\tuv( uvNode ) { // @deprecated, r172\n\n\t\twarn( 'TextureNode: .uv() has been renamed. Use .sample() instead.' );\n\n\t\treturn this.sample( uvNode );\n\n\t}\n\n\t/**\n\t * Samples the texture with the given uv node.\n\t *\n\t * @param {Node} uvNode - The uv node.\n\t * @return {TextureNode} A texture node representing the texture sample.\n\t */\n\tsample( uvNode ) {\n\n\t\tconst textureNode = this.clone();\n\t\ttextureNode.uvNode = nodeObject( uvNode );\n\t\ttextureNode.referenceNode = this.getBase();\n\n\t\treturn nodeObject( textureNode );\n\n\t}\n\n\t/**\n\t * TSL function for creating a texture node that fetches/loads texels without interpolation.\n\t *\n\t * @param {Node<uvec2>} uvNode - The uv node.\n\t * @returns {TextureNode} A texture node representing the texture load.\n\t */\n\tload( uvNode ) {\n\n\t\treturn this.sample( uvNode ).setSampler( false );\n\n\t}\n\n\t/**\n\t * Samples a blurred version of the texture by defining an internal bias.\n\t *\n\t * @param {Node<float>} amountNode - How blurred the texture should be.\n\t * @return {TextureNode} A texture node representing the texture sample.\n\t */\n\tblur( amountNode ) {\n\n\t\tconst textureNode = this.clone();\n\t\ttextureNode.biasNode = nodeObject( amountNode ).mul( maxMipLevel( textureNode ) );\n\t\ttextureNode.referenceNode = this.getBase();\n\n\t\tconst map = textureNode.value;\n\n\t\tif ( textureNode.generateMipmaps === false && ( map && map.generateMipmaps === false || map.minFilter === NearestFilter || map.magFilter === NearestFilter ) ) {\n\n\t\t\twarn( 'TSL: texture().blur() requires mipmaps and sampling. Use .generateMipmaps=true and .minFilter/.magFilter=THREE.LinearFilter in the Texture.' );\n\n\t\t\ttextureNode.biasNode = null;\n\n\t\t}\n\n\t\treturn nodeObject( textureNode );\n\n\t}\n\n\t/**\n\t * Samples a specific mip of the texture.\n\t *\n\t * @param {Node<int>} levelNode - The mip level to sample.\n\t * @return {TextureNode} A texture node representing the texture sample.\n\t */\n\tlevel( levelNode ) {\n\n\t\tconst textureNode = this.clone();\n\t\ttextureNode.levelNode = nodeObject( levelNode );\n\t\ttextureNode.referenceNode = this.getBase();\n\n\t\treturn nodeObject( textureNode );\n\n\t}\n\n\t/**\n\t * Returns the texture size of the requested level.\n\t *\n\t * @param {Node<int>} levelNode - The level to compute the size for.\n\t * @return {TextureSizeNode} The texture size.\n\t */\n\tsize( levelNode ) {\n\n\t\treturn textureSize( this, levelNode );\n\n\t}\n\n\t/**\n\t * Samples the texture with the given bias.\n\t *\n\t * @param {Node<float>} biasNode - The bias node.\n\t * @return {TextureNode} A texture node representing the texture sample.\n\t */\n\tbias( biasNode ) {\n\n\t\tconst textureNode = this.clone();\n\t\ttextureNode.biasNode = nodeObject( biasNode );\n\t\ttextureNode.referenceNode = this.getBase();\n\n\t\treturn nodeObject( textureNode );\n\n\t}\n\n\t/**\n\t * Returns the base texture of this node.\n\t * @return {TextureNode} The base texture node.\n\t */\n\tgetBase() {\n\n\t\treturn this.referenceNode ? this.referenceNode.getBase() : this;\n\n\t}\n\n\t/**\n\t * Samples the texture by executing a compare operation.\n\t *\n\t * @param {Node<float>} compareNode - The node that defines the compare value.\n\t * @return {TextureNode} A texture node representing the texture sample.\n\t */\n\tcompare( compareNode ) {\n\n\t\tconst textureNode = this.clone();\n\t\ttextureNode.compareNode = nodeObject( compareNode );\n\t\ttextureNode.referenceNode = this.getBase();\n\n\t\treturn nodeObject( textureNode );\n\n\t}\n\n\t/**\n\t * Samples the texture using an explicit gradient.\n\t *\n\t * @param {Node<vec2>} gradNodeX - The gradX node.\n\t * @param {Node<vec2>} gradNodeY - The gradY node.\n\t * @return {TextureNode} A texture node representing the texture sample.\n\t */\n\tgrad( gradNodeX, gradNodeY ) {\n\n\t\tconst textureNode = this.clone();\n\t\ttextureNode.gradNode = [ nodeObject( gradNodeX ), nodeObject( gradNodeY ) ];\n\t\ttextureNode.referenceNode = this.getBase();\n\n\t\treturn nodeObject( textureNode );\n\n\t}\n\n\t/**\n\t * Samples the texture by defining a depth node.\n\t *\n\t * @param {Node<int>} depthNode - The depth node.\n\t * @return {TextureNode} A texture node representing the texture sample.\n\t */\n\tdepth( depthNode ) {\n\n\t\tconst textureNode = this.clone();\n\t\ttextureNode.depthNode = nodeObject( depthNode );\n\t\ttextureNode.referenceNode = this.getBase();\n\n\t\treturn nodeObject( textureNode );\n\n\t}\n\n\t/**\n\t * Samples the texture by defining an offset node.\n\t *\n\t * @param {Node<ivec2>} offsetNode - The offset node.\n\t * @return {TextureNode} A texture node representing the texture sample.\n\t */\n\toffset( offsetNode ) {\n\n\t\tconst textureNode = this.clone();\n\t\ttextureNode.offsetNode = nodeObject( offsetNode );\n\t\ttextureNode.referenceNode = this.getBase();\n\n\t\treturn nodeObject( textureNode );\n\n\t}\n\n\t// --\n\n\tserialize( data ) {\n\n\t\tsuper.serialize( data );\n\n\t\tdata.value = this.value.toJSON( data.meta ).uuid;\n\t\tdata.sampler = this.sampler;\n\t\tdata.updateMatrix = this.updateMatrix;\n\t\tdata.updateType = this.updateType;\n\n\t}\n\n\tdeserialize( data ) {\n\n\t\tsuper.deserialize( data );\n\n\t\tthis.value = data.meta.textures[ data.value ];\n\t\tthis.sampler = data.sampler;\n\t\tthis.updateMatrix = data.updateMatrix;\n\t\tthis.updateType = data.updateType;\n\n\t}\n\n\t/**\n\t * The update is used to implement the update of the uv transformation matrix.\n\t */\n\tupdate() {\n\n\t\tconst texture = this.value;\n\t\tconst matrixUniform = this._matrixUniform;\n\n\t\tif ( matrixUniform !== null ) matrixUniform.value = texture.matrix;\n\n\t\tif ( texture.matrixAutoUpdate === true ) {\n\n\t\t\ttexture.updateMatrix();\n\n\t\t}\n\n\t\t//\n\n\t\tconst flipYUniform = this._flipYUniform;\n\n\t\tif ( flipYUniform !== null ) {\n\n\t\t\tflipYUniform.value = ( ( texture.image instanceof ImageBitmap && texture.flipY === true ) || texture.isRenderTargetTexture === true || texture.isFramebufferTexture === true || texture.isDepthTexture === true );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Clones the texture node.\n\t *\n\t * @return {TextureNode} The cloned texture node.\n\t */\n\tclone() {\n\n\t\tconst newNode = new this.constructor( this.value, this.uvNode, this.levelNode, this.biasNode );\n\t\tnewNode.sampler = this.sampler;\n\t\tnewNode.depthNode = this.depthNode;\n\t\tnewNode.compareNode = this.compareNode;\n\t\tnewNode.gradNode = this.gradNode;\n\t\tnewNode.offsetNode = this.offsetNode;\n\n\t\treturn newNode;\n\n\t}\n\n}\n\n/**\n * TSL function for creating a texture node.\n *\n * @tsl\n * @function\n * @param {?Texture} value - The texture.\n * @param {?Node<vec2|vec3>} [uvNode=null] - The uv node.\n * @param {?Node<int>} [levelNode=null] - The level node.\n * @param {?Node<float>} [biasNode=null] - The bias node.\n * @returns {TextureNode}\n */\nconst textureBase = /*@__PURE__*/ nodeProxy( TextureNode ).setParameterLength( 1, 4 ).setName( 'texture' );\n\n/**\n * TSL function for creating a texture node or sample a texture node already existing.\n *\n * @tsl\n * @function\n * @param {?(Texture|TextureNode)} [value=EmptyTexture] - The texture.\n * @param {?Node<vec2|vec3>} [uvNode=null] - The uv node.\n * @param {?Node<int>} [levelNode=null] - The level node.\n * @param {?Node<float>} [biasNode=null] - The bias node.\n * @returns {TextureNode}\n */\nconst texture = ( value = EmptyTexture$1, uvNode = null, levelNode = null, biasNode = null ) => {\n\n\tlet textureNode;\n\n\tif ( value && value.isTextureNode === true ) {\n\n\t\ttextureNode = nodeObject( value.clone() );\n\t\ttextureNode.referenceNode = value.getBase(); // Ensure the reference is set to the original node\n\n\t\tif ( uvNode !== null ) textureNode.uvNode = nodeObject( uvNode );\n\t\tif ( levelNode !== null ) textureNode.levelNode = nodeObject( levelNode );\n\t\tif ( biasNode !== null ) textureNode.biasNode = nodeObject( biasNode );\n\n\t} else {\n\n\t\ttextureNode = textureBase( value, uvNode, levelNode, biasNode );\n\n\t}\n\n\treturn textureNode;\n\n};\n\n/**\n * TSL function for creating a uniform texture node.\n *\n * @tsl\n * @function\n * @param {?Texture} value - The texture.\n * @returns {TextureNode}\n */\nconst uniformTexture = ( value = EmptyTexture$1 ) => texture( value );\n\n/**\n * TSL function for creating a texture node that fetches/loads texels without interpolation.\n *\n * @tsl\n * @function\n * @param {?(Texture|TextureNode)} [value=EmptyTexture] - The texture.\n * @param {?Node<vec2|vec3>} [uvNode=null] - The uv node.\n * @param {?Node<int>} [levelNode=null] - The level node.\n * @param {?Node<float>} [biasNode=null] - The bias node.\n * @returns {TextureNode}\n */\nconst textureLoad = ( ...params ) => texture( ...params ).setSampler( false );\n\nconst textureLevel = ( value, uv, level ) => texture( value, uv ).level( level );\n\n/**\n * Converts a texture or texture node to a sampler.\n *\n * @tsl\n * @function\n * @param {TextureNode|Texture} value - The texture or texture node to convert.\n * @returns {Node}\n */\nconst sampler = ( value ) => ( value.isNode === true ? value : texture( value ) ).convert( 'sampler' );\n\n/**\n * Converts a texture or texture node to a sampler comparison.\n *\n * @tsl\n * @function\n * @param {TextureNode|Texture} value - The texture or texture node to convert.\n * @returns {Node}\n */\nconst samplerComparison = ( value ) => ( value.isNode === true ? value : texture( value ) ).convert( 'samplerComparison' );\n\n/**\n * A special type of uniform node which represents array-like data\n * as uniform buffers. The access usually happens via `element()`\n * which returns an instance of {@link ArrayElementNode}. For example:\n *\n * ```js\n * const bufferNode = buffer( array, 'mat4', count );\n * const matrixNode = bufferNode.element( index ); // access a matrix from the buffer\n * ```\n * In general, it is recommended to use the more managed {@link UniformArrayNode}\n * since it handles more input types and automatically cares about buffer paddings.\n *\n * @augments UniformNode\n */\nclass BufferNode extends UniformNode {\n\n\tstatic get type() {\n\n\t\treturn 'BufferNode';\n\n\t}\n\n\t/**\n\t * Constructs a new buffer node.\n\t *\n\t * @param {Array<number>} value - Array-like buffer data.\n\t * @param {string} bufferType - The data type of the buffer.\n\t * @param {number} [bufferCount=0] - The count of buffer elements.\n\t */\n\tconstructor( value, bufferType, bufferCount = 0 ) {\n\n\t\tsuper( value, bufferType );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBufferNode = true;\n\n\t\t/**\n\t\t * The data type of the buffer.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.bufferType = bufferType;\n\n\t\t/**\n\t\t * The uniform node that holds the value of the reference node.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.bufferCount = bufferCount;\n\n\t\t/**\n\t\t * An array of update ranges.\n\t\t *\n\t\t * @type {Array<{start: number, count: number}>}\n\t\t */\n\t\tthis.updateRanges = [];\n\n\t}\n\n\t/**\n\t * Adds a range of data in the data array to be updated on the GPU.\n\t *\n\t * @param {number} start - Position at which to start update.\n\t * @param {number} count - The number of components to update.\n\t */\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\t/**\n\t * Clears the update ranges.\n\t */\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\t/**\n\t * The data type of the buffer elements.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The element type.\n\t */\n\tgetElementType( builder ) {\n\n\t\treturn this.getNodeType( builder );\n\n\t}\n\n\t/**\n\t * Overwrites the default implementation to return a fixed value `'buffer'`.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The input type.\n\t */\n\tgetInputType( /*builder*/ ) {\n\n\t\treturn 'buffer';\n\n\t}\n\n}\n\n/**\n * TSL function for creating a buffer node.\n *\n * @tsl\n * @function\n * @param {Array<number>} value - Array-like buffer data.\n * @param {string} type - The data type of a buffer element.\n * @param {number} count - The count of buffer elements.\n * @returns {BufferNode}\n */\nconst buffer = ( value, type, count ) => new BufferNode( value, type, count );\n\n/**\n * Represents the element access on uniform array nodes.\n *\n * @augments ArrayElementNode\n */\nclass UniformArrayElementNode extends ArrayElementNode {\n\n\tstatic get type() {\n\n\t\treturn 'UniformArrayElementNode';\n\n\t}\n\n\t/**\n\t * Constructs a new buffer node.\n\t *\n\t * @param {UniformArrayNode} uniformArrayNode - The uniform array node to access.\n\t * @param {IndexNode} indexNode - The index data that define the position of the accessed element in the array.\n\t */\n\tconstructor( uniformArrayNode, indexNode ) {\n\n\t\tsuper( uniformArrayNode, indexNode );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isArrayBufferElementNode = true;\n\n\t}\n\n\tgenerate( builder ) {\n\n\t\tconst snippet = super.generate( builder );\n\t\tconst type = this.getNodeType();\n\t\tconst paddedType = this.node.getPaddedType();\n\n\t\treturn builder.format( snippet, paddedType, type );\n\n\t}\n\n}\n\n/**\n * Similar to {@link BufferNode} this module represents array-like data as\n * uniform buffers. Unlike {@link BufferNode}, it can handle more common\n * data types in the array (e.g `three.js` primitives) and automatically\n * manage buffer padding. It should be the first choice when working with\n * uniforms buffers.\n * ```js\n * const tintColors = uniformArray( [\n * \tnew Color( 1, 0, 0 ),\n * \tnew Color( 0, 1, 0 ),\n * \tnew Color( 0, 0, 1 )\n * ], 'color' );\n *\n * const redColor = tintColors.element( 0 );\n *\n * @augments BufferNode\n */\nclass UniformArrayNode extends BufferNode {\n\n\tstatic get type() {\n\n\t\treturn 'UniformArrayNode';\n\n\t}\n\n\t/**\n\t * Constructs a new uniform array node.\n\t *\n\t * @param {Array<any>} value - Array holding the buffer data.\n\t * @param {?string} [elementType=null] - The data type of a buffer element.\n\t */\n\tconstructor( value, elementType = null ) {\n\n\t\tsuper( null );\n\n\t\t/**\n\t\t * Array holding the buffer data. Unlike {@link BufferNode}, the array can\n\t\t * hold number primitives as well as three.js objects like vectors, matrices\n\t\t * or colors.\n\t\t *\n\t\t * @type {Array<any>}\n\t\t */\n\t\tthis.array = value;\n\n\t\t/**\n\t\t * The data type of an array element.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.elementType = elementType === null ? getValueType( value[ 0 ] ) : elementType;\n\n\t\t/**\n\t\t * The padded type. Uniform buffers must conform to a certain buffer layout\n\t\t * so a separate type is computed to ensure correct buffer size.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.paddedType = this.getPaddedType();\n\n\t\t/**\n\t\t * Overwritten since uniform array nodes are updated per render.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'render'\n\t\t */\n\t\tthis.updateType = NodeUpdateType.RENDER;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isArrayBufferNode = true;\n\n\t}\n\n\t/**\n\t * This method is overwritten since the node type is inferred from the\n\t * {@link UniformArrayNode#paddedType}.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The node type.\n\t */\n\tgetNodeType( /*builder*/ ) {\n\n\t\treturn this.paddedType;\n\n\t}\n\n\t/**\n\t * The data type of the array elements.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The element type.\n\t */\n\tgetElementType() {\n\n\t\treturn this.elementType;\n\n\t}\n\n\t/**\n\t * Returns the padded type based on the element type.\n\t *\n\t * @return {string} The padded type.\n\t */\n\tgetPaddedType() {\n\n\t\tconst elementType = this.elementType;\n\n\t\tlet paddedType = 'vec4';\n\n\t\tif ( elementType === 'mat2' ) {\n\n\t\t\tpaddedType = 'mat2';\n\n\t\t} else if ( /mat/.test( elementType ) === true ) {\n\n\t\t\tpaddedType = 'mat4';\n\n\t\t} else if ( elementType.charAt( 0 ) === 'i' ) {\n\n\t\t\tpaddedType = 'ivec4';\n\n\t\t} else if ( elementType.charAt( 0 ) === 'u' ) {\n\n\t\t\tpaddedType = 'uvec4';\n\n\t\t}\n\n\t\treturn paddedType;\n\n\t}\n\n\t/**\n\t * The update makes sure to correctly transfer the data from the (complex) objects\n\t * in the array to the internal, correctly padded value buffer.\n\t *\n\t * @param {NodeFrame} frame - A reference to the current node frame.\n\t */\n\tupdate( /*frame*/ ) {\n\n\t\tconst { array, value } = this;\n\n\t\tconst elementType = this.elementType;\n\n\t\tif ( elementType === 'float' || elementType === 'int' || elementType === 'uint' ) {\n\n\t\t\tfor ( let i = 0; i < array.length; i ++ ) {\n\n\t\t\t\tconst index = i * 4;\n\n\t\t\t\tvalue[ index ] = array[ i ];\n\n\t\t\t}\n\n\t\t} else if ( elementType === 'color' ) {\n\n\t\t\tfor ( let i = 0; i < array.length; i ++ ) {\n\n\t\t\t\tconst index = i * 4;\n\t\t\t\tconst vector = array[ i ];\n\n\t\t\t\tvalue[ index ] = vector.r;\n\t\t\t\tvalue[ index + 1 ] = vector.g;\n\t\t\t\tvalue[ index + 2 ] = vector.b || 0;\n\t\t\t\t//value[ index + 3 ] = vector.a || 0;\n\n\t\t\t}\n\n\t\t} else if ( elementType === 'mat2' ) {\n\n\t\t\tfor ( let i = 0; i < array.length; i ++ ) {\n\n\t\t\t\tconst index = i * 4;\n\t\t\t\tconst matrix = array[ i ];\n\n\t\t\t\tvalue[ index ] = matrix.elements[ 0 ];\n\t\t\t\tvalue[ index + 1 ] = matrix.elements[ 1 ];\n\t\t\t\tvalue[ index + 2 ] = matrix.elements[ 2 ];\n\t\t\t\tvalue[ index + 3 ] = matrix.elements[ 3 ];\n\n\t\t\t}\n\n\t\t} else if ( elementType === 'mat3' ) {\n\n\t\t\tfor ( let i = 0; i < array.length; i ++ ) {\n\n\t\t\t\tconst index = i * 16;\n\t\t\t\tconst matrix = array[ i ];\n\n\t\t\t\tvalue[ index ] = matrix.elements[ 0 ];\n\t\t\t\tvalue[ index + 1 ] = matrix.elements[ 1 ];\n\t\t\t\tvalue[ index + 2 ] = matrix.elements[ 2 ];\n\n\t\t\t\tvalue[ index + 4 ] = matrix.elements[ 3 ];\n\t\t\t\tvalue[ index + 5 ] = matrix.elements[ 4 ];\n\t\t\t\tvalue[ index + 6 ] = matrix.elements[ 5 ];\n\n\t\t\t\tvalue[ index + 8 ] = matrix.elements[ 6 ];\n\t\t\t\tvalue[ index + 9 ] = matrix.elements[ 7 ];\n\t\t\t\tvalue[ index + 10 ] = matrix.elements[ 8 ];\n\n\t\t\t\tvalue[ index + 15 ] = 1;\n\n\t\t\t}\n\n\t\t} else if ( elementType === 'mat4' ) {\n\n\t\t\tfor ( let i = 0; i < array.length; i ++ ) {\n\n\t\t\t\tconst index = i * 16;\n\t\t\t\tconst matrix = array[ i ];\n\n\t\t\t\tfor ( let i = 0; i < matrix.elements.length; i ++ ) {\n\n\t\t\t\t\tvalue[ index + i ] = matrix.elements[ i ];\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0; i < array.length; i ++ ) {\n\n\t\t\t\tconst index = i * 4;\n\t\t\t\tconst vector = array[ i ];\n\n\t\t\t\tvalue[ index ] = vector.x;\n\t\t\t\tvalue[ index + 1 ] = vector.y;\n\t\t\t\tvalue[ index + 2 ] = vector.z || 0;\n\t\t\t\tvalue[ index + 3 ] = vector.w || 0;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Implement the value buffer creation based on the array data.\n\t *\n\t * @param {NodeBuilder} builder - A reference to the current node builder.\n\t * @return {null}\n\t */\n\tsetup( builder ) {\n\n\t\tconst length = this.array.length;\n\t\tconst elementType = this.elementType;\n\n\t\tlet arrayType = Float32Array;\n\n\t\tconst paddedType = this.paddedType;\n\t\tconst paddedElementLength = builder.getTypeLength( paddedType );\n\n\t\tif ( elementType.charAt( 0 ) === 'i' ) arrayType = Int32Array;\n\t\tif ( elementType.charAt( 0 ) === 'u' ) arrayType = Uint32Array;\n\n\t\tthis.value = new arrayType( length * paddedElementLength );\n\t\tthis.bufferCount = length;\n\t\tthis.bufferType = paddedType;\n\n\t\treturn super.setup( builder );\n\n\t}\n\n\t/**\n\t * Overwrites the default `element()` method to provide element access\n\t * based on {@link UniformArrayNode}.\n\t *\n\t * @param {IndexNode} indexNode - The index node.\n\t * @return {UniformArrayElementNode}\n\t */\n\telement( indexNode ) {\n\n\t\treturn new UniformArrayElementNode( this, nodeObject( indexNode ) );\n\n\t}\n\n}\n\n/**\n * TSL function for creating an uniform array node.\n *\n * @tsl\n * @function\n * @param {Array<any>} values - Array-like data.\n * @param {?string} [nodeType] - The data type of the array elements.\n * @returns {UniformArrayNode}\n */\nconst uniformArray = ( values, nodeType ) => new UniformArrayNode( values, nodeType );\n\n/**\n * The node allows to set values for built-in shader variables. That is\n * required for features like hardware-accelerated vertex clipping.\n *\n * @augments Node\n */\nclass BuiltinNode extends Node {\n\n\t/**\n\t * Constructs a new builtin node.\n\t *\n\t * @param {string} name - The name of the built-in shader variable.\n\t */\n\tconstructor( name ) {\n\n\t\tsuper( 'float' );\n\n\t\t/**\n\t\t * The name of the built-in shader variable.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBuiltinNode = true;\n\n\t}\n\n\t/**\n\t * Generates the code snippet of the builtin node.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The generated code snippet.\n\t */\n\tgenerate( /* builder */ ) {\n\n\t\treturn this.name;\n\n\t}\n\n}\n\n/**\n * TSL function for creating a builtin node.\n *\n * @tsl\n * @function\n * @param {string} name - The name of the built-in shader variable.\n * @returns {BuiltinNode}\n */\nconst builtin = nodeProxy( BuiltinNode ).setParameterLength( 1 );\n\nlet _screenSizeVec, _viewportVec;\n\n/**\n * This node provides a collection of screen related metrics.\n * Depending on {@link ScreenNode#scope}, the nodes can represent\n * resolution or viewport data as well as fragment or uv coordinates.\n *\n * @augments Node\n */\nclass ScreenNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'ScreenNode';\n\n\t}\n\n\t/**\n\t * Constructs a new screen node.\n\t *\n\t * @param {('coordinate'|'viewport'|'size'|'uv'|'dpr')} scope - The node's scope.\n\t */\n\tconstructor( scope ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The node represents different metric depending on which scope is selected.\n\t\t *\n\t\t * - `ScreenNode.COORDINATE`: Window-relative coordinates of the current fragment according to WebGPU standards.\n\t\t * - `ScreenNode.VIEWPORT`: The current viewport defined as a four-dimensional vector.\n\t\t * - `ScreenNode.SIZE`: The dimensions of the current bound framebuffer.\n\t\t * - `ScreenNode.UV`: Normalized coordinates.\n\t\t * - `ScreenNode.DPR`: Device pixel ratio.\n\t\t *\n\t\t * @type {('coordinate'|'viewport'|'size'|'uv'|'dpr')}\n\t\t */\n\t\tthis.scope = scope;\n\n\t\t/**\n\t\t * This output node.\n\t\t *\n\t\t * @private\n\t\t * @type {?Node}\n\t\t * @default null\n\t\t */\n\t\tthis._output = null;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isViewportNode = true;\n\n\t}\n\n\t/**\n\t * This method is overwritten since the node type depends on the selected scope.\n\t *\n\t * @return {('float'|'vec2'|'vec4')} The node type.\n\t */\n\tgetNodeType() {\n\n\t\tif ( this.scope === ScreenNode.DPR ) return 'float';\n\t\tif ( this.scope === ScreenNode.VIEWPORT ) return 'vec4';\n\t\telse return 'vec2';\n\n\t}\n\n\t/**\n\t * This method is overwritten since the node's update type depends on the selected scope.\n\t *\n\t * @return {NodeUpdateType} The update type.\n\t */\n\tgetUpdateType() {\n\n\t\tlet updateType = NodeUpdateType.NONE;\n\n\t\tif ( this.scope === ScreenNode.SIZE || this.scope === ScreenNode.VIEWPORT || this.scope === ScreenNode.DPR ) {\n\n\t\t\tupdateType = NodeUpdateType.RENDER;\n\n\t\t}\n\n\t\tthis.updateType = updateType;\n\n\t\treturn updateType;\n\n\t}\n\n\t/**\n\t * `ScreenNode` implements {@link Node#update} to retrieve viewport and size information\n\t * from the current renderer.\n\t *\n\t * @param {NodeFrame} frame - A reference to the current node frame.\n\t */\n\tupdate( { renderer } ) {\n\n\t\tconst renderTarget = renderer.getRenderTarget();\n\n\t\tif ( this.scope === ScreenNode.VIEWPORT ) {\n\n\t\t\tif ( renderTarget !== null ) {\n\n\t\t\t\t_viewportVec.copy( renderTarget.viewport );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.getViewport( _viewportVec );\n\n\t\t\t\t_viewportVec.multiplyScalar( renderer.getPixelRatio() );\n\n\t\t\t}\n\n\t\t} else if ( this.scope === ScreenNode.DPR ) {\n\n\t\t\tthis._output.value = renderer.getPixelRatio();\n\n\t\t} else {\n\n\t\t\tif ( renderTarget !== null ) {\n\n\t\t\t\t_screenSizeVec.width = renderTarget.width;\n\t\t\t\t_screenSizeVec.height = renderTarget.height;\n\n\t\t\t} else {\n\n\t\t\t\trenderer.getDrawingBufferSize( _screenSizeVec );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tsetup( /*builder*/ ) {\n\n\t\tconst scope = this.scope;\n\n\t\tlet output = null;\n\n\t\tif ( scope === ScreenNode.SIZE ) {\n\n\t\t\toutput = uniform( _screenSizeVec || ( _screenSizeVec = new Vector2() ) );\n\n\t\t} else if ( scope === ScreenNode.VIEWPORT ) {\n\n\t\t\toutput = uniform( _viewportVec || ( _viewportVec = new Vector4() ) );\n\n\t\t} else if ( scope === ScreenNode.DPR ) {\n\n\t\t\toutput = uniform( 1 );\n\n\t\t} else {\n\n\t\t\toutput = vec2( screenCoordinate.div( screenSize ) );\n\n\t\t}\n\n\t\tthis._output = output;\n\n\t\treturn output;\n\n\t}\n\n\tgenerate( builder ) {\n\n\t\tif ( this.scope === ScreenNode.COORDINATE ) {\n\n\t\t\tlet coord = builder.getFragCoord();\n\n\t\t\tif ( builder.isFlipY() ) {\n\n\t\t\t\t// follow webgpu standards\n\n\t\t\t\tconst size = builder.getNodeProperties( screenSize ).outputNode.build( builder );\n\n\t\t\t\tcoord = `${ builder.getType( 'vec2' ) }( ${ coord }.x, ${ size }.y - ${ coord }.y )`;\n\n\t\t\t}\n\n\t\t\treturn coord;\n\n\t\t}\n\n\t\treturn super.generate( builder );\n\n\t}\n\n}\n\nScreenNode.COORDINATE = 'coordinate';\nScreenNode.VIEWPORT = 'viewport';\nScreenNode.SIZE = 'size';\nScreenNode.UV = 'uv';\nScreenNode.DPR = 'dpr';\n\n// Screen\n\n/**\n * TSL object that represents the current DPR.\n *\n * @tsl\n * @type {ScreenNode<float>}\n */\nconst screenDPR = /*@__PURE__*/ nodeImmutable( ScreenNode, ScreenNode.DPR );\n\n/**\n * TSL object that represents normalized screen coordinates, unitless in `[0, 1]`.\n *\n * @tsl\n * @type {ScreenNode<vec2>}\n */\nconst screenUV = /*@__PURE__*/ nodeImmutable( ScreenNode, ScreenNode.UV );\n\n/**\n * TSL object that represents the screen resolution in physical pixel units.\n *\n * @tsl\n * @type {ScreenNode<vec2>}\n */\nconst screenSize = /*@__PURE__*/ nodeImmutable( ScreenNode, ScreenNode.SIZE );\n\n/**\n * TSL object that represents the current `x`/`y` pixel position on the screen in physical pixel units.\n *\n * @tsl\n * @type {ScreenNode<vec2>}\n */\nconst screenCoordinate = /*@__PURE__*/ nodeImmutable( ScreenNode, ScreenNode.COORDINATE );\n\n// Viewport\n\n/**\n * TSL object that represents the viewport rectangle as `x`, `y`, `width` and `height` in physical pixel units.\n *\n * @tsl\n * @type {ScreenNode<vec4>}\n */\nconst viewport = /*@__PURE__*/ nodeImmutable( ScreenNode, ScreenNode.VIEWPORT );\n\n/**\n * TSL object that represents the viewport resolution in physical pixel units.\n *\n * @tsl\n * @type {ScreenNode<vec2>}\n */\nconst viewportSize = viewport.zw;\n\n/**\n * TSL object that represents the current `x`/`y` pixel position on the viewport in physical pixel units.\n *\n * @tsl\n * @type {ScreenNode<vec2>}\n */\nconst viewportCoordinate = /*@__PURE__*/ screenCoordinate.sub( viewport.xy );\n\n/**\n * TSL object that represents normalized viewport coordinates, unitless in `[0, 1]`.\n *\n * @tsl\n * @type {ScreenNode<vec2>}\n */\nconst viewportUV = /*@__PURE__*/ viewportCoordinate.div( viewportSize );\n\n// Deprecated\n\n/**\n * @deprecated since r169. Use {@link screenSize} instead.\n */\nconst viewportResolution = /*@__PURE__*/ ( Fn( () => { // @deprecated, r169\n\n\twarn( 'TSL: \"viewportResolution\" is deprecated. Use \"screenSize\" instead.' );\n\n\treturn screenSize;\n\n}, 'vec2' ).once() )();\n\n/**\n * TSL object that represents the current `index` value of the camera if used ArrayCamera.\n *\n * @tsl\n * @type {UniformNode<uint>}\n */\nconst cameraIndex = /*@__PURE__*/ uniform( 0, 'uint' ).setName( 'u_cameraIndex' ).setGroup( sharedUniformGroup( 'cameraIndex' ) ).toVarying( 'v_cameraIndex' );\n\n/**\n * TSL object that represents the `near` value of the camera used for the current render.\n *\n * @tsl\n * @type {UniformNode<float>}\n */\nconst cameraNear = /*@__PURE__*/ uniform( 'float' ).setName( 'cameraNear' ).setGroup( renderGroup ).onRenderUpdate( ( { camera } ) => camera.near );\n\n/**\n * TSL object that represents the `far` value of the camera used for the current render.\n *\n * @tsl\n * @type {UniformNode<float>}\n */\nconst cameraFar = /*@__PURE__*/ uniform( 'float' ).setName( 'cameraFar' ).setGroup( renderGroup ).onRenderUpdate( ( { camera } ) => camera.far );\n\n/**\n * TSL object that represents the projection matrix of the camera used for the current render.\n *\n * @tsl\n * @type {UniformNode<mat4>}\n */\nconst cameraProjectionMatrix = /*@__PURE__*/ ( Fn( ( { camera } ) => {\n\n\tlet cameraProjectionMatrix;\n\n\tif ( camera.isArrayCamera && camera.cameras.length > 0 ) {\n\n\t\tconst matrices = [];\n\n\t\tfor ( const subCamera of camera.cameras ) {\n\n\t\t\tmatrices.push( subCamera.projectionMatrix );\n\n\t\t}\n\n\t\tconst cameraProjectionMatrices = uniformArray( matrices ).setGroup( renderGroup ).setName( 'cameraProjectionMatrices' );\n\n\t\tcameraProjectionMatrix = cameraProjectionMatrices.element( camera.isMultiViewCamera ? builtin( 'gl_ViewID_OVR' ) : cameraIndex ).toConst( 'cameraProjectionMatrix' );\n\n\t} else {\n\n\t\tcameraProjectionMatrix = uniform( 'mat4' ).setName( 'cameraProjectionMatrix' ).setGroup( renderGroup ).onRenderUpdate( ( { camera } ) => camera.projectionMatrix );\n\n\t}\n\n\treturn cameraProjectionMatrix;\n\n} ).once() )();\n\n/**\n * TSL object that represents the inverse projection matrix of the camera used for the current render.\n *\n * @tsl\n * @type {UniformNode<mat4>}\n */\nconst cameraProjectionMatrixInverse = /*@__PURE__*/ ( Fn( ( { camera } ) => {\n\n\tlet cameraProjectionMatrixInverse;\n\n\tif ( camera.isArrayCamera && camera.cameras.length > 0 ) {\n\n\t\tconst matrices = [];\n\n\t\tfor ( const subCamera of camera.cameras ) {\n\n\t\t\tmatrices.push( subCamera.projectionMatrixInverse );\n\n\t\t}\n\n\t\tconst cameraProjectionMatricesInverse = uniformArray( matrices ).setGroup( renderGroup ).setName( 'cameraProjectionMatricesInverse' );\n\n\t\tcameraProjectionMatrixInverse = cameraProjectionMatricesInverse.element( camera.isMultiViewCamera ? builtin( 'gl_ViewID_OVR' ) : cameraIndex ).toConst( 'cameraProjectionMatrixInverse' );\n\n\t} else {\n\n\t\tcameraProjectionMatrixInverse = uniform( 'mat4' ).setName( 'cameraProjectionMatrixInverse' ).setGroup( renderGroup ).onRenderUpdate( ( { camera } ) => camera.projectionMatrixInverse );\n\n\t}\n\n\treturn cameraProjectionMatrixInverse;\n\n} ).once() )();\n\n/**\n * TSL object that represents the view matrix of the camera used for the current render.\n *\n * @tsl\n * @type {UniformNode<mat4>}\n */\nconst cameraViewMatrix = /*@__PURE__*/ ( Fn( ( { camera } ) => {\n\n\tlet cameraViewMatrix;\n\n\tif ( camera.isArrayCamera && camera.cameras.length > 0 ) {\n\n\t\tconst matrices = [];\n\n\t\tfor ( const subCamera of camera.cameras ) {\n\n\t\t\tmatrices.push( subCamera.matrixWorldInverse );\n\n\t\t}\n\n\t\tconst cameraViewMatrices = uniformArray( matrices ).setGroup( renderGroup ).setName( 'cameraViewMatrices' );\n\n\t\tcameraViewMatrix = cameraViewMatrices.element( camera.isMultiViewCamera ? builtin( 'gl_ViewID_OVR' ) : cameraIndex ).toConst( 'cameraViewMatrix' );\n\n\t} else {\n\n\t\tcameraViewMatrix = uniform( 'mat4' ).setName( 'cameraViewMatrix' ).setGroup( renderGroup ).onRenderUpdate( ( { camera } ) => camera.matrixWorldInverse );\n\n\t}\n\n\treturn cameraViewMatrix;\n\n} ).once() )();\n\n/**\n * TSL object that represents the world matrix of the camera used for the current render.\n *\n * @tsl\n * @type {UniformNode<mat4>}\n */\nconst cameraWorldMatrix = /*@__PURE__*/ ( Fn( ( { camera } ) => {\n\n\tlet cameraWorldMatrix;\n\n\tif ( camera.isArrayCamera && camera.cameras.length > 0 ) {\n\n\t\tconst matrices = [];\n\n\t\tfor ( const subCamera of camera.cameras ) {\n\n\t\t\tmatrices.push( subCamera.matrixWorld );\n\n\t\t}\n\n\t\tconst cameraWorldMatrices = uniformArray( matrices ).setGroup( renderGroup ).setName( 'cameraWorldMatrices' );\n\n\t\tcameraWorldMatrix = cameraWorldMatrices.element( camera.isMultiViewCamera ? builtin( 'gl_ViewID_OVR' ) : cameraIndex ).toConst( 'cameraWorldMatrix' );\n\n\t} else {\n\n\t\tcameraWorldMatrix = uniform( 'mat4' ).setName( 'cameraWorldMatrix' ).setGroup( renderGroup ).onRenderUpdate( ( { camera } ) => camera.matrixWorld );\n\n\t}\n\n\treturn cameraWorldMatrix;\n\n} ).once() )();\n\n/**\n * TSL object that represents the normal matrix of the camera used for the current render.\n *\n * @tsl\n * @type {UniformNode<mat3>}\n */\nconst cameraNormalMatrix = /*@__PURE__*/ ( Fn( ( { camera } ) => {\n\n\tlet cameraNormalMatrix;\n\n\tif ( camera.isArrayCamera && camera.cameras.length > 0 ) {\n\n\t\tconst matrices = [];\n\n\t\tfor ( const subCamera of camera.cameras ) {\n\n\t\t\tmatrices.push( subCamera.normalMatrix );\n\n\t\t}\n\n\t\tconst cameraNormalMatrices = uniformArray( matrices ).setGroup( renderGroup ).setName( 'cameraNormalMatrices' );\n\n\t\tcameraNormalMatrix = cameraNormalMatrices.element( camera.isMultiViewCamera ? builtin( 'gl_ViewID_OVR' ) : cameraIndex ).toConst( 'cameraNormalMatrix' );\n\n\t} else {\n\n\t\tcameraNormalMatrix = uniform( 'mat3' ).setName( 'cameraNormalMatrix' ).setGroup( renderGroup ).onRenderUpdate( ( { camera } ) => camera.normalMatrix );\n\n\t}\n\n\treturn cameraNormalMatrix;\n\n} ).once() )();\n\n/**\n * TSL object that represents the position in world space of the camera used for the current render.\n *\n * @tsl\n * @type {UniformNode<vec3>}\n */\nconst cameraPosition = /*@__PURE__*/ ( Fn( ( { camera } ) => {\n\n\tlet cameraPosition;\n\n\tif ( camera.isArrayCamera && camera.cameras.length > 0 ) {\n\n\t\tconst positions = [];\n\n\t\tfor ( let i = 0, l = camera.cameras.length; i < l; i ++ ) {\n\n\t\t\tpositions.push( new Vector3() );\n\n\t\t}\n\n\t\tconst cameraPositions = uniformArray( positions ).setGroup( renderGroup ).setName( 'cameraPositions' ).onRenderUpdate( ( { camera }, self ) => {\n\n\t\t\tconst subCameras = camera.cameras;\n\t\t\tconst array = self.array;\n\n\t\t\tfor ( let i = 0, l = subCameras.length; i < l; i ++ ) {\n\n\t\t\t\tarray[ i ].setFromMatrixPosition( subCameras[ i ].matrixWorld );\n\n\t\t\t}\n\n\t\t} );\n\n\t\tcameraPosition = cameraPositions.element( camera.isMultiViewCamera ? builtin( 'gl_ViewID_OVR' ) : cameraIndex ).toConst( 'cameraPosition' );\n\n\t} else {\n\n\t\tcameraPosition = uniform( new Vector3() ).setName( 'cameraPosition' ).setGroup( renderGroup ).onRenderUpdate( ( { camera }, self ) => self.value.setFromMatrixPosition( camera.matrixWorld ) );\n\n\t}\n\n\treturn cameraPosition;\n\n} ).once() )();\n\n\n/**\n * TSL object that represents the viewport of the camera used for the current render.\n *\n * @tsl\n * @type {UniformNode<vec4>}\n */\nconst cameraViewport = /*@__PURE__*/ ( Fn( ( { camera } ) => {\n\n\tlet cameraViewport;\n\n\tif ( camera.isArrayCamera && camera.cameras.length > 0 ) {\n\n\t\tconst viewports = [];\n\n\t\tfor ( const subCamera of camera.cameras ) {\n\n\t\t\tviewports.push( subCamera.viewport );\n\n\t\t}\n\n\t\tconst cameraViewports = uniformArray( viewports, 'vec4' ).setGroup( renderGroup ).setName( 'cameraViewports' );\n\n\t\tcameraViewport = cameraViewports.element( cameraIndex ).toConst( 'cameraViewport' );\n\n\t} else {\n\n\t\t// Fallback for single camera\n\t\tcameraViewport = vec4( 0, 0, screenSize.x, screenSize.y ).toConst( 'cameraViewport' );\n\n\t}\n\n\treturn cameraViewport;\n\n} ).once() )();\n\nconst _sphere = /*@__PURE__*/ new Sphere();\n\n/**\n * This node can be used to access transformation related metrics of 3D objects.\n * Depending on the selected scope, a different metric is represented as a uniform\n * in the shader. The following scopes are supported:\n *\n * - `POSITION`: The object's position in world space.\n * - `VIEW_POSITION`: The object's position in view/camera space.\n * - `DIRECTION`: The object's direction in world space.\n * - `SCALE`: The object's scale in world space.\n * - `WORLD_MATRIX`: The object's matrix in world space.\n *\n * @augments Node\n */\nclass Object3DNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'Object3DNode';\n\n\t}\n\n\t/**\n\t * Constructs a new object 3D node.\n\t *\n\t * @param {('position'|'viewPosition'|'direction'|'scale'|'worldMatrix')} scope - The node represents a different type of transformation depending on the scope.\n\t * @param {?Object3D} [object3d=null] - The 3D object.\n\t */\n\tconstructor( scope, object3d = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The node reports a different type of transformation depending on the scope.\n\t\t *\n\t\t * @type {('position'|'viewPosition'|'direction'|'scale'|'worldMatrix')}\n\t\t */\n\t\tthis.scope = scope;\n\n\t\t/**\n\t\t * The 3D object.\n\t\t *\n\t\t * @type {?Object3D}\n\t\t * @default null\n\t\t */\n\t\tthis.object3d = object3d;\n\n\t\t/**\n\t\t * Overwritten since this type of node is updated per object.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'object'\n\t\t */\n\t\tthis.updateType = NodeUpdateType.OBJECT;\n\n\t\t/**\n\t\t * Holds the value of the node as a uniform.\n\t\t *\n\t\t * @type {UniformNode}\n\t\t */\n\t\tthis.uniformNode = new UniformNode( null );\n\n\t}\n\n\t/**\n\t * Overwritten since the node type is inferred from the scope.\n\t *\n\t * @return {('mat4'|'vec3'|'float')} The node type.\n\t */\n\tgetNodeType() {\n\n\t\tconst scope = this.scope;\n\n\t\tif ( scope === Object3DNode.WORLD_MATRIX ) {\n\n\t\t\treturn 'mat4';\n\n\t\t} else if ( scope === Object3DNode.POSITION || scope === Object3DNode.VIEW_POSITION || scope === Object3DNode.DIRECTION || scope === Object3DNode.SCALE ) {\n\n\t\t\treturn 'vec3';\n\n\t\t} else if ( scope === Object3DNode.RADIUS ) {\n\n\t\t\treturn 'float';\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the uniform value depending on the scope.\n\t *\n\t * @param {NodeFrame} frame - The current node frame.\n\t */\n\tupdate( frame ) {\n\n\t\tconst object = this.object3d;\n\t\tconst uniformNode = this.uniformNode;\n\t\tconst scope = this.scope;\n\n\t\tif ( scope === Object3DNode.WORLD_MATRIX ) {\n\n\t\t\tuniformNode.value = object.matrixWorld;\n\n\t\t} else if ( scope === Object3DNode.POSITION ) {\n\n\t\t\tuniformNode.value = uniformNode.value || new Vector3();\n\n\t\t\tuniformNode.value.setFromMatrixPosition( object.matrixWorld );\n\n\t\t} else if ( scope === Object3DNode.SCALE ) {\n\n\t\t\tuniformNode.value = uniformNode.value || new Vector3();\n\n\t\t\tuniformNode.value.setFromMatrixScale( object.matrixWorld );\n\n\t\t} else if ( scope === Object3DNode.DIRECTION ) {\n\n\t\t\tuniformNode.value = uniformNode.value || new Vector3();\n\n\t\t\tobject.getWorldDirection( uniformNode.value );\n\n\t\t} else if ( scope === Object3DNode.VIEW_POSITION ) {\n\n\t\t\tconst camera = frame.camera;\n\n\t\t\tuniformNode.value = uniformNode.value || new Vector3();\n\t\t\tuniformNode.value.setFromMatrixPosition( object.matrixWorld );\n\n\t\t\tuniformNode.value.applyMatrix4( camera.matrixWorldInverse );\n\n\t\t} else if ( scope === Object3DNode.RADIUS ) {\n\n\t\t\tconst geometry = frame.object.geometry;\n\n\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t_sphere.copy( geometry.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\t\tuniformNode.value = _sphere.radius;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Generates the code snippet of the uniform node. The node type of the uniform\n\t * node also depends on the selected scope.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The generated code snippet.\n\t */\n\tgenerate( builder ) {\n\n\t\tconst scope = this.scope;\n\n\t\tif ( scope === Object3DNode.WORLD_MATRIX ) {\n\n\t\t\tthis.uniformNode.nodeType = 'mat4';\n\n\t\t} else if ( scope === Object3DNode.POSITION || scope === Object3DNode.VIEW_POSITION || scope === Object3DNode.DIRECTION || scope === Object3DNode.SCALE ) {\n\n\t\t\tthis.uniformNode.nodeType = 'vec3';\n\n\t\t} else if ( scope === Object3DNode.RADIUS ) {\n\n\t\t\tthis.uniformNode.nodeType = 'float';\n\n\t\t}\n\n\t\treturn this.uniformNode.build( builder );\n\n\t}\n\n\tserialize( data ) {\n\n\t\tsuper.serialize( data );\n\n\t\tdata.scope = this.scope;\n\n\t}\n\n\tdeserialize( data ) {\n\n\t\tsuper.deserialize( data );\n\n\t\tthis.scope = data.scope;\n\n\t}\n\n}\n\nObject3DNode.WORLD_MATRIX = 'worldMatrix';\nObject3DNode.POSITION = 'position';\nObject3DNode.SCALE = 'scale';\nObject3DNode.VIEW_POSITION = 'viewPosition';\nObject3DNode.DIRECTION = 'direction';\nObject3DNode.RADIUS = 'radius';\n\n/**\n * TSL function for creating an object 3D node that represents the object's direction in world space.\n *\n * @tsl\n * @function\n * @param {?Object3D} [object3d] - The 3D object.\n * @returns {Object3DNode<vec3>}\n */\nconst objectDirection = /*@__PURE__*/ nodeProxy( Object3DNode, Object3DNode.DIRECTION ).setParameterLength( 1 );\n\n/**\n * TSL function for creating an object 3D node that represents the object's world matrix.\n *\n * @tsl\n * @function\n * @param {?Object3D} [object3d] - The 3D object.\n * @returns {Object3DNode<mat4>}\n */\nconst objectWorldMatrix = /*@__PURE__*/ nodeProxy( Object3DNode, Object3DNode.WORLD_MATRIX ).setParameterLength( 1 );\n\n/**\n * TSL function for creating an object 3D node that represents the object's position in world space.\n *\n * @tsl\n * @function\n * @param {?Object3D} [object3d] - The 3D object.\n * @returns {Object3DNode<vec3>}\n */\nconst objectPosition = /*@__PURE__*/ nodeProxy( Object3DNode, Object3DNode.POSITION ).setParameterLength( 1 );\n\n/**\n * TSL function for creating an object 3D node that represents the object's scale in world space.\n *\n * @tsl\n * @function\n * @param {?Object3D} [object3d] - The 3D object.\n * @returns {Object3DNode<vec3>}\n */\nconst objectScale = /*@__PURE__*/ nodeProxy( Object3DNode, Object3DNode.SCALE ).setParameterLength( 1 );\n\n/**\n * TSL function for creating an object 3D node that represents the object's position in view/camera space.\n *\n * @tsl\n * @function\n * @param {?Object3D} [object3d] - The 3D object.\n * @returns {Object3DNode<vec3>}\n */\nconst objectViewPosition = /*@__PURE__*/ nodeProxy( Object3DNode, Object3DNode.VIEW_POSITION ).setParameterLength( 1 );\n\n/**\n * TSL function for creating an object 3D node that represents the object's radius.\n *\n * @tsl\n * @function\n * @param {?Object3D} [object3d] - The 3D object.\n * @returns {Object3DNode<float>}\n */\nconst objectRadius = /*@__PURE__*/ nodeProxy( Object3DNode, Object3DNode.RADIUS ).setParameterLength( 1 );\n\n/**\n * This type of node is a specialized version of `Object3DNode`\n * with larger set of model related metrics. Unlike `Object3DNode`,\n * `ModelNode` extracts the reference to the 3D object from the\n * current node frame state.\n *\n * @augments Object3DNode\n */\nclass ModelNode extends Object3DNode {\n\n\tstatic get type() {\n\n\t\treturn 'ModelNode';\n\n\t}\n\n\t/**\n\t * Constructs a new object model node.\n\t *\n\t * @param {('position'|'viewPosition'|'direction'|'scale'|'worldMatrix')} scope - The node represents a different type of transformation depending on the scope.\n\t */\n\tconstructor( scope ) {\n\n\t\tsuper( scope );\n\n\t}\n\n\t/**\n\t * Extracts the model reference from the frame state and then\n\t * updates the uniform value depending on the scope.\n\t *\n\t * @param {NodeFrame} frame - The current node frame.\n\t */\n\tupdate( frame ) {\n\n\t\tthis.object3d = frame.object;\n\n\t\tsuper.update( frame );\n\n\t}\n\n}\n\n/**\n * TSL object that represents the object's direction in world space.\n *\n * @tsl\n * @type {ModelNode<vec3>}\n */\nconst modelDirection = /*@__PURE__*/ nodeImmutable( ModelNode, ModelNode.DIRECTION );\n\n/**\n * TSL object that represents the object's world matrix.\n *\n * @tsl\n * @type {ModelNode<mat4>}\n */\nconst modelWorldMatrix = /*@__PURE__*/ nodeImmutable( ModelNode, ModelNode.WORLD_MATRIX );\n\n/**\n * TSL object that represents the object's position in world space.\n *\n * @tsl\n * @type {ModelNode<vec3>}\n */\nconst modelPosition = /*@__PURE__*/ nodeImmutable( ModelNode, ModelNode.POSITION );\n\n/**\n * TSL object that represents the object's scale in world space.\n *\n * @tsl\n * @type {ModelNode<vec3>}\n */\nconst modelScale = /*@__PURE__*/ nodeImmutable( ModelNode, ModelNode.SCALE );\n\n/**\n * TSL object that represents the object's position in view/camera space.\n *\n * @tsl\n * @type {ModelNode<vec3>}\n */\nconst modelViewPosition = /*@__PURE__*/ nodeImmutable( ModelNode, ModelNode.VIEW_POSITION );\n\n/**\n * TSL object that represents the object's radius.\n *\n * @tsl\n * @type {ModelNode<float>}\n */\nconst modelRadius = /*@__PURE__*/ nodeImmutable( ModelNode, ModelNode.RADIUS );\n\n/**\n * TSL object that represents the object's normal matrix.\n *\n * @tsl\n * @type {UniformNode<mat3>}\n */\nconst modelNormalMatrix = /*@__PURE__*/ uniform( new Matrix3() ).onObjectUpdate( ( { object }, self ) => self.value.getNormalMatrix( object.matrixWorld ) );\n\n/**\n * TSL object that represents the object's inverse world matrix.\n *\n * @tsl\n * @type {UniformNode<mat4>}\n */\nconst modelWorldMatrixInverse = /*@__PURE__*/ uniform( new Matrix4() ).onObjectUpdate( ( { object }, self ) => self.value.copy( object.matrixWorld ).invert() );\n\n/**\n * TSL object that represents the object's model view matrix.\n *\n * @tsl\n * @type {Node<mat4>}\n */\nconst modelViewMatrix = /*@__PURE__*/ ( Fn( ( builder ) => {\n\n\treturn builder.context.modelViewMatrix || mediumpModelViewMatrix;\n\n} ).once() )().toVar( 'modelViewMatrix' );\n\n// GPU Precision\n\n/**\n * TSL object that represents the object's model view in `mediump` precision.\n *\n * @tsl\n * @type {Node<mat4>}\n */\nconst mediumpModelViewMatrix = /*@__PURE__*/ cameraViewMatrix.mul( modelWorldMatrix );\n\n// CPU Precision\n\n/**\n * TSL object that represents the object's model view in `highp` precision\n * which is achieved by computing the matrix in JS and not in the shader.\n *\n * @tsl\n * @type {Node<mat4>}\n */\nconst highpModelViewMatrix = /*@__PURE__*/ ( Fn( ( builder ) => {\n\n\tbuilder.context.isHighPrecisionModelViewMatrix = true;\n\n\treturn uniform( 'mat4' ).onObjectUpdate( ( { object, camera } ) => {\n\n\t\treturn object.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\n\t} );\n\n} ).once() )().toVar( 'highpModelViewMatrix' );\n\n/**\n * TSL object that represents the object's model normal view in `highp` precision\n * which is achieved by computing the matrix in JS and not in the shader.\n *\n * @tsl\n * @type {Node<mat3>}\n */\nconst highpModelNormalViewMatrix = /*@__PURE__*/ ( Fn( ( builder ) => {\n\n\tconst isHighPrecisionModelViewMatrix = builder.context.isHighPrecisionModelViewMatrix;\n\n\treturn uniform( 'mat3' ).onObjectUpdate( ( { object, camera } ) => {\n\n\t\tif ( isHighPrecisionModelViewMatrix !== true ) {\n\n\t\t\tobject.modelViewMatrix.multiplyMatrices( camera.matrixWorldInverse, object.matrixWorld );\n\n\t\t}\n\n\t\treturn object.normalMatrix.getNormalMatrix( object.modelViewMatrix );\n\n\t} );\n\n} ).once() )().toVar( 'highpModelNormalViewMatrix' );\n\n/**\n * TSL object that represents the position attribute of the current rendered object.\n *\n * @tsl\n * @type {AttributeNode<vec3>}\n */\nconst positionGeometry = /*@__PURE__*/ attribute( 'position', 'vec3' );\n\n/**\n * TSL object that represents the vertex position in local space of the current rendered object.\n *\n * @tsl\n * @type {AttributeNode<vec3>}\n */\nconst positionLocal = /*@__PURE__*/ positionGeometry.toVarying( 'positionLocal' );\n\n/**\n * TSL object that represents the previous vertex position in local space of the current rendered object.\n * Used in context of {@link VelocityNode} for rendering motion vectors.\n *\n * @tsl\n * @type {AttributeNode<vec3>}\n */\nconst positionPrevious = /*@__PURE__*/ positionGeometry.toVarying( 'positionPrevious' );\n\n/**\n * TSL object that represents the vertex position in world space of the current rendered object.\n *\n * @tsl\n * @type {VaryingNode<vec3>}\n */\nconst positionWorld = /*@__PURE__*/ ( Fn( ( builder ) => {\n\n\treturn modelWorldMatrix.mul( positionLocal ).xyz.toVarying( builder.getSubBuildProperty( 'v_positionWorld' ) );\n\n}, 'vec3' ).once( [ 'POSITION' ] ) )();\n\n/**\n * TSL object that represents the position world direction of the current rendered object.\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst positionWorldDirection = /*@__PURE__*/ ( Fn( () => {\n\n\tconst vertexPWD = positionLocal.transformDirection( modelWorldMatrix ).toVarying( 'v_positionWorldDirection' );\n\n\treturn vertexPWD.normalize().toVar( 'positionWorldDirection' );\n\n}, 'vec3' ).once( [ 'POSITION' ] ) )();\n\n/**\n * TSL object that represents the vertex position in view space of the current rendered object.\n *\n * @tsl\n * @type {VaryingNode<vec3>}\n */\nconst positionView = /*@__PURE__*/ ( Fn( ( builder ) => {\n\n\treturn builder.context.setupPositionView().toVarying( 'v_positionView' );\n\n}, 'vec3' ).once( [ 'POSITION' ] ) )();\n\n/**\n * TSL object that represents the position view direction of the current rendered object.\n *\n * @tsl\n * @type {VaryingNode<vec3>}\n */\nconst positionViewDirection = /*@__PURE__*/ ( Fn( ( builder ) => {\n\n\tlet output;\n\n\tif ( builder.camera.isOrthographicCamera ) {\n\n\t\toutput = vec3( 0, 0, 1 );\n\n\t} else {\n\n\t\toutput = positionView.negate().toVarying( 'v_positionViewDirection' ).normalize();\n\n\t}\n\n\treturn output.toVar( 'positionViewDirection' );\n\n}, 'vec3' ).once( [ 'POSITION' ] ) )();\n\n/**\n * This node can be used to evaluate whether a primitive is front or back facing.\n *\n * @augments Node\n */\nclass FrontFacingNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'FrontFacingNode';\n\n\t}\n\n\t/**\n\t * Constructs a new front facing node.\n\t */\n\tconstructor() {\n\n\t\tsuper( 'bool' );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isFrontFacingNode = true;\n\n\t}\n\n\tgenerate( builder ) {\n\n\t\tif ( builder.shaderStage !== 'fragment' ) return 'true';\n\n\t\t//\n\n\t\tconst { material } = builder;\n\n\t\tif ( material.side === BackSide ) {\n\n\t\t\treturn 'false';\n\n\t\t}\n\n\t\treturn builder.getFrontFacing();\n\n\t}\n\n}\n\n/**\n * TSL object that represents whether a primitive is front or back facing\n *\n * @tsl\n * @type {FrontFacingNode<bool>}\n */\nconst frontFacing = /*@__PURE__*/ nodeImmutable( FrontFacingNode );\n\n/**\n * TSL object that represents the front facing status as a number instead of a bool.\n * `1` means front facing, `-1` means back facing.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst faceDirection = /*@__PURE__*/ float( frontFacing ).mul( 2.0 ).sub( 1.0 );\n\n/**\n * Converts a direction vector to a face direction vector based on the material's side.\n *\n * If the material is set to `BackSide`, the direction is inverted.\n * If the material is set to `DoubleSide`, the direction is multiplied by `faceDirection`.\n *\n * @tsl\n * @param {Node<vec3>} direction - The direction vector to convert.\n * @returns {Node<vec3>} The converted direction vector.\n */\nconst directionToFaceDirection = /*@__PURE__*/ Fn( ( [ direction ], { material } ) => {\n\n\tconst side = material.side;\n\n\tif ( side === BackSide ) {\n\n\t\tdirection = direction.mul( -1 );\n\n\t} else if ( side === DoubleSide ) {\n\n\t\tdirection = direction.mul( faceDirection );\n\n\t}\n\n\treturn direction;\n\n} );\n\n/**\n * TSL object that represents the normal attribute of the current rendered object in local space.\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst normalGeometry = /*@__PURE__*/ attribute( 'normal', 'vec3' );\n\n/**\n * TSL object that represents the vertex normal of the current rendered object in local space.\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst normalLocal = /*@__PURE__*/ ( Fn( ( builder ) => {\n\n\tif ( builder.geometry.hasAttribute( 'normal' ) === false ) {\n\n\t\twarn( 'TSL: Vertex attribute \"normal\" not found on geometry.' );\n\n\t\treturn vec3( 0, 1, 0 );\n\n\t}\n\n\treturn normalGeometry;\n\n}, 'vec3' ).once() )().toVar( 'normalLocal' );\n\n/**\n * TSL object that represents the flat vertex normal of the current rendered object in view space.\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst normalFlat = /*@__PURE__*/ positionView.dFdx().cross( positionView.dFdy() ).normalize().toVar( 'normalFlat' );\n\n/**\n * TSL object that represents the vertex normal of the current rendered object in view space.\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst normalViewGeometry = /*@__PURE__*/ ( Fn( ( builder ) => {\n\n\tlet node;\n\n\tif ( builder.material.flatShading === true ) {\n\n\t\tnode = normalFlat;\n\n\t} else {\n\n\t\tnode = transformNormalToView( normalLocal ).toVarying( 'v_normalViewGeometry' ).normalize();\n\n\t}\n\n\treturn node;\n\n}, 'vec3' ).once() )().toVar( 'normalViewGeometry' );\n\n/**\n * TSL object that represents the vertex normal of the current rendered object in world space.\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst normalWorldGeometry = /*@__PURE__*/ ( Fn( ( builder ) => {\n\n\tlet normal = normalViewGeometry.transformDirection( cameraViewMatrix );\n\n\tif ( builder.material.flatShading !== true ) {\n\n\t\tnormal = normal.toVarying( 'v_normalWorldGeometry' );\n\n\t}\n\n\treturn normal.normalize().toVar( 'normalWorldGeometry' );\n\n}, 'vec3' ).once() )();\n\n/**\n * TSL object that represents the vertex normal of the current rendered object in view space.\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst normalView = /*@__PURE__*/ ( Fn( ( { subBuildFn, material, context } ) => {\n\n\tlet node;\n\n\tif ( subBuildFn === 'NORMAL' || subBuildFn === 'VERTEX' ) {\n\n\t\tnode = normalViewGeometry;\n\n\t\tif ( material.flatShading !== true ) {\n\n\t\t\tnode = directionToFaceDirection( node );\n\n\t\t}\n\n\t} else {\n\n\t\t// Use getUV context to avoid side effects from nodes overwriting getUV in the context (e.g. EnvironmentNode)\n\n\t\tnode = context.setupNormal().context( { getUV: null } );\n\n\t}\n\n\treturn node;\n\n}, 'vec3' ).once( [ 'NORMAL', 'VERTEX' ] ) )().toVar( 'normalView' );\n\n/**\n * TSL object that represents the vertex normal of the current rendered object in world space.\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst normalWorld = /*@__PURE__*/ normalView.transformDirection( cameraViewMatrix ).toVar( 'normalWorld' );\n\n/**\n * TSL object that represents the clearcoat vertex normal of the current rendered object in view space.\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst clearcoatNormalView = /*@__PURE__*/ ( Fn( ( { subBuildFn, context } ) => {\n\n\tlet node;\n\n\tif ( subBuildFn === 'NORMAL' || subBuildFn === 'VERTEX' ) {\n\n\t\tnode = normalView;\n\n\t} else {\n\n\t\t// Use getUV context to avoid side effects from nodes overwriting getUV in the context (e.g. EnvironmentNode)\n\n\t\tnode = context.setupClearcoatNormal().context( { getUV: null } );\n\n\t}\n\n\treturn node;\n\n}, 'vec3' ).once( [ 'NORMAL', 'VERTEX' ] ) )().toVar( 'clearcoatNormalView' );\n\n/**\n * Transforms the normal with the given matrix.\n *\n * @tsl\n * @function\n * @param {Node<vec3>} normal - The normal.\n * @param {Node<mat3>} [matrix=modelWorldMatrix] - The matrix.\n * @return {Node<vec3>} The transformed normal.\n */\nconst transformNormal = /*@__PURE__*/ Fn( ( [ normal, matrix = modelWorldMatrix ] ) => {\n\n\tconst m = mat3( matrix );\n\n\tconst transformedNormal = normal.div( vec3( m[ 0 ].dot( m[ 0 ] ), m[ 1 ].dot( m[ 1 ] ), m[ 2 ].dot( m[ 2 ] ) ) );\n\n\treturn m.mul( transformedNormal ).xyz;\n\n} );\n\n/**\n * Transforms the given normal from local to view space.\n *\n * @tsl\n * @function\n * @param {Node<vec3>} normal - The normal.\n * @param {NodeBuilder} builder - The current node builder.\n * @return {Node<vec3>} The transformed normal.\n */\nconst transformNormalToView = /*@__PURE__*/ Fn( ( [ normal ], builder ) => {\n\n\tconst modelNormalViewMatrix = builder.context.modelNormalViewMatrix;\n\n\tif ( modelNormalViewMatrix ) {\n\n\t\treturn modelNormalViewMatrix.transformDirection( normal );\n\n\t}\n\n\t//\n\n\tconst transformedNormal = modelNormalMatrix.mul( normal );\n\n\treturn cameraViewMatrix.transformDirection( transformedNormal );\n\n} );\n\n// Deprecated\n\n/**\n * TSL object that represents the transformed vertex normal of the current rendered object in view space.\n *\n * @tsl\n * @type {Node<vec3>}\n * @deprecated since r178. Use `normalView` instead.\n */\nconst transformedNormalView = ( Fn( () => { // @deprecated, r177\n\n\twarn( 'TSL: \"transformedNormalView\" is deprecated. Use \"normalView\" instead.' );\n\treturn normalView;\n\n} ).once( [ 'NORMAL', 'VERTEX' ] ) )();\n\n/**\n * TSL object that represents the transformed vertex normal of the current rendered object in world space.\n *\n * @tsl\n * @type {Node<vec3>}\n * @deprecated since r178. Use `normalWorld` instead.\n */\nconst transformedNormalWorld = ( Fn( () => { // @deprecated, r177\n\n\twarn( 'TSL: \"transformedNormalWorld\" is deprecated. Use \"normalWorld\" instead.' );\n\treturn normalWorld;\n\n} ).once( [ 'NORMAL', 'VERTEX' ] ) )();\n\n/**\n * TSL object that represents the transformed clearcoat vertex normal of the current rendered object in view space.\n *\n * @tsl\n * @type {Node<vec3>}\n * @deprecated since r178. Use `clearcoatNormalView` instead.\n */\nconst transformedClearcoatNormalView = ( Fn( () => { // @deprecated, r177\n\n\twarn( 'TSL: \"transformedClearcoatNormalView\" is deprecated. Use \"clearcoatNormalView\" instead.' );\n\treturn clearcoatNormalView;\n\n} ).once( [ 'NORMAL', 'VERTEX' ] ) )();\n\nconst _e1$1 = /*@__PURE__*/ new Euler();\nconst _m1$1 = /*@__PURE__*/ new Matrix4();\n\n/**\n * TSL object that represents the refraction ratio of the material used for rendering the current object.\n *\n * @tsl\n * @type {UniformNode<float>}\n */\nconst materialRefractionRatio = /*@__PURE__*/ uniform( 0 ).onReference( ( { material } ) => material ).onObjectUpdate( ( { material } ) => material.refractionRatio );\n\n/**\n * TSL object that represents the intensity of environment maps of PBR materials.\n * When `material.envMap` is set, the value is `material.envMapIntensity` otherwise `scene.environmentIntensity`.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst materialEnvIntensity = /*@__PURE__*/ uniform( 1 ).onReference( ( { material } ) => material ).onObjectUpdate( function ( { material, scene } ) {\n\n\treturn material.envMap ? material.envMapIntensity : scene.environmentIntensity;\n\n} );\n\n/**\n * TSL object that represents the rotation of environment maps.\n * When `material.envMap` is set, the value is `material.envMapRotation`. `scene.environmentRotation` controls the\n * rotation of `scene.environment` instead.\n *\n * @tsl\n * @type {Node<mat4>}\n */\nconst materialEnvRotation = /*@__PURE__*/ uniform( new Matrix4() ).onReference( function ( frame ) {\n\n\treturn frame.material;\n\n} ).onObjectUpdate( function ( { material, scene } ) {\n\n\tconst rotation = ( scene.environment !== null && material.envMap === null ) ? scene.environmentRotation : material.envMapRotation;\n\n\tif ( rotation ) {\n\n\t\t_e1$1.copy( rotation );\n\n\t\t_m1$1.makeRotationFromEuler( _e1$1 );\n\n\t} else {\n\n\t\t_m1$1.identity();\n\n\t}\n\n\treturn _m1$1;\n\n} );\n\n/**\n * The reflect vector in view space.\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst reflectView = /*@__PURE__*/ positionViewDirection.negate().reflect( normalView );\n\n/**\n * The refract vector in view space.\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst refractView = /*@__PURE__*/ positionViewDirection.negate().refract( normalView, materialRefractionRatio );\n\n/**\n * Used for sampling cube maps when using cube reflection mapping.\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst reflectVector = /*@__PURE__*/ reflectView.transformDirection( cameraViewMatrix ).toVar( 'reflectVector' );\n\n/**\n * Used for sampling cube maps when using cube refraction mapping.\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst refractVector = /*@__PURE__*/ refractView.transformDirection( cameraViewMatrix ).toVar( 'reflectVector' );\n\nconst EmptyTexture = /*@__PURE__*/ new CubeTexture();\n\n/**\n * This type of uniform node represents a cube texture.\n *\n * @augments TextureNode\n */\nclass CubeTextureNode extends TextureNode {\n\n\tstatic get type() {\n\n\t\treturn 'CubeTextureNode';\n\n\t}\n\n\t/**\n\t * Constructs a new cube texture node.\n\t *\n\t * @param {CubeTexture} value - The cube texture.\n\t * @param {?Node<vec3>} [uvNode=null] - The uv node.\n\t * @param {?Node<int>} [levelNode=null] - The level node.\n\t * @param {?Node<float>} [biasNode=null] - The bias node.\n\t */\n\tconstructor( value, uvNode = null, levelNode = null, biasNode = null ) {\n\n\t\tsuper( value, uvNode, levelNode, biasNode );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubeTextureNode = true;\n\n\t}\n\n\t/**\n\t * Overwrites the default implementation to return the appropriate cube texture type.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The input type.\n\t */\n\tgetInputType( /*builder*/ ) {\n\n\t\tif ( this.value.isDepthTexture === true ) {\n\n\t\t\treturn 'cubeDepthTexture';\n\n\t\t}\n\n\t\treturn 'cubeTexture';\n\n\t}\n\n\t/**\n\t * Returns a default uvs based on the mapping type of the cube texture.\n\t *\n\t * @return {Node<vec3>} The default uv attribute.\n\t */\n\tgetDefaultUV() {\n\n\t\tconst texture = this.value;\n\n\t\tif ( texture.mapping === CubeReflectionMapping ) {\n\n\t\t\treturn reflectVector;\n\n\t\t} else if ( texture.mapping === CubeRefractionMapping ) {\n\n\t\t\treturn refractVector;\n\n\t\t} else {\n\n\t\t\terror( 'CubeTextureNode: Mapping \"%s\" not supported.', texture.mapping );\n\n\t\t\treturn vec3( 0, 0, 0 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Overwritten with an empty implementation since the `updateMatrix` flag is ignored\n\t * for cube textures. The uv transformation matrix is not applied to cube textures.\n\t *\n\t * @param {boolean} value - The update toggle.\n\t */\n\tsetUpdateMatrix( /*updateMatrix*/ ) { } // Ignore .updateMatrix for CubeTextureNode\n\n\t/**\n\t * Setups the uv node. Depending on the backend as well as the texture type, it might be necessary\n\t * to modify the uv node for correct sampling.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @param {Node} uvNode - The uv node to setup.\n\t * @return {Node} The updated uv node.\n\t */\n\tsetupUV( builder, uvNode ) {\n\n\t\tconst texture = this.value;\n\n\t\t// Depth textures (shadow maps) - no environment rotation, Y flip for WebGPU\n\t\tif ( texture.isDepthTexture === true ) {\n\n\t\t\tif ( builder.renderer.coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\treturn vec3( uvNode.x, uvNode.y.negate(), uvNode.z );\n\n\t\t\t}\n\n\t\t\treturn uvNode;\n\n\t\t}\n\n\t\tif ( builder.renderer.coordinateSystem === WebGPUCoordinateSystem || ! texture.isRenderTargetTexture ) {\n\n\t\t\tuvNode = vec3( uvNode.x.negate(), uvNode.yz );\n\n\t\t}\n\n\t\treturn materialEnvRotation.mul( uvNode );\n\n\t}\n\n\t/**\n\t * Generates the uv code snippet.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @param {Node} cubeUV - The uv node to generate code for.\n\t * @return {string} The generated code snippet.\n\t */\n\tgenerateUV( builder, cubeUV ) {\n\n\t\treturn cubeUV.build( builder, this.sampler === true ? 'vec3' : 'ivec3' );\n\n\t}\n\n}\n\n/**\n * TSL function for creating a cube texture node.\n *\n * @tsl\n * @function\n * @param {CubeTexture} value - The cube texture.\n * @param {?Node<vec3>} [uvNode=null] - The uv node.\n * @param {?Node<int>} [levelNode=null] - The level node.\n * @param {?Node<float>} [biasNode=null] - The bias node.\n * @returns {CubeTextureNode}\n */\nconst cubeTextureBase = /*@__PURE__*/ nodeProxy( CubeTextureNode ).setParameterLength( 1, 4 ).setName( 'cubeTexture' );\n\n/**\n * TSL function for creating a cube texture uniform node.\n *\n * @tsl\n * @function\n * @param {?(CubeTexture|CubeTextureNode)} [value=EmptyTexture] - The cube texture.\n * @param {?Node<vec3>} [uvNode=null] - The uv node.\n * @param {?Node<int>} [levelNode=null] - The level node.\n * @param {?Node<float>} [biasNode=null] - The bias node.\n * @returns {CubeTextureNode}\n */\nconst cubeTexture = ( value = EmptyTexture, uvNode = null, levelNode = null, biasNode = null ) => {\n\n\tlet textureNode;\n\n\tif ( value && value.isCubeTextureNode === true ) {\n\n\t\ttextureNode = nodeObject( value.clone() );\n\t\ttextureNode.referenceNode = value; // Ensure the reference is set to the original node\n\n\t\tif ( uvNode !== null ) textureNode.uvNode = nodeObject( uvNode );\n\t\tif ( levelNode !== null ) textureNode.levelNode = nodeObject( levelNode );\n\t\tif ( biasNode !== null ) textureNode.biasNode = nodeObject( biasNode );\n\n\t} else {\n\n\t\ttextureNode = cubeTextureBase( value, uvNode, levelNode, biasNode );\n\n\t}\n\n\treturn textureNode;\n\n};\n\n/**\n * TSL function for creating a uniform cube texture node.\n *\n * @tsl\n * @function\n * @param {?CubeTexture} [value=EmptyTexture] - The cube texture.\n * @returns {CubeTextureNode}\n */\nconst uniformCubeTexture = ( value = EmptyTexture ) => cubeTextureBase( value );\n\n// TODO: Avoid duplicated code and use only ReferenceBaseNode or ReferenceNode\n\n/**\n * This class is only relevant if the referenced property is array-like.\n * In this case, `ReferenceElementNode` allows to refer to a specific\n * element inside the data structure via an index.\n *\n * @augments ArrayElementNode\n */\nclass ReferenceElementNode extends ArrayElementNode {\n\n\tstatic get type() {\n\n\t\treturn 'ReferenceElementNode';\n\n\t}\n\n\t/**\n\t * Constructs a new reference element node.\n\t *\n\t * @param {?ReferenceNode} referenceNode - The reference node.\n\t * @param {Node} indexNode - The index node that defines the element access.\n\t */\n\tconstructor( referenceNode, indexNode ) {\n\n\t\tsuper( referenceNode, indexNode );\n\n\t\t/**\n\t\t * Similar to {@link ReferenceNode#reference}, an additional\n\t\t * property references to the current node.\n\t\t *\n\t\t * @type {?ReferenceNode}\n\t\t * @default null\n\t\t */\n\t\tthis.referenceNode = referenceNode;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isReferenceElementNode = true;\n\n\t}\n\n\t/**\n\t * This method is overwritten since the node type is inferred from\n\t * the uniform type of the reference node.\n\t *\n\t * @return {string} The node type.\n\t */\n\tgetNodeType() {\n\n\t\treturn this.referenceNode.uniformType;\n\n\t}\n\n\tgenerate( builder ) {\n\n\t\tconst snippet = super.generate( builder );\n\t\tconst arrayType = this.referenceNode.getNodeType();\n\t\tconst elementType = this.getNodeType();\n\n\t\treturn builder.format( snippet, arrayType, elementType );\n\n\t}\n\n}\n\n/**\n * This type of node establishes a reference to a property of another object.\n * In this way, the value of the node is automatically linked to the value of\n * referenced object. Reference nodes internally represent the linked value\n * as a uniform.\n *\n * @augments Node\n */\nclass ReferenceNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'ReferenceNode';\n\n\t}\n\n\t/**\n\t * Constructs a new reference node.\n\t *\n\t * @param {string} property - The name of the property the node refers to.\n\t * @param {string} uniformType - The uniform type that should be used to represent the property value.\n\t * @param {?Object} [object=null] - The object the property belongs to.\n\t * @param {?number} [count=null] - When the linked property is an array-like, this parameter defines its length.\n\t */\n\tconstructor( property, uniformType, object = null, count = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The name of the property the node refers to.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.property = property;\n\n\t\t/**\n\t\t * The uniform type that should be used to represent the property value.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.uniformType = uniformType;\n\n\t\t/**\n\t\t * The object the property belongs to.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.object = object;\n\n\t\t/**\n\t\t * When the linked property is an array, this parameter defines its length.\n\t\t *\n\t\t * @type {?number}\n\t\t * @default null\n\t\t */\n\t\tthis.count = count;\n\n\t\t/**\n\t\t * The property name might have dots so nested properties can be referred.\n\t\t * The hierarchy of the names is stored inside this array.\n\t\t *\n\t\t * @type {Array<string>}\n\t\t */\n\t\tthis.properties = property.split( '.' );\n\n\t\t/**\n\t\t * Points to the current referred object. This property exists next to {@link ReferenceNode#object}\n\t\t * since the final reference might be updated from calling code.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.reference = object;\n\n\t\t/**\n\t\t * The uniform node that holds the value of the reference node.\n\t\t *\n\t\t * @type {UniformNode}\n\t\t * @default null\n\t\t */\n\t\tthis.node = null;\n\n\t\t/**\n\t\t * The uniform group of the internal uniform.\n\t\t *\n\t\t * @type {UniformGroupNode}\n\t\t * @default null\n\t\t */\n\t\tthis.group = null;\n\n\t\t/**\n\t\t * An optional label of the internal uniform node.\n\t\t *\n\t\t * @type {?string}\n\t\t * @default null\n\t\t */\n\t\tthis.name = null;\n\n\t\t/**\n\t\t * Overwritten since reference nodes are updated per object.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'object'\n\t\t */\n\t\tthis.updateType = NodeUpdateType.OBJECT;\n\n\t}\n\n\t/**\n\t * When the referred property is array-like, this method can be used\n\t * to access elements via an index node.\n\t *\n\t * @param {IndexNode} indexNode - indexNode.\n\t * @return {ReferenceElementNode} A reference to an element.\n\t */\n\telement( indexNode ) {\n\n\t\treturn new ReferenceElementNode( this, nodeObject( indexNode ) );\n\n\t}\n\n\t/**\n\t * Sets the uniform group for this reference node.\n\t *\n\t * @param {UniformGroupNode} group - The uniform group to set.\n\t * @return {ReferenceNode} A reference to this node.\n\t */\n\tsetGroup( group ) {\n\n\t\tthis.group = group;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the name for the internal uniform.\n\t *\n\t * @param {string} name - The label to set.\n\t * @return {ReferenceNode} A reference to this node.\n\t */\n\tsetName( name ) {\n\n\t\tthis.name = name;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the label for the internal uniform.\n\t *\n\t * @deprecated\n\t * @param {string} name - The label to set.\n\t * @return {ReferenceNode} A reference to this node.\n\t */\n\tlabel( name ) {\n\n\t\twarn( 'TSL: \"label()\" has been deprecated. Use \"setName()\" instead.' ); // @deprecated r179\n\n\t\treturn this.setName( name );\n\n\t}\n\n\t/**\n\t * Sets the node type which automatically defines the internal\n\t * uniform type.\n\t *\n\t * @param {string} uniformType - The type to set.\n\t */\n\tsetNodeType( uniformType ) {\n\n\t\tlet node = null;\n\n\t\tif ( this.count !== null ) {\n\n\t\t\tnode = buffer( null, uniformType, this.count );\n\n\t\t} else if ( Array.isArray( this.getValueFromReference() ) ) {\n\n\t\t\tnode = uniformArray( null, uniformType );\n\n\t\t} else if ( uniformType === 'texture' ) {\n\n\t\t\tnode = texture( null );\n\n\t\t} else if ( uniformType === 'cubeTexture' ) {\n\n\t\t\tnode = cubeTexture( null );\n\n\t\t} else {\n\n\t\t\tnode = uniform( null, uniformType );\n\n\t\t}\n\n\t\tif ( this.group !== null ) {\n\n\t\t\tnode.setGroup( this.group );\n\n\t\t}\n\n\t\tif ( this.name !== null ) node.setName( this.name );\n\n\t\tthis.node = node;\n\n\t}\n\n\t/**\n\t * This method is overwritten since the node type is inferred from\n\t * the type of the reference node.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The node type.\n\t */\n\tgetNodeType( builder ) {\n\n\t\tif ( this.node === null ) {\n\n\t\t\tthis.updateReference( builder );\n\t\t\tthis.updateValue();\n\n\t\t}\n\n\t\treturn this.node.getNodeType( builder );\n\n\t}\n\n\t/**\n\t * Returns the property value from the given referred object.\n\t *\n\t * @param {Object} [object=this.reference] - The object to retrieve the property value from.\n\t * @return {any} The value.\n\t */\n\tgetValueFromReference( object = this.reference ) {\n\n\t\tconst { properties } = this;\n\n\t\tlet value = object[ properties[ 0 ] ];\n\n\t\tfor ( let i = 1; i < properties.length; i ++ ) {\n\n\t\t\tvalue = value[ properties[ i ] ];\n\n\t\t}\n\n\t\treturn value;\n\n\t}\n\n\t/**\n\t * Allows to update the reference based on the given state. The state is only\n\t * evaluated {@link ReferenceNode#object} is not set.\n\t *\n\t * @param {(NodeFrame|NodeBuilder)} state - The current state.\n\t * @return {Object} The updated reference.\n\t */\n\tupdateReference( state ) {\n\n\t\tthis.reference = this.object !== null ? this.object : state.object;\n\n\t\treturn this.reference;\n\n\t}\n\n\t/**\n\t * The output of the reference node is the internal uniform node.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {UniformNode} The output node.\n\t */\n\tsetup( /* builder */ ) {\n\n\t\tthis.updateValue();\n\n\t\treturn this.node;\n\n\t}\n\n\t/**\n\t * Overwritten to update the internal uniform value.\n\t *\n\t * @param {NodeFrame} frame - A reference to the current node frame.\n\t */\n\tupdate( /*frame*/ ) {\n\n\t\tthis.updateValue();\n\n\t}\n\n\t/**\n\t * Retrieves the value from the referred object property and uses it\n\t * to updated the internal uniform.\n\t */\n\tupdateValue() {\n\n\t\tif ( this.node === null ) this.setNodeType( this.uniformType );\n\n\t\tconst value = this.getValueFromReference();\n\n\t\tif ( Array.isArray( value ) ) {\n\n\t\t\tthis.node.array = value;\n\n\t\t} else {\n\n\t\t\tthis.node.value = value;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * TSL function for creating a reference node.\n *\n * @tsl\n * @function\n * @param {string} name - The name of the property the node refers to.\n * @param {string} type - The uniform type that should be used to represent the property value.\n * @param {?Object} [object] - The object the property belongs to.\n * @returns {ReferenceNode}\n */\nconst reference = ( name, type, object ) => new ReferenceNode( name, type, object );\n\n/**\n * TSL function for creating a reference node. Use this function if you want need a reference\n * to an array-like property that should be represented as a uniform buffer.\n *\n * @tsl\n * @function\n * @param {string} name - The name of the property the node refers to.\n * @param {string} type - The uniform type that should be used to represent the property value.\n * @param {number} count - The number of value inside the array-like object.\n * @param {Object} object - An array-like object the property belongs to.\n * @returns {ReferenceNode}\n */\nconst referenceBuffer = ( name, type, count, object ) => new ReferenceNode( name, type, object, count );\n\n/**\n * This node is a special type of reference node which is intended\n * for linking material properties with node values.\n * ```js\n * const opacityNode = materialReference( 'opacity', 'float', material );\n * ```\n * When changing `material.opacity`, the node value of `opacityNode` will\n * automatically be updated.\n *\n * @augments ReferenceNode\n */\nclass MaterialReferenceNode extends ReferenceNode {\n\n\tstatic get type() {\n\n\t\treturn 'MaterialReferenceNode';\n\n\t}\n\n\t/**\n\t * Constructs a new material reference node.\n\t *\n\t * @param {string} property - The name of the property the node refers to.\n\t * @param {string} inputType - The uniform type that should be used to represent the property value.\n\t * @param {?Material} [material=null] - The material the property belongs to. When no material is set,\n\t * the node refers to the material of the current rendered object.\n\t */\n\tconstructor( property, inputType, material = null ) {\n\n\t\tsuper( property, inputType, material );\n\n\t\t/**\n\t\t * The material the property belongs to. When no material is set,\n\t\t * the node refers to the material of the current rendered object.\n\t\t *\n\t\t * @type {?Material}\n\t\t * @default null\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMaterialReferenceNode = true;\n\n\t}\n\n\t/**\n\t * Updates the reference based on the given state. The state is only evaluated\n\t * {@link MaterialReferenceNode#material} is not set.\n\t *\n\t * @param {(NodeFrame|NodeBuilder)} state - The current state.\n\t * @return {Object} The updated reference.\n\t */\n\tupdateReference( state ) {\n\n\t\tthis.reference = this.material !== null ? this.material : state.material;\n\n\t\treturn this.reference;\n\n\t}\n\n}\n\n/**\n * TSL function for creating a material reference node.\n *\n * @tsl\n * @function\n * @param {string} name - The name of the property the node refers to.\n * @param {string} type - The uniform type that should be used to represent the property value.\n * @param {?Material} [material=null] - The material the property belongs to.\n * When no material is set, the node refers to the material of the current rendered object.\n * @returns {MaterialReferenceNode}\n */\nconst materialReference = ( name, type, material = null ) => new MaterialReferenceNode( name, type, material );\n\n// Normal Mapping Without Precomputed Tangents\n// http://www.thetenthplanet.de/archives/1180\n\nconst uv = uv$1();\n\nconst q0 = positionView.dFdx();\nconst q1 = positionView.dFdy();\nconst st0 = uv.dFdx();\nconst st1 = uv.dFdy();\n\nconst N = normalView;\n\nconst q1perp = q1.cross( N );\nconst q0perp = N.cross( q0 );\n\nconst T = q1perp.mul( st0.x ).add( q0perp.mul( st1.x ) );\nconst B = q1perp.mul( st0.y ).add( q0perp.mul( st1.y ) );\n\nconst det = T.dot( T ).max( B.dot( B ) );\nconst scale$1 = det.equal( 0.0 ).select( 0.0, det.inverseSqrt() );\n\n/**\n * Tangent vector in view space, computed dynamically from geometry and UV derivatives.\n * Useful for normal mapping without precomputed tangents.\n *\n * Reference: http://www.thetenthplanet.de/archives/1180\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst tangentViewFrame = /*@__PURE__*/ T.mul( scale$1 ).toVar( 'tangentViewFrame' );\n\n/**\n * Bitangent vector in view space, computed dynamically from geometry and UV derivatives.\n * Complements the tangentViewFrame for constructing the tangent space basis.\n *\n * Reference: http://www.thetenthplanet.de/archives/1180\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst bitangentViewFrame = /*@__PURE__*/ B.mul( scale$1 ).toVar( 'bitangentViewFrame' );\n\n/**\n * TSL object that represents the tangent attribute of the current rendered object.\n *\n * @tsl\n * @type {Node<vec4>}\n */\nconst tangentGeometry = /*@__PURE__*/ attribute( 'tangent', 'vec4' );\n\n/**\n * TSL object that represents the vertex tangent in local space of the current rendered object.\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst tangentLocal = /*@__PURE__*/ tangentGeometry.xyz.toVar( 'tangentLocal' );\n\n/**\n * TSL object that represents the vertex tangent in view space of the current rendered object.\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst tangentView = /*@__PURE__*/ ( Fn( ( { subBuildFn, geometry, material } ) => {\n\n\tlet node;\n\n\tif ( subBuildFn === 'VERTEX' || geometry.hasAttribute( 'tangent' ) ) {\n\n\t\tnode = modelViewMatrix.mul( vec4( tangentLocal, 0 ) ).xyz.toVarying( 'v_tangentView' ).normalize();\n\n\t} else {\n\n\t\tnode = tangentViewFrame;\n\n\t}\n\n\tif ( material.flatShading !== true ) {\n\n\t\tnode = directionToFaceDirection( node );\n\n\t}\n\n\treturn node;\n\n}, 'vec3' ).once( [ 'NORMAL', 'VERTEX' ] ) )().toVar( 'tangentView' );\n\n/**\n * TSL object that represents the vertex tangent in world space of the current rendered object.\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst tangentWorld = /*@__PURE__*/ tangentView.transformDirection( cameraViewMatrix ).toVarying( 'v_tangentWorld' ).normalize().toVar( 'tangentWorld' );\n\n/**\n * Returns the bitangent node and assigns it to a varying if the material is not flat shaded.\n *\n * @tsl\n * @private\n * @param {Node<vec3>} crossNormalTangent - The cross product of the normal and tangent vectors.\n * @param {string} varyingName - The name of the varying to assign the bitangent to.\n * @returns {Node<vec3>} The bitangent node.\n */\nconst getBitangent = /*@__PURE__*/ Fn( ( [ crossNormalTangent, varyingName ], { subBuildFn, material } ) => {\n\n\tlet bitangent = crossNormalTangent.mul( tangentGeometry.w ).xyz;\n\n\tif ( subBuildFn === 'NORMAL' && material.flatShading !== true ) {\n\n\t\tbitangent = bitangent.toVarying( varyingName );\n\n\t}\n\n\treturn bitangent;\n\n} ).once( [ 'NORMAL' ] );\n\n/**\n * TSL object that represents the bitangent attribute of the current rendered object.\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst bitangentGeometry = /*@__PURE__*/ getBitangent( normalGeometry.cross( tangentGeometry ), 'v_bitangentGeometry' ).normalize().toVar( 'bitangentGeometry' );\n\n/**\n * TSL object that represents the vertex bitangent in local space of the current rendered object.\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst bitangentLocal = /*@__PURE__*/ getBitangent( normalLocal.cross( tangentLocal ), 'v_bitangentLocal' ).normalize().toVar( 'bitangentLocal' );\n\n/**\n * TSL object that represents the vertex bitangent in view space of the current rendered object.\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst bitangentView = /*@__PURE__*/ ( Fn( ( { subBuildFn, geometry, material } ) => {\n\n\tlet node;\n\n\tif ( subBuildFn === 'VERTEX' || geometry.hasAttribute( 'tangent' ) ) {\n\n\t\tnode = getBitangent( normalView.cross( tangentView ), 'v_bitangentView' ).normalize();\n\n\t} else {\n\n\t\tnode = bitangentViewFrame;\n\n\t}\n\n\tif ( material.flatShading !== true ) {\n\n\t\tnode = directionToFaceDirection( node );\n\n\t}\n\n\treturn node;\n\n}, 'vec3' ).once( [ 'NORMAL', 'VERTEX' ] ) )().toVar( 'bitangentView' );\n\n/**\n * TSL object that represents the vertex bitangent in world space of the current rendered object.\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst bitangentWorld = /*@__PURE__*/ getBitangent( normalWorld.cross( tangentWorld ), 'v_bitangentWorld' ).normalize().toVar( 'bitangentWorld' );\n\n/**\n * TSL object that represents the TBN matrix in view space.\n *\n * @tsl\n * @type {Node<mat3>}\n */\nconst TBNViewMatrix = /*@__PURE__*/ mat3( tangentView, bitangentView, normalView ).toVar( 'TBNViewMatrix' );\n\n/**\n * TSL object that represents the parallax direction.\n *\n * @tsl\n * @type {Node<mat3>}\n */\nconst parallaxDirection = /*@__PURE__*/ positionViewDirection.mul( TBNViewMatrix )/*.normalize()*/;\n\n/**\n * TSL function for computing parallax uv coordinates.\n *\n * @tsl\n * @function\n * @param {Node<vec2>} uv - A uv node.\n * @param {Node<vec2>} scale - A scale node.\n * @returns {Node<vec2>} Parallax uv coordinates.\n */\nconst parallaxUV = ( uv, scale ) => uv.sub( parallaxDirection.mul( scale ) );\n\n/**\n * TSL function for computing bent normals.\n *\n * @tsl\n * @function\n * @returns {Node<vec3>} Bent normals.\n */\nconst bentNormalView = /*@__PURE__*/ ( Fn( () => {\n\n\t// https://google.github.io/filament/Filament.md.html#lighting/imagebasedlights/anisotropy\n\n\tlet bentNormal = anisotropyB.cross( positionViewDirection );\n\tbentNormal = bentNormal.cross( anisotropyB ).normalize();\n\tbentNormal = mix( bentNormal, normalView, anisotropy.mul( roughness.oneMinus() ).oneMinus().pow2().pow2() ).normalize();\n\n\treturn bentNormal;\n\n} ).once() )();\n\n/**\n * Packs a direction vector into a color value.\n *\n * @tsl\n * @function\n * @param {Node<vec3>} node - The direction to pack.\n * @return {Node<vec3>} The color.\n */\nconst directionToColor = ( node ) => nodeObject( node ).mul( 0.5 ).add( 0.5 );\n\n/**\n * Unpacks a color value into a direction vector.\n *\n * @tsl\n * @function\n * @param {Node<vec3>} node - The color to unpack.\n * @return {Node<vec3>} The direction.\n */\nconst colorToDirection = ( node ) => nodeObject( node ).mul( 2.0 ).sub( 1 );\n\n/**\n * Unpacks a tangent space normal, reconstructing the Z component by projecting the X,Y coordinates onto the hemisphere.\n * The X,Y coordinates are expected to be in the [-1, 1] range.\n *\n * @tsl\n * @function\n * @param {Node<vec2>} xy - The X,Y coordinates of the normal.\n * @return {Node<vec3>} The resulting normal.\n */\nconst unpackNormal = ( xy ) => vec3( xy, sqrt( saturate( float( 1.0 ).sub( dot( xy, xy ) ) ) ) );\n\n/**\n * This class can be used for applying normals maps to materials.\n *\n * ```js\n * material.normalNode = normalMap( texture( normalTex ) );\n * ```\n *\n * @augments TempNode\n */\nclass NormalMapNode extends TempNode {\n\n\tstatic get type() {\n\n\t\treturn 'NormalMapNode';\n\n\t}\n\n\t/**\n\t * Constructs a new normal map node.\n\t *\n\t * @param {Node<vec3>} node - Represents the normal map data.\n\t * @param {?Node<vec2>} [scaleNode=null] - Controls the intensity of the effect.\n\t */\n\tconstructor( node, scaleNode = null ) {\n\n\t\tsuper( 'vec3' );\n\n\t\t/**\n\t\t * Represents the normal map data.\n\t\t *\n\t\t * @type {Node<vec3>}\n\t\t */\n\t\tthis.node = node;\n\n\t\t/**\n\t\t * Controls the intensity of the effect.\n\t\t *\n\t\t * @type {?Node<vec2>}\n\t\t * @default null\n\t\t */\n\t\tthis.scaleNode = scaleNode;\n\n\t\t/**\n\t\t * The normal map type.\n\t\t *\n\t\t * @type {(TangentSpaceNormalMap|ObjectSpaceNormalMap)}\n\t\t * @default TangentSpaceNormalMap\n\t\t */\n\t\tthis.normalMapType = TangentSpaceNormalMap;\n\n\t\t/**\n\t\t * Controls how to unpack the sampled normal map values.\n\t\t *\n\t\t * @type {string}\n\t\t * @default NoNormalPacking\n\t\t */\n\t\tthis.unpackNormalMode = NoNormalPacking;\n\n\t}\n\n\tsetup( { material } ) {\n\n\t\tconst { normalMapType, scaleNode, unpackNormalMode } = this;\n\n\t\tlet normalMap = this.node.mul( 2.0 ).sub( 1.0 );\n\n\t\tif ( normalMapType === TangentSpaceNormalMap ) {\n\n\t\t\tif ( unpackNormalMode === NormalRGPacking ) {\n\n\t\t\t\tnormalMap = unpackNormal( normalMap.xy );\n\n\t\t\t} else if ( unpackNormalMode === NormalGAPacking ) {\n\n\t\t\t\tnormalMap = unpackNormal( normalMap.yw );\n\n\t\t\t} else if ( unpackNormalMode !== NoNormalPacking ) {\n\n\t\t\t\tconsole.error( `THREE.NodeMaterial: Unexpected unpack normal mode: ${ unpackNormalMode }` );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( unpackNormalMode !== NoNormalPacking ) {\n\n\t\t\t\tconsole.error( `THREE.NodeMaterial: Normal map type '${ normalMapType }' is not compatible with unpack normal mode '${ unpackNormalMode }'` );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( scaleNode !== null ) {\n\n\t\t\tlet scale = scaleNode;\n\n\t\t\tif ( material.flatShading === true ) {\n\n\t\t\t\tscale = directionToFaceDirection( scale );\n\n\t\t\t}\n\n\t\t\tnormalMap = vec3( normalMap.xy.mul( scale ), normalMap.z );\n\n\t\t}\n\n\t\tlet output = null;\n\n\t\tif ( normalMapType === ObjectSpaceNormalMap ) {\n\n\t\t\toutput = transformNormalToView( normalMap );\n\n\t\t} else if ( normalMapType === TangentSpaceNormalMap ) {\n\n\t\t\toutput = TBNViewMatrix.mul( normalMap ).normalize();\n\n\t\t} else {\n\n\t\t\terror( `NodeMaterial: Unsupported normal map type: ${ normalMapType }` );\n\n\t\t\toutput = normalView; // Fallback to default normal view\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n}\n\n/**\n * TSL function for creating a normal map node.\n *\n * @tsl\n * @function\n * @param {Node<vec3>} node - Represents the normal map data.\n * @param {?Node<vec2>} [scaleNode=null] - Controls the intensity of the effect.\n * @returns {NormalMapNode}\n */\nconst normalMap = /*@__PURE__*/ nodeProxy( NormalMapNode ).setParameterLength( 1, 2 );\n\n// Bump Mapping Unparametrized Surfaces on the GPU by Morten S. Mikkelsen\n// https://mmikk.github.io/papers3d/mm_sfgrad_bump.pdf\n\nconst dHdxy_fwd = Fn( ( { textureNode, bumpScale } ) => {\n\n\t// It's used to preserve the same TextureNode instance\n\tconst sampleTexture = ( callback ) => textureNode.isolate().context( { getUV: ( texNode ) => callback( texNode.uvNode || uv$1() ), forceUVContext: true } );\n\n\tconst Hll = float( sampleTexture( ( uvNode ) => uvNode ) );\n\n\treturn vec2(\n\t\tfloat( sampleTexture( ( uvNode ) => uvNode.add( uvNode.dFdx() ) ) ).sub( Hll ),\n\t\tfloat( sampleTexture( ( uvNode ) => uvNode.add( uvNode.dFdy() ) ) ).sub( Hll )\n\t).mul( bumpScale );\n\n} );\n\n// Evaluate the derivative of the height w.r.t. screen-space using forward differencing (listing 2)\n\nconst perturbNormalArb = Fn( ( inputs ) => {\n\n\tconst { surf_pos, surf_norm, dHdxy } = inputs;\n\n\t// normalize is done to ensure that the bump map looks the same regardless of the texture's scale\n\tconst vSigmaX = surf_pos.dFdx().normalize();\n\tconst vSigmaY = surf_pos.dFdy().normalize();\n\tconst vN = surf_norm; // normalized\n\n\tconst R1 = vSigmaY.cross( vN );\n\tconst R2 = vN.cross( vSigmaX );\n\n\tconst fDet = vSigmaX.dot( R1 ).mul( faceDirection );\n\n\tconst vGrad = fDet.sign().mul( dHdxy.x.mul( R1 ).add( dHdxy.y.mul( R2 ) ) );\n\n\treturn fDet.abs().mul( surf_norm ).sub( vGrad ).normalize();\n\n} );\n\n/**\n * This class can be used for applying bump maps to materials.\n *\n * ```js\n * material.normalNode = bumpMap( texture( bumpTex ) );\n * ```\n *\n * @augments TempNode\n */\nclass BumpMapNode extends TempNode {\n\n\tstatic get type() {\n\n\t\treturn 'BumpMapNode';\n\n\t}\n\n\t/**\n\t * Constructs a new bump map node.\n\t *\n\t * @param {Node<float>} textureNode - Represents the bump map data.\n\t * @param {?Node<float>} [scaleNode=null] - Controls the intensity of the bump effect.\n\t */\n\tconstructor( textureNode, scaleNode = null ) {\n\n\t\tsuper( 'vec3' );\n\n\t\t/**\n\t\t * Represents the bump map data.\n\t\t *\n\t\t * @type {Node<float>}\n\t\t */\n\t\tthis.textureNode = textureNode;\n\n\t\t/**\n\t\t * Controls the intensity of the bump effect.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.scaleNode = scaleNode;\n\n\t}\n\n\tsetup() {\n\n\t\tconst bumpScale = this.scaleNode !== null ? this.scaleNode : 1;\n\t\tconst dHdxy = dHdxy_fwd( { textureNode: this.textureNode, bumpScale } );\n\n\t\treturn perturbNormalArb( {\n\t\t\tsurf_pos: positionView,\n\t\t\tsurf_norm: normalView,\n\t\t\tdHdxy\n\t\t} );\n\n\t}\n\n}\n\n/**\n * TSL function for creating a bump map node.\n *\n * @tsl\n * @function\n * @param {Node<float>} textureNode - Represents the bump map data.\n * @param {?Node<float>} [scaleNode=null] - Controls the intensity of the bump effect.\n * @returns {BumpMapNode}\n */\nconst bumpMap = /*@__PURE__*/ nodeProxy( BumpMapNode ).setParameterLength( 1, 2 );\n\nconst _propertyCache = new Map();\n\n/**\n * This class should simplify the node access to material properties.\n * It internal uses reference nodes to make sure  changes to material\n * properties are automatically reflected to predefined TSL objects\n * like e.g. `materialColor`.\n *\n * @augments Node\n */\nclass MaterialNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'MaterialNode';\n\n\t}\n\n\t/**\n\t * Constructs a new material node.\n\t *\n\t * @param {string} scope - The scope defines what kind of material property is referred by the node.\n\t */\n\tconstructor( scope ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The scope defines what material property is referred by the node.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.scope = scope;\n\n\t}\n\n\t/**\n\t * Returns a cached reference node for the given property and type.\n\t *\n\t * @param {string} property - The name of the material property.\n\t * @param {string} type - The uniform type of the property.\n\t * @return {MaterialReferenceNode} A material reference node representing the property access.\n\t */\n\tgetCache( property, type ) {\n\n\t\tlet node = _propertyCache.get( property );\n\n\t\tif ( node === undefined ) {\n\n\t\t\tnode = materialReference( property, type );\n\n\t\t\t_propertyCache.set( property, node );\n\n\t\t}\n\n\t\treturn node;\n\n\t}\n\n\t/**\n\t * Returns a float-typed material reference node for the given property name.\n\t *\n\t * @param {string} property - The name of the material property.\n\t * @return {MaterialReferenceNode<float>} A material reference node representing the property access.\n\t */\n\tgetFloat( property ) {\n\n\t\treturn this.getCache( property, 'float' );\n\n\t}\n\n\t/**\n\t * Returns a color-typed material reference node for the given property name.\n\t *\n\t * @param {string} property - The name of the material property.\n\t * @return {MaterialReferenceNode<color>} A material reference node representing the property access.\n\t */\n\tgetColor( property ) {\n\n\t\treturn this.getCache( property, 'color' );\n\n\t}\n\n\t/**\n\t * Returns a texture-typed material reference node for the given property name.\n\t *\n\t * @param {string} property - The name of the material property.\n\t * @return {MaterialReferenceNode} A material reference node representing the property access.\n\t */\n\tgetTexture( property ) {\n\n\t\treturn this.getCache( property === 'map' ? 'map' : property + 'Map', 'texture' );\n\n\t}\n\n\t/**\n\t * The node setup is done depending on the selected scope. Multiple material properties\n\t * might be grouped into a single node composition if they logically belong together.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {Node} The node representing the selected scope.\n\t */\n\tsetup( builder ) {\n\n\t\tconst material = builder.context.material;\n\t\tconst scope = this.scope;\n\n\t\tlet node = null;\n\n\t\tif ( scope === MaterialNode.COLOR ) {\n\n\t\t\tconst colorNode = material.color !== undefined ? this.getColor( scope ) : vec3();\n\n\t\t\tif ( material.map && material.map.isTexture === true ) {\n\n\t\t\t\tnode = colorNode.mul( this.getTexture( 'map' ) );\n\n\t\t\t} else {\n\n\t\t\t\tnode = colorNode;\n\n\t\t\t}\n\n\t\t} else if ( scope === MaterialNode.OPACITY ) {\n\n\t\t\tconst opacityNode = this.getFloat( scope );\n\n\t\t\tif ( material.alphaMap && material.alphaMap.isTexture === true ) {\n\n\t\t\t\tnode = opacityNode.mul( this.getTexture( 'alpha' ) );\n\n\t\t\t} else {\n\n\t\t\t\tnode = opacityNode;\n\n\t\t\t}\n\n\t\t} else if ( scope === MaterialNode.SPECULAR_STRENGTH ) {\n\n\t\t\tif ( material.specularMap && material.specularMap.isTexture === true ) {\n\n\t\t\t\tnode = this.getTexture( 'specular' ).r;\n\n\t\t\t} else {\n\n\t\t\t\tnode = float( 1 );\n\n\t\t\t}\n\n\t\t} else if ( scope === MaterialNode.SPECULAR_INTENSITY ) {\n\n\t\t\tconst specularIntensityNode = this.getFloat( scope );\n\n\t\t\tif ( material.specularIntensityMap && material.specularIntensityMap.isTexture === true ) {\n\n\t\t\t\tnode = specularIntensityNode.mul( this.getTexture( scope ).a );\n\n\t\t\t} else {\n\n\t\t\t\tnode = specularIntensityNode;\n\n\t\t\t}\n\n\t\t} else if ( scope === MaterialNode.SPECULAR_COLOR ) {\n\n\t\t\tconst specularColorNode = this.getColor( scope );\n\n\t\t\tif ( material.specularColorMap && material.specularColorMap.isTexture === true ) {\n\n\t\t\t\tnode = specularColorNode.mul( this.getTexture( scope ).rgb );\n\n\t\t\t} else {\n\n\t\t\t\tnode = specularColorNode;\n\n\t\t\t}\n\n\t\t} else if ( scope === MaterialNode.ROUGHNESS ) { // TODO: cleanup similar branches\n\n\t\t\tconst roughnessNode = this.getFloat( scope );\n\n\t\t\tif ( material.roughnessMap && material.roughnessMap.isTexture === true ) {\n\n\t\t\t\tnode = roughnessNode.mul( this.getTexture( scope ).g );\n\n\t\t\t} else {\n\n\t\t\t\tnode = roughnessNode;\n\n\t\t\t}\n\n\t\t} else if ( scope === MaterialNode.METALNESS ) {\n\n\t\t\tconst metalnessNode = this.getFloat( scope );\n\n\t\t\tif ( material.metalnessMap && material.metalnessMap.isTexture === true ) {\n\n\t\t\t\tnode = metalnessNode.mul( this.getTexture( scope ).b );\n\n\t\t\t} else {\n\n\t\t\t\tnode = metalnessNode;\n\n\t\t\t}\n\n\t\t} else if ( scope === MaterialNode.EMISSIVE ) {\n\n\t\t\tconst emissiveIntensityNode = this.getFloat( 'emissiveIntensity' );\n\t\t\tconst emissiveNode = this.getColor( scope ).mul( emissiveIntensityNode );\n\n\t\t\tif ( material.emissiveMap && material.emissiveMap.isTexture === true ) {\n\n\t\t\t\tnode = emissiveNode.mul( this.getTexture( scope ) );\n\n\t\t\t} else {\n\n\t\t\t\tnode = emissiveNode;\n\n\t\t\t}\n\n\t\t} else if ( scope === MaterialNode.NORMAL ) {\n\n\t\t\tif ( material.normalMap ) {\n\n\t\t\t\tnode = normalMap( this.getTexture( 'normal' ), this.getCache( 'normalScale', 'vec2' ) );\n\t\t\t\tnode.normalMapType = material.normalMapType;\n\n\t\t\t\tif ( material.normalMap.format == RGFormat || material.normalMap.format == RED_GREEN_RGTC2_Format || material.normalMap.format == RG11_EAC_Format ) {\n\n\t\t\t\t\tnode.unpackNormalMode = NormalRGPacking;\n\n\t\t\t\t}\n\n\t\t\t} else if ( material.bumpMap ) {\n\n\t\t\t\tnode = bumpMap( this.getTexture( 'bump' ).r, this.getFloat( 'bumpScale' ) );\n\n\t\t\t} else {\n\n\t\t\t\tnode = normalView;\n\n\t\t\t}\n\n\t\t} else if ( scope === MaterialNode.CLEARCOAT ) {\n\n\t\t\tconst clearcoatNode = this.getFloat( scope );\n\n\t\t\tif ( material.clearcoatMap && material.clearcoatMap.isTexture === true ) {\n\n\t\t\t\tnode = clearcoatNode.mul( this.getTexture( scope ).r );\n\n\t\t\t} else {\n\n\t\t\t\tnode = clearcoatNode;\n\n\t\t\t}\n\n\t\t} else if ( scope === MaterialNode.CLEARCOAT_ROUGHNESS ) {\n\n\t\t\tconst clearcoatRoughnessNode = this.getFloat( scope );\n\n\t\t\tif ( material.clearcoatRoughnessMap && material.clearcoatRoughnessMap.isTexture === true ) {\n\n\t\t\t\tnode = clearcoatRoughnessNode.mul( this.getTexture( scope ).r );\n\n\t\t\t} else {\n\n\t\t\t\tnode = clearcoatRoughnessNode;\n\n\t\t\t}\n\n\t\t} else if ( scope === MaterialNode.CLEARCOAT_NORMAL ) {\n\n\t\t\tif ( material.clearcoatNormalMap ) {\n\n\t\t\t\tnode = normalMap( this.getTexture( scope ), this.getCache( scope + 'Scale', 'vec2' ) );\n\n\t\t\t} else {\n\n\t\t\t\tnode = normalView;\n\n\t\t\t}\n\n\t\t} else if ( scope === MaterialNode.SHEEN ) {\n\n\t\t\tconst sheenNode = this.getColor( 'sheenColor' ).mul( this.getFloat( 'sheen' ) ); // Move this mul() to CPU\n\n\t\t\tif ( material.sheenColorMap && material.sheenColorMap.isTexture === true ) {\n\n\t\t\t\tnode = sheenNode.mul( this.getTexture( 'sheenColor' ).rgb );\n\n\t\t\t} else {\n\n\t\t\t\tnode = sheenNode;\n\n\t\t\t}\n\n\t\t} else if ( scope === MaterialNode.SHEEN_ROUGHNESS ) {\n\n\t\t\tconst sheenRoughnessNode = this.getFloat( scope );\n\n\t\t\tif ( material.sheenRoughnessMap && material.sheenRoughnessMap.isTexture === true ) {\n\n\t\t\t\tnode = sheenRoughnessNode.mul( this.getTexture( scope ).a );\n\n\t\t\t} else {\n\n\t\t\t\tnode = sheenRoughnessNode;\n\n\t\t\t}\n\n\t\t\tnode = node.clamp( 0.0001, 1.0 );\n\n\t\t} else if ( scope === MaterialNode.ANISOTROPY ) {\n\n\t\t\tif ( material.anisotropyMap && material.anisotropyMap.isTexture === true ) {\n\n\t\t\t\tconst anisotropyPolar = this.getTexture( scope );\n\t\t\t\tconst anisotropyMat = mat2( materialAnisotropyVector.x, materialAnisotropyVector.y, materialAnisotropyVector.y.negate(), materialAnisotropyVector.x );\n\n\t\t\t\tnode = anisotropyMat.mul( anisotropyPolar.rg.mul( 2.0 ).sub( vec2( 1.0 ) ).normalize().mul( anisotropyPolar.b ) );\n\n\t\t\t} else {\n\n\t\t\t\tnode = materialAnisotropyVector;\n\n\t\t\t}\n\n\t\t} else if ( scope === MaterialNode.IRIDESCENCE_THICKNESS ) {\n\n\t\t\tconst iridescenceThicknessMaximum = reference( '1', 'float', material.iridescenceThicknessRange );\n\n\t\t\tif ( material.iridescenceThicknessMap ) {\n\n\t\t\t\tconst iridescenceThicknessMinimum = reference( '0', 'float', material.iridescenceThicknessRange );\n\n\t\t\t\tnode = iridescenceThicknessMaximum.sub( iridescenceThicknessMinimum ).mul( this.getTexture( scope ).g ).add( iridescenceThicknessMinimum );\n\n\t\t\t} else {\n\n\t\t\t\tnode = iridescenceThicknessMaximum;\n\n\t\t\t}\n\n\t\t} else if ( scope === MaterialNode.TRANSMISSION ) {\n\n\t\t\tconst transmissionNode = this.getFloat( scope );\n\n\t\t\tif ( material.transmissionMap ) {\n\n\t\t\t\tnode = transmissionNode.mul( this.getTexture( scope ).r );\n\n\t\t\t} else {\n\n\t\t\t\tnode = transmissionNode;\n\n\t\t\t}\n\n\t\t} else if ( scope === MaterialNode.THICKNESS ) {\n\n\t\t\tconst thicknessNode = this.getFloat( scope );\n\n\t\t\tif ( material.thicknessMap ) {\n\n\t\t\t\tnode = thicknessNode.mul( this.getTexture( scope ).g );\n\n\t\t\t} else {\n\n\t\t\t\tnode = thicknessNode;\n\n\t\t\t}\n\n\t\t} else if ( scope === MaterialNode.IOR ) {\n\n\t\t\tnode = this.getFloat( scope );\n\n\t\t} else if ( scope === MaterialNode.LIGHT_MAP ) {\n\n\t\t\tnode = this.getTexture( scope ).rgb.mul( this.getFloat( 'lightMapIntensity' ) );\n\n\t\t} else if ( scope === MaterialNode.AO ) {\n\n\t\t\tnode = this.getTexture( scope ).r.sub( 1.0 ).mul( this.getFloat( 'aoMapIntensity' ) ).add( 1.0 );\n\n\t\t} else if ( scope === MaterialNode.LINE_DASH_OFFSET ) {\n\n\t\t\tnode = ( material.dashOffset ) ? this.getFloat( scope ) : float( 0 );\n\n\t\t} else {\n\n\t\t\tconst outputType = this.getNodeType( builder );\n\n\t\t\tnode = this.getCache( scope, outputType );\n\n\t\t}\n\n\t\treturn node;\n\n\t}\n\n}\n\nMaterialNode.ALPHA_TEST = 'alphaTest';\nMaterialNode.COLOR = 'color';\nMaterialNode.OPACITY = 'opacity';\nMaterialNode.SHININESS = 'shininess';\nMaterialNode.SPECULAR = 'specular';\nMaterialNode.SPECULAR_STRENGTH = 'specularStrength';\nMaterialNode.SPECULAR_INTENSITY = 'specularIntensity';\nMaterialNode.SPECULAR_COLOR = 'specularColor';\nMaterialNode.REFLECTIVITY = 'reflectivity';\nMaterialNode.ROUGHNESS = 'roughness';\nMaterialNode.METALNESS = 'metalness';\nMaterialNode.NORMAL = 'normal';\nMaterialNode.CLEARCOAT = 'clearcoat';\nMaterialNode.CLEARCOAT_ROUGHNESS = 'clearcoatRoughness';\nMaterialNode.CLEARCOAT_NORMAL = 'clearcoatNormal';\nMaterialNode.EMISSIVE = 'emissive';\nMaterialNode.ROTATION = 'rotation';\nMaterialNode.SHEEN = 'sheen';\nMaterialNode.SHEEN_ROUGHNESS = 'sheenRoughness';\nMaterialNode.ANISOTROPY = 'anisotropy';\nMaterialNode.IRIDESCENCE = 'iridescence';\nMaterialNode.IRIDESCENCE_IOR = 'iridescenceIOR';\nMaterialNode.IRIDESCENCE_THICKNESS = 'iridescenceThickness';\nMaterialNode.IOR = 'ior';\nMaterialNode.TRANSMISSION = 'transmission';\nMaterialNode.THICKNESS = 'thickness';\nMaterialNode.ATTENUATION_DISTANCE = 'attenuationDistance';\nMaterialNode.ATTENUATION_COLOR = 'attenuationColor';\nMaterialNode.LINE_SCALE = 'scale';\nMaterialNode.LINE_DASH_SIZE = 'dashSize';\nMaterialNode.LINE_GAP_SIZE = 'gapSize';\nMaterialNode.LINE_WIDTH = 'linewidth';\nMaterialNode.LINE_DASH_OFFSET = 'dashOffset';\nMaterialNode.POINT_SIZE = 'size';\nMaterialNode.DISPERSION = 'dispersion';\nMaterialNode.LIGHT_MAP = 'light';\nMaterialNode.AO = 'ao';\n\n/**\n * TSL object that represents alpha test of the current material.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst materialAlphaTest = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.ALPHA_TEST );\n\n/**\n * TSL object that represents the diffuse color of the current material.\n * The value is composed via `color` * `map`.\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst materialColor = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.COLOR );\n\n/**\n * TSL object that represents the shininess of the current material.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst materialShininess = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.SHININESS );\n\n/**\n * TSL object that represents the emissive color of the current material.\n * The value is composed via `emissive` * `emissiveIntensity` * `emissiveMap`.\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst materialEmissive = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.EMISSIVE );\n\n/**\n * TSL object that represents the opacity of the current material.\n * The value is composed via `opacity` * `alphaMap`.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst materialOpacity = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.OPACITY );\n\n/**\n * TSL object that represents the specular of the current material.\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst materialSpecular = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.SPECULAR );\n\n/**\n * TSL object that represents the specular intensity of the current material.\n * The value is composed via `specularIntensity` * `specularMap.a`.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst materialSpecularIntensity = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.SPECULAR_INTENSITY );\n\n/**\n * TSL object that represents the specular color of the current material.\n * The value is composed via `specularColor` * `specularMap.rgb`.\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst materialSpecularColor = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.SPECULAR_COLOR );\n\n/**\n * TSL object that represents the specular strength of the current material.\n * The value is composed via `specularMap.r`.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst materialSpecularStrength = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.SPECULAR_STRENGTH );\n\n/**\n * TSL object that represents the reflectivity of the current material.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst materialReflectivity = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.REFLECTIVITY );\n\n/**\n * TSL object that represents the roughness of the current material.\n * The value is composed via `roughness` * `roughnessMap.g`.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst materialRoughness = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.ROUGHNESS );\n\n/**\n * TSL object that represents the metalness of the current material.\n * The value is composed via `metalness` * `metalnessMap.b`.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst materialMetalness = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.METALNESS );\n\n/**\n * TSL object that represents the normal of the current material.\n * The value will be either `normalMap` * `normalScale`, `bumpMap` * `bumpScale` or `normalView`.\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst materialNormal = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.NORMAL );\n\n/**\n * TSL object that represents the clearcoat of the current material.\n * The value is composed via `clearcoat` * `clearcoatMap.r`\n *\n * @tsl\n * @type {Node<float>}\n */\nconst materialClearcoat = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.CLEARCOAT );\n\n/**\n * TSL object that represents the clearcoat roughness of the current material.\n * The value is composed via `clearcoatRoughness` * `clearcoatRoughnessMap.r`.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst materialClearcoatRoughness = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.CLEARCOAT_ROUGHNESS );\n\n/**\n * TSL object that represents the clearcoat normal of the current material.\n * The value will be either `clearcoatNormalMap` or `normalView`.\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst materialClearcoatNormal = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.CLEARCOAT_NORMAL );\n\n/**\n * TSL object that represents the rotation of the current sprite material.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst materialRotation = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.ROTATION );\n\n/**\n * TSL object that represents the sheen color of the current material.\n * The value is composed via `sheen` * `sheenColor` * `sheenColorMap`.\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst materialSheen = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.SHEEN );\n\n/**\n * TSL object that represents the sheen roughness of the current material.\n * The value is composed via `sheenRoughness` * `sheenRoughnessMap.a`.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst materialSheenRoughness = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.SHEEN_ROUGHNESS );\n\n/**\n * TSL object that represents the anisotropy of the current material.\n *\n * @tsl\n * @type {Node<vec2>}\n */\nconst materialAnisotropy = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.ANISOTROPY );\n\n/**\n * TSL object that represents the iridescence of the current material.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst materialIridescence = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.IRIDESCENCE );\n\n/**\n * TSL object that represents the iridescence IOR of the current material.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst materialIridescenceIOR = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.IRIDESCENCE_IOR );\n\n/**\n * TSL object that represents the iridescence thickness of the current material.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst materialIridescenceThickness = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.IRIDESCENCE_THICKNESS );\n\n/**\n * TSL object that represents the transmission of the current material.\n * The value is composed via `transmission` * `transmissionMap.r`.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst materialTransmission = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.TRANSMISSION );\n\n/**\n * TSL object that represents the thickness of the current material.\n * The value is composed via `thickness` * `thicknessMap.g`.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst materialThickness = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.THICKNESS );\n\n/**\n * TSL object that represents the IOR of the current material.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst materialIOR = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.IOR );\n\n/**\n * TSL object that represents the attenuation distance of the current material.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst materialAttenuationDistance = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.ATTENUATION_DISTANCE );\n\n/**\n * TSL object that represents the attenuation color of the current material.\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst materialAttenuationColor = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.ATTENUATION_COLOR );\n\n/**\n * TSL object that represents the scale of the current dashed line material.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst materialLineScale = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.LINE_SCALE );\n\n/**\n * TSL object that represents the dash size of the current dashed line material.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst materialLineDashSize = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.LINE_DASH_SIZE );\n\n/**\n * TSL object that represents the gap size of the current dashed line material.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst materialLineGapSize = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.LINE_GAP_SIZE );\n\n/**\n * TSL object that represents the line width of the current line material.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst materialLineWidth = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.LINE_WIDTH );\n\n/**\n * TSL object that represents the dash offset of the current line material.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst materialLineDashOffset = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.LINE_DASH_OFFSET );\n\n/**\n * TSL object that represents the point size of the current points material.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst materialPointSize = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.POINT_SIZE );\n\n/**\n * TSL object that represents the dispersion of the current material.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst materialDispersion = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.DISPERSION );\n\n/**\n * TSL object that represents the light map of the current material.\n * The value is composed via `lightMapIntensity` * `lightMap.rgb`.\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst materialLightMap = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.LIGHT_MAP );\n\n/**\n * TSL object that represents the ambient occlusion map of the current material.\n * The value is composed via `aoMap.r` - 1 * `aoMapIntensity` + 1.\n *\n * @tsl\n * @type {Node<float>}\n */\nconst materialAO = /*@__PURE__*/ nodeImmutable( MaterialNode, MaterialNode.AO );\n\n/**\n * TSL object that represents the anisotropy vector of the current material.\n *\n * @tsl\n * @type {Node<vec2>}\n */\nconst materialAnisotropyVector = /*@__PURE__*/ uniform( new Vector2() ).onReference( function ( frame ) {\n\n\treturn frame.material;\n\n} ).onRenderUpdate( function ( { material } ) {\n\n\tthis.value.set( material.anisotropy * Math.cos( material.anisotropyRotation ), material.anisotropy * Math.sin( material.anisotropyRotation ) );\n\n} );\n\n/**\n * TSL object that represents the position in clip space after the model-view-projection transform of the current rendered object.\n *\n * @tsl\n * @type {VaryingNode<vec4>}\n */\nconst modelViewProjection = /*@__PURE__*/ ( Fn( ( builder ) => {\n\n\treturn builder.context.setupModelViewProjection();\n\n}, 'vec4' ).once() )().toVarying( 'v_modelViewProjection' );\n\n/**\n * This class enables element access on instances of {@link StorageBufferNode}.\n * In most cases, it is indirectly used when accessing elements with the\n * {@link StorageBufferNode#element} method.\n *\n * ```js\n * const position = positionStorage.element( instanceIndex );\n * ```\n *\n * @augments ArrayElementNode\n */\nclass StorageArrayElementNode extends ArrayElementNode {\n\n\tstatic get type() {\n\n\t\treturn 'StorageArrayElementNode';\n\n\t}\n\n\t/**\n\t * Constructs storage buffer element node.\n\t *\n\t * @param {StorageBufferNode} storageBufferNode - The storage buffer node.\n\t * @param {Node} indexNode - The index node that defines the element access.\n\t */\n\tconstructor( storageBufferNode, indexNode ) {\n\n\t\tsuper( storageBufferNode, indexNode );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isStorageArrayElementNode = true;\n\n\t}\n\n\t/**\n\t * The storage buffer node.\n\t *\n\t * @param {Node} value\n\t * @type {StorageBufferNode}\n\t */\n\tset storageBufferNode( value ) {\n\n\t\tthis.node = value;\n\n\t}\n\n\tget storageBufferNode() {\n\n\t\treturn this.node;\n\n\t}\n\n\tgetMemberType( builder, name ) {\n\n\t\tconst structTypeNode = this.storageBufferNode.structTypeNode;\n\n\t\tif ( structTypeNode ) {\n\n\t\t\treturn structTypeNode.getMemberType( builder, name );\n\n\t\t}\n\n\t\treturn 'void';\n\n\t}\n\n\tsetup( builder ) {\n\n\t\tif ( builder.isAvailable( 'storageBuffer' ) === false ) {\n\n\t\t\tif ( this.node.isPBO === true ) {\n\n\t\t\t\tbuilder.setupPBO( this.node );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn super.setup( builder );\n\n\t}\n\n\tgenerate( builder, output ) {\n\n\t\tlet snippet;\n\n\t\tconst isAssignContext = builder.context.assign;\n\n\t\t//\n\n\t\tif ( builder.isAvailable( 'storageBuffer' ) === false ) {\n\n\t\t\tif ( this.node.isPBO === true && isAssignContext !== true && ( this.node.value.isInstancedBufferAttribute || builder.shaderStage !== 'compute' ) ) {\n\n\t\t\t\tsnippet = builder.generatePBO( this );\n\n\t\t\t} else {\n\n\t\t\t\tsnippet = this.node.build( builder );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tsnippet = super.generate( builder );\n\n\t\t}\n\n\t\tif ( isAssignContext !== true ) {\n\n\t\t\tconst type = this.getNodeType( builder );\n\n\t\t\tsnippet = builder.format( snippet, type, output );\n\n\t\t}\n\n\t\treturn snippet;\n\n\t}\n\n}\n\n/**\n * TSL function for creating a storage element node.\n *\n * @tsl\n * @function\n * @param {StorageBufferNode} storageBufferNode - The storage buffer node.\n * @param {Node} indexNode - The index node that defines the element access.\n * @returns {StorageArrayElementNode}\n */\nconst storageElement = /*@__PURE__*/ nodeProxy( StorageArrayElementNode ).setParameterLength( 2 );\n\n/**\n * This node is used in context of compute shaders and allows to define a\n * storage buffer for data. A typical workflow is to create instances of\n * this node with the convenience functions `attributeArray()` or `instancedArray()`,\n * setup up a compute shader that writes into the buffers and then convert\n * the storage buffers to attribute nodes for rendering.\n *\n * ```js\n * const positionBuffer = instancedArray( particleCount, 'vec3' ); // the storage buffer node\n *\n * const computeInit = Fn( () => { // the compute shader\n *\n * \tconst position = positionBuffer.element( instanceIndex );\n *\n * \t// compute position data\n *\n * \tposition.x = 1;\n * \tposition.y = 1;\n * \tposition.z = 1;\n *\n * } )().compute( particleCount );\n *\n * const particleMaterial = new THREE.SpriteNodeMaterial();\n * particleMaterial.positionNode = positionBuffer.toAttribute();\n *\n * renderer.computeAsync( computeInit );\n *\n * ```\n *\n * @augments BufferNode\n */\nclass StorageBufferNode extends BufferNode {\n\n\tstatic get type() {\n\n\t\treturn 'StorageBufferNode';\n\n\t}\n\n\t/**\n\t * Constructs a new storage buffer node.\n\t *\n\t * @param {StorageBufferAttribute|StorageInstancedBufferAttribute|BufferAttribute} value - The buffer data.\n\t * @param {?(string|Struct)} [bufferType=null] - The buffer type (e.g. `'vec3'`).\n\t * @param {number} [bufferCount=0] - The buffer count.\n\t */\n\tconstructor( value, bufferType = null, bufferCount = 0 ) {\n\n\t\tlet nodeType, structTypeNode = null;\n\n\t\tif ( bufferType && bufferType.isStruct ) {\n\n\t\t\tnodeType = 'struct';\n\t\t\tstructTypeNode = bufferType.layout;\n\n\t\t\tif ( value.isStorageBufferAttribute || value.isStorageInstancedBufferAttribute ) {\n\n\t\t\t\tbufferCount = value.count;\n\n\t\t\t}\n\n\t\t} else if ( bufferType === null && ( value.isStorageBufferAttribute || value.isStorageInstancedBufferAttribute ) ) {\n\n\t\t\tnodeType = getTypeFromLength( value.itemSize );\n\t\t\tbufferCount = value.count;\n\n\t\t} else {\n\n\t\t\tnodeType = bufferType;\n\n\t\t}\n\n\t\tsuper( value, nodeType, bufferCount );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isStorageBufferNode = true;\n\n\n\t\t/**\n\t\t * The buffer struct type.\n\t\t *\n\t\t * @type {?StructTypeNode}\n\t\t * @default null\n\t\t */\n\t\tthis.structTypeNode = structTypeNode;\n\n\t\t/**\n\t\t * The access type of the texture node.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'readWrite'\n\t\t */\n\t\tthis.access = NodeAccess.READ_WRITE;\n\n\t\t/**\n\t\t * Whether the node is atomic or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.isAtomic = false;\n\n\t\t/**\n\t\t * Whether the node represents a PBO or not.\n\t\t * Only relevant for WebGL.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.isPBO = false;\n\n\t\t/**\n\t\t * A reference to the internal buffer attribute node.\n\t\t *\n\t\t * @private\n\t\t * @type {?BufferAttributeNode}\n\t\t * @default null\n\t\t */\n\t\tthis._attribute = null;\n\n\t\t/**\n\t\t * A reference to the internal varying node.\n\t\t *\n\t\t * @private\n\t\t * @type {?VaryingNode}\n\t\t * @default null\n\t\t */\n\t\tthis._varying = null;\n\n\t\t/**\n\t\t * `StorageBufferNode` sets this property to `true` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.global = true;\n\n\t\tif ( value.isStorageBufferAttribute !== true && value.isStorageInstancedBufferAttribute !== true ) {\n\n\t\t\t// TODO: Improve it, possibly adding a new property to the BufferAttribute to identify it as a storage buffer read-only attribute in Renderer\n\n\t\t\tif ( value.isInstancedBufferAttribute ) value.isStorageInstancedBufferAttribute = true;\n\t\t\telse value.isStorageBufferAttribute = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * This method is overwritten since the buffer data might be shared\n\t * and thus the hash should be shared as well.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The hash.\n\t */\n\tgetHash( builder ) {\n\n\t\tif ( this.bufferCount === 0 ) {\n\n\t\t\tlet bufferData = builder.globalCache.getData( this.value );\n\n\t\t\tif ( bufferData === undefined ) {\n\n\t\t\t\tbufferData = {\n\t\t\t\t\tnode: this\n\t\t\t\t};\n\n\t\t\t\tbuilder.globalCache.setData( this.value, bufferData );\n\n\t\t\t}\n\n\t\t\treturn bufferData.node.uuid;\n\n\t\t}\n\n\t\treturn this.uuid;\n\n\t}\n\n\t/**\n\t * Overwrites the default implementation to return a fixed value `'indirectStorageBuffer'` or `'storageBuffer'`.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The input type.\n\t */\n\tgetInputType( /*builder*/ ) {\n\n\t\treturn this.value.isIndirectStorageBufferAttribute ? 'indirectStorageBuffer' : 'storageBuffer';\n\n\t}\n\n\t/**\n\t * Enables element access with the given index node.\n\t *\n\t * @param {IndexNode} indexNode - The index node.\n\t * @return {StorageArrayElementNode} A node representing the element access.\n\t */\n\telement( indexNode ) {\n\n\t\treturn storageElement( this, indexNode );\n\n\t}\n\n\t/**\n\t * Defines whether this node is a PBO or not. Only relevant for WebGL.\n\t *\n\t * @param {boolean} value - The value so set.\n\t * @return {StorageBufferNode} A reference to this node.\n\t */\n\tsetPBO( value ) {\n\n\t\tthis.isPBO = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the `isPBO` value.\n\t *\n\t * @return {boolean} Whether the node represents a PBO or not.\n\t */\n\tgetPBO() {\n\n\t\treturn this.isPBO;\n\n\t}\n\n\t/**\n\t * Defines the node access.\n\t *\n\t * @param {string} value - The node access.\n\t * @return {StorageBufferNode} A reference to this node.\n\t */\n\tsetAccess( value ) {\n\n\t\tthis.access = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Convenience method for configuring a read-only node access.\n\t *\n\t * @return {StorageBufferNode} A reference to this node.\n\t */\n\ttoReadOnly() {\n\n\t\treturn this.setAccess( NodeAccess.READ_ONLY );\n\n\t}\n\n\t/**\n\t * Defines whether the node is atomic or not.\n\t *\n\t * @param {boolean} value - The atomic flag.\n\t * @return {StorageBufferNode} A reference to this node.\n\t */\n\tsetAtomic( value ) {\n\n\t\tthis.isAtomic = value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Convenience method for making this node atomic.\n\t *\n\t * @return {StorageBufferNode} A reference to this node.\n\t */\n\ttoAtomic() {\n\n\t\treturn this.setAtomic( true );\n\n\t}\n\n\t/**\n\t * Returns attribute data for this storage buffer node.\n\t *\n\t * @return {{attribute: BufferAttributeNode, varying: VaryingNode}} The attribute data.\n\t */\n\tgetAttributeData() {\n\n\t\tif ( this._attribute === null ) {\n\n\t\t\tthis._attribute = bufferAttribute( this.value );\n\t\t\tthis._varying = varying( this._attribute );\n\n\t\t}\n\n\t\treturn {\n\t\t\tattribute: this._attribute,\n\t\t\tvarying: this._varying\n\t\t};\n\n\t}\n\n\t/**\n\t * This method is overwritten since the node type from the availability of storage buffers\n\t * and the attribute data.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The node type.\n\t */\n\tgetNodeType( builder ) {\n\n\t\tif ( this.structTypeNode !== null ) {\n\n\t\t\treturn this.structTypeNode.getNodeType( builder );\n\n\t\t}\n\n\t\tif ( builder.isAvailable( 'storageBuffer' ) || builder.isAvailable( 'indirectStorageBuffer' ) ) {\n\n\t\t\treturn super.getNodeType( builder );\n\n\t\t}\n\n\t\tconst { attribute } = this.getAttributeData();\n\n\t\treturn attribute.getNodeType( builder );\n\n\t}\n\n\t/**\n\t * Returns the type of a member of the struct.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @param {string} name - The name of the member.\n\t * @return {string} The type of the member.\n\t */\n\tgetMemberType( builder, name ) {\n\n\t\tif ( this.structTypeNode !== null ) {\n\n\t\t\treturn this.structTypeNode.getMemberType( builder, name );\n\n\t\t}\n\n\t\treturn 'void';\n\n\t}\n\n\t/**\n\t * Generates the code snippet of the storage buffer node.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The generated code snippet.\n\t */\n\tgenerate( builder ) {\n\n\t\tif ( this.structTypeNode !== null ) this.structTypeNode.build( builder );\n\n\t\tif ( builder.isAvailable( 'storageBuffer' ) || builder.isAvailable( 'indirectStorageBuffer' ) ) {\n\n\t\t\treturn super.generate( builder );\n\n\t\t}\n\n\t\tconst { attribute, varying } = this.getAttributeData();\n\n\t\tconst output = varying.build( builder );\n\n\t\tbuilder.registerTransform( output, attribute );\n\n\t\treturn output;\n\n\t}\n\n}\n\n/**\n * TSL function for creating a storage buffer node.\n *\n * @tsl\n * @function\n * @param {StorageBufferAttribute|StorageInstancedBufferAttribute|BufferAttribute} value - The buffer data.\n * @param {?(string|Struct)} [type=null] - The buffer type (e.g. `'vec3'`).\n * @param {number} [count=0] - The buffer count.\n * @returns {StorageBufferNode}\n */\nconst storage = ( value, type = null, count = 0 ) => new StorageBufferNode( value, type, count );\n\n/**\n * @tsl\n * @function\n * @deprecated since r171. Use `storage().setPBO( true )` instead.\n *\n * @param {StorageBufferAttribute|StorageInstancedBufferAttribute|BufferAttribute} value - The buffer data.\n * @param {?string} type - The buffer type (e.g. `'vec3'`).\n * @param {number} count - The buffer count.\n * @returns {StorageBufferNode}\n */\nconst storageObject = ( value, type, count ) => { // @deprecated, r171\n\n\twarn( 'TSL: \"storageObject()\" is deprecated. Use \"storage().setPBO( true )\" instead.' );\n\n\treturn storage( value, type, count ).setPBO( true );\n\n};\n\n/**\n * This class represents shader indices of different types. The following predefined node\n * objects cover frequent use cases:\n *\n * - `vertexIndex`: The index of a vertex within a mesh.\n * - `instanceIndex`: The index of either a mesh instance or an invocation of a compute shader.\n * - `drawIndex`: The index of a draw call.\n * - `invocationLocalIndex`: The index of a compute invocation within the scope of a workgroup load.\n * - `invocationSubgroupIndex`: The index of a compute invocation within the scope of a subgroup.\n * - `subgroupIndex`: The index of a compute invocation's subgroup within its workgroup.\n *\n * @augments Node\n */\nclass IndexNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'IndexNode';\n\n\t}\n\n\t/**\n\t * Constructs a new index node.\n\t *\n\t * @param {('vertex'|'instance'|'subgroup'|'invocationLocal'|'invocationGlobal'|'invocationSubgroup'|'draw')} scope - The scope of the index node.\n\t */\n\tconstructor( scope ) {\n\n\t\tsuper( 'uint' );\n\n\t\t/**\n\t\t * The scope of the index node.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.scope = scope;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isIndexNode = true;\n\n\t}\n\n\tgenerate( builder ) {\n\n\t\tconst nodeType = this.getNodeType( builder );\n\t\tconst scope = this.scope;\n\n\t\tlet propertyName;\n\n\t\tif ( scope === IndexNode.VERTEX ) {\n\n\t\t\tpropertyName = builder.getVertexIndex();\n\n\t\t} else if ( scope === IndexNode.INSTANCE ) {\n\n\t\t\tpropertyName = builder.getInstanceIndex();\n\n\t\t} else if ( scope === IndexNode.DRAW ) {\n\n\t\t\tpropertyName = builder.getDrawIndex();\n\n\t\t} else if ( scope === IndexNode.INVOCATION_LOCAL ) {\n\n\t\t\tpropertyName = builder.getInvocationLocalIndex();\n\n\t\t} else if ( scope === IndexNode.INVOCATION_SUBGROUP ) {\n\n\t\t\tpropertyName = builder.getInvocationSubgroupIndex();\n\n\t\t} else if ( scope === IndexNode.SUBGROUP ) {\n\n\t\t\tpropertyName = builder.getSubgroupIndex();\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.IndexNode: Unknown scope: ' + scope );\n\n\t\t}\n\n\t\tlet output;\n\n\t\tif ( builder.shaderStage === 'vertex' || builder.shaderStage === 'compute' ) {\n\n\t\t\toutput = propertyName;\n\n\t\t} else {\n\n\t\t\tconst nodeVarying = varying( this );\n\n\t\t\toutput = nodeVarying.build( builder, nodeType );\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n}\n\nIndexNode.VERTEX = 'vertex';\nIndexNode.INSTANCE = 'instance';\nIndexNode.SUBGROUP = 'subgroup';\nIndexNode.INVOCATION_LOCAL = 'invocationLocal';\nIndexNode.INVOCATION_SUBGROUP = 'invocationSubgroup';\nIndexNode.DRAW = 'draw';\n\n/**\n * TSL object that represents the index of a vertex within a mesh.\n *\n * @tsl\n * @type {IndexNode}\n */\nconst vertexIndex = /*@__PURE__*/ nodeImmutable( IndexNode, IndexNode.VERTEX );\n\n/**\n * TSL object that represents the index of either a mesh instance or an invocation of a compute shader.\n *\n * @tsl\n * @type {IndexNode}\n */\nconst instanceIndex = /*@__PURE__*/ nodeImmutable( IndexNode, IndexNode.INSTANCE );\n\n/**\n * TSL object that represents the index of the subgroup the current compute invocation belongs to.\n *\n * @tsl\n * @type {IndexNode}\n */\nconst subgroupIndex = /*@__PURE__*/ nodeImmutable( IndexNode, IndexNode.SUBGROUP );\n\n/**\n * TSL object that represents the index of a compute invocation within the scope of a subgroup.\n *\n * @tsl\n * @type {IndexNode}\n */\nconst invocationSubgroupIndex = /*@__PURE__*/ nodeImmutable( IndexNode, IndexNode.INVOCATION_SUBGROUP );\n\n/**\n * TSL object that represents the index of a compute invocation within the scope of a workgroup load.\n *\n * @tsl\n * @type {IndexNode}\n */\nconst invocationLocalIndex = /*@__PURE__*/ nodeImmutable( IndexNode, IndexNode.INVOCATION_LOCAL );\n\n/**\n * TSL object that represents the index of a draw call.\n *\n * @tsl\n * @type {IndexNode}\n */\nconst drawIndex = /*@__PURE__*/ nodeImmutable( IndexNode, IndexNode.DRAW );\n\n/**\n * This node implements the vertex shader logic which is required\n * when rendering 3D objects via instancing. The code makes sure\n * vertex positions, normals and colors can be modified via instanced\n * data.\n *\n * @augments Node\n */\nclass InstanceNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'InstanceNode';\n\n\t}\n\n\t/**\n\t * Constructs a new instance node.\n\t *\n\t * @param {number} count - The number of instances.\n\t * @param {InstancedBufferAttribute|StorageInstancedBufferAttribute} instanceMatrix - Instanced buffer attribute representing the instance transformations.\n\t * @param {?InstancedBufferAttribute|StorageInstancedBufferAttribute} instanceColor - Instanced buffer attribute representing the instance colors.\n\t */\n\tconstructor( count, instanceMatrix, instanceColor = null ) {\n\n\t\tsuper( 'void' );\n\n\t\t/**\n\t\t * The number of instances.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.count = count;\n\n\t\t/**\n\t\t * Instanced buffer attribute representing the transformation of instances.\n\t\t *\n\t\t * @type {InstancedBufferAttribute}\n\t\t */\n\t\tthis.instanceMatrix = instanceMatrix;\n\n\t\t/**\n\t\t * Instanced buffer attribute representing the color of instances.\n\t\t *\n\t\t * @type {InstancedBufferAttribute}\n\t\t */\n\t\tthis.instanceColor = instanceColor;\n\n\t\t/**\n\t\t * The node that represents the instance matrix data.\n\t\t *\n\t\t * @type {?Node}\n\t\t */\n\t\tthis.instanceMatrixNode = null;\n\n\t\t/**\n\t\t * The node that represents the instance color data.\n\t\t *\n\t\t * @type {?Node}\n\t\t * @default null\n\t\t */\n\t\tthis.instanceColorNode = null;\n\n\t\t/**\n\t\t * The update type is set to `frame` since an update\n\t\t * of instanced buffer data must be checked per frame.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'frame'\n\t\t */\n\t\tthis.updateType = NodeUpdateType.FRAME;\n\n\t\t/**\n\t\t * A reference to a buffer that is used by `instanceMatrixNode`.\n\t\t *\n\t\t * @type {?InstancedInterleavedBuffer}\n\t\t */\n\t\tthis.buffer = null;\n\n\t\t/**\n\t\t * A reference to a buffer that is used by `instanceColorNode`.\n\t\t *\n\t\t * @type {?InstancedBufferAttribute}\n\t\t */\n\t\tthis.bufferColor = null;\n\n\t}\n\n\t/**\n\t * Tracks whether the matrix data is provided via a storage buffer.\n\t *\n\t * @type {boolean}\n\t */\n\tget isStorageMatrix() {\n\n\t\tconst { instanceMatrix } = this;\n\n\t\treturn instanceMatrix && instanceMatrix.isStorageInstancedBufferAttribute === true;\n\n\t}\n\n\t/**\n\t * Tracks whether the color data is provided via a storage buffer.\n\t *\n\t * @type {boolean}\n\t */\n\tget isStorageColor() {\n\n\t\tconst { instanceColor } = this;\n\n\t\treturn instanceColor && instanceColor.isStorageInstancedBufferAttribute === true;\n\n\t}\n\n\t/**\n\t * Setups the internal buffers and nodes and assigns the transformed vertex data\n\t * to predefined node variables for accumulation. That follows the same patterns\n\t * like with morph and skinning nodes.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tsetup( builder ) {\n\n\t\tconst { instanceMatrix, instanceColor, isStorageMatrix, isStorageColor } = this;\n\n\t\tconst { count } = instanceMatrix;\n\n\t\tlet { instanceMatrixNode, instanceColorNode } = this;\n\n\t\tif ( instanceMatrixNode === null ) {\n\n\t\t\tif ( isStorageMatrix ) {\n\n\t\t\t\tinstanceMatrixNode = storage( instanceMatrix, 'mat4', Math.max( count, 1 ) ).element( instanceIndex );\n\n\t\t\t} else {\n\n\t\t\t\t// Both backends have ~64kb UBO limit; fallback to attributes above 1000 matrices.\n\n\t\t\t\tif ( count <= 1000 ) {\n\n\t\t\t\t\tinstanceMatrixNode = buffer( instanceMatrix.array, 'mat4', Math.max( count, 1 ) ).element( instanceIndex );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst interleaved = new InstancedInterleavedBuffer( instanceMatrix.array, 16, 1 );\n\n\t\t\t\t\tthis.buffer = interleaved;\n\n\t\t\t\t\tconst bufferFn = instanceMatrix.usage === DynamicDrawUsage ? instancedDynamicBufferAttribute : instancedBufferAttribute;\n\n\t\t\t\t\tconst instanceBuffers = [\n\t\t\t\t\t\tbufferFn( interleaved, 'vec4', 16, 0 ),\n\t\t\t\t\t\tbufferFn( interleaved, 'vec4', 16, 4 ),\n\t\t\t\t\t\tbufferFn( interleaved, 'vec4', 16, 8 ),\n\t\t\t\t\t\tbufferFn( interleaved, 'vec4', 16, 12 )\n\t\t\t\t\t];\n\n\t\t\t\t\tinstanceMatrixNode = mat4( ...instanceBuffers );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.instanceMatrixNode = instanceMatrixNode;\n\n\t\t}\n\n\t\tif ( instanceColor && instanceColorNode === null ) {\n\n\t\t\tif ( isStorageColor ) {\n\n\t\t\t\tinstanceColorNode = storage( instanceColor, 'vec3', Math.max( instanceColor.count, 1 ) ).element( instanceIndex );\n\n\t\t\t} else {\n\n\t\t\t\tconst bufferAttribute = new InstancedBufferAttribute( instanceColor.array, 3 );\n\n\t\t\t\tconst bufferFn = instanceColor.usage === DynamicDrawUsage ? instancedDynamicBufferAttribute : instancedBufferAttribute;\n\n\t\t\t\tthis.bufferColor = bufferAttribute;\n\n\t\t\t\tinstanceColorNode = vec3( bufferFn( bufferAttribute, 'vec3', 3, 0 ) );\n\n\t\t\t}\n\n\t\t\tthis.instanceColorNode = instanceColorNode;\n\n\t\t}\n\n\t\t// POSITION\n\n\t\tconst instancePosition = instanceMatrixNode.mul( positionLocal ).xyz;\n\t\tpositionLocal.assign( instancePosition );\n\n\t\t// NORMAL\n\n\t\tif ( builder.hasGeometryAttribute( 'normal' ) ) {\n\n\t\t\tconst instanceNormal = transformNormal( normalLocal, instanceMatrixNode );\n\n\t\t\t// ASSIGNS\n\n\t\t\tnormalLocal.assign( instanceNormal );\n\n\t\t}\n\n\t\t// COLOR\n\n\t\tif ( this.instanceColorNode !== null ) {\n\n\t\t\tvaryingProperty( 'vec3', 'vInstanceColor' ).assign( this.instanceColorNode );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks if the internal buffers require an update.\n\t *\n\t * @param {NodeFrame} frame - The current node frame.\n\t */\n\tupdate( /*frame*/ ) {\n\n\t\tif ( this.buffer !== null && this.isStorageMatrix !== true ) {\n\n\t\t\tthis.buffer.clearUpdateRanges();\n\t\t\tthis.buffer.updateRanges.push( ... this.instanceMatrix.updateRanges );\n\n\t\t\t// update version if necessary\n\n\t\t\tif ( this.instanceMatrix.usage !== DynamicDrawUsage && this.instanceMatrix.version !== this.buffer.version ) {\n\n\t\t\t\tthis.buffer.version = this.instanceMatrix.version;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.instanceColor && this.bufferColor !== null && this.isStorageColor !== true ) {\n\n\t\t\tthis.bufferColor.clearUpdateRanges();\n\t\t\tthis.bufferColor.updateRanges.push( ... this.instanceColor.updateRanges );\n\n\t\t\tif ( this.instanceColor.usage !== DynamicDrawUsage && this.instanceColor.version !== this.bufferColor.version ) {\n\n\t\t\t\tthis.bufferColor.version = this.instanceColor.version;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * TSL function for creating an instance node.\n *\n * @tsl\n * @function\n * @param {number} count - The number of instances.\n * @param {InstancedBufferAttribute|StorageInstancedBufferAttribute} instanceMatrix - Instanced buffer attribute representing the instance transformations.\n * @param {?InstancedBufferAttribute|StorageInstancedBufferAttribute} instanceColor - Instanced buffer attribute representing the instance colors.\n * @returns {InstanceNode}\n */\nconst instance = /*@__PURE__*/ nodeProxy( InstanceNode ).setParameterLength( 2, 3 );\n\n/**\n * This is a special version of `InstanceNode` which requires the usage of {@link InstancedMesh}.\n * It allows an easier setup of the instance node.\n *\n * @augments InstanceNode\n */\nclass InstancedMeshNode extends InstanceNode {\n\n\tstatic get type() {\n\n\t\treturn 'InstancedMeshNode';\n\n\t}\n\n\t/**\n\t * Constructs a new instanced mesh node.\n\t *\n\t * @param {InstancedMesh} instancedMesh - The instanced mesh.\n\t */\n\tconstructor( instancedMesh ) {\n\n\t\tconst { count, instanceMatrix, instanceColor } = instancedMesh;\n\n\t\tsuper( count, instanceMatrix, instanceColor );\n\n\t\t/**\n\t\t * A reference to the instanced mesh.\n\t\t *\n\t\t * @type {InstancedMesh}\n\t\t */\n\t\tthis.instancedMesh = instancedMesh;\n\n\t}\n\n}\n\n/**\n * TSL function for creating an instanced mesh node.\n *\n * @tsl\n * @function\n * @param {InstancedMesh} instancedMesh - The instancedMesh.\n * @returns {InstancedMeshNode}\n */\nconst instancedMesh = /*@__PURE__*/ nodeProxy( InstancedMeshNode ).setParameterLength( 1 );\n\n/**\n * This node implements the vertex shader logic which is required\n * when rendering 3D objects via batching. `BatchNode` must be used\n * with instances of {@link BatchedMesh}.\n *\n * @augments Node\n */\nclass BatchNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'BatchNode';\n\n\t}\n\n\t/**\n\t * Constructs a new batch node.\n\t *\n\t * @param {BatchedMesh} batchMesh - A reference to batched mesh.\n\t */\n\tconstructor( batchMesh ) {\n\n\t\tsuper( 'void' );\n\n\t\t/**\n\t\t * A reference to batched mesh.\n\t\t *\n\t\t * @type {BatchedMesh}\n\t\t */\n\t\tthis.batchMesh = batchMesh;\n\n\t\t/**\n\t\t * The batching index node.\n\t\t *\n\t\t * @type {?IndexNode}\n\t\t * @default null\n\t\t */\n\t\tthis.batchingIdNode = null;\n\n\t}\n\n\t/**\n\t * Setups the internal buffers and nodes and assigns the transformed vertex data\n\t * to predefined node variables for accumulation. That follows the same patterns\n\t * like with morph and skinning nodes.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tsetup( builder ) {\n\n\t\tif ( this.batchingIdNode === null ) {\n\n\t\t\tif ( builder.getDrawIndex() === null ) {\n\n\t\t\t\tthis.batchingIdNode = instanceIndex;\n\n\t\t\t} else {\n\n\t\t\t\tthis.batchingIdNode = drawIndex;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst getIndirectIndex = Fn( ( [ id ] ) => {\n\n\t\t\tconst size = int( textureSize( textureLoad( this.batchMesh._indirectTexture ), 0 ).x ).toConst();\n\t\t\tconst x = int( id ).mod( size ).toConst();\n\t\t\tconst y = int( id ).div( size ).toConst();\n\t\t\treturn textureLoad( this.batchMesh._indirectTexture, ivec2( x, y ) ).x;\n\n\t\t} ).setLayout( {\n\t\t\tname: 'getIndirectIndex',\n\t\t\ttype: 'uint',\n\t\t\tinputs: [\n\t\t\t\t{ name: 'id', type: 'int' }\n\t\t\t]\n\t\t} );\n\n\t\tconst indirectId = getIndirectIndex( int( this.batchingIdNode ) );\n\n\t\tconst matricesTexture = this.batchMesh._matricesTexture;\n\n\t\tconst size = int( textureSize( textureLoad( matricesTexture ), 0 ).x ).toConst();\n\t\tconst j = float( indirectId ).mul( 4 ).toInt().toConst();\n\n\t\tconst x = j.mod( size ).toConst();\n\t\tconst y = j.div( size ).toConst();\n\t\tconst batchingMatrix = mat4(\n\t\t\ttextureLoad( matricesTexture, ivec2( x, y ) ),\n\t\t\ttextureLoad( matricesTexture, ivec2( x.add( 1 ), y ) ),\n\t\t\ttextureLoad( matricesTexture, ivec2( x.add( 2 ), y ) ),\n\t\t\ttextureLoad( matricesTexture, ivec2( x.add( 3 ), y ) )\n\t\t);\n\n\n\t\tconst colorsTexture = this.batchMesh._colorsTexture;\n\n\t\tif ( colorsTexture !== null ) {\n\n\t\t\tconst getBatchingColor = Fn( ( [ id ] ) => {\n\n\t\t\t\tconst size = int( textureSize( textureLoad( colorsTexture ), 0 ).x ).toConst();\n\t\t\t\tconst j = id;\n\t\t\t\tconst x = j.mod( size ).toConst();\n\t\t\t\tconst y = j.div( size ).toConst();\n\t\t\t\treturn textureLoad( colorsTexture, ivec2( x, y ) ).rgb;\n\n\t\t\t} ).setLayout( {\n\t\t\t\tname: 'getBatchingColor',\n\t\t\t\ttype: 'vec3',\n\t\t\t\tinputs: [\n\t\t\t\t\t{ name: 'id', type: 'int' }\n\t\t\t\t]\n\t\t\t} );\n\n\t\t\tconst color = getBatchingColor( indirectId );\n\n\t\t\tvaryingProperty( 'vec3', 'vBatchColor' ).assign( color );\n\n\t\t}\n\n\t\tconst bm = mat3( batchingMatrix );\n\n\t\tpositionLocal.assign( batchingMatrix.mul( positionLocal ) );\n\n\t\tconst transformedNormal = normalLocal.div( vec3( bm[ 0 ].dot( bm[ 0 ] ), bm[ 1 ].dot( bm[ 1 ] ), bm[ 2 ].dot( bm[ 2 ] ) ) );\n\n\t\tconst batchingNormal = bm.mul( transformedNormal ).xyz;\n\n\t\tnormalLocal.assign( batchingNormal );\n\n\t\tif ( builder.hasGeometryAttribute( 'tangent' ) ) {\n\n\t\t\ttangentLocal.mulAssign( bm );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * TSL function for creating a batch node.\n *\n * @tsl\n * @function\n * @param {BatchedMesh} batchMesh - A reference to batched mesh.\n * @returns {BatchNode}\n */\nconst batch = /*@__PURE__*/ nodeProxy( BatchNode ).setParameterLength( 1 );\n\nconst _frameId = new WeakMap();\n\n/**\n * This node implements the vertex transformation shader logic which is required\n * for skinning/skeletal animation.\n *\n * @augments Node\n */\nclass SkinningNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'SkinningNode';\n\n\t}\n\n\t/**\n\t * Constructs a new skinning node.\n\t *\n\t * @param {SkinnedMesh} skinnedMesh - The skinned mesh.\n\t */\n\tconstructor( skinnedMesh ) {\n\n\t\tsuper( 'void' );\n\n\t\t/**\n\t\t * The skinned mesh.\n\t\t *\n\t\t * @type {SkinnedMesh}\n\t\t */\n\t\tthis.skinnedMesh = skinnedMesh;\n\n\t\t/**\n\t\t * The update type overwritten since skinning nodes are updated per object.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.updateType = NodeUpdateType.OBJECT;\n\n\t\t//\n\n\t\t/**\n\t\t * The skin index attribute.\n\t\t *\n\t\t * @type {AttributeNode}\n\t\t */\n\t\tthis.skinIndexNode = attribute( 'skinIndex', 'uvec4' );\n\n\t\t/**\n\t\t * The skin weight attribute.\n\t\t *\n\t\t * @type {AttributeNode}\n\t\t */\n\t\tthis.skinWeightNode = attribute( 'skinWeight', 'vec4' );\n\n\t\t/**\n\t\t * The bind matrix node.\n\t\t *\n\t\t * @type {Node<mat4>}\n\t\t */\n\t\tthis.bindMatrixNode = reference( 'bindMatrix', 'mat4' );\n\n\t\t/**\n\t\t * The bind matrix inverse node.\n\t\t *\n\t\t * @type {Node<mat4>}\n\t\t */\n\t\tthis.bindMatrixInverseNode = reference( 'bindMatrixInverse', 'mat4' );\n\n\t\t/**\n\t\t * The bind matrices as a uniform buffer node.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.boneMatricesNode = referenceBuffer( 'skeleton.boneMatrices', 'mat4', skinnedMesh.skeleton.bones.length );\n\n\t\t/**\n\t\t * The current vertex position in local space.\n\t\t *\n\t\t * @type {Node<vec3>}\n\t\t */\n\t\tthis.positionNode = positionLocal;\n\n\t\t/**\n\t\t * The result of vertex position in local space.\n\t\t *\n\t\t * @type {Node<vec3>}\n\t\t */\n\t\tthis.toPositionNode = positionLocal;\n\n\t\t/**\n\t\t * The previous bind matrices as a uniform buffer node.\n\t\t * Required for computing motion vectors.\n\t\t *\n\t\t * @type {?Node}\n\t\t * @default null\n\t\t */\n\t\tthis.previousBoneMatricesNode = null;\n\n\t}\n\n\t/**\n\t * Transforms the given vertex position via skinning.\n\t *\n\t * @param {Node} [boneMatrices=this.boneMatricesNode] - The bone matrices\n\t * @param {Node<vec3>} [position=this.positionNode] - The vertex position in local space.\n\t * @return {Node<vec3>} The transformed vertex position.\n\t */\n\tgetSkinnedPosition( boneMatrices = this.boneMatricesNode, position = this.positionNode ) {\n\n\t\tconst { skinIndexNode, skinWeightNode, bindMatrixNode, bindMatrixInverseNode } = this;\n\n\t\tconst boneMatX = boneMatrices.element( skinIndexNode.x );\n\t\tconst boneMatY = boneMatrices.element( skinIndexNode.y );\n\t\tconst boneMatZ = boneMatrices.element( skinIndexNode.z );\n\t\tconst boneMatW = boneMatrices.element( skinIndexNode.w );\n\n\t\t// POSITION\n\n\t\tconst skinVertex = bindMatrixNode.mul( position );\n\n\t\tconst skinned = add(\n\t\t\tboneMatX.mul( skinWeightNode.x ).mul( skinVertex ),\n\t\t\tboneMatY.mul( skinWeightNode.y ).mul( skinVertex ),\n\t\t\tboneMatZ.mul( skinWeightNode.z ).mul( skinVertex ),\n\t\t\tboneMatW.mul( skinWeightNode.w ).mul( skinVertex )\n\t\t);\n\n\t\treturn bindMatrixInverseNode.mul( skinned ).xyz;\n\n\t}\n\n\t/**\n\t * Transforms the given vertex normal via skinning.\n\t *\n\t * @param {Node} [boneMatrices=this.boneMatricesNode] - The bone matrices\n\t * @param {Node<vec3>} [normal=normalLocal] - The vertex normal in local space.\n\t * @return {Node<vec3>} The transformed vertex normal.\n\t */\n\tgetSkinnedNormal( boneMatrices = this.boneMatricesNode, normal = normalLocal ) {\n\n\t\tconst { skinIndexNode, skinWeightNode, bindMatrixNode, bindMatrixInverseNode } = this;\n\n\t\tconst boneMatX = boneMatrices.element( skinIndexNode.x );\n\t\tconst boneMatY = boneMatrices.element( skinIndexNode.y );\n\t\tconst boneMatZ = boneMatrices.element( skinIndexNode.z );\n\t\tconst boneMatW = boneMatrices.element( skinIndexNode.w );\n\n\t\t// NORMAL\n\n\t\tlet skinMatrix = add(\n\t\t\tskinWeightNode.x.mul( boneMatX ),\n\t\t\tskinWeightNode.y.mul( boneMatY ),\n\t\t\tskinWeightNode.z.mul( boneMatZ ),\n\t\t\tskinWeightNode.w.mul( boneMatW )\n\t\t);\n\n\t\tskinMatrix = bindMatrixInverseNode.mul( skinMatrix ).mul( bindMatrixNode );\n\n\t\treturn skinMatrix.transformDirection( normal ).xyz;\n\n\t}\n\n\t/**\n\t * Computes the transformed/skinned vertex position of the previous frame.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {Node<vec3>} The skinned position from the previous frame.\n\t */\n\tgetPreviousSkinnedPosition( builder ) {\n\n\t\tconst skinnedMesh = builder.object;\n\n\t\tif ( this.previousBoneMatricesNode === null ) {\n\n\t\t\tskinnedMesh.skeleton.previousBoneMatrices = new Float32Array( skinnedMesh.skeleton.boneMatrices );\n\n\t\t\tthis.previousBoneMatricesNode = referenceBuffer( 'skeleton.previousBoneMatrices', 'mat4', skinnedMesh.skeleton.bones.length );\n\n\t\t}\n\n\t\treturn this.getSkinnedPosition( this.previousBoneMatricesNode, positionPrevious );\n\n\t}\n\n\t/**\n\t * Returns `true` if bone matrices from the previous frame are required. Relevant\n\t * when computing motion vectors with {@link VelocityNode}.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {boolean} Whether bone matrices from the previous frame are required or not.\n\t */\n\tneedsPreviousBoneMatrices( builder ) {\n\n\t\tconst mrt = builder.renderer.getMRT();\n\n\t\treturn ( mrt && mrt.has( 'velocity' ) ) || getDataFromObject( builder.object ).useVelocity === true;\n\n\t}\n\n\t/**\n\t * Setups the skinning node by assigning the transformed vertex data to predefined node variables.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {Node<vec3>} The transformed vertex position.\n\t */\n\tsetup( builder ) {\n\n\t\tif ( this.needsPreviousBoneMatrices( builder ) ) {\n\n\t\t\tpositionPrevious.assign( this.getPreviousSkinnedPosition( builder ) );\n\n\t\t}\n\n\t\tconst skinPosition = this.getSkinnedPosition();\n\n\t\tif ( this.toPositionNode ) this.toPositionNode.assign( skinPosition );\n\n\t\t//\n\n\t\tif ( builder.hasGeometryAttribute( 'normal' ) ) {\n\n\t\t\tconst skinNormal = this.getSkinnedNormal();\n\n\t\t\tnormalLocal.assign( skinNormal );\n\n\t\t\tif ( builder.hasGeometryAttribute( 'tangent' ) ) {\n\n\t\t\t\ttangentLocal.assign( skinNormal );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn skinPosition;\n\n\t}\n\n\t/**\n\t * Generates the code snippet of the skinning node.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @param {string} output - The current output.\n\t * @return {string} The generated code snippet.\n\t */\n\tgenerate( builder, output ) {\n\n\t\tif ( output !== 'void' ) {\n\n\t\t\treturn super.generate( builder, output );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the state of the skinned mesh by updating the skeleton once per frame.\n\t *\n\t * @param {NodeFrame} frame - The current node frame.\n\t */\n\tupdate( frame ) {\n\n\t\tconst skeleton = frame.object && frame.object.skeleton ? frame.object.skeleton : this.skinnedMesh.skeleton;\n\n\t\tif ( _frameId.get( skeleton ) === frame.frameId ) return;\n\n\t\t_frameId.set( skeleton, frame.frameId );\n\n\t\tif ( this.previousBoneMatricesNode !== null ) {\n\n\t\t\tif ( skeleton.previousBoneMatrices === null ) {\n\n\t\t\t\t// cloned skeletons miss \"previousBoneMatrices\" in their first updated\n\n\t\t\t\tskeleton.previousBoneMatrices = new Float32Array( skeleton.boneMatrices );\n\n\t\t\t}\n\n\t\t\tskeleton.previousBoneMatrices.set( skeleton.boneMatrices );\n\n\n\t\t}\n\n\t\tskeleton.update();\n\n\t}\n\n}\n\n/**\n * TSL function for creating a skinning node.\n *\n * @tsl\n * @function\n * @param {SkinnedMesh} skinnedMesh - The skinned mesh.\n * @returns {SkinningNode}\n */\nconst skinning = ( skinnedMesh ) => new SkinningNode( skinnedMesh );\n\n/**\n * TSL function for computing skinning.\n *\n * @tsl\n * @function\n * @param {SkinnedMesh} skinnedMesh - The skinned mesh.\n * @param {Node<vec3>} [toPosition=null] - The target position.\n * @returns {SkinningNode}\n */\nconst computeSkinning = ( skinnedMesh, toPosition = null ) => {\n\n\tconst node = new SkinningNode( skinnedMesh );\n\tnode.positionNode = storage( new InstancedBufferAttribute( skinnedMesh.geometry.getAttribute( 'position' ).array, 3 ), 'vec3' ).setPBO( true ).toReadOnly().element( instanceIndex ).toVar();\n\tnode.skinIndexNode = storage( new InstancedBufferAttribute( new Uint32Array( skinnedMesh.geometry.getAttribute( 'skinIndex' ).array ), 4 ), 'uvec4' ).setPBO( true ).toReadOnly().element( instanceIndex ).toVar();\n\tnode.skinWeightNode = storage( new InstancedBufferAttribute( skinnedMesh.geometry.getAttribute( 'skinWeight' ).array, 4 ), 'vec4' ).setPBO( true ).toReadOnly().element( instanceIndex ).toVar();\n\tnode.bindMatrixNode = uniform( skinnedMesh.bindMatrix, 'mat4' );\n\tnode.bindMatrixInverseNode = uniform( skinnedMesh.bindMatrixInverse, 'mat4' );\n\tnode.boneMatricesNode = buffer( skinnedMesh.skeleton.boneMatrices, 'mat4', skinnedMesh.skeleton.bones.length );\n\tnode.toPositionNode = toPosition;\n\n\treturn nodeObject( node );\n\n};\n\n/**\n * This module offers a variety of ways to implement loops in TSL. In it's basic form it's:\n * ```js\n * Loop( count, ( { i } ) => {\n *\n * } );\n * ```\n * However, it is also possible to define a start and end ranges, data types and loop conditions:\n * ```js\n * Loop( { start: int( 0 ), end: int( 10 ), type: 'int', condition: '<' }, ( { i } ) => {\n *\n * } );\n *```\n * Nested loops can be defined in a compacted form:\n * ```js\n * Loop( 10, 5, ( { i, j } ) => {\n *\n * } );\n * ```\n * Loops that should run backwards can be defined like so:\n * ```js\n * Loop( { start: 10 }, () => {} );\n * ```\n * It is possible to execute with boolean values, similar to the `while` syntax.\n * ```js\n * const value = float( 0 ).toVar();\n *\n * Loop( value.lessThan( 10 ), () => {\n *\n * \tvalue.addAssign( 1 );\n *\n * } );\n * ```\n * The module also provides `Break()` and `Continue()` TSL expression for loop control.\n * @augments Node\n */\nclass LoopNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'LoopNode';\n\n\t}\n\n\t/**\n\t * Constructs a new loop node.\n\t *\n\t * @param {Array<any>} params - Depending on the loop type, array holds different parameterization values for the loop.\n\t */\n\tconstructor( params = [] ) {\n\n\t\tsuper( 'void' );\n\n\t\tthis.params = params;\n\n\t}\n\n\t/**\n\t * Returns a loop variable name based on an index. The pattern is\n\t * `0` = `i`, `1`= `j`, `2`= `k` and so on.\n\t *\n\t * @param {number} index - The index.\n\t * @return {string} The loop variable name.\n\t */\n\tgetVarName( index ) {\n\n\t\treturn String.fromCharCode( 'i'.charCodeAt( 0 ) + index );\n\n\t}\n\n\t/**\n\t * Returns properties about this node.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {Object} The node properties.\n\t */\n\tgetProperties( builder ) {\n\n\t\tconst properties = builder.getNodeProperties( this );\n\n\t\tif ( properties.stackNode !== undefined ) return properties;\n\n\t\t//\n\n\t\tconst inputs = {};\n\n\t\tfor ( let i = 0, l = this.params.length - 1; i < l; i ++ ) {\n\n\t\t\tconst param = this.params[ i ];\n\n\t\t\tconst name = ( param.isNode !== true && param.name ) || this.getVarName( i );\n\t\t\tconst type = ( param.isNode !== true && param.type ) || 'int';\n\n\t\t\tinputs[ name ] = expression( name, type );\n\n\t\t}\n\n\t\tconst stack = builder.addStack();\n\n\t\tconst fnCall = this.params[ this.params.length - 1 ]( inputs );\n\n\t\tproperties.returnsNode = fnCall.context( { nodeLoop: fnCall } );\n\t\tproperties.stackNode = stack;\n\n\t\tconst baseParam = this.params[ 0 ];\n\n\t\tif ( baseParam.isNode !== true && typeof baseParam.update === 'function' ) {\n\n\t\t\tconst fnUpdateCall = Fn( this.params[ 0 ].update )( inputs );\n\n\t\t\tproperties.updateNode = fnUpdateCall.context( { nodeLoop: fnUpdateCall } );\n\n\t\t}\n\n\t\tbuilder.removeStack();\n\n\t\treturn properties;\n\n\t}\n\n\tsetup( builder ) {\n\n\t\t// setup properties\n\n\t\tthis.getProperties( builder );\n\n\t\tif ( builder.fnCall ) {\n\n\t\t\tconst shaderNodeData = builder.getDataFromNode( builder.fnCall.shaderNode );\n\t\t\tshaderNodeData.hasLoop = true;\n\n\t\t}\n\n\t}\n\n\tgenerate( builder ) {\n\n\t\tconst properties = this.getProperties( builder );\n\n\t\tconst params = this.params;\n\t\tconst stackNode = properties.stackNode;\n\n\t\tfor ( let i = 0, l = params.length - 1; i < l; i ++ ) {\n\n\t\t\tconst param = params[ i ];\n\n\t\t\tlet isWhile = false, start = null, end = null, name = null, type = null, condition = null, update = null;\n\n\t\t\tif ( param.isNode ) {\n\n\t\t\t\tif ( param.getNodeType( builder ) === 'bool' ) {\n\n\t\t\t\t\tisWhile = true;\n\t\t\t\t\ttype = 'bool';\n\t\t\t\t\tend = param.build( builder, type );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttype = 'int';\n\t\t\t\t\tname = this.getVarName( i );\n\t\t\t\t\tstart = '0';\n\t\t\t\t\tend = param.build( builder, type );\n\t\t\t\t\tcondition = '<';\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\ttype = param.type || 'int';\n\t\t\t\tname = param.name || this.getVarName( i );\n\t\t\t\tstart = param.start;\n\t\t\t\tend = param.end;\n\t\t\t\tcondition = param.condition;\n\t\t\t\tupdate = param.update;\n\n\t\t\t\tif ( typeof start === 'number' ) start = builder.generateConst( type, start );\n\t\t\t\telse if ( start && start.isNode ) start = start.build( builder, type );\n\n\t\t\t\tif ( typeof end === 'number' ) end = builder.generateConst( type, end );\n\t\t\t\telse if ( end && end.isNode ) end = end.build( builder, type );\n\n\t\t\t\tif ( start !== undefined && end === undefined ) {\n\n\t\t\t\t\tstart = start + ' - 1';\n\t\t\t\t\tend = '0';\n\t\t\t\t\tcondition = '>=';\n\n\t\t\t\t} else if ( end !== undefined && start === undefined ) {\n\n\t\t\t\t\tstart = '0';\n\t\t\t\t\tcondition = '<';\n\n\t\t\t\t}\n\n\t\t\t\tif ( condition === undefined ) {\n\n\t\t\t\t\tif ( Number( start ) > Number( end ) ) {\n\n\t\t\t\t\t\tcondition = '>=';\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tcondition = '<';\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlet loopSnippet;\n\n\t\t\tif ( isWhile ) {\n\n\t\t\t\tloopSnippet = `while ( ${ end } )`;\n\n\t\t\t} else {\n\n\t\t\t\tconst internalParam = { start, end};\n\n\t\t\t\t//\n\n\t\t\t\tconst startSnippet = internalParam.start;\n\t\t\t\tconst endSnippet = internalParam.end;\n\n\t\t\t\tlet updateSnippet;\n\n\t\t\t\tconst deltaOperator = () => condition.includes( '<' ) ? '+=' : '-=';\n\n\t\t\t\tif ( update !== undefined && update !== null ) {\n\n\t\t\t\t\tswitch ( typeof update ) {\n\n\t\t\t\t\t\tcase 'function':\n\n\t\t\t\t\t\t\tconst flow = builder.flowStagesNode( properties.updateNode, 'void' );\n\t\t\t\t\t\t\tconst snippet = flow.code.replace( /\\t|;/g, '' );\n\n\t\t\t\t\t\t\tupdateSnippet = snippet;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'number':\n\n\t\t\t\t\t\t\tupdateSnippet = name + ' ' + deltaOperator() + ' ' + builder.generateConst( type, update );\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase 'string':\n\n\t\t\t\t\t\t\tupdateSnippet = name + ' ' + update;\n\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\n\t\t\t\t\t\t\tif ( update.isNode ) {\n\n\t\t\t\t\t\t\t\tupdateSnippet = name + ' ' + deltaOperator() + ' ' + update.build( builder );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\terror( 'TSL: \\'Loop( { update: ... } )\\' is not a function, string or number.' );\n\n\t\t\t\t\t\t\t\tupdateSnippet = 'break /* invalid update */';\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( type === 'int' || type === 'uint' ) {\n\n\t\t\t\t\t\tupdate = condition.includes( '<' ) ? '++' : '--';\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tupdate = deltaOperator() + ' 1.';\n\n\t\t\t\t\t}\n\n\t\t\t\t\tupdateSnippet = name + ' ' + update;\n\n\t\t\t\t}\n\n\t\t\t\tconst declarationSnippet = builder.getVar( type, name ) + ' = ' + startSnippet;\n\t\t\t\tconst conditionalSnippet = name + ' ' + condition + ' ' + endSnippet;\n\n\t\t\t\tloopSnippet = `for ( ${ declarationSnippet }; ${ conditionalSnippet }; ${ updateSnippet } )`;\n\n\t\t\t}\n\n\t\t\tbuilder.addFlowCode( ( i === 0 ? '\\n' : '' ) + builder.tab + loopSnippet + ' {\\n\\n' ).addFlowTab();\n\n\t\t}\n\n\t\tconst stackSnippet = stackNode.build( builder, 'void' );\n\n\t\tproperties.returnsNode.build( builder, 'void' );\n\n\t\tbuilder.removeFlowTab().addFlowCode( '\\n' + builder.tab + stackSnippet );\n\n\t\tfor ( let i = 0, l = this.params.length - 1; i < l; i ++ ) {\n\n\t\t\tbuilder.addFlowCode( ( i === 0 ? '' : builder.tab ) + '}\\n\\n' ).removeFlowTab();\n\n\t\t}\n\n\t\tbuilder.addFlowTab();\n\n\t}\n\n}\n\n/**\n * TSL function for creating a loop node.\n *\n * @tsl\n * @function\n * @param {...any} params - A list of parameters.\n * @returns {LoopNode}\n */\nconst Loop = ( ...params ) => new LoopNode( nodeArray( params, 'int' ) ).toStack();\n\n/**\n * TSL function for creating a `Continue()` expression.\n *\n * @tsl\n * @function\n * @returns {ExpressionNode}\n */\nconst Continue = () => expression( 'continue' ).toStack();\n\n/**\n * TSL function for creating a `Break()` expression.\n *\n * @tsl\n * @function\n * @returns {ExpressionNode}\n */\nconst Break = () => expression( 'break' ).toStack();\n\nconst _morphTextures = /*@__PURE__*/ new WeakMap();\nconst _morphVec4 = /*@__PURE__*/ new Vector4();\n\nconst getMorph = /*@__PURE__*/ Fn( ( { bufferMap, influence, stride, width, depth, offset } ) => {\n\n\tconst texelIndex = int( vertexIndex ).mul( stride ).add( offset );\n\n\tconst y = texelIndex.div( width );\n\tconst x = texelIndex.sub( y.mul( width ) );\n\n\tconst bufferAttrib = textureLoad( bufferMap, ivec2( x, y ) ).depth( depth ).xyz;\n\n\treturn bufferAttrib.mul( influence );\n\n} );\n\nfunction getEntry( geometry ) {\n\n\tconst hasMorphPosition = geometry.morphAttributes.position !== undefined;\n\tconst hasMorphNormals = geometry.morphAttributes.normal !== undefined;\n\tconst hasMorphColors = geometry.morphAttributes.color !== undefined;\n\n\t// instead of using attributes, the WebGL 2 code path encodes morph targets\n\t// into an array of data textures. Each layer represents a single morph target.\n\n\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\tlet entry = _morphTextures.get( geometry );\n\n\tif ( entry === undefined || entry.count !== morphTargetsCount ) {\n\n\t\tif ( entry !== undefined ) entry.texture.dispose();\n\n\t\tconst morphTargets = geometry.morphAttributes.position || [];\n\t\tconst morphNormals = geometry.morphAttributes.normal || [];\n\t\tconst morphColors = geometry.morphAttributes.color || [];\n\n\t\tlet vertexDataCount = 0;\n\n\t\tif ( hasMorphPosition === true ) vertexDataCount = 1;\n\t\tif ( hasMorphNormals === true ) vertexDataCount = 2;\n\t\tif ( hasMorphColors === true ) vertexDataCount = 3;\n\n\t\tlet width = geometry.attributes.position.count * vertexDataCount;\n\t\tlet height = 1;\n\n\t\tconst maxTextureSize = 4096; // @TODO: Use 'capabilities.maxTextureSize'\n\n\t\tif ( width > maxTextureSize ) {\n\n\t\t\theight = Math.ceil( width / maxTextureSize );\n\t\t\twidth = maxTextureSize;\n\n\t\t}\n\n\t\tconst buffer = new Float32Array( width * height * 4 * morphTargetsCount );\n\n\t\tconst bufferTexture = new DataArrayTexture( buffer, width, height, morphTargetsCount );\n\t\tbufferTexture.type = FloatType;\n\t\tbufferTexture.needsUpdate = true;\n\n\t\t// fill buffer\n\n\t\tconst vertexDataStride = vertexDataCount * 4;\n\n\t\tfor ( let i = 0; i < morphTargetsCount; i ++ ) {\n\n\t\t\tconst morphTarget = morphTargets[ i ];\n\t\t\tconst morphNormal = morphNormals[ i ];\n\t\t\tconst morphColor = morphColors[ i ];\n\n\t\t\tconst offset = width * height * 4 * i;\n\n\t\t\tfor ( let j = 0; j < morphTarget.count; j ++ ) {\n\n\t\t\t\tconst stride = j * vertexDataStride;\n\n\t\t\t\tif ( hasMorphPosition === true ) {\n\n\t\t\t\t\t_morphVec4.fromBufferAttribute( morphTarget, j );\n\n\t\t\t\t\tbuffer[ offset + stride + 0 ] = _morphVec4.x;\n\t\t\t\t\tbuffer[ offset + stride + 1 ] = _morphVec4.y;\n\t\t\t\t\tbuffer[ offset + stride + 2 ] = _morphVec4.z;\n\t\t\t\t\tbuffer[ offset + stride + 3 ] = 0;\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasMorphNormals === true ) {\n\n\t\t\t\t\t_morphVec4.fromBufferAttribute( morphNormal, j );\n\n\t\t\t\t\tbuffer[ offset + stride + 4 ] = _morphVec4.x;\n\t\t\t\t\tbuffer[ offset + stride + 5 ] = _morphVec4.y;\n\t\t\t\t\tbuffer[ offset + stride + 6 ] = _morphVec4.z;\n\t\t\t\t\tbuffer[ offset + stride + 7 ] = 0;\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasMorphColors === true ) {\n\n\t\t\t\t\t_morphVec4.fromBufferAttribute( morphColor, j );\n\n\t\t\t\t\tbuffer[ offset + stride + 8 ] = _morphVec4.x;\n\t\t\t\t\tbuffer[ offset + stride + 9 ] = _morphVec4.y;\n\t\t\t\t\tbuffer[ offset + stride + 10 ] = _morphVec4.z;\n\t\t\t\t\tbuffer[ offset + stride + 11 ] = ( morphColor.itemSize === 4 ) ? _morphVec4.w : 1;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tentry = {\n\t\t\tcount: morphTargetsCount,\n\t\t\ttexture: bufferTexture,\n\t\t\tstride: vertexDataCount,\n\t\t\tsize: new Vector2( width, height )\n\t\t};\n\n\t\t_morphTextures.set( geometry, entry );\n\n\t\tfunction disposeTexture() {\n\n\t\t\tbufferTexture.dispose();\n\n\t\t\t_morphTextures.delete( geometry );\n\n\t\t\tgeometry.removeEventListener( 'dispose', disposeTexture );\n\n\t\t}\n\n\t\tgeometry.addEventListener( 'dispose', disposeTexture );\n\n\t}\n\n\treturn entry;\n\n}\n\n/**\n * This node implements the vertex transformation shader logic which is required\n * for morph target animation.\n *\n * @augments Node\n */\nclass MorphNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'MorphNode';\n\n\t}\n\n\t/**\n\t * Constructs a new morph node.\n\t *\n\t * @param {Mesh} mesh - The mesh holding the morph targets.\n\t */\n\tconstructor( mesh ) {\n\n\t\tsuper( 'void' );\n\n\t\t/**\n\t\t * The mesh holding the morph targets.\n\t\t *\n\t\t * @type {Mesh}\n\t\t */\n\t\tthis.mesh = mesh;\n\n\t\t/**\n\t\t * A uniform node which represents the morph base influence value.\n\t\t *\n\t\t * @type {UniformNode<float>}\n\t\t */\n\t\tthis.morphBaseInfluence = uniform( 1 );\n\n\t\t/**\n\t\t * The update type overwritten since morph nodes are updated per object.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.updateType = NodeUpdateType.OBJECT;\n\n\t}\n\n\t/**\n\t * Setups the morph node by assigning the transformed vertex data to predefined node variables.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tsetup( builder ) {\n\n\t\tconst { geometry } = builder;\n\n\t\tconst hasMorphPosition = geometry.morphAttributes.position !== undefined;\n\t\tconst hasMorphNormals = geometry.hasAttribute( 'normal' ) && geometry.morphAttributes.normal !== undefined;\n\n\t\tconst morphAttribute = geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color;\n\t\tconst morphTargetsCount = ( morphAttribute !== undefined ) ? morphAttribute.length : 0;\n\n\t\t// nodes\n\n\t\tconst { texture: bufferMap, stride, size } = getEntry( geometry );\n\n\t\tif ( hasMorphPosition === true ) positionLocal.mulAssign( this.morphBaseInfluence );\n\t\tif ( hasMorphNormals === true ) normalLocal.mulAssign( this.morphBaseInfluence );\n\n\t\tconst width = int( size.width );\n\n\t\tLoop( morphTargetsCount, ( { i } ) => {\n\n\t\t\tconst influence = float( 0 ).toVar();\n\n\t\t\tif ( this.mesh.count > 1 && ( this.mesh.morphTexture !== null && this.mesh.morphTexture !== undefined ) ) {\n\n\t\t\t\tinfluence.assign( textureLoad( this.mesh.morphTexture, ivec2( int( i ).add( 1 ), int( instanceIndex ) ) ).r );\n\n\t\t\t} else {\n\n\t\t\t\tinfluence.assign( reference( 'morphTargetInfluences', 'float' ).element( i ).toVar() );\n\n\t\t\t}\n\n\t\t\tIf( influence.notEqual( 0 ), () => {\n\n\t\t\t\tif ( hasMorphPosition === true ) {\n\n\t\t\t\t\tpositionLocal.addAssign( getMorph( {\n\t\t\t\t\t\tbufferMap,\n\t\t\t\t\t\tinfluence,\n\t\t\t\t\t\tstride,\n\t\t\t\t\t\twidth,\n\t\t\t\t\t\tdepth: i,\n\t\t\t\t\t\toffset: int( 0 )\n\t\t\t\t\t} ) );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasMorphNormals === true ) {\n\n\t\t\t\t\tnormalLocal.addAssign( getMorph( {\n\t\t\t\t\t\tbufferMap,\n\t\t\t\t\t\tinfluence,\n\t\t\t\t\t\tstride,\n\t\t\t\t\t\twidth,\n\t\t\t\t\t\tdepth: i,\n\t\t\t\t\t\toffset: int( 1 )\n\t\t\t\t\t} ) );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Updates the state of the morphed mesh by updating the base influence.\n\t *\n\t * @param {NodeFrame} frame - The current node frame.\n\t */\n\tupdate( /*frame*/ ) {\n\n\t\tconst morphBaseInfluence = this.morphBaseInfluence;\n\n\t\tif ( this.mesh.geometry.morphTargetsRelative ) {\n\n\t\t\tmorphBaseInfluence.value = 1;\n\n\t\t} else {\n\n\t\t\tmorphBaseInfluence.value = 1 - this.mesh.morphTargetInfluences.reduce( ( a, b ) => a + b, 0 );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * TSL function for creating a morph node.\n *\n * @tsl\n * @function\n * @param {Mesh} mesh - The mesh holding the morph targets.\n * @returns {MorphNode}\n */\nconst morphReference = /*@__PURE__*/ nodeProxy( MorphNode ).setParameterLength( 1 );\n\n/**\n * Base class for lighting nodes.\n *\n * @augments Node\n */\nclass LightingNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'LightingNode';\n\n\t}\n\n\t/**\n\t * Constructs a new lighting node.\n\t */\n\tconstructor() {\n\n\t\tsuper( 'vec3' );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLightingNode = true;\n\n\t}\n\n}\n\n/**\n * A generic class that can be used by nodes which contribute\n * ambient occlusion to the scene. E.g. an ambient occlusion map\n * node can be used as input for this module. Used in {@link NodeMaterial}.\n *\n * @augments LightingNode\n */\nclass AONode extends LightingNode {\n\n\tstatic get type() {\n\n\t\treturn 'AONode';\n\n\t}\n\n\t/**\n\t * Constructs a new AO node.\n\t *\n\t * @param {?Node<float>} [aoNode=null] - The ambient occlusion node.\n\t */\n\tconstructor( aoNode = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The ambient occlusion node.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.aoNode = aoNode;\n\n\t}\n\n\tsetup( builder ) {\n\n\t\tbuilder.context.ambientOcclusion.mulAssign( this.aoNode );\n\n\t}\n\n}\n\n/**\n * `LightingContextNode` represents an extension of the {@link ContextNode} module\n * by adding lighting specific context data. It represents the runtime context of\n * {@link LightsNode}.\n *\n * @augments ContextNode\n */\nclass LightingContextNode extends ContextNode {\n\n\tstatic get type() {\n\n\t\treturn 'LightingContextNode';\n\n\t}\n\n\t/**\n\t * Constructs a new lighting context node.\n\t *\n\t * @param {LightsNode} lightsNode - The lights node.\n\t * @param {?LightingModel} [lightingModel=null] - The current lighting model.\n\t * @param {?Node<vec3>} [backdropNode=null] - A backdrop node.\n\t * @param {?Node<float>} [backdropAlphaNode=null] - A backdrop alpha node.\n\t */\n\tconstructor( lightsNode, lightingModel = null, backdropNode = null, backdropAlphaNode = null ) {\n\n\t\tsuper( lightsNode );\n\n\t\t/**\n\t\t * The current lighting model.\n\t\t *\n\t\t * @type {?LightingModel}\n\t\t * @default null\n\t\t */\n\t\tthis.lightingModel = lightingModel;\n\n\t\t/**\n\t\t * A backdrop node.\n\t\t *\n\t\t * @type {?Node<vec3>}\n\t\t * @default null\n\t\t */\n\t\tthis.backdropNode = backdropNode;\n\n\t\t/**\n\t\t * A backdrop alpha node.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.backdropAlphaNode = backdropAlphaNode;\n\n\t\tthis._value = null;\n\n\t}\n\n\t/**\n\t * Returns a lighting context object.\n\t *\n\t * @return {{\n\t * radiance: Node<vec3>,\n\t * irradiance: Node<vec3>,\n\t * iblIrradiance: Node<vec3>,\n\t * ambientOcclusion: Node<float>,\n\t * reflectedLight: {directDiffuse: Node<vec3>, directSpecular: Node<vec3>, indirectDiffuse: Node<vec3>, indirectSpecular: Node<vec3>},\n\t * backdrop: Node<vec3>,\n\t * backdropAlpha: Node<float>\n\t * }} The lighting context object.\n\t */\n\tgetContext() {\n\n\t\tconst { backdropNode, backdropAlphaNode } = this;\n\n\t\tconst directDiffuse = vec3().toVar( 'directDiffuse' ),\n\t\t\tdirectSpecular = vec3().toVar( 'directSpecular' ),\n\t\t\tindirectDiffuse = vec3().toVar( 'indirectDiffuse' ),\n\t\t\tindirectSpecular = vec3().toVar( 'indirectSpecular' );\n\n\t\tconst reflectedLight = {\n\t\t\tdirectDiffuse,\n\t\t\tdirectSpecular,\n\t\t\tindirectDiffuse,\n\t\t\tindirectSpecular\n\t\t};\n\n\t\tconst context = {\n\t\t\tradiance: vec3().toVar( 'radiance' ),\n\t\t\tirradiance: vec3().toVar( 'irradiance' ),\n\t\t\tiblIrradiance: vec3().toVar( 'iblIrradiance' ),\n\t\t\tambientOcclusion: float( 1 ).toVar( 'ambientOcclusion' ),\n\t\t\treflectedLight,\n\t\t\tbackdrop: backdropNode,\n\t\t\tbackdropAlpha: backdropAlphaNode\n\t\t};\n\n\t\treturn context;\n\n\t}\n\n\tsetup( builder ) {\n\n\t\tthis.value = this._value || ( this._value = this.getContext() );\n\t\tthis.value.lightingModel = this.lightingModel || builder.context.lightingModel;\n\n\t\treturn super.setup( builder );\n\n\t}\n\n}\n\nconst lightingContext = /*@__PURE__*/ nodeProxy( LightingContextNode );\n\n/**\n * A generic class that can be used by nodes which contribute\n * irradiance to the scene. E.g. a light map node can be used\n * as input for this module. Used in {@link NodeMaterial}.\n *\n * @augments LightingNode\n */\nclass IrradianceNode extends LightingNode {\n\n\tstatic get type() {\n\n\t\treturn 'IrradianceNode';\n\n\t}\n\n\t/**\n\t * Constructs a new irradiance node.\n\t *\n\t * @param {Node<vec3>} node - A node contributing irradiance.\n\t */\n\tconstructor( node ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * A node contributing irradiance.\n\t\t *\n\t\t * @type {Node<vec3>}\n\t\t */\n\t\tthis.node = node;\n\n\t}\n\n\tsetup( builder ) {\n\n\t\tbuilder.context.irradiance.addAssign( this.node );\n\n\t}\n\n}\n\nconst _size$5 = /*@__PURE__*/ new Vector2();\n\n/**\n * A special type of texture node which represents the data of the current viewport\n * as a texture. The module extracts data from the current bound framebuffer with\n * a copy operation so no extra render pass is required to produce the texture data\n * (which is good for performance). `ViewportTextureNode` can be used as an input for a\n * variety of effects like refractive or transmissive materials.\n *\n * @augments TextureNode\n */\nclass ViewportTextureNode extends TextureNode {\n\n\tstatic get type() {\n\n\t\treturn 'ViewportTextureNode';\n\n\t}\n\n\t/**\n\t * Constructs a new viewport texture node.\n\t *\n\t * @param {Node} [uvNode=screenUV] - The uv node.\n\t * @param {?Node} [levelNode=null] - The level node.\n\t * @param {?Texture} [framebufferTexture=null] - A framebuffer texture holding the viewport data. If not provided, a framebuffer texture is created automatically.\n\t */\n\tconstructor( uvNode = screenUV, levelNode = null, framebufferTexture = null ) {\n\n\t\tlet defaultFramebuffer = null;\n\n\t\tif ( framebufferTexture === null ) {\n\n\t\t\tdefaultFramebuffer = new FramebufferTexture();\n\t\t\tdefaultFramebuffer.minFilter = LinearMipmapLinearFilter;\n\n\t\t\tframebufferTexture = defaultFramebuffer;\n\n\t\t} else {\n\n\t\t\tdefaultFramebuffer = framebufferTexture;\n\n\t\t}\n\n\t\tsuper( framebufferTexture, uvNode, levelNode );\n\n\t\t/**\n\t\t * Whether to generate mipmaps or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.generateMipmaps = false;\n\n\t\t/**\n\t\t * The reference framebuffer texture. This is used to store the framebuffer texture\n\t\t * for the current render target. If the render target changes, a new framebuffer texture\n\t\t * is created automatically.\n\t\t *\n\t\t * @type {FramebufferTexture}\n\t\t * @default null\n\t\t */\n\t\tthis.defaultFramebuffer = defaultFramebuffer;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isOutputTextureNode = true;\n\n\t\t/**\n\t\t * The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node renders the\n\t\t * scene once per frame in its {@link ViewportTextureNode#updateBefore} method.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'frame'\n\t\t */\n\t\tthis.updateBeforeType = NodeUpdateType.FRAME;\n\n\t\t/**\n\t\t * The framebuffer texture for the current renderer context.\n\t\t *\n\t\t * @type {WeakMap<RenderTarget, FramebufferTexture>}\n\t\t * @private\n\t\t */\n\t\tthis._cacheTextures = new WeakMap();\n\n\t}\n\n\t/**\n\t * This methods returns a texture for the given render target reference.\n\t *\n\t * To avoid rendering errors, `ViewportTextureNode` must use unique framebuffer textures\n\t * for different render contexts.\n\t *\n\t * @param {?RenderTarget} [reference=null] - The render target reference.\n\t * @return {Texture} The framebuffer texture.\n\t */\n\tgetTextureForReference( reference = null ) {\n\n\t\tlet defaultFramebuffer;\n\t\tlet cacheTextures;\n\n\t\tif ( this.referenceNode ) {\n\n\t\t\tdefaultFramebuffer = this.referenceNode.defaultFramebuffer;\n\t\t\tcacheTextures = this.referenceNode._cacheTextures;\n\n\t\t} else {\n\n\t\t\tdefaultFramebuffer = this.defaultFramebuffer;\n\t\t\tcacheTextures = this._cacheTextures;\n\n\t\t}\n\n\t\tif ( reference === null ) {\n\n\t\t\treturn defaultFramebuffer;\n\n\t\t}\n\n\t\tif ( cacheTextures.has( reference ) === false ) {\n\n\t\t\tconst framebufferTexture = defaultFramebuffer.clone();\n\n\t\t\tcacheTextures.set( reference, framebufferTexture );\n\n\t\t}\n\n\t\treturn cacheTextures.get( reference );\n\n\t}\n\n\tupdateReference( frame ) {\n\n\t\tconst renderTarget = frame.renderer.getRenderTarget();\n\n\t\tthis.value = this.getTextureForReference( renderTarget );\n\n\t\treturn this.value;\n\n\t}\n\n\tupdateBefore( frame ) {\n\n\t\tconst renderer = frame.renderer;\n\t\tconst renderTarget = renderer.getRenderTarget();\n\n\t\tif ( renderTarget === null ) {\n\n\t\t\trenderer.getDrawingBufferSize( _size$5 );\n\n\t\t} else {\n\n\t\t\t_size$5.set( renderTarget.width, renderTarget.height );\n\n\t\t}\n\n\t\t//\n\n\t\tconst framebufferTexture = this.getTextureForReference( renderTarget );\n\n\t\tif ( framebufferTexture.image.width !== _size$5.width || framebufferTexture.image.height !== _size$5.height ) {\n\n\t\t\tframebufferTexture.image.width = _size$5.width;\n\t\t\tframebufferTexture.image.height = _size$5.height;\n\t\t\tframebufferTexture.needsUpdate = true;\n\n\t\t}\n\n\t\t//\n\n\t\tconst currentGenerateMipmaps = framebufferTexture.generateMipmaps;\n\t\tframebufferTexture.generateMipmaps = this.generateMipmaps;\n\n\t\trenderer.copyFramebufferToTexture( framebufferTexture );\n\n\t\tframebufferTexture.generateMipmaps = currentGenerateMipmaps;\n\n\t}\n\n\tclone() {\n\n\t\tconst viewportTextureNode = new this.constructor( this.uvNode, this.levelNode, this.value );\n\t\tviewportTextureNode.generateMipmaps = this.generateMipmaps;\n\n\t\treturn viewportTextureNode;\n\n\t}\n\n}\n\n/**\n * TSL function for creating a viewport texture node.\n *\n * @tsl\n * @function\n * @param {?Node} [uvNode=screenUV] - The uv node.\n * @param {?Node} [levelNode=null] - The level node.\n * @param {?Texture} [framebufferTexture=null] - A framebuffer texture holding the viewport data. If not provided, a framebuffer texture is created automatically.\n * @returns {ViewportTextureNode}\n */\nconst viewportTexture = /*@__PURE__*/ nodeProxy( ViewportTextureNode ).setParameterLength( 0, 3 );\n\n/**\n * TSL function for creating a viewport texture node with enabled mipmap generation.\n *\n * @tsl\n * @function\n * @param {?Node} [uvNode=screenUV] - The uv node.\n * @param {?Node} [levelNode=null] - The level node.\n * @param {?Texture} [framebufferTexture=null] - A framebuffer texture holding the viewport data. If not provided, a framebuffer texture is created automatically.\n * @returns {ViewportTextureNode}\n */\nconst viewportMipTexture = /*@__PURE__*/ nodeProxy( ViewportTextureNode, null, null, { generateMipmaps: true } ).setParameterLength( 0, 3 );\n\nlet _sharedDepthbuffer = null;\n\n/**\n * Represents the depth of the current viewport as a texture. This module\n * can be used in combination with viewport texture to achieve effects\n * that require depth evaluation.\n *\n * @augments ViewportTextureNode\n */\nclass ViewportDepthTextureNode extends ViewportTextureNode {\n\n\tstatic get type() {\n\n\t\treturn 'ViewportDepthTextureNode';\n\n\t}\n\n\t/**\n\t * Constructs a new viewport depth texture node.\n\t *\n\t * @param {Node} [uvNode=screenUV] - The uv node.\n\t * @param {?Node} [levelNode=null] - The level node.\n\t */\n\tconstructor( uvNode = screenUV, levelNode = null ) {\n\n\t\tif ( _sharedDepthbuffer === null ) {\n\n\t\t\t_sharedDepthbuffer = new DepthTexture();\n\n\t\t}\n\n\t\tsuper( uvNode, levelNode, _sharedDepthbuffer );\n\n\t}\n\n\t/**\n\t * Overwritten so the method always returns the unique shared\n\t * depth texture.\n\t *\n\t * @return {DepthTexture} The shared depth texture.\n\t */\n\tgetTextureForReference() {\n\n\t\treturn _sharedDepthbuffer;\n\n\t}\n\n}\n\n/**\n * TSL function for a viewport depth texture node.\n *\n * @tsl\n * @function\n * @param {?Node} [uvNode=screenUV] - The uv node.\n * @param {?Node} [levelNode=null] - The level node.\n * @returns {ViewportDepthTextureNode}\n */\nconst viewportDepthTexture = /*@__PURE__*/ nodeProxy( ViewportDepthTextureNode ).setParameterLength( 0, 2 );\n\n/**\n * This node offers a collection of features in context of the depth logic in the fragment shader.\n * Depending on {@link ViewportDepthNode#scope}, it can be used to define a depth value for the current\n * fragment or for depth evaluation purposes.\n *\n * @augments Node\n */\nclass ViewportDepthNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'ViewportDepthNode';\n\n\t}\n\n\t/**\n\t * Constructs a new viewport depth node.\n\t *\n\t * @param {('depth'|'depthBase'|'linearDepth')} scope - The node's scope.\n\t * @param {?Node} [valueNode=null] - The value node.\n\t */\n\tconstructor( scope, valueNode = null ) {\n\n\t\tsuper( 'float' );\n\n\t\t/**\n\t\t * The node behaves differently depending on which scope is selected.\n\t\t *\n\t\t * - `ViewportDepthNode.DEPTH_BASE`: Allows to define a value for the current fragment's depth.\n\t\t * - `ViewportDepthNode.DEPTH`: Represents the depth value for the current fragment (`valueNode` is ignored).\n\t\t * - `ViewportDepthNode.LINEAR_DEPTH`: Represents the linear (orthographic) depth value of the current fragment.\n\t\t * If a `valueNode` is set, the scope can be used to convert perspective depth data to linear data.\n\t\t *\n\t\t * @type {('depth'|'depthBase'|'linearDepth')}\n\t\t */\n\t\tthis.scope = scope;\n\n\t\t/**\n\t\t * Can be used to define a custom depth value.\n\t\t * The property is ignored in the `ViewportDepthNode.DEPTH` scope.\n\t\t *\n\t\t * @type {?Node}\n\t\t * @default null\n\t\t */\n\t\tthis.valueNode = valueNode;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isViewportDepthNode = true;\n\n\t}\n\n\tgenerate( builder ) {\n\n\t\tconst { scope } = this;\n\n\t\tif ( scope === ViewportDepthNode.DEPTH_BASE ) {\n\n\t\t\treturn builder.getFragDepth();\n\n\t\t}\n\n\t\treturn super.generate( builder );\n\n\t}\n\n\tsetup( { camera } ) {\n\n\t\tconst { scope } = this;\n\t\tconst value = this.valueNode;\n\n\t\tlet node = null;\n\n\t\tif ( scope === ViewportDepthNode.DEPTH_BASE ) {\n\n\t\t\tif ( value !== null ) {\n\n \t\t\t\tnode = depthBase().assign( value );\n\n\t\t\t}\n\n\t\t} else if ( scope === ViewportDepthNode.DEPTH ) {\n\n\t\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\t\tnode = viewZToPerspectiveDepth( positionView.z, cameraNear, cameraFar );\n\n\t\t\t} else {\n\n\t\t\t\tnode = viewZToOrthographicDepth( positionView.z, cameraNear, cameraFar );\n\n\t\t\t}\n\n\t\t} else if ( scope === ViewportDepthNode.LINEAR_DEPTH ) {\n\n\t\t\tif ( value !== null ) {\n\n\t\t\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\t\t\tconst viewZ = perspectiveDepthToViewZ( value, cameraNear, cameraFar );\n\n\t\t\t\t\tnode = viewZToOrthographicDepth( viewZ, cameraNear, cameraFar );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tnode = value;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tnode = viewZToOrthographicDepth( positionView.z, cameraNear, cameraFar );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn node;\n\n\t}\n\n}\n\nViewportDepthNode.DEPTH_BASE = 'depthBase';\nViewportDepthNode.DEPTH = 'depth';\nViewportDepthNode.LINEAR_DEPTH = 'linearDepth';\n\n// NOTE: viewZ, the z-coordinate in camera space, is negative for points in front of the camera\n\n/**\n * TSL function for converting a viewZ value to an orthographic depth value.\n *\n * @tsl\n * @function\n * @param {Node<float>} viewZ - The viewZ node.\n * @param {Node<float>} near - The camera's near value.\n * @param {Node<float>} far - The camera's far value.\n * @returns {Node<float>}\n */\nconst viewZToOrthographicDepth = ( viewZ, near, far ) => viewZ.add( near ).div( near.sub( far ) );\n\n/**\n * TSL function for converting an orthographic depth value to a viewZ value.\n *\n * @tsl\n * @function\n * @param {Node<float>} depth - The orthographic depth.\n * @param {Node<float>} near - The camera's near value.\n * @param {Node<float>} far - The camera's far value.\n * @returns {Node<float>}\n */\nconst orthographicDepthToViewZ = ( depth, near, far ) => near.sub( far ).mul( depth ).sub( near );\n\n/**\n * TSL function for converting a viewZ value to a perspective depth value.\n *\n * Note: {link https://twitter.com/gonnavis/status/1377183786949959682}.\n *\n * @tsl\n * @function\n * @param {Node<float>} viewZ - The viewZ node.\n * @param {Node<float>} near - The camera's near value.\n * @param {Node<float>} far - The camera's far value.\n * @returns {Node<float>}\n */\nconst viewZToPerspectiveDepth = ( viewZ, near, far ) => near.add( viewZ ).mul( far ).div( far.sub( near ).mul( viewZ ) );\n\n/**\n * TSL function for converting a perspective depth value to a viewZ value.\n *\n * @tsl\n * @function\n * @param {Node<float>} depth - The perspective depth.\n * @param {Node<float>} near - The camera's near value.\n * @param {Node<float>} far - The camera's far value.\n * @returns {Node<float>}\n */\nconst perspectiveDepthToViewZ = ( depth, near, far ) => near.mul( far ).div( far.sub( near ).mul( depth ).sub( far ) );\n\n/**\n * TSL function for converting a viewZ value to a logarithmic depth value.\n *\n * @tsl\n * @function\n * @param {Node<float>} viewZ - The viewZ node.\n * @param {Node<float>} near - The camera's near value.\n * @param {Node<float>} far - The camera's far value.\n * @returns {Node<float>}\n */\nconst viewZToLogarithmicDepth = ( viewZ, near, far ) => {\n\n\t// NOTE: viewZ must be negative--see explanation at the end of this comment block.\n\t// The final logarithmic depth formula used here is adapted from one described in an\n\t// article by Thatcher Ulrich (see http://tulrich.com/geekstuff/log_depth_buffer.txt),\n\t// which was an improvement upon an earlier formula one described in an\n\t// Outerra article (https://outerra.blogspot.com/2009/08/logarithmic-z-buffer.html).\n\t// Ulrich's formula is the following:\n\t//     z = K * log( w / cameraNear ) / log( cameraFar / cameraNear )\n\t//     where K = 2^k - 1, and k is the number of bits in the depth buffer.\n\t// The Outerra variant ignored the camera near plane (it assumed it was 0) and instead\n\t// opted for a \"C-constant\" for resolution adjustment of objects near the camera.\n\t// Outerra states: \"Notice that the 'C' variant doesn\u2019t use a near plane distance, it has it\n\t// set at 0\" (quote from https://outerra.blogspot.com/2012/11/maximizing-depth-buffer-range-and.html).\n\t// Ulrich's variant has the benefit of constant relative precision over the whole near-far range.\n\t// It was debated here whether Outerra's \"C-constant\" or Ulrich's \"near plane\" variant should\n\t// be used, and ultimately Ulrich's \"near plane\" version was chosen.\n\t// Outerra eventually made another improvement to their original \"C-constant\" variant,\n\t// but it still does not incorporate the camera near plane (for this version,\n\t// see https://outerra.blogspot.com/2013/07/logarithmic-depth-buffer-optimizations.html).\n\t// Here we make 4 changes to Ulrich's formula:\n\t// 1. Clamp the camera near plane so we don't divide by 0.\n\t// 2. Use log2 instead of log to avoid an extra multiply (shaders implement log using log2).\n\t// 3. Assume K is 1 (K = maximum value in depth buffer; see Ulrich's formula above).\n\t// 4. To maintain consistency with the functions \"viewZToOrthographicDepth\" and \"viewZToPerspectiveDepth\",\n\t//    we modify the formula here to use 'viewZ' instead of 'w'. The other functions expect a negative viewZ,\n\t//    so we do the same here, hence the 'viewZ.negate()' call.\n\t// For visual representation of this depth curve, see https://www.desmos.com/calculator/uyqk0vex1u\n\tnear = near.max( 1e-6 ).toVar();\n\tconst numerator = log2( viewZ.negate().div( near ) );\n\tconst denominator = log2( far.div( near ) );\n\treturn numerator.div( denominator );\n\n};\n\n/**\n * TSL function for converting a logarithmic depth value to a viewZ value.\n *\n * @tsl\n * @function\n * @param {Node<float>} depth - The logarithmic depth.\n * @param {Node<float>} near - The camera's near value.\n * @param {Node<float>} far - The camera's far value.\n * @returns {Node<float>}\n */\nconst logarithmicDepthToViewZ = ( depth, near, far ) => {\n\n\t// NOTE: we add a 'negate()' call to the return value here to maintain consistency with\n\t// the functions \"orthographicDepthToViewZ\" and \"perspectiveDepthToViewZ\" (they return\n\t// a negative viewZ).\n\tconst exponent = depth.mul( log( far.div( near ) ) );\n\treturn float( Math.E ).pow( exponent ).mul( near ).negate();\n\n};\n\n/**\n * TSL function for defining a value for the current fragment's depth.\n *\n * @tsl\n * @function\n * @param {Node<float>} value - The depth value to set.\n * @returns {ViewportDepthNode<float>}\n */\nconst depthBase = /*@__PURE__*/ nodeProxy( ViewportDepthNode, ViewportDepthNode.DEPTH_BASE );\n\n/**\n * TSL object that represents the depth value for the current fragment.\n *\n * @tsl\n * @type {ViewportDepthNode}\n */\nconst depth = /*@__PURE__*/ nodeImmutable( ViewportDepthNode, ViewportDepthNode.DEPTH );\n\n/**\n * TSL function for converting a perspective depth value to linear depth.\n *\n * @tsl\n * @function\n * @param {?Node<float>} [value=null] - The perspective depth. If `null` is provided, the current fragment's depth is used.\n * @returns {ViewportDepthNode<float>}\n */\nconst linearDepth = /*@__PURE__*/ nodeProxy( ViewportDepthNode, ViewportDepthNode.LINEAR_DEPTH ).setParameterLength( 0, 1 );\n\n/**\n * TSL object that represents the linear (orthographic) depth value of the current fragment\n *\n * @tsl\n * @type {ViewportDepthNode}\n */\nconst viewportLinearDepth = /*@__PURE__*/ linearDepth( viewportDepthTexture() );\n\ndepth.assign = ( value ) => depthBase( value );\n\n/**\n * This node is used in {@link NodeMaterial} to setup the clipping\n * which can happen hardware-accelerated (if supported) and optionally\n * use alpha-to-coverage for anti-aliasing clipped edges.\n *\n * @augments Node\n */\nclass ClippingNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'ClippingNode';\n\n\t}\n\n\t/**\n\t * Constructs a new clipping node.\n\t *\n\t * @param {('default'|'hardware'|'alphaToCoverage')} [scope='default'] - The node's scope. Similar to other nodes,\n\t * the selected scope influences the behavior of the node and what type of code is generated.\n\t */\n\tconstructor( scope = ClippingNode.DEFAULT ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The node's scope. Similar to other nodes, the selected scope influences\n\t\t * the behavior of the node and what type of code is generated.\n\t\t *\n\t\t * @type {('default'|'hardware'|'alphaToCoverage')}\n\t\t */\n\t\tthis.scope = scope;\n\n\t}\n\n\t/**\n\t * Setups the node depending on the selected scope.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {Node} The result node.\n\t */\n\tsetup( builder ) {\n\n\t\tsuper.setup( builder );\n\n\t\tconst clippingContext = builder.clippingContext;\n\t\tconst { intersectionPlanes, unionPlanes } = clippingContext;\n\n\t\tthis.hardwareClipping = builder.material.hardwareClipping;\n\n\t\tif ( this.scope === ClippingNode.ALPHA_TO_COVERAGE ) {\n\n\t\t\treturn this.setupAlphaToCoverage( intersectionPlanes, unionPlanes );\n\n\t\t} else if ( this.scope === ClippingNode.HARDWARE ) {\n\n\t\t\treturn this.setupHardwareClipping( unionPlanes, builder );\n\n\t\t} else {\n\n\t\t\treturn this.setupDefault( intersectionPlanes, unionPlanes );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Setups alpha to coverage.\n\t *\n\t * @param {Array<Vector4>} intersectionPlanes - The intersection planes.\n\t * @param {Array<Vector4>} unionPlanes - The union planes.\n\t * @return {Node} The result node.\n\t */\n\tsetupAlphaToCoverage( intersectionPlanes, unionPlanes ) {\n\n\t\treturn Fn( () => {\n\n\t\t\tconst distanceToPlane = float().toVar( 'distanceToPlane' );\n\t\t\tconst distanceGradient = float().toVar( 'distanceToGradient' );\n\n\t\t\tconst clipOpacity = float( 1 ).toVar( 'clipOpacity' );\n\n\t\t\tconst numUnionPlanes = unionPlanes.length;\n\n\t\t\tif ( this.hardwareClipping === false && numUnionPlanes > 0 ) {\n\n\t\t\t\tconst clippingPlanes = uniformArray( unionPlanes ).setGroup( renderGroup );\n\n\t\t\t\tLoop( numUnionPlanes, ( { i } ) => {\n\n\t\t\t\t\tconst plane = clippingPlanes.element( i );\n\n\t\t\t\t\tdistanceToPlane.assign( positionView.dot( plane.xyz ).negate().add( plane.w ) );\n\t\t\t\t\tdistanceGradient.assign( distanceToPlane.fwidth().div( 2.0 ) );\n\n\t\t\t\t\tclipOpacity.mulAssign( smoothstep( distanceGradient.negate(), distanceGradient, distanceToPlane ) );\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tconst numIntersectionPlanes = intersectionPlanes.length;\n\n\t\t\tif ( numIntersectionPlanes > 0 ) {\n\n\t\t\t\tconst clippingPlanes = uniformArray( intersectionPlanes ).setGroup( renderGroup );\n\t\t\t\tconst intersectionClipOpacity = float( 1 ).toVar( 'intersectionClipOpacity' );\n\n\t\t\t\tLoop( numIntersectionPlanes, ( { i } ) => {\n\n\t\t\t\t\tconst plane = clippingPlanes.element( i );\n\n\t\t\t\t\tdistanceToPlane.assign( positionView.dot( plane.xyz ).negate().add( plane.w ) );\n\t\t\t\t\tdistanceGradient.assign( distanceToPlane.fwidth().div( 2.0 ) );\n\n\t\t\t\t\tintersectionClipOpacity.mulAssign( smoothstep( distanceGradient.negate(), distanceGradient, distanceToPlane ).oneMinus() );\n\n\t\t\t\t} );\n\n\t\t\t\tclipOpacity.mulAssign( intersectionClipOpacity.oneMinus() );\n\n\t\t\t}\n\n\t\t\tdiffuseColor.a.mulAssign( clipOpacity );\n\n\t\t\tdiffuseColor.a.equal( 0.0 ).discard();\n\n\t\t} )();\n\n\t}\n\n\t/**\n\t * Setups the default clipping.\n\t *\n\t * @param {Array<Vector4>} intersectionPlanes - The intersection planes.\n\t * @param {Array<Vector4>} unionPlanes - The union planes.\n\t * @return {Node} The result node.\n\t */\n\tsetupDefault( intersectionPlanes, unionPlanes ) {\n\n\t\treturn Fn( () => {\n\n\t\t\tconst numUnionPlanes = unionPlanes.length;\n\n\t\t\tif ( this.hardwareClipping === false && numUnionPlanes > 0 ) {\n\n\t\t\t\tconst clippingPlanes = uniformArray( unionPlanes ).setGroup( renderGroup );\n\n\t\t\t\tLoop( numUnionPlanes, ( { i } ) => {\n\n\t\t\t\t\tconst plane = clippingPlanes.element( i );\n\t\t\t\t\tpositionView.dot( plane.xyz ).greaterThan( plane.w ).discard();\n\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tconst numIntersectionPlanes = intersectionPlanes.length;\n\n\t\t\tif ( numIntersectionPlanes > 0 ) {\n\n\t\t\t\tconst clippingPlanes = uniformArray( intersectionPlanes ).setGroup( renderGroup );\n\t\t\t\tconst clipped = bool( true ).toVar( 'clipped' );\n\n\t\t\t\tLoop( numIntersectionPlanes, ( { i } ) => {\n\n\t\t\t\t\tconst plane = clippingPlanes.element( i );\n\t\t\t\t\tclipped.assign( positionView.dot( plane.xyz ).greaterThan( plane.w ).and( clipped ) );\n\n\t\t\t\t} );\n\n\t\t\t\tclipped.discard();\n\n\t\t\t}\n\n\t\t} )();\n\n\t}\n\n\t/**\n\t * Setups hardware clipping.\n\t *\n\t * @param {Array<Vector4>} unionPlanes - The union planes.\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {Node} The result node.\n\t */\n\tsetupHardwareClipping( unionPlanes, builder ) {\n\n\t\tconst numUnionPlanes = unionPlanes.length;\n\n\t\tbuilder.enableHardwareClipping( numUnionPlanes );\n\n\t\treturn Fn( () => {\n\n\t\t\tconst clippingPlanes = uniformArray( unionPlanes ).setGroup( renderGroup );\n\t\t\tconst hw_clip_distances = builtin( builder.getClipDistance() );\n\n\t\t\tLoop( numUnionPlanes, ( { i } ) => {\n\n\t\t\t\tconst plane = clippingPlanes.element( i );\n\n\t\t\t\tconst distance = positionView.dot( plane.xyz ).sub( plane.w ).negate();\n\t\t\t\thw_clip_distances.element( i ).assign( distance );\n\n\t\t\t} );\n\n\t\t} )();\n\n\t}\n\n}\n\nClippingNode.ALPHA_TO_COVERAGE = 'alphaToCoverage';\nClippingNode.DEFAULT = 'default';\nClippingNode.HARDWARE = 'hardware';\n\n/**\n * TSL function for setting up the default clipping logic.\n *\n * @tsl\n * @function\n * @returns {ClippingNode}\n */\nconst clipping = () => new ClippingNode();\n\n/**\n * TSL function for setting up alpha to coverage.\n *\n * @tsl\n * @function\n * @returns {ClippingNode}\n */\nconst clippingAlpha = () => new ClippingNode( ClippingNode.ALPHA_TO_COVERAGE );\n\n/**\n * TSL function for setting up hardware-based clipping.\n *\n * @tsl\n * @function\n * @returns {ClippingNode}\n */\nconst hardwareClipping = () => new ClippingNode( ClippingNode.HARDWARE );\n\n// See: https://casual-effects.com/research/Wyman2017Hashed/index.html\n\nconst ALPHA_HASH_SCALE = 0.05; // Derived from trials only, and may be changed.\n\nconst hash2D = /*@__PURE__*/ Fn( ( [ value ] ) => {\n\n\treturn fract( mul( 1.0e4, sin( mul( 17.0, value.x ).add( mul( 0.1, value.y ) ) ) ).mul( add( 0.1, abs( sin( mul( 13.0, value.y ).add( value.x ) ) ) ) ) );\n\n} );\n\nconst hash3D = /*@__PURE__*/ Fn( ( [ value ] ) => {\n\n\treturn hash2D( vec2( hash2D( value.xy ), value.z ) );\n\n} );\n\nconst getAlphaHashThreshold = /*@__PURE__*/ Fn( ( [ position ] ) => {\n\n\t// Find the discretized derivatives of our coordinates\n\tconst maxDeriv = max$1(\n\t\tlength( dFdx( position.xyz ) ),\n\t\tlength( dFdy( position.xyz ) )\n\t);\n\n\tconst pixScale = float( 1 ).div( float( ALPHA_HASH_SCALE ).mul( maxDeriv ) ).toVar( 'pixScale' );\n\n\t// Find two nearest log-discretized noise scales\n\tconst pixScales = vec2(\n\t\texp2( floor( log2( pixScale ) ) ),\n\t\texp2( ceil( log2( pixScale ) ) )\n\t);\n\n\t// Compute alpha thresholds at our two noise scales\n\tconst alpha = vec2(\n\t\thash3D( floor( pixScales.x.mul( position.xyz ) ) ),\n\t\thash3D( floor( pixScales.y.mul( position.xyz ) ) ),\n\t);\n\n\t// Factor to interpolate lerp with\n\tconst lerpFactor = fract( log2( pixScale ) );\n\n\t// Interpolate alpha threshold from noise at two scales\n\tconst x = add( mul( lerpFactor.oneMinus(), alpha.x ), mul( lerpFactor, alpha.y ) );\n\n\t// Pass into CDF to compute uniformly distrib threshold\n\tconst a = min$1( lerpFactor, lerpFactor.oneMinus() );\n\tconst cases = vec3(\n\t\tx.mul( x ).div( mul( 2.0, a ).mul( sub( 1.0, a ) ) ),\n\t\tx.sub( mul( 0.5, a ) ).div( sub( 1.0, a ) ),\n\t\tsub( 1.0, sub( 1.0, x ).mul( sub( 1.0, x ) ).div( mul( 2.0, a ).mul( sub( 1.0, a ) ) ) ) );\n\n\t// Find our final, uniformly distributed alpha threshold (\u03B1\u03C4)\n\tconst threshold = x.lessThan( a.oneMinus() ).select( x.lessThan( a ).select( cases.x, cases.y ), cases.z );\n\n\t// Avoids \u03B1\u03C4 == 0. Could also do \u03B1\u03C4 =1-\u03B1\u03C4\n\treturn clamp( threshold, 1.0e-6, 1.0 );\n\n} ).setLayout( {\n\tname: 'getAlphaHashThreshold',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'position', type: 'vec3' }\n\t]\n} );\n\n/**\n * An attribute node for representing vertex colors.\n *\n * @augments AttributeNode\n */\nclass VertexColorNode extends AttributeNode {\n\n\tstatic get type() {\n\n\t\treturn 'VertexColorNode';\n\n\t}\n\n\t/**\n\t * Constructs a new vertex color node.\n\t *\n\t * @param {number} index - The attribute index.\n\t */\n\tconstructor( index ) {\n\n\t\tsuper( null, 'vec4' );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isVertexColorNode = true;\n\n\t\t/**\n\t\t * The attribute index to enable more than one sets of vertex colors.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.index = index;\n\n\t}\n\n\t/**\n\t * Overwrites the default implementation by honoring the attribute index.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The attribute name.\n\t */\n\tgetAttributeName( /*builder*/ ) {\n\n\t\tconst index = this.index;\n\n\t\treturn 'color' + ( index > 0 ? index : '' );\n\n\t}\n\n\tgenerate( builder ) {\n\n\t\tconst attributeName = this.getAttributeName( builder );\n\t\tconst geometryAttribute = builder.hasGeometryAttribute( attributeName );\n\n\t\tlet result;\n\n\t\tif ( geometryAttribute === true ) {\n\n\t\t\tresult = super.generate( builder );\n\n\t\t} else {\n\n\t\t\t// Vertex color fallback should be white\n\t\t\tresult = builder.generateConst( this.nodeType, new Vector4( 1, 1, 1, 1 ) );\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\tserialize( data ) {\n\n\t\tsuper.serialize( data );\n\n\t\tdata.index = this.index;\n\n\t}\n\n\tdeserialize( data ) {\n\n\t\tsuper.deserialize( data );\n\n\t\tthis.index = data.index;\n\n\t}\n\n}\n\n/**\n * TSL function for creating a reference node.\n *\n * @tsl\n * @function\n * @param {number} [index=0] - The attribute index.\n * @returns {VertexColorNode}\n */\nconst vertexColor = ( index = 0 ) => new VertexColorNode( index );\n\n/**\n * Represents a \"Color Burn\" blend mode.\n *\n * It's designed to darken the base layer's colors based on the color of the blend layer.\n * It significantly increases the contrast of the base layer, making the colors more vibrant and saturated.\n * The darker the color in the blend layer, the stronger the darkening and contrast effect on the base layer.\n *\n * @tsl\n * @function\n * @param {Node<vec3>} base - The base color.\n * @param {Node<vec3>} blend - The blend color. A white (#ffffff) blend color does not alter the base color.\n * @return {Node<vec3>} The result.\n */\nconst blendBurn = /*@__PURE__*/ Fn( ( [ base, blend ] ) => {\n\n\treturn min$1( 1.0, base.oneMinus().div( blend ) ).oneMinus();\n\n} ).setLayout( {\n\tname: 'blendBurn',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'base', type: 'vec3' },\n\t\t{ name: 'blend', type: 'vec3' }\n\t]\n} );\n\n/**\n * Represents a \"Color Dodge\" blend mode.\n *\n * It's designed to lighten the base layer's colors based on the color of the blend layer.\n * It significantly increases the brightness of the base layer, making the colors lighter and more vibrant.\n * The brighter the color in the blend layer, the stronger the lightening and contrast effect on the base layer.\n *\n * @tsl\n * @function\n * @param {Node<vec3>} base - The base color.\n * @param {Node<vec3>} blend - The blend color. A black (#000000) blend color does not alter the base color.\n * @return {Node<vec3>} The result.\n */\nconst blendDodge = /*@__PURE__*/ Fn( ( [ base, blend ] ) => {\n\n\treturn min$1( base.div( blend.oneMinus() ), 1.0 );\n\n} ).setLayout( {\n\tname: 'blendDodge',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'base', type: 'vec3' },\n\t\t{ name: 'blend', type: 'vec3' }\n\t]\n} );\n\n/**\n * Represents a \"Screen\" blend mode.\n *\n * Similar to `blendDodge()`, this mode also lightens the base layer's colors based on the color of the blend layer.\n * The \"Screen\" blend mode is better for general brightening whereas the \"Dodge\" results in more subtle and nuanced\n * effects.\n *\n * @tsl\n * @function\n * @param {Node<vec3>} base - The base color.\n * @param {Node<vec3>} blend - The blend color. A black (#000000) blend color does not alter the base color.\n * @return {Node<vec3>} The result.\n */\nconst blendScreen = /*@__PURE__*/ Fn( ( [ base, blend ] ) => {\n\n\treturn base.oneMinus().mul( blend.oneMinus() ).oneMinus();\n\n} ).setLayout( {\n\tname: 'blendScreen',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'base', type: 'vec3' },\n\t\t{ name: 'blend', type: 'vec3' }\n\t]\n} );\n\n/**\n * Represents a \"Overlay\" blend mode.\n *\n * It's designed to increase the contrast of the base layer based on the color of the blend layer.\n * It amplifies the existing colors and contrast in the base layer, making lighter areas lighter and darker areas darker.\n * The color of the blend layer significantly influences the resulting contrast and color shift in the base layer.\n *\n * @tsl\n * @function\n * @param {Node<vec3>} base - The base color.\n * @param {Node<vec3>} blend - The blend color\n * @return {Node<vec3>} The result.\n */\nconst blendOverlay = /*@__PURE__*/ Fn( ( [ base, blend ] ) => {\n\n\treturn mix( base.mul( 2.0 ).mul( blend ), base.oneMinus().mul( 2.0 ).mul( blend.oneMinus() ).oneMinus(), step( 0.5, base ) );\n\n} ).setLayout( {\n\tname: 'blendOverlay',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'base', type: 'vec3' },\n\t\t{ name: 'blend', type: 'vec3' }\n\t]\n} );\n\n/**\n * This function blends two color based on their alpha values by replicating the behavior of `THREE.NormalBlending`.\n * It assumes both input colors have non-premultiplied alpha.\n *\n * @tsl\n * @function\n * @param {Node<vec4>} base - The base color.\n * @param {Node<vec4>} blend - The blend color\n * @return {Node<vec4>} The result.\n */\nconst blendColor = /*@__PURE__*/ Fn( ( [ base, blend ] ) => {\n\n\tconst outAlpha = blend.a.add( base.a.mul( blend.a.oneMinus() ) );\n\n\treturn vec4( blend.rgb.mul( blend.a ).add( base.rgb.mul( base.a ).mul( blend.a.oneMinus() ) ).div( outAlpha ), outAlpha );\n\n} ).setLayout( {\n\tname: 'blendColor',\n\ttype: 'vec4',\n\tinputs: [\n\t\t{ name: 'base', type: 'vec4' },\n\t\t{ name: 'blend', type: 'vec4' }\n\t]\n} );\n\n/**\n * Premultiplies the RGB channels of a color by its alpha channel.\n *\n * This function is useful for converting a non-premultiplied alpha color\n * into a premultiplied alpha format, where the RGB values are scaled\n * by the alpha value. Premultiplied alpha is often used in graphics\n * rendering for certain operations, such as compositing and image processing.\n *\n * @tsl\n * @function\n * @param {Node<vec4>} color - The input color with non-premultiplied alpha.\n * @return {Node<vec4>} The color with premultiplied alpha.\n */\nconst premultiplyAlpha = /*@__PURE__*/ Fn( ( [ color ] ) => {\n\n\treturn vec4( color.rgb.mul( color.a ), color.a );\n\n}, { color: 'vec4', return: 'vec4' } );\n\n/**\n * Unpremultiplies the RGB channels of a color by its alpha channel.\n *\n * This function is useful for converting a premultiplied alpha color\n * back into a non-premultiplied alpha format, where the RGB values are\n * divided by the alpha value. Unpremultiplied alpha is often used in graphics\n * rendering for certain operations, such as compositing and image processing.\n *\n * @tsl\n * @function\n * @param {Node<vec4>} color - The input color with premultiplied alpha.\n * @return {Node<vec4>} The color with non-premultiplied alpha.\n */\nconst unpremultiplyAlpha = /*@__PURE__*/ Fn( ( [ color ] ) => {\n\n\tIf( color.a.equal( 0.0 ), () => vec4( 0.0 ) );\n\n\treturn vec4( color.rgb.div( color.a ), color.a );\n\n}, { color: 'vec4', return: 'vec4' } );\n\n\n// Deprecated\n\n/**\n * @tsl\n * @function\n * @deprecated since r171. Use {@link blendBurn} instead.\n *\n * @param {...any} params\n * @returns {Function}\n */\nconst burn = ( ...params ) => { // @deprecated, r171\n\n\twarn( 'TSL: \"burn\" has been renamed. Use \"blendBurn\" instead.' );\n\treturn blendBurn( params );\n\n};\n\n/**\n * @tsl\n * @function\n * @deprecated since r171. Use {@link blendDodge} instead.\n *\n * @param {...any} params\n * @returns {Function}\n */\nconst dodge = ( ...params ) => { // @deprecated, r171\n\n\twarn( 'TSL: \"dodge\" has been renamed. Use \"blendDodge\" instead.' );\n\treturn blendDodge( params );\n\n};\n\n/**\n * @tsl\n * @function\n * @deprecated since r171. Use {@link blendScreen} instead.\n *\n * @param {...any} params\n * @returns {Function}\n */\nconst screen = ( ...params ) => { // @deprecated, r171\n\n\twarn( 'TSL: \"screen\" has been renamed. Use \"blendScreen\" instead.' );\n\treturn blendScreen( params );\n\n};\n\n/**\n * @tsl\n * @function\n * @deprecated since r171. Use {@link blendOverlay} instead.\n *\n * @param {...any} params\n * @returns {Function}\n */\nconst overlay = ( ...params ) => { // @deprecated, r171\n\n\twarn( 'TSL: \"overlay\" has been renamed. Use \"blendOverlay\" instead.' );\n\treturn blendOverlay( params );\n\n};\n\n/**\n * Base class for all node materials.\n *\n * @augments Material\n */\nclass NodeMaterial extends Material {\n\n\tstatic get type() {\n\n\t\treturn 'NodeMaterial';\n\n\t}\n\n\t/**\n\t * Represents the type of the node material.\n\t *\n\t * @type {string}\n\t */\n\tget type() {\n\n\t\treturn this.constructor.type;\n\n\t}\n\n\tset type( _value ) { /* */ }\n\n\t/**\n\t * Constructs a new node material.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isNodeMaterial = true;\n\n\t\t/**\n\t\t * Whether this material is affected by fog or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.fog = true;\n\n\t\t/**\n\t\t * Whether this material is affected by lights or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.lights = false;\n\n\t\t/**\n\t\t * Whether this material uses hardware clipping or not.\n\t\t * This property is managed by the engine and should not be\n\t\t * modified by apps.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.hardwareClipping = false;\n\n\t\t/**\n\t\t * Node materials which set their `lights` property to `true`\n\t\t * are affected by all lights of the scene. Sometimes selective\n\t\t * lighting is wanted which means only _some_ lights in the scene\n\t\t * affect a material. This can be achieved by creating an instance\n\t\t * of {@link LightsNode} with a list of selective\n\t\t * lights and assign the node to this property.\n\t\t *\n\t\t * ```js\n\t\t * const customLightsNode = lights( [ light1, light2 ] );\n\t\t * material.lightsNode = customLightsNode;\n\t\t * ```\n\t\t *\n\t\t * @type {?LightsNode}\n\t\t * @default null\n\t\t */\n\t\tthis.lightsNode = null;\n\n\t\t/**\n\t\t * The environment of node materials can be defined by an environment\n\t\t * map assigned to the `envMap` property or by `Scene.environment`\n\t\t * if the node material is a PBR material. This node property allows to overwrite\n\t\t * the default behavior and define the environment with a custom node.\n\t\t *\n\t\t * ```js\n\t\t * material.envNode = pmremTexture( renderTarget.texture );\n\t\t * ```\n\t\t *\n\t\t * @type {?Node<vec3>}\n\t\t * @default null\n\t\t */\n\t\tthis.envNode = null;\n\n\t\t/**\n\t\t * The lighting of node materials might be influenced by ambient occlusion.\n\t\t * The default AO is inferred from an ambient occlusion map assigned to `aoMap`\n\t\t * and the respective `aoMapIntensity`. This node property allows to overwrite\n\t\t * the default and define the ambient occlusion with a custom node instead.\n\t\t *\n\t\t * If you don't want to overwrite the diffuse color but modify the existing\n\t\t * values instead, use {@link materialAO}.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.aoNode = null;\n\n\t\t/**\n\t\t * The diffuse color of node materials is by default inferred from the\n\t\t * `color` and `map` properties. This node property allows to overwrite the default\n\t\t * and define the diffuse color with a node instead.\n\t\t *\n\t\t * ```js\n\t\t * material.colorNode = color( 0xff0000 ); // define red color\n\t\t * ```\n\t\t *\n\t\t * If you don't want to overwrite the diffuse color but modify the existing\n\t\t * values instead, use {@link materialColor}.\n\t\t *\n\t\t * ```js\n\t\t * material.colorNode = materialColor.mul( color( 0xff0000 ) ); // give diffuse colors a red tint\n\t\t * ```\n\t\t *\n\t\t * @type {?Node<vec3>}\n\t\t * @default null\n\t\t */\n\t\tthis.colorNode = null;\n\n\t\t/**\n\t\t * The normals of node materials are by default inferred from the `normalMap`/`normalScale`\n\t\t * or `bumpMap`/`bumpScale` properties. This node property allows to overwrite the default\n\t\t * and define the normals with a node instead.\n\t\t *\n\t\t * If you don't want to overwrite the normals but modify the existing values instead,\n\t\t * use {@link materialNormal}.\n\t\t *\n\t\t * @type {?Node<vec3>}\n\t\t * @default null\n\t\t */\n\t\tthis.normalNode = null;\n\n\t\t/**\n\t\t * The opacity of node materials is by default inferred from the `opacity`\n\t\t * and `alphaMap` properties. This node property allows to overwrite the default\n\t\t * and define the opacity with a node instead.\n\t\t *\n\t\t * If you don't want to overwrite the opacity but modify the existing\n\t\t * value instead, use {@link materialOpacity}.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.opacityNode = null;\n\n\t\t/**\n\t\t * This node can be used to implement a variety of filter-like effects. The idea is\n\t\t * to store the current rendering into a texture e.g. via `viewportSharedTexture()`, use it\n\t\t * to create an arbitrary effect and then assign the node composition to this property.\n\t\t * Everything behind the object using this material will now be affected by a filter.\n\t\t *\n\t\t * ```js\n\t\t * const material = new NodeMaterial()\n\t\t * material.transparent = true;\n\t\t *\n\t\t * // everything behind the object will be monochromatic\n\t\t * material.backdropNode = saturation( viewportSharedTexture().rgb, 0 );\n\t\t * ```\n\t\t *\n\t\t * Backdrop computations are part of the lighting so only lit materials can use this property.\n\t\t *\n\t\t * @type {?Node<vec3>}\n\t\t * @default null\n\t\t */\n\t\tthis.backdropNode = null;\n\n\t\t/**\n\t\t * This node allows to modulate the influence of `backdropNode` to the outgoing light.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.backdropAlphaNode = null;\n\n\t\t/**\n\t\t * The alpha test of node materials is by default inferred from the `alphaTest`\n\t\t * property. This node property allows to overwrite the default and define the\n\t\t * alpha test with a node instead.\n\t\t *\n\t\t * If you don't want to overwrite the alpha test but modify the existing\n\t\t * value instead, use {@link materialAlphaTest}.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.alphaTestNode = null;\n\n\n\t\t/**\n\t\t * Discards the fragment if the mask value is `false`.\n\t\t *\n\t\t * @type {?Node<bool>}\n\t\t * @default null\n\t\t */\n\t\tthis.maskNode = null;\n\n\t\t/**\n\t\t * The local vertex positions are computed based on multiple factors like the\n\t\t * attribute data, morphing or skinning. This node property allows to overwrite\n\t\t * the default and define local vertex positions with nodes instead.\n\t\t *\n\t\t * If you don't want to overwrite the vertex positions but modify the existing\n\t\t * values instead, use {@link positionLocal}.\n\t\t *\n\t\t *```js\n\t\t * material.positionNode = positionLocal.add( displace );\n\t\t * ```\n\t\t *\n\t\t * @type {?Node<vec3>}\n\t\t * @default null\n\t\t */\n\t\tthis.positionNode = null;\n\n\t\t/**\n\t\t * This node property is intended for logic which modifies geometry data once or per animation step.\n\t\t * Apps usually place such logic randomly in initialization routines or in the animation loop.\n\t\t * `geometryNode` is intended as a dedicated API so there is an intended spot where geometry modifications\n\t\t * can be implemented.\n\t\t *\n\t\t * The idea is to assign a `Fn` definition that holds the geometry modification logic. A typical example\n\t\t * would be a GPU based particle system that provides a node material for usage on app level. The particle\n\t\t * simulation would be implemented as compute shaders and managed inside a `Fn` function. This function is\n\t\t * eventually assigned to `geometryNode`.\n\t\t *\n\t\t * @type {?Function}\n\t\t * @default null\n\t\t */\n\t\tthis.geometryNode = null;\n\n\t\t/**\n\t\t * Allows to overwrite depth values in the fragment shader.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.depthNode = null;\n\n\t\t/**\n\t\t * Allows to overwrite the position used for shadow map rendering which\n\t\t * is by default {@link positionWorld}, the vertex position\n\t\t * in world space.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.receivedShadowPositionNode = null;\n\n\t\t/**\n\t\t * Allows to overwrite the geometry position used for shadow map projection which\n\t\t * is by default {@link positionLocal}, the vertex position in local space.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.castShadowPositionNode = null;\n\n\t\t/**\n\t\t * This node can be used to influence how an object using this node material\n\t\t * receive shadows.\n\t\t *\n\t\t * ```js\n\t\t * const totalShadows = float( 1 ).toVar();\n\t\t * material.receivedShadowNode = Fn( ( [ shadow ] ) => {\n\t\t * \ttotalShadows.mulAssign( shadow );\n\t\t * \t//return float( 1 ); // bypass received shadows\n\t\t * \treturn shadow.mix( color( 0xff0000 ), 1 ); // modify shadow color\n\t\t * } );\n\t\t *\n\t\t * @type {?(Function|FunctionNode<vec4>)}\n\t\t * @default null\n\t\t */\n\t\tthis.receivedShadowNode = null;\n\n\t\t/**\n\t\t * This node can be used to influence how an object using this node material\n\t\t * casts shadows. To apply a color to shadows, you can simply do:\n\t\t *\n\t\t * ```js\n\t\t * material.castShadowNode = vec4( 1, 0, 0, 1 );\n\t\t * ```\n\t\t *\n\t\t * Which can be nice to fake colored shadows of semi-transparent objects. It\n\t\t * is also common to use the property with `Fn` function so checks are performed\n\t\t * per fragment.\n\t\t *\n\t\t * ```js\n\t\t * materialCustomShadow.castShadowNode = Fn( () => {\n\t\t * \thash( vertexIndex ).greaterThan( 0.5 ).discard();\n\t\t * \treturn materialColor;\n\t\t * } )();\n\t\t *  ```\n\t\t *\n\t\t * @type {?Node<vec4>}\n\t\t * @default null\n\t\t */\n\t\tthis.castShadowNode = null;\n\n\t\t/**\n\t\t * This node can be used to define the final output of the material.\n\t\t *\n\t\t * TODO: Explain the differences to `fragmentNode`.\n\t\t *\n\t\t * @type {?Node<vec4>}\n\t\t * @default null\n\t\t */\n\t\tthis.outputNode = null;\n\n\t\t/**\n\t\t * MRT configuration is done on renderer or pass level. This node allows to\n\t\t * overwrite what values are written into MRT targets on material level. This\n\t\t * can be useful for implementing selective FX features that should only affect\n\t\t * specific objects.\n\t\t *\n\t\t * @type {?MRTNode}\n\t\t * @default null\n\t\t */\n\t\tthis.mrtNode = null;\n\n\t\t/**\n\t\t * This node property can be used if you need complete freedom in implementing\n\t\t * the fragment shader. Assigning a node will replace the built-in material\n\t\t * logic used in the fragment stage.\n\t\t *\n\t\t * @type {?Node<vec4>}\n\t\t * @default null\n\t\t */\n\t\tthis.fragmentNode = null;\n\n\t\t/**\n\t\t * This node property can be used if you need complete freedom in implementing\n\t\t * the vertex shader. Assigning a node will replace the built-in material logic\n\t\t * used in the vertex stage.\n\t\t *\n\t\t * @type {?Node<vec4>}\n\t\t * @default null\n\t\t */\n\t\tthis.vertexNode = null;\n\n\t\t/**\n\t\t * This node can be used as a global context management component for this material.\n\t\t *\n\t\t * @type {?ContextNode}\n\t\t * @default null\n\t\t */\n\t\tthis.contextNode = null;\n\n\t\t// Deprecated properties\n\n\t\tObject.defineProperty( this, 'shadowPositionNode', { // @deprecated, r176\n\n\t\t\tget: () => {\n\n\t\t\t\treturn this.receivedShadowPositionNode;\n\n\t\t\t},\n\n\t\t\tset: ( value ) => {\n\n\t\t\t\twarn( 'NodeMaterial: \".shadowPositionNode\" was renamed to \".receivedShadowPositionNode\".' );\n\n\t\t\t\tthis.receivedShadowPositionNode = value;\n\n\t\t\t}\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Returns an array of child nodes for this material.\n\t *\n\t * @private\n\t * @returns {Array<{property: string, childNode: Node}>}\n\t */\n\t_getNodeChildren() {\n\n\t\tconst children = [];\n\n\t\tfor ( const property of Object.getOwnPropertyNames( this ) ) {\n\n\t\t\tif ( property.startsWith( '_' ) === true ) continue;\n\n\t\t\tconst object = this[ property ];\n\n\t\t\tif ( object && object.isNode === true ) {\n\n\t\t\t\tchildren.push( { property, childNode: object } );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn children;\n\n\t}\n\n\t/**\n\t * Allows to define a custom cache key that influence the material key computation\n\t * for render objects.\n\t *\n\t * @return {string} The custom cache key.\n\t */\n\tcustomProgramCacheKey() {\n\n\t\tconst values = [];\n\n\t\tfor ( const { property, childNode } of this._getNodeChildren() ) {\n\n\t\t\tvalues.push( hashString( property.slice( 0, -4 ) ), childNode.getCacheKey() );\n\n\t\t}\n\n\t\treturn this.type + hashArray( values );\n\n\t}\n\n\t/**\n\t * Builds this material with the given node builder.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tbuild( builder ) {\n\n\t\tthis.setup( builder );\n\n\t}\n\n\t/**\n\t * Setups a node material observer with the given builder.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {NodeMaterialObserver} The node material observer.\n\t */\n\tsetupObserver( builder ) {\n\n\t\treturn new NodeMaterialObserver( builder );\n\n\t}\n\n\t/**\n\t * Setups the vertex and fragment stage of this node material.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tsetup( builder ) {\n\n\t\tbuilder.context.setupNormal = () => subBuild( this.setupNormal( builder ), 'NORMAL', 'vec3' );\n\t\tbuilder.context.setupPositionView = () => this.setupPositionView( builder );\n\t\tbuilder.context.setupModelViewProjection = () => this.setupModelViewProjection( builder );\n\n\t\tconst renderer = builder.renderer;\n\t\tconst renderTarget = renderer.getRenderTarget();\n\n\t\t// < CONTEXT >\n\n\t\tif ( renderer.contextNode.isContextNode === true ) {\n\n\t\t\tbuilder.context = { ...builder.context, ...renderer.contextNode.getFlowContextData() };\n\n\t\t} else {\n\n\t\t\terror( 'NodeMaterial: \"renderer.contextNode\" must be an instance of `context()`.' );\n\n\t\t}\n\n\t\tif ( this.contextNode !== null ) {\n\n\t\t\tif ( this.contextNode.isContextNode === true ) {\n\n\t\t\t\tbuilder.context = { ...builder.context, ...this.contextNode.getFlowContextData() };\n\n\t\t\t} else {\n\n\t\t\t\terror( 'NodeMaterial: \"material.contextNode\" must be an instance of `context()`.' );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// < VERTEX STAGE >\n\n\t\tbuilder.addStack();\n\n\t\tconst mvp = subBuild( this.setupVertex( builder ), 'VERTEX' );\n\n\t\tconst vertexNode = this.vertexNode || mvp;\n\n\t\tbuilder.stack.outputNode = vertexNode;\n\n\t\tthis.setupHardwareClipping( builder );\n\n\t\tif ( this.geometryNode !== null ) {\n\n\t\t\tbuilder.stack.outputNode = builder.stack.outputNode.bypass( this.geometryNode );\n\n\t\t}\n\n\t\tbuilder.addFlow( 'vertex', builder.removeStack() );\n\n\t\t// < FRAGMENT STAGE >\n\n\t\tbuilder.addStack();\n\n\t\tlet resultNode;\n\n\t\tconst clippingNode = this.setupClipping( builder );\n\n\t\tif ( this.depthWrite === true || this.depthTest === true ) {\n\n\t\t\t// only write depth if depth buffer is configured\n\n\t\t\tif ( renderTarget !== null ) {\n\n\t\t\t\tif ( renderTarget.depthBuffer === true ) this.setupDepth( builder );\n\n\t\t\t} else {\n\n\t\t\t\tif ( renderer.depth === true ) this.setupDepth( builder );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.fragmentNode === null ) {\n\n\t\t\tthis.setupDiffuseColor( builder );\n\t\t\tthis.setupVariants( builder );\n\n\t\t\tconst outgoingLightNode = this.setupLighting( builder );\n\n\t\t\tif ( clippingNode !== null ) builder.stack.addToStack( clippingNode );\n\n\t\t\t// force unsigned floats - useful for RenderTargets\n\n\t\t\tconst basicOutput = vec4( outgoingLightNode, diffuseColor.a ).max( 0 );\n\n\t\t\tresultNode = this.setupOutput( builder, basicOutput );\n\n\t\t\t// OUTPUT NODE\n\n\t\t\toutput.assign( resultNode );\n\n\t\t\t//\n\n\t\t\tconst isCustomOutput = this.outputNode !== null;\n\n\t\t\tif ( isCustomOutput ) resultNode = this.outputNode;\n\n\t\t\t//\n\n\t\t\tif ( builder.context.getOutput ) {\n\n\t\t\t\tresultNode = builder.context.getOutput( resultNode, builder );\n\n\t\t\t}\n\n\t\t\t// MRT\n\n\t\t\tif ( renderTarget !== null ) {\n\n\t\t\t\tconst mrt = renderer.getMRT();\n\t\t\t\tconst materialMRT = this.mrtNode;\n\n\t\t\t\tif ( mrt !== null ) {\n\n\t\t\t\t\tif ( isCustomOutput ) output.assign( resultNode );\n\n\t\t\t\t\tresultNode = mrt;\n\n\t\t\t\t\tif ( materialMRT !== null ) {\n\n\t\t\t\t\t\tresultNode = mrt.merge( materialMRT );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( materialMRT !== null ) {\n\n\t\t\t\t\tresultNode = materialMRT;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tlet fragmentNode = this.fragmentNode;\n\n\t\t\tif ( fragmentNode.isOutputStructNode !== true ) {\n\n\t\t\t\tfragmentNode = vec4( fragmentNode );\n\n\t\t\t}\n\n\t\t\tresultNode = this.setupOutput( builder, fragmentNode );\n\n\t\t}\n\n\t\tbuilder.stack.outputNode = resultNode;\n\n\t\tbuilder.addFlow( 'fragment', builder.removeStack() );\n\n\t\t// < OBSERVER >\n\n\t\tbuilder.observer = this.setupObserver( builder );\n\n\t}\n\n\t/**\n\t * Setups the clipping node.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {ClippingNode} The clipping node.\n\t */\n\tsetupClipping( builder ) {\n\n\t\tif ( builder.clippingContext === null ) return null;\n\n\t\tconst { unionPlanes, intersectionPlanes } = builder.clippingContext;\n\n\t\tlet result = null;\n\n\t\tif ( unionPlanes.length > 0 || intersectionPlanes.length > 0 ) {\n\n\t\t\tconst samples = builder.renderer.currentSamples;\n\n\t\t\tif ( this.alphaToCoverage && samples > 1 ) {\n\n\t\t\t\t// to be added to flow when the color/alpha value has been determined\n\t\t\t\tresult = clippingAlpha();\n\n\t\t\t} else {\n\n\t\t\t\tbuilder.stack.addToStack( clipping() );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\t/**\n\t * Setups the hardware clipping if available on the current device.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tsetupHardwareClipping( builder ) {\n\n\t\tthis.hardwareClipping = false;\n\n\t\tif ( builder.clippingContext === null ) return;\n\n\t\tconst candidateCount = builder.clippingContext.unionPlanes.length;\n\n\t\t// 8 planes supported by WebGL ANGLE_clip_cull_distance and WebGPU clip-distances\n\n\t\tif ( candidateCount > 0 && candidateCount <= 8 && builder.isAvailable( 'clipDistance' ) ) {\n\n\t\t\tbuilder.stack.addToStack( hardwareClipping() );\n\n\t\t\tthis.hardwareClipping = true;\n\n\t\t}\n\n\t\treturn;\n\n\t}\n\n\t/**\n\t * Setups the depth of this material.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tsetupDepth( builder ) {\n\n\t\tconst { renderer, camera } = builder;\n\n\t\t// Depth\n\n\t\tlet depthNode = this.depthNode;\n\n\t\tif ( depthNode === null ) {\n\n\t\t\tconst mrt = renderer.getMRT();\n\n\t\t\tif ( mrt && mrt.has( 'depth' ) ) {\n\n\t\t\t\tdepthNode = mrt.get( 'depth' );\n\n\t\t\t} else if ( renderer.logarithmicDepthBuffer === true ) {\n\n\t\t\t\tif ( camera.isPerspectiveCamera ) {\n\n\t\t\t\t\tdepthNode = viewZToLogarithmicDepth( positionView.z, cameraNear, cameraFar );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdepthNode = viewZToOrthographicDepth( positionView.z, cameraNear, cameraFar );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( depthNode !== null ) {\n\n\t\t\tdepth.assign( depthNode ).toStack();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Setups the position node in view space. This method exists\n\t * so derived node materials can modify the implementation e.g. sprite materials.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {Node<vec3>} The position in view space.\n\t */\n\tsetupPositionView( /*builder*/ ) {\n\n\t\treturn modelViewMatrix.mul( positionLocal ).xyz;\n\n\t}\n\n\t/**\n\t * Setups the position in clip space.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {Node<vec4>} The position in view space.\n\t */\n\tsetupModelViewProjection( /*builder*/ ) {\n\n\t\treturn cameraProjectionMatrix.mul( positionView );\n\n\t}\n\n\t/**\n\t * Setups the logic for the vertex stage.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {Node<vec4>} The position in clip space.\n\t */\n\tsetupVertex( builder ) {\n\n\t\tbuilder.addStack();\n\n\t\tthis.setupPosition( builder );\n\n\t\tbuilder.context.vertex = builder.removeStack();\n\n\t\treturn modelViewProjection;\n\n\t}\n\n\t/**\n\t * Setups the computation of the position in local space.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {Node<vec3>} The position in local space.\n\t */\n\tsetupPosition( builder ) {\n\n\t\tconst { object, geometry } = builder;\n\n\t\tif ( geometry.morphAttributes.position || geometry.morphAttributes.normal || geometry.morphAttributes.color ) {\n\n\t\t\tmorphReference( object ).toStack();\n\n\t\t}\n\n\t\tif ( object.isSkinnedMesh === true ) {\n\n\t\t\tskinning( object ).toStack();\n\n\t\t}\n\n\t\tif ( this.displacementMap ) {\n\n\t\t\tconst displacementMap = materialReference( 'displacementMap', 'texture' );\n\t\t\tconst displacementScale = materialReference( 'displacementScale', 'float' );\n\t\t\tconst displacementBias = materialReference( 'displacementBias', 'float' );\n\n\t\t\tpositionLocal.addAssign( normalLocal.normalize().mul( ( displacementMap.x.mul( displacementScale ).add( displacementBias ) ) ) );\n\n\t\t}\n\n\t\tif ( object.isBatchedMesh ) {\n\n\t\t\tbatch( object ).toStack();\n\n\t\t}\n\n\t\tif ( ( object.isInstancedMesh && object.instanceMatrix && object.instanceMatrix.isInstancedBufferAttribute === true ) ) {\n\n\t\t\tinstancedMesh( object ).toStack();\n\n\t\t}\n\n\t\tif ( this.positionNode !== null ) {\n\n\t\t\tpositionLocal.assign( subBuild( this.positionNode, 'POSITION', 'vec3' ) );\n\n\t\t}\n\n\t\treturn positionLocal;\n\n\t}\n\n\t/**\n\t * Setups the computation of the material's diffuse color.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @param {BufferGeometry} geometry - The geometry.\n\t */\n\tsetupDiffuseColor( builder ) {\n\n\t\tconst { object, geometry } = builder;\n\n\t\t// MASK\n\n\t\tif ( this.maskNode !== null ) {\n\n\t\t\t// Discard if the mask is `false`\n\n\t\t\tbool( this.maskNode ).not().discard();\n\n\t\t}\n\n\t\t// COLOR\n\n\t\tlet colorNode = this.colorNode ? vec4( this.colorNode ) : materialColor;\n\n\t\t// VERTEX COLORS\n\n\t\tif ( this.vertexColors === true && geometry.hasAttribute( 'color' ) ) {\n\n\t\t\tcolorNode = colorNode.mul( vertexColor() );\n\n\t\t}\n\n\t\t// INSTANCED COLORS\n\n\t\tif ( object.instanceColor ) {\n\n\t\t\tconst instanceColor = varyingProperty( 'vec3', 'vInstanceColor' );\n\n\t\t\tcolorNode = instanceColor.mul( colorNode );\n\n\t\t}\n\n\t\tif ( object.isBatchedMesh && object._colorsTexture ) {\n\n\t\t\tconst batchColor = varyingProperty( 'vec3', 'vBatchColor' );\n\n\t\t\tcolorNode = batchColor.mul( colorNode );\n\n\t\t}\n\n\t\t// DIFFUSE COLOR\n\n\t\tdiffuseColor.assign( colorNode );\n\n\t\t// OPACITY\n\n\t\tconst opacityNode = this.opacityNode ? float( this.opacityNode ) : materialOpacity;\n\t\tdiffuseColor.a.assign( diffuseColor.a.mul( opacityNode ) );\n\n\t\t// ALPHA TEST\n\n\t\tlet alphaTestNode = null;\n\n\t\tif ( this.alphaTestNode !== null || this.alphaTest > 0 ) {\n\n\t\t\talphaTestNode = this.alphaTestNode !== null ? float( this.alphaTestNode ) : materialAlphaTest;\n\n\t\t\tif ( this.alphaToCoverage === true ) {\n\n\t\t\t\tdiffuseColor.a = smoothstep( alphaTestNode, alphaTestNode.add( fwidth( diffuseColor.a ) ), diffuseColor.a );\n\t\t\t\tdiffuseColor.a.lessThanEqual( 0 ).discard();\n\n\t\t\t} else {\n\n\t\t\t\tdiffuseColor.a.lessThanEqual( alphaTestNode ).discard();\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ALPHA HASH\n\n\t\tif ( this.alphaHash === true ) {\n\n\t\t\tdiffuseColor.a.lessThan( getAlphaHashThreshold( positionLocal ) ).discard();\n\n\t\t}\n\n\t\t// OPAQUE\n\n\t\tif ( builder.isOpaque() ) {\n\n\t\t\tdiffuseColor.a.assign( 1.0 );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Abstract interface method that can be implemented by derived materials\n\t * to setup material-specific node variables.\n\t *\n\t * @abstract\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tsetupVariants( /*builder*/ ) {\n\n\t\t// Interface function.\n\n\t}\n\n\t/**\n\t * Setups the outgoing light node variable\n\t *\n\t * @return {Node<vec3>} The outgoing light node.\n\t */\n\tsetupOutgoingLight() {\n\n\t\treturn ( this.lights === true ) ? vec3( 0 ) : diffuseColor.rgb;\n\n\t}\n\n\t/**\n\t * Setups the normal node from the material.\n\t *\n\t * @return {Node<vec3>} The normal node.\n\t */\n\tsetupNormal() {\n\n\t\treturn this.normalNode ? vec3( this.normalNode ) : materialNormal;\n\n\t}\n\n\t/**\n\t * Setups the environment node from the material.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {Node<vec4>} The environment node.\n\t */\n\tsetupEnvironment( /*builder*/ ) {\n\n\t\tlet node = null;\n\n\t\tif ( this.envNode ) {\n\n\t\t\tnode = this.envNode;\n\n\t\t} else if ( this.envMap ) {\n\n\t\t\tnode = this.envMap.isCubeTexture ? materialReference( 'envMap', 'cubeTexture' ) : materialReference( 'envMap', 'texture' );\n\n\t\t}\n\n\t\treturn node;\n\n\t}\n\n\t/**\n\t * Setups the light map node from the material.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {Node<vec3>} The light map node.\n\t */\n\tsetupLightMap( builder ) {\n\n\t\tlet node = null;\n\n\t\tif ( builder.material.lightMap ) {\n\n\t\t\tnode = new IrradianceNode( materialLightMap );\n\n\t\t}\n\n\t\treturn node;\n\n\t}\n\n\t/**\n\t * Setups the lights node based on the scene, environment and material.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {LightsNode} The lights node.\n\t */\n\tsetupLights( builder ) {\n\n\t\tconst materialLightsNode = [];\n\n\t\t//\n\n\t\tconst envNode = this.setupEnvironment( builder );\n\n\t\tif ( envNode && envNode.isLightingNode ) {\n\n\t\t\tmaterialLightsNode.push( envNode );\n\n\t\t}\n\n\t\tconst lightMapNode = this.setupLightMap( builder );\n\n\t\tif ( lightMapNode && lightMapNode.isLightingNode ) {\n\n\t\t\tmaterialLightsNode.push( lightMapNode );\n\n\t\t}\n\n\t\tlet aoNode = this.aoNode;\n\n\t\tif ( aoNode === null && builder.material.aoMap ) {\n\n\t\t\taoNode = materialAO;\n\n\t\t}\n\n\t\tif ( builder.context.getAO ) {\n\n\t\t\taoNode = builder.context.getAO( aoNode, builder );\n\n\t\t}\n\n\t\tif ( aoNode ) {\n\n\t\t\tmaterialLightsNode.push( new AONode( aoNode ) );\n\n\t\t}\n\n\t\tlet lightsN = this.lightsNode || builder.lightsNode;\n\n\t\tif ( materialLightsNode.length > 0 ) {\n\n\t\t\tlightsN = builder.renderer.lighting.createNode( [ ...lightsN.getLights(), ...materialLightsNode ] );\n\n\t\t}\n\n\t\treturn lightsN;\n\n\t}\n\n\t/**\n\t * This method should be implemented by most derived materials\n\t * since it defines the material's lighting model.\n\t *\n\t * @abstract\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {LightingModel} The lighting model.\n\t */\n\tsetupLightingModel( /*builder*/ ) {\n\n\t\t// Interface function.\n\n\t}\n\n\t/**\n\t * Setups the outgoing light node.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {Node<vec3>} The outgoing light node.\n\t */\n\tsetupLighting( builder ) {\n\n\t\tconst { material } = builder;\n\t\tconst { backdropNode, backdropAlphaNode, emissiveNode } = this;\n\n\t\t// OUTGOING LIGHT\n\n\t\tconst lights = this.lights === true || this.lightsNode !== null;\n\n\t\tconst lightsNode = lights ? this.setupLights( builder ) : null;\n\n\t\tlet outgoingLightNode = this.setupOutgoingLight( builder );\n\n\t\tif ( lightsNode && lightsNode.getScope().hasLights ) {\n\n\t\t\tconst lightingModel = this.setupLightingModel( builder ) || null;\n\n\t\t\toutgoingLightNode = lightingContext( lightsNode, lightingModel, backdropNode, backdropAlphaNode );\n\n\t\t} else if ( backdropNode !== null ) {\n\n\t\t\toutgoingLightNode = vec3( backdropAlphaNode !== null ? mix( outgoingLightNode, backdropNode, backdropAlphaNode ) : backdropNode );\n\n\t\t}\n\n\t\t// EMISSIVE\n\n\t\tif ( ( emissiveNode && emissiveNode.isNode === true ) || ( material.emissive && material.emissive.isColor === true ) ) {\n\n\t\t\temissive.assign( vec3( emissiveNode ? emissiveNode : materialEmissive ) );\n\n\t\t\toutgoingLightNode = outgoingLightNode.add( emissive );\n\n\t\t}\n\n\t\treturn outgoingLightNode;\n\n\t}\n\n\t/**\n\t * Setup the fog.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @param {Node<vec4>} outputNode - The existing output node.\n\t * @return {Node<vec4>} The output node.\n\t */\n\tsetupFog( builder, outputNode ) {\n\n\t\tconst fogNode = builder.fogNode;\n\n\t\tif ( fogNode ) {\n\n\t\t\toutput.assign( outputNode );\n\n\t\t\toutputNode = vec4( fogNode.toVar() );\n\n\t\t}\n\n\t\treturn outputNode;\n\n\t}\n\n\t/**\n\t * Setups premultiplied alpha.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @param {Node<vec4>} outputNode - The existing output node.\n\t * @return {Node<vec4>} The output node.\n\t */\n\tsetupPremultipliedAlpha( builder, outputNode ) {\n\n\t\treturn premultiplyAlpha( outputNode );\n\n\t}\n\n\t/**\n\t * Setups the output node.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @param {Node<vec4>} outputNode - The existing output node.\n\t * @return {Node<vec4>} The output node.\n\t */\n\tsetupOutput( builder, outputNode ) {\n\n\t\t// FOG\n\n\t\tif ( this.fog === true ) {\n\n\t\t\toutputNode = this.setupFog( builder, outputNode );\n\n\t\t}\n\n\t\t// PREMULTIPLIED ALPHA\n\n\t\tif ( this.premultipliedAlpha === true ) {\n\n\t\t\toutputNode = this.setupPremultipliedAlpha( builder, outputNode );\n\n\t\t}\n\n\t\treturn outputNode;\n\n\t}\n\n\t/**\n\t * Most classic material types have a node pendant e.g. for `MeshBasicMaterial`\n\t * there is `MeshBasicNodeMaterial`. This utility method is intended for\n\t * defining all material properties of the classic type in the node type.\n\t *\n\t * @param {Material} material - The material to copy properties with their values to this node material.\n\t */\n\tsetDefaultValues( material ) {\n\n\t\t// This approach is to reuse the native refreshUniforms*\n\t\t// and turn available the use of features like transmission and environment in core\n\n\t\tfor ( const property in material ) {\n\n\t\t\tconst value = material[ property ];\n\n\t\t\tif ( this[ property ] === undefined ) {\n\n\t\t\t\tthis[ property ] = value;\n\n\t\t\t\tif ( value && value.clone ) this[ property ] = value.clone();\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst descriptors = Object.getOwnPropertyDescriptors( material.constructor.prototype );\n\n\t\tfor ( const key in descriptors ) {\n\n\t\t\tif ( Object.getOwnPropertyDescriptor( this.constructor.prototype, key ) === undefined &&\n\t\t\t     descriptors[ key ].get !== undefined ) {\n\n\t\t\t\tObject.defineProperty( this.constructor.prototype, key, descriptors[ key ] );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Serializes this material to JSON.\n\t *\n\t * @param {?(Object|string)} meta - The meta information for serialization.\n\t * @return {Object} The serialized node.\n\t */\n\ttoJSON( meta ) {\n\n\t\tconst isRoot = ( meta === undefined || typeof meta === 'string' );\n\n\t\tif ( isRoot ) {\n\n\t\t\tmeta = {\n\t\t\t\ttextures: {},\n\t\t\t\timages: {},\n\t\t\t\tnodes: {}\n\t\t\t};\n\n\t\t}\n\n\t\tconst data = Material.prototype.toJSON.call( this, meta );\n\t\tdata.inputNodes = {};\n\n\t\tfor ( const { property, childNode } of this._getNodeChildren() ) {\n\n\t\t\tdata.inputNodes[ property ] = childNode.toJSON( meta ).uuid;\n\n\t\t}\n\n\t\t// TODO: Copied from Object3D.toJSON\n\n\t\tfunction extractFromCache( cache ) {\n\n\t\t\tconst values = [];\n\n\t\t\tfor ( const key in cache ) {\n\n\t\t\t\tconst data = cache[ key ];\n\t\t\t\tdelete data.metadata;\n\t\t\t\tvalues.push( data );\n\n\t\t\t}\n\n\t\t\treturn values;\n\n\t\t}\n\n\t\tif ( isRoot ) {\n\n\t\t\tconst textures = extractFromCache( meta.textures );\n\t\t\tconst images = extractFromCache( meta.images );\n\t\t\tconst nodes = extractFromCache( meta.nodes );\n\n\t\t\tif ( textures.length > 0 ) data.textures = textures;\n\t\t\tif ( images.length > 0 ) data.images = images;\n\t\t\tif ( nodes.length > 0 ) data.nodes = nodes;\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Copies the properties of the given node material to this instance.\n\t *\n\t * @param {NodeMaterial} source - The material to copy.\n\t * @return {NodeMaterial} A reference to this node material.\n\t */\n\tcopy( source ) {\n\n\t\tthis.lightsNode = source.lightsNode;\n\t\tthis.envNode = source.envNode;\n\t\tthis.aoNode = source.aoNode;\n\n\t\tthis.colorNode = source.colorNode;\n\t\tthis.normalNode = source.normalNode;\n\t\tthis.opacityNode = source.opacityNode;\n\t\tthis.backdropNode = source.backdropNode;\n\t\tthis.backdropAlphaNode = source.backdropAlphaNode;\n\t\tthis.alphaTestNode = source.alphaTestNode;\n\t\tthis.maskNode = source.maskNode;\n\n\t\tthis.positionNode = source.positionNode;\n\t\tthis.geometryNode = source.geometryNode;\n\n\t\tthis.depthNode = source.depthNode;\n\t\tthis.receivedShadowPositionNode = source.receivedShadowPositionNode;\n\t\tthis.castShadowPositionNode = source.castShadowPositionNode;\n\t\tthis.receivedShadowNode = source.receivedShadowNode;\n\t\tthis.castShadowNode = source.castShadowNode;\n\n\t\tthis.outputNode = source.outputNode;\n\t\tthis.mrtNode = source.mrtNode;\n\n\t\tthis.fragmentNode = source.fragmentNode;\n\t\tthis.vertexNode = source.vertexNode;\n\n\t\tthis.contextNode = source.contextNode;\n\n\t\treturn super.copy( source );\n\n\t}\n\n}\n\nconst _defaultValues$d = /*@__PURE__*/ new LineBasicMaterial();\n\n/**\n * Node material version of {@link LineBasicMaterial}.\n *\n * @augments NodeMaterial\n */\nclass LineBasicNodeMaterial extends NodeMaterial {\n\n\tstatic get type() {\n\n\t\treturn 'LineBasicNodeMaterial';\n\n\t}\n\n\t/**\n\t * Constructs a new line basic node material.\n\t *\n\t * @param {Object} [parameters] - The configuration parameter.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineBasicNodeMaterial = true;\n\n\t\tthis.setDefaultValues( _defaultValues$d );\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n}\n\nconst _defaultValues$c = /*@__PURE__*/ new LineDashedMaterial();\n\n/**\n * Node material version of  {@link LineDashedMaterial}.\n *\n * @augments NodeMaterial\n */\nclass LineDashedNodeMaterial extends NodeMaterial {\n\n\tstatic get type() {\n\n\t\treturn 'LineDashedNodeMaterial';\n\n\t}\n\n\t/**\n\t * Constructs a new line dashed node material.\n\t *\n\t * @param {Object} [parameters] - The configuration parameter.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLineDashedNodeMaterial = true;\n\n\t\tthis.setDefaultValues( _defaultValues$c );\n\n\t\t/**\n\t\t * The dash offset.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.dashOffset = 0;\n\n\t\t/**\n\t\t * The offset of dash materials is by default inferred from the `dashOffset`\n\t\t * property. This node property allows to overwrite the default\n\t\t * and define the offset with a node instead.\n\t\t *\n\t\t * If you don't want to overwrite the offset but modify the existing\n\t\t * value instead, use {@link materialLineDashOffset}.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.offsetNode = null;\n\n\t\t/**\n\t\t * The scale of dash materials is by default inferred from the `scale`\n\t\t * property. This node property allows to overwrite the default\n\t\t * and define the scale with a node instead.\n\t\t *\n\t\t * If you don't want to overwrite the scale but modify the existing\n\t\t * value instead, use {@link materialLineScale}.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.dashScaleNode = null;\n\n\t\t/**\n\t\t * The dash size of dash materials is by default inferred from the `dashSize`\n\t\t * property. This node property allows to overwrite the default\n\t\t * and define the dash size with a node instead.\n\t\t *\n\t\t * If you don't want to overwrite the dash size but modify the existing\n\t\t * value instead, use {@link materialLineDashSize}.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.dashSizeNode = null;\n\n\t\t/**\n\t\t * The gap size of dash materials is by default inferred from the `gapSize`\n\t\t * property. This node property allows to overwrite the default\n\t\t * and define the gap size with a node instead.\n\t\t *\n\t\t * If you don't want to overwrite the gap size but modify the existing\n\t\t * value instead, use {@link materialLineGapSize}.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.gapSizeNode = null;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\t/**\n\t * Setups the dash specific node variables.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tsetupVariants( /* builder */ ) {\n\n\t\tconst offsetNode = this.offsetNode ? float( this.offsetNode ) : materialLineDashOffset;\n\t\tconst dashScaleNode = this.dashScaleNode ? float( this.dashScaleNode ) : materialLineScale;\n\t\tconst dashSizeNode = this.dashSizeNode ? float( this.dashSizeNode ) : materialLineDashSize;\n\t\tconst gapSizeNode = this.gapSizeNode ? float( this.gapSizeNode ) : materialLineGapSize;\n\n\t\tdashSize.assign( dashSizeNode );\n\t\tgapSize.assign( gapSizeNode );\n\n\t\tconst vLineDistance = varying( attribute( 'lineDistance' ).mul( dashScaleNode ) );\n\t\tconst vLineDistanceOffset = offsetNode ? vLineDistance.add( offsetNode ) : vLineDistance;\n\n\t\tvLineDistanceOffset.mod( dashSize.add( gapSize ) ).greaterThan( dashSize ).discard();\n\n\t}\n\n}\n\nlet _sharedFramebuffer = null;\n\n/**\n * `ViewportTextureNode` creates an internal texture for each node instance. This module\n * shares a texture across all instances of `ViewportSharedTextureNode`. It should\n * be the first choice when using data of the default/screen framebuffer for performance reasons.\n *\n * @augments ViewportTextureNode\n */\nclass ViewportSharedTextureNode extends ViewportTextureNode {\n\n\tstatic get type() {\n\n\t\treturn 'ViewportSharedTextureNode';\n\n\t}\n\n\t/**\n\t * Constructs a new viewport shared texture node.\n\t *\n\t * @param {Node} [uvNode=screenUV] - The uv node.\n\t * @param {?Node} [levelNode=null] - The level node.\n\t */\n\tconstructor( uvNode = screenUV, levelNode = null ) {\n\n\t\tif ( _sharedFramebuffer === null ) {\n\n\t\t\t_sharedFramebuffer = new FramebufferTexture();\n\n\t\t}\n\n\t\tsuper( uvNode, levelNode, _sharedFramebuffer );\n\n\t}\n\n\t/**\n\t * Overwritten so the method always returns the unique shared\n\t * framebuffer texture.\n\t *\n\t * @return {FramebufferTexture} The shared framebuffer texture.\n\t */\n\tgetTextureForReference() {\n\n\t\treturn _sharedFramebuffer;\n\n\t}\n\n\tupdateReference() {\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * TSL function for creating a shared viewport texture node.\n *\n * @tsl\n * @function\n * @param {?Node} [uvNode=screenUV] - The uv node.\n * @param {?Node} [levelNode=null] - The level node.\n * @returns {ViewportSharedTextureNode}\n */\nconst viewportSharedTexture = /*@__PURE__*/ nodeProxy( ViewportSharedTextureNode ).setParameterLength( 0, 2 );\n\nconst _defaultValues$b = /*@__PURE__*/ new LineDashedMaterial();\n\n/**\n * This node material can be used to render lines with a size larger than one\n * by representing them as instanced meshes.\n *\n * @augments NodeMaterial\n */\nclass Line2NodeMaterial extends NodeMaterial {\n\n\tstatic get type() {\n\n\t\treturn 'Line2NodeMaterial';\n\n\t}\n\n\t/**\n\t * Constructs a new node material for wide line rendering.\n\t *\n\t * @param {Object} [parameters={}] - The configuration parameter.\n\t */\n\tconstructor( parameters = {} ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isLine2NodeMaterial = true;\n\n\t\tthis.setDefaultValues( _defaultValues$b );\n\n\t\t/**\n\t\t * Whether vertex colors should be used or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.useColor = parameters.vertexColors;\n\n\t\t/**\n\t\t * The dash offset.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.dashOffset = 0;\n\n\t\t/**\n\t\t * Defines the lines color.\n\t\t *\n\t\t * @type {?Node<vec3>}\n\t\t * @default null\n\t\t */\n\t\tthis.lineColorNode = null;\n\n\t\t/**\n\t\t * Defines the offset.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.offsetNode = null;\n\n\t\t/**\n\t\t * Defines the dash scale.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.dashScaleNode = null;\n\n\t\t/**\n\t\t * Defines the dash size.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.dashSizeNode = null;\n\n\t\t/**\n\t\t * Defines the gap size.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.gapSizeNode = null;\n\n\t\t/**\n\t\t * Blending is set to `NoBlending` since transparency\n\t\t * is not supported, yet.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.blending = NoBlending;\n\n\t\tthis._useDash = parameters.dashed;\n\t\tthis._useAlphaToCoverage = true;\n\t\tthis._useWorldUnits = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\t/**\n\t * Setups the vertex and fragment stage of this node material.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tsetup( builder ) {\n\n\t\tconst { renderer } = builder;\n\n\t\tconst useAlphaToCoverage = this._useAlphaToCoverage;\n\t\tconst useColor = this.useColor;\n\t\tconst useDash = this._useDash;\n\t\tconst useWorldUnits = this._useWorldUnits;\n\n\t\tconst trimSegment = Fn( ( { start, end } ) => {\n\n\t\t\tconst a = cameraProjectionMatrix.element( 2 ).element( 2 ); // 3nd entry in 3th column\n\t\t\tconst b = cameraProjectionMatrix.element( 3 ).element( 2 ); // 3nd entry in 4th column\n\t\t\tconst nearEstimate = b.mul( -0.5 ).div( a );\n\n\t\t\tconst alpha = nearEstimate.sub( start.z ).div( end.z.sub( start.z ) );\n\n\t\t\treturn vec4( mix( start.xyz, end.xyz, alpha ), end.w );\n\n\t\t} ).setLayout( {\n\t\t\tname: 'trimSegment',\n\t\t\ttype: 'vec4',\n\t\t\tinputs: [\n\t\t\t\t{ name: 'start', type: 'vec4' },\n\t\t\t\t{ name: 'end', type: 'vec4' }\n\t\t\t]\n\t\t} );\n\n\t\tthis.vertexNode = Fn( () => {\n\n\t\t\tconst instanceStart = attribute( 'instanceStart' );\n\t\t\tconst instanceEnd = attribute( 'instanceEnd' );\n\n\t\t\t// camera space\n\n\t\t\tconst start = vec4( modelViewMatrix.mul( vec4( instanceStart, 1.0 ) ) ).toVar( 'start' );\n\t\t\tconst end = vec4( modelViewMatrix.mul( vec4( instanceEnd, 1.0 ) ) ).toVar( 'end' );\n\n\t\t\tif ( useDash ) {\n\n\t\t\t\tconst dashScaleNode = this.dashScaleNode ? float( this.dashScaleNode ) : materialLineScale;\n\t\t\t\tconst offsetNode = this.offsetNode ? float( this.offsetNode ) : materialLineDashOffset;\n\n\t\t\t\tconst instanceDistanceStart = attribute( 'instanceDistanceStart' );\n\t\t\t\tconst instanceDistanceEnd = attribute( 'instanceDistanceEnd' );\n\n\t\t\t\tlet lineDistance = positionGeometry.y.lessThan( 0.5 ).select( dashScaleNode.mul( instanceDistanceStart ), dashScaleNode.mul( instanceDistanceEnd ) );\n\t\t\t\tlineDistance = lineDistance.add( offsetNode );\n\n\t\t\t\tvaryingProperty( 'float', 'lineDistance' ).assign( lineDistance );\n\n\t\t\t}\n\n\t\t\tif ( useWorldUnits ) {\n\n\t\t\t\tvaryingProperty( 'vec3', 'worldStart' ).assign( start.xyz );\n\t\t\t\tvaryingProperty( 'vec3', 'worldEnd' ).assign( end.xyz );\n\n\t\t\t}\n\n\t\t\tconst aspect = viewport.z.div( viewport.w );\n\n\t\t\t// special case for perspective projection, and segments that terminate either in, or behind, the camera plane\n\t\t\t// clearly the gpu firmware has a way of addressing this issue when projecting into ndc space\n\t\t\t// but we need to perform ndc-space calculations in the shader, so we must address this issue directly\n\t\t\t// perhaps there is a more elegant solution -- WestLangley\n\n\t\t\tconst perspective = cameraProjectionMatrix.element( 2 ).element( 3 ).equal( -1 ); // 4th entry in the 3rd column\n\n\t\t\tIf( perspective, () => {\n\n\t\t\t\tIf( start.z.lessThan( 0.0 ).and( end.z.greaterThan( 0.0 ) ), () => {\n\n\t\t\t\t\tend.assign( trimSegment( { start: start, end: end } ) );\n\n\t\t\t\t} ).ElseIf( end.z.lessThan( 0.0 ).and( start.z.greaterThanEqual( 0.0 ) ), () => {\n\n\t\t\t\t\tstart.assign( trimSegment( { start: end, end: start } ) );\n\n\t\t\t \t} );\n\n\t\t\t} );\n\n\t\t\t// clip space\n\t\t\tconst clipStart = cameraProjectionMatrix.mul( start );\n\t\t\tconst clipEnd = cameraProjectionMatrix.mul( end );\n\n\t\t\t// ndc space\n\t\t\tconst ndcStart = clipStart.xyz.div( clipStart.w );\n\t\t\tconst ndcEnd = clipEnd.xyz.div( clipEnd.w );\n\n\t\t\t// direction\n\t\t\tconst dir = ndcEnd.xy.sub( ndcStart.xy ).toVar();\n\n\t\t\t// account for clip-space aspect ratio\n\t\t\tdir.x.assign( dir.x.mul( aspect ) );\n\t\t\tdir.assign( dir.normalize() );\n\n\t\t\tconst clip = vec4().toVar();\n\n\t\t\tif ( useWorldUnits ) {\n\n\t\t\t\t// get the offset direction as perpendicular to the view vector\n\n\t\t\t\tconst worldDir = end.xyz.sub( start.xyz ).normalize();\n\t\t\t\tconst tmpFwd = mix( start.xyz, end.xyz, 0.5 ).normalize();\n\t\t\t\tconst worldUp = worldDir.cross( tmpFwd ).normalize();\n\t\t\t\tconst worldFwd = worldDir.cross( worldUp );\n\n\t\t\t\tconst worldPos = varyingProperty( 'vec4', 'worldPos' );\n\n\t\t\t\tworldPos.assign( positionGeometry.y.lessThan( 0.5 ).select( start, end ) );\n\n\t\t\t\t// height offset\n\t\t\t\tconst hw = materialLineWidth.mul( 0.5 );\n\t\t\t\tworldPos.addAssign( vec4( positionGeometry.x.lessThan( 0.0 ).select( worldUp.mul( hw ), worldUp.mul( hw ).negate() ), 0 ) );\n\n\t\t\t\t// don't extend the line if we're rendering dashes because we\n\t\t\t\t// won't be rendering the endcaps\n\t\t\t\tif ( ! useDash ) {\n\n\t\t\t\t\t// cap extension\n\t\t\t\t\tworldPos.addAssign( vec4( positionGeometry.y.lessThan( 0.5 ).select( worldDir.mul( hw ).negate(), worldDir.mul( hw ) ), 0 ) );\n\n\t\t\t\t\t// add width to the box\n\t\t\t\t\tworldPos.addAssign( vec4( worldFwd.mul( hw ), 0 ) );\n\n\t\t\t\t\t// endcaps\n\t\t\t\t\tIf( positionGeometry.y.greaterThan( 1.0 ).or( positionGeometry.y.lessThan( 0.0 ) ), () => {\n\n\t\t\t\t\t\tworldPos.subAssign( vec4( worldFwd.mul( 2.0 ).mul( hw ), 0 ) );\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t\t// project the worldpos\n\t\t\t\tclip.assign( cameraProjectionMatrix.mul( worldPos ) );\n\n\t\t\t\t// shift the depth of the projected points so the line\n\t\t\t\t// segments overlap neatly\n\t\t\t\tconst clipPose = vec3().toVar();\n\n\t\t\t\tclipPose.assign( positionGeometry.y.lessThan( 0.5 ).select( ndcStart, ndcEnd ) );\n\t\t\t\tclip.z.assign( clipPose.z.mul( clip.w ) );\n\n\t\t\t} else {\n\n\t\t\t\tconst offset = vec2( dir.y, dir.x.negate() ).toVar( 'offset' );\n\n\t\t\t\t// undo aspect ratio adjustment\n\t\t\t\tdir.x.assign( dir.x.div( aspect ) );\n\t\t\t\toffset.x.assign( offset.x.div( aspect ) );\n\n\t\t\t\t// sign flip\n\t\t\t\toffset.assign( positionGeometry.x.lessThan( 0.0 ).select( offset.negate(), offset ) );\n\n\t\t\t\t// endcaps\n\t\t\t\tIf( positionGeometry.y.lessThan( 0.0 ), () => {\n\n\t\t\t\t\toffset.assign( offset.sub( dir ) );\n\n\t\t\t\t} ).ElseIf( positionGeometry.y.greaterThan( 1.0 ), () => {\n\n\t\t\t\t\toffset.assign( offset.add( dir ) );\n\n\t\t\t\t} );\n\n\t\t\t\t// adjust for linewidth\n\t\t\t\toffset.assign( offset.mul( materialLineWidth ) );\n\n\t\t\t\t// adjust for clip-space to screen-space conversion // maybe resolution should be based on viewport ...\n\t\t\t\toffset.assign( offset.div( viewport.w.div( screenDPR ) ) );\n\n\t\t\t\t// select end\n\t\t\t\tclip.assign( positionGeometry.y.lessThan( 0.5 ).select( clipStart, clipEnd ) );\n\n\t\t\t\t// back to clip space\n\t\t\t\toffset.assign( offset.mul( clip.w ) );\n\n\t\t\t\tclip.assign( clip.add( vec4( offset, 0, 0 ) ) );\n\n\t\t\t}\n\n\t\t\treturn clip;\n\n\t\t} )();\n\n\t\tconst closestLineToLine = Fn( ( { p1, p2, p3, p4 } ) => {\n\n\t\t\tconst p13 = p1.sub( p3 );\n\t\t\tconst p43 = p4.sub( p3 );\n\n\t\t\tconst p21 = p2.sub( p1 );\n\n\t\t\tconst d1343 = p13.dot( p43 );\n\t\t\tconst d4321 = p43.dot( p21 );\n\t\t\tconst d1321 = p13.dot( p21 );\n\t\t\tconst d4343 = p43.dot( p43 );\n\t\t\tconst d2121 = p21.dot( p21 );\n\n\t\t\tconst denom = d2121.mul( d4343 ).sub( d4321.mul( d4321 ) );\n\t\t\tconst numer = d1343.mul( d4321 ).sub( d1321.mul( d4343 ) );\n\n\t\t\tconst mua = numer.div( denom ).clamp();\n\t\t\tconst mub = d1343.add( d4321.mul( mua ) ).div( d4343 ).clamp();\n\n\t\t\treturn vec2( mua, mub );\n\n\t\t} );\n\n\t\tthis.colorNode = Fn( () => {\n\n\t\t\tconst vUv = uv$1();\n\n\t\t\tif ( useDash ) {\n\n\t\t\t\tconst dashSizeNode = this.dashSizeNode ? float( this.dashSizeNode ) : materialLineDashSize;\n\t\t\t\tconst gapSizeNode = this.gapSizeNode ? float( this.gapSizeNode ) : materialLineGapSize;\n\n\t\t\t\tdashSize.assign( dashSizeNode );\n\t\t\t\tgapSize.assign( gapSizeNode );\n\n\t\t\t\tconst vLineDistance = varyingProperty( 'float', 'lineDistance' );\n\n\t\t\t\tvUv.y.lessThan( -1 ).or( vUv.y.greaterThan( 1.0 ) ).discard(); // discard endcaps\n\t\t\t\tvLineDistance.mod( dashSize.add( gapSize ) ).greaterThan( dashSize ).discard(); // todo - FIX\n\n\t\t\t}\n\n\t\t\tconst alpha = float( 1 ).toVar( 'alpha' );\n\n\t\t\tif ( useWorldUnits ) {\n\n\t\t\t\tconst worldStart = varyingProperty( 'vec3', 'worldStart' );\n\t\t\t\tconst worldEnd = varyingProperty( 'vec3', 'worldEnd' );\n\n\t\t\t\t// Find the closest points on the view ray and the line segment\n\t\t\t\tconst rayEnd = varyingProperty( 'vec4', 'worldPos' ).xyz.normalize().mul( 1e5 );\n\t\t\t\tconst lineDir = worldEnd.sub( worldStart );\n\t\t\t\tconst params = closestLineToLine( { p1: worldStart, p2: worldEnd, p3: vec3( 0.0, 0.0, 0.0 ), p4: rayEnd } );\n\n\t\t\t\tconst p1 = worldStart.add( lineDir.mul( params.x ) );\n\t\t\t\tconst p2 = rayEnd.mul( params.y );\n\t\t\t\tconst delta = p1.sub( p2 );\n\t\t\t\tconst len = delta.length();\n\t\t\t\tconst norm = len.div( materialLineWidth );\n\n\t\t\t\tif ( ! useDash ) {\n\n\t\t\t\t\tif ( useAlphaToCoverage && renderer.currentSamples > 0 ) {\n\n\t\t\t\t\t\tconst dnorm = norm.fwidth();\n\t\t\t\t\t\talpha.assign( smoothstep( dnorm.negate().add( 0.5 ), dnorm.add( 0.5 ), norm ).oneMinus() );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tnorm.greaterThan( 0.5 ).discard();\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// round endcaps\n\n\t\t\t\tif ( useAlphaToCoverage && renderer.currentSamples > 0 ) {\n\n\t\t\t\t\tconst a = vUv.x;\n\t\t\t\t\tconst b = vUv.y.greaterThan( 0.0 ).select( vUv.y.sub( 1.0 ), vUv.y.add( 1.0 ) );\n\n\t\t\t\t\tconst len2 = a.mul( a ).add( b.mul( b ) );\n\n\t\t\t\t\tconst dlen = float( len2.fwidth() ).toVar( 'dlen' );\n\n\t\t\t\t\tIf( vUv.y.abs().greaterThan( 1.0 ), () => {\n\n\t\t\t\t\t\talpha.assign( smoothstep( dlen.oneMinus(), dlen.add( 1 ), len2 ).oneMinus() );\n\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tIf( vUv.y.abs().greaterThan( 1.0 ), () => {\n\n\t\t\t\t\t\tconst a = vUv.x;\n\t\t\t\t\t\tconst b = vUv.y.greaterThan( 0.0 ).select( vUv.y.sub( 1.0 ), vUv.y.add( 1.0 ) );\n\t\t\t\t\t\tconst len2 = a.mul( a ).add( b.mul( b ) );\n\n\t\t\t\t\t\tlen2.greaterThan( 1.0 ).discard();\n\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tlet lineColorNode;\n\n\t\t\tif ( this.lineColorNode ) {\n\n\t\t\t\tlineColorNode = this.lineColorNode;\n\n\t\t\t} else {\n\n\t\t\t\tif ( useColor ) {\n\n\t\t\t\t\tconst instanceColorStart = attribute( 'instanceColorStart' );\n\t\t\t\t\tconst instanceColorEnd = attribute( 'instanceColorEnd' );\n\n\t\t\t\t\tconst instanceColor = positionGeometry.y.lessThan( 0.5 ).select( instanceColorStart, instanceColorEnd );\n\n\t\t\t\t\tlineColorNode = instanceColor.mul( materialColor );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tlineColorNode = materialColor;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn vec4( lineColorNode, alpha );\n\n\t\t} )();\n\n\t\tif ( this.transparent ) {\n\n\t\t\tconst opacityNode = this.opacityNode ? float( this.opacityNode ) : materialOpacity;\n\n\t\t\tthis.outputNode = vec4( this.colorNode.rgb.mul( opacityNode ).add( viewportSharedTexture().rgb.mul( opacityNode.oneMinus() ) ), this.colorNode.a );\n\n\t\t}\n\n\t\tsuper.setup( builder );\n\n\t}\n\n\t/**\n\t * Whether the lines should sized in world units or not.\n\t * When set to `false` the unit is pixel.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t */\n\tget worldUnits() {\n\n\t\treturn this._useWorldUnits;\n\n\t}\n\n\tset worldUnits( value ) {\n\n\t\tif ( this._useWorldUnits !== value ) {\n\n\t\t\tthis._useWorldUnits = value;\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Whether the lines should be dashed or not.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t */\n\tget dashed() {\n\n\t\treturn this._useDash;\n\n\t}\n\n\tset dashed( value ) {\n\n\t\tif ( this._useDash !== value ) {\n\n\t\t\tthis._useDash = value;\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Whether alpha to coverage should be used or not.\n\t *\n\t * @type {boolean}\n\t * @default true\n\t */\n\tget alphaToCoverage() {\n\n\t\treturn this._useAlphaToCoverage;\n\n\t}\n\n\tset alphaToCoverage( value ) {\n\n\t\tif ( this._useAlphaToCoverage !== value ) {\n\n\t\t\tthis._useAlphaToCoverage = value;\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n}\n\nconst _defaultValues$a = /*@__PURE__*/ new MeshNormalMaterial();\n\n/**\n * Node material version of {@link MeshNormalMaterial}.\n *\n * @augments NodeMaterial\n */\nclass MeshNormalNodeMaterial extends NodeMaterial {\n\n\tstatic get type() {\n\n\t\treturn 'MeshNormalNodeMaterial';\n\n\t}\n\n\t/**\n\t * Constructs a new mesh normal node material.\n\t *\n\t * @param {Object} [parameters] - The configuration parameter.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshNormalNodeMaterial = true;\n\n\t\tthis.setDefaultValues( _defaultValues$a );\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\t/**\n\t * Overwrites the default implementation by computing the diffuse color\n\t * based on the normal data.\n\t */\n\tsetupDiffuseColor() {\n\n\t\tconst opacityNode = this.opacityNode ? float( this.opacityNode ) : materialOpacity;\n\n\t\t// By convention, a normal packed to RGB is in sRGB color space. Convert it to working color space.\n\n\t\tdiffuseColor.assign( colorSpaceToWorking( vec4( directionToColor( normalView ), opacityNode ), SRGBColorSpace ) );\n\n\t}\n\n}\n\n/**\n * TSL function for creating an equirect uv node.\n *\n * Can be used to compute texture coordinates for projecting an\n * equirectangular texture onto a mesh for using it as the scene's\n * background.\n *\n * ```js\n * scene.backgroundNode = texture( equirectTexture, equirectUV() );\n * ```\n *\n * @tsl\n * @function\n * @param {?Node<vec3>} [dirNode=positionWorldDirection] - A direction vector for sampling which is by default `positionWorldDirection`.\n * @returns {Node<vec2>}\n */\nconst equirectUV = /*@__PURE__*/ Fn( ( [ dir = positionWorldDirection ] ) => {\n\n\tconst u = dir.z.atan( dir.x ).mul( 1 / ( Math.PI * 2 ) ).add( 0.5 );\n\tconst v = dir.y.clamp( -1, 1.0 ).asin().mul( 1 / Math.PI ).add( 0.5 );\n\n\treturn vec2( u, v );\n\n} );\n\n// @TODO: Consider rename WebGLCubeRenderTarget to just CubeRenderTarget\n\n/**\n * This class represents a cube render target. It is a special version\n * of `WebGLCubeRenderTarget` which is compatible with `WebGPURenderer`.\n *\n * @augments WebGLCubeRenderTarget\n */\nclass CubeRenderTarget extends WebGLCubeRenderTarget {\n\n\t/**\n\t * Constructs a new cube render target.\n\t *\n\t * @param {number} [size=1] - The size of the render target.\n\t * @param {RenderTarget~Options} [options] - The configuration object.\n\t */\n\tconstructor( size = 1, options = {} ) {\n\n\t\tsuper( size, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCubeRenderTarget = true;\n\n\t}\n\n\t/**\n\t * Converts the given equirectangular texture to a cube map.\n\t *\n\t * @param {Renderer} renderer - The renderer.\n\t * @param {Texture} texture - The equirectangular texture.\n\t * @return {CubeRenderTarget} A reference to this cube render target.\n\t */\n\tfromEquirectangularTexture( renderer, texture$1 ) {\n\n\t\tconst currentMinFilter = texture$1.minFilter;\n\t\tconst currentGenerateMipmaps = texture$1.generateMipmaps;\n\n\t\ttexture$1.generateMipmaps = true;\n\n\t\tthis.texture.type = texture$1.type;\n\t\tthis.texture.colorSpace = texture$1.colorSpace;\n\n\t\tthis.texture.generateMipmaps = texture$1.generateMipmaps;\n\t\tthis.texture.minFilter = texture$1.minFilter;\n\t\tthis.texture.magFilter = texture$1.magFilter;\n\n\t\tconst geometry = new BoxGeometry( 5, 5, 5 );\n\n\t\tconst uvNode = equirectUV( positionWorldDirection );\n\n\t\tconst material = new NodeMaterial();\n\t\tmaterial.colorNode = texture( texture$1, uvNode, 0 );\n\t\tmaterial.side = BackSide;\n\t\tmaterial.blending = NoBlending;\n\n\t\tconst mesh = new Mesh( geometry, material );\n\n\t\tconst scene = new Scene();\n\t\tscene.add( mesh );\n\n\t\t// Avoid blurred poles\n\t\tif ( texture$1.minFilter === LinearMipmapLinearFilter ) texture$1.minFilter = LinearFilter;\n\n\t\tconst camera = new CubeCamera( 1, 10, this );\n\n\t\tconst currentMRT = renderer.getMRT();\n\t\trenderer.setMRT( null );\n\n\t\tcamera.update( renderer, scene );\n\n\t\trenderer.setMRT( currentMRT );\n\n\t\ttexture$1.minFilter = currentMinFilter;\n\t\ttexture$1.currentGenerateMipmaps = currentGenerateMipmaps;\n\n\t\tmesh.geometry.dispose();\n\t\tmesh.material.dispose();\n\n\t\treturn this;\n\n\t}\n\n}\n\nconst _cache$1 = new WeakMap();\n\n/**\n * This node can be used to automatically convert environment maps in the\n * equirectangular format into the cube map format.\n *\n * @augments TempNode\n */\nclass CubeMapNode extends TempNode {\n\n\tstatic get type() {\n\n\t\treturn 'CubeMapNode';\n\n\t}\n\n\t/**\n\t * Constructs a new cube map node.\n\t *\n\t * @param {Node} envNode - The node representing the environment map.\n\t */\n\tconstructor( envNode ) {\n\n\t\tsuper( 'vec3' );\n\n\t\t/**\n\t\t * The node representing the environment map.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.envNode = envNode;\n\n\t\t/**\n\t\t * A reference to the internal cube texture.\n\t\t *\n\t\t * @private\n\t\t * @type {?CubeTexture}\n\t\t * @default null\n\t\t */\n\t\tthis._cubeTexture = null;\n\n\t\t/**\n\t\t * A reference to the internal cube texture node.\n\t\t *\n\t\t * @private\n\t\t * @type {CubeTextureNode}\n\t\t */\n\t\tthis._cubeTextureNode = cubeTexture( null );\n\n\t\tconst defaultTexture = new CubeTexture();\n\t\tdefaultTexture.isRenderTargetTexture = true;\n\n\t\t/**\n\t\t * A default cube texture that acts as a placeholder.\n\t\t * It is used when the conversion from equirectangular to cube\n\t\t * map has not finished yet for a given texture.\n\t\t *\n\t\t * @private\n\t\t * @type {CubeTexture}\n\t\t */\n\t\tthis._defaultTexture = defaultTexture;\n\n\t\t/**\n\t\t * The `updateBeforeType` is set to `NodeUpdateType.RENDER` since the node updates\n\t\t * the texture once per render in its {@link CubeMapNode#updateBefore} method.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'render'\n\t\t */\n\t\tthis.updateBeforeType = NodeUpdateType.RENDER;\n\n\t}\n\n\tupdateBefore( frame ) {\n\n\t\tconst { renderer, material } = frame;\n\n\t\tconst envNode = this.envNode;\n\n\t\tif ( envNode.isTextureNode || envNode.isMaterialReferenceNode ) {\n\n\t\t\tconst texture = ( envNode.isTextureNode ) ? envNode.value : material[ envNode.property ];\n\n\t\t\tif ( texture && texture.isTexture ) {\n\n\t\t\t\tconst mapping = texture.mapping;\n\n\t\t\t\tif ( mapping === EquirectangularReflectionMapping || mapping === EquirectangularRefractionMapping ) {\n\n\t\t\t\t\t// check for converted cubemap map\n\n\t\t\t\t\tif ( _cache$1.has( texture ) ) {\n\n\t\t\t\t\t\tconst cubeMap = _cache$1.get( texture );\n\n\t\t\t\t\t\tmapTextureMapping( cubeMap, texture.mapping );\n\t\t\t\t\t\tthis._cubeTexture = cubeMap;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// create cube map from equirectangular map\n\n\t\t\t\t\t\tconst image = texture.image;\n\n\t\t\t\t\t\tif ( isEquirectangularMapReady$1( image ) ) {\n\n\t\t\t\t\t\t\tconst renderTarget = new CubeRenderTarget( image.height );\n\t\t\t\t\t\t\trenderTarget.fromEquirectangularTexture( renderer, texture );\n\n\t\t\t\t\t\t\tmapTextureMapping( renderTarget.texture, texture.mapping );\n\t\t\t\t\t\t\tthis._cubeTexture = renderTarget.texture;\n\n\t\t\t\t\t\t\t_cache$1.set( texture, renderTarget.texture );\n\n\t\t\t\t\t\t\ttexture.addEventListener( 'dispose', onTextureDispose );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// default cube texture as fallback when equirectangular texture is not yet loaded\n\n\t\t\t\t\t\t\tthis._cubeTexture = this._defaultTexture;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\t//\n\n\t\t\t\t\tthis._cubeTextureNode.value = this._cubeTexture;\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// envNode already refers to a cube map\n\n\t\t\t\t\tthis._cubeTextureNode = this.envNode;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tsetup( builder ) {\n\n\t\tthis.updateBefore( builder );\n\n\t\treturn this._cubeTextureNode;\n\n\t}\n\n}\n\n/**\n * Returns true if the given equirectangular image has been fully loaded\n * and is ready for further processing.\n *\n * @private\n * @param {Image} image - The equirectangular image to check.\n * @return {boolean} Whether the image is ready or not.\n */\nfunction isEquirectangularMapReady$1( image ) {\n\n\tif ( image === null || image === undefined ) return false;\n\n\treturn image.height > 0;\n\n}\n\n/**\n * This function is executed when `dispose()` is called on the equirectangular\n * texture. In this case, the generated cube map with its render target\n * is deleted as well.\n *\n * @private\n * @param {Object} event - The event object.\n */\nfunction onTextureDispose( event ) {\n\n\tconst texture = event.target;\n\n\ttexture.removeEventListener( 'dispose', onTextureDispose );\n\n\tconst renderTarget = _cache$1.get( texture );\n\n\tif ( renderTarget !== undefined ) {\n\n\t\t_cache$1.delete( texture );\n\n\t\trenderTarget.dispose();\n\n\t}\n\n}\n\n/**\n * This function makes sure the generated cube map uses the correct\n * texture mapping that corresponds to the equirectangular original.\n *\n * @private\n * @param {Texture} texture - The cube texture.\n * @param {number} mapping - The original texture mapping.\n */\nfunction mapTextureMapping( texture, mapping ) {\n\n\tif ( mapping === EquirectangularReflectionMapping ) {\n\n\t\ttexture.mapping = CubeReflectionMapping;\n\n\t} else if ( mapping === EquirectangularRefractionMapping ) {\n\n\t\ttexture.mapping = CubeRefractionMapping;\n\n\t}\n\n}\n\n/**\n * TSL function for creating a cube map node.\n *\n * @tsl\n * @function\n * @param {Node} envNode - The node representing the environment map.\n * @returns {CubeMapNode}\n */\nconst cubeMapNode = /*@__PURE__*/ nodeProxy( CubeMapNode ).setParameterLength( 1 );\n\n/**\n * Represents a basic model for Image-based lighting (IBL). The environment\n * is defined via environment maps in the equirectangular or cube map format.\n * `BasicEnvironmentNode` is intended for non-PBR materials like {@link MeshBasicNodeMaterial}\n * or {@link MeshPhongNodeMaterial}.\n *\n * @augments LightingNode\n */\nclass BasicEnvironmentNode extends LightingNode {\n\n\tstatic get type() {\n\n\t\treturn 'BasicEnvironmentNode';\n\n\t}\n\n\t/**\n\t * Constructs a new basic environment node.\n\t *\n\t * @param {Node} [envNode=null] - A node representing the environment.\n\t */\n\tconstructor( envNode = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * A node representing the environment.\n\t\t *\n\t\t * @type {Node}\n\t\t * @default null\n\t\t */\n\t\tthis.envNode = envNode;\n\n\t}\n\n\tsetup( builder ) {\n\n\t\t// environment property is used in the finish() method of BasicLightingModel\n\n\t\tbuilder.context.environment = cubeMapNode( this.envNode );\n\n\t}\n\n}\n\n/**\n * A specific version of {@link IrradianceNode} that is only relevant\n * for {@link MeshBasicNodeMaterial}. Since the material is unlit, it\n * requires a special scaling factor for the light map.\n *\n * @augments LightingNode\n */\nclass BasicLightMapNode extends LightingNode {\n\n\tstatic get type() {\n\n\t\treturn 'BasicLightMapNode';\n\n\t}\n\n\t/**\n\t * Constructs a new basic light map node.\n\t *\n\t * @param {?Node<vec3>} [lightMapNode=null] - The light map node.\n\t */\n\tconstructor( lightMapNode = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The light map node.\n\t\t *\n\t\t * @type {?Node<vec3>}\n\t\t */\n\t\tthis.lightMapNode = lightMapNode;\n\n\t}\n\n\tsetup( builder ) {\n\n\t\t// irradianceLightMap property is used in the indirectDiffuse() method of BasicLightingModel\n\n\t\tconst RECIPROCAL_PI = float( 1 / Math.PI );\n\n\t\tbuilder.context.irradianceLightMap = this.lightMapNode.mul( RECIPROCAL_PI );\n\n\t}\n\n}\n\n/**\n * Abstract class for implementing lighting models. The module defines\n * multiple methods that concrete lighting models can implement. These\n * methods are executed at different points during the light evaluation\n * process.\n */\nclass LightingModel {\n\n\t/**\n\t * This method is intended for setting up lighting model and context data\n\t * which are later used in the evaluation process.\n\t *\n\t * @abstract\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tstart( builder ) {\n\n\t\t// lights ( direct )\n\n\t\tbuilder.lightsNode.setupLights( builder, builder.lightsNode.getLightNodes( builder ) );\n\n\t\t// indirect\n\n\t\tthis.indirect( builder );\n\n\t}\n\n\t/**\n\t * This method is intended for executing final tasks like final updates\n\t * to the outgoing light.\n\t *\n\t * @abstract\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tfinish( /*builder*/ ) { }\n\n\t/**\n\t * This method is intended for implementing the direct light term and\n\t * executed during the build process of directional, point and spot light nodes.\n\t *\n\t * @abstract\n\t * @param {Object} lightData - The light data.\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tdirect( /*lightData, builder*/ ) { }\n\n\t/**\n\t * This method is intended for implementing the direct light term for\n\t * rect area light nodes.\n\t *\n\t * @abstract\n\t * @param {Object} lightData - The light data.\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tdirectRectArea( /*lightData, builder*/ ) {}\n\n\t/**\n\t * This method is intended for implementing the indirect light term.\n\t *\n\t * @abstract\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tindirect( /*builder*/ ) { }\n\n\t/**\n\t * This method is intended for implementing the ambient occlusion term.\n\t * Unlike other methods, this method must be called manually by the lighting\n\t * model in its indirect term.\n\t *\n\t * @abstract\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tambientOcclusion( /*input, stack, builder*/ ) { }\n\n}\n\n/**\n * Represents the lighting model for unlit materials. The only light contribution\n * is baked indirect lighting modulated with ambient occlusion and the material's\n * diffuse color. Environment mapping is supported. Used in {@link MeshBasicNodeMaterial}.\n *\n * @augments LightingModel\n */\nclass BasicLightingModel extends LightingModel {\n\n\t/**\n\t * Constructs a new basic lighting model.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t}\n\n\t/**\n\t * Implements the baked indirect lighting with its modulation.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tindirect( { context } ) {\n\n\t\tconst ambientOcclusion = context.ambientOcclusion;\n\t\tconst reflectedLight = context.reflectedLight;\n\t\tconst irradianceLightMap = context.irradianceLightMap;\n\n\t\treflectedLight.indirectDiffuse.assign( vec4( 0.0 ) );\n\n\t\t// accumulation (baked indirect lighting only)\n\n\t\tif ( irradianceLightMap ) {\n\n\t\t\treflectedLight.indirectDiffuse.addAssign( irradianceLightMap );\n\n\t\t} else {\n\n\t\t\treflectedLight.indirectDiffuse.addAssign( vec4( 1.0, 1.0, 1.0, 0.0 ) );\n\n\t\t}\n\n\t\t// modulation\n\n\t\treflectedLight.indirectDiffuse.mulAssign( ambientOcclusion );\n\n\t\treflectedLight.indirectDiffuse.mulAssign( diffuseColor.rgb );\n\n\t}\n\n\t/**\n\t * Implements the environment mapping.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tfinish( builder ) {\n\n\t\tconst { material, context } = builder;\n\n\t\tconst outgoingLight = context.outgoingLight;\n\t\tconst envNode = builder.context.environment;\n\n\t\tif ( envNode ) {\n\n\t\t\tswitch ( material.combine ) {\n\n\t\t\t\tcase MultiplyOperation:\n\t\t\t\t\toutgoingLight.rgb.assign( mix( outgoingLight.rgb, outgoingLight.rgb.mul( envNode.rgb ), materialSpecularStrength.mul( materialReflectivity ) ) );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase MixOperation:\n\t\t\t\t\toutgoingLight.rgb.assign( mix( outgoingLight.rgb, envNode.rgb, materialSpecularStrength.mul( materialReflectivity ) ) );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase AddOperation:\n\t\t\t\t\toutgoingLight.rgb.addAssign( envNode.rgb.mul( materialSpecularStrength.mul( materialReflectivity ) ) );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\twarn( 'BasicLightingModel: Unsupported .combine value:', material.combine );\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\nconst _defaultValues$9 = /*@__PURE__*/ new MeshBasicMaterial();\n\n/**\n * Node material version of {@link MeshBasicMaterial}.\n *\n * @augments NodeMaterial\n */\nclass MeshBasicNodeMaterial extends NodeMaterial {\n\n\tstatic get type() {\n\n\t\treturn 'MeshBasicNodeMaterial';\n\n\t}\n\n\t/**\n\t * Constructs a new mesh basic node material.\n\t *\n\t * @param {Object} [parameters] - The configuration parameter.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshBasicNodeMaterial = true;\n\n\t\t/**\n\t\t * Although the basic material is by definition unlit, we set\n\t\t * this property to `true` since we use a lighting model to compute\n\t\t * the outgoing light of the fragment shader.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.lights = true;\n\n\t\tthis.setDefaultValues( _defaultValues$9 );\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\t/**\n\t * Basic materials are not affected by normal and bump maps so we\n\t * return by default {@link normalViewGeometry}.\n\t *\n\t * @return {Node<vec3>} The normal node.\n\t */\n\tsetupNormal() {\n\n\t\treturn directionToFaceDirection( normalViewGeometry ); // see #28839\n\n\t}\n\n\t/**\n\t * Overwritten since this type of material uses {@link BasicEnvironmentNode}\n\t * to implement the default environment mapping.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {?BasicEnvironmentNode<vec3>} The environment node.\n\t */\n\tsetupEnvironment( builder ) {\n\n\t\tconst envNode = super.setupEnvironment( builder );\n\n\t\treturn envNode ? new BasicEnvironmentNode( envNode ) : null;\n\n\t}\n\n\t/**\n\t * This method must be overwritten since light maps are evaluated\n\t * with a special scaling factor for basic materials.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {?BasicLightMapNode<vec3>} The light map node.\n\t */\n\tsetupLightMap( builder ) {\n\n\t\tlet node = null;\n\n\t\tif ( builder.material.lightMap ) {\n\n\t\t\tnode = new BasicLightMapNode( materialLightMap );\n\n\t\t}\n\n\t\treturn node;\n\n\t}\n\n\t/**\n\t * The material overwrites this method because `lights` is set to `true` but\n\t * we still want to return the diffuse color as the outgoing light.\n\t *\n\t * @return {Node<vec3>} The outgoing light node.\n\t */\n\tsetupOutgoingLight() {\n\n\t\treturn diffuseColor.rgb;\n\n\t}\n\n\t/**\n\t * Setups the lighting model.\n\t *\n\t * @return {BasicLightingModel} The lighting model.\n\t */\n\tsetupLightingModel() {\n\n\t\treturn new BasicLightingModel();\n\n\t}\n\n}\n\nconst F_Schlick = /*@__PURE__*/ Fn( ( { f0, f90, dotVH } ) => {\n\n\t// Original approximation by Christophe Schlick '94\n\t// float fresnel = pow( 1.0 - dotVH, 5.0 );\n\n\t// Optimized variant (presented by Epic at SIGGRAPH '13)\n\t// https://cdn2.unrealengine.com/Resources/files/2013SiggraphPresentationsNotes-26915738.pdf\n\tconst fresnel = dotVH.mul( -5.55473 ).sub( 6.98316 ).mul( dotVH ).exp2();\n\n\treturn f0.mul( fresnel.oneMinus() ).add( f90.mul( fresnel ) );\n\n} ); // validated\n\nconst BRDF_Lambert = /*@__PURE__*/ Fn( ( inputs ) => {\n\n\treturn inputs.diffuseColor.mul( 1 / Math.PI ); // punctual light\n\n} ); // validated\n\nconst G_BlinnPhong_Implicit = () => float( 0.25 );\n\nconst D_BlinnPhong = /*@__PURE__*/ Fn( ( { dotNH } ) => {\n\n\treturn shininess.mul( float( 0.5 ) ).add( 1.0 ).mul( float( 1 / Math.PI ) ).mul( dotNH.pow( shininess ) );\n\n} );\n\nconst BRDF_BlinnPhong = /*@__PURE__*/ Fn( ( { lightDirection } ) => {\n\n\tconst halfDir = lightDirection.add( positionViewDirection ).normalize();\n\n\tconst dotNH = normalView.dot( halfDir ).clamp();\n\tconst dotVH = positionViewDirection.dot( halfDir ).clamp();\n\n\tconst F = F_Schlick( { f0: specularColor, f90: 1.0, dotVH } );\n\tconst G = G_BlinnPhong_Implicit();\n\tconst D = D_BlinnPhong( { dotNH } );\n\n\treturn F.mul( G ).mul( D );\n\n} );\n\n/**\n * Represents the lighting model for a phong material. Used in {@link MeshPhongNodeMaterial}.\n *\n * @augments BasicLightingModel\n */\nclass PhongLightingModel extends BasicLightingModel {\n\n\t/**\n\t * Constructs a new phong lighting model.\n\t *\n\t * @param {boolean} [specular=true] - Whether specular is supported or not.\n\t */\n\tconstructor( specular = true ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * Whether specular is supported or not. Set this to `false` if you are\n\t\t * looking for a Lambert-like material meaning a material for non-shiny\n\t\t * surfaces, without specular highlights.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.specular = specular;\n\n\t}\n\n\t/**\n\t * Implements the direct lighting. The specular portion is optional an can be controlled\n\t * with the {@link PhongLightingModel#specular} flag.\n\t *\n\t * @param {Object} lightData - The light data.\n\t */\n\tdirect( { lightDirection, lightColor, reflectedLight } ) {\n\n\t\tconst dotNL = normalView.dot( lightDirection ).clamp();\n\t\tconst irradiance = dotNL.mul( lightColor );\n\n\t\treflectedLight.directDiffuse.addAssign( irradiance.mul( BRDF_Lambert( { diffuseColor: diffuseColor.rgb } ) ) );\n\n\t\tif ( this.specular === true ) {\n\n\t\t\treflectedLight.directSpecular.addAssign( irradiance.mul( BRDF_BlinnPhong( { lightDirection } ) ).mul( materialSpecularStrength ) );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Implements the indirect lighting.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tindirect( builder ) {\n\n\t\tconst { ambientOcclusion, irradiance, reflectedLight } = builder.context;\n\n\t\treflectedLight.indirectDiffuse.addAssign( irradiance.mul( BRDF_Lambert( { diffuseColor } ) ) );\n\n\t\treflectedLight.indirectDiffuse.mulAssign( ambientOcclusion );\n\n\t}\n\n}\n\nconst _defaultValues$8 = /*@__PURE__*/ new MeshLambertMaterial();\n\n/**\n * Node material version of {@link MeshLambertMaterial}.\n *\n * @augments NodeMaterial\n */\nclass MeshLambertNodeMaterial extends NodeMaterial {\n\n\tstatic get type() {\n\n\t\treturn 'MeshLambertNodeMaterial';\n\n\t}\n\n\t/**\n\t * Constructs a new mesh lambert node material.\n\t *\n\t * @param {Object} [parameters] - The configuration parameter.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshLambertNodeMaterial = true;\n\n\t\t/**\n\t\t * Set to `true` because lambert materials react on lights.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.lights = true;\n\n\t\tthis.setDefaultValues( _defaultValues$8 );\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\t/**\n\t * Overwritten since this type of material uses {@link BasicEnvironmentNode}\n\t * to implement the default environment mapping.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {?BasicEnvironmentNode<vec3>} The environment node.\n\t */\n\tsetupEnvironment( builder ) {\n\n\t\tconst envNode = super.setupEnvironment( builder );\n\n\t\treturn envNode ? new BasicEnvironmentNode( envNode ) : null;\n\n\t}\n\n\t/**\n\t * Setups the lighting model.\n\t *\n\t * @return {PhongLightingModel} The lighting model.\n\t */\n\tsetupLightingModel( /*builder*/ ) {\n\n\t\treturn new PhongLightingModel( false ); // ( specular ) -> force lambert\n\n\t}\n\n}\n\nconst _defaultValues$7 = /*@__PURE__*/ new MeshPhongMaterial();\n\n/**\n * Node material version of {@link MeshPhongMaterial}.\n *\n * @augments NodeMaterial\n */\nclass MeshPhongNodeMaterial extends NodeMaterial {\n\n\tstatic get type() {\n\n\t\treturn 'MeshPhongNodeMaterial';\n\n\t}\n\n\t/**\n\t * Constructs a new mesh lambert node material.\n\t *\n\t * @param {Object} [parameters] - The configuration parameter.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshPhongNodeMaterial = true;\n\n\t\t/**\n\t\t * Set to `true` because phong materials react on lights.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.lights = true;\n\n\t\t/**\n\t\t * The shininess of phong materials is by default inferred from the `shininess`\n\t\t * property. This node property allows to overwrite the default\n\t\t * and define the shininess with a node instead.\n\t\t *\n\t\t * If you don't want to overwrite the shininess but modify the existing\n\t\t * value instead, use {@link materialShininess}.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.shininessNode = null;\n\n\t\t/**\n\t\t * The specular color of phong materials is by default inferred from the\n\t\t * `specular` property. This node property allows to overwrite the default\n\t\t * and define the specular color with a node instead.\n\t\t *\n\t\t * If you don't want to overwrite the specular color but modify the existing\n\t\t * value instead, use {@link materialSpecular}.\n\t\t *\n\t\t * @type {?Node<vec3>}\n\t\t * @default null\n\t\t */\n\t\tthis.specularNode = null;\n\n\t\tthis.setDefaultValues( _defaultValues$7 );\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\t/**\n\t * Overwritten since this type of material uses {@link BasicEnvironmentNode}\n\t * to implement the default environment mapping.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {?BasicEnvironmentNode<vec3>} The environment node.\n\t */\n\tsetupEnvironment( builder ) {\n\n\t\tconst envNode = super.setupEnvironment( builder );\n\n\t\treturn envNode ? new BasicEnvironmentNode( envNode ) : null;\n\n\t}\n\n\t/**\n\t * Setups the lighting model.\n\t *\n\t * @return {PhongLightingModel} The lighting model.\n\t */\n\tsetupLightingModel( /*builder*/ ) {\n\n\t\treturn new PhongLightingModel();\n\n\t}\n\n\t/**\n\t * Setups the phong specific node variables.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tsetupVariants( /*builder*/ ) {\n\n\t\t// SHININESS\n\n\t\tconst shininessNode = ( this.shininessNode ? float( this.shininessNode ) : materialShininess ).max( 1e-4 ); // to prevent pow( 0.0, 0.0 )\n\n\t\tshininess.assign( shininessNode );\n\n\t\t// SPECULAR COLOR\n\n\t\tconst specularNode = this.specularNode || materialSpecular;\n\n\t\tspecularColor.assign( specularNode );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.shininessNode = source.shininessNode;\n\t\tthis.specularNode = source.specularNode;\n\n\t\treturn super.copy( source );\n\n\t}\n\n}\n\nconst getGeometryRoughness = /*@__PURE__*/ Fn( ( builder ) => {\n\n\tif ( builder.geometry.hasAttribute( 'normal' ) === false ) {\n\n\t\treturn float( 0 );\n\n\t}\n\n\tconst dxy = normalViewGeometry.dFdx().abs().max( normalViewGeometry.dFdy().abs() );\n\tconst geometryRoughness = dxy.x.max( dxy.y ).max( dxy.z );\n\n\treturn geometryRoughness;\n\n} );\n\nconst getRoughness = /*@__PURE__*/ Fn( ( inputs ) => {\n\n\tconst { roughness } = inputs;\n\n\tconst geometryRoughness = getGeometryRoughness();\n\n\tlet roughnessFactor = roughness.max( 0.0525 ); // 0.0525 corresponds to the base mip of a 256 cubemap.\n\troughnessFactor = roughnessFactor.add( geometryRoughness );\n\troughnessFactor = roughnessFactor.min( 1.0 );\n\n\treturn roughnessFactor;\n\n} );\n\n// Moving Frostbite to Physically Based Rendering 3.0 - page 12, listing 2\n// https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\nconst V_GGX_SmithCorrelated = /*@__PURE__*/ Fn( ( { alpha, dotNL, dotNV } ) => {\n\n\tconst a2 = alpha.pow2();\n\n\tconst gv = dotNL.mul( a2.add( a2.oneMinus().mul( dotNV.pow2() ) ).sqrt() );\n\tconst gl = dotNV.mul( a2.add( a2.oneMinus().mul( dotNL.pow2() ) ).sqrt() );\n\n\treturn div( 0.5, gv.add( gl ).max( EPSILON ) );\n\n} ).setLayout( {\n\tname: 'V_GGX_SmithCorrelated',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'alpha', type: 'float' },\n\t\t{ name: 'dotNL', type: 'float' },\n\t\t{ name: 'dotNV', type: 'float' }\n\t]\n} ); // validated\n\n// https://google.github.io/filament/Filament.md.html#materialsystem/anisotropicmodel/anisotropicspecularbrdf\n\nconst V_GGX_SmithCorrelated_Anisotropic = /*@__PURE__*/ Fn( ( { alphaT, alphaB, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL } ) => {\n\n\tconst gv = dotNL.mul( vec3( alphaT.mul( dotTV ), alphaB.mul( dotBV ), dotNV ).length() );\n\tconst gl = dotNV.mul( vec3( alphaT.mul( dotTL ), alphaB.mul( dotBL ), dotNL ).length() );\n\tconst v = div( 0.5, gv.add( gl ) );\n\n\treturn v;\n\n} ).setLayout( {\n\tname: 'V_GGX_SmithCorrelated_Anisotropic',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'alphaT', type: 'float', qualifier: 'in' },\n\t\t{ name: 'alphaB', type: 'float', qualifier: 'in' },\n\t\t{ name: 'dotTV', type: 'float', qualifier: 'in' },\n\t\t{ name: 'dotBV', type: 'float', qualifier: 'in' },\n\t\t{ name: 'dotTL', type: 'float', qualifier: 'in' },\n\t\t{ name: 'dotBL', type: 'float', qualifier: 'in' },\n\t\t{ name: 'dotNV', type: 'float', qualifier: 'in' },\n\t\t{ name: 'dotNL', type: 'float', qualifier: 'in' }\n\t]\n} );\n\n// Microfacet Models for Refraction through Rough Surfaces - equation (33)\n// http://graphicrants.blogspot.com/2013/08/specular-brdf-reference.html\n// alpha is \"roughness squared\" in Disney\u2019s reparameterization\nconst D_GGX = /*@__PURE__*/ Fn( ( { alpha, dotNH } ) => {\n\n\tconst a2 = alpha.pow2();\n\n\tconst denom = dotNH.pow2().mul( a2.oneMinus() ).oneMinus(); // avoid alpha = 0 with dotNH = 1\n\n\treturn a2.div( denom.pow2() ).mul( 1 / Math.PI );\n\n} ).setLayout( {\n\tname: 'D_GGX',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'alpha', type: 'float' },\n\t\t{ name: 'dotNH', type: 'float' }\n\t]\n} ); // validated\n\nconst RECIPROCAL_PI = /*@__PURE__*/ float( 1 / Math.PI );\n\n// https://google.github.io/filament/Filament.md.html#materialsystem/anisotropicmodel/anisotropicspecularbrdf\n\nconst D_GGX_Anisotropic = /*@__PURE__*/ Fn( ( { alphaT, alphaB, dotNH, dotTH, dotBH } ) => {\n\n\tconst a2 = alphaT.mul( alphaB );\n\tconst v = vec3( alphaB.mul( dotTH ), alphaT.mul( dotBH ), a2.mul( dotNH ) );\n\tconst v2 = v.dot( v );\n\tconst w2 = a2.div( v2 );\n\n\treturn RECIPROCAL_PI.mul( a2.mul( w2.pow2() ) );\n\n} ).setLayout( {\n\tname: 'D_GGX_Anisotropic',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'alphaT', type: 'float', qualifier: 'in' },\n\t\t{ name: 'alphaB', type: 'float', qualifier: 'in' },\n\t\t{ name: 'dotNH', type: 'float', qualifier: 'in' },\n\t\t{ name: 'dotTH', type: 'float', qualifier: 'in' },\n\t\t{ name: 'dotBH', type: 'float', qualifier: 'in' }\n\t]\n} );\n\n// GGX Distribution, Schlick Fresnel, GGX_SmithCorrelated Visibility\nconst BRDF_GGX = /*@__PURE__*/ Fn( ( { lightDirection, f0, f90, roughness, f, normalView: normalView$1 = normalView, USE_IRIDESCENCE, USE_ANISOTROPY } ) => {\n\n\tconst alpha = roughness.pow2(); // UE4's roughness\n\n\tconst halfDir = lightDirection.add( positionViewDirection ).normalize();\n\n\tconst dotNL = normalView$1.dot( lightDirection ).clamp();\n\tconst dotNV = normalView$1.dot( positionViewDirection ).clamp(); // @ TODO: Move to core dotNV\n\tconst dotNH = normalView$1.dot( halfDir ).clamp();\n\tconst dotVH = positionViewDirection.dot( halfDir ).clamp();\n\n\tlet F = F_Schlick( { f0, f90, dotVH } );\n\tlet V, D;\n\n\tif ( defined( USE_IRIDESCENCE ) ) {\n\n\t\tF = iridescence.mix( F, f );\n\n\t}\n\n\tif ( defined( USE_ANISOTROPY ) ) {\n\n\t\tconst dotTL = anisotropyT.dot( lightDirection );\n\t\tconst dotTV = anisotropyT.dot( positionViewDirection );\n\t\tconst dotTH = anisotropyT.dot( halfDir );\n\t\tconst dotBL = anisotropyB.dot( lightDirection );\n\t\tconst dotBV = anisotropyB.dot( positionViewDirection );\n\t\tconst dotBH = anisotropyB.dot( halfDir );\n\n\t\tV = V_GGX_SmithCorrelated_Anisotropic( { alphaT, alphaB: alpha, dotTV, dotBV, dotTL, dotBL, dotNV, dotNL } );\n\t\tD = D_GGX_Anisotropic( { alphaT, alphaB: alpha, dotNH, dotTH, dotBH } );\n\n\t} else {\n\n\t\tV = V_GGX_SmithCorrelated( { alpha, dotNL, dotNV } );\n\t\tD = D_GGX( { alpha, dotNH } );\n\n\t}\n\n\treturn F.mul( V ).mul( D );\n\n} ); // validated\n\n/**\n * Precomputed DFG LUT for Image-Based Lighting\n * Resolution: 16x16\n * Samples: 4096 per texel\n * Format: RG16F (2 half floats per texel: scale, bias)\n */\n\nconst DATA = new Uint16Array( [\n\t0x30b5, 0x3ad1, 0x314c, 0x3a4d, 0x33d2, 0x391c, 0x35ef, 0x3828, 0x37f3, 0x36a6, 0x38d1, 0x3539, 0x3979, 0x3410, 0x39f8, 0x3252, 0x3a53, 0x30f0, 0x3a94, 0x2fc9, 0x3abf, 0x2e35, 0x3ada, 0x2d05, 0x3ae8, 0x2c1f, 0x3aed, 0x2ae0, 0x3aea, 0x29d1, 0x3ae1, 0x28ff,\n\t0x3638, 0x38e4, 0x364a, 0x38ce, 0x3699, 0x385e, 0x374e, 0x372c, 0x3839, 0x35a4, 0x38dc, 0x3462, 0x396e, 0x32c4, 0x39de, 0x3134, 0x3a2b, 0x3003, 0x3a59, 0x2e3a, 0x3a6d, 0x2ce1, 0x3a6e, 0x2bba, 0x3a5f, 0x2a33, 0x3a49, 0x290a, 0x3a2d, 0x2826, 0x3a0a, 0x26e8,\n\t0x3894, 0x36d7, 0x3897, 0x36c9, 0x38a3, 0x3675, 0x38bc, 0x35ac, 0x38ee, 0x349c, 0x393e, 0x3332, 0x3997, 0x3186, 0x39e2, 0x3038, 0x3a13, 0x2e75, 0x3a29, 0x2cf5, 0x3a2d, 0x2bac, 0x3a21, 0x29ff, 0x3a04, 0x28bc, 0x39dc, 0x2790, 0x39ad, 0x261a, 0x3978, 0x24fa,\n\t0x39ac, 0x34a8, 0x39ac, 0x34a3, 0x39ae, 0x3480, 0x39ae, 0x3423, 0x39b1, 0x330e, 0x39c2, 0x31a9, 0x39e0, 0x3063, 0x39fc, 0x2eb5, 0x3a0c, 0x2d1d, 0x3a14, 0x2bcf, 0x3a07, 0x29ff, 0x39e9, 0x28a3, 0x39be, 0x273c, 0x3989, 0x25b3, 0x394a, 0x2488, 0x3907, 0x2345,\n\t0x3a77, 0x3223, 0x3a76, 0x321f, 0x3a73, 0x3204, 0x3a6a, 0x31b3, 0x3a58, 0x3114, 0x3a45, 0x303b, 0x3a34, 0x2eb6, 0x3a26, 0x2d31, 0x3a1e, 0x2bef, 0x3a0b, 0x2a0d, 0x39ec, 0x28a1, 0x39c0, 0x271b, 0x3987, 0x2580, 0x3944, 0x2449, 0x38fa, 0x22bd, 0x38ac, 0x2155,\n\t0x3b07, 0x2fca, 0x3b06, 0x2fca, 0x3b00, 0x2fb8, 0x3af4, 0x2f7c, 0x3adb, 0x2eea, 0x3ab4, 0x2e00, 0x3a85, 0x2cec, 0x3a5e, 0x2bc5, 0x3a36, 0x2a00, 0x3a0d, 0x2899, 0x39dc, 0x2707, 0x39a0, 0x2562, 0x395a, 0x2424, 0x390b, 0x2268, 0x38b7, 0x20fd, 0x385f, 0x1fd1,\n\t0x3b69, 0x2cb9, 0x3b68, 0x2cbb, 0x3b62, 0x2cbb, 0x3b56, 0x2cae, 0x3b3b, 0x2c78, 0x3b0d, 0x2c0a, 0x3acf, 0x2ae3, 0x3a92, 0x2998, 0x3a54, 0x2867, 0x3a17, 0x26d0, 0x39d3, 0x253c, 0x3989, 0x2402, 0x3935, 0x2226, 0x38dc, 0x20bd, 0x387d, 0x1f54, 0x381d, 0x1db3,\n\t0x3ba9, 0x296b, 0x3ba8, 0x296f, 0x3ba3, 0x297b, 0x3b98, 0x2987, 0x3b7f, 0x2976, 0x3b4e, 0x2927, 0x3b0e, 0x2895, 0x3ac2, 0x27b7, 0x3a73, 0x263b, 0x3a23, 0x24e7, 0x39d0, 0x239b, 0x3976, 0x21d9, 0x3917, 0x207e, 0x38b2, 0x1ee7, 0x384b, 0x1d53, 0x37c7, 0x1c1e,\n\t0x3bd2, 0x25cb, 0x3bd1, 0x25d3, 0x3bcd, 0x25f0, 0x3bc2, 0x261f, 0x3bad, 0x2645, 0x3b7d, 0x262d, 0x3b3e, 0x25c4, 0x3aec, 0x250f, 0x3a93, 0x243a, 0x3a32, 0x22ce, 0x39d0, 0x215b, 0x3969, 0x202a, 0x38fe, 0x1e6e, 0x388f, 0x1cf1, 0x381f, 0x1b9b, 0x3762, 0x19dd,\n\t0x3be9, 0x21ab, 0x3be9, 0x21b7, 0x3be5, 0x21e5, 0x3bdd, 0x2241, 0x3bc9, 0x22a7, 0x3ba0, 0x22ec, 0x3b62, 0x22cd, 0x3b0f, 0x2247, 0x3aae, 0x2175, 0x3a44, 0x2088, 0x39d4, 0x1f49, 0x3960, 0x1dbe, 0x38e9, 0x1c77, 0x3870, 0x1ae8, 0x37f1, 0x1953, 0x3708, 0x181b,\n\t0x3bf6, 0x1cea, 0x3bf6, 0x1cfb, 0x3bf3, 0x1d38, 0x3bec, 0x1dbd, 0x3bda, 0x1e7c, 0x3bb7, 0x1f25, 0x3b7d, 0x1f79, 0x3b2c, 0x1f4c, 0x3ac6, 0x1ea6, 0x3a55, 0x1dbb, 0x39da, 0x1cbd, 0x395a, 0x1b9d, 0x38d8, 0x1a00, 0x3855, 0x18ac, 0x37ab, 0x173c, 0x36b7, 0x1598,\n\t0x3bfc, 0x1736, 0x3bfc, 0x1759, 0x3bf9, 0x17e7, 0x3bf4, 0x1896, 0x3be4, 0x1997, 0x3bc6, 0x1aa8, 0x3b91, 0x1b84, 0x3b43, 0x1bd2, 0x3ade, 0x1b8a, 0x3a65, 0x1acd, 0x39e2, 0x19d3, 0x3957, 0x18cd, 0x38ca, 0x17b3, 0x383e, 0x1613, 0x376d, 0x14bf, 0x366f, 0x135e,\n\t0x3bff, 0x101b, 0x3bff, 0x1039, 0x3bfc, 0x10c8, 0x3bf9, 0x1226, 0x3bea, 0x1428, 0x3bcf, 0x1584, 0x3b9f, 0x16c5, 0x3b54, 0x179a, 0x3af0, 0x17ce, 0x3a76, 0x1771, 0x39ea, 0x16a4, 0x3956, 0x15a7, 0x38bf, 0x14a7, 0x3829, 0x1379, 0x3735, 0x11ea, 0x362d, 0x10a1,\n\t0x3c00, 0x061b, 0x3c00, 0x066a, 0x3bfe, 0x081c, 0x3bfa, 0x0a4c, 0x3bed, 0x0d16, 0x3bd5, 0x0fb3, 0x3ba9, 0x114d, 0x3b63, 0x127c, 0x3b01, 0x132f, 0x3a85, 0x1344, 0x39f4, 0x12d2, 0x3957, 0x120d, 0x38b5, 0x1122, 0x3817, 0x103c, 0x3703, 0x0ed3, 0x35f0, 0x0d6d,\n\t0x3c00, 0x007a, 0x3c00, 0x0089, 0x3bfe, 0x011d, 0x3bfb, 0x027c, 0x3bf0, 0x04fa, 0x3bda, 0x0881, 0x3bb1, 0x0acd, 0x3b6f, 0x0c97, 0x3b10, 0x0d7b, 0x3a93, 0x0df1, 0x39fe, 0x0def, 0x3959, 0x0d8a, 0x38af, 0x0ce9, 0x3808, 0x0c31, 0x36d5, 0x0af0, 0x35b9, 0x09a3,\n\t0x3c00, 0x0000, 0x3c00, 0x0001, 0x3bff, 0x0015, 0x3bfb, 0x0059, 0x3bf2, 0x00fd, 0x3bdd, 0x01df, 0x3bb7, 0x031c, 0x3b79, 0x047c, 0x3b1d, 0x05d4, 0x3aa0, 0x06d5, 0x3a08, 0x075a, 0x395d, 0x075e, 0x38aa, 0x06f7, 0x37f4, 0x0648, 0x36ac, 0x0576, 0x3586, 0x049f\n] );\n\nlet lut = null;\n\nconst DFGLUT = /*@__PURE__*/ Fn( ( { roughness, dotNV } ) => {\n\n\tif ( lut === null ) {\n\n\t\tlut = new DataTexture( DATA, 16, 16, RGFormat, HalfFloatType );\n\t\tlut.name = 'DFG_LUT';\n\t\tlut.minFilter = LinearFilter;\n\t\tlut.magFilter = LinearFilter;\n\t\tlut.wrapS = ClampToEdgeWrapping;\n\t\tlut.wrapT = ClampToEdgeWrapping;\n\t\tlut.generateMipmaps = false;\n\t\tlut.needsUpdate = true;\n\n\t}\n\n\tconst uv = vec2( roughness, dotNV );\n\n\treturn texture( lut, uv ).rg;\n\n} );\n\n// GGX BRDF with multi-scattering energy compensation for direct lighting\n// This provides more accurate energy conservation, especially for rough materials\n// Based on \"Practical Multiple Scattering Compensation for Microfacet Models\"\n// https://blog.selfshadow.com/publications/turquin/ms_comp_final.pdf\nconst BRDF_GGX_Multiscatter = /*@__PURE__*/ Fn( ( { lightDirection, f0, f90, roughness: _roughness, f, USE_IRIDESCENCE, USE_ANISOTROPY } ) => {\n\n\t// Single-scattering BRDF (standard GGX)\n\tconst singleScatter = BRDF_GGX( { lightDirection, f0, f90, roughness: _roughness, f, USE_IRIDESCENCE, USE_ANISOTROPY } );\n\n\t// Multi-scattering compensation\n\tconst dotNL = normalView.dot( lightDirection ).clamp();\n\tconst dotNV = normalView.dot( positionViewDirection ).clamp();\n\n\t// Precomputed DFG values for view and light directions\n\tconst dfgV = DFGLUT( { roughness: _roughness, dotNV } );\n\tconst dfgL = DFGLUT( { roughness: _roughness, dotNV: dotNL } );\n\n\t// Single-scattering energy for view and light\n\tconst FssEss_V = f0.mul( dfgV.x ).add( f90.mul( dfgV.y ) );\n\tconst FssEss_L = f0.mul( dfgL.x ).add( f90.mul( dfgL.y ) );\n\n\tconst Ess_V = dfgV.x.add( dfgV.y );\n\tconst Ess_L = dfgL.x.add( dfgL.y );\n\n\t// Energy lost to multiple scattering\n\tconst Ems_V = float( 1.0 ).sub( Ess_V );\n\tconst Ems_L = float( 1.0 ).sub( Ess_L );\n\n\t// Average Fresnel reflectance\n\tconst Favg = f0.add( f0.oneMinus().mul( 0.047619 ) ); // 1/21\n\n\t// Multiple scattering contribution\n\t// Uses geometric mean of view and light contributions for better energy distribution\n\tconst Fms = FssEss_V.mul( FssEss_L ).mul( Favg ).div( float( 1.0 ).sub( Ems_V.mul( Ems_L ).mul( Favg ).mul( Favg ) ).add( EPSILON ) );\n\n\t// Energy compensation factor\n\tconst compensationFactor = Ems_V.mul( Ems_L );\n\n\tconst multiScatter = Fms.mul( compensationFactor );\n\n\treturn singleScatter.add( multiScatter );\n\n} );\n\nconst EnvironmentBRDF = /*@__PURE__*/ Fn( ( inputs ) => {\n\n\tconst { dotNV, specularColor, specularF90, roughness } = inputs;\n\n\tconst fab = DFGLUT( { dotNV, roughness } );\n\treturn specularColor.mul( fab.x ).add( specularF90.mul( fab.y ) );\n\n} );\n\nconst Schlick_to_F0 = /*@__PURE__*/ Fn( ( { f, f90, dotVH } ) => {\n\n\tconst x = dotVH.oneMinus().saturate();\n\tconst x2 = x.mul( x );\n\tconst x5 = x.mul( x2, x2 ).clamp( 0, .9999 );\n\n\treturn f.sub( vec3( f90 ).mul( x5 ) ).div( x5.oneMinus() );\n\n} ).setLayout( {\n\tname: 'Schlick_to_F0',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'f', type: 'vec3' },\n\t\t{ name: 'f90', type: 'float' },\n\t\t{ name: 'dotVH', type: 'float' }\n\t]\n} );\n\n// https://github.com/google/filament/blob/master/shaders/src/brdf.fs\nconst D_Charlie = /*@__PURE__*/ Fn( ( { roughness, dotNH } ) => {\n\n\tconst alpha = roughness.pow2();\n\n\t// Estevez and Kulla 2017, \"Production Friendly Microfacet Sheen BRDF\"\n\tconst invAlpha = float( 1.0 ).div( alpha );\n\tconst cos2h = dotNH.pow2();\n\tconst sin2h = cos2h.oneMinus().max( 0.0078125 ); // 2^(-14/2), so sin2h^2 > 0 in fp16\n\n\treturn float( 2.0 ).add( invAlpha ).mul( sin2h.pow( invAlpha.mul( 0.5 ) ) ).div( 2.0 * Math.PI );\n\n} ).setLayout( {\n\tname: 'D_Charlie',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'roughness', type: 'float' },\n\t\t{ name: 'dotNH', type: 'float' }\n\t]\n} );\n\n// https://github.com/google/filament/blob/master/shaders/src/brdf.fs\nconst V_Neubelt = /*@__PURE__*/ Fn( ( { dotNV, dotNL } ) => {\n\n\t// Neubelt and Pettineo 2013, \"Crafting a Next-gen Material Pipeline for The Order: 1886\"\n\treturn float( 1.0 ).div( float( 4.0 ).mul( dotNL.add( dotNV ).sub( dotNL.mul( dotNV ) ) ) );\n\n} ).setLayout( {\n\tname: 'V_Neubelt',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'dotNV', type: 'float' },\n\t\t{ name: 'dotNL', type: 'float' }\n\t]\n} );\n\nconst BRDF_Sheen = /*@__PURE__*/ Fn( ( { lightDirection } ) => {\n\n\tconst halfDir = lightDirection.add( positionViewDirection ).normalize();\n\n\tconst dotNL = normalView.dot( lightDirection ).clamp();\n\tconst dotNV = normalView.dot( positionViewDirection ).clamp();\n\tconst dotNH = normalView.dot( halfDir ).clamp();\n\n\tconst D = D_Charlie( { roughness: sheenRoughness, dotNH } );\n\tconst V = V_Neubelt( { dotNV, dotNL } );\n\n\treturn sheen.mul( D ).mul( V );\n\n} );\n\n// Rect Area Light\n\n// Real-Time Polygonal-Light Shading with Linearly Transformed Cosines\n// by Eric Heitz, Jonathan Dupuy, Stephen Hill and David Neubelt\n// code: https://github.com/selfshadow/ltc_code/\n\nconst LTC_Uv = /*@__PURE__*/ Fn( ( { N, V, roughness } ) => {\n\n\tconst LUT_SIZE = 64.0;\n\tconst LUT_SCALE = ( LUT_SIZE - 1.0 ) / LUT_SIZE;\n\tconst LUT_BIAS = 0.5 / LUT_SIZE;\n\n\tconst dotNV = N.dot( V ).saturate();\n\n\t// texture parameterized by sqrt( GGX alpha ) and sqrt( 1 - cos( theta ) )\n\tconst uv = vec2( roughness, dotNV.oneMinus().sqrt() );\n\n\tuv.assign( uv.mul( LUT_SCALE ).add( LUT_BIAS ) );\n\n\treturn uv;\n\n} ).setLayout( {\n\tname: 'LTC_Uv',\n\ttype: 'vec2',\n\tinputs: [\n\t\t{ name: 'N', type: 'vec3' },\n\t\t{ name: 'V', type: 'vec3' },\n\t\t{ name: 'roughness', type: 'float' }\n\t]\n} );\n\nconst LTC_ClippedSphereFormFactor = /*@__PURE__*/ Fn( ( { f } ) => {\n\n\t// Real-Time Area Lighting: a Journey from Research to Production (p.102)\n\t// An approximation of the form factor of a horizon-clipped rectangle.\n\n\tconst l = f.length();\n\n\treturn max$1( l.mul( l ).add( f.z ).div( l.add( 1.0 ) ), 0 );\n\n} ).setLayout( {\n\tname: 'LTC_ClippedSphereFormFactor',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'f', type: 'vec3' }\n\t]\n} );\n\nconst LTC_EdgeVectorFormFactor = /*@__PURE__*/ Fn( ( { v1, v2 } ) => {\n\n\tconst x = v1.dot( v2 );\n\tconst y = x.abs().toVar();\n\n\t// rational polynomial approximation to theta / sin( theta ) / 2PI\n\tconst a = y.mul( 0.0145206 ).add( 0.4965155 ).mul( y ).add( 0.8543985 ).toVar();\n\tconst b = y.add( 4.1616724 ).mul( y ).add( 3.4175940 ).toVar();\n\tconst v = a.div( b );\n\n\tconst theta_sintheta = x.greaterThan( 0.0 ).select( v, max$1( x.mul( x ).oneMinus(), 1e-7 ).inverseSqrt().mul( 0.5 ).sub( v ) );\n\n\treturn v1.cross( v2 ).mul( theta_sintheta );\n\n} ).setLayout( {\n\tname: 'LTC_EdgeVectorFormFactor',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'v1', type: 'vec3' },\n\t\t{ name: 'v2', type: 'vec3' }\n\t]\n} );\n\nconst LTC_Evaluate = /*@__PURE__*/ Fn( ( { N, V, P, mInv, p0, p1, p2, p3 } ) => {\n\n\t// bail if point is on back side of plane of light\n\t// assumes ccw winding order of light vertices\n\tconst v1 = p1.sub( p0 ).toVar();\n\tconst v2 = p3.sub( p0 ).toVar();\n\n\tconst lightNormal = v1.cross( v2 );\n\tconst result = vec3().toVar();\n\n\tIf( lightNormal.dot( P.sub( p0 ) ).greaterThanEqual( 0.0 ), () => {\n\n\t\t// construct orthonormal basis around N\n\t\tconst T1 = V.sub( N.mul( V.dot( N ) ) ).normalize();\n\t\tconst T2 = N.cross( T1 ).negate(); // negated from paper; possibly due to a different handedness of world coordinate system\n\n\t\t// compute transform\n\t\tconst mat = mInv.mul( mat3( T1, T2, N ).transpose() ).toVar();\n\n\t\t// transform rect\n\t\t// & project rect onto sphere\n\t\tconst coords0 = mat.mul( p0.sub( P ) ).normalize().toVar();\n\t\tconst coords1 = mat.mul( p1.sub( P ) ).normalize().toVar();\n\t\tconst coords2 = mat.mul( p2.sub( P ) ).normalize().toVar();\n\t\tconst coords3 = mat.mul( p3.sub( P ) ).normalize().toVar();\n\n\t\t// calculate vector form factor\n\t\tconst vectorFormFactor = vec3( 0 ).toVar();\n\t\tvectorFormFactor.addAssign( LTC_EdgeVectorFormFactor( { v1: coords0, v2: coords1 } ) );\n\t\tvectorFormFactor.addAssign( LTC_EdgeVectorFormFactor( { v1: coords1, v2: coords2 } ) );\n\t\tvectorFormFactor.addAssign( LTC_EdgeVectorFormFactor( { v1: coords2, v2: coords3 } ) );\n\t\tvectorFormFactor.addAssign( LTC_EdgeVectorFormFactor( { v1: coords3, v2: coords0 } ) );\n\n\t\t// adjust for horizon clipping\n\t\tresult.assign( vec3( LTC_ClippedSphereFormFactor( { f: vectorFormFactor } ) ) );\n\n\t} );\n\n\treturn result;\n\n} ).setLayout( {\n\tname: 'LTC_Evaluate',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'N', type: 'vec3' },\n\t\t{ name: 'V', type: 'vec3' },\n\t\t{ name: 'P', type: 'vec3' },\n\t\t{ name: 'mInv', type: 'mat3' },\n\t\t{ name: 'p0', type: 'vec3' },\n\t\t{ name: 'p1', type: 'vec3' },\n\t\t{ name: 'p2', type: 'vec3' },\n\t\t{ name: 'p3', type: 'vec3' }\n\t]\n} );\n\nconst LTC_Evaluate_Volume = /*@__PURE__*/ Fn( ( { P, p0, p1, p2, p3 } ) => {\n\n\t// bail if point is on back side of plane of light\n\t// assumes ccw winding order of light vertices\n\tconst v1 = p1.sub( p0 ).toVar();\n\tconst v2 = p3.sub( p0 ).toVar();\n\n\tconst lightNormal = v1.cross( v2 );\n\tconst result = vec3().toVar();\n\n\tIf( lightNormal.dot( P.sub( p0 ) ).greaterThanEqual( 0.0 ), () => {\n\n\t\t// transform rect\n\t\t// & project rect onto sphere\n\t\tconst coords0 = p0.sub( P ).normalize().toVar();\n\t\tconst coords1 = p1.sub( P ).normalize().toVar();\n\t\tconst coords2 = p2.sub( P ).normalize().toVar();\n\t\tconst coords3 = p3.sub( P ).normalize().toVar();\n\n\t\t// calculate vector form factor\n\t\tconst vectorFormFactor = vec3( 0 ).toVar();\n\t\tvectorFormFactor.addAssign( LTC_EdgeVectorFormFactor( { v1: coords0, v2: coords1 } ) );\n\t\tvectorFormFactor.addAssign( LTC_EdgeVectorFormFactor( { v1: coords1, v2: coords2 } ) );\n\t\tvectorFormFactor.addAssign( LTC_EdgeVectorFormFactor( { v1: coords2, v2: coords3 } ) );\n\t\tvectorFormFactor.addAssign( LTC_EdgeVectorFormFactor( { v1: coords3, v2: coords0 } ) );\n\n\t\t// adjust for horizon clipping\n\t\tresult.assign( vec3( LTC_ClippedSphereFormFactor( { f: vectorFormFactor.abs() } ) ) );\n\n\t} );\n\n\treturn result;\n\n} ).setLayout( {\n\tname: 'LTC_Evaluate',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'P', type: 'vec3' },\n\t\t{ name: 'p0', type: 'vec3' },\n\t\t{ name: 'p1', type: 'vec3' },\n\t\t{ name: 'p2', type: 'vec3' },\n\t\t{ name: 'p3', type: 'vec3' }\n\t]\n} );\n\n// Mipped Bicubic Texture Filtering by N8\n// https://www.shadertoy.com/view/Dl2SDW\n\nconst bC = 1.0 / 6.0;\n\nconst w0 = ( a ) => mul( bC, mul( a, mul( a, a.negate().add( 3.0 ) ).sub( 3.0 ) ).add( 1.0 ) );\n\nconst w1 = ( a ) => mul( bC, mul( a, mul( a, mul( 3.0, a ).sub( 6.0 ) ) ).add( 4.0 ) );\n\nconst w2 = ( a ) => mul( bC, mul( a, mul( a, mul( -3, a ).add( 3.0 ) ).add( 3.0 ) ).add( 1.0 ) );\n\nconst w3 = ( a ) => mul( bC, pow( a, 3 ) );\n\nconst g0 = ( a ) => w0( a ).add( w1( a ) );\n\nconst g1 = ( a ) => w2( a ).add( w3( a ) );\n\n// h0 and h1 are the two offset functions\nconst h0 = ( a ) => add( -1, w1( a ).div( w0( a ).add( w1( a ) ) ) );\n\nconst h1 = ( a ) => add( 1.0, w3( a ).div( w2( a ).add( w3( a ) ) ) );\n\nconst bicubic = ( textureNode, texelSize, lod ) => {\n\n\tconst uv = textureNode.uvNode;\n\tconst uvScaled = mul( uv, texelSize.zw ).add( 0.5 );\n\n\tconst iuv = floor( uvScaled );\n\tconst fuv = fract( uvScaled );\n\n\tconst g0x = g0( fuv.x );\n\tconst g1x = g1( fuv.x );\n\tconst h0x = h0( fuv.x );\n\tconst h1x = h1( fuv.x );\n\tconst h0y = h0( fuv.y );\n\tconst h1y = h1( fuv.y );\n\n\tconst p0 = vec2( iuv.x.add( h0x ), iuv.y.add( h0y ) ).sub( 0.5 ).mul( texelSize.xy );\n\tconst p1 = vec2( iuv.x.add( h1x ), iuv.y.add( h0y ) ).sub( 0.5 ).mul( texelSize.xy );\n\tconst p2 = vec2( iuv.x.add( h0x ), iuv.y.add( h1y ) ).sub( 0.5 ).mul( texelSize.xy );\n\tconst p3 = vec2( iuv.x.add( h1x ), iuv.y.add( h1y ) ).sub( 0.5 ).mul( texelSize.xy );\n\n\tconst a = g0( fuv.y ).mul( add( g0x.mul( textureNode.sample( p0 ).level( lod ) ), g1x.mul( textureNode.sample( p1 ).level( lod ) ) ) );\n\tconst b = g1( fuv.y ).mul( add( g0x.mul( textureNode.sample( p2 ).level( lod ) ), g1x.mul( textureNode.sample( p3 ).level( lod ) ) ) );\n\n\treturn a.add( b );\n\n};\n\n/**\n * Applies mipped bicubic texture filtering to the given texture node.\n *\n * @tsl\n * @function\n * @param {TextureNode} textureNode - The texture node that should be filtered.\n * @param {Node<float>} lodNode - Defines the LOD to sample from.\n * @return {Node} The filtered texture sample.\n */\nconst textureBicubicLevel = /*@__PURE__*/ Fn( ( [ textureNode, lodNode ] ) => {\n\n\tconst fLodSize = vec2( textureNode.size( int( lodNode ) ) );\n\tconst cLodSize = vec2( textureNode.size( int( lodNode.add( 1.0 ) ) ) );\n\tconst fLodSizeInv = div( 1.0, fLodSize );\n\tconst cLodSizeInv = div( 1.0, cLodSize );\n\tconst fSample = bicubic( textureNode, vec4( fLodSizeInv, fLodSize ), floor( lodNode ) );\n\tconst cSample = bicubic( textureNode, vec4( cLodSizeInv, cLodSize ), ceil( lodNode ) );\n\n\treturn fract( lodNode ).mix( fSample, cSample );\n\n} );\n\n/**\n * Applies mipped bicubic texture filtering to the given texture node.\n *\n * @tsl\n * @function\n * @param {TextureNode} textureNode - The texture node that should be filtered.\n * @param {Node<float>} [strength] - Defines the strength of the bicubic filtering.\n * @return {Node} The filtered texture sample.\n */\nconst textureBicubic = /*@__PURE__*/ Fn( ( [ textureNode, strength ] ) => {\n\n\tconst lod = strength.mul( maxMipLevel( textureNode ) );\n\n\treturn textureBicubicLevel( textureNode, lod );\n\n} );\n\n//\n// Transmission\n//\n\nconst getVolumeTransmissionRay = /*@__PURE__*/ Fn( ( [ n, v, thickness, ior, modelMatrix ] ) => {\n\n\t// Direction of refracted light.\n\tconst refractionVector = vec3( refract( v.negate(), normalize( n ), div( 1.0, ior ) ) );\n\n\t// Compute rotation-independent scaling of the model matrix.\n\tconst modelScale = vec3(\n\t\tlength( modelMatrix[ 0 ].xyz ),\n\t\tlength( modelMatrix[ 1 ].xyz ),\n\t\tlength( modelMatrix[ 2 ].xyz )\n\t);\n\n\t// The thickness is specified in local space.\n\treturn normalize( refractionVector ).mul( thickness.mul( modelScale ) );\n\n} ).setLayout( {\n\tname: 'getVolumeTransmissionRay',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'n', type: 'vec3' },\n\t\t{ name: 'v', type: 'vec3' },\n\t\t{ name: 'thickness', type: 'float' },\n\t\t{ name: 'ior', type: 'float' },\n\t\t{ name: 'modelMatrix', type: 'mat4' }\n\t]\n} );\n\nconst applyIorToRoughness = /*@__PURE__*/ Fn( ( [ roughness, ior ] ) => {\n\n\t// Scale roughness with IOR so that an IOR of 1.0 results in no microfacet refraction and\n\t// an IOR of 1.5 results in the default amount of microfacet refraction.\n\treturn roughness.mul( clamp( ior.mul( 2.0 ).sub( 2.0 ), 0.0, 1.0 ) );\n\n} ).setLayout( {\n\tname: 'applyIorToRoughness',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'roughness', type: 'float' },\n\t\t{ name: 'ior', type: 'float' }\n\t]\n} );\n\nconst viewportBackSideTexture = /*@__PURE__*/ viewportMipTexture();\nconst viewportFrontSideTexture = /*@__PURE__*/ viewportMipTexture();\n\nconst getTransmissionSample = /*@__PURE__*/ Fn( ( [ fragCoord, roughness, ior ], { material } ) => {\n\n\tconst vTexture = material.side === BackSide ? viewportBackSideTexture : viewportFrontSideTexture;\n\n\tconst transmissionSample = vTexture.sample( fragCoord );\n\t//const transmissionSample = viewportMipTexture( fragCoord );\n\n\tconst lod = log2( screenSize.x ).mul( applyIorToRoughness( roughness, ior ) );\n\n\treturn textureBicubicLevel( transmissionSample, lod );\n\n} );\n\nconst volumeAttenuation = /*@__PURE__*/ Fn( ( [ transmissionDistance, attenuationColor, attenuationDistance ] ) => {\n\n\tIf( attenuationDistance.notEqual( 0 ), () => {\n\n\t\t// Compute light attenuation using Beer's law.\n\t\tconst attenuationCoefficient = log( attenuationColor ).negate().div( attenuationDistance );\n\t\tconst transmittance = exp( attenuationCoefficient.negate().mul( transmissionDistance ) );\n\n\t\treturn transmittance;\n\n\t} );\n\n\t// Attenuation distance is +\u221E, i.e. the transmitted color is not attenuated at all.\n\treturn vec3( 1.0 );\n\n} ).setLayout( {\n\tname: 'volumeAttenuation',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'transmissionDistance', type: 'float' },\n\t\t{ name: 'attenuationColor', type: 'vec3' },\n\t\t{ name: 'attenuationDistance', type: 'float' }\n\t]\n} );\n\nconst getIBLVolumeRefraction = /*@__PURE__*/ Fn( ( [ n, v, roughness, diffuseColor, specularColor, specularF90, position, modelMatrix, viewMatrix, projMatrix, ior, thickness, attenuationColor, attenuationDistance, dispersion ] ) => {\n\n\tlet transmittedLight, transmittance;\n\n\tif ( dispersion ) {\n\n\t\ttransmittedLight = vec4().toVar();\n\t\ttransmittance = vec3().toVar();\n\n\t\tconst halfSpread = ior.sub( 1.0 ).mul( dispersion.mul( 0.025 ) );\n\t\tconst iors = vec3( ior.sub( halfSpread ), ior, ior.add( halfSpread ) );\n\n\t\tLoop( { start: 0, end: 3 }, ( { i } ) => {\n\n\t\t\tconst ior = iors.element( i );\n\n\t\t\tconst transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\t\tconst refractedRayExit = position.add( transmissionRay );\n\n\t\t\t// Project refracted vector on the framebuffer, while mapping to normalized device coordinates.\n\t\t\tconst ndcPos = projMatrix.mul( viewMatrix.mul( vec4( refractedRayExit, 1.0 ) ) );\n\t\t\tconst refractionCoords = vec2( ndcPos.xy.div( ndcPos.w ) ).toVar();\n\t\t\trefractionCoords.addAssign( 1.0 );\n\t\t\trefractionCoords.divAssign( 2.0 );\n\t\t\trefractionCoords.assign( vec2( refractionCoords.x, refractionCoords.y.oneMinus() ) ); // webgpu\n\n\t\t\t// Sample framebuffer to get pixel the refracted ray hits.\n\t\t\tconst transmissionSample = getTransmissionSample( refractionCoords, roughness, ior );\n\n\t\t\ttransmittedLight.element( i ).assign( transmissionSample.element( i ) );\n\t\t\ttransmittedLight.a.addAssign( transmissionSample.a );\n\n\t\t\ttransmittance.element( i ).assign( diffuseColor.element( i ).mul( volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance ).element( i ) ) );\n\n\t\t} );\n\n\t\ttransmittedLight.a.divAssign( 3.0 );\n\n\t} else {\n\n\t\tconst transmissionRay = getVolumeTransmissionRay( n, v, thickness, ior, modelMatrix );\n\t\tconst refractedRayExit = position.add( transmissionRay );\n\n\t\t// Project refracted vector on the framebuffer, while mapping to normalized device coordinates.\n\t\tconst ndcPos = projMatrix.mul( viewMatrix.mul( vec4( refractedRayExit, 1.0 ) ) );\n\t\tconst refractionCoords = vec2( ndcPos.xy.div( ndcPos.w ) ).toVar();\n\t\trefractionCoords.addAssign( 1.0 );\n\t\trefractionCoords.divAssign( 2.0 );\n\t\trefractionCoords.assign( vec2( refractionCoords.x, refractionCoords.y.oneMinus() ) ); // webgpu\n\n\t\t// Sample framebuffer to get pixel the refracted ray hits.\n\t\ttransmittedLight = getTransmissionSample( refractionCoords, roughness, ior );\n\t\ttransmittance = diffuseColor.mul( volumeAttenuation( length( transmissionRay ), attenuationColor, attenuationDistance ) );\n\n\t}\n\n\tconst attenuatedColor = transmittance.rgb.mul( transmittedLight.rgb );\n\tconst dotNV = n.dot( v ).clamp();\n\n\t// Get the specular component.\n\tconst F = vec3( EnvironmentBRDF( { // n, v, specularColor, specularF90, roughness\n\t\tdotNV,\n\t\tspecularColor,\n\t\tspecularF90,\n\t\troughness\n\t} ) );\n\n\t// As less light is transmitted, the opacity should be increased. This simple approximation does a decent job\n\t// of modulating a CSS background, and has no effect when the buffer is opaque, due to a solid object or clear color.\n\tconst transmittanceFactor = transmittance.r.add( transmittance.g, transmittance.b ).div( 3.0 );\n\n\treturn vec4( F.oneMinus().mul( attenuatedColor ), transmittedLight.a.oneMinus().mul( transmittanceFactor ).oneMinus() );\n\n} );\n\n//\n// Iridescence\n//\n\n// XYZ to linear-sRGB color space\nconst XYZ_TO_REC709 = /*@__PURE__*/ mat3(\n\t3.2404542, -0.969266, 0.0556434,\n\t-1.5371385, 1.8760108, -0.2040259,\n\t-0.4985314, 0.0415560, 1.0572252\n);\n\n// Assume air interface for top\n// Note: We don't handle the case fresnel0 == 1\nconst Fresnel0ToIor = ( fresnel0 ) => {\n\n\tconst sqrtF0 = fresnel0.sqrt();\n\treturn vec3( 1.0 ).add( sqrtF0 ).div( vec3( 1.0 ).sub( sqrtF0 ) );\n\n};\n\n// ior is a value between 1.0 and 3.0. 1.0 is air interface\nconst IorToFresnel0 = ( transmittedIor, incidentIor ) => {\n\n\treturn transmittedIor.sub( incidentIor ).div( transmittedIor.add( incidentIor ) ).pow2();\n\n};\n\n// Fresnel equations for dielectric/dielectric interfaces.\n// Ref: https://belcour.github.io/blog/research/2017/05/01/brdf-thin-film.html\n// Evaluation XYZ sensitivity curves in Fourier space\nconst evalSensitivity = ( OPD, shift ) => {\n\n\tconst phase = OPD.mul( 2.0 * Math.PI * 1.0e-9 );\n\tconst val = vec3( 5.4856e-13, 4.4201e-13, 5.2481e-13 );\n\tconst pos = vec3( 1.6810e+06, 1.7953e+06, 2.2084e+06 );\n\tconst VAR = vec3( 4.3278e+09, 9.3046e+09, 6.6121e+09 );\n\n\tconst x = float( 9.7470e-14 * Math.sqrt( 2.0 * Math.PI * 4.5282e+09 ) ).mul( phase.mul( 2.2399e+06 ).add( shift.x ).cos() ).mul( phase.pow2().mul( -45282e5 ).exp() );\n\n\tlet xyz = val.mul( VAR.mul( 2.0 * Math.PI ).sqrt() ).mul( pos.mul( phase ).add( shift ).cos() ).mul( phase.pow2().negate().mul( VAR ).exp() );\n\txyz = vec3( xyz.x.add( x ), xyz.y, xyz.z ).div( 1.0685e-7 );\n\n\tconst rgb = XYZ_TO_REC709.mul( xyz );\n\n\treturn rgb;\n\n};\n\nconst evalIridescence = /*@__PURE__*/ Fn( ( { outsideIOR, eta2, cosTheta1, thinFilmThickness, baseF0 } ) => {\n\n\t// Force iridescenceIOR -> outsideIOR when thinFilmThickness -> 0.0\n\tconst iridescenceIOR = mix( outsideIOR, eta2, smoothstep( 0.0, 0.03, thinFilmThickness ) );\n\t// Evaluate the cosTheta on the base layer (Snell law)\n\tconst sinTheta2Sq = outsideIOR.div( iridescenceIOR ).pow2().mul( cosTheta1.pow2().oneMinus() );\n\n\t// Handle TIR:\n\tconst cosTheta2Sq = sinTheta2Sq.oneMinus();\n\n\tIf( cosTheta2Sq.lessThan( 0 ), () => {\n\n\t\treturn vec3( 1.0 );\n\n\t} );\n\n\tconst cosTheta2 = cosTheta2Sq.sqrt();\n\n\t// First interface\n\tconst R0 = IorToFresnel0( iridescenceIOR, outsideIOR );\n\tconst R12 = F_Schlick( { f0: R0, f90: 1.0, dotVH: cosTheta1 } );\n\t//const R21 = R12;\n\tconst T121 = R12.oneMinus();\n\tconst phi12 = iridescenceIOR.lessThan( outsideIOR ).select( Math.PI, 0.0 );\n\tconst phi21 = float( Math.PI ).sub( phi12 );\n\n\t// Second interface\n\tconst baseIOR = Fresnel0ToIor( baseF0.clamp( 0.0, 0.9999 ) ); // guard against 1.0\n\tconst R1 = IorToFresnel0( baseIOR, iridescenceIOR.toVec3() );\n\tconst R23 = F_Schlick( { f0: R1, f90: 1.0, dotVH: cosTheta2 } );\n\tconst phi23 = vec3(\n\t\tbaseIOR.x.lessThan( iridescenceIOR ).select( Math.PI, 0.0 ),\n\t\tbaseIOR.y.lessThan( iridescenceIOR ).select( Math.PI, 0.0 ),\n\t\tbaseIOR.z.lessThan( iridescenceIOR ).select( Math.PI, 0.0 )\n\t);\n\n\t// Phase shift\n\tconst OPD = iridescenceIOR.mul( thinFilmThickness, cosTheta2, 2.0 );\n\tconst phi = vec3( phi21 ).add( phi23 );\n\n\t// Compound terms\n\tconst R123 = R12.mul( R23 ).clamp( 1e-5, 0.9999 );\n\tconst r123 = R123.sqrt();\n\tconst Rs = T121.pow2().mul( R23 ).div( vec3( 1.0 ).sub( R123 ) );\n\n\t// Reflectance term for m = 0 (DC term amplitude)\n\tconst C0 = R12.add( Rs );\n\tconst I = C0.toVar();\n\n\t// Reflectance term for m > 0 (pairs of diracs)\n\tconst Cm = Rs.sub( T121 ).toVar();\n\n\tLoop( { start: 1, end: 2, condition: '<=', name: 'm' }, ( { m } ) => {\n\n\t\tCm.mulAssign( r123 );\n\t\tconst Sm = evalSensitivity( float( m ).mul( OPD ), float( m ).mul( phi ) ).mul( 2.0 );\n\t\tI.addAssign( Cm.mul( Sm ) );\n\n\t} );\n\n\t// Since out of gamut colors might be produced, negative color values are clamped to 0.\n\treturn I.max( vec3( 0.0 ) );\n\n} ).setLayout( {\n\tname: 'evalIridescence',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'outsideIOR', type: 'float' },\n\t\t{ name: 'eta2', type: 'float' },\n\t\t{ name: 'cosTheta1', type: 'float' },\n\t\t{ name: 'thinFilmThickness', type: 'float' },\n\t\t{ name: 'baseF0', type: 'vec3' }\n\t]\n} );\n\n//\n//\tSheen\n//\n\n// This is a curve-fit approximation to the \"Charlie sheen\" BRDF integrated over the hemisphere from\n// Estevez and Kulla 2017, \"Production Friendly Microfacet Sheen BRDF\".\nconst IBLSheenBRDF = /*@__PURE__*/ Fn( ( { normal, viewDir, roughness } ) => {\n\n\tconst dotNV = normal.dot( viewDir ).saturate();\n\tconst r2 = roughness.mul( roughness );\n\tconst rInv = roughness.add( 0.1 ).reciprocal();\n\n\tconst a = float( -1.9362 ).add( roughness.mul( 1.0678 ) ).add( r2.mul( 0.4573 ) ).sub( rInv.mul( 0.8469 ) );\n\tconst b = float( -0.6014 ).add( roughness.mul( 0.5538 ) ).sub( r2.mul( 0.4670 ) ).sub( rInv.mul( 0.1255 ) );\n\n\tconst DG = a.mul( dotNV ).add( b ).exp();\n\n\treturn DG.saturate();\n\n} );\n\nconst clearcoatF0 = vec3( 0.04 );\nconst clearcoatF90 = float( 1 );\n\n\n/**\n * Represents the lighting model for a PBR material.\n *\n * @augments LightingModel\n */\nclass PhysicalLightingModel extends LightingModel {\n\n\t/**\n\t * Constructs a new physical lighting model.\n\t *\n\t * @param {boolean} [clearcoat=false] - Whether clearcoat is supported or not.\n\t * @param {boolean} [sheen=false] - Whether sheen is supported or not.\n\t * @param {boolean} [iridescence=false] - Whether iridescence is supported or not.\n\t * @param {boolean} [anisotropy=false] - Whether anisotropy is supported or not.\n\t * @param {boolean} [transmission=false] - Whether transmission is supported or not.\n\t * @param {boolean} [dispersion=false] - Whether dispersion is supported or not.\n\t */\n\tconstructor( clearcoat = false, sheen = false, iridescence = false, anisotropy = false, transmission = false, dispersion = false ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * Whether clearcoat is supported or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clearcoat = clearcoat;\n\n\t\t/**\n\t\t * Whether sheen is supported or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.sheen = sheen;\n\n\t\t/**\n\t\t * Whether iridescence is supported or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.iridescence = iridescence;\n\n\t\t/**\n\t\t * Whether anisotropy is supported or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.anisotropy = anisotropy;\n\n\t\t/**\n\t\t * Whether transmission is supported or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.transmission = transmission;\n\n\t\t/**\n\t\t * Whether dispersion is supported or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.dispersion = dispersion;\n\n\t\t/**\n\t\t * The clear coat radiance.\n\t\t *\n\t\t * @type {?Node}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatRadiance = null;\n\n\t\t/**\n\t\t * The clear coat specular direct.\n\t\t *\n\t\t * @type {?Node}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatSpecularDirect = null;\n\n\t\t/**\n\t\t * The clear coat specular indirect.\n\t\t *\n\t\t * @type {?Node}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatSpecularIndirect = null;\n\n\t\t/**\n\t\t * The sheen specular direct.\n\t\t *\n\t\t * @type {?Node}\n\t\t * @default null\n\t\t */\n\t\tthis.sheenSpecularDirect = null;\n\n\t\t/**\n\t\t * The sheen specular indirect.\n\t\t *\n\t\t * @type {?Node}\n\t\t * @default null\n\t\t */\n\t\tthis.sheenSpecularIndirect = null;\n\n\t\t/**\n\t\t * The iridescence Fresnel.\n\t\t *\n\t\t * @type {?Node}\n\t\t * @default null\n\t\t */\n\t\tthis.iridescenceFresnel = null;\n\n\t\t/**\n\t\t * The iridescence F0.\n\t\t *\n\t\t * @type {?Node}\n\t\t * @default null\n\t\t */\n\t\tthis.iridescenceF0 = null;\n\n\t\t/**\n\t\t * The iridescence F0 dielectric.\n\t\t *\n\t\t * @type {?Node}\n\t\t * @default null\n\t\t */\n\t\tthis.iridescenceF0Dielectric = null;\n\n\t\t/**\n\t\t * The iridescence F0 metallic.\n\t\t *\n\t\t * @type {?Node}\n\t\t * @default null\n\t\t */\n\t\tthis.iridescenceF0Metallic = null;\n\n\t}\n\n\t/**\n\t * Depending on what features are requested, the method prepares certain node variables\n\t * which are later used for lighting computations.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tstart( builder ) {\n\n\t\tif ( this.clearcoat === true ) {\n\n\t\t\tthis.clearcoatRadiance = vec3().toVar( 'clearcoatRadiance' );\n\t\t\tthis.clearcoatSpecularDirect = vec3().toVar( 'clearcoatSpecularDirect' );\n\t\t\tthis.clearcoatSpecularIndirect = vec3().toVar( 'clearcoatSpecularIndirect' );\n\n\t\t}\n\n\t\tif ( this.sheen === true ) {\n\n\t\t\tthis.sheenSpecularDirect = vec3().toVar( 'sheenSpecularDirect' );\n\t\t\tthis.sheenSpecularIndirect = vec3().toVar( 'sheenSpecularIndirect' );\n\n\t\t}\n\n\t\tif ( this.iridescence === true ) {\n\n\t\t\tconst dotNVi = normalView.dot( positionViewDirection ).clamp();\n\n\t\t\tconst iridescenceFresnelDielectric = evalIridescence( {\n\t\t\t\toutsideIOR: float( 1.0 ),\n\t\t\t\teta2: iridescenceIOR,\n\t\t\t\tcosTheta1: dotNVi,\n\t\t\t\tthinFilmThickness: iridescenceThickness,\n\t\t\t\tbaseF0: specularColor\n\t\t\t} );\n\n\t\t\tconst iridescenceFresnelMetallic = evalIridescence( {\n\t\t\t\toutsideIOR: float( 1.0 ),\n\t\t\t\teta2: iridescenceIOR,\n\t\t\t\tcosTheta1: dotNVi,\n\t\t\t\tthinFilmThickness: iridescenceThickness,\n\t\t\t\tbaseF0: diffuseColor.rgb\n\t\t\t} );\n\n\t\t\tthis.iridescenceFresnel = mix( iridescenceFresnelDielectric, iridescenceFresnelMetallic, metalness );\n\n\t\t\tthis.iridescenceF0Dielectric = Schlick_to_F0( { f: iridescenceFresnelDielectric, f90: 1.0, dotVH: dotNVi } );\n\t\t\tthis.iridescenceF0Metallic = Schlick_to_F0( { f: iridescenceFresnelMetallic, f90: 1.0, dotVH: dotNVi } );\n\n\t\t\tthis.iridescenceF0 = mix( this.iridescenceF0Dielectric, this.iridescenceF0Metallic, metalness );\n\n\t\t}\n\n\t\tif ( this.transmission === true ) {\n\n\t\t\tconst position = positionWorld;\n\t\t\tconst v = cameraPosition.sub( positionWorld ).normalize(); // TODO: Create Node for this, same issue in MaterialX\n\t\t\tconst n = normalWorld;\n\n\t\t\tconst context = builder.context;\n\n\t\t\tcontext.backdrop = getIBLVolumeRefraction(\n\t\t\t\tn,\n\t\t\t\tv,\n\t\t\t\troughness,\n\t\t\t\tdiffuseContribution,\n\t\t\t\tspecularColorBlended,\n\t\t\t\tspecularF90, // specularF90\n\t\t\t\tposition, // positionWorld\n\t\t\t\tmodelWorldMatrix, // modelMatrix\n\t\t\t\tcameraViewMatrix, // viewMatrix\n\t\t\t\tcameraProjectionMatrix, // projMatrix\n\t\t\t\tior,\n\t\t\t\tthickness,\n\t\t\t\tattenuationColor,\n\t\t\t\tattenuationDistance,\n\t\t\t\tthis.dispersion ? dispersion : null\n\t\t\t);\n\n\t\t\tcontext.backdropAlpha = transmission;\n\n\t\t\tdiffuseColor.a.mulAssign( mix( 1, context.backdrop.a, transmission ) );\n\n\t\t}\n\n\t\tsuper.start( builder );\n\n\t}\n\n\t// Fdez-Ag\u00FCera's \"Multiple-Scattering Microfacet Model for Real-Time Image Based Lighting\"\n\t// Approximates multi-scattering in order to preserve energy.\n\t// http://www.jcgt.org/published/0008/01/03/\n\n\tcomputeMultiscattering( singleScatter, multiScatter, specularF90, f0, iridescenceF0 = null ) {\n\n\t\tconst dotNV = normalView.dot( positionViewDirection ).clamp(); // @ TODO: Move to core dotNV\n\n\t\tconst fab = DFGLUT( { roughness, dotNV } );\n\n\t\tconst Fr = iridescenceF0 ? iridescence.mix( f0, iridescenceF0 ) : f0;\n\n\t\tconst FssEss = Fr.mul( fab.x ).add( specularF90.mul( fab.y ) );\n\n\t\tconst Ess = fab.x.add( fab.y );\n\t\tconst Ems = Ess.oneMinus();\n\n\t\tconst Favg = Fr.add( Fr.oneMinus().mul( 0.047619 ) ); // 1/21\n\t\tconst Fms = FssEss.mul( Favg ).div( Ems.mul( Favg ).oneMinus() );\n\n\t\tsingleScatter.addAssign( FssEss );\n\t\tmultiScatter.addAssign( Fms.mul( Ems ) );\n\n\t}\n\n\t/**\n\t * Implements the direct light.\n\t *\n\t * @param {Object} lightData - The light data.\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tdirect( { lightDirection, lightColor, reflectedLight }, /* builder */ ) {\n\n\t\tconst dotNL = normalView.dot( lightDirection ).clamp();\n\t\tconst irradiance = dotNL.mul( lightColor ).toVar();\n\n\t\tif ( this.sheen === true ) {\n\n\t\t\tthis.sheenSpecularDirect.addAssign( irradiance.mul( BRDF_Sheen( { lightDirection } ) ) );\n\n\t\t\tconst sheenAlbedoV = IBLSheenBRDF( { normal: normalView, viewDir: positionViewDirection, roughness: sheenRoughness } );\n\t\t\tconst sheenAlbedoL = IBLSheenBRDF( { normal: normalView, viewDir: lightDirection, roughness: sheenRoughness } );\n\n\t\t\tconst sheenEnergyComp = sheen.r.max( sheen.g ).max( sheen.b ).mul( sheenAlbedoV.max( sheenAlbedoL ) ).oneMinus();\n\n\t\t\tirradiance.mulAssign( sheenEnergyComp );\n\n\t\t}\n\n\t\tif ( this.clearcoat === true ) {\n\n\t\t\tconst dotNLcc = clearcoatNormalView.dot( lightDirection ).clamp();\n\t\t\tconst ccIrradiance = dotNLcc.mul( lightColor );\n\n\t\t\tthis.clearcoatSpecularDirect.addAssign( ccIrradiance.mul( BRDF_GGX( { lightDirection, f0: clearcoatF0, f90: clearcoatF90, roughness: clearcoatRoughness, normalView: clearcoatNormalView } ) ) );\n\n\t\t}\n\n\t\treflectedLight.directDiffuse.addAssign( irradiance.mul( BRDF_Lambert( { diffuseColor: diffuseContribution } ) ) );\n\n\t\treflectedLight.directSpecular.addAssign( irradiance.mul( BRDF_GGX_Multiscatter( { lightDirection, f0: specularColorBlended, f90: 1, roughness, f: this.iridescenceFresnel, USE_IRIDESCENCE: this.iridescence, USE_ANISOTROPY: this.anisotropy } ) ) );\n\n\t}\n\n\t/**\n\t * This method is intended for implementing the direct light term for\n\t * rect area light nodes.\n\t *\n\t * @param {Object} input - The input data.\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tdirectRectArea( { lightColor, lightPosition, halfWidth, halfHeight, reflectedLight, ltc_1, ltc_2 }, /* builder */ ) {\n\n\t\tconst p0 = lightPosition.add( halfWidth ).sub( halfHeight ); // counterclockwise; light shines in local neg z direction\n\t\tconst p1 = lightPosition.sub( halfWidth ).sub( halfHeight );\n\t\tconst p2 = lightPosition.sub( halfWidth ).add( halfHeight );\n\t\tconst p3 = lightPosition.add( halfWidth ).add( halfHeight );\n\n\t\tconst N = normalView;\n\t\tconst V = positionViewDirection;\n\t\tconst P = positionView.toVar();\n\n\t\tconst uv = LTC_Uv( { N, V, roughness } );\n\n\t\tconst t1 = ltc_1.sample( uv ).toVar();\n\t\tconst t2 = ltc_2.sample( uv ).toVar();\n\n\t\tconst mInv = mat3(\n\t\t\tvec3( t1.x, 0, t1.y ),\n\t\t\tvec3( 0, 1, 0 ),\n\t\t\tvec3( t1.z, 0, t1.w )\n\t\t).toVar();\n\n\t\t// LTC Fresnel Approximation by Stephen Hill\n\t\t// http://blog.selfshadow.com/publications/s2016-advances/s2016_ltc_fresnel.pdf\n\t\tconst fresnel = specularColorBlended.mul( t2.x ).add( specularColorBlended.oneMinus().mul( t2.y ) ).toVar();\n\n\t\treflectedLight.directSpecular.addAssign( lightColor.mul( fresnel ).mul( LTC_Evaluate( { N, V, P, mInv, p0, p1, p2, p3 } ) ) );\n\n\t\treflectedLight.directDiffuse.addAssign( lightColor.mul( diffuseContribution ).mul( LTC_Evaluate( { N, V, P, mInv: mat3( 1, 0, 0, 0, 1, 0, 0, 0, 1 ), p0, p1, p2, p3 } ) ) );\n\n\t}\n\n\t/**\n\t * Implements the indirect lighting.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tindirect( builder ) {\n\n\t\tthis.indirectDiffuse( builder );\n\t\tthis.indirectSpecular( builder );\n\t\tthis.ambientOcclusion( builder );\n\n\t}\n\n\t/**\n\t * Implements the indirect diffuse term.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tindirectDiffuse( builder ) {\n\n\t\tconst { irradiance, reflectedLight } = builder.context;\n\n\t\tconst diffuse = irradiance.mul( BRDF_Lambert( { diffuseColor: diffuseContribution } ) ).toVar();\n\n\t\tif ( this.sheen === true ) {\n\n\t\t\tconst sheenAlbedo = IBLSheenBRDF( { normal: normalView, viewDir: positionViewDirection, roughness: sheenRoughness } );\n\n\t\t\tconst sheenEnergyComp = sheen.r.max( sheen.g ).max( sheen.b ).mul( sheenAlbedo ).oneMinus();\n\n\t\t\tdiffuse.mulAssign( sheenEnergyComp );\n\n\t\t}\n\n\t\treflectedLight.indirectDiffuse.addAssign( diffuse );\n\n\t}\n\n\t/**\n\t * Implements the indirect specular term.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tindirectSpecular( builder ) {\n\n\t\tconst { radiance, iblIrradiance, reflectedLight } = builder.context;\n\n\t\tif ( this.sheen === true ) {\n\n\t\t\tthis.sheenSpecularIndirect.addAssign( iblIrradiance.mul(\n\t\t\t\tsheen,\n\t\t\t\tIBLSheenBRDF( {\n\t\t\t\t\tnormal: normalView,\n\t\t\t\t\tviewDir: positionViewDirection,\n\t\t\t\t\troughness: sheenRoughness\n\t\t\t\t} )\n\t\t\t) );\n\n\t\t}\n\n\t\tif ( this.clearcoat === true ) {\n\n\t\t\tconst dotNVcc = clearcoatNormalView.dot( positionViewDirection ).clamp();\n\n\t\t\tconst clearcoatEnv = EnvironmentBRDF( {\n\t\t\t\tdotNV: dotNVcc,\n\t\t\t\tspecularColor: clearcoatF0,\n\t\t\t\tspecularF90: clearcoatF90,\n\t\t\t\troughness: clearcoatRoughness\n\t\t\t} );\n\n\t\t\tthis.clearcoatSpecularIndirect.addAssign( this.clearcoatRadiance.mul( clearcoatEnv ) );\n\n\t\t}\n\n\t\t// Both indirect specular and indirect diffuse light accumulate here\n\t\t// Compute multiscattering separately for dielectric and metallic, then mix\n\n\t\tconst singleScatteringDielectric = vec3().toVar( 'singleScatteringDielectric' );\n\t\tconst multiScatteringDielectric = vec3().toVar( 'multiScatteringDielectric' );\n\t\tconst singleScatteringMetallic = vec3().toVar( 'singleScatteringMetallic' );\n\t\tconst multiScatteringMetallic = vec3().toVar( 'multiScatteringMetallic' );\n\n\t\tthis.computeMultiscattering( singleScatteringDielectric, multiScatteringDielectric, specularF90, specularColor, this.iridescenceF0Dielectric );\n\t\tthis.computeMultiscattering( singleScatteringMetallic, multiScatteringMetallic, specularF90, diffuseColor.rgb, this.iridescenceF0Metallic );\n\n\t\t// Mix based on metalness\n\t\tconst singleScattering = mix( singleScatteringDielectric, singleScatteringMetallic, metalness );\n\t\tconst multiScattering = mix( multiScatteringDielectric, multiScatteringMetallic, metalness );\n\n\t\t// Diffuse energy conservation uses dielectric path\n\t\tconst totalScatteringDielectric = singleScatteringDielectric.add( multiScatteringDielectric );\n\n\t\tconst diffuse = diffuseContribution.mul( totalScatteringDielectric.oneMinus() );\n\n\t\tconst cosineWeightedIrradiance = iblIrradiance.mul( 1 / Math.PI );\n\n\t\tconst indirectSpecular = radiance.mul( singleScattering ).add( multiScattering.mul( cosineWeightedIrradiance ) ).toVar();\n\t\tconst indirectDiffuse = diffuse.mul( cosineWeightedIrradiance ).toVar();\n\n\t\tif ( this.sheen === true ) {\n\n\t\t\tconst sheenAlbedo = IBLSheenBRDF( { normal: normalView, viewDir: positionViewDirection, roughness: sheenRoughness } );\n\n\t\t\tconst sheenEnergyComp = sheen.r.max( sheen.g ).max( sheen.b ).mul( sheenAlbedo ).oneMinus();\n\n\t\t\tindirectSpecular.mulAssign( sheenEnergyComp );\n\t\t\tindirectDiffuse.mulAssign( sheenEnergyComp );\n\n\t\t}\n\n\t\treflectedLight.indirectSpecular.addAssign( indirectSpecular );\n\n\t\treflectedLight.indirectDiffuse.addAssign( indirectDiffuse );\n\n\t}\n\n\t/**\n\t * Implements the ambient occlusion term.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tambientOcclusion( builder ) {\n\n\t\tconst { ambientOcclusion, reflectedLight } = builder.context;\n\n\t\tconst dotNV = normalView.dot( positionViewDirection ).clamp(); // @ TODO: Move to core dotNV\n\n\t\tconst aoNV = dotNV.add( ambientOcclusion );\n\t\tconst aoExp = roughness.mul( -16 ).oneMinus().negate().exp2();\n\n\t\tconst aoNode = ambientOcclusion.sub( aoNV.pow( aoExp ).oneMinus() ).clamp();\n\n\t\tif ( this.clearcoat === true ) {\n\n\t\t\tthis.clearcoatSpecularIndirect.mulAssign( ambientOcclusion );\n\n\t\t}\n\n\t\tif ( this.sheen === true ) {\n\n\t\t\tthis.sheenSpecularIndirect.mulAssign( ambientOcclusion );\n\n\t\t}\n\n\t\treflectedLight.indirectDiffuse.mulAssign( ambientOcclusion );\n\t\treflectedLight.indirectSpecular.mulAssign( aoNode );\n\n\t}\n\n\t/**\n\t * Used for final lighting accumulations depending on the requested features.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tfinish( { context } ) {\n\n\t\tconst { outgoingLight } = context;\n\n\t\tif ( this.clearcoat === true ) {\n\n\t\t\tconst dotNVcc = clearcoatNormalView.dot( positionViewDirection ).clamp();\n\n\t\t\tconst Fcc = F_Schlick( {\n\t\t\t\tdotVH: dotNVcc,\n\t\t\t\tf0: clearcoatF0,\n\t\t\t\tf90: clearcoatF90\n\t\t\t} );\n\n\t\t\tconst clearcoatLight = outgoingLight.mul( clearcoat.mul( Fcc ).oneMinus() ).add( this.clearcoatSpecularDirect.add( this.clearcoatSpecularIndirect ).mul( clearcoat ) );\n\n\t\t\toutgoingLight.assign( clearcoatLight );\n\n\t\t}\n\n\t\tif ( this.sheen === true ) {\n\n\t\t\tconst sheenLight = outgoingLight.add( this.sheenSpecularDirect, this.sheenSpecularIndirect.mul( 1.0 / Math.PI ) );\n\n\t\t\toutgoingLight.assign( sheenLight );\n\n\t\t}\n\n\t}\n\n}\n\n// These defines must match with PMREMGenerator\n\nconst cubeUV_r0 = /*@__PURE__*/ float( 1.0 );\nconst cubeUV_m0 = /*@__PURE__*/ float( -2 );\nconst cubeUV_r1 = /*@__PURE__*/ float( 0.8 );\nconst cubeUV_m1 = /*@__PURE__*/ float( -1 );\nconst cubeUV_r4 = /*@__PURE__*/ float( 0.4 );\nconst cubeUV_m4 = /*@__PURE__*/ float( 2.0 );\nconst cubeUV_r5 = /*@__PURE__*/ float( 0.305 );\nconst cubeUV_m5 = /*@__PURE__*/ float( 3.0 );\nconst cubeUV_r6 = /*@__PURE__*/ float( 0.21 );\nconst cubeUV_m6 = /*@__PURE__*/ float( 4.0 );\n\nconst cubeUV_minMipLevel = /*@__PURE__*/ float( 4.0 );\nconst cubeUV_minTileSize = /*@__PURE__*/ float( 16.0 );\n\n// These shader functions convert between the UV coordinates of a single face of\n// a cubemap, the 0-5 integer index of a cube face, and the direction vector for\n// sampling a textureCube (not generally normalized ).\n\nconst getFace = /*@__PURE__*/ Fn( ( [ direction ] ) => {\n\n\tconst absDirection = vec3( abs( direction ) ).toVar();\n\tconst face = float( -1 ).toVar();\n\n\tIf( absDirection.x.greaterThan( absDirection.z ), () => {\n\n\t\tIf( absDirection.x.greaterThan( absDirection.y ), () => {\n\n\t\t\tface.assign( select( direction.x.greaterThan( 0.0 ), 0.0, 3.0 ) );\n\n\t\t} ).Else( () => {\n\n\t\t\tface.assign( select( direction.y.greaterThan( 0.0 ), 1.0, 4.0 ) );\n\n\t\t} );\n\n\t} ).Else( () => {\n\n\t\tIf( absDirection.z.greaterThan( absDirection.y ), () => {\n\n\t\t\tface.assign( select( direction.z.greaterThan( 0.0 ), 2.0, 5.0 ) );\n\n\t\t} ).Else( () => {\n\n\t\t\tface.assign( select( direction.y.greaterThan( 0.0 ), 1.0, 4.0 ) );\n\n\t\t} );\n\n\t} );\n\n\treturn face;\n\n} ).setLayout( {\n\tname: 'getFace',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'direction', type: 'vec3' }\n\t]\n} );\n\n// RH coordinate system; PMREM face-indexing convention\nconst getUV = /*@__PURE__*/ Fn( ( [ direction, face ] ) => {\n\n\tconst uv = vec2().toVar();\n\n\tIf( face.equal( 0.0 ), () => {\n\n\t\tuv.assign( vec2( direction.z, direction.y ).div( abs( direction.x ) ) ); // pos x\n\n\t} ).ElseIf( face.equal( 1.0 ), () => {\n\n\t\tuv.assign( vec2( direction.x.negate(), direction.z.negate() ).div( abs( direction.y ) ) ); // pos y\n\n\t} ).ElseIf( face.equal( 2.0 ), () => {\n\n\t\tuv.assign( vec2( direction.x.negate(), direction.y ).div( abs( direction.z ) ) ); // pos z\n\n\t} ).ElseIf( face.equal( 3.0 ), () => {\n\n\t\tuv.assign( vec2( direction.z.negate(), direction.y ).div( abs( direction.x ) ) ); // neg x\n\n\t} ).ElseIf( face.equal( 4.0 ), () => {\n\n\t\tuv.assign( vec2( direction.x.negate(), direction.z ).div( abs( direction.y ) ) ); // neg y\n\n\t} ).Else( () => {\n\n\t\tuv.assign( vec2( direction.x, direction.y ).div( abs( direction.z ) ) ); // neg z\n\n\t} );\n\n\treturn mul( 0.5, uv.add( 1.0 ) );\n\n} ).setLayout( {\n\tname: 'getUV',\n\ttype: 'vec2',\n\tinputs: [\n\t\t{ name: 'direction', type: 'vec3' },\n\t\t{ name: 'face', type: 'float' }\n\t]\n} );\n\nconst roughnessToMip = /*@__PURE__*/ Fn( ( [ roughness ] ) => {\n\n\tconst mip = float( 0.0 ).toVar();\n\n\tIf( roughness.greaterThanEqual( cubeUV_r1 ), () => {\n\n\t\tmip.assign( cubeUV_r0.sub( roughness ).mul( cubeUV_m1.sub( cubeUV_m0 ) ).div( cubeUV_r0.sub( cubeUV_r1 ) ).add( cubeUV_m0 ) );\n\n\t} ).ElseIf( roughness.greaterThanEqual( cubeUV_r4 ), () => {\n\n\t\tmip.assign( cubeUV_r1.sub( roughness ).mul( cubeUV_m4.sub( cubeUV_m1 ) ).div( cubeUV_r1.sub( cubeUV_r4 ) ).add( cubeUV_m1 ) );\n\n\t} ).ElseIf( roughness.greaterThanEqual( cubeUV_r5 ), () => {\n\n\t\tmip.assign( cubeUV_r4.sub( roughness ).mul( cubeUV_m5.sub( cubeUV_m4 ) ).div( cubeUV_r4.sub( cubeUV_r5 ) ).add( cubeUV_m4 ) );\n\n\t} ).ElseIf( roughness.greaterThanEqual( cubeUV_r6 ), () => {\n\n\t\tmip.assign( cubeUV_r5.sub( roughness ).mul( cubeUV_m6.sub( cubeUV_m5 ) ).div( cubeUV_r5.sub( cubeUV_r6 ) ).add( cubeUV_m5 ) );\n\n\t} ).Else( () => {\n\n\t\tmip.assign( float( -2 ).mul( log2( mul( 1.16, roughness ) ) ) ); // 1.16 = 1.79^0.25\n\n\t} );\n\n\treturn mip;\n\n} ).setLayout( {\n\tname: 'roughnessToMip',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'roughness', type: 'float' }\n\t]\n} );\n\n// RH coordinate system; PMREM face-indexing convention\nconst getDirection = /*@__PURE__*/ Fn( ( [ uv_immutable, face ] ) => {\n\n\tconst uv = uv_immutable.toVar();\n\tuv.assign( mul( 2.0, uv ).sub( 1.0 ) );\n\tconst direction = vec3( uv, 1.0 ).toVar();\n\n\tIf( face.equal( 0.0 ), () => {\n\n\t\tdirection.assign( direction.zyx ); // ( 1, v, u ) pos x\n\n\t} ).ElseIf( face.equal( 1.0 ), () => {\n\n\t\tdirection.assign( direction.xzy );\n\t\tdirection.xz.mulAssign( -1 ); // ( -u, 1, -v ) pos y\n\n\t} ).ElseIf( face.equal( 2.0 ), () => {\n\n\t\tdirection.x.mulAssign( -1 ); // ( -u, v, 1 ) pos z\n\n\t} ).ElseIf( face.equal( 3.0 ), () => {\n\n\t\tdirection.assign( direction.zyx );\n\t\tdirection.xz.mulAssign( -1 ); // ( -1, v, -u ) neg x\n\n\t} ).ElseIf( face.equal( 4.0 ), () => {\n\n\t\tdirection.assign( direction.xzy );\n\t\tdirection.xy.mulAssign( -1 ); // ( -u, -1, v ) neg y\n\n\t} ).ElseIf( face.equal( 5.0 ), () => {\n\n\t\tdirection.z.mulAssign( -1 ); // ( u, v, -1 ) neg zS\n\n\t} );\n\n\treturn direction;\n\n} ).setLayout( {\n\tname: 'getDirection',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'uv', type: 'vec2' },\n\t\t{ name: 'face', type: 'float' }\n\t]\n} );\n\n//\n\nconst textureCubeUV = /*@__PURE__*/ Fn( ( [ envMap, sampleDir_immutable, roughness_immutable, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP ] ) => {\n\n\tconst roughness = float( roughness_immutable );\n\tconst sampleDir = vec3( sampleDir_immutable );\n\n\tconst mip = clamp( roughnessToMip( roughness ), cubeUV_m0, CUBEUV_MAX_MIP );\n\tconst mipF = fract( mip );\n\tconst mipInt = floor( mip );\n\tconst color0 = vec3( bilinearCubeUV( envMap, sampleDir, mipInt, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP ) ).toVar();\n\n\tIf( mipF.notEqual( 0.0 ), () => {\n\n\t\tconst color1 = vec3( bilinearCubeUV( envMap, sampleDir, mipInt.add( 1.0 ), CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP ) ).toVar();\n\n\t\tcolor0.assign( mix( color0, color1, mipF ) );\n\n\t} );\n\n\treturn color0;\n\n} );\n\nconst bilinearCubeUV = /*@__PURE__*/ Fn( ( [ envMap, direction_immutable, mipInt_immutable, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP ] ) => {\n\n\tconst mipInt = float( mipInt_immutable ).toVar();\n\tconst direction = vec3( direction_immutable );\n\tconst face = float( getFace( direction ) ).toVar();\n\tconst filterInt = float( max$1( cubeUV_minMipLevel.sub( mipInt ), 0.0 ) ).toVar();\n\tmipInt.assign( max$1( mipInt, cubeUV_minMipLevel ) );\n\tconst faceSize = float( exp2( mipInt ) ).toVar();\n\tconst uv = vec2( getUV( direction, face ).mul( faceSize.sub( 2.0 ) ).add( 1.0 ) ).toVar();\n\n\tIf( face.greaterThan( 2.0 ), () => {\n\n\t\tuv.y.addAssign( faceSize );\n\t\tface.subAssign( 3.0 );\n\n\t} );\n\n\tuv.x.addAssign( face.mul( faceSize ) );\n\tuv.x.addAssign( filterInt.mul( mul( 3.0, cubeUV_minTileSize ) ) );\n\tuv.y.addAssign( mul( 4.0, exp2( CUBEUV_MAX_MIP ).sub( faceSize ) ) );\n\tuv.x.mulAssign( CUBEUV_TEXEL_WIDTH );\n\tuv.y.mulAssign( CUBEUV_TEXEL_HEIGHT );\n\n\treturn envMap.sample( uv ).grad( vec2(), vec2() ); // disable anisotropic filtering\n\n} );\n\nconst getSample = /*@__PURE__*/ Fn( ( { envMap, mipInt, outputDirection, theta, axis, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP } ) => {\n\n\tconst cosTheta = cos( theta );\n\n\t// Rodrigues' axis-angle rotation\n\tconst sampleDirection = outputDirection.mul( cosTheta )\n\t\t.add( axis.cross( outputDirection ).mul( sin( theta ) ) )\n\t\t.add( axis.mul( axis.dot( outputDirection ).mul( cosTheta.oneMinus() ) ) );\n\n\treturn bilinearCubeUV( envMap, sampleDirection, mipInt, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP );\n\n} );\n\nconst blur = /*@__PURE__*/ Fn( ( { n, latitudinal, poleAxis, outputDirection, weights, samples, dTheta, mipInt, envMap, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP } ) => {\n\n\tconst axis = vec3( select( latitudinal, poleAxis, cross( poleAxis, outputDirection ) ) ).toVar();\n\n\tIf( axis.equal( vec3( 0.0 ) ), () => {\n\n\t\taxis.assign( vec3( outputDirection.z, 0.0, outputDirection.x.negate() ) );\n\n\t} );\n\n\taxis.assign( normalize( axis ) );\n\n\tconst gl_FragColor = vec3().toVar();\n\tgl_FragColor.addAssign( weights.element( 0 ).mul( getSample( { theta: 0.0, axis, outputDirection, mipInt, envMap, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP } ) ) );\n\n\tLoop( { start: int( 1 ), end: n }, ( { i } ) => {\n\n\t\tIf( i.greaterThanEqual( samples ), () => {\n\n\t\t\tBreak();\n\n\t\t} );\n\n\t\tconst theta = float( dTheta.mul( float( i ) ) ).toVar();\n\t\tgl_FragColor.addAssign( weights.element( i ).mul( getSample( { theta: theta.mul( -1 ), axis, outputDirection, mipInt, envMap, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP } ) ) );\n\t\tgl_FragColor.addAssign( weights.element( i ).mul( getSample( { theta, axis, outputDirection, mipInt, envMap, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP } ) ) );\n\n\t} );\n\n\treturn vec4( gl_FragColor, 1 );\n\n} );\n\n// GGX VNDF importance sampling functions\n\n// Van der Corput radical inverse for generating quasi-random sequences\nconst radicalInverse_VdC = /*@__PURE__*/ Fn( ( [ bits_immutable ] ) => {\n\n\tconst bits = uint( bits_immutable ).toVar();\n\tbits.assign( bits.shiftLeft( uint( 16 ) ).bitOr( bits.shiftRight( uint( 16 ) ) ) );\n\tbits.assign( bits.bitAnd( uint( 0x55555555 ) ).shiftLeft( uint( 1 ) ).bitOr( bits.bitAnd( uint( 0xAAAAAAAA ) ).shiftRight( uint( 1 ) ) ) );\n\tbits.assign( bits.bitAnd( uint( 0x33333333 ) ).shiftLeft( uint( 2 ) ).bitOr( bits.bitAnd( uint( 0xCCCCCCCC ) ).shiftRight( uint( 2 ) ) ) );\n\tbits.assign( bits.bitAnd( uint( 0x0F0F0F0F ) ).shiftLeft( uint( 4 ) ).bitOr( bits.bitAnd( uint( 0xF0F0F0F0 ) ).shiftRight( uint( 4 ) ) ) );\n\tbits.assign( bits.bitAnd( uint( 0x00FF00FF ) ).shiftLeft( uint( 8 ) ).bitOr( bits.bitAnd( uint( 0xFF00FF00 ) ).shiftRight( uint( 8 ) ) ) );\n\treturn float( bits ).mul( 2.3283064365386963e-10 ); // / 0x100000000\n\n} );\n\n// Hammersley sequence for quasi-Monte Carlo sampling\nconst hammersley = /*@__PURE__*/ Fn( ( [ i, N ] ) => {\n\n\treturn vec2( float( i ).div( float( N ) ), radicalInverse_VdC( i ) );\n\n} );\n\n// GGX VNDF importance sampling (Eric Heitz 2018)\n// \"Sampling the GGX Distribution of Visible Normals\"\n// https://jcgt.org/published/0007/04/01/\nconst importanceSampleGGX_VNDF = /*@__PURE__*/ Fn( ( [ Xi, V_immutable, roughness_immutable ] ) => {\n\n\tconst V = vec3( V_immutable ).toVar();\n\tconst roughness = float( roughness_immutable );\n\tconst alpha = roughness.mul( roughness ).toVar();\n\n\t// Section 3.2: Transform view direction to hemisphere configuration\n\tconst Vh = normalize( vec3( alpha.mul( V.x ), alpha.mul( V.y ), V.z ) ).toVar();\n\n\t// Section 4.1: Orthonormal basis\n\tconst lensq = Vh.x.mul( Vh.x ).add( Vh.y.mul( Vh.y ) );\n\tconst T1 = select( lensq.greaterThan( 0.0 ), vec3( Vh.y.negate(), Vh.x, 0.0 ).div( sqrt( lensq ) ), vec3( 1.0, 0.0, 0.0 ) ).toVar();\n\tconst T2 = cross( Vh, T1 ).toVar();\n\n\t// Section 4.2: Parameterization of projected area\n\tconst r = sqrt( Xi.x );\n\tconst phi = mul( 2.0, 3.14159265359 ).mul( Xi.y );\n\tconst t1 = r.mul( cos( phi ) ).toVar();\n\tconst t2 = r.mul( sin( phi ) ).toVar();\n\tconst s = mul( 0.5, Vh.z.add( 1.0 ) );\n\tt2.assign( s.oneMinus().mul( sqrt( t1.mul( t1 ).oneMinus() ) ).add( s.mul( t2 ) ) );\n\n\t// Section 4.3: Reprojection onto hemisphere\n\tconst Nh = T1.mul( t1 ).add( T2.mul( t2 ) ).add( Vh.mul( sqrt( max$1( 0.0, t1.mul( t1 ).add( t2.mul( t2 ) ).oneMinus() ) ) ) );\n\n\t// Section 3.4: Transform back to ellipsoid configuration\n\treturn normalize( vec3( alpha.mul( Nh.x ), alpha.mul( Nh.y ), max$1( 0.0, Nh.z ) ) );\n\n} );\n\n// GGX convolution using VNDF importance sampling\nconst ggxConvolution = /*@__PURE__*/ Fn( ( { roughness, mipInt, envMap, N_immutable, GGX_SAMPLES, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP } ) => {\n\n\tconst N = vec3( N_immutable ).toVar();\n\n\tconst prefilteredColor = vec3( 0.0 ).toVar();\n\tconst totalWeight = float( 0.0 ).toVar();\n\n\t// For very low roughness, just sample the environment directly\n\tIf( roughness.lessThan( 0.001 ), () => {\n\n\t\tprefilteredColor.assign( bilinearCubeUV( envMap, N, mipInt, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP ) );\n\n\t} ).Else( () => {\n\n\t\t// Tangent space basis for VNDF sampling\n\t\tconst up = select( abs( N.z ).lessThan( 0.999 ), vec3( 0.0, 0.0, 1.0 ), vec3( 1.0, 0.0, 0.0 ) );\n\t\tconst tangent = normalize( cross( up, N ) ).toVar();\n\t\tconst bitangent = cross( N, tangent ).toVar();\n\n\t\tLoop( { start: uint( 0 ), end: GGX_SAMPLES }, ( { i } ) => {\n\n\t\t\tconst Xi = hammersley( i, GGX_SAMPLES );\n\n\t\t\t// For PMREM, V = N, so in tangent space V is always (0, 0, 1)\n\t\t\tconst H_tangent = importanceSampleGGX_VNDF( Xi, vec3( 0.0, 0.0, 1.0 ), roughness );\n\n\t\t\t// Transform H back to world space\n\t\t\tconst H = normalize( tangent.mul( H_tangent.x ).add( bitangent.mul( H_tangent.y ) ).add( N.mul( H_tangent.z ) ) );\n\t\t\tconst L = normalize( H.mul( dot( N, H ).mul( 2.0 ) ).sub( N ) );\n\n\t\t\tconst NdotL = max$1( dot( N, L ), 0.0 );\n\n\t\t\tIf( NdotL.greaterThan( 0.0 ), () => {\n\n\t\t\t\t// Sample environment at fixed mip level\n\t\t\t\t// VNDF importance sampling handles the distribution filtering\n\t\t\t\tconst sampleColor = bilinearCubeUV( envMap, L, mipInt, CUBEUV_TEXEL_WIDTH, CUBEUV_TEXEL_HEIGHT, CUBEUV_MAX_MIP );\n\n\t\t\t\t// Weight by NdotL for the split-sum approximation\n\t\t\t\t// VNDF PDF naturally accounts for the visible microfacet distribution\n\t\t\t\tprefilteredColor.addAssign( sampleColor.mul( NdotL ) );\n\t\t\t\ttotalWeight.addAssign( NdotL );\n\n\t\t\t} );\n\n\t\t} );\n\n\t\tIf( totalWeight.greaterThan( 0.0 ), () => {\n\n\t\t\tprefilteredColor.assign( prefilteredColor.div( totalWeight ) );\n\n\t\t} );\n\n\t} );\n\n\treturn vec4( prefilteredColor, 1.0 );\n\n} );\n\nconst LOD_MIN = 4;\n\n// The standard deviations (radians) associated with the extra mips.\n// Used for scene blur in fromScene() method.\nconst EXTRA_LOD_SIGMA = [ 0.125, 0.215, 0.35, 0.446, 0.526, 0.582 ];\n\n// The maximum length of the blur for loop. Smaller sigmas will use fewer\n// samples and exit early, but not recompile the shader.\n// Used for scene blur in fromScene() method.\nconst MAX_SAMPLES = 20;\n\n// GGX VNDF importance sampling configuration\nconst GGX_SAMPLES = 512;\n\nconst _flatCamera = /*@__PURE__*/ new OrthographicCamera( -1, 1, 1, -1, 0, 1 );\nconst _cubeCamera = /*@__PURE__*/ new PerspectiveCamera( 90, 1 );\nconst _clearColor$2 = /*@__PURE__*/ new Color();\nlet _oldTarget = null;\nlet _oldActiveCubeFace = 0;\nlet _oldActiveMipmapLevel = 0;\n\nconst _origin = /*@__PURE__*/ new Vector3();\n\n// maps blur materials to their uniforms dictionary\n\nconst _uniformsMap = new WeakMap();\n\n// WebGPU Face indices\nconst _faceLib = [\n\t3, 1, 5,\n\t0, 4, 2\n];\n\nconst _direction = /*@__PURE__*/ getDirection( uv$1(), attribute( 'faceIndex' ) ).normalize();\nconst _outputDirection = /*@__PURE__*/ vec3( _direction.x, _direction.y, _direction.z );\n\n/**\n * This class generates a Prefiltered, Mipmapped Radiance Environment Map\n * (PMREM) from a cubeMap environment texture. This allows different levels of\n * blur to be quickly accessed based on material roughness. It is packed into a\n * special CubeUV format that allows us to perform custom interpolation so that\n * we can support nonlinear formats such as RGBE. Unlike a traditional mipmap\n * chain, it only goes down to the LOD_MIN level (above), and then creates extra\n * even more filtered 'mips' at the same LOD_MIN resolution, associated with\n * higher roughness levels. In this way we maintain resolution to smoothly\n * interpolate diffuse lighting while limiting sampling computation.\n *\n * The prefiltering uses GGX VNDF (Visible Normal Distribution Function)\n * importance sampling based on \"Sampling the GGX Distribution of Visible Normals\"\n * (Heitz, 2018) to generate environment maps that accurately match the GGX BRDF\n * used in material rendering for physically-based image-based lighting.\n */\nclass PMREMGenerator {\n\n\t/**\n\t * Constructs a new PMREM generator.\n\t *\n\t * @param {Renderer} renderer - The renderer.\n\t */\n\tconstructor( renderer ) {\n\n\t\tthis._renderer = renderer;\n\t\tthis._pingPongRenderTarget = null;\n\n\t\tthis._lodMax = 0;\n\t\tthis._cubeSize = 0;\n\t\tthis._sizeLods = [];\n\t\tthis._sigmas = [];\n\t\tthis._lodMeshes = [];\n\n\t\tthis._blurMaterial = null;\n\t\tthis._ggxMaterial = null;\n\n\t\tthis._cubemapMaterial = null;\n\t\tthis._equirectMaterial = null;\n\t\tthis._backgroundBox = null;\n\n\t}\n\n\tget _hasInitialized() {\n\n\t\treturn this._renderer.hasInitialized();\n\n\t}\n\n\t/**\n\t * Generates a PMREM from a supplied Scene, which can be faster than using an\n\t * image if networking bandwidth is low. Optional sigma specifies a blur radius\n\t * in radians to be applied to the scene before PMREM generation. Optional near\n\t * and far planes ensure the scene is rendered in its entirety.\n\t *\n\t * @param {Scene} scene - The scene to be captured.\n\t * @param {number} [sigma=0] - The blur radius in radians.\n\t * @param {number} [near=0.1] - The near plane distance.\n\t * @param {number} [far=100] - The far plane distance.\n\t * @param {Object} [options={}] - The configuration options.\n\t * @param {number} [options.size=256] - The texture size of the PMREM.\n\t * @param {Vector3} [options.renderTarget=origin] - The position of the internal cube camera that renders the scene.\n\t * @param {?RenderTarget} [options.renderTarget=null] - The render target to use.\n\t * @return {RenderTarget} The resulting PMREM.\n\t * @see {@link PMREMGenerator#fromScene}\n\t */\n\tfromScene( scene, sigma = 0, near = 0.1, far = 100, options = {} ) {\n\n\t\tconst {\n\t\t\tsize = 256,\n\t\t\tposition = _origin,\n\t\t\trenderTarget = null,\n\t\t} = options;\n\n\t\tthis._setSize( size );\n\n\t\tif ( this._hasInitialized === false ) {\n\n\t\t\twarn( 'PMREMGenerator: \".fromScene()\" called before the backend is initialized. Try using \"await renderer.init()\" instead.' );\n\n\t\t\tconst cubeUVRenderTarget = renderTarget || this._allocateTarget();\n\n\t\t\toptions.renderTarget = cubeUVRenderTarget;\n\n\t\t\tthis.fromSceneAsync( scene, sigma, near, far, options );\n\n\t\t\treturn cubeUVRenderTarget;\n\n\t\t}\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\t_oldActiveCubeFace = this._renderer.getActiveCubeFace();\n\t\t_oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();\n\n\t\tconst cubeUVRenderTarget = renderTarget || this._allocateTarget();\n\t\tcubeUVRenderTarget.depthBuffer = true;\n\n\t\tthis._init( cubeUVRenderTarget );\n\n\t\tthis._sceneToCubeUV( scene, near, far, cubeUVRenderTarget, position );\n\n\t\tif ( sigma > 0 ) {\n\n\t\t\tthis._blur( cubeUVRenderTarget, 0, 0, sigma );\n\n\t\t}\n\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t/**\n\t * Generates a PMREM from a supplied Scene, which can be faster than using an\n\t * image if networking bandwidth is low. Optional sigma specifies a blur radius\n\t * in radians to be applied to the scene before PMREM generation. Optional near\n\t * and far planes ensure the scene is rendered in its entirety (the cubeCamera\n\t * is placed at the origin).\n\t *\n\t * @deprecated\n\t * @param {Scene} scene - The scene to be captured.\n\t * @param {number} [sigma=0] - The blur radius in radians.\n\t * @param {number} [near=0.1] - The near plane distance.\n\t * @param {number} [far=100] - The far plane distance.\n\t * @param {Object} [options={}] - The configuration options.\n\t * @param {number} [options.size=256] - The texture size of the PMREM.\n\t * @param {Vector3} [options.position=origin] - The position of the internal cube camera that renders the scene.\n\t * @param {?RenderTarget} [options.renderTarget=null] - The render target to use.\n\t * @return {Promise<RenderTarget>} A Promise that resolve with the PMREM when the generation has been finished.\n\t * @see {@link PMREMGenerator#fromScene}\n\t */\n\tasync fromSceneAsync( scene, sigma = 0, near = 0.1, far = 100, options = {} ) {\n\n\t\twarnOnce( 'PMREMGenerator: \".fromSceneAsync()\" is deprecated. Use \"await renderer.init()\" instead.' ); // @deprecated r181\n\n\t\tawait this._renderer.init();\n\n\t\treturn this.fromScene( scene, sigma, near, far, options );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an equirectangular texture, which can be either LDR\n\t * or HDR. The ideal input image size is 1k (1024 x 512),\n\t * as this matches best with the 256 x 256 cubemap output.\n\t *\n\t * @param {Texture} equirectangular - The equirectangular texture to be converted.\n\t * @param {?RenderTarget} [renderTarget=null] - The render target to use.\n\t * @return {RenderTarget} The resulting PMREM.\n\t * @see {@link PMREMGenerator#fromEquirectangularAsync}\n\t */\n\tfromEquirectangular( equirectangular, renderTarget = null ) {\n\n\t\tif ( this._hasInitialized === false ) {\n\n\t\t\twarn( 'PMREMGenerator: .fromEquirectangular() called before the backend is initialized. Try using \"await renderer.init()\" instead.' );\n\n\t\t\tthis._setSizeFromTexture( equirectangular );\n\n\t\t\tconst cubeUVRenderTarget = renderTarget || this._allocateTarget();\n\n\t\t\tthis.fromEquirectangularAsync( equirectangular, cubeUVRenderTarget );\n\n\t\t\treturn cubeUVRenderTarget;\n\n\t\t}\n\n\t\treturn this._fromTexture( equirectangular, renderTarget );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an equirectangular texture, which can be either LDR\n\t * or HDR. The ideal input image size is 1k (1024 x 512),\n\t * as this matches best with the 256 x 256 cubemap output.\n\t *\n\t * @deprecated\n\t * @param {Texture} equirectangular - The equirectangular texture to be converted.\n\t * @param {?RenderTarget} [renderTarget=null] - The render target to use.\n\t * @return {Promise<RenderTarget>} The resulting PMREM.\n\t * @see {@link PMREMGenerator#fromEquirectangular}\n\t */\n\tasync fromEquirectangularAsync( equirectangular, renderTarget = null ) {\n\n\t\twarnOnce( 'PMREMGenerator: \".fromEquirectangularAsync()\" is deprecated. Use \"await renderer.init()\" instead.' ); // @deprecated r181\n\n\t\tawait this._renderer.init();\n\n\t\treturn this._fromTexture( equirectangular, renderTarget );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an cubemap texture, which can be either LDR\n\t * or HDR. The ideal input cube size is 256 x 256,\n\t * as this matches best with the 256 x 256 cubemap output.\n\t *\n\t * @param {Texture} cubemap - The cubemap texture to be converted.\n\t * @param {?RenderTarget} [renderTarget=null] - The render target to use.\n\t * @return {RenderTarget} The resulting PMREM.\n\t * @see {@link PMREMGenerator#fromCubemapAsync}\n\t */\n\tfromCubemap( cubemap, renderTarget = null ) {\n\n\t\tif ( this._hasInitialized === false ) {\n\n\t\t\twarn( 'PMREMGenerator: .fromCubemap() called before the backend is initialized. Try using .fromCubemapAsync() instead.' );\n\n\t\t\tthis._setSizeFromTexture( cubemap );\n\n\t\t\tconst cubeUVRenderTarget = renderTarget || this._allocateTarget();\n\n\t\t\tthis.fromCubemapAsync( cubemap, renderTarget );\n\n\t\t\treturn cubeUVRenderTarget;\n\n\t\t}\n\n\t\treturn this._fromTexture( cubemap, renderTarget );\n\n\t}\n\n\t/**\n\t * Generates a PMREM from an cubemap texture, which can be either LDR\n\t * or HDR. The ideal input cube size is 256 x 256,\n\t * with the 256 x 256 cubemap output.\n\t *\n\t * @deprecated\n\t * @param {Texture} cubemap - The cubemap texture to be converted.\n\t * @param {?RenderTarget} [renderTarget=null] - The render target to use.\n\t * @return {Promise<RenderTarget>} The resulting PMREM.\n\t * @see {@link PMREMGenerator#fromCubemap}\n\t */\n\tasync fromCubemapAsync( cubemap, renderTarget = null ) {\n\n\t\twarnOnce( 'PMREMGenerator: \".fromCubemapAsync()\" is deprecated. Use \"await renderer.init()\" instead.' ); // @deprecated r181\n\n\t\tawait this._renderer.init();\n\n\t\treturn this._fromTexture( cubemap, renderTarget );\n\n\t}\n\n\t/**\n\t * Pre-compiles the cubemap shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t *\n\t * @returns {Promise}\n\t */\n\tasync compileCubemapShader() {\n\n\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\tthis._cubemapMaterial = _getCubemapMaterial();\n\t\t\tawait this._compileMaterial( this._cubemapMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Pre-compiles the equirectangular shader. You can get faster start-up by invoking this method during\n\t * your texture's network fetch for increased concurrency.\n\t *\n\t * @returns {Promise}\n\t */\n\tasync compileEquirectangularShader() {\n\n\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\tthis._equirectMaterial = _getEquirectMaterial();\n\t\t\tawait this._compileMaterial( this._equirectMaterial );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disposes of the PMREMGenerator's internal memory. Note that PMREMGenerator is a static class,\n\t * so you should not need more than one PMREMGenerator object. If you do, calling dispose() on\n\t * one of them will cause any others to also become unusable.\n\t */\n\tdispose() {\n\n\t\tthis._dispose();\n\n\t\tif ( this._cubemapMaterial !== null ) this._cubemapMaterial.dispose();\n\t\tif ( this._equirectMaterial !== null ) this._equirectMaterial.dispose();\n\t\tif ( this._backgroundBox !== null ) {\n\n\t\t\tthis._backgroundBox.geometry.dispose();\n\t\t\tthis._backgroundBox.material.dispose();\n\n\t\t}\n\n\t}\n\n\t// private interface\n\n\t_setSizeFromTexture( texture ) {\n\n\t\tif ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping ) {\n\n\t\t\tthis._setSize( texture.image.length === 0 ? 16 : ( texture.image[ 0 ].width || texture.image[ 0 ].image.width ) );\n\n\t\t} else { // Equirectangular\n\n\t\t\tthis._setSize( texture.image.width / 4 );\n\n\t\t}\n\n\t}\n\n\t_setSize( cubeSize ) {\n\n\t\tthis._lodMax = Math.floor( Math.log2( cubeSize ) );\n\t\tthis._cubeSize = Math.pow( 2, this._lodMax );\n\n\t}\n\n\t_dispose() {\n\n\t\tif ( this._blurMaterial !== null ) this._blurMaterial.dispose();\n\t\tif ( this._ggxMaterial !== null ) this._ggxMaterial.dispose();\n\n\t\tif ( this._pingPongRenderTarget !== null ) this._pingPongRenderTarget.dispose();\n\n\t\tfor ( let i = 0; i < this._lodMeshes.length; i ++ ) {\n\n\t\t\tthis._lodMeshes[ i ].geometry.dispose();\n\n\t\t}\n\n\t}\n\n\t_cleanup( outputTarget ) {\n\n\t\tthis._renderer.setRenderTarget( _oldTarget, _oldActiveCubeFace, _oldActiveMipmapLevel );\n\t\toutputTarget.scissorTest = false;\n\t\t_setViewport( outputTarget, 0, 0, outputTarget.width, outputTarget.height );\n\n\t}\n\n\t_fromTexture( texture, renderTarget ) {\n\n\t\tthis._setSizeFromTexture( texture );\n\n\t\t_oldTarget = this._renderer.getRenderTarget();\n\t\t_oldActiveCubeFace = this._renderer.getActiveCubeFace();\n\t\t_oldActiveMipmapLevel = this._renderer.getActiveMipmapLevel();\n\n\t\tconst cubeUVRenderTarget = renderTarget || this._allocateTarget();\n\t\tthis._init( cubeUVRenderTarget );\n\t\tthis._textureToCubeUV( texture, cubeUVRenderTarget );\n\t\tthis._applyPMREM( cubeUVRenderTarget );\n\t\tthis._cleanup( cubeUVRenderTarget );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_allocateTarget() {\n\n\t\tconst width = 3 * Math.max( this._cubeSize, 16 * 7 );\n\t\tconst height = 4 * this._cubeSize;\n\n\t\tconst cubeUVRenderTarget = _createRenderTarget( width, height );\n\n\t\treturn cubeUVRenderTarget;\n\n\t}\n\n\t_init( renderTarget ) {\n\n\t\tif ( this._pingPongRenderTarget === null || this._pingPongRenderTarget.width !== renderTarget.width || this._pingPongRenderTarget.height !== renderTarget.height ) {\n\n\t\t\tif ( this._pingPongRenderTarget !== null ) {\n\n\t\t\t\tthis._dispose();\n\n\t\t\t}\n\n\t\t\tthis._pingPongRenderTarget = _createRenderTarget( renderTarget.width, renderTarget.height );\n\n\t\t\tconst { _lodMax } = this;\n\t\t\t( { lodMeshes: this._lodMeshes, sizeLods: this._sizeLods, sigmas: this._sigmas } = _createPlanes( _lodMax ) );\n\n\t\t\tthis._blurMaterial = _getBlurShader( _lodMax, renderTarget.width, renderTarget.height );\n\t\t\tthis._ggxMaterial = _getGGXShader( _lodMax, renderTarget.width, renderTarget.height );\n\n\t\t}\n\n\t}\n\n\tasync _compileMaterial( material ) {\n\n\t\tconst mesh = new Mesh( new BufferGeometry(), material );\n\t\tawait this._renderer.compile( mesh, _flatCamera );\n\n\t}\n\n\t_sceneToCubeUV( scene, near, far, cubeUVRenderTarget, position ) {\n\n\t\tconst cubeCamera = _cubeCamera;\n\t\tcubeCamera.near = near;\n\t\tcubeCamera.far = far;\n\n\t\t// px, py, pz, nx, ny, nz\n\t\tconst upSign = [ 1, 1, 1, 1, -1, 1 ];\n\t\tconst forwardSign = [ 1, -1, 1, -1, 1, -1 ];\n\n\t\tconst renderer = this._renderer;\n\n\t\tconst originalAutoClear = renderer.autoClear;\n\n\t\trenderer.getClearColor( _clearColor$2 );\n\n\t\trenderer.autoClear = false;\n\n\t\tif ( this._backgroundBox === null ) {\n\n\t\t\tthis._backgroundBox = new Mesh(\n\t\t\t\tnew BoxGeometry(),\n\t\t\t\tnew MeshBasicMaterial( {\n\t\t\t\t\tname: 'PMREM.Background',\n\t\t\t\t\tside: BackSide,\n\t\t\t\t\tdepthWrite: false,\n\t\t\t\t\tdepthTest: false,\n\t\t\t\t} )\n\t\t\t);\n\n\t\t}\n\n\t\tconst backgroundBox = this._backgroundBox;\n\t\tconst backgroundMaterial = backgroundBox.material;\n\n\t\tlet useSolidColor = false;\n\n\t\tconst background = scene.background;\n\n\t\tif ( background ) {\n\n\t\t\tif ( background.isColor ) {\n\n\t\t\t\tbackgroundMaterial.color.copy( background );\n\t\t\t\tscene.background = null;\n\t\t\t\tuseSolidColor = true;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tbackgroundMaterial.color.copy( _clearColor$2 );\n\t\t\tuseSolidColor = true;\n\n\t\t}\n\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\n\t\trenderer.clear();\n\n\t\tif ( useSolidColor ) {\n\n\t\t\trenderer.render( backgroundBox, cubeCamera );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst col = i % 3;\n\n\t\t\tif ( col === 0 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.position.set( position.x, position.y, position.z );\n\t\t\t\tcubeCamera.lookAt( position.x + forwardSign[ i ], position.y, position.z );\n\n\t\t\t} else if ( col === 1 ) {\n\n\t\t\t\tcubeCamera.up.set( 0, 0, upSign[ i ] );\n\t\t\t\tcubeCamera.position.set( position.x, position.y, position.z );\n\t\t\t\tcubeCamera.lookAt( position.x, position.y + forwardSign[ i ], position.z );\n\n\n\t\t\t} else {\n\n\t\t\t\tcubeCamera.up.set( 0, upSign[ i ], 0 );\n\t\t\t\tcubeCamera.position.set( position.x, position.y, position.z );\n\t\t\t\tcubeCamera.lookAt( position.x, position.y, position.z + forwardSign[ i ] );\n\n\n\t\t\t}\n\n\t\t\tconst size = this._cubeSize;\n\n\t\t\t_setViewport( cubeUVRenderTarget, col * size, i > 2 ? size : 0, size, size );\n\n\t\t\trenderer.render( scene, cubeCamera );\n\n\t\t}\n\n\t\trenderer.autoClear = originalAutoClear;\n\t\tscene.background = background;\n\n\t}\n\n\t_textureToCubeUV( texture, cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\n\t\tconst isCubeTexture = ( texture.mapping === CubeReflectionMapping || texture.mapping === CubeRefractionMapping );\n\n\t\tif ( isCubeTexture ) {\n\n\t\t\tif ( this._cubemapMaterial === null ) {\n\n\t\t\t\tthis._cubemapMaterial = _getCubemapMaterial( texture );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( this._equirectMaterial === null ) {\n\n\t\t\t\tthis._equirectMaterial = _getEquirectMaterial( texture );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst material = isCubeTexture ? this._cubemapMaterial : this._equirectMaterial;\n\t\tmaterial.fragmentNode.value = texture;\n\n\t\tconst mesh = this._lodMeshes[ 0 ];\n\t\tmesh.material = material;\n\n\t\tconst size = this._cubeSize;\n\n\t\t_setViewport( cubeUVRenderTarget, 0, 0, 3 * size, 2 * size );\n\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\trenderer.render( mesh, _flatCamera );\n\n\t}\n\n\t_applyPMREM( cubeUVRenderTarget ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst autoClear = renderer.autoClear;\n\t\trenderer.autoClear = false;\n\n\t\tconst n = this._lodMeshes.length;\n\n\t\t// Use GGX VNDF importance sampling\n\t\tfor ( let i = 1; i < n; i ++ ) {\n\n\t\t\tthis._applyGGXFilter( cubeUVRenderTarget, i - 1, i );\n\n\t\t}\n\n\t\trenderer.autoClear = autoClear;\n\n\t}\n\n\t/**\n\t * Applies GGX VNDF importance sampling filter to generate a prefiltered environment map.\n\t * Uses Monte Carlo integration with VNDF importance sampling to accurately represent the\n\t * GGX BRDF for physically-based rendering. Reads from the previous LOD level and\n\t * applies incremental roughness filtering to avoid over-blurring.\n\t *\n\t * @private\n\t * @param {RenderTarget} cubeUVRenderTarget\n\t * @param {number} lodIn - Source LOD level to read from\n\t * @param {number} lodOut - Target LOD level to write to\n\t */\n\t_applyGGXFilter( cubeUVRenderTarget, lodIn, lodOut ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst pingPongRenderTarget = this._pingPongRenderTarget;\n\n\t\tconst ggxMaterial = this._ggxMaterial;\n\t\tconst ggxMesh = this._lodMeshes[ lodOut ];\n\t\tggxMesh.material = ggxMaterial;\n\n\t\tconst ggxUniforms = _uniformsMap.get( ggxMaterial );\n\n\t\t// Calculate incremental roughness between LOD levels\n\t\tconst targetRoughness = lodOut / ( this._lodMeshes.length - 1 );\n\t\tconst sourceRoughness = lodIn / ( this._lodMeshes.length - 1 );\n\t\tconst incrementalRoughness = Math.sqrt( targetRoughness * targetRoughness - sourceRoughness * sourceRoughness );\n\n\t\t// Apply blur strength mapping for better quality across the roughness range\n\t\tconst blurStrength = 0.0 + targetRoughness * 1.25;\n\t\tconst adjustedRoughness = incrementalRoughness * blurStrength;\n\n\t\t// Calculate viewport position based on output LOD level\n\t\tconst { _lodMax } = this;\n\t\tconst outputSize = this._sizeLods[ lodOut ];\n\t\tconst x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 );\n\t\tconst y = 4 * ( this._cubeSize - outputSize );\n\n\t\t// Read from previous LOD with incremental roughness\n\t\tcubeUVRenderTarget.texture.frame = ( cubeUVRenderTarget.texture.frame || 0 ) + 1;\n\t\tggxUniforms.envMap.value = cubeUVRenderTarget.texture;\n\t\tggxUniforms.roughness.value = adjustedRoughness;\n\t\tggxUniforms.mipInt.value = _lodMax - lodIn; // Sample from input LOD\n\n\t\t_setViewport( pingPongRenderTarget, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( pingPongRenderTarget );\n\t\trenderer.render( ggxMesh, _flatCamera );\n\n\t\t// Copy from pingPong back to cubeUV (simple direct copy)\n\t\tpingPongRenderTarget.texture.frame = ( pingPongRenderTarget.texture.frame || 0 ) + 1;\n\t\tggxUniforms.envMap.value = pingPongRenderTarget.texture;\n\t\tggxUniforms.roughness.value = 0.0; // Direct copy\n\t\tggxUniforms.mipInt.value = _lodMax - lodOut; // Read from the level we just wrote\n\n\t\t_setViewport( cubeUVRenderTarget, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( cubeUVRenderTarget );\n\t\trenderer.render( ggxMesh, _flatCamera );\n\n\t}\n\n\t/**\n\t * This is a two-pass Gaussian blur for a cubemap. Normally this is done\n\t * vertically and horizontally, but this breaks down on a cube. Here we apply\n\t * the blur latitudinally (around the poles), and then longitudinally (towards\n\t * the poles) to approximate the orthogonally-separable blur. It is least\n\t * accurate at the poles, but still does a decent job.\n\t *\n\t * Used for initial scene blur in fromScene() method when sigma > 0.\n\t *\n\t * @private\n\t * @param {RenderTarget} cubeUVRenderTarget - The cubemap render target.\n\t * @param {number} lodIn - The input level-of-detail.\n\t * @param {number} lodOut - The output level-of-detail.\n\t * @param {number} sigma - The blur radius in radians.\n\t * @param {Vector3} [poleAxis] - The pole axis.\n\t */\n\t_blur( cubeUVRenderTarget, lodIn, lodOut, sigma, poleAxis ) {\n\n\t\tconst pingPongRenderTarget = this._pingPongRenderTarget;\n\n\t\tthis._halfBlur(\n\t\t\tcubeUVRenderTarget,\n\t\t\tpingPongRenderTarget,\n\t\t\tlodIn,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'latitudinal',\n\t\t\tpoleAxis );\n\n\t\tthis._halfBlur(\n\t\t\tpingPongRenderTarget,\n\t\t\tcubeUVRenderTarget,\n\t\t\tlodOut,\n\t\t\tlodOut,\n\t\t\tsigma,\n\t\t\t'longitudinal',\n\t\t\tpoleAxis );\n\n\t}\n\n\t_halfBlur( targetIn, targetOut, lodIn, lodOut, sigmaRadians, direction, poleAxis ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst blurMaterial = this._blurMaterial;\n\n\t\tif ( direction !== 'latitudinal' && direction !== 'longitudinal' ) {\n\n\t\t\terror( 'blur direction must be either latitudinal or longitudinal!' );\n\n\t\t}\n\n\t\t// Number of standard deviations at which to cut off the discrete approximation.\n\t\tconst STANDARD_DEVIATIONS = 3;\n\n\t\tconst blurMesh = this._lodMeshes[ lodOut ];\n\t\tblurMesh.material = blurMaterial;\n\n\t\tconst blurUniforms = _uniformsMap.get( blurMaterial );\n\n\t\tconst pixels = this._sizeLods[ lodIn ] - 1;\n\t\tconst radiansPerPixel = isFinite( sigmaRadians ) ? Math.PI / ( 2 * pixels ) : 2 * Math.PI / ( 2 * MAX_SAMPLES - 1 );\n\t\tconst sigmaPixels = sigmaRadians / radiansPerPixel;\n\t\tconst samples = isFinite( sigmaRadians ) ? 1 + Math.floor( STANDARD_DEVIATIONS * sigmaPixels ) : MAX_SAMPLES;\n\n\t\tif ( samples > MAX_SAMPLES ) {\n\n\t\t\twarn( `sigmaRadians, ${\n\t\t\t\tsigmaRadians}, is too large and will clip, as it requested ${\n\t\t\t\tsamples} samples when the maximum is set to ${MAX_SAMPLES}` );\n\n\t\t}\n\n\t\tconst weights = [];\n\t\tlet sum = 0;\n\n\t\tfor ( let i = 0; i < MAX_SAMPLES; ++ i ) {\n\n\t\t\tconst x = i / sigmaPixels;\n\t\t\tconst weight = Math.exp( - x * x / 2 );\n\t\t\tweights.push( weight );\n\n\t\t\tif ( i === 0 ) {\n\n\t\t\t\tsum += weight;\n\n\t\t\t} else if ( i < samples ) {\n\n\t\t\t\tsum += 2 * weight;\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( let i = 0; i < weights.length; i ++ ) {\n\n\t\t\tweights[ i ] = weights[ i ] / sum;\n\n\t\t}\n\n\t\ttargetIn.texture.frame = ( targetIn.texture.frame || 0 ) + 1;\n\n\t\tblurUniforms.envMap.value = targetIn.texture;\n\t\tblurUniforms.samples.value = samples;\n\t\tblurUniforms.weights.array = weights;\n\t\tblurUniforms.latitudinal.value = direction === 'latitudinal' ? 1 : 0;\n\n\t\tif ( poleAxis ) {\n\n\t\t\tblurUniforms.poleAxis.value = poleAxis;\n\n\t\t}\n\n\t\tconst { _lodMax } = this;\n\t\tblurUniforms.dTheta.value = radiansPerPixel;\n\t\tblurUniforms.mipInt.value = _lodMax - lodIn;\n\n\t\tconst outputSize = this._sizeLods[ lodOut ];\n\t\tconst x = 3 * outputSize * ( lodOut > _lodMax - LOD_MIN ? lodOut - _lodMax + LOD_MIN : 0 );\n\t\tconst y = 4 * ( this._cubeSize - outputSize );\n\n\t\t_setViewport( targetOut, x, y, 3 * outputSize, 2 * outputSize );\n\t\trenderer.setRenderTarget( targetOut );\n\t\trenderer.render( blurMesh, _flatCamera );\n\n\t}\n\n}\n\nfunction _createPlanes( lodMax ) {\n\n\tconst sizeLods = [];\n\tconst sigmas = [];\n\tconst lodMeshes = [];\n\n\tlet lod = lodMax;\n\n\tconst totalLods = lodMax - LOD_MIN + 1 + EXTRA_LOD_SIGMA.length;\n\n\tfor ( let i = 0; i < totalLods; i ++ ) {\n\n\t\tconst sizeLod = Math.pow( 2, lod );\n\t\tsizeLods.push( sizeLod );\n\t\tlet sigma = 1.0 / sizeLod;\n\n\t\tif ( i > lodMax - LOD_MIN ) {\n\n\t\t\tsigma = EXTRA_LOD_SIGMA[ i - lodMax + LOD_MIN - 1 ];\n\n\t\t} else if ( i === 0 ) {\n\n\t\t\tsigma = 0;\n\n\t\t}\n\n\t\tsigmas.push( sigma );\n\n\t\tconst texelSize = 1.0 / ( sizeLod - 2 );\n\t\tconst min = - texelSize;\n\t\tconst max = 1 + texelSize;\n\t\tconst uv1 = [ min, min, max, min, max, max, min, min, max, max, min, max ];\n\n\t\tconst cubeFaces = 6;\n\t\tconst vertices = 6;\n\t\tconst positionSize = 3;\n\t\tconst uvSize = 2;\n\t\tconst faceIndexSize = 1;\n\n\t\tconst position = new Float32Array( positionSize * vertices * cubeFaces );\n\t\tconst uv = new Float32Array( uvSize * vertices * cubeFaces );\n\t\tconst faceIndex = new Float32Array( faceIndexSize * vertices * cubeFaces );\n\n\t\tfor ( let face = 0; face < cubeFaces; face ++ ) {\n\n\t\t\tconst x = ( face % 3 ) * 2 / 3 - 1;\n\t\t\tconst y = face > 2 ? 0 : -1;\n\t\t\tconst coordinates = [\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y, 0,\n\t\t\t\tx + 2 / 3, y + 1, 0,\n\t\t\t\tx, y + 1, 0\n\t\t\t];\n\n\t\t\tconst faceIdx = _faceLib[ face ];\n\t\t\tposition.set( coordinates, positionSize * vertices * faceIdx );\n\t\t\tuv.set( uv1, uvSize * vertices * faceIdx );\n\t\t\tconst fill = [ faceIdx, faceIdx, faceIdx, faceIdx, faceIdx, faceIdx ];\n\t\t\tfaceIndex.set( fill, faceIndexSize * vertices * faceIdx );\n\n\t\t}\n\n\t\tconst planes = new BufferGeometry();\n\t\tplanes.setAttribute( 'position', new BufferAttribute( position, positionSize ) );\n\t\tplanes.setAttribute( 'uv', new BufferAttribute( uv, uvSize ) );\n\t\tplanes.setAttribute( 'faceIndex', new BufferAttribute( faceIndex, faceIndexSize ) );\n\t\tlodMeshes.push( new Mesh( planes, null ) );\n\n\t\tif ( lod > LOD_MIN ) {\n\n\t\t\tlod --;\n\n\t\t}\n\n\t}\n\n\treturn { lodMeshes, sizeLods, sigmas };\n\n}\n\nfunction _createRenderTarget( width, height ) {\n\n\tconst params = {\n\t\tmagFilter: LinearFilter,\n\t\tminFilter: LinearFilter,\n\t\tgenerateMipmaps: false,\n\t\ttype: HalfFloatType,\n\t\tformat: RGBAFormat,\n\t\tcolorSpace: LinearSRGBColorSpace,\n\t\t//depthBuffer: false\n\t};\n\n\tconst cubeUVRenderTarget = new RenderTarget( width, height, params );\n\tcubeUVRenderTarget.texture.mapping = CubeUVReflectionMapping;\n\tcubeUVRenderTarget.texture.name = 'PMREM.cubeUv';\n\tcubeUVRenderTarget.texture.isPMREMTexture = true;\n\tcubeUVRenderTarget.scissorTest = true;\n\treturn cubeUVRenderTarget;\n\n}\n\nfunction _setViewport( target, x, y, width, height ) {\n\n\ttarget.viewport.set( x, y, width, height );\n\ttarget.scissor.set( x, y, width, height );\n\n}\n\nfunction _getMaterial( type ) {\n\n\tconst material = new NodeMaterial();\n\tmaterial.depthTest = false;\n\tmaterial.depthWrite = false;\n\tmaterial.blending = NoBlending;\n\tmaterial.name = `PMREM_${ type }`;\n\n\treturn material;\n\n}\n\nfunction _getBlurShader( lodMax, width, height ) {\n\n\tconst weights = uniformArray( new Array( MAX_SAMPLES ).fill( 0 ) );\n\tconst poleAxis = uniform( new Vector3( 0, 1, 0 ) );\n\tconst dTheta = uniform( 0 );\n\tconst n = float( MAX_SAMPLES );\n\tconst latitudinal = uniform( 0 ); // false, bool\n\tconst samples = uniform( 1 ); // int\n\tconst envMap = texture();\n\tconst mipInt = uniform( 0 ); // int\n\tconst CUBEUV_TEXEL_WIDTH = float( 1 / width );\n\tconst CUBEUV_TEXEL_HEIGHT = float( 1 / height );\n\tconst CUBEUV_MAX_MIP = float( lodMax );\n\n\tconst materialUniforms = {\n\t\tn,\n\t\tlatitudinal,\n\t\tweights,\n\t\tpoleAxis,\n\t\toutputDirection: _outputDirection,\n\t\tdTheta,\n\t\tsamples,\n\t\tenvMap,\n\t\tmipInt,\n\t\tCUBEUV_TEXEL_WIDTH,\n\t\tCUBEUV_TEXEL_HEIGHT,\n\t\tCUBEUV_MAX_MIP\n\t};\n\n\tconst material = _getMaterial( 'blur' );\n\tmaterial.fragmentNode = blur( { ...materialUniforms, latitudinal: latitudinal.equal( 1 ) } );\n\n\t_uniformsMap.set( material, materialUniforms );\n\n\treturn material;\n\n}\n\nfunction _getGGXShader( lodMax, width, height ) {\n\n\tconst envMap = texture();\n\tconst roughness = uniform( 0 );\n\tconst mipInt = uniform( 0 );\n\tconst CUBEUV_TEXEL_WIDTH = float( 1 / width );\n\tconst CUBEUV_TEXEL_HEIGHT = float( 1 / height );\n\tconst CUBEUV_MAX_MIP = float( lodMax );\n\n\tconst materialUniforms = {\n\t\tenvMap,\n\t\troughness,\n\t\tmipInt,\n\t\tCUBEUV_TEXEL_WIDTH,\n\t\tCUBEUV_TEXEL_HEIGHT,\n\t\tCUBEUV_MAX_MIP\n\t};\n\n\tconst material = _getMaterial( 'ggx' );\n\tmaterial.fragmentNode = ggxConvolution( {\n\t\t...materialUniforms,\n\t\tN_immutable: _outputDirection,\n\t\tGGX_SAMPLES: uint( GGX_SAMPLES )\n\t} );\n\n\t_uniformsMap.set( material, materialUniforms );\n\n\treturn material;\n\n}\n\nfunction _getCubemapMaterial( envTexture ) {\n\n\tconst material = _getMaterial( 'cubemap' );\n\tmaterial.fragmentNode = cubeTexture( envTexture, _outputDirection );\n\n\treturn material;\n\n}\n\nfunction _getEquirectMaterial( envTexture ) {\n\n\tconst material = _getMaterial( 'equirect' );\n\tmaterial.fragmentNode = texture( envTexture, equirectUV( _outputDirection ), 0 );\n\n\treturn material;\n\n}\n\nconst _cache = new WeakMap();\n\n/**\n * Generates the cubeUV size based on the given image height.\n *\n * @private\n * @param {number} imageHeight - The image height.\n * @return {{texelWidth: number,texelHeight: number, maxMip: number}} The result object.\n */\nfunction _generateCubeUVSize( imageHeight ) {\n\n\tconst maxMip = Math.log2( imageHeight ) - 2;\n\n\tconst texelHeight = 1.0 / imageHeight;\n\n\tconst texelWidth = 1.0 / ( 3 * Math.max( Math.pow( 2, maxMip ), 7 * 16 ) );\n\n\treturn { texelWidth, texelHeight, maxMip };\n\n}\n\n/**\n * Generates a PMREM from the given texture.\n *\n * @private\n * @param {Texture} texture - The texture to create the PMREM for.\n * @param {Renderer} renderer - The renderer.\n * @param {PMREMGenerator} generator - The PMREM generator.\n * @return {?Texture} The PMREM.\n */\nfunction _getPMREMFromTexture( texture, renderer, generator ) {\n\n\tconst cache = _getCache( renderer );\n\n\tlet cacheTexture = cache.get( texture );\n\n\tconst pmremVersion = cacheTexture !== undefined ? cacheTexture.pmremVersion : -1;\n\n\tif ( pmremVersion !== texture.pmremVersion ) {\n\n\t\tconst image = texture.image;\n\n\t\tif ( texture.isCubeTexture ) {\n\n\t\t\tif ( isCubeMapReady( image ) ) {\n\n\t\t\t\tcacheTexture = generator.fromCubemap( texture, cacheTexture );\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\n\t\t} else {\n\n\t\t\tif ( isEquirectangularMapReady( image ) ) {\n\n\t\t\t\tcacheTexture = generator.fromEquirectangular( texture, cacheTexture );\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tcacheTexture.pmremVersion = texture.pmremVersion;\n\n\t\tcache.set( texture, cacheTexture );\n\n\t}\n\n\treturn cacheTexture.texture;\n\n}\n\n/**\n * Returns a cache that stores generated PMREMs for the respective textures.\n * A cache must be maintained per renderer since PMREMs are render target textures\n * which can't be shared across render contexts.\n *\n * @private\n * @param {Renderer} renderer - The renderer.\n * @return {WeakMap<Texture, Texture>} The PMREM cache.\n */\nfunction _getCache( renderer ) {\n\n\tlet rendererCache = _cache.get( renderer );\n\n\tif ( rendererCache === undefined ) {\n\n\t\trendererCache = new WeakMap();\n\t\t_cache.set( renderer, rendererCache );\n\n\t}\n\n\treturn rendererCache;\n\n}\n\n/**\n * This node represents a PMREM which is a special type of preprocessed\n * environment map intended for PBR materials.\n *\n * ```js\n * const material = new MeshStandardNodeMaterial();\n * material.envNode = pmremTexture( envMap );\n * ```\n *\n * @augments TempNode\n */\nclass PMREMNode extends TempNode {\n\n\tstatic get type() {\n\n\t\treturn 'PMREMNode';\n\n\t}\n\n\t/**\n\t * Constructs a new function overloading node.\n\t *\n\t * @param {Texture} value - The input texture.\n\t * @param {Node<vec2>} [uvNode=null] - The uv node.\n\t * @param {Node<float>} [levelNode=null] - The level node.\n\t */\n\tconstructor( value, uvNode = null, levelNode = null ) {\n\n\t\tsuper( 'vec3' );\n\n\t\t/**\n\t\t * Reference to the input texture.\n\t\t *\n\t\t * @private\n\t\t * @type {Texture}\n\t\t */\n\t\tthis._value = value;\n\n\t\t/**\n\t\t * Reference to the generated PMREM.\n\t\t *\n\t\t * @private\n\t\t * @type {Texture | null}\n\t\t * @default null\n\t\t */\n\t\tthis._pmrem = null;\n\n\t\t/**\n\t\t *  The uv node.\n\t\t *\n\t\t * @type {Node<vec2>}\n\t\t */\n\t\tthis.uvNode = uvNode;\n\n\t\t/**\n\t\t *  The level node.\n\t\t *\n\t\t * @type {Node<float>}\n\t\t */\n\t\tthis.levelNode = levelNode;\n\n\t\t/**\n\t\t * Reference to a PMREM generator.\n\t\t *\n\t\t * @private\n\t\t * @type {?PMREMGenerator}\n\t\t * @default null\n\t\t */\n\t\tthis._generator = null;\n\n\t\tconst defaultTexture = new Texture();\n\t\tdefaultTexture.isRenderTargetTexture = true;\n\n\t\t/**\n\t\t * The texture node holding the generated PMREM.\n\t\t *\n\t\t * @private\n\t\t * @type {TextureNode}\n\t\t */\n\t\tthis._texture = texture( defaultTexture );\n\n\t\t/**\n\t\t * A uniform representing the PMREM's width.\n\t\t *\n\t\t * @private\n\t\t * @type {UniformNode<float>}\n\t\t */\n\t\tthis._width = uniform( 0 );\n\n\t\t/**\n\t\t * A uniform representing the PMREM's height.\n\t\t *\n\t\t * @private\n\t\t * @type {UniformNode<float>}\n\t\t */\n\t\tthis._height = uniform( 0 );\n\n\t\t/**\n\t\t * A uniform representing the PMREM's max Mip.\n\t\t *\n\t\t * @private\n\t\t * @type {UniformNode<float>}\n\t\t */\n\t\tthis._maxMip = uniform( 0 );\n\n\t\t/**\n\t\t * The `updateBeforeType` is set to `NodeUpdateType.RENDER`.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'render'\n\t\t */\n\t\tthis.updateBeforeType = NodeUpdateType.RENDER;\n\n\t}\n\n\tset value( value ) {\n\n\t\tthis._value = value;\n\t\tthis._pmrem = null;\n\n\t}\n\n\t/**\n\t * The node's texture value.\n\t *\n\t * @type {Texture}\n\t */\n\tget value() {\n\n\t\treturn this._value;\n\n\t}\n\n\t/**\n\t * Uses the given PMREM texture to update internal values.\n\t *\n\t * @param {Texture} texture - The PMREM texture.\n\t */\n\tupdateFromTexture( texture ) {\n\n\t\tconst cubeUVSize = _generateCubeUVSize( texture.image.height );\n\n\t\tthis._texture.value = texture;\n\t\tthis._width.value = cubeUVSize.texelWidth;\n\t\tthis._height.value = cubeUVSize.texelHeight;\n\t\tthis._maxMip.value = cubeUVSize.maxMip;\n\n\t}\n\n\tupdateBefore( frame ) {\n\n\t\tlet pmrem = this._pmrem;\n\n\t\tconst pmremVersion = pmrem ? pmrem.pmremVersion : -1;\n\t\tconst texture = this._value;\n\n\t\tif ( pmremVersion !== texture.pmremVersion ) {\n\n\t\t\tif ( texture.isPMREMTexture === true ) {\n\n\t\t\t\tpmrem = texture;\n\n\t\t\t} else {\n\n\t\t\t\tpmrem = _getPMREMFromTexture( texture, frame.renderer, this._generator );\n\n\t\t\t}\n\n\t\t\tif ( pmrem !== null ) {\n\n\t\t\t\tthis._pmrem = pmrem;\n\n\t\t\t\tthis.updateFromTexture( pmrem );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\tsetup( builder ) {\n\n\t\tif ( this._generator === null ) {\n\n\t\t\tthis._generator = new PMREMGenerator( builder.renderer );\n\n\t\t}\n\n\t\tthis.updateBefore( builder );\n\n\t\t//\n\n\t\tlet uvNode = this.uvNode;\n\n\t\tif ( uvNode === null && builder.context.getUV ) {\n\n\t\t\tuvNode = builder.context.getUV( this, builder );\n\n\t\t}\n\n\t\t//\n\n\t\tuvNode = materialEnvRotation.mul( vec3( uvNode.x, uvNode.y.negate(), uvNode.z ) );\n\n\t\t//\n\n\t\tlet levelNode = this.levelNode;\n\n\t\tif ( levelNode === null && builder.context.getTextureLevel ) {\n\n\t\t\tlevelNode = builder.context.getTextureLevel( this );\n\n\t\t}\n\n\t\t//\n\n\t\treturn textureCubeUV( this._texture, uvNode, levelNode, this._width, this._height, this._maxMip );\n\n\t}\n\n\tdispose() {\n\n\t\tsuper.dispose();\n\n\t\tif ( this._generator !== null ) this._generator.dispose();\n\n\t}\n\n}\n\n/**\n * Returns `true` if the given cube map image has been fully loaded.\n *\n * @private\n * @param {?Array<(Image|Object)>} [image] - The cube map image.\n * @return {boolean} Whether the given cube map is ready or not.\n */\nfunction isCubeMapReady( image ) {\n\n\tif ( image === null || image === undefined ) return false;\n\n\tlet count = 0;\n\tconst length = 6;\n\n\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\tif ( image[ i ] !== undefined ) count ++;\n\n\t}\n\n\treturn count === length;\n\n\n}\n\n/**\n * Returns `true` if the given equirectangular image has been fully loaded.\n *\n * @private\n * @param {(Image|Object)} image - The equirectangular image.\n * @return {boolean} Whether the given cube map is ready or not.\n */\nfunction isEquirectangularMapReady( image ) {\n\n\tif ( image === null || image === undefined ) return false;\n\n\treturn image.height > 0;\n\n}\n\n/**\n * TSL function for creating a PMREM node.\n *\n * @tsl\n * @function\n * @param {Texture} value - The input texture.\n * @param {?Node<vec2>} [uvNode=null] - The uv node.\n * @param {?Node<float>} [levelNode=null] - The level node.\n * @returns {PMREMNode}\n */\nconst pmremTexture = /*@__PURE__*/ nodeProxy( PMREMNode ).setParameterLength( 1, 3 );\n\nconst _envNodeCache = new WeakMap();\n\n/**\n * Represents a physical model for Image-based lighting (IBL). The environment\n * is defined via environment maps in the equirectangular, cube map or cubeUV (PMREM) format.\n * `EnvironmentNode` is intended for PBR materials like {@link MeshStandardNodeMaterial}.\n *\n * @augments LightingNode\n */\nclass EnvironmentNode extends LightingNode {\n\n\tstatic get type() {\n\n\t\treturn 'EnvironmentNode';\n\n\t}\n\n\t/**\n\t * Constructs a new environment node.\n\t *\n\t * @param {Node} [envNode=null] - A node representing the environment.\n\t */\n\tconstructor( envNode = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * A node representing the environment.\n\t\t *\n\t\t * @type {?Node}\n\t\t * @default null\n\t\t */\n\t\tthis.envNode = envNode;\n\n\t}\n\n\tsetup( builder ) {\n\n\t\tconst { material } = builder;\n\n\t\tlet envNode = this.envNode;\n\n\t\tif ( envNode.isTextureNode || envNode.isMaterialReferenceNode ) {\n\n\t\t\tconst value = ( envNode.isTextureNode ) ? envNode.value : material[ envNode.property ];\n\n\t\t\tlet cacheEnvNode = _envNodeCache.get( value );\n\n\t\t\tif ( cacheEnvNode === undefined ) {\n\n\t\t\t\tcacheEnvNode = pmremTexture( value );\n\n\t\t\t\t_envNodeCache.set( value, cacheEnvNode );\n\n\t\t\t}\n\n\t\t\tenvNode\t= cacheEnvNode;\n\n\t\t}\n\n\t\t//\n\n\t\tconst useAnisotropy = material.useAnisotropy === true || material.anisotropy > 0;\n\t\tconst radianceNormalView = useAnisotropy ? bentNormalView : normalView;\n\n\t\tconst radiance = envNode.context( createRadianceContext( roughness, radianceNormalView ) ).mul( materialEnvIntensity );\n\t\tconst irradiance = envNode.context( createIrradianceContext( normalWorld ) ).mul( Math.PI ).mul( materialEnvIntensity );\n\n\t\tconst isolateRadiance = isolate( radiance );\n\t\tconst isolateIrradiance = isolate( irradiance );\n\n\t\t//\n\n\t\tbuilder.context.radiance.addAssign( isolateRadiance );\n\n\t\tbuilder.context.iblIrradiance.addAssign( isolateIrradiance );\n\n\t\t//\n\n\t\tconst clearcoatRadiance = builder.context.lightingModel.clearcoatRadiance;\n\n\t\tif ( clearcoatRadiance ) {\n\n\t\t\tconst clearcoatRadianceContext = envNode.context( createRadianceContext( clearcoatRoughness, clearcoatNormalView ) ).mul( materialEnvIntensity );\n\t\t\tconst isolateClearcoatRadiance = isolate( clearcoatRadianceContext );\n\n\t\t\tclearcoatRadiance.addAssign( isolateClearcoatRadiance );\n\n\t\t}\n\n\t}\n\n}\n\nconst createRadianceContext = ( roughnessNode, normalViewNode ) => {\n\n\tlet reflectVec = null;\n\n\treturn {\n\t\tgetUV: () => {\n\n\t\t\tif ( reflectVec === null ) {\n\n\t\t\t\treflectVec = positionViewDirection.negate().reflect( normalViewNode );\n\n\t\t\t\t// Mixing the reflection with the normal is more accurate and keeps rough objects from gathering light from behind their tangent plane.\n\t\t\t\treflectVec = pow4( roughnessNode ).mix( reflectVec, normalViewNode ).normalize();\n\n\t\t\t\treflectVec = reflectVec.transformDirection( cameraViewMatrix );\n\n\t\t\t}\n\n\t\t\treturn reflectVec;\n\n\t\t},\n\t\tgetTextureLevel: () => {\n\n\t\t\treturn roughnessNode;\n\n\t\t}\n\t};\n\n};\n\nconst createIrradianceContext = ( normalWorldNode ) => {\n\n\treturn {\n\t\tgetUV: () => {\n\n\t\t\treturn normalWorldNode;\n\n\t\t},\n\t\tgetTextureLevel: () => {\n\n\t\t\treturn float( 1.0 );\n\n\t\t}\n\t};\n\n};\n\nconst _defaultValues$6 = /*@__PURE__*/ new MeshStandardMaterial();\n\n/**\n * Node material version of {@link MeshStandardMaterial}.\n *\n * @augments NodeMaterial\n */\nclass MeshStandardNodeMaterial extends NodeMaterial {\n\n\tstatic get type() {\n\n\t\treturn 'MeshStandardNodeMaterial';\n\n\t}\n\n\t/**\n\t * Constructs a new mesh standard node material.\n\t *\n\t * @param {Object} [parameters] - The configuration parameter.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshStandardNodeMaterial = true;\n\n\t\t/**\n\t\t * Set to `true` because standard materials react on lights.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.lights = true;\n\n\t\t/**\n\t\t * The emissive color of standard materials is by default inferred from the `emissive`,\n\t\t * `emissiveIntensity` and `emissiveMap` properties. This node property allows to\n\t\t * overwrite the default and define the emissive color with a node instead.\n\t\t *\n\t\t * If you don't want to overwrite the emissive color but modify the existing\n\t\t * value instead, use {@link materialEmissive}.\n\t\t *\n\t\t * @type {?Node<vec3>}\n\t\t * @default null\n\t\t */\n\t\tthis.emissiveNode = null;\n\n\t\t/**\n\t\t * The metalness of standard materials is by default inferred from the `metalness`,\n\t\t * and `metalnessMap` properties. This node property allows to\n\t\t * overwrite the default and define the metalness with a node instead.\n\t\t *\n\t\t * If you don't want to overwrite the metalness but modify the existing\n\t\t * value instead, use {@link materialMetalness}.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.metalnessNode = null;\n\n\t\t/**\n\t\t * The roughness of standard materials is by default inferred from the `roughness`,\n\t\t * and `roughnessMap` properties. This node property allows to\n\t\t * overwrite the default and define the roughness with a node instead.\n\t\t *\n\t\t * If you don't want to overwrite the roughness but modify the existing\n\t\t * value instead, use {@link materialRoughness}.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.roughnessNode = null;\n\n\t\tthis.setDefaultValues( _defaultValues$6 );\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\t/**\n\t * Overwritten since this type of material uses {@link EnvironmentNode}\n\t * to implement the PBR (PMREM based) environment mapping. Besides, the\n\t * method honors `Scene.environment`.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {?EnvironmentNode<vec3>} The environment node.\n\t */\n\tsetupEnvironment( builder ) {\n\n\t\tlet envNode = super.setupEnvironment( builder );\n\n\t\tif ( envNode === null && builder.environmentNode ) {\n\n\t\t\tenvNode = builder.environmentNode;\n\n\t\t}\n\n\t\treturn envNode ? new EnvironmentNode( envNode ) : null;\n\n\t}\n\n\t/**\n\t * Setups the lighting model.\n\t *\n\t * @return {PhysicalLightingModel} The lighting model.\n\t */\n\tsetupLightingModel( /*builder*/ ) {\n\n\t\treturn new PhysicalLightingModel();\n\n\t}\n\n\t/**\n\t * Setups the specular related node variables.\n\t */\n\tsetupSpecular() {\n\n\t\tconst specularColorNode = mix( vec3( 0.04 ), diffuseColor.rgb, metalness );\n\n\t\tspecularColor.assign( vec3( 0.04 ) );\n\t\tspecularColorBlended.assign( specularColorNode );\n\t\tspecularF90.assign( 1.0 );\n\n\t}\n\n\t/**\n\t * Setups the standard specific node variables.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tsetupVariants() {\n\n\t\t// METALNESS\n\n\t\tconst metalnessNode = this.metalnessNode ? float( this.metalnessNode ) : materialMetalness;\n\n\t\tmetalness.assign( metalnessNode );\n\n\t\t// ROUGHNESS\n\n\t\tlet roughnessNode = this.roughnessNode ? float( this.roughnessNode ) : materialRoughness;\n\t\troughnessNode = getRoughness( { roughness: roughnessNode } );\n\n\t\troughness.assign( roughnessNode );\n\n\t\t// SPECULAR COLOR\n\n\t\tthis.setupSpecular();\n\n\t\t// DIFFUSE COLOR\n\n\t\tdiffuseContribution.assign( diffuseColor.rgb.mul( metalnessNode.oneMinus() ) );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.emissiveNode = source.emissiveNode;\n\n\t\tthis.metalnessNode = source.metalnessNode;\n\t\tthis.roughnessNode = source.roughnessNode;\n\n\t\treturn super.copy( source );\n\n\t}\n\n}\n\nconst _defaultValues$5 = /*@__PURE__*/ new MeshPhysicalMaterial();\n\n/**\n * Node material version of {@link MeshPhysicalMaterial}.\n *\n * @augments MeshStandardNodeMaterial\n */\nclass MeshPhysicalNodeMaterial extends MeshStandardNodeMaterial {\n\n\tstatic get type() {\n\n\t\treturn 'MeshPhysicalNodeMaterial';\n\n\t}\n\n\t/**\n\t * Constructs a new mesh physical node material.\n\t *\n\t * @param {Object} [parameters] - The configuration parameter.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshPhysicalNodeMaterial = true;\n\n\t\t/**\n\t\t * The clearcoat of physical materials is by default inferred from the `clearcoat`\n\t\t * and `clearcoatMap` properties. This node property allows to overwrite the default\n\t\t * and define the clearcoat with a node instead.\n\t\t *\n\t\t * If you don't want to overwrite the clearcoat but modify the existing\n\t\t * value instead, use {@link materialClearcoat}.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatNode = null;\n\n\t\t/**\n\t\t * The clearcoat roughness of physical materials is by default inferred from the `clearcoatRoughness`\n\t\t * and `clearcoatRoughnessMap` properties. This node property allows to overwrite the default\n\t\t * and define the clearcoat roughness with a node instead.\n\t\t *\n\t\t * If you don't want to overwrite the clearcoat roughness but modify the existing\n\t\t * value instead, use {@link materialClearcoatRoughness}.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatRoughnessNode = null;\n\n\t\t/**\n\t\t * The clearcoat normal of physical materials is by default inferred from the `clearcoatNormalMap`\n\t\t * property. This node property allows to overwrite the default\n\t\t * and define the clearcoat normal with a node instead.\n\t\t *\n\t\t * If you don't want to overwrite the clearcoat normal but modify the existing\n\t\t * value instead, use {@link materialClearcoatNormal}.\n\t\t *\n\t\t * @type {?Node<vec3>}\n\t\t * @default null\n\t\t */\n\t\tthis.clearcoatNormalNode = null;\n\n\t\t/**\n\t\t * The sheen of physical materials is by default inferred from the `sheen`, `sheenColor`\n\t\t * and `sheenColorMap` properties. This node property allows to overwrite the default\n\t\t * and define the sheen with a node instead.\n\t\t *\n\t\t * If you don't want to overwrite the sheen but modify the existing\n\t\t * value instead, use {@link materialSheen}.\n\t\t *\n\t\t * @type {?Node<vec3>}\n\t\t * @default null\n\t\t */\n\t\tthis.sheenNode = null;\n\n\t\t/**\n\t\t * The sheen roughness of physical materials is by default inferred from the `sheenRoughness` and\n\t\t * `sheenRoughnessMap` properties. This node property allows to overwrite the default\n\t\t * and define the sheen roughness with a node instead.\n\t\t *\n\t\t * If you don't want to overwrite the sheen roughness but modify the existing\n\t\t * value instead, use {@link materialSheenRoughness}.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.sheenRoughnessNode = null;\n\n\t\t/**\n\t\t * The iridescence of physical materials is by default inferred from the `iridescence`\n\t\t * property. This node property allows to overwrite the default\n\t\t * and define the iridescence with a node instead.\n\t\t *\n\t\t * If you don't want to overwrite the iridescence but modify the existing\n\t\t * value instead, use {@link materialIridescence}.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.iridescenceNode = null;\n\n\t\t/**\n\t\t * The iridescence IOR of physical materials is by default inferred from the `iridescenceIOR`\n\t\t * property. This node property allows to overwrite the default\n\t\t * and define the iridescence IOR with a node instead.\n\t\t *\n\t\t * If you don't want to overwrite the iridescence IOR but modify the existing\n\t\t * value instead, use {@link materialIridescenceIOR}.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.iridescenceIORNode = null;\n\n\t\t/**\n\t\t * The iridescence thickness of physical materials is by default inferred from the `iridescenceThicknessRange`\n\t\t * and `iridescenceThicknessMap` properties. This node property allows to overwrite the default\n\t\t * and define the iridescence thickness with a node instead.\n\t\t *\n\t\t * If you don't want to overwrite the iridescence thickness but modify the existing\n\t\t * value instead, use {@link materialIridescenceThickness}.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.iridescenceThicknessNode = null;\n\n\t\t/**\n\t\t * The specular intensity of physical materials is by default inferred from the `specularIntensity`\n\t\t * and `specularIntensityMap` properties. This node property allows to overwrite the default\n\t\t * and define the specular intensity with a node instead.\n\t\t *\n\t\t * If you don't want to overwrite the specular intensity but modify the existing\n\t\t * value instead, use {@link materialSpecularIntensity}.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.specularIntensityNode = null;\n\n\t\t/**\n\t\t * The specular color of physical materials is by default inferred from the `specularColor`\n\t\t * and `specularColorMap` properties. This node property allows to overwrite the default\n\t\t * and define the specular color with a node instead.\n\t\t *\n\t\t * If you don't want to overwrite the specular color but modify the existing\n\t\t * value instead, use {@link materialSpecularColor}.\n\t\t *\n\t\t * @type {?Node<vec3>}\n\t\t * @default null\n\t\t */\n\t\tthis.specularColorNode = null;\n\n\t\t/**\n\t\t * The ior of physical materials is by default inferred from the `ior`\n\t\t * property. This node property allows to overwrite the default\n\t\t * and define the ior with a node instead.\n\t\t *\n\t\t * If you don't want to overwrite the ior but modify the existing\n\t\t * value instead, use {@link materialIOR}.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.iorNode = null;\n\n\t\t/**\n\t\t * The transmission of physical materials is by default inferred from the `transmission` and\n\t\t * `transmissionMap` properties. This node property allows to overwrite the default\n\t\t * and define the transmission with a node instead.\n\t\t *\n\t\t * If you don't want to overwrite the transmission but modify the existing\n\t\t * value instead, use {@link materialTransmission}.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.transmissionNode = null;\n\n\t\t/**\n\t\t * The thickness of physical materials is by default inferred from the `thickness` and\n\t\t * `thicknessMap` properties. This node property allows to overwrite the default\n\t\t * and define the thickness with a node instead.\n\t\t *\n\t\t * If you don't want to overwrite the thickness but modify the existing\n\t\t * value instead, use {@link materialThickness}.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.thicknessNode = null;\n\n\t\t/**\n\t\t * The attenuation distance of physical materials is by default inferred from the\n\t\t * `attenuationDistance` property. This node property allows to overwrite the default\n\t\t * and define the attenuation distance with a node instead.\n\t\t *\n\t\t * If you don't want to overwrite the attenuation distance but modify the existing\n\t\t * value instead, use {@link materialAttenuationDistance}.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.attenuationDistanceNode = null;\n\n\t\t/**\n\t\t * The attenuation color of physical materials is by default inferred from the\n\t\t * `attenuationColor` property. This node property allows to overwrite the default\n\t\t * and define the attenuation color with a node instead.\n\t\t *\n\t\t * If you don't want to overwrite the attenuation color but modify the existing\n\t\t * value instead, use {@link materialAttenuationColor}.\n\t\t *\n\t\t * @type {?Node<vec3>}\n\t\t * @default null\n\t\t */\n\t\tthis.attenuationColorNode = null;\n\n\t\t/**\n\t\t * The dispersion of physical materials is by default inferred from the\n\t\t * `dispersion` property. This node property allows to overwrite the default\n\t\t * and define the dispersion with a node instead.\n\t\t *\n\t\t * If you don't want to overwrite the dispersion but modify the existing\n\t\t * value instead, use {@link materialDispersion}.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.dispersionNode = null;\n\n\t\t/**\n\t\t * The anisotropy of physical materials is by default inferred from the\n\t\t * `anisotropy` property. This node property allows to overwrite the default\n\t\t * and define the anisotropy with a node instead.\n\t\t *\n\t\t * If you don't want to overwrite the anisotropy but modify the existing\n\t\t * value instead, use {@link materialAnisotropy}.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.anisotropyNode = null;\n\n\t\tthis.setDefaultValues( _defaultValues$5 );\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\t/**\n\t * Whether the lighting model should use clearcoat or not.\n\t *\n\t * @type {boolean}\n\t * @default true\n\t */\n\tget useClearcoat() {\n\n\t\treturn this.clearcoat > 0 || this.clearcoatNode !== null;\n\n\t}\n\n\t/**\n\t * Whether the lighting model should use iridescence or not.\n\t *\n\t * @type {boolean}\n\t * @default true\n\t */\n\tget useIridescence() {\n\n\t\treturn this.iridescence > 0 || this.iridescenceNode !== null;\n\n\t}\n\n\t/**\n\t * Whether the lighting model should use sheen or not.\n\t *\n\t * @type {boolean}\n\t * @default true\n\t */\n\tget useSheen() {\n\n\t\treturn this.sheen > 0 || this.sheenNode !== null;\n\n\t}\n\n\t/**\n\t * Whether the lighting model should use anisotropy or not.\n\t *\n\t * @type {boolean}\n\t * @default true\n\t */\n\tget useAnisotropy() {\n\n\t\treturn this.anisotropy > 0 || this.anisotropyNode !== null;\n\n\t}\n\n\t/**\n\t * Whether the lighting model should use transmission or not.\n\t *\n\t * @type {boolean}\n\t * @default true\n\t */\n\tget useTransmission() {\n\n\t\treturn this.transmission > 0 || this.transmissionNode !== null;\n\n\t}\n\n\t/**\n\t * Whether the lighting model should use dispersion or not.\n\t *\n\t * @type {boolean}\n\t * @default true\n\t */\n\tget useDispersion() {\n\n\t\treturn this.dispersion > 0 || this.dispersionNode !== null;\n\n\t}\n\n\t/**\n\t * Setups the specular related node variables.\n\t */\n\tsetupSpecular() {\n\n\t\tconst iorNode = this.iorNode ? float( this.iorNode ) : materialIOR;\n\n\t\tior.assign( iorNode );\n\t\tspecularColor.assign( min$1( pow2( ior.sub( 1.0 ).div( ior.add( 1.0 ) ) ).mul( materialSpecularColor ), vec3( 1.0 ) ).mul( materialSpecularIntensity ) );\n\t\tspecularColorBlended.assign( mix( specularColor, diffuseColor.rgb, metalness ) );\n\t\tspecularF90.assign( mix( materialSpecularIntensity, 1.0, metalness ) );\n\n\t}\n\n\t/**\n\t * Setups the lighting model.\n\t *\n\t * @return {PhysicalLightingModel} The lighting model.\n\t */\n\tsetupLightingModel( /*builder*/ ) {\n\n\t\treturn new PhysicalLightingModel( this.useClearcoat, this.useSheen, this.useIridescence, this.useAnisotropy, this.useTransmission, this.useDispersion );\n\n\t}\n\n\t/**\n\t * Setups the physical specific node variables.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tsetupVariants( builder ) {\n\n\t\tsuper.setupVariants( builder );\n\n\t\t// CLEARCOAT\n\n\t\tif ( this.useClearcoat ) {\n\n\t\t\tconst clearcoatNode = this.clearcoatNode ? float( this.clearcoatNode ) : materialClearcoat;\n\t\t\tconst clearcoatRoughnessNode = this.clearcoatRoughnessNode ? float( this.clearcoatRoughnessNode ) : materialClearcoatRoughness;\n\n\t\t\tclearcoat.assign( clearcoatNode );\n\t\t\tclearcoatRoughness.assign( getRoughness( { roughness: clearcoatRoughnessNode } ) );\n\n\t\t}\n\n\t\t// SHEEN\n\n\t\tif ( this.useSheen ) {\n\n\t\t\tconst sheenNode = this.sheenNode ? vec3( this.sheenNode ) : materialSheen;\n\t\t\tconst sheenRoughnessNode = this.sheenRoughnessNode ? float( this.sheenRoughnessNode ) : materialSheenRoughness;\n\n\t\t\tsheen.assign( sheenNode );\n\t\t\tsheenRoughness.assign( sheenRoughnessNode );\n\n\t\t}\n\n\t\t// IRIDESCENCE\n\n\t\tif ( this.useIridescence ) {\n\n\t\t\tconst iridescenceNode = this.iridescenceNode ? float( this.iridescenceNode ) : materialIridescence;\n\t\t\tconst iridescenceIORNode = this.iridescenceIORNode ? float( this.iridescenceIORNode ) : materialIridescenceIOR;\n\t\t\tconst iridescenceThicknessNode = this.iridescenceThicknessNode ? float( this.iridescenceThicknessNode ) : materialIridescenceThickness;\n\n\t\t\tiridescence.assign( iridescenceNode );\n\t\t\tiridescenceIOR.assign( iridescenceIORNode );\n\t\t\tiridescenceThickness.assign( iridescenceThicknessNode );\n\n\t\t}\n\n\t\t// ANISOTROPY\n\n\t\tif ( this.useAnisotropy ) {\n\n\t\t\tconst anisotropyV = ( this.anisotropyNode ? vec2( this.anisotropyNode ) : materialAnisotropy ).toVar();\n\n\t\t\tanisotropy.assign( anisotropyV.length() );\n\n\t\t\tIf( anisotropy.equal( 0.0 ), () => {\n\n\t\t\t\tanisotropyV.assign( vec2( 1.0, 0.0 ) );\n\n\t\t\t} ).Else( () => {\n\n\t\t\t\tanisotropyV.divAssign( vec2( anisotropy ) );\n\t\t\t\tanisotropy.assign( anisotropy.saturate() );\n\n\t\t\t} );\n\n\t\t\t// Roughness along the anisotropy bitangent is the material roughness, while the tangent roughness increases with anisotropy.\n\t\t\talphaT.assign( anisotropy.pow2().mix( roughness.pow2(), 1.0 ) );\n\n\t\t\tanisotropyT.assign( TBNViewMatrix[ 0 ].mul( anisotropyV.x ).add( TBNViewMatrix[ 1 ].mul( anisotropyV.y ) ) );\n\t\t\tanisotropyB.assign( TBNViewMatrix[ 1 ].mul( anisotropyV.x ).sub( TBNViewMatrix[ 0 ].mul( anisotropyV.y ) ) );\n\n\t\t}\n\n\t\t// TRANSMISSION\n\n\t\tif ( this.useTransmission ) {\n\n\t\t\tconst transmissionNode = this.transmissionNode ? float( this.transmissionNode ) : materialTransmission;\n\t\t\tconst thicknessNode = this.thicknessNode ? float( this.thicknessNode ) : materialThickness;\n\t\t\tconst attenuationDistanceNode = this.attenuationDistanceNode ? float( this.attenuationDistanceNode ) : materialAttenuationDistance;\n\t\t\tconst attenuationColorNode = this.attenuationColorNode ? vec3( this.attenuationColorNode ) : materialAttenuationColor;\n\n\t\t\ttransmission.assign( transmissionNode );\n\t\t\tthickness.assign( thicknessNode );\n\t\t\tattenuationDistance.assign( attenuationDistanceNode );\n\t\t\tattenuationColor.assign( attenuationColorNode );\n\n\t\t\tif ( this.useDispersion ) {\n\n\t\t\t\tconst dispersionNode = this.dispersionNode ? float( this.dispersionNode ) : materialDispersion;\n\n\t\t\t\tdispersion.assign( dispersionNode );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Setups the clearcoat normal node.\n\t *\n\t * @return {Node<vec3>} The clearcoat normal.\n\t */\n\tsetupClearcoatNormal() {\n\n\t\treturn this.clearcoatNormalNode ? vec3( this.clearcoatNormalNode ) : materialClearcoatNormal;\n\n\t}\n\n\tsetup( builder ) {\n\n\t\tbuilder.context.setupClearcoatNormal = () => subBuild( this.setupClearcoatNormal( builder ), 'NORMAL', 'vec3' );\n\n\t\tsuper.setup( builder );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.clearcoatNode = source.clearcoatNode;\n\t\tthis.clearcoatRoughnessNode = source.clearcoatRoughnessNode;\n\t\tthis.clearcoatNormalNode = source.clearcoatNormalNode;\n\n\t\tthis.sheenNode = source.sheenNode;\n\t\tthis.sheenRoughnessNode = source.sheenRoughnessNode;\n\n\t\tthis.iridescenceNode = source.iridescenceNode;\n\t\tthis.iridescenceIORNode = source.iridescenceIORNode;\n\t\tthis.iridescenceThicknessNode = source.iridescenceThicknessNode;\n\n\t\tthis.specularIntensityNode = source.specularIntensityNode;\n\t\tthis.specularColorNode = source.specularColorNode;\n\n\t\tthis.transmissionNode = source.transmissionNode;\n\t\tthis.thicknessNode = source.thicknessNode;\n\t\tthis.attenuationDistanceNode = source.attenuationDistanceNode;\n\t\tthis.attenuationColorNode = source.attenuationColorNode;\n\t\tthis.dispersionNode = source.dispersionNode;\n\n\t\tthis.anisotropyNode = source.anisotropyNode;\n\n\t\treturn super.copy( source );\n\n\t}\n\n}\n\n/**\n * Represents the lighting model for {@link MeshSSSNodeMaterial}.\n *\n * @augments PhysicalLightingModel\n */\nclass SSSLightingModel extends PhysicalLightingModel {\n\n\t/**\n\t * Constructs a new physical lighting model.\n\t *\n\t * @param {boolean} [clearcoat=false] - Whether clearcoat is supported or not.\n\t * @param {boolean} [sheen=false] - Whether sheen is supported or not.\n\t * @param {boolean} [iridescence=false] - Whether iridescence is supported or not.\n\t * @param {boolean} [anisotropy=false] - Whether anisotropy is supported or not.\n\t * @param {boolean} [transmission=false] - Whether transmission is supported or not.\n\t * @param {boolean} [dispersion=false] - Whether dispersion is supported or not.\n\t * @param {boolean} [sss=false] - Whether SSS is supported or not.\n\t */\n\tconstructor( clearcoat = false, sheen = false, iridescence = false, anisotropy = false, transmission = false, dispersion = false, sss = false ) {\n\n\t\tsuper( clearcoat, sheen, iridescence, anisotropy, transmission, dispersion );\n\n\t\t/**\n\t\t * Whether the lighting model should use SSS or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.useSSS = sss;\n\n\t}\n\n\t/**\n\t * Extends the default implementation with a SSS term.\n\t *\n\t * Reference: [Approximating Translucency for a Fast, Cheap and Convincing Subsurface Scattering Look](https://colinbarrebrisebois.com/2011/03/07/gdc-2011-approximating-translucency-for-a-fast-cheap-and-convincing-subsurface-scattering-look/)\n\t *\n\t * @param {Object} input - The input data.\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tdirect( { lightDirection, lightColor, reflectedLight }, builder ) {\n\n\t\tif ( this.useSSS === true ) {\n\n\t\t\tconst material = builder.material;\n\n\t\t\tconst { thicknessColorNode, thicknessDistortionNode, thicknessAmbientNode, thicknessAttenuationNode, thicknessPowerNode, thicknessScaleNode } = material;\n\n\t\t\tconst scatteringHalf = lightDirection.add( normalView.mul( thicknessDistortionNode ) ).normalize();\n\t\t\tconst scatteringDot = float( positionViewDirection.dot( scatteringHalf.negate() ).saturate().pow( thicknessPowerNode ).mul( thicknessScaleNode ) );\n\t\t\tconst scatteringIllu = vec3( scatteringDot.add( thicknessAmbientNode ).mul( thicknessColorNode ) );\n\n\t\t\treflectedLight.directDiffuse.addAssign( scatteringIllu.mul( thicknessAttenuationNode.mul( lightColor ) ) );\n\n\t\t}\n\n\t\tsuper.direct( { lightDirection, lightColor, reflectedLight }, builder );\n\n\t}\n\n}\n\n/**\n * This node material is an experimental extension of {@link MeshPhysicalNodeMaterial}\n * that implements a Subsurface scattering (SSS) term.\n *\n * @augments MeshPhysicalNodeMaterial\n */\nclass MeshSSSNodeMaterial extends MeshPhysicalNodeMaterial {\n\n\tstatic get type() {\n\n\t\treturn 'MeshSSSNodeMaterial';\n\n\t}\n\n\t/**\n\t * Constructs a new mesh SSS node material.\n\t *\n\t * @param {Object} [parameters] - The configuration parameter.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper( parameters );\n\n\t\t/**\n\t\t * Represents the thickness color.\n\t\t *\n\t\t * @type {?Node<vec3>}\n\t\t * @default null\n\t\t */\n\t\tthis.thicknessColorNode = null;\n\n\t\t/**\n\t\t * Represents the distortion factor.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t */\n\t\tthis.thicknessDistortionNode = float( 0.1 );\n\n\t\t/**\n\t\t * Represents the thickness ambient factor.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t */\n\t\tthis.thicknessAmbientNode = float( 0.0 );\n\n\t\t/**\n\t\t * Represents the thickness attenuation.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t */\n\t\tthis.thicknessAttenuationNode = float( .1 );\n\n\t\t/**\n\t\t * Represents the thickness power.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t */\n\t\tthis.thicknessPowerNode = float( 2.0 );\n\n\t\t/**\n\t\t * Represents the thickness scale.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t */\n\t\tthis.thicknessScaleNode = float( 10.0 );\n\n\t}\n\n\t/**\n\t * Whether the lighting model should use SSS or not.\n\t *\n\t * @type {boolean}\n\t * @default true\n\t */\n\tget useSSS() {\n\n\t\treturn this.thicknessColorNode !== null;\n\n\t}\n\n\t/**\n\t * Setups the lighting model.\n\t *\n\t * @return {SSSLightingModel} The lighting model.\n\t */\n\tsetupLightingModel( /*builder*/ ) {\n\n\t\treturn new SSSLightingModel( this.useClearcoat, this.useSheen, this.useIridescence, this.useAnisotropy, this.useTransmission, this.useDispersion, this.useSSS );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.thicknessColorNode = source.thicknessColorNode;\n\t\tthis.thicknessDistortionNode = source.thicknessDistortionNode;\n\t\tthis.thicknessAmbientNode = source.thicknessAmbientNode;\n\t\tthis.thicknessAttenuationNode = source.thicknessAttenuationNode;\n\t\tthis.thicknessPowerNode = source.thicknessPowerNode;\n\t\tthis.thicknessScaleNode = source.thicknessScaleNode;\n\n\t\treturn super.copy( source );\n\n\t}\n\n}\n\nconst getGradientIrradiance = /*@__PURE__*/ Fn( ( { normal, lightDirection, builder } ) => {\n\n\t// dotNL will be from -1.0 to 1.0\n\tconst dotNL = normal.dot( lightDirection );\n\tconst coord = vec2( dotNL.mul( 0.5 ).add( 0.5 ), 0.0 );\n\n\tif ( builder.material.gradientMap ) {\n\n\t\tconst gradientMap = materialReference( 'gradientMap', 'texture' ).context( { getUV: () => coord } );\n\n\t\treturn vec3( gradientMap.r );\n\n\t} else {\n\n\t\tconst fw = coord.fwidth().mul( 0.5 );\n\n\t\treturn mix( vec3( 0.7 ), vec3( 1.0 ), smoothstep( float( 0.7 ).sub( fw.x ), float( 0.7 ).add( fw.x ), coord.x ) );\n\n\t}\n\n} );\n\n/**\n * Represents the lighting model for a toon material. Used in {@link MeshToonNodeMaterial}.\n *\n * @augments LightingModel\n */\nclass ToonLightingModel extends LightingModel {\n\n\t/**\n\t * Implements the direct lighting. Instead of using a conventional smooth irradiance, the irradiance is\n\t * reduced to a small number of discrete shades to create a comic-like, flat look.\n\t *\n\t * @param {Object} lightData - The light data.\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tdirect( { lightDirection, lightColor, reflectedLight }, builder ) {\n\n\t\tconst irradiance = getGradientIrradiance( { normal: normalGeometry, lightDirection, builder } ).mul( lightColor );\n\n\t\treflectedLight.directDiffuse.addAssign( irradiance.mul( BRDF_Lambert( { diffuseColor: diffuseColor.rgb } ) ) );\n\n\t}\n\n\t/**\n\t * Implements the indirect lighting.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tindirect( builder ) {\n\n\t\tconst { ambientOcclusion, irradiance, reflectedLight } = builder.context;\n\n\t\treflectedLight.indirectDiffuse.addAssign( irradiance.mul( BRDF_Lambert( { diffuseColor } ) ) );\n\n\t\treflectedLight.indirectDiffuse.mulAssign( ambientOcclusion );\n\n\t}\n\n}\n\nconst _defaultValues$4 = /*@__PURE__*/ new MeshToonMaterial();\n\n/**\n * Node material version of {@link MeshToonMaterial}.\n *\n * @augments NodeMaterial\n */\nclass MeshToonNodeMaterial extends NodeMaterial {\n\n\tstatic get type() {\n\n\t\treturn 'MeshToonNodeMaterial';\n\n\t}\n\n\t/**\n\t * Constructs a new mesh toon node material.\n\t *\n\t * @param {Object} [parameters] - The configuration parameter.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshToonNodeMaterial = true;\n\n\t\t/**\n\t\t * Set to `true` because toon materials react on lights.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.lights = true;\n\n\t\tthis.setDefaultValues( _defaultValues$4 );\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\t/**\n\t * Setups the lighting model.\n\t *\n\t * @return {ToonLightingModel} The lighting model.\n\t */\n\tsetupLightingModel( /*builder*/ ) {\n\n\t\treturn new ToonLightingModel();\n\n\t}\n\n}\n\n/**\n * TSL function for creating a matcap uv node.\n *\n * Can be used to compute texture coordinates for projecting a\n * matcap onto a mesh. Used by {@link MeshMatcapNodeMaterial}.\n *\n * @tsl\n * @function\n * @returns {Node<vec2>} The matcap UV coordinates.\n */\nconst matcapUV = /*@__PURE__*/ Fn( () => {\n\n\tconst x = vec3( positionViewDirection.z, 0, positionViewDirection.x.negate() ).normalize();\n\tconst y = positionViewDirection.cross( x );\n\n\treturn vec2( x.dot( normalView ), y.dot( normalView ) ).mul( 0.495 ).add( 0.5 ); // 0.495 to remove artifacts caused by undersized matcap disks\n\n} ).once( [ 'NORMAL', 'VERTEX' ] )().toVar( 'matcapUV' );\n\nconst _defaultValues$3 = /*@__PURE__*/ new MeshMatcapMaterial();\n\n/**\n * Node material version of {@link MeshMatcapMaterial}.\n *\n * @augments NodeMaterial\n */\nclass MeshMatcapNodeMaterial extends NodeMaterial {\n\n\tstatic get type() {\n\n\t\treturn 'MeshMatcapNodeMaterial';\n\n\t}\n\n\t/**\n\t * Constructs a new mesh normal node material.\n\t *\n\t * @param {Object} [parameters] - The configuration parameter.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMeshMatcapNodeMaterial = true;\n\n\t\tthis.setDefaultValues( _defaultValues$3 );\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\t/**\n\t * Setups the matcap specific node variables.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tsetupVariants( builder ) {\n\n\t\tconst uv = matcapUV;\n\n\t\tlet matcapColor;\n\n\t\tif ( builder.material.matcap ) {\n\n\t\t\tmatcapColor = materialReference( 'matcap', 'texture' ).context( { getUV: () => uv } );\n\n\t\t} else {\n\n\t\t\tmatcapColor = vec3( mix( 0.2, 0.8, uv.y ) ); // default if matcap is missing\n\n\t\t}\n\n\t\tdiffuseColor.rgb.mulAssign( matcapColor.rgb );\n\n\t}\n\n}\n\n/**\n * Applies a rotation to the given position node.\n *\n * @augments TempNode\n */\nclass RotateNode extends TempNode {\n\n\tstatic get type() {\n\n\t\treturn 'RotateNode';\n\n\t}\n\n\t/**\n\t * Constructs a new rotate node.\n\t *\n\t * @param {Node} positionNode - The position node.\n\t * @param {Node} rotationNode - Represents the rotation that is applied to the position node. Depending\n\t * on whether the position data are 2D or 3D, the rotation is expressed a single float value or an Euler value.\n\t */\n\tconstructor( positionNode, rotationNode ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The position node.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.positionNode = positionNode;\n\n\t\t/**\n\t\t *  Represents the rotation that is applied to the position node.\n\t\t *  Depending on whether the position data are 2D or 3D, the rotation is expressed a single float value or an Euler value.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.rotationNode = rotationNode;\n\n\t}\n\n\t/**\n\t * The type of the {@link RotateNode#positionNode} defines the node's type.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The node's type.\n\t */\n\tgetNodeType( builder ) {\n\n\t\treturn this.positionNode.getNodeType( builder );\n\n\t}\n\n\tsetup( builder ) {\n\n\t\tconst { rotationNode, positionNode } = this;\n\n\t\tconst nodeType = this.getNodeType( builder );\n\n\t\tif ( nodeType === 'vec2' ) {\n\n\t\t\tconst cosAngle = rotationNode.cos();\n\t\t\tconst sinAngle = rotationNode.sin();\n\n\t\t\tconst rotationMatrix = mat2(\n\t\t\t\tcosAngle, sinAngle,\n\t\t\t\tsinAngle.negate(), cosAngle\n\t\t\t);\n\n\t\t\treturn rotationMatrix.mul( positionNode );\n\n\t\t} else {\n\n\t\t\tconst rotation = rotationNode;\n\t\t\tconst rotationXMatrix = mat4( vec4( 1.0, 0.0, 0.0, 0.0 ), vec4( 0.0, cos( rotation.x ), sin( rotation.x ).negate(), 0.0 ), vec4( 0.0, sin( rotation.x ), cos( rotation.x ), 0.0 ), vec4( 0.0, 0.0, 0.0, 1.0 ) );\n\t\t\tconst rotationYMatrix = mat4( vec4( cos( rotation.y ), 0.0, sin( rotation.y ), 0.0 ), vec4( 0.0, 1.0, 0.0, 0.0 ), vec4( sin( rotation.y ).negate(), 0.0, cos( rotation.y ), 0.0 ), vec4( 0.0, 0.0, 0.0, 1.0 ) );\n\t\t\tconst rotationZMatrix = mat4( vec4( cos( rotation.z ), sin( rotation.z ).negate(), 0.0, 0.0 ), vec4( sin( rotation.z ), cos( rotation.z ), 0.0, 0.0 ), vec4( 0.0, 0.0, 1.0, 0.0 ), vec4( 0.0, 0.0, 0.0, 1.0 ) );\n\n\t\t\treturn rotationXMatrix.mul( rotationYMatrix ).mul( rotationZMatrix ).mul( vec4( positionNode, 1.0 ) ).xyz;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * TSL function for creating a rotate node.\n *\n * @tsl\n * @function\n * @param {Node} positionNode - The position node.\n * @param {Node} rotationNode - Represents the rotation that is applied to the position node. Depending\n * on whether the position data are 2D or 3D, the rotation is expressed a single float value or an Euler value.\n * @returns {RotateNode}\n */\nconst rotate = /*@__PURE__*/ nodeProxy( RotateNode ).setParameterLength( 2 );\n\nconst _defaultValues$2 = /*@__PURE__*/ new SpriteMaterial();\n\n/**\n * Node material version of {@link SpriteMaterial}.\n *\n * @augments NodeMaterial\n */\nclass SpriteNodeMaterial extends NodeMaterial {\n\n\tstatic get type() {\n\n\t\treturn 'SpriteNodeMaterial';\n\n\t}\n\n\t/**\n\t * Constructs a new sprite node material.\n\t *\n\t * @param {Object} [parameters] - The configuration parameter.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSpriteNodeMaterial = true;\n\n\t\tthis._useSizeAttenuation = true;\n\n\t\t/**\n\t\t * This property makes it possible to define the position of the sprite with a\n\t\t * node. That can be useful when the material is used with instanced rendering\n\t\t * and node data are defined with an instanced attribute node:\n\t\t * ```js\n\t\t * const positionAttribute = new InstancedBufferAttribute( new Float32Array( positions ), 3 );\n\t\t * material.positionNode = instancedBufferAttribute( positionAttribute );\n\t\t * ```\n\t\t * Another possibility is to compute the instanced data with a compute shader:\n\t\t * ```js\n\t\t * const positionBuffer = instancedArray( particleCount, 'vec3' );\n\t\t * particleMaterial.positionNode = positionBuffer.toAttribute();\n\t\t * ```\n\t\t *\n\t\t * @type {?Node<vec2>}\n\t\t * @default null\n\t\t */\n\t\tthis.positionNode = null;\n\n\t\t/**\n\t\t * The rotation of sprite materials is by default inferred from the `rotation`,\n\t\t * property. This node property allows to overwrite the default and define\n\t\t * the rotation with a node instead.\n\t\t *\n\t\t * If you don't want to overwrite the rotation but modify the existing\n\t\t * value instead, use {@link materialRotation}.\n\t\t *\n\t\t * @type {?Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.rotationNode = null;\n\n\t\t/**\n\t\t * This node property provides an additional way to scale sprites next to\n\t\t * `Object3D.scale`. The scale transformation based in `Object3D.scale`\n\t\t * is multiplied with the scale value of this node in the vertex shader.\n\t\t *\n\t\t * @type {?Node<vec2>}\n\t\t * @default null\n\t\t */\n\t\tthis.scaleNode = null;\n\n\t\t/**\n\t\t * In Sprites, the transparent property is enabled by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.transparent = true;\n\n\t\tthis.setDefaultValues( _defaultValues$2 );\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\t/**\n\t * Setups the position node in view space. This method implements\n\t * the sprite specific vertex shader.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {Node<vec3>} The position in view space.\n\t */\n\tsetupPositionView( builder ) {\n\n\t\tconst { object, camera } = builder;\n\n\t\tconst { positionNode, rotationNode, scaleNode, sizeAttenuation } = this;\n\n\t\tconst mvPosition = modelViewMatrix.mul( vec3( positionNode || 0 ) );\n\n\t\tlet scale = vec2( modelWorldMatrix[ 0 ].xyz.length(), modelWorldMatrix[ 1 ].xyz.length() );\n\n\t\tif ( scaleNode !== null ) {\n\n\t\t\tscale = scale.mul( vec2( scaleNode ) );\n\n\t\t}\n\n\t\tif ( camera.isPerspectiveCamera && sizeAttenuation === false ) {\n\n\t\t\tscale = scale.mul( mvPosition.z.negate() );\n\n\t\t}\n\n\t\tlet alignedPosition = positionGeometry.xy;\n\n\t\tif ( object.center && object.center.isVector2 === true ) {\n\n\t\t\tconst center = reference$1( 'center', 'vec2', object );\n\n\t\t\talignedPosition = alignedPosition.sub( center.sub( 0.5 ) );\n\n\t\t}\n\n\t\talignedPosition = alignedPosition.mul( scale );\n\n\t\tconst rotation = float( rotationNode || materialRotation );\n\n\t\tconst rotatedPosition = rotate( alignedPosition, rotation );\n\n\t\treturn vec4( mvPosition.xy.add( rotatedPosition ), mvPosition.zw );\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.positionNode = source.positionNode;\n\t\tthis.rotationNode = source.rotationNode;\n\t\tthis.scaleNode = source.scaleNode;\n\n\t\treturn super.copy( source );\n\n\t}\n\n\t/**\n\t * Whether to use size attenuation or not.\n\t *\n\t * @type {boolean}\n\t * @default true\n\t */\n\tget sizeAttenuation() {\n\n\t\treturn this._useSizeAttenuation;\n\n\t}\n\n\tset sizeAttenuation( value ) {\n\n\t\tif ( this._useSizeAttenuation !== value ) {\n\n\t\t\tthis._useSizeAttenuation = value;\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n}\n\nconst _defaultValues$1 = /*@__PURE__*/ new PointsMaterial();\nconst _size$4 = /*@__PURE__*/ new Vector2();\n\n/**\n * Node material version of {@link PointsMaterial}.\n *\n * This material can be used in two ways:\n *\n * - By rendering point primitives with {@link Points}. Since WebGPU only supports point primitives\n * with a pixel size of `1`, it's not possible to define a size.\n *\n * ```js\n * const pointCloud = new THREE.Points( geometry, new THREE.PointsNodeMaterial() );\n * ```\n *\n * - By rendering point primitives with {@link Sprites}. In this case, size is honored,\n * see {@link PointsNodeMaterial#sizeNode}.\n *\n * ```js\n * const instancedPoints = new THREE.Sprite( new THREE.PointsNodeMaterial( { positionNode: instancedBufferAttribute( positionAttribute ) } ) );\n * ```\n *\n * @augments SpriteNodeMaterial\n */\nclass PointsNodeMaterial extends SpriteNodeMaterial {\n\n\tstatic get type() {\n\n\t\treturn 'PointsNodeMaterial';\n\n\t}\n\n\t/**\n\t * Constructs a new points node material.\n\t *\n\t * @param {Object} [parameters] - The configuration parameter.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This node property provides an additional way to set the point size.\n\t\t *\n\t\t * Note that WebGPU only supports point primitives with 1 pixel size. Consequently,\n\t\t * this node has no effect when the material is used with {@link Points} and a WebGPU\n\t\t * backend. If an application wants to render points with a size larger than 1 pixel,\n\t\t * the material should be used with {@link Sprite} and instancing.\n\t\t *\n\t\t * @type {?Node<vec2>}\n\t\t * @default null\n\t\t */\n\t\tthis.sizeNode = null;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPointsNodeMaterial = true;\n\n\t\tthis.setDefaultValues( _defaultValues$1 );\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tsetupPositionView() {\n\n\t\tconst { positionNode } = this;\n\n\t\treturn modelViewMatrix.mul( vec3( positionNode || positionLocal ) ).xyz;\n\n\t}\n\n\tsetupVertexSprite( builder ) {\n\n\t\tconst { material, camera } = builder;\n\n\t\tconst { rotationNode, scaleNode, sizeNode, sizeAttenuation } = this;\n\n\t\tlet mvp = super.setupVertex( builder );\n\n\t\t// skip further processing if the material is not a node material\n\n\t\tif ( material.isNodeMaterial !== true ) {\n\n\t\t\treturn mvp;\n\n\t\t}\n\n\t\t// point size\n\n\t\tlet pointSize = sizeNode !== null ? vec2( sizeNode ) : materialPointSize;\n\n\t\tpointSize = pointSize.mul( screenDPR );\n\n\t\t// size attenuation\n\n\t\tif ( camera.isPerspectiveCamera && sizeAttenuation === true ) {\n\n\t\t\t// follow WebGLRenderer's implementation, and scale by half the canvas height in logical units\n\n\t\t\tpointSize = pointSize.mul( scale.div( positionView.z.negate() ) );\n\n\t\t}\n\n\t\t// scale\n\n\t\tif ( scaleNode && scaleNode.isNode ) {\n\n\t\t\tpointSize = pointSize.mul( vec2( scaleNode ) );\n\n\t\t}\n\n\t\t// compute offset\n\n\t\tlet offset = positionGeometry.xy;\n\n\t\t// apply rotation\n\n\t\tif ( rotationNode && rotationNode.isNode ) {\n\n\t\t\tconst rotation = float( rotationNode );\n\n\t\t\toffset = rotate( offset, rotation );\n\n\t\t}\n\n\t\t// account for point size\n\n\t\toffset = offset.mul( pointSize );\n\n\t\t// scale by viewport size\n\n\t\toffset = offset.div( viewportSize.div( 2 ) );\n\n\t\t// compensate for the perspective divide\n\n\t\toffset = offset.mul( mvp.w );\n\n\t\t// add offset\n\n\t\tmvp = mvp.add( vec4( offset, 0, 0 ) );\n\n\t\treturn mvp;\n\n\t}\n\n\tsetupVertex( builder ) {\n\n\t\tif ( builder.object.isPoints ) {\n\n\t\t\treturn super.setupVertex( builder );\n\n\n\t\t} else {\n\n\t\t\treturn this.setupVertexSprite( builder );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Whether alpha to coverage should be used or not.\n\t *\n\t * @type {boolean}\n\t * @default true\n\t */\n\tget alphaToCoverage() {\n\n\t\treturn this._useAlphaToCoverage;\n\n\t}\n\n\tset alphaToCoverage( value ) {\n\n\t\tif ( this._useAlphaToCoverage !== value ) {\n\n\t\t\tthis._useAlphaToCoverage = value;\n\t\t\tthis.needsUpdate = true;\n\n\t\t}\n\n\t}\n\n}\n\nconst scale = /*@__PURE__*/ uniform( 1 ).onFrameUpdate( function ( { renderer } ) {\n\n\tconst size = renderer.getSize( _size$4 ); // logical units\n\n\tthis.value = 0.5 * size.y;\n\n} );\n\n/**\n * Represents lighting model for a shadow material. Used in {@link ShadowNodeMaterial}.\n *\n * @augments LightingModel\n */\nclass ShadowMaskModel extends LightingModel {\n\n\t/**\n\t * Constructs a new shadow mask model.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The shadow mask node.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.shadowNode = float( 1 ).toVar( 'shadowMask' );\n\n\t}\n\n\t/**\n\t * Only used to save the shadow mask.\n\t *\n\t * @param {Object} input - The input data.\n\t */\n\tdirect( { lightNode } ) {\n\n\t\tif ( lightNode.shadowNode !== null ) {\n\n\t\t\tthis.shadowNode.mulAssign( lightNode.shadowNode );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Uses the shadow mask to produce the final color.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tfinish( { context } ) {\n\n\t\tdiffuseColor.a.mulAssign( this.shadowNode.oneMinus() );\n\n\t\tcontext.outgoingLight.rgb.assign( diffuseColor.rgb ); // TODO: Optimize LightsNode to avoid this assignment\n\n\t}\n\n}\n\nconst _defaultValues = /*@__PURE__*/ new ShadowMaterial();\n\n/**\n * Node material version of {@link ShadowMaterial}.\n *\n * @augments NodeMaterial\n */\nclass ShadowNodeMaterial extends NodeMaterial {\n\n\tstatic get type() {\n\n\t\treturn 'ShadowNodeMaterial';\n\n\t}\n\n\t/**\n\t * Constructs a new shadow node material.\n\t *\n\t * @param {Object} [parameters] - The configuration parameter.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isShadowNodeMaterial = true;\n\n\t\t/**\n\t\t * Set to `true` because so it's possible to implement\n\t\t * the shadow mask effect.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.lights = true;\n\n\t\t/**\n\t\t * Overwritten since shadow materials are transparent\n\t\t * by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.transparent = true;\n\n\t\tthis.setDefaultValues( _defaultValues );\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\t/**\n\t * Setups the lighting model.\n\t *\n\t * @return {ShadowMaskModel} The lighting model.\n\t */\n\tsetupLightingModel( /*builder*/ ) {\n\n\t\treturn new ShadowMaskModel();\n\n\t}\n\n}\n\nconst scatteringDensity = property( 'vec3' );\nconst linearDepthRay = property( 'vec3' );\nconst outgoingRayLight = property( 'vec3' );\n\n/**\n * VolumetricLightingModel class extends the LightingModel to implement volumetric lighting effects.\n * This model calculates the scattering and transmittance of light through a volumetric medium.\n * It dynamically adjusts the direction of the ray based on the camera and object positions.\n * The model supports custom scattering and depth nodes to enhance the lighting effects.\n *\n * @augments LightingModel\n */\nclass VolumetricLightingModel extends LightingModel {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t}\n\n\tstart( builder ) {\n\n\t\tconst { material } = builder;\n\n\t\tconst startPos = property( 'vec3' );\n\t\tconst endPos = property( 'vec3' );\n\n\t\t// This approach dynamically changes the direction of the ray,\n\t\t// prioritizing the ray from the camera to the object if it is inside the mesh, and from the object to the camera if it is far away.\n\n\t\tIf( cameraPosition.sub( positionWorld ).length().greaterThan( modelRadius.mul( 2 ) ), () => {\n\n\t\t\tstartPos.assign( cameraPosition );\n\t\t\tendPos.assign( positionWorld );\n\n\t\t} ).Else( () => {\n\n\t\t\tstartPos.assign( positionWorld );\n\t\t\tendPos.assign( cameraPosition );\n\n\t\t} );\n\n\t\t//\n\n\t\tconst viewVector = endPos.sub( startPos );\n\n\t\tconst steps = uniform( 'int' ).onRenderUpdate( ( { material } ) => material.steps );\n\t\tconst stepSize = viewVector.length().div( steps ).toVar();\n\n\t\tconst rayDir = viewVector.normalize().toVar(); // TODO: toVar() should be automatic here ( in loop )\n\n\t\tconst distTravelled = float( 0.0 ).toVar();\n\t\tconst transmittance = vec3( 1 ).toVar();\n\n\t\tif ( material.offsetNode ) {\n\n\t\t\t// reduce banding\n\n\t\t\tdistTravelled.addAssign( material.offsetNode.mul( stepSize ) );\n\n\t\t}\n\n\t\tLoop( steps, () => {\n\n\t\t\tconst positionRay = startPos.add( rayDir.mul( distTravelled ) );\n\t\t\tconst positionViewRay = cameraViewMatrix.mul( vec4( positionRay, 1 ) ).xyz;\n\n\t\t\tif ( material.depthNode !== null ) {\n\n\t\t\t\tlinearDepthRay.assign( linearDepth( viewZToPerspectiveDepth( positionViewRay.z, cameraNear, cameraFar ) ) );\n\n\t\t\t\tbuilder.context.sceneDepthNode = linearDepth( material.depthNode ).toVar();\n\n\t\t\t}\n\n\t\t\tbuilder.context.positionWorld = positionRay;\n\t\t\tbuilder.context.shadowPositionWorld = positionRay;\n\t\t\tbuilder.context.positionView = positionViewRay;\n\n\t\t\tscatteringDensity.assign( 0 );\n\n\t\t\tlet scatteringNode;\n\n\t\t\tif ( material.scatteringNode ) {\n\n\t\t\t\tscatteringNode = material.scatteringNode( {\n\t\t\t\t\tpositionRay\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tsuper.start( builder );\n\n\t\t\tif ( scatteringNode ) {\n\n\t\t\t\tscatteringDensity.mulAssign( scatteringNode );\n\n\t\t\t}\n\n\t\t\t// beer's law\n\n\t\t\tconst falloff = scatteringDensity.mul( .01 ).negate().mul( stepSize ).exp();\n\t\t\ttransmittance.mulAssign( falloff );\n\n\t\t\t// move along the ray\n\n\t\t\tdistTravelled.addAssign( stepSize );\n\n\t\t} );\n\n\t\toutgoingRayLight.addAssign( transmittance.saturate().oneMinus() );\n\n\t}\n\n\tscatteringLight( lightColor, builder ) {\n\n\t\tconst sceneDepthNode = builder.context.sceneDepthNode;\n\n\t\tif ( sceneDepthNode ) {\n\n\t\t\tIf( sceneDepthNode.greaterThanEqual( linearDepthRay ), () => {\n\n\t\t\t\tscatteringDensity.addAssign( lightColor );\n\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\tscatteringDensity.addAssign( lightColor );\n\n\t\t}\n\n\t}\n\n\tdirect( { lightNode, lightColor }, builder ) {\n\n\t\t// Ignore lights with infinite distance\n\n\t\tif ( lightNode.light.distance === undefined ) return;\n\n\t\t// TODO: We need a viewportOpaque*() ( output, depth ) to fit with modern rendering approaches\n\n\t\tconst directLight = lightColor.xyz.toVar();\n\t\tdirectLight.mulAssign( lightNode.shadowNode ); // it no should be necessary if used in the same render pass\n\n\t\tthis.scatteringLight( directLight, builder );\n\n\t}\n\n\tdirectRectArea( { lightColor, lightPosition, halfWidth, halfHeight }, builder ) {\n\n\t\tconst p0 = lightPosition.add( halfWidth ).sub( halfHeight ); // counterclockwise; light shines in local neg z direction\n\t\tconst p1 = lightPosition.sub( halfWidth ).sub( halfHeight );\n\t\tconst p2 = lightPosition.sub( halfWidth ).add( halfHeight );\n\t\tconst p3 = lightPosition.add( halfWidth ).add( halfHeight );\n\n\t\tconst P = builder.context.positionView;\n\n\t\tconst directLight = lightColor.xyz.mul( LTC_Evaluate_Volume( { P, p0, p1, p2, p3 } ) ).pow( 1.5 );\n\n\t\tthis.scatteringLight( directLight, builder );\n\n\t}\n\n\tfinish( builder ) {\n\n\t\tbuilder.context.outgoingLight.assign( outgoingRayLight );\n\n\t}\n\n}\n\n/**\n * Volume node material.\n *\n * @augments NodeMaterial\n */\nclass VolumeNodeMaterial extends NodeMaterial {\n\n\tstatic get type() {\n\n\t\treturn 'VolumeNodeMaterial';\n\n\t}\n\n\t/**\n\t * Constructs a new volume node material.\n\t *\n\t * @param {Object} [parameters] - The configuration parameter.\n\t */\n\tconstructor( parameters ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isVolumeNodeMaterial = true;\n\n\t\t/**\n\t\t * Number of steps used for raymarching.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 25\n\t\t */\n\t\tthis.steps = 25;\n\n\t\t/**\n\t\t * Offsets the distance a ray has been traveled through a volume.\n\t\t * Can be used to implement dithering to reduce banding.\n\t\t *\n\t\t * @type {Node<float>}\n\t\t * @default null\n\t\t */\n\t\tthis.offsetNode = null;\n\n\t\t/**\n\t\t * Node used for scattering calculations.\n\t\t *\n\t\t * @type {Function|FunctionNode<vec4>}\n\t\t * @default null\n\t\t */\n\t\tthis.scatteringNode = null;\n\n\t\tthis.lights = true;\n\n\t\tthis.transparent = true;\n\t\tthis.side = BackSide;\n\n\t\tthis.depthTest = false;\n\t\tthis.depthWrite = false;\n\n\t\tthis.setValues( parameters );\n\n\t}\n\n\tsetupLightingModel() {\n\n\t\treturn new VolumetricLightingModel();\n\n\t}\n\n}\n\n/**\n * This module manages the internal animation loop of the renderer.\n *\n * @private\n */\nclass Animation {\n\n\t/**\n\t * Constructs a new animation loop management component.\n\t *\n\t * @param {Renderer} renderer - A reference to the main renderer.\n\t * @param {Nodes} nodes - Renderer component for managing nodes related logic.\n\t * @param {Info} info - Renderer component for managing metrics and monitoring data.\n\t */\n\tconstructor( renderer, nodes, info ) {\n\n\t\t/**\n\t\t * A reference to the main renderer.\n\t\t *\n\t\t * @type {Renderer}\n\t\t */\n\t\tthis.renderer = renderer;\n\n\t\t/**\n\t\t * Renderer component for managing nodes related logic.\n\t\t *\n\t\t * @type {Nodes}\n\t\t */\n\t\tthis.nodes = nodes;\n\n\t\t/**\n\t\t * Renderer component for managing metrics and monitoring data.\n\t\t *\n\t\t * @type {Info}\n\t\t */\n\t\tthis.info = info;\n\n\t\t/**\n\t\t * A reference to the context from `requestAnimationFrame()` can\n\t\t * be called (usually `window`).\n\t\t *\n\t\t * @type {?(Window|XRSession)}\n\t\t */\n\t\tthis._context = typeof self !== 'undefined' ? self : null;\n\n\t\t/**\n\t\t * The user-defined animation loop.\n\t\t *\n\t\t * @type {?Function}\n\t\t * @default null\n\t\t */\n\t\tthis._animationLoop = null;\n\n\t\t/**\n\t\t * The requestId which is returned from the `requestAnimationFrame()` call.\n\t\t * Can be used to cancel the stop the animation loop.\n\t\t *\n\t\t * @type {?number}\n\t\t * @default null\n\t\t */\n\t\tthis._requestId = null;\n\n\t}\n\n\t/**\n\t * Starts the internal animation loop.\n\t */\n\tstart() {\n\n\t\tconst update = ( time, xrFrame ) => {\n\n\t\t\tthis._requestId = this._context.requestAnimationFrame( update );\n\n\t\t\tif ( this.info.autoReset === true ) this.info.reset();\n\n\t\t\tthis.nodes.nodeFrame.update();\n\n\t\t\tthis.info.frame = this.nodes.nodeFrame.frameId;\n\n\t\t\tthis.renderer._inspector.begin();\n\n\t\t\tif ( this._animationLoop !== null ) this._animationLoop( time, xrFrame );\n\n\t\t\tthis.renderer._inspector.finish();\n\n\t\t};\n\n\t\tupdate();\n\n\t}\n\n\t/**\n\t * Stops the internal animation loop.\n\t */\n\tstop() {\n\n\t\tthis._context.cancelAnimationFrame( this._requestId );\n\n\t\tthis._requestId = null;\n\n\t}\n\n\t/**\n\t * Returns the user-level animation loop.\n\t *\n\t * @return {?Function} The animation loop.\n\t */\n\tgetAnimationLoop() {\n\n\t\treturn this._animationLoop;\n\n\t}\n\n\t/**\n\t * Defines the user-level animation loop.\n\t *\n\t * @param {?Function} callback - The animation loop.\n\t */\n\tsetAnimationLoop( callback ) {\n\n\t\tthis._animationLoop = callback;\n\n\t}\n\n\t/**\n\t * Returns the animation context.\n\t *\n\t * @return {Window|XRSession} The animation context.\n\t */\n\tgetContext() {\n\n\t\treturn this._context;\n\n\t}\n\n\t/**\n\t * Defines the context in which `requestAnimationFrame()` is executed.\n\t *\n\t * @param {Window|XRSession} context - The context to set.\n\t */\n\tsetContext( context ) {\n\n\t\tthis._context = context;\n\n\t}\n\n\t/**\n\t * Frees all internal resources and stops the animation loop.\n\t */\n\tdispose() {\n\n\t\tthis.stop();\n\n\t}\n\n}\n\n/**\n * Data structure for the renderer. It allows defining values\n * with chained, hierarchical keys. Keys are meant to be\n * objects since the module internally works with Weak Maps\n * for performance reasons.\n *\n * @private\n */\nclass ChainMap {\n\n\t/**\n\t * Constructs a new Chain Map.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * A map of Weak Maps by their key length.\n\t\t *\n\t\t * @type {Object<number, WeakMap>}\n\t\t */\n\t\tthis.weakMaps = {};\n\n\n\t}\n\n\t/**\n\t * Returns the Weak Map for the given keys.\n\t *\n\t * @param {Array<Object>} keys - List of keys.\n\t * @return {WeakMap} The weak map.\n\t */\n\t_getWeakMap( keys ) {\n\n\t\tconst length = keys.length;\n\n\t\tlet weakMap = this.weakMaps[ length ];\n\n\t\tif ( weakMap === undefined ) {\n\n\t\t\tweakMap = new WeakMap();\n\t\t\tthis.weakMaps[ length ] = weakMap;\n\n\t\t}\n\n\t\treturn weakMap;\n\n\t}\n\n\t/**\n\t * Returns the value for the given array of keys.\n\t *\n\t * @param {Array<Object>} keys - List of keys.\n\t * @return {any} The value. Returns `undefined` if no value was found.\n\t */\n\tget( keys ) {\n\n\t\tlet map = this._getWeakMap( keys );\n\n\t\tfor ( let i = 0; i < keys.length - 1; i ++ ) {\n\n\t\t\tmap = map.get( keys[ i ] );\n\n\t\t\tif ( map === undefined ) return undefined;\n\n\t\t}\n\n\t\treturn map.get( keys[ keys.length - 1 ] );\n\n\t}\n\n\t/**\n\t * Sets the value for the given keys.\n\t *\n\t * @param {Array<Object>} keys - List of keys.\n\t * @param {any} value - The value to set.\n\t * @return {ChainMap} A reference to this Chain Map.\n\t */\n\tset( keys, value ) {\n\n\t\tlet map = this._getWeakMap( keys );\n\n\t\tfor ( let i = 0; i < keys.length - 1; i ++ ) {\n\n\t\t\tconst key = keys[ i ];\n\n\t\t\tif ( map.has( key ) === false ) map.set( key, new WeakMap() );\n\n\t\t\tmap = map.get( key );\n\n\t\t}\n\n\t\tmap.set( keys[ keys.length - 1 ], value );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Deletes a value for the given keys.\n\t *\n\t * @param {Array<Object>} keys - The keys.\n\t * @return {boolean} Returns `true` if the value has been removed successfully and `false` if the value has not be found.\n\t */\n\tdelete( keys ) {\n\n\t\tlet map = this._getWeakMap( keys );\n\n\t\tfor ( let i = 0; i < keys.length - 1; i ++ ) {\n\n\t\t\tmap = map.get( keys[ i ] );\n\n\t\t\tif ( map === undefined ) return false;\n\n\t\t}\n\n\t\treturn map.delete( keys[ keys.length - 1 ] );\n\n\t}\n\n}\n\nlet _id$a = 0;\n\nfunction getKeys( obj ) {\n\n\tconst keys = Object.keys( obj );\n\n\tlet proto = Object.getPrototypeOf( obj );\n\n\twhile ( proto ) {\n\n\t\tconst descriptors = Object.getOwnPropertyDescriptors( proto );\n\n\t\tfor ( const key in descriptors ) {\n\n\t\t\tif ( descriptors[ key ] !== undefined ) {\n\n\t\t\t\tconst descriptor = descriptors[ key ];\n\n\t\t\t\tif ( descriptor && typeof descriptor.get === 'function' ) {\n\n\t\t\t\t\tkeys.push( key );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tproto = Object.getPrototypeOf( proto );\n\n\t}\n\n\treturn keys;\n\n}\n\n/**\n * A render object is the renderer's representation of single entity that gets drawn\n * with a draw command. There is no unique mapping of render objects to 3D objects in the\n * scene since render objects also depend from the used material, the current render context\n * and the current scene's lighting.\n *\n * In general, the basic process of the renderer is:\n *\n * - Analyze the 3D objects in the scene and generate render lists containing render items.\n * - Process the render lists by calling one or more render commands for each render item.\n * - For each render command, request a render object and perform the draw.\n *\n * The module provides an interface to get data required for the draw command like the actual\n * draw parameters or vertex buffers. It also holds a series of caching related methods since\n * creating render objects should only be done when necessary.\n *\n * @private\n */\nclass RenderObject {\n\n\t/**\n\t * Constructs a new render object.\n\t *\n\t * @param {Nodes} nodes - Renderer component for managing nodes related logic.\n\t * @param {Geometries} geometries - Renderer component for managing geometries.\n\t * @param {Renderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Material} material - The 3D object's material.\n\t * @param {Scene} scene - The scene the 3D object belongs to.\n\t * @param {Camera} camera - The camera the object should be rendered with.\n\t * @param {LightsNode} lightsNode - The lights node.\n\t * @param {RenderContext} renderContext - The render context.\n\t * @param {ClippingContext} clippingContext - The clipping context.\n\t */\n\tconstructor( nodes, geometries, renderer, object, material, scene, camera, lightsNode, renderContext, clippingContext ) {\n\n\t\tthis.id = _id$a ++;\n\n\t\t/**\n\t\t * Renderer component for managing nodes related logic.\n\t\t *\n\t\t * @type {Nodes}\n\t\t * @private\n\t\t */\n\t\tthis._nodes = nodes;\n\n\t\t/**\n\t\t * Renderer component for managing geometries.\n\t\t *\n\t\t * @type {Geometries}\n\t\t * @private\n\t\t */\n\t\tthis._geometries = geometries;\n\n\t\t/**\n\t\t * The renderer.\n\t\t *\n\t\t * @type {Renderer}\n\t\t */\n\t\tthis.renderer = renderer;\n\n\t\t/**\n\t\t * The 3D object.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.object = object;\n\n\t\t/**\n\t\t * The 3D object's material.\n\t\t *\n\t\t * @type {Material}\n\t\t */\n\t\tthis.material = material;\n\n\t\t/**\n\t\t * The scene the 3D object belongs to.\n\t\t *\n\t\t * @type {Scene}\n\t\t */\n\t\tthis.scene = scene;\n\n\t\t/**\n\t\t * The camera the 3D object should be rendered with.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = camera;\n\n\t\t/**\n\t\t * The lights node.\n\t\t *\n\t\t * @type {LightsNode}\n\t\t */\n\t\tthis.lightsNode = lightsNode;\n\n\t\t/**\n\t\t * The render context.\n\t\t *\n\t\t * @type {RenderContext}\n\t\t */\n\t\tthis.context = renderContext;\n\n\t\t/**\n\t\t * The 3D object's geometry.\n\t\t *\n\t\t * @type {BufferGeometry}\n\t\t */\n\t\tthis.geometry = object.geometry;\n\n\t\t/**\n\t\t * The render object's version.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.version = material.version;\n\n\t\t/**\n\t\t * The draw range of the geometry.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.drawRange = null;\n\n\t\t/**\n\t\t * An array holding the buffer attributes\n\t\t * of the render object. This entails attribute\n\t\t * definitions on geometry and node level.\n\t\t *\n\t\t * @type {?Array<BufferAttribute>}\n\t\t * @default null\n\t\t */\n\t\tthis.attributes = null;\n\n\t\t/**\n\t\t * An object holding the version of the\n\t\t * attributes. The keys are the attribute names\n\t\t * and the values are the attribute versions.\n\t\t *\n\t\t * @type {?Object<string, number>}\n\t\t * @default null\n\t\t */\n\t\tthis.attributesId = null;\n\n\t\t/**\n\t\t * A reference to a render pipeline the render\n\t\t * object is processed with.\n\t\t *\n\t\t * @type {RenderPipeline}\n\t\t * @default null\n\t\t */\n\t\tthis.pipeline = null;\n\n\t\t/**\n\t\t * Only relevant for objects using\n\t\t * multiple materials. This represents a group entry\n\t\t * from the respective `BufferGeometry`.\n\t\t *\n\t\t * @type {?{start: number, count: number}}\n\t\t * @default null\n\t\t */\n\t\tthis.group = null;\n\n\t\t/**\n\t\t * An array holding the vertex buffers which can\n\t\t * be buffer attributes but also interleaved buffers.\n\t\t *\n\t\t * @type {?Array<BufferAttribute|InterleavedBuffer>}\n\t\t * @default null\n\t\t */\n\t\tthis.vertexBuffers = null;\n\n\t\t/**\n\t\t * The parameters for the draw command.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.drawParams = null;\n\n\t\t/**\n\t\t * If this render object is used inside a render bundle,\n\t\t * this property points to the respective bundle group.\n\t\t *\n\t\t * @type {?BundleGroup}\n\t\t * @default null\n\t\t */\n\t\tthis.bundle = null;\n\n\t\t/**\n\t\t * The clipping context.\n\t\t *\n\t\t * @type {ClippingContext}\n\t\t */\n\t\tthis.clippingContext = clippingContext;\n\n\t\t/**\n\t\t * The clipping context's cache key.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.clippingContextCacheKey = clippingContext !== null ? clippingContext.cacheKey : '';\n\n\t\t/**\n\t\t * The initial node cache key.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.initialNodesCacheKey = this.getDynamicCacheKey();\n\n\t\t/**\n\t\t * The initial cache key.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.initialCacheKey = this.getCacheKey();\n\n\t\t/**\n\t\t * The node builder state.\n\t\t *\n\t\t * @type {?NodeBuilderState}\n\t\t * @private\n\t\t * @default null\n\t\t */\n\t\tthis._nodeBuilderState = null;\n\n\t\t/**\n\t\t * An array of bindings.\n\t\t *\n\t\t * @type {?Array<BindGroup>}\n\t\t * @private\n\t\t * @default null\n\t\t */\n\t\tthis._bindings = null;\n\n\t\t/**\n\t\t * Reference to the node material observer.\n\t\t *\n\t\t * @type {?NodeMaterialObserver}\n\t\t * @private\n\t\t * @default null\n\t\t */\n\t\tthis._monitor = null;\n\n\t\t/**\n\t\t * An event listener which is defined by `RenderObjects`. It performs\n\t\t * clean up tasks when `dispose()` on this render object.\n\t\t *\n\t\t * @method\n\t\t */\n\t\tthis.onDispose = null;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRenderObject = true;\n\n\t\t/**\n\t\t * An event listener which is executed when `dispose()` is called on\n\t\t * the material of this render object.\n\t\t *\n\t\t * @method\n\t\t */\n\t\tthis.onMaterialDispose = () => {\n\n\t\t\tthis.dispose();\n\n\t\t};\n\n\t\t/**\n\t\t * An event listener which is executed when `dispose()` is called on\n\t\t * the geometry of this render object.\n\t\t *\n\t\t * @method\n\t\t */\n\t\tthis.onGeometryDispose = () => {\n\n\t\t\t// clear geometry cache attributes\n\n\t\t\tthis.attributes = null;\n\t\t\tthis.attributesId = null;\n\n\t\t};\n\n\t\tthis.material.addEventListener( 'dispose', this.onMaterialDispose );\n\t\tthis.geometry.addEventListener( 'dispose', this.onGeometryDispose );\n\n\t}\n\n\t/**\n\t * Updates the clipping context.\n\t *\n\t * @param {ClippingContext} context - The clipping context to set.\n\t */\n\tupdateClipping( context ) {\n\n\t\tthis.clippingContext = context;\n\n\t}\n\n\t/**\n\t * Whether the clipping requires an update or not.\n\t *\n\t * @type {boolean}\n\t * @readonly\n\t */\n\tget clippingNeedsUpdate() {\n\n\t\tif ( this.clippingContext === null || this.clippingContext.cacheKey === this.clippingContextCacheKey ) return false;\n\n\t\tthis.clippingContextCacheKey = this.clippingContext.cacheKey;\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * The number of clipping planes defined in context of hardware clipping.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget hardwareClippingPlanes() {\n\n\t\treturn this.material.hardwareClipping === true ? this.clippingContext.unionClippingCount : 0;\n\n\t}\n\n\t/**\n\t * Returns the node builder state of this render object.\n\t *\n\t * @return {NodeBuilderState} The node builder state.\n\t */\n\tgetNodeBuilderState() {\n\n\t\treturn this._nodeBuilderState || ( this._nodeBuilderState = this._nodes.getForRender( this ) );\n\n\t}\n\n\t/**\n\t * Returns the node material observer of this render object.\n\t *\n\t * @return {NodeMaterialObserver} The node material observer.\n\t */\n\tgetMonitor() {\n\n\t\treturn this._monitor || ( this._monitor = this.getNodeBuilderState().observer );\n\n\t}\n\n\t/**\n\t * Returns an array of bind groups of this render object.\n\t *\n\t * @return {Array<BindGroup>} The bindings.\n\t */\n\tgetBindings() {\n\n\t\treturn this._bindings || ( this._bindings = this.getNodeBuilderState().createBindings() );\n\n\t}\n\n\t/**\n\t * Returns a binding group by group name of this render object.\n\t *\n\t * @param {string} name - The name of the binding group.\n\t * @return {?BindGroup} The bindings.\n\t */\n\tgetBindingGroup( name ) {\n\n\t\tfor ( const bindingGroup of this.getBindings() ) {\n\n\t\t\tif ( bindingGroup.name === name ) {\n\n\t\t\t\treturn bindingGroup;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the index of the render object's geometry.\n\t *\n\t * @return {?BufferAttribute} The index. Returns `null` for non-indexed geometries.\n\t */\n\tgetIndex() {\n\n\t\treturn this._geometries.getIndex( this );\n\n\t}\n\n\t/**\n\t * Returns the indirect buffer attribute.\n\t *\n\t * @return {?BufferAttribute} The indirect attribute. `null` if no indirect drawing is used.\n\t */\n\tgetIndirect() {\n\n\t\treturn this._geometries.getIndirect( this );\n\n\t}\n\n\t/**\n\t * Returns the byte offset into the indirect attribute buffer.\n\t *\n\t * @return {number|Array<number>} The byte offset into the indirect attribute buffer.\n\t */\n\tgetIndirectOffset() {\n\n\t\treturn this._geometries.getIndirectOffset( this );\n\n\t}\n\n\t/**\n\t * Returns an array that acts as a key for identifying the render object in a chain map.\n\t *\n\t * @return {Array<Object>} An array with object references.\n\t */\n\tgetChainArray() {\n\n\t\treturn [ this.object, this.material, this.context, this.lightsNode ];\n\n\t}\n\n\t/**\n\t * This method is used when the geometry of a 3D object has been exchanged and the\n\t * respective render object now requires an update.\n\t *\n\t * @param {BufferGeometry} geometry - The geometry to set.\n\t */\n\tsetGeometry( geometry ) {\n\n\t\tthis.geometry = geometry;\n\t\tthis.attributes = null;\n\t\tthis.attributesId = null;\n\n\t}\n\n\t/**\n\t * Returns the buffer attributes of the render object. The returned array holds\n\t * attribute definitions on geometry and node level.\n\t *\n\t * @return {Array<BufferAttribute>} An array with buffer attributes.\n\t */\n\tgetAttributes() {\n\n\t\tif ( this.attributes !== null ) return this.attributes;\n\n\t\tconst nodeAttributes = this.getNodeBuilderState().nodeAttributes;\n\t\tconst geometry = this.geometry;\n\n\t\tconst attributes = [];\n\t\tconst vertexBuffers = new Set();\n\n\t\tconst attributesId = {};\n\n\t\tfor ( const nodeAttribute of nodeAttributes ) {\n\n\t\t\tlet attribute;\n\n\t\t\tif ( nodeAttribute.node && nodeAttribute.node.attribute ) {\n\n\t\t\t\t// node attribute\n\t\t\t\tattribute = nodeAttribute.node.attribute;\n\n\t\t\t} else {\n\n\t\t\t\t// geometry attribute\n\t\t\t\tattribute = geometry.getAttribute( nodeAttribute.name );\n\n\t\t\t\tattributesId[ nodeAttribute.name ] = attribute.version;\n\n\t\t\t}\n\n\t\t\tif ( attribute === undefined ) continue;\n\n\t\t\tattributes.push( attribute );\n\n\t\t\tconst bufferAttribute = attribute.isInterleavedBufferAttribute ? attribute.data : attribute;\n\t\t\tvertexBuffers.add( bufferAttribute );\n\n\t\t}\n\n\t\tthis.attributes = attributes;\n\t\tthis.attributesId = attributesId;\n\t\tthis.vertexBuffers = Array.from( vertexBuffers.values() );\n\n\t\treturn attributes;\n\n\t}\n\n\t/**\n\t * Returns the vertex buffers of the render object.\n\t *\n\t * @return {Array<BufferAttribute|InterleavedBuffer>} An array with buffer attribute or interleaved buffers.\n\t */\n\tgetVertexBuffers() {\n\n\t\tif ( this.vertexBuffers === null ) this.getAttributes();\n\n\t\treturn this.vertexBuffers;\n\n\t}\n\n\t/**\n\t * Returns the draw parameters for the render object.\n\t *\n\t * @return {?{vertexCount: number, firstVertex: number, instanceCount: number, firstInstance: number}} The draw parameters.\n\t */\n\tgetDrawParameters() {\n\n\t\tconst { object, material, geometry, group, drawRange } = this;\n\n\t\tconst drawParams = this.drawParams || ( this.drawParams = {\n\t\t\tvertexCount: 0,\n\t\t\tfirstVertex: 0,\n\t\t\tinstanceCount: 0,\n\t\t\tfirstInstance: 0\n\t\t} );\n\n\t\tconst index = this.getIndex();\n\t\tconst hasIndex = ( index !== null );\n\n\t\tlet instanceCount = 1;\n\n\t\tif ( geometry.isInstancedBufferGeometry === true ) {\n\n\t\t\tinstanceCount = geometry.instanceCount;\n\n\t\t} else if ( object.count !== undefined ) {\n\n\t\t\tinstanceCount = Math.max( 0, object.count );\n\n\t\t}\n\n\t\tif ( instanceCount === 0 ) return null;\n\n\t\tdrawParams.instanceCount = instanceCount;\n\n\t\tif ( object.isBatchedMesh === true ) return drawParams;\n\n\t\tlet rangeFactor = 1;\n\n\t\tif ( material.wireframe === true && ! object.isPoints && ! object.isLineSegments && ! object.isLine && ! object.isLineLoop ) {\n\n\t\t\trangeFactor = 2;\n\n\t\t}\n\n\t\tlet firstVertex = drawRange.start * rangeFactor;\n\t\tlet lastVertex = ( drawRange.start + drawRange.count ) * rangeFactor;\n\n\t\tif ( group !== null ) {\n\n\t\t\tfirstVertex = Math.max( firstVertex, group.start * rangeFactor );\n\t\t\tlastVertex = Math.min( lastVertex, ( group.start + group.count ) * rangeFactor );\n\n\t\t}\n\n\t\tconst position = geometry.attributes.position;\n\t\tlet itemCount = Infinity;\n\n\t\tif ( hasIndex ) {\n\n\t\t\titemCount = index.count;\n\n\t\t} else if ( position !== undefined && position !== null ) {\n\n\t\t\titemCount = position.count;\n\n\t\t}\n\n\t\tfirstVertex = Math.max( firstVertex, 0 );\n\t\tlastVertex = Math.min( lastVertex, itemCount );\n\n\t\tconst count = lastVertex - firstVertex;\n\n\t\tif ( count < 0 || count === Infinity ) return null;\n\n\t\tdrawParams.vertexCount = count;\n\t\tdrawParams.firstVertex = firstVertex;\n\n\t\treturn drawParams;\n\n\t}\n\n\t/**\n\t * Returns the render object's geometry cache key.\n\t *\n\t * The geometry cache key is part of the material cache key.\n\t *\n\t * @return {string} The geometry cache key.\n\t */\n\tgetGeometryCacheKey() {\n\n\t\tconst { geometry } = this;\n\n\t\tlet cacheKey = '';\n\n\t\tfor ( const name of Object.keys( geometry.attributes ).sort() ) {\n\n\t\t\tconst attribute = geometry.attributes[ name ];\n\n\t\t\tcacheKey += name + ',';\n\n\t\t\tif ( attribute.data ) cacheKey += attribute.data.stride + ',';\n\t\t\tif ( attribute.offset ) cacheKey += attribute.offset + ',';\n\t\t\tif ( attribute.itemSize ) cacheKey += attribute.itemSize + ',';\n\t\t\tif ( attribute.normalized ) cacheKey += 'n,';\n\n\t\t}\n\n\t\t// structural equality isn't sufficient for morph targets since the\n\t\t// data are maintained in textures. only if the targets are all equal\n\t\t// the texture and thus the instance of `MorphNode` can be shared.\n\n\t\tfor ( const name of Object.keys( geometry.morphAttributes ).sort() ) {\n\n\t\t\tconst targets = geometry.morphAttributes[ name ];\n\n\t\t\tcacheKey += 'morph-' + name + ',';\n\n\t\t\tfor ( let i = 0, l = targets.length; i < l; i ++ ) {\n\n\t\t\t\tconst attribute = targets[ i ];\n\n\t\t\t\tcacheKey += attribute.id + ',';\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( geometry.index ) {\n\n\t\t\tcacheKey += 'index,';\n\n\t\t}\n\n\t\treturn cacheKey;\n\n\t}\n\n\t/**\n\t * Returns the render object's material cache key.\n\t *\n\t * The material cache key is part of the render object cache key.\n\t *\n\t * @return {number} The material cache key.\n\t */\n\tgetMaterialCacheKey() {\n\n\t\tconst { object, material, renderer } = this;\n\n\t\tlet cacheKey = material.customProgramCacheKey();\n\n\t\tfor ( const property of getKeys( material ) ) {\n\n\t\t\tif ( /^(is[A-Z]|_)|^(visible|version|uuid|name|opacity|userData)$/.test( property ) ) continue;\n\n\t\t\tconst value = material[ property ];\n\n\t\t\tlet valueKey;\n\n\t\t\tif ( value !== null ) {\n\n\t\t\t\t// some material values require a formatting\n\n\t\t\t\tconst type = typeof value;\n\n\t\t\t\tif ( type === 'number' ) {\n\n\t\t\t\t\tvalueKey = value !== 0 ? '1' : '0'; // Convert to on/off, important for clearcoat, transmission, etc\n\n\t\t\t\t} else if ( type === 'object' ) {\n\n\t\t\t\t\tvalueKey = '{';\n\n\t\t\t\t\tif ( value.isTexture ) {\n\n\t\t\t\t\t\tvalueKey += value.mapping;\n\n\t\t\t\t\t\t// WebGPU must honor the sampler data because they are part of the bindings\n\n\t\t\t\t\t\tif ( renderer.backend.isWebGPUBackend === true ) {\n\n\t\t\t\t\t\t\tvalueKey += value.magFilter;\n\t\t\t\t\t\t\tvalueKey += value.minFilter;\n\t\t\t\t\t\t\tvalueKey += value.wrapS;\n\t\t\t\t\t\t\tvalueKey += value.wrapT;\n\t\t\t\t\t\t\tvalueKey += value.wrapR;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tvalueKey += '}';\n\n\t\t\t\t} else {\n\n\t\t\t\t\tvalueKey = String( value );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvalueKey = String( value );\n\n\t\t\t}\n\n\t\t\tcacheKey += /*property + ':' +*/ valueKey + ',';\n\n\t\t}\n\n\t\tcacheKey += this.clippingContextCacheKey + ',';\n\n\t\tif ( object.geometry ) {\n\n\t\t\tcacheKey += this.getGeometryCacheKey();\n\n\t\t}\n\n\t\tif ( object.skeleton ) {\n\n\t\t\tcacheKey += object.skeleton.bones.length + ',';\n\n\t\t}\n\n\t\tif ( object.isBatchedMesh ) {\n\n\t\t\tcacheKey += object._matricesTexture.uuid + ',';\n\n\t\t\tif ( object._colorsTexture !== null ) {\n\n\t\t\t\tcacheKey += object._colorsTexture.uuid + ',';\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( object.isInstancedMesh || object.count > 1 || Array.isArray( object.morphTargetInfluences ) ) {\n\n\t\t\t// TODO: https://github.com/mrdoob/three.js/pull/29066#issuecomment-2269400850\n\n\t\t\tcacheKey += object.uuid + ',';\n\n\t\t}\n\n\t\tcacheKey += this.context.id + ',';\n\n\t\tcacheKey += object.receiveShadow + ',';\n\n\t\treturn hashString( cacheKey );\n\n\t}\n\n\t/**\n\t * Whether the geometry requires an update or not.\n\t *\n\t * @type {boolean}\n\t * @readonly\n\t */\n\tget needsGeometryUpdate() {\n\n\t\tif ( this.geometry.id !== this.object.geometry.id ) return true;\n\n\t\tif ( this.attributes !== null ) {\n\n\t\t\tconst attributesId = this.attributesId;\n\n\t\t\tfor ( const name in attributesId ) {\n\n\t\t\t\tconst attribute = this.geometry.getAttribute( name );\n\n\t\t\t\tif ( attribute === undefined || attributesId[ name ] !== attribute.id ) {\n\n\t\t\t\t\treturn true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Whether the render object requires an update or not.\n\t *\n\t * Note: There are two distinct places where render objects are checked for an update.\n\t *\n\t * 1. In `RenderObjects.get()` which is executed when the render object is request. This\n\t * method checks the `needsUpdate` flag and recreates the render object if necessary.\n\t * 2. In `Renderer._renderObjectDirect()` right after getting the render object via\n\t * `RenderObjects.get()`. The render object's NodeMaterialObserver is then used to detect\n\t * a need for a refresh due to material, geometry or object related value changes.\n\t *\n\t * TODO: Investigate if it's possible to merge both steps so there is only a single place\n\t * that performs the 'needsUpdate' check.\n\t *\n\t * @type {boolean}\n\t * @readonly\n\t */\n\tget needsUpdate() {\n\n\t\treturn /*this.object.static !== true &&*/ ( this.initialNodesCacheKey !== this.getDynamicCacheKey() || this.clippingNeedsUpdate );\n\n\t}\n\n\t/**\n\t * Returns the dynamic cache key which represents a key that is computed per draw command.\n\t *\n\t * @return {number} The cache key.\n\t */\n\tgetDynamicCacheKey() {\n\n\t\tlet cacheKey = 0;\n\n\t\t// `Nodes.getCacheKey()` returns an environment cache key which is not relevant when\n\t\t// the renderer is inside a shadow pass.\n\n\t\tif ( this.material.isShadowPassMaterial !== true ) {\n\n\t\t\tcacheKey = this._nodes.getCacheKey( this.scene, this.lightsNode );\n\n\t\t}\n\n\t\tif ( this.camera.isArrayCamera ) {\n\n\t\t\tcacheKey = hash$1( cacheKey, this.camera.cameras.length );\n\n\t\t}\n\n\t\tif ( this.object.receiveShadow ) {\n\n\t\t\tcacheKey = hash$1( cacheKey, 1 );\n\n\t\t}\n\n\t\tcacheKey = hash$1( cacheKey, this.camera.id, this.renderer.contextNode.id, this.renderer.contextNode.version );\n\n\t\treturn cacheKey;\n\n\t}\n\n\t/**\n\t * Returns the render object's cache key.\n\t *\n\t * @return {number} The cache key.\n\t */\n\tgetCacheKey() {\n\n\t\treturn this.getMaterialCacheKey() + this.getDynamicCacheKey();\n\n\t}\n\n\t/**\n\t * Frees internal resources.\n\t */\n\tdispose() {\n\n\t\tthis.material.removeEventListener( 'dispose', this.onMaterialDispose );\n\t\tthis.geometry.removeEventListener( 'dispose', this.onGeometryDispose );\n\n\t\tthis.onDispose();\n\n\t}\n\n}\n\nconst _chainKeys$5 = [];\n\n/**\n * This module manages the render objects of the renderer.\n *\n * @private\n */\nclass RenderObjects {\n\n\t/**\n\t * Constructs a new render object management component.\n\t *\n\t * @param {Renderer} renderer - The renderer.\n\t * @param {Nodes} nodes - Renderer component for managing nodes related logic.\n\t * @param {Geometries} geometries - Renderer component for managing geometries.\n\t * @param {Pipelines} pipelines - Renderer component for managing pipelines.\n\t * @param {Bindings} bindings - Renderer component for managing bindings.\n\t * @param {Info} info - Renderer component for managing metrics and monitoring data.\n\t */\n\tconstructor( renderer, nodes, geometries, pipelines, bindings, info ) {\n\n\t\t/**\n\t\t * The renderer.\n\t\t *\n\t\t * @type {Renderer}\n\t\t */\n\t\tthis.renderer = renderer;\n\n\t\t/**\n\t\t * Renderer component for managing nodes related logic.\n\t\t *\n\t\t * @type {Nodes}\n\t\t */\n\t\tthis.nodes = nodes;\n\n\t\t/**\n\t\t * Renderer component for managing geometries.\n\t\t *\n\t\t * @type {Geometries}\n\t\t */\n\t\tthis.geometries = geometries;\n\n\t\t/**\n\t\t * Renderer component for managing pipelines.\n\t\t *\n\t\t * @type {Pipelines}\n\t\t */\n\t\tthis.pipelines = pipelines;\n\n\t\t/**\n\t\t * Renderer component for managing bindings.\n\t\t *\n\t\t * @type {Bindings}\n\t\t */\n\t\tthis.bindings = bindings;\n\n\t\t/**\n\t\t * Renderer component for managing metrics and monitoring data.\n\t\t *\n\t\t * @type {Info}\n\t\t */\n\t\tthis.info = info;\n\n\t\t/**\n\t\t * A dictionary that manages render contexts in chain maps\n\t\t * for each pass ID.\n\t\t *\n\t\t * @type {Object<string,ChainMap>}\n\t\t */\n\t\tthis.chainMaps = {};\n\n\t}\n\n\t/**\n\t * Returns a render object for the given object and state data.\n\t *\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Material} material - The 3D object's material.\n\t * @param {Scene} scene - The scene the 3D object belongs to.\n\t * @param {Camera} camera - The camera the 3D object should be rendered with.\n\t * @param {LightsNode} lightsNode - The lights node.\n\t * @param {RenderContext} renderContext - The render context.\n\t * @param {ClippingContext} clippingContext - The clipping context.\n\t * @param {string} [passId] - An optional ID for identifying the pass.\n\t * @return {RenderObject} The render object.\n\t */\n\tget( object, material, scene, camera, lightsNode, renderContext, clippingContext, passId ) {\n\n\t\tconst chainMap = this.getChainMap( passId );\n\n\t\t// reuse chainArray\n\t\t_chainKeys$5[ 0 ] = object;\n\t\t_chainKeys$5[ 1 ] = material;\n\t\t_chainKeys$5[ 2 ] = renderContext;\n\t\t_chainKeys$5[ 3 ] = lightsNode;\n\n\t\tlet renderObject = chainMap.get( _chainKeys$5 );\n\n\t\tif ( renderObject === undefined ) {\n\n\t\t\trenderObject = this.createRenderObject( this.nodes, this.geometries, this.renderer, object, material, scene, camera, lightsNode, renderContext, clippingContext, passId );\n\n\t\t\tchainMap.set( _chainKeys$5, renderObject );\n\n\t\t} else {\n\n\t\t\trenderObject.updateClipping( clippingContext );\n\n\t\t\tif ( renderObject.needsGeometryUpdate ) {\n\n\t\t\t\trenderObject.setGeometry( object.geometry );\n\n\t\t\t}\n\n\t\t\tif ( renderObject.version !== material.version || renderObject.needsUpdate ) {\n\n\t\t\t\tif ( renderObject.initialCacheKey !== renderObject.getCacheKey() ) {\n\n\t\t\t\t\trenderObject.dispose();\n\n\t\t\t\t\trenderObject = this.get( object, material, scene, camera, lightsNode, renderContext, clippingContext, passId );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderObject.version = material.version;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t_chainKeys$5.length = 0;\n\n\t\treturn renderObject;\n\n\t}\n\n\t/**\n\t * Returns a chain map for the given pass ID.\n\t *\n\t * @param {string} [passId='default'] - The pass ID.\n\t * @return {ChainMap} The chain map.\n\t */\n\tgetChainMap( passId = 'default' ) {\n\n\t\treturn this.chainMaps[ passId ] || ( this.chainMaps[ passId ] = new ChainMap() );\n\n\t}\n\n\t/**\n\t * Frees internal resources.\n\t */\n\tdispose() {\n\n\t\tthis.chainMaps = {};\n\n\t}\n\n\t/**\n\t * Factory method for creating render objects with the given list of parameters.\n\t *\n\t * @param {Nodes} nodes - Renderer component for managing nodes related logic.\n\t * @param {Geometries} geometries - Renderer component for managing geometries.\n\t * @param {Renderer} renderer - The renderer.\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Material} material - The object's material.\n\t * @param {Scene} scene - The scene the 3D object belongs to.\n\t * @param {Camera} camera - The camera the object should be rendered with.\n\t * @param {LightsNode} lightsNode - The lights node.\n\t * @param {RenderContext} renderContext - The render context.\n\t * @param {ClippingContext} clippingContext - The clipping context.\n\t * @param {string} [passId] - An optional ID for identifying the pass.\n\t * @return {RenderObject} The render object.\n\t */\n\tcreateRenderObject( nodes, geometries, renderer, object, material, scene, camera, lightsNode, renderContext, clippingContext, passId ) {\n\n\t\tconst chainMap = this.getChainMap( passId );\n\n\t\tconst renderObject = new RenderObject( nodes, geometries, renderer, object, material, scene, camera, lightsNode, renderContext, clippingContext );\n\n\t\trenderObject.onDispose = () => {\n\n\t\t\tthis.pipelines.delete( renderObject );\n\t\t\tthis.bindings.deleteForRender( renderObject );\n\t\t\tthis.nodes.delete( renderObject );\n\n\t\t\tchainMap.delete( renderObject.getChainArray() );\n\n\t\t};\n\n\t\treturn renderObject;\n\n\t}\n\n\n}\n\n/**\n * Data structure for the renderer. It is intended to manage\n * data of objects in dictionaries.\n *\n * @private\n */\nclass DataMap {\n\n\t/**\n\t * Constructs a new data map.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * `DataMap` internally uses a weak map\n\t\t * to manage its data.\n\t\t *\n\t\t * @type {WeakMap<Object, Object>}\n\t\t */\n\t\tthis.data = new WeakMap();\n\n\t}\n\n\t/**\n\t * Returns the dictionary for the given object.\n\t *\n\t * @param {Object} object - The object.\n\t * @return {Object} The dictionary.\n\t */\n\tget( object ) {\n\n\t\tlet map = this.data.get( object );\n\n\t\tif ( map === undefined ) {\n\n\t\t\tmap = {};\n\t\t\tthis.data.set( object, map );\n\n\t\t}\n\n\t\treturn map;\n\n\t}\n\n\t/**\n\t * Deletes the dictionary for the given object.\n\t *\n\t * @param {Object} object - The object.\n\t * @return {?Object} The deleted dictionary.\n\t */\n\tdelete( object ) {\n\n\t\tlet map = null;\n\n\t\tif ( this.data.has( object ) ) {\n\n\t\t\tmap = this.data.get( object );\n\n\t\t\tthis.data.delete( object );\n\n\t\t}\n\n\t\treturn map;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given object has a dictionary defined.\n\t *\n\t * @param {Object} object - The object to test.\n\t * @return {boolean} Whether a dictionary is defined or not.\n\t */\n\thas( object ) {\n\n\t\treturn this.data.has( object );\n\n\t}\n\n\t/**\n\t * Frees internal resources.\n\t */\n\tdispose() {\n\n\t\tthis.data = new WeakMap();\n\n\t}\n\n}\n\nconst AttributeType = {\n\tVERTEX: 1,\n\tINDEX: 2,\n\tSTORAGE: 3,\n\tINDIRECT: 4\n};\n\n// size of a chunk in bytes (STD140 layout)\n\nconst GPU_CHUNK_BYTES = 16;\n\n// @TODO: Move to src/constants.js\n\nconst BlendColorFactor = 211;\nconst OneMinusBlendColorFactor = 212;\n\n/**\n * This renderer module manages geometry attributes.\n *\n * @private\n * @augments DataMap\n */\nclass Attributes extends DataMap {\n\n\t/**\n\t * Constructs a new attribute management component.\n\t *\n\t * @param {Backend} backend - The renderer's backend.\n\t */\n\tconstructor( backend ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The renderer's backend.\n\t\t *\n\t\t * @type {Backend}\n\t\t */\n\t\tthis.backend = backend;\n\n\t}\n\n\t/**\n\t * Deletes the data for the given attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The attribute.\n\t * @return {?Object} The deleted attribute data.\n\t */\n\tdelete( attribute ) {\n\n\t\tconst attributeData = super.delete( attribute );\n\n\t\tif ( attributeData !== null ) {\n\n\t\t\tthis.backend.destroyAttribute( attribute );\n\n\t\t}\n\n\t\treturn attributeData;\n\n\t}\n\n\t/**\n\t * Updates the given attribute. This method creates attribute buffers\n\t * for new attributes and updates data for existing ones.\n\t *\n\t * @param {BufferAttribute} attribute - The attribute to update.\n\t * @param {number} type - The attribute type.\n\t */\n\tupdate( attribute, type ) {\n\n\t\tconst data = this.get( attribute );\n\n\t\tif ( data.version === undefined ) {\n\n\t\t\tif ( type === AttributeType.VERTEX ) {\n\n\t\t\t\tthis.backend.createAttribute( attribute );\n\n\t\t\t} else if ( type === AttributeType.INDEX ) {\n\n\t\t\t\tthis.backend.createIndexAttribute( attribute );\n\n\t\t\t} else if ( type === AttributeType.STORAGE ) {\n\n\t\t\t\tthis.backend.createStorageAttribute( attribute );\n\n\t\t\t} else if ( type === AttributeType.INDIRECT ) {\n\n\t\t\t\tthis.backend.createIndirectStorageAttribute( attribute );\n\n\t\t\t}\n\n\t\t\tdata.version = this._getBufferAttribute( attribute ).version;\n\n\t\t} else {\n\n\t\t\tconst bufferAttribute = this._getBufferAttribute( attribute );\n\n\t\t\tif ( data.version < bufferAttribute.version || bufferAttribute.usage === DynamicDrawUsage ) {\n\n\t\t\t\tthis.backend.updateAttribute( attribute );\n\n\t\t\t\tdata.version = bufferAttribute.version;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Utility method for handling interleaved buffer attributes correctly.\n\t * To process them, their `InterleavedBuffer` is returned.\n\t *\n\t * @param {BufferAttribute} attribute - The attribute.\n\t * @return {BufferAttribute|InterleavedBuffer}\n\t */\n\t_getBufferAttribute( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\treturn attribute;\n\n\t}\n\n}\n\n/**\n * Returns the wireframe version for the given geometry.\n *\n * @private\n * @function\n * @param {BufferGeometry} geometry - The geometry.\n * @return {number} The version.\n */\nfunction getWireframeVersion( geometry ) {\n\n\treturn ( geometry.index !== null ) ? geometry.index.version : geometry.attributes.position.version;\n\n}\n\n/**\n * Returns a wireframe index attribute for the given geometry.\n *\n * @private\n * @function\n * @param {BufferGeometry} geometry - The geometry.\n * @return {BufferAttribute} The wireframe index attribute.\n */\nfunction getWireframeIndex( geometry ) {\n\n\tconst indices = [];\n\n\tconst geometryIndex = geometry.index;\n\tconst geometryPosition = geometry.attributes.position;\n\n\tif ( geometryIndex !== null ) {\n\n\t\tconst array = geometryIndex.array;\n\n\t\tfor ( let i = 0, l = array.length; i < l; i += 3 ) {\n\n\t\t\tconst a = array[ i + 0 ];\n\t\t\tconst b = array[ i + 1 ];\n\t\t\tconst c = array[ i + 2 ];\n\n\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t}\n\n\t} else {\n\n\t\tconst array = geometryPosition.array;\n\n\t\tfor ( let i = 0, l = ( array.length / 3 ) - 1; i < l; i += 3 ) {\n\n\t\t\tconst a = i + 0;\n\t\t\tconst b = i + 1;\n\t\t\tconst c = i + 2;\n\n\t\t\tindices.push( a, b, b, c, c, a );\n\n\t\t}\n\n\t}\n\n\tconst attribute = new ( arrayNeedsUint32( indices ) ? Uint32BufferAttribute : Uint16BufferAttribute )( indices, 1 );\n\tattribute.version = getWireframeVersion( geometry );\n\n\treturn attribute;\n\n}\n\n/**\n * This renderer module manages geometries.\n *\n * @private\n * @augments DataMap\n */\nclass Geometries extends DataMap {\n\n\t/**\n\t * Constructs a new geometry management component.\n\t *\n\t * @param {Attributes} attributes - Renderer component for managing attributes.\n\t * @param {Info} info - Renderer component for managing metrics and monitoring data.\n\t */\n\tconstructor( attributes, info ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * Renderer component for managing attributes.\n\t\t *\n\t\t * @type {Attributes}\n\t\t */\n\t\tthis.attributes = attributes;\n\n\t\t/**\n\t\t * Renderer component for managing metrics and monitoring data.\n\t\t *\n\t\t * @type {Info}\n\t\t */\n\t\tthis.info = info;\n\n\t\t/**\n\t\t * Weak Map for managing attributes for wireframe rendering.\n\t\t *\n\t\t * @type {WeakMap<BufferGeometry,BufferAttribute>}\n\t\t */\n\t\tthis.wireframes = new WeakMap();\n\n\t\t/**\n\t\t * This Weak Map is used to make sure buffer attributes are\n\t\t * updated only once per render call.\n\t\t *\n\t\t * @type {WeakMap<BufferAttribute,number>}\n\t\t */\n\t\tthis.attributeCall = new WeakMap();\n\n\t\t/**\n\t\t * Stores the event listeners attached to geometries.\n\t\t *\n\t\t * @private\n\t\t * @type {Map<BufferGeometry,Function>}\n\t\t */\n\t\tthis._geometryDisposeListeners = new Map();\n\n\t}\n\n\t/**\n\t * Returns `true` if the given render object has an initialized geometry.\n\t *\n\t * @param {RenderObject} renderObject - The render object.\n\t * @return {boolean} Whether if the given render object has an initialized geometry or not.\n\t */\n\thas( renderObject ) {\n\n\t\tconst geometry = renderObject.geometry;\n\n\t\treturn super.has( geometry ) && this.get( geometry ).initialized === true;\n\n\t}\n\n\t/**\n\t * Prepares the geometry of the given render object for rendering.\n\t *\n\t * @param {RenderObject} renderObject - The render object.\n\t */\n\tupdateForRender( renderObject ) {\n\n\t\tif ( this.has( renderObject ) === false ) this.initGeometry( renderObject );\n\n\t\tthis.updateAttributes( renderObject );\n\n\t}\n\n\t/**\n\t * Initializes the geometry of the given render object.\n\t *\n\t * @param {RenderObject} renderObject - The render object.\n\t */\n\tinitGeometry( renderObject ) {\n\n\t\tconst geometry = renderObject.geometry;\n\t\tconst geometryData = this.get( geometry );\n\n\t\tgeometryData.initialized = true;\n\n\t\tthis.info.memory.geometries ++;\n\n\t\tconst onDispose = () => {\n\n\t\t\tthis.info.memory.geometries --;\n\n\t\t\tconst index = geometry.index;\n\t\t\tconst geometryAttributes = renderObject.getAttributes();\n\n\t\t\tif ( index !== null ) {\n\n\t\t\t\tthis.attributes.delete( index );\n\n\t\t\t}\n\n\t\t\tfor ( const geometryAttribute of geometryAttributes ) {\n\n\t\t\t\tthis.attributes.delete( geometryAttribute );\n\n\t\t\t}\n\n\t\t\tconst wireframeAttribute = this.wireframes.get( geometry );\n\n\t\t\tif ( wireframeAttribute !== undefined ) {\n\n\t\t\t\tthis.attributes.delete( wireframeAttribute );\n\n\t\t\t}\n\n\t\t\tgeometry.removeEventListener( 'dispose', onDispose );\n\n\t\t\tthis._geometryDisposeListeners.delete( geometry );\n\n\t\t};\n\n\t\tgeometry.addEventListener( 'dispose', onDispose );\n\n\t\t// see #31798 why tracking separate remove listeners is required right now\n\t\t// TODO: Re-evaluate how onDispose() is managed in this component\n\t\tthis._geometryDisposeListeners.set( geometry, onDispose );\n\n\t}\n\n\t/**\n\t * Updates the geometry attributes of the given render object.\n\t *\n\t * @param {RenderObject} renderObject - The render object.\n\t */\n\tupdateAttributes( renderObject ) {\n\n\t\t// attributes\n\n\t\tconst attributes = renderObject.getAttributes();\n\n\t\tfor ( const attribute of attributes ) {\n\n\t\t\tif ( attribute.isStorageBufferAttribute || attribute.isStorageInstancedBufferAttribute ) {\n\n\t\t\t\tthis.updateAttribute( attribute, AttributeType.STORAGE );\n\n\t\t\t} else {\n\n\t\t\t\tthis.updateAttribute( attribute, AttributeType.VERTEX );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// indexes\n\n\t\tconst index = this.getIndex( renderObject );\n\n\t\tif ( index !== null ) {\n\n\t\t\tthis.updateAttribute( index, AttributeType.INDEX );\n\n\t\t}\n\n\t\t// indirect\n\n\t\tconst indirect = renderObject.geometry.indirect;\n\n\t\tif ( indirect !== null ) {\n\n\t\t\tthis.updateAttribute( indirect, AttributeType.INDIRECT );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the given attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The attribute to update.\n\t * @param {number} type - The attribute type.\n\t */\n\tupdateAttribute( attribute, type ) {\n\n\t\tconst callId = this.info.render.calls;\n\n\t\tif ( ! attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tif ( this.attributeCall.get( attribute ) !== callId ) {\n\n\t\t\t\tthis.attributes.update( attribute, type );\n\n\t\t\t\tthis.attributeCall.set( attribute, callId );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( this.attributeCall.get( attribute ) === undefined ) {\n\n\t\t\t\tthis.attributes.update( attribute, type );\n\n\t\t\t\tthis.attributeCall.set( attribute, callId );\n\n\t\t\t} else if ( this.attributeCall.get( attribute.data ) !== callId ) {\n\n\t\t\t\tthis.attributes.update( attribute, type );\n\n\t\t\t\tthis.attributeCall.set( attribute.data, callId );\n\n\t\t\t\tthis.attributeCall.set( attribute, callId );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the indirect buffer attribute of the given render object.\n\t *\n\t * @param {RenderObject} renderObject - The render object.\n\t * @return {?BufferAttribute} The indirect attribute. `null` if no indirect drawing is used.\n\t */\n\tgetIndirect( renderObject ) {\n\n\t\treturn renderObject.geometry.indirect;\n\n\t}\n\n\t/**\n\t * Returns the byte offset into the indirect attribute buffer of the given render object.\n\t *\n\t * @param {RenderObject} renderObject - The render object.\n\t * @return {number} The byte offset into the indirect attribute buffer.\n\t */\n\tgetIndirectOffset( renderObject ) {\n\n\t\treturn renderObject.geometry.indirectOffset;\n\n\t}\n\n\t/**\n\t * Returns the index of the given render object's geometry. This is implemented\n\t * in a method to return a wireframe index if necessary.\n\t *\n\t * @param {RenderObject} renderObject - The render object.\n\t * @return {?BufferAttribute} The index. Returns `null` for non-indexed geometries.\n\t */\n\tgetIndex( renderObject ) {\n\n\t\tconst { geometry, material } = renderObject;\n\n\t\tlet index = geometry.index;\n\n\t\tif ( material.wireframe === true ) {\n\n\t\t\tconst wireframes = this.wireframes;\n\n\t\t\tlet wireframeAttribute = wireframes.get( geometry );\n\n\t\t\tif ( wireframeAttribute === undefined ) {\n\n\t\t\t\twireframeAttribute = getWireframeIndex( geometry );\n\n\t\t\t\twireframes.set( geometry, wireframeAttribute );\n\n\t\t\t} else if ( wireframeAttribute.version !== getWireframeVersion( geometry ) ) {\n\n\t\t\t\tthis.attributes.delete( wireframeAttribute );\n\n\t\t\t\twireframeAttribute = getWireframeIndex( geometry );\n\n\t\t\t\twireframes.set( geometry, wireframeAttribute );\n\n\t\t\t}\n\n\t\t\tindex = wireframeAttribute;\n\n\t\t}\n\n\t\treturn index;\n\n\t}\n\n\tdispose() {\n\n\t\tfor ( const [ geometry, onDispose ] of this._geometryDisposeListeners.entries() ) {\n\n\t\t\tgeometry.removeEventListener( 'dispose', onDispose );\n\n\t\t}\n\n\t\tthis._geometryDisposeListeners.clear();\n\n\t}\n\n}\n\n/**\n * This renderer module provides a series of statistical information\n * about the GPU memory and the rendering process. Useful for debugging\n * and monitoring.\n */\nclass Info {\n\n\t/**\n\t * Constructs a new info component.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * Whether frame related metrics should automatically\n\t\t * be resetted or not. This property should be set to `false`\n\t\t * by apps which manage their own animation loop. They must\n\t\t * then call `renderer.info.reset()` once per frame manually.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoReset = true;\n\n\t\t/**\n\t\t * The current frame ID. This ID is managed\n\t\t * by `NodeFrame`.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.frame = 0;\n\n\t\t/**\n\t\t * The number of render calls since the\n\t\t * app has been started.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.calls = 0;\n\n\t\t/**\n\t\t * Render related metrics.\n\t\t *\n\t\t * @type {Object}\n\t\t * @readonly\n\t\t * @property {number} calls - The number of render calls since the app has been started.\n\t\t * @property {number} frameCalls - The number of render calls of the current frame.\n\t\t * @property {number} drawCalls - The number of draw calls of the current frame.\n\t\t * @property {number} triangles - The number of rendered triangle primitives of the current frame.\n\t\t * @property {number} points - The number of rendered point primitives of the current frame.\n\t\t * @property {number} lines - The number of rendered line primitives of the current frame.\n\t\t * @property {number} timestamp - The timestamp of the frame.\n\t\t */\n\t\tthis.render = {\n\t\t\tcalls: 0,\n\t\t\tframeCalls: 0,\n\t\t\tdrawCalls: 0,\n\t\t\ttriangles: 0,\n\t\t\tpoints: 0,\n\t\t\tlines: 0,\n\t\t\ttimestamp: 0,\n\t\t};\n\n\t\t/**\n\t\t * Compute related metrics.\n\t\t *\n\t\t * @type {Object}\n\t\t * @readonly\n\t\t * @property {number} calls - The number of compute calls since the app has been started.\n\t\t * @property {number} frameCalls - The number of compute calls of the current frame.\n\t\t * @property {number} timestamp - The timestamp of the frame when using `renderer.computeAsync()`.\n\t\t */\n\t\tthis.compute = {\n\t\t\tcalls: 0,\n\t\t\tframeCalls: 0,\n\t\t\ttimestamp: 0\n\t\t};\n\n\t\t/**\n\t\t * Memory related metrics.\n\t\t *\n\t\t * @type {Object}\n\t\t * @readonly\n\t\t * @property {number} geometries - The number of active geometries.\n\t\t * @property {number} frameCalls - The number of active textures.\n\t\t */\n\t\tthis.memory = {\n\t\t\tgeometries: 0,\n\t\t\ttextures: 0\n\t\t};\n\n\t}\n\n\t/**\n\t * This method should be executed per draw call and updates the corresponding metrics.\n\t *\n\t * @param {Object3D} object - The 3D object that is going to be rendered.\n\t * @param {number} count - The vertex or index count.\n\t * @param {number} instanceCount - The instance count.\n\t */\n\tupdate( object, count, instanceCount ) {\n\n\t\tthis.render.drawCalls ++;\n\n\t\tif ( object.isMesh || object.isSprite ) {\n\n\t\t\tthis.render.triangles += instanceCount * ( count / 3 );\n\n\t\t} else if ( object.isPoints ) {\n\n\t\t\tthis.render.points += instanceCount * count;\n\n\t\t} else if ( object.isLineSegments ) {\n\n\t\t\tthis.render.lines += instanceCount * ( count / 2 );\n\n\t\t} else if ( object.isLine ) {\n\n\t\t\tthis.render.lines += instanceCount * ( count - 1 );\n\n\t\t} else {\n\n\t\t\terror( 'WebGPUInfo: Unknown object type.' );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Resets frame related metrics.\n\t */\n\treset() {\n\n\t\tthis.render.drawCalls = 0;\n\t\tthis.render.frameCalls = 0;\n\t\tthis.compute.frameCalls = 0;\n\n\t\tthis.render.triangles = 0;\n\t\tthis.render.points = 0;\n\t\tthis.render.lines = 0;\n\n\n\t}\n\n\t/**\n\t * Performs a complete reset of the object.\n\t */\n\tdispose() {\n\n\t\tthis.reset();\n\n\t\tthis.calls = 0;\n\n\t\tthis.render.calls = 0;\n\t\tthis.compute.calls = 0;\n\n\t\tthis.render.timestamp = 0;\n\t\tthis.compute.timestamp = 0;\n\t\tthis.memory.geometries = 0;\n\t\tthis.memory.textures = 0;\n\n\t}\n\n}\n\n/**\n * Abstract class for representing pipelines.\n *\n * @private\n * @abstract\n */\nclass Pipeline {\n\n\t/**\n\t * Constructs a new pipeline.\n\t *\n\t * @param {string} cacheKey - The pipeline's cache key.\n\t */\n\tconstructor( cacheKey ) {\n\n\t\t/**\n\t\t * The pipeline's cache key.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.cacheKey = cacheKey;\n\n\t\t/**\n\t\t * How often the pipeline is currently in use.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.usedTimes = 0;\n\n\t}\n\n}\n\n/**\n * Class for representing render pipelines.\n *\n * @private\n * @augments Pipeline\n */\nclass RenderPipeline extends Pipeline {\n\n\t/**\n\t * Constructs a new render pipeline.\n\t *\n\t * @param {string} cacheKey - The pipeline's cache key.\n\t * @param {ProgrammableStage} vertexProgram - The pipeline's vertex shader.\n\t * @param {ProgrammableStage} fragmentProgram - The pipeline's fragment shader.\n\t */\n\tconstructor( cacheKey, vertexProgram, fragmentProgram ) {\n\n\t\tsuper( cacheKey );\n\n\t\t/**\n\t\t * The pipeline's vertex shader.\n\t\t *\n\t\t * @type {ProgrammableStage}\n\t\t */\n\t\tthis.vertexProgram = vertexProgram;\n\n\t\t/**\n\t\t * The pipeline's fragment shader.\n\t\t *\n\t\t * @type {ProgrammableStage}\n\t\t */\n\t\tthis.fragmentProgram = fragmentProgram;\n\n\t}\n\n}\n\n/**\n * Class for representing compute pipelines.\n *\n * @private\n * @augments Pipeline\n */\nclass ComputePipeline extends Pipeline {\n\n\t/**\n\t * Constructs a new render pipeline.\n\t *\n\t * @param {string} cacheKey - The pipeline's cache key.\n\t * @param {ProgrammableStage} computeProgram - The pipeline's compute shader.\n\t */\n\tconstructor( cacheKey, computeProgram ) {\n\n\t\tsuper( cacheKey );\n\n\t\t/**\n\t\t * The pipeline's compute shader.\n\t\t *\n\t\t * @type {ProgrammableStage}\n\t\t */\n\t\tthis.computeProgram = computeProgram;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isComputePipeline = true;\n\n\t}\n\n}\n\nlet _id$9 = 0;\n\n/**\n * Class for representing programmable stages which are vertex,\n * fragment or compute shaders. Unlike fixed-function states (like blending),\n * they represent the programmable part of a pipeline.\n *\n * @private\n */\nclass ProgrammableStage {\n\n\t/**\n\t * Constructs a new programmable stage.\n\t *\n\t * @param {string} code - The shader code.\n\t * @param {('vertex'|'fragment'|'compute')} stage - The type of stage.\n\t * @param {string} name - The name of the shader.\n\t * @param {?Array<Object>} [transforms=null] - The transforms (only relevant for compute stages with WebGL 2 which uses Transform Feedback).\n\t * @param {?Array<Object>} [attributes=null] - The attributes (only relevant for compute stages with WebGL 2 which uses Transform Feedback).\n\t */\n\tconstructor( code, stage, name, transforms = null, attributes = null ) {\n\n\t\t/**\n\t\t * The id of the programmable stage.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.id = _id$9 ++;\n\n\t\t/**\n\t\t * The shader code.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.code = code;\n\n\t\t/**\n\t\t * The type of stage.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.stage = stage;\n\n\t\t/**\n\t\t * The name of the stage.\n\t\t * This is used for debugging purposes.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * The transforms (only relevant for compute stages with WebGL 2 which uses Transform Feedback).\n\t\t *\n\t\t * @type {?Array<Object>}\n\t\t */\n\t\tthis.transforms = transforms;\n\n\t\t/**\n\t\t * The attributes (only relevant for compute stages with WebGL 2 which uses Transform Feedback).\n\t\t *\n\t\t * @type {?Array<Object>}\n\t\t */\n\t\tthis.attributes = attributes;\n\n\t\t/**\n\t\t * How often the programmable stage is currently in use.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.usedTimes = 0;\n\n\t}\n\n}\n\n/**\n * This renderer module manages the pipelines of the renderer.\n *\n * @private\n * @augments DataMap\n */\nclass Pipelines extends DataMap {\n\n\t/**\n\t * Constructs a new pipeline management component.\n\t *\n\t * @param {Backend} backend - The renderer's backend.\n\t * @param {Nodes} nodes - Renderer component for managing nodes related logic.\n\t */\n\tconstructor( backend, nodes ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The renderer's backend.\n\t\t *\n\t\t * @type {Backend}\n\t\t */\n\t\tthis.backend = backend;\n\n\t\t/**\n\t\t * Renderer component for managing nodes related logic.\n\t\t *\n\t\t * @type {Nodes}\n\t\t */\n\t\tthis.nodes = nodes;\n\n\t\t/**\n\t\t * A references to the bindings management component.\n\t\t * This reference will be set inside the `Bindings`\n\t\t * constructor.\n\t\t *\n\t\t * @type {?Bindings}\n\t\t * @default null\n\t\t */\n\t\tthis.bindings = null;\n\n\t\t/**\n\t\t * Internal cache for maintaining pipelines.\n\t\t * The key of the map is a cache key, the value the pipeline.\n\t\t *\n\t\t * @type {Map<string,Pipeline>}\n\t\t */\n\t\tthis.caches = new Map();\n\n\t\t/**\n\t\t * This dictionary maintains for each shader stage type (vertex,\n\t\t * fragment and compute) the programmable stage objects which\n\t\t * represent the actual shader code.\n\t\t *\n\t\t * @type {Object<string,Map<string, ProgrammableStage>>}\n\t\t */\n\t\tthis.programs = {\n\t\t\tvertex: new Map(),\n\t\t\tfragment: new Map(),\n\t\t\tcompute: new Map()\n\t\t};\n\n\t}\n\n\t/**\n\t * Returns a compute pipeline for the given compute node.\n\t *\n\t * @param {Node} computeNode - The compute node.\n\t * @param {Array<BindGroup>} bindings - The bindings.\n\t * @return {ComputePipeline} The compute pipeline.\n\t */\n\tgetForCompute( computeNode, bindings ) {\n\n\t\tconst { backend } = this;\n\n\t\tconst data = this.get( computeNode );\n\n\t\tif ( this._needsComputeUpdate( computeNode ) ) {\n\n\t\t\tconst previousPipeline = data.pipeline;\n\n\t\t\tif ( previousPipeline ) {\n\n\t\t\t\tpreviousPipeline.usedTimes --;\n\t\t\t\tpreviousPipeline.computeProgram.usedTimes --;\n\n\t\t\t}\n\n\t\t\t// get shader\n\n\t\t\tconst nodeBuilderState = this.nodes.getForCompute( computeNode );\n\n\t\t\t// programmable stage\n\n\t\t\tlet stageCompute = this.programs.compute.get( nodeBuilderState.computeShader );\n\n\t\t\tif ( stageCompute === undefined ) {\n\n\t\t\t\tif ( previousPipeline && previousPipeline.computeProgram.usedTimes === 0 ) this._releaseProgram( previousPipeline.computeProgram );\n\n\t\t\t\tstageCompute = new ProgrammableStage( nodeBuilderState.computeShader, 'compute', computeNode.name, nodeBuilderState.transforms, nodeBuilderState.nodeAttributes );\n\t\t\t\tthis.programs.compute.set( nodeBuilderState.computeShader, stageCompute );\n\n\t\t\t\tbackend.createProgram( stageCompute );\n\n\t\t\t}\n\n\t\t\t// determine compute pipeline\n\n\t\t\tconst cacheKey = this._getComputeCacheKey( computeNode, stageCompute );\n\n\t\t\tlet pipeline = this.caches.get( cacheKey );\n\n\t\t\tif ( pipeline === undefined ) {\n\n\t\t\t\tif ( previousPipeline && previousPipeline.usedTimes === 0 ) this._releasePipeline( previousPipeline );\n\n\t\t\t\tpipeline = this._getComputePipeline( computeNode, stageCompute, cacheKey, bindings );\n\n\t\t\t}\n\n\t\t\t// keep track of all used times\n\n\t\t\tpipeline.usedTimes ++;\n\t\t\tstageCompute.usedTimes ++;\n\n\t\t\t//\n\n\t\t\tdata.version = computeNode.version;\n\t\t\tdata.pipeline = pipeline;\n\n\t\t}\n\n\t\treturn data.pipeline;\n\n\t}\n\n\t/**\n\t * Returns a render pipeline for the given render object.\n\t *\n\t * @param {RenderObject} renderObject - The render object.\n\t * @param {?Array<Promise>} [promises=null] - An array of compilation promises which is only relevant in context of `Renderer.compileAsync()`.\n\t * @return {RenderPipeline} The render pipeline.\n\t */\n\tgetForRender( renderObject, promises = null ) {\n\n\t\tconst { backend } = this;\n\n\t\tconst data = this.get( renderObject );\n\n\t\tif ( this._needsRenderUpdate( renderObject ) ) {\n\n\t\t\tconst previousPipeline = data.pipeline;\n\n\t\t\tif ( previousPipeline ) {\n\n\t\t\t\tpreviousPipeline.usedTimes --;\n\t\t\t\tpreviousPipeline.vertexProgram.usedTimes --;\n\t\t\t\tpreviousPipeline.fragmentProgram.usedTimes --;\n\n\t\t\t}\n\n\t\t\t// get shader\n\n\t\t\tconst nodeBuilderState = renderObject.getNodeBuilderState();\n\n\t\t\tconst name = renderObject.material ? renderObject.material.name : '';\n\n\t\t\t// programmable stages\n\n\t\t\tlet stageVertex = this.programs.vertex.get( nodeBuilderState.vertexShader );\n\n\t\t\tif ( stageVertex === undefined ) {\n\n\t\t\t\tif ( previousPipeline && previousPipeline.vertexProgram.usedTimes === 0 ) this._releaseProgram( previousPipeline.vertexProgram );\n\n\t\t\t\tstageVertex = new ProgrammableStage( nodeBuilderState.vertexShader, 'vertex', name );\n\t\t\t\tthis.programs.vertex.set( nodeBuilderState.vertexShader, stageVertex );\n\n\t\t\t\tbackend.createProgram( stageVertex );\n\n\t\t\t}\n\n\t\t\tlet stageFragment = this.programs.fragment.get( nodeBuilderState.fragmentShader );\n\n\t\t\tif ( stageFragment === undefined ) {\n\n\t\t\t\tif ( previousPipeline && previousPipeline.fragmentProgram.usedTimes === 0 ) this._releaseProgram( previousPipeline.fragmentProgram );\n\n\t\t\t\tstageFragment = new ProgrammableStage( nodeBuilderState.fragmentShader, 'fragment', name );\n\t\t\t\tthis.programs.fragment.set( nodeBuilderState.fragmentShader, stageFragment );\n\n\t\t\t\tbackend.createProgram( stageFragment );\n\n\t\t\t}\n\n\t\t\t// determine render pipeline\n\n\t\t\tconst cacheKey = this._getRenderCacheKey( renderObject, stageVertex, stageFragment );\n\n\t\t\tlet pipeline = this.caches.get( cacheKey );\n\n\t\t\tif ( pipeline === undefined ) {\n\n\t\t\t\tif ( previousPipeline && previousPipeline.usedTimes === 0 ) this._releasePipeline( previousPipeline );\n\n\t\t\t\tpipeline = this._getRenderPipeline( renderObject, stageVertex, stageFragment, cacheKey, promises );\n\n\t\t\t} else {\n\n\t\t\t\trenderObject.pipeline = pipeline;\n\n\t\t\t}\n\n\t\t\t// keep track of all used times\n\n\t\t\tpipeline.usedTimes ++;\n\t\t\tstageVertex.usedTimes ++;\n\t\t\tstageFragment.usedTimes ++;\n\n\t\t\t//\n\n\t\t\tdata.pipeline = pipeline;\n\n\t\t}\n\n\t\treturn data.pipeline;\n\n\t}\n\n\t/**\n\t * Deletes the pipeline for the given render object.\n\t *\n\t * @param {RenderObject} object - The render object.\n\t * @return {?Object} The deleted dictionary.\n\t */\n\tdelete( object ) {\n\n\t\tconst pipeline = this.get( object ).pipeline;\n\n\t\tif ( pipeline ) {\n\n\t\t\t// pipeline\n\n\t\t\tpipeline.usedTimes --;\n\n\t\t\tif ( pipeline.usedTimes === 0 ) this._releasePipeline( pipeline );\n\n\t\t\t// programs\n\n\t\t\tif ( pipeline.isComputePipeline ) {\n\n\t\t\t\tpipeline.computeProgram.usedTimes --;\n\n\t\t\t\tif ( pipeline.computeProgram.usedTimes === 0 ) this._releaseProgram( pipeline.computeProgram );\n\n\t\t\t} else {\n\n\t\t\t\tpipeline.fragmentProgram.usedTimes --;\n\t\t\t\tpipeline.vertexProgram.usedTimes --;\n\n\t\t\t\tif ( pipeline.vertexProgram.usedTimes === 0 ) this._releaseProgram( pipeline.vertexProgram );\n\t\t\t\tif ( pipeline.fragmentProgram.usedTimes === 0 ) this._releaseProgram( pipeline.fragmentProgram );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn super.delete( object );\n\n\t}\n\n\t/**\n\t * Frees internal resources.\n\t */\n\tdispose() {\n\n\t\tsuper.dispose();\n\n\t\tthis.caches = new Map();\n\t\tthis.programs = {\n\t\t\tvertex: new Map(),\n\t\t\tfragment: new Map(),\n\t\t\tcompute: new Map()\n\t\t};\n\n\t}\n\n\t/**\n\t * Updates the pipeline for the given render object.\n\t *\n\t * @param {RenderObject} renderObject - The render object.\n\t */\n\tupdateForRender( renderObject ) {\n\n\t\tthis.getForRender( renderObject );\n\n\t}\n\n\t/**\n\t * Returns a compute pipeline for the given parameters.\n\t *\n\t * @private\n\t * @param {Node} computeNode - The compute node.\n\t * @param {ProgrammableStage} stageCompute - The programmable stage representing the compute shader.\n\t * @param {string} cacheKey - The cache key.\n\t * @param {Array<BindGroup>} bindings - The bindings.\n\t * @return {ComputePipeline} The compute pipeline.\n\t */\n\t_getComputePipeline( computeNode, stageCompute, cacheKey, bindings ) {\n\n\t\t// check for existing pipeline\n\n\t\tcacheKey = cacheKey || this._getComputeCacheKey( computeNode, stageCompute );\n\n\t\tlet pipeline = this.caches.get( cacheKey );\n\n\t\tif ( pipeline === undefined ) {\n\n\t\t\tpipeline = new ComputePipeline( cacheKey, stageCompute );\n\n\t\t\tthis.caches.set( cacheKey, pipeline );\n\n\t\t\tthis.backend.createComputePipeline( pipeline, bindings );\n\n\t\t}\n\n\t\treturn pipeline;\n\n\t}\n\n\t/**\n\t * Returns a render pipeline for the given parameters.\n\t *\n\t * @private\n\t * @param {RenderObject} renderObject - The render object.\n\t * @param {ProgrammableStage} stageVertex - The programmable stage representing the vertex shader.\n\t * @param {ProgrammableStage} stageFragment - The programmable stage representing the fragment shader.\n\t * @param {string} cacheKey - The cache key.\n\t * @param {?Array<Promise>} promises - An array of compilation promises which is only relevant in context of `Renderer.compileAsync()`.\n\t * @return {ComputePipeline} The compute pipeline.\n\t */\n\t_getRenderPipeline( renderObject, stageVertex, stageFragment, cacheKey, promises ) {\n\n\t\t// check for existing pipeline\n\n\t\tcacheKey = cacheKey || this._getRenderCacheKey( renderObject, stageVertex, stageFragment );\n\n\t\tlet pipeline = this.caches.get( cacheKey );\n\n\t\tif ( pipeline === undefined ) {\n\n\t\t\tpipeline = new RenderPipeline( cacheKey, stageVertex, stageFragment );\n\n\t\t\tthis.caches.set( cacheKey, pipeline );\n\n\t\t\trenderObject.pipeline = pipeline;\n\n\t\t\t// The `promises` array is `null` by default and only set to an empty array when\n\t\t\t// `Renderer.compileAsync()` is used. The next call actually fills the array with\n\t\t\t// pending promises that resolve when the render pipelines are ready for rendering.\n\n\t\t\tthis.backend.createRenderPipeline( renderObject, promises );\n\n\t\t}\n\n\t\treturn pipeline;\n\n\t}\n\n\t/**\n\t * Computes a cache key representing a compute pipeline.\n\t *\n\t * @private\n\t * @param {Node} computeNode - The compute node.\n\t * @param {ProgrammableStage} stageCompute - The programmable stage representing the compute shader.\n\t * @return {string} The cache key.\n\t */\n\t_getComputeCacheKey( computeNode, stageCompute ) {\n\n\t\treturn computeNode.id + ',' + stageCompute.id;\n\n\t}\n\n\t/**\n\t * Computes a cache key representing a render pipeline.\n\t *\n\t * @private\n\t * @param {RenderObject} renderObject - The render object.\n\t * @param {ProgrammableStage} stageVertex - The programmable stage representing the vertex shader.\n\t * @param {ProgrammableStage} stageFragment - The programmable stage representing the fragment shader.\n\t * @return {string} The cache key.\n\t */\n\t_getRenderCacheKey( renderObject, stageVertex, stageFragment ) {\n\n\t\treturn stageVertex.id + ',' + stageFragment.id + ',' + this.backend.getRenderCacheKey( renderObject );\n\n\t}\n\n\t/**\n\t * Releases the given pipeline.\n\t *\n\t * @private\n\t * @param {Pipeline} pipeline - The pipeline to release.\n\t */\n\t_releasePipeline( pipeline ) {\n\n\t\tthis.caches.delete( pipeline.cacheKey );\n\n\t}\n\n\t/**\n\t * Releases the shader program.\n\t *\n\t * @private\n\t * @param {Object} program - The shader program to release.\n\t */\n\t_releaseProgram( program ) {\n\n\t\tconst code = program.code;\n\t\tconst stage = program.stage;\n\n\t\tthis.programs[ stage ].delete( code );\n\n\t}\n\n\t/**\n\t * Returns `true` if the compute pipeline for the given compute node requires an update.\n\t *\n\t * @private\n\t * @param {Node} computeNode - The compute node.\n\t * @return {boolean} Whether the compute pipeline for the given compute node requires an update or not.\n\t */\n\t_needsComputeUpdate( computeNode ) {\n\n\t\tconst data = this.get( computeNode );\n\n\t\treturn data.pipeline === undefined || data.version !== computeNode.version;\n\n\t}\n\n\t/**\n\t * Returns `true` if the render pipeline for the given render object requires an update.\n\t *\n\t * @private\n\t * @param {RenderObject} renderObject - The render object.\n\t * @return {boolean} Whether the render object for the given render object requires an update or not.\n\t */\n\t_needsRenderUpdate( renderObject ) {\n\n\t\tconst data = this.get( renderObject );\n\n\t\treturn data.pipeline === undefined || this.backend.needsRenderUpdate( renderObject );\n\n\t}\n\n}\n\n/**\n * This renderer module manages the bindings of the renderer.\n *\n * @private\n * @augments DataMap\n */\nclass Bindings extends DataMap {\n\n\t/**\n\t * Constructs a new bindings management component.\n\t *\n\t * @param {Backend} backend - The renderer's backend.\n\t * @param {Nodes} nodes - Renderer component for managing nodes related logic.\n\t * @param {Textures} textures - Renderer component for managing textures.\n\t * @param {Attributes} attributes - Renderer component for managing attributes.\n\t * @param {Pipelines} pipelines - Renderer component for managing pipelines.\n\t * @param {Info} info - Renderer component for managing metrics and monitoring data.\n\t */\n\tconstructor( backend, nodes, textures, attributes, pipelines, info ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The renderer's backend.\n\t\t *\n\t\t * @type {Backend}\n\t\t */\n\t\tthis.backend = backend;\n\n\t\t/**\n\t\t * Renderer component for managing textures.\n\t\t *\n\t\t * @type {Textures}\n\t\t */\n\t\tthis.textures = textures;\n\n\t\t/**\n\t\t * Renderer component for managing pipelines.\n\t\t *\n\t\t * @type {Pipelines}\n\t\t */\n\t\tthis.pipelines = pipelines;\n\n\t\t/**\n\t\t * Renderer component for managing attributes.\n\t\t *\n\t\t * @type {Attributes}\n\t\t */\n\t\tthis.attributes = attributes;\n\n\t\t/**\n\t\t * Renderer component for managing nodes related logic.\n\t\t *\n\t\t * @type {Nodes}\n\t\t */\n\t\tthis.nodes = nodes;\n\n\t\t/**\n\t\t * Renderer component for managing metrics and monitoring data.\n\t\t *\n\t\t * @type {Info}\n\t\t */\n\t\tthis.info = info;\n\n\t\tthis.pipelines.bindings = this; // assign bindings to pipelines\n\n\t}\n\n\t/**\n\t * Returns the bind groups for the given render object.\n\t *\n\t * @param {RenderObject} renderObject - The render object.\n\t * @return {Array<BindGroup>} The bind groups.\n\t */\n\tgetForRender( renderObject ) {\n\n\t\tconst bindings = renderObject.getBindings();\n\n\t\tfor ( const bindGroup of bindings ) {\n\n\t\t\tconst groupData = this.get( bindGroup );\n\n\t\t\tif ( groupData.bindGroup === undefined ) {\n\n\t\t\t\t// each object defines an array of bindings (ubos, textures, samplers etc.)\n\n\t\t\t\tthis._init( bindGroup );\n\n\t\t\t\tthis.backend.createBindings( bindGroup, bindings, 0 );\n\n\t\t\t\tgroupData.bindGroup = bindGroup;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn bindings;\n\n\t}\n\n\t/**\n\t * Returns the bind groups for the given compute node.\n\t *\n\t * @param {Node} computeNode - The compute node.\n\t * @return {Array<BindGroup>} The bind groups.\n\t */\n\tgetForCompute( computeNode ) {\n\n\t\tconst bindings = this.nodes.getForCompute( computeNode ).bindings;\n\n\t\tfor ( const bindGroup of bindings ) {\n\n\t\t\tconst groupData = this.get( bindGroup );\n\n\t\t\tif ( groupData.bindGroup === undefined ) {\n\n\t\t\t\tthis._init( bindGroup );\n\n\t\t\t\tthis.backend.createBindings( bindGroup, bindings, 0 );\n\n\t\t\t\tgroupData.bindGroup = bindGroup;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn bindings;\n\n\t}\n\n\t/**\n\t * Updates the bindings for the given compute node.\n\t *\n\t * @param {Node} computeNode - The compute node.\n\t */\n\tupdateForCompute( computeNode ) {\n\n\t\tthis._updateBindings( this.getForCompute( computeNode ) );\n\n\t}\n\n\t/**\n\t * Updates the bindings for the given render object.\n\t *\n\t * @param {RenderObject} renderObject - The render object.\n\t */\n\tupdateForRender( renderObject ) {\n\n\t\tthis._updateBindings( this.getForRender( renderObject ) );\n\n\t}\n\n\t/**\n\t * Deletes the bindings for the given compute node.\n\t *\n\t * @param {Node} computeNode - The compute node.\n\t */\n\tdeleteForCompute( computeNode ) {\n\n\t\tconst bindings = this.nodes.getForCompute( computeNode ).bindings;\n\n\t\tfor ( const bindGroup of bindings ) {\n\n\t\t\tthis.backend.deleteBindGroupData( bindGroup );\n\t\t\tthis.delete( bindGroup );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Deletes the bindings for the given renderObject node.\n\t *\n\t * @param {RenderObject} renderObject - The renderObject.\n\t */\n\tdeleteForRender( renderObject ) {\n\n\t\tconst bindings = renderObject.getBindings();\n\n\t\tfor ( const bindGroup of bindings ) {\n\n\t\t\tthis.backend.deleteBindGroupData( bindGroup );\n\t\t\tthis.delete( bindGroup );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the given array of bindings.\n\t *\n\t * @param {Array<BindGroup>} bindings - The bind groups.\n\t */\n\t_updateBindings( bindings ) {\n\n\t\tfor ( const bindGroup of bindings ) {\n\n\t\t\tthis._update( bindGroup, bindings );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Initializes the given bind group.\n\t *\n\t * @param {BindGroup} bindGroup - The bind group to initialize.\n\t */\n\t_init( bindGroup ) {\n\n\t\tfor ( const binding of bindGroup.bindings ) {\n\n\t\t\tif ( binding.isSampledTexture ) {\n\n\t\t\t\tthis.textures.updateTexture( binding.texture );\n\n\t\t\t} else if ( binding.isSampler ) {\n\n\t\t\t\tthis.textures.updateSampler( binding.texture );\n\n\t\t\t} else if ( binding.isStorageBuffer ) {\n\n\t\t\t\tconst attribute = binding.attribute;\n\t\t\t\tconst attributeType = attribute.isIndirectStorageBufferAttribute ? AttributeType.INDIRECT : AttributeType.STORAGE;\n\n\t\t\t\tthis.attributes.update( attribute, attributeType );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the given bind group.\n\t *\n\t * @param {BindGroup} bindGroup - The bind group to update.\n\t * @param {Array<BindGroup>} bindings - The bind groups.\n\t */\n\t_update( bindGroup, bindings ) {\n\n\t\tconst { backend } = this;\n\n\t\tlet needsBindingsUpdate = false;\n\t\tlet cacheBindings = true;\n\t\tlet cacheIndex = 0;\n\t\tlet version = 0;\n\n\t\t// iterate over all bindings and check if buffer updates or a new binding group is required\n\n\t\tfor ( const binding of bindGroup.bindings ) {\n\n\t\t\tconst updatedGroup = this.nodes.updateGroup( binding );\n\n\t\t\t// every uniforms group is a uniform buffer. So if no update is required,\n\t\t\t// we move one with the next binding. Otherwise the next if block will update the group.\n\n\t\t\tif ( updatedGroup === false ) continue;\n\n\t\t\t//\n\n\t\t\tif ( binding.isStorageBuffer ) {\n\n\t\t\t\tconst attribute = binding.attribute;\n\t\t\t\tconst attributeType = attribute.isIndirectStorageBufferAttribute ? AttributeType.INDIRECT : AttributeType.STORAGE;\n\n\t\t\t\tthis.attributes.update( attribute, attributeType );\n\n\n\t\t\t}\n\n\t\t\tif ( binding.isUniformBuffer ) {\n\n\t\t\t\tconst updated = binding.update();\n\n\t\t\t\tif ( updated ) {\n\n\t\t\t\t\tbackend.updateBinding( binding );\n\n\t\t\t\t}\n\n\t\t\t} else if ( binding.isSampledTexture ) {\n\n\t\t\t\tconst updated = binding.update();\n\n\t\t\t\t// get the texture data after the update, to sync the texture reference from node\n\n\t\t\t\tconst texture = binding.texture;\n\t\t\t\tconst texturesTextureData = this.textures.get( texture );\n\n\t\t\t\tif ( updated ) {\n\n\t\t\t\t\t// version: update the texture data or create a new one\n\n\t\t\t\t\tthis.textures.updateTexture( texture );\n\n\t\t\t\t\t// generation: update the bindings if a new texture has been created\n\n\t\t\t\t\tif ( binding.generation !== texturesTextureData.generation ) {\n\n\t\t\t\t\t\tbinding.generation = texturesTextureData.generation;\n\n\t\t\t\t\t\tneedsBindingsUpdate = true;\n\n\t\t\t\t\t\tcacheBindings = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst textureData = backend.get( texture );\n\n\t\t\t\tif ( textureData.externalTexture !== undefined || texturesTextureData.isDefaultTexture ) {\n\n\t\t\t\t\tcacheBindings = false;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcacheIndex = cacheIndex * 10 + texture.id;\n\t\t\t\t\tversion += texture.version;\n\n\t\t\t\t}\n\n\t\t\t\tif ( texture.isStorageTexture === true && texture.mipmapsAutoUpdate === true ) {\n\n\t\t\t\t\tconst textureData = this.get( texture );\n\n\t\t\t\t\tif ( binding.store === true ) {\n\n\t\t\t\t\t\ttextureData.needsMipmap = true;\n\n\t\t\t\t\t} else if ( this.textures.needsMipmaps( texture ) && textureData.needsMipmap === true ) {\n\n\t\t\t\t\t\tthis.backend.generateMipmaps( texture );\n\n\t\t\t\t\t\ttextureData.needsMipmap = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( binding.isSampler ) {\n\n\t\t\t\tconst updated = binding.update();\n\n\t\t\t\tif ( updated ) {\n\n\t\t\t\t\tconst samplerKey = this.textures.updateSampler( binding.texture );\n\n\t\t\t\t\tif ( binding.samplerKey !== samplerKey ) {\n\n\t\t\t\t\t\tbinding.samplerKey = samplerKey;\n\n\t\t\t\t\t\tneedsBindingsUpdate = true;\n\n\t\t\t\t\t\tcacheBindings = false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( needsBindingsUpdate === true ) {\n\n\t\t\tthis.backend.updateBindings( bindGroup, bindings, cacheBindings ? cacheIndex : 0, version );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Default sorting function for opaque render items.\n *\n * @private\n * @function\n * @param {Object} a - The first render item.\n * @param {Object} b - The second render item.\n * @return {number} A numeric value which defines the sort order.\n */\nfunction painterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn a.z - b.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\n/**\n * Default sorting function for transparent render items.\n *\n * @private\n * @function\n * @param {Object} a - The first render item.\n * @param {Object} b - The second render item.\n * @return {number} A numeric value which defines the sort order.\n */\nfunction reversePainterSortStable( a, b ) {\n\n\tif ( a.groupOrder !== b.groupOrder ) {\n\n\t\treturn a.groupOrder - b.groupOrder;\n\n\t} else if ( a.renderOrder !== b.renderOrder ) {\n\n\t\treturn a.renderOrder - b.renderOrder;\n\n\t} else if ( a.z !== b.z ) {\n\n\t\treturn b.z - a.z;\n\n\t} else {\n\n\t\treturn a.id - b.id;\n\n\t}\n\n}\n\n/**\n * Returns `true` if the given transparent material requires a double pass.\n *\n * @private\n * @function\n * @param {Material} material - The transparent material.\n * @return {boolean} Whether the given material requires a double pass or not.\n */\nfunction needsDoublePass( material ) {\n\n\tconst hasTransmission = material.transmission > 0 || ( material.transmissionNode && material.transmissionNode.isNode );\n\n\treturn hasTransmission && material.side === DoubleSide && material.forceSinglePass === false;\n\n}\n\n/**\n * When the renderer analyzes the scene at the beginning of a render call,\n * it stores 3D object for further processing in render lists. Depending on the\n * properties of a 3D objects (like their transformation or material state), the\n * objects are maintained in ordered lists for the actual rendering.\n *\n * Render lists are unique per scene and camera combination.\n *\n * @private\n * @augments Pipeline\n */\nclass RenderList {\n\n\t/**\n\t * Constructs a render list.\n\t *\n\t * @param {Lighting} lighting - The lighting management component.\n\t * @param {Scene} scene - The scene.\n\t * @param {Camera} camera - The camera the scene is rendered with.\n\t */\n\tconstructor( lighting, scene, camera ) {\n\n\t\t/**\n\t\t * 3D objects are transformed into render items and stored in this array.\n\t\t *\n\t\t * @type {Array<Object>}\n\t\t */\n\t\tthis.renderItems = [];\n\n\t\t/**\n\t\t * The current render items index.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.renderItemsIndex = 0;\n\n\t\t/**\n\t\t * A list with opaque render items.\n\t\t *\n\t\t * @type {Array<Object>}\n\t\t */\n\t\tthis.opaque = [];\n\n\t\t/**\n\t\t * A list with transparent render items which require\n\t\t * double pass rendering (e.g. transmissive objects).\n\t\t *\n\t\t * @type {Array<Object>}\n\t\t */\n\t\tthis.transparentDoublePass = [];\n\n\t\t/**\n\t\t * A list with transparent render items.\n\t\t *\n\t\t * @type {Array<Object>}\n\t\t */\n\t\tthis.transparent = [];\n\n\t\t/**\n\t\t * A list with transparent render bundle data.\n\t\t *\n\t\t * @type {Array<Object>}\n\t\t */\n\t\tthis.bundles = [];\n\n\t\t/**\n\t\t * The render list's lights node. This node is later\n\t\t * relevant for the actual analytical light nodes which\n\t\t * compute the scene's lighting in the shader.\n\t\t *\n\t\t * @type {LightsNode}\n\t\t */\n\t\tthis.lightsNode = lighting.getNode( scene, camera );\n\n\t\t/**\n\t\t * The scene's lights stored in an array. This array\n\t\t * is used to setup the lights node.\n\t\t *\n\t\t * @type {Array<Light>}\n\t\t */\n\t\tthis.lightsArray = [];\n\n\t\t/**\n\t\t * The scene.\n\t\t *\n\t\t * @type {Scene}\n\t\t */\n\t\tthis.scene = scene;\n\n\t\t/**\n\t\t * The camera the scene is rendered with.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = camera;\n\n\t\t/**\n\t\t * How many objects perform occlusion query tests.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.occlusionQueryCount = 0;\n\n\t}\n\n\t/**\n\t * This method is called right at the beginning of a render call\n\t * before the scene is analyzed. It prepares the internal data\n\t * structures for the upcoming render lists generation.\n\t *\n\t * @return {RenderList} A reference to this render list.\n\t */\n\tbegin() {\n\n\t\tthis.renderItemsIndex = 0;\n\n\t\tthis.opaque.length = 0;\n\t\tthis.transparentDoublePass.length = 0;\n\t\tthis.transparent.length = 0;\n\t\tthis.bundles.length = 0;\n\n\t\tthis.lightsArray.length = 0;\n\n\t\tthis.occlusionQueryCount = 0;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a render item for the giving render item state. The state is defined\n\t * by a series of object-related parameters.\n\t *\n\t * The method avoids object creation by holding render items and reusing them in\n\t * subsequent render calls (just with different property values).\n\t *\n\t * @param {Object3D} object - The 3D object.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} material - The 3D object's material.\n\t * @param {number} groupOrder - The current group order.\n\t * @param {number} z - Th 3D object's depth value (z value in clip space).\n\t * @param {?number} group - {?Object} group - Only relevant for objects using multiple materials. This represents a group entry from the respective `BufferGeometry`.\n\t * @param {ClippingContext} clippingContext - The current clipping context.\n\t * @return {Object} The render item.\n\t */\n\tgetNextRenderItem( object, geometry, material, groupOrder, z, group, clippingContext ) {\n\n\t\tlet renderItem = this.renderItems[ this.renderItemsIndex ];\n\n\t\tif ( renderItem === undefined ) {\n\n\t\t\trenderItem = {\n\t\t\t\tid: object.id,\n\t\t\t\tobject: object,\n\t\t\t\tgeometry: geometry,\n\t\t\t\tmaterial: material,\n\t\t\t\tgroupOrder: groupOrder,\n\t\t\t\trenderOrder: object.renderOrder,\n\t\t\t\tz: z,\n\t\t\t\tgroup: group,\n\t\t\t\tclippingContext: clippingContext\n\t\t\t};\n\n\t\t\tthis.renderItems[ this.renderItemsIndex ] = renderItem;\n\n\t\t} else {\n\n\t\t\trenderItem.id = object.id;\n\t\t\trenderItem.object = object;\n\t\t\trenderItem.geometry = geometry;\n\t\t\trenderItem.material = material;\n\t\t\trenderItem.groupOrder = groupOrder;\n\t\t\trenderItem.renderOrder = object.renderOrder;\n\t\t\trenderItem.z = z;\n\t\t\trenderItem.group = group;\n\t\t\trenderItem.clippingContext = clippingContext;\n\n\t\t}\n\n\t\tthis.renderItemsIndex ++;\n\n\t\treturn renderItem;\n\n\t}\n\n\t/**\n\t * Pushes the given object as a render item to the internal render lists.\n\t * The selected lists depend on the object properties.\n\t *\n\t * @param {Object3D} object - The 3D object.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} material - The 3D object's material.\n\t * @param {number} groupOrder - The current group order.\n\t * @param {number} z - Th 3D object's depth value (z value in clip space).\n\t * @param {?number} group - {?Object} group - Only relevant for objects using multiple materials. This represents a group entry from the respective `BufferGeometry`.\n\t * @param {ClippingContext} clippingContext - The current clipping context.\n\t */\n\tpush( object, geometry, material, groupOrder, z, group, clippingContext ) {\n\n\t\tconst renderItem = this.getNextRenderItem( object, geometry, material, groupOrder, z, group, clippingContext );\n\n\t\tif ( object.occlusionTest === true ) this.occlusionQueryCount ++;\n\n\t\tif ( material.transparent === true || material.transmission > 0 ||\n\t\t\t( material.transmissionNode && material.transmissionNode.isNode ) ||\n\t\t\t( material.backdropNode && material.backdropNode.isNode ) ) {\n\n\t\t\tif ( needsDoublePass( material ) ) this.transparentDoublePass.push( renderItem );\n\n\t\t\tthis.transparent.push( renderItem );\n\n\t\t} else {\n\n\t\t\tthis.opaque.push( renderItem );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Inserts the given object as a render item at the start of the internal render lists.\n\t * The selected lists depend on the object properties.\n\t *\n\t * @param {Object3D} object - The 3D object.\n\t * @param {BufferGeometry} geometry - The 3D object's geometry.\n\t * @param {Material} material - The 3D object's material.\n\t * @param {number} groupOrder - The current group order.\n\t * @param {number} z - Th 3D object's depth value (z value in clip space).\n\t * @param {?number} group - {?Object} group - Only relevant for objects using multiple materials. This represents a group entry from the respective `BufferGeometry`.\n\t * @param {ClippingContext} clippingContext - The current clipping context.\n\t */\n\tunshift( object, geometry, material, groupOrder, z, group, clippingContext ) {\n\n\t\tconst renderItem = this.getNextRenderItem( object, geometry, material, groupOrder, z, group, clippingContext );\n\n\t\tif ( material.transparent === true || material.transmission > 0 ||\n\t\t\t( material.transmissionNode && material.transmissionNode.isNode ) ||\n\t\t\t( material.backdropNode && material.backdropNode.isNode ) ) {\n\n\t\t\tif ( needsDoublePass( material ) ) this.transparentDoublePass.unshift( renderItem );\n\n\t\t\tthis.transparent.unshift( renderItem );\n\n\t\t} else {\n\n\t\t\tthis.opaque.unshift( renderItem );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Pushes render bundle group data into the render list.\n\t *\n\t * @param {Object} group - Bundle group data.\n\t */\n\tpushBundle( group ) {\n\n\t\tthis.bundles.push( group );\n\n\t}\n\n\t/**\n\t * Pushes a light into the render list.\n\t *\n\t * @param {Light} light - The light.\n\t */\n\tpushLight( light ) {\n\n\t\tthis.lightsArray.push( light );\n\n\t}\n\n\t/**\n\t * Sorts the internal render lists.\n\t *\n\t * @param {?function(any, any): number} customOpaqueSort - A custom sort function for opaque objects.\n\t * @param {?function(any, any): number} customTransparentSort -  A custom sort function for transparent objects.\n\t */\n\tsort( customOpaqueSort, customTransparentSort ) {\n\n\t\tif ( this.opaque.length > 1 ) this.opaque.sort( customOpaqueSort || painterSortStable );\n\t\tif ( this.transparentDoublePass.length > 1 ) this.transparentDoublePass.sort( customTransparentSort || reversePainterSortStable );\n\t\tif ( this.transparent.length > 1 ) this.transparent.sort( customTransparentSort || reversePainterSortStable );\n\n\t}\n\n\t/**\n\t * This method performs finalizing tasks right after the render lists\n\t * have been generated.\n\t */\n\tfinish() {\n\n\t\t// update lights\n\n\t\tthis.lightsNode.setLights( this.lightsArray );\n\n\t\t// Clear references from inactive renderItems in the list\n\n\t\tfor ( let i = this.renderItemsIndex, il = this.renderItems.length; i < il; i ++ ) {\n\n\t\t\tconst renderItem = this.renderItems[ i ];\n\n\t\t\tif ( renderItem.id === null ) break;\n\n\t\t\trenderItem.id = null;\n\t\t\trenderItem.object = null;\n\t\t\trenderItem.geometry = null;\n\t\t\trenderItem.material = null;\n\t\t\trenderItem.groupOrder = null;\n\t\t\trenderItem.renderOrder = null;\n\t\t\trenderItem.z = null;\n\t\t\trenderItem.group = null;\n\t\t\trenderItem.clippingContext = null;\n\n\t\t}\n\n\t}\n\n}\n\nconst _chainKeys$4 = [];\n\n/**\n * This renderer module manages the render lists which are unique\n * per scene and camera combination.\n *\n * @private\n */\nclass RenderLists {\n\n\t/**\n\t * Constructs a render lists management component.\n\t *\n\t * @param {Lighting} lighting - The lighting management component.\n\t */\n\tconstructor( lighting ) {\n\n\t\t/**\n\t\t * The lighting management component.\n\t\t *\n\t\t * @type {Lighting}\n\t\t */\n\t\tthis.lighting = lighting;\n\n\t\t/**\n\t\t * The internal chain map which holds the render lists.\n\t\t *\n\t\t * @type {ChainMap}\n\t\t */\n\t\tthis.lists = new ChainMap();\n\n\t}\n\n\t/**\n\t * Returns a render list for the given scene and camera.\n\t *\n\t * @param {Scene} scene - The scene.\n\t * @param {Camera} camera - The camera.\n\t * @return {RenderList} The render list.\n\t */\n\tget( scene, camera ) {\n\n\t\tconst lists = this.lists;\n\n\t\t_chainKeys$4[ 0 ] = scene;\n\t\t_chainKeys$4[ 1 ] = camera;\n\n\t\tlet list = lists.get( _chainKeys$4 );\n\n\t\tif ( list === undefined ) {\n\n\t\t\tlist = new RenderList( this.lighting, scene, camera );\n\t\t\tlists.set( _chainKeys$4, list );\n\n\t\t}\n\n\t\t_chainKeys$4.length = 0;\n\n\t\treturn list;\n\n\t}\n\n\t/**\n\t * Frees all internal resources.\n\t */\n\tdispose() {\n\n\t\tthis.lists = new ChainMap();\n\n\t}\n\n}\n\nlet _id$8 = 0;\n\n/**\n * Any render or compute command is executed in a specific context that defines\n * the state of the renderer and its backend. Typical examples for such context\n * data are the current clear values or data from the active framebuffer. This\n * module is used to represent these contexts as objects.\n *\n * @private\n */\nclass RenderContext {\n\n\t/**\n\t * Constructs a new render context.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The context's ID.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.id = _id$8 ++;\n\n\t\t/**\n\t\t * Whether the current active framebuffer has a color attachment.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.color = true;\n\n\t\t/**\n\t\t * Whether the color attachment should be cleared or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.clearColor = true;\n\n\t\t/**\n\t\t * The clear color value.\n\t\t *\n\t\t * @type {Object}\n\t\t * @default true\n\t\t */\n\t\tthis.clearColorValue = { r: 0, g: 0, b: 0, a: 1 };\n\n\t\t/**\n\t\t * Whether the current active framebuffer has a depth attachment.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depth = true;\n\n\t\t/**\n\t\t * Whether the depth attachment should be cleared or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.clearDepth = true;\n\n\t\t/**\n\t\t * The clear depth value.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.clearDepthValue = 1;\n\n\t\t/**\n\t\t * Whether the current active framebuffer has a stencil attachment.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.stencil = false;\n\n\t\t/**\n\t\t * Whether the stencil attachment should be cleared or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.clearStencil = true;\n\n\t\t/**\n\t\t * The clear stencil value.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.clearStencilValue = 1;\n\n\t\t/**\n\t\t * By default the viewport encloses the entire framebuffer If a smaller\n\t\t * viewport is manually defined, this property is to `true` by the renderer.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.viewport = false;\n\n\t\t/**\n\t\t * The viewport value. This value is in physical pixels meaning it incorporates\n\t\t * the renderer's pixel ratio. The viewport property of render targets or\n\t\t * the renderer is in logical pixels.\n\t\t *\n\t\t * @type {Vector4}\n\t\t */\n\t\tthis.viewportValue = new Vector4();\n\n\t\t/**\n\t\t * When the scissor test is active and scissor rectangle smaller than the\n\t\t * framebuffers dimensions, this property is to `true` by the renderer.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.scissor = false;\n\n\t\t/**\n\t\t * The scissor rectangle.\n\t\t *\n\t\t * @type {Vector4}\n\t\t */\n\t\tthis.scissorValue = new Vector4();\n\n\t\t/**\n\t\t * The active render target.\n\t\t *\n\t\t * @type {?RenderTarget}\n\t\t * @default null\n\t\t */\n\t\tthis.renderTarget = null;\n\n\t\t/**\n\t\t * The textures of the active render target.\n\t\t * `null` when no render target is set.\n\t\t *\n\t\t * @type {?Array<Texture>}\n\t\t * @default null\n\t\t */\n\t\tthis.textures = null;\n\n\t\t/**\n\t\t * The depth texture of the active render target.\n\t\t * `null` when no render target is set.\n\t\t *\n\t\t * @type {?DepthTexture}\n\t\t * @default null\n\t\t */\n\t\tthis.depthTexture = null;\n\n\t\t/**\n\t\t * The active cube face.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.activeCubeFace = 0;\n\n\t\t/**\n\t\t * The active mipmap level.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.activeMipmapLevel = 0;\n\n\t\t/**\n\t\t * The number of MSAA samples. This value is always `1` when\n\t\t * MSAA isn't used.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.sampleCount = 1;\n\n\t\t/**\n\t\t * The active render target's width in physical pixels.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.width = 0;\n\n\t\t/**\n\t\t * The active render target's height in physical pixels.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.height = 0;\n\n\t\t/**\n\t\t * The occlusion query count.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.occlusionQueryCount = 0;\n\n\t\t/**\n\t\t * The current clipping context.\n\t\t *\n\t\t * @type {?ClippingContext}\n\t\t * @default null\n\t\t */\n\t\tthis.clippingContext = null;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRenderContext = true;\n\n\t}\n\n\t/**\n\t * Returns the cache key of this render context.\n\t *\n\t * @return {number} The cache key.\n\t */\n\tgetCacheKey() {\n\n\t\treturn getCacheKey( this );\n\n\t}\n\n}\n\n/**\n * Computes a cache key for the given render context. This key\n * should identify the render target state so it is possible to\n * configure the correct attachments in the respective backend.\n *\n * @param {RenderContext} renderContext - The render context.\n * @return {number} The cache key.\n */\nfunction getCacheKey( renderContext ) {\n\n\tconst { textures, activeCubeFace, activeMipmapLevel } = renderContext;\n\n\tconst values = [ activeCubeFace, activeMipmapLevel ];\n\n\tfor ( const texture of textures ) {\n\n\t\tvalues.push( texture.id );\n\n\t}\n\n\treturn hashArray( values );\n\n}\n\nconst _chainKeys$3 = [];\nconst _defaultScene = /*@__PURE__*/ new Scene();\nconst _defaultCamera = /*@__PURE__*/ new Camera();\n\n/**\n * This module manages the render contexts of the renderer.\n *\n * @private\n */\nclass RenderContexts {\n\n\t/**\n\t * Constructs a new render context management component.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * A dictionary that manages render contexts in chain maps\n\t\t * for each attachment state.\n\t\t *\n\t\t * @type {Object<string,ChainMap>}\n\t\t */\n\t\tthis.chainMaps = {};\n\n\t}\n\n\t/**\n\t * Returns a render context for the given scene, camera and render target.\n\t *\n\t * @param {Scene} scene - The scene.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {?RenderTarget} [renderTarget=null] - The active render target.\n\t * @param {?MRT} [mrt=null] - The active multiple render target.\n\t * @return {RenderContext} The render context.\n\t */\n\tget( scene, camera, renderTarget = null, mrt = null ) {\n\n\t\t_chainKeys$3[ 0 ] = scene;\n\t\t_chainKeys$3[ 1 ] = camera;\n\n\t\tif ( mrt !== null ) {\n\n\t\t\t_chainKeys$3[ 2 ] = mrt;\n\n\t\t}\n\n\t\tlet attachmentState;\n\n\t\tif ( renderTarget === null ) {\n\n\t\t\tattachmentState = 'default';\n\n\t\t} else {\n\n\t\t\tconst format = renderTarget.texture.format;\n\t\t\tconst count = renderTarget.textures.length;\n\n\t\t\tattachmentState = `${ count }:${ format }:${ renderTarget.samples }:${ renderTarget.depthBuffer }:${ renderTarget.stencilBuffer }`;\n\n\t\t}\n\n\t\tconst chainMap = this._getChainMap( attachmentState );\n\n\t\tlet renderState = chainMap.get( _chainKeys$3 );\n\n\t\tif ( renderState === undefined ) {\n\n\t\t\trenderState = new RenderContext();\n\n\t\t\tchainMap.set( _chainKeys$3, renderState );\n\n\t\t}\n\n\t\t_chainKeys$3.length = 0;\n\n\t\tif ( renderTarget !== null ) renderState.sampleCount = renderTarget.samples === 0 ? 1 : renderTarget.samples;\n\n\t\treturn renderState;\n\n\t}\n\n\t/**\n\t * Returns a render context intended for clear operations.\n\t *\n\t * @param {?RenderTarget} [renderTarget=null] - The active render target.\n\t * @return {RenderContext} The render context.\n\t */\n\tgetForClear( renderTarget = null ) {\n\n\t\treturn this.get( _defaultScene, _defaultCamera, renderTarget );\n\n\t}\n\n\t/**\n\t * Returns a chain map for the given attachment state.\n\t *\n\t * @private\n\t * @param {string} attachmentState - The attachment state.\n\t * @return {ChainMap} The chain map.\n\t */\n\t_getChainMap( attachmentState ) {\n\n\t\treturn this.chainMaps[ attachmentState ] || ( this.chainMaps[ attachmentState ] = new ChainMap() );\n\n\t}\n\n\t/**\n\t * Frees internal resources.\n\t */\n\tdispose() {\n\n\t\tthis.chainMaps = {};\n\n\t}\n\n}\n\nconst _size$3 = /*@__PURE__*/ new Vector3();\n\n/**\n * This module manages the textures of the renderer.\n *\n * @private\n * @augments DataMap\n */\nclass Textures extends DataMap {\n\n\t/**\n\t * Constructs a new texture management component.\n\t *\n\t * @param {Renderer} renderer - The renderer.\n\t * @param {Backend} backend - The renderer's backend.\n\t * @param {Info} info - Renderer component for managing metrics and monitoring data.\n\t */\n\tconstructor( renderer, backend, info ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The renderer.\n\t\t *\n\t\t * @type {Renderer}\n\t\t */\n\t\tthis.renderer = renderer;\n\n\t\t/**\n\t\t * The backend.\n\t\t *\n\t\t * @type {Backend}\n\t\t */\n\t\tthis.backend = backend;\n\n\t\t/**\n\t\t * Renderer component for managing metrics and monitoring data.\n\t\t *\n\t\t * @type {Info}\n\t\t */\n\t\tthis.info = info;\n\n\t}\n\n\t/**\n\t * Updates the given render target. Based on the given render target configuration,\n\t * it updates the texture states representing the attachments of the framebuffer.\n\t *\n\t * @param {RenderTarget} renderTarget - The render target to update.\n\t * @param {number} [activeMipmapLevel=0] - The active mipmap level.\n\t */\n\tupdateRenderTarget( renderTarget, activeMipmapLevel = 0 ) {\n\n\t\tconst renderTargetData = this.get( renderTarget );\n\n\t\tconst sampleCount = renderTarget.samples === 0 ? 1 : renderTarget.samples;\n\t\tconst depthTextureMips = renderTargetData.depthTextureMips || ( renderTargetData.depthTextureMips = {} );\n\n\t\tconst textures = renderTarget.textures;\n\n\t\tconst size = this.getSize( textures[ 0 ] );\n\n\t\tconst mipWidth = size.width >> activeMipmapLevel;\n\t\tconst mipHeight = size.height >> activeMipmapLevel;\n\n\t\tlet depthTexture = renderTarget.depthTexture || depthTextureMips[ activeMipmapLevel ];\n\t\tconst useDepthTexture = renderTarget.depthBuffer === true || renderTarget.stencilBuffer === true;\n\n\t\tlet textureNeedsUpdate = false;\n\n\t\tif ( depthTexture === undefined && useDepthTexture ) {\n\n\t\t\tdepthTexture = new DepthTexture();\n\n\t\t\tdepthTexture.format = renderTarget.stencilBuffer ? DepthStencilFormat : DepthFormat;\n\t\t\tdepthTexture.type = renderTarget.stencilBuffer ? UnsignedInt248Type : UnsignedIntType; // FloatType\n\t\t\tdepthTexture.image.width = mipWidth;\n\t\t\tdepthTexture.image.height = mipHeight;\n\t\t\tdepthTexture.image.depth = size.depth;\n\t\t\tdepthTexture.renderTarget = renderTarget;\n\t\t\tdepthTexture.isArrayTexture = renderTarget.multiview === true && size.depth > 1;\n\n\t\t\tdepthTextureMips[ activeMipmapLevel ] = depthTexture;\n\n\t\t}\n\n\t\tif ( renderTargetData.width !== size.width || size.height !== renderTargetData.height ) {\n\n\t\t\ttextureNeedsUpdate = true;\n\n\t\t\tif ( depthTexture ) {\n\n\t\t\t\tdepthTexture.needsUpdate = true;\n\t\t\t\tdepthTexture.image.width = mipWidth;\n\t\t\t\tdepthTexture.image.height = mipHeight;\n\t\t\t\tdepthTexture.image.depth = depthTexture.isArrayTexture ? depthTexture.image.depth : 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\trenderTargetData.width = size.width;\n\t\trenderTargetData.height = size.height;\n\t\trenderTargetData.textures = textures;\n\t\trenderTargetData.depthTexture = depthTexture || null;\n\t\trenderTargetData.depth = renderTarget.depthBuffer;\n\t\trenderTargetData.stencil = renderTarget.stencilBuffer;\n\t\trenderTargetData.renderTarget = renderTarget;\n\n\t\tif ( renderTargetData.sampleCount !== sampleCount ) {\n\n\t\t\ttextureNeedsUpdate = true;\n\n\t\t\tif ( depthTexture ) {\n\n\t\t\t\tdepthTexture.needsUpdate = true;\n\n\t\t\t}\n\n\t\t\trenderTargetData.sampleCount = sampleCount;\n\n\t\t}\n\n\t\t//\n\n\n\t\tconst options = { sampleCount };\n\n\t\t// XR render targets require no texture updates\n\n\t\tif ( renderTarget.isXRRenderTarget !== true ) {\n\n\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\tconst texture = textures[ i ];\n\n\t\t\t\tif ( textureNeedsUpdate ) texture.needsUpdate = true;\n\n\t\t\t\tthis.updateTexture( texture, options );\n\n\t\t\t}\n\n\t\t\tif ( depthTexture ) {\n\n\t\t\t\tthis.updateTexture( depthTexture, options );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// dispose handler\n\n\t\tif ( renderTargetData.initialized !== true ) {\n\n\t\t\trenderTargetData.initialized = true;\n\n\t\t\t// dispose\n\n\t\t\trenderTargetData.onDispose = () => {\n\n\t\t\t\tthis._destroyRenderTarget( renderTarget );\n\n\t\t\t};\n\n\t\t\trenderTarget.addEventListener( 'dispose', renderTargetData.onDispose );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the given texture. Depending on the texture state, this method\n\t * triggers the upload of texture data to the GPU memory. If the texture data are\n\t * not yet ready for the upload, it uses default texture data for as a placeholder.\n\t *\n\t * @param {Texture} texture - The texture to update.\n\t * @param {Object} [options={}] - The options.\n\t */\n\tupdateTexture( texture, options = {} ) {\n\n\t\tconst textureData = this.get( texture );\n\t\tif ( textureData.initialized === true && textureData.version === texture.version ) return;\n\n\t\tconst isRenderTarget = texture.isRenderTargetTexture || texture.isDepthTexture || texture.isFramebufferTexture;\n\t\tconst backend = this.backend;\n\n\t\tif ( isRenderTarget && textureData.initialized === true ) {\n\n\t\t\t// it's an update\n\n\t\t\tbackend.destroyTexture( texture );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( texture.isFramebufferTexture ) {\n\n\t\t\tconst renderTarget = this.renderer.getRenderTarget();\n\n\t\t\tif ( renderTarget ) {\n\n\t\t\t\ttexture.type = renderTarget.texture.type;\n\n\t\t\t} else {\n\n\t\t\t\ttexture.type = UnsignedByteType;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst { width, height, depth } = this.getSize( texture );\n\n\t\toptions.width = width;\n\t\toptions.height = height;\n\t\toptions.depth = depth;\n\t\toptions.needsMipmaps = this.needsMipmaps( texture );\n\t\toptions.levels = options.needsMipmaps ? this.getMipLevels( texture, width, height ) : 1;\n\n\t\t// TODO: Uniformly handle mipmap definitions\n\t\t// Normal textures and compressed cube textures define base level + mips with their mipmap array\n\t\t// Uncompressed cube textures use their mipmap array only for mips (no base level)\n\n\t\tif ( texture.isCubeTexture && texture.mipmaps.length > 0 ) options.levels ++;\n\n\t\t//\n\n\t\tif ( isRenderTarget || texture.isStorageTexture === true || texture.isExternalTexture === true ) {\n\n\t\t\tbackend.createTexture( texture, options );\n\n\t\t\ttextureData.generation = texture.version;\n\n\t\t} else {\n\n\t\t\tif ( texture.version > 0 ) {\n\n\t\t\t\tconst image = texture.image;\n\n\t\t\t\tif ( image === undefined ) {\n\n\t\t\t\t\twarn( 'Renderer: Texture marked for update but image is undefined.' );\n\n\t\t\t\t} else if ( image.complete === false ) {\n\n\t\t\t\t\twarn( 'Renderer: Texture marked for update but image is incomplete.' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( texture.images ) {\n\n\t\t\t\t\t\tconst images = [];\n\n\t\t\t\t\t\tfor ( const image of texture.images ) {\n\n\t\t\t\t\t\t\timages.push( image );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\toptions.images = images;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\toptions.image = image;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( textureData.isDefaultTexture === undefined || textureData.isDefaultTexture === true ) {\n\n\t\t\t\t\t\tbackend.createTexture( texture, options );\n\n\t\t\t\t\t\ttextureData.isDefaultTexture = false;\n\t\t\t\t\t\ttextureData.generation = texture.version;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( texture.source.dataReady === true ) backend.updateTexture( texture, options );\n\n\t\t\t\t\tconst skipAutoGeneration = texture.isStorageTexture === true && texture.mipmapsAutoUpdate === false;\n\n\t\t\t\t\tif ( options.needsMipmaps && texture.mipmaps.length === 0 && ! skipAutoGeneration ) {\n\n\t\t\t\t\t\tbackend.generateMipmaps( texture );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( texture.onUpdate ) texture.onUpdate( texture );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// async update\n\n\t\t\t\tbackend.createDefaultTexture( texture );\n\n\t\t\t\ttextureData.isDefaultTexture = true;\n\t\t\t\ttextureData.generation = texture.version;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// dispose handler\n\n\t\tif ( textureData.initialized !== true ) {\n\n\t\t\ttextureData.initialized = true;\n\t\t\ttextureData.generation = texture.version;\n\n\t\t\t//\n\n\t\t\tthis.info.memory.textures ++;\n\n\t\t\t//\n\n\t\t\tif ( texture.isVideoTexture && ColorManagement.enabled === true && ColorManagement.getTransfer( texture.colorSpace ) !== SRGBTransfer ) {\n\n\t\t\t\twarn( 'WebGPURenderer: Video textures must use a color space with a sRGB transfer function, e.g. SRGBColorSpace.' );\n\n\t\t\t}\n\n\t\t\t// dispose\n\n\t\t\ttextureData.onDispose = () => {\n\n\t\t\t\tthis._destroyTexture( texture );\n\n\t\t\t};\n\n\t\t\ttexture.addEventListener( 'dispose', textureData.onDispose );\n\n\t\t}\n\n\t\t//\n\n\t\ttextureData.version = texture.version;\n\n\t}\n\n\t/**\n\t * Updates the sampler for the given texture. This method has no effect\n\t * for the WebGL backend since it has no concept of samplers. Texture\n\t * parameters are configured with the `texParameter()` command for each\n\t * texture.\n\t *\n\t * In WebGPU, samplers are objects like textures and it's possible to share\n\t * them when the texture parameters match.\n\t *\n\t * @param {Texture} texture - The texture to update the sampler for.\n\t * @return {string} The current sampler key.\n\t */\n\tupdateSampler( texture ) {\n\n\t\treturn this.backend.updateSampler( texture );\n\n\t}\n\n\t/**\n\t * Computes the size of the given texture and writes the result\n\t * into the target vector. This vector is also returned by the\n\t * method.\n\t *\n\t * If no texture data are available for the compute yet, the method\n\t * returns default size values.\n\t *\n\t * @param {Texture} texture - The texture to compute the size for.\n\t * @param {Vector3} target - The target vector.\n\t * @return {Vector3} The target vector.\n\t */\n\tgetSize( texture, target = _size$3 ) {\n\n\t\tlet image = texture.images ? texture.images[ 0 ] : texture.image;\n\n\t\tif ( image ) {\n\n\t\t\tif ( image.image !== undefined ) image = image.image;\n\n\t\t\tif ( ( typeof HTMLVideoElement !== 'undefined' ) && ( image instanceof HTMLVideoElement ) ) {\n\n\t\t\t\ttarget.width = image.videoWidth || 1;\n\t\t\t\ttarget.height = image.videoHeight || 1;\n\t\t\t\ttarget.depth = 1;\n\n\t\t\t} else if ( ( typeof VideoFrame !== 'undefined' ) && ( image instanceof VideoFrame ) ) {\n\n\t\t\t\ttarget.width = image.displayWidth || 1;\n\t\t\t\ttarget.height = image.displayHeight || 1;\n\t\t\t\ttarget.depth = 1;\n\n\t\t\t} else {\n\n\t\t\t\ttarget.width = image.width || 1;\n\t\t\t\ttarget.height = image.height || 1;\n\t\t\t\ttarget.depth = texture.isCubeTexture ? 6 : ( image.depth || 1 );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\ttarget.width = target.height = target.depth = 1;\n\n\t\t}\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Computes the number of mipmap levels for the given texture.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {number} width - The texture's width.\n\t * @param {number} height - The texture's height.\n\t * @return {number} The number of mipmap levels.\n\t */\n\tgetMipLevels( texture, width, height ) {\n\n\t\tlet mipLevelCount;\n\n\t\tif ( texture.mipmaps.length > 0 ) {\n\n\t\t\tmipLevelCount = texture.mipmaps.length;\n\n\t\t} else {\n\n\t\t\tif ( texture.isCompressedTexture === true ) {\n\n\t\t\t\t// it is not possible to compute mipmaps for compressed textures. So\n\t\t\t\t// when no mipmaps are defined in \"texture.mipmaps\", force a texture\n\t\t\t\t// level of 1\n\n\t\t\t\tmipLevelCount = 1;\n\n\t\t\t} else {\n\n\t\t\t\tmipLevelCount = Math.floor( Math.log2( Math.max( width, height ) ) ) + 1;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn mipLevelCount;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given texture makes use of mipmapping.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @return {boolean} Whether mipmaps are required or not.\n\t */\n\tneedsMipmaps( texture ) {\n\n\t\treturn texture.generateMipmaps === true || texture.mipmaps.length > 0;\n\n\t}\n\n\t/**\n\t * Frees internal resources when the given render target isn't\n\t * required anymore.\n\t *\n\t * @param {RenderTarget} renderTarget - The render target to destroy.\n\t */\n\t_destroyRenderTarget( renderTarget ) {\n\n\t\tif ( this.has( renderTarget ) === true ) {\n\n\t\t\tconst renderTargetData = this.get( renderTarget );\n\n\t\t\tconst textures = renderTargetData.textures;\n\t\t\tconst depthTexture = renderTargetData.depthTexture;\n\n\t\t\t//\n\n\t\t\trenderTarget.removeEventListener( 'dispose', renderTargetData.onDispose );\n\n\t\t\t//\n\n\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\tthis._destroyTexture( textures[ i ] );\n\n\t\t\t}\n\n\t\t\tif ( depthTexture ) {\n\n\t\t\t\tthis._destroyTexture( depthTexture );\n\n\t\t\t}\n\n\t\t\tthis.delete( renderTarget );\n\t\t\tthis.backend.delete( renderTarget );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Frees internal resource when the given texture isn't\n\t * required anymore.\n\t *\n\t * @param {Texture} texture - The texture to destroy.\n\t */\n\t_destroyTexture( texture ) {\n\n\t\tif ( this.has( texture ) === true ) {\n\n\t\t\tconst textureData = this.get( texture );\n\n\t\t\t//\n\n\t\t\ttexture.removeEventListener( 'dispose', textureData.onDispose );\n\n\t\t\t// if a texture is not ready for use, it falls back to a default texture so it's possible\n\t\t\t// to use it for rendering. If a texture in this state is disposed, it's important to\n\t\t\t// not destroy/delete the underlying GPU texture object since it is cached and shared with\n\t\t\t// other textures.\n\n\t\t\tconst isDefaultTexture = textureData.isDefaultTexture;\n\t\t\tthis.backend.destroyTexture( texture, isDefaultTexture );\n\n\t\t\tthis.delete( texture );\n\n\t\t\tthis.info.memory.textures --;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * A four-component version of {@link Color} which is internally\n * used by the renderer to represents clear color with alpha as\n * one object.\n *\n * @private\n * @augments Color\n */\nclass Color4 extends Color {\n\n\t/**\n\t * Constructs a new four-component color.\n\t * You can also pass a single THREE.Color, hex or\n\t * string argument to this constructor.\n\t *\n\t * @param {number|string} [r=1] - The red value.\n\t * @param {number} [g=1] - The green value.\n\t * @param {number} [b=1] - The blue value.\n\t * @param {number} [a=1] - The alpha value.\n\t */\n\tconstructor( r, g, b, a = 1 ) {\n\n\t\tsuper( r, g, b );\n\n\t\tthis.a = a;\n\n\t}\n\n\t/**\n\t * Overwrites the default to honor alpha.\n\t * You can also pass a single THREE.Color, hex or\n\t * string argument to this method.\n\t *\n\t * @param {number|string|Color} r - The red value.\n\t * @param {number} [g] - The green value.\n\t * @param {number} [b] - The blue value.\n\t * @param {number} [a=1] - The alpha value.\n\t * @return {Color4} A reference to this object.\n\t */\n\tset( r, g, b, a = 1 ) {\n\n\t\tthis.a = a;\n\n\t\treturn super.set( r, g, b );\n\n\t}\n\n\t/**\n\t * Overwrites the default to honor alpha.\n\t *\n\t * @param {Color4} color - The color to copy.\n\t * @return {Color4} A reference to this object.\n\t */\n\tcopy( color ) {\n\n\t\tif ( color.a !== undefined ) this.a = color.a;\n\n\t\treturn super.copy( color );\n\n\t}\n\n\t/**\n\t * Overwrites the default to honor alpha.\n\t *\n\t * @return {Color4} The cloned color.\n\t */\n\tclone() {\n\n\t\treturn new this.constructor( this.r, this.g, this.b, this.a );\n\n\t}\n\n}\n\n/**\n * Special version of {@link PropertyNode} which is used for parameters.\n *\n * @augments PropertyNode\n */\nclass ParameterNode extends PropertyNode {\n\n\tstatic get type() {\n\n\t\treturn 'ParameterNode';\n\n\t}\n\n\t/**\n\t * Constructs a new parameter node.\n\t *\n\t * @param {string} nodeType - The type of the node.\n\t * @param {?string} [name=null] - The name of the parameter in the shader.\n\t */\n\tconstructor( nodeType, name = null ) {\n\n\t\tsuper( nodeType, name );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isParameterNode = true;\n\n\t}\n\n\t/**\n\t * Gets the type of a member variable in the parameter node.\n\t *\n\t * @param {NodeBuilder} builder - The node builder.\n\t * @param {string} name - The name of the member variable.\n\t * @returns {string}\n\t */\n\tgetMemberType( builder, name ) {\n\n\t\tconst type = this.getNodeType( builder );\n\t\tconst struct = builder.getStructTypeNode( type );\n\n\t\tlet memberType;\n\n\t\tif ( struct !== null ) {\n\n\t\t\tmemberType = struct.getMemberType( builder, name );\n\n\t\t} else {\n\n\t\t\terror( `TSL: Member \"${ name }\" not found in struct \"${ type }\".` );\n\n\t\t\tmemberType = 'float';\n\n\t\t}\n\n\t\treturn memberType;\n\n\t}\n\n\tgetHash() {\n\n\t\treturn this.uuid;\n\n\t}\n\n\tgenerate() {\n\n\t\treturn this.name;\n\n\t}\n\n}\n\n/**\n * TSL function for creating a parameter node.\n *\n * @tsl\n * @function\n * @param {string} type - The type of the node.\n * @param {?string} name - The name of the parameter in the shader.\n * @returns {ParameterNode}\n */\nconst parameter = ( type, name ) => new ParameterNode( type, name );\n\n/**\n * Stack is a helper for Nodes that need to produce stack-based code instead of continuous flow.\n * They are usually needed in cases like `If`, `Else`.\n *\n * @augments Node\n */\nclass StackNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'StackNode';\n\n\t}\n\n\t/**\n\t * Constructs a new stack node.\n\t *\n\t * @param {?StackNode} [parent=null] - The parent stack node.\n\t */\n\tconstructor( parent = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * List of nodes.\n\t\t *\n\t\t * @type {Array<Node>}\n\t\t */\n\t\tthis.nodes = [];\n\n\t\t/**\n\t\t * The output node.\n\t\t *\n\t\t * @type {?Node}\n\t\t * @default null\n\t\t */\n\t\tthis.outputNode = null;\n\n\t\t/**\n\t\t * The parent stack node.\n\t\t *\n\t\t * @type {?StackNode}\n\t\t * @default null\n\t\t */\n\t\tthis.parent = parent;\n\n\t\t/**\n\t\t * The current conditional node.\n\t\t *\n\t\t * @private\n\t\t * @type {ConditionalNode}\n\t\t * @default null\n\t\t */\n\t\tthis._currentCond = null;\n\n\t\t/**\n\t\t * The expression node. Only\n\t\t * relevant for Switch/Case.\n\t\t *\n\t\t * @private\n\t\t * @type {Node}\n\t\t * @default null\n\t\t */\n\t\tthis._expressionNode = null;\n\n\t\t/**\n\t\t * The current node being processed.\n\t\t *\n\t\t * @private\n\t\t * @type {Node}\n\t\t * @default null\n\t\t */\n\t\tthis._currentNode = null;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isStackNode = true;\n\n\t}\n\n\tgetElementType( builder ) {\n\n\t\treturn this.hasOutput ? this.outputNode.getElementType( builder ) : 'void';\n\n\t}\n\n\tgetNodeType( builder ) {\n\n\t\treturn this.hasOutput ? this.outputNode.getNodeType( builder ) : 'void';\n\n\t}\n\n\tgetMemberType( builder, name ) {\n\n\t\treturn this.hasOutput ? this.outputNode.getMemberType( builder, name ) : 'void';\n\n\t}\n\n\t/**\n\t * Adds a node to this stack.\n\t *\n\t * @param {Node} node - The node to add.\n\t * @param {number} [index=this.nodes.length] - The index where the node should be added.\n\t * @return {StackNode} A reference to this stack node.\n\t */\n\taddToStack( node, index = this.nodes.length ) {\n\n\t\tif ( node.isNode !== true ) {\n\n\t\t\terror( 'TSL: Invalid node added to stack.' );\n\t\t\treturn this;\n\n\t\t}\n\n\t\tthis.nodes.splice( index, 0, node );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds a node to the stack before the current node.\n\t *\n\t * @param {Node} node - The node to add.\n\t * @return {StackNode} A reference to this stack node.\n\t */\n\taddToStackBefore( node ) {\n\n\t\tconst index = this._currentNode ? this.nodes.indexOf( this._currentNode ) : 0;\n\n\t\treturn this.addToStack( node, index );\n\n\t}\n\n\t/**\n\t * Represent an `if` statement in TSL.\n\t *\n\t * @param {Node} boolNode - Represents the condition.\n\t * @param {Function} method - TSL code which is executed if the condition evaluates to `true`.\n\t * @return {StackNode} A reference to this stack node.\n\t */\n\tIf( boolNode, method ) {\n\n\t\tconst methodNode = new ShaderNode( method );\n\t\tthis._currentCond = select( boolNode, methodNode );\n\n\t\treturn this.addToStack( this._currentCond );\n\n\t}\n\n\t/**\n\t * Represent an `elseif` statement in TSL.\n\t *\n\t * @param {Node} boolNode - Represents the condition.\n\t * @param {Function} method - TSL code which is executed if the condition evaluates to `true`.\n\t * @return {StackNode} A reference to this stack node.\n\t */\n\tElseIf( boolNode, method ) {\n\n\t\tconst methodNode = new ShaderNode( method );\n\t\tconst ifNode = select( boolNode, methodNode );\n\n\t\tthis._currentCond.elseNode = ifNode;\n\t\tthis._currentCond = ifNode;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Represent an `else` statement in TSL.\n\t *\n\t * @param {Function} method - TSL code which is executed in the `else` case.\n\t * @return {StackNode} A reference to this stack node.\n\t */\n\tElse( method ) {\n\n\t\tthis._currentCond.elseNode = new ShaderNode( method );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Represents a `switch` statement in TSL.\n\t *\n\t * @param {any} expression - Represents the expression.\n\t * @param {Function} method - TSL code which is executed if the condition evaluates to `true`.\n\t * @return {StackNode} A reference to this stack node.\n\t */\n\tSwitch( expression ) {\n\n\t\tthis._expressionNode = nodeObject( expression );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Represents a `case` statement in TSL. The TSL version accepts an arbitrary numbers of values.\n\t * The last parameter must be the callback method that should be executed in the `true` case.\n\t *\n\t * @param {...any} params - The values of the `Case()` statement as well as the callback method.\n\t * @return {StackNode} A reference to this stack node.\n\t */\n\tCase( ...params ) {\n\n\t\tconst caseNodes = [];\n\n\t\t// extract case nodes from the parameter list\n\n\t\tif ( params.length >= 2 ) {\n\n\t\t\tfor ( let i = 0; i < params.length - 1; i ++ ) {\n\n\t\t\t\tcaseNodes.push( this._expressionNode.equal( nodeObject( params[ i ] ) ) );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\terror( 'TSL: Invalid parameter length. Case() requires at least two parameters.' );\n\n\t\t}\n\n\t\t// extract method\n\n\t\tconst method = params[ params.length - 1 ];\n\t\tconst methodNode = new ShaderNode( method );\n\n\t\t// chain multiple cases when using Case( 1, 2, 3, () => {} )\n\n\t\tlet caseNode = caseNodes[ 0 ];\n\n\t\tfor ( let i = 1; i < caseNodes.length; i ++ ) {\n\n\t\t\tcaseNode = caseNode.or( caseNodes[ i ] );\n\n\t\t}\n\n\t\t// build condition\n\n\t\tconst condNode = select( caseNode, methodNode );\n\n\t\tif ( this._currentCond === null ) {\n\n\t\t\tthis._currentCond = condNode;\n\n\t\t\treturn this.addToStack( this._currentCond );\n\n\t\t} else {\n\n\t\t\tthis._currentCond.elseNode = condNode;\n\t\t\tthis._currentCond = condNode;\n\n\t\t\treturn this;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Represents the default code block of a Switch/Case statement.\n\t *\n\t * @param {Function} method - TSL code which is executed in the `else` case.\n\t * @return {StackNode} A reference to this stack node.\n\t */\n\tDefault( method ) {\n\n\t\tthis.Else( method );\n\n\t\treturn this;\n\n\t}\n\n\tsetup( builder ) {\n\n\t\tconst nodeProperties = builder.getNodeProperties( this );\n\n\t\tlet index = 0;\n\n\t\tfor ( const childNode of this.getChildren() ) {\n\n\t\t\tif ( childNode.isVarNode && childNode.isIntent( builder ) ) {\n\n\t\t\t\tif ( childNode.isAssign( builder ) !== true ) {\n\n\t\t\t\t\tcontinue;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tnodeProperties[ 'node' + index ++ ] = childNode;\n\n\t\t}\n\n\t\t// return a outputNode if exists or null\n\n\t\treturn nodeProperties.outputNode || null;\n\n\t}\n\n\tget hasOutput() {\n\n\t\treturn this.outputNode && this.outputNode.isNode;\n\n\t}\n\n\tbuild( builder, ...params ) {\n\n\t\tconst previousStack = getCurrentStack();\n\n\t\tconst buildStage = builder.buildStage;\n\n\t\tsetCurrentStack( this );\n\n\t\tbuilder.setActiveStack( this );\n\n\t\t//\n\n\t\tconst buildNode = ( node ) => {\n\n\t\t\tthis._currentNode = node;\n\n\t\t\tif ( node.isVarNode && node.isIntent( builder ) ) {\n\n\t\t\t\tif ( node.isAssign( builder ) !== true ) {\n\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( buildStage === 'setup' ) {\n\n\t\t\t\tnode.build( builder );\n\n\t\t\t} else if ( buildStage === 'analyze' ) {\n\n\t\t\t\tnode.build( builder, this );\n\n\t\t\t} else if ( buildStage === 'generate' ) {\n\n\t\t\t\tconst stages = builder.getDataFromNode( node, 'any' ).stages;\n\t\t\t\tconst parents = stages && stages[ builder.shaderStage ];\n\n\t\t\t\tif ( node.isVarNode && parents && parents.length === 1 && parents[ 0 ] && parents[ 0 ].isStackNode ) {\n\n\t\t\t\t\treturn; // skip var nodes that are only used in .toVarying()\n\n\t\t\t\t}\n\n\t\t\t\tnode.build( builder, 'void' );\n\n\t\t\t}\n\n\t\t};\n\n\t\t//\n\n\t\tconst nodes = [ ...this.nodes ];\n\n\t\tfor ( const node of nodes ) {\n\n\t\t\tbuildNode( node );\n\n\t\t}\n\n\t\tthis._currentNode = null;\n\n\t\tconst newNodes = this.nodes.filter( ( node ) => nodes.indexOf( node ) === -1 );\n\n\t\tfor ( const node of newNodes ) {\n\n\t\t\tbuildNode( node );\n\n\t\t}\n\n\t\t//\n\n\t\tlet result;\n\n\t\tif ( this.hasOutput ) {\n\n\t\t\tresult = this.outputNode.build( builder, ...params );\n\n\t\t} else {\n\n\t\t\tresult = super.build( builder, ...params );\n\n\t\t}\n\n\t\tsetCurrentStack( previousStack );\n\n\t\tbuilder.removeActiveStack( this );\n\n\t\treturn result;\n\n\t}\n\n}\n\n/**\n * TSL function for creating a stack node.\n *\n * @tsl\n * @function\n * @param {?StackNode} [parent=null] - The parent stack node.\n * @returns {StackNode}\n */\nconst stack = /*@__PURE__*/ nodeProxy( StackNode ).setParameterLength( 0, 1 );\n\n/**\n * Generates a layout for struct members.\n * This function takes an object representing struct members and returns an array of member layouts.\n * Each member layout includes the member's name, type, and whether it is atomic.\n *\n * @param {Object.<string, string|Object>} members - An object where keys are member names and values are either types (as strings) or objects with type and atomic properties.\n * @returns {Array.<{name: string, type: string, atomic: boolean}>} An array of member layouts.\n */\nfunction getMembersLayout( members ) {\n\n\treturn Object.entries( members ).map( ( [ name, value ] ) => {\n\n\t\tif ( typeof value === 'string' ) {\n\n\t\t\treturn { name, type: value, atomic: false };\n\n\t\t}\n\n\t\treturn { name, type: value.type, atomic: value.atomic || false };\n\n\t} );\n\n}\n\n/**\n * Represents a struct type node in the node-based system.\n * This class is used to define and manage the layout and types of struct members.\n * It extends the base Node class and provides methods to get the length of the struct,\n * retrieve member types, and generate the struct type for a builder.\n *\n * @augments Node\n */\nclass StructTypeNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'StructTypeNode';\n\n\t}\n\n\t/**\n\t * Creates an instance of StructTypeNode.\n\t *\n\t * @param {Object} membersLayout - The layout of the members for the struct.\n\t * @param {?string} [name=null] - The optional name of the struct.\n\t */\n\tconstructor( membersLayout, name = null ) {\n\n\t\tsuper( 'struct' );\n\n\t\t/**\n\t\t * The layout of the members for the struct\n\t\t *\n\t\t * @type {Array.<{name: string, type: string, atomic: boolean}>}\n\t\t */\n\t\tthis.membersLayout = getMembersLayout( membersLayout );\n\n\t\t/**\n\t\t * The name of the struct.\n\t\t *\n\t\t * @type {?string}\n\t\t * @default null\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isStructLayoutNode = true;\n\n\t}\n\n\t/**\n\t * Returns the length of the struct.\n\t * The length is calculated by summing the lengths of the struct's members.\n\t *\n\t * @returns {number} The length of the struct.\n\t */\n\tgetLength() {\n\n\t\tconst BYTES_PER_ELEMENT = Float32Array.BYTES_PER_ELEMENT;\n\t\tlet maxAlignment = 1; // maximum alignment value in this struct\n\t\tlet offset = 0; // global buffer offset in 4 byte elements\n\n\t\tfor ( const member of this.membersLayout ) {\n\n\t\t\tconst type = member.type;\n\n\t\t\tconst itemSize = getMemoryLengthFromType( type );\n\t\t\tconst alignment = getAlignmentFromType( type ) / BYTES_PER_ELEMENT;\n\t\t\tmaxAlignment = Math.max( maxAlignment, alignment );\n\n\t\t\tconst chunkOffset = offset % maxAlignment; // offset in the current chunk of maxAlignment elements\n\t\t\tconst overhang = chunkOffset % alignment; // distance from the last aligned offset\n\t\t\tif ( overhang !== 0 ) {\n\n\t\t\t\toffset += alignment - overhang; // move to next aligned offset\n\n\t\t\t}\n\n\t\t\toffset += itemSize;\n\n\t\t}\n\n\t\treturn ( Math.ceil( offset / maxAlignment ) * maxAlignment ); // ensure length is a multiple of maxAlignment\n\n\t}\n\n\tgetMemberType( builder, name ) {\n\n\t\tconst member = this.membersLayout.find( m => m.name === name );\n\n\t\treturn member ? member.type : 'void';\n\n\t}\n\n\tgetNodeType( builder ) {\n\n\t\tconst structType = builder.getStructTypeFromNode( this, this.membersLayout, this.name );\n\n\t\treturn structType.name;\n\n\t}\n\n\tsetup( builder ) {\n\n\t\tbuilder.getStructTypeFromNode( this, this.membersLayout, this.name );\n\t\tbuilder.addInclude( this );\n\n\t}\n\n\tgenerate( builder ) {\n\n\t\treturn this.getNodeType( builder );\n\n\t}\n\n}\n\n/**\n * StructNode allows to create custom structures with multiple members.\n * This can also be used to define structures in attribute and uniform data.\n *\n * ```js\n * // Define a custom struct\n * const BoundingBox = struct( { min: 'vec3', max: 'vec3' } );\n *\n * // Create a new instance of the struct\n * const bb = BoundingBox( vec3( 0 ), vec3( 1 ) ); // style 1\n * const bb = BoundingBox( { min: vec3( 0 ), max: vec3( 1 ) } ); // style 2\n *\n * // Access the struct members\n * const min = bb.get( 'min' );\n *\n * // Assign a new value to a member\n * min.assign( vec3() );\n * ```\n * @augments Node\n */\nclass StructNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'StructNode';\n\n\t}\n\n\tconstructor( structTypeNode, values ) {\n\n\t\tsuper( 'vec3' );\n\n\t\tthis.structTypeNode = structTypeNode;\n\t\tthis.values = values;\n\n\t\tthis.isStructNode = true;\n\n\t}\n\n\tgetNodeType( builder ) {\n\n\t\treturn this.structTypeNode.getNodeType( builder );\n\n\t}\n\n\tgetMemberType( builder, name ) {\n\n\t\treturn this.structTypeNode.getMemberType( builder, name );\n\n\t}\n\n\tgenerate( builder ) {\n\n\t\tconst nodeVar = builder.getVarFromNode( this );\n\t\tconst structType = nodeVar.type;\n\t\tconst propertyName = builder.getPropertyName( nodeVar );\n\n\t\tbuilder.addLineFlowCode( `${ propertyName } = ${ builder.generateStruct( structType, this.structTypeNode.membersLayout, this.values ) }`, this );\n\n\t\treturn nodeVar.name;\n\n\t}\n\n}\n\n/**\n * TSL function for creating a struct node.\n *\n * @tsl\n * @function\n * @param {Object} membersLayout - The layout of the struct members.\n * @param {?string} [name=null] - The name of the struct.\n * @returns {Function} The struct function.\n */\nconst struct = ( membersLayout, name = null ) => {\n\n\tconst structLayout = new StructTypeNode( membersLayout, name );\n\n\tconst struct = ( ...params ) => {\n\n\t\tlet values = null;\n\n\t\tif ( params.length > 0 ) {\n\n\t\t\tif ( params[ 0 ].isNode ) {\n\n\t\t\t\tvalues = {};\n\n\t\t\t\tconst names = Object.keys( membersLayout );\n\n\t\t\t\tfor ( let i = 0; i < params.length; i ++ ) {\n\n\t\t\t\t\tvalues[ names[ i ] ] = params[ i ];\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tvalues = params[ 0 ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn new StructNode( structLayout, values );\n\n\t};\n\n\tstruct.layout = structLayout;\n\tstruct.isStruct = true;\n\n\treturn struct;\n\n};\n\n/**\n * This node can be used to define multiple outputs in a shader programs.\n *\n * @augments Node\n */\nclass OutputStructNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'OutputStructNode';\n\n\t}\n\n\t/**\n\t * Constructs a new output struct node. The constructor can be invoked with an\n\t * arbitrary number of nodes representing the members.\n\t *\n\t * @param {...Node} members - A parameter list of nodes.\n\t */\n\tconstructor( ...members ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * An array of nodes which defines the output.\n\t\t *\n\t\t * @type {Array<Node>}\n\t\t */\n\t\tthis.members = members;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isOutputStructNode = true;\n\n\t}\n\n\tgetNodeType( builder ) {\n\n\t\tconst properties = builder.getNodeProperties( this );\n\n\t\tif ( properties.membersLayout === undefined ) {\n\n\t\t\tconst members = this.members;\n\t\t\tconst membersLayout = [];\n\n\t\t\tfor ( let i = 0; i < members.length; i ++ ) {\n\n\t\t\t\tconst name = 'm' + i;\n\t\t\t\tconst type = members[ i ].getNodeType( builder );\n\n\t\t\t\tmembersLayout.push( { name, type, index: i } );\n\n\t\t\t}\n\n\t\t\tproperties.membersLayout = membersLayout;\n\t\t\tproperties.structType = builder.getOutputStructTypeFromNode( this, properties.membersLayout );\n\n\t\t}\n\n\t\treturn properties.structType.name;\n\n\t}\n\n\tgenerate( builder ) {\n\n\t\tconst propertyName = builder.getOutputStructName();\n\t\tconst members = this.members;\n\n\t\tconst structPrefix = propertyName !== '' ? propertyName + '.' : '';\n\n\t\tfor ( let i = 0; i < members.length; i ++ ) {\n\n\t\t\tconst snippet = members[ i ].build( builder );\n\n\t\t\tbuilder.addLineFlowCode( `${ structPrefix }m${ i } = ${ snippet }`, this );\n\n\t\t}\n\n\t\treturn propertyName;\n\n\t}\n\n}\n\n/**\n * TSL function for creating an output struct node.\n *\n * @tsl\n * @function\n * @param {...Node} members - A parameter list of nodes.\n * @returns {OutputStructNode}\n */\nconst outputStruct = /*@__PURE__*/ nodeProxy( OutputStructNode );\n\n/**\n * Returns the MRT texture index for the given name.\n *\n * @param {Array<Texture>} textures - The textures of a MRT-configured render target.\n * @param {string} name - The name of the MRT texture which index is requested.\n * @return {number} The texture index.\n */\nfunction getTextureIndex( textures, name ) {\n\n\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\tif ( textures[ i ].name === name ) {\n\n\t\t\treturn i;\n\n\t\t}\n\n\t}\n\n\treturn -1;\n\n}\n\n/**\n * This node can be used setup a MRT context for rendering. A typical MRT setup for\n * post-processing is shown below:\n * ```js\n * const mrtNode = mrt( {\n *   output: output,\n *   normal: normalView\n * } ) );\n * ```\n * The MRT output is defined as a dictionary.\n *\n * @augments OutputStructNode\n */\nclass MRTNode extends OutputStructNode {\n\n\tstatic get type() {\n\n\t\treturn 'MRTNode';\n\n\t}\n\n\t/**\n\t * Constructs a new output struct node.\n\t *\n\t * @param {Object<string, Node>} outputNodes - The MRT outputs.\n\t */\n\tconstructor( outputNodes ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * A dictionary representing the MRT outputs. The key\n\t\t * is the name of the output, the value the node which produces\n\t\t * the output result.\n\t\t *\n\t\t * @type {Object<string, Node>}\n\t\t */\n\t\tthis.outputNodes = outputNodes;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMRTNode = true;\n\n\t}\n\n\t/**\n\t * Returns `true` if the MRT node has an output with the given name.\n\t *\n\t * @param {string} name - The name of the output.\n\t * @return {NodeBuilder} Whether the MRT node has an output for the given name or not.\n\t */\n\thas( name ) {\n\n\t\treturn this.outputNodes[ name ] !== undefined;\n\n\t}\n\n\t/**\n\t * Returns the output node for the given name.\n\t *\n\t * @param {string} name - The name of the output.\n\t * @return {Node} The output node.\n\t */\n\tget( name ) {\n\n\t\treturn this.outputNodes[ name ];\n\n\t}\n\n\t/**\n\t * Merges the outputs of the given MRT node with the outputs of this node.\n\t *\n\t * @param {MRTNode} mrtNode - The MRT to merge.\n\t * @return {MRTNode} A new MRT node with merged outputs..\n\t */\n\tmerge( mrtNode ) {\n\n\t\tconst outputs = { ...this.outputNodes, ...mrtNode.outputNodes };\n\n\t\treturn mrt( outputs );\n\n\t}\n\n\tsetup( builder ) {\n\n\t\tconst outputNodes = this.outputNodes;\n\t\tconst mrt = builder.renderer.getRenderTarget();\n\n\t\tconst members = [];\n\n\t\tconst textures = mrt.textures;\n\n\t\tfor ( const name in outputNodes ) {\n\n\t\t\tconst index = getTextureIndex( textures, name );\n\n\t\t\tmembers[ index ] = vec4( outputNodes[ name ] );\n\n\t\t}\n\n\t\tthis.members = members;\n\n\t\treturn super.setup( builder );\n\n\t}\n\n}\n\n/**\n * TSL function for creating a MRT node.\n *\n * @tsl\n * @function\n * @param {Object<string, Node>} outputNodes - The MRT outputs.\n * @returns {MRTNode}\n */\nconst mrt = /*@__PURE__*/ nodeProxy( MRTNode );\n\n/**\n * This node represents an operation that reinterprets the bit representation of a value\n * in one type as a value in another type.\n *\n * @augments TempNode\n */\nclass BitcastNode extends TempNode {\n\n\tstatic get type() {\n\n\t\treturn 'BitcastNode';\n\n\t}\n\n\t/**\n\t * Constructs a new bitcast node.\n\t *\n\t * @param {Node} valueNode - The value to convert.\n\t * @param {string} conversionType - The type to convert to.\n\t * @param {?string} [inputType = null] - The expected input data type of the bitcast operation.\n\t */\n\tconstructor( valueNode, conversionType, inputType = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The data to bitcast to a new type.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.valueNode = valueNode;\n\n\t\t/**\n\t\t * The type the value will be converted to.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.conversionType = conversionType;\n\n\n\t\t/**\n\t\t * The expected input data type of the bitcast operation.\n\t\t *\n\t\t *\n\t\t * @type {string}\n\t\t * @default null\n\t\t */\n\t\tthis.inputType = inputType;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBitcastNode = true;\n\n\t}\n\n\tgetNodeType( builder ) {\n\n\t\t// GLSL aliasing\n\t\tif ( this.inputType !== null ) {\n\n\t\t\tconst valueType = this.valueNode.getNodeType( builder );\n\t\t\tconst valueLength = builder.getTypeLength( valueType );\n\n\t\t\treturn builder.getTypeFromLength( valueLength, this.conversionType );\n\n\t\t}\n\n\t\treturn this.conversionType;\n\n\t}\n\n\n\tgenerate( builder ) {\n\n\t\tconst type = this.getNodeType( builder );\n\t\tlet inputType = '';\n\n\t\tif ( this.inputType !== null ) {\n\n\t\t\tconst valueType = this.valueNode.getNodeType( builder );\n\t\t\tconst valueTypeLength = builder.getTypeLength( valueType );\n\n\t\t\tinputType = valueTypeLength === 1 ? this.inputType : builder.changeComponentType( valueType, this.inputType );\n\n\t\t} else {\n\n\t\t\tinputType = this.valueNode.getNodeType( builder );\n\n\t\t}\n\n\t\treturn `${ builder.getBitcastMethod( type, inputType ) }( ${ this.valueNode.build( builder, inputType ) } )`;\n\n\n\t}\n\n}\n\n/**\n * Reinterpret the bit representation of a value in one type as a value in another type.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The parameter.\n * @param {string} y - The new type.\n * @returns {Node}\n */\nconst bitcast = /*@__PURE__*/ nodeProxyIntent( BitcastNode ).setParameterLength( 2 );\n\n/**\n * Bitcasts a float or a vector of floats to a corresponding integer type with the same element size.\n *\n * @tsl\n * @function\n * @param {Node<float>} value - The float or vector of floats to bitcast.\n * @returns {BitcastNode}\n */\nconst floatBitsToInt = ( value ) => new BitcastNode( value, 'int', 'float' );\n\n/**\n * Bitcasts a float or a vector of floats to a corresponding unsigned integer type with the same element size.\n *\n * @tsl\n * @function\n * @param {Node<float>} value - The float or vector of floats to bitcast.\n * @returns {BitcastNode}\n */\nconst floatBitsToUint = ( value ) => new BitcastNode( value, 'uint', 'float' );\n\n/**\n * Bitcasts an integer or a vector of integers to a corresponding float type with the same element size.\n *\n * @tsl\n * @function\n * @param {Node<int>} value - The integer or vector of integers to bitcast.\n * @returns {BitcastNode}\n */\nconst intBitsToFloat = ( value ) => new BitcastNode( value, 'float', 'int' );\n\n/**\n * Bitcast an unsigned integer or a vector of unsigned integers to a corresponding float type with the same element size.\n *\n * @tsl\n * @function\n * @param {Node<uint>} value - The unsigned integer or vector of unsigned integers to bitcast.\n * @returns {BitcastNode}\n */\nconst uintBitsToFloat = ( value ) => new BitcastNode( value, 'float', 'uint' );\n\nconst registeredBitcountFunctions = {};\n\n/**\n * This node represents an operation that counts the bits of a piece of shader data.\n *\n * @augments MathNode\n */\nclass BitcountNode extends MathNode {\n\n\tstatic get type() {\n\n\t\treturn 'BitcountNode';\n\n\t}\n\n\t/**\n\t * Constructs a new math node.\n\t *\n\t * @param {'countTrailingZeros'|'countLeadingZeros'|'countOneBits'} method - The method name.\n\t * @param {Node} aNode - The first input.\n\t */\n\tconstructor( method, aNode ) {\n\n\t\tsuper( method, aNode );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBitcountNode = true;\n\n\t}\n\n\t/**\n\t * Casts the input value of the function to an integer if necessary.\n\t *\n\t * @private\n\t * @param {Node<uint>|Node<int>} inputNode - The input value.\n\t * @param {Node<uint>} outputNode - The output value.\n\t * @param {string} elementType - The type of the input value.\n\t */\n\t_resolveElementType( inputNode, outputNode, elementType ) {\n\n\t\tif ( elementType === 'int' ) {\n\n\t\t\toutputNode.assign( bitcast( inputNode, 'uint' ) );\n\n\t\t} else {\n\n\t\t\toutputNode.assign( inputNode );\n\n\t\t}\n\n\t}\n\n\t_returnDataNode( inputType ) {\n\n\t\tswitch ( inputType ) {\n\n\t\t\tcase 'uint': {\n\n\t\t\t\treturn uint;\n\n\t\t\t}\n\n\t\t\tcase 'int': {\n\n\t\t\t\treturn int;\n\n\t\t\t}\n\n\t\t\tcase 'uvec2': {\n\n\t\t\t\treturn uvec2;\n\n\t\t\t}\n\n\t\t\tcase 'uvec3': {\n\n\t\t\t\treturn uvec3;\n\n\t\t\t}\n\n\t\t\tcase 'uvec4': {\n\n\t\t\t\treturn uvec4;\n\n\t\t\t}\n\n\t\t\tcase 'ivec2': {\n\n\t\t\t\treturn ivec2;\n\n\t\t\t}\n\n\t\t\tcase 'ivec3': {\n\n\t\t\t\treturn ivec3;\n\n\t\t\t}\n\n\t\t\tcase 'ivec4': {\n\n\t\t\t\treturn ivec4;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Creates and registers a reusable GLSL function that emulates the behavior of countTrailingZeros.\n\t *\n\t * @private\n\t * @param {string} method - The name of the function to create.\n\t * @param {string} elementType - The type of the input value.\n\t * @returns {Function} - The generated function\n\t */\n\t_createTrailingZerosBaseLayout( method, elementType ) {\n\n\t\tconst outputConvertNode = this._returnDataNode( elementType );\n\n\t\tconst fnDef = Fn( ( [ value ] ) => {\n\n\t\t\tconst v = uint( 0.0 );\n\n\t\t\tthis._resolveElementType( value, v, elementType );\n\n\t\t\tconst f = float( v.bitAnd( negate( v ) ) );\n\t\t\tconst uintBits = floatBitsToUint( f );\n\n\t\t\tconst numTrailingZeros = ( uintBits.shiftRight( 23 ) ).sub( 127 );\n\n\t\t\treturn outputConvertNode( numTrailingZeros );\n\n\t\t} ).setLayout( {\n\t\t\tname: method,\n\t\t\ttype: elementType,\n\t\t\tinputs: [\n\t\t\t\t{ name: 'value', type: elementType }\n\t\t\t]\n\t\t} );\n\n\t\treturn fnDef;\n\n\t}\n\n\t/**\n\t * Creates and registers a reusable GLSL function that emulates the behavior of countLeadingZeros.\n\t *\n\t * @private\n\t * @param {string} method - The name of the function to create.\n\t * @param {string} elementType - The type of the input value.\n\t * @returns {Function} - The generated function\n\t */\n\t_createLeadingZerosBaseLayout( method, elementType ) {\n\n\t\tconst outputConvertNode = this._returnDataNode( elementType );\n\n\t\tconst fnDef = Fn( ( [ value ] ) => {\n\n\t\t\tIf( value.equal( uint( 0 ) ), () => {\n\n\t\t\t\treturn uint( 32 );\n\n\t\t\t} );\n\n\t\t\tconst v = uint( 0 );\n\t\t\tconst n = uint( 0 );\n\t\t\tthis._resolveElementType( value, v, elementType );\n\n\t\t\tIf( v.shiftRight( 16 ).equal( 0 ), () => {\n\n\t\t\t\tn.addAssign( 16 );\n\t\t\t\tv.shiftLeftAssign( 16 );\n\n\t\t\t} );\n\n\t\t\tIf( v.shiftRight( 24 ).equal( 0 ), () => {\n\n\t\t\t\tn.addAssign( 8 );\n\t\t\t\tv.shiftLeftAssign( 8 );\n\n\t\t\t} );\n\n\t\t\tIf( v.shiftRight( 28 ).equal( 0 ), () => {\n\n\t\t\t\tn.addAssign( 4 );\n\t\t\t\tv.shiftLeftAssign( 4 );\n\n\t\t\t} );\n\n\t\t\tIf( v.shiftRight( 30 ).equal( 0 ), () => {\n\n\t\t\t\tn.addAssign( 2 );\n\t\t\t\tv.shiftLeftAssign( 2 );\n\n\t\t\t} );\n\n\t\t\tIf( v.shiftRight( 31 ).equal( 0 ), () => {\n\n\t\t\t\tn.addAssign( 1 );\n\n\t\t\t} );\n\n\t\t\treturn outputConvertNode( n );\n\n\t\t} ).setLayout( {\n\t\t\tname: method,\n\t\t\ttype: elementType,\n\t\t\tinputs: [\n\t\t\t\t{ name: 'value', type: elementType }\n\t\t\t]\n\t\t} );\n\n\t\treturn fnDef;\n\n\t}\n\n\t/**\n\t * Creates and registers a reusable GLSL function that emulates the behavior of countOneBits.\n\t *\n\t * @private\n\t * @param {string} method - The name of the function to create.\n\t * @param {string} elementType - The type of the input value.\n\t * @returns {Function} - The generated function\n\t */\n\t_createOneBitsBaseLayout( method, elementType ) {\n\n\t\tconst outputConvertNode = this._returnDataNode( elementType );\n\n\t\tconst fnDef = Fn( ( [ value ] ) => {\n\n\t\t\tconst v = uint( 0.0 );\n\n\t\t\tthis._resolveElementType( value, v, elementType );\n\n\t\t\tv.assign( v.sub( v.shiftRight( uint( 1 ) ).bitAnd( uint( 0x55555555 ) ) ) );\n\t\t\tv.assign( v.bitAnd( uint( 0x33333333 ) ).add( v.shiftRight( uint( 2 ) ).bitAnd( uint( 0x33333333 ) ) ) );\n\n\t\t\tconst numBits = v.add( v.shiftRight( uint( 4 ) ) ).bitAnd( uint( 0xF0F0F0F ) ).mul( uint( 0x1010101 ) ).shiftRight( uint( 24 ) );\n\n\t\t\treturn outputConvertNode( numBits );\n\n\t\t} ).setLayout( {\n\t\t\tname: method,\n\t\t\ttype: elementType,\n\t\t\tinputs: [\n\t\t\t\t{ name: 'value', type: elementType }\n\t\t\t]\n\t\t} );\n\n\t\treturn fnDef;\n\n\t}\n\n\t/**\n\t * Creates and registers a reusable GLSL function that emulates the behavior of the specified bitcount function.\n\t * including considerations for component-wise bitcounts on vector type inputs.\n\t *\n\t * @private\n\t * @param {string} method - The name of the function to create.\n\t * @param {string} inputType - The type of the input value.\n\t * @param {number} typeLength - The vec length of the input value.\n\t * @param {Function} baseFn - The base function that operates on an individual component of the vector.\n\t * @returns {Function} - The alias function for the specified bitcount method.\n\t */\n\t_createMainLayout( method, inputType, typeLength, baseFn ) {\n\n\t\tconst outputConvertNode = this._returnDataNode( inputType );\n\n\t\tconst fnDef = Fn( ( [ value ] ) => {\n\n\t\t\tif ( typeLength === 1 ) {\n\n\t\t\t\treturn outputConvertNode( baseFn( value ) );\n\n\t\t\t} else {\n\n\t\t\t\tconst vec = outputConvertNode( 0 );\n\n\t\t\t\tconst components = [ 'x', 'y', 'z', 'w' ];\n\t\t\t\tfor ( let i = 0; i < typeLength; i ++ ) {\n\n\t\t\t\t\tconst component = components[ i ];\n\n\t\t\t\t\tvec[ component ].assign( baseFn( value[ component ] ) );\n\n\t\t\t\t}\n\n\t\t\t\treturn vec;\n\n\t\t\t}\n\n\t\t} ).setLayout( {\n\t\t\tname: method,\n\t\t\ttype: inputType,\n\t\t\tinputs: [\n\t\t\t\t{ name: 'value', type: inputType }\n\t\t\t]\n\t\t} );\n\n\t\treturn fnDef;\n\n\t}\n\n\tsetup( builder ) {\n\n\t\tconst { method, aNode } = this;\n\n\t\tconst { renderer } = builder;\n\n\t\tif ( renderer.backend.isWebGPUBackend ) {\n\n\t\t\t// use built-in WGSL functions for WebGPU\n\n\t\t\treturn super.setup( builder );\n\n\t\t}\n\n\t\tconst inputType = this.getInputType( builder );\n\t\tconst elementType = builder.getElementType( inputType );\n\n\t\tconst typeLength = builder.getTypeLength( inputType );\n\n\t\tconst baseMethod = `${method}_base_${elementType}`;\n\t\tconst newMethod = `${method}_${inputType}`;\n\n\t\tlet baseFn = registeredBitcountFunctions[ baseMethod ];\n\n\t\tif ( baseFn === undefined ) {\n\n\t\t\tswitch ( method ) {\n\n\t\t\t\tcase BitcountNode.COUNT_LEADING_ZEROS: {\n\n\t\t\t\t\tbaseFn = this._createLeadingZerosBaseLayout( baseMethod, elementType );\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tcase BitcountNode.COUNT_TRAILING_ZEROS: {\n\n\t\t\t\t\tbaseFn = this._createTrailingZerosBaseLayout( baseMethod, elementType );\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t\tcase BitcountNode.COUNT_ONE_BITS: {\n\n\t\t\t\t\tbaseFn = this._createOneBitsBaseLayout( baseMethod, elementType );\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tregisteredBitcountFunctions[ baseMethod ] = baseFn;\n\n\t\t}\n\n\t\tlet fn = registeredBitcountFunctions[ newMethod ];\n\n\t\tif ( fn === undefined ) {\n\n\t\t\tfn = this._createMainLayout( newMethod, inputType, typeLength, baseFn );\n\t\t\tregisteredBitcountFunctions[ newMethod ] = fn;\n\n\t\t}\n\n\t\tconst output = Fn( () => {\n\n\t\t\treturn fn(\n\t\t\t\taNode,\n\t\t\t);\n\n\t\t} );\n\n\t\treturn output();\n\n\t}\n\n}\n\nBitcountNode.COUNT_TRAILING_ZEROS = 'countTrailingZeros';\nBitcountNode.COUNT_LEADING_ZEROS = 'countLeadingZeros';\nBitcountNode.COUNT_ONE_BITS = 'countOneBits';\n\n/**\n * Finds the number of consecutive 0 bits from the least significant bit of the input value,\n * which is also the index of the least significant bit of the input value.\n *\n * Can only be used with {@link WebGPURenderer} and a WebGPU backend.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The input value.\n * @returns {Node}\n */\nconst countTrailingZeros = /*@__PURE__*/ nodeProxyIntent( BitcountNode, BitcountNode.COUNT_TRAILING_ZEROS ).setParameterLength( 1 );\n\n/**\n * Finds the number of consecutive 0 bits starting from the most significant bit of the input value.\n *\n * Can only be used with {@link WebGPURenderer} and a WebGPU backend.\n *\n * @tsl\n * @function\n * @param {Node | number} x - The input value.\n * @returns {Node}\n */\nconst countLeadingZeros = /*@__PURE__*/ nodeProxyIntent( BitcountNode, BitcountNode.COUNT_LEADING_ZEROS ).setParameterLength( 1 );\n\n/**\n * Finds the number of '1' bits set in the input value\n *\n * Can only be used with {@link WebGPURenderer} and a WebGPU backend.\n *\n * @tsl\n * @function\n * @returns {Node}\n */\nconst countOneBits = /*@__PURE__*/ nodeProxyIntent( BitcountNode, BitcountNode.COUNT_ONE_BITS ).setParameterLength( 1 );\n\n/**\n * Generates a hash value in the range `[0, 1]` from the given seed.\n *\n * @tsl\n * @function\n * @param {Node<float>} seed - The seed.\n * @return {Node<float>} The hash value.\n */\nconst hash = /*@__PURE__*/ Fn( ( [ seed ] ) => {\n\n\t// Taken from https://www.shadertoy.com/view/XlGcRh, originally from pcg-random.org\n\n\tconst state = seed.toUint().mul( 747796405 ).add( 2891336453 );\n\tconst word = state.shiftRight( state.shiftRight( 28 ).add( 4 ) ).bitXor( state ).mul( 277803737 );\n\tconst result = word.shiftRight( 22 ).bitXor( word );\n\n\treturn result.toFloat().mul( 1 / 2 ** 32 ); // Convert to range [0, 1)\n\n} );\n\n/**\n * A function that remaps the `[0,1]` interval into the `[0,1]` interval.\n * The corners are mapped to `0` and the center to `1`.\n * Reference: {@link https://iquilezles.org/articles/functions/}.\n *\n * @tsl\n * @function\n * @param {Node<float>} x - The value to remap.\n * @param {Node<float>} k - Allows to control the remapping functions shape by rising the parabola to a power `k`.\n * @return {Node<float>} The remapped value.\n */\nconst parabola = ( x, k ) => pow( mul( 4.0, x.mul( sub( 1.0, x ) ) ), k );\n\n/**\n * A function that remaps the `[0,1]` interval into the `[0,1]` interval.\n * Expands the sides and compresses the center, and keeps `0.5` mapped to `0.5`.\n * Reference: {@link https://iquilezles.org/articles/functions/}.\n *\n * @tsl\n * @function\n * @param {Node<float>} x - The value to remap.\n * @param {Node<float>} k - `k=1` is the identity curve,`k<1` produces the classic `gain()` shape, and `k>1` produces \"s\" shaped curves.\n * @return {Node<float>} The remapped value.\n */\nconst gain = ( x, k ) => x.lessThan( 0.5 ) ? parabola( x.mul( 2.0 ), k ).div( 2.0 ) : sub( 1.0, parabola( mul( sub( 1.0, x ), 2.0 ), k ).div( 2.0 ) );\n\n/**\n * A function that remaps the `[0,1]` interval into the `[0,1]` interval.\n * A generalization of the `parabola()`. Keeps the corners mapped to 0 but allows the control of the shape one either side of the curve.\n * Reference: {@link https://iquilezles.org/articles/functions/}.\n *\n * @tsl\n * @function\n * @param {Node<float>} x - The value to remap.\n * @param {Node<float>} a - First control parameter.\n * @param {Node<float>} b - Second control parameter.\n * @return {Node<float>} The remapped value.\n */\nconst pcurve = ( x, a, b ) => pow( div( pow( x, a ), add( pow( x, a ), pow( sub( 1.0, x ), b ) ) ), 1.0 / a );\n\n/**\n * A phase shifted sinus curve that starts at zero and ends at zero, with bouncing behavior.\n * Reference: {@link https://iquilezles.org/articles/functions/}.\n *\n * @tsl\n * @function\n * @param {Node<float>} x - The value to compute the sin for.\n * @param {Node<float>} k - Controls the amount of bounces.\n * @return {Node<float>} The result value.\n */\nconst sinc = ( x, k ) => sin( PI.mul( k.mul( x ).sub( 1.0 ) ) ).div( PI.mul( k.mul( x ).sub( 1.0 ) ) );\n\n/**\n * This node represents an operation that packs floating-point values of a vector into an unsigned 32-bit integer\n *\n * @augments TempNode\n */\nclass PackFloatNode extends TempNode {\n\n\tstatic get type() {\n\n\t\treturn 'PackFloatNode';\n\n\t}\n\n\t/**\n\t *\n\t * @param {'snorm' | 'unorm' | 'float16'} encoding - The numeric encoding that describes how the float values are mapped to the integer range.\n\t * @param {Node} vectorNode - The vector node to be packed\n\t */\n\tconstructor( encoding, vectorNode ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The vector to be packed.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.vectorNode = vectorNode;\n\n\t\t/**\n\t\t * The numeric encoding.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.encoding = encoding;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPackFloatNode = true;\n\n\t}\n\n\tgetNodeType() {\n\n\t\treturn 'uint';\n\n\t}\n\n\tgenerate( builder ) {\n\n\t\tconst inputType = this.vectorNode.getNodeType( builder );\n\t\treturn `${ builder.getFloatPackingMethod( this.encoding ) }(${ this.vectorNode.build( builder, inputType )})`;\n\n\t}\n\n}\n\n/**\n * Converts each component of the normalized float to 16-bit integer values. The results are packed into a single unsigned integer.\n * round(clamp(c, -1, +1) * 32767.0)\n *\n * @tsl\n * @function\n * @param {Node<vec2>} value - The 2-component vector to be packed\n * @returns {Node}\n */\nconst packSnorm2x16 = /*@__PURE__*/ nodeProxyIntent( PackFloatNode, 'snorm' ).setParameterLength( 1 );\n\n/**\n * Converts each component of the normalized float to 16-bit integer values. The results are packed into a single unsigned integer.\n * round(clamp(c, 0, +1) * 65535.0)\n *\n * @tsl\n * @function\n * @param {Node<vec2>} value - The 2-component vector to be packed\n * @returns {Node}\n */\nconst packUnorm2x16 = /*@__PURE__*/ nodeProxyIntent( PackFloatNode, 'unorm' ).setParameterLength( 1 );\n\n/**\n * Converts each component of the vec2 to 16-bit floating-point values. The results are packed into a single unsigned integer.\n *\n * @tsl\n * @function\n * @param {Node<vec2>} value - The 2-component vector to be packed\n * @returns {Node}\n */\nconst packHalf2x16 = /*@__PURE__*/ nodeProxyIntent( PackFloatNode, 'float16' ).setParameterLength( 1 );\n\n/**\n * This node represents an operation that unpacks values from a 32-bit unsigned integer, reinterpreting the results as a floating-point vector\n *\n * @augments TempNode\n */\nclass UnpackFloatNode extends TempNode {\n\n\tstatic get type() {\n\n\t\treturn 'UnpackFloatNode';\n\n\t}\n\n\t/**\n\t *\n\t * @param {'snorm' | 'unorm' | 'float16'} encoding - The numeric encoding that describes how the integer values are mapped to the float range\n\t * @param {Node} uintNode - The uint node to be unpacked\n\t */\n\tconstructor( encoding, uintNode ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The unsigned integer to be unpacked.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.uintNode = uintNode;\n\n\t\t/**\n\t\t * The numeric encoding.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.encoding = encoding;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isUnpackFloatNode = true;\n\n\t}\n\n\tgetNodeType() {\n\n\t\treturn 'vec2';\n\n\t}\n\n\tgenerate( builder ) {\n\n\t\tconst inputType = this.uintNode.getNodeType( builder );\n\t\treturn `${ builder.getFloatUnpackingMethod( this.encoding ) }(${ this.uintNode.build( builder, inputType )})`;\n\n\t}\n\n}\n\n/**\n * Unpacks a 32-bit unsigned integer into two 16-bit values, interpreted as normalized signed integers. Returns a vec2 with both values.\n *\n * @tsl\n * @function\n * @param {Node<uint>} value - The unsigned integer to be unpacked\n * @returns {Node}\n */\nconst unpackSnorm2x16 = /*@__PURE__*/ nodeProxyIntent( UnpackFloatNode, 'snorm' ).setParameterLength( 1 );\n\n/**\n * Unpacks a 32-bit unsigned integer into two 16-bit values, interpreted as normalized unsigned integers. Returns a vec2 with both values.\n *\n * @tsl\n * @function\n * @param {Node<uint>} value - The unsigned integer to be unpacked\n * @returns {Node}\n */\nconst unpackUnorm2x16 = /*@__PURE__*/ nodeProxyIntent( UnpackFloatNode, 'unorm' ).setParameterLength( 1 );\n\n/**\n * Unpacks a 32-bit unsigned integer into two 16-bit values, interpreted as 16-bit floating-point numbers. Returns a vec2 with both values.\n *\n * @tsl\n * @function\n * @param {Node<uint>} value - The unsigned integer to be unpacked\n * @returns {Node}\n */\nconst unpackHalf2x16 = /*@__PURE__*/ nodeProxyIntent( UnpackFloatNode, 'float16' ).setParameterLength( 1 );\n\n// https://github.com/cabbibo/glsl-tri-noise-3d\n\n\nconst tri = /*@__PURE__*/ Fn( ( [ x ] ) => {\n\n\treturn x.fract().sub( .5 ).abs();\n\n} ).setLayout( {\n\tname: 'tri',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'x', type: 'float' }\n\t]\n} );\n\nconst tri3 = /*@__PURE__*/ Fn( ( [ p ] ) => {\n\n\treturn vec3( tri( p.z.add( tri( p.y.mul( 1. ) ) ) ), tri( p.z.add( tri( p.x.mul( 1. ) ) ) ), tri( p.y.add( tri( p.x.mul( 1. ) ) ) ) );\n\n} ).setLayout( {\n\tname: 'tri3',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'p', type: 'vec3' }\n\t]\n} );\n\n/**\n * Generates a noise value from the given position, speed and time parameters.\n *\n * @tsl\n * @function\n * @param {Node<vec3>} position - The position.\n * @param {Node<float>} speed - The speed.\n * @param {Node<float>} time - The time.\n * @return {Node<float>} The generated noise.\n */\nconst triNoise3D = /*@__PURE__*/ Fn( ( [ position, speed, time ] ) => {\n\n\tconst p = vec3( position ).toVar();\n\tconst z = float( 1.4 ).toVar();\n\tconst rz = float( 0.0 ).toVar();\n\tconst bp = vec3( p ).toVar();\n\n\tLoop( { start: float( 0.0 ), end: float( 3.0 ), type: 'float', condition: '<=' }, () => {\n\n\t\tconst dg = vec3( tri3( bp.mul( 2.0 ) ) ).toVar();\n\t\tp.addAssign( dg.add( time.mul( float( 0.1 ).mul( speed ) ) ) );\n\t\tbp.mulAssign( 1.8 );\n\t\tz.mulAssign( 1.5 );\n\t\tp.mulAssign( 1.2 );\n\n\t\tconst t = float( tri( p.z.add( tri( p.x.add( tri( p.y ) ) ) ) ) ).toVar();\n\t\trz.addAssign( t.div( z ) );\n\t\tbp.addAssign( 0.14 );\n\n\t} );\n\n\treturn rz;\n\n} ).setLayout( {\n\tname: 'triNoise3D',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'position', type: 'vec3' },\n\t\t{ name: 'speed', type: 'float' },\n\t\t{ name: 'time', type: 'float' }\n\t]\n} );\n\n/**\n * This class allows to define multiple overloaded versions\n * of the same function. Depending on the parameters of the function\n * call, the node picks the best-fit overloaded version.\n *\n * @augments Node\n */\nclass FunctionOverloadingNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'FunctionOverloadingNode';\n\n\t}\n\n\t/**\n\t * Constructs a new function overloading node.\n\t *\n\t * @param {Array<Function>} functionNodes - Array of `Fn` function definitions.\n\t * @param {...Node} parametersNodes - A list of parameter nodes.\n\t */\n\tconstructor( functionNodes = [], ...parametersNodes ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * Array of `Fn` function definitions.\n\t\t *\n\t\t * @type {Array<Function>}\n\t\t */\n\t\tthis.functionNodes = functionNodes;\n\n\t\t/**\n\t\t * A list of parameter nodes.\n\t\t *\n\t\t * @type {Array<Node>}\n\t\t */\n\t\tthis.parametersNodes = parametersNodes;\n\n\t\t/**\n\t\t * The selected overloaded function call.\n\t\t *\n\t\t * @private\n\t\t * @type {ShaderCallNodeInternal}\n\t\t */\n\t\tthis._candidateFn = null;\n\n\t\t/**\n\t\t * This node is marked as global.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.global = true;\n\n\t}\n\n\t/**\n\t * This method is overwritten since the node type is inferred from\n\t * the function's return type.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The node type.\n\t */\n\tgetNodeType( builder ) {\n\n\t\tconst candidateFn = this.getCandidateFn( builder );\n\n\t\treturn candidateFn.shaderNode.layout.type;\n\n\t}\n\n\t/**\n\t * Returns the candidate function for the current parameters.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {FunctionNode} The candidate function.\n\t */\n\tgetCandidateFn( builder ) {\n\n\t\tconst params = this.parametersNodes;\n\n\t\tlet candidateFn = this._candidateFn;\n\n\t\tif ( candidateFn === null ) {\n\n\t\t\tlet bestCandidateFn = null;\n\t\t\tlet bestScore = -1;\n\n\t\t\tfor ( const functionNode of this.functionNodes ) {\n\n\t\t\t\tconst shaderNode = functionNode.shaderNode;\n\t\t\t\tconst layout = shaderNode.layout;\n\n\t\t\t\tif ( layout === null ) {\n\n\t\t\t\t\tthrow new Error( 'FunctionOverloadingNode: FunctionNode must be a layout.' );\n\n\t\t\t\t}\n\n\t\t\t\tconst inputs = layout.inputs;\n\n\t\t\t\tif ( params.length === inputs.length ) {\n\n\t\t\t\t\tlet currentScore = 0;\n\n\t\t\t\t\tfor ( let i = 0; i < params.length; i ++ ) {\n\n\t\t\t\t\t\tconst param = params[ i ];\n\t\t\t\t\t\tconst input = inputs[ i ];\n\n\t\t\t\t\t\tif ( param.getNodeType( builder ) === input.type ) {\n\n\t\t\t\t\t\t\tcurrentScore ++;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( currentScore > bestScore ) {\n\n\t\t\t\t\t\tbestCandidateFn = functionNode;\n\t\t\t\t\t\tbestScore = currentScore;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._candidateFn = candidateFn = bestCandidateFn;\n\n\t\t}\n\n\t\treturn candidateFn;\n\n\t}\n\n\t/**\n\t * Sets up the node for the current parameters.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {Node} The setup node.\n\t */\n\tsetup( builder ) {\n\n\t\tconst candidateFn = this.getCandidateFn( builder );\n\n\t\treturn candidateFn( ...this.parametersNodes );\n\n\t}\n\n}\n\nconst overloadingBaseFn = /*@__PURE__*/ nodeProxy( FunctionOverloadingNode );\n\n/**\n * TSL function for creating a function overloading node.\n *\n * @tsl\n * @function\n * @param {Array<Function>} functionNodes - Array of `Fn` function definitions.\n * @returns {FunctionOverloadingNode}\n */\nconst overloadingFn = ( functionNodes ) => ( ...params ) => overloadingBaseFn( functionNodes, ...params );\n\n/**\n * Represents the elapsed time in seconds.\n *\n * @tsl\n * @type {UniformNode<float>}\n */\nconst time = /*@__PURE__*/ uniform( 0 ).setGroup( renderGroup ).onRenderUpdate( ( frame ) => frame.time );\n\n/**\n * Represents the delta time in seconds.\n *\n * @tsl\n * @type {UniformNode<float>}\n */\nconst deltaTime = /*@__PURE__*/ uniform( 0 ).setGroup( renderGroup ).onRenderUpdate( ( frame ) => frame.deltaTime );\n\n/**\n * Represents the current frame ID.\n *\n * @tsl\n * @type {UniformNode<uint>}\n */\nconst frameId = /*@__PURE__*/ uniform( 0, 'uint' ).setGroup( renderGroup ).onRenderUpdate( ( frame ) => frame.frameId );\n\n/**\n * Generates a sine wave oscillation based on a timer.\n *\n * @tsl\n * @function\n * @param {Node<float>} t - The timer to generate the oscillation with.\n * @return {Node<float>} The oscillation node.\n */\nconst oscSine = ( t = time ) => t.add( 0.75 ).mul( Math.PI * 2 ).sin().mul( 0.5 ).add( 0.5 );\n\n/**\n * Generates a square wave oscillation based on a timer.\n *\n * @tsl\n * @function\n * @param {Node<float>} t - The timer to generate the oscillation with.\n * @return {Node<float>} The oscillation node.\n */\nconst oscSquare = ( t = time ) => t.fract().round();\n\n/**\n * Generates a triangle wave oscillation based on a timer.\n *\n * @tsl\n * @function\n * @param {Node<float>} t - The timer to generate the oscillation with.\n * @return {Node<float>} The oscillation node.\n */\nconst oscTriangle = ( t = time ) => t.add( 0.5 ).fract().mul( 2 ).sub( 1 ).abs();\n\n/**\n * Generates a sawtooth wave oscillation based on a timer.\n *\n * @tsl\n * @function\n * @param {Node<float>} t - The timer to generate the oscillation with.\n * @return {Node<float>} The oscillation node.\n */\nconst oscSawtooth = ( t = time ) => t.fract();\n\n/**\n * Replaces the default UV coordinates used in texture lookups.\n *\n * ```js\n *material.contextNode = replaceDefaultUV( ( textureNode ) => {\n *\n *\t// ...\n *\treturn customUVCoordinates;\n *\n *} );\n *```\n *\n * @tsl\n * @function\n * @param {function(Node):Node<vec2>} callback - A callback that receives the texture node\n * and must return the new uv coordinates.\n * @param {Node} [node=null] - An optional node to which the context will be applied.\n * @return {ContextNode} A context node that replaces the default UV coordinates.\n */\nfunction replaceDefaultUV( callback, node = null ) {\n\n\treturn context( node, { getUV: callback } );\n\n}\n\n/**\n * Rotates the given uv coordinates around a center point\n *\n * @tsl\n * @function\n * @param {Node<vec2>} uv - The uv coordinates.\n * @param {Node<float>} rotation - The rotation defined in radians.\n * @param {Node<vec2>} center - The center of rotation\n * @return {Node<vec2>} The rotated uv coordinates.\n */\nconst rotateUV = /*@__PURE__*/ Fn( ( [ uv, rotation, center = vec2( 0.5 ) ] ) => {\n\n\treturn rotate( uv.sub( center ), rotation ).add( center );\n\n} );\n\n/**\n * Applies a spherical warping effect to the given uv coordinates.\n *\n * @tsl\n * @function\n * @param {Node<vec2>} uv - The uv coordinates.\n * @param {Node<float>} strength - The strength of the effect.\n * @param {Node<vec2>} center - The center point\n * @return {Node<vec2>} The updated uv coordinates.\n */\nconst spherizeUV = /*@__PURE__*/ Fn( ( [ uv, strength, center = vec2( 0.5 ) ] ) => {\n\n\tconst delta = uv.sub( center );\n\tconst delta2 = delta.dot( delta );\n\tconst delta4 = delta2.mul( delta2 );\n\tconst deltaOffset = delta4.mul( strength );\n\n\treturn uv.add( delta.mul( deltaOffset ) );\n\n} );\n\n/**\n * This can be used to achieve a billboarding behavior for flat meshes. That means they are\n * oriented always towards the camera.\n *\n * ```js\n * material.vertexNode = billboarding();\n * ```\n *\n * @tsl\n * @function\n * @param {Object} config - The configuration object.\n * @param {?Node<vec3>} [config.position=null] - Can be used to define the vertex positions in world space.\n * @param {boolean} [config.horizontal=true] - Whether to follow the camera rotation horizontally or not.\n * @param {boolean} [config.vertical=false] - Whether to follow the camera rotation vertically or not.\n * @return {Node<vec3>} The updated vertex position in clip space.\n */\nconst billboarding = /*@__PURE__*/ Fn( ( { position = null, horizontal = true, vertical = false } ) => {\n\n\tlet worldMatrix;\n\n\tif ( position !== null ) {\n\n\t\tworldMatrix = modelWorldMatrix.toVar();\n\t\tworldMatrix[ 3 ][ 0 ] = position.x;\n\t\tworldMatrix[ 3 ][ 1 ] = position.y;\n\t\tworldMatrix[ 3 ][ 2 ] = position.z;\n\n\t} else {\n\n\t\tworldMatrix = modelWorldMatrix;\n\n\t}\n\n\tconst modelViewMatrix = cameraViewMatrix.mul( worldMatrix );\n\n\tif ( defined( horizontal ) ) {\n\n\t\tmodelViewMatrix[ 0 ][ 0 ] = modelWorldMatrix[ 0 ].length();\n\t\tmodelViewMatrix[ 0 ][ 1 ] = 0;\n\t\tmodelViewMatrix[ 0 ][ 2 ] = 0;\n\n\t}\n\n\tif ( defined( vertical ) ) {\n\n\t\tmodelViewMatrix[ 1 ][ 0 ] = 0;\n\t\tmodelViewMatrix[ 1 ][ 1 ] = modelWorldMatrix[ 1 ].length();\n\t\tmodelViewMatrix[ 1 ][ 2 ] = 0;\n\n\t}\n\n\tmodelViewMatrix[ 2 ][ 0 ] = 0;\n\tmodelViewMatrix[ 2 ][ 1 ] = 0;\n\tmodelViewMatrix[ 2 ][ 2 ] = 1;\n\n\treturn cameraProjectionMatrix.mul( modelViewMatrix ).mul( positionLocal );\n\n} );\n\n/**\n * A special version of a screen uv function that involves a depth comparison\n * when computing the final uvs. The function mitigates visual errors when\n * using viewport texture nodes for refraction purposes. Without this function\n * objects in front of a refractive surface might appear on the refractive surface\n * which is incorrect.\n *\n * @tsl\n * @function\n * @param {?Node<vec2>} uv - Optional uv coordinates. By default `screenUV` is used.\n * @return {Node<vec2>} The update uv coordinates.\n */\nconst viewportSafeUV = /*@__PURE__*/ Fn( ( [ uv = null ] ) => {\n\n\tconst depth = linearDepth();\n\tconst depthDiff = linearDepth( viewportDepthTexture( uv ) ).sub( depth );\n\tconst finalUV = depthDiff.lessThan( 0 ).select( screenUV, uv );\n\n\treturn finalUV;\n\n} );\n\n/**\n * Can be used to compute texture coordinates for animated sprite sheets.\n *\n * ```js\n * const uvNode = spritesheetUV( vec2( 6, 6 ), uv(), time.mul( animationSpeed ) );\n *\n * material.colorNode = texture( spriteSheet, uvNode );\n * ```\n *\n * @augments Node\n */\nclass SpriteSheetUVNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'SpriteSheetUVNode';\n\n\t}\n\n\t/**\n\t * Constructs a new sprite sheet uv node.\n\t *\n\t * @param {Node<vec2>} countNode - The node that defines the number of sprites in the x and y direction (e.g 6x6).\n\t * @param {Node<vec2>} [uvNode=uv()] - The uv node.\n\t * @param {Node<float>} [frameNode=float()] - The node that defines the current frame/sprite.\n\t */\n\tconstructor( countNode, uvNode = uv$1(), frameNode = float( 0 ) ) {\n\n\t\tsuper( 'vec2' );\n\n\t\t/**\n\t\t * The node that defines the number of sprites in the x and y direction (e.g 6x6).\n\t\t *\n\t\t * @type {Node<vec2>}\n\t\t */\n\t\tthis.countNode = countNode;\n\n\t\t/**\n\t\t * The uv node.\n\t\t *\n\t\t * @type {Node<vec2>}\n\t\t */\n\t\tthis.uvNode = uvNode;\n\n\t\t/**\n\t\t * The node that defines the current frame/sprite.\n\t\t *\n\t\t * @type {Node<float>}\n\t\t */\n\t\tthis.frameNode = frameNode;\n\n\t}\n\n\tsetup() {\n\n\t\tconst { frameNode, uvNode, countNode } = this;\n\n\t\tconst { width, height } = countNode;\n\n\t\tconst frameNum = frameNode.mod( width.mul( height ) ).floor();\n\n\t\tconst column = frameNum.mod( width );\n\t\tconst row = height.sub( frameNum.add( 1 ).div( width ).ceil() );\n\n\t\tconst scale = countNode.reciprocal();\n\t\tconst uvFrameOffset = vec2( column, row );\n\n\t\treturn uvNode.add( uvFrameOffset ).mul( scale );\n\n\t}\n\n}\n\n/**\n * TSL function for creating a sprite sheet uv node.\n *\n * @tsl\n * @function\n * @param {Node<vec2>} countNode - The node that defines the number of sprites in the x and y direction (e.g 6x6).\n * @param {?Node<vec2>} [uvNode=uv()] - The uv node.\n * @param {?Node<float>} [frameNode=float()] - The node that defines the current frame/sprite.\n * @returns {SpriteSheetUVNode}\n */\nconst spritesheetUV = /*@__PURE__*/ nodeProxy( SpriteSheetUVNode ).setParameterLength( 3 );\n\n/**\n * TSL function for creating a triplanar textures node.\n *\n * Can be used for triplanar texture mapping.\n *\n * ```js\n * material.colorNode = triplanarTexture( texture( diffuseMap ) );\n * ```\n *\n * @tsl\n * @function\n * @param {Node} textureXNode - First texture node.\n * @param {?Node} [textureYNode=null] - Second texture node. When not set, the shader will sample from `textureXNode` instead.\n * @param {?Node} [textureZNode=null] - Third texture node. When not set, the shader will sample from `textureXNode` instead.\n * @param {?Node<float>} [scaleNode=float(1)] - The scale node.\n * @param {?Node<vec3>} [positionNode=positionLocal] - Vertex positions in local space.\n * @param {?Node<vec3>} [normalNode=normalLocal] - Normals in local space.\n * @returns {Node<vec4>}\n */\nconst triplanarTextures = /*@__PURE__*/ Fn( ( [ textureXNode, textureYNode = null, textureZNode = null, scaleNode = float( 1 ), positionNode = positionLocal, normalNode = normalLocal ] ) => {\n\n\t// Reference: https://github.com/keijiro/StandardTriplanar\n\n\t// Blending factor of triplanar mapping\n\tlet bf = normalNode.abs().normalize();\n\tbf = bf.div( bf.dot( vec3( 1.0 ) ) );\n\n\t// Triplanar mapping\n\tconst tx = positionNode.yz.mul( scaleNode );\n\tconst ty = positionNode.zx.mul( scaleNode );\n\tconst tz = positionNode.xy.mul( scaleNode );\n\n\t// Base color\n\tconst textureX = textureXNode.value;\n\tconst textureY = textureYNode !== null ? textureYNode.value : textureX;\n\tconst textureZ = textureZNode !== null ? textureZNode.value : textureX;\n\n\tconst cx = texture( textureX, tx ).mul( bf.x );\n\tconst cy = texture( textureY, ty ).mul( bf.y );\n\tconst cz = texture( textureZ, tz ).mul( bf.z );\n\n\treturn add( cx, cy, cz );\n\n} );\n\n/**\n * TSL function for creating a triplanar textures node.\n *\n * @tsl\n * @function\n * @param {Node} textureXNode - First texture node.\n * @param {?Node} [textureYNode=null] - Second texture node. When not set, the shader will sample from `textureXNode` instead.\n * @param {?Node} [textureZNode=null] - Third texture node. When not set, the shader will sample from `textureXNode` instead.\n * @param {?Node<float>} [scaleNode=float(1)] - The scale node.\n * @param {?Node<vec3>} [positionNode=positionLocal] - Vertex positions in local space.\n * @param {?Node<vec3>} [normalNode=normalLocal] - Normals in local space.\n * @returns {Node<vec4>}\n */\nconst triplanarTexture = ( ...params ) => triplanarTextures( ...params );\n\nconst _reflectorPlane = new Plane();\nconst _normal = new Vector3();\nconst _reflectorWorldPosition = new Vector3();\nconst _cameraWorldPosition = new Vector3();\nconst _rotationMatrix = new Matrix4();\nconst _lookAtPosition = new Vector3( 0, 0, -1 );\nconst clipPlane = new Vector4();\n\nconst _view = new Vector3();\nconst _target = new Vector3();\nconst _q = new Vector4();\n\nconst _size$2 = new Vector2();\n\nconst _defaultRT = new RenderTarget();\nconst _defaultUV = screenUV.flipX();\n\n_defaultRT.depthTexture = new DepthTexture( 1, 1 );\n\nlet _inReflector = false;\n\n/**\n * This node can be used to implement mirror-like flat reflective surfaces.\n *\n * ```js\n * const groundReflector = reflector();\n * material.colorNode = groundReflector;\n *\n * const plane = new Mesh( geometry, material );\n * plane.add( groundReflector.target );\n * ```\n *\n * @augments TextureNode\n */\nclass ReflectorNode extends TextureNode {\n\n\tstatic get type() {\n\n\t\treturn 'ReflectorNode';\n\n\t}\n\n\t/**\n\t * Constructs a new reflector node.\n\t *\n\t * @param {Object} [parameters={}] - An object holding configuration parameters.\n\t * @param {Object3D} [parameters.target=new Object3D()] - The 3D object the reflector is linked to.\n\t * @param {number} [parameters.resolutionScale=1] - The resolution scale.\n\t * @param {boolean} [parameters.generateMipmaps=false] - Whether mipmaps should be generated or not.\n\t * @param {boolean} [parameters.bounces=true] - Whether reflectors can render other reflector nodes or not.\n\t * @param {boolean} [parameters.depth=false] - Whether depth data should be generated or not.\n\t * @param {number} [parameters.samples] - Anti-Aliasing samples of the internal render-target.\n\t * @param {TextureNode} [parameters.defaultTexture] - The default texture node.\n\t * @param {ReflectorBaseNode} [parameters.reflector] - The reflector base node.\n\t */\n\tconstructor( parameters = {} ) {\n\n\t\tsuper( parameters.defaultTexture || _defaultRT.texture, _defaultUV );\n\n\t\t/**\n\t\t * A reference to the internal reflector base node which holds the actual implementation.\n\t\t *\n\t\t * @private\n\t\t * @type {ReflectorBaseNode}\n\t\t * @default ReflectorBaseNode\n\t\t */\n\t\tthis._reflectorBaseNode = parameters.reflector || new ReflectorBaseNode( this, parameters );\n\n\t\t/**\n\t\t * A reference to the internal depth node.\n\t\t *\n\t\t * @private\n\t\t * @type {?Node}\n\t\t * @default null\n\t\t */\n\t\tthis._depthNode = null;\n\n\t\tthis.setUpdateMatrix( false );\n\n\t}\n\n\t/**\n\t * A reference to the internal reflector node.\n\t *\n\t * @type {ReflectorBaseNode}\n\t */\n\tget reflector() {\n\n\t\treturn this._reflectorBaseNode;\n\n\t}\n\n\t/**\n\t * A reference to 3D object the reflector is linked to.\n\t *\n\t * @type {Object3D}\n\t */\n\tget target() {\n\n\t\treturn this._reflectorBaseNode.target;\n\n\t}\n\n\t/**\n\t * Returns a node representing the mirror's depth. That can be used\n\t * to implement more advanced reflection effects like distance attenuation.\n\t *\n\t * @return {Node} The depth node.\n\t */\n\tgetDepthNode() {\n\n\t\tif ( this._depthNode === null ) {\n\n\t\t\tif ( this._reflectorBaseNode.depth !== true ) {\n\n\t\t\t\tthrow new Error( 'THREE.ReflectorNode: Depth node can only be requested when the reflector is created with { depth: true }. ' );\n\n\t\t\t}\n\n\t\t\tthis._depthNode = nodeObject( new ReflectorNode( {\n\t\t\t\tdefaultTexture: _defaultRT.depthTexture,\n\t\t\t\treflector: this._reflectorBaseNode\n\t\t\t} ) );\n\n\t\t}\n\n\t\treturn this._depthNode;\n\n\t}\n\n\tsetup( builder ) {\n\n\t\t// ignore if used in post-processing\n\t\tif ( ! builder.object.isQuadMesh ) this._reflectorBaseNode.build( builder );\n\n\t\treturn super.setup( builder );\n\n\t}\n\n\tclone() {\n\n\t\tconst newNode = new this.constructor( this.reflectorNode );\n\t\tnewNode.uvNode = this.uvNode;\n\t\tnewNode.levelNode = this.levelNode;\n\t\tnewNode.biasNode = this.biasNode;\n\t\tnewNode.sampler = this.sampler;\n\t\tnewNode.depthNode = this.depthNode;\n\t\tnewNode.compareNode = this.compareNode;\n\t\tnewNode.gradNode = this.gradNode;\n\t\tnewNode.offsetNode = this.offsetNode;\n\t\tnewNode._reflectorBaseNode = this._reflectorBaseNode;\n\n\t\treturn newNode;\n\n\t}\n\n\t/**\n\t * Frees internal resources. Should be called when the node is no longer in use.\n\t */\n\tdispose() {\n\n\t\tsuper.dispose();\n\n\t\tthis._reflectorBaseNode.dispose();\n\n\t}\n\n}\n\n/**\n * Holds the actual implementation of the reflector.\n *\n * TODO: Explain why `ReflectorBaseNode`. Originally the entire logic was implemented\n * in `ReflectorNode`, see #29619.\n *\n * @private\n * @augments Node\n */\nclass ReflectorBaseNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'ReflectorBaseNode';\n\n\t}\n\n\t/**\n\t * Constructs a new reflector base node.\n\t *\n\t * @param {TextureNode} textureNode - Represents the rendered reflections as a texture node.\n\t * @param {Object} [parameters={}] - An object holding configuration parameters.\n\t * @param {Object3D} [parameters.target=new Object3D()] - The 3D object the reflector is linked to.\n\t * @param {number} [parameters.resolutionScale=1] - The resolution scale.\n\t * @param {boolean} [parameters.generateMipmaps=false] - Whether mipmaps should be generated or not.\n\t * @param {boolean} [parameters.bounces=true] - Whether reflectors can render other reflector nodes or not.\n\t * @param {boolean} [parameters.depth=false] - Whether depth data should be generated or not.\n\t * @param {number} [parameters.samples] - Anti-Aliasing samples of the internal render-target.\n\t */\n\tconstructor( textureNode, parameters = {} ) {\n\n\t\tsuper();\n\n\t\tconst {\n\t\t\ttarget = new Object3D(),\n\t\t\tresolutionScale = 1,\n\t\t\tgenerateMipmaps = false,\n\t\t\tbounces = true,\n\t\t\tdepth = false,\n\t\t\tsamples = 0\n\t\t} = parameters;\n\n\t\t/**\n\t\t * Represents the rendered reflections as a texture node.\n\t\t *\n\t\t * @type {TextureNode}\n\t\t */\n\t\tthis.textureNode = textureNode;\n\n\t\t/**\n\t\t * The 3D object the reflector is linked to.\n\t\t *\n\t\t * @type {Object3D}\n\t\t * @default {new Object3D()}\n\t\t */\n\t\tthis.target = target;\n\n\t\t/**\n\t\t * The resolution scale.\n\t\t *\n\t\t * @type {number}\n\t\t * @default {1}\n\t\t */\n\t\tthis.resolutionScale = resolutionScale;\n\n\t\tif ( parameters.resolution !== undefined ) {\n\n\t\t\twarnOnce( 'ReflectorNode: The \"resolution\" parameter has been renamed to \"resolutionScale\".' ); // @deprecated r180\n\n\t\t\tthis.resolutionScale = parameters.resolution;\n\n\t\t}\n\n\t\t/**\n\t\t * Whether mipmaps should be generated or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default {false}\n\t\t */\n\t\tthis.generateMipmaps = generateMipmaps;\n\n\t\t/**\n\t\t * Whether reflectors can render other reflector nodes or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default {true}\n\t\t */\n\t\tthis.bounces = bounces;\n\n\t\t/**\n\t\t * Whether depth data should be generated or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default {false}\n\t\t */\n\t\tthis.depth = depth;\n\n\t\t/**\n\t\t * The number of anti-aliasing samples for the render-target\n\t\t *\n\t\t * @type {number}\n\t\t * @default {0}\n\t\t */\n\t\tthis.samples = samples;\n\n\t\t/**\n\t\t * The `updateBeforeType` is set to `NodeUpdateType.RENDER` when {@link ReflectorBaseNode#bounces}\n\t\t * is `true`. Otherwise it's `NodeUpdateType.FRAME`.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'render'\n\t\t */\n\t\tthis.updateBeforeType = bounces ? NodeUpdateType.RENDER : NodeUpdateType.FRAME;\n\n\t\t/**\n\t\t * Weak map for managing virtual cameras.\n\t\t *\n\t\t * @type {WeakMap<Camera, Camera>}\n\t\t */\n\t\tthis.virtualCameras = new WeakMap();\n\n\t\t/**\n\t\t * Weak map for managing render targets.\n\t\t *\n\t\t * @type {Map<Camera, RenderTarget>}\n\t\t */\n\t\tthis.renderTargets = new Map();\n\n\t\t/**\n\t\t * Force render even if reflector is facing away from camera.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default {false}\n\t\t */\n\t\tthis.forceUpdate = false;\n\n\t\t/**\n\t\t * Whether the reflector has been rendered or not.\n\t\t *\n\t\t * When the reflector is facing away from the camera,\n\t\t * this flag is set to `false` and the texture will be empty(black).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default {false}\n\t\t */\n\t\tthis.hasOutput = false;\n\n\t}\n\n\t/**\n\t * Updates the resolution of the internal render target.\n\t *\n\t * @private\n\t * @param {RenderTarget} renderTarget - The render target to resize.\n\t * @param {Renderer} renderer - The renderer that is used to determine the new size.\n\t */\n\t_updateResolution( renderTarget, renderer ) {\n\n\t\tconst resolution = this.resolutionScale;\n\n\t\trenderer.getDrawingBufferSize( _size$2 );\n\n\t\trenderTarget.setSize( Math.round( _size$2.width * resolution ), Math.round( _size$2.height * resolution ) );\n\n\t}\n\n\tsetup( builder ) {\n\n\t\tthis._updateResolution( _defaultRT, builder.renderer );\n\n\t\treturn super.setup( builder );\n\n\t}\n\n\t/**\n\t * Frees internal resources. Should be called when the node is no longer in use.\n\t */\n\tdispose() {\n\n\t\tsuper.dispose();\n\n\t\tfor ( const renderTarget of this.renderTargets.values() ) {\n\n\t\t\trenderTarget.dispose();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a virtual camera for the given camera. The virtual camera is used to\n\t * render the scene from the reflector's view so correct reflections can be produced.\n\t *\n\t * @param {Camera} camera - The scene's camera.\n\t * @return {Camera} The corresponding virtual camera.\n\t */\n\tgetVirtualCamera( camera ) {\n\n\t\tlet virtualCamera = this.virtualCameras.get( camera );\n\n\t\tif ( virtualCamera === undefined ) {\n\n\t\t\tvirtualCamera = camera.clone();\n\n\t\t\tthis.virtualCameras.set( camera, virtualCamera );\n\n\t\t}\n\n\t\treturn virtualCamera;\n\n\t}\n\n\t/**\n\t * Returns a render target for the given camera. The reflections are rendered\n\t * into this render target.\n\t *\n\t * @param {Camera} camera - The scene's camera.\n\t * @return {RenderTarget} The render target.\n\t */\n\tgetRenderTarget( camera ) {\n\n\t\tlet renderTarget = this.renderTargets.get( camera );\n\n\t\tif ( renderTarget === undefined ) {\n\n\t\t\trenderTarget = new RenderTarget( 0, 0, { type: HalfFloatType, samples: this.samples } );\n\n\t\t\tif ( this.generateMipmaps === true ) {\n\n\t\t\t\trenderTarget.texture.minFilter = LinearMipMapLinearFilter;\n\t\t\t\trenderTarget.texture.generateMipmaps = true;\n\n\t\t\t}\n\n\t\t\tif ( this.depth === true ) {\n\n\t\t\t\trenderTarget.depthTexture = new DepthTexture();\n\n\t\t\t}\n\n\t\t\tthis.renderTargets.set( camera, renderTarget );\n\n\t\t}\n\n\t\treturn renderTarget;\n\n\t}\n\n\tupdateBefore( frame ) {\n\n\t\tif ( this.bounces === false && _inReflector ) return false;\n\n\t\t_inReflector = true;\n\n\t\tconst { scene, camera, renderer, material } = frame;\n\t\tconst { target } = this;\n\n\t\tconst virtualCamera = this.getVirtualCamera( camera );\n\t\tconst renderTarget = this.getRenderTarget( virtualCamera );\n\n\t\trenderer.getDrawingBufferSize( _size$2 );\n\n\t\tthis._updateResolution( renderTarget, renderer );\n\n\t\t//\n\n\t\t_reflectorWorldPosition.setFromMatrixPosition( target.matrixWorld );\n\t\t_cameraWorldPosition.setFromMatrixPosition( camera.matrixWorld );\n\n\t\t_rotationMatrix.extractRotation( target.matrixWorld );\n\n\t\t_normal.set( 0, 0, 1 );\n\t\t_normal.applyMatrix4( _rotationMatrix );\n\n\t\t_view.subVectors( _reflectorWorldPosition, _cameraWorldPosition );\n\n\t\t// Avoid rendering when reflector is facing away unless forcing an update\n\t\tconst isFacingAway = _view.dot( _normal ) > 0;\n\n\t\tlet needsClear = false;\n\n\t\tif ( isFacingAway === true && this.forceUpdate === false ) {\n\n\t\t\tif ( this.hasOutput === false ) {\n\n\t\t\t\t_inReflector = false;\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tneedsClear = true;\n\n\t\t}\n\n\t\t_view.reflect( _normal ).negate();\n\t\t_view.add( _reflectorWorldPosition );\n\n\t\t_rotationMatrix.extractRotation( camera.matrixWorld );\n\n\t\t_lookAtPosition.set( 0, 0, -1 );\n\t\t_lookAtPosition.applyMatrix4( _rotationMatrix );\n\t\t_lookAtPosition.add( _cameraWorldPosition );\n\n\t\t_target.subVectors( _reflectorWorldPosition, _lookAtPosition );\n\t\t_target.reflect( _normal ).negate();\n\t\t_target.add( _reflectorWorldPosition );\n\n\t\t//\n\n\t\tvirtualCamera.coordinateSystem = camera.coordinateSystem;\n\t\tvirtualCamera.position.copy( _view );\n\t\tvirtualCamera.up.set( 0, 1, 0 );\n\t\tvirtualCamera.up.applyMatrix4( _rotationMatrix );\n\t\tvirtualCamera.up.reflect( _normal );\n\t\tvirtualCamera.lookAt( _target );\n\n\t\tvirtualCamera.near = camera.near;\n\t\tvirtualCamera.far = camera.far;\n\n\t\tvirtualCamera.updateMatrixWorld();\n\t\tvirtualCamera.projectionMatrix.copy( camera.projectionMatrix );\n\n\t\t// Now update projection matrix with new clip plane, implementing code from: http://www.terathon.com/code/oblique.html\n\t\t// Paper explaining this technique: http://www.terathon.com/lengyel/Lengyel-Oblique.pdf\n\t\t_reflectorPlane.setFromNormalAndCoplanarPoint( _normal, _reflectorWorldPosition );\n\t\t_reflectorPlane.applyMatrix4( virtualCamera.matrixWorldInverse );\n\n\t\tclipPlane.set( _reflectorPlane.normal.x, _reflectorPlane.normal.y, _reflectorPlane.normal.z, _reflectorPlane.constant );\n\n\t\tconst projectionMatrix = virtualCamera.projectionMatrix;\n\n\t\t_q.x = ( Math.sign( clipPlane.x ) + projectionMatrix.elements[ 8 ] ) / projectionMatrix.elements[ 0 ];\n\t\t_q.y = ( Math.sign( clipPlane.y ) + projectionMatrix.elements[ 9 ] ) / projectionMatrix.elements[ 5 ];\n\t\t_q.z = -1;\n\t\t_q.w = ( 1.0 + projectionMatrix.elements[ 10 ] ) / projectionMatrix.elements[ 14 ];\n\n\t\t// Calculate the scaled plane vector\n\t\tclipPlane.multiplyScalar( 1.0 / clipPlane.dot( _q ) );\n\n\t\tconst clipBias = 0;\n\n\t\t// Replacing the third row of the projection matrix\n\t\tprojectionMatrix.elements[ 2 ] = clipPlane.x;\n\t\tprojectionMatrix.elements[ 6 ] = clipPlane.y;\n\t\tprojectionMatrix.elements[ 10 ] = ( renderer.coordinateSystem === WebGPUCoordinateSystem ) ? ( clipPlane.z - clipBias ) : ( clipPlane.z + 1.0 - clipBias );\n\t\tprojectionMatrix.elements[ 14 ] = clipPlane.w;\n\n\t\t//\n\n\t\tthis.textureNode.value = renderTarget.texture;\n\n\t\tif ( this.depth === true ) {\n\n\t\t\tthis.textureNode.getDepthNode().value = renderTarget.depthTexture;\n\n\t\t}\n\n\t\tmaterial.visible = false;\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst currentMRT = renderer.getMRT();\n\t\tconst currentAutoClear = renderer.autoClear;\n\n\t\trenderer.setMRT( null );\n\t\trenderer.setRenderTarget( renderTarget );\n\t\trenderer.autoClear = true;\n\n\t\tconst previousName = scene.name;\n\n\t\tscene.name = ( scene.name || 'Scene' ) + ' [ Reflector ]'; // TODO: Add bounce index\n\n\t\tif ( needsClear ) {\n\n\t\t\trenderer.clear();\n\n\t\t\tthis.hasOutput = false;\n\n\t\t} else {\n\n\t\t\trenderer.render( scene, virtualCamera );\n\n\t\t\tthis.hasOutput = true;\n\n\t\t}\n\n\t\tscene.name = previousName;\n\n\t\trenderer.setMRT( currentMRT );\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\t\trenderer.autoClear = currentAutoClear;\n\n\t\tmaterial.visible = true;\n\n\t\t_inReflector = false;\n\n\t\tthis.forceUpdate = false;\n\n\t}\n\n\t/**\n\t * The resolution scale.\n\t *\n\t * @deprecated\n\t * @type {number}\n\t * @default {1}\n\t */\n\tget resolution() {\n\n\t\twarnOnce( 'ReflectorNode: The \"resolution\" property has been renamed to \"resolutionScale\".' ); // @deprecated r180\n\n\t\treturn this.resolutionScale;\n\n\t}\n\n\tset resolution( value ) {\n\n\t\twarnOnce( 'ReflectorNode: The \"resolution\" property has been renamed to \"resolutionScale\".' ); // @deprecated r180\n\n\t\tthis.resolutionScale = value;\n\n\t}\n\n}\n\n/**\n * TSL function for creating a reflector node.\n *\n * @tsl\n * @function\n * @param {Object} [parameters={}] - An object holding configuration parameters.\n * @param {Object3D} [parameters.target=new Object3D()] - The 3D object the reflector is linked to.\n * @param {number} [parameters.resolution=1] - The resolution scale.\n * @param {boolean} [parameters.generateMipmaps=false] - Whether mipmaps should be generated or not.\n * @param {boolean} [parameters.bounces=true] - Whether reflectors can render other reflector nodes or not.\n * @param {boolean} [parameters.depth=false] - Whether depth data should be generated or not.\n * @param {number} [parameters.samples] - Anti-Aliasing samples of the internal render-target.\n * @param {TextureNode} [parameters.defaultTexture] - The default texture node.\n * @param {ReflectorBaseNode} [parameters.reflector] - The reflector base node.\n * @returns {ReflectorNode}\n */\nconst reflector = ( parameters ) => new ReflectorNode( parameters );\n\nconst _camera = /*@__PURE__*/ new OrthographicCamera( -1, 1, 1, -1, 0, 1 );\n\n/**\n * The purpose of this special geometry is to fill the entire viewport with a single triangle.\n *\n * Reference: {@link https://github.com/mrdoob/three.js/pull/21358}\n *\n * @private\n * @augments BufferGeometry\n */\nclass QuadGeometry extends BufferGeometry {\n\n\t/**\n\t * Constructs a new quad geometry.\n\t *\n\t * @param {boolean} [flipY=false] - Whether the uv coordinates should be flipped along the vertical axis or not.\n\t */\n\tconstructor( flipY = false ) {\n\n\t\tsuper();\n\n\t\tconst uv = flipY === false ? [ 0, -1, 0, 1, 2, 1 ] : [ 0, 2, 0, 0, 2, 0 ];\n\n\t\tthis.setAttribute( 'position', new Float32BufferAttribute( [ -1, 3, 0, -1, -1, 0, 3, -1, 0 ], 3 ) );\n\t\tthis.setAttribute( 'uv', new Float32BufferAttribute( uv, 2 ) );\n\n\t}\n\n}\n\nconst _geometry = /*@__PURE__*/ new QuadGeometry();\n\n\n/**\n * This module is a helper for passes which need to render a full\n * screen effect which is quite common in context of post processing.\n *\n * The intended usage is to reuse a single quad mesh for rendering\n * subsequent passes by just reassigning the `material` reference.\n *\n * Note: This module can only be used with `WebGPURenderer`.\n *\n * @augments Mesh\n */\nclass QuadMesh extends Mesh {\n\n\t/**\n\t * Constructs a new quad mesh.\n\t *\n\t * @param {?Material} [material=null] - The material to render the quad mesh with.\n\t */\n\tconstructor( material = null ) {\n\n\t\tsuper( _geometry, material );\n\n\t\t/**\n\t\t * The camera to render the quad mesh with.\n\t\t *\n\t\t * @type {OrthographicCamera}\n\t\t * @readonly\n\t\t */\n\t\tthis.camera = _camera;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isQuadMesh = true;\n\n\t}\n\n\t/**\n\t * Async version of `render()`.\n\t *\n\t * @async\n\t * @deprecated\n\t * @param {Renderer} renderer - The renderer.\n\t * @return {Promise} A Promise that resolves when the render has been finished.\n\t */\n\tasync renderAsync( renderer ) {\n\n\t\twarnOnce( 'QuadMesh: \"renderAsync()\" has been deprecated. Use \"render()\" and \"await renderer.init();\" when creating the renderer.' ); // @deprecated r181\n\n\t\tawait renderer.init();\n\n\t\trenderer.render( this, _camera );\n\n\t}\n\n\t/**\n\t * Renders the quad mesh\n\t *\n\t * @param {Renderer} renderer - The renderer.\n\t */\n\trender( renderer ) {\n\n\t\trenderer.render( this, _camera );\n\n\t}\n\n}\n\nconst _size$1 = /*@__PURE__*/ new Vector2();\n\n/**\n * `RTTNode` takes another node and uses it with a `QuadMesh` to render into a texture (RTT).\n * This module is especially relevant in context of post processing where certain nodes require\n * texture input for their effects. With the helper function `convertToTexture()` which is based\n * on this module, the node system can automatically ensure texture input if required.\n *\n * @augments TextureNode\n */\nclass RTTNode extends TextureNode {\n\n\tstatic get type() {\n\n\t\treturn 'RTTNode';\n\n\t}\n\n\t/**\n\t * Constructs a new RTT node.\n\t *\n\t * @param {Node} node - The node to render a texture with.\n\t * @param {?number} [width=null] - The width of the internal render target. If not width is applied, the render target is automatically resized.\n\t * @param {?number} [height=null] - The height of the internal render target.\n\t * @param {Object} [options={type:HalfFloatType}] - The options for the internal render target.\n\t */\n\tconstructor( node, width = null, height = null, options = { type: HalfFloatType } ) {\n\n\t\tconst renderTarget = new RenderTarget( width, height, options );\n\n\t\tsuper( renderTarget.texture, uv$1() );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRTTNode = true;\n\n\t\t/**\n\t\t * The node to render a texture with.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.node = node;\n\n\t\t/**\n\t\t * The width of the internal render target.\n\t\t * If not width is applied, the render target is automatically resized.\n\t\t *\n\t\t * @type {?number}\n\t\t * @default null\n\t\t */\n\t\tthis.width = width;\n\n\t\t/**\n\t\t * The height of the internal render target.\n\t\t *\n\t\t * @type {?number}\n\t\t * @default null\n\t\t */\n\t\tthis.height = height;\n\n\t\t/**\n\t\t * The pixel ratio\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.pixelRatio = 1;\n\n\t\t/**\n\t\t * The render target\n\t\t *\n\t\t * @type {RenderTarget}\n\t\t */\n\t\tthis.renderTarget = renderTarget;\n\n\t\t/**\n\t\t * Whether the texture requires an update or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.textureNeedsUpdate = true;\n\n\t\t/**\n\t\t * Whether the texture should automatically be updated or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoUpdate = true;\n\n\t\t/**\n\t\t * The node which is used with the quad mesh for RTT.\n\t\t *\n\t\t * @private\n\t\t * @type {Node}\n\t\t * @default null\n\t\t */\n\t\tthis._rttNode = null;\n\n\t\t/**\n\t\t * The internal quad mesh for RTT.\n\t\t *\n\t\t * @private\n\t\t * @type {QuadMesh}\n\t\t */\n\t\tthis._quadMesh = new QuadMesh( new NodeMaterial() );\n\n\t\t/**\n\t\t * The `updateBeforeType` is set to `NodeUpdateType.RENDER` since the node updates\n\t\t * the texture once per render in its {@link RTTNode#updateBefore} method.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'render'\n\t\t */\n\t\tthis.updateBeforeType = NodeUpdateType.RENDER;\n\n\t}\n\n\t/**\n\t * Whether the internal render target should automatically be resized or not.\n\t *\n\t * @type {boolean}\n\t * @readonly\n\t * @default true\n\t */\n\tget autoResize() {\n\n\t\treturn this.width === null;\n\n\t}\n\n\tsetup( builder ) {\n\n\t\tthis._rttNode = this.node.context( builder.getSharedContext() );\n\t\tthis._quadMesh.material.name = 'RTT';\n\t\tthis._quadMesh.material.needsUpdate = true;\n\n\t\treturn super.setup( builder );\n\n\t}\n\n\t/**\n\t * Sets the size of the internal render target\n\t *\n\t * @param {number} width - The width to set.\n\t * @param {number} height - The width to set.\n\t */\n\tsetSize( width, height ) {\n\n\t\tthis.width = width;\n\t\tthis.height = height;\n\n\t\tconst effectiveWidth = width * this.pixelRatio;\n\t\tconst effectiveHeight = height * this.pixelRatio;\n\n\t\tthis.renderTarget.setSize( effectiveWidth, effectiveHeight );\n\n\t\tthis.textureNeedsUpdate = true;\n\n\t}\n\n\t/**\n\t * Sets the pixel ratio. This will also resize the render target.\n\t *\n\t * @param {number} pixelRatio - The pixel ratio to set.\n\t */\n\tsetPixelRatio( pixelRatio ) {\n\n\t\tthis.pixelRatio = pixelRatio;\n\n\t\tthis.setSize( this.width, this.height );\n\n\t}\n\n\tupdateBefore( { renderer } ) {\n\n\t\tif ( this.textureNeedsUpdate === false && this.autoUpdate === false ) return;\n\n\t\tthis.textureNeedsUpdate = false;\n\n\t\t//\n\n\t\tif ( this.autoResize === true ) {\n\n\t\t\tconst pixelRatio = renderer.getPixelRatio();\n\t\t\tconst size = renderer.getSize( _size$1 );\n\n\t\t\tconst effectiveWidth = Math.floor( size.width * pixelRatio );\n\t\t\tconst effectiveHeight = Math.floor( size.height * pixelRatio );\n\n\t\t\tif ( effectiveWidth !== this.renderTarget.width || effectiveHeight !== this.renderTarget.height ) {\n\n\t\t\t\tthis.renderTarget.setSize( effectiveWidth, effectiveHeight );\n\n\t\t\t\tthis.textureNeedsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tlet name = 'RTT';\n\n\t\tif ( this.node.name ) {\n\n\t\t\tname = this.node.name + ' [ ' + name + ' ]';\n\n\t\t}\n\n\n\t\tthis._quadMesh.material.fragmentNode = this._rttNode;\n\t\tthis._quadMesh.name = name;\n\n\t\t//\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\n\t\trenderer.setRenderTarget( this.renderTarget );\n\n\t\tthis._quadMesh.render( renderer );\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\n\t}\n\n\tclone() {\n\n\t\tconst newNode = new TextureNode( this.value, this.uvNode, this.levelNode );\n\t\tnewNode.sampler = this.sampler;\n\t\tnewNode.referenceNode = this;\n\n\t\treturn newNode;\n\n\t}\n\n}\n\n/**\n * TSL function for creating a RTT node.\n *\n * @tsl\n * @function\n * @param {Node} node - The node to render a texture with.\n * @param {?number} [width=null] - The width of the internal render target. If not width is applied, the render target is automatically resized.\n * @param {?number} [height=null] - The height of the internal render target.\n * @param {Object} [options={type:HalfFloatType}] - The options for the internal render target.\n * @returns {RTTNode}\n */\nconst rtt = ( node, ...params ) => nodeObject( new RTTNode( nodeObject( node ), ...params ) );\n\n/**\n * TSL function for converting nodes to textures nodes.\n *\n * @tsl\n * @function\n * @param {Node} node - The node to render a texture with.\n * @param {?number} [width=null] - The width of the internal render target. If not width is applied, the render target is automatically resized.\n * @param {?number} [height=null] - The height of the internal render target.\n * @param {Object} [options={type:HalfFloatType}] - The options for the internal render target.\n * @returns {RTTNode}\n */\nconst convertToTexture = ( node, ...params ) => {\n\n\tif ( node.isSampleNode || node.isTextureNode ) return node;\n\tif ( node.isPassNode ) return node.getTextureNode();\n\n\treturn rtt( node, ...params );\n\n};\n\n/**\n * Computes a position in view space based on a fragment's screen position expressed as uv coordinates, the fragments\n * depth value and the camera's inverse projection matrix.\n *\n * @tsl\n * @function\n * @param {Node<vec2>} screenPosition - The fragment's screen position expressed as uv coordinates.\n * @param {Node<float>} depth - The fragment's depth value.\n * @param {Node<mat4>} projectionMatrixInverse - The camera's inverse projection matrix.\n * @return {Node<vec3>} The fragments position in view space.\n */\nconst getViewPosition = /*@__PURE__*/ Fn( ( [ screenPosition, depth, projectionMatrixInverse ], builder ) => {\n\n\tlet clipSpacePosition;\n\n\tif ( builder.renderer.coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\tscreenPosition = vec2( screenPosition.x, screenPosition.y.oneMinus() ).mul( 2.0 ).sub( 1.0 );\n\t\tclipSpacePosition = vec4( vec3( screenPosition, depth ), 1.0 );\n\n\t} else {\n\n\t\tclipSpacePosition = vec4( vec3( screenPosition.x, screenPosition.y.oneMinus(), depth ).mul( 2.0 ).sub( 1.0 ), 1.0 );\n\n\t}\n\n\tconst viewSpacePosition = vec4( projectionMatrixInverse.mul( clipSpacePosition ) );\n\n\treturn viewSpacePosition.xyz.div( viewSpacePosition.w );\n\n} );\n\n/**\n * Computes a screen position expressed as uv coordinates based on a fragment's position in view space\n * and the camera's projection matrix\n *\n * @tsl\n * @function\n * @param {Node<vec3>} viewPosition - The fragments position in view space.\n * @param {Node<mat4>} projectionMatrix - The camera's projection matrix.\n * @return {Node<vec2>} The fragment's screen position expressed as uv coordinates.\n */\nconst getScreenPosition = /*@__PURE__*/ Fn( ( [ viewPosition, projectionMatrix ] ) => {\n\n\tconst sampleClipPos = projectionMatrix.mul( vec4( viewPosition, 1.0 ) );\n\tconst sampleUv = sampleClipPos.xy.div( sampleClipPos.w ).mul( 0.5 ).add( 0.5 ).toVar();\n\treturn vec2( sampleUv.x, sampleUv.y.oneMinus() );\n\n} );\n\n/**\n * Computes a normal vector based on depth data. Can be used as a fallback when no normal render\n * target is available or if flat surface normals are required.\n *\n * @tsl\n * @function\n * @param {Node<vec2>} uv - The texture coordinate.\n * @param {DepthTexture} depthTexture - The depth texture.\n * @param {Node<mat4>} projectionMatrixInverse - The camera's inverse projection matrix.\n * @return {Node<vec3>} The computed normal vector.\n */\nconst getNormalFromDepth = /*@__PURE__*/ Fn( ( [ uv, depthTexture, projectionMatrixInverse ] ) => {\n\n\tconst size = textureSize( textureLoad( depthTexture ) );\n\tconst p = ivec2( uv.mul( size ) ).toVar();\n\n\tconst c0 = textureLoad( depthTexture, p ).toVar();\n\n\tconst l2 = textureLoad( depthTexture, p.sub( ivec2( 2, 0 ) ) ).toVar();\n\tconst l1 = textureLoad( depthTexture, p.sub( ivec2( 1, 0 ) ) ).toVar();\n\tconst r1 = textureLoad( depthTexture, p.add( ivec2( 1, 0 ) ) ).toVar();\n\tconst r2 = textureLoad( depthTexture, p.add( ivec2( 2, 0 ) ) ).toVar();\n\tconst b2 = textureLoad( depthTexture, p.add( ivec2( 0, 2 ) ) ).toVar();\n\tconst b1 = textureLoad( depthTexture, p.add( ivec2( 0, 1 ) ) ).toVar();\n\tconst t1 = textureLoad( depthTexture, p.sub( ivec2( 0, 1 ) ) ).toVar();\n\tconst t2 = textureLoad( depthTexture, p.sub( ivec2( 0, 2 ) ) ).toVar();\n\n\tconst dl = abs( sub( float( 2 ).mul( l1 ).sub( l2 ), c0 ) ).toVar();\n\tconst dr = abs( sub( float( 2 ).mul( r1 ).sub( r2 ), c0 ) ).toVar();\n\tconst db = abs( sub( float( 2 ).mul( b1 ).sub( b2 ), c0 ) ).toVar();\n\tconst dt = abs( sub( float( 2 ).mul( t1 ).sub( t2 ), c0 ) ).toVar();\n\n\tconst ce = getViewPosition( uv, c0, projectionMatrixInverse ).toVar();\n\n\tconst dpdx = dl.lessThan( dr ).select( ce.sub( getViewPosition( uv.sub( vec2( float( 1 ).div( size.x ), 0 ) ), l1, projectionMatrixInverse ) ), ce.negate().add( getViewPosition( uv.add( vec2( float( 1 ).div( size.x ), 0 ) ), r1, projectionMatrixInverse ) ) );\n\tconst dpdy = db.lessThan( dt ).select( ce.sub( getViewPosition( uv.add( vec2( 0, float( 1 ).div( size.y ) ) ), b1, projectionMatrixInverse ) ), ce.negate().add( getViewPosition( uv.sub( vec2( 0, float( 1 ).div( size.y ) ) ), t1, projectionMatrixInverse ) ) );\n\n\treturn normalize( cross( dpdx, dpdy ) );\n\n} );\n\n/**\n * Interleaved Gradient Noise (IGN) from Jimenez 2014.\n *\n * IGN has \"low discrepancy\" resulting in evenly distributed samples. It's superior compared to\n * default white noise, blue noise or Bayer.\n *\n * References:\n * - {@link https://www.iryoku.com/next-generation-post-processing-in-call-of-duty-advanced-warfare/}\n * - {@link https://blog.demofox.org/2022/01/01/interleaved-gradient-noise-a-different-kind-of-low-discrepancy-sequence/}\n *\n * @tsl\n * @function\n * @param {Node<vec2>} position - The input position, usually screen coordinates.\n * @return {Node<float>} The noise value.\n */\nconst interleavedGradientNoise = Fn( ( [ position ] ) => {\n\n\treturn fract( float( 52.9829189 ).mul( fract( dot( position, vec2( 0.06711056, 0.00583715 ) ) ) ) );\n\n} ).setLayout( {\n\tname: 'interleavedGradientNoise',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'position', type: 'vec2' }\n\t]\n} );\n\n/**\n * Vogel disk sampling for uniform circular distribution.\n *\n * This function generates sample points distributed uniformly on a disk using the golden angle,\n * resulting in an efficient low-discrepancy sequence for sampling. The rotation parameter (phi)\n * allows randomizing the pattern per-pixel when combined with IGN.\n *\n * @tsl\n * @function\n * @param {Node<int>} sampleIndex - The index of the current sample (0-based).\n * @param {Node<int>} samplesCount - The total number of samples.\n * @param {Node<float>} phi - Rotation angle in radians (typically from IGN * 2\u03C0).\n * @return {Node<vec2>} A 2D point on the unit disk.\n */\nconst vogelDiskSample = Fn( ( [ sampleIndex, samplesCount, phi ] ) => {\n\n\tconst goldenAngle = float( 2.399963229728653 ); // 2\u03C0 * (2 - \u03C6) where \u03C6 is golden ratio\n\tconst r = sqrt( float( sampleIndex ).add( 0.5 ).div( float( samplesCount ) ) );\n\tconst theta = float( sampleIndex ).mul( goldenAngle ).add( phi );\n\treturn vec2( cos( theta ), sin( theta ) ).mul( r );\n\n} ).setLayout( {\n\tname: 'vogelDiskSample',\n\ttype: 'vec2',\n\tinputs: [\n\t\t{ name: 'sampleIndex', type: 'int' },\n\t\t{ name: 'samplesCount', type: 'int' },\n\t\t{ name: 'phi', type: 'float' }\n\t]\n} );\n\n/**\n * Class representing a node that samples a value using a provided callback function.\n *\n * @extends Node\n */\nclass SampleNode extends Node {\n\n\t/**\n\t * Returns the type of the node.\n\t *\n\t * @type {string}\n\t * @readonly\n\t * @static\n\t */\n\tstatic get type() {\n\n\t\treturn 'SampleNode';\n\n\t}\n\n\t/**\n\t * Creates an instance of SampleNode.\n\t *\n\t * @param {Function} callback - The function to be called when sampling. Should accept a UV node and return a value.\n\t * @param {?Node<vec2>} [uvNode=null] - The UV node to be used in the texture sampling.\n\t */\n\tconstructor( callback, uvNode = null ) {\n\n\t\tsuper();\n\n\t\tthis.callback = callback;\n\n\t\t/**\n\t\t * Represents the texture coordinates.\n\t\t *\n\t\t * @type {?Node<vec2|vec3>}\n\t\t * @default null\n\t\t */\n\t\tthis.uvNode = uvNode;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSampleNode = true;\n\n\t}\n\n\t/**\n\t * Sets up the node by sampling with the default UV accessor.\n\t *\n\t * @returns {Node} The result of the callback function when called with the UV node.\n\t */\n\tsetup() {\n\n\t\treturn this.sample( uv$1() );\n\n\t}\n\n\t/**\n\t * Calls the callback function with the provided UV node.\n\t *\n\t * @param {Node<vec2>} uv - The UV node or value to be passed to the callback.\n\t * @returns {Node} The result of the callback function.\n\t */\n\tsample( uv ) {\n\n\t\treturn this.callback( uv );\n\n\t}\n\n}\n\n/**\n * Helper function to create a SampleNode wrapped as a node object.\n *\n * @function\n * @param {Function} callback - The function to be called when sampling. Should accept a UV node and return a value.\n * @param {?Node<vec2>} [uv=null] - The UV node to be used in the texture sampling.\n * @returns {SampleNode} The created SampleNode instance wrapped as a node object.\n */\nconst sample = ( callback, uv = null ) => new SampleNode( callback, nodeObject( uv ) );\n\n/**\n * EventNode is a node that executes a callback during specific update phases.\n *\n * @augments Node\n */\nclass EventNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'EventNode';\n\n\t}\n\n\t/**\n\t * Creates an EventNode.\n\t *\n\t * @param {string} eventType - The type of event\n\t * @param {Function} callback - The callback to execute on update.\n\t */\n\tconstructor( eventType, callback ) {\n\n\t\tsuper( 'void' );\n\n\t\tthis.eventType = eventType;\n\t\tthis.callback = callback;\n\n\t\tif ( eventType === EventNode.OBJECT ) {\n\n\t\t\tthis.updateType = NodeUpdateType.OBJECT;\n\n\t\t} else if ( eventType === EventNode.MATERIAL ) {\n\n\t\t\tthis.updateType = NodeUpdateType.RENDER;\n\n\t\t} else if ( eventType === EventNode.BEFORE_OBJECT ) {\n\n\t\t\tthis.updateBeforeType = NodeUpdateType.OBJECT;\n\n\t\t} else if ( eventType === EventNode.BEFORE_MATERIAL ) {\n\n\t\t\tthis.updateBeforeType = NodeUpdateType.RENDER;\n\n\t\t}\n\n\t}\n\n\tupdate( frame ) {\n\n\t\tthis.callback( frame );\n\n\t}\n\n\tupdateBefore( frame ) {\n\n\t\tthis.callback( frame );\n\n\t}\n\n}\n\nEventNode.OBJECT = 'object';\nEventNode.MATERIAL = 'material';\nEventNode.BEFORE_OBJECT = 'beforeObject';\nEventNode.BEFORE_MATERIAL = 'beforeMaterial';\n\n/**\n * Helper to create an EventNode and add it to the stack.\n *\n * @param {string} type - The event type.\n * @param {Function} callback - The callback function.\n * @returns {EventNode}\n */\nconst createEvent = ( type, callback ) => new EventNode( type, callback ).toStack();\n\n/**\n * Creates an event that triggers a function every time an object (Mesh|Sprite) is rendered.\n *\n * The event will be bound to the declared TSL function `Fn()`; it must be declared within a `Fn()` or the JS function call must be inherited from one.\n *\n * @param {Function} callback - The callback function.\n * @returns {EventNode}\n */\nconst OnObjectUpdate = ( callback ) => createEvent( EventNode.OBJECT, callback );\n\n/**\n * Creates an event that triggers a function when the first object that uses the material is rendered.\n *\n * The event will be bound to the declared TSL function `Fn()`; it must be declared within a `Fn()` or the JS function call must be inherited from one.\n *\n * @param {Function} callback - The callback function.\n * @returns {EventNode}\n */\nconst OnMaterialUpdate = ( callback ) => createEvent( EventNode.MATERIAL, callback );\n\n/**\n * Creates an event that triggers a function before an object (Mesh|Sprite) is updated.\n *\n * The event will be bound to the declared TSL function `Fn()`; it must be declared within a `Fn()` or the JS function call must be inherited from one.\n *\n * @param {Function} callback - The callback function.\n * @returns {EventNode}\n */\nconst OnBeforeObjectUpdate = ( callback ) => createEvent( EventNode.BEFORE_OBJECT, callback );\n\n/**\n * Creates an event that triggers a function before the material is updated.\n *\n * The event will be bound to the declared TSL function `Fn()`; it must be declared within a `Fn()` or the JS function call must be inherited from one.\n *\n * @param {Function} callback - The callback function.\n * @returns {EventNode}\n */\nconst OnBeforeMaterialUpdate = ( callback ) => createEvent( EventNode.BEFORE_MATERIAL, callback );\n\n/**\n * This special type of instanced buffer attribute is intended for compute shaders.\n * In earlier three.js versions it was only possible to update attribute data\n * on the CPU via JavaScript and then upload the data to the GPU. With the\n * new material system and renderer it is now possible to use compute shaders\n * to compute the data for an attribute more efficiently on the GPU.\n *\n * The idea is to create an instance of this class and provide it as an input\n * to {@link StorageBufferNode}.\n *\n * Note: This type of buffer attribute can only be used with `WebGPURenderer`.\n *\n * @augments InstancedBufferAttribute\n */\nclass StorageInstancedBufferAttribute extends InstancedBufferAttribute {\n\n\t/**\n\t * Constructs a new storage instanced buffer attribute.\n\t *\n\t * @param {number|TypedArray} count - The item count. It is also valid to pass a typed array as an argument.\n\t * The subsequent parameters are then obsolete.\n\t * @param {number} itemSize - The item size.\n\t * @param {TypedArray.constructor} [typeClass=Float32Array] - A typed array constructor.\n\t */\n\tconstructor( count, itemSize, typeClass = Float32Array ) {\n\n\t\tconst array = ArrayBuffer.isView( count ) ? count : new typeClass( count * itemSize );\n\n\t\tsuper( array, itemSize );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isStorageInstancedBufferAttribute = true;\n\n\t}\n\n}\n\n/**\n * This special type of buffer attribute is intended for compute shaders.\n * In earlier three.js versions it was only possible to update attribute data\n * on the CPU via JavaScript and then upload the data to the GPU. With the\n * new material system and renderer it is now possible to use compute shaders\n * to compute the data for an attribute more efficiently on the GPU.\n *\n * The idea is to create an instance of this class and provide it as an input\n * to {@link StorageBufferNode}.\n *\n * Note: This type of buffer attribute can only be used with `WebGPURenderer`.\n *\n * @augments BufferAttribute\n */\nclass StorageBufferAttribute extends BufferAttribute {\n\n\t/**\n\t * Constructs a new storage buffer attribute.\n\t *\n\t * @param {number|TypedArray} count - The item count. It is also valid to pass a typed array as an argument.\n\t * The subsequent parameters are then obsolete.\n\t * @param {number} itemSize - The item size.\n\t * @param {TypedArray.constructor} [typeClass=Float32Array] - A typed array constructor.\n\t */\n\tconstructor( count, itemSize, typeClass = Float32Array ) {\n\n\t\tconst array = ArrayBuffer.isView( count ) ? count : new typeClass( count * itemSize );\n\n\t\tsuper( array, itemSize );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isStorageBufferAttribute = true;\n\n\t}\n\n}\n\n/**\n * TSL function for creating a storage buffer node with a configured `StorageBufferAttribute`.\n *\n * @tsl\n * @function\n * @param {number|TypedArray} count - The data count. It is also valid to pass a typed array as an argument.\n * @param {string|Struct} [type='float'] - The data type.\n * @returns {StorageBufferNode}\n */\nconst attributeArray = ( count, type = 'float' ) => {\n\n\tlet itemSize, typedArray;\n\n\tif ( type.isStruct === true ) {\n\n\t\titemSize = type.layout.getLength();\n\t\ttypedArray = getTypedArrayFromType( 'float' );\n\n\t} else {\n\n\t\titemSize = getLengthFromType( type );\n\t\ttypedArray = getTypedArrayFromType( type );\n\n\t}\n\n\tconst buffer = new StorageBufferAttribute( count, itemSize, typedArray );\n\tconst node = storage( buffer, type, count );\n\n\treturn node;\n\n};\n\n/**\n * TSL function for creating a storage buffer node with a configured `StorageInstancedBufferAttribute`.\n *\n * @tsl\n * @function\n * @param {number|TypedArray} count - The data count. It is also valid to pass a typed array as an argument.\n * @param {string|Struct} [type='float'] - The data type.\n * @returns {StorageBufferNode}\n */\nconst instancedArray = ( count, type = 'float' ) => {\n\n\tlet itemSize, typedArray;\n\n\tif ( type.isStruct === true ) {\n\n\t\titemSize = type.layout.getLength();\n\t\ttypedArray = getTypedArrayFromType( 'float' );\n\n\t} else {\n\n\t\titemSize = getLengthFromType( type );\n\t\ttypedArray = getTypedArrayFromType( type );\n\n\t}\n\n\tconst buffer = new StorageInstancedBufferAttribute( count, itemSize, typedArray );\n\tconst node = storage( buffer, type, count );\n\n\treturn node;\n\n};\n\n/**\n * A node for representing the uv coordinates of points.\n *\n * Can only be used with a WebGL backend. In WebGPU, point\n * primitives always have the size of one pixel and can thus\n * can't be used as sprite-like objects that display textures.\n *\n * @augments Node\n */\nclass PointUVNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'PointUVNode';\n\n\t}\n\n\t/**\n\t * Constructs a new point uv node.\n\t */\n\tconstructor() {\n\n\t\tsuper( 'vec2' );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPointUVNode = true;\n\n\t}\n\n\tgenerate( /*builder*/ ) {\n\n\t\treturn 'vec2( gl_PointCoord.x, 1.0 - gl_PointCoord.y )';\n\n\t}\n\n}\n\n/**\n * TSL object that represents the uv coordinates of points.\n *\n * @tsl\n * @type {PointUVNode}\n */\nconst pointUV = /*@__PURE__*/ nodeImmutable( PointUVNode );\n\nconst _e1 = /*@__PURE__*/ new Euler();\nconst _m1 = /*@__PURE__*/ new Matrix4();\n\n/**\n * This module allows access to a collection of scene properties. The following predefined TSL objects\n * are available for easier use:\n *\n * - `backgroundBlurriness`: A node that represents the scene's background blurriness.\n * - `backgroundIntensity`: A node that represents the scene's background intensity.\n * - `backgroundRotation`: A node that represents the scene's background rotation.\n *\n * @augments Node\n */\nclass SceneNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'SceneNode';\n\n\t}\n\n\t/**\n\t * Constructs a new scene node.\n\t *\n\t * @param {('backgroundBlurriness'|'backgroundIntensity'|'backgroundRotation')} scope - The scope defines the type of scene property that is accessed.\n\t * @param {?Scene} [scene=null] - A reference to the scene.\n\t */\n\tconstructor( scope = SceneNode.BACKGROUND_BLURRINESS, scene = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The scope defines the type of scene property that is accessed.\n\t\t *\n\t\t * @type {('backgroundBlurriness'|'backgroundIntensity'|'backgroundRotation')}\n\t\t */\n\t\tthis.scope = scope;\n\n\t\t/**\n\t\t * A reference to the scene that is going to be accessed.\n\t\t *\n\t\t * @type {?Scene}\n\t\t * @default null\n\t\t */\n\t\tthis.scene = scene;\n\n\t}\n\n\t/**\n\t * Depending on the scope, the method returns a different type of node that represents\n\t * the respective scene property.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {Node} The output node.\n\t */\n\tsetup( builder ) {\n\n\t\tconst scope = this.scope;\n\t\tconst scene = this.scene !== null ? this.scene : builder.scene;\n\n\t\tlet output;\n\n\t\tif ( scope === SceneNode.BACKGROUND_BLURRINESS ) {\n\n\t\t\toutput = reference( 'backgroundBlurriness', 'float', scene );\n\n\t\t} else if ( scope === SceneNode.BACKGROUND_INTENSITY ) {\n\n\t\t\toutput = reference( 'backgroundIntensity', 'float', scene );\n\n\t\t} else if ( scope === SceneNode.BACKGROUND_ROTATION ) {\n\n\t\t\toutput = uniform( 'mat4' ).setName( 'backgroundRotation' ).setGroup( renderGroup ).onRenderUpdate( () => {\n\n\t\t\t\tconst background = scene.background;\n\n\t\t\t\tif ( background !== null && background.isTexture && background.mapping !== UVMapping ) {\n\n\t\t\t\t\t_e1.copy( scene.backgroundRotation );\n\n\t\t\t\t\t// accommodate left-handed frame\n\t\t\t\t\t_e1.x *= -1; _e1.y *= -1; _e1.z *= -1;\n\n\t\t\t\t\t_m1.makeRotationFromEuler( _e1 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t_m1.identity();\n\n\t\t\t\t}\n\n\t\t\t\treturn _m1;\n\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\terror( 'SceneNode: Unknown scope:', scope );\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n}\n\nSceneNode.BACKGROUND_BLURRINESS = 'backgroundBlurriness';\nSceneNode.BACKGROUND_INTENSITY = 'backgroundIntensity';\nSceneNode.BACKGROUND_ROTATION = 'backgroundRotation';\n\n/**\n * TSL object that represents the scene's background blurriness.\n *\n * @tsl\n * @type {SceneNode}\n */\nconst backgroundBlurriness = /*@__PURE__*/ nodeImmutable( SceneNode, SceneNode.BACKGROUND_BLURRINESS );\n\n/**\n * TSL object that represents the scene's background intensity.\n *\n * @tsl\n * @type {SceneNode}\n */\nconst backgroundIntensity = /*@__PURE__*/ nodeImmutable( SceneNode, SceneNode.BACKGROUND_INTENSITY );\n\n/**\n * TSL object that represents the scene's background rotation.\n *\n * @tsl\n * @type {SceneNode}\n */\nconst backgroundRotation = /*@__PURE__*/ nodeImmutable( SceneNode, SceneNode.BACKGROUND_ROTATION );\n\n/**\n * This special version of a texture node can be used to\n * write data into a storage texture with a compute shader.\n *\n * ```js\n * const storageTexture = new THREE.StorageTexture( width, height );\n *\n * const computeTexture = Fn( ( { storageTexture } ) => {\n *\n * \tconst posX = instanceIndex.mod( width );\n * \tconst posY = instanceIndex.div( width );\n * \tconst indexUV = uvec2( posX, posY );\n *\n * \t// generate RGB values\n *\n * \tconst r = 1;\n * \tconst g = 1;\n * \tconst b = 1;\n *\n * \ttextureStore( storageTexture, indexUV, vec4( r, g, b, 1 ) ).toWriteOnly();\n *\n * } );\n *\n * const computeNode = computeTexture( { storageTexture } ).compute( width * height );\n * renderer.computeAsync( computeNode );\n * ```\n *\n * This node can only be used with a WebGPU backend.\n *\n * @augments TextureNode\n */\nclass StorageTextureNode extends TextureNode {\n\n\tstatic get type() {\n\n\t\treturn 'StorageTextureNode';\n\n\t}\n\n\t/**\n\t * Constructs a new storage texture node.\n\t *\n\t * @param {StorageTexture} value - The storage texture.\n\t * @param {Node<vec2|vec3>} uvNode - The uv node.\n\t * @param {?Node} [storeNode=null] - The value node that should be stored in the texture.\n\t */\n\tconstructor( value, uvNode, storeNode = null ) {\n\n\t\tsuper( value, uvNode );\n\n\t\t/**\n\t\t * The value node that should be stored in the texture.\n\t\t *\n\t\t * @type {?Node}\n\t\t * @default null\n\t\t */\n\t\tthis.storeNode = storeNode;\n\n\t\t/**\n\t\t * The mip level to write to for storage textures.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.mipLevel = 0;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isStorageTextureNode = true;\n\n\t\t/**\n\t\t * The access type of the texture node.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'writeOnly'\n\t\t */\n\t\tthis.access = NodeAccess.WRITE_ONLY;\n\n\t}\n\n\t/**\n\t * Overwrites the default implementation to return a fixed value `'storageTexture'`.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The input type.\n\t */\n\tgetInputType( /*builder*/ ) {\n\n\t\treturn 'storageTexture';\n\n\t}\n\n\tsetup( builder ) {\n\n\t\tsuper.setup( builder );\n\n\t\tconst properties = builder.getNodeProperties( this );\n\t\tproperties.storeNode = this.storeNode;\n\n\t\treturn properties;\n\n\t}\n\n\t/**\n\t * Defines the node access.\n\t *\n\t * @param {string} value - The node access.\n\t * @return {StorageTextureNode} A reference to this node.\n\t */\n\tsetAccess( value ) {\n\n\t\tthis.access = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the mip level to write to.\n\t *\n\t * @param {number} level - The mip level.\n\t * @return {StorageTextureNode} A reference to this node.\n\t */\n\tsetMipLevel( level ) {\n\n\t\tthis.mipLevel = level;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Generates the code snippet of the storage node. If no `storeNode`\n\t * is defined, the texture node is generated as normal texture.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @param {string} output - The current output.\n\t * @return {string} The generated code snippet.\n\t */\n\tgenerate( builder, output ) {\n\n\t\tlet snippet;\n\n\t\tif ( this.storeNode !== null ) {\n\n\t\t\tsnippet = this.generateStore( builder );\n\n\t\t} else {\n\n\t\t\tsnippet = super.generate( builder, output );\n\n\t\t}\n\n\t\treturn snippet;\n\n\t}\n\n\t/**\n\t * Convenience method for configuring a read/write node access.\n\t *\n\t * @return {StorageTextureNode} A reference to this node.\n\t */\n\ttoReadWrite() {\n\n\t\treturn this.setAccess( NodeAccess.READ_WRITE );\n\n\t}\n\n\t/**\n\t * Convenience method for configuring a read-only node access.\n\t *\n\t * @return {StorageTextureNode} A reference to this node.\n\t */\n\ttoReadOnly() {\n\n\t\treturn this.setAccess( NodeAccess.READ_ONLY );\n\n\t}\n\n\t/**\n\t * Convenience method for configuring a write-only node access.\n\t *\n\t * @return {StorageTextureNode} A reference to this node.\n\t */\n\ttoWriteOnly() {\n\n\t\treturn this.setAccess( NodeAccess.WRITE_ONLY );\n\n\t}\n\n\t/**\n\t * Generates the code snippet of the storage texture node.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tgenerateStore( builder ) {\n\n\t\tconst properties = builder.getNodeProperties( this );\n\n\t\tconst { uvNode, storeNode, depthNode } = properties;\n\n\t\tconst textureProperty = super.generate( builder, 'property' );\n\t\tconst uvSnippet = uvNode.build( builder, this.value.is3DTexture === true ? 'uvec3' : 'uvec2' );\n\t\tconst storeSnippet = storeNode.build( builder, 'vec4' );\n\t\tconst depthSnippet = depthNode ? depthNode.build( builder, 'int' ) : null;\n\n\t\tconst snippet = builder.generateTextureStore( builder, textureProperty, uvSnippet, depthSnippet, storeSnippet );\n\n\t\tbuilder.addLineFlowCode( snippet, this );\n\n\t}\n\n\tclone() {\n\n\t\tconst newNode = super.clone();\n\t\tnewNode.storeNode = this.storeNode;\n\t\tnewNode.mipLevel = this.mipLevel;\n\t\treturn newNode;\n\n\t}\n\n}\n\n/**\n * TSL function for creating a storage texture node.\n *\n * @tsl\n * @function\n * @param {StorageTexture} value - The storage texture.\n * @param {?Node<vec2|vec3>} uvNode - The uv node.\n * @param {?Node} [storeNode=null] - The value node that should be stored in the texture.\n * @returns {StorageTextureNode}\n */\nconst storageTexture = /*@__PURE__*/ nodeProxy( StorageTextureNode ).setParameterLength( 1, 3 );\n\n\n/**\n * TODO: Explain difference to `storageTexture()`.\n *\n * @tsl\n * @function\n * @param {StorageTexture} value - The storage texture.\n * @param {Node<vec2|vec3>} uvNode - The uv node.\n * @param {?Node} [storeNode=null] - The value node that should be stored in the texture.\n * @returns {StorageTextureNode}\n */\nconst textureStore = ( value, uvNode, storeNode ) => {\n\n\tconst node = storageTexture( value, uvNode, storeNode );\n\n\tif ( storeNode !== null ) node.toStack();\n\n\treturn node;\n\n};\n\nconst normal = Fn( ( { texture, uv } ) => {\n\n\tconst epsilon = 0.0001;\n\n\tconst ret = vec3().toVar();\n\n\tIf( uv.x.lessThan( epsilon ), () => {\n\n\t\tret.assign( vec3( 1, 0, 0 ) );\n\n\t} ).ElseIf( uv.y.lessThan( epsilon ), () => {\n\n\t\tret.assign( vec3( 0, 1, 0 ) );\n\n\t} ).ElseIf( uv.z.lessThan( epsilon ), () => {\n\n\t\tret.assign( vec3( 0, 0, 1 ) );\n\n\t} ).ElseIf( uv.x.greaterThan( 1 - epsilon ), () => {\n\n\t\tret.assign( vec3( -1, 0, 0 ) );\n\n\t} ).ElseIf( uv.y.greaterThan( 1 - epsilon ), () => {\n\n\t\tret.assign( vec3( 0, -1, 0 ) );\n\n\t} ).ElseIf( uv.z.greaterThan( 1 - epsilon ), () => {\n\n\t\tret.assign( vec3( 0, 0, -1 ) );\n\n\t} ).Else( () => {\n\n\t\tconst step = 0.01;\n\n\t\tconst x = texture.sample( uv.add( vec3( - step, 0.0, 0.0 ) ) ).r.sub( texture.sample( uv.add( vec3( step, 0.0, 0.0 ) ) ).r );\n\t\tconst y = texture.sample( uv.add( vec3( 0.0, - step, 0.0 ) ) ).r.sub( texture.sample( uv.add( vec3( 0.0, step, 0.0 ) ) ).r );\n\t\tconst z = texture.sample( uv.add( vec3( 0.0, 0.0, - step ) ) ).r.sub( texture.sample( uv.add( vec3( 0.0, 0.0, step ) ) ).r );\n\n\t\tret.assign( vec3( x, y, z ) );\n\n\t} );\n\n\treturn ret.normalize();\n\n} );\n\n/**\n * This type of uniform node represents a 3D texture.\n *\n * @augments TextureNode\n */\nclass Texture3DNode extends TextureNode {\n\n\tstatic get type() {\n\n\t\treturn 'Texture3DNode';\n\n\t}\n\n\t/**\n\t * Constructs a new 3D texture node.\n\t *\n\t * @param {Data3DTexture} value - The 3D texture.\n\t * @param {?Node<vec2|vec3>} [uvNode=null] - The uv node.\n\t * @param {?Node<int>} [levelNode=null] - The level node.\n\t */\n\tconstructor( value, uvNode = null, levelNode = null ) {\n\n\t\tsuper( value, uvNode, levelNode );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isTexture3DNode = true;\n\n\t}\n\n\t/**\n\t * Overwrites the default implementation to return a fixed value `'texture3D'`.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The input type.\n\t */\n\tgetInputType( /*builder*/ ) {\n\n\t\treturn 'texture3D';\n\n\t}\n\n\t/**\n\t * Returns a default uv node which is in context of 3D textures a three-dimensional\n\t * uv node.\n\t *\n\t * @return {Node<vec3>} The default uv node.\n\t */\n\tgetDefaultUV() {\n\n\t\treturn vec3( 0.5, 0.5, 0.5 );\n\n\t}\n\n\t/**\n\t * Overwritten with an empty implementation since the `updateMatrix` flag is ignored\n\t * for 3D textures. The uv transformation matrix is not applied to 3D textures.\n\t *\n\t * @param {boolean} value - The update toggle.\n\t */\n\tsetUpdateMatrix( /*value*/ ) { } // Ignore .updateMatrix for 3d TextureNode\n\n\t/**\n\t * Overwrites the default implementation to return the unmodified uv node.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @param {Node} uvNode - The uv node to setup.\n\t * @return {Node} The unmodified uv node.\n\t */\n\tsetupUV( builder, uvNode ) {\n\n\t\tconst texture = this.value;\n\n\t\tif ( builder.isFlipY() && ( texture.isRenderTargetTexture === true || texture.isFramebufferTexture === true ) ) {\n\n\t\t\tif ( this.sampler ) {\n\n\t\t\t\tuvNode = uvNode.flipY();\n\n\t\t\t} else {\n\n\t\t\t\tuvNode = uvNode.setY( int( textureSize( this, this.levelNode ).y ).sub( uvNode.y ).sub( 1 ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn uvNode;\n\n\t}\n\n\t/**\n\t * Generates the uv code snippet.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @param {Node} uvNode - The uv node to generate code for.\n\t * @return {string} The generated code snippet.\n\t */\n\tgenerateUV( builder, uvNode ) {\n\n\t\treturn uvNode.build( builder, this.sampler === true ? 'vec3' : 'ivec3' );\n\n\t}\n\n\t/**\n\t * Generates the offset code snippet.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @param {Node} offsetNode - The offset node to generate code for.\n\t * @return {string} The generated code snippet.\n\t */\n\tgenerateOffset( builder, offsetNode ) {\n\n\t\treturn offsetNode.build( builder, 'ivec3' );\n\n\t}\n\n\t/**\n\t * TODO.\n\t *\n\t * @param {Node<vec3>} uvNode - The uv node .\n\t * @return {Node<vec3>} TODO.\n\t */\n\tnormal( uvNode ) {\n\n\t\treturn normal( { texture: this, uv: uvNode } );\n\n\t}\n\n}\n\n/**\n * TSL function for creating a 3D texture node.\n *\n * @tsl\n * @function\n * @param {Data3DTexture} value - The 3D texture.\n * @param {?Node<vec3>} [uvNode=null] - The uv node.\n * @param {?Node<int>} [levelNode=null] - The level node.\n * @returns {Texture3DNode}\n */\nconst texture3D = /*@__PURE__*/ nodeProxy( Texture3DNode ).setParameterLength( 1, 3 );\n\n/**\n * TSL function for creating a texture node that fetches/loads texels without interpolation.\n *\n * @tsl\n * @function\n * @param {?(Texture|TextureNode)} [value=EmptyTexture] - The texture.\n * @param {?Node<vec3>} [uvNode=null] - The uv node.\n * @param {?Node<int>} [levelNode=null] - The level node.\n * @param {?Node<float>} [biasNode=null] - The bias node.\n * @returns {TextureNode}\n */\nconst texture3DLoad = ( ...params ) => texture3D( ...params ).setSampler( false );\n\n/**\n * TSL function for creating a texture node that fetches/loads texels without interpolation.\n *\n * @tsl\n * @function\n * @param {?(Texture|TextureNode)} [value=EmptyTexture] - The texture.\n * @param {?Node<vec3>} [uvNode=null] - The uv node.\n * @param {?Node<int>} [levelNode=null] - The level node.\n * @returns {TextureNode}\n */\nconst texture3DLevel = ( value, uvNode, levelNode ) => texture3D( value, uvNode ).level( levelNode );\n\n/**\n * A special type of reference node that allows to link values in\n * `userData` fields to node objects.\n * ```js\n * sprite.userData.rotation = 1; // stores individual rotation per sprite\n *\n * const material = new THREE.SpriteNodeMaterial();\n * material.rotationNode = userData( 'rotation', 'float' );\n * ```\n * Since `UserDataNode` is extended from {@link ReferenceNode}, the node value\n * will automatically be updated when the `rotation` user data field changes.\n *\n * @augments ReferenceNode\n */\nclass UserDataNode extends ReferenceNode {\n\n\tstatic get type() {\n\n\t\treturn 'UserDataNode';\n\n\t}\n\n\t/**\n\t * Constructs a new user data node.\n\t *\n\t * @param {string} property - The property name that should be referenced by the node.\n\t * @param {string} inputType - The node data type of the reference.\n\t * @param {?Object} [userData=null] - A reference to the `userData` object. If not provided, the `userData` property of the 3D object that uses the node material is evaluated.\n\t */\n\tconstructor( property, inputType, userData = null ) {\n\n\t\tsuper( property, inputType, userData );\n\n\t\t/**\n\t\t * A reference to the `userData` object. If not provided, the `userData`\n\t\t * property of the 3D object that uses the node material is evaluated.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.userData = userData;\n\n\t}\n\n\t/**\n\t * Overwritten to make sure {@link ReferenceNode#reference} points to the correct\n\t * `userData` field.\n\t *\n\t * @param {(NodeFrame|NodeBuilder)} state - The current state to evaluate.\n\t * @return {Object} A reference to the `userData` field.\n\t */\n\tupdateReference( state ) {\n\n\t\tthis.reference = this.userData !== null ? this.userData : state.object.userData;\n\n\t\treturn this.reference;\n\n\t}\n\n}\n\n/**\n * TSL function for creating a user data node.\n *\n * @tsl\n * @function\n * @param {string} name - The property name that should be referenced by the node.\n * @param {string} inputType - The node data type of the reference.\n * @param {?Object} userData - A reference to the `userData` object. If not provided, the `userData` property of the 3D object that uses the node material is evaluated.\n * @returns {UserDataNode}\n */\nconst userData = ( name, inputType, userData ) => new UserDataNode( name, inputType, userData );\n\nconst _objectData = new WeakMap();\n\n/**\n * A node for representing motion or velocity vectors. Foundation\n * for advanced post processing effects like motion blur or TRAA.\n *\n * The node keeps track of the model, view and projection matrices\n * of the previous frame and uses them to compute offsets in NDC space.\n * These offsets represent the final velocity.\n *\n * @augments TempNode\n */\nclass VelocityNode extends TempNode {\n\n\tstatic get type() {\n\n\t\treturn 'VelocityNode';\n\n\t}\n\n\t/**\n\t * Constructs a new vertex color node.\n\t */\n\tconstructor() {\n\n\t\tsuper( 'vec2' );\n\n\t\t/**\n\t\t * The current projection matrix.\n\t\t *\n\t\t * @type {?Matrix4}\n\t\t * @default null\n\t\t */\n\t\tthis.projectionMatrix = null;\n\n\t\t/**\n\t\t * Overwritten since velocity nodes are updated per object.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'object'\n\t\t */\n\t\tthis.updateType = NodeUpdateType.OBJECT;\n\n\t\t/**\n\t\t * Overwritten since velocity nodes save data after the update.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'object'\n\t\t */\n\t\tthis.updateAfterType = NodeUpdateType.OBJECT;\n\n\t\t/**\n\t\t * Uniform node representing the previous model matrix in world space.\n\t\t *\n\t\t * @type {UniformNode<mat4>}\n\t\t * @default null\n\t\t */\n\t\tthis.previousModelWorldMatrix = uniform( new Matrix4() );\n\n\t\t/**\n\t\t * Uniform node representing the previous projection matrix.\n\t\t *\n\t\t * @type {UniformNode<mat4>}\n\t\t * @default null\n\t\t */\n\t\tthis.previousProjectionMatrix = uniform( new Matrix4() ).setGroup( renderGroup );\n\n\t\t/**\n\t\t * Uniform node representing the previous view matrix.\n\t\t *\n\t\t * @type {UniformNode<mat4>}\n\t\t * @default null\n\t\t */\n\t\tthis.previousCameraViewMatrix = uniform( new Matrix4() );\n\n\t}\n\n\t/**\n\t * Sets the given projection matrix.\n\t *\n\t * @param {Matrix4} projectionMatrix - The projection matrix to set.\n\t */\n\tsetProjectionMatrix( projectionMatrix ) {\n\n\t\tthis.projectionMatrix = projectionMatrix;\n\n\t}\n\n\t/**\n\t * Updates velocity specific uniforms.\n\t *\n\t * @param {NodeFrame} frame - A reference to the current node frame.\n\t */\n\tupdate( { frameId, camera, object } ) {\n\n\t\tconst previousModelMatrix = getPreviousMatrix( object );\n\n\t\tthis.previousModelWorldMatrix.value.copy( previousModelMatrix );\n\n\t\t//\n\n\t\tconst cameraData = getData( camera );\n\n\t\tif ( cameraData.frameId !== frameId ) {\n\n\t\t\tcameraData.frameId = frameId;\n\n\t\t\tif ( cameraData.previousProjectionMatrix === undefined ) {\n\n\t\t\t\tcameraData.previousProjectionMatrix = new Matrix4();\n\t\t\t\tcameraData.previousCameraViewMatrix = new Matrix4();\n\n\t\t\t\tcameraData.currentProjectionMatrix = new Matrix4();\n\t\t\t\tcameraData.currentCameraViewMatrix = new Matrix4();\n\n\t\t\t\tcameraData.previousProjectionMatrix.copy( this.projectionMatrix || camera.projectionMatrix );\n\t\t\t\tcameraData.previousCameraViewMatrix.copy( camera.matrixWorldInverse );\n\n\t\t\t} else {\n\n\t\t\t\tcameraData.previousProjectionMatrix.copy( cameraData.currentProjectionMatrix );\n\t\t\t\tcameraData.previousCameraViewMatrix.copy( cameraData.currentCameraViewMatrix );\n\n\t\t\t}\n\n\t\t\tcameraData.currentProjectionMatrix.copy( this.projectionMatrix || camera.projectionMatrix );\n\t\t\tcameraData.currentCameraViewMatrix.copy( camera.matrixWorldInverse );\n\n\t\t\tthis.previousProjectionMatrix.value.copy( cameraData.previousProjectionMatrix );\n\t\t\tthis.previousCameraViewMatrix.value.copy( cameraData.previousCameraViewMatrix );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Overwritten to updated velocity specific uniforms.\n\t *\n\t * @param {NodeFrame} frame - A reference to the current node frame.\n\t */\n\tupdateAfter( { object } ) {\n\n\t\tgetPreviousMatrix( object ).copy( object.matrixWorld );\n\n\t}\n\n\t/**\n\t * Implements the velocity computation based on the previous and current vertex data.\n\t *\n\t * @param {NodeBuilder} builder - A reference to the current node builder.\n\t * @return {Node<vec2>} The motion vector.\n\t */\n\tsetup( /*builder*/ ) {\n\n\t\tconst projectionMatrix = ( this.projectionMatrix === null ) ? cameraProjectionMatrix : uniform( this.projectionMatrix );\n\n\t\tconst previousModelViewMatrix = this.previousCameraViewMatrix.mul( this.previousModelWorldMatrix );\n\n\t\tconst clipPositionCurrent = projectionMatrix.mul( modelViewMatrix ).mul( positionLocal );\n\t\tconst clipPositionPrevious = this.previousProjectionMatrix.mul( previousModelViewMatrix ).mul( positionPrevious );\n\n\t\tconst ndcPositionCurrent = clipPositionCurrent.xy.div( clipPositionCurrent.w );\n\t\tconst ndcPositionPrevious = clipPositionPrevious.xy.div( clipPositionPrevious.w );\n\n\t\tconst velocity = sub( ndcPositionCurrent, ndcPositionPrevious );\n\n\t\treturn velocity;\n\n\t}\n\n}\n\nfunction getData( object ) {\n\n\tlet objectData = _objectData.get( object );\n\n\tif ( objectData === undefined ) {\n\n\t\tobjectData = {};\n\t\t_objectData.set( object, objectData );\n\n\t}\n\n\treturn objectData;\n\n}\n\nfunction getPreviousMatrix( object, index = 0 ) {\n\n\tconst objectData = getData( object );\n\n\tlet matrix = objectData[ index ];\n\n\tif ( matrix === undefined ) {\n\n\t\tobjectData[ index ] = matrix = new Matrix4();\n\t\tobjectData[ index ].copy( object.matrixWorld );\n\n\t}\n\n\treturn matrix;\n\n}\n\n/**\n * TSL object that represents the velocity of a render pass.\n *\n * @tsl\n * @type {VelocityNode}\n */\nconst velocity = /*@__PURE__*/ nodeImmutable( VelocityNode );\n\n/**\n * Computes a grayscale value for the given RGB color value.\n *\n * @tsl\n * @function\n * @param {Node<vec3>} color - The color value to compute the grayscale for.\n * @return {Node<vec3>} The grayscale color.\n */\nconst grayscale = /*@__PURE__*/ Fn( ( [ color ] ) => {\n\n\treturn luminance( color.rgb );\n\n} );\n\n/**\n * Super-saturates or desaturates the given RGB color.\n *\n * @tsl\n * @function\n * @param {Node<vec3>} color - The input color.\n * @param {Node<float>} [adjustment=1] - Specifies the amount of the conversion. A value under `1` desaturates the color, a value over `1` super-saturates it.\n * @return {Node<vec3>} The saturated color.\n */\nconst saturation = /*@__PURE__*/ Fn( ( [ color, adjustment = float( 1 ) ] ) => {\n\n\treturn adjustment.mix( luminance( color.rgb ), color.rgb );\n\n} );\n\n/**\n * Selectively enhance the intensity of less saturated RGB colors. Can result\n * in a more natural and visually appealing image with enhanced color depth\n * compared to {@link ColorAdjustment#saturation}.\n *\n * @tsl\n * @function\n * @param {Node<vec3>} color - The input color.\n * @param {Node<float>} [adjustment=1] - Controls the intensity of the vibrance effect.\n * @return {Node<vec3>} The updated color.\n */\nconst vibrance = /*@__PURE__*/ Fn( ( [ color, adjustment = float( 1 ) ] ) => {\n\n\tconst average = add( color.r, color.g, color.b ).div( 3.0 );\n\n\tconst mx = color.r.max( color.g.max( color.b ) );\n\tconst amt = mx.sub( average ).mul( adjustment ).mul( -3 );\n\n\treturn mix( color.rgb, mx, amt );\n\n} );\n\n/**\n * Updates the hue component of the given RGB color while preserving its luminance and saturation.\n *\n * @tsl\n * @function\n * @param {Node<vec3>} color - The input color.\n * @param {Node<float>} [adjustment=1] - Defines the degree of hue rotation in radians. A positive value rotates the hue clockwise, while a negative value rotates it counterclockwise.\n * @return {Node<vec3>} The updated color.\n */\nconst hue = /*@__PURE__*/ Fn( ( [ color, adjustment = float( 1 ) ] ) => {\n\n\tconst k = vec3( 0.57735, 0.57735, 0.57735 );\n\n\tconst cosAngle = adjustment.cos();\n\n\treturn vec3( color.rgb.mul( cosAngle ).add( k.cross( color.rgb ).mul( adjustment.sin() ).add( k.mul( dot( k, color.rgb ).mul( cosAngle.oneMinus() ) ) ) ) );\n\n} );\n\n/**\n * Computes the luminance for the given RGB color value.\n *\n * @tsl\n * @function\n * @param {Node<vec3>} color - The color value to compute the luminance for.\n * @param {?Node<vec3>} luminanceCoefficients - The luminance coefficients. By default predefined values of the current working color space are used.\n * @return {Node<float>} The luminance.\n */\nconst luminance = (\n\tcolor,\n\tluminanceCoefficients = vec3( ColorManagement.getLuminanceCoefficients( new Vector3() ) )\n) => dot( color, luminanceCoefficients );\n\n/**\n * Color Decision List (CDL) v1.2\n *\n * Compact representation of color grading information, defined by slope, offset, power, and\n * saturation. The CDL should be typically be given input in a log space (such as LogC, ACEScc,\n * or AgX Log), and will return output in the same space. Output may require clamping >=0.\n *\n * @tsl\n * @function\n * @param {Node<vec4>} color Input (-Infinity < input < +Infinity)\n * @param {Node<vec3>} slope Slope (0 \u2264 slope < +Infinity)\n * @param {Node<vec3>} offset Offset (-Infinity < offset < +Infinity; typically -1 < offset < 1)\n * @param {Node<vec3>} power Power (0 < power < +Infinity)\n * @param {Node<float>} saturation Saturation (0 \u2264 saturation < +Infinity; typically 0 \u2264 saturation < 4)\n * @param {Node<vec3>} luminanceCoefficients Luminance coefficients for saturation term, typically Rec. 709\n * @return {Node<vec4>} Output, -Infinity < output < +Infinity\n *\n * References:\n * - ASC CDL v1.2\n * - {@link https://blender.stackexchange.com/a/55239/43930}\n * - {@link https://docs.acescentral.com/specifications/acescc/}\n */\nconst cdl = /*@__PURE__*/ Fn( ( [\n\tcolor,\n\tslope = vec3( 1 ),\n\toffset = vec3( 0 ),\n\tpower = vec3( 1 ),\n\tsaturation = float( 1 ),\n\t// ASC CDL v1.2 explicitly requires Rec. 709 luminance coefficients.\n\tluminanceCoefficients = vec3( ColorManagement.getLuminanceCoefficients( new Vector3(), LinearSRGBColorSpace ) )\n] ) => {\n\n\t// NOTE: The ASC CDL v1.2 defines a [0, 1] clamp on the slope+offset term, and another on the\n\t// saturation term. Per the ACEScc specification and Filament, limits may be omitted to support\n\t// values outside [0, 1], requiring a workaround for negative values in the power expression.\n\n\tconst luma = color.rgb.dot( vec3( luminanceCoefficients ) );\n\n\tconst v = max$1( color.rgb.mul( slope ).add( offset ), 0.0 ).toVar();\n\tconst pv = v.pow( power ).toVar();\n\n\tIf( v.r.greaterThan( 0.0 ), () => { v.r.assign( pv.r ); } ); // eslint-disable-line\n\tIf( v.g.greaterThan( 0.0 ), () => { v.g.assign( pv.g ); } ); // eslint-disable-line\n\tIf( v.b.greaterThan( 0.0 ), () => { v.b.assign( pv.b ); } ); // eslint-disable-line\n\n\tv.assign( luma.add( v.sub( luma ).mul( saturation ) ) );\n\n\treturn vec4( v.rgb, color.a );\n\n} );\n\n/**\n * Represents a posterize effect which reduces the number of colors\n * in an image, resulting in a more blocky and stylized appearance.\n *\n * @augments TempNode\n */\nclass PosterizeNode extends TempNode {\n\n\tstatic get type() {\n\n\t\treturn 'PosterizeNode';\n\n\t}\n\n\t/**\n\t * Constructs a new posterize node.\n\t *\n\t * @param {Node} sourceNode - The input color.\n\t * @param {Node} stepsNode - Controls the intensity of the posterization effect. A lower number results in a more blocky appearance.\n\t */\n\tconstructor( sourceNode, stepsNode ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The input color.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.sourceNode = sourceNode;\n\n\t\t/**\n\t\t * Controls the intensity of the posterization effect. A lower number results in a more blocky appearance.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.stepsNode = stepsNode;\n\n\t}\n\n\tsetup() {\n\n\t\tconst { sourceNode, stepsNode } = this;\n\n\t\treturn sourceNode.mul( stepsNode ).floor().div( stepsNode );\n\n\t}\n\n}\n\n/**\n * TSL function for creating a posterize node.\n *\n * @tsl\n * @function\n * @param {Node} sourceNode - The input color.\n * @param {Node} stepsNode - Controls the intensity of the posterization effect. A lower number results in a more blocky appearance.\n * @returns {PosterizeNode}\n */\nconst posterize = /*@__PURE__*/ nodeProxy( PosterizeNode ).setParameterLength( 2 );\n\nconst _size = /*@__PURE__*/ new Vector2();\n\n/**\n * Represents the texture of a pass node.\n *\n * @augments TextureNode\n */\nclass PassTextureNode extends TextureNode {\n\n\tstatic get type() {\n\n\t\treturn 'PassTextureNode';\n\n\t}\n\n\t/**\n\t * Constructs a new pass texture node.\n\t *\n\t * @param {PassNode} passNode - The pass node.\n\t * @param {Texture} texture - The output texture.\n\t */\n\tconstructor( passNode, texture ) {\n\n\t\tsuper( texture );\n\n\t\t/**\n\t\t * A reference to the pass node.\n\t\t *\n\t\t * @type {PassNode}\n\t\t */\n\t\tthis.passNode = passNode;\n\n\t\tthis.setUpdateMatrix( false );\n\n\t}\n\n\tsetup( builder ) {\n\n\t\tthis.passNode.build( builder );\n\n\t\treturn super.setup( builder );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.passNode, this.value );\n\n\t}\n\n}\n\n/**\n * An extension of `PassTextureNode` which allows to manage more than one\n * internal texture. Relevant for the `getPreviousTexture()` related API.\n *\n * @augments PassTextureNode\n */\nclass PassMultipleTextureNode extends PassTextureNode {\n\n\tstatic get type() {\n\n\t\treturn 'PassMultipleTextureNode';\n\n\t}\n\n\t/**\n\t * Constructs a new pass texture node.\n\t *\n\t * @param {PassNode} passNode - The pass node.\n\t * @param {string} textureName - The output texture name.\n\t * @param {boolean} [previousTexture=false] - Whether previous frame data should be used or not.\n\t */\n\tconstructor( passNode, textureName, previousTexture = false ) {\n\n\t\t// null is passed to the super call since this class does not\n\t\t// use an external texture for rendering pass data into. Instead\n\t\t// the texture is managed by the pass node itself\n\n\t\tsuper( passNode, null );\n\n\t\t/**\n\t\t * The output texture name.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.textureName = textureName;\n\n\t\t/**\n\t\t * Whether previous frame data should be used or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.previousTexture = previousTexture;\n\n\t}\n\n\t/**\n\t * Updates the texture reference of this node.\n\t */\n\tupdateTexture() {\n\n\t\tthis.value = this.previousTexture ? this.passNode.getPreviousTexture( this.textureName ) : this.passNode.getTexture( this.textureName );\n\n\t}\n\n\tsetup( builder ) {\n\n\t\tthis.updateTexture();\n\n\t\treturn super.setup( builder );\n\n\t}\n\n\tclone() {\n\n\t\tconst newNode = new this.constructor( this.passNode, this.textureName, this.previousTexture );\n\t\tnewNode.uvNode = this.uvNode;\n\t\tnewNode.levelNode = this.levelNode;\n\t\tnewNode.biasNode = this.biasNode;\n\t\tnewNode.sampler = this.sampler;\n\t\tnewNode.depthNode = this.depthNode;\n\t\tnewNode.compareNode = this.compareNode;\n\t\tnewNode.gradNode = this.gradNode;\n\t\tnewNode.offsetNode = this.offsetNode;\n\n\t\treturn newNode;\n\n\t}\n\n}\n\n/**\n * Represents a render pass (sometimes called beauty pass) in context of post processing.\n * This pass produces a render for the given scene and camera and can provide multiple outputs\n * via MRT for further processing.\n *\n * ```js\n * const postProcessing = new PostProcessing( renderer );\n *\n * const scenePass = pass( scene, camera );\n *\n * postProcessing.outputNode = scenePass;\n * ```\n *\n * @augments TempNode\n */\nclass PassNode extends TempNode {\n\n\tstatic get type() {\n\n\t\treturn 'PassNode';\n\n\t}\n\n\t/**\n\t * Constructs a new pass node.\n\t *\n\t * @param {('color'|'depth')} scope - The scope of the pass. The scope determines whether the node outputs color or depth.\n\t * @param {Scene} scene - A reference to the scene.\n\t * @param {Camera} camera - A reference to the camera.\n\t * @param {Object} options - Options for the internal render target.\n\t */\n\tconstructor( scope, scene, camera, options = {} ) {\n\n\t\tsuper( 'vec4' );\n\n\t\t/**\n\t\t * The scope of the pass. The scope determines whether the node outputs color or depth.\n\t\t *\n\t\t * @type {('color'|'depth')}\n\t\t */\n\t\tthis.scope = scope;\n\n\t\t/**\n\t\t * A reference to the scene.\n\t\t *\n\t\t * @type {Scene}\n\t\t */\n\t\tthis.scene = scene;\n\n\t\t/**\n\t\t * A reference to the camera.\n\t\t *\n\t\t * @type {Camera}\n\t\t */\n\t\tthis.camera = camera;\n\n\t\t/**\n\t\t * Options for the internal render target.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.options = options;\n\n\t\t/**\n\t\t * The pass's pixel ratio. Will be kept automatically kept in sync with the renderer's pixel ratio.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis._pixelRatio = 1;\n\n\t\t/**\n\t\t * The pass's pixel width. Will be kept automatically kept in sync with the renderer's width.\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis._width = 1;\n\n\t\t/**\n\t\t * The pass's pixel height. Will be kept automatically kept in sync with the renderer's height.\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis._height = 1;\n\n\t\tconst depthTexture = new DepthTexture();\n\t\tdepthTexture.isRenderTargetTexture = true;\n\t\t//depthTexture.type = FloatType;\n\t\tdepthTexture.name = 'depth';\n\n\t\tconst renderTarget = new RenderTarget( this._width * this._pixelRatio, this._height * this._pixelRatio, { type: HalfFloatType, ...options, } );\n\t\trenderTarget.texture.name = 'output';\n\t\trenderTarget.depthTexture = depthTexture;\n\n\t\t/**\n\t\t * The pass's render target.\n\t\t *\n\t\t * @type {RenderTarget}\n\t\t */\n\t\tthis.renderTarget = renderTarget;\n\n\t\t/**\n\t\t * An optional override material for the pass.\n\t\t *\n\t\t * @type {Material|null}\n\t\t */\n\t\tthis.overrideMaterial = null;\n\n\t\t/**\n\t\t * Whether the pass is transparent.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.transparent = true;\n\n\t\t/**\n\t\t * Whether the pass is opaque.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.opaque = true;\n\n\t\t/**\n\t\t * An optional global context for the pass.\n\t\t *\n\t\t * @type {ContextNode|null}\n\t\t */\n\t\tthis.contextNode = null;\n\n\t\t/**\n\t\t * A cache for the context node.\n\t\t *\n\t\t * @private\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis._contextNodeCache = null;\n\n\t\t/**\n\t\t * A dictionary holding the internal result textures.\n\t\t *\n\t\t * @private\n\t\t * @type {Object<string, Texture>}\n\t\t */\n\t\tthis._textures = {\n\t\t\toutput: renderTarget.texture,\n\t\t\tdepth: depthTexture\n\t\t};\n\n\t\t/**\n\t\t * A dictionary holding the internal texture nodes.\n\t\t *\n\t\t * @private\n\t\t * @type {Object<string, TextureNode>}\n\t\t */\n\t\tthis._textureNodes = {};\n\n\t\t/**\n\t\t * A dictionary holding the internal depth nodes.\n\t\t *\n\t\t * @private\n\t\t * @type {Object}\n\t\t */\n\t\tthis._linearDepthNodes = {};\n\n\t\t/**\n\t\t * A dictionary holding the internal viewZ nodes.\n\t\t *\n\t\t * @private\n\t\t * @type {Object}\n\t\t */\n\t\tthis._viewZNodes = {};\n\n\t\t/**\n\t\t * A dictionary holding the texture data of the previous frame.\n\t\t * Used for computing velocity/motion vectors.\n\t\t *\n\t\t * @private\n\t\t * @type {Object<string, Texture>}\n\t\t */\n\t\tthis._previousTextures = {};\n\n\t\t/**\n\t\t * A dictionary holding the texture nodes of the previous frame.\n\t\t * Used for computing velocity/motion vectors.\n\t\t *\n\t\t * @private\n\t\t * @type {Object<string, TextureNode>}\n\t\t */\n\t\tthis._previousTextureNodes = {};\n\n\t\t/**\n\t\t * The `near` property of the camera as a uniform.\n\t\t *\n\t\t * @private\n\t\t * @type {UniformNode}\n\t\t */\n\t\tthis._cameraNear = uniform( 0 );\n\n\t\t/**\n\t\t * The `far` property of the camera as a uniform.\n\t\t *\n\t\t * @private\n\t\t * @type {UniformNode}\n\t\t */\n\t\tthis._cameraFar = uniform( 0 );\n\n\t\t/**\n\t\t * A MRT node configuring the MRT settings.\n\t\t *\n\t\t * @private\n\t\t * @type {?MRTNode}\n\t\t * @default null\n\t\t */\n\t\tthis._mrt = null;\n\n\t\t/**\n\t\t * Layer object for configuring the camera that is used\n\t\t * to produce the pass.\n\t\t *\n\t\t * @private\n\t\t * @type {?Layers}\n\t\t * @default null\n\t\t */\n\t\tthis._layers = null;\n\n\t\t/**\n\t\t * Scales the resolution of the internal render target.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis._resolutionScale = 1;\n\n\t\t/**\n\t\t * Custom viewport definition.\n\t\t *\n\t\t * @private\n\t\t * @type {?Vector4}\n\t\t * @default null\n\t\t */\n\t\tthis._viewport = null;\n\n\t\t/**\n\t\t * Custom scissor definition.\n\t\t *\n\t\t * @private\n\t\t * @type {?Vector4}\n\t\t * @default null\n\t\t */\n\t\tthis._scissor = null;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isPassNode = true;\n\n\t\t/**\n\t\t * The `updateBeforeType` is set to `NodeUpdateType.FRAME` since the node renders the\n\t\t * scene once per frame in its {@link PassNode#updateBefore} method.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'frame'\n\t\t */\n\t\tthis.updateBeforeType = NodeUpdateType.FRAME;\n\n\t\t/**\n\t\t * This flag is used for global cache.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.global = true;\n\n\t}\n\n\t/**\n\t * Sets the resolution scale for the pass.\n\t * The resolution scale is a factor that is multiplied with the renderer's width and height.\n\t *\n\t * @param {number} resolutionScale - The resolution scale to set. A value of `1` means full resolution.\n\t * @return {PassNode} A reference to this pass.\n\t */\n\tsetResolutionScale( resolutionScale ) {\n\n\t\tthis._resolutionScale = resolutionScale;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Gets the current resolution scale of the pass.\n\t *\n\t * @return {number} The current resolution scale. A value of `1` means full resolution.\n\t */\n\tgetResolutionScale() {\n\n\t\treturn this._resolutionScale;\n\n\t}\n\n\t/**\n\t * Sets the resolution for the pass.\n\t * The resolution is a factor that is multiplied with the renderer's width and height.\n\t *\n\t * @param {number} resolution - The resolution to set. A value of `1` means full resolution.\n\t * @return {PassNode} A reference to this pass.\n\t * @deprecated since r181. Use {@link PassNode#setResolutionScale `setResolutionScale()`} instead.\n\t */\n\tsetResolution( resolution ) { // @deprecated, r181\n\n\t\twarn( 'PassNode: .setResolution() is deprecated. Use .setResolutionScale() instead.' );\n\n\t\treturn this.setResolutionScale( resolution );\n\n\t}\n\n\t/**\n\t * Gets the current resolution of the pass.\n\t *\n\t * @return {number} The current resolution. A value of `1` means full resolution.\n\t * @deprecated since r181. Use {@link PassNode#getResolutionScale `getResolutionScale()`} instead.\n\t */\n\tgetResolution() { // @deprecated, r181\n\n\t\twarn( 'PassNode: .getResolution() is deprecated. Use .getResolutionScale() instead.' );\n\n\t\treturn this.getResolutionScale();\n\n\t}\n\n\t/**\n\t * Sets the layer configuration that should be used when rendering the pass.\n\t *\n\t * @param {Layers} layers - The layers object to set.\n\t * @return {PassNode} A reference to this pass.\n\t */\n\tsetLayers( layers ) {\n\n\t\tthis._layers = layers;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Gets the current layer configuration of the pass.\n\t *\n\t * @return {?Layers} .\n\t */\n\tgetLayers() {\n\n\t\treturn this._layers;\n\n\t}\n\n\t/**\n\t * Sets the given MRT node to setup MRT for this pass.\n\t *\n\t * @param {MRTNode} mrt - The MRT object.\n\t * @return {PassNode} A reference to this pass.\n\t */\n\tsetMRT( mrt ) {\n\n\t\tthis._mrt = mrt;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the current MRT node.\n\t *\n\t * @return {MRTNode} The current MRT node.\n\t */\n\tgetMRT() {\n\n\t\treturn this._mrt;\n\n\t}\n\n\t/**\n\t * Returns the texture for the given output name.\n\t *\n\t * @param {string} name - The output name to get the texture for.\n\t * @return {Texture} The texture.\n\t */\n\tgetTexture( name ) {\n\n\t\tlet texture = this._textures[ name ];\n\n\t\tif ( texture === undefined ) {\n\n\t\t\tconst refTexture = this.renderTarget.texture;\n\n\t\t\ttexture = refTexture.clone();\n\t\t\ttexture.name = name;\n\n\t\t\tthis._textures[ name ] = texture;\n\n\t\t\tthis.renderTarget.textures.push( texture );\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\t/**\n\t * Returns the texture holding the data of the previous frame for the given output name.\n\t *\n\t * @param {string} name - The output name to get the texture for.\n\t * @return {Texture} The texture holding the data of the previous frame.\n\t */\n\tgetPreviousTexture( name ) {\n\n\t\tlet texture = this._previousTextures[ name ];\n\n\t\tif ( texture === undefined ) {\n\n\t\t\ttexture = this.getTexture( name ).clone();\n\n\t\t\tthis._previousTextures[ name ] = texture;\n\n\t\t}\n\n\t\treturn texture;\n\n\t}\n\n\t/**\n\t * Switches current and previous textures for the given output name.\n\t *\n\t * @param {string} name - The output name.\n\t */\n\ttoggleTexture( name ) {\n\n\t\tconst prevTexture = this._previousTextures[ name ];\n\n\t\tif ( prevTexture !== undefined ) {\n\n\t\t\tconst texture = this._textures[ name ];\n\n\t\t\tconst index = this.renderTarget.textures.indexOf( texture );\n\t\t\tthis.renderTarget.textures[ index ] = prevTexture;\n\n\t\t\tthis._textures[ name ] = prevTexture;\n\t\t\tthis._previousTextures[ name ] = texture;\n\n\t\t\tthis._textureNodes[ name ].updateTexture();\n\t\t\tthis._previousTextureNodes[ name ].updateTexture();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the texture node for the given output name.\n\t *\n\t * @param {string} [name='output'] - The output name to get the texture node for.\n\t * @return {TextureNode} The texture node.\n\t */\n\tgetTextureNode( name = 'output' ) {\n\n\t\tlet textureNode = this._textureNodes[ name ];\n\n\t\tif ( textureNode === undefined ) {\n\n\t\t\ttextureNode = new PassMultipleTextureNode( this, name );\n\t\t\ttextureNode.updateTexture();\n\t\t\tthis._textureNodes[ name ] = textureNode;\n\n\t\t}\n\n\t\treturn textureNode;\n\n\t}\n\n\t/**\n\t * Returns the previous texture node for the given output name.\n\t *\n\t * @param {string} [name='output'] - The output name to get the previous texture node for.\n\t * @return {TextureNode} The previous texture node.\n\t */\n\tgetPreviousTextureNode( name = 'output' ) {\n\n\t\tlet textureNode = this._previousTextureNodes[ name ];\n\n\t\tif ( textureNode === undefined ) {\n\n\t\t\tif ( this._textureNodes[ name ] === undefined ) this.getTextureNode( name );\n\n\t\t\ttextureNode = new PassMultipleTextureNode( this, name, true );\n\t\t\ttextureNode.updateTexture();\n\t\t\tthis._previousTextureNodes[ name ] = textureNode;\n\n\t\t}\n\n\t\treturn textureNode;\n\n\t}\n\n\t/**\n\t * Returns a viewZ node of this pass.\n\t *\n\t * @param {string} [name='depth'] - The output name to get the viewZ node for. In most cases the default `'depth'` can be used however the parameter exists for custom depth outputs.\n\t * @return {Node} The viewZ node.\n\t */\n\tgetViewZNode( name = 'depth' ) {\n\n\t\tlet viewZNode = this._viewZNodes[ name ];\n\n\t\tif ( viewZNode === undefined ) {\n\n\t\t\tconst cameraNear = this._cameraNear;\n\t\t\tconst cameraFar = this._cameraFar;\n\n\t\t\tthis._viewZNodes[ name ] = viewZNode = perspectiveDepthToViewZ( this.getTextureNode( name ), cameraNear, cameraFar );\n\n\t\t}\n\n\t\treturn viewZNode;\n\n\t}\n\n\t/**\n\t * Returns a linear depth node of this pass.\n\t *\n\t * @param {string} [name='depth'] - The output name to get the linear depth node for. In most cases the default `'depth'` can be used however the parameter exists for custom depth outputs.\n\t * @return {Node} The linear depth node.\n\t */\n\tgetLinearDepthNode( name = 'depth' ) {\n\n\t\tlet linearDepthNode = this._linearDepthNodes[ name ];\n\n\t\tif ( linearDepthNode === undefined ) {\n\n\t\t\tconst cameraNear = this._cameraNear;\n\t\t\tconst cameraFar = this._cameraFar;\n\t\t\tconst viewZNode = this.getViewZNode( name );\n\n\t\t\t// TODO: just if ( builder.camera.isPerspectiveCamera )\n\n\t\t\tthis._linearDepthNodes[ name ] = linearDepthNode = viewZToOrthographicDepth( viewZNode, cameraNear, cameraFar );\n\n\t\t}\n\n\t\treturn linearDepthNode;\n\n\t}\n\n\t/**\n\t * Precompiles the pass.\n\t *\n\t * Note that this method must be called after the pass configuration is complete.\n\t * So calls like `setMRT()` and `getTextureNode()` must proceed the precompilation.\n\t *\n\t * @async\n\t * @param {Renderer} renderer - The renderer.\n\t * @return {Promise} A Promise that resolves when the compile has been finished.\n\t * @see {@link Renderer#compileAsync}\n\t */\n\tasync compileAsync( renderer ) {\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst currentMRT = renderer.getMRT();\n\n\t\trenderer.setRenderTarget( this.renderTarget );\n\t\trenderer.setMRT( this._mrt );\n\n\t\tawait renderer.compileAsync( this.scene, this.camera );\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\t\trenderer.setMRT( currentMRT );\n\n\t}\n\n\tsetup( { renderer } ) {\n\n\t\tthis.renderTarget.samples = this.options.samples === undefined ? renderer.samples : this.options.samples;\n\n\t\tthis.renderTarget.texture.type = renderer.getOutputBufferType();\n\n\t\treturn this.scope === PassNode.COLOR ? this.getTextureNode() : this.getLinearDepthNode();\n\n\t}\n\n\tupdateBefore( frame ) {\n\n\t\tconst { renderer } = frame;\n\t\tconst { scene } = this;\n\n\t\tlet camera;\n\t\tlet pixelRatio;\n\n\t\tconst outputRenderTarget = renderer.getOutputRenderTarget();\n\n\t\tif ( outputRenderTarget && outputRenderTarget.isXRRenderTarget === true ) {\n\n\t\t\tpixelRatio = 1;\n\t\t\tcamera = renderer.xr.getCamera();\n\n\t\t\trenderer.xr.updateCamera( camera );\n\n\t\t\t_size.set( outputRenderTarget.width, outputRenderTarget.height );\n\n\t\t} else {\n\n\t\t\tcamera = this.camera;\n\t\t\tpixelRatio = renderer.getPixelRatio();\n\n\t\t\trenderer.getSize( _size );\n\n\t\t}\n\n\t\tthis._pixelRatio = pixelRatio;\n\n\t\tthis.setSize( _size.width, _size.height );\n\n\t\tconst currentRenderTarget = renderer.getRenderTarget();\n\t\tconst currentMRT = renderer.getMRT();\n\t\tconst currentAutoClear = renderer.autoClear;\n\t\tconst currentTransparent = renderer.transparent;\n\t\tconst currentOpaque = renderer.opaque;\n\t\tconst currentMask = camera.layers.mask;\n\t\tconst currentContextNode = renderer.contextNode;\n\t\tconst currentOverrideMaterial = scene.overrideMaterial;\n\n\t\tthis._cameraNear.value = camera.near;\n\t\tthis._cameraFar.value = camera.far;\n\n\t\tif ( this._layers !== null ) {\n\n\t\t\tcamera.layers.mask = this._layers.mask;\n\n\t\t}\n\n\t\tfor ( const name in this._previousTextures ) {\n\n\t\t\tthis.toggleTexture( name );\n\n\t\t}\n\n\t\tif ( this.overrideMaterial !== null ) {\n\n\t\t\tscene.overrideMaterial = this.overrideMaterial;\n\n\t\t}\n\n\t\trenderer.setRenderTarget( this.renderTarget );\n\t\trenderer.setMRT( this._mrt );\n\t\trenderer.autoClear = true;\n\t\trenderer.transparent = this.transparent;\n\t\trenderer.opaque = this.opaque;\n\n\t\tif ( this.contextNode !== null ) {\n\n\t\t\tif ( this._contextNodeCache === null || this._contextNodeCache.version !== this.version ) {\n\n\t\t\t\tthis._contextNodeCache = {\n\t\t\t\t\tversion: this.version,\n\t\t\t\t\tcontext: context( { ...renderer.contextNode.getFlowContextData(), ...this.contextNode.getFlowContextData() } )\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\trenderer.contextNode = this._contextNodeCache.context;\n\n\t\t}\n\n\t\tconst currentSceneName = scene.name;\n\n\t\tscene.name = this.name ? this.name : scene.name;\n\n\t\trenderer.render( scene, camera );\n\n\t\tscene.name = currentSceneName;\n\t\tscene.overrideMaterial = currentOverrideMaterial;\n\n\t\trenderer.setRenderTarget( currentRenderTarget );\n\t\trenderer.setMRT( currentMRT );\n\t\trenderer.autoClear = currentAutoClear;\n\t\trenderer.transparent = currentTransparent;\n\t\trenderer.opaque = currentOpaque;\n\t\trenderer.contextNode = currentContextNode;\n\n\t\tcamera.layers.mask = currentMask;\n\n\t}\n\n\t/**\n\t * Sets the size of the pass's render target. Honors the pixel ratio.\n\t *\n\t * @param {number} width - The width to set.\n\t * @param {number} height - The height to set.\n\t */\n\tsetSize( width, height ) {\n\n\t\tthis._width = width;\n\t\tthis._height = height;\n\n\t\tconst effectiveWidth = Math.floor( this._width * this._pixelRatio * this._resolutionScale );\n\t\tconst effectiveHeight = Math.floor( this._height * this._pixelRatio * this._resolutionScale );\n\n\t\tthis.renderTarget.setSize( effectiveWidth, effectiveHeight );\n\n\t\tif ( this._scissor !== null ) this.renderTarget.scissor.copy( this._scissor );\n\t\tif ( this._viewport !== null ) this.renderTarget.viewport.copy( this._viewport );\n\n\t}\n\n\t/**\n\t * This method allows to define the pass's scissor rectangle. By default, the scissor rectangle is kept\n\t * in sync with the pass's dimensions. To reverse the process and use auto-sizing again, call the method\n\t * with `null` as the single argument.\n\t *\n\t * @param {?(number | Vector4)} x - The horizontal coordinate for the lower left corner of the box in logical pixel unit.\n\t * Instead of passing four arguments, the method also works with a single four-dimensional vector.\n\t * @param {number} y - The vertical coordinate for the lower left corner of the box in logical pixel unit.\n\t * @param {number} width - The width of the scissor box in logical pixel unit.\n\t * @param {number} height - The height of the scissor box in logical pixel unit.\n\t */\n\tsetScissor( x, y, width, height ) {\n\n\t\tif ( x === null ) {\n\n\t\t\tthis._scissor = null;\n\n\t\t} else {\n\n\t\t\tif ( this._scissor === null ) this._scissor = new Vector4();\n\n\t\t\tif ( x.isVector4 ) {\n\n\t\t\t\tthis._scissor.copy( x );\n\n\t\t\t} else {\n\n\t\t\t\tthis._scissor.set( x, y, width, height );\n\n\t\t\t}\n\n\t\t\tthis._scissor.multiplyScalar( this._pixelRatio * this._resolutionScale ).floor();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * This method allows to define the pass's viewport. By default, the viewport is kept in sync\n\t * with the pass's dimensions. To reverse the process and use auto-sizing again, call the method\n\t * with `null` as the single argument.\n\t *\n\t * @param {number | Vector4} x - The horizontal coordinate for the lower left corner of the viewport origin in logical pixel unit.\n\t * @param {number} y - The vertical coordinate for the lower left corner of the viewport origin  in logical pixel unit.\n\t * @param {number} width - The width of the viewport in logical pixel unit.\n\t * @param {number} height - The height of the viewport in logical pixel unit.\n\t */\n\tsetViewport( x, y, width, height ) {\n\n\t\tif ( x === null ) {\n\n\t\t\tthis._viewport = null;\n\n\t\t} else {\n\n\t\t\tif ( this._viewport === null ) this._viewport = new Vector4();\n\n\t\t\tif ( x.isVector4 ) {\n\n\t\t\t\tthis._viewport.copy( x );\n\n\t\t\t} else {\n\n\t\t\t\tthis._viewport.set( x, y, width, height );\n\n\t\t\t}\n\n\t\t\tthis._viewport.multiplyScalar( this._pixelRatio * this._resolutionScale ).floor();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Sets the pixel ratio the pass's render target and updates the size.\n\t *\n\t * @param {number} pixelRatio - The pixel ratio to set.\n\t */\n\tsetPixelRatio( pixelRatio ) {\n\n\t\tthis._pixelRatio = pixelRatio;\n\n\t\tthis.setSize( this._width, this._height );\n\n\t}\n\n\t/**\n\t * Frees internal resources. Should be called when the node is no longer in use.\n\t */\n\tdispose() {\n\n\t\tthis.renderTarget.dispose();\n\n\t}\n\n\n}\n\n/**\n * @static\n * @type {'color'}\n * @default 'color'\n */\nPassNode.COLOR = 'color';\n\n/**\n * @static\n * @type {'depth'}\n * @default 'depth'\n */\nPassNode.DEPTH = 'depth';\n\n/**\n * TSL function for creating a pass node.\n *\n * @tsl\n * @function\n * @param {Scene} scene - A reference to the scene.\n * @param {Camera} camera - A reference to the camera.\n * @param {Object} options - Options for the internal render target.\n * @returns {PassNode}\n */\nconst pass = ( scene, camera, options ) => new PassNode( PassNode.COLOR, scene, camera, options );\n\n/**\n * TSL function for creating a pass texture node.\n *\n * @tsl\n * @function\n * @param {PassNode} pass - The pass node.\n * @param {Texture} texture - The output texture.\n * @returns {PassTextureNode}\n */\nconst passTexture = ( pass, texture ) => new PassTextureNode( pass, texture );\n\n/**\n * TSL function for creating a depth pass node.\n *\n * @tsl\n * @function\n * @param {Scene} scene - A reference to the scene.\n * @param {Camera} camera - A reference to the camera.\n * @param {Object} options - Options for the internal render target.\n * @returns {PassNode}\n */\nconst depthPass = ( scene, camera, options ) => new PassNode( PassNode.DEPTH, scene, camera, options );\n\n/**\n * Represents a render pass for producing a toon outline effect on compatible objects.\n * Only 3D objects with materials of type `MeshToonMaterial` and `MeshToonNodeMaterial`\n * will receive the outline.\n *\n * ```js\n * const postProcessing = new PostProcessing( renderer );\n *\n * const scenePass = toonOutlinePass( scene, camera );\n *\n * postProcessing.outputNode = scenePass;\n * ```\n * @augments PassNode\n */\nclass ToonOutlinePassNode extends PassNode {\n\n\tstatic get type() {\n\n\t\treturn 'ToonOutlinePassNode';\n\n\t}\n\n\t/**\n\t * Constructs a new outline pass node.\n\t *\n\t * @param {Scene} scene - A reference to the scene.\n\t * @param {Camera} camera - A reference to the camera.\n\t * @param {Node} colorNode - Defines the outline's color.\n\t * @param {Node} thicknessNode - Defines the outline's thickness.\n\t * @param {Node} alphaNode - Defines the outline's alpha.\n\t */\n\tconstructor( scene, camera, colorNode, thicknessNode, alphaNode ) {\n\n\t\tsuper( PassNode.COLOR, scene, camera );\n\n\t\t/**\n\t\t * Defines the outline's color.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.colorNode = colorNode;\n\n\t\t/**\n\t\t * Defines the outline's thickness.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.thicknessNode = thicknessNode;\n\n\t\t/**\n\t\t * Defines the outline's alpha.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.alphaNode = alphaNode;\n\n\t\t/**\n\t\t * An internal material cache.\n\t\t *\n\t\t * @private\n\t\t * @type {WeakMap<Material, NodeMaterial>}\n\t\t */\n\t\tthis._materialCache = new WeakMap();\n\n\t\t/**\n\t\t * The name of this pass.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'Outline Pass'\n\t\t */\n\t\tthis.name = 'Outline Pass';\n\n\t}\n\n\tupdateBefore( frame ) {\n\n\t\tconst { renderer } = frame;\n\n\t\tconst currentRenderObjectFunction = renderer.getRenderObjectFunction();\n\n\t\trenderer.setRenderObjectFunction( ( object, scene, camera, geometry, material, group, lightsNode, clippingContext ) => {\n\n\t\t\t// only render outline for supported materials\n\n\t\t\tif ( material.isMeshToonMaterial || material.isMeshToonNodeMaterial ) {\n\n\t\t\t\tif ( material.wireframe === false ) {\n\n\t\t\t\t\tconst outlineMaterial = this._getOutlineMaterial( material );\n\t\t\t\t\trenderer.renderObject( object, scene, camera, geometry, outlineMaterial, group, lightsNode, clippingContext );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// default\n\n\t\t\trenderer.renderObject( object, scene, camera, geometry, material, group, lightsNode, clippingContext );\n\n\t\t} );\n\n\t\tsuper.updateBefore( frame );\n\n\t\trenderer.setRenderObjectFunction( currentRenderObjectFunction );\n\n\t}\n\n\t/**\n\t * Creates the material used for outline rendering.\n\t *\n\t * @private\n\t * @return {NodeMaterial} The outline material.\n\t */\n\t_createMaterial() {\n\n\t\tconst material = new NodeMaterial();\n\t\tmaterial.isMeshToonOutlineMaterial = true;\n\t\tmaterial.name = 'Toon_Outline';\n\t\tmaterial.side = BackSide;\n\n\t\t// vertex node\n\n\t\tconst outlineNormal = normalLocal.negate();\n\t\tconst mvp = cameraProjectionMatrix.mul( modelViewMatrix );\n\n\t\tconst ratio = float( 1.0 ); // TODO: support outline thickness ratio for each vertex\n\t\tconst pos = mvp.mul( vec4( positionLocal, 1.0 ) );\n\t\tconst pos2 = mvp.mul( vec4( positionLocal.add( outlineNormal ), 1.0 ) );\n\t\tconst norm = normalize( pos.sub( pos2 ) ); // NOTE: subtract pos2 from pos because BackSide objectNormal is negative\n\n\t\tmaterial.vertexNode = pos.add( norm.mul( this.thicknessNode ).mul( pos.w ).mul( ratio ) );\n\n\t\t// color node\n\n\t\tmaterial.colorNode = vec4( this.colorNode, this.alphaNode );\n\n\t\treturn material;\n\n\t}\n\n\t/**\n\t * For the given toon material, this method returns a corresponding\n\t * outline material.\n\t *\n\t * @private\n\t * @param {(MeshToonMaterial|MeshToonNodeMaterial)} originalMaterial - The toon material.\n\t * @return {NodeMaterial} The outline material.\n\t */\n\t_getOutlineMaterial( originalMaterial ) {\n\n\t\tlet outlineMaterial = this._materialCache.get( originalMaterial );\n\n\t\tif ( outlineMaterial === undefined ) {\n\n\t\t\toutlineMaterial = this._createMaterial();\n\n\t\t\tthis._materialCache.set( originalMaterial, outlineMaterial );\n\n\t\t}\n\n\t\treturn outlineMaterial;\n\n\t}\n\n}\n\n/**\n * TSL function for creating a toon outline pass node.\n *\n * @tsl\n * @function\n * @param {Scene} scene - A reference to the scene.\n * @param {Camera} camera - A reference to the camera.\n * @param {Color} color - Defines the outline's color.\n * @param {number} [thickness=0.003] - Defines the outline's thickness.\n * @param {number} [alpha=1] - Defines the outline's alpha.\n * @returns {ToonOutlinePassNode}\n */\nconst toonOutlinePass = ( scene, camera, color = new Color( 0, 0, 0 ), thickness = 0.003, alpha = 1 ) => nodeObject( new ToonOutlinePassNode( scene, camera, nodeObject( color ), nodeObject( thickness ), nodeObject( alpha ) ) );\n\n/**\n * Linear tone mapping, exposure only.\n *\n * @tsl\n * @function\n * @param {Node<vec3>} color - The color that should be tone mapped.\n * @param {Node<float>} exposure - The exposure.\n * @return {Node<vec3>} The tone mapped color.\n */\nconst linearToneMapping = /*@__PURE__*/ Fn( ( [ color, exposure ] ) => {\n\n\treturn color.mul( exposure ).clamp();\n\n} ).setLayout( {\n\tname: 'linearToneMapping',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'color', type: 'vec3' },\n\t\t{ name: 'exposure', type: 'float' }\n\t]\n} );\n\n/**\n * Reinhard tone mapping.\n *\n * Reference: {@link https://www.cs.utah.edu/docs/techreports/2002/pdf/UUCS-02-001.pdf}\n *\n * @tsl\n * @function\n * @param {Node<vec3>} color - The color that should be tone mapped.\n * @param {Node<float>} exposure - The exposure.\n * @return {Node<vec3>} The tone mapped color.\n */\nconst reinhardToneMapping = /*@__PURE__*/ Fn( ( [ color, exposure ] ) => {\n\n\tcolor = color.mul( exposure );\n\n\treturn color.div( color.add( 1.0 ) ).clamp();\n\n} ).setLayout( {\n\tname: 'reinhardToneMapping',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'color', type: 'vec3' },\n\t\t{ name: 'exposure', type: 'float' }\n\t]\n} );\n\n/**\n * Cineon tone mapping.\n *\n * Reference: {@link http://filmicworlds.com/blog/filmic-tonemapping-operators/}\n *\n * @tsl\n * @function\n * @param {Node<vec3>} color - The color that should be tone mapped.\n * @param {Node<float>} exposure - The exposure.\n * @return {Node<vec3>} The tone mapped color.\n */\nconst cineonToneMapping = /*@__PURE__*/ Fn( ( [ color, exposure ] ) => {\n\n\t// filmic operator by Jim Hejl and Richard Burgess-Dawson\n\tcolor = color.mul( exposure );\n\tcolor = color.sub( 0.004 ).max( 0.0 );\n\n\tconst a = color.mul( color.mul( 6.2 ).add( 0.5 ) );\n\tconst b = color.mul( color.mul( 6.2 ).add( 1.7 ) ).add( 0.06 );\n\n\treturn a.div( b ).pow( 2.2 );\n\n} ).setLayout( {\n\tname: 'cineonToneMapping',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'color', type: 'vec3' },\n\t\t{ name: 'exposure', type: 'float' }\n\t]\n} );\n\n// source: https://github.com/selfshadow/ltc_code/blob/master/webgl/shaders/ltc/ltc_blit.fs\n\nconst RRTAndODTFit = /*@__PURE__*/ Fn( ( [ color ] ) => {\n\n\tconst a = color.mul( color.add( 0.0245786 ) ).sub( 0.000090537 );\n\tconst b = color.mul( color.add( 0.4329510 ).mul( 0.983729 ) ).add( 0.238081 );\n\n\treturn a.div( b );\n\n} );\n\n/**\n * ACESFilmic tone mapping.\n *\n * Reference: {@link https://github.com/selfshadow/ltc_code/blob/master/webgl/shaders/ltc/ltc_blit.fs}\n *\n * @tsl\n * @function\n * @param {Node<vec3>} color - The color that should be tone mapped.\n * @param {Node<float>} exposure - The exposure.\n * @return {Node<vec3>} The tone mapped color.\n */\nconst acesFilmicToneMapping = /*@__PURE__*/ Fn( ( [ color, exposure ] ) => {\n\n\t// sRGB => XYZ => D65_2_D60 => AP1 => RRT_SAT\n\tconst ACESInputMat = mat3(\n\t\t0.59719, 0.35458, 0.04823,\n\t\t0.07600, 0.90834, 0.01566,\n\t\t0.02840, 0.13383, 0.83777\n\t);\n\n\t// ODT_SAT => XYZ => D60_2_D65 => sRGB\n\tconst ACESOutputMat = mat3(\n\t\t1.60475, -0.53108, -0.07367,\n\t\t-0.10208, 1.10813, -605e-5,\n\t\t-327e-5, -0.07276, 1.07602\n\t);\n\n\tcolor = color.mul( exposure ).div( 0.6 );\n\n\tcolor = ACESInputMat.mul( color );\n\n\t// Apply RRT and ODT\n\tcolor = RRTAndODTFit( color );\n\n\tcolor = ACESOutputMat.mul( color );\n\n\t// Clamp to [0, 1]\n\treturn color.clamp();\n\n} ).setLayout( {\n\tname: 'acesFilmicToneMapping',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'color', type: 'vec3' },\n\t\t{ name: 'exposure', type: 'float' }\n\t]\n} );\n\nconst LINEAR_REC2020_TO_LINEAR_SRGB = /*@__PURE__*/ mat3( vec3( 1.6605, -0.1246, -0.0182 ), vec3( -0.5876, 1.1329, -0.1006 ), vec3( -0.0728, -83e-4, 1.1187 ) );\nconst LINEAR_SRGB_TO_LINEAR_REC2020 = /*@__PURE__*/ mat3( vec3( 0.6274, 0.0691, 0.0164 ), vec3( 0.3293, 0.9195, 0.0880 ), vec3( 0.0433, 0.0113, 0.8956 ) );\n\nconst agxDefaultContrastApprox = /*@__PURE__*/ Fn( ( [ x_immutable ] ) => {\n\n\tconst x = vec3( x_immutable ).toVar();\n\tconst x2 = vec3( x.mul( x ) ).toVar();\n\tconst x4 = vec3( x2.mul( x2 ) ).toVar();\n\n\treturn float( 15.5 ).mul( x4.mul( x2 ) ).sub( mul( 40.14, x4.mul( x ) ) ).add( mul( 31.96, x4 ).sub( mul( 6.868, x2.mul( x ) ) ).add( mul( 0.4298, x2 ).add( mul( 0.1191, x ).sub( 0.00232 ) ) ) );\n\n} );\n\n/**\n * AgX tone mapping.\n *\n * @tsl\n * @function\n * @param {Node<vec3>} color - The color that should be tone mapped.\n * @param {Node<float>} exposure - The exposure.\n * @return {Node<vec3>} The tone mapped color.\n */\nconst agxToneMapping = /*@__PURE__*/ Fn( ( [ color, exposure ] ) => {\n\n\tconst colortone = vec3( color ).toVar();\n\tconst AgXInsetMatrix = mat3( vec3( 0.856627153315983, 0.137318972929847, 0.11189821299995 ), vec3( 0.0951212405381588, 0.761241990602591, 0.0767994186031903 ), vec3( 0.0482516061458583, 0.101439036467562, 0.811302368396859 ) );\n\tconst AgXOutsetMatrix = mat3( vec3( 1.1271005818144368, -0.1413297634984383, -0.14132976349843826 ), vec3( -0.11060664309660323, 1.157823702216272, -0.11060664309660294 ), vec3( -0.016493938717834573, -0.016493938717834257, 1.2519364065950405 ) );\n\tconst AgxMinEv = float( -12.47393 );\n\tconst AgxMaxEv = float( 4.026069 );\n\tcolortone.mulAssign( exposure );\n\tcolortone.assign( LINEAR_SRGB_TO_LINEAR_REC2020.mul( colortone ) );\n\tcolortone.assign( AgXInsetMatrix.mul( colortone ) );\n\tcolortone.assign( max$1( colortone, 1e-10 ) );\n\tcolortone.assign( log2( colortone ) );\n\tcolortone.assign( colortone.sub( AgxMinEv ).div( AgxMaxEv.sub( AgxMinEv ) ) );\n\tcolortone.assign( clamp( colortone, 0.0, 1.0 ) );\n\tcolortone.assign( agxDefaultContrastApprox( colortone ) );\n\tcolortone.assign( AgXOutsetMatrix.mul( colortone ) );\n\tcolortone.assign( pow( max$1( vec3( 0.0 ), colortone ), vec3( 2.2 ) ) );\n\tcolortone.assign( LINEAR_REC2020_TO_LINEAR_SRGB.mul( colortone ) );\n\tcolortone.assign( clamp( colortone, 0.0, 1.0 ) );\n\n\treturn colortone;\n\n} ).setLayout( {\n\tname: 'agxToneMapping',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'color', type: 'vec3' },\n\t\t{ name: 'exposure', type: 'float' }\n\t]\n} );\n\n/**\n * Neutral tone mapping.\n *\n * Reference: {@link https://modelviewer.dev/examples/tone-mapping}\n *\n * @tsl\n * @function\n * @param {Node<vec3>} color - The color that should be tone mapped.\n * @param {Node<float>} exposure - The exposure.\n * @return {Node<vec3>} The tone mapped color.\n */\nconst neutralToneMapping = /*@__PURE__*/ Fn( ( [ color, exposure ] ) => {\n\n\tconst StartCompression = float( 0.8 - 0.04 );\n\tconst Desaturation = float( 0.15 );\n\n\tcolor = color.mul( exposure );\n\n\tconst x = min$1( color.r, min$1( color.g, color.b ) );\n\tconst offset = select( x.lessThan( 0.08 ), x.sub( mul( 6.25, x.mul( x ) ) ), 0.04 );\n\n\tcolor.subAssign( offset );\n\n\tconst peak = max$1( color.r, max$1( color.g, color.b ) );\n\n\tIf( peak.lessThan( StartCompression ), () => {\n\n\t\treturn color;\n\n\t} );\n\n\tconst d = sub( 1, StartCompression );\n\tconst newPeak = sub( 1, d.mul( d ).div( peak.add( d.sub( StartCompression ) ) ) );\n\tcolor.mulAssign( newPeak.div( peak ) );\n\tconst g = sub( 1, div( 1, Desaturation.mul( peak.sub( newPeak ) ).add( 1 ) ) );\n\n\treturn mix( color, vec3( newPeak ), g );\n\n} ).setLayout( {\n\tname: 'neutralToneMapping',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'color', type: 'vec3' },\n\t\t{ name: 'exposure', type: 'float' }\n\t]\n} );\n\n/**\n * This class represents native code sections. It is the base\n * class for modules like {@link FunctionNode} which allows to implement\n * functions with native shader languages.\n *\n * @augments Node\n */\nclass CodeNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'CodeNode';\n\n\t}\n\n\t/**\n\t * Constructs a new code node.\n\t *\n\t * @param {string} [code=''] - The native code.\n\t * @param {Array<Node>} [includes=[]] - An array of includes.\n\t * @param {('js'|'wgsl'|'glsl')} [language=''] - The used language.\n\t */\n\tconstructor( code = '', includes = [], language = '' ) {\n\n\t\tsuper( 'code' );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isCodeNode = true;\n\n\t\t/**\n\t\t * This flag is used for global cache.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.global = true;\n\n\t\t/**\n\t\t * The native code.\n\t\t *\n\t\t * @type {string}\n\t\t * @default ''\n\t\t */\n\t\tthis.code = code;\n\n\t\t/**\n\t\t * An array of includes\n\t\t *\n\t\t * @type {Array<Node>}\n\t\t * @default []\n\t\t */\n\t\tthis.includes = includes;\n\n\t\t/**\n\t\t * The used language.\n\t\t *\n\t\t * @type {('js'|'wgsl'|'glsl')}\n\t\t * @default ''\n\t\t */\n\t\tthis.language = language;\n\n\t}\n\n\t/**\n\t * Sets the includes of this code node.\n\t *\n\t * @param {Array<Node>} includes - The includes to set.\n\t * @return {CodeNode} A reference to this node.\n\t */\n\tsetIncludes( includes ) {\n\n\t\tthis.includes = includes;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the includes of this code node.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {Array<Node>} The includes.\n\t */\n\tgetIncludes( /*builder*/ ) {\n\n\t\treturn this.includes;\n\n\t}\n\n\tgenerate( builder ) {\n\n\t\tconst includes = this.getIncludes( builder );\n\n\t\tfor ( const include of includes ) {\n\n\t\t\tinclude.build( builder );\n\n\t\t}\n\n\t\tconst nodeCode = builder.getCodeFromNode( this, this.getNodeType( builder ) );\n\t\tnodeCode.code = this.code;\n\n\t\treturn nodeCode.code;\n\n\t}\n\n\tserialize( data ) {\n\n\t\tsuper.serialize( data );\n\n\t\tdata.code = this.code;\n\t\tdata.language = this.language;\n\n\t}\n\n\tdeserialize( data ) {\n\n\t\tsuper.deserialize( data );\n\n\t\tthis.code = data.code;\n\t\tthis.language = data.language;\n\n\t}\n\n}\n\n/**\n * TSL function for creating a code node.\n *\n * @tsl\n * @function\n * @param {string} [code] - The native code.\n * @param {?Array<Node>} [includes=[]] - An array of includes.\n * @param {?('js'|'wgsl'|'glsl')} [language=''] - The used language.\n * @returns {CodeNode}\n */\nconst code = /*@__PURE__*/ nodeProxy( CodeNode ).setParameterLength( 1, 3 );\n\n/**\n * TSL function for creating a JS code node.\n *\n * @tsl\n * @function\n * @param {string} src - The native code.\n * @param {Array<Node>} includes - An array of includes.\n * @returns {CodeNode}\n */\nconst js = ( src, includes ) => code( src, includes, 'js' );\n\n/**\n * TSL function for creating a WGSL code node.\n *\n * @tsl\n * @function\n * @param {string} src - The native code.\n * @param {Array<Node>} includes - An array of includes.\n * @returns {CodeNode}\n */\nconst wgsl = ( src, includes ) => code( src, includes, 'wgsl' );\n\n/**\n * TSL function for creating a GLSL code node.\n *\n * @tsl\n * @function\n * @param {string} src - The native code.\n * @param {Array<Node>} includes - An array of includes.\n * @returns {CodeNode}\n */\nconst glsl = ( src, includes ) => code( src, includes, 'glsl' );\n\n/**\n * This class represents a native shader function. It can be used to implement\n * certain aspects of a node material with native shader code. There are two predefined\n * TSL functions for easier usage.\n *\n * - `wgslFn`: Creates a WGSL function node.\n * - `glslFn`: Creates a GLSL function node.\n *\n * A basic example with one include looks like so:\n *\n * ```js\n * const desaturateWGSLFn = wgslFn( `\n *\tfn desaturate( color:vec3<f32> ) -> vec3<f32> {\n *\t\tlet lum = vec3<f32>( 0.299, 0.587, 0.114 );\n *\t\treturn vec3<f32>( dot( lum, color ) );\n *\t}`\n *);\n * const someWGSLFn = wgslFn( `\n *\tfn someFn( color:vec3<f32> ) -> vec3<f32> {\n * \t\treturn desaturate( color );\n * \t}\n * `, [ desaturateWGSLFn ] );\n * material.colorNode = someWGSLFn( { color: texture( map ) } );\n *```\n * @augments CodeNode\n */\nclass FunctionNode extends CodeNode {\n\n\tstatic get type() {\n\n\t\treturn 'FunctionNode';\n\n\t}\n\n\t/**\n\t * Constructs a new function node.\n\t *\n\t * @param {string} [code=''] - The native code.\n\t * @param {Array<Node>} [includes=[]] - An array of includes.\n\t * @param {('js'|'wgsl'|'glsl')} [language=''] - The used language.\n\t */\n\tconstructor( code = '', includes = [], language = '' ) {\n\n\t\tsuper( code, includes, language );\n\n\t}\n\n\t/**\n\t * Returns the type of this function node.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The type.\n\t */\n\tgetNodeType( builder ) {\n\n\t\treturn this.getNodeFunction( builder ).type;\n\n\t}\n\n\t/**\n\t * Returns the type of a member of this function node.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @param {string} name - The name of the member.\n\t * @return {string} The type of the member.\n\t */\n\tgetMemberType( builder, name ) {\n\n\t\tconst type = this.getNodeType( builder );\n\n\t\tconst structType = builder.getStructTypeNode( type );\n\n\t\treturn structType.getMemberType( builder, name );\n\n\t}\n\n\t/**\n\t * Returns the inputs of this function node.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {Array<NodeFunctionInput>} The inputs.\n\t */\n\tgetInputs( builder ) {\n\n\t\treturn this.getNodeFunction( builder ).inputs;\n\n\t}\n\n\t/**\n\t * Returns the node function for this function node.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {NodeFunction} The node function.\n\t */\n\tgetNodeFunction( builder ) {\n\n\t\tconst nodeData = builder.getDataFromNode( this );\n\n\t\tlet nodeFunction = nodeData.nodeFunction;\n\n\t\tif ( nodeFunction === undefined ) {\n\n\t\t\tnodeFunction = builder.parser.parseFunction( this.code );\n\n\t\t\tnodeData.nodeFunction = nodeFunction;\n\n\t\t}\n\n\t\treturn nodeFunction;\n\n\t}\n\n\tgenerate( builder, output ) {\n\n\t\tsuper.generate( builder );\n\n\t\tconst nodeFunction = this.getNodeFunction( builder );\n\n\t\tconst name = nodeFunction.name;\n\t\tconst type = nodeFunction.type;\n\n\t\tconst nodeCode = builder.getCodeFromNode( this, type );\n\n\t\tif ( name !== '' ) {\n\n\t\t\t// use a custom property name\n\n\t\t\tnodeCode.name = name;\n\n\t\t}\n\n\t\tconst propertyName = builder.getPropertyName( nodeCode );\n\n\t\tconst code = this.getNodeFunction( builder ).getCode( propertyName );\n\n\t\tnodeCode.code = code + '\\n';\n\n\t\tif ( output === 'property' ) {\n\n\t\t\treturn propertyName;\n\n\t\t} else {\n\n\t\t\treturn builder.format( `${ propertyName }()`, type, output );\n\n\t\t}\n\n\t}\n\n}\n\nconst nativeFn = ( code, includes = [], language = '' ) => {\n\n\tfor ( let i = 0; i < includes.length; i ++ ) {\n\n\t\tconst include = includes[ i ];\n\n\t\t// TSL Function: glslFn, wgslFn\n\n\t\tif ( typeof include === 'function' ) {\n\n\t\t\tincludes[ i ] = include.functionNode;\n\n\t\t}\n\n\t}\n\n\tconst functionNode = new FunctionNode( code, includes, language );\n\n\tconst fn = ( ...params ) => functionNode.call( ...params );\n\tfn.functionNode = functionNode;\n\n\treturn fn;\n\n};\n\nconst glslFn = ( code, includes ) => nativeFn( code, includes, 'glsl' );\nconst wgslFn = ( code, includes ) => nativeFn( code, includes, 'wgsl' );\n\n/**\n * `ScriptableNode` uses this class to manage script inputs and outputs.\n *\n * @augments Node\n */\nclass ScriptableValueNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'ScriptableValueNode';\n\n\t}\n\n\t/**\n\t * Constructs a new scriptable node.\n\t *\n\t * @param {any} [value=null] - The value.\n\t */\n\tconstructor( value = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * A reference to the value.\n\t\t *\n\t\t * @private\n\t\t * @default null\n\t\t */\n\t\tthis._value = value;\n\n\t\t/**\n\t\t * Depending on the type of `_value`, this property might cache parsed data.\n\t\t *\n\t\t * @private\n\t\t * @default null\n\t\t */\n\t\tthis._cache = null;\n\n\t\t/**\n\t\t * If this node represents an input, this property represents the input type.\n\t\t *\n\t\t * @type {?string}\n\t\t * @default null\n\t\t */\n\t\tthis.inputType = null;\n\n\t\t/**\n\t\t * If this node represents an output, this property represents the output type.\n\t\t *\n\t\t * @type {?string}\n\t\t * @default null\n\t\t */\n\t\tthis.outputType = null;\n\n\t\t/**\n\t\t * An event dispatcher for managing events.\n\t\t *\n\t\t * @type {EventDispatcher}\n\t\t */\n\t\tthis.events = new EventDispatcher();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isScriptableValueNode = true;\n\n\t}\n\n\t/**\n\t * Whether this node represents an output or not.\n\t *\n\t * @type {boolean}\n\t * @readonly\n\t * @default true\n\t */\n\tget isScriptableOutputNode() {\n\n\t\treturn this.outputType !== null;\n\n\t}\n\n\tset value( val ) {\n\n\t\tif ( this._value === val ) return;\n\n\t\tif ( this._cache && this.inputType === 'URL' && this.value.value instanceof ArrayBuffer ) {\n\n\t\t\tURL.revokeObjectURL( this._cache );\n\n\t\t\tthis._cache = null;\n\n\t\t}\n\n\t\tthis._value = val;\n\n\t\tthis.events.dispatchEvent( { type: 'change' } );\n\n\t\tthis.refresh();\n\n\t}\n\n\t/**\n\t * The node's value.\n\t *\n\t * @type {any}\n\t */\n\tget value() {\n\n\t\treturn this._value;\n\n\t}\n\n\t/**\n\t * Dispatches the `refresh` event.\n\t */\n\trefresh() {\n\n\t\tthis.events.dispatchEvent( { type: 'refresh' } );\n\n\t}\n\n\t/**\n\t * The `value` property usually represents a node or even binary data in form of array buffers.\n\t * In this case, this method tries to return the actual value behind the complex type.\n\t *\n\t * @return {any} The value.\n\t */\n\tgetValue() {\n\n\t\tconst value = this.value;\n\n\t\tif ( value && this._cache === null && this.inputType === 'URL' && value.value instanceof ArrayBuffer ) {\n\n\t\t\tthis._cache = URL.createObjectURL( new Blob( [ value.value ] ) );\n\n\t\t} else if ( value && value.value !== null && value.value !== undefined && (\n\t\t\t( ( this.inputType === 'URL' || this.inputType === 'String' ) && typeof value.value === 'string' ) ||\n\t\t\t( this.inputType === 'Number' && typeof value.value === 'number' ) ||\n\t\t\t( this.inputType === 'Vector2' && value.value.isVector2 ) ||\n\t\t\t( this.inputType === 'Vector3' && value.value.isVector3 ) ||\n\t\t\t( this.inputType === 'Vector4' && value.value.isVector4 ) ||\n\t\t\t( this.inputType === 'Color' && value.value.isColor ) ||\n\t\t\t( this.inputType === 'Matrix3' && value.value.isMatrix3 ) ||\n\t\t\t( this.inputType === 'Matrix4' && value.value.isMatrix4 )\n\t\t) ) {\n\n\t\t\treturn value.value;\n\n\t\t}\n\n\t\treturn this._cache || value;\n\n\t}\n\n\t/**\n\t * Overwritten since the node type is inferred from the value.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The node type.\n\t */\n\tgetNodeType( builder ) {\n\n\t\treturn this.value && this.value.isNode ? this.value.getNodeType( builder ) : 'float';\n\n\t}\n\n\tsetup() {\n\n\t\treturn this.value && this.value.isNode ? this.value : float();\n\n\t}\n\n\tserialize( data ) {\n\n\t\tsuper.serialize( data );\n\n\t\tif ( this.value !== null ) {\n\n\t\t\tif ( this.inputType === 'ArrayBuffer' ) {\n\n\t\t\t\tdata.value = arrayBufferToBase64( this.value );\n\n\t\t\t} else {\n\n\t\t\t\tdata.value = this.value ? this.value.toJSON( data.meta ).uuid : null;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdata.value = null;\n\n\t\t}\n\n\t\tdata.inputType = this.inputType;\n\t\tdata.outputType = this.outputType;\n\n\t}\n\n\tdeserialize( data ) {\n\n\t\tsuper.deserialize( data );\n\n\t\tlet value = null;\n\n\t\tif ( data.value !== null ) {\n\n\t\t\tif ( data.inputType === 'ArrayBuffer' ) {\n\n\t\t\t\tvalue = base64ToArrayBuffer( data.value );\n\n\t\t\t} else if ( data.inputType === 'Texture' ) {\n\n\t\t\t\tvalue = data.meta.textures[ data.value ];\n\n\t\t\t} else {\n\n\t\t\t\tvalue = data.meta.nodes[ data.value ] || null;\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.value = value;\n\n\t\tthis.inputType = data.inputType;\n\t\tthis.outputType = data.outputType;\n\n\t}\n\n}\n\n/**\n * TSL function for creating a scriptable value node.\n *\n * @tsl\n * @function\n * @param {any} [value] - The value.\n * @returns {ScriptableValueNode}\n */\nconst scriptableValue = /*@__PURE__*/ nodeProxy( ScriptableValueNode ).setParameterLength( 1 );\n\n/**\n * A Map-like data structure for managing resources of scriptable nodes.\n *\n * @augments Map\n */\nclass Resources extends Map {\n\n\tget( key, callback = null, ...params ) {\n\n\t\tif ( this.has( key ) ) return super.get( key );\n\n\t\tif ( callback !== null ) {\n\n\t\t\tconst value = callback( ...params );\n\t\t\tthis.set( key, value );\n\t\t\treturn value;\n\n\t\t}\n\n\t}\n\n}\n\nclass Parameters {\n\n\tconstructor( scriptableNode ) {\n\n\t\tthis.scriptableNode = scriptableNode;\n\n\t}\n\n\tget parameters() {\n\n\t\treturn this.scriptableNode.parameters;\n\n\t}\n\n\tget layout() {\n\n\t\treturn this.scriptableNode.getLayout();\n\n\t}\n\n\tgetInputLayout( id ) {\n\n\t\treturn this.scriptableNode.getInputLayout( id );\n\n\t}\n\n\tget( name ) {\n\n\t\tconst param = this.parameters[ name ];\n\t\tconst value = param ? param.getValue() : null;\n\n\t\treturn value;\n\n\t}\n\n}\n\n/**\n * Defines the resources (e.g. namespaces) of scriptable nodes.\n *\n * @type {Resources}\n */\nconst ScriptableNodeResources = new Resources();\n\n/**\n * This type of node allows to implement nodes with custom scripts. The script\n * section is represented as an instance of `CodeNode` written with JavaScript.\n * The script itself must adhere to a specific structure.\n *\n * - main(): Executed once by default and every time `node.needsUpdate` is set.\n * - layout: The layout object defines the script's interface (inputs and outputs).\n *\n * ```js\n * ScriptableNodeResources.set( 'TSL', TSL );\n *\n * const scriptableNode = scriptable( js( `\n * \tlayout = {\n * \t\toutputType: 'node',\n * \t\telements: [\n * \t\t\t{ name: 'source', inputType: 'node' },\n * \t\t]\n * \t};\n *\n * \tconst { mul, oscSine } = TSL;\n *\n * \tfunction main() {\n * \t\tconst source = parameters.get( 'source' ) || float();\n * \t\treturn mul( source, oscSine() ) );\n * \t}\n *\n * ` ) );\n *\n * scriptableNode.setParameter( 'source', color( 1, 0, 0 ) );\n *\n * const material = new THREE.MeshBasicNodeMaterial();\n * material.colorNode = scriptableNode;\n * ```\n *\n * @augments Node\n */\nclass ScriptableNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'ScriptableNode';\n\n\t}\n\n\t/**\n\t * Constructs a new scriptable node.\n\t *\n\t * @param {?CodeNode} [codeNode=null] - The code node.\n\t * @param {Object} [parameters={}] - The parameters definition.\n\t */\n\tconstructor( codeNode = null, parameters = {} ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The code node.\n\t\t *\n\t\t * @type {?CodeNode}\n\t\t * @default null\n\t\t */\n\t\tthis.codeNode = codeNode;\n\n\t\t/**\n\t\t * The parameters definition.\n\t\t *\n\t\t * @type {Object}\n\t\t * @default {}\n\t\t */\n\t\tthis.parameters = parameters;\n\n\t\tthis._local = new Resources();\n\t\tthis._output = scriptableValue( null );\n\t\tthis._outputs = {};\n\t\tthis._source = this.source;\n\t\tthis._method = null;\n\t\tthis._object = null;\n\t\tthis._value = null;\n\t\tthis._needsOutputUpdate = true;\n\n\t\tthis.onRefresh = this.onRefresh.bind( this );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isScriptableNode = true;\n\n\t}\n\n\t/**\n\t * The source code of the scriptable node.\n\t *\n\t * @type {string}\n\t */\n\tget source() {\n\n\t\treturn this.codeNode ? this.codeNode.code : '';\n\n\t}\n\n\t/**\n\t * Sets the reference of a local script variable.\n\t *\n\t * @param {string} name - The variable name.\n\t * @param {Object} value - The reference to set.\n\t * @return {Resources} The resource map\n\t */\n\tsetLocal( name, value ) {\n\n\t\treturn this._local.set( name, value );\n\n\t}\n\n\t/**\n\t * Gets the value of a local script variable.\n\t *\n\t * @param {string} name - The variable name.\n\t * @return {Object} The value.\n\t */\n\tgetLocal( name ) {\n\n\t\treturn this._local.get( name );\n\n\t}\n\n\t/**\n\t * Event listener for the `refresh` event.\n\t */\n\tonRefresh() {\n\n\t\tthis._refresh();\n\n\t}\n\n\t/**\n\t * Returns an input from the layout with the given id/name.\n\t *\n\t * @param {string} id - The id/name of the input.\n\t * @return {Object} The element entry.\n\t */\n\tgetInputLayout( id ) {\n\n\t\tfor ( const element of this.getLayout() ) {\n\n\t\t\tif ( element.inputType && ( element.id === id || element.name === id ) ) {\n\n\t\t\t\treturn element;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns an output from the layout with the given id/name.\n\t *\n\t * @param {string} id - The id/name of the output.\n\t * @return {Object} The element entry.\n\t */\n\tgetOutputLayout( id ) {\n\n\t\tfor ( const element of this.getLayout() ) {\n\n\t\t\tif ( element.outputType && ( element.id === id || element.name === id ) ) {\n\n\t\t\t\treturn element;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Defines a script output for the given name and value.\n\t *\n\t * @param {string} name - The name of the output.\n\t * @param {Node} value - The node value.\n\t * @return {ScriptableNode} A reference to this node.\n\t */\n\tsetOutput( name, value ) {\n\n\t\tconst outputs = this._outputs;\n\n\t\tif ( outputs[ name ] === undefined ) {\n\n\t\t\toutputs[ name ] = scriptableValue( value );\n\n\t\t} else {\n\n\t\t\toutputs[ name ].value = value;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns a script output for the given name.\n\t *\n\t * @param {string} name - The name of the output.\n\t * @return {ScriptableValueNode} The node value.\n\t */\n\tgetOutput( name ) {\n\n\t\treturn this._outputs[ name ];\n\n\t}\n\n\t/**\n\t * Returns a parameter for the given name\n\t *\n\t * @param {string} name - The name of the parameter.\n\t * @return {ScriptableValueNode} The node value.\n\t */\n\tgetParameter( name ) {\n\n\t\treturn this.parameters[ name ];\n\n\t}\n\n\t/**\n\t * Sets a value for the given parameter name.\n\t *\n\t * @param {string} name - The parameter name.\n\t * @param {any} value - The parameter value.\n\t * @return {ScriptableNode} A reference to this node.\n\t */\n\tsetParameter( name, value ) {\n\n\t\tconst parameters = this.parameters;\n\n\t\tif ( value && value.isScriptableNode ) {\n\n\t\t\tthis.deleteParameter( name );\n\n\t\t\tparameters[ name ] = value;\n\t\t\tparameters[ name ].getDefaultOutput().events.addEventListener( 'refresh', this.onRefresh );\n\n\t\t} else if ( value && value.isScriptableValueNode ) {\n\n\t\t\tthis.deleteParameter( name );\n\n\t\t\tparameters[ name ] = value;\n\t\t\tparameters[ name ].events.addEventListener( 'refresh', this.onRefresh );\n\n\t\t} else if ( parameters[ name ] === undefined ) {\n\n\t\t\tparameters[ name ] = scriptableValue( value );\n\t\t\tparameters[ name ].events.addEventListener( 'refresh', this.onRefresh );\n\n\t\t} else {\n\n\t\t\tparameters[ name ].value = value;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the value of this node which is the value of\n\t * the default output.\n\t *\n\t * @return {Node} The value.\n\t */\n\tgetValue() {\n\n\t\treturn this.getDefaultOutput().getValue();\n\n\t}\n\n\t/**\n\t * Deletes a parameter from the script.\n\t *\n\t * @param {string} name - The parameter to remove.\n\t * @return {ScriptableNode} A reference to this node.\n\t */\n\tdeleteParameter( name ) {\n\n\t\tlet valueNode = this.parameters[ name ];\n\n\t\tif ( valueNode ) {\n\n\t\t\tif ( valueNode.isScriptableNode ) valueNode = valueNode.getDefaultOutput();\n\n\t\t\tvalueNode.events.removeEventListener( 'refresh', this.onRefresh );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Deletes all parameters from the script.\n\t *\n\t * @return {ScriptableNode} A reference to this node.\n\t */\n\tclearParameters() {\n\n\t\tfor ( const name of Object.keys( this.parameters ) ) {\n\n\t\t\tthis.deleteParameter( name );\n\n\t\t}\n\n\t\tthis.needsUpdate = true;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Calls a function from the script.\n\t *\n\t * @param {string} name - The function name.\n\t * @param {...any} params - A list of parameters.\n\t * @return {any} The result of the function call.\n\t */\n\tcall( name, ...params ) {\n\n\t\tconst object = this.getObject();\n\t\tconst method = object[ name ];\n\n\t\tif ( typeof method === 'function' ) {\n\n\t\t\treturn method( ...params );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Asynchronously calls a function from the script.\n\t *\n\t * @param {string} name - The function name.\n\t * @param {...any} params - A list of parameters.\n\t * @return {Promise<any>} The result of the function call.\n\t */\n\tasync callAsync( name, ...params ) {\n\n\t\tconst object = this.getObject();\n\t\tconst method = object[ name ];\n\n\t\tif ( typeof method === 'function' ) {\n\n\t\t\treturn method.constructor.name === 'AsyncFunction' ? await method( ...params ) : method( ...params );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Overwritten since the node types is inferred from the script's output.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder\n\t * @return {string} The node type.\n\t */\n\tgetNodeType( builder ) {\n\n\t\treturn this.getDefaultOutputNode().getNodeType( builder );\n\n\t}\n\n\t/**\n\t * Refreshes the script node.\n\t *\n\t * @param {?string} [output=null] - An optional output.\n\t */\n\trefresh( output = null ) {\n\n\t\tif ( output !== null ) {\n\n\t\t\tthis.getOutput( output ).refresh();\n\n\t\t} else {\n\n\t\t\tthis._refresh();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns an object representation of the script.\n\t *\n\t * @return {Object} The result object.\n\t */\n\tgetObject() {\n\n\t\tif ( this.needsUpdate ) this.dispose();\n\t\tif ( this._object !== null ) return this._object;\n\n\t\t//\n\n\t\tconst refresh = () => this.refresh();\n\t\tconst setOutput = ( id, value ) => this.setOutput( id, value );\n\n\t\tconst parameters = new Parameters( this );\n\n\t\tconst THREE = ScriptableNodeResources.get( 'THREE' );\n\t\tconst TSL = ScriptableNodeResources.get( 'TSL' );\n\n\t\tconst method = this.getMethod();\n\t\tconst params = [ parameters, this._local, ScriptableNodeResources, refresh, setOutput, THREE, TSL ];\n\n\t\tthis._object = method( ...params );\n\n\t\tconst layout = this._object.layout;\n\n\t\tif ( layout ) {\n\n\t\t\tif ( layout.cache === false ) {\n\n\t\t\t\tthis._local.clear();\n\n\t\t\t}\n\n\t\t\t// default output\n\t\t\tthis._output.outputType = layout.outputType || null;\n\n\t\t\tif ( Array.isArray( layout.elements ) ) {\n\n\t\t\t\tfor ( const element of layout.elements ) {\n\n\t\t\t\t\tconst id = element.id || element.name;\n\n\t\t\t\t\tif ( element.inputType ) {\n\n\t\t\t\t\t\tif ( this.getParameter( id ) === undefined ) this.setParameter( id, null );\n\n\t\t\t\t\t\tthis.getParameter( id ).inputType = element.inputType;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( element.outputType ) {\n\n\t\t\t\t\t\tif ( this.getOutput( id ) === undefined ) this.setOutput( id, null );\n\n\t\t\t\t\t\tthis.getOutput( id ).outputType = element.outputType;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn this._object;\n\n\t}\n\n\tdeserialize( data ) {\n\n\t\tsuper.deserialize( data );\n\n\t\tfor ( const name in this.parameters ) {\n\n\t\t\tlet valueNode = this.parameters[ name ];\n\n\t\t\tif ( valueNode.isScriptableNode ) valueNode = valueNode.getDefaultOutput();\n\n\t\t\tvalueNode.events.addEventListener( 'refresh', this.onRefresh );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the layout of the script.\n\t *\n\t * @return {Object} The script's layout.\n\t */\n\tgetLayout() {\n\n\t\treturn this.getObject().layout;\n\n\t}\n\n\t/**\n\t * Returns default node output of the script.\n\t *\n\t * @return {Node} The default node output.\n\t */\n\tgetDefaultOutputNode() {\n\n\t\tconst output = this.getDefaultOutput().value;\n\n\t\tif ( output && output.isNode ) {\n\n\t\t\treturn output;\n\n\t\t}\n\n\t\treturn float();\n\n\t}\n\n\t/**\n\t * Returns default output of the script.\n\t *\n\t * @return {ScriptableValueNode} The default output.\n\t */\n\tgetDefaultOutput()\t{\n\n\t\treturn this._exec()._output;\n\n\t}\n\n\t/**\n\t * Returns a function created from the node's script.\n\t *\n\t * @return {Function} The function representing the node's code.\n\t */\n\tgetMethod() {\n\n\t\tif ( this.needsUpdate ) this.dispose();\n\t\tif ( this._method !== null ) return this._method;\n\n\t\t//\n\n\t\tconst parametersProps = [ 'parameters', 'local', 'global', 'refresh', 'setOutput', 'THREE', 'TSL' ];\n\t\tconst interfaceProps = [ 'layout', 'init', 'main', 'dispose' ];\n\n\t\tconst properties = interfaceProps.join( ', ' );\n\t\tconst declarations = 'var ' + properties + '; var output = {};\\n';\n\t\tconst returns = '\\nreturn { ...output, ' + properties + ' };';\n\n\t\tconst code = declarations + this.codeNode.code + returns;\n\n\t\t//\n\n\t\tthis._method = new Function( ...parametersProps, code );\n\n\t\treturn this._method;\n\n\t}\n\n\t/**\n\t * Frees all internal resources.\n\t */\n\tdispose() {\n\n\t\tif ( this._method === null ) return;\n\n\t\tif ( this._object && typeof this._object.dispose === 'function' ) {\n\n\t\t\tthis._object.dispose();\n\n\t\t}\n\n\t\tthis._method = null;\n\t\tthis._object = null;\n\t\tthis._source = null;\n\t\tthis._value = null;\n\t\tthis._needsOutputUpdate = true;\n\t\tthis._output.value = null;\n\t\tthis._outputs = {};\n\n\t}\n\n\tsetup() {\n\n\t\treturn this.getDefaultOutputNode();\n\n\t}\n\n\tgetCacheKey( force ) {\n\n\t\tconst values = [ hashString( this.source ), this.getDefaultOutputNode().getCacheKey( force ) ];\n\n\t\tfor ( const param in this.parameters ) {\n\n\t\t\tvalues.push( this.parameters[ param ].getCacheKey( force ) );\n\n\t\t}\n\n\t\treturn hashArray( values );\n\n\t}\n\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.dispose();\n\n\t}\n\n\tget needsUpdate() {\n\n\t\treturn this.source !== this._source;\n\n\t}\n\n\t/**\n\t * Executes the `main` function of the script.\n\t *\n\t * @private\n\t * @return {ScriptableNode} A reference to this node.\n\t */\n\t_exec()\t{\n\n\t\tif ( this.codeNode === null ) return this;\n\n\t\tif ( this._needsOutputUpdate === true ) {\n\n\t\t\tthis._value = this.call( 'main' );\n\n\t\t\tthis._needsOutputUpdate = false;\n\n\t\t}\n\n\t\tthis._output.value = this._value;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Executes the refresh.\n\t *\n\t * @private\n\t */\n\t_refresh() {\n\n\t\tthis.needsUpdate = true;\n\n\t\tthis._exec();\n\n\t\tthis._output.refresh();\n\n\t}\n\n}\n\n/**\n * TSL function for creating a scriptable node.\n *\n * @tsl\n * @function\n * @param {CodeNode} [codeNode] - The code node.\n * @param {?Object} [parameters={}] - The parameters definition.\n * @returns {ScriptableNode}\n */\nconst scriptable = /*@__PURE__*/ nodeProxy( ScriptableNode ).setParameterLength( 1, 2 );\n\n/**\n * Returns a node that represents the `z` coordinate in view space\n * for the current fragment. It's a different representation of the\n * default depth value.\n *\n * This value can be part of a computation that defines how the fog\n * density increases when moving away from the camera.\n *\n * @param {NodeBuilder} builder - The current node builder.\n * @return {Node} The viewZ node.\n */\nfunction getViewZNode( builder ) {\n\n\tlet viewZ;\n\n\tconst getViewZ = builder.context.getViewZ;\n\n\tif ( getViewZ !== undefined ) {\n\n\t\tviewZ = getViewZ( this );\n\n\t}\n\n\treturn ( viewZ || positionView.z ).negate();\n\n}\n\n/**\n * Constructs a new range factor node.\n *\n * @tsl\n * @function\n * @param {Node} near - Defines the near value.\n * @param {Node} far - Defines the far value.\n */\nconst rangeFogFactor = Fn( ( [ near, far ], builder ) => {\n\n\tconst viewZ = getViewZNode( builder );\n\n\treturn smoothstep( near, far, viewZ );\n\n} );\n\n/**\n * Represents an exponential squared fog. This type of fog gives\n * a clear view near the camera and a faster than exponentially\n * densening fog farther from the camera.\n *\n * @tsl\n * @function\n * @param {Node} density - Defines the fog density.\n */\nconst densityFogFactor = Fn( ( [ density ], builder ) => {\n\n\tconst viewZ = getViewZNode( builder );\n\n\treturn density.mul( density, viewZ, viewZ ).negate().exp().oneMinus();\n\n} );\n\n/**\n * This class can be used to configure a fog for the scene.\n * Nodes of this type are assigned to `Scene.fogNode`.\n *\n * @tsl\n * @function\n * @param {Node} color - Defines the color of the fog.\n * @param {Node} factor - Defines how the fog is factored in the scene.\n */\nconst fog = Fn( ( [ color, factor ] ) => {\n\n\treturn vec4( factor.toFloat().mix( output.rgb, color.toVec3() ), output.a );\n\n} );\n\n// Deprecated\n\n/**\n * @tsl\n * @function\n * @deprecated since r171. Use `fog( color, rangeFogFactor( near, far ) )` instead.\n *\n * @param {Node} color\n * @param {Node} near\n * @param {Node} far\n * @returns {Function}\n */\nfunction rangeFog( color, near, far ) { // @deprecated, r171\n\n\twarn( 'TSL: \"rangeFog( color, near, far )\" is deprecated. Use \"fog( color, rangeFogFactor( near, far ) )\" instead.' );\n\treturn fog( color, rangeFogFactor( near, far ) );\n\n}\n\n/**\n * @tsl\n * @function\n * @deprecated since r171. Use `fog( color, densityFogFactor( density ) )` instead.\n *\n * @param {Node} color\n * @param {Node} density\n * @returns {Function}\n */\nfunction densityFog( color, density ) { // @deprecated, r171\n\n\twarn( 'TSL: \"densityFog( color, density )\" is deprecated. Use \"fog( color, densityFogFactor( density ) )\" instead.' );\n\treturn fog( color, densityFogFactor( density ) );\n\n}\n\nlet min = null;\nlet max = null;\n\n/**\n * `RangeNode` generates random instanced attribute data in a defined range.\n * An exemplary use case for this utility node is to generate random per-instance\n * colors:\n * ```js\n * const material = new MeshBasicNodeMaterial();\n * material.colorNode = range( new Color( 0x000000 ), new Color( 0xFFFFFF ) );\n * const mesh = new InstancedMesh( geometry, material, count );\n * ```\n * @augments Node\n */\nclass RangeNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'RangeNode';\n\n\t}\n\n\t/**\n\t * Constructs a new range node.\n\t *\n\t * @param {Node<any>} [minNode=float()] - A node defining the lower bound of the range.\n\t * @param {Node<any>} [maxNode=float()] - A node defining the upper bound of the range.\n\t */\n\tconstructor( minNode = float(), maxNode = float() ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t *  A node defining the lower bound of the range.\n\t\t *\n\t\t * @type {Node<any>}\n\t\t * @default float()\n\t\t */\n\t\tthis.minNode = minNode;\n\n\t\t/**\n\t\t *  A node defining the upper bound of the range.\n\t\t *\n\t\t * @type {Node<any>}\n\t\t * @default float()\n\t\t */\n\t\tthis.maxNode = maxNode;\n\n\t}\n\n\t/**\n\t * Returns the vector length which is computed based on the range definition.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {number} The vector length.\n\t */\n\tgetVectorLength( builder ) {\n\n\t\tconst minNode = this.getConstNode( this.minNode );\n\t\tconst maxNode = this.getConstNode( this.maxNode );\n\n\t\tconst minLength = builder.getTypeLength( getValueType( minNode.value ) );\n\t\tconst maxLength = builder.getTypeLength( getValueType( maxNode.value ) );\n\n\t\treturn minLength > maxLength ? minLength : maxLength;\n\n\t}\n\n\t/**\n\t * This method is overwritten since the node type is inferred from range definition.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The node type.\n\t */\n\tgetNodeType( builder ) {\n\n\t\treturn builder.object.count > 1 ? builder.getTypeFromLength( this.getVectorLength( builder ) ) : 'float';\n\n\t}\n\n\t/**\n\t * Returns a constant node from the given node by traversing it.\n\t *\n\t * @param {Node} node - The node to traverse.\n\t * @returns {Node} The constant node, if found.\n\t */\n\tgetConstNode( node ) {\n\n\t\tlet output = null;\n\n\t\tnode.traverse( n => {\n\n\t\t\tif ( n.isConstNode === true ) {\n\n\t\t\t\toutput = n;\n\n\t\t\t}\n\n\t\t} );\n\n\t\tif ( output === null ) {\n\n\t\t\tthrow new Error( 'THREE.TSL: No \"ConstNode\" found in node graph.' );\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n\tsetup( builder ) {\n\n\t\tconst object = builder.object;\n\n\t\tlet output = null;\n\n\t\tif ( object.count > 1 ) {\n\n\t\t\tconst minNode = this.getConstNode( this.minNode );\n\t\t\tconst maxNode = this.getConstNode( this.maxNode );\n\n\t\t\tconst minValue = minNode.value;\n\t\t\tconst maxValue = maxNode.value;\n\n\t\t\tconst minLength = builder.getTypeLength( getValueType( minValue ) );\n\t\t\tconst maxLength = builder.getTypeLength( getValueType( maxValue ) );\n\n\t\t\tmin = min || new Vector4();\n\t\t\tmax = max || new Vector4();\n\n\t\t\tmin.setScalar( 0 );\n\t\t\tmax.setScalar( 0 );\n\n\t\t\tif ( minLength === 1 ) min.setScalar( minValue );\n\t\t\telse if ( minValue.isColor ) min.set( minValue.r, minValue.g, minValue.b, 1 );\n\t\t\telse min.set( minValue.x, minValue.y, minValue.z || 0, minValue.w || 0 );\n\n\t\t\tif ( maxLength === 1 ) max.setScalar( maxValue );\n\t\t\telse if ( maxValue.isColor ) max.set( maxValue.r, maxValue.g, maxValue.b, 1 );\n\t\t\telse max.set( maxValue.x, maxValue.y, maxValue.z || 0, maxValue.w || 0 );\n\n\t\t\tconst stride = 4;\n\n\t\t\tconst length = stride * object.count;\n\t\t\tconst array = new Float32Array( length );\n\n\t\t\tfor ( let i = 0; i < length; i ++ ) {\n\n\t\t\t\tconst index = i % stride;\n\n\t\t\t\tconst minElementValue = min.getComponent( index );\n\t\t\t\tconst maxElementValue = max.getComponent( index );\n\n\t\t\t\tarray[ i ] = MathUtils.lerp( minElementValue, maxElementValue, Math.random() );\n\n\t\t\t}\n\n\t\t\tconst nodeType = this.getNodeType( builder );\n\n\t\t\tif ( object.count <= 4096 ) {\n\n\t\t\t\toutput = buffer( array, 'vec4', object.count ).element( instanceIndex ).convert( nodeType );\n\n\t\t\t} else {\n\n\t\t\t\t// TODO: Improve anonymous buffer attribute creation removing this part\n\t\t\t\tconst bufferAttribute = new InstancedBufferAttribute( array, 4 );\n\t\t\t\tbuilder.geometry.setAttribute( '__range' + this.id, bufferAttribute );\n\n\t\t\t\toutput = instancedBufferAttribute( bufferAttribute ).convert( nodeType );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\toutput = float( 0 );\n\n\t\t}\n\n\t\treturn output;\n\n\t}\n\n}\n\n/**\n * TSL function for creating a range node.\n *\n * @tsl\n * @function\n * @param {Node<any>} [minNode=float()] - A node defining the lower bound of the range.\n * @param {Node<any>} [maxNode=float()] - A node defining the upper bound of the range.\n * @returns {RangeNode}\n */\nconst range = /*@__PURE__*/ nodeProxy( RangeNode ).setParameterLength( 2 );\n\n/**\n * `ComputeBuiltinNode` represents a compute-scope builtin value that expose information\n * about the currently running dispatch and/or the device it is running on.\n *\n * This node can only be used with a WebGPU backend.\n *\n * @augments Node\n */\nclass ComputeBuiltinNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'ComputeBuiltinNode';\n\n\t}\n\n\t/**\n\t * Constructs a new compute builtin node.\n\t *\n\t * @param {string} builtinName - The built-in name.\n\t * @param {string} nodeType - The node type.\n\t */\n\tconstructor( builtinName, nodeType ) {\n\n\t\tsuper( nodeType );\n\n\t\t/**\n\t\t * The built-in name.\n\t\t *\n\t\t * @private\n\t\t * @type {string}\n\t\t */\n\t\tthis._builtinName = builtinName;\n\n\t}\n\n\t/**\n\t * This method is overwritten since hash is derived from the built-in name.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The hash.\n\t */\n\tgetHash( builder ) {\n\n\t\treturn this.getBuiltinName( builder );\n\n\t}\n\n\t/**\n\t * This method is overwritten since the node type is simply derived from `nodeType`..\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The node type.\n\t */\n\tgetNodeType( /*builder*/ ) {\n\n\t\treturn this.nodeType;\n\n\t}\n\n\t/**\n\t * Sets the builtin name.\n\t *\n\t * @param {string} builtinName - The built-in name.\n\t * @return {ComputeBuiltinNode} A reference to this node.\n\t */\n\tsetBuiltinName( builtinName ) {\n\n\t\tthis._builtinName = builtinName;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the builtin name.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The builtin name.\n\t */\n\tgetBuiltinName( /*builder*/ ) {\n\n\t\treturn this._builtinName;\n\n\t}\n\n\t/**\n\t * Whether the current node builder has the builtin or not.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {boolean} Whether the builder has the builtin or not.\n\t */\n\thasBuiltin( builder ) {\n\n\t\treturn builder.hasBuiltin( this._builtinName );\n\n\t}\n\n\tgenerate( builder, output ) {\n\n\t\tconst builtinName = this.getBuiltinName( builder );\n\t\tconst nodeType = this.getNodeType( builder );\n\n\t\tif ( builder.shaderStage === 'compute' ) {\n\n\t\t\treturn builder.format( builtinName, nodeType, output );\n\n\t\t} else {\n\n\t\t\twarn( `ComputeBuiltinNode: Compute built-in value ${builtinName} can not be accessed in the ${builder.shaderStage} stage` );\n\t\t\treturn builder.generateConst( nodeType );\n\n\t\t}\n\n\t}\n\n\tserialize( data ) {\n\n\t\tsuper.serialize( data );\n\n\t\tdata.global = this.global;\n\t\tdata._builtinName = this._builtinName;\n\n\t}\n\n\tdeserialize( data ) {\n\n\t\tsuper.deserialize( data );\n\n\t\tthis.global = data.global;\n\t\tthis._builtinName = data._builtinName;\n\n\t}\n\n}\n\n/**\n * TSL function for creating a compute builtin node.\n *\n * @tsl\n * @function\n * @param {string} name - The built-in name.\n * @param {string} nodeType - The node type.\n * @returns {ComputeBuiltinNode}\n */\nconst computeBuiltin = ( name, nodeType ) => new ComputeBuiltinNode( name, nodeType );\n\n/**\n * Represents the number of workgroups dispatched by the compute shader.\n * ```js\n * // Run 512 invocations/threads with a workgroup size of 128.\n * const computeFn = Fn(() => {\n *\n *     // numWorkgroups.x = 4\n *     storageBuffer.element(0).assign(numWorkgroups.x)\n *\n * })().compute(512, [128]);\n *\n * // Run 512 invocations/threads with the default workgroup size of 64.\n * const computeFn = Fn(() => {\n *\n *     // numWorkgroups.x = 8\n *     storageBuffer.element(0).assign(numWorkgroups.x)\n *\n * })().compute(512);\n * ```\n *\n * @tsl\n * @type {ComputeBuiltinNode<uvec3>}\n */\nconst numWorkgroups = /*@__PURE__*/ computeBuiltin( 'numWorkgroups', 'uvec3' );\n\n/**\n * Represents the 3-dimensional index of the workgroup the current compute invocation belongs to.\n * ```js\n * // Execute 12 compute threads with a workgroup size of 3.\n * const computeFn = Fn( () => {\n *\n * \tIf( workgroupId.x.mod( 2 ).equal( 0 ), () => {\n *\n * \t\tstorageBuffer.element( instanceIndex ).assign( instanceIndex );\n *\n * \t} ).Else( () => {\n *\n * \t\tstorageBuffer.element( instanceIndex ).assign( 0 );\n *\n * \t} );\n *\n * } )().compute( 12, [ 3 ] );\n *\n * // workgroupId.x =  [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3];\n * // Buffer Output =  [0, 1, 2, 0, 0, 0, 6, 7, 8, 0, 0, 0];\n * ```\n *\n * @tsl\n * @type {ComputeBuiltinNode<uvec3>}\n */\nconst workgroupId = /*@__PURE__*/ computeBuiltin( 'workgroupId', 'uvec3' );\n\n/**\n * A non-linearized 3-dimensional representation of the current invocation's position within a 3D global grid.\n *\n * @tsl\n * @type {ComputeBuiltinNode<uvec3>}\n */\nconst globalId = /*@__PURE__*/ computeBuiltin( 'globalId', 'uvec3' );\n/**\n * A non-linearized 3-dimensional representation of the current invocation's position within a 3D workgroup grid.\n *\n * @tsl\n * @type {ComputeBuiltinNode<uvec3>}\n */\nconst localId = /*@__PURE__*/ computeBuiltin( 'localId', 'uvec3' );\n\n/**\n * A device dependent variable that exposes the size of the current invocation's subgroup.\n *\n * @tsl\n * @type {ComputeBuiltinNode<uint>}\n */\nconst subgroupSize = /*@__PURE__*/ computeBuiltin( 'subgroupSize', 'uint' );\n\n/**\n * Represents a GPU control barrier that synchronizes compute operations within a given scope.\n *\n * This node can only be used with a WebGPU backend.\n *\n * @augments Node\n */\nclass BarrierNode extends Node {\n\n\t/**\n\t * Constructs a new barrier node.\n\t *\n\t * @param {string} scope - The scope defines the behavior of the node.\n\t */\n\tconstructor( scope ) {\n\n\t\tsuper();\n\n\t\tthis.scope = scope;\n\n\t}\n\n\tgenerate( builder ) {\n\n\t\tconst { scope } = this;\n\t\tconst { renderer } = builder;\n\n\t\tif ( renderer.backend.isWebGLBackend === true ) {\n\n\t\t\tbuilder.addFlowCode( `\\t// ${scope}Barrier \\n` );\n\n\t\t} else {\n\n\t\t\tbuilder.addLineFlowCode( `${scope}Barrier()`, this );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * TSL function for creating a barrier node.\n *\n * @tsl\n * @function\n * @param {string} scope - The scope defines the behavior of the node..\n * @returns {BarrierNode}\n */\nconst barrier = nodeProxy( BarrierNode );\n\n/**\n * TSL function for creating a workgroup barrier. All compute shader\n * invocations must wait for each invocation within a workgroup to\n * complete before the barrier can be surpassed.\n *\n * @tsl\n * @function\n * @returns {BarrierNode}\n */\nconst workgroupBarrier = () => barrier( 'workgroup' ).toStack();\n\n/**\n * TSL function for creating a storage barrier. All invocations must\n * wait for each access to variables within the 'storage' address space\n * to complete before the barrier can be passed.\n *\n * @tsl\n * @function\n * @returns {BarrierNode}\n */\nconst storageBarrier = () => barrier( 'storage' ).toStack();\n\n/**\n * TSL function for creating a texture barrier. All invocations must\n * wait for each access to variables within the 'texture' address space\n * to complete before the barrier can be passed.\n *\n * @tsl\n * @function\n * @returns {BarrierNode}\n */\nconst textureBarrier = () => barrier( 'texture' ).toStack();\n\n/**\n * Represents an element of a 'workgroup' scoped buffer.\n *\n * @augments ArrayElementNode\n */\nclass WorkgroupInfoElementNode extends ArrayElementNode {\n\n\t/**\n\t * Constructs a new workgroup info element node.\n\t *\n\t * @param {Node} workgroupInfoNode - The workgroup info node.\n\t * @param {Node} indexNode - The index node that defines the element access.\n\t */\n\tconstructor( workgroupInfoNode, indexNode ) {\n\n\t\tsuper( workgroupInfoNode, indexNode );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWorkgroupInfoElementNode = true;\n\n\t}\n\n\tgenerate( builder, output ) {\n\n\t\tlet snippet;\n\n\t\tconst isAssignContext = builder.context.assign;\n\t\tsnippet = super.generate( builder );\n\n\t\tif ( isAssignContext !== true ) {\n\n\t\t\tconst type = this.getNodeType( builder );\n\n\t\t\tsnippet = builder.format( snippet, type, output );\n\n\t\t}\n\n\t\t// TODO: Possibly activate clip distance index on index access rather than from clipping context\n\n\t\treturn snippet;\n\n\t}\n\n}\n\n/**\n * A node allowing the user to create a 'workgroup' scoped buffer within the\n * context of a compute shader. Typically, workgroup scoped buffers are\n * created to hold data that is transferred from a global storage scope into\n * a local workgroup scope. For invocations within a workgroup, data\n * access speeds on 'workgroup' scoped buffers can be significantly faster\n * than similar access operations on globally accessible storage buffers.\n *\n * This node can only be used with a WebGPU backend.\n *\n * @augments Node\n */\nclass WorkgroupInfoNode extends Node {\n\n\t/**\n\t * Constructs a new buffer scoped to type scope.\n\t *\n\t * @param {string} scope - TODO.\n\t * @param {string} bufferType - The data type of a 'workgroup' scoped buffer element.\n\t * @param {number} [bufferCount=0] - The number of elements in the buffer.\n\t */\n\tconstructor( scope, bufferType, bufferCount = 0 ) {\n\n\t\tsuper( bufferType );\n\n\t\t/**\n\t\t * The buffer type.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.bufferType = bufferType;\n\n\t\t/**\n\t\t * The buffer count.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.bufferCount = bufferCount;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWorkgroupInfoNode = true;\n\n\t\t/**\n\t\t * The data type of the array buffer.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.elementType = bufferType;\n\n\t\t/**\n\t\t * TODO.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.scope = scope;\n\n\t\t/**\n\t\t * The name of the workgroup scoped buffer.\n\t\t *\n\t\t * @type {string}\n\t\t * @default ''\n\t\t */\n\t\tthis.name = '';\n\n\t}\n\n\t/**\n\t * Sets the name of this node.\n\t *\n\t * @param {string} name - The name to set.\n\t * @return {WorkgroupInfoNode} A reference to this node.\n\t */\n\tsetName( name ) {\n\n\t\tthis.name = name;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the name/label of this node.\n\t *\n\t * @deprecated\n\t * @param {string} name - The name to set.\n\t * @return {WorkgroupInfoNode} A reference to this node.\n\t */\n\tlabel( name ) {\n\n\t\twarn( 'TSL: \"label()\" has been deprecated. Use \"setName()\" instead.' ); // @deprecated r179\n\n\t\treturn this.setName( name );\n\n\t}\n\n\t/**\n\t * Sets the scope of this node.\n\t *\n\t * @param {string} scope - The scope to set.\n\t * @return {WorkgroupInfoNode} A reference to this node.\n\t */\n\tsetScope( scope ) {\n\n\t\tthis.scope = scope;\n\n\t\treturn this;\n\n\t}\n\n\n\t/**\n\t * The data type of the array buffer.\n\t *\n\t * @return {string} The element type.\n\t */\n\tgetElementType() {\n\n\t\treturn this.elementType;\n\n\t}\n\n\t/**\n\t * Overwrites the default implementation since the input type\n\t * is inferred from the scope.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The input type.\n\t */\n\tgetInputType( /*builder*/ ) {\n\n\t\treturn `${this.scope}Array`;\n\n\t}\n\n\t/**\n\t * This method can be used to access elements via an index node.\n\t *\n\t * @param {IndexNode} indexNode - indexNode.\n\t * @return {WorkgroupInfoElementNode} A reference to an element.\n\t */\n\telement( indexNode ) {\n\n\t\treturn new WorkgroupInfoElementNode( this, indexNode );\n\n\t}\n\n\tgenerate( builder ) {\n\n\t\tconst name = ( this.name !== '' ) ? this.name : `${this.scope}Array_${this.id}`;\n\n\t\treturn builder.getScopedArray( name, this.scope.toLowerCase(), this.bufferType, this.bufferCount );\n\n\t}\n\n}\n\n/**\n * TSL function for creating a workgroup info node.\n * Creates a new 'workgroup' scoped array buffer.\n *\n * @tsl\n * @function\n * @param {string} type - The data type of a 'workgroup' scoped buffer element.\n * @param {number} [count=0] - The number of elements in the buffer.\n * @returns {WorkgroupInfoNode}\n */\nconst workgroupArray = ( type, count ) => new WorkgroupInfoNode( 'Workgroup', type, count );\n\n/**\n * `AtomicFunctionNode` represents any function that can operate on atomic variable types\n * within a shader. In an atomic function, any modification to an atomic variable will\n * occur as an indivisible step with a defined order relative to other modifications.\n * Accordingly, even if multiple atomic functions are modifying an atomic variable at once\n * atomic operations will not interfere with each other.\n *\n * This node can only be used with a WebGPU backend.\n *\n * @augments Node\n */\nclass AtomicFunctionNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'AtomicFunctionNode';\n\n\t}\n\n\t/**\n\t * Constructs a new atomic function node.\n\t *\n\t * @param {string} method - The signature of the atomic function to construct.\n\t * @param {Node} pointerNode - An atomic variable or element of an atomic buffer.\n\t * @param {Node} valueNode - The value that mutates the atomic variable.\n\t */\n\tconstructor( method, pointerNode, valueNode ) {\n\n\t\tsuper( 'uint' );\n\n\t\t/**\n\t\t * The signature of the atomic function to construct.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.method = method;\n\n\t\t/**\n\t\t * An atomic variable or element of an atomic buffer.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.pointerNode = pointerNode;\n\n\t\t/**\n\t\t * A value that modifies the atomic variable.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.valueNode = valueNode;\n\n\t\t/**\n\t\t * Creates a list of the parents for this node for detecting if the node needs to return a value.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.parents = true;\n\n\t}\n\n\t/**\n\t * Overwrites the default implementation to return the type of\n\t * the pointer node.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The input type.\n\t */\n\tgetInputType( builder ) {\n\n\t\treturn this.pointerNode.getNodeType( builder );\n\n\t}\n\n\t/**\n\t * Overwritten since the node type is inferred from the input type.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t * @return {string} The node type.\n\t */\n\tgetNodeType( builder ) {\n\n\t\treturn this.getInputType( builder );\n\n\t}\n\n\tgenerate( builder ) {\n\n\t\tconst properties = builder.getNodeProperties( this );\n\t\tconst parents = properties.parents;\n\n\t\tconst method = this.method;\n\n\t\tconst type = this.getNodeType( builder );\n\t\tconst inputType = this.getInputType( builder );\n\n\t\tconst a = this.pointerNode;\n\t\tconst b = this.valueNode;\n\n\t\tconst params = [];\n\n\t\tparams.push( `&${ a.build( builder, inputType ) }` );\n\n\t\tif ( b !== null ) {\n\n\t\t\tparams.push( b.build( builder, inputType ) );\n\n\n\t\t}\n\n\t\tconst methodSnippet = `${ builder.getMethod( method, type ) }( ${ params.join( ', ' ) } )`;\n\t\tconst isVoid = parents ? ( parents.length === 1 && parents[ 0 ].isStackNode === true ) : false;\n\n\t\tif ( isVoid ) {\n\n\t\t\tbuilder.addLineFlowCode( methodSnippet, this );\n\n\t\t} else {\n\n\t\t\tif ( properties.constNode === undefined ) {\n\n\t\t\t\tproperties.constNode = expression( methodSnippet, type ).toConst();\n\n\t\t\t}\n\n\t\t\treturn properties.constNode.build( builder );\n\n\t\t}\n\n\t}\n\n}\n\nAtomicFunctionNode.ATOMIC_LOAD = 'atomicLoad';\nAtomicFunctionNode.ATOMIC_STORE = 'atomicStore';\nAtomicFunctionNode.ATOMIC_ADD = 'atomicAdd';\nAtomicFunctionNode.ATOMIC_SUB = 'atomicSub';\nAtomicFunctionNode.ATOMIC_MAX = 'atomicMax';\nAtomicFunctionNode.ATOMIC_MIN = 'atomicMin';\nAtomicFunctionNode.ATOMIC_AND = 'atomicAnd';\nAtomicFunctionNode.ATOMIC_OR = 'atomicOr';\nAtomicFunctionNode.ATOMIC_XOR = 'atomicXor';\n\n/**\n * TSL function for creating an atomic function node.\n *\n * @tsl\n * @function\n * @param {string} method - The signature of the atomic function to construct.\n * @param {Node} pointerNode - An atomic variable or element of an atomic buffer.\n * @param {Node} valueNode - The value that mutates the atomic variable.\n * @returns {AtomicFunctionNode}\n */\nconst atomicNode = nodeProxy( AtomicFunctionNode );\n\n/**\n * TSL function for appending an atomic function call into the programmatic flow of a compute shader.\n *\n * @tsl\n * @function\n * @param {string} method - The signature of the atomic function to construct.\n * @param {Node} pointerNode - An atomic variable or element of an atomic buffer.\n * @param {Node} valueNode - The value that mutates the atomic variable.\n * @returns {AtomicFunctionNode}\n */\nconst atomicFunc = ( method, pointerNode, valueNode ) => {\n\n\treturn atomicNode( method, pointerNode, valueNode ).toStack();\n\n};\n\n/**\n * Loads the value stored in the atomic variable.\n *\n * @tsl\n * @function\n * @param {Node} pointerNode - An atomic variable or element of an atomic buffer.\n * @returns {AtomicFunctionNode}\n */\nconst atomicLoad = ( pointerNode ) => atomicFunc( AtomicFunctionNode.ATOMIC_LOAD, pointerNode, null );\n\n/**\n * Stores a value in the atomic variable.\n *\n * @tsl\n * @function\n * @param {Node} pointerNode - An atomic variable or element of an atomic buffer.\n * @param {Node} valueNode - The value that mutates the atomic variable.\n * @returns {AtomicFunctionNode}\n */\nconst atomicStore = ( pointerNode, valueNode ) => atomicFunc( AtomicFunctionNode.ATOMIC_STORE, pointerNode, valueNode );\n\n/**\n * Increments the value stored in the atomic variable.\n *\n * @tsl\n * @function\n * @param {Node} pointerNode - An atomic variable or element of an atomic buffer.\n * @param {Node} valueNode - The value that mutates the atomic variable.\n * @returns {AtomicFunctionNode}\n */\nconst atomicAdd = ( pointerNode, valueNode ) => atomicFunc( AtomicFunctionNode.ATOMIC_ADD, pointerNode, valueNode );\n\n/**\n * Decrements the value stored in the atomic variable.\n *\n * @tsl\n * @function\n * @param {Node} pointerNode - An atomic variable or element of an atomic buffer.\n * @param {Node} valueNode - The value that mutates the atomic variable.\n * @returns {AtomicFunctionNode}\n */\nconst atomicSub = ( pointerNode, valueNode ) => atomicFunc( AtomicFunctionNode.ATOMIC_SUB, pointerNode, valueNode );\n\n/**\n * Stores in an atomic variable the maximum between its current value and a parameter.\n *\n * @tsl\n * @function\n * @param {Node} pointerNode - An atomic variable or element of an atomic buffer.\n * @param {Node} valueNode - The value that mutates the atomic variable.\n * @returns {AtomicFunctionNode}\n */\nconst atomicMax = ( pointerNode, valueNode ) => atomicFunc( AtomicFunctionNode.ATOMIC_MAX, pointerNode, valueNode );\n\n/**\n * Stores in an atomic variable the minimum between its current value and a parameter.\n *\n * @tsl\n * @function\n * @param {Node} pointerNode - An atomic variable or element of an atomic buffer.\n * @param {Node} valueNode - The value that mutates the atomic variable.\n * @returns {AtomicFunctionNode}\n */\nconst atomicMin = ( pointerNode, valueNode ) => atomicFunc( AtomicFunctionNode.ATOMIC_MIN, pointerNode, valueNode );\n\n/**\n * Stores in an atomic variable the bitwise AND of its value with a parameter.\n *\n * @tsl\n * @function\n * @param {Node} pointerNode - An atomic variable or element of an atomic buffer.\n * @param {Node} valueNode - The value that mutates the atomic variable.\n * @returns {AtomicFunctionNode}\n */\nconst atomicAnd = ( pointerNode, valueNode ) => atomicFunc( AtomicFunctionNode.ATOMIC_AND, pointerNode, valueNode );\n\n/**\n * Stores in an atomic variable the bitwise OR of its value with a parameter.\n *\n * @tsl\n * @function\n * @param {Node} pointerNode - An atomic variable or element of an atomic buffer.\n * @param {Node} valueNode - The value that mutates the atomic variable.\n * @returns {AtomicFunctionNode}\n */\nconst atomicOr = ( pointerNode, valueNode ) => atomicFunc( AtomicFunctionNode.ATOMIC_OR, pointerNode, valueNode );\n\n/**\n * Stores in an atomic variable the bitwise XOR of its value with a parameter.\n *\n * @tsl\n * @function\n * @param {Node} pointerNode - An atomic variable or element of an atomic buffer.\n * @param {Node} valueNode - The value that mutates the atomic variable.\n * @returns {AtomicFunctionNode}\n */\nconst atomicXor = ( pointerNode, valueNode ) => atomicFunc( AtomicFunctionNode.ATOMIC_XOR, pointerNode, valueNode );\n\n/**\n * This class represents a set of built in WGSL shader functions that sync\n * synchronously execute an operation across a subgroup, or 'warp', of compute\n * or fragment shader invocations within a workgroup. Typically, these functions\n * will synchronously execute an operation using data from all active invocations\n * within the subgroup, then broadcast that result to all active invocations. In\n * other graphics APIs, subgroup functions are also referred to as wave intrinsics\n * (DirectX/HLSL) or warp intrinsics (CUDA).\n *\n * @augments TempNode\n */\nclass SubgroupFunctionNode extends TempNode {\n\n\tstatic get type() {\n\n\t\treturn 'SubgroupFunctionNode';\n\n\t}\n\n\t/**\n\t * Constructs a new function node.\n\t *\n\t * @param {string} method - The subgroup/wave intrinsic method to construct.\n\t * @param {Node} [aNode=null] - The method's first argument.\n\t * @param {Node} [bNode=null] - The method's second argument.\n\t */\n\tconstructor( method, aNode = null, bNode = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The subgroup/wave intrinsic method to construct.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.method = method;\n\n\t\t/**\n\t\t * The method's first argument.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.aNode = aNode;\n\n\t\t/**\n\t\t * The method's second argument.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.bNode = bNode;\n\n\t}\n\n\tgetInputType( builder ) {\n\n\t\tconst aType = this.aNode ? this.aNode.getNodeType( builder ) : null;\n\t\tconst bType = this.bNode ? this.bNode.getNodeType( builder ) : null;\n\n\t\tconst aLen = builder.isMatrix( aType ) ? 0 : builder.getTypeLength( aType );\n\t\tconst bLen = builder.isMatrix( bType ) ? 0 : builder.getTypeLength( bType );\n\n\t\tif ( aLen > bLen ) {\n\n\t\t\treturn aType;\n\n\t\t} else {\n\n\t\t\treturn bType;\n\n\t\t}\n\n\t}\n\n\tgetNodeType( builder ) {\n\n\t\tconst method = this.method;\n\n\t\tif ( method === SubgroupFunctionNode.SUBGROUP_ELECT ) {\n\n\t\t\treturn 'bool';\n\n\t\t} else if ( method === SubgroupFunctionNode.SUBGROUP_BALLOT ) {\n\n\t\t\treturn 'uvec4';\n\n\t\t} else {\n\n\t\t\treturn this.getInputType( builder );\n\n\t\t}\n\n\t}\n\n\tgenerate( builder, output ) {\n\n\t\tconst method = this.method;\n\n\t\tconst type = this.getNodeType( builder );\n\t\tconst inputType = this.getInputType( builder );\n\n\t\tconst a = this.aNode;\n\t\tconst b = this.bNode;\n\n\t\tconst params = [];\n\n\t\tif (\n\t\t\tmethod === SubgroupFunctionNode.SUBGROUP_BROADCAST ||\n\t\t\tmethod === SubgroupFunctionNode.SUBGROUP_SHUFFLE ||\n\t\t\tmethod === SubgroupFunctionNode.QUAD_BROADCAST\n\t\t) {\n\n\t\t\tconst bType = b.getNodeType( builder );\n\n\t\t\tparams.push(\n\t\t\t\ta.build( builder, type ),\n\t\t\t\tb.build( builder, bType === 'float' ? 'int' : type )\n\t\t\t);\n\n\t\t} else if (\n\t\t\tmethod === SubgroupFunctionNode.SUBGROUP_SHUFFLE_XOR ||\n\t\t\tmethod === SubgroupFunctionNode.SUBGROUP_SHUFFLE_DOWN ||\n\t\t\tmethod === SubgroupFunctionNode.SUBGROUP_SHUFFLE_UP\n\t\t) {\n\n\t\t\tparams.push(\n\t\t\t\ta.build( builder, type ),\n\t\t\t\tb.build( builder, 'uint' )\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tif ( a !== null ) params.push( a.build( builder, inputType ) );\n\t\t\tif ( b !== null ) params.push( b.build( builder, inputType ) );\n\n\t\t}\n\n\t\tconst paramsString = params.length === 0 ? '()' : `( ${params.join( ', ' )} )`;\n\n\t\treturn builder.format( `${ builder.getMethod( method, type ) }${paramsString}`, type, output );\n\n\n\n\t}\n\n\tserialize( data ) {\n\n\t\tsuper.serialize( data );\n\n\t\tdata.method = this.method;\n\n\t}\n\n\tdeserialize( data ) {\n\n\t\tsuper.deserialize( data );\n\n\t\tthis.method = data.method;\n\n\t}\n\n}\n\n// 0 inputs\nSubgroupFunctionNode.SUBGROUP_ELECT = 'subgroupElect';\n\n// 1 input\nSubgroupFunctionNode.SUBGROUP_BALLOT = 'subgroupBallot';\nSubgroupFunctionNode.SUBGROUP_ADD = 'subgroupAdd';\nSubgroupFunctionNode.SUBGROUP_INCLUSIVE_ADD = 'subgroupInclusiveAdd';\nSubgroupFunctionNode.SUBGROUP_EXCLUSIVE_AND = 'subgroupExclusiveAdd';\nSubgroupFunctionNode.SUBGROUP_MUL = 'subgroupMul';\nSubgroupFunctionNode.SUBGROUP_INCLUSIVE_MUL = 'subgroupInclusiveMul';\nSubgroupFunctionNode.SUBGROUP_EXCLUSIVE_MUL = 'subgroupExclusiveMul';\nSubgroupFunctionNode.SUBGROUP_AND = 'subgroupAnd';\nSubgroupFunctionNode.SUBGROUP_OR = 'subgroupOr';\nSubgroupFunctionNode.SUBGROUP_XOR = 'subgroupXor';\nSubgroupFunctionNode.SUBGROUP_MIN = 'subgroupMin';\nSubgroupFunctionNode.SUBGROUP_MAX = 'subgroupMax';\nSubgroupFunctionNode.SUBGROUP_ALL = 'subgroupAll';\nSubgroupFunctionNode.SUBGROUP_ANY = 'subgroupAny';\nSubgroupFunctionNode.SUBGROUP_BROADCAST_FIRST = 'subgroupBroadcastFirst';\nSubgroupFunctionNode.QUAD_SWAP_X = 'quadSwapX';\nSubgroupFunctionNode.QUAD_SWAP_Y = 'quadSwapY';\nSubgroupFunctionNode.QUAD_SWAP_DIAGONAL = 'quadSwapDiagonal';\n\n// 2 inputs\nSubgroupFunctionNode.SUBGROUP_BROADCAST = 'subgroupBroadcast';\nSubgroupFunctionNode.SUBGROUP_SHUFFLE = 'subgroupShuffle';\nSubgroupFunctionNode.SUBGROUP_SHUFFLE_XOR = 'subgroupShuffleXor';\nSubgroupFunctionNode.SUBGROUP_SHUFFLE_UP = 'subgroupShuffleUp';\nSubgroupFunctionNode.SUBGROUP_SHUFFLE_DOWN = 'subgroupShuffleDown';\nSubgroupFunctionNode.QUAD_BROADCAST = 'quadBroadcast';\n\n\n\n/**\n * Returns true if this invocation has the lowest subgroup_invocation_id\n * among active invocations in the subgroup.\n *\n * @tsl\n * @method\n * @return {bool} The result of the computation.\n */\nconst subgroupElect = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.SUBGROUP_ELECT ).setParameterLength( 0 );\n\n/**\n * Returns a set of bitfields where the bit corresponding to subgroup_invocation_id\n * is 1 if pred is true for that active invocation and 0 otherwise.\n *\n * @tsl\n * @method\n * @param {bool} pred - A boolean that sets the bit corresponding to the invocations subgroup invocation id.\n * @return {vec4<u32>}- A bitfield corresponding to the pred value of each subgroup invocation.\n */\nconst subgroupBallot = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.SUBGROUP_BALLOT ).setParameterLength( 1 );\n\n/**\n * A reduction that adds e among all active invocations and returns that result.\n *\n * @tsl\n * @method\n * @param {number} e - The value provided to the reduction by the current invocation.\n * @return {number} The accumulated result of the reduction operation.\n */\nconst subgroupAdd = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.SUBGROUP_ADD ).setParameterLength( 1 );\n\n/**\n * An inclusive scan returning the sum of e for all active invocations with subgroup_invocation_id less than or equal to this invocation.\n *\n * @tsl\n * @method\n * @param {number} e - The value provided to the inclusive scan by the current invocation.\n * @return {number} The accumulated result of the inclusive scan operation.\n */\nconst subgroupInclusiveAdd = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.SUBGROUP_INCLUSIVE_ADD ).setParameterLength( 1 );\n\n/**\n * An exclusive scan that returns the sum of e for all active invocations with subgroup_invocation_id less than this invocation.\n *\n * @tsl\n * @method\n * @param {number} e - The value provided to the exclusive scan by the current invocation.\n * @return {number} The accumulated result of the exclusive scan operation.\n */\nconst subgroupExclusiveAdd = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.SUBGROUP_EXCLUSIVE_AND ).setParameterLength( 1 );\n\n/**\n * A reduction that multiplies e among all active invocations and returns that result.\n *\n * @tsl\n * @method\n * @param {number} e - The value provided to the reduction by the current invocation.\n * @return {number} The accumulated result of the reduction operation.\n */\nconst subgroupMul = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.SUBGROUP_MUL ).setParameterLength( 1 );\n\n/**\n * An inclusive scan returning the product of e for all active invocations with subgroup_invocation_id less than or equal to this invocation.\n *\n * @tsl\n * @method\n * @param {number} e - The value provided to the inclusive scan by the current invocation.\n * @return {number} The accumulated result of the inclusive scan operation.\n */\nconst subgroupInclusiveMul = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.SUBGROUP_INCLUSIVE_MUL ).setParameterLength( 1 );\n\n/**\n * An exclusive scan that returns the product of e for all active invocations with subgroup_invocation_id less than this invocation.\n *\n * @tsl\n * @method\n * @param {number} e - The value provided to the exclusive scan by the current invocation.\n * @return {number} The accumulated result of the exclusive scan operation.\n */\nconst subgroupExclusiveMul = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.SUBGROUP_EXCLUSIVE_MUL ).setParameterLength( 1 );\n\n/**\n * A reduction that performs a bitwise and of e among all active invocations and returns that result.\n *\n * @tsl\n * @method\n * @param {number} e - The value provided to the reduction by the current invocation.\n * @return {number} The result of the reduction operation.\n */\nconst subgroupAnd = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.SUBGROUP_AND ).setParameterLength( 1 );\n\n/**\n * A reduction that performs a bitwise or of e among all active invocations and returns that result.\n *\n * @tsl\n * @method\n * @param {number} e - The value provided to the reduction by the current invocation.\n * @return {number} The result of the reduction operation.\n */\nconst subgroupOr = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.SUBGROUP_OR ).setParameterLength( 1 );\n\n/**\n * A reduction that performs a bitwise xor of e among all active invocations and returns that result.\n *\n * @tsl\n * @method\n * @param {number} e - The value provided to the reduction by the current invocation.\n * @return {number} The result of the reduction operation.\n */\nconst subgroupXor = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.SUBGROUP_XOR ).setParameterLength( 1 );\n\n/**\n * A reduction that performs a min of e among all active invocations and returns that result.\n *\n * @tsl\n * @method\n * @param {number} e - The value provided to the reduction by the current invocation.\n * @return {number} The result of the reduction operation.\n */\nconst subgroupMin = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.SUBGROUP_MIN ).setParameterLength( 1 );\n\n/**\n * A reduction that performs a max of e among all active invocations and returns that result.\n *\n * @tsl\n * @method\n * @param {number} e - The value provided to the reduction by the current invocation.\n * @return {number} The result of the reduction operation.\n */\nconst subgroupMax = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.SUBGROUP_MAX ).setParameterLength( 1 );\n\n/**\n * Returns true if e is true for all active invocations in the subgroup.\n *\n * @tsl\n * @method\n * @return {bool} The result of the computation.\n */\nconst subgroupAll = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.SUBGROUP_ALL ).setParameterLength( 0 );\n\n/**\n * Returns true if e is true for any active invocation in the subgroup\n *\n * @tsl\n * @method\n * @return {bool} The result of the computation.\n */\nconst subgroupAny = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.SUBGROUP_ANY ).setParameterLength( 0 );\n\n/**\n * Broadcasts e from the active invocation with the lowest subgroup_invocation_id in the subgroup to all other active invocations.\n *\n * @tsl\n * @method\n * @param {number} e - The value to broadcast from the lowest subgroup invocation.\n * @param {number} id - The subgroup invocation to broadcast from.\n * @return {number} The broadcast value.\n */\nconst subgroupBroadcastFirst = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.SUBGROUP_BROADCAST_FIRST ).setParameterLength( 2 );\n\n/**\n * Swaps e between invocations in the quad in the X direction.\n *\n * @tsl\n * @method\n * @param {number} e - The value to swap from the current invocation.\n * @return {number} The value received from the swap operation.\n */\nconst quadSwapX = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.QUAD_SWAP_X ).setParameterLength( 1 );\n\n/**\n * Swaps e between invocations in the quad in the Y direction.\n *\n * @tsl\n * @method\n * @param {number} e - The value to swap from the current invocation.\n * @return {number} The value received from the swap operation.\n */\nconst quadSwapY = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.QUAD_SWAP_Y ).setParameterLength( 1 );\n\n/**\n * Swaps e between invocations in the quad diagonally.\n *\n * @tsl\n * @method\n * @param {number} e - The value to swap from the current invocation.\n * @return {number} The value received from the swap operation.\n */\nconst quadSwapDiagonal = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.QUAD_SWAP_DIAGONAL ).setParameterLength( 1 );\n\n/**\n * Broadcasts e from the invocation whose subgroup_invocation_id matches id, to all active invocations.\n *\n * @tsl\n * @method\n * @param {number} e - The value to broadcast from subgroup invocation 'id'.\n * @param {number} id - The subgroup invocation to broadcast from.\n * @return {number} The broadcast value.\n */\nconst subgroupBroadcast = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.SUBGROUP_BROADCAST ).setParameterLength( 2 );\n\n/**\n * Returns v from the active invocation whose subgroup_invocation_id matches id\n *\n * @tsl\n * @method\n * @param {number} v - The value to return from subgroup invocation id^mask.\n * @param {number} id - The subgroup invocation which returns the value v.\n * @return {number} The broadcast value.\n */\nconst subgroupShuffle = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.SUBGROUP_SHUFFLE ).setParameterLength( 2 );\n\n/**\n * Returns v from the active invocation whose subgroup_invocation_id matches subgroup_invocation_id ^ mask.\n *\n * @tsl\n * @method\n * @param {number} v - The value to return from subgroup invocation id^mask.\n * @param {number} mask - A bitmask that determines the target invocation via a XOR operation.\n * @return {number} The broadcast value.\n */\nconst subgroupShuffleXor = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.SUBGROUP_SHUFFLE_XOR ).setParameterLength( 2 );\n\n/**\n * Returns v from the active invocation whose subgroup_invocation_id matches subgroup_invocation_id - delta\n *\n * @tsl\n * @method\n * @param {number} v - The value to return from subgroup invocation id^mask.\n * @param {number} delta - A value that offsets the current in.\n * @return {number} The broadcast value.\n */\nconst subgroupShuffleUp = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.SUBGROUP_SHUFFLE_UP ).setParameterLength( 2 );\n\n/**\n * Returns v from the active invocation whose subgroup_invocation_id matches subgroup_invocation_id + delta\n *\n * @tsl\n * @method\n * @param {number} v - The value to return from subgroup invocation id^mask.\n * @param {number} delta - A value that offsets the current subgroup invocation.\n * @return {number} The broadcast value.\n */\nconst subgroupShuffleDown = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.SUBGROUP_SHUFFLE_DOWN ).setParameterLength( 2 );\n\n/**\n * Broadcasts e from the quad invocation with id equal to id.\n *\n * @tsl\n * @method\n * @param {number} e - The value to broadcast.\n * @return {number} The broadcast value.\n */\nconst quadBroadcast = /*@__PURE__*/ nodeProxyIntent( SubgroupFunctionNode, SubgroupFunctionNode.QUAD_BROADCAST ).setParameterLength( 1 );\n\nlet uniformsLib;\n\nfunction getLightData( light ) {\n\n\tuniformsLib = uniformsLib || new WeakMap();\n\n\tlet uniforms = uniformsLib.get( light );\n\n\tif ( uniforms === undefined ) uniformsLib.set( light, uniforms = {} );\n\n\treturn uniforms;\n\n}\n\n/**\n * TSL function for getting a shadow matrix uniform node for the given light.\n *\n * @tsl\n * @function\n * @param {Light} light -The light source.\n * @returns {UniformNode<mat4>} The shadow matrix uniform node.\n */\nfunction lightShadowMatrix( light ) {\n\n\tconst data = getLightData( light );\n\n\treturn data.shadowMatrix || ( data.shadowMatrix = uniform( 'mat4' ).setGroup( renderGroup ).onRenderUpdate( ( frame ) => {\n\n\t\t// normally, shadow matrices are updated in ShadowNode. However, if the shadow matrix is used outside\n\t\t// of shadow rendering (like in ProjectorLightNode), the shadow matrix still requires an update\n\n\t\tif ( light.castShadow !== true || frame.renderer.shadowMap.enabled === false ) {\n\n\t\t\tif ( light.shadow.camera.coordinateSystem !== frame.camera.coordinateSystem ) {\n\n\t\t\t\tlight.shadow.camera.coordinateSystem = frame.camera.coordinateSystem;\n\t\t\t\tlight.shadow.camera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\tlight.shadow.updateMatrices( light );\n\n\t\t}\n\n\t\treturn light.shadow.matrix;\n\n\t} ) );\n\n}\n\n/**\n * TSL function for getting projected uv coordinates for the given light.\n * Relevant when using maps with spot lights.\n *\n * @tsl\n * @function\n * @param {Light} light -The light source.\n * @param {Node<vec3>} [position=positionWorld] -The position to project.\n * @returns {Node<vec3>} The projected uvs.\n */\nfunction lightProjectionUV( light, position = positionWorld ) {\n\n\tconst spotLightCoord = lightShadowMatrix( light ).mul( position );\n\tconst projectionUV = spotLightCoord.xyz.div( spotLightCoord.w );\n\n\treturn projectionUV;\n\n}\n\n/**\n * TSL function for getting the position in world space for the given light.\n *\n * @tsl\n * @function\n * @param {Light} light -The light source.\n * @returns {UniformNode<vec3>} The light's position in world space.\n */\nfunction lightPosition( light ) {\n\n\tconst data = getLightData( light );\n\n\treturn data.position || ( data.position = uniform( new Vector3() ).setGroup( renderGroup ).onRenderUpdate( ( _, self ) => self.value.setFromMatrixPosition( light.matrixWorld ) ) );\n\n}\n\n/**\n * TSL function for getting the light target position in world space for the given light.\n *\n * @tsl\n * @function\n * @param {Light} light -The light source.\n * @returns {UniformNode<vec3>} The light target position in world space.\n */\nfunction lightTargetPosition( light ) {\n\n\tconst data = getLightData( light );\n\n\treturn data.targetPosition || ( data.targetPosition = uniform( new Vector3() ).setGroup( renderGroup ).onRenderUpdate( ( _, self ) => self.value.setFromMatrixPosition( light.target.matrixWorld ) ) );\n\n}\n\n/**\n * TSL function for getting the position in view space for the given light.\n *\n * @tsl\n * @function\n * @param {Light} light - The light source.\n * @returns {UniformNode<vec3>} The light's position in view space.\n */\nfunction lightViewPosition( light ) {\n\n\tconst data = getLightData( light );\n\n\treturn data.viewPosition || ( data.viewPosition = uniform( new Vector3() ).setGroup( renderGroup ).onRenderUpdate( ( { camera }, self ) => {\n\n\t\tself.value = self.value || new Vector3();\n\t\tself.value.setFromMatrixPosition( light.matrixWorld );\n\n\t\tself.value.applyMatrix4( camera.matrixWorldInverse );\n\n\t} ) );\n\n}\n\n/**\n * TSL function for getting the light target direction for the given light.\n *\n * @tsl\n * @function\n * @param {Light} light -The light source.\n * @returns {Node<vec3>} The light's target direction.\n */\nconst lightTargetDirection = ( light ) => cameraViewMatrix.transformDirection( lightPosition( light ).sub( lightTargetPosition( light ) ) );\n\nconst sortLights = ( lights ) => {\n\n\treturn lights.sort( ( a, b ) => a.id - b.id );\n\n};\n\nconst getLightNodeById = ( id, lightNodes ) => {\n\n\tfor ( const lightNode of lightNodes ) {\n\n\t\tif ( lightNode.isAnalyticLightNode && lightNode.light.id === id ) {\n\n\t\t\treturn lightNode;\n\n\t\t}\n\n\t}\n\n\treturn null;\n\n};\n\nconst _lightsNodeRef = /*@__PURE__*/ new WeakMap();\nconst _hashData = [];\n\n/**\n * This node represents the scene's lighting and manages the lighting model's life cycle\n * for the current build 3D object. It is responsible for computing the total outgoing\n * light in a given lighting context.\n *\n * @augments Node\n */\nclass LightsNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'LightsNode';\n\n\t}\n\n\t/**\n\t * Constructs a new lights node.\n\t */\n\tconstructor() {\n\n\t\tsuper( 'vec3' );\n\n\t\t/**\n\t\t * A node representing the total diffuse light.\n\t\t *\n\t\t * @type {Node<vec3>}\n\t\t */\n\t\tthis.totalDiffuseNode = property( 'vec3', 'totalDiffuse' );\n\n\t\t/**\n\t\t * A node representing the total specular light.\n\t\t *\n\t\t * @type {Node<vec3>}\n\t\t */\n\t\tthis.totalSpecularNode = property( 'vec3', 'totalSpecular' );\n\n\t\t/**\n\t\t * A node representing the outgoing light.\n\t\t *\n\t\t * @type {Node<vec3>}\n\t\t */\n\t\tthis.outgoingLightNode = property( 'vec3', 'outgoingLight' );\n\n\t\t/**\n\t\t * An array representing the lights in the scene.\n\t\t *\n\t\t * @private\n\t\t * @type {Array<Light>}\n\t\t */\n\t\tthis._lights = [];\n\n\t\t/**\n\t\t * For each light in the scene, this node will create a\n\t\t * corresponding light node.\n\t\t *\n\t\t * @private\n\t\t * @type {?Array<LightingNode>}\n\t\t * @default null\n\t\t */\n\t\tthis._lightNodes = null;\n\n\t\t/**\n\t\t * A hash for identifying the current light nodes setup.\n\t\t *\n\t\t * @private\n\t\t * @type {?string}\n\t\t * @default null\n\t\t */\n\t\tthis._lightNodesHash = null;\n\n\t\t/**\n\t\t * `LightsNode` sets this property to `true` by default.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.global = true;\n\n\t}\n\n\t/**\n\t * Overwrites the default {@link Node#customCacheKey} implementation by including\n\t * light data into the cache key.\n\t *\n\t * @return {number} The custom cache key.\n\t */\n\tcustomCacheKey() {\n\n\t\tconst lights = this._lights;\n\n\t\tfor ( let i = 0; i < lights.length; i ++ ) {\n\n\t\t\tconst light = lights[ i ];\n\n\t\t\t_hashData.push( light.id );\n\t\t\t_hashData.push( light.castShadow ? 1 : 0 );\n\n\t\t\tif ( light.isSpotLight === true ) {\n\n\t\t\t\tconst hashMap = ( light.map !== null ) ? light.map.id : -1;\n\t\t\t\tconst hashColorNode = ( light.colorNode ) ? light.colorNode.getCacheKey() : -1;\n\n\t\t\t\t_hashData.push( hashMap, hashColorNode );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst cacheKey = hashArray( _hashData );\n\n\t\t_hashData.length = 0;\n\n\t\treturn cacheKey;\n\n\t}\n\n\t/**\n\t * Computes a hash value for identifying the current light nodes setup.\n\t *\n\t * @param {NodeBuilder} builder - A reference to the current node builder.\n\t * @return {string} The computed hash.\n\t */\n\tgetHash( builder ) {\n\n\t\tif ( this._lightNodesHash === null ) {\n\n\t\t\tif ( this._lightNodes === null ) this.setupLightsNode( builder );\n\n\t\t\tconst hash = [];\n\n\t\t\tfor ( const lightNode of this._lightNodes ) {\n\n\t\t\t\thash.push( lightNode.getHash() );\n\n\t\t\t}\n\n\t\t\tthis._lightNodesHash = 'lights-' + hash.join( ',' );\n\n\t\t}\n\n\t\treturn this._lightNodesHash;\n\n\t}\n\n\tanalyze( builder ) {\n\n\t\tconst properties = builder.getNodeProperties( this );\n\n\t\tfor ( const node of properties.nodes ) {\n\n\t\t\tnode.build( builder );\n\n\t\t}\n\n\t\tproperties.outputNode.build( builder );\n\n\t}\n\n\t/**\n\t * Creates lighting nodes for each scene light. This makes it possible to further\n\t * process lights in the node system.\n\t *\n\t * @param {NodeBuilder} builder - A reference to the current node builder.\n\t */\n\tsetupLightsNode( builder ) {\n\n\t\tconst lightNodes = [];\n\n\t\tconst previousLightNodes = this._lightNodes;\n\n\t\tconst lights = sortLights( this._lights );\n\t\tconst nodeLibrary = builder.renderer.library;\n\n\t\tfor ( const light of lights ) {\n\n\t\t\tif ( light.isNode ) {\n\n\t\t\t\tlightNodes.push( nodeObject( light ) );\n\n\t\t\t} else {\n\n\t\t\t\tlet lightNode = null;\n\n\t\t\t\tif ( previousLightNodes !== null ) {\n\n\t\t\t\t\tlightNode = getLightNodeById( light.id, previousLightNodes ); // reuse existing light node\n\n\t\t\t\t}\n\n\t\t\t\tif ( lightNode === null ) {\n\n\t\t\t\t\t// find the corresponding node type for a given light\n\n\t\t\t\t\tconst lightNodeClass = nodeLibrary.getLightNodeClass( light.constructor );\n\n\t\t\t\t\tif ( lightNodeClass === null ) {\n\n\t\t\t\t\t\twarn( `LightsNode.setupNodeLights: Light node not found for ${ light.constructor.name }` );\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlet lightNode = null;\n\n\t\t\t\t\tif ( ! _lightsNodeRef.has( light ) ) {\n\n\t\t\t\t\t\tlightNode = new lightNodeClass( light );\n\t\t\t\t\t\t_lightsNodeRef.set( light, lightNode );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tlightNode = _lightsNodeRef.get( light );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tlightNodes.push( lightNode );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._lightNodes = lightNodes;\n\n\t}\n\n\t/**\n\t * Sets up a direct light in the lighting model.\n\t *\n\t * @param {Object} builder - The builder object containing the context and stack.\n\t * @param {Object} lightNode - The light node.\n\t * @param {Object} lightData - The light object containing color and direction properties.\n\t */\n\tsetupDirectLight( builder, lightNode, lightData ) {\n\n\t\tconst { lightingModel, reflectedLight } = builder.context;\n\n\t\tlightingModel.direct( {\n\t\t\t...lightData,\n\t\t\tlightNode,\n\t\t\treflectedLight\n\t\t}, builder );\n\n\t}\n\n\tsetupDirectRectAreaLight( builder, lightNode, lightData ) {\n\n\t\tconst { lightingModel, reflectedLight } = builder.context;\n\n\t\tlightingModel.directRectArea( {\n\t\t\t...lightData,\n\t\t\tlightNode,\n\t\t\treflectedLight\n\t\t}, builder );\n\n\t}\n\n\t/**\n\t * Setups the internal lights by building all respective\n\t * light nodes.\n\t *\n\t * @param {NodeBuilder} builder - A reference to the current node builder.\n\t * @param {Array<LightingNode>} lightNodes - An array of lighting nodes.\n\t */\n\tsetupLights( builder, lightNodes ) {\n\n\t\tfor ( const lightNode of lightNodes ) {\n\n\t\t\tlightNode.build( builder );\n\n\t\t}\n\n\t}\n\n\tgetLightNodes( builder ) {\n\n\t\tif ( this._lightNodes === null ) this.setupLightsNode( builder );\n\n\t\treturn this._lightNodes;\n\n\t}\n\n\t/**\n\t * The implementation makes sure that for each light in the scene\n\t * there is a corresponding light node. By building the light nodes\n\t * and evaluating the lighting model the outgoing light is computed.\n\t *\n\t * @param {NodeBuilder} builder - A reference to the current node builder.\n\t * @return {Node<vec3>} A node representing the outgoing light.\n\t */\n\tsetup( builder ) {\n\n\t\tconst currentLightsNode = builder.lightsNode;\n\n\t\tbuilder.lightsNode = this;\n\n\t\t//\n\n\t\tlet outgoingLightNode = this.outgoingLightNode;\n\n\t\tconst context = builder.context;\n\t\tconst lightingModel = context.lightingModel;\n\n\t\tconst properties = builder.getNodeProperties( this );\n\n\t\tif ( lightingModel ) {\n\n\t\t\tconst { totalDiffuseNode, totalSpecularNode } = this;\n\n\t\t\tcontext.outgoingLight = outgoingLightNode;\n\n\t\t\tconst stack = builder.addStack();\n\n\t\t\t//\n\n\t\t\tproperties.nodes = stack.nodes;\n\n\t\t\t//\n\n\t\t\tlightingModel.start( builder );\n\n\t\t\t//\n\n\t\t\tconst { backdrop, backdropAlpha } = context;\n\t\t\tconst { directDiffuse, directSpecular, indirectDiffuse, indirectSpecular } = context.reflectedLight;\n\n\t\t\tlet totalDiffuse = directDiffuse.add( indirectDiffuse );\n\n\t\t\tif ( backdrop !== null ) {\n\n\t\t\t\tif ( backdropAlpha !== null ) {\n\n\t\t\t\t\ttotalDiffuse = vec3( backdropAlpha.mix( totalDiffuse, backdrop ) );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttotalDiffuse = vec3( backdrop );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\ttotalDiffuseNode.assign( totalDiffuse );\n\t\t\ttotalSpecularNode.assign( directSpecular.add( indirectSpecular ) );\n\n\t\t\toutgoingLightNode.assign( totalDiffuseNode.add( totalSpecularNode ) );\n\n\t\t\t//\n\n\t\t\tlightingModel.finish( builder );\n\n\t\t\t//\n\n\t\t\toutgoingLightNode = outgoingLightNode.bypass( builder.removeStack() );\n\n\t\t} else {\n\n\t\t\tproperties.nodes = [];\n\n\t\t}\n\n\t\t//\n\n\t\tbuilder.lightsNode = currentLightsNode;\n\n\t\treturn outgoingLightNode;\n\n\t}\n\n\t/**\n\t * Configures this node with an array of lights.\n\t *\n\t * @param {Array<Light>} lights - An array of lights.\n\t * @return {LightsNode} A reference to this node.\n\t */\n\tsetLights( lights ) {\n\n\t\tthis._lights = lights;\n\n\t\tthis._lightNodes = null;\n\t\tthis._lightNodesHash = null;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns an array of the scene's lights.\n\t *\n\t * @return {Array<Light>} The scene's lights.\n\t */\n\tgetLights() {\n\n\t\treturn this._lights;\n\n\t}\n\n\t/**\n\t * Whether the scene has lights or not.\n\t *\n\t * @type {boolean}\n\t */\n\tget hasLights() {\n\n\t\treturn this._lights.length > 0;\n\n\t}\n\n}\n\n/**\n * TSL function for creating an instance of `LightsNode` and configuring\n * it with the given array of lights.\n *\n * @tsl\n * @function\n * @param {Array<Light>} lights - An array of lights.\n * @return {LightsNode} The created lights node.\n */\nconst lights = ( lights = [] ) => new LightsNode().setLights( lights );\n\n/**\n * Base class for all shadow nodes.\n *\n * Shadow nodes encapsulate shadow related logic and are always coupled to lighting nodes.\n * Lighting nodes might share the same shadow node type or use specific ones depending on\n * their requirements.\n *\n * @augments Node\n */\nclass ShadowBaseNode extends Node {\n\n\tstatic get type() {\n\n\t\treturn 'ShadowBaseNode';\n\n\t}\n\n\t/**\n\t * Constructs a new shadow base node.\n\t *\n\t * @param {Light} light - The shadow casting light.\n\t */\n\tconstructor( light ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The shadow casting light.\n\t\t *\n\t\t * @type {Light}\n\t\t */\n\t\tthis.light = light;\n\n\t\t/**\n\t\t * Overwritten since shadows are updated by default per render.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'render'\n\t\t */\n\t\tthis.updateBeforeType = NodeUpdateType.RENDER;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isShadowBaseNode = true;\n\n\t}\n\n\t/**\n\t * Setups the shadow position node which is by default the predefined TSL node object `shadowPositionWorld`.\n\t *\n\t * @param {NodeBuilder} object - A configuration object that must at least hold a material reference.\n\t */\n\tsetupShadowPosition( { context, material } ) {\n\n\t\t// Use assign inside an Fn()\n\n\t\tshadowPositionWorld.assign( material.receivedShadowPositionNode || context.shadowPositionWorld || positionWorld );\n\n\t}\n\n}\n\n/**\n * TSL object that represents the vertex position in world space during the shadow pass.\n *\n * @tsl\n * @type {Node<vec3>}\n */\nconst shadowPositionWorld = /*@__PURE__*/ property( 'vec3', 'shadowPositionWorld' );\n\n/**\n * Saves the state of the given renderer and stores it into the given state object.\n *\n * If not state object is provided, the function creates one.\n *\n * @private\n * @function\n * @param {Renderer} renderer - The renderer.\n * @param {Object} [state={}] - The state.\n * @return {Object} The state.\n */\nfunction saveRendererState( renderer, state = {} ) {\n\n\tstate.toneMapping = renderer.toneMapping;\n\tstate.toneMappingExposure = renderer.toneMappingExposure;\n\tstate.outputColorSpace = renderer.outputColorSpace;\n\tstate.renderTarget = renderer.getRenderTarget();\n\tstate.activeCubeFace = renderer.getActiveCubeFace();\n\tstate.activeMipmapLevel = renderer.getActiveMipmapLevel();\n\tstate.renderObjectFunction = renderer.getRenderObjectFunction();\n\tstate.pixelRatio = renderer.getPixelRatio();\n\tstate.mrt = renderer.getMRT();\n\tstate.clearColor = renderer.getClearColor( state.clearColor || new Color() );\n\tstate.clearAlpha = renderer.getClearAlpha();\n\tstate.autoClear = renderer.autoClear;\n\tstate.scissorTest = renderer.getScissorTest();\n\n\treturn state;\n\n}\n\n/**\n * Saves the state of the given renderer and stores it into the given state object.\n * Besides, the function also resets the state of the renderer to its default values.\n *\n * If not state object is provided, the function creates one.\n *\n * @private\n * @function\n * @param {Renderer} renderer - The renderer.\n * @param {Object} [state={}] - The state.\n * @return {Object} The state.\n */\nfunction resetRendererState( renderer, state ) {\n\n\tstate = saveRendererState( renderer, state );\n\n\trenderer.setMRT( null );\n\trenderer.setRenderObjectFunction( null );\n\trenderer.setClearColor( 0x000000, 1 );\n\trenderer.autoClear = true;\n\n\treturn state;\n\n}\n\n/**\n * Restores the state of the given renderer from the given state object.\n *\n * @private\n * @function\n * @param {Renderer} renderer - The renderer.\n * @param {Object} state - The state to restore.\n */\nfunction restoreRendererState( renderer, state ) {\n\n\trenderer.toneMapping = state.toneMapping;\n\trenderer.toneMappingExposure = state.toneMappingExposure;\n\trenderer.outputColorSpace = state.outputColorSpace;\n\trenderer.setRenderTarget( state.renderTarget, state.activeCubeFace, state.activeMipmapLevel );\n\trenderer.setRenderObjectFunction( state.renderObjectFunction );\n\trenderer.setPixelRatio( state.pixelRatio );\n\trenderer.setMRT( state.mrt );\n\trenderer.setClearColor( state.clearColor, state.clearAlpha );\n\trenderer.autoClear = state.autoClear;\n\trenderer.setScissorTest( state.scissorTest );\n\n}\n\n/**\n * Saves the state of the given scene and stores it into the given state object.\n *\n * If not state object is provided, the function creates one.\n *\n * @private\n * @function\n * @param {Scene} scene - The scene.\n * @param {Object} [state={}] - The state.\n * @return {Object} The state.\n */\nfunction saveSceneState( scene, state = {} ) {\n\n\tstate.background = scene.background;\n\tstate.backgroundNode = scene.backgroundNode;\n\tstate.overrideMaterial = scene.overrideMaterial;\n\n\treturn state;\n\n}\n\n/**\n * Saves the state of the given scene and stores it into the given state object.\n * Besides, the function also resets the state of the scene to its default values.\n *\n * If not state object is provided, the function creates one.\n *\n * @private\n * @function\n * @param {Scene} scene - The scene.\n * @param {Object} [state={}] - The state.\n * @return {Object} The state.\n */\nfunction resetSceneState( scene, state ) {\n\n\tstate = saveSceneState( scene, state );\n\n\tscene.background = null;\n\tscene.backgroundNode = null;\n\tscene.overrideMaterial = null;\n\n\treturn state;\n\n}\n\n/**\n * Restores the state of the given scene from the given state object.\n *\n * @private\n * @function\n * @param {Scene} scene - The scene.\n * @param {Object} state - The state to restore.\n */\nfunction restoreSceneState( scene, state ) {\n\n\tscene.background = state.background;\n\tscene.backgroundNode = state.backgroundNode;\n\tscene.overrideMaterial = state.overrideMaterial;\n\n}\n\n/**\n * Saves the state of the given renderer and scene and stores it into the given state object.\n *\n * If not state object is provided, the function creates one.\n *\n * @private\n * @function\n * @param {Renderer} renderer - The renderer.\n * @param {Scene} scene - The scene.\n * @param {Object} [state={}] - The state.\n * @return {Object} The state.\n */\nfunction saveRendererAndSceneState( renderer, scene, state = {} ) {\n\n\tstate = saveRendererState( renderer, state );\n\tstate = saveSceneState( scene, state );\n\n\treturn state;\n\n}\n\n/**\n * Saves the state of the given renderer and scene and stores it into the given state object.\n * Besides, the function also resets the state of the renderer and scene to its default values.\n *\n * If not state object is provided, the function creates one.\n *\n * @private\n * @function\n * @param {Renderer} renderer - The renderer.\n * @param {Scene} scene - The scene.\n * @param {Object} [state={}] - The state.\n * @return {Object} The state.\n */\nfunction resetRendererAndSceneState( renderer, scene, state ) {\n\n\tstate = resetRendererState( renderer, state );\n\tstate = resetSceneState( scene, state );\n\n\treturn state;\n\n}\n\n/**\n * Restores the state of the given renderer and scene from the given state object.\n *\n * @private\n * @function\n * @param {Renderer} renderer - The renderer.\n * @param {Scene} scene - The scene.\n * @param {Object} state - The state to restore.\n */\nfunction restoreRendererAndSceneState( renderer, scene, state ) {\n\n\trestoreRendererState( renderer, state );\n\trestoreSceneState( scene, state );\n\n}\n\nvar RendererUtils = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tresetRendererAndSceneState: resetRendererAndSceneState,\n\tresetRendererState: resetRendererState,\n\tresetSceneState: resetSceneState,\n\trestoreRendererAndSceneState: restoreRendererAndSceneState,\n\trestoreRendererState: restoreRendererState,\n\trestoreSceneState: restoreSceneState,\n\tsaveRendererAndSceneState: saveRendererAndSceneState,\n\tsaveRendererState: saveRendererState,\n\tsaveSceneState: saveSceneState\n});\n\nconst shadowMaterialLib = /*@__PURE__*/ new WeakMap();\n\n/**\n * A shadow filtering function performing basic filtering. This is in fact an unfiltered version of the shadow map\n * with a binary `[0,1]` result.\n *\n * @method\n * @param {Object} inputs - The input parameter object.\n * @param {DepthTexture} inputs.depthTexture - A reference to the shadow map's texture data.\n * @param {Node<vec3>} inputs.shadowCoord - The shadow coordinates.\n * @return {Node<float>} The filtering result.\n */\nconst BasicShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord, depthLayer } ) => {\n\n\tlet basic = texture( depthTexture, shadowCoord.xy ).setName( 't_basic' );\n\n\tif ( depthTexture.isArrayTexture ) {\n\n\t\tbasic = basic.depth( depthLayer );\n\n\t}\n\n\treturn basic.compare( shadowCoord.z );\n\n} );\n\n/**\n * A shadow filtering function performing PCF filtering with Vogel disk sampling and IGN.\n *\n * Uses 5 samples distributed via Vogel disk pattern, rotated per-pixel using Interleaved\n * Gradient Noise (IGN) to break up banding artifacts. Combined with hardware PCF (4-tap\n * filtering per sample), this effectively provides 20 filtered taps with better distribution.\n *\n * @method\n * @param {Object} inputs - The input parameter object.\n * @param {DepthTexture} inputs.depthTexture - A reference to the shadow map's texture data.\n * @param {Node<vec3>} inputs.shadowCoord - The shadow coordinates.\n * @param {LightShadow} inputs.shadow - The light shadow.\n * @return {Node<float>} The filtering result.\n */\nconst PCFShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord, shadow, depthLayer } ) => {\n\n\tconst depthCompare = ( uv, compare ) => {\n\n\t\tlet depth = texture( depthTexture, uv );\n\n\t\tif ( depthTexture.isArrayTexture ) {\n\n\t\t\tdepth = depth.depth( depthLayer );\n\n\t\t}\n\n\t\treturn depth.compare( compare );\n\n\t};\n\n\tconst mapSize = reference( 'mapSize', 'vec2', shadow ).setGroup( renderGroup );\n\tconst radius = reference( 'radius', 'float', shadow ).setGroup( renderGroup );\n\n\tconst texelSize = vec2( 1 ).div( mapSize );\n\tconst radiusScaled = radius.mul( texelSize.x );\n\n\t// Use IGN to rotate sampling pattern per pixel (phi = IGN * 2\u03C0)\n\tconst phi = interleavedGradientNoise( screenCoordinate.xy ).mul( 6.28318530718 );\n\n\t// 5 samples using Vogel disk distribution\n\treturn add(\n\t\tdepthCompare( shadowCoord.xy.add( vogelDiskSample( 0, 5, phi ).mul( radiusScaled ) ), shadowCoord.z ),\n\t\tdepthCompare( shadowCoord.xy.add( vogelDiskSample( 1, 5, phi ).mul( radiusScaled ) ), shadowCoord.z ),\n\t\tdepthCompare( shadowCoord.xy.add( vogelDiskSample( 2, 5, phi ).mul( radiusScaled ) ), shadowCoord.z ),\n\t\tdepthCompare( shadowCoord.xy.add( vogelDiskSample( 3, 5, phi ).mul( radiusScaled ) ), shadowCoord.z ),\n\t\tdepthCompare( shadowCoord.xy.add( vogelDiskSample( 4, 5, phi ).mul( radiusScaled ) ), shadowCoord.z )\n\t).mul( 1 / 5 );\n\n} );\n\n/**\n * A shadow filtering function performing PCF soft filtering.\n *\n * @method\n * @param {Object} inputs - The input parameter object.\n * @param {DepthTexture} inputs.depthTexture - A reference to the shadow map's texture data.\n * @param {Node<vec3>} inputs.shadowCoord - The shadow coordinates.\n * @param {LightShadow} inputs.shadow - The light shadow.\n * @return {Node<float>} The filtering result.\n */\nconst PCFSoftShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord, shadow, depthLayer } ) => {\n\n\tconst depthCompare = ( uv, compare ) => {\n\n\t\tlet depth = texture( depthTexture, uv );\n\n\t\tif ( depthTexture.isArrayTexture ) {\n\n\t\t\tdepth = depth.depth( depthLayer );\n\n\t\t}\n\n\t\treturn depth.compare( compare );\n\n\t};\n\n\n\tconst mapSize = reference( 'mapSize', 'vec2', shadow ).setGroup( renderGroup );\n\n\tconst texelSize = vec2( 1 ).div( mapSize );\n\tconst dx = texelSize.x;\n\tconst dy = texelSize.y;\n\n\tconst uv = shadowCoord.xy;\n\tconst f = fract( uv.mul( mapSize ).add( 0.5 ) );\n\tuv.subAssign( f.mul( texelSize ) );\n\n\treturn add(\n\t\tdepthCompare( uv, shadowCoord.z ),\n\t\tdepthCompare( uv.add( vec2( dx, 0 ) ), shadowCoord.z ),\n\t\tdepthCompare( uv.add( vec2( 0, dy ) ), shadowCoord.z ),\n\t\tdepthCompare( uv.add( texelSize ), shadowCoord.z ),\n\t\tmix(\n\t\t\tdepthCompare( uv.add( vec2( dx.negate(), 0 ) ), shadowCoord.z ),\n\t\t\tdepthCompare( uv.add( vec2( dx.mul( 2 ), 0 ) ), shadowCoord.z ),\n\t\t\tf.x\n\t\t),\n\t\tmix(\n\t\t\tdepthCompare( uv.add( vec2( dx.negate(), dy ) ), shadowCoord.z ),\n\t\t\tdepthCompare( uv.add( vec2( dx.mul( 2 ), dy ) ), shadowCoord.z ),\n\t\t\tf.x\n\t\t),\n\t\tmix(\n\t\t\tdepthCompare( uv.add( vec2( 0, dy.negate() ) ), shadowCoord.z ),\n\t\t\tdepthCompare( uv.add( vec2( 0, dy.mul( 2 ) ) ), shadowCoord.z ),\n\t\t\tf.y\n\t\t),\n\t\tmix(\n\t\t\tdepthCompare( uv.add( vec2( dx, dy.negate() ) ), shadowCoord.z ),\n\t\t\tdepthCompare( uv.add( vec2( dx, dy.mul( 2 ) ) ), shadowCoord.z ),\n\t\t\tf.y\n\t\t),\n\t\tmix(\n\t\t\tmix(\n\t\t\t\tdepthCompare( uv.add( vec2( dx.negate(), dy.negate() ) ), shadowCoord.z ),\n\t\t\t\tdepthCompare( uv.add( vec2( dx.mul( 2 ), dy.negate() ) ), shadowCoord.z ),\n\t\t\t\tf.x\n\t\t\t),\n\t\t\tmix(\n\t\t\t\tdepthCompare( uv.add( vec2( dx.negate(), dy.mul( 2 ) ) ), shadowCoord.z ),\n\t\t\t\tdepthCompare( uv.add( vec2( dx.mul( 2 ), dy.mul( 2 ) ) ), shadowCoord.z ),\n\t\t\t\tf.x\n\t\t\t),\n\t\t\tf.y\n\t\t)\n\t).mul( 1 / 9 );\n\n} );\n\n/**\n * A shadow filtering function performing VSM filtering.\n *\n * @method\n * @param {Object} inputs - The input parameter object.\n * @param {DepthTexture} inputs.depthTexture - A reference to the shadow map's texture data.\n * @param {Node<vec3>} inputs.shadowCoord - The shadow coordinates.\n * @return {Node<float>} The filtering result.\n */\nconst VSMShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, shadowCoord, depthLayer } ) => {\n\n\tlet distribution = texture( depthTexture ).sample( shadowCoord.xy );\n\n\tif ( depthTexture.isArrayTexture ) {\n\n\t\tdistribution = distribution.depth( depthLayer );\n\n\t}\n\n\tdistribution = distribution.rg;\n\n\tconst mean = distribution.x;\n\tconst variance = max$1( 0.0000001, distribution.y.mul( distribution.y ) );\n\n\tconst hardShadow = step( shadowCoord.z, mean );\n\n\t// Early return if fully lit\n\tIf( hardShadow.equal( 1.0 ), () => {\n\n\t\treturn float( 1.0 );\n\n\t} );\n\n\t// Distance from mean\n\tconst d = shadowCoord.z.sub( mean );\n\n\t// Chebyshev's inequality for upper bound on probability\n\tlet p_max = variance.div( variance.add( d.mul( d ) ) );\n\n\t// Reduce light bleeding by remapping [amount, 1] to [0, 1]\n\tp_max = clamp( sub( p_max, 0.3 ).div( 0.65 ) );\n\n\treturn max$1( hardShadow, p_max );\n\n} );\n\n//\n\nconst linearDistance = /*@__PURE__*/ Fn( ( [ position, cameraNear, cameraFar ] ) => {\n\n\tlet dist = positionWorld.sub( position ).length();\n\tdist = dist.sub( cameraNear ).div( cameraFar.sub( cameraNear ) );\n\tdist = dist.saturate(); // clamp to [ 0, 1 ]\n\n\treturn dist;\n\n} );\n\nconst linearShadowDistance = ( light ) => {\n\n\tconst camera = light.shadow.camera;\n\n\tconst nearDistance = reference( 'near', 'float', camera ).setGroup( renderGroup );\n\tconst farDistance = reference( 'far', 'float', camera ).setGroup( renderGroup );\n\n\tconst referencePosition = objectPosition( light );\n\n\treturn linearDistance( referencePosition, nearDistance, farDistance );\n\n};\n\n/**\n * Retrieves or creates a shadow material for the given light source.\n *\n * This function checks if a shadow material already exists for the provided light.\n * If not, it creates a new `NodeMaterial` configured for shadow rendering and stores it\n * in the `shadowMaterialLib` for future use.\n *\n * @tsl\n * @function\n * @param {Light} light - The light source for which the shadow material is needed.\n *                         If the light is a point light, a depth node is calculated\n *                         using the linear shadow distance.\n * @returns {NodeMaterial} The shadow material associated with the given light.\n */\nconst getShadowMaterial = ( light ) => {\n\n\tlet material = shadowMaterialLib.get( light );\n\n\tif ( material === undefined ) {\n\n\t\tconst depthNode = light.isPointLight ? linearShadowDistance( light ) : null;\n\n\t\tmaterial = new NodeMaterial();\n\t\tmaterial.colorNode = vec4( 0, 0, 0, 1 );\n\t\tmaterial.depthNode = depthNode;\n\t\tmaterial.isShadowPassMaterial = true; // Use to avoid other overrideMaterial override material.colorNode unintentionally when using material.shadowNode\n\t\tmaterial.name = 'ShadowMaterial';\n\t\tmaterial.fog = false;\n\n\t\tshadowMaterialLib.set( light, material );\n\n\t}\n\n\treturn material;\n\n};\n\n/**\n * Disposes the shadow material for the given light source.\n *\n * @param {Light} light - The light source.\n */\nconst disposeShadowMaterial = ( light ) => {\n\n\tconst material = shadowMaterialLib.get( light );\n\n\tif ( material !== undefined ) {\n\n\t\tmaterial.dispose();\n\t\tshadowMaterialLib.delete( light );\n\n\t}\n\n};\n\n//\n\nconst _shadowRenderObjectLibrary = /*@__PURE__*/ new ChainMap();\nconst _shadowRenderObjectKeys = [];\n\n/**\n * Creates a function to render shadow objects in a scene.\n *\n * @tsl\n * @function\n * @param {Renderer} renderer - The renderer.\n * @param {LightShadow} shadow - The light shadow object containing shadow properties.\n * @param {number} shadowType - The type of shadow map (e.g., BasicShadowMap).\n * @param {boolean} useVelocity - Whether to use velocity data for rendering.\n * @return {shadowRenderObjectFunction} A function that renders shadow objects.\n */\nconst getShadowRenderObjectFunction = ( renderer, shadow, shadowType, useVelocity ) => {\n\n\t_shadowRenderObjectKeys[ 0 ] = renderer;\n\t_shadowRenderObjectKeys[ 1 ] = shadow;\n\n\tlet renderObjectFunction = _shadowRenderObjectLibrary.get( _shadowRenderObjectKeys );\n\n\tif ( renderObjectFunction === undefined || ( renderObjectFunction.shadowType !== shadowType || renderObjectFunction.useVelocity !== useVelocity ) ) {\n\n\t\trenderObjectFunction = ( object, scene, _camera, geometry, material, group, ...params ) => {\n\n\t\t\tif ( object.castShadow === true || ( object.receiveShadow && shadowType === VSMShadowMap ) ) {\n\n\t\t\t\tif ( useVelocity ) {\n\n\t\t\t\t\tgetDataFromObject( object ).useVelocity = true;\n\n\t\t\t\t}\n\n\t\t\t\tobject.onBeforeShadow( renderer, object, _camera, shadow.camera, geometry, scene.overrideMaterial, group );\n\n\t\t\t\trenderer.renderObject( object, scene, _camera, geometry, material, group, ...params );\n\n\t\t\t\tobject.onAfterShadow( renderer, object, _camera, shadow.camera, geometry, scene.overrideMaterial, group );\n\n\t\t\t}\n\n\t\t};\n\n\t\trenderObjectFunction.shadowType = shadowType;\n\t\trenderObjectFunction.useVelocity = useVelocity;\n\n\t\t_shadowRenderObjectLibrary.set( _shadowRenderObjectKeys, renderObjectFunction );\n\n\t}\n\n\t_shadowRenderObjectKeys[ 0 ] = null;\n\t_shadowRenderObjectKeys[ 1 ] = null;\n\n\treturn renderObjectFunction;\n\n};\n\n/**\n * Represents the shader code for the first VSM render pass.\n *\n * @private\n * @method\n * @param {Object} inputs - The input parameter object.\n * @param {Node<float>} inputs.samples - The number of samples\n * @param {Node<float>} inputs.radius - The radius.\n * @param {Node<float>} inputs.size - The size.\n * @param {TextureNode} inputs.shadowPass - A reference to the render target's depth data.\n * @return {Node<vec2>} The VSM output.\n */\nconst VSMPassVertical = /*@__PURE__*/ Fn( ( { samples, radius, size, shadowPass, depthLayer } ) => {\n\n\tconst mean = float( 0 ).toVar( 'meanVertical' );\n\tconst squaredMean = float( 0 ).toVar( 'squareMeanVertical' );\n\n\tconst uvStride = samples.lessThanEqual( float( 1 ) ).select( float( 0 ), float( 2 ).div( samples.sub( 1 ) ) );\n\tconst uvStart = samples.lessThanEqual( float( 1 ) ).select( float( 0 ), float( -1 ) );\n\n\tLoop( { start: int( 0 ), end: int( samples ), type: 'int', condition: '<' }, ( { i } ) => {\n\n\t\tconst uvOffset = uvStart.add( float( i ).mul( uvStride ) );\n\n\t\tlet depth = shadowPass.sample( add( screenCoordinate.xy, vec2( 0, uvOffset ).mul( radius ) ).div( size ) );\n\n\t\tif ( shadowPass.value.isArrayTexture ) {\n\n\t\t\tdepth = depth.depth( depthLayer );\n\n\t\t}\n\n\t\tdepth = depth.x;\n\n\t\tmean.addAssign( depth );\n\t\tsquaredMean.addAssign( depth.mul( depth ) );\n\n\t} );\n\n\tmean.divAssign( samples );\n\tsquaredMean.divAssign( samples );\n\n\tconst std_dev = sqrt( squaredMean.sub( mean.mul( mean ) ).max( 0 ) );\n\treturn vec2( mean, std_dev );\n\n} );\n\n/**\n * Represents the shader code for the second VSM render pass.\n *\n * @private\n * @method\n * @param {Object} inputs - The input parameter object.\n * @param {Node<float>} inputs.samples - The number of samples\n * @param {Node<float>} inputs.radius - The radius.\n * @param {Node<float>} inputs.size - The size.\n * @param {TextureNode} inputs.shadowPass - The result of the first VSM render pass.\n * @return {Node<vec2>} The VSM output.\n */\nconst VSMPassHorizontal = /*@__PURE__*/ Fn( ( { samples, radius, size, shadowPass, depthLayer } ) => {\n\n\tconst mean = float( 0 ).toVar( 'meanHorizontal' );\n\tconst squaredMean = float( 0 ).toVar( 'squareMeanHorizontal' );\n\n\tconst uvStride = samples.lessThanEqual( float( 1 ) ).select( float( 0 ), float( 2 ).div( samples.sub( 1 ) ) );\n\tconst uvStart = samples.lessThanEqual( float( 1 ) ).select( float( 0 ), float( -1 ) );\n\n\tLoop( { start: int( 0 ), end: int( samples ), type: 'int', condition: '<' }, ( { i } ) => {\n\n\t\tconst uvOffset = uvStart.add( float( i ).mul( uvStride ) );\n\n\t\tlet distribution = shadowPass.sample( add( screenCoordinate.xy, vec2( uvOffset, 0 ).mul( radius ) ).div( size ) );\n\n\t\tif ( shadowPass.value.isArrayTexture ) {\n\n\t\t\tdistribution = distribution.depth( depthLayer );\n\n\t\t}\n\n\t\tmean.addAssign( distribution.x );\n\t\tsquaredMean.addAssign( add( distribution.y.mul( distribution.y ), distribution.x.mul( distribution.x ) ) );\n\n\t} );\n\n\tmean.divAssign( samples );\n\tsquaredMean.divAssign( samples );\n\n\tconst std_dev = sqrt( squaredMean.sub( mean.mul( mean ) ).max( 0 ) );\n\treturn vec2( mean, std_dev );\n\n} );\n\nconst _shadowFilterLib = [ BasicShadowFilter, PCFShadowFilter, PCFSoftShadowFilter, VSMShadowFilter ];\n\n//\n\nlet _rendererState;\nconst _quadMesh = /*@__PURE__*/ new QuadMesh();\n\n/**\n * Represents the default shadow implementation for lighting nodes.\n *\n * @augments ShadowBaseNode\n */\nclass ShadowNode extends ShadowBaseNode {\n\n\tstatic get type() {\n\n\t\treturn 'ShadowNode';\n\n\t}\n\n\t/**\n\t * Constructs a new shadow node.\n\t *\n\t * @param {Light} light - The shadow casting light.\n\t * @param {?LightShadow} [shadow=null] - An optional light shadow.\n\t */\n\tconstructor( light, shadow = null ) {\n\n\t\tsuper( light );\n\n\t\t/**\n\t\t * The light shadow which defines the properties light's\n\t\t * shadow.\n\t\t *\n\t\t * @type {?LightShadow}\n\t\t * @default null\n\t\t */\n\t\tthis.shadow = shadow || light.shadow;\n\n\t\t/**\n\t\t * A reference to the shadow map which is a render target.\n\t\t *\n\t\t * @type {?RenderTarget}\n\t\t * @default null\n\t\t */\n\t\tthis.shadowMap = null;\n\n\t\t/**\n\t\t * Only relevant for VSM shadows. Render target for the\n\t\t * first VSM render pass.\n\t\t *\n\t\t * @type {?RenderTarget}\n\t\t * @default null\n\t\t */\n\t\tthis.vsmShadowMapVertical = null;\n\n\t\t/**\n\t\t * Only relevant for VSM shadows. Render target for the\n\t\t * second VSM render pass.\n\t\t *\n\t\t * @type {?RenderTarget}\n\t\t * @default null\n\t\t */\n\t\tthis.vsmShadowMapHorizontal = null;\n\n\t\t/**\n\t\t * Only relevant for VSM shadows. Node material which\n\t\t * is used to render the first VSM pass.\n\t\t *\n\t\t * @type {?NodeMaterial}\n\t\t * @default null\n\t\t */\n\t\tthis.vsmMaterialVertical = null;\n\n\t\t/**\n\t\t * Only relevant for VSM shadows. Node material which\n\t\t * is used to render the second VSM pass.\n\t\t *\n\t\t * @type {?NodeMaterial}\n\t\t * @default null\n\t\t */\n\t\tthis.vsmMaterialHorizontal = null;\n\n\t\t/**\n\t\t * A reference to the output node which defines the\n\t\t * final result of this shadow node.\n\t\t *\n\t\t * @type {?Node}\n\t\t * @private\n\t\t * @default null\n\t\t */\n\t\tthis._node = null;\n\n\t\t/**\n\t\t * The current shadow map type of this shadow node.\n\t\t *\n\t\t * @type {?number}\n\t\t * @private\n\t\t * @default null\n\t\t */\n\t\tthis._currentShadowType = null;\n\n\t\t/**\n\t\t * A Weak Map holding the current frame ID per camera. Used\n\t\t * to control the update of shadow maps.\n\t\t *\n\t\t * @type {WeakMap<Camera,number>}\n\t\t * @private\n\t\t */\n\t\tthis._cameraFrameId = new WeakMap();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isShadowNode = true;\n\n\t\t/**\n\t\t * This index can be used when overriding setupRenderTarget with a RenderTarget Array to specify the depth layer.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.depthLayer = 0;\n\n\t}\n\n\t/**\n\t * Setups the shadow filtering.\n\t *\n\t * @param {NodeBuilder} builder - A reference to the current node builder.\n\t * @param {Object} inputs - A configuration object that defines the shadow filtering.\n\t * @param {Function} inputs.filterFn - This function defines the filtering type of the shadow map e.g. PCF.\n\t * @param {DepthTexture} inputs.depthTexture - A reference to the shadow map's texture data.\n\t * @param {Node<vec3>} inputs.shadowCoord - Shadow coordinates which are used to sample from the shadow map.\n\t * @param {LightShadow} inputs.shadow - The light shadow.\n\t * @return {Node<float>} The result node of the shadow filtering.\n\t */\n\tsetupShadowFilter( builder, { filterFn, depthTexture, shadowCoord, shadow, depthLayer } ) {\n\n\t\tconst frustumTest = shadowCoord.x.greaterThanEqual( 0 )\n\t\t\t.and( shadowCoord.x.lessThanEqual( 1 ) )\n\t\t\t.and( shadowCoord.y.greaterThanEqual( 0 ) )\n\t\t\t.and( shadowCoord.y.lessThanEqual( 1 ) )\n\t\t\t.and( shadowCoord.z.lessThanEqual( 1 ) );\n\n\t\tconst shadowNode = filterFn( { depthTexture, shadowCoord, shadow, depthLayer } );\n\n\t\treturn frustumTest.select( shadowNode, float( 1 ) );\n\n\t}\n\n\t/**\n\t * Setups the shadow coordinates.\n\t *\n\t * @param {NodeBuilder} builder - A reference to the current node builder.\n\t * @param {Node<vec3>} shadowPosition - A node representing the shadow position.\n\t * @return {Node<vec3>} The shadow coordinates.\n\t */\n\tsetupShadowCoord( builder, shadowPosition ) {\n\n\t\tconst { shadow } = this;\n\t\tconst { renderer } = builder;\n\n\t\tconst bias = reference( 'bias', 'float', shadow ).setGroup( renderGroup );\n\n\t\tlet shadowCoord = shadowPosition;\n\t\tlet coordZ;\n\n\t\tif ( shadow.camera.isOrthographicCamera || renderer.logarithmicDepthBuffer !== true ) {\n\n\t\t\tshadowCoord = shadowCoord.xyz.div( shadowCoord.w );\n\n\t\t\tcoordZ = shadowCoord.z;\n\n\t\t\tif ( renderer.coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\t\tcoordZ = coordZ.mul( 2 ).sub( 1 ); // WebGPU: Conversion [ 0, 1 ] to [ - 1, 1 ]\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst w = shadowCoord.w;\n\t\t\tshadowCoord = shadowCoord.xy.div( w ); // <-- Only divide X/Y coords since we don't need Z\n\n\t\t\t// The normally available \"cameraNear\" and \"cameraFar\" nodes cannot be used here because they do not get\n\t\t\t// updated to use the shadow camera. So, we have to declare our own \"local\" ones here.\n\t\t\t// TODO: How do we get the cameraNear/cameraFar nodes to use the shadow camera so we don't have to declare local ones here?\n\t\t\tconst cameraNearLocal = reference( 'near', 'float', shadow.camera ).setGroup( renderGroup );\n\t\t\tconst cameraFarLocal = reference( 'far', 'float', shadow.camera ).setGroup( renderGroup );\n\n\t\t\tcoordZ = viewZToLogarithmicDepth( w.negate(), cameraNearLocal, cameraFarLocal );\n\n\t\t}\n\n\t\tshadowCoord = vec3(\n\t\t\tshadowCoord.x,\n\t\t\tshadowCoord.y.oneMinus(), // follow webgpu standards\n\t\t\tcoordZ.add( bias )\n\t\t);\n\n\t\treturn shadowCoord;\n\n\t}\n\n\t/**\n\t * Returns the shadow filtering function for the given shadow type.\n\t *\n\t * @param {number} type - The shadow type.\n\t * @return {Function} The filtering function.\n\t */\n\tgetShadowFilterFn( type ) {\n\n\t\treturn _shadowFilterLib[ type ];\n\n\t}\n\n\n\tsetupRenderTarget( shadow, builder ) {\n\n\t\tconst depthTexture = new DepthTexture( shadow.mapSize.width, shadow.mapSize.height );\n\t\tdepthTexture.name = 'ShadowDepthTexture';\n\t\tdepthTexture.compareFunction = LessCompare;\n\n\t\tconst shadowMap = builder.createRenderTarget( shadow.mapSize.width, shadow.mapSize.height );\n\t\tshadowMap.texture.name = 'ShadowMap';\n\t\tshadowMap.texture.type = shadow.mapType;\n\t\tshadowMap.depthTexture = depthTexture;\n\n\t\treturn { shadowMap, depthTexture };\n\n\t}\n\n\t/**\n\t * Setups the shadow output node.\n\t *\n\t * @param {NodeBuilder} builder - A reference to the current node builder.\n\t * @return {Node<vec3>} The shadow output node.\n\t */\n\tsetupShadow( builder ) {\n\n\t\tconst { renderer, camera } = builder;\n\n\t\tconst { light, shadow } = this;\n\n\t\tconst shadowMapType = renderer.shadowMap.type;\n\n\t\tconst { depthTexture, shadowMap } = this.setupRenderTarget( shadow, builder );\n\n\t\tshadow.camera.coordinateSystem = camera.coordinateSystem;\n\t\tshadow.camera.updateProjectionMatrix();\n\n\t\t// VSM\n\n\t\tif ( shadowMapType === VSMShadowMap && shadow.isPointLightShadow !== true ) {\n\n\t\t\tdepthTexture.compareFunction = null; // VSM does not use textureSampleCompare()/texture2DCompare()\n\n\t\t\tif ( shadowMap.depth > 1 ) {\n\n\t\t\t\tif ( ! shadowMap._vsmShadowMapVertical ) {\n\n\t\t\t\t\tshadowMap._vsmShadowMapVertical = builder.createRenderTarget( shadow.mapSize.width, shadow.mapSize.height, { format: RGFormat, type: HalfFloatType, depth: shadowMap.depth, depthBuffer: false } );\n\t\t\t\t\tshadowMap._vsmShadowMapVertical.texture.name = 'VSMVertical';\n\n\t\t\t\t}\n\n\t\t\t\tthis.vsmShadowMapVertical = shadowMap._vsmShadowMapVertical;\n\n\t\t\t\tif ( ! shadowMap._vsmShadowMapHorizontal ) {\n\n\t\t\t\t\tshadowMap._vsmShadowMapHorizontal = builder.createRenderTarget( shadow.mapSize.width, shadow.mapSize.height, { format: RGFormat, type: HalfFloatType, depth: shadowMap.depth, depthBuffer: false } );\n\t\t\t\t\tshadowMap._vsmShadowMapHorizontal.texture.name = 'VSMHorizontal';\n\n\t\t\t\t}\n\n\t\t\t\tthis.vsmShadowMapHorizontal = shadowMap._vsmShadowMapHorizontal;\n\n\t\t\t} else {\n\n\t\t\t\tthis.vsmShadowMapVertical = builder.createRenderTarget( shadow.mapSize.width, shadow.mapSize.height, { format: RGFormat, type: HalfFloatType, depthBuffer: false } );\n\t\t\t\tthis.vsmShadowMapHorizontal = builder.createRenderTarget( shadow.mapSize.width, shadow.mapSize.height, { format: RGFormat, type: HalfFloatType, depthBuffer: false } );\n\n\t\t\t}\n\n\n\t\t\tlet shadowPassVertical = texture( depthTexture );\n\n\t\t\tif ( depthTexture.isArrayTexture ) {\n\n\t\t\t\tshadowPassVertical = shadowPassVertical.depth( this.depthLayer );\n\n\t\t\t}\n\n\t\t\tlet shadowPassHorizontal = texture( this.vsmShadowMapVertical.texture );\n\n\t\t\tif ( depthTexture.isArrayTexture ) {\n\n\t\t\t\tshadowPassHorizontal = shadowPassHorizontal.depth( this.depthLayer );\n\n\t\t\t}\n\n\t\t\tconst samples = reference( 'blurSamples', 'float', shadow ).setGroup( renderGroup );\n\t\t\tconst radius = reference( 'radius', 'float', shadow ).setGroup( renderGroup );\n\t\t\tconst size = reference( 'mapSize', 'vec2', shadow ).setGroup( renderGroup );\n\n\t\t\tlet material = this.vsmMaterialVertical || ( this.vsmMaterialVertical = new NodeMaterial() );\n\t\t\tmaterial.fragmentNode = VSMPassVertical( { samples, radius, size, shadowPass: shadowPassVertical, depthLayer: this.depthLayer } ).context( builder.getSharedContext() );\n\t\t\tmaterial.name = 'VSMVertical';\n\n\t\t\tmaterial = this.vsmMaterialHorizontal || ( this.vsmMaterialHorizontal = new NodeMaterial() );\n\t\t\tmaterial.fragmentNode = VSMPassHorizontal( { samples, radius, size, shadowPass: shadowPassHorizontal, depthLayer: this.depthLayer } ).context( builder.getSharedContext() );\n\t\t\tmaterial.name = 'VSMHorizontal';\n\n\t\t}\n\n\t\t//\n\n\t\tconst shadowIntensity = reference( 'intensity', 'float', shadow ).setGroup( renderGroup );\n\t\tconst normalBias = reference( 'normalBias', 'float', shadow ).setGroup( renderGroup );\n\n\t\tconst shadowPosition = lightShadowMatrix( light ).mul( shadowPositionWorld.add( normalWorld.mul( normalBias ) ) );\n\t\tconst shadowCoord = this.setupShadowCoord( builder, shadowPosition );\n\n\t\t//\n\n\t\tconst filterFn = shadow.filterNode || this.getShadowFilterFn( renderer.shadowMap.type ) || null;\n\n\t\tif ( filterFn === null ) {\n\n\t\t\tthrow new Error( 'THREE.WebGPURenderer: Shadow map type not supported yet.' );\n\n\t\t}\n\n\t\tconst shadowDepthTexture = ( shadowMapType === VSMShadowMap && shadow.isPointLightShadow !== true ) ? this.vsmShadowMapHorizontal.texture : depthTexture;\n\n\t\tconst shadowNode = this.setupShadowFilter( builder, { filterFn, shadowTexture: shadowMap.texture, depthTexture: shadowDepthTexture, shadowCoord, shadow, depthLayer: this.depthLayer } );\n\n\t\tlet shadowColor;\n\n\t\tif ( shadowMap.texture.isCubeTexture ) {\n\n\t\t\t// For cube shadow maps (point lights), use cubeTexture with vec3 coordinates\n\t\t\tshadowColor = cubeTexture( shadowMap.texture, shadowCoord.xyz );\n\n\t\t} else {\n\n\t\t\tshadowColor = texture( shadowMap.texture, shadowCoord );\n\n\t\t\tif ( depthTexture.isArrayTexture ) {\n\n\t\t\t\tshadowColor = shadowColor.depth( this.depthLayer );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst shadowOutput = mix( 1, shadowNode.rgb.mix( shadowColor, 1 ), shadowIntensity.mul( shadowColor.a ) ).toVar();\n\n\t\tthis.shadowMap = shadowMap;\n\t\tthis.shadow.map = shadowMap;\n\n\t\t// Shadow Output + Inspector\n\n\t\tconst inspectName = `${ this.light.type } Shadow [ ${ this.light.name || 'ID: ' + this.light.id } ]`;\n\n\t\treturn shadowOutput.toInspector( `${ inspectName } / Color`, () => {\n\n\t\t\tif ( this.shadowMap.texture.isCubeTexture ) {\n\n\t\t\t\treturn cubeTexture( this.shadowMap.texture );\n\n\t\t\t}\n\n\t\t\treturn texture( this.shadowMap.texture );\n\n\t\t} ).toInspector( `${ inspectName } / Depth`, () => {\n\n\t\t\t// TODO: Use linear depth\n\n\t\t\tif ( this.shadowMap.texture.isCubeTexture ) {\n\n\t\t\t\treturn cubeTexture( this.shadowMap.texture ).r.oneMinus();\n\n\t\t\t}\n\n\t\t\treturn textureLoad( this.shadowMap.depthTexture, uv$1().mul( textureSize( texture( this.shadowMap.depthTexture ) ) ) ).r.oneMinus();\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * The implementation performs the setup of the output node. An output is only\n\t * produces if shadow mapping is globally enabled in the renderer.\n\t *\n\t * @param {NodeBuilder} builder - A reference to the current node builder.\n\t * @return {ShaderCallNodeInternal} The output node.\n\t */\n\tsetup( builder ) {\n\n\t\tif ( builder.renderer.shadowMap.enabled === false ) return;\n\n\t\treturn Fn( () => {\n\n\t\t\tconst currentShadowType = builder.renderer.shadowMap.type;\n\n\t\t\tif ( this._currentShadowType !== currentShadowType ) {\n\n\t\t\t\tthis._reset();\n\t\t\t\tthis._node = null;\n\n\t\t\t}\n\n\t\t\tlet node = this._node;\n\n\t\t\tthis.setupShadowPosition( builder );\n\n\t\t\tif ( node === null ) {\n\n\t\t\t\tthis._node = node = this.setupShadow( builder );\n\t\t\t\tthis._currentShadowType = currentShadowType;\n\n\t\t\t}\n\n\t\t\tif ( builder.material.shadowNode ) { // @deprecated, r171\n\n\t\t\t\twarn( 'NodeMaterial: \".shadowNode\" is deprecated. Use \".castShadowNode\" instead.' );\n\n\t\t\t}\n\n\t\t\tif ( builder.material.receivedShadowNode ) {\n\n\t\t\t\tnode = builder.material.receivedShadowNode( node );\n\n\t\t\t}\n\n\t\t\treturn node;\n\n\t\t} )();\n\n\t}\n\n\t/**\n\t * Renders the shadow. The logic of this function could be included\n\t * into {@link ShadowNode#updateShadow} however more specialized shadow\n\t * nodes might require a custom shadow map rendering. By having a\n\t * dedicated method, it's easier to overwrite the default behavior.\n\t *\n\t * @param {NodeFrame} frame - A reference to the current node frame.\n\t */\n\trenderShadow( frame ) {\n\n\t\tconst { shadow, shadowMap, light } = this;\n\t\tconst { renderer, scene } = frame;\n\n\t\tshadow.updateMatrices( light );\n\n\t\tshadowMap.setSize( shadow.mapSize.width, shadow.mapSize.height, shadowMap.depth );\n\n\t\tconst currentSceneName = scene.name;\n\n\t\tscene.name = `Shadow Map [ ${ light.name || 'ID: ' + light.id } ]`;\n\n\t\trenderer.render( scene, shadow.camera );\n\n\t\tscene.name = currentSceneName;\n\n\t}\n\n\t/**\n\t * Updates the shadow.\n\t *\n\t * @param {NodeFrame} frame - A reference to the current node frame.\n\t */\n\tupdateShadow( frame ) {\n\n\t\tconst { shadowMap, light, shadow } = this;\n\t\tconst { renderer, scene, camera } = frame;\n\n\t\tconst shadowType = renderer.shadowMap.type;\n\n\t\tconst depthVersion = shadowMap.depthTexture.version;\n\t\tthis._depthVersionCached = depthVersion;\n\n\t\tconst _shadowCameraLayer = shadow.camera.layers.mask;\n\n\t\tif ( ( shadow.camera.layers.mask & 0xFFFFFFFE ) === 0 ) {\n\n\t\t\tshadow.camera.layers.mask = camera.layers.mask;\n\n\t\t}\n\n\t\tconst currentRenderObjectFunction = renderer.getRenderObjectFunction();\n\n\t\tconst currentMRT = renderer.getMRT();\n\t\tconst useVelocity = currentMRT ? currentMRT.has( 'velocity' ) : false;\n\n\t\t_rendererState = resetRendererAndSceneState( renderer, scene, _rendererState );\n\n\t\tscene.overrideMaterial = getShadowMaterial( light );\n\n\t\trenderer.setRenderObjectFunction( getShadowRenderObjectFunction( renderer, shadow, shadowType, useVelocity ) );\n\n\t\trenderer.setClearColor( 0x000000, 0 );\n\n\t\trenderer.setRenderTarget( shadowMap );\n\n\t\tthis.renderShadow( frame );\n\n\t\trenderer.setRenderObjectFunction( currentRenderObjectFunction );\n\n\t\t// vsm blur pass\n\n\t\tif ( shadowType === VSMShadowMap && shadow.isPointLightShadow !== true ) {\n\n\t\t\tthis.vsmPass( renderer );\n\n\t\t}\n\n\t\tshadow.camera.layers.mask = _shadowCameraLayer;\n\n\t\trestoreRendererAndSceneState( renderer, scene, _rendererState );\n\n\t}\n\n\t/**\n\t * For VSM additional render passes are required.\n\t *\n\t * @param {Renderer} renderer - A reference to the current renderer.\n\t */\n\tvsmPass( renderer ) {\n\n\t\tconst { shadow } = this;\n\n\t\tconst depth = this.shadowMap.depth;\n\t\tthis.vsmShadowMapVertical.setSize( shadow.mapSize.width, shadow.mapSize.height, depth );\n\t\tthis.vsmShadowMapHorizontal.setSize( shadow.mapSize.width, shadow.mapSize.height, depth );\n\n\t\trenderer.setRenderTarget( this.vsmShadowMapVertical );\n\t\t_quadMesh.material = this.vsmMaterialVertical;\n\t\t_quadMesh.render( renderer );\n\n\t\trenderer.setRenderTarget( this.vsmShadowMapHorizontal );\n\t\t_quadMesh.material = this.vsmMaterialHorizontal;\n\t\t_quadMesh.render( renderer );\n\n\t}\n\n\t/**\n\t * Frees the internal resources of this shadow node.\n\t */\n\tdispose() {\n\n\t\tthis._reset();\n\n\t\tsuper.dispose();\n\n\t}\n\n\t/**\n\t * Resets the resouce state of this shadow node.\n\t *\n\t * @private\n\t */\n\t_reset() {\n\n\t\tthis._currentShadowType = null;\n\n\t\tdisposeShadowMaterial( this.light );\n\n\t\tif ( this.shadowMap ) {\n\n\t\t\tthis.shadowMap.dispose();\n\t\t\tthis.shadowMap = null;\n\n\t\t}\n\n\t\tif ( this.vsmShadowMapVertical !== null ) {\n\n\t\t\tthis.vsmShadowMapVertical.dispose();\n\t\t\tthis.vsmShadowMapVertical = null;\n\n\t\t\tthis.vsmMaterialVertical.dispose();\n\t\t\tthis.vsmMaterialVertical = null;\n\n\t\t}\n\n\t\tif ( this.vsmShadowMapHorizontal !== null ) {\n\n\t\t\tthis.vsmShadowMapHorizontal.dispose();\n\t\t\tthis.vsmShadowMapHorizontal = null;\n\n\t\t\tthis.vsmMaterialHorizontal.dispose();\n\t\t\tthis.vsmMaterialHorizontal = null;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * The implementation performs the update of the shadow map if necessary.\n\t *\n\t * @param {NodeFrame} frame - A reference to the current node frame.\n\t */\n\tupdateBefore( frame ) {\n\n\t\tconst { shadow } = this;\n\n\t\tlet needsUpdate = shadow.needsUpdate || shadow.autoUpdate;\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tif ( this._cameraFrameId[ frame.camera ] === frame.frameId ) {\n\n\t\t\t\tneedsUpdate = false;\n\n\t\t\t}\n\n\t\t\tthis._cameraFrameId[ frame.camera ] = frame.frameId;\n\n\t\t}\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tthis.updateShadow( frame );\n\n\t\t\tif ( this.shadowMap.depthTexture.version === this._depthVersionCached ) {\n\n\t\t\t\tshadow.needsUpdate = false;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * Shadow Render Object Function.\n *\n * @function shadowRenderObjectFunction\n * @param {Object3D} object - The 3D object to render.\n * @param {Scene} scene - The scene containing the object.\n * @param {Camera} _camera - The camera used for rendering.\n * @param {BufferGeometry} geometry - The geometry of the object.\n * @param {Material} material - The material of the object.\n * @param {Group} group - The group the object belongs to.\n * @param {...any} params - Additional parameters for rendering.\n */\n\n/**\n * TSL function for creating an instance of `ShadowNode`.\n *\n * @tsl\n * @function\n * @param {Light} light - The shadow casting light.\n * @param {?LightShadow} [shadow] - The light shadow.\n * @return {ShadowNode} The created shadow node.\n */\nconst shadow = ( light, shadow ) => new ShadowNode( light, shadow );\n\nconst _clearColor$1 = /*@__PURE__*/ new Color();\nconst _projScreenMatrix$1 = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld = /*@__PURE__*/ new Vector3();\nconst _lookTarget = /*@__PURE__*/ new Vector3();\n\n// Cube map face directions and up vectors for point light shadows\n// Face order: +X, -X, +Y, -Y, +Z, -Z\n// WebGPU coordinate system - Y faces swapped to match texture sampling convention\nconst _cubeDirectionsWebGPU = [\n\t/*@__PURE__*/ new Vector3( 1, 0, 0 ), /*@__PURE__*/ new Vector3( -1, 0, 0 ), /*@__PURE__*/ new Vector3( 0, -1, 0 ),\n\t/*@__PURE__*/ new Vector3( 0, 1, 0 ), /*@__PURE__*/ new Vector3( 0, 0, 1 ), /*@__PURE__*/ new Vector3( 0, 0, -1 )\n];\n\nconst _cubeUpsWebGPU = [\n\t/*@__PURE__*/ new Vector3( 0, -1, 0 ), /*@__PURE__*/ new Vector3( 0, -1, 0 ), /*@__PURE__*/ new Vector3( 0, 0, -1 ),\n\t/*@__PURE__*/ new Vector3( 0, 0, 1 ), /*@__PURE__*/ new Vector3( 0, -1, 0 ), /*@__PURE__*/ new Vector3( 0, -1, 0 )\n];\n\n// WebGL coordinate system - standard OpenGL convention\nconst _cubeDirectionsWebGL = [\n\t/*@__PURE__*/ new Vector3( 1, 0, 0 ), /*@__PURE__*/ new Vector3( -1, 0, 0 ), /*@__PURE__*/ new Vector3( 0, 1, 0 ),\n\t/*@__PURE__*/ new Vector3( 0, -1, 0 ), /*@__PURE__*/ new Vector3( 0, 0, 1 ), /*@__PURE__*/ new Vector3( 0, 0, -1 )\n];\n\nconst _cubeUpsWebGL = [\n\t/*@__PURE__*/ new Vector3( 0, -1, 0 ), /*@__PURE__*/ new Vector3( 0, -1, 0 ), /*@__PURE__*/ new Vector3( 0, 0, 1 ),\n\t/*@__PURE__*/ new Vector3( 0, 0, -1 ), /*@__PURE__*/ new Vector3( 0, -1, 0 ), /*@__PURE__*/ new Vector3( 0, -1, 0 )\n];\n\nconst BasicPointShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, bd3D, dp } ) => {\n\n\treturn cubeTexture( depthTexture, bd3D ).compare( dp );\n\n} );\n\n/**\n * A shadow filtering function for point lights using Vogel disk sampling and IGN.\n *\n * Uses 5 samples distributed via Vogel disk pattern in tangent space around the\n * sample direction, rotated per-pixel using Interleaved Gradient Noise (IGN).\n *\n * @method\n * @param {Object} inputs - The input parameter object.\n * @param {CubeDepthTexture} inputs.depthTexture - A reference to the shadow cube map.\n * @param {Node<vec3>} inputs.bd3D - The normalized direction from light to fragment.\n * @param {Node<float>} inputs.dp - The depth value to compare against.\n * @param {LightShadow} inputs.shadow - The light shadow.\n * @return {Node<float>} The filtering result.\n */\nconst PointShadowFilter = /*@__PURE__*/ Fn( ( { depthTexture, bd3D, dp, shadow } ) => {\n\n\tconst radius = reference( 'radius', 'float', shadow ).setGroup( renderGroup );\n\tconst mapSize = reference( 'mapSize', 'vec2', shadow ).setGroup( renderGroup );\n\n\tconst texelSize = radius.div( mapSize.x );\n\n\t// Build a tangent-space coordinate system for applying offsets\n\tconst absDir = abs( bd3D );\n\tconst tangent = normalize( cross( bd3D, absDir.x.greaterThan( absDir.z ).select( vec3( 0, 1, 0 ), vec3( 1, 0, 0 ) ) ) );\n\tconst bitangent = cross( bd3D, tangent );\n\n\t// Use IGN to rotate sampling pattern per pixel (phi = IGN * 2\u03C0)\n\tconst phi = interleavedGradientNoise( screenCoordinate.xy ).mul( 6.28318530718 );\n\n\t// 5 samples using Vogel disk distribution in tangent space\n\tconst sample0 = vogelDiskSample( 0, 5, phi );\n\tconst sample1 = vogelDiskSample( 1, 5, phi );\n\tconst sample2 = vogelDiskSample( 2, 5, phi );\n\tconst sample3 = vogelDiskSample( 3, 5, phi );\n\tconst sample4 = vogelDiskSample( 4, 5, phi );\n\n\treturn cubeTexture( depthTexture, bd3D.add( tangent.mul( sample0.x ).add( bitangent.mul( sample0.y ) ).mul( texelSize ) ) ).compare( dp )\n\t\t.add( cubeTexture( depthTexture, bd3D.add( tangent.mul( sample1.x ).add( bitangent.mul( sample1.y ) ).mul( texelSize ) ) ).compare( dp ) )\n\t\t.add( cubeTexture( depthTexture, bd3D.add( tangent.mul( sample2.x ).add( bitangent.mul( sample2.y ) ).mul( texelSize ) ) ).compare( dp ) )\n\t\t.add( cubeTexture( depthTexture, bd3D.add( tangent.mul( sample3.x ).add( bitangent.mul( sample3.y ) ).mul( texelSize ) ) ).compare( dp ) )\n\t\t.add( cubeTexture( depthTexture, bd3D.add( tangent.mul( sample4.x ).add( bitangent.mul( sample4.y ) ).mul( texelSize ) ) ).compare( dp ) )\n\t\t.mul( 1.0 / 5.0 );\n\n} );\n\nconst pointShadowFilter = /*@__PURE__*/ Fn( ( { filterFn, depthTexture, shadowCoord, shadow } ) => {\n\n\t// for point lights, the uniform @vShadowCoord is re-purposed to hold\n\t// the vector from the light to the world-space position of the fragment.\n\tconst lightToPosition = shadowCoord.xyz.toVar();\n\tconst lightToPositionLength = lightToPosition.length();\n\n\tconst cameraNearLocal = uniform( 'float' ).setGroup( renderGroup ).onRenderUpdate( () => shadow.camera.near );\n\tconst cameraFarLocal = uniform( 'float' ).setGroup( renderGroup ).onRenderUpdate( () => shadow.camera.far );\n\tconst bias = reference( 'bias', 'float', shadow ).setGroup( renderGroup );\n\n\tconst result = float( 1.0 ).toVar();\n\n\tIf( lightToPositionLength.sub( cameraFarLocal ).lessThanEqual( 0.0 ).and( lightToPositionLength.sub( cameraNearLocal ).greaterThanEqual( 0.0 ) ), () => {\n\n\t\t// dp = normalized distance from light to fragment position\n\t\tconst dp = lightToPositionLength.sub( cameraNearLocal ).div( cameraFarLocal.sub( cameraNearLocal ) ).toVar(); // need to clamp?\n\t\tdp.addAssign( bias );\n\n\t\t// bd3D = base direction 3D (direction from light to fragment)\n\t\tconst bd3D = lightToPosition.normalize();\n\n\t\t// percentage-closer filtering using cube texture sampling\n\t\tresult.assign( filterFn( { depthTexture, bd3D, dp, shadow } ) );\n\n\t} );\n\n\treturn result;\n\n} );\n\n\n/**\n * Represents the shadow implementation for point light nodes.\n *\n * @augments ShadowNode\n */\nclass PointShadowNode extends ShadowNode {\n\n\tstatic get type() {\n\n\t\treturn 'PointShadowNode';\n\n\t}\n\n\t/**\n\t * Constructs a new point shadow node.\n\t *\n\t * @param {PointLight} light - The shadow casting point light.\n\t * @param {?PointLightShadow} [shadow=null] - An optional point light shadow.\n\t */\n\tconstructor( light, shadow = null ) {\n\n\t\tsuper( light, shadow );\n\n\t}\n\n\t/**\n\t * Overwrites the default implementation to return point light shadow specific\n\t * filtering functions.\n\t *\n\t * @param {number} type - The shadow type.\n\t * @return {Function} The filtering function.\n\t */\n\tgetShadowFilterFn( type ) {\n\n\t\treturn type === BasicShadowMap ? BasicPointShadowFilter : PointShadowFilter;\n\n\t}\n\n\t/**\n\t * Overwrites the default implementation so the unaltered shadow position is used.\n\t *\n\t * @param {NodeBuilder} builder - A reference to the current node builder.\n\t * @param {Node<vec3>} shadowPosition - A node representing the shadow position.\n\t * @return {Node<vec3>} The shadow coordinates.\n\t */\n\tsetupShadowCoord( builder, shadowPosition ) {\n\n\t\treturn shadowPosition;\n\n\t}\n\n\t/**\n\t * Overwrites the default implementation to only use point light specific\n\t * shadow filter functions.\n\t *\n\t * @param {NodeBuilder} builder - A reference to the current node builder.\n\t * @param {Object} inputs - A configuration object that defines the shadow filtering.\n\t * @param {Function} inputs.filterFn - This function defines the filtering type of the shadow map e.g. PCF.\n\t * @param {DepthTexture} inputs.depthTexture - A reference to the shadow map's depth texture.\n\t * @param {Node<vec3>} inputs.shadowCoord - Shadow coordinates which are used to sample from the shadow map.\n\t * @param {LightShadow} inputs.shadow - The light shadow.\n\t * @return {Node<float>} The result node of the shadow filtering.\n\t */\n\tsetupShadowFilter( builder, { filterFn, depthTexture, shadowCoord, shadow } ) {\n\n\t\treturn pointShadowFilter( { filterFn, depthTexture, shadowCoord, shadow } );\n\n\t}\n\n\t/**\n\t * Overwrites the default implementation to create a CubeRenderTarget with CubeDepthTexture.\n\t *\n\t * @param {LightShadow} shadow - The light shadow object.\n\t * @param {NodeBuilder} builder - A reference to the current node builder.\n\t * @return {Object} An object containing the shadow map and depth texture.\n\t */\n\tsetupRenderTarget( shadow, builder ) {\n\n\t\tconst depthTexture = new CubeDepthTexture( shadow.mapSize.width );\n\t\tdepthTexture.name = 'PointShadowDepthTexture';\n\t\tdepthTexture.compareFunction = LessCompare;\n\n\t\tconst shadowMap = builder.createCubeRenderTarget( shadow.mapSize.width );\n\t\tshadowMap.texture.name = 'PointShadowMap';\n\t\tshadowMap.depthTexture = depthTexture;\n\n\t\treturn { shadowMap, depthTexture };\n\n\t}\n\n\t/**\n\t * Overwrites the default implementation with point light specific\n\t * rendering code.\n\t *\n\t * @param {NodeFrame} frame - A reference to the current node frame.\n\t */\n\trenderShadow( frame ) {\n\n\t\tconst { shadow, shadowMap, light } = this;\n\t\tconst { renderer, scene } = frame;\n\n\t\tconst camera = shadow.camera;\n\t\tconst shadowMatrix = shadow.matrix;\n\n\t\t// Select cube directions/ups based on coordinate system\n\t\tconst isWebGPU = renderer.coordinateSystem === WebGPUCoordinateSystem;\n\t\tconst cubeDirections = isWebGPU ? _cubeDirectionsWebGPU : _cubeDirectionsWebGL;\n\t\tconst cubeUps = isWebGPU ? _cubeUpsWebGPU : _cubeUpsWebGL;\n\n\t\tshadowMap.setSize( shadow.mapSize.width, shadow.mapSize.width );\n\n\t\t//\n\n\t\tconst previousAutoClear = renderer.autoClear;\n\n\t\tconst previousClearColor = renderer.getClearColor( _clearColor$1 );\n\t\tconst previousClearAlpha = renderer.getClearAlpha();\n\n\t\trenderer.autoClear = false;\n\t\trenderer.setClearColor( shadow.clearColor, shadow.clearAlpha );\n\n\t\t// Render each cube face\n\t\tfor ( let face = 0; face < 6; face ++ ) {\n\n\t\t\t// Set render target to the specific cube face\n\t\t\trenderer.setRenderTarget( shadowMap, face );\n\t\t\trenderer.clear();\n\n\t\t\t// Update shadow camera matrices for this face\n\n\t\t\tconst far = light.distance || camera.far;\n\n\t\t\tif ( far !== camera.far ) {\n\n\t\t\t\tcamera.far = far;\n\t\t\t\tcamera.updateProjectionMatrix();\n\n\t\t\t}\n\n\t\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\t\tcamera.position.copy( _lightPositionWorld );\n\n\t\t\t_lookTarget.copy( camera.position );\n\t\t\t_lookTarget.add( cubeDirections[ face ] );\n\t\t\tcamera.up.copy( cubeUps[ face ] );\n\t\t\tcamera.lookAt( _lookTarget );\n\t\t\tcamera.updateMatrixWorld();\n\n\t\t\tshadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );\n\n\t\t\t_projScreenMatrix$1.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t\tshadow._frustum.setFromProjectionMatrix( _projScreenMatrix$1, camera.coordinateSystem, camera.reversedDepth );\n\n\t\t\t//\n\n\t\t\tconst currentSceneName = scene.name;\n\n\t\t\tscene.name = `Point Light Shadow [ ${ light.name || 'ID: ' + light.id } ] - Face ${ face + 1 }`;\n\n\t\t\trenderer.render( scene, camera );\n\n\t\t\tscene.name = currentSceneName;\n\n\t\t}\n\n\t\t//\n\n\t\trenderer.autoClear = previousAutoClear;\n\t\trenderer.setClearColor( previousClearColor, previousClearAlpha );\n\n\t}\n\n}\n\n/**\n * TSL function for creating an instance of `PointShadowNode`.\n *\n * @tsl\n * @function\n * @param {PointLight} light - The shadow casting point light.\n * @param {?PointLightShadow} [shadow=null] - An optional point light shadow.\n * @return {PointShadowNode} The created point shadow node.\n */\nconst pointShadow = ( light, shadow ) => new PointShadowNode( light, shadow );\n\n/**\n * Base class for analytic light nodes.\n *\n * @augments LightingNode\n */\nclass AnalyticLightNode extends LightingNode {\n\n\tstatic get type() {\n\n\t\treturn 'AnalyticLightNode';\n\n\t}\n\n\t/**\n\t * Constructs a new analytic light node.\n\t *\n\t * @param {?Light} [light=null] - The light source.\n\t */\n\tconstructor( light = null ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The light source.\n\t\t *\n\t\t * @type {?Light}\n\t\t * @default null\n\t\t */\n\t\tthis.light = light;\n\n\t\t/**\n\t\t * The light's color value.\n\t\t *\n\t\t * @type {Color}\n\t\t */\n\t\tthis.color = new Color();\n\n\t\t/**\n\t\t * The light's color node. Points to `colorNode` of the light source, if set. Otherwise\n\t\t * it creates a uniform node based on {@link AnalyticLightNode#color}.\n\t\t *\n\t\t * @type {Node}\n\t\t */\n\t\tthis.colorNode = ( light && light.colorNode ) || uniform( this.color ).setGroup( renderGroup );\n\n\t\t/**\n\t\t * This property is used to retain a reference to the original value of {@link AnalyticLightNode#colorNode}.\n\t\t * The final color node is represented by a different node when using shadows.\n\t\t *\n\t\t * @type {?Node}\n\t\t * @default null\n\t\t */\n\t\tthis.baseColorNode = null;\n\n\t\t/**\n\t\t * Represents the light's shadow.\n\t\t *\n\t\t * @type {?ShadowNode}\n   \t\t * @default null\n\t\t */\n\t\tthis.shadowNode = null;\n\n\t\t/**\n\t\t * Represents the light's shadow color.\n\t\t *\n\t\t * @type {?Node}\n   \t\t * @default null\n\t\t */\n\t\tthis.shadowColorNode = null;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isAnalyticLightNode = true;\n\n\t\t/**\n\t\t * Overwritten since analytic light nodes are updated\n\t\t * once per frame.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'frame'\n\t\t */\n\t\tthis.updateType = NodeUpdateType.FRAME;\n\n\t\tif ( light && light.shadow ) {\n\n\t\t\tthis._shadowDisposeListener = () => {\n\n\t\t\t\tthis.disposeShadow();\n\n\t\t\t};\n\n\t\t\tlight.addEventListener( 'dispose', this._shadowDisposeListener );\n\n\t\t}\n\n\t}\n\n\tdispose() {\n\n\t\tif ( this._shadowDisposeListener ) {\n\n\t\t\tthis.light.removeEventListener( 'dispose', this._shadowDisposeListener );\n\n\t\t}\n\n\t\tsuper.dispose();\n\n\t}\n\n\t/**\n\t * Frees internal resources related to shadows.\n\t */\n\tdisposeShadow() {\n\n\t\tif ( this.shadowNode !== null ) {\n\n\t\t\tthis.shadowNode.dispose();\n\t\t\tthis.shadowNode = null;\n\n\t\t}\n\n\t\tthis.shadowColorNode = null;\n\n\t\tif ( this.baseColorNode !== null ) {\n\n\t\t\tthis.colorNode = this.baseColorNode;\n\t\t\tthis.baseColorNode = null;\n\n\t\t}\n\n\t}\n\n\tgetHash() {\n\n\t\treturn this.light.uuid;\n\n\t}\n\n\t/**\n\t * Returns a node representing a direction vector which points from the current\n\t * position in view space to the light's position in view space.\n\t *\n\t * @param {NodeBuilder} builder - The builder object used for setting up the light.\n\t * @return {Node<vec3>} The light vector node.\n\t */\n\tgetLightVector( builder ) {\n\n\t\treturn lightViewPosition( this.light ).sub( builder.context.positionView || positionView );\n\n\t}\n\n\t/**\n\t * Sets up the direct lighting for the analytic light node.\n\t *\n\t * @abstract\n\t * @param {NodeBuilder} builder - The builder object used for setting up the light.\n\t * @return {Object|undefined} The direct light data (color and direction).\n\t */\n\tsetupDirect( /*builder*/ ) { }\n\n\t/**\n\t * Sets up the direct rect area lighting for the analytic light node.\n\t *\n\t * @abstract\n\t * @param {NodeBuilder} builder - The builder object used for setting up the light.\n\t * @return {Object|undefined} The direct rect area light data.\n\t */\n\tsetupDirectRectArea( /*builder*/ ) { }\n\n\t/**\n\t * Setups the shadow node for this light. The method exists so concrete light classes\n\t * can setup different types of shadow nodes.\n\t *\n\t * @return {ShadowNode} The created shadow node.\n\t */\n\tsetupShadowNode() {\n\n\t\treturn shadow( this.light );\n\n\t}\n\n\t/**\n\t * Setups the shadow for this light. This method is only executed if the light\n\t * cast shadows and the current build object receives shadows. It incorporates\n\t * shadows into the lighting computation.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tsetupShadow( builder ) {\n\n\t\tconst { renderer } = builder;\n\n\t\tif ( renderer.shadowMap.enabled === false ) return;\n\n\t\tlet shadowColorNode = this.shadowColorNode;\n\n\t\tif ( shadowColorNode === null ) {\n\n\t\t\tconst customShadowNode = this.light.shadow.shadowNode;\n\n\t\t\tlet shadowNode;\n\n\t\t\tif ( customShadowNode !== undefined ) {\n\n\t\t\t\tshadowNode = nodeObject( customShadowNode );\n\n\t\t\t} else {\n\n\t\t\t\tshadowNode = this.setupShadowNode();\n\n\t\t\t}\n\n\t\t\tthis.shadowNode = shadowNode;\n\n\t\t\tthis.shadowColorNode = shadowColorNode = this.colorNode.mul( shadowNode );\n\n\t\t\tthis.baseColorNode = this.colorNode;\n\n\t\t}\n\n\t\t//\n\n\t\tif ( builder.context.getShadow ) {\n\n\t\t\tshadowColorNode = builder.context.getShadow( this, builder );\n\n\t\t}\n\n\t\tthis.colorNode = shadowColorNode;\n\n\t}\n\n\t/**\n\t * Unlike most other nodes, lighting nodes do not return a output node in {@link Node#setup}.\n\t * The main purpose of lighting nodes is to configure the current {@link LightingModel} and/or\n\t * invocate the respective interface methods.\n\t *\n\t * @param {NodeBuilder} builder - The current node builder.\n\t */\n\tsetup( builder ) {\n\n\t\tthis.colorNode = this.baseColorNode || this.colorNode;\n\n\t\tif ( this.light.castShadow ) {\n\n\t\t\tif ( builder.object.receiveShadow ) {\n\n\t\t\t\tthis.setupShadow( builder );\n\n\t\t\t}\n\n\t\t} else if ( this.shadowNode !== null ) {\n\n\t\t\tthis.shadowNode.dispose();\n\t\t\tthis.shadowNode = null;\n\t\t\tthis.shadowColorNode = null;\n\n\t\t}\n\n\t\tconst directLightData = this.setupDirect( builder );\n\t\tconst directRectAreaLightData = this.setupDirectRectArea( builder );\n\n\t\tif ( directLightData ) {\n\n\t\t\tbuilder.lightsNode.setupDirectLight( builder, this, directLightData );\n\n\t\t}\n\n\t\tif ( directRectAreaLightData ) {\n\n\t\t\tbuilder.lightsNode.setupDirectRectAreaLight( builder, this, directRectAreaLightData );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * The update method is used to update light uniforms per frame.\n\t * Potentially overwritten in concrete light nodes to update light\n\t * specific uniforms.\n\t *\n\t * @param {NodeFrame} frame - A reference to the current node frame.\n\t */\n\tupdate( /*frame*/ ) {\n\n\t\tconst { light } = this;\n\n\t\tthis.color.copy( light.color ).multiplyScalar( light.intensity );\n\n\t}\n\n}\n\n/**\n * Represents a `discard` shader operation in TSL.\n *\n * @method\n * @param {Object} inputs - The input parameter object.\n * @param {Node<float>} inputs.lightDistance - The distance of the light's position to the current fragment position.\n * @param {Node<float>} inputs.cutoffDistance - The light's cutoff distance.\n * @param {Node<float>} inputs.decayExponent - The light's decay exponent.\n * @return {Node<float>} The distance falloff.\n */\nconst getDistanceAttenuation = /*@__PURE__*/ Fn( ( { lightDistance, cutoffDistance, decayExponent } ) => {\n\n\t// based upon Frostbite 3 Moving to Physically-based Rendering\n\t// page 32, equation 26: E[window1]\n\t// https://seblagarde.files.wordpress.com/2015/07/course_notes_moving_frostbite_to_pbr_v32.pdf\n\tconst distanceFalloff = lightDistance.pow( decayExponent ).max( 0.01 ).reciprocal();\n\n\treturn cutoffDistance.greaterThan( 0 ).select(\n\t\tdistanceFalloff.mul( lightDistance.div( cutoffDistance ).pow4().oneMinus().clamp().pow2() ),\n\t\tdistanceFalloff\n\t);\n\n} ); // validated\n\nconst directPointLight = ( { color, lightVector, cutoffDistance, decayExponent } ) => {\n\n\tconst lightDirection = lightVector.normalize();\n\tconst lightDistance = lightVector.length();\n\n\tconst attenuation = getDistanceAttenuation( {\n\t\tlightDistance,\n\t\tcutoffDistance,\n\t\tdecayExponent\n\t} );\n\n\tconst lightColor = color.mul( attenuation );\n\n\treturn { lightDirection, lightColor };\n\n};\n\n/**\n * Module for representing point lights as nodes.\n *\n * @augments AnalyticLightNode\n */\nclass PointLightNode extends AnalyticLightNode {\n\n\tstatic get type() {\n\n\t\treturn 'PointLightNode';\n\n\t}\n\n\t/**\n\t * Constructs a new point light node.\n\t *\n\t * @param {?PointLight} [light=null] - The point light source.\n\t */\n\tconstructor( light = null ) {\n\n\t\tsuper( light );\n\n\t\t/**\n\t\t * Uniform node representing the cutoff distance.\n\t\t *\n\t\t * @type {UniformNode<float>}\n\t\t */\n\t\tthis.cutoffDistanceNode = uniform( 0 ).setGroup( renderGroup );\n\n\t\t/**\n\t\t * Uniform node representing the decay exponent.\n\t\t *\n\t\t * @type {UniformNode<float>}\n\t\t */\n\t\tthis.decayExponentNode = uniform( 2 ).setGroup( renderGroup );\n\n\t}\n\n\t/**\n\t * Overwritten to updated point light specific uniforms.\n\t *\n\t * @param {NodeFrame} frame - A reference to the current node frame.\n\t */\n\tupdate( frame ) {\n\n\t\tconst { light } = this;\n\n\t\tsuper.update( frame );\n\n\t\tthis.cutoffDistanceNode.value = light.distance;\n\t\tthis.decayExponentNode.value = light.decay;\n\n\t}\n\n\t/**\n\t * Overwritten to setup point light specific shadow.\n\t *\n\t * @return {PointShadowNode}\n\t */\n\tsetupShadowNode() {\n\n\t\treturn pointShadow( this.light );\n\n\t}\n\n\tsetupDirect( builder ) {\n\n\t\treturn directPointLight( {\n\t\t\tcolor: this.colorNode,\n\t\t\tlightVector: this.getLightVector( builder ),\n\t\t\tcutoffDistance: this.cutoffDistanceNode,\n\t\t\tdecayExponent: this.decayExponentNode\n\t\t} );\n\n\t}\n\n}\n\n/**\n * Creates a 2x2 checkerboard pattern that can be used as procedural texture data.\n *\n * @tsl\n * @function\n * @param {Node<vec2>} coord - The uv coordinates.\n * @return {Node<float>} The result data.\n */\nconst checker = /*@__PURE__*/ Fn( ( [ coord = uv$1() ] ) => {\n\n\tconst uv = coord.mul( 2.0 );\n\n\tconst cx = uv.x.floor();\n\tconst cy = uv.y.floor();\n\tconst result = cx.add( cy ).mod( 2.0 );\n\n\treturn result.sign();\n\n} );\n\n/**\n * Generates a circle based on the uv coordinates.\n *\n * @tsl\n * @function\n * @param {Node<vec2>} coord - The uv to generate the circle.\n * @return {Node<float>} The circle shape.\n */\nconst shapeCircle = Fn( ( [ coord = uv$1() ], { renderer, material } ) => {\n\n\tconst len2 = lengthSq( coord.mul( 2 ).sub( 1 ) );\n\n\tlet alpha;\n\n\tif ( material.alphaToCoverage && renderer.currentSamples > 0 ) {\n\n\t\tconst dlen = float( len2.fwidth() ).toVar();\n\n\t\talpha = smoothstep( dlen.oneMinus(), dlen.add( 1 ), len2 ).oneMinus();\n\n\t} else {\n\n\t\talpha = select( len2.greaterThan( 1.0 ), 0, 1 );\n\n\t}\n\n\treturn alpha;\n\n} );\n\n// Three.js Transpiler\n// https://raw.githubusercontent.com/AcademySoftwareFoundation/MaterialX/main/libraries/stdlib/genglsl/lib/mx_noise.glsl\n\n\n\nconst mx_select = /*@__PURE__*/ Fn( ( [ b_immutable, t_immutable, f_immutable ] ) => {\n\n\tconst f = float( f_immutable ).toVar();\n\tconst t = float( t_immutable ).toVar();\n\tconst b = bool( b_immutable ).toVar();\n\n\treturn select( b, t, f );\n\n} ).setLayout( {\n\tname: 'mx_select',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'b', type: 'bool' },\n\t\t{ name: 't', type: 'float' },\n\t\t{ name: 'f', type: 'float' }\n\t]\n} );\n\nconst mx_negate_if = /*@__PURE__*/ Fn( ( [ val_immutable, b_immutable ] ) => {\n\n\tconst b = bool( b_immutable ).toVar();\n\tconst val = float( val_immutable ).toVar();\n\n\treturn select( b, val.negate(), val );\n\n} ).setLayout( {\n\tname: 'mx_negate_if',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'val', type: 'float' },\n\t\t{ name: 'b', type: 'bool' }\n\t]\n} );\n\nconst mx_floor = /*@__PURE__*/ Fn( ( [ x_immutable ] ) => {\n\n\tconst x = float( x_immutable ).toVar();\n\n\treturn int( floor( x ) );\n\n} ).setLayout( {\n\tname: 'mx_floor',\n\ttype: 'int',\n\tinputs: [\n\t\t{ name: 'x', type: 'float' }\n\t]\n} );\n\nconst mx_floorfrac = /*@__PURE__*/ Fn( ( [ x_immutable, i ] ) => {\n\n\tconst x = float( x_immutable ).toVar();\n\ti.assign( mx_floor( x ) );\n\n\treturn x.sub( float( i ) );\n\n} );\n\nconst mx_bilerp_0 = /*@__PURE__*/ Fn( ( [ v0_immutable, v1_immutable, v2_immutable, v3_immutable, s_immutable, t_immutable ] ) => {\n\n\tconst t = float( t_immutable ).toVar();\n\tconst s = float( s_immutable ).toVar();\n\tconst v3 = float( v3_immutable ).toVar();\n\tconst v2 = float( v2_immutable ).toVar();\n\tconst v1 = float( v1_immutable ).toVar();\n\tconst v0 = float( v0_immutable ).toVar();\n\tconst s1 = float( sub( 1.0, s ) ).toVar();\n\n\treturn sub( 1.0, t ).mul( v0.mul( s1 ).add( v1.mul( s ) ) ).add( t.mul( v2.mul( s1 ).add( v3.mul( s ) ) ) );\n\n} ).setLayout( {\n\tname: 'mx_bilerp_0',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'v0', type: 'float' },\n\t\t{ name: 'v1', type: 'float' },\n\t\t{ name: 'v2', type: 'float' },\n\t\t{ name: 'v3', type: 'float' },\n\t\t{ name: 's', type: 'float' },\n\t\t{ name: 't', type: 'float' }\n\t]\n} );\n\nconst mx_bilerp_1 = /*@__PURE__*/ Fn( ( [ v0_immutable, v1_immutable, v2_immutable, v3_immutable, s_immutable, t_immutable ] ) => {\n\n\tconst t = float( t_immutable ).toVar();\n\tconst s = float( s_immutable ).toVar();\n\tconst v3 = vec3( v3_immutable ).toVar();\n\tconst v2 = vec3( v2_immutable ).toVar();\n\tconst v1 = vec3( v1_immutable ).toVar();\n\tconst v0 = vec3( v0_immutable ).toVar();\n\tconst s1 = float( sub( 1.0, s ) ).toVar();\n\n\treturn sub( 1.0, t ).mul( v0.mul( s1 ).add( v1.mul( s ) ) ).add( t.mul( v2.mul( s1 ).add( v3.mul( s ) ) ) );\n\n} ).setLayout( {\n\tname: 'mx_bilerp_1',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'v0', type: 'vec3' },\n\t\t{ name: 'v1', type: 'vec3' },\n\t\t{ name: 'v2', type: 'vec3' },\n\t\t{ name: 'v3', type: 'vec3' },\n\t\t{ name: 's', type: 'float' },\n\t\t{ name: 't', type: 'float' }\n\t]\n} );\n\nconst mx_bilerp = /*@__PURE__*/ overloadingFn( [ mx_bilerp_0, mx_bilerp_1 ] );\n\nconst mx_trilerp_0 = /*@__PURE__*/ Fn( ( [ v0_immutable, v1_immutable, v2_immutable, v3_immutable, v4_immutable, v5_immutable, v6_immutable, v7_immutable, s_immutable, t_immutable, r_immutable ] ) => {\n\n\tconst r = float( r_immutable ).toVar();\n\tconst t = float( t_immutable ).toVar();\n\tconst s = float( s_immutable ).toVar();\n\tconst v7 = float( v7_immutable ).toVar();\n\tconst v6 = float( v6_immutable ).toVar();\n\tconst v5 = float( v5_immutable ).toVar();\n\tconst v4 = float( v4_immutable ).toVar();\n\tconst v3 = float( v3_immutable ).toVar();\n\tconst v2 = float( v2_immutable ).toVar();\n\tconst v1 = float( v1_immutable ).toVar();\n\tconst v0 = float( v0_immutable ).toVar();\n\tconst s1 = float( sub( 1.0, s ) ).toVar();\n\tconst t1 = float( sub( 1.0, t ) ).toVar();\n\tconst r1 = float( sub( 1.0, r ) ).toVar();\n\n\treturn r1.mul( t1.mul( v0.mul( s1 ).add( v1.mul( s ) ) ).add( t.mul( v2.mul( s1 ).add( v3.mul( s ) ) ) ) ).add( r.mul( t1.mul( v4.mul( s1 ).add( v5.mul( s ) ) ).add( t.mul( v6.mul( s1 ).add( v7.mul( s ) ) ) ) ) );\n\n} ).setLayout( {\n\tname: 'mx_trilerp_0',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'v0', type: 'float' },\n\t\t{ name: 'v1', type: 'float' },\n\t\t{ name: 'v2', type: 'float' },\n\t\t{ name: 'v3', type: 'float' },\n\t\t{ name: 'v4', type: 'float' },\n\t\t{ name: 'v5', type: 'float' },\n\t\t{ name: 'v6', type: 'float' },\n\t\t{ name: 'v7', type: 'float' },\n\t\t{ name: 's', type: 'float' },\n\t\t{ name: 't', type: 'float' },\n\t\t{ name: 'r', type: 'float' }\n\t]\n} );\n\nconst mx_trilerp_1 = /*@__PURE__*/ Fn( ( [ v0_immutable, v1_immutable, v2_immutable, v3_immutable, v4_immutable, v5_immutable, v6_immutable, v7_immutable, s_immutable, t_immutable, r_immutable ] ) => {\n\n\tconst r = float( r_immutable ).toVar();\n\tconst t = float( t_immutable ).toVar();\n\tconst s = float( s_immutable ).toVar();\n\tconst v7 = vec3( v7_immutable ).toVar();\n\tconst v6 = vec3( v6_immutable ).toVar();\n\tconst v5 = vec3( v5_immutable ).toVar();\n\tconst v4 = vec3( v4_immutable ).toVar();\n\tconst v3 = vec3( v3_immutable ).toVar();\n\tconst v2 = vec3( v2_immutable ).toVar();\n\tconst v1 = vec3( v1_immutable ).toVar();\n\tconst v0 = vec3( v0_immutable ).toVar();\n\tconst s1 = float( sub( 1.0, s ) ).toVar();\n\tconst t1 = float( sub( 1.0, t ) ).toVar();\n\tconst r1 = float( sub( 1.0, r ) ).toVar();\n\n\treturn r1.mul( t1.mul( v0.mul( s1 ).add( v1.mul( s ) ) ).add( t.mul( v2.mul( s1 ).add( v3.mul( s ) ) ) ) ).add( r.mul( t1.mul( v4.mul( s1 ).add( v5.mul( s ) ) ).add( t.mul( v6.mul( s1 ).add( v7.mul( s ) ) ) ) ) );\n\n} ).setLayout( {\n\tname: 'mx_trilerp_1',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'v0', type: 'vec3' },\n\t\t{ name: 'v1', type: 'vec3' },\n\t\t{ name: 'v2', type: 'vec3' },\n\t\t{ name: 'v3', type: 'vec3' },\n\t\t{ name: 'v4', type: 'vec3' },\n\t\t{ name: 'v5', type: 'vec3' },\n\t\t{ name: 'v6', type: 'vec3' },\n\t\t{ name: 'v7', type: 'vec3' },\n\t\t{ name: 's', type: 'float' },\n\t\t{ name: 't', type: 'float' },\n\t\t{ name: 'r', type: 'float' }\n\t]\n} );\n\nconst mx_trilerp = /*@__PURE__*/ overloadingFn( [ mx_trilerp_0, mx_trilerp_1 ] );\n\nconst mx_gradient_float_0 = /*@__PURE__*/ Fn( ( [ hash_immutable, x_immutable, y_immutable ] ) => {\n\n\tconst y = float( y_immutable ).toVar();\n\tconst x = float( x_immutable ).toVar();\n\tconst hash = uint( hash_immutable ).toVar();\n\tconst h = uint( hash.bitAnd( uint( 7 ) ) ).toVar();\n\tconst u = float( mx_select( h.lessThan( uint( 4 ) ), x, y ) ).toVar();\n\tconst v = float( mul( 2.0, mx_select( h.lessThan( uint( 4 ) ), y, x ) ) ).toVar();\n\n\treturn mx_negate_if( u, bool( h.bitAnd( uint( 1 ) ) ) ).add( mx_negate_if( v, bool( h.bitAnd( uint( 2 ) ) ) ) );\n\n} ).setLayout( {\n\tname: 'mx_gradient_float_0',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'hash', type: 'uint' },\n\t\t{ name: 'x', type: 'float' },\n\t\t{ name: 'y', type: 'float' }\n\t]\n} );\n\nconst mx_gradient_float_1 = /*@__PURE__*/ Fn( ( [ hash_immutable, x_immutable, y_immutable, z_immutable ] ) => {\n\n\tconst z = float( z_immutable ).toVar();\n\tconst y = float( y_immutable ).toVar();\n\tconst x = float( x_immutable ).toVar();\n\tconst hash = uint( hash_immutable ).toVar();\n\tconst h = uint( hash.bitAnd( uint( 15 ) ) ).toVar();\n\tconst u = float( mx_select( h.lessThan( uint( 8 ) ), x, y ) ).toVar();\n\tconst v = float( mx_select( h.lessThan( uint( 4 ) ), y, mx_select( h.equal( uint( 12 ) ).or( h.equal( uint( 14 ) ) ), x, z ) ) ).toVar();\n\n\treturn mx_negate_if( u, bool( h.bitAnd( uint( 1 ) ) ) ).add( mx_negate_if( v, bool( h.bitAnd( uint( 2 ) ) ) ) );\n\n} ).setLayout( {\n\tname: 'mx_gradient_float_1',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'hash', type: 'uint' },\n\t\t{ name: 'x', type: 'float' },\n\t\t{ name: 'y', type: 'float' },\n\t\t{ name: 'z', type: 'float' }\n\t]\n} );\n\nconst mx_gradient_float = /*@__PURE__*/ overloadingFn( [ mx_gradient_float_0, mx_gradient_float_1 ] );\n\nconst mx_gradient_vec3_0 = /*@__PURE__*/ Fn( ( [ hash_immutable, x_immutable, y_immutable ] ) => {\n\n\tconst y = float( y_immutable ).toVar();\n\tconst x = float( x_immutable ).toVar();\n\tconst hash = uvec3( hash_immutable ).toVar();\n\n\treturn vec3( mx_gradient_float( hash.x, x, y ), mx_gradient_float( hash.y, x, y ), mx_gradient_float( hash.z, x, y ) );\n\n} ).setLayout( {\n\tname: 'mx_gradient_vec3_0',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'hash', type: 'uvec3' },\n\t\t{ name: 'x', type: 'float' },\n\t\t{ name: 'y', type: 'float' }\n\t]\n} );\n\nconst mx_gradient_vec3_1 = /*@__PURE__*/ Fn( ( [ hash_immutable, x_immutable, y_immutable, z_immutable ] ) => {\n\n\tconst z = float( z_immutable ).toVar();\n\tconst y = float( y_immutable ).toVar();\n\tconst x = float( x_immutable ).toVar();\n\tconst hash = uvec3( hash_immutable ).toVar();\n\n\treturn vec3( mx_gradient_float( hash.x, x, y, z ), mx_gradient_float( hash.y, x, y, z ), mx_gradient_float( hash.z, x, y, z ) );\n\n} ).setLayout( {\n\tname: 'mx_gradient_vec3_1',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'hash', type: 'uvec3' },\n\t\t{ name: 'x', type: 'float' },\n\t\t{ name: 'y', type: 'float' },\n\t\t{ name: 'z', type: 'float' }\n\t]\n} );\n\nconst mx_gradient_vec3 = /*@__PURE__*/ overloadingFn( [ mx_gradient_vec3_0, mx_gradient_vec3_1 ] );\n\nconst mx_gradient_scale2d_0 = /*@__PURE__*/ Fn( ( [ v_immutable ] ) => {\n\n\tconst v = float( v_immutable ).toVar();\n\n\treturn mul( 0.6616, v );\n\n} ).setLayout( {\n\tname: 'mx_gradient_scale2d_0',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'v', type: 'float' }\n\t]\n} );\n\nconst mx_gradient_scale3d_0 = /*@__PURE__*/ Fn( ( [ v_immutable ] ) => {\n\n\tconst v = float( v_immutable ).toVar();\n\n\treturn mul( 0.9820, v );\n\n} ).setLayout( {\n\tname: 'mx_gradient_scale3d_0',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'v', type: 'float' }\n\t]\n} );\n\nconst mx_gradient_scale2d_1 = /*@__PURE__*/ Fn( ( [ v_immutable ] ) => {\n\n\tconst v = vec3( v_immutable ).toVar();\n\n\treturn mul( 0.6616, v );\n\n} ).setLayout( {\n\tname: 'mx_gradient_scale2d_1',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'v', type: 'vec3' }\n\t]\n} );\n\nconst mx_gradient_scale2d = /*@__PURE__*/ overloadingFn( [ mx_gradient_scale2d_0, mx_gradient_scale2d_1 ] );\n\nconst mx_gradient_scale3d_1 = /*@__PURE__*/ Fn( ( [ v_immutable ] ) => {\n\n\tconst v = vec3( v_immutable ).toVar();\n\n\treturn mul( 0.9820, v );\n\n} ).setLayout( {\n\tname: 'mx_gradient_scale3d_1',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'v', type: 'vec3' }\n\t]\n} );\n\nconst mx_gradient_scale3d = /*@__PURE__*/ overloadingFn( [ mx_gradient_scale3d_0, mx_gradient_scale3d_1 ] );\n\nconst mx_rotl32 = /*@__PURE__*/ Fn( ( [ x_immutable, k_immutable ] ) => {\n\n\tconst k = int( k_immutable ).toVar();\n\tconst x = uint( x_immutable ).toVar();\n\n\treturn x.shiftLeft( k ).bitOr( x.shiftRight( int( 32 ).sub( k ) ) );\n\n} ).setLayout( {\n\tname: 'mx_rotl32',\n\ttype: 'uint',\n\tinputs: [\n\t\t{ name: 'x', type: 'uint' },\n\t\t{ name: 'k', type: 'int' }\n\t]\n} );\n\nconst mx_bjmix = /*@__PURE__*/ Fn( ( [ a, b, c ] ) => {\n\n\ta.subAssign( c );\n\ta.bitXorAssign( mx_rotl32( c, int( 4 ) ) );\n\tc.addAssign( b );\n\tb.subAssign( a );\n\tb.bitXorAssign( mx_rotl32( a, int( 6 ) ) );\n\ta.addAssign( c );\n\tc.subAssign( b );\n\tc.bitXorAssign( mx_rotl32( b, int( 8 ) ) );\n\tb.addAssign( a );\n\ta.subAssign( c );\n\ta.bitXorAssign( mx_rotl32( c, int( 16 ) ) );\n\tc.addAssign( b );\n\tb.subAssign( a );\n\tb.bitXorAssign( mx_rotl32( a, int( 19 ) ) );\n\ta.addAssign( c );\n\tc.subAssign( b );\n\tc.bitXorAssign( mx_rotl32( b, int( 4 ) ) );\n\tb.addAssign( a );\n\n} );\n\nconst mx_bjfinal = /*@__PURE__*/ Fn( ( [ a_immutable, b_immutable, c_immutable ] ) => {\n\n\tconst c = uint( c_immutable ).toVar();\n\tconst b = uint( b_immutable ).toVar();\n\tconst a = uint( a_immutable ).toVar();\n\tc.bitXorAssign( b );\n\tc.subAssign( mx_rotl32( b, int( 14 ) ) );\n\ta.bitXorAssign( c );\n\ta.subAssign( mx_rotl32( c, int( 11 ) ) );\n\tb.bitXorAssign( a );\n\tb.subAssign( mx_rotl32( a, int( 25 ) ) );\n\tc.bitXorAssign( b );\n\tc.subAssign( mx_rotl32( b, int( 16 ) ) );\n\ta.bitXorAssign( c );\n\ta.subAssign( mx_rotl32( c, int( 4 ) ) );\n\tb.bitXorAssign( a );\n\tb.subAssign( mx_rotl32( a, int( 14 ) ) );\n\tc.bitXorAssign( b );\n\tc.subAssign( mx_rotl32( b, int( 24 ) ) );\n\n\treturn c;\n\n} ).setLayout( {\n\tname: 'mx_bjfinal',\n\ttype: 'uint',\n\tinputs: [\n\t\t{ name: 'a', type: 'uint' },\n\t\t{ name: 'b', type: 'uint' },\n\t\t{ name: 'c', type: 'uint' }\n\t]\n} );\n\nconst mx_bits_to_01 = /*@__PURE__*/ Fn( ( [ bits_immutable ] ) => {\n\n\tconst bits = uint( bits_immutable ).toVar();\n\n\treturn float( bits ).div( float( uint( int( 0xffffffff ) ) ) );\n\n} ).setLayout( {\n\tname: 'mx_bits_to_01',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'bits', type: 'uint' }\n\t]\n} );\n\nconst mx_fade = /*@__PURE__*/ Fn( ( [ t_immutable ] ) => {\n\n\tconst t = float( t_immutable ).toVar();\n\n\treturn t.mul( t ).mul( t ).mul( t.mul( t.mul( 6.0 ).sub( 15.0 ) ).add( 10.0 ) );\n\n} ).setLayout( {\n\tname: 'mx_fade',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 't', type: 'float' }\n\t]\n} );\n\nconst mx_hash_int_0 = /*@__PURE__*/ Fn( ( [ x_immutable ] ) => {\n\n\tconst x = int( x_immutable ).toVar();\n\tconst len = uint( uint( 1 ) ).toVar();\n\tconst seed = uint( uint( int( 0xdeadbeef ) ).add( len.shiftLeft( uint( 2 ) ) ).add( uint( 13 ) ) ).toVar();\n\n\treturn mx_bjfinal( seed.add( uint( x ) ), seed, seed );\n\n} ).setLayout( {\n\tname: 'mx_hash_int_0',\n\ttype: 'uint',\n\tinputs: [\n\t\t{ name: 'x', type: 'int' }\n\t]\n} );\n\nconst mx_hash_int_1 = /*@__PURE__*/ Fn( ( [ x_immutable, y_immutable ] ) => {\n\n\tconst y = int( y_immutable ).toVar();\n\tconst x = int( x_immutable ).toVar();\n\tconst len = uint( uint( 2 ) ).toVar();\n\tconst a = uint().toVar(), b = uint().toVar(), c = uint().toVar();\n\ta.assign( b.assign( c.assign( uint( int( 0xdeadbeef ) ).add( len.shiftLeft( uint( 2 ) ) ).add( uint( 13 ) ) ) ) );\n\ta.addAssign( uint( x ) );\n\tb.addAssign( uint( y ) );\n\n\treturn mx_bjfinal( a, b, c );\n\n} ).setLayout( {\n\tname: 'mx_hash_int_1',\n\ttype: 'uint',\n\tinputs: [\n\t\t{ name: 'x', type: 'int' },\n\t\t{ name: 'y', type: 'int' }\n\t]\n} );\n\nconst mx_hash_int_2 = /*@__PURE__*/ Fn( ( [ x_immutable, y_immutable, z_immutable ] ) => {\n\n\tconst z = int( z_immutable ).toVar();\n\tconst y = int( y_immutable ).toVar();\n\tconst x = int( x_immutable ).toVar();\n\tconst len = uint( uint( 3 ) ).toVar();\n\tconst a = uint().toVar(), b = uint().toVar(), c = uint().toVar();\n\ta.assign( b.assign( c.assign( uint( int( 0xdeadbeef ) ).add( len.shiftLeft( uint( 2 ) ) ).add( uint( 13 ) ) ) ) );\n\ta.addAssign( uint( x ) );\n\tb.addAssign( uint( y ) );\n\tc.addAssign( uint( z ) );\n\n\treturn mx_bjfinal( a, b, c );\n\n} ).setLayout( {\n\tname: 'mx_hash_int_2',\n\ttype: 'uint',\n\tinputs: [\n\t\t{ name: 'x', type: 'int' },\n\t\t{ name: 'y', type: 'int' },\n\t\t{ name: 'z', type: 'int' }\n\t]\n} );\n\nconst mx_hash_int_3 = /*@__PURE__*/ Fn( ( [ x_immutable, y_immutable, z_immutable, xx_immutable ] ) => {\n\n\tconst xx = int( xx_immutable ).toVar();\n\tconst z = int( z_immutable ).toVar();\n\tconst y = int( y_immutable ).toVar();\n\tconst x = int( x_immutable ).toVar();\n\tconst len = uint( uint( 4 ) ).toVar();\n\tconst a = uint().toVar(), b = uint().toVar(), c = uint().toVar();\n\ta.assign( b.assign( c.assign( uint( int( 0xdeadbeef ) ).add( len.shiftLeft( uint( 2 ) ) ).add( uint( 13 ) ) ) ) );\n\ta.addAssign( uint( x ) );\n\tb.addAssign( uint( y ) );\n\tc.addAssign( uint( z ) );\n\tmx_bjmix( a, b, c );\n\ta.addAssign( uint( xx ) );\n\n\treturn mx_bjfinal( a, b, c );\n\n} ).setLayout( {\n\tname: 'mx_hash_int_3',\n\ttype: 'uint',\n\tinputs: [\n\t\t{ name: 'x', type: 'int' },\n\t\t{ name: 'y', type: 'int' },\n\t\t{ name: 'z', type: 'int' },\n\t\t{ name: 'xx', type: 'int' }\n\t]\n} );\n\nconst mx_hash_int_4 = /*@__PURE__*/ Fn( ( [ x_immutable, y_immutable, z_immutable, xx_immutable, yy_immutable ] ) => {\n\n\tconst yy = int( yy_immutable ).toVar();\n\tconst xx = int( xx_immutable ).toVar();\n\tconst z = int( z_immutable ).toVar();\n\tconst y = int( y_immutable ).toVar();\n\tconst x = int( x_immutable ).toVar();\n\tconst len = uint( uint( 5 ) ).toVar();\n\tconst a = uint().toVar(), b = uint().toVar(), c = uint().toVar();\n\ta.assign( b.assign( c.assign( uint( int( 0xdeadbeef ) ).add( len.shiftLeft( uint( 2 ) ) ).add( uint( 13 ) ) ) ) );\n\ta.addAssign( uint( x ) );\n\tb.addAssign( uint( y ) );\n\tc.addAssign( uint( z ) );\n\tmx_bjmix( a, b, c );\n\ta.addAssign( uint( xx ) );\n\tb.addAssign( uint( yy ) );\n\n\treturn mx_bjfinal( a, b, c );\n\n} ).setLayout( {\n\tname: 'mx_hash_int_4',\n\ttype: 'uint',\n\tinputs: [\n\t\t{ name: 'x', type: 'int' },\n\t\t{ name: 'y', type: 'int' },\n\t\t{ name: 'z', type: 'int' },\n\t\t{ name: 'xx', type: 'int' },\n\t\t{ name: 'yy', type: 'int' }\n\t]\n} );\n\nconst mx_hash_int = /*@__PURE__*/ overloadingFn( [ mx_hash_int_0, mx_hash_int_1, mx_hash_int_2, mx_hash_int_3, mx_hash_int_4 ] );\n\nconst mx_hash_vec3_0 = /*@__PURE__*/ Fn( ( [ x_immutable, y_immutable ] ) => {\n\n\tconst y = int( y_immutable ).toVar();\n\tconst x = int( x_immutable ).toVar();\n\tconst h = uint( mx_hash_int( x, y ) ).toVar();\n\tconst result = uvec3().toVar();\n\tresult.x.assign( h.bitAnd( int( 0xFF ) ) );\n\tresult.y.assign( h.shiftRight( int( 8 ) ).bitAnd( int( 0xFF ) ) );\n\tresult.z.assign( h.shiftRight( int( 16 ) ).bitAnd( int( 0xFF ) ) );\n\n\treturn result;\n\n} ).setLayout( {\n\tname: 'mx_hash_vec3_0',\n\ttype: 'uvec3',\n\tinputs: [\n\t\t{ name: 'x', type: 'int' },\n\t\t{ name: 'y', type: 'int' }\n\t]\n} );\n\nconst mx_hash_vec3_1 = /*@__PURE__*/ Fn( ( [ x_immutable, y_immutable, z_immutable ] ) => {\n\n\tconst z = int( z_immutable ).toVar();\n\tconst y = int( y_immutable ).toVar();\n\tconst x = int( x_immutable ).toVar();\n\tconst h = uint( mx_hash_int( x, y, z ) ).toVar();\n\tconst result = uvec3().toVar();\n\tresult.x.assign( h.bitAnd( int( 0xFF ) ) );\n\tresult.y.assign( h.shiftRight( int( 8 ) ).bitAnd( int( 0xFF ) ) );\n\tresult.z.assign( h.shiftRight( int( 16 ) ).bitAnd( int( 0xFF ) ) );\n\n\treturn result;\n\n} ).setLayout( {\n\tname: 'mx_hash_vec3_1',\n\ttype: 'uvec3',\n\tinputs: [\n\t\t{ name: 'x', type: 'int' },\n\t\t{ name: 'y', type: 'int' },\n\t\t{ name: 'z', type: 'int' }\n\t]\n} );\n\nconst mx_hash_vec3 = /*@__PURE__*/ overloadingFn( [ mx_hash_vec3_0, mx_hash_vec3_1 ] );\n\nconst mx_perlin_noise_float_0 = /*@__PURE__*/ Fn( ( [ p_immutable ] ) => {\n\n\tconst p = vec2( p_immutable ).toVar();\n\tconst X = int().toVar(), Y = int().toVar();\n\tconst fx = float( mx_floorfrac( p.x, X ) ).toVar();\n\tconst fy = float( mx_floorfrac( p.y, Y ) ).toVar();\n\tconst u = float( mx_fade( fx ) ).toVar();\n\tconst v = float( mx_fade( fy ) ).toVar();\n\tconst result = float( mx_bilerp( mx_gradient_float( mx_hash_int( X, Y ), fx, fy ), mx_gradient_float( mx_hash_int( X.add( int( 1 ) ), Y ), fx.sub( 1.0 ), fy ), mx_gradient_float( mx_hash_int( X, Y.add( int( 1 ) ) ), fx, fy.sub( 1.0 ) ), mx_gradient_float( mx_hash_int( X.add( int( 1 ) ), Y.add( int( 1 ) ) ), fx.sub( 1.0 ), fy.sub( 1.0 ) ), u, v ) ).toVar();\n\n\treturn mx_gradient_scale2d( result );\n\n} ).setLayout( {\n\tname: 'mx_perlin_noise_float_0',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'p', type: 'vec2' }\n\t]\n} );\n\nconst mx_perlin_noise_float_1 = /*@__PURE__*/ Fn( ( [ p_immutable ] ) => {\n\n\tconst p = vec3( p_immutable ).toVar();\n\tconst X = int().toVar(), Y = int().toVar(), Z = int().toVar();\n\tconst fx = float( mx_floorfrac( p.x, X ) ).toVar();\n\tconst fy = float( mx_floorfrac( p.y, Y ) ).toVar();\n\tconst fz = float( mx_floorfrac( p.z, Z ) ).toVar();\n\tconst u = float( mx_fade( fx ) ).toVar();\n\tconst v = float( mx_fade( fy ) ).toVar();\n\tconst w = float( mx_fade( fz ) ).toVar();\n\tconst result = float( mx_trilerp( mx_gradient_float( mx_hash_int( X, Y, Z ), fx, fy, fz ), mx_gradient_float( mx_hash_int( X.add( int( 1 ) ), Y, Z ), fx.sub( 1.0 ), fy, fz ), mx_gradient_float( mx_hash_int( X, Y.add( int( 1 ) ), Z ), fx, fy.sub( 1.0 ), fz ), mx_gradient_float( mx_hash_int( X.add( int( 1 ) ), Y.add( int( 1 ) ), Z ), fx.sub( 1.0 ), fy.sub( 1.0 ), fz ), mx_gradient_float( mx_hash_int( X, Y, Z.add( int( 1 ) ) ), fx, fy, fz.sub( 1.0 ) ), mx_gradient_float( mx_hash_int( X.add( int( 1 ) ), Y, Z.add( int( 1 ) ) ), fx.sub( 1.0 ), fy, fz.sub( 1.0 ) ), mx_gradient_float( mx_hash_int( X, Y.add( int( 1 ) ), Z.add( int( 1 ) ) ), fx, fy.sub( 1.0 ), fz.sub( 1.0 ) ), mx_gradient_float( mx_hash_int( X.add( int( 1 ) ), Y.add( int( 1 ) ), Z.add( int( 1 ) ) ), fx.sub( 1.0 ), fy.sub( 1.0 ), fz.sub( 1.0 ) ), u, v, w ) ).toVar();\n\n\treturn mx_gradient_scale3d( result );\n\n} ).setLayout( {\n\tname: 'mx_perlin_noise_float_1',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'p', type: 'vec3' }\n\t]\n} );\n\nconst mx_perlin_noise_float = /*@__PURE__*/ overloadingFn( [ mx_perlin_noise_float_0, mx_perlin_noise_float_1 ] );\n\nconst mx_perlin_noise_vec3_0 = /*@__PURE__*/ Fn( ( [ p_immutable ] ) => {\n\n\tconst p = vec2( p_immutable ).toVar();\n\tconst X = int().toVar(), Y = int().toVar();\n\tconst fx = float( mx_floorfrac( p.x, X ) ).toVar();\n\tconst fy = float( mx_floorfrac( p.y, Y ) ).toVar();\n\tconst u = float( mx_fade( fx ) ).toVar();\n\tconst v = float( mx_fade( fy ) ).toVar();\n\tconst result = vec3( mx_bilerp( mx_gradient_vec3( mx_hash_vec3( X, Y ), fx, fy ), mx_gradient_vec3( mx_hash_vec3( X.add( int( 1 ) ), Y ), fx.sub( 1.0 ), fy ), mx_gradient_vec3( mx_hash_vec3( X, Y.add( int( 1 ) ) ), fx, fy.sub( 1.0 ) ), mx_gradient_vec3( mx_hash_vec3( X.add( int( 1 ) ), Y.add( int( 1 ) ) ), fx.sub( 1.0 ), fy.sub( 1.0 ) ), u, v ) ).toVar();\n\n\treturn mx_gradient_scale2d( result );\n\n} ).setLayout( {\n\tname: 'mx_perlin_noise_vec3_0',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'p', type: 'vec2' }\n\t]\n} );\n\nconst mx_perlin_noise_vec3_1 = /*@__PURE__*/ Fn( ( [ p_immutable ] ) => {\n\n\tconst p = vec3( p_immutable ).toVar();\n\tconst X = int().toVar(), Y = int().toVar(), Z = int().toVar();\n\tconst fx = float( mx_floorfrac( p.x, X ) ).toVar();\n\tconst fy = float( mx_floorfrac( p.y, Y ) ).toVar();\n\tconst fz = float( mx_floorfrac( p.z, Z ) ).toVar();\n\tconst u = float( mx_fade( fx ) ).toVar();\n\tconst v = float( mx_fade( fy ) ).toVar();\n\tconst w = float( mx_fade( fz ) ).toVar();\n\tconst result = vec3( mx_trilerp( mx_gradient_vec3( mx_hash_vec3( X, Y, Z ), fx, fy, fz ), mx_gradient_vec3( mx_hash_vec3( X.add( int( 1 ) ), Y, Z ), fx.sub( 1.0 ), fy, fz ), mx_gradient_vec3( mx_hash_vec3( X, Y.add( int( 1 ) ), Z ), fx, fy.sub( 1.0 ), fz ), mx_gradient_vec3( mx_hash_vec3( X.add( int( 1 ) ), Y.add( int( 1 ) ), Z ), fx.sub( 1.0 ), fy.sub( 1.0 ), fz ), mx_gradient_vec3( mx_hash_vec3( X, Y, Z.add( int( 1 ) ) ), fx, fy, fz.sub( 1.0 ) ), mx_gradient_vec3( mx_hash_vec3( X.add( int( 1 ) ), Y, Z.add( int( 1 ) ) ), fx.sub( 1.0 ), fy, fz.sub( 1.0 ) ), mx_gradient_vec3( mx_hash_vec3( X, Y.add( int( 1 ) ), Z.add( int( 1 ) ) ), fx, fy.sub( 1.0 ), fz.sub( 1.0 ) ), mx_gradient_vec3( mx_hash_vec3( X.add( int( 1 ) ), Y.add( int( 1 ) ), Z.add( int( 1 ) ) ), fx.sub( 1.0 ), fy.sub( 1.0 ), fz.sub( 1.0 ) ), u, v, w ) ).toVar();\n\n\treturn mx_gradient_scale3d( result );\n\n} ).setLayout( {\n\tname: 'mx_perlin_noise_vec3_1',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'p', type: 'vec3' }\n\t]\n} );\n\nconst mx_perlin_noise_vec3 = /*@__PURE__*/ overloadingFn( [ mx_perlin_noise_vec3_0, mx_perlin_noise_vec3_1 ] );\n\nconst mx_cell_noise_float_0 = /*@__PURE__*/ Fn( ( [ p_immutable ] ) => {\n\n\tconst p = float( p_immutable ).toVar();\n\tconst ix = int( mx_floor( p ) ).toVar();\n\n\treturn mx_bits_to_01( mx_hash_int( ix ) );\n\n} ).setLayout( {\n\tname: 'mx_cell_noise_float_0',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'p', type: 'float' }\n\t]\n} );\n\nconst mx_cell_noise_float_1 = /*@__PURE__*/ Fn( ( [ p_immutable ] ) => {\n\n\tconst p = vec2( p_immutable ).toVar();\n\tconst ix = int( mx_floor( p.x ) ).toVar();\n\tconst iy = int( mx_floor( p.y ) ).toVar();\n\n\treturn mx_bits_to_01( mx_hash_int( ix, iy ) );\n\n} ).setLayout( {\n\tname: 'mx_cell_noise_float_1',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'p', type: 'vec2' }\n\t]\n} );\n\nconst mx_cell_noise_float_2 = /*@__PURE__*/ Fn( ( [ p_immutable ] ) => {\n\n\tconst p = vec3( p_immutable ).toVar();\n\tconst ix = int( mx_floor( p.x ) ).toVar();\n\tconst iy = int( mx_floor( p.y ) ).toVar();\n\tconst iz = int( mx_floor( p.z ) ).toVar();\n\n\treturn mx_bits_to_01( mx_hash_int( ix, iy, iz ) );\n\n} ).setLayout( {\n\tname: 'mx_cell_noise_float_2',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'p', type: 'vec3' }\n\t]\n} );\n\nconst mx_cell_noise_float_3 = /*@__PURE__*/ Fn( ( [ p_immutable ] ) => {\n\n\tconst p = vec4( p_immutable ).toVar();\n\tconst ix = int( mx_floor( p.x ) ).toVar();\n\tconst iy = int( mx_floor( p.y ) ).toVar();\n\tconst iz = int( mx_floor( p.z ) ).toVar();\n\tconst iw = int( mx_floor( p.w ) ).toVar();\n\n\treturn mx_bits_to_01( mx_hash_int( ix, iy, iz, iw ) );\n\n} ).setLayout( {\n\tname: 'mx_cell_noise_float_3',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'p', type: 'vec4' }\n\t]\n} );\n\nconst mx_cell_noise_float$1 = /*@__PURE__*/ overloadingFn( [ mx_cell_noise_float_0, mx_cell_noise_float_1, mx_cell_noise_float_2, mx_cell_noise_float_3 ] );\n\nconst mx_cell_noise_vec3_0 = /*@__PURE__*/ Fn( ( [ p_immutable ] ) => {\n\n\tconst p = float( p_immutable ).toVar();\n\tconst ix = int( mx_floor( p ) ).toVar();\n\n\treturn vec3( mx_bits_to_01( mx_hash_int( ix, int( 0 ) ) ), mx_bits_to_01( mx_hash_int( ix, int( 1 ) ) ), mx_bits_to_01( mx_hash_int( ix, int( 2 ) ) ) );\n\n} ).setLayout( {\n\tname: 'mx_cell_noise_vec3_0',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'p', type: 'float' }\n\t]\n} );\n\nconst mx_cell_noise_vec3_1 = /*@__PURE__*/ Fn( ( [ p_immutable ] ) => {\n\n\tconst p = vec2( p_immutable ).toVar();\n\tconst ix = int( mx_floor( p.x ) ).toVar();\n\tconst iy = int( mx_floor( p.y ) ).toVar();\n\n\treturn vec3( mx_bits_to_01( mx_hash_int( ix, iy, int( 0 ) ) ), mx_bits_to_01( mx_hash_int( ix, iy, int( 1 ) ) ), mx_bits_to_01( mx_hash_int( ix, iy, int( 2 ) ) ) );\n\n} ).setLayout( {\n\tname: 'mx_cell_noise_vec3_1',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'p', type: 'vec2' }\n\t]\n} );\n\nconst mx_cell_noise_vec3_2 = /*@__PURE__*/ Fn( ( [ p_immutable ] ) => {\n\n\tconst p = vec3( p_immutable ).toVar();\n\tconst ix = int( mx_floor( p.x ) ).toVar();\n\tconst iy = int( mx_floor( p.y ) ).toVar();\n\tconst iz = int( mx_floor( p.z ) ).toVar();\n\n\treturn vec3( mx_bits_to_01( mx_hash_int( ix, iy, iz, int( 0 ) ) ), mx_bits_to_01( mx_hash_int( ix, iy, iz, int( 1 ) ) ), mx_bits_to_01( mx_hash_int( ix, iy, iz, int( 2 ) ) ) );\n\n} ).setLayout( {\n\tname: 'mx_cell_noise_vec3_2',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'p', type: 'vec3' }\n\t]\n} );\n\nconst mx_cell_noise_vec3_3 = /*@__PURE__*/ Fn( ( [ p_immutable ] ) => {\n\n\tconst p = vec4( p_immutable ).toVar();\n\tconst ix = int( mx_floor( p.x ) ).toVar();\n\tconst iy = int( mx_floor( p.y ) ).toVar();\n\tconst iz = int( mx_floor( p.z ) ).toVar();\n\tconst iw = int( mx_floor( p.w ) ).toVar();\n\n\treturn vec3( mx_bits_to_01( mx_hash_int( ix, iy, iz, iw, int( 0 ) ) ), mx_bits_to_01( mx_hash_int( ix, iy, iz, iw, int( 1 ) ) ), mx_bits_to_01( mx_hash_int( ix, iy, iz, iw, int( 2 ) ) ) );\n\n} ).setLayout( {\n\tname: 'mx_cell_noise_vec3_3',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'p', type: 'vec4' }\n\t]\n} );\n\nconst mx_cell_noise_vec3 = /*@__PURE__*/ overloadingFn( [ mx_cell_noise_vec3_0, mx_cell_noise_vec3_1, mx_cell_noise_vec3_2, mx_cell_noise_vec3_3 ] );\n\nconst mx_fractal_noise_float$1 = /*@__PURE__*/ Fn( ( [ p_immutable, octaves_immutable, lacunarity_immutable, diminish_immutable ] ) => {\n\n\tconst diminish = float( diminish_immutable ).toVar();\n\tconst lacunarity = float( lacunarity_immutable ).toVar();\n\tconst octaves = int( octaves_immutable ).toVar();\n\tconst p = vec3( p_immutable ).toVar();\n\tconst result = float( 0.0 ).toVar();\n\tconst amplitude = float( 1.0 ).toVar();\n\n\tLoop( octaves, () => {\n\n\t\tresult.addAssign( amplitude.mul( mx_perlin_noise_float( p ) ) );\n\t\tamplitude.mulAssign( diminish );\n\t\tp.mulAssign( lacunarity );\n\n\t} );\n\n\treturn result;\n\n} ).setLayout( {\n\tname: 'mx_fractal_noise_float',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'p', type: 'vec3' },\n\t\t{ name: 'octaves', type: 'int' },\n\t\t{ name: 'lacunarity', type: 'float' },\n\t\t{ name: 'diminish', type: 'float' }\n\t]\n} );\n\nconst mx_fractal_noise_vec3$1 = /*@__PURE__*/ Fn( ( [ p_immutable, octaves_immutable, lacunarity_immutable, diminish_immutable ] ) => {\n\n\tconst diminish = float( diminish_immutable ).toVar();\n\tconst lacunarity = float( lacunarity_immutable ).toVar();\n\tconst octaves = int( octaves_immutable ).toVar();\n\tconst p = vec3( p_immutable ).toVar();\n\tconst result = vec3( 0.0 ).toVar();\n\tconst amplitude = float( 1.0 ).toVar();\n\n\tLoop( octaves, () => {\n\n\t\tresult.addAssign( amplitude.mul( mx_perlin_noise_vec3( p ) ) );\n\t\tamplitude.mulAssign( diminish );\n\t\tp.mulAssign( lacunarity );\n\n\t} );\n\n\treturn result;\n\n} ).setLayout( {\n\tname: 'mx_fractal_noise_vec3',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'p', type: 'vec3' },\n\t\t{ name: 'octaves', type: 'int' },\n\t\t{ name: 'lacunarity', type: 'float' },\n\t\t{ name: 'diminish', type: 'float' }\n\t]\n} );\n\nconst mx_fractal_noise_vec2$1 = /*@__PURE__*/ Fn( ( [ p_immutable, octaves_immutable, lacunarity_immutable, diminish_immutable ] ) => {\n\n\tconst diminish = float( diminish_immutable ).toVar();\n\tconst lacunarity = float( lacunarity_immutable ).toVar();\n\tconst octaves = int( octaves_immutable ).toVar();\n\tconst p = vec3( p_immutable ).toVar();\n\n\treturn vec2( mx_fractal_noise_float$1( p, octaves, lacunarity, diminish ), mx_fractal_noise_float$1( p.add( vec3( int( 19 ), int( 193 ), int( 17 ) ) ), octaves, lacunarity, diminish ) );\n\n} ).setLayout( {\n\tname: 'mx_fractal_noise_vec2',\n\ttype: 'vec2',\n\tinputs: [\n\t\t{ name: 'p', type: 'vec3' },\n\t\t{ name: 'octaves', type: 'int' },\n\t\t{ name: 'lacunarity', type: 'float' },\n\t\t{ name: 'diminish', type: 'float' }\n\t]\n} );\n\nconst mx_fractal_noise_vec4$1 = /*@__PURE__*/ Fn( ( [ p_immutable, octaves_immutable, lacunarity_immutable, diminish_immutable ] ) => {\n\n\tconst diminish = float( diminish_immutable ).toVar();\n\tconst lacunarity = float( lacunarity_immutable ).toVar();\n\tconst octaves = int( octaves_immutable ).toVar();\n\tconst p = vec3( p_immutable ).toVar();\n\tconst c = vec3( mx_fractal_noise_vec3$1( p, octaves, lacunarity, diminish ) ).toVar();\n\tconst f = float( mx_fractal_noise_float$1( p.add( vec3( int( 19 ), int( 193 ), int( 17 ) ) ), octaves, lacunarity, diminish ) ).toVar();\n\n\treturn vec4( c, f );\n\n} ).setLayout( {\n\tname: 'mx_fractal_noise_vec4',\n\ttype: 'vec4',\n\tinputs: [\n\t\t{ name: 'p', type: 'vec3' },\n\t\t{ name: 'octaves', type: 'int' },\n\t\t{ name: 'lacunarity', type: 'float' },\n\t\t{ name: 'diminish', type: 'float' }\n\t]\n} );\n\nconst mx_worley_distance_0 = /*@__PURE__*/ Fn( ( [ p_immutable, x_immutable, y_immutable, xoff_immutable, yoff_immutable, jitter_immutable, metric_immutable ] ) => {\n\n\tconst metric = int( metric_immutable ).toVar();\n\tconst jitter = float( jitter_immutable ).toVar();\n\tconst yoff = int( yoff_immutable ).toVar();\n\tconst xoff = int( xoff_immutable ).toVar();\n\tconst y = int( y_immutable ).toVar();\n\tconst x = int( x_immutable ).toVar();\n\tconst p = vec2( p_immutable ).toVar();\n\tconst tmp = vec3( mx_cell_noise_vec3( vec2( x.add( xoff ), y.add( yoff ) ) ) ).toVar();\n\tconst off = vec2( tmp.x, tmp.y ).toVar();\n\toff.subAssign( 0.5 );\n\toff.mulAssign( jitter );\n\toff.addAssign( 0.5 );\n\tconst cellpos = vec2( vec2( float( x ), float( y ) ).add( off ) ).toVar();\n\tconst diff = vec2( cellpos.sub( p ) ).toVar();\n\n\tIf( metric.equal( int( 2 ) ), () => {\n\n\t\treturn abs( diff.x ).add( abs( diff.y ) );\n\n\t} );\n\n\tIf( metric.equal( int( 3 ) ), () => {\n\n\t\treturn max$1( abs( diff.x ), abs( diff.y ) );\n\n\t} );\n\n\treturn dot( diff, diff );\n\n} ).setLayout( {\n\tname: 'mx_worley_distance_0',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'p', type: 'vec2' },\n\t\t{ name: 'x', type: 'int' },\n\t\t{ name: 'y', type: 'int' },\n\t\t{ name: 'xoff', type: 'int' },\n\t\t{ name: 'yoff', type: 'int' },\n\t\t{ name: 'jitter', type: 'float' },\n\t\t{ name: 'metric', type: 'int' }\n\t]\n} );\n\nconst mx_worley_distance_1 = /*@__PURE__*/ Fn( ( [ p_immutable, x_immutable, y_immutable, z_immutable, xoff_immutable, yoff_immutable, zoff_immutable, jitter_immutable, metric_immutable ] ) => {\n\n\tconst metric = int( metric_immutable ).toVar();\n\tconst jitter = float( jitter_immutable ).toVar();\n\tconst zoff = int( zoff_immutable ).toVar();\n\tconst yoff = int( yoff_immutable ).toVar();\n\tconst xoff = int( xoff_immutable ).toVar();\n\tconst z = int( z_immutable ).toVar();\n\tconst y = int( y_immutable ).toVar();\n\tconst x = int( x_immutable ).toVar();\n\tconst p = vec3( p_immutable ).toVar();\n\tconst off = vec3( mx_cell_noise_vec3( vec3( x.add( xoff ), y.add( yoff ), z.add( zoff ) ) ) ).toVar();\n\toff.subAssign( 0.5 );\n\toff.mulAssign( jitter );\n\toff.addAssign( 0.5 );\n\tconst cellpos = vec3( vec3( float( x ), float( y ), float( z ) ).add( off ) ).toVar();\n\tconst diff = vec3( cellpos.sub( p ) ).toVar();\n\n\tIf( metric.equal( int( 2 ) ), () => {\n\n\t\treturn abs( diff.x ).add( abs( diff.y ) ).add( abs( diff.z ) );\n\n\t} );\n\n\tIf( metric.equal( int( 3 ) ), () => {\n\n\t\treturn max$1( abs( diff.x ), abs( diff.y ), abs( diff.z ) );\n\n\t} );\n\n\treturn dot( diff, diff );\n\n} ).setLayout( {\n\tname: 'mx_worley_distance_1',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'p', type: 'vec3' },\n\t\t{ name: 'x', type: 'int' },\n\t\t{ name: 'y', type: 'int' },\n\t\t{ name: 'z', type: 'int' },\n\t\t{ name: 'xoff', type: 'int' },\n\t\t{ name: 'yoff', type: 'int' },\n\t\t{ name: 'zoff', type: 'int' },\n\t\t{ name: 'jitter', type: 'float' },\n\t\t{ name: 'metric', type: 'int' }\n\t]\n} );\n\nconst mx_worley_distance = /*@__PURE__*/ overloadingFn( [ mx_worley_distance_0, mx_worley_distance_1 ] );\n\nconst mx_worley_noise_float_0 = /*@__PURE__*/ Fn( ( [ p_immutable, jitter_immutable, metric_immutable ] ) => {\n\n\tconst metric = int( metric_immutable ).toVar();\n\tconst jitter = float( jitter_immutable ).toVar();\n\tconst p = vec2( p_immutable ).toVar();\n\tconst X = int().toVar(), Y = int().toVar();\n\tconst localpos = vec2( mx_floorfrac( p.x, X ), mx_floorfrac( p.y, Y ) ).toVar();\n\tconst sqdist = float( 1e6 ).toVar();\n\n\tLoop( { start: -1, end: int( 1 ), name: 'x', condition: '<=' }, ( { x } ) => {\n\n\t\tLoop( { start: -1, end: int( 1 ), name: 'y', condition: '<=' }, ( { y } ) => {\n\n\t\t\tconst dist = float( mx_worley_distance( localpos, x, y, X, Y, jitter, metric ) ).toVar();\n\t\t\tsqdist.assign( min$1( sqdist, dist ) );\n\n\t\t} );\n\n\t} );\n\n\tIf( metric.equal( int( 0 ) ), () => {\n\n\t\tsqdist.assign( sqrt( sqdist ) );\n\n\t} );\n\n\treturn sqdist;\n\n} ).setLayout( {\n\tname: 'mx_worley_noise_float_0',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'p', type: 'vec2' },\n\t\t{ name: 'jitter', type: 'float' },\n\t\t{ name: 'metric', type: 'int' }\n\t]\n} );\n\nconst mx_worley_noise_vec2_0 = /*@__PURE__*/ Fn( ( [ p_immutable, jitter_immutable, metric_immutable ] ) => {\n\n\tconst metric = int( metric_immutable ).toVar();\n\tconst jitter = float( jitter_immutable ).toVar();\n\tconst p = vec2( p_immutable ).toVar();\n\tconst X = int().toVar(), Y = int().toVar();\n\tconst localpos = vec2( mx_floorfrac( p.x, X ), mx_floorfrac( p.y, Y ) ).toVar();\n\tconst sqdist = vec2( 1e6, 1e6 ).toVar();\n\n\tLoop( { start: -1, end: int( 1 ), name: 'x', condition: '<=' }, ( { x } ) => {\n\n\t\tLoop( { start: -1, end: int( 1 ), name: 'y', condition: '<=' }, ( { y } ) => {\n\n\t\t\tconst dist = float( mx_worley_distance( localpos, x, y, X, Y, jitter, metric ) ).toVar();\n\n\t\t\tIf( dist.lessThan( sqdist.x ), () => {\n\n\t\t\t\tsqdist.y.assign( sqdist.x );\n\t\t\t\tsqdist.x.assign( dist );\n\n\t\t\t} ).ElseIf( dist.lessThan( sqdist.y ), () => {\n\n\t\t\t\tsqdist.y.assign( dist );\n\n\t\t\t} );\n\n\t\t} );\n\n\t} );\n\n\tIf( metric.equal( int( 0 ) ), () => {\n\n\t\tsqdist.assign( sqrt( sqdist ) );\n\n\t} );\n\n\treturn sqdist;\n\n} ).setLayout( {\n\tname: 'mx_worley_noise_vec2_0',\n\ttype: 'vec2',\n\tinputs: [\n\t\t{ name: 'p', type: 'vec2' },\n\t\t{ name: 'jitter', type: 'float' },\n\t\t{ name: 'metric', type: 'int' }\n\t]\n} );\n\nconst mx_worley_noise_vec3_0 = /*@__PURE__*/ Fn( ( [ p_immutable, jitter_immutable, metric_immutable ] ) => {\n\n\tconst metric = int( metric_immutable ).toVar();\n\tconst jitter = float( jitter_immutable ).toVar();\n\tconst p = vec2( p_immutable ).toVar();\n\tconst X = int().toVar(), Y = int().toVar();\n\tconst localpos = vec2( mx_floorfrac( p.x, X ), mx_floorfrac( p.y, Y ) ).toVar();\n\tconst sqdist = vec3( 1e6, 1e6, 1e6 ).toVar();\n\n\tLoop( { start: -1, end: int( 1 ), name: 'x', condition: '<=' }, ( { x } ) => {\n\n\t\tLoop( { start: -1, end: int( 1 ), name: 'y', condition: '<=' }, ( { y } ) => {\n\n\t\t\tconst dist = float( mx_worley_distance( localpos, x, y, X, Y, jitter, metric ) ).toVar();\n\n\t\t\tIf( dist.lessThan( sqdist.x ), () => {\n\n\t\t\t\tsqdist.z.assign( sqdist.y );\n\t\t\t\tsqdist.y.assign( sqdist.x );\n\t\t\t\tsqdist.x.assign( dist );\n\n\t\t\t} ).ElseIf( dist.lessThan( sqdist.y ), () => {\n\n\t\t\t\tsqdist.z.assign( sqdist.y );\n\t\t\t\tsqdist.y.assign( dist );\n\n\t\t\t} ).ElseIf( dist.lessThan( sqdist.z ), () => {\n\n\t\t\t\tsqdist.z.assign( dist );\n\n\t\t\t} );\n\n\t\t} );\n\n\t} );\n\n\tIf( metric.equal( int( 0 ) ), () => {\n\n\t\tsqdist.assign( sqrt( sqdist ) );\n\n\t} );\n\n\treturn sqdist;\n\n} ).setLayout( {\n\tname: 'mx_worley_noise_vec3_0',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'p', type: 'vec2' },\n\t\t{ name: 'jitter', type: 'float' },\n\t\t{ name: 'metric', type: 'int' }\n\t]\n} );\n\nconst mx_worley_noise_float_1 = /*@__PURE__*/ Fn( ( [ p_immutable, jitter_immutable, metric_immutable ] ) => {\n\n\tconst metric = int( metric_immutable ).toVar();\n\tconst jitter = float( jitter_immutable ).toVar();\n\tconst p = vec3( p_immutable ).toVar();\n\tconst X = int().toVar(), Y = int().toVar(), Z = int().toVar();\n\tconst localpos = vec3( mx_floorfrac( p.x, X ), mx_floorfrac( p.y, Y ), mx_floorfrac( p.z, Z ) ).toVar();\n\tconst sqdist = float( 1e6 ).toVar();\n\n\tLoop( { start: -1, end: int( 1 ), name: 'x', condition: '<=' }, ( { x } ) => {\n\n\t\tLoop( { start: -1, end: int( 1 ), name: 'y', condition: '<=' }, ( { y } ) => {\n\n\t\t\tLoop( { start: -1, end: int( 1 ), name: 'z', condition: '<=' }, ( { z } ) => {\n\n\t\t\t\tconst dist = float( mx_worley_distance( localpos, x, y, z, X, Y, Z, jitter, metric ) ).toVar();\n\t\t\t\tsqdist.assign( min$1( sqdist, dist ) );\n\n\t\t\t} );\n\n\t\t} );\n\n\t} );\n\n\tIf( metric.equal( int( 0 ) ), () => {\n\n\t\tsqdist.assign( sqrt( sqdist ) );\n\n\t} );\n\n\treturn sqdist;\n\n} ).setLayout( {\n\tname: 'mx_worley_noise_float_1',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'p', type: 'vec3' },\n\t\t{ name: 'jitter', type: 'float' },\n\t\t{ name: 'metric', type: 'int' }\n\t]\n} );\n\nconst mx_worley_noise_float$1 = /*@__PURE__*/ overloadingFn( [ mx_worley_noise_float_0, mx_worley_noise_float_1 ] );\n\nconst mx_worley_noise_vec2_1 = /*@__PURE__*/ Fn( ( [ p_immutable, jitter_immutable, metric_immutable ] ) => {\n\n\tconst metric = int( metric_immutable ).toVar();\n\tconst jitter = float( jitter_immutable ).toVar();\n\tconst p = vec3( p_immutable ).toVar();\n\tconst X = int().toVar(), Y = int().toVar(), Z = int().toVar();\n\tconst localpos = vec3( mx_floorfrac( p.x, X ), mx_floorfrac( p.y, Y ), mx_floorfrac( p.z, Z ) ).toVar();\n\tconst sqdist = vec2( 1e6, 1e6 ).toVar();\n\n\tLoop( { start: -1, end: int( 1 ), name: 'x', condition: '<=' }, ( { x } ) => {\n\n\t\tLoop( { start: -1, end: int( 1 ), name: 'y', condition: '<=' }, ( { y } ) => {\n\n\t\t\tLoop( { start: -1, end: int( 1 ), name: 'z', condition: '<=' }, ( { z } ) => {\n\n\t\t\t\tconst dist = float( mx_worley_distance( localpos, x, y, z, X, Y, Z, jitter, metric ) ).toVar();\n\n\t\t\t\tIf( dist.lessThan( sqdist.x ), () => {\n\n\t\t\t\t\tsqdist.y.assign( sqdist.x );\n\t\t\t\t\tsqdist.x.assign( dist );\n\n\t\t\t\t} ).ElseIf( dist.lessThan( sqdist.y ), () => {\n\n\t\t\t\t\tsqdist.y.assign( dist );\n\n\t\t\t\t} );\n\n\t\t\t} );\n\n\t\t} );\n\n\t} );\n\n\tIf( metric.equal( int( 0 ) ), () => {\n\n\t\tsqdist.assign( sqrt( sqdist ) );\n\n\t} );\n\n\treturn sqdist;\n\n} ).setLayout( {\n\tname: 'mx_worley_noise_vec2_1',\n\ttype: 'vec2',\n\tinputs: [\n\t\t{ name: 'p', type: 'vec3' },\n\t\t{ name: 'jitter', type: 'float' },\n\t\t{ name: 'metric', type: 'int' }\n\t]\n} );\n\nconst mx_worley_noise_vec2$1 = /*@__PURE__*/ overloadingFn( [ mx_worley_noise_vec2_0, mx_worley_noise_vec2_1 ] );\n\nconst mx_worley_noise_vec3_1 = /*@__PURE__*/ Fn( ( [ p_immutable, jitter_immutable, metric_immutable ] ) => {\n\n\tconst metric = int( metric_immutable ).toVar();\n\tconst jitter = float( jitter_immutable ).toVar();\n\tconst p = vec3( p_immutable ).toVar();\n\tconst X = int().toVar(), Y = int().toVar(), Z = int().toVar();\n\tconst localpos = vec3( mx_floorfrac( p.x, X ), mx_floorfrac( p.y, Y ), mx_floorfrac( p.z, Z ) ).toVar();\n\tconst sqdist = vec3( 1e6, 1e6, 1e6 ).toVar();\n\n\tLoop( { start: -1, end: int( 1 ), name: 'x', condition: '<=' }, ( { x } ) => {\n\n\t\tLoop( { start: -1, end: int( 1 ), name: 'y', condition: '<=' }, ( { y } ) => {\n\n\t\t\tLoop( { start: -1, end: int( 1 ), name: 'z', condition: '<=' }, ( { z } ) => {\n\n\t\t\t\tconst dist = float( mx_worley_distance( localpos, x, y, z, X, Y, Z, jitter, metric ) ).toVar();\n\n\t\t\t\tIf( dist.lessThan( sqdist.x ), () => {\n\n\t\t\t\t\tsqdist.z.assign( sqdist.y );\n\t\t\t\t\tsqdist.y.assign( sqdist.x );\n\t\t\t\t\tsqdist.x.assign( dist );\n\n\t\t\t\t} ).ElseIf( dist.lessThan( sqdist.y ), () => {\n\n\t\t\t\t\tsqdist.z.assign( sqdist.y );\n\t\t\t\t\tsqdist.y.assign( dist );\n\n\t\t\t\t} ).ElseIf( dist.lessThan( sqdist.z ), () => {\n\n\t\t\t\t\tsqdist.z.assign( dist );\n\n\t\t\t\t} );\n\n\t\t\t} );\n\n\t\t} );\n\n\t} );\n\n\tIf( metric.equal( int( 0 ) ), () => {\n\n\t\tsqdist.assign( sqrt( sqdist ) );\n\n\t} );\n\n\treturn sqdist;\n\n} ).setLayout( {\n\tname: 'mx_worley_noise_vec3_1',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'p', type: 'vec3' },\n\t\t{ name: 'jitter', type: 'float' },\n\t\t{ name: 'metric', type: 'int' }\n\t]\n} );\n\nconst mx_worley_noise_vec3$1 = /*@__PURE__*/ overloadingFn( [ mx_worley_noise_vec3_0, mx_worley_noise_vec3_1 ] );\n\n// Unified Noise 2D\nconst mx_unifiednoise2d$1 = /*@__PURE__*/ Fn( ( [\n\tnoiseType_immutable, texcoord_immutable, freq_immutable, offset_immutable,\n\tjitter_immutable, outmin_immutable, outmax_immutable, clampoutput_immutable,\n\toctaves_immutable, lacunarity_immutable, diminish_immutable\n] ) => {\n\n\tconst noiseType = int( noiseType_immutable ).toVar();\n\tconst texcoord = vec2( texcoord_immutable ).toVar();\n\tconst freq = vec2( freq_immutable ).toVar();\n\tconst offset = vec2( offset_immutable ).toVar();\n\tconst jitter = float( jitter_immutable ).toVar();\n\tconst outmin = float( outmin_immutable ).toVar();\n\tconst outmax = float( outmax_immutable ).toVar();\n\tconst clampoutput = bool( clampoutput_immutable ).toVar();\n\tconst octaves = int( octaves_immutable ).toVar();\n\tconst lacunarity = float( lacunarity_immutable ).toVar();\n\tconst diminish = float( diminish_immutable ).toVar();\n\n\t// Compute input position\n\tconst p = texcoord.mul( freq ).add( offset );\n\n\tconst result = float( 0.0 ).toVar();\n\n\t// Perlin\n\tIf( noiseType.equal( int( 0 ) ), () => {\n\n\t\tresult.assign( mx_perlin_noise_vec3( p ) );\n\n\t} );\n\n\t// Cell\n\tIf( noiseType.equal( int( 1 ) ), () => {\n\n\t\tresult.assign( mx_cell_noise_vec3( p ) );\n\n\t} );\n\n\t// Worley (metric=0 = euclidean)\n\tIf( noiseType.equal( int( 2 ) ), () => {\n\n\t\tresult.assign( mx_worley_noise_vec3$1( p, jitter, int( 0 ) ) );\n\n\t} );\n\n\t// Fractal (use vec3(p, 0.0) for 2D input)\n\tIf( noiseType.equal( int( 3 ) ), () => {\n\n\t\tresult.assign( mx_fractal_noise_vec3$1( vec3( p, 0.0 ), octaves, lacunarity, diminish ) );\n\n\t} );\n\n\t// Remap output to [outmin, outmax]\n\tresult.assign( result.mul( outmax.sub( outmin ) ).add( outmin ) );\n\n\t// Clamp if requested\n\tIf( clampoutput, () => {\n\n\t\tresult.assign( clamp( result, outmin, outmax ) );\n\n\t} );\n\n\treturn result;\n\n} ).setLayout( {\n\tname: 'mx_unifiednoise2d',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'noiseType', type: 'int' },\n\t\t{ name: 'texcoord', type: 'vec2' },\n\t\t{ name: 'freq', type: 'vec2' },\n\t\t{ name: 'offset', type: 'vec2' },\n\t\t{ name: 'jitter', type: 'float' },\n\t\t{ name: 'outmin', type: 'float' },\n\t\t{ name: 'outmax', type: 'float' },\n\t\t{ name: 'clampoutput', type: 'bool' },\n\t\t{ name: 'octaves', type: 'int' },\n\t\t{ name: 'lacunarity', type: 'float' },\n\t\t{ name: 'diminish', type: 'float' }\n\t]\n} );\n\n// Unified Noise 3D\nconst mx_unifiednoise3d$1 = /*@__PURE__*/ Fn( ( [\n\tnoiseType_immutable, position_immutable, freq_immutable, offset_immutable,\n\tjitter_immutable, outmin_immutable, outmax_immutable, clampoutput_immutable,\n\toctaves_immutable, lacunarity_immutable, diminish_immutable\n] ) => {\n\n\tconst noiseType = int( noiseType_immutable ).toVar();\n\tconst position = vec3( position_immutable ).toVar();\n\tconst freq = vec3( freq_immutable ).toVar();\n\tconst offset = vec3( offset_immutable ).toVar();\n\tconst jitter = float( jitter_immutable ).toVar();\n\tconst outmin = float( outmin_immutable ).toVar();\n\tconst outmax = float( outmax_immutable ).toVar();\n\tconst clampoutput = bool( clampoutput_immutable ).toVar();\n\tconst octaves = int( octaves_immutable ).toVar();\n\tconst lacunarity = float( lacunarity_immutable ).toVar();\n\tconst diminish = float( diminish_immutable ).toVar();\n\n\t// Compute input position\n\tconst p = position.mul( freq ).add( offset );\n\n\tconst result = float( 0.0 ).toVar();\n\n\t// Perlin\n\tIf( noiseType.equal( int( 0 ) ), () => {\n\n\t\tresult.assign( mx_perlin_noise_vec3( p ) );\n\n\t} );\n\n\t// Cell\n\tIf( noiseType.equal( int( 1 ) ), () => {\n\n\t\tresult.assign( mx_cell_noise_vec3( p ) );\n\n\t} );\n\n\t// Worley (metric=0 = euclidean)\n\tIf( noiseType.equal( int( 2 ) ), () => {\n\n\t\tresult.assign( mx_worley_noise_vec3$1( p, jitter, int( 0 ) ) );\n\n\t} );\n\n\t// Fractal\n\tIf( noiseType.equal( int( 3 ) ), () => {\n\n\t\tresult.assign( mx_fractal_noise_vec3$1( p, octaves, lacunarity, diminish ) );\n\n\t} );\n\n\t// Remap output to [outmin, outmax]\n\tresult.assign( result.mul( outmax.sub( outmin ) ).add( outmin ) );\n\n\t// Clamp if requested\n\tIf( clampoutput, () => {\n\n\t\tresult.assign( clamp( result, outmin, outmax ) );\n\n\t} );\n\n\treturn result;\n\n} ).setLayout( {\n\tname: 'mx_unifiednoise3d',\n\ttype: 'float',\n\tinputs: [\n\t\t{ name: 'noiseType', type: 'int' },\n\t\t{ name: 'position', type: 'vec3' },\n\t\t{ name: 'freq', type: 'vec3' },\n\t\t{ name: 'offset', type: 'vec3' },\n\t\t{ name: 'jitter', type: 'float' },\n\t\t{ name: 'outmin', type: 'float' },\n\t\t{ name: 'outmax', type: 'float' },\n\t\t{ name: 'clampoutput', type: 'bool' },\n\t\t{ name: 'octaves', type: 'int' },\n\t\t{ name: 'lacunarity', type: 'float' },\n\t\t{ name: 'diminish', type: 'float' }\n\t]\n} );\n\n// Three.js Transpiler\n// https://github.com/AcademySoftwareFoundation/MaterialX/blob/main/libraries/stdlib/genglsl/lib/mx_hsv.glsl\n\n\nconst mx_hsvtorgb = /*@__PURE__*/ Fn( ( [ hsv ] ) => {\n\n\tconst s = hsv.y;\n\tconst v = hsv.z;\n\n\tconst result = vec3().toVar();\n\n\tIf( s.lessThan( 0.0001 ), () => {\n\n\t\tresult.assign( vec3( v, v, v ) );\n\n\t} ).Else( () => {\n\n\t\tlet h = hsv.x;\n\t\th = h.sub( floor( h ) ).mul( 6.0 ).toVar(); // TODO: check what .toVar() is needed in node system cache\n\t\tconst hi = int( trunc( h ) );\n\t\tconst f = h.sub( float( hi ) );\n\t\tconst p = v.mul( s.oneMinus() );\n\t\tconst q = v.mul( s.mul( f ).oneMinus() );\n\t\tconst t = v.mul( s.mul( f.oneMinus() ).oneMinus() );\n\n\t\tIf( hi.equal( int( 0 ) ), () => {\n\n\t\t\tresult.assign( vec3( v, t, p ) );\n\n\t\t} ).ElseIf( hi.equal( int( 1 ) ), () => {\n\n\t\t\tresult.assign( vec3( q, v, p ) );\n\n\t\t} ).ElseIf( hi.equal( int( 2 ) ), () => {\n\n\t\t\tresult.assign( vec3( p, v, t ) );\n\n\t\t} ).ElseIf( hi.equal( int( 3 ) ), () => {\n\n\t\t\tresult.assign( vec3( p, q, v ) );\n\n\t\t} ).ElseIf( hi.equal( int( 4 ) ), () => {\n\n\t\t\tresult.assign( vec3( t, p, v ) );\n\n\t\t} ).Else( () => {\n\n\t\t\tresult.assign( vec3( v, p, q ) );\n\n\t\t} );\n\n\t} );\n\n\treturn result;\n\n} ).setLayout( {\n\tname: 'mx_hsvtorgb',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'hsv', type: 'vec3' }\n\t]\n} );\n\nconst mx_rgbtohsv = /*@__PURE__*/ Fn( ( [ c_immutable ] ) => {\n\n\tconst c = vec3( c_immutable ).toVar();\n\tconst r = float( c.x ).toVar();\n\tconst g = float( c.y ).toVar();\n\tconst b = float( c.z ).toVar();\n\tconst mincomp = float( min$1( r, min$1( g, b ) ) ).toVar();\n\tconst maxcomp = float( max$1( r, max$1( g, b ) ) ).toVar();\n\tconst delta = float( maxcomp.sub( mincomp ) ).toVar();\n\tconst h = float().toVar(), s = float().toVar(), v = float().toVar();\n\tv.assign( maxcomp );\n\n\tIf( maxcomp.greaterThan( 0.0 ), () => {\n\n\t\ts.assign( delta.div( maxcomp ) );\n\n\t} ).Else( () => {\n\n\t\ts.assign( 0.0 );\n\n\t} );\n\n\tIf( s.lessThanEqual( 0.0 ), () => {\n\n\t\th.assign( 0.0 );\n\n\t} ).Else( () => {\n\n\t\tIf( r.greaterThanEqual( maxcomp ), () => {\n\n\t\t\th.assign( g.sub( b ).div( delta ) );\n\n\t\t} ).ElseIf( g.greaterThanEqual( maxcomp ), () => {\n\n\t\t\th.assign( add( 2.0, b.sub( r ).div( delta ) ) );\n\n\t\t} ).Else( () => {\n\n\t\t\th.assign( add( 4.0, r.sub( g ).div( delta ) ) );\n\n\t\t} );\n\n\t\th.mulAssign( 1.0 / 6.0 );\n\n\t\tIf( h.lessThan( 0.0 ), () => {\n\n\t\t\th.addAssign( 1.0 );\n\n\t\t} );\n\n\t} );\n\n\treturn vec3( h, s, v );\n\n} ).setLayout( {\n\tname: 'mx_rgbtohsv',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'c', type: 'vec3' }\n\t]\n} );\n\n// Three.js Transpiler\n// https://github.com/AcademySoftwareFoundation/MaterialX/blob/main/libraries/stdlib/genglsl/lib/mx_transform_color.glsl\n\n\nconst mx_srgb_texture_to_lin_rec709 = /*@__PURE__*/ Fn( ( [ color_immutable ] ) => {\n\n\tconst color = vec3( color_immutable ).toVar();\n\tconst isAbove = bvec3( greaterThan( color, vec3( 0.04045 ) ) ).toVar();\n\tconst linSeg = vec3( color.div( 12.92 ) ).toVar();\n\tconst powSeg = vec3( pow( max$1( color.add( vec3( 0.055 ) ), vec3( 0.0 ) ).div( 1.055 ), vec3( 2.4 ) ) ).toVar();\n\n\treturn mix( linSeg, powSeg, isAbove );\n\n} ).setLayout( {\n\tname: 'mx_srgb_texture_to_lin_rec709',\n\ttype: 'vec3',\n\tinputs: [\n\t\t{ name: 'color', type: 'vec3' }\n\t]\n} );\n\nconst mx_aastep = ( threshold, value ) => {\n\n\tthreshold = float( threshold );\n\tvalue = float( value );\n\n\tconst afwidth = vec2( value.dFdx(), value.dFdy() ).length().mul( 0.70710678118654757 );\n\n\treturn smoothstep( threshold.sub( afwidth ), threshold.add( afwidth ), value );\n\n};\n\nconst _ramp = ( a, b, uv, p ) => mix( a, b, uv[ p ].clamp() );\nconst mx_ramplr = ( valuel, valuer, texcoord = uv$1() ) => _ramp( valuel, valuer, texcoord, 'x' );\nconst mx_ramptb = ( valuet, valueb, texcoord = uv$1() ) => _ramp( valuet, valueb, texcoord, 'y' );\n\n// Bilinear ramp: interpolate between four corners (tl, tr, bl, br) using texcoord.x and texcoord.y\nconst mx_ramp4 = (\n\tvaluetl, valuetr, valuebl, valuebr, texcoord = uv$1()\n) => {\n\n\tconst u = texcoord.x.clamp();\n\tconst v = texcoord.y.clamp();\n\tconst top = mix( valuetl, valuetr, u );\n\tconst bottom = mix( valuebl, valuebr, u );\n\treturn mix( top, bottom, v );\n\n};\n\nconst _split = ( a, b, center, uv, p ) => mix( a, b, mx_aastep( center, uv[ p ] ) );\nconst mx_splitlr = ( valuel, valuer, center, texcoord = uv$1() ) => _split( valuel, valuer, center, texcoord, 'x' );\nconst mx_splittb = ( valuet, valueb, center, texcoord = uv$1() ) => _split( valuet, valueb, center, texcoord, 'y' );\n\nconst mx_transform_uv = ( uv_scale = 1, uv_offset = 0, uv_geo = uv$1() ) => uv_geo.mul( uv_scale ).add( uv_offset );\n\nconst mx_safepower = ( in1, in2 = 1 ) => {\n\n\tin1 = float( in1 );\n\n\treturn in1.abs().pow( in2 ).mul( in1.sign() );\n\n};\n\nconst mx_contrast = ( input, amount = 1, pivot = .5 ) => float( input ).sub( pivot ).mul( amount ).add( pivot );\n\nconst mx_noise_float = ( texcoord = uv$1(), amplitude = 1, pivot = 0 ) => mx_perlin_noise_float( texcoord.convert( 'vec2|vec3' ) ).mul( amplitude ).add( pivot );\n//export const mx_noise_vec2 = ( texcoord = uv(), amplitude = 1, pivot = 0 ) => mx_perlin_noise_vec3( texcoord.convert( 'vec2|vec3' ) ).mul( amplitude ).add( pivot );\nconst mx_noise_vec3 = ( texcoord = uv$1(), amplitude = 1, pivot = 0 ) => mx_perlin_noise_vec3( texcoord.convert( 'vec2|vec3' ) ).mul( amplitude ).add( pivot );\nconst mx_noise_vec4 = ( texcoord = uv$1(), amplitude = 1, pivot = 0 ) => {\n\n\ttexcoord = texcoord.convert( 'vec2|vec3' ); // overloading type\n\n\tconst noise_vec4 = vec4( mx_perlin_noise_vec3( texcoord ), mx_perlin_noise_float( texcoord.add( vec2( 19, 73 ) ) ) );\n\n\treturn noise_vec4.mul( amplitude ).add( pivot );\n\n};\n\nconst mx_unifiednoise2d = ( noiseType, texcoord = uv$1(), freq = vec2( 1, 1 ), offset = vec2( 0, 0 ), jitter = 1, outmin = 0, outmax = 1, clampoutput = false, octaves = 1, lacunarity = 2, diminish = .5 ) => mx_unifiednoise2d$1( noiseType, texcoord.convert( 'vec2|vec3' ), freq, offset, jitter, outmin, outmax, clampoutput, octaves, lacunarity, diminish );\nconst mx_unifiednoise3d = ( noiseType, texcoord = uv$1(), freq = vec2( 1, 1 ), offset = vec2( 0, 0 ), jitter = 1, outmin = 0, outmax = 1, clampoutput = false, octaves = 1, lacunarity = 2, diminish = .5 ) => mx_unifiednoise3d$1( noiseType, texcoord.convert( 'vec2|vec3' ), freq, offset, jitter, outmin, outmax, clampoutput, octaves, lacunarity, diminish );\n\nconst mx_worley_noise_float = ( texcoord = uv$1(), jitter = 1 ) => mx_worley_noise_float$1( texcoord.convert( 'vec2|vec3' ), jitter, int( 1 ) );\nconst mx_worley_noise_vec2 = ( texcoord = uv$1(), jitter = 1 ) => mx_worley_noise_vec2$1( texcoord.convert( 'vec2|vec3' ), jitter, int( 1 ) );\nconst mx_worley_noise_vec3 = ( texcoord = uv$1(), jitter = 1 ) => mx_worley_noise_vec3$1( texcoord.convert( 'vec2|vec3' ), jitter, int( 1 ) );\n\nconst mx_cell_noise_float = ( texcoord = uv$1() ) => mx_cell_noise_float$1( texcoord.convert( 'vec2|vec3' ) );\n\nconst mx_fractal_noise_float = ( position = uv$1(), octaves = 3, lacunarity = 2, diminish = .5, amplitude = 1 ) => mx_fractal_noise_float$1( position, int( octaves ), lacunarity, diminish ).mul( amplitude );\nconst mx_fractal_noise_vec2 = ( position = uv$1(), octaves = 3, lacunarity = 2, diminish = .5, amplitude = 1 ) => mx_fractal_noise_vec2$1( position, int( octaves ), lacunarity, diminish ).mul( amplitude );\nconst mx_fractal_noise_vec3 = ( position = uv$1(), octaves = 3, lacunarity = 2, diminish = .5, amplitude = 1 ) => mx_fractal_noise_vec3$1( position, int( octaves ), lacunarity, diminish ).mul( amplitude );\nconst mx_fractal_noise_vec4 = ( position = uv$1(), octaves = 3, lacunarity = 2, diminish = .5, amplitude = 1 ) => mx_fractal_noise_vec4$1( position, int( octaves ), lacunarity, diminish ).mul( amplitude );\n\n// === Moved from MaterialXLoader.js ===\n\n// Math ops\nconst mx_add = ( in1, in2 = float( 0 ) ) => add( in1, in2 );\nconst mx_subtract = ( in1, in2 = float( 0 ) ) => sub( in1, in2 );\nconst mx_multiply = ( in1, in2 = float( 1 ) ) => mul( in1, in2 );\nconst mx_divide = ( in1, in2 = float( 1 ) ) => div( in1, in2 );\nconst mx_modulo = ( in1, in2 = float( 1 ) ) => mod( in1, in2 );\nconst mx_power = ( in1, in2 = float( 1 ) ) => pow( in1, in2 );\nconst mx_atan2 = ( in1 = float( 0 ), in2 = float( 1 ) ) => atan( in1, in2 );\nconst mx_timer = () => time;\nconst mx_frame = () => frameId;\nconst mx_invert = ( in1, amount = float( 1 ) ) => sub( amount, in1 );\nconst mx_ifgreater = ( value1, value2, in1, in2 ) => value1.greaterThan( value2 ).mix( in1, in2 );\nconst mx_ifgreatereq = ( value1, value2, in1, in2 ) => value1.greaterThanEqual( value2 ).mix( in1, in2 );\nconst mx_ifequal = ( value1, value2, in1, in2 ) => value1.equal( value2 ).mix( in1, in2 );\n\n// Enhanced separate node to support multi-output referencing (outx, outy, outz, outw)\nconst mx_separate = ( in1, channelOrOut = null ) => {\n\n\tif ( typeof channelOrOut === 'string' ) {\n\n\t\tconst map = { x: 0, r: 0, y: 1, g: 1, z: 2, b: 2, w: 3, a: 3 };\n\t\tconst c = channelOrOut.replace( /^out/, '' ).toLowerCase();\n\t\tif ( map[ c ] !== undefined ) return in1.element( map[ c ] );\n\n\t}\n\n\tif ( typeof channelOrOut === 'number' ) {\n\n\t\treturn in1.element( channelOrOut );\n\n\t}\n\n\tif ( typeof channelOrOut === 'string' && channelOrOut.length === 1 ) {\n\n\t\tconst map = { x: 0, r: 0, y: 1, g: 1, z: 2, b: 2, w: 3, a: 3 };\n\t\tif ( map[ channelOrOut ] !== undefined ) return in1.element( map[ channelOrOut ] );\n\n\t}\n\n\treturn in1;\n\n};\n\nconst mx_place2d = (\n\ttexcoord, pivot = vec2( 0.5, 0.5 ), scale = vec2( 1, 1 ), rotate = float( 0 ), offset = vec2( 0, 0 )/*, operationorder = int( 0 )*/\n) => {\n\n\tlet uv = texcoord;\n\tif ( pivot ) uv = uv.sub( pivot );\n\tif ( scale ) uv = uv.mul( scale );\n\tif ( rotate ) {\n\n\t\tconst rad = rotate.mul( Math.PI / 180.0 );\n\t\tconst cosR = rad.cos();\n\t\tconst sinR = rad.sin();\n\t\tuv = vec2(\n\t\t\tuv.x.mul( cosR ).sub( uv.y.mul( sinR ) ),\n\t\t\tuv.x.mul( sinR ).add( uv.y.mul( cosR ) )\n\t\t);\n\n\t}\n\n\tif ( pivot ) uv = uv.add( pivot );\n\tif ( offset ) uv = uv.add( offset );\n\treturn uv;\n\n};\n\nconst mx_rotate2d = ( input, amount ) => {\n\n\tinput = vec2( input );\n\tamount = float( amount );\n\n\tconst radians = amount.mul( Math.PI / 180.0 );\n\treturn rotate( input, radians );\n\n};\n\nconst mx_rotate3d = ( input, amount, axis ) => {\n\n\tinput = vec3( input );\n\tamount = float( amount );\n\taxis = vec3( axis );\n\n\n\tconst radians = amount.mul( Math.PI / 180.0 );\n\tconst nAxis = axis.normalize();\n\tconst cosA = radians.cos();\n\tconst sinA = radians.sin();\n\tconst oneMinusCosA = float( 1 ).sub( cosA );\n\tconst rot =\n\t\tinput.mul( cosA )\n\t\t\t.add( nAxis.cross( input ).mul( sinA ) )\n\t\t\t.add( nAxis.mul( nAxis.dot( input ) ).mul( oneMinusCosA ) );\n\treturn rot;\n\n};\n\nconst mx_heighttonormal = ( input, scale/*, texcoord*/ ) => {\n\n\tinput = vec3( input );\n\tscale = float( scale );\n\n\treturn bumpMap( input, scale );\n\n};\n\n/**\n * This computes a parallax corrected normal which is used for box-projected cube mapping (BPCEM).\n *\n * Reference: {@link https://devlog-martinsh.blogspot.com/2011/09/box-projected-cube-environment-mapping.html}\n *\n * ```js\n * const uvNode = getParallaxCorrectNormal( reflectVector, vec3( 200, 100, 100 ), vec3( 0, - 50, 0 ) );\n * material.envNode = pmremTexture( renderTarget.texture, uvNode );\n * ```\n *\n * @tsl\n * @function\n * @param {Node<vec3>} normal - The normal to correct.\n * @param {Node<vec3>} cubeSize - The cube size should reflect the size of the environment (BPCEM is usually applied in closed environments like rooms).\n * @param {Node<vec3>} cubePos - The cube position.\n * @return {Node<vec3>} The parallax corrected normal.\n */\nconst getParallaxCorrectNormal = /*@__PURE__*/ Fn( ( [ normal, cubeSize, cubePos ] ) => {\n\n\tconst nDir = normalize( normal ).toVar();\n\tconst rbmax = sub( float( 0.5 ).mul( cubeSize.sub( cubePos ) ), positionWorld ).div( nDir ).toVar();\n\tconst rbmin = sub( float( -0.5 ).mul( cubeSize.sub( cubePos ) ), positionWorld ).div( nDir ).toVar();\n\tconst rbminmax = vec3().toVar();\n\trbminmax.x = nDir.x.greaterThan( float( 0 ) ).select( rbmax.x, rbmin.x );\n\trbminmax.y = nDir.y.greaterThan( float( 0 ) ).select( rbmax.y, rbmin.y );\n\trbminmax.z = nDir.z.greaterThan( float( 0 ) ).select( rbmax.z, rbmin.z );\n\n\tconst correction = min$1( rbminmax.x, rbminmax.y, rbminmax.z ).toVar();\n\tconst boxIntersection = positionWorld.add( nDir.mul( correction ) ).toVar();\n\treturn boxIntersection.sub( cubePos );\n\n} );\n\nconst getShIrradianceAt = /*@__PURE__*/ Fn( ( [ normal, shCoefficients ] ) => {\n\n\t// normal is assumed to have unit length\n\n\tconst x = normal.x, y = normal.y, z = normal.z;\n\n\t// band 0\n\tlet result = shCoefficients.element( 0 ).mul( 0.886227 );\n\n\t// band 1\n\tresult = result.add( shCoefficients.element( 1 ).mul( 2.0 * 0.511664 ).mul( y ) );\n\tresult = result.add( shCoefficients.element( 2 ).mul( 2.0 * 0.511664 ).mul( z ) );\n\tresult = result.add( shCoefficients.element( 3 ).mul( 2.0 * 0.511664 ).mul( x ) );\n\n\t// band 2\n\tresult = result.add( shCoefficients.element( 4 ).mul( 2.0 * 0.429043 ).mul( x ).mul( y ) );\n\tresult = result.add( shCoefficients.element( 5 ).mul( 2.0 * 0.429043 ).mul( y ).mul( z ) );\n\tresult = result.add( shCoefficients.element( 6 ).mul( z.mul( z ).mul( 0.743125 ).sub( 0.247708 ) ) );\n\tresult = result.add( shCoefficients.element( 7 ).mul( 2.0 * 0.429043 ).mul( x ).mul( z ) );\n\tresult = result.add( shCoefficients.element( 8 ).mul( 0.429043 ).mul( mul( x, x ).sub( mul( y, y ) ) ) );\n\n\treturn result;\n\n} );\n\n// constants\n\nvar TSL = /*#__PURE__*/Object.freeze({\n\t__proto__: null,\n\tBRDF_GGX: BRDF_GGX,\n\tBRDF_Lambert: BRDF_Lambert,\n\tBasicPointShadowFilter: BasicPointShadowFilter,\n\tBasicShadowFilter: BasicShadowFilter,\n\tBreak: Break,\n\tConst: Const,\n\tContinue: Continue,\n\tDFGLUT: DFGLUT,\n\tD_GGX: D_GGX,\n\tDiscard: Discard,\n\tEPSILON: EPSILON,\n\tF_Schlick: F_Schlick,\n\tFn: Fn,\n\tHALF_PI: HALF_PI,\n\tINFINITY: INFINITY,\n\tIf: If,\n\tLoop: Loop,\n\tNodeAccess: NodeAccess,\n\tNodeShaderStage: NodeShaderStage,\n\tNodeType: NodeType,\n\tNodeUpdateType: NodeUpdateType,\n\tOnBeforeMaterialUpdate: OnBeforeMaterialUpdate,\n\tOnBeforeObjectUpdate: OnBeforeObjectUpdate,\n\tOnMaterialUpdate: OnMaterialUpdate,\n\tOnObjectUpdate: OnObjectUpdate,\n\tPCFShadowFilter: PCFShadowFilter,\n\tPCFSoftShadowFilter: PCFSoftShadowFilter,\n\tPI: PI,\n\tPI2: PI2,\n\tPointShadowFilter: PointShadowFilter,\n\tReturn: Return,\n\tSchlick_to_F0: Schlick_to_F0,\n\tScriptableNodeResources: ScriptableNodeResources,\n\tShaderNode: ShaderNode,\n\tStack: Stack,\n\tSwitch: Switch,\n\tTBNViewMatrix: TBNViewMatrix,\n\tTWO_PI: TWO_PI,\n\tVSMShadowFilter: VSMShadowFilter,\n\tV_GGX_SmithCorrelated: V_GGX_SmithCorrelated,\n\tVar: Var,\n\tVarIntent: VarIntent,\n\tabs: abs,\n\tacesFilmicToneMapping: acesFilmicToneMapping,\n\tacos: acos,\n\tadd: add,\n\taddMethodChaining: addMethodChaining,\n\taddNodeElement: addNodeElement,\n\tagxToneMapping: agxToneMapping,\n\tall: all,\n\talphaT: alphaT,\n\tand: and,\n\tanisotropy: anisotropy,\n\tanisotropyB: anisotropyB,\n\tanisotropyT: anisotropyT,\n\tany: any,\n\tappend: append,\n\tarray: array,\n\tarrayBuffer: arrayBuffer,\n\tasin: asin,\n\tassign: assign,\n\tatan: atan,\n\tatan2: atan2,\n\tatomicAdd: atomicAdd,\n\tatomicAnd: atomicAnd,\n\tatomicFunc: atomicFunc,\n\tatomicLoad: atomicLoad,\n\tatomicMax: atomicMax,\n\tatomicMin: atomicMin,\n\tatomicOr: atomicOr,\n\tatomicStore: atomicStore,\n\tatomicSub: atomicSub,\n\tatomicXor: atomicXor,\n\tattenuationColor: attenuationColor,\n\tattenuationDistance: attenuationDistance,\n\tattribute: attribute,\n\tattributeArray: attributeArray,\n\tbackgroundBlurriness: backgroundBlurriness,\n\tbackgroundIntensity: backgroundIntensity,\n\tbackgroundRotation: backgroundRotation,\n\tbatch: batch,\n\tbentNormalView: bentNormalView,\n\tbillboarding: billboarding,\n\tbitAnd: bitAnd,\n\tbitNot: bitNot,\n\tbitOr: bitOr,\n\tbitXor: bitXor,\n\tbitangentGeometry: bitangentGeometry,\n\tbitangentLocal: bitangentLocal,\n\tbitangentView: bitangentView,\n\tbitangentWorld: bitangentWorld,\n\tbitcast: bitcast,\n\tblendBurn: blendBurn,\n\tblendColor: blendColor,\n\tblendDodge: blendDodge,\n\tblendOverlay: blendOverlay,\n\tblendScreen: blendScreen,\n\tblur: blur,\n\tbool: bool,\n\tbuffer: buffer,\n\tbufferAttribute: bufferAttribute,\n\tbuiltin: builtin,\n\tbuiltinAOContext: builtinAOContext,\n\tbuiltinShadowContext: builtinShadowContext,\n\tbumpMap: bumpMap,\n\tburn: burn,\n\tbvec2: bvec2,\n\tbvec3: bvec3,\n\tbvec4: bvec4,\n\tbypass: bypass,\n\tcache: cache,\n\tcall: call,\n\tcameraFar: cameraFar,\n\tcameraIndex: cameraIndex,\n\tcameraNear: cameraNear,\n\tcameraNormalMatrix: cameraNormalMatrix,\n\tcameraPosition: cameraPosition,\n\tcameraProjectionMatrix: cameraProjectionMatrix,\n\tcameraProjectionMatrixInverse: cameraProjectionMatrixInverse,\n\tcameraViewMatrix: cameraViewMatrix,\n\tcameraViewport: cameraViewport,\n\tcameraWorldMatrix: cameraWorldMatrix,\n\tcbrt: cbrt,\n\tcdl: cdl,\n\tceil: ceil,\n\tchecker: checker,\n\tcineonToneMapping: cineonToneMapping,\n\tclamp: clamp,\n\tclearcoat: clearcoat,\n\tclearcoatNormalView: clearcoatNormalView,\n\tclearcoatRoughness: clearcoatRoughness,\n\tcode: code,\n\tcolor: color,\n\tcolorSpaceToWorking: colorSpaceToWorking,\n\tcolorToDirection: colorToDirection,\n\tcompute: compute,\n\tcomputeKernel: computeKernel,\n\tcomputeSkinning: computeSkinning,\n\tcontext: context,\n\tconvert: convert,\n\tconvertColorSpace: convertColorSpace,\n\tconvertToTexture: convertToTexture,\n\tcos: cos,\n\tcountLeadingZeros: countLeadingZeros,\n\tcountOneBits: countOneBits,\n\tcountTrailingZeros: countTrailingZeros,\n\tcross: cross,\n\tcubeTexture: cubeTexture,\n\tcubeTextureBase: cubeTextureBase,\n\tdFdx: dFdx,\n\tdFdy: dFdy,\n\tdashSize: dashSize,\n\tdebug: debug,\n\tdecrement: decrement,\n\tdecrementBefore: decrementBefore,\n\tdefaultBuildStages: defaultBuildStages,\n\tdefaultShaderStages: defaultShaderStages,\n\tdefined: defined,\n\tdegrees: degrees,\n\tdeltaTime: deltaTime,\n\tdensityFog: densityFog,\n\tdensityFogFactor: densityFogFactor,\n\tdepth: depth,\n\tdepthPass: depthPass,\n\tdeterminant: determinant,\n\tdifference: difference,\n\tdiffuseColor: diffuseColor,\n\tdiffuseContribution: diffuseContribution,\n\tdirectPointLight: directPointLight,\n\tdirectionToColor: directionToColor,\n\tdirectionToFaceDirection: directionToFaceDirection,\n\tdispersion: dispersion,\n\tdisposeShadowMaterial: disposeShadowMaterial,\n\tdistance: distance,\n\tdiv: div,\n\tdodge: dodge,\n\tdot: dot,\n\tdrawIndex: drawIndex,\n\tdynamicBufferAttribute: dynamicBufferAttribute,\n\telement: element,\n\temissive: emissive,\n\tequal: equal,\n\tequals: equals,\n\tequirectUV: equirectUV,\n\texp: exp,\n\texp2: exp2,\n\texpression: expression,\n\tfaceDirection: faceDirection,\n\tfaceForward: faceForward,\n\tfaceforward: faceforward,\n\tfloat: float,\n\tfloatBitsToInt: floatBitsToInt,\n\tfloatBitsToUint: floatBitsToUint,\n\tfloor: floor,\n\tfog: fog,\n\tfract: fract,\n\tframeGroup: frameGroup,\n\tframeId: frameId,\n\tfrontFacing: frontFacing,\n\tfwidth: fwidth,\n\tgain: gain,\n\tgapSize: gapSize,\n\tgetConstNodeType: getConstNodeType,\n\tgetCurrentStack: getCurrentStack,\n\tgetDirection: getDirection,\n\tgetDistanceAttenuation: getDistanceAttenuation,\n\tgetGeometryRoughness: getGeometryRoughness,\n\tgetNormalFromDepth: getNormalFromDepth,\n\tgetParallaxCorrectNormal: getParallaxCorrectNormal,\n\tgetRoughness: getRoughness,\n\tgetScreenPosition: getScreenPosition,\n\tgetShIrradianceAt: getShIrradianceAt,\n\tgetShadowMaterial: getShadowMaterial,\n\tgetShadowRenderObjectFunction: getShadowRenderObjectFunction,\n\tgetTextureIndex: getTextureIndex,\n\tgetViewPosition: getViewPosition,\n\tggxConvolution: ggxConvolution,\n\tglobalId: globalId,\n\tglsl: glsl,\n\tglslFn: glslFn,\n\tgrayscale: grayscale,\n\tgreaterThan: greaterThan,\n\tgreaterThanEqual: greaterThanEqual,\n\thash: hash,\n\thighpModelNormalViewMatrix: highpModelNormalViewMatrix,\n\thighpModelViewMatrix: highpModelViewMatrix,\n\thue: hue,\n\tincrement: increment,\n\tincrementBefore: incrementBefore,\n\tinspector: inspector,\n\tinstance: instance,\n\tinstanceIndex: instanceIndex,\n\tinstancedArray: instancedArray,\n\tinstancedBufferAttribute: instancedBufferAttribute,\n\tinstancedDynamicBufferAttribute: instancedDynamicBufferAttribute,\n\tinstancedMesh: instancedMesh,\n\tint: int,\n\tintBitsToFloat: intBitsToFloat,\n\tinterleavedGradientNoise: interleavedGradientNoise,\n\tinverse: inverse,\n\tinverseSqrt: inverseSqrt,\n\tinversesqrt: inversesqrt,\n\tinvocationLocalIndex: invocationLocalIndex,\n\tinvocationSubgroupIndex: invocationSubgroupIndex,\n\tior: ior,\n\tiridescence: iridescence,\n\tiridescenceIOR: iridescenceIOR,\n\tiridescenceThickness: iridescenceThickness,\n\tisolate: isolate,\n\tivec2: ivec2,\n\tivec3: ivec3,\n\tivec4: ivec4,\n\tjs: js,\n\tlabel: label,\n\tlength: length,\n\tlengthSq: lengthSq,\n\tlessThan: lessThan,\n\tlessThanEqual: lessThanEqual,\n\tlightPosition: lightPosition,\n\tlightProjectionUV: lightProjectionUV,\n\tlightShadowMatrix: lightShadowMatrix,\n\tlightTargetDirection: lightTargetDirection,\n\tlightTargetPosition: lightTargetPosition,\n\tlightViewPosition: lightViewPosition,\n\tlightingContext: lightingContext,\n\tlights: lights,\n\tlinearDepth: linearDepth,\n\tlinearToneMapping: linearToneMapping,\n\tlocalId: localId,\n\tlog: log,\n\tlog2: log2,\n\tlogarithmicDepthToViewZ: logarithmicDepthToViewZ,\n\tluminance: luminance,\n\tmat2: mat2,\n\tmat3: mat3,\n\tmat4: mat4,\n\tmatcapUV: matcapUV,\n\tmaterialAO: materialAO,\n\tmaterialAlphaTest: materialAlphaTest,\n\tmaterialAnisotropy: materialAnisotropy,\n\tmaterialAnisotropyVector: materialAnisotropyVector,\n\tmaterialAttenuationColor: materialAttenuationColor,\n\tmaterialAttenuationDistance: materialAttenuationDistance,\n\tmaterialClearcoat: materialClearcoat,\n\tmaterialClearcoatNormal: materialClearcoatNormal,\n\tmaterialClearcoatRoughness: materialClearcoatRoughness,\n\tmaterialColor: materialColor,\n\tmaterialDispersion: materialDispersion,\n\tmaterialEmissive: materialEmissive,\n\tmaterialEnvIntensity: materialEnvIntensity,\n\tmaterialEnvRotation: materialEnvRotation,\n\tmaterialIOR: materialIOR,\n\tmaterialIridescence: materialIridescence,\n\tmaterialIridescenceIOR: materialIridescenceIOR,\n\tmaterialIridescenceThickness: materialIridescenceThickness,\n\tmaterialLightMap: materialLightMap,\n\tmaterialLineDashOffset: materialLineDashOffset,\n\tmaterialLineDashSize: materialLineDashSize,\n\tmaterialLineGapSize: materialLineGapSize,\n\tmaterialLineScale: materialLineScale,\n\tmaterialLineWidth: materialLineWidth,\n\tmaterialMetalness: materialMetalness,\n\tmaterialNormal: materialNormal,\n\tmaterialOpacity: materialOpacity,\n\tmaterialPointSize: materialPointSize,\n\tmaterialReference: materialReference,\n\tmaterialReflectivity: materialReflectivity,\n\tmaterialRefractionRatio: materialRefractionRatio,\n\tmaterialRotation: materialRotation,\n\tmaterialRoughness: materialRoughness,\n\tmaterialSheen: materialSheen,\n\tmaterialSheenRoughness: materialSheenRoughness,\n\tmaterialShininess: materialShininess,\n\tmaterialSpecular: materialSpecular,\n\tmaterialSpecularColor: materialSpecularColor,\n\tmaterialSpecularIntensity: materialSpecularIntensity,\n\tmaterialSpecularStrength: materialSpecularStrength,\n\tmaterialThickness: materialThickness,\n\tmaterialTransmission: materialTransmission,\n\tmax: max$1,\n\tmaxMipLevel: maxMipLevel,\n\tmediumpModelViewMatrix: mediumpModelViewMatrix,\n\tmetalness: metalness,\n\tmin: min$1,\n\tmix: mix,\n\tmixElement: mixElement,\n\tmod: mod,\n\tmodInt: modInt,\n\tmodelDirection: modelDirection,\n\tmodelNormalMatrix: modelNormalMatrix,\n\tmodelPosition: modelPosition,\n\tmodelRadius: modelRadius,\n\tmodelScale: modelScale,\n\tmodelViewMatrix: modelViewMatrix,\n\tmodelViewPosition: modelViewPosition,\n\tmodelViewProjection: modelViewProjection,\n\tmodelWorldMatrix: modelWorldMatrix,\n\tmodelWorldMatrixInverse: modelWorldMatrixInverse,\n\tmorphReference: morphReference,\n\tmrt: mrt,\n\tmul: mul,\n\tmx_aastep: mx_aastep,\n\tmx_add: mx_add,\n\tmx_atan2: mx_atan2,\n\tmx_cell_noise_float: mx_cell_noise_float,\n\tmx_contrast: mx_contrast,\n\tmx_divide: mx_divide,\n\tmx_fractal_noise_float: mx_fractal_noise_float,\n\tmx_fractal_noise_vec2: mx_fractal_noise_vec2,\n\tmx_fractal_noise_vec3: mx_fractal_noise_vec3,\n\tmx_fractal_noise_vec4: mx_fractal_noise_vec4,\n\tmx_frame: mx_frame,\n\tmx_heighttonormal: mx_heighttonormal,\n\tmx_hsvtorgb: mx_hsvtorgb,\n\tmx_ifequal: mx_ifequal,\n\tmx_ifgreater: mx_ifgreater,\n\tmx_ifgreatereq: mx_ifgreatereq,\n\tmx_invert: mx_invert,\n\tmx_modulo: mx_modulo,\n\tmx_multiply: mx_multiply,\n\tmx_noise_float: mx_noise_float,\n\tmx_noise_vec3: mx_noise_vec3,\n\tmx_noise_vec4: mx_noise_vec4,\n\tmx_place2d: mx_place2d,\n\tmx_power: mx_power,\n\tmx_ramp4: mx_ramp4,\n\tmx_ramplr: mx_ramplr,\n\tmx_ramptb: mx_ramptb,\n\tmx_rgbtohsv: mx_rgbtohsv,\n\tmx_rotate2d: mx_rotate2d,\n\tmx_rotate3d: mx_rotate3d,\n\tmx_safepower: mx_safepower,\n\tmx_separate: mx_separate,\n\tmx_splitlr: mx_splitlr,\n\tmx_splittb: mx_splittb,\n\tmx_srgb_texture_to_lin_rec709: mx_srgb_texture_to_lin_rec709,\n\tmx_subtract: mx_subtract,\n\tmx_timer: mx_timer,\n\tmx_transform_uv: mx_transform_uv,\n\tmx_unifiednoise2d: mx_unifiednoise2d,\n\tmx_unifiednoise3d: mx_unifiednoise3d,\n\tmx_worley_noise_float: mx_worley_noise_float,\n\tmx_worley_noise_vec2: mx_worley_noise_vec2,\n\tmx_worley_noise_vec3: mx_worley_noise_vec3,\n\tnegate: negate,\n\tneutralToneMapping: neutralToneMapping,\n\tnodeArray: nodeArray,\n\tnodeImmutable: nodeImmutable,\n\tnodeObject: nodeObject,\n\tnodeObjectIntent: nodeObjectIntent,\n\tnodeObjects: nodeObjects,\n\tnodeProxy: nodeProxy,\n\tnodeProxyIntent: nodeProxyIntent,\n\tnormalFlat: normalFlat,\n\tnormalGeometry: normalGeometry,\n\tnormalLocal: normalLocal,\n\tnormalMap: normalMap,\n\tnormalView: normalView,\n\tnormalViewGeometry: normalViewGeometry,\n\tnormalWorld: normalWorld,\n\tnormalWorldGeometry: normalWorldGeometry,\n\tnormalize: normalize,\n\tnot: not,\n\tnotEqual: notEqual,\n\tnumWorkgroups: numWorkgroups,\n\tobjectDirection: objectDirection,\n\tobjectGroup: objectGroup,\n\tobjectPosition: objectPosition,\n\tobjectRadius: objectRadius,\n\tobjectScale: objectScale,\n\tobjectViewPosition: objectViewPosition,\n\tobjectWorldMatrix: objectWorldMatrix,\n\toneMinus: oneMinus,\n\tor: or,\n\torthographicDepthToViewZ: orthographicDepthToViewZ,\n\toscSawtooth: oscSawtooth,\n\toscSine: oscSine,\n\toscSquare: oscSquare,\n\toscTriangle: oscTriangle,\n\toutput: output,\n\toutputStruct: outputStruct,\n\toverlay: overlay,\n\toverloadingFn: overloadingFn,\n\tpackHalf2x16: packHalf2x16,\n\tpackSnorm2x16: packSnorm2x16,\n\tpackUnorm2x16: packUnorm2x16,\n\tparabola: parabola,\n\tparallaxDirection: parallaxDirection,\n\tparallaxUV: parallaxUV,\n\tparameter: parameter,\n\tpass: pass,\n\tpassTexture: passTexture,\n\tpcurve: pcurve,\n\tperspectiveDepthToViewZ: perspectiveDepthToViewZ,\n\tpmremTexture: pmremTexture,\n\tpointShadow: pointShadow,\n\tpointUV: pointUV,\n\tpointWidth: pointWidth,\n\tpositionGeometry: positionGeometry,\n\tpositionLocal: positionLocal,\n\tpositionPrevious: positionPrevious,\n\tpositionView: positionView,\n\tpositionViewDirection: positionViewDirection,\n\tpositionWorld: positionWorld,\n\tpositionWorldDirection: positionWorldDirection,\n\tposterize: posterize,\n\tpow: pow,\n\tpow2: pow2,\n\tpow3: pow3,\n\tpow4: pow4,\n\tpremultiplyAlpha: premultiplyAlpha,\n\tproperty: property,\n\tquadBroadcast: quadBroadcast,\n\tquadSwapDiagonal: quadSwapDiagonal,\n\tquadSwapX: quadSwapX,\n\tquadSwapY: quadSwapY,\n\tradians: radians,\n\trand: rand,\n\trange: range,\n\trangeFog: rangeFog,\n\trangeFogFactor: rangeFogFactor,\n\treciprocal: reciprocal,\n\treference: reference,\n\treferenceBuffer: referenceBuffer,\n\treflect: reflect,\n\treflectVector: reflectVector,\n\treflectView: reflectView,\n\treflector: reflector,\n\trefract: refract,\n\trefractVector: refractVector,\n\trefractView: refractView,\n\treinhardToneMapping: reinhardToneMapping,\n\tremap: remap,\n\tremapClamp: remapClamp,\n\trenderGroup: renderGroup,\n\trenderOutput: renderOutput,\n\trendererReference: rendererReference,\n\treplaceDefaultUV: replaceDefaultUV,\n\trotate: rotate,\n\trotateUV: rotateUV,\n\troughness: roughness,\n\tround: round,\n\trtt: rtt,\n\tsRGBTransferEOTF: sRGBTransferEOTF,\n\tsRGBTransferOETF: sRGBTransferOETF,\n\tsample: sample,\n\tsampler: sampler,\n\tsamplerComparison: samplerComparison,\n\tsaturate: saturate,\n\tsaturation: saturation,\n\tscreen: screen,\n\tscreenCoordinate: screenCoordinate,\n\tscreenDPR: screenDPR,\n\tscreenSize: screenSize,\n\tscreenUV: screenUV,\n\tscriptable: scriptable,\n\tscriptableValue: scriptableValue,\n\tselect: select,\n\tsetCurrentStack: setCurrentStack,\n\tsetName: setName,\n\tshaderStages: shaderStages,\n\tshadow: shadow,\n\tshadowPositionWorld: shadowPositionWorld,\n\tshapeCircle: shapeCircle,\n\tsharedUniformGroup: sharedUniformGroup,\n\tsheen: sheen,\n\tsheenRoughness: sheenRoughness,\n\tshiftLeft: shiftLeft,\n\tshiftRight: shiftRight,\n\tshininess: shininess,\n\tsign: sign,\n\tsin: sin,\n\tsinc: sinc,\n\tskinning: skinning,\n\tsmoothstep: smoothstep,\n\tsmoothstepElement: smoothstepElement,\n\tspecularColor: specularColor,\n\tspecularColorBlended: specularColorBlended,\n\tspecularF90: specularF90,\n\tspherizeUV: spherizeUV,\n\tsplit: split,\n\tspritesheetUV: spritesheetUV,\n\tsqrt: sqrt,\n\tstack: stack,\n\tstep: step,\n\tstepElement: stepElement,\n\tstorage: storage,\n\tstorageBarrier: storageBarrier,\n\tstorageObject: storageObject,\n\tstorageTexture: storageTexture,\n\tstring: string,\n\tstruct: struct,\n\tsub: sub,\n\tsubBuild: subBuild,\n\tsubgroupAdd: subgroupAdd,\n\tsubgroupAll: subgroupAll,\n\tsubgroupAnd: subgroupAnd,\n\tsubgroupAny: subgroupAny,\n\tsubgroupBallot: subgroupBallot,\n\tsubgroupBroadcast: subgroupBroadcast,\n\tsubgroupBroadcastFirst: subgroupBroadcastFirst,\n\tsubgroupElect: subgroupElect,\n\tsubgroupExclusiveAdd: subgroupExclusiveAdd,\n\tsubgroupExclusiveMul: subgroupExclusiveMul,\n\tsubgroupInclusiveAdd: subgroupInclusiveAdd,\n\tsubgroupInclusiveMul: subgroupInclusiveMul,\n\tsubgroupIndex: subgroupIndex,\n\tsubgroupMax: subgroupMax,\n\tsubgroupMin: subgroupMin,\n\tsubgroupMul: subgroupMul,\n\tsubgroupOr: subgroupOr,\n\tsubgroupShuffle: subgroupShuffle,\n\tsubgroupShuffleDown: subgroupShuffleDown,\n\tsubgroupShuffleUp: subgroupShuffleUp,\n\tsubgroupShuffleXor: subgroupShuffleXor,\n\tsubgroupSize: subgroupSize,\n\tsubgroupXor: subgroupXor,\n\ttan: tan,\n\ttangentGeometry: tangentGeometry,\n\ttangentLocal: tangentLocal,\n\ttangentView: tangentView,\n\ttangentWorld: tangentWorld,\n\ttexture: texture,\n\ttexture3D: texture3D,\n\ttexture3DLevel: texture3DLevel,\n\ttexture3DLoad: texture3DLoad,\n\ttextureBarrier: textureBarrier,\n\ttextureBicubic: textureBicubic,\n\ttextureBicubicLevel: textureBicubicLevel,\n\ttextureCubeUV: textureCubeUV,\n\ttextureLevel: textureLevel,\n\ttextureLoad: textureLoad,\n\ttextureSize: textureSize,\n\ttextureStore: textureStore,\n\tthickness: thickness,\n\ttime: time,\n\ttoneMapping: toneMapping,\n\ttoneMappingExposure: toneMappingExposure,\n\ttoonOutlinePass: toonOutlinePass,\n\ttransformDirection: transformDirection,\n\ttransformNormal: transformNormal,\n\ttransformNormalToView: transformNormalToView,\n\ttransformedClearcoatNormalView: transformedClearcoatNormalView,\n\ttransformedNormalView: transformedNormalView,\n\ttransformedNormalWorld: transformedNormalWorld,\n\ttransmission: transmission,\n\ttranspose: transpose,\n\ttriNoise3D: triNoise3D,\n\ttriplanarTexture: triplanarTexture,\n\ttriplanarTextures: triplanarTextures,\n\ttrunc: trunc,\n\tuint: uint,\n\tuintBitsToFloat: uintBitsToFloat,\n\tuniform: uniform,\n\tuniformArray: uniformArray,\n\tuniformCubeTexture: uniformCubeTexture,\n\tuniformFlow: uniformFlow,\n\tuniformGroup: uniformGroup,\n\tuniformTexture: uniformTexture,\n\tunpackHalf2x16: unpackHalf2x16,\n\tunpackNormal: unpackNormal,\n\tunpackSnorm2x16: unpackSnorm2x16,\n\tunpackUnorm2x16: unpackUnorm2x16,\n\tunpremultiplyAlpha: unpremultiplyAlpha,\n\tuserData: userData,\n\tuv: uv$1,\n\tuvec2: uvec2,\n\tuvec3: uvec3,\n\tuvec4: uvec4,\n\tvarying: varying,\n\tvaryingProperty: varyingProperty,\n\tvec2: vec2,\n\tvec3: vec3,\n\tvec4: vec4,\n\tvectorComponents: vectorComponents,\n\tvelocity: velocity,\n\tvertexColor: vertexColor,\n\tvertexIndex: vertexIndex,\n\tvertexStage: vertexStage,\n\tvibrance: vibrance,\n\tviewZToLogarithmicDepth: viewZToLogarithmicDepth,\n\tviewZToOrthographicDepth: viewZToOrthographicDepth,\n\tviewZToPerspectiveDepth: viewZToPerspectiveDepth,\n\tviewport: viewport,\n\tviewportCoordinate: viewportCoordinate,\n\tviewportDepthTexture: viewportDepthTexture,\n\tviewportLinearDepth: viewportLinearDepth,\n\tviewportMipTexture: viewportMipTexture,\n\tviewportResolution: viewportResolution,\n\tviewportSafeUV: viewportSafeUV,\n\tviewportSharedTexture: viewportSharedTexture,\n\tviewportSize: viewportSize,\n\tviewportTexture: viewportTexture,\n\tviewportUV: viewportUV,\n\tvogelDiskSample: vogelDiskSample,\n\twgsl: wgsl,\n\twgslFn: wgslFn,\n\tworkgroupArray: workgroupArray,\n\tworkgroupBarrier: workgroupBarrier,\n\tworkgroupId: workgroupId,\n\tworkingToColorSpace: workingToColorSpace,\n\txor: xor\n});\n\nconst _clearColor = /*@__PURE__*/ new Color4();\n\n/**\n * This renderer module manages the background.\n *\n * @private\n * @augments DataMap\n */\nclass Background extends DataMap {\n\n\t/**\n\t * Constructs a new background management component.\n\t *\n\t * @param {Renderer} renderer - The renderer.\n\t * @param {Nodes} nodes - Renderer component for managing nodes related logic.\n\t */\n\tconstructor( renderer, nodes ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The renderer.\n\t\t *\n\t\t * @type {Renderer}\n\t\t */\n\t\tthis.renderer = renderer;\n\n\t\t/**\n\t\t * Renderer component for managing nodes related logic.\n\t\t *\n\t\t * @type {Nodes}\n\t\t */\n\t\tthis.nodes = nodes;\n\n\t}\n\n\t/**\n\t * Updates the background for the given scene. Depending on how `Scene.background`\n\t * or `Scene.backgroundNode` are configured, this method might configure a simple clear\n\t * or add a mesh to the render list for rendering the background as a textured plane\n\t * or skybox.\n\t *\n\t * @param {Scene} scene - The scene.\n\t * @param {RenderList} renderList - The current render list.\n\t * @param {RenderContext} renderContext - The current render context.\n\t */\n\tupdate( scene, renderList, renderContext ) {\n\n\t\tconst renderer = this.renderer;\n\t\tconst background = this.nodes.getBackgroundNode( scene ) || scene.background;\n\n\t\tlet forceClear = false;\n\n\t\tif ( background === null ) {\n\n\t\t\t// no background settings, use clear color configuration from the renderer\n\n\t\t\trenderer._clearColor.getRGB( _clearColor );\n\t\t\t_clearColor.a = renderer._clearColor.a;\n\n\t\t} else if ( background.isColor === true ) {\n\n\t\t\t// background is an opaque color\n\n\t\t\tbackground.getRGB( _clearColor );\n\t\t\t_clearColor.a = 1;\n\n\t\t\tforceClear = true;\n\n\t\t} else if ( background.isNode === true ) {\n\n\t\t\tconst sceneData = this.get( scene );\n\t\t\tconst backgroundNode = background;\n\n\t\t\t_clearColor.copy( renderer._clearColor );\n\n\t\t\tlet backgroundMesh = sceneData.backgroundMesh;\n\n\t\t\tif ( backgroundMesh === undefined ) {\n\n\t\t\t\tconst backgroundMeshNode = vec4( backgroundNode ).mul( backgroundIntensity ).context( {\n\t\t\t\t\t// @TODO: Add Texture2D support using node context\n\t\t\t\t\tgetUV: () => backgroundRotation.mul( normalWorldGeometry ),\n\t\t\t\t\tgetTextureLevel: () => backgroundBlurriness\n\t\t\t\t} );\n\n\t\t\t\t// when using orthographic cameras, we must scale the skybox sphere\n\t\t\t\t// up to exceed the dimensions of the camera's viewing box.\n\t\t\t\tconst isOrtho = cameraProjectionMatrix.element( 3 ).element( 3 ).equal( 1.0 );\n\n\t\t\t\t// calculate the orthographic scale\n\t\t\t\t// projectionMatrix[1][1] is (1 / top). Invert it to get the height and multiply by 3.0\n\t\t\t\t// (an arbitrary safety factor) to ensure the skybox is large enough to cover the corners\n\t\t\t\t// of the rectangular screen\n\t\t\t\tconst orthoScale = div( 1.0, cameraProjectionMatrix.element( 1 ).element( 1 ) ).mul( 3.0 );\n\n\t\t\t\t// compute vertex position\n\t\t\t\tconst modifiedPosition = isOrtho.select( positionLocal.mul( orthoScale ), positionLocal );\n\n\t\t\t\t// By using a w component of 0, the skybox will not translate when the camera moves through the scene\n\t\t\t\tlet viewProj = cameraProjectionMatrix.mul( modelViewMatrix.mul( vec4( modifiedPosition, 0.0 ) ) );\n\n\t\t\t\t// force background to far plane so it does not occlude objects\n\t\t\t\tviewProj = viewProj.setZ( viewProj.w );\n\n\t\t\t\tconst nodeMaterial = new NodeMaterial();\n\t\t\t\tnodeMaterial.name = 'Background.material';\n\t\t\t\tnodeMaterial.side = BackSide;\n\t\t\t\tnodeMaterial.depthTest = false;\n\t\t\t\tnodeMaterial.depthWrite = false;\n\t\t\t\tnodeMaterial.allowOverride = false;\n\t\t\t\tnodeMaterial.fog = false;\n\t\t\t\tnodeMaterial.lights = false;\n\t\t\t\tnodeMaterial.vertexNode = viewProj;\n\t\t\t\tnodeMaterial.colorNode = backgroundMeshNode;\n\n\t\t\t\tsceneData.backgroundMeshNode = backgroundMeshNode;\n\t\t\t\tsceneData.backgroundMesh = backgroundMesh = new Mesh( new SphereGeometry( 1, 32, 32 ), nodeMaterial );\n\t\t\t\tbackgroundMesh.frustumCulled = false;\n\t\t\t\tbackgroundMesh.name = 'Background.mesh';\n\n\t\t\t\tfunction onBackgroundDispose() {\n\n\t\t\t\t\tbackground.removeEventListener( 'dispose', onBackgroundDispose );\n\n\t\t\t\t\tbackgroundMesh.material.dispose();\n\t\t\t\t\tbackgroundMesh.geometry.dispose();\n\n\t\t\t\t}\n\n\t\t\t\tbackground.addEventListener( 'dispose', onBackgroundDispose );\n\n\t\t\t}\n\n\t\t\tconst backgroundCacheKey = backgroundNode.getCacheKey();\n\n\t\t\tif ( sceneData.backgroundCacheKey !== backgroundCacheKey ) {\n\n\t\t\t\tsceneData.backgroundMeshNode.node = vec4( backgroundNode ).mul( backgroundIntensity );\n\t\t\t\tsceneData.backgroundMeshNode.needsUpdate = true;\n\n\t\t\t\tbackgroundMesh.material.needsUpdate = true;\n\n\t\t\t\tsceneData.backgroundCacheKey = backgroundCacheKey;\n\n\t\t\t}\n\n\t\t\trenderList.unshift( backgroundMesh, backgroundMesh.geometry, backgroundMesh.material, 0, 0, null, null );\n\n\t\t} else {\n\n\t\t\terror( 'Renderer: Unsupported background configuration.', background );\n\n\t\t}\n\n\t\t//\n\n\t\tconst environmentBlendMode = renderer.xr.getEnvironmentBlendMode();\n\n\t\tif ( environmentBlendMode === 'additive' ) {\n\n\t\t\t_clearColor.set( 0, 0, 0, 1 );\n\n\t\t} else if ( environmentBlendMode === 'alpha-blend' ) {\n\n\t\t\t_clearColor.set( 0, 0, 0, 0 );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( renderer.autoClear === true || forceClear === true ) {\n\n\t\t\tconst clearColorValue = renderContext.clearColorValue;\n\n\t\t\tclearColorValue.r = _clearColor.r;\n\t\t\tclearColorValue.g = _clearColor.g;\n\t\t\tclearColorValue.b = _clearColor.b;\n\t\t\tclearColorValue.a = _clearColor.a;\n\n\t\t\t// premultiply alpha\n\n\t\t\tif ( renderer.backend.isWebGLBackend === true || renderer.alpha === true ) {\n\n\t\t\t\tclearColorValue.r *= clearColorValue.a;\n\t\t\t\tclearColorValue.g *= clearColorValue.a;\n\t\t\t\tclearColorValue.b *= clearColorValue.a;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\trenderContext.depthClearValue = renderer._clearDepth;\n\t\t\trenderContext.stencilClearValue = renderer._clearStencil;\n\n\t\t\trenderContext.clearColor = renderer.autoClearColor === true;\n\t\t\trenderContext.clearDepth = renderer.autoClearDepth === true;\n\t\t\trenderContext.clearStencil = renderer.autoClearStencil === true;\n\n\t\t} else {\n\n\t\t\trenderContext.clearColor = false;\n\t\t\trenderContext.clearDepth = false;\n\t\t\trenderContext.clearStencil = false;\n\n\t\t}\n\n\t}\n\n}\n\nlet _id$7 = 0;\n\n/**\n * A bind group represents a collection of bindings and thus a collection\n * or resources. Bind groups are assigned to pipelines to provide them\n * with the required resources (like uniform buffers or textures).\n *\n * @private\n */\nclass BindGroup {\n\n\t/**\n\t * Constructs a new bind group.\n\t *\n\t * @param {string} name - The bind group's name.\n\t * @param {Array<Binding>} bindings - An array of bindings.\n\t * @param {number} index - The group index.\n\t * @param {Array<Binding>} bindingsReference - An array of reference bindings.\n\t */\n\tconstructor( name = '', bindings = [], index = 0, bindingsReference = [] ) {\n\n\t\t/**\n\t\t * The bind group's name.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * An array of bindings.\n\t\t *\n\t\t * @type {Array<Binding>}\n\t\t */\n\t\tthis.bindings = bindings;\n\n\t\t/**\n\t\t * The group index.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.index = index;\n\n\t\t/**\n\t\t * An array of reference bindings.\n\t\t *\n\t\t * @type {Array<Binding>}\n\t\t */\n\t\tthis.bindingsReference = bindingsReference;\n\n\t\t/**\n\t\t * The group's ID.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.id = _id$7 ++;\n\n\t}\n\n}\n\n/**\n * This module represents the state of a node builder after it was\n * used to build the nodes for a render object. The state holds the\n * results of the build for further processing in the renderer.\n *\n * Render objects with identical cache keys share the same node builder state.\n *\n * @private\n */\nclass NodeBuilderState {\n\n\t/**\n\t * Constructs a new node builder state.\n\t *\n\t * @param {string} vertexShader - The native vertex shader code.\n\t * @param {string} fragmentShader - The native fragment shader code.\n\t * @param {string} computeShader - The native compute shader code.\n\t * @param {Array<NodeAttribute>} nodeAttributes - An array of node attributes.\n\t * @param {Array<BindGroup>} bindings - An array of bind groups.\n\t * @param {Array<Node>} updateNodes - An array of nodes that implement their `update()` method.\n\t * @param {Array<Node>} updateBeforeNodes - An array of nodes that implement their `updateBefore()` method.\n\t * @param {Array<Node>} updateAfterNodes - An array of nodes that implement their `updateAfter()` method.\n\t * @param {NodeMaterialObserver} observer - A node material observer.\n\t * @param {Array<Object>} transforms - An array with transform attribute objects. Only relevant when using compute shaders with WebGL 2.\n\t */\n\tconstructor( vertexShader, fragmentShader, computeShader, nodeAttributes, bindings, updateNodes, updateBeforeNodes, updateAfterNodes, observer, transforms = [] ) {\n\n\t\t/**\n\t\t * The native vertex shader code.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.vertexShader = vertexShader;\n\n\t\t/**\n\t\t * The native fragment shader code.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.fragmentShader = fragmentShader;\n\n\t\t/**\n\t\t * The native compute shader code.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.computeShader = computeShader;\n\n\t\t/**\n\t\t * An array with transform attribute objects.\n\t\t * Only relevant when using compute shaders with WebGL 2.\n\t\t *\n\t\t * @type {Array<Object>}\n\t\t */\n\t\tthis.transforms = transforms;\n\n\t\t/**\n\t\t * An array of node attributes representing\n\t\t * the attributes of the shaders.\n\t\t *\n\t\t * @type {Array<NodeAttribute>}\n\t\t */\n\t\tthis.nodeAttributes = nodeAttributes;\n\n\t\t/**\n\t\t * An array of bind groups representing the uniform or storage\n\t\t * buffers, texture or samplers of the shader.\n\t\t *\n\t\t * @type {Array<BindGroup>}\n\t\t */\n\t\tthis.bindings = bindings;\n\n\t\t/**\n\t\t * An array of nodes that implement their `update()` method.\n\t\t *\n\t\t * @type {Array<Node>}\n\t\t */\n\t\tthis.updateNodes = updateNodes;\n\n\t\t/**\n\t\t * An array of nodes that implement their `updateBefore()` method.\n\t\t *\n\t\t * @type {Array<Node>}\n\t\t */\n\t\tthis.updateBeforeNodes = updateBeforeNodes;\n\n\t\t/**\n\t\t * An array of nodes that implement their `updateAfter()` method.\n\t\t *\n\t\t * @type {Array<Node>}\n\t\t */\n\t\tthis.updateAfterNodes = updateAfterNodes;\n\n\t\t/**\n\t\t * A node material observer.\n\t\t *\n\t\t * @type {NodeMaterialObserver}\n\t\t */\n\t\tthis.observer = observer;\n\n\t\t/**\n\t\t * How often this state is used by render objects.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.usedTimes = 0;\n\n\t}\n\n\t/**\n\t * This method is used to create a array of bind groups based\n\t * on the existing bind groups of this state. Shared groups are\n\t * not cloned.\n\t *\n\t * @return {Array<BindGroup>} A array of bind groups.\n\t */\n\tcreateBindings() {\n\n\t\tconst bindings = [];\n\n\t\tfor ( const instanceGroup of this.bindings ) {\n\n\t\t\tconst shared = instanceGroup.bindings[ 0 ].groupNode.shared; // All bindings in the group must have the same groupNode.\n\n\t\t\tif ( shared !== true ) {\n\n\t\t\t\tconst bindingsGroup = new BindGroup( instanceGroup.name, [], instanceGroup.index, instanceGroup.bindingsReference );\n\t\t\t\tbindings.push( bindingsGroup );\n\n\t\t\t\tfor ( const instanceBinding of instanceGroup.bindings ) {\n\n\t\t\t\t\tbindingsGroup.bindings.push( instanceBinding.clone() );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tbindings.push( instanceGroup );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn bindings;\n\n\t}\n\n}\n\n/**\n * {@link NodeBuilder} is going to create instances of this class during the build process\n * of nodes. They represent the final shader attributes that are going to be generated\n * by the builder. Arrays of node attributes is maintained in {@link NodeBuilder#attributes}\n * and {@link NodeBuilder#bufferAttributes} for this purpose.\n */\nclass NodeAttribute {\n\n\t/**\n\t * Constructs a new node attribute.\n\t *\n\t * @param {string} name - The name of the attribute.\n\t * @param {string} type - The type of the attribute.\n\t * @param {?Node} node - An optional reference to the node.\n\t */\n\tconstructor( name, type, node = null ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isNodeAttribute = true;\n\n\t\t/**\n\t\t * The name of the attribute.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * The type of the attribute.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.type = type;\n\n\t\t/**\n\t\t * An optional reference to the node.\n\t\t *\n\t\t * @type {?Node}\n\t\t * @default null\n\t\t */\n\t\tthis.node = node;\n\n\t}\n\n}\n\n/**\n * {@link NodeBuilder} is going to create instances of this class during the build process\n * of nodes. They represent the final shader uniforms that are going to be generated\n * by the builder. A dictionary of node uniforms is maintained in {@link NodeBuilder#uniforms}\n * for this purpose.\n */\nclass NodeUniform {\n\n\t/**\n\t * Constructs a new node uniform.\n\t *\n\t * @param {string} name - The name of the uniform.\n\t * @param {string} type - The type of the uniform.\n\t * @param {UniformNode} node - An reference to the node.\n\t */\n\tconstructor( name, type, node ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isNodeUniform = true;\n\n\t\t/**\n\t\t * The name of the uniform.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * The type of the uniform.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.type = type;\n\n\t\t/**\n\t\t * An reference to the node.\n\t\t *\n\t\t * @type {UniformNode}\n\t\t */\n\t\tthis.node = node;\n\n\t}\n\n\t/**\n\t * The value of the uniform node.\n\t *\n\t * @type {any}\n\t */\n\tget value() {\n\n\t\treturn this.node.value;\n\n\t}\n\n\tset value( val ) {\n\n\t\tthis.node.value = val;\n\n\t}\n\n\t/**\n\t * The id of the uniform node.\n\t *\n\t * @type {number}\n\t */\n\tget id() {\n\n\t\treturn this.node.id;\n\n\t}\n\n\t/**\n\t * The uniform node's group.\n\t *\n\t * @type {UniformGroupNode}\n\t */\n\tget groupNode() {\n\n\t\treturn this.node.groupNode;\n\n\t}\n\n}\n\n/**\n * {@link NodeBuilder} is going to create instances of this class during the build process\n * of nodes. They represent the final shader variables that are going to be generated\n * by the builder. A dictionary of node variables is maintained in {@link NodeBuilder#vars} for\n * this purpose.\n */\nclass NodeVar {\n\n\t/**\n\t * Constructs a new node variable.\n\t *\n\t * @param {string} name - The name of the variable.\n\t * @param {string} type - The type of the variable.\n\t * @param {boolean} [readOnly=false] - The read-only flag.\n\t * @param {?number} [count=null] - The size.\n\t */\n\tconstructor( name, type, readOnly = false, count = null ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isNodeVar = true;\n\n\t\t/**\n\t\t * The name of the variable.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * The type of the variable.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.type = type;\n\n\t\t/**\n\t\t *  The read-only flag.\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.readOnly = readOnly;\n\n\t\t/**\n\t\t * The size.\n\t\t *\n\t\t * @type {?number}\n\t\t */\n\t\tthis.count = count;\n\n\t}\n\n}\n\n/**\n * {@link NodeBuilder} is going to create instances of this class during the build process\n * of nodes. They represent the final shader varyings that are going to be generated\n * by the builder. An array of node varyings is maintained in {@link NodeBuilder#varyings} for\n * this purpose.\n *\n * @augments NodeVar\n */\nclass NodeVarying extends NodeVar {\n\n\t/**\n\t * Constructs a new node varying.\n\t *\n\t * @param {string} name - The name of the varying.\n\t * @param {string} type - The type of the varying.\n\t * @param {?string} interpolationType - The interpolation type of the varying.\n\t * @param {?string} interpolationSampling - The interpolation sampling type of the varying.\n\t */\n\tconstructor( name, type, interpolationType = null, interpolationSampling = null ) {\n\n\t\tsuper( name, type );\n\n\t\t/**\n\t\t * Whether this varying requires interpolation or not. This property can be used\n\t\t * to check if the varying can be optimized for a variable.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.needsInterpolation = false;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isNodeVarying = true;\n\n\t\t/**\n\t\t * The interpolation type of the varying data.\n\t\t *\n\t\t * @type {?string}\n\t\t * @default null\n\t\t */\n\t\tthis.interpolationType = interpolationType;\n\n\t\t/**\n\t\t * The interpolation sampling type of varying data.\n\t\t *\n\t\t * @type {?string}\n\t\t * @default null\n\t\t */\n\t\tthis.interpolationSampling = interpolationSampling;\n\n\t}\n\n}\n\n/**\n * {@link NodeBuilder} is going to create instances of this class during the build process\n * of nodes. They represent user-defined, native shader code portions that are going to be\n * injected by the builder. A dictionary of node codes is maintained in {@link NodeBuilder#codes}\n * for this purpose.\n */\nclass NodeCode {\n\n\t/**\n\t * Constructs a new code node.\n\t *\n\t * @param {string} name - The name of the code.\n\t * @param {string} type - The node type.\n\t * @param {string} [code=''] - The native shader code.\n\t */\n\tconstructor( name, type, code = '' ) {\n\n\t\t/**\n\t\t * The name of the code.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * The node type.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.type = type;\n\n\t\t/**\n\t\t * The native shader code.\n\t\t *\n\t\t * @type {string}\n\t\t * @default ''\n\t\t */\n\t\tthis.code = code;\n\n\t\tObject.defineProperty( this, 'isNodeCode', { value: true } );\n\n\t}\n\n}\n\nlet _id$6 = 0;\n\n/**\n * This utility class is used in {@link NodeBuilder} as an internal\n * cache data structure for node data.\n */\nclass NodeCache {\n\n\t/**\n\t * Constructs a new node cache.\n\t *\n\t * @param {?NodeCache} parent - A reference to a parent cache.\n\t */\n\tconstructor( parent = null ) {\n\n\t\t/**\n\t\t * The id of the cache.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tthis.id = _id$6 ++;\n\n\t\t/**\n\t\t * A weak map for managing node data.\n\t\t *\n\t\t * @type {WeakMap<Node, Object>}\n\t\t */\n\t\tthis.nodesData = new WeakMap();\n\n\t\t/**\n\t\t * Reference to a parent node cache.\n\t\t *\n\t\t * @type {?NodeCache}\n\t\t * @default null\n\t\t */\n\t\tthis.parent = parent;\n\n\t}\n\n\t/**\n\t * Returns the data for the given node.\n\t *\n\t * @param {Node} node - The node.\n\t * @return {?Object} The data for the node.\n\t */\n\tgetData( node ) {\n\n\t\tlet data = this.nodesData.get( node );\n\n\t\tif ( data === undefined && this.parent !== null ) {\n\n\t\t\tdata = this.parent.getData( node );\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Sets the data for a given node.\n\t *\n\t * @param {Node} node - The node.\n\t * @param {Object} data - The data that should be cached.\n\t */\n\tsetData( node, data ) {\n\n\t\tthis.nodesData.set( node, data );\n\n\t}\n\n}\n\nclass StructType {\n\n\tconstructor( name, members ) {\n\n\t\tthis.name = name;\n\t\tthis.members = members;\n\t\tthis.output = false;\n\n\t}\n\n}\n\n/**\n * Abstract base class for uniforms.\n *\n * @abstract\n * @private\n */\nclass Uniform {\n\n\t/**\n\t * Constructs a new uniform.\n\t *\n\t * @param {string} name - The uniform's name.\n\t * @param {any} value - The uniform's value.\n\t */\n\tconstructor( name, value ) {\n\n\t\t/**\n\t\t * The uniform's name.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * The uniform's value.\n\t\t *\n\t\t * @type {any}\n\t\t */\n\t\tthis.value = value;\n\n\t\t/**\n\t\t * Used to build the uniform buffer according to the STD140 layout.\n\t\t * Derived uniforms will set this property to a data type specific\n\t\t * value.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.boundary = 0;\n\n\t\t/**\n\t\t * The item size. Derived uniforms will set this property to a data\n\t\t * type specific value.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.itemSize = 0;\n\n\t\t/**\n\t\t * This property is set by {@link UniformsGroup} and marks\n\t\t * the start position in the uniform buffer.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.offset = 0;\n\n\t}\n\n\t/**\n\t * Sets the uniform's value.\n\t *\n\t * @param {any} value - The value to set.\n\t */\n\tsetValue( value ) {\n\n\t\tthis.value = value;\n\n\t}\n\n\t/**\n\t * Returns the uniform's value.\n\t *\n\t * @return {any} The value.\n\t */\n\tgetValue() {\n\n\t\treturn this.value;\n\n\t}\n\n}\n\n/**\n * Represents a Number uniform.\n *\n * @private\n * @augments Uniform\n */\nclass NumberUniform extends Uniform {\n\n\t/**\n\t * Constructs a new Number uniform.\n\t *\n\t * @param {string} name - The uniform's name.\n\t * @param {number} value - The uniform's value.\n\t */\n\tconstructor( name, value = 0 ) {\n\n\t\tsuper( name, value );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isNumberUniform = true;\n\n\t\tthis.boundary = 4;\n\t\tthis.itemSize = 1;\n\n\t}\n\n}\n\n/**\n * Represents a Vector2 uniform.\n *\n * @private\n * @augments Uniform\n */\nclass Vector2Uniform extends Uniform {\n\n\t/**\n\t * Constructs a new Number uniform.\n\t *\n\t * @param {string} name - The uniform's name.\n\t * @param {Vector2} value - The uniform's value.\n\t */\n\tconstructor( name, value = new Vector2() ) {\n\n\t\tsuper( name, value );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isVector2Uniform = true;\n\n\t\tthis.boundary = 8;\n\t\tthis.itemSize = 2;\n\n\t}\n\n}\n\n/**\n * Represents a Vector3 uniform.\n *\n * @private\n * @augments Uniform\n */\nclass Vector3Uniform extends Uniform {\n\n\t/**\n\t * Constructs a new Number uniform.\n\t *\n\t * @param {string} name - The uniform's name.\n\t * @param {Vector3} value - The uniform's value.\n\t */\n\tconstructor( name, value = new Vector3() ) {\n\n\t\tsuper( name, value );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isVector3Uniform = true;\n\n\t\tthis.boundary = 16;\n\t\tthis.itemSize = 3;\n\n\t}\n\n}\n\n/**\n * Represents a Vector4 uniform.\n *\n * @private\n * @augments Uniform\n */\nclass Vector4Uniform extends Uniform {\n\n\t/**\n\t * Constructs a new Number uniform.\n\t *\n\t * @param {string} name - The uniform's name.\n\t * @param {Vector4} value - The uniform's value.\n\t */\n\tconstructor( name, value = new Vector4() ) {\n\n\t\tsuper( name, value );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isVector4Uniform = true;\n\n\t\tthis.boundary = 16;\n\t\tthis.itemSize = 4;\n\n\t}\n\n}\n\n/**\n * Represents a Color uniform.\n *\n * @private\n * @augments Uniform\n */\nclass ColorUniform extends Uniform {\n\n\t/**\n\t * Constructs a new Number uniform.\n\t *\n\t * @param {string} name - The uniform's name.\n\t * @param {Color} value - The uniform's value.\n\t */\n\tconstructor( name, value = new Color() ) {\n\n\t\tsuper( name, value );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isColorUniform = true;\n\n\t\tthis.boundary = 16;\n\t\tthis.itemSize = 3;\n\n\t}\n\n}\n\n/**\n * Represents a Matrix2 uniform.\n *\n * @private\n * @augments Uniform\n */\nclass Matrix2Uniform extends Uniform {\n\n\t/**\n\t * Constructs a new Number uniform.\n\t *\n\t * @param {string} name - The uniform's name.\n\t * @param {Matrix2} value - The uniform's value.\n\t */\n\tconstructor( name, value = new Matrix2() ) {\n\n\t\tsuper( name, value );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMatrix2Uniform = true;\n\n\t\tthis.boundary = 8;\n\t\tthis.itemSize = 4;\n\n\t}\n\n}\n\n\n/**\n * Represents a Matrix3 uniform.\n *\n * @private\n * @augments Uniform\n */\nclass Matrix3Uniform extends Uniform {\n\n\t/**\n\t * Constructs a new Number uniform.\n\t *\n\t * @param {string} name - The uniform's name.\n\t * @param {Matrix3} value - The uniform's value.\n\t */\n\tconstructor( name, value = new Matrix3() ) {\n\n\t\tsuper( name, value );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMatrix3Uniform = true;\n\n\t\tthis.boundary = 48;\n\t\tthis.itemSize = 12;\n\n\t}\n\n}\n\n/**\n * Represents a Matrix4 uniform.\n *\n * @private\n * @augments Uniform\n */\nclass Matrix4Uniform extends Uniform {\n\n\t/**\n\t * Constructs a new Number uniform.\n\t *\n\t * @param {string} name - The uniform's name.\n\t * @param {Matrix4} value - The uniform's value.\n\t */\n\tconstructor( name, value = new Matrix4() ) {\n\n\t\tsuper( name, value );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isMatrix4Uniform = true;\n\n\t\tthis.boundary = 64;\n\t\tthis.itemSize = 16;\n\n\t}\n\n}\n\n/**\n * A special form of Number uniform binding type.\n * It's value is managed by a node object.\n *\n * @private\n * @augments NumberUniform\n */\nclass NumberNodeUniform extends NumberUniform {\n\n\t/**\n\t * Constructs a new node-based Number uniform.\n\t *\n\t * @param {NodeUniform} nodeUniform - The node uniform.\n\t */\n\tconstructor( nodeUniform ) {\n\n\t\tsuper( nodeUniform.name, nodeUniform.value );\n\n\t\t/**\n\t\t * The node uniform.\n\t\t *\n\t\t * @type {NodeUniform}\n\t\t */\n\t\tthis.nodeUniform = nodeUniform;\n\n\t}\n\n\t/**\n\t * Overwritten to return the value of the node uniform.\n\t *\n\t * @return {number} The value.\n\t */\n\tgetValue() {\n\n\t\treturn this.nodeUniform.value;\n\n\t}\n\n\t/**\n\t * Returns the node uniform data type.\n\t *\n\t * @return {string} The data type.\n\t */\n\tgetType() {\n\n\t\treturn this.nodeUniform.type;\n\n\t}\n\n}\n\n/**\n * A special form of Vector2 uniform binding type.\n * It's value is managed by a node object.\n *\n * @private\n * @augments Vector2Uniform\n */\nclass Vector2NodeUniform extends Vector2Uniform {\n\n\t/**\n\t * Constructs a new node-based Vector2 uniform.\n\t *\n\t * @param {NodeUniform} nodeUniform - The node uniform.\n\t */\n\tconstructor( nodeUniform ) {\n\n\t\tsuper( nodeUniform.name, nodeUniform.value );\n\n\t\t/**\n\t\t * The node uniform.\n\t\t *\n\t\t * @type {NodeUniform}\n\t\t */\n\t\tthis.nodeUniform = nodeUniform;\n\n\t}\n\n\t/**\n\t * Overwritten to return the value of the node uniform.\n\t *\n\t * @return {Vector2} The value.\n\t */\n\tgetValue() {\n\n\t\treturn this.nodeUniform.value;\n\n\t}\n\n\t/**\n\t * Returns the node uniform data type.\n\t *\n\t * @return {string} The data type.\n\t */\n\tgetType() {\n\n\t\treturn this.nodeUniform.type;\n\n\t}\n\n}\n\n/**\n * A special form of Vector3 uniform binding type.\n * It's value is managed by a node object.\n *\n * @private\n * @augments Vector3Uniform\n */\nclass Vector3NodeUniform extends Vector3Uniform {\n\n\t/**\n\t * Constructs a new node-based Vector3 uniform.\n\t *\n\t * @param {NodeUniform} nodeUniform - The node uniform.\n\t */\n\tconstructor( nodeUniform ) {\n\n\t\tsuper( nodeUniform.name, nodeUniform.value );\n\n\t\t/**\n\t\t * The node uniform.\n\t\t *\n\t\t * @type {NodeUniform}\n\t\t */\n\t\tthis.nodeUniform = nodeUniform;\n\n\t}\n\n\t/**\n\t * Overwritten to return the value of the node uniform.\n\t *\n\t * @return {Vector3} The value.\n\t */\n\tgetValue() {\n\n\t\treturn this.nodeUniform.value;\n\n\t}\n\n\t/**\n\t * Returns the node uniform data type.\n\t *\n\t * @return {string} The data type.\n\t */\n\tgetType() {\n\n\t\treturn this.nodeUniform.type;\n\n\t}\n\n}\n\n/**\n * A special form of Vector4 uniform binding type.\n * It's value is managed by a node object.\n *\n * @private\n * @augments Vector4Uniform\n */\nclass Vector4NodeUniform extends Vector4Uniform {\n\n\t/**\n\t * Constructs a new node-based Vector4 uniform.\n\t *\n\t * @param {NodeUniform} nodeUniform - The node uniform.\n\t */\n\tconstructor( nodeUniform ) {\n\n\t\tsuper( nodeUniform.name, nodeUniform.value );\n\n\t\t/**\n\t\t * The node uniform.\n\t\t *\n\t\t * @type {NodeUniform}\n\t\t */\n\t\tthis.nodeUniform = nodeUniform;\n\n\t}\n\n\t/**\n\t * Overwritten to return the value of the node uniform.\n\t *\n\t * @return {Vector4} The value.\n\t */\n\tgetValue() {\n\n\t\treturn this.nodeUniform.value;\n\n\t}\n\n\t/**\n\t * Returns the node uniform data type.\n\t *\n\t * @return {string} The data type.\n\t */\n\tgetType() {\n\n\t\treturn this.nodeUniform.type;\n\n\t}\n\n}\n\n/**\n * A special form of Color uniform binding type.\n * It's value is managed by a node object.\n *\n * @private\n * @augments ColorUniform\n */\nclass ColorNodeUniform extends ColorUniform {\n\n\t/**\n\t * Constructs a new node-based Color uniform.\n\t *\n\t * @param {NodeUniform} nodeUniform - The node uniform.\n\t */\n\tconstructor( nodeUniform ) {\n\n\t\tsuper( nodeUniform.name, nodeUniform.value );\n\n\t\t/**\n\t\t * The node uniform.\n\t\t *\n\t\t * @type {NodeUniform}\n\t\t */\n\t\tthis.nodeUniform = nodeUniform;\n\n\t}\n\n\t/**\n\t * Overwritten to return the value of the node uniform.\n\t *\n\t * @return {Color} The value.\n\t */\n\tgetValue() {\n\n\t\treturn this.nodeUniform.value;\n\n\t}\n\n\t/**\n\t * Returns the node uniform data type.\n\t *\n\t * @return {string} The data type.\n\t */\n\tgetType() {\n\n\t\treturn this.nodeUniform.type;\n\n\t}\n\n}\n\n\n/**\n * A special form of Matrix2 uniform binding type.\n * It's value is managed by a node object.\n *\n * @private\n * @augments Matrix2Uniform\n */\nclass Matrix2NodeUniform extends Matrix2Uniform {\n\n\t/**\n\t * Constructs a new node-based Matrix2 uniform.\n\t *\n\t * @param {NodeUniform} nodeUniform - The node uniform.\n\t */\n\tconstructor( nodeUniform ) {\n\n\t\tsuper( nodeUniform.name, nodeUniform.value );\n\n\t\t/**\n\t\t * The node uniform.\n\t\t *\n\t\t * @type {NodeUniform}\n\t\t */\n\t\tthis.nodeUniform = nodeUniform;\n\n\t}\n\n\t/**\n\t * Overwritten to return the value of the node uniform.\n\t *\n\t * @return {Matrix2} The value.\n\t */\n\tgetValue() {\n\n\t\treturn this.nodeUniform.value;\n\n\t}\n\n\t/**\n\t * Returns the node uniform data type.\n\t *\n\t * @return {string} The data type.\n\t */\n\tgetType() {\n\n\t\treturn this.nodeUniform.type;\n\n\t}\n\n}\n\n/**\n * A special form of Matrix3 uniform binding type.\n * It's value is managed by a node object.\n *\n * @private\n * @augments Matrix3Uniform\n */\nclass Matrix3NodeUniform extends Matrix3Uniform {\n\n\t/**\n\t * Constructs a new node-based Matrix3 uniform.\n\t *\n\t * @param {NodeUniform} nodeUniform - The node uniform.\n\t */\n\tconstructor( nodeUniform ) {\n\n\t\tsuper( nodeUniform.name, nodeUniform.value );\n\n\t\t/**\n\t\t * The node uniform.\n\t\t *\n\t\t * @type {NodeUniform}\n\t\t */\n\t\tthis.nodeUniform = nodeUniform;\n\n\t}\n\n\t/**\n\t * Overwritten to return the value of the node uniform.\n\t *\n\t * @return {Matrix3} The value.\n\t */\n\tgetValue() {\n\n\t\treturn this.nodeUniform.value;\n\n\t}\n\n\t/**\n\t * Returns the node uniform data type.\n\t *\n\t * @return {string} The data type.\n\t */\n\tgetType() {\n\n\t\treturn this.nodeUniform.type;\n\n\t}\n\n}\n\n/**\n * A special form of Matrix4 uniform binding type.\n * It's value is managed by a node object.\n *\n * @private\n * @augments Matrix4Uniform\n */\nclass Matrix4NodeUniform extends Matrix4Uniform {\n\n\t/**\n\t * Constructs a new node-based Matrix4 uniform.\n\t *\n\t * @param {NodeUniform} nodeUniform - The node uniform.\n\t */\n\tconstructor( nodeUniform ) {\n\n\t\tsuper( nodeUniform.name, nodeUniform.value );\n\n\t\t/**\n\t\t * The node uniform.\n\t\t *\n\t\t * @type {NodeUniform}\n\t\t */\n\t\tthis.nodeUniform = nodeUniform;\n\n\t}\n\n\t/**\n\t * Overwritten to return the value of the node uniform.\n\t *\n\t * @return {Matrix4} The value.\n\t */\n\tgetValue() {\n\n\t\treturn this.nodeUniform.value;\n\n\t}\n\n\t/**\n\t * Returns the node uniform data type.\n\t *\n\t * @return {string} The data type.\n\t */\n\tgetType() {\n\n\t\treturn this.nodeUniform.type;\n\n\t}\n\n}\n\nlet _id$5 = 0;\n\nconst sharedNodeData = new WeakMap();\n\nconst rendererCache = new WeakMap();\n\nconst typeFromArray = new Map( [\n\t[ Int8Array, 'int' ],\n\t[ Int16Array, 'int' ],\n\t[ Int32Array, 'int' ],\n\t[ Uint8Array, 'uint' ],\n\t[ Uint16Array, 'uint' ],\n\t[ Uint32Array, 'uint' ],\n\t[ Float32Array, 'float' ]\n] );\n\nconst toFloat = ( value ) => {\n\n\tif ( /e/g.test( value ) ) {\n\n\t\treturn String( value ).replace( /\\+/g, '' );\n\n\t} else {\n\n\t\tvalue = Number( value );\n\n\t\treturn value + ( value % 1 ? '' : '.0' );\n\n\t}\n\n};\n\n/**\n * Base class for builders which generate a shader program based\n * on a 3D object and its node material definition.\n */\nclass NodeBuilder {\n\n\t/**\n\t * Constructs a new node builder.\n\t *\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Renderer} renderer - The current renderer.\n\t * @param {NodeParser} parser - A reference to a node parser.\n\t */\n\tconstructor( object, renderer, parser ) {\n\n\t\t/**\n\t\t * The 3D object.\n\t\t *\n\t\t * @type {Object3D}\n\t\t */\n\t\tthis.object = object;\n\n\t\t/**\n\t\t * The material of the 3D object.\n\t\t *\n\t\t * @type {?Material}\n\t\t */\n\t\tthis.material = ( object && object.material ) || null;\n\n\t\t/**\n\t\t * The geometry of the 3D object.\n\t\t *\n\t\t * @type {?BufferGeometry}\n\t\t */\n\t\tthis.geometry = ( object && object.geometry ) || null;\n\n\t\t/**\n\t\t * The current renderer.\n\t\t *\n\t\t * @type {Renderer}\n\t\t */\n\t\tthis.renderer = renderer;\n\n\t\t/**\n\t\t * A reference to a node parser.\n\t\t *\n\t\t * @type {NodeParser}\n\t\t */\n\t\tthis.parser = parser;\n\n\t\t/**\n\t\t * The scene the 3D object belongs to.\n\t\t *\n\t\t * @type {?Scene}\n\t\t * @default null\n\t\t */\n\t\tthis.scene = null;\n\n\t\t/**\n\t\t * The camera the 3D object is rendered with.\n\t\t *\n\t\t * @type {?Camera}\n\t\t * @default null\n\t\t */\n\t\tthis.camera = null;\n\n\t\t/**\n\t\t * A list of all nodes the builder is processing\n\t\t * for this 3D object.\n\t\t *\n\t\t * @type {Array<Node>}\n\t\t */\n\t\tthis.nodes = [];\n\n\t\t/**\n\t\t * A list of all sequential nodes.\n\t\t *\n\t\t * @type {Array<Node>}\n\t\t */\n\t\tthis.sequentialNodes = [];\n\n\t\t/**\n\t\t * A list of all nodes which {@link Node#update} method should be executed.\n\t\t *\n\t\t * @type {Array<Node>}\n\t\t */\n\t\tthis.updateNodes = [];\n\n\t\t/**\n\t\t * A list of all nodes which {@link Node#updateBefore} method should be executed.\n\t\t *\n\t\t * @type {Array<Node>}\n\t\t */\n\t\tthis.updateBeforeNodes = [];\n\n\t\t/**\n\t\t * A list of all nodes which {@link Node#updateAfter} method should be executed.\n\t\t *\n\t\t * @type {Array<Node>}\n\t\t */\n\t\tthis.updateAfterNodes = [];\n\n\t\t/**\n\t\t * A dictionary that assigns each node to a unique hash.\n\t\t *\n\t\t * @type {Object<number,Node>}\n\t\t */\n\t\tthis.hashNodes = {};\n\n\t\t/**\n\t\t * A reference to a node material observer.\n\t\t *\n\t\t * @type {?NodeMaterialObserver}\n\t\t * @default null\n\t\t */\n\t\tthis.observer = null;\n\n\t\t/**\n\t\t * A reference to the current lights node.\n\t\t *\n\t\t * @type {?LightsNode}\n\t\t * @default null\n\t\t */\n\t\tthis.lightsNode = null;\n\n\t\t/**\n\t\t * A reference to the current environment node.\n\t\t *\n\t\t * @type {?Node}\n\t\t * @default null\n\t\t */\n\t\tthis.environmentNode = null;\n\n\t\t/**\n\t\t * A reference to the current fog node.\n\t\t *\n\t\t * @type {?Node}\n\t\t * @default null\n\t\t */\n\t\tthis.fogNode = null;\n\n\t\t/**\n\t\t * The current clipping context.\n\t\t *\n\t\t * @type {?ClippingContext}\n\t\t */\n\t\tthis.clippingContext = null;\n\n\t\t/**\n\t\t * The generated vertex shader.\n\t\t *\n\t\t * @type {?string}\n\t\t */\n\t\tthis.vertexShader = null;\n\n\t\t/**\n\t\t * The generated fragment shader.\n\t\t *\n\t\t * @type {?string}\n\t\t */\n\t\tthis.fragmentShader = null;\n\n\t\t/**\n\t\t * The generated compute shader.\n\t\t *\n\t\t * @type {?string}\n\t\t */\n\t\tthis.computeShader = null;\n\n\t\t/**\n\t\t * Nodes used in the primary flow of code generation.\n\t\t *\n\t\t * @type {Object<string,Array<Node>>}\n\t\t */\n\t\tthis.flowNodes = { vertex: [], fragment: [], compute: [] };\n\n\t\t/**\n\t\t * Nodes code from `.flowNodes`.\n\t\t *\n\t\t * @type {Object<string,string>}\n\t\t */\n\t\tthis.flowCode = { vertex: '', fragment: '', compute: '' };\n\n\t\t/**\n\t\t * This dictionary holds the node uniforms of the builder.\n\t\t * The uniforms are maintained in an array for each shader stage.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.uniforms = { vertex: [], fragment: [], compute: [], index: 0 };\n\n\t\t/**\n\t\t * This dictionary holds the output structs of the builder.\n\t\t * The structs are maintained in an array for each shader stage.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.structs = { vertex: [], fragment: [], compute: [], index: 0 };\n\n\t\t/**\n\t\t * This dictionary holds the types of the builder.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.types = { vertex: [], fragment: [], compute: [], index: 0 };\n\n\t\t/**\n\t\t * This dictionary holds the bindings for each shader stage.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.bindings = { vertex: {}, fragment: {}, compute: {} };\n\n\t\t/**\n\t\t * This dictionary maintains the binding indices per bind group.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.bindingsIndexes = {};\n\n\t\t/**\n\t\t * Reference to the array of bind groups.\n\t\t *\n\t\t * @type {?Array<BindGroup>}\n\t\t */\n\t\tthis.bindGroups = null;\n\n\t\t/**\n\t\t * This array holds the node attributes of this builder\n\t\t * created via {@link AttributeNode}.\n\t\t *\n\t\t * @type {Array<NodeAttribute>}\n\t\t */\n\t\tthis.attributes = [];\n\n\t\t/**\n\t\t * This array holds the node attributes of this builder\n\t\t * created via {@link BufferAttributeNode}.\n\t\t *\n\t\t * @type {Array<NodeAttribute>}\n\t\t */\n\t\tthis.bufferAttributes = [];\n\n\t\t/**\n\t\t * This array holds the node varyings of this builder.\n\t\t *\n\t\t * @type {Array<NodeVarying>}\n\t\t */\n\t\tthis.varyings = [];\n\n\t\t/**\n\t\t * This dictionary holds the (native) node codes of this builder.\n\t\t * The codes are maintained in an array for each shader stage.\n\t\t *\n\t\t * @type {Object<string,Array<NodeCode>>}\n\t\t */\n\t\tthis.codes = {};\n\n\t\t/**\n\t\t * This dictionary holds the node variables of this builder.\n\t\t * The variables are maintained in an array for each shader stage.\n\t\t * This dictionary is also used to count the number of variables\n\t\t * according to their type (const, vars).\n\t\t *\n\t\t * @type {Object<string,Array<NodeVar>|number>}\n\t\t */\n\t\tthis.vars = {};\n\n\t\t/**\n\t\t * This dictionary holds the declarations for each shader stage.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.declarations = {};\n\n\t\t/**\n\t\t * Current code flow.\n\t\t * All code generated in this stack will be stored in `.flow`.\n\t\t *\n\t\t * @type {{code: string}}\n\t\t */\n\t\tthis.flow = { code: '' };\n\n\t\t/**\n\t\t * A chain of nodes.\n\t\t * Used to check recursive calls in node-graph.\n\t\t *\n\t\t * @type {Array<Node>}\n\t\t */\n\t\tthis.chaining = [];\n\n\t\t/**\n\t\t * The current stack.\n\t\t * This reflects the current process in the code block hierarchy,\n\t\t * it is useful to know if the current process is inside a conditional for example.\n\t\t *\n\t\t * @type {StackNode}\n\t\t */\n\t\tthis.stack = stack();\n\n\t\t/**\n\t\t * List of stack nodes.\n\t\t * The current stack hierarchy is stored in an array.\n\t\t *\n\t\t * @type {Array<StackNode>}\n\t\t */\n\t\tthis.stacks = [];\n\n\t\t/**\n\t\t * A tab value. Used for shader string generation.\n\t\t *\n\t\t * @type {string}\n\t\t * @default '\\t'\n\t\t */\n\t\tthis.tab = '\\t';\n\n\t\t/**\n\t\t * Reference to the current function node.\n\t\t *\n\t\t * @type {?FunctionNode}\n\t\t * @default null\n\t\t */\n\t\tthis.currentFunctionNode = null;\n\n\t\t/**\n\t\t * The builder's context.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.context = {\n\t\t\tmaterial: this.material\n\t\t};\n\n\t\t/**\n\t\t * The builder's cache.\n\t\t *\n\t\t * @type {NodeCache}\n\t\t */\n\t\tthis.cache = new NodeCache();\n\n\t\t/**\n\t\t * Since the {@link NodeBuilder#cache} might be temporarily\n\t\t * overwritten by other caches, this member retains the reference\n\t\t * to the builder's own cache.\n\t\t *\n\t\t * @type {NodeCache}\n\t\t * @default this.cache\n\t\t */\n\t\tthis.globalCache = this.cache;\n\n\t\tthis.flowsData = new WeakMap();\n\n\t\t/**\n\t\t * The current shader stage.\n\t\t *\n\t\t * @type {?('vertex'|'fragment'|'compute'|'any')}\n\t\t */\n\t\tthis.shaderStage = null;\n\n\t\t/**\n\t\t * The current build stage.\n\t\t *\n\t\t * @type {?('setup'|'analyze'|'generate')}\n\t\t */\n\t\tthis.buildStage = null;\n\n\t\t/**\n\t\t * The sub-build layers.\n\t\t *\n\t\t * @type {Array<SubBuildNode>}\n\t\t * @default []\n\t\t */\n\t\tthis.subBuildLayers = [];\n\n\n\t\t/**\n\t\t * The active stack nodes.\n\t\t *\n\t\t * @type {Array<StackNode>}\n\t\t */\n\t\tthis.activeStacks = [];\n\n\t\t/**\n\t\t * The current sub-build TSL function(Fn).\n\t\t *\n\t\t * @type {?string}\n\t\t * @default null\n\t\t */\n\t\tthis.subBuildFn = null;\n\n\t\t/**\n\t\t * The current TSL function(Fn) call node.\n\t\t *\n\t\t * @type {?Node}\n\t\t * @default null\n\t\t */\n\t\tthis.fnCall = null;\n\n\t\tObject.defineProperty( this, 'id', { value: _id$5 ++ } );\n\n\t}\n\n\t/**\n\t * Whether the material is opaque or not.\n\t *\n\t * @return {boolean} Whether the material is opaque or not.\n\t */\n\tisOpaque() {\n\n\t\tconst material = this.material;\n\n\t\treturn material.transparent === false && material.blending === NormalBlending && material.alphaToCoverage === false;\n\n\t}\n\n\t/**\n\t * Returns the bind groups of the current renderer.\n\t *\n\t * @return {ChainMap} The cache.\n\t */\n\tgetBindGroupsCache() {\n\n\t\tlet bindGroupsCache = rendererCache.get( this.renderer );\n\n\t\tif ( bindGroupsCache === undefined ) {\n\n\t\t\tbindGroupsCache = new ChainMap();\n\n\t\t\trendererCache.set( this.renderer, bindGroupsCache );\n\n\t\t}\n\n\t\treturn bindGroupsCache;\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of {@link RenderTarget} with the given\n\t * dimensions and options.\n\t *\n\t * @param {number} width - The width of the render target.\n\t * @param {number} height - The height of the render target.\n\t * @param {Object} options - The options of the render target.\n\t * @return {RenderTarget} The render target.\n\t */\n\tcreateRenderTarget( width, height, options ) {\n\n\t\treturn new RenderTarget( width, height, options );\n\n\t}\n\n\t/**\n\t * Factory method for creating an instance of {@link CubeRenderTarget} with the given\n\t * dimensions and options.\n\t *\n\t * @param {number} size - The size of the cube render target.\n\t * @param {Object} options - The options of the cube render target.\n\t * @return {CubeRenderTarget} The cube render target.\n\t */\n\tcreateCubeRenderTarget( size, options ) {\n\n\t\treturn new CubeRenderTarget( size, options );\n\n\t}\n\n\t/**\n\t * Whether the given node is included in the internal array of nodes or not.\n\t *\n\t * @param {Node} node - The node to test.\n\t * @return {boolean} Whether the given node is included in the internal array of nodes or not.\n\t */\n\tincludes( node ) {\n\n\t\treturn this.nodes.includes( node );\n\n\t}\n\n\t/**\n\t * Returns the output struct name which is required by\n\t * {@link OutputStructNode}.\n\t *\n\t * @abstract\n\t * @return {string} The name of the output struct.\n\t */\n\tgetOutputStructName() {}\n\n\t/**\n\t * Returns a bind group for the given group name and binding.\n\t *\n\t * @private\n\t * @param {string} groupName - The group name.\n\t * @param {Array<NodeUniformsGroup>} bindings - List of bindings.\n\t * @return {BindGroup} The bind group\n\t */\n\t_getBindGroup( groupName, bindings ) {\n\n\t\tconst bindGroupsCache = this.getBindGroupsCache();\n\n\t\t//\n\n\t\tconst bindingsArray = [];\n\n\t\tlet sharedGroup = true;\n\n\t\tfor ( const binding of bindings ) {\n\n\t\t\tbindingsArray.push( binding );\n\n\t\t\tsharedGroup = sharedGroup && binding.groupNode.shared !== true;\n\n\t\t}\n\n\t\t//\n\n\t\tlet bindGroup;\n\n\t\tif ( sharedGroup ) {\n\n\t\t\tbindGroup = bindGroupsCache.get( bindingsArray );\n\n\t\t\tif ( bindGroup === undefined ) {\n\n\t\t\t\tbindGroup = new BindGroup( groupName, bindingsArray, this.bindingsIndexes[ groupName ].group, bindingsArray );\n\n\t\t\t\tbindGroupsCache.set( bindingsArray, bindGroup );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tbindGroup = new BindGroup( groupName, bindingsArray, this.bindingsIndexes[ groupName ].group, bindingsArray );\n\n\t\t}\n\n\t\treturn bindGroup;\n\n\t}\n\n\t/**\n\t * Returns an array of node uniform groups for the given group name and shader stage.\n\t *\n\t * @param {string} groupName - The group name.\n\t * @param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage.\n\t * @return {Array<NodeUniformsGroup>} The array of node uniform groups.\n\t */\n\tgetBindGroupArray( groupName, shaderStage ) {\n\n\t\tconst bindings = this.bindings[ shaderStage ];\n\n\t\tlet bindGroup = bindings[ groupName ];\n\n\t\tif ( bindGroup === undefined ) {\n\n\t\t\tif ( this.bindingsIndexes[ groupName ] === undefined ) {\n\n\t\t\t\tthis.bindingsIndexes[ groupName ] = { binding: 0, group: Object.keys( this.bindingsIndexes ).length };\n\n\t\t\t}\n\n\t\t\tbindings[ groupName ] = bindGroup = [];\n\n\t\t}\n\n\t\treturn bindGroup;\n\n\t}\n\n\t/**\n\t * Returns a list bindings of all shader stages separated by groups.\n\t *\n\t * @return {Array<BindGroup>} The list of bindings.\n\t */\n\tgetBindings() {\n\n\t\tlet bindingsGroups = this.bindGroups;\n\n\t\tif ( bindingsGroups === null ) {\n\n\t\t\tconst groups = {};\n\t\t\tconst bindings = this.bindings;\n\n\t\t\tfor ( const shaderStage of shaderStages ) {\n\n\t\t\t\tfor ( const groupName in bindings[ shaderStage ] ) {\n\n\t\t\t\t\tconst uniforms = bindings[ shaderStage ][ groupName ];\n\n\t\t\t\t\tconst groupUniforms = groups[ groupName ] || ( groups[ groupName ] = [] );\n\t\t\t\t\tgroupUniforms.push( ...uniforms );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tbindingsGroups = [];\n\n\t\t\tfor ( const groupName in groups ) {\n\n\t\t\t\tconst group = groups[ groupName ];\n\n\t\t\t\tconst bindingsGroup = this._getBindGroup( groupName, group );\n\n\t\t\t\tbindingsGroups.push( bindingsGroup );\n\n\t\t\t}\n\n\t\t\tthis.bindGroups = bindingsGroups;\n\n\t\t}\n\n\t\treturn bindingsGroups;\n\n\t}\n\n\t/**\n\t * Sorts the bind groups and updates {@link NodeBuilder#bindingsIndexes}.\n\t */\n\tsortBindingGroups() {\n\n\t\tconst bindingsGroups = this.getBindings();\n\n\t\tbindingsGroups.sort( ( a, b ) => ( a.bindings[ 0 ].groupNode.order - b.bindings[ 0 ].groupNode.order ) );\n\n\t\tfor ( let i = 0; i < bindingsGroups.length; i ++ ) {\n\n\t\t\tconst bindingGroup = bindingsGroups[ i ];\n\t\t\tthis.bindingsIndexes[ bindingGroup.name ].group = i;\n\n\t\t\tbindingGroup.index = i;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * The builder maintains each node in a hash-based dictionary.\n\t * This method sets the given node (value) with the given hash (key) into this dictionary.\n\t *\n\t * @param {Node} node - The node to add.\n\t * @param {number} hash - The hash of the node.\n\t */\n\tsetHashNode( node, hash ) {\n\n\t\tthis.hashNodes[ hash ] = node;\n\n\t}\n\n\t/**\n\t * Adds a node to this builder.\n\t *\n\t * @param {Node} node - The node to add.\n\t */\n\taddNode( node ) {\n\n\t\tif ( this.nodes.includes( node ) === false ) {\n\n\t\t\tthis.nodes.push( node );\n\n\t\t\tthis.setHashNode( node, node.getHash( this ) );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * It is used to add Nodes that will be used as FRAME and RENDER events,\n\t * and need to follow a certain sequence in the calls to work correctly.\n\t * This function should be called after 'setup()' in the 'build()' process to ensure that the child nodes are processed first.\n\t *\n\t * @param {Node} node - The node to add.\n\t */\n\taddSequentialNode( node ) {\n\n\t\tif ( this.sequentialNodes.includes( node ) === false ) {\n\n\t\t\tthis.sequentialNodes.push( node );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Checks the update types of nodes\n\t */\n\tbuildUpdateNodes() {\n\n\t\tfor ( const node of this.nodes ) {\n\n\t\t\tconst updateType = node.getUpdateType();\n\n\t\t\tif ( updateType !== NodeUpdateType.NONE ) {\n\n\t\t\t\tthis.updateNodes.push( node );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( const node of this.sequentialNodes ) {\n\n\t\t\tconst updateBeforeType = node.getUpdateBeforeType();\n\t\t\tconst updateAfterType = node.getUpdateAfterType();\n\n\t\t\tif ( updateBeforeType !== NodeUpdateType.NONE ) {\n\n\t\t\t\tthis.updateBeforeNodes.push( node );\n\n\t\t\t}\n\n\t\t\tif ( updateAfterType !== NodeUpdateType.NONE ) {\n\n\t\t\t\tthis.updateAfterNodes.push( node );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * A reference the current node which is the\n\t * last node in the chain of nodes.\n\t *\n\t * @type {Node}\n\t */\n\tget currentNode() {\n\n\t\treturn this.chaining[ this.chaining.length - 1 ];\n\n\t}\n\n\t/**\n\t * Whether the given texture is filtered or not.\n\t *\n\t * @param {Texture} texture - The texture to check.\n\t * @return {boolean} Whether the given texture is filtered or not.\n\t */\n\tisFilteredTexture( texture ) {\n\n\t\treturn ( texture.magFilter === LinearFilter || texture.magFilter === LinearMipmapNearestFilter || texture.magFilter === NearestMipmapLinearFilter || texture.magFilter === LinearMipmapLinearFilter ||\n\t\t\ttexture.minFilter === LinearFilter || texture.minFilter === LinearMipmapNearestFilter || texture.minFilter === NearestMipmapLinearFilter || texture.minFilter === LinearMipmapLinearFilter );\n\n\t}\n\n\t/**\n\t * Adds the given node to the internal node chain.\n\t * This is used to check recursive calls in node-graph.\n\t *\n\t * @param {Node} node - The node to add.\n\t */\n\taddChain( node ) {\n\n\t\t/*\n\t\tif ( this.chaining.indexOf( node ) !== - 1 ) {\n\n\t\t\twarn( 'Recursive node: ', node );\n\n\t\t}\n\t\t*/\n\n\t\tthis.chaining.push( node );\n\n\t}\n\n\t/**\n\t * Removes the given node from the internal node chain.\n\t *\n\t * @param {Node} node - The node to remove.\n\t */\n\tremoveChain( node ) {\n\n\t\tconst lastChain = this.chaining.pop();\n\n\t\tif ( lastChain !== node ) {\n\n\t\t\tthrow new Error( 'NodeBuilder: Invalid node chaining!' );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the native shader method name for a given generic name. E.g.\n\t * the method name `textureDimensions` matches the WGSL name but must be\n\t * resolved to `textureSize` in GLSL.\n\t *\n\t * @abstract\n\t * @param {string} method - The method name to resolve.\n\t * @return {string} The resolved method name.\n\t */\n\tgetMethod( method ) {\n\n\t\treturn method;\n\n\t}\n\n\t/**\n\t * Returns the native snippet for a ternary operation. E.g. GLSL would output\n\t * a ternary op as `cond ? x : y` whereas WGSL would output it as `select(y, x, cond)`\n\t *\n\t * @abstract\n\t * @param {string} condSnippet - The condition determining which expression gets resolved.\n\t * @param {string} ifSnippet - The expression to resolve to if the condition is true.\n\t * @param {string} elseSnippet - The expression to resolve to if the condition is false.\n\t * @return {string} The resolved method name.\n\t */\n\tgetTernary( /* condSnippet, ifSnippet, elseSnippet*/ ) {\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Returns a node for the given hash, see {@link NodeBuilder#setHashNode}.\n\t *\n\t * @param {number} hash - The hash of the node.\n\t * @return {Node} The found node.\n\t */\n\tgetNodeFromHash( hash ) {\n\n\t\treturn this.hashNodes[ hash ];\n\n\t}\n\n\t/**\n\t * Adds the Node to a target flow so that it can generate code in the 'generate' process.\n\t *\n\t * @param {('vertex'|'fragment'|'compute')} shaderStage - The shader stage.\n\t * @param {Node} node - The node to add.\n\t * @return {Node} The node.\n\t */\n\taddFlow( shaderStage, node ) {\n\n\t\tthis.flowNodes[ shaderStage ].push( node );\n\n\t\treturn node;\n\n\t}\n\n\t/**\n\t * Sets builder's context.\n\t *\n\t * @param {Object} context - The context to set.\n\t */\n\tsetContext( context ) {\n\n\t\tthis.context = context;\n\n\t}\n\n\t/**\n\t * Returns the builder's current context.\n\t *\n\t * @return {Object} The builder's current context.\n\t */\n\tgetContext() {\n\n\t\treturn this.context;\n\n\t}\n\n\t/**\n\t * Adds context data to the builder's current context.\n\t *\n\t * @param {Object} context - The context to add.\n\t * @return {Object} The previous context.\n\t */\n\taddContext( context ) {\n\n\t\tconst previousContext = this.getContext();\n\n\t\tthis.setContext( { ...this.context, ...context } );\n\n\t\treturn previousContext;\n\n\t}\n\n\t/**\n\t * Gets a context used in shader construction that can be shared across different materials.\n\t * This is necessary since the renderer cache can reuse shaders generated in one material and use them in another.\n\t *\n\t * @return {Object} The builder's current context without material.\n\t */\n\tgetSharedContext() {\n\n\t\tconst context = { ...this.context };\n\n\t\tdelete context.material;\n\t\tdelete context.getUV;\n\t\tdelete context.getOutput;\n\t\tdelete context.getTextureLevel;\n\t\tdelete context.getAO;\n\t\tdelete context.getShadow;\n\n\t\treturn context;\n\n\t}\n\n\t/**\n\t * Sets builder's cache.\n\t *\n\t * @param {NodeCache} cache - The cache to set.\n\t */\n\tsetCache( cache ) {\n\n\t\tthis.cache = cache;\n\n\t}\n\n\t/**\n\t * Returns the builder's current cache.\n\t *\n\t * @return {NodeCache} The builder's current cache.\n\t */\n\tgetCache() {\n\n\t\treturn this.cache;\n\n\t}\n\n\t/**\n\t * Returns a cache for the given node.\n\t *\n\t * @param {Node} node - The node.\n\t * @param {boolean} [parent=true] - Whether this node refers to a shared parent cache or not.\n\t * @return {NodeCache} The cache.\n\t */\n\tgetCacheFromNode( node, parent = true ) {\n\n\t\tconst data = this.getDataFromNode( node );\n\t\tif ( data.cache === undefined ) data.cache = new NodeCache( parent ? this.getCache() : null );\n\n\t\treturn data.cache;\n\n\t}\n\n\t/**\n\t * Whether the requested feature is available or not.\n\t *\n\t * @abstract\n\t * @param {string} name - The requested feature.\n\t * @return {boolean} Whether the requested feature is supported or not.\n\t */\n\tisAvailable( /*name*/ ) {\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Returns the vertexIndex input variable as a native shader string.\n\t *\n\t * @abstract\n\t * @return {string} The instanceIndex shader string.\n\t */\n\tgetVertexIndex() {\n\n\t\twarn( 'Abstract function.' );\n\n\t}\n\n\t/**\n\t * Contextually returns either the vertex stage instance index builtin\n\t * or the linearized index of an compute invocation within a grid of workgroups.\n\t *\n\t * @abstract\n\t * @return {string} The instanceIndex shader string.\n\t */\n\tgetInstanceIndex() {\n\n\t\twarn( 'Abstract function.' );\n\n\t}\n\n\t/**\n\t * Returns the drawIndex input variable as a native shader string.\n\t * Only relevant for WebGL and its `WEBGL_multi_draw` extension.\n\t *\n\t * @abstract\n\t * @return {?string} The drawIndex shader string.\n\t */\n\tgetDrawIndex() {\n\n\t\twarn( 'Abstract function.' );\n\n\t}\n\n\t/**\n\t * Returns the frontFacing input variable as a native shader string.\n\t *\n\t * @abstract\n\t * @return {string} The frontFacing shader string.\n\t */\n\tgetFrontFacing() {\n\n\t\twarn( 'Abstract function.' );\n\n\t}\n\n\t/**\n\t * Returns the fragCoord input variable as a native shader string.\n\t *\n\t * @abstract\n\t * @return {string} The fragCoord shader string.\n\t */\n\tgetFragCoord() {\n\n\t\twarn( 'Abstract function.' );\n\n\t}\n\n\t/**\n\t * Whether to flip texture data along its vertical axis or not. WebGL needs\n\t * this method evaluate to `true`, WebGPU to `false`.\n\t *\n\t * @abstract\n\t * @return {boolean} Whether to flip texture data along its vertical axis or not.\n\t */\n\tisFlipY() {\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Calling this method increases the usage count for the given node by one.\n\t *\n\t * @param {Node} node - The node to increase the usage count for.\n\t * @return {number} The updated usage count.\n\t */\n\tincreaseUsage( node ) {\n\n\t\tconst nodeData = this.getDataFromNode( node );\n\t\tnodeData.usageCount = nodeData.usageCount === undefined ? 1 : nodeData.usageCount + 1;\n\n\t\treturn nodeData.usageCount;\n\n\t}\n\n\t/**\n\t * Generates a texture sample shader string for the given texture data.\n\t *\n\t * @abstract\n\t * @param {Texture} texture - The texture.\n\t * @param {string} textureProperty - The texture property name.\n\t * @param {string} uvSnippet - Snippet defining the texture coordinates.\n\t * @return {string} The generated shader string.\n\t */\n\tgenerateTexture( /* texture, textureProperty, uvSnippet */ ) {\n\n\t\twarn( 'Abstract function.' );\n\n\t}\n\n\t/**\n\t * Generates a texture LOD shader string for the given texture data.\n\t *\n\t * @abstract\n\t * @param {Texture} texture - The texture.\n\t * @param {string} textureProperty - The texture property name.\n\t * @param {string} uvSnippet - Snippet defining the texture coordinates.\n\t * @param {?string} depthSnippet - Snippet defining the 0-based texture array index to sample.\n\t * @param {string} levelSnippet - Snippet defining the mip level.\n\t * @return {string} The generated shader string.\n\t */\n\tgenerateTextureLod( /* texture, textureProperty, uvSnippet, depthSnippet, levelSnippet */ ) {\n\n\t\twarn( 'Abstract function.' );\n\n\t}\n\n\t/**\n\t * Generates the array declaration string.\n\t *\n\t * @param {string} type - The type.\n\t * @param {?number} [count] - The count.\n\t * @return {string} The generated value as a shader string.\n\t */\n\tgenerateArrayDeclaration( type, count ) {\n\n\t\treturn this.getType( type ) + '[ ' + count + ' ]';\n\n\t}\n\n\t/**\n\t * Generates the array shader string for the given type and value.\n\t *\n\t * @param {string} type - The type.\n\t * @param {?number} [count] - The count.\n\t * @param {?Array<Node>} [values=null] - The default values.\n\t * @return {string} The generated value as a shader string.\n\t */\n\tgenerateArray( type, count, values = null ) {\n\n\t\tlet snippet = this.generateArrayDeclaration( type, count ) + '( ';\n\n\t\tfor ( let i = 0; i < count; i ++ ) {\n\n\t\t\tconst value = values ? values[ i ] : null;\n\n\t\t\tif ( value !== null ) {\n\n\t\t\t\tsnippet += value.build( this, type );\n\n\t\t\t} else {\n\n\t\t\t\tsnippet += this.generateConst( type );\n\n\t\t\t}\n\n\t\t\tif ( i < count - 1 ) snippet += ', ';\n\n\t\t}\n\n\t\tsnippet += ' )';\n\n\t\treturn snippet;\n\n\t}\n\n\t/**\n\t * Generates the struct shader string.\n\t *\n\t * @param {string} type - The type.\n\t * @param {Array<Object>} [membersLayout] - The count.\n\t * @param {?Array<Node>} [values=null] - The default values.\n\t * @return {string} The generated value as a shader string.\n\t */\n\tgenerateStruct( type, membersLayout, values = null ) {\n\n\t\tconst snippets = [];\n\n\t\tfor ( const member of membersLayout ) {\n\n\t\t\tconst { name, type } = member;\n\n\t\t\tif ( values && values[ name ] && values[ name ].isNode ) {\n\n\t\t\t\tsnippets.push( values[ name ].build( this, type ) );\n\n\t\t\t} else {\n\n\t\t\t\tsnippets.push( this.generateConst( type ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn type + '( ' + snippets.join( ', ' ) + ' )';\n\n\t}\n\n\t/**\n\t * Generates the shader string for the given type and value.\n\t *\n\t * @param {string} type - The type.\n\t * @param {?any} [value=null] - The value.\n\t * @return {string} The generated value as a shader string.\n\t */\n\tgenerateConst( type, value = null ) {\n\n\t\tif ( value === null ) {\n\n\t\t\tif ( type === 'float' || type === 'int' || type === 'uint' ) value = 0;\n\t\t\telse if ( type === 'bool' ) value = false;\n\t\t\telse if ( type === 'color' ) value = new Color();\n\t\t\telse if ( type === 'vec2' || type === 'uvec2' || type === 'ivec2' ) value = new Vector2();\n\t\t\telse if ( type === 'vec3' || type === 'uvec3' || type === 'ivec3' ) value = new Vector3();\n\t\t\telse if ( type === 'vec4' || type === 'uvec4' || type === 'ivec4' ) value = new Vector4();\n\n\t\t}\n\n\t\tif ( type === 'float' ) return toFloat( value );\n\t\tif ( type === 'int' ) return `${ Math.round( value ) }`;\n\t\tif ( type === 'uint' ) return value >= 0 ? `${ Math.round( value ) }u` : '0u';\n\t\tif ( type === 'bool' ) return value ? 'true' : 'false';\n\t\tif ( type === 'color' ) return `${ this.getType( 'vec3' ) }( ${ toFloat( value.r ) }, ${ toFloat( value.g ) }, ${ toFloat( value.b ) } )`;\n\n\t\tconst typeLength = this.getTypeLength( type );\n\n\t\tconst componentType = this.getComponentType( type );\n\n\t\tconst generateConst = value => this.generateConst( componentType, value );\n\n\t\tif ( typeLength === 2 ) {\n\n\t\t\treturn `${ this.getType( type ) }( ${ generateConst( value.x ) }, ${ generateConst( value.y ) } )`;\n\n\t\t} else if ( typeLength === 3 ) {\n\n\t\t\treturn `${ this.getType( type ) }( ${ generateConst( value.x ) }, ${ generateConst( value.y ) }, ${ generateConst( value.z ) } )`;\n\n\t\t} else if ( typeLength === 4 && type !== 'mat2' ) {\n\n\t\t\treturn `${ this.getType( type ) }( ${ generateConst( value.x ) }, ${ generateConst( value.y ) }, ${ generateConst( value.z ) }, ${ generateConst( value.w ) } )`;\n\n\t\t} else if ( typeLength >= 4 && value && ( value.isMatrix2 || value.isMatrix3 || value.isMatrix4 ) ) {\n\n\t\t\treturn `${ this.getType( type ) }( ${ value.elements.map( generateConst ).join( ', ' ) } )`;\n\n\t\t} else if ( typeLength > 4 ) {\n\n\t\t\treturn `${ this.getType( type ) }()`;\n\n\t\t}\n\n\t\tthrow new Error( `NodeBuilder: Type '${type}' not found in generate constant attempt.` );\n\n\t}\n\n\t/**\n\t * It might be necessary to convert certain data types to different ones\n\t * so this method can be used to hide the conversion.\n\t *\n\t * @param {string} type - The type.\n\t * @return {string} The updated type.\n\t */\n\tgetType( type ) {\n\n\t\tif ( type === 'color' ) return 'vec3';\n\n\t\treturn type;\n\n\t}\n\n\t/**\n\t * Whether the given attribute name is defined in the geometry or not.\n\t *\n\t * @param {string} name - The attribute name.\n\t * @return {boolean} Whether the given attribute name is defined in the geometry.\n\t */\n\thasGeometryAttribute( name ) {\n\n\t\treturn this.geometry && this.geometry.getAttribute( name ) !== undefined;\n\n\t}\n\n\t/**\n\t * Returns a node attribute for the given name and type.\n\t *\n\t * @param {string} name - The attribute's name.\n\t * @param {string} type - The attribute's type.\n\t * @return {NodeAttribute} The node attribute.\n\t */\n\tgetAttribute( name, type ) {\n\n\t\tconst attributes = this.attributes;\n\n\t\t// find attribute\n\n\t\tfor ( const attribute of attributes ) {\n\n\t\t\tif ( attribute.name === name ) {\n\n\t\t\t\treturn attribute;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// create a new if no exist\n\n\t\tconst attribute = new NodeAttribute( name, type );\n\n\t\tthis.registerDeclaration( attribute );\n\n\t\tattributes.push( attribute );\n\n\t\treturn attribute;\n\n\t}\n\n\t/**\n\t * Returns for the given node and shader stage the property name for the shader.\n\t *\n\t * @param {Node} node - The node.\n\t * @param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage.\n\t * @return {string} The property name.\n\t */\n\tgetPropertyName( node/*, shaderStage*/ ) {\n\n\t\treturn node.name;\n\n\t}\n\n\t/**\n\t * Whether the given type is a vector type or not.\n\t *\n\t * @param {string} type - The type to check.\n\t * @return {boolean} Whether the given type is a vector type or not.\n\t */\n\tisVector( type ) {\n\n\t\treturn /vec\\d/.test( type );\n\n\t}\n\n\t/**\n\t * Whether the given type is a matrix type or not.\n\t *\n\t * @param {string} type - The type to check.\n\t * @return {boolean} Whether the given type is a matrix type or not.\n\t */\n\tisMatrix( type ) {\n\n\t\treturn /mat\\d/.test( type );\n\n\t}\n\n\t/**\n\t * Whether the given type is a reference type or not.\n\t *\n\t * @param {string} type - The type to check.\n\t * @return {boolean} Whether the given type is a reference type or not.\n\t */\n\tisReference( type ) {\n\n\t\treturn type === 'void' || type === 'property' || type === 'sampler' || type === 'samplerComparison' || type === 'texture' || type === 'cubeTexture' || type === 'storageTexture' || type === 'depthTexture' || type === 'texture3D';\n\n\t}\n\n\t/**\n\t * Checks if the given texture requires a manual conversion to the working color space.\n\t *\n\t * @abstract\n\t * @param {Texture} texture - The texture to check.\n\t * @return {boolean} Whether the given texture requires a conversion to working color space or not.\n\t */\n\tneedsToWorkingColorSpace( /*texture*/ ) {\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Returns the component type of a given texture.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @return {string} The component type.\n\t */\n\tgetComponentTypeFromTexture( texture ) {\n\n\t\tconst type = texture.type;\n\n\t\tif ( texture.isDataTexture ) {\n\n\t\t\tif ( type === IntType ) return 'int';\n\t\t\tif ( type === UnsignedIntType ) return 'uint';\n\n\t\t}\n\n\t\treturn 'float';\n\n\t}\n\n\t/**\n\t * Returns the element type for a given type.\n\t *\n\t * @param {string} type - The type.\n\t * @return {string} The element type.\n\t */\n\tgetElementType( type ) {\n\n\t\tif ( type === 'mat2' ) return 'vec2';\n\t\tif ( type === 'mat3' ) return 'vec3';\n\t\tif ( type === 'mat4' ) return 'vec4';\n\n\t\treturn this.getComponentType( type );\n\n\t}\n\n\t/**\n\t * Returns the component type for a given type.\n\t *\n\t * @param {string} type - The type.\n\t * @return {string} The component type.\n\t */\n\tgetComponentType( type ) {\n\n\t\ttype = this.getVectorType( type );\n\n\t\tif ( type === 'float' || type === 'bool' || type === 'int' || type === 'uint' ) return type;\n\n\t\tconst componentType = /(b|i|u|)(vec|mat)([2-4])/.exec( type );\n\n\t\tif ( componentType === null ) return null;\n\n\t\tif ( componentType[ 1 ] === 'b' ) return 'bool';\n\t\tif ( componentType[ 1 ] === 'i' ) return 'int';\n\t\tif ( componentType[ 1 ] === 'u' ) return 'uint';\n\n\t\treturn 'float';\n\n\t}\n\n\t/**\n\t * Returns the vector type for a given type.\n\t *\n\t * @param {string} type - The type.\n\t * @return {string} The vector type.\n\t */\n\tgetVectorType( type ) {\n\n\t\tif ( type === 'color' ) return 'vec3';\n\t\tif ( type === 'texture' || type === 'cubeTexture' || type === 'storageTexture' || type === 'texture3D' ) return 'vec4';\n\n\t\treturn type;\n\n\t}\n\n\t/**\n\t * Returns the data type for the given the length and component type.\n\t *\n\t * @param {number} length - The length.\n\t * @param {string} [componentType='float'] - The component type.\n\t * @return {string} The type.\n\t */\n\tgetTypeFromLength( length, componentType = 'float' ) {\n\n\t\tif ( length === 1 ) return componentType;\n\n\t\tlet baseType = getTypeFromLength( length );\n\t\tconst prefix = componentType === 'float' ? '' : componentType[ 0 ];\n\n\t\t// fix edge case for mat2x2 being same size as vec4\n\t\tif ( /mat2/.test( componentType ) === true ) {\n\n\t\t\tbaseType = baseType.replace( 'vec', 'mat' );\n\n\t\t}\n\n\t\treturn prefix + baseType;\n\n\t}\n\n\t/**\n\t * Returns the type for a given typed array.\n\t *\n\t * @param {TypedArray} array - The typed array.\n\t * @return {string} The type.\n\t */\n\tgetTypeFromArray( array ) {\n\n\t\treturn typeFromArray.get( array.constructor );\n\n\t}\n\n\t/**\n\t * Returns the type is an integer type.\n\t *\n\t * @param {string} type - The type.\n\t * @return {boolean} Whether the type is an integer type or not.\n\t */\n\tisInteger( type ) {\n\n\t\treturn /int|uint|(i|u)vec/.test( type );\n\n\t}\n\n\t/**\n\t * Returns the type for a given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute.\n\t * @return {string} The type.\n\t */\n\tgetTypeFromAttribute( attribute ) {\n\n\t\tlet dataAttribute = attribute;\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) dataAttribute = attribute.data;\n\n\t\tconst array = dataAttribute.array;\n\t\tconst itemSize = attribute.itemSize;\n\t\tconst normalized = attribute.normalized;\n\n\t\tlet arrayType;\n\n\t\tif ( ! ( attribute instanceof Float16BufferAttribute ) && normalized !== true ) {\n\n\t\t\tarrayType = this.getTypeFromArray( array );\n\n\t\t}\n\n\t\treturn this.getTypeFromLength( itemSize, arrayType );\n\n\t}\n\n\t/**\n\t * Returns the length for the given data type.\n\t *\n\t * @param {string} type - The data type.\n\t * @return {number} The length.\n\t */\n\tgetTypeLength( type ) {\n\n\t\tconst vecType = this.getVectorType( type );\n\t\tconst vecNum = /vec([2-4])/.exec( vecType );\n\n\t\tif ( vecNum !== null ) return Number( vecNum[ 1 ] );\n\t\tif ( vecType === 'float' || vecType === 'bool' || vecType === 'int' || vecType === 'uint' ) return 1;\n\t\tif ( /mat2/.test( type ) === true ) return 4;\n\t\tif ( /mat3/.test( type ) === true ) return 9;\n\t\tif ( /mat4/.test( type ) === true ) return 16;\n\n\t\treturn 0;\n\n\t}\n\n\t/**\n\t * Returns the vector type for a given matrix type.\n\t *\n\t * @param {string} type - The matrix type.\n\t * @return {string} The vector type.\n\t */\n\tgetVectorFromMatrix( type ) {\n\n\t\treturn type.replace( 'mat', 'vec' );\n\n\t}\n\n\t/**\n\t * For a given type this method changes the component type to the\n\t * given value. E.g. `vec4` should be changed to the new component type\n\t * `uint` which results in `uvec4`.\n\t *\n\t * @param {string} type - The type.\n\t * @param {string} newComponentType - The new component type.\n\t * @return {string} The new type.\n\t */\n\tchangeComponentType( type, newComponentType ) {\n\n\t\treturn this.getTypeFromLength( this.getTypeLength( type ), newComponentType );\n\n\t}\n\n\t/**\n\t * Returns the integer type pendant for the given type.\n\t *\n\t * @param {string} type - The type.\n\t * @return {string} The integer type.\n\t */\n\tgetIntegerType( type ) {\n\n\t\tconst componentType = this.getComponentType( type );\n\n\t\tif ( componentType === 'int' || componentType === 'uint' ) return type;\n\n\t\treturn this.changeComponentType( type, 'int' );\n\n\t}\n\n\t/**\n\t * Adds an active stack to the internal stack.\n\t *\n\t * @param {StackNode} stack - The stack node to add.\n\t */\n\tsetActiveStack( stack ) {\n\n\t\tthis.activeStacks.push( stack );\n\n\t}\n\n\t/**\n\t * Removes the active stack from the internal stack.\n\t *\n\t * @param {StackNode} stack - The stack node to remove.\n\t */\n\tremoveActiveStack( stack ) {\n\n\t\tif ( this.activeStacks[ this.activeStacks.length - 1 ] === stack ) {\n\n\t\t\tthis.activeStacks.pop();\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'NodeBuilder: Invalid active stack removal.' );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the active stack.\n\t *\n\t * @return {StackNode} The active stack.\n\t */\n\tgetActiveStack() {\n\n\t\treturn this.activeStacks[ this.activeStacks.length - 1 ];\n\n\t}\n\n\t/**\n\t * Returns the base stack.\n\t *\n\t * @return {StackNode} The base stack.\n\t */\n\tgetBaseStack() {\n\n\t\treturn this.activeStacks[ 0 ];\n\n\t}\n\n\t/**\n\t * Adds a stack node to the internal stack.\n\t *\n\t * @return {StackNode} The added stack node.\n\t */\n\taddStack() {\n\n\t\tthis.stack = stack( this.stack );\n\n\t\tconst previousStack = getCurrentStack();\n\n\t\tthis.stacks.push( previousStack );\n\t\tsetCurrentStack( this.stack );\n\n\t\treturn this.stack;\n\n\t}\n\n\t/**\n\t * Removes the last stack node from the internal stack.\n\t *\n\t * @return {StackNode} The removed stack node.\n\t */\n\tremoveStack() {\n\n\t\tconst lastStack = this.stack;\n\n\t\tfor ( const node of lastStack.nodes ) {\n\n\t\t\tconst nodeData = this.getDataFromNode( node );\n\t\t\tnodeData.stack = lastStack;\n\n\t\t}\n\n\t\tthis.stack = lastStack.parent;\n\n\t\tsetCurrentStack( this.stacks.pop() );\n\n\t\treturn lastStack;\n\n\t}\n\n\t/**\n\t * The builder maintains (cached) data for each node during the building process. This method\n\t * can be used to get these data for a specific shader stage and cache.\n\t *\n\t * @param {Node} node - The node to get the data for.\n\t * @param {('vertex'|'fragment'|'compute'|'any')} [shaderStage=this.shaderStage] - The shader stage.\n\t * @param {?NodeCache} cache - An optional cache.\n\t * @return {Object} The node data.\n\t */\n\tgetDataFromNode( node, shaderStage = this.shaderStage, cache = null ) {\n\n\t\tcache = cache === null ? ( node.isGlobal( this ) ? this.globalCache : this.cache ) : cache;\n\n\t\tlet nodeData = cache.getData( node );\n\n\t\tif ( nodeData === undefined ) {\n\n\t\t\tnodeData = {};\n\n\t\t\tcache.setData( node, nodeData );\n\n\t\t}\n\n\t\tif ( nodeData[ shaderStage ] === undefined ) nodeData[ shaderStage ] = {};\n\n\t\t//\n\n\t\tlet data = nodeData[ shaderStage ];\n\n\t\tconst subBuilds = nodeData.any ? nodeData.any.subBuilds : null;\n\t\tconst subBuild = this.getClosestSubBuild( subBuilds );\n\n\t\tif ( subBuild ) {\n\n\t\t\tif ( data.subBuildsCache === undefined ) data.subBuildsCache = {};\n\n\t\t\tdata = data.subBuildsCache[ subBuild ] || ( data.subBuildsCache[ subBuild ] = {} );\n\t\t\tdata.subBuilds = subBuilds;\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Returns the properties for the given node and shader stage.\n\t *\n\t * Properties are typically used within a build stage to reference a node's\n\t * child node or nodes manually assigned to the properties in a separate build stage.\n\t * A typical usage pattern for defining nodes manually would be assigning dependency nodes\n\t * to the current node's properties in the setup stage and building those properties in the generate stage.\n\t *\n\t * @param {Node} node - The node to get the properties for.\n\t * @param {('vertex'|'fragment'|'compute'|'any')} [shaderStage='any'] - The shader stage.\n\t * @return {Object} The node properties.\n\t */\n\tgetNodeProperties( node, shaderStage = 'any' ) {\n\n\t\tconst nodeData = this.getDataFromNode( node, shaderStage );\n\n\t\treturn nodeData.properties || ( nodeData.properties = { outputNode: null } );\n\n\t}\n\n\t/**\n\t * Returns an instance of {@link NodeAttribute} for the given buffer attribute node.\n\t *\n\t * @param {BufferAttributeNode} node - The buffer attribute node.\n\t * @param {string} type - The node type.\n\t * @return {NodeAttribute} The node attribute.\n\t */\n\tgetBufferAttributeFromNode( node, type ) {\n\n\t\tconst nodeData = this.getDataFromNode( node, 'vertex' );\n\n\t\tlet bufferAttribute = nodeData.bufferAttribute;\n\n\t\tif ( bufferAttribute === undefined ) {\n\n\t\t\tconst index = this.uniforms.index ++;\n\n\t\t\tbufferAttribute = new NodeAttribute( 'nodeAttribute' + index, type, node );\n\n\t\t\tthis.bufferAttributes.push( bufferAttribute );\n\n\t\t\tnodeData.bufferAttribute = bufferAttribute;\n\n\t\t}\n\n\t\treturn bufferAttribute;\n\n\t}\n\n\t/**\n\t * Returns an instance of {@link StructType} for the given struct name and shader stage\n\t * or null if not found.\n\t *\n\t * @param {string} name - The name of the struct.\n\t * @param {('vertex'|'fragment'|'compute'|'any')} [shaderStage=this.shaderStage] - The shader stage.\n\t * @return {?StructType} The struct type or null if not found.\n\t */\n\tgetStructTypeNode( name, shaderStage = this.shaderStage ) {\n\n\t\treturn this.types[ shaderStage ][ name ] || null;\n\n\t}\n\n\t/**\n\t * Returns an instance of {@link StructType} for the given output struct node.\n\t *\n\t * @param {OutputStructNode} node - The output struct node.\n\t * @param {Array<Object>} membersLayout - The output struct types.\n\t * @param {?string} [name=null] - The name of the struct.\n\t * @param {('vertex'|'fragment'|'compute'|'any')} [shaderStage=this.shaderStage] - The shader stage.\n\t * @return {StructType} The struct type attribute.\n\t */\n\tgetStructTypeFromNode( node, membersLayout, name = null, shaderStage = this.shaderStage ) {\n\n\t\tconst nodeData = this.getDataFromNode( node, shaderStage, this.globalCache );\n\n\t\tlet structType = nodeData.structType;\n\n\t\tif ( structType === undefined ) {\n\n\t\t\tconst index = this.structs.index ++;\n\n\t\t\tif ( name === null ) name = 'StructType' + index;\n\n\t\t\tstructType = new StructType( name, membersLayout );\n\n\t\t\tthis.structs[ shaderStage ].push( structType );\n\t\t\tthis.types[ shaderStage ][ name ] = node;\n\n\t\t\tnodeData.structType = structType;\n\n\t\t}\n\n\t\treturn structType;\n\n\t}\n\n\t/**\n\t * Returns an instance of {@link StructType} for the given output struct node.\n\t *\n\t * @param {OutputStructNode} node - The output struct node.\n\t * @param {Array<Object>} membersLayout - The output struct types.\n\t * @return {StructType} The struct type attribute.\n\t */\n\tgetOutputStructTypeFromNode( node, membersLayout ) {\n\n\t\tconst structType = this.getStructTypeFromNode( node, membersLayout, 'OutputType', 'fragment' );\n\t\tstructType.output = true;\n\n\t\treturn structType;\n\n\t}\n\n\t/**\n\t * Returns an instance of {@link NodeUniform} for the given uniform node.\n\t *\n\t * @param {UniformNode} node - The uniform node.\n\t * @param {string} type - The uniform type.\n\t * @param {('vertex'|'fragment'|'compute'|'any')} [shaderStage=this.shaderStage] - The shader stage.\n\t * @param {?string} name - The name of the uniform.\n\t * @return {NodeUniform} The node uniform.\n\t */\n\tgetUniformFromNode( node, type, shaderStage = this.shaderStage, name = null ) {\n\n\t\tconst nodeData = this.getDataFromNode( node, shaderStage, this.globalCache );\n\n\t\tlet nodeUniform = nodeData.uniform;\n\n\t\tif ( nodeUniform === undefined ) {\n\n\t\t\tconst index = this.uniforms.index ++;\n\n\t\t\tnodeUniform = new NodeUniform( name || ( 'nodeUniform' + index ), type, node );\n\n\t\t\tthis.uniforms[ shaderStage ].push( nodeUniform );\n\n\t\t\tthis.registerDeclaration( nodeUniform );\n\n\t\t\tnodeData.uniform = nodeUniform;\n\n\t\t}\n\n\t\treturn nodeUniform;\n\n\t}\n\n\t/**\n\t * Returns an instance of {@link NodeVar} for the given variable node.\n\t *\n\t * @param {VarNode} node - The variable node.\n\t * @param {?string} name - The variable's name.\n\t * @param {string} [type=node.getNodeType( this )] - The variable's type.\n\t * @param {('vertex'|'fragment'|'compute'|'any')} [shaderStage=this.shaderStage] - The shader stage.\n\t * @param {boolean} [readOnly=false] - Whether the variable is read-only or not.\n\t *\n\t * @return {NodeVar} The node variable.\n\t */\n\tgetVarFromNode( node, name = null, type = node.getNodeType( this ), shaderStage = this.shaderStage, readOnly = false ) {\n\n\t\tconst nodeData = this.getDataFromNode( node, shaderStage );\n\t\tconst subBuildVariable = this.getSubBuildProperty( 'variable', nodeData.subBuilds );\n\n\t\tlet nodeVar = nodeData[ subBuildVariable ];\n\n\t\tif ( nodeVar === undefined ) {\n\n\t\t\tconst idNS = readOnly ? '_const' : '_var';\n\n\t\t\tconst vars = this.vars[ shaderStage ] || ( this.vars[ shaderStage ] = [] );\n\t\t\tconst id = this.vars[ idNS ] || ( this.vars[ idNS ] = 0 );\n\n\t\t\tif ( name === null ) {\n\n\t\t\t\tname = ( readOnly ? 'nodeConst' : 'nodeVar' ) + id;\n\n\t\t\t\tthis.vars[ idNS ] ++;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tif ( subBuildVariable !== 'variable' ) {\n\n\t\t\t\tname = this.getSubBuildProperty( name, nodeData.subBuilds );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tconst count = node.getArrayCount( this );\n\n\t\t\tnodeVar = new NodeVar( name, type, readOnly, count );\n\n\t\t\tif ( ! readOnly ) {\n\n\t\t\t\tvars.push( nodeVar );\n\n\t\t\t}\n\n\t\t\tthis.registerDeclaration( nodeVar );\n\n\t\t\tnodeData[ subBuildVariable ] = nodeVar;\n\n\t\t}\n\n\t\treturn nodeVar;\n\n\t}\n\n\t/**\n\t * Returns whether a Node or its flow is deterministic, useful for use in `const`.\n\t *\n\t * @param {Node} node - The varying node.\n\t * @return {boolean} Returns true if deterministic.\n\t */\n\tisDeterministic( node ) {\n\n\t\tif ( node.isMathNode ) {\n\n\t\t\treturn this.isDeterministic( node.aNode ) &&\n\t\t\t\t( node.bNode ? this.isDeterministic( node.bNode ) : true ) &&\n\t\t\t\t( node.cNode ? this.isDeterministic( node.cNode ) : true );\n\n\t\t} else if ( node.isOperatorNode ) {\n\n\t\t\treturn this.isDeterministic( node.aNode ) &&\n\t\t\t\t( node.bNode ? this.isDeterministic( node.bNode ) : true );\n\n\t\t} else if ( node.isArrayNode ) {\n\n\t\t\tif ( node.values !== null ) {\n\n\t\t\t\tfor ( const n of node.values ) {\n\n\t\t\t\t\tif ( ! this.isDeterministic( n ) ) {\n\n\t\t\t\t\t\treturn false;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t} else if ( node.isConstNode ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Returns an instance of {@link NodeVarying} for the given varying node.\n\t *\n\t * @param {(VaryingNode|PropertyNode)} node - The varying node.\n\t * @param {?string} name - The varying's name.\n\t * @param {string} [type=node.getNodeType( this )] - The varying's type.\n\t * @param {?string} interpolationType - The interpolation type of the varying.\n\t * @param {?string} interpolationSampling - The interpolation sampling type of the varying.\n\t * @return {NodeVar} The node varying.\n\t */\n\tgetVaryingFromNode( node, name = null, type = node.getNodeType( this ), interpolationType = null, interpolationSampling = null ) {\n\n\t\tconst nodeData = this.getDataFromNode( node, 'any' );\n\t\tconst subBuildVarying = this.getSubBuildProperty( 'varying', nodeData.subBuilds );\n\n\t\tlet nodeVarying = nodeData[ subBuildVarying ];\n\n\t\tif ( nodeVarying === undefined ) {\n\n\t\t\tconst varyings = this.varyings;\n\t\t\tconst index = varyings.length;\n\n\t\t\tif ( name === null ) name = 'nodeVarying' + index;\n\n\t\t\t//\n\n\t\t\tif ( subBuildVarying !== 'varying' ) {\n\n\t\t\t\tname = this.getSubBuildProperty( name, nodeData.subBuilds );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tnodeVarying = new NodeVarying( name, type, interpolationType, interpolationSampling );\n\n\t\t\tvaryings.push( nodeVarying );\n\n\t\t\tthis.registerDeclaration( nodeVarying );\n\n\t\t\tnodeData[ subBuildVarying ] = nodeVarying;\n\n\t\t}\n\n\t\treturn nodeVarying;\n\n\t}\n\n\t/**\n\t * Registers a node declaration in the current shader stage.\n\t *\n\t * @param {Object} node - The node to be registered.\n\t */\n\tregisterDeclaration( node ) {\n\n\t\tconst shaderStage = this.shaderStage;\n\t\tconst declarations = this.declarations[ shaderStage ] || ( this.declarations[ shaderStage ] = {} );\n\n\t\tconst property = this.getPropertyName( node );\n\n\t\tlet index = 1;\n\t\tlet name = property;\n\n\t\t// Automatically renames the property if the name is already in use.\n\n\t\twhile ( declarations[ name ] !== undefined ) {\n\n\t\t\tname = property + '_' + index ++;\n\n\t\t}\n\n\t\tif ( index > 1 ) {\n\n\t\t\tnode.name = name;\n\n\t\t\twarn( `TSL: Declaration name '${ property }' of '${ node.type }' already in use. Renamed to '${ name }'.` );\n\n\t\t}\n\n\t\tdeclarations[ name ] = node;\n\n\t}\n\n\t/**\n\t * Returns an instance of {@link NodeCode} for the given code node.\n\t *\n\t * @param {CodeNode} node - The code node.\n\t * @param {string} type - The node type.\n\t * @param {('vertex'|'fragment'|'compute'|'any')} [shaderStage=this.shaderStage] - The shader stage.\n\t * @return {NodeCode} The node code.\n\t */\n\tgetCodeFromNode( node, type, shaderStage = this.shaderStage ) {\n\n\t\tconst nodeData = this.getDataFromNode( node );\n\n\t\tlet nodeCode = nodeData.code;\n\n\t\tif ( nodeCode === undefined ) {\n\n\t\t\tconst codes = this.codes[ shaderStage ] || ( this.codes[ shaderStage ] = [] );\n\t\t\tconst index = codes.length;\n\n\t\t\tnodeCode = new NodeCode( 'nodeCode' + index, type );\n\n\t\t\tcodes.push( nodeCode );\n\n\t\t\tnodeData.code = nodeCode;\n\n\t\t}\n\n\t\treturn nodeCode;\n\n\t}\n\n\t/**\n\t * Adds a code flow based on the code-block hierarchy.\n\n\t * This is used so that code-blocks like If,Else create their variables locally if the Node\n\t * is only used inside one of these conditionals in the current shader stage.\n\t *\n\t * @param {Node} node - The node to add.\n\t * @param {Node} nodeBlock - Node-based code-block. Usually 'ConditionalNode'.\n\t */\n\taddFlowCodeHierarchy( node, nodeBlock ) {\n\n\t\tconst { flowCodes, flowCodeBlock } = this.getDataFromNode( node );\n\n\t\tlet needsFlowCode = true;\n\t\tlet nodeBlockHierarchy = nodeBlock;\n\n\t\twhile ( nodeBlockHierarchy ) {\n\n\t\t\tif ( flowCodeBlock.get( nodeBlockHierarchy ) === true ) {\n\n\t\t\t\tneedsFlowCode = false;\n\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tnodeBlockHierarchy = this.getDataFromNode( nodeBlockHierarchy ).parentNodeBlock;\n\n\t\t}\n\n\t\tif ( needsFlowCode ) {\n\n\t\t\tfor ( const flowCode of flowCodes ) {\n\n\t\t\t\tthis.addLineFlowCode( flowCode );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Add a inline-code to the current flow code-block.\n\t *\n\t * @param {Node} node - The node to add.\n\t * @param {string} code - The code to add.\n\t * @param {Node} nodeBlock - Current ConditionalNode\n\t */\n\taddLineFlowCodeBlock( node, code, nodeBlock ) {\n\n\t\tconst nodeData = this.getDataFromNode( node );\n\t\tconst flowCodes = nodeData.flowCodes || ( nodeData.flowCodes = [] );\n\t\tconst codeBlock = nodeData.flowCodeBlock || ( nodeData.flowCodeBlock = new WeakMap() );\n\n\t\tflowCodes.push( code );\n\t\tcodeBlock.set( nodeBlock, true );\n\n\t}\n\n\t/**\n\t * Add a inline-code to the current flow.\n\t *\n\t * @param {string} code - The code to add.\n\t * @param {?Node} [node= null] - Optional Node, can help the system understand if the Node is part of a code-block.\n\t * @return {NodeBuilder} A reference to this node builder.\n\t */\n\taddLineFlowCode( code, node = null ) {\n\n\t\tif ( code === '' ) return this;\n\n\t\tif ( node !== null && this.context.nodeBlock ) {\n\n\t\t\tthis.addLineFlowCodeBlock( node, code, this.context.nodeBlock );\n\n\t\t}\n\n\t\tcode = this.tab + code;\n\n\t\tif ( ! /;\\s*$/.test( code ) ) {\n\n\t\t\tcode = code + ';\\n';\n\n\t\t}\n\n\t\tthis.flow.code += code;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Adds a code to the current code flow.\n\t *\n\t * @param {string} code - Shader code.\n\t * @return {NodeBuilder} A reference to this node builder.\n\t */\n\taddFlowCode( code ) {\n\n\t\tthis.flow.code += code;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Add tab in the code that will be generated so that other snippets respect the current tabulation.\n\t * Typically used in codes with If,Else.\n\t *\n\t * @return {NodeBuilder} A reference to this node builder.\n\t */\n\taddFlowTab() {\n\n\t\tthis.tab += '\\t';\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes a tab.\n\t *\n\t * @return {NodeBuilder} A reference to this node builder.\n\t */\n\tremoveFlowTab() {\n\n\t\tthis.tab = this.tab.slice( 0, -1 );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Gets the current flow data based on a Node.\n\t *\n\t * @param {Node} node - Node that the flow was started.\n\t * @param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage.\n\t * @return {Object} The flow data.\n\t */\n\tgetFlowData( node/*, shaderStage*/ ) {\n\n\t\treturn this.flowsData.get( node );\n\n\t}\n\n\t/**\n\t * Executes the node flow based on a root node to generate the final shader code.\n\t *\n\t * @param {Node} node - The node to execute.\n\t * @return {Object} The code flow.\n\t */\n\tflowNode( node ) {\n\n\t\tconst output = node.getNodeType( this );\n\n\t\tconst flowData = this.flowChildNode( node, output );\n\n\t\tthis.flowsData.set( node, flowData );\n\n\t\treturn flowData;\n\n\t}\n\n\t/**\n\t * Includes a node in the current function node.\n\t *\n\t * @param {Node} node - The node to include.\n\t * @returns {void}\n\t */\n\taddInclude( node ) {\n\n\t\tif ( this.currentFunctionNode !== null ) {\n\n\t\t\tthis.currentFunctionNode.includes.push( node );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the native shader operator name for a given generic name.\n\t * It is a similar type of method like {@link NodeBuilder#getMethod}.\n\t *\n\t * @param {ShaderNodeInternal} shaderNode - The shader node to build the function node with.\n\t * @return {FunctionNode} The build function node.\n\t */\n\tbuildFunctionNode( shaderNode ) {\n\n\t\tconst fn = new FunctionNode();\n\n\t\tconst previous = this.currentFunctionNode;\n\n\t\tthis.currentFunctionNode = fn;\n\n\t\tfn.code = this.buildFunctionCode( shaderNode );\n\n\t\tthis.currentFunctionNode = previous;\n\n\t\treturn fn;\n\n\t}\n\n\t/**\n\t * Generates a code flow based on a TSL function: Fn().\n\t *\n\t * @param {ShaderNodeInternal} shaderNode - A function code will be generated based on the input.\n\t * @return {Object}\n\t */\n\tflowShaderNode( shaderNode ) {\n\n\t\tconst layout = shaderNode.layout;\n\n\t\tconst inputs = {\n\t\t\t[ Symbol.iterator ]() {\n\n\t\t\t\tlet index = 0;\n\t\t\t\tconst values = Object.values( this );\n\t\t\t\treturn {\n\t\t\t\t\tnext: () => ( {\n\t\t\t\t\t\tvalue: values[ index ],\n\t\t\t\t\t\tdone: index ++ >= values.length\n\t\t\t\t\t} )\n\t\t\t\t};\n\n\t\t\t}\n\t\t};\n\n\t\tfor ( const input of layout.inputs ) {\n\n\t\t\tinputs[ input.name ] = new ParameterNode( input.type, input.name );\n\n\t\t}\n\n\t\t//\n\n\t\tshaderNode.layout = null;\n\n\t\tconst callNode = shaderNode.call( inputs );\n\t\tconst flowData = this.flowStagesNode( callNode, layout.type );\n\n\t\tshaderNode.layout = layout;\n\n\t\treturn flowData;\n\n\t}\n\n\t/**\n\t * Executes the node in a specific build stage.\n\t *\n\t * This function can be used to arbitrarily execute the specified build stage\n\t * outside of the standard build process. For instance, if a node's type depends\n\t * on properties created by the 'setup' stage, then flowBuildStage(node, 'setup')\n\t * can be used to execute the setup build stage and access its generated nodes\n\t * before the standard build process begins.\n\t *\n\t * @param {Node} node - The node to execute.\n\t * @param {string} buildStage - The build stage to execute the node in.\n\t * @param {?(Node|string)} [output=null] - Expected output type. For example 'vec3'.\n\t * @return {?(Node|string)} The result of the node build.\n\t */\n\tflowBuildStage( node, buildStage, output = null ) {\n\n\t\tconst previousBuildStage = this.getBuildStage();\n\n\t\tthis.setBuildStage( buildStage );\n\n\t\tconst result = node.build( this, output );\n\n\t\tthis.setBuildStage( previousBuildStage );\n\n\t\treturn result;\n\n\t}\n\n\t/**\n\t * Runs the node flow through all the steps of creation, 'setup', 'analyze', 'generate'.\n\t *\n\t * @param {Node} node - The node to execute.\n\t * @param {?string} output - Expected output type. For example 'vec3'.\n\t * @return {Object}\n\t */\n\tflowStagesNode( node, output = null ) {\n\n\t\tconst previousFlow = this.flow;\n\t\tconst previousVars = this.vars;\n\t\tconst previousDeclarations = this.declarations;\n\t\tconst previousCache = this.cache;\n\t\tconst previousBuildStage = this.buildStage;\n\t\tconst previousStack = this.stack;\n\n\t\tconst flow = {\n\t\t\tcode: ''\n\t\t};\n\n\t\tthis.flow = flow;\n\t\tthis.vars = {};\n\t\tthis.declarations = {};\n\t\tthis.cache = new NodeCache();\n\t\tthis.stack = stack();\n\n\t\tfor ( const buildStage of defaultBuildStages ) {\n\n\t\t\tthis.setBuildStage( buildStage );\n\n\t\t\tflow.result = node.build( this, output );\n\n\t\t}\n\n\t\tflow.vars = this.getVars( this.shaderStage );\n\n\t\tthis.flow = previousFlow;\n\t\tthis.vars = previousVars;\n\t\tthis.declarations = previousDeclarations;\n\t\tthis.cache = previousCache;\n\t\tthis.stack = previousStack;\n\n\t\tthis.setBuildStage( previousBuildStage );\n\n\t\treturn flow;\n\n\t}\n\n\t/**\n\t * Returns the native shader operator name for a given generic name.\n\t * It is a similar type of method like {@link NodeBuilder#getMethod}.\n\t *\n\t * @abstract\n\t * @param {string} op - The operator name to resolve.\n\t * @return {?string} The resolved operator name.\n\t */\n\tgetFunctionOperator( /* op */ ) {\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Builds the given shader node.\n\t *\n\t * @abstract\n\t * @param {ShaderNodeInternal} shaderNode - The shader node.\n\t * @return {string} The function code.\n\t */\n\tbuildFunctionCode( /* shaderNode */ ) {\n\n\t\twarn( 'Abstract function.' );\n\n\t}\n\n\t/**\n\t * Generates a code flow based on a child Node.\n\t *\n\t * @param {Node} node - The node to execute.\n\t * @param {?string} output - Expected output type. For example 'vec3'.\n\t * @return {Object} The code flow.\n\t */\n\tflowChildNode( node, output = null ) {\n\n\t\tconst previousFlow = this.flow;\n\n\t\tconst flow = {\n\t\t\tcode: ''\n\t\t};\n\n\t\tthis.flow = flow;\n\n\t\tflow.result = node.build( this, output );\n\n\t\tthis.flow = previousFlow;\n\n\t\treturn flow;\n\n\t}\n\n\t/**\n\t * Executes a flow of code in a different stage.\n\t *\n\t * Some nodes like `varying()` have the ability to compute code in vertex-stage and\n\t * return the value in fragment-stage even if it is being executed in an input fragment.\n\t *\n\t * @param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage.\n\t * @param {Node} node - The node to execute.\n\t * @param {?string} output - Expected output type. For example 'vec3'.\n\t * @param {?string} propertyName - The property name to assign the result.\n\t * @return {?(Object|Node)} The code flow or node.build() result.\n\t */\n\tflowNodeFromShaderStage( shaderStage, node, output = null, propertyName = null ) {\n\n\t\tconst previousTab = this.tab;\n\t\tconst previousCache = this.cache;\n\t\tconst previousShaderStage = this.shaderStage;\n\t\tconst previousContext = this.context;\n\n\t\tthis.setShaderStage( shaderStage );\n\n\t\tconst context = { ...this.context };\n\t\tdelete context.nodeBlock;\n\n\t\tthis.cache = this.globalCache;\n\t\tthis.tab = '\\t';\n\t\tthis.context = context;\n\n\t\tlet result = null;\n\n\t\tif ( this.buildStage === 'generate' ) {\n\n\t\t\tconst flowData = this.flowChildNode( node, output );\n\n\t\t\tif ( propertyName !== null ) {\n\n\t\t\t\tflowData.code += `${ this.tab + propertyName } = ${ flowData.result };\\n`;\n\n\t\t\t}\n\n\t\t\tthis.flowCode[ shaderStage ] = this.flowCode[ shaderStage ] + flowData.code;\n\n\t\t\tresult = flowData;\n\n\t\t} else {\n\n\t\t\tresult = node.build( this );\n\n\t\t}\n\n\t\tthis.setShaderStage( previousShaderStage );\n\n\t\tthis.cache = previousCache;\n\t\tthis.tab = previousTab;\n\t\tthis.context = previousContext;\n\n\t\treturn result;\n\n\t}\n\n\t/**\n\t * Returns an array holding all node attributes of this node builder.\n\t *\n\t * @return {Array<NodeAttribute>} The node attributes of this builder.\n\t */\n\tgetAttributesArray() {\n\n\t\treturn this.attributes.concat( this.bufferAttributes );\n\n\t}\n\n\t/**\n\t * Returns the attribute definitions as a shader string for the given shader stage.\n\t *\n\t * @abstract\n\t * @param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage.\n\t * @return {string} The attribute code section.\n\t */\n\tgetAttributes( /*shaderStage*/ ) {\n\n\t\twarn( 'Abstract function.' );\n\n\t}\n\n\t/**\n\t * Returns the varying definitions as a shader string for the given shader stage.\n\t *\n\t * @abstract\n\t * @param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage.\n\t * @return {string} The varying code section.\n\t */\n\tgetVaryings( /*shaderStage*/ ) {\n\n\t\twarn( 'Abstract function.' );\n\n\t}\n\n\t/**\n\t * Returns a single variable definition as a shader string for the given variable type and name.\n\t *\n\t * @param {string} type - The variable's type.\n\t * @param {string} name - The variable's name.\n\t * @param {?number} [count=null] - The array length.\n\t * @return {string} The shader string.\n\t */\n\tgetVar( type, name, count = null ) {\n\n\t\treturn `${ count !== null ? this.generateArrayDeclaration( type, count ) : this.getType( type ) } ${ name }`;\n\n\t}\n\n\t/**\n\t * Returns the variable definitions as a shader string for the given shader stage.\n\t *\n\t * @param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage.\n\t * @return {string} The variable code section.\n\t */\n\tgetVars( shaderStage ) {\n\n\t\tlet snippet = '';\n\n\t\tconst vars = this.vars[ shaderStage ];\n\n\t\tif ( vars !== undefined ) {\n\n\t\t\tfor ( const variable of vars ) {\n\n\t\t\t\tsnippet += `${ this.getVar( variable.type, variable.name ) }; `;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn snippet;\n\n\t}\n\n\t/**\n\t * Returns the uniform definitions as a shader string for the given shader stage.\n\t *\n\t * @abstract\n\t * @param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage.\n\t * @return {string} The uniform code section.\n\t */\n\tgetUniforms( /*shaderStage*/ ) {\n\n\t\twarn( 'Abstract function.' );\n\n\t}\n\n\t/**\n\t * Returns the native code definitions as a shader string for the given shader stage.\n\t *\n\t * @param {('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage.\n\t * @return {string} The native code section.\n\t */\n\tgetCodes( shaderStage ) {\n\n\t\tconst codes = this.codes[ shaderStage ];\n\n\t\tlet code = '';\n\n\t\tif ( codes !== undefined ) {\n\n\t\t\tfor ( const nodeCode of codes ) {\n\n\t\t\t\tcode += nodeCode.code + '\\n';\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn code;\n\n\t}\n\n\t/**\n\t * Returns the hash of this node builder.\n\t *\n\t * @return {string} The hash.\n\t */\n\tgetHash() {\n\n\t\treturn this.vertexShader + this.fragmentShader + this.computeShader;\n\n\t}\n\n\t/**\n\t * Sets the current shader stage.\n\t *\n\t * @param {?('vertex'|'fragment'|'compute'|'any')} shaderStage - The shader stage to set.\n\t */\n\tsetShaderStage( shaderStage ) {\n\n\t\tthis.shaderStage = shaderStage;\n\n\t}\n\n\t/**\n\t * Returns the current shader stage.\n\t *\n\t * @return {?('vertex'|'fragment'|'compute'|'any')} The current shader stage.\n\t */\n\tgetShaderStage() {\n\n\t\treturn this.shaderStage;\n\n\t}\n\n\t/**\n\t * Sets the current build stage.\n\t *\n\t * @param {?('setup'|'analyze'|'generate')} buildStage - The build stage to set.\n\t */\n\tsetBuildStage( buildStage ) {\n\n\t\tthis.buildStage = buildStage;\n\n\t}\n\n\t/**\n\t * Returns the current build stage.\n\t *\n\t * @return {?('setup'|'analyze'|'generate')} The current build stage.\n\t */\n\tgetBuildStage() {\n\n\t\treturn this.buildStage;\n\n\t}\n\n\t/**\n\t * Controls the code build of the shader stages.\n\t *\n\t * @abstract\n\t */\n\tbuildCode() {\n\n\t\twarn( 'Abstract function.' );\n\n\t}\n\n\t/**\n\t * Returns the current sub-build layer.\n\t *\n\t * @return {SubBuildNode} The current sub-build layers.\n\t */\n\tget subBuild() {\n\n\t\treturn this.subBuildLayers[ this.subBuildLayers.length - 1 ] || null;\n\n\t}\n\n\t/**\n\t * Adds a sub-build layer to the node builder.\n\t *\n\t * @param {SubBuildNode} subBuild - The sub-build layer to add.\n\t */\n\taddSubBuild( subBuild ) {\n\n\t\tthis.subBuildLayers.push( subBuild );\n\n\t}\n\n\t/**\n\t * Removes the last sub-build layer from the node builder.\n\t *\n\t * @return {SubBuildNode} The removed sub-build layer.\n\t */\n\tremoveSubBuild() {\n\n\t\treturn this.subBuildLayers.pop();\n\n\t}\n\n\t/**\n\t * Returns the closest sub-build layer for the given data.\n\t *\n\t * @param {Node|Set<string>|Array<string>} data - The data to get the closest sub-build layer from.\n\t * @return {?string} The closest sub-build name or null if none found.\n\t */\n\tgetClosestSubBuild( data ) {\n\n\t\tlet subBuilds;\n\n\t\tif ( data && data.isNode ) {\n\n\t\t\tif ( data.isShaderCallNodeInternal ) {\n\n\t\t\t\tsubBuilds = data.shaderNode.subBuilds;\n\n\t\t\t} else if ( data.isStackNode ) {\n\n\t\t\t\tsubBuilds = [ data.subBuild ];\n\n\t\t\t} else {\n\n\t\t\t\tsubBuilds = this.getDataFromNode( data, 'any' ).subBuilds;\n\n\t\t\t}\n\n\t\t} else if ( data instanceof Set ) {\n\n\t\t\tsubBuilds = [ ...data ];\n\n\t\t} else {\n\n\t\t\tsubBuilds = data;\n\n\t\t}\n\n\t\tif ( ! subBuilds ) return null;\n\n\t\tconst subBuildLayers = this.subBuildLayers;\n\n\t\tfor ( let i = subBuilds.length - 1; i >= 0; i -- ) {\n\n\t\t\tconst subBuild = subBuilds[ i ];\n\n\t\t\tif ( subBuildLayers.includes( subBuild ) ) {\n\n\t\t\t\treturn subBuild;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\n\t/**\n\t * Returns the output node of a sub-build layer.\n\t *\n\t * @param {Node} node - The node to get the output from.\n\t * @return {string} The output node name.\n\t */\n\tgetSubBuildOutput( node ) {\n\n\t\treturn this.getSubBuildProperty( 'outputNode', node );\n\n\t}\n\n\t/**\n\t * Returns the sub-build property name for the given property and node.\n\t *\n\t * @param {string} [property=''] - The property name.\n\t * @param {?Node} [node=null] - The node to get the sub-build from.\n\t * @return {string} The sub-build property name.\n\t */\n\tgetSubBuildProperty( property = '', node = null ) {\n\n\t\tlet subBuild;\n\n\t\tif ( node !== null ) {\n\n\t\t\tsubBuild = this.getClosestSubBuild( node );\n\n\t\t} else {\n\n\t\t\tsubBuild = this.subBuildFn;\n\n\t\t}\n\n\t\tlet result;\n\n\t\tif ( subBuild ) {\n\n\t\t\tresult = property ? ( subBuild + '_' + property ) : subBuild;\n\n\t\t} else {\n\n\t\t\tresult = property;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\t/**\n\t * Central build method which controls the build for the given object.\n\t *\n\t * @return {NodeBuilder} A reference to this node builder.\n\t */\n\tbuild() {\n\n\t\tconst { object, material, renderer } = this;\n\n\t\tif ( material !== null ) {\n\n\t\t\tlet nodeMaterial = renderer.library.fromMaterial( material );\n\n\t\t\tif ( nodeMaterial === null ) {\n\n\t\t\t\terror( `NodeMaterial: Material \"${ material.type }\" is not compatible.` );\n\n\t\t\t\tnodeMaterial = new NodeMaterial();\n\n\t\t\t}\n\n\t\t\tnodeMaterial.build( this );\n\n\t\t} else {\n\n\t\t\tthis.addFlow( 'compute', object );\n\n\t\t}\n\n\t\t// setup() -> stage 1: create possible new nodes and/or return an output reference node\n\t\t// analyze()   -> stage 2: analyze nodes to possible optimization and validation\n\t\t// generate()  -> stage 3: generate shader\n\n\t\tfor ( const buildStage of defaultBuildStages ) {\n\n\t\t\tthis.setBuildStage( buildStage );\n\n\t\t\tif ( this.context.vertex && this.context.vertex.isNode ) {\n\n\t\t\t\tthis.flowNodeFromShaderStage( 'vertex', this.context.vertex );\n\n\t\t\t}\n\n\t\t\tfor ( const shaderStage of shaderStages ) {\n\n\t\t\t\tthis.setShaderStage( shaderStage );\n\n\t\t\t\tconst flowNodes = this.flowNodes[ shaderStage ];\n\n\t\t\t\tfor ( const node of flowNodes ) {\n\n\t\t\t\t\tif ( buildStage === 'generate' ) {\n\n\t\t\t\t\t\tthis.flowNode( node );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tnode.build( this );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setBuildStage( null );\n\t\tthis.setShaderStage( null );\n\n\t\t// stage 4: build code for a specific output\n\n\t\tthis.buildCode();\n\t\tthis.buildUpdateNodes();\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns shared data object for the given node.\n\t *\n\t * @param {Node} node - The node to get shared data from.\n\t * @return {Object} The shared data.\n\t */\n\tgetSharedDataFromNode( node ) {\n\n\t\tlet data = sharedNodeData.get( node );\n\n\t\tif ( data === undefined ) {\n\n\t\t\tdata = {};\n\n\t\t}\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Returns a uniform representation which is later used for UBO generation and rendering.\n\t *\n\t * @param {NodeUniform} uniformNode - The uniform node.\n\t * @param {string} type - The requested type.\n\t * @return {Uniform} The uniform.\n\t */\n\tgetNodeUniform( uniformNode, type ) {\n\n\t\tconst nodeData = this.getSharedDataFromNode( uniformNode );\n\n\t\tlet node = nodeData.cache;\n\n\t\tif ( node === undefined ) {\n\n\t\t\tif ( type === 'float' || type === 'int' || type === 'uint' ) node = new NumberNodeUniform( uniformNode );\n\t\t\telse if ( type === 'vec2' || type === 'ivec2' || type === 'uvec2' ) node = new Vector2NodeUniform( uniformNode );\n\t\t\telse if ( type === 'vec3' || type === 'ivec3' || type === 'uvec3' ) node = new Vector3NodeUniform( uniformNode );\n\t\t\telse if ( type === 'vec4' || type === 'ivec4' || type === 'uvec4' ) node = new Vector4NodeUniform( uniformNode );\n\t\t\telse if ( type === 'color' ) node = new ColorNodeUniform( uniformNode );\n\t\t\telse if ( type === 'mat2' ) node = new Matrix2NodeUniform( uniformNode );\n\t\t\telse if ( type === 'mat3' ) node = new Matrix3NodeUniform( uniformNode );\n\t\t\telse if ( type === 'mat4' ) node = new Matrix4NodeUniform( uniformNode );\n\t\t\telse {\n\n\t\t\t\tthrow new Error( `Uniform \"${ type }\" not implemented.` );\n\n\t\t\t}\n\n\t\t\tnodeData.cache = node;\n\n\t\t}\n\n\t\treturn node;\n\n\t}\n\n\t/**\n\t * Formats the given shader snippet from a given type into another one. E.g.\n\t * this method might be used to convert a simple float string `\"1.0\"` into a\n\t * `vec3` representation: `\"vec3<f32>( 1.0 )\"`.\n\t *\n\t * @param {string} snippet - The shader snippet.\n\t * @param {string} fromType - The source type.\n\t * @param {string} toType - The target type.\n\t * @return {string} The updated shader string.\n\t */\n\tformat( snippet, fromType, toType ) {\n\n\t\tfromType = this.getVectorType( fromType );\n\t\ttoType = this.getVectorType( toType );\n\n\t\tif ( fromType === toType || toType === null || this.isReference( toType ) ) {\n\n\t\t\treturn snippet;\n\n\t\t}\n\n\t\tconst fromTypeLength = this.getTypeLength( fromType );\n\t\tconst toTypeLength = this.getTypeLength( toType );\n\n\t\tif ( fromTypeLength === 16 && toTypeLength === 9 ) {\n\n\t\t\treturn `${ this.getType( toType ) }( ${ snippet }[ 0 ].xyz, ${ snippet }[ 1 ].xyz, ${ snippet }[ 2 ].xyz )`;\n\n\t\t}\n\n\t\tif ( fromTypeLength === 9 && toTypeLength === 4 ) {\n\n\t\t\treturn `${ this.getType( toType ) }( ${ snippet }[ 0 ].xy, ${ snippet }[ 1 ].xy )`;\n\n\t\t}\n\n\n\t\tif ( fromTypeLength > 4 ) { // fromType is matrix-like\n\n\t\t\t// @TODO: ignore for now\n\n\t\t\treturn snippet;\n\n\t\t}\n\n\t\tif ( toTypeLength > 4 || toTypeLength === 0 ) { // toType is matrix-like or unknown\n\n\t\t\t// @TODO: ignore for now\n\n\t\t\treturn snippet;\n\n\t\t}\n\n\t\tif ( fromTypeLength === toTypeLength ) {\n\n\t\t\treturn `${ this.getType( toType ) }( ${ snippet } )`;\n\n\t\t}\n\n\t\tif ( fromTypeLength > toTypeLength ) {\n\n\t\t\tsnippet = toType === 'bool' ? `all( ${ snippet } )` : `${ snippet }.${ 'xyz'.slice( 0, toTypeLength ) }`;\n\n\t\t\treturn this.format( snippet, this.getTypeFromLength( toTypeLength, this.getComponentType( fromType ) ), toType );\n\n\t\t}\n\n\t\tif ( toTypeLength === 4 && fromTypeLength > 1 ) { // toType is vec4-like\n\n\t\t\treturn `${ this.getType( toType ) }( ${ this.format( snippet, fromType, 'vec3' ) }, 1.0 )`;\n\n\t\t}\n\n\t\tif ( fromTypeLength === 2 ) { // fromType is vec2-like and toType is vec3-like\n\n\t\t\treturn `${ this.getType( toType ) }( ${ this.format( snippet, fromType, 'vec2' ) }, 0.0 )`;\n\n\t\t}\n\n\t\tif ( fromTypeLength === 1 && toTypeLength > 1 && fromType !== this.getComponentType( toType ) ) { // fromType is float-like\n\n\t\t\t// convert a number value to vector type, e.g:\n\t\t\t// vec3( 1u ) -> vec3( float( 1u ) )\n\n\t\t\tsnippet = `${ this.getType( this.getComponentType( toType ) ) }( ${ snippet } )`;\n\n\t\t}\n\n\t\treturn `${ this.getType( toType ) }( ${ snippet } )`; // fromType is float-like\n\n\t}\n\n\t/**\n\t * Returns a signature with the engine's current revision.\n\t *\n\t * @return {string} The signature.\n\t */\n\tgetSignature() {\n\n\t\treturn `// Three.js r${ REVISION } - Node System\\n`;\n\n\t}\n\n}\n\n/**\n * Management class for updating nodes. The module tracks metrics like\n * the elapsed time, delta time, the render and frame ID to correctly\n * call the node update methods {@link Node#updateBefore}, {@link Node#update}\n * and {@link Node#updateAfter} depending on the node's configuration.\n */\nclass NodeFrame {\n\n\t/**\n\t * Constructs a new node fame.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * The elapsed time in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.time = 0;\n\n\t\t/**\n\t\t * The delta time in seconds.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.deltaTime = 0;\n\n\t\t/**\n\t\t * The frame ID.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.frameId = 0;\n\n\t\t/**\n\t\t * The render ID.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.renderId = 0;\n\n\t\t/**\n\t\t * Used to control the {@link Node#update} call.\n\t\t *\n\t\t * @type {WeakMap<Node, Object>}\n\t\t */\n\t\tthis.updateMap = new WeakMap();\n\n\t\t/**\n\t\t * Used to control the {@link Node#updateBefore} call.\n\t\t *\n\t\t * @type {WeakMap<Node, Object>}\n\t\t */\n\t\tthis.updateBeforeMap = new WeakMap();\n\n\t\t/**\n\t\t * Used to control the {@link Node#updateAfter} call.\n\t\t *\n\t\t * @type {WeakMap<Node, Object>}\n\t\t */\n\t\tthis.updateAfterMap = new WeakMap();\n\n\t\t/**\n\t\t * A reference to the current renderer.\n\t\t *\n\t\t * @type {?Renderer}\n\t\t * @default null\n\t\t */\n\t\tthis.renderer = null;\n\n\t\t/**\n\t\t * A reference to the current material.\n\t\t *\n\t\t * @type {?Material}\n\t\t * @default null\n\t\t */\n\t\tthis.material = null;\n\n\t\t/**\n\t\t * A reference to the current camera.\n\t\t *\n\t\t * @type {?Camera}\n\t\t * @default null\n\t\t */\n\t\tthis.camera = null;\n\n\t\t/**\n\t\t * A reference to the current 3D object.\n\t\t *\n\t\t * @type {?Object3D}\n\t\t * @default null\n\t\t */\n\t\tthis.object = null;\n\n\t\t/**\n\t\t * A reference to the current scene.\n\t\t *\n\t\t * @type {?Scene}\n\t\t * @default null\n\t\t */\n\t\tthis.scene = null;\n\n\t}\n\n\t/**\n\t * Returns a dictionary for a given node and update map which\n\t * is used to correctly call node update methods per frame or render.\n\t *\n\t * @private\n\t * @param {WeakMap<Node, Object>} referenceMap - The reference weak map.\n\t * @param {Node} nodeRef - The reference to the current node.\n\t * @return {Object<string,WeakMap<Object, number>>} The dictionary.\n\t */\n\t_getMaps( referenceMap, nodeRef ) {\n\n\t\tlet maps = referenceMap.get( nodeRef );\n\n\t\tif ( maps === undefined ) {\n\n\t\t\tmaps = {\n\t\t\t\trenderId: 0,\n\t\t\t\tframeId: 0,\n\t\t\t};\n\n\t\t\treferenceMap.set( nodeRef, maps );\n\n\t\t}\n\n\t\treturn maps;\n\n\t}\n\n\t/**\n\t * This method executes the {@link Node#updateBefore} for the given node.\n\t * It makes sure {@link Node#updateBeforeType} is honored meaning the update\n\t * is only executed once per frame, render or object depending on the update\n\t * type.\n\t *\n\t * @param {Node} node - The node that should be updated.\n\t */\n\tupdateBeforeNode( node ) {\n\n\t\tconst updateType = node.getUpdateBeforeType();\n\t\tconst reference = node.updateReference( this );\n\n\t\tif ( updateType === NodeUpdateType.FRAME ) {\n\n\t\t\tconst nodeUpdateBeforeMap = this._getMaps( this.updateBeforeMap, reference );\n\n\t\t\tif ( nodeUpdateBeforeMap.frameId !== this.frameId ) {\n\n\t\t\t\tconst previousFrameId = nodeUpdateBeforeMap.frameId;\n\n\t\t\t\tnodeUpdateBeforeMap.frameId = this.frameId;\n\n\t\t\t\tif ( node.updateBefore( this ) === false ) {\n\n\t\t\t\t\tnodeUpdateBeforeMap.frameId = previousFrameId;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( updateType === NodeUpdateType.RENDER ) {\n\n\t\t\tconst nodeUpdateBeforeMap = this._getMaps( this.updateBeforeMap, reference );\n\n\t\t\tif ( nodeUpdateBeforeMap.renderId !== this.renderId ) {\n\n\t\t\t\tconst previousRenderId = nodeUpdateBeforeMap.renderId;\n\n\t\t\t\tnodeUpdateBeforeMap.renderId = this.renderId;\n\n\t\t\t\tif ( node.updateBefore( this ) === false ) {\n\n\t\t\t\t\tnodeUpdateBeforeMap.renderId = previousRenderId;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( updateType === NodeUpdateType.OBJECT ) {\n\n\t\t\tnode.updateBefore( this );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * This method executes the {@link Node#updateAfter} for the given node.\n\t * It makes sure {@link Node#updateAfterType} is honored meaning the update\n\t * is only executed once per frame, render or object depending on the update\n\t * type.\n\t *\n\t * @param {Node} node - The node that should be updated.\n\t */\n\tupdateAfterNode( node ) {\n\n\t\tconst updateType = node.getUpdateAfterType();\n\t\tconst reference = node.updateReference( this );\n\n\t\tif ( updateType === NodeUpdateType.FRAME ) {\n\n\t\t\tconst nodeUpdateAfterMap = this._getMaps( this.updateAfterMap, reference );\n\n\t\t\tif ( nodeUpdateAfterMap.frameId !== this.frameId ) {\n\n\t\t\t\tif ( node.updateAfter( this ) !== false ) {\n\n\t\t\t\t\tnodeUpdateAfterMap.frameId = this.frameId;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( updateType === NodeUpdateType.RENDER ) {\n\n\t\t\tconst nodeUpdateAfterMap = this._getMaps( this.updateAfterMap, reference );\n\n\t\t\tif ( nodeUpdateAfterMap.renderId !== this.renderId ) {\n\n\t\t\t\tif ( node.updateAfter( this ) !== false ) {\n\n\t\t\t\t\tnodeUpdateAfterMap.renderId = this.renderId;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( updateType === NodeUpdateType.OBJECT ) {\n\n\t\t\tnode.updateAfter( this );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * This method executes the {@link Node#update} for the given node.\n\t * It makes sure {@link Node#updateType} is honored meaning the update\n\t * is only executed once per frame, render or object depending on the update\n\t * type.\n\t *\n\t * @param {Node} node - The node that should be updated.\n\t */\n\tupdateNode( node ) {\n\n\t\tconst updateType = node.getUpdateType();\n\t\tconst reference = node.updateReference( this );\n\n\t\tif ( updateType === NodeUpdateType.FRAME ) {\n\n\t\t\tconst nodeUpdateMap = this._getMaps( this.updateMap, reference );\n\n\t\t\tif ( nodeUpdateMap.frameId !== this.frameId ) {\n\n\t\t\t\tif ( node.update( this ) !== false ) {\n\n\t\t\t\t\tnodeUpdateMap.frameId = this.frameId;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( updateType === NodeUpdateType.RENDER ) {\n\n\t\t\tconst nodeUpdateMap = this._getMaps( this.updateMap, reference );\n\n\t\t\tif ( nodeUpdateMap.renderId !== this.renderId ) {\n\n\t\t\t\tif ( node.update( this ) !== false ) {\n\n\t\t\t\t\tnodeUpdateMap.renderId = this.renderId;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( updateType === NodeUpdateType.OBJECT ) {\n\n\t\t\tnode.update( this );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the internal state of the node frame. This method is\n\t * called by the renderer in its internal animation loop.\n\t */\n\tupdate() {\n\n\t\tthis.frameId ++;\n\n\t\tif ( this.lastTime === undefined ) this.lastTime = performance.now();\n\n\t\tthis.deltaTime = ( performance.now() - this.lastTime ) / 1000;\n\n\t\tthis.lastTime = performance.now();\n\n\t\tthis.time += this.deltaTime;\n\n\t}\n\n}\n\n/**\n * Describes the input of a {@link NodeFunction}.\n */\nclass NodeFunctionInput {\n\n\t/**\n\t * Constructs a new node function input.\n\t *\n\t * @param {string} type - The input type.\n\t * @param {string} name - The input name.\n\t * @param {?number} [count=null] - If the input is an Array, count will be the length.\n\t * @param {('in'|'out'|'inout')} [qualifier=''] - The parameter qualifier (only relevant for GLSL).\n\t * @param {boolean} [isConst=false] - Whether the input uses a const qualifier or not (only relevant for GLSL).\n\t */\n\tconstructor( type, name, count = null, qualifier = '', isConst = false ) {\n\n\t\t/**\n\t\t *  The input type.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.type = type;\n\n\t\t/**\n\t\t * The input name.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * If the input is an Array, count will be the length.\n\t\t *\n\t\t * @type {?number}\n\t\t * @default null\n\t\t */\n\t\tthis.count = count;\n\n\t\t/**\n\t\t *The parameter qualifier (only relevant for GLSL).\n\t\t *\n\t\t * @type {('in'|'out'|'inout')}\n\t\t * @default ''\n\t\t */\n\t\tthis.qualifier = qualifier;\n\n\t\t/**\n\t\t * Whether the input uses a const qualifier or not (only relevant for GLSL).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.isConst = isConst;\n\n\t}\n\n}\n\nNodeFunctionInput.isNodeFunctionInput = true;\n\n/**\n * Module for representing directional lights as nodes.\n *\n * @augments AnalyticLightNode\n */\nclass DirectionalLightNode extends AnalyticLightNode {\n\n\tstatic get type() {\n\n\t\treturn 'DirectionalLightNode';\n\n\t}\n\n\t/**\n\t * Constructs a new directional light node.\n\t *\n\t * @param {?DirectionalLight} [light=null] - The directional light source.\n\t */\n\tconstructor( light = null ) {\n\n\t\tsuper( light );\n\n\t}\n\n\tsetupDirect() {\n\n\t\tconst lightColor = this.colorNode;\n\t\tconst lightDirection = lightTargetDirection( this.light );\n\n\t\treturn { lightDirection, lightColor };\n\n\t}\n\n}\n\nconst _matrix41 = /*@__PURE__*/ new Matrix4();\nconst _matrix42 = /*@__PURE__*/ new Matrix4();\n\nlet _ltcLib = null;\n\n/**\n * Module for representing rect area lights as nodes.\n *\n * @augments AnalyticLightNode\n */\nclass RectAreaLightNode extends AnalyticLightNode {\n\n\tstatic get type() {\n\n\t\treturn 'RectAreaLightNode';\n\n\t}\n\n\t/**\n\t * Constructs a new rect area light node.\n\t *\n\t * @param {?RectAreaLight} [light=null] - The rect area light source.\n\t */\n\tconstructor( light = null ) {\n\n\t\tsuper( light );\n\n\t\t/**\n\t\t * Uniform node representing the half height of the are light.\n\t\t *\n\t\t * @type {UniformNode<vec3>}\n\t\t */\n\t\tthis.halfHeight = uniform( new Vector3() ).setGroup( renderGroup );\n\n\t\t/**\n\t\t * Uniform node representing the half width of the are light.\n\t\t *\n\t\t * @type {UniformNode<vec3>}\n\t\t */\n\t\tthis.halfWidth = uniform( new Vector3() ).setGroup( renderGroup );\n\n\t\t/**\n\t\t * The `updateType` is set to `NodeUpdateType.RENDER` since the light\n\t\t * relies on `viewMatrix` which might vary per render call.\n\t\t *\n\t\t * @type {string}\n\t\t * @default 'render'\n\t\t */\n\t\tthis.updateType = NodeUpdateType.RENDER;\n\n\t}\n\n\t/**\n\t * Overwritten to updated rect area light specific uniforms.\n\t *\n\t * @param {NodeFrame} frame - A reference to the current node frame.\n\t */\n\tupdate( frame ) {\n\n\t\tsuper.update( frame );\n\n\t\tconst { light } = this;\n\n\t\tconst viewMatrix = frame.camera.matrixWorldInverse;\n\n\t\t_matrix42.identity();\n\t\t_matrix41.copy( light.matrixWorld );\n\t\t_matrix41.premultiply( viewMatrix );\n\t\t_matrix42.extractRotation( _matrix41 );\n\n\t\tthis.halfWidth.value.set( light.width * 0.5, 0.0, 0.0 );\n\t\tthis.halfHeight.value.set( 0.0, light.height * 0.5, 0.0 );\n\n\t\tthis.halfWidth.value.applyMatrix4( _matrix42 );\n\t\tthis.halfHeight.value.applyMatrix4( _matrix42 );\n\n\t}\n\n\tsetupDirectRectArea( builder ) {\n\n\t\tlet ltc_1, ltc_2;\n\n\t\tif ( builder.isAvailable( 'float32Filterable' ) ) {\n\n\t\t\tltc_1 = texture( _ltcLib.LTC_FLOAT_1 );\n\t\t\tltc_2 = texture( _ltcLib.LTC_FLOAT_2 );\n\n\t\t} else {\n\n\t\t\tltc_1 = texture( _ltcLib.LTC_HALF_1 );\n\t\t\tltc_2 = texture( _ltcLib.LTC_HALF_2 );\n\n\t\t}\n\n\t\tconst { colorNode, light } = this;\n\n\t\tconst lightPosition = lightViewPosition( light );\n\n\t\treturn {\n\t\t\tlightColor: colorNode,\n\t\t\tlightPosition,\n\t\t\thalfWidth: this.halfWidth,\n\t\t\thalfHeight: this.halfHeight,\n\t\t\tltc_1,\n\t\t\tltc_2\n\t\t};\n\n\t}\n\n\t/**\n\t * Used to configure the internal BRDF approximation texture data.\n\t *\n\t * @param {RectAreaLightTexturesLib} ltc - The BRDF approximation texture data.\n\t */\n\tstatic setLTC( ltc ) {\n\n\t\t_ltcLib = ltc;\n\n\t}\n\n}\n\n/**\n * Module for representing spot lights as nodes.\n *\n * @augments AnalyticLightNode\n */\nclass SpotLightNode extends AnalyticLightNode {\n\n\tstatic get type() {\n\n\t\treturn 'SpotLightNode';\n\n\t}\n\n\t/**\n\t * Constructs a new spot light node.\n\t *\n\t * @param {?SpotLight} [light=null] - The spot light source.\n\t */\n\tconstructor( light = null ) {\n\n\t\tsuper( light );\n\n\t\t/**\n\t\t * Uniform node representing the cone cosine.\n\t\t *\n\t\t * @type {UniformNode<float>}\n\t\t */\n\t\tthis.coneCosNode = uniform( 0 ).setGroup( renderGroup );\n\n\t\t/**\n\t\t * Uniform node representing the penumbra cosine.\n\t\t *\n\t\t * @type {UniformNode<float>}\n\t\t */\n\t\tthis.penumbraCosNode = uniform( 0 ).setGroup( renderGroup );\n\n\t\t/**\n\t\t * Uniform node representing the cutoff distance.\n\t\t *\n\t\t * @type {UniformNode<float>}\n\t\t */\n\t\tthis.cutoffDistanceNode = uniform( 0 ).setGroup( renderGroup );\n\n\t\t/**\n\t\t * Uniform node representing the decay exponent.\n\t\t *\n\t\t * @type {UniformNode<float>}\n\t\t */\n\t\tthis.decayExponentNode = uniform( 0 ).setGroup( renderGroup );\n\n\t\t/**\n\t\t * Uniform node representing the light color.\n\t\t *\n\t\t * @type {UniformNode<Color>}\n\t\t */\n\t\tthis.colorNode = uniform( this.color ).setGroup( renderGroup );\n\n\t}\n\n\t/**\n\t * Overwritten to updated spot light specific uniforms.\n\t *\n\t * @param {NodeFrame} frame - A reference to the current node frame.\n\t */\n\tupdate( frame ) {\n\n\t\tsuper.update( frame );\n\n\t\tconst { light } = this;\n\n\t\tthis.coneCosNode.value = Math.cos( light.angle );\n\t\tthis.penumbraCosNode.value = Math.cos( light.angle * ( 1 - light.penumbra ) );\n\n\t\tthis.cutoffDistanceNode.value = light.distance;\n\t\tthis.decayExponentNode.value = light.decay;\n\n\t}\n\n\t/**\n\t * Computes the spot attenuation for the given angle.\n\t *\n\t * @param {NodeBuilder} builder - The node builder.\n\t * @param {Node<float>} angleCosine - The angle to compute the spot attenuation for.\n\t * @return {Node<float>} The spot attenuation.\n\t */\n\tgetSpotAttenuation( builder, angleCosine ) {\n\n\t\tconst { coneCosNode, penumbraCosNode } = this;\n\n\t\treturn smoothstep( coneCosNode, penumbraCosNode, angleCosine );\n\n\t}\n\n\tgetLightCoord( builder ) {\n\n\t\tconst properties = builder.getNodeProperties( this );\n\t\tlet projectionUV = properties.projectionUV;\n\n\t\tif ( projectionUV === undefined ) {\n\n\t\t\tprojectionUV = lightProjectionUV( this.light, builder.context.positionWorld );\n\n\t\t\tproperties.projectionUV = projectionUV;\n\n\t\t}\n\n\t\treturn projectionUV;\n\n\t}\n\n\tsetupDirect( builder ) {\n\n\t\tconst { colorNode, cutoffDistanceNode, decayExponentNode, light } = this;\n\n\t\tconst lightVector = this.getLightVector( builder );\n\n\t\tconst lightDirection = lightVector.normalize();\n\t\tconst angleCos = lightDirection.dot( lightTargetDirection( light ) );\n\n\t\tconst spotAttenuation = this.getSpotAttenuation( builder, angleCos );\n\n\t\tconst lightDistance = lightVector.length();\n\n\t\tconst lightAttenuation = getDistanceAttenuation( {\n\t\t\tlightDistance,\n\t\t\tcutoffDistance: cutoffDistanceNode,\n\t\t\tdecayExponent: decayExponentNode\n\t\t} );\n\n\t\tlet lightColor = colorNode.mul( spotAttenuation ).mul( lightAttenuation );\n\n\t\tlet projected, lightCoord;\n\n\t\tif ( light.colorNode ) {\n\n\t\t\tlightCoord = this.getLightCoord( builder );\n\t\t\tprojected = light.colorNode( lightCoord );\n\n\t\t} else if ( light.map ) {\n\n\t\t\tlightCoord = this.getLightCoord( builder );\n\t\t\tprojected = texture( light.map, lightCoord.xy ).onRenderUpdate( () => light.map );\n\n\t\t}\n\n\t\tif ( projected ) {\n\n\t\t\tconst inSpotLightMap = lightCoord.mul( 2. ).sub( 1. ).abs().lessThan( 1. ).all();\n\n\t\t\tlightColor = inSpotLightMap.select( lightColor.mul( projected ), lightColor );\n\n\t\t}\n\n\t\treturn { lightColor, lightDirection };\n\n\t}\n\n}\n\n/**\n * An IES version of the default spot light node.\n *\n * @augments SpotLightNode\n */\nclass IESSpotLightNode extends SpotLightNode {\n\n\tstatic get type() {\n\n\t\treturn 'IESSpotLightNode';\n\n\t}\n\n\t/**\n\t * Overwrites the default implementation to compute an IES conform spot attenuation.\n\t *\n\t * @param {NodeBuilder} builder - The node builder.\n\t * @param {Node<float>} angleCosine - The angle to compute the spot attenuation for.\n\t * @return {Node<float>} The spot attenuation.\n\t */\n\tgetSpotAttenuation( builder, angleCosine ) {\n\n\t\tconst iesMap = this.light.iesMap;\n\n\t\tlet spotAttenuation = null;\n\n\t\tif ( iesMap && iesMap.isTexture === true ) {\n\n\t\t\tconst angle = angleCosine.acos().mul( 1.0 / Math.PI );\n\n\t\t\tspotAttenuation = texture( iesMap, vec2( angle, 0 ), 0 ).r;\n\n\t\t} else {\n\n\t\t\tspotAttenuation = super.getSpotAttenuation( angleCosine );\n\n\t\t}\n\n\t\treturn spotAttenuation;\n\n\t}\n\n}\n\nconst sdBox = /*@__PURE__*/ Fn( ( [ p, b ] ) => {\n\n\tconst d = p.abs().sub( b );\n\n\treturn length( max$1( d, 0.0 ) ).add( min$1( max$1( d.x, d.y ), 0.0 ) );\n\n} );\n\n/**\n * An implementation of a projector light node.\n *\n * @augments SpotLightNode\n */\nclass ProjectorLightNode extends SpotLightNode {\n\n\tstatic get type() {\n\n\t\treturn 'ProjectorLightNode';\n\n\t}\n\n\tupdate( frame ) {\n\n\t\tsuper.update( frame );\n\n\t\tconst light = this.light;\n\n\t\tthis.penumbraCosNode.value = Math.min( Math.cos( light.angle * ( 1 - light.penumbra ) ), .99999 );\n\n\t\tif ( light.aspect === null ) {\n\n\t\t\tlet aspect = 1;\n\n\t\t\tif ( light.map !== null ) {\n\n\t\t\t\taspect = light.map.width / light.map.height;\n\n\t\t\t}\n\n\t\t\tlight.shadow.aspect = aspect;\n\n\t\t} else {\n\n\t\t\tlight.shadow.aspect = light.aspect;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Overwrites the default implementation to compute projection attenuation.\n\t *\n\t * @param {NodeBuilder} builder - The node builder.\n\t * @return {Node<float>} The spot attenuation.\n\t */\n\tgetSpotAttenuation( builder ) {\n\n\t\tconst attenuation = float( 0 );\n\t\tconst penumbraCos = this.penumbraCosNode;\n\n\t\t// compute the fragment's position in the light's clip space\n\n\t\tconst spotLightCoord = lightShadowMatrix( this.light ).mul( builder.context.positionWorld || positionWorld );\n\n\t\t// the sign of w determines whether the current fragment is in front or behind the light.\n\t\t// to avoid a back-projection, it's important to only compute an attenuation if w is positive\n\n\t\tIf( spotLightCoord.w.greaterThan( 0 ), () => {\n\n\t\t\tconst projectionUV = spotLightCoord.xyz.div( spotLightCoord.w );\n\t\t\tconst boxDist = sdBox( projectionUV.xy.sub( vec2( 0.5 ) ), vec2( 0.5 ) );\n\t\t\tconst angleFactor = div( -1, sub( 1.0, acos( penumbraCos ) ).sub( 1.0 ) );\n\t\t\tattenuation.assign( saturate( boxDist.mul( -2 ).mul( angleFactor ) ) );\n\n\t\t} );\n\n\t\treturn attenuation;\n\n\t}\n\n}\n\n/**\n * Module for representing ambient lights as nodes.\n *\n * @augments AnalyticLightNode\n */\nclass AmbientLightNode extends AnalyticLightNode {\n\n\tstatic get type() {\n\n\t\treturn 'AmbientLightNode';\n\n\t}\n\n\t/**\n\t * Constructs a new ambient light node.\n\t *\n\t * @param {?AmbientLight} [light=null] - The ambient light source.\n\t */\n\tconstructor( light = null ) {\n\n\t\tsuper( light );\n\n\t}\n\n\tsetup( { context } ) {\n\n\t\tcontext.irradiance.addAssign( this.colorNode );\n\n\t}\n\n}\n\n/**\n * Module for representing hemisphere lights as nodes.\n *\n * @augments AnalyticLightNode\n */\nclass HemisphereLightNode extends AnalyticLightNode {\n\n\tstatic get type() {\n\n\t\treturn 'HemisphereLightNode';\n\n\t}\n\n\t/**\n\t * Constructs a new hemisphere light node.\n\t *\n\t * @param {?HemisphereLight} [light=null] - The hemisphere light source.\n\t */\n\tconstructor( light = null ) {\n\n\t\tsuper( light );\n\n\t\t/**\n\t\t * Uniform node representing the light's position.\n\t\t *\n\t\t * @type {UniformNode<vec3>}\n\t\t */\n\t\tthis.lightPositionNode = lightPosition( light );\n\n\t\t/**\n\t\t * A node representing the light's direction.\n\t\t *\n\t\t * @type {Node<vec3>}\n\t\t */\n\t\tthis.lightDirectionNode = this.lightPositionNode.normalize();\n\n\t\t/**\n\t\t * Uniform node representing the light's ground color.\n\t\t *\n\t\t * @type {UniformNode<vec3>}\n\t\t */\n\t\tthis.groundColorNode = uniform( new Color() ).setGroup( renderGroup );\n\n\t}\n\n\t/**\n\t * Overwritten to updated hemisphere light specific uniforms.\n\t *\n\t * @param {NodeFrame} frame - A reference to the current node frame.\n\t */\n\tupdate( frame ) {\n\n\t\tconst { light } = this;\n\n\t\tsuper.update( frame );\n\n\t\tthis.lightPositionNode.object3d = light;\n\n\t\tthis.groundColorNode.value.copy( light.groundColor ).multiplyScalar( light.intensity );\n\n\t}\n\n\tsetup( builder ) {\n\n\t\tconst { colorNode, groundColorNode, lightDirectionNode } = this;\n\n\t\tconst dotNL = normalWorld.dot( lightDirectionNode );\n\t\tconst hemiDiffuseWeight = dotNL.mul( 0.5 ).add( 0.5 );\n\n\t\tconst irradiance = mix( groundColorNode, colorNode, hemiDiffuseWeight );\n\n\t\tbuilder.context.irradiance.addAssign( irradiance );\n\n\t}\n\n}\n\n/**\n * Module for representing light probes as nodes.\n *\n * @augments AnalyticLightNode\n */\nclass LightProbeNode extends AnalyticLightNode {\n\n\tstatic get type() {\n\n\t\treturn 'LightProbeNode';\n\n\t}\n\n\t/**\n\t * Constructs a new light probe node.\n\t *\n\t * @param {?LightProbe} [light=null] - The light probe.\n\t */\n\tconstructor( light = null ) {\n\n\t\tsuper( light );\n\n\t\tconst array = [];\n\n\t\tfor ( let i = 0; i < 9; i ++ ) array.push( new Vector3() );\n\n\t\t/**\n\t\t * Light probe represented as a uniform of spherical harmonics.\n\t\t *\n\t\t * @type {UniformArrayNode}\n\t\t */\n\t\tthis.lightProbe = uniformArray( array );\n\n\t}\n\n\t/**\n\t * Overwritten to updated light probe specific uniforms.\n\t *\n\t * @param {NodeFrame} frame - A reference to the current node frame.\n\t */\n\tupdate( frame ) {\n\n\t\tconst { light } = this;\n\n\t\tsuper.update( frame );\n\n\t\t//\n\n\t\tfor ( let i = 0; i < 9; i ++ ) {\n\n\t\t\tthis.lightProbe.array[ i ].copy( light.sh.coefficients[ i ] ).multiplyScalar( light.intensity );\n\n\t\t}\n\n\t}\n\n\tsetup( builder ) {\n\n\t\tconst irradiance = getShIrradianceAt( normalWorld, this.lightProbe );\n\n\t\tbuilder.context.irradiance.addAssign( irradiance );\n\n\t}\n\n}\n\n/**\n * Base class for node parsers. A derived parser must be implemented\n * for each supported native shader language.\n */\nclass NodeParser {\n\n\t/**\n\t * The method parses the given native code an returns a node function.\n\t *\n\t * @abstract\n\t * @param {string} source - The native shader code.\n\t * @return {NodeFunction} A node function.\n\t */\n\tparseFunction( /*source*/ ) {\n\n\t\twarn( 'Abstract function.' );\n\n\t}\n\n}\n\n/**\n * Base class for node functions. A derived module must be implemented\n * for each supported native shader language. Similar to other `Node*` modules,\n * this class is only relevant during the building process and not used\n * in user-level code.\n */\nclass NodeFunction {\n\n\t/**\n\t * Constructs a new node function.\n\t *\n\t * @param {string} type - The node type. This type is the return type of the node function.\n\t * @param {Array<NodeFunctionInput>} inputs - The function's inputs.\n\t * @param {string} [name=''] - The function's name.\n\t * @param {string} [precision=''] - The precision qualifier.\n\t */\n\tconstructor( type, inputs, name = '', precision = '' ) {\n\n\t\t/**\n\t\t * The node type. This type is the return type of the node function.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.type = type;\n\n\t\t/**\n\t\t * The function's inputs.\n\t\t *\n\t\t * @type {Array<NodeFunctionInput>}\n\t\t */\n\t\tthis.inputs = inputs;\n\n\t\t/**\n\t\t * The name of the uniform.\n\t\t *\n\t\t * @type {string}\n\t\t * @default ''\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * The precision qualifier.\n\t\t *\n\t\t * @type {string}\n\t\t * @default ''\n\t\t */\n\t\tthis.precision = precision;\n\n\t}\n\n\t/**\n\t * This method returns the native code of the node function.\n\t *\n\t * @abstract\n\t * @param {string} name - The function's name.\n\t * @return {string} A shader code.\n\t */\n\tgetCode( /*name = this.name*/ ) {\n\n\t\twarn( 'Abstract function.' );\n\n\t}\n\n}\n\nNodeFunction.isNodeFunction = true;\n\nconst declarationRegexp$1 = /^\\s*(highp|mediump|lowp)?\\s*([a-z_0-9]+)\\s*([a-z_0-9]+)?\\s*\\(([\\s\\S]*?)\\)/i;\nconst propertiesRegexp$1 = /[a-z_0-9]+/ig;\n\nconst pragmaMain = '#pragma main';\n\nconst parse$1 = ( source ) => {\n\n\tsource = source.trim();\n\n\tconst pragmaMainIndex = source.indexOf( pragmaMain );\n\n\tconst mainCode = pragmaMainIndex !== -1 ? source.slice( pragmaMainIndex + pragmaMain.length ) : source;\n\n\tconst declaration = mainCode.match( declarationRegexp$1 );\n\n\tif ( declaration !== null && declaration.length === 5 ) {\n\n\t\t// tokenizer\n\n\t\tconst inputsCode = declaration[ 4 ];\n\t\tconst propsMatches = [];\n\n\t\tlet nameMatch = null;\n\n\t\twhile ( ( nameMatch = propertiesRegexp$1.exec( inputsCode ) ) !== null ) {\n\n\t\t\tpropsMatches.push( nameMatch );\n\n\t\t}\n\n\t\t// parser\n\n\t\tconst inputs = [];\n\n\t\tlet i = 0;\n\n\t\twhile ( i < propsMatches.length ) {\n\n\t\t\tconst isConst = propsMatches[ i ][ 0 ] === 'const';\n\n\t\t\tif ( isConst === true ) {\n\n\t\t\t\ti ++;\n\n\t\t\t}\n\n\t\t\tlet qualifier = propsMatches[ i ][ 0 ];\n\n\t\t\tif ( qualifier === 'in' || qualifier === 'out' || qualifier === 'inout' ) {\n\n\t\t\t\ti ++;\n\n\t\t\t} else {\n\n\t\t\t\tqualifier = '';\n\n\t\t\t}\n\n\t\t\tconst type = propsMatches[ i ++ ][ 0 ];\n\n\t\t\tlet count = Number.parseInt( propsMatches[ i ][ 0 ] );\n\n\t\t\tif ( Number.isNaN( count ) === false ) i ++;\n\t\t\telse count = null;\n\n\t\t\tconst name = propsMatches[ i ++ ][ 0 ];\n\n\t\t\tinputs.push( new NodeFunctionInput( type, name, count, qualifier, isConst ) );\n\n\t\t}\n\n\t\t//\n\n\t\tconst blockCode = mainCode.substring( declaration[ 0 ].length );\n\n\t\tconst name = declaration[ 3 ] !== undefined ? declaration[ 3 ] : '';\n\t\tconst type = declaration[ 2 ];\n\n\t\tconst precision = declaration[ 1 ] !== undefined ? declaration[ 1 ] : '';\n\n\t\tconst headerCode = pragmaMainIndex !== -1 ? source.slice( 0, pragmaMainIndex ) : '';\n\n\t\treturn {\n\t\t\ttype,\n\t\t\tinputs,\n\t\t\tname,\n\t\t\tprecision,\n\t\t\tinputsCode,\n\t\t\tblockCode,\n\t\t\theaderCode\n\t\t};\n\n\t} else {\n\n\t\tthrow new Error( 'FunctionNode: Function is not a GLSL code.' );\n\n\t}\n\n};\n\n/**\n * This class represents a GLSL node function.\n *\n * @augments NodeFunction\n */\nclass GLSLNodeFunction extends NodeFunction {\n\n\t/**\n\t * Constructs a new GLSL node function.\n\t *\n\t * @param {string} source - The GLSL source.\n\t */\n\tconstructor( source ) {\n\n\t\tconst { type, inputs, name, precision, inputsCode, blockCode, headerCode } = parse$1( source );\n\n\t\tsuper( type, inputs, name, precision );\n\n\t\tthis.inputsCode = inputsCode;\n\t\tthis.blockCode = blockCode;\n\t\tthis.headerCode = headerCode;\n\n\t}\n\n\t/**\n\t * This method returns the GLSL code of the node function.\n\t *\n\t * @param {string} [name=this.name] - The function's name.\n\t * @return {string} The shader code.\n\t */\n\tgetCode( name = this.name ) {\n\n\t\tlet code;\n\n\t\tconst blockCode = this.blockCode;\n\n\t\tif ( blockCode !== '' ) {\n\n\t\t\tconst { type, inputsCode, headerCode, precision } = this;\n\n\t\t\tlet declarationCode = `${ type } ${ name } ( ${ inputsCode.trim() } )`;\n\n\t\t\tif ( precision !== '' ) {\n\n\t\t\t\tdeclarationCode = `${ precision } ${ declarationCode }`;\n\n\t\t\t}\n\n\t\t\tcode = headerCode + declarationCode + blockCode;\n\n\t\t} else {\n\n\t\t\t// interface function\n\n\t\t\tcode = '';\n\n\t\t}\n\n\t\treturn code;\n\n\t}\n\n}\n\n/**\n * A GLSL node parser.\n *\n * @augments NodeParser\n */\nclass GLSLNodeParser extends NodeParser {\n\n\t/**\n\t * The method parses the given GLSL code an returns a node function.\n\t *\n\t * @param {string} source - The GLSL code.\n\t * @return {GLSLNodeFunction} A node function.\n\t */\n\tparseFunction( source ) {\n\n\t\treturn new GLSLNodeFunction( source );\n\n\t}\n\n}\n\nconst _outputNodeMap = new WeakMap();\nconst _chainKeys$2 = [];\nconst _cacheKeyValues = [];\n\n/**\n * This renderer module manages node-related objects and is the\n * primary interface between the renderer and the node system.\n *\n * @private\n * @augments DataMap\n */\nclass Nodes extends DataMap {\n\n\t/**\n\t * Constructs a new nodes management component.\n\t *\n\t * @param {Renderer} renderer - The renderer.\n\t * @param {Backend} backend - The renderer's backend.\n\t */\n\tconstructor( renderer, backend ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The renderer.\n\t\t *\n\t\t * @type {Renderer}\n\t\t */\n\t\tthis.renderer = renderer;\n\n\t\t/**\n\t\t * The renderer's backend.\n\t\t *\n\t\t * @type {Backend}\n\t\t */\n\t\tthis.backend = backend;\n\n\t\t/**\n\t\t * The node frame.\n\t\t *\n\t\t * @type {Renderer}\n\t\t */\n\t\tthis.nodeFrame = new NodeFrame();\n\n\t\t/**\n\t\t * A cache for managing node builder states.\n\t\t *\n\t\t * @type {Map<number,NodeBuilderState>}\n\t\t */\n\t\tthis.nodeBuilderCache = new Map();\n\n\t\t/**\n\t\t * A cache for managing data cache key data.\n\t\t *\n\t\t * @type {ChainMap}\n\t\t */\n\t\tthis.callHashCache = new ChainMap();\n\n\t\t/**\n\t\t * A cache for managing node uniforms group data.\n\t\t *\n\t\t * @type {ChainMap}\n\t\t */\n\t\tthis.groupsData = new ChainMap();\n\n\t\t/**\n\t\t * A cache for managing node objects of\n\t\t * scene properties like fog or environments.\n\t\t *\n\t\t * @type {Object<string,WeakMap>}\n\t\t */\n\t\tthis.cacheLib = {};\n\n\t}\n\n\t/**\n\t * Returns `true` if the given node uniforms group must be updated or not.\n\t *\n\t * @param {NodeUniformsGroup} nodeUniformsGroup - The node uniforms group.\n\t * @return {boolean} Whether the node uniforms group requires an update or not.\n\t */\n\tupdateGroup( nodeUniformsGroup ) {\n\n\t\tconst groupNode = nodeUniformsGroup.groupNode;\n\t\tconst name = groupNode.name;\n\n\t\t// objectGroup is always updated\n\n\t\tif ( name === objectGroup.name ) return true;\n\n\t\t// renderGroup is updated once per render/compute call\n\n\t\tif ( name === renderGroup.name ) {\n\n\t\t\tconst uniformsGroupData = this.get( nodeUniformsGroup );\n\t\t\tconst renderId = this.nodeFrame.renderId;\n\n\t\t\tif ( uniformsGroupData.renderId !== renderId ) {\n\n\t\t\t\tuniformsGroupData.renderId = renderId;\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// frameGroup is updated once per frame\n\n\t\tif ( name === frameGroup.name ) {\n\n\t\t\tconst uniformsGroupData = this.get( nodeUniformsGroup );\n\t\t\tconst frameId = this.nodeFrame.frameId;\n\n\t\t\tif ( uniformsGroupData.frameId !== frameId ) {\n\n\t\t\t\tuniformsGroupData.frameId = frameId;\n\n\t\t\t\treturn true;\n\n\t\t\t}\n\n\t\t\treturn false;\n\n\t\t}\n\n\t\t// other groups are updated just when groupNode.needsUpdate is true\n\n\t\t_chainKeys$2[ 0 ] = groupNode;\n\t\t_chainKeys$2[ 1 ] = nodeUniformsGroup;\n\n\t\tlet groupData = this.groupsData.get( _chainKeys$2 );\n\t\tif ( groupData === undefined ) this.groupsData.set( _chainKeys$2, groupData = {} );\n\n\t\t_chainKeys$2.length = 0;\n\n\t\tif ( groupData.version !== groupNode.version ) {\n\n\t\t\tgroupData.version = groupNode.version;\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Returns the cache key for the given render object.\n\t *\n\t * @param {RenderObject} renderObject - The render object.\n\t * @return {number} The cache key.\n\t */\n\tgetForRenderCacheKey( renderObject ) {\n\n\t\treturn renderObject.initialCacheKey;\n\n\t}\n\n\t/**\n\t * Returns a node builder state for the given render object.\n\t *\n\t * @param {RenderObject} renderObject - The render object.\n\t * @return {NodeBuilderState} The node builder state.\n\t */\n\tgetForRender( renderObject ) {\n\n\t\tconst renderObjectData = this.get( renderObject );\n\n\t\tlet nodeBuilderState = renderObjectData.nodeBuilderState;\n\n\t\tif ( nodeBuilderState === undefined ) {\n\n\t\t\tconst { nodeBuilderCache } = this;\n\n\t\t\tconst cacheKey = this.getForRenderCacheKey( renderObject );\n\n\t\t\tnodeBuilderState = nodeBuilderCache.get( cacheKey );\n\n\t\t\tif ( nodeBuilderState === undefined ) {\n\n\t\t\t\tconst createNodeBuilder = ( material ) => {\n\n\t\t\t\t\tconst nodeBuilder = this.backend.createNodeBuilder( renderObject.object, this.renderer );\n\t\t\t\t\tnodeBuilder.scene = renderObject.scene;\n\t\t\t\t\tnodeBuilder.material = material;\n\t\t\t\t\tnodeBuilder.camera = renderObject.camera;\n\t\t\t\t\tnodeBuilder.context.material = material;\n\t\t\t\t\tnodeBuilder.lightsNode = renderObject.lightsNode;\n\t\t\t\t\tnodeBuilder.environmentNode = this.getEnvironmentNode( renderObject.scene );\n\t\t\t\t\tnodeBuilder.fogNode = this.getFogNode( renderObject.scene );\n\t\t\t\t\tnodeBuilder.clippingContext = renderObject.clippingContext;\n\t\t\t\t\tif ( this.renderer.getOutputRenderTarget() ? this.renderer.getOutputRenderTarget().multiview : false ) {\n\n\t\t\t\t\t\tnodeBuilder.enableMultiview();\n\n\t\t\t\t\t}\n\n\t\t\t\t\treturn nodeBuilder;\n\n\t\t\t\t};\n\n\t\t\t\tlet nodeBuilder = createNodeBuilder( renderObject.material );\n\n\t\t\t\ttry {\n\n\t\t\t\t\tnodeBuilder.build();\n\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\tnodeBuilder = createNodeBuilder( new NodeMaterial() );\n\t\t\t\t\tnodeBuilder.build();\n\n\t\t\t\t\terror( 'TSL: ' + e );\n\n\t\t\t\t}\n\n\t\t\t\tnodeBuilderState = this._createNodeBuilderState( nodeBuilder );\n\n\t\t\t\tnodeBuilderCache.set( cacheKey, nodeBuilderState );\n\n\t\t\t}\n\n\t\t\tnodeBuilderState.usedTimes ++;\n\n\t\t\trenderObjectData.nodeBuilderState = nodeBuilderState;\n\n\t\t}\n\n\t\treturn nodeBuilderState;\n\n\t}\n\n\t/**\n\t * Deletes the given object from the internal data map\n\t *\n\t * @param {any} object - The object to delete.\n\t * @return {?Object} The deleted dictionary.\n\t */\n\tdelete( object ) {\n\n\t\tif ( object.isRenderObject ) {\n\n\t\t\tconst nodeBuilderState = this.get( object ).nodeBuilderState;\n\t\t\tnodeBuilderState.usedTimes --;\n\n\t\t\tif ( nodeBuilderState.usedTimes === 0 ) {\n\n\t\t\t\tthis.nodeBuilderCache.delete( this.getForRenderCacheKey( object ) );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn super.delete( object );\n\n\t}\n\n\t/**\n\t * Returns a node builder state for the given compute node.\n\t *\n\t * @param {Node} computeNode - The compute node.\n\t * @return {NodeBuilderState} The node builder state.\n\t */\n\tgetForCompute( computeNode ) {\n\n\t\tconst computeData = this.get( computeNode );\n\n\t\tlet nodeBuilderState = computeData.nodeBuilderState;\n\n\t\tif ( nodeBuilderState === undefined ) {\n\n\t\t\tconst nodeBuilder = this.backend.createNodeBuilder( computeNode, this.renderer );\n\t\t\tnodeBuilder.build();\n\n\t\t\tnodeBuilderState = this._createNodeBuilderState( nodeBuilder );\n\n\t\t\tcomputeData.nodeBuilderState = nodeBuilderState;\n\n\t\t}\n\n\t\treturn nodeBuilderState;\n\n\t}\n\n\t/**\n\t * Creates a node builder state for the given node builder.\n\t *\n\t * @private\n\t * @param {NodeBuilder} nodeBuilder - The node builder.\n\t * @return {NodeBuilderState} The node builder state.\n\t */\n\t_createNodeBuilderState( nodeBuilder ) {\n\n\t\treturn new NodeBuilderState(\n\t\t\tnodeBuilder.vertexShader,\n\t\t\tnodeBuilder.fragmentShader,\n\t\t\tnodeBuilder.computeShader,\n\t\t\tnodeBuilder.getAttributesArray(),\n\t\t\tnodeBuilder.getBindings(),\n\t\t\tnodeBuilder.updateNodes,\n\t\t\tnodeBuilder.updateBeforeNodes,\n\t\t\tnodeBuilder.updateAfterNodes,\n\t\t\tnodeBuilder.observer,\n\t\t\tnodeBuilder.transforms\n\t\t);\n\n\t}\n\n\t/**\n\t * Returns an environment node for the current configured\n\t * scene environment.\n\t *\n\t * @param {Scene} scene - The scene.\n\t * @return {Node} A node representing the current scene environment.\n\t */\n\tgetEnvironmentNode( scene ) {\n\n\t\tthis.updateEnvironment( scene );\n\n\t\tlet environmentNode = null;\n\n\t\tif ( scene.environmentNode && scene.environmentNode.isNode ) {\n\n\t\t\tenvironmentNode = scene.environmentNode;\n\n\t\t} else {\n\n\t\t\tconst sceneData = this.get( scene );\n\n\t\t\tif ( sceneData.environmentNode ) {\n\n\t\t\t\tenvironmentNode = sceneData.environmentNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn environmentNode;\n\n\t}\n\n\t/**\n\t * Returns a background node for the current configured\n\t * scene background.\n\t *\n\t * @param {Scene} scene - The scene.\n\t * @return {Node} A node representing the current scene background.\n\t */\n\tgetBackgroundNode( scene ) {\n\n\t\tthis.updateBackground( scene );\n\n\t\tlet backgroundNode = null;\n\n\t\tif ( scene.backgroundNode && scene.backgroundNode.isNode ) {\n\n\t\t\tbackgroundNode = scene.backgroundNode;\n\n\t\t} else {\n\n\t\t\tconst sceneData = this.get( scene );\n\n\t\t\tif ( sceneData.backgroundNode ) {\n\n\t\t\t\tbackgroundNode = sceneData.backgroundNode;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn backgroundNode;\n\n\t}\n\n\t/**\n\t * Returns a fog node for the current configured scene fog.\n\t *\n\t * @param {Scene} scene - The scene.\n\t * @return {Node} A node representing the current scene fog.\n\t */\n\tgetFogNode( scene ) {\n\n\t\tthis.updateFog( scene );\n\n\t\treturn scene.fogNode || this.get( scene ).fogNode || null;\n\n\t}\n\n\t/**\n\t * Returns a cache key for the given scene and lights node.\n\t * This key is used by `RenderObject` as a part of the dynamic\n\t * cache key (a key that must be checked every time the render\n\t * objects is drawn).\n\t *\n\t * @param {Scene} scene - The scene.\n\t * @param {LightsNode} lightsNode - The lights node.\n\t * @return {number} The cache key.\n\t */\n\tgetCacheKey( scene, lightsNode ) {\n\n\t\t_chainKeys$2[ 0 ] = scene;\n\t\t_chainKeys$2[ 1 ] = lightsNode;\n\n\t\tconst callId = this.renderer.info.calls;\n\n\t\tconst cacheKeyData = this.callHashCache.get( _chainKeys$2 ) || {};\n\n\t\tif ( cacheKeyData.callId !== callId ) {\n\n\t\t\tconst environmentNode = this.getEnvironmentNode( scene );\n\t\t\tconst fogNode = this.getFogNode( scene );\n\n\t\t\tif ( lightsNode ) _cacheKeyValues.push( lightsNode.getCacheKey( true ) );\n\t\t\tif ( environmentNode ) _cacheKeyValues.push( environmentNode.getCacheKey() );\n\t\t\tif ( fogNode ) _cacheKeyValues.push( fogNode.getCacheKey() );\n\n\t\t\t_cacheKeyValues.push( this.renderer.getOutputRenderTarget() && this.renderer.getOutputRenderTarget().multiview ? 1 : 0 );\n\t\t\t_cacheKeyValues.push( this.renderer.shadowMap.enabled ? 1 : 0 );\n\t\t\t_cacheKeyValues.push( this.renderer.shadowMap.type );\n\n\t\t\tcacheKeyData.callId = callId;\n\t\t\tcacheKeyData.cacheKey = hashArray( _cacheKeyValues );\n\n\t\t\tthis.callHashCache.set( _chainKeys$2, cacheKeyData );\n\n\t\t\t_cacheKeyValues.length = 0;\n\n\t\t}\n\n\t\t_chainKeys$2.length = 0;\n\n\t\treturn cacheKeyData.cacheKey;\n\n\t}\n\n\t/**\n\t * A boolean that indicates whether tone mapping should be enabled\n\t * or not.\n\t *\n\t * @type {boolean}\n\t */\n\tget isToneMappingState() {\n\n\t\treturn this.renderer.getRenderTarget() ? false : true;\n\n\t}\n\n\t/**\n\t * If a scene background is configured, this method makes sure to\n\t * represent the background with a corresponding node-based implementation.\n\t *\n\t * @param {Scene} scene - The scene.\n\t */\n\tupdateBackground( scene ) {\n\n\t\tconst sceneData = this.get( scene );\n\t\tconst background = scene.background;\n\n\t\tif ( background ) {\n\n\t\t\tconst forceUpdate = ( scene.backgroundBlurriness === 0 && sceneData.backgroundBlurriness > 0 ) || ( scene.backgroundBlurriness > 0 && sceneData.backgroundBlurriness === 0 );\n\n\t\t\tif ( sceneData.background !== background || forceUpdate ) {\n\n\t\t\t\tconst backgroundNode = this.getCacheNode( 'background', background, () => {\n\n\t\t\t\t\tif ( background.isCubeTexture === true || ( background.mapping === EquirectangularReflectionMapping || background.mapping === EquirectangularRefractionMapping || background.mapping === CubeUVReflectionMapping ) ) {\n\n\t\t\t\t\t\tif ( scene.backgroundBlurriness > 0 || background.mapping === CubeUVReflectionMapping ) {\n\n\t\t\t\t\t\t\treturn pmremTexture( background );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tlet envMap;\n\n\t\t\t\t\t\t\tif ( background.isCubeTexture === true ) {\n\n\t\t\t\t\t\t\t\tenvMap = cubeTexture( background );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tenvMap = texture( background );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn cubeMapNode( envMap );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( background.isTexture === true ) {\n\n\t\t\t\t\t\treturn texture( background, screenUV.flipY() ).setUpdateMatrix( true );\n\n\t\t\t\t\t} else if ( background.isColor !== true ) {\n\n\t\t\t\t\t\terror( 'WebGPUNodes: Unsupported background configuration.', background );\n\n\t\t\t\t\t}\n\n\t\t\t\t}, forceUpdate );\n\n\t\t\t\tsceneData.backgroundNode = backgroundNode;\n\t\t\t\tsceneData.background = background;\n\t\t\t\tsceneData.backgroundBlurriness = scene.backgroundBlurriness;\n\n\t\t\t}\n\n\t\t} else if ( sceneData.backgroundNode ) {\n\n\t\t\tdelete sceneData.backgroundNode;\n\t\t\tdelete sceneData.background;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * This method is part of the caching of nodes which are used to represents the\n\t * scene's background, fog or environment.\n\t *\n\t * @param {string} type - The type of object to cache.\n\t * @param {Object} object - The object.\n\t * @param {Function} callback - A callback that produces a node representation for the given object.\n\t * @param {boolean} [forceUpdate=false] - Whether an update should be enforced or not.\n\t * @return {Node} The node representation.\n\t */\n\tgetCacheNode( type, object, callback, forceUpdate = false ) {\n\n\t\tconst nodeCache = this.cacheLib[ type ] || ( this.cacheLib[ type ] = new WeakMap() );\n\n\t\tlet node = nodeCache.get( object );\n\n\t\tif ( node === undefined || forceUpdate ) {\n\n\t\t\tnode = callback();\n\t\t\tnodeCache.set( object, node );\n\n\t\t}\n\n\t\treturn node;\n\n\t}\n\n\t/**\n\t * If a scene fog is configured, this method makes sure to\n\t * represent the fog with a corresponding node-based implementation.\n\t *\n\t * @param {Scene} scene - The scene.\n\t */\n\tupdateFog( scene ) {\n\n\t\tconst sceneData = this.get( scene );\n\t\tconst sceneFog = scene.fog;\n\n\t\tif ( sceneFog ) {\n\n\t\t\tif ( sceneData.fog !== sceneFog ) {\n\n\t\t\t\tconst fogNode = this.getCacheNode( 'fog', sceneFog, () => {\n\n\t\t\t\t\tif ( sceneFog.isFogExp2 ) {\n\n\t\t\t\t\t\tconst color = reference( 'color', 'color', sceneFog ).setGroup( renderGroup );\n\t\t\t\t\t\tconst density = reference( 'density', 'float', sceneFog ).setGroup( renderGroup );\n\n\t\t\t\t\t\treturn fog( color, densityFogFactor( density ) );\n\n\t\t\t\t\t} else if ( sceneFog.isFog ) {\n\n\t\t\t\t\t\tconst color = reference( 'color', 'color', sceneFog ).setGroup( renderGroup );\n\t\t\t\t\t\tconst near = reference( 'near', 'float', sceneFog ).setGroup( renderGroup );\n\t\t\t\t\t\tconst far = reference( 'far', 'float', sceneFog ).setGroup( renderGroup );\n\n\t\t\t\t\t\treturn fog( color, rangeFogFactor( near, far ) );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\terror( 'Renderer: Unsupported fog configuration.', sceneFog );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tsceneData.fogNode = fogNode;\n\t\t\t\tsceneData.fog = sceneFog;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdelete sceneData.fogNode;\n\t\t\tdelete sceneData.fog;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * If a scene environment is configured, this method makes sure to\n\t * represent the environment with a corresponding node-based implementation.\n\t *\n\t * @param {Scene} scene - The scene.\n\t */\n\tupdateEnvironment( scene ) {\n\n\t\tconst sceneData = this.get( scene );\n\t\tconst environment = scene.environment;\n\n\t\tif ( environment ) {\n\n\t\t\tif ( sceneData.environment !== environment ) {\n\n\t\t\t\tconst environmentNode = this.getCacheNode( 'environment', environment, () => {\n\n\t\t\t\t\tif ( environment.isCubeTexture === true ) {\n\n\t\t\t\t\t\treturn cubeTexture( environment );\n\n\t\t\t\t\t} else if ( environment.isTexture === true ) {\n\n\t\t\t\t\t\treturn texture( environment );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\terror( 'Nodes: Unsupported environment configuration.', environment );\n\n\t\t\t\t\t}\n\n\t\t\t\t} );\n\n\t\t\t\tsceneData.environmentNode = environmentNode;\n\t\t\t\tsceneData.environment = environment;\n\n\t\t\t}\n\n\t\t} else if ( sceneData.environmentNode ) {\n\n\t\t\tdelete sceneData.environmentNode;\n\t\t\tdelete sceneData.environment;\n\n\t\t}\n\n\t}\n\n\tgetNodeFrame( renderer = this.renderer, scene = null, object = null, camera = null, material = null ) {\n\n\t\tconst nodeFrame = this.nodeFrame;\n\t\tnodeFrame.renderer = renderer;\n\t\tnodeFrame.scene = scene;\n\t\tnodeFrame.object = object;\n\t\tnodeFrame.camera = camera;\n\t\tnodeFrame.material = material;\n\n\t\treturn nodeFrame;\n\n\t}\n\n\tgetNodeFrameForRender( renderObject ) {\n\n\t\treturn this.getNodeFrame( renderObject.renderer, renderObject.scene, renderObject.object, renderObject.camera, renderObject.material );\n\n\t}\n\n\t/**\n\t * Returns the current output cache key.\n\t *\n\t * @return {string} The output cache key.\n\t */\n\tgetOutputCacheKey() {\n\n\t\tconst renderer = this.renderer;\n\n\t\treturn renderer.toneMapping + ',' + renderer.currentColorSpace + ',' + renderer.xr.isPresenting;\n\n\t}\n\n\t/**\n\t * Checks if the output configuration (tone mapping and color space) for\n\t * the given target has changed.\n\t *\n\t * @param {Texture} outputTarget - The output target.\n\t * @return {boolean} Whether the output configuration has changed or not.\n\t */\n\thasOutputChange( outputTarget ) {\n\n\t\tconst cacheKey = _outputNodeMap.get( outputTarget );\n\n\t\treturn cacheKey !== this.getOutputCacheKey();\n\n\t}\n\n\t/**\n\t * Returns a node that represents the output configuration (tone mapping and\n\t * color space) for the current target.\n\t *\n\t * @param {Texture} outputTarget - The output target.\n\t * @return {Node} The output node.\n\t */\n\tgetOutputNode( outputTarget ) {\n\n\t\tconst renderer = this.renderer;\n\t\tconst cacheKey = this.getOutputCacheKey();\n\n\t\tconst output = outputTarget.isArrayTexture ?\n\t\t\ttexture3D( outputTarget, vec3( screenUV, builtin( 'gl_ViewID_OVR' ) ) ).renderOutput( renderer.toneMapping, renderer.currentColorSpace ) :\n\t\t\ttexture( outputTarget, screenUV ).renderOutput( renderer.toneMapping, renderer.currentColorSpace );\n\n\t\t_outputNodeMap.set( outputTarget, cacheKey );\n\n\t\treturn output;\n\n\t}\n\n\t/**\n\t * Triggers the call of `updateBefore()` methods\n\t * for all nodes of the given render object.\n\t *\n\t * @param {RenderObject} renderObject - The render object.\n\t */\n\tupdateBefore( renderObject ) {\n\n\t\tconst nodeBuilder = renderObject.getNodeBuilderState();\n\n\t\tfor ( const node of nodeBuilder.updateBeforeNodes ) {\n\n\t\t\t// update frame state for each node\n\n\t\t\tthis.getNodeFrameForRender( renderObject ).updateBeforeNode( node );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Triggers the call of `updateAfter()` methods\n\t * for all nodes of the given render object.\n\t *\n\t * @param {RenderObject} renderObject - The render object.\n\t */\n\tupdateAfter( renderObject ) {\n\n\t\tconst nodeBuilder = renderObject.getNodeBuilderState();\n\n\t\tfor ( const node of nodeBuilder.updateAfterNodes ) {\n\n\t\t\t// update frame state for each node\n\n\t\t\tthis.getNodeFrameForRender( renderObject ).updateAfterNode( node );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Triggers the call of `update()` methods\n\t * for all nodes of the given compute node.\n\t *\n\t * @param {Node} computeNode - The compute node.\n\t */\n\tupdateForCompute( computeNode ) {\n\n\t\tconst nodeFrame = this.getNodeFrame();\n\t\tconst nodeBuilder = this.getForCompute( computeNode );\n\n\t\tfor ( const node of nodeBuilder.updateNodes ) {\n\n\t\t\tnodeFrame.updateNode( node );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Triggers the call of `update()` methods\n\t * for all nodes of the given compute node.\n\t *\n\t * @param {RenderObject} renderObject - The render object.\n\t */\n\tupdateForRender( renderObject ) {\n\n\t\tconst nodeFrame = this.getNodeFrameForRender( renderObject );\n\t\tconst nodeBuilder = renderObject.getNodeBuilderState();\n\n\t\tfor ( const node of nodeBuilder.updateNodes ) {\n\n\t\t\tnodeFrame.updateNode( node );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns `true` if the given render object requires a refresh.\n\t *\n\t * @param {RenderObject} renderObject - The render object.\n\t * @return {boolean} Whether the given render object requires a refresh or not.\n\t */\n\tneedsRefresh( renderObject ) {\n\n\t\tconst nodeFrame = this.getNodeFrameForRender( renderObject );\n\t\tconst monitor = renderObject.getMonitor();\n\n\t\treturn monitor.needsRefresh( renderObject, nodeFrame );\n\n\t}\n\n\t/**\n\t * Frees the internal resources.\n\t */\n\tdispose() {\n\n\t\tsuper.dispose();\n\n\t\tthis.nodeFrame = new NodeFrame();\n\t\tthis.nodeBuilderCache = new Map();\n\t\tthis.cacheLib = {};\n\n\t}\n\n}\n\nconst _plane = /*@__PURE__*/ new Plane();\n\n/**\n * Represents the state that is used to perform clipping via clipping planes.\n * There is a default clipping context for each render context. When the\n * scene holds instances of `ClippingGroup`, there will be a context for each\n * group.\n *\n * @private\n */\nclass ClippingContext {\n\n\t/**\n\t * Constructs a new clipping context.\n\t *\n\t * @param {?ClippingContext} [parentContext=null] - A reference to the parent clipping context.\n\t */\n\tconstructor( parentContext = null ) {\n\n\t\t/**\n\t\t * The clipping context's version.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t */\n\t\tthis.version = 0;\n\n\t\t/**\n\t\t * Whether the intersection of the clipping planes is used to clip objects, rather than their union.\n\t\t *\n\t\t * @type {?boolean}\n\t\t * @default null\n\t\t */\n\t\tthis.clipIntersection = null;\n\n\t\t/**\n\t\t * The clipping context's cache key.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.cacheKey = '';\n\n\t\t/**\n\t\t * Whether the shadow pass is active or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.shadowPass = false;\n\n\t\t/**\n\t\t * The view normal matrix.\n\t\t *\n\t\t * @type {Matrix3}\n\t\t */\n\t\tthis.viewNormalMatrix = new Matrix3();\n\n\t\t/**\n\t\t * Internal cache for maintaining clipping contexts.\n\t\t *\n\t\t * @type {WeakMap<ClippingGroup,ClippingContext>}\n\t\t */\n\t\tthis.clippingGroupContexts = new WeakMap();\n\n\t\t/**\n\t\t * The intersection planes.\n\t\t *\n\t\t * @type {Array<Vector4>}\n\t\t */\n\t\tthis.intersectionPlanes = [];\n\n\t\t/**\n\t\t * The intersection planes.\n\t\t *\n\t\t * @type {Array<Vector4>}\n\t\t */\n\t\tthis.unionPlanes = [];\n\n\t\t/**\n\t\t * The version of the clipping context's parent context.\n\t\t *\n\t\t * @type {?number}\n\t\t * @readonly\n\t\t */\n\t\tthis.parentVersion = null;\n\n\t\tif ( parentContext !== null ) {\n\n\t\t\tthis.viewNormalMatrix = parentContext.viewNormalMatrix;\n\t\t\tthis.clippingGroupContexts = parentContext.clippingGroupContexts;\n\n\t\t\tthis.shadowPass = parentContext.shadowPass;\n\t\t\tthis.viewMatrix = parentContext.viewMatrix;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Projects the given source clipping planes and writes the result into the\n\t * destination array.\n\t *\n\t * @param {Array<Plane>} source - The source clipping planes.\n\t * @param {Array<Vector4>} destination - The destination.\n\t * @param {number} offset - The offset.\n\t */\n\tprojectPlanes( source, destination, offset ) {\n\n\t\tconst l = source.length;\n\n\t\tfor ( let i = 0; i < l; i ++ ) {\n\n\t\t\t_plane.copy( source[ i ] ).applyMatrix4( this.viewMatrix, this.viewNormalMatrix );\n\n\t\t\tconst v = destination[ offset + i ];\n\t\t\tconst normal = _plane.normal;\n\n\t\t\tv.x = - normal.x;\n\t\t\tv.y = - normal.y;\n\t\t\tv.z = - normal.z;\n\t\t\tv.w = _plane.constant;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the root clipping context of a scene.\n\t *\n\t * @param {Scene} scene - The scene.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t */\n\tupdateGlobal( scene, camera ) {\n\n\t\tthis.shadowPass = ( scene.overrideMaterial !== null && scene.overrideMaterial.isShadowPassMaterial );\n\t\tthis.viewMatrix = camera.matrixWorldInverse;\n\n\t\tthis.viewNormalMatrix.getNormalMatrix( this.viewMatrix );\n\n\t}\n\n\t/**\n\t * Updates the clipping context.\n\t *\n\t * @param {ClippingContext} parentContext - The parent context.\n\t * @param {ClippingGroup} clippingGroup - The clipping group this context belongs to.\n\t */\n\tupdate( parentContext, clippingGroup ) {\n\n\t\tlet update = false;\n\n\t\tif ( parentContext.version !== this.parentVersion ) {\n\n\t\t\tthis.intersectionPlanes = Array.from( parentContext.intersectionPlanes );\n\t\t\tthis.unionPlanes = Array.from( parentContext.unionPlanes );\n\t\t\tthis.parentVersion = parentContext.version;\n\n\t\t}\n\n\t\tif ( this.clipIntersection !== clippingGroup.clipIntersection ) {\n\n\t\t\tthis.clipIntersection = clippingGroup.clipIntersection;\n\n\t\t\tif ( this.clipIntersection ) {\n\n\t\t\t\tthis.unionPlanes.length = parentContext.unionPlanes.length;\n\n\t\t\t} else {\n\n\t\t\t\tthis.intersectionPlanes.length = parentContext.intersectionPlanes.length;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst srcClippingPlanes = clippingGroup.clippingPlanes;\n\t\tconst l = srcClippingPlanes.length;\n\n\t\tlet dstClippingPlanes;\n\t\tlet offset;\n\n\t\tif ( this.clipIntersection ) {\n\n\t\t\tdstClippingPlanes = this.intersectionPlanes;\n\t\t\toffset = parentContext.intersectionPlanes.length;\n\n\t\t} else {\n\n\t\t\tdstClippingPlanes = this.unionPlanes;\n\t\t\toffset = parentContext.unionPlanes.length;\n\n\t\t}\n\n\t\tif ( dstClippingPlanes.length !== offset + l ) {\n\n\t\t\tdstClippingPlanes.length = offset + l;\n\n\t\t\tfor ( let i = 0; i < l; i ++ ) {\n\n\t\t\t\tdstClippingPlanes[ offset + i ] = new Vector4();\n\n\t\t\t}\n\n\t\t\tupdate = true;\n\n\t\t}\n\n\t\tthis.projectPlanes( srcClippingPlanes, dstClippingPlanes, offset );\n\n\t\tif ( update ) {\n\n\t\t\tthis.version ++;\n\t\t\tthis.cacheKey = `${ this.intersectionPlanes.length }:${ this.unionPlanes.length }`;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a clipping context for the given clipping group.\n\t *\n\t * @param {ClippingGroup} clippingGroup - The clipping group.\n\t * @return {ClippingContext} The clipping context.\n\t */\n\tgetGroupContext( clippingGroup ) {\n\n\t\tif ( this.shadowPass && ! clippingGroup.clipShadows ) return this;\n\n\t\tlet context = this.clippingGroupContexts.get( clippingGroup );\n\n\t\tif ( context === undefined ) {\n\n\t\t\tcontext = new ClippingContext( this );\n\t\t\tthis.clippingGroupContexts.set( clippingGroup, context );\n\n\t\t}\n\n\t\tcontext.update( this, clippingGroup );\n\n\t\treturn context;\n\n\t}\n\n\t/**\n\t * The count of union clipping planes.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget unionClippingCount() {\n\n\t\treturn this.unionPlanes.length;\n\n\t}\n\n}\n\n/**\n * This module is used to represent render bundles inside the renderer\n * for further processing.\n *\n * @private\n */\nclass RenderBundle {\n\n\t/**\n\t * Constructs a new bundle group.\n\t *\n\t * @param {BundleGroup} bundleGroup - The bundle group.\n\t * @param {Camera} camera - The camera the bundle group is rendered with.\n\t */\n\tconstructor( bundleGroup, camera ) {\n\n\t\tthis.bundleGroup = bundleGroup;\n\t\tthis.camera = camera;\n\n\t}\n\n}\n\nconst _chainKeys$1 = [];\n\n/**\n * This renderer module manages render bundles.\n *\n * @private\n */\nclass RenderBundles {\n\n\t/**\n\t * Constructs a new render bundle management component.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * A chain map for maintaining the render bundles.\n\t\t *\n\t\t * @type {ChainMap}\n\t\t */\n\t\tthis.bundles = new ChainMap();\n\n\t}\n\n\t/**\n\t * Returns a render bundle for the given bundle group and camera.\n\t *\n\t * @param {BundleGroup} bundleGroup - The bundle group.\n\t * @param {Camera} camera - The camera the bundle group is rendered with.\n\t * @return {RenderBundle} The render bundle.\n\t */\n\tget( bundleGroup, camera ) {\n\n\t\tconst bundles = this.bundles;\n\n\t\t_chainKeys$1[ 0 ] = bundleGroup;\n\t\t_chainKeys$1[ 1 ] = camera;\n\n\t\tlet bundle = bundles.get( _chainKeys$1 );\n\n\t\tif ( bundle === undefined ) {\n\n\t\t\tbundle = new RenderBundle( bundleGroup, camera );\n\t\t\tbundles.set( _chainKeys$1, bundle );\n\n\t\t}\n\n\t\t_chainKeys$1.length = 0;\n\n\t\treturn bundle;\n\n\t}\n\n\t/**\n\t * Frees all internal resources.\n\t */\n\tdispose() {\n\n\t\tthis.bundles = new ChainMap();\n\n\t}\n\n}\n\n/**\n * The purpose of a node library is to assign node implementations\n * to existing library features. In `WebGPURenderer` lights, materials\n * which are not based on `NodeMaterial` as well as tone mapping techniques\n * are implemented with node-based modules.\n *\n * @private\n */\nclass NodeLibrary {\n\n\t/**\n\t * Constructs a new node library.\n\t */\n\tconstructor() {\n\n\t\t/**\n\t\t * A weak map that maps lights to light nodes.\n\t\t *\n\t\t * @type {WeakMap<Light.constructor,AnalyticLightNode.constructor>}\n\t\t */\n\t\tthis.lightNodes = new WeakMap();\n\n\t\t/**\n\t\t * A map that maps materials to node materials.\n\t\t *\n\t\t * @type {Map<string,NodeMaterial.constructor>}\n\t\t */\n\t\tthis.materialNodes = new Map();\n\n\t\t/**\n\t\t * A map that maps tone mapping techniques (constants)\n\t\t * to tone mapping node functions.\n\t\t *\n\t\t * @type {Map<number,Function>}\n\t\t */\n\t\tthis.toneMappingNodes = new Map();\n\n\t}\n\n\t/**\n\t * Returns a matching node material instance for the given material object.\n\t *\n\t * This method also assigns/copies the properties of the given material object\n\t * to the node material. This is done to make sure the current material\n\t * configuration carries over to the node version.\n\t *\n\t * @param {Material} material - A material.\n\t * @return {NodeMaterial} The corresponding node material.\n\t */\n\tfromMaterial( material ) {\n\n\t\tif ( material.isNodeMaterial ) return material;\n\n\t\tlet nodeMaterial = null;\n\n\t\tconst nodeMaterialClass = this.getMaterialNodeClass( material.type );\n\n\t\tif ( nodeMaterialClass !== null ) {\n\n\t\t\tnodeMaterial = new nodeMaterialClass();\n\n\t\t\tfor ( const key in material ) {\n\n\t\t\t\tnodeMaterial[ key ] = material[ key ];\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn nodeMaterial;\n\n\t}\n\n\t/**\n\t * Adds a tone mapping node function for a tone mapping technique (constant).\n\t *\n\t * @param {Function} toneMappingNode - The tone mapping node function.\n\t * @param {number} toneMapping - The tone mapping.\n\t */\n\taddToneMapping( toneMappingNode, toneMapping ) {\n\n\t\tthis.addType( toneMappingNode, toneMapping, this.toneMappingNodes );\n\n\t}\n\n\t/**\n\t * Returns a tone mapping node function for a tone mapping technique (constant).\n\t *\n\t * @param {number} toneMapping - The tone mapping.\n\t * @return {?Function} The tone mapping node function. Returns `null` if no node function is found.\n\t */\n\tgetToneMappingFunction( toneMapping ) {\n\n\t\treturn this.toneMappingNodes.get( toneMapping ) || null;\n\n\t}\n\n\t/**\n\t * Returns a node material class definition for a material type.\n\t *\n\t * @param {string} materialType - The material type.\n\t * @return {?NodeMaterial.constructor} The node material class definition. Returns `null` if no node material is found.\n\t */\n\tgetMaterialNodeClass( materialType ) {\n\n\t\treturn this.materialNodes.get( materialType ) || null;\n\n\t}\n\n\t/**\n\t * Adds a node material class definition for a given material type.\n\t *\n\t * @param {NodeMaterial.constructor} materialNodeClass - The node material class definition.\n\t * @param {string} materialClassType - The material type.\n\t */\n\taddMaterial( materialNodeClass, materialClassType ) {\n\n\t\tthis.addType( materialNodeClass, materialClassType, this.materialNodes );\n\n\t}\n\n\t/**\n\t * Returns a light node class definition for a light class definition.\n\t *\n\t * @param {Light.constructor} light - The light class definition.\n\t * @return {?AnalyticLightNode.constructor} The light node class definition. Returns `null` if no light node is found.\n\t */\n\tgetLightNodeClass( light ) {\n\n\t\treturn this.lightNodes.get( light ) || null;\n\n\t}\n\n\t/**\n\t * Adds a light node class definition for a given light class definition.\n\t *\n\t * @param {AnalyticLightNode.constructor} lightNodeClass - The light node class definition.\n\t * @param {Light.constructor} lightClass - The light class definition.\n\t */\n\taddLight( lightNodeClass, lightClass ) {\n\n\t\tthis.addClass( lightNodeClass, lightClass, this.lightNodes );\n\n\t}\n\n\t/**\n\t * Adds a node class definition for the given type to the provided type library.\n\t *\n\t * @param {Node.constructor} nodeClass - The node class definition.\n\t * @param {number|string} type - The object type.\n\t * @param {Map<number|string,Node.constructor>} library - The type library.\n\t */\n\taddType( nodeClass, type, library ) {\n\n\t\tif ( library.has( type ) ) {\n\n\t\t\twarn( `Redefinition of node ${ type }` );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( typeof nodeClass !== 'function' ) throw new Error( `Node class ${ nodeClass.name } is not a class.` );\n\t\tif ( typeof type === 'function' || typeof type === 'object' ) throw new Error( `Base class ${ type } is not a class.` );\n\n\t\tlibrary.set( type, nodeClass );\n\n\t}\n\n\t/**\n\t * Adds a node class definition for the given class definition to the provided type library.\n\t *\n\t * @param {Node.constructor} nodeClass - The node class definition.\n\t * @param {Node.constructor} baseClass - The class definition.\n\t * @param {WeakMap<Node.constructor, Node.constructor>} library - The type library.\n\t */\n\taddClass( nodeClass, baseClass, library ) {\n\n\t\tif ( library.has( baseClass ) ) {\n\n\t\t\twarn( `Redefinition of node ${ baseClass.name }` );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( typeof nodeClass !== 'function' ) throw new Error( `Node class ${ nodeClass.name } is not a class.` );\n\t\tif ( typeof baseClass !== 'function' ) throw new Error( `Base class ${ baseClass.name } is not a class.` );\n\n\t\tlibrary.set( baseClass, nodeClass );\n\n\t}\n\n}\n\nconst _defaultLights = /*@__PURE__*/ new LightsNode();\nconst _chainKeys = [];\n\n/**\n * This renderer module manages the lights nodes which are unique\n * per scene and camera combination.\n *\n * The lights node itself is later configured in the render list\n * with the actual lights from the scene.\n *\n * @private\n * @augments ChainMap\n */\nclass Lighting extends ChainMap {\n\n\t/**\n\t * Constructs a lighting management component.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t}\n\n\t/**\n\t * Creates a new lights node for the given array of lights.\n\t *\n\t * @param {Array<Light>} lights - The render object.\n\t * @return {LightsNode} The lights node.\n\t */\n\tcreateNode( lights = [] ) {\n\n\t\treturn new LightsNode().setLights( lights );\n\n\t}\n\n\t/**\n\t * Returns a lights node for the given scene and camera.\n\t *\n\t * @param {Scene} scene - The scene.\n\t * @param {Camera} camera - The camera.\n\t * @return {LightsNode} The lights node.\n\t */\n\tgetNode( scene, camera ) {\n\n\t\t// ignore post-processing\n\n\t\tif ( scene.isQuadMesh ) return _defaultLights;\n\n\t\t_chainKeys[ 0 ] = scene;\n\t\t_chainKeys[ 1 ] = camera;\n\n\t\tlet node = this.get( _chainKeys );\n\n\t\tif ( node === undefined ) {\n\n\t\t\tnode = this.createNode();\n\t\t\tthis.set( _chainKeys, node );\n\n\t\t}\n\n\t\t_chainKeys.length = 0;\n\n\t\treturn node;\n\n\t}\n\n}\n\n/**\n * A special type of render target that is used when rendering\n * with the WebXR Device API.\n *\n * @private\n * @augments RenderTarget\n */\nclass XRRenderTarget extends RenderTarget {\n\n\t/**\n\t * Constructs a new XR render target.\n\t *\n\t * @param {number} [width=1] - The width of the render target.\n\t * @param {number} [height=1] - The height of the render target.\n\t * @param {Object} [options={}] - The configuration options.\n\t */\n\tconstructor( width = 1, height = 1, options = {} ) {\n\n\t\tsuper( width, height, options );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isXRRenderTarget = true;\n\n\t\t/**\n\t\t * Whether the attachments of the render target\n\t\t * are defined by external textures. This flag is\n\t\t * set to `true` when using the WebXR Layers API.\n\t\t *\n\t\t * @private\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis._hasExternalTextures = false;\n\n\t\t/**\n\t\t * Whether a depth buffer should automatically be allocated\n\t\t * for this XR render target or not.\n\t\t *\n\t\t * Allocating a depth buffer is the default behavior of XR render\n\t\t * targets. However, when using the WebXR Layers API, this flag\n\t\t * must be set to `false` when the `ignoreDepthValues` property of\n\t\t * the projection layers evaluates to `false`.\n\t\t *\n\t\t * Reference: {@link https://www.w3.org/TR/webxrlayers-1/#dom-xrprojectionlayer-ignoredepthvalues}.\n\t\t *\n\t\t * @private\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis._autoAllocateDepthBuffer = true;\n\n\t\t/**\n\t\t * Whether this render target is associated with a XRWebGLLayer.\n\t\t *\n\t\t * A XRWebGLLayer points to an opaque framebuffer. Basically,\n\t\t * this means that you don't have access to its bound color,\n\t\t * stencil and depth buffers. We need to handle this framebuffer\n\t\t * differently since its textures are always bound.\n\t\t *\n\t\t * @private\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t * */\n\t\tthis._isOpaqueFramebuffer = false;\n\n\t}\n\n\tcopy( source ) {\n\n\t\tsuper.copy( source );\n\n\t\tthis._hasExternalTextures = source._hasExternalTextures;\n\t\tthis._autoAllocateDepthBuffer = source._autoAllocateDepthBuffer;\n\t\tthis._isOpaqueFramebuffer = source._isOpaqueFramebuffer;\n\n\t\treturn this;\n\n\t}\n\n\n}\n\nconst _cameraLPos = /*@__PURE__*/ new Vector3();\nconst _cameraRPos = /*@__PURE__*/ new Vector3();\n\n/**\n * The XR manager is built on top of the WebXR Device API to\n * manage XR sessions with `WebGPURenderer`.\n *\n * XR is currently only supported with a WebGL 2 backend.\n *\n * @augments EventDispatcher\n */\nclass XRManager extends EventDispatcher {\n\n\t/**\n\t * Constructs a new XR manager.\n\t *\n\t * @param {Renderer} renderer - The renderer.\n\t * @param {boolean} [multiview=false] - Enables multiview if the device supports it.\n\t */\n\tconstructor( renderer, multiview = false ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag globally enables XR rendering.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.enabled = false;\n\n\t\t/**\n\t\t * Whether the XR device is currently presenting or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t * @readonly\n\t\t */\n\t\tthis.isPresenting = false;\n\n\t\t/**\n\t\t * Whether the XR camera should automatically be updated or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.cameraAutoUpdate = true;\n\n\t\t/**\n\t\t * The renderer.\n\t\t *\n\t\t * @private\n\t\t * @type {Renderer}\n\t\t */\n\t\tthis._renderer = renderer;\n\n\t\t// camera\n\n\t\t/**\n\t\t * Represents the camera for the left eye.\n\t\t *\n\t\t * @private\n\t\t * @type {PerspectiveCamera}\n\t\t */\n\t\tthis._cameraL = new PerspectiveCamera();\n\t\tthis._cameraL.viewport = new Vector4();\n\n\t\t/**\n\t\t * Represents the camera for the right eye.\n\t\t *\n\t\t * @private\n\t\t * @type {PerspectiveCamera}\n\t\t */\n\t\tthis._cameraR = new PerspectiveCamera();\n\t\tthis._cameraR.viewport = new Vector4();\n\n\t\t/**\n\t\t * A list of cameras used for rendering the XR views.\n\t\t *\n\t\t * @private\n\t\t * @type {Array<Camera>}\n\t\t */\n\t\tthis._cameras = [ this._cameraL, this._cameraR ];\n\n\t\t/**\n\t\t * The main XR camera.\n\t\t *\n\t\t * @private\n\t\t * @type {ArrayCamera}\n\t\t */\n\t\tthis._cameraXR = new ArrayCamera();\n\n\t\t/**\n\t\t * The current near value of the XR camera.\n\t\t *\n\t\t * @private\n\t\t * @type {?number}\n\t\t * @default null\n\t\t */\n\t\tthis._currentDepthNear = null;\n\n\t\t/**\n\t\t * The current far value of the XR camera.\n\t\t *\n\t\t * @private\n\t\t * @type {?number}\n\t\t * @default null\n\t\t */\n\t\tthis._currentDepthFar = null;\n\n\t\t/**\n\t\t * A list of WebXR controllers requested by the application.\n\t\t *\n\t\t * @private\n\t\t * @type {Array<WebXRController>}\n\t\t */\n\t\tthis._controllers = [];\n\n\t\t/**\n\t\t * A list of XR input source. Each input source belongs to\n\t\t * an instance of WebXRController.\n\t\t *\n\t\t * @private\n\t\t * @type {Array<XRInputSource?>}\n\t\t */\n\t\tthis._controllerInputSources = [];\n\n\t\t/**\n\t\t * The XR render target that represents the rendering destination\n\t\t * during an active XR session.\n\t\t *\n\t\t * @private\n\t\t * @type {?RenderTarget}\n\t\t * @default null\n\t\t */\n\t\tthis._xrRenderTarget = null;\n\n\t\t/**\n\t\t * An array holding all the non-projection layers\n\t\t *\n\t\t * @private\n\t\t * @type {Array<Object>}\n\t\t * @default []\n\t\t */\n\t\tthis._layers = [];\n\n\t\t/**\n\t\t * Whether the XR session uses layers.\n\t\t *\n\t\t * @private\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis._sessionUsesLayers = false;\n\n\t\t/**\n\t\t * Whether the device supports binding gl objects.\n\t\t *\n\t\t * @private\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t */\n\t\tthis._supportsGlBinding = typeof XRWebGLBinding !== 'undefined';\n\n\t\tthis._frameBufferTargets = null;\n\n\t\t/**\n\t\t * Helper function to create native WebXR Layer.\n\t\t *\n\t\t * @private\n\t\t * @type {Function}\n\t\t */\n\t\tthis._createXRLayer = createXRLayer.bind( this );\n\n\t\t/**\n\t\t* The current WebGL context.\n\t\t*\n\t\t* @private\n\t\t* @type {?WebGL2RenderingContext}\n\t\t* @default null\n\t\t*/\n\t\tthis._gl = null;\n\n\t\t/**\n\t\t * The current animation context.\n\t\t *\n\t\t * @private\n\t\t * @type {?Window}\n\t\t * @default null\n\t\t */\n\t\tthis._currentAnimationContext = null;\n\n\t\t/**\n\t\t * The current animation loop.\n\t\t *\n\t\t * @private\n\t\t * @type {?Function}\n\t\t * @default null\n\t\t */\n\t\tthis._currentAnimationLoop = null;\n\n\t\t/**\n\t\t * The current pixel ratio.\n\t\t *\n\t\t * @private\n\t\t * @type {?number}\n\t\t * @default null\n\t\t */\n\t\tthis._currentPixelRatio = null;\n\n\t\t/**\n\t\t * The current size of the renderer's canvas\n\t\t * in logical pixel unit.\n\t\t *\n\t\t * @private\n\t\t * @type {Vector2}\n\t\t */\n\t\tthis._currentSize = new Vector2();\n\n\t\t/**\n\t\t * The default event listener for handling events inside a XR session.\n\t\t *\n\t\t * @private\n\t\t * @type {Function}\n\t\t */\n\t\tthis._onSessionEvent = onSessionEvent.bind( this );\n\n\t\t/**\n\t\t * The event listener for handling the end of a XR session.\n\t\t *\n\t\t * @private\n\t\t * @type {Function}\n\t\t */\n\t\tthis._onSessionEnd = onSessionEnd.bind( this );\n\n\t\t/**\n\t\t * The event listener for handling the `inputsourceschange` event.\n\t\t *\n\t\t * @private\n\t\t * @type {Function}\n\t\t */\n\t\tthis._onInputSourcesChange = onInputSourcesChange.bind( this );\n\n\t\t/**\n\t\t * The animation loop which is used as a replacement for the default\n\t\t * animation loop of the application. It is only used when a XR session\n\t\t * is active.\n\t\t *\n\t\t * @private\n\t\t * @type {Function}\n\t\t */\n\t\tthis._onAnimationFrame = onAnimationFrame.bind( this );\n\n\t\t/**\n\t\t * The current XR reference space.\n\t\t *\n\t\t * @private\n\t\t * @type {?XRReferenceSpace}\n\t\t * @default null\n\t\t */\n\t\tthis._referenceSpace = null;\n\n\t\t/**\n\t\t * The current XR reference space type.\n\t\t *\n\t\t * @private\n\t\t * @type {XRReferenceSpaceType}\n\t\t * @default 'local-floor'\n\t\t */\n\t\tthis._referenceSpaceType = 'local-floor';\n\n\t\t/**\n\t\t * A custom reference space defined by the application.\n\t\t *\n\t\t * @private\n\t\t * @type {?XRReferenceSpace}\n\t\t * @default null\n\t\t */\n\t\tthis._customReferenceSpace = null;\n\n\t\t/**\n\t\t * The framebuffer scale factor.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis._framebufferScaleFactor = 1;\n\n\t\t/**\n\t\t * The foveation factor.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis._foveation = 1.0;\n\n\t\t/**\n\t\t * A reference to the current XR session.\n\t\t *\n\t\t * @private\n\t\t * @type {?XRSession}\n\t\t * @default null\n\t\t */\n\t\tthis._session = null;\n\n\t\t/**\n\t\t * A reference to the current XR base layer.\n\t\t *\n\t\t * @private\n\t\t * @type {?XRWebGLLayer}\n\t\t * @default null\n\t\t */\n\t\tthis._glBaseLayer = null;\n\n\t\t/**\n\t\t * A reference to the current XR binding.\n\t\t *\n\t\t * @private\n\t\t * @type {?XRWebGLBinding}\n\t\t * @default null\n\t\t */\n\t\tthis._glBinding = null;\n\n\t\t/**\n\t\t * A reference to the current XR projection layer.\n\t\t *\n\t\t * @private\n\t\t * @type {?XRProjectionLayer}\n\t\t * @default null\n\t\t */\n\t\tthis._glProjLayer = null;\n\n\t\t/**\n\t\t * A reference to the current XR frame.\n\t\t *\n\t\t * @private\n\t\t * @type {?XRFrame}\n\t\t * @default null\n\t\t */\n\t\tthis._xrFrame = null;\n\n\t\t/**\n\t\t * Whether the browser supports the APIs necessary to use XRProjectionLayers.\n\t\t *\n\t\t * Note: this does not represent XRSession explicitly requesting\n\t\t * `'layers'` as a feature - see `_sessionUsesLayers` and #30112\n\t\t *\n\t\t * @private\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t */\n\t\tthis._supportsLayers = ( this._supportsGlBinding && 'createProjectionLayer' in XRWebGLBinding.prototype ); // eslint-disable-line compat/compat\n\n\t\t/**\n\t\t * Whether the usage of multiview has been requested by the application or not.\n\t\t *\n\t\t * @private\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t * @readonly\n\t\t */\n\t\tthis._useMultiviewIfPossible = multiview;\n\n\t\t/**\n\t\t * Whether the usage of multiview is actually enabled. This flag only evaluates to `true`\n\t\t * if multiview has been requested by the application and the `OVR_multiview2` is available.\n\t\t *\n\t\t * @private\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t */\n\t\tthis._useMultiview = false;\n\n\t}\n\n\t/**\n\t * Returns an instance of `THREE.Group` that represents the transformation\n\t * of a XR controller in target ray space. The requested controller is defined\n\t * by the given index.\n\t *\n\t * @param {number} index - The index of the XR controller.\n\t * @return {Group} A group that represents the controller's transformation.\n\t */\n\tgetController( index ) {\n\n\t\tconst controller = this._getController( index );\n\n\t\treturn controller.getTargetRaySpace();\n\n\t}\n\n\t/**\n\t * Returns an instance of `THREE.Group` that represents the transformation\n\t * of a XR controller in grip space. The requested controller is defined\n\t * by the given index.\n\t *\n\t * @param {number} index - The index of the XR controller.\n\t * @return {Group} A group that represents the controller's transformation.\n\t */\n\tgetControllerGrip( index ) {\n\n\t\tconst controller = this._getController( index );\n\n\t\treturn controller.getGripSpace();\n\n\t}\n\n\t/**\n\t * Returns an instance of `THREE.Group` that represents the transformation\n\t * of a XR controller in hand space. The requested controller is defined\n\t * by the given index.\n\t *\n\t * @param {number} index - The index of the XR controller.\n\t * @return {Group} A group that represents the controller's transformation.\n\t */\n\tgetHand( index ) {\n\n\t\tconst controller = this._getController( index );\n\n\t\treturn controller.getHandSpace();\n\n\t}\n\n\t/**\n\t * Returns the foveation value.\n\t *\n\t * @return {number|undefined} The foveation value. Returns `undefined` if no base or projection layer is defined.\n\t */\n\tgetFoveation() {\n\n\t\tif ( this._glProjLayer === null && this._glBaseLayer === null ) {\n\n\t\t\treturn undefined;\n\n\t\t}\n\n\t\treturn this._foveation;\n\n\t}\n\n\t/**\n\t * Sets the foveation value.\n\t *\n\t * @param {number} foveation - A number in the range `[0,1]` where `0` means no foveation (full resolution)\n\t * and `1` means maximum foveation (the edges render at lower resolution).\n\t */\n\tsetFoveation( foveation ) {\n\n\t\tthis._foveation = foveation;\n\n\t\tif ( this._glProjLayer !== null ) {\n\n\t\t\tthis._glProjLayer.fixedFoveation = foveation;\n\n\t\t}\n\n\t\tif ( this._glBaseLayer !== null && this._glBaseLayer.fixedFoveation !== undefined ) {\n\n\t\t\tthis._glBaseLayer.fixedFoveation = foveation;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the framebuffer scale factor.\n\t *\n\t * @return {number} The framebuffer scale factor.\n\t */\n\tgetFramebufferScaleFactor() {\n\n\t\treturn this._framebufferScaleFactor;\n\n\t}\n\n\t/**\n\t * Sets the framebuffer scale factor.\n\t *\n\t * This method can not be used during a XR session.\n\t *\n\t * @param {number} factor - The framebuffer scale factor.\n\t */\n\tsetFramebufferScaleFactor( factor ) {\n\n\t\tthis._framebufferScaleFactor = factor;\n\n\t\tif ( this.isPresenting === true ) {\n\n\t\t\twarn( 'XRManager: Cannot change framebuffer scale while presenting.' );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the reference space type.\n\t *\n\t * @return {XRReferenceSpaceType} The reference space type.\n\t */\n\tgetReferenceSpaceType() {\n\n\t\treturn this._referenceSpaceType;\n\n\t}\n\n\t/**\n\t * Sets the reference space type.\n\t *\n\t * This method can not be used during a XR session.\n\t *\n\t * @param {XRReferenceSpaceType} type - The reference space type.\n\t */\n\tsetReferenceSpaceType( type ) {\n\n\t\tthis._referenceSpaceType = type;\n\n\t\tif ( this.isPresenting === true ) {\n\n\t\t\twarn( 'XRManager: Cannot change reference space type while presenting.' );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the XR reference space.\n\t *\n\t * @return {XRReferenceSpace} The XR reference space.\n\t */\n\tgetReferenceSpace() {\n\n\t\treturn this._customReferenceSpace || this._referenceSpace;\n\n\t}\n\n\t/**\n\t * Sets a custom XR reference space.\n\t *\n\t * @param {XRReferenceSpace} space - The XR reference space.\n\t */\n\tsetReferenceSpace( space ) {\n\n\t\tthis._customReferenceSpace = space;\n\n\t}\n\n\t/**\n\t * Returns the XR camera.\n\t *\n\t * @return {ArrayCamera} The XR camera.\n\t */\n\tgetCamera() {\n\n\t\treturn this._cameraXR;\n\n\t}\n\n\t/**\n\t * Returns the environment blend mode from the current XR session.\n\t *\n\t * @return {'opaque'|'additive'|'alpha-blend'|undefined} The environment blend mode. Returns `undefined` when used outside of a XR session.\n\t */\n\tgetEnvironmentBlendMode() {\n\n\t\tif ( this._session !== null ) {\n\n\t\t\treturn this._session.environmentBlendMode;\n\n\t\t}\n\n\t}\n\n\n\t/**\n\t * Returns the current XR binding.\n\t *\n\t * Creates a new binding if needed and the browser is\n\t * capable of doing so.\n\t *\n\t * @return {?XRWebGLBinding} The XR binding. Returns `null` if one cannot be created.\n\t */\n\tgetBinding() {\n\n\t\tif ( this._glBinding === null && this._supportsGlBinding ) {\n\n\t\t\tthis._glBinding = new XRWebGLBinding( this._session, this._gl );\n\n\t\t}\n\n\t\treturn this._glBinding;\n\n\t}\n\n\t/**\n\t * Returns the current XR frame.\n\t *\n\t * @return {?XRFrame} The XR frame. Returns `null` when used outside a XR session.\n\t */\n\tgetFrame() {\n\n\t\treturn this._xrFrame;\n\n\t}\n\n\t/**\n\t * Returns `true` if the engine renders to a multiview target.\n\t *\n\t * @return {boolean} Whether the engine renders to a multiview render target or not.\n\t */\n\tuseMultiview() {\n\n\t\treturn this._useMultiview;\n\n\t}\n\n\t/**\n\t * This method can be used in XR applications to create a quadratic layer that presents a separate\n\t * rendered scene.\n\t *\n\t * @param {number} width - The width of the layer plane in world units.\n\t * @param {number} height - The height of the layer plane in world units.\n\t * @param {Vector3} translation - The position/translation of the layer plane in world units.\n\t * @param {Quaternion} quaternion - The orientation of the layer plane expressed as a quaternion.\n\t * @param {number} pixelwidth - The width of the layer's render target in pixels.\n\t * @param {number} pixelheight - The height of the layer's render target in pixels.\n\t * @param {Function} rendercall - A callback function that renders the layer. Similar to code in\n\t * the default animation loop, this method can be used to update/transform 3D object in the layer's scene.\n\t * @param {Object} [attributes={}] - Allows to configure the layer's render target.\n\t * @return {Mesh} A mesh representing the quadratic XR layer. This mesh should be added to the XR scene.\n\t */\n\tcreateQuadLayer( width, height, translation, quaternion, pixelwidth, pixelheight, rendercall, attributes = {} ) {\n\n\t\tconst geometry = new PlaneGeometry( width, height );\n\t\tconst renderTarget = new XRRenderTarget(\n\t\t\tpixelwidth,\n\t\t\tpixelheight,\n\t\t\t{\n\t\t\t\tformat: RGBAFormat,\n\t\t\t\ttype: UnsignedByteType,\n\t\t\t\tdepthTexture: new DepthTexture(\n\t\t\t\t\tpixelwidth,\n\t\t\t\t\tpixelheight,\n\t\t\t\t\tattributes.stencil ? UnsignedInt248Type : UnsignedIntType,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tattributes.stencil ? DepthStencilFormat : DepthFormat\n\t\t\t\t),\n\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\tresolveDepthBuffer: false,\n\t\t\t\tresolveStencilBuffer: false\n\t\t\t} );\n\n\t\trenderTarget._autoAllocateDepthBuffer = true;\n\n\t\tconst material = new MeshBasicMaterial( { color: 0xffffff, side: FrontSide } );\n\t\tmaterial.map = renderTarget.texture;\n\t\tmaterial.map.offset.y = 1;\n\t\tmaterial.map.repeat.y = -1;\n\t\tconst plane = new Mesh( geometry, material );\n\t\tplane.position.copy( translation );\n\t\tplane.quaternion.copy( quaternion );\n\n\t\tconst layer = {\n\t\t\ttype: 'quad',\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\ttranslation: translation,\n\t\t\tquaternion: quaternion,\n\t\t\tpixelwidth: pixelwidth,\n\t\t\tpixelheight: pixelheight,\n\t\t\tplane: plane,\n\t\t\tmaterial: material,\n\t\t\trendercall: rendercall,\n\t\t\trenderTarget: renderTarget };\n\n\t\tthis._layers.push( layer );\n\n\t\tif ( this._session !== null ) {\n\n\t\t\tlayer.plane.material = new MeshBasicMaterial( { color: 0xffffff, side: FrontSide } );\n\t\t\tlayer.plane.material.blending = CustomBlending;\n\t\t\tlayer.plane.material.blendEquation = AddEquation;\n\t\t\tlayer.plane.material.blendSrc = ZeroFactor;\n\t\t\tlayer.plane.material.blendDst = ZeroFactor;\n\n\t\t\tlayer.xrlayer = this._createXRLayer( layer );\n\n\t\t\tconst xrlayers = this._session.renderState.layers;\n\t\t\txrlayers.unshift( layer.xrlayer );\n\t\t\tthis._session.updateRenderState( { layers: xrlayers } );\n\n\t\t} else {\n\n\t\t\trenderTarget.isXRRenderTarget = false;\n\n\t\t}\n\n\t\treturn plane;\n\n\t}\n\n\t/**\n\t * This method can be used in XR applications to create a cylindrical layer that presents a separate\n\t * rendered scene.\n\t *\n\t * @param {number} radius - The radius of the cylinder in world units.\n\t * @param {number} centralAngle - The central angle of the cylinder in radians.\n\t * @param {number} aspectratio - The aspect ratio.\n\t * @param {Vector3} translation - The position/translation of the layer plane in world units.\n\t * @param {Quaternion} quaternion - The orientation of the layer plane expressed as a quaternion.\n\t * @param {number} pixelwidth - The width of the layer's render target in pixels.\n\t * @param {number} pixelheight - The height of the layer's render target in pixels.\n\t * @param {Function} rendercall - A callback function that renders the layer. Similar to code in\n\t * the default animation loop, this method can be used to update/transform 3D object in the layer's scene.\n\t * @param {Object} [attributes={}] - Allows to configure the layer's render target.\n\t * @return {Mesh} A mesh representing the cylindrical XR layer. This mesh should be added to the XR scene.\n\t */\n\tcreateCylinderLayer( radius, centralAngle, aspectratio, translation, quaternion, pixelwidth, pixelheight, rendercall, attributes = {} ) {\n\n\t\tconst geometry = new CylinderGeometry( radius, radius, radius * centralAngle / aspectratio, 64, 64, true, Math.PI - centralAngle / 2, centralAngle );\n\t\tconst renderTarget = new XRRenderTarget(\n\t\t\tpixelwidth,\n\t\t\tpixelheight,\n\t\t\t{\n\t\t\t\tformat: RGBAFormat,\n\t\t\t\ttype: UnsignedByteType,\n\t\t\t\tdepthTexture: new DepthTexture(\n\t\t\t\t\tpixelwidth,\n\t\t\t\t\tpixelheight,\n\t\t\t\t\tattributes.stencil ? UnsignedInt248Type : UnsignedIntType,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tundefined,\n\t\t\t\t\tattributes.stencil ? DepthStencilFormat : DepthFormat\n\t\t\t\t),\n\t\t\t\tstencilBuffer: attributes.stencil,\n\t\t\t\tresolveDepthBuffer: false,\n\t\t\t\tresolveStencilBuffer: false\n\t\t\t} );\n\n\t\trenderTarget._autoAllocateDepthBuffer = true;\n\n\t\tconst material = new MeshBasicMaterial( { color: 0xffffff, side: BackSide } );\n\t\tmaterial.map = renderTarget.texture;\n\t\tmaterial.map.offset.y = 1;\n\t\tmaterial.map.repeat.y = -1;\n\t\tconst plane = new Mesh( geometry, material );\n\t\tplane.position.copy( translation );\n\t\tplane.quaternion.copy( quaternion );\n\n\t\tconst layer = {\n\t\t\ttype: 'cylinder',\n\t\t\tradius: radius,\n\t\t\tcentralAngle: centralAngle,\n\t\t\taspectratio: aspectratio,\n\t\t\ttranslation: translation,\n\t\t\tquaternion: quaternion,\n\t\t\tpixelwidth: pixelwidth,\n\t\t\tpixelheight: pixelheight,\n\t\t\tplane: plane,\n\t\t\tmaterial: material,\n\t\t\trendercall: rendercall,\n\t\t\trenderTarget: renderTarget };\n\n\t\tthis._layers.push( layer );\n\n\t\tif ( this._session !== null ) {\n\n\t\t\tlayer.plane.material = new MeshBasicMaterial( { color: 0xffffff, side: BackSide } );\n\t\t\tlayer.plane.material.blending = CustomBlending;\n\t\t\tlayer.plane.material.blendEquation = AddEquation;\n\t\t\tlayer.plane.material.blendSrc = ZeroFactor;\n\t\t\tlayer.plane.material.blendDst = ZeroFactor;\n\n\t\t\tlayer.xrlayer = this._createXRLayer( layer );\n\n\t\t\tconst xrlayers = this._session.renderState.layers;\n\t\t\txrlayers.unshift( layer.xrlayer );\n\t\t\tthis._session.updateRenderState( { layers: xrlayers } );\n\n\t\t} else {\n\n\t\t\trenderTarget.isXRRenderTarget = false;\n\n\t\t}\n\n\t\treturn plane;\n\n\t}\n\n\t/**\n\t * Renders the XR layers that have been previously added to the scene.\n\t *\n\t * This method is usually called in your animation loop before rendering\n\t * the actual scene via `renderer.render( scene, camera );`.\n\t */\n\trenderLayers( ) {\n\n\t\tconst translationObject = new Vector3();\n\t\tconst quaternionObject = new Quaternion();\n\t\tconst renderer = this._renderer;\n\n\t\tconst wasPresenting = this.isPresenting;\n\t\tconst rendererOutputTarget = renderer.getOutputRenderTarget();\n\t\tconst rendererFramebufferTarget = renderer._frameBufferTarget;\n\t\tthis.isPresenting = false;\n\n\t\tconst rendererSize = new Vector2();\n\t\trenderer.getSize( rendererSize );\n\t\tconst rendererQuad = renderer._quad;\n\n\t\tfor ( const layer of this._layers ) {\n\n\t\t\tlayer.renderTarget.isXRRenderTarget = this._session !== null;\n\t\t\tlayer.renderTarget._hasExternalTextures = layer.renderTarget.isXRRenderTarget;\n\n\t\t\tif ( layer.renderTarget.isXRRenderTarget && this._sessionUsesLayers ) {\n\n\t\t\t\tlayer.xrlayer.transform = new XRRigidTransform( layer.plane.getWorldPosition( translationObject ), layer.plane.getWorldQuaternion( quaternionObject ) );\n\n\t\t\t\tconst glSubImage = this._glBinding.getSubImage( layer.xrlayer, this._xrFrame );\n\t\t\t\trenderer.backend.setXRRenderTargetTextures(\n\t\t\t\t\tlayer.renderTarget,\n\t\t\t\t\tglSubImage.colorTexture,\n\t\t\t\t\tundefined );\n\n\t\t\t\trenderer._setXRLayerSize( layer.renderTarget.width, layer.renderTarget.height );\n\t\t\t\trenderer.setOutputRenderTarget( layer.renderTarget );\n\t\t\t\trenderer.setRenderTarget( null );\n\t\t\t\trenderer._frameBufferTarget = null;\n\n\t\t\t\tthis._frameBufferTargets || ( this._frameBufferTargets = new WeakMap() );\n\t\t\t\tconst { frameBufferTarget, quad } = this._frameBufferTargets.get( layer.renderTarget ) || { frameBufferTarget: null, quad: null };\n\t\t\t\tif ( ! frameBufferTarget ) {\n\n\t\t\t\t\trenderer._quad = new QuadMesh( new NodeMaterial() );\n\t\t\t\t\tthis._frameBufferTargets.set( layer.renderTarget, { frameBufferTarget: renderer._getFrameBufferTarget(), quad: renderer._quad } );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer._frameBufferTarget = frameBufferTarget;\n\t\t\t\t\trenderer._quad = quad;\n\n\t\t\t\t}\n\n\t\t\t\tlayer.rendercall();\n\n\t\t\t\trenderer._frameBufferTarget = null;\n\n\t\t\t} else {\n\n\t\t\t\trenderer.setRenderTarget( layer.renderTarget );\n\t\t\t\tlayer.rendercall();\n\n\t\t\t}\n\n\t\t}\n\n\t\trenderer.setRenderTarget( null );\n\t\trenderer.setOutputRenderTarget( rendererOutputTarget );\n\t\trenderer._frameBufferTarget = rendererFramebufferTarget;\n\t\trenderer._setXRLayerSize( rendererSize.x, rendererSize.y );\n\t\trenderer._quad = rendererQuad;\n\t\tthis.isPresenting = wasPresenting;\n\n\t}\n\n\n\t/**\n\t * Returns the current XR session.\n\t *\n\t * @return {?XRSession} The XR session. Returns `null` when used outside a XR session.\n\t */\n\tgetSession() {\n\n\t\treturn this._session;\n\n\t}\n\n\t/**\n\t * After a XR session has been requested usually with one of the `*Button` modules, it\n\t * is injected into the renderer with this method. This method triggers the start of\n\t * the actual XR rendering.\n\t *\n\t * @async\n\t * @param {XRSession} session - The XR session to set.\n\t * @return {Promise} A Promise that resolves when the session has been set.\n\t */\n\tasync setSession( session ) {\n\n\t\tconst renderer = this._renderer;\n\t\tconst backend = renderer.backend;\n\n\t\tthis._gl = renderer.getContext();\n\t\tconst gl = this._gl;\n\t\tconst attributes = gl.getContextAttributes();\n\n\t\tthis._session = session;\n\n\t\tif ( session !== null ) {\n\n\t\t\tif ( backend.isWebGPUBackend === true ) throw new Error( 'THREE.XRManager: XR is currently not supported with a WebGPU backend. Use WebGL by passing \"{ forceWebGL: true }\" to the constructor of the renderer.' );\n\n\t\t\tsession.addEventListener( 'select', this._onSessionEvent );\n\t\t\tsession.addEventListener( 'selectstart', this._onSessionEvent );\n\t\t\tsession.addEventListener( 'selectend', this._onSessionEvent );\n\t\t\tsession.addEventListener( 'squeeze', this._onSessionEvent );\n\t\t\tsession.addEventListener( 'squeezestart', this._onSessionEvent );\n\t\t\tsession.addEventListener( 'squeezeend', this._onSessionEvent );\n\t\t\tsession.addEventListener( 'end', this._onSessionEnd );\n\t\t\tsession.addEventListener( 'inputsourceschange', this._onInputSourcesChange );\n\n\t\t\tawait backend.makeXRCompatible();\n\n\t\t\tthis._currentPixelRatio = renderer.getPixelRatio();\n\t\t\trenderer.getSize( this._currentSize );\n\n\t\t\tthis._currentAnimationContext = renderer._animation.getContext();\n\t\t\tthis._currentAnimationLoop = renderer._animation.getAnimationLoop();\n\t\t\trenderer._animation.stop();\n\n\t\t\t//\n\n\t\t\tif ( this._supportsLayers === true ) {\n\n\t\t\t\t// default path using XRProjectionLayer\n\n\t\t\t\tlet depthFormat = null;\n\t\t\t\tlet depthType = null;\n\t\t\t\tlet glDepthFormat = null;\n\n\t\t\t\tif ( renderer.depth ) {\n\n\t\t\t\t\tglDepthFormat = renderer.stencil ? gl.DEPTH24_STENCIL8 : gl.DEPTH_COMPONENT24;\n\t\t\t\t\tdepthFormat = renderer.stencil ? DepthStencilFormat : DepthFormat;\n\t\t\t\t\tdepthType = renderer.stencil ? UnsignedInt248Type : UnsignedIntType;\n\n\t\t\t\t}\n\n\t\t\t\tconst projectionlayerInit = {\n\t\t\t\t\tcolorFormat: gl.RGBA8,\n\t\t\t\t\tdepthFormat: glDepthFormat,\n\t\t\t\t\tscaleFactor: this._framebufferScaleFactor,\n\t\t\t\t\tclearOnAccess: false\n\t\t\t\t};\n\n\t\t\t\tif ( this._useMultiviewIfPossible && renderer.hasFeature( 'OVR_multiview2' ) ) {\n\n\t\t\t\t\tprojectionlayerInit.textureType = 'texture-array';\n\t\t\t\t\tthis._useMultiview = true;\n\n\t\t\t\t}\n\n\t\t\t\tthis._glBinding = this.getBinding();\n\t\t\t\tconst glProjLayer = this._glBinding.createProjectionLayer( projectionlayerInit );\n\t\t\t\tconst layersArray = [ glProjLayer ];\n\n\t\t\t\tthis._glProjLayer = glProjLayer;\n\n\t\t\t\trenderer.setPixelRatio( 1 );\n\t\t\t\trenderer._setXRLayerSize( glProjLayer.textureWidth, glProjLayer.textureHeight );\n\n\t\t\t\tconst depth = this._useMultiview ? 2 : 1;\n\t\t\t\tconst depthTexture = new DepthTexture( glProjLayer.textureWidth, glProjLayer.textureHeight, depthType, undefined, undefined, undefined, undefined, undefined, undefined, depthFormat, depth );\n\n\t\t\t\tthis._xrRenderTarget = new XRRenderTarget(\n\t\t\t\t\tglProjLayer.textureWidth,\n\t\t\t\t\tglProjLayer.textureHeight,\n\t\t\t\t\t{\n\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\tcolorSpace: renderer.outputColorSpace,\n\t\t\t\t\t\tdepthTexture: depthTexture,\n\t\t\t\t\t\tstencilBuffer: renderer.stencil,\n\t\t\t\t\t\tsamples: attributes.antialias ? 4 : 0,\n\t\t\t\t\t\tresolveDepthBuffer: ( glProjLayer.ignoreDepthValues === false ),\n\t\t\t\t\t\tresolveStencilBuffer: ( glProjLayer.ignoreDepthValues === false ),\n\t\t\t\t\t\tdepth: this._useMultiview ? 2 : 1,\n\t\t\t\t\t\tmultiview: this._useMultiview\n\t\t\t\t\t} );\n\n\t\t\t\tthis._xrRenderTarget._hasExternalTextures = true;\n\t\t\t\tthis._xrRenderTarget.depth = this._useMultiview ? 2 : 1;\n\n\t\t\t\tthis._sessionUsesLayers = session.enabledFeatures.includes( 'layers' );\n\n\t\t\t\tthis._referenceSpace = await session.requestReferenceSpace( this.getReferenceSpaceType() );\n\n\t\t\t\tif ( this._sessionUsesLayers ) {\n\n\t\t\t\t\t// switch layers to native\n\t\t\t\t\tfor ( const layer of this._layers ) {\n\n\t\t\t\t\t\t// change material so it \"punches\" out a hole to show the XR Layer.\n\t\t\t\t\t\tlayer.plane.material = new MeshBasicMaterial( { color: 0xffffff, side: layer.type === 'cylinder' ? BackSide : FrontSide } );\n\t\t\t\t\t\tlayer.plane.material.blending = CustomBlending;\n\t\t\t\t\t\tlayer.plane.material.blendEquation = AddEquation;\n\t\t\t\t\t\tlayer.plane.material.blendSrc = ZeroFactor;\n\t\t\t\t\t\tlayer.plane.material.blendDst = ZeroFactor;\n\n\t\t\t\t\t\tlayer.xrlayer = this._createXRLayer( layer );\n\n\t\t\t\t\t\tlayersArray.unshift( layer.xrlayer );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tsession.updateRenderState( { layers: layersArray } );\n\n\t\t\t} else {\n\n\t\t\t\t// fallback to XRWebGLLayer\n\n\t\t\t\tconst layerInit = {\n\t\t\t\t\tantialias: renderer.currentSamples > 0,\n\t\t\t\t\talpha: true,\n\t\t\t\t\tdepth: renderer.depth,\n\t\t\t\t\tstencil: renderer.stencil,\n\t\t\t\t\tframebufferScaleFactor: this.getFramebufferScaleFactor()\n\t\t\t\t};\n\n\t\t\t\tconst glBaseLayer = new XRWebGLLayer( session, gl, layerInit );\n\t\t\t\tthis._glBaseLayer = glBaseLayer;\n\n\t\t\t\tsession.updateRenderState( { baseLayer: glBaseLayer } );\n\n\t\t\t\trenderer.setPixelRatio( 1 );\n\t\t\t\trenderer._setXRLayerSize( glBaseLayer.framebufferWidth, glBaseLayer.framebufferHeight );\n\n\t\t\t\tthis._xrRenderTarget = new XRRenderTarget(\n\t\t\t\t\tglBaseLayer.framebufferWidth,\n\t\t\t\t\tglBaseLayer.framebufferHeight,\n\t\t\t\t\t{\n\t\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\t\tcolorSpace: renderer.outputColorSpace,\n\t\t\t\t\t\tstencilBuffer: renderer.stencil,\n\t\t\t\t\t\tresolveDepthBuffer: ( glBaseLayer.ignoreDepthValues === false ),\n\t\t\t\t\t\tresolveStencilBuffer: ( glBaseLayer.ignoreDepthValues === false ),\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\tthis._xrRenderTarget._isOpaqueFramebuffer = true;\n\t\t\t\tthis._referenceSpace = await session.requestReferenceSpace( this.getReferenceSpaceType() );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tthis.setFoveation( this.getFoveation() );\n\n\t\t\trenderer._animation.setAnimationLoop( this._onAnimationFrame );\n\t\t\trenderer._animation.setContext( session );\n\t\t\trenderer._animation.start();\n\n\t\t\tthis.isPresenting = true;\n\n\t\t\tthis.dispatchEvent( { type: 'sessionstart' } );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * This method is called by the renderer per frame and updates the XR camera\n\t * and it sub cameras based on the given camera. The given camera is the \"user\"\n\t * camera created on application level and used for non-XR rendering.\n\t *\n\t * @param {PerspectiveCamera} camera - The camera.\n\t */\n\tupdateCamera( camera ) {\n\n\t\tconst session = this._session;\n\n\t\tif ( session === null ) return;\n\n\t\tconst depthNear = camera.near;\n\t\tconst depthFar = camera.far;\n\n\t\tconst cameraXR = this._cameraXR;\n\t\tconst cameraL = this._cameraL;\n\t\tconst cameraR = this._cameraR;\n\n\t\tcameraXR.near = cameraR.near = cameraL.near = depthNear;\n\t\tcameraXR.far = cameraR.far = cameraL.far = depthFar;\n\t\tcameraXR.isMultiViewCamera = this._useMultiview;\n\n\t\tif ( this._currentDepthNear !== cameraXR.near || this._currentDepthFar !== cameraXR.far ) {\n\n\t\t\t// Note that the new renderState won't apply until the next frame. See #18320\n\n\t\t\tsession.updateRenderState( {\n\t\t\t\tdepthNear: cameraXR.near,\n\t\t\t\tdepthFar: cameraXR.far\n\t\t\t} );\n\n\t\t\tthis._currentDepthNear = cameraXR.near;\n\t\t\tthis._currentDepthFar = cameraXR.far;\n\n\t\t}\n\n\t\t// inherit camera layers and enable eye layers (1 = left, 2 = right)\n\t\tcameraXR.layers.mask = camera.layers.mask | 0b110;\n\t\tcameraL.layers.mask = cameraXR.layers.mask & 0b011;\n\t\tcameraR.layers.mask = cameraXR.layers.mask & 0b101;\n\n\n\t\tconst parent = camera.parent;\n\t\tconst cameras = cameraXR.cameras;\n\n\t\tupdateCamera( cameraXR, parent );\n\n\t\tfor ( let i = 0; i < cameras.length; i ++ ) {\n\n\t\t\tupdateCamera( cameras[ i ], parent );\n\n\t\t}\n\n\t\t// update projection matrix for proper view frustum culling\n\n\t\tif ( cameras.length === 2 ) {\n\n\t\t\tsetProjectionFromUnion( cameraXR, cameraL, cameraR );\n\n\t\t} else {\n\n\t\t\t// assume single camera setup (AR)\n\n\t\t\tcameraXR.projectionMatrix.copy( cameraL.projectionMatrix );\n\n\t\t}\n\n\t\t// update user camera and its children\n\n\t\tupdateUserCamera( camera, cameraXR, parent );\n\n\n\t}\n\n\t/**\n\t * Returns a WebXR controller for the given controller index.\n\t *\n\t * @private\n\t * @param {number} index - The controller index.\n\t * @return {WebXRController} The XR controller.\n\t */\n\t_getController( index ) {\n\n\t\tlet controller = this._controllers[ index ];\n\n\t\tif ( controller === undefined ) {\n\n\t\t\tcontroller = new WebXRController();\n\t\t\tthis._controllers[ index ] = controller;\n\n\t\t}\n\n\t\treturn controller;\n\n\t}\n\n}\n\n/**\n * Assumes 2 cameras that are parallel and share an X-axis, and that\n * the cameras' projection and world matrices have already been set.\n * And that near and far planes are identical for both cameras.\n * Visualization of this technique: https://computergraphics.stackexchange.com/a/4765\n *\n * @param {ArrayCamera} camera - The camera to update.\n * @param {PerspectiveCamera} cameraL - The left camera.\n * @param {PerspectiveCamera} cameraR - The right camera.\n */\nfunction setProjectionFromUnion( camera, cameraL, cameraR ) {\n\n\t_cameraLPos.setFromMatrixPosition( cameraL.matrixWorld );\n\t_cameraRPos.setFromMatrixPosition( cameraR.matrixWorld );\n\n\tconst ipd = _cameraLPos.distanceTo( _cameraRPos );\n\n\tconst projL = cameraL.projectionMatrix.elements;\n\tconst projR = cameraR.projectionMatrix.elements;\n\n\t// VR systems will have identical far and near planes, and\n\t// most likely identical top and bottom frustum extents.\n\t// Use the left camera for these values.\n\tconst near = projL[ 14 ] / ( projL[ 10 ] - 1 );\n\tconst far = projL[ 14 ] / ( projL[ 10 ] + 1 );\n\tconst topFov = ( projL[ 9 ] + 1 ) / projL[ 5 ];\n\tconst bottomFov = ( projL[ 9 ] - 1 ) / projL[ 5 ];\n\n\tconst leftFov = ( projL[ 8 ] - 1 ) / projL[ 0 ];\n\tconst rightFov = ( projR[ 8 ] + 1 ) / projR[ 0 ];\n\tconst left = near * leftFov;\n\tconst right = near * rightFov;\n\n\t// Calculate the new camera's position offset from the\n\t// left camera. xOffset should be roughly half `ipd`.\n\tconst zOffset = ipd / ( - leftFov + rightFov );\n\tconst xOffset = zOffset * - leftFov;\n\n\t// TODO: Better way to apply this offset?\n\tcameraL.matrixWorld.decompose( camera.position, camera.quaternion, camera.scale );\n\tcamera.translateX( xOffset );\n\tcamera.translateZ( zOffset );\n\tcamera.matrixWorld.compose( camera.position, camera.quaternion, camera.scale );\n\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n\t// Check if the projection uses an infinite far plane.\n\tif ( projL[ 10 ] === -1 ) {\n\n\t\t// Use the projection matrix from the left eye.\n\t\t// The camera offset is sufficient to include the view volumes\n\t\t// of both eyes (assuming symmetric projections).\n\t\tcamera.projectionMatrix.copy( cameraL.projectionMatrix );\n\t\tcamera.projectionMatrixInverse.copy( cameraL.projectionMatrixInverse );\n\n\t} else {\n\n\t\t// Find the union of the frustum values of the cameras and scale\n\t\t// the values so that the near plane's position does not change in world space,\n\t\t// although must now be relative to the new union camera.\n\t\tconst near2 = near + zOffset;\n\t\tconst far2 = far + zOffset;\n\t\tconst left2 = left - xOffset;\n\t\tconst right2 = right + ( ipd - xOffset );\n\t\tconst top2 = topFov * far / far2 * near2;\n\t\tconst bottom2 = bottomFov * far / far2 * near2;\n\n\t\tcamera.projectionMatrix.makePerspective( left2, right2, top2, bottom2, near2, far2 );\n\t\tcamera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();\n\n\t}\n\n}\n\n/**\n * Updates the world matrices for the given camera based on the parent 3D object.\n *\n * @inner\n * @param {Camera} camera - The camera to update.\n * @param {Object3D} parent - The parent 3D object.\n */\nfunction updateCamera( camera, parent ) {\n\n\tif ( parent === null ) {\n\n\t\tcamera.matrixWorld.copy( camera.matrix );\n\n\t} else {\n\n\t\tcamera.matrixWorld.multiplyMatrices( parent.matrixWorld, camera.matrix );\n\n\t}\n\n\tcamera.matrixWorldInverse.copy( camera.matrixWorld ).invert();\n\n}\n\n/**\n * Updates the given camera with the transformation of the XR camera and parent object.\n *\n * @inner\n * @param {Camera} camera - The camera to update.\n * @param {ArrayCamera} cameraXR - The XR camera.\n * @param {Object3D} parent - The parent 3D object.\n */\nfunction updateUserCamera( camera, cameraXR, parent ) {\n\n\tif ( parent === null ) {\n\n\t\tcamera.matrix.copy( cameraXR.matrixWorld );\n\n\t} else {\n\n\t\tcamera.matrix.copy( parent.matrixWorld );\n\t\tcamera.matrix.invert();\n\t\tcamera.matrix.multiply( cameraXR.matrixWorld );\n\n\t}\n\n\tcamera.matrix.decompose( camera.position, camera.quaternion, camera.scale );\n\tcamera.updateMatrixWorld( true );\n\n\tcamera.projectionMatrix.copy( cameraXR.projectionMatrix );\n\tcamera.projectionMatrixInverse.copy( cameraXR.projectionMatrixInverse );\n\n\tif ( camera.isPerspectiveCamera ) {\n\n\t\tcamera.fov = RAD2DEG * 2 * Math.atan( 1 / camera.projectionMatrix.elements[ 5 ] );\n\t\tcamera.zoom = 1;\n\n\t}\n\n}\n\nfunction onSessionEvent( event ) {\n\n\tconst controllerIndex = this._controllerInputSources.indexOf( event.inputSource );\n\n\tif ( controllerIndex === -1 ) {\n\n\t\treturn;\n\n\t}\n\n\tconst controller = this._controllers[ controllerIndex ];\n\n\tif ( controller !== undefined ) {\n\n\t\tconst referenceSpace = this.getReferenceSpace();\n\n\t\tcontroller.update( event.inputSource, event.frame, referenceSpace );\n\t\tcontroller.dispatchEvent( { type: event.type, data: event.inputSource } );\n\n\t}\n\n}\n\nfunction onSessionEnd() {\n\n\tconst session = this._session;\n\tconst renderer = this._renderer;\n\n\tsession.removeEventListener( 'select', this._onSessionEvent );\n\tsession.removeEventListener( 'selectstart', this._onSessionEvent );\n\tsession.removeEventListener( 'selectend', this._onSessionEvent );\n\tsession.removeEventListener( 'squeeze', this._onSessionEvent );\n\tsession.removeEventListener( 'squeezestart', this._onSessionEvent );\n\tsession.removeEventListener( 'squeezeend', this._onSessionEvent );\n\tsession.removeEventListener( 'end', this._onSessionEnd );\n\tsession.removeEventListener( 'inputsourceschange', this._onInputSourcesChange );\n\n\tfor ( let i = 0; i < this._controllers.length; i ++ ) {\n\n\t\tconst inputSource = this._controllerInputSources[ i ];\n\n\t\tif ( inputSource === null ) continue;\n\n\t\tthis._controllerInputSources[ i ] = null;\n\n\t\tthis._controllers[ i ].disconnect( inputSource );\n\n\t}\n\n\tthis._currentDepthNear = null;\n\tthis._currentDepthFar = null;\n\n\t// restore framebuffer/rendering state\n\n\trenderer._resetXRState();\n\n\tthis._session = null;\n\tthis._xrRenderTarget = null;\n\tthis._glBinding = null;\n\tthis._glBaseLayer = null;\n\tthis._glProjLayer = null;\n\n\t// switch layers back to emulated\n\tif ( this._sessionUsesLayers === true ) {\n\n\t\tfor ( const layer of this._layers ) {\n\n\t\t\t// Recreate layer render target to reset state\n\t\t\tlayer.renderTarget = new XRRenderTarget(\n\t\t\t\tlayer.pixelwidth,\n\t\t\t\tlayer.pixelheight,\n\t\t\t\t{\n\t\t\t\t\tformat: RGBAFormat,\n\t\t\t\t\ttype: UnsignedByteType,\n\t\t\t\t\tdepthTexture: new DepthTexture(\n\t\t\t\t\t\tlayer.pixelwidth,\n\t\t\t\t\t\tlayer.pixelheight,\n\t\t\t\t\t\tlayer.stencilBuffer ? UnsignedInt248Type : UnsignedIntType,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t\tlayer.stencilBuffer ? DepthStencilFormat : DepthFormat\n\t\t\t\t\t),\n\t\t\t\t\tstencilBuffer: layer.stencilBuffer,\n\t\t\t\t\tresolveDepthBuffer: false,\n\t\t\t\t\tresolveStencilBuffer: false\n\t\t\t\t} );\n\n\t\t\tlayer.renderTarget.isXRRenderTarget = false;\n\n\t\t\tlayer.plane.material = layer.material;\n\t\t\tlayer.material.map = layer.renderTarget.texture;\n\t\t\tlayer.material.map.offset.y = 1;\n\t\t\tlayer.material.map.repeat.y = -1;\n\t\t\tdelete layer.xrlayer;\n\n\t\t}\n\n\t}\n\n\t//\n\n\tthis.isPresenting = false;\n\tthis._useMultiview = false;\n\n\trenderer._animation.stop();\n\trenderer._animation.setAnimationLoop( this._currentAnimationLoop );\n\trenderer._animation.setContext( this._currentAnimationContext );\n\trenderer._animation.start();\n\n\trenderer.setPixelRatio( this._currentPixelRatio );\n\trenderer.setSize( this._currentSize.width, this._currentSize.height, false );\n\n\tthis.dispatchEvent( { type: 'sessionend' } );\n\n}\n\nfunction onInputSourcesChange( event ) {\n\n\tconst controllers = this._controllers;\n\tconst controllerInputSources = this._controllerInputSources;\n\n\t// Notify disconnected\n\n\tfor ( let i = 0; i < event.removed.length; i ++ ) {\n\n\t\tconst inputSource = event.removed[ i ];\n\t\tconst index = controllerInputSources.indexOf( inputSource );\n\n\t\tif ( index >= 0 ) {\n\n\t\t\tcontrollerInputSources[ index ] = null;\n\t\t\tcontrollers[ index ].disconnect( inputSource );\n\n\t\t}\n\n\t}\n\n\t// Notify connected\n\n\tfor ( let i = 0; i < event.added.length; i ++ ) {\n\n\t\tconst inputSource = event.added[ i ];\n\n\t\tlet controllerIndex = controllerInputSources.indexOf( inputSource );\n\n\t\tif ( controllerIndex === -1 ) {\n\n\t\t\t// Assign input source a controller that currently has no input source\n\n\t\t\tfor ( let i = 0; i < controllers.length; i ++ ) {\n\n\t\t\t\tif ( i >= controllerInputSources.length ) {\n\n\t\t\t\t\tcontrollerInputSources.push( inputSource );\n\t\t\t\t\tcontrollerIndex = i;\n\t\t\t\t\tbreak;\n\n\t\t\t\t} else if ( controllerInputSources[ i ] === null ) {\n\n\t\t\t\t\tcontrollerInputSources[ i ] = inputSource;\n\t\t\t\t\tcontrollerIndex = i;\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// If all controllers do currently receive input we ignore new ones\n\n\t\t\tif ( controllerIndex === -1 ) break;\n\n\t\t}\n\n\t\tconst controller = controllers[ controllerIndex ];\n\n\t\tif ( controller ) {\n\n\t\t\tcontroller.connect( inputSource );\n\n\t\t}\n\n\t}\n\n}\n\n// Creation method for native WebXR layers\nfunction createXRLayer( layer ) {\n\n\tif ( layer.type === 'quad' ) {\n\n\t\treturn this._glBinding.createQuadLayer( {\n\t\t\ttransform: new XRRigidTransform( layer.translation, layer.quaternion ),\n\t\t\twidth: layer.width / 2,\n\t\t\theight: layer.height / 2,\n\t\t\tspace: this._referenceSpace,\n\t\t\tviewPixelWidth: layer.pixelwidth,\n\t\t\tviewPixelHeight: layer.pixelheight,\n\t\t\tclearOnAccess: false\n\t\t} );\n\n\t} else {\n\n\t\treturn this._glBinding.createCylinderLayer( {\n\t\t\ttransform: new XRRigidTransform( layer.translation, layer.quaternion ),\n\t\t\tradius: layer.radius,\n\t\t\tcentralAngle: layer.centralAngle,\n\t\t\taspectRatio: layer.aspectRatio,\n\t\t\tspace: this._referenceSpace,\n\t\t\tviewPixelWidth: layer.pixelwidth,\n\t\t\tviewPixelHeight: layer.pixelheight,\n\t\t\tclearOnAccess: false\n\t\t} );\n\n\t}\n\n}\n\n// Animation Loop\n\nfunction onAnimationFrame( time, frame ) {\n\n\tif ( frame === undefined ) return;\n\n\tconst cameraXR = this._cameraXR;\n\tconst renderer = this._renderer;\n\tconst backend = renderer.backend;\n\n\tconst glBaseLayer = this._glBaseLayer;\n\n\tconst referenceSpace = this.getReferenceSpace();\n\tconst pose = frame.getViewerPose( referenceSpace );\n\n\tthis._xrFrame = frame;\n\n\tif ( pose !== null ) {\n\n\t\tconst views = pose.views;\n\n\t\tif ( this._glBaseLayer !== null ) {\n\n\t\t\tbackend.setXRTarget( glBaseLayer.framebuffer );\n\n\t\t}\n\n\t\tlet cameraXRNeedsUpdate = false;\n\n\t\t// check if it's necessary to rebuild cameraXR's camera list\n\n\t\tif ( views.length !== cameraXR.cameras.length ) {\n\n\t\t\tcameraXR.cameras.length = 0;\n\t\t\tcameraXRNeedsUpdate = true;\n\n\t\t}\n\n\t\tfor ( let i = 0; i < views.length; i ++ ) {\n\n\t\t\tconst view = views[ i ];\n\n\t\t\tlet viewport;\n\n\t\t\tif ( this._supportsLayers === true ) {\n\n\t\t\t\tconst glSubImage = this._glBinding.getViewSubImage( this._glProjLayer, view );\n\t\t\t\tviewport = glSubImage.viewport;\n\n\t\t\t\t// For side-by-side projection, we only produce a single texture for both eyes.\n\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\tbackend.setXRRenderTargetTextures(\n\t\t\t\t\t\tthis._xrRenderTarget,\n\t\t\t\t\t\tglSubImage.colorTexture,\n\t\t\t\t\t\t( this._glProjLayer.ignoreDepthValues && ! this._useMultiview ) ? undefined : glSubImage.depthStencilTexture\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tviewport = glBaseLayer.getViewport( view );\n\n\t\t\t}\n\n\t\t\tlet camera = this._cameras[ i ];\n\n\t\t\tif ( camera === undefined ) {\n\n\t\t\t\tcamera = new PerspectiveCamera();\n\t\t\t\tcamera.layers.enable( i );\n\t\t\t\tcamera.viewport = new Vector4();\n\t\t\t\tthis._cameras[ i ] = camera;\n\n\t\t\t}\n\n\t\t\tcamera.matrix.fromArray( view.transform.matrix );\n\t\t\tcamera.matrix.decompose( camera.position, camera.quaternion, camera.scale );\n\t\t\tcamera.projectionMatrix.fromArray( view.projectionMatrix );\n\t\t\tcamera.projectionMatrixInverse.copy( camera.projectionMatrix ).invert();\n\t\t\tcamera.viewport.set( viewport.x, viewport.y, viewport.width, viewport.height );\n\n\t\t\tif ( i === 0 ) {\n\n\t\t\t\tcameraXR.matrix.copy( camera.matrix );\n\t\t\t\tcameraXR.matrix.decompose( cameraXR.position, cameraXR.quaternion, cameraXR.scale );\n\n\t\t\t}\n\n\t\t\tif ( cameraXRNeedsUpdate === true ) {\n\n\t\t\t\tcameraXR.cameras.push( camera );\n\n\t\t\t}\n\n\t\t}\n\n\t\trenderer.setOutputRenderTarget( this._xrRenderTarget );\n\n\t}\n\n\t//\n\n\tfor ( let i = 0; i < this._controllers.length; i ++ ) {\n\n\t\tconst inputSource = this._controllerInputSources[ i ];\n\t\tconst controller = this._controllers[ i ];\n\n\t\tif ( inputSource !== null && controller !== undefined ) {\n\n\t\t\tcontroller.update( inputSource, frame, referenceSpace );\n\n\t\t}\n\n\t}\n\n\tif ( this._currentAnimationLoop ) this._currentAnimationLoop( time, frame );\n\n\tif ( frame.detectedPlanes ) {\n\n\t\tthis.dispatchEvent( { type: 'planesdetected', data: frame } );\n\n\t}\n\n\tthis._xrFrame = null;\n\n}\n\n/**\n * CanvasTarget is a class that represents the final output destination of the renderer.\n *\n * @augments EventDispatcher\n */\nclass CanvasTarget extends EventDispatcher {\n\n\t/**\n\t * Constructs a new CanvasTarget.\n\t *\n\t * @param {HTMLCanvasElement|OffscreenCanvas} domElement - The canvas element to render to.\n\t */\n\tconstructor( domElement ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * A reference to the canvas element the renderer is drawing to.\n\t\t * This value of this property will automatically be created by\n\t\t * the renderer.\n\t\t *\n\t\t * @type {HTMLCanvasElement|OffscreenCanvas}\n\t\t */\n\t\tthis.domElement = domElement;\n\n\t\t/**\n\t\t * The renderer's pixel ratio.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis._pixelRatio = 1;\n\n\t\t/**\n\t\t * The width of the renderer's default framebuffer in logical pixel unit.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t */\n\t\tthis._width = this.domElement.width;\n\n\t\t/**\n\t\t * The height of the renderer's default framebuffer in logical pixel unit.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t */\n\t\tthis._height = this.domElement.height;\n\n\t\t/**\n\t\t * The viewport of the renderer in logical pixel unit.\n\t\t *\n\t\t * @private\n\t\t * @type {Vector4}\n\t\t */\n\t\tthis._viewport = new Vector4( 0, 0, this._width, this._height );\n\n\t\t/**\n\t\t * The scissor rectangle of the renderer in logical pixel unit.\n\t\t *\n\t\t * @private\n\t\t * @type {Vector4}\n\t\t */\n\t\tthis._scissor = new Vector4( 0, 0, this._width, this._height );\n\n\t\t/**\n\t\t * Whether the scissor test should be enabled or not.\n\t\t *\n\t\t * @private\n\t\t * @type {boolean}\n\t\t */\n\t\tthis._scissorTest = false;\n\n\t\t/**\n\t\t * The color texture of the default framebuffer.\n\t\t *\n\t\t * @type {FramebufferTexture}\n\t\t */\n\t\tthis.colorTexture = new FramebufferTexture();\n\n\t\t/**\n\t\t * The depth texture of the default framebuffer.\n\t\t *\n\t\t * @type {DepthTexture}\n\t\t */\n\t\tthis.depthTexture = new DepthTexture();\n\n\t}\n\n\t/**\n\t * Returns the pixel ratio.\n\t *\n\t * @return {number} The pixel ratio.\n\t */\n\tgetPixelRatio() {\n\n\t\treturn this._pixelRatio;\n\n\t}\n\n\t/**\n\t * Returns the drawing buffer size in physical pixels. This method honors the pixel ratio.\n\t *\n\t * @param {Vector2} target - The method writes the result in this target object.\n\t * @return {Vector2} The drawing buffer size.\n\t */\n\tgetDrawingBufferSize( target ) {\n\n\t\treturn target.set( this._width * this._pixelRatio, this._height * this._pixelRatio ).floor();\n\n\t}\n\n\t/**\n\t * Returns the renderer's size in logical pixels. This method does not honor the pixel ratio.\n\t *\n\t * @param {Vector2} target - The method writes the result in this target object.\n\t * @return {Vector2} The renderer's size in logical pixels.\n\t */\n\tgetSize( target ) {\n\n\t\treturn target.set( this._width, this._height );\n\n\t}\n\n\t/**\n\t * Sets the given pixel ratio and resizes the canvas if necessary.\n\t *\n\t * @param {number} [value=1] - The pixel ratio.\n\t */\n\tsetPixelRatio( value = 1 ) {\n\n\t\tif ( this._pixelRatio === value ) return;\n\n\t\tthis._pixelRatio = value;\n\n\t\tthis.setSize( this._width, this._height, false );\n\n\t}\n\n\t/**\n\t * This method allows to define the drawing buffer size by specifying\n\t * width, height and pixel ratio all at once. The size of the drawing\n\t * buffer is computed with this formula:\n\t * ```js\n\t * size.x = width * pixelRatio;\n\t * size.y = height * pixelRatio;\n\t * ```\n\t *\n\t * @param {number} width - The width in logical pixels.\n\t * @param {number} height - The height in logical pixels.\n\t * @param {number} pixelRatio - The pixel ratio.\n\t */\n\tsetDrawingBufferSize( width, height, pixelRatio ) {\n\n\t\t// Renderer can't be resized while presenting in XR.\n\t\tif ( this.xr && this.xr.isPresenting ) return;\n\n\t\tthis._width = width;\n\t\tthis._height = height;\n\n\t\tthis._pixelRatio = pixelRatio;\n\n\t\tthis.domElement.width = Math.floor( width * pixelRatio );\n\t\tthis.domElement.height = Math.floor( height * pixelRatio );\n\n\t\tthis.setViewport( 0, 0, width, height );\n\n\t\tthis._dispatchResize();\n\n\t}\n\n\t/**\n\t * Sets the size of the renderer.\n\t *\n\t * @param {number} width - The width in logical pixels.\n\t * @param {number} height - The height in logical pixels.\n\t * @param {boolean} [updateStyle=true] - Whether to update the `style` attribute of the canvas or not.\n\t */\n\tsetSize( width, height, updateStyle = true ) {\n\n\t\t// Renderer can't be resized while presenting in XR.\n\t\tif ( this.xr && this.xr.isPresenting ) return;\n\n\t\tthis._width = width;\n\t\tthis._height = height;\n\n\t\tthis.domElement.width = Math.floor( width * this._pixelRatio );\n\t\tthis.domElement.height = Math.floor( height * this._pixelRatio );\n\n\t\tif ( updateStyle === true ) {\n\n\t\t\tthis.domElement.style.width = width + 'px';\n\t\t\tthis.domElement.style.height = height + 'px';\n\n\t\t}\n\n\t\tthis.setViewport( 0, 0, width, height );\n\n\t\tthis._dispatchResize();\n\n\t}\n\n\t/**\n\t * Returns the scissor rectangle.\n\t *\n\t * @param {Vector4} target - The method writes the result in this target object.\n\t * @return {Vector4} The scissor rectangle.\n\t */\n\tgetScissor( target ) {\n\n\t\tconst scissor = this._scissor;\n\n\t\ttarget.x = scissor.x;\n\t\ttarget.y = scissor.y;\n\t\ttarget.width = scissor.width;\n\t\ttarget.height = scissor.height;\n\n\t\treturn target;\n\n\t}\n\n\t/**\n\t * Defines the scissor rectangle.\n\t *\n\t * @param {number | Vector4} x - The horizontal coordinate for the lower left corner of the box in logical pixel unit.\n\t * Instead of passing four arguments, the method also works with a single four-dimensional vector.\n\t * @param {number} y - The vertical coordinate for the lower left corner of the box in logical pixel unit.\n\t * @param {number} width - The width of the scissor box in logical pixel unit.\n\t * @param {number} height - The height of the scissor box in logical pixel unit.\n\t */\n\tsetScissor( x, y, width, height ) {\n\n\t\tconst scissor = this._scissor;\n\n\t\tif ( x.isVector4 ) {\n\n\t\t\tscissor.copy( x );\n\n\t\t} else {\n\n\t\t\tscissor.set( x, y, width, height );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the scissor test value.\n\t *\n\t * @return {boolean} Whether the scissor test should be enabled or not.\n\t */\n\tgetScissorTest() {\n\n\t\treturn this._scissorTest;\n\n\t}\n\n\t/**\n\t * Defines the scissor test.\n\t *\n\t * @param {boolean} boolean - Whether the scissor test should be enabled or not.\n\t */\n\tsetScissorTest( boolean ) {\n\n\t\tthis._scissorTest = boolean;\n\n\t}\n\n\t/**\n\t * Returns the viewport definition.\n\t *\n\t * @param {Vector4} target - The method writes the result in this target object.\n\t * @return {Vector4} The viewport definition.\n\t */\n\tgetViewport( target ) {\n\n\t\treturn target.copy( this._viewport );\n\n\t}\n\n\t/**\n\t * Defines the viewport.\n\t *\n\t * @param {number | Vector4} x - The horizontal coordinate for the lower left corner of the viewport origin in logical pixel unit.\n\t * @param {number} y - The vertical coordinate for the lower left corner of the viewport origin  in logical pixel unit.\n\t * @param {number} width - The width of the viewport in logical pixel unit.\n\t * @param {number} height - The height of the viewport in logical pixel unit.\n\t * @param {number} minDepth - The minimum depth value of the viewport. WebGPU only.\n\t * @param {number} maxDepth - The maximum depth value of the viewport. WebGPU only.\n\t */\n\tsetViewport( x, y, width, height, minDepth = 0, maxDepth = 1 ) {\n\n\t\tconst viewport = this._viewport;\n\n\t\tif ( x.isVector4 ) {\n\n\t\t\tviewport.copy( x );\n\n\t\t} else {\n\n\t\t\tviewport.set( x, y, width, height );\n\n\t\t}\n\n\t\tviewport.minDepth = minDepth;\n\t\tviewport.maxDepth = maxDepth;\n\n\t}\n\n\t/**\n\t * Dispatches the resize event.\n\t *\n\t * @private\n\t */\n\t_dispatchResize() {\n\n\t\tthis.dispatchEvent( { type: 'resize' } );\n\n\t}\n\n\t/**\n\t * Frees the GPU-related resources allocated by this instance. Call this\n\t * method whenever this instance is no longer used in your app.\n\t *\n\t * @fires RenderTarget#dispose\n\t */\n\tdispose() {\n\n\t\tthis.dispatchEvent( { type: 'dispose' } );\n\n\t}\n\n}\n\nconst _scene = /*@__PURE__*/ new Scene();\nconst _drawingBufferSize = /*@__PURE__*/ new Vector2();\nconst _screen = /*@__PURE__*/ new Vector4();\nconst _frustum = /*@__PURE__*/ new Frustum();\nconst _frustumArray = /*@__PURE__*/ new FrustumArray();\n\nconst _projScreenMatrix = /*@__PURE__*/ new Matrix4();\nconst _vector4 = /*@__PURE__*/ new Vector4();\n\n/**\n * Base class for renderers.\n */\nclass Renderer {\n\n\t/**\n\t * Renderer options.\n\t *\n\t * @typedef {Object} Renderer~Options\n\t * @property {boolean} [logarithmicDepthBuffer=false] - Whether logarithmic depth buffer is enabled or not.\n\t * @property {boolean} [alpha=true] - Whether the default framebuffer (which represents the final contents of the canvas) should be transparent or opaque.\n\t * @property {boolean} [depth=true] - Whether the default framebuffer should have a depth buffer or not.\n\t * @property {boolean} [stencil=false] - Whether the default framebuffer should have a stencil buffer or not.\n\t * @property {boolean} [antialias=false] - Whether MSAA as the default anti-aliasing should be enabled or not.\n\t * @property {number} [samples=0] - When `antialias` is `true`, `4` samples are used by default. This parameter can set to any other integer value than 0\n\t * to overwrite the default.\n\t * @property {?Function} [getFallback=null] - This callback function can be used to provide a fallback backend, if the primary backend can't be targeted.\n\t * @property {number} [outputBufferType=HalfFloatType] - Defines the type of output buffers. The default `HalfFloatType` is recommend for best\n\t * quality. To save memory and bandwidth, `UnsignedByteType` might be used. This will reduce rendering quality though.\n\t * @property {boolean} [multiview=false] - If set to `true`, the renderer will use multiview during WebXR rendering if supported.\n\t */\n\n\t/**\n\t * Constructs a new renderer.\n\t *\n\t * @param {Backend} backend - The backend the renderer is targeting (e.g. WebGPU or WebGL 2).\n\t * @param {Renderer~Options} [parameters] - The configuration parameter.\n\n\t */\n\tconstructor( backend, parameters = {} ) {\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isRenderer = true;\n\n\t\t//\n\n\t\tconst {\n\t\t\tlogarithmicDepthBuffer = false,\n\t\t\talpha = true,\n\t\t\tdepth = true,\n\t\t\tstencil = false,\n\t\t\tantialias = false,\n\t\t\tsamples = 0,\n\t\t\tgetFallback = null,\n\t\t\toutputBufferType = HalfFloatType,\n\t\t\tmultiview = false\n\t\t} = parameters;\n\n\t\t/**\n\t\t * A reference to the current backend.\n\t\t *\n\t\t * @type {Backend}\n\t\t */\n\t\tthis.backend = backend;\n\n\t\t/**\n\t\t * Whether the renderer should automatically clear the current rendering target\n\t\t * before execute a `render()` call. The target can be the canvas (default framebuffer)\n\t\t * or the current bound render target (custom framebuffer).\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClear = true;\n\n\t\t/**\n\t\t * When `autoClear` is set to `true`, this property defines whether the renderer\n\t\t * should clear the color buffer.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClearColor = true;\n\n\t\t/**\n\t\t * When `autoClear` is set to `true`, this property defines whether the renderer\n\t\t * should clear the depth buffer.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClearDepth = true;\n\n\t\t/**\n\t\t * When `autoClear` is set to `true`, this property defines whether the renderer\n\t\t * should clear the stencil buffer.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.autoClearStencil = true;\n\n\t\t/**\n\t\t * Whether the default framebuffer should be transparent or opaque.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.alpha = alpha;\n\n\t\t/**\n\t\t * Whether logarithmic depth buffer is enabled or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.logarithmicDepthBuffer = logarithmicDepthBuffer;\n\n\t\t/**\n\t\t * Defines the output color space of the renderer.\n\t\t *\n\t\t * @type {string}\n\t\t * @default SRGBColorSpace\n\t\t */\n\t\tthis.outputColorSpace = SRGBColorSpace;\n\n\t\t/**\n\t\t * Defines the tone mapping of the renderer.\n\t\t *\n\t\t * @type {number}\n\t\t * @default NoToneMapping\n\t\t */\n\t\tthis.toneMapping = NoToneMapping;\n\n\t\t/**\n\t\t * Defines the tone mapping exposure.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis.toneMappingExposure = 1.0;\n\n\t\t/**\n\t\t * Whether the renderer should sort its render lists or not.\n\t\t *\n\t\t * Note: Sorting is used to attempt to properly render objects that have some degree of transparency.\n\t\t * By definition, sorting objects may not work in all cases. Depending on the needs of application,\n\t\t * it may be necessary to turn off sorting and use other methods to deal with transparency rendering\n\t\t * e.g. manually determining each object's rendering order.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.sortObjects = true;\n\n\t\t/**\n\t\t * Whether the default framebuffer should have a depth buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.depth = depth;\n\n\t\t/**\n\t\t * Whether the default framebuffer should have a stencil buffer or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.stencil = stencil;\n\n\t\t/**\n\t\t * Holds a series of statistical information about the GPU memory\n\t\t * and the rendering process. Useful for debugging and monitoring.\n\t\t *\n\t\t * @type {Info}\n\t\t */\n\t\tthis.info = new Info();\n\n\t\t/**\n\t\t * A global context node that stores override nodes for specific transformations or calculations.\n\t\t * These nodes can be used to replace default behavior in the rendering pipeline.\n\t\t *\n\t\t * @type {ContextNode}\n\t\t * @property {Object} value - The context value object.\n\t\t */\n\t\tthis.contextNode = context();\n\n\t\t/**\n\t\t * The node library defines how certain library objects like materials, lights\n\t\t * or tone mapping functions are mapped to node types. This is required since\n\t\t * although instances of classes like `MeshBasicMaterial` or `PointLight` can\n\t\t * be part of the scene graph, they are internally represented as nodes for\n\t\t * further processing.\n\t\t *\n\t\t * @type {NodeLibrary}\n\t\t */\n\t\tthis.library = new NodeLibrary();\n\n\t\t/**\n\t\t * A map-like data structure for managing lights.\n\t\t *\n\t\t * @type {Lighting}\n\t\t */\n\t\tthis.lighting = new Lighting();\n\n\t\t// internals\n\n\t\t/**\n\t\t * The number of MSAA samples.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis._samples = samples || ( antialias === true ) ? 4 : 0;\n\n\t\t/**\n\t\t * OnCanvasTargetResize callback function.\n\t\t *\n\t\t * @private\n\t\t * @type {Function}\n\t\t */\n\t\tthis._onCanvasTargetResize = this._onCanvasTargetResize.bind( this );\n\n\t\t/**\n\t\t * The canvas target for rendering.\n\t\t *\n\t\t * @private\n\t\t * @type {CanvasTarget}\n\t\t */\n\t\tthis._canvasTarget = new CanvasTarget( backend.getDomElement() );\n\t\tthis._canvasTarget.addEventListener( 'resize', this._onCanvasTargetResize );\n\t\tthis._canvasTarget.isDefaultCanvasTarget = true;\n\n\t\t/**\n\t\t * The inspector provides information about the internal renderer state.\n\t\t *\n\t\t * @private\n\t\t * @type {InspectorBase}\n\t\t */\n\t\tthis._inspector = new InspectorBase();\n\t\tthis._inspector.setRenderer( this );\n\n\t\t/**\n\t\t * This callback function can be used to provide a fallback backend, if the primary backend can't be targeted.\n\t\t *\n\t\t * @private\n\t\t * @type {?Function}\n\t\t */\n\t\tthis._getFallback = getFallback;\n\n\t\t/**\n\t\t * A reference to a renderer module for managing shader attributes.\n\t\t *\n\t\t * @private\n\t\t * @type {?Attributes}\n\t\t * @default null\n\t\t */\n\t\tthis._attributes = null;\n\n\t\t/**\n\t\t * A reference to a renderer module for managing geometries.\n\t\t *\n\t\t * @private\n\t\t * @type {?Geometries}\n\t\t * @default null\n\t\t */\n\t\tthis._geometries = null;\n\n\t\t/**\n\t\t * A reference to a renderer module for managing node related logic.\n\t\t *\n\t\t * @private\n\t\t * @type {?Nodes}\n\t\t * @default null\n\t\t */\n\t\tthis._nodes = null;\n\n\t\t/**\n\t\t * A reference to a renderer module for managing the internal animation loop.\n\t\t *\n\t\t * @private\n\t\t * @type {?Animation}\n\t\t * @default null\n\t\t */\n\t\tthis._animation = null;\n\n\t\t/**\n\t\t * A reference to a renderer module for managing shader program bindings.\n\t\t *\n\t\t * @private\n\t\t * @type {?Bindings}\n\t\t * @default null\n\t\t */\n\t\tthis._bindings = null;\n\n\t\t/**\n\t\t * A reference to a renderer module for managing render objects.\n\t\t *\n\t\t * @private\n\t\t * @type {?RenderObjects}\n\t\t * @default null\n\t\t */\n\t\tthis._objects = null;\n\n\t\t/**\n\t\t * A reference to a renderer module for managing render and compute pipelines.\n\t\t *\n\t\t * @private\n\t\t * @type {?Pipelines}\n\t\t * @default null\n\t\t */\n\t\tthis._pipelines = null;\n\n\t\t/**\n\t\t * A reference to a renderer module for managing render bundles.\n\t\t *\n\t\t * @private\n\t\t * @type {?RenderBundles}\n\t\t * @default null\n\t\t */\n\t\tthis._bundles = null;\n\n\t\t/**\n\t\t * A reference to a renderer module for managing render lists.\n\t\t *\n\t\t * @private\n\t\t * @type {?RenderLists}\n\t\t * @default null\n\t\t */\n\t\tthis._renderLists = null;\n\n\t\t/**\n\t\t * A reference to a renderer module for managing render contexts.\n\t\t *\n\t\t * @private\n\t\t * @type {?RenderContexts}\n\t\t * @default null\n\t\t */\n\t\tthis._renderContexts = null;\n\n\t\t/**\n\t\t * A reference to a renderer module for managing textures.\n\t\t *\n\t\t * @private\n\t\t * @type {?Textures}\n\t\t * @default null\n\t\t */\n\t\tthis._textures = null;\n\n\t\t/**\n\t\t * A reference to a renderer module for backgrounds.\n\t\t *\n\t\t * @private\n\t\t * @type {?Background}\n\t\t * @default null\n\t\t */\n\t\tthis._background = null;\n\n\t\t/**\n\t\t * This fullscreen quad is used for internal render passes\n\t\t * like the tone mapping and color space output pass.\n\t\t *\n\t\t * @private\n\t\t * @type {QuadMesh}\n\t\t */\n\t\tthis._quad = new QuadMesh( new NodeMaterial() );\n\t\tthis._quad.name = 'Output Color Transform';\n\t\tthis._quad.material.name = 'outputColorTransform';\n\n\t\t/**\n\t\t * A reference to the current render context.\n\t\t *\n\t\t * @private\n\t\t * @type {?RenderContext}\n\t\t * @default null\n\t\t */\n\t\tthis._currentRenderContext = null;\n\n\t\t/**\n\t\t * A custom sort function for the opaque render list.\n\t\t *\n\t\t * @private\n\t\t * @type {?Function}\n\t\t * @default null\n\t\t */\n\t\tthis._opaqueSort = null;\n\n\t\t/**\n\t\t * A custom sort function for the transparent render list.\n\t\t *\n\t\t * @private\n\t\t * @type {?Function}\n\t\t * @default null\n\t\t */\n\t\tthis._transparentSort = null;\n\n\t\t/**\n\t\t * The framebuffer target.\n\t\t *\n\t\t * @private\n\t\t * @type {?RenderTarget}\n\t\t * @default null\n\t\t */\n\t\tthis._frameBufferTarget = null;\n\n\t\tconst alphaClear = this.alpha === true ? 0 : 1;\n\n\t\t/**\n\t\t * The clear color value.\n\t\t *\n\t\t * @private\n\t\t * @type {Color4}\n\t\t */\n\t\tthis._clearColor = new Color4( 0, 0, 0, alphaClear );\n\n\t\t/**\n\t\t * The clear depth value.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 1\n\t\t */\n\t\tthis._clearDepth = 1;\n\n\t\t/**\n\t\t * The clear stencil value.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis._clearStencil = 0;\n\n\t\t/**\n\t\t * The current render target.\n\t\t *\n\t\t * @private\n\t\t * @type {?RenderTarget}\n\t\t * @default null\n\t\t */\n\t\tthis._renderTarget = null;\n\n\t\t/**\n\t\t * The active cube face.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis._activeCubeFace = 0;\n\n\t\t/**\n\t\t * The active mipmap level.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis._activeMipmapLevel = 0;\n\n\t\t/**\n\t\t * The current output render target.\n\t\t *\n\t\t * @private\n\t\t * @type {?RenderTarget}\n\t\t * @default null\n\t\t */\n\t\tthis._outputRenderTarget = null;\n\n\t\t/**\n\t\t * The MRT setting.\n\t\t *\n\t\t * @private\n\t\t * @type {?MRTNode}\n\t\t * @default null\n\t\t */\n\t\tthis._mrt = null;\n\n\t\t/**\n\t\t * This function defines how a render object is going\n\t\t * to be rendered.\n\t\t *\n\t\t * @private\n\t\t * @type {?Function}\n\t\t * @default null\n\t\t */\n\t\tthis._renderObjectFunction = null;\n\n\t\t/**\n\t\t * Used to keep track of the current render object function.\n\t\t *\n\t\t * @private\n\t\t * @type {?Function}\n\t\t * @default null\n\t\t */\n\t\tthis._currentRenderObjectFunction = null;\n\n\t\t/**\n\t\t * Used to keep track of the current render bundle.\n\t\t *\n\t\t * @private\n\t\t * @type {?RenderBundle}\n\t\t * @default null\n\t\t */\n\t\tthis._currentRenderBundle = null;\n\n\t\t/**\n\t\t * Next to `_renderObjectFunction()`, this function provides another hook\n\t\t * for influencing the render process of a render object. It is meant for internal\n\t\t * use and only relevant for `compileAsync()` right now. Instead of using\n\t\t * the default logic of `_renderObjectDirect()` which actually draws the render object,\n\t\t * a different function might be used which performs no draw but just the node\n\t\t * and pipeline updates.\n\t\t *\n\t\t * @private\n\t\t * @type {?Function}\n\t\t * @default null\n\t\t */\n\t\tthis._handleObjectFunction = this._renderObjectDirect;\n\n\t\t/**\n\t\t * Indicates whether the device has been lost or not. In WebGL terms, the device\n\t\t * lost is considered as a context lost. When this is set to `true`, rendering\n\t\t * isn't possible anymore.\n\t\t *\n\t\t * @private\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis._isDeviceLost = false;\n\n\t\t/**\n\t\t * A callback function that defines what should happen when a device/context lost occurs.\n\t\t *\n\t\t * @type {Function}\n\t\t */\n\t\tthis.onDeviceLost = this._onDeviceLost;\n\n\t\t/**\n\t\t * Defines the type of output buffers. The default `HalfFloatType` is recommend for\n\t\t * best quality. To save memory and bandwidth, `UnsignedByteType` might be used.\n\t\t * This will reduce rendering quality though.\n\t\t *\n\t\t * @private\n\t\t * @type {number}\n\t\t * @default HalfFloatType\n\t\t */\n\t\tthis._outputBufferType = outputBufferType;\n\n\t\t/**\n\t\t * A cache for shadow nodes per material\n\t\t *\n\t\t * @private\n\t\t * @type {WeakMap<Material, Object>}\n\t\t */\n\t\tthis._cacheShadowNodes = new WeakMap();\n\n\t\t/**\n\t\t * Whether the renderer has been initialized or not.\n\t\t *\n\t\t * @private\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis._initialized = false;\n\n\t\t/**\n\t\t * A reference to the promise which initializes the renderer.\n\t\t *\n\t\t * @private\n\t\t * @type {?Promise<this>}\n\t\t * @default null\n\t\t */\n\t\tthis._initPromise = null;\n\n\t\t/**\n\t\t * An array of compilation promises which are used in `compileAsync()`.\n\t\t *\n\t\t * @private\n\t\t * @type {?Array<Promise>}\n\t\t * @default null\n\t\t */\n\t\tthis._compilationPromises = null;\n\n\t\t/**\n\t\t * Whether the renderer should render transparent render objects or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.transparent = true;\n\n\t\t/**\n\t\t * Whether the renderer should render opaque render objects or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.opaque = true;\n\n\t\t/**\n\t\t * Shadow map configuration\n\t\t * @typedef {Object} ShadowMapConfig\n\t\t * @property {boolean} enabled - Whether to globally enable shadows or not.\n\t\t * @property {number} type - The shadow map type.\n\t\t */\n\n\t\t/**\n\t\t * The renderer's shadow configuration.\n\t\t *\n\t\t * @type {ShadowMapConfig}\n\t\t */\n\t\tthis.shadowMap = {\n\t\t\tenabled: false,\n\t\t\ttype: PCFShadowMap\n\t\t};\n\n\t\t/**\n\t\t * XR configuration.\n\t\t * @typedef {Object} XRConfig\n\t\t * @property {boolean} enabled - Whether to globally enable XR or not.\n\t\t */\n\n\t\t/**\n\t\t * The renderer's XR manager.\n\t\t *\n\t\t * @type {XRManager}\n\t\t */\n\t\tthis.xr = new XRManager( this, multiview );\n\n\t\t/**\n\t\t * Debug configuration.\n\t\t * @typedef {Object} DebugConfig\n\t\t * @property {boolean} checkShaderErrors - Whether shader errors should be checked or not.\n\t\t * @property {?Function} onShaderError - A callback function that is executed when a shader error happens. Only supported with WebGL 2 right now.\n\t\t * @property {Function} getShaderAsync - Allows the get the raw shader code for the given scene, camera and 3D object.\n\t\t */\n\n\t\t/**\n\t\t * The renderer's debug configuration.\n\t\t *\n\t\t * @type {DebugConfig}\n\t\t */\n\t\tthis.debug = {\n\t\t\tcheckShaderErrors: true,\n\t\t\tonShaderError: null,\n\t\t\tgetShaderAsync: async ( scene, camera, object ) => {\n\n\t\t\t\tawait this.compileAsync( scene, camera );\n\n\t\t\t\tconst renderList = this._renderLists.get( scene, camera );\n\t\t\t\tconst renderContext = this._renderContexts.get( scene, camera, this._renderTarget, this._mrt );\n\n\t\t\t\tconst material = scene.overrideMaterial || object.material;\n\n\t\t\t\tconst renderObject = this._objects.get( object, material, scene, camera, renderList.lightsNode, renderContext, renderContext.clippingContext );\n\n\t\t\t\tconst { fragmentShader, vertexShader } = renderObject.getNodeBuilderState();\n\n\t\t\t\treturn { fragmentShader, vertexShader };\n\n\t\t\t}\n\t\t};\n\n\t}\n\n\t/**\n\t * Initializes the renderer so it is ready for usage.\n\t *\n\t * @async\n\t * @return {Promise<this>} A Promise that resolves when the renderer has been initialized.\n\t */\n\tasync init() {\n\n\t\tif ( this._initPromise !== null ) {\n\n\t\t\treturn this._initPromise;\n\n\t\t}\n\n\t\tthis._initPromise = new Promise( async ( resolve, reject ) => {\n\n\t\t\tlet backend = this.backend;\n\n\t\t\ttry {\n\n\t\t\t\tawait backend.init( this );\n\n\t\t\t} catch ( error ) {\n\n\t\t\t\tif ( this._getFallback !== null ) {\n\n\t\t\t\t\t// try the fallback\n\n\t\t\t\t\ttry {\n\n\t\t\t\t\t\tthis.backend = backend = this._getFallback( error );\n\t\t\t\t\t\tawait backend.init( this );\n\n\t\t\t\t\t} catch ( error ) {\n\n\t\t\t\t\t\treject( error );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\treject( error );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis._nodes = new Nodes( this, backend );\n\t\t\tthis._animation = new Animation( this, this._nodes, this.info );\n\t\t\tthis._attributes = new Attributes( backend );\n\t\t\tthis._background = new Background( this, this._nodes );\n\t\t\tthis._geometries = new Geometries( this._attributes, this.info );\n\t\t\tthis._textures = new Textures( this, backend, this.info );\n\t\t\tthis._pipelines = new Pipelines( backend, this._nodes );\n\t\t\tthis._bindings = new Bindings( backend, this._nodes, this._textures, this._attributes, this._pipelines, this.info );\n\t\t\tthis._objects = new RenderObjects( this, this._nodes, this._geometries, this._pipelines, this._bindings, this.info );\n\t\t\tthis._renderLists = new RenderLists( this.lighting );\n\t\t\tthis._bundles = new RenderBundles();\n\t\t\tthis._renderContexts = new RenderContexts();\n\n\t\t\t//\n\n\t\t\tthis._animation.start();\n\t\t\tthis._initialized = true;\n\n\t\t\t//\n\n\t\t\tthis._inspector.init();\n\n\t\t\t//\n\n\t\t\tresolve( this );\n\n\t\t} );\n\n\t\treturn this._initPromise;\n\n\t}\n\n\t/**\n\t * A reference to the canvas element the renderer is drawing to.\n\t * This value of this property will automatically be created by\n\t * the renderer.\n\t *\n\t * @type {HTMLCanvasElement|OffscreenCanvas}\n\t */\n\tget domElement() {\n\n\t\treturn this._canvasTarget.domElement;\n\n\t}\n\n\t/**\n\t * The coordinate system of the renderer. The value of this property\n\t * depends on the selected backend. Either `THREE.WebGLCoordinateSystem` or\n\t * `THREE.WebGPUCoordinateSystem`.\n\t *\n\t * @readonly\n\t * @type {number}\n\t */\n\tget coordinateSystem() {\n\n\t\treturn this.backend.coordinateSystem;\n\n\t}\n\n\t/**\n\t * Compiles all materials in the given scene. This can be useful to avoid a\n\t * phenomenon which is called \"shader compilation stutter\", which occurs when\n\t * rendering an object with a new shader for the first time.\n\t *\n\t * If you want to add a 3D object to an existing scene, use the third optional\n\t * parameter for applying the target scene. Note that the (target) scene's lighting\n\t * and environment must be configured before calling this method.\n\t *\n\t * @async\n\t * @param {Object3D} scene - The scene or 3D object to precompile.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {?Scene} targetScene - If the first argument is a 3D object, this parameter must represent the scene the 3D object is going to be added.\n\t * @return {Promise} A Promise that resolves when the compile has been finished.\n\t */\n\tasync compileAsync( scene, camera, targetScene = null ) {\n\n\t\tif ( this._isDeviceLost === true ) return;\n\n\t\tif ( this._initialized === false ) await this.init();\n\n\t\t// preserve render tree\n\n\t\tconst nodeFrame = this._nodes.nodeFrame;\n\n\t\tconst previousRenderId = nodeFrame.renderId;\n\t\tconst previousRenderContext = this._currentRenderContext;\n\t\tconst previousRenderObjectFunction = this._currentRenderObjectFunction;\n\t\tconst previousCompilationPromises = this._compilationPromises;\n\n\t\t//\n\n\t\tconst sceneRef = ( scene.isScene === true ) ? scene : _scene;\n\n\t\tif ( targetScene === null ) targetScene = scene;\n\n\t\tconst renderTarget = this._renderTarget;\n\t\tconst renderContext = this._renderContexts.get( targetScene, camera, renderTarget, this._mrt );\n\t\tconst activeMipmapLevel = this._activeMipmapLevel;\n\n\t\tconst compilationPromises = [];\n\n\t\tthis._currentRenderContext = renderContext;\n\t\tthis._currentRenderObjectFunction = this.renderObject;\n\n\t\tthis._handleObjectFunction = this._createObjectPipeline;\n\n\t\tthis._compilationPromises = compilationPromises;\n\n\t\tnodeFrame.renderId ++;\n\n\t\t//\n\n\t\tnodeFrame.update();\n\n\t\t//\n\n\t\trenderContext.depth = this.depth;\n\t\trenderContext.stencil = this.stencil;\n\n\t\tif ( ! renderContext.clippingContext ) renderContext.clippingContext = new ClippingContext();\n\t\trenderContext.clippingContext.updateGlobal( sceneRef, camera );\n\n\t\t//\n\n\t\tsceneRef.onBeforeRender( this, scene, camera, renderTarget );\n\n\t\t//\n\n\t\tconst renderList = this._renderLists.get( scene, camera );\n\t\trenderList.begin();\n\n\t\tthis._projectObject( scene, camera, 0, renderList, renderContext.clippingContext );\n\n\t\t// include lights from target scene\n\t\tif ( targetScene !== scene ) {\n\n\t\t\ttargetScene.traverseVisible( function ( object ) {\n\n\t\t\t\tif ( object.isLight && object.layers.test( camera.layers ) ) {\n\n\t\t\t\t\trenderList.pushLight( object );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t}\n\n\t\trenderList.finish();\n\n\t\t//\n\n\t\tif ( renderTarget !== null ) {\n\n\t\t\tthis._textures.updateRenderTarget( renderTarget, activeMipmapLevel );\n\n\t\t\tconst renderTargetData = this._textures.get( renderTarget );\n\n\t\t\trenderContext.textures = renderTargetData.textures;\n\t\t\trenderContext.depthTexture = renderTargetData.depthTexture;\n\n\t\t} else {\n\n\t\t\trenderContext.textures = null;\n\t\t\trenderContext.depthTexture = null;\n\n\t\t}\n\n\t\t//\n\n\t\tthis._background.update( sceneRef, renderList, renderContext );\n\n\t\t// process render lists\n\n\t\tconst opaqueObjects = renderList.opaque;\n\t\tconst transparentObjects = renderList.transparent;\n\t\tconst transparentDoublePassObjects = renderList.transparentDoublePass;\n\t\tconst lightsNode = renderList.lightsNode;\n\n\t\tif ( this.opaque === true && opaqueObjects.length > 0 ) this._renderObjects( opaqueObjects, camera, sceneRef, lightsNode );\n\t\tif ( this.transparent === true && transparentObjects.length > 0 ) this._renderTransparents( transparentObjects, transparentDoublePassObjects, camera, sceneRef, lightsNode );\n\n\t\t// restore render tree\n\n\t\tnodeFrame.renderId = previousRenderId;\n\n\t\tthis._currentRenderContext = previousRenderContext;\n\t\tthis._currentRenderObjectFunction = previousRenderObjectFunction;\n\t\tthis._compilationPromises = previousCompilationPromises;\n\n\t\tthis._handleObjectFunction = this._renderObjectDirect;\n\n\t\t// wait for all promises setup by backends awaiting compilation/linking/pipeline creation to complete\n\n\t\tawait Promise.all( compilationPromises );\n\n\t}\n\n\t/**\n\t * Renders the scene in an async fashion.\n\t *\n\t * @async\n\t * @deprecated\n\t * @param {Object3D} scene - The scene or 3D object to render.\n\t * @param {Camera} camera - The camera.\n\t * @return {Promise} A Promise that resolves when the render has been finished.\n\t */\n\tasync renderAsync( scene, camera ) {\n\n\t\twarnOnce( 'Renderer: \"renderAsync()\" has been deprecated. Use \"render()\" and \"await renderer.init();\" when creating the renderer.' ); // @deprecated r181\n\n\t\tawait this.init();\n\n\t\tthis.render( scene, camera );\n\n\t}\n\n\t/**\n\t * Can be used to synchronize CPU operations with GPU tasks. So when this method is called,\n\t * the CPU waits for the GPU to complete its operation (e.g. a compute task).\n\t *\n\t * @async\n\t * @deprecated\n\t * @return {Promise} A Promise that resolves when synchronization has been finished.\n\t */\n\tasync waitForGPU() {\n\n\t\terror( 'Renderer: waitForGPU() has been removed. Read https://github.com/mrdoob/three.js/issues/32012 for more information.' );\n\n\t}\n\n\t//\n\n\tset inspector( value ) {\n\n\t\tif ( this._inspector !== null ) {\n\n\t\t\tthis._inspector.setRenderer( null );\n\n\t\t}\n\n\t\tthis._inspector = value;\n\t\tthis._inspector.setRenderer( this );\n\n\t}\n\n\t/**\n\t * The inspector instance. The inspector can be any class that extends from `InspectorBase`.\n\t *\n\t * @type {InspectorBase}\n\t */\n\tget inspector() {\n\n\t\treturn this._inspector;\n\n\t}\n\n\t/**\n\t * Enables or disables high precision for model-view and normal-view matrices.\n\t * When enabled, will use CPU 64-bit precision for higher precision instead of GPU 32-bit for higher performance.\n\t *\n\t * NOTE: 64-bit precision is not compatible with `InstancedMesh` and `SkinnedMesh`.\n\t *\n\t * @param {boolean} value - Whether to enable or disable high precision.\n\t * @type {boolean}\n\t */\n\tset highPrecision( value ) {\n\n\t\tconst contextNodeData = this.contextNode.value;\n\n\t\tif ( value === true ) {\n\n\t\t\tcontextNodeData.modelViewMatrix = highpModelViewMatrix;\n\t\t\tcontextNodeData.modelNormalViewMatrix = highpModelNormalViewMatrix;\n\n\t\t} else if ( this.highPrecision ) {\n\n\t\t\tdelete contextNodeData.modelViewMatrix;\n\t\t\tdelete contextNodeData.modelNormalViewMatrix;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns whether high precision is enabled or not.\n\t *\n\t * @return {boolean} Whether high precision is enabled or not.\n\t * @type {boolean}\n\t */\n\tget highPrecision() {\n\n\t\tconst contextNodeData = this.contextNode.value;\n\n\t\treturn contextNodeData.modelViewMatrix === highpModelViewMatrix && contextNodeData.modelNormalViewMatrix === highpModelNormalViewMatrix;\n\n\t}\n\n\t/**\n\t * Sets the given MRT configuration.\n\t *\n\t * @param {MRTNode} mrt - The MRT node to set.\n\t * @return {Renderer} A reference to this renderer.\n\t */\n\tsetMRT( mrt ) {\n\n\t\tthis._mrt = mrt;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Returns the MRT configuration.\n\t *\n\t * @return {MRTNode} The MRT configuration.\n\t */\n\tgetMRT() {\n\n\t\treturn this._mrt;\n\n\t}\n\n\t/**\n\t * Returns the output buffer type.\n\t *\n\t * @return {number} The output buffer type.\n\t */\n\tgetOutputBufferType() {\n\n\t\treturn this._outputBufferType;\n\n\t}\n\n\t/**\n\t * Returns the output buffer type.\n\t *\n\t * @deprecated since r182. Use `.getOutputBufferType()` instead.\n\t * @return {number} The output buffer type.\n\t */\n\tgetColorBufferType() { // @deprecated, r182\n\n\t\twarnOnce( 'Renderer: \".getColorBufferType()\" has been renamed to \".getOutputBufferType()\".' );\n\n\t\treturn this.getOutputBufferType();\n\n\t}\n\n\t/**\n\t * Default implementation of the device lost callback.\n\t *\n\t * @private\n\t * @param {Object} info - Information about the context lost.\n\t */\n\t_onDeviceLost( info ) {\n\n\t\tlet errorMessage = `THREE.WebGPURenderer: ${info.api} Device Lost:\\n\\nMessage: ${info.message}`;\n\n\t\tif ( info.reason ) {\n\n\t\t\terrorMessage += `\\nReason: ${info.reason}`;\n\n\t\t}\n\n\t\terror( errorMessage );\n\n\t\tthis._isDeviceLost = true;\n\n\t}\n\n\t/**\n\t * Renders the given render bundle.\n\t *\n\t * @private\n\t * @param {Object} bundle - Render bundle data.\n\t * @param {Scene} sceneRef - The scene the render bundle belongs to.\n\t * @param {LightsNode} lightsNode - The lights node.\n\t */\n\t_renderBundle( bundle, sceneRef, lightsNode ) {\n\n\t\tconst { bundleGroup, camera, renderList } = bundle;\n\n\t\tconst renderContext = this._currentRenderContext;\n\n\t\t//\n\n\t\tconst renderBundle = this._bundles.get( bundleGroup, camera );\n\t\tconst renderBundleData = this.backend.get( renderBundle );\n\n\t\tif ( renderBundleData.renderContexts === undefined ) renderBundleData.renderContexts = new Set();\n\n\t\t//\n\n\t\tconst needsUpdate = bundleGroup.version !== renderBundleData.version;\n\t\tconst renderBundleNeedsUpdate = renderBundleData.renderContexts.has( renderContext ) === false || needsUpdate;\n\n\t\trenderBundleData.renderContexts.add( renderContext );\n\n\t\tif ( renderBundleNeedsUpdate ) {\n\n\t\t\tthis.backend.beginBundle( renderContext );\n\n\t\t\tif ( renderBundleData.renderObjects === undefined || needsUpdate ) {\n\n\t\t\t\trenderBundleData.renderObjects = [];\n\n\t\t\t}\n\n\t\t\tthis._currentRenderBundle = renderBundle;\n\n\t\t\tconst {\n\t\t\t\ttransparentDoublePass: transparentDoublePassObjects,\n\t\t\t\ttransparent: transparentObjects,\n\t\t\t\topaque: opaqueObjects\n\t\t\t} = renderList;\n\n\t\t\tif ( this.opaque === true && opaqueObjects.length > 0 ) this._renderObjects( opaqueObjects, camera, sceneRef, lightsNode );\n\t\t\tif ( this.transparent === true && transparentObjects.length > 0 ) this._renderTransparents( transparentObjects, transparentDoublePassObjects, camera, sceneRef, lightsNode );\n\n\t\t\tthis._currentRenderBundle = null;\n\n\t\t\t//\n\n\t\t\tthis.backend.finishBundle( renderContext, renderBundle );\n\n\t\t\trenderBundleData.version = bundleGroup.version;\n\n\t\t} else {\n\n\t\t\tconst { renderObjects } = renderBundleData;\n\n\t\t\tfor ( let i = 0, l = renderObjects.length; i < l; i ++ ) {\n\n\t\t\t\tconst renderObject = renderObjects[ i ];\n\n\t\t\t\tif ( this._nodes.needsRefresh( renderObject ) ) {\n\n\t\t\t\t\tthis._nodes.updateBefore( renderObject );\n\n\t\t\t\t\tthis._nodes.updateForRender( renderObject );\n\t\t\t\t\tthis._bindings.updateForRender( renderObject );\n\n\t\t\t\t\tthis._nodes.updateAfter( renderObject );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.backend.addBundle( renderContext, renderBundle );\n\n\t}\n\n\t/**\n\t * Renders the scene or 3D object with the given camera. This method can only be called\n\t * if the renderer has been initialized. When using `render()` inside an animation loop,\n\t * it's guaranteed the renderer will be initialized. The animation loop must be defined\n\t * with {@link Renderer#setAnimationLoop} though.\n\t *\n\t * For all other use cases (like when using on-demand rendering), you must call\n\t * {@link Renderer#init} before rendering.\n\t *\n\t * The target of the method is the default framebuffer (meaning the canvas)\n\t * or alternatively a render target when specified via `setRenderTarget()`.\n\t *\n\t * @param {Object3D} scene - The scene or 3D object to render.\n\t * @param {Camera} camera - The camera to render the scene with.\n\t */\n\trender( scene, camera ) {\n\n\t\tif ( this._initialized === false ) {\n\n\t\t\tthrow new Error( 'Renderer: .render() called before the backend is initialized. Use \"await renderer.init();\" before rendering.' );\n\n\t\t}\n\n\t\tthis._renderScene( scene, camera );\n\n\t}\n\n\t/**\n\t * Returns whether the renderer has been initialized or not.\n\t *\n\t * @readonly\n\t * @return {boolean} Whether the renderer has been initialized or not.\n\t */\n\tget initialized() {\n\n\t\treturn this._initialized;\n\n\t}\n\n\t/**\n\t * Returns an internal render target which is used when computing the output tone mapping\n\t * and color space conversion. Unlike in `WebGLRenderer`, this is done in a separate render\n\t * pass and not inline to achieve more correct results.\n\t *\n\t * @private\n\t * @return {?RenderTarget} The render target. The method returns `null` if no output conversion should be applied.\n\t */\n\t_getFrameBufferTarget() {\n\n\t\tconst { currentToneMapping, currentColorSpace } = this;\n\n\t\tconst useToneMapping = currentToneMapping !== NoToneMapping;\n\t\tconst useColorSpace = currentColorSpace !== ColorManagement.workingColorSpace;\n\n\t\tif ( useToneMapping === false && useColorSpace === false ) return null;\n\n\t\tconst { width, height } = this.getDrawingBufferSize( _drawingBufferSize );\n\t\tconst { depth, stencil } = this;\n\n\t\tlet frameBufferTarget = this._frameBufferTarget;\n\n\t\tif ( frameBufferTarget === null ) {\n\n\t\t\tframeBufferTarget = new RenderTarget( width, height, {\n\t\t\t\tdepthBuffer: depth,\n\t\t\t\tstencilBuffer: stencil,\n\t\t\t\ttype: this._outputBufferType,\n\t\t\t\tformat: RGBAFormat,\n\t\t\t\tcolorSpace: ColorManagement.workingColorSpace,\n\t\t\t\tgenerateMipmaps: false,\n\t\t\t\tminFilter: LinearFilter,\n\t\t\t\tmagFilter: LinearFilter,\n\t\t\t\tsamples: this.samples\n\t\t\t} );\n\n\t\t\tframeBufferTarget.isPostProcessingRenderTarget = true;\n\n\t\t\tthis._frameBufferTarget = frameBufferTarget;\n\n\t\t}\n\n\t\tconst outputRenderTarget = this.getOutputRenderTarget();\n\n\t\tframeBufferTarget.depthBuffer = depth;\n\t\tframeBufferTarget.stencilBuffer = stencil;\n\t\tif ( outputRenderTarget !== null ) {\n\n\t\t\tframeBufferTarget.setSize( outputRenderTarget.width, outputRenderTarget.height, outputRenderTarget.depth );\n\n\t\t} else {\n\n\t\t\tframeBufferTarget.setSize( width, height, 1 );\n\n\t\t}\n\n\t\tconst canvasTarget = this._canvasTarget;\n\n\t\tframeBufferTarget.viewport.copy( canvasTarget._viewport );\n\t\tframeBufferTarget.scissor.copy( canvasTarget._scissor );\n\t\tframeBufferTarget.viewport.multiplyScalar( canvasTarget._pixelRatio );\n\t\tframeBufferTarget.scissor.multiplyScalar( canvasTarget._pixelRatio );\n\t\tframeBufferTarget.scissorTest = canvasTarget._scissorTest;\n\t\tframeBufferTarget.multiview = outputRenderTarget !== null ? outputRenderTarget.multiview : false;\n\t\tframeBufferTarget.resolveDepthBuffer = outputRenderTarget !== null ? outputRenderTarget.resolveDepthBuffer : true;\n\t\tframeBufferTarget._autoAllocateDepthBuffer = outputRenderTarget !== null ? outputRenderTarget._autoAllocateDepthBuffer : false;\n\n\t\treturn frameBufferTarget;\n\n\t}\n\n\t/**\n\t * Renders the scene or 3D object with the given camera.\n\t *\n\t * @private\n\t * @param {Object3D} scene - The scene or 3D object to render.\n\t * @param {Camera} camera - The camera to render the scene with.\n\t * @param {boolean} [useFrameBufferTarget=true] - Whether to use a framebuffer target or not.\n\t * @return {RenderContext} The current render context.\n\t */\n\t_renderScene( scene, camera, useFrameBufferTarget = true ) {\n\n\t\tif ( this._isDeviceLost === true ) return;\n\n\t\t//\n\n\t\tconst frameBufferTarget = useFrameBufferTarget ? this._getFrameBufferTarget() : null;\n\n\t\t// preserve render tree\n\n\t\tconst nodeFrame = this._nodes.nodeFrame;\n\n\t\tconst previousRenderId = nodeFrame.renderId;\n\t\tconst previousRenderContext = this._currentRenderContext;\n\t\tconst previousRenderObjectFunction = this._currentRenderObjectFunction;\n\n\t\t//\n\n\t\tconst sceneRef = ( scene.isScene === true ) ? scene : _scene;\n\n\t\tconst outputRenderTarget = this._renderTarget || this._outputRenderTarget;\n\n\t\tconst activeCubeFace = this._activeCubeFace;\n\t\tconst activeMipmapLevel = this._activeMipmapLevel;\n\n\t\t//\n\n\t\tlet renderTarget;\n\n\t\tif ( frameBufferTarget !== null ) {\n\n\t\t\trenderTarget = frameBufferTarget;\n\n\t\t\tthis.setRenderTarget( renderTarget );\n\n\t\t} else {\n\n\t\t\trenderTarget = outputRenderTarget;\n\n\t\t}\n\n\t\t//\n\n\t\tconst renderContext = this._renderContexts.get( scene, camera, renderTarget, this._mrt );\n\n\t\tthis._currentRenderContext = renderContext;\n\t\tthis._currentRenderObjectFunction = this._renderObjectFunction || this.renderObject;\n\n\t\t//\n\n\t\tthis.info.calls ++;\n\t\tthis.info.render.calls ++;\n\t\tthis.info.render.frameCalls ++;\n\n\t\tnodeFrame.renderId = this.info.calls;\n\n\t\t//\n\n\t\tthis.backend.updateTimeStampUID( renderContext );\n\n\t\tthis.inspector.beginRender( this.backend.getTimestampUID( renderContext ), scene, camera, renderTarget );\n\n\t\t//\n\n\t\tconst coordinateSystem = this.coordinateSystem;\n\t\tconst xr = this.xr;\n\n\t\tif ( camera.coordinateSystem !== coordinateSystem && xr.isPresenting === false ) {\n\n\t\t\tcamera.coordinateSystem = coordinateSystem;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t\tif ( camera.isArrayCamera ) {\n\n\t\t\t\tfor ( const subCamera of camera.cameras ) {\n\n\t\t\t\t\tsubCamera.coordinateSystem = coordinateSystem;\n\t\t\t\t\tsubCamera.updateProjectionMatrix();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( scene.matrixWorldAutoUpdate === true ) scene.updateMatrixWorld();\n\n\t\tif ( camera.parent === null && camera.matrixWorldAutoUpdate === true ) camera.updateMatrixWorld();\n\n\t\tif ( xr.enabled === true && xr.isPresenting === true ) {\n\n\t\t\tif ( xr.cameraAutoUpdate === true ) xr.updateCamera( camera );\n\t\t\tcamera = xr.getCamera(); // use XR camera for rendering\n\n\t\t}\n\n\t\t//\n\n\t\tconst canvasTarget = this._canvasTarget;\n\n\t\tlet viewport = canvasTarget._viewport;\n\t\tlet scissor = canvasTarget._scissor;\n\t\tlet pixelRatio = canvasTarget._pixelRatio;\n\n\t\tif ( renderTarget !== null ) {\n\n\t\t\tviewport = renderTarget.viewport;\n\t\t\tscissor = renderTarget.scissor;\n\t\t\tpixelRatio = 1;\n\n\t\t}\n\n\t\tthis.getDrawingBufferSize( _drawingBufferSize );\n\n\t\t_screen.set( 0, 0, _drawingBufferSize.width, _drawingBufferSize.height );\n\n\t\tconst minDepth = ( viewport.minDepth === undefined ) ? 0 : viewport.minDepth;\n\t\tconst maxDepth = ( viewport.maxDepth === undefined ) ? 1 : viewport.maxDepth;\n\n\t\trenderContext.viewportValue.copy( viewport ).multiplyScalar( pixelRatio ).floor();\n\t\trenderContext.viewportValue.width >>= activeMipmapLevel;\n\t\trenderContext.viewportValue.height >>= activeMipmapLevel;\n\t\trenderContext.viewportValue.minDepth = minDepth;\n\t\trenderContext.viewportValue.maxDepth = maxDepth;\n\t\trenderContext.viewport = renderContext.viewportValue.equals( _screen ) === false;\n\n\t\trenderContext.scissorValue.copy( scissor ).multiplyScalar( pixelRatio ).floor();\n\t\trenderContext.scissor = canvasTarget._scissorTest && renderContext.scissorValue.equals( _screen ) === false;\n\t\trenderContext.scissorValue.width >>= activeMipmapLevel;\n\t\trenderContext.scissorValue.height >>= activeMipmapLevel;\n\n\t\tif ( ! renderContext.clippingContext ) renderContext.clippingContext = new ClippingContext();\n\t\trenderContext.clippingContext.updateGlobal( sceneRef, camera );\n\n\t\t//\n\n\t\tsceneRef.onBeforeRender( this, scene, camera, renderTarget );\n\n\t\t//\n\n\t\tconst frustum = camera.isArrayCamera ? _frustumArray : _frustum;\n\n\t\tif ( ! camera.isArrayCamera ) {\n\n\t\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\t\tfrustum.setFromProjectionMatrix( _projScreenMatrix, camera.coordinateSystem, camera.reversedDepth );\n\n\t\t}\n\n\t\tconst renderList = this._renderLists.get( scene, camera );\n\t\trenderList.begin();\n\n\t\tthis._projectObject( scene, camera, 0, renderList, renderContext.clippingContext );\n\n\t\trenderList.finish();\n\n\t\tif ( this.sortObjects === true ) {\n\n\t\t\trenderList.sort( this._opaqueSort, this._transparentSort );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( renderTarget !== null ) {\n\n\t\t\tthis._textures.updateRenderTarget( renderTarget, activeMipmapLevel );\n\n\t\t\tconst renderTargetData = this._textures.get( renderTarget );\n\n\t\t\trenderContext.textures = renderTargetData.textures;\n\t\t\trenderContext.depthTexture = renderTargetData.depthTexture;\n\t\t\trenderContext.width = renderTargetData.width;\n\t\t\trenderContext.height = renderTargetData.height;\n\t\t\trenderContext.renderTarget = renderTarget;\n\t\t\trenderContext.depth = renderTarget.depthBuffer;\n\t\t\trenderContext.stencil = renderTarget.stencilBuffer;\n\n\t\t} else {\n\n\t\t\trenderContext.textures = null;\n\t\t\trenderContext.depthTexture = null;\n\t\t\trenderContext.width = _drawingBufferSize.width;\n\t\t\trenderContext.height = _drawingBufferSize.height;\n\t\t\trenderContext.depth = this.depth;\n\t\t\trenderContext.stencil = this.stencil;\n\n\t\t}\n\n\t\trenderContext.width >>= activeMipmapLevel;\n\t\trenderContext.height >>= activeMipmapLevel;\n\t\trenderContext.activeCubeFace = activeCubeFace;\n\t\trenderContext.activeMipmapLevel = activeMipmapLevel;\n\t\trenderContext.occlusionQueryCount = renderList.occlusionQueryCount;\n\n\t\t//\n\n\t\trenderContext.scissorValue.max( _vector4.set( 0, 0, 0, 0 ) );\n\n\t\tif ( renderContext.scissorValue.x + renderContext.scissorValue.width > renderContext.width ) {\n\n\t\t\trenderContext.scissorValue.width = Math.max( renderContext.width - renderContext.scissorValue.x, 0 );\n\n\t\t}\n\n\t\tif ( renderContext.scissorValue.y + renderContext.scissorValue.height > renderContext.height ) {\n\n\t\t\trenderContext.scissorValue.height = Math.max( renderContext.height - renderContext.scissorValue.y, 0 );\n\n\t\t}\n\n\t\t//\n\n\t\tthis._background.update( sceneRef, renderList, renderContext );\n\n\t\t//\n\n\t\trenderContext.camera = camera;\n\t\tthis.backend.beginRender( renderContext );\n\n\t\t// process render lists\n\n\t\tconst {\n\t\t\tbundles,\n\t\t\tlightsNode,\n\t\t\ttransparentDoublePass: transparentDoublePassObjects,\n\t\t\ttransparent: transparentObjects,\n\t\t\topaque: opaqueObjects\n\t\t} = renderList;\n\n\t\tif ( bundles.length > 0 ) this._renderBundles( bundles, sceneRef, lightsNode );\n\t\tif ( this.opaque === true && opaqueObjects.length > 0 ) this._renderObjects( opaqueObjects, camera, sceneRef, lightsNode );\n\t\tif ( this.transparent === true && transparentObjects.length > 0 ) this._renderTransparents( transparentObjects, transparentDoublePassObjects, camera, sceneRef, lightsNode );\n\n\t\t// finish render pass\n\n\t\tthis.backend.finishRender( renderContext );\n\n\t\t// restore render tree\n\n\t\tnodeFrame.renderId = previousRenderId;\n\n\t\tthis._currentRenderContext = previousRenderContext;\n\t\tthis._currentRenderObjectFunction = previousRenderObjectFunction;\n\n\t\t//\n\n\t\tif ( frameBufferTarget !== null ) {\n\n\t\t\tthis.setRenderTarget( outputRenderTarget, activeCubeFace, activeMipmapLevel );\n\n\t\t\tthis._renderOutput( renderTarget );\n\n\t\t}\n\n\t\t//\n\n\t\tsceneRef.onAfterRender( this, scene, camera, renderTarget );\n\n\t\t//\n\n\t\tthis.inspector.finishRender( this.backend.getTimestampUID( renderContext ) );\n\n\t\t//\n\n\t\treturn renderContext;\n\n\t}\n\n\t_setXRLayerSize( width, height ) {\n\n\t\t// TODO: Find a better solution to resize the canvas when in XR.\n\n\t\tthis._canvasTarget._width = width;\n\t\tthis._canvasTarget._height = height;\n\n\t\tthis.setViewport( 0, 0, width, height );\n\n\t}\n\n\t/**\n\t * The output pass performs tone mapping and color space conversion.\n\t *\n\t * @private\n\t * @param {RenderTarget} renderTarget - The current render target.\n\t */\n\t_renderOutput( renderTarget ) {\n\n\t\tconst quad = this._quad;\n\n\t\tif ( this._nodes.hasOutputChange( renderTarget.texture ) ) {\n\n\t\t\tquad.material.fragmentNode = this._nodes.getOutputNode( renderTarget.texture );\n\t\t\tquad.material.needsUpdate = true;\n\n\t\t}\n\n\t\t// a clear operation clears the intermediate renderTarget texture, but should not update the screen canvas.\n\n\t\tconst currentAutoClear = this.autoClear;\n\t\tconst currentXR = this.xr.enabled;\n\n\t\tthis.autoClear = false;\n\t\tthis.xr.enabled = false;\n\n\t\tthis._renderScene( quad, quad.camera, false );\n\n\t\tthis.autoClear = currentAutoClear;\n\t\tthis.xr.enabled = currentXR;\n\n\n\t}\n\n\t/**\n\t * Returns the maximum available anisotropy for texture filtering.\n\t *\n\t * @return {number} The maximum available anisotropy.\n\t */\n\tgetMaxAnisotropy() {\n\n\t\treturn this.backend.getMaxAnisotropy();\n\n\t}\n\n\t/**\n\t * Returns the active cube face.\n\t *\n\t * @return {number} The active cube face.\n\t */\n\tgetActiveCubeFace() {\n\n\t\treturn this._activeCubeFace;\n\n\t}\n\n\t/**\n\t * Returns the active mipmap level.\n\t *\n\t * @return {number} The active mipmap level.\n\t */\n\tgetActiveMipmapLevel() {\n\n\t\treturn this._activeMipmapLevel;\n\n\t}\n\n\t/**\n\t * Applications are advised to always define the animation loop\n\t * with this method and not manually with `requestAnimationFrame()`\n\t * for best compatibility.\n\t *\n\t * @async\n\t * @param {?onAnimationCallback} callback - The application's animation loop.\n\t * @return {Promise} A Promise that resolves when the set has been executed.\n\t */\n\tasync setAnimationLoop( callback ) {\n\n\t\tif ( this._initialized === false ) await this.init();\n\n\t\tthis._animation.setAnimationLoop( callback );\n\n\t}\n\n\t/**\n\t * Returns the current animation loop callback.\n\t *\n\t * @return {?Function} The current animation loop callback.\n\t */\n\tgetAnimationLoop() {\n\n\t\treturn this._animation.getAnimationLoop();\n\n\t}\n\n\t/**\n\t * Can be used to transfer buffer data from a storage buffer attribute\n\t * from the GPU to the CPU in context of compute shaders.\n\t *\n\t * @async\n\t * @param {StorageBufferAttribute} attribute - The storage buffer attribute.\n\t * @return {Promise<ArrayBuffer>} A promise that resolves with the buffer data when the data are ready.\n\t */\n\tasync getArrayBufferAsync( attribute ) {\n\n\t\treturn await this.backend.getArrayBufferAsync( attribute );\n\n\t}\n\n\t/**\n\t * Returns the rendering context.\n\t *\n\t * @return {GPUCanvasContext|WebGL2RenderingContext} The rendering context.\n\t */\n\tgetContext() {\n\n\t\treturn this.backend.getContext();\n\n\t}\n\n\t/**\n\t * Returns the pixel ratio.\n\t *\n\t * @return {number} The pixel ratio.\n\t */\n\tgetPixelRatio() {\n\n\t\treturn this._canvasTarget.getPixelRatio();\n\n\t}\n\n\t/**\n\t * Returns the drawing buffer size in physical pixels. This method honors the pixel ratio.\n\t *\n\t * @param {Vector2} target - The method writes the result in this target object.\n\t * @return {Vector2} The drawing buffer size.\n\t */\n\tgetDrawingBufferSize( target ) {\n\n\t\treturn this._canvasTarget.getDrawingBufferSize( target );\n\n\t}\n\n\t/**\n\t * Returns the renderer's size in logical pixels. This method does not honor the pixel ratio.\n\t *\n\t * @param {Vector2} target - The method writes the result in this target object.\n\t * @return {Vector2} The renderer's size in logical pixels.\n\t */\n\tgetSize( target ) {\n\n\t\treturn this._canvasTarget.getSize( target );\n\n\t}\n\n\t/**\n\t * Sets the given pixel ratio and resizes the canvas if necessary.\n\t *\n\t * @param {number} [value=1] - The pixel ratio.\n\t */\n\tsetPixelRatio( value = 1 ) {\n\n\t\tthis._canvasTarget.setPixelRatio( value );\n\n\t}\n\n\t/**\n\t * This method allows to define the drawing buffer size by specifying\n\t * width, height and pixel ratio all at once. The size of the drawing\n\t * buffer is computed with this formula:\n\t * ```js\n\t * size.x = width * pixelRatio;\n\t * size.y = height * pixelRatio;\n\t * ```\n\t *\n\t * @param {number} width - The width in logical pixels.\n\t * @param {number} height - The height in logical pixels.\n\t * @param {number} pixelRatio - The pixel ratio.\n\t */\n\tsetDrawingBufferSize( width, height, pixelRatio ) {\n\n\t\t// Renderer can't be resized while presenting in XR.\n\t\tif ( this.xr && this.xr.isPresenting ) return;\n\n\t\tthis._canvasTarget.setDrawingBufferSize( width, height, pixelRatio );\n\n\t}\n\n\t/**\n\t * Sets the size of the renderer.\n\t *\n\t * @param {number} width - The width in logical pixels.\n\t * @param {number} height - The height in logical pixels.\n\t * @param {boolean} [updateStyle=true] - Whether to update the `style` attribute of the canvas or not.\n\t */\n\tsetSize( width, height, updateStyle = true ) {\n\n\t\t// Renderer can't be resized while presenting in XR.\n\t\tif ( this.xr && this.xr.isPresenting ) return;\n\n\t\tthis._canvasTarget.setSize( width, height, updateStyle );\n\n\t}\n\n\t/**\n\t * Defines a manual sort function for the opaque render list.\n\t * Pass `null` to use the default sort.\n\t *\n\t * @param {Function} method - The sort function.\n\t */\n\tsetOpaqueSort( method ) {\n\n\t\tthis._opaqueSort = method;\n\n\t}\n\n\t/**\n\t * Defines a manual sort function for the transparent render list.\n\t * Pass `null` to use the default sort.\n\t *\n\t * @param {Function} method - The sort function.\n\t */\n\tsetTransparentSort( method ) {\n\n\t\tthis._transparentSort = method;\n\n\t}\n\n\t/**\n\t * Returns the scissor rectangle.\n\t *\n\t * @param {Vector4} target - The method writes the result in this target object.\n\t * @return {Vector4} The scissor rectangle.\n\t */\n\tgetScissor( target ) {\n\n\t\treturn this._canvasTarget.getScissor( target );\n\n\t}\n\n\t/**\n\t * Defines the scissor rectangle.\n\t *\n\t * @param {number | Vector4} x - The horizontal coordinate for the upper left corner of the box in logical pixel unit.\n\t * Instead of passing four arguments, the method also works with a single four-dimensional vector.\n\t * @param {number} y - The vertical coordinate for the upper left corner of the box in logical pixel unit.\n\t * @param {number} width - The width of the scissor box in logical pixel unit.\n\t * @param {number} height - The height of the scissor box in logical pixel unit.\n\t */\n\tsetScissor( x, y, width, height ) {\n\n\t\tthis._canvasTarget.setScissor( x, y, width, height );\n\n\t}\n\n\t/**\n\t * Returns the scissor test value.\n\t *\n\t * @return {boolean} Whether the scissor test should be enabled or not.\n\t */\n\tgetScissorTest() {\n\n\t\treturn this._canvasTarget.getScissorTest();\n\n\t}\n\n\t/**\n\t * Defines the scissor test.\n\t *\n\t * @param {boolean} boolean - Whether the scissor test should be enabled or not.\n\t */\n\tsetScissorTest( boolean ) {\n\n\t\tthis._canvasTarget.setScissorTest( boolean );\n\n\t\t// TODO: Move it to CanvasTarget event listener.\n\n\t\tthis.backend.setScissorTest( boolean );\n\n\t}\n\n\t/**\n\t * Returns the viewport definition.\n\t *\n\t * @param {Vector4} target - The method writes the result in this target object.\n\t * @return {Vector4} The viewport definition.\n\t */\n\tgetViewport( target ) {\n\n\t\treturn this._canvasTarget.getViewport( target );\n\n\t}\n\n\t/**\n\t * Defines the viewport.\n\t *\n\t * @param {number | Vector4} x - The horizontal coordinate for the upper left corner of the viewport origin in logical pixel unit.\n\t * @param {number} y - The vertical coordinate for the upper left corner of the viewport origin  in logical pixel unit.\n\t * @param {number} width - The width of the viewport in logical pixel unit.\n\t * @param {number} height - The height of the viewport in logical pixel unit.\n\t * @param {number} minDepth - The minimum depth value of the viewport. WebGPU only.\n\t * @param {number} maxDepth - The maximum depth value of the viewport. WebGPU only.\n\t */\n\tsetViewport( x, y, width, height, minDepth = 0, maxDepth = 1 ) {\n\n\t\tthis._canvasTarget.setViewport( x, y, width, height, minDepth, maxDepth );\n\n\t}\n\n\t/**\n\t * Returns the clear color.\n\t *\n\t * @param {Color} target - The method writes the result in this target object.\n\t * @return {Color} The clear color.\n\t */\n\tgetClearColor( target ) {\n\n\t\treturn target.copy( this._clearColor );\n\n\t}\n\n\t/**\n\t * Defines the clear color and optionally the clear alpha.\n\t *\n\t * @param {Color} color - The clear color.\n\t * @param {number} [alpha=1] - The clear alpha.\n\t */\n\tsetClearColor( color, alpha = 1 ) {\n\n\t\tthis._clearColor.set( color );\n\t\tthis._clearColor.a = alpha;\n\n\t}\n\n\t/**\n\t * Returns the clear alpha.\n\t *\n\t * @return {number} The clear alpha.\n\t */\n\tgetClearAlpha() {\n\n\t\treturn this._clearColor.a;\n\n\t}\n\n\t/**\n\t * Defines the clear alpha.\n\t *\n\t * @param {number} alpha - The clear alpha.\n\t */\n\tsetClearAlpha( alpha ) {\n\n\t\tthis._clearColor.a = alpha;\n\n\t}\n\n\t/**\n\t * Returns the clear depth.\n\t *\n\t * @return {number} The clear depth.\n\t */\n\tgetClearDepth() {\n\n\t\treturn this._clearDepth;\n\n\t}\n\n\t/**\n\t * Defines the clear depth.\n\t *\n\t * @param {number} depth - The clear depth.\n\t */\n\tsetClearDepth( depth ) {\n\n\t\tthis._clearDepth = depth;\n\n\t}\n\n\t/**\n\t * Returns the clear stencil.\n\t *\n\t * @return {number} The clear stencil.\n\t */\n\tgetClearStencil() {\n\n\t\treturn this._clearStencil;\n\n\t}\n\n\t/**\n\t * Defines the clear stencil.\n\t *\n\t * @param {number} stencil - The clear stencil.\n\t */\n\tsetClearStencil( stencil ) {\n\n\t\tthis._clearStencil = stencil;\n\n\t}\n\n\t/**\n\t * This method performs an occlusion query for the given 3D object.\n\t * It returns `true` if the given 3D object is fully occluded by other\n\t * 3D objects in the scene.\n\t *\n\t * @param {Object3D} object - The 3D object to test.\n\t * @return {boolean} Whether the 3D object is fully occluded or not.\n\t */\n\tisOccluded( object ) {\n\n\t\tconst renderContext = this._currentRenderContext;\n\n\t\treturn renderContext && this.backend.isOccluded( renderContext, object );\n\n\t}\n\n\t/**\n\t * Performs a manual clear operation. This method ignores `autoClear` properties.\n\t *\n\t * @param {boolean} [color=true] - Whether the color buffer should be cleared or not.\n\t * @param {boolean} [depth=true] - Whether the depth buffer should be cleared or not.\n\t * @param {boolean} [stencil=true] - Whether the stencil buffer should be cleared or not.\n\t */\n\tclear( color = true, depth = true, stencil = true ) {\n\n\t\tif ( this._initialized === false ) {\n\n\t\t\tthrow new Error( 'Renderer: .clear() called before the backend is initialized. Use \"await renderer.init();\" before before using this method.' );\n\n\t\t}\n\n\t\tconst renderTarget = this._renderTarget || this._getFrameBufferTarget();\n\n\t\tlet renderContext = null;\n\n\t\tif ( renderTarget !== null ) {\n\n\t\t\tthis._textures.updateRenderTarget( renderTarget );\n\n\t\t\tconst renderTargetData = this._textures.get( renderTarget );\n\n\t\t\trenderContext = this._renderContexts.getForClear( renderTarget );\n\t\t\trenderContext.textures = renderTargetData.textures;\n\t\t\trenderContext.depthTexture = renderTargetData.depthTexture;\n\t\t\trenderContext.width = renderTargetData.width;\n\t\t\trenderContext.height = renderTargetData.height;\n\t\t\trenderContext.renderTarget = renderTarget;\n\t\t\trenderContext.depth = renderTarget.depthBuffer;\n\t\t\trenderContext.stencil = renderTarget.stencilBuffer;\n\t\t\t// #30329\n\t\t\trenderContext.clearColorValue = this.backend.getClearColor();\n\t\t\trenderContext.activeCubeFace = this.getActiveCubeFace();\n\t\t\trenderContext.activeMipmapLevel = this.getActiveMipmapLevel();\n\n\t\t}\n\n\t\tthis.backend.clear( color, depth, stencil, renderContext );\n\n\t\tif ( renderTarget !== null && this._renderTarget === null ) {\n\n\t\t\tthis._renderOutput( renderTarget );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Performs a manual clear operation of the color buffer. This method ignores `autoClear` properties.\n\t */\n\tclearColor() {\n\n\t\tthis.clear( true, false, false );\n\n\t}\n\n\t/**\n\t * Performs a manual clear operation of the depth buffer. This method ignores `autoClear` properties.\n\t */\n\tclearDepth() {\n\n\t\tthis.clear( false, true, false );\n\n\t}\n\n\t/**\n\t * Performs a manual clear operation of the stencil buffer. This method ignores `autoClear` properties.\n\t */\n\tclearStencil() {\n\n\t\tthis.clear( false, false, true );\n\n\t}\n\n\t/**\n\t * Async version of {@link Renderer#clear}.\n\t *\n\t * @async\n\t * @deprecated\n\t * @param {boolean} [color=true] - Whether the color buffer should be cleared or not.\n\t * @param {boolean} [depth=true] - Whether the depth buffer should be cleared or not.\n\t * @param {boolean} [stencil=true] - Whether the stencil buffer should be cleared or not.\n\t * @return {Promise} A Promise that resolves when the clear operation has been executed.\n\t */\n\tasync clearAsync( color = true, depth = true, stencil = true ) {\n\n\t\twarnOnce( 'Renderer: \"clearAsync()\" has been deprecated. Use \"clear()\" and \"await renderer.init();\" when creating the renderer.' ); // @deprecated r181\n\n\t\tawait this.init();\n\n\t\tthis.clear( color, depth, stencil );\n\n\t}\n\n\t/**\n\t * Async version of {@link Renderer#clearColor}.\n\t *\n\t * @async\n\t * @deprecated\n\t * @return {Promise} A Promise that resolves when the clear operation has been executed.\n\t */\n\tasync clearColorAsync() {\n\n\t\twarnOnce( 'Renderer: \"clearColorAsync()\" has been deprecated. Use \"clearColor()\" and \"await renderer.init();\" when creating the renderer.' ); // @deprecated r181\n\n\t\tthis.clear( true, false, false );\n\n\t}\n\n\t/**\n\t * Async version of {@link Renderer#clearDepth}.\n\t *\n\t * @async\n\t * @deprecated\n\t * @return {Promise} A Promise that resolves when the clear operation has been executed.\n\t */\n\tasync clearDepthAsync() {\n\n\t\twarnOnce( 'Renderer: \"clearDepthAsync()\" has been deprecated. Use \"clearDepth()\" and \"await renderer.init();\" when creating the renderer.' ); // @deprecated r181\n\n\t\tthis.clear( false, true, false );\n\n\t}\n\n\t/**\n\t * Async version of {@link Renderer#clearStencil}.\n\t *\n\t * @async\n\t * @deprecated\n\t * @return {Promise} A Promise that resolves when the clear operation has been executed.\n\t */\n\tasync clearStencilAsync() {\n\n\t\twarnOnce( 'Renderer: \"clearStencilAsync()\" has been deprecated. Use \"clearStencil()\" and \"await renderer.init();\" when creating the renderer.' ); // @deprecated r181\n\n\t\tthis.clear( false, false, true );\n\n\t}\n\n\t/**\n\t * Returns `true` if a framebuffer target is needed to perform tone mapping or color space conversion.\n\t * If this is the case, the renderer allocates an internal render target for that purpose.\n\t *\n\t */\n\tget needsFrameBufferTarget() {\n\n\t\tconst useToneMapping = this.currentToneMapping !== NoToneMapping;\n\t\tconst useColorSpace = this.currentColorSpace !== ColorManagement.workingColorSpace;\n\n\t\treturn useToneMapping || useColorSpace;\n\n\t}\n\n\t/**\n\t * The number of samples used for multi-sample anti-aliasing (MSAA).\n\t *\n\t * @type {number}\n\t * @default 0\n\t */\n\tget samples() {\n\n\t\treturn this._samples;\n\n\t}\n\n\t/**\n\t * The current number of samples used for multi-sample anti-aliasing (MSAA).\n\t *\n\t * When rendering to a custom render target, the number of samples of that render target is used.\n\t * If the renderer needs an internal framebuffer target for tone mapping or color space conversion,\n\t * the number of samples is set to 0.\n\t *\n\t * @type {number}\n\t */\n\tget currentSamples() {\n\n\t\tlet samples = this._samples;\n\n\t\tif ( this._renderTarget !== null ) {\n\n\t\t\tsamples = this._renderTarget.samples;\n\n\t\t} else if ( this.needsFrameBufferTarget ) {\n\n\t\t\tsamples = 0;\n\n\t\t}\n\n\t\treturn samples;\n\n\t}\n\n\t/**\n\t * The current tone mapping of the renderer. When not producing screen output,\n\t * the tone mapping is always `NoToneMapping`.\n\t *\n\t * @type {number}\n\t */\n\tget currentToneMapping() {\n\n\t\treturn this.isOutputTarget ? this.toneMapping : NoToneMapping;\n\n\t}\n\n\t/**\n\t * The current color space of the renderer. When not producing screen output,\n\t * the color space is always the working color space.\n\t *\n\t * @type {string}\n\t */\n\tget currentColorSpace() {\n\n\t\treturn this.isOutputTarget ? this.outputColorSpace : ColorManagement.workingColorSpace;\n\n\t}\n\n\t/**\n\t * Returns `true` if the rendering settings are set to screen output.\n\t *\n\t * @returns {boolean} True if the current render target is the same of output render target or `null`, otherwise false.\n\t */\n\tget isOutputTarget() {\n\n\t\treturn this._renderTarget === this._outputRenderTarget || this._renderTarget === null;\n\n\t}\n\n\t/**\n\t * Frees all internal resources of the renderer. Call this method if the renderer\n\t * is no longer in use by your app.\n\t */\n\tdispose() {\n\n\t\tif ( this._initialized === true ) {\n\n\t\t\tthis.info.dispose();\n\t\t\tthis.backend.dispose();\n\n\t\t\tthis._animation.dispose();\n\t\t\tthis._objects.dispose();\n\t\t\tthis._geometries.dispose();\n\t\t\tthis._pipelines.dispose();\n\t\t\tthis._nodes.dispose();\n\t\t\tthis._bindings.dispose();\n\t\t\tthis._renderLists.dispose();\n\t\t\tthis._renderContexts.dispose();\n\t\t\tthis._textures.dispose();\n\n\t\t\tif ( this._frameBufferTarget !== null ) this._frameBufferTarget.dispose();\n\n\t\t\tObject.values( this.backend.timestampQueryPool ).forEach( queryPool => {\n\n\t\t\t\tif ( queryPool !== null ) queryPool.dispose();\n\n\t\t\t} );\n\n\t\t}\n\n\t\tthis.setRenderTarget( null );\n\t\tthis.setAnimationLoop( null );\n\n\t}\n\n\t/**\n\t * Sets the given render target. Calling this method means the renderer does not\n\t * target the default framebuffer (meaning the canvas) anymore but a custom framebuffer.\n\t * Use `null` as the first argument to reset the state.\n\t *\n\t * @param {?RenderTarget} renderTarget - The render target to set.\n\t * @param {number} [activeCubeFace=0] - The active cube face.\n\t * @param {number} [activeMipmapLevel=0] - The active mipmap level.\n\t */\n\tsetRenderTarget( renderTarget, activeCubeFace = 0, activeMipmapLevel = 0 ) {\n\n\t\tthis._renderTarget = renderTarget;\n\t\tthis._activeCubeFace = activeCubeFace;\n\t\tthis._activeMipmapLevel = activeMipmapLevel;\n\n\t}\n\n\t/**\n\t * Returns the current render target.\n\t *\n\t * @return {?RenderTarget} The render target. Returns `null` if no render target is set.\n\t */\n\tgetRenderTarget() {\n\n\t\treturn this._renderTarget;\n\n\t}\n\n\t/**\n\t * Sets the output render target for the renderer.\n\t *\n\t * @param {Object} renderTarget - The render target to set as the output target.\n\t */\n\tsetOutputRenderTarget( renderTarget ) {\n\n\t\tthis._outputRenderTarget = renderTarget;\n\n\t}\n\n\t/**\n\t * Returns the current output target.\n\t *\n\t * @return {?RenderTarget} The current output render target. Returns `null` if no output target is set.\n\t */\n\tgetOutputRenderTarget() {\n\n\t\treturn this._outputRenderTarget;\n\n\t}\n\n\t/**\n\t * Sets the canvas target. The canvas target manages the HTML canvas\n\t * or the offscreen canvas the renderer draws into.\n\t *\n\t * @param {CanvasTarget} canvasTarget - The canvas target.\n\t */\n\tsetCanvasTarget( canvasTarget ) {\n\n\t\tthis._canvasTarget.removeEventListener( 'resize', this._onCanvasTargetResize );\n\n\t\tthis._canvasTarget = canvasTarget;\n\t\tthis._canvasTarget.addEventListener( 'resize', this._onCanvasTargetResize );\n\n\t}\n\n\t/**\n\t * Returns the current canvas target.\n\t *\n\t * @return {CanvasTarget} The current canvas target.\n\t */\n\tgetCanvasTarget() {\n\n\t\treturn this._canvasTarget;\n\n\t}\n\n\t/**\n\t * Resets the renderer to the initial state before WebXR started.\n\t *\n\t * @private\n\t */\n\t_resetXRState() {\n\n\t\tthis.backend.setXRTarget( null );\n\t\tthis.setOutputRenderTarget( null );\n\t\tthis.setRenderTarget( null );\n\n\t\tthis._frameBufferTarget.dispose();\n\t\tthis._frameBufferTarget = null;\n\n\t}\n\n\t/**\n\t * Callback for {@link Renderer#setRenderObjectFunction}.\n\t *\n\t * @callback renderObjectFunction\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Scene} scene - The scene the 3D object belongs to.\n\t * @param {Camera} camera - The camera the object should be rendered with.\n\t * @param {BufferGeometry} geometry - The object's geometry.\n\t * @param {Material} material - The object's material.\n\t * @param {?Object} group - Only relevant for objects using multiple materials. This represents a group entry from the respective `BufferGeometry`.\n\t * @param {LightsNode} lightsNode - The current lights node.\n\t * @param {ClippingContext} clippingContext - The clipping context.\n\t * @param {?string} [passId=null] - An optional ID for identifying the pass.\n\t */\n\n\t/**\n\t * Sets the given render object function. Calling this method overwrites the default implementation\n\t * which is {@link Renderer#renderObject}. Defining a custom function can be useful\n\t * if you want to modify the way objects are rendered. For example you can define things like \"every\n\t * object that has material of a certain type should perform a pre-pass with a special overwrite material\".\n\t * The custom function must always call `renderObject()` in its implementation.\n\t *\n\t * Use `null` as the first argument to reset the state.\n\t *\n\t * @param {?renderObjectFunction} renderObjectFunction - The render object function.\n\t */\n\tsetRenderObjectFunction( renderObjectFunction ) {\n\n\t\tthis._renderObjectFunction = renderObjectFunction;\n\n\t}\n\n\t/**\n\t * Returns the current render object function.\n\t *\n\t * @return {?Function} The current render object function. Returns `null` if no function is set.\n\t */\n\tgetRenderObjectFunction() {\n\n\t\treturn this._renderObjectFunction;\n\n\t}\n\n\t/**\n\t * Execute a single or an array of compute nodes. This method can only be called\n\t * if the renderer has been initialized.\n\t *\n\t * @param {Node|Array<Node>} computeNodes - The compute node(s).\n\t * @param {number|Array<number>|IndirectStorageBufferAttribute} [dispatchSize=null]\n\t * - A single number representing count, or\n\t * - An array [x, y, z] representing dispatch size, or\n\t * - A IndirectStorageBufferAttribute for indirect dispatch size.\n\t * @return {Promise|undefined} A Promise that resolve when the compute has finished. Only returned when the renderer has not been initialized.\n\t */\n\tcompute( computeNodes, dispatchSize = null ) {\n\n\t\tif ( this._isDeviceLost === true ) return;\n\n\t\tif ( this._initialized === false ) {\n\n\t\t\twarn( 'Renderer: .compute() called before the backend is initialized. Try using .computeAsync() instead.' );\n\n\t\t\treturn this.computeAsync( computeNodes, dispatchSize );\n\n\t\t}\n\n\t\t//\n\n\t\tconst nodeFrame = this._nodes.nodeFrame;\n\n\t\tconst previousRenderId = nodeFrame.renderId;\n\n\t\t//\n\n\t\tthis.info.calls ++;\n\t\tthis.info.compute.calls ++;\n\t\tthis.info.compute.frameCalls ++;\n\n\t\tnodeFrame.renderId = this.info.calls;\n\n\t\t//\n\n\t\tthis.backend.updateTimeStampUID( computeNodes );\n\n\t\tthis.inspector.beginCompute( this.backend.getTimestampUID( computeNodes ), computeNodes );\n\n\t\t//\n\n\t\tconst backend = this.backend;\n\t\tconst pipelines = this._pipelines;\n\t\tconst bindings = this._bindings;\n\t\tconst nodes = this._nodes;\n\n\t\tconst computeList = Array.isArray( computeNodes ) ? computeNodes : [ computeNodes ];\n\n\t\tif ( computeList[ 0 ] === undefined || computeList[ 0 ].isComputeNode !== true ) {\n\n\t\t\tthrow new Error( 'THREE.Renderer: .compute() expects a ComputeNode.' );\n\n\t\t}\n\n\t\tbackend.beginCompute( computeNodes );\n\n\t\tfor ( const computeNode of computeList ) {\n\n\t\t\t// onInit\n\n\t\t\tif ( pipelines.has( computeNode ) === false ) {\n\n\t\t\t\tconst dispose = () => {\n\n\t\t\t\t\tcomputeNode.removeEventListener( 'dispose', dispose );\n\n\t\t\t\t\tpipelines.delete( computeNode );\n\t\t\t\t\tbindings.deleteForCompute( computeNode );\n\t\t\t\t\tnodes.delete( computeNode );\n\n\t\t\t\t};\n\n\t\t\t\tcomputeNode.addEventListener( 'dispose', dispose );\n\n\t\t\t\t//\n\n\t\t\t\tconst onInitFn = computeNode.onInitFunction;\n\n\t\t\t\tif ( onInitFn !== null ) {\n\n\t\t\t\t\tonInitFn.call( computeNode, { renderer: this } );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tnodes.updateForCompute( computeNode );\n\t\t\tbindings.updateForCompute( computeNode );\n\n\t\t\tconst computeBindings = bindings.getForCompute( computeNode );\n\t\t\tconst computePipeline = pipelines.getForCompute( computeNode, computeBindings );\n\n\t\t\tbackend.compute( computeNodes, computeNode, computeBindings, computePipeline, dispatchSize );\n\n\t\t}\n\n\t\tbackend.finishCompute( computeNodes );\n\n\t\t//\n\n\t\tnodeFrame.renderId = previousRenderId;\n\n\t\t//\n\n\t\tthis.inspector.finishCompute( this.backend.getTimestampUID( computeNodes ) );\n\n\t}\n\n\t/**\n\t * Execute a single or an array of compute nodes.\n\t *\n\t * @async\n\t * @param {Node|Array<Node>} computeNodes - The compute node(s).\n\t * @param {number|Array<number>|IndirectStorageBufferAttribute} [dispatchSize=null]\n\t * - A single number representing count, or\n\t * - An array [x, y, z] representing dispatch size, or\n\t * - A IndirectStorageBufferAttribute for indirect dispatch size.\n\t * @return {Promise} A Promise that resolve when the compute has finished.\n\t */\n\tasync computeAsync( computeNodes, dispatchSize = null ) {\n\n\t\tif ( this._initialized === false ) await this.init();\n\n\t\tthis.compute( computeNodes, dispatchSize );\n\n\t}\n\n\t/**\n\t * Checks if the given feature is supported by the selected backend.\n\t *\n\t * @async\n\t * @deprecated\n\t * @param {string} name - The feature's name.\n\t * @return {Promise<boolean>} A Promise that resolves with a bool that indicates whether the feature is supported or not.\n\t */\n\tasync hasFeatureAsync( name ) {\n\n\t\twarnOnce( 'Renderer: \"hasFeatureAsync()\" has been deprecated. Use \"hasFeature()\" and \"await renderer.init();\" when creating the renderer.' ); // @deprecated r181\n\n\t\tawait this.init();\n\n\t\treturn this.hasFeature( name );\n\n\t}\n\n\tasync resolveTimestampsAsync( type = 'render' ) {\n\n\t\tif ( this._initialized === false ) await this.init();\n\n\t\treturn this.backend.resolveTimestampsAsync( type );\n\n\t}\n\n\t/**\n\t * Checks if the given feature is supported by the selected backend. If the\n\t * renderer has not been initialized, this method always returns `false`.\n\t *\n\t * @param {string} name - The feature's name.\n\t * @return {boolean} Whether the feature is supported or not.\n\t */\n\thasFeature( name ) {\n\n\t\tif ( this._initialized === false ) {\n\n\t\t\tthrow new Error( 'Renderer: .hasFeature() called before the backend is initialized. Use \"await renderer.init();\" before before using this method.' );\n\n\t\t}\n\n\t\treturn this.backend.hasFeature( name );\n\n\t}\n\n\t/**\n\t * Returns `true` when the renderer has been initialized.\n\t *\n\t * @return {boolean} Whether the renderer has been initialized or not.\n\t */\n\thasInitialized() {\n\n\t\treturn this._initialized;\n\n\t}\n\n\t/**\n\t * Initializes the given textures. Useful for preloading a texture rather than waiting until first render\n\t * (which can cause noticeable lags due to decode and GPU upload overhead).\n\t *\n\t * @async\n\t * @deprecated\n\t * @param {Texture} texture - The texture.\n\t * @return {Promise} A Promise that resolves when the texture has been initialized.\n\t */\n\tasync initTextureAsync( texture ) {\n\n\t\twarnOnce( 'Renderer: \"initTextureAsync()\" has been deprecated. Use \"initTexture()\" and \"await renderer.init();\" when creating the renderer.' ); // @deprecated r181\n\n\t\tawait this.init();\n\n\t\tthis.initTexture( texture );\n\n\t}\n\n\t/**\n\t * Initializes the given texture. Useful for preloading a texture rather than waiting until first render\n\t * (which can cause noticeable lags due to decode and GPU upload overhead).\n\t *\n\t * This method can only be used if the renderer has been initialized.\n\t *\n\t * @param {Texture} texture - The texture.\n\t */\n\tinitTexture( texture ) {\n\n\t\tif ( this._initialized === false ) {\n\n\t\t\tthrow new Error( 'Renderer: .initTexture() called before the backend is initialized. Use \"await renderer.init();\" before before using this method.' );\n\n\t\t}\n\n\t\tthis._textures.updateTexture( texture );\n\n\t}\n\n\t/**\n\t * Copies the current bound framebuffer into the given texture.\n\t *\n\t * @param {FramebufferTexture} framebufferTexture - The texture.\n\t * @param {?(Vector2|Vector4)} [rectangle=null] - A two or four dimensional vector that defines the rectangular portion of the framebuffer that should be copied.\n\t */\n\tcopyFramebufferToTexture( framebufferTexture, rectangle = null ) {\n\n\t\tif ( rectangle !== null ) {\n\n\t\t\tif ( rectangle.isVector2 ) {\n\n\t\t\t\trectangle = _vector4.set( rectangle.x, rectangle.y, framebufferTexture.image.width, framebufferTexture.image.height ).floor();\n\n\t\t\t} else if ( rectangle.isVector4 ) {\n\n\t\t\t\trectangle = _vector4.copy( rectangle ).floor();\n\n\t\t\t} else {\n\n\t\t\t\terror( 'Renderer.copyFramebufferToTexture: Invalid rectangle.' );\n\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\trectangle = _vector4.set( 0, 0, framebufferTexture.image.width, framebufferTexture.image.height );\n\n\t\t}\n\n\t\t//\n\n\t\tlet renderContext = this._currentRenderContext;\n\t\tlet renderTarget;\n\n\t\tif ( renderContext !== null ) {\n\n\t\t\trenderTarget = renderContext.renderTarget;\n\n\t\t} else {\n\n\t\t\trenderTarget = this._renderTarget || this._getFrameBufferTarget();\n\n\t\t\tif ( renderTarget !== null ) {\n\n\t\t\t\tthis._textures.updateRenderTarget( renderTarget );\n\n\t\t\t\trenderContext = this._textures.get( renderTarget );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tthis._textures.updateTexture( framebufferTexture, { renderTarget } );\n\n\t\tthis.backend.copyFramebufferToTexture( framebufferTexture, renderContext, rectangle );\n\n\t\tthis._inspector.copyFramebufferToTexture( framebufferTexture );\n\n\t}\n\n\t/**\n\t * Copies data of the given source texture into a destination texture.\n\t *\n\t * @param {Texture} srcTexture - The source texture.\n\t * @param {Texture} dstTexture - The destination texture.\n\t * @param {Box2|Box3} [srcRegion=null] - A bounding box which describes the source region. Can be two or three-dimensional.\n\t * @param {Vector2|Vector3} [dstPosition=null] - A vector that represents the origin of the destination region. Can be two or three-dimensional.\n\t * @param {number} [srcLevel=0] - The source mip level to copy from.\n\t * @param {number} [dstLevel=0] - The destination mip level to copy to.\n\t */\n\tcopyTextureToTexture( srcTexture, dstTexture, srcRegion = null, dstPosition = null, srcLevel = 0, dstLevel = 0 ) {\n\n\t\tthis._textures.updateTexture( srcTexture );\n\t\tthis._textures.updateTexture( dstTexture );\n\n\t\tthis.backend.copyTextureToTexture( srcTexture, dstTexture, srcRegion, dstPosition, srcLevel, dstLevel );\n\n\t\tthis._inspector.copyTextureToTexture( srcTexture, dstTexture );\n\n\t}\n\n\t/**\n\t * Reads pixel data from the given render target.\n\t *\n\t * @async\n\t * @param {RenderTarget} renderTarget - The render target to read from.\n\t * @param {number} x - The `x` coordinate of the copy region's origin.\n\t * @param {number} y - The `y` coordinate of the copy region's origin.\n\t * @param {number} width - The width of the copy region.\n\t * @param {number} height - The height of the copy region.\n\t * @param {number} [textureIndex=0] - The texture index of a MRT render target.\n\t * @param {number} [faceIndex=0] - The active cube face index.\n\t * @return {Promise<TypedArray>} A Promise that resolves when the read has been finished. The resolve provides the read data as a typed array.\n\t */\n\tasync readRenderTargetPixelsAsync( renderTarget, x, y, width, height, textureIndex = 0, faceIndex = 0 ) {\n\n\t\treturn this.backend.copyTextureToBuffer( renderTarget.textures[ textureIndex ], x, y, width, height, faceIndex );\n\n\t}\n\n\t/**\n\t * Analyzes the given 3D object's hierarchy and builds render lists from the\n\t * processed hierarchy.\n\t *\n\t * @private\n\t * @param {Object3D} object - The 3D object to process (usually a scene).\n\t * @param {Camera} camera - The camera the object is rendered with.\n\t * @param {number} groupOrder - The group order is derived from the `renderOrder` of groups and is used to group 3D objects within groups.\n\t * @param {RenderList} renderList - The current render list.\n\t * @param {ClippingContext} clippingContext - The current clipping context.\n\t */\n\t_projectObject( object, camera, groupOrder, renderList, clippingContext ) {\n\n\t\tif ( object.visible === false ) return;\n\n\t\tconst visible = object.layers.test( camera.layers );\n\n\t\tif ( visible ) {\n\n\t\t\tif ( object.isGroup ) {\n\n\t\t\t\tgroupOrder = object.renderOrder;\n\n\t\t\t\tif ( object.isClippingGroup && object.enabled ) clippingContext = clippingContext.getGroupContext( object );\n\n\t\t\t} else if ( object.isLOD ) {\n\n\t\t\t\tif ( object.autoUpdate === true ) object.update( camera );\n\n\t\t\t} else if ( object.isLight ) {\n\n\t\t\t\trenderList.pushLight( object );\n\n\t\t\t} else if ( object.isSprite ) {\n\n\t\t\t\tconst frustum = camera.isArrayCamera ? _frustumArray : _frustum;\n\n\t\t\t\tif ( ! object.frustumCulled || frustum.intersectsSprite( object, camera ) ) {\n\n\t\t\t\t\tif ( this.sortObjects === true ) {\n\n\t\t\t\t\t\t_vector4.setFromMatrixPosition( object.matrixWorld ).applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst { geometry, material } = object;\n\n\t\t\t\t\tif ( material.visible ) {\n\n\t\t\t\t\t\trenderList.push( object, geometry, material, groupOrder, _vector4.z, null, clippingContext );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t} else if ( object.isLineLoop ) {\n\n\t\t\t\terror( 'Renderer: Objects of type THREE.LineLoop are not supported. Please use THREE.Line or THREE.LineSegments.' );\n\n\t\t\t} else if ( object.isMesh || object.isLine || object.isPoints ) {\n\n\t\t\t\tconst frustum = camera.isArrayCamera ? _frustumArray : _frustum;\n\n\t\t\t\tif ( ! object.frustumCulled || frustum.intersectsObject( object, camera ) ) {\n\n\t\t\t\t\tconst { geometry, material } = object;\n\n\t\t\t\t\tif ( this.sortObjects === true ) {\n\n\t\t\t\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t\t\t\t_vector4\n\t\t\t\t\t\t\t.copy( geometry.boundingSphere.center )\n\t\t\t\t\t\t\t.applyMatrix4( object.matrixWorld )\n\t\t\t\t\t\t\t.applyMatrix4( _projScreenMatrix );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( Array.isArray( material ) ) {\n\n\t\t\t\t\t\tconst groups = geometry.groups;\n\n\t\t\t\t\t\tfor ( let i = 0, l = groups.length; i < l; i ++ ) {\n\n\t\t\t\t\t\t\tconst group = groups[ i ];\n\t\t\t\t\t\t\tconst groupMaterial = material[ group.materialIndex ];\n\n\t\t\t\t\t\t\tif ( groupMaterial && groupMaterial.visible ) {\n\n\t\t\t\t\t\t\t\trenderList.push( object, geometry, groupMaterial, groupOrder, _vector4.z, group, clippingContext );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if ( material.visible ) {\n\n\t\t\t\t\t\trenderList.push( object, geometry, material, groupOrder, _vector4.z, null, clippingContext );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( object.isBundleGroup === true && this.backend.beginBundle !== undefined ) {\n\n\t\t\tconst baseRenderList = renderList;\n\n\t\t\t// replace render list\n\t\t\trenderList = this._renderLists.get( object, camera );\n\n\t\t\trenderList.begin();\n\n\t\t\tbaseRenderList.pushBundle( {\n\t\t\t\tbundleGroup: object,\n\t\t\t\tcamera,\n\t\t\t\trenderList,\n\t\t\t} );\n\n\t\t\trenderList.finish();\n\n\t\t}\n\n\t\tconst children = object.children;\n\n\t\tfor ( let i = 0, l = children.length; i < l; i ++ ) {\n\n\t\t\tthis._projectObject( children[ i ], camera, groupOrder, renderList, clippingContext );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Renders the given render bundles.\n\t *\n\t * @private\n\t * @param {Array<Object>} bundles - Array with render bundle data.\n\t * @param {Scene} sceneRef - The scene the render bundles belong to.\n\t * @param {LightsNode} lightsNode - The current lights node.\n\t */\n\t_renderBundles( bundles, sceneRef, lightsNode ) {\n\n\t\tfor ( const bundle of bundles ) {\n\n\t\t\tthis._renderBundle( bundle, sceneRef, lightsNode );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Renders the transparent objects from the given render lists.\n\t *\n\t * @private\n\t * @param {Array<Object>} renderList - The transparent render list.\n\t * @param {Array<Object>} doublePassList - The list of transparent objects which require a double pass (e.g. because of transmission).\n\t * @param {Camera} camera - The camera the render list should be rendered with.\n\t * @param {Scene} scene - The scene the render list belongs to.\n\t * @param {LightsNode} lightsNode - The current lights node.\n\t */\n\t_renderTransparents( renderList, doublePassList, camera, scene, lightsNode ) {\n\n\t\tif ( doublePassList.length > 0 ) {\n\n\t\t\t// render back side\n\n\t\t\tfor ( const { material } of doublePassList ) {\n\n\t\t\t\tmaterial.side = BackSide;\n\n\t\t\t}\n\n\t\t\tthis._renderObjects( doublePassList, camera, scene, lightsNode, 'backSide' );\n\n\t\t\t// render front side\n\n\t\t\tfor ( const { material } of doublePassList ) {\n\n\t\t\t\tmaterial.side = FrontSide;\n\n\t\t\t}\n\n\t\t\tthis._renderObjects( renderList, camera, scene, lightsNode );\n\n\t\t\t// restore\n\n\t\t\tfor ( const { material } of doublePassList ) {\n\n\t\t\t\tmaterial.side = DoubleSide;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis._renderObjects( renderList, camera, scene, lightsNode );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Renders the objects from the given render list.\n\t *\n\t * @private\n\t * @param {Array<Object>} renderList - The render list.\n\t * @param {Camera} camera - The camera the render list should be rendered with.\n\t * @param {Scene} scene - The scene the render list belongs to.\n\t * @param {LightsNode} lightsNode - The current lights node.\n\t * @param {?string} [passId=null] - An optional ID for identifying the pass.\n\t */\n\t_renderObjects( renderList, camera, scene, lightsNode, passId = null ) {\n\n\t\tfor ( let i = 0, il = renderList.length; i < il; i ++ ) {\n\n\t\t\tconst { object, geometry, material, group, clippingContext } = renderList[ i ];\n\n\t\t\tthis._currentRenderObjectFunction( object, scene, camera, geometry, material, group, lightsNode, clippingContext, passId );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Retrieves shadow nodes for the given material. This is used to setup shadow passes.\n\t * The result is cached per material and updated when the material's version changes.\n\t *\n\t * @private\n\t * @param {Material} material\n\t * @returns {Object} - The shadow nodes for the material.\n\t */\n\t_getShadowNodes( material ) {\n\n\t\tconst version = material.version;\n\n\t\tlet cache = this._cacheShadowNodes.get( material );\n\n\t\tif ( cache === undefined || cache.version !== version ) {\n\n\t\t\tconst hasMap = material.map !== null;\n\t\t\tconst hasColorNode = material.colorNode && material.colorNode.isNode;\n\t\t\tconst hasCastShadowNode = material.castShadowNode && material.castShadowNode.isNode;\n\n\t\t\tlet positionNode = null;\n\t\t\tlet colorNode = null;\n\t\t\tlet depthNode = null;\n\n\t\t\tif ( hasMap || hasColorNode || hasCastShadowNode ) {\n\n\t\t\t\tlet shadowRGB;\n\t\t\t\tlet shadowAlpha;\n\n\t\t\t\tif ( hasCastShadowNode ) {\n\n\t\t\t\t\tshadowRGB = material.castShadowNode.rgb;\n\t\t\t\t\tshadowAlpha = material.castShadowNode.a;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tshadowRGB = vec3( 0 );\n\t\t\t\t\tshadowAlpha = float( 1 );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasMap ) {\n\n\t\t\t\t\tshadowAlpha = shadowAlpha.mul( reference( 'map', 'texture', material ).a );\n\n\t\t\t\t}\n\n\t\t\t\tif ( hasColorNode ) {\n\n\t\t\t\t\tshadowAlpha = shadowAlpha.mul( material.colorNode.a );\n\n\t\t\t\t}\n\n\t\t\t\tcolorNode = vec4( shadowRGB, shadowAlpha );\n\n\t\t\t}\n\n\t\t\tif ( material.depthNode && material.depthNode.isNode ) {\n\n\t\t\t\tdepthNode = material.depthNode;\n\n\t\t\t}\n\n\t\t\tif ( material.castShadowPositionNode && material.castShadowPositionNode.isNode ) {\n\n\t\t\t\tpositionNode = material.castShadowPositionNode;\n\n\t\t\t} else if ( material.positionNode && material.positionNode.isNode ) {\n\n\t\t\t\tpositionNode = material.positionNode;\n\n\t\t\t}\n\n\t\t\tcache = {\n\t\t\t\tversion,\n\t\t\t\tcolorNode,\n\t\t\t\tdepthNode,\n\t\t\t\tpositionNode\n\t\t\t};\n\n\t\t\tthis._cacheShadowNodes.set( material, cache );\n\n\t\t}\n\n\t\treturn cache;\n\n\t}\n\n\t/**\n\t * This method represents the default render object function that manages the render lifecycle\n\t * of the object.\n\t *\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Scene} scene - The scene the 3D object belongs to.\n\t * @param {Camera} camera - The camera the object should be rendered with.\n\t * @param {BufferGeometry} geometry - The object's geometry.\n\t * @param {Material} material - The object's material.\n\t * @param {?Object} group - Only relevant for objects using multiple materials. This represents a group entry from the respective `BufferGeometry`.\n\t * @param {LightsNode} lightsNode - The current lights node.\n\t * @param {?ClippingContext} clippingContext - The clipping context.\n\t * @param {?string} [passId=null] - An optional ID for identifying the pass.\n\t */\n\trenderObject( object, scene, camera, geometry, material, group, lightsNode, clippingContext = null, passId = null ) {\n\n\t\tlet materialOverride = false;\n\t\tlet materialColorNode;\n\t\tlet materialDepthNode;\n\t\tlet materialPositionNode;\n\t\tlet materialSide;\n\n\t\t//\n\n\t\tobject.onBeforeRender( this, scene, camera, geometry, material, group );\n\n\t\t//\n\n\t\tif ( material.allowOverride === true && scene.overrideMaterial !== null ) {\n\n\t\t\tconst overrideMaterial = scene.overrideMaterial;\n\n\t\t\tmaterialOverride = true;\n\n\t\t\t// store original nodes\n\t\t\tmaterialColorNode = scene.overrideMaterial.colorNode;\n\t\t\tmaterialDepthNode = scene.overrideMaterial.depthNode;\n\t\t\tmaterialPositionNode = scene.overrideMaterial.positionNode;\n\t\t\tmaterialSide = scene.overrideMaterial.side;\n\n\t\t\tif ( material.positionNode && material.positionNode.isNode ) {\n\n\t\t\t\toverrideMaterial.positionNode = material.positionNode;\n\n\t\t\t}\n\n\t\t\toverrideMaterial.alphaTest = material.alphaTest;\n\t\t\toverrideMaterial.alphaMap = material.alphaMap;\n\t\t\toverrideMaterial.transparent = material.transparent || material.transmission > 0 ||\n\t\t\t\t( material.transmissionNode && material.transmissionNode.isNode ) ||\n\t\t\t\t( material.backdropNode && material.backdropNode.isNode );\n\n\t\t\tif ( overrideMaterial.isShadowPassMaterial ) {\n\n\t\t\t\tconst { colorNode, depthNode, positionNode } = this._getShadowNodes( material );\n\n\t\t\t\toverrideMaterial.side = material.shadowSide === null ? material.side : material.shadowSide;\n\n\t\t\t\tif ( colorNode !== null ) overrideMaterial.colorNode = colorNode;\n\t\t\t\tif ( depthNode !== null ) overrideMaterial.depthNode = depthNode;\n\t\t\t\tif ( positionNode !== null ) overrideMaterial.positionNode = positionNode;\n\n\t\t\t}\n\n\t\t\tmaterial = overrideMaterial;\n\n\t\t}\n\n\t\t//\n\n\t\tif ( material.transparent === true && material.side === DoubleSide && material.forceSinglePass === false ) {\n\n\t\t\tmaterial.side = BackSide;\n\t\t\tthis._handleObjectFunction( object, material, scene, camera, lightsNode, group, clippingContext, 'backSide' ); // create backSide pass id\n\n\t\t\tmaterial.side = FrontSide;\n\t\t\tthis._handleObjectFunction( object, material, scene, camera, lightsNode, group, clippingContext, passId ); // use default pass id\n\n\t\t\tmaterial.side = DoubleSide;\n\n\t\t} else {\n\n\t\t\tthis._handleObjectFunction( object, material, scene, camera, lightsNode, group, clippingContext, passId );\n\n\t\t}\n\n\t\t//\n\n\t\tif ( materialOverride ) {\n\n\t\t\tscene.overrideMaterial.colorNode = materialColorNode;\n\t\t\tscene.overrideMaterial.depthNode = materialDepthNode;\n\t\t\tscene.overrideMaterial.positionNode = materialPositionNode;\n\t\t\tscene.overrideMaterial.side = materialSide;\n\n\t\t}\n\n\t\t//\n\n\t\tobject.onAfterRender( this, scene, camera, geometry, material, group );\n\n\t}\n\n\t/**\n\t * This method represents the default `_handleObjectFunction` implementation which creates\n\t * a render object from the given data and performs the draw command with the selected backend.\n\t *\n\t * @private\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Material} material - The object's material.\n\t * @param {Scene} scene - The scene the 3D object belongs to.\n\t * @param {Camera} camera - The camera the object should be rendered with.\n\t * @param {LightsNode} lightsNode - The current lights node.\n\t * @param {?{start: number, count: number}} group - Only relevant for objects using multiple materials. This represents a group entry from the respective `BufferGeometry`.\n\t * @param {ClippingContext} clippingContext - The clipping context.\n\t * @param {string} [passId] - An optional ID for identifying the pass.\n\t */\n\t_renderObjectDirect( object, material, scene, camera, lightsNode, group, clippingContext, passId ) {\n\n\t\tconst renderObject = this._objects.get( object, material, scene, camera, lightsNode, this._currentRenderContext, clippingContext, passId );\n\t\trenderObject.drawRange = object.geometry.drawRange;\n\t\trenderObject.group = group;\n\n\t\t//\n\n\t\tconst needsRefresh = this._nodes.needsRefresh( renderObject );\n\n\t\tif ( needsRefresh ) {\n\n\t\t\tthis._nodes.updateBefore( renderObject );\n\n\t\t\tthis._geometries.updateForRender( renderObject );\n\n\t\t\tthis._nodes.updateForRender( renderObject );\n\t\t\tthis._bindings.updateForRender( renderObject );\n\n\t\t}\n\n\t\tthis._pipelines.updateForRender( renderObject );\n\n\t\t//\n\n\t\tif ( this._currentRenderBundle !== null ) {\n\n\t\t\tconst renderBundleData = this.backend.get( this._currentRenderBundle );\n\n\t\t\trenderBundleData.renderObjects.push( renderObject );\n\n\t\t\trenderObject.bundle = this._currentRenderBundle.bundleGroup;\n\n\t\t}\n\n\t\tthis.backend.draw( renderObject, this.info );\n\n\t\tif ( needsRefresh ) this._nodes.updateAfter( renderObject );\n\n\t}\n\n\t/**\n\t * A different implementation for `_handleObjectFunction` which only makes sure the object is ready for rendering.\n\t * Used in `compileAsync()`.\n\t *\n\t * @private\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Material} material - The object's material.\n\t * @param {Scene} scene - The scene the 3D object belongs to.\n\t * @param {Camera} camera - The camera the object should be rendered with.\n\t * @param {LightsNode} lightsNode - The current lights node.\n\t * @param {?{start: number, count: number}} group - Only relevant for objects using multiple materials. This represents a group entry from the respective `BufferGeometry`.\n\t * @param {ClippingContext} clippingContext - The clipping context.\n\t * @param {string} [passId] - An optional ID for identifying the pass.\n\t */\n\t_createObjectPipeline( object, material, scene, camera, lightsNode, group, clippingContext, passId ) {\n\n\t\tconst renderObject = this._objects.get( object, material, scene, camera, lightsNode, this._currentRenderContext, clippingContext, passId );\n\t\trenderObject.drawRange = object.geometry.drawRange;\n\t\trenderObject.group = group;\n\n\t\t//\n\n\t\tthis._nodes.updateBefore( renderObject );\n\n\t\tthis._geometries.updateForRender( renderObject );\n\n\t\tthis._nodes.updateForRender( renderObject );\n\t\tthis._bindings.updateForRender( renderObject );\n\n\t\tthis._pipelines.getForRender( renderObject, this._compilationPromises );\n\n\t\tthis._nodes.updateAfter( renderObject );\n\n\t}\n\n\t/**\n\t * Callback when the canvas has been resized.\n\t *\n\t * @private\n\t */\n\t_onCanvasTargetResize() {\n\n\t\tif ( this._initialized ) this.backend.updateSize();\n\n\t}\n\n\t/**\n\t * Alias for `compileAsync()`.\n\t *\n\t * @method\n\t * @param {Object3D} scene - The scene or 3D object to precompile.\n\t * @param {Camera} camera - The camera that is used to render the scene.\n\t * @param {Scene} targetScene - If the first argument is a 3D object, this parameter must represent the scene the 3D object is going to be added.\n\t * @return {function(Object3D, Camera, ?Scene): Promise|undefined} A Promise that resolves when the compile has been finished.\n\t */\n\tget compile() {\n\n\t\treturn this.compileAsync;\n\n\t}\n\n}\n\n/**\n * A binding represents the connection between a resource (like a texture, sampler\n * or uniform buffer) and the resource definition in a shader stage.\n *\n * This module is an abstract base class for all concrete bindings types.\n *\n * @abstract\n * @private\n */\nclass Binding {\n\n\t/**\n\t * Constructs a new binding.\n\t *\n\t * @param {string} [name=''] - The binding's name.\n\t */\n\tconstructor( name = '' ) {\n\n\t\t/**\n\t\t * The binding's name.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.name = name;\n\n\t\t/**\n\t\t * A bitmask that defines in what shader stages the\n\t\t * binding's resource is accessible.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.visibility = 0;\n\n\t}\n\n\t/**\n\t * Makes sure binding's resource is visible for the given shader stage.\n\t *\n\t * @param {number} visibility - The shader stage.\n\t */\n\tsetVisibility( visibility ) {\n\n\t\tthis.visibility |= visibility;\n\n\t}\n\n\t/**\n\t * The shader stages in which the binding's resource is visible.\n\t *\n\t * @return {number} The visibility bitmask.\n\t */\n\tgetVisibility() {\n\n\t\treturn this.visibility;\n\n\t}\n\n\t/**\n\t * Clones the binding.\n\t *\n\t * @return {Binding} The cloned binding.\n\t */\n\tclone() {\n\n\t\treturn Object.assign( new this.constructor(), this );\n\n\t}\n\n}\n\n/**\n * This function is usually called with the length in bytes of an array buffer.\n * It returns an padded value which ensure chunk size alignment according to STD140 layout.\n *\n * @function\n * @param {number} floatLength - The buffer length.\n * @return {number} The padded length.\n */\nfunction getFloatLength( floatLength ) {\n\n\t// ensure chunk size alignment (STD140 layout)\n\n\treturn floatLength + ( ( GPU_CHUNK_BYTES - ( floatLength % GPU_CHUNK_BYTES ) ) % GPU_CHUNK_BYTES );\n\n}\n\n/**\n * Represents a buffer binding type.\n *\n * @private\n * @abstract\n * @augments Binding\n */\nclass Buffer extends Binding {\n\n\t/**\n\t * Constructs a new buffer.\n\t *\n\t * @param {string} name - The buffer's name.\n\t * @param {TypedArray} [buffer=null] - The buffer.\n\t */\n\tconstructor( name, buffer = null ) {\n\n\t\tsuper( name );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBuffer = true;\n\n\t\t/**\n\t\t * The bytes per element.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.bytesPerElement = Float32Array.BYTES_PER_ELEMENT;\n\n\t\t/**\n\t\t * A reference to the internal buffer.\n\t\t *\n\t\t * @private\n\t\t * @type {TypedArray}\n\t\t */\n\t\tthis._buffer = buffer;\n\n\t\t/**\n\t\t * An array of update ranges.\n\t\t *\n\t\t * @private\n\t\t * @type {Array<{start: number, count: number}>}\n\t\t */\n\t\tthis._updateRanges = [];\n\n\t}\n\n\t/**\n\t * The array of update ranges.\n\t *\n\t * @type {Array<{start: number, count: number}>}\n\t */\n\tget updateRanges() {\n\n\t\treturn this._updateRanges;\n\n\t}\n\n\t/**\n\t * Adds an update range.\n\t *\n\t * @param {number} start - The start index.\n\t * @param {number} count - The number of elements.\n\t */\n\taddUpdateRange( start, count ) {\n\n\t\tthis.updateRanges.push( { start, count } );\n\n\t}\n\n\t/**\n\t * Clears all update ranges.\n\t */\n\tclearUpdateRanges() {\n\n\t\tthis.updateRanges.length = 0;\n\n\t}\n\n\t/**\n\t * The buffer's byte length.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget byteLength() {\n\n\t\treturn getFloatLength( this._buffer.byteLength );\n\n\t}\n\n\t/**\n\t * A reference to the internal buffer.\n\t *\n\t * @type {Float32Array}\n\t * @readonly\n\t */\n\tget buffer() {\n\n\t\treturn this._buffer;\n\n\t}\n\n\t/**\n\t * Updates the binding.\n\t *\n\t * @return {boolean} Whether the buffer has been updated and must be\n\t * uploaded to the GPU.\n\t */\n\tupdate() {\n\n\t\treturn true;\n\n\t}\n\n}\n\n/**\n * Represents a uniform buffer binding type.\n *\n * @private\n * @augments Buffer\n */\nclass UniformBuffer extends Buffer {\n\n\t/**\n\t * Constructs a new uniform buffer.\n\t *\n\t * @param {string} name - The buffer's name.\n\t * @param {TypedArray} [buffer=null] - The buffer.\n\t */\n\tconstructor( name, buffer = null ) {\n\n\t\tsuper( name, buffer );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isUniformBuffer = true;\n\n\t}\n\n}\n\nlet _id$4 = 0;\n\n/**\n * A special form of uniform buffer binding type.\n * It's buffer value is managed by a node object.\n *\n * @private\n * @augments UniformBuffer\n */\nclass NodeUniformBuffer extends UniformBuffer {\n\n\t/**\n\t * Constructs a new node-based uniform buffer.\n\t *\n\t * @param {BufferNode} nodeUniform - The uniform buffer node.\n\t * @param {UniformGroupNode} groupNode - The uniform group node.\n\t */\n\tconstructor( nodeUniform, groupNode ) {\n\n\t\tsuper( 'UniformBuffer_' + _id$4 ++, nodeUniform ? nodeUniform.value : null );\n\n\t\t/**\n\t\t * The uniform buffer node.\n\t\t *\n\t\t * @type {BufferNode}\n\t\t */\n\t\tthis.nodeUniform = nodeUniform;\n\n\t\t/**\n\t\t * The uniform group node.\n\t\t *\n\t\t * @type {UniformGroupNode}\n\t\t */\n\t\tthis.groupNode = groupNode;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isNodeUniformBuffer = true;\n\n\t}\n\n\t/**\n\t * The array of update ranges.\n\t *\n\t * @param {Array<{start: number, count: number}>} value - The update ranges.\n\t */\n\tset updateRanges( value ) {\n\n\t\tthis.nodeUniform.updateRanges = value;\n\n\t}\n\n\t/**\n\t * The array of update ranges.\n\t *\n\t * @type {Array<{start: number, count: number}>}\n\t */\n\tget updateRanges() {\n\n\t\treturn this.nodeUniform.updateRanges;\n\n\t}\n\n\t/**\n\t * Adds a range of data in the data array to be updated on the GPU.\n\t *\n\t * @param {number} start - Position at which to start update.\n\t * @param {number} count - The number of components to update.\n\t */\n\taddUpdateRange( start, count ) {\n\n\t\tthis.nodeUniform.addUpdateRange( start, count );\n\n\t}\n\n\t/**\n\t * Clears all update ranges.\n\t */\n\tclearUpdateRanges() {\n\n\t\tthis.nodeUniform.clearUpdateRanges();\n\n\t}\n\n\t/**\n\t * The uniform buffer.\n\t *\n\t * @type {Float32Array}\n\t */\n\tget buffer() {\n\n\t\treturn this.nodeUniform.value;\n\n\t}\n\n}\n\n/**\n * This class represents a uniform buffer binding but with\n * an API that allows to maintain individual uniform objects.\n *\n * @private\n * @augments UniformBuffer\n */\nclass UniformsGroup extends UniformBuffer {\n\n\t/**\n\t * Constructs a new uniforms group.\n\t *\n\t * @param {string} name - The group's name.\n\t */\n\tconstructor( name ) {\n\n\t\tsuper( name );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isUniformsGroup = true;\n\n\t\t/**\n\t\t * An array with the raw uniform values.\n\t\t *\n\t\t * @private\n\t\t * @type {?Array<number>}\n\t\t * @default null\n\t\t */\n\t\tthis._values = null;\n\n\t\t/**\n\t\t * An array of uniform objects.\n\t\t *\n\t\t * The order of uniforms in this array must match the order of uniforms in the shader.\n\t\t *\n\t\t * @type {Array<Uniform>}\n\t\t */\n\t\tthis.uniforms = [];\n\n\t}\n\n\t/**\n\t * Adds a uniform to this group.\n\t *\n\t * @param {Uniform} uniform - The uniform to add.\n\t * @return {UniformsGroup} A reference to this group.\n\t */\n\taddUniform( uniform ) {\n\n\t\tthis.uniforms.push( uniform );\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Removes a uniform from this group.\n\t *\n\t * @param {Uniform} uniform - The uniform to remove.\n\t * @return {UniformsGroup} A reference to this group.\n\t */\n\tremoveUniform( uniform ) {\n\n\t\tconst index = this.uniforms.indexOf( uniform );\n\n\t\tif ( index !== -1 ) {\n\n\t\t\tthis.uniforms.splice( index, 1 );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * An array with the raw uniform values.\n\t *\n\t * @type {Array<number>}\n\t */\n\tget values() {\n\n\t\tif ( this._values === null ) {\n\n\t\t\tthis._values = Array.from( this.buffer );\n\n\t\t}\n\n\t\treturn this._values;\n\n\t}\n\n\t/**\n\t * A Float32 array buffer with the uniform values.\n\t *\n\t * @type {Float32Array}\n\t */\n\tget buffer() {\n\n\t\tlet buffer = this._buffer;\n\n\t\tif ( buffer === null ) {\n\n\t\t\tconst byteLength = this.byteLength;\n\n\t\t\tbuffer = new Float32Array( new ArrayBuffer( byteLength ) );\n\n\t\t\tthis._buffer = buffer;\n\n\t\t}\n\n\t\treturn buffer;\n\n\t}\n\n\t/**\n\t * The byte length of the buffer with correct buffer alignment.\n\t *\n\t * @type {number}\n\t */\n\tget byteLength() {\n\n\t\tconst bytesPerElement = this.bytesPerElement;\n\n\t\tlet offset = 0; // global buffer offset in bytes\n\n\t\tfor ( let i = 0, l = this.uniforms.length; i < l; i ++ ) {\n\n\t\t\tconst uniform = this.uniforms[ i ];\n\n\t\t\tconst boundary = uniform.boundary;\n\t\t\tconst itemSize = uniform.itemSize * bytesPerElement; // size of the uniform in bytes\n\n\t\t\tconst chunkOffset = offset % GPU_CHUNK_BYTES; // offset in the current chunk\n\t\t\tconst chunkPadding = chunkOffset % boundary; // required padding to match boundary\n\t\t\tconst chunkStart = chunkOffset + chunkPadding; // start position in the current chunk for the data\n\n\t\t\toffset += chunkPadding;\n\n\t\t\t// Check for chunk overflow\n\t\t\tif ( chunkStart !== 0 && ( GPU_CHUNK_BYTES - chunkStart ) < itemSize ) {\n\n\t\t\t\t// Add padding to the end of the chunk\n\t\t\t\toffset += ( GPU_CHUNK_BYTES - chunkStart );\n\n\t\t\t}\n\n\t\t\tuniform.offset = offset / bytesPerElement;\n\n\t\t\toffset += itemSize;\n\n\t\t}\n\n\t\treturn Math.ceil( offset / GPU_CHUNK_BYTES ) * GPU_CHUNK_BYTES;\n\n\t}\n\n\t/**\n\t * Updates this group by updating each uniform object of\n\t * the internal uniform list. The uniform objects check if their\n\t * values has actually changed so this method only returns\n\t * `true` if there is a real value change.\n\t *\n\t * @return {boolean} Whether the uniforms have been updated and\n\t * must be uploaded to the GPU.\n\t */\n\tupdate() {\n\n\t\tlet updated = false;\n\n\t\tfor ( const uniform of this.uniforms ) {\n\n\t\t\tif ( this.updateByType( uniform ) === true ) {\n\n\t\t\t\tupdated = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn updated;\n\n\t}\n\n\t/**\n\t * Updates a given uniform by calling an update method matching\n\t * the uniforms type.\n\t *\n\t * @param {Uniform} uniform - The uniform to update.\n\t * @return {boolean} Whether the uniform has been updated or not.\n\t */\n\tupdateByType( uniform ) {\n\n\t\tif ( uniform.isNumberUniform ) return this.updateNumber( uniform );\n\t\tif ( uniform.isVector2Uniform ) return this.updateVector2( uniform );\n\t\tif ( uniform.isVector3Uniform ) return this.updateVector3( uniform );\n\t\tif ( uniform.isVector4Uniform ) return this.updateVector4( uniform );\n\t\tif ( uniform.isColorUniform ) return this.updateColor( uniform );\n\t\tif ( uniform.isMatrix3Uniform ) return this.updateMatrix3( uniform );\n\t\tif ( uniform.isMatrix4Uniform ) return this.updateMatrix4( uniform );\n\n\t\terror( 'WebGPUUniformsGroup: Unsupported uniform type.', uniform );\n\n\t}\n\n\t/**\n\t * Updates a given Number uniform.\n\t *\n\t * @param {NumberUniform} uniform - The Number uniform.\n\t * @return {boolean} Whether the uniform has been updated or not.\n\t */\n\tupdateNumber( uniform ) {\n\n\t\tlet updated = false;\n\n\t\tconst a = this.values;\n\t\tconst v = uniform.getValue();\n\t\tconst offset = uniform.offset;\n\t\tconst type = uniform.getType();\n\n\t\tif ( a[ offset ] !== v ) {\n\n\t\t\tconst b = this._getBufferForType( type );\n\n\t\t\tb[ offset ] = a[ offset ] = v;\n\t\t\tupdated = true;\n\n\t\t}\n\n\t\treturn updated;\n\n\t}\n\n\t/**\n\t * Updates a given Vector2 uniform.\n\t *\n\t * @param {Vector2Uniform} uniform - The Vector2 uniform.\n\t * @return {boolean} Whether the uniform has been updated or not.\n\t */\n\tupdateVector2( uniform ) {\n\n\t\tlet updated = false;\n\n\t\tconst a = this.values;\n\t\tconst v = uniform.getValue();\n\t\tconst offset = uniform.offset;\n\t\tconst type = uniform.getType();\n\n\t\tif ( a[ offset + 0 ] !== v.x || a[ offset + 1 ] !== v.y ) {\n\n\t\t\tconst b = this._getBufferForType( type );\n\n\t\t\tb[ offset + 0 ] = a[ offset + 0 ] = v.x;\n\t\t\tb[ offset + 1 ] = a[ offset + 1 ] = v.y;\n\n\t\t\tupdated = true;\n\n\t\t}\n\n\t\treturn updated;\n\n\t}\n\n\t/**\n\t * Updates a given Vector3 uniform.\n\t *\n\t * @param {Vector3Uniform} uniform - The Vector3 uniform.\n\t * @return {boolean} Whether the uniform has been updated or not.\n\t */\n\tupdateVector3( uniform ) {\n\n\t\tlet updated = false;\n\n\t\tconst a = this.values;\n\t\tconst v = uniform.getValue();\n\t\tconst offset = uniform.offset;\n\t\tconst type = uniform.getType();\n\n\t\tif ( a[ offset + 0 ] !== v.x || a[ offset + 1 ] !== v.y || a[ offset + 2 ] !== v.z ) {\n\n\t\t\tconst b = this._getBufferForType( type );\n\n\t\t\tb[ offset + 0 ] = a[ offset + 0 ] = v.x;\n\t\t\tb[ offset + 1 ] = a[ offset + 1 ] = v.y;\n\t\t\tb[ offset + 2 ] = a[ offset + 2 ] = v.z;\n\n\t\t\tupdated = true;\n\n\t\t}\n\n\t\treturn updated;\n\n\t}\n\n\t/**\n\t * Updates a given Vector4 uniform.\n\t *\n\t * @param {Vector4Uniform} uniform - The Vector4 uniform.\n\t * @return {boolean} Whether the uniform has been updated or not.\n\t */\n\tupdateVector4( uniform ) {\n\n\t\tlet updated = false;\n\n\t\tconst a = this.values;\n\t\tconst v = uniform.getValue();\n\t\tconst offset = uniform.offset;\n\t\tconst type = uniform.getType();\n\n\t\tif ( a[ offset + 0 ] !== v.x || a[ offset + 1 ] !== v.y || a[ offset + 2 ] !== v.z || a[ offset + 4 ] !== v.w ) {\n\n\t\t\tconst b = this._getBufferForType( type );\n\n\t\t\tb[ offset + 0 ] = a[ offset + 0 ] = v.x;\n\t\t\tb[ offset + 1 ] = a[ offset + 1 ] = v.y;\n\t\t\tb[ offset + 2 ] = a[ offset + 2 ] = v.z;\n\t\t\tb[ offset + 3 ] = a[ offset + 3 ] = v.w;\n\n\t\t\tupdated = true;\n\n\t\t}\n\n\t\treturn updated;\n\n\t}\n\n\t/**\n\t * Updates a given Color uniform.\n\t *\n\t * @param {ColorUniform} uniform - The Color uniform.\n\t * @return {boolean} Whether the uniform has been updated or not.\n\t */\n\tupdateColor( uniform ) {\n\n\t\tlet updated = false;\n\n\t\tconst a = this.values;\n\t\tconst c = uniform.getValue();\n\t\tconst offset = uniform.offset;\n\n\t\tif ( a[ offset + 0 ] !== c.r || a[ offset + 1 ] !== c.g || a[ offset + 2 ] !== c.b ) {\n\n\t\t\tconst b = this.buffer;\n\n\t\t\tb[ offset + 0 ] = a[ offset + 0 ] = c.r;\n\t\t\tb[ offset + 1 ] = a[ offset + 1 ] = c.g;\n\t\t\tb[ offset + 2 ] = a[ offset + 2 ] = c.b;\n\n\t\t\tupdated = true;\n\n\t\t}\n\n\t\treturn updated;\n\n\t}\n\n\t/**\n\t * Updates a given Matrix3 uniform.\n\t *\n\t * @param {Matrix3Uniform} uniform - The Matrix3 uniform.\n\t * @return {boolean} Whether the uniform has been updated or not.\n\t */\n\tupdateMatrix3( uniform ) {\n\n\t\tlet updated = false;\n\n\t\tconst a = this.values;\n\t\tconst e = uniform.getValue().elements;\n\t\tconst offset = uniform.offset;\n\n\t\tif ( a[ offset + 0 ] !== e[ 0 ] || a[ offset + 1 ] !== e[ 1 ] || a[ offset + 2 ] !== e[ 2 ] ||\n\t\t\ta[ offset + 4 ] !== e[ 3 ] || a[ offset + 5 ] !== e[ 4 ] || a[ offset + 6 ] !== e[ 5 ] ||\n\t\t\ta[ offset + 8 ] !== e[ 6 ] || a[ offset + 9 ] !== e[ 7 ] || a[ offset + 10 ] !== e[ 8 ] ) {\n\n\t\t\tconst b = this.buffer;\n\n\t\t\tb[ offset + 0 ] = a[ offset + 0 ] = e[ 0 ];\n\t\t\tb[ offset + 1 ] = a[ offset + 1 ] = e[ 1 ];\n\t\t\tb[ offset + 2 ] = a[ offset + 2 ] = e[ 2 ];\n\t\t\tb[ offset + 4 ] = a[ offset + 4 ] = e[ 3 ];\n\t\t\tb[ offset + 5 ] = a[ offset + 5 ] = e[ 4 ];\n\t\t\tb[ offset + 6 ] = a[ offset + 6 ] = e[ 5 ];\n\t\t\tb[ offset + 8 ] = a[ offset + 8 ] = e[ 6 ];\n\t\t\tb[ offset + 9 ] = a[ offset + 9 ] = e[ 7 ];\n\t\t\tb[ offset + 10 ] = a[ offset + 10 ] = e[ 8 ];\n\n\t\t\tupdated = true;\n\n\t\t}\n\n\t\treturn updated;\n\n\t}\n\n\t/**\n\t * Updates a given Matrix4 uniform.\n\t *\n\t * @param {Matrix4Uniform} uniform - The Matrix4 uniform.\n\t * @return {boolean} Whether the uniform has been updated or not.\n\t */\n\tupdateMatrix4( uniform ) {\n\n\t\tlet updated = false;\n\n\t\tconst a = this.values;\n\t\tconst e = uniform.getValue().elements;\n\t\tconst offset = uniform.offset;\n\n\t\tif ( arraysEqual( a, e, offset ) === false ) {\n\n\t\t\tconst b = this.buffer;\n\t\t\tb.set( e, offset );\n\t\t\tsetArray( a, e, offset );\n\t\t\tupdated = true;\n\n\t\t}\n\n\t\treturn updated;\n\n\t}\n\n\t/**\n\t * Returns a typed array that matches the given data type.\n\t *\n\t * @private\n\t * @param {string} type - The data type.\n\t * @return {TypedArray} The typed array.\n\t */\n\t_getBufferForType( type ) {\n\n\t\tif ( type === 'int' || type === 'ivec2' || type === 'ivec3' || type === 'ivec4' ) return new Int32Array( this.buffer.buffer );\n\t\tif ( type === 'uint' || type === 'uvec2' || type === 'uvec3' || type === 'uvec4' ) return new Uint32Array( this.buffer.buffer );\n\t\treturn this.buffer;\n\n\t}\n\n}\n\n/**\n * Sets the values of the second array to the first array.\n *\n * @private\n * @param {TypedArray} a - The first array.\n * @param {TypedArray} b - The second array.\n * @param {number} offset - An index offset for the first array.\n */\nfunction setArray( a, b, offset ) {\n\n\tfor ( let i = 0, l = b.length; i < l; i ++ ) {\n\n\t\ta[ offset + i ] = b[ i ];\n\n\t}\n\n}\n\n/**\n * Returns `true` if the given arrays are equal.\n *\n * @private\n * @param {TypedArray} a - The first array.\n * @param {TypedArray} b - The second array.\n * @param {number} offset - An index offset for the first array.\n * @return {boolean} Whether the given arrays are equal or not.\n */\nfunction arraysEqual( a, b, offset ) {\n\n\tfor ( let i = 0, l = b.length; i < l; i ++ ) {\n\n\t\tif ( a[ offset + i ] !== b[ i ] ) return false;\n\n\t}\n\n\treturn true;\n\n}\n\nlet _id$3 = 0;\n\n/**\n * A special form of uniforms group that represents\n * the individual uniforms as node-based uniforms.\n *\n * @private\n * @augments UniformsGroup\n */\nclass NodeUniformsGroup extends UniformsGroup {\n\n\t/**\n\t * Constructs a new node-based uniforms group.\n\t *\n\t * @param {string} name - The group's name.\n\t * @param {UniformGroupNode} groupNode - The uniform group node.\n\t */\n\tconstructor( name, groupNode ) {\n\n\t\tsuper( name );\n\n\t\t/**\n\t\t * The group's ID.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.id = _id$3 ++;\n\n\t\t/**\n\t\t * The uniform group node.\n\t\t *\n\t\t * @type {UniformGroupNode}\n\t\t */\n\t\tthis.groupNode = groupNode;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isNodeUniformsGroup = true;\n\n\t}\n\n}\n\n/**\n * Represents a sampler binding type.\n *\n * @private\n * @augments Binding\n */\nclass Sampler extends Binding {\n\n\t/**\n\t * Constructs a new sampler.\n\t *\n\t * @param {string} name - The samplers's name.\n\t * @param {?Texture} texture - The texture this binding is referring to.\n\t */\n\tconstructor( name, texture ) {\n\n\t\tsuper( name );\n\n\t\t/**\n\t\t * The texture the sampler is referring to.\n\t\t *\n\t\t * @private\n\t\t * @type {?Texture}\n\t\t */\n\t\tthis._texture = null;\n\n\t\t/**\n\t\t * An event listener which is added to {@link texture}'s dispose event.\n\t\t *\n\t\t * @private\n\t\t * @type {Function}\n\t\t */\n\t\tthis._onTextureDispose = () => {\n\n\t\t\tthis.generation = null;\n\t\t\tthis.version = 0;\n\n\t\t};\n\n\t\t// Assignment to the texture via a setter must occur after \"_onTextureDispose\" is initialized.\n\t\tthis.texture = texture;\n\n\t\t/**\n\t\t * The binding's version.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.version = texture ? texture.version : 0;\n\n\t\t/**\n\t\t * The binding's generation which is an additional version\n\t\t * qualifier.\n\t\t *\n\t\t * @type {?number}\n\t\t * @default null\n\t\t */\n\t\tthis.generation = null;\n\n\t\t/**\n\t\t * The binding's sampler key.\n\t\t *\n\t\t * @type {string}\n\t\t * @default ''\n\t\t */\n\t\tthis.samplerKey = '';\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSampler = true;\n\n\t}\n\n\t/**\n\t * Sets the texture of this sampler.\n\t *\n\t * @param {Texture} value - The texture to set.\n\t */\n\tset texture( value ) {\n\n\t\tif ( this._texture === value ) return;\n\n\t\tif ( this._texture ) {\n\n\t\t\tthis._texture.removeEventListener( 'dispose', this._onTextureDispose );\n\n\t\t}\n\n\t\tthis._texture = value;\n\n\t\tthis.generation = null;\n\t\tthis.version = 0;\n\n\t\tif ( this._texture ) {\n\n\t\t\tthis._texture.addEventListener( 'dispose', this._onTextureDispose );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Gets the texture of this sampler.\n\t * @return {?Texture} The texture.\n\t */\n\tget texture() {\n\n\t\treturn this._texture;\n\n\t}\n\n\t/**\n\t * Updates the binding.\n\t *\n\t * @return {boolean} Whether the texture has been updated and must be\n\t * uploaded to the GPU.\n\t */\n\tupdate() {\n\n\t\tconst { texture, version } = this;\n\n\t\tif ( version !== texture.version ) {\n\n\t\t\tthis.version = texture.version;\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\n\tclone() {\n\n\t\tconst clonedSampler = super.clone();\n\n\t\t// fix dispose handler for cloned instances\n\t\t// TODO: Find better solution, see #31747\n\n\t\tclonedSampler._texture = null;\n\n\t\tclonedSampler._onTextureDispose = () => {\n\n\t\t\tclonedSampler.generation = null;\n\t\t\tclonedSampler.version = 0;\n\n\t\t};\n\n\t\tclonedSampler.texture = this.texture;\n\n\t\treturn clonedSampler;\n\n\t}\n\n}\n\nlet _id$2 = 0;\n\n/**\n * Represents a sampled texture binding type.\n *\n * @private\n * @augments Sampler\n */\nclass SampledTexture extends Sampler {\n\n\t/**\n\t * Constructs a new sampled texture.\n\t *\n\t * @param {string} name - The sampled texture's name.\n\t * @param {?Texture} texture - The texture this binding is referring to.\n\t */\n\tconstructor( name, texture ) {\n\n\t\tsuper( name, texture );\n\n\t\t/**\n\t\t * This identifier.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.id = _id$2 ++;\n\n\t\t/**\n\t\t * Whether the texture is a storage texture or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.store = false;\n\n\t\t/**\n\t\t * The mip level to bind for storage textures.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.mipLevel = 0;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSampledTexture = true;\n\n\t}\n\n}\n\n/**\n * A special form of sampled texture binding type.\n * It's texture value is managed by a node object.\n *\n * @private\n * @augments SampledTexture\n */\nclass NodeSampledTexture extends SampledTexture {\n\n\t/**\n\t * Constructs a new node-based sampled texture.\n\t *\n\t * @param {string} name - The textures's name.\n\t * @param {TextureNode} textureNode - The texture node.\n\t * @param {UniformGroupNode} groupNode - The uniform group node.\n\t * @param {?string} [access=null] - The access type.\n\t */\n\tconstructor( name, textureNode, groupNode, access = null ) {\n\n\t\tsuper( name, textureNode ? textureNode.value : null );\n\n\t\t/**\n\t\t * The texture node.\n\t\t *\n\t\t * @type {TextureNode}\n\t\t */\n\t\tthis.textureNode = textureNode;\n\n\t\t/**\n\t\t * The uniform group node.\n\t\t *\n\t\t * @type {UniformGroupNode}\n\t\t */\n\t\tthis.groupNode = groupNode;\n\n\t\t/**\n\t\t * The access type.\n\t\t *\n\t\t * @type {?string}\n\t\t * @default null\n\t\t */\n\t\tthis.access = access;\n\n\t}\n\n\t/**\n\t * Updates the binding.\n\t *\n\t * @return {boolean} Whether the texture has been updated and must be\n\t * uploaded to the GPU.\n\t */\n\tupdate() {\n\n\t\tconst { textureNode } = this;\n\n\t\tif ( this.texture !== textureNode.value ) {\n\n\t\t\tthis.texture = textureNode.value;\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn super.update();\n\n\t}\n\n}\n\n/**\n * A special form of sampled cube texture binding type.\n * It's texture value is managed by a node object.\n *\n * @private\n * @augments NodeSampledTexture\n */\nclass NodeSampledCubeTexture extends NodeSampledTexture {\n\n\t/**\n\t * Constructs a new node-based sampled cube texture.\n\t *\n\t * @param {string} name - The textures's name.\n\t * @param {TextureNode} textureNode - The texture node.\n\t * @param {UniformGroupNode} groupNode - The uniform group node.\n\t * @param {?string} [access=null] - The access type.\n\t */\n\tconstructor( name, textureNode, groupNode, access = null ) {\n\n\t\tsuper( name, textureNode, groupNode, access );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSampledCubeTexture = true;\n\n\t}\n\n}\n\n/**\n * A special form of sampled 3D texture binding type.\n * It's texture value is managed by a node object.\n *\n * @private\n * @augments NodeSampledTexture\n */\nclass NodeSampledTexture3D extends NodeSampledTexture {\n\n\t/**\n\t * Constructs a new node-based sampled 3D texture.\n\t *\n\t * @param {string} name - The textures's name.\n\t * @param {TextureNode} textureNode - The texture node.\n\t * @param {UniformGroupNode} groupNode - The uniform group node.\n\t * @param {?string} [access=null] - The access type.\n\t */\n\tconstructor( name, textureNode, groupNode, access = null ) {\n\n\t\tsuper( name, textureNode, groupNode, access );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isSampledTexture3D = true;\n\n\t}\n\n}\n\nconst glslPolyfills = {\n\tbitcast_int_uint: new CodeNode( /* glsl */'uint tsl_bitcast_int_to_uint ( int x ) { return floatBitsToUint( intBitsToFloat ( x ) ); }' ),\n\tbitcast_uint_int: new CodeNode( /* glsl */'uint tsl_bitcast_uint_to_int ( uint x ) { return floatBitsToInt( uintBitsToFloat ( x ) ); }' )\n};\n\nconst glslMethods = {\n\ttextureDimensions: 'textureSize',\n\tequals: 'equal',\n\tbitcast_float_int: 'floatBitsToInt',\n\tbitcast_int_float: 'intBitsToFloat',\n\tbitcast_uint_float: 'uintBitsToFloat',\n\tbitcast_float_uint: 'floatBitsToUint',\n\tbitcast_uint_int: 'tsl_bitcast_uint_to_int',\n\tbitcast_int_uint: 'tsl_bitcast_int_to_uint',\n\tfloatpack_snorm_2x16: 'packSnorm2x16',\n\tfloatpack_unorm_2x16: 'packUnorm2x16',\n\tfloatpack_float16_2x16: 'packHalf2x16',\n\tfloatunpack_snorm_2x16: 'unpackSnorm2x16',\n\tfloatunpack_unorm_2x16: 'unpackUnorm2x16',\n\tfloatunpack_float16_2x16: 'unpackHalf2x16'\n};\n\nconst precisionLib = {\n\tlow: 'lowp',\n\tmedium: 'mediump',\n\thigh: 'highp'\n};\n\nconst supports$1 = {\n\tswizzleAssign: true,\n\tstorageBuffer: false\n};\n\nconst interpolationTypeMap = {\n\tperspective: 'smooth',\n\tlinear: 'noperspective'\n};\n\nconst interpolationModeMap = {\n\t'centroid': 'centroid'\n};\n\nconst defaultPrecisions = `\nprecision highp float;\nprecision highp int;\nprecision highp sampler2D;\nprecision highp sampler3D;\nprecision highp samplerCube;\nprecision highp sampler2DArray;\n\nprecision highp usampler2D;\nprecision highp usampler3D;\nprecision highp usamplerCube;\nprecision highp usampler2DArray;\n\nprecision highp isampler2D;\nprecision highp isampler3D;\nprecision highp isamplerCube;\nprecision highp isampler2DArray;\n\nprecision lowp sampler2DShadow;\nprecision lowp sampler2DArrayShadow;\nprecision lowp samplerCubeShadow;\n`;\n\n/**\n * A node builder targeting GLSL.\n *\n * This module generates GLSL shader code from node materials and also\n * generates the respective bindings and vertex buffer definitions. These\n * data are later used by the renderer to create render and compute pipelines\n * for render objects.\n *\n * @augments NodeBuilder\n */\nclass GLSLNodeBuilder extends NodeBuilder {\n\n\t/**\n\t * Constructs a new GLSL node builder renderer.\n\t *\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Renderer} renderer - The renderer.\n\t */\n\tconstructor( object, renderer ) {\n\n\t\tsuper( object, renderer, new GLSLNodeParser() );\n\n\t\t/**\n\t\t * A dictionary holds for each shader stage ('vertex', 'fragment', 'compute')\n\t\t * another dictionary which manages UBOs per group ('render','frame','object').\n\t\t *\n\t\t * @type {Object<string,Object<string,NodeUniformsGroup>>}\n\t\t */\n\t\tthis.uniformGroups = {};\n\n\t\t/**\n\t\t * An array that holds objects defining the varying and attribute data in\n\t\t * context of Transform Feedback.\n\t\t *\n\t\t * @type {Array<Object<string,AttributeNode|string>>}\n\t\t */\n\t\tthis.transforms = [];\n\n\t\t/**\n\t\t * A dictionary that holds for each shader stage a Map of used extensions.\n\t\t *\n\t\t * @type {Object<string,Map<string,Object>>}\n\t\t */\n\t\tthis.extensions = {};\n\n\t\t/**\n\t\t * A dictionary that holds for each shader stage an Array of used builtins.\n\t\t *\n\t\t * @type {Object<string,Array<string>>}\n\t\t */\n\t\tthis.builtins = { vertex: [], fragment: [], compute: [] };\n\n\t}\n\n\t/**\n\t * Checks if the given texture requires a manual conversion to the working color space.\n\t *\n\t * @param {Texture} texture - The texture to check.\n\t * @return {boolean} Whether the given texture requires a conversion to working color space or not.\n\t */\n\tneedsToWorkingColorSpace( texture ) {\n\n\t\treturn texture.isVideoTexture === true && texture.colorSpace !== NoColorSpace;\n\n\t}\n\n\t/**\n\t * Includes the given method name into the current\n\t * function node.\n\t *\n\t * @private\n\t * @param {string} name - The method name to include.\n\t * @return {CodeNode} The respective code node.\n\t */\n\t_include( name ) {\n\n\t\tconst codeNode = glslPolyfills[ name ];\n\t\tcodeNode.build( this );\n\n\t\tthis.addInclude( codeNode );\n\n\t\treturn codeNode;\n\n\t}\n\n\t/**\n\t * Returns the native shader method name for a given generic name.\n\t *\n\t * @param {string} method - The method name to resolve.\n\t * @return {string} The resolved GLSL method name.\n\t */\n\tgetMethod( method ) {\n\n\t\tif ( glslPolyfills[ method ] !== undefined ) {\n\n\t\t\tthis._include( method );\n\n\t\t}\n\n\t\treturn glslMethods[ method ] || method;\n\n\t}\n\n\t/**\n\t * Returns the bitcast method name for a given input and outputType.\n\t *\n\t * @param {string} type - The output type to bitcast to.\n\t * @param {string} inputType - The input type of the.\n\t * @return {string} The resolved WGSL bitcast invocation.\n\t */\n\tgetBitcastMethod( type, inputType ) {\n\n\t\treturn this.getMethod( `bitcast_${ inputType }_${ type }` );\n\n\t}\n\n\t/**\n\t * Returns the float packing method name for a given numeric encoding.\n\t *\n\t * @param {string} encoding - The numeric encoding that describes how the float values are mapped to the integer range.\n\t * @returns {string} The resolved GLSL float packing method name.\n\t */\n\tgetFloatPackingMethod( encoding ) {\n\n\t\treturn this.getMethod( `floatpack_${ encoding }_2x16` );\n\n\t}\n\n\t/**\n\t * Returns the float unpacking method name for a given numeric encoding.\n\t *\n\t * @param {string} encoding - The numeric encoding that describes how the integer values are mapped to the float range.\n\t * @returns {string} The resolved GLSL float unpacking method name.\n\t */\n\tgetFloatUnpackingMethod( encoding ) {\n\n\t\treturn this.getMethod( `floatunpack_${ encoding }_2x16` );\n\n\t}\n\n\t/**\n\t * Returns the native snippet for a ternary operation.\n\t *\n\t * @param {string} condSnippet - The condition determining which expression gets resolved.\n\t * @param {string} ifSnippet - The expression to resolve to if the condition is true.\n\t * @param {string} elseSnippet - The expression to resolve to if the condition is false.\n\t * @return {string} The resolved method name.\n\t */\n\tgetTernary( condSnippet, ifSnippet, elseSnippet ) {\n\n\t\treturn `${condSnippet} ? ${ifSnippet} : ${elseSnippet}`;\n\n\t}\n\n\t/**\n\t * Returns the output struct name. Not relevant for GLSL.\n\t *\n\t * @return {string}\n\t */\n\tgetOutputStructName() {\n\n\t\treturn '';\n\n\t}\n\n\t/**\n\t * Builds the given shader node.\n\t *\n\t * @param {ShaderNodeInternal} shaderNode - The shader node.\n\t * @return {string} The GLSL function code.\n\t */\n\tbuildFunctionCode( shaderNode ) {\n\n\t\tconst layout = shaderNode.layout;\n\t\tconst flowData = this.flowShaderNode( shaderNode );\n\n\t\tconst parameters = [];\n\n\t\tfor ( const input of layout.inputs ) {\n\n\t\t\tparameters.push( this.getType( input.type ) + ' ' + input.name );\n\n\t\t}\n\n\t\t//\n\n\t\tconst code = `${ this.getType( layout.type ) } ${ layout.name }( ${ parameters.join( ', ' ) } ) {\n\n\t${ flowData.vars }\n\n${ flowData.code }\n\treturn ${ flowData.result };\n\n}`;\n\n\t\t//\n\n\t\treturn code;\n\n\t}\n\n\t/**\n\t * Setups the Pixel Buffer Object (PBO) for the given storage\n\t * buffer node.\n\t *\n\t * @param {StorageBufferNode} storageBufferNode - The storage buffer node.\n\t */\n\tsetupPBO( storageBufferNode ) {\n\n\t\tconst attribute = storageBufferNode.value;\n\n\t\tif ( attribute.pbo === undefined ) {\n\n\t\t\tconst originalArray = attribute.array;\n\t\t\tconst numElements = attribute.count * attribute.itemSize;\n\n\t\t\tconst { itemSize } = attribute;\n\n\t\t\tconst isInteger = attribute.array.constructor.name.toLowerCase().includes( 'int' );\n\n\t\t\tlet format = isInteger ? RedIntegerFormat : RedFormat;\n\n\t\t\tif ( itemSize === 2 ) {\n\n\t\t\t\tformat = isInteger ? RGIntegerFormat : RGFormat;\n\n\t\t\t} else if ( itemSize === 3 ) {\n\n\t\t\t\tformat = isInteger ? RGBIntegerFormat : RGBFormat;\n\n\t\t\t} else if ( itemSize === 4 ) {\n\n\t\t\t\tformat = isInteger ? RGBAIntegerFormat : RGBAFormat;\n\n\t\t\t}\n\n\t\t\tconst typeMap = {\n\t\t\t\tFloat32Array: FloatType,\n\t\t\t\tUint8Array: UnsignedByteType,\n\t\t\t\tUint16Array: UnsignedShortType,\n\t\t\t\tUint32Array: UnsignedIntType,\n\t\t\t\tInt8Array: ByteType,\n\t\t\t\tInt16Array: ShortType,\n\t\t\t\tInt32Array: IntType,\n\t\t\t\tUint8ClampedArray: UnsignedByteType,\n\t\t\t};\n\n\t\t\tconst width = Math.pow( 2, Math.ceil( Math.log2( Math.sqrt( numElements / itemSize ) ) ) );\n\t\t\tlet height = Math.ceil( ( numElements / itemSize ) / width );\n\t\t\tif ( width * height * itemSize < numElements ) height ++; // Ensure enough space\n\n\t\t\tconst newSize = width * height * itemSize;\n\n\t\t\tconst newArray = new originalArray.constructor( newSize );\n\n\t\t\tnewArray.set( originalArray, 0 );\n\n\t\t\tattribute.array = newArray;\n\n\t\t\tconst pboTexture = new DataTexture( attribute.array, width, height, format, typeMap[ attribute.array.constructor.name ] || FloatType );\n\t\t\tpboTexture.needsUpdate = true;\n\t\t\tpboTexture.isPBOTexture = true;\n\n\t\t\tconst pbo = new TextureNode( pboTexture, null, null );\n\t\t\tpbo.setPrecision( 'high' );\n\n\t\t\tattribute.pboNode = pbo;\n\t\t\tattribute.pbo = pbo.value;\n\n\t\t\tthis.getUniformFromNode( attribute.pboNode, 'texture', this.shaderStage, this.context.nodeName );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a GLSL snippet that represents the property name of the given node.\n\t *\n\t * @param {Node} node - The node.\n\t * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.\n\t * @return {string} The property name.\n\t */\n\tgetPropertyName( node, shaderStage = this.shaderStage ) {\n\n\t\tif ( node.isNodeUniform && node.node.isTextureNode !== true && node.node.isBufferNode !== true ) {\n\n\t\t\treturn shaderStage.charAt( 0 ) + '_' + node.name;\n\n\t\t}\n\n\t\treturn super.getPropertyName( node, shaderStage );\n\n\t}\n\n\t/**\n\t * Setups the Pixel Buffer Object (PBO) for the given storage\n\t * buffer node.\n\t *\n\t * @param {StorageArrayElementNode} storageArrayElementNode - The storage array element node.\n\t * @return {string} The property name.\n\t */\n\tgeneratePBO( storageArrayElementNode ) {\n\n\t\tconst { node, indexNode } = storageArrayElementNode;\n\t\tconst attribute = node.value;\n\n\t\tif ( this.renderer.backend.has( attribute ) ) {\n\n\t\t\tconst attributeData = this.renderer.backend.get( attribute );\n\t\t\tattributeData.pbo = attribute.pbo;\n\n\t\t}\n\n\t\tconst nodeUniform = this.getUniformFromNode( attribute.pboNode, 'texture', this.shaderStage, this.context.nodeName );\n\t\tconst textureName = this.getPropertyName( nodeUniform );\n\n\t\tthis.increaseUsage( indexNode ); // force cache generate to be used as index in x,y\n\t\tconst indexSnippet = indexNode.build( this, 'uint' );\n\n\t\tconst elementNodeData = this.getDataFromNode( storageArrayElementNode );\n\n\t\tlet propertyName = elementNodeData.propertyName;\n\n\t\tif ( propertyName === undefined ) {\n\n\t\t\t// property element\n\n\t\t\tconst nodeVar = this.getVarFromNode( storageArrayElementNode );\n\n\t\t\tpropertyName = this.getPropertyName( nodeVar );\n\n\t\t\t// property size\n\n\t\t\tconst bufferNodeData = this.getDataFromNode( node );\n\n\t\t\tlet propertySizeName = bufferNodeData.propertySizeName;\n\n\t\t\tif ( propertySizeName === undefined ) {\n\n\t\t\t\tpropertySizeName = propertyName + 'Size';\n\n\t\t\t\tthis.getVarFromNode( node, propertySizeName, 'uint' );\n\n\t\t\t\tthis.addLineFlowCode( `${ propertySizeName } = uint( textureSize( ${ textureName }, 0 ).x )`, storageArrayElementNode );\n\n\t\t\t\tbufferNodeData.propertySizeName = propertySizeName;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tconst { itemSize } = attribute;\n\n\t\t\tconst channel = '.' + vectorComponents.join( '' ).slice( 0, itemSize );\n\t\t\tconst uvSnippet = `ivec2(${indexSnippet} % ${ propertySizeName }, ${indexSnippet} / ${ propertySizeName })`;\n\n\t\t\tconst snippet = this.generateTextureLoad( null, textureName, uvSnippet, '0', null, null );\n\n\t\t\t//\n\n\n\t\t\tlet prefix = 'vec4';\n\n\t\t\tif ( attribute.pbo.type === UnsignedIntType ) {\n\n\t\t\t\tprefix = 'uvec4';\n\n\t\t\t} else if ( attribute.pbo.type === IntType ) {\n\n\t\t\t\tprefix = 'ivec4';\n\n\t\t\t}\n\n\t\t\tthis.addLineFlowCode( `${ propertyName } = ${prefix}(${ snippet })${channel}`, storageArrayElementNode );\n\n\t\t\telementNodeData.propertyName = propertyName;\n\n\t\t}\n\n\t\treturn propertyName;\n\n\t}\n\n\t/**\n\t * Generates the GLSL snippet that reads a single texel from a texture without sampling or filtering.\n\t *\n\t * @param {?Texture} texture - The texture.\n\t * @param {string} textureProperty - The name of the texture uniform in the shader.\n\t * @param {string} uvIndexSnippet - A GLSL snippet that represents texture coordinates used for sampling.\n\t * @param {?string} levelSnippet - A GLSL snippet that represents the mip level, with level 0 containing a full size version of the texture.\n\t * @param {?string} depthSnippet - A GLSL snippet that represents the 0-based texture array index to sample.\n\t * @param {?string} offsetSnippet - A GLSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.\n\t * @return {string} The GLSL snippet.\n\t */\n\tgenerateTextureLoad( texture, textureProperty, uvIndexSnippet, levelSnippet, depthSnippet, offsetSnippet ) {\n\n\t\tif ( levelSnippet === null ) levelSnippet = '0';\n\n\t\tlet snippet;\n\n\t\tif ( depthSnippet ) {\n\n\t\t\tif ( offsetSnippet ) {\n\n\t\t\t\tsnippet = `texelFetchOffset( ${ textureProperty }, ivec3( ${ uvIndexSnippet }, ${ depthSnippet } ), ${ levelSnippet }, ${ offsetSnippet } )`;\n\n\t\t\t} else {\n\n\t\t\t\tsnippet = `texelFetch( ${ textureProperty }, ivec3( ${ uvIndexSnippet }, ${ depthSnippet } ), ${ levelSnippet } )`;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( offsetSnippet ) {\n\n\t\t\t\tsnippet = `texelFetchOffset( ${ textureProperty }, ${ uvIndexSnippet }, ${ levelSnippet }, ${ offsetSnippet } )`;\n\n\t\t\t} else {\n\n\t\t\t\tsnippet = `texelFetch( ${ textureProperty }, ${ uvIndexSnippet }, ${ levelSnippet } )`;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( texture !== null && texture.isDepthTexture ) {\n\n\t\t\tsnippet += '.x';\n\n\t\t}\n\n\t\treturn snippet;\n\n\t}\n\n\t/**\n\t * Generates the GLSL snippet for sampling/loading the given texture.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {string} textureProperty - The name of the texture uniform in the shader.\n\t * @param {string} uvSnippet - A GLSL snippet that represents texture coordinates used for sampling.\n\t * @param {?string} depthSnippet -  A GLSL snippet that represents the 0-based texture array index to sample.\n\t * @param {?string} offsetSnippet - A GLSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.\n\t * @return {string} The GLSL snippet.\n\t */\n\tgenerateTexture( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet ) {\n\n\t\tif ( depthSnippet ) uvSnippet = `vec3( ${ uvSnippet }, ${ depthSnippet } )`;\n\n\t\tif ( texture.isDepthTexture ) {\n\n\t\t\tif ( offsetSnippet ) return `textureOffset( ${ textureProperty }, ${ uvSnippet }, ${ offsetSnippet } ).x`;\n\n\t\t\treturn `texture( ${ textureProperty }, ${ uvSnippet } ).x`;\n\n\t\t}\n\n\t\tif ( offsetSnippet ) return `textureOffset( ${ textureProperty }, ${ uvSnippet }, ${ offsetSnippet } )`;\n\n\t\treturn `texture( ${ textureProperty }, ${ uvSnippet } )`;\n\n\t}\n\n\t/**\n\t * Generates the GLSL snippet when sampling textures with explicit mip level.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {string} textureProperty - The name of the texture uniform in the shader.\n\t * @param {string} uvSnippet - A GLSL snippet that represents texture coordinates used for sampling.\n\t * @param {string} levelSnippet - A GLSL snippet that represents the mip level, with level 0 containing a full size version of the texture.\n\t * @param {?string} offsetSnippet - A GLSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.\n\t * @return {string} The GLSL snippet.\n\t */\n\tgenerateTextureLevel( texture, textureProperty, uvSnippet, levelSnippet, offsetSnippet ) {\n\n\t\tif ( offsetSnippet ) {\n\n\t\t\treturn `textureLodOffset( ${ textureProperty }, ${ uvSnippet }, ${ levelSnippet }, ${ offsetSnippet } )`;\n\n\t\t}\n\n\t\treturn `textureLod( ${ textureProperty }, ${ uvSnippet }, ${ levelSnippet } )`;\n\n\t}\n\n\t/**\n\t * Generates the GLSL snippet when sampling textures with a bias to the mip level.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {string} textureProperty - The name of the texture uniform in the shader.\n\t * @param {string} uvSnippet - A GLSL snippet that represents texture coordinates used for sampling.\n\t * @param {string} biasSnippet - A GLSL snippet that represents the bias to apply to the mip level before sampling.\n\t * @param {?string} offsetSnippet - A GLSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.\n\t * @return {string} The GLSL snippet.\n\t */\n\tgenerateTextureBias( texture, textureProperty, uvSnippet, biasSnippet, offsetSnippet ) {\n\n\t\tif ( offsetSnippet ) {\n\n\t\t\treturn `textureOffset( ${ textureProperty }, ${ uvSnippet }, ${ offsetSnippet }, ${ biasSnippet } )`;\n\n\t\t}\n\n\t\treturn `texture( ${ textureProperty }, ${ uvSnippet }, ${ biasSnippet } )`;\n\n\t}\n\n\t/**\n\t * Generates the GLSL snippet for sampling/loading the given texture using explicit gradients.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {string} textureProperty - The name of the texture uniform in the shader.\n\t * @param {string} uvSnippet - A GLSL snippet that represents texture coordinates used for sampling.\n\t * @param {Array<string>} gradSnippet - An array holding both gradient GLSL snippets.\n\t * @param {?string} offsetSnippet - A GLSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.\n\t * @return {string} The GLSL snippet.\n\t */\n\tgenerateTextureGrad( texture, textureProperty, uvSnippet, gradSnippet, offsetSnippet ) {\n\n\t\tif ( offsetSnippet ) {\n\n\t\t\treturn `textureGradOffset( ${ textureProperty }, ${ uvSnippet }, ${ gradSnippet[ 0 ] }, ${ gradSnippet[ 1 ] }, ${ offsetSnippet } )`;\n\n\t\t}\n\n\t\treturn `textureGrad( ${ textureProperty }, ${ uvSnippet }, ${ gradSnippet[ 0 ] }, ${ gradSnippet[ 1 ] } )`;\n\n\t}\n\n\t/**\n\t * Generates the GLSL snippet for sampling a depth texture and comparing the sampled depth values\n\t * against a reference value.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {string} textureProperty - The name of the texture uniform in the shader.\n\t * @param {string} uvSnippet - A GLSL snippet that represents texture coordinates used for sampling.\n\t * @param {string} compareSnippet -  A GLSL snippet that represents the reference value.\n\t * @param {?string} depthSnippet - A GLSL snippet that represents 0-based texture array index to sample.\n\t * @param {?string} offsetSnippet - A GLSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.\n\t * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.\n\t * @return {string} The GLSL snippet.\n\t */\n\tgenerateTextureCompare( texture, textureProperty, uvSnippet, compareSnippet, depthSnippet, offsetSnippet, shaderStage = this.shaderStage ) {\n\n\t\tif ( shaderStage === 'fragment' ) {\n\n\t\t\t// Cube shadow maps use vec4(direction, compareValue)\n\t\t\tif ( texture.isCubeTexture ) {\n\n\t\t\t\treturn `texture( ${ textureProperty }, vec4( ${ uvSnippet }, ${ compareSnippet } ) )`;\n\n\t\t\t}\n\n\t\t\tif ( depthSnippet ) {\n\n\t\t\t\tif ( offsetSnippet ) {\n\n\t\t\t\t\treturn `textureOffset( ${ textureProperty }, vec4( ${ uvSnippet }, ${ depthSnippet }, ${ compareSnippet } ), ${ offsetSnippet } )`;\n\n\t\t\t\t}\n\n\t\t\t\treturn `texture( ${ textureProperty }, vec4( ${ uvSnippet }, ${ depthSnippet }, ${ compareSnippet } ) )`;\n\n\t\t\t}\n\n\t\t\tif ( offsetSnippet ) {\n\n\t\t\t\treturn `textureOffset( ${ textureProperty }, vec3( ${ uvSnippet }, ${ compareSnippet } ), ${ offsetSnippet } )`;\n\n\t\t\t}\n\n\t\t\treturn `texture( ${ textureProperty }, vec3( ${ uvSnippet }, ${ compareSnippet } ) )`;\n\n\t\t} else {\n\n\t\t\terror( `WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${ shaderStage } shader.` );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the variables of the given shader stage as a GLSL string.\n\t *\n\t * @param {string} shaderStage - The shader stage.\n\t * @return {string} The GLSL snippet that defines the variables.\n\t */\n\tgetVars( shaderStage ) {\n\n\t\tconst snippets = [];\n\n\t\tconst vars = this.vars[ shaderStage ];\n\n\t\tif ( vars !== undefined ) {\n\n\t\t\tfor ( const variable of vars ) {\n\n\t\t\t\tsnippets.push( `${ this.getVar( variable.type, variable.name, variable.count ) };` );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn snippets.join( '\\n\\t' );\n\n\t}\n\n\t/**\n\t * Returns the uniforms of the given shader stage as a GLSL string.\n\t *\n\t * @param {string} shaderStage - The shader stage.\n\t * @return {string} The GLSL snippet that defines the uniforms.\n\t */\n\tgetUniforms( shaderStage ) {\n\n\t\tconst uniforms = this.uniforms[ shaderStage ];\n\n\t\tconst bindingSnippets = [];\n\t\tconst uniformGroups = {};\n\n\t\tfor ( const uniform of uniforms ) {\n\n\t\t\tlet snippet = null;\n\t\t\tlet group = false;\n\n\t\t\tif ( uniform.type === 'texture' || uniform.type === 'texture3D' ) {\n\n\t\t\t\tconst texture = uniform.node.value;\n\n\t\t\t\tlet typePrefix = '';\n\n\t\t\t\tif ( texture.isDataTexture === true || texture.isData3DTexture === true ) {\n\n\t\t\t\t\tif ( texture.type === UnsignedIntType ) {\n\n\t\t\t\t\t\ttypePrefix = 'u';\n\n\t\t\t\t\t} else if ( texture.type === IntType ) {\n\n\t\t\t\t\t\ttypePrefix = 'i';\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( uniform.type === 'texture3D' && texture.isArrayTexture === false ) {\n\n\t\t\t\t\tsnippet = `${typePrefix}sampler3D ${ uniform.name };`;\n\n\t\t\t\t} else if ( texture.compareFunction ) {\n\n\t\t\t\t\tif ( texture.isArrayTexture === true ) {\n\n\t\t\t\t\t\tsnippet = `sampler2DArrayShadow ${ uniform.name };`;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tsnippet = `sampler2DShadow ${ uniform.name };`;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( texture.isArrayTexture === true || texture.isDataArrayTexture === true || texture.isCompressedArrayTexture === true ) {\n\n\t\t\t\t\tsnippet = `${typePrefix}sampler2DArray ${ uniform.name };`;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsnippet = `${typePrefix}sampler2D ${ uniform.name };`;\n\n\t\t\t\t}\n\n\t\t\t} else if ( uniform.type === 'cubeTexture' ) {\n\n\t\t\t\tsnippet = `samplerCube ${ uniform.name };`;\n\n\t\t\t} else if ( uniform.type === 'cubeDepthTexture' ) {\n\n\t\t\t\tsnippet = `samplerCubeShadow ${ uniform.name };`;\n\n\t\t\t} else if ( uniform.type === 'buffer' ) {\n\n\t\t\t\tconst bufferNode = uniform.node;\n\t\t\t\tconst bufferType = this.getType( bufferNode.bufferType );\n\t\t\t\tconst bufferCount = bufferNode.bufferCount;\n\n\t\t\t\tconst bufferCountSnippet = bufferCount > 0 ? bufferCount : '';\n\t\t\t\tsnippet = `${bufferNode.name} {\\n\\t${ bufferType } ${ uniform.name }[${ bufferCountSnippet }];\\n};\\n`;\n\n\t\t\t} else {\n\n\t\t\t\tconst vectorType = this.getVectorType( uniform.type );\n\n\t\t\t\tsnippet = `${ vectorType } ${ this.getPropertyName( uniform, shaderStage ) };`;\n\n\t\t\t\tgroup = true;\n\n\t\t\t}\n\n\t\t\tconst precision = uniform.node.precision;\n\n\t\t\tif ( precision !== null ) {\n\n\t\t\t\tsnippet = precisionLib[ precision ] + ' ' + snippet;\n\n\t\t\t}\n\n\t\t\tif ( group ) {\n\n\t\t\t\tsnippet = '\\t' + snippet;\n\n\t\t\t\tconst groupName = uniform.groupNode.name;\n\t\t\t\tconst groupSnippets = uniformGroups[ groupName ] || ( uniformGroups[ groupName ] = [] );\n\n\t\t\t\tgroupSnippets.push( snippet );\n\n\t\t\t} else {\n\n\t\t\t\tsnippet = 'uniform ' + snippet;\n\n\t\t\t\tbindingSnippets.push( snippet );\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet output = '';\n\n\t\tfor ( const name in uniformGroups ) {\n\n\t\t\tconst groupSnippets = uniformGroups[ name ];\n\n\t\t\toutput += this._getGLSLUniformStruct( shaderStage + '_' + name, groupSnippets.join( '\\n' ) ) + '\\n';\n\n\t\t}\n\n\t\toutput += bindingSnippets.join( '\\n' );\n\n\t\treturn output;\n\n\t}\n\n\t/**\n\t * Returns the type for a given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute.\n\t * @return {string} The type.\n\t */\n\tgetTypeFromAttribute( attribute ) {\n\n\t\tlet nodeType = super.getTypeFromAttribute( attribute );\n\n\t\tif ( /^[iu]/.test( nodeType ) && attribute.gpuType !== IntType ) {\n\n\t\t\tlet dataAttribute = attribute;\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute ) dataAttribute = attribute.data;\n\n\t\t\tconst array = dataAttribute.array;\n\n\t\t\tif ( ( array instanceof Uint32Array || array instanceof Int32Array ) === false ) {\n\n\t\t\t\tnodeType = nodeType.slice( 1 );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn nodeType;\n\n\t}\n\n\t/**\n\t * Returns the shader attributes of the given shader stage as a GLSL string.\n\t *\n\t * @param {string} shaderStage - The shader stage.\n\t * @return {string} The GLSL snippet that defines the shader attributes.\n\t */\n\tgetAttributes( shaderStage ) {\n\n\t\tlet snippet = '';\n\n\t\tif ( shaderStage === 'vertex' || shaderStage === 'compute' ) {\n\n\t\t\tconst attributes = this.getAttributesArray();\n\n\t\t\tlet location = 0;\n\n\t\t\tfor ( const attribute of attributes ) {\n\n\t\t\t\tsnippet += `layout( location = ${ location ++ } ) in ${ attribute.type } ${ attribute.name };\\n`;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn snippet;\n\n\t}\n\n\t/**\n\t * Returns the members of the given struct type node as a GLSL string.\n\t *\n\t * @param {StructTypeNode} struct - The struct type node.\n\t * @return {string} The GLSL snippet that defines the struct members.\n\t */\n\tgetStructMembers( struct ) {\n\n\t\tconst snippets = [];\n\n\t\tfor ( const member of struct.members ) {\n\n\t\t\tsnippets.push( `\\t${ member.type } ${ member.name };` );\n\n\t\t}\n\n\t\treturn snippets.join( '\\n' );\n\n\t}\n\n\t/**\n\t * Returns the structs of the given shader stage as a GLSL string.\n\t *\n\t * @param {string} shaderStage - The shader stage.\n\t * @return {string} The GLSL snippet that defines the structs.\n\t */\n\tgetStructs( shaderStage ) {\n\n\t\tconst snippets = [];\n\t\tconst structs = this.structs[ shaderStage ];\n\n\t\tconst outputSnippet = [];\n\n\t\tfor ( const struct of structs ) {\n\n\t\t\tif ( struct.output ) {\n\n\t\t\t\tfor ( const member of struct.members ) {\n\n\t\t\t\t\toutputSnippet.push( `layout( location = ${ member.index } ) out ${ member.type } ${ member.name };` );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tlet snippet = 'struct ' + struct.name + ' {\\n';\n\t\t\t\tsnippet += this.getStructMembers( struct );\n\t\t\t\tsnippet += '\\n};\\n';\n\n\t\t\t\tsnippets.push( snippet );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( outputSnippet.length === 0 ) {\n\n\t\t\toutputSnippet.push( 'layout( location = 0 ) out vec4 fragColor;' );\n\n\t\t}\n\n\t\treturn '\\n' + outputSnippet.join( '\\n' ) + '\\n\\n' + snippets.join( '\\n' );\n\n\t}\n\n\t/**\n\t * Returns the varyings of the given shader stage as a GLSL string.\n\t *\n\t * @param {string} shaderStage - The shader stage.\n\t * @return {string} The GLSL snippet that defines the varyings.\n\t */\n\tgetVaryings( shaderStage ) {\n\n\t\tlet snippet = '';\n\n\t\tconst varyings = this.varyings;\n\n\t\tif ( shaderStage === 'vertex' || shaderStage === 'compute' ) {\n\n\t\t\tfor ( const varying of varyings ) {\n\n\t\t\t\tif ( shaderStage === 'compute' ) varying.needsInterpolation = true;\n\n\t\t\t\tconst type = this.getType( varying.type );\n\n\t\t\t\tif ( varying.needsInterpolation ) {\n\n\t\t\t\t\tif ( varying.interpolationType ) {\n\n\t\t\t\t\t\tconst interpolationType = interpolationTypeMap[ varying.interpolationType ] || varying.interpolationType;\n\t\t\t\t\t\tconst sampling = interpolationModeMap[ varying.interpolationSampling ] || '';\n\n\t\t\t\t\t\tsnippet += `${ interpolationType } ${ sampling } out ${ type } ${ varying.name };\\n`;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst flat = type.includes( 'int' ) || type.includes( 'uv' ) || type.includes( 'iv' ) ? 'flat ' : '';\n\n\t\t\t\t\t\tsnippet += `${ flat }out ${ type } ${ varying.name };\\n`;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tsnippet += `${type} ${varying.name};\\n`; // generate variable (no varying required)\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( shaderStage === 'fragment' ) {\n\n\t\t\tfor ( const varying of varyings ) {\n\n\t\t\t\tif ( varying.needsInterpolation ) {\n\n\t\t\t\t\tconst type = this.getType( varying.type );\n\n\t\t\t\t\tif ( varying.interpolationType ) {\n\n\t\t\t\t\t\tconst interpolationType = interpolationTypeMap[ varying.interpolationType ] || varying.interpolationType;\n\t\t\t\t\t\tconst sampling = interpolationModeMap[ varying.interpolationSampling ] || '';\n\n\t\t\t\t\t\tsnippet += `${ interpolationType } ${ sampling } in ${ type } ${ varying.name };\\n`;\n\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst flat = type.includes( 'int' ) || type.includes( 'uv' ) || type.includes( 'iv' ) ? 'flat ' : '';\n\n\t\t\t\t\t\tsnippet += `${ flat }in ${ type } ${ varying.name };\\n`;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( const builtin of this.builtins[ shaderStage ] ) {\n\n\t\t\tsnippet += `${builtin};\\n`;\n\n\t\t}\n\n\t\treturn snippet;\n\n\t}\n\n\t/**\n\t * Returns the vertex index builtin.\n\t *\n\t * @return {string} The vertex index.\n\t */\n\tgetVertexIndex() {\n\n\t\treturn 'uint( gl_VertexID )';\n\n\t}\n\n\t/**\n\t * Contextually returns either the vertex stage instance index builtin\n\t * or the linearized index of an compute invocation within a grid of workgroups.\n\t *\n\t * @return {string} The instance index.\n\t */\n\tgetInstanceIndex() {\n\n\t\treturn 'uint( gl_InstanceID )';\n\n\t}\n\n\t/**\n\t * Returns a builtin representing the index of an invocation within its workgroup.\n\t *\n\t * @return {string} The invocation local index.\n\t */\n\tgetInvocationLocalIndex() {\n\n\t\tconst workgroupSize = this.object.workgroupSize;\n\n\t\tconst size = workgroupSize.reduce( ( acc, curr ) => acc * curr, 1 );\n\n\t\treturn `uint( gl_InstanceID ) % ${size}u`;\n\n\t}\n\n\t/**\n\t * Returns a builtin representing the size of a subgroup within the current shader.\n\t */\n\tgetSubgroupSize() {\n\n\t\terror( 'GLSLNodeBuilder: WebGLBackend does not support the subgroupSize node' );\n\n\t}\n\n\t/**\n\t * Returns a builtin representing the index of an invocation within its subgroup.\n\t */\n\tgetInvocationSubgroupIndex() {\n\n\t\terror( 'GLSLNodeBuilder: WebGLBackend does not support the invocationSubgroupIndex node' );\n\n\t}\n\n\t/**\n\t * Returns a builtin representing the index of the current invocation's subgroup within its workgroup.\n\t */\n\tgetSubgroupIndex() {\n\n\t\terror( 'GLSLNodeBuilder: WebGLBackend does not support the subgroupIndex node' );\n\n\t}\n\n\t/**\n\t * Returns the draw index builtin.\n\t *\n\t * @return {?string} The drawIndex shader string. Returns `null` if `WEBGL_multi_draw` isn't supported by the device.\n\t */\n\tgetDrawIndex() {\n\n\t\tconst extensions = this.renderer.backend.extensions;\n\n\t\tif ( extensions.has( 'WEBGL_multi_draw' ) ) {\n\n\t\t\treturn 'uint( gl_DrawID )';\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Returns the front facing builtin.\n\t *\n\t * @return {string} The front facing builtin.\n\t */\n\tgetFrontFacing() {\n\n\t\treturn 'gl_FrontFacing';\n\n\t}\n\n\t/**\n\t * Returns the frag coord builtin.\n\t *\n\t * @return {string} The frag coord builtin.\n\t */\n\tgetFragCoord() {\n\n\t\treturn 'gl_FragCoord.xy';\n\n\t}\n\n\t/**\n\t * Returns the frag depth builtin.\n\t *\n\t * @return {string} The frag depth builtin.\n\t */\n\tgetFragDepth() {\n\n\t\treturn 'gl_FragDepth';\n\n\t}\n\n\t/**\n\t * Enables the given extension.\n\t *\n\t * @param {string} name - The extension name.\n\t * @param {string} behavior - The extension behavior.\n\t * @param {string} [shaderStage=this.shaderStage] - The shader stage.\n\t */\n\tenableExtension( name, behavior, shaderStage = this.shaderStage ) {\n\n\t\tconst map = this.extensions[ shaderStage ] || ( this.extensions[ shaderStage ] = new Map() );\n\n\t\tif ( map.has( name ) === false ) {\n\n\t\t\tmap.set( name, {\n\t\t\t\tname,\n\t\t\t\tbehavior\n\t\t\t} );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the enabled extensions of the given shader stage as a GLSL string.\n\t *\n\t * @param {string} shaderStage - The shader stage.\n\t * @return {string} The GLSL snippet that defines the enabled extensions.\n\t */\n\tgetExtensions( shaderStage ) {\n\n\t\tconst snippets = [];\n\n\t\tif ( shaderStage === 'vertex' ) {\n\n\t\t\tconst ext = this.renderer.backend.extensions;\n\t\t\tconst isBatchedMesh = this.object.isBatchedMesh;\n\n\t\t\tif ( isBatchedMesh && ext.has( 'WEBGL_multi_draw' ) ) {\n\n\t\t\t\tthis.enableExtension( 'GL_ANGLE_multi_draw', 'require', shaderStage );\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst extensions = this.extensions[ shaderStage ];\n\n\t\tif ( extensions !== undefined ) {\n\n\t\t\tfor ( const { name, behavior } of extensions.values() ) {\n\n\t\t\t\tsnippets.push( `#extension ${name} : ${behavior}` );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn snippets.join( '\\n' );\n\n\t}\n\n\t/**\n\t * Returns the clip distances builtin.\n\t *\n\t * @return {string} The clip distances builtin.\n\t */\n\tgetClipDistance() {\n\n\t\treturn 'gl_ClipDistance';\n\n\t}\n\n\t/**\n\t * Whether the requested feature is available or not.\n\t *\n\t * @param {string} name - The requested feature.\n\t * @return {boolean} Whether the requested feature is supported or not.\n\t */\n\tisAvailable( name ) {\n\n\t\tlet result = supports$1[ name ];\n\n\t\tif ( result === undefined ) {\n\n\t\t\tlet extensionName;\n\n\t\t\tresult = false;\n\n\t\t\tswitch ( name ) {\n\n\t\t\t\tcase 'float32Filterable':\n\t\t\t\t\textensionName = 'OES_texture_float_linear';\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 'clipDistance':\n\t\t\t\t\textensionName = 'WEBGL_clip_cull_distance';\n\t\t\t\t\tbreak;\n\n\t\t\t}\n\n\t\t\tif ( extensionName !== undefined ) {\n\n\t\t\t\tconst extensions = this.renderer.backend.extensions;\n\n\t\t\t\tif ( extensions.has( extensionName ) ) {\n\n\t\t\t\t\textensions.get( extensionName );\n\t\t\t\t\tresult = true;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tsupports$1[ name ] = result;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\t/**\n\t * Whether to flip texture data along its vertical axis or not.\n\t *\n\t * @return {boolean} Returns always `true` in context of GLSL.\n\t */\n\tisFlipY() {\n\n\t\treturn true;\n\n\t}\n\n\t/**\n\t * Enables hardware clipping.\n\t *\n\t * @param {string} planeCount - The clipping plane count.\n\t */\n\tenableHardwareClipping( planeCount ) {\n\n\t\tthis.enableExtension( 'GL_ANGLE_clip_cull_distance', 'require' );\n\n\t\tthis.builtins[ 'vertex' ].push( `out float gl_ClipDistance[ ${ planeCount } ]` );\n\n\t}\n\n\t/**\n\t * Enables multiview.\n\t */\n\tenableMultiview() {\n\n\t\tthis.enableExtension( 'GL_OVR_multiview2', 'require', 'fragment' );\n\t\tthis.enableExtension( 'GL_OVR_multiview2', 'require', 'vertex' );\n\n\t\tthis.builtins[ 'vertex' ].push( 'layout(num_views = 2) in' );\n\n\t}\n\n\t/**\n\t * Registers a transform in context of Transform Feedback.\n\t *\n\t * @param {string} varyingName - The varying name.\n\t * @param {AttributeNode} attributeNode - The attribute node.\n\t */\n\tregisterTransform( varyingName, attributeNode ) {\n\n\t\tthis.transforms.push( { varyingName, attributeNode } );\n\n\t}\n\n\t/**\n\t * Returns the transforms of the given shader stage as a GLSL string.\n\t *\n\t * @param {string} shaderStage - The shader stage.\n\t * @return {string} The GLSL snippet that defines the transforms.\n\t */\n\tgetTransforms( /* shaderStage  */ ) {\n\n\t\tconst transforms = this.transforms;\n\n\t\tlet snippet = '';\n\n\t\tfor ( let i = 0; i < transforms.length; i ++ ) {\n\n\t\t\tconst transform = transforms[ i ];\n\t\t\tconst attributeName = this.getPropertyName( transform.attributeNode );\n\n\t\t\tif ( attributeName ) snippet += `${ transform.varyingName } = ${ attributeName };\\n\\t`;\n\n\t\t}\n\n\t\treturn snippet;\n\n\t}\n\n\t/**\n\t * Returns a GLSL struct based on the given name and variables.\n\t *\n\t * @private\n\t * @param {string} name - The struct name.\n\t * @param {string} vars - The struct variables.\n\t * @return {string} The GLSL snippet representing a struct.\n\t */\n\t_getGLSLUniformStruct( name, vars ) {\n\n\t\treturn `\nlayout( std140 ) uniform ${name} {\n${vars}\n};`;\n\n\t}\n\n\t/**\n\t * Returns a GLSL vertex shader based on the given shader data.\n\t *\n\t * @private\n\t * @param {Object} shaderData - The shader data.\n\t * @return {string} The vertex shader.\n\t */\n\t_getGLSLVertexCode( shaderData ) {\n\n\t\treturn `#version 300 es\n\n${ this.getSignature() }\n\n// extensions\n${shaderData.extensions}\n\n// precision\n${ defaultPrecisions }\n\n// uniforms\n${shaderData.uniforms}\n\n// varyings\n${shaderData.varyings}\n\n// attributes\n${shaderData.attributes}\n\n// codes\n${shaderData.codes}\n\nvoid main() {\n\n\t// vars\n\t${shaderData.vars}\n\n\t// transforms\n\t${shaderData.transforms}\n\n\t// flow\n\t${shaderData.flow}\n\n\tgl_PointSize = 1.0;\n\n}\n`;\n\n\t}\n\n\t/**\n\t * Returns a GLSL fragment shader based on the given shader data.\n\t *\n\t * @private\n\t * @param {Object} shaderData - The shader data.\n\t * @return {string} The vertex shader.\n\t */\n\t_getGLSLFragmentCode( shaderData ) {\n\n\t\treturn `#version 300 es\n\n${ this.getSignature() }\n\n// extensions\n${shaderData.extensions}\n\n// precision\n${ defaultPrecisions }\n\n// structs\n${shaderData.structs}\n\n// uniforms\n${shaderData.uniforms}\n\n// varyings\n${shaderData.varyings}\n\n// codes\n${shaderData.codes}\n\nvoid main() {\n\n\t// vars\n\t${shaderData.vars}\n\n\t// flow\n\t${shaderData.flow}\n\n}\n`;\n\n\t}\n\n\t/**\n\t * Controls the code build of the shader stages.\n\t */\n\tbuildCode() {\n\n\t\tconst shadersData = this.material !== null ? { fragment: {}, vertex: {} } : { compute: {} };\n\n\t\tthis.sortBindingGroups();\n\n\t\tfor ( const shaderStage in shadersData ) {\n\n\t\t\tlet flow = '// code\\n\\n';\n\t\t\tflow += this.flowCode[ shaderStage ];\n\n\t\t\tconst flowNodes = this.flowNodes[ shaderStage ];\n\t\t\tconst mainNode = flowNodes[ flowNodes.length - 1 ];\n\n\t\t\tfor ( const node of flowNodes ) {\n\n\t\t\t\tconst flowSlotData = this.getFlowData( node/*, shaderStage*/ );\n\t\t\t\tconst slotName = node.name;\n\n\t\t\t\tif ( slotName ) {\n\n\t\t\t\t\tif ( flow.length > 0 ) flow += '\\n';\n\n\t\t\t\t\tflow += `\\t// flow -> ${ slotName }\\n\\t`;\n\n\t\t\t\t}\n\n\t\t\t\tflow += `${ flowSlotData.code }\\n\\t`;\n\n\t\t\t\tif ( node === mainNode && shaderStage !== 'compute' ) {\n\n\t\t\t\t\tflow += '// result\\n\\t';\n\n\t\t\t\t\tif ( shaderStage === 'vertex' ) {\n\n\t\t\t\t\t\tflow += 'gl_Position = ';\n\t\t\t\t\t\tflow += `${ flowSlotData.result };`;\n\n\t\t\t\t\t} else if ( shaderStage === 'fragment' ) {\n\n\t\t\t\t\t\tif ( ! node.outputNode.isOutputStructNode ) {\n\n\t\t\t\t\t\t\tflow += 'fragColor = ';\n\t\t\t\t\t\t\tflow += `${ flowSlotData.result };`;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst stageData = shadersData[ shaderStage ];\n\n\t\t\tstageData.extensions = this.getExtensions( shaderStage );\n\t\t\tstageData.uniforms = this.getUniforms( shaderStage );\n\t\t\tstageData.attributes = this.getAttributes( shaderStage );\n\t\t\tstageData.varyings = this.getVaryings( shaderStage );\n\t\t\tstageData.vars = this.getVars( shaderStage );\n\t\t\tstageData.structs = this.getStructs( shaderStage );\n\t\t\tstageData.codes = this.getCodes( shaderStage );\n\t\t\tstageData.transforms = this.getTransforms( shaderStage );\n\t\t\tstageData.flow = flow;\n\n\t\t}\n\n\t\tif ( this.material !== null ) {\n\n\t\t\tthis.vertexShader = this._getGLSLVertexCode( shadersData.vertex );\n\t\t\tthis.fragmentShader = this._getGLSLFragmentCode( shadersData.fragment );\n\n\t\t} else {\n\n\t\t\tthis.computeShader = this._getGLSLVertexCode( shadersData.compute );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * This method is one of the more important ones since it's responsible\n\t * for generating a matching binding instance for the given uniform node.\n\t *\n\t * These bindings are later used in the renderer to create bind groups\n\t * and layouts.\n\t *\n\t * @param {UniformNode} node - The uniform node.\n\t * @param {string} type - The node data type.\n\t * @param {string} shaderStage - The shader stage.\n\t * @param {?string} [name=null] - An optional uniform name.\n\t * @return {NodeUniform} The node uniform object.\n\t */\n\tgetUniformFromNode( node, type, shaderStage, name = null ) {\n\n\t\tconst uniformNode = super.getUniformFromNode( node, type, shaderStage, name );\n\t\tconst nodeData = this.getDataFromNode( node, shaderStage, this.globalCache );\n\n\t\tlet uniformGPU = nodeData.uniformGPU;\n\n\t\tif ( uniformGPU === undefined ) {\n\n\t\t\tconst group = node.groupNode;\n\t\t\tconst groupName = group.name;\n\n\t\t\tconst bindings = this.getBindGroupArray( groupName, shaderStage );\n\n\t\t\tif ( type === 'texture' ) {\n\n\t\t\t\tuniformGPU = new NodeSampledTexture( uniformNode.name, uniformNode.node, group );\n\t\t\t\tbindings.push( uniformGPU );\n\n\t\t\t} else if ( type === 'cubeTexture' || type === 'cubeDepthTexture' ) {\n\n\t\t\t\tuniformGPU = new NodeSampledCubeTexture( uniformNode.name, uniformNode.node, group );\n\t\t\t\tbindings.push( uniformGPU );\n\n\t\t\t} else if ( type === 'texture3D' ) {\n\n\t\t\t\tuniformGPU = new NodeSampledTexture3D( uniformNode.name, uniformNode.node, group );\n\t\t\t\tbindings.push( uniformGPU );\n\n\t\t\t} else if ( type === 'buffer' ) {\n\n\t\t\t\tuniformNode.name = `buffer${ node.id }`;\n\n\t\t\t\tconst sharedData = this.getSharedDataFromNode( node );\n\n\t\t\t\tlet buffer = sharedData.buffer;\n\n\t\t\t\tif ( buffer === undefined ) {\n\n\t\t\t\t\tnode.name = `NodeBuffer_${ node.id }`;\n\n\t\t\t\t\tbuffer = new NodeUniformBuffer( node, group );\n\t\t\t\t\tbuffer.name = node.name;\n\n\t\t\t\t\tsharedData.buffer = buffer;\n\n\t\t\t\t}\n\n\t\t\t\tbindings.push( buffer );\n\n\t\t\t\tuniformGPU = buffer;\n\n\t\t\t} else {\n\n\t\t\t\tconst uniformsStage = this.uniformGroups[ shaderStage ] || ( this.uniformGroups[ shaderStage ] = {} );\n\n\t\t\t\tlet uniformsGroup = uniformsStage[ groupName ];\n\n\t\t\t\tif ( uniformsGroup === undefined ) {\n\n\t\t\t\t\tuniformsGroup = new NodeUniformsGroup( shaderStage + '_' + groupName, group );\n\t\t\t\t\t//uniformsGroup.setVisibility( gpuShaderStageLib[ shaderStage ] );\n\n\t\t\t\t\tuniformsStage[ groupName ] = uniformsGroup;\n\n\t\t\t\t\tbindings.push( uniformsGroup );\n\n\t\t\t\t}\n\n\t\t\t\tuniformGPU = this.getNodeUniform( uniformNode, type );\n\n\t\t\t\tuniformsGroup.addUniform( uniformGPU );\n\n\t\t\t}\n\n\t\t\tnodeData.uniformGPU = uniformGPU;\n\n\t\t}\n\n\t\treturn uniformNode;\n\n\t}\n\n}\n\nlet _vector2 = null;\nlet _color4 = null;\n\n/**\n * Most of the rendering related logic is implemented in the\n * {@link Renderer} module and related management components.\n * Sometimes it is required though to execute commands which are\n * specific to the current 3D backend (which is WebGPU or WebGL 2).\n * This abstract base class defines an interface that encapsulates\n * all backend-related logic. Derived classes for each backend must\n * implement the interface.\n *\n * @abstract\n * @private\n */\nclass Backend {\n\n\t/**\n\t * Constructs a new backend.\n\t *\n\t * @param {Object} parameters - An object holding parameters for the backend.\n\t */\n\tconstructor( parameters = {} ) {\n\n\t\t/**\n\t\t * The parameters of the backend.\n\t\t *\n\t\t * @type {Object}\n\t\t */\n\t\tthis.parameters = Object.assign( {}, parameters );\n\n\t\t/**\n\t\t * This weak map holds backend-specific data of objects\n\t\t * like textures, attributes or render targets.\n\t\t *\n\t\t * @type {WeakMap<Object, Object>}\n\t\t */\n\t\tthis.data = new WeakMap();\n\n\t\t/**\n\t\t * A reference to the renderer.\n\t\t *\n\t\t * @type {?Renderer}\n\t\t * @default null\n\t\t */\n\t\tthis.renderer = null;\n\n\t\t/**\n\t\t * A reference to the canvas element the renderer is drawing to.\n\t\t *\n\t\t * @type {?(HTMLCanvasElement|OffscreenCanvas)}\n\t\t * @default null\n\t\t */\n\t\tthis.domElement = null;\n\n\t\t/**\n\t\t * A reference to the timestamp query pool.\n   \t\t *\n   \t\t * @type {{render: ?TimestampQueryPool, compute: ?TimestampQueryPool}}\n\t\t */\n\t\tthis.timestampQueryPool = {\n\t\t\t[ TimestampQuery.RENDER ]: null,\n\t\t\t[ TimestampQuery.COMPUTE ]: null\n\t\t};\n\n\t\t/**\n\t\t * Whether to track timestamps with a Timestamp Query API or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.trackTimestamp = ( parameters.trackTimestamp === true );\n\n\t}\n\n\t/**\n\t * Initializes the backend so it is ready for usage. Concrete backends\n\t * are supposed to implement their rendering context creation and related\n\t * operations in this method.\n\t *\n\t * @async\n\t * @param {Renderer} renderer - The renderer.\n\t * @return {Promise} A Promise that resolves when the backend has been initialized.\n\t */\n\tasync init( renderer ) {\n\n\t\tthis.renderer = renderer;\n\n\t}\n\n\t/**\n\t * The coordinate system of the backend.\n\t *\n\t * @abstract\n\t * @type {number}\n\t * @readonly\n\t */\n\tget coordinateSystem() {}\n\n\t// render context\n\n\t/**\n\t * This method is executed at the beginning of a render call and\n\t * can be used by the backend to prepare the state for upcoming\n\t * draw calls.\n\t *\n\t * @abstract\n\t * @param {RenderContext} renderContext - The render context.\n\t */\n\tbeginRender( /*renderContext*/ ) {}\n\n\t/**\n\t * This method is executed at the end of a render call and\n\t * can be used by the backend to finalize work after draw\n\t * calls.\n\t *\n\t * @abstract\n\t * @param {RenderContext} renderContext - The render context.\n\t */\n\tfinishRender( /*renderContext*/ ) {}\n\n\t/**\n\t * This method is executed at the beginning of a compute call and\n\t * can be used by the backend to prepare the state for upcoming\n\t * compute tasks.\n\t *\n\t * @abstract\n\t * @param {Node|Array<Node>} computeGroup - The compute node(s).\n\t */\n\tbeginCompute( /*computeGroup*/ ) {}\n\n\t/**\n\t * This method is executed at the end of a compute call and\n\t * can be used by the backend to finalize work after compute\n\t * tasks.\n\t *\n\t * @abstract\n\t * @param {Node|Array<Node>} computeGroup - The compute node(s).\n\t */\n\tfinishCompute( /*computeGroup*/ ) {}\n\n\t// render object\n\n\t/**\n\t * Executes a draw command for the given render object.\n\t *\n\t * @abstract\n\t * @param {RenderObject} renderObject - The render object to draw.\n\t * @param {Info} info - Holds a series of statistical information about the GPU memory and the rendering process.\n\t */\n\tdraw( /*renderObject, info*/ ) { }\n\n\t// compute node\n\n\t/**\n\t * Executes a compute command for the given compute node.\n\t *\n\t * @abstract\n\t * @param {Node|Array<Node>} computeGroup - The group of compute nodes of a compute call. Can be a single compute node.\n\t * @param {Node} computeNode - The compute node.\n\t * @param {Array<BindGroup>} bindings - The bindings.\n\t * @param {ComputePipeline} computePipeline - The compute pipeline.\n\t */\n\tcompute( /*computeGroup, computeNode, computeBindings, computePipeline*/ ) { }\n\n\t// program\n\n\t/**\n\t * Creates a shader program from the given programmable stage.\n\t *\n\t * @abstract\n\t * @param {ProgrammableStage} program - The programmable stage.\n\t */\n\tcreateProgram( /*program*/ ) { }\n\n\t/**\n\t * Destroys the shader program of the given programmable stage.\n\t *\n\t * @abstract\n\t * @param {ProgrammableStage} program - The programmable stage.\n\t */\n\tdestroyProgram( /*program*/ ) { }\n\n\t// bindings\n\n\t/**\n\t * Creates bindings from the given bind group definition.\n\t *\n\t * @abstract\n\t * @param {BindGroup} bindGroup - The bind group.\n\t * @param {Array<BindGroup>} bindings - Array of bind groups.\n\t * @param {number} cacheIndex - The cache index.\n\t * @param {number} version - The version.\n\t */\n\tcreateBindings( /*bindGroup, bindings, cacheIndex, version*/ ) { }\n\n\t/**\n\t * Updates the given bind group definition.\n\t *\n\t * @abstract\n\t * @param {BindGroup} bindGroup - The bind group.\n\t * @param {Array<BindGroup>} bindings - Array of bind groups.\n\t * @param {number} cacheIndex - The cache index.\n\t * @param {number} version - The version.\n\t */\n\tupdateBindings( /*bindGroup, bindings, cacheIndex, version*/ ) { }\n\n\t/**\n\t * Updates a buffer binding.\n\t *\n\t * @abstract\n\t * @param {Buffer} binding - The buffer binding to update.\n\t */\n\tupdateBinding( /*binding*/ ) { }\n\n\t// pipeline\n\n\t/**\n\t * Creates a render pipeline for the given render object.\n\t *\n\t * @abstract\n\t * @param {RenderObject} renderObject - The render object.\n\t * @param {Array<Promise>} promises - An array of compilation promises which are used in `compileAsync()`.\n\t */\n\tcreateRenderPipeline( /*renderObject, promises*/ ) { }\n\n\t/**\n\t * Creates a compute pipeline for the given compute node.\n\t *\n\t * @abstract\n\t * @param {ComputePipeline} computePipeline - The compute pipeline.\n\t * @param {Array<BindGroup>} bindings - The bindings.\n\t */\n\tcreateComputePipeline( /*computePipeline, bindings*/ ) { }\n\n\t// cache key\n\n\t/**\n\t * Returns `true` if the render pipeline requires an update.\n\t *\n\t * @abstract\n\t * @param {RenderObject} renderObject - The render object.\n\t * @return {boolean} Whether the render pipeline requires an update or not.\n\t */\n\tneedsRenderUpdate( /*renderObject*/ ) { }\n\n\t/**\n\t * Returns a cache key that is used to identify render pipelines.\n\t *\n\t * @abstract\n\t * @param {RenderObject} renderObject - The render object.\n\t * @return {string} The cache key.\n\t */\n\tgetRenderCacheKey( /*renderObject*/ ) { }\n\n\t// node builder\n\n\t/**\n\t * Returns a node builder for the given render object.\n\t *\n\t * @abstract\n\t * @param {RenderObject} renderObject - The render object.\n\t * @param {Renderer} renderer - The renderer.\n\t * @return {NodeBuilder} The node builder.\n\t */\n\tcreateNodeBuilder( /*renderObject, renderer*/ ) { }\n\n\t// textures\n\n\t/**\n\t * Updates a GPU sampler for the given texture.\n\t *\n\t * @abstract\n\t * @param {Texture} texture - The texture to update the sampler for.\n\t * @return {string} The current sampler key.\n\t */\n\tupdateSampler( /*texture*/ ) { }\n\n\t/**\n\t * Creates a default texture for the given texture that can be used\n\t * as a placeholder until the actual texture is ready for usage.\n\t *\n\t * @abstract\n\t * @param {Texture} texture - The texture to create a default texture for.\n\t */\n\tcreateDefaultTexture( /*texture*/ ) { }\n\n\t/**\n\t * Defines a texture on the GPU for the given texture object.\n\t *\n\t * @abstract\n\t * @param {Texture} texture - The texture.\n\t * @param {Object} [options={}] - Optional configuration parameter.\n\t */\n\tcreateTexture( /*texture, options={}*/ ) { }\n\n\t/**\n\t * Uploads the updated texture data to the GPU.\n\t *\n\t * @abstract\n\t * @param {Texture} texture - The texture.\n\t * @param {Object} [options={}] - Optional configuration parameter.\n\t */\n\tupdateTexture( /*texture, options = {}*/ ) { }\n\n\t/**\n\t * Generates mipmaps for the given texture.\n\t *\n\t * @abstract\n\t * @param {Texture} texture - The texture.\n\t */\n\tgenerateMipmaps( /*texture*/ ) { }\n\n\t/**\n\t * Destroys the GPU data for the given texture object.\n\t *\n\t * @abstract\n\t * @param {Texture} texture - The texture.\n\t * @param {boolean} [isDefaultTexture=false] - Whether the texture uses a default GPU texture or not.\n\t */\n\tdestroyTexture( /*texture, isDefaultTexture*/ ) { }\n\n\t/**\n\t * Returns texture data as a typed array.\n\t *\n\t * @abstract\n\t * @async\n\t * @param {Texture} texture - The texture to copy.\n\t * @param {number} x - The x coordinate of the copy origin.\n\t * @param {number} y - The y coordinate of the copy origin.\n\t * @param {number} width - The width of the copy.\n\t * @param {number} height - The height of the copy.\n\t * @param {number} faceIndex - The face index.\n\t * @return {Promise<TypedArray>} A Promise that resolves with a typed array when the copy operation has finished.\n\t */\n\tasync copyTextureToBuffer( /*texture, x, y, width, height, faceIndex*/ ) {}\n\n\t/**\n\t * Copies data of the given source texture to the given destination texture.\n\t *\n\t * @abstract\n\t * @param {Texture} srcTexture - The source texture.\n\t * @param {Texture} dstTexture - The destination texture.\n\t * @param {?(Box3|Box2)} [srcRegion=null] - The region of the source texture to copy.\n\t * @param {?(Vector2|Vector3)} [dstPosition=null] - The destination position of the copy.\n\t * @param {number} [srcLevel=0] - The source mip level to copy from.\n\t * @param {number} [dstLevel=0] - The destination mip level to copy to.\n\t */\n\tcopyTextureToTexture( /*srcTexture, dstTexture, srcRegion = null, dstPosition = null, srcLevel = 0, dstLevel = 0*/ ) {}\n\n\t/**\n\t* Copies the current bound framebuffer to the given texture.\n\t*\n\t* @abstract\n\t* @param {Texture} texture - The destination texture.\n\t* @param {RenderContext} renderContext - The render context.\n\t* @param {Vector4} rectangle - A four dimensional vector defining the origin and dimension of the copy.\n\t*/\n\tcopyFramebufferToTexture( /*texture, renderContext, rectangle*/ ) {}\n\n\t// attributes\n\n\t/**\n\t * Creates the GPU buffer of a shader attribute.\n\t *\n\t * @abstract\n\t * @param {BufferAttribute} attribute - The buffer attribute.\n\t */\n\tcreateAttribute( /*attribute*/ ) { }\n\n\t/**\n\t * Creates the GPU buffer of an indexed shader attribute.\n\t *\n\t * @abstract\n\t * @param {BufferAttribute} attribute - The indexed buffer attribute.\n\t */\n\tcreateIndexAttribute( /*attribute*/ ) { }\n\n\t/**\n\t * Creates the GPU buffer of a storage attribute.\n\t *\n\t * @abstract\n\t * @param {BufferAttribute} attribute - The buffer attribute.\n\t */\n\tcreateStorageAttribute( /*attribute*/ ) { }\n\n\t/**\n\t * Updates the GPU buffer of a shader attribute.\n\t *\n\t * @abstract\n\t * @param {BufferAttribute} attribute - The buffer attribute to update.\n\t */\n\tupdateAttribute( /*attribute*/ ) { }\n\n\t/**\n\t * Destroys the GPU buffer of a shader attribute.\n\t *\n\t * @abstract\n\t * @param {BufferAttribute} attribute - The buffer attribute to destroy.\n\t */\n\tdestroyAttribute( /*attribute*/ ) { }\n\n\t// canvas\n\n\t/**\n\t * Returns the backend's rendering context.\n\t *\n\t * @abstract\n\t * @return {Object} The rendering context.\n\t */\n\tgetContext() { }\n\n\t/**\n\t * Backends can use this method if they have to run\n\t * logic when the renderer gets resized.\n\t *\n\t * @abstract\n\t */\n\tupdateSize() { }\n\n\t/**\n\t * Updates the viewport with the values from the given render context.\n\t *\n\t * @abstract\n\t * @param {RenderContext} renderContext - The render context.\n\t */\n\tupdateViewport( /*renderContext*/ ) {}\n\n\t// utils\n\n\t/**\n\t * Updates a unique identifier for the given render context that can be used\n\t * to allocate resources like occlusion queries or timestamp queries.\n\t *\n\t * @param {RenderContext|ComputeNode} abstractRenderContext - The render context.\n\t */\n\tupdateTimeStampUID( abstractRenderContext ) {\n\n\t\tconst contextData = this.get( abstractRenderContext );\n\t\tconst frame = this.renderer.info.frame;\n\n\t\tlet prefix;\n\n\t\tif ( abstractRenderContext.isComputeNode === true ) {\n\n\t\t\tprefix = 'c:' + this.renderer.info.compute.frameCalls;\n\n\t\t} else {\n\n\t\t\tprefix = 'r:' + this.renderer.info.render.frameCalls;\n\n\t\t}\n\n\t\tcontextData.timestampUID = prefix + ':' + abstractRenderContext.id + ':f' + frame;\n\n\t}\n\n\t/**\n\t * Returns a unique identifier for the given render context that can be used\n\t * to allocate resources like occlusion queries or timestamp queries.\n\t *\n\t * @param {RenderContext|ComputeNode} abstractRenderContext - The render context.\n\t * @return {string} The unique identifier.\n\t */\n\tgetTimestampUID( abstractRenderContext ) {\n\n\t\treturn this.get( abstractRenderContext ).timestampUID;\n\n\t}\n\n\t/**\n\t * Returns all timestamp frames for the given type.\n\t *\n\t * @param {string} type - The type of the time stamp.\n\t * @return {Array<number>} The timestamp frames.\n\t */\n\tgetTimestampFrames( type ) {\n\n\t\tconst queryPool = this.timestampQueryPool[ type ];\n\n\t\treturn queryPool ? queryPool.getTimestampFrames() : [];\n\n\t}\n\n\t/**\n\t * Returns the query pool for the given uid.\n\t *\n\t * @param {string} uid - The unique identifier.\n\t * @return {TimestampQueryPool} The query pool.\n\t */\n\t_getQueryPool( uid ) {\n\n\t\tconst type = uid.startsWith( 'c:' ) ? TimestampQuery.COMPUTE : TimestampQuery.RENDER;\n\t\tconst queryPool = this.timestampQueryPool[ type ];\n\n\t\treturn queryPool;\n\n\t}\n\n\t/**\n\t * Returns the timestamp for the given uid.\n\t *\n\t * @param {string} uid - The unique identifier.\n\t * @return {number} The timestamp.\n\t */\n\tgetTimestamp( uid ) {\n\n\t\tconst queryPool = this._getQueryPool( uid );\n\n\t\treturn queryPool.getTimestamp( uid );\n\n\t}\n\n\t/**\n\t * Returns `true` if a timestamp for the given uid is available.\n\t *\n\t * @param {string} uid - The unique identifier.\n\t * @return {boolean} Whether the timestamp is available or not.\n\t */\n\thasTimestamp( uid ) {\n\n\t\tconst queryPool = this._getQueryPool( uid );\n\n\t\treturn queryPool.hasTimestamp( uid );\n\n\t}\n\n\t/**\n\t * Returns `true` if the given 3D object is fully occluded by other\n\t * 3D objects in the scene. Backends must implement this method by using\n\t * a Occlusion Query API.\n\t *\n\t * @abstract\n\t * @param {RenderContext} renderContext - The render context.\n\t * @param {Object3D} object - The 3D object to test.\n\t * @return {boolean} Whether the 3D object is fully occluded or not.\n\t */\n\tisOccluded( /*renderContext, object*/ ) {}\n\n\t/**\n\t * Resolves the time stamp for the given render context and type.\n\t *\n\t * @async\n\t * @abstract\n\t * @param {string} [type='render'] - The type of the time stamp.\n\t * @return {Promise<number>} A Promise that resolves with the time stamp.\n\t */\n\tasync resolveTimestampsAsync( type = 'render' ) {\n\n\t\tif ( ! this.trackTimestamp ) {\n\n\t\t\twarnOnce( 'WebGPURenderer: Timestamp tracking is disabled.' );\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst queryPool = this.timestampQueryPool[ type ];\n\n\t\tif ( ! queryPool ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst duration = await queryPool.resolveQueriesAsync();\n\n\t\tthis.renderer.info[ type ].timestamp = duration;\n\n\t\treturn duration;\n\n\t}\n\n\t/**\n\t * This method performs a readback operation by moving buffer data from\n\t * a storage buffer attribute from the GPU to the CPU.\n\t *\n\t * @async\n\t * @param {StorageBufferAttribute} attribute - The storage buffer attribute.\n\t * @return {Promise<ArrayBuffer>} A promise that resolves with the buffer data when the data are ready.\n\t */\n\tasync getArrayBufferAsync( /* attribute */ ) {}\n\n\t/**\n\t * Checks if the given feature is supported by the backend.\n\t *\n\t * @async\n\t * @abstract\n\t * @param {string} name - The feature's name.\n\t * @return {Promise<boolean>} A Promise that resolves with a bool that indicates whether the feature is supported or not.\n\t */\n\tasync hasFeatureAsync( /*name*/ ) { }\n\n\t/**\n\t * Checks if the given feature is supported  by the backend.\n\t *\n\t * @abstract\n\t * @param {string} name - The feature's name.\n\t * @return {boolean} Whether the feature is supported or not.\n\t */\n\thasFeature( /*name*/ ) {}\n\n\t/**\n\t * Returns the maximum anisotropy texture filtering value.\n\t *\n\t * @abstract\n\t * @return {number} The maximum anisotropy texture filtering value.\n\t */\n\tgetMaxAnisotropy() {}\n\n\t/**\n\t * Returns the drawing buffer size.\n\t *\n\t * @return {Vector2} The drawing buffer size.\n\t */\n\tgetDrawingBufferSize() {\n\n\t\t_vector2 = _vector2 || new Vector2();\n\n\t\treturn this.renderer.getDrawingBufferSize( _vector2 );\n\n\t}\n\n\t/**\n\t * Defines the scissor test.\n\t *\n\t * @abstract\n\t * @param {boolean} boolean - Whether the scissor test should be enabled or not.\n\t */\n\tsetScissorTest( /*boolean*/ ) { }\n\n\t/**\n\t * Returns the clear color and alpha into a single\n\t * color object.\n\t *\n\t * @return {Color4} The clear color.\n\t */\n\tgetClearColor() {\n\n\t\tconst renderer = this.renderer;\n\n\t\t_color4 = _color4 || new Color4();\n\n\t\trenderer.getClearColor( _color4 );\n\n\t\t_color4.getRGB( _color4 );\n\n\t\treturn _color4;\n\n\t}\n\n\t/**\n\t * Returns the DOM element. If no DOM element exists, the backend\n\t * creates a new one.\n\t *\n\t * @return {HTMLCanvasElement} The DOM element.\n\t */\n\tgetDomElement() {\n\n\t\tlet domElement = this.domElement;\n\n\t\tif ( domElement === null ) {\n\n\t\t\tdomElement = ( this.parameters.canvas !== undefined ) ? this.parameters.canvas : createCanvasElement();\n\n\t\t\t// OffscreenCanvas does not have setAttribute, see #22811\n\t\t\tif ( 'setAttribute' in domElement ) domElement.setAttribute( 'data-engine', `three.js r${REVISION} webgpu` );\n\n\t\t\tthis.domElement = domElement;\n\n\t\t}\n\n\t\treturn domElement;\n\n\t}\n\n\t/**\n\t * Sets a dictionary for the given object into the\n\t * internal data structure.\n\t *\n\t * @param {Object} object - The object.\n\t * @param {Object} value - The dictionary to set.\n\t */\n\tset( object, value ) {\n\n\t\tthis.data.set( object, value );\n\n\t}\n\n\t/**\n\t * Returns the dictionary for the given object.\n\t *\n\t * @param {Object} object - The object.\n\t * @return {Object} The object's dictionary.\n\t */\n\tget( object ) {\n\n\t\tlet map = this.data.get( object );\n\n\t\tif ( map === undefined ) {\n\n\t\t\tmap = {};\n\t\t\tthis.data.set( object, map );\n\n\t\t}\n\n\t\treturn map;\n\n\t}\n\n\t/**\n\t * Checks if the given object has a dictionary\n\t * with data defined.\n\t *\n\t * @param {Object} object - The object.\n\t * @return {boolean} Whether a dictionary for the given object as been defined or not.\n\t */\n\thas( object ) {\n\n\t\treturn this.data.has( object );\n\n\t}\n\n\t/**\n\t * Deletes an object from the internal data structure.\n\t *\n\t * @param {Object} object - The object to delete.\n\t */\n\tdelete( object ) {\n\n\t\tthis.data.delete( object );\n\n\t}\n\n\t/**\n\t * Delete GPU data associated with a bind group.\n\t *\n\t * @abstract\n\t * @param {BindGroup} bindGroup - The bind group.\n\t */\n\tdeleteBindGroupData( /*bindGroup*/ ) { }\n\n\t/**\n\t * Frees internal resources.\n\t *\n\t * @abstract\n\t */\n\tdispose() { }\n\n}\n\nlet _id$1 = 0;\n\n/**\n * This module is internally used in context of compute shaders.\n * This type of shader is not natively supported in WebGL 2 and\n * thus implemented via Transform Feedback. `DualAttributeData`\n * manages the related data.\n *\n * @private\n */\nclass DualAttributeData {\n\n\tconstructor( attributeData, dualBuffer ) {\n\n\t\tthis.buffers = [ attributeData.bufferGPU, dualBuffer ];\n\t\tthis.type = attributeData.type;\n\t\tthis.bufferType = attributeData.bufferType;\n\t\tthis.pbo = attributeData.pbo;\n\t\tthis.byteLength = attributeData.byteLength;\n\t\tthis.bytesPerElement = attributeData.BYTES_PER_ELEMENT;\n\t\tthis.version = attributeData.version;\n\t\tthis.isInteger = attributeData.isInteger;\n\t\tthis.activeBufferIndex = 0;\n\t\tthis.baseId = attributeData.id;\n\n\t}\n\n\n\tget id() {\n\n\t\treturn `${ this.baseId }|${ this.activeBufferIndex }`;\n\n\t}\n\n\tget bufferGPU() {\n\n\t\treturn this.buffers[ this.activeBufferIndex ];\n\n\t}\n\n\tget transformBuffer() {\n\n\t\treturn this.buffers[ this.activeBufferIndex ^ 1 ];\n\n\t}\n\n\tswitchBuffers() {\n\n\t\tthis.activeBufferIndex ^= 1;\n\n\t}\n\n}\n\n/**\n * A WebGL 2 backend utility module for managing shader attributes.\n *\n * @private\n */\nclass WebGLAttributeUtils {\n\n\t/**\n\t * Constructs a new utility object.\n\t *\n\t * @param {WebGLBackend} backend - The WebGL 2 backend.\n\t */\n\tconstructor( backend ) {\n\n\t\t/**\n\t\t * A reference to the WebGL 2 backend.\n\t\t *\n\t\t * @type {WebGLBackend}\n\t\t */\n\t\tthis.backend = backend;\n\n\t}\n\n\t/**\n\t * Creates the GPU buffer for the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute.\n\t * @param {GLenum } bufferType - A flag that indicates the buffer type and thus binding point target.\n\t */\n\tcreateAttribute( attribute, bufferType ) {\n\n\t\tconst backend = this.backend;\n\t\tconst { gl } = backend;\n\n\t\tconst array = attribute.array;\n\t\tconst usage = attribute.usage || gl.STATIC_DRAW;\n\n\t\tconst bufferAttribute = attribute.isInterleavedBufferAttribute ? attribute.data : attribute;\n\t\tconst bufferData = backend.get( bufferAttribute );\n\n\t\tlet bufferGPU = bufferData.bufferGPU;\n\n\t\tif ( bufferGPU === undefined ) {\n\n\t\t\tbufferGPU = this._createBuffer( gl, bufferType, array, usage );\n\n\t\t\tbufferData.bufferGPU = bufferGPU;\n\t\t\tbufferData.bufferType = bufferType;\n\t\t\tbufferData.version = bufferAttribute.version;\n\n\t\t}\n\n\t\t//attribute.onUploadCallback();\n\n\t\tlet type;\n\n\t\tif ( array instanceof Float32Array ) {\n\n\t\t\ttype = gl.FLOAT;\n\n\t\t} else if ( typeof Float16Array !== 'undefined' && array instanceof Float16Array ) {\n\n\t\t\ttype = gl.HALF_FLOAT;\n\n\t\t} else if ( array instanceof Uint16Array ) {\n\n\t\t\tif ( attribute.isFloat16BufferAttribute ) {\n\n\t\t\t\ttype = gl.HALF_FLOAT;\n\n\t\t\t} else {\n\n\t\t\t\ttype = gl.UNSIGNED_SHORT;\n\n\t\t\t}\n\n\t\t} else if ( array instanceof Int16Array ) {\n\n\t\t\ttype = gl.SHORT;\n\n\t\t} else if ( array instanceof Uint32Array ) {\n\n\t\t\ttype = gl.UNSIGNED_INT;\n\n\t\t} else if ( array instanceof Int32Array ) {\n\n\t\t\ttype = gl.INT;\n\n\t\t} else if ( array instanceof Int8Array ) {\n\n\t\t\ttype = gl.BYTE;\n\n\t\t} else if ( array instanceof Uint8Array ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t} else if ( array instanceof Uint8ClampedArray ) {\n\n\t\t\ttype = gl.UNSIGNED_BYTE;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.WebGLBackend: Unsupported buffer data format: ' + array );\n\n\t\t}\n\n\t\tlet attributeData = {\n\t\t\tbufferGPU,\n\t\t\tbufferType,\n\t\t\ttype,\n\t\t\tbyteLength: array.byteLength,\n\t\t\tbytesPerElement: array.BYTES_PER_ELEMENT,\n\t\t\tversion: attribute.version,\n\t\t\tpbo: attribute.pbo,\n\t\t\tisInteger: type === gl.INT || type === gl.UNSIGNED_INT || attribute.gpuType === IntType,\n\t\t\tid: _id$1 ++\n\t\t};\n\n\t\tif ( attribute.isStorageBufferAttribute || attribute.isStorageInstancedBufferAttribute ) {\n\n\t\t\t// create buffer for transform feedback use\n\t\t\tconst bufferGPUDual = this._createBuffer( gl, bufferType, array, usage );\n\t\t\tattributeData = new DualAttributeData( attributeData, bufferGPUDual );\n\n\t\t}\n\n\t\tbackend.set( attribute, attributeData );\n\n\t}\n\n\t/**\n\t * Updates the GPU buffer of the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute.\n\t */\n\tupdateAttribute( attribute ) {\n\n\t\tconst backend = this.backend;\n\t\tconst { gl } = backend;\n\n\t\tconst array = attribute.array;\n\t\tconst bufferAttribute = attribute.isInterleavedBufferAttribute ? attribute.data : attribute;\n\t\tconst bufferData = backend.get( bufferAttribute );\n\t\tconst bufferType = bufferData.bufferType;\n\t\tconst updateRanges = attribute.isInterleavedBufferAttribute ? attribute.data.updateRanges : attribute.updateRanges;\n\n\t\tgl.bindBuffer( bufferType, bufferData.bufferGPU );\n\n\t\tif ( updateRanges.length === 0 ) {\n\n\t\t\t// Not using update ranges\n\n\t\t\tgl.bufferSubData( bufferType, 0, array );\n\n\t\t} else {\n\n\t\t\tfor ( let i = 0, l = updateRanges.length; i < l; i ++ ) {\n\n\t\t\t\tconst range = updateRanges[ i ];\n\t\t\t\tgl.bufferSubData( bufferType, range.start * array.BYTES_PER_ELEMENT,\n\t\t\t\t\tarray, range.start, range.count );\n\n\t\t\t}\n\n\t\t\tbufferAttribute.clearUpdateRanges();\n\n\t\t}\n\n\t\tgl.bindBuffer( bufferType, null );\n\n\t\tbufferData.version = bufferAttribute.version;\n\n\t}\n\n\t/**\n\t * Destroys the GPU buffer of the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute.\n\t */\n\tdestroyAttribute( attribute ) {\n\n\t\tconst backend = this.backend;\n\t\tconst { gl } = backend;\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) {\n\n\t\t\tbackend.delete( attribute.data );\n\n\t\t}\n\n\t\tconst attributeData = backend.get( attribute );\n\n\t\tgl.deleteBuffer( attributeData.bufferGPU );\n\n\t\tbackend.delete( attribute );\n\n\t}\n\n\t/**\n\t * This method performs a readback operation by moving buffer data from\n\t * a storage buffer attribute from the GPU to the CPU.\n\t *\n\t * @async\n\t * @param {StorageBufferAttribute} attribute - The storage buffer attribute.\n\t * @return {Promise<ArrayBuffer>} A promise that resolves with the buffer data when the data are ready.\n\t */\n\tasync getArrayBufferAsync( attribute ) {\n\n\t\tconst backend = this.backend;\n\t\tconst { gl } = backend;\n\n\t\tconst bufferAttribute = attribute.isInterleavedBufferAttribute ? attribute.data : attribute;\n\t\tconst { bufferGPU } = backend.get( bufferAttribute );\n\n\t\tconst array = attribute.array;\n\t\tconst byteLength = array.byteLength;\n\n\t\tgl.bindBuffer( gl.COPY_READ_BUFFER, bufferGPU );\n\n\t\tconst writeBuffer = gl.createBuffer();\n\n\t\tgl.bindBuffer( gl.COPY_WRITE_BUFFER, writeBuffer );\n\t\tgl.bufferData( gl.COPY_WRITE_BUFFER, byteLength, gl.STREAM_READ );\n\n\t\tgl.copyBufferSubData( gl.COPY_READ_BUFFER, gl.COPY_WRITE_BUFFER, 0, 0, byteLength );\n\n\t\tawait backend.utils._clientWaitAsync();\n\n\t\tconst dstBuffer = new attribute.array.constructor( array.length );\n\n\t\t// Ensure the buffer is bound before reading\n\t\tgl.bindBuffer( gl.COPY_WRITE_BUFFER, writeBuffer );\n\n\t\tgl.getBufferSubData( gl.COPY_WRITE_BUFFER, 0, dstBuffer );\n\n\t\tgl.deleteBuffer( writeBuffer );\n\n\t\tgl.bindBuffer( gl.COPY_READ_BUFFER, null );\n\t\tgl.bindBuffer( gl.COPY_WRITE_BUFFER, null );\n\n\t\treturn dstBuffer.buffer;\n\n\t}\n\n\t/**\n\t * Creates a WebGL buffer with the given data.\n\t *\n\t * @private\n\t * @param {WebGL2RenderingContext} gl - The rendering context.\n\t * @param {GLenum } bufferType - A flag that indicates the buffer type and thus binding point target.\n\t * @param {TypedArray} array - The array of the buffer attribute.\n\t * @param {GLenum} usage - The usage.\n\t * @return {WebGLBuffer} The WebGL buffer.\n\t */\n\t_createBuffer( gl, bufferType, array, usage ) {\n\n\t\tconst bufferGPU = gl.createBuffer();\n\n\t\tgl.bindBuffer( bufferType, bufferGPU );\n\t\tgl.bufferData( bufferType, array, usage );\n\t\tgl.bindBuffer( bufferType, null );\n\n\t\treturn bufferGPU;\n\n\t}\n\n}\n\nlet equationToGL, factorToGL;\n\n/**\n * A WebGL 2 backend utility module for managing the WebGL state.\n *\n * The major goal of this module is to reduce the number of state changes\n * by caching the WEbGL state with a series of variables. In this way, the\n * renderer only executes state change commands when necessary which\n * improves the overall performance.\n *\n * @private\n */\nclass WebGLState {\n\n\t/**\n\t * Constructs a new utility object.\n\t *\n\t * @param {WebGLBackend} backend - The WebGL 2 backend.\n\t */\n\tconstructor( backend ) {\n\n\t\t/**\n\t\t * A reference to the WebGL 2 backend.\n\t\t *\n\t\t * @type {WebGLBackend}\n\t\t */\n\t\tthis.backend = backend;\n\n\t\t/**\n\t\t * A reference to the rendering context.\n\t\t *\n\t\t * @type {WebGL2RenderingContext}\n\t\t */\n\t\tthis.gl = this.backend.gl;\n\n\t\t// Below properties are intended to cache\n\t\t// the WebGL state and are not explicitly\n\t\t// documented for convenience reasons.\n\n\t\tthis.enabled = {};\n\t\tthis.currentFlipSided = null;\n\t\tthis.currentCullFace = null;\n\t\tthis.currentProgram = null;\n\t\tthis.currentBlendingEnabled = false;\n\t\tthis.currentBlending = null;\n\t\tthis.currentBlendSrc = null;\n\t\tthis.currentBlendDst = null;\n\t\tthis.currentBlendSrcAlpha = null;\n\t\tthis.currentBlendDstAlpha = null;\n\t\tthis.currentPremultipledAlpha = null;\n\t\tthis.currentPolygonOffsetFactor = null;\n\t\tthis.currentPolygonOffsetUnits = null;\n\t\tthis.currentColorMask = null;\n\t\tthis.currentDepthFunc = null;\n\t\tthis.currentDepthMask = null;\n\t\tthis.currentStencilFunc = null;\n\t\tthis.currentStencilRef = null;\n\t\tthis.currentStencilFuncMask = null;\n\t\tthis.currentStencilFail = null;\n\t\tthis.currentStencilZFail = null;\n\t\tthis.currentStencilZPass = null;\n\t\tthis.currentStencilMask = null;\n\t\tthis.currentLineWidth = null;\n\t\tthis.currentClippingPlanes = 0;\n\n\t\tthis.currentVAO = null;\n\t\tthis.currentIndex = null;\n\n\t\tthis.currentBoundFramebuffers = {};\n\t\tthis.currentDrawbuffers = new WeakMap();\n\n\t\tthis.maxTextures = this.gl.getParameter( this.gl.MAX_TEXTURE_IMAGE_UNITS );\n\t\tthis.currentTextureSlot = null;\n\t\tthis.currentBoundTextures = {};\n\t\tthis.currentBoundBufferBases = {};\n\n\t\tthis._init();\n\n\t}\n\n\t/**\n\t * Inits the state of the utility.\n\t *\n\t * @private\n\t */\n\t_init() {\n\n\t\tconst gl = this.gl;\n\n\t\t// Store only WebGL constants here.\n\n\t\tequationToGL = {\n\t\t\t[ AddEquation ]: gl.FUNC_ADD,\n\t\t\t[ SubtractEquation ]: gl.FUNC_SUBTRACT,\n\t\t\t[ ReverseSubtractEquation ]: gl.FUNC_REVERSE_SUBTRACT\n\t\t};\n\n\t\tfactorToGL = {\n\t\t\t[ ZeroFactor ]: gl.ZERO,\n\t\t\t[ OneFactor ]: gl.ONE,\n\t\t\t[ SrcColorFactor ]: gl.SRC_COLOR,\n\t\t\t[ SrcAlphaFactor ]: gl.SRC_ALPHA,\n\t\t\t[ SrcAlphaSaturateFactor ]: gl.SRC_ALPHA_SATURATE,\n\t\t\t[ DstColorFactor ]: gl.DST_COLOR,\n\t\t\t[ DstAlphaFactor ]: gl.DST_ALPHA,\n\t\t\t[ OneMinusSrcColorFactor ]: gl.ONE_MINUS_SRC_COLOR,\n\t\t\t[ OneMinusSrcAlphaFactor ]: gl.ONE_MINUS_SRC_ALPHA,\n\t\t\t[ OneMinusDstColorFactor ]: gl.ONE_MINUS_DST_COLOR,\n\t\t\t[ OneMinusDstAlphaFactor ]: gl.ONE_MINUS_DST_ALPHA\n\t\t};\n\n\t\tconst scissorParam = gl.getParameter( gl.SCISSOR_BOX );\n\t\tconst viewportParam = gl.getParameter( gl.VIEWPORT );\n\n\t\tthis.currentScissor = new Vector4().fromArray( scissorParam );\n\t\tthis.currentViewport = new Vector4().fromArray( viewportParam );\n\n\t\tthis._tempVec4 = new Vector4();\n\n\t}\n\n\t/**\n\t * Enables the given WebGL capability.\n\t *\n\t * This method caches the capability state so\n\t * `gl.enable()` is only called when necessary.\n\t *\n\t * @param {GLenum} id - The capability to enable.\n\t */\n\tenable( id ) {\n\n\t\tconst { enabled } = this;\n\n\t\tif ( enabled[ id ] !== true ) {\n\n\t\t\tthis.gl.enable( id );\n\t\t\tenabled[ id ] = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Disables the given WebGL capability.\n\t *\n\t * This method caches the capability state so\n\t * `gl.disable()` is only called when necessary.\n\t *\n\t * @param {GLenum} id - The capability to enable.\n\t */\n\tdisable( id ) {\n\n\t\tconst { enabled } = this;\n\n\t\tif ( enabled[ id ] !== false ) {\n\n\t\t\tthis.gl.disable( id );\n\t\t\tenabled[ id ] = false;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Specifies whether polygons are front- or back-facing\n\t * by setting the winding orientation.\n\t *\n\t * This method caches the state so `gl.frontFace()` is only\n\t * called when necessary.\n\t *\n\t * @param {boolean} flipSided - Whether triangles flipped their sides or not.\n\t */\n\tsetFlipSided( flipSided ) {\n\n\t\tif ( this.currentFlipSided !== flipSided ) {\n\n\t\t\tconst { gl } = this;\n\n\t\t\tif ( flipSided ) {\n\n\t\t\t\tgl.frontFace( gl.CW );\n\n\t\t\t} else {\n\n\t\t\t\tgl.frontFace( gl.CCW );\n\n\t\t\t}\n\n\t\t\tthis.currentFlipSided = flipSided;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Specifies whether or not front- and/or back-facing\n\t * polygons can be culled.\n\t *\n\t * This method caches the state so `gl.cullFace()` is only\n\t * called when necessary.\n\t *\n\t * @param {number} cullFace - Defines which polygons are candidates for culling.\n\t */\n\tsetCullFace( cullFace ) {\n\n\t\tconst { gl } = this;\n\n\t\tif ( cullFace !== CullFaceNone ) {\n\n\t\t\tthis.enable( gl.CULL_FACE );\n\n\t\t\tif ( cullFace !== this.currentCullFace ) {\n\n\t\t\t\tif ( cullFace === CullFaceBack ) {\n\n\t\t\t\t\tgl.cullFace( gl.BACK );\n\n\t\t\t\t} else if ( cullFace === CullFaceFront ) {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.cullFace( gl.FRONT_AND_BACK );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.disable( gl.CULL_FACE );\n\n\t\t}\n\n\t\tthis.currentCullFace = cullFace;\n\n\t}\n\n\t/**\n\t * Specifies the width of line primitives.\n\t *\n\t * This method caches the state so `gl.lineWidth()` is only\n\t * called when necessary.\n\t *\n\t * @param {number} width - The line width.\n\t */\n\tsetLineWidth( width ) {\n\n\t\tconst { currentLineWidth, gl } = this;\n\n\t\tif ( width !== currentLineWidth ) {\n\n\t\t\tgl.lineWidth( width );\n\n\t\t\tthis.currentLineWidth = width;\n\n\t\t}\n\n\t}\n\n\tsetMRTBlending( textures ) {\n\n\t\tconst gl = this.gl;\n\t\tconst drawBuffersIndexedExt = this.backend.drawBuffersIndexedExt;\n\n\t\tif ( ! drawBuffersIndexedExt ) return;\n\n\t\tfor ( let i = 1; i < textures.length; i ++ ) {\n\n\t\t\t// use opaque blending for additional render targets\n\t\t\tdrawBuffersIndexedExt.blendFuncSeparateiOES( i, gl.ONE, gl.ZERO, gl.ONE, gl.ZERO );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Defines the blending.\n\t *\n\t * This method caches the state so `gl.blendEquation()`, `gl.blendEquationSeparate()`,\n\t * `gl.blendFunc()` and  `gl.blendFuncSeparate()` are only called when necessary.\n\t *\n\t * @param {number} blending - The blending type.\n\t * @param {number} blendEquation - The blending equation.\n\t * @param {number} blendSrc - Only relevant for custom blending. The RGB source blending factor.\n\t * @param {number} blendDst - Only relevant for custom blending. The RGB destination blending factor.\n\t * @param {number} blendEquationAlpha - Only relevant for custom blending. The blending equation for alpha.\n\t * @param {number} blendSrcAlpha - Only relevant for custom blending. The alpha source blending factor.\n\t * @param {number} blendDstAlpha - Only relevant for custom blending. The alpha destination blending factor.\n\t * @param {boolean} premultipliedAlpha - Whether premultiplied alpha is enabled or not.\n\t */\n\tsetBlending( blending, blendEquation, blendSrc, blendDst, blendEquationAlpha, blendSrcAlpha, blendDstAlpha, premultipliedAlpha ) {\n\n\t\tconst { gl } = this;\n\n\t\tif ( blending === NoBlending ) {\n\n\t\t\tif ( this.currentBlendingEnabled === true ) {\n\n\t\t\t\tthis.disable( gl.BLEND );\n\t\t\t\tthis.currentBlendingEnabled = false;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( this.currentBlendingEnabled === false ) {\n\n\t\t\tthis.enable( gl.BLEND );\n\t\t\tthis.currentBlendingEnabled = true;\n\n\t\t}\n\n\t\tif ( blending !== CustomBlending ) {\n\n\t\t\tif ( blending !== this.currentBlending || premultipliedAlpha !== this.currentPremultipledAlpha ) {\n\n\t\t\t\tif ( this.currentBlendEquation !== AddEquation || this.currentBlendEquationAlpha !== AddEquation ) {\n\n\t\t\t\t\tgl.blendEquation( gl.FUNC_ADD );\n\n\t\t\t\t\tthis.currentBlendEquation = AddEquation;\n\t\t\t\t\tthis.currentBlendEquationAlpha = AddEquation;\n\n\t\t\t\t}\n\n\t\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ONE, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFunc( gl.ONE, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.ZERO, gl.ONE_MINUS_SRC_COLOR, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.DST_COLOR, gl.ONE_MINUS_SRC_ALPHA, gl.ZERO, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\terror( 'WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\t\tgl.blendFuncSeparate( gl.SRC_ALPHA, gl.ONE, gl.ONE, gl.ONE );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\t\terror( 'WebGLState: SubtractiveBlending requires material.premultipliedAlpha = true' );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\t\terror( 'WebGLState: MultiplyBlending requires material.premultipliedAlpha = true' );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\terror( 'WebGLState: Invalid blending: ', blending );\n\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tthis.currentBlendSrc = null;\n\t\t\t\tthis.currentBlendDst = null;\n\t\t\t\tthis.currentBlendSrcAlpha = null;\n\t\t\t\tthis.currentBlendDstAlpha = null;\n\n\t\t\t\tthis.currentBlending = blending;\n\t\t\t\tthis.currentPremultipledAlpha = premultipliedAlpha;\n\n\t\t\t}\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// custom blending\n\n\t\tblendEquationAlpha = blendEquationAlpha || blendEquation;\n\t\tblendSrcAlpha = blendSrcAlpha || blendSrc;\n\t\tblendDstAlpha = blendDstAlpha || blendDst;\n\n\t\tif ( blendEquation !== this.currentBlendEquation || blendEquationAlpha !== this.currentBlendEquationAlpha ) {\n\n\t\t\tgl.blendEquationSeparate( equationToGL[ blendEquation ], equationToGL[ blendEquationAlpha ] );\n\n\t\t\tthis.currentBlendEquation = blendEquation;\n\t\t\tthis.currentBlendEquationAlpha = blendEquationAlpha;\n\n\t\t}\n\n\t\tif ( blendSrc !== this.currentBlendSrc || blendDst !== this.currentBlendDst || blendSrcAlpha !== this.currentBlendSrcAlpha || blendDstAlpha !== this.currentBlendDstAlpha ) {\n\n\t\t\tgl.blendFuncSeparate( factorToGL[ blendSrc ], factorToGL[ blendDst ], factorToGL[ blendSrcAlpha ], factorToGL[ blendDstAlpha ] );\n\n\t\t\tthis.currentBlendSrc = blendSrc;\n\t\t\tthis.currentBlendDst = blendDst;\n\t\t\tthis.currentBlendSrcAlpha = blendSrcAlpha;\n\t\t\tthis.currentBlendDstAlpha = blendDstAlpha;\n\n\t\t}\n\n\t\tthis.currentBlending = blending;\n\t\tthis.currentPremultipledAlpha = false;\n\n\t}\n\n\t/**\n\t * Specifies whether colors can be written when rendering\n\t * into a framebuffer or not.\n\t *\n\t * This method caches the state so `gl.colorMask()` is only\n\t * called when necessary.\n\t *\n\t * @param {boolean} colorMask - The color mask.\n\t */\n\tsetColorMask( colorMask ) {\n\n\t\tif ( this.currentColorMask !== colorMask ) {\n\n\t\t\tthis.gl.colorMask( colorMask, colorMask, colorMask, colorMask );\n\t\t\tthis.currentColorMask = colorMask;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Specifies whether the depth test is enabled or not.\n\t *\n\t * @param {boolean} depthTest - Whether the depth test is enabled or not.\n\t */\n\tsetDepthTest( depthTest ) {\n\n\t\tconst { gl } = this;\n\n\t\tif ( depthTest ) {\n\n\t\t\tthis.enable( gl.DEPTH_TEST );\n\n\t\t} else {\n\n\t\t\tthis.disable( gl.DEPTH_TEST );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Specifies whether depth values can be written when rendering\n\t * into a framebuffer or not.\n\t *\n\t * This method caches the state so `gl.depthMask()` is only\n\t * called when necessary.\n\t *\n\t * @param {boolean} depthMask - The depth mask.\n\t */\n\tsetDepthMask( depthMask ) {\n\n\t\tif ( this.currentDepthMask !== depthMask ) {\n\n\t\t\tthis.gl.depthMask( depthMask );\n\t\t\tthis.currentDepthMask = depthMask;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Specifies the depth compare function.\n\t *\n\t * This method caches the state so `gl.depthFunc()` is only\n\t * called when necessary.\n\t *\n\t * @param {number} depthFunc - The depth compare function.\n\t */\n\tsetDepthFunc( depthFunc ) {\n\n\t\tif ( this.currentDepthFunc !== depthFunc ) {\n\n\t\t\tconst { gl } = this;\n\n\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\tcase NeverDepth:\n\n\t\t\t\t\tgl.depthFunc( gl.NEVER );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase AlwaysDepth:\n\n\t\t\t\t\tgl.depthFunc( gl.ALWAYS );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase LessDepth:\n\n\t\t\t\t\tgl.depthFunc( gl.LESS );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase LessEqualDepth:\n\n\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase EqualDepth:\n\n\t\t\t\t\tgl.depthFunc( gl.EQUAL );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GreaterEqualDepth:\n\n\t\t\t\t\tgl.depthFunc( gl.GEQUAL );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GreaterDepth:\n\n\t\t\t\t\tgl.depthFunc( gl.GREATER );\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase NotEqualDepth:\n\n\t\t\t\t\tgl.depthFunc( gl.NOTEQUAL );\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\n\t\t\t\t\tgl.depthFunc( gl.LEQUAL );\n\n\t\t\t}\n\n\t\t\tthis.currentDepthFunc = depthFunc;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Specifies the scissor box.\n\t *\n\t * @param {number} x - The x-coordinate of the lower left corner of the viewport.\n\t * @param {number} y - The y-coordinate of the lower left corner of the viewport.\n\t * @param {number} width - The width of the viewport.\n\t * @param {number} height - The height of the viewport.\n\t *\n\t */\n\tscissor( x, y, width, height ) {\n\n\t\tconst scissor = this._tempVec4.set( x, y, width, height );\n\n\t\tif ( this.currentScissor.equals( scissor ) === false ) {\n\n\t\t\tconst { gl } = this;\n\n\t\t\tgl.scissor( scissor.x, scissor.y, scissor.z, scissor.w );\n\t\t\tthis.currentScissor.copy( scissor );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Specifies the viewport.\n\t *\n\t * @param {number} x - The x-coordinate of the lower left corner of the viewport.\n\t * @param {number} y - The y-coordinate of the lower left corner of the viewport.\n\t * @param {number} width - The width of the viewport.\n\t * @param {number} height - The height of the viewport.\n\t *\n\t */\n\tviewport( x, y, width, height ) {\n\n\t\tconst viewport = this._tempVec4.set( x, y, width, height );\n\n\t\tif ( this.currentViewport.equals( viewport ) === false ) {\n\n\t\t\tconst { gl } = this;\n\n\t\t\tgl.viewport( viewport.x, viewport.y, viewport.z, viewport.w );\n\t\t\tthis.currentViewport.copy( viewport );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Defines the scissor test.\n\t *\n\t * @param {boolean} boolean - Whether the scissor test should be enabled or not.\n\t */\n\tsetScissorTest( boolean ) {\n\n\t\tconst gl = this.gl;\n\n\t\tif ( boolean ) {\n\n\t\t\tthis.enable( gl.SCISSOR_TEST );\n\n\t\t} else {\n\n\t\t\tthis.disable( gl.SCISSOR_TEST );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Specifies whether the stencil test is enabled or not.\n\t *\n\t * @param {boolean} stencilTest - Whether the stencil test is enabled or not.\n\t */\n\tsetStencilTest( stencilTest ) {\n\n\t\tconst { gl } = this;\n\n\t\tif ( stencilTest ) {\n\n\t\t\tthis.enable( gl.STENCIL_TEST );\n\n\t\t} else {\n\n\t\t\tthis.disable( gl.STENCIL_TEST );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Specifies whether stencil values can be written when rendering\n\t * into a framebuffer or not.\n\t *\n\t * This method caches the state so `gl.stencilMask()` is only\n\t * called when necessary.\n\t *\n\t * @param {boolean} stencilMask - The stencil mask.\n\t */\n\tsetStencilMask( stencilMask ) {\n\n\t\tif ( this.currentStencilMask !== stencilMask ) {\n\n\t\t\tthis.gl.stencilMask( stencilMask );\n\t\t\tthis.currentStencilMask = stencilMask;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Specifies whether the stencil test functions.\n\t *\n\t * This method caches the state so `gl.stencilFunc()` is only\n\t * called when necessary.\n\t *\n\t * @param {number} stencilFunc - The stencil compare function.\n\t * @param {number} stencilRef - The reference value for the stencil test.\n\t * @param {number} stencilMask - A bit-wise mask that is used to AND the reference value and the stored stencil value when the test is done.\n\t */\n\tsetStencilFunc( stencilFunc, stencilRef, stencilMask ) {\n\n\t\tif ( this.currentStencilFunc !== stencilFunc ||\n\t\t\t this.currentStencilRef !== stencilRef ||\n\t\t\t this.currentStencilFuncMask !== stencilMask ) {\n\n\t\t\tthis.gl.stencilFunc( stencilFunc, stencilRef, stencilMask );\n\n\t\t\tthis.currentStencilFunc = stencilFunc;\n\t\t\tthis.currentStencilRef = stencilRef;\n\t\t\tthis.currentStencilFuncMask = stencilMask;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Specifies whether the stencil test operation.\n\t *\n\t * This method caches the state so `gl.stencilOp()` is only\n\t * called when necessary.\n\t *\n\t * @param {number} stencilFail - The function to use when the stencil test fails.\n\t * @param {number} stencilZFail - The function to use when the stencil test passes, but the depth test fail.\n\t * @param {number} stencilZPass - The function to use when both the stencil test and the depth test pass,\n\t * or when the stencil test passes and there is no depth buffer or depth testing is disabled.\n\t */\n\tsetStencilOp( stencilFail, stencilZFail, stencilZPass ) {\n\n\t\tif ( this.currentStencilFail !== stencilFail ||\n\t\t\t this.currentStencilZFail !== stencilZFail ||\n\t\t\t this.currentStencilZPass !== stencilZPass ) {\n\n\t\t\tthis.gl.stencilOp( stencilFail, stencilZFail, stencilZPass );\n\n\t\t\tthis.currentStencilFail = stencilFail;\n\t\t\tthis.currentStencilZFail = stencilZFail;\n\t\t\tthis.currentStencilZPass = stencilZPass;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Configures the WebGL state for the given material.\n\t *\n\t * @param {Material} material - The material to configure the state for.\n\t * @param {number} frontFaceCW - Whether the front faces are counter-clockwise or not.\n\t * @param {number} hardwareClippingPlanes - The number of hardware clipping planes.\n\t */\n\tsetMaterial( material, frontFaceCW, hardwareClippingPlanes ) {\n\n\t\tconst { gl } = this;\n\n\t\tmaterial.side === DoubleSide\n\t\t\t? this.disable( gl.CULL_FACE )\n\t\t\t: this.enable( gl.CULL_FACE );\n\n\t\tlet flipSided = ( material.side === BackSide );\n\t\tif ( frontFaceCW ) flipSided = ! flipSided;\n\n\t\tthis.setFlipSided( flipSided );\n\n\t\t( material.blending === NormalBlending && material.transparent === false )\n\t\t\t? this.setBlending( NoBlending )\n\t\t\t: this.setBlending( material.blending, material.blendEquation, material.blendSrc, material.blendDst, material.blendEquationAlpha, material.blendSrcAlpha, material.blendDstAlpha, material.premultipliedAlpha );\n\n\t\tthis.setDepthFunc( material.depthFunc );\n\t\tthis.setDepthTest( material.depthTest );\n\t\tthis.setDepthMask( material.depthWrite );\n\t\tthis.setColorMask( material.colorWrite );\n\n\t\tconst stencilWrite = material.stencilWrite;\n\t\tthis.setStencilTest( stencilWrite );\n\t\tif ( stencilWrite ) {\n\n\t\t\tthis.setStencilMask( material.stencilWriteMask );\n\t\t\tthis.setStencilFunc( material.stencilFunc, material.stencilRef, material.stencilFuncMask );\n\t\t\tthis.setStencilOp( material.stencilFail, material.stencilZFail, material.stencilZPass );\n\n\t\t}\n\n\t\tthis.setPolygonOffset( material.polygonOffset, material.polygonOffsetFactor, material.polygonOffsetUnits );\n\n\t\tmaterial.alphaToCoverage === true && this.backend.renderer.currentSamples > 0\n\t\t\t? this.enable( gl.SAMPLE_ALPHA_TO_COVERAGE )\n\t\t\t: this.disable( gl.SAMPLE_ALPHA_TO_COVERAGE );\n\n\t\tif ( hardwareClippingPlanes > 0 ) {\n\n\t\t\tif ( this.currentClippingPlanes !== hardwareClippingPlanes ) {\n\n\t\t\t\tconst CLIP_DISTANCE0_WEBGL = 0x3000;\n\n\t\t\t\tfor ( let i = 0; i < 8; i ++ ) {\n\n\t\t\t\t\tif ( i < hardwareClippingPlanes ) {\n\n\t\t\t\t\t\tthis.enable( CLIP_DISTANCE0_WEBGL + i );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tthis.disable( CLIP_DISTANCE0_WEBGL + i );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Specifies the polygon offset.\n\t *\n\t * This method caches the state so `gl.polygonOffset()` is only\n\t * called when necessary.\n\t *\n\t * @param {boolean} polygonOffset - Whether polygon offset is enabled or not.\n\t * @param {number} factor - The scale factor for the variable depth offset for each polygon.\n\t * @param {number} units - The multiplier by which an implementation-specific value is multiplied with to create a constant depth offset.\n\t */\n\tsetPolygonOffset( polygonOffset, factor, units ) {\n\n\t\tconst { gl } = this;\n\n\t\tif ( polygonOffset ) {\n\n\t\t\tthis.enable( gl.POLYGON_OFFSET_FILL );\n\n\t\t\tif ( this.currentPolygonOffsetFactor !== factor || this.currentPolygonOffsetUnits !== units ) {\n\n\t\t\t\tgl.polygonOffset( factor, units );\n\n\t\t\t\tthis.currentPolygonOffsetFactor = factor;\n\t\t\t\tthis.currentPolygonOffsetUnits = units;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.disable( gl.POLYGON_OFFSET_FILL );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Defines the usage of the given WebGL program.\n\t *\n\t * This method caches the state so `gl.useProgram()` is only\n\t * called when necessary.\n\t *\n\t * @param {WebGLProgram} program - The WebGL program to use.\n\t * @return {boolean} Whether a program change has been executed or not.\n\t */\n\tuseProgram( program ) {\n\n\t\tif ( this.currentProgram !== program ) {\n\n\t\t\tthis.gl.useProgram( program );\n\n\t\t\tthis.currentProgram = program;\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Sets the vertex state by binding the given VAO and element buffer.\n\t *\n\t * @param {WebGLVertexArrayObject} vao - The VAO.\n\t * @param {?WebGLBuffer} indexBuffer - The index buffer.\n\t * @return {boolean} Whether a vertex state has been changed or not.\n\t */\n\tsetVertexState( vao, indexBuffer = null ) {\n\n\t\tconst gl = this.gl;\n\n\t\tif ( this.currentVAO !== vao || this.currentIndex !== indexBuffer ) {\n\n\t\t\tgl.bindVertexArray( vao );\n\n\t\t\tif ( indexBuffer !== null ) {\n\n\t\t\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, indexBuffer );\n\n\t\t\t}\n\n\t\t\tthis.currentVAO = vao;\n\t\t\tthis.currentIndex = indexBuffer;\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Resets the vertex array state by resetting the VAO and element buffer.\n\t */\n\tresetVertexState() {\n\n\t\tconst gl = this.gl;\n\n\t\tgl.bindVertexArray( null );\n\t\tgl.bindBuffer( gl.ELEMENT_ARRAY_BUFFER, null );\n\n\t\tthis.currentVAO = null;\n\t\tthis.currentIndex = null;\n\n\t}\n\n\t// framebuffer\n\n\n\t/**\n\t * Binds the given framebuffer.\n\t *\n\t * This method caches the state so `gl.bindFramebuffer()` is only\n\t * called when necessary.\n\t *\n\t * @param {number} target - The binding point (target).\n\t * @param {WebGLFramebuffer} framebuffer - The WebGL framebuffer to bind.\n\t * @return {boolean} Whether a bind has been executed or not.\n\t */\n\tbindFramebuffer( target, framebuffer ) {\n\n\t\tconst { gl, currentBoundFramebuffers } = this;\n\n\t\tif ( currentBoundFramebuffers[ target ] !== framebuffer ) {\n\n\t\t\tgl.bindFramebuffer( target, framebuffer );\n\n\t\t\tcurrentBoundFramebuffers[ target ] = framebuffer;\n\n\t\t\t// gl.DRAW_FRAMEBUFFER is equivalent to gl.FRAMEBUFFER\n\n\t\t\tif ( target === gl.DRAW_FRAMEBUFFER ) {\n\n\t\t\t\tcurrentBoundFramebuffers[ gl.FRAMEBUFFER ] = framebuffer;\n\n\t\t\t}\n\n\t\t\tif ( target === gl.FRAMEBUFFER ) {\n\n\t\t\t\tcurrentBoundFramebuffers[ gl.DRAW_FRAMEBUFFER ] = framebuffer;\n\n\t\t\t}\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Defines draw buffers to which fragment colors are written into.\n\t * Configures the MRT setup of custom framebuffers.\n\t *\n\t * This method caches the state so `gl.drawBuffers()` is only\n\t * called when necessary.\n\t *\n\t * @param {RenderContext} renderContext - The render context.\n\t * @param {WebGLFramebuffer} framebuffer - The WebGL framebuffer.\n\t */\n\tdrawBuffers( renderContext, framebuffer ) {\n\n\t\tconst { gl } = this;\n\n\t\tlet drawBuffers = [];\n\n\t\tlet needsUpdate = false;\n\n\t\tif ( renderContext.textures !== null ) {\n\n\t\t\tdrawBuffers = this.currentDrawbuffers.get( framebuffer );\n\n\t\t\tif ( drawBuffers === undefined ) {\n\n\t\t\t\tdrawBuffers = [];\n\t\t\t\tthis.currentDrawbuffers.set( framebuffer, drawBuffers );\n\n\t\t\t}\n\n\n\t\t\tconst textures = renderContext.textures;\n\n\t\t\tif ( drawBuffers.length !== textures.length || drawBuffers[ 0 ] !== gl.COLOR_ATTACHMENT0 ) {\n\n\t\t\t\tfor ( let i = 0, il = textures.length; i < il; i ++ ) {\n\n\t\t\t\t\tdrawBuffers[ i ] = gl.COLOR_ATTACHMENT0 + i;\n\n\t\t\t\t}\n\n\t\t\t\tdrawBuffers.length = textures.length;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\n\t\t} else {\n\n\t\t\tif ( drawBuffers[ 0 ] !== gl.BACK ) {\n\n\t\t\t\tdrawBuffers[ 0 ] = gl.BACK;\n\n\t\t\t\tneedsUpdate = true;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( needsUpdate ) {\n\n\t\t\tgl.drawBuffers( drawBuffers );\n\n\t\t}\n\n\t}\n\n\n\t// texture\n\n\t/**\n\t * Makes the given texture unit active.\n\t *\n\t * This method caches the state so `gl.activeTexture()` is only\n\t * called when necessary.\n\t *\n\t * @param {number} webglSlot - The texture unit to make active.\n\t */\n\tactiveTexture( webglSlot ) {\n\n\t\tconst { gl, currentTextureSlot, maxTextures } = this;\n\n\t\tif ( webglSlot === undefined ) webglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\tgl.activeTexture( webglSlot );\n\t\t\tthis.currentTextureSlot = webglSlot;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Binds the given WebGL texture to a target.\n\t *\n\t * This method caches the state so `gl.bindTexture()` is only\n\t * called when necessary.\n\t *\n\t * @param {number} webglType - The binding point (target).\n\t * @param {WebGLTexture} webglTexture - The WebGL texture to bind.\n\t * @param {number} webglSlot - The texture.\n\t */\n\tbindTexture( webglType, webglTexture, webglSlot ) {\n\n\t\tconst { gl, currentTextureSlot, currentBoundTextures, maxTextures } = this;\n\n\t\tif ( webglSlot === undefined ) {\n\n\t\t\tif ( currentTextureSlot === null ) {\n\n\t\t\t\twebglSlot = gl.TEXTURE0 + maxTextures - 1;\n\n\t\t\t} else {\n\n\t\t\t\twebglSlot = currentTextureSlot;\n\n\t\t\t}\n\n\t\t}\n\n\t\tlet boundTexture = currentBoundTextures[ webglSlot ];\n\n\t\tif ( boundTexture === undefined ) {\n\n\t\t\tboundTexture = { type: undefined, texture: undefined };\n\t\t\tcurrentBoundTextures[ webglSlot ] = boundTexture;\n\n\t\t}\n\n\t\tif ( boundTexture.type !== webglType || boundTexture.texture !== webglTexture ) {\n\n\t\t\tif ( currentTextureSlot !== webglSlot ) {\n\n\t\t\t\tgl.activeTexture( webglSlot );\n\t\t\t\tthis.currentTextureSlot = webglSlot;\n\n\t\t\t}\n\n\t\t\tgl.bindTexture( webglType, webglTexture );\n\n\t\t\tboundTexture.type = webglType;\n\t\t\tboundTexture.texture = webglTexture;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Binds a given WebGL buffer to a given binding point (target) at a given index.\n\t *\n\t * This method caches the state so `gl.bindBufferBase()` is only\n\t * called when necessary.\n\t *\n\t * @param {number} target - The target for the bind operation.\n\t * @param {number} index - The index of the target.\n\t * @param {WebGLBuffer} buffer - The WebGL buffer.\n\t * @return {boolean} Whether a bind has been executed or not.\n\t */\n\tbindBufferBase( target, index, buffer ) {\n\n\t\tconst { gl } = this;\n\n\t\tconst key = `${target}-${index}`;\n\n\t\tif ( this.currentBoundBufferBases[ key ] !== buffer ) {\n\n\t\t\tgl.bindBufferBase( target, index, buffer );\n\t\t\tthis.currentBoundBufferBases[ key ] = buffer;\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\n\t/**\n\t * Unbinds the current bound texture.\n\t *\n\t * This method caches the state so `gl.bindTexture()` is only\n\t * called when necessary.\n\t */\n\tunbindTexture() {\n\n\t\tconst { gl, currentTextureSlot, currentBoundTextures } = this;\n\n\t\tconst boundTexture = currentBoundTextures[ currentTextureSlot ];\n\n\t\tif ( boundTexture !== undefined && boundTexture.type !== undefined ) {\n\n\t\t\tgl.bindTexture( boundTexture.type, null );\n\n\t\t\tboundTexture.type = undefined;\n\t\t\tboundTexture.texture = undefined;\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * A WebGL 2 backend utility module with common helpers.\n *\n * @private\n */\nclass WebGLUtils {\n\n\t/**\n\t * Constructs a new utility object.\n\t *\n\t * @param {WebGLBackend} backend - The WebGL 2 backend.\n\t */\n\tconstructor( backend ) {\n\n\t\t/**\n\t\t * A reference to the WebGL 2 backend.\n\t\t *\n\t\t * @type {WebGLBackend}\n\t\t */\n\t\tthis.backend = backend;\n\n\t\t/**\n\t\t * A reference to the rendering context.\n\t\t *\n\t\t * @type {WebGL2RenderingContext}\n\t\t */\n\t\tthis.gl = this.backend.gl;\n\n\t\t/**\n\t\t * A reference to a backend module holding extension-related\n\t\t * utility functions.\n\t\t *\n\t\t * @type {WebGLExtensions}\n\t\t */\n\t\tthis.extensions = backend.extensions;\n\n\t}\n\n\t/**\n\t * Converts the given three.js constant into a WebGL constant.\n\t * The method currently supports the conversion of texture formats\n\t * and types.\n\t *\n\t * @param {number} p - The three.js constant.\n\t * @param {string} [colorSpace=NoColorSpace] - The color space.\n\t * @return {?number} The corresponding WebGL constant.\n\t */\n\tconvert( p, colorSpace = NoColorSpace ) {\n\n\t\tconst { gl, extensions } = this;\n\n\t\tlet extension;\n\n\t\tconst transfer = ColorManagement.getTransfer( colorSpace );\n\n\t\tif ( p === UnsignedByteType ) return gl.UNSIGNED_BYTE;\n\t\tif ( p === UnsignedShort4444Type ) return gl.UNSIGNED_SHORT_4_4_4_4;\n\t\tif ( p === UnsignedShort5551Type ) return gl.UNSIGNED_SHORT_5_5_5_1;\n\t\tif ( p === UnsignedInt5999Type ) return gl.UNSIGNED_INT_5_9_9_9_REV;\n\t\tif ( p === UnsignedInt101111Type ) return gl.UNSIGNED_INT_10F_11F_11F_REV;\n\n\t\tif ( p === ByteType ) return gl.BYTE;\n\t\tif ( p === ShortType ) return gl.SHORT;\n\t\tif ( p === UnsignedShortType ) return gl.UNSIGNED_SHORT;\n\t\tif ( p === IntType ) return gl.INT;\n\t\tif ( p === UnsignedIntType ) return gl.UNSIGNED_INT;\n\t\tif ( p === FloatType ) return gl.FLOAT;\n\n\t\tif ( p === HalfFloatType ) {\n\n\t\t\treturn gl.HALF_FLOAT;\n\n\t\t}\n\n\t\tif ( p === AlphaFormat ) return gl.ALPHA;\n\t\tif ( p === RGBFormat ) return gl.RGB;\n\t\tif ( p === RGBAFormat ) return gl.RGBA;\n\t\tif ( p === DepthFormat ) return gl.DEPTH_COMPONENT;\n\t\tif ( p === DepthStencilFormat ) return gl.DEPTH_STENCIL;\n\n\t\t// WebGL2 formats.\n\n\t\tif ( p === RedFormat ) return gl.RED;\n\t\tif ( p === RedIntegerFormat ) return gl.RED_INTEGER;\n\t\tif ( p === RGFormat ) return gl.RG;\n\t\tif ( p === RGIntegerFormat ) return gl.RG_INTEGER;\n\t\tif ( p === RGBAIntegerFormat ) return gl.RGBA_INTEGER;\n\n\t\t// S3TC\n\n\t\tif ( p === RGB_S3TC_DXT1_Format || p === RGBA_S3TC_DXT1_Format || p === RGBA_S3TC_DXT3_Format || p === RGBA_S3TC_DXT5_Format ) {\n\n\t\t\tif ( transfer === SRGBTransfer ) {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc_srgb' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\textension = extensions.get( 'WEBGL_compressed_texture_s3tc' );\n\n\t\t\t\tif ( extension !== null ) {\n\n\t\t\t\t\tif ( p === RGB_S3TC_DXT1_Format ) return extension.COMPRESSED_RGB_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT1_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT1_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT3_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT3_EXT;\n\t\t\t\t\tif ( p === RGBA_S3TC_DXT5_Format ) return extension.COMPRESSED_RGBA_S3TC_DXT5_EXT;\n\n\t\t\t\t} else {\n\n\t\t\t\t\treturn null;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// PVRTC\n\n\t\tif ( p === RGB_PVRTC_4BPPV1_Format || p === RGB_PVRTC_2BPPV1_Format || p === RGBA_PVRTC_4BPPV1_Format || p === RGBA_PVRTC_2BPPV1_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_pvrtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGB_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGB_PVRTC_2BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_4BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG;\n\t\t\t\tif ( p === RGBA_PVRTC_2BPPV1_Format ) return extension.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ETC\n\n\t\tif ( p === RGB_ETC1_Format || p === RGB_ETC2_Format || p === RGBA_ETC2_EAC_Format || p === R11_EAC_Format || p === SIGNED_R11_EAC_Format || p === RG11_EAC_Format || p === SIGNED_RG11_EAC_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_etc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGB_ETC1_Format || p === RGB_ETC2_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ETC2 : extension.COMPRESSED_RGB8_ETC2;\n\t\t\t\tif ( p === RGBA_ETC2_EAC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ETC2_EAC : extension.COMPRESSED_RGBA8_ETC2_EAC;\n\t\t\t\tif ( p === R11_EAC_Format ) return extension.COMPRESSED_R11_EAC;\n\t\t\t\tif ( p === SIGNED_R11_EAC_Format ) return extension.COMPRESSED_SIGNED_R11_EAC;\n\t\t\t\tif ( p === RG11_EAC_Format ) return extension.COMPRESSED_RG11_EAC;\n\t\t\t\tif ( p === SIGNED_RG11_EAC_Format ) return extension.COMPRESSED_SIGNED_RG11_EAC;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// ASTC\n\n\t\tif ( p === RGBA_ASTC_4x4_Format || p === RGBA_ASTC_5x4_Format || p === RGBA_ASTC_5x5_Format ||\n\t\t\tp === RGBA_ASTC_6x5_Format || p === RGBA_ASTC_6x6_Format || p === RGBA_ASTC_8x5_Format ||\n\t\t\tp === RGBA_ASTC_8x6_Format || p === RGBA_ASTC_8x8_Format || p === RGBA_ASTC_10x5_Format ||\n\t\t\tp === RGBA_ASTC_10x6_Format || p === RGBA_ASTC_10x8_Format || p === RGBA_ASTC_10x10_Format ||\n\t\t\tp === RGBA_ASTC_12x10_Format || p === RGBA_ASTC_12x12_Format ) {\n\n\t\t\textension = extensions.get( 'WEBGL_compressed_texture_astc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_ASTC_4x4_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR : extension.COMPRESSED_RGBA_ASTC_4x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x4_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR : extension.COMPRESSED_RGBA_ASTC_5x4_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_5x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR : extension.COMPRESSED_RGBA_ASTC_5x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR : extension.COMPRESSED_RGBA_ASTC_6x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_6x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR : extension.COMPRESSED_RGBA_ASTC_6x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR : extension.COMPRESSED_RGBA_ASTC_8x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR : extension.COMPRESSED_RGBA_ASTC_8x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_8x8_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR : extension.COMPRESSED_RGBA_ASTC_8x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x5_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR : extension.COMPRESSED_RGBA_ASTC_10x5_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x6_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR : extension.COMPRESSED_RGBA_ASTC_10x6_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x8_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR : extension.COMPRESSED_RGBA_ASTC_10x8_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_10x10_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR : extension.COMPRESSED_RGBA_ASTC_10x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x10_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR : extension.COMPRESSED_RGBA_ASTC_12x10_KHR;\n\t\t\t\tif ( p === RGBA_ASTC_12x12_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR : extension.COMPRESSED_RGBA_ASTC_12x12_KHR;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// BPTC\n\n\t\tif ( p === RGBA_BPTC_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_bptc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RGBA_BPTC_Format ) return ( transfer === SRGBTransfer ) ? extension.COMPRESSED_SRGB_ALPHA_BPTC_UNORM_EXT : extension.COMPRESSED_RGBA_BPTC_UNORM_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t// RGTC\n\n\t\tif ( p === RED_RGTC1_Format || p === SIGNED_RED_RGTC1_Format || p === RED_GREEN_RGTC2_Format || p === SIGNED_RED_GREEN_RGTC2_Format ) {\n\n\t\t\textension = extensions.get( 'EXT_texture_compression_rgtc' );\n\n\t\t\tif ( extension !== null ) {\n\n\t\t\t\tif ( p === RED_RGTC1_Format ) return extension.COMPRESSED_RED_RGTC1_EXT;\n\t\t\t\tif ( p === SIGNED_RED_RGTC1_Format ) return extension.COMPRESSED_SIGNED_RED_RGTC1_EXT;\n\t\t\t\tif ( p === RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_RED_GREEN_RGTC2_EXT;\n\t\t\t\tif ( p === SIGNED_RED_GREEN_RGTC2_Format ) return extension.COMPRESSED_SIGNED_RED_GREEN_RGTC2_EXT;\n\n\t\t\t} else {\n\n\t\t\t\treturn null;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( p === UnsignedInt248Type ) {\n\n\t\t\treturn gl.UNSIGNED_INT_24_8;\n\n\t\t}\n\n\t\t// if \"p\" can't be resolved, assume the user defines a WebGL constant as a string (fallback/workaround for packed RGB formats)\n\n\t\treturn ( gl[ p ] !== undefined ) ? gl[ p ] : null;\n\n\t}\n\n\t/**\n\t * This method can be used to synchronize the CPU with the GPU by waiting until\n\t * ongoing GPU commands have been completed.\n\t *\n\t * @private\n\t * @return {Promise} A promise that resolves when all ongoing GPU commands have been completed.\n\t */\n\t_clientWaitAsync() {\n\n\t\tconst { gl } = this;\n\n\t\tconst sync = gl.fenceSync( gl.SYNC_GPU_COMMANDS_COMPLETE, 0 );\n\n\t\tgl.flush();\n\n\t\treturn new Promise( ( resolve, reject ) => {\n\n\t\t\tfunction test() {\n\n\t\t\t\tconst res = gl.clientWaitSync( sync, gl.SYNC_FLUSH_COMMANDS_BIT, 0 );\n\n\t\t\t\tif ( res === gl.WAIT_FAILED ) {\n\n\t\t\t\t\tgl.deleteSync( sync );\n\n\t\t\t\t\treject();\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tif ( res === gl.TIMEOUT_EXPIRED ) {\n\n\t\t\t\t\trequestAnimationFrame( test );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\tgl.deleteSync( sync );\n\n\t\t\t\tresolve();\n\n\t\t\t}\n\n\t\t\ttest();\n\n\t\t} );\n\n\t}\n\n}\n\nlet initialized = false, wrappingToGL, filterToGL, compareToGL;\n\n/**\n * A WebGL 2 backend utility module for managing textures.\n *\n * @private\n */\nclass WebGLTextureUtils {\n\n\t/**\n\t * Constructs a new utility object.\n\t *\n\t * @param {WebGLBackend} backend - The WebGL 2 backend.\n\t */\n\tconstructor( backend ) {\n\n\t\t/**\n\t\t * A reference to the WebGL 2 backend.\n\t\t *\n\t\t * @type {WebGLBackend}\n\t\t */\n\t\tthis.backend = backend;\n\n\t\t/**\n\t\t * A reference to the rendering context.\n\t\t *\n\t\t * @type {WebGL2RenderingContext}\n\t\t */\n\t\tthis.gl = backend.gl;\n\n\t\t/**\n\t\t * A reference to a backend module holding extension-related\n\t\t * utility functions.\n\t\t *\n\t\t * @type {WebGLExtensions}\n\t\t */\n\t\tthis.extensions = backend.extensions;\n\n\t\t/**\n\t\t * A dictionary for managing default textures. The key\n\t\t * is the binding point (target), the value the WEbGL texture object.\n\t\t *\n\t\t * @type {Object<GLenum,WebGLTexture>}\n\t\t */\n\t\tthis.defaultTextures = {};\n\n\t\t/**\n\t\t * A scratch framebuffer used for attaching the source texture in\n\t\t * {@link copyTextureToTexture}.\n\t\t *\n\t\t * @private\n\t\t * @type {?WebGLFramebuffer}\n\t\t */\n\t\tthis._srcFramebuffer = null;\n\n\t\t/**\n\t\t * A scratch framebuffer used for attaching the destination texture in\n\t\t * {@link copyTextureToTexture}.\n\t\t *\n\t\t * @private\n\t\t * @type {?WebGLFramebuffer}\n\t\t */\n\t\tthis._dstFramebuffer = null;\n\n\t\tif ( initialized === false ) {\n\n\t\t\tthis._init();\n\n\t\t\tinitialized = true;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Inits the state of the utility.\n\t *\n\t * @private\n\t */\n\t_init() {\n\n\t\tconst gl = this.gl;\n\n\t\t// Store only WebGL constants here.\n\n\t\twrappingToGL = {\n\t\t\t[ RepeatWrapping ]: gl.REPEAT,\n\t\t\t[ ClampToEdgeWrapping ]: gl.CLAMP_TO_EDGE,\n\t\t\t[ MirroredRepeatWrapping ]: gl.MIRRORED_REPEAT\n\t\t};\n\n\t\tfilterToGL = {\n\t\t\t[ NearestFilter ]: gl.NEAREST,\n\t\t\t[ NearestMipmapNearestFilter ]: gl.NEAREST_MIPMAP_NEAREST,\n\t\t\t[ NearestMipmapLinearFilter ]: gl.NEAREST_MIPMAP_LINEAR,\n\n\t\t\t[ LinearFilter ]: gl.LINEAR,\n\t\t\t[ LinearMipmapNearestFilter ]: gl.LINEAR_MIPMAP_NEAREST,\n\t\t\t[ LinearMipmapLinearFilter ]: gl.LINEAR_MIPMAP_LINEAR\n\t\t};\n\n\t\tcompareToGL = {\n\t\t\t[ NeverCompare ]: gl.NEVER,\n\t\t\t[ AlwaysCompare ]: gl.ALWAYS,\n\t\t\t[ LessCompare ]: gl.LESS,\n\t\t\t[ LessEqualCompare ]: gl.LEQUAL,\n\t\t\t[ EqualCompare ]: gl.EQUAL,\n\t\t\t[ GreaterEqualCompare ]: gl.GEQUAL,\n\t\t\t[ GreaterCompare ]: gl.GREATER,\n\t\t\t[ NotEqualCompare ]: gl.NOTEQUAL\n\t\t};\n\n\t}\n\n\t/**\n\t * Returns the native texture type for the given texture.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @return {GLenum} The native texture type.\n\t */\n\tgetGLTextureType( texture ) {\n\n\t\tconst { gl } = this;\n\n\t\tlet glTextureType;\n\n\t\tif ( texture.isCubeTexture === true ) {\n\n\t\t\tglTextureType = gl.TEXTURE_CUBE_MAP;\n\n\t\t} else if ( texture.isArrayTexture === true || texture.isDataArrayTexture === true || texture.isCompressedArrayTexture === true ) {\n\n\t\t\tglTextureType = gl.TEXTURE_2D_ARRAY;\n\n\t\t} else if ( texture.isData3DTexture === true ) { // TODO: isCompressed3DTexture, wait for #26642\n\n\t\t\tglTextureType = gl.TEXTURE_3D;\n\n\t\t} else {\n\n\t\t\tglTextureType = gl.TEXTURE_2D;\n\n\n\t\t}\n\n\t\treturn glTextureType;\n\n\t}\n\n\t/**\n\t * Returns the native texture type for the given texture.\n\t *\n\t * @param {?string} internalFormatName - The internal format name. When `null`, the internal format is derived from the subsequent parameters.\n\t * @param {GLenum} glFormat - The WebGL format.\n\t * @param {GLenum} glType - The WebGL type.\n\t * @param {string} colorSpace - The texture's color space.\n\t * @param {boolean} [forceLinearTransfer=false] - Whether to force a linear transfer or not.\n\t * @return {GLenum} The internal format.\n\t */\n\tgetInternalFormat( internalFormatName, glFormat, glType, colorSpace, forceLinearTransfer = false ) {\n\n\t\tconst { gl, extensions } = this;\n\n\t\tif ( internalFormatName !== null ) {\n\n\t\t\tif ( gl[ internalFormatName ] !== undefined ) return gl[ internalFormatName ];\n\n\t\t\twarn( 'WebGLBackend: Attempt to use non-existing WebGL internal format \\'' + internalFormatName + '\\'' );\n\n\t\t}\n\n\t\tlet internalFormat = glFormat;\n\n\t\tif ( glFormat === gl.RED ) {\n\n\t\t\tif ( glType === gl.FLOAT ) internalFormat = gl.R32F;\n\t\t\tif ( glType === gl.HALF_FLOAT ) internalFormat = gl.R16F;\n\t\t\tif ( glType === gl.UNSIGNED_BYTE ) internalFormat = gl.R8;\n\t\t\tif ( glType === gl.UNSIGNED_SHORT ) internalFormat = gl.R16;\n\t\t\tif ( glType === gl.UNSIGNED_INT ) internalFormat = gl.R32UI;\n\t\t\tif ( glType === gl.BYTE ) internalFormat = gl.R8I;\n\t\t\tif ( glType === gl.SHORT ) internalFormat = gl.R16I;\n\t\t\tif ( glType === gl.INT ) internalFormat = gl.R32I;\n\n\t\t}\n\n\t\tif ( glFormat === gl.RED_INTEGER ) {\n\n\t\t\tif ( glType === gl.UNSIGNED_BYTE ) internalFormat = gl.R8UI;\n\t\t\tif ( glType === gl.UNSIGNED_SHORT ) internalFormat = gl.R16UI;\n\t\t\tif ( glType === gl.UNSIGNED_INT ) internalFormat = gl.R32UI;\n\t\t\tif ( glType === gl.BYTE ) internalFormat = gl.R8I;\n\t\t\tif ( glType === gl.SHORT ) internalFormat = gl.R16I;\n\t\t\tif ( glType === gl.INT ) internalFormat = gl.R32I;\n\n\t\t}\n\n\t\tif ( glFormat === gl.RG ) {\n\n\t\t\tif ( glType === gl.FLOAT ) internalFormat = gl.RG32F;\n\t\t\tif ( glType === gl.HALF_FLOAT ) internalFormat = gl.RG16F;\n\t\t\tif ( glType === gl.UNSIGNED_BYTE ) internalFormat = gl.RG8;\n\t\t\tif ( glType === gl.UNSIGNED_SHORT ) internalFormat = gl.RG16;\n\t\t\tif ( glType === gl.UNSIGNED_INT ) internalFormat = gl.RG32UI;\n\t\t\tif ( glType === gl.BYTE ) internalFormat = gl.RG8I;\n\t\t\tif ( glType === gl.SHORT ) internalFormat = gl.RG16I;\n\t\t\tif ( glType === gl.INT ) internalFormat = gl.RG32I;\n\n\t\t}\n\n\t\tif ( glFormat === gl.RG_INTEGER ) {\n\n\t\t\tif ( glType === gl.UNSIGNED_BYTE ) internalFormat = gl.RG8UI;\n\t\t\tif ( glType === gl.UNSIGNED_SHORT ) internalFormat = gl.RG16UI;\n\t\t\tif ( glType === gl.UNSIGNED_INT ) internalFormat = gl.RG32UI;\n\t\t\tif ( glType === gl.BYTE ) internalFormat = gl.RG8I;\n\t\t\tif ( glType === gl.SHORT ) internalFormat = gl.RG16I;\n\t\t\tif ( glType === gl.INT ) internalFormat = gl.RG32I;\n\n\t\t}\n\n\t\tif ( glFormat === gl.RGB ) {\n\n\t\t\tconst transfer = forceLinearTransfer ? LinearTransfer : ColorManagement.getTransfer( colorSpace );\n\n\t\t\tif ( glType === gl.FLOAT ) internalFormat = gl.RGB32F;\n\t\t\tif ( glType === gl.HALF_FLOAT ) internalFormat = gl.RGB16F;\n\t\t\tif ( glType === gl.UNSIGNED_BYTE ) internalFormat = gl.RGB8;\n\t\t\tif ( glType === gl.UNSIGNED_SHORT ) internalFormat = gl.RGB16;\n\t\t\tif ( glType === gl.UNSIGNED_INT ) internalFormat = gl.RGB32UI;\n\t\t\tif ( glType === gl.BYTE ) internalFormat = gl.RGB8I;\n\t\t\tif ( glType === gl.SHORT ) internalFormat = gl.RGB16I;\n\t\t\tif ( glType === gl.INT ) internalFormat = gl.RGB32I;\n\t\t\tif ( glType === gl.UNSIGNED_BYTE ) internalFormat = ( transfer === SRGBTransfer ) ? gl.SRGB8 : gl.RGB8;\n\t\t\tif ( glType === gl.UNSIGNED_SHORT_5_6_5 ) internalFormat = gl.RGB565;\n\t\t\tif ( glType === gl.UNSIGNED_SHORT_5_5_5_1 ) internalFormat = gl.RGB5_A1;\n\t\t\tif ( glType === gl.UNSIGNED_SHORT_4_4_4_4 ) internalFormat = gl.RGB4;\n\t\t\tif ( glType === gl.UNSIGNED_INT_5_9_9_9_REV ) internalFormat = gl.RGB9_E5;\n\t\t\tif ( glType === gl.UNSIGNED_INT_10F_11F_11F_REV ) internalFormat = gl.R11F_G11F_B10F;\n\n\t\t}\n\n\t\tif ( glFormat === gl.RGB_INTEGER ) {\n\n\t\t\tif ( glType === gl.UNSIGNED_BYTE ) internalFormat = gl.RGB8UI;\n\t\t\tif ( glType === gl.UNSIGNED_SHORT ) internalFormat = gl.RGB16UI;\n\t\t\tif ( glType === gl.UNSIGNED_INT ) internalFormat = gl.RGB32UI;\n\t\t\tif ( glType === gl.BYTE ) internalFormat = gl.RGB8I;\n\t\t\tif ( glType === gl.SHORT ) internalFormat = gl.RGB16I;\n\t\t\tif ( glType === gl.INT ) internalFormat = gl.RGB32I;\n\n\t\t}\n\n\t\tif ( glFormat === gl.RGBA ) {\n\n\t\t\tconst transfer = forceLinearTransfer ? LinearTransfer : ColorManagement.getTransfer( colorSpace );\n\n\t\t\tif ( glType === gl.FLOAT ) internalFormat = gl.RGBA32F;\n\t\t\tif ( glType === gl.HALF_FLOAT ) internalFormat = gl.RGBA16F;\n\t\t\tif ( glType === gl.UNSIGNED_BYTE ) internalFormat = gl.RGBA8;\n\t\t\tif ( glType === gl.UNSIGNED_SHORT ) internalFormat = gl.RGBA16;\n\t\t\tif ( glType === gl.UNSIGNED_INT ) internalFormat = gl.RGBA32UI;\n\t\t\tif ( glType === gl.BYTE ) internalFormat = gl.RGBA8I;\n\t\t\tif ( glType === gl.SHORT ) internalFormat = gl.RGBA16I;\n\t\t\tif ( glType === gl.INT ) internalFormat = gl.RGBA32I;\n\t\t\tif ( glType === gl.UNSIGNED_BYTE ) internalFormat = ( transfer === SRGBTransfer ) ? gl.SRGB8_ALPHA8 : gl.RGBA8;\n\t\t\tif ( glType === gl.UNSIGNED_SHORT_4_4_4_4 ) internalFormat = gl.RGBA4;\n\t\t\tif ( glType === gl.UNSIGNED_SHORT_5_5_5_1 ) internalFormat = gl.RGB5_A1;\n\n\t\t}\n\n\t\tif ( glFormat === gl.RGBA_INTEGER ) {\n\n\t\t\tif ( glType === gl.UNSIGNED_BYTE ) internalFormat = gl.RGBA8UI;\n\t\t\tif ( glType === gl.UNSIGNED_SHORT ) internalFormat = gl.RGBA16UI;\n\t\t\tif ( glType === gl.UNSIGNED_INT ) internalFormat = gl.RGBA32UI;\n\t\t\tif ( glType === gl.BYTE ) internalFormat = gl.RGBA8I;\n\t\t\tif ( glType === gl.SHORT ) internalFormat = gl.RGBA16I;\n\t\t\tif ( glType === gl.INT ) internalFormat = gl.RGBA32I;\n\n\t\t}\n\n\t\tif ( glFormat === gl.DEPTH_COMPONENT ) {\n\n\t\t\tif ( glType === gl.UNSIGNED_SHORT ) internalFormat = gl.DEPTH_COMPONENT16;\n\t\t\tif ( glType === gl.UNSIGNED_INT ) internalFormat = gl.DEPTH_COMPONENT24;\n\t\t\tif ( glType === gl.FLOAT ) internalFormat = gl.DEPTH_COMPONENT32F;\n\n\t\t}\n\n\t\tif ( glFormat === gl.DEPTH_STENCIL ) {\n\n\t\t\tif ( glType === gl.UNSIGNED_INT_24_8 ) internalFormat = gl.DEPTH24_STENCIL8;\n\n\t\t}\n\n\t\tif ( internalFormat === gl.R16F || internalFormat === gl.R32F ||\n\t\t\tinternalFormat === gl.RG16F || internalFormat === gl.RG32F ||\n\t\t\tinternalFormat === gl.RGBA16F || internalFormat === gl.RGBA32F ) {\n\n\t\t\textensions.get( 'EXT_color_buffer_float' );\n\n\t\t}\n\n\t\treturn internalFormat;\n\n\t}\n\n\t/**\n\t * Sets the texture parameters for the given texture.\n\t *\n\t * @param {GLenum} textureType - The texture type.\n\t * @param {Texture} texture - The texture.\n\t */\n\tsetTextureParameters( textureType, texture ) {\n\n\t\tconst { gl, extensions, backend } = this;\n\n\t\tconst workingPrimaries = ColorManagement.getPrimaries( ColorManagement.workingColorSpace );\n\t\tconst texturePrimaries = texture.colorSpace === NoColorSpace ? null : ColorManagement.getPrimaries( texture.colorSpace );\n\t\tconst unpackConversion = texture.colorSpace === NoColorSpace || workingPrimaries === texturePrimaries ? gl.NONE : gl.BROWSER_DEFAULT_WEBGL;\n\n\t\tgl.pixelStorei( gl.UNPACK_FLIP_Y_WEBGL, texture.flipY );\n\t\tgl.pixelStorei( gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, texture.premultiplyAlpha );\n\t\tgl.pixelStorei( gl.UNPACK_ALIGNMENT, texture.unpackAlignment );\n\t\tgl.pixelStorei( gl.UNPACK_COLORSPACE_CONVERSION_WEBGL, unpackConversion );\n\n\t\tgl.texParameteri( textureType, gl.TEXTURE_WRAP_S, wrappingToGL[ texture.wrapS ] );\n\t\tgl.texParameteri( textureType, gl.TEXTURE_WRAP_T, wrappingToGL[ texture.wrapT ] );\n\n\t\tif ( textureType === gl.TEXTURE_3D || textureType === gl.TEXTURE_2D_ARRAY ) {\n\n\t\t\t// WebGL 2 does not support wrapping for depth 2D array textures\n\t\t\tif ( ! texture.isArrayTexture ) {\n\n\t\t\t\tgl.texParameteri( textureType, gl.TEXTURE_WRAP_R, wrappingToGL[ texture.wrapR ] );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgl.texParameteri( textureType, gl.TEXTURE_MAG_FILTER, filterToGL[ texture.magFilter ] );\n\n\n\t\tconst hasMipmaps = texture.mipmaps !== undefined && texture.mipmaps.length > 0;\n\n\t\t// follow WebGPU backend mapping for texture filtering\n\t\tconst minFilter = texture.minFilter === LinearFilter && hasMipmaps ? LinearMipmapLinearFilter : texture.minFilter;\n\n\t\tgl.texParameteri( textureType, gl.TEXTURE_MIN_FILTER, filterToGL[ minFilter ] );\n\n\t\tif ( texture.compareFunction ) {\n\n\t\t\tgl.texParameteri( textureType, gl.TEXTURE_COMPARE_MODE, gl.COMPARE_REF_TO_TEXTURE );\n\t\t\tgl.texParameteri( textureType, gl.TEXTURE_COMPARE_FUNC, compareToGL[ texture.compareFunction ] );\n\n\t\t}\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tif ( texture.magFilter === NearestFilter ) return;\n\t\t\tif ( texture.minFilter !== NearestMipmapLinearFilter && texture.minFilter !== LinearMipmapLinearFilter ) return;\n\t\t\tif ( texture.type === FloatType && extensions.has( 'OES_texture_float_linear' ) === false ) return; // verify extension for WebGL 1 and WebGL 2\n\n\t\t\tif ( texture.anisotropy > 1 ) {\n\n\t\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\t\t\t\tgl.texParameterf( textureType, extension.TEXTURE_MAX_ANISOTROPY_EXT, Math.min( texture.anisotropy, backend.getMaxAnisotropy() ) );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Creates a default texture for the given texture that can be used\n\t * as a placeholder until the actual texture is ready for usage.\n\t *\n\t * @param {Texture} texture - The texture to create a default texture for.\n\t */\n\tcreateDefaultTexture( texture ) {\n\n\t\tconst { gl, backend, defaultTextures } = this;\n\n\n\t\tconst glTextureType = this.getGLTextureType( texture );\n\n\t\tlet textureGPU = defaultTextures[ glTextureType ];\n\n\t\tif ( textureGPU === undefined ) {\n\n\t\t\ttextureGPU = gl.createTexture();\n\n\t\t\tbackend.state.bindTexture( glTextureType, textureGPU );\n\t\t\tgl.texParameteri( glTextureType, gl.TEXTURE_MIN_FILTER, gl.NEAREST );\n\t\t\tgl.texParameteri( glTextureType, gl.TEXTURE_MAG_FILTER, gl.NEAREST );\n\n\t\t\t// gl.texImage2D( glTextureType, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, data );\n\n\t\t\tdefaultTextures[ glTextureType ] = textureGPU;\n\n\t\t}\n\n\t\tbackend.set( texture, {\n\t\t\ttextureGPU,\n\t\t\tglTextureType\n\t\t} );\n\n\t}\n\n\t/**\n\t * Defines a texture on the GPU for the given texture object.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {Object} [options={}] - Optional configuration parameter.\n\t * @return {undefined}\n\t */\n\tcreateTexture( texture, options ) {\n\n\t\tconst { gl, backend } = this;\n\t\tconst { levels, width, height, depth } = options;\n\n\t\tconst glFormat = backend.utils.convert( texture.format, texture.colorSpace );\n\t\tconst glType = backend.utils.convert( texture.type );\n\t\tconst glInternalFormat = this.getInternalFormat( texture.internalFormat, glFormat, glType, texture.colorSpace, texture.isVideoTexture );\n\n\t\tconst textureGPU = gl.createTexture();\n\t\tconst glTextureType = this.getGLTextureType( texture );\n\n\t\tbackend.state.bindTexture( glTextureType, textureGPU );\n\n\t\tthis.setTextureParameters( glTextureType, texture );\n\n\t\tif ( texture.isArrayTexture || texture.isDataArrayTexture || texture.isCompressedArrayTexture ) {\n\n\t\t\tgl.texStorage3D( gl.TEXTURE_2D_ARRAY, levels, glInternalFormat, width, height, depth );\n\n\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\tgl.texStorage3D( gl.TEXTURE_3D, levels, glInternalFormat, width, height, depth );\n\n\t\t} else if ( ! texture.isVideoTexture ) {\n\n\t\t\tgl.texStorage2D( glTextureType, levels, glInternalFormat, width, height );\n\n\t\t}\n\n\t\tbackend.set( texture, {\n\t\t\ttextureGPU,\n\t\t\tglTextureType,\n\t\t\tglFormat,\n\t\t\tglType,\n\t\t\tglInternalFormat\n\t\t} );\n\n\t}\n\n\t/**\n\t * Uploads texture buffer data to the GPU memory.\n\t *\n\t * @param {WebGLBuffer} buffer - The buffer data.\n\t * @param {Texture} texture - The texture,\n\t */\n\tcopyBufferToTexture( buffer, texture ) {\n\n\t\tconst { gl, backend } = this;\n\n\t\tconst { textureGPU, glTextureType, glFormat, glType } = backend.get( texture );\n\n\t\tconst { width, height } = texture.source.data;\n\n\t\tgl.bindBuffer( gl.PIXEL_UNPACK_BUFFER, buffer );\n\n\t\tbackend.state.bindTexture( glTextureType, textureGPU );\n\n\t\tgl.pixelStorei( gl.UNPACK_FLIP_Y_WEBGL, false );\n\t\tgl.pixelStorei( gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, false );\n\t\tgl.texSubImage2D( glTextureType, 0, 0, 0, width, height, glFormat, glType, 0 );\n\n\t\tgl.bindBuffer( gl.PIXEL_UNPACK_BUFFER, null );\n\n\t\tbackend.state.unbindTexture();\n\t\t// debug\n\t\t// const framebuffer = gl.createFramebuffer();\n\t\t// backend.state.bindFramebuffer( gl.FRAMEBUFFER, framebuffer );\n\t\t// gl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, glTextureType, textureGPU, 0 );\n\n\t\t// const readout = new Float32Array( width * height * 4 );\n\n\t\t// const altFormat = gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_FORMAT );\n\t\t// const altType = gl.getParameter( gl.IMPLEMENTATION_COLOR_READ_TYPE );\n\n\t\t// gl.readPixels( 0, 0, width, height, altFormat, altType, readout );\n\t\t// backend.state.bindFramebuffer( gl.FRAMEBUFFER, null );\n\t\t// log( readout );\n\n\t}\n\n\t/**\n\t * Uploads the updated texture data to the GPU.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {Object} [options={}] - Optional configuration parameter.\n\t */\n\tupdateTexture( texture, options ) {\n\n\t\tconst { gl } = this;\n\t\tconst { width, height } = options;\n\t\tconst { textureGPU, glTextureType, glFormat, glType, glInternalFormat } = this.backend.get( texture );\n\n\t\tif ( texture.isRenderTargetTexture || ( textureGPU === undefined /* unsupported texture format */ ) )\n\t\t\treturn;\n\n\t\tthis.backend.state.bindTexture( glTextureType, textureGPU );\n\n\t\tthis.setTextureParameters( glTextureType, texture );\n\n\t\tif ( texture.isCompressedTexture ) {\n\n\t\t\tconst mipmaps = texture.mipmaps;\n\t\t\tconst image = options.image;\n\n\t\t\tfor ( let i = 0; i < mipmaps.length; i ++ ) {\n\n\t\t\t\tconst mipmap = mipmaps[ i ];\n\n\t\t\t\tif ( texture.isCompressedArrayTexture ) {\n\n\n\t\t\t\t\tif ( texture.format !== gl.RGBA ) {\n\n\t\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\t\tgl.compressedTexSubImage3D( gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, mipmap.data );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\twarn( 'WebGLBackend: Attempt to load unsupported compressed texture format in .uploadTexture()' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.texSubImage3D( gl.TEXTURE_2D_ARRAY, i, 0, 0, 0, mipmap.width, mipmap.height, image.depth, glFormat, glType, mipmap.data );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( glFormat !== null ) {\n\n\t\t\t\t\t\tgl.compressedTexSubImage2D( gl.TEXTURE_2D, i, 0, 0, mipmap.width, mipmap.height, glFormat, mipmap.data );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\twarn( 'WebGLBackend: Unsupported compressed texture format' );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\n\t\t} else if ( texture.isCubeTexture ) {\n\n\t\t\tconst images = options.images;\n\t\t\tconst mipmaps = texture.mipmaps;\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tconst image = getImage( images[ i ] );\n\n\t\t\t\tgl.texSubImage2D( gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, 0, 0, width, height, glFormat, glType, image );\n\n\t\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\t\tconst mipmap = mipmaps[ j ];\n\t\t\t\t\tconst image = getImage( mipmap.images[ i ] );\n\n\t\t\t\t\tgl.texSubImage2D( gl.TEXTURE_CUBE_MAP_POSITIVE_X + i, j + 1, 0, 0, image.width, image.height, glFormat, glType, image );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( texture.isDataArrayTexture || texture.isArrayTexture ) {\n\n\t\t\tconst image = options.image;\n\n\t\t\tif ( texture.layerUpdates.size > 0 ) {\n\n\t\t\t\tconst layerByteLength = getByteLength( image.width, image.height, texture.format, texture.type );\n\n\t\t\t\tfor ( const layerIndex of texture.layerUpdates ) {\n\n\t\t\t\t\tconst layerData = image.data.subarray(\n\t\t\t\t\t\tlayerIndex * layerByteLength / image.data.BYTES_PER_ELEMENT,\n\t\t\t\t\t\t( layerIndex + 1 ) * layerByteLength / image.data.BYTES_PER_ELEMENT\n\t\t\t\t\t);\n\t\t\t\t\tgl.texSubImage3D( gl.TEXTURE_2D_ARRAY, 0, 0, 0, layerIndex, image.width, image.height, 1, glFormat, glType, layerData );\n\n\t\t\t\t}\n\n\t\t\t\ttexture.clearLayerUpdates();\n\n\t\t\t} else {\n\n\t\t\t\tgl.texSubImage3D( gl.TEXTURE_2D_ARRAY, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t\t}\n\n\t\t} else if ( texture.isData3DTexture ) {\n\n\t\t\tconst image = options.image;\n\n\t\t\tgl.texSubImage3D( gl.TEXTURE_3D, 0, 0, 0, 0, image.width, image.height, image.depth, glFormat, glType, image.data );\n\n\t\t} else if ( texture.isVideoTexture ) {\n\n\t\t\ttexture.update();\n\n\t\t\tgl.texImage2D( glTextureType, 0, glInternalFormat, glFormat, glType, options.image );\n\n\n\t\t} else {\n\n\t\t\tconst mipmaps = texture.mipmaps;\n\n\t\t\tif ( mipmaps.length > 0 ) {\n\n\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst mipmap = mipmaps[ i ];\n\n\t\t\t\t\tconst image = getImage( mipmap );\n\t\t\t\t\tgl.texSubImage2D( glTextureType, i, 0, 0, mipmap.width, mipmap.height, glFormat, glType, image );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst image = getImage( options.image );\n\t\t\t\tgl.texSubImage2D( glTextureType, 0, 0, 0, width, height, glFormat, glType, image );\n\n\t\t\t}\n\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Generates mipmaps for the given texture.\n\t *\n\t * @param {Texture} texture - The texture.\n\t */\n\tgenerateMipmaps( texture ) {\n\n\t\tconst { gl, backend } = this;\n\t\tconst { textureGPU, glTextureType } = backend.get( texture );\n\n\t\tbackend.state.bindTexture( glTextureType, textureGPU );\n\t\tgl.generateMipmap( glTextureType );\n\n\t}\n\n\t/**\n\t * Deallocates the render buffers of the given render target.\n\t *\n\t * @param {RenderTarget} renderTarget - The render target.\n\t */\n\tdeallocateRenderBuffers( renderTarget ) {\n\n\t\tconst { gl, backend } = this;\n\n\t\t// remove framebuffer reference\n\t\tif ( renderTarget ) {\n\n\t\t\tconst renderContextData = backend.get( renderTarget );\n\n\t\t\trenderContextData.renderBufferStorageSetup = undefined;\n\n\t\t\tif ( renderContextData.framebuffers ) {\n\n\t\t\t\tfor ( const cacheKey in renderContextData.framebuffers ) {\n\n\t\t\t\t\tgl.deleteFramebuffer( renderContextData.framebuffers[ cacheKey ] );\n\n\t\t\t\t}\n\n\t\t\t\tdelete renderContextData.framebuffers;\n\n\t\t\t}\n\n\t\t\tif ( renderContextData.depthRenderbuffer ) {\n\n\t\t\t\tgl.deleteRenderbuffer( renderContextData.depthRenderbuffer );\n\t\t\t\tdelete renderContextData.depthRenderbuffer;\n\n\t\t\t}\n\n\t\t\tif ( renderContextData.stencilRenderbuffer ) {\n\n\t\t\t\tgl.deleteRenderbuffer( renderContextData.stencilRenderbuffer );\n\t\t\t\tdelete renderContextData.stencilRenderbuffer;\n\n\t\t\t}\n\n\t\t\tif ( renderContextData.msaaFrameBuffer ) {\n\n\t\t\t\tgl.deleteFramebuffer( renderContextData.msaaFrameBuffer );\n\t\t\t\tdelete renderContextData.msaaFrameBuffer;\n\n\t\t\t}\n\n\t\t\tif ( renderContextData.msaaRenderbuffers ) {\n\n\t\t\t\tfor ( let i = 0; i < renderContextData.msaaRenderbuffers.length; i ++ ) {\n\n\t\t\t\t\tgl.deleteRenderbuffer( renderContextData.msaaRenderbuffers[ i ] );\n\n\t\t\t\t}\n\n\t\t\t\tdelete renderContextData.msaaRenderbuffers;\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Destroys the GPU data for the given texture object.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {boolean} [isDefaultTexture=false] - Whether the texture uses a default GPU texture or not.\n\t */\n\tdestroyTexture( texture, isDefaultTexture = false ) {\n\n\t\tconst { gl, backend } = this;\n\t\tconst { textureGPU, renderTarget } = backend.get( texture );\n\n\t\tthis.deallocateRenderBuffers( renderTarget );\n\n\t\tif ( isDefaultTexture === false ) {\n\n\t\t\tgl.deleteTexture( textureGPU );\n\n\t\t}\n\n\t\tbackend.delete( texture );\n\n\t}\n\n\t/**\n\t * Copies data of the given source texture to the given destination texture.\n\t *\n\t * @param {Texture} srcTexture - The source texture.\n\t * @param {Texture} dstTexture - The destination texture.\n\t * @param {?(Box3|Box2)} [srcRegion=null] - The region of the source texture to copy.\n\t * @param {?(Vector2|Vector3)} [dstPosition=null] - The destination position of the copy.\n\t * @param {number} [srcLevel=0] - The source mip level to copy from.\n\t * @param {number} [dstLevel=0] - The destination mip level to copy to.\n\t */\n\tcopyTextureToTexture( srcTexture, dstTexture, srcRegion = null, dstPosition = null, srcLevel = 0, dstLevel = 0 ) {\n\n\t\tconst { gl, backend } = this;\n\t\tconst { state } = this.backend;\n\n\t\tconst { textureGPU: dstTextureGPU, glTextureType, glType, glFormat } = backend.get( dstTexture );\n\n\t\tstate.bindTexture( glTextureType, dstTextureGPU );\n\n\t\t// gather the necessary dimensions to copy\n\t\tlet width, height, depth, minX, minY, minZ;\n\t\tlet dstX, dstY, dstZ;\n\t\tconst image = srcTexture.isCompressedTexture ? srcTexture.mipmaps[ dstLevel ] : srcTexture.image;\n\n\t\tif ( srcRegion !== null ) {\n\n\t\t\twidth = srcRegion.max.x - srcRegion.min.x;\n\t\t\theight = srcRegion.max.y - srcRegion.min.y;\n\t\t\tdepth = srcRegion.isBox3 ? srcRegion.max.z - srcRegion.min.z : 1;\n\t\t\tminX = srcRegion.min.x;\n\t\t\tminY = srcRegion.min.y;\n\t\t\tminZ = srcRegion.isBox3 ? srcRegion.min.z : 0;\n\n\t\t} else {\n\n\t\t\tconst levelScale = Math.pow( 2, - srcLevel );\n\t\t\twidth = Math.floor( image.width * levelScale );\n\t\t\theight = Math.floor( image.height * levelScale );\n\n\t\t\tif ( srcTexture.isDataArrayTexture || srcTexture.isArrayTexture ) {\n\n\t\t\t\tdepth = image.depth;\n\n\t\t\t} else if ( srcTexture.isData3DTexture ) {\n\n\t\t\t\tdepth = Math.floor( image.depth * levelScale );\n\n\t\t\t} else {\n\n\t\t\t\tdepth = 1;\n\n\t\t\t}\n\n\t\t\tminX = 0;\n\t\t\tminY = 0;\n\t\t\tminZ = 0;\n\n\t\t}\n\n\t\tif ( dstPosition !== null ) {\n\n\t\t\tdstX = dstPosition.x;\n\t\t\tdstY = dstPosition.y;\n\t\t\tdstZ = dstPosition.z;\n\n\t\t} else {\n\n\t\t\tdstX = 0;\n\t\t\tdstY = 0;\n\t\t\tdstZ = 0;\n\n\t\t}\n\n\t\tgl.pixelStorei( gl.UNPACK_FLIP_Y_WEBGL, dstTexture.flipY );\n\t\tgl.pixelStorei( gl.UNPACK_PREMULTIPLY_ALPHA_WEBGL, dstTexture.premultiplyAlpha );\n\t\tgl.pixelStorei( gl.UNPACK_ALIGNMENT, dstTexture.unpackAlignment );\n\n\t\t// used for copying data from cpu\n\t\tconst currentUnpackRowLen = gl.getParameter( gl.UNPACK_ROW_LENGTH );\n\t\tconst currentUnpackImageHeight = gl.getParameter( gl.UNPACK_IMAGE_HEIGHT );\n\t\tconst currentUnpackSkipPixels = gl.getParameter( gl.UNPACK_SKIP_PIXELS );\n\t\tconst currentUnpackSkipRows = gl.getParameter( gl.UNPACK_SKIP_ROWS );\n\t\tconst currentUnpackSkipImages = gl.getParameter( gl.UNPACK_SKIP_IMAGES );\n\n\t\tgl.pixelStorei( gl.UNPACK_ROW_LENGTH, image.width );\n\t\tgl.pixelStorei( gl.UNPACK_IMAGE_HEIGHT, image.height );\n\t\tgl.pixelStorei( gl.UNPACK_SKIP_PIXELS, minX );\n\t\tgl.pixelStorei( gl.UNPACK_SKIP_ROWS, minY );\n\t\tgl.pixelStorei( gl.UNPACK_SKIP_IMAGES, minZ );\n\n\t\t// set up the src texture\n\t\tconst isSrc3D = srcTexture.isDataArrayTexture || srcTexture.isData3DTexture || dstTexture.isArrayTexture;\n\t\tconst isDst3D = dstTexture.isDataArrayTexture || dstTexture.isData3DTexture || dstTexture.isArrayTexture;\n\n\t\tif ( srcTexture.isDepthTexture ) {\n\n\t\t\tconst srcTextureData = backend.get( srcTexture );\n\t\t\tconst dstTextureData = backend.get( dstTexture );\n\n\t\t\tconst srcRenderContextData = backend.get( srcTextureData.renderTarget );\n\t\t\tconst dstRenderContextData = backend.get( dstTextureData.renderTarget );\n\n\t\t\tconst srcFramebuffer = srcRenderContextData.framebuffers[ srcTextureData.cacheKey ];\n\t\t\tconst dstFramebuffer = dstRenderContextData.framebuffers[ dstTextureData.cacheKey ];\n\n\t\t\tstate.bindFramebuffer( gl.READ_FRAMEBUFFER, srcFramebuffer );\n\t\t\tstate.bindFramebuffer( gl.DRAW_FRAMEBUFFER, dstFramebuffer );\n\n\t\t\tfor ( let i = 0; i < depth; i ++ ) {\n\n\t\t\t\t// if the source or destination are a 3d target then a layer needs to be bound\n\t\t\t\tif ( isSrc3D ) {\n\n\t\t\t\t\tgl.framebufferTextureLayer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, srcTextureData.textureGPU, srcLevel, minZ + i );\n\t\t\t\t\tgl.framebufferTextureLayer( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, dstTextureGPU, dstLevel, dstZ + i );\n\n\t\t\t\t}\n\n\t\t\t\tgl.blitFramebuffer( minX, minY, width, height, dstX, dstY, width, height, gl.DEPTH_BUFFER_BIT, gl.NEAREST );\n\n\t\t\t}\n\n\t\t\tstate.bindFramebuffer( gl.READ_FRAMEBUFFER, null );\n\t\t\tstate.bindFramebuffer( gl.DRAW_FRAMEBUFFER, null );\n\n\t\t} else if ( srcLevel !== 0 || srcTexture.isRenderTargetTexture || backend.has( srcTexture ) ) {\n\n\t\t\t// get the appropriate frame buffers\n\t\t\tconst srcTextureData = backend.get( srcTexture );\n\n\t\t\tif ( this._srcFramebuffer === null ) this._srcFramebuffer = gl.createFramebuffer();\n\t\t\tif ( this._dstFramebuffer === null ) this._dstFramebuffer = gl.createFramebuffer();\n\n\t\t\t// bind the frame buffer targets\n\t\t\tstate.bindFramebuffer( gl.READ_FRAMEBUFFER, this._srcFramebuffer );\n\t\t\tstate.bindFramebuffer( gl.DRAW_FRAMEBUFFER, this._dstFramebuffer );\n\n\t\t\tfor ( let i = 0; i < depth; i ++ ) {\n\n\t\t\t\t// assign the correct layers and mip maps to the frame buffers\n\t\t\t\tif ( isSrc3D ) {\n\n\t\t\t\t\tgl.framebufferTextureLayer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, srcTextureData.textureGPU, srcLevel, minZ + i );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.framebufferTexture2D( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, srcTextureData.textureGPU, srcLevel );\n\n\t\t\t\t}\n\n\t\t\t\tif ( isDst3D ) {\n\n\t\t\t\t\tgl.framebufferTextureLayer( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, dstTextureGPU, dstLevel, dstZ + i );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, dstTextureGPU, dstLevel );\n\n\t\t\t\t}\n\n\t\t\t\t// copy the data using the fastest function that can achieve the copy\n\t\t\t\tif ( srcLevel !== 0 ) {\n\n\t\t\t\t\tgl.blitFramebuffer( minX, minY, width, height, dstX, dstY, width, height, gl.COLOR_BUFFER_BIT, gl.NEAREST );\n\n\t\t\t\t} else if ( isDst3D ) {\n\n\t\t\t\t\tgl.copyTexSubImage3D( glTextureType, dstLevel, dstX, dstY, dstZ + i, minX, minY, width, height );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.copyTexSubImage2D( glTextureType, dstLevel, dstX, dstY, minX, minY, width, height );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// unbind read, draw buffers\n\t\t\tstate.bindFramebuffer( gl.READ_FRAMEBUFFER, null );\n\t\t\tstate.bindFramebuffer( gl.DRAW_FRAMEBUFFER, null );\n\n\t\t} else {\n\n\t\t\tif ( isDst3D ) {\n\n\t\t\t\t// copy data into the 3d texture\n\t\t\t\tif ( srcTexture.isDataTexture || srcTexture.isData3DTexture ) {\n\n\t\t\t\t\tgl.texSubImage3D( glTextureType, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image.data );\n\n\t\t\t\t} else if ( dstTexture.isCompressedArrayTexture ) {\n\n\t\t\t\t\tgl.compressedTexSubImage3D( glTextureType, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, image.data );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.texSubImage3D( glTextureType, dstLevel, dstX, dstY, dstZ, width, height, depth, glFormat, glType, image );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// copy data into the 2d texture\n\t\t\t\tif ( srcTexture.isDataTexture ) {\n\n\t\t\t\t\tgl.texSubImage2D( gl.TEXTURE_2D, dstLevel, dstX, dstY, width, height, glFormat, glType, image.data );\n\n\t\t\t\t} else if ( srcTexture.isCompressedTexture ) {\n\n\t\t\t\t\tgl.compressedTexSubImage2D( gl.TEXTURE_2D, dstLevel, dstX, dstY, image.width, image.height, glFormat, image.data );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.texSubImage2D( gl.TEXTURE_2D, dstLevel, dstX, dstY, width, height, glFormat, glType, image );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\t// reset values\n\t\tgl.pixelStorei( gl.UNPACK_ROW_LENGTH, currentUnpackRowLen );\n\t\tgl.pixelStorei( gl.UNPACK_IMAGE_HEIGHT, currentUnpackImageHeight );\n\t\tgl.pixelStorei( gl.UNPACK_SKIP_PIXELS, currentUnpackSkipPixels );\n\t\tgl.pixelStorei( gl.UNPACK_SKIP_ROWS, currentUnpackSkipRows );\n\t\tgl.pixelStorei( gl.UNPACK_SKIP_IMAGES, currentUnpackSkipImages );\n\n\t\t// Generate mipmaps only when copying level 0\n\t\tif ( dstLevel === 0 && dstTexture.generateMipmaps ) {\n\n\t\t\tgl.generateMipmap( glTextureType );\n\n\t\t}\n\n\t\tstate.unbindTexture();\n\n\t}\n\n\n\t/**\n\t * Copies the current bound framebuffer to the given texture.\n\t *\n\t * @param {Texture} texture - The destination texture.\n\t * @param {RenderContext} renderContext - The render context.\n\t * @param {Vector4} rectangle - A four dimensional vector defining the origin and dimension of the copy.\n\t */\n\tcopyFramebufferToTexture( texture, renderContext, rectangle ) {\n\n\t\tconst { gl } = this;\n\t\tconst { state } = this.backend;\n\n\t\tconst { textureGPU } = this.backend.get( texture );\n\n\t\tconst { x, y, z: width, w: height } = rectangle;\n\n\t\tconst requireDrawFrameBuffer = texture.isDepthTexture === true || ( renderContext.renderTarget && renderContext.renderTarget.samples > 0 );\n\n\t\tconst srcHeight = renderContext.renderTarget ? renderContext.renderTarget.height : this.backend.getDrawingBufferSize().y;\n\n\t\tif ( requireDrawFrameBuffer ) {\n\n\t\t\tconst partial = ( x !== 0 || y !== 0 );\n\t\t\tlet mask;\n\t\t\tlet attachment;\n\n\t\t\tif ( texture.isDepthTexture === true ) {\n\n\t\t\t\tmask = gl.DEPTH_BUFFER_BIT;\n\t\t\t\tattachment = gl.DEPTH_ATTACHMENT;\n\n\t\t\t\tif ( renderContext.stencil ) {\n\n\t\t\t\t\tmask |= gl.STENCIL_BUFFER_BIT;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tmask = gl.COLOR_BUFFER_BIT;\n\t\t\t\tattachment = gl.COLOR_ATTACHMENT0;\n\n\t\t\t}\n\n\t\t\tif ( partial ) {\n\n\t\t\t\tconst renderTargetContextData = this.backend.get( renderContext.renderTarget );\n\n\t\t\t\tconst fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];\n\t\t\t\tconst msaaFrameBuffer = renderTargetContextData.msaaFrameBuffer;\n\n\t\t\t\tstate.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );\n\t\t\t\tstate.bindFramebuffer( gl.READ_FRAMEBUFFER, msaaFrameBuffer );\n\n\t\t\t\tconst flippedY = srcHeight - y - height;\n\n\t\t\t\tgl.blitFramebuffer( x, flippedY, x + width, flippedY + height, x, flippedY, x + width, flippedY + height, mask, gl.NEAREST );\n\n\t\t\t\tstate.bindFramebuffer( gl.READ_FRAMEBUFFER, fb );\n\n\t\t\t\tstate.bindTexture( gl.TEXTURE_2D, textureGPU );\n\n\t\t\t\tgl.copyTexSubImage2D( gl.TEXTURE_2D, 0, 0, 0, x, flippedY, width, height );\n\n\t\t\t\tstate.unbindTexture();\n\n\t\t\t} else {\n\n\t\t\t\tconst fb = gl.createFramebuffer();\n\n\t\t\t\tstate.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );\n\n\t\t\t\tgl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, attachment, gl.TEXTURE_2D, textureGPU, 0 );\n\t\t\t\tgl.blitFramebuffer( 0, 0, width, height, 0, 0, width, height, mask, gl.NEAREST );\n\n\t\t\t\tgl.deleteFramebuffer( fb );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tstate.bindTexture( gl.TEXTURE_2D, textureGPU );\n\t\t\tgl.copyTexSubImage2D( gl.TEXTURE_2D, 0, 0, 0, x, srcHeight - height - y, width, height );\n\n\t\t\tstate.unbindTexture();\n\n\t\t}\n\n\t\tif ( texture.generateMipmaps ) this.generateMipmaps( texture );\n\n\t\tthis.backend._setFramebuffer( renderContext );\n\n\t}\n\n\t/**\n\t * SetupS storage for internal depth/stencil buffers and bind to correct framebuffer.\n\t *\n\t * @param {WebGLRenderbuffer} renderbuffer - The render buffer.\n\t * @param {RenderContext} renderContext - The render context.\n\t * @param {number} samples - The MSAA sample count.\n\t * @param {boolean} [useMultisampledRTT=false] - Whether to use WEBGL_multisampled_render_to_texture or not.\n\t */\n\tsetupRenderBufferStorage( renderbuffer, renderContext, samples, useMultisampledRTT = false ) {\n\n\t\tconst { gl } = this;\n\t\tconst renderTarget = renderContext.renderTarget;\n\n\t\tconst { depthTexture, depthBuffer, stencilBuffer, width, height } = renderTarget;\n\n\t\tgl.bindRenderbuffer( gl.RENDERBUFFER, renderbuffer );\n\n\t\tif ( depthBuffer && ! stencilBuffer ) {\n\n\t\t\tlet glInternalFormat = gl.DEPTH_COMPONENT24;\n\n\t\t\tif ( useMultisampledRTT === true ) {\n\n\t\t\t\tconst multisampledRTTExt = this.extensions.get( 'WEBGL_multisampled_render_to_texture' );\n\n\t\t\t\tmultisampledRTTExt.renderbufferStorageMultisampleEXT( gl.RENDERBUFFER, renderTarget.samples, glInternalFormat, width, height );\n\n\t\t\t} else if ( samples > 0 ) {\n\n\t\t\t\tif ( depthTexture && depthTexture.isDepthTexture ) {\n\n\t\t\t\t\tif ( depthTexture.type === gl.FLOAT ) {\n\n\t\t\t\t\t\tglInternalFormat = gl.DEPTH_COMPONENT32F;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tgl.renderbufferStorageMultisample( gl.RENDERBUFFER, samples, glInternalFormat, width, height );\n\n\t\t\t} else {\n\n\t\t\t\tgl.renderbufferStorage( gl.RENDERBUFFER, glInternalFormat, width, height );\n\n\t\t\t}\n\n\t\t\tgl.framebufferRenderbuffer( gl.FRAMEBUFFER, gl.DEPTH_ATTACHMENT, gl.RENDERBUFFER, renderbuffer );\n\n\t\t} else if ( depthBuffer && stencilBuffer ) {\n\n\t\t\tif ( samples > 0 ) {\n\n\t\t\t\tgl.renderbufferStorageMultisample( gl.RENDERBUFFER, samples, gl.DEPTH24_STENCIL8, width, height );\n\n\t\t\t} else {\n\n\t\t\t\tgl.renderbufferStorage( gl.RENDERBUFFER, gl.DEPTH_STENCIL, width, height );\n\n\t\t\t}\n\n\n\t\t\tgl.framebufferRenderbuffer( gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, gl.RENDERBUFFER, renderbuffer );\n\n\t\t}\n\n\t\tgl.bindRenderbuffer( gl.RENDERBUFFER, null );\n\n\t}\n\n\t/**\n\t * Returns texture data as a typed array.\n\t *\n\t * @async\n\t * @param {Texture} texture - The texture to copy.\n\t * @param {number} x - The x coordinate of the copy origin.\n\t * @param {number} y - The y coordinate of the copy origin.\n\t * @param {number} width - The width of the copy.\n\t * @param {number} height - The height of the copy.\n\t * @param {number} faceIndex - The face index.\n\t * @return {Promise<TypedArray>} A Promise that resolves with a typed array when the copy operation has finished.\n\t */\n\tasync copyTextureToBuffer( texture, x, y, width, height, faceIndex ) {\n\n\t\tconst { backend, gl } = this;\n\n\t\tconst { textureGPU, glFormat, glType } = this.backend.get( texture );\n\n\t\tconst fb = gl.createFramebuffer();\n\n\t\tbackend.state.bindFramebuffer( gl.READ_FRAMEBUFFER, fb );\n\n\t\tconst target = texture.isCubeTexture ? gl.TEXTURE_CUBE_MAP_POSITIVE_X + faceIndex : gl.TEXTURE_2D;\n\n\t\tgl.framebufferTexture2D( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, target, textureGPU, 0 );\n\n\t\tconst typedArrayType = this._getTypedArrayType( glType );\n\t\tconst bytesPerTexel = this._getBytesPerTexel( glType, glFormat );\n\n\t\tconst elementCount = width * height;\n\t\tconst byteLength = elementCount * bytesPerTexel;\n\n\t\tconst buffer = gl.createBuffer();\n\n\t\tgl.bindBuffer( gl.PIXEL_PACK_BUFFER, buffer );\n\t\tgl.bufferData( gl.PIXEL_PACK_BUFFER, byteLength, gl.STREAM_READ );\n\t\tgl.readPixels( x, y, width, height, glFormat, glType, 0 );\n\t\tgl.bindBuffer( gl.PIXEL_PACK_BUFFER, null );\n\n\t\tawait backend.utils._clientWaitAsync();\n\n\t\tconst dstBuffer = new typedArrayType( byteLength / typedArrayType.BYTES_PER_ELEMENT );\n\n\t\tgl.bindBuffer( gl.PIXEL_PACK_BUFFER, buffer );\n\t\tgl.getBufferSubData( gl.PIXEL_PACK_BUFFER, 0, dstBuffer );\n\t\tgl.bindBuffer( gl.PIXEL_PACK_BUFFER, null );\n\n\t\tbackend.state.bindFramebuffer( gl.READ_FRAMEBUFFER, null );\n\n\t\tgl.deleteFramebuffer( fb );\n\n\t\treturn dstBuffer;\n\n\t}\n\n\t/**\n\t * Returns the corresponding typed array type for the given WebGL data type.\n\t *\n\t * @private\n\t * @param {GLenum} glType - The WebGL data type.\n\t * @return {TypedArray.constructor} The typed array type.\n\t */\n\t_getTypedArrayType( glType ) {\n\n\t\tconst { gl } = this;\n\n\t\tif ( glType === gl.UNSIGNED_BYTE ) return Uint8Array;\n\n\t\tif ( glType === gl.UNSIGNED_SHORT_4_4_4_4 ) return Uint16Array;\n\t\tif ( glType === gl.UNSIGNED_SHORT_5_5_5_1 ) return Uint16Array;\n\t\tif ( glType === gl.UNSIGNED_SHORT_5_6_5 ) return Uint16Array;\n\t\tif ( glType === gl.UNSIGNED_SHORT ) return Uint16Array;\n\t\tif ( glType === gl.UNSIGNED_INT ) return Uint32Array;\n\n\t\tif ( glType === gl.HALF_FLOAT ) return Uint16Array;\n\t\tif ( glType === gl.FLOAT ) return Float32Array;\n\n\t\tthrow new Error( `Unsupported WebGL type: ${glType}` );\n\n\t}\n\n\t/**\n\t * Returns the bytes-per-texel value for the given WebGL data type and texture format.\n\t *\n\t * @private\n\t * @param {GLenum} glType - The WebGL data type.\n\t * @param {GLenum} glFormat - The WebGL texture format.\n\t * @return {number} The bytes-per-texel.\n\t */\n\t_getBytesPerTexel( glType, glFormat ) {\n\n\t\tconst { gl } = this;\n\n\t\tlet bytesPerComponent = 0;\n\n\t\tif ( glType === gl.UNSIGNED_BYTE ) bytesPerComponent = 1;\n\n\t\tif ( glType === gl.UNSIGNED_SHORT_4_4_4_4 ||\n\t\t\tglType === gl.UNSIGNED_SHORT_5_5_5_1 ||\n\t\t\tglType === gl.UNSIGNED_SHORT_5_6_5 ||\n\t\t\tglType === gl.UNSIGNED_SHORT ||\n\t\t\tglType === gl.HALF_FLOAT ) bytesPerComponent = 2;\n\n\t\tif ( glType === gl.UNSIGNED_INT ||\n\t\t\tglType === gl.FLOAT ) bytesPerComponent = 4;\n\n\t\tif ( glFormat === gl.RGBA ) return bytesPerComponent * 4;\n\t\tif ( glFormat === gl.RGB ) return bytesPerComponent * 3;\n\t\tif ( glFormat === gl.ALPHA ) return bytesPerComponent;\n\n\t}\n\n\t/**\n\t * Frees the internal resources.\n\t */\n\tdispose() {\n\n\t\tconst { gl } = this;\n\n\t\tif ( this._srcFramebuffer !== null ) gl.deleteFramebuffer( this._srcFramebuffer );\n\t\tif ( this._dstFramebuffer !== null ) gl.deleteFramebuffer( this._dstFramebuffer );\n\n\t}\n\n}\n\nfunction getImage( source ) {\n\n\tif ( source.isDataTexture ) {\n\n\t\treturn source.image.data;\n\n\t} else if ( ( typeof HTMLImageElement !== 'undefined' && source instanceof HTMLImageElement ) ||\n\t\t( typeof HTMLCanvasElement !== 'undefined' && source instanceof HTMLCanvasElement ) ||\n\t\t( typeof ImageBitmap !== 'undefined' && source instanceof ImageBitmap ) ||\n\t\t( typeof OffscreenCanvas !== 'undefined' && source instanceof OffscreenCanvas ) ) {\n\n\t\treturn source;\n\n\t}\n\n\treturn source.data;\n\n}\n\n/**\n * A WebGL 2 backend utility module for managing extensions.\n *\n * @private\n */\nclass WebGLExtensions {\n\n\t/**\n\t * Constructs a new utility object.\n\t *\n\t * @param {WebGLBackend} backend - The WebGL 2 backend.\n\t */\n\tconstructor( backend ) {\n\n\t\t/**\n\t\t * A reference to the WebGL 2 backend.\n\t\t *\n\t\t * @type {WebGLBackend}\n\t\t */\n\t\tthis.backend = backend;\n\n\t\t/**\n\t\t * A reference to the rendering context.\n\t\t *\n\t\t * @type {WebGL2RenderingContext}\n\t\t */\n\t\tthis.gl = this.backend.gl;\n\n\t\t/**\n\t\t * A list with all the supported WebGL extensions.\n\t\t *\n\t\t * @type {Array<string>}\n\t\t */\n\t\tthis.availableExtensions = this.gl.getSupportedExtensions();\n\n\t\t/**\n\t\t * A dictionary with requested WebGL extensions.\n\t\t * The key is the name of the extension, the value\n\t\t * the requested extension object.\n\t\t *\n\t\t * @type {Object<string,Object>}\n\t\t */\n\t\tthis.extensions = {};\n\n\t}\n\n\t/**\n\t * Returns the extension object for the given extension name.\n\t *\n\t * @param {string} name - The extension name.\n\t * @return {Object} The extension object.\n\t */\n\tget( name ) {\n\n\t\tlet extension = this.extensions[ name ];\n\n\t\tif ( extension === undefined ) {\n\n\t\t\textension = this.gl.getExtension( name );\n\n\t\t\tthis.extensions[ name ] = extension;\n\n\t\t}\n\n\t\treturn extension;\n\n\t}\n\n\t/**\n\t * Returns `true` if the requested extension is available.\n\t *\n\t * @param {string} name - The extension name.\n\t * @return {boolean} Whether the given extension is available or not.\n\t */\n\thas( name ) {\n\n\t\treturn this.availableExtensions.includes( name );\n\n\t}\n\n}\n\n/**\n * A WebGL 2 backend utility module for managing the device's capabilities.\n *\n * @private\n */\nclass WebGLCapabilities {\n\n\t/**\n\t * Constructs a new utility object.\n\t *\n\t * @param {WebGLBackend} backend - The WebGL 2 backend.\n\t */\n\tconstructor( backend ) {\n\n\t\t/**\n\t\t * A reference to the WebGL 2 backend.\n\t\t *\n\t\t * @type {WebGLBackend}\n\t\t */\n\t\tthis.backend = backend;\n\n\t\t/**\n\t\t * This value holds the cached max anisotropy value.\n\t\t *\n\t\t * @type {?number}\n\t\t * @default null\n\t\t */\n\t\tthis.maxAnisotropy = null;\n\n\t}\n\n\t/**\n\t * Returns the maximum anisotropy texture filtering value. This value\n\t * depends on the device and is reported by the `EXT_texture_filter_anisotropic`\n\t * WebGL extension.\n\t *\n\t * @return {number} The maximum anisotropy texture filtering value.\n\t */\n\tgetMaxAnisotropy() {\n\n\t\tif ( this.maxAnisotropy !== null ) return this.maxAnisotropy;\n\n\t\tconst gl = this.backend.gl;\n\t\tconst extensions = this.backend.extensions;\n\n\t\tif ( extensions.has( 'EXT_texture_filter_anisotropic' ) === true ) {\n\n\t\t\tconst extension = extensions.get( 'EXT_texture_filter_anisotropic' );\n\n\t\t\tthis.maxAnisotropy = gl.getParameter( extension.MAX_TEXTURE_MAX_ANISOTROPY_EXT );\n\n\t\t} else {\n\n\t\t\tthis.maxAnisotropy = 0;\n\n\t\t}\n\n\t\treturn this.maxAnisotropy;\n\n\t}\n\n}\n\nconst GLFeatureName = {\n\n\t'WEBGL_multi_draw': 'WEBGL_multi_draw',\n\t'WEBGL_compressed_texture_astc': 'texture-compression-astc',\n\t'WEBGL_compressed_texture_etc': 'texture-compression-etc2',\n\t'WEBGL_compressed_texture_etc1': 'texture-compression-etc1',\n\t'WEBGL_compressed_texture_pvrtc': 'texture-compression-pvrtc',\n\t'WEBGL_compressed_texture_s3tc': 'texture-compression-s3tc',\n\t'EXT_texture_compression_bptc': 'texture-compression-bc',\n\t'EXT_disjoint_timer_query_webgl2': 'timestamp-query',\n\t'OVR_multiview2': 'OVR_multiview2'\n\n};\n\nclass WebGLBufferRenderer {\n\n\tconstructor( backend ) {\n\n\t\tthis.gl = backend.gl;\n\t\tthis.extensions = backend.extensions;\n\t\tthis.info = backend.renderer.info;\n\t\tthis.mode = null;\n\t\tthis.index = 0;\n\t\tthis.type = null;\n\t\tthis.object = null;\n\n\t}\n\n\trender( start, count ) {\n\n\t\tconst { gl, mode, object, type, info, index } = this;\n\n\t\tif ( index !== 0 ) {\n\n\t\t\tgl.drawElements( mode, count, type, start );\n\n\t\t} else {\n\n\t\t\tgl.drawArrays( mode, start, count );\n\n\t\t}\n\n\t\tinfo.update( object, count, 1 );\n\n\t}\n\n\trenderInstances( start, count, primcount ) {\n\n\t\tconst { gl, mode, type, index, object, info } = this;\n\n\t\tif ( primcount === 0 ) return;\n\n\t\tif ( index !== 0 ) {\n\n\t\t\tgl.drawElementsInstanced( mode, count, type, start, primcount );\n\n\t\t} else {\n\n\t\t\tgl.drawArraysInstanced( mode, start, count, primcount );\n\n\t\t}\n\n\t\tinfo.update( object, count, primcount );\n\n\t}\n\n\trenderMultiDraw( starts, counts, drawCount ) {\n\n\t\tconst { extensions, mode, object, info } = this;\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\n\t\tif ( extension === null ) {\n\n\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\tthis.render( starts[ i ], counts[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( this.index !== 0 ) {\n\n\t\t\t\textension.multiDrawElementsWEBGL( mode, counts, 0, this.type, starts, 0, drawCount );\n\n\t\t\t} else {\n\n\t\t\t\textension.multiDrawArraysWEBGL( mode, starts, 0, counts, 0, drawCount );\n\n\t\t\t}\n\n\t\t\tlet elementCount = 0;\n\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\telementCount += counts[ i ];\n\n\t\t\t}\n\n\t\t\tinfo.update( object, elementCount, 1 );\n\n\t\t}\n\n\t}\n\n\trenderMultiDrawInstances( starts, counts, drawCount, primcount ) {\n\n\t\tconst { extensions, mode, object, info } = this;\n\n\t\tif ( drawCount === 0 ) return;\n\n\t\tconst extension = extensions.get( 'WEBGL_multi_draw' );\n\n\t\tif ( extension === null ) {\n\n\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\tthis.renderInstances( starts[ i ], counts[ i ], primcount[ i ] );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( this.index !== 0 ) {\n\n\t\t\t\textension.multiDrawElementsInstancedWEBGL( mode, counts, 0, this.type, starts, 0, primcount, 0, drawCount );\n\n\t\t\t} else {\n\n\t\t\t\textension.multiDrawArraysInstancedWEBGL( mode, starts, 0, counts, 0, primcount, 0, drawCount );\n\n\t\t\t}\n\n\t\t\tlet elementCount = 0;\n\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\telementCount += counts[ i ] * primcount[ i ];\n\n\t\t\t}\n\n\t\t\tinfo.update( object, elementCount, 1 );\n\n\t\t}\n\n\t}\n\n\t//\n\n}\n\n/**\n * Abstract base class of a timestamp query pool.\n *\n * @abstract\n */\nclass TimestampQueryPool {\n\n\t/**\n\t * Creates a new timestamp query pool.\n\t *\n\t * @param {number} [maxQueries=256] - Maximum number of queries this pool can hold.\n\t */\n\tconstructor( maxQueries = 256 ) {\n\n\t\t/**\n\t\t * Whether to track timestamps or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.trackTimestamp = true;\n\n\t\t/**\n\t\t * Maximum number of queries this pool can hold.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 256\n\t\t */\n\t\tthis.maxQueries = maxQueries;\n\n\t\t/**\n\t\t * How many queries allocated so far.\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.currentQueryIndex = 0;\n\n\t\t/**\n\t\t * Tracks offsets for different contexts.\n\t\t *\n\t\t * @type {Map<string, number>}\n\t\t */\n\t\tthis.queryOffsets = new Map();\n\n\t\t/**\n\t\t * Whether the pool has been disposed or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.isDisposed = false;\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {number}\n\t\t * @default 0\n\t\t */\n\t\tthis.lastValue = 0;\n\n\t\t/**\n\t\t * Stores all timestamp frames.\n\t\t *\n\t\t * @type {Array<number>}\n\t\t */\n\t\tthis.frames = [];\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.pendingResolve = false;\n\n\t\t/**\n\t\t * Stores the latest timestamp for each render context.\n\t\t *\n\t\t * @type {Map<string, number>}\n\t\t */\n\t\tthis.timestamps = new Map();\n\n\t}\n\n\t/**\n\t * Returns all timestamp frames.\n\t *\n\t * @return {Array<number>} The timestamp frames.\n\t */\n\tgetTimestampFrames() {\n\n\t\treturn this.frames;\n\n\t}\n\n\t/**\n\t * Returns the timestamp for a given render context.\n\t *\n\t * @param {string} uid - A unique identifier for the render context.\n\t * @return {?number} The timestamp, or undefined if not available.\n\t */\n\tgetTimestamp( uid ) {\n\n\t\tlet timestamp = this.timestamps.get( uid );\n\n\t\tif ( timestamp === undefined ) {\n\n\t\t\twarn( `TimestampQueryPool: No timestamp available for uid ${ uid }.` );\n\n\t\t\ttimestamp = 0;\n\n\t\t}\n\n\t\treturn timestamp;\n\n\t}\n\n\t/**\n\t * Returns whether a timestamp is available for a given render context.\n\t *\n\t * @param {string} uid - A unique identifier for the render context.\n\t * @return {boolean} True if a timestamp is available, false otherwise.\n\t */\n\thasTimestamp( uid ) {\n\n\t\treturn this.timestamps.has( uid );\n\n\t}\n\n\t/**\n\t * Allocate queries for a specific uid.\n\t *\n\t * @abstract\n\t * @param {string} uid - A unique identifier for the render context.\n\t * @param {number} frameId - The current frame identifier.\n\t * @returns {?number}\n\t */\n\tallocateQueriesForContext( /* uid, frameId */ ) {}\n\n\t/**\n\t * Resolve all timestamps and return data (or process them).\n\t *\n\t * @abstract\n\t * @async\n\t * @returns {Promise<number>|number} The resolved timestamp value.\n\t */\n\tasync resolveQueriesAsync() {}\n\n\t/**\n\t * Dispose of the query pool.\n\t *\n\t * @abstract\n\t */\n\tdispose() {}\n\n}\n\n/**\n * Manages a pool of WebGL timestamp queries for performance measurement.\n * Handles creation, execution, and resolution of timer queries using WebGL extensions.\n *\n * @augments TimestampQueryPool\n */\nclass WebGLTimestampQueryPool extends TimestampQueryPool {\n\n\t/**\n\t * Creates a new WebGL timestamp query pool.\n\t *\n\t * @param {WebGLRenderingContext|WebGL2RenderingContext} gl - The WebGL context.\n\t * @param {string} type - The type identifier for this query pool.\n\t * @param {number} [maxQueries=2048] - Maximum number of queries this pool can hold.\n\t */\n\tconstructor( gl, type, maxQueries = 2048 ) {\n\n\t\tsuper( maxQueries );\n\n\t\tthis.gl = gl;\n\t\tthis.type = type;\n\n\t\t// Check for timer query extensions\n\t\tthis.ext = gl.getExtension( 'EXT_disjoint_timer_query_webgl2' ) ||\n\t\t\t\t  gl.getExtension( 'EXT_disjoint_timer_query' );\n\n\t\tif ( ! this.ext ) {\n\n\t\t\twarn( 'EXT_disjoint_timer_query not supported; timestamps will be disabled.' );\n\t\t\tthis.trackTimestamp = false;\n\t\t\treturn;\n\n\t\t}\n\n\t\t// Create query objects\n\t\tthis.queries = [];\n\t\tfor ( let i = 0; i < this.maxQueries; i ++ ) {\n\n\t\t\tthis.queries.push( gl.createQuery() );\n\n\t\t}\n\n\t\tthis.activeQuery = null;\n\t\tthis.queryStates = new Map(); // Track state of each query: 'inactive', 'started', 'ended'\n\n\t}\n\n\t/**\n\t * Allocates a pair of queries for a given render context.\n\t *\n\t * @param {string} uid - A unique identifier for the render context.\n\t * @returns {?number} The base offset for the allocated queries, or null if allocation failed.\n\t */\n\tallocateQueriesForContext( uid ) {\n\n\t\tif ( ! this.trackTimestamp ) return null;\n\n\t\t// Check if we have enough space for a new query pair\n\t\tif ( this.currentQueryIndex + 2 > this.maxQueries ) {\n\n\t\t\twarnOnce( `WebGPUTimestampQueryPool [${ this.type }]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${ this.type.toUpperCase() } ).` );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst baseOffset = this.currentQueryIndex;\n\t\tthis.currentQueryIndex += 2;\n\n\t\t// Initialize query states\n\t\tthis.queryStates.set( baseOffset, 'inactive' );\n\t\tthis.queryOffsets.set( uid, baseOffset );\n\n\t\treturn baseOffset;\n\n\t}\n\n\t/**\n\t * Begins a timestamp query for the specified render context.\n\t *\n\t * @param {string} uid - A unique identifier for the render context.\n\t */\n\tbeginQuery( uid ) {\n\n\t\tif ( ! this.trackTimestamp || this.isDisposed ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst baseOffset = this.queryOffsets.get( uid );\n\t\tif ( baseOffset == null ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// Don't start a new query if there's an active one\n\t\tif ( this.activeQuery !== null ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst query = this.queries[ baseOffset ];\n\t\tif ( ! query ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\ttry {\n\n\t\t\t// Only begin if query is inactive\n\t\t\tif ( this.queryStates.get( baseOffset ) === 'inactive' ) {\n\n\t\t\t\tthis.gl.beginQuery( this.ext.TIME_ELAPSED_EXT, query );\n\t\t\t\tthis.activeQuery = baseOffset;\n\t\t\t\tthis.queryStates.set( baseOffset, 'started' );\n\n\t\t\t}\n\n\t\t} catch ( e ) {\n\n\t\t\terror( 'Error in beginQuery:', e );\n\t\t\tthis.activeQuery = null;\n\t\t\tthis.queryStates.set( baseOffset, 'inactive' );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Ends the active timestamp query for the specified render context.\n\t *\n\t * @param {string} uid - A unique identifier for the render context.\n\t */\n\tendQuery( uid ) {\n\n\t\tif ( ! this.trackTimestamp || this.isDisposed ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst baseOffset = this.queryOffsets.get( uid );\n\t\tif ( baseOffset == null ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\t// Only end if this is the active query\n\t\tif ( this.activeQuery !== baseOffset ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\ttry {\n\n\t\t\tthis.gl.endQuery( this.ext.TIME_ELAPSED_EXT );\n\t\t\tthis.queryStates.set( baseOffset, 'ended' );\n\t\t\tthis.activeQuery = null;\n\n\t\t} catch ( e ) {\n\n\t\t\terror( 'Error in endQuery:', e );\n\t\t\t// Reset state on error\n\t\t\tthis.queryStates.set( baseOffset, 'inactive' );\n\t\t\tthis.activeQuery = null;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Asynchronously resolves all completed queries and returns the total duration.\n\t *\n\t * @async\n\t * @returns {Promise<number>} The total duration in milliseconds, or the last valid value if resolution fails.\n\t */\n\tasync resolveQueriesAsync() {\n\n\t\tif ( ! this.trackTimestamp || this.pendingResolve ) {\n\n\t\t\treturn this.lastValue;\n\n\t\t}\n\n\t\tthis.pendingResolve = true;\n\n\t\ttry {\n\n\t\t\t// Wait for all ended queries to complete\n\t\t\tconst resolvePromises = new Map();\n\n\t\t\tfor ( const [ uid, baseOffset ] of this.queryOffsets ) {\n\n\t\t\t\tconst state = this.queryStates.get( baseOffset );\n\n\t\t\t\tif ( state === 'ended' ) {\n\n\t\t\t\t\tconst query = this.queries[ baseOffset ];\n\t\t\t\t\tresolvePromises.set( uid, this.resolveQuery( query ) );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( resolvePromises.size === 0 ) {\n\n\t\t\t\treturn this.lastValue;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tconst framesDuration = {};\n\n\t\t\tconst frames = [];\n\n\t\t\tfor ( const [ uid, promise ] of resolvePromises ) {\n\n\t\t\t\tconst match = uid.match( /^(.*):f(\\d+)$/ );\n\t\t\t\tconst frame = parseInt( match[ 2 ] );\n\n\t\t\t\tif ( frames.includes( frame ) === false ) {\n\n\t\t\t\t\tframes.push( frame );\n\n\t\t\t\t}\n\n\t\t\t\tif ( framesDuration[ frame ] === undefined ) framesDuration[ frame ] = 0;\n\n\t\t\t\tconst duration = await promise;\n\n\t\t\t\tthis.timestamps.set( uid, duration );\n\n\t\t\t\tframesDuration[ frame ] += duration;\n\n\t\t\t}\n\n\t\t\t// Return the total duration of the last frame\n\t\t\tconst totalDuration = framesDuration[ frames[ frames.length - 1 ] ];\n\n\t\t\t// Store the last valid result\n\t\t\tthis.lastValue = totalDuration;\n\t\t\tthis.frames = frames;\n\n\t\t\t// Reset states\n\t\t\tthis.currentQueryIndex = 0;\n\t\t\tthis.queryOffsets.clear();\n\t\t\tthis.queryStates.clear();\n\t\t\tthis.activeQuery = null;\n\n\t\t\treturn totalDuration;\n\n\t\t} catch ( e ) {\n\n\t\t\terror( 'Error resolving queries:', e );\n\t\t\treturn this.lastValue;\n\n\t\t} finally {\n\n\t\t\tthis.pendingResolve = false;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Resolves a single query, checking for completion and disjoint operation.\n\t *\n\t * @async\n\t * @param {WebGLQuery} query - The query object to resolve.\n\t * @returns {Promise<number>} The elapsed time in milliseconds.\n\t */\n\tasync resolveQuery( query ) {\n\n\t\treturn new Promise( ( resolve ) => {\n\n\t\t\tif ( this.isDisposed ) {\n\n\t\t\t\tresolve( this.lastValue );\n\t\t\t\treturn;\n\n\t\t\t}\n\n\t\t\tlet timeoutId;\n\t\t\tlet isResolved = false;\n\n\t\t\tconst cleanup = () => {\n\n\t\t\t\tif ( timeoutId ) {\n\n\t\t\t\t\tclearTimeout( timeoutId );\n\t\t\t\t\ttimeoutId = null;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t\tconst finalizeResolution = ( value ) => {\n\n\t\t\t\tif ( ! isResolved ) {\n\n\t\t\t\t\tisResolved = true;\n\t\t\t\t\tcleanup();\n\t\t\t\t\tresolve( value );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t\tconst checkQuery = () => {\n\n\t\t\t\tif ( this.isDisposed ) {\n\n\t\t\t\t\tfinalizeResolution( this.lastValue );\n\t\t\t\t\treturn;\n\n\t\t\t\t}\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Check if the GPU timer was disjoint (i.e., timing was unreliable)\n\t\t\t\t\tconst disjoint = this.gl.getParameter( this.ext.GPU_DISJOINT_EXT );\n\t\t\t\t\tif ( disjoint ) {\n\n\t\t\t\t\t\tfinalizeResolution( this.lastValue );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst available = this.gl.getQueryParameter( query, this.gl.QUERY_RESULT_AVAILABLE );\n\t\t\t\t\tif ( ! available ) {\n\n\t\t\t\t\t\ttimeoutId = setTimeout( checkQuery, 1 );\n\t\t\t\t\t\treturn;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst elapsed = this.gl.getQueryParameter( query, this.gl.QUERY_RESULT );\n\t\t\t\t\tresolve( Number( elapsed ) / 1e6 ); // Convert nanoseconds to milliseconds\n\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\terror( 'Error checking query:', e );\n\t\t\t\t\tresolve( this.lastValue );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t\tcheckQuery();\n\n\t\t} );\n\n\t}\n\n\t/**\n\t * Releases all resources held by this query pool.\n\t * This includes deleting all query objects and clearing internal state.\n\t */\n\tdispose() {\n\n\t\tif ( this.isDisposed ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.isDisposed = true;\n\n\t\tif ( ! this.trackTimestamp ) return;\n\n\t\tfor ( const query of this.queries ) {\n\n\t\t\tthis.gl.deleteQuery( query );\n\n\t\t}\n\n\t\tthis.queries = [];\n\t\tthis.queryStates.clear();\n\t\tthis.queryOffsets.clear();\n\t\tthis.lastValue = 0;\n\t\tthis.activeQuery = null;\n\n\t}\n\n}\n\n/**\n * A backend implementation targeting WebGL 2.\n *\n * @private\n * @augments Backend\n */\nclass WebGLBackend extends Backend {\n\n\t/**\n\t * WebGLBackend options.\n\t *\n\t * @typedef {Object} WebGLBackend~Options\n\t * @property {boolean} [logarithmicDepthBuffer=false] - Whether logarithmic depth buffer is enabled or not.\n\t * @property {boolean} [alpha=true] - Whether the default framebuffer (which represents the final contents of the canvas) should be transparent or opaque.\n\t * @property {boolean} [depth=true] - Whether the default framebuffer should have a depth buffer or not.\n\t * @property {boolean} [stencil=false] - Whether the default framebuffer should have a stencil buffer or not.\n\t * @property {boolean} [antialias=false] - Whether MSAA as the default anti-aliasing should be enabled or not.\n\t * @property {number} [samples=0] - When `antialias` is `true`, `4` samples are used by default. Set this parameter to any other integer value than 0 to overwrite the default.\n\t * @property {boolean} [forceWebGL=false] - If set to `true`, the renderer uses a WebGL 2 backend no matter if WebGPU is supported or not.\n\t * @property {WebGL2RenderingContext} [context=undefined] - A WebGL 2 rendering context.\n\t */\n\n\t/**\n\t * Constructs a new WebGPU backend.\n\t *\n\t * @param {WebGLBackend~Options} [parameters] - The configuration parameter.\n\t */\n\tconstructor( parameters = {} ) {\n\n\t\tsuper( parameters );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGLBackend = true;\n\n\t\t/**\n\t\t * A reference to a backend module holding shader attribute-related\n\t\t * utility functions.\n\t\t *\n\t\t * @type {?WebGLAttributeUtils}\n\t\t * @default null\n\t\t */\n\t\tthis.attributeUtils = null;\n\n\t\t/**\n\t\t * A reference to a backend module holding extension-related\n\t\t * utility functions.\n\t\t *\n\t\t * @type {?WebGLExtensions}\n\t\t * @default null\n\t\t */\n\t\tthis.extensions = null;\n\n\t\t/**\n\t\t * A reference to a backend module holding capability-related\n\t\t * utility functions.\n\t\t *\n\t\t * @type {?WebGLCapabilities}\n\t\t * @default null\n\t\t */\n\t\tthis.capabilities = null;\n\n\t\t/**\n\t\t * A reference to a backend module holding texture-related\n\t\t * utility functions.\n\t\t *\n\t\t * @type {?WebGLTextureUtils}\n\t\t * @default null\n\t\t */\n\t\tthis.textureUtils = null;\n\n\t\t/**\n\t\t * A reference to a backend module holding renderer-related\n\t\t * utility functions.\n\t\t *\n\t\t * @type {?WebGLBufferRenderer}\n\t\t * @default null\n\t\t */\n\t\tthis.bufferRenderer = null;\n\n\t\t/**\n\t\t * A reference to the rendering context.\n\t\t *\n\t\t * @type {?WebGL2RenderingContext}\n\t\t * @default null\n\t\t */\n\t\tthis.gl = null;\n\n\t\t/**\n\t\t * A reference to a backend module holding state-related\n\t\t * utility functions.\n\t\t *\n\t\t * @type {?WebGLState}\n\t\t * @default null\n\t\t */\n\t\tthis.state = null;\n\n\t\t/**\n\t\t * A reference to a backend module holding common\n\t\t * utility functions.\n\t\t *\n\t\t * @type {?WebGLUtils}\n\t\t * @default null\n\t\t */\n\t\tthis.utils = null;\n\n\t\t/**\n\t\t * Dictionary for caching VAOs.\n\t\t *\n\t\t * @type {Object<string,WebGLVertexArrayObject>}\n\t\t */\n\t\tthis.vaoCache = {};\n\n\t\t/**\n\t\t * Dictionary for caching transform feedback objects.\n\t\t *\n\t\t * @type {Object<string,WebGLTransformFeedback>}\n\t\t */\n\t\tthis.transformFeedbackCache = {};\n\n\t\t/**\n\t\t * Controls if `gl.RASTERIZER_DISCARD` should be enabled or not.\n\t\t * Only relevant when using compute shaders.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.discard = false;\n\n\t\t/**\n\t\t * A reference to the `EXT_disjoint_timer_query_webgl2` extension. `null` if the\n\t\t * device does not support the extension.\n\t\t *\n\t\t * @type {?EXTDisjointTimerQueryWebGL2}\n\t\t * @default null\n\t\t */\n\t\tthis.disjoint = null;\n\n\t\t/**\n\t\t* A reference to the `KHR_parallel_shader_compile` extension. `null` if the\n\t\t* device does not support the extension.\n\t\t*\n\t\t* @type {?KHRParallelShaderCompile}\n\t\t* @default null\n\t\t*/\n\t\tthis.parallel = null;\n\n\t\t/**\n\t\t * A reference to the current render context.\n\t\t *\n\t\t * @private\n\t\t * @type {RenderContext}\n\t\t * @default null\n\t\t */\n\t\tthis._currentContext = null;\n\n\t\t/**\n\t\t * A unique collection of bindings.\n\t\t *\n\t\t * @private\n\t\t * @type {WeakSet<Array<BindGroup>>}\n\t\t */\n\t\tthis._knownBindings = new WeakSet();\n\n\n\t\t/**\n\t\t * Whether the device supports framebuffers invalidation or not.\n\t\t *\n\t\t * @private\n\t\t * @type {boolean}\n\t\t */\n\t\tthis._supportsInvalidateFramebuffer = typeof navigator === 'undefined' ? false : /OculusBrowser/g.test( navigator.userAgent );\n\n\t\t/**\n\t\t * The target framebuffer when rendering with\n\t\t * the WebXR device API.\n\t\t *\n\t\t * @private\n\t\t * @type {?WebGLFramebuffer}\n\t\t * @default null\n\t\t */\n\t\tthis._xrFramebuffer = null;\n\n\t}\n\n\t/**\n\t * Initializes the backend so it is ready for usage.\n\t *\n\t * @param {Renderer} renderer - The renderer.\n\t */\n\tinit( renderer ) {\n\n\t\tsuper.init( renderer );\n\n\t\t//\n\n\t\tconst parameters = this.parameters;\n\n\t\tconst contextAttributes = {\n\t\t\tantialias: renderer.currentSamples > 0,\n\t\t\talpha: true, // always true for performance reasons\n\t\t\tdepth: renderer.depth,\n\t\t\tstencil: renderer.stencil\n\t\t};\n\n\t\tconst glContext = ( parameters.context !== undefined ) ? parameters.context : renderer.domElement.getContext( 'webgl2', contextAttributes );\n\n\t \tfunction onContextLost( event ) {\n\n\t\t\tevent.preventDefault();\n\n\t\t\tconst contextLossInfo = {\n\t\t\t\tapi: 'WebGL',\n\t\t\t\tmessage: event.statusMessage || 'Unknown reason',\n\t\t\t\treason: null,\n\t\t\t\toriginalEvent: event\n\t\t\t};\n\n\t\t\trenderer.onDeviceLost( contextLossInfo );\n\n\t\t}\n\n\t\tthis._onContextLost = onContextLost;\n\n\t\trenderer.domElement.addEventListener( 'webglcontextlost', onContextLost, false );\n\n\t\tthis.gl = glContext;\n\n\t\tthis.extensions = new WebGLExtensions( this );\n\t\tthis.capabilities = new WebGLCapabilities( this );\n\t\tthis.attributeUtils = new WebGLAttributeUtils( this );\n\t\tthis.textureUtils = new WebGLTextureUtils( this );\n\t\tthis.bufferRenderer = new WebGLBufferRenderer( this );\n\n\t\tthis.state = new WebGLState( this );\n\t\tthis.utils = new WebGLUtils( this );\n\n\t\tthis.extensions.get( 'EXT_color_buffer_float' );\n\t\tthis.extensions.get( 'WEBGL_clip_cull_distance' );\n\t\tthis.extensions.get( 'OES_texture_float_linear' );\n\t\tthis.extensions.get( 'EXT_color_buffer_half_float' );\n\t\tthis.extensions.get( 'WEBGL_multisampled_render_to_texture' );\n\t\tthis.extensions.get( 'WEBGL_render_shared_exponent' );\n\t\tthis.extensions.get( 'WEBGL_multi_draw' );\n\t\tthis.extensions.get( 'OVR_multiview2' );\n\n\t\tthis.disjoint = this.extensions.get( 'EXT_disjoint_timer_query_webgl2' );\n\t\tthis.parallel = this.extensions.get( 'KHR_parallel_shader_compile' );\n\t\tthis.drawBuffersIndexedExt = this.extensions.get( 'OES_draw_buffers_indexed' );\n\n\t}\n\n\t/**\n\t * The coordinate system of the backend.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget coordinateSystem() {\n\n\t\treturn WebGLCoordinateSystem;\n\n\t}\n\n\t/**\n\t * This method performs a readback operation by moving buffer data from\n\t * a storage buffer attribute from the GPU to the CPU.\n\t *\n\t * @async\n\t * @param {StorageBufferAttribute} attribute - The storage buffer attribute.\n\t * @return {Promise<ArrayBuffer>} A promise that resolves with the buffer data when the data are ready.\n\t */\n\tasync getArrayBufferAsync( attribute ) {\n\n\t\treturn await this.attributeUtils.getArrayBufferAsync( attribute );\n\n\t}\n\n\t/**\n\t * Ensures the backend is XR compatible.\n\t *\n\t * @async\n\t * @return {Promise} A Promise that resolve when the renderer is XR compatible.\n\t */\n\tasync makeXRCompatible() {\n\n\t\tconst attributes = this.gl.getContextAttributes();\n\n\t\tif ( attributes.xrCompatible !== true ) {\n\n\t\t\tawait this.gl.makeXRCompatible();\n\n\t\t}\n\n\t}\n\t/**\n\t * Sets the XR rendering destination.\n\t *\n\t * @param {WebGLFramebuffer} xrFramebuffer - The XR framebuffer.\n\t */\n\tsetXRTarget( xrFramebuffer ) {\n\n\t\tthis._xrFramebuffer = xrFramebuffer;\n\n\t}\n\n\t/**\n\t * Configures the given XR render target with external textures.\n\t *\n\t * This method is only relevant when using the WebXR Layers API.\n\t *\n\t * @param {XRRenderTarget} renderTarget - The XR render target.\n\t * @param {WebGLTexture} colorTexture - A native color texture.\n\t * @param {?WebGLTexture} [depthTexture=null] - A native depth texture.\n\t */\n\tsetXRRenderTargetTextures( renderTarget, colorTexture, depthTexture = null ) {\n\n\t\tconst gl = this.gl;\n\n\t\tthis.set( renderTarget.texture, { textureGPU: colorTexture, glInternalFormat: gl.RGBA8 } ); // see #24698 why RGBA8 and not SRGB8_ALPHA8 is used\n\n\t\tif ( depthTexture !== null ) {\n\n\t\t\tconst glInternalFormat = renderTarget.stencilBuffer ? gl.DEPTH24_STENCIL8 : gl.DEPTH_COMPONENT24;\n\n\t\t\tthis.set( renderTarget.depthTexture, { textureGPU: depthTexture, glInternalFormat: glInternalFormat } );\n\n\t\t\t// The multisample_render_to_texture extension doesn't work properly if there\n\t\t\t// are midframe flushes and an external depth texture.\n\t\t\tif ( ( this.extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true ) && renderTarget._autoAllocateDepthBuffer === true && renderTarget.multiview === false ) {\n\n\t\t\t\twarn( 'WebGLBackend: Render-to-texture extension was disabled because an external texture was provided' );\n\n\t\t\t}\n\n\t\t\trenderTarget._autoAllocateDepthBuffer = false;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Inits a time stamp query for the given render context.\n\t *\n\t * @param {string} type - The type of the timestamp query.\n\t * @param {string} uid - A unique identifier for the timestamp query.\n\t */\n\tinitTimestampQuery( type, uid ) {\n\n\t\tif ( ! this.disjoint || ! this.trackTimestamp ) return;\n\n\t\tif ( ! this.timestampQueryPool[ type ] ) {\n\n\t\t\t// TODO: Variable maxQueries?\n\t\t\tthis.timestampQueryPool[ type ] = new WebGLTimestampQueryPool( this.gl, type, 2048 );\n\n\t\t}\n\n\t\tconst timestampQueryPool = this.timestampQueryPool[ type ];\n\n\t\tconst baseOffset = timestampQueryPool.allocateQueriesForContext( uid );\n\n\t\tif ( baseOffset !== null ) {\n\n\t\t\ttimestampQueryPool.beginQuery( uid );\n\n\t\t}\n\n\t}\n\n\t// timestamp utils\n\n\t/**\n\t * Prepares the timestamp buffer.\n\t *\n\t * @param {string} type - The type of the timestamp query.\n\t * @param {string} uid - A unique identifier for the timestamp query.\n\t */\n\tprepareTimestampBuffer( type, uid ) {\n\n\t\tif ( ! this.disjoint || ! this.trackTimestamp ) return;\n\n\t\tconst timestampQueryPool = this.timestampQueryPool[ type ];\n\n\t\ttimestampQueryPool.endQuery( uid );\n\n\t}\n\n\n\t/**\n\t * Returns the backend's rendering context.\n\t *\n\t * @return {WebGL2RenderingContext} The rendering context.\n\t */\n\tgetContext() {\n\n\t\treturn this.gl;\n\n\t}\n\n\t/**\n\t * This method is executed at the beginning of a render call and prepares\n\t * the WebGL state for upcoming render calls\n\t *\n\t * @param {RenderContext} renderContext - The render context.\n\t */\n\tbeginRender( renderContext ) {\n\n\t\tconst { state } = this;\n\t\tconst renderContextData = this.get( renderContext );\n\n\t\t//\n\n\t\tif ( renderContext.viewport ) {\n\n\t\t\tthis.updateViewport( renderContext );\n\n\t\t} else {\n\n\t\t\tconst { width, height } = this.getDrawingBufferSize();\n\t\t\tstate.viewport( 0, 0, width, height );\n\n\t\t}\n\n\t\tif ( renderContext.scissor ) {\n\n\t\t\tconst { x, y, width, height } = renderContext.scissorValue;\n\n\t\t\tstate.scissor( x, renderContext.height - height - y, width, height );\n\n\t\t}\n\n\t\t//\n\n\t\tthis.initTimestampQuery( TimestampQuery.RENDER, this.getTimestampUID( renderContext ) );\n\n\t\trenderContextData.previousContext = this._currentContext;\n\t\tthis._currentContext = renderContext;\n\n\t\tthis._setFramebuffer( renderContext );\n\t\tthis.clear( renderContext.clearColor, renderContext.clearDepth, renderContext.clearStencil, renderContext, false );\n\n\t\tconst occlusionQueryCount = renderContext.occlusionQueryCount;\n\n\t\tif ( occlusionQueryCount > 0 ) {\n\n\t\t\t// Get a reference to the array of objects with queries. The renderContextData property\n\t\t\t// can be changed by another render pass before the async reading of all previous queries complete\n\t\t\trenderContextData.currentOcclusionQueries = renderContextData.occlusionQueries;\n\t\t\trenderContextData.currentOcclusionQueryObjects = renderContextData.occlusionQueryObjects;\n\n\t\t\trenderContextData.lastOcclusionObject = null;\n\t\t\trenderContextData.occlusionQueries = new Array( occlusionQueryCount );\n\t\t\trenderContextData.occlusionQueryObjects = new Array( occlusionQueryCount );\n\t\t\trenderContextData.occlusionQueryIndex = 0;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * This method is executed at the end of a render call and finalizes work\n\t * after draw calls.\n\t *\n\t * @param {RenderContext} renderContext - The render context.\n\t */\n\tfinishRender( renderContext ) {\n\n\t\tconst { gl, state } = this;\n\t\tconst renderContextData = this.get( renderContext );\n\t\tconst previousContext = renderContextData.previousContext;\n\n\t\tstate.resetVertexState();\n\n\t\tconst occlusionQueryCount = renderContext.occlusionQueryCount;\n\n\t\tif ( occlusionQueryCount > 0 ) {\n\n\t\t\tif ( occlusionQueryCount > renderContextData.occlusionQueryIndex ) {\n\n\t\t\t\tgl.endQuery( gl.ANY_SAMPLES_PASSED );\n\n\t\t\t}\n\n\t\t\tthis.resolveOccludedAsync( renderContext );\n\n\t\t}\n\n\t\tconst textures = renderContext.textures;\n\n\t\tif ( textures !== null ) {\n\n\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\tconst texture = textures[ i ];\n\n\t\t\t\tif ( texture.generateMipmaps ) {\n\n\t\t\t\t\tthis.generateMipmaps( texture );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis._currentContext = previousContext;\n\n\t\tthis._resolveRenderTarget( renderContext );\n\n\t\tif ( previousContext !== null ) {\n\n\t\t\tthis._setFramebuffer( previousContext );\n\n\t\t\tif ( previousContext.viewport ) {\n\n\t\t\t\tthis.updateViewport( previousContext );\n\n\t\t\t} else {\n\n\t\t\t\tconst { width, height } = this.getDrawingBufferSize();\n\t\t\t\tstate.viewport( 0, 0, width, height );\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.prepareTimestampBuffer( TimestampQuery.RENDER, this.getTimestampUID( renderContext ) );\n\n\t}\n\n\t/**\n\t * This method processes the result of occlusion queries and writes it\n\t * into render context data.\n\t *\n\t * @async\n\t * @param {RenderContext} renderContext - The render context.\n\t */\n\tresolveOccludedAsync( renderContext ) {\n\n\t\tconst renderContextData = this.get( renderContext );\n\n\t\t// handle occlusion query results\n\n\t\tconst { currentOcclusionQueries, currentOcclusionQueryObjects } = renderContextData;\n\n\t\tif ( currentOcclusionQueries && currentOcclusionQueryObjects ) {\n\n\t\t\tconst occluded = new WeakSet();\n\t\t\tconst { gl } = this;\n\n\t\t\trenderContextData.currentOcclusionQueryObjects = null;\n\t\t\trenderContextData.currentOcclusionQueries = null;\n\n\t\t\tconst check = () => {\n\n\t\t\t\tlet completed = 0;\n\n\t\t\t\t// check all queries and requeue as appropriate\n\t\t\t\tfor ( let i = 0; i < currentOcclusionQueries.length; i ++ ) {\n\n\t\t\t\t\tconst query = currentOcclusionQueries[ i ];\n\n\t\t\t\t\tif ( query === null ) continue;\n\n\t\t\t\t\tif ( gl.getQueryParameter( query, gl.QUERY_RESULT_AVAILABLE ) ) {\n\n\t\t\t\t\t\tif ( gl.getQueryParameter( query, gl.QUERY_RESULT ) === 0 ) occluded.add( currentOcclusionQueryObjects[ i ] );\n\n\t\t\t\t\t\tcurrentOcclusionQueries[ i ] = null;\n\t\t\t\t\t\tgl.deleteQuery( query );\n\n\t\t\t\t\t\tcompleted ++;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( completed < currentOcclusionQueries.length ) {\n\n\t\t\t\t\trequestAnimationFrame( check );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderContextData.occluded = occluded;\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t\tcheck();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns `true` if the given 3D object is fully occluded by other\n\t * 3D objects in the scene.\n\t *\n\t * @param {RenderContext} renderContext - The render context.\n\t * @param {Object3D} object - The 3D object to test.\n\t * @return {boolean} Whether the 3D object is fully occluded or not.\n\t */\n\tisOccluded( renderContext, object ) {\n\n\t\tconst renderContextData = this.get( renderContext );\n\n\t\treturn renderContextData.occluded && renderContextData.occluded.has( object );\n\n\t}\n\n\t/**\n\t * Updates the viewport with the values from the given render context.\n\t *\n\t * @param {RenderContext} renderContext - The render context.\n\t */\n\tupdateViewport( renderContext ) {\n\n\t\tconst { state } = this;\n\t\tconst { x, y, width, height } = renderContext.viewportValue;\n\n\t\tstate.viewport( x, renderContext.height - height - y, width, height );\n\n\t}\n\n\t/**\n\t * Defines the scissor test.\n\t *\n\t * @param {boolean} boolean - Whether the scissor test should be enabled or not.\n\t */\n\tsetScissorTest( boolean ) {\n\n\t\tconst state = this.state;\n\n\t\tstate.setScissorTest( boolean );\n\n\t}\n\n\t/**\n\t * Returns the clear color and alpha into a single\n\t * color object.\n\t *\n\t * @return {Color4} The clear color.\n\t */\n\tgetClearColor() {\n\n\t\tconst clearColor = super.getClearColor();\n\n\t\t// Since the canvas is always created with alpha: true,\n\t\t// WebGL must always premultiply the clear color.\n\n\t\tclearColor.r *= clearColor.a;\n\t\tclearColor.g *= clearColor.a;\n\t\tclearColor.b *= clearColor.a;\n\n\t\treturn clearColor;\n\n\t}\n\n\t/**\n\t * Performs a clear operation.\n\t *\n\t * @param {boolean} color - Whether the color buffer should be cleared or not.\n\t * @param {boolean} depth - Whether the depth buffer should be cleared or not.\n\t * @param {boolean} stencil - Whether the stencil buffer should be cleared or not.\n\t * @param {?Object} [descriptor=null] - The render context of the current set render target.\n\t * @param {boolean} [setFrameBuffer=true] - Controls whether the intermediate framebuffer should be set or not.\n\t * @param {boolean} [resolveRenderTarget=true] - Controls whether an active render target should be resolved\n\t * or not. Only relevant for explicit clears.\n\t */\n\tclear( color, depth, stencil, descriptor = null, setFrameBuffer = true, resolveRenderTarget = true ) {\n\n\t\tconst { gl, renderer } = this;\n\n\t\tif ( descriptor === null ) {\n\n\t\t\tconst clearColor = this.getClearColor();\n\n\t\t\tdescriptor = {\n\t\t\t\ttextures: null,\n\t\t\t\tclearColorValue: clearColor\n\t\t\t};\n\n\t\t}\n\n\t\t//\n\n\t\tlet clear = 0;\n\n\t\tif ( color ) clear |= gl.COLOR_BUFFER_BIT;\n\t\tif ( depth ) clear |= gl.DEPTH_BUFFER_BIT;\n\t\tif ( stencil ) clear |= gl.STENCIL_BUFFER_BIT;\n\n\t\tif ( clear !== 0 ) {\n\n\t\t\tlet clearColor;\n\n\t\t\tif ( descriptor.clearColorValue ) {\n\n\t\t\t\tclearColor = descriptor.clearColorValue;\n\n\t\t\t} else {\n\n\t\t\t\tclearColor = this.getClearColor();\n\n\t\t\t}\n\n\t\t\tconst clearDepth = renderer.getClearDepth();\n\t\t\tconst clearStencil = renderer.getClearStencil();\n\n\t\t\tif ( depth ) this.state.setDepthMask( true );\n\n\t\t\tif ( descriptor.textures === null ) {\n\n\t\t\t\tgl.clearColor( clearColor.r, clearColor.g, clearColor.b, clearColor.a );\n\t\t\t\tgl.clear( clear );\n\n\t\t\t} else {\n\n\t\t\t\tif ( setFrameBuffer ) this._setFramebuffer( descriptor );\n\n\t\t\t\tif ( color ) {\n\n\t\t\t\t\tfor ( let i = 0; i < descriptor.textures.length; i ++ ) {\n\n\t\t\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\t\t\tgl.clearBufferfv( gl.COLOR, i, [ clearColor.r, clearColor.g, clearColor.b, clearColor.a ] );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgl.clearBufferfv( gl.COLOR, i, [ 0, 0, 0, 1 ] );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( depth && stencil ) {\n\n\t\t\t\t\tgl.clearBufferfi( gl.DEPTH_STENCIL, 0, clearDepth, clearStencil );\n\n\t\t\t\t} else if ( depth ) {\n\n\t\t\t\t\tgl.clearBufferfv( gl.DEPTH, 0, [ clearDepth ] );\n\n\t\t\t\t} else if ( stencil ) {\n\n\t\t\t\t\tgl.clearBufferiv( gl.STENCIL, 0, [ clearStencil ] );\n\n\t\t\t\t}\n\n\t\t\t\tif ( setFrameBuffer && resolveRenderTarget ) this._resolveRenderTarget( descriptor );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * This method is executed at the beginning of a compute call and\n\t * prepares the state for upcoming compute tasks.\n\t *\n\t * @param {Node|Array<Node>} computeGroup - The compute node(s).\n\t */\n\tbeginCompute( computeGroup ) {\n\n\t\tconst { state, gl } = this;\n\n\t\t//\n\n\t\tstate.bindFramebuffer( gl.FRAMEBUFFER, null );\n\t\tthis.initTimestampQuery( TimestampQuery.COMPUTE, this.getTimestampUID( computeGroup ) );\n\n\t}\n\n\t/**\n\t * Executes a compute command for the given compute node.\n\t *\n\t * @param {Node|Array<Node>} computeGroup - The group of compute nodes of a compute call. Can be a single compute node.\n\t * @param {Node} computeNode - The compute node.\n\t * @param {Array<BindGroup>} bindings - The bindings.\n\t * @param {ComputePipeline} pipeline - The compute pipeline.\n\t * @param {?number} [count=null] - The count of compute invocations. If `null`, the count is determined by the compute node.\n\t */\n\tcompute( computeGroup, computeNode, bindings, pipeline, count = null ) {\n\n\t\tconst { state, gl } = this;\n\n\t\tif ( this.discard === false ) {\n\n\t\t\t// required here to handle async behaviour of render.compute()\n\t\t\tstate.enable( gl.RASTERIZER_DISCARD );\n\t\t\tthis.discard = true;\n\n\t\t}\n\n\t\tconst { programGPU, transformBuffers, attributes } = this.get( pipeline );\n\n\t\tconst vaoKey = this._getVaoKey( attributes );\n\n\t\tconst vaoGPU = this.vaoCache[ vaoKey ];\n\n\t\tif ( vaoGPU === undefined ) {\n\n\t\t\tthis.vaoCache[ vaoKey ] = this._createVao( attributes );\n\n\t\t} else {\n\n\t\t\tstate.setVertexState( vaoGPU );\n\n\t\t}\n\n\t\tstate.useProgram( programGPU );\n\n\t\tthis._bindUniforms( bindings );\n\n\t\tconst transformFeedbackGPU = this._getTransformFeedback( transformBuffers );\n\n\t\tgl.bindTransformFeedback( gl.TRANSFORM_FEEDBACK, transformFeedbackGPU );\n\t\tgl.beginTransformFeedback( gl.POINTS );\n\n\t\tcount = ( count !== null ) ? count : computeNode.count;\n\n\t\tif ( Array.isArray( count ) ) {\n\n\t\t\twarnOnce( 'WebGLBackend.compute(): The count parameter must be a single number, not an array.' );\n\n\t\t\tcount = count[ 0 ];\n\n\t\t} else if ( count && typeof count === 'object' && count.isIndirectStorageBufferAttribute ) {\n\n\t\t\twarnOnce( 'WebGLBackend.compute(): The count parameter must be a single number, not IndirectStorageBufferAttribute' );\n\n\t\t\tcount = computeNode.count;\n\n\t\t}\n\n\t\tif ( attributes[ 0 ].isStorageInstancedBufferAttribute ) {\n\n\t\t\tgl.drawArraysInstanced( gl.POINTS, 0, 1, count );\n\n\t\t} else {\n\n\t\t\tgl.drawArrays( gl.POINTS, 0, count );\n\n\t\t}\n\n\t\tgl.endTransformFeedback();\n\t\tgl.bindTransformFeedback( gl.TRANSFORM_FEEDBACK, null );\n\n\t\t// switch active buffers\n\n\t\tfor ( let i = 0; i < transformBuffers.length; i ++ ) {\n\n\t\t\tconst dualAttributeData = transformBuffers[ i ];\n\n\t\t\tif ( dualAttributeData.pbo && this.has( dualAttributeData.pbo ) ) {\n\n\t\t\t\tthis.textureUtils.copyBufferToTexture( dualAttributeData.transformBuffer, dualAttributeData.pbo );\n\n\t\t\t}\n\n\t\t\tdualAttributeData.switchBuffers();\n\n\n\t\t}\n\n\t}\n\n\t/**\n\t * This method is executed at the end of a compute call and\n\t * finalizes work after compute tasks.\n\t *\n\t * @param {Node|Array<Node>} computeGroup - The compute node(s).\n\t */\n\tfinishCompute( computeGroup ) {\n\n\t\tconst { state, gl } = this;\n\n\t\tthis.discard = false;\n\n\t\tstate.disable( gl.RASTERIZER_DISCARD );\n\n\t\tthis.prepareTimestampBuffer( TimestampQuery.COMPUTE, this.getTimestampUID( computeGroup ) );\n\n\t\tif ( this._currentContext ) {\n\n\t\t\tthis._setFramebuffer( this._currentContext );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Internal to determine if the current render target is a render target array with depth 2D array texture.\n\t *\n\t * @param {RenderContext} renderContext - The render context.\n\t * @return {boolean} Whether the render target is a render target array with depth 2D array texture.\n\t *\n\t * @private\n\t */\n\t_isRenderCameraDepthArray( renderContext ) {\n\n\t\treturn renderContext.depthTexture && renderContext.depthTexture.isArrayTexture && renderContext.camera.isArrayCamera;\n\n\t}\n\n\t/**\n\t * Executes a draw command for the given render object.\n\t *\n\t * @param {RenderObject} renderObject - The render object to draw.\n\t * @param {Info} info - Holds a series of statistical information about the GPU memory and the rendering process.\n\t */\n\tdraw( renderObject/*, info*/ ) {\n\n\t\tconst { object, pipeline, material, context, hardwareClippingPlanes } = renderObject;\n\t\tconst { programGPU } = this.get( pipeline );\n\n\t\tconst { gl, state } = this;\n\n\t\tconst contextData = this.get( context );\n\n\t\tconst drawParams = renderObject.getDrawParameters();\n\n\t\tif ( drawParams === null ) return;\n\n\t\t//\n\n\t\tthis._bindUniforms( renderObject.getBindings() );\n\n\t\tconst frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );\n\n\t\tstate.setMaterial( material, frontFaceCW, hardwareClippingPlanes );\n\n\t\tif ( context.textures !== null && context.textures.length > 1 ) {\n\n\t\t\tstate.setMRTBlending( context.textures );\n\n\t\t}\n\n\t\tstate.useProgram( programGPU );\n\n\t\t// vertex state\n\n\t\tconst attributes = renderObject.getAttributes();\n\t\tconst attributesData = this.get( attributes );\n\n\t\tlet vaoGPU = attributesData.vaoGPU;\n\n\t\tif ( vaoGPU === undefined ) {\n\n\t\t\tconst vaoKey = this._getVaoKey( attributes );\n\n\t\t\tvaoGPU = this.vaoCache[ vaoKey ];\n\n\t\t\tif ( vaoGPU === undefined ) {\n\n\t\t\t\tvaoGPU = this._createVao( attributes );\n\n\t\t\t\tthis.vaoCache[ vaoKey ] = vaoGPU;\n\t\t\t\tattributesData.vaoGPU = vaoGPU;\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst index = renderObject.getIndex();\n\t\tconst indexGPU = ( index !== null ) ? this.get( index ).bufferGPU : null;\n\n\t\tstate.setVertexState( vaoGPU, indexGPU );\n\n\t\t//\n\n\t\tconst lastObject = contextData.lastOcclusionObject;\n\n\t\tif ( lastObject !== object && lastObject !== undefined ) {\n\n\t\t\tif ( lastObject !== null && lastObject.occlusionTest === true ) {\n\n\t\t\t\tgl.endQuery( gl.ANY_SAMPLES_PASSED );\n\n\t\t\t\tcontextData.occlusionQueryIndex ++;\n\n\t\t\t}\n\n\t\t\tif ( object.occlusionTest === true ) {\n\n\t\t\t\tconst query = gl.createQuery();\n\n\t\t\t\tgl.beginQuery( gl.ANY_SAMPLES_PASSED, query );\n\n\t\t\t\tcontextData.occlusionQueries[ contextData.occlusionQueryIndex ] = query;\n\t\t\t\tcontextData.occlusionQueryObjects[ contextData.occlusionQueryIndex ] = object;\n\n\t\t\t}\n\n\t\t\tcontextData.lastOcclusionObject = object;\n\n\t\t}\n\n\t\t//\n\t\tconst renderer = this.bufferRenderer;\n\n\t\tif ( object.isPoints ) renderer.mode = gl.POINTS;\n\t\telse if ( object.isLineSegments ) renderer.mode = gl.LINES;\n\t\telse if ( object.isLine ) renderer.mode = gl.LINE_STRIP;\n\t\telse if ( object.isLineLoop ) renderer.mode = gl.LINE_LOOP;\n\t\telse {\n\n\t\t\tif ( material.wireframe === true ) {\n\n\t\t\t\tstate.setLineWidth( material.wireframeLinewidth * this.renderer.getPixelRatio() );\n\t\t\t\trenderer.mode = gl.LINES;\n\n\t\t\t} else {\n\n\t\t\t\trenderer.mode = gl.TRIANGLES;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst { vertexCount, instanceCount } = drawParams;\n\t\tlet { firstVertex } = drawParams;\n\n\t\trenderer.object = object;\n\n\t\tif ( index !== null ) {\n\n\t\t\tfirstVertex *= index.array.BYTES_PER_ELEMENT;\n\n\t\t\tconst indexData = this.get( index );\n\n\t\t\trenderer.index = index.count;\n\t\t\trenderer.type = indexData.type;\n\n\t\t} else {\n\n\t\t\trenderer.index = 0;\n\n\t\t}\n\n\t\tconst draw = () => {\n\n\t\t\tif ( object.isBatchedMesh ) {\n\n\t\t\t\tif ( object._multiDrawInstances !== null ) {\n\n\t\t\t\t\t// @deprecated, r174\n\t\t\t\t\twarnOnce( 'WebGLBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.' );\n\t\t\t\t\trenderer.renderMultiDrawInstances( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount, object._multiDrawInstances );\n\n\t\t\t\t} else if ( ! this.hasFeature( 'WEBGL_multi_draw' ) ) {\n\n\t\t\t\t\twarnOnce( 'WebGLBackend: WEBGL_multi_draw not supported.' );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderer.renderMultiDraw( object._multiDrawStarts, object._multiDrawCounts, object._multiDrawCount );\n\n\t\t\t\t}\n\n\t\t\t} else if ( instanceCount > 1 ) {\n\n\t\t\t\trenderer.renderInstances( firstVertex, vertexCount, instanceCount );\n\n\t\t\t} else {\n\n\t\t\t\trenderer.render( firstVertex, vertexCount );\n\n\t\t\t}\n\n\t\t};\n\n\t\tif ( renderObject.camera.isArrayCamera === true && renderObject.camera.cameras.length > 0 && renderObject.camera.isMultiViewCamera === false ) {\n\n\t\t\tconst cameraData = this.get( renderObject.camera );\n\t\t\tconst cameras = renderObject.camera.cameras;\n\t\t\tconst cameraIndex = renderObject.getBindingGroup( 'cameraIndex' ).bindings[ 0 ];\n\n\t\t\tif ( cameraData.indexesGPU === undefined || cameraData.indexesGPU.length !== cameras.length ) {\n\n\t\t\t\tconst data = new Uint32Array( [ 0, 0, 0, 0 ] );\n\t\t\t\tconst indexesGPU = [];\n\n\t\t\t\tfor ( let i = 0, len = cameras.length; i < len; i ++ ) {\n\n\t\t\t\t\tconst bufferGPU = gl.createBuffer();\n\n\t\t\t\t\tdata[ 0 ] = i;\n\n\t\t\t\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );\n\t\t\t\t\tgl.bufferData( gl.UNIFORM_BUFFER, data, gl.STATIC_DRAW );\n\n\t\t\t\t\tindexesGPU.push( bufferGPU );\n\n\t\t\t\t}\n\n\t\t\t\tcameraData.indexesGPU = indexesGPU; // TODO: Create a global library for this\n\n\t\t\t}\n\n\t\t\tconst cameraIndexData = this.get( cameraIndex );\n\t\t\tconst pixelRatio = this.renderer.getPixelRatio();\n\n\t\t\tconst renderTarget = this._currentContext.renderTarget;\n\t\t\tconst isRenderCameraDepthArray = this._isRenderCameraDepthArray( this._currentContext );\n\t\t\tconst prevActiveCubeFace = this._currentContext.activeCubeFace;\n\n\t\t\tif ( isRenderCameraDepthArray ) {\n\n\t\t\t\t// Clear the depth texture\n\t\t\t\tconst textureData = this.get( renderTarget.depthTexture );\n\n\t\t\t\tif ( textureData.clearedRenderId !== this.renderer._nodes.nodeFrame.renderId ) {\n\n\t\t\t\t\ttextureData.clearedRenderId = this.renderer._nodes.nodeFrame.renderId;\n\n\t\t\t\t\tconst { stencilBuffer } = renderTarget;\n\n\t\t\t\t\tfor ( let i = 0, len = cameras.length; i < len; i ++ ) {\n\n\t\t\t\t\t\tthis.renderer._activeCubeFace = i;\n\t\t\t\t\t\tthis._currentContext.activeCubeFace = i;\n\n\t\t\t\t\t\tthis._setFramebuffer( this._currentContext );\n\t\t\t\t\t\tthis.clear( false, true, stencilBuffer, this._currentContext, false, false );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.renderer._activeCubeFace = prevActiveCubeFace;\n\t\t\t\t\tthis._currentContext.activeCubeFace = prevActiveCubeFace;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tfor ( let i = 0, len = cameras.length; i < len; i ++ ) {\n\n\t\t\t\tconst subCamera = cameras[ i ];\n\n\t\t\t\tif ( object.layers.test( subCamera.layers ) ) {\n\n\t\t\t\t\tif ( isRenderCameraDepthArray ) {\n\n\t\t\t\t\t\t// Update the active layer\n\t\t\t\t\t\tthis.renderer._activeCubeFace = i;\n\t\t\t\t\t\tthis._currentContext.activeCubeFace = i;\n\n\t\t\t\t\t\tthis._setFramebuffer( this._currentContext );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst vp = subCamera.viewport;\n\n\t\t\t\t\tif ( vp !== undefined ) {\n\n\t\t\t\t\t\tconst x = vp.x * pixelRatio;\n\t\t\t\t\t\tconst y = vp.y * pixelRatio;\n\t\t\t\t\t\tconst width = vp.width * pixelRatio;\n\t\t\t\t\t\tconst height = vp.height * pixelRatio;\n\n\t\t\t\t\t\tstate.viewport(\n\t\t\t\t\t\t\tMath.floor( x ),\n\t\t\t\t\t\t\tMath.floor( renderObject.context.height - height - y ),\n\t\t\t\t\t\t\tMath.floor( width ),\n\t\t\t\t\t\t\tMath.floor( height )\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\t\t\t\t\tstate.bindBufferBase( gl.UNIFORM_BUFFER, cameraIndexData.index, cameraData.indexesGPU[ i ] );\n\n\t\t\t\t\tdraw();\n\n\t\t\t\t}\n\n\t\t\t\tthis._currentContext.activeCubeFace = prevActiveCubeFace;\n\t\t\t\tthis.renderer._activeCubeFace = prevActiveCubeFace;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tdraw();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Explain why always null is returned.\n\t *\n\t * @param {RenderObject} renderObject - The render object.\n\t * @return {boolean} Whether the render pipeline requires an update or not.\n\t */\n\tneedsRenderUpdate( /*renderObject*/ ) {\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Explain why no cache key is computed.\n\t *\n\t * @param {RenderObject} renderObject - The render object.\n\t * @return {string} The cache key.\n\t */\n\tgetRenderCacheKey( /*renderObject*/ ) {\n\n\t\treturn '';\n\n\t}\n\n\t// textures\n\n\t/**\n\t * Creates a default texture for the given texture that can be used\n\t * as a placeholder until the actual texture is ready for usage.\n\t *\n\t * @param {Texture} texture - The texture to create a default texture for.\n\t */\n\tcreateDefaultTexture( texture ) {\n\n\t\tthis.textureUtils.createDefaultTexture( texture );\n\n\t}\n\n\t/**\n\t * Defines a texture on the GPU for the given texture object.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {Object} [options={}] - Optional configuration parameter.\n\t */\n\tcreateTexture( texture, options ) {\n\n\t\tthis.textureUtils.createTexture( texture, options );\n\n\t}\n\n\t/**\n\t * Uploads the updated texture data to the GPU.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {Object} [options={}] - Optional configuration parameter.\n\t */\n\tupdateTexture( texture, options ) {\n\n\t\tthis.textureUtils.updateTexture( texture, options );\n\n\t}\n\n\t/**\n\t * Generates mipmaps for the given texture.\n\t *\n\t * @param {Texture} texture - The texture.\n\t */\n\tgenerateMipmaps( texture ) {\n\n\t\tthis.textureUtils.generateMipmaps( texture );\n\n\t}\n\n\t/**\n\t * Destroys the GPU data for the given texture object.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {boolean} [isDefaultTexture=false] - Whether the texture uses a default GPU texture or not.\n\t */\n\tdestroyTexture( texture, isDefaultTexture = false ) {\n\n\t\tthis.textureUtils.destroyTexture( texture, isDefaultTexture );\n\n\t}\n\n\t/**\n\t * Returns texture data as a typed array.\n\t *\n\t * @async\n\t * @param {Texture} texture - The texture to copy.\n\t * @param {number} x - The x coordinate of the copy origin.\n\t * @param {number} y - The y coordinate of the copy origin.\n\t * @param {number} width - The width of the copy.\n\t * @param {number} height - The height of the copy.\n\t * @param {number} faceIndex - The face index.\n\t * @return {Promise<TypedArray>} A Promise that resolves with a typed array when the copy operation has finished.\n\t */\n\tasync copyTextureToBuffer( texture, x, y, width, height, faceIndex ) {\n\n\t\treturn this.textureUtils.copyTextureToBuffer( texture, x, y, width, height, faceIndex );\n\n\t}\n\n\t/**\n\t * This method does nothing since WebGL 2 has no concept of samplers.\n\t *\n\t * @param {Texture} texture - The texture to update the sampler for.\n\t * @return {string} The current sampler key.\n\t */\n\tupdateSampler( /*texture*/ ) {\n\n\t\treturn '';\n\n\t}\n\n\t// node builder\n\n\t/**\n\t * Returns a node builder for the given render object.\n\t *\n\t * @param {RenderObject} object - The render object.\n\t * @param {Renderer} renderer - The renderer.\n\t * @return {GLSLNodeBuilder} The node builder.\n\t */\n\tcreateNodeBuilder( object, renderer ) {\n\n\t\treturn new GLSLNodeBuilder( object, renderer );\n\n\t}\n\n\t// program\n\n\t/**\n\t * Creates a shader program from the given programmable stage.\n\t *\n\t * @param {ProgrammableStage} program - The programmable stage.\n\t */\n\tcreateProgram( program ) {\n\n\t\tconst gl = this.gl;\n\t\tconst { stage, code } = program;\n\n\t\tconst shader = stage === 'fragment' ? gl.createShader( gl.FRAGMENT_SHADER ) : gl.createShader( gl.VERTEX_SHADER );\n\n\t\tgl.shaderSource( shader, code );\n\t\tgl.compileShader( shader );\n\n\t\tthis.set( program, {\n\t\t\tshaderGPU: shader\n\t\t} );\n\n\t}\n\n\t/**\n\t * Destroys the shader program of the given programmable stage.\n\t *\n\t * @param {ProgrammableStage} program - The programmable stage.\n\t */\n\tdestroyProgram( program ) {\n\n\t\tthis.delete( program );\n\n\t}\n\n\t/**\n\t * Creates a render pipeline for the given render object.\n\t *\n\t * @param {RenderObject} renderObject - The render object.\n\t * @param {Array<Promise>} promises - An array of compilation promises which are used in `compileAsync()`.\n\t */\n\tcreateRenderPipeline( renderObject, promises ) {\n\n\t\tconst gl = this.gl;\n\t\tconst pipeline = renderObject.pipeline;\n\n\t\t// Program\n\n\t\tconst { fragmentProgram, vertexProgram } = pipeline;\n\n\t\tconst programGPU = gl.createProgram();\n\n\t\tconst fragmentShader = this.get( fragmentProgram ).shaderGPU;\n\t\tconst vertexShader = this.get( vertexProgram ).shaderGPU;\n\n\t\tgl.attachShader( programGPU, fragmentShader );\n\t\tgl.attachShader( programGPU, vertexShader );\n\t\tgl.linkProgram( programGPU );\n\n\t\tthis.set( pipeline, {\n\t\t\tprogramGPU,\n\t\t\tfragmentShader,\n\t\t\tvertexShader\n\t\t} );\n\n\t\tif ( promises !== null && this.parallel ) {\n\n\t\t\tconst p = new Promise( ( resolve /*, reject*/ ) => {\n\n\t\t\t\tconst parallel = this.parallel;\n\t\t\t\tconst checkStatus = () => {\n\n\t\t\t\t\tif ( gl.getProgramParameter( programGPU, parallel.COMPLETION_STATUS_KHR ) ) {\n\n\t\t\t\t\t\tthis._completeCompile( renderObject, pipeline );\n\t\t\t\t\t\tresolve();\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\trequestAnimationFrame( checkStatus );\n\n\t\t\t\t\t}\n\n\t\t\t\t};\n\n\t\t\t\tcheckStatus();\n\n\t\t\t} );\n\n\t\t\tpromises.push( p );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis._completeCompile( renderObject, pipeline );\n\n\t}\n\n\t/**\n\t * Formats the source code of error messages.\n\t *\n\t * @private\n\t * @param {string} string - The code.\n\t * @param {number} errorLine - The error line.\n\t * @return {string} The formatted code.\n\t */\n\t_handleSource( string, errorLine ) {\n\n\t\tconst lines = string.split( '\\n' );\n\t\tconst lines2 = [];\n\n\t\tconst from = Math.max( errorLine - 6, 0 );\n\t\tconst to = Math.min( errorLine + 6, lines.length );\n\n\t\tfor ( let i = from; i < to; i ++ ) {\n\n\t\t\tconst line = i + 1;\n\t\t\tlines2.push( `${line === errorLine ? '>' : ' '} ${line}: ${lines[ i ]}` );\n\n\t\t}\n\n\t\treturn lines2.join( '\\n' );\n\n\t}\n\n\t/**\n\t * Gets the shader compilation errors from the info log.\n\t *\n\t * @private\n\t * @param {WebGL2RenderingContext} gl - The rendering context.\n\t * @param {WebGLShader} shader - The WebGL shader object.\n\t * @param {string} type - The shader type.\n\t * @return {string} The shader errors.\n\t */\n\t_getShaderErrors( gl, shader, type ) {\n\n\t\tconst status = gl.getShaderParameter( shader, gl.COMPILE_STATUS );\n\n\t\tconst shaderInfoLog = gl.getShaderInfoLog( shader ) || '';\n\t\tconst errors = shaderInfoLog.trim();\n\n\t\tif ( status && errors === '' ) return '';\n\n\t\tconst errorMatches = /ERROR: 0:(\\d+)/.exec( errors );\n\t\tif ( errorMatches ) {\n\n\t\t\tconst errorLine = parseInt( errorMatches[ 1 ] );\n\t\t\treturn type.toUpperCase() + '\\n\\n' + errors + '\\n\\n' + this._handleSource( gl.getShaderSource( shader ), errorLine );\n\n\t\t} else {\n\n\t\t\treturn errors;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Logs shader compilation errors.\n\t *\n\t * @private\n\t * @param {WebGLProgram} programGPU - The WebGL program.\n\t * @param {WebGLShader} glFragmentShader - The fragment shader as a native WebGL shader object.\n\t * @param {WebGLShader} glVertexShader - The vertex shader as a native WebGL shader object.\n\t */\n\t_logProgramError( programGPU, glFragmentShader, glVertexShader ) {\n\n\t\tif ( this.renderer.debug.checkShaderErrors ) {\n\n\t\t\tconst gl = this.gl;\n\n\t\t\tconst programInfoLog = gl.getProgramInfoLog( programGPU ) || '';\n\t\t\tconst programLog = programInfoLog.trim();\n\n\t\t\tif ( gl.getProgramParameter( programGPU, gl.LINK_STATUS ) === false ) {\n\n\t\t\t\tif ( typeof this.renderer.debug.onShaderError === 'function' ) {\n\n\t\t\t\t\tthis.renderer.debug.onShaderError( gl, programGPU, glVertexShader, glFragmentShader );\n\n\t\t\t\t} else {\n\n\t\t\t\t\t// default error reporting\n\n\t\t\t\t\tconst vertexErrors = this._getShaderErrors( gl, glVertexShader, 'vertex' );\n\t\t\t\t\tconst fragmentErrors = this._getShaderErrors( gl, glFragmentShader, 'fragment' );\n\n\t\t\t\t\terror(\n\t\t\t\t\t\t'THREE.WebGLProgram: Shader Error ' + gl.getError() + ' - ' +\n\t\t\t\t\t\t'VALIDATE_STATUS ' + gl.getProgramParameter( programGPU, gl.VALIDATE_STATUS ) + '\\n\\n' +\n\t\t\t\t\t\t'Program Info Log: ' + programLog + '\\n' +\n\t\t\t\t\t\tvertexErrors + '\\n' +\n\t\t\t\t\t\tfragmentErrors\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t} else if ( programLog !== '' ) {\n\n\t\t\t\twarn( 'WebGLProgram: Program Info Log:', programLog );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Completes the shader program setup for the given render object.\n\t *\n\t * @private\n\t * @param {RenderObject} renderObject - The render object.\n\t * @param {RenderPipeline} pipeline - The render pipeline.\n\t */\n\t_completeCompile( renderObject, pipeline ) {\n\n\t\tconst { state, gl } = this;\n\t\tconst pipelineData = this.get( pipeline );\n\t\tconst { programGPU, fragmentShader, vertexShader } = pipelineData;\n\n\t\tif ( gl.getProgramParameter( programGPU, gl.LINK_STATUS ) === false ) {\n\n\t\t\tthis._logProgramError( programGPU, fragmentShader, vertexShader );\n\n\t\t}\n\n\t\tstate.useProgram( programGPU );\n\n\t\t// Bindings\n\n\t\tconst bindings = renderObject.getBindings();\n\n\t\tthis._setupBindings( bindings, programGPU );\n\n\t\t//\n\n\t\tthis.set( pipeline, {\n\t\t\tprogramGPU\n\t\t} );\n\n\t}\n\n\t/**\n\t * Creates a compute pipeline for the given compute node.\n\t *\n\t * @param {ComputePipeline} computePipeline - The compute pipeline.\n\t * @param {Array<BindGroup>} bindings - The bindings.\n\t */\n\tcreateComputePipeline( computePipeline, bindings ) {\n\n\t\tconst { state, gl } = this;\n\n\t\t// Program\n\n\t\tconst fragmentProgram = {\n\t\t\tstage: 'fragment',\n\t\t\tcode: '#version 300 es\\nprecision highp float;\\nvoid main() {}'\n\t\t};\n\n\t\tthis.createProgram( fragmentProgram );\n\n\t\tconst { computeProgram } = computePipeline;\n\n\t\tconst programGPU = gl.createProgram();\n\n\t\tconst fragmentShader = this.get( fragmentProgram ).shaderGPU;\n\t\tconst vertexShader = this.get( computeProgram ).shaderGPU;\n\n\t\tconst transforms = computeProgram.transforms;\n\n\t\tconst transformVaryingNames = [];\n\t\tconst transformAttributeNodes = [];\n\n\t\tfor ( let i = 0; i < transforms.length; i ++ ) {\n\n\t\t\tconst transform = transforms[ i ];\n\n\t\t\ttransformVaryingNames.push( transform.varyingName );\n\t\t\ttransformAttributeNodes.push( transform.attributeNode );\n\n\t\t}\n\n\t\tgl.attachShader( programGPU, fragmentShader );\n\t\tgl.attachShader( programGPU, vertexShader );\n\n\t\tgl.transformFeedbackVaryings(\n\t\t\tprogramGPU,\n\t\t\ttransformVaryingNames,\n\t\t\tgl.SEPARATE_ATTRIBS\n\t\t);\n\n\t\tgl.linkProgram( programGPU );\n\n\t\tif ( gl.getProgramParameter( programGPU, gl.LINK_STATUS ) === false ) {\n\n\t\t\tthis._logProgramError( programGPU, fragmentShader, vertexShader );\n\n\n\t\t}\n\n\t\tstate.useProgram( programGPU );\n\n\t\t// Bindings\n\n\t\tthis._setupBindings( bindings, programGPU );\n\n\t\tconst attributeNodes = computeProgram.attributes;\n\t\tconst attributes = [];\n\t\tconst transformBuffers = [];\n\n\t\tfor ( let i = 0; i < attributeNodes.length; i ++ ) {\n\n\t\t\tconst attribute = attributeNodes[ i ].node.attribute;\n\n\t\t\tattributes.push( attribute );\n\n\t\t\tif ( ! this.has( attribute ) ) this.attributeUtils.createAttribute( attribute, gl.ARRAY_BUFFER );\n\n\t\t}\n\n\t\tfor ( let i = 0; i < transformAttributeNodes.length; i ++ ) {\n\n\t\t\tconst attribute = transformAttributeNodes[ i ].attribute;\n\n\t\t\tif ( ! this.has( attribute ) ) this.attributeUtils.createAttribute( attribute, gl.ARRAY_BUFFER );\n\n\t\t\tconst attributeData = this.get( attribute );\n\n\t\t\ttransformBuffers.push( attributeData );\n\n\t\t}\n\n\t\t//\n\n\t\tthis.set( computePipeline, {\n\t\t\tprogramGPU,\n\t\t\ttransformBuffers,\n\t\t\tattributes\n\t\t} );\n\n\t}\n\n\t/**\n\t * Creates bindings from the given bind group definition.\n\t *\n\t * @param {BindGroup} bindGroup - The bind group.\n\t * @param {Array<BindGroup>} bindings - Array of bind groups.\n\t * @param {number} cacheIndex - The cache index.\n\t * @param {number} version - The version.\n\t */\n\tcreateBindings( bindGroup, bindings /*, cacheIndex, version*/ ) {\n\n\t\tif ( this._knownBindings.has( bindings ) === false ) {\n\n\t\t\tthis._knownBindings.add( bindings );\n\n\t\t\tlet uniformBuffers = 0;\n\t\t\tlet textures = 0;\n\n\t\t\tfor ( const bindGroup of bindings ) {\n\n\t\t\t\tthis.set( bindGroup, {\n\t\t\t\t\ttextures: textures,\n\t\t\t\t\tuniformBuffers: uniformBuffers\n\t\t\t\t} );\n\n\t\t\t\tfor ( const binding of bindGroup.bindings ) {\n\n\t\t\t\t\tif ( binding.isUniformBuffer ) uniformBuffers ++;\n\t\t\t\t\tif ( binding.isSampledTexture ) textures ++;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.updateBindings( bindGroup, bindings );\n\n\t}\n\n\t/**\n\t * Updates the given bind group definition.\n\t *\n\t * @param {BindGroup} bindGroup - The bind group.\n\t * @param {Array<BindGroup>} bindings - Array of bind groups.\n\t * @param {number} cacheIndex - The cache index.\n\t * @param {number} version - The version.\n\t */\n\tupdateBindings( bindGroup /*, bindings, cacheIndex, version*/ ) {\n\n\t\tconst { gl } = this;\n\n\t\tconst bindGroupData = this.get( bindGroup );\n\n\t\tlet i = bindGroupData.uniformBuffers;\n\t\tlet t = bindGroupData.textures;\n\n\t\tfor ( const binding of bindGroup.bindings ) {\n\n\t\t\tconst map = this.get( binding );\n\n\t\t\tif ( binding.isUniformsGroup || binding.isUniformBuffer ) {\n\n\t\t\t\tconst array = binding.buffer;\n\t\t\t\tlet { bufferGPU } = this.get( array );\n\n\t\t\t\tif ( bufferGPU === undefined ) {\n\n\t\t\t\t\t// create\n\n\t\t\t\t\tbufferGPU = gl.createBuffer();\n\n\t\t\t\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );\n\t\t\t\t\tgl.bufferData( gl.UNIFORM_BUFFER, array.byteLength, gl.DYNAMIC_DRAW );\n\n\t\t\t\t\tthis.set( array, { bufferGPU } );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );\n\n\t\t\t\t}\n\n\t\t\t\t// update\n\n\t\t\t\tconst updateRanges = binding.updateRanges;\n\n\t\t\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );\n\n\t\t\t\tif ( updateRanges.length === 0 ) {\n\n\t\t\t\t\tgl.bufferData( gl.UNIFORM_BUFFER, array, gl.DYNAMIC_DRAW );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst isTyped = isTypedArray( array );\n\t\t\t\t\tconst byteOffsetFactor = isTyped ? 1 : array.BYTES_PER_ELEMENT;\n\n\t\t\t\t\tfor ( let i = 0, l = updateRanges.length; i < l; i ++ ) {\n\n\t\t\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\t\t\tconst dataOffset = range.start * byteOffsetFactor;\n\t\t\t\t\t\tconst size = range.count * byteOffsetFactor;\n\n\t\t\t\t\t\tconst bufferOffset = dataOffset * ( isTyped ? array.BYTES_PER_ELEMENT : 1 ); // bufferOffset is always in bytes\n\n\t\t\t\t\t\tgl.bufferSubData( gl.UNIFORM_BUFFER, bufferOffset, array, dataOffset, size );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tmap.index = i ++;\n\t\t\t\tmap.bufferGPU = bufferGPU;\n\n\t\t\t\tthis.set( binding, map );\n\n\t\t\t} else if ( binding.isSampledTexture ) {\n\n\t\t\t\tconst { textureGPU, glTextureType } = this.get( binding.texture );\n\n\t\t\t\tmap.index = t ++;\n\t\t\t\tmap.textureGPU = textureGPU;\n\t\t\t\tmap.glTextureType = glTextureType;\n\n\t\t\t\tthis.set( binding, map );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates a buffer binding.\n\t *\n\t *  @param {Buffer} binding - The buffer binding to update.\n\t */\n\tupdateBinding( binding ) {\n\n\t\tconst gl = this.gl;\n\n\t\tif ( binding.isUniformsGroup || binding.isUniformBuffer ) {\n\n\t\t\tconst bindingData = this.get( binding );\n\t\t\tconst bufferGPU = bindingData.bufferGPU;\n\t\t\tconst array = binding.buffer;\n\n\t\t\tconst updateRanges = binding.updateRanges;\n\n\t\t\tgl.bindBuffer( gl.UNIFORM_BUFFER, bufferGPU );\n\n\t\t\tif ( updateRanges.length === 0 ) {\n\n\t\t\t\tgl.bufferData( gl.UNIFORM_BUFFER, array, gl.DYNAMIC_DRAW );\n\n\t\t\t} else {\n\n\t\t\t\tconst isTyped = isTypedArray( array );\n\t\t\t\tconst byteOffsetFactor = isTyped ? 1 : array.BYTES_PER_ELEMENT;\n\n\t\t\t\tfor ( let i = 0, l = updateRanges.length; i < l; i ++ ) {\n\n\t\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\t\tconst dataOffset = range.start * byteOffsetFactor;\n\t\t\t\t\tconst size = range.count * byteOffsetFactor;\n\n\t\t\t\t\tconst bufferOffset = dataOffset * ( isTyped ? array.BYTES_PER_ELEMENT : 1 ); // bufferOffset is always in bytes\n\n\t\t\t\t\tgl.bufferSubData( gl.UNIFORM_BUFFER, bufferOffset, array, dataOffset, size );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// attributes\n\n\t/**\n\t * Creates the GPU buffer of an indexed shader attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The indexed buffer attribute.\n\t */\n\tcreateIndexAttribute( attribute ) {\n\n\t\tconst gl = this.gl;\n\n\t\tthis.attributeUtils.createAttribute( attribute, gl.ELEMENT_ARRAY_BUFFER );\n\n\t}\n\n\t/**\n\t * Creates the GPU buffer of a shader attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute.\n\t */\n\tcreateAttribute( attribute ) {\n\n\t\tif ( this.has( attribute ) ) return;\n\n\t\tconst gl = this.gl;\n\n\t\tthis.attributeUtils.createAttribute( attribute, gl.ARRAY_BUFFER );\n\n\t}\n\n\t/**\n\t * Creates the GPU buffer of a storage attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute.\n\t */\n\tcreateStorageAttribute( attribute ) {\n\n\t\tif ( this.has( attribute ) ) return;\n\n\t\tconst gl = this.gl;\n\n\t\tthis.attributeUtils.createAttribute( attribute, gl.ARRAY_BUFFER );\n\n\t}\n\n\t/**\n\t * Updates the GPU buffer of a shader attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute to update.\n\t */\n\tupdateAttribute( attribute ) {\n\n\t\tthis.attributeUtils.updateAttribute( attribute );\n\n\t}\n\n\t/**\n\t * Destroys the GPU buffer of a shader attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute to destroy.\n\t */\n\tdestroyAttribute( attribute ) {\n\n\t\tthis.attributeUtils.destroyAttribute( attribute );\n\n\t}\n\n\t/**\n\t * Checks if the given feature is supported  by the backend.\n\t *\n\t * @param {string} name - The feature's name.\n\t * @return {boolean} Whether the feature is supported or not.\n\t */\n\thasFeature( name ) {\n\n\t\tconst keysMatching = Object.keys( GLFeatureName ).filter( key => GLFeatureName[ key ] === name );\n\n\t\tconst extensions = this.extensions;\n\n\t\tfor ( let i = 0; i < keysMatching.length; i ++ ) {\n\n\t\t\tif ( extensions.has( keysMatching[ i ] ) ) return true;\n\n\t\t}\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Returns the maximum anisotropy texture filtering value.\n\t *\n\t * @return {number} The maximum anisotropy texture filtering value.\n\t */\n\tgetMaxAnisotropy() {\n\n\t\treturn this.capabilities.getMaxAnisotropy();\n\n\t}\n\n\t/**\n\t * Copies data of the given source texture to the given destination texture.\n\t *\n\t * @param {Texture} srcTexture - The source texture.\n\t * @param {Texture} dstTexture - The destination texture.\n\t * @param {?(Box3|Box2)} [srcRegion=null] - The region of the source texture to copy.\n\t * @param {?(Vector2|Vector3)} [dstPosition=null] - The destination position of the copy.\n\t * @param {number} [srcLevel=0] - The source mip level to copy from.\n\t * @param {number} [dstLevel=0] - The destination mip level to copy to.\n\t */\n\tcopyTextureToTexture( srcTexture, dstTexture, srcRegion = null, dstPosition = null, srcLevel = 0, dstLevel = 0 ) {\n\n\t\tthis.textureUtils.copyTextureToTexture( srcTexture, dstTexture, srcRegion, dstPosition, srcLevel, dstLevel );\n\n\t}\n\n\t/**\n\t * Copies the current bound framebuffer to the given texture.\n\t *\n\t * @param {Texture} texture - The destination texture.\n\t * @param {RenderContext} renderContext - The render context.\n\t * @param {Vector4} rectangle - A four dimensional vector defining the origin and dimension of the copy.\n\t */\n\tcopyFramebufferToTexture( texture, renderContext, rectangle ) {\n\n\t\tthis.textureUtils.copyFramebufferToTexture( texture, renderContext, rectangle );\n\n\t}\n\n\t/**\n\t * Configures the active framebuffer from the given render context.\n\t *\n\t * @private\n\t * @param {RenderContext} descriptor - The render context.\n\t */\n\t_setFramebuffer( descriptor ) {\n\n\t\tconst { gl, state } = this;\n\n\t\tlet currentFrameBuffer = null;\n\n\t\tif ( descriptor.textures !== null ) {\n\n\t\t\tconst renderTarget = descriptor.renderTarget;\n\t\t\tconst renderTargetContextData = this.get( renderTarget );\n\t\t\tconst { samples, depthBuffer, stencilBuffer } = renderTarget;\n\n\t\t\tconst isCube = renderTarget.isWebGLCubeRenderTarget === true;\n\t\t\tconst isRenderTarget3D = renderTarget.isRenderTarget3D === true;\n\t\t\tconst isRenderTargetArray = renderTarget.depth > 1;\n\t\t\tconst isXRRenderTarget = renderTarget.isXRRenderTarget === true;\n\t\t\tconst _hasExternalTextures = ( isXRRenderTarget === true && renderTarget._hasExternalTextures === true );\n\n\t\t\tlet msaaFb = renderTargetContextData.msaaFrameBuffer;\n\t\t\tlet depthRenderbuffer = renderTargetContextData.depthRenderbuffer;\n\t\t\tconst multisampledRTTExt = this.extensions.get( 'WEBGL_multisampled_render_to_texture' );\n\t\t\tconst multiviewExt = this.extensions.get( 'OVR_multiview2' );\n\t\t\tconst useMultisampledRTT = this._useMultisampledExtension( renderTarget );\n\t\t\tconst cacheKey = getCacheKey( descriptor );\n\n\t\t\tlet fb;\n\n\t\t\tif ( isCube ) {\n\n\t\t\t\trenderTargetContextData.cubeFramebuffers || ( renderTargetContextData.cubeFramebuffers = {} );\n\n\t\t\t\tfb = renderTargetContextData.cubeFramebuffers[ cacheKey ];\n\n\t\t\t} else if ( isXRRenderTarget && _hasExternalTextures === false ) {\n\n\t\t\t\tfb = this._xrFramebuffer;\n\n\t\t\t} else {\n\n\t\t\t\trenderTargetContextData.framebuffers || ( renderTargetContextData.framebuffers = {} );\n\n\t\t\t\tfb = renderTargetContextData.framebuffers[ cacheKey ];\n\n\t\t\t}\n\n\t\t\tif ( fb === undefined ) {\n\n\t\t\t\tfb = gl.createFramebuffer();\n\n\t\t\t\tstate.bindFramebuffer( gl.FRAMEBUFFER, fb );\n\n\t\t\t\tconst textures = descriptor.textures;\n\t\t\t\tconst depthInvalidationArray = [];\n\n\t\t\t\tif ( isCube ) {\n\n\t\t\t\t\trenderTargetContextData.cubeFramebuffers[ cacheKey ] = fb;\n\n\t\t\t\t\tconst { textureGPU } = this.get( textures[ 0 ] );\n\n\t\t\t\t\tconst cubeFace = this.renderer._activeCubeFace;\n\t\t\t\t\tconst mipLevel = this.renderer._activeMipmapLevel;\n\n\t\t\t\t\tgl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace, textureGPU, mipLevel );\n\n\t\t\t\t} else {\n\n\t\t\t\t\trenderTargetContextData.framebuffers[ cacheKey ] = fb;\n\n\t\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\t\tconst texture = textures[ i ];\n\t\t\t\t\t\tconst textureData = this.get( texture );\n\t\t\t\t\t\ttextureData.renderTarget = descriptor.renderTarget;\n\t\t\t\t\t\ttextureData.cacheKey = cacheKey; // required for copyTextureToTexture()\n\n\t\t\t\t\t\tconst attachment = gl.COLOR_ATTACHMENT0 + i;\n\n\t\t\t\t\t\tif ( renderTarget.multiview ) {\n\n\t\t\t\t\t\t\tmultiviewExt.framebufferTextureMultisampleMultiviewOVR( gl.FRAMEBUFFER, attachment, textureData.textureGPU, 0, samples, 0, 2 );\n\n\t\t\t\t\t\t} else if ( isRenderTarget3D || isRenderTargetArray ) {\n\n\t\t\t\t\t\t\tconst layer = this.renderer._activeCubeFace;\n\t\t\t\t\t\t\tconst mipLevel = this.renderer._activeMipmapLevel;\n\n\t\t\t\t\t\t\tgl.framebufferTextureLayer( gl.FRAMEBUFFER, attachment, textureData.textureGPU, mipLevel, layer );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( useMultisampledRTT ) {\n\n\t\t\t\t\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, textureData.textureGPU, 0, samples );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tconst mipLevel = this.renderer._activeMipmapLevel;\n\n\t\t\t\t\t\t\t\tgl.framebufferTexture2D( gl.FRAMEBUFFER, attachment, gl.TEXTURE_2D, textureData.textureGPU, mipLevel );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tconst depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;\n\n\t\t\t\tif ( renderTarget._autoAllocateDepthBuffer === true ) {\n\n\t\t\t\t\tconst renderbuffer = gl.createRenderbuffer();\n\t\t\t\t\tthis.textureUtils.setupRenderBufferStorage( renderbuffer, descriptor, 0, useMultisampledRTT );\n\t\t\t\t\trenderTargetContextData.xrDepthRenderbuffer = renderbuffer;\n\t\t\t\t\tdepthInvalidationArray.push( stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT );\n\n\t\t\t\t\tgl.bindRenderbuffer( gl.RENDERBUFFER, renderbuffer );\n\t\t\t\t\tgl.framebufferRenderbuffer( gl.FRAMEBUFFER, depthStyle, gl.RENDERBUFFER, renderbuffer );\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\tif ( descriptor.depthTexture !== null ) {\n\n\t\t\t\t\t\tdepthInvalidationArray.push( stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT );\n\n\t\t\t\t\t\tconst textureData = this.get( descriptor.depthTexture );\n\t\t\t\t\t\ttextureData.renderTarget = descriptor.renderTarget;\n\t\t\t\t\t\ttextureData.cacheKey = cacheKey; // required for copyTextureToTexture()\n\n\t\t\t\t\t\tif ( renderTarget.multiview ) {\n\n\t\t\t\t\t\t\tmultiviewExt.framebufferTextureMultisampleMultiviewOVR( gl.FRAMEBUFFER, depthStyle, textureData.textureGPU, 0, samples, 0, 2 );\n\n\t\t\t\t\t\t} else if ( _hasExternalTextures && useMultisampledRTT ) {\n\n\t\t\t\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0, samples );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tif ( descriptor.depthTexture.isArrayTexture ) {\n\n\t\t\t\t\t\t\t\tconst layer = this.renderer._activeCubeFace;\n\n\t\t\t\t\t\t\t\tgl.framebufferTextureLayer( gl.FRAMEBUFFER, depthStyle, textureData.textureGPU, 0, layer );\n\n\t\t\t\t\t\t\t} else if ( descriptor.depthTexture.isCubeTexture ) {\n\n\t\t\t\t\t\t\t\tconst cubeFace = this.renderer._activeCubeFace;\n\n\t\t\t\t\t\t\t\tgl.framebufferTexture2D( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_CUBE_MAP_POSITIVE_X + cubeFace, textureData.textureGPU, 0 );\n\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\tgl.framebufferTexture2D( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0 );\n\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\trenderTargetContextData.depthInvalidationArray = depthInvalidationArray;\n\n\n\t\t\t} else {\n\n\t\t\t\tconst isRenderCameraDepthArray = this._isRenderCameraDepthArray( descriptor );\n\n\t\t\t\tif ( isRenderCameraDepthArray ) {\n\n\t\t\t\t\tstate.bindFramebuffer( gl.FRAMEBUFFER, fb );\n\n\t\t\t\t\tconst layer = this.renderer._activeCubeFace;\n\n\t\t\t\t\tconst depthData = this.get( descriptor.depthTexture );\n\t\t\t\t\tconst depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;\n\t\t\t\t\tgl.framebufferTextureLayer(\n\t\t\t\t\t\tgl.FRAMEBUFFER,\n\t\t\t\t\t\tdepthStyle,\n\t\t\t\t\t\tdepthData.textureGPU,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\tlayer\n\t\t\t\t\t);\n\n\t\t\t\t}\n\n\t\t\t\t// rebind external XR textures\n\n\t\t\t\tif ( ( isXRRenderTarget || useMultisampledRTT || renderTarget.multiview ) && ( renderTarget._isOpaqueFramebuffer !== true ) ) {\n\n\t\t\t\t\tstate.bindFramebuffer( gl.FRAMEBUFFER, fb );\n\n\t\t\t\t\t// rebind color\n\n\t\t\t\t\tconst textureData = this.get( descriptor.textures[ 0 ] );\n\n\t\t\t\t\tif ( renderTarget.multiview ) {\n\n\t\t\t\t\t\tmultiviewExt.framebufferTextureMultisampleMultiviewOVR( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, textureData.textureGPU, 0, samples, 0, 2 );\n\n\t\t\t\t\t} else if ( useMultisampledRTT ) {\n\n\t\t\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureData.textureGPU, 0, samples );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.framebufferTexture2D( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureData.textureGPU, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\t// rebind depth\n\n\t\t\t\t\tconst depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;\n\n\t\t\t\t\tif ( renderTarget._autoAllocateDepthBuffer === true ) {\n\n\t\t\t\t\t\tconst renderbuffer = renderTargetContextData.xrDepthRenderbuffer;\n\t\t\t\t\t\tgl.bindRenderbuffer( gl.RENDERBUFFER, renderbuffer );\n\t\t\t\t\t\tgl.framebufferRenderbuffer( gl.FRAMEBUFFER, depthStyle, gl.RENDERBUFFER, renderbuffer );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tconst textureData = this.get( descriptor.depthTexture );\n\n\t\t\t\t\t\tif ( renderTarget.multiview ) {\n\n\t\t\t\t\t\t\tmultiviewExt.framebufferTextureMultisampleMultiviewOVR( gl.FRAMEBUFFER, depthStyle, textureData.textureGPU, 0, samples, 0, 2 );\n\n\t\t\t\t\t\t} else if ( useMultisampledRTT ) {\n\n\t\t\t\t\t\t\tmultisampledRTTExt.framebufferTexture2DMultisampleEXT( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0, samples );\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tgl.framebufferTexture2D( gl.FRAMEBUFFER, depthStyle, gl.TEXTURE_2D, textureData.textureGPU, 0 );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif ( samples > 0 && useMultisampledRTT === false && ! renderTarget.multiview ) {\n\n\t\t\t\tif ( msaaFb === undefined ) {\n\n\t\t\t\t\tconst invalidationArray = [];\n\n\t\t\t\t\tmsaaFb = gl.createFramebuffer();\n\n\t\t\t\t\tstate.bindFramebuffer( gl.FRAMEBUFFER, msaaFb );\n\n\t\t\t\t\tconst msaaRenderbuffers = [];\n\n\t\t\t\t\tconst textures = descriptor.textures;\n\n\t\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\t\tmsaaRenderbuffers[ i ] = gl.createRenderbuffer();\n\n\t\t\t\t\t\tgl.bindRenderbuffer( gl.RENDERBUFFER, msaaRenderbuffers[ i ] );\n\n\t\t\t\t\t\tinvalidationArray.push( gl.COLOR_ATTACHMENT0 + i );\n\n\t\t\t\t\t\tconst texture = descriptor.textures[ i ];\n\t\t\t\t\t\tconst textureData = this.get( texture );\n\n\t\t\t\t\t\tgl.renderbufferStorageMultisample( gl.RENDERBUFFER, samples, textureData.glInternalFormat, descriptor.width, descriptor.height );\n\t\t\t\t\t\tgl.framebufferRenderbuffer( gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );\n\n\n\t\t\t\t\t}\n\n\t\t\t\t\tgl.bindRenderbuffer( gl.RENDERBUFFER, null );\n\n\t\t\t\t\trenderTargetContextData.msaaFrameBuffer = msaaFb;\n\t\t\t\t\trenderTargetContextData.msaaRenderbuffers = msaaRenderbuffers;\n\n\t\t\t\t\tif ( depthBuffer && depthRenderbuffer === undefined ) {\n\n\t\t\t\t\t\tdepthRenderbuffer = gl.createRenderbuffer();\n\t\t\t\t\t\tthis.textureUtils.setupRenderBufferStorage( depthRenderbuffer, descriptor, samples );\n\n\t\t\t\t\t\trenderTargetContextData.depthRenderbuffer = depthRenderbuffer;\n\n\t\t\t\t\t\tconst depthStyle = stencilBuffer ? gl.DEPTH_STENCIL_ATTACHMENT : gl.DEPTH_ATTACHMENT;\n\t\t\t\t\t\tinvalidationArray.push( depthStyle );\n\n\t\t\t\t\t}\n\n\t\t\t\t\trenderTargetContextData.invalidationArray = invalidationArray;\n\n\t\t\t\t}\n\n\t\t\t\tcurrentFrameBuffer = renderTargetContextData.msaaFrameBuffer;\n\n\t\t\t} else {\n\n\t\t\t\tcurrentFrameBuffer = fb;\n\n\t\t\t}\n\n\t\t\tstate.drawBuffers( descriptor, fb );\n\n\t\t}\n\n\t\tstate.bindFramebuffer( gl.FRAMEBUFFER, currentFrameBuffer );\n\n\t}\n\n\t/**\n\t * Computes the VAO key for the given index and attributes.\n\t *\n\t * @private\n\t * @param {Array<BufferAttribute>} attributes - An array of buffer attributes.\n\t * @return {string} The VAO key.\n\t */\n\t_getVaoKey( attributes ) {\n\n\t\tlet key = '';\n\n\t\tfor ( let i = 0; i < attributes.length; i ++ ) {\n\n\t\t\tconst attributeData = this.get( attributes[ i ] );\n\n\t\t\tkey += ':' + attributeData.id;\n\n\t\t}\n\n\t\treturn key;\n\n\t}\n\n\t/**\n\t * Creates a VAO from the index and attributes.\n\t *\n\t * @private\n\t * @param {Array<BufferAttribute>} attributes - An array of buffer attributes.\n\t * @return {Object} The VAO data.\n\t */\n\t_createVao( attributes ) {\n\n\t\tconst { gl } = this;\n\n\t\tconst vaoGPU = gl.createVertexArray();\n\n\t\tgl.bindVertexArray( vaoGPU );\n\n\t\tfor ( let i = 0; i < attributes.length; i ++ ) {\n\n\t\t\tconst attribute = attributes[ i ];\n\t\t\tconst attributeData = this.get( attribute );\n\n\t\t\tgl.bindBuffer( gl.ARRAY_BUFFER, attributeData.bufferGPU );\n\t\t\tgl.enableVertexAttribArray( i );\n\n\t\t\tlet stride, offset;\n\n\t\t\tif ( attribute.isInterleavedBufferAttribute === true ) {\n\n\t\t\t\tstride = attribute.data.stride * attributeData.bytesPerElement;\n\t\t\t\toffset = attribute.offset * attributeData.bytesPerElement;\n\n\t\t\t} else {\n\n\t\t\t\tstride = 0;\n\t\t\t\toffset = 0;\n\n\t\t\t}\n\n\t\t\tif ( attributeData.isInteger ) {\n\n\t\t\t\tgl.vertexAttribIPointer( i, attribute.itemSize, attributeData.type, stride, offset );\n\n\t\t\t} else {\n\n\t\t\t\tgl.vertexAttribPointer( i, attribute.itemSize, attributeData.type, attribute.normalized, stride, offset );\n\n\t\t\t}\n\n\t\t\tif ( attribute.isInstancedBufferAttribute && ! attribute.isInterleavedBufferAttribute ) {\n\n\t\t\t\tgl.vertexAttribDivisor( i, attribute.meshPerAttribute );\n\n\t\t\t} else if ( attribute.isInterleavedBufferAttribute && attribute.data.isInstancedInterleavedBuffer ) {\n\n\t\t\t\tgl.vertexAttribDivisor( i, attribute.data.meshPerAttribute );\n\n\t\t\t}\n\n\t\t}\n\n\t\tgl.bindBuffer( gl.ARRAY_BUFFER, null );\n\n\t\treturn vaoGPU;\n\n\t}\n\n\t/**\n\t * Creates a transform feedback from the given transform buffers.\n\t *\n\t * @private\n\t * @param {Array<DualAttributeData>} transformBuffers - The transform buffers.\n\t * @return {WebGLTransformFeedback} The transform feedback.\n\t */\n\t_getTransformFeedback( transformBuffers ) {\n\n\t\tlet key = '';\n\n\t\tfor ( let i = 0; i < transformBuffers.length; i ++ ) {\n\n\t\t\tkey += ':' + transformBuffers[ i ].id;\n\n\t\t}\n\n\t\tlet transformFeedbackGPU = this.transformFeedbackCache[ key ];\n\n\t\tif ( transformFeedbackGPU !== undefined ) {\n\n\t\t\treturn transformFeedbackGPU;\n\n\t\t}\n\n\t\tconst { gl } = this;\n\n\t\ttransformFeedbackGPU = gl.createTransformFeedback();\n\n\t\tgl.bindTransformFeedback( gl.TRANSFORM_FEEDBACK, transformFeedbackGPU );\n\n\t\tfor ( let i = 0; i < transformBuffers.length; i ++ ) {\n\n\t\t\tconst attributeData = transformBuffers[ i ];\n\n\t\t\tgl.bindBufferBase( gl.TRANSFORM_FEEDBACK_BUFFER, i, attributeData.transformBuffer );\n\n\t\t}\n\n\t\tgl.bindTransformFeedback( gl.TRANSFORM_FEEDBACK, null );\n\n\t\tthis.transformFeedbackCache[ key ] = transformFeedbackGPU;\n\n\t\treturn transformFeedbackGPU;\n\n\t}\n\n\t/**\n\t * Setups the given bindings.\n\t *\n\t * @private\n\t * @param {Array<BindGroup>} bindings - The bindings.\n\t * @param {WebGLProgram} programGPU - The WebGL program.\n\t */\n\t_setupBindings( bindings, programGPU ) {\n\n\t\tconst gl = this.gl;\n\n\t\tfor ( const bindGroup of bindings ) {\n\n\t\t\tfor ( const binding of bindGroup.bindings ) {\n\n\t\t\t\tconst bindingData = this.get( binding );\n\t\t\t\tconst index = bindingData.index;\n\n\t\t\t\tif ( binding.isUniformsGroup || binding.isUniformBuffer ) {\n\n\t\t\t\t\tconst location = gl.getUniformBlockIndex( programGPU, binding.name );\n\t\t\t\t\tgl.uniformBlockBinding( programGPU, location, index );\n\n\t\t\t\t} else if ( binding.isSampledTexture ) {\n\n\t\t\t\t\tconst location = gl.getUniformLocation( programGPU, binding.name );\n\t\t\t\t\tgl.uniform1i( location, index );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Binds the given uniforms.\n\t *\n\t * @private\n\t * @param {Array<BindGroup>} bindings - The bindings.\n\t */\n\t_bindUniforms( bindings ) {\n\n\t\tconst { gl, state } = this;\n\n\t\tfor ( const bindGroup of bindings ) {\n\n\t\t\tfor ( const binding of bindGroup.bindings ) {\n\n\t\t\t\tconst bindingData = this.get( binding );\n\t\t\t\tconst index = bindingData.index;\n\n\t\t\t\tif ( binding.isUniformsGroup || binding.isUniformBuffer ) {\n\n\t\t\t\t\t// TODO USE bindBufferRange to group multiple uniform buffers\n\t\t\t\t\tstate.bindBufferBase( gl.UNIFORM_BUFFER, index, bindingData.bufferGPU );\n\n\t\t\t\t} else if ( binding.isSampledTexture ) {\n\n\t\t\t\t\tstate.bindTexture( bindingData.glTextureType, bindingData.textureGPU, gl.TEXTURE0 + index );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * The method ensures multisampled render targets are resolved.\n\t *\n\t * @private\n\t * @param {RenderContext} renderContext - The render context.\n\t */\n\t_resolveRenderTarget( renderContext ) {\n\n\t\tconst { gl, state } = this;\n\n\t\tconst renderTarget = renderContext.renderTarget;\n\n\t\tif ( renderContext.textures !== null && renderTarget ) {\n\n\t\t\tconst renderTargetContextData = this.get( renderTarget );\n\n\t\t\tif ( renderTarget.samples > 0 && this._useMultisampledExtension( renderTarget ) === false ) {\n\n\t\t\t\tconst fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];\n\n\t\t\t\tlet mask = gl.COLOR_BUFFER_BIT;\n\n\t\t\t\tif ( renderTarget.resolveDepthBuffer ) {\n\n\t\t\t\t\tif ( renderTarget.depthBuffer ) mask |= gl.DEPTH_BUFFER_BIT;\n\t\t\t\t\tif ( renderTarget.stencilBuffer && renderTarget.resolveStencilBuffer ) mask |= gl.STENCIL_BUFFER_BIT;\n\n\t\t\t\t}\n\n\t\t\t\tconst msaaFrameBuffer = renderTargetContextData.msaaFrameBuffer;\n\t\t\t\tconst msaaRenderbuffers = renderTargetContextData.msaaRenderbuffers;\n\n\t\t\t\tconst textures = renderContext.textures;\n\t\t\t\tconst isMRT = textures.length > 1;\n\n\t\t\t\tstate.bindFramebuffer( gl.READ_FRAMEBUFFER, msaaFrameBuffer );\n\t\t\t\tstate.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );\n\n\t\t\t\tif ( isMRT ) {\n\n\t\t\t\t\t// blitFramebuffer() can only copy/resolve the first color attachment of a framebuffer. When using MRT,\n\t\t\t\t\t// the engine temporarily removes all attachments and then configures each attachment for the resolve.\n\n\t\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\t\tgl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, null );\n\t\t\t\t\t\tgl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.TEXTURE_2D, null, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\tif ( isMRT ) {\n\n\t\t\t\t\t\t// configure attachment for resolve\n\n\t\t\t\t\t\tconst { textureGPU } = this.get( textures[ i ] );\n\n\t\t\t\t\t\tgl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );\n\t\t\t\t\t\tgl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, textureGPU, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( renderContext.scissor ) {\n\n\t\t\t\t\t\tconst { x, y, width, height } = renderContext.scissorValue;\n\n\t\t\t\t\t\tconst viewY = renderContext.height - height - y;\n\n\t\t\t\t\t\tgl.blitFramebuffer( x, viewY, x + width, viewY + height, x, viewY, x + width, viewY + height, mask, gl.NEAREST );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tgl.blitFramebuffer( 0, 0, renderContext.width, renderContext.height, 0, 0, renderContext.width, renderContext.height, mask, gl.NEAREST );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( isMRT ) {\n\n\t\t\t\t\t// restore attachments\n\n\t\t\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\t\t\tconst { textureGPU } = this.get( textures[ i ] );\n\n\t\t\t\t\t\tgl.framebufferRenderbuffer( gl.READ_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, msaaRenderbuffers[ i ] );\n\t\t\t\t\t\tgl.framebufferTexture2D( gl.DRAW_FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.TEXTURE_2D, textureGPU, 0 );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( this._supportsInvalidateFramebuffer === true ) {\n\n\t\t\t\t\tgl.invalidateFramebuffer( gl.READ_FRAMEBUFFER, renderTargetContextData.invalidationArray );\n\n\t\t\t\t}\n\n\t\t\t} else if ( renderTarget.resolveDepthBuffer === false && renderTargetContextData.framebuffers ) {\n\n\t\t\t\tconst fb = renderTargetContextData.framebuffers[ renderContext.getCacheKey() ];\n\t\t\t\tstate.bindFramebuffer( gl.DRAW_FRAMEBUFFER, fb );\n\t\t\t\tgl.invalidateFramebuffer( gl.DRAW_FRAMEBUFFER, renderTargetContextData.depthInvalidationArray );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns `true` if the `WEBGL_multisampled_render_to_texture` extension\n\t * should be used when MSAA is enabled.\n\t *\n\t * @private\n\t * @param {RenderTarget} renderTarget - The render target that should be multisampled.\n\t * @return {boolean} Whether to use the `WEBGL_multisampled_render_to_texture` extension for MSAA or not.\n\t */\n\t_useMultisampledExtension( renderTarget ) {\n\n\t\tif ( renderTarget.multiview === true ) {\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn renderTarget.samples > 0 && this.extensions.has( 'WEBGL_multisampled_render_to_texture' ) === true && renderTarget._autoAllocateDepthBuffer !== false;\n\n\t}\n\n\t/**\n\t * Frees internal resources.\n\t */\n\tdispose() {\n\n\t\tif ( this.textureUtils !== null ) this.textureUtils.dispose();\n\n\t\tconst extension = this.extensions.get( 'WEBGL_lose_context' );\n\t\tif ( extension ) extension.loseContext();\n\n\t\tthis.renderer.domElement.removeEventListener( 'webglcontextlost', this._onContextLost );\n\n\t}\n\n}\n\nconst GPUPrimitiveTopology = {\n\tPointList: 'point-list',\n\tLineList: 'line-list',\n\tLineStrip: 'line-strip',\n\tTriangleList: 'triangle-list',\n\tTriangleStrip: 'triangle-strip',\n};\n\nconst GPUShaderStage = ( typeof self !== 'undefined' ) ? self.GPUShaderStage : { VERTEX: 1, FRAGMENT: 2, COMPUTE: 4 };\n\nconst GPUCompareFunction = {\n\tNever: 'never',\n\tLess: 'less',\n\tEqual: 'equal',\n\tLessEqual: 'less-equal',\n\tGreater: 'greater',\n\tNotEqual: 'not-equal',\n\tGreaterEqual: 'greater-equal',\n\tAlways: 'always'\n};\n\nconst GPUStoreOp = {\n\tStore: 'store'};\n\nconst GPULoadOp = {\n\tLoad: 'load',\n\tClear: 'clear'\n};\n\nconst GPUFrontFace = {\n\tCCW: 'ccw',\n\tCW: 'cw'\n};\n\nconst GPUCullMode = {\n\tNone: 'none',\n\tBack: 'back'\n};\n\nconst GPUIndexFormat = {\n\tUint16: 'uint16',\n\tUint32: 'uint32'\n};\n\nconst GPUTextureFormat = {\n\n\t// 8-bit formats\n\n\tR8Unorm: 'r8unorm',\n\tR8Snorm: 'r8snorm',\n\tR8Uint: 'r8uint',\n\tR8Sint: 'r8sint',\n\n\t// 16-bit formats\n\n\tR16Uint: 'r16uint',\n\tR16Sint: 'r16sint',\n\tR16Float: 'r16float',\n\tRG8Unorm: 'rg8unorm',\n\tRG8Snorm: 'rg8snorm',\n\tRG8Uint: 'rg8uint',\n\tRG8Sint: 'rg8sint',\n\n\t// 32-bit formats\n\n\tR32Uint: 'r32uint',\n\tR32Sint: 'r32sint',\n\tR32Float: 'r32float',\n\tRG16Uint: 'rg16uint',\n\tRG16Sint: 'rg16sint',\n\tRG16Float: 'rg16float',\n\tRGBA8Unorm: 'rgba8unorm',\n\tRGBA8UnormSRGB: 'rgba8unorm-srgb',\n\tRGBA8Snorm: 'rgba8snorm',\n\tRGBA8Uint: 'rgba8uint',\n\tRGBA8Sint: 'rgba8sint',\n\tBGRA8Unorm: 'bgra8unorm',\n\tBGRA8UnormSRGB: 'bgra8unorm-srgb',\n\t// Packed 32-bit formats\n\tRGB9E5UFloat: 'rgb9e5ufloat',\n\tRGB10A2Unorm: 'rgb10a2unorm',\n\tRG11B10UFloat: 'rg11b10ufloat',\n\n\t// 64-bit formats\n\n\tRG32Uint: 'rg32uint',\n\tRG32Sint: 'rg32sint',\n\tRG32Float: 'rg32float',\n\tRGBA16Uint: 'rgba16uint',\n\tRGBA16Sint: 'rgba16sint',\n\tRGBA16Float: 'rgba16float',\n\n\t// 128-bit formats\n\n\tRGBA32Uint: 'rgba32uint',\n\tRGBA32Sint: 'rgba32sint',\n\tRGBA32Float: 'rgba32float',\n\n\tDepth16Unorm: 'depth16unorm',\n\tDepth24Plus: 'depth24plus',\n\tDepth24PlusStencil8: 'depth24plus-stencil8',\n\tDepth32Float: 'depth32float',\n\n\t// 'depth32float-stencil8' extension\n\n\tDepth32FloatStencil8: 'depth32float-stencil8',\n\n\t// BC compressed formats usable if 'texture-compression-bc' is both\n\t// supported by the device/user agent and enabled in requestDevice.\n\n\tBC1RGBAUnorm: 'bc1-rgba-unorm',\n\tBC1RGBAUnormSRGB: 'bc1-rgba-unorm-srgb',\n\tBC2RGBAUnorm: 'bc2-rgba-unorm',\n\tBC2RGBAUnormSRGB: 'bc2-rgba-unorm-srgb',\n\tBC3RGBAUnorm: 'bc3-rgba-unorm',\n\tBC3RGBAUnormSRGB: 'bc3-rgba-unorm-srgb',\n\tBC4RUnorm: 'bc4-r-unorm',\n\tBC4RSnorm: 'bc4-r-snorm',\n\tBC5RGUnorm: 'bc5-rg-unorm',\n\tBC5RGSnorm: 'bc5-rg-snorm',\n\tBC6HRGBUFloat: 'bc6h-rgb-ufloat',\n\tBC6HRGBFloat: 'bc6h-rgb-float',\n\tBC7RGBAUnorm: 'bc7-rgba-unorm',\n\tBC7RGBAUnormSRGB: 'bc7-rgba-unorm-srgb',\n\n\t// ETC2 compressed formats usable if 'texture-compression-etc2' is both\n\t// supported by the device/user agent and enabled in requestDevice.\n\n\tETC2RGB8Unorm: 'etc2-rgb8unorm',\n\tETC2RGB8UnormSRGB: 'etc2-rgb8unorm-srgb',\n\tETC2RGB8A1Unorm: 'etc2-rgb8a1unorm',\n\tETC2RGB8A1UnormSRGB: 'etc2-rgb8a1unorm-srgb',\n\tETC2RGBA8Unorm: 'etc2-rgba8unorm',\n\tETC2RGBA8UnormSRGB: 'etc2-rgba8unorm-srgb',\n\tEACR11Unorm: 'eac-r11unorm',\n\tEACR11Snorm: 'eac-r11snorm',\n\tEACRG11Unorm: 'eac-rg11unorm',\n\tEACRG11Snorm: 'eac-rg11snorm',\n\n\t// ASTC compressed formats usable if 'texture-compression-astc' is both\n\t// supported by the device/user agent and enabled in requestDevice.\n\n\tASTC4x4Unorm: 'astc-4x4-unorm',\n\tASTC4x4UnormSRGB: 'astc-4x4-unorm-srgb',\n\tASTC5x4Unorm: 'astc-5x4-unorm',\n\tASTC5x4UnormSRGB: 'astc-5x4-unorm-srgb',\n\tASTC5x5Unorm: 'astc-5x5-unorm',\n\tASTC5x5UnormSRGB: 'astc-5x5-unorm-srgb',\n\tASTC6x5Unorm: 'astc-6x5-unorm',\n\tASTC6x5UnormSRGB: 'astc-6x5-unorm-srgb',\n\tASTC6x6Unorm: 'astc-6x6-unorm',\n\tASTC6x6UnormSRGB: 'astc-6x6-unorm-srgb',\n\tASTC8x5Unorm: 'astc-8x5-unorm',\n\tASTC8x5UnormSRGB: 'astc-8x5-unorm-srgb',\n\tASTC8x6Unorm: 'astc-8x6-unorm',\n\tASTC8x6UnormSRGB: 'astc-8x6-unorm-srgb',\n\tASTC8x8Unorm: 'astc-8x8-unorm',\n\tASTC8x8UnormSRGB: 'astc-8x8-unorm-srgb',\n\tASTC10x5Unorm: 'astc-10x5-unorm',\n\tASTC10x5UnormSRGB: 'astc-10x5-unorm-srgb',\n\tASTC10x6Unorm: 'astc-10x6-unorm',\n\tASTC10x6UnormSRGB: 'astc-10x6-unorm-srgb',\n\tASTC10x8Unorm: 'astc-10x8-unorm',\n\tASTC10x8UnormSRGB: 'astc-10x8-unorm-srgb',\n\tASTC10x10Unorm: 'astc-10x10-unorm',\n\tASTC10x10UnormSRGB: 'astc-10x10-unorm-srgb',\n\tASTC12x10Unorm: 'astc-12x10-unorm',\n\tASTC12x10UnormSRGB: 'astc-12x10-unorm-srgb',\n\tASTC12x12Unorm: 'astc-12x12-unorm',\n\tASTC12x12UnormSRGB: 'astc-12x12-unorm-srgb',\n\n};\n\nconst GPUAddressMode = {\n\tClampToEdge: 'clamp-to-edge',\n\tRepeat: 'repeat',\n\tMirrorRepeat: 'mirror-repeat'\n};\n\nconst GPUFilterMode = {\n\tLinear: 'linear',\n\tNearest: 'nearest'\n};\n\nconst GPUBlendFactor = {\n\tZero: 'zero',\n\tOne: 'one',\n\tSrc: 'src',\n\tOneMinusSrc: 'one-minus-src',\n\tSrcAlpha: 'src-alpha',\n\tOneMinusSrcAlpha: 'one-minus-src-alpha',\n\tDst: 'dst',\n\tOneMinusDst: 'one-minus-dst',\n\tDstAlpha: 'dst-alpha',\n\tOneMinusDstAlpha: 'one-minus-dst-alpha',\n\tSrcAlphaSaturated: 'src-alpha-saturated',\n\tConstant: 'constant',\n\tOneMinusConstant: 'one-minus-constant'\n};\n\nconst GPUBlendOperation = {\n\tAdd: 'add',\n\tSubtract: 'subtract',\n\tReverseSubtract: 'reverse-subtract',\n\tMin: 'min',\n\tMax: 'max'\n};\n\nconst GPUColorWriteFlags = {\n\tNone: 0,\n\tAll: 0xF\n};\n\nconst GPUStencilOperation = {\n\tKeep: 'keep',\n\tZero: 'zero',\n\tReplace: 'replace',\n\tInvert: 'invert',\n\tIncrementClamp: 'increment-clamp',\n\tDecrementClamp: 'decrement-clamp',\n\tIncrementWrap: 'increment-wrap',\n\tDecrementWrap: 'decrement-wrap'\n};\n\nconst GPUBufferBindingType = {\n\tStorage: 'storage',\n\tReadOnlyStorage: 'read-only-storage'\n};\n\nconst GPUStorageTextureAccess = {\n\tWriteOnly: 'write-only',\n\tReadOnly: 'read-only',\n\tReadWrite: 'read-write',\n};\n\nconst GPUSamplerBindingType = {\n\tNonFiltering: 'non-filtering',\n\tComparison: 'comparison'\n};\n\nconst GPUTextureSampleType = {\n\tFloat: 'float',\n\tUnfilterableFloat: 'unfilterable-float',\n\tDepth: 'depth',\n\tSInt: 'sint',\n\tUInt: 'uint'\n};\n\nconst GPUTextureDimension = {\n\tTwoD: '2d',\n\tThreeD: '3d'\n};\n\nconst GPUTextureViewDimension = {\n\tTwoD: '2d',\n\tTwoDArray: '2d-array',\n\tCube: 'cube',\n\tThreeD: '3d'\n};\n\nconst GPUTextureAspect = {\n\tAll: 'all'};\n\nconst GPUInputStepMode = {\n\tVertex: 'vertex',\n\tInstance: 'instance'\n};\n\nconst GPUFeatureName = {\n\tCoreFeaturesAndLimits: 'core-features-and-limits',\n\tDepthClipControl: 'depth-clip-control',\n\tDepth32FloatStencil8: 'depth32float-stencil8',\n\tTextureCompressionBC: 'texture-compression-bc',\n\tTextureCompressionBCSliced3D: 'texture-compression-bc-sliced-3d',\n\tTextureCompressionETC2: 'texture-compression-etc2',\n\tTextureCompressionASTC: 'texture-compression-astc',\n\tTextureCompressionASTCSliced3D: 'texture-compression-astc-sliced-3d',\n\tTimestampQuery: 'timestamp-query',\n\tIndirectFirstInstance: 'indirect-first-instance',\n\tShaderF16: 'shader-f16',\n\tRG11B10UFloat: 'rg11b10ufloat-renderable',\n\tBGRA8UNormStorage: 'bgra8unorm-storage',\n\tFloat32Filterable: 'float32-filterable',\n\tFloat32Blendable: 'float32-blendable',\n\tClipDistances: 'clip-distances',\n\tDualSourceBlending: 'dual-source-blending',\n\tSubgroups: 'subgroups',\n\tTextureFormatsTier1: 'texture-formats-tier1',\n\tTextureFormatsTier2: 'texture-formats-tier2'\n};\n\nconst GPUFeatureMap = {\n\t'texture-compression-s3tc': 'texture-compression-bc',\n\t'texture-compression-etc1': 'texture-compression-etc2'\n};\n\n/**\n * A special form of sampler binding type.\n * It's texture value is managed by a node object.\n *\n * @private\n * @augments Sampler\n */\nclass NodeSampler extends Sampler {\n\n\t/**\n\t * Constructs a new node-based sampler.\n\t *\n\t * @param {string} name - The samplers's name.\n\t * @param {TextureNode} textureNode - The texture node.\n\t * @param {UniformGroupNode} groupNode - The uniform group node.\n\t */\n\tconstructor( name, textureNode, groupNode ) {\n\n\t\tsuper( name, textureNode ? textureNode.value : null );\n\n\t\t/**\n\t\t * The texture node.\n\t\t *\n\t\t * @type {TextureNode}\n\t\t */\n\t\tthis.textureNode = textureNode;\n\n\t\t/**\n\t\t * The uniform group node.\n\t\t *\n\t\t * @type {UniformGroupNode}\n\t\t */\n\t\tthis.groupNode = groupNode;\n\n\t}\n\n\t/**\n\t * Updates the texture value of this sampler.\n\t *\n\t * @return {boolean} Whether the sampler needs an update or not.\n\t */\n\tupdate() {\n\n\t\tconst { textureNode } = this;\n\n\t\tif ( this.texture !== textureNode.value ) {\n\n\t\t\tthis.texture = textureNode.value;\n\n\t\t\treturn true;\n\n\t\t}\n\n\t\treturn super.update();\n\n\t}\n\n}\n\n/**\n * Represents a storage buffer binding type.\n *\n * @private\n * @augments Buffer\n */\nclass StorageBuffer extends Buffer {\n\n\t/**\n\t * Constructs a new uniform buffer.\n\t *\n\t * @param {string} name - The buffer's name.\n\t * @param {BufferAttribute} attribute - The buffer attribute.\n\t */\n\tconstructor( name, attribute ) {\n\n\t\tsuper( name, attribute ? attribute.array : null );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {BufferAttribute}\n\t\t */\n\t\tthis.attribute = attribute;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isStorageBuffer = true;\n\n\t}\n\n}\n\nlet _id = 0;\n\n/**\n * A special form of storage buffer binding type.\n * It's buffer value is managed by a node object.\n *\n * @private\n * @augments StorageBuffer\n */\nclass NodeStorageBuffer extends StorageBuffer {\n\n\t/**\n\t * Constructs a new node-based storage buffer.\n\t *\n\t * @param {StorageBufferNode} nodeUniform - The storage buffer node.\n\t * @param {UniformGroupNode} groupNode - The uniform group node.\n\t */\n\tconstructor( nodeUniform, groupNode ) {\n\n\t\tsuper( 'StorageBuffer_' + _id ++, nodeUniform ? nodeUniform.value : null );\n\n\t\t/**\n\t\t * The node uniform.\n\t\t *\n\t\t * @type {StorageBufferNode}\n\t\t */\n\t\tthis.nodeUniform = nodeUniform;\n\n\t\t/**\n\t\t * The access type.\n\t\t *\n\t\t * @type {string}\n\t\t */\n\t\tthis.access = nodeUniform ? nodeUniform.access : NodeAccess.READ_WRITE;\n\n\t\t/**\n\t\t * The uniform group node.\n\t\t *\n\t\t * @type {UniformGroupNode}\n\t\t */\n\t\tthis.groupNode = groupNode;\n\n\t}\n\n\t/**\n\t * The storage buffer.\n\t *\n\t * @type {BufferAttribute}\n\t */\n\tget buffer() {\n\n\t\treturn this.nodeUniform.value;\n\n\t}\n\n}\n\n/**\n * A WebGPU backend utility module used by {@link WebGPUTextureUtils}.\n *\n * @private\n */\nclass WebGPUTexturePassUtils extends DataMap {\n\n\t/**\n\t * Constructs a new utility object.\n\t *\n\t * @param {GPUDevice} device - The WebGPU device.\n\t */\n\tconstructor( device ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The WebGPU device.\n\t\t *\n\t\t * @type {GPUDevice}\n\t\t */\n\t\tthis.device = device;\n\n\t\tconst mipmapVertexSource = `\nstruct VarysStruct {\n\t@builtin( position ) Position: vec4<f32>,\n\t@location( 0 ) vTex : vec2<f32>\n};\n\n@vertex\nfn main( @builtin( vertex_index ) vertexIndex : u32 ) -> VarysStruct {\n\n\tvar Varys : VarysStruct;\n\n\tvar pos = array< vec2<f32>, 4 >(\n\t\tvec2<f32>( -1.0,  1.0 ),\n\t\tvec2<f32>(  1.0,  1.0 ),\n\t\tvec2<f32>( -1.0, -1.0 ),\n\t\tvec2<f32>(  1.0, -1.0 )\n\t);\n\n\tvar tex = array< vec2<f32>, 4 >(\n\t\tvec2<f32>( 0.0, 0.0 ),\n\t\tvec2<f32>( 1.0, 0.0 ),\n\t\tvec2<f32>( 0.0, 1.0 ),\n\t\tvec2<f32>( 1.0, 1.0 )\n\t);\n\n\tVarys.vTex = tex[ vertexIndex ];\n\tVarys.Position = vec4<f32>( pos[ vertexIndex ], 0.0, 1.0 );\n\n\treturn Varys;\n\n}\n`;\n\n\t\tconst mipmapFragmentSource = `\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d<f32>;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2<f32> ) -> @location( 0 ) vec4<f32> {\n\n\treturn textureSample( img, imgSampler, vTex );\n\n}\n`;\n\n\t\tconst flipYFragmentSource = `\n@group( 0 ) @binding( 0 )\nvar imgSampler : sampler;\n\n@group( 0 ) @binding( 1 )\nvar img : texture_2d<f32>;\n\n@fragment\nfn main( @location( 0 ) vTex : vec2<f32> ) -> @location( 0 ) vec4<f32> {\n\n\treturn textureSample( img, imgSampler, vec2( vTex.x, 1.0 - vTex.y ) );\n\n}\n`;\n\n\t\t/**\n\t\t * The mipmap GPU sampler.\n\t\t *\n\t\t * @type {GPUSampler}\n\t\t */\n\t\tthis.mipmapSampler = device.createSampler( { minFilter: GPUFilterMode.Linear } );\n\n\t\t/**\n\t\t * The flipY GPU sampler.\n\t\t *\n\t\t * @type {GPUSampler}\n\t\t */\n\t\tthis.flipYSampler = device.createSampler( { minFilter: GPUFilterMode.Nearest } ); //@TODO?: Consider using textureLoad()\n\n\t\t/**\n\t\t * A cache for GPU render pipelines used for copy/transfer passes.\n\t\t * Every texture format requires a unique pipeline.\n\t\t *\n\t\t * @type {Object<string,GPURenderPipeline>}\n\t\t */\n\t\tthis.transferPipelines = {};\n\n\t\t/**\n\t\t * A cache for GPU render pipelines used for flipY passes.\n\t\t * Every texture format requires a unique pipeline.\n\t\t *\n\t\t * @type {Object<string,GPURenderPipeline>}\n\t\t */\n\t\tthis.flipYPipelines = {};\n\n\t\t/**\n\t\t * The mipmap vertex shader module.\n\t\t *\n\t\t * @type {GPUShaderModule}\n\t\t */\n\t\tthis.mipmapVertexShaderModule = device.createShaderModule( {\n\t\t\tlabel: 'mipmapVertex',\n\t\t\tcode: mipmapVertexSource\n\t\t} );\n\n\t\t/**\n\t\t * The mipmap fragment shader module.\n\t\t *\n\t\t * @type {GPUShaderModule}\n\t\t */\n\t\tthis.mipmapFragmentShaderModule = device.createShaderModule( {\n\t\t\tlabel: 'mipmapFragment',\n\t\t\tcode: mipmapFragmentSource\n\t\t} );\n\n\t\t/**\n\t\t * The flipY fragment shader module.\n\t\t *\n\t\t * @type {GPUShaderModule}\n\t\t */\n\t\tthis.flipYFragmentShaderModule = device.createShaderModule( {\n\t\t\tlabel: 'flipYFragment',\n\t\t\tcode: flipYFragmentSource\n\t\t} );\n\n\t}\n\n\t/**\n\t * Returns a render pipeline for the internal copy render pass. The pass\n\t * requires a unique render pipeline for each texture format.\n\t *\n\t * @param {string} format - The GPU texture format\n\t * @return {GPURenderPipeline} The GPU render pipeline.\n\t */\n\tgetTransferPipeline( format ) {\n\n\t\tlet pipeline = this.transferPipelines[ format ];\n\n\t\tif ( pipeline === undefined ) {\n\n\t\t\tpipeline = this.device.createRenderPipeline( {\n\t\t\t\tlabel: `mipmap-${ format }`,\n\t\t\t\tvertex: {\n\t\t\t\t\tmodule: this.mipmapVertexShaderModule,\n\t\t\t\t\tentryPoint: 'main'\n\t\t\t\t},\n\t\t\t\tfragment: {\n\t\t\t\t\tmodule: this.mipmapFragmentShaderModule,\n\t\t\t\t\tentryPoint: 'main',\n\t\t\t\t\ttargets: [ { format } ]\n\t\t\t\t},\n\t\t\t\tprimitive: {\n\t\t\t\t\ttopology: GPUPrimitiveTopology.TriangleStrip,\n\t\t\t\t\tstripIndexFormat: GPUIndexFormat.Uint32\n\t\t\t\t},\n\t\t\t\tlayout: 'auto'\n\t\t\t} );\n\n\t\t\tthis.transferPipelines[ format ] = pipeline;\n\n\t\t}\n\n\t\treturn pipeline;\n\n\t}\n\n\t/**\n\t * Returns a render pipeline for the flipY render pass. The pass\n\t * requires a unique render pipeline for each texture format.\n\t *\n\t * @param {string} format - The GPU texture format\n\t * @return {GPURenderPipeline} The GPU render pipeline.\n\t */\n\tgetFlipYPipeline( format ) {\n\n\t\tlet pipeline = this.flipYPipelines[ format ];\n\n\t\tif ( pipeline === undefined ) {\n\n\t\t\tpipeline = this.device.createRenderPipeline( {\n\t\t\t\tlabel: `flipY-${ format }`,\n\t\t\t\tvertex: {\n\t\t\t\t\tmodule: this.mipmapVertexShaderModule,\n\t\t\t\t\tentryPoint: 'main'\n\t\t\t\t},\n\t\t\t\tfragment: {\n\t\t\t\t\tmodule: this.flipYFragmentShaderModule,\n\t\t\t\t\tentryPoint: 'main',\n\t\t\t\t\ttargets: [ { format } ]\n\t\t\t\t},\n\t\t\t\tprimitive: {\n\t\t\t\t\ttopology: GPUPrimitiveTopology.TriangleStrip,\n\t\t\t\t\tstripIndexFormat: GPUIndexFormat.Uint32\n\t\t\t\t},\n\t\t\t\tlayout: 'auto'\n\t\t\t} );\n\n\t\t\tthis.flipYPipelines[ format ] = pipeline;\n\n\t\t}\n\n\t\treturn pipeline;\n\n\t}\n\n\t/**\n\t * Flip the contents of the given GPU texture along its vertical axis.\n\t *\n\t * @param {GPUTexture} textureGPU - The GPU texture object.\n\t * @param {Object} textureGPUDescriptor - The texture descriptor.\n\t * @param {number} [baseArrayLayer=0] - The index of the first array layer accessible to the texture view.\n\t */\n\tflipY( textureGPU, textureGPUDescriptor, baseArrayLayer = 0 ) {\n\n\t\tconst format = textureGPUDescriptor.format;\n\t\tconst { width, height } = textureGPUDescriptor.size;\n\n\t\tconst transferPipeline = this.getTransferPipeline( format );\n\t\tconst flipYPipeline = this.getFlipYPipeline( format );\n\n\t\tconst tempTexture = this.device.createTexture( {\n\t\t\tsize: { width, height, depthOrArrayLayers: 1 },\n\t\t\tformat,\n\t\t\tusage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING\n\t\t} );\n\n\t\tconst srcView = textureGPU.createView( {\n\t\t\tbaseMipLevel: 0,\n\t\t\tmipLevelCount: 1,\n\t\t\tdimension: GPUTextureViewDimension.TwoD,\n\t\t\tbaseArrayLayer\n\t\t} );\n\n\t\tconst dstView = tempTexture.createView( {\n\t\t\tbaseMipLevel: 0,\n\t\t\tmipLevelCount: 1,\n\t\t\tdimension: GPUTextureViewDimension.TwoD,\n\t\t\tbaseArrayLayer: 0\n\t\t} );\n\n\t\tconst commandEncoder = this.device.createCommandEncoder( {} );\n\n\t\tconst pass = ( pipeline, sourceView, destinationView ) => {\n\n\t\t\tconst bindGroupLayout = pipeline.getBindGroupLayout( 0 ); // @TODO: Consider making this static.\n\n\t\t\tconst bindGroup = this.device.createBindGroup( {\n\t\t\t\tlayout: bindGroupLayout,\n\t\t\t\tentries: [ {\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: this.flipYSampler\n\t\t\t\t}, {\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: sourceView\n\t\t\t\t} ]\n\t\t\t} );\n\n\t\t\tconst passEncoder = commandEncoder.beginRenderPass( {\n\t\t\t\tcolorAttachments: [ {\n\t\t\t\t\tview: destinationView,\n\t\t\t\t\tloadOp: GPULoadOp.Clear,\n\t\t\t\t\tstoreOp: GPUStoreOp.Store,\n\t\t\t\t\tclearValue: [ 0, 0, 0, 0 ]\n\t\t\t\t} ]\n\t\t\t} );\n\n\t\t\tpassEncoder.setPipeline( pipeline );\n\t\t\tpassEncoder.setBindGroup( 0, bindGroup );\n\t\t\tpassEncoder.draw( 4, 1, 0, 0 );\n\t\t\tpassEncoder.end();\n\n\t\t};\n\n\t\tpass( transferPipeline, srcView, dstView );\n\t\tpass( flipYPipeline, dstView, srcView );\n\n\t\tthis.device.queue.submit( [ commandEncoder.finish() ] );\n\n\t\ttempTexture.destroy();\n\n\t}\n\n\t/**\n\t * Generates mipmaps for the given GPU texture.\n\t *\n\t * @param {GPUTexture} textureGPU - The GPU texture object.\n\t * @param {Object} textureGPUDescriptor - The texture descriptor.\n\t * @param {number} [baseArrayLayer=0] - The index of the first array layer accessible to the texture view.\n\t * @param {?GPUCommandEncoder} [encoder=null] - An optional command encoder used to generate mipmaps.\n\t */\n\tgenerateMipmaps( textureGPU, textureGPUDescriptor, baseArrayLayer = 0, encoder = null ) {\n\n\t\tconst textureData = this.get( textureGPU );\n\n\t\tif ( textureData.layers === undefined ) {\n\n\t\t\ttextureData.layers = [];\n\n\t\t}\n\n\t\tconst passes = textureData.layers[ baseArrayLayer ] || this._mipmapCreateBundles( textureGPU, textureGPUDescriptor, baseArrayLayer );\n\n\t\tconst commandEncoder = encoder || this.device.createCommandEncoder( { label: 'mipmapEncoder' } );\n\n\t\tthis._mipmapRunBundles( commandEncoder, passes );\n\n\t\tif ( encoder === null ) this.device.queue.submit( [ commandEncoder.finish() ] );\n\n\t\ttextureData.layers[ baseArrayLayer ] = passes;\n\n\t}\n\n\t/**\n\t * Since multiple copy render passes are required to generate mipmaps, the passes\n\t * are managed as render bundles to improve performance.\n\t *\n\t * @param {GPUTexture} textureGPU - The GPU texture object.\n\t * @param {Object} textureGPUDescriptor - The texture descriptor.\n\t * @param {number} baseArrayLayer - The index of the first array layer accessible to the texture view.\n\t * @return {Array<Object>} An array of render bundles.\n\t */\n\t_mipmapCreateBundles( textureGPU, textureGPUDescriptor, baseArrayLayer ) {\n\n\t\tconst pipeline = this.getTransferPipeline( textureGPUDescriptor.format );\n\n\t\tconst bindGroupLayout = pipeline.getBindGroupLayout( 0 ); // @TODO: Consider making this static.\n\n\t\tlet srcView = textureGPU.createView( {\n\t\t\tbaseMipLevel: 0,\n\t\t\tmipLevelCount: 1,\n\t\t\tdimension: GPUTextureViewDimension.TwoD,\n\t\t\tbaseArrayLayer\n\t\t} );\n\n\t\tconst passes = [];\n\n\t\tfor ( let i = 1; i < textureGPUDescriptor.mipLevelCount; i ++ ) {\n\n\t\t\tconst bindGroup = this.device.createBindGroup( {\n\t\t\t\tlayout: bindGroupLayout,\n\t\t\t\tentries: [ {\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: this.mipmapSampler\n\t\t\t\t}, {\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: srcView\n\t\t\t\t} ]\n\t\t\t} );\n\n\t\t\tconst dstView = textureGPU.createView( {\n\t\t\t\tbaseMipLevel: i,\n\t\t\t\tmipLevelCount: 1,\n\t\t\t\tdimension: GPUTextureViewDimension.TwoD,\n\t\t\t\tbaseArrayLayer\n\t\t\t} );\n\n\t\t\tconst passDescriptor = {\n\t\t\t\tcolorAttachments: [ {\n\t\t\t\t\tview: dstView,\n\t\t\t\t\tloadOp: GPULoadOp.Clear,\n\t\t\t\t\tstoreOp: GPUStoreOp.Store,\n\t\t\t\t\tclearValue: [ 0, 0, 0, 0 ]\n\t\t\t\t} ]\n\t\t\t};\n\n\t\t\tconst passEncoder = this.device.createRenderBundleEncoder( {\n\t\t\t\tcolorFormats: [ textureGPUDescriptor.format ]\n\t\t\t} );\n\n\t\t\tpassEncoder.setPipeline( pipeline );\n\t\t\tpassEncoder.setBindGroup( 0, bindGroup );\n\t\t\tpassEncoder.draw( 4, 1, 0, 0 );\n\n\t\t\tpasses.push( {\n\t\t\t\trenderBundles: [ passEncoder.finish() ],\n\t\t\t\tpassDescriptor\n\t\t\t} );\n\n\t\t\tsrcView = dstView;\n\n\t\t}\n\n\t\treturn passes;\n\n\t}\n\n\t/**\n\t * Executes the render bundles.\n\t *\n\t * @param {GPUCommandEncoder} commandEncoder - The GPU command encoder.\n\t * @param {Array<Object>} passes - An array of render bundles.\n\t */\n\t_mipmapRunBundles( commandEncoder, passes ) {\n\n\t\tconst levels = passes.length;\n\n\t\tfor ( let i = 0; i < levels; i ++ ) {\n\n\t\t\tconst pass = passes[ i ];\n\n\t\t\tconst passEncoder = commandEncoder.beginRenderPass( pass.passDescriptor );\n\n\t\t\tpassEncoder.executeBundles( pass.renderBundles );\n\n\t\t\tpassEncoder.end();\n\n\t\t}\n\n\t}\n\n}\n\nconst _compareToWebGPU = {\n\t[ NeverCompare ]: 'never',\n\t[ LessCompare ]: 'less',\n\t[ EqualCompare ]: 'equal',\n\t[ LessEqualCompare ]: 'less-equal',\n\t[ GreaterCompare ]: 'greater',\n\t[ GreaterEqualCompare ]: 'greater-equal',\n\t[ AlwaysCompare ]: 'always',\n\t[ NotEqualCompare ]: 'not-equal'\n};\n\nconst _flipMap = [ 0, 1, 3, 2, 4, 5 ];\n\n/**\n * A WebGPU backend utility module for managing textures.\n *\n * @private\n */\nclass WebGPUTextureUtils {\n\n\t/**\n\t * Constructs a new utility object.\n\t *\n\t * @param {WebGPUBackend} backend - The WebGPU backend.\n\t */\n\tconstructor( backend ) {\n\n\t\t/**\n\t\t * A reference to the WebGPU backend.\n\t\t *\n\t\t * @type {WebGPUBackend}\n\t\t */\n\t\tthis.backend = backend;\n\n\t\t/**\n\t\t * A reference to the pass utils.\n\t\t *\n\t\t * @type {?WebGPUTexturePassUtils}\n\t\t * @default null\n\t\t */\n\t\tthis._passUtils = null;\n\n\t\t/**\n\t\t * A dictionary for managing default textures. The key\n\t\t * is the texture format, the value the texture object.\n\t\t *\n\t\t * @type {Object<string,Texture>}\n\t\t */\n\t\tthis.defaultTexture = {};\n\n\t\t/**\n\t\t * A dictionary for managing default cube textures. The key\n\t\t * is the texture format, the value the texture object.\n\t\t *\n\t\t * @type {Object<string,CubeTexture>}\n\t\t */\n\t\tthis.defaultCubeTexture = {};\n\n\t\t/**\n\t\t * A default video frame.\n\t\t *\n\t\t * @type {?VideoFrame}\n\t\t * @default null\n\t\t */\n\t\tthis.defaultVideoFrame = null;\n\n\t\t/**\n\t\t * A cache of shared texture samplers.\n\t\t *\n\t\t * @type {Map<string, Object>}\n\t\t */\n\t\tthis._samplerCache = new Map();\n\n\t}\n\n\t/**\n\t * Creates a GPU sampler for the given texture.\n\t *\n\t * @param {Texture} texture - The texture to create the sampler for.\n\t * @return {string} The current sampler key.\n\t */\n\tupdateSampler( texture ) {\n\n\t\tconst backend = this.backend;\n\n\t\tconst samplerKey = texture.minFilter + '-' + texture.magFilter + '-' +\n\t\t\ttexture.wrapS + '-' + texture.wrapT + '-' + ( texture.wrapR || '0' ) + '-' +\n\t\t\ttexture.anisotropy + '-' + ( texture.compareFunction || 0 );\n\n\t\tlet samplerData = this._samplerCache.get( samplerKey );\n\n\t\tif ( samplerData === undefined ) {\n\n\t\t\tconst samplerDescriptorGPU = {\n\t\t\t\taddressModeU: this._convertAddressMode( texture.wrapS ),\n\t\t\t\taddressModeV: this._convertAddressMode( texture.wrapT ),\n\t\t\t\taddressModeW: this._convertAddressMode( texture.wrapR ),\n\t\t\t\tmagFilter: this._convertFilterMode( texture.magFilter ),\n\t\t\t\tminFilter: this._convertFilterMode( texture.minFilter ),\n\t\t\t\tmipmapFilter: this._convertFilterMode( texture.minFilter ),\n\t\t\t\tmaxAnisotropy: 1\n\t\t\t};\n\n\t\t\t// anisotropy can only be used when all filter modes are set to linear.\n\n\t\t\tif ( samplerDescriptorGPU.magFilter === GPUFilterMode.Linear && samplerDescriptorGPU.minFilter === GPUFilterMode.Linear && samplerDescriptorGPU.mipmapFilter === GPUFilterMode.Linear ) {\n\n\t\t\t\tsamplerDescriptorGPU.maxAnisotropy = texture.anisotropy;\n\n\t\t\t}\n\n\t\t\tif ( texture.isDepthTexture && texture.compareFunction !== null ) {\n\n\t\t\t\tsamplerDescriptorGPU.compare = _compareToWebGPU[ texture.compareFunction ];\n\n\t\t\t}\n\n\t\t\tconst sampler = backend.device.createSampler( samplerDescriptorGPU );\n\n\t\t\tsamplerData = { sampler, usedTimes: 0 };\n\n\t\t\tthis._samplerCache.set( samplerKey, samplerData );\n\n\t\t}\n\n\t\tconst textureData = backend.get( texture );\n\n\t\tif ( textureData.sampler !== samplerData.sampler ) {\n\n\t\t\t// check if previous sampler is unused so it can be deleted\n\n\t\t\tif ( textureData.sampler !== undefined ) {\n\n\t\t\t\tconst oldSamplerData = this._samplerCache.get( textureData.samplerKey );\n\t\t\t\toldSamplerData.usedTimes --;\n\n\t\t\t\tif ( oldSamplerData.usedTimes === 0 ) {\n\n\t\t\t\t\tthis._samplerCache.delete( textureData.samplerKey );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// update to new sampler data\n\n\t\t\ttextureData.samplerKey = samplerKey;\n\t\t\ttextureData.sampler = samplerData.sampler;\n\n\t\t\tsamplerData.usedTimes ++;\n\n\t\t}\n\n\t\treturn samplerKey;\n\n\t}\n\n\t/**\n\t * Creates a default texture for the given texture that can be used\n\t * as a placeholder until the actual texture is ready for usage.\n\t *\n\t * @param {Texture} texture - The texture to create a default texture for.\n\t */\n\tcreateDefaultTexture( texture ) {\n\n\t\tlet textureGPU;\n\n\t\tconst format = getFormat( texture );\n\n\t\tif ( texture.isCubeTexture ) {\n\n\t\t\ttextureGPU = this._getDefaultCubeTextureGPU( format );\n\n\t\t} else {\n\n\t\t\ttextureGPU = this._getDefaultTextureGPU( format );\n\n\t\t}\n\n\t\tthis.backend.get( texture ).texture = textureGPU;\n\n\t}\n\n\t/**\n\t * Defines a texture on the GPU for the given texture object.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {Object} [options={}] - Optional configuration parameter.\n\t */\n\tcreateTexture( texture, options = {} ) {\n\n\t\tconst backend = this.backend;\n\t\tconst textureData = backend.get( texture );\n\n\t\tif ( textureData.initialized ) {\n\n\t\t\tthrow new Error( 'WebGPUTextureUtils: Texture already initialized.' );\n\n\t\t}\n\n\t\tif ( texture.isExternalTexture ) {\n\n\t\t\ttextureData.texture = texture.sourceTexture;\n\t\t\ttextureData.initialized = true;\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( options.needsMipmaps === undefined ) options.needsMipmaps = false;\n\t\tif ( options.levels === undefined ) options.levels = 1;\n\t\tif ( options.depth === undefined ) options.depth = 1;\n\n\t\tconst { width, height, depth, levels } = options;\n\n\t\tif ( texture.isFramebufferTexture ) {\n\n\t\t\tif ( options.renderTarget ) {\n\n\t\t\t\toptions.format = this.backend.utils.getCurrentColorFormat( options.renderTarget );\n\n\t\t\t} else {\n\n\t\t\t\toptions.format = this.backend.utils.getPreferredCanvasFormat();\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst dimension = this._getDimension( texture );\n\t\tconst format = texture.internalFormat || options.format || getFormat( texture, backend.device );\n\n\t\ttextureData.format = format;\n\n\t\tconst { samples, primarySamples, isMSAA } = backend.utils.getTextureSampleData( texture );\n\n\t\tlet usage = GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.COPY_SRC;\n\n\t\tif ( texture.isStorageTexture === true ) {\n\n\t\t\tusage |= GPUTextureUsage.STORAGE_BINDING;\n\n\t\t}\n\n\t\tif ( texture.isCompressedTexture !== true && texture.isCompressedArrayTexture !== true && format !== GPUTextureFormat.RGB9E5UFloat ) {\n\n\t\t\tusage |= GPUTextureUsage.RENDER_ATTACHMENT;\n\n\t\t}\n\n\t\tconst textureDescriptorGPU = {\n\t\t\tlabel: texture.name,\n\t\t\tsize: {\n\t\t\t\twidth: width,\n\t\t\t\theight: height,\n\t\t\t\tdepthOrArrayLayers: depth,\n\t\t\t},\n\t\t\tmipLevelCount: levels,\n\t\t\tsampleCount: primarySamples,\n\t\t\tdimension: dimension,\n\t\t\tformat: format,\n\t\t\tusage: usage\n\t\t};\n\n\t\t// texture creation\n\n\t\tif ( format === undefined ) {\n\n\t\t\twarn( 'WebGPURenderer: Texture format not supported.' );\n\n\t\t\tthis.createDefaultTexture( texture );\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( texture.isCubeTexture ) {\n\n\t\t\ttextureDescriptorGPU.textureBindingViewDimension = GPUTextureViewDimension.Cube;\n\n\t\t}\n\n\t\ttextureData.texture = backend.device.createTexture( textureDescriptorGPU );\n\n\t\tif ( isMSAA ) {\n\n\t\t\tconst msaaTextureDescriptorGPU = Object.assign( {}, textureDescriptorGPU );\n\n\t\t\tmsaaTextureDescriptorGPU.label = msaaTextureDescriptorGPU.label + '-msaa';\n\t\t\tmsaaTextureDescriptorGPU.sampleCount = samples;\n\t\t\tmsaaTextureDescriptorGPU.mipLevelCount = 1; // See https://www.w3.org/TR/webgpu/#texture-creation\n\n\t\t\ttextureData.msaaTexture = backend.device.createTexture( msaaTextureDescriptorGPU );\n\n\t\t}\n\n\t\ttextureData.initialized = true;\n\n\t\ttextureData.textureDescriptorGPU = textureDescriptorGPU;\n\n\t}\n\n\t/**\n\t * Destroys the GPU data for the given texture object.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {boolean} [isDefaultTexture=false] - Whether the texture uses a default GPU texture or not.\n\t */\n\tdestroyTexture( texture, isDefaultTexture = false ) {\n\n\t\tconst backend = this.backend;\n\t\tconst textureData = backend.get( texture );\n\n\t\tif ( textureData.texture !== undefined && isDefaultTexture === false ) textureData.texture.destroy();\n\n\t\tif ( textureData.msaaTexture !== undefined ) textureData.msaaTexture.destroy();\n\n\t\tbackend.delete( texture );\n\n\t}\n\n\t/**\n\t * Generates mipmaps for the given texture.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {?GPUCommandEncoder} [encoder=null] - An optional command encoder used to generate mipmaps.\n\t */\n\tgenerateMipmaps( texture, encoder = null ) {\n\n\t\tconst textureData = this.backend.get( texture );\n\n\t\tif ( texture.isCubeTexture ) {\n\n\t\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\t\tthis._generateMipmaps( textureData.texture, textureData.textureDescriptorGPU, i, encoder );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst depth = texture.image.depth || 1;\n\n\t\t\tfor ( let i = 0; i < depth; i ++ ) {\n\n\t\t\t\tthis._generateMipmaps( textureData.texture, textureData.textureDescriptorGPU, i, encoder );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the color buffer representing the color\n\t * attachment of the default framebuffer.\n\t *\n\t * @return {GPUTexture} The color buffer.\n\t */\n\tgetColorBuffer() {\n\n\t\tconst backend = this.backend;\n\t\tconst canvasTarget = backend.renderer.getCanvasTarget();\n\t\tconst { width, height } = backend.getDrawingBufferSize();\n\t\tconst samples = backend.renderer.currentSamples;\n\n\t\tconst colorTexture = canvasTarget.colorTexture;\n\t\tconst colorTextureData = backend.get( colorTexture );\n\n\t\tif ( colorTexture.width === width && colorTexture.height === height && colorTexture.samples === samples ) {\n\n\t\t\treturn colorTextureData.texture;\n\n\t\t}\n\n\t\t// recreate\n\n\t\tlet colorBuffer = colorTextureData.texture;\n\n\t\tif ( colorBuffer ) colorBuffer.destroy();\n\n\t\tcolorBuffer = backend.device.createTexture( {\n\t\t\tlabel: 'colorBuffer',\n\t\t\tsize: {\n\t\t\t\twidth: width,\n\t\t\t\theight: height,\n\t\t\t\tdepthOrArrayLayers: 1\n\t\t\t},\n\t\t\tsampleCount: backend.utils.getSampleCount( backend.renderer.currentSamples ),\n\t\t\tformat: backend.utils.getPreferredCanvasFormat(),\n\t\t\tusage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC\n\t\t} );\n\n\t\t//\n\n\t\tcolorTexture.source.width = width;\n\t\tcolorTexture.source.height = height;\n\t\tcolorTexture.samples = samples;\n\n\t\tcolorTextureData.texture = colorBuffer;\n\n\t\treturn colorBuffer;\n\n\t}\n\n\t/**\n\t * Returns the depth buffer representing the depth\n\t * attachment of the default framebuffer.\n\t *\n\t * @param {boolean} [depth=true] - Whether depth is enabled or not.\n\t * @param {boolean} [stencil=false] -  Whether stencil is enabled or not.\n\t * @return {GPUTexture} The depth buffer.\n\t */\n\tgetDepthBuffer( depth = true, stencil = false ) {\n\n\t\tconst backend = this.backend;\n\t\tconst canvasTarget = backend.renderer.getCanvasTarget();\n\t\tconst { width, height } = backend.getDrawingBufferSize();\n\t\tconst samples = backend.renderer.currentSamples;\n\n\t\tconst depthTexture = canvasTarget.depthTexture;\n\n\t\tif ( depthTexture.width === width &&\n\t\t\tdepthTexture.height === height &&\n\t\t\tdepthTexture.samples === samples &&\n\t\t\tdepthTexture.depth === depth &&\n\t\t\tdepthTexture.stencil === stencil ) {\n\n\t\t\treturn backend.get( depthTexture ).texture;\n\n\t\t}\n\n\t\t//\n\n\t\tconst depthTextureGPU = backend.get( depthTexture ).texture;\n\n\t\tlet format, type;\n\n\t\tif ( stencil ) {\n\n\t\t\tformat = DepthStencilFormat;\n\t\t\ttype = UnsignedInt248Type;\n\n\t\t} else if ( depth ) {\n\n\t\t\tformat = DepthFormat;\n\t\t\ttype = UnsignedIntType;\n\n\t\t}\n\n\t\tif ( depthTextureGPU !== undefined ) {\n\n\t\t\tif ( depthTexture.image.width === width && depthTexture.image.height === height && depthTexture.format === format && depthTexture.type === type && depthTexture.samples === samples ) {\n\n\t\t\t\treturn depthTextureGPU;\n\n\t\t\t}\n\n\t\t\tthis.destroyTexture( depthTexture );\n\n\t\t}\n\n\t\t// recreate\n\n\t\tdepthTexture.name = 'depthBuffer';\n\t\tdepthTexture.format = format;\n\t\tdepthTexture.type = type;\n\t\tdepthTexture.image.width = width;\n\t\tdepthTexture.image.height = height;\n\t\tdepthTexture.samples = samples;\n\n\t\tthis.createTexture( depthTexture, { width, height } );\n\n\t\treturn backend.get( depthTexture ).texture;\n\n\t}\n\n\t/**\n\t * Uploads the updated texture data to the GPU.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {Object} [options={}] - Optional configuration parameter.\n\t */\n\tupdateTexture( texture, options ) {\n\n\t\tconst textureData = this.backend.get( texture );\n\t\tconst mipmaps = texture.mipmaps;\n\n\t\tconst { textureDescriptorGPU } = textureData;\n\n\t\tif ( texture.isRenderTargetTexture || ( textureDescriptorGPU === undefined /* unsupported texture format */ ) )\n\t\t\treturn;\n\n\t\t// transfer texture data\n\n\t\tif ( texture.isDataTexture ) {\n\n\t\t\tif ( mipmaps.length > 0 ) {\n\n\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst mipmap = mipmaps[ i ];\n\n\t\t\t\t\tthis._copyBufferToTexture( mipmap, textureData.texture, textureDescriptorGPU, 0, texture.flipY, 0, i );\n\n\t\t\t\t}\n\n\n\t\t\t} else {\n\n\t\t\t\tthis._copyBufferToTexture( options.image, textureData.texture, textureDescriptorGPU, 0, texture.flipY );\n\n\t\t\t}\n\n\t\t} else if ( texture.isArrayTexture || texture.isDataArrayTexture || texture.isData3DTexture ) {\n\n\t\t\tfor ( let i = 0; i < options.image.depth; i ++ ) {\n\n\t\t\t\tthis._copyBufferToTexture( options.image, textureData.texture, textureDescriptorGPU, i, texture.flipY, i );\n\n\t\t\t}\n\n\t\t} else if ( texture.isCompressedTexture || texture.isCompressedArrayTexture ) {\n\n\t\t\tthis._copyCompressedBufferToTexture( texture.mipmaps, textureData.texture, textureDescriptorGPU );\n\n\t\t} else if ( texture.isCubeTexture ) {\n\n\t\t\tthis._copyCubeMapToTexture( texture, textureData.texture, textureDescriptorGPU );\n\n\t\t} else {\n\n\t\t\tif ( mipmaps.length > 0 ) {\n\n\t\t\t\tfor ( let i = 0, il = mipmaps.length; i < il; i ++ ) {\n\n\t\t\t\t\tconst mipmap = mipmaps[ i ];\n\n\t\t\t\t\tthis._copyImageToTexture( mipmap, textureData.texture, textureDescriptorGPU, 0, texture.flipY, texture.premultiplyAlpha, i );\n\n\t\t\t\t}\n\n\n\t\t\t} else {\n\n\t\t\t\tthis._copyImageToTexture( options.image, textureData.texture, textureDescriptorGPU, 0, texture.flipY, texture.premultiplyAlpha );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\ttextureData.version = texture.version;\n\n\t}\n\n\t/**\n\t * Returns texture data as a typed array.\n\t *\n\t * @async\n\t * @param {Texture} texture - The texture to copy.\n\t * @param {number} x - The x coordinate of the copy origin.\n\t * @param {number} y - The y coordinate of the copy origin.\n\t * @param {number} width - The width of the copy.\n\t * @param {number} height - The height of the copy.\n\t * @param {number} faceIndex - The face index.\n\t * @return {Promise<TypedArray>} A Promise that resolves with a typed array when the copy operation has finished.\n\t */\n\tasync copyTextureToBuffer( texture, x, y, width, height, faceIndex ) {\n\n\t\tconst device = this.backend.device;\n\n\t\tconst textureData = this.backend.get( texture );\n\t\tconst textureGPU = textureData.texture;\n\t\tconst format = textureData.textureDescriptorGPU.format;\n\t\tconst bytesPerTexel = this._getBytesPerTexel( format );\n\n\t\tlet bytesPerRow = width * bytesPerTexel;\n\t\tbytesPerRow = Math.ceil( bytesPerRow / 256 ) * 256; // Align to 256 bytes\n\n\t\tconst readBuffer = device.createBuffer(\n\t\t\t{\n\t\t\t\tsize: ( ( height - 1 ) * bytesPerRow ) + ( width * bytesPerTexel ), // see https://github.com/mrdoob/three.js/issues/31658#issuecomment-3229442010\n\t\t\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ\n\t\t\t}\n\t\t);\n\n\t\tconst encoder = device.createCommandEncoder();\n\n\t\tencoder.copyTextureToBuffer(\n\t\t\t{\n\t\t\t\ttexture: textureGPU,\n\t\t\t\torigin: { x, y, z: faceIndex },\n\t\t\t},\n\t\t\t{\n\t\t\t\tbuffer: readBuffer,\n\t\t\t\tbytesPerRow: bytesPerRow\n\t\t\t},\n\t\t\t{\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t}\n\n\t\t);\n\n\t\tconst typedArrayType = this._getTypedArrayType( format );\n\n\t\tdevice.queue.submit( [ encoder.finish() ] );\n\n\t\tawait readBuffer.mapAsync( GPUMapMode.READ );\n\n\t\tconst buffer = readBuffer.getMappedRange();\n\n\t\treturn new typedArrayType( buffer );\n\n\t}\n\n\t/**\n\t * Frees all internal resources.\n\t */\n\tdispose() {\n\n\t\tthis._samplerCache.clear();\n\n\t}\n\n\t/**\n\t * Returns the default GPU texture for the given format.\n\t *\n\t * @private\n\t * @param {string} format - The GPU format.\n\t * @return {GPUTexture} The GPU texture.\n\t */\n\t_getDefaultTextureGPU( format ) {\n\n\t\tlet defaultTexture = this.defaultTexture[ format ];\n\n\t\tif ( defaultTexture === undefined ) {\n\n\t\t\tconst texture = new Texture();\n\t\t\ttexture.minFilter = NearestFilter;\n\t\t\ttexture.magFilter = NearestFilter;\n\n\t\t\tthis.createTexture( texture, { width: 1, height: 1, format } );\n\n\t\t\tthis.defaultTexture[ format ] = defaultTexture = texture;\n\n\t\t}\n\n\t\treturn this.backend.get( defaultTexture ).texture;\n\n\t}\n\n\t/**\n\t * Returns the default GPU cube texture for the given format.\n\t *\n\t * @private\n\t * @param {string} format - The GPU format.\n\t * @return {GPUTexture} The GPU texture.\n\t */\n\t_getDefaultCubeTextureGPU( format ) {\n\n\t\tlet defaultCubeTexture = this.defaultCubeTexture[ format ];\n\n\t\tif ( defaultCubeTexture === undefined ) {\n\n\t\t\tconst texture = new CubeTexture();\n\t\t\ttexture.minFilter = NearestFilter;\n\t\t\ttexture.magFilter = NearestFilter;\n\n\t\t\tthis.createTexture( texture, { width: 1, height: 1, depth: 6 } );\n\n\t\t\tthis.defaultCubeTexture[ format ] = defaultCubeTexture = texture;\n\n\t\t}\n\n\t\treturn this.backend.get( defaultCubeTexture ).texture;\n\n\t}\n\n\t/**\n\t * Uploads cube texture image data to the GPU memory.\n\t *\n\t * @private\n\t * @param {CubeTexture} texture - The cube texture.\n\t * @param {GPUTexture} textureGPU - The GPU texture.\n\t * @param {Object} textureDescriptorGPU - The GPU texture descriptor.\n\t */\n\t_copyCubeMapToTexture( texture, textureGPU, textureDescriptorGPU ) {\n\n\t\tconst images = texture.images;\n\t\tconst mipmaps = texture.mipmaps;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst image = images[ i ];\n\n\t\t\tconst flipIndex = texture.flipY === true ? _flipMap[ i ] : i;\n\n\t\t\tif ( image.isDataTexture ) {\n\n\t\t\t\tthis._copyBufferToTexture( image.image, textureGPU, textureDescriptorGPU, flipIndex, texture.flipY );\n\n\t\t\t} else {\n\n\t\t\t\tthis._copyImageToTexture( image, textureGPU, textureDescriptorGPU, flipIndex, texture.flipY, texture.premultiplyAlpha );\n\n\t\t\t}\n\n\t\t\tfor ( let j = 0; j < mipmaps.length; j ++ ) {\n\n\t\t\t\tconst mipmap = mipmaps[ j ];\n\t\t\t\tconst image = mipmap.images[ i ];\n\n\t\t\t\tif ( image.isDataTexture ) {\n\n\t\t\t\t\tthis._copyBufferToTexture( image.image, textureGPU, textureDescriptorGPU, flipIndex, texture.flipY, 0, j + 1 );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tthis._copyImageToTexture( image, textureGPU, textureDescriptorGPU, flipIndex, texture.flipY, texture.premultiplyAlpha, j + 1 );\n\n\t\t\t\t}\n\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Uploads texture image data to the GPU memory.\n\t *\n\t * @private\n\t * @param {HTMLImageElement|ImageBitmap|HTMLCanvasElement} image - The image data.\n\t * @param {GPUTexture} textureGPU - The GPU texture.\n\t * @param {Object} textureDescriptorGPU - The GPU texture descriptor.\n\t * @param {number} originDepth - The origin depth.\n\t * @param {boolean} flipY - Whether to flip texture data along their vertical axis or not.\n\t * @param {boolean} premultiplyAlpha - Whether the texture should have its RGB channels premultiplied by the alpha channel or not.\n\t * @param {number} [mipLevel=0] - The mip level where the data should be copied to.\n\t */\n\t_copyImageToTexture( image, textureGPU, textureDescriptorGPU, originDepth, flipY, premultiplyAlpha, mipLevel = 0 ) {\n\n\t\tconst device = this.backend.device;\n\n\t\tconst width = ( mipLevel > 0 ) ? image.width : textureDescriptorGPU.size.width;\n\t\tconst height = ( mipLevel > 0 ) ? image.height : textureDescriptorGPU.size.height;\n\n\t\ttry {\n\n\t\t\tdevice.queue.copyExternalImageToTexture(\n\t\t\t\t{\n\t\t\t\t\tsource: image,\n\t\t\t\t\tflipY: flipY\n\t\t\t\t}, {\n\t\t\t\t\ttexture: textureGPU,\n\t\t\t\t\tmipLevel: mipLevel,\n\t\t\t\t\torigin: { x: 0, y: 0, z: originDepth },\n\t\t\t\t\tpremultipliedAlpha: premultiplyAlpha\n\t\t\t\t}, {\n\t\t\t\t\twidth: width,\n\t\t\t\t\theight: height,\n\t\t\t\t\tdepthOrArrayLayers: 1\n\t\t\t\t}\n\t\t\t);\n\n\t\t\t// try/catch has been added to fix bad video frame data on certain devices, see #32391\n\n\t\t} catch ( _ ) {}\n\n\t}\n\n\t/**\n\t * Returns the pass utils singleton.\n\t *\n\t * @private\n\t * @return {WebGPUTexturePassUtils} The utils instance.\n\t */\n\t_getPassUtils() {\n\n\t\tlet passUtils = this._passUtils;\n\n\t\tif ( passUtils === null ) {\n\n\t\t\tthis._passUtils = passUtils = new WebGPUTexturePassUtils( this.backend.device );\n\n\t\t}\n\n\t\treturn passUtils;\n\n\t}\n\n\t/**\n\t * Generates mipmaps for the given GPU texture.\n\t *\n\t * @private\n\t * @param {GPUTexture} textureGPU - The GPU texture object.\n\t * @param {Object} textureDescriptorGPU - The texture descriptor.\n\t * @param {number} [baseArrayLayer=0] - The index of the first array layer accessible to the texture view.\n\t * @param {?GPUCommandEncoder} [encoder=null] - An optional command encoder used to generate mipmaps.\n\t */\n\t_generateMipmaps( textureGPU, textureDescriptorGPU, baseArrayLayer = 0, encoder = null ) {\n\n\t\tthis._getPassUtils().generateMipmaps( textureGPU, textureDescriptorGPU, baseArrayLayer, encoder );\n\n\t}\n\n\t/**\n\t * Flip the contents of the given GPU texture along its vertical axis.\n\t *\n\t * @private\n\t * @param {GPUTexture} textureGPU - The GPU texture object.\n\t * @param {Object} textureDescriptorGPU - The texture descriptor.\n\t * @param {number} [originDepth=0] - The origin depth.\n\t */\n\t_flipY( textureGPU, textureDescriptorGPU, originDepth = 0 ) {\n\n\t\tthis._getPassUtils().flipY( textureGPU, textureDescriptorGPU, originDepth );\n\n\t}\n\n\t/**\n\t * Uploads texture buffer data to the GPU memory.\n\t *\n\t * @private\n\t * @param {Object} image - An object defining the image buffer data.\n\t * @param {GPUTexture} textureGPU - The GPU texture.\n\t * @param {Object} textureDescriptorGPU - The GPU texture descriptor.\n\t * @param {number} originDepth - The origin depth.\n\t * @param {boolean} flipY - Whether to flip texture data along their vertical axis or not.\n\t * @param {number} [depth=0] - The depth offset when copying array or 3D texture data.\n\t * @param {number} [mipLevel=0] - The mip level where the data should be copied to.\n\t */\n\t_copyBufferToTexture( image, textureGPU, textureDescriptorGPU, originDepth, flipY, depth = 0, mipLevel = 0 ) {\n\n\t\t// @TODO: Consider to use GPUCommandEncoder.copyBufferToTexture()\n\t\t// @TODO: Consider to support valid buffer layouts with other formats like RGB\n\n\t\tconst device = this.backend.device;\n\n\t\tconst data = image.data;\n\n\t\tconst bytesPerTexel = this._getBytesPerTexel( textureDescriptorGPU.format );\n\t\tconst bytesPerRow = image.width * bytesPerTexel;\n\n\t\tdevice.queue.writeTexture(\n\t\t\t{\n\t\t\t\ttexture: textureGPU,\n\t\t\t\tmipLevel: mipLevel,\n\t\t\t\torigin: { x: 0, y: 0, z: originDepth }\n\t\t\t},\n\t\t\tdata,\n\t\t\t{\n\t\t\t\toffset: image.width * image.height * bytesPerTexel * depth,\n\t\t\t\tbytesPerRow\n\t\t\t},\n\t\t\t{\n\t\t\t\twidth: image.width,\n\t\t\t\theight: image.height,\n\t\t\t\tdepthOrArrayLayers: 1\n\t\t\t} );\n\n\t\tif ( flipY === true ) {\n\n\t\t\tthis._flipY( textureGPU, textureDescriptorGPU, originDepth );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Uploads compressed texture data to the GPU memory.\n\t *\n\t * @private\n\t * @param {Array<Object>} mipmaps - An array with mipmap data.\n\t * @param {GPUTexture} textureGPU - The GPU texture.\n\t * @param {Object} textureDescriptorGPU - The GPU texture descriptor.\n\t */\n\t_copyCompressedBufferToTexture( mipmaps, textureGPU, textureDescriptorGPU ) {\n\n\t\t// @TODO: Consider to use GPUCommandEncoder.copyBufferToTexture()\n\n\t\tconst device = this.backend.device;\n\n\t\tconst blockData = this._getBlockData( textureDescriptorGPU.format );\n\t\tconst isArrayTexture = textureDescriptorGPU.size.depthOrArrayLayers > 1;\n\n\t\tfor ( let i = 0; i < mipmaps.length; i ++ ) {\n\n\t\t\tconst mipmap = mipmaps[ i ];\n\n\t\t\tconst width = mipmap.width;\n\t\t\tconst height = mipmap.height;\n\t\t\tconst depth = isArrayTexture ? textureDescriptorGPU.size.depthOrArrayLayers : 1;\n\n\t\t\tconst bytesPerRow = Math.ceil( width / blockData.width ) * blockData.byteLength;\n\t\t\tconst bytesPerImage = bytesPerRow * Math.ceil( height / blockData.height );\n\n\t\t\tfor ( let j = 0; j < depth; j ++ ) {\n\n\t\t\t\tdevice.queue.writeTexture(\n\t\t\t\t\t{\n\t\t\t\t\t\ttexture: textureGPU,\n\t\t\t\t\t\tmipLevel: i,\n\t\t\t\t\t\torigin: { x: 0, y: 0, z: j }\n\t\t\t\t\t},\n\t\t\t\t\tmipmap.data,\n\t\t\t\t\t{\n\t\t\t\t\t\toffset: j * bytesPerImage,\n\t\t\t\t\t\tbytesPerRow,\n\t\t\t\t\t\trowsPerImage: Math.ceil( height / blockData.height )\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\twidth: Math.ceil( width / blockData.width ) * blockData.width,\n\t\t\t\t\t\theight: Math.ceil( height / blockData.height ) * blockData.height,\n\t\t\t\t\t\tdepthOrArrayLayers: 1\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * This method is only relevant for compressed texture formats. It returns a block\n\t * data descriptor for the given GPU compressed texture format.\n\t *\n\t * @private\n\t * @param {string} format - The GPU compressed texture format.\n\t * @return {Object} The block data descriptor.\n\t */\n\t_getBlockData( format ) {\n\n\t\tif ( format === GPUTextureFormat.BC1RGBAUnorm || format === GPUTextureFormat.BC1RGBAUnormSRGB ) return { byteLength: 8, width: 4, height: 4 }; // DXT1\n\t\tif ( format === GPUTextureFormat.BC2RGBAUnorm || format === GPUTextureFormat.BC2RGBAUnormSRGB ) return { byteLength: 16, width: 4, height: 4 }; // DXT3\n\t\tif ( format === GPUTextureFormat.BC3RGBAUnorm || format === GPUTextureFormat.BC3RGBAUnormSRGB ) return { byteLength: 16, width: 4, height: 4 }; // DXT5\n\t\tif ( format === GPUTextureFormat.BC4RUnorm || format === GPUTextureFormat.BC4RSnorm ) return { byteLength: 8, width: 4, height: 4 }; // RGTC1\n\t\tif ( format === GPUTextureFormat.BC5RGUnorm || format === GPUTextureFormat.BC5RGSnorm ) return { byteLength: 16, width: 4, height: 4 }; // RGTC2\n\t\tif ( format === GPUTextureFormat.BC6HRGBUFloat || format === GPUTextureFormat.BC6HRGBFloat ) return { byteLength: 16, width: 4, height: 4 }; // BPTC (float)\n\t\tif ( format === GPUTextureFormat.BC7RGBAUnorm || format === GPUTextureFormat.BC7RGBAUnormSRGB ) return { byteLength: 16, width: 4, height: 4 }; // BPTC (unorm)\n\n\t\tif ( format === GPUTextureFormat.ETC2RGB8Unorm || format === GPUTextureFormat.ETC2RGB8UnormSRGB ) return { byteLength: 8, width: 4, height: 4 };\n\t\tif ( format === GPUTextureFormat.ETC2RGB8A1Unorm || format === GPUTextureFormat.ETC2RGB8A1UnormSRGB ) return { byteLength: 8, width: 4, height: 4 };\n\t\tif ( format === GPUTextureFormat.ETC2RGBA8Unorm || format === GPUTextureFormat.ETC2RGBA8UnormSRGB ) return { byteLength: 16, width: 4, height: 4 };\n\t\tif ( format === GPUTextureFormat.EACR11Unorm ) return { byteLength: 8, width: 4, height: 4 };\n\t\tif ( format === GPUTextureFormat.EACR11Snorm ) return { byteLength: 8, width: 4, height: 4 };\n\t\tif ( format === GPUTextureFormat.EACRG11Unorm ) return { byteLength: 16, width: 4, height: 4 };\n\t\tif ( format === GPUTextureFormat.EACRG11Snorm ) return { byteLength: 16, width: 4, height: 4 };\n\n\t\tif ( format === GPUTextureFormat.ASTC4x4Unorm || format === GPUTextureFormat.ASTC4x4UnormSRGB ) return { byteLength: 16, width: 4, height: 4 };\n\t\tif ( format === GPUTextureFormat.ASTC5x4Unorm || format === GPUTextureFormat.ASTC5x4UnormSRGB ) return { byteLength: 16, width: 5, height: 4 };\n\t\tif ( format === GPUTextureFormat.ASTC5x5Unorm || format === GPUTextureFormat.ASTC5x5UnormSRGB ) return { byteLength: 16, width: 5, height: 5 };\n\t\tif ( format === GPUTextureFormat.ASTC6x5Unorm || format === GPUTextureFormat.ASTC6x5UnormSRGB ) return { byteLength: 16, width: 6, height: 5 };\n\t\tif ( format === GPUTextureFormat.ASTC6x6Unorm || format === GPUTextureFormat.ASTC6x6UnormSRGB ) return { byteLength: 16, width: 6, height: 6 };\n\t\tif ( format === GPUTextureFormat.ASTC8x5Unorm || format === GPUTextureFormat.ASTC8x5UnormSRGB ) return { byteLength: 16, width: 8, height: 5 };\n\t\tif ( format === GPUTextureFormat.ASTC8x6Unorm || format === GPUTextureFormat.ASTC8x6UnormSRGB ) return { byteLength: 16, width: 8, height: 6 };\n\t\tif ( format === GPUTextureFormat.ASTC8x8Unorm || format === GPUTextureFormat.ASTC8x8UnormSRGB ) return { byteLength: 16, width: 8, height: 8 };\n\t\tif ( format === GPUTextureFormat.ASTC10x5Unorm || format === GPUTextureFormat.ASTC10x5UnormSRGB ) return { byteLength: 16, width: 10, height: 5 };\n\t\tif ( format === GPUTextureFormat.ASTC10x6Unorm || format === GPUTextureFormat.ASTC10x6UnormSRGB ) return { byteLength: 16, width: 10, height: 6 };\n\t\tif ( format === GPUTextureFormat.ASTC10x8Unorm || format === GPUTextureFormat.ASTC10x8UnormSRGB ) return { byteLength: 16, width: 10, height: 8 };\n\t\tif ( format === GPUTextureFormat.ASTC10x10Unorm || format === GPUTextureFormat.ASTC10x10UnormSRGB ) return { byteLength: 16, width: 10, height: 10 };\n\t\tif ( format === GPUTextureFormat.ASTC12x10Unorm || format === GPUTextureFormat.ASTC12x10UnormSRGB ) return { byteLength: 16, width: 12, height: 10 };\n\t\tif ( format === GPUTextureFormat.ASTC12x12Unorm || format === GPUTextureFormat.ASTC12x12UnormSRGB ) return { byteLength: 16, width: 12, height: 12 };\n\n\t}\n\n\t/**\n\t * Converts the three.js uv wrapping constants to GPU address mode constants.\n\t *\n\t * @private\n\t * @param {number} value - The three.js constant defining a uv wrapping mode.\n\t * @return {string} The GPU address mode.\n\t */\n\t_convertAddressMode( value ) {\n\n\t\tlet addressMode = GPUAddressMode.ClampToEdge;\n\n\t\tif ( value === RepeatWrapping ) {\n\n\t\t\taddressMode = GPUAddressMode.Repeat;\n\n\t\t} else if ( value === MirroredRepeatWrapping ) {\n\n\t\t\taddressMode = GPUAddressMode.MirrorRepeat;\n\n\t\t}\n\n\t\treturn addressMode;\n\n\t}\n\n\t/**\n\t * Converts the three.js filter constants to GPU filter constants.\n\t *\n\t * @private\n\t * @param {number} value - The three.js constant defining a filter mode.\n\t * @return {string} The GPU filter mode.\n\t */\n\t_convertFilterMode( value ) {\n\n\t\tlet filterMode = GPUFilterMode.Linear;\n\n\t\tif ( value === NearestFilter || value === NearestMipmapNearestFilter || value === NearestMipmapLinearFilter ) {\n\n\t\t\tfilterMode = GPUFilterMode.Nearest;\n\n\t\t}\n\n\t\treturn filterMode;\n\n\t}\n\n\t/**\n\t * Returns the bytes-per-texel value for the given GPU texture format.\n\t *\n\t * @private\n\t * @param {string} format - The GPU texture format.\n\t * @return {number} The bytes-per-texel.\n\t */\n\t_getBytesPerTexel( format ) {\n\n\t\t// 8-bit formats\n\t\tif ( format === GPUTextureFormat.R8Unorm ||\n\t\t\tformat === GPUTextureFormat.R8Snorm ||\n\t\t\tformat === GPUTextureFormat.R8Uint ||\n\t\t\tformat === GPUTextureFormat.R8Sint ) return 1;\n\n\t\t// 16-bit formats\n\t\tif ( format === GPUTextureFormat.R16Uint ||\n\t\t\tformat === GPUTextureFormat.R16Sint ||\n\t\t\tformat === GPUTextureFormat.R16Float ||\n\t\t\tformat === GPUTextureFormat.RG8Unorm ||\n\t\t\tformat === GPUTextureFormat.RG8Snorm ||\n\t\t\tformat === GPUTextureFormat.RG8Uint ||\n\t\t\tformat === GPUTextureFormat.RG8Sint ) return 2;\n\n\t\t// 32-bit formats\n\t\tif ( format === GPUTextureFormat.R32Uint ||\n\t\t\tformat === GPUTextureFormat.R32Sint ||\n\t\t\tformat === GPUTextureFormat.R32Float ||\n\t\t\tformat === GPUTextureFormat.RG16Uint ||\n\t\t\tformat === GPUTextureFormat.RG16Sint ||\n\t\t\tformat === GPUTextureFormat.RG16Float ||\n\t\t\tformat === GPUTextureFormat.RGBA8Unorm ||\n\t\t\tformat === GPUTextureFormat.RGBA8UnormSRGB ||\n\t\t\tformat === GPUTextureFormat.RGBA8Snorm ||\n\t\t\tformat === GPUTextureFormat.RGBA8Uint ||\n\t\t\tformat === GPUTextureFormat.RGBA8Sint ||\n\t\t\tformat === GPUTextureFormat.BGRA8Unorm ||\n\t\t\tformat === GPUTextureFormat.BGRA8UnormSRGB ||\n\t\t\t// Packed 32-bit formats\n\t\t\tformat === GPUTextureFormat.RGB9E5UFloat ||\n\t\t\tformat === GPUTextureFormat.RGB10A2Unorm ||\n\t\t\tformat === GPUTextureFormat.RG11B10UFloat ||\n\t\t\tformat === GPUTextureFormat.Depth32Float ||\n\t\t\tformat === GPUTextureFormat.Depth24Plus ||\n\t\t\tformat === GPUTextureFormat.Depth24PlusStencil8 ||\n\t\t\tformat === GPUTextureFormat.Depth32FloatStencil8 ) return 4;\n\n\t\t// 64-bit formats\n\t\tif ( format === GPUTextureFormat.RG32Uint ||\n\t\t\tformat === GPUTextureFormat.RG32Sint ||\n\t\t\tformat === GPUTextureFormat.RG32Float ||\n\t\t\tformat === GPUTextureFormat.RGBA16Uint ||\n\t\t\tformat === GPUTextureFormat.RGBA16Sint ||\n\t\t\tformat === GPUTextureFormat.RGBA16Float ) return 8;\n\n\t\t// 128-bit formats\n\t\tif ( format === GPUTextureFormat.RGBA32Uint ||\n\t\t\tformat === GPUTextureFormat.RGBA32Sint ||\n\t\t\tformat === GPUTextureFormat.RGBA32Float ) return 16;\n\n\n\t}\n\n\t/**\n\t * Returns the corresponding typed array type for the given GPU texture format.\n\t *\n\t * @private\n\t * @param {string} format - The GPU texture format.\n\t * @return {TypedArray.constructor} The typed array type.\n\t */\n\t_getTypedArrayType( format ) {\n\n\t\tif ( format === GPUTextureFormat.R8Uint ) return Uint8Array;\n\t\tif ( format === GPUTextureFormat.R8Sint ) return Int8Array;\n\t\tif ( format === GPUTextureFormat.R8Unorm ) return Uint8Array;\n\t\tif ( format === GPUTextureFormat.R8Snorm ) return Int8Array;\n\t\tif ( format === GPUTextureFormat.RG8Uint ) return Uint8Array;\n\t\tif ( format === GPUTextureFormat.RG8Sint ) return Int8Array;\n\t\tif ( format === GPUTextureFormat.RG8Unorm ) return Uint8Array;\n\t\tif ( format === GPUTextureFormat.RG8Snorm ) return Int8Array;\n\t\tif ( format === GPUTextureFormat.RGBA8Uint ) return Uint8Array;\n\t\tif ( format === GPUTextureFormat.RGBA8Sint ) return Int8Array;\n\t\tif ( format === GPUTextureFormat.RGBA8Unorm || format === GPUTextureFormat.RGBA8UnormSRGB ) return Uint8Array;\n\t\tif ( format === GPUTextureFormat.RGBA8Snorm ) return Int8Array;\n\n\n\t\tif ( format === GPUTextureFormat.R16Uint ) return Uint16Array;\n\t\tif ( format === GPUTextureFormat.R16Sint ) return Int16Array;\n\t\tif ( format === GPUTextureFormat.RG16Uint ) return Uint16Array;\n\t\tif ( format === GPUTextureFormat.RG16Sint ) return Int16Array;\n\t\tif ( format === GPUTextureFormat.RGBA16Uint ) return Uint16Array;\n\t\tif ( format === GPUTextureFormat.RGBA16Sint ) return Int16Array;\n\t\tif ( format === GPUTextureFormat.R16Float ) return Uint16Array;\n\t\tif ( format === GPUTextureFormat.RG16Float ) return Uint16Array;\n\t\tif ( format === GPUTextureFormat.RGBA16Float ) return Uint16Array;\n\n\n\t\tif ( format === GPUTextureFormat.R32Uint ) return Uint32Array;\n\t\tif ( format === GPUTextureFormat.R32Sint ) return Int32Array;\n\t\tif ( format === GPUTextureFormat.R32Float ) return Float32Array;\n\t\tif ( format === GPUTextureFormat.RG32Uint ) return Uint32Array;\n\t\tif ( format === GPUTextureFormat.RG32Sint ) return Int32Array;\n\t\tif ( format === GPUTextureFormat.RG32Float ) return Float32Array;\n\t\tif ( format === GPUTextureFormat.RGBA32Uint ) return Uint32Array;\n\t\tif ( format === GPUTextureFormat.RGBA32Sint ) return Int32Array;\n\t\tif ( format === GPUTextureFormat.RGBA32Float ) return Float32Array;\n\n\t\tif ( format === GPUTextureFormat.BGRA8Unorm || format === GPUTextureFormat.BGRA8UnormSRGB ) return Uint8Array;\n\t\tif ( format === GPUTextureFormat.RGB10A2Unorm ) return Uint32Array;\n\t\tif ( format === GPUTextureFormat.RGB9E5UFloat ) return Uint32Array;\n\t\tif ( format === GPUTextureFormat.RG11B10UFloat ) return Uint32Array;\n\n\t\tif ( format === GPUTextureFormat.Depth32Float ) return Float32Array;\n\t\tif ( format === GPUTextureFormat.Depth24Plus ) return Uint32Array;\n\t\tif ( format === GPUTextureFormat.Depth24PlusStencil8 ) return Uint32Array;\n\t\tif ( format === GPUTextureFormat.Depth32FloatStencil8 ) return Float32Array;\n\n\t}\n\n\t/**\n\t * Returns the GPU dimensions for the given texture.\n\t *\n\t * @private\n\t * @param {Texture} texture - The texture.\n\t * @return {string} The GPU dimension.\n\t */\n\t_getDimension( texture ) {\n\n\t\tlet dimension;\n\n\t\tif ( texture.is3DTexture || texture.isData3DTexture ) {\n\n\t\t\tdimension = GPUTextureDimension.ThreeD;\n\n\t\t} else {\n\n\t\t\tdimension = GPUTextureDimension.TwoD;\n\n\t\t}\n\n\t\treturn dimension;\n\n\t}\n\n}\n\n/**\n * Returns the GPU format for the given texture.\n *\n * @param {Texture} texture - The texture.\n * @param {?GPUDevice} [device=null] - The GPU device which is used for feature detection.\n * It is not necessary to apply the device for most formats.\n * @return {string} The GPU format.\n */\nfunction getFormat( texture, device = null ) {\n\n\tconst format = texture.format;\n\tconst type = texture.type;\n\tconst colorSpace = texture.colorSpace;\n\tconst transfer = ColorManagement.getTransfer( colorSpace );\n\n\tlet formatGPU;\n\n\tif ( texture.isCompressedTexture === true || texture.isCompressedArrayTexture === true ) {\n\n\t\tswitch ( format ) {\n\n\t\t\tcase RGB_S3TC_DXT1_Format:\n\t\t\tcase RGBA_S3TC_DXT1_Format:\n\t\t\t\tformatGPU = ( transfer === SRGBTransfer ) ? GPUTextureFormat.BC1RGBAUnormSRGB : GPUTextureFormat.BC1RGBAUnorm;\n\t\t\t\tbreak;\n\n\t\t\tcase RGBA_S3TC_DXT3_Format:\n\t\t\t\tformatGPU = ( transfer === SRGBTransfer ) ? GPUTextureFormat.BC2RGBAUnormSRGB : GPUTextureFormat.BC2RGBAUnorm;\n\t\t\t\tbreak;\n\n\t\t\tcase RGBA_S3TC_DXT5_Format:\n\t\t\t\tformatGPU = ( transfer === SRGBTransfer ) ? GPUTextureFormat.BC3RGBAUnormSRGB : GPUTextureFormat.BC3RGBAUnorm;\n\t\t\t\tbreak;\n\n\t\t\tcase RED_RGTC1_Format:\n\t\t\t\tformatGPU = GPUTextureFormat.BC4RUnorm;\n\t\t\t\tbreak;\n\n\t\t\tcase SIGNED_RED_RGTC1_Format:\n\t\t\t\tformatGPU = GPUTextureFormat.BC4RSnorm;\n\t\t\t\tbreak;\n\n\t\t\tcase RED_GREEN_RGTC2_Format:\n\t\t\t\tformatGPU = GPUTextureFormat.BC5RGUnorm;\n\t\t\t\tbreak;\n\n\t\t\tcase SIGNED_RED_GREEN_RGTC2_Format:\n\t\t\t\tformatGPU = GPUTextureFormat.BC5RGSnorm;\n\t\t\t\tbreak;\n\n\t\t\tcase RGBA_BPTC_Format:\n\t\t\t\tformatGPU = ( transfer === SRGBTransfer ) ? GPUTextureFormat.BC7RGBAUnormSRGB : GPUTextureFormat.BC7RGBAUnorm;\n\t\t\t\tbreak;\n\n\t\t\tcase RGB_ETC2_Format:\n\t\t\tcase RGB_ETC1_Format:\n\t\t\t\tformatGPU = ( transfer === SRGBTransfer ) ? GPUTextureFormat.ETC2RGB8UnormSRGB : GPUTextureFormat.ETC2RGB8Unorm;\n\t\t\t\tbreak;\n\n\t\t\tcase RGBA_ETC2_EAC_Format:\n\t\t\t\tformatGPU = ( transfer === SRGBTransfer ) ? GPUTextureFormat.ETC2RGBA8UnormSRGB : GPUTextureFormat.ETC2RGBA8Unorm;\n\t\t\t\tbreak;\n\n\t\t\tcase R11_EAC_Format:\n\t\t\t\tformatGPU = GPUTextureFormat.EACR11Unorm;\n\t\t\t\tbreak;\n\n\t\t\tcase SIGNED_R11_EAC_Format:\n\t\t\t\tformatGPU = GPUTextureFormat.EACR11Snorm;\n\t\t\t\tbreak;\n\n\t\t\tcase RG11_EAC_Format:\n\t\t\t\tformatGPU = GPUTextureFormat.EACRG11Unorm;\n\t\t\t\tbreak;\n\n\t\t\tcase SIGNED_RG11_EAC_Format:\n\t\t\t\tformatGPU = GPUTextureFormat.EACRG11Snorm;\n\t\t\t\tbreak;\n\n\t\t\tcase RGBA_ASTC_4x4_Format:\n\t\t\t\tformatGPU = ( transfer === SRGBTransfer ) ? GPUTextureFormat.ASTC4x4UnormSRGB : GPUTextureFormat.ASTC4x4Unorm;\n\t\t\t\tbreak;\n\n\t\t\tcase RGBA_ASTC_5x4_Format:\n\t\t\t\tformatGPU = ( transfer === SRGBTransfer ) ? GPUTextureFormat.ASTC5x4UnormSRGB : GPUTextureFormat.ASTC5x4Unorm;\n\t\t\t\tbreak;\n\n\t\t\tcase RGBA_ASTC_5x5_Format:\n\t\t\t\tformatGPU = ( transfer === SRGBTransfer ) ? GPUTextureFormat.ASTC5x5UnormSRGB : GPUTextureFormat.ASTC5x5Unorm;\n\t\t\t\tbreak;\n\n\t\t\tcase RGBA_ASTC_6x5_Format:\n\t\t\t\tformatGPU = ( transfer === SRGBTransfer ) ? GPUTextureFormat.ASTC6x5UnormSRGB : GPUTextureFormat.ASTC6x5Unorm;\n\t\t\t\tbreak;\n\n\t\t\tcase RGBA_ASTC_6x6_Format:\n\t\t\t\tformatGPU = ( transfer === SRGBTransfer ) ? GPUTextureFormat.ASTC6x6UnormSRGB : GPUTextureFormat.ASTC6x6Unorm;\n\t\t\t\tbreak;\n\n\t\t\tcase RGBA_ASTC_8x5_Format:\n\t\t\t\tformatGPU = ( transfer === SRGBTransfer ) ? GPUTextureFormat.ASTC8x5UnormSRGB : GPUTextureFormat.ASTC8x5Unorm;\n\t\t\t\tbreak;\n\n\t\t\tcase RGBA_ASTC_8x6_Format:\n\t\t\t\tformatGPU = ( transfer === SRGBTransfer ) ? GPUTextureFormat.ASTC8x6UnormSRGB : GPUTextureFormat.ASTC8x6Unorm;\n\t\t\t\tbreak;\n\n\t\t\tcase RGBA_ASTC_8x8_Format:\n\t\t\t\tformatGPU = ( transfer === SRGBTransfer ) ? GPUTextureFormat.ASTC8x8UnormSRGB : GPUTextureFormat.ASTC8x8Unorm;\n\t\t\t\tbreak;\n\n\t\t\tcase RGBA_ASTC_10x5_Format:\n\t\t\t\tformatGPU = ( transfer === SRGBTransfer ) ? GPUTextureFormat.ASTC10x5UnormSRGB : GPUTextureFormat.ASTC10x5Unorm;\n\t\t\t\tbreak;\n\n\t\t\tcase RGBA_ASTC_10x6_Format:\n\t\t\t\tformatGPU = ( transfer === SRGBTransfer ) ? GPUTextureFormat.ASTC10x6UnormSRGB : GPUTextureFormat.ASTC10x6Unorm;\n\t\t\t\tbreak;\n\n\t\t\tcase RGBA_ASTC_10x8_Format:\n\t\t\t\tformatGPU = ( transfer === SRGBTransfer ) ? GPUTextureFormat.ASTC10x8UnormSRGB : GPUTextureFormat.ASTC10x8Unorm;\n\t\t\t\tbreak;\n\n\t\t\tcase RGBA_ASTC_10x10_Format:\n\t\t\t\tformatGPU = ( transfer === SRGBTransfer ) ? GPUTextureFormat.ASTC10x10UnormSRGB : GPUTextureFormat.ASTC10x10Unorm;\n\t\t\t\tbreak;\n\n\t\t\tcase RGBA_ASTC_12x10_Format:\n\t\t\t\tformatGPU = ( transfer === SRGBTransfer ) ? GPUTextureFormat.ASTC12x10UnormSRGB : GPUTextureFormat.ASTC12x10Unorm;\n\t\t\t\tbreak;\n\n\t\t\tcase RGBA_ASTC_12x12_Format:\n\t\t\t\tformatGPU = ( transfer === SRGBTransfer ) ? GPUTextureFormat.ASTC12x12UnormSRGB : GPUTextureFormat.ASTC12x12Unorm;\n\t\t\t\tbreak;\n\n\t\t\tcase RGBAFormat:\n\t\t\t\tformatGPU = ( transfer === SRGBTransfer ) ? GPUTextureFormat.RGBA8UnormSRGB : GPUTextureFormat.RGBA8Unorm;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\terror( 'WebGPURenderer: Unsupported texture format.', format );\n\n\t\t}\n\n\t} else {\n\n\t\tswitch ( format ) {\n\n\t\t\tcase RGBAFormat:\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\tcase ByteType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.RGBA8Snorm;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ShortType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.RGBA16Sint;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase UnsignedShortType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.RGBA16Uint;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase UnsignedIntType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.RGBA32Uint;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase IntType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.RGBA32Sint;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase UnsignedByteType:\n\t\t\t\t\t\tformatGPU = ( transfer === SRGBTransfer ) ? GPUTextureFormat.RGBA8UnormSRGB : GPUTextureFormat.RGBA8Unorm;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase HalfFloatType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.RGBA16Float;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase FloatType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.RGBA32Float;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\terror( 'WebGPURenderer: Unsupported texture type with RGBAFormat.', type );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase RGBFormat:\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\tcase UnsignedInt5999Type:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.RGB9E5UFloat;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase UnsignedInt101111Type:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.RG11B10UFloat;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\terror( 'WebGPURenderer: Unsupported texture type with RGBFormat.', type );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase RedFormat:\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\tcase ByteType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.R8Snorm;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ShortType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.R16Sint;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase UnsignedShortType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.R16Uint;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase UnsignedIntType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.R32Uint;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase IntType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.R32Sint;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase UnsignedByteType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.R8Unorm;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase HalfFloatType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.R16Float;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase FloatType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.R32Float;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\terror( 'WebGPURenderer: Unsupported texture type with RedFormat.', type );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase RGFormat:\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\tcase ByteType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.RG8Snorm;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase ShortType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.RG16Sint;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase UnsignedShortType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.RG16Uint;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase UnsignedIntType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.RG32Uint;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase IntType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.RG32Sint;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase UnsignedByteType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.RG8Unorm;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase HalfFloatType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.RG16Float;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase FloatType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.RG32Float;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\terror( 'WebGPURenderer: Unsupported texture type with RGFormat.', type );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase DepthFormat:\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\tcase UnsignedShortType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.Depth16Unorm;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase UnsignedIntType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.Depth24Plus;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase FloatType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.Depth32Float;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\terror( 'WebGPURenderer: Unsupported texture type with DepthFormat.', type );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase DepthStencilFormat:\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\tcase UnsignedInt248Type:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.Depth24PlusStencil8;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase FloatType:\n\n\t\t\t\t\t\tif ( device && device.features.has( GPUFeatureName.Depth32FloatStencil8 ) === false ) {\n\n\t\t\t\t\t\t\terror( 'WebGPURenderer: Depth textures with DepthStencilFormat + FloatType can only be used with the \"depth32float-stencil8\" GPU feature.' );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.Depth32FloatStencil8;\n\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\terror( 'WebGPURenderer: Unsupported texture type with DepthStencilFormat.', type );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase RedIntegerFormat:\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\tcase IntType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.R32Sint;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase UnsignedIntType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.R32Uint;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\terror( 'WebGPURenderer: Unsupported texture type with RedIntegerFormat.', type );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase RGIntegerFormat:\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\tcase IntType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.RG32Sint;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase UnsignedIntType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.RG32Uint;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\terror( 'WebGPURenderer: Unsupported texture type with RGIntegerFormat.', type );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tcase RGBAIntegerFormat:\n\n\t\t\t\tswitch ( type ) {\n\n\t\t\t\t\tcase IntType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.RGBA32Sint;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase UnsignedIntType:\n\t\t\t\t\t\tformatGPU = GPUTextureFormat.RGBA32Uint;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tdefault:\n\t\t\t\t\t\terror( 'WebGPURenderer: Unsupported texture type with RGBAIntegerFormat.', type );\n\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\terror( 'WebGPURenderer: Unsupported texture format.', format );\n\n\t\t}\n\n\t}\n\n\treturn formatGPU;\n\n}\n\nconst declarationRegexp = /^[fn]*\\s*([a-z_0-9]+)?\\s*\\(([\\s\\S]*?)\\)\\s*[\\-\\>]*\\s*([a-z_0-9]+(?:<[\\s\\S]+?>)?)/i;\nconst propertiesRegexp = /([a-z_0-9]+)\\s*:\\s*([a-z_0-9]+(?:<[\\s\\S]+?>)?)/ig;\n\nconst wgslTypeLib$1 = {\n\t'f32': 'float',\n\t'i32': 'int',\n\t'u32': 'uint',\n\t'bool': 'bool',\n\n\t'vec2<f32>': 'vec2',\n \t'vec2<i32>': 'ivec2',\n \t'vec2<u32>': 'uvec2',\n \t'vec2<bool>': 'bvec2',\n\n\t'vec2f': 'vec2',\n\t'vec2i': 'ivec2',\n\t'vec2u': 'uvec2',\n\t'vec2b': 'bvec2',\n\n\t'vec3<f32>': 'vec3',\n\t'vec3<i32>': 'ivec3',\n\t'vec3<u32>': 'uvec3',\n\t'vec3<bool>': 'bvec3',\n\n\t'vec3f': 'vec3',\n\t'vec3i': 'ivec3',\n\t'vec3u': 'uvec3',\n\t'vec3b': 'bvec3',\n\n\t'vec4<f32>': 'vec4',\n\t'vec4<i32>': 'ivec4',\n\t'vec4<u32>': 'uvec4',\n\t'vec4<bool>': 'bvec4',\n\n\t'vec4f': 'vec4',\n\t'vec4i': 'ivec4',\n\t'vec4u': 'uvec4',\n\t'vec4b': 'bvec4',\n\n\t'mat2x2<f32>': 'mat2',\n\t'mat2x2f': 'mat2',\n\n\t'mat3x3<f32>': 'mat3',\n\t'mat3x3f': 'mat3',\n\n\t'mat4x4<f32>': 'mat4',\n\t'mat4x4f': 'mat4',\n\n\t'sampler': 'sampler',\n\n\t'texture_1d': 'texture',\n\n\t'texture_2d': 'texture',\n\t'texture_2d_array': 'texture',\n\t'texture_multisampled_2d': 'cubeTexture',\n\n\t'texture_depth_2d': 'depthTexture',\n\t'texture_depth_2d_array': 'depthTexture',\n\t'texture_depth_multisampled_2d': 'depthTexture',\n\t'texture_depth_cube': 'depthTexture',\n\t'texture_depth_cube_array': 'depthTexture',\n\n\t'texture_3d': 'texture3D',\n\n\t'texture_cube': 'cubeTexture',\n\t'texture_cube_array': 'cubeTexture',\n\n\t'texture_storage_1d': 'storageTexture',\n\t'texture_storage_2d': 'storageTexture',\n\t'texture_storage_2d_array': 'storageTexture',\n\t'texture_storage_3d': 'storageTexture'\n\n};\n\nconst parse = ( source ) => {\n\n\tsource = source.trim();\n\n\tconst declaration = source.match( declarationRegexp );\n\n\tif ( declaration !== null && declaration.length === 4 ) {\n\n\t\tconst inputsCode = declaration[ 2 ];\n\t\tconst propsMatches = [];\n\t\tlet match = null;\n\n\t\twhile ( ( match = propertiesRegexp.exec( inputsCode ) ) !== null ) {\n\n\t\t\tpropsMatches.push( { name: match[ 1 ], type: match[ 2 ] } );\n\n\t\t}\n\n\t\t// Process matches to correctly pair names and types\n\t\tconst inputs = [];\n\t\tfor ( let i = 0; i < propsMatches.length; i ++ ) {\n\n\t\t\tconst { name, type } = propsMatches[ i ];\n\n\t\t\tlet resolvedType = type;\n\n\t\t\tif ( resolvedType.startsWith( 'ptr' ) ) {\n\n\t\t\t\tresolvedType = 'pointer';\n\n\t\t\t} else {\n\n\t\t\t\tif ( resolvedType.startsWith( 'texture' ) ) {\n\n\t\t\t\t\tresolvedType = type.split( '<' )[ 0 ];\n\n\t\t\t\t}\n\n\t\t\t\tresolvedType = wgslTypeLib$1[ resolvedType ];\n\n\t\t\t}\n\n\t\t\tinputs.push( new NodeFunctionInput( resolvedType, name ) );\n\n\t\t}\n\n\t\tconst blockCode = source.substring( declaration[ 0 ].length );\n\t\tconst outputType = declaration[ 3 ] || 'void';\n\n\t\tconst name = declaration[ 1 ] !== undefined ? declaration[ 1 ] : '';\n\t\tconst type = wgslTypeLib$1[ outputType ] || outputType;\n\n\t\treturn {\n\t\t\ttype,\n\t\t\tinputs,\n\t\t\tname,\n\t\t\tinputsCode,\n\t\t\tblockCode,\n\t\t\toutputType\n\t\t};\n\n\t} else {\n\n\t\tthrow new Error( 'FunctionNode: Function is not a WGSL code.' );\n\n\t}\n\n};\n\n/**\n * This class represents a WSL node function.\n *\n * @augments NodeFunction\n */\nclass WGSLNodeFunction extends NodeFunction {\n\n\t/**\n\t * Constructs a new WGSL node function.\n\t *\n\t * @param {string} source - The WGSL source.\n\t */\n\tconstructor( source ) {\n\n\t\tconst { type, inputs, name, inputsCode, blockCode, outputType } = parse( source );\n\n\t\tsuper( type, inputs, name );\n\n\t\tthis.inputsCode = inputsCode;\n\t\tthis.blockCode = blockCode;\n\t\tthis.outputType = outputType;\n\n\t}\n\n\t/**\n\t * This method returns the WGSL code of the node function.\n\t *\n\t * @param {string} [name=this.name] - The function's name.\n\t * @return {string} The shader code.\n\t */\n\tgetCode( name = this.name ) {\n\n\t\tconst outputType = this.outputType !== 'void' ? '-> ' + this.outputType : '';\n\n\t\treturn `fn ${ name } ( ${ this.inputsCode.trim() } ) ${ outputType }` + this.blockCode;\n\n\t}\n\n}\n\n/**\n * A WGSL node parser.\n *\n * @augments NodeParser\n */\nclass WGSLNodeParser extends NodeParser {\n\n\t/**\n\t * The method parses the given WGSL code an returns a node function.\n\t *\n\t * @param {string} source - The WGSL code.\n\t * @return {WGSLNodeFunction} A node function.\n\t */\n\tparseFunction( source ) {\n\n\t\treturn new WGSLNodeFunction( source );\n\n\t}\n\n}\n\nconst accessNames = {\n\t[ NodeAccess.READ_ONLY ]: 'read',\n\t[ NodeAccess.WRITE_ONLY ]: 'write',\n\t[ NodeAccess.READ_WRITE ]: 'read_write'\n};\n\nconst wrapNames = {\n\t[ RepeatWrapping ]: 'repeat',\n\t[ ClampToEdgeWrapping ]: 'clamp',\n\t[ MirroredRepeatWrapping ]: 'mirror'\n};\n\nconst gpuShaderStageLib = {\n\t'vertex': GPUShaderStage.VERTEX,\n\t'fragment': GPUShaderStage.FRAGMENT,\n\t'compute': GPUShaderStage.COMPUTE\n};\n\nconst supports = {\n\tinstance: true,\n\tswizzleAssign: false,\n\tstorageBuffer: true\n};\n\nconst wgslFnOpLib = {\n\t'^^': 'tsl_xor'\n};\n\nconst wgslTypeLib = {\n\tfloat: 'f32',\n\tint: 'i32',\n\tuint: 'u32',\n\tbool: 'bool',\n\tcolor: 'vec3<f32>',\n\n\tvec2: 'vec2<f32>',\n\tivec2: 'vec2<i32>',\n\tuvec2: 'vec2<u32>',\n\tbvec2: 'vec2<bool>',\n\n\tvec3: 'vec3<f32>',\n\tivec3: 'vec3<i32>',\n\tuvec3: 'vec3<u32>',\n\tbvec3: 'vec3<bool>',\n\n\tvec4: 'vec4<f32>',\n\tivec4: 'vec4<i32>',\n\tuvec4: 'vec4<u32>',\n\tbvec4: 'vec4<bool>',\n\n\tmat2: 'mat2x2<f32>',\n\tmat3: 'mat3x3<f32>',\n\tmat4: 'mat4x4<f32>'\n};\n\nconst wgslCodeCache = {};\n\nconst wgslPolyfill = {\n\ttsl_xor: new CodeNode( 'fn tsl_xor( a : bool, b : bool ) -> bool { return ( a || b ) && !( a && b ); }' ),\n\tmod_float: new CodeNode( 'fn tsl_mod_float( x : f32, y : f32 ) -> f32 { return x - y * floor( x / y ); }' ),\n\tmod_vec2: new CodeNode( 'fn tsl_mod_vec2( x : vec2f, y : vec2f ) -> vec2f { return x - y * floor( x / y ); }' ),\n\tmod_vec3: new CodeNode( 'fn tsl_mod_vec3( x : vec3f, y : vec3f ) -> vec3f { return x - y * floor( x / y ); }' ),\n\tmod_vec4: new CodeNode( 'fn tsl_mod_vec4( x : vec4f, y : vec4f ) -> vec4f { return x - y * floor( x / y ); }' ),\n\tequals_bool: new CodeNode( 'fn tsl_equals_bool( a : bool, b : bool ) -> bool { return a == b; }' ),\n\tequals_bvec2: new CodeNode( 'fn tsl_equals_bvec2( a : vec2f, b : vec2f ) -> vec2<bool> { return vec2<bool>( a.x == b.x, a.y == b.y ); }' ),\n\tequals_bvec3: new CodeNode( 'fn tsl_equals_bvec3( a : vec3f, b : vec3f ) -> vec3<bool> { return vec3<bool>( a.x == b.x, a.y == b.y, a.z == b.z ); }' ),\n\tequals_bvec4: new CodeNode( 'fn tsl_equals_bvec4( a : vec4f, b : vec4f ) -> vec4<bool> { return vec4<bool>( a.x == b.x, a.y == b.y, a.z == b.z, a.w == b.w ); }' ),\n\trepeatWrapping_float: new CodeNode( 'fn tsl_repeatWrapping_float( coord: f32 ) -> f32 { return fract( coord ); }' ),\n\tmirrorWrapping_float: new CodeNode( 'fn tsl_mirrorWrapping_float( coord: f32 ) -> f32 { let mirrored = fract( coord * 0.5 ) * 2.0; return 1.0 - abs( 1.0 - mirrored ); }' ),\n\tclampWrapping_float: new CodeNode( 'fn tsl_clampWrapping_float( coord: f32 ) -> f32 { return clamp( coord, 0.0, 1.0 ); }' ),\n\tbiquadraticTexture: new CodeNode( /* wgsl */`\nfn tsl_biquadraticTexture( map : texture_2d<f32>, coord : vec2f, iRes : vec2u, level : u32 ) -> vec4f {\n\n\tlet res = vec2f( iRes );\n\n\tlet uvScaled = coord * res;\n\tlet uvWrapping = ( ( uvScaled % res ) + res ) % res;\n\n\t// https://www.shadertoy.com/view/WtyXRy\n\n\tlet uv = uvWrapping - 0.5;\n\tlet iuv = floor( uv );\n\tlet f = fract( uv );\n\n\tlet rg1 = textureLoad( map, vec2u( iuv + vec2( 0.5, 0.5 ) ) % iRes, level );\n\tlet rg2 = textureLoad( map, vec2u( iuv + vec2( 1.5, 0.5 ) ) % iRes, level );\n\tlet rg3 = textureLoad( map, vec2u( iuv + vec2( 0.5, 1.5 ) ) % iRes, level );\n\tlet rg4 = textureLoad( map, vec2u( iuv + vec2( 1.5, 1.5 ) ) % iRes, level );\n\n\treturn mix( mix( rg1, rg2, f.x ), mix( rg3, rg4, f.x ), f.y );\n\n}\n` )\n};\n\nconst wgslMethods = {\n\tdFdx: 'dpdx',\n\tdFdy: '- dpdy',\n\tmod_float: 'tsl_mod_float',\n\tmod_vec2: 'tsl_mod_vec2',\n\tmod_vec3: 'tsl_mod_vec3',\n\tmod_vec4: 'tsl_mod_vec4',\n\tequals_bool: 'tsl_equals_bool',\n\tequals_bvec2: 'tsl_equals_bvec2',\n\tequals_bvec3: 'tsl_equals_bvec3',\n\tequals_bvec4: 'tsl_equals_bvec4',\n\tinversesqrt: 'inverseSqrt',\n\tbitcast: 'bitcast<f32>',\n\tfloatpack_snorm_2x16: 'pack2x16snorm',\n\tfloatpack_unorm_2x16: 'pack2x16unorm',\n\tfloatpack_float16_2x16: 'pack2x16float',\n\tfloatunpack_snorm_2x16: 'unpack2x16snorm',\n\tfloatunpack_unorm_2x16: 'unpack2x16unorm',\n\tfloatunpack_float16_2x16: 'unpack2x16float'\n};\n\n//\n\nlet diagnostics = '';\n\nif ( ( typeof navigator !== 'undefined' && /Firefox|Deno/g.test( navigator.userAgent ) ) !== true ) {\n\n\tdiagnostics += 'diagnostic( off, derivative_uniformity );\\n';\n\n}\n\n/**\n * A node builder targeting WGSL.\n *\n * This module generates WGSL shader code from node materials and also\n * generates the respective bindings and vertex buffer definitions. These\n * data are later used by the renderer to create render and compute pipelines\n * for render objects.\n *\n * @augments NodeBuilder\n */\nclass WGSLNodeBuilder extends NodeBuilder {\n\n\t/**\n\t * Constructs a new WGSL node builder renderer.\n\t *\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Renderer} renderer - The renderer.\n\t */\n\tconstructor( object, renderer ) {\n\n\t\tsuper( object, renderer, new WGSLNodeParser() );\n\n\t\t/**\n\t\t * A dictionary that holds for each shader stage ('vertex', 'fragment', 'compute')\n\t\t * another dictionary which manages UBOs per group ('render','frame','object').\n\t\t *\n\t\t * @type {Object<string,Object<string,NodeUniformsGroup>>}\n\t\t */\n\t\tthis.uniformGroups = {};\n\n\t\t/**\n\t\t * A dictionary that holds for each shader stage a Map of builtins.\n\t\t *\n\t\t * @type {Object<string,Map<string,Object>>}\n\t\t */\n\t\tthis.builtins = {};\n\n\t\t/**\n\t\t * A dictionary that holds for each shader stage a Set of directives.\n\t\t *\n\t\t * @type {Object<string,Set<string>>}\n\t\t */\n\t\tthis.directives = {};\n\n\t\t/**\n\t\t * A map for managing scope arrays. Only relevant for when using\n\t\t * {@link WorkgroupInfoNode} in context of compute shaders.\n\t\t *\n\t\t * @type {Map<string,Object>}\n\t\t */\n\t\tthis.scopedArrays = new Map();\n\n\t}\n\n\t/**\n\t * Generates the WGSL snippet for sampled textures.\n\t *\n\t * @private\n\t * @param {Texture} texture - The texture.\n\t * @param {string} textureProperty - The name of the texture uniform in the shader.\n\t * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.\n\t * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.\n\t * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.\n\t * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.\n\t * @return {string} The WGSL snippet.\n\t */\n\t_generateTextureSample( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, shaderStage = this.shaderStage ) {\n\n\t\tif ( shaderStage === 'fragment' ) {\n\n\t\t\tif ( depthSnippet ) {\n\n\t\t\t\tif ( offsetSnippet ) {\n\n\t\t\t\t\treturn `textureSample( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ offsetSnippet } )`;\n\n\t\t\t\t}\n\n\t\t\t\treturn `textureSample( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet } )`;\n\n\t\t\t} else {\n\n\t\t\t\tif ( offsetSnippet ) {\n\n\t\t\t\t\treturn `textureSample( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ offsetSnippet } )`;\n\n\t\t\t\t}\n\n\t\t\t\treturn `textureSample( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet } )`;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\treturn this.generateTextureSampleLevel( texture, textureProperty, uvSnippet, '0', depthSnippet );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Generates the WGSL snippet when sampling textures with explicit mip level.\n\t *\n\t * @private\n\t * @param {Texture} texture - The texture.\n\t * @param {string} textureProperty - The name of the texture uniform in the shader.\n\t * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.\n\t * @param {string} levelSnippet - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.\n\t * @param {string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.\n\t * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.\n\t * @return {string} The WGSL snippet.\n\t */\n\tgenerateTextureSampleLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet, offsetSnippet ) {\n\n\t\tif ( this.isUnfilterable( texture ) === false ) {\n\n\t\t\tif ( offsetSnippet ) {\n\n\t\t\t\treturn `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet }, ${ offsetSnippet } )`;\n\n\t\t\t}\n\n\t\t\treturn `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet } )`;\n\n\t\t} else if ( this.isFilteredTexture( texture ) ) {\n\n\t\t\treturn this.generateFilteredTexture( texture, textureProperty, uvSnippet, offsetSnippet, levelSnippet );\n\n\t\t} else {\n\n\t\t\treturn this.generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, levelSnippet );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Generates a wrap function used in context of textures.\n\t *\n\t * @param {Texture} texture - The texture to generate the function for.\n\t * @return {string} The name of the generated function.\n\t */\n\tgenerateWrapFunction( texture ) {\n\n\t\tconst functionName = `tsl_coord_${ wrapNames[ texture.wrapS ] }S_${ wrapNames[ texture.wrapT ] }_${ texture.is3DTexture || texture.isData3DTexture ? '3d' : '2d' }T`;\n\n\t\tlet nodeCode = wgslCodeCache[ functionName ];\n\n\t\tif ( nodeCode === undefined ) {\n\n\t\t\tconst includes = [];\n\n\t\t\t// For 3D textures, use vec3f; for texture arrays, keep vec2f since array index is separate\n\t\t\tconst coordType = texture.is3DTexture || texture.isData3DTexture ? 'vec3f' : 'vec2f';\n\t\t\tlet code = `fn ${ functionName }( coord : ${ coordType } ) -> ${ coordType } {\\n\\n\\treturn ${ coordType }(\\n`;\n\n\t\t\tconst addWrapSnippet = ( wrap, axis ) => {\n\n\t\t\t\tif ( wrap === RepeatWrapping ) {\n\n\t\t\t\t\tincludes.push( wgslPolyfill.repeatWrapping_float );\n\n\t\t\t\t\tcode += `\\t\\ttsl_repeatWrapping_float( coord.${ axis } )`;\n\n\t\t\t\t} else if ( wrap === ClampToEdgeWrapping ) {\n\n\t\t\t\t\tincludes.push( wgslPolyfill.clampWrapping_float );\n\n\t\t\t\t\tcode += `\\t\\ttsl_clampWrapping_float( coord.${ axis } )`;\n\n\t\t\t\t} else if ( wrap === MirroredRepeatWrapping ) {\n\n\t\t\t\t\tincludes.push( wgslPolyfill.mirrorWrapping_float );\n\n\t\t\t\t\tcode += `\\t\\ttsl_mirrorWrapping_float( coord.${ axis } )`;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcode += `\\t\\tcoord.${ axis }`;\n\n\t\t\t\t\twarn( `WebGPURenderer: Unsupported texture wrap type \"${ wrap }\" for vertex shader.` );\n\n\t\t\t\t}\n\n\t\t\t};\n\n\t\t\taddWrapSnippet( texture.wrapS, 'x' );\n\n\t\t\tcode += ',\\n';\n\n\t\t\taddWrapSnippet( texture.wrapT, 'y' );\n\n\t\t\tif ( texture.is3DTexture || texture.isData3DTexture ) {\n\n\t\t\t\tcode += ',\\n';\n\t\t\t\taddWrapSnippet( texture.wrapR, 'z' );\n\n\t\t\t}\n\n\t\t\tcode += '\\n\\t);\\n\\n}\\n';\n\n\t\t\twgslCodeCache[ functionName ] = nodeCode = new CodeNode( code, includes );\n\n\t\t}\n\n\t\tnodeCode.build( this );\n\n\t\treturn functionName;\n\n\t}\n\n\t/**\n\t * Generates the array declaration string.\n\t *\n\t * @param {string} type - The type.\n\t * @param {?number} [count] - The count.\n\t * @return {string} The generated value as a shader string.\n\t */\n\tgenerateArrayDeclaration( type, count ) {\n\n\t\treturn `array< ${ this.getType( type ) }, ${ count } >`;\n\n\t}\n\n\t/**\n\t * Generates a WGSL variable that holds the texture dimension of the given texture.\n\t * It also returns information about the number of layers (elements) of an arrayed\n\t * texture as well as the cube face count of cube textures.\n\t *\n\t * @param {Texture} texture - The texture to generate the function for.\n\t * @param {string} textureProperty - The name of the video texture uniform in the shader.\n\t * @param {string} levelSnippet - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.\n\t * @return {string} The name of the dimension variable.\n\t */\n\tgenerateTextureDimension( texture, textureProperty, levelSnippet ) {\n\n\t\tconst textureData = this.getDataFromNode( texture, this.shaderStage, this.globalCache );\n\n\t\tif ( textureData.dimensionsSnippet === undefined ) textureData.dimensionsSnippet = {};\n\n\t\tlet textureDimensionNode = textureData.dimensionsSnippet[ levelSnippet ];\n\n\t\tif ( textureData.dimensionsSnippet[ levelSnippet ] === undefined ) {\n\n\t\t\tlet textureDimensionsParams;\n\t\t\tlet dimensionType;\n\n\t\t\tconst { primarySamples } = this.renderer.backend.utils.getTextureSampleData( texture );\n\t\t\tconst isMultisampled = primarySamples > 1;\n\n\t\t\tif ( texture.is3DTexture || texture.isData3DTexture ) {\n\n\t\t\t\tdimensionType = 'vec3<u32>';\n\n\t\t\t} else {\n\n\t\t\t\t// Regular 2D textures, depth textures, etc.\n\t\t\t\tdimensionType = 'vec2<u32>';\n\n\t\t\t}\n\n\t\t\t// Build parameters string based on texture type and multisampling\n\t\t\tif ( isMultisampled || texture.isStorageTexture ) {\n\n\t\t\t\ttextureDimensionsParams = textureProperty;\n\n\t\t\t} else {\n\n\t\t\t\ttextureDimensionsParams = `${textureProperty}${levelSnippet ? `, u32( ${ levelSnippet } )` : ''}`;\n\n\t\t\t}\n\n\t\t\ttextureDimensionNode = new VarNode( new ExpressionNode( `textureDimensions( ${ textureDimensionsParams } )`, dimensionType ) );\n\n\t\t\ttextureData.dimensionsSnippet[ levelSnippet ] = textureDimensionNode;\n\n\t\t\tif ( texture.isArrayTexture || texture.isDataArrayTexture || texture.is3DTexture || texture.isData3DTexture ) {\n\n\t\t\t\ttextureData.arrayLayerCount = new VarNode(\n\t\t\t\t\tnew ExpressionNode(\n\t\t\t\t\t\t`textureNumLayers(${textureProperty})`,\n\t\t\t\t\t\t'u32'\n\t\t\t\t\t)\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\t// For cube textures, we know it's always 6 faces\n\t\t\tif ( texture.isTextureCube ) {\n\n\t\t\t\ttextureData.cubeFaceCount = new VarNode(\n\t\t\t\t\tnew ExpressionNode( '6u', 'u32' )\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn textureDimensionNode.build( this );\n\n\t}\n\n\t/**\n\t * Generates the WGSL snippet for a manual filtered texture.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {string} textureProperty - The name of the texture uniform in the shader.\n\t * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.\n\t * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.\n\t * @param {string} [levelSnippet='0u'] - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.\n\t * @return {string} The WGSL snippet.\n\t */\n\tgenerateFilteredTexture( texture, textureProperty, uvSnippet, offsetSnippet, levelSnippet = '0u' ) {\n\n\t\tthis._include( 'biquadraticTexture' );\n\n\t\tconst wrapFunction = this.generateWrapFunction( texture );\n\t\tconst textureDimension = this.generateTextureDimension( texture, textureProperty, levelSnippet );\n\n\t\tif ( offsetSnippet ) {\n\n\t\t\tuvSnippet = `${ uvSnippet } + vec2<f32>(${ offsetSnippet }) / ${ textureDimension }`;\n\n\t\t}\n\n\t\treturn `tsl_biquadraticTexture( ${ textureProperty }, ${ wrapFunction }( ${ uvSnippet } ), ${ textureDimension }, u32( ${ levelSnippet } ) )`;\n\n\t}\n\n\t/**\n\t * Generates the WGSL snippet for a texture lookup with explicit level-of-detail.\n\t * Since it's a lookup, no sampling or filtering is applied.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {string} textureProperty - The name of the texture uniform in the shader.\n\t * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.\n\t * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.\n\t * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.\n\t * @param {string} [levelSnippet='0u'] - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.\n\t * @return {string} The WGSL snippet.\n\t */\n\tgenerateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, levelSnippet = '0u' ) {\n\n\t\tconst wrapFunction = this.generateWrapFunction( texture );\n\t\tconst textureDimension = this.generateTextureDimension( texture, textureProperty, levelSnippet );\n\n\t\tconst vecType = texture.is3DTexture || texture.isData3DTexture ? 'vec3' : 'vec2';\n\n\t\tif ( offsetSnippet ) {\n\n\t\t\tuvSnippet = `${ uvSnippet } + ${ vecType }<f32>(${ offsetSnippet }) / ${ vecType }<f32>( ${ textureDimension } )`;\n\n\t\t}\n\n\t\tconst coordSnippet = `${ vecType }<u32>( ${ wrapFunction }( ${ uvSnippet } ) * ${ vecType }<f32>( ${ textureDimension } ) )`;\n\n\t\treturn this.generateTextureLoad( texture, textureProperty, coordSnippet, levelSnippet, depthSnippet, null );\n\n\t}\n\n\t/**\n\t * Generates the WGSL snippet that reads a single texel from a texture without sampling or filtering.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {string} textureProperty - The name of the texture uniform in the shader.\n\t * @param {string} uvIndexSnippet - A WGSL snippet that represents texture coordinates used for sampling.\n\t * @param {?string} levelSnippet - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.\n\t * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.\n\t * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.\n\t * @return {string} The WGSL snippet.\n\t */\n\tgenerateTextureLoad( texture, textureProperty, uvIndexSnippet, levelSnippet, depthSnippet, offsetSnippet ) {\n\n\t\tif ( levelSnippet === null ) levelSnippet = '0u';\n\n\t\tif ( offsetSnippet ) {\n\n\t\t\tuvIndexSnippet = `${ uvIndexSnippet } + ${ offsetSnippet }`;\n\n\t\t}\n\n\t\tlet snippet;\n\n\t\tif ( depthSnippet ) {\n\n\t\t\tsnippet = `textureLoad( ${ textureProperty }, ${ uvIndexSnippet }, ${ depthSnippet }, u32( ${ levelSnippet } ) )`;\n\n\t\t} else {\n\n\t\t\tsnippet = `textureLoad( ${ textureProperty }, ${ uvIndexSnippet }, u32( ${ levelSnippet } ) )`;\n\n\t\t\tif ( this.renderer.backend.compatibilityMode && texture.isDepthTexture ) {\n\n\t\t\t\tsnippet += '.x';\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn snippet;\n\n\t}\n\n\t/**\n\t * Generates the WGSL snippet that writes a single texel to a texture.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {string} textureProperty - The name of the texture uniform in the shader.\n\t * @param {string} uvIndexSnippet - A WGSL snippet that represents texture coordinates used for sampling.\n\t * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.\n\t * @param {string} valueSnippet - A WGSL snippet that represent the new texel value.\n\t * @return {string} The WGSL snippet.\n\t */\n\tgenerateTextureStore( texture, textureProperty, uvIndexSnippet, depthSnippet, valueSnippet ) {\n\n\t\tlet snippet;\n\n\t\tif ( depthSnippet ) {\n\n\t\t\tsnippet = `textureStore( ${ textureProperty }, ${ uvIndexSnippet }, ${ depthSnippet }, ${ valueSnippet } )`;\n\n\t\t} else {\n\n\t\t\tsnippet = `textureStore( ${ textureProperty }, ${ uvIndexSnippet }, ${ valueSnippet } )`;\n\n\t\t}\n\n\t\treturn snippet;\n\n\t}\n\n\t/**\n\t * Returns `true` if the sampled values of the given texture should be compared against a reference value.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @return {boolean} Whether the sampled values of the given texture should be compared against a reference value or not.\n\t */\n\tisSampleCompare( texture ) {\n\n\t\treturn texture.isDepthTexture === true && texture.compareFunction !== null;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given texture is unfilterable.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @return {boolean} Whether the given texture is unfilterable or not.\n\t */\n\tisUnfilterable( texture ) {\n\n\t\treturn this.getComponentTypeFromTexture( texture ) !== 'float' ||\n\t\t\t( ! this.isAvailable( 'float32Filterable' ) && texture.isDataTexture === true && texture.type === FloatType ) ||\n\t\t\t( this.isSampleCompare( texture ) === false && texture.minFilter === NearestFilter && texture.magFilter === NearestFilter ) ||\n\t\t\tthis.renderer.backend.utils.getTextureSampleData( texture ).primarySamples > 1;\n\n\t}\n\n\t/**\n\t * Generates the WGSL snippet for sampling/loading the given texture.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {string} textureProperty - The name of the texture uniform in the shader.\n\t * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.\n\t * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.\n\t * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.\n\t * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.\n\t * @return {string} The WGSL snippet.\n\t */\n\tgenerateTexture( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, shaderStage = this.shaderStage ) {\n\n\t\tlet snippet = null;\n\n\t\tif ( this.isUnfilterable( texture ) ) {\n\n\t\t\tsnippet = this.generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, '0', shaderStage );\n\n\t\t} else {\n\n\t\t\tsnippet = this._generateTextureSample( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, shaderStage );\n\n\t\t}\n\n\t\treturn snippet;\n\n\t}\n\n\t/**\n\t * Generates the WGSL snippet for sampling/loading the given texture using explicit gradients.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {string} textureProperty - The name of the texture uniform in the shader.\n\t * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.\n\t * @param {Array<string>} gradSnippet - An array holding both gradient WGSL snippets.\n\t * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.\n\t * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.\n\t * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.\n\t * @return {string} The WGSL snippet.\n\t */\n\tgenerateTextureGrad( texture, textureProperty, uvSnippet, gradSnippet, depthSnippet, offsetSnippet, shaderStage = this.shaderStage ) {\n\n\t\tif ( shaderStage === 'fragment' ) {\n\n\t\t\t// TODO handle i32 or u32 --> uvSnippet, array_index: A, ddx, ddy\n\t\t\tif ( offsetSnippet ) {\n\n\t\t\t\treturn `textureSampleGrad( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet },  ${ gradSnippet[ 0 ] }, ${ gradSnippet[ 1 ] }, ${ offsetSnippet } )`;\n\n\t\t\t}\n\n\t\t\treturn `textureSampleGrad( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet },  ${ gradSnippet[ 0 ] }, ${ gradSnippet[ 1 ] } )`;\n\n\t\t} else {\n\n\t\t\terror( `WebGPURenderer: THREE.TextureNode.gradient() does not support ${ shaderStage } shader.` );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Generates the WGSL snippet for sampling a depth texture and comparing the sampled depth values\n\t * against a reference value.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {string} textureProperty - The name of the texture uniform in the shader.\n\t * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.\n\t * @param {string} compareSnippet -  A WGSL snippet that represents the reference value.\n\t * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.\n\t * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.\n\t * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.\n\t * @return {string} The WGSL snippet.\n\t */\n\tgenerateTextureCompare( texture, textureProperty, uvSnippet, compareSnippet, depthSnippet, offsetSnippet, shaderStage = this.shaderStage ) {\n\n\t\tif ( shaderStage === 'fragment' ) {\n\n\t\t\tif ( texture.isDepthTexture === true && texture.isArrayTexture === true ) {\n\n\t\t\t\tif ( offsetSnippet ) {\n\n\t\t\t\t\treturn `textureSampleCompare( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ compareSnippet }, ${ offsetSnippet } )`;\n\n\t\t\t\t}\n\n\t\t\t\treturn `textureSampleCompare( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ depthSnippet }, ${ compareSnippet } )`;\n\n\t\t\t}\n\n\t\t\tif ( offsetSnippet ) {\n\n\t\t\t\treturn `textureSampleCompare( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ compareSnippet }, ${ offsetSnippet } )`;\n\n\t\t\t}\n\n\t\t\treturn `textureSampleCompare( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ compareSnippet } )`;\n\n\t\t} else {\n\n\t\t\terror( `WebGPURenderer: THREE.DepthTexture.compareFunction() does not support ${ shaderStage } shader.` );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Generates the WGSL snippet when sampling textures with explicit mip level.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {string} textureProperty - The name of the texture uniform in the shader.\n\t * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.\n\t * @param {string} levelSnippet - A WGSL snippet that represents the mip level, with level 0 containing a full size version of the texture.\n\t * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.\n\t * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.\n\t * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.\n\t * @return {string} The WGSL snippet.\n\t */\n\tgenerateTextureLevel( texture, textureProperty, uvSnippet, levelSnippet, depthSnippet, offsetSnippet ) {\n\n\t\tif ( this.isUnfilterable( texture ) === false ) {\n\n\t\t\tif ( offsetSnippet ) {\n\n\t\t\t\treturn `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet }, ${ offsetSnippet } )`;\n\n\t\t\t}\n\n\t\t\treturn `textureSampleLevel( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ levelSnippet } )`;\n\n\t\t} else if ( this.isFilteredTexture( texture ) ) {\n\n\t\t\treturn this.generateFilteredTexture( texture, textureProperty, uvSnippet, offsetSnippet, levelSnippet );\n\n\t\t} else {\n\n\t\t\treturn this.generateTextureLod( texture, textureProperty, uvSnippet, depthSnippet, offsetSnippet, levelSnippet );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Generates the WGSL snippet when sampling textures with a bias to the mip level.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {string} textureProperty - The name of the texture uniform in the shader.\n\t * @param {string} uvSnippet - A WGSL snippet that represents texture coordinates used for sampling.\n\t * @param {string} biasSnippet - A WGSL snippet that represents the bias to apply to the mip level before sampling.\n\t * @param {?string} depthSnippet - A WGSL snippet that represents 0-based texture array index to sample.\n\t * @param {?string} offsetSnippet - A WGSL snippet that represents the offset that will be applied to the unnormalized texture coordinate before sampling the texture.\n\t * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.\n\t * @return {string} The WGSL snippet.\n\t */\n\tgenerateTextureBias( texture, textureProperty, uvSnippet, biasSnippet, depthSnippet, offsetSnippet, shaderStage = this.shaderStage ) {\n\n\t\tif ( shaderStage === 'fragment' ) {\n\n\t\t\tif ( offsetSnippet ) {\n\n\t\t\t\treturn `textureSampleBias( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ biasSnippet }, ${ offsetSnippet } )`;\n\n\t\t\t}\n\n\t\t\treturn `textureSampleBias( ${ textureProperty }, ${ textureProperty }_sampler, ${ uvSnippet }, ${ biasSnippet } )`;\n\n\t\t} else {\n\n\t\t\terror( `WebGPURenderer: THREE.TextureNode.biasNode does not support ${ shaderStage } shader.` );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns a WGSL snippet that represents the property name of the given node.\n\t *\n\t * @param {Node} node - The node.\n\t * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.\n\t * @return {string} The property name.\n\t */\n\tgetPropertyName( node, shaderStage = this.shaderStage ) {\n\n\t\tif ( node.isNodeVarying === true && node.needsInterpolation === true ) {\n\n\t\t\tif ( shaderStage === 'vertex' ) {\n\n\t\t\t\treturn `varyings.${ node.name }`;\n\n\t\t\t}\n\n\t\t} else if ( node.isNodeUniform === true ) {\n\n\t\t\tconst name = node.name;\n\t\t\tconst type = node.type;\n\n\t\t\tif ( type === 'texture' || type === 'cubeTexture' || type === 'cubeDepthTexture' || type === 'storageTexture' || type === 'texture3D' ) {\n\n\t\t\t\treturn name;\n\n\t\t\t} else if ( type === 'buffer' || type === 'storageBuffer' || type === 'indirectStorageBuffer' ) {\n\n\t\t\t\tif ( this.isCustomStruct( node ) ) {\n\n\t\t\t\t\treturn name;\n\n\t\t\t\t}\n\n\t\t\t\treturn name + '.value';\n\n\t\t\t} else {\n\n\t\t\t\treturn node.groupNode.name + '.' + name;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn super.getPropertyName( node );\n\n\t}\n\n\t/**\n\t * Returns the output struct name.\n\t *\n\t * @return {string} The name of the output struct.\n\t */\n\tgetOutputStructName() {\n\n\t\treturn 'output';\n\n\t}\n\n\t/**\n\t * Returns the native shader operator name for a given generic name.\n\t *\n\t * @param {string} op - The operator name to resolve.\n\t * @return {?string} The resolved operator name.\n\t */\n\tgetFunctionOperator( op ) {\n\n\t\tconst fnOp = wgslFnOpLib[ op ];\n\n\t\tif ( fnOp !== undefined ) {\n\n\t\t\tthis._include( fnOp );\n\n\t\t\treturn fnOp;\n\n\t\t}\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Returns the node access for the given node and shader stage.\n\t *\n\t * @param {StorageTextureNode|StorageBufferNode} node - The storage node.\n\t * @param {string} shaderStage - The shader stage.\n\t * @return {string} The node access.\n\t */\n\tgetNodeAccess( node, shaderStage ) {\n\n\t\tif ( shaderStage !== 'compute' ) {\n\n\t\t\tif ( node.isAtomic === true ) {\n\n\t\t\t\twarn( 'WebGPURenderer: Atomic operations are only supported in compute shaders.' );\n\n\t\t\t\treturn NodeAccess.READ_WRITE;\n\n\t\t\t}\n\n\t\t\treturn NodeAccess.READ_ONLY;\n\n\t\t}\n\n\t\treturn node.access;\n\n\t}\n\n\t/**\n\t * Returns A WGSL snippet representing the storage access.\n\t *\n\t * @param {StorageTextureNode|StorageBufferNode} node - The storage node.\n\t * @param {string} shaderStage - The shader stage.\n\t * @return {string} The WGSL snippet representing the storage access.\n\t */\n\tgetStorageAccess( node, shaderStage ) {\n\n\t\treturn accessNames[ this.getNodeAccess( node, shaderStage ) ];\n\n\t}\n\n\t/**\n\t * This method is one of the more important ones since it's responsible\n\t * for generating a matching binding instance for the given uniform node.\n\t *\n\t * These bindings are later used in the renderer to create bind groups\n\t * and layouts.\n\t *\n\t * @param {UniformNode} node - The uniform node.\n\t * @param {string} type - The node data type.\n\t * @param {string} shaderStage - The shader stage.\n\t * @param {?string} [name=null] - An optional uniform name.\n\t * @return {NodeUniform} The node uniform object.\n\t */\n\tgetUniformFromNode( node, type, shaderStage, name = null ) {\n\n\t\tconst uniformNode = super.getUniformFromNode( node, type, shaderStage, name );\n\t\tconst nodeData = this.getDataFromNode( node, shaderStage, this.globalCache );\n\n\t\tif ( nodeData.uniformGPU === undefined ) {\n\n\t\t\tlet uniformGPU;\n\n\t\t\tconst group = node.groupNode;\n\t\t\tconst groupName = group.name;\n\n\t\t\tconst bindings = this.getBindGroupArray( groupName, shaderStage );\n\n\t\t\tif ( type === 'texture' || type === 'cubeTexture' || type === 'cubeDepthTexture' || type === 'storageTexture' || type === 'texture3D' ) {\n\n\t\t\t\tlet texture = null;\n\n\t\t\t\tconst access = this.getNodeAccess( node, shaderStage );\n\n\t\t\t\tif ( type === 'texture' || type === 'storageTexture' ) {\n\n\t\t\t\t\tif ( node.value.is3DTexture === true ) {\n\n\t\t\t\t\t\ttexture = new NodeSampledTexture3D( uniformNode.name, uniformNode.node, group, access );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttexture = new NodeSampledTexture( uniformNode.name, uniformNode.node, group, access );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( type === 'cubeTexture' || type === 'cubeDepthTexture' ) {\n\n\t\t\t\t\ttexture = new NodeSampledCubeTexture( uniformNode.name, uniformNode.node, group, access );\n\n\t\t\t\t} else if ( type === 'texture3D' ) {\n\n\t\t\t\t\ttexture = new NodeSampledTexture3D( uniformNode.name, uniformNode.node, group, access );\n\n\t\t\t\t}\n\n\t\t\t\ttexture.store = node.isStorageTextureNode === true;\n\t\t\t\ttexture.mipLevel = texture.store ? node.mipLevel : 0;\n\t\t\t\ttexture.setVisibility( gpuShaderStageLib[ shaderStage ] );\n\n\t\t\t\tif ( this.isUnfilterable( node.value ) === false && texture.store === false ) {\n\n\t\t\t\t\tconst sampler = new NodeSampler( `${ uniformNode.name }_sampler`, uniformNode.node, group );\n\t\t\t\t\tsampler.setVisibility( gpuShaderStageLib[ shaderStage ] );\n\n\t\t\t\t\tbindings.push( sampler, texture );\n\n\t\t\t\t\tuniformGPU = [ sampler, texture ];\n\n\t\t\t\t} else {\n\n\t\t\t\t\tbindings.push( texture );\n\n\t\t\t\t\tuniformGPU = [ texture ];\n\n\t\t\t\t}\n\n\t\t\t} else if ( type === 'buffer' || type === 'storageBuffer' || type === 'indirectStorageBuffer' ) {\n\n\t\t\t\tconst sharedData = this.getSharedDataFromNode( node );\n\n\t\t\t\tlet buffer = sharedData.buffer;\n\n\t\t\t\tif ( buffer === undefined ) {\n\n\t\t\t\t\tconst bufferClass = type === 'buffer' ? NodeUniformBuffer : NodeStorageBuffer;\n\n\t\t\t\t\tbuffer = new bufferClass( node, group );\n\n\t\t\t\t\tsharedData.buffer = buffer;\n\n\t\t\t\t}\n\n\t\t\t\tbuffer.setVisibility( buffer.getVisibility() | gpuShaderStageLib[ shaderStage ] );\n\n\t\t\t\tbindings.push( buffer );\n\n\t\t\t\tuniformGPU = buffer;\n\n\t\t\t\tuniformNode.name = name ? name : 'NodeBuffer_' + uniformNode.id;\n\n\t\t\t} else {\n\n\t\t\t\tconst uniformsStage = this.uniformGroups[ shaderStage ] || ( this.uniformGroups[ shaderStage ] = {} );\n\n\t\t\t\tlet uniformsGroup = uniformsStage[ groupName ];\n\n\t\t\t\tif ( uniformsGroup === undefined ) {\n\n\t\t\t\t\tuniformsGroup = new NodeUniformsGroup( groupName, group );\n\t\t\t\t\tuniformsGroup.setVisibility( gpuShaderStageLib[ shaderStage ] );\n\n\t\t\t\t\tuniformsStage[ groupName ] = uniformsGroup;\n\n\t\t\t\t\tbindings.push( uniformsGroup );\n\n\t\t\t\t}\n\n\t\t\t\tuniformGPU = this.getNodeUniform( uniformNode, type );\n\n\t\t\t\tuniformsGroup.addUniform( uniformGPU );\n\n\t\t\t}\n\n\t\t\tnodeData.uniformGPU = uniformGPU;\n\n\t\t}\n\n\t\treturn uniformNode;\n\n\t}\n\n\t/**\n\t * This method should be used whenever builtins are required in nodes.\n\t * The internal builtins data structure will make sure builtins are\n\t * defined in the WGSL source.\n\t *\n\t * @param {string} name - The builtin name.\n\t * @param {string} property - The property name.\n\t * @param {string} type - The node data type.\n\t * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.\n\t * @return {string} The property name.\n\t */\n\tgetBuiltin( name, property, type, shaderStage = this.shaderStage ) {\n\n\t\tconst map = this.builtins[ shaderStage ] || ( this.builtins[ shaderStage ] = new Map() );\n\n\t\tif ( map.has( name ) === false ) {\n\n\t\t\tmap.set( name, {\n\t\t\t\tname,\n\t\t\t\tproperty,\n\t\t\t\ttype\n\t\t\t} );\n\n\t\t}\n\n\t\treturn property;\n\n\t}\n\n\t/**\n\t * Returns `true` if the given builtin is defined in the given shader stage.\n\t *\n\t * @param {string} name - The builtin name.\n\t * @param {string} [shaderStage=this.shaderStage] - The shader stage this code snippet is generated for.\n\t * @return {boolean} Whether the given builtin is defined in the given shader stage or not.\n\t */\n\thasBuiltin( name, shaderStage = this.shaderStage ) {\n\n\t\treturn ( this.builtins[ shaderStage ] !== undefined && this.builtins[ shaderStage ].has( name ) );\n\n\t}\n\n\t/**\n\t * Returns the vertex index builtin.\n\t *\n\t * @return {string} The vertex index.\n\t */\n\tgetVertexIndex() {\n\n\t\tif ( this.shaderStage === 'vertex' ) {\n\n\t\t\treturn this.getBuiltin( 'vertex_index', 'vertexIndex', 'u32', 'attribute' );\n\n\t\t}\n\n\t\treturn 'vertexIndex';\n\n\t}\n\n\t/**\n\t * Builds the given shader node.\n\t *\n\t * @param {ShaderNodeInternal} shaderNode - The shader node.\n\t * @return {string} The WGSL function code.\n\t */\n\tbuildFunctionCode( shaderNode ) {\n\n\t\tconst layout = shaderNode.layout;\n\t\tconst flowData = this.flowShaderNode( shaderNode );\n\n\t\tconst parameters = [];\n\n\t\tfor ( const input of layout.inputs ) {\n\n\t\t\tparameters.push( input.name + ' : ' + this.getType( input.type ) );\n\n\t\t}\n\n\t\t//\n\n\t\tlet code = `fn ${ layout.name }( ${ parameters.join( ', ' ) } ) -> ${ this.getType( layout.type ) } {\n${ flowData.vars }\n${ flowData.code }\n`;\n\n\t\tif ( flowData.result ) {\n\n\t\t\tcode += `\\treturn ${ flowData.result };\\n`;\n\n\t\t}\n\n\t\tcode += '\\n}\\n';\n\n\t\t//\n\n\t\treturn code;\n\n\t}\n\n\t/**\n\t * Contextually returns either the vertex stage instance index builtin\n\t * or the linearized index of an compute invocation within a grid of workgroups.\n\t *\n\t * @return {string} The instance index.\n\t */\n\tgetInstanceIndex() {\n\n\t\tif ( this.shaderStage === 'vertex' ) {\n\n\t\t\treturn this.getBuiltin( 'instance_index', 'instanceIndex', 'u32', 'attribute' );\n\n\t\t}\n\n\t\treturn 'instanceIndex';\n\n\t}\n\n\n\t/**\n\t * Returns a builtin representing the index of a compute invocation within the scope of a workgroup load.\n\t *\n\t * @return {string} The invocation local index.\n\t */\n\tgetInvocationLocalIndex() {\n\n\t\treturn this.getBuiltin( 'local_invocation_index', 'invocationLocalIndex', 'u32', 'attribute' );\n\n\t}\n\n\t/**\n\t * Returns a builtin representing the size of a subgroup within the current shader.\n\t *\n\t * @return {string} The subgroup size.\n\t */\n\tgetSubgroupSize() {\n\n\t\tthis.enableSubGroups();\n\n\t\treturn this.getBuiltin( 'subgroup_size', 'subgroupSize', 'u32', 'attribute' );\n\n\t}\n\n\t/**\n\t * Returns a builtin representing the index of a compute invocation within the scope of a subgroup.\n\t *\n\t * @return {string} The invocation subgroup index.\n\t */\n\tgetInvocationSubgroupIndex() {\n\n\t\tthis.enableSubGroups();\n\n\t\treturn this.getBuiltin( 'subgroup_invocation_id', 'invocationSubgroupIndex', 'u32', 'attribute' );\n\n\t}\n\n\t/**\n\t * Returns a builtin representing the index of a compute invocation's subgroup within its workgroup.\n\t *\n\t * @return {string} The subgroup index.\n\t */\n\tgetSubgroupIndex() {\n\n\t\tthis.enableSubGroups();\n\n\t\treturn this.getBuiltin( 'subgroup_id', 'subgroupIndex', 'u32', 'attribute' );\n\n\t}\n\n\t/**\n\t * Overwritten as a NOP since this method is intended for the WebGL 2 backend.\n\t *\n\t * @return {null} Null.\n\t */\n\tgetDrawIndex() {\n\n\t\treturn null;\n\n\t}\n\n\t/**\n\t * Returns the front facing builtin.\n\t *\n\t * @return {string} The front facing builtin.\n\t */\n\tgetFrontFacing() {\n\n\t\treturn this.getBuiltin( 'front_facing', 'isFront', 'bool' );\n\n\t}\n\n\t/**\n\t * Returns the frag coord builtin.\n\t *\n\t * @return {string} The frag coord builtin.\n\t */\n\tgetFragCoord() {\n\n\t\treturn this.getBuiltin( 'position', 'fragCoord', 'vec4<f32>' ) + '.xy';\n\n\t}\n\n\t/**\n\t * Returns the frag depth builtin.\n\t *\n\t * @return {string} The frag depth builtin.\n\t */\n\tgetFragDepth() {\n\n\t\treturn 'output.' + this.getBuiltin( 'frag_depth', 'depth', 'f32', 'output' );\n\n\t}\n\n\t/**\n\t * Returns the clip distances builtin.\n\t *\n\t * @return {string} The clip distances builtin.\n\t */\n\tgetClipDistance() {\n\n\t\treturn 'varyings.hw_clip_distances';\n\n\t}\n\n\t/**\n\t * Whether to flip texture data along its vertical axis or not.\n\t *\n\t * @return {boolean} Returns always `false` in context of WGSL.\n\t */\n\tisFlipY() {\n\n\t\treturn false;\n\n\t}\n\n\t/**\n\t * Enables the given directive for the given shader stage.\n\t *\n\t * @param {string} name - The directive name.\n\t * @param {string} [shaderStage=this.shaderStage] - The shader stage to enable the directive for.\n\t */\n\tenableDirective( name, shaderStage = this.shaderStage ) {\n\n\t\tconst stage = this.directives[ shaderStage ] || ( this.directives[ shaderStage ] = new Set() );\n\t\tstage.add( name );\n\n\t}\n\n\t/**\n\t * Returns the directives of the given shader stage as a WGSL string.\n\t *\n\t * @param {string} shaderStage - The shader stage.\n\t * @return {string} A WGSL snippet that enables the directives of the given stage.\n\t */\n\tgetDirectives( shaderStage ) {\n\n\t\tconst snippets = [];\n\t\tconst directives = this.directives[ shaderStage ];\n\n\t\tif ( directives !== undefined ) {\n\n\t\t\tfor ( const directive of directives ) {\n\n\t\t\t\tsnippets.push( `enable ${directive};` );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn snippets.join( '\\n' );\n\n\t}\n\n\t/**\n\t * Enables the 'subgroups' directive.\n\t */\n\tenableSubGroups() {\n\n\t\tthis.enableDirective( 'subgroups' );\n\n\t}\n\n\t/**\n\t * Enables the 'subgroups-f16' directive.\n\t */\n\tenableSubgroupsF16() {\n\n\t\tthis.enableDirective( 'subgroups-f16' );\n\n\t}\n\n\t/**\n\t * Enables the 'clip_distances' directive.\n\t */\n\tenableClipDistances() {\n\n\t\tthis.enableDirective( 'clip_distances' );\n\n\t}\n\n\t/**\n\t * Enables the 'f16' directive.\n\t */\n\tenableShaderF16() {\n\n\t\tthis.enableDirective( 'f16' );\n\n\t}\n\n\t/**\n\t * Enables the 'dual_source_blending' directive.\n\t */\n\tenableDualSourceBlending() {\n\n\t\tthis.enableDirective( 'dual_source_blending' );\n\n\t}\n\n\t/**\n\t * Enables hardware clipping.\n\t *\n\t * @param {string} planeCount - The clipping plane count.\n\t */\n\tenableHardwareClipping( planeCount ) {\n\n\t\tthis.enableClipDistances();\n\t\tthis.getBuiltin( 'clip_distances', 'hw_clip_distances', `array<f32, ${ planeCount } >`, 'vertex' );\n\n\t}\n\n\t/**\n\t * Returns the builtins of the given shader stage as a WGSL string.\n\t *\n\t * @param {string} shaderStage - The shader stage.\n\t * @return {string} A WGSL snippet that represents the builtins of the given stage.\n\t */\n\tgetBuiltins( shaderStage ) {\n\n\t\tconst snippets = [];\n\t\tconst builtins = this.builtins[ shaderStage ];\n\n\t\tif ( builtins !== undefined ) {\n\n\t\t\tfor ( const { name, property, type } of builtins.values() ) {\n\n\t\t\t\tsnippets.push( `@builtin( ${name} ) ${property} : ${type}` );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn snippets.join( ',\\n\\t' );\n\n\t}\n\n\t/**\n\t * This method should be used when a new scoped buffer is used in context of\n\t * compute shaders. It adds the array to the internal data structure which is\n\t * later used to generate the respective WGSL.\n\t *\n\t * @param {string} name - The array name.\n\t * @param {string} scope - The scope.\n\t * @param {string} bufferType - The buffer type.\n\t * @param {string} bufferCount - The buffer count.\n\t * @return {string} The array name.\n\t */\n\tgetScopedArray( name, scope, bufferType, bufferCount ) {\n\n\t\tif ( this.scopedArrays.has( name ) === false ) {\n\n\t\t\tthis.scopedArrays.set( name, {\n\t\t\t\tname,\n\t\t\t\tscope,\n\t\t\t\tbufferType,\n\t\t\t\tbufferCount\n\t\t\t} );\n\n\t\t}\n\n\t\treturn name;\n\n\t}\n\n\t/**\n\t * Returns the scoped arrays of the given shader stage as a WGSL string.\n\t *\n\t * @param {string} shaderStage - The shader stage.\n\t * @return {string|undefined} The WGSL snippet that defines the scoped arrays.\n\t * Returns `undefined` when used in the vertex or fragment stage.\n\t */\n\tgetScopedArrays( shaderStage ) {\n\n\t\tif ( shaderStage !== 'compute' ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tconst snippets = [];\n\n\t\tfor ( const { name, scope, bufferType, bufferCount } of this.scopedArrays.values() ) {\n\n\t\t\tconst type = this.getType( bufferType );\n\n\t\t\tsnippets.push( `var<${scope}> ${name}: array< ${type}, ${bufferCount} >;` );\n\n\t\t}\n\n\t\treturn snippets.join( '\\n' );\n\n\t}\n\n\t/**\n\t * Returns the shader attributes of the given shader stage as a WGSL string.\n\t *\n\t * @param {string} shaderStage - The shader stage.\n\t * @return {string} The WGSL snippet that defines the shader attributes.\n\t */\n\tgetAttributes( shaderStage ) {\n\n\t\tconst snippets = [];\n\n\t\tif ( shaderStage === 'compute' ) {\n\n\t\t\tthis.getBuiltin( 'global_invocation_id', 'globalId', 'vec3<u32>', 'attribute' );\n\t\t\tthis.getBuiltin( 'workgroup_id', 'workgroupId', 'vec3<u32>', 'attribute' );\n\t\t\tthis.getBuiltin( 'local_invocation_id', 'localId', 'vec3<u32>', 'attribute' );\n\t\t\tthis.getBuiltin( 'num_workgroups', 'numWorkgroups', 'vec3<u32>', 'attribute' );\n\n\t\t\tif ( this.renderer.hasFeature( 'subgroups' ) ) {\n\n\t\t\t\tthis.enableDirective( 'subgroups', shaderStage );\n\t\t\t\tthis.getBuiltin( 'subgroup_size', 'subgroupSize', 'u32', 'attribute' );\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( shaderStage === 'vertex' || shaderStage === 'compute' ) {\n\n\t\t\tconst builtins = this.getBuiltins( 'attribute' );\n\n\t\t\tif ( builtins ) snippets.push( builtins );\n\n\t\t\tconst attributes = this.getAttributesArray();\n\n\t\t\tfor ( let index = 0, length = attributes.length; index < length; index ++ ) {\n\n\t\t\t\tconst attribute = attributes[ index ];\n\t\t\t\tconst name = attribute.name;\n\t\t\t\tconst type = this.getType( attribute.type );\n\n\t\t\t\tsnippets.push( `@location( ${index} ) ${ name } : ${ type }` );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn snippets.join( ',\\n\\t' );\n\n\t}\n\n\t/**\n\t * Returns the members of the given struct type node as a WGSL string.\n\t *\n\t * @param {StructTypeNode} struct - The struct type node.\n\t * @return {string} The WGSL snippet that defines the struct members.\n\t */\n\tgetStructMembers( struct ) {\n\n\t\tconst snippets = [];\n\n\t\tfor ( const member of struct.members ) {\n\n\t\t\tconst prefix = struct.output ? '@location( ' + member.index + ' ) ' : '';\n\n\t\t\tlet type = this.getType( member.type );\n\n\t\t\tif ( member.atomic ) {\n\n\t\t\t\ttype = 'atomic< ' + type + ' >';\n\n\t\t\t}\n\n\t\t\tsnippets.push( `\\t${ prefix + member.name } : ${ type }` );\n\n\t\t}\n\n\t\tif ( struct.output ) {\n\n\t\t\tsnippets.push( `\\t${ this.getBuiltins( 'output' ) }` );\n\n\t\t}\n\n\t\treturn snippets.join( ',\\n' );\n\n\t}\n\n\t/**\n\t * Returns the structs of the given shader stage as a WGSL string.\n\t *\n\t * @param {string} shaderStage - The shader stage.\n\t * @return {string} The WGSL snippet that defines the structs.\n\t */\n\tgetStructs( shaderStage ) {\n\n\t\tlet result = '';\n\n\t\tconst structs = this.structs[ shaderStage ];\n\n\t\tif ( structs.length > 0 ) {\n\n\t\t\tconst snippets = [];\n\n\t\t\tfor ( const struct of structs ) {\n\n\t\t\t\tlet snippet = `struct ${ struct.name } {\\n`;\n\t\t\t\tsnippet += this.getStructMembers( struct );\n\t\t\t\tsnippet += '\\n};';\n\n\t\t\t\tsnippets.push( snippet );\n\n\t\t\t}\n\n\t\t\tresult = '\\n' + snippets.join( '\\n\\n' ) + '\\n';\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\t/**\n\t * Returns a WGSL string representing a variable.\n\t *\n\t * @param {string} type - The variable's type.\n\t * @param {string} name - The variable's name.\n\t * @param {?number} [count=null] - The array length.\n\t * @return {string} The WGSL snippet that defines a variable.\n\t */\n\tgetVar( type, name, count = null ) {\n\n\t\tlet snippet = `var ${ name } : `;\n\n\t\tif ( count !== null ) {\n\n\t\t\tsnippet += this.generateArrayDeclaration( type, count );\n\n\t\t} else {\n\n\t\t\tsnippet += this.getType( type );\n\n\t\t}\n\n\t\treturn snippet;\n\n\t}\n\n\t/**\n\t * Returns the variables of the given shader stage as a WGSL string.\n\t *\n\t * @param {string} shaderStage - The shader stage.\n\t * @return {string} The WGSL snippet that defines the variables.\n\t */\n\tgetVars( shaderStage ) {\n\n\t\tconst snippets = [];\n\t\tconst vars = this.vars[ shaderStage ];\n\n\t\tif ( vars !== undefined ) {\n\n\t\t\tfor ( const variable of vars ) {\n\n\t\t\t\tsnippets.push( `\\t${ this.getVar( variable.type, variable.name, variable.count ) };` );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn `\\n${ snippets.join( '\\n' ) }\\n`;\n\n\t}\n\n\t/**\n\t * Returns the varyings of the given shader stage as a WGSL string.\n\t *\n\t * @param {string} shaderStage - The shader stage.\n\t * @return {string} The WGSL snippet that defines the varyings.\n\t */\n\tgetVaryings( shaderStage ) {\n\n\t\tconst snippets = [];\n\n\t\tif ( shaderStage === 'vertex' ) {\n\n\t\t\tthis.getBuiltin( 'position', 'Vertex', 'vec4<f32>', 'vertex' );\n\n\t\t}\n\n\t\tif ( shaderStage === 'vertex' || shaderStage === 'fragment' ) {\n\n\t\t\tconst varyings = this.varyings;\n\t\t\tconst vars = this.vars[ shaderStage ];\n\n\t\t\tfor ( let index = 0; index < varyings.length; index ++ ) {\n\n\t\t\t\tconst varying = varyings[ index ];\n\n\t\t\t\tif ( varying.needsInterpolation ) {\n\n\t\t\t\t\tlet attributesSnippet = `@location( ${index} )`;\n\n\t\t\t\t\tif ( varying.interpolationType ) {\n\n\t\t\t\t\t\tconst samplingSnippet = varying.interpolationSampling !== null ? `, ${ varying.interpolationSampling } )` : ' )';\n\n\t\t\t\t\t\tattributesSnippet += ` @interpolate( ${ varying.interpolationType }${ samplingSnippet }`;\n\n\t\t\t\t\t\t// Otherwise, optimize interpolation when sensible\n\n\t\t\t\t\t} else if ( /^(int|uint|ivec|uvec)/.test( varying.type ) ) {\n\n\t\t\t\t\t\tattributesSnippet += ` @interpolate( ${ this.renderer.backend.compatibilityMode ? 'flat, either' : 'flat' } )`;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tsnippets.push( `${ attributesSnippet } ${ varying.name } : ${ this.getType( varying.type ) }` );\n\n\t\t\t\t} else if ( shaderStage === 'vertex' && vars.includes( varying ) === false ) {\n\n\t\t\t\t\tvars.push( varying );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst builtins = this.getBuiltins( shaderStage );\n\n\t\tif ( builtins ) snippets.push( builtins );\n\n\t\tconst code = snippets.join( ',\\n\\t' );\n\n\t\treturn shaderStage === 'vertex' ? this._getWGSLStruct( 'VaryingsStruct', '\\t' + code ) : code;\n\n\t}\n\n\tisCustomStruct( nodeUniform ) {\n\n\t\tconst attribute = nodeUniform.value;\n\t\tconst bufferNode = nodeUniform.node;\n\n\t\tconst isAttributeStructType = ( attribute.isBufferAttribute || attribute.isInstancedBufferAttribute ) && bufferNode.structTypeNode !== null;\n\n\t\tconst isStructArray =\n\t\t\t( bufferNode.value && bufferNode.value.array ) &&\n\t\t\t( typeof bufferNode.value.itemSize === 'number' && bufferNode.value.array.length > bufferNode.value.itemSize );\n\n\t\treturn isAttributeStructType && ! isStructArray;\n\n\t}\n\n\t/**\n\t * Returns the uniforms of the given shader stage as a WGSL string.\n\t *\n\t * @param {string} shaderStage - The shader stage.\n\t * @return {string} The WGSL snippet that defines the uniforms.\n\t */\n\tgetUniforms( shaderStage ) {\n\n\t\tconst uniforms = this.uniforms[ shaderStage ];\n\n\t\tconst bindingSnippets = [];\n\t\tconst bufferSnippets = [];\n\t\tconst structSnippets = [];\n\t\tconst uniformGroups = {};\n\n\t\tfor ( const uniform of uniforms ) {\n\n\t\t\tconst groupName = uniform.groupNode.name;\n\t\t\tconst uniformIndexes = this.bindingsIndexes[ groupName ];\n\n\t\t\tif ( uniform.type === 'texture' || uniform.type === 'cubeTexture' || uniform.type === 'cubeDepthTexture' || uniform.type === 'storageTexture' || uniform.type === 'texture3D' ) {\n\n\t\t\t\tconst texture = uniform.node.value;\n\n\t\t\t\tif ( this.isUnfilterable( texture ) === false && uniform.node.isStorageTextureNode !== true ) {\n\n\t\t\t\t\tif ( this.isSampleCompare( texture ) ) {\n\n\t\t\t\t\t\tbindingSnippets.push( `@binding( ${ uniformIndexes.binding ++ } ) @group( ${ uniformIndexes.group } ) var ${ uniform.name }_sampler : sampler_comparison;` );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tbindingSnippets.push( `@binding( ${ uniformIndexes.binding ++ } ) @group( ${ uniformIndexes.group } ) var ${ uniform.name }_sampler : sampler;` );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tlet textureType;\n\n\t\t\t\tlet multisampled = '';\n\n\t\t\t\tconst { primarySamples } = this.renderer.backend.utils.getTextureSampleData( texture );\n\n\t\t\t\tif ( primarySamples > 1 ) {\n\n\t\t\t\t\tmultisampled = '_multisampled';\n\n\t\t\t\t}\n\n\t\t\t\tif ( texture.isCubeTexture === true && texture.isDepthTexture === true ) {\n\n\t\t\t\t\ttextureType = 'texture_depth_cube';\n\n\t\t\t\t} else if ( texture.isCubeTexture === true ) {\n\n\t\t\t\t\ttextureType = 'texture_cube<f32>';\n\n\t\t\t\t} else if ( texture.isDepthTexture === true ) {\n\n\t\t\t\t\tif ( this.renderer.backend.compatibilityMode && texture.compareFunction === null ) {\n\n\t\t\t\t\t\ttextureType = `texture${ multisampled }_2d<f32>`;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttextureType = `texture_depth${ multisampled }_2d${ texture.isArrayTexture === true ? '_array' : '' }`;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( uniform.node.isStorageTextureNode === true ) {\n\n\t\t\t\t\tconst format = getFormat( texture );\n\t\t\t\t\tconst access = this.getStorageAccess( uniform.node, shaderStage );\n\n\t\t\t\t\tconst is3D = uniform.node.value.is3DTexture;\n\t\t\t\t\tconst isArrayTexture = uniform.node.value.isArrayTexture;\n\n\t\t\t\t\tconst dimension = is3D ? '3d' : `2d${ isArrayTexture ? '_array' : '' }`;\n\n\t\t\t\t\ttextureType = `texture_storage_${ dimension }<${ format }, ${ access }>`;\n\n\t\t\t\t} else if ( texture.isArrayTexture === true || texture.isDataArrayTexture === true || texture.isCompressedArrayTexture === true ) {\n\n\t\t\t\t\ttextureType = 'texture_2d_array<f32>';\n\n\t\t\t\t} else if ( texture.is3DTexture === true || texture.isData3DTexture === true ) {\n\n\t\t\t\t\ttextureType = 'texture_3d<f32>';\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst componentPrefix = this.getComponentTypeFromTexture( texture ).charAt( 0 );\n\n\t\t\t\t\ttextureType = `texture${ multisampled }_2d<${ componentPrefix }32>`;\n\n\t\t\t\t}\n\n\t\t\t\tbindingSnippets.push( `@binding( ${ uniformIndexes.binding ++ } ) @group( ${ uniformIndexes.group } ) var ${ uniform.name } : ${ textureType };` );\n\n\t\t\t} else if ( uniform.type === 'buffer' || uniform.type === 'storageBuffer' || uniform.type === 'indirectStorageBuffer' ) {\n\n\t\t\t\tconst bufferNode = uniform.node;\n\t\t\t\tconst bufferType = this.getType( bufferNode.getNodeType( this ) );\n\t\t\t\tconst bufferCount = bufferNode.bufferCount;\n\t\t\t\tconst bufferCountSnippet = bufferCount > 0 && uniform.type === 'buffer' ? ', ' + bufferCount : '';\n\t\t\t\tconst bufferAccessMode = bufferNode.isStorageBufferNode ? `storage, ${ this.getStorageAccess( bufferNode, shaderStage ) }` : 'uniform';\n\n\t\t\t\tif ( this.isCustomStruct( uniform ) ) {\n\n\t\t\t\t\tbufferSnippets.push( `@binding( ${ uniformIndexes.binding ++ } ) @group( ${ uniformIndexes.group } ) var<${ bufferAccessMode }> ${ uniform.name } : ${ bufferType };` );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst bufferTypeSnippet = bufferNode.isAtomic ? `atomic<${ bufferType }>` : `${ bufferType }`;\n\t\t\t\t\tconst bufferSnippet = `\\tvalue : array< ${ bufferTypeSnippet }${ bufferCountSnippet } >`;\n\n\t\t\t\t\tbufferSnippets.push( this._getWGSLStructBinding( uniform.name, bufferSnippet, bufferAccessMode, uniformIndexes.binding ++, uniformIndexes.group ) );\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tconst vectorType = this.getType( this.getVectorType( uniform.type ) );\n\t\t\t\tconst groupName = uniform.groupNode.name;\n\n\t\t\t\tconst group = uniformGroups[ groupName ] || ( uniformGroups[ groupName ] = {\n\t\t\t\t\tindex: uniformIndexes.binding ++,\n\t\t\t\t\tid: uniformIndexes.group,\n\t\t\t\t\tsnippets: []\n\t\t\t\t} );\n\n\t\t\t\tgroup.snippets.push( `\\t${ uniform.name } : ${ vectorType }` );\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor ( const name in uniformGroups ) {\n\n\t\t\tconst group = uniformGroups[ name ];\n\n\t\t\tstructSnippets.push( this._getWGSLStructBinding( name, group.snippets.join( ',\\n' ), 'uniform', group.index, group.id ) );\n\n\t\t}\n\n\t\tconst code = [ ...bindingSnippets, ...bufferSnippets, ...structSnippets ].join( '\\n' );\n\n\t\treturn code;\n\n\t}\n\n\t/**\n\t * Controls the code build of the shader stages.\n\t */\n\tbuildCode() {\n\n\t\tconst shadersData = this.material !== null ? { fragment: {}, vertex: {} } : { compute: {} };\n\n\t\tthis.sortBindingGroups();\n\n\t\tfor ( const shaderStage in shadersData ) {\n\n\t\t\tthis.shaderStage = shaderStage;\n\n\t\t\tconst stageData = shadersData[ shaderStage ];\n\t\t\tstageData.uniforms = this.getUniforms( shaderStage );\n\t\t\tstageData.attributes = this.getAttributes( shaderStage );\n\t\t\tstageData.varyings = this.getVaryings( shaderStage );\n\t\t\tstageData.structs = this.getStructs( shaderStage );\n\t\t\tstageData.vars = this.getVars( shaderStage );\n\t\t\tstageData.codes = this.getCodes( shaderStage );\n\t\t\tstageData.directives = this.getDirectives( shaderStage );\n\t\t\tstageData.scopedArrays = this.getScopedArrays( shaderStage );\n\n\t\t\t//\n\n\t\t\tlet flow = '// code\\n\\n';\n\t\t\tflow += this.flowCode[ shaderStage ];\n\n\t\t\tconst flowNodes = this.flowNodes[ shaderStage ];\n\t\t\tconst mainNode = flowNodes[ flowNodes.length - 1 ];\n\n\t\t\tconst outputNode = mainNode.outputNode;\n\t\t\tconst isOutputStruct = ( outputNode !== undefined && outputNode.isOutputStructNode === true );\n\n\t\t\tfor ( const node of flowNodes ) {\n\n\t\t\t\tconst flowSlotData = this.getFlowData( node/*, shaderStage*/ );\n\t\t\t\tconst slotName = node.name;\n\n\t\t\t\tif ( slotName ) {\n\n\t\t\t\t\tif ( flow.length > 0 ) flow += '\\n';\n\n\t\t\t\t\tflow += `\\t// flow -> ${ slotName }\\n`;\n\n\t\t\t\t}\n\n\t\t\t\tflow += `${ flowSlotData.code }\\n\\t`;\n\n\t\t\t\tif ( node === mainNode && shaderStage !== 'compute' ) {\n\n\t\t\t\t\tflow += '// result\\n\\n\\t';\n\n\t\t\t\t\tif ( shaderStage === 'vertex' ) {\n\n\t\t\t\t\t\tflow += `varyings.Vertex = ${ flowSlotData.result };`;\n\n\t\t\t\t\t} else if ( shaderStage === 'fragment' ) {\n\n\t\t\t\t\t\tif ( isOutputStruct ) {\n\n\t\t\t\t\t\t\tstageData.returnType = outputNode.getNodeType( this );\n\t\t\t\t\t\t\tstageData.structs += 'var<private> output : ' + stageData.returnType + ';';\n\n\t\t\t\t\t\t\tflow += `return ${ flowSlotData.result };`;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tlet structSnippet = '\\t@location(0) color: vec4<f32>';\n\n\t\t\t\t\t\t\tconst builtins = this.getBuiltins( 'output' );\n\n\t\t\t\t\t\t\tif ( builtins ) structSnippet += ',\\n\\t' + builtins;\n\n\t\t\t\t\t\t\tstageData.returnType = 'OutputStruct';\n\t\t\t\t\t\t\tstageData.structs += this._getWGSLStruct( 'OutputStruct', structSnippet );\n\t\t\t\t\t\t\tstageData.structs += '\\nvar<private> output : OutputStruct;';\n\n\t\t\t\t\t\t\tflow += `output.color = ${ flowSlotData.result };\\n\\n\\treturn output;`;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tstageData.flow = flow;\n\n\t\t}\n\n\t\tthis.shaderStage = null;\n\n\t\tif ( this.material !== null ) {\n\n\t\t\tthis.vertexShader = this._getWGSLVertexCode( shadersData.vertex );\n\t\t\tthis.fragmentShader = this._getWGSLFragmentCode( shadersData.fragment );\n\n\t\t} else {\n\n\t\t\t// Early strictly validated in computeNode\n\n\t\t\tconst workgroupSize = this.object.workgroupSize;\n\n\t\t\tthis.computeShader = this._getWGSLComputeCode( shadersData.compute, workgroupSize );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the native shader method name for a given generic name.\n\t *\n\t * @param {string} method - The method name to resolve.\n\t * @param {?string} [output=null] - An optional output.\n\t * @return {string} The resolved WGSL method name.\n\t */\n\tgetMethod( method, output = null ) {\n\n\t\tlet wgslMethod;\n\n\t\tif ( output !== null ) {\n\n\t\t\twgslMethod = this._getWGSLMethod( method + '_' + output );\n\n\t\t}\n\n\t\tif ( wgslMethod === undefined ) {\n\n\t\t\twgslMethod = this._getWGSLMethod( method );\n\n\t\t}\n\n\t\treturn wgslMethod || method;\n\n\t}\n\n\t/**\n\t * Returns the bitcast method name for a given input and outputType.\n\t *\n\t * @param {string} type - The output type to bitcast to.\n\t * @return {string} The resolved WGSL bitcast invocation.\n\t */\n\tgetBitcastMethod( type ) {\n\n\t\tconst dataType = this.getType( type );\n\n\t\treturn `bitcast<${ dataType }>`;\n\n\t}\n\n\t/**\n\t * Returns the float packing method name for a given numeric encoding.\n\t *\n\t * @param {string} encoding - The numeric encoding that describes how the float values are mapped to the integer range.\n\t * @returns {string} The resolve WGSL float packing method name.\n\t */\n\tgetFloatPackingMethod( encoding ) {\n\n\t\treturn this.getMethod( `floatpack_${ encoding }_2x16` );\n\n\t}\n\n\t/**\n\t * Returns the float unpacking method name for a given numeric encoding.\n\t *\n\t * @param {string} encoding - The numeric encoding that describes how the integer values are mapped to the float range.\n\t * @returns {string} The resolve WGSL float unpacking method name.\n\t */\n\tgetFloatUnpackingMethod( encoding ) {\n\n\t\treturn this.getMethod( `floatunpack_${ encoding }_2x16` );\n\n\t}\n\n\t/**\n\t * Returns the native snippet for a ternary operation.\n\t *\n\t * @param {string} condSnippet - The condition determining which expression gets resolved.\n\t * @param {string} ifSnippet - The expression to resolve to if the condition is true.\n\t * @param {string} elseSnippet - The expression to resolve to if the condition is false.\n\t * @return {string} The resolved method name.\n\t */\n\tgetTernary( condSnippet, ifSnippet, elseSnippet ) {\n\n\t\treturn `select( ${elseSnippet}, ${ifSnippet}, ${condSnippet} )`;\n\n\t}\n\n\n\t/**\n\t * Returns the WGSL type of the given node data type.\n\t *\n\t * @param {string} type - The node data type.\n\t * @return {string} The WGSL type.\n\t */\n\tgetType( type ) {\n\n\t\treturn wgslTypeLib[ type ] || type;\n\n\t}\n\n\t/**\n\t * Whether the requested feature is available or not.\n\t *\n\t * @param {string} name - The requested feature.\n\t * @return {boolean} Whether the requested feature is supported or not.\n\t */\n\tisAvailable( name ) {\n\n\t\tlet result = supports[ name ];\n\n\t\tif ( result === undefined ) {\n\n\t\t\tif ( name === 'float32Filterable' ) {\n\n\t\t\t\tresult = this.renderer.hasFeature( 'float32-filterable' );\n\n\t\t\t} else if ( name === 'clipDistance' ) {\n\n\t\t\t\tresult = this.renderer.hasFeature( 'clip-distances' );\n\n\t\t\t}\n\n\t\t\tsupports[ name ] = result;\n\n\t\t}\n\n\t\treturn result;\n\n\t}\n\n\t/**\n\t * Returns the native shader method name for a given generic name.\n\t *\n\t * @private\n\t * @param {string} method - The method name to resolve.\n\t * @return {string} The resolved WGSL method name.\n\t */\n\t_getWGSLMethod( method ) {\n\n\t\tif ( wgslPolyfill[ method ] !== undefined ) {\n\n\t\t\tthis._include( method );\n\n\t\t}\n\n\t\treturn wgslMethods[ method ];\n\n\t}\n\n\t/**\n\t * Includes the given method name into the current\n\t * function node.\n\t *\n\t * @private\n\t * @param {string} name - The method name to include.\n\t * @return {CodeNode} The respective code node.\n\t */\n\t_include( name ) {\n\n\t\tconst codeNode = wgslPolyfill[ name ];\n\t\tcodeNode.build( this );\n\n\t\tthis.addInclude( codeNode );\n\n\t\treturn codeNode;\n\n\t}\n\n\t/**\n\t * Returns a WGSL vertex shader based on the given shader data.\n\t *\n\t * @private\n\t * @param {Object} shaderData - The shader data.\n\t * @return {string} The vertex shader.\n\t */\n\t_getWGSLVertexCode( shaderData ) {\n\n\t\treturn `${ this.getSignature() }\n// directives\n${shaderData.directives}\n\n// structs\n${shaderData.structs}\n\n// uniforms\n${shaderData.uniforms}\n\n// varyings\n${shaderData.varyings}\nvar<private> varyings : VaryingsStruct;\n\n// codes\n${shaderData.codes}\n\n@vertex\nfn main( ${shaderData.attributes} ) -> VaryingsStruct {\n\n\t// vars\n\t${shaderData.vars}\n\n\t// flow\n\t${shaderData.flow}\n\n\treturn varyings;\n\n}\n`;\n\n\t}\n\n\t/**\n\t * Returns a WGSL fragment shader based on the given shader data.\n\t *\n\t * @private\n\t * @param {Object} shaderData - The shader data.\n\t * @return {string} The vertex shader.\n\t */\n\t_getWGSLFragmentCode( shaderData ) {\n\n\t\treturn `${ this.getSignature() }\n// global\n${ diagnostics }\n\n// structs\n${shaderData.structs}\n\n// uniforms\n${shaderData.uniforms}\n\n// codes\n${shaderData.codes}\n\n@fragment\nfn main( ${shaderData.varyings} ) -> ${shaderData.returnType} {\n\n\t// vars\n\t${shaderData.vars}\n\n\t// flow\n\t${shaderData.flow}\n\n}\n`;\n\n\t}\n\n\t/**\n\t * Returns a WGSL compute shader based on the given shader data.\n\t *\n\t * @private\n\t * @param {Object} shaderData - The shader data.\n\t * @param {string} workgroupSize - The workgroup size.\n\t * @return {string} The vertex shader.\n\t */\n\t_getWGSLComputeCode( shaderData, workgroupSize ) {\n\n\t\tconst [ workgroupSizeX, workgroupSizeY, workgroupSizeZ ] = workgroupSize;\n\n\t\treturn `${ this.getSignature() }\n// directives\n${ shaderData.directives }\n\n// system\nvar<private> instanceIndex : u32;\n\n// locals\n${ shaderData.scopedArrays }\n\n// structs\n${ shaderData.structs }\n\n// uniforms\n${ shaderData.uniforms }\n\n// codes\n${ shaderData.codes }\n\n@compute @workgroup_size( ${ workgroupSizeX }, ${ workgroupSizeY }, ${ workgroupSizeZ } )\nfn main( ${ shaderData.attributes } ) {\n\n\t// system\n\tinstanceIndex = globalId.x\n\t\t+ globalId.y * ( ${ workgroupSizeX } * numWorkgroups.x )\n\t\t+ globalId.z * ( ${ workgroupSizeX } * numWorkgroups.x ) * ( ${ workgroupSizeY } * numWorkgroups.y );\n\n\t// vars\n\t${ shaderData.vars }\n\n\t// flow\n\t${ shaderData.flow }\n\n}\n`;\n\n\t}\n\n\t/**\n\t * Returns a WGSL struct based on the given name and variables.\n\t *\n\t * @private\n\t * @param {string} name - The struct name.\n\t * @param {string} vars - The struct variables.\n\t * @return {string} The WGSL snippet representing a struct.\n\t */\n\t_getWGSLStruct( name, vars ) {\n\n\t\treturn `\nstruct ${name} {\n${vars}\n};`;\n\n\t}\n\n\t/**\n\t * Returns a WGSL struct binding.\n\t *\n\t * @private\n\t * @param {string} name - The struct name.\n\t * @param {string} vars - The struct variables.\n\t * @param {string} access - The access.\n\t * @param {number} [binding=0] - The binding index.\n\t * @param {number} [group=0] - The group index.\n\t * @return {string} The WGSL snippet representing a struct binding.\n\t */\n\t_getWGSLStructBinding( name, vars, access, binding = 0, group = 0 ) {\n\n\t\tconst structName = name + 'Struct';\n\t\tconst structSnippet = this._getWGSLStruct( structName, vars );\n\n\t\treturn `${structSnippet}\n@binding( ${ binding } ) @group( ${ group } )\nvar<${access}> ${ name } : ${ structName };`;\n\n\t}\n\n}\n\n/**\n * A WebGPU backend utility module with common helpers.\n *\n * @private\n */\nclass WebGPUUtils {\n\n\t/**\n\t * Constructs a new utility object.\n\t *\n\t * @param {WebGPUBackend} backend - The WebGPU backend.\n\t */\n\tconstructor( backend ) {\n\n\t\t/**\n\t\t * A reference to the WebGPU backend.\n\t\t *\n\t\t * @type {WebGPUBackend}\n\t\t */\n\t\tthis.backend = backend;\n\n\t}\n\n\t/**\n\t * Returns the depth/stencil GPU format for the given render context.\n\t *\n\t * @param {RenderContext} renderContext - The render context.\n\t * @return {string} The depth/stencil GPU texture format.\n\t */\n\tgetCurrentDepthStencilFormat( renderContext ) {\n\n\t\tlet format;\n\n\t\tif ( renderContext.depthTexture !== null ) {\n\n\t\t\tformat = this.getTextureFormatGPU( renderContext.depthTexture );\n\n\t\t} else if ( renderContext.depth && renderContext.stencil ) {\n\n\t\t\tformat = GPUTextureFormat.Depth24PlusStencil8;\n\n\t\t} else if ( renderContext.depth ) {\n\n\t\t\tformat = GPUTextureFormat.Depth24Plus;\n\n\t\t}\n\n\t\treturn format;\n\n\t}\n\n\t/**\n\t * Returns the GPU format for the given texture.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @return {string} The GPU texture format.\n\t */\n\tgetTextureFormatGPU( texture ) {\n\n\t\treturn this.backend.get( texture ).format;\n\n\t}\n\n\t/**\n\t * Returns an object that defines the multi-sampling state of the given texture.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @return {Object} The multi-sampling state.\n\t */\n\tgetTextureSampleData( texture ) {\n\n\t\tlet samples;\n\n\t\tif ( texture.isFramebufferTexture ) {\n\n\t\t\tsamples = 1;\n\n\t\t} else if ( texture.isDepthTexture && ! texture.renderTarget ) {\n\n\t\t\tconst renderer = this.backend.renderer;\n\t\t\tconst renderTarget = renderer.getRenderTarget();\n\n\t\t\tsamples = renderTarget ? renderTarget.samples : renderer.currentSamples;\n\n\t\t} else if ( texture.renderTarget ) {\n\n\t\t\tsamples = texture.renderTarget.samples;\n\n\t\t}\n\n\t\tsamples = samples || 1;\n\n\t\tconst isMSAA = samples > 1 && texture.renderTarget !== null && ( texture.isDepthTexture !== true && texture.isFramebufferTexture !== true );\n\t\tconst primarySamples = isMSAA ? 1 : samples;\n\n\t\treturn { samples, primarySamples, isMSAA };\n\n\t}\n\n\t/**\n\t * Returns the default color attachment's GPU format of the current render context.\n\t *\n\t * @param {RenderContext} renderContext - The render context.\n\t * @return {string} The GPU texture format of the default color attachment.\n\t */\n\tgetCurrentColorFormat( renderContext ) {\n\n\t\tlet format;\n\n\t\tif ( renderContext.textures !== null ) {\n\n\t\t\tformat = this.getTextureFormatGPU( renderContext.textures[ 0 ] );\n\n\t\t} else {\n\n\t\t\tformat = this.getPreferredCanvasFormat(); // default context format\n\n\t\t}\n\n\t\treturn format;\n\n\t}\n\n\t/**\n\t * Returns the GPU formats of all color attachments of the current render context.\n\t *\n\t * @param {RenderContext} renderContext - The render context.\n\t * @return {Array<string>} The GPU texture formats of all color attachments.\n\t */\n\tgetCurrentColorFormats( renderContext ) {\n\n\t\tif ( renderContext.textures !== null ) {\n\n\t\t\treturn renderContext.textures.map( t => this.getTextureFormatGPU( t ) );\n\n\t\t} else {\n\n\t\t\treturn [ this.getPreferredCanvasFormat() ]; // default context format\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the output color space of the current render context.\n\t *\n\t * @param {RenderContext} renderContext - The render context.\n\t * @return {string} The output color space.\n\t */\n\tgetCurrentColorSpace( renderContext ) {\n\n\t\tif ( renderContext.textures !== null ) {\n\n\t\t\treturn renderContext.textures[ 0 ].colorSpace;\n\n\t\t}\n\n\t\treturn this.backend.renderer.outputColorSpace;\n\n\t}\n\n\t/**\n\t * Returns GPU primitive topology for the given object and material.\n\t *\n\t * @param {Object3D} object - The 3D object.\n\t * @param {Material} material - The material.\n\t * @return {string} The GPU primitive topology.\n\t */\n\tgetPrimitiveTopology( object, material ) {\n\n\t\tif ( object.isPoints ) return GPUPrimitiveTopology.PointList;\n\t\telse if ( object.isLineSegments || ( object.isMesh && material.wireframe === true ) ) return GPUPrimitiveTopology.LineList;\n\t\telse if ( object.isLine ) return GPUPrimitiveTopology.LineStrip;\n\t\telse if ( object.isMesh ) return GPUPrimitiveTopology.TriangleList;\n\n\t}\n\n\t/**\n\t * Returns a modified sample count from the given sample count value.\n\t *\n\t * That is required since WebGPU only supports either 1 or 4.\n\t *\n\t * @param {number} sampleCount - The input sample count.\n\t * @return {number} The (potentially updated) output sample count.\n\t */\n\tgetSampleCount( sampleCount ) {\n\n\t\treturn sampleCount >= 4 ? 4 : 1;\n\n\t}\n\n\t/**\n\t * Returns the sample count of the given render context.\n\t *\n\t * @param {RenderContext} renderContext - The render context.\n\t * @return {number} The sample count.\n\t */\n\tgetSampleCountRenderContext( renderContext ) {\n\n\t\tif ( renderContext.textures !== null ) {\n\n\t\t\treturn this.getSampleCount( renderContext.sampleCount );\n\n\t\t}\n\n\t\treturn this.getSampleCount( this.backend.renderer.currentSamples );\n\n\t}\n\n\t/**\n\t * Returns the preferred canvas format.\n\t *\n\t * There is a separate method for this so it's possible to\n\t * honor edge cases for specific devices.\n\t *\n\t * @return {string} The GPU texture format of the canvas.\n\t */\n\tgetPreferredCanvasFormat() {\n\n\t\tconst parameters = this.backend.parameters;\n\n\t\tconst bufferType = parameters.outputType;\n\n\t\tif ( bufferType === undefined ) {\n\n\t\t\treturn navigator.gpu.getPreferredCanvasFormat();\n\n\t\t} else if ( bufferType === UnsignedByteType ) {\n\n\t\t\treturn GPUTextureFormat.BGRA8Unorm;\n\n\t\t} else if ( bufferType === HalfFloatType ) {\n\n\t\t\treturn GPUTextureFormat.RGBA16Float;\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'Unsupported output buffer type.' );\n\n\t\t}\n\n\t}\n\n}\n\nconst typedArraysToVertexFormatPrefix = new Map( [\n\t[ Int8Array, [ 'sint8', 'snorm8' ]],\n\t[ Uint8Array, [ 'uint8', 'unorm8' ]],\n\t[ Int16Array, [ 'sint16', 'snorm16' ]],\n\t[ Uint16Array, [ 'uint16', 'unorm16' ]],\n\t[ Int32Array, [ 'sint32', 'snorm32' ]],\n\t[ Uint32Array, [ 'uint32', 'unorm32' ]],\n\t[ Float32Array, [ 'float32', ]],\n] );\n\nif ( typeof Float16Array !== 'undefined' ) {\n\n\ttypedArraysToVertexFormatPrefix.set( Float16Array, [ 'float16' ] );\n\n}\n\nconst typedAttributeToVertexFormatPrefix = new Map( [\n\t[ Float16BufferAttribute, [ 'float16', ]],\n] );\n\nconst typeArraysToVertexFormatPrefixForItemSize1 = new Map( [\n\t[ Int32Array, 'sint32' ],\n\t[ Int16Array, 'sint32' ], // patch for INT16\n\t[ Uint32Array, 'uint32' ],\n\t[ Uint16Array, 'uint32' ], // patch for UINT16\n\t[ Float32Array, 'float32' ]\n] );\n\n/**\n * A WebGPU backend utility module for managing shader attributes.\n *\n * @private\n */\nclass WebGPUAttributeUtils {\n\n\t/**\n\t * Constructs a new utility object.\n\t *\n\t * @param {WebGPUBackend} backend - The WebGPU backend.\n\t */\n\tconstructor( backend ) {\n\n\t\t/**\n\t\t * A reference to the WebGPU backend.\n\t\t *\n\t\t * @type {WebGPUBackend}\n\t\t */\n\t\tthis.backend = backend;\n\n\t}\n\n\t/**\n\t * Creates the GPU buffer for the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute.\n\t * @param {GPUBufferUsage} usage - A flag that indicates how the buffer may be used after its creation.\n\t */\n\tcreateAttribute( attribute, usage ) {\n\n\t\tconst bufferAttribute = this._getBufferAttribute( attribute );\n\n\t\tconst backend = this.backend;\n\t\tconst bufferData = backend.get( bufferAttribute );\n\n\t\tlet buffer = bufferData.buffer;\n\n\t\tif ( buffer === undefined ) {\n\n\t\t\tconst device = backend.device;\n\n\t\t\tlet array = bufferAttribute.array;\n\n\t\t\t// patch for INT16 and UINT16\n\t\t\tif ( attribute.normalized === false ) {\n\n\t\t\t\tif ( array.constructor === Int16Array || array.constructor === Int8Array ) {\n\n\t\t\t\t\tarray = new Int32Array( array );\n\n\t\t\t\t} else if ( array.constructor === Uint16Array || array.constructor === Uint8Array ) {\n\n\t\t\t\t\tarray = new Uint32Array( array );\n\n\t\t\t\t\tif ( usage & GPUBufferUsage.INDEX ) {\n\n\t\t\t\t\t\tfor ( let i = 0; i < array.length; i ++ ) {\n\n\t\t\t\t\t\t\tif ( array[ i ] === 0xffff ) array[ i ] = 0xffffffff; // use correct primitive restart index\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tbufferAttribute.array = array;\n\n\t\t\tif ( ( bufferAttribute.isStorageBufferAttribute || bufferAttribute.isStorageInstancedBufferAttribute ) && bufferAttribute.itemSize === 3 ) {\n\n\t\t\t\tarray = new array.constructor( bufferAttribute.count * 4 );\n\n\t\t\t\tfor ( let i = 0; i < bufferAttribute.count; i ++ ) {\n\n\t\t\t\t\tarray.set( bufferAttribute.array.subarray( i * 3, i * 3 + 3 ), i * 4 );\n\n\t\t\t\t}\n\n\t\t\t\t// Update BufferAttribute\n\t\t\t\tbufferAttribute.itemSize = 4;\n\t\t\t\tbufferAttribute.array = array;\n\n\t\t\t\tbufferData._force3to4BytesAlignment = true;\n\n\t\t\t}\n\n\t\t\t// ensure 4 byte alignment\n\t\t\tconst byteLength = array.byteLength;\n\t\t\tconst size = byteLength + ( ( 4 - ( byteLength % 4 ) ) % 4 );\n\n\t\t\tbuffer = device.createBuffer( {\n\t\t\t\tlabel: bufferAttribute.name,\n\t\t\t\tsize: size,\n\t\t\t\tusage: usage,\n\t\t\t\tmappedAtCreation: true\n\t\t\t} );\n\n\t\t\tnew array.constructor( buffer.getMappedRange() ).set( array );\n\n\t\t\tbuffer.unmap();\n\n\t\t\tbufferData.buffer = buffer;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the GPU buffer of the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute.\n\t */\n\tupdateAttribute( attribute ) {\n\n\t\tconst bufferAttribute = this._getBufferAttribute( attribute );\n\n\t\tconst backend = this.backend;\n\t\tconst device = backend.device;\n\n\t\tconst bufferData = backend.get( bufferAttribute );\n\t\tconst buffer = backend.get( bufferAttribute ).buffer;\n\n\t\tlet array = bufferAttribute.array;\n\n\t\t//  if storage buffer ensure 4 byte alignment\n\t\tif ( bufferData._force3to4BytesAlignment === true ) {\n\n\t\t\tarray = new array.constructor( bufferAttribute.count * 4 );\n\n\t\t\tfor ( let i = 0; i < bufferAttribute.count; i ++ ) {\n\n\t\t\t\tarray.set( bufferAttribute.array.subarray( i * 3, i * 3 + 3 ), i * 4 );\n\n\t\t\t}\n\n\t\t\tbufferAttribute.array = array;\n\n\t\t}\n\n\n\t\tconst updateRanges = bufferAttribute.updateRanges;\n\n\t\tif ( updateRanges.length === 0 ) {\n\n\t\t\t// Not using update ranges\n\n\t\t\tdevice.queue.writeBuffer(\n\t\t\t\tbuffer,\n\t\t\t\t0,\n\t\t\t\tarray,\n\t\t\t\t0\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tconst isTyped = isTypedArray( array );\n\t\t\tconst byteOffsetFactor = isTyped ? 1 : array.BYTES_PER_ELEMENT;\n\n\t\t\tfor ( let i = 0, l = updateRanges.length; i < l; i ++ ) {\n\n\t\t\t\tconst range = updateRanges[ i ];\n\t\t\t\tlet dataOffset, size;\n\n\t\t\t\tif ( bufferData._force3to4BytesAlignment === true ) {\n\n\t\t\t\t\tconst vertexStart = Math.floor( range.start / 3 );\n\t\t\t\t\tconst vertexCount = Math.ceil( range.count / 3 );\n\t\t\t\t\tdataOffset = vertexStart * 4 * byteOffsetFactor;\n\t\t\t\t\tsize = vertexCount * 4 * byteOffsetFactor;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tdataOffset = range.start * byteOffsetFactor;\n\t\t\t\t\tsize = range.count * byteOffsetFactor;\n\n\t\t\t\t}\n\n\t\t\t\tconst bufferOffset = dataOffset * ( isTyped ? array.BYTES_PER_ELEMENT : 1 ); // bufferOffset is always in bytes\n\n\t\t\t\tdevice.queue.writeBuffer(\n\t\t\t\t\tbuffer,\n\t\t\t\t\tbufferOffset,\n\t\t\t\t\tarray,\n\t\t\t\t\tdataOffset,\n\t\t\t\t\tsize\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\tbufferAttribute.clearUpdateRanges();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * This method creates the vertex buffer layout data which are\n\t * require when creating a render pipeline for the given render object.\n\t *\n\t * @param {RenderObject} renderObject - The render object.\n\t * @return {Array<Object>} An array holding objects which describe the vertex buffer layout.\n\t */\n\tcreateShaderVertexBuffers( renderObject ) {\n\n\t\tconst attributes = renderObject.getAttributes();\n\t\tconst vertexBuffers = new Map();\n\n\t\tfor ( let slot = 0; slot < attributes.length; slot ++ ) {\n\n\t\t\tconst geometryAttribute = attributes[ slot ];\n\t\t\tconst bytesPerElement = geometryAttribute.array.BYTES_PER_ELEMENT;\n\t\t\tconst bufferAttribute = this._getBufferAttribute( geometryAttribute );\n\n\t\t\tlet vertexBufferLayout = vertexBuffers.get( bufferAttribute );\n\n\t\t\tif ( vertexBufferLayout === undefined ) {\n\n\t\t\t\tlet arrayStride, stepMode;\n\n\t\t\t\tif ( geometryAttribute.isInterleavedBufferAttribute === true ) {\n\n\t\t\t\t\tarrayStride = geometryAttribute.data.stride * bytesPerElement;\n\t\t\t\t\tstepMode = geometryAttribute.data.isInstancedInterleavedBuffer ? GPUInputStepMode.Instance : GPUInputStepMode.Vertex;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tarrayStride = geometryAttribute.itemSize * bytesPerElement;\n\t\t\t\t\tstepMode = geometryAttribute.isInstancedBufferAttribute ? GPUInputStepMode.Instance : GPUInputStepMode.Vertex;\n\n\t\t\t\t}\n\n\t\t\t\t// patch for INT16 and UINT16\n\t\t\t\tif ( geometryAttribute.normalized === false && ( geometryAttribute.array.constructor === Int16Array || geometryAttribute.array.constructor === Uint16Array ) ) {\n\n\t\t\t\t\tarrayStride = 4;\n\n\t\t\t\t}\n\n\t\t\t\tvertexBufferLayout = {\n\t\t\t\t\tarrayStride,\n\t\t\t\t\tattributes: [],\n\t\t\t\t\tstepMode\n\t\t\t\t};\n\n\t\t\t\tvertexBuffers.set( bufferAttribute, vertexBufferLayout );\n\n\t\t\t}\n\n\t\t\tconst format = this._getVertexFormat( geometryAttribute );\n\t\t\tconst offset = ( geometryAttribute.isInterleavedBufferAttribute === true ) ? geometryAttribute.offset * bytesPerElement : 0;\n\n\t\t\tvertexBufferLayout.attributes.push( {\n\t\t\t\tshaderLocation: slot,\n\t\t\t\toffset,\n\t\t\t\tformat\n\t\t\t} );\n\n\t\t}\n\n\t\treturn Array.from( vertexBuffers.values() );\n\n\t}\n\n\t/**\n\t * Destroys the GPU buffer of the given buffer attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute.\n\t */\n\tdestroyAttribute( attribute ) {\n\n\t\tconst backend = this.backend;\n\t\tconst data = backend.get( this._getBufferAttribute( attribute ) );\n\n\t\tdata.buffer.destroy();\n\n\t\tbackend.delete( attribute );\n\n\t}\n\n\t/**\n\t * This method performs a readback operation by moving buffer data from\n\t * a storage buffer attribute from the GPU to the CPU.\n\t *\n\t * @async\n\t * @param {StorageBufferAttribute} attribute - The storage buffer attribute.\n\t * @return {Promise<ArrayBuffer>} A promise that resolves with the buffer data when the data are ready.\n\t */\n\tasync getArrayBufferAsync( attribute ) {\n\n\t\tconst backend = this.backend;\n\t\tconst device = backend.device;\n\n\t\tconst data = backend.get( this._getBufferAttribute( attribute ) );\n\t\tconst bufferGPU = data.buffer;\n\t\tconst size = bufferGPU.size;\n\n\t\tconst readBufferGPU = device.createBuffer( {\n\t\t\tlabel: `${ attribute.name }_readback`,\n\t\t\tsize,\n\t\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ\n\t\t} );\n\n\t\tconst cmdEncoder = device.createCommandEncoder( {\n\t\t\tlabel: `readback_encoder_${ attribute.name }`\n\t\t} );\n\n\t\tcmdEncoder.copyBufferToBuffer(\n\t\t\tbufferGPU,\n\t\t\t0,\n\t\t\treadBufferGPU,\n\t\t\t0,\n\t\t\tsize\n\t\t);\n\n\t\tconst gpuCommands = cmdEncoder.finish();\n\t\tdevice.queue.submit( [ gpuCommands ] );\n\n\t\tawait readBufferGPU.mapAsync( GPUMapMode.READ );\n\n\t\tconst arrayBuffer = readBufferGPU.getMappedRange();\n\n\t\tconst dstBuffer = new attribute.array.constructor( arrayBuffer.slice( 0 ) );\n\n\t\treadBufferGPU.unmap();\n\n\t\treturn dstBuffer.buffer;\n\n\t}\n\n\t/**\n\t * Returns the vertex format of the given buffer attribute.\n\t *\n\t * @private\n\t * @param {BufferAttribute} geometryAttribute - The buffer attribute.\n\t * @return {string|undefined} The vertex format (e.g. 'float32x3').\n\t */\n\t_getVertexFormat( geometryAttribute ) {\n\n\t\tconst { itemSize, normalized } = geometryAttribute;\n\t\tconst ArrayType = geometryAttribute.array.constructor;\n\t\tconst AttributeType = geometryAttribute.constructor;\n\n\t\tlet format;\n\n\t\tif ( itemSize === 1 ) {\n\n\t\t\tformat = typeArraysToVertexFormatPrefixForItemSize1.get( ArrayType );\n\n\t\t} else {\n\n\t\t\tconst prefixOptions = typedAttributeToVertexFormatPrefix.get( AttributeType ) || typedArraysToVertexFormatPrefix.get( ArrayType );\n\t\t\tconst prefix = prefixOptions[ normalized ? 1 : 0 ];\n\n\t\t\tif ( prefix ) {\n\n\t\t\t\tconst bytesPerUnit = ArrayType.BYTES_PER_ELEMENT * itemSize;\n\t\t\t\tconst paddedBytesPerUnit = Math.floor( ( bytesPerUnit + 3 ) / 4 ) * 4;\n\t\t\t\tconst paddedItemSize = paddedBytesPerUnit / ArrayType.BYTES_PER_ELEMENT;\n\n\t\t\t\tif ( paddedItemSize % 1 ) {\n\n\t\t\t\t\tthrow new Error( 'THREE.WebGPUAttributeUtils: Bad vertex format item size.' );\n\n\t\t\t\t}\n\n\t\t\t\tformat = `${prefix}x${paddedItemSize}`;\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( ! format ) {\n\n\t\t\terror( 'WebGPUAttributeUtils: Vertex format not supported yet.' );\n\n\t\t}\n\n\t\treturn format;\n\n\t}\n\n\t/**\n\t * Utility method for handling interleaved buffer attributes correctly.\n\t * To process them, their `InterleavedBuffer` is returned.\n\t *\n\t * @private\n\t * @param {BufferAttribute} attribute - The attribute.\n\t * @return {BufferAttribute|InterleavedBuffer}\n\t */\n\t_getBufferAttribute( attribute ) {\n\n\t\tif ( attribute.isInterleavedBufferAttribute ) attribute = attribute.data;\n\n\t\treturn attribute;\n\n\t}\n\n}\n\n/**\n * Class representing a WebGPU bind group layout.\n *\n * @private\n */\nclass BindGroupLayout {\n\n\t/**\n\t * Constructs a new layout.\n\t *\n\t * @param {GPUBindGroupLayout} layoutGPU - A GPU Bind Group Layout.\n\t */\n\tconstructor( layoutGPU ) {\n\n\t\t/**\n\t\t * The current GPUBindGroupLayout.\n\t\t *\n\t\t * @type {GPUBindGroupLayout}\n\t\t */\n\t\tthis.layoutGPU = layoutGPU;\n\n\t\t/**\n\t\t * The number of bind groups that use this layout.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.usedTimes = 0;\n\n\t}\n\n}\n\n/**\n * A WebGPU backend utility module for managing bindings.\n *\n * When reading the documentation it's helpful to keep in mind that\n * all class definitions starting with 'GPU*' are modules from the\n * WebGPU API. So for example `BindGroup` is a class from the engine\n * whereas `GPUBindGroup` is a class from WebGPU.\n *\n * @private\n */\nclass WebGPUBindingUtils {\n\n\t/**\n\t * Constructs a new utility object.\n\t *\n\t * @param {WebGPUBackend} backend - The WebGPU backend.\n\t */\n\tconstructor( backend ) {\n\n\t\t/**\n\t\t * A reference to the WebGPU backend.\n\t\t *\n\t\t * @type {WebGPUBackend}\n\t\t */\n\t\tthis.backend = backend;\n\n\t\t/**\n\t\t * A cache that maps combinations of layout entries to existing bind group layouts.\n\t\t *\n\t\t * @private\n\t\t * @type {Map<string, BindGroupLayout>}\n\t\t */\n\t\tthis._bindGroupLayoutCache = new Map();\n\n\t}\n\n\t/**\n\t * Creates a GPU bind group layout for the given bind group.\n\t *\n\t * @param {BindGroup} bindGroup - The bind group.\n\t * @return {GPUBindGroupLayout} The GPU bind group layout.\n\t */\n\tcreateBindingsLayout( bindGroup ) {\n\n\t\tconst backend = this.backend;\n\t\tconst device = backend.device;\n\n\t\tconst bindingsData = backend.get( bindGroup );\n\n\t\t// check if the the bind group already has a layout\n\n\t\tif ( bindingsData.layout ) {\n\n\t\t\treturn bindingsData.layout.layoutGPU;\n\n\t\t}\n\n\t\t// if not, assing one\n\n\t\tconst entries = this._createLayoutEntries( bindGroup );\n\t\tconst bindGroupLayoutKey = JSON.stringify( entries );\n\n\t\t// try to find an existing layout in the cache\n\n\t\tlet bindGroupLayout = this._bindGroupLayoutCache.get( bindGroupLayoutKey );\n\n\t\t// if not create a new one\n\n\t\tif ( bindGroupLayout === undefined ) {\n\n\t\t\tbindGroupLayout = new BindGroupLayout( device.createBindGroupLayout( { entries } ) );\n\t\t\tthis._bindGroupLayoutCache.set( bindGroupLayoutKey, bindGroupLayout );\n\n\t\t}\n\n\t\tbindGroupLayout.usedTimes ++;\n\n\t\tbindingsData.layout = bindGroupLayout;\n\t\tbindingsData.layoutKey = bindGroupLayoutKey;\n\n\t\treturn bindGroupLayout.layoutGPU;\n\n\t}\n\n\t/**\n\t * Creates bindings from the given bind group definition.\n\t *\n\t * @param {BindGroup} bindGroup - The bind group.\n\t * @param {Array<BindGroup>} bindings - Array of bind groups.\n\t * @param {number} cacheIndex - The cache index.\n\t * @param {number} version - The version.\n\t */\n\tcreateBindings( bindGroup, bindings, cacheIndex, version = 0 ) {\n\n\t\tconst { backend } = this;\n\t\tconst bindingsData = backend.get( bindGroup );\n\n\t\t// setup (static) binding layout and (dynamic) binding group\n\n\t\tconst bindLayoutGPU = this.createBindingsLayout( bindGroup );\n\n\t\tlet bindGroupGPU;\n\n\t\tif ( cacheIndex > 0 ) {\n\n\t\t\tif ( bindingsData.groups === undefined ) {\n\n\t\t\t\tbindingsData.groups = [];\n\t\t\t\tbindingsData.versions = [];\n\n\t\t\t}\n\n\t\t\tif ( bindingsData.versions[ cacheIndex ] === version ) {\n\n\t\t\t\tbindGroupGPU = bindingsData.groups[ cacheIndex ];\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( bindGroupGPU === undefined ) {\n\n\t\t\tbindGroupGPU = this.createBindGroup( bindGroup, bindLayoutGPU );\n\n\t\t\tif ( cacheIndex > 0 ) {\n\n\t\t\t\tbindingsData.groups[ cacheIndex ] = bindGroupGPU;\n\t\t\t\tbindingsData.versions[ cacheIndex ] = version;\n\n\t\t\t}\n\n\t\t}\n\n\t\tbindingsData.group = bindGroupGPU;\n\n\t}\n\n\t/**\n\t * Updates a buffer binding.\n\t *\n\t *  @param {Buffer} binding - The buffer binding to update.\n\t */\n\tupdateBinding( binding ) {\n\n\t\tconst backend = this.backend;\n\t\tconst device = backend.device;\n\n\t\tconst array = binding.buffer; // cpu\n\t\tconst buffer = backend.get( binding ).buffer; // gpu\n\n\t\tconst updateRanges = binding.updateRanges;\n\n\t\tif ( updateRanges.length === 0 ) {\n\n\t\t\tdevice.queue.writeBuffer(\n\t\t\t\tbuffer,\n\t\t\t\t0,\n\t\t\t\tarray,\n\t\t\t\t0\n\t\t\t);\n\n\t\t} else {\n\n\t\t\tconst isTyped = isTypedArray( array );\n\t\t\tconst byteOffsetFactor = isTyped ? 1 : array.BYTES_PER_ELEMENT;\n\n\t\t\tfor ( let i = 0, l = updateRanges.length; i < l; i ++ ) {\n\n\t\t\t\tconst range = updateRanges[ i ];\n\n\t\t\t\tconst dataOffset = range.start * byteOffsetFactor;\n\t\t\t\tconst size = range.count * byteOffsetFactor;\n\n\t\t\t\tconst bufferOffset = dataOffset * ( isTyped ? array.BYTES_PER_ELEMENT : 1 ); // bufferOffset is always in bytes\n\n\t\t\t\tdevice.queue.writeBuffer(\n\t\t\t\t\tbuffer,\n\t\t\t\t\tbufferOffset,\n\t\t\t\t\tarray,\n\t\t\t\t\tdataOffset,\n\t\t\t\t\tsize\n\t\t\t\t);\n\n\t\t\t}\n\n\t\t\tbinding.clearUpdateRanges();\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Creates a GPU bind group for the camera index.\n\t *\n\t * @param {Uint32Array} data - The index data.\n\t * @param {GPUBindGroupLayout} layoutGPU - The GPU bind group layout.\n\t * @return {GPUBindGroup} The GPU bind group.\n\t */\n\tcreateBindGroupIndex( data, layoutGPU ) {\n\n\t\tconst backend = this.backend;\n\t\tconst device = backend.device;\n\n\t\tconst usage = GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST;\n\t\tconst index = data[ 0 ];\n\n\t\tconst buffer = device.createBuffer( {\n\t\t\tlabel: 'bindingCameraIndex_' + index,\n\t\t\tsize: 16, // uint(4) * 4\n\t\t\tusage: usage\n\t\t} );\n\n\t\tdevice.queue.writeBuffer( buffer, 0, data, 0 );\n\n\t\tconst entries = [ { binding: 0, resource: { buffer } } ];\n\n\t\treturn device.createBindGroup( {\n\t\t\tlabel: 'bindGroupCameraIndex_' + index,\n\t\t\tlayout: layoutGPU,\n\t\t\tentries\n\t\t} );\n\n\t}\n\n\t/**\n\t * Creates a GPU bind group for the given bind group and GPU layout.\n\t *\n\t * @param {BindGroup} bindGroup - The bind group.\n\t * @param {GPUBindGroupLayout} layoutGPU - The GPU bind group layout.\n\t * @return {GPUBindGroup} The GPU bind group.\n\t */\n\tcreateBindGroup( bindGroup, layoutGPU ) {\n\n\t\tconst backend = this.backend;\n\t\tconst device = backend.device;\n\n\t\tlet bindingPoint = 0;\n\t\tconst entriesGPU = [];\n\n\t\tfor ( const binding of bindGroup.bindings ) {\n\n\t\t\tif ( binding.isUniformBuffer ) {\n\n\t\t\t\tconst bindingData = backend.get( binding );\n\n\t\t\t\tif ( bindingData.buffer === undefined ) {\n\n\t\t\t\t\tconst byteLength = binding.byteLength;\n\n\t\t\t\t\tconst usage = GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST;\n\n\t\t\t\t\tconst visibilities = [];\n\t\t\t\t\tif ( binding.visibility & GPUShaderStage.VERTEX ) {\n\n\t\t\t\t\t\tvisibilities.push( 'vertex' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( binding.visibility & GPUShaderStage.FRAGMENT ) {\n\n\t\t\t\t\t\tvisibilities.push( 'fragment' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( binding.visibility & GPUShaderStage.COMPUTE ) {\n\n\t\t\t\t\t\tvisibilities.push( 'compute' );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tconst bufferVisibility = `(${visibilities.join( ',' )})`;\n\n\t\t\t\t\tconst bufferGPU = device.createBuffer( {\n\t\t\t\t\t\tlabel: `bindingBuffer${binding.id}_${binding.name}_${bufferVisibility}`,\n\t\t\t\t\t\tsize: byteLength,\n\t\t\t\t\t\tusage: usage\n\t\t\t\t\t} );\n\n\t\t\t\t\tbindingData.buffer = bufferGPU;\n\n\t\t\t\t}\n\n\t\t\t\tentriesGPU.push( { binding: bindingPoint, resource: { buffer: bindingData.buffer } } );\n\n\t\t\t} else if ( binding.isStorageBuffer ) {\n\n\t\t\t\tconst bindingData = backend.get( binding );\n\n\t\t\t\tif ( bindingData.buffer === undefined ) {\n\n\t\t\t\t\tconst attribute = binding.attribute;\n\t\t\t\t\t//const usage = GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX | /*GPUBufferUsage.COPY_SRC |*/ GPUBufferUsage.COPY_DST;\n\n\t\t\t\t\t//backend.attributeUtils.createAttribute( attribute, usage ); // @TODO: Move it to universal renderer\n\n\t\t\t\t\tbindingData.buffer = backend.get( attribute ).buffer;\n\n\t\t\t\t}\n\n\t\t\t\tentriesGPU.push( { binding: bindingPoint, resource: { buffer: bindingData.buffer } } );\n\n\t\t\t} else if ( binding.isSampledTexture ) {\n\n\t\t\t\tconst textureData = backend.get( binding.texture );\n\n\t\t\t\tlet resourceGPU;\n\n\t\t\t\tif ( textureData.externalTexture !== undefined ) {\n\n\t\t\t\t\tresourceGPU = device.importExternalTexture( { source: textureData.externalTexture } );\n\n\t\t\t\t} else {\n\n\t\t\t\t\tconst mipLevelCount = binding.store ? 1 : textureData.texture.mipLevelCount;\n\t\t\t\t\tconst baseMipLevel = binding.store ? binding.mipLevel : 0;\n\t\t\t\t\tlet propertyName = `view-${ textureData.texture.width }-${ textureData.texture.height }`;\n\n\t\t\t\t\tif ( textureData.texture.depthOrArrayLayers > 1 ) {\n\n\t\t\t\t\t\tpropertyName += `-${ textureData.texture.depthOrArrayLayers }`;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tpropertyName += `-${ mipLevelCount }-${ baseMipLevel }`;\n\n\t\t\t\t\tresourceGPU = textureData[ propertyName ];\n\n\t\t\t\t\tif ( resourceGPU === undefined ) {\n\n\t\t\t\t\t\tconst aspectGPU = GPUTextureAspect.All;\n\n\t\t\t\t\t\tlet dimensionViewGPU;\n\n\t\t\t\t\t\tif ( binding.isSampledCubeTexture ) {\n\n\t\t\t\t\t\t\tdimensionViewGPU = GPUTextureViewDimension.Cube;\n\n\t\t\t\t\t\t} else if ( binding.isSampledTexture3D ) {\n\n\t\t\t\t\t\t\tdimensionViewGPU = GPUTextureViewDimension.ThreeD;\n\n\t\t\t\t\t\t} else if ( binding.texture.isArrayTexture || binding.texture.isDataArrayTexture || binding.texture.isCompressedArrayTexture ) {\n\n\t\t\t\t\t\t\tdimensionViewGPU = GPUTextureViewDimension.TwoDArray;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tdimensionViewGPU = GPUTextureViewDimension.TwoD;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tresourceGPU = textureData[ propertyName ] = textureData.texture.createView( { aspect: aspectGPU, dimension: dimensionViewGPU, mipLevelCount, baseMipLevel } );\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tentriesGPU.push( { binding: bindingPoint, resource: resourceGPU } );\n\n\t\t\t} else if ( binding.isSampler ) {\n\n\t\t\t\tconst textureGPU = backend.get( binding.texture );\n\n\t\t\t\tentriesGPU.push( { binding: bindingPoint, resource: textureGPU.sampler } );\n\n\t\t\t}\n\n\t\t\tbindingPoint ++;\n\n\t\t}\n\n\t\treturn device.createBindGroup( {\n\t\t\tlabel: 'bindGroup_' + bindGroup.name,\n\t\t\tlayout: layoutGPU,\n\t\t\tentries: entriesGPU\n\t\t} );\n\n\t}\n\n\t/**\n\t * Creates a GPU bind group layout entries for the given bind group.\n\t *\n\t * @private\n\t * @param {BindGroup} bindGroup - The bind group.\n\t * @return {Array<GPUBindGroupLayoutEntry>} The GPU bind group layout entries.\n\t */\n\t_createLayoutEntries( bindGroup ) {\n\n\t\tconst entries = [];\n\t\tlet index = 0;\n\n\t\tfor ( const binding of bindGroup.bindings ) {\n\n\t\t\tconst backend = this.backend;\n\n\t\t\tconst bindingGPU = {\n\t\t\t\tbinding: index,\n\t\t\t\tvisibility: binding.visibility\n\t\t\t};\n\n\t\t\tif ( binding.isUniformBuffer || binding.isStorageBuffer ) {\n\n\t\t\t\tconst buffer = {}; // GPUBufferBindingLayout\n\n\t\t\t\tif ( binding.isStorageBuffer ) {\n\n\t\t\t\t\tif ( binding.visibility & GPUShaderStage.COMPUTE ) {\n\n\t\t\t\t\t\t// compute\n\n\t\t\t\t\t\tif ( binding.access === NodeAccess.READ_WRITE || binding.access === NodeAccess.WRITE_ONLY ) {\n\n\t\t\t\t\t\t\tbuffer.type = GPUBufferBindingType.Storage;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\tbuffer.type = GPUBufferBindingType.ReadOnlyStorage;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tbuffer.type = GPUBufferBindingType.ReadOnlyStorage;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tbindingGPU.buffer = buffer;\n\n\t\t\t} else if ( binding.isSampledTexture && binding.store ) {\n\n\t\t\t\tconst storageTexture = {}; // GPUStorageTextureBindingLayout\n\t\t\t\tstorageTexture.format = this.backend.get( binding.texture ).texture.format;\n\n\t\t\t\tconst access = binding.access;\n\n\t\t\t\tif ( access === NodeAccess.READ_WRITE ) {\n\n\t\t\t\t\tstorageTexture.access = GPUStorageTextureAccess.ReadWrite;\n\n\t\t\t\t} else if ( access === NodeAccess.WRITE_ONLY ) {\n\n\t\t\t\t\tstorageTexture.access = GPUStorageTextureAccess.WriteOnly;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tstorageTexture.access = GPUStorageTextureAccess.ReadOnly;\n\n\t\t\t\t}\n\n\t\t\t\tif ( binding.texture.isArrayTexture ) {\n\n\t\t\t\t\tstorageTexture.viewDimension = GPUTextureViewDimension.TwoDArray;\n\n\t\t\t\t} else if ( binding.texture.is3DTexture ) {\n\n\t\t\t\t\tstorageTexture.viewDimension = GPUTextureViewDimension.ThreeD;\n\n\t\t\t\t}\n\n\t\t\t\tbindingGPU.storageTexture = storageTexture;\n\n\t\t\t} else if ( binding.isSampledTexture ) {\n\n\t\t\t\tconst texture = {}; // GPUTextureBindingLayout\n\n\t\t\t\tconst { primarySamples } = backend.utils.getTextureSampleData( binding.texture );\n\n\t\t\t\tif ( primarySamples > 1 ) {\n\n\t\t\t\t\ttexture.multisampled = true;\n\n\t\t\t\t\tif ( ! binding.texture.isDepthTexture ) {\n\n\t\t\t\t\t\ttexture.sampleType = GPUTextureSampleType.UnfilterableFloat;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( binding.texture.isDepthTexture ) {\n\n\t\t\t\t\tif ( backend.compatibilityMode && binding.texture.compareFunction === null ) {\n\n\t\t\t\t\t\ttexture.sampleType = GPUTextureSampleType.UnfilterableFloat;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\ttexture.sampleType = GPUTextureSampleType.Depth;\n\n\t\t\t\t\t}\n\n\t\t\t\t} else if ( binding.texture.isDataTexture || binding.texture.isDataArrayTexture || binding.texture.isData3DTexture ) {\n\n\t\t\t\t\tconst type = binding.texture.type;\n\n\t\t\t\t\tif ( type === IntType ) {\n\n\t\t\t\t\t\ttexture.sampleType = GPUTextureSampleType.SInt;\n\n\t\t\t\t\t} else if ( type === UnsignedIntType ) {\n\n\t\t\t\t\t\ttexture.sampleType = GPUTextureSampleType.UInt;\n\n\t\t\t\t\t} else if ( type === FloatType ) {\n\n\t\t\t\t\t\tif ( this.backend.hasFeature( 'float32-filterable' ) ) {\n\n\t\t\t\t\t\t\ttexture.sampleType = GPUTextureSampleType.Float;\n\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\ttexture.sampleType = GPUTextureSampleType.UnfilterableFloat;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( binding.isSampledCubeTexture ) {\n\n\t\t\t\t\ttexture.viewDimension = GPUTextureViewDimension.Cube;\n\n\t\t\t\t} else if ( binding.texture.isArrayTexture || binding.texture.isDataArrayTexture || binding.texture.isCompressedArrayTexture ) {\n\n\t\t\t\t\ttexture.viewDimension = GPUTextureViewDimension.TwoDArray;\n\n\t\t\t\t} else if ( binding.isSampledTexture3D ) {\n\n\t\t\t\t\ttexture.viewDimension = GPUTextureViewDimension.ThreeD;\n\n\t\t\t\t}\n\n\t\t\t\tbindingGPU.texture = texture;\n\n\t\t\t} else if ( binding.isSampler ) {\n\n\t\t\t\tconst sampler = {}; // GPUSamplerBindingLayout\n\n\t\t\t\tif ( binding.texture.isDepthTexture ) {\n\n\t\t\t\t\tif ( binding.texture.compareFunction !== null ) {\n\n\t\t\t\t\t\tsampler.type = GPUSamplerBindingType.Comparison;\n\n\t\t\t\t\t} else if ( backend.compatibilityMode ) {\n\n\t\t\t\t\t\tsampler.type = GPUSamplerBindingType.NonFiltering;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tbindingGPU.sampler = sampler;\n\n\t\t\t} else {\n\n\t\t\t\terror( `WebGPUBindingUtils: Unsupported binding \"${ binding }\".` );\n\n\t\t\t}\n\n\t\t\tentries.push( bindingGPU );\n\t\t\tindex ++;\n\n\t\t}\n\n\t\treturn entries;\n\n\t}\n\n\t/**\n\t * Delete the data associated with a bind group.\n\t *\n\t * @param {BindGroup} bindGroup - The bind group.\n\t */\n\tdeleteBindGroupData( bindGroup ) {\n\n\t\tconst { backend } = this;\n\n\t\tconst bindingsData = backend.get( bindGroup );\n\n\t\tif ( bindingsData.layout ) {\n\n\t\t\tbindingsData.layout.usedTimes --;\n\n\t\t\tif ( bindingsData.layout.usedTimes === 0 ) {\n\n\t\t\t\tthis._bindGroupLayoutCache.delete( bindingsData.layoutKey );\n\n\t\t\t}\n\n\t\t\tbindingsData.layout = undefined;\n\t\t\tbindingsData.layoutKey = undefined;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Frees internal resources.\n\t */\n\tdispose() {\n\n\t\tthis._bindGroupLayoutCache.clear();\n\n\t}\n\n}\n\n/**\n * A WebGPU backend utility module for managing pipelines.\n *\n * @private\n */\nclass WebGPUPipelineUtils {\n\n\t/**\n\t * Constructs a new utility object.\n\t *\n\t * @param {WebGPUBackend} backend - The WebGPU backend.\n\t */\n\tconstructor( backend ) {\n\n\t\t/**\n\t\t * A reference to the WebGPU backend.\n\t\t *\n\t\t * @type {WebGPUBackend}\n\t\t */\n\t\tthis.backend = backend;\n\n\t\t/**\n\t\t * A Weak Map that tracks the active pipeline for render or compute passes.\n\t\t *\n\t\t * @private\n\t\t * @type {WeakMap<(GPURenderPassEncoder|GPUComputePassEncoder),(GPURenderPipeline|GPUComputePipeline)>}\n\t\t */\n\t\tthis._activePipelines = new WeakMap();\n\n\t}\n\n\t/**\n\t * Sets the given pipeline for the given pass. The method makes sure to only set the\n\t * pipeline when necessary.\n\t *\n\t * @param {(GPURenderPassEncoder|GPUComputePassEncoder)} pass - The pass encoder.\n\t * @param {(GPURenderPipeline|GPUComputePipeline)} pipeline - The pipeline.\n\t */\n\tsetPipeline( pass, pipeline ) {\n\n\t\tconst currentPipeline = this._activePipelines.get( pass );\n\n\t\tif ( currentPipeline !== pipeline ) {\n\n\t\t\tpass.setPipeline( pipeline );\n\n\t\t\tthis._activePipelines.set( pass, pipeline );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns the sample count derived from the given render context.\n\t *\n\t * @private\n\t * @param {RenderContext} renderContext - The render context.\n\t * @return {number} The sample count.\n\t */\n\t_getSampleCount( renderContext ) {\n\n\t\treturn this.backend.utils.getSampleCountRenderContext( renderContext );\n\n\t}\n\n\t/**\n\t * Creates a render pipeline for the given render object.\n\t *\n\t * @param {RenderObject} renderObject - The render object.\n\t * @param {Array<Promise>} promises - An array of compilation promises which are used in `compileAsync()`.\n\t */\n\tcreateRenderPipeline( renderObject, promises ) {\n\n\t\tconst { object, material, geometry, pipeline } = renderObject;\n\t\tconst { vertexProgram, fragmentProgram } = pipeline;\n\n\t\tconst backend = this.backend;\n\t\tconst device = backend.device;\n\t\tconst utils = backend.utils;\n\n\t\tconst pipelineData = backend.get( pipeline );\n\n\t\t// bind group layouts\n\n\t\tconst bindGroupLayouts = [];\n\n\t\tfor ( const bindGroup of renderObject.getBindings() ) {\n\n\t\t\tconst bindingsData = backend.get( bindGroup );\n\t\t\tconst { layoutGPU } = bindingsData.layout;\n\n\t\t\tbindGroupLayouts.push( layoutGPU );\n\n\t\t}\n\n\t\t// vertex buffers\n\n\t\tconst vertexBuffers = backend.attributeUtils.createShaderVertexBuffers( renderObject );\n\n\t\t// blending\n\n\t\tlet blending;\n\n\t\tif ( material.blending !== NoBlending && ( material.blending !== NormalBlending || material.transparent !== false ) ) {\n\n\t\t\tblending = this._getBlending( material );\n\n\t\t}\n\n\t\t// stencil\n\n\t\tlet stencilFront = {};\n\n\t\tif ( material.stencilWrite === true ) {\n\n\t\t\tstencilFront = {\n\t\t\t\tcompare: this._getStencilCompare( material ),\n\t\t\t\tfailOp: this._getStencilOperation( material.stencilFail ),\n\t\t\t\tdepthFailOp: this._getStencilOperation( material.stencilZFail ),\n\t\t\t\tpassOp: this._getStencilOperation( material.stencilZPass )\n\t\t\t};\n\n\t\t}\n\n\t\tconst colorWriteMask = this._getColorWriteMask( material );\n\n\t\tconst targets = [];\n\n\t\tif ( renderObject.context.textures !== null ) {\n\n\t\t\tconst textures = renderObject.context.textures;\n\n\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\tconst colorFormat = utils.getTextureFormatGPU( textures[ i ] );\n\n\t\t\t\tif ( i === 0 ) {\n\n\t\t\t\t\ttargets.push( {\n\t\t\t\t\t\tformat: colorFormat,\n\t\t\t\t\t\tblend: blending,\n\t\t\t\t\t\twriteMask: colorWriteMask\n\t\t\t\t\t} );\n\n\t\t\t\t} else {\n\n\t\t\t\t\ttargets.push( {\n\t\t\t\t\t\tformat: colorFormat,\n\t\t\t\t\t\twriteMask: colorWriteMask\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst colorFormat = utils.getCurrentColorFormat( renderObject.context );\n\n\t\t\ttargets.push( {\n\t\t\t\tformat: colorFormat,\n\t\t\t\tblend: blending,\n\t\t\t\twriteMask: colorWriteMask\n\t\t\t} );\n\n\t\t}\n\n\t\tconst vertexModule = backend.get( vertexProgram ).module;\n\t\tconst fragmentModule = backend.get( fragmentProgram ).module;\n\n\t\tconst primitiveState = this._getPrimitiveState( object, geometry, material );\n\t\tconst depthCompare = this._getDepthCompare( material );\n\t\tconst depthStencilFormat = utils.getCurrentDepthStencilFormat( renderObject.context );\n\n\t\tconst sampleCount = this._getSampleCount( renderObject.context );\n\n\t\tconst pipelineDescriptor = {\n\t\t\tlabel: `renderPipeline_${ material.name || material.type }_${ material.id }`,\n\t\t\tvertex: Object.assign( {}, vertexModule, { buffers: vertexBuffers } ),\n\t\t\tfragment: Object.assign( {}, fragmentModule, { targets } ),\n\t\t\tprimitive: primitiveState,\n\t\t\tmultisample: {\n\t\t\t\tcount: sampleCount,\n\t\t\t\talphaToCoverageEnabled: material.alphaToCoverage && sampleCount > 1\n\t\t\t},\n\t\t\tlayout: device.createPipelineLayout( {\n\t\t\t\tbindGroupLayouts\n\t\t\t} )\n\t\t};\n\n\n\t\tconst depthStencil = {};\n\t\tconst renderDepth = renderObject.context.depth;\n\t\tconst renderStencil = renderObject.context.stencil;\n\n\t\tif ( renderDepth === true || renderStencil === true ) {\n\n\t\t\tif ( renderDepth === true ) {\n\n\t\t\t\tdepthStencil.format = depthStencilFormat;\n\t\t\t\tdepthStencil.depthWriteEnabled = material.depthWrite;\n\t\t\t\tdepthStencil.depthCompare = depthCompare;\n\n\t\t\t}\n\n\t\t\tif ( renderStencil === true ) {\n\n\t\t\t\tdepthStencil.stencilFront = stencilFront;\n\t\t\t\tdepthStencil.stencilBack = {}; // three.js does not provide an API to configure the back function (gl.stencilFuncSeparate() was never used)\n\t\t\t\tdepthStencil.stencilReadMask = material.stencilFuncMask;\n\t\t\t\tdepthStencil.stencilWriteMask = material.stencilWriteMask;\n\n\t\t\t}\n\n\t\t\tif ( material.polygonOffset === true ) {\n\n\t\t\t\tdepthStencil.depthBias = material.polygonOffsetUnits;\n\t\t\t\tdepthStencil.depthBiasSlopeScale = material.polygonOffsetFactor;\n\t\t\t\tdepthStencil.depthBiasClamp = 0; // three.js does not provide an API to configure this value\n\n\t\t\t}\n\n\t\t\tpipelineDescriptor.depthStencil = depthStencil;\n\n\t\t}\n\n\t\t// create pipeline\n\n\t\tdevice.pushErrorScope( 'validation' );\n\n\t\tif ( promises === null ) {\n\n\t\t\tpipelineData.pipeline = device.createRenderPipeline( pipelineDescriptor );\n\n\t\t\tdevice.popErrorScope().then( ( err ) => {\n\n\t\t\t\tif ( err !== null ) {\n\n\t\t\t\t\tpipelineData.error = true;\n\n\t\t\t\t\terror( err.message );\n\n\t\t\t\t}\n\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\tconst p = new Promise( async ( resolve /*, reject*/ ) => {\n\n\t\t\t\ttry {\n\n\t\t\t\t\tpipelineData.pipeline = await device.createRenderPipelineAsync( pipelineDescriptor );\n\n\t\t\t\t} catch ( err ) { }\n\n\t\t\t\tconst errorScope = await device.popErrorScope();\n\n\t\t\t\tif ( errorScope !== null ) {\n\n\t\t\t\t\tpipelineData.error = true;\n\n\t\t\t\t\terror( errorScope.message );\n\n\t\t\t\t}\n\n\t\t\t\tresolve();\n\n\t\t\t} );\n\n\t\t\tpromises.push( p );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Creates GPU render bundle encoder for the given render context.\n\t *\n\t * @param {RenderContext} renderContext - The render context.\n\t * @param {?string} [label='renderBundleEncoder'] - The label.\n\t * @return {GPURenderBundleEncoder} The GPU render bundle encoder.\n\t */\n\tcreateBundleEncoder( renderContext, label = 'renderBundleEncoder' ) {\n\n\t\tconst backend = this.backend;\n\t\tconst { utils, device } = backend;\n\n\t\tconst depthStencilFormat = utils.getCurrentDepthStencilFormat( renderContext );\n\t\tconst colorFormats = utils.getCurrentColorFormats( renderContext );\n\t\tconst sampleCount = this._getSampleCount( renderContext );\n\n\t\tconst descriptor = {\n\t\t\tlabel,\n\t\t\tcolorFormats,\n\t\t\tdepthStencilFormat,\n\t\t\tsampleCount\n\t\t};\n\n\t\treturn device.createRenderBundleEncoder( descriptor );\n\n\t}\n\n\t/**\n\t * Creates a compute pipeline for the given compute node.\n\t *\n\t * @param {ComputePipeline} pipeline - The compute pipeline.\n\t * @param {Array<BindGroup>} bindings - The bindings.\n\t */\n\tcreateComputePipeline( pipeline, bindings ) {\n\n\t\tconst backend = this.backend;\n\t\tconst device = backend.device;\n\n\t\tconst computeProgram = backend.get( pipeline.computeProgram ).module;\n\n\t\tconst pipelineGPU = backend.get( pipeline );\n\n\t\t// bind group layouts\n\n\t\tconst bindGroupLayouts = [];\n\n\t\tfor ( const bindingsGroup of bindings ) {\n\n\t\t\tconst bindingsData = backend.get( bindingsGroup );\n\t\t\tconst { layoutGPU } = bindingsData.layout;\n\n\t\t\tbindGroupLayouts.push( layoutGPU );\n\n\t\t}\n\n\t\tpipelineGPU.pipeline = device.createComputePipeline( {\n\t\t\tcompute: computeProgram,\n\t\t\tlayout: device.createPipelineLayout( {\n\t\t\t\tbindGroupLayouts\n\t\t\t} )\n\t\t} );\n\n\t}\n\n\t/**\n\t * Returns the blending state as a descriptor object required\n\t * for the pipeline creation.\n\t *\n\t * @private\n\t * @param {Material} material - The material.\n\t * @return {Object} The blending state.\n\t */\n\t_getBlending( material ) {\n\n\t\tlet color, alpha;\n\n\t\tconst blending = material.blending;\n\t\tconst blendSrc = material.blendSrc;\n\t\tconst blendDst = material.blendDst;\n\t\tconst blendEquation = material.blendEquation;\n\n\n\t\tif ( blending === CustomBlending ) {\n\n\t\t\tconst blendSrcAlpha = material.blendSrcAlpha !== null ? material.blendSrcAlpha : blendSrc;\n\t\t\tconst blendDstAlpha = material.blendDstAlpha !== null ? material.blendDstAlpha : blendDst;\n\t\t\tconst blendEquationAlpha = material.blendEquationAlpha !== null ? material.blendEquationAlpha : blendEquation;\n\n\t\t\tcolor = {\n\t\t\t\tsrcFactor: this._getBlendFactor( blendSrc ),\n\t\t\t\tdstFactor: this._getBlendFactor( blendDst ),\n\t\t\t\toperation: this._getBlendOperation( blendEquation )\n\t\t\t};\n\n\t\t\talpha = {\n\t\t\t\tsrcFactor: this._getBlendFactor( blendSrcAlpha ),\n\t\t\t\tdstFactor: this._getBlendFactor( blendDstAlpha ),\n\t\t\t\toperation: this._getBlendOperation( blendEquationAlpha )\n\t\t\t};\n\n\t\t} else {\n\n\t\t\tconst premultipliedAlpha = material.premultipliedAlpha;\n\n\t\t\tconst setBlend = ( srcRGB, dstRGB, srcAlpha, dstAlpha ) => {\n\n\t\t\t\tcolor = {\n\t\t\t\t\tsrcFactor: srcRGB,\n\t\t\t\t\tdstFactor: dstRGB,\n\t\t\t\t\toperation: GPUBlendOperation.Add\n\t\t\t\t};\n\n\t\t\t\talpha = {\n\t\t\t\t\tsrcFactor: srcAlpha,\n\t\t\t\t\tdstFactor: dstAlpha,\n\t\t\t\t\toperation: GPUBlendOperation.Add\n\t\t\t\t};\n\n\t\t\t};\n\n\t\t\tif ( premultipliedAlpha ) {\n\n\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\tsetBlend( GPUBlendFactor.One, GPUBlendFactor.OneMinusSrcAlpha, GPUBlendFactor.One, GPUBlendFactor.OneMinusSrcAlpha );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\tsetBlend( GPUBlendFactor.One, GPUBlendFactor.One, GPUBlendFactor.One, GPUBlendFactor.One );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\tsetBlend( GPUBlendFactor.Zero, GPUBlendFactor.OneMinusSrc, GPUBlendFactor.Zero, GPUBlendFactor.One );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\tsetBlend( GPUBlendFactor.Dst, GPUBlendFactor.OneMinusSrcAlpha, GPUBlendFactor.Zero, GPUBlendFactor.One );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tswitch ( blending ) {\n\n\t\t\t\t\tcase NormalBlending:\n\t\t\t\t\t\tsetBlend( GPUBlendFactor.SrcAlpha, GPUBlendFactor.OneMinusSrcAlpha, GPUBlendFactor.One, GPUBlendFactor.OneMinusSrcAlpha );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase AdditiveBlending:\n\t\t\t\t\t\tsetBlend( GPUBlendFactor.SrcAlpha, GPUBlendFactor.One, GPUBlendFactor.One, GPUBlendFactor.One );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase SubtractiveBlending:\n\t\t\t\t\t\terror( 'WebGPURenderer: SubtractiveBlending requires material.premultipliedAlpha = true' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase MultiplyBlending:\n\t\t\t\t\t\terror( 'WebGPURenderer: MultiplyBlending requires material.premultipliedAlpha = true' );\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( color !== undefined && alpha !== undefined ) {\n\n\t\t\treturn { color, alpha };\n\n\t\t} else {\n\n\t\t\terror( 'WebGPURenderer: Invalid blending: ', blending );\n\n\t\t}\n\n\t}\n\t/**\n\t * Returns the GPU blend factor which is required for the pipeline creation.\n\t *\n\t * @private\n\t * @param {number} blend - The blend factor as a three.js constant.\n\t * @return {string} The GPU blend factor.\n\t */\n\t_getBlendFactor( blend ) {\n\n\t\tlet blendFactor;\n\n\t\tswitch ( blend ) {\n\n\t\t\tcase ZeroFactor:\n\t\t\t\tblendFactor = GPUBlendFactor.Zero;\n\t\t\t\tbreak;\n\n\t\t\tcase OneFactor:\n\t\t\t\tblendFactor = GPUBlendFactor.One;\n\t\t\t\tbreak;\n\n\t\t\tcase SrcColorFactor:\n\t\t\t\tblendFactor = GPUBlendFactor.Src;\n\t\t\t\tbreak;\n\n\t\t\tcase OneMinusSrcColorFactor:\n\t\t\t\tblendFactor = GPUBlendFactor.OneMinusSrc;\n\t\t\t\tbreak;\n\n\t\t\tcase SrcAlphaFactor:\n\t\t\t\tblendFactor = GPUBlendFactor.SrcAlpha;\n\t\t\t\tbreak;\n\n\t\t\tcase OneMinusSrcAlphaFactor:\n\t\t\t\tblendFactor = GPUBlendFactor.OneMinusSrcAlpha;\n\t\t\t\tbreak;\n\n\t\t\tcase DstColorFactor:\n\t\t\t\tblendFactor = GPUBlendFactor.Dst;\n\t\t\t\tbreak;\n\n\t\t\tcase OneMinusDstColorFactor:\n\t\t\t\tblendFactor = GPUBlendFactor.OneMinusDst;\n\t\t\t\tbreak;\n\n\t\t\tcase DstAlphaFactor:\n\t\t\t\tblendFactor = GPUBlendFactor.DstAlpha;\n\t\t\t\tbreak;\n\n\t\t\tcase OneMinusDstAlphaFactor:\n\t\t\t\tblendFactor = GPUBlendFactor.OneMinusDstAlpha;\n\t\t\t\tbreak;\n\n\t\t\tcase SrcAlphaSaturateFactor:\n\t\t\t\tblendFactor = GPUBlendFactor.SrcAlphaSaturated;\n\t\t\t\tbreak;\n\n\t\t\tcase BlendColorFactor:\n\t\t\t\tblendFactor = GPUBlendFactor.Constant;\n\t\t\t\tbreak;\n\n\t\t\tcase OneMinusBlendColorFactor:\n\t\t\t\tblendFactor = GPUBlendFactor.OneMinusConstant;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\terror( 'WebGPURenderer: Blend factor not supported.', blend );\n\n\t\t}\n\n\t\treturn blendFactor;\n\n\t}\n\n\t/**\n\t * Returns the GPU stencil compare function which is required for the pipeline creation.\n\t *\n\t * @private\n\t * @param {Material} material - The material.\n\t * @return {string} The GPU stencil compare function.\n\t */\n\t_getStencilCompare( material ) {\n\n\t\tlet stencilCompare;\n\n\t\tconst stencilFunc = material.stencilFunc;\n\n\t\tswitch ( stencilFunc ) {\n\n\t\t\tcase NeverStencilFunc:\n\t\t\t\tstencilCompare = GPUCompareFunction.Never;\n\t\t\t\tbreak;\n\n\t\t\tcase AlwaysStencilFunc:\n\t\t\t\tstencilCompare = GPUCompareFunction.Always;\n\t\t\t\tbreak;\n\n\t\t\tcase LessStencilFunc:\n\t\t\t\tstencilCompare = GPUCompareFunction.Less;\n\t\t\t\tbreak;\n\n\t\t\tcase LessEqualStencilFunc:\n\t\t\t\tstencilCompare = GPUCompareFunction.LessEqual;\n\t\t\t\tbreak;\n\n\t\t\tcase EqualStencilFunc:\n\t\t\t\tstencilCompare = GPUCompareFunction.Equal;\n\t\t\t\tbreak;\n\n\t\t\tcase GreaterEqualStencilFunc:\n\t\t\t\tstencilCompare = GPUCompareFunction.GreaterEqual;\n\t\t\t\tbreak;\n\n\t\t\tcase GreaterStencilFunc:\n\t\t\t\tstencilCompare = GPUCompareFunction.Greater;\n\t\t\t\tbreak;\n\n\t\t\tcase NotEqualStencilFunc:\n\t\t\t\tstencilCompare = GPUCompareFunction.NotEqual;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\terror( 'WebGPURenderer: Invalid stencil function.', stencilFunc );\n\n\t\t}\n\n\t\treturn stencilCompare;\n\n\t}\n\n\t/**\n\t * Returns the GPU stencil operation which is required for the pipeline creation.\n\t *\n\t * @private\n\t * @param {number} op - A three.js constant defining the stencil operation.\n\t * @return {string} The GPU stencil operation.\n\t */\n\t_getStencilOperation( op ) {\n\n\t\tlet stencilOperation;\n\n\t\tswitch ( op ) {\n\n\t\t\tcase KeepStencilOp:\n\t\t\t\tstencilOperation = GPUStencilOperation.Keep;\n\t\t\t\tbreak;\n\n\t\t\tcase ZeroStencilOp:\n\t\t\t\tstencilOperation = GPUStencilOperation.Zero;\n\t\t\t\tbreak;\n\n\t\t\tcase ReplaceStencilOp:\n\t\t\t\tstencilOperation = GPUStencilOperation.Replace;\n\t\t\t\tbreak;\n\n\t\t\tcase InvertStencilOp:\n\t\t\t\tstencilOperation = GPUStencilOperation.Invert;\n\t\t\t\tbreak;\n\n\t\t\tcase IncrementStencilOp:\n\t\t\t\tstencilOperation = GPUStencilOperation.IncrementClamp;\n\t\t\t\tbreak;\n\n\t\t\tcase DecrementStencilOp:\n\t\t\t\tstencilOperation = GPUStencilOperation.DecrementClamp;\n\t\t\t\tbreak;\n\n\t\t\tcase IncrementWrapStencilOp:\n\t\t\t\tstencilOperation = GPUStencilOperation.IncrementWrap;\n\t\t\t\tbreak;\n\n\t\t\tcase DecrementWrapStencilOp:\n\t\t\t\tstencilOperation = GPUStencilOperation.DecrementWrap;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\terror( 'WebGPURenderer: Invalid stencil operation.', stencilOperation );\n\n\t\t}\n\n\t\treturn stencilOperation;\n\n\t}\n\n\t/**\n\t * Returns the GPU blend operation which is required for the pipeline creation.\n\t *\n\t * @private\n\t * @param {number} blendEquation - A three.js constant defining the blend equation.\n\t * @return {string} The GPU blend operation.\n\t */\n\t_getBlendOperation( blendEquation ) {\n\n\t\tlet blendOperation;\n\n\t\tswitch ( blendEquation ) {\n\n\t\t\tcase AddEquation:\n\t\t\t\tblendOperation = GPUBlendOperation.Add;\n\t\t\t\tbreak;\n\n\t\t\tcase SubtractEquation:\n\t\t\t\tblendOperation = GPUBlendOperation.Subtract;\n\t\t\t\tbreak;\n\n\t\t\tcase ReverseSubtractEquation:\n\t\t\t\tblendOperation = GPUBlendOperation.ReverseSubtract;\n\t\t\t\tbreak;\n\n\t\t\tcase MinEquation:\n\t\t\t\tblendOperation = GPUBlendOperation.Min;\n\t\t\t\tbreak;\n\n\t\t\tcase MaxEquation:\n\t\t\t\tblendOperation = GPUBlendOperation.Max;\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\terror( 'WebGPUPipelineUtils: Blend equation not supported.', blendEquation );\n\n\t\t}\n\n\t\treturn blendOperation;\n\n\t}\n\n\t/**\n\t * Returns the primitive state as a descriptor object required\n\t * for the pipeline creation.\n\t *\n\t * @private\n\t * @param {Object3D} object - The 3D object.\n\t * @param {BufferGeometry} geometry - The geometry.\n\t * @param {Material} material - The material.\n\t * @return {Object} The primitive state.\n\t */\n\t_getPrimitiveState( object, geometry, material ) {\n\n\t\tconst descriptor = {};\n\t\tconst utils = this.backend.utils;\n\n\t\t//\n\n\t\tdescriptor.topology = utils.getPrimitiveTopology( object, material );\n\n\t\tif ( geometry.index !== null && object.isLine === true && object.isLineSegments !== true ) {\n\n\t\t\tdescriptor.stripIndexFormat = ( geometry.index.array instanceof Uint16Array ) ? GPUIndexFormat.Uint16 : GPUIndexFormat.Uint32;\n\n\t\t}\n\n\t\t//\n\n\t\tlet flipSided = ( material.side === BackSide );\n\n\t\tif ( object.isMesh && object.matrixWorld.determinant() < 0 ) flipSided = ! flipSided;\n\n\t\tdescriptor.frontFace = ( flipSided === true ) ? GPUFrontFace.CW : GPUFrontFace.CCW;\n\n\t\t//\n\n\t\tdescriptor.cullMode = ( material.side === DoubleSide ) ? GPUCullMode.None : GPUCullMode.Back;\n\n\t\treturn descriptor;\n\n\t}\n\n\t/**\n\t * Returns the GPU color write mask which is required for the pipeline creation.\n\t *\n\t * @private\n\t * @param {Material} material - The material.\n\t * @return {number} The GPU color write mask.\n\t */\n\t_getColorWriteMask( material ) {\n\n\t\treturn ( material.colorWrite === true ) ? GPUColorWriteFlags.All : GPUColorWriteFlags.None;\n\n\t}\n\n\t/**\n\t * Returns the GPU depth compare function which is required for the pipeline creation.\n\t *\n\t * @private\n\t * @param {Material} material - The material.\n\t * @return {string} The GPU depth compare function.\n\t */\n\t_getDepthCompare( material ) {\n\n\t\tlet depthCompare;\n\n\t\tif ( material.depthTest === false ) {\n\n\t\t\tdepthCompare = GPUCompareFunction.Always;\n\n\t\t} else {\n\n\t\t\tconst depthFunc = material.depthFunc;\n\n\t\t\tswitch ( depthFunc ) {\n\n\t\t\t\tcase NeverDepth:\n\t\t\t\t\tdepthCompare = GPUCompareFunction.Never;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase AlwaysDepth:\n\t\t\t\t\tdepthCompare = GPUCompareFunction.Always;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase LessDepth:\n\t\t\t\t\tdepthCompare = GPUCompareFunction.Less;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase LessEqualDepth:\n\t\t\t\t\tdepthCompare = GPUCompareFunction.LessEqual;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase EqualDepth:\n\t\t\t\t\tdepthCompare = GPUCompareFunction.Equal;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GreaterEqualDepth:\n\t\t\t\t\tdepthCompare = GPUCompareFunction.GreaterEqual;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase GreaterDepth:\n\t\t\t\t\tdepthCompare = GPUCompareFunction.Greater;\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase NotEqualDepth:\n\t\t\t\t\tdepthCompare = GPUCompareFunction.NotEqual;\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\terror( 'WebGPUPipelineUtils: Invalid depth function.', depthFunc );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn depthCompare;\n\n\t}\n\n}\n\n/**\n * Manages a pool of WebGPU timestamp queries for performance measurement.\n * Extends the base TimestampQueryPool to provide WebGPU-specific implementation.\n *\n * @augments TimestampQueryPool\n */\nclass WebGPUTimestampQueryPool extends TimestampQueryPool {\n\n\t/**\n\t * Creates a new WebGPU timestamp query pool.\n\t *\n\t * @param {GPUDevice} device - The WebGPU device to create queries on.\n\t * @param {string} type - The type identifier for this query pool.\n\t * @param {number} [maxQueries=2048] - Maximum number of queries this pool can hold.\n\t */\n\tconstructor( device, type, maxQueries = 2048 ) {\n\n\t\tsuper( maxQueries );\n\t\tthis.device = device;\n\t\tthis.type = type;\n\n\t\tthis.querySet = this.device.createQuerySet( {\n\t\t\ttype: 'timestamp',\n\t\t\tcount: this.maxQueries,\n\t\t\tlabel: `queryset_global_timestamp_${type}`\n\t\t} );\n\n\t\tconst bufferSize = this.maxQueries * 8;\n\t\tthis.resolveBuffer = this.device.createBuffer( {\n\t\t\tlabel: `buffer_timestamp_resolve_${type}`,\n\t\t\tsize: bufferSize,\n\t\t\tusage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.COPY_SRC\n\t\t} );\n\n\t\tthis.resultBuffer = this.device.createBuffer( {\n\t\t\tlabel: `buffer_timestamp_result_${type}`,\n\t\t\tsize: bufferSize,\n\t\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ\n\t\t} );\n\n\t}\n\n\t/**\n\t * Allocates a pair of queries for a given render context.\n\t *\n\t * @param {string} uid - A unique identifier for the render context.\n\t * @returns {?number} The base offset for the allocated queries, or null if allocation failed.\n\t */\n\tallocateQueriesForContext( uid ) {\n\n\t\tif ( ! this.trackTimestamp || this.isDisposed ) return null;\n\n\t\tif ( this.currentQueryIndex + 2 > this.maxQueries ) {\n\n\t\t\twarnOnce( `WebGPUTimestampQueryPool [${ this.type }]: Maximum number of queries exceeded, when using trackTimestamp it is necessary to resolves the queries via renderer.resolveTimestampsAsync( THREE.TimestampQuery.${ this.type.toUpperCase() } ).` );\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst baseOffset = this.currentQueryIndex;\n\t\tthis.currentQueryIndex += 2;\n\n\t\tthis.queryOffsets.set( uid, baseOffset );\n\n\t\treturn baseOffset;\n\n\t}\n\n\t/**\n\t * Asynchronously resolves all pending queries and returns the total duration.\n\t * If there's already a pending resolve operation, returns that promise instead.\n\t *\n\t * @async\n\t * @returns {Promise<number>} The total duration in milliseconds, or the last valid value if resolution fails.\n\t */\n\tasync resolveQueriesAsync() {\n\n\t\tif ( ! this.trackTimestamp || this.currentQueryIndex === 0 || this.isDisposed ) {\n\n\t\t\treturn this.lastValue;\n\n\t\t}\n\n\t\tif ( this.pendingResolve ) {\n\n\t\t\treturn this.pendingResolve;\n\n\t\t}\n\n\t\tthis.pendingResolve = this._resolveQueries();\n\n\t\ttry {\n\n\t\t\tconst result = await this.pendingResolve;\n\t\t\treturn result;\n\n\t\t} finally {\n\n\t\t\tthis.pendingResolve = null;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Internal method to resolve queries and calculate total duration.\n\t *\n\t * @async\n\t * @private\n\t * @returns {Promise<number>} The total duration in milliseconds.\n\t */\n\tasync _resolveQueries() {\n\n\t\tif ( this.isDisposed ) {\n\n\t\t\treturn this.lastValue;\n\n\t\t}\n\n\t\ttry {\n\n\t\t\tif ( this.resultBuffer.mapState !== 'unmapped' ) {\n\n\t\t\t\treturn this.lastValue;\n\n\t\t\t}\n\n\t\t\tconst currentOffsets = new Map( this.queryOffsets );\n\t\t\tconst queryCount = this.currentQueryIndex;\n\t\t\tconst bytesUsed = queryCount * 8;\n\n\t\t\t// Reset state before GPU work\n\t\t\tthis.currentQueryIndex = 0;\n\t\t\tthis.queryOffsets.clear();\n\n\t\t\tconst commandEncoder = this.device.createCommandEncoder();\n\n\t\t\tcommandEncoder.resolveQuerySet(\n\t\t\t\tthis.querySet,\n\t\t\t\t0,\n\t\t\t\tqueryCount,\n\t\t\t\tthis.resolveBuffer,\n\t\t\t\t0\n\t\t\t);\n\n\t\t\tcommandEncoder.copyBufferToBuffer(\n\t\t\t\tthis.resolveBuffer,\n\t\t\t\t0,\n\t\t\t\tthis.resultBuffer,\n\t\t\t\t0,\n\t\t\t\tbytesUsed\n\t\t\t);\n\n\t\t\tconst commandBuffer = commandEncoder.finish();\n\t\t\tthis.device.queue.submit( [ commandBuffer ] );\n\n\t\t\tif ( this.resultBuffer.mapState !== 'unmapped' ) {\n\n\t\t\t\treturn this.lastValue;\n\n\t\t\t}\n\n\t\t\t// Create and track the mapping operation\n\t\t\tawait this.resultBuffer.mapAsync( GPUMapMode.READ, 0, bytesUsed );\n\n\t\t\tif ( this.isDisposed ) {\n\n\t\t\t\tif ( this.resultBuffer.mapState === 'mapped' ) {\n\n\t\t\t\t\tthis.resultBuffer.unmap();\n\n\t\t\t\t}\n\n\t\t\t\treturn this.lastValue;\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tconst times = new BigUint64Array( this.resultBuffer.getMappedRange( 0, bytesUsed ) );\n\t\t\tconst framesDuration = {};\n\n\t\t\tconst frames = [];\n\n\t\t\tfor ( const [ uid, baseOffset ] of currentOffsets ) {\n\n\t\t\t\tconst match = uid.match( /^(.*):f(\\d+)$/ );\n\t\t\t\tconst frame = parseInt( match[ 2 ] );\n\n\t\t\t\tif ( frames.includes( frame ) === false ) {\n\n\t\t\t\t\tframes.push( frame );\n\n\t\t\t\t}\n\n\t\t\t\tif ( framesDuration[ frame ] === undefined ) framesDuration[ frame ] = 0;\n\n\t\t\t\tconst startTime = times[ baseOffset ];\n\t\t\t\tconst endTime = times[ baseOffset + 1 ];\n\t\t\t\tconst duration = Number( endTime - startTime ) / 1e6;\n\n\t\t\t\tthis.timestamps.set( uid, duration );\n\n\t\t\t\tframesDuration[ frame ] += duration;\n\n\t\t\t}\n\n\t\t\t// Return the total duration of the last frame\n\t\t\tconst totalDuration = framesDuration[ frames[ frames.length - 1 ] ];\n\n\t\t\tthis.resultBuffer.unmap();\n\t\t\tthis.lastValue = totalDuration;\n\t\t\tthis.frames = frames;\n\n\t\t\treturn totalDuration;\n\n\t\t} catch ( e ) {\n\n\t\t\terror( 'Error resolving queries:', e );\n\t\t\tif ( this.resultBuffer.mapState === 'mapped' ) {\n\n\t\t\t\tthis.resultBuffer.unmap();\n\n\t\t\t}\n\n\t\t\treturn this.lastValue;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Dispose of the query pool.\n\t *\n\t * @async\n\t * @returns {Promise} A Promise that resolves when the dispose has been executed.\n\t */\n\tasync dispose() {\n\n\t\tif ( this.isDisposed ) {\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tthis.isDisposed = true;\n\n\t\t// Wait for pending resolve operation\n\t\tif ( this.pendingResolve ) {\n\n\t\t\ttry {\n\n\t\t\t\tawait this.pendingResolve;\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\terror( 'Error waiting for pending resolve:', e );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Ensure buffer is unmapped before destroying\n\t\tif ( this.resultBuffer && this.resultBuffer.mapState === 'mapped' ) {\n\n\t\t\ttry {\n\n\t\t\t\tthis.resultBuffer.unmap();\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\terror( 'Error unmapping buffer:', e );\n\n\t\t\t}\n\n\t\t}\n\n\t\t// Destroy resources\n\t\tif ( this.querySet ) {\n\n\t\t\tthis.querySet.destroy();\n\t\t\tthis.querySet = null;\n\n\t\t}\n\n\t\tif ( this.resolveBuffer ) {\n\n\t\t\tthis.resolveBuffer.destroy();\n\t\t\tthis.resolveBuffer = null;\n\n\t\t}\n\n\t\tif ( this.resultBuffer ) {\n\n\t\t\tthis.resultBuffer.destroy();\n\t\t\tthis.resultBuffer = null;\n\n\t\t}\n\n\t\tthis.queryOffsets.clear();\n\t\tthis.pendingResolve = null;\n\n\t}\n\n}\n\n/*// debugger tools\nimport 'https://greggman.github.io/webgpu-avoid-redundant-state-setting/webgpu-check-redundant-state-setting.js';\n//*/\n\n\n/**\n * A backend implementation targeting WebGPU.\n *\n * @private\n * @augments Backend\n */\nclass WebGPUBackend extends Backend {\n\n\t/**\n\t * WebGPUBackend options.\n\t *\n\t * @typedef {Object} WebGPUBackend~Options\n\t * @property {boolean} [logarithmicDepthBuffer=false] - Whether logarithmic depth buffer is enabled or not.\n\t * @property {boolean} [alpha=true] - Whether the default framebuffer (which represents the final contents of the canvas) should be transparent or opaque.\n\t * @property {boolean} [compatibilityMode=false] - Whether the backend should be in compatibility mode or not.\n\t * @property {boolean} [depth=true] - Whether the default framebuffer should have a depth buffer or not.\n\t * @property {boolean} [stencil=false] - Whether the default framebuffer should have a stencil buffer or not.\n\t * @property {boolean} [antialias=false] - Whether MSAA as the default anti-aliasing should be enabled or not.\n\t * @property {number} [samples=0] - When `antialias` is `true`, `4` samples are used by default. Set this parameter to any other integer value than 0 to overwrite the default.\n\t * @property {boolean} [forceWebGL=false] - If set to `true`, the renderer uses a WebGL 2 backend no matter if WebGPU is supported or not.\n\t * @property {boolean} [trackTimestamp=false] - Whether to track timestamps with a Timestamp Query API or not.\n\t * @property {string} [powerPreference=undefined] - The power preference.\n\t * @property {Object} [requiredLimits=undefined] - Specifies the limits that are required by the device request. The request will fail if the adapter cannot provide these limits.\n\t * @property {GPUDevice} [device=undefined] - If there is an existing GPU device on app level, it can be passed to the renderer as a parameter.\n\t * @property {number} [outputType=undefined] - Texture type for output to canvas. By default, device's preferred format is used; other formats may incur overhead.\n\t */\n\n\t/**\n\t * Constructs a new WebGPU backend.\n\t *\n\t * @param {WebGPUBackend~Options} [parameters] - The configuration parameter.\n\t */\n\tconstructor( parameters = {} ) {\n\n\t\tsuper( parameters );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGPUBackend = true;\n\n\t\t// some parameters require default values other than \"undefined\"\n\t\tthis.parameters.alpha = ( parameters.alpha === undefined ) ? true : parameters.alpha;\n\t\tthis.parameters.compatibilityMode = ( parameters.compatibilityMode === undefined ) ? false : parameters.compatibilityMode;\n\n\t\tthis.parameters.requiredLimits = ( parameters.requiredLimits === undefined ) ? {} : parameters.requiredLimits;\n\n\t\t/**\n\t\t * Indicates whether the backend is in compatibility mode or not.\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.compatibilityMode = this.parameters.compatibilityMode;\n\n\t\t/**\n\t\t * A reference to the device.\n\t\t *\n\t\t * @type {?GPUDevice}\n\t\t * @default null\n\t\t */\n\t\tthis.device = null;\n\n\t\t/**\n\t\t * A reference to the default render pass descriptor.\n\t\t *\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis.defaultRenderPassdescriptor = null;\n\n\t\t/**\n\t\t * A reference to a backend module holding common utility functions.\n\t\t *\n\t\t * @type {WebGPUUtils}\n\t\t */\n\t\tthis.utils = new WebGPUUtils( this );\n\n\t\t/**\n\t\t * A reference to a backend module holding shader attribute-related\n\t\t * utility functions.\n\t\t *\n\t\t * @type {WebGPUAttributeUtils}\n\t\t */\n\t\tthis.attributeUtils = new WebGPUAttributeUtils( this );\n\n\t\t/**\n\t\t * A reference to a backend module holding shader binding-related\n\t\t * utility functions.\n\t\t *\n\t\t * @type {WebGPUBindingUtils}\n\t\t */\n\t\tthis.bindingUtils = new WebGPUBindingUtils( this );\n\n\t\t/**\n\t\t * A reference to a backend module holding shader pipeline-related\n\t\t * utility functions.\n\t\t *\n\t\t * @type {WebGPUPipelineUtils}\n\t\t */\n\t\tthis.pipelineUtils = new WebGPUPipelineUtils( this );\n\n\t\t/**\n\t\t * A reference to a backend module holding shader texture-related\n\t\t * utility functions.\n\t\t *\n\t\t * @type {WebGPUTextureUtils}\n\t\t */\n\t\tthis.textureUtils = new WebGPUTextureUtils( this );\n\n\t\t/**\n\t\t * A map that manages the resolve buffers for occlusion queries.\n\t\t *\n\t\t * @type {Map<number,GPUBuffer>}\n\t\t */\n\t\tthis.occludedResolveCache = new Map();\n\n\t}\n\n\t/**\n\t * Initializes the backend so it is ready for usage.\n\t *\n\t * @async\n\t * @param {Renderer} renderer - The renderer.\n\t * @return {Promise} A Promise that resolves when the backend has been initialized.\n\t */\n\tasync init( renderer ) {\n\n\t\tawait super.init( renderer );\n\n\t\t//\n\n\t\tconst parameters = this.parameters;\n\n\t\t// create the device if it is not passed with parameters\n\n\t\tlet device;\n\n\t\tif ( parameters.device === undefined ) {\n\n\t\t\tconst adapterOptions = {\n\t\t\t\tpowerPreference: parameters.powerPreference,\n\t\t\t\tfeatureLevel: parameters.compatibilityMode ? 'compatibility' : undefined\n\t\t\t};\n\n\t\t\tconst adapter = ( typeof navigator !== 'undefined' ) ? await navigator.gpu.requestAdapter( adapterOptions ) : null;\n\n\t\t\tif ( adapter === null ) {\n\n\t\t\t\tthrow new Error( 'WebGPUBackend: Unable to create WebGPU adapter.' );\n\n\t\t\t}\n\n\t\t\t// feature support\n\n\t\t\tconst features = Object.values( GPUFeatureName );\n\n\t\t\tconst supportedFeatures = [];\n\n\t\t\tfor ( const name of features ) {\n\n\t\t\t\tif ( adapter.features.has( name ) ) {\n\n\t\t\t\t\tsupportedFeatures.push( name );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tconst deviceDescriptor = {\n\t\t\t\trequiredFeatures: supportedFeatures,\n\t\t\t\trequiredLimits: parameters.requiredLimits\n\t\t\t};\n\n\t\t\tdevice = await adapter.requestDevice( deviceDescriptor );\n\n\t\t} else {\n\n\t\t\tdevice = parameters.device;\n\n\t\t}\n\n\t\tdevice.lost.then( ( info ) => {\n\n\t\t\tif ( info.reason === 'destroyed' ) return;\n\n\t\t\tconst deviceLossInfo = {\n\t\t\t\tapi: 'WebGPU',\n\t\t\t\tmessage: info.message || 'Unknown reason',\n\t\t\t\treason: info.reason || null,\n\t\t\t\toriginalEvent: info\n\t\t\t};\n\n\t\t\trenderer.onDeviceLost( deviceLossInfo );\n\n\t\t} );\n\n\t\tthis.device = device;\n\n\t\tthis.trackTimestamp = this.trackTimestamp && this.hasFeature( GPUFeatureName.TimestampQuery );\n\n\t\tthis.updateSize();\n\n\t}\n\n\t/**\n\t * A reference to the context.\n\t *\n\t * @type {?GPUCanvasContext}\n\t * @default null\n\t */\n\tget context() {\n\n\t\tconst canvasTarget = this.renderer.getCanvasTarget();\n\t\tconst canvasData = this.get( canvasTarget );\n\n\t\tlet context = canvasData.context;\n\n\t\tif ( context === undefined ) {\n\n\t\t\tconst parameters = this.parameters;\n\n\t\t\tif ( canvasTarget.isDefaultCanvasTarget === true && parameters.context !== undefined ) {\n\n\t\t\t\tcontext = parameters.context;\n\n\t\t\t} else {\n\n\t\t\t\tcontext = canvasTarget.domElement.getContext( 'webgpu' );\n\n\t\t\t}\n\n\t\t\t// OffscreenCanvas does not have setAttribute, see #22811\n\t\t\tif ( 'setAttribute' in canvasTarget.domElement ) canvasTarget.domElement.setAttribute( 'data-engine', `three.js r${ REVISION } webgpu` );\n\n\t\t\tconst alphaMode = parameters.alpha ? 'premultiplied' : 'opaque';\n\n\t\t\tconst toneMappingMode = parameters.outputType === HalfFloatType ? 'extended' : 'standard';\n\n\t\t\tcontext.configure( {\n\t\t\t\tdevice: this.device,\n\t\t\t\tformat: this.utils.getPreferredCanvasFormat(),\n\t\t\t\tusage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_SRC,\n\t\t\t\talphaMode: alphaMode,\n\t\t\t\ttoneMapping: {\n\t\t\t\t\tmode: toneMappingMode\n\t\t\t\t}\n\t\t\t} );\n\n\t\t\tcanvasData.context = context;\n\n\t\t}\n\n\t\treturn context;\n\n\t}\n\n\t/**\n\t * The coordinate system of the backend.\n\t *\n\t * @type {number}\n\t * @readonly\n\t */\n\tget coordinateSystem() {\n\n\t\treturn WebGPUCoordinateSystem;\n\n\t}\n\n\t/**\n\t * This method performs a readback operation by moving buffer data from\n\t * a storage buffer attribute from the GPU to the CPU.\n\t *\n\t * @async\n\t * @param {StorageBufferAttribute} attribute - The storage buffer attribute.\n\t * @return {Promise<ArrayBuffer>} A promise that resolves with the buffer data when the data are ready.\n\t */\n\tasync getArrayBufferAsync( attribute ) {\n\n\t\treturn await this.attributeUtils.getArrayBufferAsync( attribute );\n\n\t}\n\n\t/**\n\t * Returns the backend's rendering context.\n\t *\n\t * @return {GPUCanvasContext} The rendering context.\n\t */\n\tgetContext() {\n\n\t\treturn this.context;\n\n\t}\n\n\t/**\n\t * Returns the default render pass descriptor.\n\t *\n\t * In WebGPU, the default framebuffer must be configured\n\t * like custom framebuffers so the backend needs a render\n\t * pass descriptor even when rendering directly to screen.\n\t *\n\t * @private\n\t * @return {Object} The render pass descriptor.\n\t */\n\t_getDefaultRenderPassDescriptor() {\n\n\t\tconst renderer = this.renderer;\n\t\tconst canvasTarget = renderer.getCanvasTarget();\n\t\tconst canvasData = this.get( canvasTarget );\n\t\tconst samples = renderer.currentSamples;\n\n\t\tlet descriptor = canvasData.descriptor;\n\n\t\tif ( descriptor === undefined || canvasData.samples !== samples ) {\n\n\t\t\tdescriptor = {\n\t\t\t\tcolorAttachments: [ {\n\t\t\t\t\tview: null\n\t\t\t\t} ]\n\t\t\t};\n\n\t\t\tif ( renderer.depth === true || renderer.stencil === true ) {\n\n\t\t\t\tdescriptor.depthStencilAttachment = {\n\t\t\t\t\tview: this.textureUtils.getDepthBuffer( renderer.depth, renderer.stencil ).createView()\n\t\t\t\t};\n\n\t\t\t}\n\n\t\t\tconst colorAttachment = descriptor.colorAttachments[ 0 ];\n\n\t\t\tif ( samples > 0 ) {\n\n\t\t\t\tcolorAttachment.view = this.textureUtils.getColorBuffer().createView();\n\n\t\t\t} else {\n\n\t\t\t\tcolorAttachment.resolveTarget = undefined;\n\n\t\t\t}\n\n\t\t\tcanvasData.descriptor = descriptor;\n\t\t\tcanvasData.samples = samples;\n\n\t\t}\n\n\t\tconst colorAttachment = descriptor.colorAttachments[ 0 ];\n\n\t\tif ( samples > 0 ) {\n\n\t\t\tcolorAttachment.resolveTarget = this.context.getCurrentTexture().createView();\n\n\t\t} else {\n\n\t\t\tcolorAttachment.view = this.context.getCurrentTexture().createView();\n\n\t\t}\n\n\t\treturn descriptor;\n\n\t}\n\n\t/**\n\t * Internal to determine if the current render target is a render target array with depth 2D array texture.\n\t *\n\t * @param {RenderContext} renderContext - The render context.\n\t * @return {boolean} Whether the render target is a render target array with depth 2D array texture.\n\t *\n\t * @private\n\t */\n\t_isRenderCameraDepthArray( renderContext ) {\n\n\t\treturn renderContext.depthTexture && renderContext.depthTexture.image.depth > 1 && renderContext.camera.isArrayCamera;\n\n\t}\n\n\t/**\n\t * Returns the render pass descriptor for the given render context.\n\t *\n\t * @private\n\t * @param {RenderContext} renderContext - The render context.\n\t * @param {Object} colorAttachmentsConfig - Configuration object for the color attachments.\n\t * @return {Object} The render pass descriptor.\n\t */\n\t_getRenderPassDescriptor( renderContext, colorAttachmentsConfig = {} ) {\n\n\t\tconst renderTarget = renderContext.renderTarget;\n\t\tconst renderTargetData = this.get( renderTarget );\n\n\t\tlet descriptors = renderTargetData.descriptors;\n\n\t\tif ( descriptors === undefined ||\n\t\t\trenderTargetData.width !== renderTarget.width ||\n\t\t\trenderTargetData.height !== renderTarget.height ||\n\t\t\trenderTargetData.samples !== renderTarget.samples\n\t\t) {\n\n\t\t\tdescriptors = {};\n\n\t\t\trenderTargetData.descriptors = descriptors;\n\n\t\t}\n\n\t\tconst cacheKey = renderContext.getCacheKey();\n\t\tlet descriptorBase = descriptors[ cacheKey ];\n\n\t\tif ( descriptorBase === undefined ) {\n\n\t\t\tconst textures = renderContext.textures;\n\t\t\tconst textureViews = [];\n\n\t\t\tlet sliceIndex;\n\n\t\t\tconst isRenderCameraDepthArray = this._isRenderCameraDepthArray( renderContext );\n\n\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\tconst textureData = this.get( textures[ i ] );\n\n\t\t\t\tconst viewDescriptor = {\n\t\t\t\t\tlabel: `colorAttachment_${ i }`,\n\t\t\t\t\tbaseMipLevel: renderContext.activeMipmapLevel,\n\t\t\t\t\tmipLevelCount: 1,\n\t\t\t\t\tbaseArrayLayer: renderContext.activeCubeFace,\n\t\t\t\t\tarrayLayerCount: 1,\n\t\t\t\t\tdimension: GPUTextureViewDimension.TwoD\n\t\t\t\t};\n\n\t\t\t\tif ( renderTarget.isRenderTarget3D ) {\n\n\t\t\t\t\tsliceIndex = renderContext.activeCubeFace;\n\n\t\t\t\t\tviewDescriptor.baseArrayLayer = 0;\n\t\t\t\t\tviewDescriptor.dimension = GPUTextureViewDimension.ThreeD;\n\t\t\t\t\tviewDescriptor.depthOrArrayLayers = textures[ i ].image.depth;\n\n\t\t\t\t} else if ( renderTarget.isRenderTarget && textures[ i ].image.depth > 1 ) {\n\n\t\t\t\t\tif ( isRenderCameraDepthArray === true ) {\n\n\t\t\t\t\t\tconst cameras = renderContext.camera.cameras;\n\t\t\t\t\t\tfor ( let layer = 0; layer < cameras.length; layer ++ ) {\n\n\t\t\t\t\t\t\tconst layerViewDescriptor = {\n\t\t\t\t\t\t\t\t...viewDescriptor,\n\t\t\t\t\t\t\t\tbaseArrayLayer: layer,\n\t\t\t\t\t\t\t\tarrayLayerCount: 1,\n\t\t\t\t\t\t\t\tdimension: GPUTextureViewDimension.TwoD\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tconst textureView = textureData.texture.createView( layerViewDescriptor );\n\t\t\t\t\t\t\ttextureViews.push( {\n\t\t\t\t\t\t\t\tview: textureView,\n\t\t\t\t\t\t\t\tresolveTarget: undefined,\n\t\t\t\t\t\t\t\tdepthSlice: undefined\n\t\t\t\t\t\t\t} );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tviewDescriptor.dimension = GPUTextureViewDimension.TwoDArray;\n\t\t\t\t\t\tviewDescriptor.depthOrArrayLayers = textures[ i ].image.depth;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( isRenderCameraDepthArray !== true ) {\n\n\t\t\t\t\tconst textureView = textureData.texture.createView( viewDescriptor );\n\n\t\t\t\t\tlet view, resolveTarget;\n\n\t\t\t\t\tif ( textureData.msaaTexture !== undefined ) {\n\n\t\t\t\t\t\tview = textureData.msaaTexture.createView();\n\t\t\t\t\t\tresolveTarget = textureView;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tview = textureView;\n\t\t\t\t\t\tresolveTarget = undefined;\n\n\t\t\t\t\t}\n\n\t\t\t\t\ttextureViews.push( {\n\t\t\t\t\t\tview,\n\t\t\t\t\t\tresolveTarget,\n\t\t\t\t\t\tdepthSlice: sliceIndex\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tdescriptorBase = { textureViews };\n\n\t\t\tif ( renderContext.depth ) {\n\n\t\t\t\tconst depthTextureData = this.get( renderContext.depthTexture );\n\t\t\t\tconst options = {};\n\t\t\t\tif ( renderContext.depthTexture.isArrayTexture || renderContext.depthTexture.isCubeTexture ) {\n\n\t\t\t\t\toptions.dimension = GPUTextureViewDimension.TwoD;\n\t\t\t\t\toptions.arrayLayerCount = 1;\n\t\t\t\t\toptions.baseArrayLayer = renderContext.activeCubeFace;\n\n\t\t\t\t}\n\n\t\t\t\tdescriptorBase.depthStencilView = depthTextureData.texture.createView( options );\n\n\t\t\t}\n\n\t\t\tdescriptors[ cacheKey ] = descriptorBase;\n\n\t\t\trenderTargetData.width = renderTarget.width;\n\t\t\trenderTargetData.height = renderTarget.height;\n\t\t\trenderTargetData.samples = renderTarget.samples;\n\t\t\trenderTargetData.activeMipmapLevel = renderContext.activeMipmapLevel;\n\t\t\trenderTargetData.activeCubeFace = renderContext.activeCubeFace;\n\n\t\t}\n\n\t\tconst descriptor = {\n\t\t\tcolorAttachments: []\n\t\t};\n\n\t\t// Apply dynamic properties to cached views\n\t\tfor ( let i = 0; i < descriptorBase.textureViews.length; i ++ ) {\n\n\t\t\tconst viewInfo = descriptorBase.textureViews[ i ];\n\n\t\t\tlet clearValue = { r: 0, g: 0, b: 0, a: 1 };\n\t\t\tif ( i === 0 && colorAttachmentsConfig.clearValue ) {\n\n\t\t\t\tclearValue = colorAttachmentsConfig.clearValue;\n\n\t\t\t}\n\n\t\t\tdescriptor.colorAttachments.push( {\n\t\t\t\tview: viewInfo.view,\n\t\t\t\tdepthSlice: viewInfo.depthSlice,\n\t\t\t\tresolveTarget: viewInfo.resolveTarget,\n\t\t\t\tloadOp: colorAttachmentsConfig.loadOp || GPULoadOp.Load,\n\t\t\t\tstoreOp: colorAttachmentsConfig.storeOp || GPUStoreOp.Store,\n\t\t\t\tclearValue: clearValue\n\t\t\t} );\n\n\t\t}\n\n\t\tif ( descriptorBase.depthStencilView ) {\n\n\t\t\tdescriptor.depthStencilAttachment = {\n\t\t\t\tview: descriptorBase.depthStencilView\n\t\t\t};\n\n\t\t}\n\n\t\treturn descriptor;\n\n\t}\n\n\t/**\n\t * This method is executed at the beginning of a render call and prepares\n\t * the WebGPU state for upcoming render calls\n\t *\n\t * @param {RenderContext} renderContext - The render context.\n\t */\n\tbeginRender( renderContext ) {\n\n\t\tconst renderContextData = this.get( renderContext );\n\n\t\t//\n\n\t\tconst device = this.device;\n\t\tconst occlusionQueryCount = renderContext.occlusionQueryCount;\n\n\t\tlet occlusionQuerySet;\n\n\t\tif ( occlusionQueryCount > 0 ) {\n\n\t\t\tif ( renderContextData.currentOcclusionQuerySet ) renderContextData.currentOcclusionQuerySet.destroy();\n\t\t\tif ( renderContextData.currentOcclusionQueryBuffer ) renderContextData.currentOcclusionQueryBuffer.destroy();\n\n\t\t\t// Get a reference to the array of objects with queries. The renderContextData property\n\t\t\t// can be changed by another render pass before the buffer.mapAsyc() completes.\n\t\t\trenderContextData.currentOcclusionQuerySet = renderContextData.occlusionQuerySet;\n\t\t\trenderContextData.currentOcclusionQueryBuffer = renderContextData.occlusionQueryBuffer;\n\t\t\trenderContextData.currentOcclusionQueryObjects = renderContextData.occlusionQueryObjects;\n\n\t\t\t//\n\n\t\t\tocclusionQuerySet = device.createQuerySet( { type: 'occlusion', count: occlusionQueryCount, label: `occlusionQuerySet_${ renderContext.id }` } );\n\n\t\t\trenderContextData.occlusionQuerySet = occlusionQuerySet;\n\t\t\trenderContextData.occlusionQueryIndex = 0;\n\t\t\trenderContextData.occlusionQueryObjects = new Array( occlusionQueryCount );\n\n\t\t\trenderContextData.lastOcclusionObject = null;\n\n\t\t}\n\n\t\tlet descriptor;\n\n\t\tif ( renderContext.textures === null ) {\n\n\t\t\tdescriptor = this._getDefaultRenderPassDescriptor();\n\n\t\t} else {\n\n\t\t\tdescriptor = this._getRenderPassDescriptor( renderContext, { loadOp: GPULoadOp.Load } );\n\n\t\t}\n\n\t\tthis.initTimestampQuery( TimestampQuery.RENDER, this.getTimestampUID( renderContext ), descriptor );\n\n\t\tdescriptor.occlusionQuerySet = occlusionQuerySet;\n\n\t\tconst depthStencilAttachment = descriptor.depthStencilAttachment;\n\n\t\tif ( renderContext.textures !== null ) {\n\n\t\t\tconst colorAttachments = descriptor.colorAttachments;\n\n\t\t\tfor ( let i = 0; i < colorAttachments.length; i ++ ) {\n\n\t\t\t\tconst colorAttachment = colorAttachments[ i ];\n\n\t\t\t\tif ( renderContext.clearColor ) {\n\n\t\t\t\t\tcolorAttachment.clearValue = i === 0 ? renderContext.clearColorValue : { r: 0, g: 0, b: 0, a: 1 };\n\t\t\t\t\tcolorAttachment.loadOp = GPULoadOp.Clear;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tcolorAttachment.loadOp = GPULoadOp.Load;\n\n\t\t\t\t}\n\n\t\t\t\tcolorAttachment.storeOp = GPUStoreOp.Store;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tconst colorAttachment = descriptor.colorAttachments[ 0 ];\n\n\t\t\tif ( renderContext.clearColor ) {\n\n\t\t\t\tcolorAttachment.clearValue = renderContext.clearColorValue;\n\t\t\t\tcolorAttachment.loadOp = GPULoadOp.Clear;\n\n\t\t\t} else {\n\n\t\t\t\tcolorAttachment.loadOp = GPULoadOp.Load;\n\n\t\t\t}\n\n\t\t  \tcolorAttachment.storeOp = GPUStoreOp.Store;\n\n\t\t}\n\n\t\t//\n\n\t\tif ( renderContext.depth ) {\n\n\t\t\tif ( renderContext.clearDepth ) {\n\n\t\t\t\tdepthStencilAttachment.depthClearValue = renderContext.clearDepthValue;\n\t\t\t\tdepthStencilAttachment.depthLoadOp = GPULoadOp.Clear;\n\n\t\t\t} else {\n\n\t\t\t\tdepthStencilAttachment.depthLoadOp = GPULoadOp.Load;\n\n\t\t\t}\n\n\t\t  depthStencilAttachment.depthStoreOp = GPUStoreOp.Store;\n\n\t\t}\n\n\t\tif ( renderContext.stencil ) {\n\n\t\t  if ( renderContext.clearStencil ) {\n\n\t\t\t\tdepthStencilAttachment.stencilClearValue = renderContext.clearStencilValue;\n\t\t\t\tdepthStencilAttachment.stencilLoadOp = GPULoadOp.Clear;\n\n\t\t\t} else {\n\n\t\t\t\tdepthStencilAttachment.stencilLoadOp = GPULoadOp.Load;\n\n\t\t\t}\n\n\t\t  depthStencilAttachment.stencilStoreOp = GPUStoreOp.Store;\n\n\t\t}\n\n\t\t//\n\n\t\tconst encoder = device.createCommandEncoder( { label: 'renderContext_' + renderContext.id } );\n\n\t\t// shadow arrays - prepare bundle encoders for each camera in an array camera\n\n\t\tif ( this._isRenderCameraDepthArray( renderContext ) === true ) {\n\n\t\t\tconst cameras = renderContext.camera.cameras;\n\n\t\t\tif ( ! renderContextData.layerDescriptors || renderContextData.layerDescriptors.length !== cameras.length ) {\n\n\t\t\t\tthis._createDepthLayerDescriptors( renderContext, renderContextData, descriptor, cameras );\n\n\t\t\t} else {\n\n\t\t\t\tthis._updateDepthLayerDescriptors( renderContext, renderContextData, cameras );\n\n\t\t\t}\n\n\t\t\t// Create bundle encoders for each layer\n\t\t\trenderContextData.bundleEncoders = [];\n\t\t\trenderContextData.bundleSets = [];\n\n\t\t\t// Create separate bundle encoders for each camera in the array\n\t\t\tfor ( let i = 0; i < cameras.length; i ++ ) {\n\n\t\t\t\tconst bundleEncoder = this.pipelineUtils.createBundleEncoder(\n\t\t\t\t\trenderContext,\n\t\t\t\t\t'renderBundleArrayCamera_' + i\n\t\t\t\t);\n\n\t\t\t\t// Initialize state tracking for this bundle\n\t\t\t\tconst bundleSets = {\n\t\t\t\t\tattributes: {},\n\t\t\t\t\tbindingGroups: [],\n\t\t\t\t\tpipeline: null,\n\t\t\t\t\tindex: null\n\t\t\t\t};\n\n\t\t\t\trenderContextData.bundleEncoders.push( bundleEncoder );\n\t\t\t\trenderContextData.bundleSets.push( bundleSets );\n\n\t\t\t}\n\n\t\t\t// We'll complete the bundles in finishRender\n\t\t\trenderContextData.currentPass = null;\n\n\t\t} else {\n\n\t\t\tconst currentPass = encoder.beginRenderPass( descriptor );\n\t\t\trenderContextData.currentPass = currentPass;\n\n\t\t\tif ( renderContext.viewport ) {\n\n\t\t\t\tthis.updateViewport( renderContext );\n\n\t\t\t}\n\n\t\t\tif ( renderContext.scissor ) {\n\n\t\t\t\tthis.updateScissor( renderContext );\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\trenderContextData.descriptor = descriptor;\n\t\trenderContextData.encoder = encoder;\n\t\trenderContextData.currentSets = { attributes: {}, bindingGroups: [], pipeline: null, index: null };\n\t\trenderContextData.renderBundles = [];\n\n\t}\n\n\t/**\n\t * This method creates layer descriptors for each camera in an array camera\n\t * to prepare for rendering to a depth array texture.\n\t *\n\t * @param {RenderContext} renderContext - The render context.\n\t * @param {Object} renderContextData - The render context data.\n\t * @param {Object} descriptor  - The render pass descriptor.\n\t * @param {ArrayCamera} cameras - The array camera.\n\t *\n\t * @private\n\t */\n\t_createDepthLayerDescriptors( renderContext, renderContextData, descriptor, cameras ) {\n\n\t\tconst depthStencilAttachment = descriptor.depthStencilAttachment;\n\t\trenderContextData.layerDescriptors = [];\n\n\t\tconst depthTextureData = this.get( renderContext.depthTexture );\n\t\tif ( ! depthTextureData.viewCache ) {\n\n\t\t\tdepthTextureData.viewCache = [];\n\n\t\t}\n\n\t\tfor ( let i = 0; i < cameras.length; i ++ ) {\n\n\t\t\tconst layerDescriptor = {\n\t\t\t\t...descriptor,\n\t\t\t\tcolorAttachments: [ {\n\t\t\t\t\t...descriptor.colorAttachments[ 0 ],\n\t\t\t\t\tview: descriptor.colorAttachments[ i ].view\n\t\t\t\t} ]\n\t\t\t};\n\n\t\t\tif ( descriptor.depthStencilAttachment ) {\n\n\t\t\t\tconst layerIndex = i;\n\n\t\t\t\tif ( ! depthTextureData.viewCache[ layerIndex ] ) {\n\n\t\t\t\t\tdepthTextureData.viewCache[ layerIndex ] = depthTextureData.texture.createView( {\n\t\t\t\t\t\tdimension: GPUTextureViewDimension.TwoD,\n\t\t\t\t\t\tbaseArrayLayer: i,\n\t\t\t\t\t\tarrayLayerCount: 1\n\t\t\t\t\t} );\n\n\t\t\t\t}\n\n\t\t\t\tlayerDescriptor.depthStencilAttachment = {\n\t\t\t\t\tview: depthTextureData.viewCache[ layerIndex ],\n\t\t\t\t\tdepthLoadOp: depthStencilAttachment.depthLoadOp || GPULoadOp.Clear,\n\t\t\t\t\tdepthStoreOp: depthStencilAttachment.depthStoreOp || GPUStoreOp.Store,\n\t\t\t\t\tdepthClearValue: depthStencilAttachment.depthClearValue || 1.0\n\t\t\t\t};\n\n\t\t\t\tif ( renderContext.stencil ) {\n\n\t\t\t\t\tlayerDescriptor.depthStencilAttachment.stencilLoadOp = depthStencilAttachment.stencilLoadOp;\n\t\t\t\t\tlayerDescriptor.depthStencilAttachment.stencilStoreOp = depthStencilAttachment.stencilStoreOp;\n\t\t\t\t\tlayerDescriptor.depthStencilAttachment.stencilClearValue = depthStencilAttachment.stencilClearValue;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tlayerDescriptor.depthStencilAttachment = { ...depthStencilAttachment };\n\n\t\t\t}\n\n\t\t\trenderContextData.layerDescriptors.push( layerDescriptor );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * This method updates the layer descriptors for each camera in an array camera\n\t * to prepare for rendering to a depth array texture.\n\t *\n\t * @param {RenderContext} renderContext - The render context.\n\t * @param {Object} renderContextData - The render context data.\n\t * @param {ArrayCamera} cameras - The array camera.\n\t *\n\t */\n\t_updateDepthLayerDescriptors( renderContext, renderContextData, cameras ) {\n\n\t\tfor ( let i = 0; i < cameras.length; i ++ ) {\n\n\t\t\tconst layerDescriptor = renderContextData.layerDescriptors[ i ];\n\n\t\t\tif ( layerDescriptor.depthStencilAttachment ) {\n\n\t\t\t\tconst depthAttachment = layerDescriptor.depthStencilAttachment;\n\n\t\t\t\tif ( renderContext.depth ) {\n\n\t\t\t\t\tif ( renderContext.clearDepth ) {\n\n\t\t\t\t\t\tdepthAttachment.depthClearValue = renderContext.clearDepthValue;\n\t\t\t\t\t\tdepthAttachment.depthLoadOp = GPULoadOp.Clear;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdepthAttachment.depthLoadOp = GPULoadOp.Load;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tif ( renderContext.stencil ) {\n\n\t\t\t\t\tif ( renderContext.clearStencil ) {\n\n\t\t\t\t\t\tdepthAttachment.stencilClearValue = renderContext.clearStencilValue;\n\t\t\t\t\t\tdepthAttachment.stencilLoadOp = GPULoadOp.Clear;\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tdepthAttachment.stencilLoadOp = GPULoadOp.Load;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * This method is executed at the end of a render call and finalizes work\n\t * after draw calls.\n\t *\n\t * @param {RenderContext} renderContext - The render context.\n\t */\n\tfinishRender( renderContext ) {\n\n\t\tconst renderContextData = this.get( renderContext );\n\t\tconst occlusionQueryCount = renderContext.occlusionQueryCount;\n\n\t\tif ( renderContextData.renderBundles.length > 0 ) {\n\n\t\t\trenderContextData.currentPass.executeBundles( renderContextData.renderBundles );\n\n\t\t}\n\n\t\tif ( occlusionQueryCount > renderContextData.occlusionQueryIndex ) {\n\n\t\t\trenderContextData.currentPass.endOcclusionQuery();\n\n\t\t}\n\n\t\t// shadow arrays - Execute bundles for each layer\n\n\t\tconst encoder = renderContextData.encoder;\n\n\t\tif ( this._isRenderCameraDepthArray( renderContext ) === true ) {\n\n\t\t  const bundles = [];\n\n\t\t  for ( let i = 0; i < renderContextData.bundleEncoders.length; i ++ ) {\n\n\t\t\t\tconst bundleEncoder = renderContextData.bundleEncoders[ i ];\n\t\t\t\tbundles.push( bundleEncoder.finish() );\n\n\t\t\t}\n\n\t\t  for ( let i = 0; i < renderContextData.layerDescriptors.length; i ++ ) {\n\n\t\t\t\tif ( i < bundles.length ) {\n\n\t\t\t\t\tconst layerDescriptor = renderContextData.layerDescriptors[ i ];\n\t\t\t\t\tconst renderPass = encoder.beginRenderPass( layerDescriptor );\n\n\t\t\t\t\tif ( renderContext.viewport ) {\n\n\t\t\t\t\t\tconst { x, y, width, height, minDepth, maxDepth } = renderContext.viewportValue;\n\t\t\t\t\t\trenderPass.setViewport( x, y, width, height, minDepth, maxDepth );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( renderContext.scissor ) {\n\n\t\t\t\t\t\tconst { x, y, width, height } = renderContext.scissorValue;\n\t\t\t\t\t\trenderPass.setScissorRect( x, y, width, height );\n\n\t\t\t\t\t}\n\n\t\t\t\t\trenderPass.executeBundles( [ bundles[ i ] ] );\n\n\t\t\t\t\trenderPass.end();\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else if ( renderContextData.currentPass ) {\n\n\t\t  renderContextData.currentPass.end();\n\n\t\t}\n\n\t\tif ( occlusionQueryCount > 0 ) {\n\n\t\t\tconst bufferSize = occlusionQueryCount * 8; // 8 byte entries for query results\n\n\t\t\t//\n\n\t\t\tlet queryResolveBuffer = this.occludedResolveCache.get( bufferSize );\n\n\t\t\tif ( queryResolveBuffer === undefined ) {\n\n\t\t\t\tqueryResolveBuffer = this.device.createBuffer(\n\t\t\t\t\t{\n\t\t\t\t\t\tsize: bufferSize,\n\t\t\t\t\t\tusage: GPUBufferUsage.QUERY_RESOLVE | GPUBufferUsage.COPY_SRC\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\tthis.occludedResolveCache.set( bufferSize, queryResolveBuffer );\n\n\t\t\t}\n\n\t\t\t//\n\n\t\t\tconst readBuffer = this.device.createBuffer(\n\t\t\t\t{\n\t\t\t\t\tsize: bufferSize,\n\t\t\t\t\tusage: GPUBufferUsage.COPY_DST | GPUBufferUsage.MAP_READ\n\t\t\t\t}\n\t\t\t);\n\n\t\t\t// two buffers required here - WebGPU doesn't allow usage of QUERY_RESOLVE & MAP_READ to be combined\n\t\t\trenderContextData.encoder.resolveQuerySet( renderContextData.occlusionQuerySet, 0, occlusionQueryCount, queryResolveBuffer, 0 );\n\t\t\trenderContextData.encoder.copyBufferToBuffer( queryResolveBuffer, 0, readBuffer, 0, bufferSize );\n\n\t\t\trenderContextData.occlusionQueryBuffer = readBuffer;\n\n\t\t\t//\n\n\t\t\tthis.resolveOccludedAsync( renderContext );\n\n\t\t}\n\n\t\tthis.device.queue.submit( [ renderContextData.encoder.finish() ] );\n\n\n\t\t//\n\n\t\tif ( renderContext.textures !== null ) {\n\n\t\t\tconst textures = renderContext.textures;\n\n\t\t\tfor ( let i = 0; i < textures.length; i ++ ) {\n\n\t\t\t\tconst texture = textures[ i ];\n\n\t\t\t\tif ( texture.generateMipmaps === true ) {\n\n\t\t\t\t\tthis.textureUtils.generateMipmaps( texture );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Returns `true` if the given 3D object is fully occluded by other\n\t * 3D objects in the scene.\n\t *\n\t * @param {RenderContext} renderContext - The render context.\n\t * @param {Object3D} object - The 3D object to test.\n\t * @return {boolean} Whether the 3D object is fully occluded or not.\n\t */\n\tisOccluded( renderContext, object ) {\n\n\t\tconst renderContextData = this.get( renderContext );\n\n\t\treturn renderContextData.occluded && renderContextData.occluded.has( object );\n\n\t}\n\n\t/**\n\t * This method processes the result of occlusion queries and writes it\n\t * into render context data.\n\t *\n\t * @async\n\t * @param {RenderContext} renderContext - The render context.\n\t * @return {Promise} A Promise that resolves when the occlusion query results have been processed.\n\t */\n\tasync resolveOccludedAsync( renderContext ) {\n\n\t\tconst renderContextData = this.get( renderContext );\n\n\t\t// handle occlusion query results\n\n\t\tconst { currentOcclusionQueryBuffer, currentOcclusionQueryObjects } = renderContextData;\n\n\t\tif ( currentOcclusionQueryBuffer && currentOcclusionQueryObjects ) {\n\n\t\t\tconst occluded = new WeakSet();\n\n\t\t\trenderContextData.currentOcclusionQueryObjects = null;\n\t\t\trenderContextData.currentOcclusionQueryBuffer = null;\n\n\t\t\tawait currentOcclusionQueryBuffer.mapAsync( GPUMapMode.READ );\n\n\t\t\tconst buffer = currentOcclusionQueryBuffer.getMappedRange();\n\t\t\tconst results = new BigUint64Array( buffer );\n\n\t\t\tfor ( let i = 0; i < currentOcclusionQueryObjects.length; i ++ ) {\n\n\t\t\t\tif ( results[ i ] === BigInt( 0 ) ) {\n\n\t\t\t\t\toccluded.add( currentOcclusionQueryObjects[ i ] );\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tcurrentOcclusionQueryBuffer.destroy();\n\n\t\t\trenderContextData.occluded = occluded;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Updates the viewport with the values from the given render context.\n\t *\n\t * @param {RenderContext} renderContext - The render context.\n\t */\n\tupdateViewport( renderContext ) {\n\n\t\tconst { currentPass } = this.get( renderContext );\n\t\tconst { x, y, width, height, minDepth, maxDepth } = renderContext.viewportValue;\n\n\t\tcurrentPass.setViewport( x, y, width, height, minDepth, maxDepth );\n\n\t}\n\n\t/**\n\t * Updates the scissor with the values from the given render context.\n\t *\n\t * @param {RenderContext} renderContext - The render context.\n\t */\n\tupdateScissor( renderContext ) {\n\n\t\tconst { currentPass } = this.get( renderContext );\n\t\tconst { x, y, width, height } = renderContext.scissorValue;\n\n\t\tcurrentPass.setScissorRect( x, y, width, height );\n\n\t}\n\n\t/**\n\t * Returns the clear color and alpha into a single\n\t * color object.\n\t *\n\t * @return {Color4} The clear color.\n\t */\n\tgetClearColor() {\n\n\t\tconst clearColor = super.getClearColor();\n\n\t\t// only premultiply alpha when alphaMode is \"premultiplied\"\n\n\t\tif ( this.renderer.alpha === true ) {\n\n\t\t\tclearColor.r *= clearColor.a;\n\t\t\tclearColor.g *= clearColor.a;\n\t\t\tclearColor.b *= clearColor.a;\n\n\t\t}\n\n\t\treturn clearColor;\n\n\t}\n\n\t/**\n\t * Performs a clear operation.\n\t *\n\t * @param {boolean} color - Whether the color buffer should be cleared or not.\n\t * @param {boolean} depth - Whether the depth buffer should be cleared or not.\n\t * @param {boolean} stencil - Whether the stencil buffer should be cleared or not.\n\t * @param {?RenderContext} [renderTargetContext=null] - The render context of the current set render target.\n\t */\n\tclear( color, depth, stencil, renderTargetContext = null ) {\n\n\t\tconst device = this.device;\n\t\tconst renderer = this.renderer;\n\n\t\tlet colorAttachments = [];\n\t\tlet depthStencilAttachment;\n\t\tlet clearValue;\n\n\t\tlet supportsDepth;\n\t\tlet supportsStencil;\n\n\t\tif ( color ) {\n\n\t\t\tconst clearColor = this.getClearColor();\n\t\t\tclearValue = { r: clearColor.r, g: clearColor.g, b: clearColor.b, a: clearColor.a };\n\n\t\t}\n\n\t\tif ( renderTargetContext === null ) {\n\n\t\t\tsupportsDepth = renderer.depth;\n\t\t\tsupportsStencil = renderer.stencil;\n\n\t\t\tconst descriptor = this._getDefaultRenderPassDescriptor();\n\n\t\t\tif ( color ) {\n\n\t\t\t\tcolorAttachments = descriptor.colorAttachments;\n\n\t\t\t\tconst colorAttachment = colorAttachments[ 0 ];\n\n\t\t\t\tcolorAttachment.clearValue = clearValue;\n\t\t\t\tcolorAttachment.loadOp = GPULoadOp.Clear;\n\t\t\t\tcolorAttachment.storeOp = GPUStoreOp.Store;\n\n\t\t\t}\n\n\t\t\tif ( supportsDepth || supportsStencil ) {\n\n\t\t\t\tdepthStencilAttachment = descriptor.depthStencilAttachment;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tsupportsDepth = renderTargetContext.depth;\n\t\t\tsupportsStencil = renderTargetContext.stencil;\n\n\t\t\tconst clearConfig = {\n\t\t\t\tloadOp: color ? GPULoadOp.Clear : GPULoadOp.Load,\n\t\t\t\tclearValue: color ? clearValue : undefined\n\t\t\t};\n\n\t\t\tif ( supportsDepth ) {\n\n\t\t\t\tclearConfig.depthLoadOp = depth ? GPULoadOp.Clear : GPULoadOp.Load;\n\t\t\t\tclearConfig.depthClearValue = depth ? renderer.getClearDepth() : undefined;\n\t\t\t\tclearConfig.depthStoreOp = GPUStoreOp.Store;\n\n\t\t\t}\n\n\t\t\tif ( supportsStencil ) {\n\n\t\t\t\tclearConfig.stencilLoadOp = stencil ? GPULoadOp.Clear : GPULoadOp.Load;\n\t\t\t\tclearConfig.stencilClearValue = stencil ? renderer.getClearStencil() : undefined;\n\t\t\t\tclearConfig.stencilStoreOp = GPUStoreOp.Store;\n\n\t\t\t}\n\n\t\t\tconst descriptor = this._getRenderPassDescriptor( renderTargetContext, clearConfig );\n\n\t\t\tcolorAttachments = descriptor.colorAttachments;\n\t\t\tdepthStencilAttachment = descriptor.depthStencilAttachment;\n\n\t\t}\n\n\t\tif ( supportsDepth && depthStencilAttachment ) {\n\n\t\t\tif ( depth ) {\n\n\t\t\t\tdepthStencilAttachment.depthLoadOp = GPULoadOp.Clear;\n\t\t\t\tdepthStencilAttachment.depthClearValue = renderer.getClearDepth();\n\t\t\t\tdepthStencilAttachment.depthStoreOp = GPUStoreOp.Store;\n\n\t\t\t} else {\n\n\t\t\t\tdepthStencilAttachment.depthLoadOp = GPULoadOp.Load;\n\t\t\t\tdepthStencilAttachment.depthStoreOp = GPUStoreOp.Store;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tif ( supportsStencil && depthStencilAttachment ) {\n\n\t\t\tif ( stencil ) {\n\n\t\t\t\tdepthStencilAttachment.stencilLoadOp = GPULoadOp.Clear;\n\t\t\t\tdepthStencilAttachment.stencilClearValue = renderer.getClearStencil();\n\t\t\t\tdepthStencilAttachment.stencilStoreOp = GPUStoreOp.Store;\n\n\t\t\t} else {\n\n\t\t\t\tdepthStencilAttachment.stencilLoadOp = GPULoadOp.Load;\n\t\t\t\tdepthStencilAttachment.stencilStoreOp = GPUStoreOp.Store;\n\n\t\t\t}\n\n\t\t}\n\n\t\t//\n\n\t\tconst encoder = device.createCommandEncoder( { label: 'clear' } );\n\t\tconst currentPass = encoder.beginRenderPass( {\n\t\t\tcolorAttachments,\n\t\t\tdepthStencilAttachment\n\t\t} );\n\n\t\tcurrentPass.end();\n\n\t\tdevice.queue.submit( [ encoder.finish() ] );\n\n\t}\n\n\t// compute\n\n\t/**\n\t * This method is executed at the beginning of a compute call and\n\t * prepares the state for upcoming compute tasks.\n\t *\n\t * @param {Node|Array<Node>} computeGroup - The compute node(s).\n\t */\n\tbeginCompute( computeGroup ) {\n\n\t\tconst groupGPU = this.get( computeGroup );\n\n\t\t//\n\n\t\tconst descriptor = {\n\t\t\tlabel: 'computeGroup_' + computeGroup.id\n\t\t};\n\n\t\tthis.initTimestampQuery( TimestampQuery.COMPUTE, this.getTimestampUID( computeGroup ), descriptor );\n\n\t\tgroupGPU.cmdEncoderGPU = this.device.createCommandEncoder( { label: 'computeGroup_' + computeGroup.id } );\n\n\t\tgroupGPU.passEncoderGPU = groupGPU.cmdEncoderGPU.beginComputePass( descriptor );\n\n\t}\n\n\t/**\n\t * Executes a compute command for the given compute node.\n\t *\n\t * @param {Node|Array<Node>} computeGroup - The group of compute nodes of a compute call. Can be a single compute node.\n\t * @param {Node} computeNode - The compute node.\n\t * @param {Array<BindGroup>} bindings - The bindings.\n\t * @param {ComputePipeline} pipeline - The compute pipeline.\n\t * @param {number|Array<number>|IndirectStorageBufferAttribute} [dispatchSize=null]\n\t * - A single number representing count, or\n\t * - An array [x, y, z] representing dispatch size, or\n\t * - A IndirectStorageBufferAttribute for indirect dispatch size.\n\t */\n\tcompute( computeGroup, computeNode, bindings, pipeline, dispatchSize = null ) {\n\n\t\tconst computeNodeData = this.get( computeNode );\n\t\tconst { passEncoderGPU } = this.get( computeGroup );\n\n\t\t// pipeline\n\n\t\tconst pipelineGPU = this.get( pipeline ).pipeline;\n\n\t\tthis.pipelineUtils.setPipeline( passEncoderGPU, pipelineGPU );\n\n\t\t// bind groups\n\n\t\tfor ( let i = 0, l = bindings.length; i < l; i ++ ) {\n\n\t\t\tconst bindGroup = bindings[ i ];\n\t\t\tconst bindingsData = this.get( bindGroup );\n\n\t\t\tpassEncoderGPU.setBindGroup( i, bindingsData.group );\n\n\t\t}\n\n\t\tif ( dispatchSize === null ) {\n\n\t\t\tdispatchSize = computeNode.count;\n\n\t\t}\n\n\t\t// When the dispatchSize is set with a StorageBuffer from the GPU.\n\n\t\tif ( dispatchSize && typeof dispatchSize === 'object' && dispatchSize.isIndirectStorageBufferAttribute ) {\n\n\t\t\tconst dispatchBuffer = this.get( dispatchSize ).buffer;\n\n\t\t\tpassEncoderGPU.dispatchWorkgroupsIndirect( dispatchBuffer, 0 );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tif ( typeof dispatchSize === 'number' ) {\n\n\t\t\t// If a single number is given, we calculate the dispatch size based on the workgroup size\n\n\t\t\tconst count = dispatchSize;\n\n\t\t\tif ( computeNodeData.dispatchSize === undefined || computeNodeData.count !== count ) {\n\n\t\t\t\t// cache dispatch size to avoid recalculating it every time\n\n\t\t\t\tcomputeNodeData.dispatchSize = [ 0, 1, 1 ];\n\t\t\t\tcomputeNodeData.count = count;\n\n\t\t\t\tconst workgroupSize = computeNode.workgroupSize;\n\n\t\t\t\tlet size = workgroupSize[ 0 ];\n\n\t\t\t\tfor ( let i = 1; i < workgroupSize.length; i ++ )\n\t\t\t\t\tsize *= workgroupSize[ i ];\n\n\t\t\t\tconst dispatchCount = Math.ceil( count / size );\n\n\t\t\t\t//\n\n\t\t\t\tconst maxComputeWorkgroupsPerDimension = this.device.limits.maxComputeWorkgroupsPerDimension;\n\n\t\t\t\tdispatchSize = [ dispatchCount, 1, 1 ];\n\n\t\t\t\tif ( dispatchCount > maxComputeWorkgroupsPerDimension ) {\n\n\t\t\t\t\tdispatchSize[ 0 ] = Math.min( dispatchCount, maxComputeWorkgroupsPerDimension );\n\t\t\t\t\tdispatchSize[ 1 ] = Math.ceil( dispatchCount / maxComputeWorkgroupsPerDimension );\n\n\t\t\t\t}\n\n\t\t\t\tcomputeNodeData.dispatchSize = dispatchSize;\n\n\t\t\t}\n\n\t\t\tdispatchSize = computeNodeData.dispatchSize;\n\n\t\t}\n\n\t\t//\n\n\t\tpassEncoderGPU.dispatchWorkgroups(\n\t\t\tdispatchSize[ 0 ],\n\t\t\tdispatchSize[ 1 ] || 1,\n\t\t\tdispatchSize[ 2 ] || 1\n\t\t);\n\n\t}\n\n\t/**\n\t * This method is executed at the end of a compute call and\n\t * finalizes work after compute tasks.\n\t *\n\t * @param {Node|Array<Node>} computeGroup - The compute node(s).\n\t */\n\tfinishCompute( computeGroup ) {\n\n\t\tconst groupData = this.get( computeGroup );\n\n\t\tgroupData.passEncoderGPU.end();\n\n\t\tthis.device.queue.submit( [ groupData.cmdEncoderGPU.finish() ] );\n\n\t}\n\n\t// render object\n\n\t/**\n\t * Executes a draw command for the given render object.\n\t *\n\t * @param {RenderObject} renderObject - The render object to draw.\n\t * @param {Info} info - Holds a series of statistical information about the GPU memory and the rendering process.\n\t */\n\tdraw( renderObject, info ) {\n\n\t\tconst { object, material, context, pipeline } = renderObject;\n\t\tconst bindings = renderObject.getBindings();\n\t\tconst renderContextData = this.get( context );\n\t\tconst pipelineData = this.get( pipeline );\n\t\tconst pipelineGPU = pipelineData.pipeline;\n\n\t\tif ( pipelineData.error === true ) return;\n\n\t\tconst index = renderObject.getIndex();\n\t\tconst hasIndex = ( index !== null );\n\n\n\t\tconst drawParams = renderObject.getDrawParameters();\n\t\tif ( drawParams === null ) return;\n\n\t\t// pipeline\n\n\t\tconst setPipelineAndBindings = ( passEncoderGPU, currentSets ) => {\n\n\t\t\t// pipeline\n\t\t\tthis.pipelineUtils.setPipeline( passEncoderGPU, pipelineGPU );\n\t\t\tcurrentSets.pipeline = pipelineGPU;\n\n\t\t\t// bind groups\n\t\t\tconst currentBindingGroups = currentSets.bindingGroups;\n\t\t\tfor ( let i = 0, l = bindings.length; i < l; i ++ ) {\n\n\t\t\t\tconst bindGroup = bindings[ i ];\n\t\t\t\tconst bindingsData = this.get( bindGroup );\n\t\t\t\tif ( currentBindingGroups[ bindGroup.index ] !== bindGroup.id ) {\n\n\t\t\t\t\tpassEncoderGPU.setBindGroup( bindGroup.index, bindingsData.group );\n\t\t\t\t\tcurrentBindingGroups[ bindGroup.index ] = bindGroup.id;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\t// attributes\n\n\t\t\t// index\n\n\t\t\tif ( hasIndex === true ) {\n\n\t\t\t\tif ( currentSets.index !== index ) {\n\n\t\t\t\t\tconst buffer = this.get( index ).buffer;\n\t\t\t\t\tconst indexFormat = ( index.array instanceof Uint16Array ) ? GPUIndexFormat.Uint16 : GPUIndexFormat.Uint32;\n\n\t\t\t\t\tpassEncoderGPU.setIndexBuffer( buffer, indexFormat );\n\n\t\t\t\t\tcurrentSets.index = index;\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t\t// vertex buffers\n\n\t\t\tconst vertexBuffers = renderObject.getVertexBuffers();\n\n\t\t\tfor ( let i = 0, l = vertexBuffers.length; i < l; i ++ ) {\n\n\t\t\t\tconst vertexBuffer = vertexBuffers[ i ];\n\n\t\t\t\tif ( currentSets.attributes[ i ] !== vertexBuffer ) {\n\n\t\t\t\t\tconst buffer = this.get( vertexBuffer ).buffer;\n\t\t\t\t\tpassEncoderGPU.setVertexBuffer( i, buffer );\n\n\t\t\t\t\tcurrentSets.attributes[ i ] = vertexBuffer;\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t\t// stencil\n\n\t\t\tif ( context.stencil === true && material.stencilWrite === true && renderContextData.currentStencilRef !== material.stencilRef ) {\n\n\t\t\t\tpassEncoderGPU.setStencilReference( material.stencilRef );\n\t\t\t\trenderContextData.currentStencilRef = material.stencilRef;\n\n\t\t\t}\n\n\n\t\t};\n\n\t\t// Define draw function\n\t\tconst draw = ( passEncoderGPU, currentSets ) => {\n\n\t\t\tsetPipelineAndBindings( passEncoderGPU, currentSets );\n\n\t\t\tif ( object.isBatchedMesh === true ) {\n\n\t\t\t\tconst starts = object._multiDrawStarts;\n\t\t\t\tconst counts = object._multiDrawCounts;\n\t\t\t\tconst drawCount = object._multiDrawCount;\n\t\t\t\tconst drawInstances = object._multiDrawInstances;\n\n\t\t\t\tif ( drawInstances !== null ) {\n\n\t\t\t\t\t// @deprecated, r174\n\t\t\t\t\twarnOnce( 'WebGPUBackend: renderMultiDrawInstances has been deprecated and will be removed in r184. Append to renderMultiDraw arguments and use indirection.' );\n\n\t\t\t\t}\n\n\t\t\t\tfor ( let i = 0; i < drawCount; i ++ ) {\n\n\t\t\t\t\tconst count = drawInstances ? drawInstances[ i ] : 1;\n\t\t\t\t\tconst firstInstance = count > 1 ? 0 : i;\n\n\t\t\t\t\tif ( hasIndex === true ) {\n\n\t\t\t\t\t\tpassEncoderGPU.drawIndexed( counts[ i ], count, starts[ i ] / index.array.BYTES_PER_ELEMENT, 0, firstInstance );\n\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\tpassEncoderGPU.draw( counts[ i ], count, starts[ i ], firstInstance );\n\n\t\t\t\t\t}\n\n\t\t\t\t\tinfo.update( object, counts[ i ], count );\n\n\t\t\t\t}\n\n\t\t\t} else if ( hasIndex === true ) {\n\n\t\t\t\tconst { vertexCount: indexCount, instanceCount, firstVertex: firstIndex } = drawParams;\n\n\t\t\t\tconst indirect = renderObject.getIndirect();\n\n\t\t\t\tif ( indirect !== null ) {\n\n\t\t\t\t\tconst buffer = this.get( indirect ).buffer;\n\t\t\t\t\tconst indirectOffset = renderObject.getIndirectOffset();\n\t\t\t\t\tconst indirectOffsets = Array.isArray( indirectOffset ) ? indirectOffset : [ indirectOffset ];\n\n\t\t\t\t\tfor ( let i = 0; i < indirectOffsets.length; i ++ ) {\n\n\t\t\t\t\t\tpassEncoderGPU.drawIndexedIndirect( buffer, indirectOffsets[ i ] );\n\n\t\t\t\t\t}\n\n\t\t\t\t} else {\n\n\t\t\t\t\tpassEncoderGPU.drawIndexed( indexCount, instanceCount, firstIndex, 0, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tinfo.update( object, indexCount, instanceCount );\n\n\t\t\t} else {\n\n\t\t\t\tconst { vertexCount, instanceCount, firstVertex } = drawParams;\n\n\t\t\t\tconst indirect = renderObject.getIndirect();\n\n\t\t\t\tif ( indirect !== null ) {\n\n\t\t\t\t\tconst buffer = this.get( indirect ).buffer;\n\t\t\t\t\tconst indirectOffset = renderObject.getIndirectOffset();\n\t\t\t\t\tconst indirectOffsets = Array.isArray( indirectOffset ) ? indirectOffset : [ indirectOffset ];\n\n\t\t\t\t\tfor ( let i = 0; i < indirectOffsets.length; i ++ ) {\n\n\t\t\t\t\t\tpassEncoderGPU.drawIndirect( buffer, indirectOffsets[ i ] );\n\n\t\t\t\t\t}\n\n\n\t\t\t\t} else {\n\n\t\t\t\t\tpassEncoderGPU.draw( vertexCount, instanceCount, firstVertex, 0 );\n\n\t\t\t\t}\n\n\t\t\t\tinfo.update( object, vertexCount, instanceCount );\n\n\t\t\t}\n\n\t\t};\n\n\t\tif ( renderObject.camera.isArrayCamera && renderObject.camera.cameras.length > 0 ) {\n\n\t\t\tconst cameraData = this.get( renderObject.camera );\n\t\t\tconst cameras = renderObject.camera.cameras;\n\t\t\tconst cameraIndex = renderObject.getBindingGroup( 'cameraIndex' );\n\n\t\t\tif ( cameraData.indexesGPU === undefined || cameraData.indexesGPU.length !== cameras.length ) {\n\n\t\t\t\tconst bindingsData = this.get( cameraIndex );\n\t\t\t\tconst indexesGPU = [];\n\n\t\t\t\tconst data = new Uint32Array( [ 0, 0, 0, 0 ] );\n\n\t\t\t\tfor ( let i = 0, len = cameras.length; i < len; i ++ ) {\n\n\t\t\t\t\tdata[ 0 ] = i;\n\n\t\t\t\t\tconst { layoutGPU } = bindingsData.layout;\n\n\t\t\t\t\tconst bindGroupIndex = this.bindingUtils.createBindGroupIndex( data, layoutGPU );\n\n\t\t\t\t\tindexesGPU.push( bindGroupIndex );\n\n\t\t\t\t}\n\n\t\t\t\tcameraData.indexesGPU = indexesGPU; // TODO: Create a global library for this\n\n\t\t\t}\n\n\t\t\tconst pixelRatio = this.renderer.getPixelRatio();\n\n\t\t\tfor ( let i = 0, len = cameras.length; i < len; i ++ ) {\n\n\t\t\t\tconst subCamera = cameras[ i ];\n\n\t\t\t\tif ( object.layers.test( subCamera.layers ) ) {\n\n\t\t\t\t\tconst vp = subCamera.viewport;\n\n\n\n\t\t\t\t\tlet pass = renderContextData.currentPass;\n\t\t\t\t\tlet sets = renderContextData.currentSets;\n\t\t\t\t\tif ( renderContextData.bundleEncoders ) {\n\n\t\t\t\t\t\tconst bundleEncoder = renderContextData.bundleEncoders[ i ];\n\t\t\t\t\t\tconst bundleSets = renderContextData.bundleSets[ i ];\n\t\t\t\t\t\tpass = bundleEncoder;\n\t\t\t\t\t\tsets = bundleSets;\n\n\t\t\t\t\t}\n\n\n\n\t\t\t\t\tif ( vp ) {\n\n\t\t\t\t\t\tpass.setViewport(\n\t\t\t\t\t\t\tMath.floor( vp.x * pixelRatio ),\n\t\t\t\t\t\t\tMath.floor( vp.y * pixelRatio ),\n\t\t\t\t\t\t\tMath.floor( vp.width * pixelRatio ),\n\t\t\t\t\t\t\tMath.floor( vp.height * pixelRatio ),\n\t\t\t\t\t\t\tcontext.viewportValue.minDepth,\n\t\t\t\t\t\t\tcontext.viewportValue.maxDepth\n\t\t\t\t\t\t);\n\n\t\t\t\t\t}\n\n\n\t\t\t\t\t// Set camera index binding for this layer\n\t\t\t\t\tif ( cameraIndex && cameraData.indexesGPU ) {\n\n\t\t\t\t\t\tpass.setBindGroup( cameraIndex.index, cameraData.indexesGPU[ i ] );\n\t\t\t\t\t\tsets.bindingGroups[ cameraIndex.index ] = cameraIndex.id;\n\n\t\t\t\t\t}\n\n\t\t\t\t\tdraw( pass, sets );\n\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// Regular single camera rendering\n\t\t\tif ( renderContextData.currentPass ) {\n\n\t\t\t\t// Handle occlusion queries\n\t\t\t\tif ( renderContextData.occlusionQuerySet !== undefined ) {\n\n\t\t\t\t\tconst lastObject = renderContextData.lastOcclusionObject;\n\t\t\t\t\tif ( lastObject !== object ) {\n\n\t\t\t\t\t\tif ( lastObject !== null && lastObject.occlusionTest === true ) {\n\n\t\t\t\t\t\t\trenderContextData.currentPass.endOcclusionQuery();\n\t\t\t\t\t\t\trenderContextData.occlusionQueryIndex ++;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif ( object.occlusionTest === true ) {\n\n\t\t\t\t\t\t\trenderContextData.currentPass.beginOcclusionQuery( renderContextData.occlusionQueryIndex );\n\t\t\t\t\t\t\trenderContextData.occlusionQueryObjects[ renderContextData.occlusionQueryIndex ] = object;\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\trenderContextData.lastOcclusionObject = object;\n\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\tdraw( renderContextData.currentPass, renderContextData.currentSets );\n\n\t\t\t}\n\n\t\t}\n\n\t}\n\n\t// cache key\n\n\t/**\n\t * Returns `true` if the render pipeline requires an update.\n\t *\n\t * @param {RenderObject} renderObject - The render object.\n\t * @return {boolean} Whether the render pipeline requires an update or not.\n\t */\n\tneedsRenderUpdate( renderObject ) {\n\n\t\tconst data = this.get( renderObject );\n\n\t\tconst { object, material } = renderObject;\n\n\t\tconst utils = this.utils;\n\n\t\tconst sampleCount = utils.getSampleCountRenderContext( renderObject.context );\n\t\tconst colorSpace = utils.getCurrentColorSpace( renderObject.context );\n\t\tconst colorFormat = utils.getCurrentColorFormat( renderObject.context );\n\t\tconst depthStencilFormat = utils.getCurrentDepthStencilFormat( renderObject.context );\n\t\tconst primitiveTopology = utils.getPrimitiveTopology( object, material );\n\n\t\tlet needsUpdate = false;\n\n\t\tif ( data.material !== material || data.materialVersion !== material.version ||\n\t\t\tdata.transparent !== material.transparent || data.blending !== material.blending || data.premultipliedAlpha !== material.premultipliedAlpha ||\n\t\t\tdata.blendSrc !== material.blendSrc || data.blendDst !== material.blendDst || data.blendEquation !== material.blendEquation ||\n\t\t\tdata.blendSrcAlpha !== material.blendSrcAlpha || data.blendDstAlpha !== material.blendDstAlpha || data.blendEquationAlpha !== material.blendEquationAlpha ||\n\t\t\tdata.colorWrite !== material.colorWrite || data.depthWrite !== material.depthWrite || data.depthTest !== material.depthTest || data.depthFunc !== material.depthFunc ||\n\t\t\tdata.stencilWrite !== material.stencilWrite || data.stencilFunc !== material.stencilFunc ||\n\t\t\tdata.stencilFail !== material.stencilFail || data.stencilZFail !== material.stencilZFail || data.stencilZPass !== material.stencilZPass ||\n\t\t\tdata.stencilFuncMask !== material.stencilFuncMask || data.stencilWriteMask !== material.stencilWriteMask ||\n\t\t\tdata.side !== material.side || data.alphaToCoverage !== material.alphaToCoverage ||\n\t\t\tdata.sampleCount !== sampleCount || data.colorSpace !== colorSpace ||\n\t\t\tdata.colorFormat !== colorFormat || data.depthStencilFormat !== depthStencilFormat ||\n\t\t\tdata.primitiveTopology !== primitiveTopology ||\n\t\t\tdata.clippingContextCacheKey !== renderObject.clippingContextCacheKey\n\t\t) {\n\n\t\t\tdata.material = material; data.materialVersion = material.version;\n\t\t\tdata.transparent = material.transparent; data.blending = material.blending; data.premultipliedAlpha = material.premultipliedAlpha;\n\t\t\tdata.blendSrc = material.blendSrc; data.blendDst = material.blendDst; data.blendEquation = material.blendEquation;\n\t\t\tdata.blendSrcAlpha = material.blendSrcAlpha; data.blendDstAlpha = material.blendDstAlpha; data.blendEquationAlpha = material.blendEquationAlpha;\n\t\t\tdata.colorWrite = material.colorWrite;\n\t\t\tdata.depthWrite = material.depthWrite; data.depthTest = material.depthTest; data.depthFunc = material.depthFunc;\n\t\t\tdata.stencilWrite = material.stencilWrite; data.stencilFunc = material.stencilFunc;\n\t\t\tdata.stencilFail = material.stencilFail; data.stencilZFail = material.stencilZFail; data.stencilZPass = material.stencilZPass;\n\t\t\tdata.stencilFuncMask = material.stencilFuncMask; data.stencilWriteMask = material.stencilWriteMask;\n\t\t\tdata.side = material.side; data.alphaToCoverage = material.alphaToCoverage;\n\t\t\tdata.sampleCount = sampleCount;\n\t\t\tdata.colorSpace = colorSpace;\n\t\t\tdata.colorFormat = colorFormat;\n\t\t\tdata.depthStencilFormat = depthStencilFormat;\n\t\t\tdata.primitiveTopology = primitiveTopology;\n\t\t\tdata.clippingContextCacheKey = renderObject.clippingContextCacheKey;\n\n\t\t\tneedsUpdate = true;\n\n\t\t}\n\n\t\treturn needsUpdate;\n\n\t}\n\n\t/**\n\t * Returns a cache key that is used to identify render pipelines.\n\t *\n\t * @param {RenderObject} renderObject - The render object.\n\t * @return {string} The cache key.\n\t */\n\tgetRenderCacheKey( renderObject ) {\n\n\t\tconst { object, material } = renderObject;\n\n\t\tconst utils = this.utils;\n\t\tconst renderContext = renderObject.context;\n\n\t\t// meshes with negative scale have a different frontFace render pipeline\n\t\t// descriptor value so the following must be honored in the cache key\n\n\t\tconst frontFaceCW = ( object.isMesh && object.matrixWorld.determinant() < 0 );\n\n\t\treturn [\n\t\t\tmaterial.transparent, material.blending, material.premultipliedAlpha,\n\t\t\tmaterial.blendSrc, material.blendDst, material.blendEquation,\n\t\t\tmaterial.blendSrcAlpha, material.blendDstAlpha, material.blendEquationAlpha,\n\t\t\tmaterial.colorWrite,\n\t\t\tmaterial.depthWrite, material.depthTest, material.depthFunc,\n\t\t\tmaterial.stencilWrite, material.stencilFunc,\n\t\t\tmaterial.stencilFail, material.stencilZFail, material.stencilZPass,\n\t\t\tmaterial.stencilFuncMask, material.stencilWriteMask,\n\t\t\tmaterial.side,\n\t\t\tfrontFaceCW,\n\t\t\tutils.getSampleCountRenderContext( renderContext ),\n\t\t\tutils.getCurrentColorSpace( renderContext ), utils.getCurrentColorFormat( renderContext ), utils.getCurrentDepthStencilFormat( renderContext ),\n\t\t\tutils.getPrimitiveTopology( object, material ),\n\t\t\trenderObject.getGeometryCacheKey(),\n\t\t\trenderObject.clippingContextCacheKey\n\t\t].join();\n\n\t}\n\n\t// textures\n\n\t/**\n\t * Updates a GPU sampler for the given texture.\n\t *\n\t * @param {Texture} texture - The texture to update the sampler for.\n\t * @return {string} The current sampler key.\n\t */\n\tupdateSampler( texture ) {\n\n\t\treturn this.textureUtils.updateSampler( texture );\n\n\t}\n\n\t/**\n\t * Creates a default texture for the given texture that can be used\n\t * as a placeholder until the actual texture is ready for usage.\n\t *\n\t * @param {Texture} texture - The texture to create a default texture for.\n\t * @return {boolean} Whether the sampler has been updated or not.\n\t */\n\tcreateDefaultTexture( texture ) {\n\n\t\treturn this.textureUtils.createDefaultTexture( texture );\n\n\t}\n\n\t/**\n\t * Defines a texture on the GPU for the given texture object.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {Object} [options={}] - Optional configuration parameter.\n\t */\n\tcreateTexture( texture, options ) {\n\n\t\tthis.textureUtils.createTexture( texture, options );\n\n\t}\n\n\t/**\n\t * Uploads the updated texture data to the GPU.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {Object} [options={}] - Optional configuration parameter.\n\t */\n\tupdateTexture( texture, options ) {\n\n\t\tthis.textureUtils.updateTexture( texture, options );\n\n\t}\n\n\t/**\n\t * Generates mipmaps for the given texture.\n\t *\n\t * @param {Texture} texture - The texture.\n\t */\n\tgenerateMipmaps( texture ) {\n\n\t\tthis.textureUtils.generateMipmaps( texture );\n\n\t}\n\n\t/**\n\t * Destroys the GPU data for the given texture object.\n\t *\n\t * @param {Texture} texture - The texture.\n\t * @param {boolean} [isDefaultTexture=false] - Whether the texture uses a default GPU texture or not.\n\t */\n\tdestroyTexture( texture, isDefaultTexture = false ) {\n\n\t\tthis.textureUtils.destroyTexture( texture, isDefaultTexture );\n\n\t}\n\n\t/**\n\t * Returns texture data as a typed array.\n\t *\n\t * @async\n\t * @param {Texture} texture - The texture to copy.\n\t * @param {number} x - The x coordinate of the copy origin.\n\t * @param {number} y - The y coordinate of the copy origin.\n\t * @param {number} width - The width of the copy.\n\t * @param {number} height - The height of the copy.\n\t * @param {number} faceIndex - The face index.\n\t * @return {Promise<TypedArray>} A Promise that resolves with a typed array when the copy operation has finished.\n\t */\n\tasync copyTextureToBuffer( texture, x, y, width, height, faceIndex ) {\n\n\t\treturn this.textureUtils.copyTextureToBuffer( texture, x, y, width, height, faceIndex );\n\n\t}\n\n\t/**\n\t * Inits a time stamp query for the given render context.\n\t *\n\t * @param {string} type - The type of the timestamp query (e.g. 'render', 'compute').\n\t * @param {number} uid - Unique id for the context (e.g. render context id).\n\t * @param {Object} descriptor - The query descriptor.\n\t */\n\tinitTimestampQuery( type, uid, descriptor ) {\n\n\t\tif ( ! this.trackTimestamp ) return;\n\n\t\tif ( ! this.timestampQueryPool[ type ] ) {\n\n\t\t\t// TODO: Variable maxQueries?\n\t\t\tthis.timestampQueryPool[ type ] = new WebGPUTimestampQueryPool( this.device, type, 2048 );\n\n\t\t}\n\n\t\tconst timestampQueryPool = this.timestampQueryPool[ type ];\n\n\t\tconst baseOffset = timestampQueryPool.allocateQueriesForContext( uid );\n\n\t\tdescriptor.timestampWrites = {\n\t\t\tquerySet: timestampQueryPool.querySet,\n\t\t\tbeginningOfPassWriteIndex: baseOffset,\n\t\t\tendOfPassWriteIndex: baseOffset + 1,\n\t\t};\n\n\t}\n\n\n\t// node builder\n\n\t/**\n\t * Returns a node builder for the given render object.\n\t *\n\t * @param {RenderObject} object - The render object.\n\t * @param {Renderer} renderer - The renderer.\n\t * @return {WGSLNodeBuilder} The node builder.\n\t */\n\tcreateNodeBuilder( object, renderer ) {\n\n\t\treturn new WGSLNodeBuilder( object, renderer );\n\n\t}\n\n\t// program\n\n\t/**\n\t * Creates a shader program from the given programmable stage.\n\t *\n\t * @param {ProgrammableStage} program - The programmable stage.\n\t */\n\tcreateProgram( program ) {\n\n\t\tconst programGPU = this.get( program );\n\n\t\tprogramGPU.module = {\n\t\t\tmodule: this.device.createShaderModule( { code: program.code, label: program.stage + ( program.name !== '' ? `_${ program.name }` : '' ) } ),\n\t\t\tentryPoint: 'main'\n\t\t};\n\n\t}\n\n\t/**\n\t * Destroys the shader program of the given programmable stage.\n\t *\n\t * @param {ProgrammableStage} program - The programmable stage.\n\t */\n\tdestroyProgram( program ) {\n\n\t\tthis.delete( program );\n\n\t}\n\n\t// pipelines\n\n\t/**\n\t * Creates a render pipeline for the given render object.\n\t *\n\t * @param {RenderObject} renderObject - The render object.\n\t * @param {Array<Promise>} promises - An array of compilation promises which are used in `compileAsync()`.\n\t */\n\tcreateRenderPipeline( renderObject, promises ) {\n\n\t\tthis.pipelineUtils.createRenderPipeline( renderObject, promises );\n\n\t}\n\n\t/**\n\t * Creates a compute pipeline for the given compute node.\n\t *\n\t * @param {ComputePipeline} computePipeline - The compute pipeline.\n\t * @param {Array<BindGroup>} bindings - The bindings.\n\t */\n\tcreateComputePipeline( computePipeline, bindings ) {\n\n\t\tthis.pipelineUtils.createComputePipeline( computePipeline, bindings );\n\n\t}\n\n\t/**\n\t * Prepares the state for encoding render bundles.\n\t *\n\t * @param {RenderContext} renderContext - The render context.\n\t */\n\tbeginBundle( renderContext ) {\n\n\t\tconst renderContextData = this.get( renderContext );\n\n\t\trenderContextData._currentPass = renderContextData.currentPass;\n\t\trenderContextData._currentSets = renderContextData.currentSets;\n\n\t\trenderContextData.currentSets = { attributes: {}, bindingGroups: [], pipeline: null, index: null };\n\t\trenderContextData.currentPass = this.pipelineUtils.createBundleEncoder( renderContext );\n\n\t}\n\n\t/**\n\t * After processing render bundles this method finalizes related work.\n\t *\n\t * @param {RenderContext} renderContext - The render context.\n\t * @param {RenderBundle} bundle - The render bundle.\n\t */\n\tfinishBundle( renderContext, bundle ) {\n\n\t\tconst renderContextData = this.get( renderContext );\n\n\t\tconst bundleEncoder = renderContextData.currentPass;\n\t\tconst bundleGPU = bundleEncoder.finish();\n\n\t\tthis.get( bundle ).bundleGPU = bundleGPU;\n\n\t\t// restore render pass state\n\n\t\trenderContextData.currentSets = renderContextData._currentSets;\n\t\trenderContextData.currentPass = renderContextData._currentPass;\n\n\t}\n\n\t/**\n\t * Adds a render bundle to the render context data.\n\t *\n\t * @param {RenderContext} renderContext - The render context.\n\t * @param {RenderBundle} bundle - The render bundle to add.\n\t */\n\taddBundle( renderContext, bundle ) {\n\n\t\tconst renderContextData = this.get( renderContext );\n\n\t\trenderContextData.renderBundles.push( this.get( bundle ).bundleGPU );\n\n\t}\n\n\t// bindings\n\n\t/**\n\t * Creates bindings from the given bind group definition.\n\t *\n\t * @param {BindGroup} bindGroup - The bind group.\n\t * @param {Array<BindGroup>} bindings - Array of bind groups.\n\t * @param {number} cacheIndex - The cache index.\n\t * @param {number} version - The version.\n\t */\n\tcreateBindings( bindGroup, bindings, cacheIndex, version ) {\n\n\t\tthis.bindingUtils.createBindings( bindGroup, bindings, cacheIndex, version );\n\n\t}\n\n\t/**\n\t * Updates the given bind group definition.\n\t *\n\t * @param {BindGroup} bindGroup - The bind group.\n\t * @param {Array<BindGroup>} bindings - Array of bind groups.\n\t * @param {number} cacheIndex - The cache index.\n\t * @param {number} version - The version.\n\t */\n\tupdateBindings( bindGroup, bindings, cacheIndex, version ) {\n\n\t\tthis.bindingUtils.createBindings( bindGroup, bindings, cacheIndex, version );\n\n\t}\n\n\t/**\n\t * Updates a buffer binding.\n\t *\n\t *  @param {Buffer} binding - The buffer binding to update.\n\t */\n\tupdateBinding( binding ) {\n\n\t\tthis.bindingUtils.updateBinding( binding );\n\n\t}\n\n\t/**\n\t * Delete data associated with the current bind group.\n\t *\n\t * @param {BindGroup} bindGroup - The bind group.\n\t */\n\tdeleteBindGroupData( bindGroup ) {\n\n\t\tthis.bindingUtils.deleteBindGroupData( bindGroup );\n\n\t}\n\n\t// attributes\n\n\t/**\n\t * Creates the buffer of an indexed shader attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The indexed buffer attribute.\n\t */\n\tcreateIndexAttribute( attribute ) {\n\n\t\tlet usage = GPUBufferUsage.INDEX | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST;\n\n\t\tif ( attribute.isStorageBufferAttribute || attribute.isStorageInstancedBufferAttribute ) {\n\n\t\t\tusage |= GPUBufferUsage.STORAGE;\n\n\t\t}\n\n\t\tthis.attributeUtils.createAttribute( attribute, usage );\n\n\t}\n\n\t/**\n\t * Creates the GPU buffer of a shader attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute.\n\t */\n\tcreateAttribute( attribute ) {\n\n\t\tthis.attributeUtils.createAttribute( attribute, GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST );\n\n\t}\n\n\t/**\n\t * Creates the GPU buffer of a storage attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute.\n\t */\n\tcreateStorageAttribute( attribute ) {\n\n\t\tthis.attributeUtils.createAttribute( attribute, GPUBufferUsage.STORAGE | GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST );\n\n\t}\n\n\t/**\n\t * Creates the GPU buffer of an indirect storage attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute.\n\t */\n\tcreateIndirectStorageAttribute( attribute ) {\n\n\t\tthis.attributeUtils.createAttribute( attribute, GPUBufferUsage.STORAGE | GPUBufferUsage.INDIRECT | GPUBufferUsage.COPY_SRC | GPUBufferUsage.COPY_DST );\n\n\t}\n\n\t/**\n\t * Updates the GPU buffer of a shader attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute to update.\n\t */\n\tupdateAttribute( attribute ) {\n\n\t\tthis.attributeUtils.updateAttribute( attribute );\n\n\t}\n\n\t/**\n\t * Destroys the GPU buffer of a shader attribute.\n\t *\n\t * @param {BufferAttribute} attribute - The buffer attribute to destroy.\n\t */\n\tdestroyAttribute( attribute ) {\n\n\t\tthis.attributeUtils.destroyAttribute( attribute );\n\n\t}\n\n\t// canvas\n\n\t/**\n\t * Triggers an update of the default render pass descriptor.\n\t */\n\tupdateSize() {\n\n\t\tthis.delete( this.renderer.getCanvasTarget() );\n\n\t}\n\n\t// utils public\n\n\t/**\n\t * Returns the maximum anisotropy texture filtering value.\n\t *\n\t * @return {number} The maximum anisotropy texture filtering value.\n\t */\n\tgetMaxAnisotropy() {\n\n\t\treturn 16;\n\n\t}\n\n\t/**\n\t * Checks if the given feature is supported by the backend.\n\t *\n\t * @param {string} name - The feature's name.\n\t * @return {boolean} Whether the feature is supported or not.\n\t */\n\thasFeature( name ) {\n\n\t\tif ( GPUFeatureMap[ name ] !== undefined ) name = GPUFeatureMap[ name ];\n\n\t\treturn this.device.features.has( name );\n\n\t}\n\n\t/**\n\t * Copies data of the given source texture to the given destination texture.\n\t *\n\t * @param {Texture} srcTexture - The source texture.\n\t * @param {Texture} dstTexture - The destination texture.\n\t * @param {?(Box3|Box2)} [srcRegion=null] - The region of the source texture to copy.\n\t * @param {?(Vector2|Vector3)} [dstPosition=null] - The destination position of the copy.\n\t * @param {number} [srcLevel=0] - The mipmap level to copy.\n\t * @param {number} [dstLevel=0] - The destination mip level to copy to.\n\t */\n\tcopyTextureToTexture( srcTexture, dstTexture, srcRegion = null, dstPosition = null, srcLevel = 0, dstLevel = 0 ) {\n\n\t\tlet dstX = 0;\n\t\tlet dstY = 0;\n\t\tlet dstZ = 0;\n\n\t\tlet srcX = 0;\n\t\tlet srcY = 0;\n\t\tlet srcZ = 0;\n\n\t\tlet srcWidth = srcTexture.image.width;\n\t\tlet srcHeight = srcTexture.image.height;\n\t\tlet srcDepth = 1;\n\n\n\t\tif ( srcRegion !== null ) {\n\n\t\t\tif ( srcRegion.isBox3 === true ) {\n\n\t\t\t\tsrcX = srcRegion.min.x;\n\t\t\t\tsrcY = srcRegion.min.y;\n\t\t\t\tsrcZ = srcRegion.min.z;\n\t\t\t\tsrcWidth = srcRegion.max.x - srcRegion.min.x;\n\t\t\t\tsrcHeight = srcRegion.max.y - srcRegion.min.y;\n\t\t\t\tsrcDepth = srcRegion.max.z - srcRegion.min.z;\n\n\t\t\t} else {\n\n\t\t\t\t// Assume it's a Box2\n\t\t\t\tsrcX = srcRegion.min.x;\n\t\t\t\tsrcY = srcRegion.min.y;\n\t\t\t\tsrcWidth = srcRegion.max.x - srcRegion.min.x;\n\t\t\t\tsrcHeight = srcRegion.max.y - srcRegion.min.y;\n\t\t\t\tsrcDepth = 1;\n\n\t\t\t}\n\n\t\t}\n\n\n\t\tif ( dstPosition !== null ) {\n\n\t\t\tdstX = dstPosition.x;\n\t\t\tdstY = dstPosition.y;\n\t\t\tdstZ = dstPosition.z || 0;\n\n\t\t}\n\n\t\tconst encoder = this.device.createCommandEncoder( { label: 'copyTextureToTexture_' + srcTexture.id + '_' + dstTexture.id } );\n\n\t\tconst sourceGPU = this.get( srcTexture ).texture;\n\t\tconst destinationGPU = this.get( dstTexture ).texture;\n\n\t\tencoder.copyTextureToTexture(\n\t\t\t{\n\t\t\t\ttexture: sourceGPU,\n\t\t\t\tmipLevel: srcLevel,\n\t\t\t\torigin: { x: srcX, y: srcY, z: srcZ }\n\t\t\t},\n\t\t\t{\n\t\t\t\ttexture: destinationGPU,\n\t\t\t\tmipLevel: dstLevel,\n\t\t\t\torigin: { x: dstX, y: dstY, z: dstZ }\n\t\t\t},\n\t\t\t[\n\t\t\t\tsrcWidth,\n\t\t\t\tsrcHeight,\n\t\t\t\tsrcDepth\n\t\t\t]\n\t\t);\n\n\t\tthis.device.queue.submit( [ encoder.finish() ] );\n\n\t\tif ( dstLevel === 0 && dstTexture.generateMipmaps ) {\n\n\t\t\tthis.textureUtils.generateMipmaps( dstTexture );\n\n\t\t}\n\n\t}\n\n\t/**\n\t * Copies the current bound framebuffer to the given texture.\n\t *\n\t * @param {Texture} texture - The destination texture.\n\t * @param {RenderContext} renderContext - The render context.\n\t * @param {Vector4} rectangle - A four dimensional vector defining the origin and dimension of the copy.\n\t */\n\tcopyFramebufferToTexture( texture, renderContext, rectangle ) {\n\n\t\tconst renderContextData = this.get( renderContext );\n\n\t\tlet sourceGPU = null;\n\n\t\tif ( renderContext.renderTarget ) {\n\n\t\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t\tsourceGPU = this.get( renderContext.depthTexture ).texture;\n\n\t\t\t} else {\n\n\t\t\t\tsourceGPU = this.get( renderContext.textures[ 0 ] ).texture;\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tif ( texture.isDepthTexture ) {\n\n\t\t\t\tsourceGPU = this.textureUtils.getDepthBuffer( renderContext.depth, renderContext.stencil );\n\n\t\t\t} else {\n\n\t\t\t\tsourceGPU = this.context.getCurrentTexture();\n\n\t\t\t}\n\n\t\t}\n\n\t\tconst destinationGPU = this.get( texture ).texture;\n\n\t\tif ( sourceGPU.format !== destinationGPU.format ) {\n\n\t\t\terror( 'WebGPUBackend: copyFramebufferToTexture: Source and destination formats do not match.', sourceGPU.format, destinationGPU.format );\n\n\t\t\treturn;\n\n\t\t}\n\n\t\tlet encoder;\n\n\t\tif ( renderContextData.currentPass ) {\n\n\t\t\trenderContextData.currentPass.end();\n\n\t\t\tencoder = renderContextData.encoder;\n\n\t\t} else {\n\n\t\t\tencoder = this.device.createCommandEncoder( { label: 'copyFramebufferToTexture_' + texture.id } );\n\n\t\t}\n\n\t\tencoder.copyTextureToTexture(\n\t\t\t{\n\t\t\t\ttexture: sourceGPU,\n\t\t\t\torigin: [ rectangle.x, rectangle.y, 0 ],\n\t\t\t},\n\t\t\t{\n\t\t\t\ttexture: destinationGPU\n\t\t\t},\n\t\t\t[\n\t\t\t\trectangle.z,\n\t\t\t\trectangle.w\n\t\t\t]\n\t\t);\n\n\t\t// mipmaps must be genereated with the same encoder otherwise the copied texture data\n\t\t// might be out-of-sync, see #31768\n\n\t\tif ( texture.generateMipmaps ) {\n\n\t\t\tthis.textureUtils.generateMipmaps( texture, encoder );\n\n\t\t}\n\n\t\tif ( renderContextData.currentPass ) {\n\n\t\t\tconst { descriptor } = renderContextData;\n\n\t\t\tfor ( let i = 0; i < descriptor.colorAttachments.length; i ++ ) {\n\n\t\t\t\tdescriptor.colorAttachments[ i ].loadOp = GPULoadOp.Load;\n\n\t\t\t}\n\n\t\t\tif ( renderContext.depth ) descriptor.depthStencilAttachment.depthLoadOp = GPULoadOp.Load;\n\t\t\tif ( renderContext.stencil ) descriptor.depthStencilAttachment.stencilLoadOp = GPULoadOp.Load;\n\n\t\t\trenderContextData.currentPass = encoder.beginRenderPass( descriptor );\n\t\t\trenderContextData.currentSets = { attributes: {}, bindingGroups: [], pipeline: null, index: null };\n\n\t\t\tif ( renderContext.viewport ) {\n\n\t\t\t\tthis.updateViewport( renderContext );\n\n\t\t\t}\n\n\t\t\tif ( renderContext.scissor ) {\n\n\t\t\t\tthis.updateScissor( renderContext );\n\n\t\t\t}\n\n\t\t} else {\n\n\t\t\tthis.device.queue.submit( [ encoder.finish() ] );\n\n\t\t}\n\n\t}\n\n\tdispose() {\n\n\t\tthis.bindingUtils.dispose();\n\t\tthis.textureUtils.dispose();\n\n\t\tif ( this.occludedResolveCache ) {\n\n\t\t\tfor ( const buffer of this.occludedResolveCache.values() ) {\n\n\t\t\t\tbuffer.destroy();\n\n\t\t\t}\n\n\t\t\tthis.occludedResolveCache.clear();\n\n\t\t}\n\n\t\tif ( this.timestampQueryPool ) {\n\n\t\t\tfor ( const queryPool of Object.values( this.timestampQueryPool ) ) {\n\n\t\t\t\tif ( queryPool !== null ) queryPool.dispose();\n\n\t\t\t}\n\n\t\t}\n\n\t\tif ( this.parameters.device === undefined && this.device !== null ) {\n\n\t\t\tthis.device.destroy();\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * A IES version of {@link SpotLight}. Can only be used with {@link WebGPURenderer}.\n *\n * @augments SpotLight\n */\nclass IESSpotLight extends SpotLight {\n\n\t/**\n\t * Constructs a new IES spot light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity measured in candela (cd).\n\t * @param {number} [distance=0] - Maximum range of the light. `0` means no limit.\n\t * @param {number} [angle=Math.PI/3] - Maximum angle of light dispersion from its direction whose upper bound is `Math.PI/2`.\n\t * @param {number} [penumbra=0] - Percent of the spotlight cone that is attenuated due to penumbra. Value range is `[0,1]`.\n\t * @param {number} [decay=2] - The amount the light dims along the distance of the light.\n\t */\n\tconstructor( color, intensity, distance, angle, penumbra, decay ) {\n\n\t\tsuper( color, intensity, distance, angle, penumbra, decay );\n\n\t\t/**\n\t\t * TODO\n\t\t *\n\t\t * @type {?Texture}\n\t\t * @default null\n\t\t */\n\t\tthis.iesMap = null;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.iesMap = source.iesMap;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * A projector light version of {@link SpotLight}. Can only be used with {@link WebGPURenderer}.\n *\n * @augments SpotLight\n */\nclass ProjectorLight extends SpotLight {\n\n\t/**\n\t * Constructs a new projector light.\n\t *\n\t * @param {(number|Color|string)} [color=0xffffff] - The light's color.\n\t * @param {number} [intensity=1] - The light's strength/intensity measured in candela (cd).\n\t * @param {number} [distance=0] - Maximum range of the light. `0` means no limit.\n\t * @param {number} [angle=Math.PI/3] - Maximum angle of light dispersion from its direction whose upper bound is `Math.PI/2`.\n\t * @param {number} [penumbra=0] - Percent of the spotlight cone that is attenuated due to penumbra. Value range is `[0,1]`.\n\t * @param {number} [decay=2] - The amount the light dims along the distance of the light.\n\t */\n\tconstructor( color, intensity, distance, angle, penumbra, decay ) {\n\n\t\tsuper( color, intensity, distance, angle, penumbra, decay );\n\n\t\t/**\n\t\t * Aspect ratio of the light. Set to `null` to use the texture aspect ratio.\n\t\t *\n\t\t * @type {?number}\n\t\t * @default null\n\t\t */\n\t\tthis.aspect = null;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.aspect = source.aspect;\n\n\t\treturn this;\n\n\t}\n\n}\n\n/**\n * This version of a node library represents the standard version\n * used in {@link WebGPURenderer}. It maps lights, tone mapping\n * techniques and materials to node-based implementations.\n *\n * @private\n * @augments NodeLibrary\n */\nclass StandardNodeLibrary extends NodeLibrary {\n\n\t/**\n\t * Constructs a new standard node library.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.addMaterial( MeshPhongNodeMaterial, 'MeshPhongMaterial' );\n\t\tthis.addMaterial( MeshStandardNodeMaterial, 'MeshStandardMaterial' );\n\t\tthis.addMaterial( MeshPhysicalNodeMaterial, 'MeshPhysicalMaterial' );\n\t\tthis.addMaterial( MeshToonNodeMaterial, 'MeshToonMaterial' );\n\t\tthis.addMaterial( MeshBasicNodeMaterial, 'MeshBasicMaterial' );\n\t\tthis.addMaterial( MeshLambertNodeMaterial, 'MeshLambertMaterial' );\n\t\tthis.addMaterial( MeshNormalNodeMaterial, 'MeshNormalMaterial' );\n\t\tthis.addMaterial( MeshMatcapNodeMaterial, 'MeshMatcapMaterial' );\n\t\tthis.addMaterial( LineBasicNodeMaterial, 'LineBasicMaterial' );\n\t\tthis.addMaterial( LineDashedNodeMaterial, 'LineDashedMaterial' );\n\t\tthis.addMaterial( PointsNodeMaterial, 'PointsMaterial' );\n\t\tthis.addMaterial( SpriteNodeMaterial, 'SpriteMaterial' );\n\t\tthis.addMaterial( ShadowNodeMaterial, 'ShadowMaterial' );\n\n\t\tthis.addLight( PointLightNode, PointLight );\n\t\tthis.addLight( DirectionalLightNode, DirectionalLight );\n\t\tthis.addLight( RectAreaLightNode, RectAreaLight );\n\t\tthis.addLight( SpotLightNode, SpotLight );\n\t\tthis.addLight( AmbientLightNode, AmbientLight );\n\t\tthis.addLight( HemisphereLightNode, HemisphereLight );\n\t\tthis.addLight( LightProbeNode, LightProbe );\n\t\tthis.addLight( IESSpotLightNode, IESSpotLight );\n\t\tthis.addLight( ProjectorLightNode, ProjectorLight );\n\n\t\tthis.addToneMapping( linearToneMapping, LinearToneMapping );\n\t\tthis.addToneMapping( reinhardToneMapping, ReinhardToneMapping );\n\t\tthis.addToneMapping( cineonToneMapping, CineonToneMapping );\n\t\tthis.addToneMapping( acesFilmicToneMapping, ACESFilmicToneMapping );\n\t\tthis.addToneMapping( agxToneMapping, AgXToneMapping );\n\t\tthis.addToneMapping( neutralToneMapping, NeutralToneMapping );\n\n\t}\n\n}\n\n/*\nconst debugHandler = {\n\n\tget: function ( target, name ) {\n\n\t\t// Add |update\n\t\tif ( /^(create|destroy)/.test( name ) ) log( 'WebGPUBackend.' + name );\n\n\t\treturn target[ name ];\n\n\t}\n\n};\n*/\n\n/**\n * This renderer is the new alternative of `WebGLRenderer`. `WebGPURenderer` has the ability\n * to target different backends. By default, the renderer tries to use a WebGPU backend if the\n * browser supports WebGPU. If not, `WebGPURenderer` falls backs to a WebGL 2 backend.\n *\n * @augments Renderer\n */\nclass WebGPURenderer extends Renderer {\n\n\t/**\n\t * WebGPURenderer options.\n\t *\n\t * @typedef {Object} WebGPURenderer~Options\n\t * @property {boolean} [logarithmicDepthBuffer=false] - Whether logarithmic depth buffer is enabled or not.\n\t * @property {boolean} [alpha=true] - Whether the default framebuffer (which represents the final contents of the canvas) should be transparent or opaque.\n\t * @property {boolean} [depth=true] - Whether the default framebuffer should have a depth buffer or not.\n\t * @property {boolean} [stencil=false] - Whether the default framebuffer should have a stencil buffer or not.\n\t * @property {boolean} [antialias=false] - Whether MSAA as the default anti-aliasing should be enabled or not.\n\t * @property {number} [samples=0] - When `antialias` is `true`, `4` samples are used by default. Set this parameter to any other integer value than 0 to overwrite the default.\n\t * @property {boolean} [forceWebGL=false] - If set to `true`, the renderer uses a WebGL 2 backend no matter if WebGPU is supported or not.\n\t * @property {boolean} [multiview=false] - If set to `true`, the renderer will use multiview during WebXR rendering if supported.\n\t * @property {number} [outputType=undefined] - Texture type for output to canvas. By default, device's preferred format is used; other formats may incur overhead.\n\t * @property {number} [outputBufferType=HalfFloatType] - Defines the type of output buffers. The default `HalfFloatType` is recommend for best\n\t * quality. To save memory and bandwidth, `UnsignedByteType` might be used. This will reduce rendering quality though.\n\t */\n\n\t/**\n\t * Constructs a new WebGPU renderer.\n\t *\n\t * @param {WebGPURenderer~Options} [parameters] - The configuration parameter.\n\t */\n\tconstructor( parameters = {} ) {\n\n\t\tlet BackendClass;\n\n\t\tif ( parameters.forceWebGL ) {\n\n\t\t\tBackendClass = WebGLBackend;\n\n\t\t} else {\n\n\t\t\tBackendClass = WebGPUBackend;\n\n\t\t\tparameters.getFallback = () => {\n\n\t\t\t\twarn( 'WebGPURenderer: WebGPU is not available, running under WebGL2 backend.' );\n\n\t\t\t\treturn new WebGLBackend( parameters );\n\n\t\t\t};\n\n\t\t}\n\n\t\tconst backend = new BackendClass( parameters );\n\n\t\t//super( new Proxy( backend, debugHandler ) );\n\t\tsuper( backend, parameters );\n\n\t\t/**\n\t\t * The generic default value is overwritten with the\n\t\t * standard node library for type mapping.\n\t\t *\n\t\t * @type {StandardNodeLibrary}\n\t\t */\n\t\tthis.library = new StandardNodeLibrary();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isWebGPURenderer = true;\n\n\t\tif ( typeof __THREE_DEVTOOLS__ !== 'undefined' ) {\n\n\t\t\t__THREE_DEVTOOLS__.dispatchEvent( new CustomEvent( 'observe', { detail: this } ) );\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * A specialized group which enables applications access to the\n * Render Bundle API of WebGPU. The group with all its descendant nodes\n * are considered as one render bundle and processed as such by\n * the renderer.\n *\n * This module is only fully supported by `WebGPURenderer` with a WebGPU backend.\n * With a WebGL backend, the group can technically be rendered but without\n * any performance improvements.\n *\n * @augments Group\n */\nclass BundleGroup extends Group {\n\n\t/**\n\t * Constructs a new bundle group.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isBundleGroup = true;\n\n\t\t/**\n\t\t * This property is only relevant for detecting types\n\t\t * during serialization/deserialization. It should always\n\t\t * match the class name.\n\t\t *\n\t\t * @type {string}\n\t\t * @readonly\n\t\t * @default 'BundleGroup'\n\t\t */\n\t\tthis.type = 'BundleGroup';\n\n\t\t/**\n\t\t * Whether the bundle is static or not. When set to `true`, the structure\n\t\t * is assumed to be static and does not change. E.g. no new objects are\n\t\t * added to the group\n\t\t *\n\t\t * If a change is required, an update can still be forced by setting the\n\t\t * `needsUpdate` flag to `true`.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.static = true;\n\n\t\t/**\n\t\t * The bundle group's version.\n\t\t *\n\t\t * @type {number}\n\t\t * @readonly\n\t\t * @default 0\n\t\t */\n\t\tthis.version = 0;\n\n\t}\n\n\t/**\n\t * Set this property to `true` when the bundle group has changed.\n\t *\n\t * @type {boolean}\n\t * @default false\n\t * @param {boolean} value\n\t */\n\tset needsUpdate( value ) {\n\n\t\tif ( value === true ) this.version ++;\n\n\t}\n\n}\n\n/**\n * This module is responsible to manage the post processing setups in apps.\n * You usually create a single instance of this class and use it to define\n * the output of your post processing effect chain.\n * ```js\n * const postProcessing = new PostProcessing( renderer );\n *\n * const scenePass = pass( scene, camera );\n *\n * postProcessing.outputNode = scenePass;\n * ```\n *\n * Note: This module can only be used with `WebGPURenderer`.\n */\nclass PostProcessing {\n\n\t/**\n\t * Constructs a new post processing management module.\n\t *\n\t * @param {Renderer} renderer - A reference to the renderer.\n\t * @param {Node<vec4>} outputNode - An optional output node.\n\t */\n\tconstructor( renderer, outputNode = vec4( 0, 0, 1, 1 ) ) {\n\n\t\t/**\n\t\t * A reference to the renderer.\n\t\t *\n\t\t * @type {Renderer}\n\t\t */\n\t\tthis.renderer = renderer;\n\n\t\t/**\n\t\t * A node which defines the final output of the post\n\t\t * processing. This is usually the last node in a chain\n\t\t * of effect nodes.\n\t\t *\n\t\t * @type {Node<vec4>}\n\t\t */\n\t\tthis.outputNode = outputNode;\n\n\t\t/**\n\t\t * Whether the default output tone mapping and color\n\t\t * space transformation should be enabled or not.\n\t\t *\n\t\t * It is enabled by default by it must be disabled when\n\t\t * effects must be executed after tone mapping and color\n\t\t * space conversion. A typical example is FXAA which\n\t\t * requires sRGB input.\n\t\t *\n\t\t * When set to `false`, the app must control the output\n\t\t * transformation with `RenderOutputNode`.\n\t\t *\n\t\t * ```js\n\t\t * const outputPass = renderOutput( scenePass );\n\t\t * ```\n\t\t *\n\t\t * @type {boolean}\n\t\t */\n\t\tthis.outputColorTransform = true;\n\n\t\t/**\n\t\t * Must be set to `true` when the output node changes.\n\t\t *\n\t\t * @type {Node<vec4>}\n\t\t */\n\t\tthis.needsUpdate = true;\n\n\t\tconst material = new NodeMaterial();\n\t\tmaterial.name = 'PostProcessing';\n\n\t\t/**\n\t\t * The full screen quad that is used to render\n\t\t * the effects.\n\t\t *\n\t\t * @private\n\t\t * @type {QuadMesh}\n\t\t */\n\t\tthis._quadMesh = new QuadMesh( material );\n\t\tthis._quadMesh.name = 'Post-Processing';\n\n\t\t/**\n\t\t * The context of the post processing stack.\n\t\t *\n\t\t * @private\n\t\t * @type {?Object}\n\t\t * @default null\n\t\t */\n\t\tthis._context = null;\n\n\t}\n\n\t/**\n\t * When `PostProcessing` is used to apply post processing effects,\n\t * the application must use this version of `render()` inside\n\t * its animation loop (not the one from the renderer).\n\t */\n\trender() {\n\n\t\tconst renderer = this.renderer;\n\n\t\tthis._update();\n\n\t\tif ( this._context.onBeforePostProcessing !== null ) this._context.onBeforePostProcessing();\n\n\t\tconst toneMapping = renderer.toneMapping;\n\t\tconst outputColorSpace = renderer.outputColorSpace;\n\n\t\trenderer.toneMapping = NoToneMapping;\n\t\trenderer.outputColorSpace = ColorManagement.workingColorSpace;\n\n\t\t//\n\n\t\tconst currentXR = renderer.xr.enabled;\n\t\trenderer.xr.enabled = false;\n\n\t\tthis._quadMesh.render( renderer );\n\n\t\trenderer.xr.enabled = currentXR;\n\n\t\t//\n\n\t\trenderer.toneMapping = toneMapping;\n\t\trenderer.outputColorSpace = outputColorSpace;\n\n\t\tif ( this._context.onAfterPostProcessing !== null ) this._context.onAfterPostProcessing();\n\n\t}\n\n\t/**\n\t * Returns the current context of the post processing stack.\n\t *\n\t * @readonly\n\t * @type {?Object}\n\t */\n\tget context() {\n\n\t\treturn this._context;\n\n\t}\n\n\t/**\n\t * Frees internal resources.\n\t */\n\tdispose() {\n\n\t\tthis._quadMesh.material.dispose();\n\n\t}\n\n\t/**\n\t * Updates the state of the module.\n\t *\n\t * @private\n\t */\n\t_update() {\n\n\t\tif ( this.needsUpdate === true ) {\n\n\t\t\tconst renderer = this.renderer;\n\n\t\t\tconst toneMapping = renderer.toneMapping;\n\t\t\tconst outputColorSpace = renderer.outputColorSpace;\n\n\t\t\tconst context = {\n\t\t\t\tpostProcessing: this,\n\t\t\t\tonBeforePostProcessing: null,\n\t\t\t\tonAfterPostProcessing: null\n\t\t\t};\n\n\t\t\tlet outputNode = this.outputNode;\n\n\t\t\tif ( this.outputColorTransform === true ) {\n\n\t\t\t\toutputNode = outputNode.context( context );\n\n\t\t\t\toutputNode = renderOutput( outputNode, toneMapping, outputColorSpace );\n\n\t\t\t} else {\n\n\t\t\t\tcontext.toneMapping = toneMapping;\n\t\t\t\tcontext.outputColorSpace = outputColorSpace;\n\n\t\t\t\toutputNode = outputNode.context( context );\n\n\t\t\t}\n\n\t\t\tthis._context = context;\n\n\t\t\tthis._quadMesh.material.fragmentNode = outputNode;\n\t\t\tthis._quadMesh.material.needsUpdate = true;\n\n\t\t\tthis.needsUpdate = false;\n\n\t\t}\n\n\t}\n\n\t/**\n\t * When `PostProcessing` is used to apply post processing effects,\n\t * the application must use this version of `renderAsync()` inside\n\t * its animation loop (not the one from the renderer).\n\t *\n\t * @async\n\t * @deprecated\n\t * @return {Promise} A Promise that resolves when the render has been finished.\n\t */\n\tasync renderAsync() {\n\n\t\twarnOnce( 'PostProcessing: \"renderAsync()\" has been deprecated. Use \"render()\" and \"await renderer.init();\" when creating the renderer.' ); // @deprecated r181\n\n\t\tawait this.renderer.init();\n\n\t\tthis.render();\n\n\t}\n\n}\n\n/**\n * This special type of texture is intended for compute shaders.\n * It can be used to compute the data of a texture with a compute shader.\n *\n * Note: This type of texture can only be used with `WebGPURenderer`\n * and a WebGPU backend.\n *\n * @augments Texture\n */\nclass StorageTexture extends Texture {\n\n\t/**\n\t * Constructs a new storage texture.\n\t *\n\t * @param {number} [width=1] - The storage texture's width.\n\t * @param {number} [height=1] - The storage texture's height.\n\t */\n\tconstructor( width = 1, height = 1 ) {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * The image object which just represents the texture's dimension.\n\t\t *\n\t\t * @type {{width: number, height: number}}\n\t\t */\n\t\tthis.image = { width, height };\n\n\t\t/**\n\t\t * The default `magFilter` for storage textures is `THREE.LinearFilter`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.magFilter = LinearFilter;\n\n\t\t/**\n\t\t * The default `minFilter` for storage textures is `THREE.LinearFilter`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.minFilter = LinearFilter;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isStorageTexture = true;\n\n\t\t/**\n\t\t * When `true`, mipmaps will be auto-generated after compute writes.\n\t\t * When `false`, mipmaps must be written manually via compute shaders.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.mipmapsAutoUpdate = true;\n\n\t}\n\t/**\n\t * Sets the size of the storage texture.\n\t *\n\t * @param {number} width - The new width of the storage texture.\n\t * @param {number} height - The new height of the storage texture.\n\t */\n\tsetSize( width, height ) {\n\n\t\tif ( this.image.width !== width || this.image.height !== height ) {\n\n\t\t\tthis.image.width = width;\n\t\t\tthis.image.height = height;\n\n\t\t\tthis.dispose();\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * This special type of texture is intended for compute shaders.\n * It can be used to compute the data of a texture with a compute shader.\n *\n * Note: This type of texture can only be used with `WebGPURenderer`\n * and a WebGPU backend.\n *\n * @augments Texture\n */\nclass Storage3DTexture extends Texture {\n\n\t/**\n\t * Constructs a new storage texture.\n\t *\n\t * @param {number} [width=1] - The storage texture's width.\n\t * @param {number} [height=1] - The storage texture's height.\n\t * @param {number} [depth=1] - The storage texture's depth.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1 ) {\n\n\t\tsuper();\n\n\t\t//inherited from texture. Must be false for 3DTexture\n\t\tthis.isArrayTexture = false;\n\n\t\t/**\n\t\t * The image object which just represents the texture's dimension.\n\t\t *\n\t\t * @type {{width: number, height: number, depth: number}}\n\t\t */\n\t\tthis.image = { width, height, depth };\n\n\t\t/**\n\t\t * The default `magFilter` for storage textures is `THREE.LinearFilter`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.magFilter = LinearFilter;\n\n\t\t/**\n\t\t * The default `minFilter` for storage textures is `THREE.LinearFilter`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.minFilter = LinearFilter;\n\n\t\t/**\n\t\t * This defines how the texture is wrapped in the depth direction and corresponds to\n\t\t * *W* in UVW mapping.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.wrapR = ClampToEdgeWrapping;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isStorageTexture = true;\n\n\t\t/**\n\t\t * Indicates whether this texture is a 3D texture.\n\t\t *\n\t\t * @type {boolean}\n\t\t *\n\t\t */\n\t\tthis.is3DTexture = true;\n\n\t}\n\n\t/**\n\t * Sets the size of the storage 3d texture.\n\t *\n\t * @param {number} width - The new width of the storage texture.\n\t * @param {number} height - The new height of the storage texture.\n\t * @param {number} depth - The new depth of the storage texture.\n\t */\n\tsetSize( width, height, depth ) {\n\n\t\tif ( this.image.width !== width || this.image.height !== height || this.image.depth !== depth ) {\n\n\t\t\tthis.image.width = width;\n\t\t\tthis.image.height = height;\n\t\t\tthis.image.depth = depth;\n\n\t\t\tthis.dispose();\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * This special type of texture is intended for compute shaders.\n * It can be used to compute the data of a texture with a compute shader.\n *\n * Note: This type of texture can only be used with `WebGPURenderer`\n * and a WebGPU backend.\n *\n * @augments Texture\n */\nclass StorageArrayTexture extends Texture {\n\n\t/**\n\t * Constructs a new storage texture.\n\t *\n\t * @param {number} [width=1] - The storage texture's width.\n\t * @param {number} [height=1] - The storage texture's height.\n\t * @param {number} [depth=1] - The storage texture's depth.\n\t */\n\tconstructor( width = 1, height = 1, depth = 1 ) {\n\n\t\tsuper();\n\n\t\t//inherited from texture\n\t\tthis.isArrayTexture = true;\n\n\t\t/**\n\t\t * The image object which just represents the texture's dimension.\n\t\t *\n\t\t * @type {{width: number, height: number, depth: number}}\n\t\t */\n\t\tthis.image = { width, height, depth };\n\n\t\t/**\n\t\t * The default `magFilter` for storage textures is `THREE.LinearFilter`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.magFilter = LinearFilter;\n\n\t\t/**\n\t\t * The default `minFilter` for storage textures is `THREE.LinearFilter`.\n\t\t *\n\t\t * @type {number}\n\t\t */\n\t\tthis.minFilter = LinearFilter;\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isStorageTexture = true;\n\n\t}\n\n\t/**\n\t * Sets the size of the storage array texture.\n\t *\n\t * @param {number} width - The new width of the storage texture.\n\t * @param {number} height - The new height of the storage texture.\n\t * @param {number} depth - The new depth of the storage texture.\n\t */\n\tsetSize( width, height, depth ) {\n\n\t\tif ( this.image.width !== width || this.image.height !== height || this.image.depth !== depth ) {\n\n\t\t\tthis.image.width = width;\n\t\t\tthis.image.height = height;\n\t\t\tthis.image.depth = depth;\n\n\t\t\tthis.dispose();\n\n\t\t}\n\n\t}\n\n}\n\n/**\n * This special type of buffer attribute is intended for compute shaders.\n * It can be used to encode draw parameters for indirect draw calls.\n *\n * Note: This type of buffer attribute can only be used with `WebGPURenderer`\n * and a WebGPU backend.\n *\n * @augments StorageBufferAttribute\n */\nclass IndirectStorageBufferAttribute extends StorageBufferAttribute {\n\n\t/**\n\t * Constructs a new storage buffer attribute.\n\t *\n\t * @param {number|Uint32Array} count - The item count. It is also valid to pass a `Uint32Array` as an argument.\n\t * The subsequent parameter is then obsolete.\n\t * @param {number} itemSize - The item size.\n\t */\n\tconstructor( count, itemSize ) {\n\n\t\tsuper( count, itemSize, Uint32Array );\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isIndirectStorageBufferAttribute = true;\n\n\t}\n\n}\n\n/**\n * A loader for loading node objects in the three.js JSON Object/Scene format.\n *\n * @augments Loader\n */\nclass NodeLoader extends Loader {\n\n\t/**\n\t * Constructs a new node loader.\n\t *\n\t * @param {LoadingManager} [manager] - A reference to a loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * Represents a dictionary of textures.\n\t\t *\n\t\t * @type {Object<string,Texture>}\n\t\t */\n\t\tthis.textures = {};\n\n\t\t/**\n\t\t * Represents a dictionary of node types.\n\t\t *\n\t\t * @type {Object<string,Node.constructor>}\n\t\t */\n\t\tthis.nodes = {};\n\n\t}\n\n\t/**\n\t * Loads the node definitions from the given URL.\n\t *\n\t * @param {string} url - The path/URL of the file to be loaded.\n\t * @param {Function} onLoad - Will be called when load completes.\n\t * @param {Function} onProgress - Will be called while load progresses.\n\t * @param {Function} onError - Will be called when errors are thrown during the loading process.\n\t */\n\tload( url, onLoad, onProgress, onError ) {\n\n\t\tconst loader = new FileLoader( this.manager );\n\t\tloader.setPath( this.path );\n\t\tloader.setRequestHeader( this.requestHeader );\n\t\tloader.setWithCredentials( this.withCredentials );\n\t\tloader.load( url, ( text ) => {\n\n\t\t\ttry {\n\n\t\t\t\tonLoad( this.parse( JSON.parse( text ) ) );\n\n\t\t\t} catch ( e ) {\n\n\t\t\t\tif ( onError ) {\n\n\t\t\t\t\tonError( e );\n\n\t\t\t\t} else {\n\n\t\t\t\t\terror( e );\n\n\t\t\t\t}\n\n\t\t\t\tthis.manager.itemError( url );\n\n\t\t\t}\n\n\t\t}, onProgress, onError );\n\n\t}\n\n\t/**\n\t * Parse the node dependencies for the loaded node.\n\t *\n\t * @param {Array<Object>} [json] - The JSON definition\n\t * @return {Object<string,Node>} A dictionary with node dependencies.\n\t */\n\tparseNodes( json ) {\n\n\t\tconst nodes = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tfor ( const nodeJSON of json ) {\n\n\t\t\t\tconst { uuid, type } = nodeJSON;\n\n\t\t\t\tnodes[ uuid ] = this.createNodeFromType( type );\n\t\t\t\tnodes[ uuid ].uuid = uuid;\n\n\t\t\t}\n\n\t\t\tconst meta = { nodes, textures: this.textures };\n\n\t\t\tfor ( const nodeJSON of json ) {\n\n\t\t\t\tnodeJSON.meta = meta;\n\n\t\t\t\tconst node = nodes[ nodeJSON.uuid ];\n\t\t\t\tnode.deserialize( nodeJSON );\n\n\t\t\t\tdelete nodeJSON.meta;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn nodes;\n\n\t}\n\n\t/**\n\t * Parses the node from the given JSON.\n\t *\n\t * @param {Object} json - The JSON definition\n\t * @param {string} json.type - The node type.\n\t * @param {string} json.uuid - The node UUID.\n\t * @param {Array<Object>} [json.nodes] - The node dependencies.\n\t * @param {Object} [json.meta] - The meta data.\n\t * @return {Node} The parsed node.\n\t */\n\tparse( json ) {\n\n\t\tconst node = this.createNodeFromType( json.type );\n\t\tnode.uuid = json.uuid;\n\n\t\tconst nodes = this.parseNodes( json.nodes );\n\t\tconst meta = { nodes, textures: this.textures };\n\n\t\tjson.meta = meta;\n\n\t\tnode.deserialize( json );\n\n\t\tdelete json.meta;\n\n\t\treturn node;\n\n\t}\n\n\t/**\n\t * Defines the dictionary of textures.\n\t *\n\t * @param {Object<string,Texture>} value - The texture library defines as `<uuid,texture>`.\n\t * @return {NodeLoader} A reference to this loader.\n\t */\n\tsetTextures( value ) {\n\n\t\tthis.textures = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Defines the dictionary of node types.\n\t *\n\t * @param {Object<string,Node.constructor>} value - The node library defined as `<classname,class>`.\n\t * @return {NodeLoader} A reference to this loader.\n\t */\n\tsetNodes( value ) {\n\n\t\tthis.nodes = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a node object from the given type.\n\t *\n\t * @param {string} type - The node type.\n\t * @return {Node} The created node instance.\n\t */\n\tcreateNodeFromType( type ) {\n\n\t\tif ( this.nodes[ type ] === undefined ) {\n\n\t\t\terror( 'NodeLoader: Node type not found:', type );\n\t\t\treturn float();\n\n\t\t}\n\n\t\treturn new this.nodes[ type ]();\n\n\t}\n\n}\n\n/**\n * A special type of material loader for loading node materials.\n *\n * @augments MaterialLoader\n */\nclass NodeMaterialLoader extends MaterialLoader {\n\n\t/**\n\t * Constructs a new node material loader.\n\t *\n\t * @param {LoadingManager} [manager] - A reference to a loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * Represents a dictionary of node types.\n\t\t *\n\t\t * @type {Object<string,Node.constructor>}\n\t\t */\n\t\tthis.nodes = {};\n\n\t\t/**\n\t\t * Represents a dictionary of node material types.\n\t\t *\n\t\t * @type {Object<string,NodeMaterial.constructor>}\n\t\t */\n\t\tthis.nodeMaterials = {};\n\n\t}\n\n\t/**\n\t * Parses the node material from the given JSON.\n\t *\n\t * @param {Object} json - The JSON definition\n\t * @return {NodeMaterial}. The parsed material.\n\t */\n\tparse( json ) {\n\n\t\tconst material = super.parse( json );\n\n\t\tconst nodes = this.nodes;\n\t\tconst inputNodes = json.inputNodes;\n\n\t\tfor ( const property in inputNodes ) {\n\n\t\t\tconst uuid = inputNodes[ property ];\n\n\t\t\tmaterial[ property ] = nodes[ uuid ];\n\n\t\t}\n\n\t\treturn material;\n\n\t}\n\n\t/**\n\t * Defines the dictionary of node types.\n\t *\n\t * @param {Object<string,Node.constructor>} value - The node library defined as `<classname,class>`.\n\t * @return {NodeLoader} A reference to this loader.\n\t */\n\tsetNodes( value ) {\n\n\t\tthis.nodes = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Defines the dictionary of node material types.\n\t *\n\t * @param {Object<string,NodeMaterial.constructor>} value - The node material library defined as `<classname,class>`.\n\t * @return {NodeLoader} A reference to this loader.\n\t */\n\tsetNodeMaterials( value ) {\n\n\t\tthis.nodeMaterials = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Creates a node material from the given type.\n\t *\n\t * @param {string} type - The node material type.\n\t * @return {Node} The created node material instance.\n\t */\n\tcreateMaterialFromType( type ) {\n\n\t\tconst materialClass = this.nodeMaterials[ type ];\n\n\t\tif ( materialClass !== undefined ) {\n\n\t\t\treturn new materialClass();\n\n\t\t}\n\n\t\treturn super.createMaterialFromType( type );\n\n\t}\n\n}\n\n/**\n * A special type of object loader for loading 3D objects using\n * node materials.\n *\n * @augments ObjectLoader\n */\nclass NodeObjectLoader extends ObjectLoader {\n\n\t/**\n\t * Constructs a new node object loader.\n\t *\n\t * @param {LoadingManager} [manager] - A reference to a loading manager.\n\t */\n\tconstructor( manager ) {\n\n\t\tsuper( manager );\n\n\t\t/**\n\t\t * Represents a dictionary of node types.\n\t\t *\n\t\t * @type {Object<string,Node.constructor>}\n\t\t */\n\t\tthis.nodes = {};\n\n\t\t/**\n\t\t * Represents a dictionary of node material types.\n\t\t *\n\t\t * @type {Object<string,NodeMaterial.constructor>}\n\t\t */\n\t\tthis.nodeMaterials = {};\n\n\t\t/**\n\t\t * A reference to hold the `nodes` JSON property.\n\t\t *\n\t\t * @private\n\t\t * @type {?Object[]}\n\t\t */\n\t\tthis._nodesJSON = null;\n\n\t}\n\n\t/**\n\t * Defines the dictionary of node types.\n\t *\n\t * @param {Object<string,Node.constructor>} value - The node library defined as `<classname,class>`.\n\t * @return {NodeObjectLoader} A reference to this loader.\n\t */\n\tsetNodes( value ) {\n\n\t\tthis.nodes = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Defines the dictionary of node material types.\n\t *\n\t * @param {Object<string,NodeMaterial.constructor>} value - The node material library defined as `<classname,class>`.\n\t * @return {NodeObjectLoader} A reference to this loader.\n\t */\n\tsetNodeMaterials( value ) {\n\n\t\tthis.nodeMaterials = value;\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Parses the node objects from the given JSON.\n\t *\n\t * @param {Object} json - The JSON definition\n\t * @param {Function} onLoad - The onLoad callback function.\n\t * @return {Object3D}. The parsed 3D object.\n\t */\n\tparse( json, onLoad ) {\n\n\t\tthis._nodesJSON = json.nodes;\n\n\t\tconst data = super.parse( json, onLoad );\n\n\t\tthis._nodesJSON = null; // dispose\n\n\t\treturn data;\n\n\t}\n\n\t/**\n\t * Parses the node objects from the given JSON and textures.\n\t *\n\t * @param {Object[]} json - The JSON definition\n\t * @param {Object<string,Texture>} textures - The texture library.\n\t * @return {Object<string,Node>}. The parsed nodes.\n\t */\n\tparseNodes( json, textures ) {\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst loader = new NodeLoader();\n\t\t\tloader.setNodes( this.nodes );\n\t\t\tloader.setTextures( textures );\n\n\t\t\treturn loader.parseNodes( json );\n\n\t\t}\n\n\t\treturn {};\n\n\t}\n\n\t/**\n\t * Parses the node objects from the given JSON and textures.\n\t *\n\t * @param {Object} json - The JSON definition\n\t * @param {Object<string,Texture>} textures - The texture library.\n\t * @return {Object<string,NodeMaterial>}. The parsed materials.\n\t */\n\tparseMaterials( json, textures ) {\n\n\t\tconst materials = {};\n\n\t\tif ( json !== undefined ) {\n\n\t\t\tconst nodes = this.parseNodes( this._nodesJSON, textures );\n\n\t\t\tconst loader = new NodeMaterialLoader();\n\t\t\tloader.setTextures( textures );\n\t\t\tloader.setNodes( nodes );\n\t\t\tloader.setNodeMaterials( this.nodeMaterials );\n\n\t\t\tfor ( let i = 0, l = json.length; i < l; i ++ ) {\n\n\t\t\t\tconst data = json[ i ];\n\n\t\t\t\tmaterials[ data.uuid ] = loader.parse( data );\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn materials;\n\n\t}\n\n}\n\n/**\n * In earlier three.js versions, clipping was defined globally\n * on the renderer or on material level. This special version of\n * `THREE.Group` allows to encode the clipping state into the scene\n * graph. Meaning if you create an instance of this group, all\n * descendant 3D objects will be affected by the respective clipping\n * planes.\n *\n * Note: `ClippingGroup` can only be used with `WebGPURenderer`.\n *\n * @augments Group\n */\nclass ClippingGroup extends Group {\n\n\t/**\n\t * Constructs a new clipping group.\n\t */\n\tconstructor() {\n\n\t\tsuper();\n\n\t\t/**\n\t\t * This flag can be used for type testing.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @readonly\n\t\t * @default true\n\t\t */\n\t\tthis.isClippingGroup = true;\n\n\t\t/**\n\t\t * An array with clipping planes.\n\t\t *\n\t\t * @type {Array<Plane>}\n\t\t */\n\t\tthis.clippingPlanes = [];\n\n\t\t/**\n\t\t * Whether clipping should be enabled or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default true\n\t\t */\n\t\tthis.enabled = true;\n\n\t\t/**\n\t\t * Whether the intersection of the clipping planes is used to clip objects, rather than their union.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clipIntersection = false;\n\n\t\t/**\n\t\t * Whether shadows should be clipped or not.\n\t\t *\n\t\t * @type {boolean}\n\t\t * @default false\n\t\t */\n\t\tthis.clipShadows = false;\n\n\t}\n\n}\n\nexport { ACESFilmicToneMapping, AONode, AddEquation, AddOperation, AdditiveBlending, AgXToneMapping, AlphaFormat, AlwaysCompare, AlwaysDepth, AlwaysStencilFunc, AmbientLight, AmbientLightNode, AnalyticLightNode, ArrayCamera, ArrayElementNode, ArrayNode, AssignNode, AttributeNode, BackSide, BasicEnvironmentNode, BasicShadowMap, BatchNode, BitcastNode, BoxGeometry, BufferAttribute, BufferAttributeNode, BufferGeometry, BufferNode, BumpMapNode, BundleGroup, BypassNode, ByteType, Camera, CanvasTarget, CineonToneMapping, ClampToEdgeWrapping, ClippingGroup, CodeNode, Color, ColorManagement, ColorSpaceNode, ComputeNode, ConstNode, ContextNode, ConvertNode, CubeCamera, CubeDepthTexture, CubeReflectionMapping, CubeRefractionMapping, CubeTexture, CubeTextureNode, CubeUVReflectionMapping, CullFaceBack, CullFaceFront, CullFaceNone, CustomBlending, CylinderGeometry, DataArrayTexture, DataTexture, DebugNode, DecrementStencilOp, DecrementWrapStencilOp, DepthFormat, DepthStencilFormat, DepthTexture, DirectionalLight, DirectionalLightNode, DoubleSide, DstAlphaFactor, DstColorFactor, DynamicDrawUsage, EnvironmentNode, EqualCompare, EqualDepth, EqualStencilFunc, EquirectangularReflectionMapping, EquirectangularRefractionMapping, Euler, EventDispatcher, EventNode, ExpressionNode, FileLoader, Float16BufferAttribute, Float32BufferAttribute, FloatType, FramebufferTexture, FrontFacingNode, FrontSide, Frustum, FrustumArray, FunctionCallNode, FunctionNode, FunctionOverloadingNode, GLSLNodeParser, GreaterCompare, GreaterDepth, GreaterEqualCompare, GreaterEqualDepth, GreaterEqualStencilFunc, GreaterStencilFunc, Group, HalfFloatType, HemisphereLight, HemisphereLightNode, IESSpotLight, IESSpotLightNode, IncrementStencilOp, IncrementWrapStencilOp, IndexNode, IndirectStorageBufferAttribute, InspectorBase, InstanceNode, InstancedBufferAttribute, InstancedInterleavedBuffer, InstancedMeshNode, IntType, InterleavedBuffer, InterleavedBufferAttribute, InvertStencilOp, IrradianceNode, IsolateNode, JoinNode, KeepStencilOp, LessCompare, LessDepth, LessEqualCompare, LessEqualDepth, LessEqualStencilFunc, LessStencilFunc, LightProbe, LightProbeNode, Lighting, LightingContextNode, LightingModel, LightingNode, LightsNode, Line2NodeMaterial, LineBasicMaterial, LineBasicNodeMaterial, LineDashedMaterial, LineDashedNodeMaterial, LinearFilter, LinearMipMapLinearFilter, LinearMipmapLinearFilter, LinearMipmapNearestFilter, LinearSRGBColorSpace, LinearToneMapping, LinearTransfer, Loader, LoopNode, MRTNode, Material, MaterialLoader, MaterialNode, MaterialReferenceNode, MathUtils, Matrix2, Matrix3, Matrix4, MaxEquation, MaxMipLevelNode, MemberNode, Mesh, MeshBasicMaterial, MeshBasicNodeMaterial, MeshLambertMaterial, MeshLambertNodeMaterial, MeshMatcapMaterial, MeshMatcapNodeMaterial, MeshNormalMaterial, MeshNormalNodeMaterial, MeshPhongMaterial, MeshPhongNodeMaterial, MeshPhysicalMaterial, MeshPhysicalNodeMaterial, MeshSSSNodeMaterial, MeshStandardMaterial, MeshStandardNodeMaterial, MeshToonMaterial, MeshToonNodeMaterial, MinEquation, MirroredRepeatWrapping, MixOperation, ModelNode, MorphNode, MultiplyBlending, MultiplyOperation, NearestFilter, NearestMipmapLinearFilter, NearestMipmapNearestFilter, NeutralToneMapping, NeverCompare, NeverDepth, NeverStencilFunc, NoBlending, NoColorSpace, NoNormalPacking, NoToneMapping, Node, NodeAccess, NodeAttribute, NodeBuilder, NodeCache, NodeCode, NodeFrame, NodeFunctionInput, NodeLoader, NodeMaterial, NodeMaterialLoader, NodeMaterialObserver, NodeObjectLoader, NodeShaderStage, NodeType, NodeUniform, NodeUpdateType, NodeUtils, NodeVar, NodeVarying, NormalBlending, NormalGAPacking, NormalMapNode, NormalRGPacking, NotEqualCompare, NotEqualDepth, NotEqualStencilFunc, Object3D, Object3DNode, ObjectLoader, ObjectSpaceNormalMap, OneFactor, OneMinusDstAlphaFactor, OneMinusDstColorFactor, OneMinusSrcAlphaFactor, OneMinusSrcColorFactor, OrthographicCamera, OutputStructNode, PCFShadowMap, PMREMGenerator, PMREMNode, ParameterNode, PassNode, PerspectiveCamera, PhongLightingModel, PhysicalLightingModel, Plane, PlaneGeometry, PointLight, PointLightNode, PointUVNode, PointsMaterial, PointsNodeMaterial, PostProcessing, PosterizeNode, ProjectorLight, ProjectorLightNode, PropertyNode, QuadMesh, Quaternion, R11_EAC_Format, RED_GREEN_RGTC2_Format, RED_RGTC1_Format, REVISION, RG11_EAC_Format, RGBAFormat, RGBAIntegerFormat, RGBA_ASTC_10x10_Format, RGBA_ASTC_10x5_Format, RGBA_ASTC_10x6_Format, RGBA_ASTC_10x8_Format, RGBA_ASTC_12x10_Format, RGBA_ASTC_12x12_Format, RGBA_ASTC_4x4_Format, RGBA_ASTC_5x4_Format, RGBA_ASTC_5x5_Format, RGBA_ASTC_6x5_Format, RGBA_ASTC_6x6_Format, RGBA_ASTC_8x5_Format, RGBA_ASTC_8x6_Format, RGBA_ASTC_8x8_Format, RGBA_BPTC_Format, RGBA_ETC2_EAC_Format, RGBA_PVRTC_2BPPV1_Format, RGBA_PVRTC_4BPPV1_Format, RGBA_S3TC_DXT1_Format, RGBA_S3TC_DXT3_Format, RGBA_S3TC_DXT5_Format, RGBFormat, RGBIntegerFormat, RGB_ETC1_Format, RGB_ETC2_Format, RGB_PVRTC_2BPPV1_Format, RGB_PVRTC_4BPPV1_Format, RGB_S3TC_DXT1_Format, RGFormat, RGIntegerFormat, RTTNode, RangeNode, RectAreaLight, RectAreaLightNode, RedFormat, RedIntegerFormat, ReferenceNode, ReflectorNode, ReinhardToneMapping, RemapNode, RenderOutputNode, RenderTarget, RendererReferenceNode, RendererUtils, RepeatWrapping, ReplaceStencilOp, ReverseSubtractEquation, RotateNode, SIGNED_R11_EAC_Format, SIGNED_RED_GREEN_RGTC2_Format, SIGNED_RED_RGTC1_Format, SIGNED_RG11_EAC_Format, SRGBColorSpace, SRGBTransfer, Scene, SceneNode, ScreenNode, ScriptableNode, ScriptableValueNode, SetNode, ShadowBaseNode, ShadowMaterial, ShadowNode, ShadowNodeMaterial, ShortType, SkinningNode, Sphere, SphereGeometry, SplitNode, SpotLight, SpotLightNode, SpriteMaterial, SpriteNodeMaterial, SpriteSheetUVNode, SrcAlphaFactor, SrcAlphaSaturateFactor, SrcColorFactor, StackNode, StaticDrawUsage, Storage3DTexture, StorageArrayElementNode, StorageArrayTexture, StorageBufferAttribute, StorageBufferNode, StorageInstancedBufferAttribute, StorageTexture, StorageTextureNode, StructNode, StructTypeNode, SubBuildNode, SubtractEquation, SubtractiveBlending, TSL, TangentSpaceNormalMap, TempNode, Texture, Texture3DNode, TextureNode, TextureSizeNode, TimestampQuery, ToneMappingNode, ToonOutlinePassNode, UVMapping, Uint16BufferAttribute, Uint32BufferAttribute, UniformArrayNode, UniformGroupNode, UniformNode, UnsignedByteType, UnsignedInt101111Type, UnsignedInt248Type, UnsignedInt5999Type, UnsignedIntType, UnsignedShort4444Type, UnsignedShort5551Type, UnsignedShortType, UserDataNode, VSMShadowMap, VarNode, VaryingNode, Vector2, Vector3, Vector4, VertexColorNode, ViewportDepthNode, ViewportDepthTextureNode, ViewportSharedTextureNode, ViewportTextureNode, VolumeNodeMaterial, WebGLCoordinateSystem, WebGLCubeRenderTarget, WebGPUCoordinateSystem, WebGPURenderer, WebXRController, ZeroFactor, ZeroStencilOp, createCanvasElement, defaultBuildStages, defaultShaderStages, error, log$1 as log, shaderStages, vectorComponents, warn, warnOnce };\n", "/**\n * @license\n * Copyright 2010-2025 Three.js Authors\n * SPDX-License-Identifier: MIT\n */\nimport { TSL } from 'three/webgpu';\n\nconst BRDF_GGX = TSL.BRDF_GGX;\nconst BRDF_Lambert = TSL.BRDF_Lambert;\nconst BasicPointShadowFilter = TSL.BasicPointShadowFilter;\nconst BasicShadowFilter = TSL.BasicShadowFilter;\nconst Break = TSL.Break;\nconst Const = TSL.Const;\nconst Continue = TSL.Continue;\nconst DFGLUT = TSL.DFGLUT;\nconst D_GGX = TSL.D_GGX;\nconst Discard = TSL.Discard;\nconst EPSILON = TSL.EPSILON;\nconst F_Schlick = TSL.F_Schlick;\nconst Fn = TSL.Fn;\nconst INFINITY = TSL.INFINITY;\nconst If = TSL.If;\nconst Loop = TSL.Loop;\nconst NodeAccess = TSL.NodeAccess;\nconst NodeShaderStage = TSL.NodeShaderStage;\nconst NodeType = TSL.NodeType;\nconst NodeUpdateType = TSL.NodeUpdateType;\nconst PCFShadowFilter = TSL.PCFShadowFilter;\nconst PCFSoftShadowFilter = TSL.PCFSoftShadowFilter;\nconst PI = TSL.PI;\nconst PI2 = TSL.PI2;\nconst TWO_PI = TSL.TWO_PI;\nconst HALF_PI = TSL.HALF_PI;\nconst PointShadowFilter = TSL.PointShadowFilter;\nconst Return = TSL.Return;\nconst Schlick_to_F0 = TSL.Schlick_to_F0;\nconst ScriptableNodeResources = TSL.ScriptableNodeResources;\nconst ShaderNode = TSL.ShaderNode;\nconst Stack = TSL.Stack;\nconst Switch = TSL.Switch;\nconst TBNViewMatrix = TSL.TBNViewMatrix;\nconst VSMShadowFilter = TSL.VSMShadowFilter;\nconst V_GGX_SmithCorrelated = TSL.V_GGX_SmithCorrelated;\nconst Var = TSL.Var;\nconst VarIntent = TSL.VarIntent;\nconst abs = TSL.abs;\nconst acesFilmicToneMapping = TSL.acesFilmicToneMapping;\nconst acos = TSL.acos;\nconst add = TSL.add;\nconst addMethodChaining = TSL.addMethodChaining;\nconst addNodeElement = TSL.addNodeElement;\nconst agxToneMapping = TSL.agxToneMapping;\nconst all = TSL.all;\nconst alphaT = TSL.alphaT;\nconst and = TSL.and;\nconst anisotropy = TSL.anisotropy;\nconst anisotropyB = TSL.anisotropyB;\nconst anisotropyT = TSL.anisotropyT;\nconst any = TSL.any;\nconst append = TSL.append;\nconst array = TSL.array;\nconst arrayBuffer = TSL.arrayBuffer;\nconst asin = TSL.asin;\nconst assign = TSL.assign;\nconst atan = TSL.atan;\nconst atan2 = TSL.atan2;\nconst atomicAdd = TSL.atomicAdd;\nconst atomicAnd = TSL.atomicAnd;\nconst atomicFunc = TSL.atomicFunc;\nconst atomicLoad = TSL.atomicLoad;\nconst atomicMax = TSL.atomicMax;\nconst atomicMin = TSL.atomicMin;\nconst atomicOr = TSL.atomicOr;\nconst atomicStore = TSL.atomicStore;\nconst atomicSub = TSL.atomicSub;\nconst atomicXor = TSL.atomicXor;\nconst attenuationColor = TSL.attenuationColor;\nconst attenuationDistance = TSL.attenuationDistance;\nconst attribute = TSL.attribute;\nconst attributeArray = TSL.attributeArray;\nconst backgroundBlurriness = TSL.backgroundBlurriness;\nconst backgroundIntensity = TSL.backgroundIntensity;\nconst backgroundRotation = TSL.backgroundRotation;\nconst batch = TSL.batch;\nconst bentNormalView = TSL.bentNormalView;\nconst billboarding = TSL.billboarding;\nconst bitAnd = TSL.bitAnd;\nconst bitNot = TSL.bitNot;\nconst bitOr = TSL.bitOr;\nconst bitXor = TSL.bitXor;\nconst bitangentGeometry = TSL.bitangentGeometry;\nconst bitangentLocal = TSL.bitangentLocal;\nconst bitangentView = TSL.bitangentView;\nconst bitangentWorld = TSL.bitangentWorld;\nconst bitcast = TSL.bitcast;\nconst blendBurn = TSL.blendBurn;\nconst blendColor = TSL.blendColor;\nconst blendDodge = TSL.blendDodge;\nconst blendOverlay = TSL.blendOverlay;\nconst blendScreen = TSL.blendScreen;\nconst blur = TSL.blur;\nconst bool = TSL.bool;\nconst buffer = TSL.buffer;\nconst bufferAttribute = TSL.bufferAttribute;\nconst bumpMap = TSL.bumpMap;\nconst burn = TSL.burn;\nconst builtin = TSL.builtin;\nconst builtinAOContext = TSL.builtinAOContext;\nconst builtinShadowContext = TSL.builtinShadowContext;\nconst bvec2 = TSL.bvec2;\nconst bvec3 = TSL.bvec3;\nconst bvec4 = TSL.bvec4;\nconst bypass = TSL.bypass;\nconst cache = TSL.cache;\nconst call = TSL.call;\nconst cameraFar = TSL.cameraFar;\nconst cameraIndex = TSL.cameraIndex;\nconst cameraNear = TSL.cameraNear;\nconst cameraNormalMatrix = TSL.cameraNormalMatrix;\nconst cameraPosition = TSL.cameraPosition;\nconst cameraProjectionMatrix = TSL.cameraProjectionMatrix;\nconst cameraProjectionMatrixInverse = TSL.cameraProjectionMatrixInverse;\nconst cameraViewMatrix = TSL.cameraViewMatrix;\nconst cameraViewport = TSL.cameraViewport;\nconst cameraWorldMatrix = TSL.cameraWorldMatrix;\nconst cbrt = TSL.cbrt;\nconst cdl = TSL.cdl;\nconst ceil = TSL.ceil;\nconst checker = TSL.checker;\nconst cineonToneMapping = TSL.cineonToneMapping;\nconst clamp = TSL.clamp;\nconst clearcoat = TSL.clearcoat;\nconst clearcoatNormalView = TSL.clearcoatNormalView;\nconst clearcoatRoughness = TSL.clearcoatRoughness;\nconst code = TSL.code;\nconst color = TSL.color;\nconst colorSpaceToWorking = TSL.colorSpaceToWorking;\nconst colorToDirection = TSL.colorToDirection;\nconst compute = TSL.compute;\nconst computeKernel = TSL.computeKernel;\nconst computeSkinning = TSL.computeSkinning;\nconst context = TSL.context;\nconst convert = TSL.convert;\nconst convertColorSpace = TSL.convertColorSpace;\nconst convertToTexture = TSL.convertToTexture;\nconst countLeadingZeros = TSL.countLeadingZeros;\nconst countOneBits = TSL.countOneBits;\nconst countTrailingZeros = TSL.countTrailingZeros;\nconst cos = TSL.cos;\nconst cross = TSL.cross;\nconst cubeTexture = TSL.cubeTexture;\nconst cubeTextureBase = TSL.cubeTextureBase;\nconst dFdx = TSL.dFdx;\nconst dFdy = TSL.dFdy;\nconst dashSize = TSL.dashSize;\nconst debug = TSL.debug;\nconst decrement = TSL.decrement;\nconst decrementBefore = TSL.decrementBefore;\nconst defaultBuildStages = TSL.defaultBuildStages;\nconst defaultShaderStages = TSL.defaultShaderStages;\nconst defined = TSL.defined;\nconst degrees = TSL.degrees;\nconst deltaTime = TSL.deltaTime;\nconst densityFog = TSL.densityFog;\nconst densityFogFactor = TSL.densityFogFactor;\nconst depth = TSL.depth;\nconst depthPass = TSL.depthPass;\nconst determinant = TSL.determinant;\nconst difference = TSL.difference;\nconst diffuseColor = TSL.diffuseColor;\nconst directPointLight = TSL.directPointLight;\nconst directionToColor = TSL.directionToColor;\nconst directionToFaceDirection = TSL.directionToFaceDirection;\nconst dispersion = TSL.dispersion;\nconst distance = TSL.distance;\nconst div = TSL.div;\nconst dodge = TSL.dodge;\nconst dot = TSL.dot;\nconst drawIndex = TSL.drawIndex;\nconst dynamicBufferAttribute = TSL.dynamicBufferAttribute;\nconst element = TSL.element;\nconst emissive = TSL.emissive;\nconst equal = TSL.equal;\nconst equals = TSL.equals;\nconst equirectUV = TSL.equirectUV;\nconst exp = TSL.exp;\nconst exp2 = TSL.exp2;\nconst expression = TSL.expression;\nconst faceDirection = TSL.faceDirection;\nconst faceForward = TSL.faceForward;\nconst faceforward = TSL.faceforward;\nconst float = TSL.float;\nconst floatBitsToInt = TSL.floatBitsToInt;\nconst floatBitsToUint = TSL.floatBitsToUint;\nconst floor = TSL.floor;\nconst fog = TSL.fog;\nconst fract = TSL.fract;\nconst frameGroup = TSL.frameGroup;\nconst frameId = TSL.frameId;\nconst frontFacing = TSL.frontFacing;\nconst fwidth = TSL.fwidth;\nconst gain = TSL.gain;\nconst gapSize = TSL.gapSize;\nconst getConstNodeType = TSL.getConstNodeType;\nconst getCurrentStack = TSL.getCurrentStack;\nconst getDirection = TSL.getDirection;\nconst getDistanceAttenuation = TSL.getDistanceAttenuation;\nconst getGeometryRoughness = TSL.getGeometryRoughness;\nconst getNormalFromDepth = TSL.getNormalFromDepth;\nconst interleavedGradientNoise = TSL.interleavedGradientNoise;\nconst vogelDiskSample = TSL.vogelDiskSample;\nconst getParallaxCorrectNormal = TSL.getParallaxCorrectNormal;\nconst getRoughness = TSL.getRoughness;\nconst getScreenPosition = TSL.getScreenPosition;\nconst getShIrradianceAt = TSL.getShIrradianceAt;\nconst getShadowMaterial = TSL.getShadowMaterial;\nconst getShadowRenderObjectFunction = TSL.getShadowRenderObjectFunction;\nconst getTextureIndex = TSL.getTextureIndex;\nconst getViewPosition = TSL.getViewPosition;\nconst globalId = TSL.globalId;\nconst glsl = TSL.glsl;\nconst glslFn = TSL.glslFn;\nconst grayscale = TSL.grayscale;\nconst greaterThan = TSL.greaterThan;\nconst greaterThanEqual = TSL.greaterThanEqual;\nconst hash = TSL.hash;\nconst highpModelNormalViewMatrix = TSL.highpModelNormalViewMatrix;\nconst highpModelViewMatrix = TSL.highpModelViewMatrix;\nconst hue = TSL.hue;\nconst increment = TSL.increment;\nconst incrementBefore = TSL.incrementBefore;\nconst instance = TSL.instance;\nconst instanceIndex = TSL.instanceIndex;\nconst instancedArray = TSL.instancedArray;\nconst instancedBufferAttribute = TSL.instancedBufferAttribute;\nconst instancedDynamicBufferAttribute = TSL.instancedDynamicBufferAttribute;\nconst instancedMesh = TSL.instancedMesh;\nconst int = TSL.int;\nconst intBitsToFloat = TSL.intBitsToFloat;\nconst inverse = TSL.inverse;\nconst inverseSqrt = TSL.inverseSqrt;\nconst inversesqrt = TSL.inversesqrt;\nconst invocationLocalIndex = TSL.invocationLocalIndex;\nconst invocationSubgroupIndex = TSL.invocationSubgroupIndex;\nconst ior = TSL.ior;\nconst iridescence = TSL.iridescence;\nconst iridescenceIOR = TSL.iridescenceIOR;\nconst iridescenceThickness = TSL.iridescenceThickness;\nconst ivec2 = TSL.ivec2;\nconst ivec3 = TSL.ivec3;\nconst ivec4 = TSL.ivec4;\nconst js = TSL.js;\nconst label = TSL.label;\nconst length = TSL.length;\nconst lengthSq = TSL.lengthSq;\nconst lessThan = TSL.lessThan;\nconst lessThanEqual = TSL.lessThanEqual;\nconst lightPosition = TSL.lightPosition;\nconst lightProjectionUV = TSL.lightProjectionUV;\nconst lightShadowMatrix = TSL.lightShadowMatrix;\nconst lightTargetDirection = TSL.lightTargetDirection;\nconst lightTargetPosition = TSL.lightTargetPosition;\nconst lightViewPosition = TSL.lightViewPosition;\nconst lightingContext = TSL.lightingContext;\nconst lights = TSL.lights;\nconst linearDepth = TSL.linearDepth;\nconst linearToneMapping = TSL.linearToneMapping;\nconst localId = TSL.localId;\nconst log = TSL.log;\nconst log2 = TSL.log2;\nconst logarithmicDepthToViewZ = TSL.logarithmicDepthToViewZ;\nconst luminance = TSL.luminance;\nconst mat2 = TSL.mat2;\nconst mat3 = TSL.mat3;\nconst mat4 = TSL.mat4;\nconst matcapUV = TSL.matcapUV;\nconst materialAO = TSL.materialAO;\nconst materialAlphaTest = TSL.materialAlphaTest;\nconst materialAnisotropy = TSL.materialAnisotropy;\nconst materialAnisotropyVector = TSL.materialAnisotropyVector;\nconst materialAttenuationColor = TSL.materialAttenuationColor;\nconst materialAttenuationDistance = TSL.materialAttenuationDistance;\nconst materialClearcoat = TSL.materialClearcoat;\nconst materialClearcoatNormal = TSL.materialClearcoatNormal;\nconst materialClearcoatRoughness = TSL.materialClearcoatRoughness;\nconst materialColor = TSL.materialColor;\nconst materialDispersion = TSL.materialDispersion;\nconst materialEmissive = TSL.materialEmissive;\nconst materialEnvIntensity = TSL.materialEnvIntensity;\nconst materialEnvRotation = TSL.materialEnvRotation;\nconst materialIOR = TSL.materialIOR;\nconst materialIridescence = TSL.materialIridescence;\nconst materialIridescenceIOR = TSL.materialIridescenceIOR;\nconst materialIridescenceThickness = TSL.materialIridescenceThickness;\nconst materialLightMap = TSL.materialLightMap;\nconst materialLineDashOffset = TSL.materialLineDashOffset;\nconst materialLineDashSize = TSL.materialLineDashSize;\nconst materialLineGapSize = TSL.materialLineGapSize;\nconst materialLineScale = TSL.materialLineScale;\nconst materialLineWidth = TSL.materialLineWidth;\nconst materialMetalness = TSL.materialMetalness;\nconst materialNormal = TSL.materialNormal;\nconst materialOpacity = TSL.materialOpacity;\nconst materialPointSize = TSL.materialPointSize;\nconst materialReference = TSL.materialReference;\nconst materialReflectivity = TSL.materialReflectivity;\nconst materialRefractionRatio = TSL.materialRefractionRatio;\nconst materialRotation = TSL.materialRotation;\nconst materialRoughness = TSL.materialRoughness;\nconst materialSheen = TSL.materialSheen;\nconst materialSheenRoughness = TSL.materialSheenRoughness;\nconst materialShininess = TSL.materialShininess;\nconst materialSpecular = TSL.materialSpecular;\nconst materialSpecularColor = TSL.materialSpecularColor;\nconst materialSpecularIntensity = TSL.materialSpecularIntensity;\nconst materialSpecularStrength = TSL.materialSpecularStrength;\nconst materialThickness = TSL.materialThickness;\nconst materialTransmission = TSL.materialTransmission;\nconst max = TSL.max;\nconst maxMipLevel = TSL.maxMipLevel;\nconst mediumpModelViewMatrix = TSL.mediumpModelViewMatrix;\nconst metalness = TSL.metalness;\nconst min = TSL.min;\nconst mix = TSL.mix;\nconst mixElement = TSL.mixElement;\nconst mod = TSL.mod;\nconst modInt = TSL.modInt;\nconst modelDirection = TSL.modelDirection;\nconst modelNormalMatrix = TSL.modelNormalMatrix;\nconst modelPosition = TSL.modelPosition;\nconst modelRadius = TSL.modelRadius;\nconst modelScale = TSL.modelScale;\nconst modelViewMatrix = TSL.modelViewMatrix;\nconst modelViewPosition = TSL.modelViewPosition;\nconst modelViewProjection = TSL.modelViewProjection;\nconst modelWorldMatrix = TSL.modelWorldMatrix;\nconst modelWorldMatrixInverse = TSL.modelWorldMatrixInverse;\nconst morphReference = TSL.morphReference;\nconst mrt = TSL.mrt;\nconst mul = TSL.mul;\nconst mx_aastep = TSL.mx_aastep;\nconst mx_add = TSL.mx_add;\nconst mx_atan2 = TSL.mx_atan2;\nconst mx_cell_noise_float = TSL.mx_cell_noise_float;\nconst mx_contrast = TSL.mx_contrast;\nconst mx_divide = TSL.mx_divide;\nconst mx_fractal_noise_float = TSL.mx_fractal_noise_float;\nconst mx_fractal_noise_vec2 = TSL.mx_fractal_noise_vec2;\nconst mx_fractal_noise_vec3 = TSL.mx_fractal_noise_vec3;\nconst mx_fractal_noise_vec4 = TSL.mx_fractal_noise_vec4;\nconst mx_frame = TSL.mx_frame;\nconst mx_heighttonormal = TSL.mx_heighttonormal;\nconst mx_hsvtorgb = TSL.mx_hsvtorgb;\nconst mx_ifequal = TSL.mx_ifequal;\nconst mx_ifgreater = TSL.mx_ifgreater;\nconst mx_ifgreatereq = TSL.mx_ifgreatereq;\nconst mx_invert = TSL.mx_invert;\nconst mx_modulo = TSL.mx_modulo;\nconst mx_multiply = TSL.mx_multiply;\nconst mx_noise_float = TSL.mx_noise_float;\nconst mx_noise_vec3 = TSL.mx_noise_vec3;\nconst mx_noise_vec4 = TSL.mx_noise_vec4;\nconst mx_place2d = TSL.mx_place2d;\nconst mx_power = TSL.mx_power;\nconst mx_ramp4 = TSL.mx_ramp4;\nconst mx_ramplr = TSL.mx_ramplr;\nconst mx_ramptb = TSL.mx_ramptb;\nconst mx_rgbtohsv = TSL.mx_rgbtohsv;\nconst mx_rotate2d = TSL.mx_rotate2d;\nconst mx_rotate3d = TSL.mx_rotate3d;\nconst mx_safepower = TSL.mx_safepower;\nconst mx_separate = TSL.mx_separate;\nconst mx_splitlr = TSL.mx_splitlr;\nconst mx_splittb = TSL.mx_splittb;\nconst mx_srgb_texture_to_lin_rec709 = TSL.mx_srgb_texture_to_lin_rec709;\nconst mx_subtract = TSL.mx_subtract;\nconst mx_timer = TSL.mx_timer;\nconst mx_transform_uv = TSL.mx_transform_uv;\nconst mx_unifiednoise2d = TSL.mx_unifiednoise2d;\nconst mx_unifiednoise3d = TSL.mx_unifiednoise3d;\nconst mx_worley_noise_float = TSL.mx_worley_noise_float;\nconst mx_worley_noise_vec2 = TSL.mx_worley_noise_vec2;\nconst mx_worley_noise_vec3 = TSL.mx_worley_noise_vec3;\nconst negate = TSL.negate;\nconst neutralToneMapping = TSL.neutralToneMapping;\nconst nodeArray = TSL.nodeArray;\nconst nodeImmutable = TSL.nodeImmutable;\nconst nodeObject = TSL.nodeObject;\nconst nodeObjectIntent = TSL.nodeObjectIntent;\nconst nodeObjects = TSL.nodeObjects;\nconst nodeProxy = TSL.nodeProxy;\nconst nodeProxyIntent = TSL.nodeProxyIntent;\nconst normalFlat = TSL.normalFlat;\nconst normalGeometry = TSL.normalGeometry;\nconst normalLocal = TSL.normalLocal;\nconst normalMap = TSL.normalMap;\nconst normalView = TSL.normalView;\nconst normalViewGeometry = TSL.normalViewGeometry;\nconst normalWorld = TSL.normalWorld;\nconst normalWorldGeometry = TSL.normalWorldGeometry;\nconst normalize = TSL.normalize;\nconst not = TSL.not;\nconst notEqual = TSL.notEqual;\nconst numWorkgroups = TSL.numWorkgroups;\nconst objectDirection = TSL.objectDirection;\nconst objectGroup = TSL.objectGroup;\nconst objectPosition = TSL.objectPosition;\nconst objectRadius = TSL.objectRadius;\nconst objectScale = TSL.objectScale;\nconst objectViewPosition = TSL.objectViewPosition;\nconst objectWorldMatrix = TSL.objectWorldMatrix;\nconst OnBeforeObjectUpdate = TSL.OnBeforeObjectUpdate;\nconst OnBeforeMaterialUpdate = TSL.OnBeforeMaterialUpdate;\nconst OnObjectUpdate = TSL.OnObjectUpdate;\nconst OnMaterialUpdate = TSL.OnMaterialUpdate;\nconst oneMinus = TSL.oneMinus;\nconst or = TSL.or;\nconst orthographicDepthToViewZ = TSL.orthographicDepthToViewZ;\nconst oscSawtooth = TSL.oscSawtooth;\nconst oscSine = TSL.oscSine;\nconst oscSquare = TSL.oscSquare;\nconst oscTriangle = TSL.oscTriangle;\nconst output = TSL.output;\nconst outputStruct = TSL.outputStruct;\nconst overlay = TSL.overlay;\nconst overloadingFn = TSL.overloadingFn;\nconst packHalf2x16 = TSL.packHalf2x16;\nconst packSnorm2x16 = TSL.packSnorm2x16;\nconst packUnorm2x16 = TSL.packUnorm2x16;\nconst parabola = TSL.parabola;\nconst parallaxDirection = TSL.parallaxDirection;\nconst parallaxUV = TSL.parallaxUV;\nconst parameter = TSL.parameter;\nconst pass = TSL.pass;\nconst passTexture = TSL.passTexture;\nconst pcurve = TSL.pcurve;\nconst perspectiveDepthToViewZ = TSL.perspectiveDepthToViewZ;\nconst pmremTexture = TSL.pmremTexture;\nconst pointShadow = TSL.pointShadow;\nconst pointUV = TSL.pointUV;\nconst pointWidth = TSL.pointWidth;\nconst positionGeometry = TSL.positionGeometry;\nconst positionLocal = TSL.positionLocal;\nconst positionPrevious = TSL.positionPrevious;\nconst positionView = TSL.positionView;\nconst positionViewDirection = TSL.positionViewDirection;\nconst positionWorld = TSL.positionWorld;\nconst positionWorldDirection = TSL.positionWorldDirection;\nconst posterize = TSL.posterize;\nconst pow = TSL.pow;\nconst pow2 = TSL.pow2;\nconst pow3 = TSL.pow3;\nconst pow4 = TSL.pow4;\nconst premultiplyAlpha = TSL.premultiplyAlpha;\nconst property = TSL.property;\nconst radians = TSL.radians;\nconst rand = TSL.rand;\nconst range = TSL.range;\nconst rangeFog = TSL.rangeFog;\nconst rangeFogFactor = TSL.rangeFogFactor;\nconst reciprocal = TSL.reciprocal;\nconst reference = TSL.reference;\nconst referenceBuffer = TSL.referenceBuffer;\nconst reflect = TSL.reflect;\nconst reflectVector = TSL.reflectVector;\nconst reflectView = TSL.reflectView;\nconst reflector = TSL.reflector;\nconst refract = TSL.refract;\nconst refractVector = TSL.refractVector;\nconst refractView = TSL.refractView;\nconst reinhardToneMapping = TSL.reinhardToneMapping;\nconst remap = TSL.remap;\nconst remapClamp = TSL.remapClamp;\nconst renderGroup = TSL.renderGroup;\nconst renderOutput = TSL.renderOutput;\nconst rendererReference = TSL.rendererReference;\nconst replaceDefaultUV = TSL.replaceDefaultUV;\nconst rotate = TSL.rotate;\nconst rotateUV = TSL.rotateUV;\nconst roughness = TSL.roughness;\nconst round = TSL.round;\nconst rtt = TSL.rtt;\nconst sRGBTransferEOTF = TSL.sRGBTransferEOTF;\nconst sRGBTransferOETF = TSL.sRGBTransferOETF;\nconst sample = TSL.sample;\nconst sampler = TSL.sampler;\nconst samplerComparison = TSL.samplerComparison;\nconst saturate = TSL.saturate;\nconst saturation = TSL.saturation;\nconst screen = TSL.screen;\nconst screenCoordinate = TSL.screenCoordinate;\nconst screenDPR = TSL.screenDPR;\nconst screenSize = TSL.screenSize;\nconst screenUV = TSL.screenUV;\nconst scriptable = TSL.scriptable;\nconst scriptableValue = TSL.scriptableValue;\nconst select = TSL.select;\nconst setCurrentStack = TSL.setCurrentStack;\nconst setName = TSL.setName;\nconst shaderStages = TSL.shaderStages;\nconst shadow = TSL.shadow;\nconst shadowPositionWorld = TSL.shadowPositionWorld;\nconst shapeCircle = TSL.shapeCircle;\nconst sharedUniformGroup = TSL.sharedUniformGroup;\nconst sheen = TSL.sheen;\nconst sheenRoughness = TSL.sheenRoughness;\nconst shiftLeft = TSL.shiftLeft;\nconst shiftRight = TSL.shiftRight;\nconst shininess = TSL.shininess;\nconst sign = TSL.sign;\nconst sin = TSL.sin;\nconst sinc = TSL.sinc;\nconst skinning = TSL.skinning;\nconst smoothstep = TSL.smoothstep;\nconst smoothstepElement = TSL.smoothstepElement;\nconst specularColor = TSL.specularColor;\nconst specularF90 = TSL.specularF90;\nconst spherizeUV = TSL.spherizeUV;\nconst split = TSL.split;\nconst spritesheetUV = TSL.spritesheetUV;\nconst sqrt = TSL.sqrt;\nconst stack = TSL.stack;\nconst step = TSL.step;\nconst stepElement = TSL.stepElement;\nconst storage = TSL.storage;\nconst storageBarrier = TSL.storageBarrier;\nconst storageObject = TSL.storageObject;\nconst storageTexture = TSL.storageTexture;\nconst string = TSL.string;\nconst struct = TSL.struct;\nconst sub = TSL.sub;\nconst subgroupAdd = TSL.subgroupAdd;\nconst subgroupAll = TSL.subgroupAll;\nconst subgroupAnd = TSL.subgroupAnd;\nconst subgroupAny = TSL.subgroupAny;\nconst subgroupBallot = TSL.subgroupBallot;\nconst subgroupBroadcast = TSL.subgroupBroadcast;\nconst subgroupBroadcastFirst = TSL.subgroupBroadcastFirst;\nconst subBuild = TSL.subBuild;\nconst subgroupElect = TSL.subgroupElect;\nconst subgroupExclusiveAdd = TSL.subgroupExclusiveAdd;\nconst subgroupExclusiveMul = TSL.subgroupExclusiveMul;\nconst subgroupInclusiveAdd = TSL.subgroupInclusiveAdd;\nconst subgroupInclusiveMul = TSL.subgroupInclusiveMul;\nconst subgroupIndex = TSL.subgroupIndex;\nconst subgroupMax = TSL.subgroupMax;\nconst subgroupMin = TSL.subgroupMin;\nconst subgroupMul = TSL.subgroupMul;\nconst subgroupOr = TSL.subgroupOr;\nconst subgroupShuffle = TSL.subgroupShuffle;\nconst subgroupShuffleDown = TSL.subgroupShuffleDown;\nconst subgroupShuffleUp = TSL.subgroupShuffleUp;\nconst subgroupShuffleXor = TSL.subgroupShuffleXor;\nconst subgroupSize = TSL.subgroupSize;\nconst subgroupXor = TSL.subgroupXor;\nconst tan = TSL.tan;\nconst tangentGeometry = TSL.tangentGeometry;\nconst tangentLocal = TSL.tangentLocal;\nconst tangentView = TSL.tangentView;\nconst tangentWorld = TSL.tangentWorld;\nconst texture = TSL.texture;\nconst texture3D = TSL.texture3D;\nconst textureBarrier = TSL.textureBarrier;\nconst textureBicubic = TSL.textureBicubic;\nconst textureBicubicLevel = TSL.textureBicubicLevel;\nconst textureCubeUV = TSL.textureCubeUV;\nconst textureLoad = TSL.textureLoad;\nconst textureSize = TSL.textureSize;\nconst textureLevel = TSL.textureLevel;\nconst textureStore = TSL.textureStore;\nconst thickness = TSL.thickness;\nconst time = TSL.time;\nconst toneMapping = TSL.toneMapping;\nconst toneMappingExposure = TSL.toneMappingExposure;\nconst toonOutlinePass = TSL.toonOutlinePass;\nconst transformDirection = TSL.transformDirection;\nconst transformNormal = TSL.transformNormal;\nconst transformNormalToView = TSL.transformNormalToView;\nconst transformedClearcoatNormalView = TSL.transformedClearcoatNormalView;\nconst transformedNormalView = TSL.transformedNormalView;\nconst transformedNormalWorld = TSL.transformedNormalWorld;\nconst transmission = TSL.transmission;\nconst transpose = TSL.transpose;\nconst triNoise3D = TSL.triNoise3D;\nconst triplanarTexture = TSL.triplanarTexture;\nconst triplanarTextures = TSL.triplanarTextures;\nconst trunc = TSL.trunc;\nconst uint = TSL.uint;\nconst uintBitsToFloat = TSL.uintBitsToFloat;\nconst uniform = TSL.uniform;\nconst uniformArray = TSL.uniformArray;\nconst uniformCubeTexture = TSL.uniformCubeTexture;\nconst uniformGroup = TSL.uniformGroup;\nconst uniformFlow = TSL.uniformFlow;\nconst uniformTexture = TSL.uniformTexture;\nconst unpackHalf2x16 = TSL.unpackHalf2x16;\nconst unpackSnorm2x16 = TSL.unpackSnorm2x16;\nconst unpackUnorm2x16 = TSL.unpackUnorm2x16;\nconst unpremultiplyAlpha = TSL.unpremultiplyAlpha;\nconst userData = TSL.userData;\nconst uv = TSL.uv;\nconst uvec2 = TSL.uvec2;\nconst uvec3 = TSL.uvec3;\nconst uvec4 = TSL.uvec4;\nconst varying = TSL.varying;\nconst varyingProperty = TSL.varyingProperty;\nconst vec2 = TSL.vec2;\nconst vec3 = TSL.vec3;\nconst vec4 = TSL.vec4;\nconst vectorComponents = TSL.vectorComponents;\nconst velocity = TSL.velocity;\nconst vertexColor = TSL.vertexColor;\nconst vertexIndex = TSL.vertexIndex;\nconst vertexStage = TSL.vertexStage;\nconst vibrance = TSL.vibrance;\nconst viewZToLogarithmicDepth = TSL.viewZToLogarithmicDepth;\nconst viewZToOrthographicDepth = TSL.viewZToOrthographicDepth;\nconst viewZToPerspectiveDepth = TSL.viewZToPerspectiveDepth;\nconst viewport = TSL.viewport;\nconst viewportCoordinate = TSL.viewportCoordinate;\nconst viewportDepthTexture = TSL.viewportDepthTexture;\nconst viewportLinearDepth = TSL.viewportLinearDepth;\nconst viewportMipTexture = TSL.viewportMipTexture;\nconst viewportResolution = TSL.viewportResolution;\nconst viewportSafeUV = TSL.viewportSafeUV;\nconst viewportSharedTexture = TSL.viewportSharedTexture;\nconst viewportSize = TSL.viewportSize;\nconst viewportTexture = TSL.viewportTexture;\nconst viewportUV = TSL.viewportUV;\nconst wgsl = TSL.wgsl;\nconst wgslFn = TSL.wgslFn;\nconst workgroupArray = TSL.workgroupArray;\nconst workgroupBarrier = TSL.workgroupBarrier;\nconst workgroupId = TSL.workgroupId;\nconst workingToColorSpace = TSL.workingToColorSpace;\nconst xor = TSL.xor;\n\n/*\n// Use this code to generate the export statements dynamically\n\nlet code = '';\n\nfor ( const key of Object.keys( THREE.TSL ) ) {\n\n\tcode += `export const ${ key } = TSL.${ key };\\n`;\n\n}\n\nlog( code );\n//*/\n\nexport { BRDF_GGX, BRDF_Lambert, BasicPointShadowFilter, BasicShadowFilter, Break, Const, Continue, DFGLUT, D_GGX, Discard, EPSILON, F_Schlick, Fn, HALF_PI, INFINITY, If, Loop, NodeAccess, NodeShaderStage, NodeType, NodeUpdateType, OnBeforeMaterialUpdate, OnBeforeObjectUpdate, OnMaterialUpdate, OnObjectUpdate, PCFShadowFilter, PCFSoftShadowFilter, PI, PI2, PointShadowFilter, Return, Schlick_to_F0, ScriptableNodeResources, ShaderNode, Stack, Switch, TBNViewMatrix, TWO_PI, VSMShadowFilter, V_GGX_SmithCorrelated, Var, VarIntent, abs, acesFilmicToneMapping, acos, add, addMethodChaining, addNodeElement, agxToneMapping, all, alphaT, and, anisotropy, anisotropyB, anisotropyT, any, append, array, arrayBuffer, asin, assign, atan, atan2, atomicAdd, atomicAnd, atomicFunc, atomicLoad, atomicMax, atomicMin, atomicOr, atomicStore, atomicSub, atomicXor, attenuationColor, attenuationDistance, attribute, attributeArray, backgroundBlurriness, backgroundIntensity, backgroundRotation, batch, bentNormalView, billboarding, bitAnd, bitNot, bitOr, bitXor, bitangentGeometry, bitangentLocal, bitangentView, bitangentWorld, bitcast, blendBurn, blendColor, blendDodge, blendOverlay, blendScreen, blur, bool, buffer, bufferAttribute, builtin, builtinAOContext, builtinShadowContext, bumpMap, burn, bvec2, bvec3, bvec4, bypass, cache, call, cameraFar, cameraIndex, cameraNear, cameraNormalMatrix, cameraPosition, cameraProjectionMatrix, cameraProjectionMatrixInverse, cameraViewMatrix, cameraViewport, cameraWorldMatrix, cbrt, cdl, ceil, checker, cineonToneMapping, clamp, clearcoat, clearcoatNormalView, clearcoatRoughness, code, color, colorSpaceToWorking, colorToDirection, compute, computeKernel, computeSkinning, context, convert, convertColorSpace, convertToTexture, cos, countLeadingZeros, countOneBits, countTrailingZeros, cross, cubeTexture, cubeTextureBase, dFdx, dFdy, dashSize, debug, decrement, decrementBefore, defaultBuildStages, defaultShaderStages, defined, degrees, deltaTime, densityFog, densityFogFactor, depth, depthPass, determinant, difference, diffuseColor, directPointLight, directionToColor, directionToFaceDirection, dispersion, distance, div, dodge, dot, drawIndex, dynamicBufferAttribute, element, emissive, equal, equals, equirectUV, exp, exp2, expression, faceDirection, faceForward, faceforward, float, floatBitsToInt, floatBitsToUint, floor, fog, fract, frameGroup, frameId, frontFacing, fwidth, gain, gapSize, getConstNodeType, getCurrentStack, getDirection, getDistanceAttenuation, getGeometryRoughness, getNormalFromDepth, getParallaxCorrectNormal, getRoughness, getScreenPosition, getShIrradianceAt, getShadowMaterial, getShadowRenderObjectFunction, getTextureIndex, getViewPosition, globalId, glsl, glslFn, grayscale, greaterThan, greaterThanEqual, hash, highpModelNormalViewMatrix, highpModelViewMatrix, hue, increment, incrementBefore, instance, instanceIndex, instancedArray, instancedBufferAttribute, instancedDynamicBufferAttribute, instancedMesh, int, intBitsToFloat, interleavedGradientNoise, inverse, inverseSqrt, inversesqrt, invocationLocalIndex, invocationSubgroupIndex, ior, iridescence, iridescenceIOR, iridescenceThickness, ivec2, ivec3, ivec4, js, label, length, lengthSq, lessThan, lessThanEqual, lightPosition, lightProjectionUV, lightShadowMatrix, lightTargetDirection, lightTargetPosition, lightViewPosition, lightingContext, lights, linearDepth, linearToneMapping, localId, log, log2, logarithmicDepthToViewZ, luminance, mat2, mat3, mat4, matcapUV, materialAO, materialAlphaTest, materialAnisotropy, materialAnisotropyVector, materialAttenuationColor, materialAttenuationDistance, materialClearcoat, materialClearcoatNormal, materialClearcoatRoughness, materialColor, materialDispersion, materialEmissive, materialEnvIntensity, materialEnvRotation, materialIOR, materialIridescence, materialIridescenceIOR, materialIridescenceThickness, materialLightMap, materialLineDashOffset, materialLineDashSize, materialLineGapSize, materialLineScale, materialLineWidth, materialMetalness, materialNormal, materialOpacity, materialPointSize, materialReference, materialReflectivity, materialRefractionRatio, materialRotation, materialRoughness, materialSheen, materialSheenRoughness, materialShininess, materialSpecular, materialSpecularColor, materialSpecularIntensity, materialSpecularStrength, materialThickness, materialTransmission, max, maxMipLevel, mediumpModelViewMatrix, metalness, min, mix, mixElement, mod, modInt, modelDirection, modelNormalMatrix, modelPosition, modelRadius, modelScale, modelViewMatrix, modelViewPosition, modelViewProjection, modelWorldMatrix, modelWorldMatrixInverse, morphReference, mrt, mul, mx_aastep, mx_add, mx_atan2, mx_cell_noise_float, mx_contrast, mx_divide, mx_fractal_noise_float, mx_fractal_noise_vec2, mx_fractal_noise_vec3, mx_fractal_noise_vec4, mx_frame, mx_heighttonormal, mx_hsvtorgb, mx_ifequal, mx_ifgreater, mx_ifgreatereq, mx_invert, mx_modulo, mx_multiply, mx_noise_float, mx_noise_vec3, mx_noise_vec4, mx_place2d, mx_power, mx_ramp4, mx_ramplr, mx_ramptb, mx_rgbtohsv, mx_rotate2d, mx_rotate3d, mx_safepower, mx_separate, mx_splitlr, mx_splittb, mx_srgb_texture_to_lin_rec709, mx_subtract, mx_timer, mx_transform_uv, mx_unifiednoise2d, mx_unifiednoise3d, mx_worley_noise_float, mx_worley_noise_vec2, mx_worley_noise_vec3, negate, neutralToneMapping, nodeArray, nodeImmutable, nodeObject, nodeObjectIntent, nodeObjects, nodeProxy, nodeProxyIntent, normalFlat, normalGeometry, normalLocal, normalMap, normalView, normalViewGeometry, normalWorld, normalWorldGeometry, normalize, not, notEqual, numWorkgroups, objectDirection, objectGroup, objectPosition, objectRadius, objectScale, objectViewPosition, objectWorldMatrix, oneMinus, or, orthographicDepthToViewZ, oscSawtooth, oscSine, oscSquare, oscTriangle, output, outputStruct, overlay, overloadingFn, packHalf2x16, packSnorm2x16, packUnorm2x16, parabola, parallaxDirection, parallaxUV, parameter, pass, passTexture, pcurve, perspectiveDepthToViewZ, pmremTexture, pointShadow, pointUV, pointWidth, positionGeometry, positionLocal, positionPrevious, positionView, positionViewDirection, positionWorld, positionWorldDirection, posterize, pow, pow2, pow3, pow4, premultiplyAlpha, property, radians, rand, range, rangeFog, rangeFogFactor, reciprocal, reference, referenceBuffer, reflect, reflectVector, reflectView, reflector, refract, refractVector, refractView, reinhardToneMapping, remap, remapClamp, renderGroup, renderOutput, rendererReference, replaceDefaultUV, rotate, rotateUV, roughness, round, rtt, sRGBTransferEOTF, sRGBTransferOETF, sample, sampler, samplerComparison, saturate, saturation, screen, screenCoordinate, screenDPR, screenSize, screenUV, scriptable, scriptableValue, select, setCurrentStack, setName, shaderStages, shadow, shadowPositionWorld, shapeCircle, sharedUniformGroup, sheen, sheenRoughness, shiftLeft, shiftRight, shininess, sign, sin, sinc, skinning, smoothstep, smoothstepElement, specularColor, specularF90, spherizeUV, split, spritesheetUV, sqrt, stack, step, stepElement, storage, storageBarrier, storageObject, storageTexture, string, struct, sub, subBuild, subgroupAdd, subgroupAll, subgroupAnd, subgroupAny, subgroupBallot, subgroupBroadcast, subgroupBroadcastFirst, subgroupElect, subgroupExclusiveAdd, subgroupExclusiveMul, subgroupInclusiveAdd, subgroupInclusiveMul, subgroupIndex, subgroupMax, subgroupMin, subgroupMul, subgroupOr, subgroupShuffle, subgroupShuffleDown, subgroupShuffleUp, subgroupShuffleXor, subgroupSize, subgroupXor, tan, tangentGeometry, tangentLocal, tangentView, tangentWorld, texture, texture3D, textureBarrier, textureBicubic, textureBicubicLevel, textureCubeUV, textureLevel, textureLoad, textureSize, textureStore, thickness, time, toneMapping, toneMappingExposure, toonOutlinePass, transformDirection, transformNormal, transformNormalToView, transformedClearcoatNormalView, transformedNormalView, transformedNormalWorld, transmission, transpose, triNoise3D, triplanarTexture, triplanarTextures, trunc, uint, uintBitsToFloat, uniform, uniformArray, uniformCubeTexture, uniformFlow, uniformGroup, uniformTexture, unpackHalf2x16, unpackSnorm2x16, unpackUnorm2x16, unpremultiplyAlpha, userData, uv, uvec2, uvec3, uvec4, varying, varyingProperty, vec2, vec3, vec4, vectorComponents, velocity, vertexColor, vertexIndex, vertexStage, vibrance, viewZToLogarithmicDepth, viewZToOrthographicDepth, viewZToPerspectiveDepth, viewport, viewportCoordinate, viewportDepthTexture, viewportLinearDepth, viewportMipTexture, viewportResolution, viewportSafeUV, viewportSharedTexture, viewportSize, viewportTexture, viewportUV, vogelDiskSample, wgsl, wgslFn, workgroupArray, workgroupBarrier, workgroupId, workingToColorSpace, xor };\n", "/**\n * @file TextureShaderNodeMaterial.js\n * Three.js node material class (for WebGPURenderer) that handles\n * FFL modulated/swizzled textures with mixed colors.\n * @author Arian Kordi <https://github.com/ariankordi>\n */\n// @ts-check\nimport { Color } from 'three';\nimport {\n\tFn, uniform, materialReference, float, vec4, int\n} from 'three/tsl';\nimport { NodeMaterial } from 'three/webgpu';\n\n// TODO: This type should not be any.\n/** @typedef {import('three/tsl').ShaderNodeObject<*>} ShaderNodeObject */\n\n/**\n * A NodeMaterial (TSL/WebGPURenderer) that renders FFL swizzled (modulateMode) textures.\n * Has no lighting whatsoever, just meant to render 2D planes.\n */\nexport default class TextureShaderNodeMaterial extends NodeMaterial {\n\t/** @param {import('three').MeshBasicMaterialParameters & {colorG?: Color, colorB?: Color}} [options] - Options */\n\tconstructor(options = {}) {\n\t\tsuper();\n\n\t\t// TODO: Why aren't these set by \"setValues\" automatically?\n\n\t\tthis.map = options.map; // Set texture map.\n\t\t// Use setter to set all colors if they are there.\n\t\tthis.color = options.color ?? new Color();\n\t\tthis.colorG = options.colorG ?? new Color();\n\t\tthis.colorB = options.colorB ?? new Color();\n\n\t\t// Set FFL specific defaults so they are considered valid parameters.\n\t\tthis.modulateMode = this.modulateType = 0;\n\t\tthis.lightEnable = false;\n\n\t\tthis.setValues(options); // Set all from options.\n\n\t\t// TODO: This should use colorNode instead.\n\t\t// However, whenever I try, I see: \"No stack defined for assign operation.\"\n\t\t// This error is very obtuse and always stumps me.\n\t\t// I seemingly get the same error any time I don't have a fragmentNode.\n\t\t// So, for now this will use the fragmentNode, which is ok since it can still be combined.\n\t\tthis.fragmentNode = TextureShaderNodeMaterial.fragmentNode({\n\t\t\tdiffuse: uniform(this.color),\n\t\t\tcolorG: uniform(this.colorG),\n\t\t\tcolorB: uniform(this.colorB),\n\t\t\topacity: uniform(this.opacity),\n\t\t\tmodulateMode: uniform(this.modulateMode),\n\t\t\ttexel: this.map ? materialReference('map', 'texture') : null\n\t\t});\n\t}\n\n\t/**\n\t * @typedef {Object} FragmentInputs\n\t * @property {ShaderNodeObject} diffuse - color\n\t * @property {ShaderNodeObject} colorG - color\n\t * @property {ShaderNodeObject} colorB - color\n\t * @property {ShaderNodeObject} opacity - float\n\t * @property {ShaderNodeObject} modulateMode - int\n\t * @property {ShaderNodeObject|null} texel - texture\n\t */\n\t/** @type {import('three/src/nodes/tsl/TSLBase.js').ShaderNodeFn<[FragmentInputs]>} */\n\tstatic fragmentNode = /* @__PURE__ */ Fn((/** @type {FragmentInputs} */ args) => {\n\t\tconst { diffuse, colorG, colorB, opacity, modulateMode, texel } = args;\n\t\t// Start with diffuse/opacity.\n\t\tconst diffuseColor = vec4(diffuse, opacity);\n\n\t\tif (!texel) {\n\t\t\treturn diffuseColor;\n\t\t}\n\t\t// Sample map.\n\t\t// const texel = texture(textureMap, uv());\n\n\t\t// Default map behavior (equivalent to <map_fragment> multiply).\n\t\tconst baseResult = vec4(\n\t\t\tdiffuseColor.rgb.mul(texel.rgb),\n\t\t\tdiffuseColor.a.mul(texel.a)\n\t\t);\n\n\t\t// Precompute all modulate modes.\n\t\tconst rgbLayered = vec4(\n\t\t\tdiffuse\n\t\t\t\t.mul(texel.r)\n\t\t\t\t.add(colorG.mul(texel.g))\n\t\t\t\t.add(colorB.mul(texel.b)),\n\t\t\ttexel.a\n\t\t);\n\t\tconst alpha = vec4(diffuse.mul(texel.r), texel.r);\n\t\tconst luminanceAlpha = vec4(diffuse.mul(texel.g), texel.r);\n\t\tconst alphaOpa = vec4(diffuse.mul(texel.r), 1);\n\n\t\t// Flags for selection: f2..f5 are 1.0 if modulateMode == 2/3/4/5 else 0.0.\n\t\tconst eq2 = float(modulateMode.equal(int(2)));\n\t\tconst eq3 = float(modulateMode.equal(int(3)));\n\t\tconst eq4 = float(modulateMode.equal(int(4)));\n\t\tconst eq5 = float(modulateMode.equal(int(5)));\n\n\t\t// For default behavior (mode 0 or any other not in 2..5),\n\t\t// use baseResult. Weight = 1 - (f2+f3+f4+f5).\n\t\tconst eq0 = float(1).sub(eq2.add(eq3).add(eq4).add(eq5));\n\n\t\tconst outColor = vec4(\n\t\t\tbaseResult.mul(eq0)\n\t\t\t\t.add(rgbLayered.mul(eq2))\n\t\t\t\t.add(alpha.mul(eq3))\n\t\t\t\t.add(luminanceAlpha.mul(eq4))\n\t\t\t\t.add(alphaOpa.mul(eq5))\n\t\t);\n\n\t\t// TODO: Alpha testing / if (modulateMode != 0 && outColor.a == 0.0) discard;\n\n\t\treturn outColor;\n\t});\n\n\t/** @returns {import('../ffl.js').FFLModulateMode|undefined} The modulateMode value, or null if it is unset. */\n\tget modulateMode() {\n\t\treturn this._modulateMode;\n\t}\n\n\t/** @param {import('../ffl.js').FFLModulateMode} value - The new modulateMode value. */\n\tset modulateMode(value) {\n\t\t/** @private */\n\t\tthis._modulateMode = value;\n\t}\n}\n", "/**\n * @file FFLShaderMaterial.js\n * Three.js material class using the Wii U FFLDefaultShader.\n * @author Arian Kordi <https://github.com/ariankordi>\n */\n// @ts-check\nimport * as THREE from 'three';\n\n/**\n * @typedef {number} FFLModulateMode\n * @typedef {number} FFLModulateType\n */\n\n/**\n * @typedef {Object} FFLShaderMaterialParameters\n * @property {FFLModulateMode} [modulateMode] - Modulate mode.\n * @property {FFLModulateType} [modulateType] - Modulate type.\n * @property {THREE.Color|null} [color] - Constant color.\n * @property {THREE.Color} [colorG]\n * @property {THREE.Color} [colorB]\n * @property {boolean} [lightEnable] - Enable lighting. Needs to be off when drawing faceline/mask textures.\n * @property {THREE.Vector3} [lightDirection] - Light direction.\n * @property {boolean} [useSpecularModeBlinn] - Whether to override\n * specular mode on all materials with 0 (Blinn-Phong specular).\n * @property {THREE.Texture|null} [map] - Texture map.\n */\n\n// // ---------------------------------------------------------------------\n// //  Vertex Shader for FFLShaderMaterial\n// //  Derived from MiiDefaultShader.vsh found in Miitomo.\n// // ---------------------------------------------------------------------\nconst _FFLShader_vert = /* glsl */`\n// \u9802\u70B9\u30B7\u30A7\u30FC\u30C0\u30FC\u306B\u5165\u529B\u3055\u308C\u308B attribute \u5909\u6570\n//attribute vec4 position;       //!< \u5165\u529B: \u4F4D\u7F6E\u60C5\u5831\n//attribute vec2 uv;             //!< \u5165\u529B: \u30C6\u30AF\u30B9\u30C1\u30E3\u30FC\u5EA7\u6A19\n//attribute vec3 normal;         //!< \u5165\u529B: \u6CD5\u7DDA\u30D9\u30AF\u30C8\u30EB\n// All provided by three.js ^^\n\n// vertex color is not actually the color of the shape, as such\n// it is a custom attribute _COLOR in the glTF\n\nattribute vec4 _color;           //!< \u5165\u529B: \u9802\u70B9\u306E\u8272\nattribute vec3 tangent;          //!< \u5165\u529B: \u7570\u65B9\u4F4D\n\n// \u30D5\u30E9\u30B0\u30E1\u30F3\u30C8\u30B7\u30A7\u30FC\u30C0\u30FC\u3078\u306E\u5165\u529B\nvarying   vec4 v_color;          //!< \u51FA\u529B: \u9802\u70B9\u306E\u8272\nvarying   vec4 v_position;       //!< \u51FA\u529B: \u4F4D\u7F6E\u60C5\u5831\nvarying   vec3 v_normal;         //!< \u51FA\u529B: \u6CD5\u7DDA\u30D9\u30AF\u30C8\u30EB\nvarying   vec3 v_tangent;        //!< \u51FA\u529B: \u7570\u65B9\u4F4D\nvarying   vec2 v_texCoord;       //!< \u51FA\u529B: \u30C6\u30AF\u30B9\u30C1\u30E3\u30FC\u5EA7\u6A19\n\n// \u30E6\u30CB\u30D5\u30A9\u30FC\u30E0\n//uniform mat3 normalMatrix;     //!< \u30E6\u30CB\u30D5\u30A9\u30FC\u30E0: \u30E2\u30C7\u30EB\u306E\u6CD5\u7DDA\u7528\u884C\u5217\n//uniform mat4 modelViewMatrix;  //!< \u30E6\u30CB\u30D5\u30A9\u30FC\u30E0: \u30D7\u30ED\u30B8\u30A7\u30AF\u30B7\u30E7\u30F3\u884C\u5217\n//uniform mat4 projectionMatrix; //!< \u30E6\u30CB\u30D5\u30A9\u30FC\u30E0: \u30E2\u30C7\u30EB\u884C\u5217\n// All provided by three.js ^^\n\n#include <skinning_pars_vertex>\n\nvoid main()\n{\n\n    #include <begin_vertex>\n    #include <skinbase_vertex>\n    #include <skinning_vertex>\n\n//#ifdef FFL_COORDINATE_MODE_NORMAL\n    // \u9802\u70B9\u5EA7\u6A19\u3092\u5909\u63DB\n    v_position = modelViewMatrix * vec4(transformed, 1.0);\n    gl_Position =  projectionMatrix * v_position;\n\n    vec3 objectNormal = normal;\n    vec3 objectTangent = tangent.xyz;\n\n    #include <skinnormal_vertex>\n\n    // \u6CD5\u7DDA\u3082\u5909\u63DB\n    //v_normal = mat3(inverse(u_mv)) * a_normal;\n    v_normal = normalize(normalMatrix * objectNormal);\n//#elif defined(FFL_COORDINATE_MODE_NONE)\n//    // \u9802\u70B9\u5EA7\u6A19\u3092\u5909\u63DB\n//    gl_Position = vec4(a_position.x, a_position.y * -1.0, a_position.z, a_position.w);\n//    v_position = a_position;\n//\n//    v_normal = a_normal;\n//#endif\n\n     // \u305D\u306E\u4ED6\u306E\u60C5\u5831\u3082\u66F8\u304D\u51FA\u3059\n    v_texCoord = uv;\n    // safe normalize\n    if (tangent != vec3(0.0, 0.0, 0.0))\n    {\n        v_tangent = normalize(normalMatrix * objectTangent);\n    }\n    else\n    {\n        v_tangent = vec3(0.0, 0.0, 0.0);\n    }\n\n    v_color = _color;\n}\n`;\n\n// // ---------------------------------------------------------------------\n// //  Fragment Shader for FFLShaderMaterial\n// //  Mostly unmodified from MiiDefaultShader.fsh found in Miitomo.\n// // ---------------------------------------------------------------------\nconst _FFLShader_frag = /* glsl */`\n//\n//  sample.flg\n//  Fragment shader\n//  Copyright (c) 2014 Nintendo Co., Ltd. All rights reserved.\n//\n//\n\n#ifdef GL_ES\nprecision mediump float;\n#else\n#   define lowp\n#   define mediump\n#   define highp\n#endif\n\n\n//\n//  \u5B9A\u6570\u5B9A\u7FA9\u30D5\u30A1\u30A4\u30EB\n//\n\n/// \u30B7\u30A7\u30FC\u30C0\u30FC\u30E2\u30FC\u30C9\n#define FFL_SHADER_MODE_UR 0\n#define FFL_SHADER_MODE_UB 1\n\n/// \u5909\u8ABF\u51E6\u7406\u306E\u30DE\u30AF\u30ED\n#define FFL_MODULATE_MODE_CONSTANT        0\n#define FFL_MODULATE_MODE_TEXTURE_DIRECT  1\n#define FFL_MODULATE_MODE_RGB_LAYERED     2\n#define FFL_MODULATE_MODE_ALPHA           3\n#define FFL_MODULATE_MODE_LUMINANCE_ALPHA 4\n#define FFL_MODULATE_MODE_ALPHA_OPA       5\n\n/// \u30B9\u30DA\u30AD\u30E5\u30E9\u306E\u30E2\u30FC\u30C9\n#define FFL_SPECULAR_MODE_BLINN 0\n#define FFL_SPECULAR_MODE_ANISO 1\n\n/// \u30E9\u30A4\u30C8\u306EON/OFF\n#define FFL_LIGHT_MODE_DISABLE 0\n#define FFL_LIGHT_MODE_ENABLE 1\n\n/// \u30D5\u30E9\u30B0\u30E1\u30F3\u30C8\u306E\u30C7\u30A3\u30B9\u30AB\u30FC\u30C9\u30E2\u30FC\u30C9\n#define FFL_DISCARD_FRAGMENT_DISABLE 0\n#define FFL_DISCARD_FRAGMENT_ENABLE  1\n\n/// \u5EA7\u6A19\u5909\u63DB\u30E2\u30FC\u30C9\n#define FFL_COORDINATE_MODE_NONE   0\n#define FFL_COORDINATE_MODE_NORMAL 1\n\n//\n//  \u95A2\u6570\u306E\u5B9A\u7FA9\u30D5\u30A1\u30A4\u30EB\n//\n\n/**\n * @brief \u7570\u65B9\u6027\u53CD\u5C04\u306E\u53CD\u5C04\u7387\u3092\u8A08\u7B97\u3057\u307E\u3059\u3002\n * @param[in] light   \u30E9\u30A4\u30C8\u306E\u5411\u304D\n * @param[in] tangent \u63A5\u7DDA\n * @param[in] eye     \u8996\u7DDA\u306E\u5411\u304D\n * @param[in] power   \u92ED\u3055\n */\nmediump float calculateAnisotropicSpecular(mediump vec3 light, mediump vec3 tangent, mediump vec3 eye, mediump float power )\n{\n\tmediump float dotLT = dot(light, tangent);\n\tmediump float dotVT = dot(eye, tangent);\n\tmediump float dotLN = sqrt(1.0 - dotLT * dotLT);\n\tmediump float dotVR = dotLN*sqrt(1.0 - dotVT * dotVT) - dotLT * dotVT;\n\n\treturn pow(max(0.0, dotVR), power);\n}\n\n/**\n * @brief \u7570\u65B9\u6027\u53CD\u5C04\u306E\u53CD\u5C04\u7387\u3092\u8A08\u7B97\u3057\u307E\u3059\u3002\n * @param[in] light   \u30E9\u30A4\u30C8\u306E\u5411\u304D\n * @param[in] normal  \u6CD5\u7DDA\n * @param[in] eye     \u8996\u7DDA\u306E\u5411\u304D\n * @param[in] power   \u92ED\u3055\n */\nmediump float calculateBlinnSpecular(mediump vec3 light, mediump vec3 normal, mediump vec3 eye, mediump float power)\n{\n\treturn pow(max(dot(reflect(-light, normal), eye), 0.0), power);\n}\n\n/**\n * @brief \u7570\u65B9\u6027\u53CD\u5C04\u3001\u30D6\u30EA\u30F3\u53CD\u5C04\u3092\u30D6\u30EC\u30F3\u30C9\u3057\u307E\u3059\u3002\n * @param[in] blend \u30D6\u30EC\u30F3\u30C9\u7387\n * @param[in] blinn \u30D6\u30EA\u30F3\u306E\u5024\n * @param[in] aniso \u7570\u65B9\u6027\u306E\u5024\n */\nmediump float calculateSpecularBlend(mediump float blend, mediump float blinn, mediump float aniso)\n{\n\treturn mix(aniso, blinn, blend);\n}\n\n/**\n * @brief \u30A2\u30F3\u30D3\u30A8\u30F3\u30C8\u3092\u8A08\u7B97\u3057\u307E\u3059\u3002\n * @param[in] light    \u30E9\u30A4\u30C8\n * @param[in] material \u30DE\u30C6\u30EA\u30A2\u30EB\n */\nmediump vec3 calculateAmbientColor(mediump vec3 light, mediump vec3 material)\n{\n\treturn light * material;\n}\n\n/**\n * @brief \u62E1\u6563\u3092\u8A08\u7B97\u3057\u307E\u3059\u3002\n * @param[in] light    \u30E9\u30A4\u30C8\n * @param[in] material \u30DE\u30C6\u30EA\u30A2\u30EB\n * @param[in] ln       \u30E9\u30A4\u30C8\u3068\u6CD5\u7DDA\u306E\u5185\u7A4D\n */\nmediump vec3 calculateDiffuseColor(mediump vec3 light, mediump vec3 material, mediump float ln)\n{\n\treturn light * material * ln;\n}\n\n/**\n * @brief \u93E1\u9762\u53CD\u5C04\u3092\u8A08\u7B97\u3057\u307E\u3059\u3002\n * @param[in] light      \u30E9\u30A4\u30C8\n * @param[in] material   \u30DE\u30C6\u30EA\u30A2\u30EB\n * @param[in] reflection \u53CD\u5C04\u7387\n * @param[in] strength   \u5E45\n */\nmediump vec3 calculateSpecularColor(mediump vec3 light, mediump vec3 material, mediump float reflection, mediump float strength)\n{\n\treturn light * material * reflection * strength;\n}\n\n/**\n * @brief \u30EA\u30E0\u3092\u8A08\u7B97\u3057\u307E\u3059\u3002\n * @param[in] color   \u30EA\u30E0\u8272\n * @param[in] normalZ \u6CD5\u7DDA\u306EZ\u65B9\u5411\n * @param[in] width   \u30EA\u30E0\u5E45\n * @param[in] power   \u30EA\u30E0\u306E\u92ED\u3055\n */\nmediump vec3 calculateRimColor(mediump vec3 color, mediump float normalZ, mediump float width, mediump float power)\n{\n\treturn color * pow(width * (1.0 - abs(normalZ)), power);\n}\n\n/**\n * @brief \u30E9\u30A4\u30C8\u65B9\u5411\u3068\u6CD5\u7DDA\u306E\u5185\u7A4D\u3092\u6C42\u3081\u308B\n * @note \u7279\u6B8A\u306A\u5B9F\u88C5\u306B\u306A\u3063\u3066\u3044\u307E\u3059\u3002\n */\nmediump float calculateDot(mediump vec3 light, mediump vec3 normal)\n{\n\treturn max(dot(light, normal), 0.1);\n}\n\n// \u30D5\u30E9\u30B0\u30E1\u30F3\u30C8\u30B7\u30A7\u30FC\u30C0\u30FC\u306B\u5165\u529B\u3055\u308C\u308B varying \u5909\u6570\nvarying mediump vec4 v_color;          //!< \u51FA\u529B: \u9802\u70B9\u306E\u8272\nvarying highp   vec4 v_position;       //!< \u51FA\u529B: \u4F4D\u7F6E\u60C5\u5831\nvarying highp   vec3 v_normal;         //!< \u51FA\u529B: \u6CD5\u7DDA\u30D9\u30AF\u30C8\u30EB\n// NOTE: ^^ Those two need to be highp to avoid weird black dot issue on Android\nvarying mediump vec3 v_tangent;        //!< \u51FA\u529B: \u7570\u65B9\u4F4D\nvarying mediump vec2 v_texCoord;       //!< \u51FA\u529B: \u30C6\u30AF\u30B9\u30C1\u30E3\u30FC\u5EA7\u6A19\n\n/// const\u30AB\u30E9\u30FC\nuniform mediump vec3  u_const1; ///< const\u30AB\u30E9\u30FC1\nuniform mediump vec3  u_const2; ///< const\u30AB\u30E9\u30FC2\nuniform mediump vec3  u_const3; ///< const\u30AB\u30E9\u30FC3\n\n/// \u30E9\u30A4\u30C8\u8A2D\u5B9A\nuniform mediump vec3 u_light_ambient;  ///< \u30AB\u30E1\u30E9\u7A7A\u9593\u306E\u30E9\u30A4\u30C8\u65B9\u5411\nuniform mediump vec3 u_light_diffuse;  ///< \u62E1\u6563\u5149\u7528\u30E9\u30A4\u30C8\nuniform mediump vec3 u_light_dir;\nuniform bool u_light_enable;\nuniform mediump vec3 u_light_specular; ///< \u93E1\u9762\u53CD\u5C04\u7528\u30E9\u30A4\u30C8\u5F37\u5EA6\n\n/// \u30DE\u30C6\u30EA\u30A2\u30EB\u8A2D\u5B9A\nuniform mediump vec3 u_material_ambient;         ///< \u74B0\u5883\u5149\u7528\u30DE\u30C6\u30EA\u30A2\u30EB\u8A2D\u5B9A\nuniform mediump vec3 u_material_diffuse;         ///< \u62E1\u6563\u5149\u7528\u30DE\u30C6\u30EA\u30A2\u30EB\u8A2D\u5B9A\nuniform mediump vec3 u_material_specular;        ///< \u93E1\u9762\u53CD\u5C04\u7528\u30DE\u30C6\u30EA\u30A2\u30EB\u8A2D\u5B9A\nuniform int u_material_specular_mode;            ///< \u30B9\u30DA\u30AD\u30E5\u30E9\u306E\u53CD\u5C04\u30E2\u30FC\u30C9(CharModel\u306B\u4F9D\u5B58\u3059\u308B\u8A2D\u5B9A\u306E\u305F\u3081ub_modulate\u306B\u3057\u3066\u3044\u308B)\nuniform mediump float u_material_specular_power; ///< \u30B9\u30DA\u30AD\u30E5\u30E9\u306E\u92ED\u3055(0.0\u3092\u6307\u5B9A\u3059\u308B\u3068\u9802\u70B9\u30AB\u30E9\u30FC\u306E\u8A2D\u5B9A\u304C\u5229\u7528\u3055\u308C\u308B)\n\n/// \u5909\u8ABF\u8A2D\u5B9A\nuniform int u_mode;   ///< \u63CF\u753B\u30E2\u30FC\u30C9\nuniform mediump float u_opacity; // Needed for Three.js opacity value.\n\n/// \u30EA\u30E0\u8A2D\u5B9A\nuniform mediump vec3  u_rim_color;\nuniform mediump float u_rim_power;\n\n// \u30B5\u30F3\u30D7\u30E9\u30FC\nuniform sampler2D s_texture;\n\n\n// -------------------------------------------------------\n// \u30E1\u30A4\u30F3\u6587\nvoid main()\n{\n    mediump vec4 color;\n\n    mediump float specularPower    = u_material_specular_power;\n    mediump float rimWidth         = v_color.a;\n\n//#ifdef FFL_MODULATE_MODE_CONSTANT\n    if(u_mode == FFL_MODULATE_MODE_CONSTANT)\n    {\n      color = vec4(u_const1.rgb, u_opacity);\n    }\n    // modified to handle u_const1 alpha:\n//#elif defined(FFL_MODULATE_MODE_TEXTURE_DIRECT)\n    else if(u_mode == FFL_MODULATE_MODE_TEXTURE_DIRECT)\n    {\n        mediump vec4 texel = texture2D(s_texture, v_texCoord);\n        color = vec4(texel.rgb, u_opacity * texel.a);\n    }\n//#elif defined(FFL_MODULATE_MODE_RGB_LAYERED)\n    else if(u_mode == FFL_MODULATE_MODE_RGB_LAYERED)\n    {\n        mediump vec4 texel = texture2D(s_texture, v_texCoord);\n        color = vec4(texel.r * u_const1.rgb + texel.g * u_const2.rgb + texel.b * u_const3.rgb, u_opacity * texel.a);\n    }\n//#elif defined(FFL_MODULATE_MODE_ALPHA)\n    else if(u_mode == FFL_MODULATE_MODE_ALPHA)\n    {\n        mediump vec4 texel = texture2D(s_texture, v_texCoord);\n        color = vec4(u_const1.rgb, u_opacity * texel.r);\n    }\n//#elif defined(FFL_MODULATE_MODE_LUMINANCE_ALPHA)\n    else if(u_mode == FFL_MODULATE_MODE_LUMINANCE_ALPHA)\n    {\n        mediump vec4 texel = texture2D(s_texture, v_texCoord);\n        color = vec4(texel.g * u_const1.rgb, u_opacity * texel.r);\n    }\n//#elif defined(FFL_MODULATE_MODE_ALPHA_OPA)\n    else if(u_mode == FFL_MODULATE_MODE_ALPHA_OPA)\n    {\n        mediump vec4 texel = texture2D(s_texture, v_texCoord);\n        color = vec4(texel.r * u_const1.rgb, u_opacity);\n    }\n//#endif\n\n    // avoids little outline around mask elements\n    if(u_mode != FFL_MODULATE_MODE_CONSTANT && color.a == 0.0)\n    {\n        discard;\n    }\n\n//#ifdef FFL_LIGHT_MODE_ENABLE\n    if(u_light_enable)\n    {\n        /// \u74B0\u5883\u5149\u306E\u8A08\u7B97\n        mediump vec3 ambient = calculateAmbientColor(u_light_ambient.xyz, u_material_ambient.xyz);\n\n        /// \u6CD5\u7DDA\u30D9\u30AF\u30C8\u30EB\u306E\u6B63\u898F\u5316\n        mediump vec3 norm = normalize(v_normal);\n\n        /// \u8996\u7DDA\u30D9\u30AF\u30C8\u30EB\n        mediump vec3 eye = normalize(-v_position.xyz);\n\n        // \u30E9\u30A4\u30C8\u306E\u5411\u304D\n        mediump float fDot = calculateDot(u_light_dir, norm);\n\n        /// Diffuse\u8A08\u7B97\n        mediump vec3 diffuse = calculateDiffuseColor(u_light_diffuse.xyz, u_material_diffuse.xyz, fDot);\n\n        /// Specular\u8A08\u7B97\n        mediump float specularBlinn = calculateBlinnSpecular(u_light_dir, norm, eye, u_material_specular_power);\n\n        /// Specular\u306E\u5024\u3092\u78BA\u4FDD\u3059\u308B\u5909\u6570\u3092\u5BA3\u8A00\n        mediump float reflection;\n        mediump float strength = v_color.g;\n        if(u_material_specular_mode == 0)\n        {\n            /// Blinn\u30E2\u30C7\u30EB\u306E\u5834\u5408\n            strength = 1.0;\n            reflection = specularBlinn;\n        }\n        else\n        {\n            /// Aiso\u30E2\u30C7\u30EB\u306E\u5834\u5408\n            mediump float specularAniso = calculateAnisotropicSpecular(u_light_dir, v_tangent, eye, u_material_specular_power);\n            reflection = calculateSpecularBlend(v_color.r, specularBlinn, specularAniso);\n        }\n        /// Specular\u306E\u8272\u3092\u53D6\u5F97\n        mediump vec3 specular = calculateSpecularColor(u_light_specular.xyz, u_material_specular.xyz, reflection, strength);\n\n        // \u30EA\u30E0\u306E\u8272\u3092\u8A08\u7B97\n        mediump vec3 rimColor = calculateRimColor(u_rim_color.rgb, norm.z, rimWidth, u_rim_power);\n\n        // \u30AB\u30E9\u30FC\u306E\u8A08\u7B97\n        color.rgb = (ambient + diffuse) * color.rgb + specular + rimColor;\n    }\n//#endif\n\n    gl_FragColor = color;\n}\n`;\n// #include <tonemapping_fragment>\n// #include <${THREE.REVISION >= 154 ? 'colorspace_fragment' : 'encodings_fragment'}>\n\n// // ---------------------------------------------------------------------\n// //  FFLShaderMaterial Class\n// // ---------------------------------------------------------------------\n/**\n * Custom THREE.ShaderMaterial using the FFLShader.\n * @augments {THREE.ShaderMaterial}\n */\nclass FFLShaderMaterial extends THREE.ShaderMaterial {\n\t// Default light and rim light uniforms.\n\n\t/**\n\t * Default ambient light color.\n\t * @type {THREE.Color}\n\t */\n\tstatic defaultLightAmbient = /* @__PURE__ */ new THREE.Color(0.73, 0.73, 0.73);\n\t/**\n\t * Default diffuse light color.\n\t * @type {THREE.Color}\n\t */\n\tstatic defaultLightDiffuse = /* @__PURE__ */ new THREE.Color(0.6, 0.6, 0.6);\n\t/**\n\t * Default specular light color.\n\t * @type {THREE.Color}\n\t */\n\tstatic defaultLightSpecular = /* @__PURE__ */ new THREE.Color(0.7, 0.7, 0.7);\n\t/**\n\t * Default light direction.\n\t * @type {THREE.Vector3}\n\t */\n\tstatic defaultLightDir = /* @__PURE__ */ new THREE.Vector3(-0.45315, 0.42262, 0.78489);\n\t/**\n\t * Default rim color.\n\t * @type {THREE.Color}\n\t */\n\tstatic defaultRimColor = /* @__PURE__ */ new THREE.Color(0.3, 0.3, 0.3);\n\t/**\n\t * Default rim color for the body.\n\t * @type {THREE.Color}\n\t */\n\tstatic defaultRimColorBody = /* @__PURE__ */ new THREE.Color(0.4, 0.4, 0.4);\n\t/**\n\t * Default rim power (intensity).\n\t * @type {number}\n\t */\n\tstatic defaultRimPower = 2;\n\n\t/**\n\t * Alias for default light direction.\n\t * @type {THREE.Vector3}\n\t */\n\tstatic defaultLightDirection = this.defaultLightDir;\n\n\t/**\n\t * Material uniform table mapping to FFLModulateType.\n\t * Reference: https://github.com/aboood40091/FFL-Testing/blob/master/src/Shader.cpp\n\t * @package\n\t */\n\tstatic materialParams = [\n\t\t{\n\t\t\t// FFL_MODULATE_TYPE_SHAPE_FACELINE\n\t\t\tambient: new THREE.Color(0.85, 0.75, 0.75)/* .convertSRGBToLinear() */,\n\t\t\tdiffuse: new THREE.Color(0.75, 0.75, 0.75)/* .convertSRGBToLinear() */,\n\t\t\tspecular: new THREE.Color(0.3, 0.3, 0.3)/* .convertSRGBToLinear() */,\n\t\t\tspecularPower: 1.2,\n\t\t\tspecularMode: 0\n\t\t},\n\t\t{\n\t\t\t// FFL_MODULATE_TYPE_SHAPE_BEARD\n\t\t\tambient: new THREE.Color(1, 1, 1)/* .convertSRGBToLinear() */,\n\t\t\tdiffuse: new THREE.Color(0.7, 0.7, 0.7)/* .convertSRGBToLinear() */,\n\t\t\tspecular: new THREE.Color(0, 0, 0)/* .convertSRGBToLinear() */,\n\t\t\tspecularPower: 40,\n\t\t\tspecularMode: 1\n\t\t},\n\t\t{\n\t\t\t// FFL_MODULATE_TYPE_SHAPE_NOSE\n\t\t\tambient: new THREE.Color(0.9, 0.85, 0.85)/* .convertSRGBToLinear() */,\n\t\t\tdiffuse: new THREE.Color(0.75, 0.75, 0.75)/* .convertSRGBToLinear() */,\n\t\t\tspecular: new THREE.Color(0.22, 0.22, 0.22)/* .convertSRGBToLinear() */,\n\t\t\tspecularPower: 1.5,\n\t\t\tspecularMode: 0\n\t\t},\n\t\t{\n\t\t\t// FFL_MODULATE_TYPE_SHAPE_FOREHEAD\n\t\t\tambient: new THREE.Color(0.85, 0.75, 0.75)/* .convertSRGBToLinear() */,\n\t\t\tdiffuse: new THREE.Color(0.75, 0.75, 0.75)/* .convertSRGBToLinear() */,\n\t\t\tspecular: new THREE.Color(0.3, 0.3, 0.3)/* .convertSRGBToLinear() */,\n\t\t\tspecularPower: 1.2,\n\t\t\tspecularMode: 0\n\t\t},\n\t\t{\n\t\t\t// FFL_MODULATE_TYPE_SHAPE_HAIR\n\t\t\tambient: new THREE.Color(1, 1, 1)/* .convertSRGBToLinear() */,\n\t\t\tdiffuse: new THREE.Color(0.7, 0.7, 0.7)/* .convertSRGBToLinear() */,\n\t\t\tspecular: new THREE.Color(0.35, 0.35, 0.35)/* .convertSRGBToLinear() */,\n\t\t\tspecularPower: 10,\n\t\t\tspecularMode: 1\n\t\t},\n\t\t{\n\t\t\t// FFL_MODULATE_TYPE_SHAPE_CAP\n\t\t\tambient: new THREE.Color(0.75, 0.75, 0.75)/* .convertSRGBToLinear() */,\n\t\t\tdiffuse: new THREE.Color(0.72, 0.72, 0.72)/* .convertSRGBToLinear() */,\n\t\t\tspecular: new THREE.Color(0.3, 0.3, 0.3)/* .convertSRGBToLinear() */,\n\t\t\tspecularPower: 1.5,\n\t\t\tspecularMode: 0\n\t\t},\n\t\t{\n\t\t\t// FFL_MODULATE_TYPE_SHAPE_MASK\n\t\t\tambient: new THREE.Color(1, 1, 1)/* .convertSRGBToLinear() */,\n\t\t\tdiffuse: new THREE.Color(0.7, 0.7, 0.7)/* .convertSRGBToLinear() */,\n\t\t\tspecular: new THREE.Color(0, 0, 0)/* .convertSRGBToLinear() */,\n\t\t\tspecularPower: 40,\n\t\t\tspecularMode: 1\n\t\t},\n\t\t{\n\t\t\t// FFL_MODULATE_TYPE_SHAPE_NOSELINE\n\t\t\tambient: new THREE.Color(1, 1, 1)/* .convertSRGBToLinear() */,\n\t\t\tdiffuse: new THREE.Color(0.7, 0.7, 0.7)/* .convertSRGBToLinear() */,\n\t\t\tspecular: new THREE.Color(0, 0, 0)/* .convertSRGBToLinear() */,\n\t\t\tspecularPower: 40,\n\t\t\tspecularMode: 1\n\t\t},\n\t\t{\n\t\t\t// FFL_MODULATE_TYPE_SHAPE_GLASS\n\t\t\tambient: new THREE.Color(1, 1, 1)/* .convertSRGBToLinear() */,\n\t\t\tdiffuse: new THREE.Color(0.7, 0.7, 0.7)/* .convertSRGBToLinear() */,\n\t\t\tspecular: new THREE.Color(0, 0, 0)/* .convertSRGBToLinear() */,\n\t\t\tspecularPower: 40,\n\t\t\tspecularMode: 1\n\t\t},\n\n\t\t{\n\t\t\t// body\n\t\t\tambient: new THREE.Color(0.95622, 0.95622, 0.95622)/* .convertSRGBToLinear() */,\n\t\t\tdiffuse: new THREE.Color(0.49673, 0.49673, 0.49673)/* .convertSRGBToLinear() */,\n\t\t\tspecular: new THREE.Color(0.24099, 0.24099, 0.24099)/* .convertSRGBToLinear() */,\n\t\t\tspecularPower: 3,\n\t\t\tspecularMode: 0\n\t\t},\n\t\t{\n\t\t\t// pants\n\t\t\tambient: new THREE.Color(0.95622, 0.95622, 0.95622)/* .convertSRGBToLinear() */,\n\t\t\tdiffuse: new THREE.Color(1.08497, 1.08497, 1.08497)/* .convertSRGBToLinear() */,\n\t\t\tspecular: new THREE.Color(0.2409, 0.2409, 0.2409)/* .convertSRGBToLinear() */,\n\t\t\tspecularPower: 3,\n\t\t\tspecularMode: 0\n\t\t}\n\t];\n\n\t/**\n\t * Constructs an FFLShaderMaterial instance.\n\t * @param {THREE.ShaderMaterialParameters & FFLShaderMaterialParameters} [options] -\n\t * Parameters for the material.\n\t */\n\tconstructor(options = {}) {\n\t\t// Set default uniforms.\n\t\t/** @type {Object<string, THREE.IUniform>} */\n\t\tconst uniforms = {\n\t\t\tu_light_ambient: {\n\t\t\t\tvalue: FFLShaderMaterial.defaultLightAmbient\n\t\t\t},\n\t\t\tu_light_diffuse: {\n\t\t\t\tvalue: FFLShaderMaterial.defaultLightDiffuse\n\t\t\t},\n\t\t\tu_light_specular: {\n\t\t\t\tvalue: FFLShaderMaterial.defaultLightSpecular\n\t\t\t},\n\t\t\tu_light_dir: { value: FFLShaderMaterial.defaultLightDir.clone() },\n\t\t\tu_light_enable: { value: true }, // Default to true.\n\t\t\tu_rim_power: { value: FFLShaderMaterial.defaultRimPower }\n\t\t};\n\n\t\t// Construct the ShaderMaterial using the shader source.\n\t\tsuper({\n\t\t\tvertexShader: _FFLShader_vert,\n\t\t\tfragmentShader: _FFLShader_frag,\n\t\t\tuniforms: uniforms\n\t\t});\n\n\t\t// Initialize default values.\n\t\tthis.color = /* @__PURE__ */ new THREE.Color();\n\t\tthis.colorG = /* @__PURE__ */ new THREE.Color();\n\t\tthis.colorB = /* @__PURE__ */ new THREE.Color();\n\t\t/**\n\t\t * @type {FFLModulateType}\n\t\t * @private\n\t\t */\n\t\tthis._modulateType = 0;\n\t\tthis.useSpecularModeBlinn = false;\n\n\t\t// Use the setters to set the rest of the uniforms.\n\t\tthis.setValues(options);\n\n\t\t// This is needed because Three.js sets \"opacity\" before\n\t\t// the uniforms are ready, so we must set it again properly.\n\t\t// eslint-disable-next-line no-self-assign -- Commit opacity uniform from temporary storage.\n\t\tthis.opacity = this.opacity;\n\t}\n\n\t/** @returns {THREE.Color|undefined} The color. */\n\tget color() {\n\t\treturn this.uniforms.u_const1 ? this.uniforms.u_const1.value : undefined;\n\t}\n\n\tset color(/** @type {THREE.Color} */ value) {\n\t\tthis.uniforms.u_const1 = { value: value };\n\t}\n\n\t/** @returns {THREE.Color|undefined} colorG color if defined. */\n\tget colorG() {\n\t\treturn this.uniforms.u_const2 ? this.uniforms.u_const2.value : undefined;\n\t}\n\n\tset colorG(/** @type {THREE.Color} */ value) {\n\t\tthis.uniforms.u_const2 = { value };\n\t}\n\n\t/** @returns {THREE.Color|undefined} colorB color if defined. */\n\tget colorB() {\n\t\treturn this.uniforms.u_const3 ? this.uniforms.u_const3.value : undefined;\n\t}\n\n\tset colorB(/** @type {THREE.Color} */ value) {\n\t\tthis.uniforms.u_const3 = { value };\n\t}\n\n\t/**\n\t * Gets the opacity of the constant color.\n\t * @returns {number} The opacity value.\n\t */\n\t// @ts-ignore - Already defined on parent class.\n\tget opacity() {\n\t\tif (this._opacity !== undefined) {\n\t\t\tconst ret = this._opacity;\n\t\t\tthis._opacity = undefined;\n\t\t\treturn ret;\n\t\t}\n\t\treturn this.uniforms.u_opacity ? this.uniforms.u_opacity.value : 1;\n\t}\n\n\t/**\n\t * Sets the opacity of the constant color.\n\t * NOTE: that this is actually set in the constructor\n\t * of Material, meaning it is the only one set BEFORE uniforms are\n\t * @param {number} value - The new opacity value.\n\t */\n\t// @ts-ignore - Already defined on parent class.\n\tset opacity(value) {\n\t\tif (this.uniforms) {\n\t\t\tthis.uniforms.u_opacity = { value };\n\t\t\tthis._opacity = undefined;\n\t\t} else {\n\t\t\t// Store here for later when color is set.\n\t\t\t/** @type {number|undefined} @private */\n\t\t\tthis._opacity = value;\n\t\t}\n\t}\n\n\t/**\n\t * Gets the value of the modulateMode uniform.\n\t * @returns {FFLModulateMode|null} The modulateMode value, or null if it is unset.\n\t */\n\tget modulateMode() {\n\t\treturn this.uniforms.u_mode ? this.uniforms.u_mode.value : null;\n\t}\n\n\t/**\n\t * Sets the value of the modulateMode uniform.\n\t * @param {FFLModulateMode} value - The new modulateMode value.\n\t */\n\tset modulateMode(value) {\n\t\tthis.uniforms.u_mode = { value: value };\n\t}\n\n\t/**\n\t * Sets the value determining whether lighting is enabled or not.\n\t * @returns {boolean|null} The lightEnable value, or null if it is unset.\n\t */\n\tget lightEnable() {\n\t\treturn this.uniforms.u_light_enable ? this.uniforms.u_light_enable.value : null;\n\t}\n\n\t/**\n\t * Sets the value determining whether lighting is enabled or not.\n\t * @param {boolean} value - The lightEnable value.\n\t */\n\tset lightEnable(value) {\n\t\tthis.uniforms.u_light_enable = { value: value };\n\t}\n\n\t/**\n\t * Sets whether to override specular mode with 0.\n\t * @param {boolean} value - The useSpecularModeBlinn value.\n\t */\n\tset useSpecularModeBlinn(value) {\n\t\t/** @private */\n\t\tthis._useSpecularModeBlinn = value;\n\t\tif (this._modulateType !== undefined) {\n\t\t\t// Set material again if it was already set.\n\t\t\tthis.modulateType = this._modulateType;\n\t\t}\n\t}\n\n\t/**\n\t * Gets the value for whether to override specular mode with 0.\n\t * @returns {boolean|undefined} The useSpecularModeBlinn value.\n\t */\n\tget useSpecularModeBlinn() {\n\t\treturn this._useSpecularModeBlinn;\n\t}\n\n\t/**\n\t * Gets the modulateType value.\n\t * @returns {FFLModulateType|undefined} The modulateType value if it is set.\n\t */\n\tget modulateType() {\n\t\t// This isn't actually a uniform so this is a private property.\n\t\treturn this._modulateType;\n\t}\n\n\t/**\n\t * Sets the material uniforms based on the modulate type value.\n\t * @param {FFLModulateType} value - The new modulateType value.\n\t */\n\tset modulateType(value) {\n\t\t// Get material uniforms for modulate type from materialParams table.\n\t\tconst matParam = FFLShaderMaterial.materialParams[value];\n\t\tif (!matParam) {\n\t\t\t// Out of bounds modulateType that don't have materials\n\t\t\t// are usually for mask/faceline textures, so don't throw error\n\t\t\treturn;\n\t\t}\n\t\tthis._modulateType = value;\n\n\t\t// Set material uniforms from matParam object.\n\t\tthis.uniforms.u_material_ambient = { value: matParam.ambient };\n\t\tthis.uniforms.u_material_diffuse = { value: matParam.diffuse };\n\t\tthis.uniforms.u_material_specular = { value: matParam.specular };\n\t\tthis.uniforms.u_material_specular_mode = {\n\t\t\t// Force value of 0 if useSpecularModeBlinn is set.\n\t\t\tvalue: this._useSpecularModeBlinn ? 0 : matParam.specularMode\n\t\t};\n\t\tthis.uniforms.u_material_specular_power = { value: matParam.specularPower };\n\t\tconst rimColor = value > 8\n\t\t\t? FFLShaderMaterial.defaultRimColorBody\n\t\t\t: FFLShaderMaterial.defaultRimColor;\n\t\tthis.uniforms.u_rim_color = { value: rimColor };\n\t}\n\n\t/**\n\t * Gets the texture map if it is set.\n\t * @returns {THREE.Texture|null} The texture map, or null if it is unset.\n\t */\n\tget map() {\n\t\treturn this.uniforms.s_texture ? this.uniforms.s_texture.value : null;\n\t}\n\n\t/**\n\t * Sets the texture map (s_texture uniform).\n\t * @param {THREE.Texture} value - The new texture map.\n\t */\n\tset map(value) {\n\t\tthis.uniforms.s_texture = { value: value };\n\t}\n\n\t/**\n\t * Gets the light direction.\n\t * @returns {THREE.Vector3} The light direction.\n\t */\n\tget lightDirection() {\n\t\t// Should always be set as long as this is constructed.\n\t\treturn this.uniforms.u_light_dir.value;\n\t}\n\n\t/**\n\t * Sets the light direction.\n\t * @param {THREE.Vector3} value - The new light direction.\n\t */\n\tset lightDirection(value) {\n\t\tthis.uniforms.u_light_dir = { value: value };\n\t}\n}\n\nexport default FFLShaderMaterial;\n", "/**\n * @file FFLShaderNodeMaterial.js\n * Three.js node material class (for WebGPURenderer) meant\n * to reproduce the FFLDefaultShader, like FFLShaderMaterial.js.\n * @author Arian Kordi <https://github.com/ariankordi>\n */\n// @ts-check\nimport { Color, Vector4 } from 'three';\nimport { AttributeNode, NodeMaterial } from 'three/webgpu';\nimport {\n\tFn, uniform, materialReference,\n\tvec3, vec4, float, select,\n\tdot, max, pow, reflect, abs,\n\toneMinus, sqrt, negate, mix,\n\tnodeObject, normalView,\n\ttangentView, positionViewDirection\n} from 'three/tsl';\nimport TextureShaderNodeMaterial from './TextureShaderNodeMaterial.js';\nimport FFLShaderMaterial from './FFLShaderMaterial.js';\n\n/**\n * Provides the \"_color\" / \"param\" attribute, or a placeholder if it doesn't exist.\n * See VertexColorNode: https://github.com/mrdoob/three.js/blob/cbc975bfee24bca21d22797bacc45a8b8a2f3ebe/src/nodes/accessors/VertexColorNode.js#L63\n * @augments AttributeNode\n */\nclass ParamColorNode extends AttributeNode {\n\tconstructor() {\n\t\tsuper('', 'vec4');\n\t}\n\n\t// eslint-disable-next-line class-methods-use-this -- Needs to be a method for the inherited class.\n\tgetAttributeName = () => '_color';\n\n\tgenerate(/** @type {import('three/webgpu').NodeBuilder} */ builder) {\n\t\treturn builder.hasGeometryAttribute(\n\t\t\tthis.getAttributeName()\n\t\t) === true\n\t\t\t? super.generate(builder)\n\t\t\t// @ts-ignore -- generateConst not defined in the .d.ts.\n\t\t\t: builder.generateConst(this.nodeType,\n\t\t\t\t// Vertex color fallback should be white.\n\t\t\t\tnew Vector4(1, 1, 0, 1));\n\t}\n}\n\n/**\n * NodeMaterial port of {@link FFLShaderMaterial} in Three.js Shading Language.\n * Makes use of {@link TextureShaderNodeMaterial} for texture modulation.\n */\nexport default class FFLShaderNodeMaterial extends NodeMaterial {\n\t/**\n\t * Constructs an FFLShaderNodeMaterial instance.\n\t * @param {import('three').MeshBasicMaterialParameters\n\t * & {colorG?: Color, colorB?: Color}} [options] - Parameters for the material.\n\t */\n\tconstructor(options = {}) {\n\t\tsuper();\n\n\t\tthis.map = options.map; // Set texture map.\n\t\t// Use setter to set all colors if they are there.\n\t\tthis.color = options.color ?? new Color();\n\t\tthis.colorG = options.colorG ?? new Color();\n\t\tthis.colorB = options.colorB ?? new Color();\n\n\t\t// Set FFL specific defaults, which will be overridden by options.\n\t\tthis.modulateMode = this.modulateType = 0;\n\t\tthis.lightEnable = true;\n\t\t// TODO: I don't think properties such as opacity actually update.\n\n\t\tthis.setValues(options); // Set all from options.\n\n\t\t// Default uniforms from FFLShaderMaterial.\n\t\tthis.uLightAmbient = uniform(FFLShaderMaterial.defaultLightAmbient);\n\t\tthis.uLightDiffuse = uniform(FFLShaderMaterial.defaultLightDiffuse);\n\t\tthis.uLightSpecular = uniform(FFLShaderMaterial.defaultLightSpecular);\n\t\tthis.uLightDir = uniform(FFLShaderMaterial.defaultLightDir.clone().normalize());\n\t\tthis.uRimPower = uniform(FFLShaderMaterial.defaultRimPower);\n\n\t\t// TODO: Like TextureShaderNodeMaterial, this needs alpha testing.\n\t\tthis.fragmentNode = /* @__PURE__ */ Fn(() => {\n\t\t\t// TODO: This should be included more elegantly.\n\t\t\t// Like, we need it to be a colorNode.\n\t\t\tconst color = TextureShaderNodeMaterial.fragmentNode({\n\t\t\t\tdiffuse: uniform(this.color),\n\t\t\t\tcolorG: uniform(this.colorG),\n\t\t\t\tcolorB: uniform(this.colorB),\n\t\t\t\topacity: uniform(this.opacity),\n\t\t\t\tmodulateMode: uniform(this._modulateMode),\n\t\t\t\ttexel: this.map ? materialReference('map', 'texture') : null\n\t\t\t});\n\n\t\t\tif (!this.lightEnable) {\n\t\t\t\treturn color;\n\t\t\t}\n\t\t\t// TODO: The logic below can probably be made into\n\t\t\t// specific nodes. lightsNode? or... MeshPhongNodeMaterial.specularNode?????\n\n\t\t\t// Normal vector, eye point, light direction.\n\t\t\tconst norm = normalView;\n\t\t\tconst eye = positionViewDirection;\n\t\t\tconst lightDir = vec3(this.uLightDir);\n\t\t\t/** Light Direction * Normal, max = 0.1. */\n\t\t\tconst fDot = max(dot(lightDir, norm), float(0.1));\n\n\t\t\t/** Ambient */\n\t\t\tconst ambient = vec3(this.uLightAmbient).mul(vec3(this.uMaterialAmbient));\n\t\t\t/** Diffuse */\n\t\t\tconst diffuse = vec3(this.uLightDiffuse)\n\t\t\t\t.mul(vec3(this.uMaterialDiffuse))\n\t\t\t\t.mul(fDot);\n\n\t\t\t/** Specular (Blinn) */\n\t\t\tconst specularBlinn =\n\t\t\t\tpow(max(dot(reflect(\n\t\t\t\t\tnegate(lightDir), norm), eye), float(0)),\n\t\t\t\tfloat(this.uMaterialSpecularPower));\n\n\t\t\t// Use tangent for aniso specular.\n\t\t\tconst tangent = vec3(tangentView);\n\n\t\t\tconst dotLT = dot(lightDir, tangent);\n\t\t\tconst dotVT = dot(eye, tangent);\n\t\t\tconst dotLN = sqrt(oneMinus(dotLT.mul(dotLT)));\n\t\t\tconst dotVR = dotLN.mul(sqrt(oneMinus(dotVT.mul(dotVT)))).sub(dotLT.mul(dotVT));\n\t\t\t/** Anisotropic specular */\n\t\t\tconst specularAniso = pow(max(dotVR, float(0)),\n\t\t\t\tfloat(this.uMaterialSpecularPower));\n\n\t\t\t// 0 = Blinn, 1 = Anisotropic\n\t\t\tconst useAniso = float(this.uMaterialSpecularMode);\n\n\t\t\t/** Anisotropic/rim color parameters. */\n\t\t\t// const param = attribute('_color', 'vec4');\n\t\t\tconst param = nodeObject(new ParamColorNode());\n\t\t\tconst anisoReflection = mix(specularAniso, specularBlinn, param.r);\n\n\t\t\t/** Anisotropic or Blinn reflection. */\n\t\t\tconst reflection = select(\n\t\t\t\tuseAniso.equal(1),\n\t\t\t\tanisoReflection,\n\t\t\t\tspecularBlinn\n\t\t\t);\n\n\t\t\t/** Specular strength. Blinn = always 1.0 */\n\t\t\tconst strength = select(\n\t\t\t\tuseAniso.equal(1),\n\t\t\t\tparam.g, // Blend ratio.\n\t\t\t\tfloat(1)\n\t\t\t);\n\n\t\t\t/** Final specular calculation from blinn/aniso reflection and strength. */\n\t\t\tconst specular = vec3(this.uLightSpecular)\n\t\t\t\t.mul(vec3(this.uMaterialSpecular))\n\t\t\t\t.mul(reflection)\n\t\t\t\t.mul(strength);\n\n\t\t\t/** Rim color */\n\t\t\tconst rimColor = vec3(this.uRimColor)\n\t\t\t\t.mul(\n\t\t\t\t\t// param.a = rim width\n\t\t\t\t\tpow(param.a.mul(oneMinus(abs(norm.z))), float(this.uRimPower))\n\t\t\t\t);\n\n\t\t\t// Final combined ambient/specular/diffuse color.\n\t\t\treturn vec4(\n\t\t\t\tambient.add(diffuse)\n\t\t\t\t\t.mul(color.rgb)\n\t\t\t\t\t.add(specular)\n\t\t\t\t\t.add(rimColor),\n\t\t\t\tcolor.a);\n\t\t})();\n\t}\n\n\t/** @returns {import('../ffl.js').FFLModulateMode|undefined} The modulateMode value, or null if it is unset. */\n\tget modulateMode() {\n\t\treturn this._modulateMode;\n\t}\n\n\t/** @param {import('../ffl.js').FFLModulateMode} value - The new modulateMode value. */\n\tset modulateMode(value) {\n\t\t/** @private */\n\t\tthis._modulateMode = value;\n\t}\n\n\t/**\n\t * Gets the modulateType value.\n\t * @returns {import('../ffl.js').FFLModulateType|undefined} The modulateType value if it is set.\n\t */\n\tget modulateType() {\n\t\t// This isn't actually a uniform so this is a private property.\n\t\treturn this._modulateType;\n\t}\n\n\t/**\n\t * Sets the material uniforms based on the modulate type value.\n\t * @param {import('../ffl.js').FFLModulateType} value - The new modulateType value.\n\t */\n\tset modulateType(value) {\n\t\t// Get material uniforms for modulate type from materialParams table.\n\t\tconst matParam = FFLShaderMaterial.materialParams[value];\n\t\tif (!matParam) {\n\t\t\t// Out of bounds modulateType that don't have materials\n\t\t\t// are usually for mask/faceline textures, so don't throw error\n\t\t\treturn;\n\t\t}\n\t\t/** @private */\n\t\tthis._modulateType = value;\n\n\t\tthis.uMaterialAmbient = uniform(matParam.ambient);\n\t\tthis.uMaterialDiffuse = uniform(matParam.diffuse);\n\t\tthis.uMaterialSpecular = uniform(matParam.specular);\n\t\tthis.uMaterialSpecularMode = uniform(matParam.specularMode);\n\t\tthis.uMaterialSpecularPower = uniform(matParam.specularPower);\n\t\tconst rimColor = value > 8\n\t\t\t? FFLShaderMaterial.defaultRimColorBody\n\t\t\t: FFLShaderMaterial.defaultRimColor;\n\t\tthis.uRimColor = uniform(rimColor);\n\t}\n\n\t/**\n\t * Gets the light direction.\n\t * @returns {import('three').Vector3} The light direction.\n\t */\n\tget lightDirection() {\n\t\t// Should always be set as long as this is constructed.\n\t\treturn this.uLightDir.value;\n\t}\n\n\t/**\n\t * Sets the light direction.\n\t * @param {import('three').Vector3} value - The new light direction.\n\t */\n\tset lightDirection(value) {\n\t\tthis.uLightDir.value = value;\n\t}\n}\n", "var ModuleFFL = (() => {\n  var _scriptName = typeof document != 'undefined' ? document.currentScript?.src : undefined;\n  \n  return (\nasync function(moduleArg = {}) {\n  var moduleRtn;\n\nvar Module=moduleArg;var readyPromiseResolve,readyPromiseReject;var readyPromise=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var ENVIRONMENT_IS_WEB=true;var ENVIRONMENT_IS_WORKER=false;var moduleOverrides=Object.assign({},Module);var scriptDirectory=\"\";var readAsync,readBinary;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!=\"undefined\"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptName){scriptDirectory=_scriptName}if(scriptDirectory.startsWith(\"blob:\")){scriptDirectory=\"\"}else{scriptDirectory=scriptDirectory.slice(0,scriptDirectory.replace(/[?#].*/,\"\").lastIndexOf(\"/\")+1)}{readAsync=async url=>{var response=await fetch(url,{credentials:\"same-origin\"});if(response.ok){return response.arrayBuffer()}throw new Error(response.status+\" : \"+response.url)}}}else{}var out=console.log.bind(console);var err=console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;var wasmBinary;var wasmMemory;var ABORT=false;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAP64,HEAPU64,HEAPF64;var runtimeInitialized=false;function updateMemoryViews(){var b=wasmMemory.buffer;Module[\"HEAP8\"]=HEAP8=new Int8Array(b);HEAP16=new Int16Array(b);Module[\"HEAPU8\"]=HEAPU8=new Uint8Array(b);Module[\"HEAPU16\"]=HEAPU16=new Uint16Array(b);Module[\"HEAP32\"]=HEAP32=new Int32Array(b);Module[\"HEAPU32\"]=HEAPU32=new Uint32Array(b);Module[\"HEAPF32\"]=HEAPF32=new Float32Array(b);HEAPF64=new Float64Array(b);HEAP64=new BigInt64Array(b);HEAPU64=new BigUint64Array(b)}function preRun(){}function initRuntime(){runtimeInitialized=true;wasmExports[\"e\"]()}function postRun(){}var runDependencies=0;var dependenciesFulfilled=null;function addRunDependency(id){runDependencies++}function removeRunDependency(id){runDependencies--;if(runDependencies==0){if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){what=\"Aborted(\"+what+\")\";err(what);ABORT=true;what+=\". Build with -sASSERTIONS for more info.\";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var wasmBinaryFile=\"data:application/octet-stream;base64,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gP4DcUEIdHIgAUEIdkGA/gNxIAFBGHZycjYCGCAAIAAoAhwiAUEYdCABQYD+A3FBCHRyIAFBCHZBgP4DcSABQRh2cnI2AhwgACAAKAIgIgFBGHQgAUGA/gNxQQh0ciABQQh2QYD+A3EgAUEYdnJyNgIgIAAgACgCJCIBQRh0IAFBgP4DcUEIdHIgAUEIdkGA/gNxIAFBGHZycjYCJCAAIAAoAigiAUEYdCABQYD+A3FBCHRyIAFBCHZBgP4DcSABQRh2cnI2AiggACAAKAIsIgFBGHQgAUGA/gNxQQh0ciABQQh2QYD+A3EgAUEYdnJyNgIsIAAgACgCMCIBQRh0IAFBgP4DcUEIdHIgAUEIdkGA/gNxIAFBGHZycjYCMCAAIAAoAjQiAUEYdCABQYD+A3FBCHRyIAFBCHZBgP4DcSABQRh2cnI2AjQgACAAKAI4IgFBGHQgAUGA/gNxQQh0ciABQQh2QYD+A3EgAUEYdnJyNgI4IAAgACgCPCIAQRh0IABBgP4DcUEIdHIgAEEIdkGA/gNxIABBGHZycjYCPCADIAMoAgAoAiARAAAiACAAKAIAIgFBGHQgAUGA/gNxQQh0ciABQQh2QYD+A3EgAUEYdnJyNgIAIAAgACgCBCIBQRh0IAFBgP4DcUEIdHIgAUEIdkGA/gNxIAFBGHZycjYCBCAAIAAoAggiAUEYdCABQYD+A3FBCHRyIAFBCHZBgP4DcSABQRh2cnI2AgggACAAKAIMIgFBGHQgAUGA/gNxQQh0ciABQQh2QYD+A3EgAUEYdnJyNgIMIAAgACgCECIBQRh0IAFBgP4DcUEIdHIgAUEIdkGA/gNxIAFBGHZycjYCECAAIAAoAhQiAUEYdCABQYD+A3FBCHRyIAFBCHZBgP4DcSABQRh2cnI2AhQgACAAKAIYIgFBGHQgAUGA/gNxQQh0ciABQQh2QYD+A3EgAUEYdnJyNgIYIAAgACgCHCIBQRh0IAFBgP4DcUEIdHIgAUEIdkGA/gNxIAFBGHZycjYCHCAAIAAoAiAiAUEYdCABQYD+A3FBCHRyIAFBCHZBgP4DcSABQRh2cnI2AiAgACAAKAIkIgFBGHQgAUGA/gNxQQh0ciABQQh2QYD+A3EgAUEYdnJyNgIkIAAgACgCKCIBQRh0IAFBgP4DcUEIdHIgAUEIdkGA/gNxIAFBGHZycjYC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AEGkhAELRB8AAAAdAAAAHwAAAB4AAAAfAAAAHgAAAB8AAAAfAAAAHgAAAB8AAAAeAAAAHwAAAAAAAQACAAIAAQADAAAAgL8AAIA/AEHyhAELBoA/AACAPwBBgoUBCwaAvwAAgL8AQZKFAQsGgD8AAIC/AEGihQELBoC/AACAvwBBsoUBCwaAPwAAgL8AQcKFAQsGgL8AAIA/AEHShQELBoA/AACAPwBB6oUBCwKAPwBB9oUBCxKAPwAAgD8AAIA///////////8AQZSGAQsIPAAAAP////8AQaiGAQtE/////woAAAACAAAAAgAAAAAAAAD/////DAAAAP7////+////AAAAAD0AAAD/////AAAAAAAAAAD+////GgAAAP////8AQfiGAQsF/////yQAQYyHAQsFPAAAACQAQaCHAQst/////yQAAAACAAAAAgAAAAAAAAD/////JAAAAP7////+////AAAAAD0AAAAkAEHYhwELCf7///8aAAAAJABB8IcBCwgvAAAA/////wBBhIgBCwgvAAAA/////wBBmIgBCwUvAAAAJABBrIgBCwUvAAAAJABBwIgBCwgvAAAA/////wBB1IgBCwgvAAAA/////wBB6IgBCwUvAAAADABB/IgBCwVAAAAAFwBBkIkBCwVAAAAAJABBpIkBC1UaAAAAFwAAAP7////+/////v///xoAAAAtAAAA/v////7////+////LwAAABcAAAACAAAAAgAAAAAAAAAvAAAAKQAAAAIAAAACAAAAAAAAAD4AAAAXAEGEigELCf////8+AAAAJgBBmIoBC1n//////////xcAAAACAAAAAgAAAAAAAAD/////JQAAAAIAAAACAAAAAAAAAC8AAAAXAAAAAAAAAP7////9////LwAAAC0AAAAAAAAA/v////3///88AAAAFwBBgIsBCwU8AAAAJgBBlIsBCwVLAAAALABBqIsBCwVLAAAALABBvIsBC1VBAAAAJwAAAAAAAAABAAAAAAAAAEEAAAAoAAAAAAAAAAEAAAAAAAAAQAAAAA8AAAAAAAAAAgAAAAAAAABAAAAAJAAAAAAAAAACAAAAAAAAAEUAAAAqAEGcjAELCQIAAABFAAAAKwBBsIwBC10CAAAAPwAAAC4AAAAAAAAAAgAAAAAAAAA/AAAALgAAAAAAAAACAAAAAAAAAEIAAAAOAAAAAAAAAAIAAAABAAAAQgAAAA4AAAAAAAAAAgAAAAEAAAAvAAAALwAAAAEAQZiNAQsJLwAAAC8AAAABAEGsjQELBUoAAAAgAEHAjQELBUoAAAAgAEHUjQELBUMAAAAwAEHkjQELCf////9DAAAAMABB+I0BCwn/////RAAAADEAQZCOAQsFRAAAADEAQaSOAQsF/////zIAQbiOAQsF/////zIAQcyOAQuAAUgAAAAXAAAAAAAAAP7////9////SAAAACYAAAAAAAAA/v////3///9GAAAAFwAAAAAAAAD+/////v///0YAAAAtAAAAAAAAAP7////+////FwAAABcAAAAAAAAA/v///wAAAAAXAAAAJgAAAAAAAAD+////AAAAAP//////////AEHYjwELCP//////////AEHsjwELVf////8XAAAAAAAAAP/////+/////////y4AAAAAAAAA//////7///9MAAAAFwAAAAAAAAD+/////f///0wAAAAmAAAAAAAAAP7////9////TwAAADMAQdCQAQsFTwAAADMAQeSQAQsFTgAAAAIAQYyRAQs1AQAAAAAAAAAGAAAAAAAAAAkAAAAFAAAAAAAAAAIAAAAAAAAAAwAAAAAAAAAHAAAAAAAAAAgAQcyRAQs5CgAAAAkAAAAAAAAACwAAAAAAAAA/AAAAPwAAAD8AAAAAAAAAAQAAAAsAAAAAAAAACgAAAAEAAAALAEGwkgELBQEAAAABAEHIkgELHQEAAAAAAAAAAgAAAAIAAAACAAAAAAAAAAMAAAADAEHwkgELBQQAAAAEAEGIkwELEQMAAAAAAAAAAQAAAAEAAAADAEGokwELOQMAAAAAAAAAAgAAAAIAAAADAAAAAAAAAAMAAAADAAAAAwAAAAAAAAAEAAAABAAAAAMAAAAAAAAABQBB9JMBCwEFAEGAlAELCQUAAAAAAAAAAwBBlJQBCxUFAAAAAwAAAAAAAAAFAAAAAAAAAAUAQbSUAQuVAQUAAAAFAAAAAAAAAAUAAAAFAAAAAgAAAAAAAAANAAAADQAAAAYAAAAAAAAADQAAAA0AAAADAAAAAAAAAAQAAAAEAAAABgAAAAAAAAAEAAAABAAAABMAAAAAAAAACAAAAAgAAAAGAAAAAAAAAAgAAAAIAAAADwAAAAAAAAALAAAACwAA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\";function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}var binary=tryParseAsDataURI(file);if(binary){return binary}if(readBinary){return readBinary(file)}throw\"both async and sync fetching of the wasm failed\"}async function getWasmBinary(binaryFile){return getBinarySync(binaryFile)}async function instantiateArrayBuffer(binaryFile,imports){try{var binary=await getWasmBinary(binaryFile);var instance=await WebAssembly.instantiate(binary,imports);return instance}catch(reason){err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)}}async function instantiateAsync(binary,binaryFile,imports){return instantiateArrayBuffer(binaryFile,imports)}function getWasmImports(){return{a:wasmImports}}async function createWasm(){function receiveInstance(instance,module){wasmExports=instance.exports;wasmMemory=wasmExports[\"d\"];updateMemoryViews();wasmTable=wasmExports[\"O\"];removeRunDependency(\"wasm-instantiate\");return wasmExports}addRunDependency(\"wasm-instantiate\");function receiveInstantiationResult(result){return receiveInstance(result[\"instance\"])}var info=getWasmImports();try{var result=await instantiateAsync(wasmBinary,wasmBinaryFile,info);var exports=receiveInstantiationResult(result);return exports}catch(e){readyPromiseReject(e);return Promise.reject(e)}}class ExitStatus{name=\"ExitStatus\";constructor(status){this.message=`Program terminated with exit(${status})`;this.status=status}}function stackTrace(){abort(\"missing function: $stackTrace\")}stackTrace.stub=true;var base64Decode=b64=>{var b1,b2,i=0,j=0,bLength=b64.length;var output=new Uint8Array((bLength*3>>2)-(b64[bLength-2]==\"=\")-(b64[bLength-1]==\"=\"));for(;i<bLength;i+=4,j+=3){b1=base64ReverseLookup[b64.charCodeAt(i+1)];b2=base64ReverseLookup[b64.charCodeAt(i+2)];output[j]=base64ReverseLookup[b64.charCodeAt(i)]<<2|b1>>4;output[j+1]=b1<<4|b2>>2;output[j+2]=b2<<6|base64ReverseLookup[b64.charCodeAt(i+3)]}return output};var isDataURI=filename=>filename.startsWith(dataURIPrefix);var dataURIPrefix=\"data:application/octet-stream;base64,\";var tryParseAsDataURI=filename=>{if(isDataURI(filename)){return base64Decode(filename.slice(dataURIPrefix.length))}};var __abort_js=()=>abort(\"\");var _emscripten_random=()=>Math.random();var getHeapMax=()=>2147483648;var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536|0;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var uleb128Encode=(n,target)=>{if(n<128){target.push(n)}else{target.push(n%128|128,n>>7)}};var sigToWasmTypes=sig=>{var typeNames={i:\"i32\",j:\"i64\",f:\"f32\",d:\"f64\",e:\"externref\",p:\"i32\"};var type={parameters:[],results:sig[0]==\"v\"?[]:[typeNames[sig[0]]]};for(var i=1;i<sig.length;++i){type.parameters.push(typeNames[sig[i]])}return type};var generateFuncType=(sig,target)=>{var sigRet=sig.slice(0,1);var sigParam=sig.slice(1);var typeCodes={i:127,p:127,j:126,f:125,d:124,e:111};target.push(96);uleb128Encode(sigParam.length,target);for(var i=0;i<sigParam.length;++i){target.push(typeCodes[sigParam[i]])}if(sigRet==\"v\"){target.push(0)}else{target.push(1,typeCodes[sigRet])}};var convertJsFunctionToWasm=(func,sig)=>{if(typeof WebAssembly.Function==\"function\"){return new WebAssembly.Function(sigToWasmTypes(sig),func)}var typeSectionBody=[1];generateFuncType(sig,typeSectionBody);var bytes=[0,97,115,109,1,0,0,0,1];uleb128Encode(typeSectionBody.length,bytes);bytes.push(...typeSectionBody);bytes.push(2,7,1,1,101,1,102,0,0,7,5,1,1,102,0,0);var module=new WebAssembly.Module(new Uint8Array(bytes));var instance=new WebAssembly.Instance(module,{e:{f:func}});var wrappedFunc=instance.exports[\"f\"];return wrappedFunc};var wasmTableMirror=[];var wasmTable;var getWasmTableEntry=funcPtr=>{var func=wasmTableMirror[funcPtr];if(!func){if(funcPtr>=wasmTableMirror.length)wasmTableMirror.length=funcPtr+1;wasmTableMirror[funcPtr]=func=wasmTable.get(funcPtr)}return func};var updateTableMap=(offset,count)=>{if(functionsInTableMap){for(var i=offset;i<offset+count;i++){var item=getWasmTableEntry(i);if(item){functionsInTableMap.set(item,i)}}}};var functionsInTableMap;var getFunctionAddress=func=>{if(!functionsInTableMap){functionsInTableMap=new WeakMap;updateTableMap(0,wasmTable.length)}return functionsInTableMap.get(func)||0};var freeTableIndexes=[];var getEmptyTableSlot=()=>{if(freeTableIndexes.length){return freeTableIndexes.pop()}try{wasmTable.grow(1)}catch(err){if(!(err instanceof RangeError)){throw err}throw\"Unable to grow wasm table. Set ALLOW_TABLE_GROWTH.\"}return wasmTable.length-1};var setWasmTableEntry=(idx,func)=>{wasmTable.set(idx,func);wasmTableMirror[idx]=wasmTable.get(idx)};var addFunction=(func,sig)=>{var rtn=getFunctionAddress(func);if(rtn){return rtn}var ret=getEmptyTableSlot();try{setWasmTableEntry(ret,func)}catch(err){if(!(err instanceof TypeError)){throw err}var wrapped=convertJsFunctionToWasm(func,sig);setWasmTableEntry(ret,wrapped)}functionsInTableMap.set(func,ret);return ret};var removeFunction=index=>{functionsInTableMap.delete(getWasmTableEntry(index));setWasmTableEntry(index,null);freeTableIndexes.push(index)};for(var base64ReverseLookup=new Uint8Array(123),i=25;i>=0;--i){base64ReverseLookup[48+i]=52+i;base64ReverseLookup[65+i]=i;base64ReverseLookup[97+i]=26+i}base64ReverseLookup[43]=62;base64ReverseLookup[47]=63;var wasmImports={a:__abort_js,c:_emscripten_random,b:_emscripten_resize_heap};var wasmExports=await createWasm();var ___wasm_call_ctors=wasmExports[\"e\"];var _FFLInitCharModelCPUStepWithCallback=Module[\"_FFLInitCharModelCPUStepWithCallback\"]=wasmExports[\"f\"];var _FFLInitCharModelCPUStep=Module[\"_FFLInitCharModelCPUStep\"]=wasmExports[\"g\"];var _FFLDeleteCharModel=Module[\"_FFLDeleteCharModel\"]=wasmExports[\"h\"];var _FFLGetDrawParamOpaFaceline=Module[\"_FFLGetDrawParamOpaFaceline\"]=wasmExports[\"i\"];var _FFLGetDrawParamOpaBeard=Module[\"_FFLGetDrawParamOpaBeard\"]=wasmExports[\"j\"];var _FFLGetDrawParamOpaNose=Module[\"_FFLGetDrawParamOpaNose\"]=wasmExports[\"k\"];var _FFLGetDrawParamOpaForehead=Module[\"_FFLGetDrawParamOpaForehead\"]=wasmExports[\"l\"];var _FFLGetDrawParamOpaHair=Module[\"_FFLGetDrawParamOpaHair\"]=wasmExports[\"m\"];var _FFLGetDrawParamOpaCap=Module[\"_FFLGetDrawParamOpaCap\"]=wasmExports[\"n\"];var _FFLGetDrawParamXluMask=Module[\"_FFLGetDrawParamXluMask\"]=wasmExports[\"o\"];var _FFLGetDrawParamXluNoseLine=Module[\"_FFLGetDrawParamXluNoseLine\"]=wasmExports[\"p\"];var _FFLGetDrawParamXluGlass=Module[\"_FFLGetDrawParamXluGlass\"]=wasmExports[\"q\"];var _FFLSetExpression=Module[\"_FFLSetExpression\"]=wasmExports[\"r\"];var _FFLGetExpression=Module[\"_FFLGetExpression\"]=wasmExports[\"s\"];var _FFLSetViewModelType=Module[\"_FFLSetViewModelType\"]=wasmExports[\"t\"];var _FFLGetBoundingBox=Module[\"_FFLGetBoundingBox\"]=wasmExports[\"u\"];var _FFLIsAvailableExpression=Module[\"_FFLIsAvailableExpression\"]=wasmExports[\"v\"];var _FFLSetCoordinate=Module[\"_FFLSetCoordinate\"]=wasmExports[\"w\"];var _FFLSetScale=Module[\"_FFLSetScale\"]=wasmExports[\"x\"];var _FFLiGetRandomCharInfo=Module[\"_FFLiGetRandomCharInfo\"]=wasmExports[\"y\"];var _FFLpGetStoreDataFromCharInfo=Module[\"_FFLpGetStoreDataFromCharInfo\"]=wasmExports[\"z\"];var _FFLpGetCharInfoFromStoreData=Module[\"_FFLpGetCharInfoFromStoreData\"]=wasmExports[\"A\"];var _FFLpGetCharInfoFromMiiDataOfficialRFL=Module[\"_FFLpGetCharInfoFromMiiDataOfficialRFL\"]=wasmExports[\"B\"];var _FFLGetAdditionalInfo=Module[\"_FFLGetAdditionalInfo\"]=wasmExports[\"C\"];var _FFLInitRes=Module[\"_FFLInitRes\"]=wasmExports[\"D\"];var _FFLInitResGPUStep=Module[\"_FFLInitResGPUStep\"]=wasmExports[\"E\"];var _FFLExit=Module[\"_FFLExit\"]=wasmExports[\"F\"];var _FFLIsAvailable=Module[\"_FFLIsAvailable\"]=wasmExports[\"G\"];var _FFLGetFavoriteColor=Module[\"_FFLGetFavoriteColor\"]=wasmExports[\"H\"];var _FFLSetLinearGammaMode=Module[\"_FFLSetLinearGammaMode\"]=wasmExports[\"I\"];var _FFLGetFacelineColor=Module[\"_FFLGetFacelineColor\"]=wasmExports[\"J\"];var _FFLSetTextureFlipY=Module[\"_FFLSetTextureFlipY\"]=wasmExports[\"K\"];var _FFLSetNormalIsSnorm8_8_8_8=Module[\"_FFLSetNormalIsSnorm8_8_8_8\"]=wasmExports[\"L\"];var _FFLSetFrontCullForFlipX=Module[\"_FFLSetFrontCullForFlipX\"]=wasmExports[\"M\"];var _FFLSetTextureCallback=Module[\"_FFLSetTextureCallback\"]=wasmExports[\"N\"];var _FFLiDeleteTempObjectMaskTextures=Module[\"_FFLiDeleteTempObjectMaskTextures\"]=wasmExports[\"P\"];var _FFLiDeleteTempObjectFacelineTexture=Module[\"_FFLiDeleteTempObjectFacelineTexture\"]=wasmExports[\"Q\"];var _FFLiDeleteTextureTempObject=Module[\"_FFLiDeleteTextureTempObject\"]=wasmExports[\"R\"];var _FFLiiGetEyeRotateOffset=Module[\"_FFLiiGetEyeRotateOffset\"]=wasmExports[\"S\"];var _FFLiiGetEyebrowRotateOffset=Module[\"_FFLiiGetEyebrowRotateOffset\"]=wasmExports[\"T\"];var _FFLiInvalidateTempObjectFacelineTexture=Module[\"_FFLiInvalidateTempObjectFacelineTexture\"]=wasmExports[\"U\"];var _FFLiInvalidatePartsTextures=Module[\"_FFLiInvalidatePartsTextures\"]=wasmExports[\"V\"];var _FFLiInvalidateRawMask=Module[\"_FFLiInvalidateRawMask\"]=wasmExports[\"W\"];var _FFLiVerifyCharInfoWithReason=Module[\"_FFLiVerifyCharInfoWithReason\"]=wasmExports[\"X\"];var _free=Module[\"_free\"]=wasmExports[\"Y\"];var _malloc=Module[\"_malloc\"]=wasmExports[\"Z\"];Module[\"addFunction\"]=addFunction;Module[\"removeFunction\"]=removeFunction;function run(){if(runDependencies>0){dependenciesFulfilled=run;return}preRun();if(runDependencies>0){dependenciesFulfilled=run;return}function doRun(){Module[\"calledRun\"]=true;if(ABORT)return;initRuntime();readyPromiseResolve(Module);Module[\"onRuntimeInitialized\"]?.();postRun()}{doRun()}}run();moduleRtn=readyPromise;\n\n\n  return moduleRtn;\n}\n);\n})();\nif (typeof exports === 'object' && typeof module === 'object') {\n  module.exports = ModuleFFL;\n  // This default export looks redundant, but it allows TS to import this\n  // commonjs style module.\n  module.exports.default = ModuleFFL;\n} else if (typeof define === 'function' && define['amd'])\n  define([], () => ModuleFFL);\n", "\"use strict\";\n\nlet util = require(\"util\");\nlet Stream = require(\"stream\");\n\nlet ChunkStream = (module.exports = function () {\n  Stream.call(this);\n\n  this._buffers = [];\n  this._buffered = 0;\n\n  this._reads = [];\n  this._paused = false;\n\n  this._encoding = \"utf8\";\n  this.writable = true;\n});\nutil.inherits(ChunkStream, Stream);\n\nChunkStream.prototype.read = function (length, callback) {\n  this._reads.push({\n    length: Math.abs(length), // if length < 0 then at most this length\n    allowLess: length < 0,\n    func: callback,\n  });\n\n  process.nextTick(\n    function () {\n      this._process();\n\n      // its paused and there is not enought data then ask for more\n      if (this._paused && this._reads && this._reads.length > 0) {\n        this._paused = false;\n\n        this.emit(\"drain\");\n      }\n    }.bind(this)\n  );\n};\n\nChunkStream.prototype.write = function (data, encoding) {\n  if (!this.writable) {\n    this.emit(\"error\", new Error(\"Stream not writable\"));\n    return false;\n  }\n\n  let dataBuffer;\n  if (Buffer.isBuffer(data)) {\n    dataBuffer = data;\n  } else {\n    dataBuffer = Buffer.from(data, encoding || this._encoding);\n  }\n\n  this._buffers.push(dataBuffer);\n  this._buffered += dataBuffer.length;\n\n  this._process();\n\n  // ok if there are no more read requests\n  if (this._reads && this._reads.length === 0) {\n    this._paused = true;\n  }\n\n  return this.writable && !this._paused;\n};\n\nChunkStream.prototype.end = function (data, encoding) {\n  if (data) {\n    this.write(data, encoding);\n  }\n\n  this.writable = false;\n\n  // already destroyed\n  if (!this._buffers) {\n    return;\n  }\n\n  // enqueue or handle end\n  if (this._buffers.length === 0) {\n    this._end();\n  } else {\n    this._buffers.push(null);\n    this._process();\n  }\n};\n\nChunkStream.prototype.destroySoon = ChunkStream.prototype.end;\n\nChunkStream.prototype._end = function () {\n  if (this._reads.length > 0) {\n    this.emit(\"error\", new Error(\"Unexpected end of input\"));\n  }\n\n  this.destroy();\n};\n\nChunkStream.prototype.destroy = function () {\n  if (!this._buffers) {\n    return;\n  }\n\n  this.writable = false;\n  this._reads = null;\n  this._buffers = null;\n\n  this.emit(\"close\");\n};\n\nChunkStream.prototype._processReadAllowingLess = function (read) {\n  // ok there is any data so that we can satisfy this request\n  this._reads.shift(); // == read\n\n  // first we need to peek into first buffer\n  let smallerBuf = this._buffers[0];\n\n  // ok there is more data than we need\n  if (smallerBuf.length > read.length) {\n    this._buffered -= read.length;\n    this._buffers[0] = smallerBuf.slice(read.length);\n\n    read.func.call(this, smallerBuf.slice(0, read.length));\n  } else {\n    // ok this is less than maximum length so use it all\n    this._buffered -= smallerBuf.length;\n    this._buffers.shift(); // == smallerBuf\n\n    read.func.call(this, smallerBuf);\n  }\n};\n\nChunkStream.prototype._processRead = function (read) {\n  this._reads.shift(); // == read\n\n  let pos = 0;\n  let count = 0;\n  let data = Buffer.alloc(read.length);\n\n  // create buffer for all data\n  while (pos < read.length) {\n    let buf = this._buffers[count++];\n    let len = Math.min(buf.length, read.length - pos);\n\n    buf.copy(data, pos, 0, len);\n    pos += len;\n\n    // last buffer wasn't used all so just slice it and leave\n    if (len !== buf.length) {\n      this._buffers[--count] = buf.slice(len);\n    }\n  }\n\n  // remove all used buffers\n  if (count > 0) {\n    this._buffers.splice(0, count);\n  }\n\n  this._buffered -= read.length;\n\n  read.func.call(this, data);\n};\n\nChunkStream.prototype._process = function () {\n  try {\n    // as long as there is any data and read requests\n    while (this._buffered > 0 && this._reads && this._reads.length > 0) {\n      let read = this._reads[0];\n\n      // read any data (but no more than length)\n      if (read.allowLess) {\n        this._processReadAllowingLess(read);\n      } else if (this._buffered >= read.length) {\n        // ok we can meet some expectations\n\n        this._processRead(read);\n      } else {\n        // not enought data to satisfy first request in queue\n        // so we need to wait for more\n        break;\n      }\n    }\n\n    if (this._buffers && !this.writable) {\n      this._end();\n    }\n  } catch (ex) {\n    this.emit(\"error\", ex);\n  }\n};\n", "\"use strict\";\n\n// Adam 7\n//   0 1 2 3 4 5 6 7\n// 0 x 6 4 6 x 6 4 6\n// 1 7 7 7 7 7 7 7 7\n// 2 5 6 5 6 5 6 5 6\n// 3 7 7 7 7 7 7 7 7\n// 4 3 6 4 6 3 6 4 6\n// 5 7 7 7 7 7 7 7 7\n// 6 5 6 5 6 5 6 5 6\n// 7 7 7 7 7 7 7 7 7\n\nlet imagePasses = [\n  {\n    // pass 1 - 1px\n    x: [0],\n    y: [0],\n  },\n  {\n    // pass 2 - 1px\n    x: [4],\n    y: [0],\n  },\n  {\n    // pass 3 - 2px\n    x: [0, 4],\n    y: [4],\n  },\n  {\n    // pass 4 - 4px\n    x: [2, 6],\n    y: [0, 4],\n  },\n  {\n    // pass 5 - 8px\n    x: [0, 2, 4, 6],\n    y: [2, 6],\n  },\n  {\n    // pass 6 - 16px\n    x: [1, 3, 5, 7],\n    y: [0, 2, 4, 6],\n  },\n  {\n    // pass 7 - 32px\n    x: [0, 1, 2, 3, 4, 5, 6, 7],\n    y: [1, 3, 5, 7],\n  },\n];\n\nexports.getImagePasses = function (width, height) {\n  let images = [];\n  let xLeftOver = width % 8;\n  let yLeftOver = height % 8;\n  let xRepeats = (width - xLeftOver) / 8;\n  let yRepeats = (height - yLeftOver) / 8;\n  for (let i = 0; i < imagePasses.length; i++) {\n    let pass = imagePasses[i];\n    let passWidth = xRepeats * pass.x.length;\n    let passHeight = yRepeats * pass.y.length;\n    for (let j = 0; j < pass.x.length; j++) {\n      if (pass.x[j] < xLeftOver) {\n        passWidth++;\n      } else {\n        break;\n      }\n    }\n    for (let j = 0; j < pass.y.length; j++) {\n      if (pass.y[j] < yLeftOver) {\n        passHeight++;\n      } else {\n        break;\n      }\n    }\n    if (passWidth > 0 && passHeight > 0) {\n      images.push({ width: passWidth, height: passHeight, index: i });\n    }\n  }\n  return images;\n};\n\nexports.getInterlaceIterator = function (width) {\n  return function (x, y, pass) {\n    let outerXLeftOver = x % imagePasses[pass].x.length;\n    let outerX =\n      ((x - outerXLeftOver) / imagePasses[pass].x.length) * 8 +\n      imagePasses[pass].x[outerXLeftOver];\n    let outerYLeftOver = y % imagePasses[pass].y.length;\n    let outerY =\n      ((y - outerYLeftOver) / imagePasses[pass].y.length) * 8 +\n      imagePasses[pass].y[outerYLeftOver];\n    return outerX * 4 + outerY * width * 4;\n  };\n};\n", "\"use strict\";\n\nmodule.exports = function paethPredictor(left, above, upLeft) {\n  let paeth = left + above - upLeft;\n  let pLeft = Math.abs(paeth - left);\n  let pAbove = Math.abs(paeth - above);\n  let pUpLeft = Math.abs(paeth - upLeft);\n\n  if (pLeft <= pAbove && pLeft <= pUpLeft) {\n    return left;\n  }\n  if (pAbove <= pUpLeft) {\n    return above;\n  }\n  return upLeft;\n};\n", "\"use strict\";\n\nlet interlaceUtils = require(\"./interlace\");\nlet paethPredictor = require(\"./paeth-predictor\");\n\nfunction getByteWidth(width, bpp, depth) {\n  let byteWidth = width * bpp;\n  if (depth !== 8) {\n    byteWidth = Math.ceil(byteWidth / (8 / depth));\n  }\n  return byteWidth;\n}\n\nlet Filter = (module.exports = function (bitmapInfo, dependencies) {\n  let width = bitmapInfo.width;\n  let height = bitmapInfo.height;\n  let interlace = bitmapInfo.interlace;\n  let bpp = bitmapInfo.bpp;\n  let depth = bitmapInfo.depth;\n\n  this.read = dependencies.read;\n  this.write = dependencies.write;\n  this.complete = dependencies.complete;\n\n  this._imageIndex = 0;\n  this._images = [];\n  if (interlace) {\n    let passes = interlaceUtils.getImagePasses(width, height);\n    for (let i = 0; i < passes.length; i++) {\n      this._images.push({\n        byteWidth: getByteWidth(passes[i].width, bpp, depth),\n        height: passes[i].height,\n        lineIndex: 0,\n      });\n    }\n  } else {\n    this._images.push({\n      byteWidth: getByteWidth(width, bpp, depth),\n      height: height,\n      lineIndex: 0,\n    });\n  }\n\n  // when filtering the line we look at the pixel to the left\n  // the spec also says it is done on a byte level regardless of the number of pixels\n  // so if the depth is byte compatible (8 or 16) we subtract the bpp in order to compare back\n  // a pixel rather than just a different byte part. However if we are sub byte, we ignore.\n  if (depth === 8) {\n    this._xComparison = bpp;\n  } else if (depth === 16) {\n    this._xComparison = bpp * 2;\n  } else {\n    this._xComparison = 1;\n  }\n});\n\nFilter.prototype.start = function () {\n  this.read(\n    this._images[this._imageIndex].byteWidth + 1,\n    this._reverseFilterLine.bind(this)\n  );\n};\n\nFilter.prototype._unFilterType1 = function (\n  rawData,\n  unfilteredLine,\n  byteWidth\n) {\n  let xComparison = this._xComparison;\n  let xBiggerThan = xComparison - 1;\n\n  for (let x = 0; x < byteWidth; x++) {\n    let rawByte = rawData[1 + x];\n    let f1Left = x > xBiggerThan ? unfilteredLine[x - xComparison] : 0;\n    unfilteredLine[x] = rawByte + f1Left;\n  }\n};\n\nFilter.prototype._unFilterType2 = function (\n  rawData,\n  unfilteredLine,\n  byteWidth\n) {\n  let lastLine = this._lastLine;\n\n  for (let x = 0; x < byteWidth; x++) {\n    let rawByte = rawData[1 + x];\n    let f2Up = lastLine ? lastLine[x] : 0;\n    unfilteredLine[x] = rawByte + f2Up;\n  }\n};\n\nFilter.prototype._unFilterType3 = function (\n  rawData,\n  unfilteredLine,\n  byteWidth\n) {\n  let xComparison = this._xComparison;\n  let xBiggerThan = xComparison - 1;\n  let lastLine = this._lastLine;\n\n  for (let x = 0; x < byteWidth; x++) {\n    let rawByte = rawData[1 + x];\n    let f3Up = lastLine ? lastLine[x] : 0;\n    let f3Left = x > xBiggerThan ? unfilteredLine[x - xComparison] : 0;\n    let f3Add = Math.floor((f3Left + f3Up) / 2);\n    unfilteredLine[x] = rawByte + f3Add;\n  }\n};\n\nFilter.prototype._unFilterType4 = function (\n  rawData,\n  unfilteredLine,\n  byteWidth\n) {\n  let xComparison = this._xComparison;\n  let xBiggerThan = xComparison - 1;\n  let lastLine = this._lastLine;\n\n  for (let x = 0; x < byteWidth; x++) {\n    let rawByte = rawData[1 + x];\n    let f4Up = lastLine ? lastLine[x] : 0;\n    let f4Left = x > xBiggerThan ? unfilteredLine[x - xComparison] : 0;\n    let f4UpLeft = x > xBiggerThan && lastLine ? lastLine[x - xComparison] : 0;\n    let f4Add = paethPredictor(f4Left, f4Up, f4UpLeft);\n    unfilteredLine[x] = rawByte + f4Add;\n  }\n};\n\nFilter.prototype._reverseFilterLine = function (rawData) {\n  let filter = rawData[0];\n  let unfilteredLine;\n  let currentImage = this._images[this._imageIndex];\n  let byteWidth = currentImage.byteWidth;\n\n  if (filter === 0) {\n    unfilteredLine = rawData.slice(1, byteWidth + 1);\n  } else {\n    unfilteredLine = Buffer.alloc(byteWidth);\n\n    switch (filter) {\n      case 1:\n        this._unFilterType1(rawData, unfilteredLine, byteWidth);\n        break;\n      case 2:\n        this._unFilterType2(rawData, unfilteredLine, byteWidth);\n        break;\n      case 3:\n        this._unFilterType3(rawData, unfilteredLine, byteWidth);\n        break;\n      case 4:\n        this._unFilterType4(rawData, unfilteredLine, byteWidth);\n        break;\n      default:\n        throw new Error(\"Unrecognised filter type - \" + filter);\n    }\n  }\n\n  this.write(unfilteredLine);\n\n  currentImage.lineIndex++;\n  if (currentImage.lineIndex >= currentImage.height) {\n    this._lastLine = null;\n    this._imageIndex++;\n    currentImage = this._images[this._imageIndex];\n  } else {\n    this._lastLine = unfilteredLine;\n  }\n\n  if (currentImage) {\n    // read, using the byte width that may be from the new current image\n    this.read(currentImage.byteWidth + 1, this._reverseFilterLine.bind(this));\n  } else {\n    this._lastLine = null;\n    this.complete();\n  }\n};\n", "\"use strict\";\n\nlet util = require(\"util\");\nlet ChunkStream = require(\"./chunkstream\");\nlet Filter = require(\"./filter-parse\");\n\nlet FilterAsync = (module.exports = function (bitmapInfo) {\n  ChunkStream.call(this);\n\n  let buffers = [];\n  let that = this;\n  this._filter = new Filter(bitmapInfo, {\n    read: this.read.bind(this),\n    write: function (buffer) {\n      buffers.push(buffer);\n    },\n    complete: function () {\n      that.emit(\"complete\", Buffer.concat(buffers));\n    },\n  });\n\n  this._filter.start();\n});\nutil.inherits(FilterAsync, ChunkStream);\n", "\"use strict\";\n\nmodule.exports = {\n  PNG_SIGNATURE: [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a],\n\n  TYPE_IHDR: 0x49484452,\n  TYPE_IEND: 0x49454e44,\n  TYPE_IDAT: 0x49444154,\n  TYPE_PLTE: 0x504c5445,\n  TYPE_tRNS: 0x74524e53, // eslint-disable-line camelcase\n  TYPE_gAMA: 0x67414d41, // eslint-disable-line camelcase\n\n  // color-type bits\n  COLORTYPE_GRAYSCALE: 0,\n  COLORTYPE_PALETTE: 1,\n  COLORTYPE_COLOR: 2,\n  COLORTYPE_ALPHA: 4, // e.g. grayscale and alpha\n\n  // color-type combinations\n  COLORTYPE_PALETTE_COLOR: 3,\n  COLORTYPE_COLOR_ALPHA: 6,\n\n  COLORTYPE_TO_BPP_MAP: {\n    0: 1,\n    2: 3,\n    3: 1,\n    4: 2,\n    6: 4,\n  },\n\n  GAMMA_DIVISION: 100000,\n};\n", "\"use strict\";\n\nlet crcTable = [];\n\n(function () {\n  for (let i = 0; i < 256; i++) {\n    let currentCrc = i;\n    for (let j = 0; j < 8; j++) {\n      if (currentCrc & 1) {\n        currentCrc = 0xedb88320 ^ (currentCrc >>> 1);\n      } else {\n        currentCrc = currentCrc >>> 1;\n      }\n    }\n    crcTable[i] = currentCrc;\n  }\n})();\n\nlet CrcCalculator = (module.exports = function () {\n  this._crc = -1;\n});\n\nCrcCalculator.prototype.write = function (data) {\n  for (let i = 0; i < data.length; i++) {\n    this._crc = crcTable[(this._crc ^ data[i]) & 0xff] ^ (this._crc >>> 8);\n  }\n  return true;\n};\n\nCrcCalculator.prototype.crc32 = function () {\n  return this._crc ^ -1;\n};\n\nCrcCalculator.crc32 = function (buf) {\n  let crc = -1;\n  for (let i = 0; i < buf.length; i++) {\n    crc = crcTable[(crc ^ buf[i]) & 0xff] ^ (crc >>> 8);\n  }\n  return crc ^ -1;\n};\n", "\"use strict\";\n\nlet constants = require(\"./constants\");\nlet CrcCalculator = require(\"./crc\");\n\nlet Parser = (module.exports = function (options, dependencies) {\n  this._options = options;\n  options.checkCRC = options.checkCRC !== false;\n\n  this._hasIHDR = false;\n  this._hasIEND = false;\n  this._emittedHeadersFinished = false;\n\n  // input flags/metadata\n  this._palette = [];\n  this._colorType = 0;\n\n  this._chunks = {};\n  this._chunks[constants.TYPE_IHDR] = this._handleIHDR.bind(this);\n  this._chunks[constants.TYPE_IEND] = this._handleIEND.bind(this);\n  this._chunks[constants.TYPE_IDAT] = this._handleIDAT.bind(this);\n  this._chunks[constants.TYPE_PLTE] = this._handlePLTE.bind(this);\n  this._chunks[constants.TYPE_tRNS] = this._handleTRNS.bind(this);\n  this._chunks[constants.TYPE_gAMA] = this._handleGAMA.bind(this);\n\n  this.read = dependencies.read;\n  this.error = dependencies.error;\n  this.metadata = dependencies.metadata;\n  this.gamma = dependencies.gamma;\n  this.transColor = dependencies.transColor;\n  this.palette = dependencies.palette;\n  this.parsed = dependencies.parsed;\n  this.inflateData = dependencies.inflateData;\n  this.finished = dependencies.finished;\n  this.simpleTransparency = dependencies.simpleTransparency;\n  this.headersFinished = dependencies.headersFinished || function () {};\n});\n\nParser.prototype.start = function () {\n  this.read(constants.PNG_SIGNATURE.length, this._parseSignature.bind(this));\n};\n\nParser.prototype._parseSignature = function (data) {\n  let signature = constants.PNG_SIGNATURE;\n\n  for (let i = 0; i < signature.length; i++) {\n    if (data[i] !== signature[i]) {\n      this.error(new Error(\"Invalid file signature\"));\n      return;\n    }\n  }\n  this.read(8, this._parseChunkBegin.bind(this));\n};\n\nParser.prototype._parseChunkBegin = function (data) {\n  // chunk content length\n  let length = data.readUInt32BE(0);\n\n  // chunk type\n  let type = data.readUInt32BE(4);\n  let name = \"\";\n  for (let i = 4; i < 8; i++) {\n    name += String.fromCharCode(data[i]);\n  }\n\n  //console.log('chunk ', name, length);\n\n  // chunk flags\n  let ancillary = Boolean(data[4] & 0x20); // or critical\n  //    priv = Boolean(data[5] & 0x20), // or public\n  //    safeToCopy = Boolean(data[7] & 0x20); // or unsafe\n\n  if (!this._hasIHDR && type !== constants.TYPE_IHDR) {\n    this.error(new Error(\"Expected IHDR on beggining\"));\n    return;\n  }\n\n  this._crc = new CrcCalculator();\n  this._crc.write(Buffer.from(name));\n\n  if (this._chunks[type]) {\n    return this._chunks[type](length);\n  }\n\n  if (!ancillary) {\n    this.error(new Error(\"Unsupported critical chunk type \" + name));\n    return;\n  }\n\n  this.read(length + 4, this._skipChunk.bind(this));\n};\n\nParser.prototype._skipChunk = function (/*data*/) {\n  this.read(8, this._parseChunkBegin.bind(this));\n};\n\nParser.prototype._handleChunkEnd = function () {\n  this.read(4, this._parseChunkEnd.bind(this));\n};\n\nParser.prototype._parseChunkEnd = function (data) {\n  let fileCrc = data.readInt32BE(0);\n  let calcCrc = this._crc.crc32();\n\n  // check CRC\n  if (this._options.checkCRC && calcCrc !== fileCrc) {\n    this.error(new Error(\"Crc error - \" + fileCrc + \" - \" + calcCrc));\n    return;\n  }\n\n  if (!this._hasIEND) {\n    this.read(8, this._parseChunkBegin.bind(this));\n  }\n};\n\nParser.prototype._handleIHDR = function (length) {\n  this.read(length, this._parseIHDR.bind(this));\n};\nParser.prototype._parseIHDR = function (data) {\n  this._crc.write(data);\n\n  let width = data.readUInt32BE(0);\n  let height = data.readUInt32BE(4);\n  let depth = data[8];\n  let colorType = data[9]; // bits: 1 palette, 2 color, 4 alpha\n  let compr = data[10];\n  let filter = data[11];\n  let interlace = data[12];\n\n  // console.log('    width', width, 'height', height,\n  //     'depth', depth, 'colorType', colorType,\n  //     'compr', compr, 'filter', filter, 'interlace', interlace\n  // );\n\n  if (\n    depth !== 8 &&\n    depth !== 4 &&\n    depth !== 2 &&\n    depth !== 1 &&\n    depth !== 16\n  ) {\n    this.error(new Error(\"Unsupported bit depth \" + depth));\n    return;\n  }\n  if (!(colorType in constants.COLORTYPE_TO_BPP_MAP)) {\n    this.error(new Error(\"Unsupported color type\"));\n    return;\n  }\n  if (compr !== 0) {\n    this.error(new Error(\"Unsupported compression method\"));\n    return;\n  }\n  if (filter !== 0) {\n    this.error(new Error(\"Unsupported filter method\"));\n    return;\n  }\n  if (interlace !== 0 && interlace !== 1) {\n    this.error(new Error(\"Unsupported interlace method\"));\n    return;\n  }\n\n  this._colorType = colorType;\n\n  let bpp = constants.COLORTYPE_TO_BPP_MAP[this._colorType];\n\n  this._hasIHDR = true;\n\n  this.metadata({\n    width: width,\n    height: height,\n    depth: depth,\n    interlace: Boolean(interlace),\n    palette: Boolean(colorType & constants.COLORTYPE_PALETTE),\n    color: Boolean(colorType & constants.COLORTYPE_COLOR),\n    alpha: Boolean(colorType & constants.COLORTYPE_ALPHA),\n    bpp: bpp,\n    colorType: colorType,\n  });\n\n  this._handleChunkEnd();\n};\n\nParser.prototype._handlePLTE = function (length) {\n  this.read(length, this._parsePLTE.bind(this));\n};\nParser.prototype._parsePLTE = function (data) {\n  this._crc.write(data);\n\n  let entries = Math.floor(data.length / 3);\n  // console.log('Palette:', entries);\n\n  for (let i = 0; i < entries; i++) {\n    this._palette.push([data[i * 3], data[i * 3 + 1], data[i * 3 + 2], 0xff]);\n  }\n\n  this.palette(this._palette);\n\n  this._handleChunkEnd();\n};\n\nParser.prototype._handleTRNS = function (length) {\n  this.simpleTransparency();\n  this.read(length, this._parseTRNS.bind(this));\n};\nParser.prototype._parseTRNS = function (data) {\n  this._crc.write(data);\n\n  // palette\n  if (this._colorType === constants.COLORTYPE_PALETTE_COLOR) {\n    if (this._palette.length === 0) {\n      this.error(new Error(\"Transparency chunk must be after palette\"));\n      return;\n    }\n    if (data.length > this._palette.length) {\n      this.error(new Error(\"More transparent colors than palette size\"));\n      return;\n    }\n    for (let i = 0; i < data.length; i++) {\n      this._palette[i][3] = data[i];\n    }\n    this.palette(this._palette);\n  }\n\n  // for colorType 0 (grayscale) and 2 (rgb)\n  // there might be one gray/color defined as transparent\n  if (this._colorType === constants.COLORTYPE_GRAYSCALE) {\n    // grey, 2 bytes\n    this.transColor([data.readUInt16BE(0)]);\n  }\n  if (this._colorType === constants.COLORTYPE_COLOR) {\n    this.transColor([\n      data.readUInt16BE(0),\n      data.readUInt16BE(2),\n      data.readUInt16BE(4),\n    ]);\n  }\n\n  this._handleChunkEnd();\n};\n\nParser.prototype._handleGAMA = function (length) {\n  this.read(length, this._parseGAMA.bind(this));\n};\nParser.prototype._parseGAMA = function (data) {\n  this._crc.write(data);\n  this.gamma(data.readUInt32BE(0) / constants.GAMMA_DIVISION);\n\n  this._handleChunkEnd();\n};\n\nParser.prototype._handleIDAT = function (length) {\n  if (!this._emittedHeadersFinished) {\n    this._emittedHeadersFinished = true;\n    this.headersFinished();\n  }\n  this.read(-length, this._parseIDAT.bind(this, length));\n};\nParser.prototype._parseIDAT = function (length, data) {\n  this._crc.write(data);\n\n  if (\n    this._colorType === constants.COLORTYPE_PALETTE_COLOR &&\n    this._palette.length === 0\n  ) {\n    throw new Error(\"Expected palette not found\");\n  }\n\n  this.inflateData(data);\n  let leftOverLength = length - data.length;\n\n  if (leftOverLength > 0) {\n    this._handleIDAT(leftOverLength);\n  } else {\n    this._handleChunkEnd();\n  }\n};\n\nParser.prototype._handleIEND = function (length) {\n  this.read(length, this._parseIEND.bind(this));\n};\nParser.prototype._parseIEND = function (data) {\n  this._crc.write(data);\n\n  this._hasIEND = true;\n  this._handleChunkEnd();\n\n  if (this.finished) {\n    this.finished();\n  }\n};\n", "\"use strict\";\n\nlet interlaceUtils = require(\"./interlace\");\n\nlet pixelBppMapper = [\n  // 0 - dummy entry\n  function () {},\n\n  // 1 - L\n  // 0: 0, 1: 0, 2: 0, 3: 0xff\n  function (pxData, data, pxPos, rawPos) {\n    if (rawPos === data.length) {\n      throw new Error(\"Ran out of data\");\n    }\n\n    let pixel = data[rawPos];\n    pxData[pxPos] = pixel;\n    pxData[pxPos + 1] = pixel;\n    pxData[pxPos + 2] = pixel;\n    pxData[pxPos + 3] = 0xff;\n  },\n\n  // 2 - LA\n  // 0: 0, 1: 0, 2: 0, 3: 1\n  function (pxData, data, pxPos, rawPos) {\n    if (rawPos + 1 >= data.length) {\n      throw new Error(\"Ran out of data\");\n    }\n\n    let pixel = data[rawPos];\n    pxData[pxPos] = pixel;\n    pxData[pxPos + 1] = pixel;\n    pxData[pxPos + 2] = pixel;\n    pxData[pxPos + 3] = data[rawPos + 1];\n  },\n\n  // 3 - RGB\n  // 0: 0, 1: 1, 2: 2, 3: 0xff\n  function (pxData, data, pxPos, rawPos) {\n    if (rawPos + 2 >= data.length) {\n      throw new Error(\"Ran out of data\");\n    }\n\n    pxData[pxPos] = data[rawPos];\n    pxData[pxPos + 1] = data[rawPos + 1];\n    pxData[pxPos + 2] = data[rawPos + 2];\n    pxData[pxPos + 3] = 0xff;\n  },\n\n  // 4 - RGBA\n  // 0: 0, 1: 1, 2: 2, 3: 3\n  function (pxData, data, pxPos, rawPos) {\n    if (rawPos + 3 >= data.length) {\n      throw new Error(\"Ran out of data\");\n    }\n\n    pxData[pxPos] = data[rawPos];\n    pxData[pxPos + 1] = data[rawPos + 1];\n    pxData[pxPos + 2] = data[rawPos + 2];\n    pxData[pxPos + 3] = data[rawPos + 3];\n  },\n];\n\nlet pixelBppCustomMapper = [\n  // 0 - dummy entry\n  function () {},\n\n  // 1 - L\n  // 0: 0, 1: 0, 2: 0, 3: 0xff\n  function (pxData, pixelData, pxPos, maxBit) {\n    let pixel = pixelData[0];\n    pxData[pxPos] = pixel;\n    pxData[pxPos + 1] = pixel;\n    pxData[pxPos + 2] = pixel;\n    pxData[pxPos + 3] = maxBit;\n  },\n\n  // 2 - LA\n  // 0: 0, 1: 0, 2: 0, 3: 1\n  function (pxData, pixelData, pxPos) {\n    let pixel = pixelData[0];\n    pxData[pxPos] = pixel;\n    pxData[pxPos + 1] = pixel;\n    pxData[pxPos + 2] = pixel;\n    pxData[pxPos + 3] = pixelData[1];\n  },\n\n  // 3 - RGB\n  // 0: 0, 1: 1, 2: 2, 3: 0xff\n  function (pxData, pixelData, pxPos, maxBit) {\n    pxData[pxPos] = pixelData[0];\n    pxData[pxPos + 1] = pixelData[1];\n    pxData[pxPos + 2] = pixelData[2];\n    pxData[pxPos + 3] = maxBit;\n  },\n\n  // 4 - RGBA\n  // 0: 0, 1: 1, 2: 2, 3: 3\n  function (pxData, pixelData, pxPos) {\n    pxData[pxPos] = pixelData[0];\n    pxData[pxPos + 1] = pixelData[1];\n    pxData[pxPos + 2] = pixelData[2];\n    pxData[pxPos + 3] = pixelData[3];\n  },\n];\n\nfunction bitRetriever(data, depth) {\n  let leftOver = [];\n  let i = 0;\n\n  function split() {\n    if (i === data.length) {\n      throw new Error(\"Ran out of data\");\n    }\n    let byte = data[i];\n    i++;\n    let byte8, byte7, byte6, byte5, byte4, byte3, byte2, byte1;\n    switch (depth) {\n      default:\n        throw new Error(\"unrecognised depth\");\n      case 16:\n        byte2 = data[i];\n        i++;\n        leftOver.push((byte << 8) + byte2);\n        break;\n      case 4:\n        byte2 = byte & 0x0f;\n        byte1 = byte >> 4;\n        leftOver.push(byte1, byte2);\n        break;\n      case 2:\n        byte4 = byte & 3;\n        byte3 = (byte >> 2) & 3;\n        byte2 = (byte >> 4) & 3;\n        byte1 = (byte >> 6) & 3;\n        leftOver.push(byte1, byte2, byte3, byte4);\n        break;\n      case 1:\n        byte8 = byte & 1;\n        byte7 = (byte >> 1) & 1;\n        byte6 = (byte >> 2) & 1;\n        byte5 = (byte >> 3) & 1;\n        byte4 = (byte >> 4) & 1;\n        byte3 = (byte >> 5) & 1;\n        byte2 = (byte >> 6) & 1;\n        byte1 = (byte >> 7) & 1;\n        leftOver.push(byte1, byte2, byte3, byte4, byte5, byte6, byte7, byte8);\n        break;\n    }\n  }\n\n  return {\n    get: function (count) {\n      while (leftOver.length < count) {\n        split();\n      }\n      let returner = leftOver.slice(0, count);\n      leftOver = leftOver.slice(count);\n      return returner;\n    },\n    resetAfterLine: function () {\n      leftOver.length = 0;\n    },\n    end: function () {\n      if (i !== data.length) {\n        throw new Error(\"extra data found\");\n      }\n    },\n  };\n}\n\nfunction mapImage8Bit(image, pxData, getPxPos, bpp, data, rawPos) {\n  // eslint-disable-line max-params\n  let imageWidth = image.width;\n  let imageHeight = image.height;\n  let imagePass = image.index;\n  for (let y = 0; y < imageHeight; y++) {\n    for (let x = 0; x < imageWidth; x++) {\n      let pxPos = getPxPos(x, y, imagePass);\n      pixelBppMapper[bpp](pxData, data, pxPos, rawPos);\n      rawPos += bpp; //eslint-disable-line no-param-reassign\n    }\n  }\n  return rawPos;\n}\n\nfunction mapImageCustomBit(image, pxData, getPxPos, bpp, bits, maxBit) {\n  // eslint-disable-line max-params\n  let imageWidth = image.width;\n  let imageHeight = image.height;\n  let imagePass = image.index;\n  for (let y = 0; y < imageHeight; y++) {\n    for (let x = 0; x < imageWidth; x++) {\n      let pixelData = bits.get(bpp);\n      let pxPos = getPxPos(x, y, imagePass);\n      pixelBppCustomMapper[bpp](pxData, pixelData, pxPos, maxBit);\n    }\n    bits.resetAfterLine();\n  }\n}\n\nexports.dataToBitMap = function (data, bitmapInfo) {\n  let width = bitmapInfo.width;\n  let height = bitmapInfo.height;\n  let depth = bitmapInfo.depth;\n  let bpp = bitmapInfo.bpp;\n  let interlace = bitmapInfo.interlace;\n  let bits;\n\n  if (depth !== 8) {\n    bits = bitRetriever(data, depth);\n  }\n  let pxData;\n  if (depth <= 8) {\n    pxData = Buffer.alloc(width * height * 4);\n  } else {\n    pxData = new Uint16Array(width * height * 4);\n  }\n  let maxBit = Math.pow(2, depth) - 1;\n  let rawPos = 0;\n  let images;\n  let getPxPos;\n\n  if (interlace) {\n    images = interlaceUtils.getImagePasses(width, height);\n    getPxPos = interlaceUtils.getInterlaceIterator(width, height);\n  } else {\n    let nonInterlacedPxPos = 0;\n    getPxPos = function () {\n      let returner = nonInterlacedPxPos;\n      nonInterlacedPxPos += 4;\n      return returner;\n    };\n    images = [{ width: width, height: height }];\n  }\n\n  for (let imageIndex = 0; imageIndex < images.length; imageIndex++) {\n    if (depth === 8) {\n      rawPos = mapImage8Bit(\n        images[imageIndex],\n        pxData,\n        getPxPos,\n        bpp,\n        data,\n        rawPos\n      );\n    } else {\n      mapImageCustomBit(\n        images[imageIndex],\n        pxData,\n        getPxPos,\n        bpp,\n        bits,\n        maxBit\n      );\n    }\n  }\n  if (depth === 8) {\n    if (rawPos !== data.length) {\n      throw new Error(\"extra data found\");\n    }\n  } else {\n    bits.end();\n  }\n\n  return pxData;\n};\n", "\"use strict\";\n\nfunction dePalette(indata, outdata, width, height, palette) {\n  let pxPos = 0;\n  // use values from palette\n  for (let y = 0; y < height; y++) {\n    for (let x = 0; x < width; x++) {\n      let color = palette[indata[pxPos]];\n\n      if (!color) {\n        throw new Error(\"index \" + indata[pxPos] + \" not in palette\");\n      }\n\n      for (let i = 0; i < 4; i++) {\n        outdata[pxPos + i] = color[i];\n      }\n      pxPos += 4;\n    }\n  }\n}\n\nfunction replaceTransparentColor(indata, outdata, width, height, transColor) {\n  let pxPos = 0;\n  for (let y = 0; y < height; y++) {\n    for (let x = 0; x < width; x++) {\n      let makeTrans = false;\n\n      if (transColor.length === 1) {\n        if (transColor[0] === indata[pxPos]) {\n          makeTrans = true;\n        }\n      } else if (\n        transColor[0] === indata[pxPos] &&\n        transColor[1] === indata[pxPos + 1] &&\n        transColor[2] === indata[pxPos + 2]\n      ) {\n        makeTrans = true;\n      }\n      if (makeTrans) {\n        for (let i = 0; i < 4; i++) {\n          outdata[pxPos + i] = 0;\n        }\n      }\n      pxPos += 4;\n    }\n  }\n}\n\nfunction scaleDepth(indata, outdata, width, height, depth) {\n  let maxOutSample = 255;\n  let maxInSample = Math.pow(2, depth) - 1;\n  let pxPos = 0;\n\n  for (let y = 0; y < height; y++) {\n    for (let x = 0; x < width; x++) {\n      for (let i = 0; i < 4; i++) {\n        outdata[pxPos + i] = Math.floor(\n          (indata[pxPos + i] * maxOutSample) / maxInSample + 0.5\n        );\n      }\n      pxPos += 4;\n    }\n  }\n}\n\nmodule.exports = function (indata, imageData, skipRescale = false) {\n  let depth = imageData.depth;\n  let width = imageData.width;\n  let height = imageData.height;\n  let colorType = imageData.colorType;\n  let transColor = imageData.transColor;\n  let palette = imageData.palette;\n\n  let outdata = indata; // only different for 16 bits\n\n  if (colorType === 3) {\n    // paletted\n    dePalette(indata, outdata, width, height, palette);\n  } else {\n    if (transColor) {\n      replaceTransparentColor(indata, outdata, width, height, transColor);\n    }\n    // if it needs scaling\n    if (depth !== 8 && !skipRescale) {\n      // if we need to change the buffer size\n      if (depth === 16) {\n        outdata = Buffer.alloc(width * height * 4);\n      }\n      scaleDepth(indata, outdata, width, height, depth);\n    }\n  }\n  return outdata;\n};\n", "\"use strict\";\n\nlet util = require(\"util\");\nlet zlib = require(\"zlib\");\nlet ChunkStream = require(\"./chunkstream\");\nlet FilterAsync = require(\"./filter-parse-async\");\nlet Parser = require(\"./parser\");\nlet bitmapper = require(\"./bitmapper\");\nlet formatNormaliser = require(\"./format-normaliser\");\n\nlet ParserAsync = (module.exports = function (options) {\n  ChunkStream.call(this);\n\n  this._parser = new Parser(options, {\n    read: this.read.bind(this),\n    error: this._handleError.bind(this),\n    metadata: this._handleMetaData.bind(this),\n    gamma: this.emit.bind(this, \"gamma\"),\n    palette: this._handlePalette.bind(this),\n    transColor: this._handleTransColor.bind(this),\n    finished: this._finished.bind(this),\n    inflateData: this._inflateData.bind(this),\n    simpleTransparency: this._simpleTransparency.bind(this),\n    headersFinished: this._headersFinished.bind(this),\n  });\n  this._options = options;\n  this.writable = true;\n\n  this._parser.start();\n});\nutil.inherits(ParserAsync, ChunkStream);\n\nParserAsync.prototype._handleError = function (err) {\n  this.emit(\"error\", err);\n\n  this.writable = false;\n\n  this.destroy();\n\n  if (this._inflate && this._inflate.destroy) {\n    this._inflate.destroy();\n  }\n\n  if (this._filter) {\n    this._filter.destroy();\n    // For backward compatibility with Node 7 and below.\n    // Suppress errors due to _inflate calling write() even after\n    // it's destroy()'ed.\n    this._filter.on(\"error\", function () {});\n  }\n\n  this.errord = true;\n};\n\nParserAsync.prototype._inflateData = function (data) {\n  if (!this._inflate) {\n    if (this._bitmapInfo.interlace) {\n      this._inflate = zlib.createInflate();\n\n      this._inflate.on(\"error\", this.emit.bind(this, \"error\"));\n      this._filter.on(\"complete\", this._complete.bind(this));\n\n      this._inflate.pipe(this._filter);\n    } else {\n      let rowSize =\n        ((this._bitmapInfo.width *\n          this._bitmapInfo.bpp *\n          this._bitmapInfo.depth +\n          7) >>\n          3) +\n        1;\n      let imageSize = rowSize * this._bitmapInfo.height;\n      let chunkSize = Math.max(imageSize, zlib.Z_MIN_CHUNK);\n\n      this._inflate = zlib.createInflate({ chunkSize: chunkSize });\n      let leftToInflate = imageSize;\n\n      let emitError = this.emit.bind(this, \"error\");\n      this._inflate.on(\"error\", function (err) {\n        if (!leftToInflate) {\n          return;\n        }\n\n        emitError(err);\n      });\n      this._filter.on(\"complete\", this._complete.bind(this));\n\n      let filterWrite = this._filter.write.bind(this._filter);\n      this._inflate.on(\"data\", function (chunk) {\n        if (!leftToInflate) {\n          return;\n        }\n\n        if (chunk.length > leftToInflate) {\n          chunk = chunk.slice(0, leftToInflate);\n        }\n\n        leftToInflate -= chunk.length;\n\n        filterWrite(chunk);\n      });\n\n      this._inflate.on(\"end\", this._filter.end.bind(this._filter));\n    }\n  }\n  this._inflate.write(data);\n};\n\nParserAsync.prototype._handleMetaData = function (metaData) {\n  this._metaData = metaData;\n  this._bitmapInfo = Object.create(metaData);\n\n  this._filter = new FilterAsync(this._bitmapInfo);\n};\n\nParserAsync.prototype._handleTransColor = function (transColor) {\n  this._bitmapInfo.transColor = transColor;\n};\n\nParserAsync.prototype._handlePalette = function (palette) {\n  this._bitmapInfo.palette = palette;\n};\n\nParserAsync.prototype._simpleTransparency = function () {\n  this._metaData.alpha = true;\n};\n\nParserAsync.prototype._headersFinished = function () {\n  // Up until this point, we don't know if we have a tRNS chunk (alpha)\n  // so we can't emit metadata any earlier\n  this.emit(\"metadata\", this._metaData);\n};\n\nParserAsync.prototype._finished = function () {\n  if (this.errord) {\n    return;\n  }\n\n  if (!this._inflate) {\n    this.emit(\"error\", \"No Inflate block\");\n  } else {\n    // no more data to inflate\n    this._inflate.end();\n  }\n};\n\nParserAsync.prototype._complete = function (filteredData) {\n  if (this.errord) {\n    return;\n  }\n\n  let normalisedBitmapData;\n\n  try {\n    let bitmapData = bitmapper.dataToBitMap(filteredData, this._bitmapInfo);\n\n    normalisedBitmapData = formatNormaliser(\n      bitmapData,\n      this._bitmapInfo,\n      this._options.skipRescale\n    );\n    bitmapData = null;\n  } catch (ex) {\n    this._handleError(ex);\n    return;\n  }\n\n  this.emit(\"parsed\", normalisedBitmapData);\n};\n", "\"use strict\";\n\nlet constants = require(\"./constants\");\n\nmodule.exports = function (dataIn, width, height, options) {\n  let outHasAlpha =\n    [constants.COLORTYPE_COLOR_ALPHA, constants.COLORTYPE_ALPHA].indexOf(\n      options.colorType\n    ) !== -1;\n  if (options.colorType === options.inputColorType) {\n    let bigEndian = (function () {\n      let buffer = new ArrayBuffer(2);\n      new DataView(buffer).setInt16(0, 256, true /* littleEndian */);\n      // Int16Array uses the platform's endianness.\n      return new Int16Array(buffer)[0] !== 256;\n    })();\n    // If no need to convert to grayscale and alpha is present/absent in both, take a fast route\n    if (options.bitDepth === 8 || (options.bitDepth === 16 && bigEndian)) {\n      return dataIn;\n    }\n  }\n\n  // map to a UInt16 array if data is 16bit, fix endianness below\n  let data = options.bitDepth !== 16 ? dataIn : new Uint16Array(dataIn.buffer);\n\n  let maxValue = 255;\n  let inBpp = constants.COLORTYPE_TO_BPP_MAP[options.inputColorType];\n  if (inBpp === 4 && !options.inputHasAlpha) {\n    inBpp = 3;\n  }\n  let outBpp = constants.COLORTYPE_TO_BPP_MAP[options.colorType];\n  if (options.bitDepth === 16) {\n    maxValue = 65535;\n    outBpp *= 2;\n  }\n  let outData = Buffer.alloc(width * height * outBpp);\n\n  let inIndex = 0;\n  let outIndex = 0;\n\n  let bgColor = options.bgColor || {};\n  if (bgColor.red === undefined) {\n    bgColor.red = maxValue;\n  }\n  if (bgColor.green === undefined) {\n    bgColor.green = maxValue;\n  }\n  if (bgColor.blue === undefined) {\n    bgColor.blue = maxValue;\n  }\n\n  function getRGBA() {\n    let red;\n    let green;\n    let blue;\n    let alpha = maxValue;\n    switch (options.inputColorType) {\n      case constants.COLORTYPE_COLOR_ALPHA:\n        alpha = data[inIndex + 3];\n        red = data[inIndex];\n        green = data[inIndex + 1];\n        blue = data[inIndex + 2];\n        break;\n      case constants.COLORTYPE_COLOR:\n        red = data[inIndex];\n        green = data[inIndex + 1];\n        blue = data[inIndex + 2];\n        break;\n      case constants.COLORTYPE_ALPHA:\n        alpha = data[inIndex + 1];\n        red = data[inIndex];\n        green = red;\n        blue = red;\n        break;\n      case constants.COLORTYPE_GRAYSCALE:\n        red = data[inIndex];\n        green = red;\n        blue = red;\n        break;\n      default:\n        throw new Error(\n          \"input color type:\" +\n            options.inputColorType +\n            \" is not supported at present\"\n        );\n    }\n\n    if (options.inputHasAlpha) {\n      if (!outHasAlpha) {\n        alpha /= maxValue;\n        red = Math.min(\n          Math.max(Math.round((1 - alpha) * bgColor.red + alpha * red), 0),\n          maxValue\n        );\n        green = Math.min(\n          Math.max(Math.round((1 - alpha) * bgColor.green + alpha * green), 0),\n          maxValue\n        );\n        blue = Math.min(\n          Math.max(Math.round((1 - alpha) * bgColor.blue + alpha * blue), 0),\n          maxValue\n        );\n      }\n    }\n    return { red: red, green: green, blue: blue, alpha: alpha };\n  }\n\n  for (let y = 0; y < height; y++) {\n    for (let x = 0; x < width; x++) {\n      let rgba = getRGBA(data, inIndex);\n\n      switch (options.colorType) {\n        case constants.COLORTYPE_COLOR_ALPHA:\n        case constants.COLORTYPE_COLOR:\n          if (options.bitDepth === 8) {\n            outData[outIndex] = rgba.red;\n            outData[outIndex + 1] = rgba.green;\n            outData[outIndex + 2] = rgba.blue;\n            if (outHasAlpha) {\n              outData[outIndex + 3] = rgba.alpha;\n            }\n          } else {\n            outData.writeUInt16BE(rgba.red, outIndex);\n            outData.writeUInt16BE(rgba.green, outIndex + 2);\n            outData.writeUInt16BE(rgba.blue, outIndex + 4);\n            if (outHasAlpha) {\n              outData.writeUInt16BE(rgba.alpha, outIndex + 6);\n            }\n          }\n          break;\n        case constants.COLORTYPE_ALPHA:\n        case constants.COLORTYPE_GRAYSCALE: {\n          // Convert to grayscale and alpha\n          let grayscale = (rgba.red + rgba.green + rgba.blue) / 3;\n          if (options.bitDepth === 8) {\n            outData[outIndex] = grayscale;\n            if (outHasAlpha) {\n              outData[outIndex + 1] = rgba.alpha;\n            }\n          } else {\n            outData.writeUInt16BE(grayscale, outIndex);\n            if (outHasAlpha) {\n              outData.writeUInt16BE(rgba.alpha, outIndex + 2);\n            }\n          }\n          break;\n        }\n        default:\n          throw new Error(\"unrecognised color Type \" + options.colorType);\n      }\n\n      inIndex += inBpp;\n      outIndex += outBpp;\n    }\n  }\n\n  return outData;\n};\n", "\"use strict\";\n\nlet paethPredictor = require(\"./paeth-predictor\");\n\nfunction filterNone(pxData, pxPos, byteWidth, rawData, rawPos) {\n  for (let x = 0; x < byteWidth; x++) {\n    rawData[rawPos + x] = pxData[pxPos + x];\n  }\n}\n\nfunction filterSumNone(pxData, pxPos, byteWidth) {\n  let sum = 0;\n  let length = pxPos + byteWidth;\n\n  for (let i = pxPos; i < length; i++) {\n    sum += Math.abs(pxData[i]);\n  }\n  return sum;\n}\n\nfunction filterSub(pxData, pxPos, byteWidth, rawData, rawPos, bpp) {\n  for (let x = 0; x < byteWidth; x++) {\n    let left = x >= bpp ? pxData[pxPos + x - bpp] : 0;\n    let val = pxData[pxPos + x] - left;\n\n    rawData[rawPos + x] = val;\n  }\n}\n\nfunction filterSumSub(pxData, pxPos, byteWidth, bpp) {\n  let sum = 0;\n  for (let x = 0; x < byteWidth; x++) {\n    let left = x >= bpp ? pxData[pxPos + x - bpp] : 0;\n    let val = pxData[pxPos + x] - left;\n\n    sum += Math.abs(val);\n  }\n\n  return sum;\n}\n\nfunction filterUp(pxData, pxPos, byteWidth, rawData, rawPos) {\n  for (let x = 0; x < byteWidth; x++) {\n    let up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0;\n    let val = pxData[pxPos + x] - up;\n\n    rawData[rawPos + x] = val;\n  }\n}\n\nfunction filterSumUp(pxData, pxPos, byteWidth) {\n  let sum = 0;\n  let length = pxPos + byteWidth;\n  for (let x = pxPos; x < length; x++) {\n    let up = pxPos > 0 ? pxData[x - byteWidth] : 0;\n    let val = pxData[x] - up;\n\n    sum += Math.abs(val);\n  }\n\n  return sum;\n}\n\nfunction filterAvg(pxData, pxPos, byteWidth, rawData, rawPos, bpp) {\n  for (let x = 0; x < byteWidth; x++) {\n    let left = x >= bpp ? pxData[pxPos + x - bpp] : 0;\n    let up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0;\n    let val = pxData[pxPos + x] - ((left + up) >> 1);\n\n    rawData[rawPos + x] = val;\n  }\n}\n\nfunction filterSumAvg(pxData, pxPos, byteWidth, bpp) {\n  let sum = 0;\n  for (let x = 0; x < byteWidth; x++) {\n    let left = x >= bpp ? pxData[pxPos + x - bpp] : 0;\n    let up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0;\n    let val = pxData[pxPos + x] - ((left + up) >> 1);\n\n    sum += Math.abs(val);\n  }\n\n  return sum;\n}\n\nfunction filterPaeth(pxData, pxPos, byteWidth, rawData, rawPos, bpp) {\n  for (let x = 0; x < byteWidth; x++) {\n    let left = x >= bpp ? pxData[pxPos + x - bpp] : 0;\n    let up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0;\n    let upleft =\n      pxPos > 0 && x >= bpp ? pxData[pxPos + x - (byteWidth + bpp)] : 0;\n    let val = pxData[pxPos + x] - paethPredictor(left, up, upleft);\n\n    rawData[rawPos + x] = val;\n  }\n}\n\nfunction filterSumPaeth(pxData, pxPos, byteWidth, bpp) {\n  let sum = 0;\n  for (let x = 0; x < byteWidth; x++) {\n    let left = x >= bpp ? pxData[pxPos + x - bpp] : 0;\n    let up = pxPos > 0 ? pxData[pxPos + x - byteWidth] : 0;\n    let upleft =\n      pxPos > 0 && x >= bpp ? pxData[pxPos + x - (byteWidth + bpp)] : 0;\n    let val = pxData[pxPos + x] - paethPredictor(left, up, upleft);\n\n    sum += Math.abs(val);\n  }\n\n  return sum;\n}\n\nlet filters = {\n  0: filterNone,\n  1: filterSub,\n  2: filterUp,\n  3: filterAvg,\n  4: filterPaeth,\n};\n\nlet filterSums = {\n  0: filterSumNone,\n  1: filterSumSub,\n  2: filterSumUp,\n  3: filterSumAvg,\n  4: filterSumPaeth,\n};\n\nmodule.exports = function (pxData, width, height, options, bpp) {\n  let filterTypes;\n  if (!(\"filterType\" in options) || options.filterType === -1) {\n    filterTypes = [0, 1, 2, 3, 4];\n  } else if (typeof options.filterType === \"number\") {\n    filterTypes = [options.filterType];\n  } else {\n    throw new Error(\"unrecognised filter types\");\n  }\n\n  if (options.bitDepth === 16) {\n    bpp *= 2;\n  }\n  let byteWidth = width * bpp;\n  let rawPos = 0;\n  let pxPos = 0;\n  let rawData = Buffer.alloc((byteWidth + 1) * height);\n\n  let sel = filterTypes[0];\n\n  for (let y = 0; y < height; y++) {\n    if (filterTypes.length > 1) {\n      // find best filter for this line (with lowest sum of values)\n      let min = Infinity;\n\n      for (let i = 0; i < filterTypes.length; i++) {\n        let sum = filterSums[filterTypes[i]](pxData, pxPos, byteWidth, bpp);\n        if (sum < min) {\n          sel = filterTypes[i];\n          min = sum;\n        }\n      }\n    }\n\n    rawData[rawPos] = sel;\n    rawPos++;\n    filters[sel](pxData, pxPos, byteWidth, rawData, rawPos, bpp);\n    rawPos += byteWidth;\n    pxPos += byteWidth;\n  }\n  return rawData;\n};\n", "\"use strict\";\n\nlet constants = require(\"./constants\");\nlet CrcStream = require(\"./crc\");\nlet bitPacker = require(\"./bitpacker\");\nlet filter = require(\"./filter-pack\");\nlet zlib = require(\"zlib\");\n\nlet Packer = (module.exports = function (options) {\n  this._options = options;\n\n  options.deflateChunkSize = options.deflateChunkSize || 32 * 1024;\n  options.deflateLevel =\n    options.deflateLevel != null ? options.deflateLevel : 9;\n  options.deflateStrategy =\n    options.deflateStrategy != null ? options.deflateStrategy : 3;\n  options.inputHasAlpha =\n    options.inputHasAlpha != null ? options.inputHasAlpha : true;\n  options.deflateFactory = options.deflateFactory || zlib.createDeflate;\n  options.bitDepth = options.bitDepth || 8;\n  // This is outputColorType\n  options.colorType =\n    typeof options.colorType === \"number\"\n      ? options.colorType\n      : constants.COLORTYPE_COLOR_ALPHA;\n  options.inputColorType =\n    typeof options.inputColorType === \"number\"\n      ? options.inputColorType\n      : constants.COLORTYPE_COLOR_ALPHA;\n\n  if (\n    [\n      constants.COLORTYPE_GRAYSCALE,\n      constants.COLORTYPE_COLOR,\n      constants.COLORTYPE_COLOR_ALPHA,\n      constants.COLORTYPE_ALPHA,\n    ].indexOf(options.colorType) === -1\n  ) {\n    throw new Error(\n      \"option color type:\" + options.colorType + \" is not supported at present\"\n    );\n  }\n  if (\n    [\n      constants.COLORTYPE_GRAYSCALE,\n      constants.COLORTYPE_COLOR,\n      constants.COLORTYPE_COLOR_ALPHA,\n      constants.COLORTYPE_ALPHA,\n    ].indexOf(options.inputColorType) === -1\n  ) {\n    throw new Error(\n      \"option input color type:\" +\n        options.inputColorType +\n        \" is not supported at present\"\n    );\n  }\n  if (options.bitDepth !== 8 && options.bitDepth !== 16) {\n    throw new Error(\n      \"option bit depth:\" + options.bitDepth + \" is not supported at present\"\n    );\n  }\n});\n\nPacker.prototype.getDeflateOptions = function () {\n  return {\n    chunkSize: this._options.deflateChunkSize,\n    level: this._options.deflateLevel,\n    strategy: this._options.deflateStrategy,\n  };\n};\n\nPacker.prototype.createDeflate = function () {\n  return this._options.deflateFactory(this.getDeflateOptions());\n};\n\nPacker.prototype.filterData = function (data, width, height) {\n  // convert to correct format for filtering (e.g. right bpp and bit depth)\n  let packedData = bitPacker(data, width, height, this._options);\n\n  // filter pixel data\n  let bpp = constants.COLORTYPE_TO_BPP_MAP[this._options.colorType];\n  let filteredData = filter(packedData, width, height, this._options, bpp);\n  return filteredData;\n};\n\nPacker.prototype._packChunk = function (type, data) {\n  let len = data ? data.length : 0;\n  let buf = Buffer.alloc(len + 12);\n\n  buf.writeUInt32BE(len, 0);\n  buf.writeUInt32BE(type, 4);\n\n  if (data) {\n    data.copy(buf, 8);\n  }\n\n  buf.writeInt32BE(\n    CrcStream.crc32(buf.slice(4, buf.length - 4)),\n    buf.length - 4\n  );\n  return buf;\n};\n\nPacker.prototype.packGAMA = function (gamma) {\n  let buf = Buffer.alloc(4);\n  buf.writeUInt32BE(Math.floor(gamma * constants.GAMMA_DIVISION), 0);\n  return this._packChunk(constants.TYPE_gAMA, buf);\n};\n\nPacker.prototype.packIHDR = function (width, height) {\n  let buf = Buffer.alloc(13);\n  buf.writeUInt32BE(width, 0);\n  buf.writeUInt32BE(height, 4);\n  buf[8] = this._options.bitDepth; // Bit depth\n  buf[9] = this._options.colorType; // colorType\n  buf[10] = 0; // compression\n  buf[11] = 0; // filter\n  buf[12] = 0; // interlace\n\n  return this._packChunk(constants.TYPE_IHDR, buf);\n};\n\nPacker.prototype.packIDAT = function (data) {\n  return this._packChunk(constants.TYPE_IDAT, data);\n};\n\nPacker.prototype.packIEND = function () {\n  return this._packChunk(constants.TYPE_IEND, null);\n};\n", "\"use strict\";\n\nlet util = require(\"util\");\nlet Stream = require(\"stream\");\nlet constants = require(\"./constants\");\nlet Packer = require(\"./packer\");\n\nlet PackerAsync = (module.exports = function (opt) {\n  Stream.call(this);\n\n  let options = opt || {};\n\n  this._packer = new Packer(options);\n  this._deflate = this._packer.createDeflate();\n\n  this.readable = true;\n});\nutil.inherits(PackerAsync, Stream);\n\nPackerAsync.prototype.pack = function (data, width, height, gamma) {\n  // Signature\n  this.emit(\"data\", Buffer.from(constants.PNG_SIGNATURE));\n  this.emit(\"data\", this._packer.packIHDR(width, height));\n\n  if (gamma) {\n    this.emit(\"data\", this._packer.packGAMA(gamma));\n  }\n\n  let filteredData = this._packer.filterData(data, width, height);\n\n  // compress it\n  this._deflate.on(\"error\", this.emit.bind(this, \"error\"));\n\n  this._deflate.on(\n    \"data\",\n    function (compressedData) {\n      this.emit(\"data\", this._packer.packIDAT(compressedData));\n    }.bind(this)\n  );\n\n  this._deflate.on(\n    \"end\",\n    function () {\n      this.emit(\"data\", this._packer.packIEND());\n      this.emit(\"end\");\n    }.bind(this)\n  );\n\n  this._deflate.end(filteredData);\n};\n", "\"use strict\";\n\nlet assert = require(\"assert\").ok;\nlet zlib = require(\"zlib\");\nlet util = require(\"util\");\n\nlet kMaxLength = require(\"buffer\").kMaxLength;\n\nfunction Inflate(opts) {\n  if (!(this instanceof Inflate)) {\n    return new Inflate(opts);\n  }\n\n  if (opts && opts.chunkSize < zlib.Z_MIN_CHUNK) {\n    opts.chunkSize = zlib.Z_MIN_CHUNK;\n  }\n\n  zlib.Inflate.call(this, opts);\n\n  // Node 8 --> 9 compatibility check\n  this._offset = this._offset === undefined ? this._outOffset : this._offset;\n  this._buffer = this._buffer || this._outBuffer;\n\n  if (opts && opts.maxLength != null) {\n    this._maxLength = opts.maxLength;\n  }\n}\n\nfunction createInflate(opts) {\n  return new Inflate(opts);\n}\n\nfunction _close(engine, callback) {\n  if (callback) {\n    process.nextTick(callback);\n  }\n\n  // Caller may invoke .close after a zlib error (which will null _handle).\n  if (!engine._handle) {\n    return;\n  }\n\n  engine._handle.close();\n  engine._handle = null;\n}\n\nInflate.prototype._processChunk = function (chunk, flushFlag, asyncCb) {\n  if (typeof asyncCb === \"function\") {\n    return zlib.Inflate._processChunk.call(this, chunk, flushFlag, asyncCb);\n  }\n\n  let self = this;\n\n  let availInBefore = chunk && chunk.length;\n  let availOutBefore = this._chunkSize - this._offset;\n  let leftToInflate = this._maxLength;\n  let inOff = 0;\n\n  let buffers = [];\n  let nread = 0;\n\n  let error;\n  this.on(\"error\", function (err) {\n    error = err;\n  });\n\n  function handleChunk(availInAfter, availOutAfter) {\n    if (self._hadError) {\n      return;\n    }\n\n    let have = availOutBefore - availOutAfter;\n    assert(have >= 0, \"have should not go down\");\n\n    if (have > 0) {\n      let out = self._buffer.slice(self._offset, self._offset + have);\n      self._offset += have;\n\n      if (out.length > leftToInflate) {\n        out = out.slice(0, leftToInflate);\n      }\n\n      buffers.push(out);\n      nread += out.length;\n      leftToInflate -= out.length;\n\n      if (leftToInflate === 0) {\n        return false;\n      }\n    }\n\n    if (availOutAfter === 0 || self._offset >= self._chunkSize) {\n      availOutBefore = self._chunkSize;\n      self._offset = 0;\n      self._buffer = Buffer.allocUnsafe(self._chunkSize);\n    }\n\n    if (availOutAfter === 0) {\n      inOff += availInBefore - availInAfter;\n      availInBefore = availInAfter;\n\n      return true;\n    }\n\n    return false;\n  }\n\n  assert(this._handle, \"zlib binding closed\");\n  let res;\n  do {\n    res = this._handle.writeSync(\n      flushFlag,\n      chunk, // in\n      inOff, // in_off\n      availInBefore, // in_len\n      this._buffer, // out\n      this._offset, //out_off\n      availOutBefore\n    ); // out_len\n    // Node 8 --> 9 compatibility check\n    res = res || this._writeState;\n  } while (!this._hadError && handleChunk(res[0], res[1]));\n\n  if (this._hadError) {\n    throw error;\n  }\n\n  if (nread >= kMaxLength) {\n    _close(this);\n    throw new RangeError(\n      \"Cannot create final Buffer. It would be larger than 0x\" +\n        kMaxLength.toString(16) +\n        \" bytes\"\n    );\n  }\n\n  let buf = Buffer.concat(buffers, nread);\n  _close(this);\n\n  return buf;\n};\n\nutil.inherits(Inflate, zlib.Inflate);\n\nfunction zlibBufferSync(engine, buffer) {\n  if (typeof buffer === \"string\") {\n    buffer = Buffer.from(buffer);\n  }\n  if (!(buffer instanceof Buffer)) {\n    throw new TypeError(\"Not a string or buffer\");\n  }\n\n  let flushFlag = engine._finishFlushFlag;\n  if (flushFlag == null) {\n    flushFlag = zlib.Z_FINISH;\n  }\n\n  return engine._processChunk(buffer, flushFlag);\n}\n\nfunction inflateSync(buffer, opts) {\n  return zlibBufferSync(new Inflate(opts), buffer);\n}\n\nmodule.exports = exports = inflateSync;\nexports.Inflate = Inflate;\nexports.createInflate = createInflate;\nexports.inflateSync = inflateSync;\n", "\"use strict\";\n\nlet SyncReader = (module.exports = function (buffer) {\n  this._buffer = buffer;\n  this._reads = [];\n});\n\nSyncReader.prototype.read = function (length, callback) {\n  this._reads.push({\n    length: Math.abs(length), // if length < 0 then at most this length\n    allowLess: length < 0,\n    func: callback,\n  });\n};\n\nSyncReader.prototype.process = function () {\n  // as long as there is any data and read requests\n  while (this._reads.length > 0 && this._buffer.length) {\n    let read = this._reads[0];\n\n    if (\n      this._buffer.length &&\n      (this._buffer.length >= read.length || read.allowLess)\n    ) {\n      // ok there is any data so that we can satisfy this request\n      this._reads.shift(); // == read\n\n      let buf = this._buffer;\n\n      this._buffer = buf.slice(read.length);\n\n      read.func.call(this, buf.slice(0, read.length));\n    } else {\n      break;\n    }\n  }\n\n  if (this._reads.length > 0) {\n    throw new Error(\"There are some read requests waitng on finished stream\");\n  }\n\n  if (this._buffer.length > 0) {\n    throw new Error(\"unrecognised content at end of stream\");\n  }\n};\n", "\"use strict\";\n\nlet SyncReader = require(\"./sync-reader\");\nlet Filter = require(\"./filter-parse\");\n\nexports.process = function (inBuffer, bitmapInfo) {\n  let outBuffers = [];\n  let reader = new SyncReader(inBuffer);\n  let filter = new Filter(bitmapInfo, {\n    read: reader.read.bind(reader),\n    write: function (bufferPart) {\n      outBuffers.push(bufferPart);\n    },\n    complete: function () {},\n  });\n\n  filter.start();\n  reader.process();\n\n  return Buffer.concat(outBuffers);\n};\n", "\"use strict\";\n\nlet hasSyncZlib = true;\nlet zlib = require(\"zlib\");\nlet inflateSync = require(\"./sync-inflate\");\nif (!zlib.deflateSync) {\n  hasSyncZlib = false;\n}\nlet SyncReader = require(\"./sync-reader\");\nlet FilterSync = require(\"./filter-parse-sync\");\nlet Parser = require(\"./parser\");\nlet bitmapper = require(\"./bitmapper\");\nlet formatNormaliser = require(\"./format-normaliser\");\n\nmodule.exports = function (buffer, options) {\n  if (!hasSyncZlib) {\n    throw new Error(\n      \"To use the sync capability of this library in old node versions, please pin pngjs to v2.3.0\"\n    );\n  }\n\n  let err;\n  function handleError(_err_) {\n    err = _err_;\n  }\n\n  let metaData;\n  function handleMetaData(_metaData_) {\n    metaData = _metaData_;\n  }\n\n  function handleTransColor(transColor) {\n    metaData.transColor = transColor;\n  }\n\n  function handlePalette(palette) {\n    metaData.palette = palette;\n  }\n\n  function handleSimpleTransparency() {\n    metaData.alpha = true;\n  }\n\n  let gamma;\n  function handleGamma(_gamma_) {\n    gamma = _gamma_;\n  }\n\n  let inflateDataList = [];\n  function handleInflateData(inflatedData) {\n    inflateDataList.push(inflatedData);\n  }\n\n  let reader = new SyncReader(buffer);\n\n  let parser = new Parser(options, {\n    read: reader.read.bind(reader),\n    error: handleError,\n    metadata: handleMetaData,\n    gamma: handleGamma,\n    palette: handlePalette,\n    transColor: handleTransColor,\n    inflateData: handleInflateData,\n    simpleTransparency: handleSimpleTransparency,\n  });\n\n  parser.start();\n  reader.process();\n\n  if (err) {\n    throw err;\n  }\n\n  //join together the inflate datas\n  let inflateData = Buffer.concat(inflateDataList);\n  inflateDataList.length = 0;\n\n  let inflatedData;\n  if (metaData.interlace) {\n    inflatedData = zlib.inflateSync(inflateData);\n  } else {\n    let rowSize =\n      ((metaData.width * metaData.bpp * metaData.depth + 7) >> 3) + 1;\n    let imageSize = rowSize * metaData.height;\n    inflatedData = inflateSync(inflateData, {\n      chunkSize: imageSize,\n      maxLength: imageSize,\n    });\n  }\n  inflateData = null;\n\n  if (!inflatedData || !inflatedData.length) {\n    throw new Error(\"bad png - invalid inflate data response\");\n  }\n\n  let unfilteredData = FilterSync.process(inflatedData, metaData);\n  inflateData = null;\n\n  let bitmapData = bitmapper.dataToBitMap(unfilteredData, metaData);\n  unfilteredData = null;\n\n  let normalisedBitmapData = formatNormaliser(\n    bitmapData,\n    metaData,\n    options.skipRescale\n  );\n\n  metaData.data = normalisedBitmapData;\n  metaData.gamma = gamma || 0;\n\n  return metaData;\n};\n", "\"use strict\";\n\nlet hasSyncZlib = true;\nlet zlib = require(\"zlib\");\nif (!zlib.deflateSync) {\n  hasSyncZlib = false;\n}\nlet constants = require(\"./constants\");\nlet Packer = require(\"./packer\");\n\nmodule.exports = function (metaData, opt) {\n  if (!hasSyncZlib) {\n    throw new Error(\n      \"To use the sync capability of this library in old node versions, please pin pngjs to v2.3.0\"\n    );\n  }\n\n  let options = opt || {};\n\n  let packer = new Packer(options);\n\n  let chunks = [];\n\n  // Signature\n  chunks.push(Buffer.from(constants.PNG_SIGNATURE));\n\n  // Header\n  chunks.push(packer.packIHDR(metaData.width, metaData.height));\n\n  if (metaData.gamma) {\n    chunks.push(packer.packGAMA(metaData.gamma));\n  }\n\n  let filteredData = packer.filterData(\n    metaData.data,\n    metaData.width,\n    metaData.height\n  );\n\n  // compress it\n  let compressedData = zlib.deflateSync(\n    filteredData,\n    packer.getDeflateOptions()\n  );\n  filteredData = null;\n\n  if (!compressedData || !compressedData.length) {\n    throw new Error(\"bad png - invalid compressed data response\");\n  }\n  chunks.push(packer.packIDAT(compressedData));\n\n  // End\n  chunks.push(packer.packIEND());\n\n  return Buffer.concat(chunks);\n};\n", "\"use strict\";\n\nlet parse = require(\"./parser-sync\");\nlet pack = require(\"./packer-sync\");\n\nexports.read = function (buffer, options) {\n  return parse(buffer, options || {});\n};\n\nexports.write = function (png, options) {\n  return pack(png, options);\n};\n", "\"use strict\";\n\nlet util = require(\"util\");\nlet Stream = require(\"stream\");\nlet Parser = require(\"./parser-async\");\nlet Packer = require(\"./packer-async\");\nlet PNGSync = require(\"./png-sync\");\n\nlet PNG = (exports.PNG = function (options) {\n  Stream.call(this);\n\n  options = options || {}; // eslint-disable-line no-param-reassign\n\n  // coerce pixel dimensions to integers (also coerces undefined -> 0):\n  this.width = options.width | 0;\n  this.height = options.height | 0;\n\n  this.data =\n    this.width > 0 && this.height > 0\n      ? Buffer.alloc(4 * this.width * this.height)\n      : null;\n\n  if (options.fill && this.data) {\n    this.data.fill(0);\n  }\n\n  this.gamma = 0;\n  this.readable = this.writable = true;\n\n  this._parser = new Parser(options);\n\n  this._parser.on(\"error\", this.emit.bind(this, \"error\"));\n  this._parser.on(\"close\", this._handleClose.bind(this));\n  this._parser.on(\"metadata\", this._metadata.bind(this));\n  this._parser.on(\"gamma\", this._gamma.bind(this));\n  this._parser.on(\n    \"parsed\",\n    function (data) {\n      this.data = data;\n      this.emit(\"parsed\", data);\n    }.bind(this)\n  );\n\n  this._packer = new Packer(options);\n  this._packer.on(\"data\", this.emit.bind(this, \"data\"));\n  this._packer.on(\"end\", this.emit.bind(this, \"end\"));\n  this._parser.on(\"close\", this._handleClose.bind(this));\n  this._packer.on(\"error\", this.emit.bind(this, \"error\"));\n});\nutil.inherits(PNG, Stream);\n\nPNG.sync = PNGSync;\n\nPNG.prototype.pack = function () {\n  if (!this.data || !this.data.length) {\n    this.emit(\"error\", \"No data provided\");\n    return this;\n  }\n\n  process.nextTick(\n    function () {\n      this._packer.pack(this.data, this.width, this.height, this.gamma);\n    }.bind(this)\n  );\n\n  return this;\n};\n\nPNG.prototype.parse = function (data, callback) {\n  if (callback) {\n    let onParsed, onError;\n\n    onParsed = function (parsedData) {\n      this.removeListener(\"error\", onError);\n\n      this.data = parsedData;\n      callback(null, this);\n    }.bind(this);\n\n    onError = function (err) {\n      this.removeListener(\"parsed\", onParsed);\n\n      callback(err, null);\n    }.bind(this);\n\n    this.once(\"parsed\", onParsed);\n    this.once(\"error\", onError);\n  }\n\n  this.end(data);\n  return this;\n};\n\nPNG.prototype.write = function (data) {\n  this._parser.write(data);\n  return true;\n};\n\nPNG.prototype.end = function (data) {\n  this._parser.end(data);\n};\n\nPNG.prototype._metadata = function (metadata) {\n  this.width = metadata.width;\n  this.height = metadata.height;\n\n  this.emit(\"metadata\", metadata);\n};\n\nPNG.prototype._gamma = function (gamma) {\n  this.gamma = gamma;\n};\n\nPNG.prototype._handleClose = function () {\n  if (!this._parser.writable && !this._packer.readable) {\n    this.emit(\"close\");\n  }\n};\n\nPNG.bitblt = function (src, dst, srcX, srcY, width, height, deltaX, deltaY) {\n  // eslint-disable-line max-params\n  // coerce pixel dimensions to integers (also coerces undefined -> 0):\n  /* eslint-disable no-param-reassign */\n  srcX |= 0;\n  srcY |= 0;\n  width |= 0;\n  height |= 0;\n  deltaX |= 0;\n  deltaY |= 0;\n  /* eslint-enable no-param-reassign */\n\n  if (\n    srcX > src.width ||\n    srcY > src.height ||\n    srcX + width > src.width ||\n    srcY + height > src.height\n  ) {\n    throw new Error(\"bitblt reading outside image\");\n  }\n\n  if (\n    deltaX > dst.width ||\n    deltaY > dst.height ||\n    deltaX + width > dst.width ||\n    deltaY + height > dst.height\n  ) {\n    throw new Error(\"bitblt writing outside image\");\n  }\n\n  for (let y = 0; y < height; y++) {\n    src.data.copy(\n      dst.data,\n      ((deltaY + y) * dst.width + deltaX) << 2,\n      ((srcY + y) * src.width + srcX) << 2,\n      ((srcY + y) * src.width + srcX + width) << 2\n    );\n  }\n};\n\nPNG.prototype.bitblt = function (\n  dst,\n  srcX,\n  srcY,\n  width,\n  height,\n  deltaX,\n  deltaY\n) {\n  // eslint-disable-line max-params\n\n  PNG.bitblt(this, dst, srcX, srcY, width, height, deltaX, deltaY);\n  return this;\n};\n\nPNG.adjustGamma = function (src) {\n  if (src.gamma) {\n    for (let y = 0; y < src.height; y++) {\n      for (let x = 0; x < src.width; x++) {\n        let idx = (src.width * y + x) << 2;\n\n        for (let i = 0; i < 3; i++) {\n          let sample = src.data[idx + i] / 255;\n          sample = Math.pow(sample, 1 / 2.2 / src.gamma);\n          src.data[idx + i] = Math.round(sample * 255);\n        }\n      }\n    }\n    src.gamma = 0;\n  }\n};\n\nPNG.prototype.adjustGamma = function () {\n  PNG.adjustGamma(this);\n};\n", "'use strict';\n\nvar urllib = require('url');\n\nmodule.exports.CookieJar = CookieJar;\n\nfunction CookieJar(options) {\n    this.options = options || {};\n    this.options.sessionTimeout = this.options.sessionTimeout || 1800; // 30min\n\n    this.cookies = {};\n}\n\nCookieJar.prototype.addCookie = function (cookie) {\n\n    if (!cookie || !cookie.name) {\n        return;\n    }\n\n    var lcookie;\n\n    if (!this.cookies[cookie.name]) {\n        this.cookies[cookie.name] = [];\n    }\n\n    // overwrite if has same params\n    for (var i = 0, len = this.cookies[cookie.name].length; i < len; i++) {\n        lcookie = this.cookies[cookie.name][i];\n        if (\n            lcookie.path === cookie.path &&\n            lcookie.domain === cookie.domain &&\n            lcookie.secure === cookie.secure &&\n            lcookie.httponly === cookie.httponly\n        ) {\n            this.cookies[cookie.name][i] = cookie;\n            return;\n        }\n    }\n\n    this.cookies[cookie.name].push(cookie);\n};\n\nCookieJar.prototype.getCookies = function (url) {\n    var keys = Object.keys(this.cookies),\n        cookie, cookies = [];\n\n    for (var i = 0, len = keys.length; i < len; i++) {\n        if (Array.isArray(this.cookies[keys[i]])) {\n            for (var j = 0, lenj = this.cookies[keys[i]].length; j < lenj; j++) {\n                cookie = this.cookies[keys[i]][j];\n                if (this.matchCookie(cookie, url)) {\n                    cookies.push(cookie.name + '=' + cookie.value);\n                }\n            }\n        }\n    }\n    return cookies.join('; ');\n};\n\nCookieJar.prototype.matchCookie = function (cookie, url) {\n    var urlparts = urllib.parse(url || '', false, true),\n        path;\n\n    // check expire\n    if (cookie.expire) {\n        if (cookie.expire.getTime() < Date.now()) {\n            return;\n        }\n    }\n\n    // check if hostname matches\n    if (urlparts.hostname && cookie._domain) {\n        if (!(urlparts.hostname === cookie._domain || urlparts.hostname.substr(-(cookie._domain.length + 1)) === '.' + cookie._domain)) {\n            return false;\n        }\n    }\n\n    // check if path matches\n    if (cookie.path && urlparts.pathname) {\n\n        path = (urlparts.pathname || '/').split('/');\n        path.pop();\n        path = path.join('/').trim();\n        if (path.substr(0, 1) !== '/') {\n            path = '/' + path;\n        }\n        if (path.substr(-1) !== '/') {\n            path += '/';\n        }\n\n        if (path.substr(0, cookie.path.length) !== cookie.path) {\n            return false;\n        }\n    }\n\n    // check secure\n    if (cookie.secure && urlparts.protocol) {\n        if (urlparts.protocol !== 'https:') {\n            return false;\n        }\n    }\n\n    // check httponly\n    if (cookie.httponly && urlparts.protocol) {\n        if (urlparts.protocol !== 'http:') {\n            return false;\n        }\n    }\n\n    return true;\n};\n\nCookieJar.prototype.setCookie = function (cookie_str, url) {\n    var parts = (cookie_str || '').split(';'),\n        cookie = {},\n        urlparts = urllib.parse(url || '', false, true),\n        path;\n\n    parts.forEach((function (part) {\n        var key, val;\n        part = part.split('=');\n        key = part.shift().trim();\n        val = part.join('=').trim();\n\n        if (!key) {\n            return;\n        }\n\n        switch (key.toLowerCase()) {\n\n            case 'expires':\n\n                cookie.expires = new Date(val);\n                break;\n\n            case 'path':\n                cookie.path = val.trim();\n                break;\n\n            case 'domain':\n                cookie.domain = val.toLowerCase();\n                break;\n\n            case 'max-age':\n                cookie.expires = new Date(Date.now() + (Number(val) || 0) * 1000);\n                break;\n\n            case 'secure':\n                cookie.secure = true;\n                break;\n\n            case 'httponly':\n                cookie.httponly = true;\n                break;\n\n            default:\n                if (!cookie.name) {\n                    cookie.name = key;\n                    cookie.value = val;\n                }\n        }\n    }).bind(this));\n\n    // use current path when path is not specified\n    if (!cookie.path) {\n        path = (urlparts.pathname || '/').split('/');\n        path.pop();\n        cookie.path = path.join('/').trim();\n        if (cookie.path.substr(0, 1) !== '/') {\n            cookie.path = '/' + cookie.path;\n        }\n        if (cookie.path.substr(-1) !== '/') {\n            cookie.path += '/';\n        }\n    }\n\n    // if no expire date, then use sessionTimeout value\n    if (!cookie.expires) {\n        cookie._expires = new Date(Date.now() + (Number(this.options.sessionTimeout) || 0) * 1000);\n    } else {\n        cookie._expires = cookie.expires;\n    }\n\n    if (!cookie.domain) {\n        if (urlparts.hostname) {\n            cookie._domain = urlparts.hostname;\n        }\n    } else {\n        cookie._domain = cookie.domain;\n    }\n\n    this.addCookie(cookie);\n};\n", "/* eslint-disable node/no-deprecated-api */\n\n'use strict'\n\nvar buffer = require('buffer')\nvar Buffer = buffer.Buffer\n\nvar safer = {}\n\nvar key\n\nfor (key in buffer) {\n  if (!buffer.hasOwnProperty(key)) continue\n  if (key === 'SlowBuffer' || key === 'Buffer') continue\n  safer[key] = buffer[key]\n}\n\nvar Safer = safer.Buffer = {}\nfor (key in Buffer) {\n  if (!Buffer.hasOwnProperty(key)) continue\n  if (key === 'allocUnsafe' || key === 'allocUnsafeSlow') continue\n  Safer[key] = Buffer[key]\n}\n\nsafer.Buffer.prototype = Buffer.prototype\n\nif (!Safer.from || Safer.from === Uint8Array.from) {\n  Safer.from = function (value, encodingOrOffset, length) {\n    if (typeof value === 'number') {\n      throw new TypeError('The \"value\" argument must not be of type number. Received type ' + typeof value)\n    }\n    if (value && typeof value.length === 'undefined') {\n      throw new TypeError('The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type ' + typeof value)\n    }\n    return Buffer(value, encodingOrOffset, length)\n  }\n}\n\nif (!Safer.alloc) {\n  Safer.alloc = function (size, fill, encoding) {\n    if (typeof size !== 'number') {\n      throw new TypeError('The \"size\" argument must be of type number. Received type ' + typeof size)\n    }\n    if (size < 0 || size >= 2 * (1 << 30)) {\n      throw new RangeError('The value \"' + size + '\" is invalid for option \"size\"')\n    }\n    var buf = Buffer(size)\n    if (!fill || fill.length === 0) {\n      buf.fill(0)\n    } else if (typeof encoding === 'string') {\n      buf.fill(fill, encoding)\n    } else {\n      buf.fill(fill)\n    }\n    return buf\n  }\n}\n\nif (!safer.kStringMaxLength) {\n  try {\n    safer.kStringMaxLength = process.binding('buffer').kStringMaxLength\n  } catch (e) {\n    // we can't determine kStringMaxLength in environments where process.binding\n    // is unsupported, so let's not set it\n  }\n}\n\nif (!safer.constants) {\n  safer.constants = {\n    MAX_LENGTH: safer.kMaxLength\n  }\n  if (safer.kStringMaxLength) {\n    safer.constants.MAX_STRING_LENGTH = safer.kStringMaxLength\n  }\n}\n\nmodule.exports = safer\n", "\"use strict\";\n\nvar BOMChar = '\\uFEFF';\n\nexports.PrependBOM = PrependBOMWrapper\nfunction PrependBOMWrapper(encoder, options) {\n    this.encoder = encoder;\n    this.addBOM = true;\n}\n\nPrependBOMWrapper.prototype.write = function(str) {\n    if (this.addBOM) {\n        str = BOMChar + str;\n        this.addBOM = false;\n    }\n\n    return this.encoder.write(str);\n}\n\nPrependBOMWrapper.prototype.end = function() {\n    return this.encoder.end();\n}\n\n\n//------------------------------------------------------------------------------\n\nexports.StripBOM = StripBOMWrapper;\nfunction StripBOMWrapper(decoder, options) {\n    this.decoder = decoder;\n    this.pass = false;\n    this.options = options || {};\n}\n\nStripBOMWrapper.prototype.write = function(buf) {\n    var res = this.decoder.write(buf);\n    if (this.pass || !res)\n        return res;\n\n    if (res[0] === BOMChar) {\n        res = res.slice(1);\n        if (typeof this.options.stripBOM === 'function')\n            this.options.stripBOM();\n    }\n\n    this.pass = true;\n    return res;\n}\n\nStripBOMWrapper.prototype.end = function() {\n    return this.decoder.end();\n}\n\n", "\"use strict\";\nvar Buffer = require(\"safer-buffer\").Buffer;\n\n// Export Node.js internal encodings.\n\nmodule.exports = {\n    // Encodings\n    utf8:   { type: \"_internal\", bomAware: true},\n    cesu8:  { type: \"_internal\", bomAware: true},\n    unicode11utf8: \"utf8\",\n\n    ucs2:   { type: \"_internal\", bomAware: true},\n    utf16le: \"ucs2\",\n\n    binary: { type: \"_internal\" },\n    base64: { type: \"_internal\" },\n    hex:    { type: \"_internal\" },\n\n    // Codec.\n    _internal: InternalCodec,\n};\n\n//------------------------------------------------------------------------------\n\nfunction InternalCodec(codecOptions, iconv) {\n    this.enc = codecOptions.encodingName;\n    this.bomAware = codecOptions.bomAware;\n\n    if (this.enc === \"base64\")\n        this.encoder = InternalEncoderBase64;\n    else if (this.enc === \"cesu8\") {\n        this.enc = \"utf8\"; // Use utf8 for decoding.\n        this.encoder = InternalEncoderCesu8;\n\n        // Add decoder for versions of Node not supporting CESU-8\n        if (Buffer.from('eda0bdedb2a9', 'hex').toString() !== '\uD83D\uDCA9') {\n            this.decoder = InternalDecoderCesu8;\n            this.defaultCharUnicode = iconv.defaultCharUnicode;\n        }\n    }\n}\n\nInternalCodec.prototype.encoder = InternalEncoder;\nInternalCodec.prototype.decoder = InternalDecoder;\n\n//------------------------------------------------------------------------------\n\n// We use node.js internal decoder. Its signature is the same as ours.\nvar StringDecoder = require('string_decoder').StringDecoder;\n\nif (!StringDecoder.prototype.end) // Node v0.8 doesn't have this method.\n    StringDecoder.prototype.end = function() {};\n\n\nfunction InternalDecoder(options, codec) {\n    StringDecoder.call(this, codec.enc);\n}\n\nInternalDecoder.prototype = StringDecoder.prototype;\n\n\n//------------------------------------------------------------------------------\n// Encoder is mostly trivial\n\nfunction InternalEncoder(options, codec) {\n    this.enc = codec.enc;\n}\n\nInternalEncoder.prototype.write = function(str) {\n    return Buffer.from(str, this.enc);\n}\n\nInternalEncoder.prototype.end = function() {\n}\n\n\n//------------------------------------------------------------------------------\n// Except base64 encoder, which must keep its state.\n\nfunction InternalEncoderBase64(options, codec) {\n    this.prevStr = '';\n}\n\nInternalEncoderBase64.prototype.write = function(str) {\n    str = this.prevStr + str;\n    var completeQuads = str.length - (str.length % 4);\n    this.prevStr = str.slice(completeQuads);\n    str = str.slice(0, completeQuads);\n\n    return Buffer.from(str, \"base64\");\n}\n\nInternalEncoderBase64.prototype.end = function() {\n    return Buffer.from(this.prevStr, \"base64\");\n}\n\n\n//------------------------------------------------------------------------------\n// CESU-8 encoder is also special.\n\nfunction InternalEncoderCesu8(options, codec) {\n}\n\nInternalEncoderCesu8.prototype.write = function(str) {\n    var buf = Buffer.alloc(str.length * 3), bufIdx = 0;\n    for (var i = 0; i < str.length; i++) {\n        var charCode = str.charCodeAt(i);\n        // Naive implementation, but it works because CESU-8 is especially easy\n        // to convert from UTF-16 (which all JS strings are encoded in).\n        if (charCode < 0x80)\n            buf[bufIdx++] = charCode;\n        else if (charCode < 0x800) {\n            buf[bufIdx++] = 0xC0 + (charCode >>> 6);\n            buf[bufIdx++] = 0x80 + (charCode & 0x3f);\n        }\n        else { // charCode will always be < 0x10000 in javascript.\n            buf[bufIdx++] = 0xE0 + (charCode >>> 12);\n            buf[bufIdx++] = 0x80 + ((charCode >>> 6) & 0x3f);\n            buf[bufIdx++] = 0x80 + (charCode & 0x3f);\n        }\n    }\n    return buf.slice(0, bufIdx);\n}\n\nInternalEncoderCesu8.prototype.end = function() {\n}\n\n//------------------------------------------------------------------------------\n// CESU-8 decoder is not implemented in Node v4.0+\n\nfunction InternalDecoderCesu8(options, codec) {\n    this.acc = 0;\n    this.contBytes = 0;\n    this.accBytes = 0;\n    this.defaultCharUnicode = codec.defaultCharUnicode;\n}\n\nInternalDecoderCesu8.prototype.write = function(buf) {\n    var acc = this.acc, contBytes = this.contBytes, accBytes = this.accBytes, \n        res = '';\n    for (var i = 0; i < buf.length; i++) {\n        var curByte = buf[i];\n        if ((curByte & 0xC0) !== 0x80) { // Leading byte\n            if (contBytes > 0) { // Previous code is invalid\n                res += this.defaultCharUnicode;\n                contBytes = 0;\n            }\n\n            if (curByte < 0x80) { // Single-byte code\n                res += String.fromCharCode(curByte);\n            } else if (curByte < 0xE0) { // Two-byte code\n                acc = curByte & 0x1F;\n                contBytes = 1; accBytes = 1;\n            } else if (curByte < 0xF0) { // Three-byte code\n                acc = curByte & 0x0F;\n                contBytes = 2; accBytes = 1;\n            } else { // Four or more are not supported for CESU-8.\n                res += this.defaultCharUnicode;\n            }\n        } else { // Continuation byte\n            if (contBytes > 0) { // We're waiting for it.\n                acc = (acc << 6) | (curByte & 0x3f);\n                contBytes--; accBytes++;\n                if (contBytes === 0) {\n                    // Check for overlong encoding, but support Modified UTF-8 (encoding NULL as C0 80)\n                    if (accBytes === 2 && acc < 0x80 && acc > 0)\n                        res += this.defaultCharUnicode;\n                    else if (accBytes === 3 && acc < 0x800)\n                        res += this.defaultCharUnicode;\n                    else\n                        // Actually add character.\n                        res += String.fromCharCode(acc);\n                }\n            } else { // Unexpected continuation byte\n                res += this.defaultCharUnicode;\n            }\n        }\n    }\n    this.acc = acc; this.contBytes = contBytes; this.accBytes = accBytes;\n    return res;\n}\n\nInternalDecoderCesu8.prototype.end = function() {\n    var res = 0;\n    if (this.contBytes > 0)\n        res += this.defaultCharUnicode;\n    return res;\n}\n", "\"use strict\";\nvar Buffer = require(\"safer-buffer\").Buffer;\n\n// Note: UTF16-LE (or UCS2) codec is Node.js native. See encodings/internal.js\n\n// == UTF16-BE codec. ==========================================================\n\nexports.utf16be = Utf16BECodec;\nfunction Utf16BECodec() {\n}\n\nUtf16BECodec.prototype.encoder = Utf16BEEncoder;\nUtf16BECodec.prototype.decoder = Utf16BEDecoder;\nUtf16BECodec.prototype.bomAware = true;\n\n\n// -- Encoding\n\nfunction Utf16BEEncoder() {\n}\n\nUtf16BEEncoder.prototype.write = function(str) {\n    var buf = Buffer.from(str, 'ucs2');\n    for (var i = 0; i < buf.length; i += 2) {\n        var tmp = buf[i]; buf[i] = buf[i+1]; buf[i+1] = tmp;\n    }\n    return buf;\n}\n\nUtf16BEEncoder.prototype.end = function() {\n}\n\n\n// -- Decoding\n\nfunction Utf16BEDecoder() {\n    this.overflowByte = -1;\n}\n\nUtf16BEDecoder.prototype.write = function(buf) {\n    if (buf.length == 0)\n        return '';\n\n    var buf2 = Buffer.alloc(buf.length + 1),\n        i = 0, j = 0;\n\n    if (this.overflowByte !== -1) {\n        buf2[0] = buf[0];\n        buf2[1] = this.overflowByte;\n        i = 1; j = 2;\n    }\n\n    for (; i < buf.length-1; i += 2, j+= 2) {\n        buf2[j] = buf[i+1];\n        buf2[j+1] = buf[i];\n    }\n\n    this.overflowByte = (i == buf.length-1) ? buf[buf.length-1] : -1;\n\n    return buf2.slice(0, j).toString('ucs2');\n}\n\nUtf16BEDecoder.prototype.end = function() {\n}\n\n\n// == UTF-16 codec =============================================================\n// Decoder chooses automatically from UTF-16LE and UTF-16BE using BOM and space-based heuristic.\n// Defaults to UTF-16LE, as it's prevalent and default in Node.\n// http://en.wikipedia.org/wiki/UTF-16 and http://encoding.spec.whatwg.org/#utf-16le\n// Decoder default can be changed: iconv.decode(buf, 'utf16', {defaultEncoding: 'utf-16be'});\n\n// Encoder uses UTF-16LE and prepends BOM (which can be overridden with addBOM: false).\n\nexports.utf16 = Utf16Codec;\nfunction Utf16Codec(codecOptions, iconv) {\n    this.iconv = iconv;\n}\n\nUtf16Codec.prototype.encoder = Utf16Encoder;\nUtf16Codec.prototype.decoder = Utf16Decoder;\n\n\n// -- Encoding (pass-through)\n\nfunction Utf16Encoder(options, codec) {\n    options = options || {};\n    if (options.addBOM === undefined)\n        options.addBOM = true;\n    this.encoder = codec.iconv.getEncoder('utf-16le', options);\n}\n\nUtf16Encoder.prototype.write = function(str) {\n    return this.encoder.write(str);\n}\n\nUtf16Encoder.prototype.end = function() {\n    return this.encoder.end();\n}\n\n\n// -- Decoding\n\nfunction Utf16Decoder(options, codec) {\n    this.decoder = null;\n    this.initialBytes = [];\n    this.initialBytesLen = 0;\n\n    this.options = options || {};\n    this.iconv = codec.iconv;\n}\n\nUtf16Decoder.prototype.write = function(buf) {\n    if (!this.decoder) {\n        // Codec is not chosen yet. Accumulate initial bytes.\n        this.initialBytes.push(buf);\n        this.initialBytesLen += buf.length;\n        \n        if (this.initialBytesLen < 16) // We need more bytes to use space heuristic (see below)\n            return '';\n\n        // We have enough bytes -> detect endianness.\n        var buf = Buffer.concat(this.initialBytes),\n            encoding = detectEncoding(buf, this.options.defaultEncoding);\n        this.decoder = this.iconv.getDecoder(encoding, this.options);\n        this.initialBytes.length = this.initialBytesLen = 0;\n    }\n\n    return this.decoder.write(buf);\n}\n\nUtf16Decoder.prototype.end = function() {\n    if (!this.decoder) {\n        var buf = Buffer.concat(this.initialBytes),\n            encoding = detectEncoding(buf, this.options.defaultEncoding);\n        this.decoder = this.iconv.getDecoder(encoding, this.options);\n\n        var res = this.decoder.write(buf),\n            trail = this.decoder.end();\n\n        return trail ? (res + trail) : res;\n    }\n    return this.decoder.end();\n}\n\nfunction detectEncoding(buf, defaultEncoding) {\n    var enc = defaultEncoding || 'utf-16le';\n\n    if (buf.length >= 2) {\n        // Check BOM.\n        if (buf[0] == 0xFE && buf[1] == 0xFF) // UTF-16BE BOM\n            enc = 'utf-16be';\n        else if (buf[0] == 0xFF && buf[1] == 0xFE) // UTF-16LE BOM\n            enc = 'utf-16le';\n        else {\n            // No BOM found. Try to deduce encoding from initial content.\n            // Most of the time, the content has ASCII chars (U+00**), but the opposite (U+**00) is uncommon.\n            // So, we count ASCII as if it was LE or BE, and decide from that.\n            var asciiCharsLE = 0, asciiCharsBE = 0, // Counts of chars in both positions\n                _len = Math.min(buf.length - (buf.length % 2), 64); // Len is always even.\n\n            for (var i = 0; i < _len; i += 2) {\n                if (buf[i] === 0 && buf[i+1] !== 0) asciiCharsBE++;\n                if (buf[i] !== 0 && buf[i+1] === 0) asciiCharsLE++;\n            }\n\n            if (asciiCharsBE > asciiCharsLE)\n                enc = 'utf-16be';\n            else if (asciiCharsBE < asciiCharsLE)\n                enc = 'utf-16le';\n        }\n    }\n\n    return enc;\n}\n\n\n", "\"use strict\";\nvar Buffer = require(\"safer-buffer\").Buffer;\n\n// UTF-7 codec, according to https://tools.ietf.org/html/rfc2152\n// See also below a UTF-7-IMAP codec, according to http://tools.ietf.org/html/rfc3501#section-5.1.3\n\nexports.utf7 = Utf7Codec;\nexports.unicode11utf7 = 'utf7'; // Alias UNICODE-1-1-UTF-7\nfunction Utf7Codec(codecOptions, iconv) {\n    this.iconv = iconv;\n};\n\nUtf7Codec.prototype.encoder = Utf7Encoder;\nUtf7Codec.prototype.decoder = Utf7Decoder;\nUtf7Codec.prototype.bomAware = true;\n\n\n// -- Encoding\n\nvar nonDirectChars = /[^A-Za-z0-9'\\(\\),-\\.\\/:\\? \\n\\r\\t]+/g;\n\nfunction Utf7Encoder(options, codec) {\n    this.iconv = codec.iconv;\n}\n\nUtf7Encoder.prototype.write = function(str) {\n    // Naive implementation.\n    // Non-direct chars are encoded as \"+<base64>-\"; single \"+\" char is encoded as \"+-\".\n    return Buffer.from(str.replace(nonDirectChars, function(chunk) {\n        return \"+\" + (chunk === '+' ? '' : \n            this.iconv.encode(chunk, 'utf16-be').toString('base64').replace(/=+$/, '')) \n            + \"-\";\n    }.bind(this)));\n}\n\nUtf7Encoder.prototype.end = function() {\n}\n\n\n// -- Decoding\n\nfunction Utf7Decoder(options, codec) {\n    this.iconv = codec.iconv;\n    this.inBase64 = false;\n    this.base64Accum = '';\n}\n\nvar base64Regex = /[A-Za-z0-9\\/+]/;\nvar base64Chars = [];\nfor (var i = 0; i < 256; i++)\n    base64Chars[i] = base64Regex.test(String.fromCharCode(i));\n\nvar plusChar = '+'.charCodeAt(0), \n    minusChar = '-'.charCodeAt(0),\n    andChar = '&'.charCodeAt(0);\n\nUtf7Decoder.prototype.write = function(buf) {\n    var res = \"\", lastI = 0,\n        inBase64 = this.inBase64,\n        base64Accum = this.base64Accum;\n\n    // The decoder is more involved as we must handle chunks in stream.\n\n    for (var i = 0; i < buf.length; i++) {\n        if (!inBase64) { // We're in direct mode.\n            // Write direct chars until '+'\n            if (buf[i] == plusChar) {\n                res += this.iconv.decode(buf.slice(lastI, i), \"ascii\"); // Write direct chars.\n                lastI = i+1;\n                inBase64 = true;\n            }\n        } else { // We decode base64.\n            if (!base64Chars[buf[i]]) { // Base64 ended.\n                if (i == lastI && buf[i] == minusChar) {// \"+-\" -> \"+\"\n                    res += \"+\";\n                } else {\n                    var b64str = base64Accum + buf.slice(lastI, i).toString();\n                    res += this.iconv.decode(Buffer.from(b64str, 'base64'), \"utf16-be\");\n                }\n\n                if (buf[i] != minusChar) // Minus is absorbed after base64.\n                    i--;\n\n                lastI = i+1;\n                inBase64 = false;\n                base64Accum = '';\n            }\n        }\n    }\n\n    if (!inBase64) {\n        res += this.iconv.decode(buf.slice(lastI), \"ascii\"); // Write direct chars.\n    } else {\n        var b64str = base64Accum + buf.slice(lastI).toString();\n\n        var canBeDecoded = b64str.length - (b64str.length % 8); // Minimal chunk: 2 quads -> 2x3 bytes -> 3 chars.\n        base64Accum = b64str.slice(canBeDecoded); // The rest will be decoded in future.\n        b64str = b64str.slice(0, canBeDecoded);\n\n        res += this.iconv.decode(Buffer.from(b64str, 'base64'), \"utf16-be\");\n    }\n\n    this.inBase64 = inBase64;\n    this.base64Accum = base64Accum;\n\n    return res;\n}\n\nUtf7Decoder.prototype.end = function() {\n    var res = \"\";\n    if (this.inBase64 && this.base64Accum.length > 0)\n        res = this.iconv.decode(Buffer.from(this.base64Accum, 'base64'), \"utf16-be\");\n\n    this.inBase64 = false;\n    this.base64Accum = '';\n    return res;\n}\n\n\n// UTF-7-IMAP codec.\n// RFC3501 Sec. 5.1.3 Modified UTF-7 (http://tools.ietf.org/html/rfc3501#section-5.1.3)\n// Differences:\n//  * Base64 part is started by \"&\" instead of \"+\"\n//  * Direct characters are 0x20-0x7E, except \"&\" (0x26)\n//  * In Base64, \",\" is used instead of \"/\"\n//  * Base64 must not be used to represent direct characters.\n//  * No implicit shift back from Base64 (should always end with '-')\n//  * String must end in non-shifted position.\n//  * \"-&\" while in base64 is not allowed.\n\n\nexports.utf7imap = Utf7IMAPCodec;\nfunction Utf7IMAPCodec(codecOptions, iconv) {\n    this.iconv = iconv;\n};\n\nUtf7IMAPCodec.prototype.encoder = Utf7IMAPEncoder;\nUtf7IMAPCodec.prototype.decoder = Utf7IMAPDecoder;\nUtf7IMAPCodec.prototype.bomAware = true;\n\n\n// -- Encoding\n\nfunction Utf7IMAPEncoder(options, codec) {\n    this.iconv = codec.iconv;\n    this.inBase64 = false;\n    this.base64Accum = Buffer.alloc(6);\n    this.base64AccumIdx = 0;\n}\n\nUtf7IMAPEncoder.prototype.write = function(str) {\n    var inBase64 = this.inBase64,\n        base64Accum = this.base64Accum,\n        base64AccumIdx = this.base64AccumIdx,\n        buf = Buffer.alloc(str.length*5 + 10), bufIdx = 0;\n\n    for (var i = 0; i < str.length; i++) {\n        var uChar = str.charCodeAt(i);\n        if (0x20 <= uChar && uChar <= 0x7E) { // Direct character or '&'.\n            if (inBase64) {\n                if (base64AccumIdx > 0) {\n                    bufIdx += buf.write(base64Accum.slice(0, base64AccumIdx).toString('base64').replace(/\\//g, ',').replace(/=+$/, ''), bufIdx);\n                    base64AccumIdx = 0;\n                }\n\n                buf[bufIdx++] = minusChar; // Write '-', then go to direct mode.\n                inBase64 = false;\n            }\n\n            if (!inBase64) {\n                buf[bufIdx++] = uChar; // Write direct character\n\n                if (uChar === andChar)  // Ampersand -> '&-'\n                    buf[bufIdx++] = minusChar;\n            }\n\n        } else { // Non-direct character\n            if (!inBase64) {\n                buf[bufIdx++] = andChar; // Write '&', then go to base64 mode.\n                inBase64 = true;\n            }\n            if (inBase64) {\n                base64Accum[base64AccumIdx++] = uChar >> 8;\n                base64Accum[base64AccumIdx++] = uChar & 0xFF;\n\n                if (base64AccumIdx == base64Accum.length) {\n                    bufIdx += buf.write(base64Accum.toString('base64').replace(/\\//g, ','), bufIdx);\n                    base64AccumIdx = 0;\n                }\n            }\n        }\n    }\n\n    this.inBase64 = inBase64;\n    this.base64AccumIdx = base64AccumIdx;\n\n    return buf.slice(0, bufIdx);\n}\n\nUtf7IMAPEncoder.prototype.end = function() {\n    var buf = Buffer.alloc(10), bufIdx = 0;\n    if (this.inBase64) {\n        if (this.base64AccumIdx > 0) {\n            bufIdx += buf.write(this.base64Accum.slice(0, this.base64AccumIdx).toString('base64').replace(/\\//g, ',').replace(/=+$/, ''), bufIdx);\n            this.base64AccumIdx = 0;\n        }\n\n        buf[bufIdx++] = minusChar; // Write '-', then go to direct mode.\n        this.inBase64 = false;\n    }\n\n    return buf.slice(0, bufIdx);\n}\n\n\n// -- Decoding\n\nfunction Utf7IMAPDecoder(options, codec) {\n    this.iconv = codec.iconv;\n    this.inBase64 = false;\n    this.base64Accum = '';\n}\n\nvar base64IMAPChars = base64Chars.slice();\nbase64IMAPChars[','.charCodeAt(0)] = true;\n\nUtf7IMAPDecoder.prototype.write = function(buf) {\n    var res = \"\", lastI = 0,\n        inBase64 = this.inBase64,\n        base64Accum = this.base64Accum;\n\n    // The decoder is more involved as we must handle chunks in stream.\n    // It is forgiving, closer to standard UTF-7 (for example, '-' is optional at the end).\n\n    for (var i = 0; i < buf.length; i++) {\n        if (!inBase64) { // We're in direct mode.\n            // Write direct chars until '&'\n            if (buf[i] == andChar) {\n                res += this.iconv.decode(buf.slice(lastI, i), \"ascii\"); // Write direct chars.\n                lastI = i+1;\n                inBase64 = true;\n            }\n        } else { // We decode base64.\n            if (!base64IMAPChars[buf[i]]) { // Base64 ended.\n                if (i == lastI && buf[i] == minusChar) { // \"&-\" -> \"&\"\n                    res += \"&\";\n                } else {\n                    var b64str = base64Accum + buf.slice(lastI, i).toString().replace(/,/g, '/');\n                    res += this.iconv.decode(Buffer.from(b64str, 'base64'), \"utf16-be\");\n                }\n\n                if (buf[i] != minusChar) // Minus may be absorbed after base64.\n                    i--;\n\n                lastI = i+1;\n                inBase64 = false;\n                base64Accum = '';\n            }\n        }\n    }\n\n    if (!inBase64) {\n        res += this.iconv.decode(buf.slice(lastI), \"ascii\"); // Write direct chars.\n    } else {\n        var b64str = base64Accum + buf.slice(lastI).toString().replace(/,/g, '/');\n\n        var canBeDecoded = b64str.length - (b64str.length % 8); // Minimal chunk: 2 quads -> 2x3 bytes -> 3 chars.\n        base64Accum = b64str.slice(canBeDecoded); // The rest will be decoded in future.\n        b64str = b64str.slice(0, canBeDecoded);\n\n        res += this.iconv.decode(Buffer.from(b64str, 'base64'), \"utf16-be\");\n    }\n\n    this.inBase64 = inBase64;\n    this.base64Accum = base64Accum;\n\n    return res;\n}\n\nUtf7IMAPDecoder.prototype.end = function() {\n    var res = \"\";\n    if (this.inBase64 && this.base64Accum.length > 0)\n        res = this.iconv.decode(Buffer.from(this.base64Accum, 'base64'), \"utf16-be\");\n\n    this.inBase64 = false;\n    this.base64Accum = '';\n    return res;\n}\n\n\n", "\"use strict\";\nvar Buffer = require(\"safer-buffer\").Buffer;\n\n// Single-byte codec. Needs a 'chars' string parameter that contains 256 or 128 chars that\n// correspond to encoded bytes (if 128 - then lower half is ASCII). \n\nexports._sbcs = SBCSCodec;\nfunction SBCSCodec(codecOptions, iconv) {\n    if (!codecOptions)\n        throw new Error(\"SBCS codec is called without the data.\")\n    \n    // Prepare char buffer for decoding.\n    if (!codecOptions.chars || (codecOptions.chars.length !== 128 && codecOptions.chars.length !== 256))\n        throw new Error(\"Encoding '\"+codecOptions.type+\"' has incorrect 'chars' (must be of len 128 or 256)\");\n    \n    if (codecOptions.chars.length === 128) {\n        var asciiString = \"\";\n        for (var i = 0; i < 128; i++)\n            asciiString += String.fromCharCode(i);\n        codecOptions.chars = asciiString + codecOptions.chars;\n    }\n\n    this.decodeBuf = Buffer.from(codecOptions.chars, 'ucs2');\n    \n    // Encoding buffer.\n    var encodeBuf = Buffer.alloc(65536, iconv.defaultCharSingleByte.charCodeAt(0));\n\n    for (var i = 0; i < codecOptions.chars.length; i++)\n        encodeBuf[codecOptions.chars.charCodeAt(i)] = i;\n\n    this.encodeBuf = encodeBuf;\n}\n\nSBCSCodec.prototype.encoder = SBCSEncoder;\nSBCSCodec.prototype.decoder = SBCSDecoder;\n\n\nfunction SBCSEncoder(options, codec) {\n    this.encodeBuf = codec.encodeBuf;\n}\n\nSBCSEncoder.prototype.write = function(str) {\n    var buf = Buffer.alloc(str.length);\n    for (var i = 0; i < str.length; i++)\n        buf[i] = this.encodeBuf[str.charCodeAt(i)];\n    \n    return buf;\n}\n\nSBCSEncoder.prototype.end = function() {\n}\n\n\nfunction SBCSDecoder(options, codec) {\n    this.decodeBuf = codec.decodeBuf;\n}\n\nSBCSDecoder.prototype.write = function(buf) {\n    // Strings are immutable in JS -> we use ucs2 buffer to speed up computations.\n    var decodeBuf = this.decodeBuf;\n    var newBuf = Buffer.alloc(buf.length*2);\n    var idx1 = 0, idx2 = 0;\n    for (var i = 0; i < buf.length; i++) {\n        idx1 = buf[i]*2; idx2 = i*2;\n        newBuf[idx2] = decodeBuf[idx1];\n        newBuf[idx2+1] = decodeBuf[idx1+1];\n    }\n    return newBuf.toString('ucs2');\n}\n\nSBCSDecoder.prototype.end = function() {\n}\n", "\"use strict\";\n\n// Manually added data to be used by sbcs codec in addition to generated one.\n\nmodule.exports = {\n    // Not supported by iconv, not sure why.\n    \"10029\": \"maccenteuro\",\n    \"maccenteuro\": {\n        \"type\": \"_sbcs\",\n        \"chars\": \"\u00C4\u0100\u0101\u00C9\u0104\u00D6\u00DC\u00E1\u0105\u010C\u00E4\u010D\u0106\u0107\u00E9\u0179\u017A\u010E\u00ED\u010F\u0112\u0113\u0116\u00F3\u0117\u00F4\u00F6\u00F5\u00FA\u011A\u011B\u00FC\u2020\u00B0\u0118\u00A3\u00A7\u2022\u00B6\u00DF\u00AE\u00A9\u2122\u0119\u00A8\u2260\u0123\u012E\u012F\u012A\u2264\u2265\u012B\u0136\u2202\u2211\u0142\u013B\u013C\u013D\u013E\u0139\u013A\u0145\u0146\u0143\u00AC\u221A\u0144\u0147\u2206\u00AB\u00BB\u2026\u00A0\u0148\u0150\u00D5\u0151\u014C\u2013\u2014\u201C\u201D\u2018\u2019\u00F7\u25CA\u014D\u0154\u0155\u0158\u2039\u203A\u0159\u0156\u0157\u0160\u201A\u201E\u0161\u015A\u015B\u00C1\u0164\u0165\u00CD\u017D\u017E\u016A\u00D3\u00D4\u016B\u016E\u00DA\u016F\u0170\u0171\u0172\u0173\u00DD\u00FD\u0137\u017B\u0141\u017C\u0122\u02C7\"\n    },\n\n    \"808\": \"cp808\",\n    \"ibm808\": \"cp808\",\n    \"cp808\": {\n        \"type\": \"_sbcs\",\n        \"chars\": \"\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041A\u041B\u041C\u041D\u041E\u041F\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042A\u042B\u042C\u042D\u042E\u042F\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043A\u043B\u043C\u043D\u043E\u043F\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255D\u255C\u255B\u2510\u2514\u2534\u252C\u251C\u2500\u253C\u255E\u255F\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256B\u256A\u2518\u250C\u2588\u2584\u258C\u2590\u2580\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044A\u044B\u044C\u044D\u044E\u044F\u0401\u0451\u0404\u0454\u0407\u0457\u040E\u045E\u00B0\u2219\u00B7\u221A\u2116\u20AC\u25A0\u00A0\"\n    },\n\n    \"mik\": {\n        \"type\": \"_sbcs\",\n        \"chars\": \"\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041A\u041B\u041C\u041D\u041E\u041F\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042A\u042B\u042C\u042D\u042E\u042F\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043A\u043B\u043C\u043D\u043E\u043F\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044A\u044B\u044C\u044D\u044E\u044F\u2514\u2534\u252C\u251C\u2500\u253C\u2563\u2551\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u2510\u2591\u2592\u2593\u2502\u2524\u2116\u00A7\u2557\u255D\u2518\u250C\u2588\u2584\u258C\u2590\u2580\u03B1\u00DF\u0393\u03C0\u03A3\u03C3\u00B5\u03C4\u03A6\u0398\u03A9\u03B4\u221E\u03C6\u03B5\u2229\u2261\u00B1\u2265\u2264\u2320\u2321\u00F7\u2248\u00B0\u2219\u00B7\u221A\u207F\u00B2\u25A0\u00A0\"\n    },\n\n    // Aliases of generated encodings.\n    \"ascii8bit\": \"ascii\",\n    \"usascii\": \"ascii\",\n    \"ansix34\": \"ascii\",\n    \"ansix341968\": \"ascii\",\n    \"ansix341986\": \"ascii\",\n    \"csascii\": \"ascii\",\n    \"cp367\": \"ascii\",\n    \"ibm367\": \"ascii\",\n    \"isoir6\": \"ascii\",\n    \"iso646us\": \"ascii\",\n    \"iso646irv\": \"ascii\",\n    \"us\": \"ascii\",\n\n    \"latin1\": \"iso88591\",\n    \"latin2\": \"iso88592\",\n    \"latin3\": \"iso88593\",\n    \"latin4\": \"iso88594\",\n    \"latin5\": \"iso88599\",\n    \"latin6\": \"iso885910\",\n    \"latin7\": \"iso885913\",\n    \"latin8\": \"iso885914\",\n    \"latin9\": \"iso885915\",\n    \"latin10\": \"iso885916\",\n\n    \"csisolatin1\": \"iso88591\",\n    \"csisolatin2\": \"iso88592\",\n    \"csisolatin3\": \"iso88593\",\n    \"csisolatin4\": \"iso88594\",\n    \"csisolatincyrillic\": \"iso88595\",\n    \"csisolatinarabic\": \"iso88596\",\n    \"csisolatingreek\" : \"iso88597\",\n    \"csisolatinhebrew\": \"iso88598\",\n    \"csisolatin5\": \"iso88599\",\n    \"csisolatin6\": \"iso885910\",\n\n    \"l1\": \"iso88591\",\n    \"l2\": \"iso88592\",\n    \"l3\": \"iso88593\",\n    \"l4\": \"iso88594\",\n    \"l5\": \"iso88599\",\n    \"l6\": \"iso885910\",\n    \"l7\": \"iso885913\",\n    \"l8\": \"iso885914\",\n    \"l9\": \"iso885915\",\n    \"l10\": \"iso885916\",\n\n    \"isoir14\": \"iso646jp\",\n    \"isoir57\": \"iso646cn\",\n    \"isoir100\": \"iso88591\",\n    \"isoir101\": \"iso88592\",\n    \"isoir109\": \"iso88593\",\n    \"isoir110\": \"iso88594\",\n    \"isoir144\": \"iso88595\",\n    \"isoir127\": \"iso88596\",\n    \"isoir126\": \"iso88597\",\n    \"isoir138\": \"iso88598\",\n    \"isoir148\": \"iso88599\",\n    \"isoir157\": \"iso885910\",\n    \"isoir166\": \"tis620\",\n    \"isoir179\": \"iso885913\",\n    \"isoir199\": \"iso885914\",\n    \"isoir203\": \"iso885915\",\n    \"isoir226\": \"iso885916\",\n\n    \"cp819\": \"iso88591\",\n    \"ibm819\": \"iso88591\",\n\n    \"cyrillic\": \"iso88595\",\n\n    \"arabic\": \"iso88596\",\n    \"arabic8\": \"iso88596\",\n    \"ecma114\": \"iso88596\",\n    \"asmo708\": \"iso88596\",\n\n    \"greek\" : \"iso88597\",\n    \"greek8\" : \"iso88597\",\n    \"ecma118\" : \"iso88597\",\n    \"elot928\" : \"iso88597\",\n\n    \"hebrew\": \"iso88598\",\n    \"hebrew8\": \"iso88598\",\n\n    \"turkish\": \"iso88599\",\n    \"turkish8\": \"iso88599\",\n\n    \"thai\": \"iso885911\",\n    \"thai8\": \"iso885911\",\n\n    \"celtic\": \"iso885914\",\n    \"celtic8\": \"iso885914\",\n    \"isoceltic\": \"iso885914\",\n\n    \"tis6200\": \"tis620\",\n    \"tis62025291\": \"tis620\",\n    \"tis62025330\": \"tis620\",\n\n    \"10000\": \"macroman\",\n    \"10006\": \"macgreek\",\n    \"10007\": \"maccyrillic\",\n    \"10079\": \"maciceland\",\n    \"10081\": \"macturkish\",\n\n    \"cspc8codepage437\": \"cp437\",\n    \"cspc775baltic\": \"cp775\",\n    \"cspc850multilingual\": \"cp850\",\n    \"cspcp852\": \"cp852\",\n    \"cspc862latinhebrew\": \"cp862\",\n    \"cpgr\": \"cp869\",\n\n    \"msee\": \"cp1250\",\n    \"mscyrl\": \"cp1251\",\n    \"msansi\": \"cp1252\",\n    \"msgreek\": \"cp1253\",\n    \"msturk\": \"cp1254\",\n    \"mshebr\": \"cp1255\",\n    \"msarab\": \"cp1256\",\n    \"winbaltrim\": \"cp1257\",\n\n    \"cp20866\": \"koi8r\",\n    \"20866\": \"koi8r\",\n    \"ibm878\": \"koi8r\",\n    \"cskoi8r\": \"koi8r\",\n\n    \"cp21866\": \"koi8u\",\n    \"21866\": \"koi8u\",\n    \"ibm1168\": \"koi8u\",\n\n    \"strk10482002\": \"rk1048\",\n\n    \"tcvn5712\": \"tcvn\",\n    \"tcvn57121\": \"tcvn\",\n\n    \"gb198880\": \"iso646cn\",\n    \"cn\": \"iso646cn\",\n\n    \"csiso14jisc6220ro\": \"iso646jp\",\n    \"jisc62201969ro\": \"iso646jp\",\n    \"jp\": \"iso646jp\",\n\n    \"cshproman8\": \"hproman8\",\n    \"r8\": \"hproman8\",\n    \"roman8\": \"hproman8\",\n    \"xroman8\": \"hproman8\",\n    \"ibm1051\": \"hproman8\",\n\n    \"mac\": \"macintosh\",\n    \"csmacintosh\": \"macintosh\",\n};\n\n", "\"use strict\";\n\n// Generated data for sbcs codec. Don't edit manually. Regenerate using generation/gen-sbcs.js script.\nmodule.exports = {\n  \"437\": \"cp437\",\n  \"737\": \"cp737\",\n  \"775\": \"cp775\",\n  \"850\": \"cp850\",\n  \"852\": \"cp852\",\n  \"855\": \"cp855\",\n  \"856\": \"cp856\",\n  \"857\": \"cp857\",\n  \"858\": \"cp858\",\n  \"860\": \"cp860\",\n  \"861\": \"cp861\",\n  \"862\": \"cp862\",\n  \"863\": \"cp863\",\n  \"864\": \"cp864\",\n  \"865\": \"cp865\",\n  \"866\": \"cp866\",\n  \"869\": \"cp869\",\n  \"874\": \"windows874\",\n  \"922\": \"cp922\",\n  \"1046\": \"cp1046\",\n  \"1124\": \"cp1124\",\n  \"1125\": \"cp1125\",\n  \"1129\": \"cp1129\",\n  \"1133\": \"cp1133\",\n  \"1161\": \"cp1161\",\n  \"1162\": \"cp1162\",\n  \"1163\": \"cp1163\",\n  \"1250\": \"windows1250\",\n  \"1251\": \"windows1251\",\n  \"1252\": \"windows1252\",\n  \"1253\": \"windows1253\",\n  \"1254\": \"windows1254\",\n  \"1255\": \"windows1255\",\n  \"1256\": \"windows1256\",\n  \"1257\": \"windows1257\",\n  \"1258\": \"windows1258\",\n  \"28591\": \"iso88591\",\n  \"28592\": \"iso88592\",\n  \"28593\": \"iso88593\",\n  \"28594\": \"iso88594\",\n  \"28595\": \"iso88595\",\n  \"28596\": \"iso88596\",\n  \"28597\": \"iso88597\",\n  \"28598\": \"iso88598\",\n  \"28599\": \"iso88599\",\n  \"28600\": \"iso885910\",\n  \"28601\": \"iso885911\",\n  \"28603\": \"iso885913\",\n  \"28604\": \"iso885914\",\n  \"28605\": \"iso885915\",\n  \"28606\": \"iso885916\",\n  \"windows874\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u20AC\uFFFD\uFFFD\uFFFD\uFFFD\u2026\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u2018\u2019\u201C\u201D\u2022\u2013\u2014\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u00A0\u0E01\u0E02\u0E03\u0E04\u0E05\u0E06\u0E07\u0E08\u0E09\u0E0A\u0E0B\u0E0C\u0E0D\u0E0E\u0E0F\u0E10\u0E11\u0E12\u0E13\u0E14\u0E15\u0E16\u0E17\u0E18\u0E19\u0E1A\u0E1B\u0E1C\u0E1D\u0E1E\u0E1F\u0E20\u0E21\u0E22\u0E23\u0E24\u0E25\u0E26\u0E27\u0E28\u0E29\u0E2A\u0E2B\u0E2C\u0E2D\u0E2E\u0E2F\u0E30\u0E31\u0E32\u0E33\u0E34\u0E35\u0E36\u0E37\u0E38\u0E39\u0E3A\uFFFD\uFFFD\uFFFD\uFFFD\u0E3F\u0E40\u0E41\u0E42\u0E43\u0E44\u0E45\u0E46\u0E47\u0E48\u0E49\u0E4A\u0E4B\u0E4C\u0E4D\u0E4E\u0E4F\u0E50\u0E51\u0E52\u0E53\u0E54\u0E55\u0E56\u0E57\u0E58\u0E59\u0E5A\u0E5B\uFFFD\uFFFD\uFFFD\uFFFD\"\n  },\n  \"win874\": \"windows874\",\n  \"cp874\": \"windows874\",\n  \"windows1250\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u20AC\uFFFD\u201A\uFFFD\u201E\u2026\u2020\u2021\uFFFD\u2030\u0160\u2039\u015A\u0164\u017D\u0179\uFFFD\u2018\u2019\u201C\u201D\u2022\u2013\u2014\uFFFD\u2122\u0161\u203A\u015B\u0165\u017E\u017A\u00A0\u02C7\u02D8\u0141\u00A4\u0104\u00A6\u00A7\u00A8\u00A9\u015E\u00AB\u00AC\u00AD\u00AE\u017B\u00B0\u00B1\u02DB\u0142\u00B4\u00B5\u00B6\u00B7\u00B8\u0105\u015F\u00BB\u013D\u02DD\u013E\u017C\u0154\u00C1\u00C2\u0102\u00C4\u0139\u0106\u00C7\u010C\u00C9\u0118\u00CB\u011A\u00CD\u00CE\u010E\u0110\u0143\u0147\u00D3\u00D4\u0150\u00D6\u00D7\u0158\u016E\u00DA\u0170\u00DC\u00DD\u0162\u00DF\u0155\u00E1\u00E2\u0103\u00E4\u013A\u0107\u00E7\u010D\u00E9\u0119\u00EB\u011B\u00ED\u00EE\u010F\u0111\u0144\u0148\u00F3\u00F4\u0151\u00F6\u00F7\u0159\u016F\u00FA\u0171\u00FC\u00FD\u0163\u02D9\"\n  },\n  \"win1250\": \"windows1250\",\n  \"cp1250\": \"windows1250\",\n  \"windows1251\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0402\u0403\u201A\u0453\u201E\u2026\u2020\u2021\u20AC\u2030\u0409\u2039\u040A\u040C\u040B\u040F\u0452\u2018\u2019\u201C\u201D\u2022\u2013\u2014\uFFFD\u2122\u0459\u203A\u045A\u045C\u045B\u045F\u00A0\u040E\u045E\u0408\u00A4\u0490\u00A6\u00A7\u0401\u00A9\u0404\u00AB\u00AC\u00AD\u00AE\u0407\u00B0\u00B1\u0406\u0456\u0491\u00B5\u00B6\u00B7\u0451\u2116\u0454\u00BB\u0458\u0405\u0455\u0457\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041A\u041B\u041C\u041D\u041E\u041F\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042A\u042B\u042C\u042D\u042E\u042F\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043A\u043B\u043C\u043D\u043E\u043F\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044A\u044B\u044C\u044D\u044E\u044F\"\n  },\n  \"win1251\": \"windows1251\",\n  \"cp1251\": \"windows1251\",\n  \"windows1252\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u20AC\uFFFD\u201A\u0192\u201E\u2026\u2020\u2021\u02C6\u2030\u0160\u2039\u0152\uFFFD\u017D\uFFFD\uFFFD\u2018\u2019\u201C\u201D\u2022\u2013\u2014\u02DC\u2122\u0161\u203A\u0153\uFFFD\u017E\u0178\u00A0\u00A1\u00A2\u00A3\u00A4\u00A5\u00A6\u00A7\u00A8\u00A9\u00AA\u00AB\u00AC\u00AD\u00AE\u00AF\u00B0\u00B1\u00B2\u00B3\u00B4\u00B5\u00B6\u00B7\u00B8\u00B9\u00BA\u00BB\u00BC\u00BD\u00BE\u00BF\u00C0\u00C1\u00C2\u00C3\u00C4\u00C5\u00C6\u00C7\u00C8\u00C9\u00CA\u00CB\u00CC\u00CD\u00CE\u00CF\u00D0\u00D1\u00D2\u00D3\u00D4\u00D5\u00D6\u00D7\u00D8\u00D9\u00DA\u00DB\u00DC\u00DD\u00DE\u00DF\u00E0\u00E1\u00E2\u00E3\u00E4\u00E5\u00E6\u00E7\u00E8\u00E9\u00EA\u00EB\u00EC\u00ED\u00EE\u00EF\u00F0\u00F1\u00F2\u00F3\u00F4\u00F5\u00F6\u00F7\u00F8\u00F9\u00FA\u00FB\u00FC\u00FD\u00FE\u00FF\"\n  },\n  \"win1252\": \"windows1252\",\n  \"cp1252\": \"windows1252\",\n  \"windows1253\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u20AC\uFFFD\u201A\u0192\u201E\u2026\u2020\u2021\uFFFD\u2030\uFFFD\u2039\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u2018\u2019\u201C\u201D\u2022\u2013\u2014\uFFFD\u2122\uFFFD\u203A\uFFFD\uFFFD\uFFFD\uFFFD\u00A0\u0385\u0386\u00A3\u00A4\u00A5\u00A6\u00A7\u00A8\u00A9\uFFFD\u00AB\u00AC\u00AD\u00AE\u2015\u00B0\u00B1\u00B2\u00B3\u0384\u00B5\u00B6\u00B7\u0388\u0389\u038A\u00BB\u038C\u00BD\u038E\u038F\u0390\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039A\u039B\u039C\u039D\u039E\u039F\u03A0\u03A1\uFFFD\u03A3\u03A4\u03A5\u03A6\u03A7\u03A8\u03A9\u03AA\u03AB\u03AC\u03AD\u03AE\u03AF\u03B0\u03B1\u03B2\u03B3\u03B4\u03B5\u03B6\u03B7\u03B8\u03B9\u03BA\u03BB\u03BC\u03BD\u03BE\u03BF\u03C0\u03C1\u03C2\u03C3\u03C4\u03C5\u03C6\u03C7\u03C8\u03C9\u03CA\u03CB\u03CC\u03CD\u03CE\uFFFD\"\n  },\n  \"win1253\": \"windows1253\",\n  \"cp1253\": \"windows1253\",\n  \"windows1254\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u20AC\uFFFD\u201A\u0192\u201E\u2026\u2020\u2021\u02C6\u2030\u0160\u2039\u0152\uFFFD\uFFFD\uFFFD\uFFFD\u2018\u2019\u201C\u201D\u2022\u2013\u2014\u02DC\u2122\u0161\u203A\u0153\uFFFD\uFFFD\u0178\u00A0\u00A1\u00A2\u00A3\u00A4\u00A5\u00A6\u00A7\u00A8\u00A9\u00AA\u00AB\u00AC\u00AD\u00AE\u00AF\u00B0\u00B1\u00B2\u00B3\u00B4\u00B5\u00B6\u00B7\u00B8\u00B9\u00BA\u00BB\u00BC\u00BD\u00BE\u00BF\u00C0\u00C1\u00C2\u00C3\u00C4\u00C5\u00C6\u00C7\u00C8\u00C9\u00CA\u00CB\u00CC\u00CD\u00CE\u00CF\u011E\u00D1\u00D2\u00D3\u00D4\u00D5\u00D6\u00D7\u00D8\u00D9\u00DA\u00DB\u00DC\u0130\u015E\u00DF\u00E0\u00E1\u00E2\u00E3\u00E4\u00E5\u00E6\u00E7\u00E8\u00E9\u00EA\u00EB\u00EC\u00ED\u00EE\u00EF\u011F\u00F1\u00F2\u00F3\u00F4\u00F5\u00F6\u00F7\u00F8\u00F9\u00FA\u00FB\u00FC\u0131\u015F\u00FF\"\n  },\n  \"win1254\": \"windows1254\",\n  \"cp1254\": \"windows1254\",\n  \"windows1255\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u20AC\uFFFD\u201A\u0192\u201E\u2026\u2020\u2021\u02C6\u2030\uFFFD\u2039\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u2018\u2019\u201C\u201D\u2022\u2013\u2014\u02DC\u2122\uFFFD\u203A\uFFFD\uFFFD\uFFFD\uFFFD\u00A0\u00A1\u00A2\u00A3\u20AA\u00A5\u00A6\u00A7\u00A8\u00A9\u00D7\u00AB\u00AC\u00AD\u00AE\u00AF\u00B0\u00B1\u00B2\u00B3\u00B4\u00B5\u00B6\u00B7\u00B8\u00B9\u00F7\u00BB\u00BC\u00BD\u00BE\u00BF\u05B0\u05B1\u05B2\u05B3\u05B4\u05B5\u05B6\u05B7\u05B8\u05B9\u05BA\u05BB\u05BC\u05BD\u05BE\u05BF\u05C0\u05C1\u05C2\u05C3\u05F0\u05F1\u05F2\u05F3\u05F4\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5\u05D6\u05D7\u05D8\u05D9\u05DA\u05DB\u05DC\u05DD\u05DE\u05DF\u05E0\u05E1\u05E2\u05E3\u05E4\u05E5\u05E6\u05E7\u05E8\u05E9\u05EA\uFFFD\uFFFD\u200E\u200F\uFFFD\"\n  },\n  \"win1255\": \"windows1255\",\n  \"cp1255\": \"windows1255\",\n  \"windows1256\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u20AC\u067E\u201A\u0192\u201E\u2026\u2020\u2021\u02C6\u2030\u0679\u2039\u0152\u0686\u0698\u0688\u06AF\u2018\u2019\u201C\u201D\u2022\u2013\u2014\u06A9\u2122\u0691\u203A\u0153\u200C\u200D\u06BA\u00A0\u060C\u00A2\u00A3\u00A4\u00A5\u00A6\u00A7\u00A8\u00A9\u06BE\u00AB\u00AC\u00AD\u00AE\u00AF\u00B0\u00B1\u00B2\u00B3\u00B4\u00B5\u00B6\u00B7\u00B8\u00B9\u061B\u00BB\u00BC\u00BD\u00BE\u061F\u06C1\u0621\u0622\u0623\u0624\u0625\u0626\u0627\u0628\u0629\u062A\u062B\u062C\u062D\u062E\u062F\u0630\u0631\u0632\u0633\u0634\u0635\u0636\u00D7\u0637\u0638\u0639\u063A\u0640\u0641\u0642\u0643\u00E0\u0644\u00E2\u0645\u0646\u0647\u0648\u00E7\u00E8\u00E9\u00EA\u00EB\u0649\u064A\u00EE\u00EF\u064B\u064C\u064D\u064E\u00F4\u064F\u0650\u00F7\u0651\u00F9\u0652\u00FB\u00FC\u200E\u200F\u06D2\"\n  },\n  \"win1256\": \"windows1256\",\n  \"cp1256\": \"windows1256\",\n  \"windows1257\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u20AC\uFFFD\u201A\uFFFD\u201E\u2026\u2020\u2021\uFFFD\u2030\uFFFD\u2039\uFFFD\u00A8\u02C7\u00B8\uFFFD\u2018\u2019\u201C\u201D\u2022\u2013\u2014\uFFFD\u2122\uFFFD\u203A\uFFFD\u00AF\u02DB\uFFFD\u00A0\uFFFD\u00A2\u00A3\u00A4\uFFFD\u00A6\u00A7\u00D8\u00A9\u0156\u00AB\u00AC\u00AD\u00AE\u00C6\u00B0\u00B1\u00B2\u00B3\u00B4\u00B5\u00B6\u00B7\u00F8\u00B9\u0157\u00BB\u00BC\u00BD\u00BE\u00E6\u0104\u012E\u0100\u0106\u00C4\u00C5\u0118\u0112\u010C\u00C9\u0179\u0116\u0122\u0136\u012A\u013B\u0160\u0143\u0145\u00D3\u014C\u00D5\u00D6\u00D7\u0172\u0141\u015A\u016A\u00DC\u017B\u017D\u00DF\u0105\u012F\u0101\u0107\u00E4\u00E5\u0119\u0113\u010D\u00E9\u017A\u0117\u0123\u0137\u012B\u013C\u0161\u0144\u0146\u00F3\u014D\u00F5\u00F6\u00F7\u0173\u0142\u015B\u016B\u00FC\u017C\u017E\u02D9\"\n  },\n  \"win1257\": \"windows1257\",\n  \"cp1257\": \"windows1257\",\n  \"windows1258\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u20AC\uFFFD\u201A\u0192\u201E\u2026\u2020\u2021\u02C6\u2030\uFFFD\u2039\u0152\uFFFD\uFFFD\uFFFD\uFFFD\u2018\u2019\u201C\u201D\u2022\u2013\u2014\u02DC\u2122\uFFFD\u203A\u0153\uFFFD\uFFFD\u0178\u00A0\u00A1\u00A2\u00A3\u00A4\u00A5\u00A6\u00A7\u00A8\u00A9\u00AA\u00AB\u00AC\u00AD\u00AE\u00AF\u00B0\u00B1\u00B2\u00B3\u00B4\u00B5\u00B6\u00B7\u00B8\u00B9\u00BA\u00BB\u00BC\u00BD\u00BE\u00BF\u00C0\u00C1\u00C2\u0102\u00C4\u00C5\u00C6\u00C7\u00C8\u00C9\u00CA\u00CB\u0300\u00CD\u00CE\u00CF\u0110\u00D1\u0309\u00D3\u00D4\u01A0\u00D6\u00D7\u00D8\u00D9\u00DA\u00DB\u00DC\u01AF\u0303\u00DF\u00E0\u00E1\u00E2\u0103\u00E4\u00E5\u00E6\u00E7\u00E8\u00E9\u00EA\u00EB\u0301\u00ED\u00EE\u00EF\u0111\u00F1\u0323\u00F3\u00F4\u01A1\u00F6\u00F7\u00F8\u00F9\u00FA\u00FB\u00FC\u01B0\u20AB\u00FF\"\n  },\n  \"win1258\": \"windows1258\",\n  \"cp1258\": \"windows1258\",\n  \"iso88591\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F\u00A0\u00A1\u00A2\u00A3\u00A4\u00A5\u00A6\u00A7\u00A8\u00A9\u00AA\u00AB\u00AC\u00AD\u00AE\u00AF\u00B0\u00B1\u00B2\u00B3\u00B4\u00B5\u00B6\u00B7\u00B8\u00B9\u00BA\u00BB\u00BC\u00BD\u00BE\u00BF\u00C0\u00C1\u00C2\u00C3\u00C4\u00C5\u00C6\u00C7\u00C8\u00C9\u00CA\u00CB\u00CC\u00CD\u00CE\u00CF\u00D0\u00D1\u00D2\u00D3\u00D4\u00D5\u00D6\u00D7\u00D8\u00D9\u00DA\u00DB\u00DC\u00DD\u00DE\u00DF\u00E0\u00E1\u00E2\u00E3\u00E4\u00E5\u00E6\u00E7\u00E8\u00E9\u00EA\u00EB\u00EC\u00ED\u00EE\u00EF\u00F0\u00F1\u00F2\u00F3\u00F4\u00F5\u00F6\u00F7\u00F8\u00F9\u00FA\u00FB\u00FC\u00FD\u00FE\u00FF\"\n  },\n  \"cp28591\": \"iso88591\",\n  \"iso88592\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F\u00A0\u0104\u02D8\u0141\u00A4\u013D\u015A\u00A7\u00A8\u0160\u015E\u0164\u0179\u00AD\u017D\u017B\u00B0\u0105\u02DB\u0142\u00B4\u013E\u015B\u02C7\u00B8\u0161\u015F\u0165\u017A\u02DD\u017E\u017C\u0154\u00C1\u00C2\u0102\u00C4\u0139\u0106\u00C7\u010C\u00C9\u0118\u00CB\u011A\u00CD\u00CE\u010E\u0110\u0143\u0147\u00D3\u00D4\u0150\u00D6\u00D7\u0158\u016E\u00DA\u0170\u00DC\u00DD\u0162\u00DF\u0155\u00E1\u00E2\u0103\u00E4\u013A\u0107\u00E7\u010D\u00E9\u0119\u00EB\u011B\u00ED\u00EE\u010F\u0111\u0144\u0148\u00F3\u00F4\u0151\u00F6\u00F7\u0159\u016F\u00FA\u0171\u00FC\u00FD\u0163\u02D9\"\n  },\n  \"cp28592\": \"iso88592\",\n  \"iso88593\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F\u00A0\u0126\u02D8\u00A3\u00A4\uFFFD\u0124\u00A7\u00A8\u0130\u015E\u011E\u0134\u00AD\uFFFD\u017B\u00B0\u0127\u00B2\u00B3\u00B4\u00B5\u0125\u00B7\u00B8\u0131\u015F\u011F\u0135\u00BD\uFFFD\u017C\u00C0\u00C1\u00C2\uFFFD\u00C4\u010A\u0108\u00C7\u00C8\u00C9\u00CA\u00CB\u00CC\u00CD\u00CE\u00CF\uFFFD\u00D1\u00D2\u00D3\u00D4\u0120\u00D6\u00D7\u011C\u00D9\u00DA\u00DB\u00DC\u016C\u015C\u00DF\u00E0\u00E1\u00E2\uFFFD\u00E4\u010B\u0109\u00E7\u00E8\u00E9\u00EA\u00EB\u00EC\u00ED\u00EE\u00EF\uFFFD\u00F1\u00F2\u00F3\u00F4\u0121\u00F6\u00F7\u011D\u00F9\u00FA\u00FB\u00FC\u016D\u015D\u02D9\"\n  },\n  \"cp28593\": \"iso88593\",\n  \"iso88594\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F\u00A0\u0104\u0138\u0156\u00A4\u0128\u013B\u00A7\u00A8\u0160\u0112\u0122\u0166\u00AD\u017D\u00AF\u00B0\u0105\u02DB\u0157\u00B4\u0129\u013C\u02C7\u00B8\u0161\u0113\u0123\u0167\u014A\u017E\u014B\u0100\u00C1\u00C2\u00C3\u00C4\u00C5\u00C6\u012E\u010C\u00C9\u0118\u00CB\u0116\u00CD\u00CE\u012A\u0110\u0145\u014C\u0136\u00D4\u00D5\u00D6\u00D7\u00D8\u0172\u00DA\u00DB\u00DC\u0168\u016A\u00DF\u0101\u00E1\u00E2\u00E3\u00E4\u00E5\u00E6\u012F\u010D\u00E9\u0119\u00EB\u0117\u00ED\u00EE\u012B\u0111\u0146\u014D\u0137\u00F4\u00F5\u00F6\u00F7\u00F8\u0173\u00FA\u00FB\u00FC\u0169\u016B\u02D9\"\n  },\n  \"cp28594\": \"iso88594\",\n  \"iso88595\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F\u00A0\u0401\u0402\u0403\u0404\u0405\u0406\u0407\u0408\u0409\u040A\u040B\u040C\u00AD\u040E\u040F\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041A\u041B\u041C\u041D\u041E\u041F\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042A\u042B\u042C\u042D\u042E\u042F\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043A\u043B\u043C\u043D\u043E\u043F\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044A\u044B\u044C\u044D\u044E\u044F\u2116\u0451\u0452\u0453\u0454\u0455\u0456\u0457\u0458\u0459\u045A\u045B\u045C\u00A7\u045E\u045F\"\n  },\n  \"cp28595\": \"iso88595\",\n  \"iso88596\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F\u00A0\uFFFD\uFFFD\uFFFD\u00A4\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u060C\u00AD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u061B\uFFFD\uFFFD\uFFFD\u061F\uFFFD\u0621\u0622\u0623\u0624\u0625\u0626\u0627\u0628\u0629\u062A\u062B\u062C\u062D\u062E\u062F\u0630\u0631\u0632\u0633\u0634\u0635\u0636\u0637\u0638\u0639\u063A\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u0640\u0641\u0642\u0643\u0644\u0645\u0646\u0647\u0648\u0649\u064A\u064B\u064C\u064D\u064E\u064F\u0650\u0651\u0652\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\"\n  },\n  \"cp28596\": \"iso88596\",\n  \"iso88597\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F\u00A0\u2018\u2019\u00A3\u20AC\u20AF\u00A6\u00A7\u00A8\u00A9\u037A\u00AB\u00AC\u00AD\uFFFD\u2015\u00B0\u00B1\u00B2\u00B3\u0384\u0385\u0386\u00B7\u0388\u0389\u038A\u00BB\u038C\u00BD\u038E\u038F\u0390\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039A\u039B\u039C\u039D\u039E\u039F\u03A0\u03A1\uFFFD\u03A3\u03A4\u03A5\u03A6\u03A7\u03A8\u03A9\u03AA\u03AB\u03AC\u03AD\u03AE\u03AF\u03B0\u03B1\u03B2\u03B3\u03B4\u03B5\u03B6\u03B7\u03B8\u03B9\u03BA\u03BB\u03BC\u03BD\u03BE\u03BF\u03C0\u03C1\u03C2\u03C3\u03C4\u03C5\u03C6\u03C7\u03C8\u03C9\u03CA\u03CB\u03CC\u03CD\u03CE\uFFFD\"\n  },\n  \"cp28597\": \"iso88597\",\n  \"iso88598\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F\u00A0\uFFFD\u00A2\u00A3\u00A4\u00A5\u00A6\u00A7\u00A8\u00A9\u00D7\u00AB\u00AC\u00AD\u00AE\u00AF\u00B0\u00B1\u00B2\u00B3\u00B4\u00B5\u00B6\u00B7\u00B8\u00B9\u00F7\u00BB\u00BC\u00BD\u00BE\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u2017\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5\u05D6\u05D7\u05D8\u05D9\u05DA\u05DB\u05DC\u05DD\u05DE\u05DF\u05E0\u05E1\u05E2\u05E3\u05E4\u05E5\u05E6\u05E7\u05E8\u05E9\u05EA\uFFFD\uFFFD\u200E\u200F\uFFFD\"\n  },\n  \"cp28598\": \"iso88598\",\n  \"iso88599\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F\u00A0\u00A1\u00A2\u00A3\u00A4\u00A5\u00A6\u00A7\u00A8\u00A9\u00AA\u00AB\u00AC\u00AD\u00AE\u00AF\u00B0\u00B1\u00B2\u00B3\u00B4\u00B5\u00B6\u00B7\u00B8\u00B9\u00BA\u00BB\u00BC\u00BD\u00BE\u00BF\u00C0\u00C1\u00C2\u00C3\u00C4\u00C5\u00C6\u00C7\u00C8\u00C9\u00CA\u00CB\u00CC\u00CD\u00CE\u00CF\u011E\u00D1\u00D2\u00D3\u00D4\u00D5\u00D6\u00D7\u00D8\u00D9\u00DA\u00DB\u00DC\u0130\u015E\u00DF\u00E0\u00E1\u00E2\u00E3\u00E4\u00E5\u00E6\u00E7\u00E8\u00E9\u00EA\u00EB\u00EC\u00ED\u00EE\u00EF\u011F\u00F1\u00F2\u00F3\u00F4\u00F5\u00F6\u00F7\u00F8\u00F9\u00FA\u00FB\u00FC\u0131\u015F\u00FF\"\n  },\n  \"cp28599\": \"iso88599\",\n  \"iso885910\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F\u00A0\u0104\u0112\u0122\u012A\u0128\u0136\u00A7\u013B\u0110\u0160\u0166\u017D\u00AD\u016A\u014A\u00B0\u0105\u0113\u0123\u012B\u0129\u0137\u00B7\u013C\u0111\u0161\u0167\u017E\u2015\u016B\u014B\u0100\u00C1\u00C2\u00C3\u00C4\u00C5\u00C6\u012E\u010C\u00C9\u0118\u00CB\u0116\u00CD\u00CE\u00CF\u00D0\u0145\u014C\u00D3\u00D4\u00D5\u00D6\u0168\u00D8\u0172\u00DA\u00DB\u00DC\u00DD\u00DE\u00DF\u0101\u00E1\u00E2\u00E3\u00E4\u00E5\u00E6\u012F\u010D\u00E9\u0119\u00EB\u0117\u00ED\u00EE\u00EF\u00F0\u0146\u014D\u00F3\u00F4\u00F5\u00F6\u0169\u00F8\u0173\u00FA\u00FB\u00FC\u00FD\u00FE\u0138\"\n  },\n  \"cp28600\": \"iso885910\",\n  \"iso885911\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F\u00A0\u0E01\u0E02\u0E03\u0E04\u0E05\u0E06\u0E07\u0E08\u0E09\u0E0A\u0E0B\u0E0C\u0E0D\u0E0E\u0E0F\u0E10\u0E11\u0E12\u0E13\u0E14\u0E15\u0E16\u0E17\u0E18\u0E19\u0E1A\u0E1B\u0E1C\u0E1D\u0E1E\u0E1F\u0E20\u0E21\u0E22\u0E23\u0E24\u0E25\u0E26\u0E27\u0E28\u0E29\u0E2A\u0E2B\u0E2C\u0E2D\u0E2E\u0E2F\u0E30\u0E31\u0E32\u0E33\u0E34\u0E35\u0E36\u0E37\u0E38\u0E39\u0E3A\uFFFD\uFFFD\uFFFD\uFFFD\u0E3F\u0E40\u0E41\u0E42\u0E43\u0E44\u0E45\u0E46\u0E47\u0E48\u0E49\u0E4A\u0E4B\u0E4C\u0E4D\u0E4E\u0E4F\u0E50\u0E51\u0E52\u0E53\u0E54\u0E55\u0E56\u0E57\u0E58\u0E59\u0E5A\u0E5B\uFFFD\uFFFD\uFFFD\uFFFD\"\n  },\n  \"cp28601\": \"iso885911\",\n  \"iso885913\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F\u00A0\u201D\u00A2\u00A3\u00A4\u201E\u00A6\u00A7\u00D8\u00A9\u0156\u00AB\u00AC\u00AD\u00AE\u00C6\u00B0\u00B1\u00B2\u00B3\u201C\u00B5\u00B6\u00B7\u00F8\u00B9\u0157\u00BB\u00BC\u00BD\u00BE\u00E6\u0104\u012E\u0100\u0106\u00C4\u00C5\u0118\u0112\u010C\u00C9\u0179\u0116\u0122\u0136\u012A\u013B\u0160\u0143\u0145\u00D3\u014C\u00D5\u00D6\u00D7\u0172\u0141\u015A\u016A\u00DC\u017B\u017D\u00DF\u0105\u012F\u0101\u0107\u00E4\u00E5\u0119\u0113\u010D\u00E9\u017A\u0117\u0123\u0137\u012B\u013C\u0161\u0144\u0146\u00F3\u014D\u00F5\u00F6\u00F7\u0173\u0142\u015B\u016B\u00FC\u017C\u017E\u2019\"\n  },\n  \"cp28603\": \"iso885913\",\n  \"iso885914\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F\u00A0\u1E02\u1E03\u00A3\u010A\u010B\u1E0A\u00A7\u1E80\u00A9\u1E82\u1E0B\u1EF2\u00AD\u00AE\u0178\u1E1E\u1E1F\u0120\u0121\u1E40\u1E41\u00B6\u1E56\u1E81\u1E57\u1E83\u1E60\u1EF3\u1E84\u1E85\u1E61\u00C0\u00C1\u00C2\u00C3\u00C4\u00C5\u00C6\u00C7\u00C8\u00C9\u00CA\u00CB\u00CC\u00CD\u00CE\u00CF\u0174\u00D1\u00D2\u00D3\u00D4\u00D5\u00D6\u1E6A\u00D8\u00D9\u00DA\u00DB\u00DC\u00DD\u0176\u00DF\u00E0\u00E1\u00E2\u00E3\u00E4\u00E5\u00E6\u00E7\u00E8\u00E9\u00EA\u00EB\u00EC\u00ED\u00EE\u00EF\u0175\u00F1\u00F2\u00F3\u00F4\u00F5\u00F6\u1E6B\u00F8\u00F9\u00FA\u00FB\u00FC\u00FD\u0177\u00FF\"\n  },\n  \"cp28604\": \"iso885914\",\n  \"iso885915\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F\u00A0\u00A1\u00A2\u00A3\u20AC\u00A5\u0160\u00A7\u0161\u00A9\u00AA\u00AB\u00AC\u00AD\u00AE\u00AF\u00B0\u00B1\u00B2\u00B3\u017D\u00B5\u00B6\u00B7\u017E\u00B9\u00BA\u00BB\u0152\u0153\u0178\u00BF\u00C0\u00C1\u00C2\u00C3\u00C4\u00C5\u00C6\u00C7\u00C8\u00C9\u00CA\u00CB\u00CC\u00CD\u00CE\u00CF\u00D0\u00D1\u00D2\u00D3\u00D4\u00D5\u00D6\u00D7\u00D8\u00D9\u00DA\u00DB\u00DC\u00DD\u00DE\u00DF\u00E0\u00E1\u00E2\u00E3\u00E4\u00E5\u00E6\u00E7\u00E8\u00E9\u00EA\u00EB\u00EC\u00ED\u00EE\u00EF\u00F0\u00F1\u00F2\u00F3\u00F4\u00F5\u00F6\u00F7\u00F8\u00F9\u00FA\u00FB\u00FC\u00FD\u00FE\u00FF\"\n  },\n  \"cp28605\": \"iso885915\",\n  \"iso885916\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F\u00A0\u0104\u0105\u0141\u20AC\u201E\u0160\u00A7\u0161\u00A9\u0218\u00AB\u0179\u00AD\u017A\u017B\u00B0\u00B1\u010C\u0142\u017D\u201D\u00B6\u00B7\u017E\u010D\u0219\u00BB\u0152\u0153\u0178\u017C\u00C0\u00C1\u00C2\u0102\u00C4\u0106\u00C6\u00C7\u00C8\u00C9\u00CA\u00CB\u00CC\u00CD\u00CE\u00CF\u0110\u0143\u00D2\u00D3\u00D4\u0150\u00D6\u015A\u0170\u00D9\u00DA\u00DB\u00DC\u0118\u021A\u00DF\u00E0\u00E1\u00E2\u0103\u00E4\u0107\u00E6\u00E7\u00E8\u00E9\u00EA\u00EB\u00EC\u00ED\u00EE\u00EF\u0111\u0144\u00F2\u00F3\u00F4\u0151\u00F6\u015B\u0171\u00F9\u00FA\u00FB\u00FC\u0119\u021B\u00FF\"\n  },\n  \"cp28606\": \"iso885916\",\n  \"cp437\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u00C7\u00FC\u00E9\u00E2\u00E4\u00E0\u00E5\u00E7\u00EA\u00EB\u00E8\u00EF\u00EE\u00EC\u00C4\u00C5\u00C9\u00E6\u00C6\u00F4\u00F6\u00F2\u00FB\u00F9\u00FF\u00D6\u00DC\u00A2\u00A3\u00A5\u20A7\u0192\u00E1\u00ED\u00F3\u00FA\u00F1\u00D1\u00AA\u00BA\u00BF\u2310\u00AC\u00BD\u00BC\u00A1\u00AB\u00BB\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255D\u255C\u255B\u2510\u2514\u2534\u252C\u251C\u2500\u253C\u255E\u255F\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256B\u256A\u2518\u250C\u2588\u2584\u258C\u2590\u2580\u03B1\u00DF\u0393\u03C0\u03A3\u03C3\u00B5\u03C4\u03A6\u0398\u03A9\u03B4\u221E\u03C6\u03B5\u2229\u2261\u00B1\u2265\u2264\u2320\u2321\u00F7\u2248\u00B0\u2219\u00B7\u221A\u207F\u00B2\u25A0\u00A0\"\n  },\n  \"ibm437\": \"cp437\",\n  \"csibm437\": \"cp437\",\n  \"cp737\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039A\u039B\u039C\u039D\u039E\u039F\u03A0\u03A1\u03A3\u03A4\u03A5\u03A6\u03A7\u03A8\u03A9\u03B1\u03B2\u03B3\u03B4\u03B5\u03B6\u03B7\u03B8\u03B9\u03BA\u03BB\u03BC\u03BD\u03BE\u03BF\u03C0\u03C1\u03C3\u03C2\u03C4\u03C5\u03C6\u03C7\u03C8\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255D\u255C\u255B\u2510\u2514\u2534\u252C\u251C\u2500\u253C\u255E\u255F\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256B\u256A\u2518\u250C\u2588\u2584\u258C\u2590\u2580\u03C9\u03AC\u03AD\u03AE\u03CA\u03AF\u03CC\u03CD\u03CB\u03CE\u0386\u0388\u0389\u038A\u038C\u038E\u038F\u00B1\u2265\u2264\u03AA\u03AB\u00F7\u2248\u00B0\u2219\u00B7\u221A\u207F\u00B2\u25A0\u00A0\"\n  },\n  \"ibm737\": \"cp737\",\n  \"csibm737\": \"cp737\",\n  \"cp775\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0106\u00FC\u00E9\u0101\u00E4\u0123\u00E5\u0107\u0142\u0113\u0156\u0157\u012B\u0179\u00C4\u00C5\u00C9\u00E6\u00C6\u014D\u00F6\u0122\u00A2\u015A\u015B\u00D6\u00DC\u00F8\u00A3\u00D8\u00D7\u00A4\u0100\u012A\u00F3\u017B\u017C\u017A\u201D\u00A6\u00A9\u00AE\u00AC\u00BD\u00BC\u0141\u00AB\u00BB\u2591\u2592\u2593\u2502\u2524\u0104\u010C\u0118\u0116\u2563\u2551\u2557\u255D\u012E\u0160\u2510\u2514\u2534\u252C\u251C\u2500\u253C\u0172\u016A\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u017D\u0105\u010D\u0119\u0117\u012F\u0161\u0173\u016B\u017E\u2518\u250C\u2588\u2584\u258C\u2590\u2580\u00D3\u00DF\u014C\u0143\u00F5\u00D5\u00B5\u0144\u0136\u0137\u013B\u013C\u0146\u0112\u0145\u2019\u00AD\u00B1\u201C\u00BE\u00B6\u00A7\u00F7\u201E\u00B0\u2219\u00B7\u00B9\u00B3\u00B2\u25A0\u00A0\"\n  },\n  \"ibm775\": \"cp775\",\n  \"csibm775\": \"cp775\",\n  \"cp850\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u00C7\u00FC\u00E9\u00E2\u00E4\u00E0\u00E5\u00E7\u00EA\u00EB\u00E8\u00EF\u00EE\u00EC\u00C4\u00C5\u00C9\u00E6\u00C6\u00F4\u00F6\u00F2\u00FB\u00F9\u00FF\u00D6\u00DC\u00F8\u00A3\u00D8\u00D7\u0192\u00E1\u00ED\u00F3\u00FA\u00F1\u00D1\u00AA\u00BA\u00BF\u00AE\u00AC\u00BD\u00BC\u00A1\u00AB\u00BB\u2591\u2592\u2593\u2502\u2524\u00C1\u00C2\u00C0\u00A9\u2563\u2551\u2557\u255D\u00A2\u00A5\u2510\u2514\u2534\u252C\u251C\u2500\u253C\u00E3\u00C3\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u00A4\u00F0\u00D0\u00CA\u00CB\u00C8\u0131\u00CD\u00CE\u00CF\u2518\u250C\u2588\u2584\u00A6\u00CC\u2580\u00D3\u00DF\u00D4\u00D2\u00F5\u00D5\u00B5\u00FE\u00DE\u00DA\u00DB\u00D9\u00FD\u00DD\u00AF\u00B4\u00AD\u00B1\u2017\u00BE\u00B6\u00A7\u00F7\u00B8\u00B0\u00A8\u00B7\u00B9\u00B3\u00B2\u25A0\u00A0\"\n  },\n  \"ibm850\": \"cp850\",\n  \"csibm850\": \"cp850\",\n  \"cp852\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u00C7\u00FC\u00E9\u00E2\u00E4\u016F\u0107\u00E7\u0142\u00EB\u0150\u0151\u00EE\u0179\u00C4\u0106\u00C9\u0139\u013A\u00F4\u00F6\u013D\u013E\u015A\u015B\u00D6\u00DC\u0164\u0165\u0141\u00D7\u010D\u00E1\u00ED\u00F3\u00FA\u0104\u0105\u017D\u017E\u0118\u0119\u00AC\u017A\u010C\u015F\u00AB\u00BB\u2591\u2592\u2593\u2502\u2524\u00C1\u00C2\u011A\u015E\u2563\u2551\u2557\u255D\u017B\u017C\u2510\u2514\u2534\u252C\u251C\u2500\u253C\u0102\u0103\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u00A4\u0111\u0110\u010E\u00CB\u010F\u0147\u00CD\u00CE\u011B\u2518\u250C\u2588\u2584\u0162\u016E\u2580\u00D3\u00DF\u00D4\u0143\u0144\u0148\u0160\u0161\u0154\u00DA\u0155\u0170\u00FD\u00DD\u0163\u00B4\u00AD\u02DD\u02DB\u02C7\u02D8\u00A7\u00F7\u00B8\u00B0\u00A8\u02D9\u0171\u0158\u0159\u25A0\u00A0\"\n  },\n  \"ibm852\": \"cp852\",\n  \"csibm852\": \"cp852\",\n  \"cp855\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0452\u0402\u0453\u0403\u0451\u0401\u0454\u0404\u0455\u0405\u0456\u0406\u0457\u0407\u0458\u0408\u0459\u0409\u045A\u040A\u045B\u040B\u045C\u040C\u045E\u040E\u045F\u040F\u044E\u042E\u044A\u042A\u0430\u0410\u0431\u0411\u0446\u0426\u0434\u0414\u0435\u0415\u0444\u0424\u0433\u0413\u00AB\u00BB\u2591\u2592\u2593\u2502\u2524\u0445\u0425\u0438\u0418\u2563\u2551\u2557\u255D\u0439\u0419\u2510\u2514\u2534\u252C\u251C\u2500\u253C\u043A\u041A\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u00A4\u043B\u041B\u043C\u041C\u043D\u041D\u043E\u041E\u043F\u2518\u250C\u2588\u2584\u041F\u044F\u2580\u042F\u0440\u0420\u0441\u0421\u0442\u0422\u0443\u0423\u0436\u0416\u0432\u0412\u044C\u042C\u2116\u00AD\u044B\u042B\u0437\u0417\u0448\u0428\u044D\u042D\u0449\u0429\u0447\u0427\u00A7\u25A0\u00A0\"\n  },\n  \"ibm855\": \"cp855\",\n  \"csibm855\": \"cp855\",\n  \"cp856\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5\u05D6\u05D7\u05D8\u05D9\u05DA\u05DB\u05DC\u05DD\u05DE\u05DF\u05E0\u05E1\u05E2\u05E3\u05E4\u05E5\u05E6\u05E7\u05E8\u05E9\u05EA\uFFFD\u00A3\uFFFD\u00D7\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u00AE\u00AC\u00BD\u00BC\uFFFD\u00AB\u00BB\u2591\u2592\u2593\u2502\u2524\uFFFD\uFFFD\uFFFD\u00A9\u2563\u2551\u2557\u255D\u00A2\u00A5\u2510\u2514\u2534\u252C\u251C\u2500\u253C\uFFFD\uFFFD\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u00A4\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u2518\u250C\u2588\u2584\u00A6\uFFFD\u2580\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u00B5\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u00AF\u00B4\u00AD\u00B1\u2017\u00BE\u00B6\u00A7\u00F7\u00B8\u00B0\u00A8\u00B7\u00B9\u00B3\u00B2\u25A0\u00A0\"\n  },\n  \"ibm856\": \"cp856\",\n  \"csibm856\": \"cp856\",\n  \"cp857\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u00C7\u00FC\u00E9\u00E2\u00E4\u00E0\u00E5\u00E7\u00EA\u00EB\u00E8\u00EF\u00EE\u0131\u00C4\u00C5\u00C9\u00E6\u00C6\u00F4\u00F6\u00F2\u00FB\u00F9\u0130\u00D6\u00DC\u00F8\u00A3\u00D8\u015E\u015F\u00E1\u00ED\u00F3\u00FA\u00F1\u00D1\u011E\u011F\u00BF\u00AE\u00AC\u00BD\u00BC\u00A1\u00AB\u00BB\u2591\u2592\u2593\u2502\u2524\u00C1\u00C2\u00C0\u00A9\u2563\u2551\u2557\u255D\u00A2\u00A5\u2510\u2514\u2534\u252C\u251C\u2500\u253C\u00E3\u00C3\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u00A4\u00BA\u00AA\u00CA\u00CB\u00C8\uFFFD\u00CD\u00CE\u00CF\u2518\u250C\u2588\u2584\u00A6\u00CC\u2580\u00D3\u00DF\u00D4\u00D2\u00F5\u00D5\u00B5\uFFFD\u00D7\u00DA\u00DB\u00D9\u00EC\u00FF\u00AF\u00B4\u00AD\u00B1\uFFFD\u00BE\u00B6\u00A7\u00F7\u00B8\u00B0\u00A8\u00B7\u00B9\u00B3\u00B2\u25A0\u00A0\"\n  },\n  \"ibm857\": \"cp857\",\n  \"csibm857\": \"cp857\",\n  \"cp858\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u00C7\u00FC\u00E9\u00E2\u00E4\u00E0\u00E5\u00E7\u00EA\u00EB\u00E8\u00EF\u00EE\u00EC\u00C4\u00C5\u00C9\u00E6\u00C6\u00F4\u00F6\u00F2\u00FB\u00F9\u00FF\u00D6\u00DC\u00F8\u00A3\u00D8\u00D7\u0192\u00E1\u00ED\u00F3\u00FA\u00F1\u00D1\u00AA\u00BA\u00BF\u00AE\u00AC\u00BD\u00BC\u00A1\u00AB\u00BB\u2591\u2592\u2593\u2502\u2524\u00C1\u00C2\u00C0\u00A9\u2563\u2551\u2557\u255D\u00A2\u00A5\u2510\u2514\u2534\u252C\u251C\u2500\u253C\u00E3\u00C3\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u00A4\u00F0\u00D0\u00CA\u00CB\u00C8\u20AC\u00CD\u00CE\u00CF\u2518\u250C\u2588\u2584\u00A6\u00CC\u2580\u00D3\u00DF\u00D4\u00D2\u00F5\u00D5\u00B5\u00FE\u00DE\u00DA\u00DB\u00D9\u00FD\u00DD\u00AF\u00B4\u00AD\u00B1\u2017\u00BE\u00B6\u00A7\u00F7\u00B8\u00B0\u00A8\u00B7\u00B9\u00B3\u00B2\u25A0\u00A0\"\n  },\n  \"ibm858\": \"cp858\",\n  \"csibm858\": \"cp858\",\n  \"cp860\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u00C7\u00FC\u00E9\u00E2\u00E3\u00E0\u00C1\u00E7\u00EA\u00CA\u00E8\u00CD\u00D4\u00EC\u00C3\u00C2\u00C9\u00C0\u00C8\u00F4\u00F5\u00F2\u00DA\u00F9\u00CC\u00D5\u00DC\u00A2\u00A3\u00D9\u20A7\u00D3\u00E1\u00ED\u00F3\u00FA\u00F1\u00D1\u00AA\u00BA\u00BF\u00D2\u00AC\u00BD\u00BC\u00A1\u00AB\u00BB\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255D\u255C\u255B\u2510\u2514\u2534\u252C\u251C\u2500\u253C\u255E\u255F\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256B\u256A\u2518\u250C\u2588\u2584\u258C\u2590\u2580\u03B1\u00DF\u0393\u03C0\u03A3\u03C3\u00B5\u03C4\u03A6\u0398\u03A9\u03B4\u221E\u03C6\u03B5\u2229\u2261\u00B1\u2265\u2264\u2320\u2321\u00F7\u2248\u00B0\u2219\u00B7\u221A\u207F\u00B2\u25A0\u00A0\"\n  },\n  \"ibm860\": \"cp860\",\n  \"csibm860\": \"cp860\",\n  \"cp861\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u00C7\u00FC\u00E9\u00E2\u00E4\u00E0\u00E5\u00E7\u00EA\u00EB\u00E8\u00D0\u00F0\u00DE\u00C4\u00C5\u00C9\u00E6\u00C6\u00F4\u00F6\u00FE\u00FB\u00DD\u00FD\u00D6\u00DC\u00F8\u00A3\u00D8\u20A7\u0192\u00E1\u00ED\u00F3\u00FA\u00C1\u00CD\u00D3\u00DA\u00BF\u2310\u00AC\u00BD\u00BC\u00A1\u00AB\u00BB\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255D\u255C\u255B\u2510\u2514\u2534\u252C\u251C\u2500\u253C\u255E\u255F\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256B\u256A\u2518\u250C\u2588\u2584\u258C\u2590\u2580\u03B1\u00DF\u0393\u03C0\u03A3\u03C3\u00B5\u03C4\u03A6\u0398\u03A9\u03B4\u221E\u03C6\u03B5\u2229\u2261\u00B1\u2265\u2264\u2320\u2321\u00F7\u2248\u00B0\u2219\u00B7\u221A\u207F\u00B2\u25A0\u00A0\"\n  },\n  \"ibm861\": \"cp861\",\n  \"csibm861\": \"cp861\",\n  \"cp862\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u05D0\u05D1\u05D2\u05D3\u05D4\u05D5\u05D6\u05D7\u05D8\u05D9\u05DA\u05DB\u05DC\u05DD\u05DE\u05DF\u05E0\u05E1\u05E2\u05E3\u05E4\u05E5\u05E6\u05E7\u05E8\u05E9\u05EA\u00A2\u00A3\u00A5\u20A7\u0192\u00E1\u00ED\u00F3\u00FA\u00F1\u00D1\u00AA\u00BA\u00BF\u2310\u00AC\u00BD\u00BC\u00A1\u00AB\u00BB\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255D\u255C\u255B\u2510\u2514\u2534\u252C\u251C\u2500\u253C\u255E\u255F\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256B\u256A\u2518\u250C\u2588\u2584\u258C\u2590\u2580\u03B1\u00DF\u0393\u03C0\u03A3\u03C3\u00B5\u03C4\u03A6\u0398\u03A9\u03B4\u221E\u03C6\u03B5\u2229\u2261\u00B1\u2265\u2264\u2320\u2321\u00F7\u2248\u00B0\u2219\u00B7\u221A\u207F\u00B2\u25A0\u00A0\"\n  },\n  \"ibm862\": \"cp862\",\n  \"csibm862\": \"cp862\",\n  \"cp863\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u00C7\u00FC\u00E9\u00E2\u00C2\u00E0\u00B6\u00E7\u00EA\u00EB\u00E8\u00EF\u00EE\u2017\u00C0\u00A7\u00C9\u00C8\u00CA\u00F4\u00CB\u00CF\u00FB\u00F9\u00A4\u00D4\u00DC\u00A2\u00A3\u00D9\u00DB\u0192\u00A6\u00B4\u00F3\u00FA\u00A8\u00B8\u00B3\u00AF\u00CE\u2310\u00AC\u00BD\u00BC\u00BE\u00AB\u00BB\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255D\u255C\u255B\u2510\u2514\u2534\u252C\u251C\u2500\u253C\u255E\u255F\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256B\u256A\u2518\u250C\u2588\u2584\u258C\u2590\u2580\u03B1\u00DF\u0393\u03C0\u03A3\u03C3\u00B5\u03C4\u03A6\u0398\u03A9\u03B4\u221E\u03C6\u03B5\u2229\u2261\u00B1\u2265\u2264\u2320\u2321\u00F7\u2248\u00B0\u2219\u00B7\u221A\u207F\u00B2\u25A0\u00A0\"\n  },\n  \"ibm863\": \"cp863\",\n  \"csibm863\": \"cp863\",\n  \"cp864\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$\u066A&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\u007F\u00B0\u00B7\u2219\u221A\u2592\u2500\u2502\u253C\u2524\u252C\u251C\u2534\u2510\u250C\u2514\u2518\u03B2\u221E\u03C6\u00B1\u00BD\u00BC\u2248\u00AB\u00BB\uFEF7\uFEF8\uFFFD\uFFFD\uFEFB\uFEFC\uFFFD\u00A0\u00AD\uFE82\u00A3\u00A4\uFE84\uFFFD\uFFFD\uFE8E\uFE8F\uFE95\uFE99\u060C\uFE9D\uFEA1\uFEA5\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\uFED1\u061B\uFEB1\uFEB5\uFEB9\u061F\u00A2\uFE80\uFE81\uFE83\uFE85\uFECA\uFE8B\uFE8D\uFE91\uFE93\uFE97\uFE9B\uFE9F\uFEA3\uFEA7\uFEA9\uFEAB\uFEAD\uFEAF\uFEB3\uFEB7\uFEBB\uFEBF\uFEC1\uFEC5\uFECB\uFECF\u00A6\u00AC\u00F7\u00D7\uFEC9\u0640\uFED3\uFED7\uFEDB\uFEDF\uFEE3\uFEE7\uFEEB\uFEED\uFEEF\uFEF3\uFEBD\uFECC\uFECE\uFECD\uFEE1\uFE7D\u0651\uFEE5\uFEE9\uFEEC\uFEF0\uFEF2\uFED0\uFED5\uFEF5\uFEF6\uFEDD\uFED9\uFEF1\u25A0\uFFFD\"\n  },\n  \"ibm864\": \"cp864\",\n  \"csibm864\": \"cp864\",\n  \"cp865\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u00C7\u00FC\u00E9\u00E2\u00E4\u00E0\u00E5\u00E7\u00EA\u00EB\u00E8\u00EF\u00EE\u00EC\u00C4\u00C5\u00C9\u00E6\u00C6\u00F4\u00F6\u00F2\u00FB\u00F9\u00FF\u00D6\u00DC\u00F8\u00A3\u00D8\u20A7\u0192\u00E1\u00ED\u00F3\u00FA\u00F1\u00D1\u00AA\u00BA\u00BF\u2310\u00AC\u00BD\u00BC\u00A1\u00AB\u00A4\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255D\u255C\u255B\u2510\u2514\u2534\u252C\u251C\u2500\u253C\u255E\u255F\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256B\u256A\u2518\u250C\u2588\u2584\u258C\u2590\u2580\u03B1\u00DF\u0393\u03C0\u03A3\u03C3\u00B5\u03C4\u03A6\u0398\u03A9\u03B4\u221E\u03C6\u03B5\u2229\u2261\u00B1\u2265\u2264\u2320\u2321\u00F7\u2248\u00B0\u2219\u00B7\u221A\u207F\u00B2\u25A0\u00A0\"\n  },\n  \"ibm865\": \"cp865\",\n  \"csibm865\": \"cp865\",\n  \"cp866\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041A\u041B\u041C\u041D\u041E\u041F\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042A\u042B\u042C\u042D\u042E\u042F\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043A\u043B\u043C\u043D\u043E\u043F\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255D\u255C\u255B\u2510\u2514\u2534\u252C\u251C\u2500\u253C\u255E\u255F\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256B\u256A\u2518\u250C\u2588\u2584\u258C\u2590\u2580\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044A\u044B\u044C\u044D\u044E\u044F\u0401\u0451\u0404\u0454\u0407\u0457\u040E\u045E\u00B0\u2219\u00B7\u221A\u2116\u00A4\u25A0\u00A0\"\n  },\n  \"ibm866\": \"cp866\",\n  \"csibm866\": \"cp866\",\n  \"cp869\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u0386\uFFFD\u00B7\u00AC\u00A6\u2018\u2019\u0388\u2015\u0389\u038A\u03AA\u038C\uFFFD\uFFFD\u038E\u03AB\u00A9\u038F\u00B2\u00B3\u03AC\u00A3\u03AD\u03AE\u03AF\u03CA\u0390\u03CC\u03CD\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u00BD\u0398\u0399\u00AB\u00BB\u2591\u2592\u2593\u2502\u2524\u039A\u039B\u039C\u039D\u2563\u2551\u2557\u255D\u039E\u039F\u2510\u2514\u2534\u252C\u251C\u2500\u253C\u03A0\u03A1\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u03A3\u03A4\u03A5\u03A6\u03A7\u03A8\u03A9\u03B1\u03B2\u03B3\u2518\u250C\u2588\u2584\u03B4\u03B5\u2580\u03B6\u03B7\u03B8\u03B9\u03BA\u03BB\u03BC\u03BD\u03BE\u03BF\u03C0\u03C1\u03C3\u03C2\u03C4\u0384\u00AD\u00B1\u03C5\u03C6\u03C7\u00A7\u03C8\u0385\u00B0\u00A8\u03C9\u03CB\u03B0\u03CE\u25A0\u00A0\"\n  },\n  \"ibm869\": \"cp869\",\n  \"csibm869\": \"cp869\",\n  \"cp922\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F\u00A0\u00A1\u00A2\u00A3\u00A4\u00A5\u00A6\u00A7\u00A8\u00A9\u00AA\u00AB\u00AC\u00AD\u00AE\u203E\u00B0\u00B1\u00B2\u00B3\u00B4\u00B5\u00B6\u00B7\u00B8\u00B9\u00BA\u00BB\u00BC\u00BD\u00BE\u00BF\u00C0\u00C1\u00C2\u00C3\u00C4\u00C5\u00C6\u00C7\u00C8\u00C9\u00CA\u00CB\u00CC\u00CD\u00CE\u00CF\u0160\u00D1\u00D2\u00D3\u00D4\u00D5\u00D6\u00D7\u00D8\u00D9\u00DA\u00DB\u00DC\u00DD\u017D\u00DF\u00E0\u00E1\u00E2\u00E3\u00E4\u00E5\u00E6\u00E7\u00E8\u00E9\u00EA\u00EB\u00EC\u00ED\u00EE\u00EF\u0161\u00F1\u00F2\u00F3\u00F4\u00F5\u00F6\u00F7\u00F8\u00F9\u00FA\u00FB\u00FC\u00FD\u017E\u00FF\"\n  },\n  \"ibm922\": \"cp922\",\n  \"csibm922\": \"cp922\",\n  \"cp1046\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\uFE88\u00D7\u00F7\uF8F6\uF8F5\uF8F4\uF8F7\uFE71\u0088\u25A0\u2502\u2500\u2510\u250C\u2514\u2518\uFE79\uFE7B\uFE7D\uFE7F\uFE77\uFE8A\uFEF0\uFEF3\uFEF2\uFECE\uFECF\uFED0\uFEF6\uFEF8\uFEFA\uFEFC\u00A0\uF8FA\uF8F9\uF8F8\u00A4\uF8FB\uFE8B\uFE91\uFE97\uFE9B\uFE9F\uFEA3\u060C\u00AD\uFEA7\uFEB3\u0660\u0661\u0662\u0663\u0664\u0665\u0666\u0667\u0668\u0669\uFEB7\u061B\uFEBB\uFEBF\uFECA\u061F\uFECB\u0621\u0622\u0623\u0624\u0625\u0626\u0627\u0628\u0629\u062A\u062B\u062C\u062D\u062E\u062F\u0630\u0631\u0632\u0633\u0634\u0635\u0636\u0637\uFEC7\u0639\u063A\uFECC\uFE82\uFE84\uFE8E\uFED3\u0640\u0641\u0642\u0643\u0644\u0645\u0646\u0647\u0648\u0649\u064A\u064B\u064C\u064D\u064E\u064F\u0650\u0651\u0652\uFED7\uFEDB\uFEDF\uF8FC\uFEF5\uFEF7\uFEF9\uFEFB\uFEE3\uFEE7\uFEEC\uFEE9\uFFFD\"\n  },\n  \"ibm1046\": \"cp1046\",\n  \"csibm1046\": \"cp1046\",\n  \"cp1124\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F\u00A0\u0401\u0402\u0490\u0404\u0405\u0406\u0407\u0408\u0409\u040A\u040B\u040C\u00AD\u040E\u040F\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041A\u041B\u041C\u041D\u041E\u041F\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042A\u042B\u042C\u042D\u042E\u042F\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043A\u043B\u043C\u043D\u043E\u043F\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044A\u044B\u044C\u044D\u044E\u044F\u2116\u0451\u0452\u0491\u0454\u0455\u0456\u0457\u0458\u0459\u045A\u045B\u045C\u00A7\u045E\u045F\"\n  },\n  \"ibm1124\": \"cp1124\",\n  \"csibm1124\": \"cp1124\",\n  \"cp1125\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041A\u041B\u041C\u041D\u041E\u041F\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042A\u042B\u042C\u042D\u042E\u042F\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043A\u043B\u043C\u043D\u043E\u043F\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255D\u255C\u255B\u2510\u2514\u2534\u252C\u251C\u2500\u253C\u255E\u255F\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256B\u256A\u2518\u250C\u2588\u2584\u258C\u2590\u2580\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044A\u044B\u044C\u044D\u044E\u044F\u0401\u0451\u0490\u0491\u0404\u0454\u0406\u0456\u0407\u0457\u00B7\u221A\u2116\u00A4\u25A0\u00A0\"\n  },\n  \"ibm1125\": \"cp1125\",\n  \"csibm1125\": \"cp1125\",\n  \"cp1129\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F\u00A0\u00A1\u00A2\u00A3\u00A4\u00A5\u00A6\u00A7\u0153\u00A9\u00AA\u00AB\u00AC\u00AD\u00AE\u00AF\u00B0\u00B1\u00B2\u00B3\u0178\u00B5\u00B6\u00B7\u0152\u00B9\u00BA\u00BB\u00BC\u00BD\u00BE\u00BF\u00C0\u00C1\u00C2\u0102\u00C4\u00C5\u00C6\u00C7\u00C8\u00C9\u00CA\u00CB\u0300\u00CD\u00CE\u00CF\u0110\u00D1\u0309\u00D3\u00D4\u01A0\u00D6\u00D7\u00D8\u00D9\u00DA\u00DB\u00DC\u01AF\u0303\u00DF\u00E0\u00E1\u00E2\u0103\u00E4\u00E5\u00E6\u00E7\u00E8\u00E9\u00EA\u00EB\u0301\u00ED\u00EE\u00EF\u0111\u00F1\u0323\u00F3\u00F4\u01A1\u00F6\u00F7\u00F8\u00F9\u00FA\u00FB\u00FC\u01B0\u20AB\u00FF\"\n  },\n  \"ibm1129\": \"cp1129\",\n  \"csibm1129\": \"cp1129\",\n  \"cp1133\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F\u00A0\u0E81\u0E82\u0E84\u0E87\u0E88\u0EAA\u0E8A\u0E8D\u0E94\u0E95\u0E96\u0E97\u0E99\u0E9A\u0E9B\u0E9C\u0E9D\u0E9E\u0E9F\u0EA1\u0EA2\u0EA3\u0EA5\u0EA7\u0EAB\u0EAD\u0EAE\uFFFD\uFFFD\uFFFD\u0EAF\u0EB0\u0EB2\u0EB3\u0EB4\u0EB5\u0EB6\u0EB7\u0EB8\u0EB9\u0EBC\u0EB1\u0EBB\u0EBD\uFFFD\uFFFD\uFFFD\u0EC0\u0EC1\u0EC2\u0EC3\u0EC4\u0EC8\u0EC9\u0ECA\u0ECB\u0ECC\u0ECD\u0EC6\uFFFD\u0EDC\u0EDD\u20AD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u0ED0\u0ED1\u0ED2\u0ED3\u0ED4\u0ED5\u0ED6\u0ED7\u0ED8\u0ED9\uFFFD\uFFFD\u00A2\u00AC\u00A6\uFFFD\"\n  },\n  \"ibm1133\": \"cp1133\",\n  \"csibm1133\": \"cp1133\",\n  \"cp1161\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u0E48\u0E01\u0E02\u0E03\u0E04\u0E05\u0E06\u0E07\u0E08\u0E09\u0E0A\u0E0B\u0E0C\u0E0D\u0E0E\u0E0F\u0E10\u0E11\u0E12\u0E13\u0E14\u0E15\u0E16\u0E17\u0E18\u0E19\u0E1A\u0E1B\u0E1C\u0E1D\u0E1E\u0E1F\u0E20\u0E21\u0E22\u0E23\u0E24\u0E25\u0E26\u0E27\u0E28\u0E29\u0E2A\u0E2B\u0E2C\u0E2D\u0E2E\u0E2F\u0E30\u0E31\u0E32\u0E33\u0E34\u0E35\u0E36\u0E37\u0E38\u0E39\u0E3A\u0E49\u0E4A\u0E4B\u20AC\u0E3F\u0E40\u0E41\u0E42\u0E43\u0E44\u0E45\u0E46\u0E47\u0E48\u0E49\u0E4A\u0E4B\u0E4C\u0E4D\u0E4E\u0E4F\u0E50\u0E51\u0E52\u0E53\u0E54\u0E55\u0E56\u0E57\u0E58\u0E59\u0E5A\u0E5B\u00A2\u00AC\u00A6\u00A0\"\n  },\n  \"ibm1161\": \"cp1161\",\n  \"csibm1161\": \"cp1161\",\n  \"cp1162\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u20AC\u0081\u0082\u0083\u0084\u2026\u0086\u0087\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F\u0090\u2018\u2019\u201C\u201D\u2022\u2013\u2014\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F\u00A0\u0E01\u0E02\u0E03\u0E04\u0E05\u0E06\u0E07\u0E08\u0E09\u0E0A\u0E0B\u0E0C\u0E0D\u0E0E\u0E0F\u0E10\u0E11\u0E12\u0E13\u0E14\u0E15\u0E16\u0E17\u0E18\u0E19\u0E1A\u0E1B\u0E1C\u0E1D\u0E1E\u0E1F\u0E20\u0E21\u0E22\u0E23\u0E24\u0E25\u0E26\u0E27\u0E28\u0E29\u0E2A\u0E2B\u0E2C\u0E2D\u0E2E\u0E2F\u0E30\u0E31\u0E32\u0E33\u0E34\u0E35\u0E36\u0E37\u0E38\u0E39\u0E3A\uFFFD\uFFFD\uFFFD\uFFFD\u0E3F\u0E40\u0E41\u0E42\u0E43\u0E44\u0E45\u0E46\u0E47\u0E48\u0E49\u0E4A\u0E4B\u0E4C\u0E4D\u0E4E\u0E4F\u0E50\u0E51\u0E52\u0E53\u0E54\u0E55\u0E56\u0E57\u0E58\u0E59\u0E5A\u0E5B\uFFFD\uFFFD\uFFFD\uFFFD\"\n  },\n  \"ibm1162\": \"cp1162\",\n  \"csibm1162\": \"cp1162\",\n  \"cp1163\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F\u00A0\u00A1\u00A2\u00A3\u20AC\u00A5\u00A6\u00A7\u0153\u00A9\u00AA\u00AB\u00AC\u00AD\u00AE\u00AF\u00B0\u00B1\u00B2\u00B3\u0178\u00B5\u00B6\u00B7\u0152\u00B9\u00BA\u00BB\u00BC\u00BD\u00BE\u00BF\u00C0\u00C1\u00C2\u0102\u00C4\u00C5\u00C6\u00C7\u00C8\u00C9\u00CA\u00CB\u0300\u00CD\u00CE\u00CF\u0110\u00D1\u0309\u00D3\u00D4\u01A0\u00D6\u00D7\u00D8\u00D9\u00DA\u00DB\u00DC\u01AF\u0303\u00DF\u00E0\u00E1\u00E2\u0103\u00E4\u00E5\u00E6\u00E7\u00E8\u00E9\u00EA\u00EB\u0301\u00ED\u00EE\u00EF\u0111\u00F1\u0323\u00F3\u00F4\u01A1\u00F6\u00F7\u00F8\u00F9\u00FA\u00FB\u00FC\u01B0\u20AB\u00FF\"\n  },\n  \"ibm1163\": \"cp1163\",\n  \"csibm1163\": \"cp1163\",\n  \"maccroatian\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u00C4\u00C5\u00C7\u00C9\u00D1\u00D6\u00DC\u00E1\u00E0\u00E2\u00E4\u00E3\u00E5\u00E7\u00E9\u00E8\u00EA\u00EB\u00ED\u00EC\u00EE\u00EF\u00F1\u00F3\u00F2\u00F4\u00F6\u00F5\u00FA\u00F9\u00FB\u00FC\u2020\u00B0\u00A2\u00A3\u00A7\u2022\u00B6\u00DF\u00AE\u0160\u2122\u00B4\u00A8\u2260\u017D\u00D8\u221E\u00B1\u2264\u2265\u2206\u00B5\u2202\u2211\u220F\u0161\u222B\u00AA\u00BA\u2126\u017E\u00F8\u00BF\u00A1\u00AC\u221A\u0192\u2248\u0106\u00AB\u010C\u2026\u00A0\u00C0\u00C3\u00D5\u0152\u0153\u0110\u2014\u201C\u201D\u2018\u2019\u00F7\u25CA\uFFFD\u00A9\u2044\u00A4\u2039\u203A\u00C6\u00BB\u2013\u00B7\u201A\u201E\u2030\u00C2\u0107\u00C1\u010D\u00C8\u00CD\u00CE\u00CF\u00CC\u00D3\u00D4\u0111\u00D2\u00DA\u00DB\u00D9\u0131\u02C6\u02DC\u00AF\u03C0\u00CB\u02DA\u00B8\u00CA\u00E6\u02C7\"\n  },\n  \"maccyrillic\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041A\u041B\u041C\u041D\u041E\u041F\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042A\u042B\u042C\u042D\u042E\u042F\u2020\u00B0\u00A2\u00A3\u00A7\u2022\u00B6\u0406\u00AE\u00A9\u2122\u0402\u0452\u2260\u0403\u0453\u221E\u00B1\u2264\u2265\u0456\u00B5\u2202\u0408\u0404\u0454\u0407\u0457\u0409\u0459\u040A\u045A\u0458\u0405\u00AC\u221A\u0192\u2248\u2206\u00AB\u00BB\u2026\u00A0\u040B\u045B\u040C\u045C\u0455\u2013\u2014\u201C\u201D\u2018\u2019\u00F7\u201E\u040E\u045E\u040F\u045F\u2116\u0401\u0451\u044F\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043A\u043B\u043C\u043D\u043E\u043F\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044A\u044B\u044C\u044D\u044E\u00A4\"\n  },\n  \"macgreek\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u00C4\u00B9\u00B2\u00C9\u00B3\u00D6\u00DC\u0385\u00E0\u00E2\u00E4\u0384\u00A8\u00E7\u00E9\u00E8\u00EA\u00EB\u00A3\u2122\u00EE\u00EF\u2022\u00BD\u2030\u00F4\u00F6\u00A6\u00AD\u00F9\u00FB\u00FC\u2020\u0393\u0394\u0398\u039B\u039E\u03A0\u00DF\u00AE\u00A9\u03A3\u03AA\u00A7\u2260\u00B0\u0387\u0391\u00B1\u2264\u2265\u00A5\u0392\u0395\u0396\u0397\u0399\u039A\u039C\u03A6\u03AB\u03A8\u03A9\u03AC\u039D\u00AC\u039F\u03A1\u2248\u03A4\u00AB\u00BB\u2026\u00A0\u03A5\u03A7\u0386\u0388\u0153\u2013\u2015\u201C\u201D\u2018\u2019\u00F7\u0389\u038A\u038C\u038E\u03AD\u03AE\u03AF\u03CC\u038F\u03CD\u03B1\u03B2\u03C8\u03B4\u03B5\u03C6\u03B3\u03B7\u03B9\u03BE\u03BA\u03BB\u03BC\u03BD\u03BF\u03C0\u03CE\u03C1\u03C3\u03C4\u03B8\u03C9\u03C2\u03C7\u03C5\u03B6\u03CA\u03CB\u0390\u03B0\uFFFD\"\n  },\n  \"maciceland\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u00C4\u00C5\u00C7\u00C9\u00D1\u00D6\u00DC\u00E1\u00E0\u00E2\u00E4\u00E3\u00E5\u00E7\u00E9\u00E8\u00EA\u00EB\u00ED\u00EC\u00EE\u00EF\u00F1\u00F3\u00F2\u00F4\u00F6\u00F5\u00FA\u00F9\u00FB\u00FC\u00DD\u00B0\u00A2\u00A3\u00A7\u2022\u00B6\u00DF\u00AE\u00A9\u2122\u00B4\u00A8\u2260\u00C6\u00D8\u221E\u00B1\u2264\u2265\u00A5\u00B5\u2202\u2211\u220F\u03C0\u222B\u00AA\u00BA\u2126\u00E6\u00F8\u00BF\u00A1\u00AC\u221A\u0192\u2248\u2206\u00AB\u00BB\u2026\u00A0\u00C0\u00C3\u00D5\u0152\u0153\u2013\u2014\u201C\u201D\u2018\u2019\u00F7\u25CA\u00FF\u0178\u2044\u00A4\u00D0\u00F0\u00DE\u00FE\u00FD\u00B7\u201A\u201E\u2030\u00C2\u00CA\u00C1\u00CB\u00C8\u00CD\u00CE\u00CF\u00CC\u00D3\u00D4\uFFFD\u00D2\u00DA\u00DB\u00D9\u0131\u02C6\u02DC\u00AF\u02D8\u02D9\u02DA\u00B8\u02DD\u02DB\u02C7\"\n  },\n  \"macroman\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u00C4\u00C5\u00C7\u00C9\u00D1\u00D6\u00DC\u00E1\u00E0\u00E2\u00E4\u00E3\u00E5\u00E7\u00E9\u00E8\u00EA\u00EB\u00ED\u00EC\u00EE\u00EF\u00F1\u00F3\u00F2\u00F4\u00F6\u00F5\u00FA\u00F9\u00FB\u00FC\u2020\u00B0\u00A2\u00A3\u00A7\u2022\u00B6\u00DF\u00AE\u00A9\u2122\u00B4\u00A8\u2260\u00C6\u00D8\u221E\u00B1\u2264\u2265\u00A5\u00B5\u2202\u2211\u220F\u03C0\u222B\u00AA\u00BA\u2126\u00E6\u00F8\u00BF\u00A1\u00AC\u221A\u0192\u2248\u2206\u00AB\u00BB\u2026\u00A0\u00C0\u00C3\u00D5\u0152\u0153\u2013\u2014\u201C\u201D\u2018\u2019\u00F7\u25CA\u00FF\u0178\u2044\u00A4\u2039\u203A\uFB01\uFB02\u2021\u00B7\u201A\u201E\u2030\u00C2\u00CA\u00C1\u00CB\u00C8\u00CD\u00CE\u00CF\u00CC\u00D3\u00D4\uFFFD\u00D2\u00DA\u00DB\u00D9\u0131\u02C6\u02DC\u00AF\u02D8\u02D9\u02DA\u00B8\u02DD\u02DB\u02C7\"\n  },\n  \"macromania\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u00C4\u00C5\u00C7\u00C9\u00D1\u00D6\u00DC\u00E1\u00E0\u00E2\u00E4\u00E3\u00E5\u00E7\u00E9\u00E8\u00EA\u00EB\u00ED\u00EC\u00EE\u00EF\u00F1\u00F3\u00F2\u00F4\u00F6\u00F5\u00FA\u00F9\u00FB\u00FC\u2020\u00B0\u00A2\u00A3\u00A7\u2022\u00B6\u00DF\u00AE\u00A9\u2122\u00B4\u00A8\u2260\u0102\u015E\u221E\u00B1\u2264\u2265\u00A5\u00B5\u2202\u2211\u220F\u03C0\u222B\u00AA\u00BA\u2126\u0103\u015F\u00BF\u00A1\u00AC\u221A\u0192\u2248\u2206\u00AB\u00BB\u2026\u00A0\u00C0\u00C3\u00D5\u0152\u0153\u2013\u2014\u201C\u201D\u2018\u2019\u00F7\u25CA\u00FF\u0178\u2044\u00A4\u2039\u203A\u0162\u0163\u2021\u00B7\u201A\u201E\u2030\u00C2\u00CA\u00C1\u00CB\u00C8\u00CD\u00CE\u00CF\u00CC\u00D3\u00D4\uFFFD\u00D2\u00DA\u00DB\u00D9\u0131\u02C6\u02DC\u00AF\u02D8\u02D9\u02DA\u00B8\u02DD\u02DB\u02C7\"\n  },\n  \"macthai\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u00AB\u00BB\u2026\uF88C\uF88F\uF892\uF895\uF898\uF88B\uF88E\uF891\uF894\uF897\u201C\u201D\uF899\uFFFD\u2022\uF884\uF889\uF885\uF886\uF887\uF888\uF88A\uF88D\uF890\uF893\uF896\u2018\u2019\uFFFD\u00A0\u0E01\u0E02\u0E03\u0E04\u0E05\u0E06\u0E07\u0E08\u0E09\u0E0A\u0E0B\u0E0C\u0E0D\u0E0E\u0E0F\u0E10\u0E11\u0E12\u0E13\u0E14\u0E15\u0E16\u0E17\u0E18\u0E19\u0E1A\u0E1B\u0E1C\u0E1D\u0E1E\u0E1F\u0E20\u0E21\u0E22\u0E23\u0E24\u0E25\u0E26\u0E27\u0E28\u0E29\u0E2A\u0E2B\u0E2C\u0E2D\u0E2E\u0E2F\u0E30\u0E31\u0E32\u0E33\u0E34\u0E35\u0E36\u0E37\u0E38\u0E39\u0E3A\uFEFF\u200B\u2013\u2014\u0E3F\u0E40\u0E41\u0E42\u0E43\u0E44\u0E45\u0E46\u0E47\u0E48\u0E49\u0E4A\u0E4B\u0E4C\u0E4D\u2122\u0E4F\u0E50\u0E51\u0E52\u0E53\u0E54\u0E55\u0E56\u0E57\u0E58\u0E59\u00AE\u00A9\uFFFD\uFFFD\uFFFD\uFFFD\"\n  },\n  \"macturkish\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u00C4\u00C5\u00C7\u00C9\u00D1\u00D6\u00DC\u00E1\u00E0\u00E2\u00E4\u00E3\u00E5\u00E7\u00E9\u00E8\u00EA\u00EB\u00ED\u00EC\u00EE\u00EF\u00F1\u00F3\u00F2\u00F4\u00F6\u00F5\u00FA\u00F9\u00FB\u00FC\u2020\u00B0\u00A2\u00A3\u00A7\u2022\u00B6\u00DF\u00AE\u00A9\u2122\u00B4\u00A8\u2260\u00C6\u00D8\u221E\u00B1\u2264\u2265\u00A5\u00B5\u2202\u2211\u220F\u03C0\u222B\u00AA\u00BA\u2126\u00E6\u00F8\u00BF\u00A1\u00AC\u221A\u0192\u2248\u2206\u00AB\u00BB\u2026\u00A0\u00C0\u00C3\u00D5\u0152\u0153\u2013\u2014\u201C\u201D\u2018\u2019\u00F7\u25CA\u00FF\u0178\u011E\u011F\u0130\u0131\u015E\u015F\u2021\u00B7\u201A\u201E\u2030\u00C2\u00CA\u00C1\u00CB\u00C8\u00CD\u00CE\u00CF\u00CC\u00D3\u00D4\uFFFD\u00D2\u00DA\u00DB\u00D9\uFFFD\u02C6\u02DC\u00AF\u02D8\u02D9\u02DA\u00B8\u02DD\u02DB\u02C7\"\n  },\n  \"macukraine\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041A\u041B\u041C\u041D\u041E\u041F\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042A\u042B\u042C\u042D\u042E\u042F\u2020\u00B0\u0490\u00A3\u00A7\u2022\u00B6\u0406\u00AE\u00A9\u2122\u0402\u0452\u2260\u0403\u0453\u221E\u00B1\u2264\u2265\u0456\u00B5\u0491\u0408\u0404\u0454\u0407\u0457\u0409\u0459\u040A\u045A\u0458\u0405\u00AC\u221A\u0192\u2248\u2206\u00AB\u00BB\u2026\u00A0\u040B\u045B\u040C\u045C\u0455\u2013\u2014\u201C\u201D\u2018\u2019\u00F7\u201E\u040E\u045E\u040F\u045F\u2116\u0401\u0451\u044F\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043A\u043B\u043C\u043D\u043E\u043F\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044A\u044B\u044C\u044D\u044E\u00A4\"\n  },\n  \"koi8r\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u2500\u2502\u250C\u2510\u2514\u2518\u251C\u2524\u252C\u2534\u253C\u2580\u2584\u2588\u258C\u2590\u2591\u2592\u2593\u2320\u25A0\u2219\u221A\u2248\u2264\u2265\u00A0\u2321\u00B0\u00B2\u00B7\u00F7\u2550\u2551\u2552\u0451\u2553\u2554\u2555\u2556\u2557\u2558\u2559\u255A\u255B\u255C\u255D\u255E\u255F\u2560\u2561\u0401\u2562\u2563\u2564\u2565\u2566\u2567\u2568\u2569\u256A\u256B\u256C\u00A9\u044E\u0430\u0431\u0446\u0434\u0435\u0444\u0433\u0445\u0438\u0439\u043A\u043B\u043C\u043D\u043E\u043F\u044F\u0440\u0441\u0442\u0443\u0436\u0432\u044C\u044B\u0437\u0448\u044D\u0449\u0447\u044A\u042E\u0410\u0411\u0426\u0414\u0415\u0424\u0413\u0425\u0418\u0419\u041A\u041B\u041C\u041D\u041E\u041F\u042F\u0420\u0421\u0422\u0423\u0416\u0412\u042C\u042B\u0417\u0428\u042D\u0429\u0427\u042A\"\n  },\n  \"koi8u\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u2500\u2502\u250C\u2510\u2514\u2518\u251C\u2524\u252C\u2534\u253C\u2580\u2584\u2588\u258C\u2590\u2591\u2592\u2593\u2320\u25A0\u2219\u221A\u2248\u2264\u2265\u00A0\u2321\u00B0\u00B2\u00B7\u00F7\u2550\u2551\u2552\u0451\u0454\u2554\u0456\u0457\u2557\u2558\u2559\u255A\u255B\u0491\u255D\u255E\u255F\u2560\u2561\u0401\u0404\u2563\u0406\u0407\u2566\u2567\u2568\u2569\u256A\u0490\u256C\u00A9\u044E\u0430\u0431\u0446\u0434\u0435\u0444\u0433\u0445\u0438\u0439\u043A\u043B\u043C\u043D\u043E\u043F\u044F\u0440\u0441\u0442\u0443\u0436\u0432\u044C\u044B\u0437\u0448\u044D\u0449\u0447\u044A\u042E\u0410\u0411\u0426\u0414\u0415\u0424\u0413\u0425\u0418\u0419\u041A\u041B\u041C\u041D\u041E\u041F\u042F\u0420\u0421\u0422\u0423\u0416\u0412\u042C\u042B\u0417\u0428\u042D\u0429\u0427\u042A\"\n  },\n  \"koi8ru\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u2500\u2502\u250C\u2510\u2514\u2518\u251C\u2524\u252C\u2534\u253C\u2580\u2584\u2588\u258C\u2590\u2591\u2592\u2593\u2320\u25A0\u2219\u221A\u2248\u2264\u2265\u00A0\u2321\u00B0\u00B2\u00B7\u00F7\u2550\u2551\u2552\u0451\u0454\u2554\u0456\u0457\u2557\u2558\u2559\u255A\u255B\u0491\u045E\u255E\u255F\u2560\u2561\u0401\u0404\u2563\u0406\u0407\u2566\u2567\u2568\u2569\u256A\u0490\u040E\u00A9\u044E\u0430\u0431\u0446\u0434\u0435\u0444\u0433\u0445\u0438\u0439\u043A\u043B\u043C\u043D\u043E\u043F\u044F\u0440\u0441\u0442\u0443\u0436\u0432\u044C\u044B\u0437\u0448\u044D\u0449\u0447\u044A\u042E\u0410\u0411\u0426\u0414\u0415\u0424\u0413\u0425\u0418\u0419\u041A\u041B\u041C\u041D\u041E\u041F\u042F\u0420\u0421\u0422\u0423\u0416\u0412\u042C\u042B\u0417\u0428\u042D\u0429\u0427\u042A\"\n  },\n  \"koi8t\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u049B\u0493\u201A\u0492\u201E\u2026\u2020\u2021\uFFFD\u2030\u04B3\u2039\u04B2\u04B7\u04B6\uFFFD\u049A\u2018\u2019\u201C\u201D\u2022\u2013\u2014\uFFFD\u2122\uFFFD\u203A\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u04EF\u04EE\u0451\u00A4\u04E3\u00A6\u00A7\uFFFD\uFFFD\uFFFD\u00AB\u00AC\u00AD\u00AE\uFFFD\u00B0\u00B1\u00B2\u0401\uFFFD\u04E2\u00B6\u00B7\uFFFD\u2116\uFFFD\u00BB\uFFFD\uFFFD\uFFFD\u00A9\u044E\u0430\u0431\u0446\u0434\u0435\u0444\u0433\u0445\u0438\u0439\u043A\u043B\u043C\u043D\u043E\u043F\u044F\u0440\u0441\u0442\u0443\u0436\u0432\u044C\u044B\u0437\u0448\u044D\u0449\u0447\u044A\u042E\u0410\u0411\u0426\u0414\u0415\u0424\u0413\u0425\u0418\u0419\u041A\u041B\u041C\u041D\u041E\u041F\u042F\u0420\u0421\u0422\u0423\u0416\u0412\u042C\u042B\u0417\u0428\u042D\u0429\u0427\u042A\"\n  },\n  \"armscii8\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F\u00A0\uFFFD\u0587\u0589)(\u00BB\u00AB\u2014.\u055D,-\u058A\u2026\u055C\u055B\u055E\u0531\u0561\u0532\u0562\u0533\u0563\u0534\u0564\u0535\u0565\u0536\u0566\u0537\u0567\u0538\u0568\u0539\u0569\u053A\u056A\u053B\u056B\u053C\u056C\u053D\u056D\u053E\u056E\u053F\u056F\u0540\u0570\u0541\u0571\u0542\u0572\u0543\u0573\u0544\u0574\u0545\u0575\u0546\u0576\u0547\u0577\u0548\u0578\u0549\u0579\u054A\u057A\u054B\u057B\u054C\u057C\u054D\u057D\u054E\u057E\u054F\u057F\u0550\u0580\u0551\u0581\u0552\u0582\u0553\u0583\u0554\u0584\u0555\u0585\u0556\u0586\u055A\uFFFD\"\n  },\n  \"rk1048\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0402\u0403\u201A\u0453\u201E\u2026\u2020\u2021\u20AC\u2030\u0409\u2039\u040A\u049A\u04BA\u040F\u0452\u2018\u2019\u201C\u201D\u2022\u2013\u2014\uFFFD\u2122\u0459\u203A\u045A\u049B\u04BB\u045F\u00A0\u04B0\u04B1\u04D8\u00A4\u04E8\u00A6\u00A7\u0401\u00A9\u0492\u00AB\u00AC\u00AD\u00AE\u04AE\u00B0\u00B1\u0406\u0456\u04E9\u00B5\u00B6\u00B7\u0451\u2116\u0493\u00BB\u04D9\u04A2\u04A3\u04AF\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041A\u041B\u041C\u041D\u041E\u041F\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042A\u042B\u042C\u042D\u042E\u042F\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043A\u043B\u043C\u043D\u043E\u043F\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044A\u044B\u044C\u044D\u044E\u044F\"\n  },\n  \"tcvn\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\\u0000\u00DA\u1EE4\\u0003\u1EEA\u1EEC\u1EEE\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\u1EE8\u1EF0\u1EF2\u1EF6\u1EF8\u00DD\u1EF4\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\u007F\u00C0\u1EA2\u00C3\u00C1\u1EA0\u1EB6\u1EAC\u00C8\u1EBA\u1EBC\u00C9\u1EB8\u1EC6\u00CC\u1EC8\u0128\u00CD\u1ECA\u00D2\u1ECE\u00D5\u00D3\u1ECC\u1ED8\u1EDC\u1EDE\u1EE0\u1EDA\u1EE2\u00D9\u1EE6\u0168\u00A0\u0102\u00C2\u00CA\u00D4\u01A0\u01AF\u0110\u0103\u00E2\u00EA\u00F4\u01A1\u01B0\u0111\u1EB0\u0300\u0309\u0303\u0301\u0323\u00E0\u1EA3\u00E3\u00E1\u1EA1\u1EB2\u1EB1\u1EB3\u1EB5\u1EAF\u1EB4\u1EAE\u1EA6\u1EA8\u1EAA\u1EA4\u1EC0\u1EB7\u1EA7\u1EA9\u1EAB\u1EA5\u1EAD\u00E8\u1EC2\u1EBB\u1EBD\u00E9\u1EB9\u1EC1\u1EC3\u1EC5\u1EBF\u1EC7\u00EC\u1EC9\u1EC4\u1EBE\u1ED2\u0129\u00ED\u1ECB\u00F2\u1ED4\u1ECF\u00F5\u00F3\u1ECD\u1ED3\u1ED5\u1ED7\u1ED1\u1ED9\u1EDD\u1EDF\u1EE1\u1EDB\u1EE3\u00F9\u1ED6\u1EE7\u0169\u00FA\u1EE5\u1EEB\u1EED\u1EEF\u1EE9\u1EF1\u1EF3\u1EF7\u1EF9\u00FD\u1EF5\u1ED0\"\n  },\n  \"georgianacademy\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0080\u0081\u201A\u0192\u201E\u2026\u2020\u2021\u02C6\u2030\u0160\u2039\u0152\u008D\u008E\u008F\u0090\u2018\u2019\u201C\u201D\u2022\u2013\u2014\u02DC\u2122\u0161\u203A\u0153\u009D\u009E\u0178\u00A0\u00A1\u00A2\u00A3\u00A4\u00A5\u00A6\u00A7\u00A8\u00A9\u00AA\u00AB\u00AC\u00AD\u00AE\u00AF\u00B0\u00B1\u00B2\u00B3\u00B4\u00B5\u00B6\u00B7\u00B8\u00B9\u00BA\u00BB\u00BC\u00BD\u00BE\u00BF\u10D0\u10D1\u10D2\u10D3\u10D4\u10D5\u10D6\u10D7\u10D8\u10D9\u10DA\u10DB\u10DC\u10DD\u10DE\u10DF\u10E0\u10E1\u10E2\u10E3\u10E4\u10E5\u10E6\u10E7\u10E8\u10E9\u10EA\u10EB\u10EC\u10ED\u10EE\u10EF\u10F0\u10F1\u10F2\u10F3\u10F4\u10F5\u10F6\u00E7\u00E8\u00E9\u00EA\u00EB\u00EC\u00ED\u00EE\u00EF\u00F0\u00F1\u00F2\u00F3\u00F4\u00F5\u00F6\u00F7\u00F8\u00F9\u00FA\u00FB\u00FC\u00FD\u00FE\u00FF\"\n  },\n  \"georgianps\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0080\u0081\u201A\u0192\u201E\u2026\u2020\u2021\u02C6\u2030\u0160\u2039\u0152\u008D\u008E\u008F\u0090\u2018\u2019\u201C\u201D\u2022\u2013\u2014\u02DC\u2122\u0161\u203A\u0153\u009D\u009E\u0178\u00A0\u00A1\u00A2\u00A3\u00A4\u00A5\u00A6\u00A7\u00A8\u00A9\u00AA\u00AB\u00AC\u00AD\u00AE\u00AF\u00B0\u00B1\u00B2\u00B3\u00B4\u00B5\u00B6\u00B7\u00B8\u00B9\u00BA\u00BB\u00BC\u00BD\u00BE\u00BF\u10D0\u10D1\u10D2\u10D3\u10D4\u10D5\u10D6\u10F1\u10D7\u10D8\u10D9\u10DA\u10DB\u10DC\u10F2\u10DD\u10DE\u10DF\u10E0\u10E1\u10E2\u10F3\u10E3\u10E4\u10E5\u10E6\u10E7\u10E8\u10E9\u10EA\u10EB\u10EC\u10ED\u10EE\u10F4\u10EF\u10F0\u10F5\u00E6\u00E7\u00E8\u00E9\u00EA\u00EB\u00EC\u00ED\u00EE\u00EF\u00F0\u00F1\u00F2\u00F3\u00F4\u00F5\u00F6\u00F7\u00F8\u00F9\u00FA\u00FB\u00FC\u00FD\u00FE\u00FF\"\n  },\n  \"pt154\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0496\u0492\u04EE\u0493\u201E\u2026\u04B6\u04AE\u04B2\u04AF\u04A0\u04E2\u04A2\u049A\u04BA\u04B8\u0497\u2018\u2019\u201C\u201D\u2022\u2013\u2014\u04B3\u04B7\u04A1\u04E3\u04A3\u049B\u04BB\u04B9\u00A0\u040E\u045E\u0408\u04E8\u0498\u04B0\u00A7\u0401\u00A9\u04D8\u00AB\u00AC\u04EF\u00AE\u049C\u00B0\u04B1\u0406\u0456\u0499\u04E9\u00B6\u00B7\u0451\u2116\u04D9\u00BB\u0458\u04AA\u04AB\u049D\u0410\u0411\u0412\u0413\u0414\u0415\u0416\u0417\u0418\u0419\u041A\u041B\u041C\u041D\u041E\u041F\u0420\u0421\u0422\u0423\u0424\u0425\u0426\u0427\u0428\u0429\u042A\u042B\u042C\u042D\u042E\u042F\u0430\u0431\u0432\u0433\u0434\u0435\u0436\u0437\u0438\u0439\u043A\u043B\u043C\u043D\u043E\u043F\u0440\u0441\u0442\u0443\u0444\u0445\u0446\u0447\u0448\u0449\u044A\u044B\u044C\u044D\u044E\u044F\"\n  },\n  \"viscii\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\\u0000\\u0001\u1EB2\\u0003\\u0004\u1EB4\u1EAA\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\u1EF6\\u0015\\u0016\\u0017\\u0018\u1EF8\\u001a\\u001b\\u001c\\u001d\u1EF4\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\u007F\u1EA0\u1EAE\u1EB0\u1EB6\u1EA4\u1EA6\u1EA8\u1EAC\u1EBC\u1EB8\u1EBE\u1EC0\u1EC2\u1EC4\u1EC6\u1ED0\u1ED2\u1ED4\u1ED6\u1ED8\u1EE2\u1EDA\u1EDC\u1EDE\u1ECA\u1ECE\u1ECC\u1EC8\u1EE6\u0168\u1EE4\u1EF2\u00D5\u1EAF\u1EB1\u1EB7\u1EA5\u1EA7\u1EA9\u1EAD\u1EBD\u1EB9\u1EBF\u1EC1\u1EC3\u1EC5\u1EC7\u1ED1\u1ED3\u1ED5\u1ED7\u1EE0\u01A0\u1ED9\u1EDD\u1EDF\u1ECB\u1EF0\u1EE8\u1EEA\u1EEC\u01A1\u1EDB\u01AF\u00C0\u00C1\u00C2\u00C3\u1EA2\u0102\u1EB3\u1EB5\u00C8\u00C9\u00CA\u1EBA\u00CC\u00CD\u0128\u1EF3\u0110\u1EE9\u00D2\u00D3\u00D4\u1EA1\u1EF7\u1EEB\u1EED\u00D9\u00DA\u1EF9\u1EF5\u00DD\u1EE1\u01B0\u00E0\u00E1\u00E2\u00E3\u1EA3\u0103\u1EEF\u1EAB\u00E8\u00E9\u00EA\u1EBB\u00EC\u00ED\u0129\u1EC9\u0111\u1EF1\u00F2\u00F3\u00F4\u00F5\u1ECF\u1ECD\u1EE5\u00F9\u00FA\u0169\u1EE7\u00FD\u1EE3\u1EEE\"\n  },\n  \"iso646cn\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#\u00A5%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_`abcdefghijklmnopqrstuvwxyz{|}\u203E\u007F\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\"\n  },\n  \"iso646jp\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\\u0000\\u0001\\u0002\\u0003\\u0004\\u0005\\u0006\\u0007\\b\\t\\n\\u000b\\f\\r\\u000e\\u000f\\u0010\\u0011\\u0012\\u0013\\u0014\\u0015\\u0016\\u0017\\u0018\\u0019\\u001a\\u001b\\u001c\\u001d\\u001e\\u001f !\\\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\u00A5]^_`abcdefghijklmnopqrstuvwxyz{|}\u203E\u007F\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\"\n  },\n  \"hproman8\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u0080\u0081\u0082\u0083\u0084\u0085\u0086\u0087\u0088\u0089\u008A\u008B\u008C\u008D\u008E\u008F\u0090\u0091\u0092\u0093\u0094\u0095\u0096\u0097\u0098\u0099\u009A\u009B\u009C\u009D\u009E\u009F\u00A0\u00C0\u00C2\u00C8\u00CA\u00CB\u00CE\u00CF\u00B4\u02CB\u02C6\u00A8\u02DC\u00D9\u00DB\u20A4\u00AF\u00DD\u00FD\u00B0\u00C7\u00E7\u00D1\u00F1\u00A1\u00BF\u00A4\u00A3\u00A5\u00A7\u0192\u00A2\u00E2\u00EA\u00F4\u00FB\u00E1\u00E9\u00F3\u00FA\u00E0\u00E8\u00F2\u00F9\u00E4\u00EB\u00F6\u00FC\u00C5\u00EE\u00D8\u00C6\u00E5\u00ED\u00F8\u00E6\u00C4\u00EC\u00D6\u00DC\u00C9\u00EF\u00DF\u00D4\u00C1\u00C3\u00E3\u00D0\u00F0\u00CD\u00CC\u00D3\u00D2\u00D5\u00F5\u0160\u0161\u00DA\u0178\u00FF\u00DE\u00FE\u00B7\u00B5\u00B6\u00BE\u2014\u00BC\u00BD\u00AA\u00BA\u00AB\u25A0\u00BB\u00B1\uFFFD\"\n  },\n  \"macintosh\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\u00C4\u00C5\u00C7\u00C9\u00D1\u00D6\u00DC\u00E1\u00E0\u00E2\u00E4\u00E3\u00E5\u00E7\u00E9\u00E8\u00EA\u00EB\u00ED\u00EC\u00EE\u00EF\u00F1\u00F3\u00F2\u00F4\u00F6\u00F5\u00FA\u00F9\u00FB\u00FC\u2020\u00B0\u00A2\u00A3\u00A7\u2022\u00B6\u00DF\u00AE\u00A9\u2122\u00B4\u00A8\u2260\u00C6\u00D8\u221E\u00B1\u2264\u2265\u00A5\u00B5\u2202\u2211\u220F\u03C0\u222B\u00AA\u00BA\u2126\u00E6\u00F8\u00BF\u00A1\u00AC\u221A\u0192\u2248\u2206\u00AB\u00BB\u2026\u00A0\u00C0\u00C3\u00D5\u0152\u0153\u2013\u2014\u201C\u201D\u2018\u2019\u00F7\u25CA\u00FF\u0178\u2044\u00A4\u2039\u203A\uFB01\uFB02\u2021\u00B7\u201A\u201E\u2030\u00C2\u00CA\u00C1\u00CB\u00C8\u00CD\u00CE\u00CF\u00CC\u00D3\u00D4\uFFFD\u00D2\u00DA\u00DB\u00D9\u0131\u02C6\u02DC\u00AF\u02D8\u02D9\u02DA\u00B8\u02DD\u02DB\u02C7\"\n  },\n  \"ascii\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\"\n  },\n  \"tis620\": {\n    \"type\": \"_sbcs\",\n    \"chars\": \"\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\uFFFD\u0E01\u0E02\u0E03\u0E04\u0E05\u0E06\u0E07\u0E08\u0E09\u0E0A\u0E0B\u0E0C\u0E0D\u0E0E\u0E0F\u0E10\u0E11\u0E12\u0E13\u0E14\u0E15\u0E16\u0E17\u0E18\u0E19\u0E1A\u0E1B\u0E1C\u0E1D\u0E1E\u0E1F\u0E20\u0E21\u0E22\u0E23\u0E24\u0E25\u0E26\u0E27\u0E28\u0E29\u0E2A\u0E2B\u0E2C\u0E2D\u0E2E\u0E2F\u0E30\u0E31\u0E32\u0E33\u0E34\u0E35\u0E36\u0E37\u0E38\u0E39\u0E3A\uFFFD\uFFFD\uFFFD\uFFFD\u0E3F\u0E40\u0E41\u0E42\u0E43\u0E44\u0E45\u0E46\u0E47\u0E48\u0E49\u0E4A\u0E4B\u0E4C\u0E4D\u0E4E\u0E4F\u0E50\u0E51\u0E52\u0E53\u0E54\u0E55\u0E56\u0E57\u0E58\u0E59\u0E5A\u0E5B\uFFFD\uFFFD\uFFFD\uFFFD\"\n  }\n}", "\"use strict\";\nvar Buffer = require(\"safer-buffer\").Buffer;\n\n// Multibyte codec. In this scheme, a character is represented by 1 or more bytes.\n// Our codec supports UTF-16 surrogates, extensions for GB18030 and unicode sequences.\n// To save memory and loading time, we read table files only when requested.\n\nexports._dbcs = DBCSCodec;\n\nvar UNASSIGNED = -1,\n    GB18030_CODE = -2,\n    SEQ_START  = -10,\n    NODE_START = -1000,\n    UNASSIGNED_NODE = new Array(0x100),\n    DEF_CHAR = -1;\n\nfor (var i = 0; i < 0x100; i++)\n    UNASSIGNED_NODE[i] = UNASSIGNED;\n\n\n// Class DBCSCodec reads and initializes mapping tables.\nfunction DBCSCodec(codecOptions, iconv) {\n    this.encodingName = codecOptions.encodingName;\n    if (!codecOptions)\n        throw new Error(\"DBCS codec is called without the data.\")\n    if (!codecOptions.table)\n        throw new Error(\"Encoding '\" + this.encodingName + \"' has no data.\");\n\n    // Load tables.\n    var mappingTable = codecOptions.table();\n\n\n    // Decode tables: MBCS -> Unicode.\n\n    // decodeTables is a trie, encoded as an array of arrays of integers. Internal arrays are trie nodes and all have len = 256.\n    // Trie root is decodeTables[0].\n    // Values: >=  0 -> unicode character code. can be > 0xFFFF\n    //         == UNASSIGNED -> unknown/unassigned sequence.\n    //         == GB18030_CODE -> this is the end of a GB18030 4-byte sequence.\n    //         <= NODE_START -> index of the next node in our trie to process next byte.\n    //         <= SEQ_START  -> index of the start of a character code sequence, in decodeTableSeq.\n    this.decodeTables = [];\n    this.decodeTables[0] = UNASSIGNED_NODE.slice(0); // Create root node.\n\n    // Sometimes a MBCS char corresponds to a sequence of unicode chars. We store them as arrays of integers here. \n    this.decodeTableSeq = [];\n\n    // Actual mapping tables consist of chunks. Use them to fill up decode tables.\n    for (var i = 0; i < mappingTable.length; i++)\n        this._addDecodeChunk(mappingTable[i]);\n\n    this.defaultCharUnicode = iconv.defaultCharUnicode;\n\n    \n    // Encode tables: Unicode -> DBCS.\n\n    // `encodeTable` is array mapping from unicode char to encoded char. All its values are integers for performance.\n    // Because it can be sparse, it is represented as array of buckets by 256 chars each. Bucket can be null.\n    // Values: >=  0 -> it is a normal char. Write the value (if <=256 then 1 byte, if <=65536 then 2 bytes, etc.).\n    //         == UNASSIGNED -> no conversion found. Output a default char.\n    //         <= SEQ_START  -> it's an index in encodeTableSeq, see below. The character starts a sequence.\n    this.encodeTable = [];\n    \n    // `encodeTableSeq` is used when a sequence of unicode characters is encoded as a single code. We use a tree of\n    // objects where keys correspond to characters in sequence and leafs are the encoded dbcs values. A special DEF_CHAR key\n    // means end of sequence (needed when one sequence is a strict subsequence of another).\n    // Objects are kept separately from encodeTable to increase performance.\n    this.encodeTableSeq = [];\n\n    // Some chars can be decoded, but need not be encoded.\n    var skipEncodeChars = {};\n    if (codecOptions.encodeSkipVals)\n        for (var i = 0; i < codecOptions.encodeSkipVals.length; i++) {\n            var val = codecOptions.encodeSkipVals[i];\n            if (typeof val === 'number')\n                skipEncodeChars[val] = true;\n            else\n                for (var j = val.from; j <= val.to; j++)\n                    skipEncodeChars[j] = true;\n        }\n        \n    // Use decode trie to recursively fill out encode tables.\n    this._fillEncodeTable(0, 0, skipEncodeChars);\n\n    // Add more encoding pairs when needed.\n    if (codecOptions.encodeAdd) {\n        for (var uChar in codecOptions.encodeAdd)\n            if (Object.prototype.hasOwnProperty.call(codecOptions.encodeAdd, uChar))\n                this._setEncodeChar(uChar.charCodeAt(0), codecOptions.encodeAdd[uChar]);\n    }\n\n    this.defCharSB  = this.encodeTable[0][iconv.defaultCharSingleByte.charCodeAt(0)];\n    if (this.defCharSB === UNASSIGNED) this.defCharSB = this.encodeTable[0]['?'];\n    if (this.defCharSB === UNASSIGNED) this.defCharSB = \"?\".charCodeAt(0);\n\n\n    // Load & create GB18030 tables when needed.\n    if (typeof codecOptions.gb18030 === 'function') {\n        this.gb18030 = codecOptions.gb18030(); // Load GB18030 ranges.\n\n        // Add GB18030 decode tables.\n        var thirdByteNodeIdx = this.decodeTables.length;\n        var thirdByteNode = this.decodeTables[thirdByteNodeIdx] = UNASSIGNED_NODE.slice(0);\n\n        var fourthByteNodeIdx = this.decodeTables.length;\n        var fourthByteNode = this.decodeTables[fourthByteNodeIdx] = UNASSIGNED_NODE.slice(0);\n\n        for (var i = 0x81; i <= 0xFE; i++) {\n            var secondByteNodeIdx = NODE_START - this.decodeTables[0][i];\n            var secondByteNode = this.decodeTables[secondByteNodeIdx];\n            for (var j = 0x30; j <= 0x39; j++)\n                secondByteNode[j] = NODE_START - thirdByteNodeIdx;\n        }\n        for (var i = 0x81; i <= 0xFE; i++)\n            thirdByteNode[i] = NODE_START - fourthByteNodeIdx;\n        for (var i = 0x30; i <= 0x39; i++)\n            fourthByteNode[i] = GB18030_CODE\n    }        \n}\n\nDBCSCodec.prototype.encoder = DBCSEncoder;\nDBCSCodec.prototype.decoder = DBCSDecoder;\n\n// Decoder helpers\nDBCSCodec.prototype._getDecodeTrieNode = function(addr) {\n    var bytes = [];\n    for (; addr > 0; addr >>= 8)\n        bytes.push(addr & 0xFF);\n    if (bytes.length == 0)\n        bytes.push(0);\n\n    var node = this.decodeTables[0];\n    for (var i = bytes.length-1; i > 0; i--) { // Traverse nodes deeper into the trie.\n        var val = node[bytes[i]];\n\n        if (val == UNASSIGNED) { // Create new node.\n            node[bytes[i]] = NODE_START - this.decodeTables.length;\n            this.decodeTables.push(node = UNASSIGNED_NODE.slice(0));\n        }\n        else if (val <= NODE_START) { // Existing node.\n            node = this.decodeTables[NODE_START - val];\n        }\n        else\n            throw new Error(\"Overwrite byte in \" + this.encodingName + \", addr: \" + addr.toString(16));\n    }\n    return node;\n}\n\n\nDBCSCodec.prototype._addDecodeChunk = function(chunk) {\n    // First element of chunk is the hex mbcs code where we start.\n    var curAddr = parseInt(chunk[0], 16);\n\n    // Choose the decoding node where we'll write our chars.\n    var writeTable = this._getDecodeTrieNode(curAddr);\n    curAddr = curAddr & 0xFF;\n\n    // Write all other elements of the chunk to the table.\n    for (var k = 1; k < chunk.length; k++) {\n        var part = chunk[k];\n        if (typeof part === \"string\") { // String, write as-is.\n            for (var l = 0; l < part.length;) {\n                var code = part.charCodeAt(l++);\n                if (0xD800 <= code && code < 0xDC00) { // Decode surrogate\n                    var codeTrail = part.charCodeAt(l++);\n                    if (0xDC00 <= codeTrail && codeTrail < 0xE000)\n                        writeTable[curAddr++] = 0x10000 + (code - 0xD800) * 0x400 + (codeTrail - 0xDC00);\n                    else\n                        throw new Error(\"Incorrect surrogate pair in \"  + this.encodingName + \" at chunk \" + chunk[0]);\n                }\n                else if (0x0FF0 < code && code <= 0x0FFF) { // Character sequence (our own encoding used)\n                    var len = 0xFFF - code + 2;\n                    var seq = [];\n                    for (var m = 0; m < len; m++)\n                        seq.push(part.charCodeAt(l++)); // Simple variation: don't support surrogates or subsequences in seq.\n\n                    writeTable[curAddr++] = SEQ_START - this.decodeTableSeq.length;\n                    this.decodeTableSeq.push(seq);\n                }\n                else\n                    writeTable[curAddr++] = code; // Basic char\n            }\n        } \n        else if (typeof part === \"number\") { // Integer, meaning increasing sequence starting with prev character.\n            var charCode = writeTable[curAddr - 1] + 1;\n            for (var l = 0; l < part; l++)\n                writeTable[curAddr++] = charCode++;\n        }\n        else\n            throw new Error(\"Incorrect type '\" + typeof part + \"' given in \"  + this.encodingName + \" at chunk \" + chunk[0]);\n    }\n    if (curAddr > 0xFF)\n        throw new Error(\"Incorrect chunk in \"  + this.encodingName + \" at addr \" + chunk[0] + \": too long\" + curAddr);\n}\n\n// Encoder helpers\nDBCSCodec.prototype._getEncodeBucket = function(uCode) {\n    var high = uCode >> 8; // This could be > 0xFF because of astral characters.\n    if (this.encodeTable[high] === undefined)\n        this.encodeTable[high] = UNASSIGNED_NODE.slice(0); // Create bucket on demand.\n    return this.encodeTable[high];\n}\n\nDBCSCodec.prototype._setEncodeChar = function(uCode, dbcsCode) {\n    var bucket = this._getEncodeBucket(uCode);\n    var low = uCode & 0xFF;\n    if (bucket[low] <= SEQ_START)\n        this.encodeTableSeq[SEQ_START-bucket[low]][DEF_CHAR] = dbcsCode; // There's already a sequence, set a single-char subsequence of it.\n    else if (bucket[low] == UNASSIGNED)\n        bucket[low] = dbcsCode;\n}\n\nDBCSCodec.prototype._setEncodeSequence = function(seq, dbcsCode) {\n    \n    // Get the root of character tree according to first character of the sequence.\n    var uCode = seq[0];\n    var bucket = this._getEncodeBucket(uCode);\n    var low = uCode & 0xFF;\n\n    var node;\n    if (bucket[low] <= SEQ_START) {\n        // There's already a sequence with  - use it.\n        node = this.encodeTableSeq[SEQ_START-bucket[low]];\n    }\n    else {\n        // There was no sequence object - allocate a new one.\n        node = {};\n        if (bucket[low] !== UNASSIGNED) node[DEF_CHAR] = bucket[low]; // If a char was set before - make it a single-char subsequence.\n        bucket[low] = SEQ_START - this.encodeTableSeq.length;\n        this.encodeTableSeq.push(node);\n    }\n\n    // Traverse the character tree, allocating new nodes as needed.\n    for (var j = 1; j < seq.length-1; j++) {\n        var oldVal = node[uCode];\n        if (typeof oldVal === 'object')\n            node = oldVal;\n        else {\n            node = node[uCode] = {}\n            if (oldVal !== undefined)\n                node[DEF_CHAR] = oldVal\n        }\n    }\n\n    // Set the leaf to given dbcsCode.\n    uCode = seq[seq.length-1];\n    node[uCode] = dbcsCode;\n}\n\nDBCSCodec.prototype._fillEncodeTable = function(nodeIdx, prefix, skipEncodeChars) {\n    var node = this.decodeTables[nodeIdx];\n    for (var i = 0; i < 0x100; i++) {\n        var uCode = node[i];\n        var mbCode = prefix + i;\n        if (skipEncodeChars[mbCode])\n            continue;\n\n        if (uCode >= 0)\n            this._setEncodeChar(uCode, mbCode);\n        else if (uCode <= NODE_START)\n            this._fillEncodeTable(NODE_START - uCode, mbCode << 8, skipEncodeChars);\n        else if (uCode <= SEQ_START)\n            this._setEncodeSequence(this.decodeTableSeq[SEQ_START - uCode], mbCode);\n    }\n}\n\n\n\n// == Encoder ==================================================================\n\nfunction DBCSEncoder(options, codec) {\n    // Encoder state\n    this.leadSurrogate = -1;\n    this.seqObj = undefined;\n    \n    // Static data\n    this.encodeTable = codec.encodeTable;\n    this.encodeTableSeq = codec.encodeTableSeq;\n    this.defaultCharSingleByte = codec.defCharSB;\n    this.gb18030 = codec.gb18030;\n}\n\nDBCSEncoder.prototype.write = function(str) {\n    var newBuf = Buffer.alloc(str.length * (this.gb18030 ? 4 : 3)),\n        leadSurrogate = this.leadSurrogate,\n        seqObj = this.seqObj, nextChar = -1,\n        i = 0, j = 0;\n\n    while (true) {\n        // 0. Get next character.\n        if (nextChar === -1) {\n            if (i == str.length) break;\n            var uCode = str.charCodeAt(i++);\n        }\n        else {\n            var uCode = nextChar;\n            nextChar = -1;    \n        }\n\n        // 1. Handle surrogates.\n        if (0xD800 <= uCode && uCode < 0xE000) { // Char is one of surrogates.\n            if (uCode < 0xDC00) { // We've got lead surrogate.\n                if (leadSurrogate === -1) {\n                    leadSurrogate = uCode;\n                    continue;\n                } else {\n                    leadSurrogate = uCode;\n                    // Double lead surrogate found.\n                    uCode = UNASSIGNED;\n                }\n            } else { // We've got trail surrogate.\n                if (leadSurrogate !== -1) {\n                    uCode = 0x10000 + (leadSurrogate - 0xD800) * 0x400 + (uCode - 0xDC00);\n                    leadSurrogate = -1;\n                } else {\n                    // Incomplete surrogate pair - only trail surrogate found.\n                    uCode = UNASSIGNED;\n                }\n                \n            }\n        }\n        else if (leadSurrogate !== -1) {\n            // Incomplete surrogate pair - only lead surrogate found.\n            nextChar = uCode; uCode = UNASSIGNED; // Write an error, then current char.\n            leadSurrogate = -1;\n        }\n\n        // 2. Convert uCode character.\n        var dbcsCode = UNASSIGNED;\n        if (seqObj !== undefined && uCode != UNASSIGNED) { // We are in the middle of the sequence\n            var resCode = seqObj[uCode];\n            if (typeof resCode === 'object') { // Sequence continues.\n                seqObj = resCode;\n                continue;\n\n            } else if (typeof resCode == 'number') { // Sequence finished. Write it.\n                dbcsCode = resCode;\n\n            } else if (resCode == undefined) { // Current character is not part of the sequence.\n\n                // Try default character for this sequence\n                resCode = seqObj[DEF_CHAR];\n                if (resCode !== undefined) {\n                    dbcsCode = resCode; // Found. Write it.\n                    nextChar = uCode; // Current character will be written too in the next iteration.\n\n                } else {\n                    // TODO: What if we have no default? (resCode == undefined)\n                    // Then, we should write first char of the sequence as-is and try the rest recursively.\n                    // Didn't do it for now because no encoding has this situation yet.\n                    // Currently, just skip the sequence and write current char.\n                }\n            }\n            seqObj = undefined;\n        }\n        else if (uCode >= 0) {  // Regular character\n            var subtable = this.encodeTable[uCode >> 8];\n            if (subtable !== undefined)\n                dbcsCode = subtable[uCode & 0xFF];\n            \n            if (dbcsCode <= SEQ_START) { // Sequence start\n                seqObj = this.encodeTableSeq[SEQ_START-dbcsCode];\n                continue;\n            }\n\n            if (dbcsCode == UNASSIGNED && this.gb18030) {\n                // Use GB18030 algorithm to find character(s) to write.\n                var idx = findIdx(this.gb18030.uChars, uCode);\n                if (idx != -1) {\n                    var dbcsCode = this.gb18030.gbChars[idx] + (uCode - this.gb18030.uChars[idx]);\n                    newBuf[j++] = 0x81 + Math.floor(dbcsCode / 12600); dbcsCode = dbcsCode % 12600;\n                    newBuf[j++] = 0x30 + Math.floor(dbcsCode / 1260); dbcsCode = dbcsCode % 1260;\n                    newBuf[j++] = 0x81 + Math.floor(dbcsCode / 10); dbcsCode = dbcsCode % 10;\n                    newBuf[j++] = 0x30 + dbcsCode;\n                    continue;\n                }\n            }\n        }\n\n        // 3. Write dbcsCode character.\n        if (dbcsCode === UNASSIGNED)\n            dbcsCode = this.defaultCharSingleByte;\n        \n        if (dbcsCode < 0x100) {\n            newBuf[j++] = dbcsCode;\n        }\n        else if (dbcsCode < 0x10000) {\n            newBuf[j++] = dbcsCode >> 8;   // high byte\n            newBuf[j++] = dbcsCode & 0xFF; // low byte\n        }\n        else {\n            newBuf[j++] = dbcsCode >> 16;\n            newBuf[j++] = (dbcsCode >> 8) & 0xFF;\n            newBuf[j++] = dbcsCode & 0xFF;\n        }\n    }\n\n    this.seqObj = seqObj;\n    this.leadSurrogate = leadSurrogate;\n    return newBuf.slice(0, j);\n}\n\nDBCSEncoder.prototype.end = function() {\n    if (this.leadSurrogate === -1 && this.seqObj === undefined)\n        return; // All clean. Most often case.\n\n    var newBuf = Buffer.alloc(10), j = 0;\n\n    if (this.seqObj) { // We're in the sequence.\n        var dbcsCode = this.seqObj[DEF_CHAR];\n        if (dbcsCode !== undefined) { // Write beginning of the sequence.\n            if (dbcsCode < 0x100) {\n                newBuf[j++] = dbcsCode;\n            }\n            else {\n                newBuf[j++] = dbcsCode >> 8;   // high byte\n                newBuf[j++] = dbcsCode & 0xFF; // low byte\n            }\n        } else {\n            // See todo above.\n        }\n        this.seqObj = undefined;\n    }\n\n    if (this.leadSurrogate !== -1) {\n        // Incomplete surrogate pair - only lead surrogate found.\n        newBuf[j++] = this.defaultCharSingleByte;\n        this.leadSurrogate = -1;\n    }\n    \n    return newBuf.slice(0, j);\n}\n\n// Export for testing\nDBCSEncoder.prototype.findIdx = findIdx;\n\n\n// == Decoder ==================================================================\n\nfunction DBCSDecoder(options, codec) {\n    // Decoder state\n    this.nodeIdx = 0;\n    this.prevBuf = Buffer.alloc(0);\n\n    // Static data\n    this.decodeTables = codec.decodeTables;\n    this.decodeTableSeq = codec.decodeTableSeq;\n    this.defaultCharUnicode = codec.defaultCharUnicode;\n    this.gb18030 = codec.gb18030;\n}\n\nDBCSDecoder.prototype.write = function(buf) {\n    var newBuf = Buffer.alloc(buf.length*2),\n        nodeIdx = this.nodeIdx, \n        prevBuf = this.prevBuf, prevBufOffset = this.prevBuf.length,\n        seqStart = -this.prevBuf.length, // idx of the start of current parsed sequence.\n        uCode;\n\n    if (prevBufOffset > 0) // Make prev buf overlap a little to make it easier to slice later.\n        prevBuf = Buffer.concat([prevBuf, buf.slice(0, 10)]);\n    \n    for (var i = 0, j = 0; i < buf.length; i++) {\n        var curByte = (i >= 0) ? buf[i] : prevBuf[i + prevBufOffset];\n\n        // Lookup in current trie node.\n        var uCode = this.decodeTables[nodeIdx][curByte];\n\n        if (uCode >= 0) { \n            // Normal character, just use it.\n        }\n        else if (uCode === UNASSIGNED) { // Unknown char.\n            // TODO: Callback with seq.\n            //var curSeq = (seqStart >= 0) ? buf.slice(seqStart, i+1) : prevBuf.slice(seqStart + prevBufOffset, i+1 + prevBufOffset);\n            i = seqStart; // Try to parse again, after skipping first byte of the sequence ('i' will be incremented by 'for' cycle).\n            uCode = this.defaultCharUnicode.charCodeAt(0);\n        }\n        else if (uCode === GB18030_CODE) {\n            var curSeq = (seqStart >= 0) ? buf.slice(seqStart, i+1) : prevBuf.slice(seqStart + prevBufOffset, i+1 + prevBufOffset);\n            var ptr = (curSeq[0]-0x81)*12600 + (curSeq[1]-0x30)*1260 + (curSeq[2]-0x81)*10 + (curSeq[3]-0x30);\n            var idx = findIdx(this.gb18030.gbChars, ptr);\n            uCode = this.gb18030.uChars[idx] + ptr - this.gb18030.gbChars[idx];\n        }\n        else if (uCode <= NODE_START) { // Go to next trie node.\n            nodeIdx = NODE_START - uCode;\n            continue;\n        }\n        else if (uCode <= SEQ_START) { // Output a sequence of chars.\n            var seq = this.decodeTableSeq[SEQ_START - uCode];\n            for (var k = 0; k < seq.length - 1; k++) {\n                uCode = seq[k];\n                newBuf[j++] = uCode & 0xFF;\n                newBuf[j++] = uCode >> 8;\n            }\n            uCode = seq[seq.length-1];\n        }\n        else\n            throw new Error(\"iconv-lite internal error: invalid decoding table value \" + uCode + \" at \" + nodeIdx + \"/\" + curByte);\n\n        // Write the character to buffer, handling higher planes using surrogate pair.\n        if (uCode > 0xFFFF) { \n            uCode -= 0x10000;\n            var uCodeLead = 0xD800 + Math.floor(uCode / 0x400);\n            newBuf[j++] = uCodeLead & 0xFF;\n            newBuf[j++] = uCodeLead >> 8;\n\n            uCode = 0xDC00 + uCode % 0x400;\n        }\n        newBuf[j++] = uCode & 0xFF;\n        newBuf[j++] = uCode >> 8;\n\n        // Reset trie node.\n        nodeIdx = 0; seqStart = i+1;\n    }\n\n    this.nodeIdx = nodeIdx;\n    this.prevBuf = (seqStart >= 0) ? buf.slice(seqStart) : prevBuf.slice(seqStart + prevBufOffset);\n    return newBuf.slice(0, j).toString('ucs2');\n}\n\nDBCSDecoder.prototype.end = function() {\n    var ret = '';\n\n    // Try to parse all remaining chars.\n    while (this.prevBuf.length > 0) {\n        // Skip 1 character in the buffer.\n        ret += this.defaultCharUnicode;\n        var buf = this.prevBuf.slice(1);\n\n        // Parse remaining as usual.\n        this.prevBuf = Buffer.alloc(0);\n        this.nodeIdx = 0;\n        if (buf.length > 0)\n            ret += this.write(buf);\n    }\n\n    this.nodeIdx = 0;\n    return ret;\n}\n\n// Binary search for GB18030. Returns largest i such that table[i] <= val.\nfunction findIdx(table, val) {\n    if (table[0] > val)\n        return -1;\n\n    var l = 0, r = table.length;\n    while (l < r-1) { // always table[l] <= val < table[r]\n        var mid = l + Math.floor((r-l+1)/2);\n        if (table[mid] <= val)\n            l = mid;\n        else\n            r = mid;\n    }\n    return l;\n}\n\n", "[\n[\"0\",\"\\u0000\",128],\n[\"a1\",\"\uFF61\",62],\n[\"8140\",\"\u3000\u3001\u3002\uFF0C\uFF0E\u30FB\uFF1A\uFF1B\uFF1F\uFF01\u309B\u309C\u00B4\uFF40\u00A8\uFF3E\uFFE3\uFF3F\u30FD\u30FE\u309D\u309E\u3003\u4EDD\u3005\u3006\u3007\u30FC\u2015\u2010\uFF0F\uFF3C\uFF5E\u2225\uFF5C\u2026\u2025\u2018\u2019\u201C\u201D\uFF08\uFF09\u3014\u3015\uFF3B\uFF3D\uFF5B\uFF5D\u3008\",9,\"\uFF0B\uFF0D\u00B1\u00D7\"],\n[\"8180\",\"\u00F7\uFF1D\u2260\uFF1C\uFF1E\u2266\u2267\u221E\u2234\u2642\u2640\u00B0\u2032\u2033\u2103\uFFE5\uFF04\uFFE0\uFFE1\uFF05\uFF03\uFF06\uFF0A\uFF20\u00A7\u2606\u2605\u25CB\u25CF\u25CE\u25C7\u25C6\u25A1\u25A0\u25B3\u25B2\u25BD\u25BC\u203B\u3012\u2192\u2190\u2191\u2193\u3013\"],\n[\"81b8\",\"\u2208\u220B\u2286\u2287\u2282\u2283\u222A\u2229\"],\n[\"81c8\",\"\u2227\u2228\uFFE2\u21D2\u21D4\u2200\u2203\"],\n[\"81da\",\"\u2220\u22A5\u2312\u2202\u2207\u2261\u2252\u226A\u226B\u221A\u223D\u221D\u2235\u222B\u222C\"],\n[\"81f0\",\"\u212B\u2030\u266F\u266D\u266A\u2020\u2021\u00B6\"],\n[\"81fc\",\"\u25EF\"],\n[\"824f\",\"\uFF10\",9],\n[\"8260\",\"\uFF21\",25],\n[\"8281\",\"\uFF41\",25],\n[\"829f\",\"\u3041\",82],\n[\"8340\",\"\u30A1\",62],\n[\"8380\",\"\u30E0\",22],\n[\"839f\",\"\u0391\",16,\"\u03A3\",6],\n[\"83bf\",\"\u03B1\",16,\"\u03C3\",6],\n[\"8440\",\"\u0410\",5,\"\u0401\u0416\",25],\n[\"8470\",\"\u0430\",5,\"\u0451\u0436\",7],\n[\"8480\",\"\u043E\",17],\n[\"849f\",\"\u2500\u2502\u250C\u2510\u2518\u2514\u251C\u252C\u2524\u2534\u253C\u2501\u2503\u250F\u2513\u251B\u2517\u2523\u2533\u252B\u253B\u254B\u2520\u252F\u2528\u2537\u253F\u251D\u2530\u2525\u2538\u2542\"],\n[\"8740\",\"\u2460\",19,\"\u2160\",9],\n[\"875f\",\"\u3349\u3314\u3322\u334D\u3318\u3327\u3303\u3336\u3351\u3357\u330D\u3326\u3323\u332B\u334A\u333B\u339C\u339D\u339E\u338E\u338F\u33C4\u33A1\"],\n[\"877e\",\"\u337B\"],\n[\"8780\",\"\u301D\u301F\u2116\u33CD\u2121\u32A4\",4,\"\u3231\u3232\u3239\u337E\u337D\u337C\u2252\u2261\u222B\u222E\u2211\u221A\u22A5\u2220\u221F\u22BF\u2235\u2229\u222A\"],\n[\"889f\",\"\u4E9C\u5516\u5A03\u963F\u54C0\u611B\u6328\u59F6\u9022\u8475\u831C\u7A50\u60AA\u63E1\u6E25\u65ED\u8466\u82A6\u9BF5\u6893\u5727\u65A1\u6271\u5B9B\u59D0\u867B\u98F4\u7D62\u7DBE\u9B8E\u6216\u7C9F\u88B7\u5B89\u5EB5\u6309\u6697\u6848\u95C7\u978D\u674F\u4EE5\u4F0A\u4F4D\u4F9D\u5049\u56F2\u5937\u59D4\u5A01\u5C09\u60DF\u610F\u6170\u6613\u6905\u70BA\u754F\u7570\u79FB\u7DAD\u7DEF\u80C3\u840E\u8863\u8B02\u9055\u907A\u533B\u4E95\u4EA5\u57DF\u80B2\u90C1\u78EF\u4E00\u58F1\u6EA2\u9038\u7A32\u8328\u828B\u9C2F\u5141\u5370\u54BD\u54E1\u56E0\u59FB\u5F15\u98F2\u6DEB\u80E4\u852D\"],\n[\"8940\",\"\u9662\u9670\u96A0\u97FB\u540B\u53F3\u5B87\u70CF\u7FBD\u8FC2\u96E8\u536F\u9D5C\u7ABA\u4E11\u7893\u81FC\u6E26\u5618\u5504\u6B1D\u851A\u9C3B\u59E5\u53A9\u6D66\u74DC\u958F\u5642\u4E91\u904B\u96F2\u834F\u990C\u53E1\u55B6\u5B30\u5F71\u6620\u66F3\u6804\u6C38\u6CF3\u6D29\u745B\u76C8\u7A4E\u9834\u82F1\u885B\u8A60\u92ED\u6DB2\u75AB\u76CA\u99C5\u60A6\u8B01\u8D8A\u95B2\u698E\u53AD\u5186\"],\n[\"8980\",\"\u5712\u5830\u5944\u5BB4\u5EF6\u6028\u63A9\u63F4\u6CBF\u6F14\u708E\u7114\u7159\u71D5\u733F\u7E01\u8276\u82D1\u8597\u9060\u925B\u9D1B\u5869\u65BC\u6C5A\u7525\u51F9\u592E\u5965\u5F80\u5FDC\u62BC\u65FA\u6A2A\u6B27\u6BB4\u738B\u7FC1\u8956\u9D2C\u9D0E\u9EC4\u5CA1\u6C96\u837B\u5104\u5C4B\u61B6\u81C6\u6876\u7261\u4E59\u4FFA\u5378\u6069\u6E29\u7A4F\u97F3\u4E0B\u5316\u4EEE\u4F55\u4F3D\u4FA1\u4F73\u52A0\u53EF\u5609\u590F\u5AC1\u5BB6\u5BE1\u79D1\u6687\u679C\u67B6\u6B4C\u6CB3\u706B\u73C2\u798D\u79BE\u7A3C\u7B87\u82B1\u82DB\u8304\u8377\u83EF\u83D3\u8766\u8AB2\u5629\u8CA8\u8FE6\u904E\u971E\u868A\u4FC4\u5CE8\u6211\u7259\u753B\u81E5\u82BD\u86FE\u8CC0\u96C5\u9913\u99D5\u4ECB\u4F1A\u89E3\u56DE\u584A\u58CA\u5EFB\u5FEB\u602A\u6094\u6062\u61D0\u6212\u62D0\u6539\"],\n[\"8a40\",\"\u9B41\u6666\u68B0\u6D77\u7070\u754C\u7686\u7D75\u82A5\u87F9\u958B\u968E\u8C9D\u51F1\u52BE\u5916\u54B3\u5BB3\u5D16\u6168\u6982\u6DAF\u788D\u84CB\u8857\u8A72\u93A7\u9AB8\u6D6C\u99A8\u86D9\u57A3\u67FF\u86CE\u920E\u5283\u5687\u5404\u5ED3\u62E1\u64B9\u683C\u6838\u6BBB\u7372\u78BA\u7A6B\u899A\u89D2\u8D6B\u8F03\u90ED\u95A3\u9694\u9769\u5B66\u5CB3\u697D\u984D\u984E\u639B\u7B20\u6A2B\"],\n[\"8a80\",\"\u6A7F\u68B6\u9C0D\u6F5F\u5272\u559D\u6070\u62EC\u6D3B\u6E07\u6ED1\u845B\u8910\u8F44\u4E14\u9C39\u53F6\u691B\u6A3A\u9784\u682A\u515C\u7AC3\u84B2\u91DC\u938C\u565B\u9D28\u6822\u8305\u8431\u7CA5\u5208\u82C5\u74E6\u4E7E\u4F83\u51A0\u5BD2\u520A\u52D8\u52E7\u5DFB\u559A\u582A\u59E6\u5B8C\u5B98\u5BDB\u5E72\u5E79\u60A3\u611F\u6163\u61BE\u63DB\u6562\u67D1\u6853\u68FA\u6B3E\u6B53\u6C57\u6F22\u6F97\u6F45\u74B0\u7518\u76E3\u770B\u7AFF\u7BA1\u7C21\u7DE9\u7F36\u7FF0\u809D\u8266\u839E\u89B3\u8ACC\u8CAB\u9084\u9451\u9593\u9591\u95A2\u9665\u97D3\u9928\u8218\u4E38\u542B\u5CB8\u5DCC\u73A9\u764C\u773C\u5CA9\u7FEB\u8D0B\u96C1\u9811\u9854\u9858\u4F01\u4F0E\u5371\u559C\u5668\u57FA\u5947\u5B09\u5BC4\u5C90\u5E0C\u5E7E\u5FCC\u63EE\u673A\u65D7\u65E2\u671F\u68CB\u68C4\"],\n[\"8b40\",\"\u6A5F\u5E30\u6BC5\u6C17\u6C7D\u757F\u7948\u5B63\u7A00\u7D00\u5FBD\u898F\u8A18\u8CB4\u8D77\u8ECC\u8F1D\u98E2\u9A0E\u9B3C\u4E80\u507D\u5100\u5993\u5B9C\u622F\u6280\u64EC\u6B3A\u72A0\u7591\u7947\u7FA9\u87FB\u8ABC\u8B70\u63AC\u83CA\u97A0\u5409\u5403\u55AB\u6854\u6A58\u8A70\u7827\u6775\u9ECD\u5374\u5BA2\u811A\u8650\u9006\u4E18\u4E45\u4EC7\u4F11\u53CA\u5438\u5BAE\u5F13\u6025\u6551\"],\n[\"8b80\",\"\u673D\u6C42\u6C72\u6CE3\u7078\u7403\u7A76\u7AAE\u7B08\u7D1A\u7CFE\u7D66\u65E7\u725B\u53BB\u5C45\u5DE8\u62D2\u62E0\u6319\u6E20\u865A\u8A31\u8DDD\u92F8\u6F01\u79A6\u9B5A\u4EA8\u4EAB\u4EAC\u4F9B\u4FA0\u50D1\u5147\u7AF6\u5171\u51F6\u5354\u5321\u537F\u53EB\u55AC\u5883\u5CE1\u5F37\u5F4A\u602F\u6050\u606D\u631F\u6559\u6A4B\u6CC1\u72C2\u72ED\u77EF\u80F8\u8105\u8208\u854E\u90F7\u93E1\u97FF\u9957\u9A5A\u4EF0\u51DD\u5C2D\u6681\u696D\u5C40\u66F2\u6975\u7389\u6850\u7C81\u50C5\u52E4\u5747\u5DFE\u9326\u65A4\u6B23\u6B3D\u7434\u7981\u79BD\u7B4B\u7DCA\u82B9\u83CC\u887F\u895F\u8B39\u8FD1\u91D1\u541F\u9280\u4E5D\u5036\u53E5\u533A\u72D7\u7396\u77E9\u82E6\u8EAF\u99C6\u99C8\u99D2\u5177\u611A\u865E\u55B0\u7A7A\u5076\u5BD3\u9047\u9685\u4E32\u6ADB\u91E7\u5C51\u5C48\"],\n[\"8c40\",\"\u6398\u7A9F\u6C93\u9774\u8F61\u7AAA\u718A\u9688\u7C82\u6817\u7E70\u6851\u936C\u52F2\u541B\u85AB\u8A13\u7FA4\u8ECD\u90E1\u5366\u8888\u7941\u4FC2\u50BE\u5211\u5144\u5553\u572D\u73EA\u578B\u5951\u5F62\u5F84\u6075\u6176\u6167\u61A9\u63B2\u643A\u656C\u666F\u6842\u6E13\u7566\u7A3D\u7CFB\u7D4C\u7D99\u7E4B\u7F6B\u830E\u834A\u86CD\u8A08\u8A63\u8B66\u8EFD\u981A\u9D8F\u82B8\u8FCE\u9BE8\"],\n[\"8c80\",\"\u5287\u621F\u6483\u6FC0\u9699\u6841\u5091\u6B20\u6C7A\u6F54\u7A74\u7D50\u8840\u8A23\u6708\u4EF6\u5039\u5026\u5065\u517C\u5238\u5263\u55A7\u570F\u5805\u5ACC\u5EFA\u61B2\u61F8\u62F3\u6372\u691C\u6A29\u727D\u72AC\u732E\u7814\u786F\u7D79\u770C\u80A9\u898B\u8B19\u8CE2\u8ED2\u9063\u9375\u967A\u9855\u9A13\u9E78\u5143\u539F\u53B3\u5E7B\u5F26\u6E1B\u6E90\u7384\u73FE\u7D43\u8237\u8A00\u8AFA\u9650\u4E4E\u500B\u53E4\u547C\u56FA\u59D1\u5B64\u5DF1\u5EAB\u5F27\u6238\u6545\u67AF\u6E56\u72D0\u7CCA\u88B4\u80A1\u80E1\u83F0\u864E\u8A87\u8DE8\u9237\u96C7\u9867\u9F13\u4E94\u4E92\u4F0D\u5348\u5449\u543E\u5A2F\u5F8C\u5FA1\u609F\u68A7\u6A8E\u745A\u7881\u8A9E\u8AA4\u8B77\u9190\u4E5E\u9BC9\u4EA4\u4F7C\u4FAF\u5019\u5016\u5149\u516C\u529F\u52B9\u52FE\u539A\u53E3\u5411\"],\n[\"8d40\",\"\u540E\u5589\u5751\u57A2\u597D\u5B54\u5B5D\u5B8F\u5DE5\u5DE7\u5DF7\u5E78\u5E83\u5E9A\u5EB7\u5F18\u6052\u614C\u6297\u62D8\u63A7\u653B\u6602\u6643\u66F4\u676D\u6821\u6897\u69CB\u6C5F\u6D2A\u6D69\u6E2F\u6E9D\u7532\u7687\u786C\u7A3F\u7CE0\u7D05\u7D18\u7D5E\u7DB1\u8015\u8003\u80AF\u80B1\u8154\u818F\u822A\u8352\u884C\u8861\u8B1B\u8CA2\u8CFC\u90CA\u9175\u9271\u783F\u92FC\u95A4\u964D\"],\n[\"8d80\",\"\u9805\u9999\u9AD8\u9D3B\u525B\u52AB\u53F7\u5408\u58D5\u62F7\u6FE0\u8C6A\u8F5F\u9EB9\u514B\u523B\u544A\u56FD\u7A40\u9177\u9D60\u9ED2\u7344\u6F09\u8170\u7511\u5FFD\u60DA\u9AA8\u72DB\u8FBC\u6B64\u9803\u4ECA\u56F0\u5764\u58BE\u5A5A\u6068\u61C7\u660F\u6606\u6839\u68B1\u6DF7\u75D5\u7D3A\u826E\u9B42\u4E9B\u4F50\u53C9\u5506\u5D6F\u5DE6\u5DEE\u67FB\u6C99\u7473\u7802\u8A50\u9396\u88DF\u5750\u5EA7\u632B\u50B5\u50AC\u518D\u6700\u54C9\u585E\u59BB\u5BB0\u5F69\u624D\u63A1\u683D\u6B73\u6E08\u707D\u91C7\u7280\u7815\u7826\u796D\u658E\u7D30\u83DC\u88C1\u8F09\u969B\u5264\u5728\u6750\u7F6A\u8CA1\u51B4\u5742\u962A\u583A\u698A\u80B4\u54B2\u5D0E\u57FC\u7895\u9DFA\u4F5C\u524A\u548B\u643E\u6628\u6714\u67F5\u7A84\u7B56\u7D22\u932F\u685C\u9BAD\u7B39\u5319\u518A\u5237\"],\n[\"8e40\",\"\u5BDF\u62F6\u64AE\u64E6\u672D\u6BBA\u85A9\u96D1\u7690\u9BD6\u634C\u9306\u9BAB\u76BF\u6652\u4E09\u5098\u53C2\u5C71\u60E8\u6492\u6563\u685F\u71E6\u73CA\u7523\u7B97\u7E82\u8695\u8B83\u8CDB\u9178\u9910\u65AC\u66AB\u6B8B\u4ED5\u4ED4\u4F3A\u4F7F\u523A\u53F8\u53F2\u55E3\u56DB\u58EB\u59CB\u59C9\u59FF\u5B50\u5C4D\u5E02\u5E2B\u5FD7\u601D\u6307\u652F\u5B5C\u65AF\u65BD\u65E8\u679D\u6B62\"],\n[\"8e80\",\"\u6B7B\u6C0F\u7345\u7949\u79C1\u7CF8\u7D19\u7D2B\u80A2\u8102\u81F3\u8996\u8A5E\u8A69\u8A66\u8A8C\u8AEE\u8CC7\u8CDC\u96CC\u98FC\u6B6F\u4E8B\u4F3C\u4F8D\u5150\u5B57\u5BFA\u6148\u6301\u6642\u6B21\u6ECB\u6CBB\u723E\u74BD\u75D4\u78C1\u793A\u800C\u8033\u81EA\u8494\u8F9E\u6C50\u9E7F\u5F0F\u8B58\u9D2B\u7AFA\u8EF8\u5B8D\u96EB\u4E03\u53F1\u57F7\u5931\u5AC9\u5BA4\u6089\u6E7F\u6F06\u75BE\u8CEA\u5B9F\u8500\u7BE0\u5072\u67F4\u829D\u5C61\u854A\u7E1E\u820E\u5199\u5C04\u6368\u8D66\u659C\u716E\u793E\u7D17\u8005\u8B1D\u8ECA\u906E\u86C7\u90AA\u501F\u52FA\u5C3A\u6753\u707C\u7235\u914C\u91C8\u932B\u82E5\u5BC2\u5F31\u60F9\u4E3B\u53D6\u5B88\u624B\u6731\u6B8A\u72E9\u73E0\u7A2E\u816B\u8DA3\u9152\u9996\u5112\u53D7\u546A\u5BFF\u6388\u6A39\u7DAC\u9700\u56DA\u53CE\u5468\"],\n[\"8f40\",\"\u5B97\u5C31\u5DDE\u4FEE\u6101\u62FE\u6D32\u79C0\u79CB\u7D42\u7E4D\u7FD2\u81ED\u821F\u8490\u8846\u8972\u8B90\u8E74\u8F2F\u9031\u914B\u916C\u96C6\u919C\u4EC0\u4F4F\u5145\u5341\u5F93\u620E\u67D4\u6C41\u6E0B\u7363\u7E26\u91CD\u9283\u53D4\u5919\u5BBF\u6DD1\u795D\u7E2E\u7C9B\u587E\u719F\u51FA\u8853\u8FF0\u4FCA\u5CFB\u6625\u77AC\u7AE3\u821C\u99FF\u51C6\u5FAA\u65EC\u696F\u6B89\u6DF3\"],\n[\"8f80\",\"\u6E96\u6F64\u76FE\u7D14\u5DE1\u9075\u9187\u9806\u51E6\u521D\u6240\u6691\u66D9\u6E1A\u5EB6\u7DD2\u7F72\u66F8\u85AF\u85F7\u8AF8\u52A9\u53D9\u5973\u5E8F\u5F90\u6055\u92E4\u9664\u50B7\u511F\u52DD\u5320\u5347\u53EC\u54E8\u5546\u5531\u5617\u5968\u59BE\u5A3C\u5BB5\u5C06\u5C0F\u5C11\u5C1A\u5E84\u5E8A\u5EE0\u5F70\u627F\u6284\u62DB\u638C\u6377\u6607\u660C\u662D\u6676\u677E\u68A2\u6A1F\u6A35\u6CBC\u6D88\u6E09\u6E58\u713C\u7126\u7167\u75C7\u7701\u785D\u7901\u7965\u79F0\u7AE0\u7B11\u7CA7\u7D39\u8096\u83D6\u848B\u8549\u885D\u88F3\u8A1F\u8A3C\u8A54\u8A73\u8C61\u8CDE\u91A4\u9266\u937E\u9418\u969C\u9798\u4E0A\u4E08\u4E1E\u4E57\u5197\u5270\u57CE\u5834\u58CC\u5B22\u5E38\u60C5\u64FE\u6761\u6756\u6D44\u72B6\u7573\u7A63\u84B8\u8B72\u91B8\u9320\u5631\u57F4\u98FE\"],\n[\"9040\",\"\u62ED\u690D\u6B96\u71ED\u7E54\u8077\u8272\u89E6\u98DF\u8755\u8FB1\u5C3B\u4F38\u4FE1\u4FB5\u5507\u5A20\u5BDD\u5BE9\u5FC3\u614E\u632F\u65B0\u664B\u68EE\u699B\u6D78\u6DF1\u7533\u75B9\u771F\u795E\u79E6\u7D33\u81E3\u82AF\u85AA\u89AA\u8A3A\u8EAB\u8F9B\u9032\u91DD\u9707\u4EBA\u4EC1\u5203\u5875\u58EC\u5C0B\u751A\u5C3D\u814E\u8A0A\u8FC5\u9663\u976D\u7B25\u8ACF\u9808\u9162\u56F3\u53A8\"],\n[\"9080\",\"\u9017\u5439\u5782\u5E25\u63A8\u6C34\u708A\u7761\u7C8B\u7FE0\u8870\u9042\u9154\u9310\u9318\u968F\u745E\u9AC4\u5D07\u5D69\u6570\u67A2\u8DA8\u96DB\u636E\u6749\u6919\u83C5\u9817\u96C0\u88FE\u6F84\u647A\u5BF8\u4E16\u702C\u755D\u662F\u51C4\u5236\u52E2\u59D3\u5F81\u6027\u6210\u653F\u6574\u661F\u6674\u68F2\u6816\u6B63\u6E05\u7272\u751F\u76DB\u7CBE\u8056\u58F0\u88FD\u897F\u8AA0\u8A93\u8ACB\u901D\u9192\u9752\u9759\u6589\u7A0E\u8106\u96BB\u5E2D\u60DC\u621A\u65A5\u6614\u6790\u77F3\u7A4D\u7C4D\u7E3E\u810A\u8CAC\u8D64\u8DE1\u8E5F\u78A9\u5207\u62D9\u63A5\u6442\u6298\u8A2D\u7A83\u7BC0\u8AAC\u96EA\u7D76\u820C\u8749\u4ED9\u5148\u5343\u5360\u5BA3\u5C02\u5C16\u5DDD\u6226\u6247\u64B0\u6813\u6834\u6CC9\u6D45\u6D17\u67D3\u6F5C\u714E\u717D\u65CB\u7A7F\u7BAD\u7DDA\"],\n[\"9140\",\"\u7E4A\u7FA8\u817A\u821B\u8239\u85A6\u8A6E\u8CCE\u8DF5\u9078\u9077\u92AD\u9291\u9583\u9BAE\u524D\u5584\u6F38\u7136\u5168\u7985\u7E55\u81B3\u7CCE\u564C\u5851\u5CA8\u63AA\u66FE\u66FD\u695A\u72D9\u758F\u758E\u790E\u7956\u79DF\u7C97\u7D20\u7D44\u8607\u8A34\u963B\u9061\u9F20\u50E7\u5275\u53CC\u53E2\u5009\u55AA\u58EE\u594F\u723D\u5B8B\u5C64\u531D\u60E3\u60F3\u635C\u6383\u633F\u63BB\"],\n[\"9180\",\"\u64CD\u65E9\u66F9\u5DE3\u69CD\u69FD\u6F15\u71E5\u4E89\u75E9\u76F8\u7A93\u7CDF\u7DCF\u7D9C\u8061\u8349\u8358\u846C\u84BC\u85FB\u88C5\u8D70\u9001\u906D\u9397\u971C\u9A12\u50CF\u5897\u618E\u81D3\u8535\u8D08\u9020\u4FC3\u5074\u5247\u5373\u606F\u6349\u675F\u6E2C\u8DB3\u901F\u4FD7\u5C5E\u8CCA\u65CF\u7D9A\u5352\u8896\u5176\u63C3\u5B58\u5B6B\u5C0A\u640D\u6751\u905C\u4ED6\u591A\u592A\u6C70\u8A51\u553E\u5815\u59A5\u60F0\u6253\u67C1\u8235\u6955\u9640\u99C4\u9A28\u4F53\u5806\u5BFE\u8010\u5CB1\u5E2F\u5F85\u6020\u614B\u6234\u66FF\u6CF0\u6EDE\u80CE\u817F\u82D4\u888B\u8CB8\u9000\u902E\u968A\u9EDB\u9BDB\u4EE3\u53F0\u5927\u7B2C\u918D\u984C\u9DF9\u6EDD\u7027\u5353\u5544\u5B85\u6258\u629E\u62D3\u6CA2\u6FEF\u7422\u8A17\u9438\u6FC1\u8AFE\u8338\u51E7\u86F8\u53EA\"],\n[\"9240\",\"\u53E9\u4F46\u9054\u8FB0\u596A\u8131\u5DFD\u7AEA\u8FBF\u68DA\u8C37\u72F8\u9C48\u6A3D\u8AB0\u4E39\u5358\u5606\u5766\u62C5\u63A2\u65E6\u6B4E\u6DE1\u6E5B\u70AD\u77ED\u7AEF\u7BAA\u7DBB\u803D\u80C6\u86CB\u8A95\u935B\u56E3\u58C7\u5F3E\u65AD\u6696\u6A80\u6BB5\u7537\u8AC7\u5024\u77E5\u5730\u5F1B\u6065\u667A\u6C60\u75F4\u7A1A\u7F6E\u81F4\u8718\u9045\u99B3\u7BC9\u755C\u7AF9\u7B51\u84C4\"],\n[\"9280\",\"\u9010\u79E9\u7A92\u8336\u5AE1\u7740\u4E2D\u4EF2\u5B99\u5FE0\u62BD\u663C\u67F1\u6CE8\u866B\u8877\u8A3B\u914E\u92F3\u99D0\u6A17\u7026\u732A\u82E7\u8457\u8CAF\u4E01\u5146\u51CB\u558B\u5BF5\u5E16\u5E33\u5E81\u5F14\u5F35\u5F6B\u5FB4\u61F2\u6311\u66A2\u671D\u6F6E\u7252\u753A\u773A\u8074\u8139\u8178\u8776\u8ABF\u8ADC\u8D85\u8DF3\u929A\u9577\u9802\u9CE5\u52C5\u6357\u76F4\u6715\u6C88\u73CD\u8CC3\u93AE\u9673\u6D25\u589C\u690E\u69CC\u8FFD\u939A\u75DB\u901A\u585A\u6802\u63B4\u69FB\u4F43\u6F2C\u67D8\u8FBB\u8526\u7DB4\u9354\u693F\u6F70\u576A\u58F7\u5B2C\u7D2C\u722A\u540A\u91E3\u9DB4\u4EAD\u4F4E\u505C\u5075\u5243\u8C9E\u5448\u5824\u5B9A\u5E1D\u5E95\u5EAD\u5EF7\u5F1F\u608C\u62B5\u633A\u63D0\u68AF\u6C40\u7887\u798E\u7A0B\u7DE0\u8247\u8A02\u8AE6\u8E44\u9013\"],\n[\"9340\",\"\u90B8\u912D\u91D8\u9F0E\u6CE5\u6458\u64E2\u6575\u6EF4\u7684\u7B1B\u9069\u93D1\u6EBA\u54F2\u5FB9\u64A4\u8F4D\u8FED\u9244\u5178\u586B\u5929\u5C55\u5E97\u6DFB\u7E8F\u751C\u8CBC\u8EE2\u985B\u70B9\u4F1D\u6BBF\u6FB1\u7530\u96FB\u514E\u5410\u5835\u5857\u59AC\u5C60\u5F92\u6597\u675C\u6E21\u767B\u83DF\u8CED\u9014\u90FD\u934D\u7825\u783A\u52AA\u5EA6\u571F\u5974\u6012\u5012\u515A\u51AC\"],\n[\"9380\",\"\u51CD\u5200\u5510\u5854\u5858\u5957\u5B95\u5CF6\u5D8B\u60BC\u6295\u642D\u6771\u6843\u68BC\u68DF\u76D7\u6DD8\u6E6F\u6D9B\u706F\u71C8\u5F53\u75D8\u7977\u7B49\u7B54\u7B52\u7CD6\u7D71\u5230\u8463\u8569\u85E4\u8A0E\u8B04\u8C46\u8E0F\u9003\u900F\u9419\u9676\u982D\u9A30\u95D8\u50CD\u52D5\u540C\u5802\u5C0E\u61A7\u649E\u6D1E\u77B3\u7AE5\u80F4\u8404\u9053\u9285\u5CE0\u9D07\u533F\u5F97\u5FB3\u6D9C\u7279\u7763\u79BF\u7BE4\u6BD2\u72EC\u8AAD\u6803\u6A61\u51F8\u7A81\u6934\u5C4A\u9CF6\u82EB\u5BC5\u9149\u701E\u5678\u5C6F\u60C7\u6566\u6C8C\u8C5A\u9041\u9813\u5451\u66C7\u920D\u5948\u90A3\u5185\u4E4D\u51EA\u8599\u8B0E\u7058\u637A\u934B\u6962\u99B4\u7E04\u7577\u5357\u6960\u8EDF\u96E3\u6C5D\u4E8C\u5C3C\u5F10\u8FE9\u5302\u8CD1\u8089\u8679\u5EFF\u65E5\u4E73\u5165\"],\n[\"9440\",\"\u5982\u5C3F\u97EE\u4EFB\u598A\u5FCD\u8A8D\u6FE1\u79B0\u7962\u5BE7\u8471\u732B\u71B1\u5E74\u5FF5\u637B\u649A\u71C3\u7C98\u4E43\u5EFC\u4E4B\u57DC\u56A2\u60A9\u6FC3\u7D0D\u80FD\u8133\u81BF\u8FB2\u8997\u86A4\u5DF4\u628A\u64AD\u8987\u6777\u6CE2\u6D3E\u7436\u7834\u5A46\u7F75\u82AD\u99AC\u4FF3\u5EC3\u62DD\u6392\u6557\u676F\u76C3\u724C\u80CC\u80BA\u8F29\u914D\u500D\u57F9\u5A92\u6885\"],\n[\"9480\",\"\u6973\u7164\u72FD\u8CB7\u58F2\u8CE0\u966A\u9019\u877F\u79E4\u77E7\u8429\u4F2F\u5265\u535A\u62CD\u67CF\u6CCA\u767D\u7B94\u7C95\u8236\u8584\u8FEB\u66DD\u6F20\u7206\u7E1B\u83AB\u99C1\u9EA6\u51FD\u7BB1\u7872\u7BB8\u8087\u7B48\u6AE8\u5E61\u808C\u7551\u7560\u516B\u9262\u6E8C\u767A\u9197\u9AEA\u4F10\u7F70\u629C\u7B4F\u95A5\u9CE9\u567A\u5859\u86E4\u96BC\u4F34\u5224\u534A\u53CD\u53DB\u5E06\u642C\u6591\u677F\u6C3E\u6C4E\u7248\u72AF\u73ED\u7554\u7E41\u822C\u85E9\u8CA9\u7BC4\u91C6\u7169\u9812\u98EF\u633D\u6669\u756A\u76E4\u78D0\u8543\u86EE\u532A\u5351\u5426\u5983\u5E87\u5F7C\u60B2\u6249\u6279\u62AB\u6590\u6BD4\u6CCC\u75B2\u76AE\u7891\u79D8\u7DCB\u7F77\u80A5\u88AB\u8AB9\u8CBB\u907F\u975E\u98DB\u6A0B\u7C38\u5099\u5C3E\u5FAE\u6787\u6BD8\u7435\u7709\u7F8E\"],\n[\"9540\",\"\u9F3B\u67CA\u7A17\u5339\u758B\u9AED\u5F66\u819D\u83F1\u8098\u5F3C\u5FC5\u7562\u7B46\u903C\u6867\u59EB\u5A9B\u7D10\u767E\u8B2C\u4FF5\u5F6A\u6A19\u6C37\u6F02\u74E2\u7968\u8868\u8A55\u8C79\u5EDF\u63CF\u75C5\u79D2\u82D7\u9328\u92F2\u849C\u86ED\u9C2D\u54C1\u5F6C\u658C\u6D5C\u7015\u8CA7\u8CD3\u983B\u654F\u74F6\u4E0D\u4ED8\u57E0\u592B\u5A66\u5BCC\u51A8\u5E03\u5E9C\u6016\u6276\u6577\"],\n[\"9580\",\"\u65A7\u666E\u6D6E\u7236\u7B26\u8150\u819A\u8299\u8B5C\u8CA0\u8CE6\u8D74\u961C\u9644\u4FAE\u64AB\u6B66\u821E\u8461\u856A\u90E8\u5C01\u6953\u98A8\u847A\u8557\u4F0F\u526F\u5FA9\u5E45\u670D\u798F\u8179\u8907\u8986\u6DF5\u5F17\u6255\u6CB8\u4ECF\u7269\u9B92\u5206\u543B\u5674\u58B3\u61A4\u626E\u711A\u596E\u7C89\u7CDE\u7D1B\u96F0\u6587\u805E\u4E19\u4F75\u5175\u5840\u5E63\u5E73\u5F0A\u67C4\u4E26\u853D\u9589\u965B\u7C73\u9801\u50FB\u58C1\u7656\u78A7\u5225\u77A5\u8511\u7B86\u504F\u5909\u7247\u7BC7\u7DE8\u8FBA\u8FD4\u904D\u4FBF\u52C9\u5A29\u5F01\u97AD\u4FDD\u8217\u92EA\u5703\u6355\u6B69\u752B\u88DC\u8F14\u7A42\u52DF\u5893\u6155\u620A\u66AE\u6BCD\u7C3F\u83E9\u5023\u4FF8\u5305\u5446\u5831\u5949\u5B9D\u5CF0\u5CEF\u5D29\u5E96\u62B1\u6367\u653E\u65B9\u670B\"],\n[\"9640\",\"\u6CD5\u6CE1\u70F9\u7832\u7E2B\u80DE\u82B3\u840C\u84EC\u8702\u8912\u8A2A\u8C4A\u90A6\u92D2\u98FD\u9CF3\u9D6C\u4E4F\u4EA1\u508D\u5256\u574A\u59A8\u5E3D\u5FD8\u5FD9\u623F\u66B4\u671B\u67D0\u68D2\u5192\u7D21\u80AA\u81A8\u8B00\u8C8C\u8CBF\u927E\u9632\u5420\u982C\u5317\u50D5\u535C\u58A8\u64B2\u6734\u7267\u7766\u7A46\u91E6\u52C3\u6CA1\u6B86\u5800\u5E4C\u5954\u672C\u7FFB\u51E1\u76C6\"],\n[\"9680\",\"\u6469\u78E8\u9B54\u9EBB\u57CB\u59B9\u6627\u679A\u6BCE\u54E9\u69D9\u5E55\u819C\u6795\u9BAA\u67FE\u9C52\u685D\u4EA6\u4FE3\u53C8\u62B9\u672B\u6CAB\u8FC4\u4FAD\u7E6D\u9EBF\u4E07\u6162\u6E80\u6F2B\u8513\u5473\u672A\u9B45\u5DF3\u7B95\u5CAC\u5BC6\u871C\u6E4A\u84D1\u7A14\u8108\u5999\u7C8D\u6C11\u7720\u52D9\u5922\u7121\u725F\u77DB\u9727\u9D61\u690B\u5A7F\u5A18\u51A5\u540D\u547D\u660E\u76DF\u8FF7\u9298\u9CF4\u59EA\u725D\u6EC5\u514D\u68C9\u7DBF\u7DEC\u9762\u9EBA\u6478\u6A21\u8302\u5984\u5B5F\u6BDB\u731B\u76F2\u7DB2\u8017\u8499\u5132\u6728\u9ED9\u76EE\u6762\u52FF\u9905\u5C24\u623B\u7C7E\u8CB0\u554F\u60B6\u7D0B\u9580\u5301\u4E5F\u51B6\u591C\u723A\u8036\u91CE\u5F25\u77E2\u5384\u5F79\u7D04\u85AC\u8A33\u8E8D\u9756\u67F3\u85AE\u9453\u6109\u6108\u6CB9\u7652\"],\n[\"9740\",\"\u8AED\u8F38\u552F\u4F51\u512A\u52C7\u53CB\u5BA5\u5E7D\u60A0\u6182\u63D6\u6709\u67DA\u6E67\u6D8C\u7336\u7337\u7531\u7950\u88D5\u8A98\u904A\u9091\u90F5\u96C4\u878D\u5915\u4E88\u4F59\u4E0E\u8A89\u8F3F\u9810\u50AD\u5E7C\u5996\u5BB9\u5EB8\u63DA\u63FA\u64C1\u66DC\u694A\u69D8\u6D0B\u6EB6\u7194\u7528\u7AAF\u7F8A\u8000\u8449\u84C9\u8981\u8B21\u8E0A\u9065\u967D\u990A\u617E\u6291\u6B32\"],\n[\"9780\",\"\u6C83\u6D74\u7FCC\u7FFC\u6DC0\u7F85\u87BA\u88F8\u6765\u83B1\u983C\u96F7\u6D1B\u7D61\u843D\u916A\u4E71\u5375\u5D50\u6B04\u6FEB\u85CD\u862D\u89A7\u5229\u540F\u5C65\u674E\u68A8\u7406\u7483\u75E2\u88CF\u88E1\u91CC\u96E2\u9678\u5F8B\u7387\u7ACB\u844E\u63A0\u7565\u5289\u6D41\u6E9C\u7409\u7559\u786B\u7C92\u9686\u7ADC\u9F8D\u4FB6\u616E\u65C5\u865C\u4E86\u4EAE\u50DA\u4E21\u51CC\u5BEE\u6599\u6881\u6DBC\u731F\u7642\u77AD\u7A1C\u7CE7\u826F\u8AD2\u907C\u91CF\u9675\u9818\u529B\u7DD1\u502B\u5398\u6797\u6DCB\u71D0\u7433\u81E8\u8F2A\u96A3\u9C57\u9E9F\u7460\u5841\u6D99\u7D2F\u985E\u4EE4\u4F36\u4F8B\u51B7\u52B1\u5DBA\u601C\u73B2\u793C\u82D3\u9234\u96B7\u96F6\u970A\u9E97\u9F62\u66A6\u6B74\u5217\u52A3\u70C8\u88C2\u5EC9\u604B\u6190\u6F23\u7149\u7C3E\u7DF4\u806F\"],\n[\"9840\",\"\u84EE\u9023\u932C\u5442\u9B6F\u6AD3\u7089\u8CC2\u8DEF\u9732\u52B4\u5A41\u5ECA\u5F04\u6717\u697C\u6994\u6D6A\u6F0F\u7262\u72FC\u7BED\u8001\u807E\u874B\u90CE\u516D\u9E93\u7984\u808B\u9332\u8AD6\u502D\u548C\u8A71\u6B6A\u8CC4\u8107\u60D1\u67A0\u9DF2\u4E99\u4E98\u9C10\u8A6B\u85C1\u8568\u6900\u6E7E\u7897\u8155\"],\n[\"989f\",\"\u5F0C\u4E10\u4E15\u4E2A\u4E31\u4E36\u4E3C\u4E3F\u4E42\u4E56\u4E58\u4E82\u4E85\u8C6B\u4E8A\u8212\u5F0D\u4E8E\u4E9E\u4E9F\u4EA0\u4EA2\u4EB0\u4EB3\u4EB6\u4ECE\u4ECD\u4EC4\u4EC6\u4EC2\u4ED7\u4EDE\u4EED\u4EDF\u4EF7\u4F09\u4F5A\u4F30\u4F5B\u4F5D\u4F57\u4F47\u4F76\u4F88\u4F8F\u4F98\u4F7B\u4F69\u4F70\u4F91\u4F6F\u4F86\u4F96\u5118\u4FD4\u4FDF\u4FCE\u4FD8\u4FDB\u4FD1\u4FDA\u4FD0\u4FE4\u4FE5\u501A\u5028\u5014\u502A\u5025\u5005\u4F1C\u4FF6\u5021\u5029\u502C\u4FFE\u4FEF\u5011\u5006\u5043\u5047\u6703\u5055\u5050\u5048\u505A\u5056\u506C\u5078\u5080\u509A\u5085\u50B4\u50B2\"],\n[\"9940\",\"\u50C9\u50CA\u50B3\u50C2\u50D6\u50DE\u50E5\u50ED\u50E3\u50EE\u50F9\u50F5\u5109\u5101\u5102\u5116\u5115\u5114\u511A\u5121\u513A\u5137\u513C\u513B\u513F\u5140\u5152\u514C\u5154\u5162\u7AF8\u5169\u516A\u516E\u5180\u5182\u56D8\u518C\u5189\u518F\u5191\u5193\u5195\u5196\u51A4\u51A6\u51A2\u51A9\u51AA\u51AB\u51B3\u51B1\u51B2\u51B0\u51B5\u51BD\u51C5\u51C9\u51DB\u51E0\u8655\u51E9\u51ED\"],\n[\"9980\",\"\u51F0\u51F5\u51FE\u5204\u520B\u5214\u520E\u5227\u522A\u522E\u5233\u5239\u524F\u5244\u524B\u524C\u525E\u5254\u526A\u5274\u5269\u5273\u527F\u527D\u528D\u5294\u5292\u5271\u5288\u5291\u8FA8\u8FA7\u52AC\u52AD\u52BC\u52B5\u52C1\u52CD\u52D7\u52DE\u52E3\u52E6\u98ED\u52E0\u52F3\u52F5\u52F8\u52F9\u5306\u5308\u7538\u530D\u5310\u530F\u5315\u531A\u5323\u532F\u5331\u5333\u5338\u5340\u5346\u5345\u4E17\u5349\u534D\u51D6\u535E\u5369\u536E\u5918\u537B\u5377\u5382\u5396\u53A0\u53A6\u53A5\u53AE\u53B0\u53B6\u53C3\u7C12\u96D9\u53DF\u66FC\u71EE\u53EE\u53E8\u53ED\u53FA\u5401\u543D\u5440\u542C\u542D\u543C\u542E\u5436\u5429\u541D\u544E\u548F\u5475\u548E\u545F\u5471\u5477\u5470\u5492\u547B\u5480\u5476\u5484\u5490\u5486\u54C7\u54A2\u54B8\u54A5\u54AC\u54C4\u54C8\u54A8\"],\n[\"9a40\",\"\u54AB\u54C2\u54A4\u54BE\u54BC\u54D8\u54E5\u54E6\u550F\u5514\u54FD\u54EE\u54ED\u54FA\u54E2\u5539\u5540\u5563\u554C\u552E\u555C\u5545\u5556\u5557\u5538\u5533\u555D\u5599\u5580\u54AF\u558A\u559F\u557B\u557E\u5598\u559E\u55AE\u557C\u5583\u55A9\u5587\u55A8\u55DA\u55C5\u55DF\u55C4\u55DC\u55E4\u55D4\u5614\u55F7\u5616\u55FE\u55FD\u561B\u55F9\u564E\u5650\u71DF\u5634\u5636\u5632\u5638\"],\n[\"9a80\",\"\u566B\u5664\u562F\u566C\u566A\u5686\u5680\u568A\u56A0\u5694\u568F\u56A5\u56AE\u56B6\u56B4\u56C2\u56BC\u56C1\u56C3\u56C0\u56C8\u56CE\u56D1\u56D3\u56D7\u56EE\u56F9\u5700\u56FF\u5704\u5709\u5708\u570B\u570D\u5713\u5718\u5716\u55C7\u571C\u5726\u5737\u5738\u574E\u573B\u5740\u574F\u5769\u57C0\u5788\u5761\u577F\u5789\u5793\u57A0\u57B3\u57A4\u57AA\u57B0\u57C3\u57C6\u57D4\u57D2\u57D3\u580A\u57D6\u57E3\u580B\u5819\u581D\u5872\u5821\u5862\u584B\u5870\u6BC0\u5852\u583D\u5879\u5885\u58B9\u589F\u58AB\u58BA\u58DE\u58BB\u58B8\u58AE\u58C5\u58D3\u58D1\u58D7\u58D9\u58D8\u58E5\u58DC\u58E4\u58DF\u58EF\u58FA\u58F9\u58FB\u58FC\u58FD\u5902\u590A\u5910\u591B\u68A6\u5925\u592C\u592D\u5932\u5938\u593E\u7AD2\u5955\u5950\u594E\u595A\u5958\u5962\u5960\u5967\u596C\u5969\"],\n[\"9b40\",\"\u5978\u5981\u599D\u4F5E\u4FAB\u59A3\u59B2\u59C6\u59E8\u59DC\u598D\u59D9\u59DA\u5A25\u5A1F\u5A11\u5A1C\u5A09\u5A1A\u5A40\u5A6C\u5A49\u5A35\u5A36\u5A62\u5A6A\u5A9A\u5ABC\u5ABE\u5ACB\u5AC2\u5ABD\u5AE3\u5AD7\u5AE6\u5AE9\u5AD6\u5AFA\u5AFB\u5B0C\u5B0B\u5B16\u5B32\u5AD0\u5B2A\u5B36\u5B3E\u5B43\u5B45\u5B40\u5B51\u5B55\u5B5A\u5B5B\u5B65\u5B69\u5B70\u5B73\u5B75\u5B78\u6588\u5B7A\u5B80\"],\n[\"9b80\",\"\u5B83\u5BA6\u5BB8\u5BC3\u5BC7\u5BC9\u5BD4\u5BD0\u5BE4\u5BE6\u5BE2\u5BDE\u5BE5\u5BEB\u5BF0\u5BF6\u5BF3\u5C05\u5C07\u5C08\u5C0D\u5C13\u5C20\u5C22\u5C28\u5C38\u5C39\u5C41\u5C46\u5C4E\u5C53\u5C50\u5C4F\u5B71\u5C6C\u5C6E\u4E62\u5C76\u5C79\u5C8C\u5C91\u5C94\u599B\u5CAB\u5CBB\u5CB6\u5CBC\u5CB7\u5CC5\u5CBE\u5CC7\u5CD9\u5CE9\u5CFD\u5CFA\u5CED\u5D8C\u5CEA\u5D0B\u5D15\u5D17\u5D5C\u5D1F\u5D1B\u5D11\u5D14\u5D22\u5D1A\u5D19\u5D18\u5D4C\u5D52\u5D4E\u5D4B\u5D6C\u5D73\u5D76\u5D87\u5D84\u5D82\u5DA2\u5D9D\u5DAC\u5DAE\u5DBD\u5D90\u5DB7\u5DBC\u5DC9\u5DCD\u5DD3\u5DD2\u5DD6\u5DDB\u5DEB\u5DF2\u5DF5\u5E0B\u5E1A\u5E19\u5E11\u5E1B\u5E36\u5E37\u5E44\u5E43\u5E40\u5E4E\u5E57\u5E54\u5E5F\u5E62\u5E64\u5E47\u5E75\u5E76\u5E7A\u9EBC\u5E7F\u5EA0\u5EC1\u5EC2\u5EC8\u5ED0\u5ECF\"],\n[\"9c40\",\"\u5ED6\u5EE3\u5EDD\u5EDA\u5EDB\u5EE2\u5EE1\u5EE8\u5EE9\u5EEC\u5EF1\u5EF3\u5EF0\u5EF4\u5EF8\u5EFE\u5F03\u5F09\u5F5D\u5F5C\u5F0B\u5F11\u5F16\u5F29\u5F2D\u5F38\u5F41\u5F48\u5F4C\u5F4E\u5F2F\u5F51\u5F56\u5F57\u5F59\u5F61\u5F6D\u5F73\u5F77\u5F83\u5F82\u5F7F\u5F8A\u5F88\u5F91\u5F87\u5F9E\u5F99\u5F98\u5FA0\u5FA8\u5FAD\u5FBC\u5FD6\u5FFB\u5FE4\u5FF8\u5FF1\u5FDD\u60B3\u5FFF\u6021\u6060\"],\n[\"9c80\",\"\u6019\u6010\u6029\u600E\u6031\u601B\u6015\u602B\u6026\u600F\u603A\u605A\u6041\u606A\u6077\u605F\u604A\u6046\u604D\u6063\u6043\u6064\u6042\u606C\u606B\u6059\u6081\u608D\u60E7\u6083\u609A\u6084\u609B\u6096\u6097\u6092\u60A7\u608B\u60E1\u60B8\u60E0\u60D3\u60B4\u5FF0\u60BD\u60C6\u60B5\u60D8\u614D\u6115\u6106\u60F6\u60F7\u6100\u60F4\u60FA\u6103\u6121\u60FB\u60F1\u610D\u610E\u6147\u613E\u6128\u6127\u614A\u613F\u613C\u612C\u6134\u613D\u6142\u6144\u6173\u6177\u6158\u6159\u615A\u616B\u6174\u616F\u6165\u6171\u615F\u615D\u6153\u6175\u6199\u6196\u6187\u61AC\u6194\u619A\u618A\u6191\u61AB\u61AE\u61CC\u61CA\u61C9\u61F7\u61C8\u61C3\u61C6\u61BA\u61CB\u7F79\u61CD\u61E6\u61E3\u61F6\u61FA\u61F4\u61FF\u61FD\u61FC\u61FE\u6200\u6208\u6209\u620D\u620C\u6214\u621B\"],\n[\"9d40\",\"\u621E\u6221\u622A\u622E\u6230\u6232\u6233\u6241\u624E\u625E\u6263\u625B\u6260\u6268\u627C\u6282\u6289\u627E\u6292\u6293\u6296\u62D4\u6283\u6294\u62D7\u62D1\u62BB\u62CF\u62FF\u62C6\u64D4\u62C8\u62DC\u62CC\u62CA\u62C2\u62C7\u629B\u62C9\u630C\u62EE\u62F1\u6327\u6302\u6308\u62EF\u62F5\u6350\u633E\u634D\u641C\u634F\u6396\u638E\u6380\u63AB\u6376\u63A3\u638F\u6389\u639F\u63B5\u636B\"],\n[\"9d80\",\"\u6369\u63BE\u63E9\u63C0\u63C6\u63E3\u63C9\u63D2\u63F6\u63C4\u6416\u6434\u6406\u6413\u6426\u6436\u651D\u6417\u6428\u640F\u6467\u646F\u6476\u644E\u652A\u6495\u6493\u64A5\u64A9\u6488\u64BC\u64DA\u64D2\u64C5\u64C7\u64BB\u64D8\u64C2\u64F1\u64E7\u8209\u64E0\u64E1\u62AC\u64E3\u64EF\u652C\u64F6\u64F4\u64F2\u64FA\u6500\u64FD\u6518\u651C\u6505\u6524\u6523\u652B\u6534\u6535\u6537\u6536\u6538\u754B\u6548\u6556\u6555\u654D\u6558\u655E\u655D\u6572\u6578\u6582\u6583\u8B8A\u659B\u659F\u65AB\u65B7\u65C3\u65C6\u65C1\u65C4\u65CC\u65D2\u65DB\u65D9\u65E0\u65E1\u65F1\u6772\u660A\u6603\u65FB\u6773\u6635\u6636\u6634\u661C\u664F\u6644\u6649\u6641\u665E\u665D\u6664\u6667\u6668\u665F\u6662\u6670\u6683\u6688\u668E\u6689\u6684\u6698\u669D\u66C1\u66B9\u66C9\u66BE\u66BC\"],\n[\"9e40\",\"\u66C4\u66B8\u66D6\u66DA\u66E0\u663F\u66E6\u66E9\u66F0\u66F5\u66F7\u670F\u6716\u671E\u6726\u6727\u9738\u672E\u673F\u6736\u6741\u6738\u6737\u6746\u675E\u6760\u6759\u6763\u6764\u6789\u6770\u67A9\u677C\u676A\u678C\u678B\u67A6\u67A1\u6785\u67B7\u67EF\u67B4\u67EC\u67B3\u67E9\u67B8\u67E4\u67DE\u67DD\u67E2\u67EE\u67B9\u67CE\u67C6\u67E7\u6A9C\u681E\u6846\u6829\u6840\u684D\u6832\u684E\"],\n[\"9e80\",\"\u68B3\u682B\u6859\u6863\u6877\u687F\u689F\u688F\u68AD\u6894\u689D\u689B\u6883\u6AAE\u68B9\u6874\u68B5\u68A0\u68BA\u690F\u688D\u687E\u6901\u68CA\u6908\u68D8\u6922\u6926\u68E1\u690C\u68CD\u68D4\u68E7\u68D5\u6936\u6912\u6904\u68D7\u68E3\u6925\u68F9\u68E0\u68EF\u6928\u692A\u691A\u6923\u6921\u68C6\u6979\u6977\u695C\u6978\u696B\u6954\u697E\u696E\u6939\u6974\u693D\u6959\u6930\u6961\u695E\u695D\u6981\u696A\u69B2\u69AE\u69D0\u69BF\u69C1\u69D3\u69BE\u69CE\u5BE8\u69CA\u69DD\u69BB\u69C3\u69A7\u6A2E\u6991\u69A0\u699C\u6995\u69B4\u69DE\u69E8\u6A02\u6A1B\u69FF\u6B0A\u69F9\u69F2\u69E7\u6A05\u69B1\u6A1E\u69ED\u6A14\u69EB\u6A0A\u6A12\u6AC1\u6A23\u6A13\u6A44\u6A0C\u6A72\u6A36\u6A78\u6A47\u6A62\u6A59\u6A66\u6A48\u6A38\u6A22\u6A90\u6A8D\u6AA0\u6A84\u6AA2\u6AA3\"],\n[\"9f40\",\"\u6A97\u8617\u6ABB\u6AC3\u6AC2\u6AB8\u6AB3\u6AAC\u6ADE\u6AD1\u6ADF\u6AAA\u6ADA\u6AEA\u6AFB\u6B05\u8616\u6AFA\u6B12\u6B16\u9B31\u6B1F\u6B38\u6B37\u76DC\u6B39\u98EE\u6B47\u6B43\u6B49\u6B50\u6B59\u6B54\u6B5B\u6B5F\u6B61\u6B78\u6B79\u6B7F\u6B80\u6B84\u6B83\u6B8D\u6B98\u6B95\u6B9E\u6BA4\u6BAA\u6BAB\u6BAF\u6BB2\u6BB1\u6BB3\u6BB7\u6BBC\u6BC6\u6BCB\u6BD3\u6BDF\u6BEC\u6BEB\u6BF3\u6BEF\"],\n[\"9f80\",\"\u9EBE\u6C08\u6C13\u6C14\u6C1B\u6C24\u6C23\u6C5E\u6C55\u6C62\u6C6A\u6C82\u6C8D\u6C9A\u6C81\u6C9B\u6C7E\u6C68\u6C73\u6C92\u6C90\u6CC4\u6CF1\u6CD3\u6CBD\u6CD7\u6CC5\u6CDD\u6CAE\u6CB1\u6CBE\u6CBA\u6CDB\u6CEF\u6CD9\u6CEA\u6D1F\u884D\u6D36\u6D2B\u6D3D\u6D38\u6D19\u6D35\u6D33\u6D12\u6D0C\u6D63\u6D93\u6D64\u6D5A\u6D79\u6D59\u6D8E\u6D95\u6FE4\u6D85\u6DF9\u6E15\u6E0A\u6DB5\u6DC7\u6DE6\u6DB8\u6DC6\u6DEC\u6DDE\u6DCC\u6DE8\u6DD2\u6DC5\u6DFA\u6DD9\u6DE4\u6DD5\u6DEA\u6DEE\u6E2D\u6E6E\u6E2E\u6E19\u6E72\u6E5F\u6E3E\u6E23\u6E6B\u6E2B\u6E76\u6E4D\u6E1F\u6E43\u6E3A\u6E4E\u6E24\u6EFF\u6E1D\u6E38\u6E82\u6EAA\u6E98\u6EC9\u6EB7\u6ED3\u6EBD\u6EAF\u6EC4\u6EB2\u6ED4\u6ED5\u6E8F\u6EA5\u6EC2\u6E9F\u6F41\u6F11\u704C\u6EEC\u6EF8\u6EFE\u6F3F\u6EF2\u6F31\u6EEF\u6F32\u6ECC\"],\n[\"e040\",\"\u6F3E\u6F13\u6EF7\u6F86\u6F7A\u6F78\u6F81\u6F80\u6F6F\u6F5B\u6FF3\u6F6D\u6F82\u6F7C\u6F58\u6F8E\u6F91\u6FC2\u6F66\u6FB3\u6FA3\u6FA1\u6FA4\u6FB9\u6FC6\u6FAA\u6FDF\u6FD5\u6FEC\u6FD4\u6FD8\u6FF1\u6FEE\u6FDB\u7009\u700B\u6FFA\u7011\u7001\u700F\u6FFE\u701B\u701A\u6F74\u701D\u7018\u701F\u7030\u703E\u7032\u7051\u7063\u7099\u7092\u70AF\u70F1\u70AC\u70B8\u70B3\u70AE\u70DF\u70CB\u70DD\"],\n[\"e080\",\"\u70D9\u7109\u70FD\u711C\u7119\u7165\u7155\u7188\u7166\u7162\u714C\u7156\u716C\u718F\u71FB\u7184\u7195\u71A8\u71AC\u71D7\u71B9\u71BE\u71D2\u71C9\u71D4\u71CE\u71E0\u71EC\u71E7\u71F5\u71FC\u71F9\u71FF\u720D\u7210\u721B\u7228\u722D\u722C\u7230\u7232\u723B\u723C\u723F\u7240\u7246\u724B\u7258\u7274\u727E\u7282\u7281\u7287\u7292\u7296\u72A2\u72A7\u72B9\u72B2\u72C3\u72C6\u72C4\u72CE\u72D2\u72E2\u72E0\u72E1\u72F9\u72F7\u500F\u7317\u730A\u731C\u7316\u731D\u7334\u732F\u7329\u7325\u733E\u734E\u734F\u9ED8\u7357\u736A\u7368\u7370\u7378\u7375\u737B\u737A\u73C8\u73B3\u73CE\u73BB\u73C0\u73E5\u73EE\u73DE\u74A2\u7405\u746F\u7425\u73F8\u7432\u743A\u7455\u743F\u745F\u7459\u7441\u745C\u7469\u7470\u7463\u746A\u7476\u747E\u748B\u749E\u74A7\u74CA\u74CF\u74D4\u73F1\"],\n[\"e140\",\"\u74E0\u74E3\u74E7\u74E9\u74EE\u74F2\u74F0\u74F1\u74F8\u74F7\u7504\u7503\u7505\u750C\u750E\u750D\u7515\u7513\u751E\u7526\u752C\u753C\u7544\u754D\u754A\u7549\u755B\u7546\u755A\u7569\u7564\u7567\u756B\u756D\u7578\u7576\u7586\u7587\u7574\u758A\u7589\u7582\u7594\u759A\u759D\u75A5\u75A3\u75C2\u75B3\u75C3\u75B5\u75BD\u75B8\u75BC\u75B1\u75CD\u75CA\u75D2\u75D9\u75E3\u75DE\u75FE\u75FF\"],\n[\"e180\",\"\u75FC\u7601\u75F0\u75FA\u75F2\u75F3\u760B\u760D\u7609\u761F\u7627\u7620\u7621\u7622\u7624\u7634\u7630\u763B\u7647\u7648\u7646\u765C\u7658\u7661\u7662\u7668\u7669\u766A\u7667\u766C\u7670\u7672\u7676\u7678\u767C\u7680\u7683\u7688\u768B\u768E\u7696\u7693\u7699\u769A\u76B0\u76B4\u76B8\u76B9\u76BA\u76C2\u76CD\u76D6\u76D2\u76DE\u76E1\u76E5\u76E7\u76EA\u862F\u76FB\u7708\u7707\u7704\u7729\u7724\u771E\u7725\u7726\u771B\u7737\u7738\u7747\u775A\u7768\u776B\u775B\u7765\u777F\u777E\u7779\u778E\u778B\u7791\u77A0\u779E\u77B0\u77B6\u77B9\u77BF\u77BC\u77BD\u77BB\u77C7\u77CD\u77D7\u77DA\u77DC\u77E3\u77EE\u77FC\u780C\u7812\u7926\u7820\u792A\u7845\u788E\u7874\u7886\u787C\u789A\u788C\u78A3\u78B5\u78AA\u78AF\u78D1\u78C6\u78CB\u78D4\u78BE\u78BC\u78C5\u78CA\u78EC\"],\n[\"e240\",\"\u78E7\u78DA\u78FD\u78F4\u7907\u7912\u7911\u7919\u792C\u792B\u7940\u7960\u7957\u795F\u795A\u7955\u7953\u797A\u797F\u798A\u799D\u79A7\u9F4B\u79AA\u79AE\u79B3\u79B9\u79BA\u79C9\u79D5\u79E7\u79EC\u79E1\u79E3\u7A08\u7A0D\u7A18\u7A19\u7A20\u7A1F\u7980\u7A31\u7A3B\u7A3E\u7A37\u7A43\u7A57\u7A49\u7A61\u7A62\u7A69\u9F9D\u7A70\u7A79\u7A7D\u7A88\u7A97\u7A95\u7A98\u7A96\u7AA9\u7AC8\u7AB0\"],\n[\"e280\",\"\u7AB6\u7AC5\u7AC4\u7ABF\u9083\u7AC7\u7ACA\u7ACD\u7ACF\u7AD5\u7AD3\u7AD9\u7ADA\u7ADD\u7AE1\u7AE2\u7AE6\u7AED\u7AF0\u7B02\u7B0F\u7B0A\u7B06\u7B33\u7B18\u7B19\u7B1E\u7B35\u7B28\u7B36\u7B50\u7B7A\u7B04\u7B4D\u7B0B\u7B4C\u7B45\u7B75\u7B65\u7B74\u7B67\u7B70\u7B71\u7B6C\u7B6E\u7B9D\u7B98\u7B9F\u7B8D\u7B9C\u7B9A\u7B8B\u7B92\u7B8F\u7B5D\u7B99\u7BCB\u7BC1\u7BCC\u7BCF\u7BB4\u7BC6\u7BDD\u7BE9\u7C11\u7C14\u7BE6\u7BE5\u7C60\u7C00\u7C07\u7C13\u7BF3\u7BF7\u7C17\u7C0D\u7BF6\u7C23\u7C27\u7C2A\u7C1F\u7C37\u7C2B\u7C3D\u7C4C\u7C43\u7C54\u7C4F\u7C40\u7C50\u7C58\u7C5F\u7C64\u7C56\u7C65\u7C6C\u7C75\u7C83\u7C90\u7CA4\u7CAD\u7CA2\u7CAB\u7CA1\u7CA8\u7CB3\u7CB2\u7CB1\u7CAE\u7CB9\u7CBD\u7CC0\u7CC5\u7CC2\u7CD8\u7CD2\u7CDC\u7CE2\u9B3B\u7CEF\u7CF2\u7CF4\u7CF6\u7CFA\u7D06\"],\n[\"e340\",\"\u7D02\u7D1C\u7D15\u7D0A\u7D45\u7D4B\u7D2E\u7D32\u7D3F\u7D35\u7D46\u7D73\u7D56\u7D4E\u7D72\u7D68\u7D6E\u7D4F\u7D63\u7D93\u7D89\u7D5B\u7D8F\u7D7D\u7D9B\u7DBA\u7DAE\u7DA3\u7DB5\u7DC7\u7DBD\u7DAB\u7E3D\u7DA2\u7DAF\u7DDC\u7DB8\u7D9F\u7DB0\u7DD8\u7DDD\u7DE4\u7DDE\u7DFB\u7DF2\u7DE1\u7E05\u7E0A\u7E23\u7E21\u7E12\u7E31\u7E1F\u7E09\u7E0B\u7E22\u7E46\u7E66\u7E3B\u7E35\u7E39\u7E43\u7E37\"],\n[\"e380\",\"\u7E32\u7E3A\u7E67\u7E5D\u7E56\u7E5E\u7E59\u7E5A\u7E79\u7E6A\u7E69\u7E7C\u7E7B\u7E83\u7DD5\u7E7D\u8FAE\u7E7F\u7E88\u7E89\u7E8C\u7E92\u7E90\u7E93\u7E94\u7E96\u7E8E\u7E9B\u7E9C\u7F38\u7F3A\u7F45\u7F4C\u7F4D\u7F4E\u7F50\u7F51\u7F55\u7F54\u7F58\u7F5F\u7F60\u7F68\u7F69\u7F67\u7F78\u7F82\u7F86\u7F83\u7F88\u7F87\u7F8C\u7F94\u7F9E\u7F9D\u7F9A\u7FA3\u7FAF\u7FB2\u7FB9\u7FAE\u7FB6\u7FB8\u8B71\u7FC5\u7FC6\u7FCA\u7FD5\u7FD4\u7FE1\u7FE6\u7FE9\u7FF3\u7FF9\u98DC\u8006\u8004\u800B\u8012\u8018\u8019\u801C\u8021\u8028\u803F\u803B\u804A\u8046\u8052\u8058\u805A\u805F\u8062\u8068\u8073\u8072\u8070\u8076\u8079\u807D\u807F\u8084\u8086\u8085\u809B\u8093\u809A\u80AD\u5190\u80AC\u80DB\u80E5\u80D9\u80DD\u80C4\u80DA\u80D6\u8109\u80EF\u80F1\u811B\u8129\u8123\u812F\u814B\"],\n[\"e440\",\"\u968B\u8146\u813E\u8153\u8151\u80FC\u8171\u816E\u8165\u8166\u8174\u8183\u8188\u818A\u8180\u8182\u81A0\u8195\u81A4\u81A3\u815F\u8193\u81A9\u81B0\u81B5\u81BE\u81B8\u81BD\u81C0\u81C2\u81BA\u81C9\u81CD\u81D1\u81D9\u81D8\u81C8\u81DA\u81DF\u81E0\u81E7\u81FA\u81FB\u81FE\u8201\u8202\u8205\u8207\u820A\u820D\u8210\u8216\u8229\u822B\u8238\u8233\u8240\u8259\u8258\u825D\u825A\u825F\u8264\"],\n[\"e480\",\"\u8262\u8268\u826A\u826B\u822E\u8271\u8277\u8278\u827E\u828D\u8292\u82AB\u829F\u82BB\u82AC\u82E1\u82E3\u82DF\u82D2\u82F4\u82F3\u82FA\u8393\u8303\u82FB\u82F9\u82DE\u8306\u82DC\u8309\u82D9\u8335\u8334\u8316\u8332\u8331\u8340\u8339\u8350\u8345\u832F\u832B\u8317\u8318\u8385\u839A\u83AA\u839F\u83A2\u8396\u8323\u838E\u8387\u838A\u837C\u83B5\u8373\u8375\u83A0\u8389\u83A8\u83F4\u8413\u83EB\u83CE\u83FD\u8403\u83D8\u840B\u83C1\u83F7\u8407\u83E0\u83F2\u840D\u8422\u8420\u83BD\u8438\u8506\u83FB\u846D\u842A\u843C\u855A\u8484\u8477\u846B\u84AD\u846E\u8482\u8469\u8446\u842C\u846F\u8479\u8435\u84CA\u8462\u84B9\u84BF\u849F\u84D9\u84CD\u84BB\u84DA\u84D0\u84C1\u84C6\u84D6\u84A1\u8521\u84FF\u84F4\u8517\u8518\u852C\u851F\u8515\u8514\u84FC\u8540\u8563\u8558\u8548\"],\n[\"e540\",\"\u8541\u8602\u854B\u8555\u8580\u85A4\u8588\u8591\u858A\u85A8\u856D\u8594\u859B\u85EA\u8587\u859C\u8577\u857E\u8590\u85C9\u85BA\u85CF\u85B9\u85D0\u85D5\u85DD\u85E5\u85DC\u85F9\u860A\u8613\u860B\u85FE\u85FA\u8606\u8622\u861A\u8630\u863F\u864D\u4E55\u8654\u865F\u8667\u8671\u8693\u86A3\u86A9\u86AA\u868B\u868C\u86B6\u86AF\u86C4\u86C6\u86B0\u86C9\u8823\u86AB\u86D4\u86DE\u86E9\u86EC\"],\n[\"e580\",\"\u86DF\u86DB\u86EF\u8712\u8706\u8708\u8700\u8703\u86FB\u8711\u8709\u870D\u86F9\u870A\u8734\u873F\u8737\u873B\u8725\u8729\u871A\u8760\u875F\u8778\u874C\u874E\u8774\u8757\u8768\u876E\u8759\u8753\u8763\u876A\u8805\u87A2\u879F\u8782\u87AF\u87CB\u87BD\u87C0\u87D0\u96D6\u87AB\u87C4\u87B3\u87C7\u87C6\u87BB\u87EF\u87F2\u87E0\u880F\u880D\u87FE\u87F6\u87F7\u880E\u87D2\u8811\u8816\u8815\u8822\u8821\u8831\u8836\u8839\u8827\u883B\u8844\u8842\u8852\u8859\u885E\u8862\u886B\u8881\u887E\u889E\u8875\u887D\u88B5\u8872\u8882\u8897\u8892\u88AE\u8899\u88A2\u888D\u88A4\u88B0\u88BF\u88B1\u88C3\u88C4\u88D4\u88D8\u88D9\u88DD\u88F9\u8902\u88FC\u88F4\u88E8\u88F2\u8904\u890C\u890A\u8913\u8943\u891E\u8925\u892A\u892B\u8941\u8944\u893B\u8936\u8938\u894C\u891D\u8960\u895E\"],\n[\"e640\",\"\u8966\u8964\u896D\u896A\u896F\u8974\u8977\u897E\u8983\u8988\u898A\u8993\u8998\u89A1\u89A9\u89A6\u89AC\u89AF\u89B2\u89BA\u89BD\u89BF\u89C0\u89DA\u89DC\u89DD\u89E7\u89F4\u89F8\u8A03\u8A16\u8A10\u8A0C\u8A1B\u8A1D\u8A25\u8A36\u8A41\u8A5B\u8A52\u8A46\u8A48\u8A7C\u8A6D\u8A6C\u8A62\u8A85\u8A82\u8A84\u8AA8\u8AA1\u8A91\u8AA5\u8AA6\u8A9A\u8AA3\u8AC4\u8ACD\u8AC2\u8ADA\u8AEB\u8AF3\u8AE7\"],\n[\"e680\",\"\u8AE4\u8AF1\u8B14\u8AE0\u8AE2\u8AF7\u8ADE\u8ADB\u8B0C\u8B07\u8B1A\u8AE1\u8B16\u8B10\u8B17\u8B20\u8B33\u97AB\u8B26\u8B2B\u8B3E\u8B28\u8B41\u8B4C\u8B4F\u8B4E\u8B49\u8B56\u8B5B\u8B5A\u8B6B\u8B5F\u8B6C\u8B6F\u8B74\u8B7D\u8B80\u8B8C\u8B8E\u8B92\u8B93\u8B96\u8B99\u8B9A\u8C3A\u8C41\u8C3F\u8C48\u8C4C\u8C4E\u8C50\u8C55\u8C62\u8C6C\u8C78\u8C7A\u8C82\u8C89\u8C85\u8C8A\u8C8D\u8C8E\u8C94\u8C7C\u8C98\u621D\u8CAD\u8CAA\u8CBD\u8CB2\u8CB3\u8CAE\u8CB6\u8CC8\u8CC1\u8CE4\u8CE3\u8CDA\u8CFD\u8CFA\u8CFB\u8D04\u8D05\u8D0A\u8D07\u8D0F\u8D0D\u8D10\u9F4E\u8D13\u8CCD\u8D14\u8D16\u8D67\u8D6D\u8D71\u8D73\u8D81\u8D99\u8DC2\u8DBE\u8DBA\u8DCF\u8DDA\u8DD6\u8DCC\u8DDB\u8DCB\u8DEA\u8DEB\u8DDF\u8DE3\u8DFC\u8E08\u8E09\u8DFF\u8E1D\u8E1E\u8E10\u8E1F\u8E42\u8E35\u8E30\u8E34\u8E4A\"],\n[\"e740\",\"\u8E47\u8E49\u8E4C\u8E50\u8E48\u8E59\u8E64\u8E60\u8E2A\u8E63\u8E55\u8E76\u8E72\u8E7C\u8E81\u8E87\u8E85\u8E84\u8E8B\u8E8A\u8E93\u8E91\u8E94\u8E99\u8EAA\u8EA1\u8EAC\u8EB0\u8EC6\u8EB1\u8EBE\u8EC5\u8EC8\u8ECB\u8EDB\u8EE3\u8EFC\u8EFB\u8EEB\u8EFE\u8F0A\u8F05\u8F15\u8F12\u8F19\u8F13\u8F1C\u8F1F\u8F1B\u8F0C\u8F26\u8F33\u8F3B\u8F39\u8F45\u8F42\u8F3E\u8F4C\u8F49\u8F46\u8F4E\u8F57\u8F5C\"],\n[\"e780\",\"\u8F62\u8F63\u8F64\u8F9C\u8F9F\u8FA3\u8FAD\u8FAF\u8FB7\u8FDA\u8FE5\u8FE2\u8FEA\u8FEF\u9087\u8FF4\u9005\u8FF9\u8FFA\u9011\u9015\u9021\u900D\u901E\u9016\u900B\u9027\u9036\u9035\u9039\u8FF8\u904F\u9050\u9051\u9052\u900E\u9049\u903E\u9056\u9058\u905E\u9068\u906F\u9076\u96A8\u9072\u9082\u907D\u9081\u9080\u908A\u9089\u908F\u90A8\u90AF\u90B1\u90B5\u90E2\u90E4\u6248\u90DB\u9102\u9112\u9119\u9132\u9130\u914A\u9156\u9158\u9163\u9165\u9169\u9173\u9172\u918B\u9189\u9182\u91A2\u91AB\u91AF\u91AA\u91B5\u91B4\u91BA\u91C0\u91C1\u91C9\u91CB\u91D0\u91D6\u91DF\u91E1\u91DB\u91FC\u91F5\u91F6\u921E\u91FF\u9214\u922C\u9215\u9211\u925E\u9257\u9245\u9249\u9264\u9248\u9295\u923F\u924B\u9250\u929C\u9296\u9293\u929B\u925A\u92CF\u92B9\u92B7\u92E9\u930F\u92FA\u9344\u932E\"],\n[\"e840\",\"\u9319\u9322\u931A\u9323\u933A\u9335\u933B\u935C\u9360\u937C\u936E\u9356\u93B0\u93AC\u93AD\u9394\u93B9\u93D6\u93D7\u93E8\u93E5\u93D8\u93C3\u93DD\u93D0\u93C8\u93E4\u941A\u9414\u9413\u9403\u9407\u9410\u9436\u942B\u9435\u9421\u943A\u9441\u9452\u9444\u945B\u9460\u9462\u945E\u946A\u9229\u9470\u9475\u9477\u947D\u945A\u947C\u947E\u9481\u947F\u9582\u9587\u958A\u9594\u9596\u9598\u9599\"],\n[\"e880\",\"\u95A0\u95A8\u95A7\u95AD\u95BC\u95BB\u95B9\u95BE\u95CA\u6FF6\u95C3\u95CD\u95CC\u95D5\u95D4\u95D6\u95DC\u95E1\u95E5\u95E2\u9621\u9628\u962E\u962F\u9642\u964C\u964F\u964B\u9677\u965C\u965E\u965D\u965F\u9666\u9672\u966C\u968D\u9698\u9695\u9697\u96AA\u96A7\u96B1\u96B2\u96B0\u96B4\u96B6\u96B8\u96B9\u96CE\u96CB\u96C9\u96CD\u894D\u96DC\u970D\u96D5\u96F9\u9704\u9706\u9708\u9713\u970E\u9711\u970F\u9716\u9719\u9724\u972A\u9730\u9739\u973D\u973E\u9744\u9746\u9748\u9742\u9749\u975C\u9760\u9764\u9766\u9768\u52D2\u976B\u9771\u9779\u9785\u977C\u9781\u977A\u9786\u978B\u978F\u9790\u979C\u97A8\u97A6\u97A3\u97B3\u97B4\u97C3\u97C6\u97C8\u97CB\u97DC\u97ED\u9F4F\u97F2\u7ADF\u97F6\u97F5\u980F\u980C\u9838\u9824\u9821\u9837\u983D\u9846\u984F\u984B\u986B\u986F\u9870\"],\n[\"e940\",\"\u9871\u9874\u9873\u98AA\u98AF\u98B1\u98B6\u98C4\u98C3\u98C6\u98E9\u98EB\u9903\u9909\u9912\u9914\u9918\u9921\u991D\u991E\u9924\u9920\u992C\u992E\u993D\u993E\u9942\u9949\u9945\u9950\u994B\u9951\u9952\u994C\u9955\u9997\u9998\u99A5\u99AD\u99AE\u99BC\u99DF\u99DB\u99DD\u99D8\u99D1\u99ED\u99EE\u99F1\u99F2\u99FB\u99F8\u9A01\u9A0F\u9A05\u99E2\u9A19\u9A2B\u9A37\u9A45\u9A42\u9A40\u9A43\"],\n[\"e980\",\"\u9A3E\u9A55\u9A4D\u9A5B\u9A57\u9A5F\u9A62\u9A65\u9A64\u9A69\u9A6B\u9A6A\u9AAD\u9AB0\u9ABC\u9AC0\u9ACF\u9AD1\u9AD3\u9AD4\u9ADE\u9ADF\u9AE2\u9AE3\u9AE6\u9AEF\u9AEB\u9AEE\u9AF4\u9AF1\u9AF7\u9AFB\u9B06\u9B18\u9B1A\u9B1F\u9B22\u9B23\u9B25\u9B27\u9B28\u9B29\u9B2A\u9B2E\u9B2F\u9B32\u9B44\u9B43\u9B4F\u9B4D\u9B4E\u9B51\u9B58\u9B74\u9B93\u9B83\u9B91\u9B96\u9B97\u9B9F\u9BA0\u9BA8\u9BB4\u9BC0\u9BCA\u9BB9\u9BC6\u9BCF\u9BD1\u9BD2\u9BE3\u9BE2\u9BE4\u9BD4\u9BE1\u9C3A\u9BF2\u9BF1\u9BF0\u9C15\u9C14\u9C09\u9C13\u9C0C\u9C06\u9C08\u9C12\u9C0A\u9C04\u9C2E\u9C1B\u9C25\u9C24\u9C21\u9C30\u9C47\u9C32\u9C46\u9C3E\u9C5A\u9C60\u9C67\u9C76\u9C78\u9CE7\u9CEC\u9CF0\u9D09\u9D08\u9CEB\u9D03\u9D06\u9D2A\u9D26\u9DAF\u9D23\u9D1F\u9D44\u9D15\u9D12\u9D41\u9D3F\u9D3E\u9D46\u9D48\"],\n[\"ea40\",\"\u9D5D\u9D5E\u9D64\u9D51\u9D50\u9D59\u9D72\u9D89\u9D87\u9DAB\u9D6F\u9D7A\u9D9A\u9DA4\u9DA9\u9DB2\u9DC4\u9DC1\u9DBB\u9DB8\u9DBA\u9DC6\u9DCF\u9DC2\u9DD9\u9DD3\u9DF8\u9DE6\u9DED\u9DEF\u9DFD\u9E1A\u9E1B\u9E1E\u9E75\u9E79\u9E7D\u9E81\u9E88\u9E8B\u9E8C\u9E92\u9E95\u9E91\u9E9D\u9EA5\u9EA9\u9EB8\u9EAA\u9EAD\u9761\u9ECC\u9ECE\u9ECF\u9ED0\u9ED4\u9EDC\u9EDE\u9EDD\u9EE0\u9EE5\u9EE8\u9EEF\"],\n[\"ea80\",\"\u9EF4\u9EF6\u9EF7\u9EF9\u9EFB\u9EFC\u9EFD\u9F07\u9F08\u76B7\u9F15\u9F21\u9F2C\u9F3E\u9F4A\u9F52\u9F54\u9F63\u9F5F\u9F60\u9F61\u9F66\u9F67\u9F6C\u9F6A\u9F77\u9F72\u9F76\u9F95\u9F9C\u9FA0\u582F\u69C7\u9059\u7464\u51DC\u7199\"],\n[\"ed40\",\"\u7E8A\u891C\u9348\u9288\u84DC\u4FC9\u70BB\u6631\u68C8\u92F9\u66FB\u5F45\u4E28\u4EE1\u4EFC\u4F00\u4F03\u4F39\u4F56\u4F92\u4F8A\u4F9A\u4F94\u4FCD\u5040\u5022\u4FFF\u501E\u5046\u5070\u5042\u5094\u50F4\u50D8\u514A\u5164\u519D\u51BE\u51EC\u5215\u529C\u52A6\u52C0\u52DB\u5300\u5307\u5324\u5372\u5393\u53B2\u53DD\uFA0E\u549C\u548A\u54A9\u54FF\u5586\u5759\u5765\u57AC\u57C8\u57C7\uFA0F\"],\n[\"ed80\",\"\uFA10\u589E\u58B2\u590B\u5953\u595B\u595D\u5963\u59A4\u59BA\u5B56\u5BC0\u752F\u5BD8\u5BEC\u5C1E\u5CA6\u5CBA\u5CF5\u5D27\u5D53\uFA11\u5D42\u5D6D\u5DB8\u5DB9\u5DD0\u5F21\u5F34\u5F67\u5FB7\u5FDE\u605D\u6085\u608A\u60DE\u60D5\u6120\u60F2\u6111\u6137\u6130\u6198\u6213\u62A6\u63F5\u6460\u649D\u64CE\u654E\u6600\u6615\u663B\u6609\u662E\u661E\u6624\u6665\u6657\u6659\uFA12\u6673\u6699\u66A0\u66B2\u66BF\u66FA\u670E\uF929\u6766\u67BB\u6852\u67C0\u6801\u6844\u68CF\uFA13\u6968\uFA14\u6998\u69E2\u6A30\u6A6B\u6A46\u6A73\u6A7E\u6AE2\u6AE4\u6BD6\u6C3F\u6C5C\u6C86\u6C6F\u6CDA\u6D04\u6D87\u6D6F\u6D96\u6DAC\u6DCF\u6DF8\u6DF2\u6DFC\u6E39\u6E5C\u6E27\u6E3C\u6EBF\u6F88\u6FB5\u6FF5\u7005\u7007\u7028\u7085\u70AB\u710F\u7104\u715C\u7146\u7147\uFA15\u71C1\u71FE\u72B1\"],\n[\"ee40\",\"\u72BE\u7324\uFA16\u7377\u73BD\u73C9\u73D6\u73E3\u73D2\u7407\u73F5\u7426\u742A\u7429\u742E\u7462\u7489\u749F\u7501\u756F\u7682\u769C\u769E\u769B\u76A6\uFA17\u7746\u52AF\u7821\u784E\u7864\u787A\u7930\uFA18\uFA19\uFA1A\u7994\uFA1B\u799B\u7AD1\u7AE7\uFA1C\u7AEB\u7B9E\uFA1D\u7D48\u7D5C\u7DB7\u7DA0\u7DD6\u7E52\u7F47\u7FA1\uFA1E\u8301\u8362\u837F\u83C7\u83F6\u8448\u84B4\u8553\u8559\"],\n[\"ee80\",\"\u856B\uFA1F\u85B0\uFA20\uFA21\u8807\u88F5\u8A12\u8A37\u8A79\u8AA7\u8ABE\u8ADF\uFA22\u8AF6\u8B53\u8B7F\u8CF0\u8CF4\u8D12\u8D76\uFA23\u8ECF\uFA24\uFA25\u9067\u90DE\uFA26\u9115\u9127\u91DA\u91D7\u91DE\u91ED\u91EE\u91E4\u91E5\u9206\u9210\u920A\u923A\u9240\u923C\u924E\u9259\u9251\u9239\u9267\u92A7\u9277\u9278\u92E7\u92D7\u92D9\u92D0\uFA27\u92D5\u92E0\u92D3\u9325\u9321\u92FB\uFA28\u931E\u92FF\u931D\u9302\u9370\u9357\u93A4\u93C6\u93DE\u93F8\u9431\u9445\u9448\u9592\uF9DC\uFA29\u969D\u96AF\u9733\u973B\u9743\u974D\u974F\u9751\u9755\u9857\u9865\uFA2A\uFA2B\u9927\uFA2C\u999E\u9A4E\u9AD9\u9ADC\u9B75\u9B72\u9B8F\u9BB1\u9BBB\u9C00\u9D70\u9D6B\uFA2D\u9E19\u9ED1\"],\n[\"eeef\",\"\u2170\",9,\"\uFFE2\uFFE4\uFF07\uFF02\"],\n[\"f040\",\"\uE000\",62],\n[\"f080\",\"\uE03F\",124],\n[\"f140\",\"\uE0BC\",62],\n[\"f180\",\"\uE0FB\",124],\n[\"f240\",\"\uE178\",62],\n[\"f280\",\"\uE1B7\",124],\n[\"f340\",\"\uE234\",62],\n[\"f380\",\"\uE273\",124],\n[\"f440\",\"\uE2F0\",62],\n[\"f480\",\"\uE32F\",124],\n[\"f540\",\"\uE3AC\",62],\n[\"f580\",\"\uE3EB\",124],\n[\"f640\",\"\uE468\",62],\n[\"f680\",\"\uE4A7\",124],\n[\"f740\",\"\uE524\",62],\n[\"f780\",\"\uE563\",124],\n[\"f840\",\"\uE5E0\",62],\n[\"f880\",\"\uE61F\",124],\n[\"f940\",\"\uE69C\"],\n[\"fa40\",\"\u2170\",9,\"\u2160\",9,\"\uFFE2\uFFE4\uFF07\uFF02\u3231\u2116\u2121\u2235\u7E8A\u891C\u9348\u9288\u84DC\u4FC9\u70BB\u6631\u68C8\u92F9\u66FB\u5F45\u4E28\u4EE1\u4EFC\u4F00\u4F03\u4F39\u4F56\u4F92\u4F8A\u4F9A\u4F94\u4FCD\u5040\u5022\u4FFF\u501E\u5046\u5070\u5042\u5094\u50F4\u50D8\u514A\"],\n[\"fa80\",\"\u5164\u519D\u51BE\u51EC\u5215\u529C\u52A6\u52C0\u52DB\u5300\u5307\u5324\u5372\u5393\u53B2\u53DD\uFA0E\u549C\u548A\u54A9\u54FF\u5586\u5759\u5765\u57AC\u57C8\u57C7\uFA0F\uFA10\u589E\u58B2\u590B\u5953\u595B\u595D\u5963\u59A4\u59BA\u5B56\u5BC0\u752F\u5BD8\u5BEC\u5C1E\u5CA6\u5CBA\u5CF5\u5D27\u5D53\uFA11\u5D42\u5D6D\u5DB8\u5DB9\u5DD0\u5F21\u5F34\u5F67\u5FB7\u5FDE\u605D\u6085\u608A\u60DE\u60D5\u6120\u60F2\u6111\u6137\u6130\u6198\u6213\u62A6\u63F5\u6460\u649D\u64CE\u654E\u6600\u6615\u663B\u6609\u662E\u661E\u6624\u6665\u6657\u6659\uFA12\u6673\u6699\u66A0\u66B2\u66BF\u66FA\u670E\uF929\u6766\u67BB\u6852\u67C0\u6801\u6844\u68CF\uFA13\u6968\uFA14\u6998\u69E2\u6A30\u6A6B\u6A46\u6A73\u6A7E\u6AE2\u6AE4\u6BD6\u6C3F\u6C5C\u6C86\u6C6F\u6CDA\u6D04\u6D87\u6D6F\"],\n[\"fb40\",\"\u6D96\u6DAC\u6DCF\u6DF8\u6DF2\u6DFC\u6E39\u6E5C\u6E27\u6E3C\u6EBF\u6F88\u6FB5\u6FF5\u7005\u7007\u7028\u7085\u70AB\u710F\u7104\u715C\u7146\u7147\uFA15\u71C1\u71FE\u72B1\u72BE\u7324\uFA16\u7377\u73BD\u73C9\u73D6\u73E3\u73D2\u7407\u73F5\u7426\u742A\u7429\u742E\u7462\u7489\u749F\u7501\u756F\u7682\u769C\u769E\u769B\u76A6\uFA17\u7746\u52AF\u7821\u784E\u7864\u787A\u7930\uFA18\uFA19\"],\n[\"fb80\",\"\uFA1A\u7994\uFA1B\u799B\u7AD1\u7AE7\uFA1C\u7AEB\u7B9E\uFA1D\u7D48\u7D5C\u7DB7\u7DA0\u7DD6\u7E52\u7F47\u7FA1\uFA1E\u8301\u8362\u837F\u83C7\u83F6\u8448\u84B4\u8553\u8559\u856B\uFA1F\u85B0\uFA20\uFA21\u8807\u88F5\u8A12\u8A37\u8A79\u8AA7\u8ABE\u8ADF\uFA22\u8AF6\u8B53\u8B7F\u8CF0\u8CF4\u8D12\u8D76\uFA23\u8ECF\uFA24\uFA25\u9067\u90DE\uFA26\u9115\u9127\u91DA\u91D7\u91DE\u91ED\u91EE\u91E4\u91E5\u9206\u9210\u920A\u923A\u9240\u923C\u924E\u9259\u9251\u9239\u9267\u92A7\u9277\u9278\u92E7\u92D7\u92D9\u92D0\uFA27\u92D5\u92E0\u92D3\u9325\u9321\u92FB\uFA28\u931E\u92FF\u931D\u9302\u9370\u9357\u93A4\u93C6\u93DE\u93F8\u9431\u9445\u9448\u9592\uF9DC\uFA29\u969D\u96AF\u9733\u973B\u9743\u974D\u974F\u9751\u9755\u9857\u9865\uFA2A\uFA2B\u9927\uFA2C\u999E\u9A4E\u9AD9\"],\n[\"fc40\",\"\u9ADC\u9B75\u9B72\u9B8F\u9BB1\u9BBB\u9C00\u9D70\u9D6B\uFA2D\u9E19\u9ED1\"]\n]\n", "[\n[\"0\",\"\\u0000\",127],\n[\"8ea1\",\"\uFF61\",62],\n[\"a1a1\",\"\u3000\u3001\u3002\uFF0C\uFF0E\u30FB\uFF1A\uFF1B\uFF1F\uFF01\u309B\u309C\u00B4\uFF40\u00A8\uFF3E\uFFE3\uFF3F\u30FD\u30FE\u309D\u309E\u3003\u4EDD\u3005\u3006\u3007\u30FC\u2015\u2010\uFF0F\uFF3C\uFF5E\u2225\uFF5C\u2026\u2025\u2018\u2019\u201C\u201D\uFF08\uFF09\u3014\u3015\uFF3B\uFF3D\uFF5B\uFF5D\u3008\",9,\"\uFF0B\uFF0D\u00B1\u00D7\u00F7\uFF1D\u2260\uFF1C\uFF1E\u2266\u2267\u221E\u2234\u2642\u2640\u00B0\u2032\u2033\u2103\uFFE5\uFF04\uFFE0\uFFE1\uFF05\uFF03\uFF06\uFF0A\uFF20\u00A7\u2606\u2605\u25CB\u25CF\u25CE\u25C7\"],\n[\"a2a1\",\"\u25C6\u25A1\u25A0\u25B3\u25B2\u25BD\u25BC\u203B\u3012\u2192\u2190\u2191\u2193\u3013\"],\n[\"a2ba\",\"\u2208\u220B\u2286\u2287\u2282\u2283\u222A\u2229\"],\n[\"a2ca\",\"\u2227\u2228\uFFE2\u21D2\u21D4\u2200\u2203\"],\n[\"a2dc\",\"\u2220\u22A5\u2312\u2202\u2207\u2261\u2252\u226A\u226B\u221A\u223D\u221D\u2235\u222B\u222C\"],\n[\"a2f2\",\"\u212B\u2030\u266F\u266D\u266A\u2020\u2021\u00B6\"],\n[\"a2fe\",\"\u25EF\"],\n[\"a3b0\",\"\uFF10\",9],\n[\"a3c1\",\"\uFF21\",25],\n[\"a3e1\",\"\uFF41\",25],\n[\"a4a1\",\"\u3041\",82],\n[\"a5a1\",\"\u30A1\",85],\n[\"a6a1\",\"\u0391\",16,\"\u03A3\",6],\n[\"a6c1\",\"\u03B1\",16,\"\u03C3\",6],\n[\"a7a1\",\"\u0410\",5,\"\u0401\u0416\",25],\n[\"a7d1\",\"\u0430\",5,\"\u0451\u0436\",25],\n[\"a8a1\",\"\u2500\u2502\u250C\u2510\u2518\u2514\u251C\u252C\u2524\u2534\u253C\u2501\u2503\u250F\u2513\u251B\u2517\u2523\u2533\u252B\u253B\u254B\u2520\u252F\u2528\u2537\u253F\u251D\u2530\u2525\u2538\u2542\"],\n[\"ada1\",\"\u2460\",19,\"\u2160\",9],\n[\"adc0\",\"\u3349\u3314\u3322\u334D\u3318\u3327\u3303\u3336\u3351\u3357\u330D\u3326\u3323\u332B\u334A\u333B\u339C\u339D\u339E\u338E\u338F\u33C4\u33A1\"],\n[\"addf\",\"\u337B\u301D\u301F\u2116\u33CD\u2121\u32A4\",4,\"\u3231\u3232\u3239\u337E\u337D\u337C\u2252\u2261\u222B\u222E\u2211\u221A\u22A5\u2220\u221F\u22BF\u2235\u2229\u222A\"],\n[\"b0a1\",\"\u4E9C\u5516\u5A03\u963F\u54C0\u611B\u6328\u59F6\u9022\u8475\u831C\u7A50\u60AA\u63E1\u6E25\u65ED\u8466\u82A6\u9BF5\u6893\u5727\u65A1\u6271\u5B9B\u59D0\u867B\u98F4\u7D62\u7DBE\u9B8E\u6216\u7C9F\u88B7\u5B89\u5EB5\u6309\u6697\u6848\u95C7\u978D\u674F\u4EE5\u4F0A\u4F4D\u4F9D\u5049\u56F2\u5937\u59D4\u5A01\u5C09\u60DF\u610F\u6170\u6613\u6905\u70BA\u754F\u7570\u79FB\u7DAD\u7DEF\u80C3\u840E\u8863\u8B02\u9055\u907A\u533B\u4E95\u4EA5\u57DF\u80B2\u90C1\u78EF\u4E00\u58F1\u6EA2\u9038\u7A32\u8328\u828B\u9C2F\u5141\u5370\u54BD\u54E1\u56E0\u59FB\u5F15\u98F2\u6DEB\u80E4\u852D\"],\n[\"b1a1\",\"\u9662\u9670\u96A0\u97FB\u540B\u53F3\u5B87\u70CF\u7FBD\u8FC2\u96E8\u536F\u9D5C\u7ABA\u4E11\u7893\u81FC\u6E26\u5618\u5504\u6B1D\u851A\u9C3B\u59E5\u53A9\u6D66\u74DC\u958F\u5642\u4E91\u904B\u96F2\u834F\u990C\u53E1\u55B6\u5B30\u5F71\u6620\u66F3\u6804\u6C38\u6CF3\u6D29\u745B\u76C8\u7A4E\u9834\u82F1\u885B\u8A60\u92ED\u6DB2\u75AB\u76CA\u99C5\u60A6\u8B01\u8D8A\u95B2\u698E\u53AD\u5186\u5712\u5830\u5944\u5BB4\u5EF6\u6028\u63A9\u63F4\u6CBF\u6F14\u708E\u7114\u7159\u71D5\u733F\u7E01\u8276\u82D1\u8597\u9060\u925B\u9D1B\u5869\u65BC\u6C5A\u7525\u51F9\u592E\u5965\u5F80\u5FDC\"],\n[\"b2a1\",\"\u62BC\u65FA\u6A2A\u6B27\u6BB4\u738B\u7FC1\u8956\u9D2C\u9D0E\u9EC4\u5CA1\u6C96\u837B\u5104\u5C4B\u61B6\u81C6\u6876\u7261\u4E59\u4FFA\u5378\u6069\u6E29\u7A4F\u97F3\u4E0B\u5316\u4EEE\u4F55\u4F3D\u4FA1\u4F73\u52A0\u53EF\u5609\u590F\u5AC1\u5BB6\u5BE1\u79D1\u6687\u679C\u67B6\u6B4C\u6CB3\u706B\u73C2\u798D\u79BE\u7A3C\u7B87\u82B1\u82DB\u8304\u8377\u83EF\u83D3\u8766\u8AB2\u5629\u8CA8\u8FE6\u904E\u971E\u868A\u4FC4\u5CE8\u6211\u7259\u753B\u81E5\u82BD\u86FE\u8CC0\u96C5\u9913\u99D5\u4ECB\u4F1A\u89E3\u56DE\u584A\u58CA\u5EFB\u5FEB\u602A\u6094\u6062\u61D0\u6212\u62D0\u6539\"],\n[\"b3a1\",\"\u9B41\u6666\u68B0\u6D77\u7070\u754C\u7686\u7D75\u82A5\u87F9\u958B\u968E\u8C9D\u51F1\u52BE\u5916\u54B3\u5BB3\u5D16\u6168\u6982\u6DAF\u788D\u84CB\u8857\u8A72\u93A7\u9AB8\u6D6C\u99A8\u86D9\u57A3\u67FF\u86CE\u920E\u5283\u5687\u5404\u5ED3\u62E1\u64B9\u683C\u6838\u6BBB\u7372\u78BA\u7A6B\u899A\u89D2\u8D6B\u8F03\u90ED\u95A3\u9694\u9769\u5B66\u5CB3\u697D\u984D\u984E\u639B\u7B20\u6A2B\u6A7F\u68B6\u9C0D\u6F5F\u5272\u559D\u6070\u62EC\u6D3B\u6E07\u6ED1\u845B\u8910\u8F44\u4E14\u9C39\u53F6\u691B\u6A3A\u9784\u682A\u515C\u7AC3\u84B2\u91DC\u938C\u565B\u9D28\u6822\u8305\u8431\"],\n[\"b4a1\",\"\u7CA5\u5208\u82C5\u74E6\u4E7E\u4F83\u51A0\u5BD2\u520A\u52D8\u52E7\u5DFB\u559A\u582A\u59E6\u5B8C\u5B98\u5BDB\u5E72\u5E79\u60A3\u611F\u6163\u61BE\u63DB\u6562\u67D1\u6853\u68FA\u6B3E\u6B53\u6C57\u6F22\u6F97\u6F45\u74B0\u7518\u76E3\u770B\u7AFF\u7BA1\u7C21\u7DE9\u7F36\u7FF0\u809D\u8266\u839E\u89B3\u8ACC\u8CAB\u9084\u9451\u9593\u9591\u95A2\u9665\u97D3\u9928\u8218\u4E38\u542B\u5CB8\u5DCC\u73A9\u764C\u773C\u5CA9\u7FEB\u8D0B\u96C1\u9811\u9854\u9858\u4F01\u4F0E\u5371\u559C\u5668\u57FA\u5947\u5B09\u5BC4\u5C90\u5E0C\u5E7E\u5FCC\u63EE\u673A\u65D7\u65E2\u671F\u68CB\u68C4\"],\n[\"b5a1\",\"\u6A5F\u5E30\u6BC5\u6C17\u6C7D\u757F\u7948\u5B63\u7A00\u7D00\u5FBD\u898F\u8A18\u8CB4\u8D77\u8ECC\u8F1D\u98E2\u9A0E\u9B3C\u4E80\u507D\u5100\u5993\u5B9C\u622F\u6280\u64EC\u6B3A\u72A0\u7591\u7947\u7FA9\u87FB\u8ABC\u8B70\u63AC\u83CA\u97A0\u5409\u5403\u55AB\u6854\u6A58\u8A70\u7827\u6775\u9ECD\u5374\u5BA2\u811A\u8650\u9006\u4E18\u4E45\u4EC7\u4F11\u53CA\u5438\u5BAE\u5F13\u6025\u6551\u673D\u6C42\u6C72\u6CE3\u7078\u7403\u7A76\u7AAE\u7B08\u7D1A\u7CFE\u7D66\u65E7\u725B\u53BB\u5C45\u5DE8\u62D2\u62E0\u6319\u6E20\u865A\u8A31\u8DDD\u92F8\u6F01\u79A6\u9B5A\u4EA8\u4EAB\u4EAC\"],\n[\"b6a1\",\"\u4F9B\u4FA0\u50D1\u5147\u7AF6\u5171\u51F6\u5354\u5321\u537F\u53EB\u55AC\u5883\u5CE1\u5F37\u5F4A\u602F\u6050\u606D\u631F\u6559\u6A4B\u6CC1\u72C2\u72ED\u77EF\u80F8\u8105\u8208\u854E\u90F7\u93E1\u97FF\u9957\u9A5A\u4EF0\u51DD\u5C2D\u6681\u696D\u5C40\u66F2\u6975\u7389\u6850\u7C81\u50C5\u52E4\u5747\u5DFE\u9326\u65A4\u6B23\u6B3D\u7434\u7981\u79BD\u7B4B\u7DCA\u82B9\u83CC\u887F\u895F\u8B39\u8FD1\u91D1\u541F\u9280\u4E5D\u5036\u53E5\u533A\u72D7\u7396\u77E9\u82E6\u8EAF\u99C6\u99C8\u99D2\u5177\u611A\u865E\u55B0\u7A7A\u5076\u5BD3\u9047\u9685\u4E32\u6ADB\u91E7\u5C51\u5C48\"],\n[\"b7a1\",\"\u6398\u7A9F\u6C93\u9774\u8F61\u7AAA\u718A\u9688\u7C82\u6817\u7E70\u6851\u936C\u52F2\u541B\u85AB\u8A13\u7FA4\u8ECD\u90E1\u5366\u8888\u7941\u4FC2\u50BE\u5211\u5144\u5553\u572D\u73EA\u578B\u5951\u5F62\u5F84\u6075\u6176\u6167\u61A9\u63B2\u643A\u656C\u666F\u6842\u6E13\u7566\u7A3D\u7CFB\u7D4C\u7D99\u7E4B\u7F6B\u830E\u834A\u86CD\u8A08\u8A63\u8B66\u8EFD\u981A\u9D8F\u82B8\u8FCE\u9BE8\u5287\u621F\u6483\u6FC0\u9699\u6841\u5091\u6B20\u6C7A\u6F54\u7A74\u7D50\u8840\u8A23\u6708\u4EF6\u5039\u5026\u5065\u517C\u5238\u5263\u55A7\u570F\u5805\u5ACC\u5EFA\u61B2\u61F8\u62F3\u6372\"],\n[\"b8a1\",\"\u691C\u6A29\u727D\u72AC\u732E\u7814\u786F\u7D79\u770C\u80A9\u898B\u8B19\u8CE2\u8ED2\u9063\u9375\u967A\u9855\u9A13\u9E78\u5143\u539F\u53B3\u5E7B\u5F26\u6E1B\u6E90\u7384\u73FE\u7D43\u8237\u8A00\u8AFA\u9650\u4E4E\u500B\u53E4\u547C\u56FA\u59D1\u5B64\u5DF1\u5EAB\u5F27\u6238\u6545\u67AF\u6E56\u72D0\u7CCA\u88B4\u80A1\u80E1\u83F0\u864E\u8A87\u8DE8\u9237\u96C7\u9867\u9F13\u4E94\u4E92\u4F0D\u5348\u5449\u543E\u5A2F\u5F8C\u5FA1\u609F\u68A7\u6A8E\u745A\u7881\u8A9E\u8AA4\u8B77\u9190\u4E5E\u9BC9\u4EA4\u4F7C\u4FAF\u5019\u5016\u5149\u516C\u529F\u52B9\u52FE\u539A\u53E3\u5411\"],\n[\"b9a1\",\"\u540E\u5589\u5751\u57A2\u597D\u5B54\u5B5D\u5B8F\u5DE5\u5DE7\u5DF7\u5E78\u5E83\u5E9A\u5EB7\u5F18\u6052\u614C\u6297\u62D8\u63A7\u653B\u6602\u6643\u66F4\u676D\u6821\u6897\u69CB\u6C5F\u6D2A\u6D69\u6E2F\u6E9D\u7532\u7687\u786C\u7A3F\u7CE0\u7D05\u7D18\u7D5E\u7DB1\u8015\u8003\u80AF\u80B1\u8154\u818F\u822A\u8352\u884C\u8861\u8B1B\u8CA2\u8CFC\u90CA\u9175\u9271\u783F\u92FC\u95A4\u964D\u9805\u9999\u9AD8\u9D3B\u525B\u52AB\u53F7\u5408\u58D5\u62F7\u6FE0\u8C6A\u8F5F\u9EB9\u514B\u523B\u544A\u56FD\u7A40\u9177\u9D60\u9ED2\u7344\u6F09\u8170\u7511\u5FFD\u60DA\u9AA8\u72DB\u8FBC\"],\n[\"baa1\",\"\u6B64\u9803\u4ECA\u56F0\u5764\u58BE\u5A5A\u6068\u61C7\u660F\u6606\u6839\u68B1\u6DF7\u75D5\u7D3A\u826E\u9B42\u4E9B\u4F50\u53C9\u5506\u5D6F\u5DE6\u5DEE\u67FB\u6C99\u7473\u7802\u8A50\u9396\u88DF\u5750\u5EA7\u632B\u50B5\u50AC\u518D\u6700\u54C9\u585E\u59BB\u5BB0\u5F69\u624D\u63A1\u683D\u6B73\u6E08\u707D\u91C7\u7280\u7815\u7826\u796D\u658E\u7D30\u83DC\u88C1\u8F09\u969B\u5264\u5728\u6750\u7F6A\u8CA1\u51B4\u5742\u962A\u583A\u698A\u80B4\u54B2\u5D0E\u57FC\u7895\u9DFA\u4F5C\u524A\u548B\u643E\u6628\u6714\u67F5\u7A84\u7B56\u7D22\u932F\u685C\u9BAD\u7B39\u5319\u518A\u5237\"],\n[\"bba1\",\"\u5BDF\u62F6\u64AE\u64E6\u672D\u6BBA\u85A9\u96D1\u7690\u9BD6\u634C\u9306\u9BAB\u76BF\u6652\u4E09\u5098\u53C2\u5C71\u60E8\u6492\u6563\u685F\u71E6\u73CA\u7523\u7B97\u7E82\u8695\u8B83\u8CDB\u9178\u9910\u65AC\u66AB\u6B8B\u4ED5\u4ED4\u4F3A\u4F7F\u523A\u53F8\u53F2\u55E3\u56DB\u58EB\u59CB\u59C9\u59FF\u5B50\u5C4D\u5E02\u5E2B\u5FD7\u601D\u6307\u652F\u5B5C\u65AF\u65BD\u65E8\u679D\u6B62\u6B7B\u6C0F\u7345\u7949\u79C1\u7CF8\u7D19\u7D2B\u80A2\u8102\u81F3\u8996\u8A5E\u8A69\u8A66\u8A8C\u8AEE\u8CC7\u8CDC\u96CC\u98FC\u6B6F\u4E8B\u4F3C\u4F8D\u5150\u5B57\u5BFA\u6148\u6301\u6642\"],\n[\"bca1\",\"\u6B21\u6ECB\u6CBB\u723E\u74BD\u75D4\u78C1\u793A\u800C\u8033\u81EA\u8494\u8F9E\u6C50\u9E7F\u5F0F\u8B58\u9D2B\u7AFA\u8EF8\u5B8D\u96EB\u4E03\u53F1\u57F7\u5931\u5AC9\u5BA4\u6089\u6E7F\u6F06\u75BE\u8CEA\u5B9F\u8500\u7BE0\u5072\u67F4\u829D\u5C61\u854A\u7E1E\u820E\u5199\u5C04\u6368\u8D66\u659C\u716E\u793E\u7D17\u8005\u8B1D\u8ECA\u906E\u86C7\u90AA\u501F\u52FA\u5C3A\u6753\u707C\u7235\u914C\u91C8\u932B\u82E5\u5BC2\u5F31\u60F9\u4E3B\u53D6\u5B88\u624B\u6731\u6B8A\u72E9\u73E0\u7A2E\u816B\u8DA3\u9152\u9996\u5112\u53D7\u546A\u5BFF\u6388\u6A39\u7DAC\u9700\u56DA\u53CE\u5468\"],\n[\"bda1\",\"\u5B97\u5C31\u5DDE\u4FEE\u6101\u62FE\u6D32\u79C0\u79CB\u7D42\u7E4D\u7FD2\u81ED\u821F\u8490\u8846\u8972\u8B90\u8E74\u8F2F\u9031\u914B\u916C\u96C6\u919C\u4EC0\u4F4F\u5145\u5341\u5F93\u620E\u67D4\u6C41\u6E0B\u7363\u7E26\u91CD\u9283\u53D4\u5919\u5BBF\u6DD1\u795D\u7E2E\u7C9B\u587E\u719F\u51FA\u8853\u8FF0\u4FCA\u5CFB\u6625\u77AC\u7AE3\u821C\u99FF\u51C6\u5FAA\u65EC\u696F\u6B89\u6DF3\u6E96\u6F64\u76FE\u7D14\u5DE1\u9075\u9187\u9806\u51E6\u521D\u6240\u6691\u66D9\u6E1A\u5EB6\u7DD2\u7F72\u66F8\u85AF\u85F7\u8AF8\u52A9\u53D9\u5973\u5E8F\u5F90\u6055\u92E4\u9664\u50B7\u511F\"],\n[\"bea1\",\"\u52DD\u5320\u5347\u53EC\u54E8\u5546\u5531\u5617\u5968\u59BE\u5A3C\u5BB5\u5C06\u5C0F\u5C11\u5C1A\u5E84\u5E8A\u5EE0\u5F70\u627F\u6284\u62DB\u638C\u6377\u6607\u660C\u662D\u6676\u677E\u68A2\u6A1F\u6A35\u6CBC\u6D88\u6E09\u6E58\u713C\u7126\u7167\u75C7\u7701\u785D\u7901\u7965\u79F0\u7AE0\u7B11\u7CA7\u7D39\u8096\u83D6\u848B\u8549\u885D\u88F3\u8A1F\u8A3C\u8A54\u8A73\u8C61\u8CDE\u91A4\u9266\u937E\u9418\u969C\u9798\u4E0A\u4E08\u4E1E\u4E57\u5197\u5270\u57CE\u5834\u58CC\u5B22\u5E38\u60C5\u64FE\u6761\u6756\u6D44\u72B6\u7573\u7A63\u84B8\u8B72\u91B8\u9320\u5631\u57F4\u98FE\"],\n[\"bfa1\",\"\u62ED\u690D\u6B96\u71ED\u7E54\u8077\u8272\u89E6\u98DF\u8755\u8FB1\u5C3B\u4F38\u4FE1\u4FB5\u5507\u5A20\u5BDD\u5BE9\u5FC3\u614E\u632F\u65B0\u664B\u68EE\u699B\u6D78\u6DF1\u7533\u75B9\u771F\u795E\u79E6\u7D33\u81E3\u82AF\u85AA\u89AA\u8A3A\u8EAB\u8F9B\u9032\u91DD\u9707\u4EBA\u4EC1\u5203\u5875\u58EC\u5C0B\u751A\u5C3D\u814E\u8A0A\u8FC5\u9663\u976D\u7B25\u8ACF\u9808\u9162\u56F3\u53A8\u9017\u5439\u5782\u5E25\u63A8\u6C34\u708A\u7761\u7C8B\u7FE0\u8870\u9042\u9154\u9310\u9318\u968F\u745E\u9AC4\u5D07\u5D69\u6570\u67A2\u8DA8\u96DB\u636E\u6749\u6919\u83C5\u9817\u96C0\u88FE\"],\n[\"c0a1\",\"\u6F84\u647A\u5BF8\u4E16\u702C\u755D\u662F\u51C4\u5236\u52E2\u59D3\u5F81\u6027\u6210\u653F\u6574\u661F\u6674\u68F2\u6816\u6B63\u6E05\u7272\u751F\u76DB\u7CBE\u8056\u58F0\u88FD\u897F\u8AA0\u8A93\u8ACB\u901D\u9192\u9752\u9759\u6589\u7A0E\u8106\u96BB\u5E2D\u60DC\u621A\u65A5\u6614\u6790\u77F3\u7A4D\u7C4D\u7E3E\u810A\u8CAC\u8D64\u8DE1\u8E5F\u78A9\u5207\u62D9\u63A5\u6442\u6298\u8A2D\u7A83\u7BC0\u8AAC\u96EA\u7D76\u820C\u8749\u4ED9\u5148\u5343\u5360\u5BA3\u5C02\u5C16\u5DDD\u6226\u6247\u64B0\u6813\u6834\u6CC9\u6D45\u6D17\u67D3\u6F5C\u714E\u717D\u65CB\u7A7F\u7BAD\u7DDA\"],\n[\"c1a1\",\"\u7E4A\u7FA8\u817A\u821B\u8239\u85A6\u8A6E\u8CCE\u8DF5\u9078\u9077\u92AD\u9291\u9583\u9BAE\u524D\u5584\u6F38\u7136\u5168\u7985\u7E55\u81B3\u7CCE\u564C\u5851\u5CA8\u63AA\u66FE\u66FD\u695A\u72D9\u758F\u758E\u790E\u7956\u79DF\u7C97\u7D20\u7D44\u8607\u8A34\u963B\u9061\u9F20\u50E7\u5275\u53CC\u53E2\u5009\u55AA\u58EE\u594F\u723D\u5B8B\u5C64\u531D\u60E3\u60F3\u635C\u6383\u633F\u63BB\u64CD\u65E9\u66F9\u5DE3\u69CD\u69FD\u6F15\u71E5\u4E89\u75E9\u76F8\u7A93\u7CDF\u7DCF\u7D9C\u8061\u8349\u8358\u846C\u84BC\u85FB\u88C5\u8D70\u9001\u906D\u9397\u971C\u9A12\u50CF\u5897\u618E\"],\n[\"c2a1\",\"\u81D3\u8535\u8D08\u9020\u4FC3\u5074\u5247\u5373\u606F\u6349\u675F\u6E2C\u8DB3\u901F\u4FD7\u5C5E\u8CCA\u65CF\u7D9A\u5352\u8896\u5176\u63C3\u5B58\u5B6B\u5C0A\u640D\u6751\u905C\u4ED6\u591A\u592A\u6C70\u8A51\u553E\u5815\u59A5\u60F0\u6253\u67C1\u8235\u6955\u9640\u99C4\u9A28\u4F53\u5806\u5BFE\u8010\u5CB1\u5E2F\u5F85\u6020\u614B\u6234\u66FF\u6CF0\u6EDE\u80CE\u817F\u82D4\u888B\u8CB8\u9000\u902E\u968A\u9EDB\u9BDB\u4EE3\u53F0\u5927\u7B2C\u918D\u984C\u9DF9\u6EDD\u7027\u5353\u5544\u5B85\u6258\u629E\u62D3\u6CA2\u6FEF\u7422\u8A17\u9438\u6FC1\u8AFE\u8338\u51E7\u86F8\u53EA\"],\n[\"c3a1\",\"\u53E9\u4F46\u9054\u8FB0\u596A\u8131\u5DFD\u7AEA\u8FBF\u68DA\u8C37\u72F8\u9C48\u6A3D\u8AB0\u4E39\u5358\u5606\u5766\u62C5\u63A2\u65E6\u6B4E\u6DE1\u6E5B\u70AD\u77ED\u7AEF\u7BAA\u7DBB\u803D\u80C6\u86CB\u8A95\u935B\u56E3\u58C7\u5F3E\u65AD\u6696\u6A80\u6BB5\u7537\u8AC7\u5024\u77E5\u5730\u5F1B\u6065\u667A\u6C60\u75F4\u7A1A\u7F6E\u81F4\u8718\u9045\u99B3\u7BC9\u755C\u7AF9\u7B51\u84C4\u9010\u79E9\u7A92\u8336\u5AE1\u7740\u4E2D\u4EF2\u5B99\u5FE0\u62BD\u663C\u67F1\u6CE8\u866B\u8877\u8A3B\u914E\u92F3\u99D0\u6A17\u7026\u732A\u82E7\u8457\u8CAF\u4E01\u5146\u51CB\u558B\u5BF5\"],\n[\"c4a1\",\"\u5E16\u5E33\u5E81\u5F14\u5F35\u5F6B\u5FB4\u61F2\u6311\u66A2\u671D\u6F6E\u7252\u753A\u773A\u8074\u8139\u8178\u8776\u8ABF\u8ADC\u8D85\u8DF3\u929A\u9577\u9802\u9CE5\u52C5\u6357\u76F4\u6715\u6C88\u73CD\u8CC3\u93AE\u9673\u6D25\u589C\u690E\u69CC\u8FFD\u939A\u75DB\u901A\u585A\u6802\u63B4\u69FB\u4F43\u6F2C\u67D8\u8FBB\u8526\u7DB4\u9354\u693F\u6F70\u576A\u58F7\u5B2C\u7D2C\u722A\u540A\u91E3\u9DB4\u4EAD\u4F4E\u505C\u5075\u5243\u8C9E\u5448\u5824\u5B9A\u5E1D\u5E95\u5EAD\u5EF7\u5F1F\u608C\u62B5\u633A\u63D0\u68AF\u6C40\u7887\u798E\u7A0B\u7DE0\u8247\u8A02\u8AE6\u8E44\u9013\"],\n[\"c5a1\",\"\u90B8\u912D\u91D8\u9F0E\u6CE5\u6458\u64E2\u6575\u6EF4\u7684\u7B1B\u9069\u93D1\u6EBA\u54F2\u5FB9\u64A4\u8F4D\u8FED\u9244\u5178\u586B\u5929\u5C55\u5E97\u6DFB\u7E8F\u751C\u8CBC\u8EE2\u985B\u70B9\u4F1D\u6BBF\u6FB1\u7530\u96FB\u514E\u5410\u5835\u5857\u59AC\u5C60\u5F92\u6597\u675C\u6E21\u767B\u83DF\u8CED\u9014\u90FD\u934D\u7825\u783A\u52AA\u5EA6\u571F\u5974\u6012\u5012\u515A\u51AC\u51CD\u5200\u5510\u5854\u5858\u5957\u5B95\u5CF6\u5D8B\u60BC\u6295\u642D\u6771\u6843\u68BC\u68DF\u76D7\u6DD8\u6E6F\u6D9B\u706F\u71C8\u5F53\u75D8\u7977\u7B49\u7B54\u7B52\u7CD6\u7D71\u5230\"],\n[\"c6a1\",\"\u8463\u8569\u85E4\u8A0E\u8B04\u8C46\u8E0F\u9003\u900F\u9419\u9676\u982D\u9A30\u95D8\u50CD\u52D5\u540C\u5802\u5C0E\u61A7\u649E\u6D1E\u77B3\u7AE5\u80F4\u8404\u9053\u9285\u5CE0\u9D07\u533F\u5F97\u5FB3\u6D9C\u7279\u7763\u79BF\u7BE4\u6BD2\u72EC\u8AAD\u6803\u6A61\u51F8\u7A81\u6934\u5C4A\u9CF6\u82EB\u5BC5\u9149\u701E\u5678\u5C6F\u60C7\u6566\u6C8C\u8C5A\u9041\u9813\u5451\u66C7\u920D\u5948\u90A3\u5185\u4E4D\u51EA\u8599\u8B0E\u7058\u637A\u934B\u6962\u99B4\u7E04\u7577\u5357\u6960\u8EDF\u96E3\u6C5D\u4E8C\u5C3C\u5F10\u8FE9\u5302\u8CD1\u8089\u8679\u5EFF\u65E5\u4E73\u5165\"],\n[\"c7a1\",\"\u5982\u5C3F\u97EE\u4EFB\u598A\u5FCD\u8A8D\u6FE1\u79B0\u7962\u5BE7\u8471\u732B\u71B1\u5E74\u5FF5\u637B\u649A\u71C3\u7C98\u4E43\u5EFC\u4E4B\u57DC\u56A2\u60A9\u6FC3\u7D0D\u80FD\u8133\u81BF\u8FB2\u8997\u86A4\u5DF4\u628A\u64AD\u8987\u6777\u6CE2\u6D3E\u7436\u7834\u5A46\u7F75\u82AD\u99AC\u4FF3\u5EC3\u62DD\u6392\u6557\u676F\u76C3\u724C\u80CC\u80BA\u8F29\u914D\u500D\u57F9\u5A92\u6885\u6973\u7164\u72FD\u8CB7\u58F2\u8CE0\u966A\u9019\u877F\u79E4\u77E7\u8429\u4F2F\u5265\u535A\u62CD\u67CF\u6CCA\u767D\u7B94\u7C95\u8236\u8584\u8FEB\u66DD\u6F20\u7206\u7E1B\u83AB\u99C1\u9EA6\"],\n[\"c8a1\",\"\u51FD\u7BB1\u7872\u7BB8\u8087\u7B48\u6AE8\u5E61\u808C\u7551\u7560\u516B\u9262\u6E8C\u767A\u9197\u9AEA\u4F10\u7F70\u629C\u7B4F\u95A5\u9CE9\u567A\u5859\u86E4\u96BC\u4F34\u5224\u534A\u53CD\u53DB\u5E06\u642C\u6591\u677F\u6C3E\u6C4E\u7248\u72AF\u73ED\u7554\u7E41\u822C\u85E9\u8CA9\u7BC4\u91C6\u7169\u9812\u98EF\u633D\u6669\u756A\u76E4\u78D0\u8543\u86EE\u532A\u5351\u5426\u5983\u5E87\u5F7C\u60B2\u6249\u6279\u62AB\u6590\u6BD4\u6CCC\u75B2\u76AE\u7891\u79D8\u7DCB\u7F77\u80A5\u88AB\u8AB9\u8CBB\u907F\u975E\u98DB\u6A0B\u7C38\u5099\u5C3E\u5FAE\u6787\u6BD8\u7435\u7709\u7F8E\"],\n[\"c9a1\",\"\u9F3B\u67CA\u7A17\u5339\u758B\u9AED\u5F66\u819D\u83F1\u8098\u5F3C\u5FC5\u7562\u7B46\u903C\u6867\u59EB\u5A9B\u7D10\u767E\u8B2C\u4FF5\u5F6A\u6A19\u6C37\u6F02\u74E2\u7968\u8868\u8A55\u8C79\u5EDF\u63CF\u75C5\u79D2\u82D7\u9328\u92F2\u849C\u86ED\u9C2D\u54C1\u5F6C\u658C\u6D5C\u7015\u8CA7\u8CD3\u983B\u654F\u74F6\u4E0D\u4ED8\u57E0\u592B\u5A66\u5BCC\u51A8\u5E03\u5E9C\u6016\u6276\u6577\u65A7\u666E\u6D6E\u7236\u7B26\u8150\u819A\u8299\u8B5C\u8CA0\u8CE6\u8D74\u961C\u9644\u4FAE\u64AB\u6B66\u821E\u8461\u856A\u90E8\u5C01\u6953\u98A8\u847A\u8557\u4F0F\u526F\u5FA9\u5E45\u670D\"],\n[\"caa1\",\"\u798F\u8179\u8907\u8986\u6DF5\u5F17\u6255\u6CB8\u4ECF\u7269\u9B92\u5206\u543B\u5674\u58B3\u61A4\u626E\u711A\u596E\u7C89\u7CDE\u7D1B\u96F0\u6587\u805E\u4E19\u4F75\u5175\u5840\u5E63\u5E73\u5F0A\u67C4\u4E26\u853D\u9589\u965B\u7C73\u9801\u50FB\u58C1\u7656\u78A7\u5225\u77A5\u8511\u7B86\u504F\u5909\u7247\u7BC7\u7DE8\u8FBA\u8FD4\u904D\u4FBF\u52C9\u5A29\u5F01\u97AD\u4FDD\u8217\u92EA\u5703\u6355\u6B69\u752B\u88DC\u8F14\u7A42\u52DF\u5893\u6155\u620A\u66AE\u6BCD\u7C3F\u83E9\u5023\u4FF8\u5305\u5446\u5831\u5949\u5B9D\u5CF0\u5CEF\u5D29\u5E96\u62B1\u6367\u653E\u65B9\u670B\"],\n[\"cba1\",\"\u6CD5\u6CE1\u70F9\u7832\u7E2B\u80DE\u82B3\u840C\u84EC\u8702\u8912\u8A2A\u8C4A\u90A6\u92D2\u98FD\u9CF3\u9D6C\u4E4F\u4EA1\u508D\u5256\u574A\u59A8\u5E3D\u5FD8\u5FD9\u623F\u66B4\u671B\u67D0\u68D2\u5192\u7D21\u80AA\u81A8\u8B00\u8C8C\u8CBF\u927E\u9632\u5420\u982C\u5317\u50D5\u535C\u58A8\u64B2\u6734\u7267\u7766\u7A46\u91E6\u52C3\u6CA1\u6B86\u5800\u5E4C\u5954\u672C\u7FFB\u51E1\u76C6\u6469\u78E8\u9B54\u9EBB\u57CB\u59B9\u6627\u679A\u6BCE\u54E9\u69D9\u5E55\u819C\u6795\u9BAA\u67FE\u9C52\u685D\u4EA6\u4FE3\u53C8\u62B9\u672B\u6CAB\u8FC4\u4FAD\u7E6D\u9EBF\u4E07\u6162\u6E80\"],\n[\"cca1\",\"\u6F2B\u8513\u5473\u672A\u9B45\u5DF3\u7B95\u5CAC\u5BC6\u871C\u6E4A\u84D1\u7A14\u8108\u5999\u7C8D\u6C11\u7720\u52D9\u5922\u7121\u725F\u77DB\u9727\u9D61\u690B\u5A7F\u5A18\u51A5\u540D\u547D\u660E\u76DF\u8FF7\u9298\u9CF4\u59EA\u725D\u6EC5\u514D\u68C9\u7DBF\u7DEC\u9762\u9EBA\u6478\u6A21\u8302\u5984\u5B5F\u6BDB\u731B\u76F2\u7DB2\u8017\u8499\u5132\u6728\u9ED9\u76EE\u6762\u52FF\u9905\u5C24\u623B\u7C7E\u8CB0\u554F\u60B6\u7D0B\u9580\u5301\u4E5F\u51B6\u591C\u723A\u8036\u91CE\u5F25\u77E2\u5384\u5F79\u7D04\u85AC\u8A33\u8E8D\u9756\u67F3\u85AE\u9453\u6109\u6108\u6CB9\u7652\"],\n[\"cda1\",\"\u8AED\u8F38\u552F\u4F51\u512A\u52C7\u53CB\u5BA5\u5E7D\u60A0\u6182\u63D6\u6709\u67DA\u6E67\u6D8C\u7336\u7337\u7531\u7950\u88D5\u8A98\u904A\u9091\u90F5\u96C4\u878D\u5915\u4E88\u4F59\u4E0E\u8A89\u8F3F\u9810\u50AD\u5E7C\u5996\u5BB9\u5EB8\u63DA\u63FA\u64C1\u66DC\u694A\u69D8\u6D0B\u6EB6\u7194\u7528\u7AAF\u7F8A\u8000\u8449\u84C9\u8981\u8B21\u8E0A\u9065\u967D\u990A\u617E\u6291\u6B32\u6C83\u6D74\u7FCC\u7FFC\u6DC0\u7F85\u87BA\u88F8\u6765\u83B1\u983C\u96F7\u6D1B\u7D61\u843D\u916A\u4E71\u5375\u5D50\u6B04\u6FEB\u85CD\u862D\u89A7\u5229\u540F\u5C65\u674E\u68A8\u7406\u7483\"],\n[\"cea1\",\"\u75E2\u88CF\u88E1\u91CC\u96E2\u9678\u5F8B\u7387\u7ACB\u844E\u63A0\u7565\u5289\u6D41\u6E9C\u7409\u7559\u786B\u7C92\u9686\u7ADC\u9F8D\u4FB6\u616E\u65C5\u865C\u4E86\u4EAE\u50DA\u4E21\u51CC\u5BEE\u6599\u6881\u6DBC\u731F\u7642\u77AD\u7A1C\u7CE7\u826F\u8AD2\u907C\u91CF\u9675\u9818\u529B\u7DD1\u502B\u5398\u6797\u6DCB\u71D0\u7433\u81E8\u8F2A\u96A3\u9C57\u9E9F\u7460\u5841\u6D99\u7D2F\u985E\u4EE4\u4F36\u4F8B\u51B7\u52B1\u5DBA\u601C\u73B2\u793C\u82D3\u9234\u96B7\u96F6\u970A\u9E97\u9F62\u66A6\u6B74\u5217\u52A3\u70C8\u88C2\u5EC9\u604B\u6190\u6F23\u7149\u7C3E\u7DF4\u806F\"],\n[\"cfa1\",\"\u84EE\u9023\u932C\u5442\u9B6F\u6AD3\u7089\u8CC2\u8DEF\u9732\u52B4\u5A41\u5ECA\u5F04\u6717\u697C\u6994\u6D6A\u6F0F\u7262\u72FC\u7BED\u8001\u807E\u874B\u90CE\u516D\u9E93\u7984\u808B\u9332\u8AD6\u502D\u548C\u8A71\u6B6A\u8CC4\u8107\u60D1\u67A0\u9DF2\u4E99\u4E98\u9C10\u8A6B\u85C1\u8568\u6900\u6E7E\u7897\u8155\"],\n[\"d0a1\",\"\u5F0C\u4E10\u4E15\u4E2A\u4E31\u4E36\u4E3C\u4E3F\u4E42\u4E56\u4E58\u4E82\u4E85\u8C6B\u4E8A\u8212\u5F0D\u4E8E\u4E9E\u4E9F\u4EA0\u4EA2\u4EB0\u4EB3\u4EB6\u4ECE\u4ECD\u4EC4\u4EC6\u4EC2\u4ED7\u4EDE\u4EED\u4EDF\u4EF7\u4F09\u4F5A\u4F30\u4F5B\u4F5D\u4F57\u4F47\u4F76\u4F88\u4F8F\u4F98\u4F7B\u4F69\u4F70\u4F91\u4F6F\u4F86\u4F96\u5118\u4FD4\u4FDF\u4FCE\u4FD8\u4FDB\u4FD1\u4FDA\u4FD0\u4FE4\u4FE5\u501A\u5028\u5014\u502A\u5025\u5005\u4F1C\u4FF6\u5021\u5029\u502C\u4FFE\u4FEF\u5011\u5006\u5043\u5047\u6703\u5055\u5050\u5048\u505A\u5056\u506C\u5078\u5080\u509A\u5085\u50B4\u50B2\"],\n[\"d1a1\",\"\u50C9\u50CA\u50B3\u50C2\u50D6\u50DE\u50E5\u50ED\u50E3\u50EE\u50F9\u50F5\u5109\u5101\u5102\u5116\u5115\u5114\u511A\u5121\u513A\u5137\u513C\u513B\u513F\u5140\u5152\u514C\u5154\u5162\u7AF8\u5169\u516A\u516E\u5180\u5182\u56D8\u518C\u5189\u518F\u5191\u5193\u5195\u5196\u51A4\u51A6\u51A2\u51A9\u51AA\u51AB\u51B3\u51B1\u51B2\u51B0\u51B5\u51BD\u51C5\u51C9\u51DB\u51E0\u8655\u51E9\u51ED\u51F0\u51F5\u51FE\u5204\u520B\u5214\u520E\u5227\u522A\u522E\u5233\u5239\u524F\u5244\u524B\u524C\u525E\u5254\u526A\u5274\u5269\u5273\u527F\u527D\u528D\u5294\u5292\u5271\u5288\u5291\u8FA8\"],\n[\"d2a1\",\"\u8FA7\u52AC\u52AD\u52BC\u52B5\u52C1\u52CD\u52D7\u52DE\u52E3\u52E6\u98ED\u52E0\u52F3\u52F5\u52F8\u52F9\u5306\u5308\u7538\u530D\u5310\u530F\u5315\u531A\u5323\u532F\u5331\u5333\u5338\u5340\u5346\u5345\u4E17\u5349\u534D\u51D6\u535E\u5369\u536E\u5918\u537B\u5377\u5382\u5396\u53A0\u53A6\u53A5\u53AE\u53B0\u53B6\u53C3\u7C12\u96D9\u53DF\u66FC\u71EE\u53EE\u53E8\u53ED\u53FA\u5401\u543D\u5440\u542C\u542D\u543C\u542E\u5436\u5429\u541D\u544E\u548F\u5475\u548E\u545F\u5471\u5477\u5470\u5492\u547B\u5480\u5476\u5484\u5490\u5486\u54C7\u54A2\u54B8\u54A5\u54AC\u54C4\u54C8\u54A8\"],\n[\"d3a1\",\"\u54AB\u54C2\u54A4\u54BE\u54BC\u54D8\u54E5\u54E6\u550F\u5514\u54FD\u54EE\u54ED\u54FA\u54E2\u5539\u5540\u5563\u554C\u552E\u555C\u5545\u5556\u5557\u5538\u5533\u555D\u5599\u5580\u54AF\u558A\u559F\u557B\u557E\u5598\u559E\u55AE\u557C\u5583\u55A9\u5587\u55A8\u55DA\u55C5\u55DF\u55C4\u55DC\u55E4\u55D4\u5614\u55F7\u5616\u55FE\u55FD\u561B\u55F9\u564E\u5650\u71DF\u5634\u5636\u5632\u5638\u566B\u5664\u562F\u566C\u566A\u5686\u5680\u568A\u56A0\u5694\u568F\u56A5\u56AE\u56B6\u56B4\u56C2\u56BC\u56C1\u56C3\u56C0\u56C8\u56CE\u56D1\u56D3\u56D7\u56EE\u56F9\u5700\u56FF\u5704\u5709\"],\n[\"d4a1\",\"\u5708\u570B\u570D\u5713\u5718\u5716\u55C7\u571C\u5726\u5737\u5738\u574E\u573B\u5740\u574F\u5769\u57C0\u5788\u5761\u577F\u5789\u5793\u57A0\u57B3\u57A4\u57AA\u57B0\u57C3\u57C6\u57D4\u57D2\u57D3\u580A\u57D6\u57E3\u580B\u5819\u581D\u5872\u5821\u5862\u584B\u5870\u6BC0\u5852\u583D\u5879\u5885\u58B9\u589F\u58AB\u58BA\u58DE\u58BB\u58B8\u58AE\u58C5\u58D3\u58D1\u58D7\u58D9\u58D8\u58E5\u58DC\u58E4\u58DF\u58EF\u58FA\u58F9\u58FB\u58FC\u58FD\u5902\u590A\u5910\u591B\u68A6\u5925\u592C\u592D\u5932\u5938\u593E\u7AD2\u5955\u5950\u594E\u595A\u5958\u5962\u5960\u5967\u596C\u5969\"],\n[\"d5a1\",\"\u5978\u5981\u599D\u4F5E\u4FAB\u59A3\u59B2\u59C6\u59E8\u59DC\u598D\u59D9\u59DA\u5A25\u5A1F\u5A11\u5A1C\u5A09\u5A1A\u5A40\u5A6C\u5A49\u5A35\u5A36\u5A62\u5A6A\u5A9A\u5ABC\u5ABE\u5ACB\u5AC2\u5ABD\u5AE3\u5AD7\u5AE6\u5AE9\u5AD6\u5AFA\u5AFB\u5B0C\u5B0B\u5B16\u5B32\u5AD0\u5B2A\u5B36\u5B3E\u5B43\u5B45\u5B40\u5B51\u5B55\u5B5A\u5B5B\u5B65\u5B69\u5B70\u5B73\u5B75\u5B78\u6588\u5B7A\u5B80\u5B83\u5BA6\u5BB8\u5BC3\u5BC7\u5BC9\u5BD4\u5BD0\u5BE4\u5BE6\u5BE2\u5BDE\u5BE5\u5BEB\u5BF0\u5BF6\u5BF3\u5C05\u5C07\u5C08\u5C0D\u5C13\u5C20\u5C22\u5C28\u5C38\u5C39\u5C41\u5C46\u5C4E\u5C53\"],\n[\"d6a1\",\"\u5C50\u5C4F\u5B71\u5C6C\u5C6E\u4E62\u5C76\u5C79\u5C8C\u5C91\u5C94\u599B\u5CAB\u5CBB\u5CB6\u5CBC\u5CB7\u5CC5\u5CBE\u5CC7\u5CD9\u5CE9\u5CFD\u5CFA\u5CED\u5D8C\u5CEA\u5D0B\u5D15\u5D17\u5D5C\u5D1F\u5D1B\u5D11\u5D14\u5D22\u5D1A\u5D19\u5D18\u5D4C\u5D52\u5D4E\u5D4B\u5D6C\u5D73\u5D76\u5D87\u5D84\u5D82\u5DA2\u5D9D\u5DAC\u5DAE\u5DBD\u5D90\u5DB7\u5DBC\u5DC9\u5DCD\u5DD3\u5DD2\u5DD6\u5DDB\u5DEB\u5DF2\u5DF5\u5E0B\u5E1A\u5E19\u5E11\u5E1B\u5E36\u5E37\u5E44\u5E43\u5E40\u5E4E\u5E57\u5E54\u5E5F\u5E62\u5E64\u5E47\u5E75\u5E76\u5E7A\u9EBC\u5E7F\u5EA0\u5EC1\u5EC2\u5EC8\u5ED0\u5ECF\"],\n[\"d7a1\",\"\u5ED6\u5EE3\u5EDD\u5EDA\u5EDB\u5EE2\u5EE1\u5EE8\u5EE9\u5EEC\u5EF1\u5EF3\u5EF0\u5EF4\u5EF8\u5EFE\u5F03\u5F09\u5F5D\u5F5C\u5F0B\u5F11\u5F16\u5F29\u5F2D\u5F38\u5F41\u5F48\u5F4C\u5F4E\u5F2F\u5F51\u5F56\u5F57\u5F59\u5F61\u5F6D\u5F73\u5F77\u5F83\u5F82\u5F7F\u5F8A\u5F88\u5F91\u5F87\u5F9E\u5F99\u5F98\u5FA0\u5FA8\u5FAD\u5FBC\u5FD6\u5FFB\u5FE4\u5FF8\u5FF1\u5FDD\u60B3\u5FFF\u6021\u6060\u6019\u6010\u6029\u600E\u6031\u601B\u6015\u602B\u6026\u600F\u603A\u605A\u6041\u606A\u6077\u605F\u604A\u6046\u604D\u6063\u6043\u6064\u6042\u606C\u606B\u6059\u6081\u608D\u60E7\u6083\u609A\"],\n[\"d8a1\",\"\u6084\u609B\u6096\u6097\u6092\u60A7\u608B\u60E1\u60B8\u60E0\u60D3\u60B4\u5FF0\u60BD\u60C6\u60B5\u60D8\u614D\u6115\u6106\u60F6\u60F7\u6100\u60F4\u60FA\u6103\u6121\u60FB\u60F1\u610D\u610E\u6147\u613E\u6128\u6127\u614A\u613F\u613C\u612C\u6134\u613D\u6142\u6144\u6173\u6177\u6158\u6159\u615A\u616B\u6174\u616F\u6165\u6171\u615F\u615D\u6153\u6175\u6199\u6196\u6187\u61AC\u6194\u619A\u618A\u6191\u61AB\u61AE\u61CC\u61CA\u61C9\u61F7\u61C8\u61C3\u61C6\u61BA\u61CB\u7F79\u61CD\u61E6\u61E3\u61F6\u61FA\u61F4\u61FF\u61FD\u61FC\u61FE\u6200\u6208\u6209\u620D\u620C\u6214\u621B\"],\n[\"d9a1\",\"\u621E\u6221\u622A\u622E\u6230\u6232\u6233\u6241\u624E\u625E\u6263\u625B\u6260\u6268\u627C\u6282\u6289\u627E\u6292\u6293\u6296\u62D4\u6283\u6294\u62D7\u62D1\u62BB\u62CF\u62FF\u62C6\u64D4\u62C8\u62DC\u62CC\u62CA\u62C2\u62C7\u629B\u62C9\u630C\u62EE\u62F1\u6327\u6302\u6308\u62EF\u62F5\u6350\u633E\u634D\u641C\u634F\u6396\u638E\u6380\u63AB\u6376\u63A3\u638F\u6389\u639F\u63B5\u636B\u6369\u63BE\u63E9\u63C0\u63C6\u63E3\u63C9\u63D2\u63F6\u63C4\u6416\u6434\u6406\u6413\u6426\u6436\u651D\u6417\u6428\u640F\u6467\u646F\u6476\u644E\u652A\u6495\u6493\u64A5\u64A9\u6488\u64BC\"],\n[\"daa1\",\"\u64DA\u64D2\u64C5\u64C7\u64BB\u64D8\u64C2\u64F1\u64E7\u8209\u64E0\u64E1\u62AC\u64E3\u64EF\u652C\u64F6\u64F4\u64F2\u64FA\u6500\u64FD\u6518\u651C\u6505\u6524\u6523\u652B\u6534\u6535\u6537\u6536\u6538\u754B\u6548\u6556\u6555\u654D\u6558\u655E\u655D\u6572\u6578\u6582\u6583\u8B8A\u659B\u659F\u65AB\u65B7\u65C3\u65C6\u65C1\u65C4\u65CC\u65D2\u65DB\u65D9\u65E0\u65E1\u65F1\u6772\u660A\u6603\u65FB\u6773\u6635\u6636\u6634\u661C\u664F\u6644\u6649\u6641\u665E\u665D\u6664\u6667\u6668\u665F\u6662\u6670\u6683\u6688\u668E\u6689\u6684\u6698\u669D\u66C1\u66B9\u66C9\u66BE\u66BC\"],\n[\"dba1\",\"\u66C4\u66B8\u66D6\u66DA\u66E0\u663F\u66E6\u66E9\u66F0\u66F5\u66F7\u670F\u6716\u671E\u6726\u6727\u9738\u672E\u673F\u6736\u6741\u6738\u6737\u6746\u675E\u6760\u6759\u6763\u6764\u6789\u6770\u67A9\u677C\u676A\u678C\u678B\u67A6\u67A1\u6785\u67B7\u67EF\u67B4\u67EC\u67B3\u67E9\u67B8\u67E4\u67DE\u67DD\u67E2\u67EE\u67B9\u67CE\u67C6\u67E7\u6A9C\u681E\u6846\u6829\u6840\u684D\u6832\u684E\u68B3\u682B\u6859\u6863\u6877\u687F\u689F\u688F\u68AD\u6894\u689D\u689B\u6883\u6AAE\u68B9\u6874\u68B5\u68A0\u68BA\u690F\u688D\u687E\u6901\u68CA\u6908\u68D8\u6922\u6926\u68E1\u690C\u68CD\"],\n[\"dca1\",\"\u68D4\u68E7\u68D5\u6936\u6912\u6904\u68D7\u68E3\u6925\u68F9\u68E0\u68EF\u6928\u692A\u691A\u6923\u6921\u68C6\u6979\u6977\u695C\u6978\u696B\u6954\u697E\u696E\u6939\u6974\u693D\u6959\u6930\u6961\u695E\u695D\u6981\u696A\u69B2\u69AE\u69D0\u69BF\u69C1\u69D3\u69BE\u69CE\u5BE8\u69CA\u69DD\u69BB\u69C3\u69A7\u6A2E\u6991\u69A0\u699C\u6995\u69B4\u69DE\u69E8\u6A02\u6A1B\u69FF\u6B0A\u69F9\u69F2\u69E7\u6A05\u69B1\u6A1E\u69ED\u6A14\u69EB\u6A0A\u6A12\u6AC1\u6A23\u6A13\u6A44\u6A0C\u6A72\u6A36\u6A78\u6A47\u6A62\u6A59\u6A66\u6A48\u6A38\u6A22\u6A90\u6A8D\u6AA0\u6A84\u6AA2\u6AA3\"],\n[\"dda1\",\"\u6A97\u8617\u6ABB\u6AC3\u6AC2\u6AB8\u6AB3\u6AAC\u6ADE\u6AD1\u6ADF\u6AAA\u6ADA\u6AEA\u6AFB\u6B05\u8616\u6AFA\u6B12\u6B16\u9B31\u6B1F\u6B38\u6B37\u76DC\u6B39\u98EE\u6B47\u6B43\u6B49\u6B50\u6B59\u6B54\u6B5B\u6B5F\u6B61\u6B78\u6B79\u6B7F\u6B80\u6B84\u6B83\u6B8D\u6B98\u6B95\u6B9E\u6BA4\u6BAA\u6BAB\u6BAF\u6BB2\u6BB1\u6BB3\u6BB7\u6BBC\u6BC6\u6BCB\u6BD3\u6BDF\u6BEC\u6BEB\u6BF3\u6BEF\u9EBE\u6C08\u6C13\u6C14\u6C1B\u6C24\u6C23\u6C5E\u6C55\u6C62\u6C6A\u6C82\u6C8D\u6C9A\u6C81\u6C9B\u6C7E\u6C68\u6C73\u6C92\u6C90\u6CC4\u6CF1\u6CD3\u6CBD\u6CD7\u6CC5\u6CDD\u6CAE\u6CB1\u6CBE\"],\n[\"dea1\",\"\u6CBA\u6CDB\u6CEF\u6CD9\u6CEA\u6D1F\u884D\u6D36\u6D2B\u6D3D\u6D38\u6D19\u6D35\u6D33\u6D12\u6D0C\u6D63\u6D93\u6D64\u6D5A\u6D79\u6D59\u6D8E\u6D95\u6FE4\u6D85\u6DF9\u6E15\u6E0A\u6DB5\u6DC7\u6DE6\u6DB8\u6DC6\u6DEC\u6DDE\u6DCC\u6DE8\u6DD2\u6DC5\u6DFA\u6DD9\u6DE4\u6DD5\u6DEA\u6DEE\u6E2D\u6E6E\u6E2E\u6E19\u6E72\u6E5F\u6E3E\u6E23\u6E6B\u6E2B\u6E76\u6E4D\u6E1F\u6E43\u6E3A\u6E4E\u6E24\u6EFF\u6E1D\u6E38\u6E82\u6EAA\u6E98\u6EC9\u6EB7\u6ED3\u6EBD\u6EAF\u6EC4\u6EB2\u6ED4\u6ED5\u6E8F\u6EA5\u6EC2\u6E9F\u6F41\u6F11\u704C\u6EEC\u6EF8\u6EFE\u6F3F\u6EF2\u6F31\u6EEF\u6F32\u6ECC\"],\n[\"dfa1\",\"\u6F3E\u6F13\u6EF7\u6F86\u6F7A\u6F78\u6F81\u6F80\u6F6F\u6F5B\u6FF3\u6F6D\u6F82\u6F7C\u6F58\u6F8E\u6F91\u6FC2\u6F66\u6FB3\u6FA3\u6FA1\u6FA4\u6FB9\u6FC6\u6FAA\u6FDF\u6FD5\u6FEC\u6FD4\u6FD8\u6FF1\u6FEE\u6FDB\u7009\u700B\u6FFA\u7011\u7001\u700F\u6FFE\u701B\u701A\u6F74\u701D\u7018\u701F\u7030\u703E\u7032\u7051\u7063\u7099\u7092\u70AF\u70F1\u70AC\u70B8\u70B3\u70AE\u70DF\u70CB\u70DD\u70D9\u7109\u70FD\u711C\u7119\u7165\u7155\u7188\u7166\u7162\u714C\u7156\u716C\u718F\u71FB\u7184\u7195\u71A8\u71AC\u71D7\u71B9\u71BE\u71D2\u71C9\u71D4\u71CE\u71E0\u71EC\u71E7\u71F5\u71FC\"],\n[\"e0a1\",\"\u71F9\u71FF\u720D\u7210\u721B\u7228\u722D\u722C\u7230\u7232\u723B\u723C\u723F\u7240\u7246\u724B\u7258\u7274\u727E\u7282\u7281\u7287\u7292\u7296\u72A2\u72A7\u72B9\u72B2\u72C3\u72C6\u72C4\u72CE\u72D2\u72E2\u72E0\u72E1\u72F9\u72F7\u500F\u7317\u730A\u731C\u7316\u731D\u7334\u732F\u7329\u7325\u733E\u734E\u734F\u9ED8\u7357\u736A\u7368\u7370\u7378\u7375\u737B\u737A\u73C8\u73B3\u73CE\u73BB\u73C0\u73E5\u73EE\u73DE\u74A2\u7405\u746F\u7425\u73F8\u7432\u743A\u7455\u743F\u745F\u7459\u7441\u745C\u7469\u7470\u7463\u746A\u7476\u747E\u748B\u749E\u74A7\u74CA\u74CF\u74D4\u73F1\"],\n[\"e1a1\",\"\u74E0\u74E3\u74E7\u74E9\u74EE\u74F2\u74F0\u74F1\u74F8\u74F7\u7504\u7503\u7505\u750C\u750E\u750D\u7515\u7513\u751E\u7526\u752C\u753C\u7544\u754D\u754A\u7549\u755B\u7546\u755A\u7569\u7564\u7567\u756B\u756D\u7578\u7576\u7586\u7587\u7574\u758A\u7589\u7582\u7594\u759A\u759D\u75A5\u75A3\u75C2\u75B3\u75C3\u75B5\u75BD\u75B8\u75BC\u75B1\u75CD\u75CA\u75D2\u75D9\u75E3\u75DE\u75FE\u75FF\u75FC\u7601\u75F0\u75FA\u75F2\u75F3\u760B\u760D\u7609\u761F\u7627\u7620\u7621\u7622\u7624\u7634\u7630\u763B\u7647\u7648\u7646\u765C\u7658\u7661\u7662\u7668\u7669\u766A\u7667\u766C\u7670\"],\n[\"e2a1\",\"\u7672\u7676\u7678\u767C\u7680\u7683\u7688\u768B\u768E\u7696\u7693\u7699\u769A\u76B0\u76B4\u76B8\u76B9\u76BA\u76C2\u76CD\u76D6\u76D2\u76DE\u76E1\u76E5\u76E7\u76EA\u862F\u76FB\u7708\u7707\u7704\u7729\u7724\u771E\u7725\u7726\u771B\u7737\u7738\u7747\u775A\u7768\u776B\u775B\u7765\u777F\u777E\u7779\u778E\u778B\u7791\u77A0\u779E\u77B0\u77B6\u77B9\u77BF\u77BC\u77BD\u77BB\u77C7\u77CD\u77D7\u77DA\u77DC\u77E3\u77EE\u77FC\u780C\u7812\u7926\u7820\u792A\u7845\u788E\u7874\u7886\u787C\u789A\u788C\u78A3\u78B5\u78AA\u78AF\u78D1\u78C6\u78CB\u78D4\u78BE\u78BC\u78C5\u78CA\u78EC\"],\n[\"e3a1\",\"\u78E7\u78DA\u78FD\u78F4\u7907\u7912\u7911\u7919\u792C\u792B\u7940\u7960\u7957\u795F\u795A\u7955\u7953\u797A\u797F\u798A\u799D\u79A7\u9F4B\u79AA\u79AE\u79B3\u79B9\u79BA\u79C9\u79D5\u79E7\u79EC\u79E1\u79E3\u7A08\u7A0D\u7A18\u7A19\u7A20\u7A1F\u7980\u7A31\u7A3B\u7A3E\u7A37\u7A43\u7A57\u7A49\u7A61\u7A62\u7A69\u9F9D\u7A70\u7A79\u7A7D\u7A88\u7A97\u7A95\u7A98\u7A96\u7AA9\u7AC8\u7AB0\u7AB6\u7AC5\u7AC4\u7ABF\u9083\u7AC7\u7ACA\u7ACD\u7ACF\u7AD5\u7AD3\u7AD9\u7ADA\u7ADD\u7AE1\u7AE2\u7AE6\u7AED\u7AF0\u7B02\u7B0F\u7B0A\u7B06\u7B33\u7B18\u7B19\u7B1E\u7B35\u7B28\u7B36\u7B50\"],\n[\"e4a1\",\"\u7B7A\u7B04\u7B4D\u7B0B\u7B4C\u7B45\u7B75\u7B65\u7B74\u7B67\u7B70\u7B71\u7B6C\u7B6E\u7B9D\u7B98\u7B9F\u7B8D\u7B9C\u7B9A\u7B8B\u7B92\u7B8F\u7B5D\u7B99\u7BCB\u7BC1\u7BCC\u7BCF\u7BB4\u7BC6\u7BDD\u7BE9\u7C11\u7C14\u7BE6\u7BE5\u7C60\u7C00\u7C07\u7C13\u7BF3\u7BF7\u7C17\u7C0D\u7BF6\u7C23\u7C27\u7C2A\u7C1F\u7C37\u7C2B\u7C3D\u7C4C\u7C43\u7C54\u7C4F\u7C40\u7C50\u7C58\u7C5F\u7C64\u7C56\u7C65\u7C6C\u7C75\u7C83\u7C90\u7CA4\u7CAD\u7CA2\u7CAB\u7CA1\u7CA8\u7CB3\u7CB2\u7CB1\u7CAE\u7CB9\u7CBD\u7CC0\u7CC5\u7CC2\u7CD8\u7CD2\u7CDC\u7CE2\u9B3B\u7CEF\u7CF2\u7CF4\u7CF6\u7CFA\u7D06\"],\n[\"e5a1\",\"\u7D02\u7D1C\u7D15\u7D0A\u7D45\u7D4B\u7D2E\u7D32\u7D3F\u7D35\u7D46\u7D73\u7D56\u7D4E\u7D72\u7D68\u7D6E\u7D4F\u7D63\u7D93\u7D89\u7D5B\u7D8F\u7D7D\u7D9B\u7DBA\u7DAE\u7DA3\u7DB5\u7DC7\u7DBD\u7DAB\u7E3D\u7DA2\u7DAF\u7DDC\u7DB8\u7D9F\u7DB0\u7DD8\u7DDD\u7DE4\u7DDE\u7DFB\u7DF2\u7DE1\u7E05\u7E0A\u7E23\u7E21\u7E12\u7E31\u7E1F\u7E09\u7E0B\u7E22\u7E46\u7E66\u7E3B\u7E35\u7E39\u7E43\u7E37\u7E32\u7E3A\u7E67\u7E5D\u7E56\u7E5E\u7E59\u7E5A\u7E79\u7E6A\u7E69\u7E7C\u7E7B\u7E83\u7DD5\u7E7D\u8FAE\u7E7F\u7E88\u7E89\u7E8C\u7E92\u7E90\u7E93\u7E94\u7E96\u7E8E\u7E9B\u7E9C\u7F38\u7F3A\"],\n[\"e6a1\",\"\u7F45\u7F4C\u7F4D\u7F4E\u7F50\u7F51\u7F55\u7F54\u7F58\u7F5F\u7F60\u7F68\u7F69\u7F67\u7F78\u7F82\u7F86\u7F83\u7F88\u7F87\u7F8C\u7F94\u7F9E\u7F9D\u7F9A\u7FA3\u7FAF\u7FB2\u7FB9\u7FAE\u7FB6\u7FB8\u8B71\u7FC5\u7FC6\u7FCA\u7FD5\u7FD4\u7FE1\u7FE6\u7FE9\u7FF3\u7FF9\u98DC\u8006\u8004\u800B\u8012\u8018\u8019\u801C\u8021\u8028\u803F\u803B\u804A\u8046\u8052\u8058\u805A\u805F\u8062\u8068\u8073\u8072\u8070\u8076\u8079\u807D\u807F\u8084\u8086\u8085\u809B\u8093\u809A\u80AD\u5190\u80AC\u80DB\u80E5\u80D9\u80DD\u80C4\u80DA\u80D6\u8109\u80EF\u80F1\u811B\u8129\u8123\u812F\u814B\"],\n[\"e7a1\",\"\u968B\u8146\u813E\u8153\u8151\u80FC\u8171\u816E\u8165\u8166\u8174\u8183\u8188\u818A\u8180\u8182\u81A0\u8195\u81A4\u81A3\u815F\u8193\u81A9\u81B0\u81B5\u81BE\u81B8\u81BD\u81C0\u81C2\u81BA\u81C9\u81CD\u81D1\u81D9\u81D8\u81C8\u81DA\u81DF\u81E0\u81E7\u81FA\u81FB\u81FE\u8201\u8202\u8205\u8207\u820A\u820D\u8210\u8216\u8229\u822B\u8238\u8233\u8240\u8259\u8258\u825D\u825A\u825F\u8264\u8262\u8268\u826A\u826B\u822E\u8271\u8277\u8278\u827E\u828D\u8292\u82AB\u829F\u82BB\u82AC\u82E1\u82E3\u82DF\u82D2\u82F4\u82F3\u82FA\u8393\u8303\u82FB\u82F9\u82DE\u8306\u82DC\u8309\u82D9\"],\n[\"e8a1\",\"\u8335\u8334\u8316\u8332\u8331\u8340\u8339\u8350\u8345\u832F\u832B\u8317\u8318\u8385\u839A\u83AA\u839F\u83A2\u8396\u8323\u838E\u8387\u838A\u837C\u83B5\u8373\u8375\u83A0\u8389\u83A8\u83F4\u8413\u83EB\u83CE\u83FD\u8403\u83D8\u840B\u83C1\u83F7\u8407\u83E0\u83F2\u840D\u8422\u8420\u83BD\u8438\u8506\u83FB\u846D\u842A\u843C\u855A\u8484\u8477\u846B\u84AD\u846E\u8482\u8469\u8446\u842C\u846F\u8479\u8435\u84CA\u8462\u84B9\u84BF\u849F\u84D9\u84CD\u84BB\u84DA\u84D0\u84C1\u84C6\u84D6\u84A1\u8521\u84FF\u84F4\u8517\u8518\u852C\u851F\u8515\u8514\u84FC\u8540\u8563\u8558\u8548\"],\n[\"e9a1\",\"\u8541\u8602\u854B\u8555\u8580\u85A4\u8588\u8591\u858A\u85A8\u856D\u8594\u859B\u85EA\u8587\u859C\u8577\u857E\u8590\u85C9\u85BA\u85CF\u85B9\u85D0\u85D5\u85DD\u85E5\u85DC\u85F9\u860A\u8613\u860B\u85FE\u85FA\u8606\u8622\u861A\u8630\u863F\u864D\u4E55\u8654\u865F\u8667\u8671\u8693\u86A3\u86A9\u86AA\u868B\u868C\u86B6\u86AF\u86C4\u86C6\u86B0\u86C9\u8823\u86AB\u86D4\u86DE\u86E9\u86EC\u86DF\u86DB\u86EF\u8712\u8706\u8708\u8700\u8703\u86FB\u8711\u8709\u870D\u86F9\u870A\u8734\u873F\u8737\u873B\u8725\u8729\u871A\u8760\u875F\u8778\u874C\u874E\u8774\u8757\u8768\u876E\u8759\"],\n[\"eaa1\",\"\u8753\u8763\u876A\u8805\u87A2\u879F\u8782\u87AF\u87CB\u87BD\u87C0\u87D0\u96D6\u87AB\u87C4\u87B3\u87C7\u87C6\u87BB\u87EF\u87F2\u87E0\u880F\u880D\u87FE\u87F6\u87F7\u880E\u87D2\u8811\u8816\u8815\u8822\u8821\u8831\u8836\u8839\u8827\u883B\u8844\u8842\u8852\u8859\u885E\u8862\u886B\u8881\u887E\u889E\u8875\u887D\u88B5\u8872\u8882\u8897\u8892\u88AE\u8899\u88A2\u888D\u88A4\u88B0\u88BF\u88B1\u88C3\u88C4\u88D4\u88D8\u88D9\u88DD\u88F9\u8902\u88FC\u88F4\u88E8\u88F2\u8904\u890C\u890A\u8913\u8943\u891E\u8925\u892A\u892B\u8941\u8944\u893B\u8936\u8938\u894C\u891D\u8960\u895E\"],\n[\"eba1\",\"\u8966\u8964\u896D\u896A\u896F\u8974\u8977\u897E\u8983\u8988\u898A\u8993\u8998\u89A1\u89A9\u89A6\u89AC\u89AF\u89B2\u89BA\u89BD\u89BF\u89C0\u89DA\u89DC\u89DD\u89E7\u89F4\u89F8\u8A03\u8A16\u8A10\u8A0C\u8A1B\u8A1D\u8A25\u8A36\u8A41\u8A5B\u8A52\u8A46\u8A48\u8A7C\u8A6D\u8A6C\u8A62\u8A85\u8A82\u8A84\u8AA8\u8AA1\u8A91\u8AA5\u8AA6\u8A9A\u8AA3\u8AC4\u8ACD\u8AC2\u8ADA\u8AEB\u8AF3\u8AE7\u8AE4\u8AF1\u8B14\u8AE0\u8AE2\u8AF7\u8ADE\u8ADB\u8B0C\u8B07\u8B1A\u8AE1\u8B16\u8B10\u8B17\u8B20\u8B33\u97AB\u8B26\u8B2B\u8B3E\u8B28\u8B41\u8B4C\u8B4F\u8B4E\u8B49\u8B56\u8B5B\u8B5A\u8B6B\"],\n[\"eca1\",\"\u8B5F\u8B6C\u8B6F\u8B74\u8B7D\u8B80\u8B8C\u8B8E\u8B92\u8B93\u8B96\u8B99\u8B9A\u8C3A\u8C41\u8C3F\u8C48\u8C4C\u8C4E\u8C50\u8C55\u8C62\u8C6C\u8C78\u8C7A\u8C82\u8C89\u8C85\u8C8A\u8C8D\u8C8E\u8C94\u8C7C\u8C98\u621D\u8CAD\u8CAA\u8CBD\u8CB2\u8CB3\u8CAE\u8CB6\u8CC8\u8CC1\u8CE4\u8CE3\u8CDA\u8CFD\u8CFA\u8CFB\u8D04\u8D05\u8D0A\u8D07\u8D0F\u8D0D\u8D10\u9F4E\u8D13\u8CCD\u8D14\u8D16\u8D67\u8D6D\u8D71\u8D73\u8D81\u8D99\u8DC2\u8DBE\u8DBA\u8DCF\u8DDA\u8DD6\u8DCC\u8DDB\u8DCB\u8DEA\u8DEB\u8DDF\u8DE3\u8DFC\u8E08\u8E09\u8DFF\u8E1D\u8E1E\u8E10\u8E1F\u8E42\u8E35\u8E30\u8E34\u8E4A\"],\n[\"eda1\",\"\u8E47\u8E49\u8E4C\u8E50\u8E48\u8E59\u8E64\u8E60\u8E2A\u8E63\u8E55\u8E76\u8E72\u8E7C\u8E81\u8E87\u8E85\u8E84\u8E8B\u8E8A\u8E93\u8E91\u8E94\u8E99\u8EAA\u8EA1\u8EAC\u8EB0\u8EC6\u8EB1\u8EBE\u8EC5\u8EC8\u8ECB\u8EDB\u8EE3\u8EFC\u8EFB\u8EEB\u8EFE\u8F0A\u8F05\u8F15\u8F12\u8F19\u8F13\u8F1C\u8F1F\u8F1B\u8F0C\u8F26\u8F33\u8F3B\u8F39\u8F45\u8F42\u8F3E\u8F4C\u8F49\u8F46\u8F4E\u8F57\u8F5C\u8F62\u8F63\u8F64\u8F9C\u8F9F\u8FA3\u8FAD\u8FAF\u8FB7\u8FDA\u8FE5\u8FE2\u8FEA\u8FEF\u9087\u8FF4\u9005\u8FF9\u8FFA\u9011\u9015\u9021\u900D\u901E\u9016\u900B\u9027\u9036\u9035\u9039\u8FF8\"],\n[\"eea1\",\"\u904F\u9050\u9051\u9052\u900E\u9049\u903E\u9056\u9058\u905E\u9068\u906F\u9076\u96A8\u9072\u9082\u907D\u9081\u9080\u908A\u9089\u908F\u90A8\u90AF\u90B1\u90B5\u90E2\u90E4\u6248\u90DB\u9102\u9112\u9119\u9132\u9130\u914A\u9156\u9158\u9163\u9165\u9169\u9173\u9172\u918B\u9189\u9182\u91A2\u91AB\u91AF\u91AA\u91B5\u91B4\u91BA\u91C0\u91C1\u91C9\u91CB\u91D0\u91D6\u91DF\u91E1\u91DB\u91FC\u91F5\u91F6\u921E\u91FF\u9214\u922C\u9215\u9211\u925E\u9257\u9245\u9249\u9264\u9248\u9295\u923F\u924B\u9250\u929C\u9296\u9293\u929B\u925A\u92CF\u92B9\u92B7\u92E9\u930F\u92FA\u9344\u932E\"],\n[\"efa1\",\"\u9319\u9322\u931A\u9323\u933A\u9335\u933B\u935C\u9360\u937C\u936E\u9356\u93B0\u93AC\u93AD\u9394\u93B9\u93D6\u93D7\u93E8\u93E5\u93D8\u93C3\u93DD\u93D0\u93C8\u93E4\u941A\u9414\u9413\u9403\u9407\u9410\u9436\u942B\u9435\u9421\u943A\u9441\u9452\u9444\u945B\u9460\u9462\u945E\u946A\u9229\u9470\u9475\u9477\u947D\u945A\u947C\u947E\u9481\u947F\u9582\u9587\u958A\u9594\u9596\u9598\u9599\u95A0\u95A8\u95A7\u95AD\u95BC\u95BB\u95B9\u95BE\u95CA\u6FF6\u95C3\u95CD\u95CC\u95D5\u95D4\u95D6\u95DC\u95E1\u95E5\u95E2\u9621\u9628\u962E\u962F\u9642\u964C\u964F\u964B\u9677\u965C\u965E\"],\n[\"f0a1\",\"\u965D\u965F\u9666\u9672\u966C\u968D\u9698\u9695\u9697\u96AA\u96A7\u96B1\u96B2\u96B0\u96B4\u96B6\u96B8\u96B9\u96CE\u96CB\u96C9\u96CD\u894D\u96DC\u970D\u96D5\u96F9\u9704\u9706\u9708\u9713\u970E\u9711\u970F\u9716\u9719\u9724\u972A\u9730\u9739\u973D\u973E\u9744\u9746\u9748\u9742\u9749\u975C\u9760\u9764\u9766\u9768\u52D2\u976B\u9771\u9779\u9785\u977C\u9781\u977A\u9786\u978B\u978F\u9790\u979C\u97A8\u97A6\u97A3\u97B3\u97B4\u97C3\u97C6\u97C8\u97CB\u97DC\u97ED\u9F4F\u97F2\u7ADF\u97F6\u97F5\u980F\u980C\u9838\u9824\u9821\u9837\u983D\u9846\u984F\u984B\u986B\u986F\u9870\"],\n[\"f1a1\",\"\u9871\u9874\u9873\u98AA\u98AF\u98B1\u98B6\u98C4\u98C3\u98C6\u98E9\u98EB\u9903\u9909\u9912\u9914\u9918\u9921\u991D\u991E\u9924\u9920\u992C\u992E\u993D\u993E\u9942\u9949\u9945\u9950\u994B\u9951\u9952\u994C\u9955\u9997\u9998\u99A5\u99AD\u99AE\u99BC\u99DF\u99DB\u99DD\u99D8\u99D1\u99ED\u99EE\u99F1\u99F2\u99FB\u99F8\u9A01\u9A0F\u9A05\u99E2\u9A19\u9A2B\u9A37\u9A45\u9A42\u9A40\u9A43\u9A3E\u9A55\u9A4D\u9A5B\u9A57\u9A5F\u9A62\u9A65\u9A64\u9A69\u9A6B\u9A6A\u9AAD\u9AB0\u9ABC\u9AC0\u9ACF\u9AD1\u9AD3\u9AD4\u9ADE\u9ADF\u9AE2\u9AE3\u9AE6\u9AEF\u9AEB\u9AEE\u9AF4\u9AF1\u9AF7\"],\n[\"f2a1\",\"\u9AFB\u9B06\u9B18\u9B1A\u9B1F\u9B22\u9B23\u9B25\u9B27\u9B28\u9B29\u9B2A\u9B2E\u9B2F\u9B32\u9B44\u9B43\u9B4F\u9B4D\u9B4E\u9B51\u9B58\u9B74\u9B93\u9B83\u9B91\u9B96\u9B97\u9B9F\u9BA0\u9BA8\u9BB4\u9BC0\u9BCA\u9BB9\u9BC6\u9BCF\u9BD1\u9BD2\u9BE3\u9BE2\u9BE4\u9BD4\u9BE1\u9C3A\u9BF2\u9BF1\u9BF0\u9C15\u9C14\u9C09\u9C13\u9C0C\u9C06\u9C08\u9C12\u9C0A\u9C04\u9C2E\u9C1B\u9C25\u9C24\u9C21\u9C30\u9C47\u9C32\u9C46\u9C3E\u9C5A\u9C60\u9C67\u9C76\u9C78\u9CE7\u9CEC\u9CF0\u9D09\u9D08\u9CEB\u9D03\u9D06\u9D2A\u9D26\u9DAF\u9D23\u9D1F\u9D44\u9D15\u9D12\u9D41\u9D3F\u9D3E\u9D46\u9D48\"],\n[\"f3a1\",\"\u9D5D\u9D5E\u9D64\u9D51\u9D50\u9D59\u9D72\u9D89\u9D87\u9DAB\u9D6F\u9D7A\u9D9A\u9DA4\u9DA9\u9DB2\u9DC4\u9DC1\u9DBB\u9DB8\u9DBA\u9DC6\u9DCF\u9DC2\u9DD9\u9DD3\u9DF8\u9DE6\u9DED\u9DEF\u9DFD\u9E1A\u9E1B\u9E1E\u9E75\u9E79\u9E7D\u9E81\u9E88\u9E8B\u9E8C\u9E92\u9E95\u9E91\u9E9D\u9EA5\u9EA9\u9EB8\u9EAA\u9EAD\u9761\u9ECC\u9ECE\u9ECF\u9ED0\u9ED4\u9EDC\u9EDE\u9EDD\u9EE0\u9EE5\u9EE8\u9EEF\u9EF4\u9EF6\u9EF7\u9EF9\u9EFB\u9EFC\u9EFD\u9F07\u9F08\u76B7\u9F15\u9F21\u9F2C\u9F3E\u9F4A\u9F52\u9F54\u9F63\u9F5F\u9F60\u9F61\u9F66\u9F67\u9F6C\u9F6A\u9F77\u9F72\u9F76\u9F95\u9F9C\u9FA0\"],\n[\"f4a1\",\"\u582F\u69C7\u9059\u7464\u51DC\u7199\"],\n[\"f9a1\",\"\u7E8A\u891C\u9348\u9288\u84DC\u4FC9\u70BB\u6631\u68C8\u92F9\u66FB\u5F45\u4E28\u4EE1\u4EFC\u4F00\u4F03\u4F39\u4F56\u4F92\u4F8A\u4F9A\u4F94\u4FCD\u5040\u5022\u4FFF\u501E\u5046\u5070\u5042\u5094\u50F4\u50D8\u514A\u5164\u519D\u51BE\u51EC\u5215\u529C\u52A6\u52C0\u52DB\u5300\u5307\u5324\u5372\u5393\u53B2\u53DD\uFA0E\u549C\u548A\u54A9\u54FF\u5586\u5759\u5765\u57AC\u57C8\u57C7\uFA0F\uFA10\u589E\u58B2\u590B\u5953\u595B\u595D\u5963\u59A4\u59BA\u5B56\u5BC0\u752F\u5BD8\u5BEC\u5C1E\u5CA6\u5CBA\u5CF5\u5D27\u5D53\uFA11\u5D42\u5D6D\u5DB8\u5DB9\u5DD0\u5F21\u5F34\u5F67\u5FB7\"],\n[\"faa1\",\"\u5FDE\u605D\u6085\u608A\u60DE\u60D5\u6120\u60F2\u6111\u6137\u6130\u6198\u6213\u62A6\u63F5\u6460\u649D\u64CE\u654E\u6600\u6615\u663B\u6609\u662E\u661E\u6624\u6665\u6657\u6659\uFA12\u6673\u6699\u66A0\u66B2\u66BF\u66FA\u670E\uF929\u6766\u67BB\u6852\u67C0\u6801\u6844\u68CF\uFA13\u6968\uFA14\u6998\u69E2\u6A30\u6A6B\u6A46\u6A73\u6A7E\u6AE2\u6AE4\u6BD6\u6C3F\u6C5C\u6C86\u6C6F\u6CDA\u6D04\u6D87\u6D6F\u6D96\u6DAC\u6DCF\u6DF8\u6DF2\u6DFC\u6E39\u6E5C\u6E27\u6E3C\u6EBF\u6F88\u6FB5\u6FF5\u7005\u7007\u7028\u7085\u70AB\u710F\u7104\u715C\u7146\u7147\uFA15\u71C1\u71FE\u72B1\"],\n[\"fba1\",\"\u72BE\u7324\uFA16\u7377\u73BD\u73C9\u73D6\u73E3\u73D2\u7407\u73F5\u7426\u742A\u7429\u742E\u7462\u7489\u749F\u7501\u756F\u7682\u769C\u769E\u769B\u76A6\uFA17\u7746\u52AF\u7821\u784E\u7864\u787A\u7930\uFA18\uFA19\uFA1A\u7994\uFA1B\u799B\u7AD1\u7AE7\uFA1C\u7AEB\u7B9E\uFA1D\u7D48\u7D5C\u7DB7\u7DA0\u7DD6\u7E52\u7F47\u7FA1\uFA1E\u8301\u8362\u837F\u83C7\u83F6\u8448\u84B4\u8553\u8559\u856B\uFA1F\u85B0\uFA20\uFA21\u8807\u88F5\u8A12\u8A37\u8A79\u8AA7\u8ABE\u8ADF\uFA22\u8AF6\u8B53\u8B7F\u8CF0\u8CF4\u8D12\u8D76\uFA23\u8ECF\uFA24\uFA25\u9067\u90DE\uFA26\u9115\u9127\u91DA\"],\n[\"fca1\",\"\u91D7\u91DE\u91ED\u91EE\u91E4\u91E5\u9206\u9210\u920A\u923A\u9240\u923C\u924E\u9259\u9251\u9239\u9267\u92A7\u9277\u9278\u92E7\u92D7\u92D9\u92D0\uFA27\u92D5\u92E0\u92D3\u9325\u9321\u92FB\uFA28\u931E\u92FF\u931D\u9302\u9370\u9357\u93A4\u93C6\u93DE\u93F8\u9431\u9445\u9448\u9592\uF9DC\uFA29\u969D\u96AF\u9733\u973B\u9743\u974D\u974F\u9751\u9755\u9857\u9865\uFA2A\uFA2B\u9927\uFA2C\u999E\u9A4E\u9AD9\u9ADC\u9B75\u9B72\u9B8F\u9BB1\u9BBB\u9C00\u9D70\u9D6B\uFA2D\u9E19\u9ED1\"],\n[\"fcf1\",\"\u2170\",9,\"\uFFE2\uFFE4\uFF07\uFF02\"],\n[\"8fa2af\",\"\u02D8\u02C7\u00B8\u02D9\u02DD\u00AF\u02DB\u02DA\uFF5E\u0384\u0385\"],\n[\"8fa2c2\",\"\u00A1\u00A6\u00BF\"],\n[\"8fa2eb\",\"\u00BA\u00AA\u00A9\u00AE\u2122\u00A4\u2116\"],\n[\"8fa6e1\",\"\u0386\u0388\u0389\u038A\u03AA\"],\n[\"8fa6e7\",\"\u038C\"],\n[\"8fa6e9\",\"\u038E\u03AB\"],\n[\"8fa6ec\",\"\u038F\"],\n[\"8fa6f1\",\"\u03AC\u03AD\u03AE\u03AF\u03CA\u0390\u03CC\u03C2\u03CD\u03CB\u03B0\u03CE\"],\n[\"8fa7c2\",\"\u0402\",10,\"\u040E\u040F\"],\n[\"8fa7f2\",\"\u0452\",10,\"\u045E\u045F\"],\n[\"8fa9a1\",\"\u00C6\u0110\"],\n[\"8fa9a4\",\"\u0126\"],\n[\"8fa9a6\",\"\u0132\"],\n[\"8fa9a8\",\"\u0141\u013F\"],\n[\"8fa9ab\",\"\u014A\u00D8\u0152\"],\n[\"8fa9af\",\"\u0166\u00DE\"],\n[\"8fa9c1\",\"\u00E6\u0111\u00F0\u0127\u0131\u0133\u0138\u0142\u0140\u0149\u014B\u00F8\u0153\u00DF\u0167\u00FE\"],\n[\"8faaa1\",\"\u00C1\u00C0\u00C4\u00C2\u0102\u01CD\u0100\u0104\u00C5\u00C3\u0106\u0108\u010C\u00C7\u010A\u010E\u00C9\u00C8\u00CB\u00CA\u011A\u0116\u0112\u0118\"],\n[\"8faaba\",\"\u011C\u011E\u0122\u0120\u0124\u00CD\u00CC\u00CF\u00CE\u01CF\u0130\u012A\u012E\u0128\u0134\u0136\u0139\u013D\u013B\u0143\u0147\u0145\u00D1\u00D3\u00D2\u00D6\u00D4\u01D1\u0150\u014C\u00D5\u0154\u0158\u0156\u015A\u015C\u0160\u015E\u0164\u0162\u00DA\u00D9\u00DC\u00DB\u016C\u01D3\u0170\u016A\u0172\u016E\u0168\u01D7\u01DB\u01D9\u01D5\u0174\u00DD\u0178\u0176\u0179\u017D\u017B\"],\n[\"8faba1\",\"\u00E1\u00E0\u00E4\u00E2\u0103\u01CE\u0101\u0105\u00E5\u00E3\u0107\u0109\u010D\u00E7\u010B\u010F\u00E9\u00E8\u00EB\u00EA\u011B\u0117\u0113\u0119\u01F5\u011D\u011F\"],\n[\"8fabbd\",\"\u0121\u0125\u00ED\u00EC\u00EF\u00EE\u01D0\"],\n[\"8fabc5\",\"\u012B\u012F\u0129\u0135\u0137\u013A\u013E\u013C\u0144\u0148\u0146\u00F1\u00F3\u00F2\u00F6\u00F4\u01D2\u0151\u014D\u00F5\u0155\u0159\u0157\u015B\u015D\u0161\u015F\u0165\u0163\u00FA\u00F9\u00FC\u00FB\u016D\u01D4\u0171\u016B\u0173\u016F\u0169\u01D8\u01DC\u01DA\u01D6\u0175\u00FD\u00FF\u0177\u017A\u017E\u017C\"],\n[\"8fb0a1\",\"\u4E02\u4E04\u4E05\u4E0C\u4E12\u4E1F\u4E23\u4E24\u4E28\u4E2B\u4E2E\u4E2F\u4E30\u4E35\u4E40\u4E41\u4E44\u4E47\u4E51\u4E5A\u4E5C\u4E63\u4E68\u4E69\u4E74\u4E75\u4E79\u4E7F\u4E8D\u4E96\u4E97\u4E9D\u4EAF\u4EB9\u4EC3\u4ED0\u4EDA\u4EDB\u4EE0\u4EE1\u4EE2\u4EE8\u4EEF\u4EF1\u4EF3\u4EF5\u4EFD\u4EFE\u4EFF\u4F00\u4F02\u4F03\u4F08\u4F0B\u4F0C\u4F12\u4F15\u4F16\u4F17\u4F19\u4F2E\u4F31\u4F60\u4F33\u4F35\u4F37\u4F39\u4F3B\u4F3E\u4F40\u4F42\u4F48\u4F49\u4F4B\u4F4C\u4F52\u4F54\u4F56\u4F58\u4F5F\u4F63\u4F6A\u4F6C\u4F6E\u4F71\u4F77\u4F78\u4F79\u4F7A\u4F7D\u4F7E\u4F81\u4F82\u4F84\"],\n[\"8fb1a1\",\"\u4F85\u4F89\u4F8A\u4F8C\u4F8E\u4F90\u4F92\u4F93\u4F94\u4F97\u4F99\u4F9A\u4F9E\u4F9F\u4FB2\u4FB7\u4FB9\u4FBB\u4FBC\u4FBD\u4FBE\u4FC0\u4FC1\u4FC5\u4FC6\u4FC8\u4FC9\u4FCB\u4FCC\u4FCD\u4FCF\u4FD2\u4FDC\u4FE0\u4FE2\u4FF0\u4FF2\u4FFC\u4FFD\u4FFF\u5000\u5001\u5004\u5007\u500A\u500C\u500E\u5010\u5013\u5017\u5018\u501B\u501C\u501D\u501E\u5022\u5027\u502E\u5030\u5032\u5033\u5035\u5040\u5041\u5042\u5045\u5046\u504A\u504C\u504E\u5051\u5052\u5053\u5057\u5059\u505F\u5060\u5062\u5063\u5066\u5067\u506A\u506D\u5070\u5071\u503B\u5081\u5083\u5084\u5086\u508A\u508E\u508F\u5090\"],\n[\"8fb2a1\",\"\u5092\u5093\u5094\u5096\u509B\u509C\u509E\",4,\"\u50AA\u50AF\u50B0\u50B9\u50BA\u50BD\u50C0\u50C3\u50C4\u50C7\u50CC\u50CE\u50D0\u50D3\u50D4\u50D8\u50DC\u50DD\u50DF\u50E2\u50E4\u50E6\u50E8\u50E9\u50EF\u50F1\u50F6\u50FA\u50FE\u5103\u5106\u5107\u5108\u510B\u510C\u510D\u510E\u50F2\u5110\u5117\u5119\u511B\u511C\u511D\u511E\u5123\u5127\u5128\u512C\u512D\u512F\u5131\u5133\u5134\u5135\u5138\u5139\u5142\u514A\u514F\u5153\u5155\u5157\u5158\u515F\u5164\u5166\u517E\u5183\u5184\u518B\u518E\u5198\u519D\u51A1\u51A3\u51AD\u51B8\u51BA\u51BC\u51BE\u51BF\u51C2\"],\n[\"8fb3a1\",\"\u51C8\u51CF\u51D1\u51D2\u51D3\u51D5\u51D8\u51DE\u51E2\u51E5\u51EE\u51F2\u51F3\u51F4\u51F7\u5201\u5202\u5205\u5212\u5213\u5215\u5216\u5218\u5222\u5228\u5231\u5232\u5235\u523C\u5245\u5249\u5255\u5257\u5258\u525A\u525C\u525F\u5260\u5261\u5266\u526E\u5277\u5278\u5279\u5280\u5282\u5285\u528A\u528C\u5293\u5295\u5296\u5297\u5298\u529A\u529C\u52A4\u52A5\u52A6\u52A7\u52AF\u52B0\u52B6\u52B7\u52B8\u52BA\u52BB\u52BD\u52C0\u52C4\u52C6\u52C8\u52CC\u52CF\u52D1\u52D4\u52D6\u52DB\u52DC\u52E1\u52E5\u52E8\u52E9\u52EA\u52EC\u52F0\u52F1\u52F4\u52F6\u52F7\u5300\u5303\u530A\u530B\"],\n[\"8fb4a1\",\"\u530C\u5311\u5313\u5318\u531B\u531C\u531E\u531F\u5325\u5327\u5328\u5329\u532B\u532C\u532D\u5330\u5332\u5335\u533C\u533D\u533E\u5342\u534C\u534B\u5359\u535B\u5361\u5363\u5365\u536C\u536D\u5372\u5379\u537E\u5383\u5387\u5388\u538E\u5393\u5394\u5399\u539D\u53A1\u53A4\u53AA\u53AB\u53AF\u53B2\u53B4\u53B5\u53B7\u53B8\u53BA\u53BD\u53C0\u53C5\u53CF\u53D2\u53D3\u53D5\u53DA\u53DD\u53DE\u53E0\u53E6\u53E7\u53F5\u5402\u5413\u541A\u5421\u5427\u5428\u542A\u542F\u5431\u5434\u5435\u5443\u5444\u5447\u544D\u544F\u545E\u5462\u5464\u5466\u5467\u5469\u546B\u546D\u546E\u5474\u547F\"],\n[\"8fb5a1\",\"\u5481\u5483\u5485\u5488\u5489\u548D\u5491\u5495\u5496\u549C\u549F\u54A1\u54A6\u54A7\u54A9\u54AA\u54AD\u54AE\u54B1\u54B7\u54B9\u54BA\u54BB\u54BF\u54C6\u54CA\u54CD\u54CE\u54E0\u54EA\u54EC\u54EF\u54F6\u54FC\u54FE\u54FF\u5500\u5501\u5505\u5508\u5509\u550C\u550D\u550E\u5515\u552A\u552B\u5532\u5535\u5536\u553B\u553C\u553D\u5541\u5547\u5549\u554A\u554D\u5550\u5551\u5558\u555A\u555B\u555E\u5560\u5561\u5564\u5566\u557F\u5581\u5582\u5586\u5588\u558E\u558F\u5591\u5592\u5593\u5594\u5597\u55A3\u55A4\u55AD\u55B2\u55BF\u55C1\u55C3\u55C6\u55C9\u55CB\u55CC\u55CE\u55D1\u55D2\"],\n[\"8fb6a1\",\"\u55D3\u55D7\u55D8\u55DB\u55DE\u55E2\u55E9\u55F6\u55FF\u5605\u5608\u560A\u560D\",5,\"\u5619\u562C\u5630\u5633\u5635\u5637\u5639\u563B\u563C\u563D\u563F\u5640\u5641\u5643\u5644\u5646\u5649\u564B\u564D\u564F\u5654\u565E\u5660\u5661\u5662\u5663\u5666\u5669\u566D\u566F\u5671\u5672\u5675\u5684\u5685\u5688\u568B\u568C\u5695\u5699\u569A\u569D\u569E\u569F\u56A6\u56A7\u56A8\u56A9\u56AB\u56AC\u56AD\u56B1\u56B3\u56B7\u56BE\u56C5\u56C9\u56CA\u56CB\u56CF\u56D0\u56CC\u56CD\u56D9\u56DC\u56DD\u56DF\u56E1\u56E4\",4,\"\u56F1\u56EB\u56ED\"],\n[\"8fb7a1\",\"\u56F6\u56F7\u5701\u5702\u5707\u570A\u570C\u5711\u5715\u571A\u571B\u571D\u5720\u5722\u5723\u5724\u5725\u5729\u572A\u572C\u572E\u572F\u5733\u5734\u573D\u573E\u573F\u5745\u5746\u574C\u574D\u5752\u5762\u5765\u5767\u5768\u576B\u576D\",4,\"\u5773\u5774\u5775\u5777\u5779\u577A\u577B\u577C\u577E\u5781\u5783\u578C\u5794\u5797\u5799\u579A\u579C\u579D\u579E\u579F\u57A1\u5795\u57A7\u57A8\u57A9\u57AC\u57B8\u57BD\u57C7\u57C8\u57CC\u57CF\u57D5\u57DD\u57DE\u57E4\u57E6\u57E7\u57E9\u57ED\u57F0\u57F5\u57F6\u57F8\u57FD\u57FE\u57FF\u5803\u5804\u5808\u5809\u57E1\"],\n[\"8fb8a1\",\"\u580C\u580D\u581B\u581E\u581F\u5820\u5826\u5827\u582D\u5832\u5839\u583F\u5849\u584C\u584D\u584F\u5850\u5855\u585F\u5861\u5864\u5867\u5868\u5878\u587C\u587F\u5880\u5881\u5887\u5888\u5889\u588A\u588C\u588D\u588F\u5890\u5894\u5896\u589D\u58A0\u58A1\u58A2\u58A6\u58A9\u58B1\u58B2\u58C4\u58BC\u58C2\u58C8\u58CD\u58CE\u58D0\u58D2\u58D4\u58D6\u58DA\u58DD\u58E1\u58E2\u58E9\u58F3\u5905\u5906\u590B\u590C\u5912\u5913\u5914\u8641\u591D\u5921\u5923\u5924\u5928\u592F\u5930\u5933\u5935\u5936\u593F\u5943\u5946\u5952\u5953\u5959\u595B\u595D\u595E\u595F\u5961\u5963\u596B\u596D\"],\n[\"8fb9a1\",\"\u596F\u5972\u5975\u5976\u5979\u597B\u597C\u598B\u598C\u598E\u5992\u5995\u5997\u599F\u59A4\u59A7\u59AD\u59AE\u59AF\u59B0\u59B3\u59B7\u59BA\u59BC\u59C1\u59C3\u59C4\u59C8\u59CA\u59CD\u59D2\u59DD\u59DE\u59DF\u59E3\u59E4\u59E7\u59EE\u59EF\u59F1\u59F2\u59F4\u59F7\u5A00\u5A04\u5A0C\u5A0D\u5A0E\u5A12\u5A13\u5A1E\u5A23\u5A24\u5A27\u5A28\u5A2A\u5A2D\u5A30\u5A44\u5A45\u5A47\u5A48\u5A4C\u5A50\u5A55\u5A5E\u5A63\u5A65\u5A67\u5A6D\u5A77\u5A7A\u5A7B\u5A7E\u5A8B\u5A90\u5A93\u5A96\u5A99\u5A9C\u5A9E\u5A9F\u5AA0\u5AA2\u5AA7\u5AAC\u5AB1\u5AB2\u5AB3\u5AB5\u5AB8\u5ABA\u5ABB\u5ABF\"],\n[\"8fbaa1\",\"\u5AC4\u5AC6\u5AC8\u5ACF\u5ADA\u5ADC\u5AE0\u5AE5\u5AEA\u5AEE\u5AF5\u5AF6\u5AFD\u5B00\u5B01\u5B08\u5B17\u5B34\u5B19\u5B1B\u5B1D\u5B21\u5B25\u5B2D\u5B38\u5B41\u5B4B\u5B4C\u5B52\u5B56\u5B5E\u5B68\u5B6E\u5B6F\u5B7C\u5B7D\u5B7E\u5B7F\u5B81\u5B84\u5B86\u5B8A\u5B8E\u5B90\u5B91\u5B93\u5B94\u5B96\u5BA8\u5BA9\u5BAC\u5BAD\u5BAF\u5BB1\u5BB2\u5BB7\u5BBA\u5BBC\u5BC0\u5BC1\u5BCD\u5BCF\u5BD6\",4,\"\u5BE0\u5BEF\u5BF1\u5BF4\u5BFD\u5C0C\u5C17\u5C1E\u5C1F\u5C23\u5C26\u5C29\u5C2B\u5C2C\u5C2E\u5C30\u5C32\u5C35\u5C36\u5C59\u5C5A\u5C5C\u5C62\u5C63\u5C67\u5C68\u5C69\"],\n[\"8fbba1\",\"\u5C6D\u5C70\u5C74\u5C75\u5C7A\u5C7B\u5C7C\u5C7D\u5C87\u5C88\u5C8A\u5C8F\u5C92\u5C9D\u5C9F\u5CA0\u5CA2\u5CA3\u5CA6\u5CAA\u5CB2\u5CB4\u5CB5\u5CBA\u5CC9\u5CCB\u5CD2\u5CDD\u5CD7\u5CEE\u5CF1\u5CF2\u5CF4\u5D01\u5D06\u5D0D\u5D12\u5D2B\u5D23\u5D24\u5D26\u5D27\u5D31\u5D34\u5D39\u5D3D\u5D3F\u5D42\u5D43\u5D46\u5D48\u5D55\u5D51\u5D59\u5D4A\u5D5F\u5D60\u5D61\u5D62\u5D64\u5D6A\u5D6D\u5D70\u5D79\u5D7A\u5D7E\u5D7F\u5D81\u5D83\u5D88\u5D8A\u5D92\u5D93\u5D94\u5D95\u5D99\u5D9B\u5D9F\u5DA0\u5DA7\u5DAB\u5DB0\u5DB4\u5DB8\u5DB9\u5DC3\u5DC7\u5DCB\u5DD0\u5DCE\u5DD8\u5DD9\u5DE0\u5DE4\"],\n[\"8fbca1\",\"\u5DE9\u5DF8\u5DF9\u5E00\u5E07\u5E0D\u5E12\u5E14\u5E15\u5E18\u5E1F\u5E20\u5E2E\u5E28\u5E32\u5E35\u5E3E\u5E4B\u5E50\u5E49\u5E51\u5E56\u5E58\u5E5B\u5E5C\u5E5E\u5E68\u5E6A\",4,\"\u5E70\u5E80\u5E8B\u5E8E\u5EA2\u5EA4\u5EA5\u5EA8\u5EAA\u5EAC\u5EB1\u5EB3\u5EBD\u5EBE\u5EBF\u5EC6\u5ECC\u5ECB\u5ECE\u5ED1\u5ED2\u5ED4\u5ED5\u5EDC\u5EDE\u5EE5\u5EEB\u5F02\u5F06\u5F07\u5F08\u5F0E\u5F19\u5F1C\u5F1D\u5F21\u5F22\u5F23\u5F24\u5F28\u5F2B\u5F2C\u5F2E\u5F30\u5F34\u5F36\u5F3B\u5F3D\u5F3F\u5F40\u5F44\u5F45\u5F47\u5F4D\u5F50\u5F54\u5F58\u5F5B\u5F60\u5F63\u5F64\u5F67\"],\n[\"8fbda1\",\"\u5F6F\u5F72\u5F74\u5F75\u5F78\u5F7A\u5F7D\u5F7E\u5F89\u5F8D\u5F8F\u5F96\u5F9C\u5F9D\u5FA2\u5FA7\u5FAB\u5FA4\u5FAC\u5FAF\u5FB0\u5FB1\u5FB8\u5FC4\u5FC7\u5FC8\u5FC9\u5FCB\u5FD0\",4,\"\u5FDE\u5FE1\u5FE2\u5FE8\u5FE9\u5FEA\u5FEC\u5FED\u5FEE\u5FEF\u5FF2\u5FF3\u5FF6\u5FFA\u5FFC\u6007\u600A\u600D\u6013\u6014\u6017\u6018\u601A\u601F\u6024\u602D\u6033\u6035\u6040\u6047\u6048\u6049\u604C\u6051\u6054\u6056\u6057\u605D\u6061\u6067\u6071\u607E\u607F\u6082\u6086\u6088\u608A\u608E\u6091\u6093\u6095\u6098\u609D\u609E\u60A2\u60A4\u60A5\u60A8\u60B0\u60B1\u60B7\"],\n[\"8fbea1\",\"\u60BB\u60BE\u60C2\u60C4\u60C8\u60C9\u60CA\u60CB\u60CE\u60CF\u60D4\u60D5\u60D9\u60DB\u60DD\u60DE\u60E2\u60E5\u60F2\u60F5\u60F8\u60FC\u60FD\u6102\u6107\u610A\u610C\u6110\",4,\"\u6116\u6117\u6119\u611C\u611E\u6122\u612A\u612B\u6130\u6131\u6135\u6136\u6137\u6139\u6141\u6145\u6146\u6149\u615E\u6160\u616C\u6172\u6178\u617B\u617C\u617F\u6180\u6181\u6183\u6184\u618B\u618D\u6192\u6193\u6197\u6198\u619C\u619D\u619F\u61A0\u61A5\u61A8\u61AA\u61AD\u61B8\u61B9\u61BC\u61C0\u61C1\u61C2\u61CE\u61CF\u61D5\u61DC\u61DD\u61DE\u61DF\u61E1\u61E2\u61E7\u61E9\u61E5\"],\n[\"8fbfa1\",\"\u61EC\u61ED\u61EF\u6201\u6203\u6204\u6207\u6213\u6215\u621C\u6220\u6222\u6223\u6227\u6229\u622B\u6239\u623D\u6242\u6243\u6244\u6246\u624C\u6250\u6251\u6252\u6254\u6256\u625A\u625C\u6264\u626D\u626F\u6273\u627A\u627D\u628D\u628E\u628F\u6290\u62A6\u62A8\u62B3\u62B6\u62B7\u62BA\u62BE\u62BF\u62C4\u62CE\u62D5\u62D6\u62DA\u62EA\u62F2\u62F4\u62FC\u62FD\u6303\u6304\u630A\u630B\u630D\u6310\u6313\u6316\u6318\u6329\u632A\u632D\u6335\u6336\u6339\u633C\u6341\u6342\u6343\u6344\u6346\u634A\u634B\u634E\u6352\u6353\u6354\u6358\u635B\u6365\u6366\u636C\u636D\u6371\u6374\u6375\"],\n[\"8fc0a1\",\"\u6378\u637C\u637D\u637F\u6382\u6384\u6387\u638A\u6390\u6394\u6395\u6399\u639A\u639E\u63A4\u63A6\u63AD\u63AE\u63AF\u63BD\u63C1\u63C5\u63C8\u63CE\u63D1\u63D3\u63D4\u63D5\u63DC\u63E0\u63E5\u63EA\u63EC\u63F2\u63F3\u63F5\u63F8\u63F9\u6409\u640A\u6410\u6412\u6414\u6418\u641E\u6420\u6422\u6424\u6425\u6429\u642A\u642F\u6430\u6435\u643D\u643F\u644B\u644F\u6451\u6452\u6453\u6454\u645A\u645B\u645C\u645D\u645F\u6460\u6461\u6463\u646D\u6473\u6474\u647B\u647D\u6485\u6487\u648F\u6490\u6491\u6498\u6499\u649B\u649D\u649F\u64A1\u64A3\u64A6\u64A8\u64AC\u64B3\u64BD\u64BE\u64BF\"],\n[\"8fc1a1\",\"\u64C4\u64C9\u64CA\u64CB\u64CC\u64CE\u64D0\u64D1\u64D5\u64D7\u64E4\u64E5\u64E9\u64EA\u64ED\u64F0\u64F5\u64F7\u64FB\u64FF\u6501\u6504\u6508\u6509\u650A\u650F\u6513\u6514\u6516\u6519\u651B\u651E\u651F\u6522\u6526\u6529\u652E\u6531\u653A\u653C\u653D\u6543\u6547\u6549\u6550\u6552\u6554\u655F\u6560\u6567\u656B\u657A\u657D\u6581\u6585\u658A\u6592\u6595\u6598\u659D\u65A0\u65A3\u65A6\u65AE\u65B2\u65B3\u65B4\u65BF\u65C2\u65C8\u65C9\u65CE\u65D0\u65D4\u65D6\u65D8\u65DF\u65F0\u65F2\u65F4\u65F5\u65F9\u65FE\u65FF\u6600\u6604\u6608\u6609\u660D\u6611\u6612\u6615\u6616\u661D\"],\n[\"8fc2a1\",\"\u661E\u6621\u6622\u6623\u6624\u6626\u6629\u662A\u662B\u662C\u662E\u6630\u6631\u6633\u6639\u6637\u6640\u6645\u6646\u664A\u664C\u6651\u664E\u6657\u6658\u6659\u665B\u665C\u6660\u6661\u66FB\u666A\u666B\u666C\u667E\u6673\u6675\u667F\u6677\u6678\u6679\u667B\u6680\u667C\u668B\u668C\u668D\u6690\u6692\u6699\u669A\u669B\u669C\u669F\u66A0\u66A4\u66AD\u66B1\u66B2\u66B5\u66BB\u66BF\u66C0\u66C2\u66C3\u66C8\u66CC\u66CE\u66CF\u66D4\u66DB\u66DF\u66E8\u66EB\u66EC\u66EE\u66FA\u6705\u6707\u670E\u6713\u6719\u671C\u6720\u6722\u6733\u673E\u6745\u6747\u6748\u674C\u6754\u6755\u675D\"],\n[\"8fc3a1\",\"\u6766\u676C\u676E\u6774\u6776\u677B\u6781\u6784\u678E\u678F\u6791\u6793\u6796\u6798\u6799\u679B\u67B0\u67B1\u67B2\u67B5\u67BB\u67BC\u67BD\u67F9\u67C0\u67C2\u67C3\u67C5\u67C8\u67C9\u67D2\u67D7\u67D9\u67DC\u67E1\u67E6\u67F0\u67F2\u67F6\u67F7\u6852\u6814\u6819\u681D\u681F\u6828\u6827\u682C\u682D\u682F\u6830\u6831\u6833\u683B\u683F\u6844\u6845\u684A\u684C\u6855\u6857\u6858\u685B\u686B\u686E\",4,\"\u6875\u6879\u687A\u687B\u687C\u6882\u6884\u6886\u6888\u6896\u6898\u689A\u689C\u68A1\u68A3\u68A5\u68A9\u68AA\u68AE\u68B2\u68BB\u68C5\u68C8\u68CC\u68CF\"],\n[\"8fc4a1\",\"\u68D0\u68D1\u68D3\u68D6\u68D9\u68DC\u68DD\u68E5\u68E8\u68EA\u68EB\u68EC\u68ED\u68F0\u68F1\u68F5\u68F6\u68FB\u68FC\u68FD\u6906\u6909\u690A\u6910\u6911\u6913\u6916\u6917\u6931\u6933\u6935\u6938\u693B\u6942\u6945\u6949\u694E\u6957\u695B\u6963\u6964\u6965\u6966\u6968\u6969\u696C\u6970\u6971\u6972\u697A\u697B\u697F\u6980\u698D\u6992\u6996\u6998\u69A1\u69A5\u69A6\u69A8\u69AB\u69AD\u69AF\u69B7\u69B8\u69BA\u69BC\u69C5\u69C8\u69D1\u69D6\u69D7\u69E2\u69E5\u69EE\u69EF\u69F1\u69F3\u69F5\u69FE\u6A00\u6A01\u6A03\u6A0F\u6A11\u6A15\u6A1A\u6A1D\u6A20\u6A24\u6A28\u6A30\u6A32\"],\n[\"8fc5a1\",\"\u6A34\u6A37\u6A3B\u6A3E\u6A3F\u6A45\u6A46\u6A49\u6A4A\u6A4E\u6A50\u6A51\u6A52\u6A55\u6A56\u6A5B\u6A64\u6A67\u6A6A\u6A71\u6A73\u6A7E\u6A81\u6A83\u6A86\u6A87\u6A89\u6A8B\u6A91\u6A9B\u6A9D\u6A9E\u6A9F\u6AA5\u6AAB\u6AAF\u6AB0\u6AB1\u6AB4\u6ABD\u6ABE\u6ABF\u6AC6\u6AC9\u6AC8\u6ACC\u6AD0\u6AD4\u6AD5\u6AD6\u6ADC\u6ADD\u6AE4\u6AE7\u6AEC\u6AF0\u6AF1\u6AF2\u6AFC\u6AFD\u6B02\u6B03\u6B06\u6B07\u6B09\u6B0F\u6B10\u6B11\u6B17\u6B1B\u6B1E\u6B24\u6B28\u6B2B\u6B2C\u6B2F\u6B35\u6B36\u6B3B\u6B3F\u6B46\u6B4A\u6B4D\u6B52\u6B56\u6B58\u6B5D\u6B60\u6B67\u6B6B\u6B6E\u6B70\u6B75\u6B7D\"],\n[\"8fc6a1\",\"\u6B7E\u6B82\u6B85\u6B97\u6B9B\u6B9F\u6BA0\u6BA2\u6BA3\u6BA8\u6BA9\u6BAC\u6BAD\u6BAE\u6BB0\u6BB8\u6BB9\u6BBD\u6BBE\u6BC3\u6BC4\u6BC9\u6BCC\u6BD6\u6BDA\u6BE1\u6BE3\u6BE6\u6BE7\u6BEE\u6BF1\u6BF7\u6BF9\u6BFF\u6C02\u6C04\u6C05\u6C09\u6C0D\u6C0E\u6C10\u6C12\u6C19\u6C1F\u6C26\u6C27\u6C28\u6C2C\u6C2E\u6C33\u6C35\u6C36\u6C3A\u6C3B\u6C3F\u6C4A\u6C4B\u6C4D\u6C4F\u6C52\u6C54\u6C59\u6C5B\u6C5C\u6C6B\u6C6D\u6C6F\u6C74\u6C76\u6C78\u6C79\u6C7B\u6C85\u6C86\u6C87\u6C89\u6C94\u6C95\u6C97\u6C98\u6C9C\u6C9F\u6CB0\u6CB2\u6CB4\u6CC2\u6CC6\u6CCD\u6CCF\u6CD0\u6CD1\u6CD2\u6CD4\u6CD6\"],\n[\"8fc7a1\",\"\u6CDA\u6CDC\u6CE0\u6CE7\u6CE9\u6CEB\u6CEC\u6CEE\u6CF2\u6CF4\u6D04\u6D07\u6D0A\u6D0E\u6D0F\u6D11\u6D13\u6D1A\u6D26\u6D27\u6D28\u6C67\u6D2E\u6D2F\u6D31\u6D39\u6D3C\u6D3F\u6D57\u6D5E\u6D5F\u6D61\u6D65\u6D67\u6D6F\u6D70\u6D7C\u6D82\u6D87\u6D91\u6D92\u6D94\u6D96\u6D97\u6D98\u6DAA\u6DAC\u6DB4\u6DB7\u6DB9\u6DBD\u6DBF\u6DC4\u6DC8\u6DCA\u6DCE\u6DCF\u6DD6\u6DDB\u6DDD\u6DDF\u6DE0\u6DE2\u6DE5\u6DE9\u6DEF\u6DF0\u6DF4\u6DF6\u6DFC\u6E00\u6E04\u6E1E\u6E22\u6E27\u6E32\u6E36\u6E39\u6E3B\u6E3C\u6E44\u6E45\u6E48\u6E49\u6E4B\u6E4F\u6E51\u6E52\u6E53\u6E54\u6E57\u6E5C\u6E5D\u6E5E\"],\n[\"8fc8a1\",\"\u6E62\u6E63\u6E68\u6E73\u6E7B\u6E7D\u6E8D\u6E93\u6E99\u6EA0\u6EA7\u6EAD\u6EAE\u6EB1\u6EB3\u6EBB\u6EBF\u6EC0\u6EC1\u6EC3\u6EC7\u6EC8\u6ECA\u6ECD\u6ECE\u6ECF\u6EEB\u6EED\u6EEE\u6EF9\u6EFB\u6EFD\u6F04\u6F08\u6F0A\u6F0C\u6F0D\u6F16\u6F18\u6F1A\u6F1B\u6F26\u6F29\u6F2A\u6F2F\u6F30\u6F33\u6F36\u6F3B\u6F3C\u6F2D\u6F4F\u6F51\u6F52\u6F53\u6F57\u6F59\u6F5A\u6F5D\u6F5E\u6F61\u6F62\u6F68\u6F6C\u6F7D\u6F7E\u6F83\u6F87\u6F88\u6F8B\u6F8C\u6F8D\u6F90\u6F92\u6F93\u6F94\u6F96\u6F9A\u6F9F\u6FA0\u6FA5\u6FA6\u6FA7\u6FA8\u6FAE\u6FAF\u6FB0\u6FB5\u6FB6\u6FBC\u6FC5\u6FC7\u6FC8\u6FCA\"],\n[\"8fc9a1\",\"\u6FDA\u6FDE\u6FE8\u6FE9\u6FF0\u6FF5\u6FF9\u6FFC\u6FFD\u7000\u7005\u7006\u7007\u700D\u7017\u7020\u7023\u702F\u7034\u7037\u7039\u703C\u7043\u7044\u7048\u7049\u704A\u704B\u7054\u7055\u705D\u705E\u704E\u7064\u7065\u706C\u706E\u7075\u7076\u707E\u7081\u7085\u7086\u7094\",4,\"\u709B\u70A4\u70AB\u70B0\u70B1\u70B4\u70B7\u70CA\u70D1\u70D3\u70D4\u70D5\u70D6\u70D8\u70DC\u70E4\u70FA\u7103\",4,\"\u710B\u710C\u710F\u711E\u7120\u712B\u712D\u712F\u7130\u7131\u7138\u7141\u7145\u7146\u7147\u714A\u714B\u7150\u7152\u7157\u715A\u715C\u715E\u7160\"],\n[\"8fcaa1\",\"\u7168\u7179\u7180\u7185\u7187\u718C\u7192\u719A\u719B\u71A0\u71A2\u71AF\u71B0\u71B2\u71B3\u71BA\u71BF\u71C0\u71C1\u71C4\u71CB\u71CC\u71D3\u71D6\u71D9\u71DA\u71DC\u71F8\u71FE\u7200\u7207\u7208\u7209\u7213\u7217\u721A\u721D\u721F\u7224\u722B\u722F\u7234\u7238\u7239\u7241\u7242\u7243\u7245\u724E\u724F\u7250\u7253\u7255\u7256\u725A\u725C\u725E\u7260\u7263\u7268\u726B\u726E\u726F\u7271\u7277\u7278\u727B\u727C\u727F\u7284\u7289\u728D\u728E\u7293\u729B\u72A8\u72AD\u72AE\u72B1\u72B4\u72BE\u72C1\u72C7\u72C9\u72CC\u72D5\u72D6\u72D8\u72DF\u72E5\u72F3\u72F4\u72FA\u72FB\"],\n[\"8fcba1\",\"\u72FE\u7302\u7304\u7305\u7307\u730B\u730D\u7312\u7313\u7318\u7319\u731E\u7322\u7324\u7327\u7328\u732C\u7331\u7332\u7335\u733A\u733B\u733D\u7343\u734D\u7350\u7352\u7356\u7358\u735D\u735E\u735F\u7360\u7366\u7367\u7369\u736B\u736C\u736E\u736F\u7371\u7377\u7379\u737C\u7380\u7381\u7383\u7385\u7386\u738E\u7390\u7393\u7395\u7397\u7398\u739C\u739E\u739F\u73A0\u73A2\u73A5\u73A6\u73AA\u73AB\u73AD\u73B5\u73B7\u73B9\u73BC\u73BD\u73BF\u73C5\u73C6\u73C9\u73CB\u73CC\u73CF\u73D2\u73D3\u73D6\u73D9\u73DD\u73E1\u73E3\u73E6\u73E7\u73E9\u73F4\u73F5\u73F7\u73F9\u73FA\u73FB\u73FD\"],\n[\"8fcca1\",\"\u73FF\u7400\u7401\u7404\u7407\u740A\u7411\u741A\u741B\u7424\u7426\u7428\",9,\"\u7439\u7440\u7443\u7444\u7446\u7447\u744B\u744D\u7451\u7452\u7457\u745D\u7462\u7466\u7467\u7468\u746B\u746D\u746E\u7471\u7472\u7480\u7481\u7485\u7486\u7487\u7489\u748F\u7490\u7491\u7492\u7498\u7499\u749A\u749C\u749F\u74A0\u74A1\u74A3\u74A6\u74A8\u74A9\u74AA\u74AB\u74AE\u74AF\u74B1\u74B2\u74B5\u74B9\u74BB\u74BF\u74C8\u74C9\u74CC\u74D0\u74D3\u74D8\u74DA\u74DB\u74DE\u74DF\u74E4\u74E8\u74EA\u74EB\u74EF\u74F4\u74FA\u74FB\u74FC\u74FF\u7506\"],\n[\"8fcda1\",\"\u7512\u7516\u7517\u7520\u7521\u7524\u7527\u7529\u752A\u752F\u7536\u7539\u753D\u753E\u753F\u7540\u7543\u7547\u7548\u754E\u7550\u7552\u7557\u755E\u755F\u7561\u756F\u7571\u7579\",5,\"\u7581\u7585\u7590\u7592\u7593\u7595\u7599\u759C\u75A2\u75A4\u75B4\u75BA\u75BF\u75C0\u75C1\u75C4\u75C6\u75CC\u75CE\u75CF\u75D7\u75DC\u75DF\u75E0\u75E1\u75E4\u75E7\u75EC\u75EE\u75EF\u75F1\u75F9\u7600\u7602\u7603\u7604\u7607\u7608\u760A\u760C\u760F\u7612\u7613\u7615\u7616\u7619\u761B\u761C\u761D\u761E\u7623\u7625\u7626\u7629\u762D\u7632\u7633\u7635\u7638\u7639\"],\n[\"8fcea1\",\"\u763A\u763C\u764A\u7640\u7641\u7643\u7644\u7645\u7649\u764B\u7655\u7659\u765F\u7664\u7665\u766D\u766E\u766F\u7671\u7674\u7681\u7685\u768C\u768D\u7695\u769B\u769C\u769D\u769F\u76A0\u76A2\",6,\"\u76AA\u76AD\u76BD\u76C1\u76C5\u76C9\u76CB\u76CC\u76CE\u76D4\u76D9\u76E0\u76E6\u76E8\u76EC\u76F0\u76F1\u76F6\u76F9\u76FC\u7700\u7706\u770A\u770E\u7712\u7714\u7715\u7717\u7719\u771A\u771C\u7722\u7728\u772D\u772E\u772F\u7734\u7735\u7736\u7739\u773D\u773E\u7742\u7745\u7746\u774A\u774D\u774E\u774F\u7752\u7756\u7757\u775C\u775E\u775F\u7760\u7762\"],\n[\"8fcfa1\",\"\u7764\u7767\u776A\u776C\u7770\u7772\u7773\u7774\u777A\u777D\u7780\u7784\u778C\u778D\u7794\u7795\u7796\u779A\u779F\u77A2\u77A7\u77AA\u77AE\u77AF\u77B1\u77B5\u77BE\u77C3\u77C9\u77D1\u77D2\u77D5\u77D9\u77DE\u77DF\u77E0\u77E4\u77E6\u77EA\u77EC\u77F0\u77F1\u77F4\u77F8\u77FB\u7805\u7806\u7809\u780D\u780E\u7811\u781D\u7821\u7822\u7823\u782D\u782E\u7830\u7835\u7837\u7843\u7844\u7847\u7848\u784C\u784E\u7852\u785C\u785E\u7860\u7861\u7863\u7864\u7868\u786A\u786E\u787A\u787E\u788A\u788F\u7894\u7898\u78A1\u789D\u789E\u789F\u78A4\u78A8\u78AC\u78AD\u78B0\u78B1\u78B2\u78B3\"],\n[\"8fd0a1\",\"\u78BB\u78BD\u78BF\u78C7\u78C8\u78C9\u78CC\u78CE\u78D2\u78D3\u78D5\u78D6\u78E4\u78DB\u78DF\u78E0\u78E1\u78E6\u78EA\u78F2\u78F3\u7900\u78F6\u78F7\u78FA\u78FB\u78FF\u7906\u790C\u7910\u791A\u791C\u791E\u791F\u7920\u7925\u7927\u7929\u792D\u7931\u7934\u7935\u793B\u793D\u793F\u7944\u7945\u7946\u794A\u794B\u794F\u7951\u7954\u7958\u795B\u795C\u7967\u7969\u796B\u7972\u7979\u797B\u797C\u797E\u798B\u798C\u7991\u7993\u7994\u7995\u7996\u7998\u799B\u799C\u79A1\u79A8\u79A9\u79AB\u79AF\u79B1\u79B4\u79B8\u79BB\u79C2\u79C4\u79C7\u79C8\u79CA\u79CF\u79D4\u79D6\u79DA\u79DD\u79DE\"],\n[\"8fd1a1\",\"\u79E0\u79E2\u79E5\u79EA\u79EB\u79ED\u79F1\u79F8\u79FC\u7A02\u7A03\u7A07\u7A09\u7A0A\u7A0C\u7A11\u7A15\u7A1B\u7A1E\u7A21\u7A27\u7A2B\u7A2D\u7A2F\u7A30\u7A34\u7A35\u7A38\u7A39\u7A3A\u7A44\u7A45\u7A47\u7A48\u7A4C\u7A55\u7A56\u7A59\u7A5C\u7A5D\u7A5F\u7A60\u7A65\u7A67\u7A6A\u7A6D\u7A75\u7A78\u7A7E\u7A80\u7A82\u7A85\u7A86\u7A8A\u7A8B\u7A90\u7A91\u7A94\u7A9E\u7AA0\u7AA3\u7AAC\u7AB3\u7AB5\u7AB9\u7ABB\u7ABC\u7AC6\u7AC9\u7ACC\u7ACE\u7AD1\u7ADB\u7AE8\u7AE9\u7AEB\u7AEC\u7AF1\u7AF4\u7AFB\u7AFD\u7AFE\u7B07\u7B14\u7B1F\u7B23\u7B27\u7B29\u7B2A\u7B2B\u7B2D\u7B2E\u7B2F\u7B30\"],\n[\"8fd2a1\",\"\u7B31\u7B34\u7B3D\u7B3F\u7B40\u7B41\u7B47\u7B4E\u7B55\u7B60\u7B64\u7B66\u7B69\u7B6A\u7B6D\u7B6F\u7B72\u7B73\u7B77\u7B84\u7B89\u7B8E\u7B90\u7B91\u7B96\u7B9B\u7B9E\u7BA0\u7BA5\u7BAC\u7BAF\u7BB0\u7BB2\u7BB5\u7BB6\u7BBA\u7BBB\u7BBC\u7BBD\u7BC2\u7BC5\u7BC8\u7BCA\u7BD4\u7BD6\u7BD7\u7BD9\u7BDA\u7BDB\u7BE8\u7BEA\u7BF2\u7BF4\u7BF5\u7BF8\u7BF9\u7BFA\u7BFC\u7BFE\u7C01\u7C02\u7C03\u7C04\u7C06\u7C09\u7C0B\u7C0C\u7C0E\u7C0F\u7C19\u7C1B\u7C20\u7C25\u7C26\u7C28\u7C2C\u7C31\u7C33\u7C34\u7C36\u7C39\u7C3A\u7C46\u7C4A\u7C55\u7C51\u7C52\u7C53\u7C59\",5],\n[\"8fd3a1\",\"\u7C61\u7C63\u7C67\u7C69\u7C6D\u7C6E\u7C70\u7C72\u7C79\u7C7C\u7C7D\u7C86\u7C87\u7C8F\u7C94\u7C9E\u7CA0\u7CA6\u7CB0\u7CB6\u7CB7\u7CBA\u7CBB\u7CBC\u7CBF\u7CC4\u7CC7\u7CC8\u7CC9\u7CCD\u7CCF\u7CD3\u7CD4\u7CD5\u7CD7\u7CD9\u7CDA\u7CDD\u7CE6\u7CE9\u7CEB\u7CF5\u7D03\u7D07\u7D08\u7D09\u7D0F\u7D11\u7D12\u7D13\u7D16\u7D1D\u7D1E\u7D23\u7D26\u7D2A\u7D2D\u7D31\u7D3C\u7D3D\u7D3E\u7D40\u7D41\u7D47\u7D48\u7D4D\u7D51\u7D53\u7D57\u7D59\u7D5A\u7D5C\u7D5D\u7D65\u7D67\u7D6A\u7D70\u7D78\u7D7A\u7D7B\u7D7F\u7D81\u7D82\u7D83\u7D85\u7D86\u7D88\u7D8B\u7D8C\u7D8D\u7D91\u7D96\u7D97\u7D9D\"],\n[\"8fd4a1\",\"\u7D9E\u7DA6\u7DA7\u7DAA\u7DB3\u7DB6\u7DB7\u7DB9\u7DC2\",4,\"\u7DCC\u7DCD\u7DCE\u7DD7\u7DD9\u7E00\u7DE2\u7DE5\u7DE6\u7DEA\u7DEB\u7DED\u7DF1\u7DF5\u7DF6\u7DF9\u7DFA\u7E08\u7E10\u7E11\u7E15\u7E17\u7E1C\u7E1D\u7E20\u7E27\u7E28\u7E2C\u7E2D\u7E2F\u7E33\u7E36\u7E3F\u7E44\u7E45\u7E47\u7E4E\u7E50\u7E52\u7E58\u7E5F\u7E61\u7E62\u7E65\u7E6B\u7E6E\u7E6F\u7E73\u7E78\u7E7E\u7E81\u7E86\u7E87\u7E8A\u7E8D\u7E91\u7E95\u7E98\u7E9A\u7E9D\u7E9E\u7F3C\u7F3B\u7F3D\u7F3E\u7F3F\u7F43\u7F44\u7F47\u7F4F\u7F52\u7F53\u7F5B\u7F5C\u7F5D\u7F61\u7F63\u7F64\u7F65\u7F66\u7F6D\"],\n[\"8fd5a1\",\"\u7F71\u7F7D\u7F7E\u7F7F\u7F80\u7F8B\u7F8D\u7F8F\u7F90\u7F91\u7F96\u7F97\u7F9C\u7FA1\u7FA2\u7FA6\u7FAA\u7FAD\u7FB4\u7FBC\u7FBF\u7FC0\u7FC3\u7FC8\u7FCE\u7FCF\u7FDB\u7FDF\u7FE3\u7FE5\u7FE8\u7FEC\u7FEE\u7FEF\u7FF2\u7FFA\u7FFD\u7FFE\u7FFF\u8007\u8008\u800A\u800D\u800E\u800F\u8011\u8013\u8014\u8016\u801D\u801E\u801F\u8020\u8024\u8026\u802C\u802E\u8030\u8034\u8035\u8037\u8039\u803A\u803C\u803E\u8040\u8044\u8060\u8064\u8066\u806D\u8071\u8075\u8081\u8088\u808E\u809C\u809E\u80A6\u80A7\u80AB\u80B8\u80B9\u80C8\u80CD\u80CF\u80D2\u80D4\u80D5\u80D7\u80D8\u80E0\u80ED\u80EE\"],\n[\"8fd6a1\",\"\u80F0\u80F2\u80F3\u80F6\u80F9\u80FA\u80FE\u8103\u810B\u8116\u8117\u8118\u811C\u811E\u8120\u8124\u8127\u812C\u8130\u8135\u813A\u813C\u8145\u8147\u814A\u814C\u8152\u8157\u8160\u8161\u8167\u8168\u8169\u816D\u816F\u8177\u8181\u8190\u8184\u8185\u8186\u818B\u818E\u8196\u8198\u819B\u819E\u81A2\u81AE\u81B2\u81B4\u81BB\u81CB\u81C3\u81C5\u81CA\u81CE\u81CF\u81D5\u81D7\u81DB\u81DD\u81DE\u81E1\u81E4\u81EB\u81EC\u81F0\u81F1\u81F2\u81F5\u81F6\u81F8\u81F9\u81FD\u81FF\u8200\u8203\u820F\u8213\u8214\u8219\u821A\u821D\u8221\u8222\u8228\u8232\u8234\u823A\u8243\u8244\u8245\u8246\"],\n[\"8fd7a1\",\"\u824B\u824E\u824F\u8251\u8256\u825C\u8260\u8263\u8267\u826D\u8274\u827B\u827D\u827F\u8280\u8281\u8283\u8284\u8287\u8289\u828A\u828E\u8291\u8294\u8296\u8298\u829A\u829B\u82A0\u82A1\u82A3\u82A4\u82A7\u82A8\u82A9\u82AA\u82AE\u82B0\u82B2\u82B4\u82B7\u82BA\u82BC\u82BE\u82BF\u82C6\u82D0\u82D5\u82DA\u82E0\u82E2\u82E4\u82E8\u82EA\u82ED\u82EF\u82F6\u82F7\u82FD\u82FE\u8300\u8301\u8307\u8308\u830A\u830B\u8354\u831B\u831D\u831E\u831F\u8321\u8322\u832C\u832D\u832E\u8330\u8333\u8337\u833A\u833C\u833D\u8342\u8343\u8344\u8347\u834D\u834E\u8351\u8355\u8356\u8357\u8370\u8378\"],\n[\"8fd8a1\",\"\u837D\u837F\u8380\u8382\u8384\u8386\u838D\u8392\u8394\u8395\u8398\u8399\u839B\u839C\u839D\u83A6\u83A7\u83A9\u83AC\u83BE\u83BF\u83C0\u83C7\u83C9\u83CF\u83D0\u83D1\u83D4\u83DD\u8353\u83E8\u83EA\u83F6\u83F8\u83F9\u83FC\u8401\u8406\u840A\u840F\u8411\u8415\u8419\u83AD\u842F\u8439\u8445\u8447\u8448\u844A\u844D\u844F\u8451\u8452\u8456\u8458\u8459\u845A\u845C\u8460\u8464\u8465\u8467\u846A\u8470\u8473\u8474\u8476\u8478\u847C\u847D\u8481\u8485\u8492\u8493\u8495\u849E\u84A6\u84A8\u84A9\u84AA\u84AF\u84B1\u84B4\u84BA\u84BD\u84BE\u84C0\u84C2\u84C7\u84C8\u84CC\u84CF\u84D3\"],\n[\"8fd9a1\",\"\u84DC\u84E7\u84EA\u84EF\u84F0\u84F1\u84F2\u84F7\u8532\u84FA\u84FB\u84FD\u8502\u8503\u8507\u850C\u850E\u8510\u851C\u851E\u8522\u8523\u8524\u8525\u8527\u852A\u852B\u852F\u8533\u8534\u8536\u853F\u8546\u854F\",4,\"\u8556\u8559\u855C\",6,\"\u8564\u856B\u856F\u8579\u857A\u857B\u857D\u857F\u8581\u8585\u8586\u8589\u858B\u858C\u858F\u8593\u8598\u859D\u859F\u85A0\u85A2\u85A5\u85A7\u85B4\u85B6\u85B7\u85B8\u85BC\u85BD\u85BE\u85BF\u85C2\u85C7\u85CA\u85CB\u85CE\u85AD\u85D8\u85DA\u85DF\u85E0\u85E6\u85E8\u85ED\u85F3\u85F6\u85FC\"],\n[\"8fdaa1\",\"\u85FF\u8600\u8604\u8605\u860D\u860E\u8610\u8611\u8612\u8618\u8619\u861B\u861E\u8621\u8627\u8629\u8636\u8638\u863A\u863C\u863D\u8640\u8642\u8646\u8652\u8653\u8656\u8657\u8658\u8659\u865D\u8660\",4,\"\u8669\u866C\u866F\u8675\u8676\u8677\u867A\u868D\u8691\u8696\u8698\u869A\u869C\u86A1\u86A6\u86A7\u86A8\u86AD\u86B1\u86B3\u86B4\u86B5\u86B7\u86B8\u86B9\u86BF\u86C0\u86C1\u86C3\u86C5\u86D1\u86D2\u86D5\u86D7\u86DA\u86DC\u86E0\u86E3\u86E5\u86E7\u8688\u86FA\u86FC\u86FD\u8704\u8705\u8707\u870B\u870E\u870F\u8710\u8713\u8714\u8719\u871E\u871F\u8721\u8723\"],\n[\"8fdba1\",\"\u8728\u872E\u872F\u8731\u8732\u8739\u873A\u873C\u873D\u873E\u8740\u8743\u8745\u874D\u8758\u875D\u8761\u8764\u8765\u876F\u8771\u8772\u877B\u8783\",6,\"\u878B\u878C\u8790\u8793\u8795\u8797\u8798\u8799\u879E\u87A0\u87A3\u87A7\u87AC\u87AD\u87AE\u87B1\u87B5\u87BE\u87BF\u87C1\u87C8\u87C9\u87CA\u87CE\u87D5\u87D6\u87D9\u87DA\u87DC\u87DF\u87E2\u87E3\u87E4\u87EA\u87EB\u87ED\u87F1\u87F3\u87F8\u87FA\u87FF\u8801\u8803\u8806\u8809\u880A\u880B\u8810\u8819\u8812\u8813\u8814\u8818\u881A\u881B\u881C\u881E\u881F\u8828\u882D\u882E\u8830\u8832\u8835\"],\n[\"8fdca1\",\"\u883A\u883C\u8841\u8843\u8845\u8848\u8849\u884A\u884B\u884E\u8851\u8855\u8856\u8858\u885A\u885C\u885F\u8860\u8864\u8869\u8871\u8879\u887B\u8880\u8898\u889A\u889B\u889C\u889F\u88A0\u88A8\u88AA\u88BA\u88BD\u88BE\u88C0\u88CA\",4,\"\u88D1\u88D2\u88D3\u88DB\u88DE\u88E7\u88EF\u88F0\u88F1\u88F5\u88F7\u8901\u8906\u890D\u890E\u890F\u8915\u8916\u8918\u8919\u891A\u891C\u8920\u8926\u8927\u8928\u8930\u8931\u8932\u8935\u8939\u893A\u893E\u8940\u8942\u8945\u8946\u8949\u894F\u8952\u8957\u895A\u895B\u895C\u8961\u8962\u8963\u896B\u896E\u8970\u8973\u8975\u897A\"],\n[\"8fdda1\",\"\u897B\u897C\u897D\u8989\u898D\u8990\u8994\u8995\u899B\u899C\u899F\u89A0\u89A5\u89B0\u89B4\u89B5\u89B6\u89B7\u89BC\u89D4\",4,\"\u89E5\u89E9\u89EB\u89ED\u89F1\u89F3\u89F6\u89F9\u89FD\u89FF\u8A04\u8A05\u8A07\u8A0F\u8A11\u8A12\u8A14\u8A15\u8A1E\u8A20\u8A22\u8A24\u8A26\u8A2B\u8A2C\u8A2F\u8A35\u8A37\u8A3D\u8A3E\u8A40\u8A43\u8A45\u8A47\u8A49\u8A4D\u8A4E\u8A53\u8A56\u8A57\u8A58\u8A5C\u8A5D\u8A61\u8A65\u8A67\u8A75\u8A76\u8A77\u8A79\u8A7A\u8A7B\u8A7E\u8A7F\u8A80\u8A83\u8A86\u8A8B\u8A8F\u8A90\u8A92\u8A96\u8A97\u8A99\u8A9F\u8AA7\u8AA9\u8AAE\u8AAF\u8AB3\"],\n[\"8fdea1\",\"\u8AB6\u8AB7\u8ABB\u8ABE\u8AC3\u8AC6\u8AC8\u8AC9\u8ACA\u8AD1\u8AD3\u8AD4\u8AD5\u8AD7\u8ADD\u8ADF\u8AEC\u8AF0\u8AF4\u8AF5\u8AF6\u8AFC\u8AFF\u8B05\u8B06\u8B0B\u8B11\u8B1C\u8B1E\u8B1F\u8B0A\u8B2D\u8B30\u8B37\u8B3C\u8B42\",4,\"\u8B48\u8B52\u8B53\u8B54\u8B59\u8B4D\u8B5E\u8B63\u8B6D\u8B76\u8B78\u8B79\u8B7C\u8B7E\u8B81\u8B84\u8B85\u8B8B\u8B8D\u8B8F\u8B94\u8B95\u8B9C\u8B9E\u8B9F\u8C38\u8C39\u8C3D\u8C3E\u8C45\u8C47\u8C49\u8C4B\u8C4F\u8C51\u8C53\u8C54\u8C57\u8C58\u8C5B\u8C5D\u8C59\u8C63\u8C64\u8C66\u8C68\u8C69\u8C6D\u8C73\u8C75\u8C76\u8C7B\u8C7E\u8C86\"],\n[\"8fdfa1\",\"\u8C87\u8C8B\u8C90\u8C92\u8C93\u8C99\u8C9B\u8C9C\u8CA4\u8CB9\u8CBA\u8CC5\u8CC6\u8CC9\u8CCB\u8CCF\u8CD6\u8CD5\u8CD9\u8CDD\u8CE1\u8CE8\u8CEC\u8CEF\u8CF0\u8CF2\u8CF5\u8CF7\u8CF8\u8CFE\u8CFF\u8D01\u8D03\u8D09\u8D12\u8D17\u8D1B\u8D65\u8D69\u8D6C\u8D6E\u8D7F\u8D82\u8D84\u8D88\u8D8D\u8D90\u8D91\u8D95\u8D9E\u8D9F\u8DA0\u8DA6\u8DAB\u8DAC\u8DAF\u8DB2\u8DB5\u8DB7\u8DB9\u8DBB\u8DC0\u8DC5\u8DC6\u8DC7\u8DC8\u8DCA\u8DCE\u8DD1\u8DD4\u8DD5\u8DD7\u8DD9\u8DE4\u8DE5\u8DE7\u8DEC\u8DF0\u8DBC\u8DF1\u8DF2\u8DF4\u8DFD\u8E01\u8E04\u8E05\u8E06\u8E0B\u8E11\u8E14\u8E16\u8E20\u8E21\u8E22\"],\n[\"8fe0a1\",\"\u8E23\u8E26\u8E27\u8E31\u8E33\u8E36\u8E37\u8E38\u8E39\u8E3D\u8E40\u8E41\u8E4B\u8E4D\u8E4E\u8E4F\u8E54\u8E5B\u8E5C\u8E5D\u8E5E\u8E61\u8E62\u8E69\u8E6C\u8E6D\u8E6F\u8E70\u8E71\u8E79\u8E7A\u8E7B\u8E82\u8E83\u8E89\u8E90\u8E92\u8E95\u8E9A\u8E9B\u8E9D\u8E9E\u8EA2\u8EA7\u8EA9\u8EAD\u8EAE\u8EB3\u8EB5\u8EBA\u8EBB\u8EC0\u8EC1\u8EC3\u8EC4\u8EC7\u8ECF\u8ED1\u8ED4\u8EDC\u8EE8\u8EEE\u8EF0\u8EF1\u8EF7\u8EF9\u8EFA\u8EED\u8F00\u8F02\u8F07\u8F08\u8F0F\u8F10\u8F16\u8F17\u8F18\u8F1E\u8F20\u8F21\u8F23\u8F25\u8F27\u8F28\u8F2C\u8F2D\u8F2E\u8F34\u8F35\u8F36\u8F37\u8F3A\u8F40\u8F41\"],\n[\"8fe1a1\",\"\u8F43\u8F47\u8F4F\u8F51\",4,\"\u8F58\u8F5D\u8F5E\u8F65\u8F9D\u8FA0\u8FA1\u8FA4\u8FA5\u8FA6\u8FB5\u8FB6\u8FB8\u8FBE\u8FC0\u8FC1\u8FC6\u8FCA\u8FCB\u8FCD\u8FD0\u8FD2\u8FD3\u8FD5\u8FE0\u8FE3\u8FE4\u8FE8\u8FEE\u8FF1\u8FF5\u8FF6\u8FFB\u8FFE\u9002\u9004\u9008\u900C\u9018\u901B\u9028\u9029\u902F\u902A\u902C\u902D\u9033\u9034\u9037\u903F\u9043\u9044\u904C\u905B\u905D\u9062\u9066\u9067\u906C\u9070\u9074\u9079\u9085\u9088\u908B\u908C\u908E\u9090\u9095\u9097\u9098\u9099\u909B\u90A0\u90A1\u90A2\u90A5\u90B0\u90B2\u90B3\u90B4\u90B6\u90BD\u90CC\u90BE\u90C3\"],\n[\"8fe2a1\",\"\u90C4\u90C5\u90C7\u90C8\u90D5\u90D7\u90D8\u90D9\u90DC\u90DD\u90DF\u90E5\u90D2\u90F6\u90EB\u90EF\u90F0\u90F4\u90FE\u90FF\u9100\u9104\u9105\u9106\u9108\u910D\u9110\u9114\u9116\u9117\u9118\u911A\u911C\u911E\u9120\u9125\u9122\u9123\u9127\u9129\u912E\u912F\u9131\u9134\u9136\u9137\u9139\u913A\u913C\u913D\u9143\u9147\u9148\u914F\u9153\u9157\u9159\u915A\u915B\u9161\u9164\u9167\u916D\u9174\u9179\u917A\u917B\u9181\u9183\u9185\u9186\u918A\u918E\u9191\u9193\u9194\u9195\u9198\u919E\u91A1\u91A6\u91A8\u91AC\u91AD\u91AE\u91B0\u91B1\u91B2\u91B3\u91B6\u91BB\u91BC\u91BD\u91BF\"],\n[\"8fe3a1\",\"\u91C2\u91C3\u91C5\u91D3\u91D4\u91D7\u91D9\u91DA\u91DE\u91E4\u91E5\u91E9\u91EA\u91EC\",5,\"\u91F7\u91F9\u91FB\u91FD\u9200\u9201\u9204\u9205\u9206\u9207\u9209\u920A\u920C\u9210\u9212\u9213\u9216\u9218\u921C\u921D\u9223\u9224\u9225\u9226\u9228\u922E\u922F\u9230\u9233\u9235\u9236\u9238\u9239\u923A\u923C\u923E\u9240\u9242\u9243\u9246\u9247\u924A\u924D\u924E\u924F\u9251\u9258\u9259\u925C\u925D\u9260\u9261\u9265\u9267\u9268\u9269\u926E\u926F\u9270\u9275\",4,\"\u927B\u927C\u927D\u927F\u9288\u9289\u928A\u928D\u928E\u9292\u9297\"],\n[\"8fe4a1\",\"\u9299\u929F\u92A0\u92A4\u92A5\u92A7\u92A8\u92AB\u92AF\u92B2\u92B6\u92B8\u92BA\u92BB\u92BC\u92BD\u92BF\",4,\"\u92C5\u92C6\u92C7\u92C8\u92CB\u92CC\u92CD\u92CE\u92D0\u92D3\u92D5\u92D7\u92D8\u92D9\u92DC\u92DD\u92DF\u92E0\u92E1\u92E3\u92E5\u92E7\u92E8\u92EC\u92EE\u92F0\u92F9\u92FB\u92FF\u9300\u9302\u9308\u930D\u9311\u9314\u9315\u931C\u931D\u931E\u931F\u9321\u9324\u9325\u9327\u9329\u932A\u9333\u9334\u9336\u9337\u9347\u9348\u9349\u9350\u9351\u9352\u9355\u9357\u9358\u935A\u935E\u9364\u9365\u9367\u9369\u936A\u936D\u936F\u9370\u9371\u9373\u9374\u9376\"],\n[\"8fe5a1\",\"\u937A\u937D\u937F\u9380\u9381\u9382\u9388\u938A\u938B\u938D\u938F\u9392\u9395\u9398\u939B\u939E\u93A1\u93A3\u93A4\u93A6\u93A8\u93AB\u93B4\u93B5\u93B6\u93BA\u93A9\u93C1\u93C4\u93C5\u93C6\u93C7\u93C9\",4,\"\u93D3\u93D9\u93DC\u93DE\u93DF\u93E2\u93E6\u93E7\u93F9\u93F7\u93F8\u93FA\u93FB\u93FD\u9401\u9402\u9404\u9408\u9409\u940D\u940E\u940F\u9415\u9416\u9417\u941F\u942E\u942F\u9431\u9432\u9433\u9434\u943B\u943F\u943D\u9443\u9445\u9448\u944A\u944C\u9455\u9459\u945C\u945F\u9461\u9463\u9468\u946B\u946D\u946E\u946F\u9471\u9472\u9484\u9483\u9578\u9579\"],\n[\"8fe6a1\",\"\u957E\u9584\u9588\u958C\u958D\u958E\u959D\u959E\u959F\u95A1\u95A6\u95A9\u95AB\u95AC\u95B4\u95B6\u95BA\u95BD\u95BF\u95C6\u95C8\u95C9\u95CB\u95D0\u95D1\u95D2\u95D3\u95D9\u95DA\u95DD\u95DE\u95DF\u95E0\u95E4\u95E6\u961D\u961E\u9622\u9624\u9625\u9626\u962C\u9631\u9633\u9637\u9638\u9639\u963A\u963C\u963D\u9641\u9652\u9654\u9656\u9657\u9658\u9661\u966E\u9674\u967B\u967C\u967E\u967F\u9681\u9682\u9683\u9684\u9689\u9691\u9696\u969A\u969D\u969F\u96A4\u96A5\u96A6\u96A9\u96AE\u96AF\u96B3\u96BA\u96CA\u96D2\u5DB2\u96D8\u96DA\u96DD\u96DE\u96DF\u96E9\u96EF\u96F1\u96FA\u9702\"],\n[\"8fe7a1\",\"\u9703\u9705\u9709\u971A\u971B\u971D\u9721\u9722\u9723\u9728\u9731\u9733\u9741\u9743\u974A\u974E\u974F\u9755\u9757\u9758\u975A\u975B\u9763\u9767\u976A\u976E\u9773\u9776\u9777\u9778\u977B\u977D\u977F\u9780\u9789\u9795\u9796\u9797\u9799\u979A\u979E\u979F\u97A2\u97AC\u97AE\u97B1\u97B2\u97B5\u97B6\u97B8\u97B9\u97BA\u97BC\u97BE\u97BF\u97C1\u97C4\u97C5\u97C7\u97C9\u97CA\u97CC\u97CD\u97CE\u97D0\u97D1\u97D4\u97D7\u97D8\u97D9\u97DD\u97DE\u97E0\u97DB\u97E1\u97E4\u97EF\u97F1\u97F4\u97F7\u97F8\u97FA\u9807\u980A\u9819\u980D\u980E\u9814\u9816\u981C\u981E\u9820\u9823\u9826\"],\n[\"8fe8a1\",\"\u982B\u982E\u982F\u9830\u9832\u9833\u9835\u9825\u983E\u9844\u9847\u984A\u9851\u9852\u9853\u9856\u9857\u9859\u985A\u9862\u9863\u9865\u9866\u986A\u986C\u98AB\u98AD\u98AE\u98B0\u98B4\u98B7\u98B8\u98BA\u98BB\u98BF\u98C2\u98C5\u98C8\u98CC\u98E1\u98E3\u98E5\u98E6\u98E7\u98EA\u98F3\u98F6\u9902\u9907\u9908\u9911\u9915\u9916\u9917\u991A\u991B\u991C\u991F\u9922\u9926\u9927\u992B\u9931\",4,\"\u9939\u993A\u993B\u993C\u9940\u9941\u9946\u9947\u9948\u994D\u994E\u9954\u9958\u9959\u995B\u995C\u995E\u995F\u9960\u999B\u999D\u999F\u99A6\u99B0\u99B1\u99B2\u99B5\"],\n[\"8fe9a1\",\"\u99B9\u99BA\u99BD\u99BF\u99C3\u99C9\u99D3\u99D4\u99D9\u99DA\u99DC\u99DE\u99E7\u99EA\u99EB\u99EC\u99F0\u99F4\u99F5\u99F9\u99FD\u99FE\u9A02\u9A03\u9A04\u9A0B\u9A0C\u9A10\u9A11\u9A16\u9A1E\u9A20\u9A22\u9A23\u9A24\u9A27\u9A2D\u9A2E\u9A33\u9A35\u9A36\u9A38\u9A47\u9A41\u9A44\u9A4A\u9A4B\u9A4C\u9A4E\u9A51\u9A54\u9A56\u9A5D\u9AAA\u9AAC\u9AAE\u9AAF\u9AB2\u9AB4\u9AB5\u9AB6\u9AB9\u9ABB\u9ABE\u9ABF\u9AC1\u9AC3\u9AC6\u9AC8\u9ACE\u9AD0\u9AD2\u9AD5\u9AD6\u9AD7\u9ADB\u9ADC\u9AE0\u9AE4\u9AE5\u9AE7\u9AE9\u9AEC\u9AF2\u9AF3\u9AF5\u9AF9\u9AFA\u9AFD\u9AFF\",4],\n[\"8feaa1\",\"\u9B04\u9B05\u9B08\u9B09\u9B0B\u9B0C\u9B0D\u9B0E\u9B10\u9B12\u9B16\u9B19\u9B1B\u9B1C\u9B20\u9B26\u9B2B\u9B2D\u9B33\u9B34\u9B35\u9B37\u9B39\u9B3A\u9B3D\u9B48\u9B4B\u9B4C\u9B55\u9B56\u9B57\u9B5B\u9B5E\u9B61\u9B63\u9B65\u9B66\u9B68\u9B6A\",4,\"\u9B73\u9B75\u9B77\u9B78\u9B79\u9B7F\u9B80\u9B84\u9B85\u9B86\u9B87\u9B89\u9B8A\u9B8B\u9B8D\u9B8F\u9B90\u9B94\u9B9A\u9B9D\u9B9E\u9BA6\u9BA7\u9BA9\u9BAC\u9BB0\u9BB1\u9BB2\u9BB7\u9BB8\u9BBB\u9BBC\u9BBE\u9BBF\u9BC1\u9BC7\u9BC8\u9BCE\u9BD0\u9BD7\u9BD8\u9BDD\u9BDF\u9BE5\u9BE7\u9BEA\u9BEB\u9BEF\u9BF3\u9BF7\u9BF8\"],\n[\"8feba1\",\"\u9BF9\u9BFA\u9BFD\u9BFF\u9C00\u9C02\u9C0B\u9C0F\u9C11\u9C16\u9C18\u9C19\u9C1A\u9C1C\u9C1E\u9C22\u9C23\u9C26\",4,\"\u9C31\u9C35\u9C36\u9C37\u9C3D\u9C41\u9C43\u9C44\u9C45\u9C49\u9C4A\u9C4E\u9C4F\u9C50\u9C53\u9C54\u9C56\u9C58\u9C5B\u9C5D\u9C5E\u9C5F\u9C63\u9C69\u9C6A\u9C5C\u9C6B\u9C68\u9C6E\u9C70\u9C72\u9C75\u9C77\u9C7B\u9CE6\u9CF2\u9CF7\u9CF9\u9D0B\u9D02\u9D11\u9D17\u9D18\u9D1C\u9D1D\u9D1E\u9D2F\u9D30\u9D32\u9D33\u9D34\u9D3A\u9D3C\u9D45\u9D3D\u9D42\u9D43\u9D47\u9D4A\u9D53\u9D54\u9D5F\u9D63\u9D62\u9D65\u9D69\u9D6A\u9D6B\u9D70\u9D76\u9D77\u9D7B\"],\n[\"8feca1\",\"\u9D7C\u9D7E\u9D83\u9D84\u9D86\u9D8A\u9D8D\u9D8E\u9D92\u9D93\u9D95\u9D96\u9D97\u9D98\u9DA1\u9DAA\u9DAC\u9DAE\u9DB1\u9DB5\u9DB9\u9DBC\u9DBF\u9DC3\u9DC7\u9DC9\u9DCA\u9DD4\u9DD5\u9DD6\u9DD7\u9DDA\u9DDE\u9DDF\u9DE0\u9DE5\u9DE7\u9DE9\u9DEB\u9DEE\u9DF0\u9DF3\u9DF4\u9DFE\u9E0A\u9E02\u9E07\u9E0E\u9E10\u9E11\u9E12\u9E15\u9E16\u9E19\u9E1C\u9E1D\u9E7A\u9E7B\u9E7C\u9E80\u9E82\u9E83\u9E84\u9E85\u9E87\u9E8E\u9E8F\u9E96\u9E98\u9E9B\u9E9E\u9EA4\u9EA8\u9EAC\u9EAE\u9EAF\u9EB0\u9EB3\u9EB4\u9EB5\u9EC6\u9EC8\u9ECB\u9ED5\u9EDF\u9EE4\u9EE7\u9EEC\u9EED\u9EEE\u9EF0\u9EF1\u9EF2\u9EF5\"],\n[\"8feda1\",\"\u9EF8\u9EFF\u9F02\u9F03\u9F09\u9F0F\u9F10\u9F11\u9F12\u9F14\u9F16\u9F17\u9F19\u9F1A\u9F1B\u9F1F\u9F22\u9F26\u9F2A\u9F2B\u9F2F\u9F31\u9F32\u9F34\u9F37\u9F39\u9F3A\u9F3C\u9F3D\u9F3F\u9F41\u9F43\",4,\"\u9F53\u9F55\u9F56\u9F57\u9F58\u9F5A\u9F5D\u9F5E\u9F68\u9F69\u9F6D\",4,\"\u9F73\u9F75\u9F7A\u9F7D\u9F8F\u9F90\u9F91\u9F92\u9F94\u9F96\u9F97\u9F9E\u9FA1\u9FA2\u9FA3\u9FA5\"]\n]\n", "[\n[\"0\",\"\\u0000\",127,\"\u20AC\"],\n[\"8140\",\"\u4E02\u4E04\u4E05\u4E06\u4E0F\u4E12\u4E17\u4E1F\u4E20\u4E21\u4E23\u4E26\u4E29\u4E2E\u4E2F\u4E31\u4E33\u4E35\u4E37\u4E3C\u4E40\u4E41\u4E42\u4E44\u4E46\u4E4A\u4E51\u4E55\u4E57\u4E5A\u4E5B\u4E62\u4E63\u4E64\u4E65\u4E67\u4E68\u4E6A\",5,\"\u4E72\u4E74\",9,\"\u4E7F\",6,\"\u4E87\u4E8A\"],\n[\"8180\",\"\u4E90\u4E96\u4E97\u4E99\u4E9C\u4E9D\u4E9E\u4EA3\u4EAA\u4EAF\u4EB0\u4EB1\u4EB4\u4EB6\u4EB7\u4EB8\u4EB9\u4EBC\u4EBD\u4EBE\u4EC8\u4ECC\u4ECF\u4ED0\u4ED2\u4EDA\u4EDB\u4EDC\u4EE0\u4EE2\u4EE6\u4EE7\u4EE9\u4EED\u4EEE\u4EEF\u4EF1\u4EF4\u4EF8\u4EF9\u4EFA\u4EFC\u4EFE\u4F00\u4F02\",6,\"\u4F0B\u4F0C\u4F12\",4,\"\u4F1C\u4F1D\u4F21\u4F23\u4F28\u4F29\u4F2C\u4F2D\u4F2E\u4F31\u4F33\u4F35\u4F37\u4F39\u4F3B\u4F3E\",4,\"\u4F44\u4F45\u4F47\",5,\"\u4F52\u4F54\u4F56\u4F61\u4F62\u4F66\u4F68\u4F6A\u4F6B\u4F6D\u4F6E\u4F71\u4F72\u4F75\u4F77\u4F78\u4F79\u4F7A\u4F7D\u4F80\u4F81\u4F82\u4F85\u4F86\u4F87\u4F8A\u4F8C\u4F8E\u4F90\u4F92\u4F93\u4F95\u4F96\u4F98\u4F99\u4F9A\u4F9C\u4F9E\u4F9F\u4FA1\u4FA2\"],\n[\"8240\",\"\u4FA4\u4FAB\u4FAD\u4FB0\",4,\"\u4FB6\",8,\"\u4FC0\u4FC1\u4FC2\u4FC6\u4FC7\u4FC8\u4FC9\u4FCB\u4FCC\u4FCD\u4FD2\",4,\"\u4FD9\u4FDB\u4FE0\u4FE2\u4FE4\u4FE5\u4FE7\u4FEB\u4FEC\u4FF0\u4FF2\u4FF4\u4FF5\u4FF6\u4FF7\u4FF9\u4FFB\u4FFC\u4FFD\u4FFF\",11],\n[\"8280\",\"\u500B\u500E\u5010\u5011\u5013\u5015\u5016\u5017\u501B\u501D\u501E\u5020\u5022\u5023\u5024\u5027\u502B\u502F\",10,\"\u503B\u503D\u503F\u5040\u5041\u5042\u5044\u5045\u5046\u5049\u504A\u504B\u504D\u5050\",4,\"\u5056\u5057\u5058\u5059\u505B\u505D\",7,\"\u5066\",5,\"\u506D\",8,\"\u5078\u5079\u507A\u507C\u507D\u5081\u5082\u5083\u5084\u5086\u5087\u5089\u508A\u508B\u508C\u508E\",20,\"\u50A4\u50A6\u50AA\u50AB\u50AD\",4,\"\u50B3\",6,\"\u50BC\"],\n[\"8340\",\"\u50BD\",17,\"\u50D0\",5,\"\u50D7\u50D8\u50D9\u50DB\",10,\"\u50E8\u50E9\u50EA\u50EB\u50EF\u50F0\u50F1\u50F2\u50F4\u50F6\",4,\"\u50FC\",9,\"\u5108\"],\n[\"8380\",\"\u5109\u510A\u510C\",5,\"\u5113\",13,\"\u5122\",28,\"\u5142\u5147\u514A\u514C\u514E\u514F\u5150\u5152\u5153\u5157\u5158\u5159\u515B\u515D\",4,\"\u5163\u5164\u5166\u5167\u5169\u516A\u516F\u5172\u517A\u517E\u517F\u5183\u5184\u5186\u5187\u518A\u518B\u518E\u518F\u5190\u5191\u5193\u5194\u5198\u519A\u519D\u519E\u519F\u51A1\u51A3\u51A6\",4,\"\u51AD\u51AE\u51B4\u51B8\u51B9\u51BA\u51BE\u51BF\u51C1\u51C2\u51C3\u51C5\u51C8\u51CA\u51CD\u51CE\u51D0\u51D2\",5],\n[\"8440\",\"\u51D8\u51D9\u51DA\u51DC\u51DE\u51DF\u51E2\u51E3\u51E5\",5,\"\u51EC\u51EE\u51F1\u51F2\u51F4\u51F7\u51FE\u5204\u5205\u5209\u520B\u520C\u520F\u5210\u5213\u5214\u5215\u521C\u521E\u521F\u5221\u5222\u5223\u5225\u5226\u5227\u522A\u522C\u522F\u5231\u5232\u5234\u5235\u523C\u523E\u5244\",5,\"\u524B\u524E\u524F\u5252\u5253\u5255\u5257\u5258\"],\n[\"8480\",\"\u5259\u525A\u525B\u525D\u525F\u5260\u5262\u5263\u5264\u5266\u5268\u526B\u526C\u526D\u526E\u5270\u5271\u5273\",9,\"\u527E\u5280\u5283\",4,\"\u5289\",6,\"\u5291\u5292\u5294\",6,\"\u529C\u52A4\u52A5\u52A6\u52A7\u52AE\u52AF\u52B0\u52B4\",9,\"\u52C0\u52C1\u52C2\u52C4\u52C5\u52C6\u52C8\u52CA\u52CC\u52CD\u52CE\u52CF\u52D1\u52D3\u52D4\u52D5\u52D7\u52D9\",5,\"\u52E0\u52E1\u52E2\u52E3\u52E5\",10,\"\u52F1\",7,\"\u52FB\u52FC\u52FD\u5301\u5302\u5303\u5304\u5307\u5309\u530A\u530B\u530C\u530E\"],\n[\"8540\",\"\u5311\u5312\u5313\u5314\u5318\u531B\u531C\u531E\u531F\u5322\u5324\u5325\u5327\u5328\u5329\u532B\u532C\u532D\u532F\",9,\"\u533C\u533D\u5340\u5342\u5344\u5346\u534B\u534C\u534D\u5350\u5354\u5358\u5359\u535B\u535D\u5365\u5368\u536A\u536C\u536D\u5372\u5376\u5379\u537B\u537C\u537D\u537E\u5380\u5381\u5383\u5387\u5388\u538A\u538E\u538F\"],\n[\"8580\",\"\u5390\",4,\"\u5396\u5397\u5399\u539B\u539C\u539E\u53A0\u53A1\u53A4\u53A7\u53AA\u53AB\u53AC\u53AD\u53AF\",6,\"\u53B7\u53B8\u53B9\u53BA\u53BC\u53BD\u53BE\u53C0\u53C3\",4,\"\u53CE\u53CF\u53D0\u53D2\u53D3\u53D5\u53DA\u53DC\u53DD\u53DE\u53E1\u53E2\u53E7\u53F4\u53FA\u53FE\u53FF\u5400\u5402\u5405\u5407\u540B\u5414\u5418\u5419\u541A\u541C\u5422\u5424\u5425\u542A\u5430\u5433\u5436\u5437\u543A\u543D\u543F\u5441\u5442\u5444\u5445\u5447\u5449\u544C\u544D\u544E\u544F\u5451\u545A\u545D\",4,\"\u5463\u5465\u5467\u5469\",7,\"\u5474\u5479\u547A\u547E\u547F\u5481\u5483\u5485\u5487\u5488\u5489\u548A\u548D\u5491\u5493\u5497\u5498\u549C\u549E\u549F\u54A0\u54A1\"],\n[\"8640\",\"\u54A2\u54A5\u54AE\u54B0\u54B2\u54B5\u54B6\u54B7\u54B9\u54BA\u54BC\u54BE\u54C3\u54C5\u54CA\u54CB\u54D6\u54D8\u54DB\u54E0\",4,\"\u54EB\u54EC\u54EF\u54F0\u54F1\u54F4\",5,\"\u54FB\u54FE\u5500\u5502\u5503\u5504\u5505\u5508\u550A\",4,\"\u5512\u5513\u5515\",5,\"\u551C\u551D\u551E\u551F\u5521\u5525\u5526\"],\n[\"8680\",\"\u5528\u5529\u552B\u552D\u5532\u5534\u5535\u5536\u5538\u5539\u553A\u553B\u553D\u5540\u5542\u5545\u5547\u5548\u554B\",4,\"\u5551\u5552\u5553\u5554\u5557\",4,\"\u555D\u555E\u555F\u5560\u5562\u5563\u5568\u5569\u556B\u556F\",5,\"\u5579\u557A\u557D\u557F\u5585\u5586\u558C\u558D\u558E\u5590\u5592\u5593\u5595\u5596\u5597\u559A\u559B\u559E\u55A0\",6,\"\u55A8\",8,\"\u55B2\u55B4\u55B6\u55B8\u55BA\u55BC\u55BF\",4,\"\u55C6\u55C7\u55C8\u55CA\u55CB\u55CE\u55CF\u55D0\u55D5\u55D7\",4,\"\u55DE\u55E0\u55E2\u55E7\u55E9\u55ED\u55EE\u55F0\u55F1\u55F4\u55F6\u55F8\",4,\"\u55FF\u5602\u5603\u5604\u5605\"],\n[\"8740\",\"\u5606\u5607\u560A\u560B\u560D\u5610\",7,\"\u5619\u561A\u561C\u561D\u5620\u5621\u5622\u5625\u5626\u5628\u5629\u562A\u562B\u562E\u562F\u5630\u5633\u5635\u5637\u5638\u563A\u563C\u563D\u563E\u5640\",11,\"\u564F\",4,\"\u5655\u5656\u565A\u565B\u565D\",4],\n[\"8780\",\"\u5663\u5665\u5666\u5667\u566D\u566E\u566F\u5670\u5672\u5673\u5674\u5675\u5677\u5678\u5679\u567A\u567D\",7,\"\u5687\",6,\"\u5690\u5691\u5692\u5694\",14,\"\u56A4\",10,\"\u56B0\",6,\"\u56B8\u56B9\u56BA\u56BB\u56BD\",12,\"\u56CB\",8,\"\u56D5\u56D6\u56D8\u56D9\u56DC\u56E3\u56E5\",5,\"\u56EC\u56EE\u56EF\u56F2\u56F3\u56F6\u56F7\u56F8\u56FB\u56FC\u5700\u5701\u5702\u5705\u5707\u570B\",6],\n[\"8840\",\"\u5712\",9,\"\u571D\u571E\u5720\u5721\u5722\u5724\u5725\u5726\u5727\u572B\u5731\u5732\u5734\",4,\"\u573C\u573D\u573F\u5741\u5743\u5744\u5745\u5746\u5748\u5749\u574B\u5752\",4,\"\u5758\u5759\u5762\u5763\u5765\u5767\u576C\u576E\u5770\u5771\u5772\u5774\u5775\u5778\u5779\u577A\u577D\u577E\u577F\u5780\"],\n[\"8880\",\"\u5781\u5787\u5788\u5789\u578A\u578D\",4,\"\u5794\",6,\"\u579C\u579D\u579E\u579F\u57A5\u57A8\u57AA\u57AC\u57AF\u57B0\u57B1\u57B3\u57B5\u57B6\u57B7\u57B9\",8,\"\u57C4\",6,\"\u57CC\u57CD\u57D0\u57D1\u57D3\u57D6\u57D7\u57DB\u57DC\u57DE\u57E1\u57E2\u57E3\u57E5\",7,\"\u57EE\u57F0\u57F1\u57F2\u57F3\u57F5\u57F6\u57F7\u57FB\u57FC\u57FE\u57FF\u5801\u5803\u5804\u5805\u5808\u5809\u580A\u580C\u580E\u580F\u5810\u5812\u5813\u5814\u5816\u5817\u5818\u581A\u581B\u581C\u581D\u581F\u5822\u5823\u5825\",4,\"\u582B\",4,\"\u5831\u5832\u5833\u5834\u5836\",7],\n[\"8940\",\"\u583E\",5,\"\u5845\",6,\"\u584E\u584F\u5850\u5852\u5853\u5855\u5856\u5857\u5859\",4,\"\u585F\",5,\"\u5866\",4,\"\u586D\",16,\"\u587F\u5882\u5884\u5886\u5887\u5888\u588A\u588B\u588C\"],\n[\"8980\",\"\u588D\",4,\"\u5894\",4,\"\u589B\u589C\u589D\u58A0\",7,\"\u58AA\",17,\"\u58BD\u58BE\u58BF\u58C0\u58C2\u58C3\u58C4\u58C6\",10,\"\u58D2\u58D3\u58D4\u58D6\",13,\"\u58E5\",5,\"\u58ED\u58EF\u58F1\u58F2\u58F4\u58F5\u58F7\u58F8\u58FA\",7,\"\u5903\u5905\u5906\u5908\",4,\"\u590E\u5910\u5911\u5912\u5913\u5917\u5918\u591B\u591D\u591E\u5920\u5921\u5922\u5923\u5926\u5928\u592C\u5930\u5932\u5933\u5935\u5936\u593B\"],\n[\"8a40\",\"\u593D\u593E\u593F\u5940\u5943\u5945\u5946\u594A\u594C\u594D\u5950\u5952\u5953\u5959\u595B\",4,\"\u5961\u5963\u5964\u5966\",12,\"\u5975\u5977\u597A\u597B\u597C\u597E\u597F\u5980\u5985\u5989\u598B\u598C\u598E\u598F\u5990\u5991\u5994\u5995\u5998\u599A\u599B\u599C\u599D\u599F\u59A0\u59A1\u59A2\u59A6\"],\n[\"8a80\",\"\u59A7\u59AC\u59AD\u59B0\u59B1\u59B3\",5,\"\u59BA\u59BC\u59BD\u59BF\",6,\"\u59C7\u59C8\u59C9\u59CC\u59CD\u59CE\u59CF\u59D5\u59D6\u59D9\u59DB\u59DE\",4,\"\u59E4\u59E6\u59E7\u59E9\u59EA\u59EB\u59ED\",11,\"\u59FA\u59FC\u59FD\u59FE\u5A00\u5A02\u5A0A\u5A0B\u5A0D\u5A0E\u5A0F\u5A10\u5A12\u5A14\u5A15\u5A16\u5A17\u5A19\u5A1A\u5A1B\u5A1D\u5A1E\u5A21\u5A22\u5A24\u5A26\u5A27\u5A28\u5A2A\",6,\"\u5A33\u5A35\u5A37\",4,\"\u5A3D\u5A3E\u5A3F\u5A41\",4,\"\u5A47\u5A48\u5A4B\",9,\"\u5A56\u5A57\u5A58\u5A59\u5A5B\",5],\n[\"8b40\",\"\u5A61\u5A63\u5A64\u5A65\u5A66\u5A68\u5A69\u5A6B\",8,\"\u5A78\u5A79\u5A7B\u5A7C\u5A7D\u5A7E\u5A80\",17,\"\u5A93\",6,\"\u5A9C\",13,\"\u5AAB\u5AAC\"],\n[\"8b80\",\"\u5AAD\",4,\"\u5AB4\u5AB6\u5AB7\u5AB9\",4,\"\u5ABF\u5AC0\u5AC3\",5,\"\u5ACA\u5ACB\u5ACD\",4,\"\u5AD3\u5AD5\u5AD7\u5AD9\u5ADA\u5ADB\u5ADD\u5ADE\u5ADF\u5AE2\u5AE4\u5AE5\u5AE7\u5AE8\u5AEA\u5AEC\",4,\"\u5AF2\",22,\"\u5B0A\",11,\"\u5B18\",25,\"\u5B33\u5B35\u5B36\u5B38\",7,\"\u5B41\",6],\n[\"8c40\",\"\u5B48\",7,\"\u5B52\u5B56\u5B5E\u5B60\u5B61\u5B67\u5B68\u5B6B\u5B6D\u5B6E\u5B6F\u5B72\u5B74\u5B76\u5B77\u5B78\u5B79\u5B7B\u5B7C\u5B7E\u5B7F\u5B82\u5B86\u5B8A\u5B8D\u5B8E\u5B90\u5B91\u5B92\u5B94\u5B96\u5B9F\u5BA7\u5BA8\u5BA9\u5BAC\u5BAD\u5BAE\u5BAF\u5BB1\u5BB2\u5BB7\u5BBA\u5BBB\u5BBC\u5BC0\u5BC1\u5BC3\u5BC8\u5BC9\u5BCA\u5BCB\u5BCD\u5BCE\u5BCF\"],\n[\"8c80\",\"\u5BD1\u5BD4\",8,\"\u5BE0\u5BE2\u5BE3\u5BE6\u5BE7\u5BE9\",4,\"\u5BEF\u5BF1\",6,\"\u5BFD\u5BFE\u5C00\u5C02\u5C03\u5C05\u5C07\u5C08\u5C0B\u5C0C\u5C0D\u5C0E\u5C10\u5C12\u5C13\u5C17\u5C19\u5C1B\u5C1E\u5C1F\u5C20\u5C21\u5C23\u5C26\u5C28\u5C29\u5C2A\u5C2B\u5C2D\u5C2E\u5C2F\u5C30\u5C32\u5C33\u5C35\u5C36\u5C37\u5C43\u5C44\u5C46\u5C47\u5C4C\u5C4D\u5C52\u5C53\u5C54\u5C56\u5C57\u5C58\u5C5A\u5C5B\u5C5C\u5C5D\u5C5F\u5C62\u5C64\u5C67\",6,\"\u5C70\u5C72\",6,\"\u5C7B\u5C7C\u5C7D\u5C7E\u5C80\u5C83\",4,\"\u5C89\u5C8A\u5C8B\u5C8E\u5C8F\u5C92\u5C93\u5C95\u5C9D\",4,\"\u5CA4\",4],\n[\"8d40\",\"\u5CAA\u5CAE\u5CAF\u5CB0\u5CB2\u5CB4\u5CB6\u5CB9\u5CBA\u5CBB\u5CBC\u5CBE\u5CC0\u5CC2\u5CC3\u5CC5\",5,\"\u5CCC\",5,\"\u5CD3\",5,\"\u5CDA\",6,\"\u5CE2\u5CE3\u5CE7\u5CE9\u5CEB\u5CEC\u5CEE\u5CEF\u5CF1\",9,\"\u5CFC\",4],\n[\"8d80\",\"\u5D01\u5D04\u5D05\u5D08\",5,\"\u5D0F\",4,\"\u5D15\u5D17\u5D18\u5D19\u5D1A\u5D1C\u5D1D\u5D1F\",4,\"\u5D25\u5D28\u5D2A\u5D2B\u5D2C\u5D2F\",4,\"\u5D35\",7,\"\u5D3F\",7,\"\u5D48\u5D49\u5D4D\",10,\"\u5D59\u5D5A\u5D5C\u5D5E\",10,\"\u5D6A\u5D6D\u5D6E\u5D70\u5D71\u5D72\u5D73\u5D75\",12,\"\u5D83\",21,\"\u5D9A\u5D9B\u5D9C\u5D9E\u5D9F\u5DA0\"],\n[\"8e40\",\"\u5DA1\",21,\"\u5DB8\",12,\"\u5DC6\",6,\"\u5DCE\",12,\"\u5DDC\u5DDF\u5DE0\u5DE3\u5DE4\u5DEA\u5DEC\u5DED\"],\n[\"8e80\",\"\u5DF0\u5DF5\u5DF6\u5DF8\",4,\"\u5DFF\u5E00\u5E04\u5E07\u5E09\u5E0A\u5E0B\u5E0D\u5E0E\u5E12\u5E13\u5E17\u5E1E\",7,\"\u5E28\",4,\"\u5E2F\u5E30\u5E32\",4,\"\u5E39\u5E3A\u5E3E\u5E3F\u5E40\u5E41\u5E43\u5E46\",5,\"\u5E4D\",6,\"\u5E56\",4,\"\u5E5C\u5E5D\u5E5F\u5E60\u5E63\",14,\"\u5E75\u5E77\u5E79\u5E7E\u5E81\u5E82\u5E83\u5E85\u5E88\u5E89\u5E8C\u5E8D\u5E8E\u5E92\u5E98\u5E9B\u5E9D\u5EA1\u5EA2\u5EA3\u5EA4\u5EA8\",4,\"\u5EAE\",4,\"\u5EB4\u5EBA\u5EBB\u5EBC\u5EBD\u5EBF\",6],\n[\"8f40\",\"\u5EC6\u5EC7\u5EC8\u5ECB\",5,\"\u5ED4\u5ED5\u5ED7\u5ED8\u5ED9\u5EDA\u5EDC\",11,\"\u5EE9\u5EEB\",8,\"\u5EF5\u5EF8\u5EF9\u5EFB\u5EFC\u5EFD\u5F05\u5F06\u5F07\u5F09\u5F0C\u5F0D\u5F0E\u5F10\u5F12\u5F14\u5F16\u5F19\u5F1A\u5F1C\u5F1D\u5F1E\u5F21\u5F22\u5F23\u5F24\"],\n[\"8f80\",\"\u5F28\u5F2B\u5F2C\u5F2E\u5F30\u5F32\",6,\"\u5F3B\u5F3D\u5F3E\u5F3F\u5F41\",14,\"\u5F51\u5F54\u5F59\u5F5A\u5F5B\u5F5C\u5F5E\u5F5F\u5F60\u5F63\u5F65\u5F67\u5F68\u5F6B\u5F6E\u5F6F\u5F72\u5F74\u5F75\u5F76\u5F78\u5F7A\u5F7D\u5F7E\u5F7F\u5F83\u5F86\u5F8D\u5F8E\u5F8F\u5F91\u5F93\u5F94\u5F96\u5F9A\u5F9B\u5F9D\u5F9E\u5F9F\u5FA0\u5FA2\",5,\"\u5FA9\u5FAB\u5FAC\u5FAF\",5,\"\u5FB6\u5FB8\u5FB9\u5FBA\u5FBB\u5FBE\",4,\"\u5FC7\u5FC8\u5FCA\u5FCB\u5FCE\u5FD3\u5FD4\u5FD5\u5FDA\u5FDB\u5FDC\u5FDE\u5FDF\u5FE2\u5FE3\u5FE5\u5FE6\u5FE8\u5FE9\u5FEC\u5FEF\u5FF0\u5FF2\u5FF3\u5FF4\u5FF6\u5FF7\u5FF9\u5FFA\u5FFC\u6007\"],\n[\"9040\",\"\u6008\u6009\u600B\u600C\u6010\u6011\u6013\u6017\u6018\u601A\u601E\u601F\u6022\u6023\u6024\u602C\u602D\u602E\u6030\",4,\"\u6036\",4,\"\u603D\u603E\u6040\u6044\",6,\"\u604C\u604E\u604F\u6051\u6053\u6054\u6056\u6057\u6058\u605B\u605C\u605E\u605F\u6060\u6061\u6065\u6066\u606E\u6071\u6072\u6074\u6075\u6077\u607E\u6080\"],\n[\"9080\",\"\u6081\u6082\u6085\u6086\u6087\u6088\u608A\u608B\u608E\u608F\u6090\u6091\u6093\u6095\u6097\u6098\u6099\u609C\u609E\u60A1\u60A2\u60A4\u60A5\u60A7\u60A9\u60AA\u60AE\u60B0\u60B3\u60B5\u60B6\u60B7\u60B9\u60BA\u60BD\",7,\"\u60C7\u60C8\u60C9\u60CC\",4,\"\u60D2\u60D3\u60D4\u60D6\u60D7\u60D9\u60DB\u60DE\u60E1\",4,\"\u60EA\u60F1\u60F2\u60F5\u60F7\u60F8\u60FB\",4,\"\u6102\u6103\u6104\u6105\u6107\u610A\u610B\u610C\u6110\",4,\"\u6116\u6117\u6118\u6119\u611B\u611C\u611D\u611E\u6121\u6122\u6125\u6128\u6129\u612A\u612C\",18,\"\u6140\",6],\n[\"9140\",\"\u6147\u6149\u614B\u614D\u614F\u6150\u6152\u6153\u6154\u6156\",6,\"\u615E\u615F\u6160\u6161\u6163\u6164\u6165\u6166\u6169\",6,\"\u6171\u6172\u6173\u6174\u6176\u6178\",18,\"\u618C\u618D\u618F\",4,\"\u6195\"],\n[\"9180\",\"\u6196\",6,\"\u619E\",8,\"\u61AA\u61AB\u61AD\",9,\"\u61B8\",5,\"\u61BF\u61C0\u61C1\u61C3\",4,\"\u61C9\u61CC\",4,\"\u61D3\u61D5\",16,\"\u61E7\",13,\"\u61F6\",8,\"\u6200\",5,\"\u6207\u6209\u6213\u6214\u6219\u621C\u621D\u621E\u6220\u6223\u6226\u6227\u6228\u6229\u622B\u622D\u622F\u6230\u6231\u6232\u6235\u6236\u6238\",4,\"\u6242\u6244\u6245\u6246\u624A\"],\n[\"9240\",\"\u624F\u6250\u6255\u6256\u6257\u6259\u625A\u625C\",6,\"\u6264\u6265\u6268\u6271\u6272\u6274\u6275\u6277\u6278\u627A\u627B\u627D\u6281\u6282\u6283\u6285\u6286\u6287\u6288\u628B\",5,\"\u6294\u6299\u629C\u629D\u629E\u62A3\u62A6\u62A7\u62A9\u62AA\u62AD\u62AE\u62AF\u62B0\u62B2\u62B3\u62B4\u62B6\u62B7\u62B8\u62BA\u62BE\u62C0\u62C1\"],\n[\"9280\",\"\u62C3\u62CB\u62CF\u62D1\u62D5\u62DD\u62DE\u62E0\u62E1\u62E4\u62EA\u62EB\u62F0\u62F2\u62F5\u62F8\u62F9\u62FA\u62FB\u6300\u6303\u6304\u6305\u6306\u630A\u630B\u630C\u630D\u630F\u6310\u6312\u6313\u6314\u6315\u6317\u6318\u6319\u631C\u6326\u6327\u6329\u632C\u632D\u632E\u6330\u6331\u6333\",5,\"\u633B\u633C\u633E\u633F\u6340\u6341\u6344\u6347\u6348\u634A\u6351\u6352\u6353\u6354\u6356\",7,\"\u6360\u6364\u6365\u6366\u6368\u636A\u636B\u636C\u636F\u6370\u6372\u6373\u6374\u6375\u6378\u6379\u637C\u637D\u637E\u637F\u6381\u6383\u6384\u6385\u6386\u638B\u638D\u6391\u6393\u6394\u6395\u6397\u6399\",6,\"\u63A1\u63A4\u63A6\u63AB\u63AF\u63B1\u63B2\u63B5\u63B6\u63B9\u63BB\u63BD\u63BF\u63C0\"],\n[\"9340\",\"\u63C1\u63C2\u63C3\u63C5\u63C7\u63C8\u63CA\u63CB\u63CC\u63D1\u63D3\u63D4\u63D5\u63D7\",6,\"\u63DF\u63E2\u63E4\",4,\"\u63EB\u63EC\u63EE\u63EF\u63F0\u63F1\u63F3\u63F5\u63F7\u63F9\u63FA\u63FB\u63FC\u63FE\u6403\u6404\u6406\",4,\"\u640D\u640E\u6411\u6412\u6415\",5,\"\u641D\u641F\u6422\u6423\u6424\"],\n[\"9380\",\"\u6425\u6427\u6428\u6429\u642B\u642E\",5,\"\u6435\",4,\"\u643B\u643C\u643E\u6440\u6442\u6443\u6449\u644B\",6,\"\u6453\u6455\u6456\u6457\u6459\",4,\"\u645F\",7,\"\u6468\u646A\u646B\u646C\u646E\",9,\"\u647B\",6,\"\u6483\u6486\u6488\",8,\"\u6493\u6494\u6497\u6498\u649A\u649B\u649C\u649D\u649F\",4,\"\u64A5\u64A6\u64A7\u64A8\u64AA\u64AB\u64AF\u64B1\u64B2\u64B3\u64B4\u64B6\u64B9\u64BB\u64BD\u64BE\u64BF\u64C1\u64C3\u64C4\u64C6\",6,\"\u64CF\u64D1\u64D3\u64D4\u64D5\u64D6\u64D9\u64DA\"],\n[\"9440\",\"\u64DB\u64DC\u64DD\u64DF\u64E0\u64E1\u64E3\u64E5\u64E7\",24,\"\u6501\",7,\"\u650A\",7,\"\u6513\",4,\"\u6519\",8],\n[\"9480\",\"\u6522\u6523\u6524\u6526\",4,\"\u652C\u652D\u6530\u6531\u6532\u6533\u6537\u653A\u653C\u653D\u6540\",4,\"\u6546\u6547\u654A\u654B\u654D\u654E\u6550\u6552\u6553\u6554\u6557\u6558\u655A\u655C\u655F\u6560\u6561\u6564\u6565\u6567\u6568\u6569\u656A\u656D\u656E\u656F\u6571\u6573\u6575\u6576\u6578\",14,\"\u6588\u6589\u658A\u658D\u658E\u658F\u6592\u6594\u6595\u6596\u6598\u659A\u659D\u659E\u65A0\u65A2\u65A3\u65A6\u65A8\u65AA\u65AC\u65AE\u65B1\",7,\"\u65BA\u65BB\u65BE\u65BF\u65C0\u65C2\u65C7\u65C8\u65C9\u65CA\u65CD\u65D0\u65D1\u65D3\u65D4\u65D5\u65D8\",7,\"\u65E1\u65E3\u65E4\u65EA\u65EB\"],\n[\"9540\",\"\u65F2\u65F3\u65F4\u65F5\u65F8\u65F9\u65FB\",4,\"\u6601\u6604\u6605\u6607\u6608\u6609\u660B\u660D\u6610\u6611\u6612\u6616\u6617\u6618\u661A\u661B\u661C\u661E\u6621\u6622\u6623\u6624\u6626\u6629\u662A\u662B\u662C\u662E\u6630\u6632\u6633\u6637\",4,\"\u663D\u663F\u6640\u6642\u6644\",6,\"\u664D\u664E\u6650\u6651\u6658\"],\n[\"9580\",\"\u6659\u665B\u665C\u665D\u665E\u6660\u6662\u6663\u6665\u6667\u6669\",4,\"\u6671\u6672\u6673\u6675\u6678\u6679\u667B\u667C\u667D\u667F\u6680\u6681\u6683\u6685\u6686\u6688\u6689\u668A\u668B\u668D\u668E\u668F\u6690\u6692\u6693\u6694\u6695\u6698\",4,\"\u669E\",8,\"\u66A9\",4,\"\u66AF\",4,\"\u66B5\u66B6\u66B7\u66B8\u66BA\u66BB\u66BC\u66BD\u66BF\",25,\"\u66DA\u66DE\",7,\"\u66E7\u66E8\u66EA\",5,\"\u66F1\u66F5\u66F6\u66F8\u66FA\u66FB\u66FD\u6701\u6702\u6703\"],\n[\"9640\",\"\u6704\u6705\u6706\u6707\u670C\u670E\u670F\u6711\u6712\u6713\u6716\u6718\u6719\u671A\u671C\u671E\u6720\",5,\"\u6727\u6729\u672E\u6730\u6732\u6733\u6736\u6737\u6738\u6739\u673B\u673C\u673E\u673F\u6741\u6744\u6745\u6747\u674A\u674B\u674D\u6752\u6754\u6755\u6757\",4,\"\u675D\u6762\u6763\u6764\u6766\u6767\u676B\u676C\u676E\u6771\u6774\u6776\"],\n[\"9680\",\"\u6778\u6779\u677A\u677B\u677D\u6780\u6782\u6783\u6785\u6786\u6788\u678A\u678C\u678D\u678E\u678F\u6791\u6792\u6793\u6794\u6796\u6799\u679B\u679F\u67A0\u67A1\u67A4\u67A6\u67A9\u67AC\u67AE\u67B1\u67B2\u67B4\u67B9\",7,\"\u67C2\u67C5\",9,\"\u67D5\u67D6\u67D7\u67DB\u67DF\u67E1\u67E3\u67E4\u67E6\u67E7\u67E8\u67EA\u67EB\u67ED\u67EE\u67F2\u67F5\",7,\"\u67FE\u6801\u6802\u6803\u6804\u6806\u680D\u6810\u6812\u6814\u6815\u6818\",4,\"\u681E\u681F\u6820\u6822\",6,\"\u682B\",6,\"\u6834\u6835\u6836\u683A\u683B\u683F\u6847\u684B\u684D\u684F\u6852\u6856\",5],\n[\"9740\",\"\u685C\u685D\u685E\u685F\u686A\u686C\",7,\"\u6875\u6878\",8,\"\u6882\u6884\u6887\",7,\"\u6890\u6891\u6892\u6894\u6895\u6896\u6898\",9,\"\u68A3\u68A4\u68A5\u68A9\u68AA\u68AB\u68AC\u68AE\u68B1\u68B2\u68B4\u68B6\u68B7\u68B8\"],\n[\"9780\",\"\u68B9\",6,\"\u68C1\u68C3\",5,\"\u68CA\u68CC\u68CE\u68CF\u68D0\u68D1\u68D3\u68D4\u68D6\u68D7\u68D9\u68DB\",4,\"\u68E1\u68E2\u68E4\",9,\"\u68EF\u68F2\u68F3\u68F4\u68F6\u68F7\u68F8\u68FB\u68FD\u68FE\u68FF\u6900\u6902\u6903\u6904\u6906\",4,\"\u690C\u690F\u6911\u6913\",11,\"\u6921\u6922\u6923\u6925\",7,\"\u692E\u692F\u6931\u6932\u6933\u6935\u6936\u6937\u6938\u693A\u693B\u693C\u693E\u6940\u6941\u6943\",16,\"\u6955\u6956\u6958\u6959\u695B\u695C\u695F\"],\n[\"9840\",\"\u6961\u6962\u6964\u6965\u6967\u6968\u6969\u696A\u696C\u696D\u696F\u6970\u6972\",4,\"\u697A\u697B\u697D\u697E\u697F\u6981\u6983\u6985\u698A\u698B\u698C\u698E\",5,\"\u6996\u6997\u6999\u699A\u699D\",9,\"\u69A9\u69AA\u69AC\u69AE\u69AF\u69B0\u69B2\u69B3\u69B5\u69B6\u69B8\u69B9\u69BA\u69BC\u69BD\"],\n[\"9880\",\"\u69BE\u69BF\u69C0\u69C2\",7,\"\u69CB\u69CD\u69CF\u69D1\u69D2\u69D3\u69D5\",5,\"\u69DC\u69DD\u69DE\u69E1\",11,\"\u69EE\u69EF\u69F0\u69F1\u69F3\",9,\"\u69FE\u6A00\",9,\"\u6A0B\",11,\"\u6A19\",5,\"\u6A20\u6A22\",5,\"\u6A29\u6A2B\u6A2C\u6A2D\u6A2E\u6A30\u6A32\u6A33\u6A34\u6A36\",6,\"\u6A3F\",4,\"\u6A45\u6A46\u6A48\",7,\"\u6A51\",6,\"\u6A5A\"],\n[\"9940\",\"\u6A5C\",4,\"\u6A62\u6A63\u6A64\u6A66\",10,\"\u6A72\",6,\"\u6A7A\u6A7B\u6A7D\u6A7E\u6A7F\u6A81\u6A82\u6A83\u6A85\",8,\"\u6A8F\u6A92\",4,\"\u6A98\",7,\"\u6AA1\",5],\n[\"9980\",\"\u6AA7\u6AA8\u6AAA\u6AAD\",114,\"\u6B25\u6B26\u6B28\",6],\n[\"9a40\",\"\u6B2F\u6B30\u6B31\u6B33\u6B34\u6B35\u6B36\u6B38\u6B3B\u6B3C\u6B3D\u6B3F\u6B40\u6B41\u6B42\u6B44\u6B45\u6B48\u6B4A\u6B4B\u6B4D\",11,\"\u6B5A\",7,\"\u6B68\u6B69\u6B6B\",13,\"\u6B7A\u6B7D\u6B7E\u6B7F\u6B80\u6B85\u6B88\"],\n[\"9a80\",\"\u6B8C\u6B8E\u6B8F\u6B90\u6B91\u6B94\u6B95\u6B97\u6B98\u6B99\u6B9C\",4,\"\u6BA2\",7,\"\u6BAB\",7,\"\u6BB6\u6BB8\",6,\"\u6BC0\u6BC3\u6BC4\u6BC6\",4,\"\u6BCC\u6BCE\u6BD0\u6BD1\u6BD8\u6BDA\u6BDC\",4,\"\u6BE2\",7,\"\u6BEC\u6BED\u6BEE\u6BF0\u6BF1\u6BF2\u6BF4\u6BF6\u6BF7\u6BF8\u6BFA\u6BFB\u6BFC\u6BFE\",6,\"\u6C08\",4,\"\u6C0E\u6C12\u6C17\u6C1C\u6C1D\u6C1E\u6C20\u6C23\u6C25\u6C2B\u6C2C\u6C2D\u6C31\u6C33\u6C36\u6C37\u6C39\u6C3A\u6C3B\u6C3C\u6C3E\u6C3F\u6C43\u6C44\u6C45\u6C48\u6C4B\",4,\"\u6C51\u6C52\u6C53\u6C56\u6C58\"],\n[\"9b40\",\"\u6C59\u6C5A\u6C62\u6C63\u6C65\u6C66\u6C67\u6C6B\",4,\"\u6C71\u6C73\u6C75\u6C77\u6C78\u6C7A\u6C7B\u6C7C\u6C7F\u6C80\u6C84\u6C87\u6C8A\u6C8B\u6C8D\u6C8E\u6C91\u6C92\u6C95\u6C96\u6C97\u6C98\u6C9A\u6C9C\u6C9D\u6C9E\u6CA0\u6CA2\u6CA8\u6CAC\u6CAF\u6CB0\u6CB4\u6CB5\u6CB6\u6CB7\u6CBA\u6CC0\u6CC1\u6CC2\u6CC3\u6CC6\u6CC7\u6CC8\u6CCB\u6CCD\u6CCE\u6CCF\u6CD1\u6CD2\u6CD8\"],\n[\"9b80\",\"\u6CD9\u6CDA\u6CDC\u6CDD\u6CDF\u6CE4\u6CE6\u6CE7\u6CE9\u6CEC\u6CED\u6CF2\u6CF4\u6CF9\u6CFF\u6D00\u6D02\u6D03\u6D05\u6D06\u6D08\u6D09\u6D0A\u6D0D\u6D0F\u6D10\u6D11\u6D13\u6D14\u6D15\u6D16\u6D18\u6D1C\u6D1D\u6D1F\",5,\"\u6D26\u6D28\u6D29\u6D2C\u6D2D\u6D2F\u6D30\u6D34\u6D36\u6D37\u6D38\u6D3A\u6D3F\u6D40\u6D42\u6D44\u6D49\u6D4C\u6D50\u6D55\u6D56\u6D57\u6D58\u6D5B\u6D5D\u6D5F\u6D61\u6D62\u6D64\u6D65\u6D67\u6D68\u6D6B\u6D6C\u6D6D\u6D70\u6D71\u6D72\u6D73\u6D75\u6D76\u6D79\u6D7A\u6D7B\u6D7D\",4,\"\u6D83\u6D84\u6D86\u6D87\u6D8A\u6D8B\u6D8D\u6D8F\u6D90\u6D92\u6D96\",4,\"\u6D9C\u6DA2\u6DA5\u6DAC\u6DAD\u6DB0\u6DB1\u6DB3\u6DB4\u6DB6\u6DB7\u6DB9\",5,\"\u6DC1\u6DC2\u6DC3\u6DC8\u6DC9\u6DCA\"],\n[\"9c40\",\"\u6DCD\u6DCE\u6DCF\u6DD0\u6DD2\u6DD3\u6DD4\u6DD5\u6DD7\u6DDA\u6DDB\u6DDC\u6DDF\u6DE2\u6DE3\u6DE5\u6DE7\u6DE8\u6DE9\u6DEA\u6DED\u6DEF\u6DF0\u6DF2\u6DF4\u6DF5\u6DF6\u6DF8\u6DFA\u6DFD\",7,\"\u6E06\u6E07\u6E08\u6E09\u6E0B\u6E0F\u6E12\u6E13\u6E15\u6E18\u6E19\u6E1B\u6E1C\u6E1E\u6E1F\u6E22\u6E26\u6E27\u6E28\u6E2A\u6E2C\u6E2E\u6E30\u6E31\u6E33\u6E35\"],\n[\"9c80\",\"\u6E36\u6E37\u6E39\u6E3B\",7,\"\u6E45\",7,\"\u6E4F\u6E50\u6E51\u6E52\u6E55\u6E57\u6E59\u6E5A\u6E5C\u6E5D\u6E5E\u6E60\",10,\"\u6E6C\u6E6D\u6E6F\",14,\"\u6E80\u6E81\u6E82\u6E84\u6E87\u6E88\u6E8A\",4,\"\u6E91\",6,\"\u6E99\u6E9A\u6E9B\u6E9D\u6E9E\u6EA0\u6EA1\u6EA3\u6EA4\u6EA6\u6EA8\u6EA9\u6EAB\u6EAC\u6EAD\u6EAE\u6EB0\u6EB3\u6EB5\u6EB8\u6EB9\u6EBC\u6EBE\u6EBF\u6EC0\u6EC3\u6EC4\u6EC5\u6EC6\u6EC8\u6EC9\u6ECA\u6ECC\u6ECD\u6ECE\u6ED0\u6ED2\u6ED6\u6ED8\u6ED9\u6EDB\u6EDC\u6EDD\u6EE3\u6EE7\u6EEA\",5],\n[\"9d40\",\"\u6EF0\u6EF1\u6EF2\u6EF3\u6EF5\u6EF6\u6EF7\u6EF8\u6EFA\",7,\"\u6F03\u6F04\u6F05\u6F07\u6F08\u6F0A\",4,\"\u6F10\u6F11\u6F12\u6F16\",9,\"\u6F21\u6F22\u6F23\u6F25\u6F26\u6F27\u6F28\u6F2C\u6F2E\u6F30\u6F32\u6F34\u6F35\u6F37\",6,\"\u6F3F\u6F40\u6F41\u6F42\"],\n[\"9d80\",\"\u6F43\u6F44\u6F45\u6F48\u6F49\u6F4A\u6F4C\u6F4E\",9,\"\u6F59\u6F5A\u6F5B\u6F5D\u6F5F\u6F60\u6F61\u6F63\u6F64\u6F65\u6F67\",5,\"\u6F6F\u6F70\u6F71\u6F73\u6F75\u6F76\u6F77\u6F79\u6F7B\u6F7D\",6,\"\u6F85\u6F86\u6F87\u6F8A\u6F8B\u6F8F\",12,\"\u6F9D\u6F9E\u6F9F\u6FA0\u6FA2\",4,\"\u6FA8\",10,\"\u6FB4\u6FB5\u6FB7\u6FB8\u6FBA\",5,\"\u6FC1\u6FC3\",5,\"\u6FCA\",6,\"\u6FD3\",10,\"\u6FDF\u6FE2\u6FE3\u6FE4\u6FE5\"],\n[\"9e40\",\"\u6FE6\",7,\"\u6FF0\",32,\"\u7012\",7,\"\u701C\",6,\"\u7024\",6],\n[\"9e80\",\"\u702B\",9,\"\u7036\u7037\u7038\u703A\",17,\"\u704D\u704E\u7050\",13,\"\u705F\",11,\"\u706E\u7071\u7072\u7073\u7074\u7077\u7079\u707A\u707B\u707D\u7081\u7082\u7083\u7084\u7086\u7087\u7088\u708B\u708C\u708D\u708F\u7090\u7091\u7093\u7097\u7098\u709A\u709B\u709E\",12,\"\u70B0\u70B2\u70B4\u70B5\u70B6\u70BA\u70BE\u70BF\u70C4\u70C5\u70C6\u70C7\u70C9\u70CB\",12,\"\u70DA\"],\n[\"9f40\",\"\u70DC\u70DD\u70DE\u70E0\u70E1\u70E2\u70E3\u70E5\u70EA\u70EE\u70F0\",6,\"\u70F8\u70FA\u70FB\u70FC\u70FE\",10,\"\u710B\",4,\"\u7111\u7112\u7114\u7117\u711B\",10,\"\u7127\",7,\"\u7132\u7133\u7134\"],\n[\"9f80\",\"\u7135\u7137\",13,\"\u7146\u7147\u7148\u7149\u714B\u714D\u714F\",12,\"\u715D\u715F\",4,\"\u7165\u7169\",4,\"\u716F\u7170\u7171\u7174\u7175\u7176\u7177\u7179\u717B\u717C\u717E\",5,\"\u7185\",4,\"\u718B\u718C\u718D\u718E\u7190\u7191\u7192\u7193\u7195\u7196\u7197\u719A\",4,\"\u71A1\",6,\"\u71A9\u71AA\u71AB\u71AD\",5,\"\u71B4\u71B6\u71B7\u71B8\u71BA\",8,\"\u71C4\",9,\"\u71CF\",4],\n[\"a040\",\"\u71D6\",9,\"\u71E1\u71E2\u71E3\u71E4\u71E6\u71E8\",5,\"\u71EF\",9,\"\u71FA\",11,\"\u7207\",19],\n[\"a080\",\"\u721B\u721C\u721E\",9,\"\u7229\u722B\u722D\u722E\u722F\u7232\u7233\u7234\u723A\u723C\u723E\u7240\",6,\"\u7249\u724A\u724B\u724E\u724F\u7250\u7251\u7253\u7254\u7255\u7257\u7258\u725A\u725C\u725E\u7260\u7263\u7264\u7265\u7268\u726A\u726B\u726C\u726D\u7270\u7271\u7273\u7274\u7276\u7277\u7278\u727B\u727C\u727D\u7282\u7283\u7285\",4,\"\u728C\u728E\u7290\u7291\u7293\",11,\"\u72A0\",11,\"\u72AE\u72B1\u72B2\u72B3\u72B5\u72BA\",6,\"\u72C5\u72C6\u72C7\u72C9\u72CA\u72CB\u72CC\u72CF\u72D1\u72D3\u72D4\u72D5\u72D6\u72D8\u72DA\u72DB\"],\n[\"a1a1\",\"\u3000\u3001\u3002\u00B7\u02C9\u02C7\u00A8\u3003\u3005\u2014\uFF5E\u2016\u2026\u2018\u2019\u201C\u201D\u3014\u3015\u3008\",7,\"\u3016\u3017\u3010\u3011\u00B1\u00D7\u00F7\u2236\u2227\u2228\u2211\u220F\u222A\u2229\u2208\u2237\u221A\u22A5\u2225\u2220\u2312\u2299\u222B\u222E\u2261\u224C\u2248\u223D\u221D\u2260\u226E\u226F\u2264\u2265\u221E\u2235\u2234\u2642\u2640\u00B0\u2032\u2033\u2103\uFF04\u00A4\uFFE0\uFFE1\u2030\u00A7\u2116\u2606\u2605\u25CB\u25CF\u25CE\u25C7\u25C6\u25A1\u25A0\u25B3\u25B2\u203B\u2192\u2190\u2191\u2193\u3013\"],\n[\"a2a1\",\"\u2170\",9],\n[\"a2b1\",\"\u2488\",19,\"\u2474\",19,\"\u2460\",9],\n[\"a2e5\",\"\u3220\",9],\n[\"a2f1\",\"\u2160\",11],\n[\"a3a1\",\"\uFF01\uFF02\uFF03\uFFE5\uFF05\",88,\"\uFFE3\"],\n[\"a4a1\",\"\u3041\",82],\n[\"a5a1\",\"\u30A1\",85],\n[\"a6a1\",\"\u0391\",16,\"\u03A3\",6],\n[\"a6c1\",\"\u03B1\",16,\"\u03C3\",6],\n[\"a6e0\",\"\uFE35\uFE36\uFE39\uFE3A\uFE3F\uFE40\uFE3D\uFE3E\uFE41\uFE42\uFE43\uFE44\"],\n[\"a6ee\",\"\uFE3B\uFE3C\uFE37\uFE38\uFE31\"],\n[\"a6f4\",\"\uFE33\uFE34\"],\n[\"a7a1\",\"\u0410\",5,\"\u0401\u0416\",25],\n[\"a7d1\",\"\u0430\",5,\"\u0451\u0436\",25],\n[\"a840\",\"\u02CA\u02CB\u02D9\u2013\u2015\u2025\u2035\u2105\u2109\u2196\u2197\u2198\u2199\u2215\u221F\u2223\u2252\u2266\u2267\u22BF\u2550\",35,\"\u2581\",6],\n[\"a880\",\"\u2588\",7,\"\u2593\u2594\u2595\u25BC\u25BD\u25E2\u25E3\u25E4\u25E5\u2609\u2295\u3012\u301D\u301E\"],\n[\"a8a1\",\"\u0101\u00E1\u01CE\u00E0\u0113\u00E9\u011B\u00E8\u012B\u00ED\u01D0\u00EC\u014D\u00F3\u01D2\u00F2\u016B\u00FA\u01D4\u00F9\u01D6\u01D8\u01DA\u01DC\u00FC\u00EA\u0251\"],\n[\"a8bd\",\"\u0144\u0148\"],\n[\"a8c0\",\"\u0261\"],\n[\"a8c5\",\"\u3105\",36],\n[\"a940\",\"\u3021\",8,\"\u32A3\u338E\u338F\u339C\u339D\u339E\u33A1\u33C4\u33CE\u33D1\u33D2\u33D5\uFE30\uFFE2\uFFE4\"],\n[\"a959\",\"\u2121\u3231\"],\n[\"a95c\",\"\u2010\"],\n[\"a960\",\"\u30FC\u309B\u309C\u30FD\u30FE\u3006\u309D\u309E\uFE49\",9,\"\uFE54\uFE55\uFE56\uFE57\uFE59\",8],\n[\"a980\",\"\uFE62\",4,\"\uFE68\uFE69\uFE6A\uFE6B\"],\n[\"a996\",\"\u3007\"],\n[\"a9a4\",\"\u2500\",75],\n[\"aa40\",\"\u72DC\u72DD\u72DF\u72E2\",5,\"\u72EA\u72EB\u72F5\u72F6\u72F9\u72FD\u72FE\u72FF\u7300\u7302\u7304\",5,\"\u730B\u730C\u730D\u730F\u7310\u7311\u7312\u7314\u7318\u7319\u731A\u731F\u7320\u7323\u7324\u7326\u7327\u7328\u732D\u732F\u7330\u7332\u7333\u7335\u7336\u733A\u733B\u733C\u733D\u7340\",8],\n[\"aa80\",\"\u7349\u734A\u734B\u734C\u734E\u734F\u7351\u7353\u7354\u7355\u7356\u7358\",7,\"\u7361\",10,\"\u736E\u7370\u7371\"],\n[\"ab40\",\"\u7372\",11,\"\u737F\",4,\"\u7385\u7386\u7388\u738A\u738C\u738D\u738F\u7390\u7392\u7393\u7394\u7395\u7397\u7398\u7399\u739A\u739C\u739D\u739E\u73A0\u73A1\u73A3\",5,\"\u73AA\u73AC\u73AD\u73B1\u73B4\u73B5\u73B6\u73B8\u73B9\u73BC\u73BD\u73BE\u73BF\u73C1\u73C3\",4],\n[\"ab80\",\"\u73CB\u73CC\u73CE\u73D2\",6,\"\u73DA\u73DB\u73DC\u73DD\u73DF\u73E1\u73E2\u73E3\u73E4\u73E6\u73E8\u73EA\u73EB\u73EC\u73EE\u73EF\u73F0\u73F1\u73F3\",4],\n[\"ac40\",\"\u73F8\",10,\"\u7404\u7407\u7408\u740B\u740C\u740D\u740E\u7411\",8,\"\u741C\",5,\"\u7423\u7424\u7427\u7429\u742B\u742D\u742F\u7431\u7432\u7437\",4,\"\u743D\u743E\u743F\u7440\u7442\",11],\n[\"ac80\",\"\u744E\",6,\"\u7456\u7458\u745D\u7460\",12,\"\u746E\u746F\u7471\",4,\"\u7478\u7479\u747A\"],\n[\"ad40\",\"\u747B\u747C\u747D\u747F\u7482\u7484\u7485\u7486\u7488\u7489\u748A\u748C\u748D\u748F\u7491\",10,\"\u749D\u749F\",7,\"\u74AA\",15,\"\u74BB\",12],\n[\"ad80\",\"\u74C8\",9,\"\u74D3\",8,\"\u74DD\u74DF\u74E1\u74E5\u74E7\",6,\"\u74F0\u74F1\u74F2\"],\n[\"ae40\",\"\u74F3\u74F5\u74F8\",6,\"\u7500\u7501\u7502\u7503\u7505\",7,\"\u750E\u7510\u7512\u7514\u7515\u7516\u7517\u751B\u751D\u751E\u7520\",4,\"\u7526\u7527\u752A\u752E\u7534\u7536\u7539\u753C\u753D\u753F\u7541\u7542\u7543\u7544\u7546\u7547\u7549\u754A\u754D\u7550\u7551\u7552\u7553\u7555\u7556\u7557\u7558\"],\n[\"ae80\",\"\u755D\",7,\"\u7567\u7568\u7569\u756B\",6,\"\u7573\u7575\u7576\u7577\u757A\",4,\"\u7580\u7581\u7582\u7584\u7585\u7587\"],\n[\"af40\",\"\u7588\u7589\u758A\u758C\u758D\u758E\u7590\u7593\u7595\u7598\u759B\u759C\u759E\u75A2\u75A6\",4,\"\u75AD\u75B6\u75B7\u75BA\u75BB\u75BF\u75C0\u75C1\u75C6\u75CB\u75CC\u75CE\u75CF\u75D0\u75D1\u75D3\u75D7\u75D9\u75DA\u75DC\u75DD\u75DF\u75E0\u75E1\u75E5\u75E9\u75EC\u75ED\u75EE\u75EF\u75F2\u75F3\u75F5\u75F6\u75F7\u75F8\u75FA\u75FB\u75FD\u75FE\u7602\u7604\u7606\u7607\"],\n[\"af80\",\"\u7608\u7609\u760B\u760D\u760E\u760F\u7611\u7612\u7613\u7614\u7616\u761A\u761C\u761D\u761E\u7621\u7623\u7627\u7628\u762C\u762E\u762F\u7631\u7632\u7636\u7637\u7639\u763A\u763B\u763D\u7641\u7642\u7644\"],\n[\"b040\",\"\u7645\",6,\"\u764E\",5,\"\u7655\u7657\",4,\"\u765D\u765F\u7660\u7661\u7662\u7664\",6,\"\u766C\u766D\u766E\u7670\",7,\"\u7679\u767A\u767C\u767F\u7680\u7681\u7683\u7685\u7689\u768A\u768C\u768D\u768F\u7690\u7692\u7694\u7695\u7697\u7698\u769A\u769B\"],\n[\"b080\",\"\u769C\",7,\"\u76A5\",8,\"\u76AF\u76B0\u76B3\u76B5\",9,\"\u76C0\u76C1\u76C3\u554A\u963F\u57C3\u6328\u54CE\u5509\u54C0\u7691\u764C\u853C\u77EE\u827E\u788D\u7231\u9698\u978D\u6C28\u5B89\u4FFA\u6309\u6697\u5CB8\u80FA\u6848\u80AE\u6602\u76CE\u51F9\u6556\u71AC\u7FF1\u8884\u50B2\u5965\u61CA\u6FB3\u82AD\u634C\u6252\u53ED\u5427\u7B06\u516B\u75A4\u5DF4\u62D4\u8DCB\u9776\u628A\u8019\u575D\u9738\u7F62\u7238\u767D\u67CF\u767E\u6446\u4F70\u8D25\u62DC\u7A17\u6591\u73ED\u642C\u6273\u822C\u9881\u677F\u7248\u626E\u62CC\u4F34\u74E3\u534A\u529E\u7ECA\u90A6\u5E2E\u6886\u699C\u8180\u7ED1\u68D2\u78C5\u868C\u9551\u508D\u8C24\u82DE\u80DE\u5305\u8912\u5265\"],\n[\"b140\",\"\u76C4\u76C7\u76C9\u76CB\u76CC\u76D3\u76D5\u76D9\u76DA\u76DC\u76DD\u76DE\u76E0\",4,\"\u76E6\",7,\"\u76F0\u76F3\u76F5\u76F6\u76F7\u76FA\u76FB\u76FD\u76FF\u7700\u7702\u7703\u7705\u7706\u770A\u770C\u770E\",10,\"\u771B\u771C\u771D\u771E\u7721\u7723\u7724\u7725\u7727\u772A\u772B\"],\n[\"b180\",\"\u772C\u772E\u7730\",4,\"\u7739\u773B\u773D\u773E\u773F\u7742\u7744\u7745\u7746\u7748\",7,\"\u7752\",7,\"\u775C\u8584\u96F9\u4FDD\u5821\u9971\u5B9D\u62B1\u62A5\u66B4\u8C79\u9C8D\u7206\u676F\u7891\u60B2\u5351\u5317\u8F88\u80CC\u8D1D\u94A1\u500D\u72C8\u5907\u60EB\u7119\u88AB\u5954\u82EF\u672C\u7B28\u5D29\u7EF7\u752D\u6CF5\u8E66\u8FF8\u903C\u9F3B\u6BD4\u9119\u7B14\u5F7C\u78A7\u84D6\u853D\u6BD5\u6BD9\u6BD6\u5E01\u5E87\u75F9\u95ED\u655D\u5F0A\u5FC5\u8F9F\u58C1\u81C2\u907F\u965B\u97AD\u8FB9\u7F16\u8D2C\u6241\u4FBF\u53D8\u535E\u8FA8\u8FA9\u8FAB\u904D\u6807\u5F6A\u8198\u8868\u9CD6\u618B\u522B\u762A\u5F6C\u658C\u6FD2\u6EE8\u5BBE\u6448\u5175\u51B0\u67C4\u4E19\u79C9\u997C\u70B3\"],\n[\"b240\",\"\u775D\u775E\u775F\u7760\u7764\u7767\u7769\u776A\u776D\",11,\"\u777A\u777B\u777C\u7781\u7782\u7783\u7786\",5,\"\u778F\u7790\u7793\",11,\"\u77A1\u77A3\u77A4\u77A6\u77A8\u77AB\u77AD\u77AE\u77AF\u77B1\u77B2\u77B4\u77B6\",4],\n[\"b280\",\"\u77BC\u77BE\u77C0\",12,\"\u77CE\",8,\"\u77D8\u77D9\u77DA\u77DD\",4,\"\u77E4\u75C5\u5E76\u73BB\u83E0\u64AD\u62E8\u94B5\u6CE2\u535A\u52C3\u640F\u94C2\u7B94\u4F2F\u5E1B\u8236\u8116\u818A\u6E24\u6CCA\u9A73\u6355\u535C\u54FA\u8865\u57E0\u4E0D\u5E03\u6B65\u7C3F\u90E8\u6016\u64E6\u731C\u88C1\u6750\u624D\u8D22\u776C\u8E29\u91C7\u5F69\u83DC\u8521\u9910\u53C2\u8695\u6B8B\u60ED\u60E8\u707F\u82CD\u8231\u4ED3\u6CA7\u85CF\u64CD\u7CD9\u69FD\u66F9\u8349\u5395\u7B56\u4FA7\u518C\u6D4B\u5C42\u8E6D\u63D2\u53C9\u832C\u8336\u67E5\u78B4\u643D\u5BDF\u5C94\u5DEE\u8BE7\u62C6\u67F4\u8C7A\u6400\u63BA\u8749\u998B\u8C17\u7F20\u94F2\u4EA7\u9610\u98A4\u660C\u7316\"],\n[\"b340\",\"\u77E6\u77E8\u77EA\u77EF\u77F0\u77F1\u77F2\u77F4\u77F5\u77F7\u77F9\u77FA\u77FB\u77FC\u7803\",5,\"\u780A\u780B\u780E\u780F\u7810\u7813\u7815\u7819\u781B\u781E\u7820\u7821\u7822\u7824\u7828\u782A\u782B\u782E\u782F\u7831\u7832\u7833\u7835\u7836\u783D\u783F\u7841\u7842\u7843\u7844\u7846\u7848\u7849\u784A\u784B\u784D\u784F\u7851\u7853\u7854\u7858\u7859\u785A\"],\n[\"b380\",\"\u785B\u785C\u785E\",11,\"\u786F\",7,\"\u7878\u7879\u787A\u787B\u787D\",6,\"\u573A\u5C1D\u5E38\u957F\u507F\u80A0\u5382\u655E\u7545\u5531\u5021\u8D85\u6284\u949E\u671D\u5632\u6F6E\u5DE2\u5435\u7092\u8F66\u626F\u64A4\u63A3\u5F7B\u6F88\u90F4\u81E3\u8FB0\u5C18\u6668\u5FF1\u6C89\u9648\u8D81\u886C\u6491\u79F0\u57CE\u6A59\u6210\u5448\u4E58\u7A0B\u60E9\u6F84\u8BDA\u627F\u901E\u9A8B\u79E4\u5403\u75F4\u6301\u5319\u6C60\u8FDF\u5F1B\u9A70\u803B\u9F7F\u4F88\u5C3A\u8D64\u7FC5\u65A5\u70BD\u5145\u51B2\u866B\u5D07\u5BA0\u62BD\u916C\u7574\u8E0C\u7A20\u6101\u7B79\u4EC7\u7EF8\u7785\u4E11\u81ED\u521D\u51FA\u6A71\u53A8\u8E87\u9504\u96CF\u6EC1\u9664\u695A\"],\n[\"b440\",\"\u7884\u7885\u7886\u7888\u788A\u788B\u788F\u7890\u7892\u7894\u7895\u7896\u7899\u789D\u789E\u78A0\u78A2\u78A4\u78A6\u78A8\",7,\"\u78B5\u78B6\u78B7\u78B8\u78BA\u78BB\u78BC\u78BD\u78BF\u78C0\u78C2\u78C3\u78C4\u78C6\u78C7\u78C8\u78CC\u78CD\u78CE\u78CF\u78D1\u78D2\u78D3\u78D6\u78D7\u78D8\u78DA\",9],\n[\"b480\",\"\u78E4\u78E5\u78E6\u78E7\u78E9\u78EA\u78EB\u78ED\",4,\"\u78F3\u78F5\u78F6\u78F8\u78F9\u78FB\",5,\"\u7902\u7903\u7904\u7906\",6,\"\u7840\u50A8\u77D7\u6410\u89E6\u5904\u63E3\u5DDD\u7A7F\u693D\u4F20\u8239\u5598\u4E32\u75AE\u7A97\u5E62\u5E8A\u95EF\u521B\u5439\u708A\u6376\u9524\u5782\u6625\u693F\u9187\u5507\u6DF3\u7EAF\u8822\u6233\u7EF0\u75B5\u8328\u78C1\u96CC\u8F9E\u6148\u74F7\u8BCD\u6B64\u523A\u8D50\u6B21\u806A\u8471\u56F1\u5306\u4ECE\u4E1B\u51D1\u7C97\u918B\u7C07\u4FC3\u8E7F\u7BE1\u7A9C\u6467\u5D14\u50AC\u8106\u7601\u7CB9\u6DEC\u7FE0\u6751\u5B58\u5BF8\u78CB\u64AE\u6413\u63AA\u632B\u9519\u642D\u8FBE\u7B54\u7629\u6253\u5927\u5446\u6B79\u50A3\u6234\u5E26\u6B86\u4EE3\u8D37\u888B\u5F85\u902E\"],\n[\"b540\",\"\u790D\",5,\"\u7914\",9,\"\u791F\",4,\"\u7925\",14,\"\u7935\",4,\"\u793D\u793F\u7942\u7943\u7944\u7945\u7947\u794A\",8,\"\u7954\u7955\u7958\u7959\u7961\u7963\"],\n[\"b580\",\"\u7964\u7966\u7969\u796A\u796B\u796C\u796E\u7970\",6,\"\u7979\u797B\",4,\"\u7982\u7983\u7986\u7987\u7988\u7989\u798B\u798C\u798D\u798E\u7990\u7991\u7992\u6020\u803D\u62C5\u4E39\u5355\u90F8\u63B8\u80C6\u65E6\u6C2E\u4F46\u60EE\u6DE1\u8BDE\u5F39\u86CB\u5F53\u6321\u515A\u8361\u6863\u5200\u6363\u8E48\u5012\u5C9B\u7977\u5BFC\u5230\u7A3B\u60BC\u9053\u76D7\u5FB7\u5F97\u7684\u8E6C\u706F\u767B\u7B49\u77AA\u51F3\u9093\u5824\u4F4E\u6EF4\u8FEA\u654C\u7B1B\u72C4\u6DA4\u7FDF\u5AE1\u62B5\u5E95\u5730\u8482\u7B2C\u5E1D\u5F1F\u9012\u7F14\u98A0\u6382\u6EC7\u7898\u70B9\u5178\u975B\u57AB\u7535\u4F43\u7538\u5E97\u60E6\u5960\u6DC0\u6BBF\u7889\u53FC\u96D5\u51CB\u5201\u6389\u540A\u9493\u8C03\u8DCC\u7239\u789F\u8776\u8FED\u8C0D\u53E0\"],\n[\"b640\",\"\u7993\",6,\"\u799B\",11,\"\u79A8\",10,\"\u79B4\",4,\"\u79BC\u79BF\u79C2\u79C4\u79C5\u79C7\u79C8\u79CA\u79CC\u79CE\u79CF\u79D0\u79D3\u79D4\u79D6\u79D7\u79D9\",5,\"\u79E0\u79E1\u79E2\u79E5\u79E8\u79EA\"],\n[\"b680\",\"\u79EC\u79EE\u79F1\",6,\"\u79F9\u79FA\u79FC\u79FE\u79FF\u7A01\u7A04\u7A05\u7A07\u7A08\u7A09\u7A0A\u7A0C\u7A0F\",4,\"\u7A15\u7A16\u7A18\u7A19\u7A1B\u7A1C\u4E01\u76EF\u53EE\u9489\u9876\u9F0E\u952D\u5B9A\u8BA2\u4E22\u4E1C\u51AC\u8463\u61C2\u52A8\u680B\u4F97\u606B\u51BB\u6D1E\u515C\u6296\u6597\u9661\u8C46\u9017\u75D8\u90FD\u7763\u6BD2\u728A\u72EC\u8BFB\u5835\u7779\u8D4C\u675C\u9540\u809A\u5EA6\u6E21\u5992\u7AEF\u77ED\u953B\u6BB5\u65AD\u7F0E\u5806\u5151\u961F\u5BF9\u58A9\u5428\u8E72\u6566\u987F\u56E4\u949D\u76FE\u9041\u6387\u54C6\u591A\u593A\u579B\u8EB2\u6735\u8DFA\u8235\u5241\u60F0\u5815\u86FE\u5CE8\u9E45\u4FC4\u989D\u8BB9\u5A25\u6076\u5384\u627C\u904F\u9102\u997F\u6069\u800C\u513F\u8033\u5C14\u9975\u6D31\u4E8C\"],\n[\"b740\",\"\u7A1D\u7A1F\u7A21\u7A22\u7A24\",14,\"\u7A34\u7A35\u7A36\u7A38\u7A3A\u7A3E\u7A40\",5,\"\u7A47\",9,\"\u7A52\",4,\"\u7A58\",16],\n[\"b780\",\"\u7A69\",6,\"\u7A71\u7A72\u7A73\u7A75\u7A7B\u7A7C\u7A7D\u7A7E\u7A82\u7A85\u7A87\u7A89\u7A8A\u7A8B\u7A8C\u7A8E\u7A8F\u7A90\u7A93\u7A94\u7A99\u7A9A\u7A9B\u7A9E\u7AA1\u7AA2\u8D30\u53D1\u7F5A\u7B4F\u4F10\u4E4F\u9600\u6CD5\u73D0\u85E9\u5E06\u756A\u7FFB\u6A0A\u77FE\u9492\u7E41\u51E1\u70E6\u53CD\u8FD4\u8303\u8D29\u72AF\u996D\u6CDB\u574A\u82B3\u65B9\u80AA\u623F\u9632\u59A8\u4EFF\u8BBF\u7EBA\u653E\u83F2\u975E\u5561\u98DE\u80A5\u532A\u8BFD\u5420\u80BA\u5E9F\u6CB8\u8D39\u82AC\u915A\u5429\u6C1B\u5206\u7EB7\u575F\u711A\u6C7E\u7C89\u594B\u4EFD\u5FFF\u6124\u7CAA\u4E30\u5C01\u67AB\u8702\u5CF0\u950B\u98CE\u75AF\u70FD\u9022\u51AF\u7F1D\u8BBD\u5949\u51E4\u4F5B\u5426\u592B\u6577\u80A4\u5B75\u6276\u62C2\u8F90\u5E45\u6C1F\u7B26\u4F0F\u4FD8\u670D\"],\n[\"b840\",\"\u7AA3\u7AA4\u7AA7\u7AA9\u7AAA\u7AAB\u7AAE\",4,\"\u7AB4\",10,\"\u7AC0\",10,\"\u7ACC\",9,\"\u7AD7\u7AD8\u7ADA\u7ADB\u7ADC\u7ADD\u7AE1\u7AE2\u7AE4\u7AE7\",5,\"\u7AEE\u7AF0\u7AF1\u7AF2\u7AF3\"],\n[\"b880\",\"\u7AF4\",4,\"\u7AFB\u7AFC\u7AFE\u7B00\u7B01\u7B02\u7B05\u7B07\u7B09\u7B0C\u7B0D\u7B0E\u7B10\u7B12\u7B13\u7B16\u7B17\u7B18\u7B1A\u7B1C\u7B1D\u7B1F\u7B21\u7B22\u7B23\u7B27\u7B29\u7B2D\u6D6E\u6DAA\u798F\u88B1\u5F17\u752B\u629A\u8F85\u4FEF\u91DC\u65A7\u812F\u8151\u5E9C\u8150\u8D74\u526F\u8986\u8D4B\u590D\u5085\u4ED8\u961C\u7236\u8179\u8D1F\u5BCC\u8BA3\u9644\u5987\u7F1A\u5490\u5676\u560E\u8BE5\u6539\u6982\u9499\u76D6\u6E89\u5E72\u7518\u6746\u67D1\u7AFF\u809D\u8D76\u611F\u79C6\u6562\u8D63\u5188\u521A\u94A2\u7F38\u809B\u7EB2\u5C97\u6E2F\u6760\u7BD9\u768B\u9AD8\u818F\u7F94\u7CD5\u641E\u9550\u7A3F\u544A\u54E5\u6B4C\u6401\u6208\u9E3D\u80F3\u7599\u5272\u9769\u845B\u683C\u86E4\u9601\u9694\u94EC\u4E2A\u5404\u7ED9\u6839\u8DDF\u8015\u66F4\u5E9A\u7FB9\"],\n[\"b940\",\"\u7B2F\u7B30\u7B32\u7B34\u7B35\u7B36\u7B37\u7B39\u7B3B\u7B3D\u7B3F\",5,\"\u7B46\u7B48\u7B4A\u7B4D\u7B4E\u7B53\u7B55\u7B57\u7B59\u7B5C\u7B5E\u7B5F\u7B61\u7B63\",10,\"\u7B6F\u7B70\u7B73\u7B74\u7B76\u7B78\u7B7A\u7B7C\u7B7D\u7B7F\u7B81\u7B82\u7B83\u7B84\u7B86\",6,\"\u7B8E\u7B8F\"],\n[\"b980\",\"\u7B91\u7B92\u7B93\u7B96\u7B98\u7B99\u7B9A\u7B9B\u7B9E\u7B9F\u7BA0\u7BA3\u7BA4\u7BA5\u7BAE\u7BAF\u7BB0\u7BB2\u7BB3\u7BB5\u7BB6\u7BB7\u7BB9\",7,\"\u7BC2\u7BC3\u7BC4\u57C2\u803F\u6897\u5DE5\u653B\u529F\u606D\u9F9A\u4F9B\u8EAC\u516C\u5BAB\u5F13\u5DE9\u6C5E\u62F1\u8D21\u5171\u94A9\u52FE\u6C9F\u82DF\u72D7\u57A2\u6784\u8D2D\u591F\u8F9C\u83C7\u5495\u7B8D\u4F30\u6CBD\u5B64\u59D1\u9F13\u53E4\u86CA\u9AA8\u8C37\u80A1\u6545\u987E\u56FA\u96C7\u522E\u74DC\u5250\u5BE1\u6302\u8902\u4E56\u62D0\u602A\u68FA\u5173\u5B98\u51A0\u89C2\u7BA1\u9986\u7F50\u60EF\u704C\u8D2F\u5149\u5E7F\u901B\u7470\u89C4\u572D\u7845\u5F52\u9F9F\u95FA\u8F68\u9B3C\u8BE1\u7678\u6842\u67DC\u8DEA\u8D35\u523D\u8F8A\u6EDA\u68CD\u9505\u90ED\u56FD\u679C\u88F9\u8FC7\u54C8\"],\n[\"ba40\",\"\u7BC5\u7BC8\u7BC9\u7BCA\u7BCB\u7BCD\u7BCE\u7BCF\u7BD0\u7BD2\u7BD4\",4,\"\u7BDB\u7BDC\u7BDE\u7BDF\u7BE0\u7BE2\u7BE3\u7BE4\u7BE7\u7BE8\u7BE9\u7BEB\u7BEC\u7BED\u7BEF\u7BF0\u7BF2\",4,\"\u7BF8\u7BF9\u7BFA\u7BFB\u7BFD\u7BFF\",7,\"\u7C08\u7C09\u7C0A\u7C0D\u7C0E\u7C10\",5,\"\u7C17\u7C18\u7C19\"],\n[\"ba80\",\"\u7C1A\",4,\"\u7C20\",5,\"\u7C28\u7C29\u7C2B\",12,\"\u7C39\",5,\"\u7C42\u9AB8\u5B69\u6D77\u6C26\u4EA5\u5BB3\u9A87\u9163\u61A8\u90AF\u97E9\u542B\u6DB5\u5BD2\u51FD\u558A\u7F55\u7FF0\u64BC\u634D\u65F1\u61BE\u608D\u710A\u6C57\u6C49\u592F\u676D\u822A\u58D5\u568E\u8C6A\u6BEB\u90DD\u597D\u8017\u53F7\u6D69\u5475\u559D\u8377\u83CF\u6838\u79BE\u548C\u4F55\u5408\u76D2\u8C89\u9602\u6CB3\u6DB8\u8D6B\u8910\u9E64\u8D3A\u563F\u9ED1\u75D5\u5F88\u72E0\u6068\u54FC\u4EA8\u6A2A\u8861\u6052\u8F70\u54C4\u70D8\u8679\u9E3F\u6D2A\u5B8F\u5F18\u7EA2\u5589\u4FAF\u7334\u543C\u539A\u5019\u540E\u547C\u4E4E\u5FFD\u745A\u58F6\u846B\u80E1\u8774\u72D0\u7CCA\u6E56\"],\n[\"bb40\",\"\u7C43\",9,\"\u7C4E\",36,\"\u7C75\",5,\"\u7C7E\",9],\n[\"bb80\",\"\u7C88\u7C8A\",6,\"\u7C93\u7C94\u7C96\u7C99\u7C9A\u7C9B\u7CA0\u7CA1\u7CA3\u7CA6\u7CA7\u7CA8\u7CA9\u7CAB\u7CAC\u7CAD\u7CAF\u7CB0\u7CB4\",4,\"\u7CBA\u7CBB\u5F27\u864E\u552C\u62A4\u4E92\u6CAA\u6237\u82B1\u54D7\u534E\u733E\u6ED1\u753B\u5212\u5316\u8BDD\u69D0\u5F8A\u6000\u6DEE\u574F\u6B22\u73AF\u6853\u8FD8\u7F13\u6362\u60A3\u5524\u75EA\u8C62\u7115\u6DA3\u5BA6\u5E7B\u8352\u614C\u9EC4\u78FA\u8757\u7C27\u7687\u51F0\u60F6\u714C\u6643\u5E4C\u604D\u8C0E\u7070\u6325\u8F89\u5FBD\u6062\u86D4\u56DE\u6BC1\u6094\u6167\u5349\u60E0\u6666\u8D3F\u79FD\u4F1A\u70E9\u6C47\u8BB3\u8BF2\u7ED8\u8364\u660F\u5A5A\u9B42\u6D51\u6DF7\u8C41\u6D3B\u4F19\u706B\u83B7\u6216\u60D1\u970D\u8D27\u7978\u51FB\u573E\u57FA\u673A\u7578\u7A3D\u79EF\u7B95\"],\n[\"bc40\",\"\u7CBF\u7CC0\u7CC2\u7CC3\u7CC4\u7CC6\u7CC9\u7CCB\u7CCE\",6,\"\u7CD8\u7CDA\u7CDB\u7CDD\u7CDE\u7CE1\",6,\"\u7CE9\",5,\"\u7CF0\",7,\"\u7CF9\u7CFA\u7CFC\",13,\"\u7D0B\",5],\n[\"bc80\",\"\u7D11\",14,\"\u7D21\u7D23\u7D24\u7D25\u7D26\u7D28\u7D29\u7D2A\u7D2C\u7D2D\u7D2E\u7D30\",6,\"\u808C\u9965\u8FF9\u6FC0\u8BA5\u9E21\u59EC\u7EE9\u7F09\u5409\u6781\u68D8\u8F91\u7C4D\u96C6\u53CA\u6025\u75BE\u6C72\u5373\u5AC9\u7EA7\u6324\u51E0\u810A\u5DF1\u84DF\u6280\u5180\u5B63\u4F0E\u796D\u5242\u60B8\u6D4E\u5BC4\u5BC2\u8BA1\u8BB0\u65E2\u5FCC\u9645\u5993\u7EE7\u7EAA\u5609\u67B7\u5939\u4F73\u5BB6\u52A0\u835A\u988A\u8D3E\u7532\u94BE\u5047\u7A3C\u4EF7\u67B6\u9A7E\u5AC1\u6B7C\u76D1\u575A\u5C16\u7B3A\u95F4\u714E\u517C\u80A9\u8270\u5978\u7F04\u8327\u68C0\u67EC\u78B1\u7877\u62E3\u6361\u7B80\u4FED\u526A\u51CF\u8350\u69DB\u9274\u8DF5\u8D31\u89C1\u952E\u7BAD\u4EF6\"],\n[\"bd40\",\"\u7D37\",54,\"\u7D6F\",7],\n[\"bd80\",\"\u7D78\",32,\"\u5065\u8230\u5251\u996F\u6E10\u6E85\u6DA7\u5EFA\u50F5\u59DC\u5C06\u6D46\u6C5F\u7586\u848B\u6868\u5956\u8BB2\u5320\u9171\u964D\u8549\u6912\u7901\u7126\u80F6\u4EA4\u90CA\u6D47\u9A84\u5A07\u56BC\u6405\u94F0\u77EB\u4FA5\u811A\u72E1\u89D2\u997A\u7F34\u7EDE\u527F\u6559\u9175\u8F7F\u8F83\u53EB\u7A96\u63ED\u63A5\u7686\u79F8\u8857\u9636\u622A\u52AB\u8282\u6854\u6770\u6377\u776B\u7AED\u6D01\u7ED3\u89E3\u59D0\u6212\u85C9\u82A5\u754C\u501F\u4ECB\u75A5\u8BEB\u5C4A\u5DFE\u7B4B\u65A4\u91D1\u4ECA\u6D25\u895F\u7D27\u9526\u4EC5\u8C28\u8FDB\u9773\u664B\u7981\u8FD1\u70EC\u6D78\"],\n[\"be40\",\"\u7D99\",12,\"\u7DA7\",6,\"\u7DAF\",42],\n[\"be80\",\"\u7DDA\",32,\"\u5C3D\u52B2\u8346\u5162\u830E\u775B\u6676\u9CB8\u4EAC\u60CA\u7CBE\u7CB3\u7ECF\u4E95\u8B66\u666F\u9888\u9759\u5883\u656C\u955C\u5F84\u75C9\u9756\u7ADF\u7ADE\u51C0\u70AF\u7A98\u63EA\u7A76\u7EA0\u7396\u97ED\u4E45\u7078\u4E5D\u9152\u53A9\u6551\u65E7\u81FC\u8205\u548E\u5C31\u759A\u97A0\u62D8\u72D9\u75BD\u5C45\u9A79\u83CA\u5C40\u5480\u77E9\u4E3E\u6CAE\u805A\u62D2\u636E\u5DE8\u5177\u8DDD\u8E1E\u952F\u4FF1\u53E5\u60E7\u70AC\u5267\u6350\u9E43\u5A1F\u5026\u7737\u5377\u7EE2\u6485\u652B\u6289\u6398\u5014\u7235\u89C9\u51B3\u8BC0\u7EDD\u5747\u83CC\u94A7\u519B\u541B\u5CFB\"],\n[\"bf40\",\"\u7DFB\",62],\n[\"bf80\",\"\u7E3A\u7E3C\",4,\"\u7E42\",4,\"\u7E48\",21,\"\u4FCA\u7AE3\u6D5A\u90E1\u9A8F\u5580\u5496\u5361\u54AF\u5F00\u63E9\u6977\u51EF\u6168\u520A\u582A\u52D8\u574E\u780D\u770B\u5EB7\u6177\u7CE0\u625B\u6297\u4EA2\u7095\u8003\u62F7\u70E4\u9760\u5777\u82DB\u67EF\u68F5\u78D5\u9897\u79D1\u58F3\u54B3\u53EF\u6E34\u514B\u523B\u5BA2\u8BFE\u80AF\u5543\u57A6\u6073\u5751\u542D\u7A7A\u6050\u5B54\u63A7\u62A0\u53E3\u6263\u5BC7\u67AF\u54ED\u7A9F\u82E6\u9177\u5E93\u88E4\u5938\u57AE\u630E\u8DE8\u80EF\u5757\u7B77\u4FA9\u5FEB\u5BBD\u6B3E\u5321\u7B50\u72C2\u6846\u77FF\u7736\u65F7\u51B5\u4E8F\u76D4\u5CBF\u7AA5\u8475\u594E\u9B41\u5080\"],\n[\"c040\",\"\u7E5E\",35,\"\u7E83\",23,\"\u7E9C\u7E9D\u7E9E\"],\n[\"c080\",\"\u7EAE\u7EB4\u7EBB\u7EBC\u7ED6\u7EE4\u7EEC\u7EF9\u7F0A\u7F10\u7F1E\u7F37\u7F39\u7F3B\",6,\"\u7F43\u7F46\",9,\"\u7F52\u7F53\u9988\u6127\u6E83\u5764\u6606\u6346\u56F0\u62EC\u6269\u5ED3\u9614\u5783\u62C9\u5587\u8721\u814A\u8FA3\u5566\u83B1\u6765\u8D56\u84DD\u5A6A\u680F\u62E6\u7BEE\u9611\u5170\u6F9C\u8C30\u63FD\u89C8\u61D2\u7F06\u70C2\u6EE5\u7405\u6994\u72FC\u5ECA\u90CE\u6717\u6D6A\u635E\u52B3\u7262\u8001\u4F6C\u59E5\u916A\u70D9\u6D9D\u52D2\u4E50\u96F7\u956D\u857E\u78CA\u7D2F\u5121\u5792\u64C2\u808B\u7C7B\u6CEA\u68F1\u695E\u51B7\u5398\u68A8\u7281\u9ECE\u7BF1\u72F8\u79BB\u6F13\u7406\u674E\u91CC\u9CA4\u793C\u8389\u8354\u540F\u6817\u4E3D\u5389\u52B1\u783E\u5386\u5229\u5088\u4F8B\u4FD0\"],\n[\"c140\",\"\u7F56\u7F59\u7F5B\u7F5C\u7F5D\u7F5E\u7F60\u7F63\",4,\"\u7F6B\u7F6C\u7F6D\u7F6F\u7F70\u7F73\u7F75\u7F76\u7F77\u7F78\u7F7A\u7F7B\u7F7C\u7F7D\u7F7F\u7F80\u7F82\",7,\"\u7F8B\u7F8D\u7F8F\",4,\"\u7F95\",4,\"\u7F9B\u7F9C\u7FA0\u7FA2\u7FA3\u7FA5\u7FA6\u7FA8\",6,\"\u7FB1\"],\n[\"c180\",\"\u7FB3\",4,\"\u7FBA\u7FBB\u7FBE\u7FC0\u7FC2\u7FC3\u7FC4\u7FC6\u7FC7\u7FC8\u7FC9\u7FCB\u7FCD\u7FCF\",4,\"\u7FD6\u7FD7\u7FD9\",5,\"\u7FE2\u7FE3\u75E2\u7ACB\u7C92\u6CA5\u96B6\u529B\u7483\u54E9\u4FE9\u8054\u83B2\u8FDE\u9570\u5EC9\u601C\u6D9F\u5E18\u655B\u8138\u94FE\u604B\u70BC\u7EC3\u7CAE\u51C9\u6881\u7CB1\u826F\u4E24\u8F86\u91CF\u667E\u4EAE\u8C05\u64A9\u804A\u50DA\u7597\u71CE\u5BE5\u8FBD\u6F66\u4E86\u6482\u9563\u5ED6\u6599\u5217\u88C2\u70C8\u52A3\u730E\u7433\u6797\u78F7\u9716\u4E34\u90BB\u9CDE\u6DCB\u51DB\u8D41\u541D\u62CE\u73B2\u83F1\u96F6\u9F84\u94C3\u4F36\u7F9A\u51CC\u7075\u9675\u5CAD\u9886\u53E6\u4EE4\u6E9C\u7409\u69B4\u786B\u998F\u7559\u5218\u7624\u6D41\u67F3\u516D\u9F99\u804B\u5499\u7B3C\u7ABF\"],\n[\"c240\",\"\u7FE4\u7FE7\u7FE8\u7FEA\u7FEB\u7FEC\u7FED\u7FEF\u7FF2\u7FF4\",6,\"\u7FFD\u7FFE\u7FFF\u8002\u8007\u8008\u8009\u800A\u800E\u800F\u8011\u8013\u801A\u801B\u801D\u801E\u801F\u8021\u8023\u8024\u802B\",5,\"\u8032\u8034\u8039\u803A\u803C\u803E\u8040\u8041\u8044\u8045\u8047\u8048\u8049\u804E\u804F\u8050\u8051\u8053\u8055\u8056\u8057\"],\n[\"c280\",\"\u8059\u805B\",13,\"\u806B\",5,\"\u8072\",11,\"\u9686\u5784\u62E2\u9647\u697C\u5A04\u6402\u7BD3\u6F0F\u964B\u82A6\u5362\u9885\u5E90\u7089\u63B3\u5364\u864F\u9C81\u9E93\u788C\u9732\u8DEF\u8D42\u9E7F\u6F5E\u7984\u5F55\u9646\u622E\u9A74\u5415\u94DD\u4FA3\u65C5\u5C65\u5C61\u7F15\u8651\u6C2F\u5F8B\u7387\u6EE4\u7EFF\u5CE6\u631B\u5B6A\u6EE6\u5375\u4E71\u63A0\u7565\u62A1\u8F6E\u4F26\u4ED1\u6CA6\u7EB6\u8BBA\u841D\u87BA\u7F57\u903B\u9523\u7BA9\u9AA1\u88F8\u843D\u6D1B\u9A86\u7EDC\u5988\u9EBB\u739B\u7801\u8682\u9A6C\u9A82\u561B\u5417\u57CB\u4E70\u9EA6\u5356\u8FC8\u8109\u7792\u9992\u86EE\u6EE1\u8513\u66FC\u6162\u6F2B\"],\n[\"c340\",\"\u807E\u8081\u8082\u8085\u8088\u808A\u808D\",5,\"\u8094\u8095\u8097\u8099\u809E\u80A3\u80A6\u80A7\u80A8\u80AC\u80B0\u80B3\u80B5\u80B6\u80B8\u80B9\u80BB\u80C5\u80C7\",4,\"\u80CF\",6,\"\u80D8\u80DF\u80E0\u80E2\u80E3\u80E6\u80EE\u80F5\u80F7\u80F9\u80FB\u80FE\u80FF\u8100\u8101\u8103\u8104\u8105\u8107\u8108\u810B\"],\n[\"c380\",\"\u810C\u8115\u8117\u8119\u811B\u811C\u811D\u811F\",12,\"\u812D\u812E\u8130\u8133\u8134\u8135\u8137\u8139\",4,\"\u813F\u8C29\u8292\u832B\u76F2\u6C13\u5FD9\u83BD\u732B\u8305\u951A\u6BDB\u77DB\u94C6\u536F\u8302\u5192\u5E3D\u8C8C\u8D38\u4E48\u73AB\u679A\u6885\u9176\u9709\u7164\u6CA1\u7709\u5A92\u9541\u6BCF\u7F8E\u6627\u5BD0\u59B9\u5A9A\u95E8\u95F7\u4EEC\u840C\u8499\u6AAC\u76DF\u9530\u731B\u68A6\u5B5F\u772F\u919A\u9761\u7CDC\u8FF7\u8C1C\u5F25\u7C73\u79D8\u89C5\u6CCC\u871C\u5BC6\u5E42\u68C9\u7720\u7EF5\u5195\u514D\u52C9\u5A29\u7F05\u9762\u82D7\u63CF\u7784\u85D0\u79D2\u6E3A\u5E99\u5999\u8511\u706D\u6C11\u62BF\u76BF\u654F\u60AF\u95FD\u660E\u879F\u9E23\u94ED\u540D\u547D\u8C2C\u6478\"],\n[\"c440\",\"\u8140\",5,\"\u8147\u8149\u814D\u814E\u814F\u8152\u8156\u8157\u8158\u815B\",4,\"\u8161\u8162\u8163\u8164\u8166\u8168\u816A\u816B\u816C\u816F\u8172\u8173\u8175\u8176\u8177\u8178\u8181\u8183\",4,\"\u8189\u818B\u818C\u818D\u818E\u8190\u8192\",5,\"\u8199\u819A\u819E\",4,\"\u81A4\u81A5\"],\n[\"c480\",\"\u81A7\u81A9\u81AB\",7,\"\u81B4\",5,\"\u81BC\u81BD\u81BE\u81BF\u81C4\u81C5\u81C7\u81C8\u81C9\u81CB\u81CD\",6,\"\u6479\u8611\u6A21\u819C\u78E8\u6469\u9B54\u62B9\u672B\u83AB\u58A8\u9ED8\u6CAB\u6F20\u5BDE\u964C\u8C0B\u725F\u67D0\u62C7\u7261\u4EA9\u59C6\u6BCD\u5893\u66AE\u5E55\u52DF\u6155\u6728\u76EE\u7766\u7267\u7A46\u62FF\u54EA\u5450\u94A0\u90A3\u5A1C\u7EB3\u6C16\u4E43\u5976\u8010\u5948\u5357\u7537\u96BE\u56CA\u6320\u8111\u607C\u95F9\u6DD6\u5462\u9981\u5185\u5AE9\u80FD\u59AE\u9713\u502A\u6CE5\u5C3C\u62DF\u4F60\u533F\u817B\u9006\u6EBA\u852B\u62C8\u5E74\u78BE\u64B5\u637B\u5FF5\u5A18\u917F\u9E1F\u5C3F\u634F\u8042\u5B7D\u556E\u954A\u954D\u6D85\u60A8\u67E0\u72DE\u51DD\u5B81\"],\n[\"c540\",\"\u81D4\",14,\"\u81E4\u81E5\u81E6\u81E8\u81E9\u81EB\u81EE\",4,\"\u81F5\",5,\"\u81FD\u81FF\u8203\u8207\",4,\"\u820E\u820F\u8211\u8213\u8215\",5,\"\u821D\u8220\u8224\u8225\u8226\u8227\u8229\u822E\u8232\u823A\u823C\u823D\u823F\"],\n[\"c580\",\"\u8240\u8241\u8242\u8243\u8245\u8246\u8248\u824A\u824C\u824D\u824E\u8250\",7,\"\u8259\u825B\u825C\u825D\u825E\u8260\",7,\"\u8269\u62E7\u6CDE\u725B\u626D\u94AE\u7EBD\u8113\u6D53\u519C\u5F04\u5974\u52AA\u6012\u5973\u6696\u8650\u759F\u632A\u61E6\u7CEF\u8BFA\u54E6\u6B27\u9E25\u6BB4\u85D5\u5455\u5076\u6CA4\u556A\u8DB4\u722C\u5E15\u6015\u7436\u62CD\u6392\u724C\u5F98\u6E43\u6D3E\u6500\u6F58\u76D8\u78D0\u76FC\u7554\u5224\u53DB\u4E53\u5E9E\u65C1\u802A\u80D6\u629B\u5486\u5228\u70AE\u888D\u8DD1\u6CE1\u5478\u80DA\u57F9\u88F4\u8D54\u966A\u914D\u4F69\u6C9B\u55B7\u76C6\u7830\u62A8\u70F9\u6F8E\u5F6D\u84EC\u68DA\u787C\u7BF7\u81A8\u670B\u9E4F\u6367\u78B0\u576F\u7812\u9739\u6279\u62AB\u5288\u7435\u6BD7\"],\n[\"c640\",\"\u826A\u826B\u826C\u826D\u8271\u8275\u8276\u8277\u8278\u827B\u827C\u8280\u8281\u8283\u8285\u8286\u8287\u8289\u828C\u8290\u8293\u8294\u8295\u8296\u829A\u829B\u829E\u82A0\u82A2\u82A3\u82A7\u82B2\u82B5\u82B6\u82BA\u82BB\u82BC\u82BF\u82C0\u82C2\u82C3\u82C5\u82C6\u82C9\u82D0\u82D6\u82D9\u82DA\u82DD\u82E2\u82E7\u82E8\u82E9\u82EA\u82EC\u82ED\u82EE\u82F0\u82F2\u82F3\u82F5\u82F6\u82F8\"],\n[\"c680\",\"\u82FA\u82FC\",4,\"\u830A\u830B\u830D\u8310\u8312\u8313\u8316\u8318\u8319\u831D\",9,\"\u8329\u832A\u832E\u8330\u8332\u8337\u833B\u833D\u5564\u813E\u75B2\u76AE\u5339\u75DE\u50FB\u5C41\u8B6C\u7BC7\u504F\u7247\u9A97\u98D8\u6F02\u74E2\u7968\u6487\u77A5\u62FC\u9891\u8D2B\u54C1\u8058\u4E52\u576A\u82F9\u840D\u5E73\u51ED\u74F6\u8BC4\u5C4F\u5761\u6CFC\u9887\u5A46\u7834\u9B44\u8FEB\u7C95\u5256\u6251\u94FA\u4EC6\u8386\u8461\u83E9\u84B2\u57D4\u6734\u5703\u666E\u6D66\u8C31\u66DD\u7011\u671F\u6B3A\u6816\u621A\u59BB\u4E03\u51C4\u6F06\u67D2\u6C8F\u5176\u68CB\u5947\u6B67\u7566\u5D0E\u8110\u9F50\u65D7\u7948\u7941\u9A91\u8D77\u5C82\u4E5E\u4F01\u542F\u5951\u780C\u5668\u6C14\u8FC4\u5F03\u6C7D\u6CE3\u8BAB\u6390\"],\n[\"c740\",\"\u833E\u833F\u8341\u8342\u8344\u8345\u8348\u834A\",4,\"\u8353\u8355\",4,\"\u835D\u8362\u8370\",6,\"\u8379\u837A\u837E\",6,\"\u8387\u8388\u838A\u838B\u838C\u838D\u838F\u8390\u8391\u8394\u8395\u8396\u8397\u8399\u839A\u839D\u839F\u83A1\",6,\"\u83AC\u83AD\u83AE\"],\n[\"c780\",\"\u83AF\u83B5\u83BB\u83BE\u83BF\u83C2\u83C3\u83C4\u83C6\u83C8\u83C9\u83CB\u83CD\u83CE\u83D0\u83D1\u83D2\u83D3\u83D5\u83D7\u83D9\u83DA\u83DB\u83DE\u83E2\u83E3\u83E4\u83E6\u83E7\u83E8\u83EB\u83EC\u83ED\u6070\u6D3D\u7275\u6266\u948E\u94C5\u5343\u8FC1\u7B7E\u4EDF\u8C26\u4E7E\u9ED4\u94B1\u94B3\u524D\u6F5C\u9063\u6D45\u8C34\u5811\u5D4C\u6B20\u6B49\u67AA\u545B\u8154\u7F8C\u5899\u8537\u5F3A\u62A2\u6A47\u9539\u6572\u6084\u6865\u77A7\u4E54\u4FA8\u5DE7\u9798\u64AC\u7FD8\u5CED\u4FCF\u7A8D\u5207\u8304\u4E14\u602F\u7A83\u94A6\u4FB5\u4EB2\u79E6\u7434\u52E4\u82B9\u64D2\u79BD\u5BDD\u6C81\u9752\u8F7B\u6C22\u503E\u537F\u6E05\u64CE\u6674\u6C30\u60C5\u9877\u8BF7\u5E86\u743C\u7A77\u79CB\u4E18\u90B1\u7403\u6C42\u56DA\u914B\u6CC5\u8D8B\u533A\u86C6\u66F2\u8EAF\u5C48\u9A71\u6E20\"],\n[\"c840\",\"\u83EE\u83EF\u83F3\",4,\"\u83FA\u83FB\u83FC\u83FE\u83FF\u8400\u8402\u8405\u8407\u8408\u8409\u840A\u8410\u8412\",5,\"\u8419\u841A\u841B\u841E\",5,\"\u8429\",7,\"\u8432\",5,\"\u8439\u843A\u843B\u843E\",7,\"\u8447\u8448\u8449\"],\n[\"c880\",\"\u844A\",6,\"\u8452\",4,\"\u8458\u845D\u845E\u845F\u8460\u8462\u8464\",4,\"\u846A\u846E\u846F\u8470\u8472\u8474\u8477\u8479\u847B\u847C\u53D6\u5A36\u9F8B\u8DA3\u53BB\u5708\u98A7\u6743\u919B\u6CC9\u5168\u75CA\u62F3\u72AC\u5238\u529D\u7F3A\u7094\u7638\u5374\u9E4A\u69B7\u786E\u96C0\u88D9\u7FA4\u7136\u71C3\u5189\u67D3\u74E4\u58E4\u6518\u56B7\u8BA9\u9976\u6270\u7ED5\u60F9\u70ED\u58EC\u4EC1\u4EBA\u5FCD\u97E7\u4EFB\u8BA4\u5203\u598A\u7EAB\u6254\u4ECD\u65E5\u620E\u8338\u84C9\u8363\u878D\u7194\u6EB6\u5BB9\u7ED2\u5197\u63C9\u67D4\u8089\u8339\u8815\u5112\u5B7A\u5982\u8FB1\u4E73\u6C5D\u5165\u8925\u8F6F\u962E\u854A\u745E\u9510\u95F0\u6DA6\u82E5\u5F31\u6492\u6D12\u8428\u816E\u9CC3\u585E\u8D5B\u4E09\u53C1\"],\n[\"c940\",\"\u847D\",4,\"\u8483\u8484\u8485\u8486\u848A\u848D\u848F\",7,\"\u8498\u849A\u849B\u849D\u849E\u849F\u84A0\u84A2\",12,\"\u84B0\u84B1\u84B3\u84B5\u84B6\u84B7\u84BB\u84BC\u84BE\u84C0\u84C2\u84C3\u84C5\u84C6\u84C7\u84C8\u84CB\u84CC\u84CE\u84CF\u84D2\u84D4\u84D5\u84D7\"],\n[\"c980\",\"\u84D8\",4,\"\u84DE\u84E1\u84E2\u84E4\u84E7\",4,\"\u84ED\u84EE\u84EF\u84F1\",10,\"\u84FD\u84FE\u8500\u8501\u8502\u4F1E\u6563\u6851\u55D3\u4E27\u6414\u9A9A\u626B\u5AC2\u745F\u8272\u6DA9\u68EE\u50E7\u838E\u7802\u6740\u5239\u6C99\u7EB1\u50BB\u5565\u715E\u7B5B\u6652\u73CA\u82EB\u6749\u5C71\u5220\u717D\u886B\u95EA\u9655\u64C5\u8D61\u81B3\u5584\u6C55\u6247\u7F2E\u5892\u4F24\u5546\u8D4F\u664C\u4E0A\u5C1A\u88F3\u68A2\u634E\u7A0D\u70E7\u828D\u52FA\u97F6\u5C11\u54E8\u90B5\u7ECD\u5962\u8D4A\u86C7\u820C\u820D\u8D66\u6444\u5C04\u6151\u6D89\u793E\u8BBE\u7837\u7533\u547B\u4F38\u8EAB\u6DF1\u5A20\u7EC5\u795E\u6C88\u5BA1\u5A76\u751A\u80BE\u614E\u6E17\u58F0\u751F\u7525\u7272\u5347\u7EF3\"],\n[\"ca40\",\"\u8503\",8,\"\u850D\u850E\u850F\u8510\u8512\u8514\u8515\u8516\u8518\u8519\u851B\u851C\u851D\u851E\u8520\u8522\",8,\"\u852D\",9,\"\u853E\",4,\"\u8544\u8545\u8546\u8547\u854B\",10],\n[\"ca80\",\"\u8557\u8558\u855A\u855B\u855C\u855D\u855F\",4,\"\u8565\u8566\u8567\u8569\",8,\"\u8573\u8575\u8576\u8577\u8578\u857C\u857D\u857F\u8580\u8581\u7701\u76DB\u5269\u80DC\u5723\u5E08\u5931\u72EE\u65BD\u6E7F\u8BD7\u5C38\u8671\u5341\u77F3\u62FE\u65F6\u4EC0\u98DF\u8680\u5B9E\u8BC6\u53F2\u77E2\u4F7F\u5C4E\u9A76\u59CB\u5F0F\u793A\u58EB\u4E16\u67FF\u4E8B\u62ED\u8A93\u901D\u52BF\u662F\u55DC\u566C\u9002\u4ED5\u4F8D\u91CA\u9970\u6C0F\u5E02\u6043\u5BA4\u89C6\u8BD5\u6536\u624B\u9996\u5B88\u5BFF\u6388\u552E\u53D7\u7626\u517D\u852C\u67A2\u68B3\u6B8A\u6292\u8F93\u53D4\u8212\u6DD1\u758F\u4E66\u8D4E\u5B70\u719F\u85AF\u6691\u66D9\u7F72\u8700\u9ECD\u9F20\u5C5E\u672F\u8FF0\u6811\u675F\u620D\u7AD6\u5885\u5EB6\u6570\u6F31\"],\n[\"cb40\",\"\u8582\u8583\u8586\u8588\",6,\"\u8590\",10,\"\u859D\",6,\"\u85A5\u85A6\u85A7\u85A9\u85AB\u85AC\u85AD\u85B1\",5,\"\u85B8\u85BA\",6,\"\u85C2\",6,\"\u85CA\",4,\"\u85D1\u85D2\"],\n[\"cb80\",\"\u85D4\u85D6\",5,\"\u85DD\",6,\"\u85E5\u85E6\u85E7\u85E8\u85EA\",14,\"\u6055\u5237\u800D\u6454\u8870\u7529\u5E05\u6813\u62F4\u971C\u53CC\u723D\u8C01\u6C34\u7761\u7A0E\u542E\u77AC\u987A\u821C\u8BF4\u7855\u6714\u70C1\u65AF\u6495\u5636\u601D\u79C1\u53F8\u4E1D\u6B7B\u8086\u5BFA\u55E3\u56DB\u4F3A\u4F3C\u9972\u5DF3\u677E\u8038\u6002\u9882\u9001\u5B8B\u8BBC\u8BF5\u641C\u8258\u64DE\u55FD\u82CF\u9165\u4FD7\u7D20\u901F\u7C9F\u50F3\u5851\u6EAF\u5BBF\u8BC9\u8083\u9178\u849C\u7B97\u867D\u968B\u968F\u7EE5\u9AD3\u788E\u5C81\u7A57\u9042\u96A7\u795F\u5B59\u635F\u7B0B\u84D1\u68AD\u5506\u7F29\u7410\u7D22\u9501\u6240\u584C\u4ED6\u5B83\u5979\u5854\"],\n[\"cc40\",\"\u85F9\u85FA\u85FC\u85FD\u85FE\u8600\",4,\"\u8606\",10,\"\u8612\u8613\u8614\u8615\u8617\",15,\"\u8628\u862A\",13,\"\u8639\u863A\u863B\u863D\u863E\u863F\u8640\"],\n[\"cc80\",\"\u8641\",11,\"\u8652\u8653\u8655\",4,\"\u865B\u865C\u865D\u865F\u8660\u8661\u8663\",7,\"\u736D\u631E\u8E4B\u8E0F\u80CE\u82D4\u62AC\u53F0\u6CF0\u915E\u592A\u6001\u6C70\u574D\u644A\u8D2A\u762B\u6EE9\u575B\u6A80\u75F0\u6F6D\u8C2D\u8C08\u5766\u6BEF\u8892\u78B3\u63A2\u53F9\u70AD\u6C64\u5858\u642A\u5802\u68E0\u819B\u5510\u7CD6\u5018\u8EBA\u6DCC\u8D9F\u70EB\u638F\u6D9B\u6ED4\u7EE6\u8404\u6843\u9003\u6DD8\u9676\u8BA8\u5957\u7279\u85E4\u817E\u75BC\u8A8A\u68AF\u5254\u8E22\u9511\u63D0\u9898\u8E44\u557C\u4F53\u66FF\u568F\u60D5\u6D95\u5243\u5C49\u5929\u6DFB\u586B\u7530\u751C\u606C\u8214\u8146\u6311\u6761\u8FE2\u773A\u8DF3\u8D34\u94C1\u5E16\u5385\u542C\u70C3\"],\n[\"cd40\",\"\u866D\u866F\u8670\u8672\",6,\"\u8683\",6,\"\u868E\",4,\"\u8694\u8696\",5,\"\u869E\",4,\"\u86A5\u86A6\u86AB\u86AD\u86AE\u86B2\u86B3\u86B7\u86B8\u86B9\u86BB\",4,\"\u86C1\u86C2\u86C3\u86C5\u86C8\u86CC\u86CD\u86D2\u86D3\u86D5\u86D6\u86D7\u86DA\u86DC\"],\n[\"cd80\",\"\u86DD\u86E0\u86E1\u86E2\u86E3\u86E5\u86E6\u86E7\u86E8\u86EA\u86EB\u86EC\u86EF\u86F5\u86F6\u86F7\u86FA\u86FB\u86FC\u86FD\u86FF\u8701\u8704\u8705\u8706\u870B\u870C\u870E\u870F\u8710\u8711\u8714\u8716\u6C40\u5EF7\u505C\u4EAD\u5EAD\u633A\u8247\u901A\u6850\u916E\u77B3\u540C\u94DC\u5F64\u7AE5\u6876\u6345\u7B52\u7EDF\u75DB\u5077\u6295\u5934\u900F\u51F8\u79C3\u7A81\u56FE\u5F92\u9014\u6D82\u5C60\u571F\u5410\u5154\u6E4D\u56E2\u63A8\u9893\u817F\u8715\u892A\u9000\u541E\u5C6F\u81C0\u62D6\u6258\u8131\u9E35\u9640\u9A6E\u9A7C\u692D\u59A5\u62D3\u553E\u6316\u54C7\u86D9\u6D3C\u5A03\u74E6\u889C\u6B6A\u5916\u8C4C\u5F2F\u6E7E\u73A9\u987D\u4E38\u70F7\u5B8C\u7897\u633D\u665A\u7696\u60CB\u5B9B\u5A49\u4E07\u8155\u6C6A\u738B\u4EA1\u6789\u7F51\u5F80\u65FA\u671B\u5FD8\u5984\u5A01\"],\n[\"ce40\",\"\u8719\u871B\u871D\u871F\u8720\u8724\u8726\u8727\u8728\u872A\u872B\u872C\u872D\u872F\u8730\u8732\u8733\u8735\u8736\u8738\u8739\u873A\u873C\u873D\u8740\",6,\"\u874A\u874B\u874D\u874F\u8750\u8751\u8752\u8754\u8755\u8756\u8758\u875A\",5,\"\u8761\u8762\u8766\",7,\"\u876F\u8771\u8772\u8773\u8775\"],\n[\"ce80\",\"\u8777\u8778\u8779\u877A\u877F\u8780\u8781\u8784\u8786\u8787\u8789\u878A\u878C\u878E\",4,\"\u8794\u8795\u8796\u8798\",6,\"\u87A0\",4,\"\u5DCD\u5FAE\u5371\u97E6\u8FDD\u6845\u56F4\u552F\u60DF\u4E3A\u6F4D\u7EF4\u82C7\u840E\u59D4\u4F1F\u4F2A\u5C3E\u7EAC\u672A\u851A\u5473\u754F\u80C3\u5582\u9B4F\u4F4D\u6E2D\u8C13\u5C09\u6170\u536B\u761F\u6E29\u868A\u6587\u95FB\u7EB9\u543B\u7A33\u7D0A\u95EE\u55E1\u7FC1\u74EE\u631D\u8717\u6DA1\u7A9D\u6211\u65A1\u5367\u63E1\u6C83\u5DEB\u545C\u94A8\u4E4C\u6C61\u8BEC\u5C4B\u65E0\u829C\u68A7\u543E\u5434\u6BCB\u6B66\u4E94\u6342\u5348\u821E\u4F0D\u4FAE\u575E\u620A\u96FE\u6664\u7269\u52FF\u52A1\u609F\u8BEF\u6614\u7199\u6790\u897F\u7852\u77FD\u6670\u563B\u5438\u9521\u727A\"],\n[\"cf40\",\"\u87A5\u87A6\u87A7\u87A9\u87AA\u87AE\u87B0\u87B1\u87B2\u87B4\u87B6\u87B7\u87B8\u87B9\u87BB\u87BC\u87BE\u87BF\u87C1\",4,\"\u87C7\u87C8\u87C9\u87CC\",4,\"\u87D4\",6,\"\u87DC\u87DD\u87DE\u87DF\u87E1\u87E2\u87E3\u87E4\u87E6\u87E7\u87E8\u87E9\u87EB\u87EC\u87ED\u87EF\",9],\n[\"cf80\",\"\u87FA\u87FB\u87FC\u87FD\u87FF\u8800\u8801\u8802\u8804\",5,\"\u880B\",7,\"\u8814\u8817\u8818\u8819\u881A\u881C\",4,\"\u8823\u7A00\u606F\u5E0C\u6089\u819D\u5915\u60DC\u7184\u70EF\u6EAA\u6C50\u7280\u6A84\u88AD\u5E2D\u4E60\u5AB3\u559C\u94E3\u6D17\u7CFB\u9699\u620F\u7EC6\u778E\u867E\u5323\u971E\u8F96\u6687\u5CE1\u4FA0\u72ED\u4E0B\u53A6\u590F\u5413\u6380\u9528\u5148\u4ED9\u9C9C\u7EA4\u54B8\u8D24\u8854\u8237\u95F2\u6D8E\u5F26\u5ACC\u663E\u9669\u73B0\u732E\u53BF\u817A\u9985\u7FA1\u5BAA\u9677\u9650\u7EBF\u76F8\u53A2\u9576\u9999\u7BB1\u8944\u6E58\u4E61\u7FD4\u7965\u8BE6\u60F3\u54CD\u4EAB\u9879\u5DF7\u6A61\u50CF\u5411\u8C61\u8427\u785D\u9704\u524A\u54EE\u56A3\u9500\u6D88\u5BB5\u6DC6\u6653\"],\n[\"d040\",\"\u8824\",13,\"\u8833\",5,\"\u883A\u883B\u883D\u883E\u883F\u8841\u8842\u8843\u8846\",5,\"\u884E\",5,\"\u8855\u8856\u8858\u885A\",6,\"\u8866\u8867\u886A\u886D\u886F\u8871\u8873\u8874\u8875\u8876\u8878\u8879\u887A\"],\n[\"d080\",\"\u887B\u887C\u8880\u8883\u8886\u8887\u8889\u888A\u888C\u888E\u888F\u8890\u8891\u8893\u8894\u8895\u8897\",4,\"\u889D\",4,\"\u88A3\u88A5\",5,\"\u5C0F\u5B5D\u6821\u8096\u5578\u7B11\u6548\u6954\u4E9B\u6B47\u874E\u978B\u534F\u631F\u643A\u90AA\u659C\u80C1\u8C10\u5199\u68B0\u5378\u87F9\u61C8\u6CC4\u6CFB\u8C22\u5C51\u85AA\u82AF\u950C\u6B23\u8F9B\u65B0\u5FFB\u5FC3\u4FE1\u8845\u661F\u8165\u7329\u60FA\u5174\u5211\u578B\u5F62\u90A2\u884C\u9192\u5E78\u674F\u6027\u59D3\u5144\u51F6\u80F8\u5308\u6C79\u96C4\u718A\u4F11\u4FEE\u7F9E\u673D\u55C5\u9508\u79C0\u8896\u7EE3\u589F\u620C\u9700\u865A\u5618\u987B\u5F90\u8BB8\u84C4\u9157\u53D9\u65ED\u5E8F\u755C\u6064\u7D6E\u5A7F\u7EEA\u7EED\u8F69\u55A7\u5BA3\u60AC\u65CB\u7384\"],\n[\"d140\",\"\u88AC\u88AE\u88AF\u88B0\u88B2\",4,\"\u88B8\u88B9\u88BA\u88BB\u88BD\u88BE\u88BF\u88C0\u88C3\u88C4\u88C7\u88C8\u88CA\u88CB\u88CC\u88CD\u88CF\u88D0\u88D1\u88D3\u88D6\u88D7\u88DA\",4,\"\u88E0\u88E1\u88E6\u88E7\u88E9\",6,\"\u88F2\u88F5\u88F6\u88F7\u88FA\u88FB\u88FD\u88FF\u8900\u8901\u8903\",5],\n[\"d180\",\"\u8909\u890B\",4,\"\u8911\u8914\",4,\"\u891C\",4,\"\u8922\u8923\u8924\u8926\u8927\u8928\u8929\u892C\u892D\u892E\u892F\u8931\u8932\u8933\u8935\u8937\u9009\u7663\u7729\u7EDA\u9774\u859B\u5B66\u7A74\u96EA\u8840\u52CB\u718F\u5FAA\u65EC\u8BE2\u5BFB\u9A6F\u5DE1\u6B89\u6C5B\u8BAD\u8BAF\u900A\u8FC5\u538B\u62BC\u9E26\u9E2D\u5440\u4E2B\u82BD\u7259\u869C\u5D16\u8859\u6DAF\u96C5\u54D1\u4E9A\u8BB6\u7109\u54BD\u9609\u70DF\u6DF9\u76D0\u4E25\u7814\u8712\u5CA9\u5EF6\u8A00\u989C\u960E\u708E\u6CBF\u5944\u63A9\u773C\u884D\u6F14\u8273\u5830\u71D5\u538C\u781A\u96C1\u5501\u5F66\u7130\u5BB4\u8C1A\u9A8C\u6B83\u592E\u9E2F\u79E7\u6768\u626C\u4F6F\u75A1\u7F8A\u6D0B\u9633\u6C27\u4EF0\u75D2\u517B\u6837\u6F3E\u9080\u8170\u5996\u7476\"],\n[\"d240\",\"\u8938\",8,\"\u8942\u8943\u8945\",24,\"\u8960\",5,\"\u8967\",19,\"\u897C\"],\n[\"d280\",\"\u897D\u897E\u8980\u8982\u8984\u8985\u8987\",26,\"\u6447\u5C27\u9065\u7A91\u8C23\u59DA\u54AC\u8200\u836F\u8981\u8000\u6930\u564E\u8036\u7237\u91CE\u51B6\u4E5F\u9875\u6396\u4E1A\u53F6\u66F3\u814B\u591C\u6DB2\u4E00\u58F9\u533B\u63D6\u94F1\u4F9D\u4F0A\u8863\u9890\u5937\u9057\u79FB\u4EEA\u80F0\u7591\u6C82\u5B9C\u59E8\u5F5D\u6905\u8681\u501A\u5DF2\u4E59\u77E3\u4EE5\u827A\u6291\u6613\u9091\u5C79\u4EBF\u5F79\u81C6\u9038\u8084\u75AB\u4EA6\u88D4\u610F\u6BC5\u5FC6\u4E49\u76CA\u6EA2\u8BE3\u8BAE\u8C0A\u8BD1\u5F02\u7FFC\u7FCC\u7ECE\u8335\u836B\u56E0\u6BB7\u97F3\u9634\u59FB\u541F\u94F6\u6DEB\u5BC5\u996E\u5C39\u5F15\u9690\"],\n[\"d340\",\"\u89A2\",30,\"\u89C3\u89CD\u89D3\u89D4\u89D5\u89D7\u89D8\u89D9\u89DB\u89DD\u89DF\u89E0\u89E1\u89E2\u89E4\u89E7\u89E8\u89E9\u89EA\u89EC\u89ED\u89EE\u89F0\u89F1\u89F2\u89F4\",6],\n[\"d380\",\"\u89FB\",4,\"\u8A01\",5,\"\u8A08\",21,\"\u5370\u82F1\u6A31\u5A74\u9E70\u5E94\u7F28\u83B9\u8424\u8425\u8367\u8747\u8FCE\u8D62\u76C8\u5F71\u9896\u786C\u6620\u54DF\u62E5\u4F63\u81C3\u75C8\u5EB8\u96CD\u8E0A\u86F9\u548F\u6CF3\u6D8C\u6C38\u607F\u52C7\u7528\u5E7D\u4F18\u60A0\u5FE7\u5C24\u7531\u90AE\u94C0\u72B9\u6CB9\u6E38\u9149\u6709\u53CB\u53F3\u4F51\u91C9\u8BF1\u53C8\u5E7C\u8FC2\u6DE4\u4E8E\u76C2\u6986\u865E\u611A\u8206\u4F59\u4FDE\u903E\u9C7C\u6109\u6E1D\u6E14\u9685\u4E88\u5A31\u96E8\u4E0E\u5C7F\u79B9\u5B87\u8BED\u7FBD\u7389\u57DF\u828B\u90C1\u5401\u9047\u55BB\u5CEA\u5FA1\u6108\u6B32\u72F1\u80B2\u8A89\"],\n[\"d440\",\"\u8A1E\",31,\"\u8A3F\",8,\"\u8A49\",21],\n[\"d480\",\"\u8A5F\",25,\"\u8A7A\",6,\"\u6D74\u5BD3\u88D5\u9884\u8C6B\u9A6D\u9E33\u6E0A\u51A4\u5143\u57A3\u8881\u539F\u63F4\u8F95\u56ED\u5458\u5706\u733F\u6E90\u7F18\u8FDC\u82D1\u613F\u6028\u9662\u66F0\u7EA6\u8D8A\u8DC3\u94A5\u5CB3\u7CA4\u6708\u60A6\u9605\u8018\u4E91\u90E7\u5300\u9668\u5141\u8FD0\u8574\u915D\u6655\u97F5\u5B55\u531D\u7838\u6742\u683D\u54C9\u707E\u5BB0\u8F7D\u518D\u5728\u54B1\u6512\u6682\u8D5E\u8D43\u810F\u846C\u906D\u7CDF\u51FF\u85FB\u67A3\u65E9\u6FA1\u86A4\u8E81\u566A\u9020\u7682\u7076\u71E5\u8D23\u62E9\u5219\u6CFD\u8D3C\u600E\u589E\u618E\u66FE\u8D60\u624E\u55B3\u6E23\u672D\u8F67\"],\n[\"d540\",\"\u8A81\",7,\"\u8A8B\",7,\"\u8A94\",46],\n[\"d580\",\"\u8AC3\",32,\"\u94E1\u95F8\u7728\u6805\u69A8\u548B\u4E4D\u70B8\u8BC8\u6458\u658B\u5B85\u7A84\u503A\u5BE8\u77BB\u6BE1\u8A79\u7C98\u6CBE\u76CF\u65A9\u8F97\u5D2D\u5C55\u8638\u6808\u5360\u6218\u7AD9\u6E5B\u7EFD\u6A1F\u7AE0\u5F70\u6F33\u5F20\u638C\u6DA8\u6756\u4E08\u5E10\u8D26\u4ED7\u80C0\u7634\u969C\u62DB\u662D\u627E\u6CBC\u8D75\u7167\u7F69\u5146\u8087\u53EC\u906E\u6298\u54F2\u86F0\u8F99\u8005\u9517\u8517\u8FD9\u6D59\u73CD\u659F\u771F\u7504\u7827\u81FB\u8D1E\u9488\u4FA6\u6795\u75B9\u8BCA\u9707\u632F\u9547\u9635\u84B8\u6323\u7741\u5F81\u72F0\u4E89\u6014\u6574\u62EF\u6B63\u653F\"],\n[\"d640\",\"\u8AE4\",34,\"\u8B08\",27],\n[\"d680\",\"\u8B24\u8B25\u8B27\",30,\"\u5E27\u75C7\u90D1\u8BC1\u829D\u679D\u652F\u5431\u8718\u77E5\u80A2\u8102\u6C41\u4E4B\u7EC7\u804C\u76F4\u690D\u6B96\u6267\u503C\u4F84\u5740\u6307\u6B62\u8DBE\u53EA\u65E8\u7EB8\u5FD7\u631A\u63B7\u81F3\u81F4\u7F6E\u5E1C\u5CD9\u5236\u667A\u79E9\u7A1A\u8D28\u7099\u75D4\u6EDE\u6CBB\u7A92\u4E2D\u76C5\u5FE0\u949F\u8877\u7EC8\u79CD\u80BF\u91CD\u4EF2\u4F17\u821F\u5468\u5DDE\u6D32\u8BCC\u7CA5\u8F74\u8098\u5E1A\u5492\u76B1\u5B99\u663C\u9AA4\u73E0\u682A\u86DB\u6731\u732A\u8BF8\u8BDB\u9010\u7AF9\u70DB\u716E\u62C4\u77A9\u5631\u4E3B\u8457\u67F1\u52A9\u86C0\u8D2E\u94F8\u7B51\"],\n[\"d740\",\"\u8B46\",31,\"\u8B67\",4,\"\u8B6D\",25],\n[\"d780\",\"\u8B87\",24,\"\u8BAC\u8BB1\u8BBB\u8BC7\u8BD0\u8BEA\u8C09\u8C1E\u4F4F\u6CE8\u795D\u9A7B\u6293\u722A\u62FD\u4E13\u7816\u8F6C\u64B0\u8D5A\u7BC6\u6869\u5E84\u88C5\u5986\u649E\u58EE\u72B6\u690E\u9525\u8FFD\u8D58\u5760\u7F00\u8C06\u51C6\u6349\u62D9\u5353\u684C\u7422\u8301\u914C\u5544\u7740\u707C\u6D4A\u5179\u54A8\u8D44\u59FF\u6ECB\u6DC4\u5B5C\u7D2B\u4ED4\u7C7D\u6ED3\u5B50\u81EA\u6E0D\u5B57\u9B03\u68D5\u8E2A\u5B97\u7EFC\u603B\u7EB5\u90B9\u8D70\u594F\u63CD\u79DF\u8DB3\u5352\u65CF\u7956\u8BC5\u963B\u7EC4\u94BB\u7E82\u5634\u9189\u6700\u7F6A\u5C0A\u9075\u6628\u5DE6\u4F50\u67DE\u505A\u4F5C\u5750\u5EA7\"],\n[\"d840\",\"\u8C38\",8,\"\u8C42\u8C43\u8C44\u8C45\u8C48\u8C4A\u8C4B\u8C4D\",7,\"\u8C56\u8C57\u8C58\u8C59\u8C5B\",5,\"\u8C63\",6,\"\u8C6C\",6,\"\u8C74\u8C75\u8C76\u8C77\u8C7B\",6,\"\u8C83\u8C84\u8C86\u8C87\"],\n[\"d880\",\"\u8C88\u8C8B\u8C8D\",6,\"\u8C95\u8C96\u8C97\u8C99\",20,\"\u4E8D\u4E0C\u5140\u4E10\u5EFF\u5345\u4E15\u4E98\u4E1E\u9B32\u5B6C\u5669\u4E28\u79BA\u4E3F\u5315\u4E47\u592D\u723B\u536E\u6C10\u56DF\u80E4\u9997\u6BD3\u777E\u9F17\u4E36\u4E9F\u9F10\u4E5C\u4E69\u4E93\u8288\u5B5B\u556C\u560F\u4EC4\u538D\u539D\u53A3\u53A5\u53AE\u9765\u8D5D\u531A\u53F5\u5326\u532E\u533E\u8D5C\u5366\u5363\u5202\u5208\u520E\u522D\u5233\u523F\u5240\u524C\u525E\u5261\u525C\u84AF\u527D\u5282\u5281\u5290\u5293\u5182\u7F54\u4EBB\u4EC3\u4EC9\u4EC2\u4EE8\u4EE1\u4EEB\u4EDE\u4F1B\u4EF3\u4F22\u4F64\u4EF5\u4F25\u4F27\u4F09\u4F2B\u4F5E\u4F67\u6538\u4F5A\u4F5D\"],\n[\"d940\",\"\u8CAE\",62],\n[\"d980\",\"\u8CED\",32,\"\u4F5F\u4F57\u4F32\u4F3D\u4F76\u4F74\u4F91\u4F89\u4F83\u4F8F\u4F7E\u4F7B\u4FAA\u4F7C\u4FAC\u4F94\u4FE6\u4FE8\u4FEA\u4FC5\u4FDA\u4FE3\u4FDC\u4FD1\u4FDF\u4FF8\u5029\u504C\u4FF3\u502C\u500F\u502E\u502D\u4FFE\u501C\u500C\u5025\u5028\u507E\u5043\u5055\u5048\u504E\u506C\u507B\u50A5\u50A7\u50A9\u50BA\u50D6\u5106\u50ED\u50EC\u50E6\u50EE\u5107\u510B\u4EDD\u6C3D\u4F58\u4F65\u4FCE\u9FA0\u6C46\u7C74\u516E\u5DFD\u9EC9\u9998\u5181\u5914\u52F9\u530D\u8A07\u5310\u51EB\u5919\u5155\u4EA0\u5156\u4EB3\u886E\u88A4\u4EB5\u8114\u88D2\u7980\u5B34\u8803\u7FB8\u51AB\u51B1\u51BD\u51BC\"],\n[\"da40\",\"\u8D0E\",14,\"\u8D20\u8D51\u8D52\u8D57\u8D5F\u8D65\u8D68\u8D69\u8D6A\u8D6C\u8D6E\u8D6F\u8D71\u8D72\u8D78\",8,\"\u8D82\u8D83\u8D86\u8D87\u8D88\u8D89\u8D8C\",4,\"\u8D92\u8D93\u8D95\",9,\"\u8DA0\u8DA1\"],\n[\"da80\",\"\u8DA2\u8DA4\",12,\"\u8DB2\u8DB6\u8DB7\u8DB9\u8DBB\u8DBD\u8DC0\u8DC1\u8DC2\u8DC5\u8DC7\u8DC8\u8DC9\u8DCA\u8DCD\u8DD0\u8DD2\u8DD3\u8DD4\u51C7\u5196\u51A2\u51A5\u8BA0\u8BA6\u8BA7\u8BAA\u8BB4\u8BB5\u8BB7\u8BC2\u8BC3\u8BCB\u8BCF\u8BCE\u8BD2\u8BD3\u8BD4\u8BD6\u8BD8\u8BD9\u8BDC\u8BDF\u8BE0\u8BE4\u8BE8\u8BE9\u8BEE\u8BF0\u8BF3\u8BF6\u8BF9\u8BFC\u8BFF\u8C00\u8C02\u8C04\u8C07\u8C0C\u8C0F\u8C11\u8C12\u8C14\u8C15\u8C16\u8C19\u8C1B\u8C18\u8C1D\u8C1F\u8C20\u8C21\u8C25\u8C27\u8C2A\u8C2B\u8C2E\u8C2F\u8C32\u8C33\u8C35\u8C36\u5369\u537A\u961D\u9622\u9621\u9631\u962A\u963D\u963C\u9642\u9649\u9654\u965F\u9667\u966C\u9672\u9674\u9688\u968D\u9697\u96B0\u9097\u909B\u909D\u9099\u90AC\u90A1\u90B4\u90B3\u90B6\u90BA\"],\n[\"db40\",\"\u8DD5\u8DD8\u8DD9\u8DDC\u8DE0\u8DE1\u8DE2\u8DE5\u8DE6\u8DE7\u8DE9\u8DED\u8DEE\u8DF0\u8DF1\u8DF2\u8DF4\u8DF6\u8DFC\u8DFE\",6,\"\u8E06\u8E07\u8E08\u8E0B\u8E0D\u8E0E\u8E10\u8E11\u8E12\u8E13\u8E15\",7,\"\u8E20\u8E21\u8E24\",4,\"\u8E2B\u8E2D\u8E30\u8E32\u8E33\u8E34\u8E36\u8E37\u8E38\u8E3B\u8E3C\u8E3E\"],\n[\"db80\",\"\u8E3F\u8E43\u8E45\u8E46\u8E4C\",4,\"\u8E53\",5,\"\u8E5A\",11,\"\u8E67\u8E68\u8E6A\u8E6B\u8E6E\u8E71\u90B8\u90B0\u90CF\u90C5\u90BE\u90D0\u90C4\u90C7\u90D3\u90E6\u90E2\u90DC\u90D7\u90DB\u90EB\u90EF\u90FE\u9104\u9122\u911E\u9123\u9131\u912F\u9139\u9143\u9146\u520D\u5942\u52A2\u52AC\u52AD\u52BE\u54FF\u52D0\u52D6\u52F0\u53DF\u71EE\u77CD\u5EF4\u51F5\u51FC\u9B2F\u53B6\u5F01\u755A\u5DEF\u574C\u57A9\u57A1\u587E\u58BC\u58C5\u58D1\u5729\u572C\u572A\u5733\u5739\u572E\u572F\u575C\u573B\u5742\u5769\u5785\u576B\u5786\u577C\u577B\u5768\u576D\u5776\u5773\u57AD\u57A4\u578C\u57B2\u57CF\u57A7\u57B4\u5793\u57A0\u57D5\u57D8\u57DA\u57D9\u57D2\u57B8\u57F4\u57EF\u57F8\u57E4\u57DD\"],\n[\"dc40\",\"\u8E73\u8E75\u8E77\",4,\"\u8E7D\u8E7E\u8E80\u8E82\u8E83\u8E84\u8E86\u8E88\",6,\"\u8E91\u8E92\u8E93\u8E95\",6,\"\u8E9D\u8E9F\",11,\"\u8EAD\u8EAE\u8EB0\u8EB1\u8EB3\",6,\"\u8EBB\",7],\n[\"dc80\",\"\u8EC3\",10,\"\u8ECF\",21,\"\u580B\u580D\u57FD\u57ED\u5800\u581E\u5819\u5844\u5820\u5865\u586C\u5881\u5889\u589A\u5880\u99A8\u9F19\u61FF\u8279\u827D\u827F\u828F\u828A\u82A8\u8284\u828E\u8291\u8297\u8299\u82AB\u82B8\u82BE\u82B0\u82C8\u82CA\u82E3\u8298\u82B7\u82AE\u82CB\u82CC\u82C1\u82A9\u82B4\u82A1\u82AA\u829F\u82C4\u82CE\u82A4\u82E1\u8309\u82F7\u82E4\u830F\u8307\u82DC\u82F4\u82D2\u82D8\u830C\u82FB\u82D3\u8311\u831A\u8306\u8314\u8315\u82E0\u82D5\u831C\u8351\u835B\u835C\u8308\u8392\u833C\u8334\u8331\u839B\u835E\u832F\u834F\u8347\u8343\u835F\u8340\u8317\u8360\u832D\u833A\u8333\u8366\u8365\"],\n[\"dd40\",\"\u8EE5\",62],\n[\"dd80\",\"\u8F24\",32,\"\u8368\u831B\u8369\u836C\u836A\u836D\u836E\u83B0\u8378\u83B3\u83B4\u83A0\u83AA\u8393\u839C\u8385\u837C\u83B6\u83A9\u837D\u83B8\u837B\u8398\u839E\u83A8\u83BA\u83BC\u83C1\u8401\u83E5\u83D8\u5807\u8418\u840B\u83DD\u83FD\u83D6\u841C\u8438\u8411\u8406\u83D4\u83DF\u840F\u8403\u83F8\u83F9\u83EA\u83C5\u83C0\u8426\u83F0\u83E1\u845C\u8451\u845A\u8459\u8473\u8487\u8488\u847A\u8489\u8478\u843C\u8446\u8469\u8476\u848C\u848E\u8431\u846D\u84C1\u84CD\u84D0\u84E6\u84BD\u84D3\u84CA\u84BF\u84BA\u84E0\u84A1\u84B9\u84B4\u8497\u84E5\u84E3\u850C\u750D\u8538\u84F0\u8539\u851F\u853A\"],\n[\"de40\",\"\u8F45\",32,\"\u8F6A\u8F80\u8F8C\u8F92\u8F9D\u8FA0\u8FA1\u8FA2\u8FA4\u8FA5\u8FA6\u8FA7\u8FAA\u8FAC\u8FAD\u8FAE\u8FAF\u8FB2\u8FB3\u8FB4\u8FB5\u8FB7\u8FB8\u8FBA\u8FBB\u8FBC\u8FBF\u8FC0\u8FC3\u8FC6\"],\n[\"de80\",\"\u8FC9\",4,\"\u8FCF\u8FD2\u8FD6\u8FD7\u8FDA\u8FE0\u8FE1\u8FE3\u8FE7\u8FEC\u8FEF\u8FF1\u8FF2\u8FF4\u8FF5\u8FF6\u8FFA\u8FFB\u8FFC\u8FFE\u8FFF\u9007\u9008\u900C\u900E\u9013\u9015\u9018\u8556\u853B\u84FF\u84FC\u8559\u8548\u8568\u8564\u855E\u857A\u77A2\u8543\u8572\u857B\u85A4\u85A8\u8587\u858F\u8579\u85AE\u859C\u8585\u85B9\u85B7\u85B0\u85D3\u85C1\u85DC\u85FF\u8627\u8605\u8629\u8616\u863C\u5EFE\u5F08\u593C\u5941\u8037\u5955\u595A\u5958\u530F\u5C22\u5C25\u5C2C\u5C34\u624C\u626A\u629F\u62BB\u62CA\u62DA\u62D7\u62EE\u6322\u62F6\u6339\u634B\u6343\u63AD\u63F6\u6371\u637A\u638E\u63B4\u636D\u63AC\u638A\u6369\u63AE\u63BC\u63F2\u63F8\u63E0\u63FF\u63C4\u63DE\u63CE\u6452\u63C6\u63BE\u6445\u6441\u640B\u641B\u6420\u640C\u6426\u6421\u645E\u6484\u646D\u6496\"],\n[\"df40\",\"\u9019\u901C\u9023\u9024\u9025\u9027\",5,\"\u9030\",4,\"\u9037\u9039\u903A\u903D\u903F\u9040\u9043\u9045\u9046\u9048\",4,\"\u904E\u9054\u9055\u9056\u9059\u905A\u905C\",5,\"\u9064\u9066\u9067\u9069\u906A\u906B\u906C\u906F\",4,\"\u9076\",6,\"\u907E\u9081\"],\n[\"df80\",\"\u9084\u9085\u9086\u9087\u9089\u908A\u908C\",4,\"\u9092\u9094\u9096\u9098\u909A\u909C\u909E\u909F\u90A0\u90A4\u90A5\u90A7\u90A8\u90A9\u90AB\u90AD\u90B2\u90B7\u90BC\u90BD\u90BF\u90C0\u647A\u64B7\u64B8\u6499\u64BA\u64C0\u64D0\u64D7\u64E4\u64E2\u6509\u6525\u652E\u5F0B\u5FD2\u7519\u5F11\u535F\u53F1\u53FD\u53E9\u53E8\u53FB\u5412\u5416\u5406\u544B\u5452\u5453\u5454\u5456\u5443\u5421\u5457\u5459\u5423\u5432\u5482\u5494\u5477\u5471\u5464\u549A\u549B\u5484\u5476\u5466\u549D\u54D0\u54AD\u54C2\u54B4\u54D2\u54A7\u54A6\u54D3\u54D4\u5472\u54A3\u54D5\u54BB\u54BF\u54CC\u54D9\u54DA\u54DC\u54A9\u54AA\u54A4\u54DD\u54CF\u54DE\u551B\u54E7\u5520\u54FD\u5514\u54F3\u5522\u5523\u550F\u5511\u5527\u552A\u5567\u558F\u55B5\u5549\u556D\u5541\u5555\u553F\u5550\u553C\"],\n[\"e040\",\"\u90C2\u90C3\u90C6\u90C8\u90C9\u90CB\u90CC\u90CD\u90D2\u90D4\u90D5\u90D6\u90D8\u90D9\u90DA\u90DE\u90DF\u90E0\u90E3\u90E4\u90E5\u90E9\u90EA\u90EC\u90EE\u90F0\u90F1\u90F2\u90F3\u90F5\u90F6\u90F7\u90F9\u90FA\u90FB\u90FC\u90FF\u9100\u9101\u9103\u9105\",19,\"\u911A\u911B\u911C\"],\n[\"e080\",\"\u911D\u911F\u9120\u9121\u9124\",10,\"\u9130\u9132\",6,\"\u913A\",8,\"\u9144\u5537\u5556\u5575\u5576\u5577\u5533\u5530\u555C\u558B\u55D2\u5583\u55B1\u55B9\u5588\u5581\u559F\u557E\u55D6\u5591\u557B\u55DF\u55BD\u55BE\u5594\u5599\u55EA\u55F7\u55C9\u561F\u55D1\u55EB\u55EC\u55D4\u55E6\u55DD\u55C4\u55EF\u55E5\u55F2\u55F3\u55CC\u55CD\u55E8\u55F5\u55E4\u8F94\u561E\u5608\u560C\u5601\u5624\u5623\u55FE\u5600\u5627\u562D\u5658\u5639\u5657\u562C\u564D\u5662\u5659\u565C\u564C\u5654\u5686\u5664\u5671\u566B\u567B\u567C\u5685\u5693\u56AF\u56D4\u56D7\u56DD\u56E1\u56F5\u56EB\u56F9\u56FF\u5704\u570A\u5709\u571C\u5E0F\u5E19\u5E14\u5E11\u5E31\u5E3B\u5E3C\"],\n[\"e140\",\"\u9145\u9147\u9148\u9151\u9153\u9154\u9155\u9156\u9158\u9159\u915B\u915C\u915F\u9160\u9166\u9167\u9168\u916B\u916D\u9173\u917A\u917B\u917C\u9180\",4,\"\u9186\u9188\u918A\u918E\u918F\u9193\",6,\"\u919C\",5,\"\u91A4\",5,\"\u91AB\u91AC\u91B0\u91B1\u91B2\u91B3\u91B6\u91B7\u91B8\u91B9\u91BB\"],\n[\"e180\",\"\u91BC\",10,\"\u91C8\u91CB\u91D0\u91D2\",9,\"\u91DD\",8,\"\u5E37\u5E44\u5E54\u5E5B\u5E5E\u5E61\u5C8C\u5C7A\u5C8D\u5C90\u5C96\u5C88\u5C98\u5C99\u5C91\u5C9A\u5C9C\u5CB5\u5CA2\u5CBD\u5CAC\u5CAB\u5CB1\u5CA3\u5CC1\u5CB7\u5CC4\u5CD2\u5CE4\u5CCB\u5CE5\u5D02\u5D03\u5D27\u5D26\u5D2E\u5D24\u5D1E\u5D06\u5D1B\u5D58\u5D3E\u5D34\u5D3D\u5D6C\u5D5B\u5D6F\u5D5D\u5D6B\u5D4B\u5D4A\u5D69\u5D74\u5D82\u5D99\u5D9D\u8C73\u5DB7\u5DC5\u5F73\u5F77\u5F82\u5F87\u5F89\u5F8C\u5F95\u5F99\u5F9C\u5FA8\u5FAD\u5FB5\u5FBC\u8862\u5F61\u72AD\u72B0\u72B4\u72B7\u72B8\u72C3\u72C1\u72CE\u72CD\u72D2\u72E8\u72EF\u72E9\u72F2\u72F4\u72F7\u7301\u72F3\u7303\u72FA\"],\n[\"e240\",\"\u91E6\",62],\n[\"e280\",\"\u9225\",32,\"\u72FB\u7317\u7313\u7321\u730A\u731E\u731D\u7315\u7322\u7339\u7325\u732C\u7338\u7331\u7350\u734D\u7357\u7360\u736C\u736F\u737E\u821B\u5925\u98E7\u5924\u5902\u9963\u9967\",5,\"\u9974\u9977\u997D\u9980\u9984\u9987\u998A\u998D\u9990\u9991\u9993\u9994\u9995\u5E80\u5E91\u5E8B\u5E96\u5EA5\u5EA0\u5EB9\u5EB5\u5EBE\u5EB3\u8D53\u5ED2\u5ED1\u5EDB\u5EE8\u5EEA\u81BA\u5FC4\u5FC9\u5FD6\u5FCF\u6003\u5FEE\u6004\u5FE1\u5FE4\u5FFE\u6005\u6006\u5FEA\u5FED\u5FF8\u6019\u6035\u6026\u601B\u600F\u600D\u6029\u602B\u600A\u603F\u6021\u6078\u6079\u607B\u607A\u6042\"],\n[\"e340\",\"\u9246\",45,\"\u9275\",16],\n[\"e380\",\"\u9286\",7,\"\u928F\",24,\"\u606A\u607D\u6096\u609A\u60AD\u609D\u6083\u6092\u608C\u609B\u60EC\u60BB\u60B1\u60DD\u60D8\u60C6\u60DA\u60B4\u6120\u6126\u6115\u6123\u60F4\u6100\u610E\u612B\u614A\u6175\u61AC\u6194\u61A7\u61B7\u61D4\u61F5\u5FDD\u96B3\u95E9\u95EB\u95F1\u95F3\u95F5\u95F6\u95FC\u95FE\u9603\u9604\u9606\u9608\u960A\u960B\u960C\u960D\u960F\u9612\u9615\u9616\u9617\u9619\u961A\u4E2C\u723F\u6215\u6C35\u6C54\u6C5C\u6C4A\u6CA3\u6C85\u6C90\u6C94\u6C8C\u6C68\u6C69\u6C74\u6C76\u6C86\u6CA9\u6CD0\u6CD4\u6CAD\u6CF7\u6CF8\u6CF1\u6CD7\u6CB2\u6CE0\u6CD6\u6CFA\u6CEB\u6CEE\u6CB1\u6CD3\u6CEF\u6CFE\"],\n[\"e440\",\"\u92A8\",5,\"\u92AF\",24,\"\u92C9\",31],\n[\"e480\",\"\u92E9\",32,\"\u6D39\u6D27\u6D0C\u6D43\u6D48\u6D07\u6D04\u6D19\u6D0E\u6D2B\u6D4D\u6D2E\u6D35\u6D1A\u6D4F\u6D52\u6D54\u6D33\u6D91\u6D6F\u6D9E\u6DA0\u6D5E\u6D93\u6D94\u6D5C\u6D60\u6D7C\u6D63\u6E1A\u6DC7\u6DC5\u6DDE\u6E0E\u6DBF\u6DE0\u6E11\u6DE6\u6DDD\u6DD9\u6E16\u6DAB\u6E0C\u6DAE\u6E2B\u6E6E\u6E4E\u6E6B\u6EB2\u6E5F\u6E86\u6E53\u6E54\u6E32\u6E25\u6E44\u6EDF\u6EB1\u6E98\u6EE0\u6F2D\u6EE2\u6EA5\u6EA7\u6EBD\u6EBB\u6EB7\u6ED7\u6EB4\u6ECF\u6E8F\u6EC2\u6E9F\u6F62\u6F46\u6F47\u6F24\u6F15\u6EF9\u6F2F\u6F36\u6F4B\u6F74\u6F2A\u6F09\u6F29\u6F89\u6F8D\u6F8C\u6F78\u6F72\u6F7C\u6F7A\u6FD1\"],\n[\"e540\",\"\u930A\",51,\"\u933F\",10],\n[\"e580\",\"\u934A\",31,\"\u936B\u6FC9\u6FA7\u6FB9\u6FB6\u6FC2\u6FE1\u6FEE\u6FDE\u6FE0\u6FEF\u701A\u7023\u701B\u7039\u7035\u704F\u705E\u5B80\u5B84\u5B95\u5B93\u5BA5\u5BB8\u752F\u9A9E\u6434\u5BE4\u5BEE\u8930\u5BF0\u8E47\u8B07\u8FB6\u8FD3\u8FD5\u8FE5\u8FEE\u8FE4\u8FE9\u8FE6\u8FF3\u8FE8\u9005\u9004\u900B\u9026\u9011\u900D\u9016\u9021\u9035\u9036\u902D\u902F\u9044\u9051\u9052\u9050\u9068\u9058\u9062\u905B\u66B9\u9074\u907D\u9082\u9088\u9083\u908B\u5F50\u5F57\u5F56\u5F58\u5C3B\u54AB\u5C50\u5C59\u5B71\u5C63\u5C66\u7FBC\u5F2A\u5F29\u5F2D\u8274\u5F3C\u9B3B\u5C6E\u5981\u5983\u598D\u59A9\u59AA\u59A3\"],\n[\"e640\",\"\u936C\",34,\"\u9390\",27],\n[\"e680\",\"\u93AC\",29,\"\u93CB\u93CC\u93CD\u5997\u59CA\u59AB\u599E\u59A4\u59D2\u59B2\u59AF\u59D7\u59BE\u5A05\u5A06\u59DD\u5A08\u59E3\u59D8\u59F9\u5A0C\u5A09\u5A32\u5A34\u5A11\u5A23\u5A13\u5A40\u5A67\u5A4A\u5A55\u5A3C\u5A62\u5A75\u80EC\u5AAA\u5A9B\u5A77\u5A7A\u5ABE\u5AEB\u5AB2\u5AD2\u5AD4\u5AB8\u5AE0\u5AE3\u5AF1\u5AD6\u5AE6\u5AD8\u5ADC\u5B09\u5B17\u5B16\u5B32\u5B37\u5B40\u5C15\u5C1C\u5B5A\u5B65\u5B73\u5B51\u5B53\u5B62\u9A75\u9A77\u9A78\u9A7A\u9A7F\u9A7D\u9A80\u9A81\u9A85\u9A88\u9A8A\u9A90\u9A92\u9A93\u9A96\u9A98\u9A9B\u9A9C\u9A9D\u9A9F\u9AA0\u9AA2\u9AA3\u9AA5\u9AA7\u7E9F\u7EA1\u7EA3\u7EA5\u7EA8\u7EA9\"],\n[\"e740\",\"\u93CE\",7,\"\u93D7\",54],\n[\"e780\",\"\u940E\",32,\"\u7EAD\u7EB0\u7EBE\u7EC0\u7EC1\u7EC2\u7EC9\u7ECB\u7ECC\u7ED0\u7ED4\u7ED7\u7EDB\u7EE0\u7EE1\u7EE8\u7EEB\u7EEE\u7EEF\u7EF1\u7EF2\u7F0D\u7EF6\u7EFA\u7EFB\u7EFE\u7F01\u7F02\u7F03\u7F07\u7F08\u7F0B\u7F0C\u7F0F\u7F11\u7F12\u7F17\u7F19\u7F1C\u7F1B\u7F1F\u7F21\",6,\"\u7F2A\u7F2B\u7F2C\u7F2D\u7F2F\",4,\"\u7F35\u5E7A\u757F\u5DDB\u753E\u9095\u738E\u7391\u73AE\u73A2\u739F\u73CF\u73C2\u73D1\u73B7\u73B3\u73C0\u73C9\u73C8\u73E5\u73D9\u987C\u740A\u73E9\u73E7\u73DE\u73BA\u73F2\u740F\u742A\u745B\u7426\u7425\u7428\u7430\u742E\u742C\"],\n[\"e840\",\"\u942F\",14,\"\u943F\",43,\"\u946C\u946D\u946E\u946F\"],\n[\"e880\",\"\u9470\",20,\"\u9491\u9496\u9498\u94C7\u94CF\u94D3\u94D4\u94DA\u94E6\u94FB\u951C\u9520\u741B\u741A\u7441\u745C\u7457\u7455\u7459\u7477\u746D\u747E\u749C\u748E\u7480\u7481\u7487\u748B\u749E\u74A8\u74A9\u7490\u74A7\u74D2\u74BA\u97EA\u97EB\u97EC\u674C\u6753\u675E\u6748\u6769\u67A5\u6787\u676A\u6773\u6798\u67A7\u6775\u67A8\u679E\u67AD\u678B\u6777\u677C\u67F0\u6809\u67D8\u680A\u67E9\u67B0\u680C\u67D9\u67B5\u67DA\u67B3\u67DD\u6800\u67C3\u67B8\u67E2\u680E\u67C1\u67FD\u6832\u6833\u6860\u6861\u684E\u6862\u6844\u6864\u6883\u681D\u6855\u6866\u6841\u6867\u6840\u683E\u684A\u6849\u6829\u68B5\u688F\u6874\u6877\u6893\u686B\u68C2\u696E\u68FC\u691F\u6920\u68F9\"],\n[\"e940\",\"\u9527\u9533\u953D\u9543\u9548\u954B\u9555\u955A\u9560\u956E\u9574\u9575\u9577\",7,\"\u9580\",42],\n[\"e980\",\"\u95AB\",32,\"\u6924\u68F0\u690B\u6901\u6957\u68E3\u6910\u6971\u6939\u6960\u6942\u695D\u6984\u696B\u6980\u6998\u6978\u6934\u69CC\u6987\u6988\u69CE\u6989\u6966\u6963\u6979\u699B\u69A7\u69BB\u69AB\u69AD\u69D4\u69B1\u69C1\u69CA\u69DF\u6995\u69E0\u698D\u69FF\u6A2F\u69ED\u6A17\u6A18\u6A65\u69F2\u6A44\u6A3E\u6AA0\u6A50\u6A5B\u6A35\u6A8E\u6A79\u6A3D\u6A28\u6A58\u6A7C\u6A91\u6A90\u6AA9\u6A97\u6AAB\u7337\u7352\u6B81\u6B82\u6B87\u6B84\u6B92\u6B93\u6B8D\u6B9A\u6B9B\u6BA1\u6BAA\u8F6B\u8F6D\u8F71\u8F72\u8F73\u8F75\u8F76\u8F78\u8F77\u8F79\u8F7A\u8F7C\u8F7E\u8F81\u8F82\u8F84\u8F87\u8F8B\"],\n[\"ea40\",\"\u95CC\",27,\"\u95EC\u95FF\u9607\u9613\u9618\u961B\u961E\u9620\u9623\",6,\"\u962B\u962C\u962D\u962F\u9630\u9637\u9638\u9639\u963A\u963E\u9641\u9643\u964A\u964E\u964F\u9651\u9652\u9653\u9656\u9657\"],\n[\"ea80\",\"\u9658\u9659\u965A\u965C\u965D\u965E\u9660\u9663\u9665\u9666\u966B\u966D\",4,\"\u9673\u9678\",12,\"\u9687\u9689\u968A\u8F8D\u8F8E\u8F8F\u8F98\u8F9A\u8ECE\u620B\u6217\u621B\u621F\u6222\u6221\u6225\u6224\u622C\u81E7\u74EF\u74F4\u74FF\u750F\u7511\u7513\u6534\u65EE\u65EF\u65F0\u660A\u6619\u6772\u6603\u6615\u6600\u7085\u66F7\u661D\u6634\u6631\u6636\u6635\u8006\u665F\u6654\u6641\u664F\u6656\u6661\u6657\u6677\u6684\u668C\u66A7\u669D\u66BE\u66DB\u66DC\u66E6\u66E9\u8D32\u8D33\u8D36\u8D3B\u8D3D\u8D40\u8D45\u8D46\u8D48\u8D49\u8D47\u8D4D\u8D55\u8D59\u89C7\u89CA\u89CB\u89CC\u89CE\u89CF\u89D0\u89D1\u726E\u729F\u725D\u7266\u726F\u727E\u727F\u7284\u728B\u728D\u728F\u7292\u6308\u6332\u63B0\"],\n[\"eb40\",\"\u968C\u968E\u9691\u9692\u9693\u9695\u9696\u969A\u969B\u969D\",9,\"\u96A8\",7,\"\u96B1\u96B2\u96B4\u96B5\u96B7\u96B8\u96BA\u96BB\u96BF\u96C2\u96C3\u96C8\u96CA\u96CB\u96D0\u96D1\u96D3\u96D4\u96D6\",9,\"\u96E1\",6,\"\u96EB\"],\n[\"eb80\",\"\u96EC\u96ED\u96EE\u96F0\u96F1\u96F2\u96F4\u96F5\u96F8\u96FA\u96FB\u96FC\u96FD\u96FF\u9702\u9703\u9705\u970A\u970B\u970C\u9710\u9711\u9712\u9714\u9715\u9717\",4,\"\u971D\u971F\u9720\u643F\u64D8\u8004\u6BEA\u6BF3\u6BFD\u6BF5\u6BF9\u6C05\u6C07\u6C06\u6C0D\u6C15\u6C18\u6C19\u6C1A\u6C21\u6C29\u6C24\u6C2A\u6C32\u6535\u6555\u656B\u724D\u7252\u7256\u7230\u8662\u5216\u809F\u809C\u8093\u80BC\u670A\u80BD\u80B1\u80AB\u80AD\u80B4\u80B7\u80E7\u80E8\u80E9\u80EA\u80DB\u80C2\u80C4\u80D9\u80CD\u80D7\u6710\u80DD\u80EB\u80F1\u80F4\u80ED\u810D\u810E\u80F2\u80FC\u6715\u8112\u8C5A\u8136\u811E\u812C\u8118\u8132\u8148\u814C\u8153\u8174\u8159\u815A\u8171\u8160\u8169\u817C\u817D\u816D\u8167\u584D\u5AB5\u8188\u8182\u8191\u6ED5\u81A3\u81AA\u81CC\u6726\u81CA\u81BB\"],\n[\"ec40\",\"\u9721\",8,\"\u972B\u972C\u972E\u972F\u9731\u9733\",4,\"\u973A\u973B\u973C\u973D\u973F\",18,\"\u9754\u9755\u9757\u9758\u975A\u975C\u975D\u975F\u9763\u9764\u9766\u9767\u9768\u976A\",7],\n[\"ec80\",\"\u9772\u9775\u9777\",4,\"\u977D\",7,\"\u9786\",4,\"\u978C\u978E\u978F\u9790\u9793\u9795\u9796\u9797\u9799\",4,\"\u81C1\u81A6\u6B24\u6B37\u6B39\u6B43\u6B46\u6B59\u98D1\u98D2\u98D3\u98D5\u98D9\u98DA\u6BB3\u5F40\u6BC2\u89F3\u6590\u9F51\u6593\u65BC\u65C6\u65C4\u65C3\u65CC\u65CE\u65D2\u65D6\u7080\u709C\u7096\u709D\u70BB\u70C0\u70B7\u70AB\u70B1\u70E8\u70CA\u7110\u7113\u7116\u712F\u7131\u7173\u715C\u7168\u7145\u7172\u714A\u7178\u717A\u7198\u71B3\u71B5\u71A8\u71A0\u71E0\u71D4\u71E7\u71F9\u721D\u7228\u706C\u7118\u7166\u71B9\u623E\u623D\u6243\u6248\u6249\u793B\u7940\u7946\u7949\u795B\u795C\u7953\u795A\u7962\u7957\u7960\u796F\u7967\u797A\u7985\u798A\u799A\u79A7\u79B3\u5FD1\u5FD0\"],\n[\"ed40\",\"\u979E\u979F\u97A1\u97A2\u97A4\",6,\"\u97AC\u97AE\u97B0\u97B1\u97B3\u97B5\",46],\n[\"ed80\",\"\u97E4\u97E5\u97E8\u97EE\",4,\"\u97F4\u97F7\",23,\"\u603C\u605D\u605A\u6067\u6041\u6059\u6063\u60AB\u6106\u610D\u615D\u61A9\u619D\u61CB\u61D1\u6206\u8080\u807F\u6C93\u6CF6\u6DFC\u77F6\u77F8\u7800\u7809\u7817\u7818\u7811\u65AB\u782D\u781C\u781D\u7839\u783A\u783B\u781F\u783C\u7825\u782C\u7823\u7829\u784E\u786D\u7856\u7857\u7826\u7850\u7847\u784C\u786A\u789B\u7893\u789A\u7887\u789C\u78A1\u78A3\u78B2\u78B9\u78A5\u78D4\u78D9\u78C9\u78EC\u78F2\u7905\u78F4\u7913\u7924\u791E\u7934\u9F9B\u9EF9\u9EFB\u9EFC\u76F1\u7704\u770D\u76F9\u7707\u7708\u771A\u7722\u7719\u772D\u7726\u7735\u7738\u7750\u7751\u7747\u7743\u775A\u7768\"],\n[\"ee40\",\"\u980F\",62],\n[\"ee80\",\"\u984E\",32,\"\u7762\u7765\u777F\u778D\u777D\u7780\u778C\u7791\u779F\u77A0\u77B0\u77B5\u77BD\u753A\u7540\u754E\u754B\u7548\u755B\u7572\u7579\u7583\u7F58\u7F61\u7F5F\u8A48\u7F68\u7F74\u7F71\u7F79\u7F81\u7F7E\u76CD\u76E5\u8832\u9485\u9486\u9487\u948B\u948A\u948C\u948D\u948F\u9490\u9494\u9497\u9495\u949A\u949B\u949C\u94A3\u94A4\u94AB\u94AA\u94AD\u94AC\u94AF\u94B0\u94B2\u94B4\u94B6\",4,\"\u94BC\u94BD\u94BF\u94C4\u94C8\",6,\"\u94D0\u94D1\u94D2\u94D5\u94D6\u94D7\u94D9\u94D8\u94DB\u94DE\u94DF\u94E0\u94E2\u94E4\u94E5\u94E7\u94E8\u94EA\"],\n[\"ef40\",\"\u986F\",5,\"\u988B\u988E\u9892\u9895\u9899\u98A3\u98A8\",37,\"\u98CF\u98D0\u98D4\u98D6\u98D7\u98DB\u98DC\u98DD\u98E0\",4],\n[\"ef80\",\"\u98E5\u98E6\u98E9\",30,\"\u94E9\u94EB\u94EE\u94EF\u94F3\u94F4\u94F5\u94F7\u94F9\u94FC\u94FD\u94FF\u9503\u9502\u9506\u9507\u9509\u950A\u950D\u950E\u950F\u9512\",4,\"\u9518\u951B\u951D\u951E\u951F\u9522\u952A\u952B\u9529\u952C\u9531\u9532\u9534\u9536\u9537\u9538\u953C\u953E\u953F\u9542\u9535\u9544\u9545\u9546\u9549\u954C\u954E\u954F\u9552\u9553\u9554\u9556\u9557\u9558\u9559\u955B\u955E\u955F\u955D\u9561\u9562\u9564\",8,\"\u956F\u9571\u9572\u9573\u953A\u77E7\u77EC\u96C9\u79D5\u79ED\u79E3\u79EB\u7A06\u5D47\u7A03\u7A02\u7A1E\u7A14\"],\n[\"f040\",\"\u9908\",4,\"\u990E\u990F\u9911\",28,\"\u992F\",26],\n[\"f080\",\"\u994A\",9,\"\u9956\",12,\"\u9964\u9966\u9973\u9978\u9979\u997B\u997E\u9982\u9983\u9989\u7A39\u7A37\u7A51\u9ECF\u99A5\u7A70\u7688\u768E\u7693\u7699\u76A4\u74DE\u74E0\u752C\u9E20\u9E22\u9E28\",4,\"\u9E32\u9E31\u9E36\u9E38\u9E37\u9E39\u9E3A\u9E3E\u9E41\u9E42\u9E44\u9E46\u9E47\u9E48\u9E49\u9E4B\u9E4C\u9E4E\u9E51\u9E55\u9E57\u9E5A\u9E5B\u9E5C\u9E5E\u9E63\u9E66\",6,\"\u9E71\u9E6D\u9E73\u7592\u7594\u7596\u75A0\u759D\u75AC\u75A3\u75B3\u75B4\u75B8\u75C4\u75B1\u75B0\u75C3\u75C2\u75D6\u75CD\u75E3\u75E8\u75E6\u75E4\u75EB\u75E7\u7603\u75F1\u75FC\u75FF\u7610\u7600\u7605\u760C\u7617\u760A\u7625\u7618\u7615\u7619\"],\n[\"f140\",\"\u998C\u998E\u999A\",10,\"\u99A6\u99A7\u99A9\",47],\n[\"f180\",\"\u99D9\",32,\"\u761B\u763C\u7622\u7620\u7640\u762D\u7630\u763F\u7635\u7643\u763E\u7633\u764D\u765E\u7654\u765C\u7656\u766B\u766F\u7FCA\u7AE6\u7A78\u7A79\u7A80\u7A86\u7A88\u7A95\u7AA6\u7AA0\u7AAC\u7AA8\u7AAD\u7AB3\u8864\u8869\u8872\u887D\u887F\u8882\u88A2\u88C6\u88B7\u88BC\u88C9\u88E2\u88CE\u88E3\u88E5\u88F1\u891A\u88FC\u88E8\u88FE\u88F0\u8921\u8919\u8913\u891B\u890A\u8934\u892B\u8936\u8941\u8966\u897B\u758B\u80E5\u76B2\u76B4\u77DC\u8012\u8014\u8016\u801C\u8020\u8022\u8025\u8026\u8027\u8029\u8028\u8031\u800B\u8035\u8043\u8046\u804D\u8052\u8069\u8071\u8983\u9878\u9880\u9883\"],\n[\"f240\",\"\u99FA\",62],\n[\"f280\",\"\u9A39\",32,\"\u9889\u988C\u988D\u988F\u9894\u989A\u989B\u989E\u989F\u98A1\u98A2\u98A5\u98A6\u864D\u8654\u866C\u866E\u867F\u867A\u867C\u867B\u86A8\u868D\u868B\u86AC\u869D\u86A7\u86A3\u86AA\u8693\u86A9\u86B6\u86C4\u86B5\u86CE\u86B0\u86BA\u86B1\u86AF\u86C9\u86CF\u86B4\u86E9\u86F1\u86F2\u86ED\u86F3\u86D0\u8713\u86DE\u86F4\u86DF\u86D8\u86D1\u8703\u8707\u86F8\u8708\u870A\u870D\u8709\u8723\u873B\u871E\u8725\u872E\u871A\u873E\u8748\u8734\u8731\u8729\u8737\u873F\u8782\u8722\u877D\u877E\u877B\u8760\u8770\u874C\u876E\u878B\u8753\u8763\u877C\u8764\u8759\u8765\u8793\u87AF\u87A8\u87D2\"],\n[\"f340\",\"\u9A5A\",17,\"\u9A72\u9A83\u9A89\u9A8D\u9A8E\u9A94\u9A95\u9A99\u9AA6\u9AA9\",6,\"\u9AB2\u9AB3\u9AB4\u9AB5\u9AB9\u9ABB\u9ABD\u9ABE\u9ABF\u9AC3\u9AC4\u9AC6\",4,\"\u9ACD\u9ACE\u9ACF\u9AD0\u9AD2\u9AD4\u9AD5\u9AD6\u9AD7\u9AD9\u9ADA\u9ADB\u9ADC\"],\n[\"f380\",\"\u9ADD\u9ADE\u9AE0\u9AE2\u9AE3\u9AE4\u9AE5\u9AE7\u9AE8\u9AE9\u9AEA\u9AEC\u9AEE\u9AF0\",8,\"\u9AFA\u9AFC\",6,\"\u9B04\u9B05\u9B06\u87C6\u8788\u8785\u87AD\u8797\u8783\u87AB\u87E5\u87AC\u87B5\u87B3\u87CB\u87D3\u87BD\u87D1\u87C0\u87CA\u87DB\u87EA\u87E0\u87EE\u8816\u8813\u87FE\u880A\u881B\u8821\u8839\u883C\u7F36\u7F42\u7F44\u7F45\u8210\u7AFA\u7AFD\u7B08\u7B03\u7B04\u7B15\u7B0A\u7B2B\u7B0F\u7B47\u7B38\u7B2A\u7B19\u7B2E\u7B31\u7B20\u7B25\u7B24\u7B33\u7B3E\u7B1E\u7B58\u7B5A\u7B45\u7B75\u7B4C\u7B5D\u7B60\u7B6E\u7B7B\u7B62\u7B72\u7B71\u7B90\u7BA6\u7BA7\u7BB8\u7BAC\u7B9D\u7BA8\u7B85\u7BAA\u7B9C\u7BA2\u7BAB\u7BB4\u7BD1\u7BC1\u7BCC\u7BDD\u7BDA\u7BE5\u7BE6\u7BEA\u7C0C\u7BFE\u7BFC\u7C0F\u7C16\u7C0B\"],\n[\"f440\",\"\u9B07\u9B09\",5,\"\u9B10\u9B11\u9B12\u9B14\",10,\"\u9B20\u9B21\u9B22\u9B24\",10,\"\u9B30\u9B31\u9B33\",7,\"\u9B3D\u9B3E\u9B3F\u9B40\u9B46\u9B4A\u9B4B\u9B4C\u9B4E\u9B50\u9B52\u9B53\u9B55\",5],\n[\"f480\",\"\u9B5B\",32,\"\u7C1F\u7C2A\u7C26\u7C38\u7C41\u7C40\u81FE\u8201\u8202\u8204\u81EC\u8844\u8221\u8222\u8223\u822D\u822F\u8228\u822B\u8238\u823B\u8233\u8234\u823E\u8244\u8249\u824B\u824F\u825A\u825F\u8268\u887E\u8885\u8888\u88D8\u88DF\u895E\u7F9D\u7F9F\u7FA7\u7FAF\u7FB0\u7FB2\u7C7C\u6549\u7C91\u7C9D\u7C9C\u7C9E\u7CA2\u7CB2\u7CBC\u7CBD\u7CC1\u7CC7\u7CCC\u7CCD\u7CC8\u7CC5\u7CD7\u7CE8\u826E\u66A8\u7FBF\u7FCE\u7FD5\u7FE5\u7FE1\u7FE6\u7FE9\u7FEE\u7FF3\u7CF8\u7D77\u7DA6\u7DAE\u7E47\u7E9B\u9EB8\u9EB4\u8D73\u8D84\u8D94\u8D91\u8DB1\u8D67\u8D6D\u8C47\u8C49\u914A\u9150\u914E\u914F\u9164\"],\n[\"f540\",\"\u9B7C\",62],\n[\"f580\",\"\u9BBB\",32,\"\u9162\u9161\u9170\u9169\u916F\u917D\u917E\u9172\u9174\u9179\u918C\u9185\u9190\u918D\u9191\u91A2\u91A3\u91AA\u91AD\u91AE\u91AF\u91B5\u91B4\u91BA\u8C55\u9E7E\u8DB8\u8DEB\u8E05\u8E59\u8E69\u8DB5\u8DBF\u8DBC\u8DBA\u8DC4\u8DD6\u8DD7\u8DDA\u8DDE\u8DCE\u8DCF\u8DDB\u8DC6\u8DEC\u8DF7\u8DF8\u8DE3\u8DF9\u8DFB\u8DE4\u8E09\u8DFD\u8E14\u8E1D\u8E1F\u8E2C\u8E2E\u8E23\u8E2F\u8E3A\u8E40\u8E39\u8E35\u8E3D\u8E31\u8E49\u8E41\u8E42\u8E51\u8E52\u8E4A\u8E70\u8E76\u8E7C\u8E6F\u8E74\u8E85\u8E8F\u8E94\u8E90\u8E9C\u8E9E\u8C78\u8C82\u8C8A\u8C85\u8C98\u8C94\u659B\u89D6\u89DE\u89DA\u89DC\"],\n[\"f640\",\"\u9BDC\",62],\n[\"f680\",\"\u9C1B\",32,\"\u89E5\u89EB\u89EF\u8A3E\u8B26\u9753\u96E9\u96F3\u96EF\u9706\u9701\u9708\u970F\u970E\u972A\u972D\u9730\u973E\u9F80\u9F83\u9F85\",5,\"\u9F8C\u9EFE\u9F0B\u9F0D\u96B9\u96BC\u96BD\u96CE\u96D2\u77BF\u96E0\u928E\u92AE\u92C8\u933E\u936A\u93CA\u938F\u943E\u946B\u9C7F\u9C82\u9C85\u9C86\u9C87\u9C88\u7A23\u9C8B\u9C8E\u9C90\u9C91\u9C92\u9C94\u9C95\u9C9A\u9C9B\u9C9E\",5,\"\u9CA5\",4,\"\u9CAB\u9CAD\u9CAE\u9CB0\",7,\"\u9CBA\u9CBB\u9CBC\u9CBD\u9CC4\u9CC5\u9CC6\u9CC7\u9CCA\u9CCB\"],\n[\"f740\",\"\u9C3C\",62],\n[\"f780\",\"\u9C7B\u9C7D\u9C7E\u9C80\u9C83\u9C84\u9C89\u9C8A\u9C8C\u9C8F\u9C93\u9C96\u9C97\u9C98\u9C99\u9C9D\u9CAA\u9CAC\u9CAF\u9CB9\u9CBE\",4,\"\u9CC8\u9CC9\u9CD1\u9CD2\u9CDA\u9CDB\u9CE0\u9CE1\u9CCC\",4,\"\u9CD3\u9CD4\u9CD5\u9CD7\u9CD8\u9CD9\u9CDC\u9CDD\u9CDF\u9CE2\u977C\u9785\u9791\u9792\u9794\u97AF\u97AB\u97A3\u97B2\u97B4\u9AB1\u9AB0\u9AB7\u9E58\u9AB6\u9ABA\u9ABC\u9AC1\u9AC0\u9AC5\u9AC2\u9ACB\u9ACC\u9AD1\u9B45\u9B43\u9B47\u9B49\u9B48\u9B4D\u9B51\u98E8\u990D\u992E\u9955\u9954\u9ADF\u9AE1\u9AE6\u9AEF\u9AEB\u9AFB\u9AED\u9AF9\u9B08\u9B0F\u9B13\u9B1F\u9B23\u9EBD\u9EBE\u7E3B\u9E82\u9E87\u9E88\u9E8B\u9E92\u93D6\u9E9D\u9E9F\u9EDB\u9EDC\u9EDD\u9EE0\u9EDF\u9EE2\u9EE9\u9EE7\u9EE5\u9EEA\u9EEF\u9F22\u9F2C\u9F2F\u9F39\u9F37\u9F3D\u9F3E\u9F44\"],\n[\"f840\",\"\u9CE3\",62],\n[\"f880\",\"\u9D22\",32],\n[\"f940\",\"\u9D43\",62],\n[\"f980\",\"\u9D82\",32],\n[\"fa40\",\"\u9DA3\",62],\n[\"fa80\",\"\u9DE2\",32],\n[\"fb40\",\"\u9E03\",27,\"\u9E24\u9E27\u9E2E\u9E30\u9E34\u9E3B\u9E3C\u9E40\u9E4D\u9E50\u9E52\u9E53\u9E54\u9E56\u9E59\u9E5D\u9E5F\u9E60\u9E61\u9E62\u9E65\u9E6E\u9E6F\u9E72\u9E74\",9,\"\u9E80\"],\n[\"fb80\",\"\u9E81\u9E83\u9E84\u9E85\u9E86\u9E89\u9E8A\u9E8C\",5,\"\u9E94\",8,\"\u9E9E\u9EA0\",5,\"\u9EA7\u9EA8\u9EA9\u9EAA\"],\n[\"fc40\",\"\u9EAB\",8,\"\u9EB5\u9EB6\u9EB7\u9EB9\u9EBA\u9EBC\u9EBF\",4,\"\u9EC5\u9EC6\u9EC7\u9EC8\u9ECA\u9ECB\u9ECC\u9ED0\u9ED2\u9ED3\u9ED5\u9ED6\u9ED7\u9ED9\u9EDA\u9EDE\u9EE1\u9EE3\u9EE4\u9EE6\u9EE8\u9EEB\u9EEC\u9EED\u9EEE\u9EF0\",8,\"\u9EFA\u9EFD\u9EFF\",6],\n[\"fc80\",\"\u9F06\",4,\"\u9F0C\u9F0F\u9F11\u9F12\u9F14\u9F15\u9F16\u9F18\u9F1A\",5,\"\u9F21\u9F23\",8,\"\u9F2D\u9F2E\u9F30\u9F31\"],\n[\"fd40\",\"\u9F32\",4,\"\u9F38\u9F3A\u9F3C\u9F3F\",4,\"\u9F45\",10,\"\u9F52\",38],\n[\"fd80\",\"\u9F79\",5,\"\u9F81\u9F82\u9F8D\",11,\"\u9F9C\u9F9D\u9F9E\u9FA1\",4,\"\uF92C\uF979\uF995\uF9E7\uF9F1\"],\n[\"fe40\",\"\uFA0C\uFA0D\uFA0E\uFA0F\uFA11\uFA13\uFA14\uFA18\uFA1F\uFA20\uFA21\uFA23\uFA24\uFA27\uFA28\uFA29\"]\n]\n", "[\n[\"a140\",\"\uE4C6\",62],\n[\"a180\",\"\uE505\",32],\n[\"a240\",\"\uE526\",62],\n[\"a280\",\"\uE565\",32],\n[\"a2ab\",\"\uE766\",5],\n[\"a2e3\",\"\u20AC\uE76D\"],\n[\"a2ef\",\"\uE76E\uE76F\"],\n[\"a2fd\",\"\uE770\uE771\"],\n[\"a340\",\"\uE586\",62],\n[\"a380\",\"\uE5C5\",31,\"\u3000\"],\n[\"a440\",\"\uE5E6\",62],\n[\"a480\",\"\uE625\",32],\n[\"a4f4\",\"\uE772\",10],\n[\"a540\",\"\uE646\",62],\n[\"a580\",\"\uE685\",32],\n[\"a5f7\",\"\uE77D\",7],\n[\"a640\",\"\uE6A6\",62],\n[\"a680\",\"\uE6E5\",32],\n[\"a6b9\",\"\uE785\",7],\n[\"a6d9\",\"\uE78D\",6],\n[\"a6ec\",\"\uE794\uE795\"],\n[\"a6f3\",\"\uE796\"],\n[\"a6f6\",\"\uE797\",8],\n[\"a740\",\"\uE706\",62],\n[\"a780\",\"\uE745\",32],\n[\"a7c2\",\"\uE7A0\",14],\n[\"a7f2\",\"\uE7AF\",12],\n[\"a896\",\"\uE7BC\",10],\n[\"a8bc\",\"\uE7C7\"],\n[\"a8bf\",\"\u01F9\"],\n[\"a8c1\",\"\uE7C9\uE7CA\uE7CB\uE7CC\"],\n[\"a8ea\",\"\uE7CD\",20],\n[\"a958\",\"\uE7E2\"],\n[\"a95b\",\"\uE7E3\"],\n[\"a95d\",\"\uE7E4\uE7E5\uE7E6\"],\n[\"a989\",\"\u303E\u2FF0\",11],\n[\"a997\",\"\uE7F4\",12],\n[\"a9f0\",\"\uE801\",14],\n[\"aaa1\",\"\uE000\",93],\n[\"aba1\",\"\uE05E\",93],\n[\"aca1\",\"\uE0BC\",93],\n[\"ada1\",\"\uE11A\",93],\n[\"aea1\",\"\uE178\",93],\n[\"afa1\",\"\uE1D6\",93],\n[\"d7fa\",\"\uE810\",4],\n[\"f8a1\",\"\uE234\",93],\n[\"f9a1\",\"\uE292\",93],\n[\"faa1\",\"\uE2F0\",93],\n[\"fba1\",\"\uE34E\",93],\n[\"fca1\",\"\uE3AC\",93],\n[\"fda1\",\"\uE40A\",93],\n[\"fe50\",\"\u2E81\uE816\uE817\uE818\u2E84\u3473\u3447\u2E88\u2E8B\uE81E\u359E\u361A\u360E\u2E8C\u2E97\u396E\u3918\uE826\u39CF\u39DF\u3A73\u39D0\uE82B\uE82C\u3B4E\u3C6E\u3CE0\u2EA7\uE831\uE832\u2EAA\u4056\u415F\u2EAE\u4337\u2EB3\u2EB6\u2EB7\uE83B\u43B1\u43AC\u2EBB\u43DD\u44D6\u4661\u464C\uE843\"],\n[\"fe80\",\"\u4723\u4729\u477C\u478D\u2ECA\u4947\u497A\u497D\u4982\u4983\u4985\u4986\u499F\u499B\u49B7\u49B6\uE854\uE855\u4CA3\u4C9F\u4CA0\u4CA1\u4C77\u4CA2\u4D13\",6,\"\u4DAE\uE864\uE468\",93]\n]\n", "{\"uChars\":[128,165,169,178,184,216,226,235,238,244,248,251,253,258,276,284,300,325,329,334,364,463,465,467,469,471,473,475,477,506,594,610,712,716,730,930,938,962,970,1026,1104,1106,8209,8215,8218,8222,8231,8241,8244,8246,8252,8365,8452,8454,8458,8471,8482,8556,8570,8596,8602,8713,8720,8722,8726,8731,8737,8740,8742,8748,8751,8760,8766,8777,8781,8787,8802,8808,8816,8854,8858,8870,8896,8979,9322,9372,9548,9588,9616,9622,9634,9652,9662,9672,9676,9680,9702,9735,9738,9793,9795,11906,11909,11913,11917,11928,11944,11947,11951,11956,11960,11964,11979,12284,12292,12312,12319,12330,12351,12436,12447,12535,12543,12586,12842,12850,12964,13200,13215,13218,13253,13263,13267,13270,13384,13428,13727,13839,13851,14617,14703,14801,14816,14964,15183,15471,15585,16471,16736,17208,17325,17330,17374,17623,17997,18018,18212,18218,18301,18318,18760,18811,18814,18820,18823,18844,18848,18872,19576,19620,19738,19887,40870,59244,59336,59367,59413,59417,59423,59431,59437,59443,59452,59460,59478,59493,63789,63866,63894,63976,63986,64016,64018,64021,64025,64034,64037,64042,65074,65093,65107,65112,65127,65132,65375,65510,65536],\"gbChars\":[0,36,38,45,50,81,89,95,96,100,103,104,105,109,126,133,148,172,175,179,208,306,307,308,309,310,311,312,313,341,428,443,544,545,558,741,742,749,750,805,819,820,7922,7924,7925,7927,7934,7943,7944,7945,7950,8062,8148,8149,8152,8164,8174,8236,8240,8262,8264,8374,8380,8381,8384,8388,8390,8392,8393,8394,8396,8401,8406,8416,8419,8424,8437,8439,8445,8482,8485,8496,8521,8603,8936,8946,9046,9050,9063,9066,9076,9092,9100,9108,9111,9113,9131,9162,9164,9218,9219,11329,11331,11334,11336,11346,11361,11363,11366,11370,11372,11375,11389,11682,11686,11687,11692,11694,11714,11716,11723,11725,11730,11736,11982,11989,12102,12336,12348,12350,12384,12393,12395,12397,12510,12553,12851,12962,12973,13738,13823,13919,13933,14080,14298,14585,14698,15583,15847,16318,16434,16438,16481,16729,17102,17122,17315,17320,17402,17418,17859,17909,17911,17915,17916,17936,17939,17961,18664,18703,18814,18962,19043,33469,33470,33471,33484,33485,33490,33497,33501,33505,33513,33520,33536,33550,37845,37921,37948,38029,38038,38064,38065,38066,38069,38075,38076,38078,39108,39109,39113,39114,39115,39116,39265,39394,189000]}", "[\n[\"0\",\"\\u0000\",127],\n[\"8141\",\"\uAC02\uAC03\uAC05\uAC06\uAC0B\",4,\"\uAC18\uAC1E\uAC1F\uAC21\uAC22\uAC23\uAC25\",6,\"\uAC2E\uAC32\uAC33\uAC34\"],\n[\"8161\",\"\uAC35\uAC36\uAC37\uAC3A\uAC3B\uAC3D\uAC3E\uAC3F\uAC41\",9,\"\uAC4C\uAC4E\",5,\"\uAC55\"],\n[\"8181\",\"\uAC56\uAC57\uAC59\uAC5A\uAC5B\uAC5D\",18,\"\uAC72\uAC73\uAC75\uAC76\uAC79\uAC7B\",4,\"\uAC82\uAC87\uAC88\uAC8D\uAC8E\uAC8F\uAC91\uAC92\uAC93\uAC95\",6,\"\uAC9E\uACA2\",5,\"\uACAB\uACAD\uACAE\uACB1\",6,\"\uACBA\uACBE\uACBF\uACC0\uACC2\uACC3\uACC5\uACC6\uACC7\uACC9\uACCA\uACCB\uACCD\",7,\"\uACD6\uACD8\",7,\"\uACE2\uACE3\uACE5\uACE6\uACE9\uACEB\uACED\uACEE\uACF2\uACF4\uACF7\",4,\"\uACFE\uACFF\uAD01\uAD02\uAD03\uAD05\uAD07\",4,\"\uAD0E\uAD10\uAD12\uAD13\"],\n[\"8241\",\"\uAD14\uAD15\uAD16\uAD17\uAD19\uAD1A\uAD1B\uAD1D\uAD1E\uAD1F\uAD21\",7,\"\uAD2A\uAD2B\uAD2E\",5],\n[\"8261\",\"\uAD36\uAD37\uAD39\uAD3A\uAD3B\uAD3D\",6,\"\uAD46\uAD48\uAD4A\",5,\"\uAD51\uAD52\uAD53\uAD55\uAD56\uAD57\"],\n[\"8281\",\"\uAD59\",7,\"\uAD62\uAD64\",7,\"\uAD6E\uAD6F\uAD71\uAD72\uAD77\uAD78\uAD79\uAD7A\uAD7E\uAD80\uAD83\",4,\"\uAD8A\uAD8B\uAD8D\uAD8E\uAD8F\uAD91\",10,\"\uAD9E\",5,\"\uADA5\",17,\"\uADB8\",7,\"\uADC2\uADC3\uADC5\uADC6\uADC7\uADC9\",6,\"\uADD2\uADD4\",7,\"\uADDD\uADDE\uADDF\uADE1\uADE2\uADE3\uADE5\",18],\n[\"8341\",\"\uADFA\uADFB\uADFD\uADFE\uAE02\",5,\"\uAE0A\uAE0C\uAE0E\",5,\"\uAE15\",7],\n[\"8361\",\"\uAE1D\",18,\"\uAE32\uAE33\uAE35\uAE36\uAE39\uAE3B\uAE3C\"],\n[\"8381\",\"\uAE3D\uAE3E\uAE3F\uAE42\uAE44\uAE47\uAE48\uAE49\uAE4B\uAE4F\uAE51\uAE52\uAE53\uAE55\uAE57\",4,\"\uAE5E\uAE62\uAE63\uAE64\uAE66\uAE67\uAE6A\uAE6B\uAE6D\uAE6E\uAE6F\uAE71\",6,\"\uAE7A\uAE7E\",5,\"\uAE86\",5,\"\uAE8D\",46,\"\uAEBF\uAEC1\uAEC2\uAEC3\uAEC5\",6,\"\uAECE\uAED2\",5,\"\uAEDA\uAEDB\uAEDD\",8],\n[\"8441\",\"\uAEE6\uAEE7\uAEE9\uAEEA\uAEEC\uAEEE\",5,\"\uAEF5\uAEF6\uAEF7\uAEF9\uAEFA\uAEFB\uAEFD\",8],\n[\"8461\",\"\uAF06\uAF09\uAF0A\uAF0B\uAF0C\uAF0E\uAF0F\uAF11\",18],\n[\"8481\",\"\uAF24\",7,\"\uAF2E\uAF2F\uAF31\uAF33\uAF35\",6,\"\uAF3E\uAF40\uAF44\uAF45\uAF46\uAF47\uAF4A\",5,\"\uAF51\",10,\"\uAF5E\",5,\"\uAF66\",18,\"\uAF7A\",5,\"\uAF81\uAF82\uAF83\uAF85\uAF86\uAF87\uAF89\",6,\"\uAF92\uAF93\uAF94\uAF96\",5,\"\uAF9D\",26,\"\uAFBA\uAFBB\uAFBD\uAFBE\"],\n[\"8541\",\"\uAFBF\uAFC1\",5,\"\uAFCA\uAFCC\uAFCF\",4,\"\uAFD5\",6,\"\uAFDD\",4],\n[\"8561\",\"\uAFE2\",5,\"\uAFEA\",5,\"\uAFF2\uAFF3\uAFF5\uAFF6\uAFF7\uAFF9\",6,\"\uB002\uB003\"],\n[\"8581\",\"\uB005\",6,\"\uB00D\uB00E\uB00F\uB011\uB012\uB013\uB015\",6,\"\uB01E\",9,\"\uB029\",26,\"\uB046\uB047\uB049\uB04B\uB04D\uB04F\uB050\uB051\uB052\uB056\uB058\uB05A\uB05B\uB05C\uB05E\",29,\"\uB07E\uB07F\uB081\uB082\uB083\uB085\",6,\"\uB08E\uB090\uB092\",5,\"\uB09B\uB09D\uB09E\uB0A3\uB0A4\"],\n[\"8641\",\"\uB0A5\uB0A6\uB0A7\uB0AA\uB0B0\uB0B2\uB0B6\uB0B7\uB0B9\uB0BA\uB0BB\uB0BD\",6,\"\uB0C6\uB0CA\",5,\"\uB0D2\"],\n[\"8661\",\"\uB0D3\uB0D5\uB0D6\uB0D7\uB0D9\",6,\"\uB0E1\uB0E2\uB0E3\uB0E4\uB0E6\",10],\n[\"8681\",\"\uB0F1\",22,\"\uB10A\uB10D\uB10E\uB10F\uB111\uB114\uB115\uB116\uB117\uB11A\uB11E\",4,\"\uB126\uB127\uB129\uB12A\uB12B\uB12D\",6,\"\uB136\uB13A\",5,\"\uB142\uB143\uB145\uB146\uB147\uB149\",6,\"\uB152\uB153\uB156\uB157\uB159\uB15A\uB15B\uB15D\uB15E\uB15F\uB161\",22,\"\uB17A\uB17B\uB17D\uB17E\uB17F\uB181\uB183\",4,\"\uB18A\uB18C\uB18E\uB18F\uB190\uB191\uB195\uB196\uB197\uB199\uB19A\uB19B\uB19D\"],\n[\"8741\",\"\uB19E\",9,\"\uB1A9\",15],\n[\"8761\",\"\uB1B9\",18,\"\uB1CD\uB1CE\uB1CF\uB1D1\uB1D2\uB1D3\uB1D5\"],\n[\"8781\",\"\uB1D6\",5,\"\uB1DE\uB1E0\",7,\"\uB1EA\uB1EB\uB1ED\uB1EE\uB1EF\uB1F1\",7,\"\uB1FA\uB1FC\uB1FE\",5,\"\uB206\uB207\uB209\uB20A\uB20D\",6,\"\uB216\uB218\uB21A\",5,\"\uB221\",18,\"\uB235\",6,\"\uB23D\",26,\"\uB259\uB25A\uB25B\uB25D\uB25E\uB25F\uB261\",6,\"\uB26A\",4],\n[\"8841\",\"\uB26F\",4,\"\uB276\",5,\"\uB27D\",6,\"\uB286\uB287\uB288\uB28A\",4],\n[\"8861\",\"\uB28F\uB292\uB293\uB295\uB296\uB297\uB29B\",4,\"\uB2A2\uB2A4\uB2A7\uB2A8\uB2A9\uB2AB\uB2AD\uB2AE\uB2AF\uB2B1\uB2B2\uB2B3\uB2B5\uB2B6\uB2B7\"],\n[\"8881\",\"\uB2B8\",15,\"\uB2CA\uB2CB\uB2CD\uB2CE\uB2CF\uB2D1\uB2D3\",4,\"\uB2DA\uB2DC\uB2DE\uB2DF\uB2E0\uB2E1\uB2E3\uB2E7\uB2E9\uB2EA\uB2F0\uB2F1\uB2F2\uB2F6\uB2FC\uB2FD\uB2FE\uB302\uB303\uB305\uB306\uB307\uB309\",6,\"\uB312\uB316\",5,\"\uB31D\",54,\"\uB357\uB359\uB35A\uB35D\uB360\uB361\uB362\uB363\"],\n[\"8941\",\"\uB366\uB368\uB36A\uB36C\uB36D\uB36F\uB372\uB373\uB375\uB376\uB377\uB379\",6,\"\uB382\uB386\",5,\"\uB38D\"],\n[\"8961\",\"\uB38E\uB38F\uB391\uB392\uB393\uB395\",10,\"\uB3A2\",5,\"\uB3A9\uB3AA\uB3AB\uB3AD\"],\n[\"8981\",\"\uB3AE\",21,\"\uB3C6\uB3C7\uB3C9\uB3CA\uB3CD\uB3CF\uB3D1\uB3D2\uB3D3\uB3D6\uB3D8\uB3DA\uB3DC\uB3DE\uB3DF\uB3E1\uB3E2\uB3E3\uB3E5\uB3E6\uB3E7\uB3E9\",18,\"\uB3FD\",18,\"\uB411\",6,\"\uB419\uB41A\uB41B\uB41D\uB41E\uB41F\uB421\",6,\"\uB42A\uB42C\",7,\"\uB435\",15],\n[\"8a41\",\"\uB445\",10,\"\uB452\uB453\uB455\uB456\uB457\uB459\",6,\"\uB462\uB464\uB466\"],\n[\"8a61\",\"\uB467\",4,\"\uB46D\",18,\"\uB481\uB482\"],\n[\"8a81\",\"\uB483\",4,\"\uB489\",19,\"\uB49E\",5,\"\uB4A5\uB4A6\uB4A7\uB4A9\uB4AA\uB4AB\uB4AD\",7,\"\uB4B6\uB4B8\uB4BA\",5,\"\uB4C1\uB4C2\uB4C3\uB4C5\uB4C6\uB4C7\uB4C9\",6,\"\uB4D1\uB4D2\uB4D3\uB4D4\uB4D6\",5,\"\uB4DE\uB4DF\uB4E1\uB4E2\uB4E5\uB4E7\",4,\"\uB4EE\uB4F0\uB4F2\",5,\"\uB4F9\",26,\"\uB516\uB517\uB519\uB51A\uB51D\"],\n[\"8b41\",\"\uB51E\",5,\"\uB526\uB52B\",4,\"\uB532\uB533\uB535\uB536\uB537\uB539\",6,\"\uB542\uB546\"],\n[\"8b61\",\"\uB547\uB548\uB549\uB54A\uB54E\uB54F\uB551\uB552\uB553\uB555\",6,\"\uB55E\uB562\",8],\n[\"8b81\",\"\uB56B\",52,\"\uB5A2\uB5A3\uB5A5\uB5A6\uB5A7\uB5A9\uB5AC\uB5AD\uB5AE\uB5AF\uB5B2\uB5B6\",4,\"\uB5BE\uB5BF\uB5C1\uB5C2\uB5C3\uB5C5\",6,\"\uB5CE\uB5D2\",5,\"\uB5D9\",18,\"\uB5ED\",18],\n[\"8c41\",\"\uB600\",15,\"\uB612\uB613\uB615\uB616\uB617\uB619\",4],\n[\"8c61\",\"\uB61E\",6,\"\uB626\",5,\"\uB62D\",6,\"\uB635\",5],\n[\"8c81\",\"\uB63B\",12,\"\uB649\",26,\"\uB665\uB666\uB667\uB669\",50,\"\uB69E\uB69F\uB6A1\uB6A2\uB6A3\uB6A5\",5,\"\uB6AD\uB6AE\uB6AF\uB6B0\uB6B2\",16],\n[\"8d41\",\"\uB6C3\",16,\"\uB6D5\",8],\n[\"8d61\",\"\uB6DE\",17,\"\uB6F1\uB6F2\uB6F3\uB6F5\uB6F6\uB6F7\uB6F9\uB6FA\"],\n[\"8d81\",\"\uB6FB\",4,\"\uB702\uB703\uB704\uB706\",33,\"\uB72A\uB72B\uB72D\uB72E\uB731\",6,\"\uB73A\uB73C\",7,\"\uB745\uB746\uB747\uB749\uB74A\uB74B\uB74D\",6,\"\uB756\",9,\"\uB761\uB762\uB763\uB765\uB766\uB767\uB769\",6,\"\uB772\uB774\uB776\",5,\"\uB77E\uB77F\uB781\uB782\uB783\uB785\",6,\"\uB78E\uB793\uB794\uB795\uB79A\uB79B\uB79D\uB79E\"],\n[\"8e41\",\"\uB79F\uB7A1\",6,\"\uB7AA\uB7AE\",5,\"\uB7B6\uB7B7\uB7B9\",8],\n[\"8e61\",\"\uB7C2\",4,\"\uB7C8\uB7CA\",19],\n[\"8e81\",\"\uB7DE\",13,\"\uB7EE\uB7EF\uB7F1\uB7F2\uB7F3\uB7F5\",6,\"\uB7FE\uB802\",4,\"\uB80A\uB80B\uB80D\uB80E\uB80F\uB811\",6,\"\uB81A\uB81C\uB81E\",5,\"\uB826\uB827\uB829\uB82A\uB82B\uB82D\",6,\"\uB836\uB83A\",5,\"\uB841\uB842\uB843\uB845\",11,\"\uB852\uB854\",7,\"\uB85E\uB85F\uB861\uB862\uB863\uB865\",6,\"\uB86E\uB870\uB872\",5,\"\uB879\uB87A\uB87B\uB87D\",7],\n[\"8f41\",\"\uB885\",7,\"\uB88E\",17],\n[\"8f61\",\"\uB8A0\",7,\"\uB8A9\",6,\"\uB8B1\uB8B2\uB8B3\uB8B5\uB8B6\uB8B7\uB8B9\",4],\n[\"8f81\",\"\uB8BE\uB8BF\uB8C2\uB8C4\uB8C6\",5,\"\uB8CD\uB8CE\uB8CF\uB8D1\uB8D2\uB8D3\uB8D5\",7,\"\uB8DE\uB8E0\uB8E2\",5,\"\uB8EA\uB8EB\uB8ED\uB8EE\uB8EF\uB8F1\",6,\"\uB8FA\uB8FC\uB8FE\",5,\"\uB905\",18,\"\uB919\",6,\"\uB921\",26,\"\uB93E\uB93F\uB941\uB942\uB943\uB945\",6,\"\uB94D\uB94E\uB950\uB952\",5],\n[\"9041\",\"\uB95A\uB95B\uB95D\uB95E\uB95F\uB961\",6,\"\uB96A\uB96C\uB96E\",5,\"\uB976\uB977\uB979\uB97A\uB97B\uB97D\"],\n[\"9061\",\"\uB97E\",5,\"\uB986\uB988\uB98B\uB98C\uB98F\",15],\n[\"9081\",\"\uB99F\",12,\"\uB9AE\uB9AF\uB9B1\uB9B2\uB9B3\uB9B5\",6,\"\uB9BE\uB9C0\uB9C2\",5,\"\uB9CA\uB9CB\uB9CD\uB9D3\",4,\"\uB9DA\uB9DC\uB9DF\uB9E0\uB9E2\uB9E6\uB9E7\uB9E9\uB9EA\uB9EB\uB9ED\",6,\"\uB9F6\uB9FB\",4,\"\uBA02\",5,\"\uBA09\",11,\"\uBA16\",33,\"\uBA3A\uBA3B\uBA3D\uBA3E\uBA3F\uBA41\uBA43\uBA44\uBA45\uBA46\"],\n[\"9141\",\"\uBA47\uBA4A\uBA4C\uBA4F\uBA50\uBA51\uBA52\uBA56\uBA57\uBA59\uBA5A\uBA5B\uBA5D\",6,\"\uBA66\uBA6A\",5],\n[\"9161\",\"\uBA72\uBA73\uBA75\uBA76\uBA77\uBA79\",9,\"\uBA86\uBA88\uBA89\uBA8A\uBA8B\uBA8D\",5],\n[\"9181\",\"\uBA93\",20,\"\uBAAA\uBAAD\uBAAE\uBAAF\uBAB1\uBAB3\",4,\"\uBABA\uBABC\uBABE\",5,\"\uBAC5\uBAC6\uBAC7\uBAC9\",14,\"\uBADA\",33,\"\uBAFD\uBAFE\uBAFF\uBB01\uBB02\uBB03\uBB05\",7,\"\uBB0E\uBB10\uBB12\",5,\"\uBB19\uBB1A\uBB1B\uBB1D\uBB1E\uBB1F\uBB21\",6],\n[\"9241\",\"\uBB28\uBB2A\uBB2C\",7,\"\uBB37\uBB39\uBB3A\uBB3F\",4,\"\uBB46\uBB48\uBB4A\uBB4B\uBB4C\uBB4E\uBB51\uBB52\"],\n[\"9261\",\"\uBB53\uBB55\uBB56\uBB57\uBB59\",7,\"\uBB62\uBB64\",7,\"\uBB6D\",4],\n[\"9281\",\"\uBB72\",21,\"\uBB89\uBB8A\uBB8B\uBB8D\uBB8E\uBB8F\uBB91\",18,\"\uBBA5\uBBA6\uBBA7\uBBA9\uBBAA\uBBAB\uBBAD\",6,\"\uBBB5\uBBB6\uBBB8\",7,\"\uBBC1\uBBC2\uBBC3\uBBC5\uBBC6\uBBC7\uBBC9\",6,\"\uBBD1\uBBD2\uBBD4\",35,\"\uBBFA\uBBFB\uBBFD\uBBFE\uBC01\"],\n[\"9341\",\"\uBC03\",4,\"\uBC0A\uBC0E\uBC10\uBC12\uBC13\uBC19\uBC1A\uBC20\uBC21\uBC22\uBC23\uBC26\uBC28\uBC2A\uBC2B\uBC2C\uBC2E\uBC2F\uBC32\uBC33\uBC35\"],\n[\"9361\",\"\uBC36\uBC37\uBC39\",6,\"\uBC42\uBC46\uBC47\uBC48\uBC4A\uBC4B\uBC4E\uBC4F\uBC51\",8],\n[\"9381\",\"\uBC5A\uBC5B\uBC5C\uBC5E\",37,\"\uBC86\uBC87\uBC89\uBC8A\uBC8D\uBC8F\",4,\"\uBC96\uBC98\uBC9B\",4,\"\uBCA2\uBCA3\uBCA5\uBCA6\uBCA9\",6,\"\uBCB2\uBCB6\",5,\"\uBCBE\uBCBF\uBCC1\uBCC2\uBCC3\uBCC5\",7,\"\uBCCE\uBCD2\uBCD3\uBCD4\uBCD6\uBCD7\uBCD9\uBCDA\uBCDB\uBCDD\",22,\"\uBCF7\uBCF9\uBCFA\uBCFB\uBCFD\"],\n[\"9441\",\"\uBCFE\",5,\"\uBD06\uBD08\uBD0A\",5,\"\uBD11\uBD12\uBD13\uBD15\",8],\n[\"9461\",\"\uBD1E\",5,\"\uBD25\",6,\"\uBD2D\",12],\n[\"9481\",\"\uBD3A\",5,\"\uBD41\",6,\"\uBD4A\uBD4B\uBD4D\uBD4E\uBD4F\uBD51\",6,\"\uBD5A\",9,\"\uBD65\uBD66\uBD67\uBD69\",22,\"\uBD82\uBD83\uBD85\uBD86\uBD8B\",4,\"\uBD92\uBD94\uBD96\uBD97\uBD98\uBD9B\uBD9D\",6,\"\uBDA5\",10,\"\uBDB1\",6,\"\uBDB9\",24],\n[\"9541\",\"\uBDD2\uBDD3\uBDD6\uBDD7\uBDD9\uBDDA\uBDDB\uBDDD\",11,\"\uBDEA\",5,\"\uBDF1\"],\n[\"9561\",\"\uBDF2\uBDF3\uBDF5\uBDF6\uBDF7\uBDF9\",6,\"\uBE01\uBE02\uBE04\uBE06\",5,\"\uBE0E\uBE0F\uBE11\uBE12\uBE13\"],\n[\"9581\",\"\uBE15\",6,\"\uBE1E\uBE20\",35,\"\uBE46\uBE47\uBE49\uBE4A\uBE4B\uBE4D\uBE4F\",4,\"\uBE56\uBE58\uBE5C\uBE5D\uBE5E\uBE5F\uBE62\uBE63\uBE65\uBE66\uBE67\uBE69\uBE6B\",4,\"\uBE72\uBE76\",4,\"\uBE7E\uBE7F\uBE81\uBE82\uBE83\uBE85\",6,\"\uBE8E\uBE92\",5,\"\uBE9A\",13,\"\uBEA9\",14],\n[\"9641\",\"\uBEB8\",23,\"\uBED2\uBED3\"],\n[\"9661\",\"\uBED5\uBED6\uBED9\",6,\"\uBEE1\uBEE2\uBEE6\",5,\"\uBEED\",8],\n[\"9681\",\"\uBEF6\",10,\"\uBF02\",5,\"\uBF0A\",13,\"\uBF1A\uBF1E\",33,\"\uBF42\uBF43\uBF45\uBF46\uBF47\uBF49\",6,\"\uBF52\uBF53\uBF54\uBF56\",44],\n[\"9741\",\"\uBF83\",16,\"\uBF95\",8],\n[\"9761\",\"\uBF9E\",17,\"\uBFB1\",7],\n[\"9781\",\"\uBFB9\",11,\"\uBFC6\",5,\"\uBFCE\uBFCF\uBFD1\uBFD2\uBFD3\uBFD5\",6,\"\uBFDD\uBFDE\uBFE0\uBFE2\",89,\"\uC03D\uC03E\uC03F\"],\n[\"9841\",\"\uC040\",16,\"\uC052\",5,\"\uC059\uC05A\uC05B\"],\n[\"9861\",\"\uC05D\uC05E\uC05F\uC061\",6,\"\uC06A\",15],\n[\"9881\",\"\uC07A\",21,\"\uC092\uC093\uC095\uC096\uC097\uC099\",6,\"\uC0A2\uC0A4\uC0A6\",5,\"\uC0AE\uC0B1\uC0B2\uC0B7\",4,\"\uC0BE\uC0C2\uC0C3\uC0C4\uC0C6\uC0C7\uC0CA\uC0CB\uC0CD\uC0CE\uC0CF\uC0D1\",6,\"\uC0DA\uC0DE\",5,\"\uC0E6\uC0E7\uC0E9\uC0EA\uC0EB\uC0ED\",6,\"\uC0F6\uC0F8\uC0FA\",5,\"\uC101\uC102\uC103\uC105\uC106\uC107\uC109\",6,\"\uC111\uC112\uC113\uC114\uC116\",5,\"\uC121\uC122\uC125\uC128\uC129\uC12A\uC12B\uC12E\"],\n[\"9941\",\"\uC132\uC133\uC134\uC135\uC137\uC13A\uC13B\uC13D\uC13E\uC13F\uC141\",6,\"\uC14A\uC14E\",5,\"\uC156\uC157\"],\n[\"9961\",\"\uC159\uC15A\uC15B\uC15D\",6,\"\uC166\uC16A\",5,\"\uC171\uC172\uC173\uC175\uC176\uC177\uC179\uC17A\uC17B\"],\n[\"9981\",\"\uC17C\",8,\"\uC186\",5,\"\uC18F\uC191\uC192\uC193\uC195\uC197\",4,\"\uC19E\uC1A0\uC1A2\uC1A3\uC1A4\uC1A6\uC1A7\uC1AA\uC1AB\uC1AD\uC1AE\uC1AF\uC1B1\",11,\"\uC1BE\",5,\"\uC1C5\uC1C6\uC1C7\uC1C9\uC1CA\uC1CB\uC1CD\",6,\"\uC1D5\uC1D6\uC1D9\",6,\"\uC1E1\uC1E2\uC1E3\uC1E5\uC1E6\uC1E7\uC1E9\",6,\"\uC1F2\uC1F4\",7,\"\uC1FE\uC1FF\uC201\uC202\uC203\uC205\",6,\"\uC20E\uC210\uC212\",5,\"\uC21A\uC21B\uC21D\uC21E\uC221\uC222\uC223\"],\n[\"9a41\",\"\uC224\uC225\uC226\uC227\uC22A\uC22C\uC22E\uC230\uC233\uC235\",16],\n[\"9a61\",\"\uC246\uC247\uC249\",6,\"\uC252\uC253\uC255\uC256\uC257\uC259\",6,\"\uC261\uC262\uC263\uC264\uC266\"],\n[\"9a81\",\"\uC267\",4,\"\uC26E\uC26F\uC271\uC272\uC273\uC275\",6,\"\uC27E\uC280\uC282\",5,\"\uC28A\",5,\"\uC291\",6,\"\uC299\uC29A\uC29C\uC29E\",5,\"\uC2A6\uC2A7\uC2A9\uC2AA\uC2AB\uC2AE\",5,\"\uC2B6\uC2B8\uC2BA\",33,\"\uC2DE\uC2DF\uC2E1\uC2E2\uC2E5\",5,\"\uC2EE\uC2F0\uC2F2\uC2F3\uC2F4\uC2F5\uC2F7\uC2FA\uC2FD\uC2FE\uC2FF\uC301\",6,\"\uC30A\uC30B\uC30E\uC30F\"],\n[\"9b41\",\"\uC310\uC311\uC312\uC316\uC317\uC319\uC31A\uC31B\uC31D\",6,\"\uC326\uC327\uC32A\",8],\n[\"9b61\",\"\uC333\",17,\"\uC346\",7],\n[\"9b81\",\"\uC34E\",25,\"\uC36A\uC36B\uC36D\uC36E\uC36F\uC371\uC373\",4,\"\uC37A\uC37B\uC37E\",5,\"\uC385\uC386\uC387\uC389\uC38A\uC38B\uC38D\",50,\"\uC3C1\",22,\"\uC3DA\"],\n[\"9c41\",\"\uC3DB\uC3DD\uC3DE\uC3E1\uC3E3\",4,\"\uC3EA\uC3EB\uC3EC\uC3EE\",5,\"\uC3F6\uC3F7\uC3F9\",5],\n[\"9c61\",\"\uC3FF\",8,\"\uC409\",6,\"\uC411\",9],\n[\"9c81\",\"\uC41B\",8,\"\uC425\",6,\"\uC42D\uC42E\uC42F\uC431\uC432\uC433\uC435\",6,\"\uC43E\",9,\"\uC449\",26,\"\uC466\uC467\uC469\uC46A\uC46B\uC46D\",6,\"\uC476\uC477\uC478\uC47A\",5,\"\uC481\",18,\"\uC495\",6,\"\uC49D\",12],\n[\"9d41\",\"\uC4AA\",13,\"\uC4B9\uC4BA\uC4BB\uC4BD\",8],\n[\"9d61\",\"\uC4C6\",25],\n[\"9d81\",\"\uC4E0\",8,\"\uC4EA\",5,\"\uC4F2\uC4F3\uC4F5\uC4F6\uC4F7\uC4F9\uC4FB\uC4FC\uC4FD\uC4FE\uC502\",9,\"\uC50D\uC50E\uC50F\uC511\uC512\uC513\uC515\",6,\"\uC51D\",10,\"\uC52A\uC52B\uC52D\uC52E\uC52F\uC531\",6,\"\uC53A\uC53C\uC53E\",5,\"\uC546\uC547\uC54B\uC54F\uC550\uC551\uC552\uC556\uC55A\uC55B\uC55C\uC55F\uC562\uC563\uC565\uC566\uC567\uC569\",6,\"\uC572\uC576\",5,\"\uC57E\uC57F\uC581\uC582\uC583\uC585\uC586\uC588\uC589\uC58A\uC58B\uC58E\uC590\uC592\uC593\uC594\"],\n[\"9e41\",\"\uC596\uC599\uC59A\uC59B\uC59D\uC59E\uC59F\uC5A1\",7,\"\uC5AA\",9,\"\uC5B6\"],\n[\"9e61\",\"\uC5B7\uC5BA\uC5BF\",4,\"\uC5CB\uC5CD\uC5CF\uC5D2\uC5D3\uC5D5\uC5D6\uC5D7\uC5D9\",6,\"\uC5E2\uC5E4\uC5E6\uC5E7\"],\n[\"9e81\",\"\uC5E8\uC5E9\uC5EA\uC5EB\uC5EF\uC5F1\uC5F2\uC5F3\uC5F5\uC5F8\uC5F9\uC5FA\uC5FB\uC602\uC603\uC604\uC609\uC60A\uC60B\uC60D\uC60E\uC60F\uC611\",6,\"\uC61A\uC61D\",6,\"\uC626\uC627\uC629\uC62A\uC62B\uC62F\uC631\uC632\uC636\uC638\uC63A\uC63C\uC63D\uC63E\uC63F\uC642\uC643\uC645\uC646\uC647\uC649\",6,\"\uC652\uC656\",5,\"\uC65E\uC65F\uC661\",10,\"\uC66D\uC66E\uC670\uC672\",5,\"\uC67A\uC67B\uC67D\uC67E\uC67F\uC681\",6,\"\uC68A\uC68C\uC68E\",5,\"\uC696\uC697\uC699\uC69A\uC69B\uC69D\",6,\"\uC6A6\"],\n[\"9f41\",\"\uC6A8\uC6AA\",5,\"\uC6B2\uC6B3\uC6B5\uC6B6\uC6B7\uC6BB\",4,\"\uC6C2\uC6C4\uC6C6\",5,\"\uC6CE\"],\n[\"9f61\",\"\uC6CF\uC6D1\uC6D2\uC6D3\uC6D5\",6,\"\uC6DE\uC6DF\uC6E2\",5,\"\uC6EA\uC6EB\uC6ED\uC6EE\uC6EF\uC6F1\uC6F2\"],\n[\"9f81\",\"\uC6F3\",4,\"\uC6FA\uC6FB\uC6FC\uC6FE\",5,\"\uC706\uC707\uC709\uC70A\uC70B\uC70D\",6,\"\uC716\uC718\uC71A\",5,\"\uC722\uC723\uC725\uC726\uC727\uC729\",6,\"\uC732\uC734\uC736\uC738\uC739\uC73A\uC73B\uC73E\uC73F\uC741\uC742\uC743\uC745\",4,\"\uC74B\uC74E\uC750\uC759\uC75A\uC75B\uC75D\uC75E\uC75F\uC761\",6,\"\uC769\uC76A\uC76C\",7,\"\uC776\uC777\uC779\uC77A\uC77B\uC77F\uC780\uC781\uC782\uC786\uC78B\uC78C\uC78D\uC78F\uC792\uC793\uC795\uC799\uC79B\",4,\"\uC7A2\uC7A7\",4,\"\uC7AE\uC7AF\uC7B1\uC7B2\uC7B3\uC7B5\uC7B6\uC7B7\"],\n[\"a041\",\"\uC7B8\uC7B9\uC7BA\uC7BB\uC7BE\uC7C2\",5,\"\uC7CA\uC7CB\uC7CD\uC7CF\uC7D1\",6,\"\uC7D9\uC7DA\uC7DB\uC7DC\"],\n[\"a061\",\"\uC7DE\",5,\"\uC7E5\uC7E6\uC7E7\uC7E9\uC7EA\uC7EB\uC7ED\",13],\n[\"a081\",\"\uC7FB\",4,\"\uC802\uC803\uC805\uC806\uC807\uC809\uC80B\",4,\"\uC812\uC814\uC817\",4,\"\uC81E\uC81F\uC821\uC822\uC823\uC825\",6,\"\uC82E\uC830\uC832\",5,\"\uC839\uC83A\uC83B\uC83D\uC83E\uC83F\uC841\",6,\"\uC84A\uC84B\uC84E\",5,\"\uC855\",26,\"\uC872\uC873\uC875\uC876\uC877\uC879\uC87B\",4,\"\uC882\uC884\uC888\uC889\uC88A\uC88E\",5,\"\uC895\",7,\"\uC89E\uC8A0\uC8A2\uC8A3\uC8A4\"],\n[\"a141\",\"\uC8A5\uC8A6\uC8A7\uC8A9\",18,\"\uC8BE\uC8BF\uC8C0\uC8C1\"],\n[\"a161\",\"\uC8C2\uC8C3\uC8C5\uC8C6\uC8C7\uC8C9\uC8CA\uC8CB\uC8CD\",6,\"\uC8D6\uC8D8\uC8DA\",5,\"\uC8E2\uC8E3\uC8E5\"],\n[\"a181\",\"\uC8E6\",14,\"\uC8F6\",5,\"\uC8FE\uC8FF\uC901\uC902\uC903\uC907\",4,\"\uC90E\u3000\u3001\u3002\u00B7\u2025\u2026\u00A8\u3003\u00AD\u2015\u2225\uFF3C\u223C\u2018\u2019\u201C\u201D\u3014\u3015\u3008\",9,\"\u00B1\u00D7\u00F7\u2260\u2264\u2265\u221E\u2234\u00B0\u2032\u2033\u2103\u212B\uFFE0\uFFE1\uFFE5\u2642\u2640\u2220\u22A5\u2312\u2202\u2207\u2261\u2252\u00A7\u203B\u2606\u2605\u25CB\u25CF\u25CE\u25C7\u25C6\u25A1\u25A0\u25B3\u25B2\u25BD\u25BC\u2192\u2190\u2191\u2193\u2194\u3013\u226A\u226B\u221A\u223D\u221D\u2235\u222B\u222C\u2208\u220B\u2286\u2287\u2282\u2283\u222A\u2229\u2227\u2228\uFFE2\"],\n[\"a241\",\"\uC910\uC912\",5,\"\uC919\",18],\n[\"a261\",\"\uC92D\",6,\"\uC935\",18],\n[\"a281\",\"\uC948\",7,\"\uC952\uC953\uC955\uC956\uC957\uC959\",6,\"\uC962\uC964\",7,\"\uC96D\uC96E\uC96F\u21D2\u21D4\u2200\u2203\u00B4\uFF5E\u02C7\u02D8\u02DD\u02DA\u02D9\u00B8\u02DB\u00A1\u00BF\u02D0\u222E\u2211\u220F\u00A4\u2109\u2030\u25C1\u25C0\u25B7\u25B6\u2664\u2660\u2661\u2665\u2667\u2663\u2299\u25C8\u25A3\u25D0\u25D1\u2592\u25A4\u25A5\u25A8\u25A7\u25A6\u25A9\u2668\u260F\u260E\u261C\u261E\u00B6\u2020\u2021\u2195\u2197\u2199\u2196\u2198\u266D\u2669\u266A\u266C\u327F\u321C\u2116\u33C7\u2122\u33C2\u33D8\u2121\u20AC\u00AE\"],\n[\"a341\",\"\uC971\uC972\uC973\uC975\",6,\"\uC97D\",10,\"\uC98A\uC98B\uC98D\uC98E\uC98F\"],\n[\"a361\",\"\uC991\",6,\"\uC99A\uC99C\uC99E\",16],\n[\"a381\",\"\uC9AF\",16,\"\uC9C2\uC9C3\uC9C5\uC9C6\uC9C9\uC9CB\",4,\"\uC9D2\uC9D4\uC9D7\uC9D8\uC9DB\uFF01\",58,\"\uFFE6\uFF3D\",32,\"\uFFE3\"],\n[\"a441\",\"\uC9DE\uC9DF\uC9E1\uC9E3\uC9E5\uC9E6\uC9E8\uC9E9\uC9EA\uC9EB\uC9EE\uC9F2\",5,\"\uC9FA\uC9FB\uC9FD\uC9FE\uC9FF\uCA01\uCA02\uCA03\uCA04\"],\n[\"a461\",\"\uCA05\uCA06\uCA07\uCA0A\uCA0E\",5,\"\uCA15\uCA16\uCA17\uCA19\",12],\n[\"a481\",\"\uCA26\uCA27\uCA28\uCA2A\",28,\"\u3131\",93],\n[\"a541\",\"\uCA47\",4,\"\uCA4E\uCA4F\uCA51\uCA52\uCA53\uCA55\",6,\"\uCA5E\uCA62\",5,\"\uCA69\uCA6A\"],\n[\"a561\",\"\uCA6B\",17,\"\uCA7E\",5,\"\uCA85\uCA86\"],\n[\"a581\",\"\uCA87\",16,\"\uCA99\",14,\"\u2170\",9],\n[\"a5b0\",\"\u2160\",9],\n[\"a5c1\",\"\u0391\",16,\"\u03A3\",6],\n[\"a5e1\",\"\u03B1\",16,\"\u03C3\",6],\n[\"a641\",\"\uCAA8\",19,\"\uCABE\uCABF\uCAC1\uCAC2\uCAC3\uCAC5\"],\n[\"a661\",\"\uCAC6\",5,\"\uCACE\uCAD0\uCAD2\uCAD4\uCAD5\uCAD6\uCAD7\uCADA\",5,\"\uCAE1\",6],\n[\"a681\",\"\uCAE8\uCAE9\uCAEA\uCAEB\uCAED\",6,\"\uCAF5\",18,\"\uCB09\uCB0A\u2500\u2502\u250C\u2510\u2518\u2514\u251C\u252C\u2524\u2534\u253C\u2501\u2503\u250F\u2513\u251B\u2517\u2523\u2533\u252B\u253B\u254B\u2520\u252F\u2528\u2537\u253F\u251D\u2530\u2525\u2538\u2542\u2512\u2511\u251A\u2519\u2516\u2515\u250E\u250D\u251E\u251F\u2521\u2522\u2526\u2527\u2529\u252A\u252D\u252E\u2531\u2532\u2535\u2536\u2539\u253A\u253D\u253E\u2540\u2541\u2543\",7],\n[\"a741\",\"\uCB0B\",4,\"\uCB11\uCB12\uCB13\uCB15\uCB16\uCB17\uCB19\",6,\"\uCB22\",7],\n[\"a761\",\"\uCB2A\",22,\"\uCB42\uCB43\uCB44\"],\n[\"a781\",\"\uCB45\uCB46\uCB47\uCB4A\uCB4B\uCB4D\uCB4E\uCB4F\uCB51\",6,\"\uCB5A\uCB5B\uCB5C\uCB5E\",5,\"\uCB65\",7,\"\u3395\u3396\u3397\u2113\u3398\u33C4\u33A3\u33A4\u33A5\u33A6\u3399\",9,\"\u33CA\u338D\u338E\u338F\u33CF\u3388\u3389\u33C8\u33A7\u33A8\u33B0\",9,\"\u3380\",4,\"\u33BA\",5,\"\u3390\",4,\"\u2126\u33C0\u33C1\u338A\u338B\u338C\u33D6\u33C5\u33AD\u33AE\u33AF\u33DB\u33A9\u33AA\u33AB\u33AC\u33DD\u33D0\u33D3\u33C3\u33C9\u33DC\u33C6\"],\n[\"a841\",\"\uCB6D\",10,\"\uCB7A\",14],\n[\"a861\",\"\uCB89\",18,\"\uCB9D\",6],\n[\"a881\",\"\uCBA4\",19,\"\uCBB9\",11,\"\u00C6\u00D0\u00AA\u0126\"],\n[\"a8a6\",\"\u0132\"],\n[\"a8a8\",\"\u013F\u0141\u00D8\u0152\u00BA\u00DE\u0166\u014A\"],\n[\"a8b1\",\"\u3260\",27,\"\u24D0\",25,\"\u2460\",14,\"\u00BD\u2153\u2154\u00BC\u00BE\u215B\u215C\u215D\u215E\"],\n[\"a941\",\"\uCBC5\",14,\"\uCBD5\",10],\n[\"a961\",\"\uCBE0\uCBE1\uCBE2\uCBE3\uCBE5\uCBE6\uCBE8\uCBEA\",18],\n[\"a981\",\"\uCBFD\",14,\"\uCC0E\uCC0F\uCC11\uCC12\uCC13\uCC15\",6,\"\uCC1E\uCC1F\uCC20\uCC23\uCC24\u00E6\u0111\u00F0\u0127\u0131\u0133\u0138\u0140\u0142\u00F8\u0153\u00DF\u00FE\u0167\u014B\u0149\u3200\",27,\"\u249C\",25,\"\u2474\",14,\"\u00B9\u00B2\u00B3\u2074\u207F\u2081\u2082\u2083\u2084\"],\n[\"aa41\",\"\uCC25\uCC26\uCC2A\uCC2B\uCC2D\uCC2F\uCC31\",6,\"\uCC3A\uCC3F\",4,\"\uCC46\uCC47\uCC49\uCC4A\uCC4B\uCC4D\uCC4E\"],\n[\"aa61\",\"\uCC4F\",4,\"\uCC56\uCC5A\",5,\"\uCC61\uCC62\uCC63\uCC65\uCC67\uCC69\",6,\"\uCC71\uCC72\"],\n[\"aa81\",\"\uCC73\uCC74\uCC76\",29,\"\u3041\",82],\n[\"ab41\",\"\uCC94\uCC95\uCC96\uCC97\uCC9A\uCC9B\uCC9D\uCC9E\uCC9F\uCCA1\",6,\"\uCCAA\uCCAE\",5,\"\uCCB6\uCCB7\uCCB9\"],\n[\"ab61\",\"\uCCBA\uCCBB\uCCBD\",6,\"\uCCC6\uCCC8\uCCCA\",5,\"\uCCD1\uCCD2\uCCD3\uCCD5\",5],\n[\"ab81\",\"\uCCDB\",8,\"\uCCE5\",6,\"\uCCED\uCCEE\uCCEF\uCCF1\",12,\"\u30A1\",85],\n[\"ac41\",\"\uCCFE\uCCFF\uCD00\uCD02\",5,\"\uCD0A\uCD0B\uCD0D\uCD0E\uCD0F\uCD11\",6,\"\uCD1A\uCD1C\uCD1E\uCD1F\uCD20\"],\n[\"ac61\",\"\uCD21\uCD22\uCD23\uCD25\uCD26\uCD27\uCD29\uCD2A\uCD2B\uCD2D\",11,\"\uCD3A\",4],\n[\"ac81\",\"\uCD3F\",28,\"\uCD5D\uCD5E\uCD5F\u0410\",5,\"\u0401\u0416\",25],\n[\"acd1\",\"\u0430\",5,\"\u0451\u0436\",25],\n[\"ad41\",\"\uCD61\uCD62\uCD63\uCD65\",6,\"\uCD6E\uCD70\uCD72\",5,\"\uCD79\",7],\n[\"ad61\",\"\uCD81\",6,\"\uCD89\",10,\"\uCD96\uCD97\uCD99\uCD9A\uCD9B\uCD9D\uCD9E\uCD9F\"],\n[\"ad81\",\"\uCDA0\uCDA1\uCDA2\uCDA3\uCDA6\uCDA8\uCDAA\",5,\"\uCDB1\",18,\"\uCDC5\"],\n[\"ae41\",\"\uCDC6\",5,\"\uCDCD\uCDCE\uCDCF\uCDD1\",16],\n[\"ae61\",\"\uCDE2\",5,\"\uCDE9\uCDEA\uCDEB\uCDED\uCDEE\uCDEF\uCDF1\",6,\"\uCDFA\uCDFC\uCDFE\",4],\n[\"ae81\",\"\uCE03\uCE05\uCE06\uCE07\uCE09\uCE0A\uCE0B\uCE0D\",6,\"\uCE15\uCE16\uCE17\uCE18\uCE1A\",5,\"\uCE22\uCE23\uCE25\uCE26\uCE27\uCE29\uCE2A\uCE2B\"],\n[\"af41\",\"\uCE2C\uCE2D\uCE2E\uCE2F\uCE32\uCE34\uCE36\",19],\n[\"af61\",\"\uCE4A\",13,\"\uCE5A\uCE5B\uCE5D\uCE5E\uCE62\",5,\"\uCE6A\uCE6C\"],\n[\"af81\",\"\uCE6E\",5,\"\uCE76\uCE77\uCE79\uCE7A\uCE7B\uCE7D\",6,\"\uCE86\uCE88\uCE8A\",5,\"\uCE92\uCE93\uCE95\uCE96\uCE97\uCE99\"],\n[\"b041\",\"\uCE9A\",5,\"\uCEA2\uCEA6\",5,\"\uCEAE\",12],\n[\"b061\",\"\uCEBB\",5,\"\uCEC2\",19],\n[\"b081\",\"\uCED6\",13,\"\uCEE6\uCEE7\uCEE9\uCEEA\uCEED\",6,\"\uCEF6\uCEFA\",5,\"\uAC00\uAC01\uAC04\uAC07\uAC08\uAC09\uAC0A\uAC10\",7,\"\uAC19\",4,\"\uAC20\uAC24\uAC2C\uAC2D\uAC2F\uAC30\uAC31\uAC38\uAC39\uAC3C\uAC40\uAC4B\uAC4D\uAC54\uAC58\uAC5C\uAC70\uAC71\uAC74\uAC77\uAC78\uAC7A\uAC80\uAC81\uAC83\uAC84\uAC85\uAC86\uAC89\uAC8A\uAC8B\uAC8C\uAC90\uAC94\uAC9C\uAC9D\uAC9F\uACA0\uACA1\uACA8\uACA9\uACAA\uACAC\uACAF\uACB0\uACB8\uACB9\uACBB\uACBC\uACBD\uACC1\uACC4\uACC8\uACCC\uACD5\uACD7\uACE0\uACE1\uACE4\uACE7\uACE8\uACEA\uACEC\uACEF\uACF0\uACF1\uACF3\uACF5\uACF6\uACFC\uACFD\uAD00\uAD04\uAD06\"],\n[\"b141\",\"\uCF02\uCF03\uCF05\uCF06\uCF07\uCF09\",6,\"\uCF12\uCF14\uCF16\",5,\"\uCF1D\uCF1E\uCF1F\uCF21\uCF22\uCF23\"],\n[\"b161\",\"\uCF25\",6,\"\uCF2E\uCF32\",5,\"\uCF39\",11],\n[\"b181\",\"\uCF45\",14,\"\uCF56\uCF57\uCF59\uCF5A\uCF5B\uCF5D\",6,\"\uCF66\uCF68\uCF6A\uCF6B\uCF6C\uAD0C\uAD0D\uAD0F\uAD11\uAD18\uAD1C\uAD20\uAD29\uAD2C\uAD2D\uAD34\uAD35\uAD38\uAD3C\uAD44\uAD45\uAD47\uAD49\uAD50\uAD54\uAD58\uAD61\uAD63\uAD6C\uAD6D\uAD70\uAD73\uAD74\uAD75\uAD76\uAD7B\uAD7C\uAD7D\uAD7F\uAD81\uAD82\uAD88\uAD89\uAD8C\uAD90\uAD9C\uAD9D\uADA4\uADB7\uADC0\uADC1\uADC4\uADC8\uADD0\uADD1\uADD3\uADDC\uADE0\uADE4\uADF8\uADF9\uADFC\uADFF\uAE00\uAE01\uAE08\uAE09\uAE0B\uAE0D\uAE14\uAE30\uAE31\uAE34\uAE37\uAE38\uAE3A\uAE40\uAE41\uAE43\uAE45\uAE46\uAE4A\uAE4C\uAE4D\uAE4E\uAE50\uAE54\uAE56\uAE5C\uAE5D\uAE5F\uAE60\uAE61\uAE65\uAE68\uAE69\uAE6C\uAE70\uAE78\"],\n[\"b241\",\"\uCF6D\uCF6E\uCF6F\uCF72\uCF73\uCF75\uCF76\uCF77\uCF79\",6,\"\uCF81\uCF82\uCF83\uCF84\uCF86\",5,\"\uCF8D\"],\n[\"b261\",\"\uCF8E\",18,\"\uCFA2\",5,\"\uCFA9\"],\n[\"b281\",\"\uCFAA\",5,\"\uCFB1\",18,\"\uCFC5\",6,\"\uAE79\uAE7B\uAE7C\uAE7D\uAE84\uAE85\uAE8C\uAEBC\uAEBD\uAEBE\uAEC0\uAEC4\uAECC\uAECD\uAECF\uAED0\uAED1\uAED8\uAED9\uAEDC\uAEE8\uAEEB\uAEED\uAEF4\uAEF8\uAEFC\uAF07\uAF08\uAF0D\uAF10\uAF2C\uAF2D\uAF30\uAF32\uAF34\uAF3C\uAF3D\uAF3F\uAF41\uAF42\uAF43\uAF48\uAF49\uAF50\uAF5C\uAF5D\uAF64\uAF65\uAF79\uAF80\uAF84\uAF88\uAF90\uAF91\uAF95\uAF9C\uAFB8\uAFB9\uAFBC\uAFC0\uAFC7\uAFC8\uAFC9\uAFCB\uAFCD\uAFCE\uAFD4\uAFDC\uAFE8\uAFE9\uAFF0\uAFF1\uAFF4\uAFF8\uB000\uB001\uB004\uB00C\uB010\uB014\uB01C\uB01D\uB028\uB044\uB045\uB048\uB04A\uB04C\uB04E\uB053\uB054\uB055\uB057\uB059\"],\n[\"b341\",\"\uCFCC\",19,\"\uCFE2\uCFE3\uCFE5\uCFE6\uCFE7\uCFE9\"],\n[\"b361\",\"\uCFEA\",5,\"\uCFF2\uCFF4\uCFF6\",5,\"\uCFFD\uCFFE\uCFFF\uD001\uD002\uD003\uD005\",5],\n[\"b381\",\"\uD00B\",5,\"\uD012\",5,\"\uD019\",19,\"\uB05D\uB07C\uB07D\uB080\uB084\uB08C\uB08D\uB08F\uB091\uB098\uB099\uB09A\uB09C\uB09F\uB0A0\uB0A1\uB0A2\uB0A8\uB0A9\uB0AB\",4,\"\uB0B1\uB0B3\uB0B4\uB0B5\uB0B8\uB0BC\uB0C4\uB0C5\uB0C7\uB0C8\uB0C9\uB0D0\uB0D1\uB0D4\uB0D8\uB0E0\uB0E5\uB108\uB109\uB10B\uB10C\uB110\uB112\uB113\uB118\uB119\uB11B\uB11C\uB11D\uB123\uB124\uB125\uB128\uB12C\uB134\uB135\uB137\uB138\uB139\uB140\uB141\uB144\uB148\uB150\uB151\uB154\uB155\uB158\uB15C\uB160\uB178\uB179\uB17C\uB180\uB182\uB188\uB189\uB18B\uB18D\uB192\uB193\uB194\uB198\uB19C\uB1A8\uB1CC\uB1D0\uB1D4\uB1DC\uB1DD\"],\n[\"b441\",\"\uD02E\",5,\"\uD036\uD037\uD039\uD03A\uD03B\uD03D\",6,\"\uD046\uD048\uD04A\",5],\n[\"b461\",\"\uD051\uD052\uD053\uD055\uD056\uD057\uD059\",6,\"\uD061\",10,\"\uD06E\uD06F\"],\n[\"b481\",\"\uD071\uD072\uD073\uD075\",6,\"\uD07E\uD07F\uD080\uD082\",18,\"\uB1DF\uB1E8\uB1E9\uB1EC\uB1F0\uB1F9\uB1FB\uB1FD\uB204\uB205\uB208\uB20B\uB20C\uB214\uB215\uB217\uB219\uB220\uB234\uB23C\uB258\uB25C\uB260\uB268\uB269\uB274\uB275\uB27C\uB284\uB285\uB289\uB290\uB291\uB294\uB298\uB299\uB29A\uB2A0\uB2A1\uB2A3\uB2A5\uB2A6\uB2AA\uB2AC\uB2B0\uB2B4\uB2C8\uB2C9\uB2CC\uB2D0\uB2D2\uB2D8\uB2D9\uB2DB\uB2DD\uB2E2\uB2E4\uB2E5\uB2E6\uB2E8\uB2EB\",4,\"\uB2F3\uB2F4\uB2F5\uB2F7\",4,\"\uB2FF\uB300\uB301\uB304\uB308\uB310\uB311\uB313\uB314\uB315\uB31C\uB354\uB355\uB356\uB358\uB35B\uB35C\uB35E\uB35F\uB364\uB365\"],\n[\"b541\",\"\uD095\",14,\"\uD0A6\uD0A7\uD0A9\uD0AA\uD0AB\uD0AD\",5],\n[\"b561\",\"\uD0B3\uD0B6\uD0B8\uD0BA\",5,\"\uD0C2\uD0C3\uD0C5\uD0C6\uD0C7\uD0CA\",5,\"\uD0D2\uD0D6\",4],\n[\"b581\",\"\uD0DB\uD0DE\uD0DF\uD0E1\uD0E2\uD0E3\uD0E5\",6,\"\uD0EE\uD0F2\",5,\"\uD0F9\",11,\"\uB367\uB369\uB36B\uB36E\uB370\uB371\uB374\uB378\uB380\uB381\uB383\uB384\uB385\uB38C\uB390\uB394\uB3A0\uB3A1\uB3A8\uB3AC\uB3C4\uB3C5\uB3C8\uB3CB\uB3CC\uB3CE\uB3D0\uB3D4\uB3D5\uB3D7\uB3D9\uB3DB\uB3DD\uB3E0\uB3E4\uB3E8\uB3FC\uB410\uB418\uB41C\uB420\uB428\uB429\uB42B\uB434\uB450\uB451\uB454\uB458\uB460\uB461\uB463\uB465\uB46C\uB480\uB488\uB49D\uB4A4\uB4A8\uB4AC\uB4B5\uB4B7\uB4B9\uB4C0\uB4C4\uB4C8\uB4D0\uB4D5\uB4DC\uB4DD\uB4E0\uB4E3\uB4E4\uB4E6\uB4EC\uB4ED\uB4EF\uB4F1\uB4F8\uB514\uB515\uB518\uB51B\uB51C\uB524\uB525\uB527\uB528\uB529\uB52A\uB530\uB531\uB534\uB538\"],\n[\"b641\",\"\uD105\",7,\"\uD10E\",17],\n[\"b661\",\"\uD120\",15,\"\uD132\uD133\uD135\uD136\uD137\uD139\uD13B\uD13C\uD13D\uD13E\"],\n[\"b681\",\"\uD13F\uD142\uD146\",5,\"\uD14E\uD14F\uD151\uD152\uD153\uD155\",6,\"\uD15E\uD160\uD162\",5,\"\uD169\uD16A\uD16B\uD16D\uB540\uB541\uB543\uB544\uB545\uB54B\uB54C\uB54D\uB550\uB554\uB55C\uB55D\uB55F\uB560\uB561\uB5A0\uB5A1\uB5A4\uB5A8\uB5AA\uB5AB\uB5B0\uB5B1\uB5B3\uB5B4\uB5B5\uB5BB\uB5BC\uB5BD\uB5C0\uB5C4\uB5CC\uB5CD\uB5CF\uB5D0\uB5D1\uB5D8\uB5EC\uB610\uB611\uB614\uB618\uB625\uB62C\uB634\uB648\uB664\uB668\uB69C\uB69D\uB6A0\uB6A4\uB6AB\uB6AC\uB6B1\uB6D4\uB6F0\uB6F4\uB6F8\uB700\uB701\uB705\uB728\uB729\uB72C\uB72F\uB730\uB738\uB739\uB73B\uB744\uB748\uB74C\uB754\uB755\uB760\uB764\uB768\uB770\uB771\uB773\uB775\uB77C\uB77D\uB780\uB784\uB78C\uB78D\uB78F\uB790\uB791\uB792\uB796\uB797\"],\n[\"b741\",\"\uD16E\",13,\"\uD17D\",6,\"\uD185\uD186\uD187\uD189\uD18A\"],\n[\"b761\",\"\uD18B\",20,\"\uD1A2\uD1A3\uD1A5\uD1A6\uD1A7\"],\n[\"b781\",\"\uD1A9\",6,\"\uD1B2\uD1B4\uD1B6\uD1B7\uD1B8\uD1B9\uD1BB\uD1BD\uD1BE\uD1BF\uD1C1\",14,\"\uB798\uB799\uB79C\uB7A0\uB7A8\uB7A9\uB7AB\uB7AC\uB7AD\uB7B4\uB7B5\uB7B8\uB7C7\uB7C9\uB7EC\uB7ED\uB7F0\uB7F4\uB7FC\uB7FD\uB7FF\uB800\uB801\uB807\uB808\uB809\uB80C\uB810\uB818\uB819\uB81B\uB81D\uB824\uB825\uB828\uB82C\uB834\uB835\uB837\uB838\uB839\uB840\uB844\uB851\uB853\uB85C\uB85D\uB860\uB864\uB86C\uB86D\uB86F\uB871\uB878\uB87C\uB88D\uB8A8\uB8B0\uB8B4\uB8B8\uB8C0\uB8C1\uB8C3\uB8C5\uB8CC\uB8D0\uB8D4\uB8DD\uB8DF\uB8E1\uB8E8\uB8E9\uB8EC\uB8F0\uB8F8\uB8F9\uB8FB\uB8FD\uB904\uB918\uB920\uB93C\uB93D\uB940\uB944\uB94C\uB94F\uB951\uB958\uB959\uB95C\uB960\uB968\uB969\"],\n[\"b841\",\"\uD1D0\",7,\"\uD1D9\",17],\n[\"b861\",\"\uD1EB\",8,\"\uD1F5\uD1F6\uD1F7\uD1F9\",13],\n[\"b881\",\"\uD208\uD20A\",5,\"\uD211\",24,\"\uB96B\uB96D\uB974\uB975\uB978\uB97C\uB984\uB985\uB987\uB989\uB98A\uB98D\uB98E\uB9AC\uB9AD\uB9B0\uB9B4\uB9BC\uB9BD\uB9BF\uB9C1\uB9C8\uB9C9\uB9CC\uB9CE\",4,\"\uB9D8\uB9D9\uB9DB\uB9DD\uB9DE\uB9E1\uB9E3\uB9E4\uB9E5\uB9E8\uB9EC\uB9F4\uB9F5\uB9F7\uB9F8\uB9F9\uB9FA\uBA00\uBA01\uBA08\uBA15\uBA38\uBA39\uBA3C\uBA40\uBA42\uBA48\uBA49\uBA4B\uBA4D\uBA4E\uBA53\uBA54\uBA55\uBA58\uBA5C\uBA64\uBA65\uBA67\uBA68\uBA69\uBA70\uBA71\uBA74\uBA78\uBA83\uBA84\uBA85\uBA87\uBA8C\uBAA8\uBAA9\uBAAB\uBAAC\uBAB0\uBAB2\uBAB8\uBAB9\uBABB\uBABD\uBAC4\uBAC8\uBAD8\uBAD9\uBAFC\"],\n[\"b941\",\"\uD22A\uD22B\uD22E\uD22F\uD231\uD232\uD233\uD235\",6,\"\uD23E\uD240\uD242\",5,\"\uD249\uD24A\uD24B\uD24C\"],\n[\"b961\",\"\uD24D\",14,\"\uD25D\",6,\"\uD265\uD266\uD267\uD268\"],\n[\"b981\",\"\uD269\",22,\"\uD282\uD283\uD285\uD286\uD287\uD289\uD28A\uD28B\uD28C\uBB00\uBB04\uBB0D\uBB0F\uBB11\uBB18\uBB1C\uBB20\uBB29\uBB2B\uBB34\uBB35\uBB36\uBB38\uBB3B\uBB3C\uBB3D\uBB3E\uBB44\uBB45\uBB47\uBB49\uBB4D\uBB4F\uBB50\uBB54\uBB58\uBB61\uBB63\uBB6C\uBB88\uBB8C\uBB90\uBBA4\uBBA8\uBBAC\uBBB4\uBBB7\uBBC0\uBBC4\uBBC8\uBBD0\uBBD3\uBBF8\uBBF9\uBBFC\uBBFF\uBC00\uBC02\uBC08\uBC09\uBC0B\uBC0C\uBC0D\uBC0F\uBC11\uBC14\",4,\"\uBC1B\",4,\"\uBC24\uBC25\uBC27\uBC29\uBC2D\uBC30\uBC31\uBC34\uBC38\uBC40\uBC41\uBC43\uBC44\uBC45\uBC49\uBC4C\uBC4D\uBC50\uBC5D\uBC84\uBC85\uBC88\uBC8B\uBC8C\uBC8E\uBC94\uBC95\uBC97\"],\n[\"ba41\",\"\uD28D\uD28E\uD28F\uD292\uD293\uD294\uD296\",5,\"\uD29D\uD29E\uD29F\uD2A1\uD2A2\uD2A3\uD2A5\",6,\"\uD2AD\"],\n[\"ba61\",\"\uD2AE\uD2AF\uD2B0\uD2B2\",5,\"\uD2BA\uD2BB\uD2BD\uD2BE\uD2C1\uD2C3\",4,\"\uD2CA\uD2CC\",5],\n[\"ba81\",\"\uD2D2\uD2D3\uD2D5\uD2D6\uD2D7\uD2D9\uD2DA\uD2DB\uD2DD\",6,\"\uD2E6\",9,\"\uD2F2\uD2F3\uD2F5\uD2F6\uD2F7\uD2F9\uD2FA\uBC99\uBC9A\uBCA0\uBCA1\uBCA4\uBCA7\uBCA8\uBCB0\uBCB1\uBCB3\uBCB4\uBCB5\uBCBC\uBCBD\uBCC0\uBCC4\uBCCD\uBCCF\uBCD0\uBCD1\uBCD5\uBCD8\uBCDC\uBCF4\uBCF5\uBCF6\uBCF8\uBCFC\uBD04\uBD05\uBD07\uBD09\uBD10\uBD14\uBD24\uBD2C\uBD40\uBD48\uBD49\uBD4C\uBD50\uBD58\uBD59\uBD64\uBD68\uBD80\uBD81\uBD84\uBD87\uBD88\uBD89\uBD8A\uBD90\uBD91\uBD93\uBD95\uBD99\uBD9A\uBD9C\uBDA4\uBDB0\uBDB8\uBDD4\uBDD5\uBDD8\uBDDC\uBDE9\uBDF0\uBDF4\uBDF8\uBE00\uBE03\uBE05\uBE0C\uBE0D\uBE10\uBE14\uBE1C\uBE1D\uBE1F\uBE44\uBE45\uBE48\uBE4C\uBE4E\uBE54\uBE55\uBE57\uBE59\uBE5A\uBE5B\uBE60\uBE61\uBE64\"],\n[\"bb41\",\"\uD2FB\",4,\"\uD302\uD304\uD306\",5,\"\uD30F\uD311\uD312\uD313\uD315\uD317\",4,\"\uD31E\uD322\uD323\"],\n[\"bb61\",\"\uD324\uD326\uD327\uD32A\uD32B\uD32D\uD32E\uD32F\uD331\",6,\"\uD33A\uD33E\",5,\"\uD346\uD347\uD348\uD349\"],\n[\"bb81\",\"\uD34A\",31,\"\uBE68\uBE6A\uBE70\uBE71\uBE73\uBE74\uBE75\uBE7B\uBE7C\uBE7D\uBE80\uBE84\uBE8C\uBE8D\uBE8F\uBE90\uBE91\uBE98\uBE99\uBEA8\uBED0\uBED1\uBED4\uBED7\uBED8\uBEE0\uBEE3\uBEE4\uBEE5\uBEEC\uBF01\uBF08\uBF09\uBF18\uBF19\uBF1B\uBF1C\uBF1D\uBF40\uBF41\uBF44\uBF48\uBF50\uBF51\uBF55\uBF94\uBFB0\uBFC5\uBFCC\uBFCD\uBFD0\uBFD4\uBFDC\uBFDF\uBFE1\uC03C\uC051\uC058\uC05C\uC060\uC068\uC069\uC090\uC091\uC094\uC098\uC0A0\uC0A1\uC0A3\uC0A5\uC0AC\uC0AD\uC0AF\uC0B0\uC0B3\uC0B4\uC0B5\uC0B6\uC0BC\uC0BD\uC0BF\uC0C0\uC0C1\uC0C5\uC0C8\uC0C9\uC0CC\uC0D0\uC0D8\uC0D9\uC0DB\uC0DC\uC0DD\uC0E4\"],\n[\"bc41\",\"\uD36A\",17,\"\uD37E\uD37F\uD381\uD382\uD383\uD385\uD386\uD387\"],\n[\"bc61\",\"\uD388\uD389\uD38A\uD38B\uD38E\uD392\",5,\"\uD39A\uD39B\uD39D\uD39E\uD39F\uD3A1\",6,\"\uD3AA\uD3AC\uD3AE\"],\n[\"bc81\",\"\uD3AF\",4,\"\uD3B5\uD3B6\uD3B7\uD3B9\uD3BA\uD3BB\uD3BD\",6,\"\uD3C6\uD3C7\uD3CA\",5,\"\uD3D1\",5,\"\uC0E5\uC0E8\uC0EC\uC0F4\uC0F5\uC0F7\uC0F9\uC100\uC104\uC108\uC110\uC115\uC11C\",4,\"\uC123\uC124\uC126\uC127\uC12C\uC12D\uC12F\uC130\uC131\uC136\uC138\uC139\uC13C\uC140\uC148\uC149\uC14B\uC14C\uC14D\uC154\uC155\uC158\uC15C\uC164\uC165\uC167\uC168\uC169\uC170\uC174\uC178\uC185\uC18C\uC18D\uC18E\uC190\uC194\uC196\uC19C\uC19D\uC19F\uC1A1\uC1A5\uC1A8\uC1A9\uC1AC\uC1B0\uC1BD\uC1C4\uC1C8\uC1CC\uC1D4\uC1D7\uC1D8\uC1E0\uC1E4\uC1E8\uC1F0\uC1F1\uC1F3\uC1FC\uC1FD\uC200\uC204\uC20C\uC20D\uC20F\uC211\uC218\uC219\uC21C\uC21F\uC220\uC228\uC229\uC22B\uC22D\"],\n[\"bd41\",\"\uD3D7\uD3D9\",7,\"\uD3E2\uD3E4\",7,\"\uD3EE\uD3EF\uD3F1\uD3F2\uD3F3\uD3F5\uD3F6\uD3F7\"],\n[\"bd61\",\"\uD3F8\uD3F9\uD3FA\uD3FB\uD3FE\uD400\uD402\",5,\"\uD409\",13],\n[\"bd81\",\"\uD417\",5,\"\uD41E\",25,\"\uC22F\uC231\uC232\uC234\uC248\uC250\uC251\uC254\uC258\uC260\uC265\uC26C\uC26D\uC270\uC274\uC27C\uC27D\uC27F\uC281\uC288\uC289\uC290\uC298\uC29B\uC29D\uC2A4\uC2A5\uC2A8\uC2AC\uC2AD\uC2B4\uC2B5\uC2B7\uC2B9\uC2DC\uC2DD\uC2E0\uC2E3\uC2E4\uC2EB\uC2EC\uC2ED\uC2EF\uC2F1\uC2F6\uC2F8\uC2F9\uC2FB\uC2FC\uC300\uC308\uC309\uC30C\uC30D\uC313\uC314\uC315\uC318\uC31C\uC324\uC325\uC328\uC329\uC345\uC368\uC369\uC36C\uC370\uC372\uC378\uC379\uC37C\uC37D\uC384\uC388\uC38C\uC3C0\uC3D8\uC3D9\uC3DC\uC3DF\uC3E0\uC3E2\uC3E8\uC3E9\uC3ED\uC3F4\uC3F5\uC3F8\uC408\uC410\uC424\uC42C\uC430\"],\n[\"be41\",\"\uD438\",7,\"\uD441\uD442\uD443\uD445\",14],\n[\"be61\",\"\uD454\",7,\"\uD45D\uD45E\uD45F\uD461\uD462\uD463\uD465\",7,\"\uD46E\uD470\uD471\uD472\"],\n[\"be81\",\"\uD473\",4,\"\uD47A\uD47B\uD47D\uD47E\uD481\uD483\",4,\"\uD48A\uD48C\uD48E\",5,\"\uD495\",8,\"\uC434\uC43C\uC43D\uC448\uC464\uC465\uC468\uC46C\uC474\uC475\uC479\uC480\uC494\uC49C\uC4B8\uC4BC\uC4E9\uC4F0\uC4F1\uC4F4\uC4F8\uC4FA\uC4FF\uC500\uC501\uC50C\uC510\uC514\uC51C\uC528\uC529\uC52C\uC530\uC538\uC539\uC53B\uC53D\uC544\uC545\uC548\uC549\uC54A\uC54C\uC54D\uC54E\uC553\uC554\uC555\uC557\uC558\uC559\uC55D\uC55E\uC560\uC561\uC564\uC568\uC570\uC571\uC573\uC574\uC575\uC57C\uC57D\uC580\uC584\uC587\uC58C\uC58D\uC58F\uC591\uC595\uC597\uC598\uC59C\uC5A0\uC5A9\uC5B4\uC5B5\uC5B8\uC5B9\uC5BB\uC5BC\uC5BD\uC5BE\uC5C4\",6,\"\uC5CC\uC5CE\"],\n[\"bf41\",\"\uD49E\",10,\"\uD4AA\",14],\n[\"bf61\",\"\uD4B9\",18,\"\uD4CD\uD4CE\uD4CF\uD4D1\uD4D2\uD4D3\uD4D5\"],\n[\"bf81\",\"\uD4D6\",5,\"\uD4DD\uD4DE\uD4E0\",7,\"\uD4E9\uD4EA\uD4EB\uD4ED\uD4EE\uD4EF\uD4F1\",6,\"\uD4F9\uD4FA\uD4FC\uC5D0\uC5D1\uC5D4\uC5D8\uC5E0\uC5E1\uC5E3\uC5E5\uC5EC\uC5ED\uC5EE\uC5F0\uC5F4\uC5F6\uC5F7\uC5FC\",5,\"\uC605\uC606\uC607\uC608\uC60C\uC610\uC618\uC619\uC61B\uC61C\uC624\uC625\uC628\uC62C\uC62D\uC62E\uC630\uC633\uC634\uC635\uC637\uC639\uC63B\uC640\uC641\uC644\uC648\uC650\uC651\uC653\uC654\uC655\uC65C\uC65D\uC660\uC66C\uC66F\uC671\uC678\uC679\uC67C\uC680\uC688\uC689\uC68B\uC68D\uC694\uC695\uC698\uC69C\uC6A4\uC6A5\uC6A7\uC6A9\uC6B0\uC6B1\uC6B4\uC6B8\uC6B9\uC6BA\uC6C0\uC6C1\uC6C3\uC6C5\uC6CC\uC6CD\uC6D0\uC6D4\uC6DC\uC6DD\uC6E0\uC6E1\uC6E8\"],\n[\"c041\",\"\uD4FE\",5,\"\uD505\uD506\uD507\uD509\uD50A\uD50B\uD50D\",6,\"\uD516\uD518\",5],\n[\"c061\",\"\uD51E\",25],\n[\"c081\",\"\uD538\uD539\uD53A\uD53B\uD53E\uD53F\uD541\uD542\uD543\uD545\",6,\"\uD54E\uD550\uD552\",5,\"\uD55A\uD55B\uD55D\uD55E\uD55F\uD561\uD562\uD563\uC6E9\uC6EC\uC6F0\uC6F8\uC6F9\uC6FD\uC704\uC705\uC708\uC70C\uC714\uC715\uC717\uC719\uC720\uC721\uC724\uC728\uC730\uC731\uC733\uC735\uC737\uC73C\uC73D\uC740\uC744\uC74A\uC74C\uC74D\uC74F\uC751\",7,\"\uC75C\uC760\uC768\uC76B\uC774\uC775\uC778\uC77C\uC77D\uC77E\uC783\uC784\uC785\uC787\uC788\uC789\uC78A\uC78E\uC790\uC791\uC794\uC796\uC797\uC798\uC79A\uC7A0\uC7A1\uC7A3\uC7A4\uC7A5\uC7A6\uC7AC\uC7AD\uC7B0\uC7B4\uC7BC\uC7BD\uC7BF\uC7C0\uC7C1\uC7C8\uC7C9\uC7CC\uC7CE\uC7D0\uC7D8\uC7DD\uC7E4\uC7E8\uC7EC\uC800\uC801\uC804\uC808\uC80A\"],\n[\"c141\",\"\uD564\uD566\uD567\uD56A\uD56C\uD56E\",5,\"\uD576\uD577\uD579\uD57A\uD57B\uD57D\",6,\"\uD586\uD58A\uD58B\"],\n[\"c161\",\"\uD58C\uD58D\uD58E\uD58F\uD591\",19,\"\uD5A6\uD5A7\"],\n[\"c181\",\"\uD5A8\",31,\"\uC810\uC811\uC813\uC815\uC816\uC81C\uC81D\uC820\uC824\uC82C\uC82D\uC82F\uC831\uC838\uC83C\uC840\uC848\uC849\uC84C\uC84D\uC854\uC870\uC871\uC874\uC878\uC87A\uC880\uC881\uC883\uC885\uC886\uC887\uC88B\uC88C\uC88D\uC894\uC89D\uC89F\uC8A1\uC8A8\uC8BC\uC8BD\uC8C4\uC8C8\uC8CC\uC8D4\uC8D5\uC8D7\uC8D9\uC8E0\uC8E1\uC8E4\uC8F5\uC8FC\uC8FD\uC900\uC904\uC905\uC906\uC90C\uC90D\uC90F\uC911\uC918\uC92C\uC934\uC950\uC951\uC954\uC958\uC960\uC961\uC963\uC96C\uC970\uC974\uC97C\uC988\uC989\uC98C\uC990\uC998\uC999\uC99B\uC99D\uC9C0\uC9C1\uC9C4\uC9C7\uC9C8\uC9CA\uC9D0\uC9D1\uC9D3\"],\n[\"c241\",\"\uD5CA\uD5CB\uD5CD\uD5CE\uD5CF\uD5D1\uD5D3\",4,\"\uD5DA\uD5DC\uD5DE\",5,\"\uD5E6\uD5E7\uD5E9\uD5EA\uD5EB\uD5ED\uD5EE\"],\n[\"c261\",\"\uD5EF\",4,\"\uD5F6\uD5F8\uD5FA\",5,\"\uD602\uD603\uD605\uD606\uD607\uD609\",6,\"\uD612\"],\n[\"c281\",\"\uD616\",5,\"\uD61D\uD61E\uD61F\uD621\uD622\uD623\uD625\",7,\"\uD62E\",9,\"\uD63A\uD63B\uC9D5\uC9D6\uC9D9\uC9DA\uC9DC\uC9DD\uC9E0\uC9E2\uC9E4\uC9E7\uC9EC\uC9ED\uC9EF\uC9F0\uC9F1\uC9F8\uC9F9\uC9FC\uCA00\uCA08\uCA09\uCA0B\uCA0C\uCA0D\uCA14\uCA18\uCA29\uCA4C\uCA4D\uCA50\uCA54\uCA5C\uCA5D\uCA5F\uCA60\uCA61\uCA68\uCA7D\uCA84\uCA98\uCABC\uCABD\uCAC0\uCAC4\uCACC\uCACD\uCACF\uCAD1\uCAD3\uCAD8\uCAD9\uCAE0\uCAEC\uCAF4\uCB08\uCB10\uCB14\uCB18\uCB20\uCB21\uCB41\uCB48\uCB49\uCB4C\uCB50\uCB58\uCB59\uCB5D\uCB64\uCB78\uCB79\uCB9C\uCBB8\uCBD4\uCBE4\uCBE7\uCBE9\uCC0C\uCC0D\uCC10\uCC14\uCC1C\uCC1D\uCC21\uCC22\uCC27\uCC28\uCC29\uCC2C\uCC2E\uCC30\uCC38\uCC39\uCC3B\"],\n[\"c341\",\"\uD63D\uD63E\uD63F\uD641\uD642\uD643\uD644\uD646\uD647\uD64A\uD64C\uD64E\uD64F\uD650\uD652\uD653\uD656\uD657\uD659\uD65A\uD65B\uD65D\",4],\n[\"c361\",\"\uD662\",4,\"\uD668\uD66A\",5,\"\uD672\uD673\uD675\",11],\n[\"c381\",\"\uD681\uD682\uD684\uD686\",5,\"\uD68E\uD68F\uD691\uD692\uD693\uD695\",7,\"\uD69E\uD6A0\uD6A2\",5,\"\uD6A9\uD6AA\uCC3C\uCC3D\uCC3E\uCC44\uCC45\uCC48\uCC4C\uCC54\uCC55\uCC57\uCC58\uCC59\uCC60\uCC64\uCC66\uCC68\uCC70\uCC75\uCC98\uCC99\uCC9C\uCCA0\uCCA8\uCCA9\uCCAB\uCCAC\uCCAD\uCCB4\uCCB5\uCCB8\uCCBC\uCCC4\uCCC5\uCCC7\uCCC9\uCCD0\uCCD4\uCCE4\uCCEC\uCCF0\uCD01\uCD08\uCD09\uCD0C\uCD10\uCD18\uCD19\uCD1B\uCD1D\uCD24\uCD28\uCD2C\uCD39\uCD5C\uCD60\uCD64\uCD6C\uCD6D\uCD6F\uCD71\uCD78\uCD88\uCD94\uCD95\uCD98\uCD9C\uCDA4\uCDA5\uCDA7\uCDA9\uCDB0\uCDC4\uCDCC\uCDD0\uCDE8\uCDEC\uCDF0\uCDF8\uCDF9\uCDFB\uCDFD\uCE04\uCE08\uCE0C\uCE14\uCE19\uCE20\uCE21\uCE24\uCE28\uCE30\uCE31\uCE33\uCE35\"],\n[\"c441\",\"\uD6AB\uD6AD\uD6AE\uD6AF\uD6B1\",7,\"\uD6BA\uD6BC\",7,\"\uD6C6\uD6C7\uD6C9\uD6CA\uD6CB\"],\n[\"c461\",\"\uD6CD\uD6CE\uD6CF\uD6D0\uD6D2\uD6D3\uD6D5\uD6D6\uD6D8\uD6DA\",5,\"\uD6E1\uD6E2\uD6E3\uD6E5\uD6E6\uD6E7\uD6E9\",4],\n[\"c481\",\"\uD6EE\uD6EF\uD6F1\uD6F2\uD6F3\uD6F4\uD6F6\",5,\"\uD6FE\uD6FF\uD701\uD702\uD703\uD705\",11,\"\uD712\uD713\uD714\uCE58\uCE59\uCE5C\uCE5F\uCE60\uCE61\uCE68\uCE69\uCE6B\uCE6D\uCE74\uCE75\uCE78\uCE7C\uCE84\uCE85\uCE87\uCE89\uCE90\uCE91\uCE94\uCE98\uCEA0\uCEA1\uCEA3\uCEA4\uCEA5\uCEAC\uCEAD\uCEC1\uCEE4\uCEE5\uCEE8\uCEEB\uCEEC\uCEF4\uCEF5\uCEF7\uCEF8\uCEF9\uCF00\uCF01\uCF04\uCF08\uCF10\uCF11\uCF13\uCF15\uCF1C\uCF20\uCF24\uCF2C\uCF2D\uCF2F\uCF30\uCF31\uCF38\uCF54\uCF55\uCF58\uCF5C\uCF64\uCF65\uCF67\uCF69\uCF70\uCF71\uCF74\uCF78\uCF80\uCF85\uCF8C\uCFA1\uCFA8\uCFB0\uCFC4\uCFE0\uCFE1\uCFE4\uCFE8\uCFF0\uCFF1\uCFF3\uCFF5\uCFFC\uD000\uD004\uD011\uD018\uD02D\uD034\uD035\uD038\uD03C\"],\n[\"c541\",\"\uD715\uD716\uD717\uD71A\uD71B\uD71D\uD71E\uD71F\uD721\",6,\"\uD72A\uD72C\uD72E\",5,\"\uD736\uD737\uD739\"],\n[\"c561\",\"\uD73A\uD73B\uD73D\",6,\"\uD745\uD746\uD748\uD74A\",5,\"\uD752\uD753\uD755\uD75A\",4],\n[\"c581\",\"\uD75F\uD762\uD764\uD766\uD767\uD768\uD76A\uD76B\uD76D\uD76E\uD76F\uD771\uD772\uD773\uD775\",6,\"\uD77E\uD77F\uD780\uD782\",5,\"\uD78A\uD78B\uD044\uD045\uD047\uD049\uD050\uD054\uD058\uD060\uD06C\uD06D\uD070\uD074\uD07C\uD07D\uD081\uD0A4\uD0A5\uD0A8\uD0AC\uD0B4\uD0B5\uD0B7\uD0B9\uD0C0\uD0C1\uD0C4\uD0C8\uD0C9\uD0D0\uD0D1\uD0D3\uD0D4\uD0D5\uD0DC\uD0DD\uD0E0\uD0E4\uD0EC\uD0ED\uD0EF\uD0F0\uD0F1\uD0F8\uD10D\uD130\uD131\uD134\uD138\uD13A\uD140\uD141\uD143\uD144\uD145\uD14C\uD14D\uD150\uD154\uD15C\uD15D\uD15F\uD161\uD168\uD16C\uD17C\uD184\uD188\uD1A0\uD1A1\uD1A4\uD1A8\uD1B0\uD1B1\uD1B3\uD1B5\uD1BA\uD1BC\uD1C0\uD1D8\uD1F4\uD1F8\uD207\uD209\uD210\uD22C\uD22D\uD230\uD234\uD23C\uD23D\uD23F\uD241\uD248\uD25C\"],\n[\"c641\",\"\uD78D\uD78E\uD78F\uD791\",6,\"\uD79A\uD79C\uD79E\",5],\n[\"c6a1\",\"\uD264\uD280\uD281\uD284\uD288\uD290\uD291\uD295\uD29C\uD2A0\uD2A4\uD2AC\uD2B1\uD2B8\uD2B9\uD2BC\uD2BF\uD2C0\uD2C2\uD2C8\uD2C9\uD2CB\uD2D4\uD2D8\uD2DC\uD2E4\uD2E5\uD2F0\uD2F1\uD2F4\uD2F8\uD300\uD301\uD303\uD305\uD30C\uD30D\uD30E\uD310\uD314\uD316\uD31C\uD31D\uD31F\uD320\uD321\uD325\uD328\uD329\uD32C\uD330\uD338\uD339\uD33B\uD33C\uD33D\uD344\uD345\uD37C\uD37D\uD380\uD384\uD38C\uD38D\uD38F\uD390\uD391\uD398\uD399\uD39C\uD3A0\uD3A8\uD3A9\uD3AB\uD3AD\uD3B4\uD3B8\uD3BC\uD3C4\uD3C5\uD3C8\uD3C9\uD3D0\uD3D8\uD3E1\uD3E3\uD3EC\uD3ED\uD3F0\uD3F4\uD3FC\uD3FD\uD3FF\uD401\"],\n[\"c7a1\",\"\uD408\uD41D\uD440\uD444\uD45C\uD460\uD464\uD46D\uD46F\uD478\uD479\uD47C\uD47F\uD480\uD482\uD488\uD489\uD48B\uD48D\uD494\uD4A9\uD4CC\uD4D0\uD4D4\uD4DC\uD4DF\uD4E8\uD4EC\uD4F0\uD4F8\uD4FB\uD4FD\uD504\uD508\uD50C\uD514\uD515\uD517\uD53C\uD53D\uD540\uD544\uD54C\uD54D\uD54F\uD551\uD558\uD559\uD55C\uD560\uD565\uD568\uD569\uD56B\uD56D\uD574\uD575\uD578\uD57C\uD584\uD585\uD587\uD588\uD589\uD590\uD5A5\uD5C8\uD5C9\uD5CC\uD5D0\uD5D2\uD5D8\uD5D9\uD5DB\uD5DD\uD5E4\uD5E5\uD5E8\uD5EC\uD5F4\uD5F5\uD5F7\uD5F9\uD600\uD601\uD604\uD608\uD610\uD611\uD613\uD614\uD615\uD61C\uD620\"],\n[\"c8a1\",\"\uD624\uD62D\uD638\uD639\uD63C\uD640\uD645\uD648\uD649\uD64B\uD64D\uD651\uD654\uD655\uD658\uD65C\uD667\uD669\uD670\uD671\uD674\uD683\uD685\uD68C\uD68D\uD690\uD694\uD69D\uD69F\uD6A1\uD6A8\uD6AC\uD6B0\uD6B9\uD6BB\uD6C4\uD6C5\uD6C8\uD6CC\uD6D1\uD6D4\uD6D7\uD6D9\uD6E0\uD6E4\uD6E8\uD6F0\uD6F5\uD6FC\uD6FD\uD700\uD704\uD711\uD718\uD719\uD71C\uD720\uD728\uD729\uD72B\uD72D\uD734\uD735\uD738\uD73C\uD744\uD747\uD749\uD750\uD751\uD754\uD756\uD757\uD758\uD759\uD760\uD761\uD763\uD765\uD769\uD76C\uD770\uD774\uD77C\uD77D\uD781\uD788\uD789\uD78C\uD790\uD798\uD799\uD79B\uD79D\"],\n[\"caa1\",\"\u4F3D\u4F73\u5047\u50F9\u52A0\u53EF\u5475\u54E5\u5609\u5AC1\u5BB6\u6687\u67B6\u67B7\u67EF\u6B4C\u73C2\u75C2\u7A3C\u82DB\u8304\u8857\u8888\u8A36\u8CC8\u8DCF\u8EFB\u8FE6\u99D5\u523B\u5374\u5404\u606A\u6164\u6BBC\u73CF\u811A\u89BA\u89D2\u95A3\u4F83\u520A\u58BE\u5978\u59E6\u5E72\u5E79\u61C7\u63C0\u6746\u67EC\u687F\u6F97\u764E\u770B\u78F5\u7A08\u7AFF\u7C21\u809D\u826E\u8271\u8AEB\u9593\u4E6B\u559D\u66F7\u6E34\u78A3\u7AED\u845B\u8910\u874E\u97A8\u52D8\u574E\u582A\u5D4C\u611F\u61BE\u6221\u6562\u67D1\u6A44\u6E1B\u7518\u75B3\u76E3\u77B0\u7D3A\u90AF\u9451\u9452\u9F95\"],\n[\"cba1\",\"\u5323\u5CAC\u7532\u80DB\u9240\u9598\u525B\u5808\u59DC\u5CA1\u5D17\u5EB7\u5F3A\u5F4A\u6177\u6C5F\u757A\u7586\u7CE0\u7D73\u7DB1\u7F8C\u8154\u8221\u8591\u8941\u8B1B\u92FC\u964D\u9C47\u4ECB\u4EF7\u500B\u51F1\u584F\u6137\u613E\u6168\u6539\u69EA\u6F11\u75A5\u7686\u76D6\u7B87\u82A5\u84CB\uF900\u93A7\u958B\u5580\u5BA2\u5751\uF901\u7CB3\u7FB9\u91B5\u5028\u53BB\u5C45\u5DE8\u62D2\u636E\u64DA\u64E7\u6E20\u70AC\u795B\u8DDD\u8E1E\uF902\u907D\u9245\u92F8\u4E7E\u4EF6\u5065\u5DFE\u5EFA\u6106\u6957\u8171\u8654\u8E47\u9375\u9A2B\u4E5E\u5091\u6770\u6840\u5109\u528D\u5292\u6AA2\"],\n[\"cca1\",\"\u77BC\u9210\u9ED4\u52AB\u602F\u8FF2\u5048\u61A9\u63ED\u64CA\u683C\u6A84\u6FC0\u8188\u89A1\u9694\u5805\u727D\u72AC\u7504\u7D79\u7E6D\u80A9\u898B\u8B74\u9063\u9D51\u6289\u6C7A\u6F54\u7D50\u7F3A\u8A23\u517C\u614A\u7B9D\u8B19\u9257\u938C\u4EAC\u4FD3\u501E\u50BE\u5106\u52C1\u52CD\u537F\u5770\u5883\u5E9A\u5F91\u6176\u61AC\u64CE\u656C\u666F\u66BB\u66F4\u6897\u6D87\u7085\u70F1\u749F\u74A5\u74CA\u75D9\u786C\u78EC\u7ADF\u7AF6\u7D45\u7D93\u8015\u803F\u811B\u8396\u8B66\u8F15\u9015\u93E1\u9803\u9838\u9A5A\u9BE8\u4FC2\u5553\u583A\u5951\u5B63\u5C46\u60B8\u6212\u6842\u68B0\"],\n[\"cda1\",\"\u68E8\u6EAA\u754C\u7678\u78CE\u7A3D\u7CFB\u7E6B\u7E7C\u8A08\u8AA1\u8C3F\u968E\u9DC4\u53E4\u53E9\u544A\u5471\u56FA\u59D1\u5B64\u5C3B\u5EAB\u62F7\u6537\u6545\u6572\u66A0\u67AF\u69C1\u6CBD\u75FC\u7690\u777E\u7A3F\u7F94\u8003\u80A1\u818F\u82E6\u82FD\u83F0\u85C1\u8831\u88B4\u8AA5\uF903\u8F9C\u932E\u96C7\u9867\u9AD8\u9F13\u54ED\u659B\u66F2\u688F\u7A40\u8C37\u9D60\u56F0\u5764\u5D11\u6606\u68B1\u68CD\u6EFE\u7428\u889E\u9BE4\u6C68\uF904\u9AA8\u4F9B\u516C\u5171\u529F\u5B54\u5DE5\u6050\u606D\u62F1\u63A7\u653B\u73D9\u7A7A\u86A3\u8CA2\u978F\u4E32\u5BE1\u6208\u679C\u74DC\"],\n[\"cea1\",\"\u79D1\u83D3\u8A87\u8AB2\u8DE8\u904E\u934B\u9846\u5ED3\u69E8\u85FF\u90ED\uF905\u51A0\u5B98\u5BEC\u6163\u68FA\u6B3E\u704C\u742F\u74D8\u7BA1\u7F50\u83C5\u89C0\u8CAB\u95DC\u9928\u522E\u605D\u62EC\u9002\u4F8A\u5149\u5321\u58D9\u5EE3\u66E0\u6D38\u709A\u72C2\u73D6\u7B50\u80F1\u945B\u5366\u639B\u7F6B\u4E56\u5080\u584A\u58DE\u602A\u6127\u62D0\u69D0\u9B41\u5B8F\u7D18\u80B1\u8F5F\u4EA4\u50D1\u54AC\u55AC\u5B0C\u5DA0\u5DE7\u652A\u654E\u6821\u6A4B\u72E1\u768E\u77EF\u7D5E\u7FF9\u81A0\u854E\u86DF\u8F03\u8F4E\u90CA\u9903\u9A55\u9BAB\u4E18\u4E45\u4E5D\u4EC7\u4FF1\u5177\u52FE\"],\n[\"cfa1\",\"\u5340\u53E3\u53E5\u548E\u5614\u5775\u57A2\u5BC7\u5D87\u5ED0\u61FC\u62D8\u6551\u67B8\u67E9\u69CB\u6B50\u6BC6\u6BEC\u6C42\u6E9D\u7078\u72D7\u7396\u7403\u77BF\u77E9\u7A76\u7D7F\u8009\u81FC\u8205\u820A\u82DF\u8862\u8B33\u8CFC\u8EC0\u9011\u90B1\u9264\u92B6\u99D2\u9A45\u9CE9\u9DD7\u9F9C\u570B\u5C40\u83CA\u97A0\u97AB\u9EB4\u541B\u7A98\u7FA4\u88D9\u8ECD\u90E1\u5800\u5C48\u6398\u7A9F\u5BAE\u5F13\u7A79\u7AAE\u828E\u8EAC\u5026\u5238\u52F8\u5377\u5708\u62F3\u6372\u6B0A\u6DC3\u7737\u53A5\u7357\u8568\u8E76\u95D5\u673A\u6AC3\u6F70\u8A6D\u8ECC\u994B\uF906\u6677\u6B78\u8CB4\"],\n[\"d0a1\",\"\u9B3C\uF907\u53EB\u572D\u594E\u63C6\u69FB\u73EA\u7845\u7ABA\u7AC5\u7CFE\u8475\u898F\u8D73\u9035\u95A8\u52FB\u5747\u7547\u7B60\u83CC\u921E\uF908\u6A58\u514B\u524B\u5287\u621F\u68D8\u6975\u9699\u50C5\u52A4\u52E4\u61C3\u65A4\u6839\u69FF\u747E\u7B4B\u82B9\u83EB\u89B2\u8B39\u8FD1\u9949\uF909\u4ECA\u5997\u64D2\u6611\u6A8E\u7434\u7981\u79BD\u82A9\u887E\u887F\u895F\uF90A\u9326\u4F0B\u53CA\u6025\u6271\u6C72\u7D1A\u7D66\u4E98\u5162\u77DC\u80AF\u4F01\u4F0E\u5176\u5180\u55DC\u5668\u573B\u57FA\u57FC\u5914\u5947\u5993\u5BC4\u5C90\u5D0E\u5DF1\u5E7E\u5FCC\u6280\u65D7\u65E3\"],\n[\"d1a1\",\"\u671E\u671F\u675E\u68CB\u68C4\u6A5F\u6B3A\u6C23\u6C7D\u6C82\u6DC7\u7398\u7426\u742A\u7482\u74A3\u7578\u757F\u7881\u78EF\u7941\u7947\u7948\u797A\u7B95\u7D00\u7DBA\u7F88\u8006\u802D\u808C\u8A18\u8B4F\u8C48\u8D77\u9321\u9324\u98E2\u9951\u9A0E\u9A0F\u9A65\u9E92\u7DCA\u4F76\u5409\u62EE\u6854\u91D1\u55AB\u513A\uF90B\uF90C\u5A1C\u61E6\uF90D\u62CF\u62FF\uF90E\",5,\"\u90A3\uF914\",4,\"\u8AFE\uF919\uF91A\uF91B\uF91C\u6696\uF91D\u7156\uF91E\uF91F\u96E3\uF920\u634F\u637A\u5357\uF921\u678F\u6960\u6E73\uF922\u7537\uF923\uF924\uF925\"],\n[\"d2a1\",\"\u7D0D\uF926\uF927\u8872\u56CA\u5A18\uF928\",4,\"\u4E43\uF92D\u5167\u5948\u67F0\u8010\uF92E\u5973\u5E74\u649A\u79CA\u5FF5\u606C\u62C8\u637B\u5BE7\u5BD7\u52AA\uF92F\u5974\u5F29\u6012\uF930\uF931\uF932\u7459\uF933\",5,\"\u99D1\uF939\",10,\"\u6FC3\uF944\uF945\u81BF\u8FB2\u60F1\uF946\uF947\u8166\uF948\uF949\u5C3F\uF94A\",7,\"\u5AE9\u8A25\u677B\u7D10\uF952\",5,\"\u80FD\uF958\uF959\u5C3C\u6CE5\u533F\u6EBA\u591A\u8336\"],\n[\"d3a1\",\"\u4E39\u4EB6\u4F46\u55AE\u5718\u58C7\u5F56\u65B7\u65E6\u6A80\u6BB5\u6E4D\u77ED\u7AEF\u7C1E\u7DDE\u86CB\u8892\u9132\u935B\u64BB\u6FBE\u737A\u75B8\u9054\u5556\u574D\u61BA\u64D4\u66C7\u6DE1\u6E5B\u6F6D\u6FB9\u75F0\u8043\u81BD\u8541\u8983\u8AC7\u8B5A\u931F\u6C93\u7553\u7B54\u8E0F\u905D\u5510\u5802\u5858\u5E62\u6207\u649E\u68E0\u7576\u7CD6\u87B3\u9EE8\u4EE3\u5788\u576E\u5927\u5C0D\u5CB1\u5E36\u5F85\u6234\u64E1\u73B3\u81FA\u888B\u8CB8\u968A\u9EDB\u5B85\u5FB7\u60B3\u5012\u5200\u5230\u5716\u5835\u5857\u5C0E\u5C60\u5CF6\u5D8B\u5EA6\u5F92\u60BC\u6311\u6389\u6417\u6843\"],\n[\"d4a1\",\"\u68F9\u6AC2\u6DD8\u6E21\u6ED4\u6FE4\u71FE\u76DC\u7779\u79B1\u7A3B\u8404\u89A9\u8CED\u8DF3\u8E48\u9003\u9014\u9053\u90FD\u934D\u9676\u97DC\u6BD2\u7006\u7258\u72A2\u7368\u7763\u79BF\u7BE4\u7E9B\u8B80\u58A9\u60C7\u6566\u65FD\u66BE\u6C8C\u711E\u71C9\u8C5A\u9813\u4E6D\u7A81\u4EDD\u51AC\u51CD\u52D5\u540C\u61A7\u6771\u6850\u68DF\u6D1E\u6F7C\u75BC\u77B3\u7AE5\u80F4\u8463\u9285\u515C\u6597\u675C\u6793\u75D8\u7AC7\u8373\uF95A\u8C46\u9017\u982D\u5C6F\u81C0\u829A\u9041\u906F\u920D\u5F97\u5D9D\u6A59\u71C8\u767B\u7B49\u85E4\u8B04\u9127\u9A30\u5587\u61F6\uF95B\u7669\u7F85\"],\n[\"d5a1\",\"\u863F\u87BA\u88F8\u908F\uF95C\u6D1B\u70D9\u73DE\u7D61\u843D\uF95D\u916A\u99F1\uF95E\u4E82\u5375\u6B04\u6B12\u703E\u721B\u862D\u9E1E\u524C\u8FA3\u5D50\u64E5\u652C\u6B16\u6FEB\u7C43\u7E9C\u85CD\u8964\u89BD\u62C9\u81D8\u881F\u5ECA\u6717\u6D6A\u72FC\u7405\u746F\u8782\u90DE\u4F86\u5D0D\u5FA0\u840A\u51B7\u63A0\u7565\u4EAE\u5006\u5169\u51C9\u6881\u6A11\u7CAE\u7CB1\u7CE7\u826F\u8AD2\u8F1B\u91CF\u4FB6\u5137\u52F5\u5442\u5EEC\u616E\u623E\u65C5\u6ADA\u6FFE\u792A\u85DC\u8823\u95AD\u9A62\u9A6A\u9E97\u9ECE\u529B\u66C6\u6B77\u701D\u792B\u8F62\u9742\u6190\u6200\u6523\u6F23\"],\n[\"d6a1\",\"\u7149\u7489\u7DF4\u806F\u84EE\u8F26\u9023\u934A\u51BD\u5217\u52A3\u6D0C\u70C8\u88C2\u5EC9\u6582\u6BAE\u6FC2\u7C3E\u7375\u4EE4\u4F36\u56F9\uF95F\u5CBA\u5DBA\u601C\u73B2\u7B2D\u7F9A\u7FCE\u8046\u901E\u9234\u96F6\u9748\u9818\u9F61\u4F8B\u6FA7\u79AE\u91B4\u96B7\u52DE\uF960\u6488\u64C4\u6AD3\u6F5E\u7018\u7210\u76E7\u8001\u8606\u865C\u8DEF\u8F05\u9732\u9B6F\u9DFA\u9E75\u788C\u797F\u7DA0\u83C9\u9304\u9E7F\u9E93\u8AD6\u58DF\u5F04\u6727\u7027\u74CF\u7C60\u807E\u5121\u7028\u7262\u78CA\u8CC2\u8CDA\u8CF4\u96F7\u4E86\u50DA\u5BEE\u5ED6\u6599\u71CE\u7642\u77AD\u804A\u84FC\"],\n[\"d7a1\",\"\u907C\u9B27\u9F8D\u58D8\u5A41\u5C62\u6A13\u6DDA\u6F0F\u763B\u7D2F\u7E37\u851E\u8938\u93E4\u964B\u5289\u65D2\u67F3\u69B4\u6D41\u6E9C\u700F\u7409\u7460\u7559\u7624\u786B\u8B2C\u985E\u516D\u622E\u9678\u4F96\u502B\u5D19\u6DEA\u7DB8\u8F2A\u5F8B\u6144\u6817\uF961\u9686\u52D2\u808B\u51DC\u51CC\u695E\u7A1C\u7DBE\u83F1\u9675\u4FDA\u5229\u5398\u540F\u550E\u5C65\u60A7\u674E\u68A8\u6D6C\u7281\u72F8\u7406\u7483\uF962\u75E2\u7C6C\u7F79\u7FB8\u8389\u88CF\u88E1\u91CC\u91D0\u96E2\u9BC9\u541D\u6F7E\u71D0\u7498\u85FA\u8EAA\u96A3\u9C57\u9E9F\u6797\u6DCB\u7433\u81E8\u9716\u782C\"],\n[\"d8a1\",\"\u7ACB\u7B20\u7C92\u6469\u746A\u75F2\u78BC\u78E8\u99AC\u9B54\u9EBB\u5BDE\u5E55\u6F20\u819C\u83AB\u9088\u4E07\u534D\u5A29\u5DD2\u5F4E\u6162\u633D\u6669\u66FC\u6EFF\u6F2B\u7063\u779E\u842C\u8513\u883B\u8F13\u9945\u9C3B\u551C\u62B9\u672B\u6CAB\u8309\u896A\u977A\u4EA1\u5984\u5FD8\u5FD9\u671B\u7DB2\u7F54\u8292\u832B\u83BD\u8F1E\u9099\u57CB\u59B9\u5A92\u5BD0\u6627\u679A\u6885\u6BCF\u7164\u7F75\u8CB7\u8CE3\u9081\u9B45\u8108\u8C8A\u964C\u9A40\u9EA5\u5B5F\u6C13\u731B\u76F2\u76DF\u840C\u51AA\u8993\u514D\u5195\u52C9\u68C9\u6C94\u7704\u7720\u7DBF\u7DEC\u9762\u9EB5\u6EC5\"],\n[\"d9a1\",\"\u8511\u51A5\u540D\u547D\u660E\u669D\u6927\u6E9F\u76BF\u7791\u8317\u84C2\u879F\u9169\u9298\u9CF4\u8882\u4FAE\u5192\u52DF\u59C6\u5E3D\u6155\u6478\u6479\u66AE\u67D0\u6A21\u6BCD\u6BDB\u725F\u7261\u7441\u7738\u77DB\u8017\u82BC\u8305\u8B00\u8B28\u8C8C\u6728\u6C90\u7267\u76EE\u7766\u7A46\u9DA9\u6B7F\u6C92\u5922\u6726\u8499\u536F\u5893\u5999\u5EDF\u63CF\u6634\u6773\u6E3A\u732B\u7AD7\u82D7\u9328\u52D9\u5DEB\u61AE\u61CB\u620A\u62C7\u64AB\u65E0\u6959\u6B66\u6BCB\u7121\u73F7\u755D\u7E46\u821E\u8302\u856A\u8AA3\u8CBF\u9727\u9D61\u58A8\u9ED8\u5011\u520E\u543B\u554F\u6587\"],\n[\"daa1\",\"\u6C76\u7D0A\u7D0B\u805E\u868A\u9580\u96EF\u52FF\u6C95\u7269\u5473\u5A9A\u5C3E\u5D4B\u5F4C\u5FAE\u672A\u68B6\u6963\u6E3C\u6E44\u7709\u7C73\u7F8E\u8587\u8B0E\u8FF7\u9761\u9EF4\u5CB7\u60B6\u610D\u61AB\u654F\u65FB\u65FC\u6C11\u6CEF\u739F\u73C9\u7DE1\u9594\u5BC6\u871C\u8B10\u525D\u535A\u62CD\u640F\u64B2\u6734\u6A38\u6CCA\u73C0\u749E\u7B94\u7C95\u7E1B\u818A\u8236\u8584\u8FEB\u96F9\u99C1\u4F34\u534A\u53CD\u53DB\u62CC\u642C\u6500\u6591\u69C3\u6CEE\u6F58\u73ED\u7554\u7622\u76E4\u76FC\u78D0\u78FB\u792C\u7D46\u822C\u87E0\u8FD4\u9812\u98EF\u52C3\u62D4\u64A5\u6E24\u6F51\"],\n[\"dba1\",\"\u767C\u8DCB\u91B1\u9262\u9AEE\u9B43\u5023\u508D\u574A\u59A8\u5C28\u5E47\u5F77\u623F\u653E\u65B9\u65C1\u6609\u678B\u699C\u6EC2\u78C5\u7D21\u80AA\u8180\u822B\u82B3\u84A1\u868C\u8A2A\u8B17\u90A6\u9632\u9F90\u500D\u4FF3\uF963\u57F9\u5F98\u62DC\u6392\u676F\u6E43\u7119\u76C3\u80CC\u80DA\u88F4\u88F5\u8919\u8CE0\u8F29\u914D\u966A\u4F2F\u4F70\u5E1B\u67CF\u6822\u767D\u767E\u9B44\u5E61\u6A0A\u7169\u71D4\u756A\uF964\u7E41\u8543\u85E9\u98DC\u4F10\u7B4F\u7F70\u95A5\u51E1\u5E06\u68B5\u6C3E\u6C4E\u6CDB\u72AF\u7BC4\u8303\u6CD5\u743A\u50FB\u5288\u58C1\u64D8\u6A97\u74A7\u7656\"],\n[\"dca1\",\"\u78A7\u8617\u95E2\u9739\uF965\u535E\u5F01\u8B8A\u8FA8\u8FAF\u908A\u5225\u77A5\u9C49\u9F08\u4E19\u5002\u5175\u5C5B\u5E77\u661E\u663A\u67C4\u68C5\u70B3\u7501\u75C5\u79C9\u7ADD\u8F27\u9920\u9A08\u4FDD\u5821\u5831\u5BF6\u666E\u6B65\u6D11\u6E7A\u6F7D\u73E4\u752B\u83E9\u88DC\u8913\u8B5C\u8F14\u4F0F\u50D5\u5310\u535C\u5B93\u5FA9\u670D\u798F\u8179\u832F\u8514\u8907\u8986\u8F39\u8F3B\u99A5\u9C12\u672C\u4E76\u4FF8\u5949\u5C01\u5CEF\u5CF0\u6367\u68D2\u70FD\u71A2\u742B\u7E2B\u84EC\u8702\u9022\u92D2\u9CF3\u4E0D\u4ED8\u4FEF\u5085\u5256\u526F\u5426\u5490\u57E0\u592B\u5A66\"],\n[\"dda1\",\"\u5B5A\u5B75\u5BCC\u5E9C\uF966\u6276\u6577\u65A7\u6D6E\u6EA5\u7236\u7B26\u7C3F\u7F36\u8150\u8151\u819A\u8240\u8299\u83A9\u8A03\u8CA0\u8CE6\u8CFB\u8D74\u8DBA\u90E8\u91DC\u961C\u9644\u99D9\u9CE7\u5317\u5206\u5429\u5674\u58B3\u5954\u596E\u5FFF\u61A4\u626E\u6610\u6C7E\u711A\u76C6\u7C89\u7CDE\u7D1B\u82AC\u8CC1\u96F0\uF967\u4F5B\u5F17\u5F7F\u62C2\u5D29\u670B\u68DA\u787C\u7E43\u9D6C\u4E15\u5099\u5315\u532A\u5351\u5983\u5A62\u5E87\u60B2\u618A\u6249\u6279\u6590\u6787\u69A7\u6BD4\u6BD6\u6BD7\u6BD8\u6CB8\uF968\u7435\u75FA\u7812\u7891\u79D5\u79D8\u7C83\u7DCB\u7FE1\u80A5\"],\n[\"dea1\",\"\u813E\u81C2\u83F2\u871A\u88E8\u8AB9\u8B6C\u8CBB\u9119\u975E\u98DB\u9F3B\u56AC\u5B2A\u5F6C\u658C\u6AB3\u6BAF\u6D5C\u6FF1\u7015\u725D\u73AD\u8CA7\u8CD3\u983B\u6191\u6C37\u8058\u9A01\u4E4D\u4E8B\u4E9B\u4ED5\u4F3A\u4F3C\u4F7F\u4FDF\u50FF\u53F2\u53F8\u5506\u55E3\u56DB\u58EB\u5962\u5A11\u5BEB\u5BFA\u5C04\u5DF3\u5E2B\u5F99\u601D\u6368\u659C\u65AF\u67F6\u67FB\u68AD\u6B7B\u6C99\u6CD7\u6E23\u7009\u7345\u7802\u793E\u7940\u7960\u79C1\u7BE9\u7D17\u7D72\u8086\u820D\u838E\u84D1\u86C7\u88DF\u8A50\u8A5E\u8B1D\u8CDC\u8D66\u8FAD\u90AA\u98FC\u99DF\u9E9D\u524A\uF969\u6714\uF96A\"],\n[\"dfa1\",\"\u5098\u522A\u5C71\u6563\u6C55\u73CA\u7523\u759D\u7B97\u849C\u9178\u9730\u4E77\u6492\u6BBA\u715E\u85A9\u4E09\uF96B\u6749\u68EE\u6E17\u829F\u8518\u886B\u63F7\u6F81\u9212\u98AF\u4E0A\u50B7\u50CF\u511F\u5546\u55AA\u5617\u5B40\u5C19\u5CE0\u5E38\u5E8A\u5EA0\u5EC2\u60F3\u6851\u6A61\u6E58\u723D\u7240\u72C0\u76F8\u7965\u7BB1\u7FD4\u88F3\u89F4\u8A73\u8C61\u8CDE\u971C\u585E\u74BD\u8CFD\u55C7\uF96C\u7A61\u7D22\u8272\u7272\u751F\u7525\uF96D\u7B19\u5885\u58FB\u5DBC\u5E8F\u5EB6\u5F90\u6055\u6292\u637F\u654D\u6691\u66D9\u66F8\u6816\u68F2\u7280\u745E\u7B6E\u7D6E\u7DD6\u7F72\"],\n[\"e0a1\",\"\u80E5\u8212\u85AF\u897F\u8A93\u901D\u92E4\u9ECD\u9F20\u5915\u596D\u5E2D\u60DC\u6614\u6673\u6790\u6C50\u6DC5\u6F5F\u77F3\u78A9\u84C6\u91CB\u932B\u4ED9\u50CA\u5148\u5584\u5B0B\u5BA3\u6247\u657E\u65CB\u6E32\u717D\u7401\u7444\u7487\u74BF\u766C\u79AA\u7DDA\u7E55\u7FA8\u817A\u81B3\u8239\u861A\u87EC\u8A75\u8DE3\u9078\u9291\u9425\u994D\u9BAE\u5368\u5C51\u6954\u6CC4\u6D29\u6E2B\u820C\u859B\u893B\u8A2D\u8AAA\u96EA\u9F67\u5261\u66B9\u6BB2\u7E96\u87FE\u8D0D\u9583\u965D\u651D\u6D89\u71EE\uF96E\u57CE\u59D3\u5BAC\u6027\u60FA\u6210\u661F\u665F\u7329\u73F9\u76DB\u7701\u7B6C\"],\n[\"e1a1\",\"\u8056\u8072\u8165\u8AA0\u9192\u4E16\u52E2\u6B72\u6D17\u7A05\u7B39\u7D30\uF96F\u8CB0\u53EC\u562F\u5851\u5BB5\u5C0F\u5C11\u5DE2\u6240\u6383\u6414\u662D\u68B3\u6CBC\u6D88\u6EAF\u701F\u70A4\u71D2\u7526\u758F\u758E\u7619\u7B11\u7BE0\u7C2B\u7D20\u7D39\u852C\u856D\u8607\u8A34\u900D\u9061\u90B5\u92B7\u97F6\u9A37\u4FD7\u5C6C\u675F\u6D91\u7C9F\u7E8C\u8B16\u8D16\u901F\u5B6B\u5DFD\u640D\u84C0\u905C\u98E1\u7387\u5B8B\u609A\u677E\u6DDE\u8A1F\u8AA6\u9001\u980C\u5237\uF970\u7051\u788E\u9396\u8870\u91D7\u4FEE\u53D7\u55FD\u56DA\u5782\u58FD\u5AC2\u5B88\u5CAB\u5CC0\u5E25\u6101\"],\n[\"e2a1\",\"\u620D\u624B\u6388\u641C\u6536\u6578\u6A39\u6B8A\u6C34\u6D19\u6F31\u71E7\u72E9\u7378\u7407\u74B2\u7626\u7761\u79C0\u7A57\u7AEA\u7CB9\u7D8F\u7DAC\u7E61\u7F9E\u8129\u8331\u8490\u84DA\u85EA\u8896\u8AB0\u8B90\u8F38\u9042\u9083\u916C\u9296\u92B9\u968B\u96A7\u96A8\u96D6\u9700\u9808\u9996\u9AD3\u9B1A\u53D4\u587E\u5919\u5B70\u5BBF\u6DD1\u6F5A\u719F\u7421\u74B9\u8085\u83FD\u5DE1\u5F87\u5FAA\u6042\u65EC\u6812\u696F\u6A53\u6B89\u6D35\u6DF3\u73E3\u76FE\u77AC\u7B4D\u7D14\u8123\u821C\u8340\u84F4\u8563\u8A62\u8AC4\u9187\u931E\u9806\u99B4\u620C\u8853\u8FF0\u9265\u5D07\u5D27\"],\n[\"e3a1\",\"\u5D69\u745F\u819D\u8768\u6FD5\u62FE\u7FD2\u8936\u8972\u4E1E\u4E58\u50E7\u52DD\u5347\u627F\u6607\u7E69\u8805\u965E\u4F8D\u5319\u5636\u59CB\u5AA4\u5C38\u5C4E\u5C4D\u5E02\u5F11\u6043\u65BD\u662F\u6642\u67BE\u67F4\u731C\u77E2\u793A\u7FC5\u8494\u84CD\u8996\u8A66\u8A69\u8AE1\u8C55\u8C7A\u57F4\u5BD4\u5F0F\u606F\u62ED\u690D\u6B96\u6E5C\u7184\u7BD2\u8755\u8B58\u8EFE\u98DF\u98FE\u4F38\u4F81\u4FE1\u547B\u5A20\u5BB8\u613C\u65B0\u6668\u71FC\u7533\u795E\u7D33\u814E\u81E3\u8398\u85AA\u85CE\u8703\u8A0A\u8EAB\u8F9B\uF971\u8FC5\u5931\u5BA4\u5BE6\u6089\u5BE9\u5C0B\u5FC3\u6C81\"],\n[\"e4a1\",\"\uF972\u6DF1\u700B\u751A\u82AF\u8AF6\u4EC0\u5341\uF973\u96D9\u6C0F\u4E9E\u4FC4\u5152\u555E\u5A25\u5CE8\u6211\u7259\u82BD\u83AA\u86FE\u8859\u8A1D\u963F\u96C5\u9913\u9D09\u9D5D\u580A\u5CB3\u5DBD\u5E44\u60E1\u6115\u63E1\u6A02\u6E25\u9102\u9354\u984E\u9C10\u9F77\u5B89\u5CB8\u6309\u664F\u6848\u773C\u96C1\u978D\u9854\u9B9F\u65A1\u8B01\u8ECB\u95BC\u5535\u5CA9\u5DD6\u5EB5\u6697\u764C\u83F4\u95C7\u58D3\u62BC\u72CE\u9D28\u4EF0\u592E\u600F\u663B\u6B83\u79E7\u9D26\u5393\u54C0\u57C3\u5D16\u611B\u66D6\u6DAF\u788D\u827E\u9698\u9744\u5384\u627C\u6396\u6DB2\u7E0A\u814B\u984D\"],\n[\"e5a1\",\"\u6AFB\u7F4C\u9DAF\u9E1A\u4E5F\u503B\u51B6\u591C\u60F9\u63F6\u6930\u723A\u8036\uF974\u91CE\u5F31\uF975\uF976\u7D04\u82E5\u846F\u84BB\u85E5\u8E8D\uF977\u4F6F\uF978\uF979\u58E4\u5B43\u6059\u63DA\u6518\u656D\u6698\uF97A\u694A\u6A23\u6D0B\u7001\u716C\u75D2\u760D\u79B3\u7A70\uF97B\u7F8A\uF97C\u8944\uF97D\u8B93\u91C0\u967D\uF97E\u990A\u5704\u5FA1\u65BC\u6F01\u7600\u79A6\u8A9E\u99AD\u9B5A\u9F6C\u5104\u61B6\u6291\u6A8D\u81C6\u5043\u5830\u5F66\u7109\u8A00\u8AFA\u5B7C\u8616\u4FFA\u513C\u56B4\u5944\u63A9\u6DF9\u5DAA\u696D\u5186\u4E88\u4F59\uF97F\uF980\uF981\u5982\uF982\"],\n[\"e6a1\",\"\uF983\u6B5F\u6C5D\uF984\u74B5\u7916\uF985\u8207\u8245\u8339\u8F3F\u8F5D\uF986\u9918\uF987\uF988\uF989\u4EA6\uF98A\u57DF\u5F79\u6613\uF98B\uF98C\u75AB\u7E79\u8B6F\uF98D\u9006\u9A5B\u56A5\u5827\u59F8\u5A1F\u5BB4\uF98E\u5EF6\uF98F\uF990\u6350\u633B\uF991\u693D\u6C87\u6CBF\u6D8E\u6D93\u6DF5\u6F14\uF992\u70DF\u7136\u7159\uF993\u71C3\u71D5\uF994\u784F\u786F\uF995\u7B75\u7DE3\uF996\u7E2F\uF997\u884D\u8EDF\uF998\uF999\uF99A\u925B\uF99B\u9CF6\uF99C\uF99D\uF99E\u6085\u6D85\uF99F\u71B1\uF9A0\uF9A1\u95B1\u53AD\uF9A2\uF9A3\uF9A4\u67D3\uF9A5\u708E\u7130\u7430\u8276\u82D2\"],\n[\"e7a1\",\"\uF9A6\u95BB\u9AE5\u9E7D\u66C4\uF9A7\u71C1\u8449\uF9A8\uF9A9\u584B\uF9AA\uF9AB\u5DB8\u5F71\uF9AC\u6620\u668E\u6979\u69AE\u6C38\u6CF3\u6E36\u6F41\u6FDA\u701B\u702F\u7150\u71DF\u7370\uF9AD\u745B\uF9AE\u74D4\u76C8\u7A4E\u7E93\uF9AF\uF9B0\u82F1\u8A60\u8FCE\uF9B1\u9348\uF9B2\u9719\uF9B3\uF9B4\u4E42\u502A\uF9B5\u5208\u53E1\u66F3\u6C6D\u6FCA\u730A\u777F\u7A62\u82AE\u85DD\u8602\uF9B6\u88D4\u8A63\u8B7D\u8C6B\uF9B7\u92B3\uF9B8\u9713\u9810\u4E94\u4F0D\u4FC9\u50B2\u5348\u543E\u5433\u55DA\u5862\u58BA\u5967\u5A1B\u5BE4\u609F\uF9B9\u61CA\u6556\u65FF\u6664\u68A7\u6C5A\u6FB3\"],\n[\"e8a1\",\"\u70CF\u71AC\u7352\u7B7D\u8708\u8AA4\u9C32\u9F07\u5C4B\u6C83\u7344\u7389\u923A\u6EAB\u7465\u761F\u7A69\u7E15\u860A\u5140\u58C5\u64C1\u74EE\u7515\u7670\u7FC1\u9095\u96CD\u9954\u6E26\u74E6\u7AA9\u7AAA\u81E5\u86D9\u8778\u8A1B\u5A49\u5B8C\u5B9B\u68A1\u6900\u6D63\u73A9\u7413\u742C\u7897\u7DE9\u7FEB\u8118\u8155\u839E\u8C4C\u962E\u9811\u66F0\u5F80\u65FA\u6789\u6C6A\u738B\u502D\u5A03\u6B6A\u77EE\u5916\u5D6C\u5DCD\u7325\u754F\uF9BA\uF9BB\u50E5\u51F9\u582F\u592D\u5996\u59DA\u5BE5\uF9BC\uF9BD\u5DA2\u62D7\u6416\u6493\u64FE\uF9BE\u66DC\uF9BF\u6A48\uF9C0\u71FF\u7464\uF9C1\"],\n[\"e9a1\",\"\u7A88\u7AAF\u7E47\u7E5E\u8000\u8170\uF9C2\u87EF\u8981\u8B20\u9059\uF9C3\u9080\u9952\u617E\u6B32\u6D74\u7E1F\u8925\u8FB1\u4FD1\u50AD\u5197\u52C7\u57C7\u5889\u5BB9\u5EB8\u6142\u6995\u6D8C\u6E67\u6EB6\u7194\u7462\u7528\u752C\u8073\u8338\u84C9\u8E0A\u9394\u93DE\uF9C4\u4E8E\u4F51\u5076\u512A\u53C8\u53CB\u53F3\u5B87\u5BD3\u5C24\u611A\u6182\u65F4\u725B\u7397\u7440\u76C2\u7950\u7991\u79B9\u7D06\u7FBD\u828B\u85D5\u865E\u8FC2\u9047\u90F5\u91EA\u9685\u96E8\u96E9\u52D6\u5F67\u65ED\u6631\u682F\u715C\u7A36\u90C1\u980A\u4E91\uF9C5\u6A52\u6B9E\u6F90\u7189\u8018\u82B8\u8553\"],\n[\"eaa1\",\"\u904B\u9695\u96F2\u97FB\u851A\u9B31\u4E90\u718A\u96C4\u5143\u539F\u54E1\u5713\u5712\u57A3\u5A9B\u5AC4\u5BC3\u6028\u613F\u63F4\u6C85\u6D39\u6E72\u6E90\u7230\u733F\u7457\u82D1\u8881\u8F45\u9060\uF9C6\u9662\u9858\u9D1B\u6708\u8D8A\u925E\u4F4D\u5049\u50DE\u5371\u570D\u59D4\u5A01\u5C09\u6170\u6690\u6E2D\u7232\u744B\u7DEF\u80C3\u840E\u8466\u853F\u875F\u885B\u8918\u8B02\u9055\u97CB\u9B4F\u4E73\u4F91\u5112\u516A\uF9C7\u552F\u55A9\u5B7A\u5BA5\u5E7C\u5E7D\u5EBE\u60A0\u60DF\u6108\u6109\u63C4\u6538\u6709\uF9C8\u67D4\u67DA\uF9C9\u6961\u6962\u6CB9\u6D27\uF9CA\u6E38\uF9CB\"],\n[\"eba1\",\"\u6FE1\u7336\u7337\uF9CC\u745C\u7531\uF9CD\u7652\uF9CE\uF9CF\u7DAD\u81FE\u8438\u88D5\u8A98\u8ADB\u8AED\u8E30\u8E42\u904A\u903E\u907A\u9149\u91C9\u936E\uF9D0\uF9D1\u5809\uF9D2\u6BD3\u8089\u80B2\uF9D3\uF9D4\u5141\u596B\u5C39\uF9D5\uF9D6\u6F64\u73A7\u80E4\u8D07\uF9D7\u9217\u958F\uF9D8\uF9D9\uF9DA\uF9DB\u807F\u620E\u701C\u7D68\u878D\uF9DC\u57A0\u6069\u6147\u6BB7\u8ABE\u9280\u96B1\u4E59\u541F\u6DEB\u852D\u9670\u97F3\u98EE\u63D6\u6CE3\u9091\u51DD\u61C9\u81BA\u9DF9\u4F9D\u501A\u5100\u5B9C\u610F\u61FF\u64EC\u6905\u6BC5\u7591\u77E3\u7FA9\u8264\u858F\u87FB\u8863\u8ABC\"],\n[\"eca1\",\"\u8B70\u91AB\u4E8C\u4EE5\u4F0A\uF9DD\uF9DE\u5937\u59E8\uF9DF\u5DF2\u5F1B\u5F5B\u6021\uF9E0\uF9E1\uF9E2\uF9E3\u723E\u73E5\uF9E4\u7570\u75CD\uF9E5\u79FB\uF9E6\u800C\u8033\u8084\u82E1\u8351\uF9E7\uF9E8\u8CBD\u8CB3\u9087\uF9E9\uF9EA\u98F4\u990C\uF9EB\uF9EC\u7037\u76CA\u7FCA\u7FCC\u7FFC\u8B1A\u4EBA\u4EC1\u5203\u5370\uF9ED\u54BD\u56E0\u59FB\u5BC5\u5F15\u5FCD\u6E6E\uF9EE\uF9EF\u7D6A\u8335\uF9F0\u8693\u8A8D\uF9F1\u976D\u9777\uF9F2\uF9F3\u4E00\u4F5A\u4F7E\u58F9\u65E5\u6EA2\u9038\u93B0\u99B9\u4EFB\u58EC\u598A\u59D9\u6041\uF9F4\uF9F5\u7A14\uF9F6\u834F\u8CC3\u5165\u5344\"],\n[\"eda1\",\"\uF9F7\uF9F8\uF9F9\u4ECD\u5269\u5B55\u82BF\u4ED4\u523A\u54A8\u59C9\u59FF\u5B50\u5B57\u5B5C\u6063\u6148\u6ECB\u7099\u716E\u7386\u74F7\u75B5\u78C1\u7D2B\u8005\u81EA\u8328\u8517\u85C9\u8AEE\u8CC7\u96CC\u4F5C\u52FA\u56BC\u65AB\u6628\u707C\u70B8\u7235\u7DBD\u828D\u914C\u96C0\u9D72\u5B71\u68E7\u6B98\u6F7A\u76DE\u5C91\u66AB\u6F5B\u7BB4\u7C2A\u8836\u96DC\u4E08\u4ED7\u5320\u5834\u58BB\u58EF\u596C\u5C07\u5E33\u5E84\u5F35\u638C\u66B2\u6756\u6A1F\u6AA3\u6B0C\u6F3F\u7246\uF9FA\u7350\u748B\u7AE0\u7CA7\u8178\u81DF\u81E7\u838A\u846C\u8523\u8594\u85CF\u88DD\u8D13\u91AC\u9577\"],\n[\"eea1\",\"\u969C\u518D\u54C9\u5728\u5BB0\u624D\u6750\u683D\u6893\u6E3D\u6ED3\u707D\u7E21\u88C1\u8CA1\u8F09\u9F4B\u9F4E\u722D\u7B8F\u8ACD\u931A\u4F47\u4F4E\u5132\u5480\u59D0\u5E95\u62B5\u6775\u696E\u6A17\u6CAE\u6E1A\u72D9\u732A\u75BD\u7BB8\u7D35\u82E7\u83F9\u8457\u85F7\u8A5B\u8CAF\u8E87\u9019\u90B8\u96CE\u9F5F\u52E3\u540A\u5AE1\u5BC2\u6458\u6575\u6EF4\u72C4\uF9FB\u7684\u7A4D\u7B1B\u7C4D\u7E3E\u7FDF\u837B\u8B2B\u8CCA\u8D64\u8DE1\u8E5F\u8FEA\u8FF9\u9069\u93D1\u4F43\u4F7A\u50B3\u5168\u5178\u524D\u526A\u5861\u587C\u5960\u5C08\u5C55\u5EDB\u609B\u6230\u6813\u6BBF\u6C08\u6FB1\"],\n[\"efa1\",\"\u714E\u7420\u7530\u7538\u7551\u7672\u7B4C\u7B8B\u7BAD\u7BC6\u7E8F\u8A6E\u8F3E\u8F49\u923F\u9293\u9322\u942B\u96FB\u985A\u986B\u991E\u5207\u622A\u6298\u6D59\u7664\u7ACA\u7BC0\u7D76\u5360\u5CBE\u5E97\u6F38\u70B9\u7C98\u9711\u9B8E\u9EDE\u63A5\u647A\u8776\u4E01\u4E95\u4EAD\u505C\u5075\u5448\u59C3\u5B9A\u5E40\u5EAD\u5EF7\u5F81\u60C5\u633A\u653F\u6574\u65CC\u6676\u6678\u67FE\u6968\u6A89\u6B63\u6C40\u6DC0\u6DE8\u6E1F\u6E5E\u701E\u70A1\u738E\u73FD\u753A\u775B\u7887\u798E\u7A0B\u7A7D\u7CBE\u7D8E\u8247\u8A02\u8AEA\u8C9E\u912D\u914A\u91D8\u9266\u92CC\u9320\u9706\u9756\"],\n[\"f0a1\",\"\u975C\u9802\u9F0E\u5236\u5291\u557C\u5824\u5E1D\u5F1F\u608C\u63D0\u68AF\u6FDF\u796D\u7B2C\u81CD\u85BA\u88FD\u8AF8\u8E44\u918D\u9664\u969B\u973D\u984C\u9F4A\u4FCE\u5146\u51CB\u52A9\u5632\u5F14\u5F6B\u63AA\u64CD\u65E9\u6641\u66FA\u66F9\u671D\u689D\u68D7\u69FD\u6F15\u6F6E\u7167\u71E5\u722A\u74AA\u773A\u7956\u795A\u79DF\u7A20\u7A95\u7C97\u7CDF\u7D44\u7E70\u8087\u85FB\u86A4\u8A54\u8ABF\u8D99\u8E81\u9020\u906D\u91E3\u963B\u96D5\u9CE5\u65CF\u7C07\u8DB3\u93C3\u5B58\u5C0A\u5352\u62D9\u731D\u5027\u5B97\u5F9E\u60B0\u616B\u68D5\u6DD9\u742E\u7A2E\u7D42\u7D9C\u7E31\u816B\"],\n[\"f1a1\",\"\u8E2A\u8E35\u937E\u9418\u4F50\u5750\u5DE6\u5EA7\u632B\u7F6A\u4E3B\u4F4F\u4F8F\u505A\u59DD\u80C4\u546A\u5468\u55FE\u594F\u5B99\u5DDE\u5EDA\u665D\u6731\u67F1\u682A\u6CE8\u6D32\u6E4A\u6F8D\u70B7\u73E0\u7587\u7C4C\u7D02\u7D2C\u7DA2\u821F\u86DB\u8A3B\u8A85\u8D70\u8E8A\u8F33\u9031\u914E\u9152\u9444\u99D0\u7AF9\u7CA5\u4FCA\u5101\u51C6\u57C8\u5BEF\u5CFB\u6659\u6A3D\u6D5A\u6E96\u6FEC\u710C\u756F\u7AE3\u8822\u9021\u9075\u96CB\u99FF\u8301\u4E2D\u4EF2\u8846\u91CD\u537D\u6ADB\u696B\u6C41\u847A\u589E\u618E\u66FE\u62EF\u70DD\u7511\u75C7\u7E52\u84B8\u8B49\u8D08\u4E4B\u53EA\"],\n[\"f2a1\",\"\u54AB\u5730\u5740\u5FD7\u6301\u6307\u646F\u652F\u65E8\u667A\u679D\u67B3\u6B62\u6C60\u6C9A\u6F2C\u77E5\u7825\u7949\u7957\u7D19\u80A2\u8102\u81F3\u829D\u82B7\u8718\u8A8C\uF9FC\u8D04\u8DBE\u9072\u76F4\u7A19\u7A37\u7E54\u8077\u5507\u55D4\u5875\u632F\u6422\u6649\u664B\u686D\u699B\u6B84\u6D25\u6EB1\u73CD\u7468\u74A1\u755B\u75B9\u76E1\u771E\u778B\u79E6\u7E09\u7E1D\u81FB\u852F\u8897\u8A3A\u8CD1\u8EEB\u8FB0\u9032\u93AD\u9663\u9673\u9707\u4F84\u53F1\u59EA\u5AC9\u5E19\u684E\u74C6\u75BE\u79E9\u7A92\u81A3\u86ED\u8CEA\u8DCC\u8FED\u659F\u6715\uF9FD\u57F7\u6F57\u7DDD\u8F2F\"],\n[\"f3a1\",\"\u93F6\u96C6\u5FB5\u61F2\u6F84\u4E14\u4F98\u501F\u53C9\u55DF\u5D6F\u5DEE\u6B21\u6B64\u78CB\u7B9A\uF9FE\u8E49\u8ECA\u906E\u6349\u643E\u7740\u7A84\u932F\u947F\u9F6A\u64B0\u6FAF\u71E6\u74A8\u74DA\u7AC4\u7C12\u7E82\u7CB2\u7E98\u8B9A\u8D0A\u947D\u9910\u994C\u5239\u5BDF\u64E6\u672D\u7D2E\u50ED\u53C3\u5879\u6158\u6159\u61FA\u65AC\u7AD9\u8B92\u8B96\u5009\u5021\u5275\u5531\u5A3C\u5EE0\u5F70\u6134\u655E\u660C\u6636\u66A2\u69CD\u6EC4\u6F32\u7316\u7621\u7A93\u8139\u8259\u83D6\u84BC\u50B5\u57F0\u5BC0\u5BE8\u5F69\u63A1\u7826\u7DB5\u83DC\u8521\u91C7\u91F5\u518A\u67F5\u7B56\"],\n[\"f4a1\",\"\u8CAC\u51C4\u59BB\u60BD\u8655\u501C\uF9FF\u5254\u5C3A\u617D\u621A\u62D3\u64F2\u65A5\u6ECC\u7620\u810A\u8E60\u965F\u96BB\u4EDF\u5343\u5598\u5929\u5DDD\u64C5\u6CC9\u6DFA\u7394\u7A7F\u821B\u85A6\u8CE4\u8E10\u9077\u91E7\u95E1\u9621\u97C6\u51F8\u54F2\u5586\u5FB9\u64A4\u6F88\u7DB4\u8F1F\u8F4D\u9435\u50C9\u5C16\u6CBE\u6DFB\u751B\u77BB\u7C3D\u7C64\u8A79\u8AC2\u581E\u59BE\u5E16\u6377\u7252\u758A\u776B\u8ADC\u8CBC\u8F12\u5EF3\u6674\u6DF8\u807D\u83C1\u8ACB\u9751\u9BD6\uFA00\u5243\u66FF\u6D95\u6EEF\u7DE0\u8AE6\u902E\u905E\u9AD4\u521D\u527F\u54E8\u6194\u6284\u62DB\u68A2\"],\n[\"f5a1\",\"\u6912\u695A\u6A35\u7092\u7126\u785D\u7901\u790E\u79D2\u7A0D\u8096\u8278\u82D5\u8349\u8549\u8C82\u8D85\u9162\u918B\u91AE\u4FC3\u56D1\u71ED\u77D7\u8700\u89F8\u5BF8\u5FD6\u6751\u90A8\u53E2\u585A\u5BF5\u60A4\u6181\u6460\u7E3D\u8070\u8525\u9283\u64AE\u50AC\u5D14\u6700\u589C\u62BD\u63A8\u690E\u6978\u6A1E\u6E6B\u76BA\u79CB\u82BB\u8429\u8ACF\u8DA8\u8FFD\u9112\u914B\u919C\u9310\u9318\u939A\u96DB\u9A36\u9C0D\u4E11\u755C\u795D\u7AFA\u7B51\u7BC9\u7E2E\u84C4\u8E59\u8E74\u8EF8\u9010\u6625\u693F\u7443\u51FA\u672E\u9EDC\u5145\u5FE0\u6C96\u87F2\u885D\u8877\u60B4\u81B5\u8403\"],\n[\"f6a1\",\"\u8D05\u53D6\u5439\u5634\u5A36\u5C31\u708A\u7FE0\u805A\u8106\u81ED\u8DA3\u9189\u9A5F\u9DF2\u5074\u4EC4\u53A0\u60FB\u6E2C\u5C64\u4F88\u5024\u55E4\u5CD9\u5E5F\u6065\u6894\u6CBB\u6DC4\u71BE\u75D4\u75F4\u7661\u7A1A\u7A49\u7DC7\u7DFB\u7F6E\u81F4\u86A9\u8F1C\u96C9\u99B3\u9F52\u5247\u52C5\u98ED\u89AA\u4E03\u67D2\u6F06\u4FB5\u5BE2\u6795\u6C88\u6D78\u741B\u7827\u91DD\u937C\u87C4\u79E4\u7A31\u5FEB\u4ED6\u54A4\u553E\u58AE\u59A5\u60F0\u6253\u62D6\u6736\u6955\u8235\u9640\u99B1\u99DD\u502C\u5353\u5544\u577C\uFA01\u6258\uFA02\u64E2\u666B\u67DD\u6FC1\u6FEF\u7422\u7438\u8A17\"],\n[\"f7a1\",\"\u9438\u5451\u5606\u5766\u5F48\u619A\u6B4E\u7058\u70AD\u7DBB\u8A95\u596A\u812B\u63A2\u7708\u803D\u8CAA\u5854\u642D\u69BB\u5B95\u5E11\u6E6F\uFA03\u8569\u514C\u53F0\u592A\u6020\u614B\u6B86\u6C70\u6CF0\u7B1E\u80CE\u82D4\u8DC6\u90B0\u98B1\uFA04\u64C7\u6FA4\u6491\u6504\u514E\u5410\u571F\u8A0E\u615F\u6876\uFA05\u75DB\u7B52\u7D71\u901A\u5806\u69CC\u817F\u892A\u9000\u9839\u5078\u5957\u59AC\u6295\u900F\u9B2A\u615D\u7279\u95D6\u5761\u5A46\u5DF4\u628A\u64AD\u64FA\u6777\u6CE2\u6D3E\u722C\u7436\u7834\u7F77\u82AD\u8DDB\u9817\u5224\u5742\u677F\u7248\u74E3\u8CA9\u8FA6\u9211\"],\n[\"f8a1\",\"\u962A\u516B\u53ED\u634C\u4F69\u5504\u6096\u6557\u6C9B\u6D7F\u724C\u72FD\u7A17\u8987\u8C9D\u5F6D\u6F8E\u70F9\u81A8\u610E\u4FBF\u504F\u6241\u7247\u7BC7\u7DE8\u7FE9\u904D\u97AD\u9A19\u8CB6\u576A\u5E73\u67B0\u840D\u8A55\u5420\u5B16\u5E63\u5EE2\u5F0A\u6583\u80BA\u853D\u9589\u965B\u4F48\u5305\u530D\u530F\u5486\u54FA\u5703\u5E03\u6016\u629B\u62B1\u6355\uFA06\u6CE1\u6D66\u75B1\u7832\u80DE\u812F\u82DE\u8461\u84B2\u888D\u8912\u900B\u92EA\u98FD\u9B91\u5E45\u66B4\u66DD\u7011\u7206\uFA07\u4FF5\u527D\u5F6A\u6153\u6753\u6A19\u6F02\u74E2\u7968\u8868\u8C79\u98C7\u98C4\u9A43\"],\n[\"f9a1\",\"\u54C1\u7A1F\u6953\u8AF7\u8C4A\u98A8\u99AE\u5F7C\u62AB\u75B2\u76AE\u88AB\u907F\u9642\u5339\u5F3C\u5FC5\u6CCC\u73CC\u7562\u758B\u7B46\u82FE\u999D\u4E4F\u903C\u4E0B\u4F55\u53A6\u590F\u5EC8\u6630\u6CB3\u7455\u8377\u8766\u8CC0\u9050\u971E\u9C15\u58D1\u5B78\u8650\u8B14\u9DB4\u5BD2\u6068\u608D\u65F1\u6C57\u6F22\u6FA3\u701A\u7F55\u7FF0\u9591\u9592\u9650\u97D3\u5272\u8F44\u51FD\u542B\u54B8\u5563\u558A\u6ABB\u6DB5\u7DD8\u8266\u929C\u9677\u9E79\u5408\u54C8\u76D2\u86E4\u95A4\u95D4\u965C\u4EA2\u4F09\u59EE\u5AE6\u5DF7\u6052\u6297\u676D\u6841\u6C86\u6E2F\u7F38\u809B\u822A\"],\n[\"faa1\",\"\uFA08\uFA09\u9805\u4EA5\u5055\u54B3\u5793\u595A\u5B69\u5BB3\u61C8\u6977\u6D77\u7023\u87F9\u89E3\u8A72\u8AE7\u9082\u99ED\u9AB8\u52BE\u6838\u5016\u5E78\u674F\u8347\u884C\u4EAB\u5411\u56AE\u73E6\u9115\u97FF\u9909\u9957\u9999\u5653\u589F\u865B\u8A31\u61B2\u6AF6\u737B\u8ED2\u6B47\u96AA\u9A57\u5955\u7200\u8D6B\u9769\u4FD4\u5CF4\u5F26\u61F8\u665B\u6CEB\u70AB\u7384\u73B9\u73FE\u7729\u774D\u7D43\u7D62\u7E23\u8237\u8852\uFA0A\u8CE2\u9249\u986F\u5B51\u7A74\u8840\u9801\u5ACC\u4FE0\u5354\u593E\u5CFD\u633E\u6D79\u72F9\u8105\u8107\u83A2\u92CF\u9830\u4EA8\u5144\u5211\u578B\"],\n[\"fba1\",\"\u5F62\u6CC2\u6ECE\u7005\u7050\u70AF\u7192\u73E9\u7469\u834A\u87A2\u8861\u9008\u90A2\u93A3\u99A8\u516E\u5F57\u60E0\u6167\u66B3\u8559\u8E4A\u91AF\u978B\u4E4E\u4E92\u547C\u58D5\u58FA\u597D\u5CB5\u5F27\u6236\u6248\u660A\u6667\u6BEB\u6D69\u6DCF\u6E56\u6EF8\u6F94\u6FE0\u6FE9\u705D\u72D0\u7425\u745A\u74E0\u7693\u795C\u7CCA\u7E1E\u80E1\u82A6\u846B\u84BF\u864E\u865F\u8774\u8B77\u8C6A\u93AC\u9800\u9865\u60D1\u6216\u9177\u5A5A\u660F\u6DF7\u6E3E\u743F\u9B42\u5FFD\u60DA\u7B0F\u54C4\u5F18\u6C5E\u6CD3\u6D2A\u70D8\u7D05\u8679\u8A0C\u9D3B\u5316\u548C\u5B05\u6A3A\u706B\u7575\"],\n[\"fca1\",\"\u798D\u79BE\u82B1\u83EF\u8A71\u8B41\u8CA8\u9774\uFA0B\u64F4\u652B\u78BA\u78BB\u7A6B\u4E38\u559A\u5950\u5BA6\u5E7B\u60A3\u63DB\u6B61\u6665\u6853\u6E19\u7165\u74B0\u7D08\u9084\u9A69\u9C25\u6D3B\u6ED1\u733E\u8C41\u95CA\u51F0\u5E4C\u5FA8\u604D\u60F6\u6130\u614C\u6643\u6644\u69A5\u6CC1\u6E5F\u6EC9\u6F62\u714C\u749C\u7687\u7BC1\u7C27\u8352\u8757\u9051\u968D\u9EC3\u532F\u56DE\u5EFB\u5F8A\u6062\u6094\u61F7\u6666\u6703\u6A9C\u6DEE\u6FAE\u7070\u736A\u7E6A\u81BE\u8334\u86D4\u8AA8\u8CC4\u5283\u7372\u5B96\u6A6B\u9404\u54EE\u5686\u5B5D\u6548\u6585\u66C9\u689F\u6D8D\u6DC6\"],\n[\"fda1\",\"\u723B\u80B4\u9175\u9A4D\u4FAF\u5019\u539A\u540E\u543C\u5589\u55C5\u5E3F\u5F8C\u673D\u7166\u73DD\u9005\u52DB\u52F3\u5864\u58CE\u7104\u718F\u71FB\u85B0\u8A13\u6688\u85A8\u55A7\u6684\u714A\u8431\u5349\u5599\u6BC1\u5F59\u5FBD\u63EE\u6689\u7147\u8AF1\u8F1D\u9EBE\u4F11\u643A\u70CB\u7566\u8667\u6064\u8B4E\u9DF8\u5147\u51F6\u5308\u6D36\u80F8\u9ED1\u6615\u6B23\u7098\u75D5\u5403\u5C79\u7D07\u8A16\u6B20\u6B3D\u6B46\u5438\u6070\u6D3D\u7FD5\u8208\u50D6\u51DE\u559C\u566B\u56CD\u59EC\u5B09\u5E0C\u6199\u6198\u6231\u665E\u66E6\u7199\u71B9\u71BA\u72A7\u79A7\u7A00\u7FB2\u8A70\"]\n]\n", "[\n[\"0\",\"\\u0000\",127],\n[\"a140\",\"\u3000\uFF0C\u3001\u3002\uFF0E\u2027\uFF1B\uFF1A\uFF1F\uFF01\uFE30\u2026\u2025\uFE50\uFE51\uFE52\u00B7\uFE54\uFE55\uFE56\uFE57\uFF5C\u2013\uFE31\u2014\uFE33\u2574\uFE34\uFE4F\uFF08\uFF09\uFE35\uFE36\uFF5B\uFF5D\uFE37\uFE38\u3014\u3015\uFE39\uFE3A\u3010\u3011\uFE3B\uFE3C\u300A\u300B\uFE3D\uFE3E\u3008\u3009\uFE3F\uFE40\u300C\u300D\uFE41\uFE42\u300E\u300F\uFE43\uFE44\uFE59\uFE5A\"],\n[\"a1a1\",\"\uFE5B\uFE5C\uFE5D\uFE5E\u2018\u2019\u201C\u201D\u301D\u301E\u2035\u2032\uFF03\uFF06\uFF0A\u203B\u00A7\u3003\u25CB\u25CF\u25B3\u25B2\u25CE\u2606\u2605\u25C7\u25C6\u25A1\u25A0\u25BD\u25BC\u32A3\u2105\u00AF\uFFE3\uFF3F\u02CD\uFE49\uFE4A\uFE4D\uFE4E\uFE4B\uFE4C\uFE5F\uFE60\uFE61\uFF0B\uFF0D\u00D7\u00F7\u00B1\u221A\uFF1C\uFF1E\uFF1D\u2266\u2267\u2260\u221E\u2252\u2261\uFE62\",4,\"\uFF5E\u2229\u222A\u22A5\u2220\u221F\u22BF\u33D2\u33D1\u222B\u222E\u2235\u2234\u2640\u2642\u2295\u2299\u2191\u2193\u2190\u2192\u2196\u2197\u2199\u2198\u2225\u2223\uFF0F\"],\n[\"a240\",\"\uFF3C\u2215\uFE68\uFF04\uFFE5\u3012\uFFE0\uFFE1\uFF05\uFF20\u2103\u2109\uFE69\uFE6A\uFE6B\u33D5\u339C\u339D\u339E\u33CE\u33A1\u338E\u338F\u33C4\u00B0\u5159\u515B\u515E\u515D\u5161\u5163\u55E7\u74E9\u7CCE\u2581\",7,\"\u258F\u258E\u258D\u258C\u258B\u258A\u2589\u253C\u2534\u252C\u2524\u251C\u2594\u2500\u2502\u2595\u250C\u2510\u2514\u2518\u256D\"],\n[\"a2a1\",\"\u256E\u2570\u256F\u2550\u255E\u256A\u2561\u25E2\u25E3\u25E5\u25E4\u2571\u2572\u2573\uFF10\",9,\"\u2160\",9,\"\u3021\",8,\"\u5341\u5344\u5345\uFF21\",25,\"\uFF41\",21],\n[\"a340\",\"\uFF57\uFF58\uFF59\uFF5A\u0391\",16,\"\u03A3\",6,\"\u03B1\",16,\"\u03C3\",6,\"\u3105\",10],\n[\"a3a1\",\"\u3110\",25,\"\u02D9\u02C9\u02CA\u02C7\u02CB\"],\n[\"a3e1\",\"\u20AC\"],\n[\"a440\",\"\u4E00\u4E59\u4E01\u4E03\u4E43\u4E5D\u4E86\u4E8C\u4EBA\u513F\u5165\u516B\u51E0\u5200\u5201\u529B\u5315\u5341\u535C\u53C8\u4E09\u4E0B\u4E08\u4E0A\u4E2B\u4E38\u51E1\u4E45\u4E48\u4E5F\u4E5E\u4E8E\u4EA1\u5140\u5203\u52FA\u5343\u53C9\u53E3\u571F\u58EB\u5915\u5927\u5973\u5B50\u5B51\u5B53\u5BF8\u5C0F\u5C22\u5C38\u5C71\u5DDD\u5DE5\u5DF1\u5DF2\u5DF3\u5DFE\u5E72\u5EFE\u5F0B\u5F13\u624D\"],\n[\"a4a1\",\"\u4E11\u4E10\u4E0D\u4E2D\u4E30\u4E39\u4E4B\u5C39\u4E88\u4E91\u4E95\u4E92\u4E94\u4EA2\u4EC1\u4EC0\u4EC3\u4EC6\u4EC7\u4ECD\u4ECA\u4ECB\u4EC4\u5143\u5141\u5167\u516D\u516E\u516C\u5197\u51F6\u5206\u5207\u5208\u52FB\u52FE\u52FF\u5316\u5339\u5348\u5347\u5345\u535E\u5384\u53CB\u53CA\u53CD\u58EC\u5929\u592B\u592A\u592D\u5B54\u5C11\u5C24\u5C3A\u5C6F\u5DF4\u5E7B\u5EFF\u5F14\u5F15\u5FC3\u6208\u6236\u624B\u624E\u652F\u6587\u6597\u65A4\u65B9\u65E5\u66F0\u6708\u6728\u6B20\u6B62\u6B79\u6BCB\u6BD4\u6BDB\u6C0F\u6C34\u706B\u722A\u7236\u723B\u7247\u7259\u725B\u72AC\u738B\u4E19\"],\n[\"a540\",\"\u4E16\u4E15\u4E14\u4E18\u4E3B\u4E4D\u4E4F\u4E4E\u4EE5\u4ED8\u4ED4\u4ED5\u4ED6\u4ED7\u4EE3\u4EE4\u4ED9\u4EDE\u5145\u5144\u5189\u518A\u51AC\u51F9\u51FA\u51F8\u520A\u52A0\u529F\u5305\u5306\u5317\u531D\u4EDF\u534A\u5349\u5361\u5360\u536F\u536E\u53BB\u53EF\u53E4\u53F3\u53EC\u53EE\u53E9\u53E8\u53FC\u53F8\u53F5\u53EB\u53E6\u53EA\u53F2\u53F1\u53F0\u53E5\u53ED\u53FB\u56DB\u56DA\u5916\"],\n[\"a5a1\",\"\u592E\u5931\u5974\u5976\u5B55\u5B83\u5C3C\u5DE8\u5DE7\u5DE6\u5E02\u5E03\u5E73\u5E7C\u5F01\u5F18\u5F17\u5FC5\u620A\u6253\u6254\u6252\u6251\u65A5\u65E6\u672E\u672C\u672A\u672B\u672D\u6B63\u6BCD\u6C11\u6C10\u6C38\u6C41\u6C40\u6C3E\u72AF\u7384\u7389\u74DC\u74E6\u7518\u751F\u7528\u7529\u7530\u7531\u7532\u7533\u758B\u767D\u76AE\u76BF\u76EE\u77DB\u77E2\u77F3\u793A\u79BE\u7A74\u7ACB\u4E1E\u4E1F\u4E52\u4E53\u4E69\u4E99\u4EA4\u4EA6\u4EA5\u4EFF\u4F09\u4F19\u4F0A\u4F15\u4F0D\u4F10\u4F11\u4F0F\u4EF2\u4EF6\u4EFB\u4EF0\u4EF3\u4EFD\u4F01\u4F0B\u5149\u5147\u5146\u5148\u5168\"],\n[\"a640\",\"\u5171\u518D\u51B0\u5217\u5211\u5212\u520E\u5216\u52A3\u5308\u5321\u5320\u5370\u5371\u5409\u540F\u540C\u540A\u5410\u5401\u540B\u5404\u5411\u540D\u5408\u5403\u540E\u5406\u5412\u56E0\u56DE\u56DD\u5733\u5730\u5728\u572D\u572C\u572F\u5729\u5919\u591A\u5937\u5938\u5984\u5978\u5983\u597D\u5979\u5982\u5981\u5B57\u5B58\u5B87\u5B88\u5B85\u5B89\u5BFA\u5C16\u5C79\u5DDE\u5E06\u5E76\u5E74\"],\n[\"a6a1\",\"\u5F0F\u5F1B\u5FD9\u5FD6\u620E\u620C\u620D\u6210\u6263\u625B\u6258\u6536\u65E9\u65E8\u65EC\u65ED\u66F2\u66F3\u6709\u673D\u6734\u6731\u6735\u6B21\u6B64\u6B7B\u6C16\u6C5D\u6C57\u6C59\u6C5F\u6C60\u6C50\u6C55\u6C61\u6C5B\u6C4D\u6C4E\u7070\u725F\u725D\u767E\u7AF9\u7C73\u7CF8\u7F36\u7F8A\u7FBD\u8001\u8003\u800C\u8012\u8033\u807F\u8089\u808B\u808C\u81E3\u81EA\u81F3\u81FC\u820C\u821B\u821F\u826E\u8272\u827E\u866B\u8840\u884C\u8863\u897F\u9621\u4E32\u4EA8\u4F4D\u4F4F\u4F47\u4F57\u4F5E\u4F34\u4F5B\u4F55\u4F30\u4F50\u4F51\u4F3D\u4F3A\u4F38\u4F43\u4F54\u4F3C\u4F46\u4F63\"],\n[\"a740\",\"\u4F5C\u4F60\u4F2F\u4F4E\u4F36\u4F59\u4F5D\u4F48\u4F5A\u514C\u514B\u514D\u5175\u51B6\u51B7\u5225\u5224\u5229\u522A\u5228\u52AB\u52A9\u52AA\u52AC\u5323\u5373\u5375\u541D\u542D\u541E\u543E\u5426\u544E\u5427\u5446\u5443\u5433\u5448\u5442\u541B\u5429\u544A\u5439\u543B\u5438\u542E\u5435\u5436\u5420\u543C\u5440\u5431\u542B\u541F\u542C\u56EA\u56F0\u56E4\u56EB\u574A\u5751\u5740\u574D\"],\n[\"a7a1\",\"\u5747\u574E\u573E\u5750\u574F\u573B\u58EF\u593E\u599D\u5992\u59A8\u599E\u59A3\u5999\u5996\u598D\u59A4\u5993\u598A\u59A5\u5B5D\u5B5C\u5B5A\u5B5B\u5B8C\u5B8B\u5B8F\u5C2C\u5C40\u5C41\u5C3F\u5C3E\u5C90\u5C91\u5C94\u5C8C\u5DEB\u5E0C\u5E8F\u5E87\u5E8A\u5EF7\u5F04\u5F1F\u5F64\u5F62\u5F77\u5F79\u5FD8\u5FCC\u5FD7\u5FCD\u5FF1\u5FEB\u5FF8\u5FEA\u6212\u6211\u6284\u6297\u6296\u6280\u6276\u6289\u626D\u628A\u627C\u627E\u6279\u6273\u6292\u626F\u6298\u626E\u6295\u6293\u6291\u6286\u6539\u653B\u6538\u65F1\u66F4\u675F\u674E\u674F\u6750\u6751\u675C\u6756\u675E\u6749\u6746\u6760\"],\n[\"a840\",\"\u6753\u6757\u6B65\u6BCF\u6C42\u6C5E\u6C99\u6C81\u6C88\u6C89\u6C85\u6C9B\u6C6A\u6C7A\u6C90\u6C70\u6C8C\u6C68\u6C96\u6C92\u6C7D\u6C83\u6C72\u6C7E\u6C74\u6C86\u6C76\u6C8D\u6C94\u6C98\u6C82\u7076\u707C\u707D\u7078\u7262\u7261\u7260\u72C4\u72C2\u7396\u752C\u752B\u7537\u7538\u7682\u76EF\u77E3\u79C1\u79C0\u79BF\u7A76\u7CFB\u7F55\u8096\u8093\u809D\u8098\u809B\u809A\u80B2\u826F\u8292\"],\n[\"a8a1\",\"\u828B\u828D\u898B\u89D2\u8A00\u8C37\u8C46\u8C55\u8C9D\u8D64\u8D70\u8DB3\u8EAB\u8ECA\u8F9B\u8FB0\u8FC2\u8FC6\u8FC5\u8FC4\u5DE1\u9091\u90A2\u90AA\u90A6\u90A3\u9149\u91C6\u91CC\u9632\u962E\u9631\u962A\u962C\u4E26\u4E56\u4E73\u4E8B\u4E9B\u4E9E\u4EAB\u4EAC\u4F6F\u4F9D\u4F8D\u4F73\u4F7F\u4F6C\u4F9B\u4F8B\u4F86\u4F83\u4F70\u4F75\u4F88\u4F69\u4F7B\u4F96\u4F7E\u4F8F\u4F91\u4F7A\u5154\u5152\u5155\u5169\u5177\u5176\u5178\u51BD\u51FD\u523B\u5238\u5237\u523A\u5230\u522E\u5236\u5241\u52BE\u52BB\u5352\u5354\u5353\u5351\u5366\u5377\u5378\u5379\u53D6\u53D4\u53D7\u5473\u5475\"],\n[\"a940\",\"\u5496\u5478\u5495\u5480\u547B\u5477\u5484\u5492\u5486\u547C\u5490\u5471\u5476\u548C\u549A\u5462\u5468\u548B\u547D\u548E\u56FA\u5783\u5777\u576A\u5769\u5761\u5766\u5764\u577C\u591C\u5949\u5947\u5948\u5944\u5954\u59BE\u59BB\u59D4\u59B9\u59AE\u59D1\u59C6\u59D0\u59CD\u59CB\u59D3\u59CA\u59AF\u59B3\u59D2\u59C5\u5B5F\u5B64\u5B63\u5B97\u5B9A\u5B98\u5B9C\u5B99\u5B9B\u5C1A\u5C48\u5C45\"],\n[\"a9a1\",\"\u5C46\u5CB7\u5CA1\u5CB8\u5CA9\u5CAB\u5CB1\u5CB3\u5E18\u5E1A\u5E16\u5E15\u5E1B\u5E11\u5E78\u5E9A\u5E97\u5E9C\u5E95\u5E96\u5EF6\u5F26\u5F27\u5F29\u5F80\u5F81\u5F7F\u5F7C\u5FDD\u5FE0\u5FFD\u5FF5\u5FFF\u600F\u6014\u602F\u6035\u6016\u602A\u6015\u6021\u6027\u6029\u602B\u601B\u6216\u6215\u623F\u623E\u6240\u627F\u62C9\u62CC\u62C4\u62BF\u62C2\u62B9\u62D2\u62DB\u62AB\u62D3\u62D4\u62CB\u62C8\u62A8\u62BD\u62BC\u62D0\u62D9\u62C7\u62CD\u62B5\u62DA\u62B1\u62D8\u62D6\u62D7\u62C6\u62AC\u62CE\u653E\u65A7\u65BC\u65FA\u6614\u6613\u660C\u6606\u6602\u660E\u6600\u660F\u6615\u660A\"],\n[\"aa40\",\"\u6607\u670D\u670B\u676D\u678B\u6795\u6771\u679C\u6773\u6777\u6787\u679D\u6797\u676F\u6770\u677F\u6789\u677E\u6790\u6775\u679A\u6793\u677C\u676A\u6772\u6B23\u6B66\u6B67\u6B7F\u6C13\u6C1B\u6CE3\u6CE8\u6CF3\u6CB1\u6CCC\u6CE5\u6CB3\u6CBD\u6CBE\u6CBC\u6CE2\u6CAB\u6CD5\u6CD3\u6CB8\u6CC4\u6CB9\u6CC1\u6CAE\u6CD7\u6CC5\u6CF1\u6CBF\u6CBB\u6CE1\u6CDB\u6CCA\u6CAC\u6CEF\u6CDC\u6CD6\u6CE0\"],\n[\"aaa1\",\"\u7095\u708E\u7092\u708A\u7099\u722C\u722D\u7238\u7248\u7267\u7269\u72C0\u72CE\u72D9\u72D7\u72D0\u73A9\u73A8\u739F\u73AB\u73A5\u753D\u759D\u7599\u759A\u7684\u76C2\u76F2\u76F4\u77E5\u77FD\u793E\u7940\u7941\u79C9\u79C8\u7A7A\u7A79\u7AFA\u7CFE\u7F54\u7F8C\u7F8B\u8005\u80BA\u80A5\u80A2\u80B1\u80A1\u80AB\u80A9\u80B4\u80AA\u80AF\u81E5\u81FE\u820D\u82B3\u829D\u8299\u82AD\u82BD\u829F\u82B9\u82B1\u82AC\u82A5\u82AF\u82B8\u82A3\u82B0\u82BE\u82B7\u864E\u8671\u521D\u8868\u8ECB\u8FCE\u8FD4\u8FD1\u90B5\u90B8\u90B1\u90B6\u91C7\u91D1\u9577\u9580\u961C\u9640\u963F\u963B\u9644\"],\n[\"ab40\",\"\u9642\u96B9\u96E8\u9752\u975E\u4E9F\u4EAD\u4EAE\u4FE1\u4FB5\u4FAF\u4FBF\u4FE0\u4FD1\u4FCF\u4FDD\u4FC3\u4FB6\u4FD8\u4FDF\u4FCA\u4FD7\u4FAE\u4FD0\u4FC4\u4FC2\u4FDA\u4FCE\u4FDE\u4FB7\u5157\u5192\u5191\u51A0\u524E\u5243\u524A\u524D\u524C\u524B\u5247\u52C7\u52C9\u52C3\u52C1\u530D\u5357\u537B\u539A\u53DB\u54AC\u54C0\u54A8\u54CE\u54C9\u54B8\u54A6\u54B3\u54C7\u54C2\u54BD\u54AA\u54C1\"],\n[\"aba1\",\"\u54C4\u54C8\u54AF\u54AB\u54B1\u54BB\u54A9\u54A7\u54BF\u56FF\u5782\u578B\u57A0\u57A3\u57A2\u57CE\u57AE\u5793\u5955\u5951\u594F\u594E\u5950\u59DC\u59D8\u59FF\u59E3\u59E8\u5A03\u59E5\u59EA\u59DA\u59E6\u5A01\u59FB\u5B69\u5BA3\u5BA6\u5BA4\u5BA2\u5BA5\u5C01\u5C4E\u5C4F\u5C4D\u5C4B\u5CD9\u5CD2\u5DF7\u5E1D\u5E25\u5E1F\u5E7D\u5EA0\u5EA6\u5EFA\u5F08\u5F2D\u5F65\u5F88\u5F85\u5F8A\u5F8B\u5F87\u5F8C\u5F89\u6012\u601D\u6020\u6025\u600E\u6028\u604D\u6070\u6068\u6062\u6046\u6043\u606C\u606B\u606A\u6064\u6241\u62DC\u6316\u6309\u62FC\u62ED\u6301\u62EE\u62FD\u6307\u62F1\u62F7\"],\n[\"ac40\",\"\u62EF\u62EC\u62FE\u62F4\u6311\u6302\u653F\u6545\u65AB\u65BD\u65E2\u6625\u662D\u6620\u6627\u662F\u661F\u6628\u6631\u6624\u66F7\u67FF\u67D3\u67F1\u67D4\u67D0\u67EC\u67B6\u67AF\u67F5\u67E9\u67EF\u67C4\u67D1\u67B4\u67DA\u67E5\u67B8\u67CF\u67DE\u67F3\u67B0\u67D9\u67E2\u67DD\u67D2\u6B6A\u6B83\u6B86\u6BB5\u6BD2\u6BD7\u6C1F\u6CC9\u6D0B\u6D32\u6D2A\u6D41\u6D25\u6D0C\u6D31\u6D1E\u6D17\"],\n[\"aca1\",\"\u6D3B\u6D3D\u6D3E\u6D36\u6D1B\u6CF5\u6D39\u6D27\u6D38\u6D29\u6D2E\u6D35\u6D0E\u6D2B\u70AB\u70BA\u70B3\u70AC\u70AF\u70AD\u70B8\u70AE\u70A4\u7230\u7272\u726F\u7274\u72E9\u72E0\u72E1\u73B7\u73CA\u73BB\u73B2\u73CD\u73C0\u73B3\u751A\u752D\u754F\u754C\u754E\u754B\u75AB\u75A4\u75A5\u75A2\u75A3\u7678\u7686\u7687\u7688\u76C8\u76C6\u76C3\u76C5\u7701\u76F9\u76F8\u7709\u770B\u76FE\u76FC\u7707\u77DC\u7802\u7814\u780C\u780D\u7946\u7949\u7948\u7947\u79B9\u79BA\u79D1\u79D2\u79CB\u7A7F\u7A81\u7AFF\u7AFD\u7C7D\u7D02\u7D05\u7D00\u7D09\u7D07\u7D04\u7D06\u7F38\u7F8E\u7FBF\u8004\"],\n[\"ad40\",\"\u8010\u800D\u8011\u8036\u80D6\u80E5\u80DA\u80C3\u80C4\u80CC\u80E1\u80DB\u80CE\u80DE\u80E4\u80DD\u81F4\u8222\u82E7\u8303\u8305\u82E3\u82DB\u82E6\u8304\u82E5\u8302\u8309\u82D2\u82D7\u82F1\u8301\u82DC\u82D4\u82D1\u82DE\u82D3\u82DF\u82EF\u8306\u8650\u8679\u867B\u867A\u884D\u886B\u8981\u89D4\u8A08\u8A02\u8A03\u8C9E\u8CA0\u8D74\u8D73\u8DB4\u8ECD\u8ECC\u8FF0\u8FE6\u8FE2\u8FEA\u8FE5\"],\n[\"ada1\",\"\u8FED\u8FEB\u8FE4\u8FE8\u90CA\u90CE\u90C1\u90C3\u914B\u914A\u91CD\u9582\u9650\u964B\u964C\u964D\u9762\u9769\u97CB\u97ED\u97F3\u9801\u98A8\u98DB\u98DF\u9996\u9999\u4E58\u4EB3\u500C\u500D\u5023\u4FEF\u5026\u5025\u4FF8\u5029\u5016\u5006\u503C\u501F\u501A\u5012\u5011\u4FFA\u5000\u5014\u5028\u4FF1\u5021\u500B\u5019\u5018\u4FF3\u4FEE\u502D\u502A\u4FFE\u502B\u5009\u517C\u51A4\u51A5\u51A2\u51CD\u51CC\u51C6\u51CB\u5256\u525C\u5254\u525B\u525D\u532A\u537F\u539F\u539D\u53DF\u54E8\u5510\u5501\u5537\u54FC\u54E5\u54F2\u5506\u54FA\u5514\u54E9\u54ED\u54E1\u5509\u54EE\u54EA\"],\n[\"ae40\",\"\u54E6\u5527\u5507\u54FD\u550F\u5703\u5704\u57C2\u57D4\u57CB\u57C3\u5809\u590F\u5957\u5958\u595A\u5A11\u5A18\u5A1C\u5A1F\u5A1B\u5A13\u59EC\u5A20\u5A23\u5A29\u5A25\u5A0C\u5A09\u5B6B\u5C58\u5BB0\u5BB3\u5BB6\u5BB4\u5BAE\u5BB5\u5BB9\u5BB8\u5C04\u5C51\u5C55\u5C50\u5CED\u5CFD\u5CFB\u5CEA\u5CE8\u5CF0\u5CF6\u5D01\u5CF4\u5DEE\u5E2D\u5E2B\u5EAB\u5EAD\u5EA7\u5F31\u5F92\u5F91\u5F90\u6059\"],\n[\"aea1\",\"\u6063\u6065\u6050\u6055\u606D\u6069\u606F\u6084\u609F\u609A\u608D\u6094\u608C\u6085\u6096\u6247\u62F3\u6308\u62FF\u634E\u633E\u632F\u6355\u6342\u6346\u634F\u6349\u633A\u6350\u633D\u632A\u632B\u6328\u634D\u634C\u6548\u6549\u6599\u65C1\u65C5\u6642\u6649\u664F\u6643\u6652\u664C\u6645\u6641\u66F8\u6714\u6715\u6717\u6821\u6838\u6848\u6846\u6853\u6839\u6842\u6854\u6829\u68B3\u6817\u684C\u6851\u683D\u67F4\u6850\u6840\u683C\u6843\u682A\u6845\u6813\u6818\u6841\u6B8A\u6B89\u6BB7\u6C23\u6C27\u6C28\u6C26\u6C24\u6CF0\u6D6A\u6D95\u6D88\u6D87\u6D66\u6D78\u6D77\u6D59\u6D93\"],\n[\"af40\",\"\u6D6C\u6D89\u6D6E\u6D5A\u6D74\u6D69\u6D8C\u6D8A\u6D79\u6D85\u6D65\u6D94\u70CA\u70D8\u70E4\u70D9\u70C8\u70CF\u7239\u7279\u72FC\u72F9\u72FD\u72F8\u72F7\u7386\u73ED\u7409\u73EE\u73E0\u73EA\u73DE\u7554\u755D\u755C\u755A\u7559\u75BE\u75C5\u75C7\u75B2\u75B3\u75BD\u75BC\u75B9\u75C2\u75B8\u768B\u76B0\u76CA\u76CD\u76CE\u7729\u771F\u7720\u7728\u77E9\u7830\u7827\u7838\u781D\u7834\u7837\"],\n[\"afa1\",\"\u7825\u782D\u7820\u781F\u7832\u7955\u7950\u7960\u795F\u7956\u795E\u795D\u7957\u795A\u79E4\u79E3\u79E7\u79DF\u79E6\u79E9\u79D8\u7A84\u7A88\u7AD9\u7B06\u7B11\u7C89\u7D21\u7D17\u7D0B\u7D0A\u7D20\u7D22\u7D14\u7D10\u7D15\u7D1A\u7D1C\u7D0D\u7D19\u7D1B\u7F3A\u7F5F\u7F94\u7FC5\u7FC1\u8006\u8018\u8015\u8019\u8017\u803D\u803F\u80F1\u8102\u80F0\u8105\u80ED\u80F4\u8106\u80F8\u80F3\u8108\u80FD\u810A\u80FC\u80EF\u81ED\u81EC\u8200\u8210\u822A\u822B\u8228\u822C\u82BB\u832B\u8352\u8354\u834A\u8338\u8350\u8349\u8335\u8334\u834F\u8332\u8339\u8336\u8317\u8340\u8331\u8328\u8343\"],\n[\"b040\",\"\u8654\u868A\u86AA\u8693\u86A4\u86A9\u868C\u86A3\u869C\u8870\u8877\u8881\u8882\u887D\u8879\u8A18\u8A10\u8A0E\u8A0C\u8A15\u8A0A\u8A17\u8A13\u8A16\u8A0F\u8A11\u8C48\u8C7A\u8C79\u8CA1\u8CA2\u8D77\u8EAC\u8ED2\u8ED4\u8ECF\u8FB1\u9001\u9006\u8FF7\u9000\u8FFA\u8FF4\u9003\u8FFD\u9005\u8FF8\u9095\u90E1\u90DD\u90E2\u9152\u914D\u914C\u91D8\u91DD\u91D7\u91DC\u91D9\u9583\u9662\u9663\u9661\"],\n[\"b0a1\",\"\u965B\u965D\u9664\u9658\u965E\u96BB\u98E2\u99AC\u9AA8\u9AD8\u9B25\u9B32\u9B3C\u4E7E\u507A\u507D\u505C\u5047\u5043\u504C\u505A\u5049\u5065\u5076\u504E\u5055\u5075\u5074\u5077\u504F\u500F\u506F\u506D\u515C\u5195\u51F0\u526A\u526F\u52D2\u52D9\u52D8\u52D5\u5310\u530F\u5319\u533F\u5340\u533E\u53C3\u66FC\u5546\u556A\u5566\u5544\u555E\u5561\u5543\u554A\u5531\u5556\u554F\u5555\u552F\u5564\u5538\u552E\u555C\u552C\u5563\u5533\u5541\u5557\u5708\u570B\u5709\u57DF\u5805\u580A\u5806\u57E0\u57E4\u57FA\u5802\u5835\u57F7\u57F9\u5920\u5962\u5A36\u5A41\u5A49\u5A66\u5A6A\u5A40\"],\n[\"b140\",\"\u5A3C\u5A62\u5A5A\u5A46\u5A4A\u5B70\u5BC7\u5BC5\u5BC4\u5BC2\u5BBF\u5BC6\u5C09\u5C08\u5C07\u5C60\u5C5C\u5C5D\u5D07\u5D06\u5D0E\u5D1B\u5D16\u5D22\u5D11\u5D29\u5D14\u5D19\u5D24\u5D27\u5D17\u5DE2\u5E38\u5E36\u5E33\u5E37\u5EB7\u5EB8\u5EB6\u5EB5\u5EBE\u5F35\u5F37\u5F57\u5F6C\u5F69\u5F6B\u5F97\u5F99\u5F9E\u5F98\u5FA1\u5FA0\u5F9C\u607F\u60A3\u6089\u60A0\u60A8\u60CB\u60B4\u60E6\u60BD\"],\n[\"b1a1\",\"\u60C5\u60BB\u60B5\u60DC\u60BC\u60D8\u60D5\u60C6\u60DF\u60B8\u60DA\u60C7\u621A\u621B\u6248\u63A0\u63A7\u6372\u6396\u63A2\u63A5\u6377\u6367\u6398\u63AA\u6371\u63A9\u6389\u6383\u639B\u636B\u63A8\u6384\u6388\u6399\u63A1\u63AC\u6392\u638F\u6380\u637B\u6369\u6368\u637A\u655D\u6556\u6551\u6559\u6557\u555F\u654F\u6558\u6555\u6554\u659C\u659B\u65AC\u65CF\u65CB\u65CC\u65CE\u665D\u665A\u6664\u6668\u6666\u665E\u66F9\u52D7\u671B\u6881\u68AF\u68A2\u6893\u68B5\u687F\u6876\u68B1\u68A7\u6897\u68B0\u6883\u68C4\u68AD\u6886\u6885\u6894\u689D\u68A8\u689F\u68A1\u6882\u6B32\u6BBA\"],\n[\"b240\",\"\u6BEB\u6BEC\u6C2B\u6D8E\u6DBC\u6DF3\u6DD9\u6DB2\u6DE1\u6DCC\u6DE4\u6DFB\u6DFA\u6E05\u6DC7\u6DCB\u6DAF\u6DD1\u6DAE\u6DDE\u6DF9\u6DB8\u6DF7\u6DF5\u6DC5\u6DD2\u6E1A\u6DB5\u6DDA\u6DEB\u6DD8\u6DEA\u6DF1\u6DEE\u6DE8\u6DC6\u6DC4\u6DAA\u6DEC\u6DBF\u6DE6\u70F9\u7109\u710A\u70FD\u70EF\u723D\u727D\u7281\u731C\u731B\u7316\u7313\u7319\u7387\u7405\u740A\u7403\u7406\u73FE\u740D\u74E0\u74F6\"],\n[\"b2a1\",\"\u74F7\u751C\u7522\u7565\u7566\u7562\u7570\u758F\u75D4\u75D5\u75B5\u75CA\u75CD\u768E\u76D4\u76D2\u76DB\u7737\u773E\u773C\u7736\u7738\u773A\u786B\u7843\u784E\u7965\u7968\u796D\u79FB\u7A92\u7A95\u7B20\u7B28\u7B1B\u7B2C\u7B26\u7B19\u7B1E\u7B2E\u7C92\u7C97\u7C95\u7D46\u7D43\u7D71\u7D2E\u7D39\u7D3C\u7D40\u7D30\u7D33\u7D44\u7D2F\u7D42\u7D32\u7D31\u7F3D\u7F9E\u7F9A\u7FCC\u7FCE\u7FD2\u801C\u804A\u8046\u812F\u8116\u8123\u812B\u8129\u8130\u8124\u8202\u8235\u8237\u8236\u8239\u838E\u839E\u8398\u8378\u83A2\u8396\u83BD\u83AB\u8392\u838A\u8393\u8389\u83A0\u8377\u837B\u837C\"],\n[\"b340\",\"\u8386\u83A7\u8655\u5F6A\u86C7\u86C0\u86B6\u86C4\u86B5\u86C6\u86CB\u86B1\u86AF\u86C9\u8853\u889E\u8888\u88AB\u8892\u8896\u888D\u888B\u8993\u898F\u8A2A\u8A1D\u8A23\u8A25\u8A31\u8A2D\u8A1F\u8A1B\u8A22\u8C49\u8C5A\u8CA9\u8CAC\u8CAB\u8CA8\u8CAA\u8CA7\u8D67\u8D66\u8DBE\u8DBA\u8EDB\u8EDF\u9019\u900D\u901A\u9017\u9023\u901F\u901D\u9010\u9015\u901E\u9020\u900F\u9022\u9016\u901B\u9014\"],\n[\"b3a1\",\"\u90E8\u90ED\u90FD\u9157\u91CE\u91F5\u91E6\u91E3\u91E7\u91ED\u91E9\u9589\u966A\u9675\u9673\u9678\u9670\u9674\u9676\u9677\u966C\u96C0\u96EA\u96E9\u7AE0\u7ADF\u9802\u9803\u9B5A\u9CE5\u9E75\u9E7F\u9EA5\u9EBB\u50A2\u508D\u5085\u5099\u5091\u5080\u5096\u5098\u509A\u6700\u51F1\u5272\u5274\u5275\u5269\u52DE\u52DD\u52DB\u535A\u53A5\u557B\u5580\u55A7\u557C\u558A\u559D\u5598\u5582\u559C\u55AA\u5594\u5587\u558B\u5583\u55B3\u55AE\u559F\u553E\u55B2\u559A\u55BB\u55AC\u55B1\u557E\u5589\u55AB\u5599\u570D\u582F\u582A\u5834\u5824\u5830\u5831\u5821\u581D\u5820\u58F9\u58FA\u5960\"],\n[\"b440\",\"\u5A77\u5A9A\u5A7F\u5A92\u5A9B\u5AA7\u5B73\u5B71\u5BD2\u5BCC\u5BD3\u5BD0\u5C0A\u5C0B\u5C31\u5D4C\u5D50\u5D34\u5D47\u5DFD\u5E45\u5E3D\u5E40\u5E43\u5E7E\u5ECA\u5EC1\u5EC2\u5EC4\u5F3C\u5F6D\u5FA9\u5FAA\u5FA8\u60D1\u60E1\u60B2\u60B6\u60E0\u611C\u6123\u60FA\u6115\u60F0\u60FB\u60F4\u6168\u60F1\u610E\u60F6\u6109\u6100\u6112\u621F\u6249\u63A3\u638C\u63CF\u63C0\u63E9\u63C9\u63C6\u63CD\"],\n[\"b4a1\",\"\u63D2\u63E3\u63D0\u63E1\u63D6\u63ED\u63EE\u6376\u63F4\u63EA\u63DB\u6452\u63DA\u63F9\u655E\u6566\u6562\u6563\u6591\u6590\u65AF\u666E\u6670\u6674\u6676\u666F\u6691\u667A\u667E\u6677\u66FE\u66FF\u671F\u671D\u68FA\u68D5\u68E0\u68D8\u68D7\u6905\u68DF\u68F5\u68EE\u68E7\u68F9\u68D2\u68F2\u68E3\u68CB\u68CD\u690D\u6912\u690E\u68C9\u68DA\u696E\u68FB\u6B3E\u6B3A\u6B3D\u6B98\u6B96\u6BBC\u6BEF\u6C2E\u6C2F\u6C2C\u6E2F\u6E38\u6E54\u6E21\u6E32\u6E67\u6E4A\u6E20\u6E25\u6E23\u6E1B\u6E5B\u6E58\u6E24\u6E56\u6E6E\u6E2D\u6E26\u6E6F\u6E34\u6E4D\u6E3A\u6E2C\u6E43\u6E1D\u6E3E\u6ECB\"],\n[\"b540\",\"\u6E89\u6E19\u6E4E\u6E63\u6E44\u6E72\u6E69\u6E5F\u7119\u711A\u7126\u7130\u7121\u7136\u716E\u711C\u724C\u7284\u7280\u7336\u7325\u7334\u7329\u743A\u742A\u7433\u7422\u7425\u7435\u7436\u7434\u742F\u741B\u7426\u7428\u7525\u7526\u756B\u756A\u75E2\u75DB\u75E3\u75D9\u75D8\u75DE\u75E0\u767B\u767C\u7696\u7693\u76B4\u76DC\u774F\u77ED\u785D\u786C\u786F\u7A0D\u7A08\u7A0B\u7A05\u7A00\u7A98\"],\n[\"b5a1\",\"\u7A97\u7A96\u7AE5\u7AE3\u7B49\u7B56\u7B46\u7B50\u7B52\u7B54\u7B4D\u7B4B\u7B4F\u7B51\u7C9F\u7CA5\u7D5E\u7D50\u7D68\u7D55\u7D2B\u7D6E\u7D72\u7D61\u7D66\u7D62\u7D70\u7D73\u5584\u7FD4\u7FD5\u800B\u8052\u8085\u8155\u8154\u814B\u8151\u814E\u8139\u8146\u813E\u814C\u8153\u8174\u8212\u821C\u83E9\u8403\u83F8\u840D\u83E0\u83C5\u840B\u83C1\u83EF\u83F1\u83F4\u8457\u840A\u83F0\u840C\u83CC\u83FD\u83F2\u83CA\u8438\u840E\u8404\u83DC\u8407\u83D4\u83DF\u865B\u86DF\u86D9\u86ED\u86D4\u86DB\u86E4\u86D0\u86DE\u8857\u88C1\u88C2\u88B1\u8983\u8996\u8A3B\u8A60\u8A55\u8A5E\u8A3C\u8A41\"],\n[\"b640\",\"\u8A54\u8A5B\u8A50\u8A46\u8A34\u8A3A\u8A36\u8A56\u8C61\u8C82\u8CAF\u8CBC\u8CB3\u8CBD\u8CC1\u8CBB\u8CC0\u8CB4\u8CB7\u8CB6\u8CBF\u8CB8\u8D8A\u8D85\u8D81\u8DCE\u8DDD\u8DCB\u8DDA\u8DD1\u8DCC\u8DDB\u8DC6\u8EFB\u8EF8\u8EFC\u8F9C\u902E\u9035\u9031\u9038\u9032\u9036\u9102\u90F5\u9109\u90FE\u9163\u9165\u91CF\u9214\u9215\u9223\u9209\u921E\u920D\u9210\u9207\u9211\u9594\u958F\u958B\u9591\"],\n[\"b6a1\",\"\u9593\u9592\u958E\u968A\u968E\u968B\u967D\u9685\u9686\u968D\u9672\u9684\u96C1\u96C5\u96C4\u96C6\u96C7\u96EF\u96F2\u97CC\u9805\u9806\u9808\u98E7\u98EA\u98EF\u98E9\u98F2\u98ED\u99AE\u99AD\u9EC3\u9ECD\u9ED1\u4E82\u50AD\u50B5\u50B2\u50B3\u50C5\u50BE\u50AC\u50B7\u50BB\u50AF\u50C7\u527F\u5277\u527D\u52DF\u52E6\u52E4\u52E2\u52E3\u532F\u55DF\u55E8\u55D3\u55E6\u55CE\u55DC\u55C7\u55D1\u55E3\u55E4\u55EF\u55DA\u55E1\u55C5\u55C6\u55E5\u55C9\u5712\u5713\u585E\u5851\u5858\u5857\u585A\u5854\u586B\u584C\u586D\u584A\u5862\u5852\u584B\u5967\u5AC1\u5AC9\u5ACC\u5ABE\u5ABD\u5ABC\"],\n[\"b740\",\"\u5AB3\u5AC2\u5AB2\u5D69\u5D6F\u5E4C\u5E79\u5EC9\u5EC8\u5F12\u5F59\u5FAC\u5FAE\u611A\u610F\u6148\u611F\u60F3\u611B\u60F9\u6101\u6108\u614E\u614C\u6144\u614D\u613E\u6134\u6127\u610D\u6106\u6137\u6221\u6222\u6413\u643E\u641E\u642A\u642D\u643D\u642C\u640F\u641C\u6414\u640D\u6436\u6416\u6417\u6406\u656C\u659F\u65B0\u6697\u6689\u6687\u6688\u6696\u6684\u6698\u668D\u6703\u6994\u696D\"],\n[\"b7a1\",\"\u695A\u6977\u6960\u6954\u6975\u6930\u6982\u694A\u6968\u696B\u695E\u6953\u6979\u6986\u695D\u6963\u695B\u6B47\u6B72\u6BC0\u6BBF\u6BD3\u6BFD\u6EA2\u6EAF\u6ED3\u6EB6\u6EC2\u6E90\u6E9D\u6EC7\u6EC5\u6EA5\u6E98\u6EBC\u6EBA\u6EAB\u6ED1\u6E96\u6E9C\u6EC4\u6ED4\u6EAA\u6EA7\u6EB4\u714E\u7159\u7169\u7164\u7149\u7167\u715C\u716C\u7166\u714C\u7165\u715E\u7146\u7168\u7156\u723A\u7252\u7337\u7345\u733F\u733E\u746F\u745A\u7455\u745F\u745E\u7441\u743F\u7459\u745B\u745C\u7576\u7578\u7600\u75F0\u7601\u75F2\u75F1\u75FA\u75FF\u75F4\u75F3\u76DE\u76DF\u775B\u776B\u7766\u775E\u7763\"],\n[\"b840\",\"\u7779\u776A\u776C\u775C\u7765\u7768\u7762\u77EE\u788E\u78B0\u7897\u7898\u788C\u7889\u787C\u7891\u7893\u787F\u797A\u797F\u7981\u842C\u79BD\u7A1C\u7A1A\u7A20\u7A14\u7A1F\u7A1E\u7A9F\u7AA0\u7B77\u7BC0\u7B60\u7B6E\u7B67\u7CB1\u7CB3\u7CB5\u7D93\u7D79\u7D91\u7D81\u7D8F\u7D5B\u7F6E\u7F69\u7F6A\u7F72\u7FA9\u7FA8\u7FA4\u8056\u8058\u8086\u8084\u8171\u8170\u8178\u8165\u816E\u8173\u816B\"],\n[\"b8a1\",\"\u8179\u817A\u8166\u8205\u8247\u8482\u8477\u843D\u8431\u8475\u8466\u846B\u8449\u846C\u845B\u843C\u8435\u8461\u8463\u8469\u846D\u8446\u865E\u865C\u865F\u86F9\u8713\u8708\u8707\u8700\u86FE\u86FB\u8702\u8703\u8706\u870A\u8859\u88DF\u88D4\u88D9\u88DC\u88D8\u88DD\u88E1\u88CA\u88D5\u88D2\u899C\u89E3\u8A6B\u8A72\u8A73\u8A66\u8A69\u8A70\u8A87\u8A7C\u8A63\u8AA0\u8A71\u8A85\u8A6D\u8A62\u8A6E\u8A6C\u8A79\u8A7B\u8A3E\u8A68\u8C62\u8C8A\u8C89\u8CCA\u8CC7\u8CC8\u8CC4\u8CB2\u8CC3\u8CC2\u8CC5\u8DE1\u8DDF\u8DE8\u8DEF\u8DF3\u8DFA\u8DEA\u8DE4\u8DE6\u8EB2\u8F03\u8F09\u8EFE\u8F0A\"],\n[\"b940\",\"\u8F9F\u8FB2\u904B\u904A\u9053\u9042\u9054\u903C\u9055\u9050\u9047\u904F\u904E\u904D\u9051\u903E\u9041\u9112\u9117\u916C\u916A\u9169\u91C9\u9237\u9257\u9238\u923D\u9240\u923E\u925B\u924B\u9264\u9251\u9234\u9249\u924D\u9245\u9239\u923F\u925A\u9598\u9698\u9694\u9695\u96CD\u96CB\u96C9\u96CA\u96F7\u96FB\u96F9\u96F6\u9756\u9774\u9776\u9810\u9811\u9813\u980A\u9812\u980C\u98FC\u98F4\"],\n[\"b9a1\",\"\u98FD\u98FE\u99B3\u99B1\u99B4\u9AE1\u9CE9\u9E82\u9F0E\u9F13\u9F20\u50E7\u50EE\u50E5\u50D6\u50ED\u50DA\u50D5\u50CF\u50D1\u50F1\u50CE\u50E9\u5162\u51F3\u5283\u5282\u5331\u53AD\u55FE\u5600\u561B\u5617\u55FD\u5614\u5606\u5609\u560D\u560E\u55F7\u5616\u561F\u5608\u5610\u55F6\u5718\u5716\u5875\u587E\u5883\u5893\u588A\u5879\u5885\u587D\u58FD\u5925\u5922\u5924\u596A\u5969\u5AE1\u5AE6\u5AE9\u5AD7\u5AD6\u5AD8\u5AE3\u5B75\u5BDE\u5BE7\u5BE1\u5BE5\u5BE6\u5BE8\u5BE2\u5BE4\u5BDF\u5C0D\u5C62\u5D84\u5D87\u5E5B\u5E63\u5E55\u5E57\u5E54\u5ED3\u5ED6\u5F0A\u5F46\u5F70\u5FB9\u6147\"],\n[\"ba40\",\"\u613F\u614B\u6177\u6162\u6163\u615F\u615A\u6158\u6175\u622A\u6487\u6458\u6454\u64A4\u6478\u645F\u647A\u6451\u6467\u6434\u646D\u647B\u6572\u65A1\u65D7\u65D6\u66A2\u66A8\u669D\u699C\u69A8\u6995\u69C1\u69AE\u69D3\u69CB\u699B\u69B7\u69BB\u69AB\u69B4\u69D0\u69CD\u69AD\u69CC\u69A6\u69C3\u69A3\u6B49\u6B4C\u6C33\u6F33\u6F14\u6EFE\u6F13\u6EF4\u6F29\u6F3E\u6F20\u6F2C\u6F0F\u6F02\u6F22\"],\n[\"baa1\",\"\u6EFF\u6EEF\u6F06\u6F31\u6F38\u6F32\u6F23\u6F15\u6F2B\u6F2F\u6F88\u6F2A\u6EEC\u6F01\u6EF2\u6ECC\u6EF7\u7194\u7199\u717D\u718A\u7184\u7192\u723E\u7292\u7296\u7344\u7350\u7464\u7463\u746A\u7470\u746D\u7504\u7591\u7627\u760D\u760B\u7609\u7613\u76E1\u76E3\u7784\u777D\u777F\u7761\u78C1\u789F\u78A7\u78B3\u78A9\u78A3\u798E\u798F\u798D\u7A2E\u7A31\u7AAA\u7AA9\u7AED\u7AEF\u7BA1\u7B95\u7B8B\u7B75\u7B97\u7B9D\u7B94\u7B8F\u7BB8\u7B87\u7B84\u7CB9\u7CBD\u7CBE\u7DBB\u7DB0\u7D9C\u7DBD\u7DBE\u7DA0\u7DCA\u7DB4\u7DB2\u7DB1\u7DBA\u7DA2\u7DBF\u7DB5\u7DB8\u7DAD\u7DD2\u7DC7\u7DAC\"],\n[\"bb40\",\"\u7F70\u7FE0\u7FE1\u7FDF\u805E\u805A\u8087\u8150\u8180\u818F\u8188\u818A\u817F\u8182\u81E7\u81FA\u8207\u8214\u821E\u824B\u84C9\u84BF\u84C6\u84C4\u8499\u849E\u84B2\u849C\u84CB\u84B8\u84C0\u84D3\u8490\u84BC\u84D1\u84CA\u873F\u871C\u873B\u8722\u8725\u8734\u8718\u8755\u8737\u8729\u88F3\u8902\u88F4\u88F9\u88F8\u88FD\u88E8\u891A\u88EF\u8AA6\u8A8C\u8A9E\u8AA3\u8A8D\u8AA1\u8A93\u8AA4\"],\n[\"bba1\",\"\u8AAA\u8AA5\u8AA8\u8A98\u8A91\u8A9A\u8AA7\u8C6A\u8C8D\u8C8C\u8CD3\u8CD1\u8CD2\u8D6B\u8D99\u8D95\u8DFC\u8F14\u8F12\u8F15\u8F13\u8FA3\u9060\u9058\u905C\u9063\u9059\u905E\u9062\u905D\u905B\u9119\u9118\u911E\u9175\u9178\u9177\u9174\u9278\u9280\u9285\u9298\u9296\u927B\u9293\u929C\u92A8\u927C\u9291\u95A1\u95A8\u95A9\u95A3\u95A5\u95A4\u9699\u969C\u969B\u96CC\u96D2\u9700\u977C\u9785\u97F6\u9817\u9818\u98AF\u98B1\u9903\u9905\u990C\u9909\u99C1\u9AAF\u9AB0\u9AE6\u9B41\u9B42\u9CF4\u9CF6\u9CF3\u9EBC\u9F3B\u9F4A\u5104\u5100\u50FB\u50F5\u50F9\u5102\u5108\u5109\u5105\u51DC\"],\n[\"bc40\",\"\u5287\u5288\u5289\u528D\u528A\u52F0\u53B2\u562E\u563B\u5639\u5632\u563F\u5634\u5629\u5653\u564E\u5657\u5674\u5636\u562F\u5630\u5880\u589F\u589E\u58B3\u589C\u58AE\u58A9\u58A6\u596D\u5B09\u5AFB\u5B0B\u5AF5\u5B0C\u5B08\u5BEE\u5BEC\u5BE9\u5BEB\u5C64\u5C65\u5D9D\u5D94\u5E62\u5E5F\u5E61\u5EE2\u5EDA\u5EDF\u5EDD\u5EE3\u5EE0\u5F48\u5F71\u5FB7\u5FB5\u6176\u6167\u616E\u615D\u6155\u6182\"],\n[\"bca1\",\"\u617C\u6170\u616B\u617E\u61A7\u6190\u61AB\u618E\u61AC\u619A\u61A4\u6194\u61AE\u622E\u6469\u646F\u6479\u649E\u64B2\u6488\u6490\u64B0\u64A5\u6493\u6495\u64A9\u6492\u64AE\u64AD\u64AB\u649A\u64AC\u6499\u64A2\u64B3\u6575\u6577\u6578\u66AE\u66AB\u66B4\u66B1\u6A23\u6A1F\u69E8\u6A01\u6A1E\u6A19\u69FD\u6A21\u6A13\u6A0A\u69F3\u6A02\u6A05\u69ED\u6A11\u6B50\u6B4E\u6BA4\u6BC5\u6BC6\u6F3F\u6F7C\u6F84\u6F51\u6F66\u6F54\u6F86\u6F6D\u6F5B\u6F78\u6F6E\u6F8E\u6F7A\u6F70\u6F64\u6F97\u6F58\u6ED5\u6F6F\u6F60\u6F5F\u719F\u71AC\u71B1\u71A8\u7256\u729B\u734E\u7357\u7469\u748B\u7483\"],\n[\"bd40\",\"\u747E\u7480\u757F\u7620\u7629\u761F\u7624\u7626\u7621\u7622\u769A\u76BA\u76E4\u778E\u7787\u778C\u7791\u778B\u78CB\u78C5\u78BA\u78CA\u78BE\u78D5\u78BC\u78D0\u7A3F\u7A3C\u7A40\u7A3D\u7A37\u7A3B\u7AAF\u7AAE\u7BAD\u7BB1\u7BC4\u7BB4\u7BC6\u7BC7\u7BC1\u7BA0\u7BCC\u7CCA\u7DE0\u7DF4\u7DEF\u7DFB\u7DD8\u7DEC\u7DDD\u7DE8\u7DE3\u7DDA\u7DDE\u7DE9\u7D9E\u7DD9\u7DF2\u7DF9\u7F75\u7F77\u7FAF\"],\n[\"bda1\",\"\u7FE9\u8026\u819B\u819C\u819D\u81A0\u819A\u8198\u8517\u853D\u851A\u84EE\u852C\u852D\u8513\u8511\u8523\u8521\u8514\u84EC\u8525\u84FF\u8506\u8782\u8774\u8776\u8760\u8766\u8778\u8768\u8759\u8757\u874C\u8753\u885B\u885D\u8910\u8907\u8912\u8913\u8915\u890A\u8ABC\u8AD2\u8AC7\u8AC4\u8A95\u8ACB\u8AF8\u8AB2\u8AC9\u8AC2\u8ABF\u8AB0\u8AD6\u8ACD\u8AB6\u8AB9\u8ADB\u8C4C\u8C4E\u8C6C\u8CE0\u8CDE\u8CE6\u8CE4\u8CEC\u8CED\u8CE2\u8CE3\u8CDC\u8CEA\u8CE1\u8D6D\u8D9F\u8DA3\u8E2B\u8E10\u8E1D\u8E22\u8E0F\u8E29\u8E1F\u8E21\u8E1E\u8EBA\u8F1D\u8F1B\u8F1F\u8F29\u8F26\u8F2A\u8F1C\u8F1E\"],\n[\"be40\",\"\u8F25\u9069\u906E\u9068\u906D\u9077\u9130\u912D\u9127\u9131\u9187\u9189\u918B\u9183\u92C5\u92BB\u92B7\u92EA\u92AC\u92E4\u92C1\u92B3\u92BC\u92D2\u92C7\u92F0\u92B2\u95AD\u95B1\u9704\u9706\u9707\u9709\u9760\u978D\u978B\u978F\u9821\u982B\u981C\u98B3\u990A\u9913\u9912\u9918\u99DD\u99D0\u99DF\u99DB\u99D1\u99D5\u99D2\u99D9\u9AB7\u9AEE\u9AEF\u9B27\u9B45\u9B44\u9B77\u9B6F\u9D06\u9D09\"],\n[\"bea1\",\"\u9D03\u9EA9\u9EBE\u9ECE\u58A8\u9F52\u5112\u5118\u5114\u5110\u5115\u5180\u51AA\u51DD\u5291\u5293\u52F3\u5659\u566B\u5679\u5669\u5664\u5678\u566A\u5668\u5665\u5671\u566F\u566C\u5662\u5676\u58C1\u58BE\u58C7\u58C5\u596E\u5B1D\u5B34\u5B78\u5BF0\u5C0E\u5F4A\u61B2\u6191\u61A9\u618A\u61CD\u61B6\u61BE\u61CA\u61C8\u6230\u64C5\u64C1\u64CB\u64BB\u64BC\u64DA\u64C4\u64C7\u64C2\u64CD\u64BF\u64D2\u64D4\u64BE\u6574\u66C6\u66C9\u66B9\u66C4\u66C7\u66B8\u6A3D\u6A38\u6A3A\u6A59\u6A6B\u6A58\u6A39\u6A44\u6A62\u6A61\u6A4B\u6A47\u6A35\u6A5F\u6A48\u6B59\u6B77\u6C05\u6FC2\u6FB1\u6FA1\"],\n[\"bf40\",\"\u6FC3\u6FA4\u6FC1\u6FA7\u6FB3\u6FC0\u6FB9\u6FB6\u6FA6\u6FA0\u6FB4\u71BE\u71C9\u71D0\u71D2\u71C8\u71D5\u71B9\u71CE\u71D9\u71DC\u71C3\u71C4\u7368\u749C\u74A3\u7498\u749F\u749E\u74E2\u750C\u750D\u7634\u7638\u763A\u76E7\u76E5\u77A0\u779E\u779F\u77A5\u78E8\u78DA\u78EC\u78E7\u79A6\u7A4D\u7A4E\u7A46\u7A4C\u7A4B\u7ABA\u7BD9\u7C11\u7BC9\u7BE4\u7BDB\u7BE1\u7BE9\u7BE6\u7CD5\u7CD6\u7E0A\"],\n[\"bfa1\",\"\u7E11\u7E08\u7E1B\u7E23\u7E1E\u7E1D\u7E09\u7E10\u7F79\u7FB2\u7FF0\u7FF1\u7FEE\u8028\u81B3\u81A9\u81A8\u81FB\u8208\u8258\u8259\u854A\u8559\u8548\u8568\u8569\u8543\u8549\u856D\u856A\u855E\u8783\u879F\u879E\u87A2\u878D\u8861\u892A\u8932\u8925\u892B\u8921\u89AA\u89A6\u8AE6\u8AFA\u8AEB\u8AF1\u8B00\u8ADC\u8AE7\u8AEE\u8AFE\u8B01\u8B02\u8AF7\u8AED\u8AF3\u8AF6\u8AFC\u8C6B\u8C6D\u8C93\u8CF4\u8E44\u8E31\u8E34\u8E42\u8E39\u8E35\u8F3B\u8F2F\u8F38\u8F33\u8FA8\u8FA6\u9075\u9074\u9078\u9072\u907C\u907A\u9134\u9192\u9320\u9336\u92F8\u9333\u932F\u9322\u92FC\u932B\u9304\u931A\"],\n[\"c040\",\"\u9310\u9326\u9321\u9315\u932E\u9319\u95BB\u96A7\u96A8\u96AA\u96D5\u970E\u9711\u9716\u970D\u9713\u970F\u975B\u975C\u9766\u9798\u9830\u9838\u983B\u9837\u982D\u9839\u9824\u9910\u9928\u991E\u991B\u9921\u991A\u99ED\u99E2\u99F1\u9AB8\u9ABC\u9AFB\u9AED\u9B28\u9B91\u9D15\u9D23\u9D26\u9D28\u9D12\u9D1B\u9ED8\u9ED4\u9F8D\u9F9C\u512A\u511F\u5121\u5132\u52F5\u568E\u5680\u5690\u5685\u5687\"],\n[\"c0a1\",\"\u568F\u58D5\u58D3\u58D1\u58CE\u5B30\u5B2A\u5B24\u5B7A\u5C37\u5C68\u5DBC\u5DBA\u5DBD\u5DB8\u5E6B\u5F4C\u5FBD\u61C9\u61C2\u61C7\u61E6\u61CB\u6232\u6234\u64CE\u64CA\u64D8\u64E0\u64F0\u64E6\u64EC\u64F1\u64E2\u64ED\u6582\u6583\u66D9\u66D6\u6A80\u6A94\u6A84\u6AA2\u6A9C\u6ADB\u6AA3\u6A7E\u6A97\u6A90\u6AA0\u6B5C\u6BAE\u6BDA\u6C08\u6FD8\u6FF1\u6FDF\u6FE0\u6FDB\u6FE4\u6FEB\u6FEF\u6F80\u6FEC\u6FE1\u6FE9\u6FD5\u6FEE\u6FF0\u71E7\u71DF\u71EE\u71E6\u71E5\u71ED\u71EC\u71F4\u71E0\u7235\u7246\u7370\u7372\u74A9\u74B0\u74A6\u74A8\u7646\u7642\u764C\u76EA\u77B3\u77AA\u77B0\u77AC\"],\n[\"c140\",\"\u77A7\u77AD\u77EF\u78F7\u78FA\u78F4\u78EF\u7901\u79A7\u79AA\u7A57\u7ABF\u7C07\u7C0D\u7BFE\u7BF7\u7C0C\u7BE0\u7CE0\u7CDC\u7CDE\u7CE2\u7CDF\u7CD9\u7CDD\u7E2E\u7E3E\u7E46\u7E37\u7E32\u7E43\u7E2B\u7E3D\u7E31\u7E45\u7E41\u7E34\u7E39\u7E48\u7E35\u7E3F\u7E2F\u7F44\u7FF3\u7FFC\u8071\u8072\u8070\u806F\u8073\u81C6\u81C3\u81BA\u81C2\u81C0\u81BF\u81BD\u81C9\u81BE\u81E8\u8209\u8271\u85AA\"],\n[\"c1a1\",\"\u8584\u857E\u859C\u8591\u8594\u85AF\u859B\u8587\u85A8\u858A\u8667\u87C0\u87D1\u87B3\u87D2\u87C6\u87AB\u87BB\u87BA\u87C8\u87CB\u893B\u8936\u8944\u8938\u893D\u89AC\u8B0E\u8B17\u8B19\u8B1B\u8B0A\u8B20\u8B1D\u8B04\u8B10\u8C41\u8C3F\u8C73\u8CFA\u8CFD\u8CFC\u8CF8\u8CFB\u8DA8\u8E49\u8E4B\u8E48\u8E4A\u8F44\u8F3E\u8F42\u8F45\u8F3F\u907F\u907D\u9084\u9081\u9082\u9080\u9139\u91A3\u919E\u919C\u934D\u9382\u9328\u9375\u934A\u9365\u934B\u9318\u937E\u936C\u935B\u9370\u935A\u9354\u95CA\u95CB\u95CC\u95C8\u95C6\u96B1\u96B8\u96D6\u971C\u971E\u97A0\u97D3\u9846\u98B6\u9935\u9A01\"],\n[\"c240\",\"\u99FF\u9BAE\u9BAB\u9BAA\u9BAD\u9D3B\u9D3F\u9E8B\u9ECF\u9EDE\u9EDC\u9EDD\u9EDB\u9F3E\u9F4B\u53E2\u5695\u56AE\u58D9\u58D8\u5B38\u5F5D\u61E3\u6233\u64F4\u64F2\u64FE\u6506\u64FA\u64FB\u64F7\u65B7\u66DC\u6726\u6AB3\u6AAC\u6AC3\u6ABB\u6AB8\u6AC2\u6AAE\u6AAF\u6B5F\u6B78\u6BAF\u7009\u700B\u6FFE\u7006\u6FFA\u7011\u700F\u71FB\u71FC\u71FE\u71F8\u7377\u7375\u74A7\u74BF\u7515\u7656\u7658\"],\n[\"c2a1\",\"\u7652\u77BD\u77BF\u77BB\u77BC\u790E\u79AE\u7A61\u7A62\u7A60\u7AC4\u7AC5\u7C2B\u7C27\u7C2A\u7C1E\u7C23\u7C21\u7CE7\u7E54\u7E55\u7E5E\u7E5A\u7E61\u7E52\u7E59\u7F48\u7FF9\u7FFB\u8077\u8076\u81CD\u81CF\u820A\u85CF\u85A9\u85CD\u85D0\u85C9\u85B0\u85BA\u85B9\u85A6\u87EF\u87EC\u87F2\u87E0\u8986\u89B2\u89F4\u8B28\u8B39\u8B2C\u8B2B\u8C50\u8D05\u8E59\u8E63\u8E66\u8E64\u8E5F\u8E55\u8EC0\u8F49\u8F4D\u9087\u9083\u9088\u91AB\u91AC\u91D0\u9394\u938A\u9396\u93A2\u93B3\u93AE\u93AC\u93B0\u9398\u939A\u9397\u95D4\u95D6\u95D0\u95D5\u96E2\u96DC\u96D9\u96DB\u96DE\u9724\u97A3\u97A6\"],\n[\"c340\",\"\u97AD\u97F9\u984D\u984F\u984C\u984E\u9853\u98BA\u993E\u993F\u993D\u992E\u99A5\u9A0E\u9AC1\u9B03\u9B06\u9B4F\u9B4E\u9B4D\u9BCA\u9BC9\u9BFD\u9BC8\u9BC0\u9D51\u9D5D\u9D60\u9EE0\u9F15\u9F2C\u5133\u56A5\u58DE\u58DF\u58E2\u5BF5\u9F90\u5EEC\u61F2\u61F7\u61F6\u61F5\u6500\u650F\u66E0\u66DD\u6AE5\u6ADD\u6ADA\u6AD3\u701B\u701F\u7028\u701A\u701D\u7015\u7018\u7206\u720D\u7258\u72A2\u7378\"],\n[\"c3a1\",\"\u737A\u74BD\u74CA\u74E3\u7587\u7586\u765F\u7661\u77C7\u7919\u79B1\u7A6B\u7A69\u7C3E\u7C3F\u7C38\u7C3D\u7C37\u7C40\u7E6B\u7E6D\u7E79\u7E69\u7E6A\u7F85\u7E73\u7FB6\u7FB9\u7FB8\u81D8\u85E9\u85DD\u85EA\u85D5\u85E4\u85E5\u85F7\u87FB\u8805\u880D\u87F9\u87FE\u8960\u895F\u8956\u895E\u8B41\u8B5C\u8B58\u8B49\u8B5A\u8B4E\u8B4F\u8B46\u8B59\u8D08\u8D0A\u8E7C\u8E72\u8E87\u8E76\u8E6C\u8E7A\u8E74\u8F54\u8F4E\u8FAD\u908A\u908B\u91B1\u91AE\u93E1\u93D1\u93DF\u93C3\u93C8\u93DC\u93DD\u93D6\u93E2\u93CD\u93D8\u93E4\u93D7\u93E8\u95DC\u96B4\u96E3\u972A\u9727\u9761\u97DC\u97FB\u985E\"],\n[\"c440\",\"\u9858\u985B\u98BC\u9945\u9949\u9A16\u9A19\u9B0D\u9BE8\u9BE7\u9BD6\u9BDB\u9D89\u9D61\u9D72\u9D6A\u9D6C\u9E92\u9E97\u9E93\u9EB4\u52F8\u56A8\u56B7\u56B6\u56B4\u56BC\u58E4\u5B40\u5B43\u5B7D\u5BF6\u5DC9\u61F8\u61FA\u6518\u6514\u6519\u66E6\u6727\u6AEC\u703E\u7030\u7032\u7210\u737B\u74CF\u7662\u7665\u7926\u792A\u792C\u792B\u7AC7\u7AF6\u7C4C\u7C43\u7C4D\u7CEF\u7CF0\u8FAE\u7E7D\u7E7C\"],\n[\"c4a1\",\"\u7E82\u7F4C\u8000\u81DA\u8266\u85FB\u85F9\u8611\u85FA\u8606\u860B\u8607\u860A\u8814\u8815\u8964\u89BA\u89F8\u8B70\u8B6C\u8B66\u8B6F\u8B5F\u8B6B\u8D0F\u8D0D\u8E89\u8E81\u8E85\u8E82\u91B4\u91CB\u9418\u9403\u93FD\u95E1\u9730\u98C4\u9952\u9951\u99A8\u9A2B\u9A30\u9A37\u9A35\u9C13\u9C0D\u9E79\u9EB5\u9EE8\u9F2F\u9F5F\u9F63\u9F61\u5137\u5138\u56C1\u56C0\u56C2\u5914\u5C6C\u5DCD\u61FC\u61FE\u651D\u651C\u6595\u66E9\u6AFB\u6B04\u6AFA\u6BB2\u704C\u721B\u72A7\u74D6\u74D4\u7669\u77D3\u7C50\u7E8F\u7E8C\u7FBC\u8617\u862D\u861A\u8823\u8822\u8821\u881F\u896A\u896C\u89BD\u8B74\"],\n[\"c540\",\"\u8B77\u8B7D\u8D13\u8E8A\u8E8D\u8E8B\u8F5F\u8FAF\u91BA\u942E\u9433\u9435\u943A\u9438\u9432\u942B\u95E2\u9738\u9739\u9732\u97FF\u9867\u9865\u9957\u9A45\u9A43\u9A40\u9A3E\u9ACF\u9B54\u9B51\u9C2D\u9C25\u9DAF\u9DB4\u9DC2\u9DB8\u9E9D\u9EEF\u9F19\u9F5C\u9F66\u9F67\u513C\u513B\u56C8\u56CA\u56C9\u5B7F\u5DD4\u5DD2\u5F4E\u61FF\u6524\u6B0A\u6B61\u7051\u7058\u7380\u74E4\u758A\u766E\u766C\"],\n[\"c5a1\",\"\u79B3\u7C60\u7C5F\u807E\u807D\u81DF\u8972\u896F\u89FC\u8B80\u8D16\u8D17\u8E91\u8E93\u8F61\u9148\u9444\u9451\u9452\u973D\u973E\u97C3\u97C1\u986B\u9955\u9A55\u9A4D\u9AD2\u9B1A\u9C49\u9C31\u9C3E\u9C3B\u9DD3\u9DD7\u9F34\u9F6C\u9F6A\u9F94\u56CC\u5DD6\u6200\u6523\u652B\u652A\u66EC\u6B10\u74DA\u7ACA\u7C64\u7C63\u7C65\u7E93\u7E96\u7E94\u81E2\u8638\u863F\u8831\u8B8A\u9090\u908F\u9463\u9460\u9464\u9768\u986F\u995C\u9A5A\u9A5B\u9A57\u9AD3\u9AD4\u9AD1\u9C54\u9C57\u9C56\u9DE5\u9E9F\u9EF4\u56D1\u58E9\u652C\u705E\u7671\u7672\u77D7\u7F50\u7F88\u8836\u8839\u8862\u8B93\u8B92\"],\n[\"c640\",\"\u8B96\u8277\u8D1B\u91C0\u946A\u9742\u9748\u9744\u97C6\u9870\u9A5F\u9B22\u9B58\u9C5F\u9DF9\u9DFA\u9E7C\u9E7D\u9F07\u9F77\u9F72\u5EF3\u6B16\u7063\u7C6C\u7C6E\u883B\u89C0\u8EA1\u91C1\u9472\u9470\u9871\u995E\u9AD6\u9B23\u9ECC\u7064\u77DA\u8B9A\u9477\u97C9\u9A62\u9A65\u7E9C\u8B9C\u8EAA\u91C5\u947D\u947E\u947C\u9C77\u9C78\u9EF7\u8C54\u947F\u9E1A\u7228\u9A6A\u9B31\u9E1B\u9E1E\u7C72\"],\n[\"c940\",\"\u4E42\u4E5C\u51F5\u531A\u5382\u4E07\u4E0C\u4E47\u4E8D\u56D7\uFA0C\u5C6E\u5F73\u4E0F\u5187\u4E0E\u4E2E\u4E93\u4EC2\u4EC9\u4EC8\u5198\u52FC\u536C\u53B9\u5720\u5903\u592C\u5C10\u5DFF\u65E1\u6BB3\u6BCC\u6C14\u723F\u4E31\u4E3C\u4EE8\u4EDC\u4EE9\u4EE1\u4EDD\u4EDA\u520C\u531C\u534C\u5722\u5723\u5917\u592F\u5B81\u5B84\u5C12\u5C3B\u5C74\u5C73\u5E04\u5E80\u5E82\u5FC9\u6209\u6250\u6C15\"],\n[\"c9a1\",\"\u6C36\u6C43\u6C3F\u6C3B\u72AE\u72B0\u738A\u79B8\u808A\u961E\u4F0E\u4F18\u4F2C\u4EF5\u4F14\u4EF1\u4F00\u4EF7\u4F08\u4F1D\u4F02\u4F05\u4F22\u4F13\u4F04\u4EF4\u4F12\u51B1\u5213\u5209\u5210\u52A6\u5322\u531F\u534D\u538A\u5407\u56E1\u56DF\u572E\u572A\u5734\u593C\u5980\u597C\u5985\u597B\u597E\u5977\u597F\u5B56\u5C15\u5C25\u5C7C\u5C7A\u5C7B\u5C7E\u5DDF\u5E75\u5E84\u5F02\u5F1A\u5F74\u5FD5\u5FD4\u5FCF\u625C\u625E\u6264\u6261\u6266\u6262\u6259\u6260\u625A\u6265\u65EF\u65EE\u673E\u6739\u6738\u673B\u673A\u673F\u673C\u6733\u6C18\u6C46\u6C52\u6C5C\u6C4F\u6C4A\u6C54\u6C4B\"],\n[\"ca40\",\"\u6C4C\u7071\u725E\u72B4\u72B5\u738E\u752A\u767F\u7A75\u7F51\u8278\u827C\u8280\u827D\u827F\u864D\u897E\u9099\u9097\u9098\u909B\u9094\u9622\u9624\u9620\u9623\u4F56\u4F3B\u4F62\u4F49\u4F53\u4F64\u4F3E\u4F67\u4F52\u4F5F\u4F41\u4F58\u4F2D\u4F33\u4F3F\u4F61\u518F\u51B9\u521C\u521E\u5221\u52AD\u52AE\u5309\u5363\u5372\u538E\u538F\u5430\u5437\u542A\u5454\u5445\u5419\u541C\u5425\u5418\"],\n[\"caa1\",\"\u543D\u544F\u5441\u5428\u5424\u5447\u56EE\u56E7\u56E5\u5741\u5745\u574C\u5749\u574B\u5752\u5906\u5940\u59A6\u5998\u59A0\u5997\u598E\u59A2\u5990\u598F\u59A7\u59A1\u5B8E\u5B92\u5C28\u5C2A\u5C8D\u5C8F\u5C88\u5C8B\u5C89\u5C92\u5C8A\u5C86\u5C93\u5C95\u5DE0\u5E0A\u5E0E\u5E8B\u5E89\u5E8C\u5E88\u5E8D\u5F05\u5F1D\u5F78\u5F76\u5FD2\u5FD1\u5FD0\u5FED\u5FE8\u5FEE\u5FF3\u5FE1\u5FE4\u5FE3\u5FFA\u5FEF\u5FF7\u5FFB\u6000\u5FF4\u623A\u6283\u628C\u628E\u628F\u6294\u6287\u6271\u627B\u627A\u6270\u6281\u6288\u6277\u627D\u6272\u6274\u6537\u65F0\u65F4\u65F3\u65F2\u65F5\u6745\u6747\"],\n[\"cb40\",\"\u6759\u6755\u674C\u6748\u675D\u674D\u675A\u674B\u6BD0\u6C19\u6C1A\u6C78\u6C67\u6C6B\u6C84\u6C8B\u6C8F\u6C71\u6C6F\u6C69\u6C9A\u6C6D\u6C87\u6C95\u6C9C\u6C66\u6C73\u6C65\u6C7B\u6C8E\u7074\u707A\u7263\u72BF\u72BD\u72C3\u72C6\u72C1\u72BA\u72C5\u7395\u7397\u7393\u7394\u7392\u753A\u7539\u7594\u7595\u7681\u793D\u8034\u8095\u8099\u8090\u8092\u809C\u8290\u828F\u8285\u828E\u8291\u8293\"],\n[\"cba1\",\"\u828A\u8283\u8284\u8C78\u8FC9\u8FBF\u909F\u90A1\u90A5\u909E\u90A7\u90A0\u9630\u9628\u962F\u962D\u4E33\u4F98\u4F7C\u4F85\u4F7D\u4F80\u4F87\u4F76\u4F74\u4F89\u4F84\u4F77\u4F4C\u4F97\u4F6A\u4F9A\u4F79\u4F81\u4F78\u4F90\u4F9C\u4F94\u4F9E\u4F92\u4F82\u4F95\u4F6B\u4F6E\u519E\u51BC\u51BE\u5235\u5232\u5233\u5246\u5231\u52BC\u530A\u530B\u533C\u5392\u5394\u5487\u547F\u5481\u5491\u5482\u5488\u546B\u547A\u547E\u5465\u546C\u5474\u5466\u548D\u546F\u5461\u5460\u5498\u5463\u5467\u5464\u56F7\u56F9\u576F\u5772\u576D\u576B\u5771\u5770\u5776\u5780\u5775\u577B\u5773\u5774\u5762\"],\n[\"cc40\",\"\u5768\u577D\u590C\u5945\u59B5\u59BA\u59CF\u59CE\u59B2\u59CC\u59C1\u59B6\u59BC\u59C3\u59D6\u59B1\u59BD\u59C0\u59C8\u59B4\u59C7\u5B62\u5B65\u5B93\u5B95\u5C44\u5C47\u5CAE\u5CA4\u5CA0\u5CB5\u5CAF\u5CA8\u5CAC\u5C9F\u5CA3\u5CAD\u5CA2\u5CAA\u5CA7\u5C9D\u5CA5\u5CB6\u5CB0\u5CA6\u5E17\u5E14\u5E19\u5F28\u5F22\u5F23\u5F24\u5F54\u5F82\u5F7E\u5F7D\u5FDE\u5FE5\u602D\u6026\u6019\u6032\u600B\"],\n[\"cca1\",\"\u6034\u600A\u6017\u6033\u601A\u601E\u602C\u6022\u600D\u6010\u602E\u6013\u6011\u600C\u6009\u601C\u6214\u623D\u62AD\u62B4\u62D1\u62BE\u62AA\u62B6\u62CA\u62AE\u62B3\u62AF\u62BB\u62A9\u62B0\u62B8\u653D\u65A8\u65BB\u6609\u65FC\u6604\u6612\u6608\u65FB\u6603\u660B\u660D\u6605\u65FD\u6611\u6610\u66F6\u670A\u6785\u676C\u678E\u6792\u6776\u677B\u6798\u6786\u6784\u6774\u678D\u678C\u677A\u679F\u6791\u6799\u6783\u677D\u6781\u6778\u6779\u6794\u6B25\u6B80\u6B7E\u6BDE\u6C1D\u6C93\u6CEC\u6CEB\u6CEE\u6CD9\u6CB6\u6CD4\u6CAD\u6CE7\u6CB7\u6CD0\u6CC2\u6CBA\u6CC3\u6CC6\u6CED\u6CF2\"],\n[\"cd40\",\"\u6CD2\u6CDD\u6CB4\u6C8A\u6C9D\u6C80\u6CDE\u6CC0\u6D30\u6CCD\u6CC7\u6CB0\u6CF9\u6CCF\u6CE9\u6CD1\u7094\u7098\u7085\u7093\u7086\u7084\u7091\u7096\u7082\u709A\u7083\u726A\u72D6\u72CB\u72D8\u72C9\u72DC\u72D2\u72D4\u72DA\u72CC\u72D1\u73A4\u73A1\u73AD\u73A6\u73A2\u73A0\u73AC\u739D\u74DD\u74E8\u753F\u7540\u753E\u758C\u7598\u76AF\u76F3\u76F1\u76F0\u76F5\u77F8\u77FC\u77F9\u77FB\u77FA\"],\n[\"cda1\",\"\u77F7\u7942\u793F\u79C5\u7A78\u7A7B\u7AFB\u7C75\u7CFD\u8035\u808F\u80AE\u80A3\u80B8\u80B5\u80AD\u8220\u82A0\u82C0\u82AB\u829A\u8298\u829B\u82B5\u82A7\u82AE\u82BC\u829E\u82BA\u82B4\u82A8\u82A1\u82A9\u82C2\u82A4\u82C3\u82B6\u82A2\u8670\u866F\u866D\u866E\u8C56\u8FD2\u8FCB\u8FD3\u8FCD\u8FD6\u8FD5\u8FD7\u90B2\u90B4\u90AF\u90B3\u90B0\u9639\u963D\u963C\u963A\u9643\u4FCD\u4FC5\u4FD3\u4FB2\u4FC9\u4FCB\u4FC1\u4FD4\u4FDC\u4FD9\u4FBB\u4FB3\u4FDB\u4FC7\u4FD6\u4FBA\u4FC0\u4FB9\u4FEC\u5244\u5249\u52C0\u52C2\u533D\u537C\u5397\u5396\u5399\u5398\u54BA\u54A1\u54AD\u54A5\u54CF\"],\n[\"ce40\",\"\u54C3\u830D\u54B7\u54AE\u54D6\u54B6\u54C5\u54C6\u54A0\u5470\u54BC\u54A2\u54BE\u5472\u54DE\u54B0\u57B5\u579E\u579F\u57A4\u578C\u5797\u579D\u579B\u5794\u5798\u578F\u5799\u57A5\u579A\u5795\u58F4\u590D\u5953\u59E1\u59DE\u59EE\u5A00\u59F1\u59DD\u59FA\u59FD\u59FC\u59F6\u59E4\u59F2\u59F7\u59DB\u59E9\u59F3\u59F5\u59E0\u59FE\u59F4\u59ED\u5BA8\u5C4C\u5CD0\u5CD8\u5CCC\u5CD7\u5CCB\u5CDB\"],\n[\"cea1\",\"\u5CDE\u5CDA\u5CC9\u5CC7\u5CCA\u5CD6\u5CD3\u5CD4\u5CCF\u5CC8\u5CC6\u5CCE\u5CDF\u5CF8\u5DF9\u5E21\u5E22\u5E23\u5E20\u5E24\u5EB0\u5EA4\u5EA2\u5E9B\u5EA3\u5EA5\u5F07\u5F2E\u5F56\u5F86\u6037\u6039\u6054\u6072\u605E\u6045\u6053\u6047\u6049\u605B\u604C\u6040\u6042\u605F\u6024\u6044\u6058\u6066\u606E\u6242\u6243\u62CF\u630D\u630B\u62F5\u630E\u6303\u62EB\u62F9\u630F\u630C\u62F8\u62F6\u6300\u6313\u6314\u62FA\u6315\u62FB\u62F0\u6541\u6543\u65AA\u65BF\u6636\u6621\u6632\u6635\u661C\u6626\u6622\u6633\u662B\u663A\u661D\u6634\u6639\u662E\u670F\u6710\u67C1\u67F2\u67C8\u67BA\"],\n[\"cf40\",\"\u67DC\u67BB\u67F8\u67D8\u67C0\u67B7\u67C5\u67EB\u67E4\u67DF\u67B5\u67CD\u67B3\u67F7\u67F6\u67EE\u67E3\u67C2\u67B9\u67CE\u67E7\u67F0\u67B2\u67FC\u67C6\u67ED\u67CC\u67AE\u67E6\u67DB\u67FA\u67C9\u67CA\u67C3\u67EA\u67CB\u6B28\u6B82\u6B84\u6BB6\u6BD6\u6BD8\u6BE0\u6C20\u6C21\u6D28\u6D34\u6D2D\u6D1F\u6D3C\u6D3F\u6D12\u6D0A\u6CDA\u6D33\u6D04\u6D19\u6D3A\u6D1A\u6D11\u6D00\u6D1D\u6D42\"],\n[\"cfa1\",\"\u6D01\u6D18\u6D37\u6D03\u6D0F\u6D40\u6D07\u6D20\u6D2C\u6D08\u6D22\u6D09\u6D10\u70B7\u709F\u70BE\u70B1\u70B0\u70A1\u70B4\u70B5\u70A9\u7241\u7249\u724A\u726C\u7270\u7273\u726E\u72CA\u72E4\u72E8\u72EB\u72DF\u72EA\u72E6\u72E3\u7385\u73CC\u73C2\u73C8\u73C5\u73B9\u73B6\u73B5\u73B4\u73EB\u73BF\u73C7\u73BE\u73C3\u73C6\u73B8\u73CB\u74EC\u74EE\u752E\u7547\u7548\u75A7\u75AA\u7679\u76C4\u7708\u7703\u7704\u7705\u770A\u76F7\u76FB\u76FA\u77E7\u77E8\u7806\u7811\u7812\u7805\u7810\u780F\u780E\u7809\u7803\u7813\u794A\u794C\u794B\u7945\u7944\u79D5\u79CD\u79CF\u79D6\u79CE\u7A80\"],\n[\"d040\",\"\u7A7E\u7AD1\u7B00\u7B01\u7C7A\u7C78\u7C79\u7C7F\u7C80\u7C81\u7D03\u7D08\u7D01\u7F58\u7F91\u7F8D\u7FBE\u8007\u800E\u800F\u8014\u8037\u80D8\u80C7\u80E0\u80D1\u80C8\u80C2\u80D0\u80C5\u80E3\u80D9\u80DC\u80CA\u80D5\u80C9\u80CF\u80D7\u80E6\u80CD\u81FF\u8221\u8294\u82D9\u82FE\u82F9\u8307\u82E8\u8300\u82D5\u833A\u82EB\u82D6\u82F4\u82EC\u82E1\u82F2\u82F5\u830C\u82FB\u82F6\u82F0\u82EA\"],\n[\"d0a1\",\"\u82E4\u82E0\u82FA\u82F3\u82ED\u8677\u8674\u867C\u8673\u8841\u884E\u8867\u886A\u8869\u89D3\u8A04\u8A07\u8D72\u8FE3\u8FE1\u8FEE\u8FE0\u90F1\u90BD\u90BF\u90D5\u90C5\u90BE\u90C7\u90CB\u90C8\u91D4\u91D3\u9654\u964F\u9651\u9653\u964A\u964E\u501E\u5005\u5007\u5013\u5022\u5030\u501B\u4FF5\u4FF4\u5033\u5037\u502C\u4FF6\u4FF7\u5017\u501C\u5020\u5027\u5035\u502F\u5031\u500E\u515A\u5194\u5193\u51CA\u51C4\u51C5\u51C8\u51CE\u5261\u525A\u5252\u525E\u525F\u5255\u5262\u52CD\u530E\u539E\u5526\u54E2\u5517\u5512\u54E7\u54F3\u54E4\u551A\u54FF\u5504\u5508\u54EB\u5511\u5505\u54F1\"],\n[\"d140\",\"\u550A\u54FB\u54F7\u54F8\u54E0\u550E\u5503\u550B\u5701\u5702\u57CC\u5832\u57D5\u57D2\u57BA\u57C6\u57BD\u57BC\u57B8\u57B6\u57BF\u57C7\u57D0\u57B9\u57C1\u590E\u594A\u5A19\u5A16\u5A2D\u5A2E\u5A15\u5A0F\u5A17\u5A0A\u5A1E\u5A33\u5B6C\u5BA7\u5BAD\u5BAC\u5C03\u5C56\u5C54\u5CEC\u5CFF\u5CEE\u5CF1\u5CF7\u5D00\u5CF9\u5E29\u5E28\u5EA8\u5EAE\u5EAA\u5EAC\u5F33\u5F30\u5F67\u605D\u605A\u6067\"],\n[\"d1a1\",\"\u6041\u60A2\u6088\u6080\u6092\u6081\u609D\u6083\u6095\u609B\u6097\u6087\u609C\u608E\u6219\u6246\u62F2\u6310\u6356\u632C\u6344\u6345\u6336\u6343\u63E4\u6339\u634B\u634A\u633C\u6329\u6341\u6334\u6358\u6354\u6359\u632D\u6347\u6333\u635A\u6351\u6338\u6357\u6340\u6348\u654A\u6546\u65C6\u65C3\u65C4\u65C2\u664A\u665F\u6647\u6651\u6712\u6713\u681F\u681A\u6849\u6832\u6833\u683B\u684B\u684F\u6816\u6831\u681C\u6835\u682B\u682D\u682F\u684E\u6844\u6834\u681D\u6812\u6814\u6826\u6828\u682E\u684D\u683A\u6825\u6820\u6B2C\u6B2F\u6B2D\u6B31\u6B34\u6B6D\u8082\u6B88\u6BE6\u6BE4\"],\n[\"d240\",\"\u6BE8\u6BE3\u6BE2\u6BE7\u6C25\u6D7A\u6D63\u6D64\u6D76\u6D0D\u6D61\u6D92\u6D58\u6D62\u6D6D\u6D6F\u6D91\u6D8D\u6DEF\u6D7F\u6D86\u6D5E\u6D67\u6D60\u6D97\u6D70\u6D7C\u6D5F\u6D82\u6D98\u6D2F\u6D68\u6D8B\u6D7E\u6D80\u6D84\u6D16\u6D83\u6D7B\u6D7D\u6D75\u6D90\u70DC\u70D3\u70D1\u70DD\u70CB\u7F39\u70E2\u70D7\u70D2\u70DE\u70E0\u70D4\u70CD\u70C5\u70C6\u70C7\u70DA\u70CE\u70E1\u7242\u7278\"],\n[\"d2a1\",\"\u7277\u7276\u7300\u72FA\u72F4\u72FE\u72F6\u72F3\u72FB\u7301\u73D3\u73D9\u73E5\u73D6\u73BC\u73E7\u73E3\u73E9\u73DC\u73D2\u73DB\u73D4\u73DD\u73DA\u73D7\u73D8\u73E8\u74DE\u74DF\u74F4\u74F5\u7521\u755B\u755F\u75B0\u75C1\u75BB\u75C4\u75C0\u75BF\u75B6\u75BA\u768A\u76C9\u771D\u771B\u7710\u7713\u7712\u7723\u7711\u7715\u7719\u771A\u7722\u7727\u7823\u782C\u7822\u7835\u782F\u7828\u782E\u782B\u7821\u7829\u7833\u782A\u7831\u7954\u795B\u794F\u795C\u7953\u7952\u7951\u79EB\u79EC\u79E0\u79EE\u79ED\u79EA\u79DC\u79DE\u79DD\u7A86\u7A89\u7A85\u7A8B\u7A8C\u7A8A\u7A87\u7AD8\u7B10\"],\n[\"d340\",\"\u7B04\u7B13\u7B05\u7B0F\u7B08\u7B0A\u7B0E\u7B09\u7B12\u7C84\u7C91\u7C8A\u7C8C\u7C88\u7C8D\u7C85\u7D1E\u7D1D\u7D11\u7D0E\u7D18\u7D16\u7D13\u7D1F\u7D12\u7D0F\u7D0C\u7F5C\u7F61\u7F5E\u7F60\u7F5D\u7F5B\u7F96\u7F92\u7FC3\u7FC2\u7FC0\u8016\u803E\u8039\u80FA\u80F2\u80F9\u80F5\u8101\u80FB\u8100\u8201\u822F\u8225\u8333\u832D\u8344\u8319\u8351\u8325\u8356\u833F\u8341\u8326\u831C\u8322\"],\n[\"d3a1\",\"\u8342\u834E\u831B\u832A\u8308\u833C\u834D\u8316\u8324\u8320\u8337\u832F\u8329\u8347\u8345\u834C\u8353\u831E\u832C\u834B\u8327\u8348\u8653\u8652\u86A2\u86A8\u8696\u868D\u8691\u869E\u8687\u8697\u8686\u868B\u869A\u8685\u86A5\u8699\u86A1\u86A7\u8695\u8698\u868E\u869D\u8690\u8694\u8843\u8844\u886D\u8875\u8876\u8872\u8880\u8871\u887F\u886F\u8883\u887E\u8874\u887C\u8A12\u8C47\u8C57\u8C7B\u8CA4\u8CA3\u8D76\u8D78\u8DB5\u8DB7\u8DB6\u8ED1\u8ED3\u8FFE\u8FF5\u9002\u8FFF\u8FFB\u9004\u8FFC\u8FF6\u90D6\u90E0\u90D9\u90DA\u90E3\u90DF\u90E5\u90D8\u90DB\u90D7\u90DC\u90E4\u9150\"],\n[\"d440\",\"\u914E\u914F\u91D5\u91E2\u91DA\u965C\u965F\u96BC\u98E3\u9ADF\u9B2F\u4E7F\u5070\u506A\u5061\u505E\u5060\u5053\u504B\u505D\u5072\u5048\u504D\u5041\u505B\u504A\u5062\u5015\u5045\u505F\u5069\u506B\u5063\u5064\u5046\u5040\u506E\u5073\u5057\u5051\u51D0\u526B\u526D\u526C\u526E\u52D6\u52D3\u532D\u539C\u5575\u5576\u553C\u554D\u5550\u5534\u552A\u5551\u5562\u5536\u5535\u5530\u5552\u5545\"],\n[\"d4a1\",\"\u550C\u5532\u5565\u554E\u5539\u5548\u552D\u553B\u5540\u554B\u570A\u5707\u57FB\u5814\u57E2\u57F6\u57DC\u57F4\u5800\u57ED\u57FD\u5808\u57F8\u580B\u57F3\u57CF\u5807\u57EE\u57E3\u57F2\u57E5\u57EC\u57E1\u580E\u57FC\u5810\u57E7\u5801\u580C\u57F1\u57E9\u57F0\u580D\u5804\u595C\u5A60\u5A58\u5A55\u5A67\u5A5E\u5A38\u5A35\u5A6D\u5A50\u5A5F\u5A65\u5A6C\u5A53\u5A64\u5A57\u5A43\u5A5D\u5A52\u5A44\u5A5B\u5A48\u5A8E\u5A3E\u5A4D\u5A39\u5A4C\u5A70\u5A69\u5A47\u5A51\u5A56\u5A42\u5A5C\u5B72\u5B6E\u5BC1\u5BC0\u5C59\u5D1E\u5D0B\u5D1D\u5D1A\u5D20\u5D0C\u5D28\u5D0D\u5D26\u5D25\u5D0F\"],\n[\"d540\",\"\u5D30\u5D12\u5D23\u5D1F\u5D2E\u5E3E\u5E34\u5EB1\u5EB4\u5EB9\u5EB2\u5EB3\u5F36\u5F38\u5F9B\u5F96\u5F9F\u608A\u6090\u6086\u60BE\u60B0\u60BA\u60D3\u60D4\u60CF\u60E4\u60D9\u60DD\u60C8\u60B1\u60DB\u60B7\u60CA\u60BF\u60C3\u60CD\u60C0\u6332\u6365\u638A\u6382\u637D\u63BD\u639E\u63AD\u639D\u6397\u63AB\u638E\u636F\u6387\u6390\u636E\u63AF\u6375\u639C\u636D\u63AE\u637C\u63A4\u633B\u639F\"],\n[\"d5a1\",\"\u6378\u6385\u6381\u6391\u638D\u6370\u6553\u65CD\u6665\u6661\u665B\u6659\u665C\u6662\u6718\u6879\u6887\u6890\u689C\u686D\u686E\u68AE\u68AB\u6956\u686F\u68A3\u68AC\u68A9\u6875\u6874\u68B2\u688F\u6877\u6892\u687C\u686B\u6872\u68AA\u6880\u6871\u687E\u689B\u6896\u688B\u68A0\u6889\u68A4\u6878\u687B\u6891\u688C\u688A\u687D\u6B36\u6B33\u6B37\u6B38\u6B91\u6B8F\u6B8D\u6B8E\u6B8C\u6C2A\u6DC0\u6DAB\u6DB4\u6DB3\u6E74\u6DAC\u6DE9\u6DE2\u6DB7\u6DF6\u6DD4\u6E00\u6DC8\u6DE0\u6DDF\u6DD6\u6DBE\u6DE5\u6DDC\u6DDD\u6DDB\u6DF4\u6DCA\u6DBD\u6DED\u6DF0\u6DBA\u6DD5\u6DC2\u6DCF\u6DC9\"],\n[\"d640\",\"\u6DD0\u6DF2\u6DD3\u6DFD\u6DD7\u6DCD\u6DE3\u6DBB\u70FA\u710D\u70F7\u7117\u70F4\u710C\u70F0\u7104\u70F3\u7110\u70FC\u70FF\u7106\u7113\u7100\u70F8\u70F6\u710B\u7102\u710E\u727E\u727B\u727C\u727F\u731D\u7317\u7307\u7311\u7318\u730A\u7308\u72FF\u730F\u731E\u7388\u73F6\u73F8\u73F5\u7404\u7401\u73FD\u7407\u7400\u73FA\u73FC\u73FF\u740C\u740B\u73F4\u7408\u7564\u7563\u75CE\u75D2\u75CF\"],\n[\"d6a1\",\"\u75CB\u75CC\u75D1\u75D0\u768F\u7689\u76D3\u7739\u772F\u772D\u7731\u7732\u7734\u7733\u773D\u7725\u773B\u7735\u7848\u7852\u7849\u784D\u784A\u784C\u7826\u7845\u7850\u7964\u7967\u7969\u796A\u7963\u796B\u7961\u79BB\u79FA\u79F8\u79F6\u79F7\u7A8F\u7A94\u7A90\u7B35\u7B47\u7B34\u7B25\u7B30\u7B22\u7B24\u7B33\u7B18\u7B2A\u7B1D\u7B31\u7B2B\u7B2D\u7B2F\u7B32\u7B38\u7B1A\u7B23\u7C94\u7C98\u7C96\u7CA3\u7D35\u7D3D\u7D38\u7D36\u7D3A\u7D45\u7D2C\u7D29\u7D41\u7D47\u7D3E\u7D3F\u7D4A\u7D3B\u7D28\u7F63\u7F95\u7F9C\u7F9D\u7F9B\u7FCA\u7FCB\u7FCD\u7FD0\u7FD1\u7FC7\u7FCF\u7FC9\u801F\"],\n[\"d740\",\"\u801E\u801B\u8047\u8043\u8048\u8118\u8125\u8119\u811B\u812D\u811F\u812C\u811E\u8121\u8115\u8127\u811D\u8122\u8211\u8238\u8233\u823A\u8234\u8232\u8274\u8390\u83A3\u83A8\u838D\u837A\u8373\u83A4\u8374\u838F\u8381\u8395\u8399\u8375\u8394\u83A9\u837D\u8383\u838C\u839D\u839B\u83AA\u838B\u837E\u83A5\u83AF\u8388\u8397\u83B0\u837F\u83A6\u8387\u83AE\u8376\u839A\u8659\u8656\u86BF\u86B7\"],\n[\"d7a1\",\"\u86C2\u86C1\u86C5\u86BA\u86B0\u86C8\u86B9\u86B3\u86B8\u86CC\u86B4\u86BB\u86BC\u86C3\u86BD\u86BE\u8852\u8889\u8895\u88A8\u88A2\u88AA\u889A\u8891\u88A1\u889F\u8898\u88A7\u8899\u889B\u8897\u88A4\u88AC\u888C\u8893\u888E\u8982\u89D6\u89D9\u89D5\u8A30\u8A27\u8A2C\u8A1E\u8C39\u8C3B\u8C5C\u8C5D\u8C7D\u8CA5\u8D7D\u8D7B\u8D79\u8DBC\u8DC2\u8DB9\u8DBF\u8DC1\u8ED8\u8EDE\u8EDD\u8EDC\u8ED7\u8EE0\u8EE1\u9024\u900B\u9011\u901C\u900C\u9021\u90EF\u90EA\u90F0\u90F4\u90F2\u90F3\u90D4\u90EB\u90EC\u90E9\u9156\u9158\u915A\u9153\u9155\u91EC\u91F4\u91F1\u91F3\u91F8\u91E4\u91F9\u91EA\"],\n[\"d840\",\"\u91EB\u91F7\u91E8\u91EE\u957A\u9586\u9588\u967C\u966D\u966B\u9671\u966F\u96BF\u976A\u9804\u98E5\u9997\u509B\u5095\u5094\u509E\u508B\u50A3\u5083\u508C\u508E\u509D\u5068\u509C\u5092\u5082\u5087\u515F\u51D4\u5312\u5311\u53A4\u53A7\u5591\u55A8\u55A5\u55AD\u5577\u5645\u55A2\u5593\u5588\u558F\u55B5\u5581\u55A3\u5592\u55A4\u557D\u558C\u55A6\u557F\u5595\u55A1\u558E\u570C\u5829\u5837\"],\n[\"d8a1\",\"\u5819\u581E\u5827\u5823\u5828\u57F5\u5848\u5825\u581C\u581B\u5833\u583F\u5836\u582E\u5839\u5838\u582D\u582C\u583B\u5961\u5AAF\u5A94\u5A9F\u5A7A\u5AA2\u5A9E\u5A78\u5AA6\u5A7C\u5AA5\u5AAC\u5A95\u5AAE\u5A37\u5A84\u5A8A\u5A97\u5A83\u5A8B\u5AA9\u5A7B\u5A7D\u5A8C\u5A9C\u5A8F\u5A93\u5A9D\u5BEA\u5BCD\u5BCB\u5BD4\u5BD1\u5BCA\u5BCE\u5C0C\u5C30\u5D37\u5D43\u5D6B\u5D41\u5D4B\u5D3F\u5D35\u5D51\u5D4E\u5D55\u5D33\u5D3A\u5D52\u5D3D\u5D31\u5D59\u5D42\u5D39\u5D49\u5D38\u5D3C\u5D32\u5D36\u5D40\u5D45\u5E44\u5E41\u5F58\u5FA6\u5FA5\u5FAB\u60C9\u60B9\u60CC\u60E2\u60CE\u60C4\u6114\"],\n[\"d940\",\"\u60F2\u610A\u6116\u6105\u60F5\u6113\u60F8\u60FC\u60FE\u60C1\u6103\u6118\u611D\u6110\u60FF\u6104\u610B\u624A\u6394\u63B1\u63B0\u63CE\u63E5\u63E8\u63EF\u63C3\u649D\u63F3\u63CA\u63E0\u63F6\u63D5\u63F2\u63F5\u6461\u63DF\u63BE\u63DD\u63DC\u63C4\u63D8\u63D3\u63C2\u63C7\u63CC\u63CB\u63C8\u63F0\u63D7\u63D9\u6532\u6567\u656A\u6564\u655C\u6568\u6565\u658C\u659D\u659E\u65AE\u65D0\u65D2\"],\n[\"d9a1\",\"\u667C\u666C\u667B\u6680\u6671\u6679\u666A\u6672\u6701\u690C\u68D3\u6904\u68DC\u692A\u68EC\u68EA\u68F1\u690F\u68D6\u68F7\u68EB\u68E4\u68F6\u6913\u6910\u68F3\u68E1\u6907\u68CC\u6908\u6970\u68B4\u6911\u68EF\u68C6\u6914\u68F8\u68D0\u68FD\u68FC\u68E8\u690B\u690A\u6917\u68CE\u68C8\u68DD\u68DE\u68E6\u68F4\u68D1\u6906\u68D4\u68E9\u6915\u6925\u68C7\u6B39\u6B3B\u6B3F\u6B3C\u6B94\u6B97\u6B99\u6B95\u6BBD\u6BF0\u6BF2\u6BF3\u6C30\u6DFC\u6E46\u6E47\u6E1F\u6E49\u6E88\u6E3C\u6E3D\u6E45\u6E62\u6E2B\u6E3F\u6E41\u6E5D\u6E73\u6E1C\u6E33\u6E4B\u6E40\u6E51\u6E3B\u6E03\u6E2E\u6E5E\"],\n[\"da40\",\"\u6E68\u6E5C\u6E61\u6E31\u6E28\u6E60\u6E71\u6E6B\u6E39\u6E22\u6E30\u6E53\u6E65\u6E27\u6E78\u6E64\u6E77\u6E55\u6E79\u6E52\u6E66\u6E35\u6E36\u6E5A\u7120\u711E\u712F\u70FB\u712E\u7131\u7123\u7125\u7122\u7132\u711F\u7128\u713A\u711B\u724B\u725A\u7288\u7289\u7286\u7285\u728B\u7312\u730B\u7330\u7322\u7331\u7333\u7327\u7332\u732D\u7326\u7323\u7335\u730C\u742E\u742C\u7430\u742B\u7416\"],\n[\"daa1\",\"\u741A\u7421\u742D\u7431\u7424\u7423\u741D\u7429\u7420\u7432\u74FB\u752F\u756F\u756C\u75E7\u75DA\u75E1\u75E6\u75DD\u75DF\u75E4\u75D7\u7695\u7692\u76DA\u7746\u7747\u7744\u774D\u7745\u774A\u774E\u774B\u774C\u77DE\u77EC\u7860\u7864\u7865\u785C\u786D\u7871\u786A\u786E\u7870\u7869\u7868\u785E\u7862\u7974\u7973\u7972\u7970\u7A02\u7A0A\u7A03\u7A0C\u7A04\u7A99\u7AE6\u7AE4\u7B4A\u7B3B\u7B44\u7B48\u7B4C\u7B4E\u7B40\u7B58\u7B45\u7CA2\u7C9E\u7CA8\u7CA1\u7D58\u7D6F\u7D63\u7D53\u7D56\u7D67\u7D6A\u7D4F\u7D6D\u7D5C\u7D6B\u7D52\u7D54\u7D69\u7D51\u7D5F\u7D4E\u7F3E\u7F3F\u7F65\"],\n[\"db40\",\"\u7F66\u7FA2\u7FA0\u7FA1\u7FD7\u8051\u804F\u8050\u80FE\u80D4\u8143\u814A\u8152\u814F\u8147\u813D\u814D\u813A\u81E6\u81EE\u81F7\u81F8\u81F9\u8204\u823C\u823D\u823F\u8275\u833B\u83CF\u83F9\u8423\u83C0\u83E8\u8412\u83E7\u83E4\u83FC\u83F6\u8410\u83C6\u83C8\u83EB\u83E3\u83BF\u8401\u83DD\u83E5\u83D8\u83FF\u83E1\u83CB\u83CE\u83D6\u83F5\u83C9\u8409\u840F\u83DE\u8411\u8406\u83C2\u83F3\"],\n[\"dba1\",\"\u83D5\u83FA\u83C7\u83D1\u83EA\u8413\u83C3\u83EC\u83EE\u83C4\u83FB\u83D7\u83E2\u841B\u83DB\u83FE\u86D8\u86E2\u86E6\u86D3\u86E3\u86DA\u86EA\u86DD\u86EB\u86DC\u86EC\u86E9\u86D7\u86E8\u86D1\u8848\u8856\u8855\u88BA\u88D7\u88B9\u88B8\u88C0\u88BE\u88B6\u88BC\u88B7\u88BD\u88B2\u8901\u88C9\u8995\u8998\u8997\u89DD\u89DA\u89DB\u8A4E\u8A4D\u8A39\u8A59\u8A40\u8A57\u8A58\u8A44\u8A45\u8A52\u8A48\u8A51\u8A4A\u8A4C\u8A4F\u8C5F\u8C81\u8C80\u8CBA\u8CBE\u8CB0\u8CB9\u8CB5\u8D84\u8D80\u8D89\u8DD8\u8DD3\u8DCD\u8DC7\u8DD6\u8DDC\u8DCF\u8DD5\u8DD9\u8DC8\u8DD7\u8DC5\u8EEF\u8EF7\u8EFA\"],\n[\"dc40\",\"\u8EF9\u8EE6\u8EEE\u8EE5\u8EF5\u8EE7\u8EE8\u8EF6\u8EEB\u8EF1\u8EEC\u8EF4\u8EE9\u902D\u9034\u902F\u9106\u912C\u9104\u90FF\u90FC\u9108\u90F9\u90FB\u9101\u9100\u9107\u9105\u9103\u9161\u9164\u915F\u9162\u9160\u9201\u920A\u9225\u9203\u921A\u9226\u920F\u920C\u9200\u9212\u91FF\u91FD\u9206\u9204\u9227\u9202\u921C\u9224\u9219\u9217\u9205\u9216\u957B\u958D\u958C\u9590\u9687\u967E\u9688\"],\n[\"dca1\",\"\u9689\u9683\u9680\u96C2\u96C8\u96C3\u96F1\u96F0\u976C\u9770\u976E\u9807\u98A9\u98EB\u9CE6\u9EF9\u4E83\u4E84\u4EB6\u50BD\u50BF\u50C6\u50AE\u50C4\u50CA\u50B4\u50C8\u50C2\u50B0\u50C1\u50BA\u50B1\u50CB\u50C9\u50B6\u50B8\u51D7\u527A\u5278\u527B\u527C\u55C3\u55DB\u55CC\u55D0\u55CB\u55CA\u55DD\u55C0\u55D4\u55C4\u55E9\u55BF\u55D2\u558D\u55CF\u55D5\u55E2\u55D6\u55C8\u55F2\u55CD\u55D9\u55C2\u5714\u5853\u5868\u5864\u584F\u584D\u5849\u586F\u5855\u584E\u585D\u5859\u5865\u585B\u583D\u5863\u5871\u58FC\u5AC7\u5AC4\u5ACB\u5ABA\u5AB8\u5AB1\u5AB5\u5AB0\u5ABF\u5AC8\u5ABB\u5AC6\"],\n[\"dd40\",\"\u5AB7\u5AC0\u5ACA\u5AB4\u5AB6\u5ACD\u5AB9\u5A90\u5BD6\u5BD8\u5BD9\u5C1F\u5C33\u5D71\u5D63\u5D4A\u5D65\u5D72\u5D6C\u5D5E\u5D68\u5D67\u5D62\u5DF0\u5E4F\u5E4E\u5E4A\u5E4D\u5E4B\u5EC5\u5ECC\u5EC6\u5ECB\u5EC7\u5F40\u5FAF\u5FAD\u60F7\u6149\u614A\u612B\u6145\u6136\u6132\u612E\u6146\u612F\u614F\u6129\u6140\u6220\u9168\u6223\u6225\u6224\u63C5\u63F1\u63EB\u6410\u6412\u6409\u6420\u6424\"],\n[\"dda1\",\"\u6433\u6443\u641F\u6415\u6418\u6439\u6437\u6422\u6423\u640C\u6426\u6430\u6428\u6441\u6435\u642F\u640A\u641A\u6440\u6425\u6427\u640B\u63E7\u641B\u642E\u6421\u640E\u656F\u6592\u65D3\u6686\u668C\u6695\u6690\u668B\u668A\u6699\u6694\u6678\u6720\u6966\u695F\u6938\u694E\u6962\u6971\u693F\u6945\u696A\u6939\u6942\u6957\u6959\u697A\u6948\u6949\u6935\u696C\u6933\u693D\u6965\u68F0\u6978\u6934\u6969\u6940\u696F\u6944\u6976\u6958\u6941\u6974\u694C\u693B\u694B\u6937\u695C\u694F\u6951\u6932\u6952\u692F\u697B\u693C\u6B46\u6B45\u6B43\u6B42\u6B48\u6B41\u6B9B\uFA0D\u6BFB\u6BFC\"],\n[\"de40\",\"\u6BF9\u6BF7\u6BF8\u6E9B\u6ED6\u6EC8\u6E8F\u6EC0\u6E9F\u6E93\u6E94\u6EA0\u6EB1\u6EB9\u6EC6\u6ED2\u6EBD\u6EC1\u6E9E\u6EC9\u6EB7\u6EB0\u6ECD\u6EA6\u6ECF\u6EB2\u6EBE\u6EC3\u6EDC\u6ED8\u6E99\u6E92\u6E8E\u6E8D\u6EA4\u6EA1\u6EBF\u6EB3\u6ED0\u6ECA\u6E97\u6EAE\u6EA3\u7147\u7154\u7152\u7163\u7160\u7141\u715D\u7162\u7172\u7178\u716A\u7161\u7142\u7158\u7143\u714B\u7170\u715F\u7150\u7153\"],\n[\"dea1\",\"\u7144\u714D\u715A\u724F\u728D\u728C\u7291\u7290\u728E\u733C\u7342\u733B\u733A\u7340\u734A\u7349\u7444\u744A\u744B\u7452\u7451\u7457\u7440\u744F\u7450\u744E\u7442\u7446\u744D\u7454\u74E1\u74FF\u74FE\u74FD\u751D\u7579\u7577\u6983\u75EF\u760F\u7603\u75F7\u75FE\u75FC\u75F9\u75F8\u7610\u75FB\u75F6\u75ED\u75F5\u75FD\u7699\u76B5\u76DD\u7755\u775F\u7760\u7752\u7756\u775A\u7769\u7767\u7754\u7759\u776D\u77E0\u7887\u789A\u7894\u788F\u7884\u7895\u7885\u7886\u78A1\u7883\u7879\u7899\u7880\u7896\u787B\u797C\u7982\u797D\u7979\u7A11\u7A18\u7A19\u7A12\u7A17\u7A15\u7A22\u7A13\"],\n[\"df40\",\"\u7A1B\u7A10\u7AA3\u7AA2\u7A9E\u7AEB\u7B66\u7B64\u7B6D\u7B74\u7B69\u7B72\u7B65\u7B73\u7B71\u7B70\u7B61\u7B78\u7B76\u7B63\u7CB2\u7CB4\u7CAF\u7D88\u7D86\u7D80\u7D8D\u7D7F\u7D85\u7D7A\u7D8E\u7D7B\u7D83\u7D7C\u7D8C\u7D94\u7D84\u7D7D\u7D92\u7F6D\u7F6B\u7F67\u7F68\u7F6C\u7FA6\u7FA5\u7FA7\u7FDB\u7FDC\u8021\u8164\u8160\u8177\u815C\u8169\u815B\u8162\u8172\u6721\u815E\u8176\u8167\u816F\"],\n[\"dfa1\",\"\u8144\u8161\u821D\u8249\u8244\u8240\u8242\u8245\u84F1\u843F\u8456\u8476\u8479\u848F\u848D\u8465\u8451\u8440\u8486\u8467\u8430\u844D\u847D\u845A\u8459\u8474\u8473\u845D\u8507\u845E\u8437\u843A\u8434\u847A\u8443\u8478\u8432\u8445\u8429\u83D9\u844B\u842F\u8442\u842D\u845F\u8470\u8439\u844E\u844C\u8452\u846F\u84C5\u848E\u843B\u8447\u8436\u8433\u8468\u847E\u8444\u842B\u8460\u8454\u846E\u8450\u870B\u8704\u86F7\u870C\u86FA\u86D6\u86F5\u874D\u86F8\u870E\u8709\u8701\u86F6\u870D\u8705\u88D6\u88CB\u88CD\u88CE\u88DE\u88DB\u88DA\u88CC\u88D0\u8985\u899B\u89DF\u89E5\u89E4\"],\n[\"e040\",\"\u89E1\u89E0\u89E2\u89DC\u89E6\u8A76\u8A86\u8A7F\u8A61\u8A3F\u8A77\u8A82\u8A84\u8A75\u8A83\u8A81\u8A74\u8A7A\u8C3C\u8C4B\u8C4A\u8C65\u8C64\u8C66\u8C86\u8C84\u8C85\u8CCC\u8D68\u8D69\u8D91\u8D8C\u8D8E\u8D8F\u8D8D\u8D93\u8D94\u8D90\u8D92\u8DF0\u8DE0\u8DEC\u8DF1\u8DEE\u8DD0\u8DE9\u8DE3\u8DE2\u8DE7\u8DF2\u8DEB\u8DF4\u8F06\u8EFF\u8F01\u8F00\u8F05\u8F07\u8F08\u8F02\u8F0B\u9052\u903F\"],\n[\"e0a1\",\"\u9044\u9049\u903D\u9110\u910D\u910F\u9111\u9116\u9114\u910B\u910E\u916E\u916F\u9248\u9252\u9230\u923A\u9266\u9233\u9265\u925E\u9283\u922E\u924A\u9246\u926D\u926C\u924F\u9260\u9267\u926F\u9236\u9261\u9270\u9231\u9254\u9263\u9250\u9272\u924E\u9253\u924C\u9256\u9232\u959F\u959C\u959E\u959B\u9692\u9693\u9691\u9697\u96CE\u96FA\u96FD\u96F8\u96F5\u9773\u9777\u9778\u9772\u980F\u980D\u980E\u98AC\u98F6\u98F9\u99AF\u99B2\u99B0\u99B5\u9AAD\u9AAB\u9B5B\u9CEA\u9CED\u9CE7\u9E80\u9EFD\u50E6\u50D4\u50D7\u50E8\u50F3\u50DB\u50EA\u50DD\u50E4\u50D3\u50EC\u50F0\u50EF\u50E3\u50E0\"],\n[\"e140\",\"\u51D8\u5280\u5281\u52E9\u52EB\u5330\u53AC\u5627\u5615\u560C\u5612\u55FC\u560F\u561C\u5601\u5613\u5602\u55FA\u561D\u5604\u55FF\u55F9\u5889\u587C\u5890\u5898\u5886\u5881\u587F\u5874\u588B\u587A\u5887\u5891\u588E\u5876\u5882\u5888\u587B\u5894\u588F\u58FE\u596B\u5ADC\u5AEE\u5AE5\u5AD5\u5AEA\u5ADA\u5AED\u5AEB\u5AF3\u5AE2\u5AE0\u5ADB\u5AEC\u5ADE\u5ADD\u5AD9\u5AE8\u5ADF\u5B77\u5BE0\"],\n[\"e1a1\",\"\u5BE3\u5C63\u5D82\u5D80\u5D7D\u5D86\u5D7A\u5D81\u5D77\u5D8A\u5D89\u5D88\u5D7E\u5D7C\u5D8D\u5D79\u5D7F\u5E58\u5E59\u5E53\u5ED8\u5ED1\u5ED7\u5ECE\u5EDC\u5ED5\u5ED9\u5ED2\u5ED4\u5F44\u5F43\u5F6F\u5FB6\u612C\u6128\u6141\u615E\u6171\u6173\u6152\u6153\u6172\u616C\u6180\u6174\u6154\u617A\u615B\u6165\u613B\u616A\u6161\u6156\u6229\u6227\u622B\u642B\u644D\u645B\u645D\u6474\u6476\u6472\u6473\u647D\u6475\u6466\u64A6\u644E\u6482\u645E\u645C\u644B\u6453\u6460\u6450\u647F\u643F\u646C\u646B\u6459\u6465\u6477\u6573\u65A0\u66A1\u66A0\u669F\u6705\u6704\u6722\u69B1\u69B6\u69C9\"],\n[\"e240\",\"\u69A0\u69CE\u6996\u69B0\u69AC\u69BC\u6991\u6999\u698E\u69A7\u698D\u69A9\u69BE\u69AF\u69BF\u69C4\u69BD\u69A4\u69D4\u69B9\u69CA\u699A\u69CF\u69B3\u6993\u69AA\u69A1\u699E\u69D9\u6997\u6990\u69C2\u69B5\u69A5\u69C6\u6B4A\u6B4D\u6B4B\u6B9E\u6B9F\u6BA0\u6BC3\u6BC4\u6BFE\u6ECE\u6EF5\u6EF1\u6F03\u6F25\u6EF8\u6F37\u6EFB\u6F2E\u6F09\u6F4E\u6F19\u6F1A\u6F27\u6F18\u6F3B\u6F12\u6EED\u6F0A\"],\n[\"e2a1\",\"\u6F36\u6F73\u6EF9\u6EEE\u6F2D\u6F40\u6F30\u6F3C\u6F35\u6EEB\u6F07\u6F0E\u6F43\u6F05\u6EFD\u6EF6\u6F39\u6F1C\u6EFC\u6F3A\u6F1F\u6F0D\u6F1E\u6F08\u6F21\u7187\u7190\u7189\u7180\u7185\u7182\u718F\u717B\u7186\u7181\u7197\u7244\u7253\u7297\u7295\u7293\u7343\u734D\u7351\u734C\u7462\u7473\u7471\u7475\u7472\u7467\u746E\u7500\u7502\u7503\u757D\u7590\u7616\u7608\u760C\u7615\u7611\u760A\u7614\u76B8\u7781\u777C\u7785\u7782\u776E\u7780\u776F\u777E\u7783\u78B2\u78AA\u78B4\u78AD\u78A8\u787E\u78AB\u789E\u78A5\u78A0\u78AC\u78A2\u78A4\u7998\u798A\u798B\u7996\u7995\u7994\u7993\"],\n[\"e340\",\"\u7997\u7988\u7992\u7990\u7A2B\u7A4A\u7A30\u7A2F\u7A28\u7A26\u7AA8\u7AAB\u7AAC\u7AEE\u7B88\u7B9C\u7B8A\u7B91\u7B90\u7B96\u7B8D\u7B8C\u7B9B\u7B8E\u7B85\u7B98\u5284\u7B99\u7BA4\u7B82\u7CBB\u7CBF\u7CBC\u7CBA\u7DA7\u7DB7\u7DC2\u7DA3\u7DAA\u7DC1\u7DC0\u7DC5\u7D9D\u7DCE\u7DC4\u7DC6\u7DCB\u7DCC\u7DAF\u7DB9\u7D96\u7DBC\u7D9F\u7DA6\u7DAE\u7DA9\u7DA1\u7DC9\u7F73\u7FE2\u7FE3\u7FE5\u7FDE\"],\n[\"e3a1\",\"\u8024\u805D\u805C\u8189\u8186\u8183\u8187\u818D\u818C\u818B\u8215\u8497\u84A4\u84A1\u849F\u84BA\u84CE\u84C2\u84AC\u84AE\u84AB\u84B9\u84B4\u84C1\u84CD\u84AA\u849A\u84B1\u84D0\u849D\u84A7\u84BB\u84A2\u8494\u84C7\u84CC\u849B\u84A9\u84AF\u84A8\u84D6\u8498\u84B6\u84CF\u84A0\u84D7\u84D4\u84D2\u84DB\u84B0\u8491\u8661\u8733\u8723\u8728\u876B\u8740\u872E\u871E\u8721\u8719\u871B\u8743\u872C\u8741\u873E\u8746\u8720\u8732\u872A\u872D\u873C\u8712\u873A\u8731\u8735\u8742\u8726\u8727\u8738\u8724\u871A\u8730\u8711\u88F7\u88E7\u88F1\u88F2\u88FA\u88FE\u88EE\u88FC\u88F6\u88FB\"],\n[\"e440\",\"\u88F0\u88EC\u88EB\u899D\u89A1\u899F\u899E\u89E9\u89EB\u89E8\u8AAB\u8A99\u8A8B\u8A92\u8A8F\u8A96\u8C3D\u8C68\u8C69\u8CD5\u8CCF\u8CD7\u8D96\u8E09\u8E02\u8DFF\u8E0D\u8DFD\u8E0A\u8E03\u8E07\u8E06\u8E05\u8DFE\u8E00\u8E04\u8F10\u8F11\u8F0E\u8F0D\u9123\u911C\u9120\u9122\u911F\u911D\u911A\u9124\u9121\u911B\u917A\u9172\u9179\u9173\u92A5\u92A4\u9276\u929B\u927A\u92A0\u9294\u92AA\u928D\"],\n[\"e4a1\",\"\u92A6\u929A\u92AB\u9279\u9297\u927F\u92A3\u92EE\u928E\u9282\u9295\u92A2\u927D\u9288\u92A1\u928A\u9286\u928C\u9299\u92A7\u927E\u9287\u92A9\u929D\u928B\u922D\u969E\u96A1\u96FF\u9758\u977D\u977A\u977E\u9783\u9780\u9782\u977B\u9784\u9781\u977F\u97CE\u97CD\u9816\u98AD\u98AE\u9902\u9900\u9907\u999D\u999C\u99C3\u99B9\u99BB\u99BA\u99C2\u99BD\u99C7\u9AB1\u9AE3\u9AE7\u9B3E\u9B3F\u9B60\u9B61\u9B5F\u9CF1\u9CF2\u9CF5\u9EA7\u50FF\u5103\u5130\u50F8\u5106\u5107\u50F6\u50FE\u510B\u510C\u50FD\u510A\u528B\u528C\u52F1\u52EF\u5648\u5642\u564C\u5635\u5641\u564A\u5649\u5646\u5658\"],\n[\"e540\",\"\u565A\u5640\u5633\u563D\u562C\u563E\u5638\u562A\u563A\u571A\u58AB\u589D\u58B1\u58A0\u58A3\u58AF\u58AC\u58A5\u58A1\u58FF\u5AFF\u5AF4\u5AFD\u5AF7\u5AF6\u5B03\u5AF8\u5B02\u5AF9\u5B01\u5B07\u5B05\u5B0F\u5C67\u5D99\u5D97\u5D9F\u5D92\u5DA2\u5D93\u5D95\u5DA0\u5D9C\u5DA1\u5D9A\u5D9E\u5E69\u5E5D\u5E60\u5E5C\u7DF3\u5EDB\u5EDE\u5EE1\u5F49\u5FB2\u618B\u6183\u6179\u61B1\u61B0\u61A2\u6189\"],\n[\"e5a1\",\"\u619B\u6193\u61AF\u61AD\u619F\u6192\u61AA\u61A1\u618D\u6166\u61B3\u622D\u646E\u6470\u6496\u64A0\u6485\u6497\u649C\u648F\u648B\u648A\u648C\u64A3\u649F\u6468\u64B1\u6498\u6576\u657A\u6579\u657B\u65B2\u65B3\u66B5\u66B0\u66A9\u66B2\u66B7\u66AA\u66AF\u6A00\u6A06\u6A17\u69E5\u69F8\u6A15\u69F1\u69E4\u6A20\u69FF\u69EC\u69E2\u6A1B\u6A1D\u69FE\u6A27\u69F2\u69EE\u6A14\u69F7\u69E7\u6A40\u6A08\u69E6\u69FB\u6A0D\u69FC\u69EB\u6A09\u6A04\u6A18\u6A25\u6A0F\u69F6\u6A26\u6A07\u69F4\u6A16\u6B51\u6BA5\u6BA3\u6BA2\u6BA6\u6C01\u6C00\u6BFF\u6C02\u6F41\u6F26\u6F7E\u6F87\u6FC6\u6F92\"],\n[\"e640\",\"\u6F8D\u6F89\u6F8C\u6F62\u6F4F\u6F85\u6F5A\u6F96\u6F76\u6F6C\u6F82\u6F55\u6F72\u6F52\u6F50\u6F57\u6F94\u6F93\u6F5D\u6F00\u6F61\u6F6B\u6F7D\u6F67\u6F90\u6F53\u6F8B\u6F69\u6F7F\u6F95\u6F63\u6F77\u6F6A\u6F7B\u71B2\u71AF\u719B\u71B0\u71A0\u719A\u71A9\u71B5\u719D\u71A5\u719E\u71A4\u71A1\u71AA\u719C\u71A7\u71B3\u7298\u729A\u7358\u7352\u735E\u735F\u7360\u735D\u735B\u7361\u735A\u7359\"],\n[\"e6a1\",\"\u7362\u7487\u7489\u748A\u7486\u7481\u747D\u7485\u7488\u747C\u7479\u7508\u7507\u757E\u7625\u761E\u7619\u761D\u761C\u7623\u761A\u7628\u761B\u769C\u769D\u769E\u769B\u778D\u778F\u7789\u7788\u78CD\u78BB\u78CF\u78CC\u78D1\u78CE\u78D4\u78C8\u78C3\u78C4\u78C9\u799A\u79A1\u79A0\u799C\u79A2\u799B\u6B76\u7A39\u7AB2\u7AB4\u7AB3\u7BB7\u7BCB\u7BBE\u7BAC\u7BCE\u7BAF\u7BB9\u7BCA\u7BB5\u7CC5\u7CC8\u7CCC\u7CCB\u7DF7\u7DDB\u7DEA\u7DE7\u7DD7\u7DE1\u7E03\u7DFA\u7DE6\u7DF6\u7DF1\u7DF0\u7DEE\u7DDF\u7F76\u7FAC\u7FB0\u7FAD\u7FED\u7FEB\u7FEA\u7FEC\u7FE6\u7FE8\u8064\u8067\u81A3\u819F\"],\n[\"e740\",\"\u819E\u8195\u81A2\u8199\u8197\u8216\u824F\u8253\u8252\u8250\u824E\u8251\u8524\u853B\u850F\u8500\u8529\u850E\u8509\u850D\u851F\u850A\u8527\u851C\u84FB\u852B\u84FA\u8508\u850C\u84F4\u852A\u84F2\u8515\u84F7\u84EB\u84F3\u84FC\u8512\u84EA\u84E9\u8516\u84FE\u8528\u851D\u852E\u8502\u84FD\u851E\u84F6\u8531\u8526\u84E7\u84E8\u84F0\u84EF\u84F9\u8518\u8520\u8530\u850B\u8519\u852F\u8662\"],\n[\"e7a1\",\"\u8756\u8763\u8764\u8777\u87E1\u8773\u8758\u8754\u875B\u8752\u8761\u875A\u8751\u875E\u876D\u876A\u8750\u874E\u875F\u875D\u876F\u876C\u877A\u876E\u875C\u8765\u874F\u877B\u8775\u8762\u8767\u8769\u885A\u8905\u890C\u8914\u890B\u8917\u8918\u8919\u8906\u8916\u8911\u890E\u8909\u89A2\u89A4\u89A3\u89ED\u89F0\u89EC\u8ACF\u8AC6\u8AB8\u8AD3\u8AD1\u8AD4\u8AD5\u8ABB\u8AD7\u8ABE\u8AC0\u8AC5\u8AD8\u8AC3\u8ABA\u8ABD\u8AD9\u8C3E\u8C4D\u8C8F\u8CE5\u8CDF\u8CD9\u8CE8\u8CDA\u8CDD\u8CE7\u8DA0\u8D9C\u8DA1\u8D9B\u8E20\u8E23\u8E25\u8E24\u8E2E\u8E15\u8E1B\u8E16\u8E11\u8E19\u8E26\u8E27\"],\n[\"e840\",\"\u8E14\u8E12\u8E18\u8E13\u8E1C\u8E17\u8E1A\u8F2C\u8F24\u8F18\u8F1A\u8F20\u8F23\u8F16\u8F17\u9073\u9070\u906F\u9067\u906B\u912F\u912B\u9129\u912A\u9132\u9126\u912E\u9185\u9186\u918A\u9181\u9182\u9184\u9180\u92D0\u92C3\u92C4\u92C0\u92D9\u92B6\u92CF\u92F1\u92DF\u92D8\u92E9\u92D7\u92DD\u92CC\u92EF\u92C2\u92E8\u92CA\u92C8\u92CE\u92E6\u92CD\u92D5\u92C9\u92E0\u92DE\u92E7\u92D1\u92D3\"],\n[\"e8a1\",\"\u92B5\u92E1\u92C6\u92B4\u957C\u95AC\u95AB\u95AE\u95B0\u96A4\u96A2\u96D3\u9705\u9708\u9702\u975A\u978A\u978E\u9788\u97D0\u97CF\u981E\u981D\u9826\u9829\u9828\u9820\u981B\u9827\u98B2\u9908\u98FA\u9911\u9914\u9916\u9917\u9915\u99DC\u99CD\u99CF\u99D3\u99D4\u99CE\u99C9\u99D6\u99D8\u99CB\u99D7\u99CC\u9AB3\u9AEC\u9AEB\u9AF3\u9AF2\u9AF1\u9B46\u9B43\u9B67\u9B74\u9B71\u9B66\u9B76\u9B75\u9B70\u9B68\u9B64\u9B6C\u9CFC\u9CFA\u9CFD\u9CFF\u9CF7\u9D07\u9D00\u9CF9\u9CFB\u9D08\u9D05\u9D04\u9E83\u9ED3\u9F0F\u9F10\u511C\u5113\u5117\u511A\u5111\u51DE\u5334\u53E1\u5670\u5660\u566E\"],\n[\"e940\",\"\u5673\u5666\u5663\u566D\u5672\u565E\u5677\u571C\u571B\u58C8\u58BD\u58C9\u58BF\u58BA\u58C2\u58BC\u58C6\u5B17\u5B19\u5B1B\u5B21\u5B14\u5B13\u5B10\u5B16\u5B28\u5B1A\u5B20\u5B1E\u5BEF\u5DAC\u5DB1\u5DA9\u5DA7\u5DB5\u5DB0\u5DAE\u5DAA\u5DA8\u5DB2\u5DAD\u5DAF\u5DB4\u5E67\u5E68\u5E66\u5E6F\u5EE9\u5EE7\u5EE6\u5EE8\u5EE5\u5F4B\u5FBC\u619D\u61A8\u6196\u61C5\u61B4\u61C6\u61C1\u61CC\u61BA\"],\n[\"e9a1\",\"\u61BF\u61B8\u618C\u64D7\u64D6\u64D0\u64CF\u64C9\u64BD\u6489\u64C3\u64DB\u64F3\u64D9\u6533\u657F\u657C\u65A2\u66C8\u66BE\u66C0\u66CA\u66CB\u66CF\u66BD\u66BB\u66BA\u66CC\u6723\u6A34\u6A66\u6A49\u6A67\u6A32\u6A68\u6A3E\u6A5D\u6A6D\u6A76\u6A5B\u6A51\u6A28\u6A5A\u6A3B\u6A3F\u6A41\u6A6A\u6A64\u6A50\u6A4F\u6A54\u6A6F\u6A69\u6A60\u6A3C\u6A5E\u6A56\u6A55\u6A4D\u6A4E\u6A46\u6B55\u6B54\u6B56\u6BA7\u6BAA\u6BAB\u6BC8\u6BC7\u6C04\u6C03\u6C06\u6FAD\u6FCB\u6FA3\u6FC7\u6FBC\u6FCE\u6FC8\u6F5E\u6FC4\u6FBD\u6F9E\u6FCA\u6FA8\u7004\u6FA5\u6FAE\u6FBA\u6FAC\u6FAA\u6FCF\u6FBF\u6FB8\"],\n[\"ea40\",\"\u6FA2\u6FC9\u6FAB\u6FCD\u6FAF\u6FB2\u6FB0\u71C5\u71C2\u71BF\u71B8\u71D6\u71C0\u71C1\u71CB\u71D4\u71CA\u71C7\u71CF\u71BD\u71D8\u71BC\u71C6\u71DA\u71DB\u729D\u729E\u7369\u7366\u7367\u736C\u7365\u736B\u736A\u747F\u749A\u74A0\u7494\u7492\u7495\u74A1\u750B\u7580\u762F\u762D\u7631\u763D\u7633\u763C\u7635\u7632\u7630\u76BB\u76E6\u779A\u779D\u77A1\u779C\u779B\u77A2\u77A3\u7795\u7799\"],\n[\"eaa1\",\"\u7797\u78DD\u78E9\u78E5\u78EA\u78DE\u78E3\u78DB\u78E1\u78E2\u78ED\u78DF\u78E0\u79A4\u7A44\u7A48\u7A47\u7AB6\u7AB8\u7AB5\u7AB1\u7AB7\u7BDE\u7BE3\u7BE7\u7BDD\u7BD5\u7BE5\u7BDA\u7BE8\u7BF9\u7BD4\u7BEA\u7BE2\u7BDC\u7BEB\u7BD8\u7BDF\u7CD2\u7CD4\u7CD7\u7CD0\u7CD1\u7E12\u7E21\u7E17\u7E0C\u7E1F\u7E20\u7E13\u7E0E\u7E1C\u7E15\u7E1A\u7E22\u7E0B\u7E0F\u7E16\u7E0D\u7E14\u7E25\u7E24\u7F43\u7F7B\u7F7C\u7F7A\u7FB1\u7FEF\u802A\u8029\u806C\u81B1\u81A6\u81AE\u81B9\u81B5\u81AB\u81B0\u81AC\u81B4\u81B2\u81B7\u81A7\u81F2\u8255\u8256\u8257\u8556\u8545\u856B\u854D\u8553\u8561\u8558\"],\n[\"eb40\",\"\u8540\u8546\u8564\u8541\u8562\u8544\u8551\u8547\u8563\u853E\u855B\u8571\u854E\u856E\u8575\u8555\u8567\u8560\u858C\u8566\u855D\u8554\u8565\u856C\u8663\u8665\u8664\u879B\u878F\u8797\u8793\u8792\u8788\u8781\u8796\u8798\u8779\u8787\u87A3\u8785\u8790\u8791\u879D\u8784\u8794\u879C\u879A\u8789\u891E\u8926\u8930\u892D\u892E\u8927\u8931\u8922\u8929\u8923\u892F\u892C\u891F\u89F1\u8AE0\"],\n[\"eba1\",\"\u8AE2\u8AF2\u8AF4\u8AF5\u8ADD\u8B14\u8AE4\u8ADF\u8AF0\u8AC8\u8ADE\u8AE1\u8AE8\u8AFF\u8AEF\u8AFB\u8C91\u8C92\u8C90\u8CF5\u8CEE\u8CF1\u8CF0\u8CF3\u8D6C\u8D6E\u8DA5\u8DA7\u8E33\u8E3E\u8E38\u8E40\u8E45\u8E36\u8E3C\u8E3D\u8E41\u8E30\u8E3F\u8EBD\u8F36\u8F2E\u8F35\u8F32\u8F39\u8F37\u8F34\u9076\u9079\u907B\u9086\u90FA\u9133\u9135\u9136\u9193\u9190\u9191\u918D\u918F\u9327\u931E\u9308\u931F\u9306\u930F\u937A\u9338\u933C\u931B\u9323\u9312\u9301\u9346\u932D\u930E\u930D\u92CB\u931D\u92FA\u9325\u9313\u92F9\u92F7\u9334\u9302\u9324\u92FF\u9329\u9339\u9335\u932A\u9314\u930C\"],\n[\"ec40\",\"\u930B\u92FE\u9309\u9300\u92FB\u9316\u95BC\u95CD\u95BE\u95B9\u95BA\u95B6\u95BF\u95B5\u95BD\u96A9\u96D4\u970B\u9712\u9710\u9799\u9797\u9794\u97F0\u97F8\u9835\u982F\u9832\u9924\u991F\u9927\u9929\u999E\u99EE\u99EC\u99E5\u99E4\u99F0\u99E3\u99EA\u99E9\u99E7\u9AB9\u9ABF\u9AB4\u9ABB\u9AF6\u9AFA\u9AF9\u9AF7\u9B33\u9B80\u9B85\u9B87\u9B7C\u9B7E\u9B7B\u9B82\u9B93\u9B92\u9B90\u9B7A\u9B95\"],\n[\"eca1\",\"\u9B7D\u9B88\u9D25\u9D17\u9D20\u9D1E\u9D14\u9D29\u9D1D\u9D18\u9D22\u9D10\u9D19\u9D1F\u9E88\u9E86\u9E87\u9EAE\u9EAD\u9ED5\u9ED6\u9EFA\u9F12\u9F3D\u5126\u5125\u5122\u5124\u5120\u5129\u52F4\u5693\u568C\u568D\u5686\u5684\u5683\u567E\u5682\u567F\u5681\u58D6\u58D4\u58CF\u58D2\u5B2D\u5B25\u5B32\u5B23\u5B2C\u5B27\u5B26\u5B2F\u5B2E\u5B7B\u5BF1\u5BF2\u5DB7\u5E6C\u5E6A\u5FBE\u5FBB\u61C3\u61B5\u61BC\u61E7\u61E0\u61E5\u61E4\u61E8\u61DE\u64EF\u64E9\u64E3\u64EB\u64E4\u64E8\u6581\u6580\u65B6\u65DA\u66D2\u6A8D\u6A96\u6A81\u6AA5\u6A89\u6A9F\u6A9B\u6AA1\u6A9E\u6A87\u6A93\u6A8E\"],\n[\"ed40\",\"\u6A95\u6A83\u6AA8\u6AA4\u6A91\u6A7F\u6AA6\u6A9A\u6A85\u6A8C\u6A92\u6B5B\u6BAD\u6C09\u6FCC\u6FA9\u6FF4\u6FD4\u6FE3\u6FDC\u6FED\u6FE7\u6FE6\u6FDE\u6FF2\u6FDD\u6FE2\u6FE8\u71E1\u71F1\u71E8\u71F2\u71E4\u71F0\u71E2\u7373\u736E\u736F\u7497\u74B2\u74AB\u7490\u74AA\u74AD\u74B1\u74A5\u74AF\u7510\u7511\u7512\u750F\u7584\u7643\u7648\u7649\u7647\u76A4\u76E9\u77B5\u77AB\u77B2\u77B7\u77B6\"],\n[\"eda1\",\"\u77B4\u77B1\u77A8\u77F0\u78F3\u78FD\u7902\u78FB\u78FC\u78F2\u7905\u78F9\u78FE\u7904\u79AB\u79A8\u7A5C\u7A5B\u7A56\u7A58\u7A54\u7A5A\u7ABE\u7AC0\u7AC1\u7C05\u7C0F\u7BF2\u7C00\u7BFF\u7BFB\u7C0E\u7BF4\u7C0B\u7BF3\u7C02\u7C09\u7C03\u7C01\u7BF8\u7BFD\u7C06\u7BF0\u7BF1\u7C10\u7C0A\u7CE8\u7E2D\u7E3C\u7E42\u7E33\u9848\u7E38\u7E2A\u7E49\u7E40\u7E47\u7E29\u7E4C\u7E30\u7E3B\u7E36\u7E44\u7E3A\u7F45\u7F7F\u7F7E\u7F7D\u7FF4\u7FF2\u802C\u81BB\u81C4\u81CC\u81CA\u81C5\u81C7\u81BC\u81E9\u825B\u825A\u825C\u8583\u8580\u858F\u85A7\u8595\u85A0\u858B\u85A3\u857B\u85A4\u859A\u859E\"],\n[\"ee40\",\"\u8577\u857C\u8589\u85A1\u857A\u8578\u8557\u858E\u8596\u8586\u858D\u8599\u859D\u8581\u85A2\u8582\u8588\u8585\u8579\u8576\u8598\u8590\u859F\u8668\u87BE\u87AA\u87AD\u87C5\u87B0\u87AC\u87B9\u87B5\u87BC\u87AE\u87C9\u87C3\u87C2\u87CC\u87B7\u87AF\u87C4\u87CA\u87B4\u87B6\u87BF\u87B8\u87BD\u87DE\u87B2\u8935\u8933\u893C\u893E\u8941\u8952\u8937\u8942\u89AD\u89AF\u89AE\u89F2\u89F3\u8B1E\"],\n[\"eea1\",\"\u8B18\u8B16\u8B11\u8B05\u8B0B\u8B22\u8B0F\u8B12\u8B15\u8B07\u8B0D\u8B08\u8B06\u8B1C\u8B13\u8B1A\u8C4F\u8C70\u8C72\u8C71\u8C6F\u8C95\u8C94\u8CF9\u8D6F\u8E4E\u8E4D\u8E53\u8E50\u8E4C\u8E47\u8F43\u8F40\u9085\u907E\u9138\u919A\u91A2\u919B\u9199\u919F\u91A1\u919D\u91A0\u93A1\u9383\u93AF\u9364\u9356\u9347\u937C\u9358\u935C\u9376\u9349\u9350\u9351\u9360\u936D\u938F\u934C\u936A\u9379\u9357\u9355\u9352\u934F\u9371\u9377\u937B\u9361\u935E\u9363\u9367\u9380\u934E\u9359\u95C7\u95C0\u95C9\u95C3\u95C5\u95B7\u96AE\u96B0\u96AC\u9720\u971F\u9718\u971D\u9719\u979A\u97A1\u979C\"],\n[\"ef40\",\"\u979E\u979D\u97D5\u97D4\u97F1\u9841\u9844\u984A\u9849\u9845\u9843\u9925\u992B\u992C\u992A\u9933\u9932\u992F\u992D\u9931\u9930\u9998\u99A3\u99A1\u9A02\u99FA\u99F4\u99F7\u99F9\u99F8\u99F6\u99FB\u99FD\u99FE\u99FC\u9A03\u9ABE\u9AFE\u9AFD\u9B01\u9AFC\u9B48\u9B9A\u9BA8\u9B9E\u9B9B\u9BA6\u9BA1\u9BA5\u9BA4\u9B86\u9BA2\u9BA0\u9BAF\u9D33\u9D41\u9D67\u9D36\u9D2E\u9D2F\u9D31\u9D38\u9D30\"],\n[\"efa1\",\"\u9D45\u9D42\u9D43\u9D3E\u9D37\u9D40\u9D3D\u7FF5\u9D2D\u9E8A\u9E89\u9E8D\u9EB0\u9EC8\u9EDA\u9EFB\u9EFF\u9F24\u9F23\u9F22\u9F54\u9FA0\u5131\u512D\u512E\u5698\u569C\u5697\u569A\u569D\u5699\u5970\u5B3C\u5C69\u5C6A\u5DC0\u5E6D\u5E6E\u61D8\u61DF\u61ED\u61EE\u61F1\u61EA\u61F0\u61EB\u61D6\u61E9\u64FF\u6504\u64FD\u64F8\u6501\u6503\u64FC\u6594\u65DB\u66DA\u66DB\u66D8\u6AC5\u6AB9\u6ABD\u6AE1\u6AC6\u6ABA\u6AB6\u6AB7\u6AC7\u6AB4\u6AAD\u6B5E\u6BC9\u6C0B\u7007\u700C\u700D\u7001\u7005\u7014\u700E\u6FFF\u7000\u6FFB\u7026\u6FFC\u6FF7\u700A\u7201\u71FF\u71F9\u7203\u71FD\u7376\"],\n[\"f040\",\"\u74B8\u74C0\u74B5\u74C1\u74BE\u74B6\u74BB\u74C2\u7514\u7513\u765C\u7664\u7659\u7650\u7653\u7657\u765A\u76A6\u76BD\u76EC\u77C2\u77BA\u78FF\u790C\u7913\u7914\u7909\u7910\u7912\u7911\u79AD\u79AC\u7A5F\u7C1C\u7C29\u7C19\u7C20\u7C1F\u7C2D\u7C1D\u7C26\u7C28\u7C22\u7C25\u7C30\u7E5C\u7E50\u7E56\u7E63\u7E58\u7E62\u7E5F\u7E51\u7E60\u7E57\u7E53\u7FB5\u7FB3\u7FF7\u7FF8\u8075\u81D1\u81D2\"],\n[\"f0a1\",\"\u81D0\u825F\u825E\u85B4\u85C6\u85C0\u85C3\u85C2\u85B3\u85B5\u85BD\u85C7\u85C4\u85BF\u85CB\u85CE\u85C8\u85C5\u85B1\u85B6\u85D2\u8624\u85B8\u85B7\u85BE\u8669\u87E7\u87E6\u87E2\u87DB\u87EB\u87EA\u87E5\u87DF\u87F3\u87E4\u87D4\u87DC\u87D3\u87ED\u87D8\u87E3\u87A4\u87D7\u87D9\u8801\u87F4\u87E8\u87DD\u8953\u894B\u894F\u894C\u8946\u8950\u8951\u8949\u8B2A\u8B27\u8B23\u8B33\u8B30\u8B35\u8B47\u8B2F\u8B3C\u8B3E\u8B31\u8B25\u8B37\u8B26\u8B36\u8B2E\u8B24\u8B3B\u8B3D\u8B3A\u8C42\u8C75\u8C99\u8C98\u8C97\u8CFE\u8D04\u8D02\u8D00\u8E5C\u8E62\u8E60\u8E57\u8E56\u8E5E\u8E65\u8E67\"],\n[\"f140\",\"\u8E5B\u8E5A\u8E61\u8E5D\u8E69\u8E54\u8F46\u8F47\u8F48\u8F4B\u9128\u913A\u913B\u913E\u91A8\u91A5\u91A7\u91AF\u91AA\u93B5\u938C\u9392\u93B7\u939B\u939D\u9389\u93A7\u938E\u93AA\u939E\u93A6\u9395\u9388\u9399\u939F\u938D\u93B1\u9391\u93B2\u93A4\u93A8\u93B4\u93A3\u93A5\u95D2\u95D3\u95D1\u96B3\u96D7\u96DA\u5DC2\u96DF\u96D8\u96DD\u9723\u9722\u9725\u97AC\u97AE\u97A8\u97AB\u97A4\u97AA\"],\n[\"f1a1\",\"\u97A2\u97A5\u97D7\u97D9\u97D6\u97D8\u97FA\u9850\u9851\u9852\u98B8\u9941\u993C\u993A\u9A0F\u9A0B\u9A09\u9A0D\u9A04\u9A11\u9A0A\u9A05\u9A07\u9A06\u9AC0\u9ADC\u9B08\u9B04\u9B05\u9B29\u9B35\u9B4A\u9B4C\u9B4B\u9BC7\u9BC6\u9BC3\u9BBF\u9BC1\u9BB5\u9BB8\u9BD3\u9BB6\u9BC4\u9BB9\u9BBD\u9D5C\u9D53\u9D4F\u9D4A\u9D5B\u9D4B\u9D59\u9D56\u9D4C\u9D57\u9D52\u9D54\u9D5F\u9D58\u9D5A\u9E8E\u9E8C\u9EDF\u9F01\u9F00\u9F16\u9F25\u9F2B\u9F2A\u9F29\u9F28\u9F4C\u9F55\u5134\u5135\u5296\u52F7\u53B4\u56AB\u56AD\u56A6\u56A7\u56AA\u56AC\u58DA\u58DD\u58DB\u5912\u5B3D\u5B3E\u5B3F\u5DC3\u5E70\"],\n[\"f240\",\"\u5FBF\u61FB\u6507\u6510\u650D\u6509\u650C\u650E\u6584\u65DE\u65DD\u66DE\u6AE7\u6AE0\u6ACC\u6AD1\u6AD9\u6ACB\u6ADF\u6ADC\u6AD0\u6AEB\u6ACF\u6ACD\u6ADE\u6B60\u6BB0\u6C0C\u7019\u7027\u7020\u7016\u702B\u7021\u7022\u7023\u7029\u7017\u7024\u701C\u702A\u720C\u720A\u7207\u7202\u7205\u72A5\u72A6\u72A4\u72A3\u72A1\u74CB\u74C5\u74B7\u74C3\u7516\u7660\u77C9\u77CA\u77C4\u77F1\u791D\u791B\"],\n[\"f2a1\",\"\u7921\u791C\u7917\u791E\u79B0\u7A67\u7A68\u7C33\u7C3C\u7C39\u7C2C\u7C3B\u7CEC\u7CEA\u7E76\u7E75\u7E78\u7E70\u7E77\u7E6F\u7E7A\u7E72\u7E74\u7E68\u7F4B\u7F4A\u7F83\u7F86\u7FB7\u7FFD\u7FFE\u8078\u81D7\u81D5\u8264\u8261\u8263\u85EB\u85F1\u85ED\u85D9\u85E1\u85E8\u85DA\u85D7\u85EC\u85F2\u85F8\u85D8\u85DF\u85E3\u85DC\u85D1\u85F0\u85E6\u85EF\u85DE\u85E2\u8800\u87FA\u8803\u87F6\u87F7\u8809\u880C\u880B\u8806\u87FC\u8808\u87FF\u880A\u8802\u8962\u895A\u895B\u8957\u8961\u895C\u8958\u895D\u8959\u8988\u89B7\u89B6\u89F6\u8B50\u8B48\u8B4A\u8B40\u8B53\u8B56\u8B54\u8B4B\u8B55\"],\n[\"f340\",\"\u8B51\u8B42\u8B52\u8B57\u8C43\u8C77\u8C76\u8C9A\u8D06\u8D07\u8D09\u8DAC\u8DAA\u8DAD\u8DAB\u8E6D\u8E78\u8E73\u8E6A\u8E6F\u8E7B\u8EC2\u8F52\u8F51\u8F4F\u8F50\u8F53\u8FB4\u9140\u913F\u91B0\u91AD\u93DE\u93C7\u93CF\u93C2\u93DA\u93D0\u93F9\u93EC\u93CC\u93D9\u93A9\u93E6\u93CA\u93D4\u93EE\u93E3\u93D5\u93C4\u93CE\u93C0\u93D2\u93E7\u957D\u95DA\u95DB\u96E1\u9729\u972B\u972C\u9728\u9726\"],\n[\"f3a1\",\"\u97B3\u97B7\u97B6\u97DD\u97DE\u97DF\u985C\u9859\u985D\u9857\u98BF\u98BD\u98BB\u98BE\u9948\u9947\u9943\u99A6\u99A7\u9A1A\u9A15\u9A25\u9A1D\u9A24\u9A1B\u9A22\u9A20\u9A27\u9A23\u9A1E\u9A1C\u9A14\u9AC2\u9B0B\u9B0A\u9B0E\u9B0C\u9B37\u9BEA\u9BEB\u9BE0\u9BDE\u9BE4\u9BE6\u9BE2\u9BF0\u9BD4\u9BD7\u9BEC\u9BDC\u9BD9\u9BE5\u9BD5\u9BE1\u9BDA\u9D77\u9D81\u9D8A\u9D84\u9D88\u9D71\u9D80\u9D78\u9D86\u9D8B\u9D8C\u9D7D\u9D6B\u9D74\u9D75\u9D70\u9D69\u9D85\u9D73\u9D7B\u9D82\u9D6F\u9D79\u9D7F\u9D87\u9D68\u9E94\u9E91\u9EC0\u9EFC\u9F2D\u9F40\u9F41\u9F4D\u9F56\u9F57\u9F58\u5337\u56B2\"],\n[\"f440\",\"\u56B5\u56B3\u58E3\u5B45\u5DC6\u5DC7\u5EEE\u5EEF\u5FC0\u5FC1\u61F9\u6517\u6516\u6515\u6513\u65DF\u66E8\u66E3\u66E4\u6AF3\u6AF0\u6AEA\u6AE8\u6AF9\u6AF1\u6AEE\u6AEF\u703C\u7035\u702F\u7037\u7034\u7031\u7042\u7038\u703F\u703A\u7039\u7040\u703B\u7033\u7041\u7213\u7214\u72A8\u737D\u737C\u74BA\u76AB\u76AA\u76BE\u76ED\u77CC\u77CE\u77CF\u77CD\u77F2\u7925\u7923\u7927\u7928\u7924\u7929\"],\n[\"f4a1\",\"\u79B2\u7A6E\u7A6C\u7A6D\u7AF7\u7C49\u7C48\u7C4A\u7C47\u7C45\u7CEE\u7E7B\u7E7E\u7E81\u7E80\u7FBA\u7FFF\u8079\u81DB\u81D9\u820B\u8268\u8269\u8622\u85FF\u8601\u85FE\u861B\u8600\u85F6\u8604\u8609\u8605\u860C\u85FD\u8819\u8810\u8811\u8817\u8813\u8816\u8963\u8966\u89B9\u89F7\u8B60\u8B6A\u8B5D\u8B68\u8B63\u8B65\u8B67\u8B6D\u8DAE\u8E86\u8E88\u8E84\u8F59\u8F56\u8F57\u8F55\u8F58\u8F5A\u908D\u9143\u9141\u91B7\u91B5\u91B2\u91B3\u940B\u9413\u93FB\u9420\u940F\u9414\u93FE\u9415\u9410\u9428\u9419\u940D\u93F5\u9400\u93F7\u9407\u940E\u9416\u9412\u93FA\u9409\u93F8\u940A\u93FF\"],\n[\"f540\",\"\u93FC\u940C\u93F6\u9411\u9406\u95DE\u95E0\u95DF\u972E\u972F\u97B9\u97BB\u97FD\u97FE\u9860\u9862\u9863\u985F\u98C1\u98C2\u9950\u994E\u9959\u994C\u994B\u9953\u9A32\u9A34\u9A31\u9A2C\u9A2A\u9A36\u9A29\u9A2E\u9A38\u9A2D\u9AC7\u9ACA\u9AC6\u9B10\u9B12\u9B11\u9C0B\u9C08\u9BF7\u9C05\u9C12\u9BF8\u9C40\u9C07\u9C0E\u9C06\u9C17\u9C14\u9C09\u9D9F\u9D99\u9DA4\u9D9D\u9D92\u9D98\u9D90\u9D9B\"],\n[\"f5a1\",\"\u9DA0\u9D94\u9D9C\u9DAA\u9D97\u9DA1\u9D9A\u9DA2\u9DA8\u9D9E\u9DA3\u9DBF\u9DA9\u9D96\u9DA6\u9DA7\u9E99\u9E9B\u9E9A\u9EE5\u9EE4\u9EE7\u9EE6\u9F30\u9F2E\u9F5B\u9F60\u9F5E\u9F5D\u9F59\u9F91\u513A\u5139\u5298\u5297\u56C3\u56BD\u56BE\u5B48\u5B47\u5DCB\u5DCF\u5EF1\u61FD\u651B\u6B02\u6AFC\u6B03\u6AF8\u6B00\u7043\u7044\u704A\u7048\u7049\u7045\u7046\u721D\u721A\u7219\u737E\u7517\u766A\u77D0\u792D\u7931\u792F\u7C54\u7C53\u7CF2\u7E8A\u7E87\u7E88\u7E8B\u7E86\u7E8D\u7F4D\u7FBB\u8030\u81DD\u8618\u862A\u8626\u861F\u8623\u861C\u8619\u8627\u862E\u8621\u8620\u8629\u861E\u8625\"],\n[\"f640\",\"\u8829\u881D\u881B\u8820\u8824\u881C\u882B\u884A\u896D\u8969\u896E\u896B\u89FA\u8B79\u8B78\u8B45\u8B7A\u8B7B\u8D10\u8D14\u8DAF\u8E8E\u8E8C\u8F5E\u8F5B\u8F5D\u9146\u9144\u9145\u91B9\u943F\u943B\u9436\u9429\u943D\u943C\u9430\u9439\u942A\u9437\u942C\u9440\u9431\u95E5\u95E4\u95E3\u9735\u973A\u97BF\u97E1\u9864\u98C9\u98C6\u98C0\u9958\u9956\u9A39\u9A3D\u9A46\u9A44\u9A42\u9A41\u9A3A\"],\n[\"f6a1\",\"\u9A3F\u9ACD\u9B15\u9B17\u9B18\u9B16\u9B3A\u9B52\u9C2B\u9C1D\u9C1C\u9C2C\u9C23\u9C28\u9C29\u9C24\u9C21\u9DB7\u9DB6\u9DBC\u9DC1\u9DC7\u9DCA\u9DCF\u9DBE\u9DC5\u9DC3\u9DBB\u9DB5\u9DCE\u9DB9\u9DBA\u9DAC\u9DC8\u9DB1\u9DAD\u9DCC\u9DB3\u9DCD\u9DB2\u9E7A\u9E9C\u9EEB\u9EEE\u9EED\u9F1B\u9F18\u9F1A\u9F31\u9F4E\u9F65\u9F64\u9F92\u4EB9\u56C6\u56C5\u56CB\u5971\u5B4B\u5B4C\u5DD5\u5DD1\u5EF2\u6521\u6520\u6526\u6522\u6B0B\u6B08\u6B09\u6C0D\u7055\u7056\u7057\u7052\u721E\u721F\u72A9\u737F\u74D8\u74D5\u74D9\u74D7\u766D\u76AD\u7935\u79B4\u7A70\u7A71\u7C57\u7C5C\u7C59\u7C5B\u7C5A\"],\n[\"f740\",\"\u7CF4\u7CF1\u7E91\u7F4F\u7F87\u81DE\u826B\u8634\u8635\u8633\u862C\u8632\u8636\u882C\u8828\u8826\u882A\u8825\u8971\u89BF\u89BE\u89FB\u8B7E\u8B84\u8B82\u8B86\u8B85\u8B7F\u8D15\u8E95\u8E94\u8E9A\u8E92\u8E90\u8E96\u8E97\u8F60\u8F62\u9147\u944C\u9450\u944A\u944B\u944F\u9447\u9445\u9448\u9449\u9446\u973F\u97E3\u986A\u9869\u98CB\u9954\u995B\u9A4E\u9A53\u9A54\u9A4C\u9A4F\u9A48\u9A4A\"],\n[\"f7a1\",\"\u9A49\u9A52\u9A50\u9AD0\u9B19\u9B2B\u9B3B\u9B56\u9B55\u9C46\u9C48\u9C3F\u9C44\u9C39\u9C33\u9C41\u9C3C\u9C37\u9C34\u9C32\u9C3D\u9C36\u9DDB\u9DD2\u9DDE\u9DDA\u9DCB\u9DD0\u9DDC\u9DD1\u9DDF\u9DE9\u9DD9\u9DD8\u9DD6\u9DF5\u9DD5\u9DDD\u9EB6\u9EF0\u9F35\u9F33\u9F32\u9F42\u9F6B\u9F95\u9FA2\u513D\u5299\u58E8\u58E7\u5972\u5B4D\u5DD8\u882F\u5F4F\u6201\u6203\u6204\u6529\u6525\u6596\u66EB\u6B11\u6B12\u6B0F\u6BCA\u705B\u705A\u7222\u7382\u7381\u7383\u7670\u77D4\u7C67\u7C66\u7E95\u826C\u863A\u8640\u8639\u863C\u8631\u863B\u863E\u8830\u8832\u882E\u8833\u8976\u8974\u8973\u89FE\"],\n[\"f840\",\"\u8B8C\u8B8E\u8B8B\u8B88\u8C45\u8D19\u8E98\u8F64\u8F63\u91BC\u9462\u9455\u945D\u9457\u945E\u97C4\u97C5\u9800\u9A56\u9A59\u9B1E\u9B1F\u9B20\u9C52\u9C58\u9C50\u9C4A\u9C4D\u9C4B\u9C55\u9C59\u9C4C\u9C4E\u9DFB\u9DF7\u9DEF\u9DE3\u9DEB\u9DF8\u9DE4\u9DF6\u9DE1\u9DEE\u9DE6\u9DF2\u9DF0\u9DE2\u9DEC\u9DF4\u9DF3\u9DE8\u9DED\u9EC2\u9ED0\u9EF2\u9EF3\u9F06\u9F1C\u9F38\u9F37\u9F36\u9F43\u9F4F\"],\n[\"f8a1\",\"\u9F71\u9F70\u9F6E\u9F6F\u56D3\u56CD\u5B4E\u5C6D\u652D\u66ED\u66EE\u6B13\u705F\u7061\u705D\u7060\u7223\u74DB\u74E5\u77D5\u7938\u79B7\u79B6\u7C6A\u7E97\u7F89\u826D\u8643\u8838\u8837\u8835\u884B\u8B94\u8B95\u8E9E\u8E9F\u8EA0\u8E9D\u91BE\u91BD\u91C2\u946B\u9468\u9469\u96E5\u9746\u9743\u9747\u97C7\u97E5\u9A5E\u9AD5\u9B59\u9C63\u9C67\u9C66\u9C62\u9C5E\u9C60\u9E02\u9DFE\u9E07\u9E03\u9E06\u9E05\u9E00\u9E01\u9E09\u9DFF\u9DFD\u9E04\u9EA0\u9F1E\u9F46\u9F74\u9F75\u9F76\u56D4\u652E\u65B8\u6B18\u6B19\u6B17\u6B1A\u7062\u7226\u72AA\u77D8\u77D9\u7939\u7C69\u7C6B\u7CF6\u7E9A\"],\n[\"f940\",\"\u7E98\u7E9B\u7E99\u81E0\u81E1\u8646\u8647\u8648\u8979\u897A\u897C\u897B\u89FF\u8B98\u8B99\u8EA5\u8EA4\u8EA3\u946E\u946D\u946F\u9471\u9473\u9749\u9872\u995F\u9C68\u9C6E\u9C6D\u9E0B\u9E0D\u9E10\u9E0F\u9E12\u9E11\u9EA1\u9EF5\u9F09\u9F47\u9F78\u9F7B\u9F7A\u9F79\u571E\u7066\u7C6F\u883C\u8DB2\u8EA6\u91C3\u9474\u9478\u9476\u9475\u9A60\u9C74\u9C73\u9C71\u9C75\u9E14\u9E13\u9EF6\u9F0A\"],\n[\"f9a1\",\"\u9FA4\u7068\u7065\u7CF7\u866A\u883E\u883D\u883F\u8B9E\u8C9C\u8EA9\u8EC9\u974B\u9873\u9874\u98CC\u9961\u99AB\u9A64\u9A66\u9A67\u9B24\u9E15\u9E17\u9F48\u6207\u6B1E\u7227\u864C\u8EA8\u9482\u9480\u9481\u9A69\u9A68\u9B2E\u9E19\u7229\u864B\u8B9F\u9483\u9C79\u9EB7\u7675\u9A6B\u9C7A\u9E1D\u7069\u706A\u9EA4\u9F7E\u9F49\u9F98\u7881\u92B9\u88CF\u58BB\u6052\u7CA7\u5AFA\u2554\u2566\u2557\u2560\u256C\u2563\u255A\u2569\u255D\u2552\u2564\u2555\u255E\u256A\u2561\u2558\u2567\u255B\u2553\u2565\u2556\u255F\u256B\u2562\u2559\u2568\u255C\u2551\u2550\u256D\u256E\u2570\u256F\u2593\"]\n]\n", "[\n[\"8740\",\"\u43F0\u4C32\u4603\u45A6\u4578\uD85C\uDE67\u4D77\u45B3\uD85F\uDCB1\u4CE2\uD85F\uDCC5\u3B95\u4736\u4744\u4C47\u4C40\uD850\uDEBF\uD84D\uDE17\uD85C\uDF52\uD85B\uDE8B\uD85C\uDCD2\u4C57\uD868\uDF51\u474F\u45DA\u4C85\uD85F\uDC6C\u4D07\u4AA4\u46A1\uD85A\uDF23\u7225\uD856\uDE54\uD846\uDE63\uD84F\uDE06\uD84F\uDF61\u664D\u56FB\"],\n[\"8767\",\"\u7D95\u591D\uD862\uDFB9\u3DF4\u9734\uD85E\uDFEF\u5BDB\uD847\uDD5E\u5AA4\u3625\uD867\uDEB0\u5AD1\u5BB7\u5CFC\u676E\u8593\uD866\uDD45\u7461\u749D\u3875\uD847\uDD53\uD84D\uDE9E\uD858\uDC21\u3EEC\"],\n[\"87a1\",\"\uD856\uDCDE\u3AF5\u7AFC\u9F97\uD850\uDD61\uD862\uDD0D\uD84C\uDDEA\uD842\uDE8A\uD84C\uDE5E\u430A\u8484\u9F96\u942F\u4930\u8613\u5896\u974A\u9218\u79D0\u7A32\u6660\u6A29\u889D\u744C\u7BC5\u6782\u7A2C\u524F\u9046\u34E6\u73C4\uD857\uDDB9\u74C6\u9FC7\u57B3\u492F\u544C\u4131\uD84D\uDE8E\u5818\u7A72\uD85E\uDF65\u8B8F\u46AE\uD85B\uDE88\u4181\uD857\uDD99\u7BAE\uD849\uDCBC\u9FC8\uD849\uDCC1\uD849\uDCC9\uD849\uDCCC\u9FC9\u8504\uD84D\uDDBB\u40B4\u9FCA\u44E1\uD86B\uDDFF\u62C1\u706E\u9FCB\"],\n[\"8840\",\"\u31C0\",4,\"\uD840\uDD0C\u31C5\uD840\uDCD1\uD840\uDCCD\u31C6\u31C7\uD840\uDCCB\uD847\uDFE8\u31C8\uD840\uDCCA\u31C9\u31CA\u31CB\u31CC\uD840\uDD0E\u31CD\u31CE\u0100\u00C1\u01CD\u00C0\u0112\u00C9\u011A\u00C8\u014C\u00D3\u01D1\u00D2\u0FFF\u00CA\u0304\u1EBE\u0FFF\u00CA\u030C\u1EC0\u00CA\u0101\u00E1\u01CE\u00E0\u0251\u0113\u00E9\u011B\u00E8\u012B\u00ED\u01D0\u00EC\u014D\u00F3\u01D2\u00F2\u016B\u00FA\u01D4\u00F9\u01D6\u01D8\u01DA\"],\n[\"88a1\",\"\u01DC\u00FC\u0FFF\u00EA\u0304\u1EBF\u0FFF\u00EA\u030C\u1EC1\u00EA\u0261\u23DA\u23DB\"],\n[\"8940\",\"\uD868\uDFA9\uD844\uDD45\"],\n[\"8943\",\"\u650A\"],\n[\"8946\",\"\u4E3D\u6EDD\u9D4E\u91DF\"],\n[\"894c\",\"\uD85D\uDF35\u6491\u4F1A\u4F28\u4FA8\u5156\u5174\u519C\u51E4\u52A1\u52A8\u533B\u534E\u53D1\u53D8\u56E2\u58F0\u5904\u5907\u5932\u5934\u5B66\u5B9E\u5B9F\u5C9A\u5E86\u603B\u6589\u67FE\u6804\u6865\u6D4E\u70BC\u7535\u7EA4\u7EAC\u7EBA\u7EC7\u7ECF\u7EDF\u7F06\u7F37\u827A\u82CF\u836F\u89C6\u8BBE\u8BE2\u8F66\u8F67\u8F6E\"],\n[\"89a1\",\"\u7411\u7CFC\u7DCD\u6946\u7AC9\u5227\"],\n[\"89ab\",\"\u918C\u78B8\u915E\u80BC\"],\n[\"89b0\",\"\u8D0B\u80F6\uD842\uDDE7\"],\n[\"89b5\",\"\u809F\u9EC7\u4CCD\u9DC9\u9E0C\u4C3E\uD867\uDDF6\uD85C\uDC0E\u9E0A\uD868\uDD33\u35C1\"],\n[\"89c1\",\"\u6E9A\u823E\u7519\"],\n[\"89c5\",\"\u4911\u9A6C\u9A8F\u9F99\u7987\uD861\uDC6C\uD847\uDDCA\uD841\uDDD0\uD84A\uDEE6\u4E24\u4E81\u4E80\u4E87\u4EBF\u4EEB\u4F37\u344C\u4FBD\u3E48\u5003\u5088\u347D\u3493\u34A5\u5186\u5905\u51DB\u51FC\u5205\u4E89\u5279\u5290\u5327\u35C7\u53A9\u3551\u53B0\u3553\u53C2\u5423\u356D\u3572\u3681\u5493\u54A3\u54B4\u54B9\u54D0\u54EF\u5518\u5523\u5528\u3598\u553F\u35A5\u35BF\u55D7\u35C5\"],\n[\"8a40\",\"\uD85F\uDD84\u5525\"],\n[\"8a43\",\"\uD843\uDC42\uD843\uDD15\uD854\uDD2B\u5590\uD84B\uDCC6\u39EC\uD840\uDF41\u8E46\uD853\uDDB8\uD865\uDCE5\u4053\uD860\uDCBE\u777A\uD84B\uDC38\u3A34\u47D5\uD860\uDD5D\uD85A\uDDF2\uD853\uDDEA\u64DD\uD843\uDD7C\uD843\uDFB4\uD843\uDCD5\uD844\uDCF4\u648D\u8E7E\uD843\uDE96\uD843\uDC0B\uD843\uDF64\uD84B\uDCA9\uD860\uDE56\uD851\uDCD3\"],\n[\"8a64\",\"\uD843\uDD46\uD866\uDE4D\uD860\uDCE9\u47F4\uD853\uDEA7\uD84B\uDCC2\u9AB2\u3A67\uD865\uDDF4\u3FED\u3506\uD854\uDEC7\uD865\uDFD4\uD85E\uDCC8\uD84B\uDD44\u9D6E\u9815\"],\n[\"8a76\",\"\u43D9\uD858\uDCA5\u64B4\u54E3\uD84B\uDD4C\uD84A\uDFCA\uD844\uDC77\u39FB\uD844\uDC6F\"],\n[\"8aa1\",\"\uD859\uDEDA\uD859\uDF16\uD85E\uDDA0\u64EA\uD854\uDC52\uD843\uDC43\u8E68\uD848\uDDA1\uD862\uDF4C\uD841\uDF31\"],\n[\"8aac\",\"\u480B\uD840\uDDA9\u3FFA\u5873\uD84B\uDD8D\"],\n[\"8ab2\",\"\uD851\uDDC8\uD841\uDCFC\uD858\uDC97\uD843\uDF4C\uD843\uDD96\u5579\u40BB\u43BA\"],\n[\"8abb\",\"\u4AB4\uD84A\uDE66\uD844\uDC9D\u81AA\u98F5\uD843\uDD9C\u6379\u39FE\uD849\uDF75\u8DC0\u56A1\u647C\u3E43\"],\n[\"8ac9\",\"\uD869\uDE01\uD843\uDE09\uD84A\uDECF\uD84B\uDCC9\"],\n[\"8ace\",\"\uD844\uDCC8\uD84E\uDDC2\u3992\u3A06\uD860\uDE9B\u3578\uD857\uDE49\uD848\uDCC7\u5652\uD843\uDF31\uD84B\uDCB2\uD865\uDF20\u34BC\u6C3D\uD853\uDE3B\"],\n[\"8adf\",\"\uD85D\uDD74\uD84B\uDE8B\uD848\uDE08\uD869\uDE5B\uD863\uDCCD\uD843\uDE7A\uD843\uDC34\uD85A\uDC1C\u7F93\uD844\uDCCF\uD84A\uDC03\uD84A\uDD39\u35FB\uD854\uDDE3\uD843\uDE8C\uD843\uDF8D\uD843\uDEAA\u3F93\uD843\uDF30\uD843\uDD47\uD844\uDD4F\uD843\uDE4C\"],\n[\"8af6\",\"\uD843\uDEAB\uD842\uDFA9\uD843\uDD48\uD844\uDCC0\uD844\uDD3D\u3FF9\uD849\uDE96\u6432\uD843\uDFAD\"],\n[\"8b40\",\"\uD84C\uDFF4\uD85D\uDE39\uD84A\uDFCE\uD843\uDD7E\uD843\uDD7F\uD84B\uDC51\uD84B\uDC55\u3A18\uD843\uDE98\uD844\uDCC7\uD843\uDF2E\uD869\uDE32\uD85A\uDF50\uD863\uDCD2\uD863\uDD99\uD863\uDCCA\u95AA\u54CC\u82C4\u55B9\"],\n[\"8b55\",\"\uD867\uDEC3\u9C26\u9AB6\uD85D\uDF5E\uD84B\uDDEE\u7140\u816D\u80EC\u5C1C\uD859\uDD72\u8134\u3797\u535F\uD860\uDCBD\u91B6\uD843\uDEFA\uD843\uDE0F\uD843\uDE77\uD843\uDEFB\u35DD\uD853\uDDEB\u3609\uD843\uDCD6\u56AF\uD849\uDFB5\uD844\uDCC9\uD843\uDE10\uD843\uDE78\uD844\uDC78\uD844\uDD48\uD860\uDE07\uD845\uDC55\uD843\uDE79\uD853\uDE50\uD84B\uDDA4\u5A54\uD844\uDC1D\uD844\uDC1E\uD844\uDCF5\uD844\uDCF6\u579C\uD843\uDE11\"],\n[\"8ba1\",\"\uD85D\uDE94\uD860\uDECD\uD843\uDFB5\uD843\uDE7B\uD854\uDD7E\u3703\uD843\uDFB6\uD844\uDD80\uD854\uDED8\uD868\uDEBD\uD852\uDDDA\uD846\uDC3A\uD850\uDD77\uD860\uDE7C\u5899\u5268\u361A\uD855\uDF3D\u7BB2\u5B68\u4800\u4B2C\u9F27\u49E7\u9C1F\u9B8D\uD856\uDF74\uD84C\uDD3D\u55FB\u35F2\u5689\u4E28\u5902\uD846\uDFC1\uD87E\uDC78\u9751\uD840\uDC86\u4E5B\u4EBB\u353E\u5C23\u5F51\u5FC4\u38FA\u624C\u6535\u6B7A\u6C35\u6C3A\u706C\u722B\u4E2C\u72AD\uD852\uDCE9\u7F52\u793B\u7CF9\u7F53\uD858\uDE6A\u34C1\"],\n[\"8bde\",\"\uD858\uDF4B\u8002\u8080\uD859\uDE12\uD85A\uDD51\u535D\u8864\u89C1\uD85E\uDCB2\u8BA0\u8D1D\u9485\u9578\u957F\u95E8\uD863\uDE0F\u97E6\u9875\u98CE\u98DE\u9963\uD866\uDC10\u9C7C\u9E1F\u9EC4\u6B6F\uF907\u4E37\uD840\uDC87\u961D\u6237\u94A2\"],\n[\"8c40\",\"\u503B\u6DFE\uD867\uDC73\u9FA6\u3DC9\u888F\uD850\uDD4E\u7077\u5CF5\u4B20\uD854\uDDCD\u3559\uD857\uDD30\u6122\uD862\uDE32\u8FA7\u91F6\u7191\u6719\u73BA\uD84C\uDE81\uD868\uDD07\u3C8B\uD846\uDD80\u4B10\u78E4\u7402\u51AE\uD861\uDF0F\u4009\u6A63\uD868\uDEBA\u4223\u860F\uD842\uDE6F\u7A2A\uD866\uDD47\uD862\uDEEA\u9755\u704D\u5324\uD848\uDC7E\u93F4\u76D9\uD862\uDDE3\u9FA7\u77DD\u4EA3\u4FF0\u50BC\u4E2F\u4F17\u9FA8\u5434\u7D8B\u5892\u58D0\uD847\uDDB6\u5E92\u5E99\u5FC2\uD849\uDF12\u658B\"],\n[\"8ca1\",\"\uD84C\uDFF9\u6919\u6A43\uD84F\uDC63\u6CFF\"],\n[\"8ca7\",\"\u7200\uD851\uDD05\u738C\u3EDB\uD852\uDE13\u5B15\u74B9\u8B83\uD857\uDCA4\uD855\uDE95\u7A93\u7BEC\u7CC3\u7E6C\u82F8\u8597\u9FA9\u8890\u9FAA\u8EB9\u9FAB\u8FCF\u855F\u99E0\u9221\u9FAC\uD863\uDDB9\uD845\uDC3F\u4071\u42A2\u5A1A\"],\n[\"8cc9\",\"\u9868\u676B\u4276\u573D\"],\n[\"8cce\",\"\u85D6\uD852\uDD7B\u82BF\uD85C\uDD0D\u4C81\uD85B\uDD74\u5D7B\uD85A\uDF15\uD85B\uDFBE\u9FAD\u9FAE\u5B96\u9FAF\u66E7\u7E5B\u6E57\u79CA\u3D88\u44C3\uD84C\uDE56\uD849\uDF96\u439A\u4536\"],\n[\"8ce6\",\"\u5CD5\uD84E\uDF1A\u8AF9\u5C78\u3D12\uD84D\uDD51\u5D78\u9FB2\u7157\u4558\uD850\uDCEC\uD847\uDE23\u4C77\u3978\u344A\uD840\uDDA4\uD85B\uDC41\u8ACC\u4FB4\uD840\uDE39\u59BF\u816C\u9856\uD866\uDCFA\u5F3B\"],\n[\"8d40\",\"\uD842\uDF9F\"],\n[\"8d42\",\"\uD848\uDDC1\uD862\uDD6D\u4102\u46BB\uD864\uDC79\u3F07\u9FB3\uD868\uDDB5\u40F8\u37D6\u46F7\uD85B\uDC46\u417C\uD861\uDEB2\uD85C\uDFFF\u456D\u38D4\uD855\uDC9A\u4561\u451B\u4D89\u4C7B\u4D76\u45EA\u3FC8\uD852\uDF0F\u3661\u44DE\u44BD\u41ED\u5D3E\u5D48\u5D56\u3DFC\u380F\u5DA4\u5DB9\u3820\u3838\u5E42\u5EBD\u5F25\u5F83\u3908\u3914\u393F\u394D\u60D7\u613D\u5CE5\u3989\u61B7\u61B9\u61CF\u39B8\u622C\u6290\u62E5\u6318\u39F8\u56B1\"],\n[\"8da1\",\"\u3A03\u63E2\u63FB\u6407\u645A\u3A4B\u64C0\u5D15\u5621\u9F9F\u3A97\u6586\u3ABD\u65FF\u6653\u3AF2\u6692\u3B22\u6716\u3B42\u67A4\u6800\u3B58\u684A\u6884\u3B72\u3B71\u3B7B\u6909\u6943\u725C\u6964\u699F\u6985\u3BBC\u69D6\u3BDD\u6A65\u6A74\u6A71\u6A82\u3BEC\u6A99\u3BF2\u6AAB\u6AB5\u6AD4\u6AF6\u6B81\u6BC1\u6BEA\u6C75\u6CAA\u3CCB\u6D02\u6D06\u6D26\u6D81\u3CEF\u6DA4\u6DB1\u6E15\u6E18\u6E29\u6E86\uD862\uDDC0\u6EBB\u6EE2\u6EDA\u9F7F\u6EE8\u6EE9\u6F24\u6F34\u3D46\uD84F\uDF41\u6F81\u6FBE\u3D6A\u3D75\u71B7\u5C99\u3D8A\u702C\u3D91\u7050\u7054\u706F\u707F\u7089\uD840\uDF25\u43C1\u35F1\uD843\uDED8\"],\n[\"8e40\",\"\uD84F\uDED7\u57BE\uD85B\uDED3\u713E\uD855\uDFE0\u364E\u69A2\uD862\uDFE9\u5B74\u7A49\uD856\uDCE1\uD865\uDCD9\u7A65\u7A7D\uD856\uDDAC\u7ABB\u7AB0\u7AC2\u7AC3\u71D1\uD859\uDC8D\u41CA\u7ADA\u7ADD\u7AEA\u41EF\u54B2\uD857\uDC01\u7B0B\u7B55\u7B29\uD854\uDF0E\uD857\uDCFE\u7BA2\u7B6F\u839C\uD856\uDFB4\uD85B\uDC7F\u7BD0\u8421\u7B92\u7BB8\uD857\uDD20\u3DAD\uD857\uDC65\u8492\u7BFA\u7C06\u7C35\uD857\uDCC1\u7C44\u7C83\uD852\uDC82\u7CA6\u667D\uD851\uDD78\u7CC9\u7CC7\u7CE6\u7C74\u7CF3\u7CF5\u7CCE\"],\n[\"8ea1\",\"\u7E67\u451D\uD85B\uDE44\u7D5D\uD85B\uDED6\u748D\u7D89\u7DAB\u7135\u7DB3\u7DD2\uD850\uDC57\uD858\uDC29\u7DE4\u3D13\u7DF5\uD845\uDFF9\u7DE5\uD860\uDF6D\u7E1D\uD858\uDD21\uD858\uDD5A\u7E6E\u7E92\u432B\u946C\u7E27\u7F40\u7F41\u7F47\u7936\uD858\uDED0\u99E1\u7F97\uD858\uDF51\u7FA3\uD845\uDE61\uD840\uDC68\u455C\uD84D\uDF66\u4503\uD860\uDF3A\u7FFA\uD859\uDC89\u8005\u8008\u801D\u8028\u802F\uD868\uDC87\uD85B\uDCC3\u803B\u803C\u8061\uD849\uDF14\u4989\uD859\uDE26\uD84F\uDDE3\uD859\uDEE8\u6725\u80A7\uD862\uDE48\u8107\u811A\u58B0\uD849\uDEF6\u6C7F\uD859\uDC98\uD853\uDFB8\u64E7\uD845\uDC8A\u8218\uD846\uDC5E\u6A53\uD852\uDE65\uD852\uDE95\u447A\u8229\uD842\uDF0D\uD85A\uDE52\uD84F\uDD7E\u4FF9\uD845\uDCFD\u84E2\u8362\uD85A\uDF0A\uD852\uDDA7\uD84D\uDD30\uD845\uDF73\uD84F\uDDF8\u82AA\u691B\uD87E\uDD94\u41DB\"],\n[\"8f40\",\"\u854B\u82D0\u831A\uD843\uDE16\uD845\uDFB4\u36C1\uD84C\uDD7D\uD84D\uDD5A\u827B\u82E2\u8318\uD84F\uDE8B\uD85B\uDDA3\uD85A\uDF05\uD85A\uDF97\uD84D\uDDCE\u3DBF\u831D\u55EC\u8385\u450B\uD85B\uDDA5\u83AC\u83C1\u83D3\u347E\uD85B\uDED4\u6A57\u855A\u3496\uD85B\uDE42\uD84B\uDEEF\u8458\uD856\uDFE4\u8471\u3DD3\u44E4\u6AA7\u844A\uD84F\uDCB5\u7958\u84A8\uD85A\uDF96\uD85B\uDE77\uD85B\uDE43\u84DE\u840F\u8391\u44A0\u8493\u84E4\uD857\uDC91\u4240\uD857\uDCC0\u4543\u8534\u5AF2\uD85B\uDE99\u4527\u8573\u4516\u67BF\u8616\"],\n[\"8fa1\",\"\uD861\uDE25\uD861\uDE3B\u85C1\uD85C\uDC88\u8602\uD845\uDD82\uD85C\uDCCD\uD87E\uDDB2\u456A\u8628\u3648\uD846\uDCA2\u53F7\uD85C\uDF9A\u867E\u8771\uD868\uDCF8\u87EE\uD84B\uDC27\u87B1\u87DA\u880F\u5661\u866C\u6856\u460F\u8845\u8846\uD85D\uDDE0\uD84F\uDDB9\uD85D\uDDE4\u885E\u889C\u465B\u88B4\u88B5\u63C1\u88C5\u7777\uD85D\uDF0F\u8987\u898A\u89A6\u89A9\u89A7\u89BC\uD862\uDE25\u89E7\uD85E\uDD24\uD85E\uDEBD\u8A9C\u7793\u91FE\u8A90\uD85E\uDE59\u7AE9\uD85E\uDF3A\uD84F\uDF8F\u4713\uD85E\uDF38\u717C\u8B0C\u8B1F\uD855\uDC30\uD855\uDD65\u8B3F\u8B4C\u8B4D\u8AA9\uD852\uDE7A\u8B90\u8B9B\u8AAF\uD845\uDEDF\u4615\u884F\u8C9B\uD85F\uDD54\uD85F\uDD8F\uD87E\uDDD4\u3725\uD85F\uDD53\u8CD6\uD85F\uDD98\uD85F\uDDBD\u8D12\u8D03\uD846\uDD10\u8CDB\u705C\u8D11\uD853\uDCC9\u3ED0\u8D77\"],\n[\"9040\",\"\u8DA9\uD860\uDC02\uD844\uDC14\uD852\uDD8A\u3B7C\uD860\uDDBC\uD85C\uDD0C\u7AE7\u8EAD\u8EB6\u8EC3\u92D4\u8F19\u8F2D\uD860\uDF65\uD861\uDC12\u8FA5\u9303\uD868\uDE9F\uD842\uDE50\u8FB3\u492A\uD862\uDDDE\uD861\uDD3D\uD84F\uDDBB\u5EF8\uD84C\uDE62\u8FF9\uD868\uDC14\uD861\uDEBC\uD861\uDD01\uD848\uDF25\u3980\uD85B\uDED7\u9037\uD861\uDD3C\uD85E\uDEBE\u9061\uD861\uDD6C\uD861\uDE0B\u90A8\uD861\uDF13\u90C4\uD861\uDEE6\u90AE\u90FD\u9167\u3AF0\u91A9\u91C4\u7CAC\uD862\uDD33\uD847\uDE89\u920E\u6C9F\u9241\u9262\uD855\uDDB9\u92B9\uD862\uDEC6\uD84F\uDC9B\uD862\uDF0C\uD855\uDDDB\"],\n[\"90a1\",\"\uD843\uDD31\u932C\u936B\uD862\uDEE1\uD862\uDFEB\u708F\u5AC3\uD862\uDEE2\uD862\uDEE5\u4965\u9244\uD862\uDFEC\uD863\uDC39\uD862\uDFFF\u9373\u945B\u8EBC\u9585\u95A6\u9426\u95A0\u6FF6\u42B9\uD849\uDE7A\uD861\uDED8\uD844\uDE7C\uD84F\uDE2E\u49DF\u6C1C\u967B\u9696\u416C\u96A3\uD85B\uDED5\u61DA\u96B6\u78F5\uD862\uDEE0\u96BD\u53CC\u49A1\uD85B\uDCB8\uD840\uDE74\uD859\uDC10\uD864\uDCAF\uD864\uDCE5\uD852\uDED1\uD846\uDD15\uD84C\uDF0A\u9731\u8642\u9736\u4A0F\u453D\u4585\uD852\uDEE9\u7075\u5B41\u971B\u975C\uD864\uDDD5\u9757\u5B4A\uD864\uDDEB\u975F\u9425\u50D0\uD84C\uDCB7\uD84C\uDCBC\u9789\u979F\u97B1\u97BE\u97C0\u97D2\u97E0\uD855\uDC6C\u97EE\u741C\uD865\uDC33\u97FF\u97F5\uD865\uDC1D\uD85E\uDD7A\u4AD1\u9834\u9833\u984B\u9866\u3B0E\uD85C\uDD75\u3D51\uD841\uDE30\uD850\uDD5C\"],\n[\"9140\",\"\uD855\uDF06\u98CA\u98B7\u98C8\u98C7\u4AFF\uD85B\uDD27\uD845\uDED3\u55B0\u98E1\u98E6\u98EC\u9378\u9939\uD852\uDE29\u4B72\uD866\uDC57\uD866\uDD05\u99F5\u9A0C\u9A3B\u9A10\u9A58\uD855\uDF25\u36C4\uD864\uDCB1\uD866\uDFD5\u9AE0\u9AE2\uD866\uDF05\u9AF4\u4C0E\u9B14\u9B2D\uD861\uDE00\u5034\u9B34\uD85A\uDDA8\u38C3\uD84C\uDC7D\u9B50\u9B40\uD867\uDD3E\u5A45\uD846\uDC63\u9B8E\uD850\uDE4B\u9C02\u9BFF\u9C0C\uD867\uDE68\u9DD4\uD867\uDFB7\uD868\uDD92\uD868\uDDAB\uD868\uDCE1\uD868\uDD23\uD868\uDDDF\u9D7E\u9D83\uD868\uDD34\u9E0E\u6888\"],\n[\"91a1\",\"\u9DC4\uD848\uDD5B\uD868\uDD93\uD868\uDE20\uD846\uDD3B\uD868\uDE33\u9D39\uD868\uDCB9\uD868\uDEB4\u9E90\u9E95\u9E9E\u9EA2\u4D34\u9EAA\u9EAF\uD850\uDF64\u9EC1\u3B60\u39E5\u3D1D\u4F32\u37BE\uD863\uDC2B\u9F02\u9F08\u4B96\u9424\uD85B\uDDA2\u9F17\u9F16\u9F39\u569F\u568A\u9F45\u99B8\uD864\uDC8B\u97F2\u847F\u9F62\u9F69\u7ADC\u9F8E\u7216\u4BBE\uD852\uDD75\uD852\uDDBB\u7177\uD852\uDDF8\uD850\uDF48\uD852\uDE51\u739E\uD862\uDFDA\uD846\uDCFA\u799F\uD862\uDD7E\uD863\uDE36\u9369\u93F3\uD862\uDE44\u92EC\u9381\u93CB\uD862\uDD6C\uD851\uDCB9\u7217\u3EEB\u7772\u7A43\u70D0\uD851\uDC73\uD850\uDFF8\u717E\uD845\uDFEF\u70A3\uD846\uDCBE\uD84D\uDD99\u3EC7\uD846\uDC85\uD855\uDC2F\uD845\uDFF8\u3722\uD845\uDEFB\uD846\uDC39\u36E1\uD845\uDF74\uD846\uDCD1\uD857\uDF4B\u3723\uD845\uDEC0\u575B\uD852\uDE25\uD844\uDFFE\uD844\uDEA8\"],\n[\"9240\",\"\uD844\uDFC6\uD845\uDCB6\u8503\uD84D\uDEA6\u8503\u8455\uD852\uDD94\uD85C\uDD65\uD84F\uDE31\uD855\uDD5C\uD84F\uDEFB\uD85C\uDC52\u44F4\uD84D\uDEEE\uD866\uDD9D\uD85B\uDF26\u67F9\u3733\u3C15\u3DE7\u586C\uD846\uDD22\u6810\u4057\uD84D\uDF3F\uD850\uDCE1\uD850\uDC8B\uD850\uDD0F\uD85B\uDC21\u54CB\u569E\uD859\uDEB1\u5692\uD843\uDFDF\uD842\uDFA8\uD843\uDE0D\u93C6\uD862\uDF13\u939C\u4EF8\u512B\u3819\uD851\uDC36\u4EBC\uD841\uDC65\uD840\uDF7F\u4F4B\u4F8A\uD855\uDE51\u5A68\uD840\uDDAB\uD840\uDFCB\u3999\uD840\uDF0A\uD841\uDC14\u3435\u4F29\uD840\uDEC0\uD863\uDEB3\uD840\uDE75\u8ADA\uD840\uDE0C\u4E98\"],\n[\"92a1\",\"\u50CD\u510D\u4FA2\u4F03\uD852\uDE0E\uD84F\uDE8A\u4F42\u502E\u506C\u5081\u4FCC\u4FE5\u5058\u50FC\u5159\u515B\u515D\u515E\u6E76\uD84D\uDD95\uD84F\uDE39\uD84F\uDEBF\u6D72\uD846\uDC84\uD84F\uDE89\u51A8\u51C3\uD841\uDDE0\u44DD\uD841\uDCA3\uD841\uDC92\uD841\uDC91\u8D7A\uD862\uDE9C\uD841\uDF0E\u5259\u52A4\uD842\uDC73\u52E1\u936E\u467A\u718C\uD850\uDF8C\uD843\uDC20\uD852\uDDAC\uD844\uDCE4\u69D1\uD843\uDE1D\u7479\u3EDE\u7499\u7414\u7456\u7398\u4B8E\uD852\uDEBC\uD850\uDC8D\u53D0\u3584\u720F\uD850\uDCC9\u55B4\uD840\uDF45\u54CD\uD842\uDFC6\u571D\u925D\u96F4\u9366\u57DD\u578D\u577F\u363E\u58CB\u5A99\uD862\uDE46\uD845\uDEFA\uD845\uDF6F\uD845\uDF10\u5A2C\u59B8\u928F\u5A7E\u5ACF\u5A12\uD856\uDD46\uD846\uDDF3\uD846\uDC61\uD850\uDE95\u36F5\u6D05\u7443\u5A21\uD857\uDE83\"],\n[\"9340\",\"\u5A81\uD862\uDFD7\uD841\uDC13\u93E0\u748C\uD844\uDF03\u7105\u4972\u9408\uD862\uDDFB\u93BD\u37A0\u5C1E\u5C9E\u5E5E\u5E48\uD846\uDD96\uD846\uDD7C\uD84E\uDEEE\u5ECD\u5B4F\uD846\uDD03\uD846\uDD04\u3701\uD846\uDCA0\u36DD\uD845\uDEFE\u36D3\u812A\uD862\uDE47\uD847\uDDBA\uD84D\uDC72\uD862\uDDA8\u5F0C\u5F0E\uD846\uDD27\uD845\uDFAB\u5A6B\uD845\uDF3B\u5B44\u8614\uD85D\uDDFD\u8860\u607E\uD84A\uDC60\uD849\uDE2B\u5FDB\u3EB8\uD849\uDDAF\uD849\uDDBE\uD864\uDC88\uD85B\uDF73\u61C0\uD840\uDC3E\uD840\uDC46\uD849\uDE1B\u6199\u6198\u6075\uD84B\uDC9B\uD84B\uDD07\uD851\uDED4\uD864\uDD4D\"],\n[\"93a1\",\"\u6471\uD851\uDE65\uD84A\uDF6A\u3A29\uD84A\uDF22\uD84D\uDC50\uD866\uDCEA\uD84B\uDE78\u6337\uD869\uDC5B\u64B6\u6331\u63D1\uD852\uDDE3\uD84B\uDD67\u62A4\uD84B\uDCA1\u643B\u656B\u6972\u3BF4\uD84C\uDC8E\uD84C\uDEAD\uD852\uDD89\uD84C\uDEAB\u550D\uD84C\uDEE0\uD846\uDCD9\uD865\uDC3F\u66CE\uD84C\uDE89\uD84C\uDDB3\u3AE0\u4190\uD855\uDD84\uD862\uDF22\uD855\uDD8F\uD845\uDEFC\uD855\uDD5B\uD855\uDC25\u78EE\uD84C\uDD03\uD846\uDC2A\uD84C\uDE34\u3464\uD84C\uDE0F\uD84C\uDD82\uD850\uDEC9\u668E\uD85B\uDD24\u666B\u4B93\u6630\uD85E\uDC70\uD847\uDDEB\u6663\uD84C\uDED2\uD84C\uDEE1\u661E\uD856\uDC72\u38D1\uD84E\uDC3A\uD84D\uDFBC\u3B99\uD84D\uDFA2\uD84C\uDFFE\u74D0\u3B96\u678F\uD851\uDE2A\u68B6\u681E\u3BC4\u6ABE\u3863\uD84D\uDFD5\uD851\uDC87\u6A33\u6A52\u6AC9\u6B05\uD846\uDD12\u6511\u6898\u6A4C\u3BD7\u6A7A\u6B57\uD84F\uDFC0\uD84F\uDC9A\u93A0\u92F2\uD862\uDFEA\uD862\uDECB\"],\n[\"9440\",\"\u9289\uD860\uDC1E\uD862\uDDDC\u9467\u6DA5\u6F0B\uD852\uDDEC\u6D67\uD84F\uDF7F\u3D8F\u6E04\uD850\uDC3C\u5A3D\u6E0A\u5847\u6D24\u7842\u713B\uD850\uDF1A\uD850\uDE76\u70F1\u7250\u7287\u7294\uD851\uDF8F\uD851\uDF25\u5179\uD852\uDEA4\uD841\uDDEB\u747A\uD84F\uDEF8\uD84D\uDE5F\uD852\uDE4A\uD852\uDD17\uD857\uDFE1\u3F06\u3EB1\uD852\uDEDF\uD863\uDC23\uD84F\uDF35\u60A7\u3EF3\u74CC\u743C\u9387\u7437\u449F\uD85B\uDDEA\u4551\u7583\u3F63\uD853\uDCD9\uD853\uDD06\u3F58\u7555\u7673\uD869\uDDC6\u3B19\u7468\uD862\uDECC\uD852\uDDAB\uD852\uDD8E\u3AFB\"],\n[\"94a1\",\"\u3DCD\uD852\uDE4E\u3EFF\uD852\uDDC5\uD852\uDCF3\u91FA\u5732\u9342\uD862\uDEE3\uD846\uDC64\u50DF\uD854\uDE21\uD854\uDDE7\u7778\uD84C\uDE32\u770E\u770F\u777B\uD851\uDE97\uD84D\uDF81\u3A5E\uD852\uDCF0\u7438\u749B\u3EBF\uD852\uDEBA\uD852\uDEC7\u40C8\uD852\uDE96\uD858\uDDAE\u9307\uD855\uDD81\u781E\u788D\u7888\u78D2\u73D0\u7959\uD85D\uDF41\uD855\uDEE3\u410E\u799B\u8496\u79A5\u6A2D\uD84F\uDEFA\u7A3A\u79F4\u416E\uD845\uDEE6\u4132\u9235\u79F1\uD843\uDD4C\uD852\uDD8C\uD840\uDE99\uD84F\uDDBA\uD845\uDF6E\u3597\u556B\u3570\u36AA\uD840\uDDD4\uD843\uDC0D\u7AE2\u5A59\uD849\uDEF5\uD856\uDEAF\uD856\uDE9C\u5A0D\uD840\uDE5B\u78F0\u5A2A\uD856\uDFC6\u7AFE\u41F9\u7C5D\u7C6D\u4211\uD856\uDFB3\uD857\uDEBC\uD857\uDEA6\u7CCD\uD852\uDDF9\uD845\uDFB0\u7C8E\u7C7C\u7CAE\u6AB2\u7DDC\u7E07\u7DD3\u7F4E\uD858\uDE61\"],\n[\"9540\",\"\uD858\uDD5C\uD85E\uDF48\u7D97\uD857\uDE82\u426A\uD85A\uDF75\uD842\uDD16\u67D6\uD840\uDC4E\uD84D\uDDCF\u57C4\uD859\uDC12\uD858\uDFF8\uD852\uDD62\u7FDD\u7B27\uD842\uDC2C\uD856\uDEE9\uD857\uDD43\u7B0C\uD857\uDE0E\u99E6\u8645\u9A63\u6A1C\uD84D\uDC3F\u39E2\uD852\uDDF7\uD859\uDDAD\u9A1F\uD859\uDDA0\u8480\uD85C\uDD27\uD85B\uDCD1\u44EA\u8137\u4402\u80C6\u8109\u8142\uD859\uDFB4\u98C3\uD85A\uDE42\u8262\u8265\uD85A\uDE51\u8453\uD85B\uDDA7\u8610\uD85C\uDE1B\u5A86\u417F\uD846\uDC40\u5B2B\uD846\uDCA1\u5AE4\uD846\uDCD8\u86A0\uD87E\uDDBC\uD84F\uDD8F\u882D\uD85D\uDC22\u5A02\"],\n[\"95a1\",\"\u886E\u4F45\u8887\u88BF\u88E6\u8965\u894D\uD855\uDE83\u8954\uD85D\uDF85\uD85D\uDF84\uD862\uDFF5\uD862\uDFD9\uD862\uDF9C\uD862\uDDF9\u3EAD\u84A3\u46F5\u46CF\u37F2\u8A3D\u8A1C\uD865\uDC48\u5F4D\u922B\uD850\uDE84\u65D4\u7129\u70C4\uD846\uDC45\u9D6D\u8C9F\u8CE9\uD85F\uDDDC\u599A\u77C3\u59F0\u436E\u36D4\u8E2A\u8EA7\uD853\uDC09\u8F30\u8F4A\u42F4\u6C58\u6FBB\uD848\uDF21\u489B\u6F79\u6E8B\uD845\uDFDA\u9BE9\u36B5\uD852\uDD2F\u90BB\u9097\u5571\u4906\u91BB\u9404\uD862\uDE4B\u4062\uD862\uDEFC\u9427\uD863\uDC1D\uD863\uDC3B\u84E5\u8A2B\u9599\u95A7\u9597\u9596\uD863\uDD34\u7445\u3EC2\uD852\uDCFF\uD852\uDE42\uD850\uDFEA\u3EE7\uD84C\uDE25\u968F\uD863\uDEE7\uD863\uDE66\uD863\uDE65\u3ECC\uD852\uDDED\uD852\uDE78\uD84F\uDFEE\u7412\u746B\u3EFC\u9741\uD864\uDCB0\"],\n[\"9640\",\"\u6847\u4A1D\uD864\uDC93\uD855\uDFDF\u975D\u9368\uD862\uDD89\uD863\uDC26\uD862\uDF2F\uD858\uDFBE\u92BA\u5B11\u8B69\u493C\u73F9\uD850\uDE1B\u979B\u9771\u9938\uD843\uDF26\u5DC1\uD862\uDFC5\uD852\uDEB2\u981F\uD865\uDCDA\u92F6\uD865\uDDD7\u91E5\u44C0\uD862\uDF50\uD852\uDE67\uD862\uDF64\u98DC\uD862\uDE45\u3F00\u922A\u4925\u8414\u993B\u994D\uD85E\uDF06\u3DFD\u999B\u4B6F\u99AA\u9A5C\uD862\uDF65\uD856\uDCC8\u6A8F\u9A21\u5AFE\u9A2F\uD866\uDCF1\u4B90\uD866\uDD48\u99BC\u4BBD\u4B97\u937D\u5872\uD844\uDF02\u5822\uD852\uDDB8\"],\n[\"96a1\",\"\uD845\uDCE8\u7844\uD849\uDF1F\uD84F\uDDB8\u68C5\u3D7D\u9458\u3927\u6150\uD849\uDF81\uD84A\uDD6B\u6107\u9C4F\u9C53\u9C7B\u9C35\u9C10\u9B7F\u9BCF\uD867\uDE2D\u9B9F\uD868\uDDF5\uD868\uDCFE\u9D21\u4CAE\uD850\uDD04\u9E18\u4CB0\u9D0C\uD868\uDDB4\uD868\uDCED\uD868\uDCF3\uD866\uDD2F\u9DA5\u84BD\uD85B\uDE12\uD85B\uDFDF\uD85A\uDF82\u85FC\u4533\uD85B\uDDA4\uD85B\uDE84\uD85B\uDDF0\u8420\u85EE\uD85B\uDE00\uD84D\uDFD7\uD858\uDC64\u79E2\uD84D\uDD9C\uD84D\uDE40\u492D\uD852\uDDDE\u3D62\u93DB\u92BE\u9348\uD840\uDEBF\u78B9\u9277\u944D\u4FE4\u3440\u9064\uD855\uDD5D\u783D\u7854\u78B6\u784B\uD845\uDF57\uD84C\uDDC9\uD852\uDD41\u369A\u4F72\u6FDA\u6FD9\u701E\u701E\u5414\uD850\uDDB5\u57BB\u58F3\u578A\u9D16\u57D7\u7134\u34AF\uD850\uDDAC\u71EB\uD85B\uDC40\uD853\uDF97\u5B28\uD845\uDFB5\uD862\uDE49\"],\n[\"9740\",\"\u610C\u5ACE\u5A0B\u42BC\uD851\uDC88\u372C\u4B7B\uD862\uDDFC\u93BB\u93B8\uD846\uDCD6\uD843\uDF1D\u8472\uD85B\uDCC0\uD845\uDC13\uD850\uDEFA\uD84B\uDC26\uD850\uDFC1\u5994\uD84F\uDDB7\uD859\uDF41\u7DA8\uD858\uDD5B\uD858\uDCA4\uD852\uDDB9\uD852\uDD8B\uD862\uDDFA\u92E5\u73E2\u3EE9\u74B4\uD862\uDF63\uD846\uDC9F\u3EE1\uD852\uDEB3\u6AD8\u73F3\u73FB\u3ED6\uD852\uDE3E\uD852\uDE94\uD845\uDFD9\uD852\uDE66\uD840\uDFA7\uD845\uDC24\uD852\uDDE5\u7448\uD852\uDD16\u70A5\uD852\uDD76\u9284\u73E6\u935F\uD841\uDCFE\u9331\uD862\uDECE\uD862\uDE16\u9386\uD862\uDFE7\uD855\uDDD5\u4935\uD862\uDE82\u716B\"],\n[\"97a1\",\"\uD852\uDD43\uD843\uDCFF\u56A4\uD841\uDE1A\uD842\uDFEB\uD843\uDCB8\u5502\u79C4\uD845\uDFFA\u7DFE\uD845\uDEC2\uD852\uDE50\uD846\uDC52\u452E\u9401\u370A\uD862\uDEC0\uD852\uDDAD\u59B0\uD846\uDCBF\uD846\uDC83\uD85D\uDC84\u5AA1\u36E2\uD84F\uDD5B\u36B0\u925F\u5A79\uD862\uDE81\uD846\uDC62\u9374\u3CCD\uD842\uDEB4\u4A96\u398A\u50F4\u3D69\u3D4C\uD844\uDF9C\u7175\u42FB\uD860\uDE18\u6E0F\uD864\uDCE4\u44EB\u6D57\uD85F\uDE4F\u7067\u6CAF\u3CD6\uD84F\uDFED\uD84F\uDE2D\u6E02\u6F0C\u3D6F\uD840\uDFF5\u7551\u36BC\u34C8\u4680\u3EDA\u4871\u59C4\u926E\u493E\u8F41\uD863\uDC1C\uD85A\uDFC0\u5812\u57C8\u36D6\uD845\uDC52\u70FE\uD850\uDF62\uD852\uDE71\uD84B\uDFE3\uD844\uDEB0\uD848\uDFBD\u68B9\u6967\uD844\uDF98\uD84D\uDCE5\uD85E\uDFF4\uD84D\uDEDF\uD862\uDE83\uD84D\uDFD6\uD84C\uDFFA\uD853\uDC9F\u6A1A\uD84D\uDEAD\uD85B\uDCB7\u843E\u44DF\u44CE\"],\n[\"9840\",\"\uD85B\uDD26\uD85B\uDD51\uD85B\uDC82\uD85B\uDFDE\u6F17\uD85C\uDD09\u833D\uD845\uDF3A\u83ED\uD85B\uDC80\uD85C\uDC53\uD845\uDFDB\u5989\u5A82\uD845\uDFB3\u5A61\u5A71\uD846\uDD05\uD850\uDDFC\u372D\u59EF\uD845\uDF3C\u36C7\u718E\u9390\u669A\uD850\uDEA5\u5A6E\u5A2B\uD850\uDE93\u6A2B\uD84F\uDEF9\uD85D\uDF36\uD851\uDC5B\uD850\uDECA\u711D\uD850\uDE59\uD862\uDDE1\u4FB0\uD85B\uDD28\u5CC2\uD851\uDCCE\uD85F\uDE4D\uD850\uDFBD\u6A0C\uD850\uDE56\uD844\uDF04\u70A6\u7133\uD850\uDFE9\u3DA5\u6CDF\uD87E\uDC25\uD852\uDE4F\u7E65\u59EB\u5D2F\u3DF3\u5F5C\uD852\uDE5D\uD845\uDFDF\u7DA4\u8426\"],\n[\"98a1\",\"\u5485\uD84E\uDEFA\uD84C\uDF00\uD840\uDE14\u577E\uD842\uDCD5\uD841\uDE19\u3FE5\uD847\uDF9E\uD868\uDEB6\u7003\uD864\uDD5B\u5D70\u738F\u7CD3\uD862\uDE59\uD865\uDC20\u4FC8\u7FE7\u72CD\u7310\uD85E\uDEF4\u7338\u7339\uD855\uDEF6\u7341\u7348\u3EA9\uD85E\uDF18\u906C\u71F5\uD852\uDCF2\u73E1\u81F6\u3ECA\u770C\u3ED1\u6CA2\u56FD\u7419\u741E\u741F\u3EE2\u3EF0\u3EF4\u3EFA\u74D3\u3F0E\u3F53\u7542\u756D\u7572\u758D\u3F7C\u75C8\u75DC\u3FC0\u764D\u3FD7\u7674\u3FDC\u767A\uD853\uDF5C\u7188\u5623\u8980\u5869\u401D\u7743\u4039\u6761\u4045\u35DB\u7798\u406A\u406F\u5C5E\u77BE\u77CB\u58F2\u7818\u70B9\u781C\u40A8\u7839\u7847\u7851\u7866\u8448\uD855\uDD35\u7933\u6803\u7932\u4103\"],\n[\"9940\",\"\u4109\u7991\u7999\u8FBB\u7A06\u8FBC\u4167\u7A91\u41B2\u7ABC\u8279\u41C4\u7ACF\u7ADB\u41CF\u4E21\u7B62\u7B6C\u7B7B\u7C12\u7C1B\u4260\u427A\u7C7B\u7C9C\u428C\u7CB8\u4294\u7CED\u8F93\u70C0\uD843\uDCCF\u7DCF\u7DD4\u7DD0\u7DFD\u7FAE\u7FB4\u729F\u4397\u8020\u8025\u7B39\u802E\u8031\u8054\u3DCC\u57B4\u70A0\u80B7\u80E9\u43ED\u810C\u732A\u810E\u8112\u7560\u8114\u4401\u3B39\u8156\u8159\u815A\"],\n[\"99a1\",\"\u4413\u583A\u817C\u8184\u4425\u8193\u442D\u81A5\u57EF\u81C1\u81E4\u8254\u448F\u82A6\u8276\u82CA\u82D8\u82FF\u44B0\u8357\u9669\u698A\u8405\u70F5\u8464\u60E3\u8488\u4504\u84BE\u84E1\u84F8\u8510\u8538\u8552\u453B\u856F\u8570\u85E0\u4577\u8672\u8692\u86B2\u86EF\u9645\u878B\u4606\u4617\u88AE\u88FF\u8924\u8947\u8991\uD85E\uDD67\u8A29\u8A38\u8A94\u8AB4\u8C51\u8CD4\u8CF2\u8D1C\u4798\u585F\u8DC3\u47ED\u4EEE\u8E3A\u55D8\u5754\u8E71\u55F5\u8EB0\u4837\u8ECE\u8EE2\u8EE4\u8EED\u8EF2\u8FB7\u8FC1\u8FCA\u8FCC\u9033\u99C4\u48AD\u98E0\u9213\u491E\u9228\u9258\u926B\u92B1\u92AE\u92BF\"],\n[\"9a40\",\"\u92E3\u92EB\u92F3\u92F4\u92FD\u9343\u9384\u93AD\u4945\u4951\u9EBF\u9417\u5301\u941D\u942D\u943E\u496A\u9454\u9479\u952D\u95A2\u49A7\u95F4\u9633\u49E5\u67A0\u4A24\u9740\u4A35\u97B2\u97C2\u5654\u4AE4\u60E8\u98B9\u4B19\u98F1\u5844\u990E\u9919\u51B4\u991C\u9937\u9942\u995D\u9962\u4B70\u99C5\u4B9D\u9A3C\u9B0F\u7A83\u9B69\u9B81\u9BDD\u9BF1\u9BF4\u4C6D\u9C20\u376F\uD846\uDFC2\u9D49\u9C3A\"],\n[\"9aa1\",\"\u9EFE\u5650\u9D93\u9DBD\u9DC0\u9DFC\u94F6\u8FB6\u9E7B\u9EAC\u9EB1\u9EBD\u9EC6\u94DC\u9EE2\u9EF1\u9EF8\u7AC8\u9F44\uD840\uDC94\uD840\uDEB7\uD840\uDFA0\u691A\u94C3\u59AC\uD841\uDCD7\u5840\u94C1\u37B9\uD841\uDDD5\uD841\uDE15\uD841\uDE76\uD845\uDEBA\u5757\u7173\uD842\uDEC2\uD842\uDECD\uD842\uDFBF\u546A\uD87E\uDC3B\uD842\uDFCB\u549E\uD842\uDFFB\uD843\uDC3B\uD843\uDC53\uD843\uDC65\uD843\uDC7C\u60E7\uD843\uDC8D\u567A\uD843\uDCB5\uD843\uDCDD\uD843\uDCED\uD843\uDD6F\uD843\uDDB2\uD843\uDDC8\u6955\u9C2F\u87A5\uD843\uDE04\uD843\uDE0E\uD843\uDED7\uD843\uDF90\uD843\uDF2D\uD843\uDE73\u5C20\uD843\uDFBC\u5E0B\uD844\uDC5C\uD844\uDC4F\uD844\uDC76\u671E\uD844\uDC7B\uD844\uDC88\uD844\uDC96\u3647\uD844\uDCBF\uD844\uDCD3\uD844\uDD2F\uD844\uDD3B\u5364\u84AD\uD844\uDEE3\uD844\uDF75\uD844\uDF36\u8B81\uD845\uDD77\uD845\uDE19\uD845\uDFC3\uD845\uDFC7\u4E78\u70BB\uD846\uDC2D\uD846\uDD6A\"],\n[\"9b40\",\"\uD846\uDE2D\uD846\uDE45\uD847\uDC2A\uD847\uDC70\uD847\uDCAC\uD847\uDEC8\u62C3\uD847\uDED5\uD847\uDF15\u7198\u6855\uD848\uDC45\u69E9\u36C8\uD848\uDE7C\uD848\uDFD7\uD848\uDFFA\uD849\uDF2A\uD84A\uDC71\uD84A\uDD4F\u82FD\uD84A\uDD67\uD84A\uDD93\uD84A\uDED5\u89A5\uD84A\uDEE8\u8FA0\uD84A\uDF0E\u97B8\uD84A\uDF3F\u9847\u9ABD\uD84B\uDC4C\"],\n[\"9b62\",\"\uD84B\uDC88\uD84B\uDCB7\uD856\uDFE8\uD84B\uDD08\uD84B\uDD12\uD84B\uDDB7\uD84B\uDD95\uD84B\uDE42\uD84B\uDF74\uD84B\uDFCC\uD84C\uDC33\uD84C\uDC66\uD84C\uDF1F\uD84C\uDFDE\u5FB1\u6648\u66BF\uD85E\uDE79\uD84D\uDD67\uD84D\uDDF3\u7201\uD852\uDDBA\u77D7\uD84D\uDE1A\uD84D\uDF16\u7E87\uD840\uDF46\u58B5\u670E\"],\n[\"9ba1\",\"\u6918\uD84E\uDEA7\uD85D\uDE57\uD857\uDFE2\uD84F\uDE11\uD84F\uDEB9\uD85D\uDDFE\uD848\uDC9A\u48D0\u4AB8\uD850\uDD19\uD862\uDE9A\uD850\uDEEE\uD850\uDF0D\uD850\uDC3B\uD850\uDF34\uD850\uDF96\uD852\uDE45\uD841\uDDCA\u51D2\uD841\uDE11\u599F\uD847\uDEA8\u3BBE\uD84F\uDCFF\uD851\uDC04\uD851\uDCD6\u5788\uD851\uDE74\u399B\uD851\uDF2F\uD861\uDDE8\uD866\uDDC9\u3762\uD848\uDDC3\u8B5E\uD862\uDF4E\u99D6\uD852\uDC12\uD852\uDCFB\uD852\uDE15\u7209\uD852\uDEC0\uD843\uDC78\u5965\uD853\uDEA5\uD853\uDF86\uD841\uDF79\u8EDA\uD854\uDC2C\u528F\u573F\u7171\uD854\uDE99\uD855\uDC19\uD84F\uDF4A\uD852\uDEA7\u55BC\uD855\uDC46\uD855\uDC6E\uD85A\uDF52\u91D4\u3473\uD855\uDD3F\uD85D\uDE32\uD855\uDD5E\u4718\uD855\uDD62\uD855\uDD66\uD855\uDFC7\uD852\uDD3F\uD856\uDC5D\u5066\u34FB\uD84C\uDFCC\u60DE\uD856\uDD03\u477C\uD862\uDD48\uD856\uDEAE\uD856\uDF89\uD857\uDC06\uD847\uDD90\u57A1\u7151\u6FB6\uD858\uDD02\uD85F\uDC12\u9056\uD858\uDDB2\uD853\uDF9A\u8B62\uD859\uDC02\uD859\uDC4A\"],\n[\"9c40\",\"\u5D5B\uD85A\uDFF7\u8F36\uD859\uDC84\uD846\uDD1C\u8AEA\uD852\uDDF6\uD859\uDC88\uD84F\uDFEF\uD859\uDD12\u4BC0\uD859\uDDBF\uD859\uDEB5\uD849\uDF1B\u9465\uD855\uDFE1\u6195\u5A27\uD87E\uDCCD\u4FBB\u56B9\uD851\uDD21\uD859\uDEFC\u4E6A\uD852\uDD34\u9656\u6D8F\uD85B\uDCBD\u3618\u8977\uD859\uDF99\uD85A\uDC6E\uD859\uDC11\uD85A\uDC5E\u71DF\uD85A\uDCC7\u7B42\uD864\uDCC0\uD842\uDE11\uD85A\uDD26\u9104\uD85A\uDD39\u7A45\u9DF0\uD85A\uDDFA\u9A26\uD85A\uDE2D\u365F\uD859\uDC69\uD840\uDC21\u7983\uD85A\uDE34\uD85A\uDF5B\u5D2C\uD84D\uDD19\u83CF\uD85A\uDF9D\u46D0\uD85B\uDCA4\u753B\u8865\uD85B\uDDAE\u58B6\"],\n[\"9ca1\",\"\u371C\uD849\uDD8D\uD85C\uDC4B\uD85C\uDDCD\u3C54\uD85C\uDE80\uD85C\uDE85\u9281\uD848\uDD7A\uD85C\uDE8B\u9330\uD85C\uDEE6\uD852\uDDD0\u6C39\u949F\uD85D\uDC50\uD843\uDEF8\u8827\u88F5\uD84A\uDD26\uD861\uDC73\uD845\uDFB1\u6EB8\uD852\uDE2A\uD846\uDC20\u39A4\u36B9\u5C10\u79E3\u453F\u66B6\uD867\uDCAD\uD866\uDCA4\u8943\uD85D\uDFCC\uD85E\uDC58\u56D6\u40DF\uD845\uDE0A\u39A1\uD84D\uDF2F\uD860\uDCE8\uD844\uDFC5\u71AD\u8366\uD85E\uDDDD\uD864\uDDA8\u5A67\u4CB7\uD85C\uDCAF\uD862\uDDAB\uD85E\uDDFD\uD85E\uDE0A\uD85E\uDF0B\uD85F\uDD66\uD850\uDD7A\u7B43\u797E\uD860\uDC09\u6FB5\uD868\uDEDF\u6A03\uD860\uDF18\u53A2\uD85B\uDE07\u93BF\u6836\u975D\uD860\uDD6F\uD860\uDC23\uD85A\uDDB5\uD844\uDFED\uD84C\uDE2F\uD860\uDC48\u5D85\uD863\uDC30\uD860\uDC83\u5715\u9823\uD862\uDD49\u5DAB\uD852\uDD88\u65BE\u69D5\u53D2\uD852\uDEA5\uD84F\uDF81\u3C11\u6736\uD860\uDC90\uD860\uDCF4\uD860\uDD2E\uD847\uDFA1\uD860\uDD4F\"],\n[\"9d40\",\"\uD860\uDD89\uD860\uDDAF\uD860\uDE1A\uD860\uDF06\uD860\uDF2F\uD860\uDF8A\u35CA\uD861\uDC68\uD861\uDEAA\u48FA\u63E6\uD862\uDD56\u7808\u9255\uD862\uDDB8\u43F2\uD862\uDDE7\u43DF\uD862\uDDE8\uD862\uDF46\uD862\uDFD4\u59F8\uD863\uDC09\u8F0B\uD863\uDFC5\uD864\uDCEC\u7B51\uD864\uDD10\uD864\uDD3C\u3DF7\uD864\uDD5E\uD852\uDECA\u8FD0\u728F\u568B\uD865\uDCE7\uD865\uDDE9\uD865\uDDB0\uD865\uDDB8\uD865\uDF32\uD866\uDCD1\uD866\uDD49\uD866\uDD6A\uD866\uDDC3\uD866\uDE28\uD866\uDF0E\uD867\uDD5A\uD867\uDD9B\u7E9F\uD867\uDEF8\uD867\uDF23\u4CA4\u9547\uD868\uDE93\u71A2\uD868\uDEFF\u4D91\u9012\uD869\uDDCB\u4D9C\uD843\uDC9C\u8FBE\u55C1\"],\n[\"9da1\",\"\u8FBA\uD849\uDCB0\u8FB9\uD852\uDE93\u4509\u7E7F\u6F56\u6AB1\u4EEA\u34E4\uD862\uDF2C\uD85E\uDC9D\u373A\u8E80\uD845\uDFF5\uD860\uDC24\uD862\uDF6C\uD862\uDF99\uD85E\uDE3E\uD859\uDEAF\u3DEB\uD85D\uDE55\uD84F\uDCB7\uD855\uDE35\uD856\uDD56\u4E9A\uD857\uDE81\uD858\uDE58\u56BF\uD843\uDE6D\u8E0E\u5B6D\uD84F\uDE88\uD853\uDC9E\u63DE\u62D0\uD845\uDFF6\uD846\uDC7B\u6530\u562D\uD857\uDC4A\u541A\uD854\uDF11\u3DC6\uD867\uDD98\u4C7D\u5622\u561E\u7F49\uD857\uDED8\u5975\uD84F\uDD40\u8770\u4E1C\uD843\uDFEA\uD843\uDD49\uD84D\uDEBA\u8117\u9D5E\u8D18\u763B\u9C45\u764E\u77B9\u9345\u5432\u8148\u82F7\u5625\u8132\u8418\u80BD\u55EA\u7962\u5643\u5416\uD843\uDE9D\u35CE\u5605\u55F1\u66F1\uD860\uDEE2\u362D\u7534\u55F0\u55BA\u5497\u5572\uD843\uDC41\uD843\uDC96\u5ED0\uD854\uDD48\uD843\uDE76\uD84B\uDC62\"],\n[\"9e40\",\"\uD843\uDEA2\u9EAB\u7D5A\u55DE\uD844\uDC75\u629D\u976D\u5494\u8CCD\u71F6\u9176\u63FC\u63B9\u63FE\u5569\uD84A\uDF43\u9C72\uD84B\uDEB3\u519A\u34DF\uD843\uDDA7\u51A7\u544D\u551E\u5513\u7666\u8E2D\uD85A\uDC8A\u75B1\u80B6\u8804\u8786\u88C7\u81B6\u841C\uD844\uDCC1\u44EC\u7304\uD851\uDF06\u5B90\u830B\uD85A\uDC93\u567B\uD849\uDEF4\uD85F\uDD2F\uD850\uDDA3\uD85F\uDD73\uD85B\uDED0\uD85C\uDEB6\u9170\uD844\uDDD9\u9208\uD84F\uDCFC\uD869\uDEA9\uD843\uDEAC\uD843\uDEF9\u7266\uD847\uDCA2\u474E\uD853\uDFC2\uD85F\uDFF9\uD843\uDFEB\u40FA\"],\n[\"9ea1\",\"\u9C5D\u651F\uD84B\uDDA0\u48F3\uD851\uDFE0\uD867\uDD7C\uD843\uDFEC\uD843\uDE0A\u6062\uD85D\uDDA3\uD843\uDFED\"],\n[\"9ead\",\"\uD858\uDC48\uD844\uDD87\u71A3\u7E8E\u9D50\u4E1A\u4E04\u3577\u5B0D\u6CB2\u5367\u36AC\u39DC\u537D\u36A5\uD851\uDE18\u589A\uD852\uDF6E\u822D\u544B\u57AA\uD856\uDE95\uD842\uDD79\"],\n[\"9ec5\",\"\u3A52\uD849\uDC65\u7374\uD867\uDEAC\u4D09\u9BED\uD84F\uDCFE\uD867\uDF30\u4C5B\uD853\uDFA9\uD865\uDD9E\uD867\uDFDE\u845C\uD84F\uDDB6\uD85C\uDEB2\uD859\uDFB3\uD84D\uDF20\u632E\u7D25\uD84F\uDEF7\uD84F\uDE2C\u3A2A\u9008\u52CC\u3E74\u367A\u45E9\uD841\uDC8E\u7640\u5AF0\uD843\uDEB6\u787A\uD85F\uDF2E\u58A7\u40BF\u567C\u9B8B\u5D74\u7654\uD869\uDC34\u9E85\u4CE1\u75F9\u37FB\u6119\uD84C\uDCDA\uD850\uDFF2\"],\n[\"9ef5\",\"\u565D\uD844\uDEA9\u57A7\uD852\uDD63\uD867\uDE06\u5234\uD85C\uDCAE\u35AD\u6C4A\u9D7C\"],\n[\"9f40\",\"\u7C56\u9B39\u57DE\uD845\uDF6C\u5C53\u64D3\uD865\uDCD0\uD858\uDF35\uD85C\uDD64\u86AD\uD843\uDD28\uD85B\uDD22\uD852\uDEE2\uD843\uDD71\"],\n[\"9f4f\",\"\u51FE\uD847\uDF0F\u5D8E\u9703\uD847\uDDD1\u9E81\u904C\u7B1F\u9B02\u5CD1\u7BA3\u6268\u6335\u9AFF\u7BCF\u9B2A\u7C7E\u9B2E\u7C42\u7C86\u9C15\u7BFC\u9B09\u9F17\u9C1B\uD852\uDD3E\u9F5A\u5573\u5BC3\u4FFD\u9E98\u4FF2\u5260\u3E06\u52D1\u5767\u5056\u59B7\u5E12\u97C8\u9DAB\u8F5C\u5469\u97B4\u9940\u97BA\u532C\u6130\"],\n[\"9fa1\",\"\u692C\u53DA\u9C0A\u9D02\u4C3B\u9641\u6980\u50A6\u7546\uD845\uDF6D\u99DA\u5273\"],\n[\"9fae\",\"\u9159\u9681\u915C\"],\n[\"9fb2\",\"\u9151\uD863\uDE97\u637F\uD85B\uDD23\u6ACA\u5611\u918E\u757A\u6285\uD840\uDFFC\u734F\u7C70\uD857\uDC21\uD84F\uDCFD\"],\n[\"9fc1\",\"\uD852\uDD19\u76D6\u9B9D\u4E2A\uD843\uDCD4\u83BE\u8842\"],\n[\"9fc9\",\"\u5C4A\u69C0\u50ED\u577A\u521F\u5DF5\u4ECE\u6C31\uD840\uDDF2\u4F39\u549C\u54DA\u529A\u8D82\u35FE\u5F0C\u35F3\"],\n[\"9fdb\",\"\u6B52\u917C\u9FA5\u9B97\u982E\u98B4\u9ABA\u9EA8\u9E84\u717A\u7B14\"],\n[\"9fe7\",\"\u6BFA\u8818\u7F78\"],\n[\"9feb\",\"\u5620\uD869\uDE4A\u8E77\u9F53\"],\n[\"9ff0\",\"\u8DD4\u8E4F\u9E1C\u8E01\u6282\uD860\uDF7D\u8E28\u8E75\u7AD3\uD852\uDE77\u7A3E\u78D8\u6CEA\u8A67\u7607\"],\n[\"a040\",\"\uD862\uDE5A\u9F26\u6CCE\u87D6\u75C3\uD868\uDEB2\u7853\uD87E\uDC40\u8D0C\u72E2\u7371\u8B2D\u7302\u74F1\u8CEB\uD852\uDEBB\u862F\u5FBA\u88A0\u44B7\"],\n[\"a055\",\"\uD846\uDC3B\uD85B\uDE05\"],\n[\"a058\",\"\u8A7E\uD849\uDD1B\"],\n[\"a05b\",\"\u60FD\u7667\u9AD7\u9D44\u936E\u9B8F\u87F5\"],\n[\"a063\",\"\u880F\u8CF7\u732C\u9721\u9BB0\u35D6\u72B2\u4C07\u7C51\u994A\uD858\uDD59\u6159\u4C04\u9E96\u617D\"],\n[\"a073\",\"\u575F\u616F\u62A6\u6239\u62CE\u3A5C\u61E2\u53AA\uD84C\uDFF5\u6364\u6802\u35D2\"],\n[\"a0a1\",\"\u5D57\uD862\uDFC2\u8FDA\uD863\uDE39\"],\n[\"a0a6\",\"\u50D9\uD847\uDD46\u7906\u5332\u9638\uD843\uDF3B\u4065\"],\n[\"a0ae\",\"\u77FE\"],\n[\"a0b0\",\"\u7CC2\uD857\uDF1A\u7CDA\u7A2D\u8066\u8063\u7D4D\u7505\u74F2\u8994\u821A\u670C\u8062\uD85D\uDC86\u805B\u74F0\u8103\u7724\u8989\uD859\uDFCC\u7553\uD85B\uDED1\u87A9\u87CE\u81C8\u878C\u8A49\u8CAD\u8B43\u772B\u74F8\u84DA\u3635\u69B2\u8DA6\"],\n[\"a0d4\",\"\u89A9\u7468\u6DB9\u87C1\uD850\uDC11\u74E7\u3DDB\u7176\u60A4\u619C\u3CD1\u7162\u6077\"],\n[\"a0e2\",\"\u7F71\uD862\uDF2D\u7250\u60E9\u4B7E\u5220\u3C18\uD84F\uDCC7\uD857\uDED7\uD85D\uDE56\uD855\uDD31\uD846\uDD44\uD844\uDEFE\uD866\uDD03\uD85B\uDDDC\uD85C\uDCAD\u5CC1\uD858\uDDAD\uD862\uDE0F\uD84D\uDE77\uD840\uDCEE\uD85A\uDC46\uD853\uDF0E\u4562\u5B1F\uD858\uDF4C\u9F50\u9EA6\uD858\uDE6B\"],\n[\"a3c0\",\"\u2400\",31,\"\u2421\"],\n[\"c6a1\",\"\u2460\",9,\"\u2474\",9,\"\u2170\",9,\"\u4E36\u4E3F\u4E85\u4EA0\u5182\u5196\u51AB\u52F9\u5338\u5369\u53B6\u590A\u5B80\u5DDB\u2F33\u5E7F\u5EF4\u5F50\u5F61\u6534\u65E0\u7592\u7676\u8FB5\u96B6\u00A8\u02C6\u30FD\u30FE\u309D\u309E\u3003\u4EDD\u3005\u3006\u3007\u30FC\uFF3B\uFF3D\u273D\u3041\",23],\n[\"c740\",\"\u3059\",58,\"\u30A1\u30A2\u30A3\u30A4\"],\n[\"c7a1\",\"\u30A5\",81,\"\u0410\",5,\"\u0401\u0416\",4],\n[\"c840\",\"\u041B\",26,\"\u0451\u0436\",25,\"\u21E7\u21B8\u21B9\u31CF\uD840\uDCCC\u4E5A\uD840\uDC8A\u5202\u4491\"],\n[\"c8a1\",\"\u9FB0\u5188\u9FB1\uD85D\uDE07\"],\n[\"c8cd\",\"\uFFE2\uFFE4\uFF07\uFF02\u3231\u2116\u2121\u309B\u309C\u2E80\u2E84\u2E86\u2E87\u2E88\u2E8A\u2E8C\u2E8D\u2E95\u2E9C\u2E9D\u2EA5\u2EA7\u2EAA\u2EAC\u2EAE\u2EB6\u2EBC\u2EBE\u2EC6\u2ECA\u2ECC\u2ECD\u2ECF\u2ED6\u2ED7\u2EDE\u2EE3\"],\n[\"c8f5\",\"\u0283\u0250\u025B\u0254\u0275\u0153\u00F8\u014B\u028A\u026A\"],\n[\"f9fe\",\"\uFFED\"],\n[\"fa40\",\"\uD841\uDD47\u92DB\uD841\uDDDF\uD84F\uDFC5\u854C\u42B5\u73EF\u51B5\u3649\uD852\uDD42\uD862\uDDE4\u9344\uD846\uDDDB\u82EE\uD84F\uDCC8\u783C\u6744\u62DF\uD852\uDD33\uD862\uDDAA\uD840\uDEA0\uD85A\uDFB3\uD844\uDF05\u4FAB\uD849\uDCED\u5008\uD85B\uDD29\uD85E\uDE84\uD84D\uDE00\uD852\uDEB1\uD849\uDD13\u5029\uD840\uDF7E\u5FA4\uD840\uDF80\uD840\uDF47\u6EDB\uD841\uDC1F\u507D\u5101\u347A\u510E\u986C\u3743\u8416\uD852\uDDA4\uD841\uDC87\u5160\uD84C\uDFB4\u516A\uD842\uDFFF\uD848\uDCFC\uD840\uDEE5\uD849\uDD30\uD841\uDD8E\uD84C\uDE33\uD846\uDD83\u5B82\u877D\uD841\uDDB3\uD84F\uDC99\u51B2\u51B8\"],\n[\"faa1\",\"\u9D34\u51C9\u51CF\u51D1\u3CDC\u51D3\uD852\uDEA6\u51B3\u51E2\u5342\u51ED\u83CD\u693E\uD84D\uDF2D\u5F7B\u520B\u5226\u523C\u52B5\u5257\u5294\u52B9\u52C5\u7C15\u8542\u52E0\u860D\uD85A\uDF13\u5305\uD862\uDEDE\u5549\u6ED9\uD84F\uDF80\uD842\uDD54\uD84F\uDFEC\u5333\u5344\uD842\uDFE2\u6CCB\uD845\uDF26\u681B\u73D5\u604A\u3EAA\u38CC\uD845\uDEE8\u71DD\u44A2\u536D\u5374\uD861\uDEAB\u537E\u537F\uD845\uDD96\uD845\uDE13\u77E6\u5393\uD862\uDE9B\u53A0\u53AB\u53AE\u73A7\uD855\uDF72\u3F59\u739C\u53C1\u53C5\u6C49\u4E49\u57FE\u53D9\u3AAB\uD842\uDF8F\u53E0\uD84F\uDFEB\uD84B\uDDA3\u53F6\uD843\uDC77\u5413\u7079\u552B\u6657\u6D5B\u546D\uD85A\uDF53\uD843\uDD74\u555D\u548F\u54A4\u47A6\uD845\uDF0D\uD843\uDEDD\u3DB4\uD843\uDD4D\"],\n[\"fb40\",\"\uD862\uDDBC\uD849\uDE98\u5547\u4CED\u542F\u7417\u5586\u55A9\u5605\uD846\uDCD7\uD850\uDC3A\u4552\uD851\uDC35\u66B3\uD844\uDCB4\u5637\u66CD\uD84C\uDE8A\u66A4\u66AD\u564D\u564F\u78F1\u56F1\u9787\u53FE\u5700\u56EF\u56ED\uD862\uDF66\u3623\uD844\uDE4F\u5746\uD850\uDDA5\u6C6E\u708B\u5742\u36B1\uD85B\uDC7E\u57E6\uD845\uDC16\u5803\uD845\uDC54\uD850\uDF63\u5826\uD852\uDFF5\u585C\u58AA\u3561\u58E0\u58DC\uD844\uDE3C\u58FB\u5BFF\u5743\uD868\uDD50\uD850\uDE78\u93D3\u35A1\u591F\u68A6\u36C3\u6E59\"],\n[\"fba1\",\"\uD845\uDE3E\u5A24\u5553\uD845\uDE92\u8505\u59C9\uD843\uDD4E\uD85B\uDC81\uD85B\uDD2A\uD845\uDFDC\u59D9\uD845\uDFFB\uD845\uDFB2\uD85B\uDDA6\u6D71\uD846\uDC28\uD845\uDED5\u59F9\uD85B\uDE45\u5AAB\u5A63\u36E6\uD852\uDDA9\u5A77\u3708\u5A96\u7465\u5AD3\uD85B\uDFA1\uD849\uDD54\u3D85\uD846\uDD11\u3732\uD845\uDEB8\u5E83\u52D0\u5B76\u6588\u5B7C\uD85E\uDE0E\u4004\u485D\uD840\uDE04\u5BD5\u6160\uD846\uDE34\uD856\uDDCC\uD841\uDDA5\u5BF3\u5B9D\u4D10\u5C05\uD846\uDF44\u5C13\u73CE\u5C14\uD847\uDCA5\uD85A\uDF28\u5C49\u48DD\u5C85\u5CE9\u5CEF\u5D8B\uD847\uDDF9\uD847\uDE37\u5D10\u5D18\u5D46\uD847\uDEA4\u5CBA\u5DD7\u82FC\u382D\uD852\uDD01\uD848\uDC49\uD848\uDD73\u8287\u3836\u3BC2\u5E2E\u6A8A\u5E75\u5E7A\uD851\uDCBC\uD843\uDCD3\u53A6\u4EB7\u5ED0\u53A8\uD845\uDF71\u5E09\u5EF4\uD861\uDC82\"],\n[\"fc40\",\"\u5EF9\u5EFB\u38A0\u5EFC\u683E\u941B\u5F0D\uD840\uDDC1\uD87E\uDC94\u3ADE\u48AE\uD844\uDF3A\u5F3A\uD85A\uDC88\uD848\uDFD0\u5F58\uD849\uDC71\u5F63\u97BD\uD85B\uDE6E\u5F72\u9340\uD862\uDE36\u5FA7\u5DB6\u3D5F\uD854\uDE50\uD847\uDF6A\uD85C\uDCF8\uD849\uDE68\u91D6\uD840\uDE9E\uD862\uDE29\u6031\u6685\uD846\uDC77\u3963\u3DC7\u3639\u5790\uD849\uDFB4\u7971\u3E40\u609E\u60A4\u60B3\uD852\uDD82\uD852\uDD8F\uD85E\uDE53\u74A4\u50E1\u5AA0\u6164\u8424\u6142\uD87E\uDCA6\uD85B\uDED2\u6181\u51F4\uD841\uDE56\u6187\u5BAA\uD84F\uDFB7\"],\n[\"fca1\",\"\uD84A\uDC5F\u61D3\uD862\uDF9D\uD866\uDD5D\u61D0\u3932\uD84A\uDD80\uD84A\uDCC1\u6023\u615C\u651E\u638B\uD840\uDD18\u62C5\uD845\uDF70\u62D5\uD84B\uDE0D\u636C\uD852\uDDDF\u3A17\u6438\u63F8\uD844\uDF8E\uD845\uDFFC\u6490\u6F8A\uD84B\uDE36\u9814\uD850\uDC8C\uD855\uDF1D\u64E1\u64E5\u947B\u3A66\u643A\u3A57\u654D\u6F16\uD852\uDE28\uD852\uDE23\u6585\u656D\u655F\uD84C\uDC7E\u65B5\uD852\uDD40\u4B37\u65D1\u40D8\uD846\uDC29\u65E0\u65E3\u5FDF\uD84D\uDC00\u6618\uD84C\uDDF7\uD84C\uDDF8\u6644\uD84C\uDDA4\uD84C\uDDA5\u664B\uD843\uDE75\u6667\uD854\uDDE6\u6673\u6674\uD847\uDE3D\uD84C\uDE31\uD861\uDDF4\uD84C\uDDC8\uD854\uDF13\u77C5\uD84A\uDCF7\u99A4\u6702\uD850\uDF9C\uD852\uDE21\u3B2B\u69FA\uD84D\uDFC2\u675E\u6767\u6762\uD850\uDDCD\uD864\uDCED\u67D7\u44E9\u6822\u6E50\u923C\u6801\uD84C\uDFE6\uD85B\uDDA0\u685D\"],\n[\"fd40\",\"\uD84D\uDC6F\u69E1\u6A0B\uD862\uDEDF\u6973\u68C3\uD84D\uDDCD\u6901\u6900\u3D32\u3A01\uD84D\uDE3C\u3B80\u67AC\u6961\uD862\uDE4A\u42FC\u6936\u6998\u3BA1\uD840\uDFC9\u8363\u5090\u69F9\uD84D\uDE59\uD848\uDD2A\u6A45\uD84D\uDF03\u6A9D\u3BF3\u67B1\u6AC8\uD864\uDD9C\u3C0D\u6B1D\uD842\uDD23\u60DE\u6B35\u6B74\uD849\uDFCD\u6EB5\uD84E\uDEDB\uD840\uDFB5\uD846\uDD58\u3740\u5421\uD84E\uDF5A\u6BE1\uD84F\uDEFC\u6BDC\u6C37\uD849\uDC8B\uD852\uDCF1\uD85A\uDF51\u6C5A\u8226\u6C79\uD84F\uDDBC\u44C5\uD84F\uDDBD\uD850\uDDA4\uD852\uDD0C\uD852\uDD00\"],\n[\"fda1\",\"\uD84F\uDCC9\u36E5\u3CEB\uD843\uDD32\u9B83\uD84C\uDDF9\uD849\uDC91\u7F8F\u6837\uD85B\uDD25\uD85B\uDDA1\uD85B\uDDEB\u6D96\u6D5C\u6E7C\u6F04\uD852\uDD7F\uD850\uDC85\uD85B\uDE72\u8533\uD85B\uDF74\u51C7\u6C9C\u6E1D\u842E\uD862\uDF21\u6E2F\uD84F\uDE2F\u7453\uD84F\uDF82\u79CC\u6E4F\u5A91\uD84C\uDC4B\u6FF8\u370D\u6F9D\uD84F\uDE30\u6EFA\uD845\uDC97\uD850\uDC3D\u4555\u93F0\u6F44\u6F5C\u3D4E\u6F74\uD864\uDD70\u3D3B\u6F9F\uD850\uDD44\u6FD3\uD850\uDC91\uD850\uDD55\uD850\uDC39\uD84F\uDFF0\uD84F\uDFB4\uD850\uDD3F\u51DF\uD850\uDD56\uD850\uDD57\uD850\uDD40\uD858\uDDDD\u704B\u707E\u70A7\u7081\u70CC\u70D5\u70D6\u70DF\u4104\u3DE8\u71B4\u7196\uD850\uDE77\u712B\u7145\u5A88\u714A\u716E\u5C9C\uD850\uDF65\u714F\u9362\uD850\uDEC1\u712C\uD851\uDC5A\uD852\uDE27\uD852\uDE22\u71BA\uD862\uDFE8\u70BD\u720E\"],\n[\"fe40\",\"\u9442\u7215\u5911\u9443\u7224\u9341\uD855\uDE05\u722E\u7240\uD852\uDD74\u68BD\u7255\u7257\u3E55\uD84C\uDC44\u680D\u6F3D\u7282\u732A\u732B\uD852\uDC23\uD862\uDC2B\u48ED\uD862\uDC04\u7328\u732E\u73CF\u73AA\uD843\uDC3A\uD85A\uDE2E\u73C9\u7449\uD850\uDDE2\uD845\uDEE7\uD852\uDE24\u6623\u36C5\uD852\uDDB7\uD852\uDD8D\uD852\uDDFB\u73F7\u7415\u6903\uD852\uDE26\u7439\uD841\uDDC3\u3ED7\u745C\uD84A\uDCAD\u7460\uD863\uDEB2\u7447\u73E4\u7476\u83B9\u746C\u3730\u7474\u93F1\u6A2C\u7482\u4953\uD852\uDE8C\"],\n[\"fea1\",\"\uD850\uDD5F\uD852\uDE79\uD862\uDF8F\u5B46\uD863\uDC03\uD846\uDC9E\u74C8\uD846\uDD88\u750E\u74E9\u751E\uD863\uDED9\uD846\uDE4B\u5BD7\uD863\uDEAC\u9385\u754D\u754A\u7567\u756E\uD853\uDF82\u3F04\uD853\uDD13\u758E\u745D\u759E\u75B4\u7602\u762C\u7651\u764F\u766F\u7676\uD858\uDFF5\u7690\u81EF\u37F8\uD85A\uDD11\uD85A\uDD0E\u76A1\u76A5\u76B7\u76CC\uD85B\uDF9F\u8462\uD854\uDC9D\uD854\uDD7D\uD847\uDE1C\u771E\u7726\u7740\u64AF\uD854\uDE20\u7758\uD84C\uDEAC\u77AF\uD862\uDD64\uD862\uDD68\uD845\uDEC1\u77F4\u7809\uD844\uDF76\uD852\uDE12\u68CA\u78AF\u78C7\u78D3\u96A5\u792E\uD855\uDDE0\u78D7\u7934\u78B1\uD85D\uDE0C\u8FB8\u8884\uD862\uDF2B\uD858\uDC83\uD849\uDE1C\u7986\u8900\u6902\u7980\uD856\uDC57\u799D\uD85E\uDF39\u793C\u79A9\u6E2A\uD85C\uDD26\u3EA8\u79C6\uD864\uDD0D\u79D4\"]\n]\n", "\"use strict\";\n\n// Description of supported double byte encodings and aliases.\n// Tables are not require()-d until they are needed to speed up library load.\n// require()-s are direct to support Browserify.\n\nmodule.exports = {\n    \n    // == Japanese/ShiftJIS ====================================================\n    // All japanese encodings are based on JIS X set of standards:\n    // JIS X 0201 - Single-byte encoding of ASCII + \u00A5 + Kana chars at 0xA1-0xDF.\n    // JIS X 0208 - Main set of 6879 characters, placed in 94x94 plane, to be encoded by 2 bytes. \n    //              Has several variations in 1978, 1983, 1990 and 1997.\n    // JIS X 0212 - Supplementary plane of 6067 chars in 94x94 plane. 1990. Effectively dead.\n    // JIS X 0213 - Extension and modern replacement of 0208 and 0212. Total chars: 11233.\n    //              2 planes, first is superset of 0208, second - revised 0212.\n    //              Introduced in 2000, revised 2004. Some characters are in Unicode Plane 2 (0x2xxxx)\n\n    // Byte encodings are:\n    //  * Shift_JIS: Compatible with 0201, uses not defined chars in top half as lead bytes for double-byte\n    //               encoding of 0208. Lead byte ranges: 0x81-0x9F, 0xE0-0xEF; Trail byte ranges: 0x40-0x7E, 0x80-0x9E, 0x9F-0xFC.\n    //               Windows CP932 is a superset of Shift_JIS. Some companies added more chars, notably KDDI.\n    //  * EUC-JP:    Up to 3 bytes per character. Used mostly on *nixes.\n    //               0x00-0x7F       - lower part of 0201\n    //               0x8E, 0xA1-0xDF - upper part of 0201\n    //               (0xA1-0xFE)x2   - 0208 plane (94x94).\n    //               0x8F, (0xA1-0xFE)x2 - 0212 plane (94x94).\n    //  * JIS X 208: 7-bit, direct encoding of 0208. Byte ranges: 0x21-0x7E (94 values). Uncommon.\n    //               Used as-is in ISO2022 family.\n    //  * ISO2022-JP: Stateful encoding, with escape sequences to switch between ASCII, \n    //                0201-1976 Roman, 0208-1978, 0208-1983.\n    //  * ISO2022-JP-1: Adds esc seq for 0212-1990.\n    //  * ISO2022-JP-2: Adds esc seq for GB2313-1980, KSX1001-1992, ISO8859-1, ISO8859-7.\n    //  * ISO2022-JP-3: Adds esc seq for 0201-1976 Kana set, 0213-2000 Planes 1, 2.\n    //  * ISO2022-JP-2004: Adds 0213-2004 Plane 1.\n    //\n    // After JIS X 0213 appeared, Shift_JIS-2004, EUC-JISX0213 and ISO2022-JP-2004 followed, with just changing the planes.\n    //\n    // Overall, it seems that it's a mess :( http://www8.plala.or.jp/tkubota1/unicode-symbols-map2.html\n\n    'shiftjis': {\n        type: '_dbcs',\n        table: function() { return require('./tables/shiftjis.json') },\n        encodeAdd: {'\\u00a5': 0x5C, '\\u203E': 0x7E},\n        encodeSkipVals: [{from: 0xED40, to: 0xF940}],\n    },\n    'csshiftjis': 'shiftjis',\n    'mskanji': 'shiftjis',\n    'sjis': 'shiftjis',\n    'windows31j': 'shiftjis',\n    'ms31j': 'shiftjis',\n    'xsjis': 'shiftjis',\n    'windows932': 'shiftjis',\n    'ms932': 'shiftjis',\n    '932': 'shiftjis',\n    'cp932': 'shiftjis',\n\n    'eucjp': {\n        type: '_dbcs',\n        table: function() { return require('./tables/eucjp.json') },\n        encodeAdd: {'\\u00a5': 0x5C, '\\u203E': 0x7E},\n    },\n\n    // TODO: KDDI extension to Shift_JIS\n    // TODO: IBM CCSID 942 = CP932, but F0-F9 custom chars and other char changes.\n    // TODO: IBM CCSID 943 = Shift_JIS = CP932 with original Shift_JIS lower 128 chars.\n\n\n    // == Chinese/GBK ==========================================================\n    // http://en.wikipedia.org/wiki/GBK\n    // We mostly implement W3C recommendation: https://www.w3.org/TR/encoding/#gbk-encoder\n\n    // Oldest GB2312 (1981, ~7600 chars) is a subset of CP936\n    'gb2312': 'cp936',\n    'gb231280': 'cp936',\n    'gb23121980': 'cp936',\n    'csgb2312': 'cp936',\n    'csiso58gb231280': 'cp936',\n    'euccn': 'cp936',\n\n    // Microsoft's CP936 is a subset and approximation of GBK.\n    'windows936': 'cp936',\n    'ms936': 'cp936',\n    '936': 'cp936',\n    'cp936': {\n        type: '_dbcs',\n        table: function() { return require('./tables/cp936.json') },\n    },\n\n    // GBK (~22000 chars) is an extension of CP936 that added user-mapped chars and some other.\n    'gbk': {\n        type: '_dbcs',\n        table: function() { return require('./tables/cp936.json').concat(require('./tables/gbk-added.json')) },\n    },\n    'xgbk': 'gbk',\n    'isoir58': 'gbk',\n\n    // GB18030 is an algorithmic extension of GBK.\n    // Main source: https://www.w3.org/TR/encoding/#gbk-encoder\n    // http://icu-project.org/docs/papers/gb18030.html\n    // http://source.icu-project.org/repos/icu/data/trunk/charset/data/xml/gb-18030-2000.xml\n    // http://www.khngai.com/chinese/charmap/tblgbk.php?page=0\n    'gb18030': {\n        type: '_dbcs',\n        table: function() { return require('./tables/cp936.json').concat(require('./tables/gbk-added.json')) },\n        gb18030: function() { return require('./tables/gb18030-ranges.json') },\n        encodeSkipVals: [0x80],\n        encodeAdd: {'\u20AC': 0xA2E3},\n    },\n\n    'chinese': 'gb18030',\n\n\n    // == Korean ===============================================================\n    // EUC-KR, KS_C_5601 and KS X 1001 are exactly the same.\n    'windows949': 'cp949',\n    'ms949': 'cp949',\n    '949': 'cp949',\n    'cp949': {\n        type: '_dbcs',\n        table: function() { return require('./tables/cp949.json') },\n    },\n\n    'cseuckr': 'cp949',\n    'csksc56011987': 'cp949',\n    'euckr': 'cp949',\n    'isoir149': 'cp949',\n    'korean': 'cp949',\n    'ksc56011987': 'cp949',\n    'ksc56011989': 'cp949',\n    'ksc5601': 'cp949',\n\n\n    // == Big5/Taiwan/Hong Kong ================================================\n    // There are lots of tables for Big5 and cp950. Please see the following links for history:\n    // http://moztw.org/docs/big5/  http://www.haible.de/bruno/charsets/conversion-tables/Big5.html\n    // Variations, in roughly number of defined chars:\n    //  * Windows CP 950: Microsoft variant of Big5. Canonical: http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP950.TXT\n    //  * Windows CP 951: Microsoft variant of Big5-HKSCS-2001. Seems to be never public. http://me.abelcheung.org/articles/research/what-is-cp951/\n    //  * Big5-2003 (Taiwan standard) almost superset of cp950.\n    //  * Unicode-at-on (UAO) / Mozilla 1.8. Falling out of use on the Web. Not supported by other browsers.\n    //  * Big5-HKSCS (-2001, -2004, -2008). Hong Kong standard. \n    //    many unicode code points moved from PUA to Supplementary plane (U+2XXXX) over the years.\n    //    Plus, it has 4 combining sequences.\n    //    Seems that Mozilla refused to support it for 10 yrs. https://bugzilla.mozilla.org/show_bug.cgi?id=162431 https://bugzilla.mozilla.org/show_bug.cgi?id=310299\n    //    because big5-hkscs is the only encoding to include astral characters in non-algorithmic way.\n    //    Implementations are not consistent within browsers; sometimes labeled as just big5.\n    //    MS Internet Explorer switches from big5 to big5-hkscs when a patch applied.\n    //    Great discussion & recap of what's going on https://bugzilla.mozilla.org/show_bug.cgi?id=912470#c31\n    //    In the encoder, it might make sense to support encoding old PUA mappings to Big5 bytes seq-s.\n    //    Official spec: http://www.ogcio.gov.hk/en/business/tech_promotion/ccli/terms/doc/2003cmp_2008.txt\n    //                   http://www.ogcio.gov.hk/tc/business/tech_promotion/ccli/terms/doc/hkscs-2008-big5-iso.txt\n    // \n    // Current understanding of how to deal with Big5(-HKSCS) is in the Encoding Standard, http://encoding.spec.whatwg.org/#big5-encoder\n    // Unicode mapping (http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/OTHER/BIG5.TXT) is said to be wrong.\n\n    'windows950': 'cp950',\n    'ms950': 'cp950',\n    '950': 'cp950',\n    'cp950': {\n        type: '_dbcs',\n        table: function() { return require('./tables/cp950.json') },\n    },\n\n    // Big5 has many variations and is an extension of cp950. We use Encoding Standard's as a consensus.\n    'big5': 'big5hkscs',\n    'big5hkscs': {\n        type: '_dbcs',\n        table: function() { return require('./tables/cp950.json').concat(require('./tables/big5-added.json')) },\n        encodeSkipVals: [0xa2cc],\n    },\n\n    'cnbig5': 'big5hkscs',\n    'csbig5': 'big5hkscs',\n    'xxbig5': 'big5hkscs',\n};\n", "\"use strict\";\n\n// Update this array if you add/rename/remove files in this directory.\n// We support Browserify by skipping automatic module discovery and requiring modules directly.\nvar modules = [\n    require(\"./internal\"),\n    require(\"./utf16\"),\n    require(\"./utf7\"),\n    require(\"./sbcs-codec\"),\n    require(\"./sbcs-data\"),\n    require(\"./sbcs-data-generated\"),\n    require(\"./dbcs-codec\"),\n    require(\"./dbcs-data\"),\n];\n\n// Put all encoding/alias/codec definitions to single object and export it. \nfor (var i = 0; i < modules.length; i++) {\n    var module = modules[i];\n    for (var enc in module)\n        if (Object.prototype.hasOwnProperty.call(module, enc))\n            exports[enc] = module[enc];\n}\n", "\"use strict\";\n\nvar Buffer = require(\"buffer\").Buffer,\n    Transform = require(\"stream\").Transform;\n\n\n// == Exports ==================================================================\nmodule.exports = function(iconv) {\n    \n    // Additional Public API.\n    iconv.encodeStream = function encodeStream(encoding, options) {\n        return new IconvLiteEncoderStream(iconv.getEncoder(encoding, options), options);\n    }\n\n    iconv.decodeStream = function decodeStream(encoding, options) {\n        return new IconvLiteDecoderStream(iconv.getDecoder(encoding, options), options);\n    }\n\n    iconv.supportsStreams = true;\n\n\n    // Not published yet.\n    iconv.IconvLiteEncoderStream = IconvLiteEncoderStream;\n    iconv.IconvLiteDecoderStream = IconvLiteDecoderStream;\n    iconv._collect = IconvLiteDecoderStream.prototype.collect;\n};\n\n\n// == Encoder stream =======================================================\nfunction IconvLiteEncoderStream(conv, options) {\n    this.conv = conv;\n    options = options || {};\n    options.decodeStrings = false; // We accept only strings, so we don't need to decode them.\n    Transform.call(this, options);\n}\n\nIconvLiteEncoderStream.prototype = Object.create(Transform.prototype, {\n    constructor: { value: IconvLiteEncoderStream }\n});\n\nIconvLiteEncoderStream.prototype._transform = function(chunk, encoding, done) {\n    if (typeof chunk != 'string')\n        return done(new Error(\"Iconv encoding stream needs strings as its input.\"));\n    try {\n        var res = this.conv.write(chunk);\n        if (res && res.length) this.push(res);\n        done();\n    }\n    catch (e) {\n        done(e);\n    }\n}\n\nIconvLiteEncoderStream.prototype._flush = function(done) {\n    try {\n        var res = this.conv.end();\n        if (res && res.length) this.push(res);\n        done();\n    }\n    catch (e) {\n        done(e);\n    }\n}\n\nIconvLiteEncoderStream.prototype.collect = function(cb) {\n    var chunks = [];\n    this.on('error', cb);\n    this.on('data', function(chunk) { chunks.push(chunk); });\n    this.on('end', function() {\n        cb(null, Buffer.concat(chunks));\n    });\n    return this;\n}\n\n\n// == Decoder stream =======================================================\nfunction IconvLiteDecoderStream(conv, options) {\n    this.conv = conv;\n    options = options || {};\n    options.encoding = this.encoding = 'utf8'; // We output strings.\n    Transform.call(this, options);\n}\n\nIconvLiteDecoderStream.prototype = Object.create(Transform.prototype, {\n    constructor: { value: IconvLiteDecoderStream }\n});\n\nIconvLiteDecoderStream.prototype._transform = function(chunk, encoding, done) {\n    if (!Buffer.isBuffer(chunk))\n        return done(new Error(\"Iconv decoding stream needs buffers as its input.\"));\n    try {\n        var res = this.conv.write(chunk);\n        if (res && res.length) this.push(res, this.encoding);\n        done();\n    }\n    catch (e) {\n        done(e);\n    }\n}\n\nIconvLiteDecoderStream.prototype._flush = function(done) {\n    try {\n        var res = this.conv.end();\n        if (res && res.length) this.push(res, this.encoding);                \n        done();\n    }\n    catch (e) {\n        done(e);\n    }\n}\n\nIconvLiteDecoderStream.prototype.collect = function(cb) {\n    var res = '';\n    this.on('error', cb);\n    this.on('data', function(chunk) { res += chunk; });\n    this.on('end', function() {\n        cb(null, res);\n    });\n    return this;\n}\n\n", "\"use strict\";\nvar Buffer = require(\"buffer\").Buffer;\n// Note: not polyfilled with safer-buffer on a purpose, as overrides Buffer\n\n// == Extend Node primitives to use iconv-lite =================================\n\nmodule.exports = function (iconv) {\n    var original = undefined; // Place to keep original methods.\n\n    // Node authors rewrote Buffer internals to make it compatible with\n    // Uint8Array and we cannot patch key functions since then.\n    // Note: this does use older Buffer API on a purpose\n    iconv.supportsNodeEncodingsExtension = !(Buffer.from || new Buffer(0) instanceof Uint8Array);\n\n    iconv.extendNodeEncodings = function extendNodeEncodings() {\n        if (original) return;\n        original = {};\n\n        if (!iconv.supportsNodeEncodingsExtension) {\n            console.error(\"ACTION NEEDED: require('iconv-lite').extendNodeEncodings() is not supported in your version of Node\");\n            console.error(\"See more info at https://github.com/ashtuchkin/iconv-lite/wiki/Node-v4-compatibility\");\n            return;\n        }\n\n        var nodeNativeEncodings = {\n            'hex': true, 'utf8': true, 'utf-8': true, 'ascii': true, 'binary': true, \n            'base64': true, 'ucs2': true, 'ucs-2': true, 'utf16le': true, 'utf-16le': true,\n        };\n\n        Buffer.isNativeEncoding = function(enc) {\n            return enc && nodeNativeEncodings[enc.toLowerCase()];\n        }\n\n        // -- SlowBuffer -----------------------------------------------------------\n        var SlowBuffer = require('buffer').SlowBuffer;\n\n        original.SlowBufferToString = SlowBuffer.prototype.toString;\n        SlowBuffer.prototype.toString = function(encoding, start, end) {\n            encoding = String(encoding || 'utf8').toLowerCase();\n\n            // Use native conversion when possible\n            if (Buffer.isNativeEncoding(encoding))\n                return original.SlowBufferToString.call(this, encoding, start, end);\n\n            // Otherwise, use our decoding method.\n            if (typeof start == 'undefined') start = 0;\n            if (typeof end == 'undefined') end = this.length;\n            return iconv.decode(this.slice(start, end), encoding);\n        }\n\n        original.SlowBufferWrite = SlowBuffer.prototype.write;\n        SlowBuffer.prototype.write = function(string, offset, length, encoding) {\n            // Support both (string, offset, length, encoding)\n            // and the legacy (string, encoding, offset, length)\n            if (isFinite(offset)) {\n                if (!isFinite(length)) {\n                    encoding = length;\n                    length = undefined;\n                }\n            } else {  // legacy\n                var swap = encoding;\n                encoding = offset;\n                offset = length;\n                length = swap;\n            }\n\n            offset = +offset || 0;\n            var remaining = this.length - offset;\n            if (!length) {\n                length = remaining;\n            } else {\n                length = +length;\n                if (length > remaining) {\n                    length = remaining;\n                }\n            }\n            encoding = String(encoding || 'utf8').toLowerCase();\n\n            // Use native conversion when possible\n            if (Buffer.isNativeEncoding(encoding))\n                return original.SlowBufferWrite.call(this, string, offset, length, encoding);\n\n            if (string.length > 0 && (length < 0 || offset < 0))\n                throw new RangeError('attempt to write beyond buffer bounds');\n\n            // Otherwise, use our encoding method.\n            var buf = iconv.encode(string, encoding);\n            if (buf.length < length) length = buf.length;\n            buf.copy(this, offset, 0, length);\n            return length;\n        }\n\n        // -- Buffer ---------------------------------------------------------------\n\n        original.BufferIsEncoding = Buffer.isEncoding;\n        Buffer.isEncoding = function(encoding) {\n            return Buffer.isNativeEncoding(encoding) || iconv.encodingExists(encoding);\n        }\n\n        original.BufferByteLength = Buffer.byteLength;\n        Buffer.byteLength = SlowBuffer.byteLength = function(str, encoding) {\n            encoding = String(encoding || 'utf8').toLowerCase();\n\n            // Use native conversion when possible\n            if (Buffer.isNativeEncoding(encoding))\n                return original.BufferByteLength.call(this, str, encoding);\n\n            // Slow, I know, but we don't have a better way yet.\n            return iconv.encode(str, encoding).length;\n        }\n\n        original.BufferToString = Buffer.prototype.toString;\n        Buffer.prototype.toString = function(encoding, start, end) {\n            encoding = String(encoding || 'utf8').toLowerCase();\n\n            // Use native conversion when possible\n            if (Buffer.isNativeEncoding(encoding))\n                return original.BufferToString.call(this, encoding, start, end);\n\n            // Otherwise, use our decoding method.\n            if (typeof start == 'undefined') start = 0;\n            if (typeof end == 'undefined') end = this.length;\n            return iconv.decode(this.slice(start, end), encoding);\n        }\n\n        original.BufferWrite = Buffer.prototype.write;\n        Buffer.prototype.write = function(string, offset, length, encoding) {\n            var _offset = offset, _length = length, _encoding = encoding;\n            // Support both (string, offset, length, encoding)\n            // and the legacy (string, encoding, offset, length)\n            if (isFinite(offset)) {\n                if (!isFinite(length)) {\n                    encoding = length;\n                    length = undefined;\n                }\n            } else {  // legacy\n                var swap = encoding;\n                encoding = offset;\n                offset = length;\n                length = swap;\n            }\n\n            encoding = String(encoding || 'utf8').toLowerCase();\n\n            // Use native conversion when possible\n            if (Buffer.isNativeEncoding(encoding))\n                return original.BufferWrite.call(this, string, _offset, _length, _encoding);\n\n            offset = +offset || 0;\n            var remaining = this.length - offset;\n            if (!length) {\n                length = remaining;\n            } else {\n                length = +length;\n                if (length > remaining) {\n                    length = remaining;\n                }\n            }\n\n            if (string.length > 0 && (length < 0 || offset < 0))\n                throw new RangeError('attempt to write beyond buffer bounds');\n\n            // Otherwise, use our encoding method.\n            var buf = iconv.encode(string, encoding);\n            if (buf.length < length) length = buf.length;\n            buf.copy(this, offset, 0, length);\n            return length;\n\n            // TODO: Set _charsWritten.\n        }\n\n\n        // -- Readable -------------------------------------------------------------\n        if (iconv.supportsStreams) {\n            var Readable = require('stream').Readable;\n\n            original.ReadableSetEncoding = Readable.prototype.setEncoding;\n            Readable.prototype.setEncoding = function setEncoding(enc, options) {\n                // Use our own decoder, it has the same interface.\n                // We cannot use original function as it doesn't handle BOM-s.\n                this._readableState.decoder = iconv.getDecoder(enc, options);\n                this._readableState.encoding = enc;\n            }\n\n            Readable.prototype.collect = iconv._collect;\n        }\n    }\n\n    // Remove iconv-lite Node primitive extensions.\n    iconv.undoExtendNodeEncodings = function undoExtendNodeEncodings() {\n        if (!iconv.supportsNodeEncodingsExtension)\n            return;\n        if (!original)\n            throw new Error(\"require('iconv-lite').undoExtendNodeEncodings(): Nothing to undo; extendNodeEncodings() is not called.\")\n\n        delete Buffer.isNativeEncoding;\n\n        var SlowBuffer = require('buffer').SlowBuffer;\n\n        SlowBuffer.prototype.toString = original.SlowBufferToString;\n        SlowBuffer.prototype.write = original.SlowBufferWrite;\n\n        Buffer.isEncoding = original.BufferIsEncoding;\n        Buffer.byteLength = original.BufferByteLength;\n        Buffer.prototype.toString = original.BufferToString;\n        Buffer.prototype.write = original.BufferWrite;\n\n        if (iconv.supportsStreams) {\n            var Readable = require('stream').Readable;\n\n            Readable.prototype.setEncoding = original.ReadableSetEncoding;\n            delete Readable.prototype.collect;\n        }\n\n        original = undefined;\n    }\n}\n", "\"use strict\";\n\n// Some environments don't have global Buffer (e.g. React Native).\n// Solution would be installing npm modules \"buffer\" and \"stream\" explicitly.\nvar Buffer = require(\"safer-buffer\").Buffer;\n\nvar bomHandling = require(\"./bom-handling\"),\n    iconv = module.exports;\n\n// All codecs and aliases are kept here, keyed by encoding name/alias.\n// They are lazy loaded in `iconv.getCodec` from `encodings/index.js`.\niconv.encodings = null;\n\n// Characters emitted in case of error.\niconv.defaultCharUnicode = '\uFFFD';\niconv.defaultCharSingleByte = '?';\n\n// Public API.\niconv.encode = function encode(str, encoding, options) {\n    str = \"\" + (str || \"\"); // Ensure string.\n\n    var encoder = iconv.getEncoder(encoding, options);\n\n    var res = encoder.write(str);\n    var trail = encoder.end();\n    \n    return (trail && trail.length > 0) ? Buffer.concat([res, trail]) : res;\n}\n\niconv.decode = function decode(buf, encoding, options) {\n    if (typeof buf === 'string') {\n        if (!iconv.skipDecodeWarning) {\n            console.error('Iconv-lite warning: decode()-ing strings is deprecated. Refer to https://github.com/ashtuchkin/iconv-lite/wiki/Use-Buffers-when-decoding');\n            iconv.skipDecodeWarning = true;\n        }\n\n        buf = Buffer.from(\"\" + (buf || \"\"), \"binary\"); // Ensure buffer.\n    }\n\n    var decoder = iconv.getDecoder(encoding, options);\n\n    var res = decoder.write(buf);\n    var trail = decoder.end();\n\n    return trail ? (res + trail) : res;\n}\n\niconv.encodingExists = function encodingExists(enc) {\n    try {\n        iconv.getCodec(enc);\n        return true;\n    } catch (e) {\n        return false;\n    }\n}\n\n// Legacy aliases to convert functions\niconv.toEncoding = iconv.encode;\niconv.fromEncoding = iconv.decode;\n\n// Search for a codec in iconv.encodings. Cache codec data in iconv._codecDataCache.\niconv._codecDataCache = {};\niconv.getCodec = function getCodec(encoding) {\n    if (!iconv.encodings)\n        iconv.encodings = require(\"../encodings\"); // Lazy load all encoding definitions.\n    \n    // Canonicalize encoding name: strip all non-alphanumeric chars and appended year.\n    var enc = iconv._canonicalizeEncoding(encoding);\n\n    // Traverse iconv.encodings to find actual codec.\n    var codecOptions = {};\n    while (true) {\n        var codec = iconv._codecDataCache[enc];\n        if (codec)\n            return codec;\n\n        var codecDef = iconv.encodings[enc];\n\n        switch (typeof codecDef) {\n            case \"string\": // Direct alias to other encoding.\n                enc = codecDef;\n                break;\n\n            case \"object\": // Alias with options. Can be layered.\n                for (var key in codecDef)\n                    codecOptions[key] = codecDef[key];\n\n                if (!codecOptions.encodingName)\n                    codecOptions.encodingName = enc;\n                \n                enc = codecDef.type;\n                break;\n\n            case \"function\": // Codec itself.\n                if (!codecOptions.encodingName)\n                    codecOptions.encodingName = enc;\n\n                // The codec function must load all tables and return object with .encoder and .decoder methods.\n                // It'll be called only once (for each different options object).\n                codec = new codecDef(codecOptions, iconv);\n\n                iconv._codecDataCache[codecOptions.encodingName] = codec; // Save it to be reused later.\n                return codec;\n\n            default:\n                throw new Error(\"Encoding not recognized: '\" + encoding + \"' (searched as: '\"+enc+\"')\");\n        }\n    }\n}\n\niconv._canonicalizeEncoding = function(encoding) {\n    // Canonicalize encoding name: strip all non-alphanumeric chars and appended year.\n    return (''+encoding).toLowerCase().replace(/:\\d{4}$|[^0-9a-z]/g, \"\");\n}\n\niconv.getEncoder = function getEncoder(encoding, options) {\n    var codec = iconv.getCodec(encoding),\n        encoder = new codec.encoder(options, codec);\n\n    if (codec.bomAware && options && options.addBOM)\n        encoder = new bomHandling.PrependBOM(encoder, options);\n\n    return encoder;\n}\n\niconv.getDecoder = function getDecoder(encoding, options) {\n    var codec = iconv.getCodec(encoding),\n        decoder = new codec.decoder(options, codec);\n\n    if (codec.bomAware && !(options && options.stripBOM === false))\n        decoder = new bomHandling.StripBOM(decoder, options);\n\n    return decoder;\n}\n\n\n// Load extensions in Node. All of them are omitted in Browserify build via 'browser' field in package.json.\nvar nodeVer = typeof process !== 'undefined' && process.versions && process.versions.node;\nif (nodeVer) {\n\n    // Load streaming support in Node v0.10+\n    var nodeVerArr = nodeVer.split(\".\").map(Number);\n    if (nodeVerArr[0] > 0 || nodeVerArr[1] >= 10) {\n        require(\"./streams\")(iconv);\n    }\n\n    // Load Node primitive extensions.\n    require(\"./extend-node\")(iconv);\n}\n\nif (\"\u0100\" != \"\\u0100\") {\n    console.error(\"iconv-lite warning: javascript files use encoding different from utf-8. See https://github.com/ashtuchkin/iconv-lite/wiki/Javascript-source-file-encodings for more info.\");\n}\n", "'use strict';\n\nvar iconv_package;\nvar Iconv;\n\ntry {\n    // this is to fool browserify so it doesn't try (in vain) to install iconv.\n    iconv_package = 'iconv';\n    Iconv = require(iconv_package).Iconv;\n} catch (E) {\n    // node-iconv not present\n}\n\nmodule.exports = Iconv;\n", "'use strict';\n\nvar iconvLite = require('iconv-lite');\n// Load Iconv from an external file to be able to disable Iconv for webpack\n// Add /\\/iconv-loader$/ to webpack.IgnorePlugin to ignore it\nvar Iconv = require('./iconv-loader');\n\n// Expose to the world\nmodule.exports.convert = convert;\n\n/**\n * Convert encoding of an UTF-8 string or a buffer\n *\n * @param {String|Buffer} str String to be converted\n * @param {String} to Encoding to be converted to\n * @param {String} [from='UTF-8'] Encoding to be converted from\n * @param {Boolean} useLite If set to ture, force to use iconvLite\n * @return {Buffer} Encoded string\n */\nfunction convert(str, to, from, useLite) {\n    from = checkEncoding(from || 'UTF-8');\n    to = checkEncoding(to || 'UTF-8');\n    str = str || '';\n\n    var result;\n\n    if (from !== 'UTF-8' && typeof str === 'string') {\n        str = new Buffer(str, 'binary');\n    }\n\n    if (from === to) {\n        if (typeof str === 'string') {\n            result = new Buffer(str);\n        } else {\n            result = str;\n        }\n    } else if (Iconv && !useLite) {\n        try {\n            result = convertIconv(str, to, from);\n        } catch (E) {\n            console.error(E);\n            try {\n                result = convertIconvLite(str, to, from);\n            } catch (E) {\n                console.error(E);\n                result = str;\n            }\n        }\n    } else {\n        try {\n            result = convertIconvLite(str, to, from);\n        } catch (E) {\n            console.error(E);\n            result = str;\n        }\n    }\n\n\n    if (typeof result === 'string') {\n        result = new Buffer(result, 'utf-8');\n    }\n\n    return result;\n}\n\n/**\n * Convert encoding of a string with node-iconv (if available)\n *\n * @param {String|Buffer} str String to be converted\n * @param {String} to Encoding to be converted to\n * @param {String} [from='UTF-8'] Encoding to be converted from\n * @return {Buffer} Encoded string\n */\nfunction convertIconv(str, to, from) {\n    var response, iconv;\n    iconv = new Iconv(from, to + '//TRANSLIT//IGNORE');\n    response = iconv.convert(str);\n    return response.slice(0, response.length);\n}\n\n/**\n * Convert encoding of astring with iconv-lite\n *\n * @param {String|Buffer} str String to be converted\n * @param {String} to Encoding to be converted to\n * @param {String} [from='UTF-8'] Encoding to be converted from\n * @return {Buffer} Encoded string\n */\nfunction convertIconvLite(str, to, from) {\n    if (to === 'UTF-8') {\n        return iconvLite.decode(str, from);\n    } else if (from === 'UTF-8') {\n        return iconvLite.encode(str, to);\n    } else {\n        return iconvLite.encode(iconvLite.decode(str, from), to);\n    }\n}\n\n/**\n * Converts charset name if needed\n *\n * @param {String} name Character set\n * @return {String} Character set name\n */\nfunction checkEncoding(name) {\n    return (name || '').toString().trim().\n    replace(/^latin[\\-_]?(\\d+)$/i, 'ISO-8859-$1').\n    replace(/^win(?:dows)?[\\-_]?(\\d+)$/i, 'WINDOWS-$1').\n    replace(/^utf[\\-_]?(\\d+)$/i, 'UTF-$1').\n    replace(/^ks_c_5601\\-1987$/i, 'CP949').\n    replace(/^us[\\-_]?ascii$/i, 'ASCII').\n    toUpperCase();\n}\n", "'use strict';\n\nvar http = require('http');\nvar https = require('https');\nvar urllib = require('url');\nvar utillib = require('util');\nvar zlib = require('zlib');\nvar dns = require('dns');\nvar Stream = require('stream').Readable;\nvar CookieJar = require('./cookiejar').CookieJar;\nvar encodinglib = require('encoding');\nvar net = require('net');\n\nvar USE_ALLOC = typeof Buffer.alloc === 'function';\n\nexports.FetchStream = FetchStream;\nexports.CookieJar = CookieJar;\nexports.fetchUrl = fetchUrl;\n\nfunction FetchStream(url, options) {\n    Stream.call(this);\n\n    options = options || {};\n\n    this.url = url;\n    if (!this.url) {\n        return this.emit('error', new Error('url not defined'));\n    }\n\n    this.userAgent = options.userAgent || 'FetchStream';\n\n    this._redirect_count = 0;\n\n    this.options = options || {};\n    this.normalizeOptions();\n\n    // prevent errors before 'error' handler is set by defferring actions\n    if (typeof setImmediate !== 'undefined') {\n        setImmediate(this.runStream.bind(this, url));\n    } else {\n        process.nextTick(this.runStream.bind(this, url));\n    }\n    this.responseBuffer = USE_ALLOC ? Buffer.alloc(0, '', 'binary') : new Buffer(0, 'binary');\n    this.ended = false;\n    this.readyToRead = 0;\n}\nutillib.inherits(FetchStream, Stream);\n\nFetchStream.prototype._read = function (size) {\n    if (this.ended && this.responseBuffer.length === 0) {\n        this.push(null);\n        return;\n    }\n    this.readyToRead += size;\n    this.drainBuffer();\n};\n\nFetchStream.prototype.drainBuffer = function () {\n    if (this.readyToRead === 0) {\n        return;\n    }\n    if (this.responseBuffer.length === 0) {\n        return;\n    }\n    var push;\n    var rest;\n    var restSize;\n\n    if (this.responseBuffer.length > this.readyToRead) {\n        push = USE_ALLOC ? Buffer.alloc(this.readyToRead, '', 'binary') : new Buffer(this.readyToRead, 'binary');\n        this.responseBuffer.copy(push, 0, 0, this.readyToRead);\n        restSize = this.responseBuffer.length - this.readyToRead;\n        rest = USE_ALLOC ? Buffer.alloc(restSize, '', 'binary') : new Buffer(restSize, 'binary');\n        this.responseBuffer.copy(rest, 0, this.readyToRead);\n    } else {\n        push = this.responseBuffer;\n        rest = USE_ALLOC ? Buffer.alloc(0, '', 'binary') : new Buffer(0, 'binary');\n    }\n    this.responseBuffer = rest;\n    this.readyToRead = 0;\n    if (this.options.encoding) {\n        this.push(push, this.options.encoding);\n    } else {\n        this.push(push);\n    }\n};\n\nFetchStream.prototype.destroy = function (ex) {\n    this.emit('destroy', ex);\n};\n\nFetchStream.prototype.normalizeOptions = function () {\n\n    // cookiejar\n    this.cookieJar = this.options.cookieJar || new CookieJar();\n\n    // default redirects - 10\n    // if disableRedirect is set, then 0\n    if (!this.options.disableRedirect && typeof this.options.maxRedirects !== 'number' &&\n        !(this.options.maxRedirects instanceof Number)) {\n        this.options.maxRedirects = 10;\n    } else if (this.options.disableRedirects) {\n        this.options.maxRedirects = 0;\n    }\n\n    // normalize header keys\n    // HTTP and HTTPS takes in key names in case insensitive but to find\n    // an exact value from an object key name needs to be case sensitive\n    // so we're just lowercasing all input keys\n    this.options.headers = this.options.headers || {};\n\n    var keys = Object.keys(this.options.headers);\n    var newheaders = {};\n    var i;\n\n    for (i = keys.length - 1; i >= 0; i--) {\n        newheaders[keys[i].toLowerCase().trim()] = this.options.headers[keys[i]];\n    }\n\n    this.options.headers = newheaders;\n\n    if (!this.options.headers['user-agent']) {\n        this.options.headers['user-agent'] = this.userAgent;\n    }\n\n    if (!this.options.headers.pragma) {\n        this.options.headers.pragma = 'no-cache';\n    }\n\n    if (!this.options.headers['cache-control']) {\n        this.options.headers['cache-control'] = 'no-cache';\n    }\n\n    if (!this.options.disableGzip) {\n        this.options.headers['accept-encoding'] = 'gzip, deflate';\n    } else {\n        delete this.options.headers['accept-encoding'];\n    }\n\n    // max length for the response,\n    // if not set, default is Infinity\n    if (!this.options.maxResponseLength) {\n        this.options.maxResponseLength = Infinity;\n    }\n\n    // method:\n    // defaults to GET, or when payload present to POST\n    if (!this.options.method) {\n        this.options.method = this.options.payload || this.options.payloadSize ? 'POST' : 'GET';\n    }\n\n    // set cookies\n    // takes full cookie definition strings as params\n    if (this.options.cookies) {\n        for (i = 0; i < this.options.cookies.length; i++) {\n            this.cookieJar.setCookie(this.options.cookies[i], this.url);\n        }\n    }\n\n    // rejectUnauthorized\n    if (typeof this.options.rejectUnauthorized === 'undefined') {\n        this.options.rejectUnauthorized = true;\n    }\n};\n\nFetchStream.prototype.parseUrl = function (url) {\n    var urlparts = urllib.parse(url, false, true),\n        transport,\n        urloptions = {\n            host: urlparts.hostname || urlparts.host,\n            port: urlparts.port,\n            path: urlparts.pathname + (urlparts.search || '') || '/',\n            method: this.options.method,\n            rejectUnauthorized: this.options.rejectUnauthorized\n        };\n\n    switch (urlparts.protocol) {\n        case 'https:':\n            transport = https;\n            break;\n        case 'http:':\n        default:\n            transport = http;\n            break;\n    }\n\n    if (transport === https) {\n        if('agentHttps' in this.options){\n            urloptions.agent = this.options.agentHttps;\n        }\n        if('agent' in this.options){\n            urloptions.agent = this.options.agent;\n        }\n    } else {\n        if('agentHttp' in this.options){\n            urloptions.agent = this.options.agentHttp;\n        }\n        if('agent' in this.options){\n            urloptions.agent = this.options.agent;\n        }\n    }\n\n    if (!urloptions.port) {\n        switch (urlparts.protocol) {\n            case 'https:':\n                urloptions.port = 443;\n                break;\n            case 'http:':\n            default:\n                urloptions.port = 80;\n                break;\n        }\n    }\n\n    urloptions.headers = this.options.headers || {};\n\n    if (urlparts.auth) {\n        var buf = USE_ALLOC ? Buffer.alloc(Buffer.byteLength(urlparts.auth), urlparts.auth) : new Buffer(urlparts.auth);\n        urloptions.headers.Authorization = 'Basic ' + buf.toString('base64');\n    }\n\n    return {\n        urloptions: urloptions,\n        transport: transport\n    };\n};\n\nFetchStream.prototype.setEncoding = function (encoding) {\n    this.options.encoding = encoding;\n};\n\nFetchStream.prototype.runStream = function (url) {\n    var url_data = this.parseUrl(url),\n        cookies = this.cookieJar.getCookies(url);\n\n    if (cookies) {\n        url_data.urloptions.headers.cookie = cookies;\n    } else {\n        delete url_data.urloptions.headers.cookie;\n    }\n\n    if (this.options.payload) {\n        url_data.urloptions.headers['content-length'] = Buffer.byteLength(this.options.payload || '', 'utf-8');\n    }\n\n    if (this.options.payloadSize) {\n        url_data.urloptions.headers['content-length'] = this.options.payloadSize;\n    }\n\n    if (this.options.asyncDnsLoookup) {\n        var dnsCallback = (function (err, addresses) {\n            if (err) {\n                this.emit('error', err);\n                return;\n            }\n\n            url_data.urloptions.headers.host = url_data.urloptions.hostname || url_data.urloptions.host;\n            url_data.urloptions.hostname = addresses[0];\n            url_data.urloptions.host = url_data.urloptions.headers.host + (url_data.urloptions.port ? ':' + url_data.urloptions.port : '');\n\n            this._runStream(url_data, url);\n        }).bind(this);\n\n        if (net.isIP(url_data.urloptions.host)) {\n            dnsCallback(null, [url_data.urloptions.host]);\n        } else {\n            dns.resolve4(url_data.urloptions.host, dnsCallback);\n        }\n    } else {\n        this._runStream(url_data, url);\n    }\n};\n\nFetchStream.prototype._runStream = function (url_data, url) {\n\n    var req = url_data.transport.request(url_data.urloptions, (function (res) {\n\n        // catch new cookies before potential redirect\n        if (Array.isArray(res.headers['set-cookie'])) {\n            for (var i = 0; i < res.headers['set-cookie'].length; i++) {\n                this.cookieJar.setCookie(res.headers['set-cookie'][i], url);\n            }\n        }\n\n        if ([301, 302, 303, 307, 308].indexOf(res.statusCode) >= 0) {\n            if (!this.options.disableRedirects && this.options.maxRedirects > this._redirect_count && res.headers.location) {\n                this._redirect_count++;\n                req.destroy();\n                this.runStream(urllib.resolve(url, res.headers.location));\n                return;\n            }\n        }\n\n        this.meta = {\n            status: res.statusCode,\n            responseHeaders: res.headers,\n            finalUrl: url,\n            redirectCount: this._redirect_count,\n            cookieJar: this.cookieJar\n        };\n\n        var curlen = 0,\n            maxlen,\n\n            receive = (function (chunk) {\n                if (curlen + chunk.length > this.options.maxResponseLength) {\n                    maxlen = this.options.maxResponseLength - curlen;\n                } else {\n                    maxlen = chunk.length;\n                }\n\n                if (maxlen <= 0) {\n                    return;\n                }\n\n                curlen += Math.min(maxlen, chunk.length);\n                if (maxlen >= chunk.length) {\n                    if (this.responseBuffer.length === 0) {\n                        this.responseBuffer = chunk;\n                    } else {\n                        this.responseBuffer = Buffer.concat([this.responseBuffer, chunk]);\n                    }\n                } else {\n                    this.responseBuffer = Buffer.concat([this.responseBuffer, chunk], this.responseBuffer.length + maxlen);\n                }\n                this.drainBuffer();\n            }).bind(this),\n\n            error = (function (e) {\n                this.ended = true;\n                this.emit('error', e);\n                this.drainBuffer();\n            }).bind(this),\n\n            end = (function () {\n                this.ended = true;\n                if (this.responseBuffer.length === 0) {\n                    this.push(null);\n                }\n            }).bind(this),\n\n            unpack = (function (type, res) {\n                var z = zlib['create' + type]();\n                z.on('data', receive);\n                z.on('error', error);\n                z.on('end', end);\n                res.pipe(z);\n            }).bind(this);\n\n        this.emit('meta', this.meta);\n\n        if (res.headers['content-encoding']) {\n            switch (res.headers['content-encoding'].toLowerCase().trim()) {\n                case 'gzip':\n                    return unpack('Gunzip', res);\n                case 'deflate':\n                    return unpack('InflateRaw', res);\n            }\n        }\n\n        res.on('data', receive);\n        res.on('end', end);\n\n    }).bind(this));\n\n    req.on('error', (function (e) {\n        this.emit('error', e);\n    }).bind(this));\n\n    if (this.options.timeout) {\n        req.setTimeout(this.options.timeout, req.abort.bind(req));\n    }\n    this.on('destroy', req.abort.bind(req));\n\n    if (this.options.payload) {\n        req.end(this.options.payload);\n    } else if (this.options.payloadStream) {\n        this.options.payloadStream.pipe(req);\n        this.options.payloadStream.resume();\n    } else {\n        req.end();\n    }\n};\n\nfunction fetchUrl(url, options, callback) {\n    if (!callback && typeof options === 'function') {\n        callback = options;\n        options = undefined;\n    }\n    options = options || {};\n\n    var fetchstream = new FetchStream(url, options),\n        response_data, chunks = [],\n        length = 0,\n        curpos = 0,\n        buffer,\n        content_type,\n        callbackFired = false;\n\n    fetchstream.on('meta', function (meta) {\n        response_data = meta;\n        content_type = _parseContentType(meta.responseHeaders['content-type']);\n    });\n\n    fetchstream.on('data', function (chunk) {\n        if (chunk) {\n            chunks.push(chunk);\n            length += chunk.length;\n        }\n    });\n\n    fetchstream.on('error', function (error) {\n        if (error && error.code === 'HPE_INVALID_CONSTANT') {\n            // skip invalid formatting errors\n            return;\n        }\n        if (callbackFired) {\n            return;\n        }\n        callbackFired = true;\n        callback(error);\n    });\n\n    fetchstream.on('end', function () {\n        if (callbackFired) {\n            return;\n        }\n        callbackFired = true;\n\n        buffer = USE_ALLOC ? Buffer.alloc(length) : new Buffer(length);\n        for (var i = 0, len = chunks.length; i < len; i++) {\n            chunks[i].copy(buffer, curpos);\n            curpos += chunks[i].length;\n        }\n\n        if (content_type.mimeType === 'text/html') {\n            content_type.charset = _findHTMLCharset(buffer) || content_type.charset;\n        }\n\n        content_type.charset = (options.overrideCharset || content_type.charset || 'utf-8').trim().toLowerCase();\n\n\n        if (!options.disableDecoding && !content_type.charset.match(/^utf-?8$/i)) {\n            buffer = encodinglib.convert(buffer, 'UTF-8', content_type.charset);\n        }\n\n        if (options.outputEncoding) {\n            return callback(null, response_data, buffer.toString(options.outputEncoding));\n        } else {\n            return callback(null, response_data, buffer);\n        }\n\n    });\n}\n\nfunction _parseContentType(str) {\n    if (!str) {\n        return {};\n    }\n    var parts = str.split(';'),\n        mimeType = parts.shift(),\n        charset, chparts;\n\n    for (var i = 0, len = parts.length; i < len; i++) {\n        chparts = parts[i].split('=');\n        if (chparts.length > 1) {\n            if (chparts[0].trim().toLowerCase() === 'charset') {\n                charset = chparts[1];\n            }\n        }\n    }\n\n    return {\n        mimeType: (mimeType || '').trim().toLowerCase(),\n        charset: (charset || 'UTF-8').trim().toLowerCase() // defaults to UTF-8\n    };\n}\n\nfunction _findHTMLCharset(htmlbuffer) {\n\n    var body = htmlbuffer.toString('ascii'),\n        input, meta, charset;\n\n    if ((meta = body.match(/<meta\\s+http-equiv=[\"']content-type[\"'][^>]*?>/i))) {\n        input = meta[0];\n    }\n\n    if (input) {\n        charset = input.match(/charset\\s?=\\s?([a-zA-Z\\-0-9]*);?/);\n        if (charset) {\n            charset = (charset[1] || '').trim().toLowerCase();\n        }\n    }\n\n    if (!charset && (meta = body.match(/<meta\\s+charset=[\"'](.*?)[\"']/i))) {\n        charset = (meta[1] || '').trim().toLowerCase();\n    }\n\n    return charset;\n}\n", "import * as fs from 'fs';\r\nlet THREE;\r\nimport { GLTFLoader, SkeletonUtils } from 'three/examples/jsm/Addons.js';\r\nconst BGRA8Unorm = 'bgra8unorm';\r\n\r\nimport * as processMii from './miiProcess.js';\r\nimport { MiiFormats } from './formats.js';\r\nimport {backTables} from \"./data.js\";\r\n\r\nimport { isNode } from './platform.js';\r\n\r\nlet pngWriterPromise;\r\nasync function encodePngImage(width, height, bgraPixels) {\r\n    if (!pngWriterPromise) {\r\n        pngWriterPromise = import('pngjs');\r\n    }\r\n    const pngjs = await pngWriterPromise;\r\n    const PNG = pngjs?.PNG ?? pngjs?.default?.PNG ?? pngjs?.default;\r\n    if (!PNG) {\r\n        throw new Error(\"pngjs PNG encoder unavailable\");\r\n    }\r\n\r\n    const rgba = Buffer.alloc(bgraPixels.length);\r\n    for (let i = 0; i < bgraPixels.length; i += 4) {\r\n        // WebGPU readback is BGRA; PNG writer expects RGBA.\r\n        rgba[i] = bgraPixels[i + 2];\r\n        rgba[i + 1] = bgraPixels[i + 1];\r\n        rgba[i + 2] = bgraPixels[i];\r\n        rgba[i + 3] = bgraPixels[i + 3];\r\n    }\r\n\r\n    const png = new PNG({ width, height });\r\n    png.data = rgba;\r\n    return PNG.sync.write(png);\r\n}\r\n\r\nasync function normalizeDecodedMiiForRender(data) {\r\n    const normalized = structuredClone(await processMii.decodeMii(data));\r\n\r\n    if (Number.isInteger(normalized?.glasses?.type)) {\r\n        const renderType = normalized.glasses.type>8?backTables.switch.glassesTypes[normalized.glasses.type-9]:normalized.glasses.type;\r\n        if (Number.isInteger(renderType)) {\r\n            normalized.glasses.type = renderType;\r\n        }\r\n    }\r\n\r\n    return normalized;\r\n}\r\n\r\n//All of this is for FFL\r\nimport { addSkeletonScalingExtensions } from 'ffl.js/helpers/SkeletonScalingExtensions.js';\r\nimport { detectModelDesc } from 'ffl.js/helpers/ModelScaleDesc.js';\r\n\r\nlet webgpuPromise;\r\nasync function getWebGPU() {\r\n    if (!webgpuPromise) {\r\n        webgpuPromise = import('webgpu');\r\n    }\r\n    return webgpuPromise;\r\n}\r\n\r\n// Imported from: https://github.com/ariankordi/FFL.js/blob/ae0a482abdbd9f81d4e12b055317c12a8a1783a4/helpers/HeadlessWebGPU.js\r\n\r\n/**\r\n * Adds WebGPU related extensions to the global scope\r\n * if using Node.js. It defines navigator, as well as\r\n * userAgent and VideoFrame as they are used by Three.js.\r\n * @param {typeof globalThis} obj - The globalThis object to assign globals to.\r\n */\r\nasync function addWebGPUExtensions(obj = globalThis) {\r\n    // @ts-ignore -- Incomplete dummy type.\r\n    obj.VideoFrame ??= (class VideoFrame { });\r\n    const selfValue = obj.self ?? obj;\r\n    obj.self ??= selfValue;\r\n    selfValue.VideoFrame ??= obj.VideoFrame;\r\n    selfValue.requestAnimationFrame ??= function requestAnimationFrame() { };\r\n    selfValue.cancelAnimationFrame ??= function cancelAnimationFrame() { };\r\n\r\n    const syncSelfWebGPUGlobals = (globals = obj) => {\r\n        for (const key of Object.getOwnPropertyNames(globals)) {\r\n            if (key.startsWith(\"GPU\") && globals[key] !== undefined) {\r\n                selfValue[key] ??= globals[key];\r\n            }\r\n        }\r\n    };\r\n\r\n    if (obj.navigator?.gpu) {\r\n        syncSelfWebGPUGlobals();\r\n        return;\r\n    }\r\n\r\n    const { globals, create } = await getWebGPU();\r\n    Object.assign(obj, globals); // Merge WebGPU globals.\r\n    Object.assign(selfValue, globals);\r\n    syncSelfWebGPUGlobals(globals);\r\n\r\n    // @ts-ignore -- Incomplete navigator type.\r\n    const navigatorValue = {\r\n        ...(obj.navigator ?? {}),\r\n        gpu: create([]),\r\n        userAgent: obj.navigator?.userAgent ?? '' // THREE.GLTFLoader accesses this.\r\n    };\r\n\r\n    try {\r\n        obj.navigator = navigatorValue;\r\n        if (obj.navigator?.gpu !== navigatorValue.gpu) {\r\n            throw new Error(\"navigator assignment was ignored\");\r\n        }\r\n    }\r\n    catch {\r\n        Object.defineProperty(obj, \"navigator\", {\r\n            configurable: true,\r\n            value: navigatorValue\r\n        });\r\n    }\r\n}\r\n\r\n/**\r\n * @param {number} width - Width of the canvas.\r\n * @param {number} height - Height of the canvas.\r\n * @param {typeof HTMLCanvasElement.prototype.getContext} getContext -\r\n * Function that gets the context from the canvas.\r\n * @returns {HTMLCanvasElement} Mock canvas-like object for Three.js to use.\r\n */\r\nconst getCanvas = (width, height, getContext) =>\r\n    ({\r\n        width, height,\r\n        // @ts-expect-error -- Incomplete style type.\r\n        style: {},\r\n        addEventListener() { },\r\n        removeEventListener() { },\r\n        getContext\r\n    });\r\n\r\n/**\r\n * Creates the renderer. The default sizes create a 1x1 swapchain texture.\r\n * @param {number} [width] - Width for the canvas/renderer.\r\n * @param {number} [height] - Height for the canvas/renderer.\r\n * @returns {Promise<import('three/webgpu').Renderer>} The created renderer.\r\n */\r\nasync function createThreeRenderer(width = 1, height = 1) {\r\n    /**\r\n     * Dummy canvas context which has a configure()\r\n     * function that does nothing.\r\n     * If only render targets are used, no other functions are needed.\r\n     */\r\n    const gpuCanvasContext = { configure() { } };\r\n\r\n    const canvas = getCanvas(width, height,\r\n        // @ts-expect-error -- Does not return a real GPUCanvasContext.\r\n        type => type === 'webgpu'\r\n            ? gpuCanvasContext\r\n            : console.assert(false, `unsupported canvas context type ${type}`)\r\n    );\r\n\r\n    // WebGLRenderer constructor sets \"self\" as the context. (which is window)\r\n    // Mock all functions called on it as of r180.\r\n    globalThis.self ??= {\r\n        // @ts-expect-error -- Incompatible no-op requestAnimationFrame.\r\n        requestAnimationFrame() { },\r\n        cancelAnimationFrame() { }\r\n    };\r\n    // Create the Three.js renderer and scene.\r\n    const renderer = new THREE.WebGPURenderer({\r\n        canvas, alpha: true\r\n    });\r\n\r\n    /* ('init' in renderer) && */ await renderer.init();\r\n\r\n    return renderer;\r\n}\r\n\r\n/**\r\n * Writes a 32-bit (transparent) image in Microsoft BMP format.\r\n * Useful for testing since it's uncompressed and can be viewed in web browsers.\r\n * NOTE: If the output has inverted colors, you must output BGRA instead of RGBA.\r\n * @param {number} width - Width of the image.\r\n * @param {number} height - Height of the image.\r\n * @param {Uint8Array} bgraPixels - Image data in BGRA format, 32 bits per pixel.\r\n * @returns {Uint8Array} BMP file bytes.\r\n */\r\nfunction encodeBmpImage(width, height, bgraPixels) {\r\n    const sizeof_BITMAPFILEHEADER = 14;\r\n    const sizeof_DIB = 40;\r\n    // Contains RGBA masks. This is the format GIMP emits.\r\n    const masksSize = 16;\r\n    const dibSize = sizeof_DIB + masksSize;\r\n    const pixelOffset = sizeof_BITMAPFILEHEADER + dibSize;\r\n    const fileSize = pixelOffset + bgraPixels.length;\r\n\r\n    const bytes = new Uint8Array(fileSize);\r\n    const view = new DataView(bytes.buffer);\r\n\r\n    // Encode BITMAPFILEHEADER (14 bytes).\r\n    view.setUint16(0, 0x4D42, true); // 'BM'\r\n    view.setUint32(2, fileSize, true); // bfSize\r\n    view.setUint16(6, 0, true); // bfReserved1\r\n    view.setUint16(8, 0, true); // bfReserved2\r\n    view.setUint32(10, pixelOffset, true); // bfOffBits\r\n\r\n    // Encode BITMAPINFOHEADER (40 bytes).\r\n    view.setUint32(14, dibSize, true); // biSize\r\n    view.setInt32(18, width, true); // biWidth\r\n    view.setInt32(22, -height, true); // biHeight (negative = top-down)\r\n    view.setUint16(26, 1, true); // biPlanes\r\n    view.setUint16(28, 32, true); // biBitCount\r\n    view.setUint32(30, 3, true); // biCompression = BI_BITFIELDS\r\n    view.setUint32(34, bgraPixels.length, true); // biSizeImage\r\n    view.setInt32(38, 2835, true); // biXPelsPerMeter (~72 DPI)\r\n    view.setInt32(42, 2835, true); // biYPelsPerMeter\r\n    view.setUint32(46, 0, true); // biClrUsed\r\n    view.setUint32(50, 0, true); // biClrImportant\r\n\r\n    // Copy RGBA masks, needed for this to show up as properly transparent.\r\n    view.setUint32(54, 0x00FF0000, true); // Red\r\n    view.setUint32(58, 0x0000FF00, true); // Green\r\n    view.setUint32(62, 0x000000FF, true); // Blue\r\n    view.setUint32(66, 0xFF000000, true); // Alpha\r\n\r\n    // Copy BGRA pixel data.\r\n    bytes.set(bgraPixels, pixelOffset);\r\n    return bytes;\r\n}\r\nimport { prepareBodyForCharModel, attachHeadToBody, disposeModel, adjustCameraForBodyHead, getFaceCamera, getWholeBodyCamera } from 'ffl.js/helpers/BodyUtilities.js';\r\nimport { FFL, CharModel, pantsColors, FFLExpression } from 'ffl.js';\r\nimport FFLShaderNodeMaterial from 'ffl.js/materials/FFLShaderNodeMaterial.js';\r\nimport FFLShaderMaterial from 'ffl.js/materials/FFLShaderMaterial.js';\r\nimport imported from 'ffl.js/examples/ffl-emscripten-single-file.cjs';\r\nlet ModuleFFL;\r\nif (isNode) ModuleFFL = imported?.ModuleFFL ?? imported?.default ?? imported;\r\nelse ModuleFFL = globalThis.ModuleFFL;\r\n\r\n// Some body model functions are from: https://github.com/ariankordi/my-jsfiddles/blob/main/threejs-mii-accurate-body-scaling/script.js\r\nasync function loadGLTFFromFS(path) {\r\n    if (!fs.existsSync(path)) return null;\r\n    const content = await fs.promises.readFile(path);\r\n    // Buffer can be larger than the view, so slice to the actual bytes we read.\r\n    const ab = content.buffer.slice(content.byteOffset, content.byteOffset + content.byteLength);\r\n    return new Promise((resolve, reject) => {\r\n        new GLTFLoader().parse(\r\n            ab,\r\n            '', // basePath; empty is fine for embedded/binary glb\r\n            resolve,\r\n            reject\r\n        );\r\n    });\r\n}\r\nasync function loadFirstGLTFFromFS(paths) {\r\n    for (const path of paths) {\r\n        const gltf = await loadGLTFFromFS(path);\r\n        if (gltf) return gltf;\r\n    }\r\n    return null;\r\n}\r\nasync function loadGLTFFromURL(url) {\r\n    const res = await fetch(url);\r\n    if (!res.ok) return null;\r\n\r\n    const ab = await res.arrayBuffer();\r\n    return new Promise((resolve, reject) => {\r\n        new GLTFLoader().parse(\r\n            ab,\r\n            '', // basePath not needed for .glb\r\n            resolve,\r\n            reject\r\n        );\r\n    });\r\n}\r\n\r\n\r\nvar _fflRes;\r\nvar bodyTemplates;\r\nvar isInitialised = (async () => {//Yes, ESM has top level await, however we also build for CJS which doesn't.\r\n    if (isNode) {\r\n        var fetchMod = await import(\"fetch\");\r\n        globalThis.fetch = globalThis.fetch ?? (fetchMod.default ?? fetchMod.fetch ?? fetchMod);\r\n        await addWebGPUExtensions();\r\n    }\r\n\r\n    const threeBase = await import('three');\r\n    // Optionally merge in WebGPU extras\r\n    let threeWebGPU = {};\r\n    try {\r\n        threeWebGPU = await import('three/webgpu');\r\n    }\r\n    catch {\r\n        // WebGPU build not available; ignore\r\n    }\r\n    THREE = Object.assign({}, threeBase, threeWebGPU);\r\n    if (THREE.ColorManagement) {\r\n        THREE.ColorManagement.enabled = true;\r\n    }\r\n\r\n\r\n    if (isNode) {\r\n        //Automatically use FFL Resource if we can locate it anywhere we'd expect it to be\r\n        const searchFolders = [\".\", \"..\", \"./ffl\", \"./afl\", \"./resources\", \"./FFL\", \"./AFL\", \"./Resources\", \"./node_modules/miijs\"];\r\n        const searchNames = [\"fflreshigh\", \"aflreshigh\", \"FFLResHigh\", \"AFLResHigh\", \"AFLResHigh_2_3\", \"aflreshigh_2_3\"];\r\n        const searchSuffixes = [\"dat\", \"bin\"];\r\n        let breakNow = false;\r\n        for (const folder of searchFolders) {\r\n            for (const name of searchNames) {\r\n                for (const suffix of searchSuffixes) {\r\n                    if (fs.existsSync(`${folder}/${name}.${suffix}`)) {\r\n                        _fflRes = await fs.promises.readFile(`${folder}/${name}.${suffix}`);\r\n                        breakNow = true;\r\n                        break;\r\n                    }\r\n                }\r\n                if (breakNow) break;\r\n            }\r\n            if (breakNow) break;\r\n        }\r\n    }\r\n\r\n    if (isNode) {\r\n        bodyTemplates = [\r\n            await loadFirstGLTFFromFS([\r\n                \"./miiMaleBody.glb\",\r\n                \"../miiMaleBody.glb\",\r\n                \"./node_modules/miijs/miiMaleBody.glb\",\r\n                \"../node_modules/miijs/miiMaleBody.glb\"\r\n            ]),\r\n            await loadFirstGLTFFromFS([\r\n                \"./miiFemaleBody.glb\",\r\n                \"../miiFemaleBody.glb\",\r\n                \"./node_modules/miijs/miiFemaleBody.glb\",\r\n                \"../node_modules/miijs/miiFemaleBody.glb\"\r\n            ])\r\n        ];\r\n    }\r\n    else {\r\n        bodyTemplates = [\r\n            await loadGLTFFromURL(\"./miiMaleBody.glb\"),\r\n            await loadGLTFFromURL(\"./miiFemaleBody.glb\")\r\n        ];\r\n    }\r\n})();\r\n\r\nfunction loadBodyModel(gender) {\r\n    const gltf = bodyTemplates?.[gender];\r\n    if (!gltf || !gltf.scene) {\r\n        return null;\r\n    }\r\n\r\n    try {\r\n        const model = SkeletonUtils.clone(gltf.scene);\r\n        const animations = gltf.animations ?? [];\r\n        const mixer = new THREE.AnimationMixer(model);\r\n\r\n        if (animations.length) {\r\n            let clip = animations.find(a => a.name === 'Wait') || animations[0];\r\n            mixer.clipAction(clip).play().setLoop(THREE.LoopRepeat, Infinity);\r\n        }\r\n\r\n        return { model, animations, mixer, scaleDesc: detectModelDesc(model) };\r\n    }\r\n    catch(e) {\r\n        return null;\r\n    }\r\n}\r\nfunction fitCameraToObject(camera, object3D, padding = 1.25) {\r\n    // Ensure world matrices are current\r\n    object3D.updateWorldMatrix(true, true);\r\n\r\n    const box = new THREE.Box3().setFromObject(object3D);\r\n\r\n    // Safety: if box is empty, don't move camera\r\n    if (!Number.isFinite(box.min.x) || box.isEmpty()) return;\r\n\r\n    const center = box.getCenter(new THREE.Vector3());\r\n    const size = box.getSize(new THREE.Vector3());\r\n    const maxDim = Math.max(size.x, size.y, size.z) * padding;\r\n\r\n    // Look at center\r\n    camera.lookAt(center);\r\n\r\n    if (camera.isPerspectiveCamera) {\r\n        const fov = (camera.fov * Math.PI) / 180;\r\n        const dist = (maxDim / 2) / Math.tan(fov / 2);\r\n\r\n        // Move camera back on its current forward axis\r\n        const dir = new THREE.Vector3();\r\n        camera.getWorldDirection(dir); // points \"forward\"\r\n        camera.position.copy(center).addScaledVector(dir, -dist);\r\n\r\n        camera.near = Math.max(0.01, dist / 100);\r\n        camera.far = dist * 100;\r\n        camera.updateProjectionMatrix();\r\n    }\r\n    else if (camera.isOrthographicCamera) {\r\n        camera.left = -maxDim / 2;\r\n        camera.right = maxDim / 2;\r\n        camera.top = maxDim / 2;\r\n        camera.bottom = -maxDim / 2;\r\n        camera.near = -maxDim * 10;\r\n        camera.far = maxDim * 10;\r\n        camera.position.copy(center).add(new THREE.Vector3(0, 0, maxDim));\r\n        camera.updateProjectionMatrix();\r\n    }\r\n}\r\nfunction levelFaceCameraToObject(camera, object3D, distMultiplier = 1.15) {\r\n    object3D.updateWorldMatrix(true, true);\r\n\r\n    const box = new THREE.Box3().setFromObject(object3D);\r\n    if (box.isEmpty()) return;\r\n\r\n    const center = box.getCenter(new THREE.Vector3());\r\n    const size = box.getSize(new THREE.Vector3());\r\n    const maxDim = Math.max(size.x, size.y, size.z);\r\n\r\n    // distance needed to fit object (perspective only)\r\n    let dist = maxDim;\r\n    if (camera.isPerspectiveCamera) {\r\n        const fov = (camera.fov * Math.PI) / 180;\r\n        dist = (maxDim / 2) / Math.tan(fov / 2);\r\n    }\r\n    dist *= distMultiplier;\r\n\r\n    // Preserve which side of the model we're on (front/back), but REMOVE vertical component\r\n    const dir = camera.position.clone().sub(center);\r\n    dir.y = 0;\r\n    if (dir.lengthSq() < 1e-6) dir.set(0, 0, 1);\r\n    dir.normalize();\r\n\r\n    camera.up.set(0, 1, 0);\r\n\r\n    // Keep camera level with the head center (no looking up/down)\r\n    camera.position.set(\r\n        center.x + dir.x * dist,\r\n        center.y,                 // <-- this is the important part\r\n        center.z + dir.z * dist\r\n    );\r\n\r\n    camera.lookAt(center.x, center.y, center.z);\r\n\r\n    if (camera.isPerspectiveCamera) {\r\n        camera.near = Math.max(0.01, dist / 100);\r\n        camera.far = dist * 100;\r\n        camera.updateProjectionMatrix();\r\n    }\r\n}\r\n\r\nasync function renderRequestToImage(renderer, ffl, request, opts = {}) {\n    // Based on: https://github.com/ariankordi/FFL.js/blob/ae0a482abdbd9f81d4e12b055317c12a8a1783a4/examples/nodejs-icon-body-webgpu.js#L168\r\n    const scene = new THREE.Scene();\r\n    let charModel = null;\r\n    let body = null;\r\n\r\n    // Square output size (defaults to 256)\r\n    const SIZE = Number.isFinite(opts.size) ? Math.max(1, Math.floor(opts.size)) : 256;\r\n\r\n    try {\r\n        charModel = new CharModel(ffl, request.data, request.expression, FFLShaderNodeMaterial, renderer);\r\n\r\n        charModel.meshes.traverse((m) => {\r\n            m.frustumCulled = false;\r\n        });\r\n\r\n        // Keep your existing \"map -> sRGB\" tweak (safe/minimal).\r\n        // Note: this won't fix the monochrome issue by itself, but it doesn't hurt.\r\n        charModel.meshes.traverse((m) => {\r\n            if (m.material?.map) {\r\n                m.material.map.colorSpace = THREE.SRGBColorSpace;\r\n                m.material.needsUpdate = true;\r\n            }\r\n        });\r\n\r\n        // after: charModel = new CharModel(...)\r\n        scene.add(charModel.meshes); // <-- ALWAYS render head at minimum\r\n        if(!opts.bodyPath){\r\n            body = loadBodyModel(charModel.charInfo.gender);\r\n        }\r\n        else{\r\n            bodyTemplates[2]=await loadGLTFFromFS(opts.bodyPath);\r\n            body=loadBodyModel(2);\r\n        }\r\n\r\n        if (body) {\r\n            try {\r\n                body.mixer.update(0);\r\n\r\n                prepareBodyForCharModel(\r\n                    body,\r\n                    FFLShaderNodeMaterial,\r\n                    charModel.favoriteColor,\r\n                    charModel.getBodyScale(),\r\n                    pantsColors[request.pantsColor].clone().convertLinearToSRGB()\r\n                );\r\n\r\n                attachHeadToBody(body, charModel.meshes);\r\n\r\n                // head will get re-parented under the body, so add the body to scene too\r\n                scene.add(body.model);\r\n            }\r\n            catch (e) {\r\n                // If anything body-related fails, keep head-only rendering\r\n                body = null;\r\n            }\r\n        }\r\n\r\n\r\n\r\n        let camera;\r\n        if (request.fullBody && body) {\r\n            camera = getWholeBodyCamera(1, charModel.charInfo.height);\r\n        }\r\n        else {\r\n            camera = getFaceCamera();\r\n            if (body) {\r\n                adjustCameraForBodyHead(camera, body);\r\n            }\r\n            else {\r\n                levelFaceCameraToObject(camera, charModel.meshes);\r\n            }\r\n        }\r\n\r\n        const rt = new THREE.RenderTarget(SIZE, SIZE, {\r\n            samples: 4,\r\n            internalFormat: BGRA8Unorm,\r\n            minFilter: THREE.LinearFilter,\r\n            magFilter: THREE.LinearFilter\r\n        });\r\n\r\n        renderer.setRenderTarget(rt);\r\n        renderer.render(scene, camera);\r\n\r\n        const pixels = await renderer.readRenderTargetPixelsAsync(rt, 0, 0, SIZE, SIZE);\r\n        try {\r\n            return await encodePngImage(SIZE, SIZE, pixels);\r\n        }\r\n        catch {\r\n            // Fallback keeps rendering functional if PNG encoder fails unexpectedly.\r\n            return encodeBmpImage(SIZE, SIZE, pixels);\r\n        }\r\n    }\r\n    finally {\r\n        charModel && charModel.dispose();\r\n        if (body) {\r\n            disposeModel(body.model);\r\n            body.mixer.uncacheRoot(body.model);\r\n        }\r\n    }\n}\n\nfunction bytesToHex(bytes) {\n    let hex = \"\";\n    for (const byte of bytes) {\n        hex += byte.toString(16).padStart(2, \"0\");\n    }\n    return hex;\n}\n\nasync function imageResponseToBytes(res) {\n    if (!res.ok) {\n        throw new Error(`Mii Studio render failed: ${res.status} ${res.statusText}`);\n    }\n\n    const arrayBuffer = await res.arrayBuffer();\n    return (typeof Buffer !== \"undefined\") ? Buffer.from(arrayBuffer) : new Uint8Array(arrayBuffer);\n}\n\nasync function renderWithStudio(data, fullBody = false) {\n    data = structuredClone(await processMii.decodeMii(data));\n    data = processMii.encodeMii(data, MiiFormats.EMNMS);\n    const url=`https://studio.mii.nintendo.com/miis/image.png?data=${bytesToHex(data)}${fullBody?`&type=all_body`:``}&width=512&instanceCount=1`;\n    return await imageResponseToBytes(await fetch(url));\n}\n\r\nasync function renderForNode(data, opts = {}) {\r\n    await isInitialised;\r\n    //We need some info from the buffer, and we also need to make sure it's in MNMS\r\n    data = await normalizeDecodedMiiForRender(data);\r\n\r\n    var pantsColor = 0;\r\n    if (data?.meta?.type?.toLowerCase() === \"special\") {\r\n        pantsColor = 3;\r\n    }\r\n    else if (data?.perms?.favorited) {\r\n        pantsColor = 2;\r\n    }\r\n    else if (data?.meta?.type?.toLowerCase() === \"foreign\") {\r\n        pantsColor = 1;\r\n    }\r\n\r\n    // Add size default here so it\u2019s available to renderRequestToImage\r\n    opts = Object.assign({\r\n        fullBody: false,\r\n        expression: 0,\r\n        size: 512\r\n    }, data, opts);\r\n\r\n    opts.size -= opts.size % 64;\r\n    if (opts.size < 64) opts.size = 64;\r\n\r\n    data = processMii.encodeMii(data, MiiFormats.MNMS);\r\n\r\n    var resourceFile;\r\n    if (opts.fflResBuffer) {//Prefer the direct buffer\r\n        resourceFile = opts.fflResBuffer;\r\n    }\r\n    else if (opts.fflResPath) {//Use the path if they provided it\r\n        resourceFile = await fs.promises.readFile(opts.fflResPath);\r\n        if (!resourceFile) {\r\n            try {\r\n                resourceFile = await fetch(opts.fflResPath);\r\n                resourceFile = await resourceFile.blob();\r\n                resourceFile = Buffer.from(resourceFile);\r\n            }\r\n            catch{}\r\n        }\r\n    }\r\n    else if (_fflRes) {//See if it's in the root directory and use it automatically if we can\r\n        resourceFile = _fflRes;\r\n    }\r\n    else {//No FFL Resource, no textures or models to render with.\n        console.warn(`FFL Resource is unavailable. See README.md for more information.`);\n        return await renderWithStudio(data, opts.fullBody);\n    }\n\r\n    addSkeletonScalingExtensions(THREE.Skeleton);\r\n    await addWebGPUExtensions();\r\n\r\n    const renderer = await createThreeRenderer();\r\n    renderer.onDeviceLost = () => { };\r\n    renderer.outputColorSpace = THREE.SRGBColorSpace;\r\n    renderer.toneMapping = THREE.NoToneMapping;\r\n\r\n    let ffl = null;\r\n    var imageData = null;\r\n    try {\r\n        ffl = await FFL.initWithResource(resourceFile, ffl?.module ?? ModuleFFL);\r\n        ffl.setRenderer(renderer);\r\n\r\n        imageData = await renderRequestToImage(\r\n            renderer,\r\n            ffl,\r\n            {\r\n                data,\r\n                pantsColor,\r\n                fullBody: opts.fullBody,\r\n                expression: opts.expression\r\n            },\r\n            opts\r\n        );\r\n    }\r\n    finally {\r\n        (ffl) && ffl.dispose();\r\n        renderer.dispose();\r\n        const device = renderer.backend.device;\r\n        if (device instanceof GPUDevice) {\r\n            await device.queue.onSubmittedWorkDone();\r\n            device.destroy();\r\n        }\r\n    }\r\n    return imageData;\r\n}\r\n\r\nasync function renderForBrowser(data, opts = {}) {\r\n    await isInitialised;\r\n\r\n    data = await normalizeDecodedMiiForRender(data);\r\n\r\n    var pantsColor = 0;\r\n    if (data?.meta?.type?.toLowerCase() === \"special\") {\r\n        pantsColor = 3;\r\n    }\r\n    else if (data?.perms?.favorited) {\r\n        pantsColor = 2;\r\n    }\r\n    else if (data?.meta?.type?.toLowerCase() === \"foreign\") {\r\n        pantsColor = 1;\r\n    }\r\n\r\n    // Add size default here so it\u2019s available to renderRequestToImage\r\n    opts = Object.assign({\r\n        fullBody: false,\r\n        expression: 0,\r\n        size: 512\r\n    }, data, opts);\r\n\r\n    opts.size -= opts.size % 64;\r\n    if (opts.size < 64) opts.size = 64;\r\n\r\n    data = processMii.encodeMii(data, MiiFormats.MNMS);\r\n\r\n    // Load resource as Uint8Array (avoid Buffer in browser)\r\n    let resourceFile;\r\n\r\n    if (opts.fflResBuffer) {\r\n        resourceFile = opts.fflResBuffer;\r\n    }\r\n    else if (opts.fflResPath) {\r\n        const res = await fetch(opts.fflResPath);\r\n        resourceFile = new Uint8Array(await res.arrayBuffer());\r\n    }\r\n    else if (_fflRes) {\r\n        // If this is a Node Buffer, convert\r\n        resourceFile = _fflRes instanceof Uint8Array ? _fflRes : new Uint8Array(_fflRes);\r\n    }\r\n    else {\n        console.warn(`FFL Resource is unavailable. See README.md for more information.`);\n        return await renderWithStudio(data, opts.fullBody);\n    }\n    const ffl = await FFL.initWithResource(resourceFile, ModuleFFL);\r\n\r\n    // Create scene.\r\n    addSkeletonScalingExtensions(THREE.Skeleton);\r\n\r\n    const scene = new THREE.Scene();\r\n\r\n    const renderer = new THREE.WebGLRenderer({ alpha: true, antialias: true, preserveDrawingBuffer: true });\r\n    renderer.setSize(opts.size, opts.size, false);\r\n\r\n    ffl.setRenderer(renderer);\r\n\r\n    // Head model\r\n    let currentCharModel = new CharModel(ffl, data, opts.expression, FFLShaderMaterial, renderer);\r\n    currentCharModel.meshes.traverse(m => { m.frustumCulled = false; });\r\n    let body;\r\n    if(!opts.bodyPath){\r\n        body = loadBodyModel(currentCharModel.charInfo.gender);\r\n    }\r\n    else{\r\n        bodyTemplates[2]=await loadGLTFFromFS(opts.bodyPath);\r\n        body=loadBodyModel(2);\r\n    }\r\n\r\n    if (body) {\r\n        body.mixer.update(0);\r\n\r\n        prepareBodyForCharModel(\r\n            body,\r\n            FFLShaderMaterial,\r\n            currentCharModel.favoriteColor,\r\n            currentCharModel.getBodyScale(),\r\n            pantsColors[pantsColor].clone().convertLinearToSRGB()\r\n        );\r\n\r\n        attachHeadToBody(body, currentCharModel.meshes);\r\n        scene.add(body.model);\r\n    }\r\n    else {\r\n        scene.add(currentCharModel.meshes);\r\n    }\r\n\r\n    let camera;\r\n    if (opts.fullBody && body) {\r\n        camera = getWholeBodyCamera(1, currentCharModel.charInfo.height);\r\n    }\r\n    else {\r\n        camera = getFaceCamera();\r\n        if (body) {\r\n            adjustCameraForBodyHead(camera, body);\r\n        }\r\n        else {\r\n            levelFaceCameraToObject(camera, currentCharModel.meshes);\r\n        }\r\n    }\r\n\r\n    renderer.render(scene, camera);\r\n\r\n\r\n    // Ensure GPU finished\r\n    const gl = renderer.getContext();\r\n    gl.finish();\r\n\r\n    // Convert canvas -> PNG bytes\r\n    const blob = await new Promise(resolve =>\r\n        renderer.domElement.toBlob(resolve, \"image/png\")\r\n    );\r\n\r\n    const arrayBuffer = await blob.arrayBuffer();\r\n\r\n    // Return Buffer in Node, Uint8Array in browser\r\n    return (typeof Buffer !== \"undefined\") ? Buffer.from(arrayBuffer) : new Uint8Array(arrayBuffer);\r\n}\r\n\r\nvar renderMii;\r\nif (isNode) renderMii = renderForNode;\r\nelse renderMii = renderForBrowser;\r\n\r\nexport {\r\n    renderMii,\r\n    FFLExpression\r\n};\r\n", "import jsQR from \"jsqr\";\r\nimport QRCodeStyling from \"qr-code-styling\";\r\nimport { Buffer } from \"./platform.js\";\n\nimport { decodeMii, encodeMii, detectMiiFormat } from \"./miiProcess.js\";\nimport { MiiFormats } from \"./formats.js\";\n\nconst ONE_BY_ONE_GIF =\n  \"data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==\";\n\nconst isBrowser = typeof window !== \"undefined\" && typeof document !== \"undefined\";\nconst importNodeOnlyModule = isBrowser\n  ? null\n  : new Function(\"specifier\", \"return import(specifier)\");\n\nlet miiRenderingPromise;\nasync function renderMii(data, opts) {\n  miiRenderingPromise ??= import(\"./miiRendering.js\");\n  return (await miiRenderingPromise).renderMii(data, opts);\n}\n\nasync function loadNodeOnlyModule(specifier) {\n  if (!importNodeOnlyModule) {\n    throw new Error(`${specifier} is unavailable in the browser build`);\n  }\n  // Keep Node-only image dependencies out of browser bundle graphs.\n  return importNodeOnlyModule(specifier);\n}\n\nfunction isWebp(buf) {\n  return (\n    Buffer.isBuffer(buf)\n    && buf.length >= 12\r\n    && buf.toString(\"ascii\", 0, 4) === \"RIFF\"\r\n    && buf.toString(\"ascii\", 8, 12) === \"WEBP\"\r\n  );\r\n}\r\n\r\nfunction clampByte(n) {\r\n  if (n < 0) return 0;\r\n  if (n > 255) return 255;\r\n  return n | 0;\r\n}\r\n\r\nfunction toGrayscaleContrast(rgba, contrast = 1) {\r\n  const out = new Uint8ClampedArray(rgba.length);\r\n  for (let i = 0; i < rgba.length; i += 4) {\r\n    const lum = rgba[i] * 0.299 + rgba[i + 1] * 0.587 + rgba[i + 2] * 0.114;\r\n    const adjusted = clampByte((lum - 128) * contrast + 128);\r\n    out[i] = adjusted;\r\n    out[i + 1] = adjusted;\r\n    out[i + 2] = adjusted;\r\n    out[i + 3] = 255;\r\n  }\r\n  return out;\r\n}\r\n\r\nfunction toBinaryThreshold(rgba, threshold = 128) {\r\n  const out = new Uint8ClampedArray(rgba.length);\r\n  for (let i = 0; i < rgba.length; i += 4) {\r\n    const lum = rgba[i] * 0.299 + rgba[i + 1] * 0.587 + rgba[i + 2] * 0.114;\r\n    const value = lum < threshold ? 0 : 255;\r\n    out[i] = value;\r\n    out[i + 1] = value;\r\n    out[i + 2] = value;\r\n    out[i + 3] = 255;\r\n  }\r\n  return out;\r\n}\r\n\r\nfunction resizeNearest(rgba, width, height, scale) {\r\n  const outWidth = Math.max(1, Math.round(width * scale));\r\n  const outHeight = Math.max(1, Math.round(height * scale));\r\n  if (outWidth === width && outHeight === height) {\r\n    return { width, height, rgba };\r\n  }\r\n\r\n  const out = new Uint8ClampedArray(outWidth * outHeight * 4);\r\n  for (let y = 0; y < outHeight; y++) {\r\n    const srcY = Math.min(height - 1, Math.floor(y / scale));\r\n    for (let x = 0; x < outWidth; x++) {\r\n      const srcX = Math.min(width - 1, Math.floor(x / scale));\r\n      const srcI = (srcY * width + srcX) * 4;\r\n      const outI = (y * outWidth + x) * 4;\r\n      out[outI] = rgba[srcI];\r\n      out[outI + 1] = rgba[srcI + 1];\r\n      out[outI + 2] = rgba[srcI + 2];\r\n      out[outI + 3] = rgba[srcI + 3];\r\n    }\r\n  }\r\n\r\n  return { width: outWidth, height: outHeight, rgba: out };\r\n}\r\n\r\nfunction decodeWithJsQrVariants(rgba, width, height) {\r\n  const variants = [];\r\n  variants.push({ width, height, rgba });\r\n  variants.push({ width, height, rgba: toGrayscaleContrast(rgba, 1.4) });\r\n  variants.push({ width, height, rgba: toGrayscaleContrast(rgba, 1.9) });\r\n\r\n  for (const threshold of [112, 128, 144]) {\r\n    variants.push({ width, height, rgba: toBinaryThreshold(rgba, threshold) });\r\n  }\r\n\r\n  if (width * height <= 700 * 700) {\r\n    const upscaled = resizeNearest(rgba, width, height, 2);\r\n    variants.push(upscaled);\r\n    variants.push({ width: upscaled.width, height: upscaled.height, rgba: toGrayscaleContrast(upscaled.rgba, 1.4) });\r\n    variants.push({ width: upscaled.width, height: upscaled.height, rgba: toBinaryThreshold(upscaled.rgba, 128) });\r\n  }\r\n\r\n  const decodeOptions = [\r\n    { inversionAttempts: \"attemptBoth\" },\r\n    { inversionAttempts: \"dontInvert\" },\r\n    { inversionAttempts: \"onlyInvert\" },\r\n  ];\r\n\r\n  for (const variant of variants) {\r\n    for (const opts of decodeOptions) {\r\n      let decoded = null;\r\n      try {\r\n        decoded = jsQR(variant.rgba, variant.width, variant.height, opts);\r\n      } catch {\r\n        continue;\r\n      }\r\n      if (decoded?.binaryData?.length > 0) return decoded;\r\n    }\r\n  }\r\n\r\n  return null;\r\n}\r\n\r\nfunction bytesToLatin1String(bytes) {\r\n  if (Buffer.isBuffer(bytes)) return bytes.toString(\"latin1\");\r\n  const u8 = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);\r\n  let s = \"\";\r\n  for (let i = 0; i < u8.length; i++) s += String.fromCharCode(u8[i]);\r\n  return s;\r\n}\r\n\r\nasync function toUint8(input) {\r\n  if (input == null) throw new TypeError(\"Expected image bytes or Blob\");\r\n  if (Buffer.isBuffer(input)) return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\r\n  if (input instanceof Uint8Array) return input;\r\n  if (input instanceof ArrayBuffer) return new Uint8Array(input);\r\n  if (isBrowser && input instanceof Blob) return new Uint8Array(await input.arrayBuffer());\r\n  throw new TypeError(\"Unsupported input type\");\r\n}\r\n\r\n// --- Browser image decode: bytes/blob -> { width, height, rgba(Uint8ClampedArray) } ---\r\nasync function decodeImageToRGBA_Browser(bytesOrBlob) {\r\n  const blob = bytesOrBlob instanceof Blob ? bytesOrBlob : new Blob([await toUint8(bytesOrBlob)]);\r\n  const bmp = await createImageBitmap(blob);\r\n  const canvas = document.createElement(\"canvas\");\r\n  canvas.width = bmp.width;\r\n  canvas.height = bmp.height;\r\n  const ctx = canvas.getContext(\"2d\");\r\n  ctx.drawImage(bmp, 0, 0);\r\n  const imgData = ctx.getImageData(0, 0, canvas.width, canvas.height);\r\n  return { width: canvas.width, height: canvas.height, rgba: imgData.data };\r\n}\r\n\r\n// --- Node image decode: keep your existing PNG/JPEG path but load deps dynamically ---\r\nasync function decodeImageToRGBA_Node(buf) {\n  const [{ PNG }, jpeg, isPng, isJpg] = await Promise.all([\n    loadNodeOnlyModule(\"pngjs\"),\n    loadNodeOnlyModule(\"jpeg-js\"),\n    loadNodeOnlyModule(\"is-png\"),\n    loadNodeOnlyModule(\"is-jpg\"),\n  ]);\n\r\n  let width, height, rgba;\r\n  if (isPng.default(buf)) {\r\n    const png = PNG.sync.read(buf);\r\n    width = png.width;\r\n    height = png.height;\r\n    rgba = png.data;\r\n  } else if (isJpg.default(buf)) {\r\n    const jpg = jpeg.default.decode(buf, { useTArray: true });\r\n    width = jpg.width;\r\n    height = jpg.height;\r\n    rgba = jpg.data;\r\n  } else if (isWebp(buf)) {\n    try {\n      const { createCanvas, loadImage } = await loadNodeOnlyModule(\"canvas\");\n      const img = await loadImage(buf);\n      const canvas = createCanvas(img.width, img.height);\n      const ctx = canvas.getContext(\"2d\");\n      ctx.drawImage(img, 0, 0);\n      const imgData = ctx.getImageData(0, 0, img.width, img.height);\n      width = img.width;\r\n      height = img.height;\r\n      rgba = imgData.data;\r\n    } catch {\n      // Some canvas builds lack WEBP decode support; sharp provides a reliable fallback.\n      const sharpMod = await loadNodeOnlyModule(\"sharp\");\n      const sharp = sharpMod.default;\n      const raw = await sharp(buf).ensureAlpha().raw().toBuffer({ resolveWithObject: true });\n      width = raw.info.width;\n      height = raw.info.height;\n      rgba = raw.data;\r\n    }\r\n  } else {\r\n    throw new Error(\"Unsupported image format\");\r\n  }\r\n\r\n  const data = new Uint8ClampedArray(rgba.buffer, rgba.byteOffset, rgba.byteLength);\r\n  return { width, height, rgba: data };\r\n}\r\n\r\nasync function scanQR(input) {\r\n  try {\r\n    let decoded;\r\n    if (isBrowser) {\r\n      const { width, height, rgba } = await decodeImageToRGBA_Browser(input);\r\n      decoded = decodeWithJsQrVariants(rgba, width, height);\r\n    } else {\r\n      const buf = Buffer.isBuffer(input) ? input : Buffer.from(await toUint8(input));\r\n      const { width, height, rgba } = await decodeImageToRGBA_Node(buf);\r\n      decoded = decodeWithJsQrVariants(rgba, width, height);\r\n    }\r\n\r\n    if (!decoded) throw new Error(\"QR code not found\");\r\n    return Buffer.from(decoded.binaryData);\r\n  } catch (e) {\r\n    return null;\r\n  }\r\n}\r\n\r\nasync function makeQR(input, opts = {}) {\r\n  let {\r\n    size = 512,\r\n    margin = 0,\r\n    prefix = \"\",\r\n    encoding,\r\n    overlayFrac = 0.3,\r\n    qrOptions,\r\n    dotsOptions,\r\n    cornersSquareOptions,\r\n    cornersDotOptions,\r\n    backgroundOptions,\r\n    image,\r\n    noRenderMii = false,\r\n    label\r\n  } = opts;\r\n\r\n  let isSpecial = false;\r\n  if (input == null) throw new TypeError(\"makeQR(input): input is required\");\r\n\r\n  let dataStr = \"\";\r\n\r\n  // Resolve input -> dataStr + overlay\r\n  if (typeof input === \"string\") {\n    dataStr = input;\n  } else if (typeof input === \"object\" && input?.general?.hasOwnProperty(\"favoriteColor\")) {\n    if (!image && !noRenderMii) {\n      const overlayPng = await renderMii(input, opts);\n      image = Buffer.isBuffer(overlayPng) ? overlayPng : Buffer.from(overlayPng);\n    }\n\n    if (!label && input?.meta?.name?.length > 0) label = input.meta.name;\n    if (input?.meta?.type === \"Special\") isSpecial = true;\n\r\n    const encoded = encodeMii(input, MiiFormats.FFED);\r\n    dataStr = bytesToLatin1String(encoded);\r\n  } else if (Buffer.isBuffer(input) || input instanceof Uint8Array) {\r\n    if (!image && !noRenderMii && detectMiiFormat(input)?.length > 0) {\r\n      try {\r\n        const overlayPng = await renderMii(input, opts);\n        image = Buffer.isBuffer(overlayPng) ? overlayPng : Buffer.from(overlayPng);\n        const temp = await decodeMii(input);\n        if (!label && temp?.meta?.name?.length > 0) label = temp.meta.name;\n        if (temp?.meta?.type === \"Special\") isSpecial = true;\n      } catch (e) {\n        console.log(e);\r\n        image = null;\r\n      }\r\n    }\r\n    dataStr = bytesToLatin1String(input);\r\n  } else {\r\n    throw new TypeError(\"input must be string | Buffer | Uint8Array | Mii JSON\");\r\n  }\r\n\r\n  if (encoding && typeof input !== \"string\") {\r\n    dataStr = encoding === \"latin1\"\r\n      ? bytesToLatin1String(input)\r\n      : Buffer.from(input).toString(encoding);\r\n  }\r\n  if (prefix) dataStr = prefix + dataStr;\r\n\r\n  const hasOverlay = !!image;\r\n\r\n  // Build QRCodeStyling config. Node needs jsdom/nodeCanvas; browser must omit them.\r\n  const baseConfig = {\r\n    type: \"canvas\",\r\n    data: dataStr,\r\n    width: size,\r\n    height: size,\r\n    margin,\r\n\r\n    dotsOptions: { color: \"#000000\", type: \"square\", ...(dotsOptions ?? {}) },\r\n    backgroundOptions: { color: \"#ffffff\", ...(backgroundOptions ?? {}) },\r\n\r\n    image: hasOverlay ? ONE_BY_ONE_GIF : undefined,\r\n    imageOptions: {\r\n      saveAsBlob: false,\r\n      hideBackgroundDots: hasOverlay,\r\n      imageSize: 0.4,\r\n      crossOrigin: \"anonymous\",\r\n      margin: 0,\r\n    },\r\n\r\n    qrOptions: { errorCorrectionLevel: \"H\", ...(qrOptions ?? {}) },\r\n\r\n    ...(cornersSquareOptions ? { cornersSquareOptions: { ...cornersSquareOptions } } : {}),\r\n    ...(cornersDotOptions ? { cornersDotOptions: { ...cornersDotOptions } } : {}),\r\n  };\n\n  if (!isBrowser) {\n    const { JSDOM } = await loadNodeOnlyModule(\"jsdom\");\n    const nodeCanvas = await loadNodeOnlyModule(\"canvas\");\n    baseConfig.jsdom = JSDOM;\n    baseConfig.nodeCanvas = nodeCanvas;\n  }\n\r\n  const qr = new QRCodeStyling(baseConfig);\r\n\r\n  // Get QR PNG bytes\r\n  let qrBytes;\r\n  if (isBrowser) {\r\n    const blob = await qr.getRawData(\"png\");       // Blob in browser\r\n    qrBytes = new Uint8Array(await blob.arrayBuffer());\r\n  } else {\r\n    qrBytes = Buffer.from(await qr.getRawData(\"png\")); // Buffer-ish in node\r\n  }\r\n\r\n  if (!hasOverlay) return Buffer.from(qrBytes);\r\n\r\n  // Composite overlay onto QR in current environment\r\n  if (isBrowser) {\r\n    // Browser canvas compositing\r\n    const canvas = document.createElement(\"canvas\");\r\n    canvas.width = size;\r\n    canvas.height = size;\r\n    const ctx = canvas.getContext(\"2d\");\r\n\r\n    const qrBmp = await createImageBitmap(new Blob([qrBytes], { type: \"image/png\" }));\r\n    ctx.drawImage(qrBmp, 0, 0, size, size);\r\n\r\n    const overlayBlob = image instanceof Blob ? image : new Blob([await toUint8(image)], { type: \"image/png\" });\r\n    const overlayBmp = await createImageBitmap(overlayBlob);\r\n\r\n    const box = Math.floor(size * overlayFrac);\r\n    const x = Math.floor((size - box) / 2);\r\n    const y = Math.floor((size - box) / 2);\r\n\r\n    const scale = Math.min(box / overlayBmp.width, box / overlayBmp.height);\r\n    const w = Math.floor(overlayBmp.width * scale);\r\n    const h = Math.floor(overlayBmp.height * scale);\r\n    const ox = x + Math.floor((box - w) / 2);\r\n    const oy = y + Math.floor((box - h) / 2);\r\n\r\n    const fontSize = Math.max(12, Math.floor(box * 0.12));\r\n    ctx.font = `${fontSize}px sans-serif`;\r\n    ctx.textAlign = \"center\";\r\n    ctx.textBaseline = \"top\";\r\n    const textX = x + box / 2;\r\n    const textY = oy;\r\n    ctx.fillStyle = \"#000000\";\r\n    if (label) ctx.fillText(label, textX, textY);\r\n\r\n    ctx.drawImage(overlayBmp, ox, oy, w, h);\r\n\r\n    if (isSpecial) {\r\n      ctx.strokeStyle = \"#D4AF37\";\r\n      ctx.lineWidth = 5;\r\n      ctx.strokeRect(x + ctx.lineWidth / 2, y + ctx.lineWidth / 2, box - ctx.lineWidth, box - ctx.lineWidth);\r\n      ctx.strokeRect(ctx.lineWidth / 2, ctx.lineWidth / 2, size - ctx.lineWidth, size - ctx.lineWidth);\r\n    }\r\n\r\n    const outBlob = await new Promise((res) => canvas.toBlob(res, \"image/png\"));\r\n    return Buffer.from(new Uint8Array(await outBlob.arrayBuffer()));\r\n  } else {\n    // Node canvas compositing (your original logic)\n    const nodeCanvas = await loadNodeOnlyModule(\"canvas\");\n    const { createCanvas, loadImage } = nodeCanvas;\n\r\n    const canvas = createCanvas(size, size);\r\n    const ctx = canvas.getContext(\"2d\");\r\n\r\n    const qrImg = await loadImage(Buffer.from(qrBytes));\r\n    ctx.drawImage(qrImg, 0, 0, size, size);\r\n\r\n    const overlayImg = await loadImage(image);\r\n\r\n    const box = Math.floor(size * overlayFrac);\r\n    const x = Math.floor((size - box) / 2);\r\n    const y = Math.floor((size - box) / 2);\r\n\r\n    const scale = Math.min(box / overlayImg.width, box / overlayImg.height);\r\n    const w = Math.floor(overlayImg.width * scale);\r\n    const h = Math.floor(overlayImg.height * scale);\r\n    const ox = x + Math.floor((box - w) / 2);\r\n    const oy = y + Math.floor((box - h) / 2);\r\n\r\n    const fontSize = Math.max(12, Math.floor(box * 0.12));\r\n    ctx.font = `${fontSize}px sans-serif`;\r\n    ctx.textAlign = \"center\";\r\n    ctx.textBaseline = \"top\";\r\n\r\n    const textX = x + box / 2;\r\n    const textY = oy;\r\n\r\n    ctx.fillStyle = \"#000000\";\r\n    if (label) ctx.fillText(label, textX, textY);\r\n\r\n    if (image) ctx.drawImage(overlayImg, ox, oy, w, h);\r\n\r\n    if (isSpecial) {\r\n      ctx.strokeStyle = \"#D4AF37\";\r\n      ctx.lineWidth = 5;\r\n      ctx.strokeRect(x + ctx.lineWidth / 2, y + ctx.lineWidth / 2, box - ctx.lineWidth, box - ctx.lineWidth);\r\n      ctx.strokeRect(ctx.lineWidth / 2, ctx.lineWidth / 2, size - ctx.lineWidth, size - ctx.lineWidth);\r\n    }\r\n\r\n    return canvas.toBuffer(\"image/png\");\r\n  }\r\n}\r\n\r\nexport { scanQR, makeQR };\r\n", "import { formats, mappings, defaultMappings, forwardPort, backPort } from \"./formats.js\";\nimport { lookupTables } from \"./data.js\";\n\r\nimport { Buffer } from \"./platform.js\";\r\n\r\nimport { scanQR } from \"./qrTools.js\";\r\n\r\nfunction isWebp(buf) {\n    return (\n        Buffer.isBuffer(buf)\n        && buf.length >= 12\n        && buf.toString(\"ascii\", 0, 4) === \"RIFF\"\n        && buf.toString(\"ascii\", 8, 12) === \"WEBP\"\n    );\n}\nfunction isPng(buf) {\n    return (\n        Buffer.isBuffer(buf)\n        && buf.length >= 8\n        && buf[0] === 0x89\n        && buf[1] === 0x50\n        && buf[2] === 0x4E\n        && buf[3] === 0x47\n        && buf[4] === 0x0D\n        && buf[5] === 0x0A\n        && buf[6] === 0x1A\n        && buf[7] === 0x0A\n    );\n}\nfunction isJpg(buf) {\n    return (\n        Buffer.isBuffer(buf)\n        && buf.length >= 3\n        && buf[0] === 0xFF\n        && buf[1] === 0xD8\n        && buf[2] === 0xFF\n    );\n}\n\r\n/** @typedef {Buffer|Uint8Array|ArrayBuffer|SharedArrayBuffer} SupportedBuffers */\r\n\r\n/** Returns polyfilled buffer if type is buffer type, else false */\r\nfunction isBuffer(inp) {\r\n    const isValidBuffer =\r\n        Buffer.isBuffer(inp)\r\n        || inp instanceof Uint8Array\r\n        || inp instanceof ArrayBuffer\r\n        || inp instanceof SharedArrayBuffer;\r\n    // || (Array.isArray(inp) && inp.every(x => Number.isInteger(x) && x >= 0 && x <= 255));\r\n\r\n    if (!isValidBuffer) return false;\r\n    return Buffer.from(inp);\r\n}\r\nfunction ensureBuffer(buf, debug) {\n    // If already bytes, just validate buffer\r\n    let out = buf;\r\n\r\n    if (typeof out === \"string\") {\r\n        const s = out.trim();\r\n\r\n        // ---- data URI ----\r\n        if (/^data:/i.test(s)) {\r\n            const comma = s.indexOf(\",\");\r\n            if (comma === -1) return false;\r\n\r\n            const meta = s.slice(5, comma);// after \"data:\" up to comma\r\n            let data = s.slice(comma + 1);\r\n\r\n            const isB64 = /;\\s*base64\\s*$/i.test(meta);\r\n            if (debug) console.log(`Processing as data URI (${isB64 ? \"base64\" : \"percent\"})`);\r\n\r\n            if (isB64) {\r\n                // base64 payload (strip whitespace, allow base64url, allow missing padding)\r\n                data = data.replace(/\\s+/g, \"\").replace(/-/g, \"+\").replace(/_/g, \"/\");\r\n                const pad = data.length % 4;\r\n                if (pad) data += \"=\".repeat(4 - pad);\r\n\r\n                out = bytesFromBase64(data);\r\n            } else {\r\n                // percent-encoded (data:,Hello%20world)\r\n                try {\r\n                    const decoded = decodeURIComponent(data);\r\n                    out = bytesFromText(decoded);\r\n                } catch {\r\n                    return false;\r\n                }\r\n            }\r\n        }\r\n        else {\r\n            const compact = s.replace(/\\s+/g, \"\");\r\n            if (/^[0-9a-f]+$/i.test(compact) && (compact.length % 2 === 0)) {\r\n                if (debug) console.log(\"Processing as hex\");\r\n                out = bytesFromHex(compact);\r\n            }\r\n            else if (/^[A-Za-z0-9+/_-]+={0,2}$/.test(compact) && compact.length >= 4) {\r\n                if (debug) console.log(\"Processing as base64\");\r\n                let b64 = compact.replace(/-/g, \"+\").replace(/_/g, \"/\");\r\n                const pad = b64.length % 4;\r\n                if (pad) b64 += \"=\".repeat(4 - pad);\r\n                out = bytesFromBase64(b64);\r\n            }\r\n        }\r\n    }\r\n    out = isBuffer(out);\r\n    return out ? out : false;\n}\nfunction isPromiseLike(value) {\n    return value && typeof value.then === \"function\";\n}\n\nfunction bytesFromHex(hex) {\n    if (typeof Buffer !== \"undefined\" && Buffer.from) return Buffer.from(hex, \"hex\");\r\n    const out = new Uint8Array(hex.length / 2);\r\n    for (let i = 0, j = 0; i < hex.length; i += 2, j++) out[j] = parseInt(hex.slice(i, i + 2), 16);\r\n    return out;\r\n}\r\n\r\nfunction bytesFromBase64(b64) {\r\n    if (typeof Buffer !== \"undefined\" && Buffer.from) return Buffer.from(b64, \"base64\");\r\n    if (typeof atob !== \"undefined\") {\r\n        const bin = atob(b64);\r\n        const out = new Uint8Array(bin.length);\r\n        for (let i = 0; i < bin.length; i++) out[i] = bin.charCodeAt(i);\r\n        return out;\r\n    }\r\n    return null;\r\n}\r\n\r\nfunction bytesFromText(str) {\r\n    if (typeof TextEncoder !== \"undefined\") return new TextEncoder().encode(str);\r\n    if (typeof Buffer !== \"undefined\" && Buffer.from) return Buffer.from(str, \"utf8\");\r\n    const out = new Uint8Array(str.length);\r\n    for (let i = 0; i < str.length; i++) out[i] = str.charCodeAt(i) & 0xff;\r\n    return out;\r\n}\r\n\r\n\r\n/** @typedef {import(\"./mii-jsdoc.js\").Mii} MiiData */\r\n\r\nconst canonical3DSGlassesTypes = new Set(lookupTables.glassesTypes);\r\n\r\nfunction formatUses3DSTranslation(formatName, visited = new Set()) {\r\n    if (!formatName || visited.has(formatName)) return false;\r\n    visited.add(formatName);\r\n\r\n    const format = formats[formatName];\r\n    if (!format) return false;\r\n    if (format.translation === \"3ds\") return true;\r\n    if (format.preEncode) return formatUses3DSTranslation(format.preEncode, visited);\r\n    return false;\r\n}\r\n\r\n\r\nfunction bufferToBitString(buf) {\r\n    let out = '';\r\n    for (let i = 0; i < buf.length; i++) {\r\n        out += buf[i].toString(2).padStart(8, '0');\r\n    }\r\n    return out;\r\n}\r\nfunction setNestedValue(obj, key, value) {\r\n    try {\r\n        const keys = key.split('.');\r\n        const lastKey = keys.pop();\r\n\r\n        const target = keys.reduce((current, key) => {\r\n            if (!current[key] || typeof current[key] !== 'object' || Array.isArray(current[key])) {\r\n                current[key] = {};\r\n            }\r\n            return current[key];\r\n        }, obj);\r\n\r\n        target[lastKey] = value;\r\n        return obj;\r\n    }\r\n    catch (e) {\r\n        throw new Error(`${key} was not usable.`);\r\n    }\r\n}\r\nfunction getNestedValue(obj, path) {\r\n    if (path === 'SKIP') return null;\r\n    try {\r\n        const parts = path.split('.');\r\n        let current = obj;\r\n        for (const part of parts) {\r\n            if (current === undefined || current === null) {\r\n                return undefined;\r\n            }\r\n            current = current[part];\r\n        }\r\n        return current;\r\n    }\r\n    catch (e) {\r\n        return null;\r\n    }\r\n}\r\n\r\nfunction binaryToText(binaryString) {\r\n    const chars = [];\r\n\r\n    for (let i = 0; i + 16 <= binaryString.length; i += 16) {\r\n        const chunk = binaryString.slice(i, i + 16);\r\n\r\n        const highByte = parseInt(chunk.slice(0, 8), 2);\r\n        const lowByte = parseInt(chunk.slice(8, 16), 2);\r\n        const charCode = (highByte << 8) | lowByte;\r\n\r\n        // stop at first null character (0x0000)\r\n        if (charCode === 0) break;\r\n\r\n        chars.push(String.fromCharCode(charCode));\r\n    }\r\n\r\n    return chars.join('');\r\n}\r\n\r\nfunction textToBinaryBE(text, bitLength) {\r\n    const numChars = bitLength / 16;\r\n    let binary = '';\r\n    for (let i = 0; i < numChars; i++) {\r\n        const charCode = i < text.length ? text.charCodeAt(i) : 0;\r\n        binary += charCode.toString(2).padStart(16, '0');\r\n    }\r\n    return binary;\r\n}\r\n\r\nfunction textToBinaryLE(text, bitLength) {\r\n    const numChars = bitLength / 16;\r\n    let binary = '';\r\n    for (let i = 0; i < numChars; i++) {\r\n        const charCode = i < text.length ? text.charCodeAt(i) : 0;\r\n        // Low byte (bits 0-7), then high byte (bits 8-15)\r\n        const lowByte = (charCode & 0xFF).toString(2).padStart(8, '0');\r\n        const highByte = ((charCode >> 8) & 0xFF).toString(2).padStart(8, '0');\r\n        binary += lowByte + highByte;\r\n    }\r\n    return binary;\r\n}\r\n\r\nfunction binaryToTextLE(binaryString) {\r\n    const chars = [];\r\n\r\n    for (let i = 0; i + 16 <= binaryString.length; i += 16) {\r\n        const chunk = binaryString.slice(i, i + 16);\r\n\r\n        // First 8 bits = low byte, next 8 bits = high byte (little-endian)\r\n        const lowByte = parseInt(chunk.slice(0, 8), 2);\r\n        const highByte = parseInt(chunk.slice(8, 16), 2);\r\n        const charCode = (highByte << 8) | lowByte;\r\n\r\n        // stop at first null character (0x0000)\r\n        if (charCode === 0) break;\r\n\r\n        chars.push(String.fromCharCode(charCode));\r\n    }\r\n\r\n    return chars.join('');\r\n}\r\n\r\n/**\r\n* Check whether given buffer matches the specified mii format\r\n* @param {SupportedBuffers} buf - The buffer to validate.\r\n* @param {string} requireFormat - The format requested.\r\n* @param {boolean} debug - Debug logging\r\n* @returns {boolean} Returns true if the buffer is in provided format, false if not.\r\n*/\r\nfunction isMiiInFormat(buf, requireFormat, debug) {\r\n    // Validate input\r\n    buf = isBuffer(buf);\r\n    if (!buf) {\r\n        console.error(`Is not a buffer`);\r\n        return false;\r\n    }\r\n\r\n    // Validate format\r\n    requireFormat = requireFormat?.toLowerCase().replaceAll(\".\", '');\r\n    if (buf.length !== formats[requireFormat].len) {\r\n        if (debug) console.log(`The file length does not match ${requireFormat}, expected`, formats[requireFormat].len, \"got\", buf.length);\r\n        return false;\r\n    }\r\n\r\n    let bits = bufferToBitString(buf);\r\n    let offset = 0;\r\n    let wordBits = null;\r\n    let wordPos = 0;\r\n    let wordEnd = 0;\r\n    if (formats[requireFormat].hasOwnProperty('struct')) {\r\n        let wordStartOffset = 0;\r\n\r\n        for (const field of formats[requireFormat].struct) {\r\n            if (field.word) {\r\n                wordStartOffset = offset;\r\n                const raw = bits.slice(offset, offset + field.len);\r\n                const bytes = raw.match(/.{1,8}/g) || [];\r\n                wordBits = bytes.map(b => b.split('').reverse().join('')).join('');\r\n                wordPos = 0;\r\n                wordEnd = field.len;\r\n                continue;\r\n            }\r\n\r\n            const inWord = wordBits && wordPos + field.len <= wordEnd;\r\n\r\n            // choose slice\r\n            const slice = inWord\r\n                ? wordBits.slice(wordPos, wordPos + field.len)\r\n                : bits.slice(offset, offset + field.len);\r\n\r\n            // validate\r\n            if (field.max !== undefined || field.min !== undefined) {\r\n                const numBits = inWord ? slice.split('').reverse().join('') : slice;\r\n                const subset = parseInt(numBits, 2);\r\n                const min = field.min ?? 0;\r\n                const max = field.max ?? subset; // if no max, don't fail\r\n                if (subset < min || subset > max) {\r\n                    if (debug) console.log(`${requireFormat} fails due to ${field.name} being ${subset}, which is outside the bounds of ${min}-${max}. Offset ${offset}.`);\r\n                    return false;\r\n                }\r\n            }\r\n\r\n            // advance (MATCH decodeMii)\r\n            if (inWord) {\r\n                wordPos += field.len;\r\n                if (wordPos >= wordEnd) {\r\n                    wordBits = null;\r\n                    offset = wordStartOffset + wordEnd;\r\n                }\r\n            } else {\r\n                offset += field.len;\r\n            }\r\n        }\r\n\r\n    }\r\n\r\n    // Passed all checks\r\n    return true;\r\n}\r\n\r\n/**\r\n* Detects the Mii format(s) present in the given buffer.\r\n* @param {Buffer} buf - The potential mii buffer\r\n* @param {boolean} debug - Optional flag to enable debug logging.\r\n* @returns {string[]} An array of matching format names, or null if the input is not a Buffer.\r\n*/\r\nfunction detectMiiFormat(buf, debug) {\r\n    buf = isBuffer(buf);\r\n    if (!buf) return [];\r\n    let matches = [];\r\n    Object.keys(formats).forEach(form => {\r\n        if (isMiiInFormat(buf, form, debug)) matches.push(form);\r\n    });\r\n\r\n    if (matches.length == 0) {\r\n        //We only do this if no other format matches since Miis have no headers/magic bytes and I imagine some format could have the potential to collide with a PNG/JPG's\r\n        if (isPng(buf)) matches.push(\"png\");\r\n        if (isJpg(buf)) matches.push(\"jpg\");\r\n        if (isWebp(buf)) matches.push(\"webp\");\r\n    }\r\n\r\n    return matches;\r\n}\r\n\r\n/**\r\n * Decodes Mii data from various input formats (Buffer, hex string, file path, or URL) into a structured object.\r\n * If the input is already a decoded object (checked by presence of 'general.favoriteColor'), it returns as-is.\r\n * Supports decoding from different Mii formats, including QR codes in images, and applies post-processing or translations if defined.\r\n * \r\n * @param {SupportedBuffers|string} toDecode - The data to decode. Accepts a Buffer, a hex string, a file path string, or a URL string.\r\n * @param {boolean} [debug] - Optional flag to enable debug logging during the decoding process.\r\n * @returns {MiiData} The decoded Mii object with structured data.\r\n * @throws {Error} If the input type is invalid, QR code decoding fails, or no decodable format is found.\r\n */\r\nfunction decodeMii(toDecode, debug) {\r\n    // If data is already decoded, return - TODO: verifying the format here would be better than a single field check\r\n    if (toDecode?.general?.hasOwnProperty(\"favoriteColor\")) return toDecode;\r\n\r\n    //Ensure Buffer, convert from hex string, file path string, URL path string\r\n    toDecode = ensureBuffer(toDecode);\r\n    if (!toDecode) throw new Error(`toDecode is an invalid type (Accepts: Buffer, Hex String, File Path String, URL String).`);\r\n\r\n    //Choose the file type to decode it from\r\n    var miiType = detectMiiFormat(toDecode);\n    if (miiType.includes(\"png\") || miiType.includes(\"jpg\") || miiType.includes(\"webp\")) {\n        toDecode = scanQR(toDecode);\n        if (isPromiseLike(toDecode)) {\n            return toDecode.then(scanned => {\n                if (scanned === null) throw new Error(`Detected an image QR format (PNG/JPG/WEBP), but couldn't decode the QR code!`);\n                return decodeMii(scanned, debug);\n            });\n        }\n        if (toDecode === null) throw new Error(`Detected an image QR format (PNG/JPG/WEBP), but couldn't decode the QR code!`);\n        miiType = detectMiiFormat(toDecode);\n    }\n    miiType = miiType.filter(a => formats[a].hasOwnProperty(\"struct\"));\r\n    if (miiType.length == 0) {\r\n        //Before we throw, check if it's an encrypted format we can decrypt\r\n        let workableFormats = detectMiiFormat(toDecode, debug);\n        if (workableFormats.filter(a => formats[a].hasOwnProperty(\"decoder\")).length > 0) {\n            toDecode = formats[workableFormats[0]].decoder(toDecode);\n            if (isPromiseLike(toDecode)) {\n                return toDecode.then(decoded => {\n                    if (debug) console.log(`Attempted to decode as ${workableFormats[0]}`);\n                    if (typeof decoded == 'object' && !isBuffer(decoded)) {\n                        if (debug) console.log(`Returning a pre-decoded object`);\n                        return decoded;\n                    }\n                    if (debug) console.log(`Now decoding async decoder output`);\n                    return decodeMii(decoded, debug);\n                });\n            }\n            if (debug) console.log(`Attempted to decode as ${workableFormats[0]}`);\n            //If it decoded correctly to JSON already, our job here is done.\n            if (typeof toDecode == 'object' && !isBuffer(toDecode)) {\n                if (debug) console.log(`Returning a pre-decoded object`);\r\n                return toDecode;\r\n            }\r\n            else {\r\n                miiType = detectMiiFormat(toDecode).filter(a => formats[a].hasOwnProperty(\"struct\"));\r\n                if (debug) console.log(`Now decoding as ${miiType}`);\r\n            }\r\n        }\r\n        if (miiType.length == 0) {\r\n            if (debug) console.error(toDecode);\r\n            throw new Error(`Could not find any decodeable formats${(typeof debug !== \"boolean\" && debug !== undefined) ? ` for ${debug}` : ``}: ${detectMiiFormat(toDecode, debug)}`);\r\n        }\r\n    }\r\n    miiType = miiType[0];\r\n\r\n    //Start building based on the struct definition\r\n    var obj = {};\r\n    var offset = 0;\r\n    let val;\r\n    let bits = bufferToBitString(toDecode);\r\n    let wordBits = null;\r\n    let wordPos = 0;\r\n    let wordEnd = 0;\r\n    let wordStartOffset = 0;\r\n    for (const field of formats[miiType].struct) {\r\n        // Start a word window (does NOT consume offset)\r\n        if (field.word) {\r\n            wordStartOffset = offset;\r\n            const raw = bits.slice(offset, offset + field.len);\r\n            const bytes = raw.match(/.{1,8}/g) || [];\r\n            wordBits = bytes.map(b => b.split('').reverse().join('')).join('');\r\n            wordPos = 0;\r\n            wordEnd = field.len;\r\n            continue;\r\n        }\r\n\r\n        const wasInWord = wordBits && wordPos + field.len <= wordEnd;\r\n\r\n        if (mappings[field.name] === 'SKIP') {\r\n            if (wasInWord) {\r\n                wordPos += field.len;\r\n                if (wordPos >= wordEnd) {\r\n                    wordBits = null;\r\n                    offset = wordStartOffset + wordEnd;\r\n                }\r\n            }\r\n            else {\r\n                offset += field.len;\r\n            }\r\n            continue;\r\n        }\r\n\r\n        let subset;\r\n\r\n        if (wasInWord) {\r\n            subset = wordBits.slice(wordPos, wordPos + field.len);\r\n        }\r\n        else {\r\n            subset = bits.slice(offset, offset + field.len);\r\n        }\r\n\r\n        if (field.text) {\r\n            // Support both boolean (defaults to \"be\") and explicit endianness\r\n            const endianness = typeof field.text === 'string' ? field.text.toLowerCase() : 'be';\r\n            val = (endianness === 'le') ? binaryToTextLE(subset) : binaryToText(subset);\r\n        }\r\n        else if (field.hex) {\r\n            val = subset.match(/.{1,4}/g)\r\n                .map(chunk => parseInt(chunk, 2).toString(16).toUpperCase())\r\n                .join('');\r\n        }\r\n        else {\r\n            // Numeric fields from word are LSB->MSB, reverse them\r\n            const numBits = wasInWord ? subset.split('').reverse().join('') : subset;\r\n            val = parseInt(numBits, 2);\r\n            if (field.bool) val = !!val;\r\n        }\r\n\r\n        if (field.hasOwnProperty(\"decoder\")) {\r\n            val = field.decoder(val);\r\n        }\r\n\r\n        if (mappings[field.name] === undefined && debug) {\r\n            console.log(`Skipping ${field.name} for being undefined.`);\r\n        }\r\n        else if (mappings[field.name] !== undefined) {\r\n            obj = setNestedValue(obj, mappings[field.name], val);\r\n        }\r\n\r\n        // Advance positions\r\n        if (wasInWord) {\r\n            wordPos += field.len;\r\n            if (wordPos >= wordEnd) {\r\n                wordBits = null;\r\n                offset = wordStartOffset + wordEnd;\r\n            }\r\n        } else {\r\n            offset += field.len;\r\n        }\r\n    }\r\n\r\n    if (formats[miiType].hasOwnProperty(\"postProcess\")) {\r\n        obj = formats[miiType].postProcess(obj);\r\n    }\r\n    if (formats[miiType].hasOwnProperty(\"translation\")) {\r\n        obj = forwardPort(obj, formats[miiType].translation);\r\n    }\r\n\r\n    return obj;\r\n}\r\nfunction encodeMii(miiObject, targetFormat, debug) {\r\n    if (!formats[targetFormat]) {\r\n        throw new Error(`Unknown format: ${targetFormat}`);\r\n    }\r\n\r\n    if (!formats[targetFormat].hasOwnProperty(\"struct\")) {\r\n        if (!formats[targetFormat].hasOwnProperty(\"encoder\")) {\r\n            throw new Error(`Format ${targetFormat} does not have a struct definition for encoding`);\r\n        }\r\n        else {\n            if (formats[targetFormat].hasOwnProperty(\"preEncode\")) {\n                miiObject = encodeMii(miiObject, formats[targetFormat].preEncode);\n                if (isPromiseLike(miiObject)) {\n                    return miiObject.then(encoded => formats[targetFormat].encoder(encoded));\n                }\n            }\n            return formats[targetFormat].encoder(miiObject);\n        }\n    }\n\r\n    // Apply pre-processing\r\n    let obj = structuredClone(miiObject);\r\n    if (formats[targetFormat].hasOwnProperty(\"translation\")) {\r\n        obj = backPort(obj, formats[targetFormat].translation);\r\n    }\r\n    if (formats[targetFormat].hasOwnProperty(\"preProcess\")) {\r\n        obj = formats[targetFormat].preProcess(obj);\r\n    }\r\n\r\n    // Helper function to get nested value from object\r\n\r\n\r\n    // Build bit string\r\n    let bits = '';\r\n    let wordBits = '';\r\n    let wordLen = 0;\r\n    let inWord = false;\r\n\r\n    for (const field of formats[targetFormat].struct) {\r\n        // Start a word window\r\n        if (field.word) {\r\n            inWord = true;\r\n            wordBits = '';\r\n            wordLen = field.len;\r\n            continue;\r\n        }\r\n        let val = getNestedValue(obj, mappings[field.name]);\r\n\r\n        // Handle SKIP fields\r\n        if (mappings[field.name] === 'SKIP') {\r\n            if (field.hasOwnProperty(\"encoder\")) {\r\n                val = field.encoder(val);\r\n            }\r\n            else {\r\n                const skipBits = '0'.repeat(field.len);\r\n                if (inWord) {\r\n                    wordBits += skipBits;\r\n                } else {\r\n                    bits += skipBits;\r\n                }\r\n\r\n                if (inWord && wordBits.length >= wordLen) {\r\n                    // Reverse bytes and append to main bits\r\n                    const byteReversed = wordBits.match(/.{1,8}/g)\r\n                        .map(b => b.split('').reverse().join(''))\r\n                        .join('');\r\n                    bits += byteReversed;\r\n                    inWord = false;\r\n                    wordBits = '';\r\n                }\r\n                continue;\r\n            }\r\n        }\r\n\r\n        // Handle undefined values\r\n        if (val === undefined || val === null) {\r\n            val = defaultMappings.hasOwnProperty(field.name) ? defaultMappings[field.name] : (f => {\r\n                let v = Math.min(f.max, Math.max(0, f.min));\r\n                if (f.text) {\r\n                    v = \"\";\r\n                }\r\n                else if (f.hex) {\r\n                    v = \"0\".repeat(f.len / 4);\r\n                }\r\n                else if (f.bool) {\r\n                    v = false;\r\n                }\r\n                return v;\r\n            })(field);\r\n            //Some fields have different defaults for different genders, if a gender is set, use that one's default. Otherwise use the male default (games like Tomodachi Life set this precedent).\r\n            if (typeof val == 'object') val = val[+getNestedValue(obj, 'general.gender') ? +getNestedValue(obj, 'general.gender') : 0];\r\n        }\r\n\r\n        // Apply specific encoder if present\r\n        if (field.hasOwnProperty(\"encoder\")) {\r\n            val = field.encoder(val);\r\n        }\r\n\r\n        let fieldBits;\r\n\r\n        if (field.text) {\r\n            // Text encoding\r\n            if (val.length === 0) val = \"\";\r\n            const endianness = typeof field.text === 'string' ? field.text.toLowerCase() : 'be';\r\n            fieldBits = (endianness === 'le')\r\n                ? textToBinaryLE(val, field.len)\r\n                : textToBinaryBE(val, field.len);\r\n        }\r\n        else if (field.hex) {\r\n            // Expect val to be a Uint8Array / Buffer OR hex string\r\n            let bytes;\r\n            const hexStr = val.replace(/[^0-9A-Fa-f]/g, \"\");\r\n            bytes = Buffer.from(hexStr, \"hex\");\r\n\r\n            const totalBits = field.len;\r\n            const totalBytes = Math.ceil(totalBits / 8);\r\n\r\n            // Pad or truncate to required byte length\r\n            const fixed = Buffer.alloc(totalBytes);\r\n            bytes.copy(fixed, 0, 0, Math.min(bytes.length, totalBytes));\r\n\r\n            // Convert to bit string, then clamp to exact bit length\r\n            fieldBits = \"\";\r\n            for (let i = 0; i < fixed.length; i++) {\r\n                fieldBits += fixed[i].toString(2).padStart(8, \"0\");\r\n            }\r\n\r\n            fieldBits = fieldBits.slice(0, totalBits);\r\n        }\r\n\r\n        else {\r\n            // Numeric/boolean encoding\r\n            let numVal = field.bool ? (val ? 1 : 0) : Number(val);\r\n\r\n            if (isNaN(numVal)) {\r\n                if (debug) console.warn(`Non-numeric value for ${field.name}: ${val}, using 0`);\r\n                numVal = 0;\r\n            }\r\n\r\n            // Convert to binary\r\n            fieldBits = numVal.toString(2).padStart(field.len, '0');\r\n\r\n            // For word fields, reverse the bits (LSB->MSB)\r\n            if (inWord) {\r\n                fieldBits = fieldBits.split('').reverse().join('');\r\n            }\r\n\r\n            // Ensure correct length\r\n            if (fieldBits.length > field.len) {\r\n                fieldBits = fieldBits.slice(-field.len); // Truncate from left\r\n                if (debug) console.warn(`Value truncated for ${field.name}: ${val}`);\r\n            }\r\n        }\r\n\r\n        // Append to appropriate bit string\r\n        if (inWord) {\r\n            wordBits += fieldBits;\r\n\r\n            // Check if word is complete\r\n            if (wordBits.length >= wordLen) {\r\n                // Reverse each byte and append to main bits\r\n                const bytes = wordBits.slice(0, wordLen).match(/.{1,8}/g) || [];\r\n                const byteReversed = bytes.map(b => b.split('').reverse().join('')).join('');\r\n                bits += byteReversed;\r\n\r\n                inWord = false;\r\n                wordBits = '';\r\n            }\r\n        } else {\r\n            bits += fieldBits;\r\n        }\r\n    }\r\n\r\n    // Convert bit string to buffer\r\n    const bytes = [];\r\n    for (let i = 0; i < bits.length; i += 8) {\r\n        const byte = bits.slice(i, i + 8);\r\n        bytes.push(parseInt(byte.padEnd(8, '0'), 2));\r\n    }\r\n\r\n    const buffer = Buffer.from(bytes);\r\n\r\n    // Apply encryption if format has encoder\r\n    if (formats[targetFormat].hasOwnProperty(\"encoder\")) {\r\n        return formats[targetFormat].encoder(buffer);\r\n    }\r\n\r\n    return buffer;\r\n}\r\n\r\nexport {\r\n    isMiiInFormat,\r\n    detectMiiFormat,\r\n    decodeMii,\r\n    encodeMii\r\n};\r\n", "// Takes Amiibo dumps that are either 532 bytes or 540 bytes, and manipulates a 96 byte FFSD Mii in/out of the dump from offset 0x4C.\n// Ported from https://github.com/socram8888/amiitool\nimport { Buffer, createCipheriv, createDecipheriv, createHmac } from \"./platform.js\";\nimport {decodeMii,encodeMii} from \"./miiProcess.js\";\r\nimport {MiiFormats} from \"./formats.js\";\r\n\r\n// Returns polyfilled buffer if type is buffer type, else false\r\nfunction isBuffer(inp) { // TODO: move to utils or smth\r\n    const isValidBuffer = \r\n    Buffer.isBuffer(inp)\r\n    || inp instanceof Uint8Array\r\n    || inp instanceof ArrayBuffer\r\n    || inp instanceof SharedArrayBuffer;\r\n    // || (Array.isArray(inp) && inp.every(x => Number.isInteger(x) && x >= 0 && x <= 255));\r\n    \r\n    if (!isValidBuffer) return false;\r\n    else return Buffer.from(inp);\r\n}\r\nconst NFC3D_AMIIBO_SIZE = 520;\r\n\r\nfunction calcSeed(dump) {\r\n    const seed = Buffer.alloc(64);\r\n    dump.slice(0x029, 0x02B).copy(seed, 0x00);\r\n    seed.fill(0x00, 0x02, 0x10);\r\n    dump.slice(0x1D4, 0x1DC).copy(seed, 0x10);\r\n    dump.slice(0x1D4, 0x1DC).copy(seed, 0x18);\r\n    dump.slice(0x1E8, 0x208).copy(seed, 0x20);\r\n    return seed;\r\n}\r\nfunction prepareSeed(typeString, magicBytes, magicBytesSize, xorPad, baseSeed) {\r\n    const output = Buffer.alloc(480);\r\n    let offset = 0;\r\n    const typeStringEnd = typeString.indexOf(0);\r\n    const typeLen = typeStringEnd >= 0 ? typeStringEnd + 1 : 14;\r\n    typeString.slice(0, typeLen).copy(output, offset);\r\n    offset += typeLen;\r\n    const leadingSeedBytes = 16 - magicBytesSize;\r\n    baseSeed.slice(0, leadingSeedBytes).copy(output, offset);\r\n    offset += leadingSeedBytes;\r\n    magicBytes.slice(0, magicBytesSize).copy(output, offset);\r\n    offset += magicBytesSize;\r\n    baseSeed.slice(0x10, 0x20).copy(output, offset);\r\n    offset += 16;\r\n    for (let i = 0; i < 32; i++) {\r\n        output[offset + i] = baseSeed[0x20 + i] ^ xorPad[i];\r\n    }\r\n    offset += 32;\r\n    return output.slice(0, offset);\r\n}\r\nfunction drbgGenerateBytes(hmacKey, seed, outputSize) {\r\n    const result = Buffer.alloc(outputSize);\r\n    let offset = 0;\r\n    let iteration = 0;\r\n    while (offset < outputSize) {\r\n        const iterBuffer = Buffer.alloc(2 + seed.length);\r\n        iterBuffer[0] = (iteration >> 8) & 0xFF;\r\n        iterBuffer[1] = iteration & 0xFF;\r\n        seed.copy(iterBuffer, 2);\r\n        const hmac = createHmac('sha256', hmacKey);\r\n        hmac.update(iterBuffer);\r\n        const output = hmac.digest();\r\n        const toCopy = Math.min(32, outputSize - offset);\r\n        output.copy(result, offset, 0, toCopy);\r\n        offset += toCopy;\r\n        iteration++;\r\n    }\r\n    return result;\r\n}\r\nfunction deriveKeys(typeString, magicBytes, magicBytesSize, xorPad, hmacKey, baseSeed) {\r\n    const preparedSeed = prepareSeed(typeString, magicBytes, magicBytesSize, xorPad, baseSeed);\r\n    const derived = drbgGenerateBytes(hmacKey, preparedSeed, 48);\r\n    return {\r\n        aesKey: derived.slice(0, 16),\r\n        aesIV: derived.slice(16, 32),\r\n        hmacKey: derived.slice(32, 48)\r\n    };\r\n}\r\n\r\nfunction decryptAmiibo(tag) {\r\n    tag=isBuffer(tag);\r\n    if(!tag){\r\n        throw new Error(`Tag is not a valid Buffer type`);\r\n    }\r\n    const internal = Buffer.alloc(NFC3D_AMIIBO_SIZE);\r\n    tag.slice(0x008, 0x010).copy(internal, 0x000);\r\n    tag.slice(0x080, 0x0A0).copy(internal, 0x008);\r\n    tag.slice(0x010, 0x034).copy(internal, 0x028);\r\n    tag.slice(0x0A0, 0x208).copy(internal, 0x04C);\r\n    tag.slice(0x034, 0x054).copy(internal, 0x1B4);\r\n    tag.slice(0x000, 0x008).copy(internal, 0x1D4);\r\n    tag.slice(0x054, 0x080).copy(internal, 0x1DC);\r\n    const seed = calcSeed(internal);\r\n    const dataKeys = deriveKeys(Buffer.from(\"756E666978656420696E666F7300\",'hex'), Buffer.from(\"DB4B9E3F45278F397EFF9B4FB9930000\",'hex'), 14, Buffer.from(\"044917DC76B49640D6F83939960FAED4EF392FAAB21428AA21FB54E545054766\",'hex'), Buffer.from(\"1D164B375B72A55728B91D64B6A3C205\",'hex'), seed);\r\n    const tagKeys = deriveKeys(Buffer.from(\"6C6F636B65642073656372657400\",'hex'), Buffer.from(\"FDC8A07694B89E4C47D37DE8CE5C74C1\",'hex'), 16, Buffer.from(\"044917DC76B49640D6F83939960FAED4EF392FAAB21428AA21FB54E545054766\",'hex'), Buffer.from(\"7F752D2873A20017FEF85C0575904B6D\",'hex'), seed);\r\n    const plain = Buffer.alloc(NFC3D_AMIIBO_SIZE);\r\n    const cipher = createDecipheriv('aes-128-ctr', dataKeys.aesKey, dataKeys.aesIV);\r\n    cipher.setAutoPadding(false);\r\n    const decrypted = cipher.update(internal.slice(0x02C, 0x1B4));\r\n    decrypted.copy(plain, 0x02C);\r\n    internal.slice(0x000, 0x008).copy(plain, 0x000);\r\n    internal.slice(0x028, 0x02C).copy(plain, 0x028);\r\n    internal.slice(0x1D4, 0x208).copy(plain, 0x1D4);\r\n    const tagHmac = createHmac('sha256', tagKeys.hmacKey);\r\n    tagHmac.update(plain.slice(0x1D4, 0x208));\r\n    const computedTagHmac = tagHmac.digest();\r\n    computedTagHmac.copy(plain, 0x1B4);\r\n    const dataHmac = createHmac('sha256', dataKeys.hmacKey);\r\n    dataHmac.update(plain.slice(0x029, 0x208));\r\n    const computedDataHmac = dataHmac.digest();\r\n    computedDataHmac.copy(plain, 0x008);\r\n    return plain;\r\n}\r\nfunction encryptAmiibo(plain) {\r\n    plain=isBuffer(plain);\r\n    if(!plain){\r\n        throw new Error(`Tag is not a valid Buffer type`);\r\n    }\r\n    const seed = calcSeed(plain);\r\n    const dataKeys = deriveKeys(Buffer.from(\"756E666978656420696E666F7300\",'hex'), Buffer.from(\"DB4B9E3F45278F397EFF9B4FB9930000\",'hex'), 14, Buffer.from(\"044917DC76B49640D6F83939960FAED4EF392FAAB21428AA21FB54E545054766\",'hex'), Buffer.from(\"1D164B375B72A55728B91D64B6A3C205\",'hex'), seed);\r\n    const tagKeys = deriveKeys(Buffer.from(\"6C6F636B65642073656372657400\",'hex'), Buffer.from(\"FDC8A07694B89E4C47D37DE8CE5C74C1\",'hex'), 16, Buffer.from(\"044917DC76B49640D6F83939960FAED4EF392FAAB21428AA21FB54E545054766\",'hex'), Buffer.from(\"7F752D2873A20017FEF85C0575904B6D\",'hex'), seed);\r\n    const cipher_internal = Buffer.alloc(NFC3D_AMIIBO_SIZE);\r\n    const tagHmac = createHmac('sha256', tagKeys.hmacKey);\r\n    tagHmac.update(plain.slice(0x1D4, 0x208));\r\n    tagHmac.digest().copy(cipher_internal, 0x1B4);\r\n    const dataHmac = createHmac('sha256', dataKeys.hmacKey);\r\n    dataHmac.update(plain.slice(0x029, 0x1B4));\r\n    dataHmac.update(cipher_internal.slice(0x1B4, 0x1D4));\r\n    dataHmac.update(plain.slice(0x1D4, 0x208));\r\n    dataHmac.digest().copy(cipher_internal, 0x008);\r\n    const aesCipher = createCipheriv('aes-128-ctr', dataKeys.aesKey, dataKeys.aesIV);\r\n    aesCipher.setAutoPadding(false);\r\n    const encrypted = aesCipher.update(plain.slice(0x02C, 0x1B4));\r\n    encrypted.copy(cipher_internal, 0x02C);\r\n    plain.slice(0x000, 0x008).copy(cipher_internal, 0x000);\r\n    plain.slice(0x028, 0x02C).copy(cipher_internal, 0x028);\r\n    plain.slice(0x1D4, 0x208).copy(cipher_internal, 0x1D4);\r\n    const tag = Buffer.alloc(NFC3D_AMIIBO_SIZE);\r\n    cipher_internal.slice(0x000, 0x008).copy(tag, 0x008);\r\n    cipher_internal.slice(0x008, 0x028).copy(tag, 0x080);\r\n    cipher_internal.slice(0x028, 0x04C).copy(tag, 0x010);\r\n    cipher_internal.slice(0x04C, 0x1B4).copy(tag, 0x0A0);\r\n    cipher_internal.slice(0x1B4, 0x1D4).copy(tag, 0x034);\r\n    cipher_internal.slice(0x1D4, 0x1DC).copy(tag, 0x000);\r\n    cipher_internal.slice(0x1DC, 0x208).copy(tag, 0x054);\r\n    return tag;\r\n}\r\n\r\n//Extract Mii data from an Amiibo dump\r\nfunction extractMiiFromAmiibo(dump) {\r\n    const tag = dump.slice(0, NFC3D_AMIIBO_SIZE);\r\n    const decrypted = decryptAmiibo(tag);\r\n    const miiData = decrypted.slice(76, 172);// Extract the 96 Bytes FFSD Mii\r\n    return Buffer.from(miiData);\r\n}\r\n\r\n//Insert Mii data into an Amiibo dump\r\nfunction insertMiiIntoAmiibo(dump, mii) {\n    dump=isBuffer(dump);\n    if(!dump){\n        throw new Error(`Dump is not a valid Buffer type`);\n    }\n    mii=decodeMii(mii);\n    let miiWithChecksum=encodeMii(mii,MiiFormats.FFSD);\n    const decrypted = decryptAmiibo(dump.slice(0, NFC3D_AMIIBO_SIZE));//Decrypt the Amiibo\r\n    miiWithChecksum.copy(decrypted, 76);//Insert the Mii into Amiibo\r\n    const encrypted = encryptAmiibo(decrypted);//Reencrypt the Amiibo\r\n    const result = Buffer.alloc(dump.length);\r\n    encrypted.copy(result, 0);\r\n    if (dump.length > NFC3D_AMIIBO_SIZE) {\r\n        dump.slice(NFC3D_AMIIBO_SIZE).copy(result, NFC3D_AMIIBO_SIZE);\r\n    }\r\n    return result;\r\n}\r\n\r\nexport {\r\n    insertMiiIntoAmiibo,\r\n    extractMiiFromAmiibo\r\n};\n", "import { backTables, lookupTables, islandAddresses } from \"./data.js\";\r\nimport { decryptMii, decryptStudio2, encryptMii, encryptStudio2 } from \"./miiCrypto.js\";\r\nimport lodash from \"lodash\";\r\n\r\nlet amiiboHandlerPromise;\r\n\r\nasync function loadAmiiboHandler() {\r\n    amiiboHandlerPromise ??= import(\"./amiiboHandler.js\");\r\n    return amiiboHandlerPromise;\r\n}\r\n\r\nasync function extractMiiFromAmiibo(data) {\r\n    return (await loadAmiiboHandler()).extractMiiFromAmiibo(data);\r\n}\r\n\r\nfunction encodeMiitomoMii(data) {\r\n    return Buffer.concat([\r\n        encoders.appendCrc(data.subarray(0, 0x60)),\r\n        data.subarray(0x60)\r\n    ]);\r\n}\r\n\r\nfunction encodeMiitopiaMii(data) {\r\n    return Buffer.concat([\r\n        encoders.appendCrc(data.subarray(0, 0x60)),\r\n        data.subarray(0x60)\r\n    ]);\r\n}\r\n\r\nfunction binaryToHex(binaryString) {\r\n    const decimal = BigInt('0b' + binaryString);\r\n    return decimal.toString(16).toUpperCase().padStart(Math.ceil(binaryString.length / 4), '0');\r\n}\r\n\r\nfunction getMiiIDTimestamp(id, epoch, intervals, bits) {\r\n    const idBigInt = BigInt('0x' + id);\r\n    const mask = (1n << BigInt(bits)) - 1n; // Create mask for specified bits\r\n    const seconds = (idBigInt & mask) * intervals;\r\n    return new Date(Number(BigInt(epoch) + seconds * 1000n));\r\n}\r\nfunction getIDFromTimestamp(timestamp, epochMs, intervalSeconds, bits) {\r\n    const t = timestamp ? new Date(timestamp) : new Date(); //Accepts Date or ISO string/number\r\n    const timestampMs = BigInt(t.getTime());\r\n    const epoch = BigInt(epochMs);\r\n    const intervalMs = BigInt(intervalSeconds) * 1000n;\r\n\r\n    const ticks = (timestampMs - epoch) / intervalMs;\r\n    const mask = (1n << BigInt(bits)) - 1n;\r\n    const id = ticks & mask;\r\n\r\n    return id.toString(2).padStart(bits, \"0\").slice(0,bits);\r\n}\r\nfunction getKeyByValue(object, value) {\r\n    for (var key in object) {\r\n        if (object[key] === value) {\r\n            return key;\r\n        }\r\n    }\r\n    return null;\r\n}\r\n\r\nfunction crc16(data, current = 0x0000) {\r\n    let crc = current;\r\n    for (let i = 0; i < data.length; i++) {\r\n        const byte = data[i];\r\n        for (let bit = 7; bit >= 0; bit--) {\r\n            crc = ((crc << 1) | ((byte >> bit) & 0x1)) & 0x1FFFF;\r\n            if (crc & 0x10000) {\r\n                crc ^= 0x1021;\r\n            }\r\n        }\r\n    }\r\n    for (let i = 0; i < 16; i++) {\r\n        crc = (crc << 1) & 0x1FFFF;\r\n        if (crc & 0x10000) {\r\n            crc ^= 0x1021;\r\n        }\r\n    }\r\n    return crc & 0xFFFF;\r\n}\r\n\r\nconst crc32CksumTable = new Uint32Array(256);\r\nfunction generateCrc32Table(table, poly = 0x04C11DB7) {\r\n    for (let i = 0; i < 256; i++) {\r\n        let crc = i << 24;\r\n        for (let j = 0; j < 8; j++) {\r\n            crc = (crc & 0x80000000) ? (crc << 1) ^ poly : crc << 1;\r\n        }\r\n        table[i] = crc >>> 0;\r\n    }\r\n}\r\ngenerateCrc32Table(crc32CksumTable);\r\n\r\nfunction crc32(input, table = crc32CksumTable) {\r\n    let crc = 0x00000000;\r\n    for (let i = 0; i < input.length; i++) {\r\n        const byte = (input[i] ^ (crc >>> 24)) & 0xFF;\r\n        crc = (table[byte] ^ (crc << 8)) >>> 0;\r\n    }\r\n    return (crc ^ 0xFFFFFFFF) >>> 0;\r\n}\r\n\r\nfunction miiCrcCalc(dat, mode = 16) {\r\n    return mode === 32 ? crc32(dat) : crc16(dat);\r\n}\r\n\r\nconst decoders = {\r\n    'eyebrowYPositions': (y) => y - 3\r\n};\r\nconst encoders = {\r\n    'eyebrowYPositions': (y) => y + 3,\r\n    'appendCrc': (buf, mode = 16) => {\r\n        buf = buf.slice(0, -(mode / 8));//Since our structs for validation also indicate to the encoder to add the \"checksums\" as blank padding, we strip that\r\n        const crc = miiCrcCalc(buf, mode);\r\n\r\n        // turn number into 2 bytes\r\n        const crcBytes = Buffer.alloc(mode / 8);\r\n        if (mode === 32) {\r\n            crcBytes.writeUInt32BE(crc >>> 0, 0);\r\n        }\r\n        else {\r\n            crcBytes.writeUInt16BE(crc, 0);\r\n        }\r\n\r\n        // append\r\n        return Buffer.concat([buf, crcBytes]);\r\n    },\r\n    'switchId': (id) => {\r\n        id = Buffer.from(id.padStart(32,\"0\"), \"hex\");\r\n        id[6] = (id[6] & 0x0f) | 0x40; // 0100xxxx\r\n        id[8] = (id[8] & 0x3f) | 0x80; // 10xxxxxx\r\n        return id.toString(\"hex\");\r\n    }\r\n};\r\nconst processors = {\r\n    rcdPreProcess: (obj) => {\r\n        if(!obj.hasOwnProperty(\"meta\")) obj.meta={type:\"Default\"};\r\n        switch (obj.meta.type) {\r\n            case 'Special':\r\n                obj.meta.miiId = '010';\r\n                break;\r\n            case 'Foreign':\r\n                obj.meta.miiId = '110';\r\n                break;\r\n            default:\r\n                obj.meta.miiId = '100';\r\n                break;\r\n        }\r\n\r\n        obj.meta.miiId += getIDFromTimestamp(obj.meta.creationTimestamp, Date.UTC(2006, 0, 1), 4, 29);\r\n        obj.meta.miiId = binaryToHex(obj.meta.miiId);\r\n        if (obj.meta?.type === \"Special\" && obj.perms.mingle) {\r\n            console.warn(`Cannot have Mingle enabled for Special Miis. Disabled Mingle in the buffer output, the original object is left intact.`);\r\n            obj.perms.mingle = false;\r\n        }\r\n        return obj;\r\n    },\r\n    cffcdPreProcess: (obj,ogDevice) => {\r\n        if (!obj.hasOwnProperty(\"meta\")) obj.meta = { type: \"Default\" };\r\n        if (!obj.meta.hasOwnProperty(\"type\")) obj.meta.type = \"Default\";\r\n        if (obj.meta.type === \"Special\" && obj.perms?.sharing) {\r\n            console.warn(`Cannot have Sharing enabled for Special Miis. Disabled sharing in the buffer output, the original object is left intact.`);\r\n            obj.perms.sharing = false;\r\n        }\r\n        obj.meta.miiId = binaryToHex(`${obj.meta.type === \"Special\" ? 0 : 1}001${getIDFromTimestamp(obj.meta.creationTimestamp, Date.UTC(2010, 0, 1), 2, 28)}`);\r\n        if(ogDevice!==undefined){\r\n            obj.meta.originalDevice=ogDevice;\r\n        }\r\n        return obj;\r\n    },\r\n\r\n    rcdPostProcess: (obj, ogD) => {\r\n        switch ((parseInt(obj.meta.miiId[0], 16) >> 1).toString(2).padStart(3, '0')) {\r\n            case '010':\r\n                obj.meta.type = \"Special\";\r\n                break;\r\n            case '110':\r\n                obj.meta.type = \"Foreign\";\r\n                break;\r\n            default://100\r\n                obj.meta.type = \"Default\";\r\n                break;\r\n        }\r\n\r\n        obj.meta.creationTimestamp = getMiiIDTimestamp(obj.meta.miiId, Date.UTC(2006, 0, 1), 4n, 29);\r\n        obj.meta.originalDevice = ogD;\r\n\r\n        return obj;\r\n    },\r\n    cffcdPostProcess: (obj) => {\r\n        obj.meta.type = (parseInt(obj.meta.miiId, 16) & 0x80000000) === 0 ? \"Special\" : \"Default\";\r\n\r\n        obj.meta.creationTimestamp = getMiiIDTimestamp(obj.meta.miiId, Date.UTC(2010, 0, 1), 2n, 28);\r\n        return obj;\r\n    }\r\n};\r\n\r\nfunction forwardPort(data, from, to = \"SWITCH\") {\r\n    from = from.toUpperCase().replaceAll(\" \",\"\");\r\n    to = to.toUpperCase().replaceAll(\" \", \"\");\r\n    if(from===\"SWITCH\") return data;\r\n    if (!getKeyByValue(ConsoleFormats,from)) {\r\n        throw new Error(`${from} is not a valid type, expected one of ${Object.keys(ConsoleFormats).join(\", \")}.`);\r\n    }\r\n    if (!getKeyByValue(ConsoleFormats,to)) {\r\n        throw new Error(`${to} is not a valid type, expected one of ${Object.keys(ConsoleFormats).join(\", \")}.`);\r\n    }\r\n\r\n    if (from === \"WII\" || from === \"DS\") {\r\n        const modernFeatureOrMakeup = lookupTables.makeupsFeatures[data.face.feature];\r\n        if (typeof modernFeatureOrMakeup === 'string') {\r\n            data.face.feature = 0;\r\n            data.face.makeup = Number(modernFeatureOrMakeup);\r\n        }\r\n        else if (typeof modernFeatureOrMakeup === 'number') {\r\n            data.face.feature = modernFeatureOrMakeup;\r\n            data.face.makeup = 0;\r\n        }\r\n        else {\r\n            data.face.feature = 0;\r\n            data.face.makeup = 0;\r\n        }\r\n    }\r\n\r\n    if (to === \"SWITCH\" || from === \"3DS\") {\r\n        if (!data.beard.color) data.beard.color = 8;\r\n        if (!data.eyebrows.color) data.eyebrows.color = 8;\r\n        if (!data.hair.color) data.hair.color = 8;\r\n        data.eyes.color += 8;\r\n\r\n        if (data.mouth.color < 5) {\r\n            data.mouth.color += 19;\r\n        }\r\n\r\n        if (!data.glasses.color) {\r\n            data.glasses.color = 8;\r\n        }\r\n        else if (data.glasses.color < 6) {\r\n            data.glasses.color += 13;\r\n        }\r\n        else {\r\n            data.glasses.color = 0;\r\n        }\r\n    }\r\n    return data;\r\n}\r\nfunction backPort(data, to, from = \"SWITCH\") {\r\n    from = from.toUpperCase().replaceAll(\" \",\"\");\r\n    to = to.toUpperCase().replaceAll(\" \", \"\");\r\n    if(from===\"WII\" || from === \"DS\") return data;\r\n    if (!getKeyByValue(ConsoleFormats,from)) {\r\n        throw new Error(`${from} is not a valid type, expected one of ${Object.keys(ConsoleFormats).join(\", \")}.`);\r\n    }\r\n    if (!getKeyByValue(ConsoleFormats,to)) {\r\n        throw new Error(`${to} is not a valid type, expected one of ${Object.keys(ConsoleFormats).join(\", \")}.`);\r\n    }\r\n\r\n    if (from === \"SWITCH\" || to === \"3DS\") {\r\n        data.hair.color = backTables.switch.hairsColors[data.hair.color];\r\n        data.eyes.color = backTables.switch.eyesColors[data.eyes.color];\r\n        if(data.glasses.type>8) data.glasses.type = backTables.switch.glassesTypes[data.glasses.type-9];\r\n        data.glasses.color = backTables.switch.glassesColors[data.glasses.color];\r\n        data.mouth.color = backTables.switch.mouthsColors[data.mouth.color];\r\n        data.face.color = backTables.switch.faceColors[data.face.color];\r\n        data.eyebrows.color = backTables.switch.hairsColors[data.eyebrows.color];\r\n        data.beard.color = backTables.switch.hairsColors[data.beard.color];\r\n    }\r\n\r\n    if (from === \"3DS\" || to === \"WII\" || to === \"DS\") {\r\n        if (data.mouth.color > 2) data.mouth.color = 0;\r\n        if (data.beard.type > 3) data.beard.type = 3;\r\n        if (data.beard.mustache.type === 4) {\r\n            data.beard.mustache.type = 2;\r\n        }\r\n        else if (data.beard.mustache.type === 5) {\r\n            data.beard.mustache.type = 0;\r\n            data.beard.type = 1;\r\n        }\r\n        //Later Miis have two separate fields, so you can have makeup and facial features (such as wrinkles) applied at the same time. The Wii/NDS only has one that covers both.\r\n        //We prioritize facial features here because the Wii/NDS supports more of those than they do makeup types, and is more likely to apply.\r\n        //Additionally, facial features are more likely to be inherent to the face itself.\r\n        const legacyFeature = backTables[\"3ds\"].features[data.face.feature];\r\n        const legacyMakeup = backTables[\"3ds\"].makeups[data.face.makeup];\r\n        const numericLegacyFeature = Number(legacyFeature);\r\n        const numericLegacyMakeup = Number(legacyMakeup);\r\n\r\n        if (typeof legacyFeature !== 'string') {\r\n            data.face.feature = Number.isFinite(numericLegacyFeature) ? numericLegacyFeature : 0;\r\n        }\r\n        else if (numericLegacyMakeup > 0) {\r\n            data.face.feature = numericLegacyMakeup;\r\n        }\r\n        else {\r\n            data.face.feature = Number.isFinite(numericLegacyFeature) ? numericLegacyFeature : 0;\r\n        }\r\n        data.face.makeup = 0;\r\n\r\n        if (data.hair.type > 71) data.hair.type = backTables[\"3ds\"].hairs[data.hair.type - 72];\r\n        if (data.face.type > 7) data.face.type = backTables[\"3ds\"].faces[data.face.type - 8];\r\n        if (data.eyes.type > 47) data.eyes.type = backTables[\"3ds\"].eyes[data.eyes.type - 48];\r\n        if (data.nose.type > 11) data.nose.type = backTables[\"3ds\"].noses[data.nose.type - 12];\r\n        if (data.mouth.type > 23) data.mouth.type = backTables[\"3ds\"].mouths[data.mouth.type - 24];\r\n    }\r\n    return data;\r\n}\r\n\r\n/**\r\n* SwitchSDK -> NSDB?\r\n* AMii -> Translation/canonical layer between all formats by HEYimHeroic?\r\n* MiiNG -> PNG with Mii data embedded by HEYimHeroic, should look into.\r\n*/\r\n\r\n/** Enum of Mii Formats - see comments on individual items for a description of the format. */\r\nconst MiiFormats = /** @type {const} */ ({\r\n    /**\r\n    * Revolution Character Data\r\n    * Wii Miis\r\n    */\r\n    RCD: 'rcd',\r\n    /**\r\n    * Revolution Store Data\r\n    * RCD with a Checksum appended\r\n    */\r\n    RSD: 'rsd',\r\n    /** \r\n    * Alias for RSD format\r\n    * @deprecated This format is commonly used to represent RSD, but has been used in an official capacity as an alias of CHARINFO.\r\n    * @returns {'rcd'}\r\n    */\r\n    get MII() {\r\n        //console.warn('MII is deprecated. Use RCD for Wii formats, or CHARINFO for Switch formats instead.');\r\n        return 'rcd';\r\n    },\r\n    /** \r\n    * Alias for RSD format\r\n    * @deprecated This format is named after a homebrew importer/exporter for Miis on the Wii, and is the same as RSD.\r\n    * @returns {'rcd'}\r\n    */\r\n    get MIIGX() {\r\n        //console.warn('MIIGX is deprecated. Use RCD instead, which is the same in all but name.');\r\n        return 'rcd';\r\n    },\r\n    /** \r\n    * Alias for RSD format\r\n    * @deprecated This extension is named after an unofficial Mii creator 'My Avatar Editor', and is the same as RSD.\r\n    * @returns {'rcd'}\r\n    */\r\n    get MAE() {\r\n        //console.warn('MAE is deprecated. Use RCD instead which is the same in all but name.');\r\n        return 'rcd';\r\n    },\r\n\r\n    /**\r\n    * NDS Character Data\r\n    * NDS Miis\r\n    */\r\n    NCD: 'ncd',\r\n    /**\r\n    * NDS Store Data\r\n    * NCD with a Checksum appended\r\n    */\r\n    NSD: 'nsd',\r\n\r\n    /** \r\n    * Version 3 Miis\r\n    * @deprecated This extension is used to refer to CFCD/CFSD/FFCD/FFSD, which are functionally the same but have enough difference for encoding to need to differentiate.\r\n    * @returns {'ffcd'}\r\n    */\r\n    get ver3() {\r\n        //console.warn('This extension is used to refer to CFCD/CFSD/FFCD/FFSD, which are functionally the same but have enough difference for encoding to need to differentiate. Use FFCD/FFSD.');\r\n        return 'ffcd';\r\n    },\r\n    /**\r\n    * CTR Face Character Data\r\n    * 3DS Miis, identical to FFCD.\r\n    */\r\n    CFCD: 'cfcd',\r\n    /** \r\n    * Cafe Face Character Data (Unofficial Name)\r\n    * Wii U Miis, identical to CFCD.\r\n    */\r\n    FFCD: 'ffcd',\r\n    /**\r\n    * CTR Face Store Data (Unofficial Name)\r\n    * CFCD with a buffer and padding at the end. Identical to FFSD.\r\n    */\r\n    CFSD: 'cfsd',\r\n    /**\r\n    * Cafe Face Store Data\r\n    * FFCD with a buffer and padding at the end. Identical to CFSD.\r\n    */\r\n    FFSD: 'ffsd',\r\n    /**\r\n    * CTR Face Encrypted Data (Unofficial Name)\r\n    * Holds encrypted data as seen in QR codes. Identical to FFED.\r\n    */\r\n    CFED: 'cfed',\r\n    /** \r\n    * Cafe Face Encrypted Data (Unofficial Name)\r\n    * Holds encrypted data as seen in QR codes. Identical to CFED.\r\n    */\r\n    FFED: 'ffed',\r\n    /**\r\n    * Miitomo\r\n    * The first 0x60 Bytes are FFSD, then Miitomo QR data follows.\r\n    */\r\n    Miitomo: 'miitomo',\r\n    MIITOMO: 'miitomo',\r\n    /**\r\n    * Miitomo Encrypted\r\n    */\r\n    MIITOMOE: 'miitomoe',\r\n    /**\r\n    * Miitopia\r\n    * The first 0x60 Bytes are FFSD, then Miitopia QR data follows.\r\n    */\r\n    Miitopia: 'mt',\r\n    MT: 'mt',\r\n    MIITOPIA: 'mt',\r\n    /**\r\n    * Miitopia Encrypted\r\n    */\r\n    MTE: 'mte',\r\n\r\n    /**\r\n    * Tomodachi Life\r\n    * The first 0x5C Bytes are FFCD, then extra data follows.\r\n    */\r\n    TomodachiLife: 'tlc',\r\n    /**\r\n    * Tomodachi Life\r\n    * The first 0x5C Bytes are FFCD, then extra data follows.\r\n    */\r\n    TLS: 'tls',\r\n    TLC: 'tlc',\r\n    /**\r\n    * Tomodachi Life Encrypted\r\n    */\r\n    TLE: 'tle',\r\n    TLEC: 'tlec',\r\n\r\n    /**\r\n    * NX Face Store Data (Unofficial Name)\r\n    * Miis in the Switch NAND, alias of NFDB.\r\n    */\r\n    NFSD: 'nfsd',\r\n    /**\r\n    * NX Face Store Data (Unofficial Name)\r\n    * Miis in the Switch NAND, alias of NFDB.\r\n    */\r\n    storedata: 'nfsd',\r\n    /**\r\n    * NX Face Database (Unofficial Name)\r\n    * Miis in the Switch NAND, alias of NFSD.\r\n    */\r\n    NFDB: 'nfsd',\r\n    /** \r\n    * Alias for NFSD format\r\n    * There are official usecases of the sampledb extension, however this is not recommended as a filename.\r\n    * @depricated\r\n    * @returns {'nfsd'}\r\n    */\r\n    get SAMPLEDB() {\r\n        //console.warn('SAMPLEDB is deprecated. Use NFSD instead which is the same in all but name.');\r\n        return 'nfsd';\r\n    },\r\n    /**\r\n    * NX Face Character Data (Unofficial Name)\r\n    * NFSD without the Mii ID or checksums.\r\n    */\r\n    NFCD: 'nfcd',\r\n    /**\r\n    * NX Face Character Data (Unofficial Name)\r\n    * NFSD without the Mii ID or checksums.\r\n    */\r\n    coredata: 'nfcd',\r\n    /**\r\n    * Character Info\r\n    * Switch Miis\r\n    */\r\n    CHARINFO: 'charinfo',\r\n    /** \r\n    * Ultimate Face Store Data\r\n    * @deprecated This filetype was thought to be used exclusively in Smash Bros Ultimate, however its application is now known to be much broader than that. Use CHARINFO instead.\r\n    * @returns {'nfsd'}\r\n    */\r\n    get UFSD() {\r\n        //console.warn('UFSD is deprecated. Use NFSD instead which is the same in all but name.');\r\n        return 'nfsd';\r\n    },\r\n\r\n    /**\r\n    * My Nintendo Mii Studio (Unofficial Name)\r\n    * Browser Localstorage format after editing Miis via Mii Studio\r\n    */\r\n    MNMS: 'mnms',\r\n    /**\r\n    * Encrypted My Nintendo Mii Studio (Unofficial Name)\r\n    * Used for requesting image data from My Nintendo's Mii Studio\r\n    */\r\n    EMNMS: 'emnms',\r\n    /**\r\n    * Named after Mii Studio\r\n    * Alias of MNMS\r\n    */\r\n    STUDIO: 'mnms',\r\n    /**\r\n    * Localstorage object in Mii Studio (Unofficial Name)\r\n    * Alias of MNMS\r\n    */\r\n    localstorage: 'mnms',\r\n\r\n    /**\r\n    * Amiibo Files (Unofficial Name)\r\n    * @deprecated Amiibos are generally .bins but here we use Amiibo for better identification purposes as all formats could be .bin. Same as NTAG.\r\n    * @returns {'ntag'}\r\n    */\r\n    get AMIIBO() {\r\n        //console.warn('AMIIBO is deprecated. Use NTAG or NTAG_ALT instead which are the same in all but name.');\r\n        return 'ntag';\r\n    },\r\n    /**\r\n    * NTAG215 Data (Unofficial Name)\r\n    * NTAG215s are generally .bins but here we use NTAG for better identification purposes as all formats could be .bin.\r\n    * NTAG215 chips are what are used for Amiibo chips.\r\n    * Same as NTAG_ALT but 540 Bytes instead of 532.\r\n    */\r\n    NTAG: 'ntag',\r\n    /**\r\n    * NTAG215 Data Alternate Size (Unofficial Name)\r\n    * Same as NTAG but 532 Bytes instead of 540.\r\n    */\r\n    NTAG_ALT: 'ntag_alt',\r\n    /**\r\n    * Decrypted Amiibo Bin (Unofficial Name)\r\n    * Contains an unencrypted Amiibo tag\r\n    */\r\n    NTAG_INTERNAL: 'ntag_internal',\r\n\r\n    /**\r\n    * NDS Miis\r\n    * @deprecated NDS Miis come in two formats, please be more specific about NCD or NSD.\r\n    * @returns {'ncd'}\r\n    */\r\n    get NDS() {\r\n        //console.warn('NDS Miis come in two formats, please be more specific about NCD or NSD.');\r\n        return 'ncd';\r\n    },\r\n    /**\r\n    * Wii Miis\r\n    * @deprecated Wii Miis come in two formats, please be more specific about RCD or RSD.\r\n    * @returns {'rcd'}\r\n    */\r\n    get WII() {\r\n        //console.warn('Wii Miis come in two formats, please be more specific about RCD or RSD.');\r\n        return 'rcd';\r\n    },\r\n    /**\r\n    * 3DS Miis\r\n    * @deprecated 3DS Miis come in multiple formats. Please be more specific about which one you need.\r\n    * @returns {'ffcd'}\r\n    */\r\n    get [\"3DS\"]() {\r\n        //console.warn('3DS Miis come in multiple formats. Please be more specific about which one you need.');\r\n        return 'ffcd';\r\n    },\r\n    /**\r\n    * Wii U Miis\r\n    * @deprecated Wii U Miis come in multiple formats. Please be more specific about which one you need.\r\n    * @returns {'ffcd'}\r\n    */\r\n    get WIIU() {\r\n        //console.warn('Wii U Miis come in multiple formats. Please be more specific about which one you need.');\r\n        return 'ffcd';\r\n    },\r\n    /**\r\n    * Switch Miis\r\n    * @deprecated Switch Miis come in multiple formats, please be more specific about which one you need.\r\n    * @returns {'charinfo'}\r\n    */\r\n    get SWITCH() {\r\n        //console.warn('Switch Miis come in multiple formats, please be more specific about which one you need.');\r\n        return 'charinfo';\r\n    },\r\n\r\n    /**\r\n     * Mii Creator Miis\r\n     * @deprecated This is not an official file type, we are supporting it due to its widespread usage. Please use .CHARINFO instead.\r\n     */\r\n    MIIC:'miic'\r\n});\r\n\r\n/** Enum of consoles */\r\nconst ConsoleFormats =  /** @type {const} */ ({\r\n    DS: \"DS\",\r\n    WII: \"WII\",\r\n    \"3DS\": \"3DS\",\r\n    WIIU: \"WIIU\",\r\n    SWITCH: \"SWITCH\",\r\n    SWITCH2: \"SWITCH2\"\r\n});\r\n\r\n/**\r\n* Layout of where to extract each field of each format.\r\n* Unless otherwise specified, fields are numbers.\r\n*/\r\nlet commonStructs = {\r\n    [MiiFormats.NCD]: [\r\n        //0x0\r\n        {\r\n            word: true,\r\n            len: 16\r\n        },\r\n        {\r\n            name: \"favorited\",\r\n            bool: true,\r\n            len: 1\r\n        },\r\n        {\r\n            name: \"favoriteColor\",\r\n            len: 4,\r\n            max: 11\r\n        },\r\n        {\r\n            name: \"birthday\",\r\n            len: 5\r\n        },\r\n        {\r\n            name: \"birthMonth\",\r\n            len: 4,\r\n            max: 12//0=Not Set\r\n        },\r\n        {\r\n            name: \"gender\",//0 Male, 1 Female\r\n            len: 1\r\n        },\r\n        {\r\n            name: \"unknown\",\r\n            len: 1\r\n        },\r\n        //0x2\r\n        {\r\n            name: \"name\",\r\n            text: 'le',\r\n            len: 160\r\n        },\r\n        //0x16\r\n        {\r\n            name: \"height\",\r\n            len: 8,\r\n            max: 127\r\n        },\r\n        //0x17\r\n        {\r\n            name: \"weight\",\r\n            len: 8,\r\n            max: 127\r\n        },\r\n        //0x18\r\n        {\r\n            name: \"miiId\",\r\n            len: 32,\r\n            hex: true\r\n        },\r\n        //x01C\r\n        {\r\n            name: \"systemId\",\r\n            len: 32,\r\n            hex: true,\r\n            decoder: (id) => `${id}`.padEnd(16, \"0\"),\r\n            encoder: (id) => id.slice(0, 8)\r\n        },\r\n        //0x20\r\n        {\r\n            word: true,\r\n            len: 16\r\n        },\r\n        {\r\n            name: \"fromCheckMiiOut\",\r\n            bool: true,\r\n            len: 1\r\n        },\r\n        {\r\n            name: \"unknown\",\r\n            len: 1\r\n        },\r\n        {\r\n            name: \"mingle\",\r\n            len: 1,\r\n            decoder: (mingle) => mingle == 0 ? true : false,//Mingle is 0 for true, 1 for false\r\n            encoder: (mingle) => mingle ? 0 : 1\r\n        },\r\n        {\r\n            name: \"unknown\",\r\n            len: 3,\r\n        },\r\n        {\r\n            name: \"faceFeature\",\r\n            len: 4,\r\n            max: 11\r\n        },\r\n        {\r\n            name: \"faceColor\",\r\n            len: 3,\r\n            max: 5\r\n        },\r\n        {\r\n            name: \"faceType\",\r\n            len: 3,\r\n            max: 7\r\n        },\r\n        //0x22\r\n        {\r\n            word: true,\r\n            len: 16\r\n        },\r\n        {\r\n            name: \"unknown\",\r\n            len: 5\r\n        },\r\n        {\r\n            name: \"hairFlipped\",\r\n            bool: true,\r\n            len: 1\r\n        },\r\n        {\r\n            name: \"hairColor\",\r\n            len: 3,\r\n            max: 7\r\n        },\r\n        {\r\n            name: \"hairType\",\r\n            len: 7,\r\n            max: 71\r\n            //qk, Add decoder to make canonical value\r\n        },\r\n        //0x24\r\n        {\r\n            word: true,\r\n            len: 16\r\n        },\r\n        {\r\n            name: \"unknown\",\r\n            len: 6\r\n        },\r\n        {\r\n            name: \"eyebrowRotation\",\r\n            len: 4,\r\n            max: 11\r\n        },\r\n        {\r\n            name: \"unknown\",\r\n            len: 1\r\n        },\r\n        {\r\n            name: \"eyebrowType\",\r\n            len: 5,\r\n            max: 23\r\n            //qk, Add decoder to make canonical value\r\n        },\r\n        //0x26\r\n        {\r\n            word: true,\r\n            len: 16\r\n        },\r\n        {\r\n            name: \"eyebrowDistanceApart\",\r\n            len: 4,\r\n            max: 12\r\n        },\r\n        {\r\n            name: \"eyebrowYPosition\",\r\n            len: 5,\r\n            min: 3,\r\n            max: 18,\r\n            decoder: decoders.eyebrowYPositions,\r\n            encoder: encoders.eyebrowYPositions\r\n        },\r\n        {\r\n            name: \"eyebrowSize\",\r\n            len: 4,\r\n            max: 8\r\n        },\r\n        {\r\n            name: \"eyebrowColor\",\r\n            len: 3,\r\n            max: 7\r\n        },\r\n        //0x28\r\n        {\r\n            word: true,\r\n            len: 16\r\n        },\r\n        {\r\n            name: \"eyeYPosition\",\r\n            len: 5,\r\n            max: 18\r\n        },\r\n        {\r\n            name: \"eyeRotation\",\r\n            len: 3,\r\n            max: 7\r\n        },\r\n        {\r\n            name: \"unknown\",\r\n            len: 2\r\n        },\r\n        {\r\n            name: \"eyeType\",\r\n            len: 6,\r\n            max: 47\r\n            //qk, Add decoder to make canonical value\r\n        },\r\n        //0x2A\r\n        {\r\n            word: true,\r\n            len: 16\r\n        },\r\n        {\r\n            name: \"unknown\",\r\n            len: 5\r\n        },\r\n        {\r\n            name: \"eyeDistanceApart\",\r\n            len: 4,\r\n            max: 12\r\n        },\r\n        {\r\n            name: \"eyeSize\",\r\n            len: 3,\r\n            max: 7\r\n        },\r\n        {\r\n            name: \"unknown\",\r\n            len: 1\r\n        },\r\n        {\r\n            name: \"eyeColor\",\r\n            len: 3,\r\n            max: 5\r\n        },\r\n        //0x2C\r\n        {\r\n            word: true,\r\n            len: 16\r\n        },\r\n        {\r\n            name: \"unknown\",\r\n            len: 3\r\n        },\r\n        {\r\n            name: \"noseYPosition\",\r\n            len: 5,\r\n            max: 18\r\n        },\r\n        {\r\n            name: \"noseSize\",\r\n            len: 4,\r\n            max: 8\r\n        },\r\n        {\r\n            name: \"noseType\",\r\n            len: 4,\r\n            max: 11\r\n        },\r\n        //0x2E\r\n        {\r\n            word: true,\r\n            len: 16\r\n        },\r\n        {\r\n            name: \"mouthYPosition\",\r\n            len: 5,\r\n            max: 18\r\n        },\r\n        {\r\n            name: \"mouthSize\",\r\n            len: 4,\r\n            max: 8\r\n        },\r\n        {\r\n            name: \"mouthColor\",\r\n            len: 2,\r\n            max: 2\r\n        },\r\n        {\r\n            name: \"mouthType\",\r\n            len: 5,\r\n            max: 23\r\n            //qk, Turn this into a canonical value\r\n        },\r\n        //0x30\r\n        {\r\n            word: true,\r\n            len: 16\r\n        },\r\n        {\r\n            name: \"glassesYPosition\",\r\n            len: 5,\r\n            max: 20\r\n        },\r\n        {\r\n            name: \"glassesSize\",\r\n            len: 3,\r\n            max: 7\r\n        },\r\n        {\r\n            name: \"disablesMii\",\r\n            len: 1,\r\n            max: 0\r\n        },\r\n        {\r\n            name: \"glassesColor\",\r\n            len: 3,\r\n            max: 5\r\n        },\r\n        {\r\n            name: \"glassesType\",\r\n            len: 4,\r\n            max: 8\r\n        },\r\n        //0x32\r\n        {\r\n            word: true,\r\n            len: 16\r\n        },\r\n        {\r\n            name: \"mustacheYPosition\",\r\n            len: 5,\r\n            max: 16\r\n        },\r\n        {\r\n            name: \"mustacheSize\",\r\n            len: 4,\r\n            max: 8\r\n        },\r\n        {\r\n            name: \"beardColor\",\r\n            len: 3,\r\n            max: 7\r\n        },\r\n        {\r\n            name: \"beardType\",\r\n            len: 2,\r\n            max: 3\r\n        },\r\n        {\r\n            name: \"mustacheType\",\r\n            len: 2,\r\n            max: 3\r\n        },\r\n        //0x34\r\n        {\r\n            word: true,\r\n            len: 16\r\n        },\r\n        {\r\n            name: \"unknown\",\r\n            len: 1\r\n        },\r\n        {\r\n            name: \"moleXPosition\",\r\n            len: 5,\r\n            max: 16\r\n        },\r\n        {\r\n            name: \"moleYPosition\",\r\n            len: 5,\r\n            max: 30\r\n        },\r\n        {\r\n            name: \"moleSize\",\r\n            len: 4,\r\n            max: 8\r\n        },\r\n        {\r\n            name: \"moleActive\",\r\n            bool: true,\r\n            len: 1\r\n        },\r\n        //0x36\r\n        {\r\n            name: \"creatorName\",\r\n            text: 'le',\r\n            len: 160\r\n        }//0x49\r\n    ],\r\n    [MiiFormats.RCD]: [\r\n        //0x0\r\n        {\r\n            name: \"unknown\",\r\n            len: 1\r\n        },\r\n        {\r\n            name: \"gender\",//0 Male, 1 Female\r\n            len: 1\r\n        },\r\n        {\r\n            name: \"birthMonth\",\r\n            len: 4,\r\n            max: 12//0=Not Set\r\n        },\r\n        //Last two bits of 0x0 - 0x1\r\n        {\r\n            name: \"birthday\",\r\n            len: 5\r\n        },\r\n        {\r\n            name: \"favoriteColor\",\r\n            len: 4,\r\n            max: 11\r\n        },\r\n        {\r\n            name: \"favorited\",\r\n            bool: true,\r\n            len: 1\r\n        },\r\n        //0x2\r\n        {\r\n            name: \"name\",\r\n            text: true,\r\n            len: 160\r\n        },\r\n        //0x16\r\n        {\r\n            name: \"height\",\r\n            len: 8,\r\n            max: 127\r\n        },\r\n        //0x17\r\n        {\r\n            name: \"weight\",\r\n            len: 8,\r\n            max: 127\r\n        },\r\n        //0x18\r\n        {\r\n            name: \"miiId\",\r\n            len: 32,\r\n            hex: true\r\n        },\r\n        //x01C\r\n        {\r\n            name: \"systemId\",\r\n            len: 32,\r\n            hex: true,\r\n            decoder: (id) => `${id}`.padEnd(16, \"0\"),\r\n            encoder: (id) => (id ? id : '00000000').slice(0, 8)\r\n        },\r\n        //0x20\r\n        {\r\n            name: \"faceType\",\r\n            len: 3,\r\n            max: 7\r\n        },\r\n        {\r\n            name: \"faceColor\",\r\n            len: 3,\r\n            max: 5\r\n        },\r\n        //Last two bits of 0x2 - 0x21\r\n        {\r\n            name: \"faceFeature\",\r\n            len: 4,\r\n            max: 11\r\n        },\r\n        {\r\n            name: \"unknown\",\r\n            len: 3,\r\n        },\r\n        {\r\n            name: \"mingle\",\r\n            len: 1,\r\n            decoder: (mingle) => mingle == 0 ? true : false,//Mingle is 0 for true, 1 for false\r\n            encoder: (mingle) => mingle ? 0 : 1\r\n        },\r\n        {\r\n            name: \"unknown\",\r\n            len: 1\r\n        },\r\n        {\r\n            name: \"fromCheckMiiOut\",\r\n            bool: true,\r\n            len: 1\r\n        },\r\n        //0x22\r\n        {\r\n            name: \"hairType\",\r\n            len: 7,\r\n            max: 71\r\n            //qk, Add decoder to make canonical value\r\n        },\r\n        //Last bit of 0x22 - 0x23\r\n        {\r\n            name: \"hairColor\",\r\n            len: 3,\r\n            max: 7\r\n        },\r\n        {\r\n            name: \"hairFlipped\",\r\n            bool: true,\r\n            len: 1\r\n        },\r\n        {\r\n            name: \"unknown\",\r\n            len: 5\r\n        },\r\n        //0x24\r\n        {\r\n            name: \"eyebrowType\",\r\n            len: 5,\r\n            max: 23\r\n            //qk, Add decoder to make canonical value\r\n        },\r\n        {\r\n            name: \"unknown\",\r\n            len: 1\r\n        },\r\n        //Last two bits of 0x24 - 0x25\r\n        {\r\n            name: \"eyebrowRotation\",\r\n            len: 4,\r\n            max: 11\r\n        },\r\n        {\r\n            name: \"unknown\",\r\n            len: 6\r\n        },\r\n        //0x26\r\n        {\r\n            name: \"eyebrowColor\",\r\n            len: 3,\r\n            max: 7\r\n        },\r\n        {\r\n            name: \"eyebrowSize\",\r\n            len: 4,\r\n            max: 8\r\n        },\r\n        //Last bit of 0x26 - 0x27\r\n        {\r\n            name: \"eyebrowYPosition\",\r\n            len: 5,\r\n            min: 3,\r\n            max: 18,\r\n            decoder: decoders.eyebrowYPositions,\r\n            encoder: encoders.eyebrowYPositions\r\n        },\r\n        {\r\n            name: \"eyebrowDistanceApart\",\r\n            len: 4,\r\n            max: 12\r\n        },\r\n        //0x28\r\n        {\r\n            name: \"eyeType\",\r\n            len: 6,\r\n            max: 47\r\n            //qk, Add decoder to make canonical value\r\n        },\r\n        {\r\n            name: \"unknown\",\r\n            len: 2\r\n        },\r\n        //0x29\r\n        {\r\n            name: \"eyeRotation\",\r\n            len: 3,\r\n            max: 7\r\n        },\r\n        {\r\n            name: \"eyeYPosition\",\r\n            len: 5,\r\n            max: 18\r\n        },\r\n        //0x2A\r\n        {\r\n            name: \"eyeColor\",\r\n            len: 3,\r\n            max: 5\r\n        },\r\n        {\r\n            name: \"unknown\",\r\n            len: 1\r\n        },\r\n        {\r\n            name: \"eyeSize\",\r\n            len: 3,\r\n            max: 7\r\n        },\r\n        //Last bit of 0x2A - 0x2B\r\n        {\r\n            name: \"eyeDistanceApart\",\r\n            len: 4,\r\n            max: 12\r\n        },\r\n        {\r\n            name: \"unknown\",\r\n            len: 5\r\n        },\r\n        //0x2C\r\n        {\r\n            name: \"noseType\",\r\n            len: 4,\r\n            max: 11\r\n        },\r\n        {\r\n            name: \"noseSize\",\r\n            len: 4,\r\n            max: 8\r\n        },\r\n        //0x2D\r\n        {\r\n            name: \"noseYPosition\",\r\n            len: 5,\r\n            max: 18\r\n        },\r\n        {\r\n            name: \"unknown\",\r\n            len: 3\r\n        },\r\n        //0x2E\r\n        {\r\n            name: \"mouthType\",\r\n            len: 5,\r\n            max: 23\r\n            //qk, Turn this into a canonical value\r\n        },\r\n        {\r\n            name: \"mouthColor\",\r\n            len: 2,\r\n            max: 2\r\n        },\r\n        //Last bit of 0x2E - 0x2F\r\n        {\r\n            name: \"mouthSize\",\r\n            len: 4,\r\n            max: 8\r\n        },\r\n        {\r\n            name: \"mouthYPosition\",\r\n            len: 5,\r\n            max: 18\r\n        },\r\n        //0x30\r\n        {\r\n            name: \"glassesType\",\r\n            len: 4,\r\n            max: 8\r\n        },\r\n        {\r\n            name: \"glassesColor\",\r\n            len: 3,\r\n            max: 5\r\n        },\r\n        {\r\n            name: \"disablesMii\",\r\n            len: 1,\r\n            max: 0\r\n        },\r\n        //0x31\r\n        {\r\n            name: \"glassesSize\",\r\n            len: 3,\r\n            max: 7\r\n        },\r\n        {\r\n            name: \"glassesYPosition\",\r\n            len: 5,\r\n            max: 20\r\n        },\r\n        //0x32\r\n        {\r\n            name: \"mustacheType\",\r\n            len: 2,\r\n            max: 3\r\n        },\r\n        {\r\n            name: \"beardType\",\r\n            len: 2,\r\n            max: 3\r\n        },\r\n        {\r\n            name: \"beardColor\",\r\n            len: 3,\r\n            max: 7\r\n        },\r\n        //Last bit of 0x32 - 0x33\r\n        {\r\n            name: \"mustacheSize\",\r\n            len: 4,\r\n            max: 8\r\n        },\r\n        {\r\n            name: \"mustacheYPosition\",\r\n            len: 5,\r\n            max: 16\r\n        },\r\n        //0x34\r\n        {\r\n            name: \"moleActive\",\r\n            bool: true,\r\n            len: 1\r\n        },\r\n        {\r\n            name: \"moleSize\",\r\n            len: 4,\r\n            max: 8\r\n        },\r\n        //Last three bits of 0x34 - 0x35\r\n        {\r\n            name: \"moleYPosition\",\r\n            len: 5,\r\n            max: 30\r\n        },\r\n        {\r\n            name: \"moleXPosition\",\r\n            len: 5,\r\n            max: 16\r\n        },\r\n        {\r\n            name: \"unknown\",\r\n            len: 1\r\n        },\r\n        //0x36\r\n        {\r\n            name: \"creatorName\",\r\n            text: true,\r\n            len: 160\r\n        }//0x49\r\n    ],\r\n    [MiiFormats.FFCD]: {\r\n        len: 0x5C,\r\n        be: false,\r\n        translation: '3ds',\r\n        struct: [\r\n            //0x0\r\n            {\r\n                name: \"version\",\r\n                len: 8,\r\n                encoder: () => 3\r\n            },\r\n            //0x1\r\n            {\r\n                name: \"unknown\",\r\n                len: 2\r\n            },\r\n            {\r\n                name: \"charset\",\r\n                len: 2,\r\n                max: 3\r\n            },\r\n            {\r\n                name: \"region\",\r\n                len: 2,\r\n                max: 3\r\n            },\r\n            {\r\n                name: \"profaneNames\",\r\n                bool: true,\r\n                len: 1\r\n            },\r\n            {\r\n                name: \"copying\",\r\n                bool: true,\r\n                len: 1\r\n            },\r\n            //0x2\r\n            {\r\n                name: \"selectionSlotIndex\",\r\n                len: 4\r\n            },\r\n            {\r\n                name: \"selectionPageIndex\",\r\n                len: 4\r\n            },\r\n            //0x3\r\n            {\r\n                name: \"unknown\",\r\n                len: 1\r\n            },\r\n            {\r\n                name: \"originalDevice\",\r\n                len: 3,\r\n                min: 1,\r\n                max: 4//1 = Wii. 2 = DS. 3 = 3DS. 4 = Wii U/Switch( 2)\r\n            },\r\n            {\r\n                name: \"unknown\",\r\n                len: 4\r\n            },\r\n            //0x4\r\n            {\r\n                name: \"systemId\",\r\n                hex: true,\r\n                len: 64\r\n            },\r\n            //0xC\r\n            {\r\n                name: \"miiId\",\r\n                hex: true,\r\n                len: 32\r\n            },\r\n            //0x10\r\n            {\r\n                name: \"creatorMac\",\r\n                hex: true,\r\n                len: 48\r\n            },\r\n            //0x16\r\n            {\r\n                name: \"padding\",\r\n                len: 16\r\n            },\r\n\r\n            //0x18\r\n            {\r\n                word: true, // Reverse the endianess of the next 16 bits\r\n                len: 16\r\n            },\r\n            {\r\n                name: \"gender\",\r\n                len: 1//0 Male, 1 Female\r\n            },\r\n            {\r\n                name: \"birthMonth\",\r\n                len: 4,\r\n                max: 12//0 if not set\r\n            },\r\n            {\r\n                name: \"birthday\",\r\n                len: 5\r\n            },\r\n            {\r\n                name: \"favoriteColor\",\r\n                len: 4,\r\n                max: 11\r\n            },\r\n            {\r\n                name: \"favorited\",\r\n                bool: true,\r\n                len: 1\r\n            },\r\n            {\r\n                name: \"unknown\",\r\n                len: 1\r\n            },\r\n\r\n            //0x1A\r\n            {\r\n                name: \"name\",\r\n                text: 'le',\r\n                len: 160\r\n            },\r\n            //0x2E\r\n            {\r\n                name: \"height\",\r\n                len: 8,\r\n                max: 127\r\n            },\r\n            //0x2F\r\n            {\r\n                name: \"weight\",\r\n                len: 8,\r\n                max: 127\r\n            },\r\n            //0x30\r\n            {\r\n                name: \"faceColor\",\r\n                len: 3,\r\n                max: 5\r\n            },\r\n            {\r\n                name: \"faceType\",\r\n                len: 4,\r\n                max: 11\r\n            },\r\n            {\r\n                name: \"sharing\",\r\n                len: 1,\r\n                decoder: (sharing) => sharing == 0 ? true : false,\r\n                encoder: (sharing) => sharing ? 0 : 1\r\n            },\r\n            //0x31\r\n            {\r\n                name: \"makeup\",\r\n                len: 4,\r\n                max: 11\r\n            },\r\n            {\r\n                name: \"faceFeature\",\r\n                len: 4,\r\n                max: 11\r\n            },\r\n            //0x32\r\n            {\r\n                name: \"hairType\",\r\n                len: 8,\r\n                max: 131\r\n            },\r\n            //0x33\r\n            {\r\n                name: \"unknown\",\r\n                len: 4\r\n            },\r\n            {\r\n                name: \"hairFlipped\",\r\n                bool: true,\r\n                len: 1\r\n            },\r\n            {\r\n                name: \"hairColor\",\r\n                len: 3,\r\n                max: 7\r\n            },\r\n\r\n            //0x34\r\n            {\r\n                word: true,\r\n                len: 32\r\n            },\r\n            {\r\n                name: \"eyeType\",\r\n                len: 6,\r\n                max: 59\r\n            },\r\n            {\r\n                name: \"eyeColor\",\r\n                len: 3,\r\n                max: 5\r\n            },\r\n            {\r\n                name: \"eyeSize\",\r\n                len: 4,\r\n                max: 7//flip\r\n            },\r\n            {\r\n                name: \"eyeSquash\",\r\n                len: 3,\r\n                max: 6//flip\r\n            },\r\n            {\r\n                name: \"eyeRotation\",\r\n                len: 5,\r\n                max: 7\r\n            },\r\n            {\r\n                name: \"eyeDistanceApart\",\r\n                len: 4,\r\n                max: 12\r\n            },\r\n            {\r\n                name: \"eyeYPosition\",\r\n                len: 5,\r\n                max: 18\r\n            },\r\n            {\r\n                name: \"unknown\",\r\n                len: 2\r\n            },\r\n\r\n            //0x38\r\n            {\r\n                word: true,\r\n                len: 32\r\n            },\r\n            {\r\n                name: \"eyebrowType\",\r\n                len: 5,\r\n                max: 24\r\n            },\r\n            {\r\n                name: \"eyebrowColor\",\r\n                len: 3,\r\n                max: 7\r\n            },\r\n            {\r\n                name: \"eyebrowSize\",\r\n                len: 4,\r\n                max: 8//flip\r\n            },\r\n            {\r\n                name: \"eyebrowSquash\",\r\n                len: 3,\r\n                max: 6//flip\r\n            },\r\n            {\r\n                name: \"unknown\",\r\n                len: 1\r\n            },\r\n            {\r\n                name: \"eyebrowRotation\",\r\n                len: 4,\r\n                max: 11\r\n            },\r\n            {\r\n                name: \"unknown\",\r\n                len: 1\r\n            },\r\n            {\r\n                name: \"eyebrowDistanceApart\",\r\n                len: 4,\r\n                max: 12\r\n            },\r\n            {\r\n                name: \"eyebrowYPosition\",\r\n                len: 5,\r\n                min: 3,\r\n                max: 18,\r\n                decoder: decoders.eyebrowYPositions,\r\n                encoder: encoders.eyebrowYPositions\r\n            },\r\n            {\r\n                name: \"unknown\",\r\n                len: 2\r\n            },\r\n\r\n            //0x3C\r\n            {\r\n                word: true,\r\n                len: 16\r\n            },\r\n            {\r\n                name: \"noseType\",\r\n                len: 5,\r\n                max: 17\r\n            },\r\n            {\r\n                name: \"noseSize\",\r\n                len: 4,\r\n                max: 8//flip\r\n            },\r\n            {\r\n                name: \"noseYPosition\",\r\n                len: 5,\r\n                max: 18\r\n            },\r\n            {\r\n                name: \"unknown\",\r\n                len: 2\r\n            },\r\n\r\n            //0x3E\r\n            {\r\n                word: true,\r\n                len: 16\r\n            },\r\n            {\r\n                name: \"mouthType\",\r\n                len: 6,\r\n                max: 35\r\n            },\r\n            {\r\n                name: \"mouthColor\",\r\n                len: 3,\r\n                max: 4\r\n            },\r\n            {\r\n                name: \"mouthSize\",\r\n                len: 4,\r\n                max: 8//flip\r\n            },\r\n            {\r\n                name: \"mouthSquash\",\r\n                len: 3,\r\n                max: 6//flip\r\n            },\r\n\r\n            //0x40\r\n            {\r\n                word: true,\r\n                len: 16\r\n            },\r\n            {\r\n                name: \"mouthYPosition\",\r\n                len: 5,\r\n                max: 18\r\n            },\r\n            {\r\n                name: \"mustacheType\",\r\n                len: 3,\r\n                max: 5\r\n            },\r\n            {\r\n                name: \"unknown\",\r\n                len: 8\r\n            },\r\n\r\n            //0x42\r\n            {\r\n                word: true,\r\n                len: 16\r\n            },\r\n            {\r\n                name: \"beardType\",\r\n                len: 3,\r\n                max: 5\r\n            },\r\n            {\r\n                name: \"beardColor\",\r\n                len: 3,\r\n                max: 7\r\n            },\r\n            {\r\n                name: \"mustacheSize\",\r\n                len: 4,\r\n                max: 8//flip\r\n            },\r\n            {\r\n                name: \"mustacheYPosition\",\r\n                len: 5,\r\n                max: 16\r\n            },\r\n            {\r\n                name: \"unknown\",\r\n                len: 1\r\n            },\r\n\r\n            //0x44\r\n            {\r\n                word: true,\r\n                len: 16\r\n            },\r\n            {\r\n                name: \"glassesType\",\r\n                len: 4,\r\n                max: 8\r\n            },\r\n            {\r\n                name: \"glassesColor\",\r\n                len: 3,\r\n                max: 5\r\n            },\r\n            {\r\n                name: \"glassesSize\",\r\n                len: 4,\r\n                max: 7//flip\r\n            },\r\n            {\r\n                name: \"glassesYPosition\",\r\n                len: 5,\r\n                max: 20\r\n            },\r\n\r\n            //0x46\r\n            {\r\n                word: true,\r\n                len: 16\r\n            },\r\n            {\r\n                name: \"moleActive\",\r\n                bool: true,\r\n                len: 1\r\n            },\r\n            {\r\n                name: \"moleSize\",\r\n                len: 4,\r\n                max: 8//flip\r\n            },\r\n            {\r\n                name: \"moleXPosition\",\r\n                len: 5,\r\n                max: 16\r\n            },\r\n            {\r\n                name: \"moleYPosition\",\r\n                len: 5,\r\n                max: 30\r\n            },\r\n            {\r\n                name: \"unknown\",\r\n                len: 1\r\n            },\r\n\r\n            //0x48\r\n            {\r\n                name: \"creatorName\",\r\n                text: 'le',\r\n                len: 160\r\n            }\r\n        ],\r\n        preProcess: (dat)=>processors.cffcdPreProcess(dat,4),\r\n        postProcess: processors.cffcdPostProcess\r\n    },\r\n    [MiiFormats.FFED]: {\r\n        len: 0x70,\r\n        decoder: decryptMii,\r\n        encoder: encryptMii,\r\n        preEncode: MiiFormats.CFSD\r\n    },\r\n    [MiiFormats.FFED]: {\r\n        len: 0x70,\r\n        decoder: decryptMii,\r\n        encoder: encryptMii,\r\n        preEncode: MiiFormats.FFSD\r\n    },\r\n    [MiiFormats.NFCD]: [\r\n        {\r\n            name: \"hairType\",\r\n            len: 8,\r\n            max: 131\r\n        },\r\n        {\r\n            name: \"moleActive\",\r\n            bool: true,\r\n            len: 1\r\n        },\r\n        {\r\n            name: \"height\",\r\n            len: 7,\r\n            max: 127\r\n        },\r\n        {\r\n            name: \"hairFlipped\",\r\n            bool: true,\r\n            len: 1\r\n        },\r\n        {\r\n            name: \"weight\",\r\n            len: 7,\r\n            max: 127\r\n        },\r\n        {\r\n            name: \"isSpecial\",\r\n            bool: true,\r\n            len: 1,\r\n            decoder: (bool) => bool ? \"Special\" : \"Default\",\r\n            encoder: (text) => text===\"Special\" ? true:false\r\n        },\r\n        {\r\n            name: \"hairColor\",\r\n            len: 7,\r\n            max: 99\r\n        },\r\n        {\r\n            name: \"gender\",\r\n            len: 1\r\n        },\r\n        {\r\n            name: \"eyeColor\",\r\n            len: 7,\r\n            max: 99\r\n        },\r\n        {\r\n            name:\"unknown\",\r\n            len:1\r\n        },\r\n        {\r\n            name: \"eyebrowColor\",\r\n            len: 7,\r\n            max: 99\r\n        },\r\n        {\r\n            name:\"unknown\",\r\n            len:1\r\n        },\r\n        {\r\n            name: \"mouthColor\",\r\n            len: 7,\r\n            max: 99\r\n        },\r\n        {\r\n            name:\"unknown\",\r\n            len:1\r\n        },\r\n        {\r\n            name: \"beardColor\",\r\n            len: 7,\r\n            max: 99\r\n        },\r\n        {\r\n            name:\"unknown\",\r\n            len:1\r\n        },\r\n        {\r\n            name: \"glassesColor\",\r\n            len: 7,\r\n            max: 99\r\n        },\r\n        {\r\n            name: \"region\",\r\n            len: 2,\r\n            max: 3\r\n        },\r\n        {\r\n            name: \"eyeType\",\r\n            len: 6,\r\n            max: 59\r\n        },\r\n        {\r\n            name:\"charset\",\r\n            len:2,\r\n            max:3\r\n        },\r\n        {\r\n            name: \"mouthType\",\r\n            len: 6,\r\n            max: 35\r\n        },\r\n        {\r\n            name: \"glassesSize\",\r\n            len: 3,\r\n            max: 7\r\n        },\r\n        {\r\n            name: \"eyeYPosition\",\r\n            len: 5,\r\n            max: 18\r\n        },\r\n        {\r\n            name: \"mustacheType\",\r\n            len: 3,\r\n            max: 5\r\n        },\r\n        {\r\n            name: \"eyebrowType\",\r\n            len: 5,\r\n            max: 23\r\n        },\r\n        {\r\n            name: \"beardType\",\r\n            len: 3,\r\n            max: 5\r\n        },\r\n        {\r\n            name: \"noseType\",\r\n            len: 5,\r\n            max: 17\r\n        },\r\n        {\r\n            name: \"mouthSquash\",\r\n            len: 3,\r\n            max: 6\r\n        },\r\n        {\r\n            name: \"noseYPosition\",\r\n            len: 5,\r\n            max: 18\r\n        },\r\n        {\r\n            name: \"eyebrowSquash\",\r\n            len: 3,\r\n            max: 6\r\n        },\r\n        {\r\n            name: \"mouthYPosition\",\r\n            len: 5,\r\n            max: 18\r\n        },\r\n        {\r\n            name: \"eyeRotation\",\r\n            len: 3,\r\n            max: 7\r\n        },\r\n        {\r\n            name: \"mustacheYPosition\",\r\n            len: 5,\r\n            max: 16\r\n        },\r\n        {\r\n            name: \"eyeSquash\",\r\n            len: 3,\r\n            max: 6\r\n        },\r\n        {\r\n            name: \"glassesYPosition\",\r\n            len: 5,\r\n            max: 20\r\n        },\r\n        {\r\n            name: \"eyeSize\",\r\n            len: 3,\r\n            max: 7\r\n        },\r\n        {\r\n            name: \"moleXPosition\",\r\n            len: 5,\r\n            max: 16\r\n        },\r\n        {\r\n            name:\"unknown\",\r\n            len:3\r\n        },\r\n        {\r\n            name: \"moleYPosition\",\r\n            len: 5,\r\n            max: 30\r\n        },\r\n        {\r\n            name:\"unknown\",\r\n            len:3\r\n        },\r\n        {\r\n            name: \"glassesType\",\r\n            len: 5,\r\n            max: 19\r\n        },\r\n        {\r\n            name: \"faceType\",\r\n            len: 4,\r\n            max: 11\r\n        },\r\n        {\r\n            name: \"favoriteColor\",\r\n            len: 4,\r\n            max: 11\r\n        },\r\n        {\r\n            name: \"faceFeature\",\r\n            len: 4,\r\n            max: 11\r\n        },\r\n        {\r\n            name: \"faceColor\",\r\n            len: 4,\r\n            max: 9\r\n        },\r\n        {\r\n            name: \"eyeDistanceApart\",\r\n            len: 4,\r\n            max: 12\r\n        },\r\n        {\r\n            name: \"makeup\",\r\n            len: 4,\r\n            max: 11\r\n        },\r\n        {\r\n            name: \"eyebrowRotation\",\r\n            len: 4,\r\n            max: 11\r\n        },\r\n        {\r\n            name: \"eyebrowSize\",\r\n            len: 4,\r\n            max: 8\r\n        },\r\n        {\r\n            name: \"eyebrowYPosition\",\r\n            len: 4,\r\n            min: 0,\r\n            max: 15\r\n        },\r\n        {\r\n            name: \"eyebrowDistanceApart\",\r\n            len: 4,\r\n            max: 12\r\n        },\r\n        {\r\n            name: \"mouthSize\",\r\n            len: 4,\r\n            max: 8\r\n        },\r\n        {\r\n            name: \"noseSize\",\r\n            len: 4,\r\n            max: 8\r\n        },\r\n        {\r\n            name: \"moleSize\",\r\n            len: 4,\r\n            max: 8\r\n        },\r\n        {\r\n            name: \"mustacheSize\",\r\n            len: 4,\r\n            max: 8\r\n        },\r\n        {\r\n            name: \"name\",\r\n            text: 'le',\r\n            len: 160\r\n        }\r\n    ]\r\n};\r\ncommonStructs[MiiFormats.FFSD] = {\r\n    len: 0x60,\r\n    struct: [...commonStructs[MiiFormats.FFCD].struct,\r\n        {\r\n            name: \"padding\",\r\n            len: 16,\r\n            max: 0\r\n        },\r\n        {\r\n            name: \"checksum\",\r\n            len: 16\r\n        }\r\n    ],\r\n    translation: '3ds',\r\n    encoder: (dat) => encoders.appendCrc(dat),\r\n    preProcess: (dat)=>processors.cffcdPreProcess(dat,4),\r\n    postProcess: processors.cffcdPostProcess\r\n};\r\ncommonStructs[MiiFormats.TLC] = [\r\n    // Adapted from the Kaitai Struct by Arian Kordi: https://github.com/ariankordi/nwf-mii-cemu-toy/blob/ffl-renderer-proto-integrate/assets/kaitai-structs/tomodachi_life_qr_code.ksy\r\n    {\r\n        name: \"firstName\",\r\n        len: 256,\r\n        text: \"le\"\r\n    },\r\n    {\r\n        name: \"lastName\",\r\n        len: 256,\r\n        text: \"le\"\r\n    },\r\n    {\r\n        name: \"birthMonth\",\r\n        len: 4,\r\n        max: 12\r\n    },\r\n    {\r\n        name: \"unknown\",\r\n        len: 6\r\n    },\r\n    {\r\n        name: \"isAdult\",\r\n        len: 1,\r\n        bool: true\r\n    },\r\n    {\r\n        name: \"birthday\",\r\n        len: 5\r\n    },\r\n    {\r\n        name: \"unknown\",\r\n        len: 8\r\n    },\r\n\r\n    {\r\n        name: \"hairDyeMode\",\r\n        len: 2,\r\n        max: 2//0 Off, 1 Hair, 2 Hair & Eyebrows\r\n    },\r\n    {\r\n        name: \"hairDye\",\r\n        len: 5\r\n    },\r\n    {\r\n        name: \"unknown\",\r\n        len: 97\r\n    },\r\n    {\r\n        name: \"catchphrase\",\r\n        len: 256,\r\n        text: 'le'\r\n    },\r\n    {\r\n        name: \"unknown\",\r\n        len: 16\r\n    },\r\n    {\r\n        name: \"outfitId\",\r\n        len: 16,\r\n        hex: true\r\n    },\r\n    {\r\n        name: \"hatId\",\r\n        len: 16,\r\n        hex: true\r\n    },\r\n    {\r\n        name: \"unknown\",\r\n        len: 16\r\n    },\r\n\r\n    {\r\n        name: \"islandId1\",\r\n        len: 128,\r\n        hex: true\r\n    },\r\n    {\r\n        name: \"islandId2\",\r\n        len: 128,\r\n        hex: true\r\n    },\r\n    {\r\n        name: \"authorId\",\r\n        len: 64,\r\n        hex: true\r\n    },\r\n    {\r\n        name: \"islanderId\",\r\n        len: 80,\r\n        hex: true\r\n    },\r\n    {\r\n        name: \"voicePitch\",\r\n        max: 100,\r\n        len: 8\r\n    },\r\n    {\r\n        name: \"voiceSpeed\",\r\n        max: 100,\r\n        len: 8\r\n    },\r\n    {\r\n        name: \"voiceQuality\",\r\n        max: 100,\r\n        len: 8\r\n    },\r\n    {\r\n        name: \"voiceTone\",\r\n        max: 100,\r\n        len: 8\r\n    },\r\n    {\r\n        name: \"voiceAccent\",\r\n        max: 100,\r\n        len: 8\r\n    },\r\n    {\r\n        name: \"voiceIntonation\",\r\n        max: 3,\r\n        len: 8\r\n    },\r\n    {\r\n        name: \"personalityMovement\",\r\n        min: 1,\r\n        max: 8,\r\n        len: 8\r\n    },\r\n    {\r\n        name: \"personalitySpeech\",\r\n        min: 1,\r\n        max: 8,\r\n        len: 8\r\n    },\r\n    {\r\n        name: \"personalityExpressiveness\",\r\n        min: 1,\r\n        max: 8,\r\n        len: 8\r\n    },\r\n    {\r\n        name: \"personalityAttitude\",\r\n        min: 1,\r\n        max: 8,\r\n        len: 8\r\n    },\r\n    {\r\n        name: \"personalityOverall\",\r\n        min: 1,\r\n        max: 8,\r\n        len: 8\r\n    },\r\n    {\r\n        name: \"unknownFlags\",\r\n        hex: true,\r\n        len: 152\r\n    },\r\n    {\r\n        name: \"islandId3\",\r\n        len: 128,\r\n        hex: true\r\n    },\r\n    {\r\n        name: \"islandName\",\r\n        len: 144,\r\n        text: 'le'\r\n    },\r\n    {\r\n        name: \"unknown\",\r\n        len: 16\r\n    },\r\n    {\r\n        name: \"checksum\",\r\n        len: 32\r\n    }\r\n];\r\n\r\nconst formats = {\r\n    //Wii\r\n    [MiiFormats.RCD]: {\r\n        len: 0x4a,\r\n        translation: 'wii',\r\n        struct: commonStructs[MiiFormats.RCD],\r\n        preProcess: processors.rcdPreProcess,\r\n        postProcess: (dat) => processors.rcdPostProcess(dat, 1)\r\n    },\r\n    [MiiFormats.RSD]: {\r\n        len: 0x4c,\r\n        translation: 'wii',\r\n        struct: [...commonStructs[MiiFormats.RCD],\r\n        //0x49\r\n        {\r\n            name: \"checksum\",\r\n            len: 16\r\n        }\r\n        ],\r\n        preProcess: processors.rcdPreProcess,\r\n        postProcess: (dat) => processors.rcdPostProcess(dat, 1),\r\n        encoder: (dat) => encoders.appendCrc(dat)\r\n    },\r\n    //DS, Practically same as Wii but Endian swaps\r\n    [MiiFormats.NCD]: {\r\n        translation: 'wii',\r\n        len: 0x4a,\r\n        be: false,\r\n        struct: commonStructs[MiiFormats.NCD],\r\n        preProcess: processors.rcdPreProcess,\r\n        postProcess: (dat) => processors.rcdPostProcess(dat, 2)\r\n    },\r\n    [MiiFormats.NSD]: {\r\n        translation: 'wii',\r\n        len: 0x4c,\r\n        be: false,\r\n        struct: [...commonStructs[MiiFormats.NCD],\r\n        //0x49\r\n        {\r\n            name: \"checksum\",\r\n            len: 16\r\n        }\r\n        ],\r\n        preProcess: processors.rcdPreProcess,\r\n        postProcess: (dat) => processors.rcdPostProcess(dat, 2),\r\n        encoder: (dat) => encoders.appendCrc(dat)\r\n    },\r\n\r\n    //3DS/Wii U\r\n    [MiiFormats.FFCD]: commonStructs[MiiFormats.FFCD],\r\n    [MiiFormats.FFSD]: commonStructs[MiiFormats.FFSD],\r\n    [MiiFormats.FFED]: commonStructs[MiiFormats.FFED],\r\n    [MiiFormats.CFCD]: lodash.cloneDeep(commonStructs[MiiFormats.FFCD]),\r\n    [MiiFormats.CFSD]: lodash.cloneDeep(commonStructs[MiiFormats.FFSD]),\r\n    [MiiFormats.CFED]: lodash.cloneDeep(commonStructs[MiiFormats.FFED]),\r\n\r\n    //Mii Creator\r\n    [MiiFormats.MIIC]: {\r\n        len: 0x80,\r\n        struct: [\r\n            {\r\n                name: \"miicVersion\",\r\n                len: 8,\r\n                min: 4,\r\n                max: 4\r\n            },\r\n            {\r\n                name: \"miicOriginPlatform\",\r\n                len: 8,\r\n                min: 0,\r\n                max: 6\r\n            },\r\n            {\r\n                name: \"miicAuthorId\",\r\n                len: 64,\r\n                hex: true\r\n            },\r\n            {\r\n                name: \"miicCreateId\",\r\n                len: 80,\r\n                hex: true\r\n            },\r\n            {\r\n                name: \"creatorName\",\r\n                text: \"le\",\r\n                len: 160\r\n            },\r\n            {\r\n                name: \"name\",\r\n                text: \"le\",\r\n                len: 160\r\n            },\r\n            {\r\n                name: \"beardColor\",\r\n                len: 8,\r\n                max: 99\r\n            },\r\n            {\r\n                name: \"beardType\",\r\n                len: 8,\r\n                max: 5\r\n            },\r\n            {\r\n                name: \"birthday\",\r\n                len: 8,\r\n                max: 31\r\n            },\r\n            {\r\n                name: \"birthMonth\",\r\n                len: 8,\r\n                max: 12\r\n            },\r\n            {\r\n                name: \"miicBirthYear\",\r\n                len: 16,\r\n                max: 9999\r\n            },\r\n            {\r\n                name: \"weight\",\r\n                len: 8,\r\n                max: 127\r\n            },\r\n            {\r\n                name: \"eyeSquash\",\r\n                len: 8,\r\n                max: 6\r\n            },\r\n            {\r\n                name: \"eyebrowSquash\",\r\n                len: 8,\r\n                max: 6\r\n            },\r\n            {\r\n                name: \"eyebrowColor\",\r\n                len: 8,\r\n                max: 99\r\n            },\r\n            {\r\n                name: \"eyebrowRotation\",\r\n                len: 8,\r\n                max: 11\r\n            },\r\n            {\r\n                name: \"eyebrowSize\",\r\n                len: 8,\r\n                max: 8\r\n            },\r\n            {\r\n                name: \"eyebrowType\",\r\n                len: 8,\r\n                max: 23\r\n            },\r\n            {\r\n                name: \"eyebrowDistanceApart\",\r\n                len: 8,\r\n                max: 12\r\n            },\r\n            {\r\n                name: \"eyebrowYPosition\",\r\n                len: 8,\r\n                min: 3,\r\n                max: 18,\r\n                decoder: decoders.eyebrowYPositions,\r\n                encoder: encoders.eyebrowYPositions\r\n            },\r\n            {\r\n                name: \"eyeColor\",\r\n                len: 8,\r\n                max: 99\r\n            },\r\n            {\r\n                name: \"eyeRotation\",\r\n                len: 8,\r\n                max: 7\r\n            },\r\n            {\r\n                name: \"eyeSize\",\r\n                len: 8,\r\n                max: 7\r\n            },\r\n            {\r\n                name: \"eyeType\",\r\n                len: 8,\r\n                max: 59\r\n            },\r\n            {\r\n                name: \"eyeDistanceApart\",\r\n                len: 8,\r\n                max: 12\r\n            },\r\n            {\r\n                name: \"eyeYPosition\",\r\n                len: 8,\r\n                max: 18\r\n            },\r\n            {\r\n                name: \"faceColor\",\r\n                len: 8,\r\n                max: 9\r\n            },\r\n            {\r\n                name: \"makeup\",\r\n                len: 8,\r\n                max: 11\r\n            },\r\n            {\r\n                name: \"faceType\",\r\n                len: 8,\r\n                max: 11\r\n            },\r\n            {\r\n                name: \"faceFeature\",\r\n                len: 8,\r\n                max: 11\r\n            },\r\n            {\r\n                name: \"miicFacePaintColor\",\r\n                len: 8,\r\n                decoder: (val) => val === 255 ? -1 : val,\r\n                encoder: (val) => val === -1 ? 255 : val\r\n            },\r\n            {\r\n                name: \"favorited\",\r\n                bool: true,\r\n                len: 8,\r\n                max: 1\r\n            },\r\n            {\r\n                name: \"favoriteColor\",\r\n                len: 8,\r\n                max: 11\r\n            },\r\n            {\r\n                name: \"charset\",\r\n                len: 8,\r\n                max: 3\r\n            },\r\n            {\r\n                name: \"gender\",\r\n                len: 8,\r\n                max: 1\r\n            },\r\n            {\r\n                name: \"glassesColor\",\r\n                len: 8,\r\n                max: 99\r\n            },\r\n            {\r\n                name: \"glassesSize\",\r\n                len: 8,\r\n                max: 7\r\n            },\r\n            {\r\n                name: \"glassesType\",\r\n                len: 8,\r\n                max: 19\r\n            },\r\n            {\r\n                name: \"glassesYPosition\",\r\n                len: 8,\r\n                max: 20\r\n            },\r\n            {\r\n                name: \"hairColor\",\r\n                len: 8,\r\n                max: 99\r\n            },\r\n            {\r\n                name: \"hairFlipped\",\r\n                bool: true,\r\n                len: 8,\r\n                max: 1\r\n            },\r\n            {\r\n                name: \"hairType\",\r\n                len: 8,\r\n                max: 131\r\n            },\r\n            {\r\n                name: \"miicHatFavoriteColor\",\r\n                len: 8,\r\n                decoder: (val) => val === 255 ? -1 : val,\r\n                encoder: (val) => val === -1 ? 255 : val\r\n            },\r\n            {\r\n                name: \"miicHatCommonColor\",\r\n                len: 8,\r\n                decoder: (val) => val === 255 ? -1 : val,\r\n                encoder: (val) => val === -1 ? 255 : val\r\n            },\r\n            {\r\n                name: \"miicHatType\",\r\n                len: 8,\r\n                decoder: (val) => val === 255 ? -1 : val,\r\n                encoder: (val) => val === -1 ? 255 : val\r\n            },\r\n            {\r\n                name: \"height\",\r\n                len: 8,\r\n                max: 127\r\n            },\r\n            {\r\n                name: \"miicBodyType\",\r\n                len: 8,\r\n                decoder: (val) => val === 255 ? -1 : val,\r\n                encoder: (val) => val === -1 ? 255 : val\r\n            },\r\n            {\r\n                name: \"moleSize\",\r\n                len: 8,\r\n                max: 8\r\n            },\r\n            {\r\n                name: \"moleActive\",\r\n                bool: true,\r\n                len: 8,\r\n                max: 1\r\n            },\r\n            {\r\n                name: \"moleXPosition\",\r\n                len: 8,\r\n                max: 16\r\n            },\r\n            {\r\n                name: \"moleYPosition\",\r\n                len: 8,\r\n                max: 30\r\n            },\r\n            {\r\n                name: \"mouthSquash\",\r\n                len: 8,\r\n                max: 6\r\n            },\r\n            {\r\n                name: \"mouthColor\",\r\n                len: 8,\r\n                max: 99\r\n            },\r\n            {\r\n                name: \"mouthSize\",\r\n                len: 8,\r\n                max: 8\r\n            },\r\n            {\r\n                name: \"mouthType\",\r\n                len: 8,\r\n                max: 35\r\n            },\r\n            {\r\n                name: \"mouthYPosition\",\r\n                len: 8,\r\n                max: 18\r\n            },\r\n            {\r\n                name: \"mustacheSize\",\r\n                len: 8,\r\n                max: 8\r\n            },\r\n            {\r\n                name: \"mustacheType\",\r\n                len: 8,\r\n                max: 5\r\n            },\r\n            {\r\n                name: \"mustacheYPosition\",\r\n                len: 8,\r\n                max: 16\r\n            },\r\n            {\r\n                name: \"noseSize\",\r\n                len: 8,\r\n                max: 8\r\n            },\r\n            {\r\n                name: \"noseType\",\r\n                len: 8,\r\n                max: 17\r\n            },\r\n            {\r\n                name: \"noseYPosition\",\r\n                len: 8,\r\n                max: 18\r\n            },\r\n            {\r\n                name: \"miicPantsColor\",\r\n                len: 8,\r\n                decoder: (val) => val === 255 ? -1 : val,\r\n                encoder: (val) => val === -1 ? 255 : val\r\n            },\r\n            {\r\n                name: \"miicPersonality\",\r\n                len: 8,\r\n                decoder: (val) => val === 255 ? -1 : val,\r\n                encoder: (val) => val === -1 ? 255 : val\r\n            },\r\n            {\r\n                name: \"miicRegionMove\",\r\n                len: 8,\r\n                max: 3\r\n            },\r\n            {\r\n                name: \"miicShirtColor\",\r\n                len: 8,\r\n                decoder: (val) => val === 255 ? -1 : val,\r\n                encoder: (val) => val === -1 ? 255 : val\r\n            },\r\n            {\r\n                name: \"isSpecial\",\r\n                bool: true,\r\n                len: 8,\r\n                max: 1,\r\n                decoder: (bool) => bool ? \"Special\" : \"Default\",\r\n                encoder: (text) => text === \"Special\" ? true : false\r\n            },\r\n            {\r\n                name: \"miicTransferred\",\r\n                bool: true,\r\n                len: 8,\r\n                max: 1\r\n            },\r\n            {\r\n                name: \"miicEyeSclera\",\r\n                bool: true,\r\n                len: 8,\r\n                max: 1\r\n            },\r\n            {\r\n                name: \"miicClothesType\",\r\n                len: 8,\r\n                decoder: (val) => val === 255 ? -1 : val,\r\n                encoder: (val) => val === -1 ? 255 : val\r\n            },\r\n            {\r\n                name: \"miicShoesColor\",\r\n                len: 8,\r\n                decoder: (val) => val === 255 ? -1 : val,\r\n                encoder: (val) => val === -1 ? 255 : val\r\n            },\r\n            {\r\n                name: \"miicHatSecondaryColor\",\r\n                len: 8,\r\n                decoder: (val) => val === 255 ? -1 : val,\r\n                encoder: (val) => val === -1 ? 255 : val\r\n            },\r\n            {\r\n                name: \"miicHatTertiaryColor\",\r\n                len: 8,\r\n                decoder: (val) => val === 255 ? -1 : val,\r\n                encoder: (val) => val === -1 ? 255 : val\r\n            }\r\n        ]\r\n    },\r\n\r\n    //Miitomo\r\n    [MiiFormats.MIITOMO]: {\r\n        len: 0x88,\r\n        translation: '3ds',\r\n        struct: [\r\n            ...commonStructs[MiiFormats.FFSD].struct,\r\n            {\r\n                name: \"miitomoInfo\",\r\n                len: 320,\r\n                hex: true,\r\n                decoder: (hex) => Buffer.from(hex, \"hex\").toString(\"ascii\"),\r\n                encoder: (value) => typeof value === \"string\" ? Buffer.from(value, \"ascii\").toString(\"hex\") : \"\"\r\n            }\r\n        ],\r\n        encoder: encodeMiitomoMii,\r\n        preProcess: (dat)=>processors.cffcdPreProcess(dat,4),\r\n        postProcess: processors.cffcdPostProcess\r\n    },\r\n    [MiiFormats.MIITOMOE]: {\r\n        len: 0xAC,\r\n        decoder: decryptMii,\r\n        encoder: encryptMii,\r\n        preEncode: MiiFormats.MIITOMO\r\n    },\r\n    [MiiFormats.MT]: {\r\n        len: 0x120,\r\n        translation: '3ds',\r\n        struct: [\r\n            ...commonStructs[MiiFormats.FFSD].struct,\r\n            {\r\n                name: \"padding\",\r\n                len: 528\r\n            },\r\n            {\r\n                name: \"warCry\",\r\n                len: 416,\r\n                text:'le'\r\n            },\r\n            {\r\n                name: \"padding\",\r\n                len: 592\r\n            }\r\n        ],\r\n        encoder: encodeMiitopiaMii,\r\n        preProcess: (dat)=>processors.cffcdPreProcess(dat,4),\r\n        postProcess: processors.cffcdPostProcess\r\n    },\r\n    [MiiFormats.MTE]: {\r\n        len: 0x144,\r\n        decoder: decryptMii,\r\n        encoder: encryptMii,\r\n        preEncode: MiiFormats.MT\r\n    },\r\n    //Tomodachi Life Store Data\r\n    [MiiFormats.TLS]: {\r\n        len: 336,\r\n        translation: '3ds',\r\n        struct: [...commonStructs[MiiFormats.FFSD].struct, ...commonStructs[MiiFormats.TLC]],\r\n        encoder: (dat) => encoders.appendCrc(dat, 32),\r\n        preProcess: (d)=>processors.cffcdPreProcess(d,3),\r\n        postProcess: processors.cffcdPostProcess\r\n    },\r\n    //Tomodachi Life Core Data\r\n    [MiiFormats.TLC]: {\r\n        len: 332,\r\n        translation: '3ds',\r\n        struct: [...commonStructs[MiiFormats.FFCD].struct, ...commonStructs[MiiFormats.TLC]],\r\n        encoder: (dat) => encoders.appendCrc(dat, 32),\r\n        preProcess: (d)=>{\r\n            return processors.cffcdPreProcess(d,3);\r\n        },\r\n        postProcess: (mii)=>{\r\n            mii=processors.cffcdPostProcess(mii);\r\n\r\n            /*\r\n                While we can derive what the resulting address would be from a given Island ID,\r\n                there is sadly no way to go back to the Island ID from the address pieces without\r\n                brute forcing due to the nature of the hash. A tool to do this is made available at\r\n                https://infinimii.com/islandAddress\r\n            */\r\n\r\n            const digest = crypto\r\n                .createHmac(\"sha1\", Buffer.from(\"this is a tempolary key.\\0\", \"ascii\"))\r\n                .update(Buffer.from(mii?.tl?.island?.id?.id, \"hex\"))\r\n                .digest();\r\n\r\n            const h = (BigInt(digest.readUInt32LE(4)) << 32n) | BigInt(digest.readUInt32LE(0));\r\n            const wordCount = BigInt(islandAddresses.length);\r\n            const ocean = islandAddresses[Number(h % wordCount)];\r\n            const isles = islandAddresses[Number((h >> 10n) % wordCount)];\r\n            const num1 = Number((h >> 20n) % 1000n);\r\n            const num2 = Number((h >> 30n) % 1000n);\r\n\r\n            mii.tl.island.id.readable=`${mii.tl.island.name} Island\\n${num1}-${num2} ${isles} Isles\\n${ocean} Ocean`;\r\n\r\n            /*\r\n                consoleIdBytes: raw bytes 0..7\r\n                consoleIdU64LE: same value interpreted little-endian\r\n                timeBytes: raw bytes 8..15\r\n                timeLoU32LE: bytes 8..11, from the scene/time word at +0x30\r\n                timeHiU32LE: bytes 12..15, from the scene/time word at +0x34\r\n                timeU64LE: bytes 8..15 combined as one little-endian u64\r\n                derived HMAC address pieces: num1, num2, isles, ocean, and readable\r\n            */\r\n\r\n            return mii;\r\n        }\r\n    },\r\n    [MiiFormats.TLE]: {\r\n        len: 372,\r\n        decoder: decryptMii,\r\n        encoder: encryptMii,\r\n        preEncode: MiiFormats.TLS\r\n    },\r\n\r\n\r\n    //Switch\r\n    [MiiFormats.NFCD]: {\r\n        len: 48,\r\n        struct: commonStructs[MiiFormats.NFCD]\r\n    },\r\n    [MiiFormats.NFSD]: {\r\n        len: 68,\r\n        struct: [...commonStructs[MiiFormats.NFCD],\r\n        {\r\n            name: \"miiId\",\r\n            hex: true,\r\n            len: 128,\r\n            encoder:encoders.switchId\r\n        },\r\n        {\r\n            name: \"checksum\",\r\n            len: 16\r\n        },\r\n        {\r\n            name: \"deviceChecksum\",//If we can find this checksum, we'll remember it, as it's made using data we don't really have access to (the device identifier). The main tool that interacts with NFCD/NFSD files calculates it anyway.\r\n            hex: true,\r\n            len: 16\r\n        }\r\n        ],\r\n        encoder: (buf) => {\r\n            const deviceCrcBytes = buf.subarray(buf.length - 2);//Preserve any device checksum bytes, as without the device ID we can't generate the device checksum ourselves. Realistically it shouldn't matter as the tool used to import these handles checksum calculation anyway.\r\n            buf = buf.subarray(0, buf.length - 4);\r\n            let crc = 0;\r\n            for (let i = 0; i < buf.length; i++) {\r\n                crc ^= buf[i] << 8;\r\n                for (let j = 0; j < 8; j++) {\r\n                    crc = (crc & 0x8000) ? ((crc << 1) ^ 0x1021) : (crc << 1);\r\n                    crc &= 0xFFFF;\r\n                }\r\n            }\r\n            // Little Endian\r\n            crc = ((crc & 0xFF) << 8) | ((crc >>> 8) & 0xFF);\r\n            const plainCrcBytes = Buffer.alloc(2);\r\n            plainCrcBytes.writeUInt16LE(crc, 0);\r\n            return Buffer.concat([buf, plainCrcBytes, deviceCrcBytes]);\r\n        }\r\n\r\n    },\r\n    [MiiFormats.CHARINFO]: {\r\n        len: 88,\r\n        struct: [\r\n            {\r\n                name: \"miiId\",\r\n                hex: true,\r\n                len: 128,\r\n                encoder:encoders.switchId\r\n            },\r\n            {\r\n                name: \"name\",\r\n                text: 'le',\r\n                len: 176\r\n            },\r\n            {\r\n                name: \"charset\",\r\n                len: 8,\r\n                max: 3\r\n            },\r\n            {\r\n                name: \"favoriteColor\",\r\n                len: 8,\r\n                max: 11\r\n            },\r\n            {\r\n                name: \"gender\",\r\n                len: 8,\r\n                max: 1\r\n            },\r\n            {\r\n                name: \"height\",\r\n                len: 8,\r\n                max: 127\r\n            },\r\n            {\r\n                name: \"weight\",\r\n                len: 8,\r\n                max: 127\r\n            },\r\n            {\r\n                name: \"isSpecial\",\r\n                bool: true,\r\n                len: 8,\r\n                max: 1,\r\n                decoder: (bool) => bool ? \"Special\" : \"Default\",\r\n                encoder: (text) => text===\"Special\" ? true:false\r\n            },\r\n            {\r\n                name: \"region\",\r\n                len: 8\r\n            },\r\n            {\r\n                name: \"faceType\",\r\n                len: 8,\r\n                max: 11\r\n            },\r\n            {\r\n                name: \"faceColor\",\r\n                len: 8,\r\n                max: 9\r\n            },\r\n            {\r\n                name: \"faceFeature\",\r\n                len: 8,\r\n                max: 11\r\n            },\r\n            {\r\n                name: \"makeup\",\r\n                len: 8,\r\n                max: 11\r\n            },\r\n            {\r\n                name: \"hairType\",\r\n                len: 8,\r\n                max: 131\r\n            },\r\n            {\r\n                name: \"hairColor\",\r\n                len: 8,\r\n                max: 99\r\n            },\r\n            {\r\n                name: \"hairFlipped\",\r\n                bool: true,\r\n                len: 8,\r\n                max: 1\r\n            },\r\n            {\r\n                name: \"eyeType\",\r\n                len: 8,\r\n                max: 59\r\n            },\r\n            {\r\n                name: \"eyeColor\",\r\n                len: 8,\r\n                max: 99\r\n            },\r\n            {\r\n                name: \"eyeSize\",\r\n                len: 8,\r\n                max: 7\r\n            },\r\n            {\r\n                name: \"eyeSquash\",\r\n                len: 8,\r\n                max: 6\r\n            },\r\n            {\r\n                name: \"eyeRotation\",\r\n                len: 8,\r\n                max: 7\r\n            },\r\n            {\r\n                name: \"eyeDistanceApart\",\r\n                len: 8,\r\n                max: 12\r\n            },\r\n            {\r\n                name: \"eyeYPosition\",\r\n                len: 8,\r\n                max: 18\r\n            },\r\n            {\r\n                name: \"eyebrowType\",\r\n                len: 8,\r\n                max: 23\r\n            },\r\n            {\r\n                name: \"eyebrowColor\",\r\n                len: 8,\r\n                max: 99\r\n            },\r\n            {\r\n                name: \"eyebrowSize\",\r\n                len: 8,\r\n                max: 8\r\n            },\r\n            {\r\n                name: \"eyebrowSquash\",\r\n                len: 8,\r\n                max: 6\r\n            },\r\n            {\r\n                name: \"eyebrowRotation\",\r\n                len: 8,\r\n                max: 11\r\n            },\r\n            {\r\n                name: \"eyebrowDistanceApart\",\r\n                len: 8,\r\n                max: 12\r\n            },\r\n            {\r\n                name: \"eyebrowYPosition\",\r\n                len: 8,\r\n                min: 0,\r\n                max: 18,\r\n                decoder: decoders.eyebrowYPositions,\r\n                encoder: encoders.eyebrowYPositions\r\n            },\r\n            {\r\n                name: \"noseType\",\r\n                len: 8,\r\n                max: 17\r\n            },\r\n            {\r\n                name: \"noseSize\",\r\n                len: 8,\r\n                max: 8\r\n            },\r\n            {\r\n                name: \"noseYPosition\",\r\n                len: 8,\r\n                max: 18\r\n            },\r\n            {\r\n                name: \"mouthType\",\r\n                len: 8,\r\n                max: 35\r\n            },\r\n            {\r\n                name: \"mouthColor\",\r\n                len: 8,\r\n                max: 99\r\n            },\r\n            {\r\n                name: \"mouthSize\",\r\n                len: 8,\r\n                max: 8\r\n            },\r\n            {\r\n                name: \"mouthSquash\",\r\n                len: 8,\r\n                max: 6\r\n            },\r\n            {\r\n                name: \"mouthYPosition\",\r\n                len: 8,\r\n                max: 18\r\n            },\r\n            {\r\n                name: \"beardColor\",\r\n                len: 8,\r\n                max: 99\r\n            },\r\n            {\r\n                name: \"beardType\",\r\n                len: 8,\r\n                max: 5\r\n            },\r\n            {\r\n                name: \"mustacheType\",\r\n                len: 8,\r\n                max: 5\r\n            },\r\n            {\r\n                name: \"mustacheSize\",\r\n                len: 8,\r\n                max: 8\r\n            },\r\n            {\r\n                name: \"mustacheYPosition\",\r\n                len: 8,\r\n                max: 16\r\n            },\r\n            {\r\n                name: \"glassesType\",\r\n                len: 8,\r\n                max: 19\r\n            },\r\n            {\r\n                name: \"glassesColor\",\r\n                len: 8,\r\n                max: 99\r\n            },\r\n            {\r\n                name: \"glassesSize\",\r\n                len: 8,\r\n                max: 7\r\n            },\r\n            {\r\n                name: \"glassesYPosition\",\r\n                len: 8,\r\n                max: 20\r\n            },\r\n            {\r\n                name: \"moleActive\",\r\n                bool: true,\r\n                len: 8,\r\n                max: 1\r\n            },\r\n            {\r\n                name: \"moleSize\",\r\n                len: 8,\r\n                max: 8\r\n            },\r\n            {\r\n                name: \"moleXPosition\",\r\n                len: 8,\r\n                max: 16\r\n            },\r\n            {\r\n                name: \"moleYPosition\",\r\n                len: 8,\r\n                max: 30\r\n            },\r\n            {\r\n                name: \"unknown\",\r\n                len: 8,\r\n                encoder:()=>0\r\n            }\r\n        ]\r\n    },\r\n    //Mii Studio\r\n    [MiiFormats.MNMS]: {\r\n        len: 0x2e,\r\n        struct: [\r\n            {\r\n                name: \"beardColor\",\r\n                len: 8,\r\n                max: 99\r\n            },\r\n            {\r\n                name: \"beardType\",\r\n                len: 8,\r\n                max: 5\r\n            },\r\n            {\r\n                name: \"weight\",\r\n                len: 8,\r\n                max: 127\r\n            },\r\n            {\r\n                name: \"eyeSquash\",\r\n                len: 8,\r\n                max: 6\r\n            },\r\n            {\r\n                name: \"eyeColor\",\r\n                len: 8,\r\n                max: 99\r\n            },\r\n            {\r\n                name: \"eyeRotation\",\r\n                len: 8,\r\n                max: 7\r\n            },\r\n            {\r\n                name: \"eyeSize\",\r\n                len: 8,\r\n                max: 7\r\n            },\r\n            {\r\n                name: \"eyeType\",\r\n                len: 8,\r\n                max: 59\r\n            },\r\n            {\r\n                name: \"eyeDistanceApart\",\r\n                len: 8,\r\n                max: 12\r\n            },\r\n            {\r\n                name: \"eyeYPosition\",\r\n                len: 8,\r\n                max: 18\r\n            },\r\n            {\r\n                name: \"eyebrowSquash\",\r\n                len: 8,\r\n                max: 6\r\n            },\r\n            {\r\n                name: \"eyebrowColor\",\r\n                len: 8,\r\n                max: 99\r\n            },\r\n            {\r\n                name: \"eyebrowRotation\",\r\n                len: 8,\r\n                max: 11\r\n            },\r\n            {\r\n                name: \"eyebrowSize\",\r\n                len: 8,\r\n                max: 8\r\n            },\r\n            {\r\n                name: \"eyebrowType\",\r\n                len: 8,\r\n                max: 23\r\n            },\r\n            {\r\n                name: \"eyebrowDistanceApart\",\r\n                len: 8,\r\n                max: 12\r\n            },\r\n            {\r\n                name: \"eyebrowYPosition\",\r\n                len: 8,\r\n                min: 3,\r\n                max: 18,\r\n                decoder: decoders.eyebrowYPositions,\r\n                encoder: encoders.eyebrowYPositions\r\n            },\r\n            {\r\n                name: \"faceColor\",\r\n                len: 8,\r\n                max: 9\r\n            },\r\n            {\r\n                name: \"makeup\",\r\n                len: 8,\r\n                max: 11\r\n            },\r\n            {\r\n                name: \"faceType\",\r\n                len: 8,\r\n                max: 11\r\n            },\r\n            {\r\n                name: \"faceFeature\",\r\n                len: 8,\r\n                max: 11\r\n            },\r\n            {\r\n                name: \"favoriteColor\",\r\n                len: 8,\r\n                max: 11\r\n            },\r\n            {\r\n                name: \"gender\",\r\n                len: 8,\r\n                max: 1\r\n            },\r\n            {\r\n                name: \"glassesColor\",\r\n                len: 8,\r\n                max: 99\r\n            },\r\n            {\r\n                name: \"glassesSize\",\r\n                len: 8,\r\n                max: 7\r\n            },\r\n            {\r\n                name: \"glassesType\",\r\n                len: 8,\r\n                max: 19\r\n            },\r\n            {\r\n                name: \"glassesYPosition\",\r\n                len: 8,\r\n                max: 20\r\n            },\r\n            {\r\n                name: \"hairColor\",\r\n                len: 8,\r\n                max: 99\r\n            },\r\n            {\r\n                name: \"hairFlipped\",\r\n                bool: true,\r\n                len: 8,\r\n                max: 1\r\n            },\r\n            {\r\n                name: \"hairType\",\r\n                len: 8,\r\n                max: 131\r\n            },\r\n            {\r\n                name: \"height\",\r\n                len: 8,\r\n                max: 127\r\n            },\r\n            {\r\n                name: \"moleSize\",\r\n                len: 8,\r\n                max: 8\r\n            },\r\n            {\r\n                name: \"moleActive\",\r\n                bool: true,\r\n                len: 8,\r\n                max: 1\r\n            },\r\n            {\r\n                name: \"moleXPosition\",\r\n                len: 8,\r\n                max: 16\r\n            },\r\n            {\r\n                name: \"moleYPosition\",\r\n                len: 8,\r\n                max: 30\r\n            },\r\n            {\r\n                name: \"mouthSquash\",\r\n                len: 8,\r\n                max: 6\r\n            },\r\n            {\r\n                name: \"mouthColor\",\r\n                len: 8,\r\n                max: 99\r\n            },\r\n            {\r\n                name: \"mouthSize\",\r\n                len: 8,\r\n                max: 8\r\n            },\r\n            {\r\n                name: \"mouthType\",\r\n                len: 8,\r\n                max: 35\r\n            },\r\n            {\r\n                name: \"mouthYPosition\",\r\n                len: 8,\r\n                max: 18\r\n            },\r\n            {\r\n                name: \"mustacheSize\",\r\n                len: 8,\r\n                max: 8\r\n            },\r\n            {\r\n                name: \"mustacheType\",\r\n                len: 8,\r\n                max: 5\r\n            },\r\n            {\r\n                name: \"mustacheYPosition\",\r\n                len: 8,\r\n                max: 16\r\n            },\r\n            {\r\n                name: \"noseSize\",\r\n                len: 8,\r\n                max: 8\r\n            },\r\n            {\r\n                name: \"noseType\",\r\n                len: 8,\r\n                max: 17\r\n            },\r\n            {\r\n                name: \"noseYPosition\",\r\n                len: 8,\r\n                max: 18\r\n            }\r\n        ]\r\n    },\r\n    [MiiFormats.EMNMS]: {\r\n        len: 0x2f,\r\n        decoder: decryptStudio2,\r\n        encoder: encryptStudio2,\r\n        preEncode: MiiFormats.MNMS\r\n    },\r\n\r\n    //Amiibo\r\n    [MiiFormats.NTAG]: {\r\n        len: 540,\r\n        decoder: (dat) => extractMiiFromAmiibo(dat),\r\n        preEncode: MiiFormats.CFSD,\r\n        //QK, need to receive an Amiibo dump to insert into, encode Mii into CFSD, then insert into the Amiibo dump and return - same for other Amiibo types.\r\n    },\r\n    [MiiFormats.NTAG_ALT]: {\r\n        len: 532,\r\n        decoder: (dat) => extractMiiFromAmiibo(dat),\r\n        preEncode: MiiFormats.CFSD,\r\n    },\r\n    [MiiFormats.NTAG_INTERNAL]: {\r\n        len: 520,\r\n        decoder: (dat) => dat.slice(76, 172),\r\n        preEncode: MiiFormats.CFSD,\r\n    }\r\n};\r\nconst mappings = {\r\n    'gender': \"general.gender\",\r\n    'birthMonth': \"general.birthMonth\",\r\n    'birthday': \"general.birthday\",\r\n    'favoriteColor': \"general.favoriteColor\",\r\n    'height': \"general.height\",\r\n    'weight': \"general.weight\",\r\n\r\n    'mingle': 'perms.mingle',\r\n    'fromCheckMiiOut': 'perms.fromCheckMiiOut',\r\n    'favorited': 'perms.favorited',\r\n    'profaneNames': 'perms.profaneNames',\r\n    'sharing': 'perms.sharing',\r\n    'copying': 'perms.copying',\r\n\r\n    'name': \"meta.name\",\r\n    'isSpecial': 'meta.type',\r\n    'creatorName': \"meta.creatorName\",\r\n    'miiId': 'meta.miiId',\r\n    'systemId': 'meta.systemId',\r\n    'charset': 'meta.charset',\r\n    'region': 'meta.region',\r\n    'originalDevice': 'meta.originalDevice',\r\n\r\n    'miicVersion': 'miic.version',\r\n    'miicOriginPlatform': 'miic.originPlatform',\r\n    'miicAuthorId': 'miic.authorId',\r\n    'miicCreateId': 'miic.createId',\r\n    'miicBirthYear': 'miic.birthYear',\r\n    'miicFacePaintColor': 'miic.facePaintColor',\r\n    'miicHatFavoriteColor': 'miic.hat.favoriteColor',\r\n    'miicHatCommonColor': 'miic.hat.commonColor',\r\n    'miicHatType': 'miic.hat.type',\r\n    'miicBodyType': 'miic.bodyType',\r\n    'miicPantsColor': 'miic.pantsColor',\r\n    'miicPersonality': 'miic.personality',\r\n    'miicRegionMove': 'miic.regionMove',\r\n    'miicShirtColor': 'miic.shirtColor',\r\n    'miicTransferred': 'miic.transferred',\r\n    'miicEyeSclera': 'miic.eyeSclera',\r\n    'miicClothesType': 'miic.clothesType',\r\n    'miicShoesColor': 'miic.shoesColor',\r\n    'miicHatSecondaryColor': 'miic.hat.secondaryColor',\r\n    'miicHatTertiaryColor': 'miic.hat.tertiaryColor',\r\n\r\n    'selectionSlotIndex': 'meta.slotIndex',//I genuinely don't know why these are relevant to the QR code data, but they're present.\r\n    'selectionPageIndex': 'meta.pageIndex',\r\n    'creatorMac': 'meta.creatorMac',\r\n    'deviceChecksum': 'meta.deviceChecksum',\r\n\r\n    'faceType': 'face.type',\r\n    'faceColor': 'face.color',\r\n    'faceFeature': 'face.feature',\r\n    'makeup': 'face.makeup',\r\n\r\n    'hairType': 'hair.type',\r\n    'hairColor': 'hair.color',\r\n    'hairFlipped': 'hair.flipped',\r\n\r\n    'eyebrowType': 'eyebrows.type',\r\n    'eyebrowRotation': 'eyebrows.rotation',\r\n    'eyebrowColor': 'eyebrows.color',\r\n    'eyebrowSize': 'eyebrows.size',\r\n    'eyebrowYPosition': 'eyebrows.yPosition',\r\n    'eyebrowDistanceApart': 'eyebrows.distanceApart',\r\n    'eyebrowSquash': 'eyebrows.squash',\r\n\r\n    'eyeType': 'eyes.type',\r\n    'eyeRotation': 'eyes.rotation',\r\n    'eyeColor': 'eyes.color',\r\n    'eyeSize': 'eyes.size',\r\n    'eyeDistanceApart': 'eyes.distanceApart',\r\n    'eyeSquash': 'eyes.squash',\r\n    'eyeYPosition': 'eyes.yPosition',\r\n\r\n    'noseType': 'nose.type',\r\n    'noseSize': 'nose.size',\r\n    'noseYPosition': 'nose.yPosition',\r\n\r\n    'mouthType': 'mouth.type',\r\n    'mouthSize': 'mouth.size',\r\n    'mouthYPosition': 'mouth.yPosition',\r\n    'mouthSquash': 'mouth.squash',\r\n    'mouthColor': 'mouth.color',\r\n\r\n    'glassesType': 'glasses.type',\r\n    'glassesColor': 'glasses.color',\r\n    'glassesYPosition': 'glasses.yPosition',\r\n    'glassesSize': 'glasses.size',\r\n\r\n    'beardType': 'beard.type',\r\n    'beardColor': 'beard.color',\r\n    'mustacheType': 'beard.mustache.type',\r\n    'mustacheSize': 'beard.mustache.size',\r\n    'mustacheYPosition': 'beard.mustache.yPosition',\r\n\r\n    'moleActive': 'mole.on',\r\n    'moleSize': \"mole.size\",\r\n    'moleYPosition': 'mole.yPosition',\r\n    'moleXPosition': 'mole.xPosition',\r\n\r\n    //Tomodachi Life\r\n    'firstName': 'tl.firstName',\r\n    'lastName': 'tl.lastName',\r\n    'hairDyeMode': 'tl.hairDye.mode',\r\n    'hairDye': 'tl.hairDye.color',\r\n    'catchphrase': 'tl.catchphrase',\r\n    'islandId1': 'tl.island.id.id',\r\n    'islandId2': 'tl.island.id.id',\r\n    'islandId3': 'tl.island.id.id',\r\n    'ocean':'tl.island.id.ocean',\r\n    'isles':'tl.island.id.isles',\r\n    'tlNum1':'tl.island.id.num1',\r\n    'tlNum2':'tl.island.id.num2',\r\n    'authorId': 'tl.island.owner',\r\n    'islanderId': 'tl.miiId',\r\n    'voicePitch': 'tl.voice.pitch',\r\n    'voiceSpeed': 'tl.voice.speed',\r\n    'voiceQuality': 'tl.voice.quality',\r\n    'voiceTone': 'tl.voice.tone',\r\n    'voiceAccent': 'tl.voice.accent',\r\n    'voiceIntonation': 'tl.voice.intonation',\r\n    'personalityMovement': 'tl.personality.movement',\r\n    'personalitySpeech': 'tl.personality.speech',\r\n    'personalityExpressiveness': 'tl.personality.expressiveness',\r\n    'personalityAttitude': 'tl.personality.attitude',\r\n    'personalityOverall': 'tl.personality.overall',\r\n    'islandName': 'tl.island.name',\r\n    'isAdult': 'tl.isAdult',\r\n    'outfitId': 'tl.clothing.outfit',\r\n    'hatId': 'tl.clothing.hat',\r\n    'unknownFlags': 'tl.unknownFlags',\r\n\r\n    //Miitomo\r\n    'allColor': 'miitomo.clothing.color',\r\n    'topsLongColor': 'miitomo.clothing.top.long.color',\r\n    'topsColor': 'miitomo.clothing.top.color',\r\n    'bottomsAColor': 'miitomo.clothing.bottoms.a.color',\r\n    'bottomsBColor': 'miitomo.clothing.bottoms.b.color',\r\n    'shoesColor': 'miitomo.clothing.shoes.color',\r\n    'accessoryColor': 'miitomo.clothing.accessory.color',\r\n    'headwearColor': 'miitomo.clothing.headwear.color',\r\n    'allIndex': 'miitomo.clothing.index',\r\n    'topsLongIndex': 'miitomo.clothing.top.long.index',\r\n    'topsIndex': 'miitomo.clothing.top.index',\r\n    'bottomsAIndex': 'miitomo.clothing.bottoms.a.index',\r\n    'bottomsBIndex': 'miitomo.clothing.bottoms.b.index',\r\n    'shoesIndex': 'miitomo.clothing.shoes.index',\r\n    'accessoryIndex': 'miitomo.clothing.accessory.index',\r\n    'headwearIndex': 'miitomo.clothing.headwear.index',\r\n    'topsState': 'miitomo.clothing.top.state',\r\n    'voiceParam': 'miitomo.voice',\r\n    'characterParam': 'miitomo.character',\r\n    'specialMiiRegion': 'miitomo.specialRegion',\r\n    'birthYear': 'miitomo.birthYear',\r\n    'miitomoInfo': 'miitomo',//Remove once Miitomo is understood better\r\n\r\n    //Miitopia\r\n    'warCry':'mt.warCry'\r\n};\r\n\r\nformats[MiiFormats.CFCD].preProcess=(dat)=>processors.cffcdPreProcess(dat,3);\r\nformats[MiiFormats.CFSD].preProcess=(dat)=>processors.cffcdPreProcess(dat,3);\r\nformats[MiiFormats.CFED].preEncode=MiiFormats.CFSD;\r\nformats[MiiFormats.CFCD].struct[9]={\r\n    name: \"originalDevice\",\r\n    len: 3,\r\n    min: 3,\r\n    max: 3\r\n};\r\nformats[MiiFormats.CFSD].struct[9]={\r\n    name: \"originalDevice\",\r\n    len: 3,\r\n    min: 3,\r\n    max: 3\r\n};\r\n\r\n//These defaults are based off of real observed defaults, [Male Default, Female Default]. Any omitted field defaults to 0.\r\n//Most all of these should never be hit, just things like names for MNMS format, and the extra things like squash for Wii/NDS, but the other non-zero defaults are mapped for generating instructions.\r\nconst defaultMappings = {\r\n    'height': 64,\r\n    'weight': 64,\r\n\r\n    //Copying technically defaults off on console, I default it on because what reason do you have to turn it off, really? \"Oh no my Mii is copyrighted!\"? Especially when working with a library like this where you can just turn it back on, and when the Mii is on console having it off is just a nuisance that's easy but annoying to workaround.\r\n    //So technically an incorrect default value, but \"No offense, but I really don't care\". Super super easy to toggle off again. I'm putting this comment here exclusively for documentation purposes.\r\n    'mingle': true,\r\n    'sharing': true,\r\n    'copying': true,\r\n\r\n    'type': \"Default\",\r\n    'name': \"no name\",\r\n    'originalDevice': 4,//3DS/Wii U set this, Wii/NDS have code written to set this to 1/2 in their post process, so having the Switch (technically and Wii U) as a default is fine and should be what's desired in almost all cases from a default.\r\n    'miicVersion': 4,\r\n    'miicOriginPlatform': 5,\r\n    'miicFacePaintColor': -1,\r\n    'miicHatFavoriteColor': -1,\r\n    'miicHatCommonColor': -1,\r\n    'miicHatType': -1,\r\n    'miicBodyType': -1,\r\n    'miicPantsColor': -1,\r\n    'miicPersonality': -1,\r\n    'miicShirtColor': -1,\r\n    'miicTransferred': false,\r\n    'miicEyeSclera': false,\r\n    'miicClothesType': -1,\r\n    'miicShoesColor': -1,\r\n    'miicHatSecondaryColor': -1,\r\n    'miicHatTertiaryColor': -1,\r\n\r\n    'hairType': [0x21, 0x0C],\r\n    'hairColor': 1,\r\n\r\n    'eyebrowType': [6, 0],\r\n    'eyebrowRotation': 6,\r\n    'eyebrowColor': 1,\r\n    'eyebrowSize': 4,\r\n    'eyebrowYPosition': 7,\r\n    'eyebrowDistanceApart': 2,\r\n    'eyebrowSquash': 3,\r\n\r\n    'eyeType': [2, 4],\r\n    'eyeColor': 8,\r\n    'eyeRotation': [4, 3],\r\n    'eyeSize': 4,\r\n    'eyeDistanceApart': 2,\r\n    'eyeSquash': 3,\r\n    'eyeYPosition': 12,\r\n\r\n    'noseType': 1,\r\n    'noseSize': 4,\r\n    'noseYPosition': 9,\r\n\r\n    'mouthType': 0x17,\r\n    'mouthColor': 19,\r\n    'mouthSize': 4,\r\n    'mouthYPosition': 13,\r\n    'mouthSquash': 3,\r\n\r\n    'glassesYPosition': 10,\r\n    'glassesSize': 4,\r\n    'glassesColor': 8,\r\n\r\n    'mustacheSize': 4,\r\n    'mustacheYPosition': 10,\r\n    'beardColor': 8,\r\n\r\n    'moleSize': 4,\r\n    'moleYPosition': 20,\r\n    'moleXPosition': 2,\r\n\r\n    'firstName': 'no name',\r\n    'lastName': 'no name',\r\n    'islandName': 'no name',\r\n    'outfitId': '0000',\r\n    'hatId': 'FFFF',\r\n    'voicePitch': 50,\r\n    'voiceSpeed': 50,\r\n    'voiceQuality': 50,\r\n    'voiceTone': 50,\r\n    'voiceAccent': 50,\r\n    'personalityMovement': 4,\r\n    'personalitySpeech': 4,\r\n    'personalityExpressiveness': 4,\r\n    'personalityAttitude': 4,\r\n    'personalityOverall': 4,\r\n    'isAdult': true,\r\n    'unknownFlags': '045D3FB91CD3040D3DC07600FEFF0F20FFFF0F'//Donor flags from one of my Miis, I don't know what's in these flags but without them the Mii won't load so here's mine\r\n};\r\n\r\nexport {\r\n    MiiFormats,\r\n    ConsoleFormats,\r\n    formats,\r\n    mappings,\r\n    defaultMappings,\r\n    forwardPort,\r\n    backPort\r\n};\r\n", "/*!\n * is-extglob <https://github.com/jonschlinkert/is-extglob>\n *\n * Copyright (c) 2014-2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\nmodule.exports = function isExtglob(str) {\n  return typeof str === 'string'\n    && /[@?!+*]\\(/.test(str);\n};\n", "/*!\n * is-glob <https://github.com/jonschlinkert/is-glob>\n *\n * Copyright (c) 2014-2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\nvar isExtglob = require('is-extglob');\n\nmodule.exports = function isGlob(str) {\n  return typeof str === 'string'\n    && (/[*!?{}(|)[\\]]/.test(str)\n     || isExtglob(str));\n};", "/*!\n * is-invalid-path <https://github.com/jonschlinkert/is-invalid-path>\n *\n * Copyright (c) 2015, Jon Schlinkert.\n * Licensed under the MIT License.\n */\n\n'use strict';\n\nvar isGlob = require('is-glob');\nvar re = /[\u2018\u201C!#$%&+^<=>`]/;\n\nmodule.exports = function (str) {\n  return (typeof str !== 'string') || isGlob(str) || re.test(str);\n};\n", "/*!\n * is-valid-path <https://github.com/jonschlinkert/is-valid-path>\n *\n * Copyright (c) 2015 Jon Schlinkert, contributors.\n * Licensed under the MIT license.\n */\n\n'use strict';\n\nvar isInvalidPath = require('is-invalid-path');\n\nmodule.exports = function (str) {\n  return isInvalidPath(str) === false;\n};\n", "function miiHeightToMeasurements(value) {\r\n    // h in [0, 127]\r\n    const totalInches = 36 + (48 / 127) * value; // 3' to 7'\r\n    return {\r\n        feet: Math.floor(totalInches / 12),\r\n        inches: Math.round(totalInches % 12),\r\n        totalInches,\r\n\r\n        centimeters: Math.round(totalInches * 2.54)\r\n    };\r\n}\r\nfunction inchesToMiiHeight(totalInches) {\r\n    return ((totalInches - 36) * 127) / 48;\r\n}\r\nfunction centimetersToMiiHeight(totalCentimeters) {\r\n    return ((Math.round(totalCentimeters / 2.54) - 36) * 127) / 48;\r\n}\r\n\r\n// ---- Tunable anchors (BMI breakpoints) ----\r\nconst BMI_MIN = 16;\r\nconst BMI_MID = 22;\r\nconst BMI_MAX = 35;\r\nfunction bmiFromWeightSlider(w) {\r\n    // w in [0, 127]\r\n    if (w <= 64) {\r\n        return BMI_MID - (64 - w) * (BMI_MID - BMI_MIN) / 64;\r\n    } else {\r\n        return BMI_MID + (w - 64) * (BMI_MAX - BMI_MID) / 63;\r\n    }\r\n}\r\nfunction miiWeightToMeasurements(heightInches, miiWeight) {\r\n    /*\r\n    Take the height, map it to a reasonable height 0-127 === 3'-7'.\r\n    Get the average weight for that height.\r\n    Take the slider 0-127 for weight, assume 64 is the average midpoint.\r\n    If less than 64, make the Mii's weight more underweight than the average.\r\n    If higher, make the Mii's weight more overweight than the average.\r\n    The shorter the height, the less drastic the weight changes.\r\n\r\n    This is approximate, not guaranteed accurate nor intended to be taken that way. This is for entertainment value only.\r\n    */\r\n    const H = miiHeightToMeasurements(heightInches).totalInches;\r\n    const BMI = bmiFromWeightSlider(miiWeight);\r\n    return {\r\n        pounds: BMI * (H * H) / 703,\r\n        kilograms: Math.round((BMI * (H * H) / 703) * 0.4535924)\r\n    };\r\n}\r\nfunction imperialHeightWeightToMiiWeight(heightInches, weightLbs) {\r\n    const H = miiHeightToMeasurements(heightInches).totalInches;\r\n    const BMI = weightLbs * 703 / (H * H);\r\n\r\n    if (BMI <= BMI_MID) {\r\n        return 64 - 64 * (BMI_MID - BMI) / (BMI_MID - BMI_MIN);\r\n    }\r\n    else {\r\n        return 64 + 63 * (BMI - BMI_MID) / (BMI_MAX - BMI_MID);\r\n    }\r\n}\r\nfunction metricHeightWeightToMiiWeight(heightCentimeters, weightKilograms) {\r\n    const heightInches = Math.round(heightCentimeters / 2.54);\r\n    const weightLbs = Math.round(weightKilograms / 0.4535924);\r\n    const H = miiHeightToMeasurements(heightInches).totalInches;\r\n    const BMI = weightLbs * 703 / (H * H);\r\n\r\n    if (BMI <= BMI_MID) {\r\n        return 64 - 64 * (BMI_MID - BMI) / (BMI_MID - BMI_MIN);\r\n    }\r\n    else {\r\n        return 64 + 63 * (BMI - BMI_MID) / (BMI_MAX - BMI_MID);\r\n    }\r\n}\r\nexport {\r\n    miiHeightToMeasurements,\r\n    inchesToMiiHeight,\r\n    centimetersToMiiHeight,\r\n\r\n    miiWeightToMeasurements,\r\n    imperialHeightWeightToMiiWeight,\r\n    metricHeightWeightToMiiWeight\r\n};", "import { decodeMii } from \"./miiProcess.js\";\r\nimport { ConsoleFormats, backPort, defaultMappings, mappings } from \"./formats.js\";\r\nimport { lookupTables } from \"./data.js\";\r\n\r\nconst ignoredInstructionDefaults = [\"gender\"];//Always return these in the instructions even when they're default\r\n\r\nconst gridColumn = type => (type.startsWith(\"SWITCH\") ? [0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3] : [0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]);\nconst gridRow = type => type.startsWith(\"SWITCH\") ? [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2] : [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3];\nconst defaultRowNames = [\"first\", \"second\", \"third\", \"fourth\"];\n\r\nfunction getLoc(table, val) {\n    for (let y = 0; y < table.length; y++) {\r\n        for (let x = 0; x < table[y].length; x++) {\r\n            if (table[y][x] === val) {\r\n                return [x, y];\r\n            }\r\n        }\r\n    }\r\n    return [-1, -1];\n}\nfunction getFlatGridLoc(table, val, grid = lookupTables.instrGrids.threeBy) {\n    const index = table.indexOf(val);\n    return index === -1 ? [-1, -1] : getLoc(grid, index);\n}\nfunction getNestedValue(obj, path) {\n    try {\r\n        const parts = path.split('.');\r\n        let current = obj;\r\n        for (const part of parts) {\r\n            if (current === undefined || current === null) {\r\n                return undefined;\r\n            }\r\n            current = current[part];\r\n        }\r\n        return current;\r\n    }\r\n    catch (e) {\r\n        return null;\r\n    }\r\n}\r\n\r\nfunction setNestedValue(obj, key, value) {\r\n    try {\r\n        const keys = key.split('.');\r\n        const lastKey = keys.pop();\r\n\r\n        const target = keys.reduce((current, key) => {\r\n            if (!current[key] || typeof current[key] !== 'object' || Array.isArray(current[key])) {\r\n                current[key] = {};\r\n            }\r\n            return current[key];\r\n        }, obj);\r\n\r\n        target[lastKey] = value;\r\n        return obj;\r\n    }\r\n    catch (e) {\r\n        throw new Error(`${key} was not usable.`);\r\n    }\r\n}\r\nfunction deleteNestedValue(obj, path) {\r\n    const parts = path.split(\".\");\r\n    let current = obj;\r\n\r\n    for (let i = 0; i < parts.length - 1; i++) {\r\n        if (current == null) return; // parent chain missing\r\n        if (!current.hasOwnProperty(parts[i])) return;\r\n        current = current[parts[i]];\r\n    }\r\n\r\n    delete current[parts[parts.length - 1]];\r\n}\r\n\r\nfunction defaultsEqual(a, b) {\r\n    if (Array.isArray(a) && Array.isArray(b)) {\r\n        if (a.length !== b.length) return false;\r\n        for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;\r\n        return true;\r\n    }\r\n    return a === b;\r\n}\r\nfunction getDefaultFor(key, currentVal) {\r\n    if (defaultMappings.hasOwnProperty(key)) return defaultMappings[key];\r\n    // Fallback defaults to 0/false when undefined in defaultMappings\r\n    if (typeof currentVal === \"boolean\") return false;\r\n    return 0;\r\n}\r\n\r\n// Helper function to format grid position strings from array\r\nconst formatGridPos = (arr) => {\n    if (!Array.isArray(arr) || arr.some(value => !Number.isFinite(Number(value)) || Number(value) < 0)) {\n        return \"closest available option\";\n    }\n\n    if (arr.length === 3 && arr[0] !== undefined) {\n        // [page, x, y]\n        return `on page ${arr[0] + 1}, ${arr[1] + 1} from the left, ${arr[2] + 1} from the top`;\n    } else if (arr.length === 2) {\n        return `${arr[0] + 1} from the left, ${arr[1] + 1} from the top`;\n    } else if (arr.length === 1) {\n        // [y] or [x]\r\n        return `${arr[0] + 1} from the top`;\r\n    }\r\n    return \"\";\r\n};\r\n\r\n// Helper for color positions with expanded menu notation\r\nconst formatColorPos = (arr) => {\r\n    const hasExpanded = arr.length === 3 && arr[2] === 1;\r\n    const base = hasExpanded ? formatGridPos([arr[0], arr[1]]) : formatGridPos(arr);\r\n    return hasExpanded ? `${base}, in the expanded colors menu` : base;\r\n};\r\n\r\n// Special formatter for face.color and similar that use row encoding\r\nconst formatRowPos = (arr, rowNames = defaultRowNames) => {\n    if (!Array.isArray(arr) || arr.some(value => typeof value !== \"string\" && (!Number.isFinite(Number(value)) || Number(value) < 0))) {\n        return \"closest available option\";\n    }\n\n    if (arr.length === 2) {\n        const rowName = typeof arr[1] === \"string\" ? arr[1] : rowNames[arr[1]];\n        if (!rowName) return formatGridPos(arr);\n\n        return rowName === \"first\" || rowName === \"top\"\n            ? `${arr[0] + 1} from the left`\n            : `${arr[0] + 1} from the left, on the ${rowName} row`;\n    }\n    return formatGridPos(arr);\n};\n\nconst faceColorRowNames = type => type === ConsoleFormats.WIIU ? [\"top\", \"middle\", \"bottom\"] : [\"first\", \"second\"];\n\r\n// Helper function to reverse getLoc - finds the index that produces the given [x, y] coordinates\r\nfunction reverseGetLoc(grid, x, y) {\r\n    for (var i = 0; i < grid.length; i++) {\r\n        var loc = getLoc(grid, i);\r\n        if (loc[0] === x && loc[1] === y) {\r\n            return i;\r\n        }\r\n    }\r\n    return null; // Not found\r\n}\r\n\r\n// Helper function to reverse grid lookup for face properties\r\nfunction reverseGridLookup(colGrid, rowGrid, x, row) {\r\n    for (var i = 0; i < colGrid.length; i++) {\r\n        if (colGrid[i] === x && rowGrid[i] === row) {\r\n            return i;\r\n        }\r\n    }\r\n    return null; // Not found\r\n}\r\n\r\nfunction getAs(mii, type, field) {\r\n    if(mappings.hasOwnProperty(field)){\r\n        field=mappings[field];\r\n    }\r\n    switch (field) {\r\n        // Face\r\n        case \"face.color\":\r\n            switch (type) {\r\n                case ConsoleFormats.WII:\n                    return mii.face.color > 2\n                        ? [mii.face.color - 3, 1] // [x, row] where row: 0=first, 1=second\n                        : [mii.face.color, 0];\n                case ConsoleFormats.DS:\r\n                case ConsoleFormats[\"3DS\"]:\r\n                    return [mii.face.color]; // [y]\r\n                case ConsoleFormats.WIIU:\r\n                    return [\r\n                        [0, 1, 0, 1, 0, 1][mii.face.color],\r\n                        [0, 0, 1, 1, 2, 2][mii.face.color] // 0=top, 1=middle, 2=bottom\r\n                    ];\r\n                case ConsoleFormats.SWITCH:\n                case ConsoleFormats.SWITCH2:\n                    var fc = lookupTables.switch.faceColors[mii.face.color];\n                    return fc > 4\n                        ? [fc - 5, 1] // [x, row]\n                        : [fc, 0];\n            }\r\n        case \"face.type\":\r\n            return [gridColumn(type)[mii.face.type], gridRow(type)[mii.face.type]]; // [x, row]\r\n        case \"face.makeup\":\r\n            return [gridColumn(type)[mii.face.makeup], gridRow(type)[mii.face.makeup]]; // [x, row]\r\n        case \"face.feature\":\r\n            return [gridColumn(type)[mii.face.feature], gridRow(type)[mii.face.feature]]; // [x, row]\r\n\r\n        // Hair\r\n        case \"hair.type\":\r\n            switch (type) {\r\n                case ConsoleFormats.DS:\r\n                case ConsoleFormats.WII:\r\n                    var page = getLoc(lookupTables.pages.hair.wii, mii.hair.type);\r\n                    var gridLoc = getLoc(lookupTables.instrGrids.threeBy, page[0]);\r\n                    return [page[1], gridLoc[0], gridLoc[1]]; // [page, x, y]\r\n                case ConsoleFormats[\"3DS\"]:\r\n                case ConsoleFormats.WIIU:\r\n                    var page = getLoc(lookupTables.pages.hair[\"3ds\"], mii.hair.type);\r\n                    var gridLoc = getLoc(lookupTables.instrGrids.threeBy, page[0]);\r\n                    return [page[1], gridLoc[0], gridLoc[1]]; // [page, x, y]\r\n                case ConsoleFormats.SWITCH:\r\n                case ConsoleFormats.SWITCH2:\r\n                    return [\r\n                        getLoc(lookupTables.grids.hairs, mii.hair.type)[0],\r\n                        getLoc(lookupTables.grids.hairs, mii.hair.type)[1]\r\n                    ]; // [x, y]\r\n            }\r\n        case \"hair.color\":\r\n            if (type.endsWith(\"DS\")) {\r\n                return [mii.hair.color]; // [y]\r\n            }\r\n            var grid = type.startsWith(\"SWITCH\") ? lookupTables.grids.colors\r\n                : type === \"WII\" ? lookupTables.instrGrids.fourBy\r\n                    : lookupTables.instrGrids.twoBy;\r\n            var loc = getLoc(grid, mii.hair.color);\r\n            return type.startsWith(\"SWITCH\")\r\n                ? [loc[0], loc[1], 1] // [x, y, expanded] where 1=expanded menu\r\n                : [loc[0], loc[1]]; // [x, y]\r\n\r\n        // Eyes\r\n        case \"eyes.type\":\r\n            if (type.startsWith(\"SWITCH\")) {\r\n                return [\r\n                    getLoc(lookupTables.grids.eyes, mii.eyes.type)[0],\r\n                    getLoc(lookupTables.grids.eyes, mii.eyes.type)[1]\r\n                ]; // [x, y]\r\n            }\r\n            var page = getLoc(lookupTables.pages.eyes, mii.eyes.type);\r\n            var gridLoc = getLoc(lookupTables.instrGrids.threeBy, page[0]);\r\n            return [page[1], gridLoc[0], gridLoc[1]]; // [page, x, y]\r\n        case \"eyes.color\":\r\n            if (type.endsWith(\"DS\")) {\r\n                return [mii.eyes.color]; // [y]\r\n            }\r\n            var grid = type.startsWith(\"SWITCH\") ? lookupTables.grids.colors\r\n                : type === \"WII\" ? lookupTables.instrGrids.threeBy\r\n                    : lookupTables.instrGrids.twoBy;\r\n            var loc = getLoc(grid, mii.eyes.color);\r\n            return type.startsWith(\"SWITCH\")\r\n                ? [loc[0], loc[1], 1] // [x, y, expanded]\r\n                : [loc[0], loc[1]]; // [x, y]\r\n\r\n        // Eyebrows\r\n        case \"eyebrows.type\":\r\n            if (type.startsWith(\"SWITCH\")) {\r\n                return [\r\n                    getLoc(lookupTables.grids.eyebrows, mii.eyebrows.type)[0],\r\n                    getLoc(lookupTables.grids.eyebrows, mii.eyebrows.type)[1]\r\n                ]; // [x, y]\r\n            }\r\n            var page = getLoc(lookupTables.pages.eyebrows, mii.eyebrows.type);\r\n            var gridLoc = getLoc(lookupTables.instrGrids.threeBy, page[0]);\r\n            return [page[1], gridLoc[0], gridLoc[1]]; // [page, x, y]\r\n        case \"eyebrows.color\":\r\n            if (type.endsWith(\"DS\")) {\r\n                return [mii.eyebrows.color]; // [y]\r\n            }\r\n            var grid = type.startsWith(\"SWITCH\") ? lookupTables.grids.colors\r\n                : type === \"WII\" ? lookupTables.instrGrids.fourBy\r\n                    : lookupTables.instrGrids.twoBy;\r\n            var loc = getLoc(grid, mii.eyebrows.color);\r\n            return type.startsWith(\"SWITCH\")\r\n                ? [loc[0], loc[1], 1] // [x, y, expanded]\r\n                : [loc[0], loc[1]]; // [x, y]\r\n\r\n        // Nose\r\n        case \"nose.type\":\r\n            switch (type) {\r\n                case ConsoleFormats.DS:\n                case ConsoleFormats.WII:\n                    return getFlatGridLoc(lookupTables.pages.noses[0], mii.nose.type); // [x, y]\n                case ConsoleFormats[\"3DS\"]:\r\n                case ConsoleFormats.WIIU:\r\n                    var page = getLoc(lookupTables.pages.noses, mii.nose.type);\r\n                    var gridLoc = getLoc(lookupTables.instrGrids.threeBy, page[0]);\r\n                    return [page[1], gridLoc[0], gridLoc[1]]; // [page, x, y]\r\n                case ConsoleFormats.SWITCH:\r\n                case ConsoleFormats.SWITCH2:\r\n                    return [\r\n                        getLoc(lookupTables.grids.noses, mii.nose.type)[0],\r\n                        getLoc(lookupTables.grids.noses, mii.nose.type)[1]\r\n                    ]; // [x, y]\r\n            }\r\n\r\n        // Mouth\r\n        case \"mouth.type\":\r\n            if (type.startsWith(\"SWITCH\")) {\r\n                return [\r\n                    getLoc(lookupTables.grids.mouths, mii.mouth.type)[0],\r\n                    getLoc(lookupTables.grids.mouths, mii.mouth.type)[1]\r\n                ]; // [x, y]\r\n            }\r\n            var page = getLoc(lookupTables.pages.mouths, mii.mouth.type);\r\n            var gridLoc = getLoc(lookupTables.instrGrids.threeBy, page[0]);\r\n            return [page[1], gridLoc[0], gridLoc[1]]; // [page, x, y]\r\n        case \"mouth.color\":\r\n            if (type.endsWith(ConsoleFormats.DS) || type === ConsoleFormats.WII) {\r\n                return type === ConsoleFormats.WII ? [mii.mouth.color] : [mii.mouth.color]; // [x] or [y]\r\n            }\r\n            var grid = type.startsWith(\"SWITCH\") ? lookupTables.grids.colors : lookupTables.instrGrids.twoBy;\r\n            var loc = getLoc(grid, mii.mouth.color);\r\n            return type.startsWith(\"SWITCH\")\r\n                ? [loc[0], loc[1], 1] // [x, y, expanded]\r\n                : [loc[0], loc[1]]; // [x, y]\r\n\r\n        // Beard\r\n        case \"beard.mustache.type\":\r\n            var loc = getLoc(type.startsWith(\"SWITCH\") ? lookupTables.instrGrids.threeBy : lookupTables.instrGrids.twoBy, mii.beard.mustache.type);\r\n            return [loc[0], loc[1]]; // [x, y]\r\n        case \"beard.type\":\r\n            var loc = getLoc(type.startsWith(\"SWITCH\") ? lookupTables.instrGrids.threeBy : lookupTables.instrGrids.twoBy, mii.beard.type);\r\n            return [loc[0], loc[1]]; // [x, y]\r\n        case \"beard.color\":\r\n            if (type.endsWith(\"DS\")) {\r\n                return [mii.beard.color]; // [y]\r\n            }\r\n            var grid = type.startsWith(\"SWITCH\") ? lookupTables.grids.colors\r\n                : type === \"WII\" ? lookupTables.instrGrids.fourBy\r\n                    : lookupTables.instrGrids.twoBy;\r\n            var loc = getLoc(grid, mii.beard.color);\r\n            return type.startsWith(\"SWITCH\")\r\n                ? [loc[0], loc[1], 1] // [x, y, expanded]\r\n                : [loc[0], loc[1]]; // [x, y]\r\n\r\n        // Glasses\r\n        case \"glasses.type\":\r\n            var loc = getLoc(type.startsWith(\"SWITCH\") ? lookupTables.grids.glasses : lookupTables.instrGrids.threeBy, mii.glasses.type);\r\n            return [loc[0], loc[1]]; // [x, y]\r\n        case \"glasses.color\":\r\n            if (type.endsWith(\"DS\")) {\r\n                return [mii.glasses.color]; // [y]\r\n            }\r\n            var grid = type.startsWith(\"SWITCH\") ? lookupTables.grids.colors\r\n                : type === \"WII\" ? lookupTables.instrGrids.threeBy\r\n                    : lookupTables.instrGrids.twoBy;\r\n            var loc = getLoc(grid, mii.glasses.color);\r\n            return type.startsWith(\"SWITCH\")\r\n                ? [loc[0], loc[1], 1] // [x, y, expanded]\r\n                : [loc[0], loc[1]]; // [x, y]\r\n    }\r\n    return null;\r\n}\r\nfunction setAs(mii, type, field, value) {\r\n    if(mappings.hasOwnProperty(field)){\r\n        field=mappings[field];\r\n    }\r\n    \r\n    switch (field) {\r\n        // Face\r\n        case \"face.color\":\r\n            switch (type) {\r\n                case ConsoleFormats.WII:\n                    // value = [x, row] where row: 0=first, 1=second\n                    mii.face.color = value[1] === 1 ? value[0] + 3 : value[0];\n                    break;\r\n                case ConsoleFormats.DS:\r\n                case ConsoleFormats[\"3DS\"]:\r\n                    // value = [y]\r\n                    mii.face.color = value[0];\r\n                    break;\r\n                case ConsoleFormats.WIIU:\r\n                    // value = [x, y] where y: 0=top, 1=middle, 2=bottom\r\n                    // Reverse mapping: [0,0]->0, [1,0]->1, [0,1]->2, [1,1]->3, [0,2]->4, [1,2]->5\r\n                    mii.face.color = value[1] * 2 + value[0];\r\n                    break;\r\n                case ConsoleFormats.SWITCH:\r\n                case ConsoleFormats.SWITCH2:\r\n                    // value = [x, row]\n                    var fc = value[1] === 1 ? value[0] + 5 : value[0];\n                    // Reverse lookup in switch.faceColors\r\n                    mii.face.color = lookupTables.switch.faceColors.indexOf(fc);\r\n                    break;\r\n            }\r\n            break;\r\n            \r\n        case \"face.type\":\r\n            // value = [x, row]\r\n            mii.face.type = reverseGridLookup(gridColumn(type), gridRow(type), value[0], value[1]);\r\n            break;\r\n            \r\n        case \"face.makeup\":\r\n            // value = [x, row]\r\n            mii.face.makeup = reverseGridLookup(gridColumn(type), gridRow(type), value[0], value[1]);\r\n            break;\r\n            \r\n        case \"face.feature\":\r\n            // value = [x, row]\r\n            mii.face.feature = reverseGridLookup(gridColumn(type), gridRow(type), value[0], value[1]);\r\n            break;\r\n\r\n        // Hair\r\n        case \"hair.type\":\r\n            switch (type) {\r\n                case ConsoleFormats.DS:\r\n                case ConsoleFormats.WII:\r\n                    // value = [page, x, y]\r\n                    var gridIndex = reverseGetLoc(lookupTables.instrGrids.threeBy, value[1], value[2]);\r\n                    mii.hair.type = reverseGetLoc(lookupTables.pages.hair.wii, gridIndex, value[0]);\r\n                    break;\r\n                case ConsoleFormats[\"3DS\"]:\r\n                case ConsoleFormats.WIIU:\r\n                    // value = [page, x, y]\r\n                    var gridIndex = reverseGetLoc(lookupTables.instrGrids.threeBy, value[1], value[2]);\r\n                    mii.hair.type = reverseGetLoc(lookupTables.pages.hair[\"3ds\"], gridIndex, value[0]);\r\n                    break;\r\n                case ConsoleFormats.SWITCH:\r\n                case ConsoleFormats.SWITCH2:\r\n                    // value = [x, y]\r\n                    mii.hair.type = reverseGetLoc(lookupTables.grids.hairs, value[0], value[1]);\r\n                    break;\r\n            }\r\n            break;\r\n            \r\n        case \"hair.color\":\r\n            if (type.endsWith(\"DS\")) {\r\n                // value = [y]\r\n                mii.hair.color = value[0];\r\n            } else if (type.startsWith(\"SWITCH\")) {\r\n                // value = [x, y, expanded]\r\n                mii.hair.color = reverseGetLoc(lookupTables.grids.colors, value[0], value[1]);\r\n            } else {\r\n                // value = [x, y]\r\n                var grid = type === \"WII\" ? lookupTables.instrGrids.fourBy : lookupTables.instrGrids.twoBy;\r\n                mii.hair.color = reverseGetLoc(grid, value[0], value[1]);\r\n            }\r\n            break;\r\n\r\n        // Eyes\r\n        case \"eyes.type\":\r\n            if (type.startsWith(\"SWITCH\")) {\r\n                // value = [x, y]\r\n                mii.eyes.type = reverseGetLoc(lookupTables.grids.eyes, value[0], value[1]);\r\n            } else {\r\n                // value = [page, x, y]\r\n                var gridIndex = reverseGetLoc(lookupTables.instrGrids.threeBy, value[1], value[2]);\r\n                mii.eyes.type = reverseGetLoc(lookupTables.pages.eyes, gridIndex, value[0]);\r\n            }\r\n            break;\r\n            \r\n        case \"eyes.color\":\r\n            if (type.endsWith(\"DS\")) {\r\n                // value = [y]\r\n                mii.eyes.color = value[0];\r\n            } else if (type.startsWith(\"SWITCH\")) {\r\n                // value = [x, y, expanded]\r\n                mii.eyes.color = reverseGetLoc(lookupTables.grids.colors, value[0], value[1]);\r\n            } else {\r\n                // value = [x, y]\r\n                var grid = type === \"WII\" ? lookupTables.instrGrids.threeBy : lookupTables.instrGrids.twoBy;\r\n                mii.eyes.color = reverseGetLoc(grid, value[0], value[1]);\r\n            }\r\n            break;\r\n\r\n        // Eyebrows\r\n        case \"eyebrows.type\":\r\n            if (type.startsWith(\"SWITCH\")) {\r\n                // value = [x, y]\r\n                mii.eyebrows.type = reverseGetLoc(lookupTables.grids.eyebrows, value[0], value[1]);\r\n            } else {\r\n                // value = [page, x, y]\r\n                var gridIndex = reverseGetLoc(lookupTables.instrGrids.threeBy, value[1], value[2]);\r\n                mii.eyebrows.type = reverseGetLoc(lookupTables.pages.eyebrows, gridIndex, value[0]);\r\n            }\r\n            break;\r\n            \r\n        case \"eyebrows.color\":\r\n            if (type.endsWith(\"DS\")) {\r\n                // value = [y]\r\n                mii.eyebrows.color = value[0];\r\n            } else if (type.startsWith(\"SWITCH\")) {\r\n                // value = [x, y, expanded]\r\n                mii.eyebrows.color = reverseGetLoc(lookupTables.grids.colors, value[0], value[1]);\r\n            } else {\r\n                // value = [x, y]\r\n                var grid = type === \"WII\" ? lookupTables.instrGrids.fourBy : lookupTables.instrGrids.twoBy;\r\n                mii.eyebrows.color = reverseGetLoc(grid, value[0], value[1]);\r\n            }\r\n            break;\r\n\r\n        // Nose\r\n        case \"nose.type\":\r\n            switch (type) {\r\n                case ConsoleFormats.DS:\n                case ConsoleFormats.WII:\n                    // value = [x, y]\n                    var gridIndex = reverseGetLoc(lookupTables.instrGrids.threeBy, value[0], value[1]);\n                    mii.nose.type = gridIndex === null ? null : lookupTables.pages.noses[0][gridIndex];\n                    break;\n                case ConsoleFormats[\"3DS\"]:\r\n                case ConsoleFormats.WIIU:\r\n                    // value = [page, x, y]\r\n                    var gridIndex = reverseGetLoc(lookupTables.instrGrids.threeBy, value[1], value[2]);\r\n                    mii.nose.type = reverseGetLoc(lookupTables.pages.noses, gridIndex, value[0]);\r\n                    break;\r\n                case ConsoleFormats.SWITCH:\r\n                case ConsoleFormats.SWITCH2:\r\n                    // value = [x, y]\r\n                    mii.nose.type = reverseGetLoc(lookupTables.grids.noses, value[0], value[1]);\r\n                    break;\r\n            }\r\n            break;\r\n\r\n        // Mouth\r\n        case \"mouth.type\":\r\n            if (type.startsWith(\"SWITCH\")) {\r\n                // value = [x, y]\r\n                mii.mouth.type = reverseGetLoc(lookupTables.grids.mouths, value[0], value[1]);\r\n            } else {\r\n                // value = [page, x, y]\r\n                var gridIndex = reverseGetLoc(lookupTables.instrGrids.threeBy, value[1], value[2]);\r\n                mii.mouth.type = reverseGetLoc(lookupTables.pages.mouths, gridIndex, value[0]);\r\n            }\r\n            break;\r\n            \r\n        case \"mouth.color\":\r\n            if (type.endsWith(\"DS\") || type === \"WII\") {\r\n                // value = [x] or [y]\r\n                mii.mouth.color = value[0];\r\n            } else if (type.startsWith(\"SWITCH\")) {\r\n                // value = [x, y, expanded]\r\n                mii.mouth.color = reverseGetLoc(lookupTables.grids.colors, value[0], value[1]);\r\n            } else {\r\n                // value = [x, y]\r\n                mii.mouth.color = reverseGetLoc(lookupTables.instrGrids.twoBy, value[0], value[1]);\r\n            }\r\n            break;\r\n\r\n        // Beard\r\n        case \"beard.mustache.type\":\r\n            // value = [x, y]\r\n            var grid = type.startsWith(\"SWITCH\") ? lookupTables.instrGrids.threeBy : lookupTables.instrGrids.twoBy;\r\n            mii.beard.mustache.type = reverseGetLoc(grid, value[0], value[1]);\r\n            break;\r\n            \r\n        case \"beard.type\":\r\n            // value = [x, y]\r\n            var grid = type.startsWith(\"SWITCH\") ? lookupTables.instrGrids.threeBy : lookupTables.instrGrids.twoBy;\r\n            mii.beard.type = reverseGetLoc(grid, value[0], value[1]);\r\n            break;\r\n            \r\n        case \"beard.color\":\r\n            if (type.endsWith(\"DS\")) {\r\n                // value = [y]\r\n                mii.beard.color = value[0];\r\n            } else if (type.startsWith(\"SWITCH\")) {\r\n                // value = [x, y, expanded]\r\n                mii.beard.color = reverseGetLoc(lookupTables.grids.colors, value[0], value[1]);\r\n            } else {\r\n                // value = [x, y]\r\n                var grid = type === \"WII\" ? lookupTables.instrGrids.fourBy : lookupTables.instrGrids.twoBy;\r\n                mii.beard.color = reverseGetLoc(grid, value[0], value[1]);\r\n            }\r\n            break;\r\n\r\n        // Glasses\r\n        case \"glasses.type\":\r\n            // value = [x, y]\r\n            var grid = type.startsWith(\"SWITCH\") ? lookupTables.grids.glasses : lookupTables.instrGrids.threeBy;\r\n            mii.glasses.type = reverseGetLoc(grid, value[0], value[1]);\r\n            break;\r\n            \r\n        case \"glasses.color\":\r\n            if (type.endsWith(\"DS\")) {\r\n                // value = [y]\r\n                mii.glasses.color = value[0];\r\n            } else if (type.startsWith(\"SWITCH\")) {\r\n                // value = [x, y, expanded]\r\n                mii.glasses.color = reverseGetLoc(lookupTables.grids.colors, value[0], value[1]);\r\n            } else {\r\n                // value = [x, y]\r\n                var grid = type === \"WII\" ? lookupTables.instrGrids.threeBy : lookupTables.instrGrids.twoBy;\r\n                mii.glasses.color = reverseGetLoc(grid, value[0], value[1]);\r\n            }\r\n            break;\r\n    }\r\n    \r\n    return mii;\r\n}\r\n\r\n//Build instructions from the input, and the default.\r\nfunction buildInstructions(mii, type) {\r\n    return {\r\n        \"meta\": {\r\n            \"name\": `Set the name to \"${mii.meta.name}\".`,\r\n            \"creatorName\": `The name of this Mii's creator was set to \"${mii.meta.creatorName != undefined ? mii.meta.creatorName : ''}\".`\r\n        },\r\n        \"general\": {\r\n            \"gender\": `Set the ${type === \"SWITCH2\" ? \"style\" : \"gender\"} to \"${mii.general.gender == 0 ? \"Male\" : \"Female\"}\".`,\r\n            \"birthMonth\": `Set the birth month to ${mii.general.birthMonth != undefined ? mii.general.birthMonth : 0}.`,\r\n            \"birthday\": `Set the birthday to ${mii.general.birthday != undefined ? mii.general.birthday : 0}.`,\r\n            \"favoriteColor\": `Set the favorite color to ${lookupTables.favoriteColors[mii.general.favoriteColor].toLowerCase()}.`,\r\n            \"height\": `Set the height to ${Math.round((mii.general.height / 127) * 100)}%.`,\r\n            \"weight\": `Set the weight to ${Math.round((mii.general.weight / 127) * 100)}%.`\r\n        },\r\n        \"face\": {\r\n            \"color\": `Set the face/skin color to the one ${formatRowPos(getAs(mii, type, \"face.color\"), faceColorRowNames(type))}.`,\n            \"type\": `Set the face type to the one ${formatRowPos(getAs(mii, type, \"face.type\"))}.`,\r\n            \"makeup\": `Set the makeup to the one ${formatRowPos(getAs(mii, type, \"face.makeup\"))}.`,\r\n            \"feature\": `Set the facial features/wrinkles to the one ${formatRowPos(getAs(mii, type, \"face.feature\"))}.`\r\n        },\r\n        \"hair\": {\r\n            \"type\": `Set the hair style to the one ${formatGridPos(getAs(mii, type, \"hair.type\"))}.`,\r\n            \"flipped\": mii.hair.flipped ? `Press the ${type === \"SWITCH2\" ? \"Y \" : \"\"}button to flip the hair.` : ``,\r\n            \"color\": `Set the hair color to the one ${formatColorPos(getAs(mii, type, \"hair.color\"))}.`\r\n        },\r\n        \"eyes\": {\r\n            \"type\": `Set the eyes to the one ${formatGridPos(getAs(mii, type, \"eyes.type\"))}.`,\r\n            \"color\": `Set the eye color to the one ${formatColorPos(getAs(mii, type, \"eyes.color\"))}.`,\r\n            \"size\": `Make the eyes ${mii.eyes.size < 4 ? `${4 - mii.eyes.size} smaller` : `${mii.eyes.size - 4} larger`}.`,\r\n            \"squash\": `${mii.eyes.squash < 3 ? `S` : `Uns`}quash the eyes ${mii.eyes.squash < 3 ? 3 - mii.eyes.squash : mii.eyes.squash - 3} ${type.startsWith(\"SWITCH\") ? `to the ${mii.eyes.squash < 3 ? \"left\" : \"right\"}` : `times`}.`,\r\n            \"rotation\": `Rotate the outer edge of the eyes all the way down, then rotate it ${mii.eyes.rotation} ticks back up.`,\r\n            \"distanceApart\": `Move the eyes ${mii.eyes.distanceApart < 2 ? `${2 - mii.eyes.distanceApart} closer` : `${mii.eyes.distanceApart - 2} further apart`}.`,\r\n            \"yPosition\": `Move the eyes ${mii.eyes.yPosition < 12 ? `${12 - mii.eyes.yPosition} ticks up.` : `${mii.eyes.yPosition - 12} ticks down.`}`\r\n        },\r\n        \"eyebrows\": {\r\n            \"type\": `Set the eyebrows to the one ${formatGridPos(getAs(mii, type, \"eyebrows.type\"))}.`,\r\n            \"color\": `Set the eyebrows color to the one ${formatColorPos(getAs(mii, type, \"eyebrows.color\"))}.`,\r\n            \"size\": `Make the eyebrows ${mii.eyebrows.size < 4 ? `${4 - mii.eyebrows.size} smaller` : `${mii.eyebrows.size - 4} larger`}.`,\r\n            \"squash\": `${mii.eyebrows.squash < 3 ? `S` : `Uns`}quash the eyebrows ${mii.eyebrows.squash < 3 ? 3 - mii.eyebrows.squash : mii.eyebrows.squash - 3} ${type.startsWith(\"SWITCH\") ? `to the ${mii.eyebrows.squash < 3 ? \"left\" : \"right\"}` : `times`}.`,\r\n            \"rotation\": `Rotate the outer edge of the eyebrows ${mii.eyebrows.rotation < 6 ? 6 - mii.eyebrows.rotation : mii.eyebrows.rotation - 6} ticks ${mii.eyebrows.rotation < 6 ? \"down\" : \"up\"}.`,\r\n            \"distanceApart\": `Move the eyebrows ${mii.eyebrows.distanceApart < 2 ? `${2 - mii.eyebrows.distanceApart} closer` : `${mii.eyebrows.distanceApart - 2} further apart`}.`,\r\n            \"yPosition\": `Move the eyebrows ${mii.eyebrows.yPosition < 7 ? `${7 - mii.eyebrows.yPosition} ticks up.` : `${mii.eyebrows.yPosition - 7} ticks down.`}`\r\n        },\r\n        \"nose\": {\r\n            \"type\": `Set the nose to the one ${formatGridPos(getAs(mii, type, \"nose.type\"))}.`,\r\n            \"size\": `Make the nose ${mii.nose.size < 4 ? `${4 - mii.nose.size} smaller` : `${mii.nose.size - 4} larger.`}`,\r\n            \"yPosition\": `Move the nose ${mii.nose.yPosition < 9 ? `${9 - mii.nose.yPosition} ticks up.` : `${mii.nose.yPosition - 9} ticks down.`}`\r\n        },\r\n        \"mouth\": {\r\n            \"type\": `Set the mouth to the one ${formatGridPos(getAs(mii, type, \"mouth.type\"))}.`,\r\n            \"color\": `Set the mouth color to the one ${formatColorPos(getAs(mii, type, \"mouth.color\"))}.`,\r\n            \"size\": `Make the mouth ${mii.mouth.size < 4 ? `${4 - mii.mouth.size} smaller` : `${mii.mouth.size - 4} larger.`}`,\r\n            \"squash\": `${mii.mouth.squash < 3 ? `S` : `Uns`}quash the mouth ${mii.mouth.squash < 3 ? 3 - mii.mouth.squash : mii.mouth.squash - 3} ${type === \"SWITCH\" ? `to the ${mii.mouth.squash < 3 ? \"left\" : \"right\"}` : `times`}.`,\r\n            \"yPosition\": `Move the mouth ${mii.mouth.yPosition < 13 ? `${13 - mii.mouth.yPosition} ticks up.` : `${mii.mouth.yPosition - 13} ticks down.`}`\r\n        },\r\n        \"beard\": {\r\n            \"mustache\": {\r\n                \"type\": `Set the mustache type to the one ${formatGridPos(getAs(mii, type, \"beard.mustache.type\"))}.`,\r\n                \"size\": `Make the mustache ${mii.beard.mustache.size < 4 ? `${4 - mii.beard.mustache.size} smaller` : `${mii.beard.mustache.size - 4} larger.`}`,\r\n                \"yPosition\": `Move the mustache ${mii.beard.mustache.yPosition < 10 ? `${10 - mii.beard.mustache.yPosition} ticks up.` : `${mii.beard.mustache.yPosition - 10} ticks down.`}`\r\n            },\r\n            \"type\": `Set the beard type to the one ${formatGridPos(getAs(mii, type, \"beard.type\"))}.`,\r\n            \"color\": `Set the beard color to the one ${formatColorPos(getAs(mii, type, \"beard.color\"))}.`\r\n        },\r\n        \"glasses\": {\r\n            \"type\": `Set the glasses type to the one ${formatGridPos(getAs(mii, type, \"glasses.type\"))}.`,\r\n            \"color\": `Set the glasses color to the one ${formatColorPos(getAs(mii, type, \"glasses.color\"))}.`,\r\n            \"size\": `Make the glasses ${mii.glasses.size < 4 ? `${4 - mii.glasses.size} smaller` : `${mii.glasses.size - 4} larger.`}`,\r\n            \"yPosition\": `Move the glasses ${mii.glasses.yPosition < 10 ? `${10 - mii.glasses.yPosition} ticks up.` : `${mii.glasses.yPosition - 10} ticks down.`}`\r\n        },\r\n        \"mole\": {\r\n            \"on\": `Turn the mole ${mii.mole.on ? \"on\" : \"off\"}.`,\r\n            \"size\": `Make the mole ${mii.mole.size < 4 ? `${4 - mii.mole.size} smaller` : `${mii.mole.size - 4} larger.`}`,\r\n            \"xPosition\": `Move the mole ${mii.mole.xPosition < 2 ? `${2 - mii.mole.xPosition} ticks to the left.` : `${mii.mole.xPosition - 2} ticks to the right.`}`,\r\n            \"yPosition\": `Move the mole ${mii.mole.yPosition < 20 ? `${20 - mii.mole.yPosition} ticks up.` : `${mii.mole.yPosition - 20} ticks down.`}`\r\n        }\r\n    };\r\n}\r\n\r\n//This is the entry function that returns the instructions\r\nfunction makeInstructions(mii, type = \"SWITCH\") {\r\n    type = type.toUpperCase().replaceAll(\" \", \"\");\r\n    if (!ConsoleFormats.hasOwnProperty(type)) {\n        throw new Error(`${type} is not a valid type, expected one of ${Object.keys(ConsoleFormats).join(\", \")}.`);\n    }\n    mii = decodeMii(mii);\n    if (mii && typeof mii.then === \"function\") {\n        return mii.then(decoded => makeInstructions(decoded, type));\n    }\n\n    if (type !== \"SWITCH\") {\n        mii = backPort(mii, type);\r\n    }\r\n\r\n    Object.keys(mappings).forEach(def=>{\r\n        if(getNestedValue(mii,mappings[def])==undefined){\r\n            if(defaultMappings.hasOwnProperty(def)){\r\n                setNestedValue(mii,mappings[def],defaultMappings[def]);\r\n            }\r\n            else{\r\n                setNestedValue(mii,mappings[def],0);\r\n            }\r\n        }\r\n    });\r\n\r\n    var instrs = buildInstructions(mii, type);\r\n    Object.keys(mappings).forEach(key => {\r\n        const val = getNestedValue(mii, mappings[key]);\r\n        const def = getDefaultFor(key, val);\r\n\r\n        if (val === undefined || val === null || (defaultsEqual(val, def) && !ignoredInstructionDefaults.includes(key))) {\r\n            deleteNestedValue(instrs, mappings[key]);\r\n        }\r\n    });\r\n\r\n\r\n\r\n    return instrs;\r\n}\r\n\r\nexport {\r\n    makeInstructions,\r\n\r\n    getAs,\r\n    setAs\r\n}\n", "import {childGenTables,backTables} from \"./data.js\";\r\nimport {decodeMii} from \"./miiProcess.js\";\r\n\r\nfunction getParentPermission(parent, permission) {\r\n    return parent?.perms?.[permission] ?? true;\r\n}\r\n\r\nasync function kidomatic(mii,hairGroupIndex=-1){\r\n    if(mii.fields){\r\n        mii=await mii.toJSON();\r\n    }\r\n    mii=await decodeMii(mii);\r\n\r\n    //Child Miis generate the last stage, then build offsets backwards through the younger stages of life starting at the older stages\r\n    var eyeBase = Math.min(Math.max(mii.eyes.yPosition + 2, 0), 18);\r\n    let browBase = mii.eyebrows.yPosition + 2;\r\n    if (browBase > 15) {\r\n        browBase = 15;\r\n    }\r\n    else if (browBase < 0) {\r\n        browBase = 0;\r\n    }\r\n\r\n    var mouthBase = Math.min(Math.max(mii.mouth.yPosition - 2, 0), 18);\r\n\r\n    var eyeYDelta = mii.eyes.yPosition - eyeBase;\r\n    var browYDelta = mii.eyebrows.yPosition - browBase;\r\n    var mouthYDelta = mii.mouth.yPosition - mouthBase;\r\n\r\n    //Now we take the baselines above and translate them into the younger years\r\n    mii.stages = [];\r\n    for (var iStage = 0; iStage < 6; iStage++) {\r\n        mii.stages.push(structuredClone(mii));\r\n\r\n        mii.stages[iStage].eyes.yPosition=Math.floor((eyeYDelta * iStage)/5) + eyeBase;\r\n        mii.stages[iStage].eyebrows.yPosition=Math.floor((browYDelta * iStage)/5) + browBase;\r\n        mii.stages[iStage].mouth.yPosition=Math.floor((mouthYDelta * iStage)/5) + mouthBase;\r\n        mii.stages[iStage].nose.size=Math.floor((mii.nose.size * iStage)/5);\r\n\r\n        if(iStage<4){\r\n            mii.stages[iStage].face.type=9;//Extra technically, I'm fairly certain this still happens just in a different part than I directly researched\r\n            mii.stages[iStage].eyebrows.color=7;\r\n        }\r\n        if(iStage<5||hairGroupIndex!=-1){\r\n            //Clear beards and wrinkles\r\n            mii.stages[iStage].beard.type=0;\r\n            mii.stages[iStage].beard.mustache.type=0;\r\n            mii.stages[iStage].face.feature=0;\r\n            //For parity with the original, though I wouldn't be averse to making this a toggle to allow child Miis to generate with these\r\n            mii.stages[iStage].face.makeup=0;\r\n            mii.stages[iStage].glasses.type=0;\r\n            mii.stages[iStage].hair.flipped=false;\r\n        }\r\n\r\n        mii.stages[iStage].general.height=Math.floor((mii.stages[iStage].general.height/5)*iStage);//Extra, Tomodachi Life just uses alternate models and therefore no official height growth is in-game yet one is displayed, so I mocked up a basic growing up height. Newborn will always be the shortest, stage 5 will always be the actual height, and the values in between are just a range in between. We don't do the same for weight since Mii weights appear to be more of a representative of underweight or overweight for the height.\r\n\r\n        delete mii.stages[iStage].stages;//Because we're just cloning the baseline object repeatedly to make the stages a little bit cleaner, we need to clear this on subsequent clones\r\n    }\r\n\r\n    var foundAgeGroup=-1;\r\n    if(hairGroupIndex<0||hairGroupIndex>9){//This selection code is for kidomatic'ing Miis that pre-exist, not for the baby generation flow.\r\n        var foundHairIndexes=[];\r\n        var foundAgeGroups=[];\r\n        var foundHair=false;\r\n        for(let iAgeGroup=3;iAgeGroup>=1&&!foundHair;iAgeGroup--){\r\n            for(let iHairGroup=mii.general.gender===0?0:4;iHairGroup<=(mii.general.gender===0?3:9);iHairGroup++){\r\n                if(childGenTables.hairStyleGroups[iHairGroup][iAgeGroup].includes(mii.hair.type)){\r\n                    foundHairIndexes.push(iHairGroup);\r\n                    foundAgeGroups.push(iAgeGroup);\r\n                    foundHair=true;\r\n                }\r\n            }\r\n        }\r\n\r\n        if(foundHairIndexes.length>0){\r\n            let rand=Math.floor(Math.random()*foundHairIndexes.length);\r\n            hairGroupIndex=foundHairIndexes[rand];\r\n            foundAgeGroup=foundAgeGroups[rand];\r\n        }\r\n        else{\r\n            hairGroupIndex=childGenTables.hairStyleGroupMappings[mii.hair.type][mii.general.gender];\r\n            foundAgeGroup=-2;\r\n        }\r\n    }\r\n\r\n    //Basically there's a random chance for a hairstyle to not advance throughout the years, so it's possible to end up with a hairstyle from a younger stage. This is slightly more likely for boys than girls.\r\n    let ageGroup = 0;\r\n    for (let iHairStage = 0; iHairStage < 4; iHairStage++) {\r\n        if(iHairStage==3&&foundAgeGroup!=-1) break;//If it's not -1, then it's for kidomatic'ing a pre-existing Mii and not from the baby Mii creation flow, therefore the last hair style needs to remain what the Mii already has.\r\n        const subgroup = childGenTables.hairStyleGroups[hairGroupIndex][ageGroup];\r\n        const hairType = subgroup[Math.floor(Math.random() * subgroup.length)];\r\n        switch(iHairStage){\r\n            case 0:\r\n                mii.stages[0].hair.type = hairType;\r\n            break;\r\n            case 1:\r\n                mii.stages[1].hair.type = hairType;\r\n                mii.stages[2].hair.type = hairType;\r\n            break;\r\n            case 2:\r\n                mii.stages[3].hair.type = hairType;\r\n                mii.stages[4].hair.type = hairType;\r\n            break;\r\n            case 3:\r\n                mii.stages[5].hair.type = hairType;\r\n            break;\r\n        }\r\n        if (iHairStage === 0 || Math.floor(Math.random() * (mii.stages[0].general.gender === 0 ? 3 : 4)) !== 0) {//For each stage of life there is a 33% chance for boys, and a 25% chance for girls, of staying on the same hairstyle as they had already. However, they are guaranteed to never have the same hairstyle stage as their newborn stage.\r\n            ageGroup = Math.min(ageGroup + 1, foundAgeGroup<0?3:foundAgeGroup);\r\n        }\r\n    }\r\n\r\n    return mii.stages;\r\n}\r\n\r\nasync function makeMiiChild(parentA, parentB, options) {\r\n    let parent0,parent1;\r\n    if(parentA.fields){\r\n        parent0=await parentA.toJSON();\r\n    }\r\n    else{\r\n        parent0=parentA;\r\n    }\r\n    if(parentB.fields){\r\n        parent1=await parentB.toJSON();\r\n    }\r\n    else{\r\n        parent1=parentB;\r\n    }\r\n    parent0=await decodeMii(parent0);\r\n    parent1=await decodeMii(parent1);\r\n\r\n    if(parent0.general.gender!==0){\r\n        let tempHolder=structuredClone(parent0);\r\n        parent0=structuredClone(parent1);\r\n        parent1=structuredClone(tempHolder);\r\n    }\r\n\r\n    var randomBools = [];\r\n    for (var i = 0; i < 8; i++) {\r\n        //randomBools[1] is never used, kept here purely for an interesting detail from research\r\n        randomBools.push(Math.floor(Math.random()*2));\r\n    }\r\n\r\n    var mainParent = randomBools[0] === 1 ? parent1 : parent0;\r\n    var child = structuredClone(mainParent);//We have to clear some defaults doing it this way, but so much of the Mii gen is from this parent it's just cleaner to gen this way.\r\n\r\n    //These aren't technically TL sourced but I think this is more fun/functional and doesn't change output really\r\n    child.meta.type=(parent0.meta?.type===\"Special\"||parent1.meta?.type===\"Special\")?\"Special\":\"Default\";\r\n    if(!child.perms) child.perms={};\r\n    child.perms.sharing=getParentPermission(parent0,\"sharing\")&&getParentPermission(parent1,\"sharing\");\r\n    child.perms.copying=getParentPermission(parent0,\"copying\")&&getParentPermission(parent1,\"copying\");\r\n\r\n\r\n    var birthday=new Date();\r\n    child.general.birthday=birthday.getDate();\r\n    child.general.birthMonth=birthday.getMonth()+1;\r\n    child.meta.creatorName=options?.hasOwnProperty(\"creatorName\")?options.creatorName:\"\";\r\n\r\n    var gender = options?.hasOwnProperty(\"gender\") ? options.gender : Math.floor(Math.random() * 2);\r\n    child.general.gender = gender;\r\n    child.meta.name = options?.hasOwnProperty(\"name\")? options.name : childGenTables.names[child.general.gender][Math.floor(Math.random() * childGenTables.names[child.general.gender].length)];\r\n\r\n    var matchingParent = parent0.general.gender === gender ? parent0 : parent1;\r\n\r\n    //Skin color mixing. Intuitively you'd think they'd order them by similarity and pick an average, but no they have an entire table of what skin colors product what child skin color\r\n\r\n    //Backport Switch skin colors to 3DS version, just since it's table based and not an average, I'd have to extend the table to support the Switch skin colors.\r\n    //I will probably extend the table eventually, but that's not a tangent I have time for right now. The Switch colors are not too different than the 3DS ones, so I don't think this is too lossy, and with an extended table I imagine it'd be similar or identical output.\r\n    const parent0SkinCol=backTables.switch.faceColors[parent0.face.color];\r\n    const parent1SkinCol=backTables.switch.faceColors[parent1.face.color];\r\n\r\n    var validValues = childGenTables.skinColorMixing[Math.min(parent0SkinCol, parent1SkinCol)][Math.max(parent0SkinCol, parent1SkinCol)].filter(v => v !== -1);\r\n    child.face.color = validValues[Math.floor(Math.random() * validValues.length)];\r\n\r\n    //Each child is sorted into groups of potential hairstyles based on the hairstyle of the parent of the same gender of the child, and then a random hair is selected from that pool at each stage of life\r\n    var hairGroupIndex = childGenTables.hairStyleGroupMappings[matchingParent.hair.type][gender];\r\n    child.hair.color = randomBools[2] === 0 ? parent0.hair.color : parent1.hair.color;\r\n    child.eyebrows.color = child.hair.color;\r\n\r\n    child.face.type=matchingParent.face.type;\r\n\r\n    child.eyes.type = randomBools[3] === 0 ? parent0.eyes.type : parent1.eyes.type;\r\n    child.eyes.color = randomBools[4] === 0 ? parent0.eyes.color : parent1.eyes.color;\r\n\r\n    child.eyebrows.type = matchingParent.eyebrows.type;\r\n\r\n    child.nose.type = randomBools[5] === 0 ? parent0.nose.type : parent1.nose.type;\r\n\r\n    child.mouth.type = randomBools[6] === 0 ? parent0.mouth.type : parent1.mouth.type;\r\n    child.mouth.color = randomBools[7] === 0 ? parent0.mouth.color : parent1.mouth.color;\r\n\r\n    child.mole.on = Math.floor(Math.random() * 2) === 0 ? parent0.mole.on : parent1.mole.on;\r\n\r\n    //This should be a 1:1 of final stage height and weight generation\r\n    var heightParent = Math.floor(Math.random() * 2) === 0 ? parent0 : parent1;\r\n    var height = (heightParent.general.height >> 3) * 1.4;\r\n    height *= 1.4 * 1.4;\r\n    height *= 1.4 * 1.4;\r\n    child.general.height = Math.round(Math.min(Math.max(height, 0), 127));\r\n\r\n    var weightParent = Math.floor(Math.random() * 2) === 0 ? parent0 : parent1;\r\n    let weight = Math.trunc((weightParent.general.weight + 1) / 4) + 48;\r\n    for (var iAdj = 0; iAdj < 5; iAdj++) {\r\n        weight += (weight - 64.0) * 0.2;\r\n    }\r\n    child.general.weight = Math.round(Math.min(Math.max(weight, 0), 127));\r\n\r\n    child.general.favoriteColor=options?.favoriteColor?options.favoriteColor:(child.general.gender==0?[2,3,5,6]:[0,1,7,8])[Math.floor(Math.random()*4)];//We're not running personality generation here, so we're just making a random color of the personality groups the child had available so as to add some variety to the colors\r\n\r\n    const childStages=await kidomatic(child,hairGroupIndex);\r\n    return childStages;\r\n}\r\nexport {\r\n    kidomatic,\r\n    makeMiiChild\r\n}\r\n", "import * as miiFormats from \"./formats.js\";\nimport * as miiProcess from \"./miiProcess.js\";\n\nimport * as qrTools from \"./qrTools.js\";\n\nimport {lookupTables} from \"./data.js\";\n\nimport util from \"util\";\nimport isValidPath from \"is-valid-path\";\nimport {fs} from \"./platform.js\";\n\nexport * from \"./formats.js\";\nexport * from \"./miiProcess.js\";\nexport * from \"./qrTools.js\";\n\nconst { encodeMii, decodeMii, detectMiiFormat } = miiProcess;\nconst { mappings, MiiFormats, ConsoleFormats } = miiFormats;\nconst { makeQR, scanQR } = qrTools;\n\nconst optionalModulePromises = {};\nfunction loadOptionalModule(name, importer) {\n    optionalModulePromises[name] ??= importer();\n    return optionalModulePromises[name];\n}\n\nconst loadAmiiboHandler = () => loadOptionalModule(\"amiiboHandler\", () => import(\"./amiiboHandler.js\"));\nconst loadMeasureConversion = () => loadOptionalModule(\"miiMeasureConversion\", () => import(\"./miiMeasureConversion.js\"));\nconst loadRendering = () => loadOptionalModule(\"miiRendering\", () => import(\"./miiRendering.js\"));\nconst loadCrypto = () => loadOptionalModule(\"miiCrypto\", () => import(\"./miiCrypto.js\"));\nconst loadInstructions = () => loadOptionalModule(\"miiInstructions\", () => import(\"./miiInstructions.js\"));\nconst loadBabies = () => loadOptionalModule(\"miiBabies\", () => import(\"./miiBabies.js\"));\n\nasync function callOptionalModule(loader, exportName, args) {\n    const mod = await loader();\n    return mod[exportName](...args);\n}\n\nfunction isPromiseLike(value) {\n    return value && typeof value.then === \"function\";\n}\n\nfunction isSupportedBuffer(input) {\n    return Buffer.isBuffer(input)\n        || input instanceof Uint8Array\n        || input instanceof ArrayBuffer\n        || (typeof SharedArrayBuffer !== \"undefined\" && input instanceof SharedArrayBuffer);\n}\n\nasync function insertMiiIntoAmiibo(...args) {\n    return callOptionalModule(loadAmiiboHandler, \"insertMiiIntoAmiibo\", args);\n}\n\nasync function extractMiiFromAmiibo(...args) {\n    return callOptionalModule(loadAmiiboHandler, \"extractMiiFromAmiibo\", args);\n}\n\nasync function miiHeightToMeasurements(...args) {\n    return callOptionalModule(loadMeasureConversion, \"miiHeightToMeasurements\", args);\n}\n\nasync function inchesToMiiHeight(...args) {\n    return callOptionalModule(loadMeasureConversion, \"inchesToMiiHeight\", args);\n}\n\nasync function centimetersToMiiHeight(...args) {\n    return callOptionalModule(loadMeasureConversion, \"centimetersToMiiHeight\", args);\n}\n\nasync function miiWeightToMeasurements(...args) {\n    return callOptionalModule(loadMeasureConversion, \"miiWeightToMeasurements\", args);\n}\n\nasync function imperialHeightWeightToMiiWeight(...args) {\n    return callOptionalModule(loadMeasureConversion, \"imperialHeightWeightToMiiWeight\", args);\n}\n\nasync function metricHeightWeightToMiiWeight(...args) {\n    return callOptionalModule(loadMeasureConversion, \"metricHeightWeightToMiiWeight\", args);\n}\n\nasync function renderMii(...args) {\n    return callOptionalModule(loadRendering, \"renderMii\", args);\n}\n\nasync function decryptMii(...args) {\n    return callOptionalModule(loadCrypto, \"decryptMii\", args);\n}\n\nasync function encryptMii(...args) {\n    return callOptionalModule(loadCrypto, \"encryptMii\", args);\n}\n\nasync function miiCrcCalc(...args) {\n    return callOptionalModule(loadCrypto, \"miiCrcCalc\", args);\n}\n\nasync function makeInstructions(...args) {\n    return callOptionalModule(loadInstructions, \"makeInstructions\", args);\n}\n\nasync function getAs(...args) {\n    return callOptionalModule(loadInstructions, \"getAs\", args);\n}\n\nasync function setAs(...args) {\n    return callOptionalModule(loadInstructions, \"setAs\", args);\n}\n\nasync function kidomatic(...args) {\n    return callOptionalModule(loadBabies, \"kidomatic\", args);\n}\n\nasync function makeMiiChild(...args) {\n    return callOptionalModule(loadBabies, \"makeMiiChild\", args);\n}\n\nconst FFLExpression = Object.freeze({\n    NORMAL: 0,\n    SMILE: 1,\n    ANGER: 2,\n    SORROW: 3,\n    PUZZLED: 3,\n    SURPRISE: 4,\n    SURPRISED: 4,\n    BLINK: 5,\n    OPEN_MOUTH: 6,\n    SMILE_OPEN_MOUTH: 7,\n    HAPPY: 7,\n    ANGER_OPEN_MOUTH: 8,\n    SORROW_OPEN_MOUTH: 9,\n    SURPRISE_OPEN_MOUTH: 10,\n    BLINK_OPEN_MOUTH: 11,\n    WINK_LEFT: 12,\n    WINK_RIGHT: 13,\n    WINK_LEFT_OPEN_MOUTH: 14,\n    WINK_RIGHT_OPEN_MOUTH: 15,\n    LIKE_WINK_LEFT: 16,\n    LIKE: 16,\n    LIKE_WINK_RIGHT: 17,\n    FRUSTRATED: 18,\n    BORED: 19,\n    BORED_OPEN_MOUTH: 20,\n    SIGH_MOUTH_STRAIGHT: 21,\n    SIGH: 22,\n    DISGUSTED_MOUTH_STRAIGHT: 23,\n    DISGUSTED: 24,\n    LOVE: 25,\n    LOVE_OPEN_MOUTH: 26,\n    DETERMINED_MOUTH_STRAIGHT: 27,\n    DETERMINED: 28,\n    CRY_MOUTH_STRAIGHT: 29,\n    CRY: 30,\n    BIG_SMILE_MOUTH_STRAIGHT: 31,\n    BIG_SMILE: 32,\n    CHEEKY: 33,\n    CHEEKY_DUPLICATE: 34,\n    JOJO_EYES_FUNNY_MOUTH: 35,\n    JOJO_EYES_FUNNY_MOUTH_OPEN: 36,\n    SMUG: 37,\n    SMUG_OPEN_MOUTH: 38,\n    RESOLVE: 39,\n    RESOLVE_OPEN_MOUTH: 40,\n    UNBELIEVABLE: 41,\n    UNBELIEVABLE_DUPLICATE: 42,\n    CUNNING: 43,\n    CUNNING_DUPLICATE: 44,\n    RASPBERRY: 45,\n    RASPBERRY_DUPLICATE: 46,\n    INNOCENT: 47,\n    INNOCENT_DUPLICATE: 48,\n    CAT: 49,\n    CAT_DUPLICATE: 50,\n    DOG: 51,\n    DOG_DUPLICATE: 52,\n    TASTY: 53,\n    TASTY_DUPLICATE: 54,\n    MONEY_MOUTH_STRAIGHT: 55,\n    MONEY: 56,\n    SPIRAL_MOUTH_STRAIGHT: 57,\n    CONFUSED: 58,\n    CHEERFUL_MOUTH_STRAIGHT: 59,\n    CHEERFUL: 60,\n    BLANK_61: 61,\n    BLANK_62: 62,\n    GRUMBLE_MOUTH_STRAIGHT: 63,\n    GRUMBLE: 64,\n    MOVED_MOUTH_STRAIGHT: 65,\n    MOVED: 66,\n    SINGING_MOUTH_SMALL: 67,\n    SINGING: 68,\n    STUNNED: 69,\n    MAX: 70\n});\n\n// Types\n/** @typedef {import(\"./mii-jsdoc.js\").Mii} MiiData */\n/** @typedef {import(\"./miiProcess.js\").SupportedBuffers} SupportedBuffers */\n/** @typedef {typeof MiiFormats[keyof typeof MiiFormats]} MiiFormat */\n/** @typedef {typeof ConsoleFormats[keyof typeof ConsoleFormats]} ConsoleFormat */\n\n\nfunction deleteNestedValue(obj, path) {\n    const parts = path.split(\".\");\n    let current = obj;\n\n    for (let i = 0; i < parts.length - 1; i++) {\n        if (current == null) return; // parent chain missing\n        if (!current.hasOwnProperty(parts[i])) return;\n        current = current[parts[i]];\n    }\n\n    delete current[parts[parts.length - 1]];\n}\nfunction getNestedValue(obj, path) {\n    try {\n        const parts = path.split('.');\n        let current = obj;\n        for (const part of parts) {\n            if (current === undefined || current === null) {\n                return undefined;\n            }\n            current = current[part];\n        }\n        return current;\n    }\n    catch (e) {\n        return null;\n    }\n}\nfunction getKeyByValue(object, value) {\n    for (var key in object) {\n        if (object[key] === value) {\n            return key;\n        }\n    }\n    return null;\n}\nfunction setNestedValue(obj, key, value) {\n    try {\n        const keys = key.split('.');\n        const lastKey = keys.pop();\n\n        const target = keys.reduce((current, key) => {\n            if (!current[key] || typeof current[key] !== 'object' || Array.isArray(current[key])) {\n                current[key] = {};\n            }\n            return current[key];\n        }, obj);\n\n        target[lastKey] = value;\n        return obj;\n    }\n    catch (e) {\n        throw new Error(`${key} was not usable.`);\n    }\n}\nfunction isValidURL(url){\n    try{\n        new URL(url);\n        return true;\n    }\n    catch(e){\n        return false;\n    }\n}\n\n/** \n * The MiiJS mii object - designed to easily manipulate mii data and export into most any mii formats.\n * @example\n * const mii = await Mii.create(\"path/to/mii.bin\"); // Create a Mii instance from a file\n * mii.fields.name = \"RickAstley\"; // Change the mii's name\n */\nclass Mii {\n    /** @type {MiiData} */\n    fields\n\n    /** \n     * Constructor for internal use only\n     * @private\n     * @internal\n     */\n    constructor(decodedMii) {\n        if(typeof decodedMii===\"object\"&&decodedMii?.meta?.hasOwnProperty(\"favoriteColor\")){\n            this.fields = decodedMii;\n        }\n        else{\n            const decoded = decodeMii(decodedMii);\n            if (isPromiseLike(decoded)) {\n                throw new Error(\"This Mii format needs optional async decoding. Use await Mii.create(input) instead of new Mii(input).\");\n            }\n            this.fields=decoded;\n        }\n    }\n\n    /**\n     * Return mii from most data types\n     * @async\n     * @param {*} inputData - The input data to be decoded into a Mii. This can be a path to a file, a Buffer, a URL, or a hex string.\n     * @returns {Promise<Mii>} A promise that resolves to a new Mii instance with the decoded data assigned.\n     */\n    static async create(input,debug) {\n        if(typeof input===\"string\"){\n            if(isValidPath(input)&&fs.existsSync(input)){\n                input=await fs.promises.readFile(input);\n            }\n            else if(isValidURL(input)){\n                input=await fetch(input);\n                input=await input.buffer();\n            }\n        }\n\n        // Accept QR images even when uploaded files have no extension (e.g. multer temp files).\n        // We detect by magic bytes/content and scan the QR before decodeMii().\n        try{\n            const formats = detectMiiFormat(input);\n            if (formats.includes(\"png\") || formats.includes(\"jpg\") || formats.includes(\"webp\")) {\n                const scanned = await scanQR(input);\n                if (!scanned) {\n                    throw new Error(\"Detected an image QR format (PNG/JPG/WEBP), but couldn't decode the QR code!\");\n                }\n                input = scanned;\n            }\n        }\n        catch(e){\n            // If format probing fails, let decodeMii handle and produce the canonical error.\n        }\n\n        const mii = await decodeMii(input,debug);\n        return new Mii(mii);\n    }\n\n    /** \n     * Function for automatic conversion when used in fs.writeFileSync and similar\n     * @private\n     */\n    [Symbol.toPrimitive](hint) {\n        if (hint === \"string\") return this.toString();\n        return this.toBuffer();\n    }\n\n    /** \n     * Function for automatic conversion when used in console.log and similar\n     * @private\n     */\n    [util.inspect.custom]() {\n        return this.toString();\n    }\n\n    /** \n     * Called when functions need to convert this class to a string.\n     * Not intended for user use.\n     * @private\n     * @param {MiiFormat} format - The format to encode the Mii as\n     */\n    toString(format = MiiFormats.MNMS) {//I would normally just JSON.stringify() here, but we have to have the async loop for toBuffer anyway, might as well make toString more usable as Studio codes (the standard string for Miis at this point)\n        if (!MiiFormats.hasOwnProperty(format) && getKeyByValue(MiiFormats, format) === null) {\n            throw new Error(`Unexpected format: ${format}. Expected one of: ${Object.keys(MiiFormats).join(\", \")}`);\n        }\n        let studioMii = encodeMii(this.fields, format);\n        if (isPromiseLike(studioMii)) {\n            throw new Error(\"This format needs optional async encoding. Use await mii.encode(format) instead of mii.toString(format).\");\n        }\n        return studioMii.toString('hex');\n    }\n\n    /** \n     * Alias for .encode for when node attempts to convert this class to a Buffer\n     * @private\n     * @param {MiiFormat} format - The format to encode the Mii as\n     */\n    toBuffer(format = MiiFormats.CHARINFO) {\n        return this.encode(format);\n    }\n\n    /** Convert mii to JSON for easier viewing */\n    toJSON() {\n        return structuredClone(this.fields);\n    }\n\n    /**\n     * Helper function to set fields.\n     * @deprecated prefer setting fields directly.\n     * @example\n     *  Mii.set({meta:{name:\"RickAstley\"}}) // Set a sub field with json\n     *  Mii.set(\"name\",\"RickAstley\"); // Set a field directly\n     *  Mii.set(\"field\",null); // Delete a field\n     */\n    set(objOrPath, value) {\n        if (objOrPath && typeof objOrPath === \"object\") {\n            Object.assign(this.fields, objOrPath);\n        }\n        else if (typeof objOrPath === \"string\" && value !== undefined) {//value can be null, but not undefined. Undefined!==null, Undefined==null.\n            if (mappings.hasOwnProperty(objOrPath)) {\n                objOrPath = mappings[objOrPath];\n            }\n            else if (getKeyByValue(mappings, objOrPath) === null) {\n                return this.fields;\n            }\n            if (value === null) {\n                deleteNestedValue(this.fields, objOrPath);\n            }\n            else {\n                this.fields = setNestedValue(this.fields, objOrPath, value)\n            }\n        }\n        return this.fields;\n    }\n\n    /** \n     * @deprecated prefer getting fields directly.\n     */\n    get(path) {\n        if (mappings.hasOwnProperty(path)) {\n            path = mappings[path];\n        }\n        return getNestedValue(this.fields, path);//This already handles path not existing so doing it here is redundant\n    }\n\n    /** \n     * Set with validation\n     * @param {ConsoleFormat} device - The console format to validate against\n     */\n    async setAs(device = ConsoleFormats.SWITCH, path, value) {\n        if (!ConsoleFormats.hasOwnProperty(device) && !getKeyByValue(ConsoleFormats, device)) {\n            throw new Error(`Invalid console type ${device}! Expected one of ${Object.keys(ConsoleFormats).join(\", \")}.`);\n        }\n        this.fields = await setAs(this.fields, device, path, value);//Validation of path is handled here\n        return this.fields;\n    }\n\n    /** \n     * Get field with validation\n     * @param {ConsoleFormat} device - The console format to validate against\n     */\n    async getAs(device = ConsoleFormats.SWITCH, path) {\n        if (!ConsoleFormats.hasOwnProperty(device) && !getKeyByValue(ConsoleFormats, device)) {\n            throw new Error(`Invalid console type ${device}! Expected one of ${Object.keys(ConsoleFormats).join(\", \")}.`);\n        }\n        return getAs(this.fields, device, path);//Validation of path is handled here\n    }\n\n    /** \n     * Encode the Mii into a Buffer in the specified format.\n     * @param {MiiFormat} format - The format to encode the Mii as\n     */\n    encode(format = MiiFormats.CHARINFO) {\n        if (!MiiFormats.hasOwnProperty(format) && getKeyByValue(MiiFormats, format) === null) {\n            throw new Error(`Unexpected format: ${format}. Expected one of: ${Object.keys(MiiFormats).join(\", \")}`);\n        }\n        return encodeMii(this.fields, format);\n    }\n\n    /** Render the mii to a QR code */\n    async toQR(device=\"3DS\",options = {}) {//The 3DS outsold the Wii U and has more Mii centric games\n        let mii = await encodeMii(this.fields, ([\"3DS\",\"CFED\",\"CFSD\",\"CFCD\"].includes(device))?(this.fields.hasOwnProperty(\"tl\")?MiiFormats.TLE:MiiFormats.CFED):MiiFormats.FFED);\n        return makeQR(mii, options);\n    }\n\n    /** Render the Mii to an image */\n    async render(fullBody = false, options = {}) {\n        return await renderMii(this.fields, Object.assign(options, { fullBody }));\n    }\n    async renderWithStudio(fullBody = false){\n        return await renderMiiWithStudio(this.fields, fullBody);\n    }\n\n    async insertIntoAmiibo(amiiboDump) {\n        if (!amiiboDump || !isSupportedBuffer(amiiboDump) || (amiiboDump?.byteLength !== 532 && amiiboDump?.byteLength !== 540 && amiiboDump?.length !== 532 && amiiboDump?.length !== 540)) {\n            throw new Error(`Provided dump is not an Amiibo! Expected Buffer with a length that's one of: 532, 540. Received: ${typeof amiiboDump}, ${amiiboDump?.length}`);\n        }\n        return insertMiiIntoAmiibo(amiiboDump, this.fields);\n    }\n\n    /** \n     * Generate instructions for how to recreate this mii on a given console\n     * @param {ConsoleFormat} device - The console to generate instructions for\n     * */\n    async toInstructions(device = ConsoleFormats.SWITCH) { //Switch over Switch 2 here purely for one wording case of \"Use the Y Button to flip the hair\" :zany_face: (Thank you for this button Switch 2 I love it but Switch 2 isn't widespread yet)\n        if (!ConsoleFormats.hasOwnProperty(device) && !getKeyByValue(ConsoleFormats, device)) {\n            throw new Error(`Invalid console type ${device}! Expected one of ${Object.keys(ConsoleFormats).join(\", \")}.`);\n        }\n        return makeInstructions(this.fields, device);\n    }\n}\n\nconst FavoriteColors = lookupTables.favoriteColors;\n\nexport {\n    Mii,\n    FavoriteColors,\n    FFLExpression,\n\n    insertMiiIntoAmiibo,\n    extractMiiFromAmiibo,\n    miiHeightToMeasurements,\n    inchesToMiiHeight,\n    centimetersToMiiHeight,\n    miiWeightToMeasurements,\n    imperialHeightWeightToMiiWeight,\n    metricHeightWeightToMiiWeight,\n    renderMii,\n    decryptMii,\n    encryptMii,\n    miiCrcCalc,\n    makeInstructions,\n    getAs,\n    setAs,\n    kidomatic,\n    makeMiiChild,\n\n    getNestedValue,\n    setNestedValue,\n    deleteNestedValue,\n    getKeyByValue\n};\n\nexport default{\n    Mii,\n\n    //The raw functions are provided as well for those who'd rather forego the class. Flexible, not rigid.\n    ...miiProcess,\n    ...miiFormats,\n\n    ...qrTools,\n\n    insertMiiIntoAmiibo,\n    extractMiiFromAmiibo,\n    miiHeightToMeasurements,\n    inchesToMiiHeight,\n    centimetersToMiiHeight,\n    miiWeightToMeasurements,\n    imperialHeightWeightToMiiWeight,\n    metricHeightWeightToMiiWeight,\n    renderMii,\n    FFLExpression,\n    decryptMii,\n    encryptMii,\n    miiCrcCalc,\n    makeInstructions,\n    getAs,\n    setAs,\n    kidomatic,\n    makeMiiChild,\n\n    FavoriteColors,\n\n    //These are outside MiiJS' scope but we define them here and they're nice functions to have so might as well make them available for convenience\n    getNestedValue,\n    setNestedValue,\n    deleteNestedValue,\n    getKeyByValue\n};\n"],
  "mappings": "4qBAAA,IACaA,GAmEAC,GAuTAC,GAsxCAC,GAjpDbC,GAAAC,GAAA,KACaL,GAAW,CACpB,MAAM,CAIF,MAAQ,CACJ,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EACrD,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,GACpD,EAAE,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,EACxD,EACA,MAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,EAChB,KAAO,CAAC,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,GAAG,EAAE,EACzC,MAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EACrB,OAAS,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,GAAG,EAAE,EACtC,SAAY,CACR,IAAI,IAAI,EACR,EAAE,IAAI,EACN,EAAE,EAAE,EACJ,GAAG,IAAI,EACX,EACA,QAAW,CACP,EAAE,EAAE,EACJ,EAAE,EAAE,EACJ,EAAE,EAAE,EACJ,EAAE,EAAE,CACR,CACJ,EACA,OAAS,CACL,aAAe,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EACrC,WAAa,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAMjC,cAAgB,CACZ,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC3B,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC3B,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC3B,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC3B,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC3B,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC3B,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC3B,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC3B,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC3B,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAC/B,EACA,YAAc,CACV,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC3E,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC3E,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC3E,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CACnE,EACA,WAAa,CACT,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC3E,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC3E,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC3E,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CACnE,EACA,aAAe,CACX,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC3E,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC3E,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC3E,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CACnE,CACJ,CACJ,EACaC,GAAa,CACtB,MAAQ,CACJ,KAAO,CACH,IAAM,CACF,CACI,GAAI,GAAI,GACR,GAAI,GAAI,GACR,GAAI,GAAI,GACR,GAAI,GAAI,EACZ,EACA,CACI,GAAI,GAAI,GACR,GAAI,GAAI,GACR,GAAI,GAAI,GACR,GAAI,GAAI,EACZ,EACA,CACI,GAAI,GAAI,GACR,GAAI,GAAI,GACR,GAAI,GAAI,GACR,GAAI,GAAI,EACZ,EACA,CACI,GAAI,GAAI,GACR,GAAK,EAAG,GACR,EAAG,GAAK,EACR,EAAG,GAAK,CACZ,EACA,CACI,GAAK,EAAG,GACR,GAAK,EAAG,GACR,GAAI,GAAI,GACR,GAAI,GAAK,CACb,EACA,CACI,GAAI,GAAI,GACR,EAAG,GAAK,EACR,GAAI,GAAI,GACR,GAAI,GAAI,EACZ,CACJ,EACA,MAAM,CACF,CACI,GAAG,GAAG,GACN,GAAG,GAAG,IACN,GAAG,GAAG,GACN,GAAG,GAAG,EACV,EACA,CACI,GAAG,GAAG,GACN,GAAG,GAAG,GACN,GAAG,GAAG,GACN,IAAI,GAAG,GACX,EACA,CACI,GAAG,GAAG,IACN,IAAI,GAAG,GACP,GAAG,GAAG,IACN,IAAI,GAAG,EACX,EACA,CACI,GAAG,GAAG,GACN,GAAG,GAAG,GACN,GAAG,GAAG,GACN,IAAI,GAAG,EACX,EACA,CACI,GAAG,GAAG,GACN,GAAG,GAAG,GACN,GAAG,GAAG,GACN,GAAG,IAAI,GACX,EACA,CACI,GAAG,GAAG,IACN,IAAI,EAAE,GACN,GAAG,IAAI,GACP,EAAE,GAAG,GACT,EACA,CACI,IAAI,EAAE,IACN,GAAG,EAAE,GACL,EAAE,GAAG,GACL,GAAG,GAAG,GACV,EACA,CACI,EAAE,GAAG,IACL,GAAG,IAAI,GACP,GAAG,GAAG,GACN,GAAG,IAAI,GACX,EACA,CACI,GAAG,GAAG,GACN,GAAG,GAAG,IACN,GAAG,IAAI,GACP,EAAE,GAAG,GACT,EACA,CACI,GAAG,EAAE,IACL,IAAI,GAAG,GACP,GAAG,IAAI,EACP,GAAG,GAAG,EACV,EACA,CACI,GAAG,EAAE,GACL,IAAI,GAAG,IACP,GAAG,GAAG,GACN,IAAI,IAAI,GACZ,CACJ,CACJ,EACA,MAAQ,CACJ,EAAE,EAAE,EACJ,EAAE,EAAE,EACJ,EAAE,EAAE,GACJ,EAAE,EAAE,EACR,EACA,SAAW,CACP,CACI,EAAE,EAAE,GACJ,EAAE,EAAE,GACJ,EAAE,GAAG,EACL,GAAG,EAAE,CACT,EACA,CACI,GAAG,GAAG,EACN,EAAE,GAAG,GACL,GAAG,GAAG,GACN,GAAG,GAAG,EACV,CACJ,EACA,KAAO,CACH,CACI,EAAE,EAAE,EACJ,EAAE,GAAG,GACL,EAAE,GAAG,GACL,GAAG,GAAG,EACV,EACA,CACI,GAAG,GAAG,GACN,GAAG,EAAE,GACL,GAAG,GAAG,GACN,GAAG,GAAG,EACV,EACA,CACI,EAAE,GAAG,GACL,GAAG,GAAG,EACN,GAAG,GAAG,GACN,GAAG,GAAG,EACV,EACA,CACI,EAAE,GAAG,GACL,GAAG,GAAG,GACN,EAAE,GAAG,GACL,GAAG,GAAG,EACV,EACA,CACI,GAAG,GAAG,GACN,GAAG,GAAG,GACN,GAAG,GAAG,GACN,GAAG,GAAG,EACV,CACJ,EACA,MAAQ,CACJ,CACI,EAAE,GAAG,EACL,EAAE,EAAE,EACJ,EAAE,EAAE,EACJ,EAAE,EAAE,EACR,EACA,CACI,GAAG,GAAG,GACN,GAAG,GAAG,EACV,CACJ,EACA,OAAS,CACL,CACI,GAAG,EAAE,GACL,GAAG,GAAG,EACN,EAAE,EAAE,GACJ,GAAG,EAAE,EACT,EACA,CACI,EAAE,EAAE,EACJ,GAAG,EAAE,EACL,GAAG,GAAG,GACN,GAAG,GAAG,EACV,EACA,CACI,GAAG,GAAG,GACN,GAAG,GAAG,GACN,GAAG,GAAG,GACN,GAAG,GAAG,EACV,CACJ,CACJ,EACA,eAAiB,CAAC,MAAM,SAAS,SAAS,OAAO,QAAQ,OAAO,OAAO,OAAO,SAAS,QAAQ,QAAQ,OAAO,EAC9G,OAAS,CACL,WAAa,CACT,EAAE,EAAE,EAAE,EAAE,EACR,EAAE,EAAE,EAAE,EAAE,CACZ,CACJ,EACA,MAAQ,CACJ,OAAS,CACL,CAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC9B,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC9B,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC9B,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC9B,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC9B,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC9B,CAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC9B,CAAC,GAAG,GAAI,EAAE,GAAI,EAAE,GAAG,GAAG,GAAG,GAAG,EAAE,EAC9B,CAAE,EAAG,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAC9B,CAAE,EAAG,EAAE,GAAI,EAAE,GAAI,EAAE,GAAG,GAAG,GAAG,EAAE,CAClC,EACA,WAAa,CACT,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,EACV,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CACd,EACA,MAAQ,CACJ,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EACnB,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAClB,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAClB,CAAC,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,EACpB,CAAC,GAAG,GAAG,IAAI,IAAI,GAAG,EAAE,EACpB,CAAC,GAAG,GAAG,IAAI,IAAI,GAAG,EAAE,EACpB,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAClB,CAAC,GAAG,GAAG,GAAG,IAAI,GAAG,EAAE,EACnB,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAClB,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,EACpB,CAAC,GAAG,GAAG,IAAI,IAAI,EAAE,EAAE,EACnB,CAAC,GAAG,IAAI,GAAG,EAAE,GAAG,GAAG,EACnB,CAAC,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,EAClB,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,EAClB,CAAC,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,EACnB,CAAC,GAAG,GAAG,GAAG,GAAG,IAAI,GAAG,EACpB,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EACnB,CAAC,GAAG,IAAI,GAAG,EAAE,GAAG,GAAG,EACnB,CAAC,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,EACnB,CAAC,GAAG,IAAI,EAAE,GAAG,GAAG,EAAE,EAClB,CAAC,GAAG,EAAE,GAAG,IAAI,GAAG,GAAG,EACnB,CAAC,GAAG,GAAG,GAAG,IAAI,IAAI,GAAG,CACzB,EACA,MAAQ,CACJ,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EACb,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EACb,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,CACtB,EACA,SAAW,CACP,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EACd,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,EACd,CAAC,GAAG,GAAG,EAAE,EAAE,GAAG,EAAE,EAChB,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,CACtB,EACA,OAAS,CACL,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAAC,EAChB,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,EAAE,EACf,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EACb,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAClB,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAClB,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,CACtB,EACA,KAAO,CACH,CAAC,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EACd,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,EAAE,EACjB,CAAC,GAAG,GAAG,GAAG,GAAG,EAAE,EAAE,EACjB,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAClB,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,CAAC,EAChB,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAClB,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,EAAE,EACjB,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,EAAE,EACjB,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAClB,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,CACtB,EACA,QAAU,CACN,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EACX,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EACZ,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,EACZ,CAAC,GAAG,GAAG,GAAG,GAAG,EAAE,CACnB,CACJ,EACA,WAAa,CACT,MAAM,CACF,CAAC,EAAE,CAAC,EACJ,CAAC,EAAE,CAAC,EACJ,CAAC,EAAE,CAAC,EACJ,CAAC,EAAE,CAAC,CACR,EACA,QAAQ,CACJ,CAAC,EAAE,EAAE,CAAC,EACN,CAAC,EAAE,EAAE,CAAC,EACN,CAAC,EAAE,EAAE,CAAC,EACN,CAAC,EAAE,GAAG,EAAE,CACZ,EACA,OAAO,CACH,CAAC,EAAE,EAAE,EAAE,CAAC,EACR,CAAC,EAAE,EAAE,EAAE,CAAC,CACZ,CACJ,EACA,aAAe,CACX,EAAE,EAAE,EACJ,EAAE,EAAE,EACJ,GAAG,GAAG,EACV,EACA,gBAAkB,CACd,EAAE,IAAI,IACN,IAAI,EAAE,EACN,EAAE,EAAE,EACJ,KAAK,EAAE,EACX,CACJ,EACaC,GAAe,CACxB,uBAA0B,CACtB,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,EACA,CACI,EACA,CACJ,CACJ,EACA,gBAAmB,CACf,CACI,CACI,EACJ,EACA,CACI,GACA,EACJ,EACA,CACI,GACA,GACA,GACJ,EACA,CACI,GACA,GACA,GACA,EACJ,CACJ,EACA,CACI,CACI,EACJ,EACA,CACI,GACA,GACA,GACA,EACJ,EACA,CACI,IACA,GACA,GACA,EACJ,EACA,CACI,GACA,IACA,IACA,GACA,EACJ,CACJ,EACA,CACI,CACI,EACJ,EACA,CACI,GACA,GACA,EACJ,EACA,CACI,GACA,EACJ,EACA,CACI,GACA,GACA,IACA,GACA,IACA,GACA,GACA,EACJ,CACJ,EACA,CACI,CACI,EACJ,EACA,CACI,GACA,EACJ,EACA,CACI,GACA,IACA,GACJ,EACA,CACI,GACA,GACA,GACA,EACJ,CACJ,EACA,CACI,CACI,EACJ,EACA,CACI,GACA,EACJ,EACA,CACI,GACA,GACA,EACA,EACJ,EACA,CACI,GACA,IACA,GACA,GACA,GACA,GACA,IACA,GACJ,CACJ,EACA,CACI,CACI,EACJ,EACA,CACI,GACA,IACA,EACJ,EACA,CACI,IACA,IACA,EACJ,EACA,CACI,IACA,GACA,EACA,GACA,GACA,EACJ,CACJ,EACA,CACI,CACI,GACA,EACJ,EACA,CACI,GACA,EACJ,EACA,CACI,GACA,IACA,GACA,EACJ,EACA,CACI,GACA,IACA,GACA,EACA,IACA,GACA,IACA,GACA,EACA,IACA,GACA,IACA,IACA,GACA,EACA,EACJ,CACJ,EACA,CACI,CACI,EACJ,EACA,CACI,GACA,GACJ,EACA,CACI,IACA,GACA,EACJ,EACA,CACI,GACA,IACA,IACA,GACA,GACA,GACA,IACA,GACJ,CACJ,EACA,CACI,CACI,EACJ,EACA,CACI,IACA,EACJ,EACA,CACI,GACA,GACA,EACJ,EACA,CACI,IACA,EACA,EACA,GACA,GACA,GACA,CACJ,CACJ,EACA,CACI,CACI,GACA,EACJ,EACA,CACI,GACA,IACA,EACJ,EACA,CACI,GACA,GACA,EACJ,EACA,CACI,GACA,IACA,GACA,GACA,EACA,GACA,IACA,IACA,GACA,GACA,IACA,EACA,EACJ,CACJ,CACJ,EACA,gBAAmB,CACf,CACI,CACI,EACA,GACA,GACA,EACJ,EACA,CACI,EACA,EACA,GACA,EACJ,EACA,CACI,EACA,EACA,EACA,CACJ,EACA,CACI,EACA,EACA,GACA,EACJ,EACA,CACI,EACA,EACA,GACA,EACJ,EACA,CACI,EACA,EACA,GACA,EACJ,CACJ,EACA,CACI,CACI,GACA,GACA,GACA,EACJ,EACA,CACI,EACA,GACA,GACA,EACJ,EACA,CACI,EACA,EACA,GACA,EACJ,EACA,CACI,EACA,EACA,GACA,EACJ,EACA,CACI,EACA,GACA,GACA,EACJ,EACA,CACI,EACA,EACA,GACA,EACJ,CACJ,EACA,CACI,CACI,GACA,GACA,GACA,EACJ,EACA,CACI,GACA,GACA,GACA,EACJ,EACA,CACI,EACA,GACA,GACA,EACJ,EACA,CACI,EACA,EACA,GACA,EACJ,EACA,CACI,EACA,EACA,GACA,EACJ,EACA,CACI,EACA,GACA,GACA,EACJ,CACJ,EACA,CACI,CACI,GACA,GACA,GACA,EACJ,EACA,CACI,GACA,GACA,GACA,EACJ,EACA,CACI,GACA,GACA,GACA,EACJ,EACA,CACI,EACA,GACA,GACA,EACJ,EACA,CACI,EACA,GACA,GACA,EACJ,EACA,CACI,EACA,EACA,GACA,EACJ,CACJ,EACA,CACI,CACI,GACA,GACA,GACA,EACJ,EACA,CACI,GACA,GACA,GACA,EACJ,EACA,CACI,GACA,GACA,GACA,EACJ,EACA,CACI,GACA,GACA,GACA,EACJ,EACA,CACI,EACA,GACA,GACA,EACJ,EACA,CACI,EACA,EACA,GACA,EACJ,CACJ,EACA,CACI,CACI,GACA,GACA,GACA,EACJ,EACA,CACI,GACA,GACA,GACA,EACJ,EACA,CACI,GACA,GACA,GACA,EACJ,EACA,CACI,GACA,GACA,GACA,EACJ,EACA,CACI,GACA,GACA,GACA,EACJ,EACA,CACI,EACA,GACA,GACA,EACJ,CACJ,CACJ,EACA,MAAS,CACL,CACI,QACA,OACA,SACA,QACA,QACA,OACA,YACA,QACA,SACA,UACA,SACA,SACA,MACA,WACA,UACA,OACA,QACA,QACA,UACA,UACA,UACA,QACA,SACA,QACA,SACA,UACA,SACA,UACA,UACA,SACA,SACA,QACA,QACA,YACA,OACA,SACA,SACA,SACA,SACA,SACA,QACA,SACA,UACA,QACA,SACA,SACA,MACA,SACA,SACA,QACA,OACA,SACA,UACA,UACA,UACA,QACA,SACA,UACA,WACA,SACA,QACA,SACA,OACA,SACA,MACA,QACA,SACA,OACA,OACA,UACA,QACA,QACA,OACA,QACA,QACA,SACA,SACA,WACA,OACA,OACA,WACA,SACA,OACA,SACA,SACA,SACA,OACA,SACA,SACA,MACA,SACA,QACA,OACA,SACA,OACA,MACA,QACA,QACA,OACA,OACA,UACA,QACA,UACA,MACA,UACA,SACA,SACA,YACA,WACA,OACA,QACA,OACA,SACA,OACA,SACA,SACA,OACA,QACA,MACA,SACA,OACA,QACA,SACA,YACA,OACA,SACA,QACA,QACA,UACA,QACA,UACA,OACA,QACA,SACA,MACA,UACA,OACA,SACA,QACA,SACA,QACA,SACA,UACA,UACA,YACA,SACA,SACA,MACA,QACJ,EACA,CACI,UACA,UACA,UACA,UACA,WACA,QACA,YACA,SACA,UACA,SACA,SACA,MACA,SACA,OACA,YACA,OACA,SACA,UACA,SACA,SACA,SACA,SACA,SACA,MACA,QACA,QACA,UACA,UACA,WACA,SACA,WACA,YACA,QACA,QACA,SACA,OACA,QACA,SACA,YACA,WACA,OACA,QACA,OACA,MACA,OACA,SACA,QACA,YACA,SACA,QACA,SACA,SACA,SACA,QACA,SACA,QACA,WACA,SACA,UACA,UACA,UACA,QACA,YACA,QACA,SACA,WACA,QACA,QACA,SACA,QACA,OACA,QACA,SACA,OACA,OACA,SACA,OACA,QACA,WACA,UACA,SACA,UACA,OACA,MACA,QACA,UACA,MACA,QACA,QACA,UACA,SACA,SACA,QACA,QACA,QACA,SACA,UACA,QACA,QACA,WACA,QACA,WACA,WACA,WACA,OACA,SACA,QACA,SACA,SACA,SACA,SACA,SACA,SACA,UACA,UACA,WACA,SACA,SACA,OACA,MACA,OACA,OACA,SACA,QACA,SACA,QACA,SACA,UACA,UACA,YACA,SACA,SACA,MACA,QACJ,CACJ,CACJ,EAEaC,GAAgB,CAC3B,iBACA,YACA,aACA,cACA,UACA,eACA,sBACA,cACA,gBACA,WACA,SACA,cACA,SACA,cACA,QACA,aACA,YACA,SACA,SACA,OACA,WACA,QACA,WACA,kBACA,uBACA,aACA,QACA,UACA,uBACA,QACA,oBACA,mBACA,aACA,kBACA,WACA,SACA,eACA,kBACA,QACA,UACA,SACA,eACA,WACA,cACA,eACA,eACA,iBACA,SACA,QACA,kBACA,QACA,QACA,eACA,UACA,QACA,WACA,WACA,SACA,eACA,aACA,UACA,aACA,aACA,OACA,UACA,UACA,YACA,QACA,SACA,SACA,UACA,UACA,UACA,aACA,SACA,WACA,wBACA,WACA,UACA,SACA,SACA,gBACA,OACA,WACA,kBACA,uBACA,SACA,cACA,QACA,UACA,YACA,UACA,eACA,QACA,aACA,SACA,UACA,SACA,SACA,WACF,ICtvDA,IAKAG,GAEAC,IACAC,GAGMC,GAIJC,GACAC,GACAC,GACAC,GACAC,IACAC,IApBFC,GAAAC,GAAA,KAKAX,GAAuB,kBAEvBC,IAA4B,6BAC5BC,GAAe,oBAGTC,GAAO,GAGP,CACJ,eAAAC,GACA,iBAAAC,GACA,YAAAC,GACA,WAAAC,GACA,WAAAC,IACA,gBAAAC,KACER,MClBJ,SAASW,IAAgBC,EAAKC,EAAM,CAC5BA,IAAS,SAAUA,EAAO,IAE9B,QADIC,EAAMF,EAAI,OAAQG,EAAQ,IAAI,WAAWF,EAAO,EAAIC,EAAMA,CAAG,EACxDE,EAAI,EAAGC,EAAI,EAAGD,EAAIF,EAAKE,IAAK,CACjC,IAAIE,EAAIN,EAAI,WAAWI,CAAC,EACxB,GAAIH,GAAQ,OAAUK,GAAKA,GAAK,MAAQ,CACpC,GAAI,EAAEF,GAAKF,EACP,MAAM,IAAI,MAAM,wDAA0DE,CAAC,EAC/EE,GAAMA,EAAI,QAAW,GAAM,MAAWN,EAAI,WAAWI,CAAC,EAAI,KAC9D,SACS,CAACH,GAAQK,IAAM,EACpB,MAAM,IAAI,MAAM,kCAAkC,EAElD,CAACL,GAAQK,GAAK,IACdH,EAAME,GAAG,EAAIC,EAERA,GAAK,MACVH,EAAME,GAAG,EAAI,IAAQC,GAAK,EAC1BH,EAAME,GAAG,EAAI,IAAQC,EAAI,IAEpBA,GAAK,OACVH,EAAME,GAAG,EAAI,IAAQC,GAAK,GAC1BH,EAAME,GAAG,EAAI,IAASC,GAAK,EAAK,GAChCH,EAAME,GAAG,EAAI,IAAQC,EAAI,KAGzBH,EAAME,GAAG,EAAI,IAAQC,GAAK,GAC1BH,EAAME,GAAG,EAAI,IAASC,GAAK,GAAM,GACjCH,EAAME,GAAG,EAAI,IAASC,GAAK,EAAK,GAChCH,EAAME,GAAG,EAAI,IAAQC,EAAI,GAEjC,CACA,OAAOH,EAAM,SAAS,EAAGE,CAAC,CAC9B,CACA,SAASE,GAASC,EAAG,CACjB,OAAOA,aAAa,UACxB,CACA,SAASC,IAAWC,EAAMC,EAAU,CAChC,IAAIC,EAAOF,EAAOA,EAAK,WAAaC,GAAY,MAChD,GAAIC,EAAO,MAASA,GAAQ,EACxB,MAAM,IAAI,MAAM,6DAA6D,EACjF,OAAAF,EAAOA,GAAQ,IAAI,WAAW,IAAI,YAAYE,CAAI,CAAC,EAC5CF,CACX,CACA,SAASG,GAAYH,EAAMI,EAAMC,EAAMC,EAAMC,EAAM,CAC/C,IAAIC,EAAOR,EAAK,OAASI,EACrBK,EAAOD,EAAOD,EAAOC,EAAOD,EAChC,OAAAP,EAAK,IAAIK,EAAK,SAASC,EAAMA,EAAOG,CAAI,EAAGL,CAAI,EACxCK,CACX,CAs5GA,SAASC,IAAcZ,EAAGa,EAAG,CACzB,IAAIC,EAAKd,EAAI,EAAI,GAAK,EAAGe,EAAKF,EAAI,EAAI,GAAK,EAAGG,EAAK,EAAGC,EAAK,EAAGC,EAAK,EAAGC,EAAK,EAAGC,EAAGC,EAAGC,EAAGC,EAYvF,IAXAvB,GAAKc,EACLD,GAAKE,EACLQ,EAAUvB,EAAIa,EACVU,IACAD,EAAItB,EACHA,EAAIa,EAAKA,EAAIS,EACdA,EAAIR,EACJA,EAAKC,EACLA,EAAKO,GAERD,EAAI,KAAK,MAAMrB,EAAIa,CAAC,EAAKO,EAAIpB,EAAIqB,EAAIR,EAC/BO,GACFE,EAAIN,EAAKK,EAAIJ,EAAMD,EAAKC,EAAMA,EAAKK,EACnCA,EAAIJ,EAAKG,EAAIF,EAAMD,EAAKC,EAAMA,EAAKG,EACnCtB,EAAIa,EAAKA,EAAIO,EACbC,EAAI,KAAK,MAAMrB,EAAIa,CAAC,EAAKO,EAAIpB,EAAIqB,EAAIR,EAE1C,OAAAI,GAAMH,EACNK,GAAMJ,EACFQ,IACAD,EAAIL,EACHA,EAAKE,EAAMA,EAAKG,GAEd,CACH,IAAKT,EACL,EAAGI,EACH,EAAGE,CACP,CACJ,CACA,SAASK,GAAiBxB,EAAGa,EAAG,CAC5B,IAAIC,EAAKd,EAAE,KACPe,EAAKF,EAAE,KACPC,EAAK,IACLd,EAAIA,EAAE,OAAO,GACbe,EAAK,IACLF,EAAIA,EAAE,OAAO,GACjB,IAAIU,EAAUvB,EAAE,QAAQa,CAAC,EACzB,GAAIU,EAAU,EAAG,CACb,IAAID,EAAItB,EACPA,EAAIa,EAAKA,EAAIS,EACd,IAAIG,EAAKX,EACTA,EAAKC,EACLA,EAAKU,CACT,CACA,IAAIT,EAAKU,GAAU,IAAKT,EAAKS,GAAU,KAAMC,EAAKd,EAAE,UAAWK,EAAKQ,GAAU,KAAMP,EAAKO,GAAU,IAAKE,EAAK5B,EAAE,UAAW6B,EAAGT,EAAGC,EAEhI,IADAQ,EAAI7B,EAAE,OAAOa,CAAC,GACNO,EAAIS,EAAE,aAAeH,GAAU,MACnCL,EAAIQ,EAAE,SACLA,EAAIb,EAAG,SAASK,EAAE,SAASJ,CAAE,EAAE,MAAMU,CAAE,CAAC,EAAE,MAAMA,CAAE,EAAKX,EAAKC,EAAMA,EAAKY,EACvEA,EAAIX,EAAG,SAASG,EAAE,SAASF,CAAE,EAAE,MAAMS,CAAE,CAAC,EAAE,MAAMA,CAAE,EAAKV,EAAKC,EAAMA,EAAKU,EACvE7B,EAAIa,EAAKA,EAAIO,EACdS,EAAI7B,EAAE,OAAOa,CAAC,EAMlB,GAJIC,EAAK,IACLG,EAAKA,EAAG,OAAO,GACfF,EAAK,IACLI,EAAKA,EAAG,OAAO,GACfI,EAAU,EAAG,CACb,IAAID,EAAIL,EACPA,EAAKE,EAAMA,EAAKG,CACrB,CACA,MAAO,CACH,IAAKT,EACL,EAAGI,EACH,EAAGE,CACP,CACJ,CAEA,SAASW,IAAgBC,EAAK,CAC1B,GAAI,OAAO,QAAY,KAAe,OAAO,SAAY,WACrD,GAAI,CACA,IAAIpC,EAAQqC,GAAYD,EAAI,MAAM,EAClCA,EAAI,IAAIpC,CAAK,EACb,MACJ,MAAY,CAEZ,CAEJ,GAAI,OAAO,OAAW,KAAe,OAAO,QAAU,OAAO,OAAO,gBAAiB,CACjF,OAAO,OAAO,gBAAgBoC,CAAG,EACjC,MACJ,CACA,GAAI,OAAO,KAAS,KAAe,KAAK,QAAU,KAAK,OAAO,gBAAiB,CAC3E,KAAK,OAAO,gBAAgBA,CAAG,EAC/B,MACJ,CACA,GAAI,OAAO,WAAe,KAAe,WAAW,QAAU,WAAW,OAAO,gBAAiB,CAC7F,WAAW,OAAO,gBAAgBA,CAAG,EACrC,MACJ,CAEA,GAAI,OAAO,OAAW,KAAe,OAAO,UAAY,OAAO,SAAS,gBAAiB,CAErF,OAAO,SAAS,gBAAgBA,CAAG,EACnC,MACJ,CACA,MAAM,IAAI,MAAM,8CAA8C,CAClE,CAmBA,SAASE,IAAWjC,EAAGa,EAAG,CACtB,OAAQb,EAAIa,EAAK,CACrB,CAlkHA,IA0DIqB,GAaAC,IAYAC,GAYAC,GAkBAC,GA46BAC,IAqMAC,IACAC,GACAC,IAyQAC,GAkkEAC,IAcAC,GACAC,GACAC,GAaAC,GACAtB,GA2XAuB,IAoNEC,IAwIAC,GApyINC,GAAAC,GAAA,kBACAC,KAyDIpB,IAAmD,UAAY,CAC/D,IAAIqB,EAAgB,SAAUC,EAAG3C,EAAG,CAChC,OAAA0C,EAAgB,OAAO,gBAClB,CAAE,UAAW,CAAC,CAAE,YAAa,OAAS,SAAUC,EAAG3C,EAAG,CAAE2C,EAAE,UAAY3C,CAAG,GAC1E,SAAU2C,EAAG3C,EAAG,CAAE,QAAS4C,KAAK5C,EAAOA,EAAE,eAAe4C,CAAC,IAAGD,EAAEC,CAAC,EAAI5C,EAAE4C,CAAC,EAAG,EACtEF,EAAcC,EAAG3C,CAAC,CAC7B,EACA,OAAO,SAAU2C,EAAG3C,EAAG,CACnB0C,EAAcC,EAAG3C,CAAC,EAClB,SAAS6C,GAAK,CAAE,KAAK,YAAcF,CAAG,CACtCA,EAAE,UAAY3C,IAAM,KAAO,OAAO,OAAOA,CAAC,GAAK6C,EAAG,UAAY7C,EAAE,UAAW,IAAI6C,EACnF,CACJ,GAAG,EACCvB,KAAmC,SAAUwB,EAAQ,CACrDzB,GAAUC,EAAmBwB,CAAM,EACnC,SAASxB,GAAoB,CAEzB,QADIyB,EAAO,CAAC,EACHC,EAAK,EAAGA,EAAK,UAAU,OAAQA,IACpCD,EAAKC,CAAE,EAAI,UAAUA,CAAE,EAE3B,IAAIC,EAAQH,EAAO,MAAM,KAAMC,CAAI,GAAK,KACxC,OAAOE,CACX,CACA,OAAO3B,CACX,GAAE,KAAK,EACHC,IAAsC,SAAUuB,EAAQ,CACxDzB,GAAUE,EAAsBuB,CAAM,EACtC,SAASvB,GAAuB,CAE5B,QADIwB,EAAO,CAAC,EACHC,EAAK,EAAGA,EAAK,UAAU,OAAQA,IACpCD,EAAKC,CAAE,EAAI,UAAUA,CAAE,EAE3B,IAAIC,EAAQH,EAAO,MAAM,KAAMC,CAAI,GAAK,KACxC,OAAOE,CACX,CACA,OAAO1B,CACX,GAAE,KAAK,EACHC,IAA+B,SAAUsB,EAAQ,CACjDzB,GAAUG,EAAesB,CAAM,EAC/B,SAAStB,GAAgB,CAErB,QADIuB,EAAO,CAAC,EACHC,EAAK,EAAGA,EAAK,UAAU,OAAQA,IACpCD,EAAKC,CAAE,EAAI,UAAUA,CAAE,EAE3B,IAAIC,EAAQH,EAAO,MAAM,KAAMC,CAAI,GAAK,KACxC,OAAOE,CACX,CACA,OAAOzB,CACX,GAAE,KAAK,EAOHC,IAAU,UAAY,CAKtB,IAAIyB,EAAa,GAKbC,EAAOC,EAKX,SAASC,GAAQ,CACbF,EAAQ,CAAC,EACLC,EAAQ,CAAC,EAEb,IAAIjE,EAAI,EAAGF,EAAG0D,EACd,IAAK1D,EAAI,EAAGA,EAAI,IAAKA,IACjBkE,EAAMlE,CAAC,EAAIE,EAGXwD,EAAIxD,EAAI,IAAMA,IAAM,EAAGA,GAAK,IACxBwD,IAAM,MAAMxD,GAAK,IACrBA,GAAKgE,EAAMlE,CAAC,EAGZmE,EAAMD,EAAMlE,CAAC,CAAC,EAAIA,EAEtBkE,EAAM,GAAG,EAAIA,EAAM,CAAC,EACpBC,EAAM,CAAC,EAAI,EAEXF,EAAa,EACjB,CAQA,SAASI,EAAKnE,EAAGa,EAAG,CAChB,IAAIf,EAAIkE,GAAOC,EAAMjE,CAAC,EAAIiE,EAAMpD,CAAC,GAAK,GAAG,EACzC,OAAIb,IAAM,GAAKa,IAAM,KAAGf,EAAI,GACrBA,CACX,CAOA,SAASsE,EAAKpE,EAAG,CACb,IAAIJ,EAAIoE,EAAM,IAAMC,EAAMjE,CAAC,CAAC,EAC5B,OAAIA,IAAM,IAAGJ,EAAI,GACVA,CACX,CAKA,IAAIyE,EAAgB,GAOhBC,EAKAC,EAKAC,EAKAC,EAKJ,SAASC,GAAW,CACXX,GAAYG,EAAM,EAGvB,SAASS,EAAG3E,EAAG,CACX,IAAIF,EAAG8E,EAAGC,EAEV,IADAD,EAAIC,EAAIT,EAAKpE,CAAC,EACTF,EAAI,EAAGA,EAAI,EAAGA,IACf8E,GAAMA,GAAK,EAAMA,IAAM,GAAM,IAC7BC,GAAKD,EAET,OAAAC,GAAK,GACEA,CACX,CAGAP,EAAW,CAAC,EACRC,EAAW,CAAC,EACZC,EAAU,CAAC,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,CAAC,EACzBC,EAAU,CAAC,CAAC,EAAG,CAAC,EAAG,CAAC,EAAG,CAAC,CAAC,EAE7B,QAAS7E,EAAI,EAAGA,EAAI,IAAKA,IAAK,CAC1B,IAAIgF,EAAID,EAAG/E,CAAC,EAGZ0E,EAAS1E,CAAC,EAAIgF,EACdL,EAASK,CAAC,EAAIhF,EAGd4E,EAAQ,CAAC,EAAE5E,CAAC,EAAKuE,EAAK,EAAGS,CAAC,GAAK,GAAOA,GAAK,GAAOA,GAAK,EAAKT,EAAK,EAAGS,CAAC,EACrEH,EAAQ,CAAC,EAAEG,CAAC,EAAKT,EAAK,GAAIvE,CAAC,GAAK,GAAOuE,EAAK,EAAGvE,CAAC,GAAK,GAAOuE,EAAK,GAAIvE,CAAC,GAAK,EAAKuE,EAAK,GAAIvE,CAAC,EAE1F,QAAS0B,EAAI,EAAGA,EAAI,EAAGA,IACnBkD,EAAQlD,CAAC,EAAE1B,CAAC,EAAK4E,EAAQlD,EAAI,CAAC,EAAE1B,CAAC,IAAM,EAAM4E,EAAQlD,EAAI,CAAC,EAAE1B,CAAC,GAAK,GAClE6E,EAAQnD,CAAC,EAAEsD,CAAC,EAAKH,EAAQnD,EAAI,CAAC,EAAEsD,CAAC,IAAM,EAAMH,EAAQnD,EAAI,CAAC,EAAEsD,CAAC,GAAK,EAE1E,CAEAP,EAAgB,EACpB,CAyBA,IAAIS,EAAU,SAAUC,EAASC,EAAQ,CAEhCX,GAAeK,EAAS,EAG7B,IAAIxE,EAAO,IAAI,YAAY8E,CAAM,EACjC9E,EAAK,IAAIoE,EAAU,GAAW,EAC9BpE,EAAK,IAAIqE,EAAU,GAAW,EAC9B,QAAS3E,EAAI,EAAGA,EAAI,EAAGA,IACnBM,EAAK,IAAIsE,EAAQ5E,CAAC,EAAI,KAAS,KAAQA,GAAM,CAAC,EAC9CM,EAAK,IAAIuE,EAAQ7E,CAAC,EAAI,KAAS,KAAQA,GAAM,CAAC,EAiBlD,SAASqF,EAAQC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAI,CACjD,IAAIC,EAAQzF,EAAK,SAAS,EAAO,EAAE,EAC/B0F,EAAQ1F,EAAK,SAAS,IAAO,GAAU,EAG3CyF,EAAM,IAAI,CAACR,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,EAAIC,CAAE,CAAC,EAC1C,QAAS9F,EAAIsF,EAAIW,EAAO,EAAGjG,EAAI,EAAIsF,EAAK,GAAItF,IAAK,CAC7C,IAAIkG,EAAIH,EAAM/F,EAAI,CAAC,GACdA,EAAIsF,IAAO,GAAOA,IAAO,GAAKtF,EAAIsF,IAAO,KAC1CY,EAAIxB,EAASwB,IAAM,EAAE,GAAK,GAAKxB,EAASwB,IAAM,GAAK,GAAG,GAAK,GAAKxB,EAASwB,IAAM,EAAI,GAAG,GAAK,EAAIxB,EAASwB,EAAI,GAAG,GAE/GlG,EAAIsF,IAAO,IACXY,EAAKA,GAAK,EAAMA,IAAM,GAAOD,GAAQ,GACrCA,EAAQA,GAAQ,GAAOA,EAAO,IAAQ,GAAO,IAEjDF,EAAM/F,CAAC,EAAI+F,EAAM/F,EAAIsF,CAAE,EAAIY,CAC/B,CAGA,QAASjG,EAAI,EAAGA,EAAID,EAAGC,GAAK,EACxB,QAASkG,EAAK,EAAGA,EAAK,EAAGA,IAAM,CAC3B,IAAID,EAAIH,EAAM/F,GAAK,EAAIC,IAAM,EAAIkG,GAAM,CAAC,EACpClG,EAAI,GAAKA,GAAKD,EAAI,EAClBgG,EAAM/F,EAAIkG,CAAE,EAAID,EAEhBF,EAAM/F,EAAIkG,CAAE,EAAItB,EAAQ,CAAC,EAAEH,EAASwB,IAAM,EAAE,CAAC,EACvCrB,EAAQ,CAAC,EAAEH,EAASwB,IAAM,GAAK,GAAG,CAAC,EACnCrB,EAAQ,CAAC,EAAEH,EAASwB,IAAM,EAAI,GAAG,CAAC,EAClCrB,EAAQ,CAAC,EAAEH,EAASwB,EAAI,GAAG,CAAC,CAE1C,CAIJE,EAAI,WAAWd,EAAK,CAAC,CACzB,CAGA,IAAIe,EAAS,CAAE,WAAwB,WAAyB,EAE5DD,GAAM,SAAUC,EAAQlB,EAASC,EAAQ,CAGzC,IAAIkB,EAAK,EAAGC,EAAK,EAAGC,EAAK,EAAGC,EAAK,EAC7BC,EAAK,EAAGC,EAAK,EAAGC,EAAK,EAAGC,EAAK,EAC7BC,EAAK,EAAGC,EAAK,EAAGC,EAAK,EAAGC,EAAK,EAC7BC,EAAK,EAAGC,EAAK,EAAGC,EAAK,EAAGC,GAAK,EAC7BC,GAAK,EAAGC,GAAK,EAAGC,GAAK,EAAGC,EAAK,EAC7BC,GAAI,EAEJC,GAAO,IAAItB,EAAO,YAAYjB,CAAM,EACpCwC,GAAO,IAAIvB,EAAO,WAAWjB,CAAM,EAavC,SAASyC,GAAM3B,GAAGlB,GAAGtD,EAAGF,EAAGsG,EAAIC,GAAIC,EAAIC,EAAI,CACvC/B,GAAIA,GAAI,EACRlB,GAAIA,GAAI,EACRtD,EAAIA,EAAI,EACRF,EAAIA,EAAI,EACRsG,EAAKA,EAAK,EACVC,GAAKA,GAAK,EACVC,EAAKA,EAAK,EACVC,EAAKA,EAAK,EAEV,IAAIC,EAAK,EAAGrG,GAAK,EAAGsG,GAAK,EACrBC,GAAK,EAAGC,GAAK,EAAGC,GAAK,EAAGC,GAAK,EAC7BvI,GAAI,EAWR,IATAkI,EAAKxG,EAAI,KAAOG,GAAKH,EAAI,KAAOyG,GAAKzG,EAAI,KAGzCoG,EAAKA,EAAKH,IAAMzB,GAAI,IAAM,CAAC,EACvB6B,GAAKA,GAAKJ,IAAMzB,GAAI,IAAM,CAAC,EAC3B8B,EAAKA,EAAKL,IAAMzB,GAAI,IAAM,CAAC,EAC3B+B,EAAKA,EAAKN,IAAMzB,GAAI,KAAO,CAAC,EAG3BlG,GAAI,IAAKA,GAAI,IAAOwB,GAAK,EAAIxB,GAAKA,GAAI,GAAM,EAC7CoI,GAAKT,IAAMjG,EAAIoG,GAAM,GAAK,OAAS,CAAC,EAAIH,IAAMO,EAAKH,IAAM,GAAK,OAAS,CAAC,EAAIJ,IAAM9F,GAAKmG,GAAM,EAAI,OAAS,CAAC,EAAIL,IAAMQ,GAAKF,GAAM,EAAI,OAAS,CAAC,EAAIN,IAAMzB,GAAIlG,GAAI,IAAM,CAAC,EACnKqI,GAAKV,IAAMjG,EAAIqG,IAAM,GAAK,OAAS,CAAC,EAAIJ,IAAMO,EAAKF,GAAM,GAAK,OAAS,CAAC,EAAIL,IAAM9F,GAAKoG,GAAM,EAAI,OAAS,CAAC,EAAIN,IAAMQ,GAAKL,GAAM,EAAI,OAAS,CAAC,EAAIH,IAAMzB,GAAIlG,GAAI,IAAM,CAAC,EACvKsI,GAAKX,IAAMjG,EAAIsG,GAAM,GAAK,OAAS,CAAC,EAAIL,IAAMO,EAAKD,GAAM,GAAK,OAAS,CAAC,EAAIN,IAAM9F,GAAKiG,GAAM,EAAI,OAAS,CAAC,EAAIH,IAAMQ,GAAKJ,IAAM,EAAI,OAAS,CAAC,EAAIJ,IAAMzB,GAAIlG,GAAI,IAAM,CAAC,EACvKuI,GAAKZ,IAAMjG,EAAIuG,GAAM,GAAK,OAAS,CAAC,EAAIN,IAAMO,EAAKJ,GAAM,GAAK,OAAS,CAAC,EAAIH,IAAM9F,GAAKkG,IAAM,EAAI,OAAS,CAAC,EAAIJ,IAAMQ,GAAKH,GAAM,EAAI,OAAS,CAAC,EAAIL,IAAMzB,GAAIlG,GAAI,KAAO,CAAC,EAC5K8H,EAAKM,GAAIL,GAAKM,GAAIL,EAAKM,GAAIL,EAAKM,GAIpCjC,EAAKqB,IAAM3C,GAAI8C,GAAM,GAAK,OAAS,CAAC,GAAK,GAAKH,IAAM3C,GAAI+C,IAAM,GAAK,OAAS,CAAC,GAAK,GAAKJ,IAAM3C,GAAIgD,GAAM,EAAI,OAAS,CAAC,GAAK,EAAIL,IAAM3C,GAAIiD,GAAM,EAAI,OAAS,CAAC,EAAIN,IAAMzB,GAAIlG,GAAI,IAAM,CAAC,EACjLuG,EAAKoB,IAAM3C,GAAI+C,IAAM,GAAK,OAAS,CAAC,GAAK,GAAKJ,IAAM3C,GAAIgD,GAAM,GAAK,OAAS,CAAC,GAAK,GAAKL,IAAM3C,GAAIiD,GAAM,EAAI,OAAS,CAAC,GAAK,EAAIN,IAAM3C,GAAI8C,GAAM,EAAI,OAAS,CAAC,EAAIH,IAAMzB,GAAIlG,GAAI,IAAM,CAAC,EACrLwG,EAAKmB,IAAM3C,GAAIgD,GAAM,GAAK,OAAS,CAAC,GAAK,GAAKL,IAAM3C,GAAIiD,GAAM,GAAK,OAAS,CAAC,GAAK,GAAKN,IAAM3C,GAAI8C,GAAM,EAAI,OAAS,CAAC,GAAK,EAAIH,IAAM3C,GAAI+C,IAAM,EAAI,OAAS,CAAC,EAAIJ,IAAMzB,GAAIlG,GAAI,IAAM,CAAC,EACrLyG,EAAKkB,IAAM3C,GAAIiD,GAAM,GAAK,OAAS,CAAC,GAAK,GAAKN,IAAM3C,GAAI8C,GAAM,GAAK,OAAS,CAAC,GAAK,GAAKH,IAAM3C,GAAI+C,IAAM,EAAI,OAAS,CAAC,GAAK,EAAIJ,IAAM3C,GAAIgD,GAAM,EAAI,OAAS,CAAC,EAAIL,IAAMzB,GAAIlG,GAAI,KAAO,CAAC,CAC9L,CASA,SAASwI,GAASV,GAAIC,GAAIC,EAAIC,EAAI,CAC9BH,GAAKA,GAAK,EACVC,GAAKA,GAAK,EACVC,EAAKA,EAAK,EACVC,EAAKA,EAAK,EAEVJ,GACI,EAAQ,KAAQ,KAChBH,GACAI,GACAC,GACAC,EACAC,CACJ,CACJ,CASA,SAASQ,GAASX,GAAIC,GAAIC,EAAIC,EAAI,CAC9BH,GAAKA,GAAK,EACVC,GAAKA,GAAK,EACVC,EAAKA,EAAK,EACVC,EAAKA,EAAK,EAEV,IAAIvG,EAAI,EAERmG,GACI,KAAQ,KAAQ,KAChBH,GACAI,GACAG,EACAD,EACAD,EACJ,EAEArG,EAAI6E,EAAIA,EAAKE,EAAIA,EAAK/E,CAC1B,CAUA,SAASgH,GAASZ,GAAIC,GAAIC,EAAIC,EAAI,CAC9BH,GAAKA,GAAK,EACVC,GAAKA,GAAK,EACVC,EAAKA,EAAK,EACVC,EAAKA,EAAK,EAEVJ,GACI,EAAQ,KAAQ,KAChBH,GACAhB,EAAKoB,GACLnB,EAAKoB,GACLnB,EAAKoB,EACLnB,EAAKoB,CACT,EAEAvB,EAAKJ,EACDK,EAAKJ,EACLK,EAAKJ,EACLK,EAAKJ,CACb,CASA,SAASkC,GAASb,GAAIC,GAAIC,EAAIC,EAAI,CAC9BH,GAAKA,GAAK,EACVC,GAAKA,GAAK,EACVC,EAAKA,EAAK,EACVC,EAAKA,EAAK,EAEV,IAAIvG,EAAI,EAERmG,GACI,KAAQ,KAAQ,KAChBH,GACAI,GACAG,EACAD,EACAD,EACJ,EAEArG,EAAI6E,EAAIA,EAAKE,EAAIA,EAAK/E,EAEtB4E,EAAKA,EAAKI,EACNH,EAAKA,EAAKI,EACVH,EAAKA,EAAKI,EACVH,EAAKA,EAAKI,EAEdH,EAAKoB,GACDnB,EAAKoB,GACLnB,EAAKoB,EACLnB,EAAKoB,CACb,CASA,SAASW,GAASd,GAAIC,GAAIC,EAAIC,EAAI,CAC9BH,GAAKA,GAAK,EACVC,GAAKA,GAAK,EACVC,EAAKA,EAAK,EACVC,EAAKA,EAAK,EAEVJ,GACI,EAAQ,KAAQ,KAChBH,GACAhB,EACAC,EACAC,EACAC,CACJ,EAEAH,EAAKJ,EAAKA,EAAKwB,GACXnB,EAAKJ,EAAKA,EAAKwB,GACfnB,EAAKJ,EAAKA,EAAKwB,EACfnB,EAAKJ,EAAKA,EAAKwB,CACvB,CAUA,SAASY,GAASf,GAAIC,GAAIC,EAAIC,EAAI,CAC9BH,GAAKA,GAAK,EACVC,GAAKA,GAAK,EACVC,EAAKA,EAAK,EACVC,EAAKA,EAAK,EAEVJ,GACI,EAAQ,KAAQ,KAChBH,GACAhB,EACAC,EACAC,EACAC,CACJ,EAEAP,EAAKA,EAAKwB,GACNvB,EAAKA,EAAKwB,GACVvB,EAAKA,EAAKwB,EACVvB,EAAKA,EAAKwB,EAEdvB,EAAKoB,GACDnB,EAAKoB,GACLnB,EAAKoB,EACLnB,EAAKoB,CACb,CASA,SAASa,GAAKhB,GAAIC,GAAIC,EAAIC,EAAI,CAC1BH,GAAKA,GAAK,EACVC,GAAKA,GAAK,EACVC,EAAKA,EAAK,EACVC,EAAKA,EAAK,EAEVJ,GACI,EAAQ,KAAQ,KAChBH,GACAhB,EACAC,EACAC,EACAC,CACJ,EAEAH,EAAKJ,EACDK,EAAKJ,EACLK,EAAKJ,EACLK,EAAKJ,EAETH,EAAKA,EAAKwB,GACNvB,EAAKA,EAAKwB,GACVvB,EAAKA,EAAKwB,EACVvB,EAAKA,EAAKwB,CAClB,CASA,SAASc,GAAKjB,GAAIC,GAAIC,EAAIC,EAAI,CAC1BH,GAAKA,GAAK,EACVC,GAAKA,GAAK,EACVC,EAAKA,EAAK,EACVC,EAAKA,EAAK,EAEVJ,GACI,EAAQ,KAAQ,KAChBH,GACAZ,EACAC,EACAC,EACAC,CACJ,EAEAA,EAAM,CAACI,GAAKJ,EAAMI,GAAMJ,EAAK,EAC7BD,EAAM,CAACI,EAAKJ,EAAMI,EAAMJ,IAAOC,EAAK,IAAM,GAC1CF,EAAM,CAACI,EAAKJ,EAAMI,EAAMJ,IAAOC,EAAK,IAAM,GAC1CF,EAAM,CAACI,EAAKJ,EAAMI,EAAMJ,IAAOC,EAAK,IAAM,GAE1CT,EAAKA,EAAKwB,GACVvB,EAAKA,EAAKwB,GACVvB,EAAKA,EAAKwB,EACVvB,EAAKA,EAAKwB,CACd,CASA,SAASe,GAASlB,GAAIC,GAAIC,EAAIC,EAAI,CAC9BH,GAAKA,GAAK,EACVC,GAAKA,GAAK,EACVC,EAAKA,EAAK,EACVC,EAAKA,EAAK,EAEV,IAAIG,EAAK,EAAGC,GAAK,EAAGC,EAAK,EAAGC,EAAK,EAC7BU,EAAK,EAAGC,GAAK,EAAGC,GAAK,EAAGC,GAAK,EAC7BpJ,GAAI,EAAGE,GAAI,EAYf,IAVA4H,GAAKA,GAAKpB,EACNqB,GAAKA,GAAKpB,EACVqB,EAAKA,EAAKpB,EACVqB,EAAKA,EAAKpB,EAEduB,EAAKd,GAAK,EACNe,GAAKd,GAAK,EACVe,EAAKd,GAAK,EACVe,EAAKd,EAAK,GAENzH,GAAI,GAAK,IAAKA,GAAKA,GAAI,EAAK,EAC5BoI,IAAO,KACPa,EAAKA,EAAKnB,GACNoB,GAAKA,GAAKnB,GACVoB,GAAKA,GAAKnB,EACVoB,GAAKA,GAAKnB,GAGlBG,EAAMA,GAAM,EAAMC,KAAO,GACrBA,GAAMA,IAAM,EAAMC,IAAO,GACzBA,EAAMA,GAAM,EAAMC,IAAO,GACzBA,EAAMA,GAAM,EAEhBrI,GAAI+H,EAAK,EAETA,EAAMA,IAAO,EAAMD,GAAM,GACrBA,EAAMA,IAAO,EAAMD,IAAM,GACzBA,GAAMA,KAAO,EAAMD,IAAM,GACzBA,GAAMA,KAAO,EAEb5H,KAAG4H,GAAKA,GAAK,YAGrBpB,EAAKuC,EACDtC,EAAKuC,GACLtC,EAAKuC,GACLtC,EAAKuC,EACb,CAQA,SAASC,GAAW7H,GAAG,CACnBA,GAAIA,GAAI,EACRkG,GAAIlG,EACR,CAWA,SAAS8H,GAAUC,GAAIC,GAAIC,EAAIC,EAAI,CAC/BH,GAAKA,GAAK,EACVC,GAAKA,GAAK,EACVC,EAAKA,EAAK,EACVC,EAAKA,EAAK,EAEVpD,EAAKiD,GACDhD,EAAKiD,GACLhD,EAAKiD,EACLhD,EAAKiD,CACb,CAWA,SAASC,GAAOC,GAAIC,GAAIC,EAAIC,EAAI,CAC5BH,GAAKA,GAAK,EACVC,GAAKA,GAAK,EACVC,EAAKA,EAAK,EACVC,EAAKA,EAAK,EAEVrD,EAAKkD,GACDjD,EAAKkD,GACLjD,EAAKkD,EACLjD,EAAKkD,CACb,CAWA,SAASC,EAAUC,GAAIC,GAAIC,EAAIC,EAAI,CAC/BH,GAAKA,GAAK,EACVC,GAAKA,GAAK,EACVC,EAAKA,EAAK,EACVC,EAAKA,EAAK,EAEVtD,EAAKmD,GACDlD,EAAKmD,GACLlD,EAAKmD,EACLlD,EAAKmD,CACb,CAWA,SAASC,EAASC,GAAIC,GAAIC,EAAIC,EAAI,CAC9BH,GAAKA,GAAK,EACVC,GAAKA,GAAK,EACVC,EAAKA,EAAK,EACVC,EAAKA,EAAK,EAEVvD,EAAKoD,GACDnD,EAAKoD,GACLnD,EAAKoD,EACLnD,GAAKoD,CACb,CAWA,SAASC,GAAYC,GAAIC,GAAIC,EAAIC,EAAI,CACjCH,GAAKA,GAAK,EACVC,GAAKA,GAAK,EACVC,EAAKA,EAAK,EACVC,EAAKA,EAAK,EAEV7D,EAAM,CAACI,GAAKJ,EAAMI,GAAKyD,EACnB9D,EAAM,CAACI,EAAKJ,EAAMI,EAAKyD,EACvB9D,EAAM,CAACI,EAAKJ,EAAMI,EAAKyD,GACvB9D,EAAM,CAACI,EAAKJ,EAAMI,EAAKyD,EAC/B,CASA,SAASI,GAAUC,GAAK,CAGpB,OAFAA,GAAMA,GAAM,EAERA,GAAM,GAAW,IAErBpD,GAAKoD,GAAM,CAAC,EAAI1E,IAAO,GACnBsB,GAAKoD,GAAM,CAAC,EAAI1E,IAAO,GAAK,IAC5BsB,GAAKoD,GAAM,CAAC,EAAI1E,IAAO,EAAI,IAC3BsB,GAAKoD,GAAM,CAAC,EAAI1E,EAAK,IACrBsB,GAAKoD,GAAM,CAAC,EAAIzE,IAAO,GACvBqB,GAAKoD,GAAM,CAAC,EAAIzE,IAAO,GAAK,IAC5BqB,GAAKoD,GAAM,CAAC,EAAIzE,IAAO,EAAI,IAC3BqB,GAAKoD,GAAM,CAAC,EAAIzE,EAAK,IACrBqB,GAAKoD,GAAM,CAAC,EAAIxE,IAAO,GACvBoB,GAAKoD,GAAM,CAAC,EAAIxE,IAAO,GAAK,IAC5BoB,GAAKoD,GAAM,EAAE,EAAIxE,IAAO,EAAI,IAC5BoB,GAAKoD,GAAM,EAAE,EAAIxE,EAAK,IACtBoB,GAAKoD,GAAM,EAAE,EAAIvE,IAAO,GACxBmB,GAAKoD,GAAM,EAAE,EAAIvE,IAAO,GAAK,IAC7BmB,GAAKoD,GAAM,EAAE,EAAIvE,IAAO,EAAI,IAC5BmB,GAAKoD,GAAM,EAAE,EAAIvE,EAAK,IAEnB,GACX,CASA,SAASwE,GAAOD,GAAK,CAGjB,OAFAA,GAAMA,GAAM,EAERA,GAAM,GAAW,IAErBpD,GAAKoD,GAAM,CAAC,EAAItE,IAAO,GACnBkB,GAAKoD,GAAM,CAAC,EAAItE,IAAO,GAAK,IAC5BkB,GAAKoD,GAAM,CAAC,EAAItE,IAAO,EAAI,IAC3BkB,GAAKoD,GAAM,CAAC,EAAItE,EAAK,IACrBkB,GAAKoD,GAAM,CAAC,EAAIrE,IAAO,GACvBiB,GAAKoD,GAAM,CAAC,EAAIrE,IAAO,GAAK,IAC5BiB,GAAKoD,GAAM,CAAC,EAAIrE,IAAO,EAAI,IAC3BiB,GAAKoD,GAAM,CAAC,EAAIrE,EAAK,IACrBiB,GAAKoD,GAAM,CAAC,EAAIpE,IAAO,GACvBgB,GAAKoD,GAAM,CAAC,EAAIpE,IAAO,GAAK,IAC5BgB,GAAKoD,GAAM,EAAE,EAAIpE,IAAO,EAAI,IAC5BgB,GAAKoD,GAAM,EAAE,EAAIpE,EAAK,IACtBgB,GAAKoD,GAAM,EAAE,EAAInE,IAAO,GACxBe,GAAKoD,GAAM,EAAE,EAAInE,IAAO,GAAK,IAC7Be,GAAKoD,GAAM,EAAE,EAAInE,IAAO,EAAI,IAC5Be,GAAKoD,GAAM,EAAE,EAAInE,EAAK,IAEnB,GACX,CAOA,SAASqE,IAAW,CAChB1C,GAAS,EAAG,EAAG,EAAG,CAAC,EACnBlB,GAAKhB,EACDiB,GAAKhB,EACLiB,GAAKhB,EACLiB,EAAKhB,CACb,CAWA,SAAS0E,GAAOC,GAAMJ,GAAKlL,EAAK,CAC5BsL,GAAOA,GAAO,EACdJ,GAAMA,GAAM,EACZlL,EAAMA,EAAM,EAEZ,IAAIuL,EAAM,EAEV,GAAIL,GAAM,GAAI,MAAO,GAErB,MAAQlL,EAAM,IAAM,IAChBwL,GAAcF,GAAO,CAAC,EAClBxD,GAAKoD,GAAM,CAAC,GAAK,GAAKpD,GAAKoD,GAAM,CAAC,GAAK,GAAKpD,GAAKoD,GAAM,CAAC,GAAK,EAAIpD,GAAKoD,GAAM,CAAC,EAC7EpD,GAAKoD,GAAM,CAAC,GAAK,GAAKpD,GAAKoD,GAAM,CAAC,GAAK,GAAKpD,GAAKoD,GAAM,CAAC,GAAK,EAAIpD,GAAKoD,GAAM,CAAC,EAC7EpD,GAAKoD,GAAM,CAAC,GAAK,GAAKpD,GAAKoD,GAAM,CAAC,GAAK,GAAKpD,GAAKoD,GAAM,EAAE,GAAK,EAAIpD,GAAKoD,GAAM,EAAE,EAC/EpD,GAAKoD,GAAM,EAAE,GAAK,GAAKpD,GAAKoD,GAAM,EAAE,GAAK,GAAKpD,GAAKoD,GAAM,EAAE,GAAK,EAAIpD,GAAKoD,GAAM,EAAE,CACrF,EAEApD,GAAKoD,GAAM,CAAC,EAAI1E,IAAO,GACnBsB,GAAKoD,GAAM,CAAC,EAAI1E,IAAO,GAAK,IAC5BsB,GAAKoD,GAAM,CAAC,EAAI1E,IAAO,EAAI,IAC3BsB,GAAKoD,GAAM,CAAC,EAAI1E,EAAK,IACrBsB,GAAKoD,GAAM,CAAC,EAAIzE,IAAO,GACvBqB,GAAKoD,GAAM,CAAC,EAAIzE,IAAO,GAAK,IAC5BqB,GAAKoD,GAAM,CAAC,EAAIzE,IAAO,EAAI,IAC3BqB,GAAKoD,GAAM,CAAC,EAAIzE,EAAK,IACrBqB,GAAKoD,GAAM,CAAC,EAAIxE,IAAO,GACvBoB,GAAKoD,GAAM,CAAC,EAAIxE,IAAO,GAAK,IAC5BoB,GAAKoD,GAAM,EAAE,EAAIxE,IAAO,EAAI,IAC5BoB,GAAKoD,GAAM,EAAE,EAAIxE,EAAK,IACtBoB,GAAKoD,GAAM,EAAE,EAAIvE,IAAO,GACxBmB,GAAKoD,GAAM,EAAE,EAAIvE,IAAO,GAAK,IAC7BmB,GAAKoD,GAAM,EAAE,EAAIvE,IAAO,EAAI,IAC5BmB,GAAKoD,GAAM,EAAE,EAAIvE,EAAK,IAE1B4E,EAAOA,EAAM,GAAM,EACfL,GAAOA,GAAM,GAAM,EACnBlL,EAAOA,EAAM,GAAM,EAG3B,OAAOuL,EAAM,CACjB,CAWA,SAASE,GAAIH,GAAMJ,GAAKlL,EAAK,CACzBsL,GAAOA,GAAO,EACdJ,GAAMA,GAAM,EACZlL,EAAMA,EAAM,EAEZ,IAAIuL,EAAM,EAEV,GAAIL,GAAM,GAAI,MAAO,GAErB,MAAQlL,EAAM,IAAM,IAChB0L,GAAWJ,GAAO,CAAC,EACfxD,GAAKoD,GAAM,CAAC,GAAK,GAAKpD,GAAKoD,GAAM,CAAC,GAAK,GAAKpD,GAAKoD,GAAM,CAAC,GAAK,EAAIpD,GAAKoD,GAAM,CAAC,EAC7EpD,GAAKoD,GAAM,CAAC,GAAK,GAAKpD,GAAKoD,GAAM,CAAC,GAAK,GAAKpD,GAAKoD,GAAM,CAAC,GAAK,EAAIpD,GAAKoD,GAAM,CAAC,EAC7EpD,GAAKoD,GAAM,CAAC,GAAK,GAAKpD,GAAKoD,GAAM,CAAC,GAAK,GAAKpD,GAAKoD,GAAM,EAAE,GAAK,EAAIpD,GAAKoD,GAAM,EAAE,EAC/EpD,GAAKoD,GAAM,EAAE,GAAK,GAAKpD,GAAKoD,GAAM,EAAE,GAAK,GAAKpD,GAAKoD,GAAM,EAAE,GAAK,EAAIpD,GAAKoD,GAAM,EAAE,CACrF,EAEAK,EAAOA,EAAM,GAAM,EACfL,GAAOA,GAAM,GAAM,EACnBlL,EAAOA,EAAM,GAAM,EAG3B,OAAOuL,EAAM,CACjB,CAKA,IAAIC,GAAgB,CAAC9C,GAAUC,GAAUC,GAAUC,GAAUC,GAAUC,GAAUC,GAAMC,EAAI,EAKvFyC,GAAa,CAAC9C,GAAUM,EAAQ,EAKpC,MAAO,CACH,WAAYK,GACZ,UAAWC,GACX,OAAQK,GACR,UAAWK,EACX,SAAUK,EACV,YAAaK,GACb,UAAWK,GACX,OAAQE,GACR,SAAUC,GACV,OAAQC,GACR,IAAKI,EACT,CACJ,GAAElF,EAAQlB,EAASC,CAAM,EAEzB,OAAAgB,EAAI,QAAUf,EAEPe,CACX,EAOA,OAAAlB,EAAQ,IAAM,CACV,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,CACT,EAOIA,EAAQ,IAAM,CACV,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,CACT,EAOAA,EAAQ,IAAM,CACV,IAAK,EACL,IAAK,CACT,EAOJA,EAAQ,UAAY,MAEbA,CACX,GAAE,EAEEvC,KAAqB,UAAY,CACjC,SAASA,EAAI8I,EAAKC,EAAIC,EAASP,EAAM9K,EAAM8F,EAAK,CACxCuF,IAAY,SAAUA,EAAU,IACpC,KAAK,IAAM,EACX,KAAK,IAAM,EACX,KAAK,KAAOP,EAEZ,KAAK,KAAO9K,GAAcD,IAAW,EAAE,SAASqC,GAAQ,SAAS,EACjE,KAAK,IAAM0D,GAAY,IAAI1D,GAAQ,KAAM,KAAK,KAAK,MAAM,EAEzD,KAAK,IAAM,EACX,KAAK,IAAM,EAEX,IAAIkJ,EAASH,EAAI,OACjB,GAAIG,IAAW,IAAMA,IAAW,IAAMA,IAAW,GAC7C,MAAM,IAAIpJ,GAAqB,kBAAkB,EACrD,IAAIqJ,EAAU,IAAI,SAASJ,EAAI,OAAQA,EAAI,WAAYA,EAAI,UAAU,EAGrE,GAFA,KAAK,IAAI,QAAQG,GAAU,EAAGC,EAAQ,UAAU,CAAC,EAAGA,EAAQ,UAAU,CAAC,EAAGA,EAAQ,UAAU,CAAC,EAAGA,EAAQ,UAAU,EAAE,EAAGD,EAAS,GAAKC,EAAQ,UAAU,EAAE,EAAI,EAAGD,EAAS,GAAKC,EAAQ,UAAU,EAAE,EAAI,EAAGD,EAAS,GAAKC,EAAQ,UAAU,EAAE,EAAI,EAAGD,EAAS,GAAKC,EAAQ,UAAU,EAAE,EAAI,CAAC,EAErRH,IAAO,OAAW,CAClB,GAAIA,EAAG,SAAW,GACd,MAAM,IAAIlJ,GAAqB,iBAAiB,EACpD,IAAIsJ,EAAS,IAAI,SAASJ,EAAG,OAAQA,EAAG,WAAYA,EAAG,UAAU,EACjE,KAAK,IAAI,OAAOI,EAAO,UAAU,CAAC,EAAGA,EAAO,UAAU,CAAC,EAAGA,EAAO,UAAU,CAAC,EAAGA,EAAO,UAAU,EAAE,CAAC,CACvG,MAEI,KAAK,IAAI,OAAO,EAAG,EAAG,EAAG,CAAC,EAE9B,KAAK,QAAUH,CACnB,CACA,OAAAhJ,EAAI,UAAU,oBAAsB,SAAUhC,EAAM,CAChD,GAAI,CAACR,GAASQ,CAAI,EACd,MAAM,IAAI,UAAU,6BAA6B,EAarD,QAZIyF,EAAM,KAAK,IACX9F,EAAO,KAAK,KACZyL,EAAQrJ,GAAQ,IAAI,KAAK,IAAI,EAC7BhC,EAAOgC,GAAQ,UACfsI,EAAM,KAAK,IACXlL,EAAM,KAAK,IACXc,EAAO,EACPC,EAAOF,EAAK,QAAU,EACtBqL,EAAO,EACPC,EAAQnM,EAAMe,EAAQ,IACtBE,EAAO,EACPmL,EAAS,IAAI,WAAWD,CAAI,EACzBpL,EAAO,GACVE,EAAON,GAAYH,EAAM0K,EAAMlL,EAAKa,EAAMC,EAAMC,CAAI,EACpDf,GAAOiB,EACPH,GAAQG,EACRF,GAAQE,EACRA,EAAOqF,EAAI,OAAO2F,EAAOrL,EAAOsK,EAAKlL,CAAG,EACpCiB,GACAmL,EAAO,IAAI5L,EAAK,SAAS0K,EAAKA,EAAMjK,CAAI,EAAGiL,CAAI,EACnDA,GAAQjL,EACJA,EAAOjB,GACPkL,GAAOjK,EACPjB,GAAOiB,IAGPiK,EAAM,EACNlL,EAAM,GAGd,YAAK,IAAMkL,EACX,KAAK,IAAMlL,EACJoM,CACX,EACAvJ,EAAI,UAAU,mBAAqB,UAAY,CAC3C,IAAIyD,EAAM,KAAK,IACX9F,EAAO,KAAK,KACZyL,EAAQrJ,GAAQ,IAAI,KAAK,IAAI,EAC7BhC,EAAOgC,GAAQ,UACfsI,EAAM,KAAK,IACXlL,EAAM,KAAK,IACXqM,EAAO,GAAMrM,EAAM,GACnBmM,EAAOnM,EACX,GAAI,KAAK,eAAe,SAAS,GAC7B,GAAI,KAAK,QAAS,CACd,QAAS+D,EAAI,EAAGA,EAAIsI,EAAM,EAAEtI,EACxBvD,EAAK0K,EAAMlL,EAAM+D,CAAC,EAAIsI,EAE1BrM,GAAOqM,EACPF,EAAOnM,CACX,SACSA,EAAM,GACX,MAAM,IAAI0C,GAAqB,kDAAkD,OAIrF1C,GAAOqM,EAEX,IAAID,EAAS,IAAI,WAAWD,CAAI,EAChC,OAAInM,GACAsG,EAAI,OAAO2F,EAAOrL,EAAOsK,EAAKlL,CAAG,EACjCmM,GACAC,EAAO,IAAI5L,EAAK,SAAS0K,EAAKA,EAAMiB,CAAI,CAAC,EAC7C,KAAK,IAAM,EACX,KAAK,IAAM,EACJC,CACX,EACAvJ,EAAI,UAAU,oBAAsB,SAAUhC,EAAM,CAChD,GAAI,CAACR,GAASQ,CAAI,EACd,MAAM,IAAI,UAAU,6BAA6B,EACrD,IAAIyF,EAAM,KAAK,IACX9F,EAAO,KAAK,KACZyL,EAAQrJ,GAAQ,IAAI,KAAK,IAAI,EAC7BhC,EAAOgC,GAAQ,UACfsI,EAAM,KAAK,IACXlL,EAAM,KAAK,IACXc,EAAO,EACPC,EAAOF,EAAK,QAAU,EACtBqL,EAAO,EACPC,EAAQnM,EAAMe,EAAQ,IACtBsL,EAAO,EACPpL,EAAO,EACP,KAAK,UACLoL,EAAOrM,EAAMe,EAAOoL,GAAQ,GAC5BA,GAAQE,GAGZ,QADID,EAAS,IAAI,WAAWD,CAAI,EACzBpL,EAAO,GACVE,EAAON,GAAYH,EAAM0K,EAAMlL,EAAKa,EAAMC,EAAMC,CAAI,EACpDf,GAAOiB,EACPH,GAAQG,EACRF,GAAQE,EACRA,EAAOqF,EAAI,OAAO2F,EAAOrL,EAAOsK,EAAKlL,GAAQe,EAAc,EAAPsL,EAAS,EACzDpL,GACAmL,EAAO,IAAI5L,EAAK,SAAS0K,EAAKA,EAAMjK,CAAI,EAAGiL,CAAI,EACnDA,GAAQjL,EACJA,EAAOjB,GACPkL,GAAOjK,EACPjB,GAAOiB,IAGPiK,EAAM,EACNlL,EAAM,GAGd,YAAK,IAAMkL,EACX,KAAK,IAAMlL,EACJoM,CACX,EACAvJ,EAAI,UAAU,mBAAqB,UAAY,CAC3C,IAAIyD,EAAM,KAAK,IACX9F,EAAO,KAAK,KACZyL,EAAQrJ,GAAQ,IAAI,KAAK,IAAI,EAC7BhC,EAAOgC,GAAQ,UACfsI,EAAM,KAAK,IACXlL,EAAM,KAAK,IACXmM,EAAOnM,EACX,GAAIA,EAAM,EAAG,CACT,GAAIA,EAAM,GAAI,CACV,GAAI,KAAK,eAAe,SAAS,EAC7B,MAAM,IAAI0C,GAAqB,kDAAkD,EAGjF1C,GAAO,GAAMA,EAAM,EAE3B,CAEA,GADAsG,EAAI,OAAO2F,EAAOrL,EAAOsK,EAAKlL,CAAG,EAC7B,KAAK,eAAe,SAAS,GAAK,KAAK,QAAS,CAChD,IAAIsM,EAAM9L,EAAK0K,EAAMiB,EAAO,CAAC,EAC7B,GAAIG,EAAM,GAAKA,EAAM,IAAMA,EAAMH,EAC7B,MAAM,IAAIxJ,GAAc,aAAa,EAEzC,QADI4J,EAAS,EACJrM,EAAIoM,EAAKpM,EAAI,EAAGA,IACrBqM,GAAUD,EAAM9L,EAAK0K,EAAMiB,EAAOjM,CAAC,EACvC,GAAIqM,EACA,MAAM,IAAI5J,GAAc,aAAa,EACzCwJ,GAAQG,CACZ,CACJ,CACA,IAAIF,EAAS,IAAI,WAAWD,CAAI,EAChC,OAAIA,EAAO,GACPC,EAAO,IAAI5L,EAAK,SAAS0K,EAAKA,EAAMiB,CAAI,CAAC,EAE7C,KAAK,IAAM,EACX,KAAK,IAAM,EACJC,CACX,EACOvJ,CACX,GAAE,EAgBEC,IAA2B,MAC3BC,GAA0B,gBAC1BC,KAAyB,UAAY,CACrC,SAASA,EAAQ2I,EAAKa,EAAOC,EAAOC,EAASC,EAAYC,EAAK,CAM1D,GALIF,IAAY,SAAUA,EAAU,IACpC,KAAK,QAAU,EACf,KAAK,WAAa,GAClB,KAAK,IAAME,GAAY,IAAI/J,IAAI8I,EAAK,OAAW,OAAW,KAAK,EAE3De,EAAU,GAAKA,EAAU,IAAMA,EAAU,EACzC,MAAM,IAAIhK,GAAqB,uBAAuB,EAI1D,GAHA,KAAK,QAAUgK,EAEf,KAAK,MAAQF,EACTA,EAAM,OAAS,GAAKA,EAAM,OAAS,GACnC,MAAM,IAAI9J,GAAqB,sBAAsB,EAKzD,GAJA,KAAK,WAAa,GAAK8J,EAAM,OAC7BA,EAAQ,IAAI,WAAWA,EAAM,OAAS,CAAC,EACvCA,EAAM,CAAC,EAAI,KAAK,WAAa,EAC7BA,EAAM,IAAI,KAAK,MAAO,CAAC,EACnBG,EAAa,GAAKA,EAAa5J,IAA2B4J,EAAa,KAAK,IAAI,EAAG,EAAI,KAAK,UAAU,EAAI,GAC1G,MAAM,IAAIjK,GAAqB,0BAA0B,EAC7D,GAAI+J,IAAU,OAAW,CACrB,GAAIA,EAAM,OAAS3J,IACf,MAAM,IAAIJ,GAAqB,sBAAsB,EACzD,KAAK,MAAQ+J,EAAM,OAASA,EAAQ,MACxC,CACA,KAAK,WAAaE,EAClB,KAAK,QAAU,EACf,KAAK,qBAAqB,EAC1B,KAAK,oBAAoBH,EAAO,KAAK,QAAS,EAAI,KAAK,UAAU,CACrE,CACA,OAAAxJ,EAAQ,QAAU,SAAU6J,EAAOlB,EAAKa,EAAOC,EAAOK,EAAS,CAC3D,OAAIA,IAAY,SAAUA,EAAU,IAC7B,IAAI9J,EAAQ2I,EAAKa,EAAOC,EAAOK,EAASD,EAAM,MAAM,EAAE,QAAQA,CAAK,CAC9E,EACA7J,EAAQ,QAAU,SAAUqI,EAAQM,EAAKa,EAAOC,EAAOK,EAAS,CAC5D,OAAIA,IAAY,SAAUA,EAAU,IAC7B,IAAI9J,EAAQ2I,EAAKa,EAAOC,EAAOK,EAASzB,EAAO,OAASyB,CAAO,EAAE,QAAQzB,CAAM,CAC1F,EACArI,EAAQ,UAAU,QAAU,SAAUnC,EAAM,CACxC,KAAK,WAAaA,EAAK,QAAU,EACjC,IAAIkM,EAAU,KAAK,wBAAwBlM,CAAI,EAC3CmM,EAAU,KAAK,uBAAuB,EACtCZ,EAAS,IAAI,WAAWW,EAAQ,OAASC,EAAQ,MAAM,EAC3D,OAAID,EAAQ,QACRX,EAAO,IAAIW,CAAO,EAClBC,EAAQ,QACRZ,EAAO,IAAIY,EAASD,EAAQ,MAAM,EAC/BX,CACX,EACApJ,EAAQ,UAAU,QAAU,SAAUnC,EAAM,CACxC,KAAK,WAAaA,EAAK,QAAU,EACjC,IAAIkM,EAAU,KAAK,wBAAwBlM,CAAI,EAC3CmM,EAAU,KAAK,uBAAuB,EACtCZ,EAAS,IAAI,WAAWW,EAAQ,OAASC,EAAQ,MAAM,EAC3D,OAAID,EAAQ,QACRX,EAAO,IAAIW,CAAO,EAClBC,EAAQ,QACRZ,EAAO,IAAIY,EAASD,EAAQ,MAAM,EAC/BX,CACX,EACApJ,EAAQ,UAAU,qBAAuB,UAAY,CACjD,IAAIwJ,EAAQ,KAAK,MACbC,EAAQ,KAAK,MACbC,EAAU,KAAK,QACfO,EAAa,KAAK,WAClBN,EAAa,KAAK,WAClB9L,EAAO,IAAI,WAAW,IAAM4L,EAAQ,EAAIA,EAAM,OAAS,EAAE,EAE7D5L,EAAK,CAAC,GAAK4L,EAAQ,GAAK,GAAOC,EAAU,GAAM,EAAMO,EAAa,EAClEpM,EAAK,IAAI2L,EAAO,CAAC,EACbS,EAAa,IACbpM,EAAK,CAAC,EAAM8L,EAAa,aAAiB,GAAM,IAChDM,EAAa,IACbpM,EAAK,EAAE,EAAM8L,EAAa,aAAiB,EAAK,KAChDM,EAAa,IACbpM,EAAK,EAAE,EAAK8L,EAAa,WAAe,KACxCM,EAAa,IACbpM,EAAK,EAAE,EAAI8L,IAAe,IAC1BM,EAAa,IACbpM,EAAK,EAAE,EAAK8L,IAAe,GAAM,KACrC9L,EAAK,EAAE,EAAK8L,IAAe,EAAK,IAChC9L,EAAK,EAAE,EAAI8L,EAAa,IAEpBF,IACA5L,EAAK,EAAE,EAAK4L,EAAM,SAAW,EAAK,IAClC5L,EAAK,EAAE,EAAI4L,EAAM,OAAS,IAC1B5L,EAAK,IAAI4L,EAAO,EAAE,GAEtB,KAAK,iBAAiB5L,CAAI,EAC1B,KAAK,IAAI,IAAI,UAAU+B,GAAQ,SAAS,EACxC,IAAIgJ,EAAK,IAAI,WAAW,KAAK,IAAI,KAAK,SAAS,EAAG,EAAE,CAAC,EACjDI,EAAS,IAAI,SAASJ,EAAG,OAAQA,EAAG,WAAYA,EAAG,UAAU,EACjE,KAAK,IAAI,IAAI,OAAOI,EAAO,UAAU,CAAC,EAAGA,EAAO,UAAU,CAAC,EAAGA,EAAO,UAAU,CAAC,EAAGA,EAAO,UAAU,EAAE,CAAC,CAC3G,EACAhJ,EAAQ,UAAU,iBAAmB,SAAUnC,EAAM,CAMjD,QALIL,EAAO,KAAK,IAAI,KAChB8F,EAAM,KAAK,IAAI,IACfxF,EAAO,EACPC,EAAOF,EAAK,QAAU,EACtBI,EAAO,EACJF,EAAO,GAAG,CAEb,IADAE,EAAON,GAAYH,EAAM,EAAGK,EAAMC,EAAMC,CAAI,EACrCE,EAAO,IACVT,EAAKS,GAAM,EAAI,EACnBH,GAAQG,EACRF,GAAQE,EACRqF,EAAI,IAAI1D,GAAQ,IAAI,IAAKA,GAAQ,UAAW3B,CAAI,CACpD,CACJ,EACA+B,EAAQ,UAAU,wBAA0B,SAAUnC,EAAM,CACxD,IAAIyF,EAAM,KAAK,IAAI,IACf9F,EAAO,KAAK,IAAI,KAChBM,EAAO,EACPC,EAAOF,EAAK,QAAU,EACtBqM,EAAU,KAAK,QACfhC,EAAM,KAAK,IAAI,IACflL,EAAM,KAAK,IAAI,IACfmM,EAAQnM,EAAMe,EAAQ,IACtBmL,EAAO,EACPjL,EAAO,EACX,IAAMiM,EAAU,GAAM,GAAKlN,EAAMe,EAAOgC,GAEpC,MAAM,IAAI,WAAW,kBAAkB,EAE3C,QADIqJ,EAAS,IAAI,WAAWD,CAAI,EACzBpL,EAAO,GACVE,EAAON,GAAYH,EAAM0K,EAAMlL,EAAKa,EAAMC,EAAMC,CAAI,EACpDf,GAAOiB,EACPH,GAAQG,EACRF,GAAQE,EACRA,EAAOqF,EAAI,IAAI1D,GAAQ,IAAI,IAAKA,GAAQ,UAAYsI,EAAKlL,CAAG,EAC5DiB,EAAOqF,EAAI,OAAO1D,GAAQ,IAAI,IAAKA,GAAQ,UAAYsI,EAAKjK,CAAI,EAC5DA,GACAmL,EAAO,IAAI5L,EAAK,SAAS0K,EAAKA,EAAMjK,CAAI,EAAGiL,CAAI,EACnDgB,GAAWjM,IAAS,EACpBiL,GAAQjL,EACJA,EAAOjB,GACPkL,GAAOjK,EACPjB,GAAOiB,IAGPiK,EAAM,EACNlL,EAAM,GAGd,YAAK,QAAUkN,EACf,KAAK,IAAI,IAAMhC,EACf,KAAK,IAAI,IAAMlL,EACRoM,CACX,EACApJ,EAAQ,UAAU,uBAAyB,UAAY,CAQnD,QAPIsD,EAAM,KAAK,IAAI,IACf9F,EAAO,KAAK,IAAI,KAChBkM,EAAU,KAAK,QACfxB,EAAM,KAAK,IAAI,IACflL,EAAM,KAAK,IAAI,IACfoM,EAAS,IAAI,WAAWpM,EAAM0M,CAAO,EACrCxM,EAAIF,EACDE,EAAI,GAAIA,IACXM,EAAK0K,EAAMhL,CAAC,EAAI,EACpB,OAAAoG,EAAI,IAAI1D,GAAQ,IAAI,IAAKA,GAAQ,UAAYsI,EAAKhL,CAAC,EACnDoG,EAAI,OAAO1D,GAAQ,IAAI,IAAKA,GAAQ,UAAYsI,EAAKhL,CAAC,EAClDF,GACAoM,EAAO,IAAI5L,EAAK,SAAS0K,EAAKA,EAAMlL,CAAG,CAAC,EAC5CsG,EAAI,YAAY,EAAG,EAAG,EAAG,CAAC,EAC1BA,EAAI,OAAO1D,GAAQ,SAAS,EAC5B0D,EAAI,OAAO1D,GAAQ,IAAI,IAAKA,GAAQ,UAAW,EAAE,EACjDwJ,EAAO,IAAI5L,EAAK,SAAS,EAAGkM,CAAO,EAAG1M,CAAG,EACzC,KAAK,QAAU,EACf,KAAK,IAAI,IAAM,EACf,KAAK,IAAI,IAAM,EACRoM,CACX,EACApJ,EAAQ,UAAU,wBAA0B,SAAUnC,EAAM,CACxD,IAAIC,EAAO,EACPC,EAAOF,EAAK,QAAU,EACtByF,EAAM,KAAK,IAAI,IACf9F,EAAO,KAAK,IAAI,KAChB0M,EAAU,KAAK,QACfR,EAAU,KAAK,QACfxB,EAAM,KAAK,IAAI,IACflL,EAAM,KAAK,IAAI,IACfkM,EAAO,EACPC,EAAOnM,EAAMe,EAAO2L,EAAW1M,EAAMe,EAAO2L,EAAW,IAAM,EAC7DS,EAAOnN,EAAMe,EAAOoL,EACpBlL,EAAO,EACX,IAAMiM,EAAU,GAAM,GAAKlN,EAAMe,EAAOgC,GACpC,MAAM,IAAI,WAAW,kBAAkB,EAE3C,QADIqJ,EAAS,IAAI,WAAWD,CAAI,EACzBpL,EAAOoM,GACVlM,EAAON,GAAYH,EAAM0K,EAAMlL,EAAKa,EAAMC,EAAMC,EAAOoM,CAAI,EAC3DnN,GAAOiB,EACPH,GAAQG,EACRF,GAAQE,EACRA,EAAOqF,EAAI,OAAO1D,GAAQ,IAAI,IAAKA,GAAQ,UAAYsI,EAAKjK,CAAI,EAChEA,EAAOqF,EAAI,IAAI1D,GAAQ,IAAI,IAAKA,GAAQ,UAAYsI,EAAKjK,CAAI,EACzDA,GACAmL,EAAO,IAAI5L,EAAK,SAAS0K,EAAKA,EAAMjK,CAAI,EAAGiL,CAAI,EACnDgB,GAAWjM,IAAS,EACpBiL,GAAQjL,EACRiK,EAAM,EACNlL,EAAM,EAEV,OAAIe,EAAO,IACPf,GAAOW,GAAYH,EAAM,EAAGK,EAAMC,EAAMC,CAAI,GAEhD,KAAK,QAAUmM,EACf,KAAK,IAAI,IAAMhC,EACf,KAAK,IAAI,IAAMlL,EACRoM,CACX,EACApJ,EAAQ,UAAU,uBAAyB,UAAY,CACnD,IAAIsD,EAAM,KAAK,IAAI,IACf9F,EAAO,KAAK,IAAI,KAChBkM,EAAU,KAAK,QACfxB,EAAM,KAAK,IAAI,IACflL,EAAM,KAAK,IAAI,IACfmM,EAAOnM,EAAM0M,EACjB,GAAI1M,EAAM0M,EACN,MAAM,IAAIjK,IAAkB,8BAA8B,EAC9D,IAAI2J,EAAS,IAAI,WAAWD,CAAI,EAC5BiB,EAAO,IAAI,WAAW5M,EAAK,SAAS0K,EAAMiB,EAAMjB,EAAMlL,CAAG,CAAC,EAC9DsG,EAAI,OAAO1D,GAAQ,IAAI,IAAKA,GAAQ,UAAYsI,EAAMiB,EAAO,GAAM,GAAG,EACtEC,EAAO,IAAI5L,EAAK,SAAS0K,EAAKA,EAAMiB,CAAI,CAAC,EAEzC,QADIjM,EAAIiM,EACDjM,EAAI,GAAIA,IACXM,EAAK0K,EAAMhL,CAAC,EAAI,EACpBoG,EAAI,IAAI1D,GAAQ,IAAI,IAAKA,GAAQ,UAAYsI,EAAKhL,CAAC,EACnDoG,EAAI,YAAY,EAAG,EAAG,EAAG,CAAC,EAC1BA,EAAI,OAAO1D,GAAQ,SAAS,EAC5B0D,EAAI,OAAO1D,GAAQ,IAAI,IAAKA,GAAQ,UAAW,EAAE,EAEjD,QADIyK,EAAS,EACJlN,EAAI,EAAGA,EAAIuM,EAAS,EAAEvM,EAC3BkN,GAAUD,EAAKjN,CAAC,EAAIK,EAAKL,CAAC,EAG9B,YAAK,QAAU,EACf,KAAK,IAAI,IAAM,EACf,KAAK,IAAI,IAAM,EACRiM,CACX,EACApJ,EAAQ,UAAU,oBAAsB,SAAUwJ,EAAOU,EAASxM,EAAM,CACpE,GAAIA,EAAO,GAAKA,EAAO,GACnB,MAAM,IAAIgC,GAAqB,sBAAsB,EACzD,IAAI4K,EAAO,KAAK,IAAI,EAAG5M,CAAI,EAAI,EAC/B,KAAK,IAAI,IAAI,SAAS,EAAG,EAAI4M,EAAO,WAAe,EAAGA,EAAO,CAAC,EAC9D,IAAItN,EAAMwM,EAAM,OAChB,GAAI,CAACxM,GAAOA,EAAM,GACd,MAAM,IAAI0C,GAAqB,oBAAoB,EACvD,KAAK,MAAQ8J,EACb,IAAIe,EAAO,IAAI,SAAS,IAAI,YAAY,EAAE,CAAC,EAG3C,GAFA,IAAI,WAAWA,EAAK,MAAM,EAAE,IAAIf,CAAK,EACrC,KAAK,IAAI,IAAI,UAAUe,EAAK,UAAU,CAAC,EAAGA,EAAK,UAAU,CAAC,EAAGA,EAAK,UAAU,CAAC,EAAGA,EAAK,UAAU,EAAE,CAAC,EAC9FL,EAAU,GAAKA,GAAW,KAAK,IAAI,EAAGxM,CAAI,EAC1C,MAAM,IAAIgC,GAAqB,uBAAuB,EAC1D,KAAK,QAAUwK,EACf,KAAK,IAAI,IAAI,YAAY,EAAG,EAAIA,EAAU,WAAe,EAAGA,EAAU,CAAC,CAC3E,EACOlK,CACX,GAAE,EAOEC,GAAa,SAAUsD,EAAQlB,EAASC,EAAQ,CAGhD,IAAIkI,EAAK,EAELC,EAAS,IAAIlH,EAAO,YAAYjB,CAAM,EAEtCoI,EAAOnH,EAAO,KAAK,KAWvB,SAASoH,EAAO5J,EAAG,CACf,OAAAA,EAAIA,EAAI,EACRyJ,EAAKzJ,EAAKA,EAAI,GAAM,IACbA,EAAI,CACf,CAEA,SAAS6J,EAAOC,EAAG,CACfA,EAAIA,EAAI,EACR,IAAI9J,EAAI,EAAG,OAAAA,EAAIyJ,EACfA,EAAKzJ,GAAM8J,EAAI,GAAM,KAAO,EACrB9J,EAAI,CACf,CAEA,SAAS+J,EAAMD,EAAG,CACdA,EAAIA,EAAI,EACRL,EAAKA,GAAOK,EAAI,GAAM,KAAO,CACjC,CAQA,SAASE,EAAGF,EAAGG,EAAGC,EAAG,CACjBJ,EAAIA,EAAI,EACRG,EAAIA,EAAI,EACRC,EAAIA,EAAI,EAER,IAAI/N,EAAI,EAER,IAAK8N,EAAI,IAAMC,EAAI,GACf,MAAQ/N,EAAI,IAAM2N,EAAI,GAAI3N,EAAKA,EAAI,EAAK,EACpCuN,EAAQQ,EAAI/N,GAAM,CAAC,EAAIuN,EAAQO,EAAI9N,GAAM,CAAC,MAI9C,KAAKA,EAAK2N,EAAI,EAAK,GAAI3N,EAAI,IAAM,EAAGA,EAAKA,EAAI,EAAK,EAC9CuN,EAAQQ,EAAI/N,GAAM,CAAC,EAAIuN,EAAQO,EAAI9N,GAAM,CAAC,CAGtD,CAEA,SAASiC,EAAE0L,EAAG1L,EAAG6L,EAAG,CAChBH,EAAIA,EAAI,EACR1L,EAAIA,EAAI,EACR6L,EAAIA,EAAI,EAIR,QAFI9N,EAAI,GAEAA,EAAI,IAAM2N,EAAI,GAAI3N,EAAKA,EAAI,EAAK,EACpCuN,EAAQO,EAAI9N,GAAM,CAAC,EAAIiC,CAE/B,CAeA,SAAS+L,EAAIF,EAAGG,EAAIvG,EAAGwG,EAAI,CACvBJ,EAAIA,EAAI,EACRG,EAAKA,EAAK,EACVvG,EAAIA,EAAI,EACRwG,EAAKA,EAAK,EAEV,IAAI9N,EAAI,EAAGF,EAAI,EAAGwB,EAAI,EAAGF,EAAI,EAAGxB,EAAI,EASpC,KAPKkO,EAAK,IAAM,IACZA,EAAKD,IAEJC,EAAK,IAAMD,EAAK,KACjBA,EAAKC,GAEThO,EAAI,GACIF,EAAI,IAAMiO,EAAK,GAAIjO,EAAKA,EAAI,EAAK,EACrCI,EAAI,CAACmN,EAAQO,EAAI9N,GAAM,CAAC,EACxB0B,GAAKtB,EAAI,OAAUF,EAAI,EACvBsB,GAAKpB,IAAM,KAAOsB,IAAM,IAAM,EAC9B6L,EAAQ7F,EAAI1H,GAAM,CAAC,EAAKwB,GAAK,GAAOE,EAAI,MACxCxB,EAAIsB,IAAM,GAGd,MAAQxB,EAAI,IAAMkO,EAAK,GAAIlO,EAAKA,EAAI,EAAK,EACrCuN,EAAQ7F,EAAI1H,GAAM,CAAC,EAAKE,EAAI,EAAK,EAGrC,OAAOA,EAAI,CACf,CAEA,SAASiO,EAAIL,EAAGG,EAAIF,EAAGK,EAAI,CACvBN,EAAIA,EAAI,EACRG,EAAKA,EAAK,EACVF,EAAIA,EAAI,EACRK,EAAKA,EAAK,EAEV,IAAIhO,EAAI,EAAGa,EAAI,EAAGjB,EAAI,EAEtB,IAAKiO,EAAK,IAAMG,EAAK,IACjB,IAAKpO,EAAKiO,EAAK,EAAK,GAAIjO,EAAI,KAAOoO,EAAK,GAAIpO,EAAKA,EAAI,EAAK,EACtD,GAAIuN,EAAQO,EAAI9N,GAAM,CAAC,EAAI,EAAG,MAAO,OAIzC,KAAKA,EAAKoO,EAAK,EAAK,GAAIpO,EAAI,KAAOiO,EAAK,GAAIjO,EAAKA,EAAI,EAAK,EACtD,GAAIuN,EAAQQ,EAAI/N,GAAM,CAAC,EAAI,EAAG,MAAO,GAI7C,MAAQA,EAAI,IAAM,EAAGA,EAAKA,EAAI,EAAK,EAAG,CAElC,GADAI,EAAImN,EAAQO,EAAI9N,GAAM,CAAC,EAAI,EAAGiB,EAAIsM,EAAQQ,EAAI/N,GAAM,CAAC,EAAI,EACpDI,IAAM,EAAMa,IAAM,EAAI,MAAO,GAClC,GAAKb,IAAM,EAAMa,IAAM,EAAI,MAAO,EACtC,CAEA,MAAO,EACX,CAOA,SAASoN,EAAIP,EAAGG,EAAI,CAChBH,EAAIA,EAAI,EACRG,EAAKA,EAAK,EAEV,IAAIjO,EAAI,EAER,IAAKA,EAAKiO,EAAK,EAAK,GAAIjO,EAAI,IAAM,EAAGA,EAAKA,EAAI,EAAK,EAC/C,GAAIuN,EAAQO,EAAI9N,GAAM,CAAC,EAAI,EAAG,OAAQA,EAAI,EAAK,EAGnD,MAAO,EACX,CAcA,SAASsO,EAAIR,EAAGG,EAAIF,EAAGK,EAAI1G,EAAGwG,EAAI,CAC9BJ,EAAIA,EAAI,EACRG,EAAKA,EAAK,EACVF,EAAIA,EAAI,EACRK,EAAKA,EAAK,EACV1G,EAAIA,EAAI,EACRwG,EAAKA,EAAK,EAEV,IAAI9N,EAAI,EAAGa,EAAI,EAAGf,EAAI,EAAGwB,EAAI,EAAGF,EAAI,EAAGxB,EAAI,EAa3C,KAXKiO,EAAK,IAAMG,EAAK,KACjB1M,EAAIoM,EAAGA,EAAIC,EAAGA,EAAIrM,EAClBA,EAAIuM,EAAIA,EAAKG,EAAIA,EAAK1M,IAGrBwM,EAAK,IAAM,IACZA,EAAKD,EAAK,EAAI,IAEbC,EAAK,IAAME,EAAK,KACjBH,EAAKG,EAAKF,IAENlO,EAAI,IAAMoO,EAAK,GAAIpO,EAAKA,EAAI,EAAK,EACrCI,EAAImN,EAAQO,EAAI9N,GAAM,CAAC,EAAI,EAC3BiB,EAAIsM,EAAQQ,EAAI/N,GAAM,CAAC,EAAI,EAC3B0B,IAAMtB,EAAI,QAAWa,EAAI,OAAU,GAAKf,EAAI,EAC5CsB,IAAMpB,IAAM,KAAOa,IAAM,IAAM,IAAMS,IAAM,IAAM,EACjD6L,EAAQ7F,EAAI1H,GAAM,CAAC,EAAK0B,EAAI,MAAWF,GAAK,GAC5CtB,EAAIsB,IAAM,GAGd,MAAQxB,EAAI,IAAMiO,EAAK,GAAIjO,EAAKA,EAAI,EAAK,EACrCI,EAAImN,EAAQO,EAAI9N,GAAM,CAAC,EAAI,EAC3B0B,GAAKtB,EAAI,OAAUF,EAAI,EACvBsB,GAAKpB,IAAM,KAAOsB,IAAM,IAAM,EAC9B6L,EAAQ7F,EAAI1H,GAAM,CAAC,EAAK0B,EAAI,MAAWF,GAAK,GAC5CtB,EAAIsB,IAAM,GAGd,MAAQxB,EAAI,IAAMkO,EAAK,GAAIlO,EAAKA,EAAI,EAAK,EACrCuN,EAAQ7F,EAAI1H,GAAM,CAAC,EAAIE,EAAI,EAC3BA,EAAI,EAGR,OAAOA,EAAI,CACf,CAcA,SAASqO,EAAIT,EAAGG,EAAIF,EAAGK,EAAI1G,EAAGwG,EAAI,CAC9BJ,EAAIA,EAAI,EACRG,EAAKA,EAAK,EACVF,EAAIA,EAAI,EACRK,EAAKA,EAAK,EACV1G,EAAIA,EAAI,EACRwG,EAAKA,EAAK,EAEV,IAAI9N,EAAI,EAAGa,EAAI,EAAGf,EAAI,EAAGwB,EAAI,EAAGF,EAAI,EAAGxB,EAAI,EAW3C,IATKkO,EAAK,IAAM,IACZA,GAAMD,EAAK,IAAMG,EAAK,GAAKH,EAAK,EAAI,EAAIG,EAAK,EAAI,IAEhDF,EAAK,IAAMD,EAAK,KACjBA,EAAKC,IAEJA,EAAK,IAAME,EAAK,KACjBA,EAAKF,IAEJD,EAAK,IAAMG,EAAK,GAAI,CACrB,MAAQpO,EAAI,IAAMiO,EAAK,GAAIjO,EAAKA,EAAI,EAAK,EACrCI,EAAImN,EAAQO,EAAI9N,GAAM,CAAC,EAAI,EAC3BiB,EAAIsM,EAAQQ,EAAI/N,GAAM,CAAC,EAAI,EAC3B0B,IAAMtB,EAAI,QAAWa,EAAI,OAAU,GAAKf,EAAI,EAC5CsB,IAAMpB,IAAM,KAAOa,IAAM,IAAM,IAAMS,GAAK,IAAM,EAChD6L,EAAQ7F,EAAI1H,GAAM,CAAC,EAAK0B,EAAI,MAAWF,GAAK,GAC5CtB,EAAIsB,GAAK,GAGb,MAAQxB,EAAI,IAAMoO,EAAK,GAAIpO,EAAKA,EAAI,EAAK,EACrCiB,EAAIsM,EAAQQ,EAAI/N,GAAM,CAAC,EAAI,EAC3B0B,EAAIxB,GAAKe,EAAI,OAAU,EACvBO,GAAKE,GAAK,KAAOT,IAAM,IAAM,EAC7BsM,EAAQ7F,EAAI1H,GAAM,CAAC,EAAK0B,EAAI,MAAWF,GAAK,GAC5CtB,EAAIsB,GAAK,EAEjB,KACK,CACD,MAAQxB,EAAI,IAAMoO,EAAK,GAAIpO,EAAKA,EAAI,EAAK,EACrCI,EAAImN,EAAQO,EAAI9N,GAAM,CAAC,EAAI,EAC3BiB,EAAIsM,EAAQQ,EAAI/N,GAAM,CAAC,EAAI,EAC3B0B,IAAMtB,EAAI,QAAWa,EAAI,OAAU,GAAKf,EAAI,EAC5CsB,IAAMpB,IAAM,KAAOa,IAAM,IAAM,IAAMS,GAAK,IAAM,EAChD6L,EAAQ7F,EAAI1H,GAAM,CAAC,EAAK0B,EAAI,MAAWF,GAAK,GAC5CtB,EAAIsB,GAAK,GAGb,MAAQxB,EAAI,IAAMiO,EAAK,GAAIjO,EAAKA,EAAI,EAAK,EACrCI,EAAImN,EAAQO,EAAI9N,GAAM,CAAC,EAAI,EAC3B0B,GAAKtB,EAAI,OAAUF,EAAI,EACvBsB,GAAKpB,IAAM,KAAOsB,GAAK,IAAM,EAC7B6L,EAAQ7F,EAAI1H,GAAM,CAAC,EAAK0B,EAAI,MAAWF,GAAK,GAC5CtB,EAAIsB,GAAK,EAEjB,CAEA,MAAQxB,EAAI,IAAMkO,EAAK,GAAIlO,EAAKA,EAAI,EAAK,EACrCuN,EAAQ7F,EAAI1H,GAAM,CAAC,EAAIE,EAAI,EAG/B,OAAOA,EAAI,CACf,CAgBA,SAASsO,EAAIV,EAAGG,EAAIF,EAAGK,EAAI1G,EAAGwG,EAAI,CAC9BJ,EAAIA,EAAI,EACRG,EAAKA,EAAK,EACVF,EAAIA,EAAI,EACRK,EAAKA,EAAK,EACV1G,EAAIA,EAAI,EACRwG,EAAKA,EAAK,EAEV,IAAIO,EAAM,EAAGC,EAAM,EAAGC,EAAM,EAAGC,EAAM,EAAGC,EAAM,EAAGC,EAAM,EAAGC,EAAM,EAAGC,EAAM,EAAGC,EAAM,EAAGC,EAAM,EAAGC,EAAM,EAAGC,EAAM,EAAGC,GAAM,EAAGC,GAAM,EAAGC,GAAM,EAAGC,GAAM,EAC7IC,EAAM,EAAGC,GAAM,EAAGC,GAAM,EAAGC,GAAM,EAAGC,GAAM,EAAGC,GAAM,EAAGC,GAAM,EAAGC,GAAM,EAAGC,GAAM,EAAGC,GAAM,EAAGC,GAAM,EAAGC,GAAM,EAAGC,GAAM,EAAGC,GAAM,EAAGC,GAAM,EAAGC,GAAM,EAC7IC,GAAK,EAAGC,EAAK,EAAGC,EAAK,EAAGC,GAAK,EAAGC,GAAK,EAAGC,GAAK,EAAGC,GAAK,EAAGC,GAAK,EAAGC,GAAK,EAAGC,GAAK,EAAGC,GAAM,EAAGC,GAAM,EAAGC,GAAM,EAAGC,EAAM,EAAGC,EAAM,EAAGC,EAAM,EACnIC,GAAI,EAAGC,EAAI,EAAGC,EAAI,EAAGC,EAAI,EACzB5R,GAAI,EAAG6R,GAAK,EAAG5R,GAAI,EAAG6R,GAAK,EAAGC,GAAK,EAkBvC,KAhBK9D,EAAK,IAAMG,EAAK,KACjBqD,GAAI3D,EAAG4D,EAAIzD,EACXH,EAAIC,EAAGE,EAAKG,EACZL,EAAI0D,GAAGrD,EAAKsD,GAGhBE,EAAK3D,EAAKG,EAAM,GACVF,EAAK,IAAM0D,EAAI,IAAQ1D,EAAK,IAAM,IACpCA,EAAK0D,IAEJ1D,EAAK,IAAMD,EAAK,KACjBA,EAAKC,IAEJA,EAAK,IAAME,EAAK,KACjBA,EAAKF,IAEDlO,GAAI,IAAMiO,EAAK,GAAIjO,GAAKA,GAAI,GAAM,EAAG,CA8BzC,IA7BA6R,GAAM/D,EAAI9N,GAAK,EAEfiP,EAAM1B,GAAQsE,GAAK,IAAM,CAAC,EAAI,EAC1B3C,EAAM3B,GAAQsE,GAAK,IAAM,CAAC,EAAI,EAC9B1C,EAAM5B,GAAQsE,GAAK,IAAM,CAAC,EAAI,EAC9BzC,EAAM7B,GAAQsE,GAAK,KAAO,CAAC,EAAI,EAC/BxC,GAAM9B,GAAQsE,GAAK,KAAO,CAAC,EAAI,EAC/BvC,GAAM/B,GAAQsE,GAAK,KAAO,CAAC,EAAI,EAC/BtC,GAAMhC,GAAQsE,GAAK,KAAO,CAAC,EAAI,EAC/BrC,GAAMjC,GAAQsE,GAAK,KAAO,CAAC,EAAI,EAC/BpD,EAAMQ,EAAM,MACZP,EAAMQ,EAAM,MACZP,EAAMQ,EAAM,MACZP,EAAMQ,EAAM,MACZP,EAAMQ,GAAM,MACZP,EAAMQ,GAAM,MACZP,EAAMQ,GAAM,MACZP,EAAMQ,GAAM,MACZP,EAAMA,IAAQ,GACdC,EAAMA,IAAQ,GACdC,EAAMA,IAAQ,GACdC,EAAMA,IAAQ,GACdC,GAAMA,KAAQ,GACdC,GAAMA,KAAQ,GACdC,GAAMA,KAAQ,GACdC,GAAMA,KAAQ,GAElByB,GAAKC,GAAKC,GAAMC,GAAMC,GAAMC,EAAMC,EAAMC,EAAM,EAEzCvR,GAAI,GAAIA,GAAI,IAAMmO,EAAK,GAAInO,GAAKA,GAAI,GAAM,EAC3C6R,GAAM/D,EAAI9N,GAAK,EACf8R,GAAMrK,GAAK1H,GAAIC,GAAI,GAAM,EAEzBgQ,GAAM1C,GAAQuE,GAAK,IAAM,CAAC,EAAI,EAC1B5B,GAAM3C,GAAQuE,GAAK,IAAM,CAAC,EAAI,EAC9B3B,GAAM5C,GAAQuE,GAAK,IAAM,CAAC,EAAI,EAC9B1B,GAAM7C,GAAQuE,GAAK,KAAO,CAAC,EAAI,EAC/BzB,GAAM9C,GAAQuE,GAAK,KAAO,CAAC,EAAI,EAC/BxB,GAAM/C,GAAQuE,GAAK,KAAO,CAAC,EAAI,EAC/BvB,GAAMhD,GAAQuE,GAAK,KAAO,CAAC,EAAI,EAC/BtB,GAAMjD,GAAQuE,GAAK,KAAO,CAAC,EAAI,EAC/BrC,EAAMQ,GAAM,MACZP,GAAMQ,GAAM,MACZP,GAAMQ,GAAM,MACZP,GAAMQ,GAAM,MACZP,GAAMQ,GAAM,MACZP,GAAMQ,GAAM,MACZP,GAAMQ,GAAM,MACZP,GAAMQ,GAAM,MACZP,GAAMA,KAAQ,GACdC,GAAMA,KAAQ,GACdC,GAAMA,KAAQ,GACdC,GAAMA,KAAQ,GACdC,GAAMA,KAAQ,GACdC,GAAMA,KAAQ,GACdC,GAAMA,KAAQ,GACdC,GAAMA,KAAQ,GAElBC,GAAKlD,GAAQwE,GAAK,IAAM,CAAC,EAAI,EACzBrB,EAAKnD,GAAQwE,GAAK,IAAM,CAAC,EAAI,EAC7BpB,EAAKpD,GAAQwE,GAAK,IAAM,CAAC,EAAI,EAC7BnB,GAAKrD,GAAQwE,GAAK,KAAO,CAAC,EAAI,EAC9BlB,GAAKtD,GAAQwE,GAAK,KAAO,CAAC,EAAI,EAC9BjB,GAAKvD,GAAQwE,GAAK,KAAO,CAAC,EAAI,EAC9BhB,GAAKxD,GAAQwE,GAAK,KAAO,CAAC,EAAI,EAC9Bf,GAAKzD,GAAQwE,GAAK,KAAO,CAAC,EAAI,EAElCN,KAAMjE,EAAKiB,EAAKgB,CAAG,EAAI,IAAMwB,GAAK,OAAU,IAAMR,GAAK,OAAU,EACjEiB,IAAMlE,EAAKyB,EAAKQ,CAAG,EAAI,IAAMwB,KAAO,IAAM,IAAMR,KAAO,IAAM,EAC7DkB,IAAMnE,EAAKiB,EAAKwB,EAAG,EAAI,IAAMyB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAKyB,EAAKgB,EAAG,EAAI,IAAMyB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DlB,GAAMkB,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKiB,EAAKiB,EAAG,EAAI,IAAMkC,EAAI,OAAU,IAAMlB,EAAK,OAAU,EAChEgB,IAAMlE,EAAKyB,EAAKS,EAAG,EAAI,IAAMkC,IAAM,IAAM,IAAMlB,IAAO,IAAM,EAC5DiB,IAAMnE,EAAKiB,EAAKyB,EAAG,EAAI,IAAMwB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAKyB,EAAKiB,EAAG,EAAI,IAAMwB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DjB,EAAMiB,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKiB,EAAKkB,EAAG,EAAI,IAAMiC,EAAI,OAAU,IAAMjB,EAAK,OAAU,EAChEe,IAAMlE,EAAKyB,EAAKU,EAAG,EAAI,IAAMiC,IAAM,IAAM,IAAMjB,IAAO,IAAM,EAC5DgB,IAAMnE,EAAKiB,EAAK0B,EAAG,EAAI,IAAMuB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAKyB,EAAKkB,EAAG,EAAI,IAAMuB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DhB,EAAMgB,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKiB,EAAKmB,EAAG,EAAI,IAAMgC,EAAI,OAAU,IAAMhB,GAAK,OAAU,EAChEc,IAAMlE,EAAKyB,EAAKW,EAAG,EAAI,IAAMgC,IAAM,IAAM,IAAMhB,KAAO,IAAM,EAC5De,IAAMnE,EAAKiB,EAAK2B,EAAG,EAAI,IAAMsB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAKyB,EAAKmB,EAAG,EAAI,IAAMsB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Df,GAAMe,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKiB,EAAKoB,EAAG,EAAI,IAAM+B,EAAI,OAAU,IAAMf,GAAK,OAAU,EAChEa,IAAMlE,EAAKyB,EAAKY,EAAG,EAAI,IAAM+B,IAAM,IAAM,IAAMf,KAAO,IAAM,EAC5Dc,IAAMnE,EAAKiB,EAAK4B,EAAG,EAAI,IAAMqB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAKyB,EAAKoB,EAAG,EAAI,IAAMqB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Dd,GAAMc,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKiB,EAAKqB,EAAG,EAAI,IAAM8B,EAAI,OAAU,IAAMd,GAAK,OAAU,EAChEY,IAAMlE,EAAKyB,EAAKa,EAAG,EAAI,IAAM8B,IAAM,IAAM,IAAMd,KAAO,IAAM,EAC5Da,IAAMnE,EAAKiB,EAAK6B,EAAG,EAAI,IAAMoB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAKyB,EAAKqB,EAAG,EAAI,IAAMoB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Db,GAAMa,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKiB,EAAKsB,EAAG,EAAI,IAAM6B,EAAI,OAAU,IAAMb,GAAK,OAAU,EAChEW,IAAMlE,EAAKyB,EAAKc,EAAG,EAAI,IAAM6B,IAAM,IAAM,IAAMb,KAAO,IAAM,EAC5DY,IAAMnE,EAAKiB,EAAK8B,EAAG,EAAI,IAAMmB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAKyB,EAAKsB,EAAG,EAAI,IAAMmB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DZ,GAAMY,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKiB,EAAKuB,EAAG,EAAI,IAAM4B,EAAI,OAAU,IAAMZ,GAAK,OAAU,EAChEU,IAAMlE,EAAKyB,EAAKe,EAAG,EAAI,IAAM4B,IAAM,IAAM,IAAMZ,KAAO,IAAM,EAC5DW,IAAMnE,EAAKiB,EAAK+B,EAAG,EAAI,IAAMkB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAKyB,EAAKuB,EAAG,EAAI,IAAMkB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DX,GAAMW,GAAK,GAAOF,GAAI,MAEtBR,GAAKW,EAELH,KAAMjE,EAAKkB,EAAKe,CAAG,EAAI,IAAMyB,GAAK,OAAU,IAAMR,EAAK,OAAU,EACjEgB,IAAMlE,EAAK0B,EAAKO,CAAG,EAAI,IAAMyB,KAAO,IAAM,IAAMR,IAAO,IAAM,EAC7DiB,IAAMnE,EAAKkB,EAAKuB,EAAG,EAAI,IAAMyB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK0B,EAAKe,EAAG,EAAI,IAAMyB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DjB,EAAMiB,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKkB,EAAKgB,EAAG,EAAI,IAAMkC,EAAI,OAAU,IAAMjB,EAAK,OAAU,EAChEe,IAAMlE,EAAK0B,EAAKQ,EAAG,EAAI,IAAMkC,IAAM,IAAM,IAAMjB,IAAO,IAAM,EAC5DgB,IAAMnE,EAAKkB,EAAKwB,EAAG,EAAI,IAAMwB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK0B,EAAKgB,EAAG,EAAI,IAAMwB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DhB,EAAMgB,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKkB,EAAKiB,EAAG,EAAI,IAAMiC,EAAI,OAAU,IAAMhB,GAAK,OAAU,EAChEc,IAAMlE,EAAK0B,EAAKS,EAAG,EAAI,IAAMiC,IAAM,IAAM,IAAMhB,KAAO,IAAM,EAC5De,IAAMnE,EAAKkB,EAAKyB,EAAG,EAAI,IAAMuB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK0B,EAAKiB,EAAG,EAAI,IAAMuB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Df,GAAMe,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKkB,EAAKkB,EAAG,EAAI,IAAMgC,EAAI,OAAU,IAAMf,GAAK,OAAU,EAChEa,IAAMlE,EAAK0B,EAAKU,EAAG,EAAI,IAAMgC,IAAM,IAAM,IAAMf,KAAO,IAAM,EAC5Dc,IAAMnE,EAAKkB,EAAK0B,EAAG,EAAI,IAAMsB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK0B,EAAKkB,EAAG,EAAI,IAAMsB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Dd,GAAMc,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKkB,EAAKmB,EAAG,EAAI,IAAM+B,EAAI,OAAU,IAAMd,GAAK,OAAU,EAChEY,IAAMlE,EAAK0B,EAAKW,EAAG,EAAI,IAAM+B,IAAM,IAAM,IAAMd,KAAO,IAAM,EAC5Da,IAAMnE,EAAKkB,EAAK2B,EAAG,EAAI,IAAMqB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK0B,EAAKmB,EAAG,EAAI,IAAMqB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Db,GAAMa,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKkB,EAAKoB,EAAG,EAAI,IAAM8B,EAAI,OAAU,IAAMb,GAAK,OAAU,EAChEW,IAAMlE,EAAK0B,EAAKY,EAAG,EAAI,IAAM8B,IAAM,IAAM,IAAMb,KAAO,IAAM,EAC5DY,IAAMnE,EAAKkB,EAAK4B,EAAG,EAAI,IAAMoB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK0B,EAAKoB,EAAG,EAAI,IAAMoB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DZ,GAAMY,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKkB,EAAKqB,EAAG,EAAI,IAAM6B,EAAI,OAAU,IAAMZ,GAAK,OAAU,EAChEU,IAAMlE,EAAK0B,EAAKa,EAAG,EAAI,IAAM6B,IAAM,IAAM,IAAMZ,KAAO,IAAM,EAC5DW,IAAMnE,EAAKkB,EAAK6B,EAAG,EAAI,IAAMmB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK0B,EAAKqB,EAAG,EAAI,IAAMmB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DX,GAAMW,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKkB,EAAKsB,EAAG,EAAI,IAAM4B,EAAI,OAAU,IAAMX,GAAK,OAAU,EAChES,IAAMlE,EAAK0B,EAAKc,EAAG,EAAI,IAAM4B,IAAM,IAAM,IAAMX,KAAO,IAAM,EAC5DU,IAAMnE,EAAKkB,EAAK8B,EAAG,EAAI,IAAMkB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK0B,EAAKsB,EAAG,EAAI,IAAMkB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DV,GAAMU,GAAK,GAAOF,GAAI,MAEtBP,GAAKU,EAELH,KAAMjE,EAAKmB,EAAKc,CAAG,EAAI,IAAM0B,GAAM,OAAU,IAAMR,EAAK,OAAU,EAClEe,IAAMlE,EAAK2B,EAAKM,CAAG,EAAI,IAAM0B,KAAQ,IAAM,IAAMR,IAAO,IAAM,EAC9DgB,IAAMnE,EAAKmB,EAAKsB,EAAG,EAAI,IAAMyB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK2B,EAAKc,EAAG,EAAI,IAAMyB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DhB,EAAMgB,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKmB,EAAKe,EAAG,EAAI,IAAMkC,EAAI,OAAU,IAAMhB,GAAK,OAAU,EAChEc,IAAMlE,EAAK2B,EAAKO,EAAG,EAAI,IAAMkC,IAAM,IAAM,IAAMhB,KAAO,IAAM,EAC5De,IAAMnE,EAAKmB,EAAKuB,EAAG,EAAI,IAAMwB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK2B,EAAKe,EAAG,EAAI,IAAMwB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Df,GAAMe,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKmB,EAAKgB,EAAG,EAAI,IAAMiC,EAAI,OAAU,IAAMf,GAAK,OAAU,EAChEa,IAAMlE,EAAK2B,EAAKQ,EAAG,EAAI,IAAMiC,IAAM,IAAM,IAAMf,KAAO,IAAM,EAC5Dc,IAAMnE,EAAKmB,EAAKwB,EAAG,EAAI,IAAMuB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK2B,EAAKgB,EAAG,EAAI,IAAMuB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Dd,GAAMc,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKmB,EAAKiB,EAAG,EAAI,IAAMgC,EAAI,OAAU,IAAMd,GAAK,OAAU,EAChEY,IAAMlE,EAAK2B,EAAKS,EAAG,EAAI,IAAMgC,IAAM,IAAM,IAAMd,KAAO,IAAM,EAC5Da,IAAMnE,EAAKmB,EAAKyB,EAAG,EAAI,IAAMsB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK2B,EAAKiB,EAAG,EAAI,IAAMsB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Db,GAAMa,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKmB,EAAKkB,EAAG,EAAI,IAAM+B,EAAI,OAAU,IAAMb,GAAK,OAAU,EAChEW,IAAMlE,EAAK2B,EAAKU,EAAG,EAAI,IAAM+B,IAAM,IAAM,IAAMb,KAAO,IAAM,EAC5DY,IAAMnE,EAAKmB,EAAK0B,EAAG,EAAI,IAAMqB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK2B,EAAKkB,EAAG,EAAI,IAAMqB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DZ,GAAMY,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKmB,EAAKmB,EAAG,EAAI,IAAM8B,EAAI,OAAU,IAAMZ,GAAK,OAAU,EAChEU,IAAMlE,EAAK2B,EAAKW,EAAG,EAAI,IAAM8B,IAAM,IAAM,IAAMZ,KAAO,IAAM,EAC5DW,IAAMnE,EAAKmB,EAAK2B,EAAG,EAAI,IAAMoB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK2B,EAAKmB,EAAG,EAAI,IAAMoB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DX,GAAMW,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKmB,EAAKoB,EAAG,EAAI,IAAM6B,EAAI,OAAU,IAAMX,GAAK,OAAU,EAChES,IAAMlE,EAAK2B,EAAKY,EAAG,EAAI,IAAM6B,IAAM,IAAM,IAAMX,KAAO,IAAM,EAC5DU,IAAMnE,EAAKmB,EAAK4B,EAAG,EAAI,IAAMmB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK2B,EAAKoB,EAAG,EAAI,IAAMmB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DV,GAAMU,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKmB,EAAKqB,EAAG,EAAI,IAAM4B,EAAI,OAAU,IAAMV,GAAK,OAAU,EAChEQ,IAAMlE,EAAK2B,EAAKa,EAAG,EAAI,IAAM4B,IAAM,IAAM,IAAMV,KAAO,IAAM,EAC5DS,IAAMnE,EAAKmB,EAAK6B,EAAG,EAAI,IAAMkB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK2B,EAAKqB,EAAG,EAAI,IAAMkB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DT,GAAMS,GAAK,GAAOF,GAAI,MAEtBN,GAAMS,EAENH,KAAMjE,EAAKoB,EAAKa,CAAG,EAAI,IAAM2B,GAAM,OAAU,IAAMR,GAAK,OAAU,EAClEc,IAAMlE,EAAK4B,EAAKK,CAAG,EAAI,IAAM2B,KAAQ,IAAM,IAAMR,KAAO,IAAM,EAC9De,IAAMnE,EAAKoB,EAAKqB,EAAG,EAAI,IAAMyB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK4B,EAAKa,EAAG,EAAI,IAAMyB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Df,GAAMe,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKoB,EAAKc,EAAG,EAAI,IAAMkC,EAAI,OAAU,IAAMf,GAAK,OAAU,EAChEa,IAAMlE,EAAK4B,EAAKM,EAAG,EAAI,IAAMkC,IAAM,IAAM,IAAMf,KAAO,IAAM,EAC5Dc,IAAMnE,EAAKoB,EAAKsB,EAAG,EAAI,IAAMwB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK4B,EAAKc,EAAG,EAAI,IAAMwB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Dd,GAAMc,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKoB,EAAKe,EAAG,EAAI,IAAMiC,EAAI,OAAU,IAAMd,GAAK,OAAU,EAChEY,IAAMlE,EAAK4B,EAAKO,EAAG,EAAI,IAAMiC,IAAM,IAAM,IAAMd,KAAO,IAAM,EAC5Da,IAAMnE,EAAKoB,EAAKuB,EAAG,EAAI,IAAMuB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK4B,EAAKe,EAAG,EAAI,IAAMuB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Db,GAAMa,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKoB,EAAKgB,EAAG,EAAI,IAAMgC,EAAI,OAAU,IAAMb,GAAK,OAAU,EAChEW,IAAMlE,EAAK4B,EAAKQ,EAAG,EAAI,IAAMgC,IAAM,IAAM,IAAMb,KAAO,IAAM,EAC5DY,IAAMnE,EAAKoB,EAAKwB,EAAG,EAAI,IAAMsB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK4B,EAAKgB,EAAG,EAAI,IAAMsB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DZ,GAAMY,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKoB,EAAKiB,EAAG,EAAI,IAAM+B,EAAI,OAAU,IAAMZ,GAAK,OAAU,EAChEU,IAAMlE,EAAK4B,EAAKS,EAAG,EAAI,IAAM+B,IAAM,IAAM,IAAMZ,KAAO,IAAM,EAC5DW,IAAMnE,EAAKoB,EAAKyB,EAAG,EAAI,IAAMqB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK4B,EAAKiB,EAAG,EAAI,IAAMqB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DX,GAAMW,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKoB,EAAKkB,EAAG,EAAI,IAAM8B,EAAI,OAAU,IAAMX,GAAK,OAAU,EAChES,IAAMlE,EAAK4B,EAAKU,EAAG,EAAI,IAAM8B,IAAM,IAAM,IAAMX,KAAO,IAAM,EAC5DU,IAAMnE,EAAKoB,EAAK0B,EAAG,EAAI,IAAMoB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK4B,EAAKkB,EAAG,EAAI,IAAMoB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DV,GAAMU,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKoB,EAAKmB,EAAG,EAAI,IAAM6B,EAAI,OAAU,IAAMV,GAAK,OAAU,EAChEQ,IAAMlE,EAAK4B,EAAKW,EAAG,EAAI,IAAM6B,IAAM,IAAM,IAAMV,KAAO,IAAM,EAC5DS,IAAMnE,EAAKoB,EAAK2B,EAAG,EAAI,IAAMmB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK4B,EAAKmB,EAAG,EAAI,IAAMmB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DT,GAAMS,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKoB,EAAKoB,EAAG,EAAI,IAAM4B,EAAI,OAAU,IAAMT,GAAM,OAAU,EACjEO,IAAMlE,EAAK4B,EAAKY,EAAG,EAAI,IAAM4B,IAAM,IAAM,IAAMT,KAAQ,IAAM,EAC7DQ,IAAMnE,EAAKoB,EAAK4B,EAAG,EAAI,IAAMkB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK4B,EAAKoB,EAAG,EAAI,IAAMkB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DR,GAAOQ,GAAK,GAAOF,GAAI,MAEvBL,GAAMQ,EAENH,KAAMjE,EAAKqB,EAAKY,CAAG,EAAI,IAAM4B,GAAM,OAAU,IAAMR,GAAK,OAAU,EAClEa,IAAMlE,EAAK6B,GAAKI,CAAG,EAAI,IAAM4B,KAAQ,IAAM,IAAMR,KAAO,IAAM,EAC9Dc,IAAMnE,EAAKqB,EAAKoB,EAAG,EAAI,IAAMyB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK6B,GAAKY,EAAG,EAAI,IAAMyB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Dd,GAAMc,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKqB,EAAKa,EAAG,EAAI,IAAMkC,EAAI,OAAU,IAAMd,GAAK,OAAU,EAChEY,IAAMlE,EAAK6B,GAAKK,EAAG,EAAI,IAAMkC,IAAM,IAAM,IAAMd,KAAO,IAAM,EAC5Da,IAAMnE,EAAKqB,EAAKqB,EAAG,EAAI,IAAMwB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK6B,GAAKa,EAAG,EAAI,IAAMwB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Db,GAAMa,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKqB,EAAKc,EAAG,EAAI,IAAMiC,EAAI,OAAU,IAAMb,GAAK,OAAU,EAChEW,IAAMlE,EAAK6B,GAAKM,EAAG,EAAI,IAAMiC,IAAM,IAAM,IAAMb,KAAO,IAAM,EAC5DY,IAAMnE,EAAKqB,EAAKsB,EAAG,EAAI,IAAMuB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK6B,GAAKc,EAAG,EAAI,IAAMuB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DZ,GAAMY,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKqB,EAAKe,EAAG,EAAI,IAAMgC,EAAI,OAAU,IAAMZ,GAAK,OAAU,EAChEU,IAAMlE,EAAK6B,GAAKO,EAAG,EAAI,IAAMgC,IAAM,IAAM,IAAMZ,KAAO,IAAM,EAC5DW,IAAMnE,EAAKqB,EAAKuB,EAAG,EAAI,IAAMsB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK6B,GAAKe,EAAG,EAAI,IAAMsB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DX,GAAMW,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKqB,EAAKgB,EAAG,EAAI,IAAM+B,EAAI,OAAU,IAAMX,GAAK,OAAU,EAChES,IAAMlE,EAAK6B,GAAKQ,EAAG,EAAI,IAAM+B,IAAM,IAAM,IAAMX,KAAO,IAAM,EAC5DU,IAAMnE,EAAKqB,EAAKwB,EAAG,EAAI,IAAMqB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK6B,GAAKgB,EAAG,EAAI,IAAMqB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DV,GAAMU,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKqB,EAAKiB,EAAG,EAAI,IAAM8B,EAAI,OAAU,IAAMV,GAAK,OAAU,EAChEQ,IAAMlE,EAAK6B,GAAKS,EAAG,EAAI,IAAM8B,IAAM,IAAM,IAAMV,KAAO,IAAM,EAC5DS,IAAMnE,EAAKqB,EAAKyB,EAAG,EAAI,IAAMoB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK6B,GAAKiB,EAAG,EAAI,IAAMoB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DT,GAAMS,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKqB,EAAKkB,EAAG,EAAI,IAAM6B,EAAI,OAAU,IAAMT,GAAM,OAAU,EACjEO,IAAMlE,EAAK6B,GAAKU,EAAG,EAAI,IAAM6B,IAAM,IAAM,IAAMT,KAAQ,IAAM,EAC7DQ,IAAMnE,EAAKqB,EAAK0B,EAAG,EAAI,IAAMmB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK6B,GAAKkB,EAAG,EAAI,IAAMmB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DR,GAAOQ,GAAK,GAAOF,GAAI,MAEvBA,KAAMjE,EAAKqB,EAAKmB,EAAG,EAAI,IAAM4B,EAAI,OAAU,IAAMR,GAAM,OAAU,EACjEM,IAAMlE,EAAK6B,GAAKW,EAAG,EAAI,IAAM4B,IAAM,IAAM,IAAMR,KAAQ,IAAM,EAC7DO,IAAMnE,EAAKqB,EAAK2B,EAAG,EAAI,IAAMkB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK6B,GAAKmB,EAAG,EAAI,IAAMkB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DP,GAAOO,GAAK,GAAOF,GAAI,MAEvBJ,GAAMO,EAENH,KAAMjE,EAAKsB,EAAKW,CAAG,EAAI,IAAM6B,EAAM,OAAU,IAAMR,GAAK,OAAU,EAClEY,IAAMlE,EAAK8B,GAAKG,CAAG,EAAI,IAAM6B,IAAQ,IAAM,IAAMR,KAAO,IAAM,EAC9Da,IAAMnE,EAAKsB,EAAKmB,EAAG,EAAI,IAAMyB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK8B,GAAKW,EAAG,EAAI,IAAMyB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Db,GAAMa,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKsB,EAAKY,EAAG,EAAI,IAAMkC,EAAI,OAAU,IAAMb,GAAK,OAAU,EAChEW,IAAMlE,EAAK8B,GAAKI,EAAG,EAAI,IAAMkC,IAAM,IAAM,IAAMb,KAAO,IAAM,EAC5DY,IAAMnE,EAAKsB,EAAKoB,EAAG,EAAI,IAAMwB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK8B,GAAKY,EAAG,EAAI,IAAMwB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DZ,GAAMY,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKsB,EAAKa,EAAG,EAAI,IAAMiC,EAAI,OAAU,IAAMZ,GAAK,OAAU,EAChEU,IAAMlE,EAAK8B,GAAKK,EAAG,EAAI,IAAMiC,IAAM,IAAM,IAAMZ,KAAO,IAAM,EAC5DW,IAAMnE,EAAKsB,EAAKqB,EAAG,EAAI,IAAMuB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK8B,GAAKa,EAAG,EAAI,IAAMuB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DX,GAAMW,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKsB,EAAKc,EAAG,EAAI,IAAMgC,EAAI,OAAU,IAAMX,GAAK,OAAU,EAChES,IAAMlE,EAAK8B,GAAKM,EAAG,EAAI,IAAMgC,IAAM,IAAM,IAAMX,KAAO,IAAM,EAC5DU,IAAMnE,EAAKsB,EAAKsB,EAAG,EAAI,IAAMsB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK8B,GAAKc,EAAG,EAAI,IAAMsB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DV,GAAMU,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKsB,EAAKe,EAAG,EAAI,IAAM+B,EAAI,OAAU,IAAMV,GAAK,OAAU,EAChEQ,IAAMlE,EAAK8B,GAAKO,EAAG,EAAI,IAAM+B,IAAM,IAAM,IAAMV,KAAO,IAAM,EAC5DS,IAAMnE,EAAKsB,EAAKuB,EAAG,EAAI,IAAMqB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK8B,GAAKe,EAAG,EAAI,IAAMqB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DT,GAAMS,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKsB,EAAKgB,EAAG,EAAI,IAAM8B,EAAI,OAAU,IAAMT,GAAM,OAAU,EACjEO,IAAMlE,EAAK8B,GAAKQ,EAAG,EAAI,IAAM8B,IAAM,IAAM,IAAMT,KAAQ,IAAM,EAC7DQ,IAAMnE,EAAKsB,EAAKwB,EAAG,EAAI,IAAMoB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK8B,GAAKgB,EAAG,EAAI,IAAMoB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DR,GAAOQ,GAAK,GAAOF,GAAI,MAEvBA,KAAMjE,EAAKsB,EAAKiB,EAAG,EAAI,IAAM6B,EAAI,OAAU,IAAMR,GAAM,OAAU,EACjEM,IAAMlE,EAAK8B,GAAKS,EAAG,EAAI,IAAM6B,IAAM,IAAM,IAAMR,KAAQ,IAAM,EAC7DO,IAAMnE,EAAKsB,EAAKyB,EAAG,EAAI,IAAMmB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK8B,GAAKiB,EAAG,EAAI,IAAMmB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DP,GAAOO,GAAK,GAAOF,GAAI,MAEvBA,KAAMjE,EAAKsB,EAAKkB,EAAG,EAAI,IAAM4B,EAAI,OAAU,IAAMP,GAAM,OAAU,EACjEK,IAAMlE,EAAK8B,GAAKU,EAAG,EAAI,IAAM4B,IAAM,IAAM,IAAMP,KAAQ,IAAM,EAC7DM,IAAMnE,EAAKsB,EAAK0B,EAAG,EAAI,IAAMkB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK8B,GAAKkB,EAAG,EAAI,IAAMkB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DN,GAAOM,GAAK,GAAOF,GAAI,MAEvBH,EAAMM,EAENH,KAAMjE,EAAKuB,EAAKU,CAAG,EAAI,IAAM8B,EAAM,OAAU,IAAMR,GAAK,OAAU,EAClEW,IAAMlE,EAAK+B,GAAKE,CAAG,EAAI,IAAM8B,IAAQ,IAAM,IAAMR,KAAO,IAAM,EAC9DY,IAAMnE,EAAKuB,EAAKkB,EAAG,EAAI,IAAMyB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK+B,GAAKU,EAAG,EAAI,IAAMyB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DZ,GAAMY,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKuB,EAAKW,EAAG,EAAI,IAAMkC,EAAI,OAAU,IAAMZ,GAAK,OAAU,EAChEU,IAAMlE,EAAK+B,GAAKG,EAAG,EAAI,IAAMkC,IAAM,IAAM,IAAMZ,KAAO,IAAM,EAC5DW,IAAMnE,EAAKuB,EAAKmB,EAAG,EAAI,IAAMwB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK+B,GAAKW,EAAG,EAAI,IAAMwB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DX,GAAMW,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKuB,EAAKY,EAAG,EAAI,IAAMiC,EAAI,OAAU,IAAMX,GAAK,OAAU,EAChES,IAAMlE,EAAK+B,GAAKI,EAAG,EAAI,IAAMiC,IAAM,IAAM,IAAMX,KAAO,IAAM,EAC5DU,IAAMnE,EAAKuB,EAAKoB,EAAG,EAAI,IAAMuB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK+B,GAAKY,EAAG,EAAI,IAAMuB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DV,GAAMU,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKuB,EAAKa,EAAG,EAAI,IAAMgC,EAAI,OAAU,IAAMV,GAAK,OAAU,EAChEQ,IAAMlE,EAAK+B,GAAKK,EAAG,EAAI,IAAMgC,IAAM,IAAM,IAAMV,KAAO,IAAM,EAC5DS,IAAMnE,EAAKuB,EAAKqB,EAAG,EAAI,IAAMsB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK+B,GAAKa,EAAG,EAAI,IAAMsB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DT,GAAMS,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKuB,EAAKc,EAAG,EAAI,IAAM+B,EAAI,OAAU,IAAMT,GAAM,OAAU,EACjEO,IAAMlE,EAAK+B,GAAKM,EAAG,EAAI,IAAM+B,IAAM,IAAM,IAAMT,KAAQ,IAAM,EAC7DQ,IAAMnE,EAAKuB,EAAKsB,EAAG,EAAI,IAAMqB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK+B,GAAKc,EAAG,EAAI,IAAMqB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DR,GAAOQ,GAAK,GAAOF,GAAI,MAEvBA,KAAMjE,EAAKuB,EAAKe,EAAG,EAAI,IAAM8B,EAAI,OAAU,IAAMR,GAAM,OAAU,EACjEM,IAAMlE,EAAK+B,GAAKO,EAAG,EAAI,IAAM8B,IAAM,IAAM,IAAMR,KAAQ,IAAM,EAC7DO,IAAMnE,EAAKuB,EAAKuB,EAAG,EAAI,IAAMoB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK+B,GAAKe,EAAG,EAAI,IAAMoB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DP,GAAOO,GAAK,GAAOF,GAAI,MAEvBA,KAAMjE,EAAKuB,EAAKgB,EAAG,EAAI,IAAM6B,EAAI,OAAU,IAAMP,GAAM,OAAU,EACjEK,IAAMlE,EAAK+B,GAAKQ,EAAG,EAAI,IAAM6B,IAAM,IAAM,IAAMP,KAAQ,IAAM,EAC7DM,IAAMnE,EAAKuB,EAAKwB,EAAG,EAAI,IAAMmB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK+B,GAAKgB,EAAG,EAAI,IAAMmB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DN,GAAOM,GAAK,GAAOF,GAAI,MAEvBA,KAAMjE,EAAKuB,EAAKiB,EAAG,EAAI,IAAM4B,EAAI,OAAU,IAAMN,EAAM,OAAU,EACjEI,IAAMlE,EAAK+B,GAAKS,EAAG,EAAI,IAAM4B,IAAM,IAAM,IAAMN,IAAQ,IAAM,EAC7DK,IAAMnE,EAAKuB,EAAKyB,EAAG,EAAI,IAAMkB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAK+B,GAAKiB,EAAG,EAAI,IAAMkB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DL,EAAOK,GAAK,GAAOF,GAAI,MAEvBF,EAAMK,EAENH,KAAMjE,EAAKwB,EAAKS,CAAG,EAAI,IAAM+B,EAAM,OAAU,IAAMR,GAAK,OAAU,EAClEU,IAAMlE,EAAKgC,GAAKC,CAAG,EAAI,IAAM+B,IAAQ,IAAM,IAAMR,KAAO,IAAM,EAC9DW,IAAMnE,EAAKwB,EAAKiB,EAAG,EAAI,IAAMyB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAKgC,GAAKS,EAAG,EAAI,IAAMyB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DX,GAAMW,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKwB,EAAKU,EAAG,EAAI,IAAMkC,EAAI,OAAU,IAAMX,GAAK,OAAU,EAChES,IAAMlE,EAAKgC,GAAKE,EAAG,EAAI,IAAMkC,IAAM,IAAM,IAAMX,KAAO,IAAM,EAC5DU,IAAMnE,EAAKwB,EAAKkB,EAAG,EAAI,IAAMwB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAKgC,GAAKU,EAAG,EAAI,IAAMwB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DV,GAAMU,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKwB,EAAKW,EAAG,EAAI,IAAMiC,EAAI,OAAU,IAAMV,GAAK,OAAU,EAChEQ,IAAMlE,EAAKgC,GAAKG,EAAG,EAAI,IAAMiC,IAAM,IAAM,IAAMV,KAAO,IAAM,EAC5DS,IAAMnE,EAAKwB,EAAKmB,EAAG,EAAI,IAAMuB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAKgC,GAAKW,EAAG,EAAI,IAAMuB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DT,GAAMS,GAAK,GAAOF,GAAI,MAEtBA,KAAMjE,EAAKwB,EAAKY,EAAG,EAAI,IAAMgC,EAAI,OAAU,IAAMT,GAAM,OAAU,EACjEO,IAAMlE,EAAKgC,GAAKI,EAAG,EAAI,IAAMgC,IAAM,IAAM,IAAMT,KAAQ,IAAM,EAC7DQ,IAAMnE,EAAKwB,EAAKoB,EAAG,EAAI,IAAMsB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAKgC,GAAKY,EAAG,EAAI,IAAMsB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DR,GAAOQ,GAAK,GAAOF,GAAI,MAEvBA,KAAMjE,EAAKwB,EAAKa,EAAG,EAAI,IAAM+B,EAAI,OAAU,IAAMR,GAAM,OAAU,EACjEM,IAAMlE,EAAKgC,GAAKK,EAAG,EAAI,IAAM+B,IAAM,IAAM,IAAMR,KAAQ,IAAM,EAC7DO,IAAMnE,EAAKwB,EAAKqB,EAAG,EAAI,IAAMqB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAKgC,GAAKa,EAAG,EAAI,IAAMqB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DP,GAAOO,GAAK,GAAOF,GAAI,MAEvBA,KAAMjE,EAAKwB,EAAKc,EAAG,EAAI,IAAM8B,EAAI,OAAU,IAAMP,GAAM,OAAU,EACjEK,IAAMlE,EAAKgC,GAAKM,EAAG,EAAI,IAAM8B,IAAM,IAAM,IAAMP,KAAQ,IAAM,EAC7DM,IAAMnE,EAAKwB,EAAKsB,EAAG,EAAI,IAAMoB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAKgC,GAAKc,EAAG,EAAI,IAAMoB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DN,GAAOM,GAAK,GAAOF,GAAI,MAEvBA,KAAMjE,EAAKwB,EAAKe,EAAG,EAAI,IAAM6B,EAAI,OAAU,IAAMN,EAAM,OAAU,EACjEI,IAAMlE,EAAKgC,GAAKO,EAAG,EAAI,IAAM6B,IAAM,IAAM,IAAMN,IAAQ,IAAM,EAC7DK,IAAMnE,EAAKwB,EAAKuB,EAAG,EAAI,IAAMmB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAKgC,GAAKe,EAAG,EAAI,IAAMmB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DL,EAAOK,GAAK,GAAOF,GAAI,MAEvBA,KAAMjE,EAAKwB,EAAKgB,EAAG,EAAI,IAAM4B,EAAI,OAAU,IAAML,EAAM,OAAU,EACjEG,IAAMlE,EAAKgC,GAAKQ,EAAG,EAAI,IAAM4B,IAAM,IAAM,IAAML,IAAQ,IAAM,EAC7DI,IAAMnE,EAAKwB,EAAKwB,EAAG,EAAI,IAAMkB,EAAI,OAAU,IAAMD,KAAM,IAAM,EAC7DG,IAAMpE,EAAKgC,GAAKgB,EAAG,EAAI,IAAMkB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DJ,EAAOI,GAAK,GAAOF,GAAI,MAEvBD,EAAMI,EAENrE,GAAQwE,GAAK,IAAM,CAAC,EAAItB,GACpBlD,GAAQwE,GAAK,IAAM,CAAC,EAAIrB,EACxBnD,GAAQwE,GAAK,IAAM,CAAC,EAAIpB,EACxBpD,GAAQwE,GAAK,KAAO,CAAC,EAAInB,GACzBrD,GAAQwE,GAAK,KAAO,CAAC,EAAIlB,GACzBtD,GAAQwE,GAAK,KAAO,CAAC,EAAIjB,GACzBvD,GAAQwE,GAAK,KAAO,CAAC,EAAIhB,GACzBxD,GAAQwE,GAAK,KAAO,CAAC,EAAIf,GAGjCe,GAAMrK,GAAK1H,GAAIC,GAAI,GAAM,EACzBsN,GAAQwE,GAAK,IAAM,CAAC,EAAId,GACpB1D,GAAQwE,GAAK,IAAM,CAAC,EAAIb,GACxB3D,GAAQwE,GAAK,IAAM,CAAC,EAAIZ,GACxB5D,GAAQwE,GAAK,KAAO,CAAC,EAAIX,GACzB7D,GAAQwE,GAAK,KAAO,CAAC,EAAIV,GACzB9D,GAAQwE,GAAK,KAAO,CAAC,EAAIT,EACzB/D,GAAQwE,GAAK,KAAO,CAAC,EAAIR,EACzBhE,GAAQwE,GAAK,KAAO,CAAC,EAAIP,CACjC,CAoCJ,CAkBA,SAASQ,EAAIlE,EAAGG,EAAIvG,EAAG,CACnBoG,EAAIA,EAAI,EACRG,EAAKA,EAAK,EACVvG,EAAIA,EAAI,EASR,QAPI+G,EAAM,EAAGC,EAAM,EAAGC,EAAM,EAAGC,EAAM,EAAGC,EAAM,EAAGC,EAAM,EAAGC,EAAM,EAAGC,EAAM,EAAGC,EAAM,EAAGC,EAAM,EAAGC,EAAM,EAAGC,EAAM,EAAGC,EAAM,EAAGC,EAAM,EAAGC,EAAM,EAAGC,GAAM,EAC7IC,GAAM,EAAGC,GAAM,EAAGC,GAAM,EAAGC,EAAM,EAAGC,GAAM,EAAGC,GAAM,EAAGC,GAAM,EAAGC,GAAM,EAAGC,GAAM,EAAGC,GAAM,EAAGC,GAAM,EAAGC,GAAM,EAAGC,GAAM,EAAGC,GAAM,EAAGC,GAAM,EAAGC,GAAM,EAC7IC,GAAK,EAAGC,GAAK,EAAGC,GAAK,EAAGC,GAAK,EAAGC,EAAK,EAAGC,EAAK,EAAGC,GAAK,EAAGC,GAAK,EAAGC,GAAK,EAAGC,GAAK,EAAGC,GAAM,EAAGC,GAAM,EAAGC,GAAM,EAAGC,GAAM,EAAGC,GAAM,EAAGC,GAAM,EACnIC,EAAI,EAAGC,EAAI,EAAGC,EAAI,EAAGzR,GAAI,EAAG+R,EAAI,EAAGL,EAAI,EAAGpQ,EAAI,EAC9CoC,GAAI,EAAGsO,GAAK,EAAGrO,GAAI,EAAG7D,GAAI,EAAGC,GAAI,EAAGiG,GAAI,EAAG2L,GAAK,EAAGM,GAAK,EAAGJ,GAAK,GAG5D/R,GAAI,IAAMiO,EAAK,GAAIjO,GAAKA,GAAI,EAAK,EACrC+R,GAAKrK,GAAK1H,IAAK,GAAK,EACpBiP,EAAM1B,EAAQO,EAAI9N,IAAM,CAAC,EAAI,EAAGyO,EAAMQ,EAAM,MAAQA,EAAMA,IAAQ,GAClEwC,EAAIjE,EAAKiB,EAAKA,CAAG,EAAI,EACrBiD,GAAKlE,EAAKiB,EAAKQ,CAAG,EAAI,IAAMwC,IAAM,IAAM,EACxCE,GAAKnE,EAAKyB,EAAKA,CAAG,EAAI,IAAMyC,IAAM,IAAM,EACxCnE,EAAQwE,IAAO,CAAC,EAAKL,GAAK,GAAOD,EAAI,OACrClE,GAAQwE,GAAK,IAAM,CAAC,EAAIJ,EAI5B,IAAK9N,GAAI,GAAIA,GAAI,IAAMoK,EAAK,GAAIpK,GAAKA,GAAI,EAAK,EAC1CgO,GAAK/D,EAAIjK,GAAI,EAAGkO,GAAKrK,GAAK7D,IAAK,GAAK,EAEpCoL,EAAM1B,EAAQsE,IAAO,CAAC,EAAI,EAAGpD,EAAMQ,EAAM,MAAQA,EAAMA,IAAQ,GAE/DgB,GAAM1C,GAAQsE,GAAK,IAAM,CAAC,EAAI,EAAGpC,GAAMQ,GAAM,MAAQA,GAAMA,KAAQ,GAEnEwB,EAAIjE,EAAKiB,EAAKgB,EAAG,EAAI,EACrBiC,GAAKlE,EAAKiB,EAAKwB,EAAG,EAAI,IAAMwB,IAAM,IAAM,EACxCE,GAAKnE,EAAKyB,EAAKQ,EAAG,EAAI,IAAMiC,EAAI,OAAU,EAC1CE,IAAMpE,EAAKyB,EAAKgB,EAAG,EAAI,IAAMyB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAE3DnQ,EAAI+L,GAAQwE,GAAK,IAAM,CAAC,EAAI,EAC5BN,GAAKjQ,EAAI,SAAYiQ,EAAI,QAAW,GAAK,EACzCE,IAAMnQ,IAAM,MAAQmQ,EAAI,QAAW,GAAK,IAAMF,IAAM,IAAM,EAC1DlE,GAAQwE,GAAK,IAAM,CAAC,EAAKJ,GAAK,GAAOF,EAAI,MACzCvR,GAAIyR,IAAM,GAEVnQ,EAAI+L,GAAQwE,GAAK,IAAM,CAAC,EAAI,EAC5BN,IAAMjQ,EAAI,SAAYoQ,EAAI,QAAW,GAAK,GAAK1R,GAAI,EACnDyR,IAAMnQ,IAAM,KAAQoQ,IAAM,IAAO,GAAK,IAAMH,IAAM,IAAM,EACxDlE,GAAQwE,GAAK,IAAM,CAAC,EAAKJ,GAAK,GAAOF,EAAI,MACzCvR,GAAIyR,IAAM,GAENzR,KACAsB,EAAI+L,GAAQwE,GAAK,KAAO,CAAC,EAAI,EAC7BN,GAAKjQ,EAAI,OAAUtB,GAAI,EACvByR,GAAKnQ,IAAM,KAAOiQ,IAAM,IAAM,EAC9BlE,GAAQwE,GAAK,KAAO,CAAC,EAAKJ,GAAK,GAAOF,EAAI,OAKlD,IAAK5N,GAAI,GAAIA,GAAI,IAAMoK,EAAK,GAAIpK,GAAKA,GAAI,GAAM,EA6D3C,IA5DAgO,GAAK/D,EAAIjK,GAAI,EAAGkO,GAAKrK,GAAK7D,IAAK,GAAK,EAEpCoL,EAAM1B,EAAQsE,IAAO,CAAC,EAAI,EAAGpD,EAAMQ,EAAM,MAAQA,EAAMA,IAAQ,GAC3DC,EAAM3B,GAAQsE,GAAK,IAAM,CAAC,EAAI,EAAGnD,EAAMQ,EAAM,MAAQA,EAAMA,IAAQ,GAEvEe,GAAM1C,GAAQsE,GAAK,IAAM,CAAC,EAAI,EAAGpC,GAAMQ,GAAM,MAAQA,GAAMA,KAAQ,GAC/DC,GAAM3C,GAAQsE,GAAK,KAAO,CAAC,EAAI,EAAGnC,GAAMQ,GAAM,MAAQA,GAAMA,KAAQ,GAExEuB,EAAIjE,EAAKiB,EAAKgB,EAAG,EAAI,EACrBiC,EAAIlE,EAAKyB,EAAKQ,EAAG,EAAI,EACrBkC,IAAMnE,EAAKiB,EAAKwB,EAAG,EAAI,IAAMyB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAKyB,EAAKgB,EAAG,EAAI,IAAMyB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DlB,GAAMkB,GAAK,GAAOF,EAAI,MAEtBA,GAAKjE,EAAKiB,EAAKiB,EAAG,EAAI,IAAMkC,EAAI,OAAU,EAC1CF,GAAKlE,EAAKyB,EAAKS,EAAG,EAAI,IAAMkC,IAAM,IAAM,EACxCD,IAAMnE,EAAKiB,EAAKyB,EAAG,EAAI,IAAMwB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAKyB,EAAKiB,EAAG,EAAI,IAAMwB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DjB,GAAMiB,GAAK,GAAOF,EAAI,MAEtBd,GAAKiB,EAELH,GAAKjE,EAAKkB,EAAKe,EAAG,EAAI,IAAMiB,GAAK,OAAU,EAC3CgB,GAAKlE,EAAK0B,EAAKO,EAAG,EAAI,IAAMiB,KAAO,IAAM,EACzCiB,IAAMnE,EAAKkB,EAAKuB,EAAG,EAAI,IAAMyB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK0B,EAAKe,EAAG,EAAI,IAAMyB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DjB,GAAMiB,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKkB,EAAKgB,EAAG,EAAI,IAAMiB,GAAK,OAAU,IAAMiB,EAAI,OAAU,EAChEF,IAAMlE,EAAK0B,EAAKQ,EAAG,EAAI,IAAMiB,KAAO,IAAM,IAAMiB,IAAM,IAAM,EAC5DD,IAAMnE,EAAKkB,EAAKwB,EAAG,EAAI,IAAMwB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK0B,EAAKgB,EAAG,EAAI,IAAMwB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DhB,GAAMgB,GAAK,GAAOF,EAAI,MAEtBb,GAAKgB,EAELpQ,EAAI+L,GAAQwE,GAAK,IAAM,CAAC,EAAI,EAC5BN,GAAKjQ,EAAI,SAAYiP,GAAK,QAAW,GAAK,EAC1CkB,IAAMnQ,IAAM,KAAQiP,KAAO,IAAO,GAAK,IAAMgB,IAAM,IAAM,EACzDlE,GAAQwE,GAAK,IAAM,CAAC,EAAKJ,GAAK,GAAOF,EAAI,MACzCvR,GAAIyR,IAAM,GAEVnQ,EAAI+L,GAAQwE,GAAK,KAAO,CAAC,EAAI,EAC7BN,IAAMjQ,EAAI,SAAYkP,GAAK,QAAW,GAAK,GAAKxQ,GAAI,EACpDyR,IAAMnQ,IAAM,KAAQkP,KAAO,IAAO,GAAK,IAAMe,IAAM,IAAM,EACzDlE,GAAQwE,GAAK,KAAO,CAAC,EAAKJ,GAAK,GAAOF,EAAI,MAC1CvR,GAAIyR,IAAM,GAEVnQ,EAAI+L,GAAQwE,GAAK,KAAO,CAAC,EAAI,EAC7BN,IAAMjQ,EAAI,SAAYmP,GAAK,QAAW,GAAK,GAAKzQ,GAAI,EACpDyR,IAAMnQ,IAAM,KAAQmP,KAAO,IAAO,GAAK,IAAMc,IAAM,IAAM,EACzDlE,GAAQwE,GAAK,KAAO,CAAC,EAAKJ,GAAK,GAAOF,EAAI,MAC1CvR,GAAIyR,IAAM,GAEVnQ,EAAI+L,GAAQwE,GAAK,KAAO,CAAC,EAAI,EAC7BN,IAAMjQ,EAAI,SAAYoP,GAAK,QAAW,GAAK,GAAK1Q,GAAI,EACpDyR,IAAMnQ,IAAM,KAAQoP,KAAO,IAAO,GAAK,IAAMa,IAAM,IAAM,EACzDlE,GAAQwE,GAAK,KAAO,CAAC,EAAKJ,GAAK,GAAOF,EAAI,MAC1CvR,GAAIyR,IAAM,GAELzL,GAAI,GAAI,CAAC,CAAChG,IAAMgG,GAAI,GAAK,GAAKA,GAAKA,GAAI,EAAK,EAC7C1E,EAAI+L,GAAQwE,GAAK7L,KAAM,CAAC,EAAI,EAC5BuL,GAAKjQ,EAAI,OAAUtB,GAAI,EACvByR,GAAKnQ,IAAM,KAAOiQ,IAAM,IAAM,EAC9BlE,GAAQwE,GAAK7L,KAAM,CAAC,EAAKyL,GAAK,GAAOF,EAAI,MACzCvR,GAAIyR,IAAM,GAKlB,IAAK9N,GAAI,GAAIA,GAAI,IAAMoK,EAAK,GAAIpK,GAAKA,GAAI,GAAM,EAqK3C,IApKAgO,GAAK/D,EAAIjK,GAAI,EAAGkO,GAAKrK,GAAK7D,IAAK,GAAK,EAEpCoL,EAAM1B,EAAQsE,IAAO,CAAC,EAAI,EAAGpD,EAAMQ,EAAM,MAAQA,EAAMA,IAAQ,GAC3DC,EAAM3B,GAAQsE,GAAK,IAAM,CAAC,EAAI,EAAGnD,EAAMQ,EAAM,MAAQA,EAAMA,IAAQ,GACnEC,EAAM5B,GAAQsE,GAAK,IAAM,CAAC,EAAI,EAAGlD,EAAMQ,EAAM,MAAQA,EAAMA,IAAQ,GACnEC,EAAM7B,GAAQsE,GAAK,KAAO,CAAC,EAAI,EAAGjD,EAAMQ,EAAM,MAAQA,EAAMA,IAAQ,GAExEa,GAAM1C,GAAQsE,GAAK,KAAO,CAAC,EAAI,EAAGpC,GAAMQ,GAAM,MAAQA,GAAMA,KAAQ,GAChEC,GAAM3C,GAAQsE,GAAK,KAAO,CAAC,EAAI,EAAGnC,GAAMQ,GAAM,MAAQA,GAAMA,KAAQ,GACpEC,GAAM5C,GAAQsE,GAAK,KAAO,CAAC,EAAI,EAAGlC,GAAMQ,GAAM,MAAQA,GAAMA,KAAQ,GACpEC,GAAM7C,GAAQsE,GAAK,KAAO,CAAC,EAAI,EAAGjC,EAAMQ,GAAM,MAAQA,GAAMA,KAAQ,GAExEqB,EAAIjE,EAAKiB,EAAKgB,EAAG,EAAI,EACrBiC,EAAIlE,EAAKyB,EAAKQ,EAAG,EAAI,EACrBkC,IAAMnE,EAAKiB,EAAKwB,EAAG,EAAI,IAAMyB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAKyB,EAAKgB,EAAG,EAAI,IAAMyB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DlB,GAAMkB,GAAK,GAAOF,EAAI,MAEtBA,GAAKjE,EAAKiB,EAAKiB,EAAG,EAAI,IAAMkC,EAAI,OAAU,EAC1CF,GAAKlE,EAAKyB,EAAKS,EAAG,EAAI,IAAMkC,IAAM,IAAM,EACxCD,IAAMnE,EAAKiB,EAAKyB,EAAG,EAAI,IAAMwB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAKyB,EAAKiB,EAAG,EAAI,IAAMwB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DjB,GAAMiB,GAAK,GAAOF,EAAI,MAEtBA,GAAKjE,EAAKiB,EAAKkB,EAAG,EAAI,IAAMiC,EAAI,OAAU,EAC1CF,GAAKlE,EAAKyB,EAAKU,EAAG,EAAI,IAAMiC,IAAM,IAAM,EACxCD,IAAMnE,EAAKiB,EAAK0B,EAAG,EAAI,IAAMuB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAKyB,EAAKkB,EAAG,EAAI,IAAMuB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DhB,GAAMgB,GAAK,GAAOF,EAAI,MAEtBA,GAAKjE,EAAKiB,EAAKmB,CAAG,EAAI,IAAMgC,EAAI,OAAU,EAC1CF,GAAKlE,EAAKyB,EAAKW,CAAG,EAAI,IAAMgC,IAAM,IAAM,EACxCD,IAAMnE,EAAKiB,EAAK2B,EAAG,EAAI,IAAMsB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAKyB,EAAKmB,EAAG,EAAI,IAAMsB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Df,GAAMe,GAAK,GAAOF,EAAI,MAEtBZ,EAAKe,EAELH,GAAKjE,EAAKkB,EAAKe,EAAG,EAAI,IAAMiB,GAAK,OAAU,EAC3CgB,GAAKlE,EAAK0B,EAAKO,EAAG,EAAI,IAAMiB,KAAO,IAAM,EACzCiB,IAAMnE,EAAKkB,EAAKuB,EAAG,EAAI,IAAMyB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK0B,EAAKe,EAAG,EAAI,IAAMyB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DjB,GAAMiB,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKkB,EAAKgB,EAAG,EAAI,IAAMiB,GAAK,OAAU,IAAMiB,EAAI,OAAU,EAChEF,IAAMlE,EAAK0B,EAAKQ,EAAG,EAAI,IAAMiB,KAAO,IAAM,IAAMiB,IAAM,IAAM,EAC5DD,IAAMnE,EAAKkB,EAAKwB,EAAG,EAAI,IAAMwB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK0B,EAAKgB,EAAG,EAAI,IAAMwB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DhB,GAAMgB,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKkB,EAAKiB,EAAG,EAAI,IAAMiB,GAAK,OAAU,IAAMgB,EAAI,OAAU,EAChEF,IAAMlE,EAAK0B,EAAKS,EAAG,EAAI,IAAMiB,KAAO,IAAM,IAAMgB,IAAM,IAAM,EAC5DD,IAAMnE,EAAKkB,EAAKyB,EAAG,EAAI,IAAMuB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK0B,EAAKiB,EAAG,EAAI,IAAMuB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Df,GAAMe,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKkB,EAAKkB,CAAG,EAAI,IAAMiB,EAAK,OAAU,IAAMe,EAAI,OAAU,EAChEF,IAAMlE,EAAK0B,EAAKU,CAAG,EAAI,IAAMiB,IAAO,IAAM,IAAMe,IAAM,IAAM,EAC5DD,IAAMnE,EAAKkB,EAAK0B,EAAG,EAAI,IAAMsB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK0B,EAAKkB,EAAG,EAAI,IAAMsB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Dd,EAAMc,GAAK,GAAOF,EAAI,MAEtBX,EAAKc,EAELH,GAAKjE,EAAKmB,EAAKc,EAAG,EAAI,IAAMkB,GAAK,OAAU,EAC3Ce,GAAKlE,EAAK2B,EAAKM,EAAG,EAAI,IAAMkB,KAAO,IAAM,EACzCgB,IAAMnE,EAAKmB,EAAKsB,EAAG,EAAI,IAAMyB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK2B,EAAKc,EAAG,EAAI,IAAMyB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DhB,GAAMgB,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKmB,EAAKe,EAAG,EAAI,IAAMkB,GAAK,OAAU,IAAMgB,EAAI,OAAU,EAChEF,IAAMlE,EAAK2B,EAAKO,EAAG,EAAI,IAAMkB,KAAO,IAAM,IAAMgB,IAAM,IAAM,EAC5DD,IAAMnE,EAAKmB,EAAKuB,EAAG,EAAI,IAAMwB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK2B,EAAKe,EAAG,EAAI,IAAMwB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Df,GAAMe,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKmB,EAAKgB,EAAG,EAAI,IAAMkB,EAAK,OAAU,IAAMe,EAAI,OAAU,EAChEF,IAAMlE,EAAK2B,EAAKQ,EAAG,EAAI,IAAMkB,IAAO,IAAM,IAAMe,IAAM,IAAM,EAC5DD,IAAMnE,EAAKmB,EAAKwB,EAAG,EAAI,IAAMuB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK2B,EAAKgB,EAAG,EAAI,IAAMuB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Dd,EAAMc,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKmB,EAAKiB,CAAG,EAAI,IAAMkB,EAAK,OAAU,IAAMc,EAAI,OAAU,EAChEF,IAAMlE,EAAK2B,EAAKS,CAAG,EAAI,IAAMkB,IAAO,IAAM,IAAMc,IAAM,IAAM,EAC5DD,IAAMnE,EAAKmB,EAAKyB,EAAG,EAAI,IAAMsB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK2B,EAAKiB,EAAG,EAAI,IAAMsB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Db,EAAMa,GAAK,GAAOF,EAAI,MAEtBV,GAAKa,EAELH,GAAKjE,EAAKoB,EAAKa,EAAG,EAAI,IAAMmB,GAAK,OAAU,EAC3Cc,GAAKlE,EAAK4B,EAAKK,EAAG,EAAI,IAAMmB,KAAO,IAAM,EACzCe,IAAMnE,EAAKoB,EAAKqB,EAAG,EAAI,IAAMyB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK4B,EAAKa,EAAG,EAAI,IAAMyB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Df,GAAMe,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKoB,EAAKc,EAAG,EAAI,IAAMmB,EAAK,OAAU,IAAMe,EAAI,OAAU,EAChEF,IAAMlE,EAAK4B,EAAKM,EAAG,EAAI,IAAMmB,IAAO,IAAM,IAAMe,IAAM,IAAM,EAC5DD,IAAMnE,EAAKoB,EAAKsB,EAAG,EAAI,IAAMwB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK4B,EAAKc,EAAG,EAAI,IAAMwB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Dd,EAAMc,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKoB,EAAKe,EAAG,EAAI,IAAMmB,EAAK,OAAU,IAAMc,EAAI,OAAU,EAChEF,IAAMlE,EAAK4B,EAAKO,EAAG,EAAI,IAAMmB,IAAO,IAAM,IAAMc,IAAM,IAAM,EAC5DD,IAAMnE,EAAKoB,EAAKuB,EAAG,EAAI,IAAMuB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK4B,EAAKe,EAAG,EAAI,IAAMuB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Db,EAAMa,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKoB,EAAKgB,CAAG,EAAI,IAAMmB,GAAK,OAAU,IAAMa,EAAI,OAAU,EAChEF,IAAMlE,EAAK4B,EAAKQ,CAAG,EAAI,IAAMmB,KAAO,IAAM,IAAMa,IAAM,IAAM,EAC5DD,IAAMnE,EAAKoB,EAAKwB,EAAG,EAAI,IAAMsB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK4B,EAAKgB,EAAG,EAAI,IAAMsB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DZ,GAAMY,GAAK,GAAOF,EAAI,MAEtBT,GAAKY,EAELpQ,EAAI+L,GAAQwE,GAAK,KAAO,CAAC,EAAI,EAC7BN,GAAKjQ,EAAI,SAAYiP,GAAK,QAAW,GAAK,EAC1CkB,IAAMnQ,IAAM,KAAQiP,KAAO,IAAO,GAAK,IAAMgB,IAAM,IAAM,EACzDlE,GAAQwE,GAAK,KAAO,CAAC,EAAKJ,GAAK,GAAOF,EAAI,MAC1CvR,GAAIyR,IAAM,GAEVnQ,EAAI+L,GAAQwE,GAAK,KAAO,CAAC,EAAI,EAC7BN,IAAMjQ,EAAI,SAAYkP,GAAK,QAAW,GAAK,GAAKxQ,GAAI,EACpDyR,IAAMnQ,IAAM,KAAQkP,KAAO,IAAO,GAAK,IAAMe,IAAM,IAAM,EACzDlE,GAAQwE,GAAK,KAAO,CAAC,EAAKJ,GAAK,GAAOF,EAAI,MAC1CvR,GAAIyR,IAAM,GAEVnQ,EAAI+L,GAAQwE,GAAK,KAAO,CAAC,EAAI,EAC7BN,IAAMjQ,EAAI,SAAYmP,GAAK,QAAW,GAAK,GAAKzQ,GAAI,EACpDyR,IAAMnQ,IAAM,KAAQmP,KAAO,IAAO,GAAK,IAAMc,IAAM,IAAM,EACzDlE,GAAQwE,GAAK,KAAO,CAAC,EAAKJ,GAAK,GAAOF,EAAI,MAC1CvR,GAAIyR,IAAM,GAEVnQ,EAAI+L,GAAQwE,GAAK,KAAO,CAAC,EAAI,EAC7BN,IAAMjQ,EAAI,SAAYoP,GAAK,QAAW,GAAK,GAAK1Q,GAAI,EACpDyR,IAAMnQ,IAAM,KAAQoP,KAAO,IAAO,GAAK,IAAMa,IAAM,IAAM,EACzDlE,GAAQwE,GAAK,KAAO,CAAC,EAAKJ,GAAK,GAAOF,EAAI,MAC1CvR,GAAIyR,IAAM,GAEVnQ,EAAI+L,EAAQwE,GAAK,IAAO,CAAC,EAAI,EAC7BN,IAAMjQ,EAAI,SAAYqP,EAAK,QAAW,GAAK,GAAK3Q,GAAI,EACpDyR,IAAMnQ,IAAM,KAAQqP,IAAO,IAAO,GAAK,IAAMY,IAAM,IAAM,EACzDlE,EAAQwE,GAAK,IAAO,CAAC,EAAKJ,GAAK,GAAOF,EAAI,MAC1CvR,GAAIyR,IAAM,GAEVnQ,EAAI+L,EAAQwE,GAAK,IAAO,CAAC,EAAI,EAC7BN,IAAMjQ,EAAI,SAAYsP,EAAK,QAAW,GAAK,GAAK5Q,GAAI,EACpDyR,IAAMnQ,IAAM,KAAQsP,IAAO,IAAO,GAAK,IAAMW,IAAM,IAAM,EACzDlE,EAAQwE,GAAK,IAAO,CAAC,EAAKJ,GAAK,GAAOF,EAAI,MAC1CvR,GAAIyR,IAAM,GAEVnQ,EAAI+L,EAAQwE,GAAK,IAAO,CAAC,EAAI,EAC7BN,IAAMjQ,EAAI,SAAYuP,GAAK,QAAW,GAAK,GAAK7Q,GAAI,EACpDyR,IAAMnQ,IAAM,KAAQuP,KAAO,IAAO,GAAK,IAAMU,IAAM,IAAM,EACzDlE,EAAQwE,GAAK,IAAO,CAAC,EAAKJ,GAAK,GAAOF,EAAI,MAC1CvR,GAAIyR,IAAM,GAEVnQ,EAAI+L,EAAQwE,GAAK,IAAO,CAAC,EAAI,EAC7BN,IAAMjQ,EAAI,SAAYwP,GAAK,QAAW,GAAK,GAAK9Q,GAAI,EACpDyR,IAAMnQ,IAAM,KAAQwP,KAAO,IAAO,GAAK,IAAMS,IAAM,IAAM,EACzDlE,EAAQwE,GAAK,IAAO,CAAC,EAAKJ,GAAK,GAAOF,EAAI,MAC1CvR,GAAIyR,IAAM,GAELzL,GAAI,GAAI,CAAC,CAAChG,IAAMgG,GAAI,GAAK,GAAKA,GAAKA,GAAI,EAAK,EAC7C1E,EAAI+L,EAAQwE,GAAK7L,IAAM,CAAC,EAAI,EAC5BuL,GAAKjQ,EAAI,OAAUtB,GAAI,EACvByR,GAAKnQ,IAAM,KAAOiQ,IAAM,IAAM,EAC9BlE,EAAQwE,GAAK7L,IAAM,CAAC,EAAKyL,GAAK,GAAOF,EAAI,MACzCvR,GAAIyR,IAAM,GAKlB,IAAK/N,GAAI,IAAKA,GAAI,IAAMqK,EAAK,GAAIrK,GAAIA,IAAK,EAGtC,IAFAsO,GAAKtO,IAAK,EAELC,GAAI,GAAIA,GAAI,IAAMoK,EAAK,GAAIpK,GAAKA,GAAIqO,GAAM,EAAG,CAI9C,IAHAH,GAAKrK,GAAK7D,IAAK,GAAK,EAEpBoO,EAAI,EACCjS,GAAI,GAAIA,GAAI,IAAM4D,GAAI,GAAI5D,GAAKA,GAAI,GAAM,EAAG,CAc7C,IAbA6R,IAAM/D,EAAIjK,GAAI,GAAK7D,GAAI,EAEvBiP,EAAM1B,EAAQsE,IAAO,CAAC,EAAI,EAAGpD,EAAMQ,EAAM,MAAQA,EAAMA,IAAQ,GAC3DC,EAAM3B,GAAQsE,GAAK,IAAM,CAAC,EAAI,EAAGnD,EAAMQ,EAAM,MAAQA,EAAMA,IAAQ,GACnEC,EAAM5B,GAAQsE,GAAK,IAAM,CAAC,EAAI,EAAGlD,EAAMQ,EAAM,MAAQA,EAAMA,IAAQ,GACnEC,EAAM7B,GAAQsE,GAAK,KAAO,CAAC,EAAI,EAAGjD,EAAMQ,EAAM,MAAQA,EAAMA,IAAQ,GACpEC,EAAM9B,GAAQsE,GAAK,KAAO,CAAC,EAAI,EAAGhD,EAAMQ,EAAM,MAAQA,EAAMA,IAAQ,GACpEC,EAAM/B,GAAQsE,GAAK,KAAO,CAAC,EAAI,EAAG/C,EAAMQ,EAAM,MAAQA,EAAMA,IAAQ,GACpEC,EAAMhC,GAAQsE,GAAK,KAAO,CAAC,EAAI,EAAG9C,EAAMQ,EAAM,MAAQA,EAAMA,IAAQ,GACpEC,GAAMjC,GAAQsE,GAAK,KAAO,CAAC,EAAI,EAAG7C,EAAMQ,GAAM,MAAQA,GAAMA,KAAQ,GAExEyB,GAAKC,GAAKC,GAAMC,GAAMC,GAAMC,GAAMC,GAAMC,GAAMtR,GAAI,EAE7CD,GAAI,GAAIA,GAAI,IAAM2D,GAAI,GAAI3D,GAAKA,GAAI,GAAM,EAC1CkS,KAAOrE,EAAIjK,GAAI,GAAKD,GAAI,GAAK3D,GAAI,EAEjCgQ,GAAM1C,EAAQ4E,IAAO,CAAC,EAAI,EAAG1C,GAAMQ,GAAM,MAAQA,GAAMA,KAAQ,GAC3DC,GAAM3C,GAAQ4E,GAAK,IAAM,CAAC,EAAI,EAAGzC,GAAMQ,GAAM,MAAQA,GAAMA,KAAQ,GACnEC,GAAM5C,GAAQ4E,GAAK,IAAM,CAAC,EAAI,EAAGxC,GAAMQ,GAAM,MAAQA,GAAMA,KAAQ,GACnEC,GAAM7C,GAAQ4E,GAAK,KAAO,CAAC,EAAI,EAAGvC,EAAMQ,GAAM,MAAQA,GAAMA,KAAQ,GACpEC,GAAM9C,GAAQ4E,GAAK,KAAO,CAAC,EAAI,EAAGtC,GAAMQ,GAAM,MAAQA,GAAMA,KAAQ,GACpEC,GAAM/C,GAAQ4E,GAAK,KAAO,CAAC,EAAI,EAAGrC,GAAMQ,GAAM,MAAQA,GAAMA,KAAQ,GACpEC,GAAMhD,GAAQ4E,GAAK,KAAO,CAAC,EAAI,EAAGpC,GAAMQ,GAAM,MAAQA,GAAMA,KAAQ,GACpEC,GAAMjD,GAAQ4E,GAAK,KAAO,CAAC,EAAI,EAAGnC,GAAMQ,GAAM,MAAQA,GAAMA,KAAQ,GAExEC,GAAKC,GAAKC,GAAKC,GAAKC,EAAKC,EAAKC,GAAKC,GAAK,EAExCS,IAAMjE,EAAKiB,EAAKgB,EAAG,EAAI,IAAMgB,GAAK,OAAU,IAAMQ,GAAK,OAAU,EACjES,IAAMlE,EAAKyB,EAAKQ,EAAG,EAAI,IAAMgB,KAAO,IAAM,IAAMQ,KAAO,IAAM,EAC7DU,IAAMnE,EAAKiB,EAAKwB,EAAG,EAAI,IAAMyB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAKyB,EAAKgB,EAAG,EAAI,IAAMyB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DlB,GAAMkB,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKiB,EAAKiB,EAAG,EAAI,IAAMgB,GAAK,OAAU,IAAMkB,EAAI,OAAU,EAChEF,IAAMlE,EAAKyB,EAAKS,EAAG,EAAI,IAAMgB,KAAO,IAAM,IAAMkB,IAAM,IAAM,EAC5DD,IAAMnE,EAAKiB,EAAKyB,EAAG,EAAI,IAAMwB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAKyB,EAAKiB,EAAG,EAAI,IAAMwB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DjB,GAAMiB,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKiB,EAAKkB,EAAG,EAAI,IAAMgB,GAAK,OAAU,IAAMiB,EAAI,OAAU,EAChEF,IAAMlE,EAAKyB,EAAKU,EAAG,EAAI,IAAMgB,KAAO,IAAM,IAAMiB,IAAM,IAAM,EAC5DD,IAAMnE,EAAKiB,EAAK0B,EAAG,EAAI,IAAMuB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAKyB,EAAKkB,EAAG,EAAI,IAAMuB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DhB,GAAMgB,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKiB,EAAKmB,CAAG,EAAI,IAAMgB,GAAK,OAAU,IAAMgB,EAAI,OAAU,EAChEF,IAAMlE,EAAKyB,EAAKW,CAAG,EAAI,IAAMgB,KAAO,IAAM,IAAMgB,IAAM,IAAM,EAC5DD,IAAMnE,EAAKiB,EAAK2B,EAAG,EAAI,IAAMsB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAKyB,EAAKmB,EAAG,EAAI,IAAMsB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Df,GAAMe,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKiB,EAAKoB,EAAG,EAAI,IAAMgB,EAAK,OAAU,IAAMe,EAAI,OAAU,EAChEF,IAAMlE,EAAKyB,EAAKY,EAAG,EAAI,IAAMgB,IAAO,IAAM,IAAMe,IAAM,IAAM,EAC5DD,IAAMnE,EAAKiB,EAAK4B,EAAG,EAAI,IAAMqB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAKyB,EAAKoB,EAAG,EAAI,IAAMqB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Dd,EAAMc,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKiB,EAAKqB,EAAG,EAAI,IAAMgB,EAAK,OAAU,IAAMc,EAAI,OAAU,EAChEF,IAAMlE,EAAKyB,EAAKa,EAAG,EAAI,IAAMgB,IAAO,IAAM,IAAMc,IAAM,IAAM,EAC5DD,IAAMnE,EAAKiB,EAAK6B,EAAG,EAAI,IAAMoB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAKyB,EAAKqB,EAAG,EAAI,IAAMoB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Db,EAAMa,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKiB,EAAKsB,EAAG,EAAI,IAAMgB,GAAK,OAAU,IAAMa,EAAI,OAAU,EAChEF,IAAMlE,EAAKyB,EAAKc,EAAG,EAAI,IAAMgB,KAAO,IAAM,IAAMa,IAAM,IAAM,EAC5DD,IAAMnE,EAAKiB,EAAK8B,EAAG,EAAI,IAAMmB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAKyB,EAAKsB,EAAG,EAAI,IAAMmB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DZ,GAAMY,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKiB,EAAKuB,EAAG,EAAI,IAAMgB,GAAK,OAAU,IAAMY,EAAI,OAAU,EAChEF,IAAMlE,EAAKyB,EAAKe,EAAG,EAAI,IAAMgB,KAAO,IAAM,IAAMY,IAAM,IAAM,EAC5DD,IAAMnE,EAAKiB,EAAK+B,EAAG,EAAI,IAAMkB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAKyB,EAAKuB,EAAG,EAAI,IAAMkB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DX,GAAMW,GAAK,GAAOF,EAAI,MAEtBR,GAAKW,EAELH,IAAMjE,EAAKkB,EAAKe,EAAG,EAAI,IAAMiB,GAAK,OAAU,IAAMQ,GAAK,OAAU,EACjEQ,IAAMlE,EAAK0B,EAAKO,EAAG,EAAI,IAAMiB,KAAO,IAAM,IAAMQ,KAAO,IAAM,EAC7DS,IAAMnE,EAAKkB,EAAKuB,EAAG,EAAI,IAAMyB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK0B,EAAKe,EAAG,EAAI,IAAMyB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DjB,GAAMiB,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKkB,EAAKgB,EAAG,EAAI,IAAMiB,GAAK,OAAU,IAAMiB,EAAI,OAAU,EAChEF,IAAMlE,EAAK0B,EAAKQ,EAAG,EAAI,IAAMiB,KAAO,IAAM,IAAMiB,IAAM,IAAM,EAC5DD,IAAMnE,EAAKkB,EAAKwB,EAAG,EAAI,IAAMwB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK0B,EAAKgB,EAAG,EAAI,IAAMwB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DhB,GAAMgB,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKkB,EAAKiB,EAAG,EAAI,IAAMiB,GAAK,OAAU,IAAMgB,EAAI,OAAU,EAChEF,IAAMlE,EAAK0B,EAAKS,EAAG,EAAI,IAAMiB,KAAO,IAAM,IAAMgB,IAAM,IAAM,EAC5DD,IAAMnE,EAAKkB,EAAKyB,EAAG,EAAI,IAAMuB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK0B,EAAKiB,EAAG,EAAI,IAAMuB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Df,GAAMe,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKkB,EAAKkB,CAAG,EAAI,IAAMiB,EAAK,OAAU,IAAMe,EAAI,OAAU,EAChEF,IAAMlE,EAAK0B,EAAKU,CAAG,EAAI,IAAMiB,IAAO,IAAM,IAAMe,IAAM,IAAM,EAC5DD,IAAMnE,EAAKkB,EAAK0B,EAAG,EAAI,IAAMsB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK0B,EAAKkB,EAAG,EAAI,IAAMsB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Dd,EAAMc,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKkB,EAAKmB,EAAG,EAAI,IAAMiB,EAAK,OAAU,IAAMc,EAAI,OAAU,EAChEF,IAAMlE,EAAK0B,EAAKW,EAAG,EAAI,IAAMiB,IAAO,IAAM,IAAMc,IAAM,IAAM,EAC5DD,IAAMnE,EAAKkB,EAAK2B,EAAG,EAAI,IAAMqB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK0B,EAAKmB,EAAG,EAAI,IAAMqB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Db,EAAMa,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKkB,EAAKoB,EAAG,EAAI,IAAMiB,GAAK,OAAU,IAAMa,EAAI,OAAU,EAChEF,IAAMlE,EAAK0B,EAAKY,EAAG,EAAI,IAAMiB,KAAO,IAAM,IAAMa,IAAM,IAAM,EAC5DD,IAAMnE,EAAKkB,EAAK4B,EAAG,EAAI,IAAMoB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK0B,EAAKoB,EAAG,EAAI,IAAMoB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DZ,GAAMY,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKkB,EAAKqB,EAAG,EAAI,IAAMiB,GAAK,OAAU,IAAMY,EAAI,OAAU,EAChEF,IAAMlE,EAAK0B,EAAKa,EAAG,EAAI,IAAMiB,KAAO,IAAM,IAAMY,IAAM,IAAM,EAC5DD,IAAMnE,EAAKkB,EAAK6B,EAAG,EAAI,IAAMmB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK0B,EAAKqB,EAAG,EAAI,IAAMmB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DX,GAAMW,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKkB,EAAKsB,EAAG,EAAI,IAAMiB,GAAK,OAAU,IAAMW,EAAI,OAAU,EAChEF,IAAMlE,EAAK0B,EAAKc,EAAG,EAAI,IAAMiB,KAAO,IAAM,IAAMW,IAAM,IAAM,EAC5DD,IAAMnE,EAAKkB,EAAK8B,EAAG,EAAI,IAAMkB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK0B,EAAKsB,EAAG,EAAI,IAAMkB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DV,GAAMU,GAAK,GAAOF,EAAI,MAEtBP,GAAKU,EAELH,IAAMjE,EAAKmB,EAAKc,EAAG,EAAI,IAAMkB,GAAK,OAAU,IAAMQ,GAAM,OAAU,EAClEO,IAAMlE,EAAK2B,EAAKM,EAAG,EAAI,IAAMkB,KAAO,IAAM,IAAMQ,KAAQ,IAAM,EAC9DQ,IAAMnE,EAAKmB,EAAKsB,EAAG,EAAI,IAAMyB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK2B,EAAKc,EAAG,EAAI,IAAMyB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DhB,GAAMgB,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKmB,EAAKe,EAAG,EAAI,IAAMkB,GAAK,OAAU,IAAMgB,EAAI,OAAU,EAChEF,IAAMlE,EAAK2B,EAAKO,EAAG,EAAI,IAAMkB,KAAO,IAAM,IAAMgB,IAAM,IAAM,EAC5DD,IAAMnE,EAAKmB,EAAKuB,EAAG,EAAI,IAAMwB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK2B,EAAKe,EAAG,EAAI,IAAMwB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Df,GAAMe,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKmB,EAAKgB,EAAG,EAAI,IAAMkB,EAAK,OAAU,IAAMe,EAAI,OAAU,EAChEF,IAAMlE,EAAK2B,EAAKQ,EAAG,EAAI,IAAMkB,IAAO,IAAM,IAAMe,IAAM,IAAM,EAC5DD,IAAMnE,EAAKmB,EAAKwB,EAAG,EAAI,IAAMuB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK2B,EAAKgB,EAAG,EAAI,IAAMuB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Dd,EAAMc,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKmB,EAAKiB,CAAG,EAAI,IAAMkB,EAAK,OAAU,IAAMc,EAAI,OAAU,EAChEF,IAAMlE,EAAK2B,EAAKS,CAAG,EAAI,IAAMkB,IAAO,IAAM,IAAMc,IAAM,IAAM,EAC5DD,IAAMnE,EAAKmB,EAAKyB,EAAG,EAAI,IAAMsB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK2B,EAAKiB,EAAG,EAAI,IAAMsB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Db,EAAMa,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKmB,EAAKkB,EAAG,EAAI,IAAMkB,GAAK,OAAU,IAAMa,EAAI,OAAU,EAChEF,IAAMlE,EAAK2B,EAAKU,EAAG,EAAI,IAAMkB,KAAO,IAAM,IAAMa,IAAM,IAAM,EAC5DD,IAAMnE,EAAKmB,EAAK0B,EAAG,EAAI,IAAMqB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK2B,EAAKkB,EAAG,EAAI,IAAMqB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DZ,GAAMY,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKmB,EAAKmB,EAAG,EAAI,IAAMkB,GAAK,OAAU,IAAMY,EAAI,OAAU,EAChEF,IAAMlE,EAAK2B,EAAKW,EAAG,EAAI,IAAMkB,KAAO,IAAM,IAAMY,IAAM,IAAM,EAC5DD,IAAMnE,EAAKmB,EAAK2B,EAAG,EAAI,IAAMoB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK2B,EAAKmB,EAAG,EAAI,IAAMoB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DX,GAAMW,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKmB,EAAKoB,EAAG,EAAI,IAAMkB,GAAK,OAAU,IAAMW,EAAI,OAAU,EAChEF,IAAMlE,EAAK2B,EAAKY,EAAG,EAAI,IAAMkB,KAAO,IAAM,IAAMW,IAAM,IAAM,EAC5DD,IAAMnE,EAAKmB,EAAK4B,EAAG,EAAI,IAAMmB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK2B,EAAKoB,EAAG,EAAI,IAAMmB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DV,GAAMU,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKmB,EAAKqB,EAAG,EAAI,IAAMkB,GAAK,OAAU,IAAMU,EAAI,OAAU,EAChEF,IAAMlE,EAAK2B,EAAKa,EAAG,EAAI,IAAMkB,KAAO,IAAM,IAAMU,IAAM,IAAM,EAC5DD,IAAMnE,EAAKmB,EAAK6B,EAAG,EAAI,IAAMkB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK2B,EAAKqB,EAAG,EAAI,IAAMkB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DT,GAAMS,GAAK,GAAOF,EAAI,MAEtBN,GAAMS,EAENH,IAAMjE,EAAKoB,EAAKa,EAAG,EAAI,IAAMmB,GAAK,OAAU,IAAMQ,GAAM,OAAU,EAClEM,IAAMlE,EAAK4B,EAAKK,EAAG,EAAI,IAAMmB,KAAO,IAAM,IAAMQ,KAAQ,IAAM,EAC9DO,IAAMnE,EAAKoB,EAAKqB,EAAG,EAAI,IAAMyB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK4B,EAAKa,EAAG,EAAI,IAAMyB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Df,GAAMe,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKoB,EAAKc,EAAG,EAAI,IAAMmB,EAAK,OAAU,IAAMe,EAAI,OAAU,EAChEF,IAAMlE,EAAK4B,EAAKM,EAAG,EAAI,IAAMmB,IAAO,IAAM,IAAMe,IAAM,IAAM,EAC5DD,IAAMnE,EAAKoB,EAAKsB,EAAG,EAAI,IAAMwB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK4B,EAAKc,EAAG,EAAI,IAAMwB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Dd,EAAMc,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKoB,EAAKe,EAAG,EAAI,IAAMmB,EAAK,OAAU,IAAMc,EAAI,OAAU,EAChEF,IAAMlE,EAAK4B,EAAKO,EAAG,EAAI,IAAMmB,IAAO,IAAM,IAAMc,IAAM,IAAM,EAC5DD,IAAMnE,EAAKoB,EAAKuB,EAAG,EAAI,IAAMuB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK4B,EAAKe,EAAG,EAAI,IAAMuB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Db,EAAMa,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKoB,EAAKgB,CAAG,EAAI,IAAMmB,GAAK,OAAU,IAAMa,EAAI,OAAU,EAChEF,IAAMlE,EAAK4B,EAAKQ,CAAG,EAAI,IAAMmB,KAAO,IAAM,IAAMa,IAAM,IAAM,EAC5DD,IAAMnE,EAAKoB,EAAKwB,EAAG,EAAI,IAAMsB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK4B,EAAKgB,EAAG,EAAI,IAAMsB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DZ,GAAMY,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKoB,EAAKiB,EAAG,EAAI,IAAMmB,GAAK,OAAU,IAAMY,EAAI,OAAU,EAChEF,IAAMlE,EAAK4B,EAAKS,EAAG,EAAI,IAAMmB,KAAO,IAAM,IAAMY,IAAM,IAAM,EAC5DD,IAAMnE,EAAKoB,EAAKyB,EAAG,EAAI,IAAMqB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK4B,EAAKiB,EAAG,EAAI,IAAMqB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DX,GAAMW,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKoB,EAAKkB,EAAG,EAAI,IAAMmB,GAAK,OAAU,IAAMW,EAAI,OAAU,EAChEF,IAAMlE,EAAK4B,EAAKU,EAAG,EAAI,IAAMmB,KAAO,IAAM,IAAMW,IAAM,IAAM,EAC5DD,IAAMnE,EAAKoB,EAAK0B,EAAG,EAAI,IAAMoB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK4B,EAAKkB,EAAG,EAAI,IAAMoB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DV,GAAMU,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKoB,EAAKmB,EAAG,EAAI,IAAMmB,GAAK,OAAU,IAAMU,EAAI,OAAU,EAChEF,IAAMlE,EAAK4B,EAAKW,EAAG,EAAI,IAAMmB,KAAO,IAAM,IAAMU,IAAM,IAAM,EAC5DD,IAAMnE,EAAKoB,EAAK2B,EAAG,EAAI,IAAMmB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK4B,EAAKmB,EAAG,EAAI,IAAMmB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DT,GAAMS,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKoB,EAAKoB,EAAG,EAAI,IAAMmB,GAAM,OAAU,IAAMS,EAAI,OAAU,EACjEF,IAAMlE,EAAK4B,EAAKY,EAAG,EAAI,IAAMmB,KAAQ,IAAM,IAAMS,IAAM,IAAM,EAC7DD,IAAMnE,EAAKoB,EAAK4B,EAAG,EAAI,IAAMkB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK4B,EAAKoB,EAAG,EAAI,IAAMkB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DR,GAAOQ,GAAK,GAAOF,EAAI,MAEvBL,GAAMQ,EAENH,IAAMjE,EAAKqB,EAAKY,EAAG,EAAI,IAAMoB,EAAK,OAAU,IAAMQ,GAAM,OAAU,EAClEK,IAAMlE,EAAK6B,EAAKI,EAAG,EAAI,IAAMoB,IAAO,IAAM,IAAMQ,KAAQ,IAAM,EAC9DM,IAAMnE,EAAKqB,EAAKoB,EAAG,EAAI,IAAMyB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK6B,EAAKY,EAAG,EAAI,IAAMyB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Dd,EAAMc,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKqB,EAAKa,EAAG,EAAI,IAAMoB,EAAK,OAAU,IAAMc,EAAI,OAAU,EAChEF,IAAMlE,EAAK6B,EAAKK,EAAG,EAAI,IAAMoB,IAAO,IAAM,IAAMc,IAAM,IAAM,EAC5DD,IAAMnE,EAAKqB,EAAKqB,EAAG,EAAI,IAAMwB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK6B,EAAKa,EAAG,EAAI,IAAMwB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Db,EAAMa,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKqB,EAAKc,EAAG,EAAI,IAAMoB,GAAK,OAAU,IAAMa,EAAI,OAAU,EAChEF,IAAMlE,EAAK6B,EAAKM,EAAG,EAAI,IAAMoB,KAAO,IAAM,IAAMa,IAAM,IAAM,EAC5DD,IAAMnE,EAAKqB,EAAKsB,EAAG,EAAI,IAAMuB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK6B,EAAKc,EAAG,EAAI,IAAMuB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DZ,GAAMY,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKqB,EAAKe,CAAG,EAAI,IAAMoB,GAAK,OAAU,IAAMY,EAAI,OAAU,EAChEF,IAAMlE,EAAK6B,EAAKO,CAAG,EAAI,IAAMoB,KAAO,IAAM,IAAMY,IAAM,IAAM,EAC5DD,IAAMnE,EAAKqB,EAAKuB,EAAG,EAAI,IAAMsB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK6B,EAAKe,EAAG,EAAI,IAAMsB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DX,GAAMW,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKqB,EAAKgB,EAAG,EAAI,IAAMoB,GAAK,OAAU,IAAMW,EAAI,OAAU,EAChEF,IAAMlE,EAAK6B,EAAKQ,EAAG,EAAI,IAAMoB,KAAO,IAAM,IAAMW,IAAM,IAAM,EAC5DD,IAAMnE,EAAKqB,EAAKwB,EAAG,EAAI,IAAMqB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK6B,EAAKgB,EAAG,EAAI,IAAMqB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DV,GAAMU,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKqB,EAAKiB,EAAG,EAAI,IAAMoB,GAAK,OAAU,IAAMU,EAAI,OAAU,EAChEF,IAAMlE,EAAK6B,EAAKS,EAAG,EAAI,IAAMoB,KAAO,IAAM,IAAMU,IAAM,IAAM,EAC5DD,IAAMnE,EAAKqB,EAAKyB,EAAG,EAAI,IAAMoB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK6B,EAAKiB,EAAG,EAAI,IAAMoB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DT,GAAMS,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKqB,EAAKkB,EAAG,EAAI,IAAMoB,GAAM,OAAU,IAAMS,EAAI,OAAU,EACjEF,IAAMlE,EAAK6B,EAAKU,EAAG,EAAI,IAAMoB,KAAQ,IAAM,IAAMS,IAAM,IAAM,EAC7DD,IAAMnE,EAAKqB,EAAK0B,EAAG,EAAI,IAAMmB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK6B,EAAKkB,EAAG,EAAI,IAAMmB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DR,GAAOQ,GAAK,GAAOF,EAAI,MAEvBA,IAAMjE,EAAKqB,EAAKmB,EAAG,EAAI,IAAMoB,GAAM,OAAU,IAAMQ,EAAI,OAAU,EACjEF,IAAMlE,EAAK6B,EAAKW,EAAG,EAAI,IAAMoB,KAAQ,IAAM,IAAMQ,IAAM,IAAM,EAC7DD,IAAMnE,EAAKqB,EAAK2B,EAAG,EAAI,IAAMkB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK6B,EAAKmB,EAAG,EAAI,IAAMkB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DP,GAAOO,GAAK,GAAOF,EAAI,MAEvBJ,GAAMO,EAENH,IAAMjE,EAAKsB,EAAKW,EAAG,EAAI,IAAMqB,EAAK,OAAU,IAAMQ,GAAM,OAAU,EAClEI,IAAMlE,EAAK8B,EAAKG,EAAG,EAAI,IAAMqB,IAAO,IAAM,IAAMQ,KAAQ,IAAM,EAC9DK,IAAMnE,EAAKsB,EAAKmB,EAAG,EAAI,IAAMyB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK8B,EAAKW,EAAG,EAAI,IAAMyB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3Db,EAAMa,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKsB,EAAKY,EAAG,EAAI,IAAMqB,GAAK,OAAU,IAAMa,EAAI,OAAU,EAChEF,IAAMlE,EAAK8B,EAAKI,EAAG,EAAI,IAAMqB,KAAO,IAAM,IAAMa,IAAM,IAAM,EAC5DD,IAAMnE,EAAKsB,EAAKoB,EAAG,EAAI,IAAMwB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK8B,EAAKY,EAAG,EAAI,IAAMwB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DZ,GAAMY,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKsB,EAAKa,EAAG,EAAI,IAAMqB,GAAK,OAAU,IAAMY,EAAI,OAAU,EAChEF,IAAMlE,EAAK8B,EAAKK,EAAG,EAAI,IAAMqB,KAAO,IAAM,IAAMY,IAAM,IAAM,EAC5DD,IAAMnE,EAAKsB,EAAKqB,EAAG,EAAI,IAAMuB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK8B,EAAKa,EAAG,EAAI,IAAMuB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DX,GAAMW,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKsB,EAAKc,CAAG,EAAI,IAAMqB,GAAK,OAAU,IAAMW,EAAI,OAAU,EAChEF,IAAMlE,EAAK8B,EAAKM,CAAG,EAAI,IAAMqB,KAAO,IAAM,IAAMW,IAAM,IAAM,EAC5DD,IAAMnE,EAAKsB,EAAKsB,EAAG,EAAI,IAAMsB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK8B,EAAKc,EAAG,EAAI,IAAMsB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DV,GAAMU,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKsB,EAAKe,EAAG,EAAI,IAAMqB,GAAK,OAAU,IAAMU,EAAI,OAAU,EAChEF,IAAMlE,EAAK8B,EAAKO,EAAG,EAAI,IAAMqB,KAAO,IAAM,IAAMU,IAAM,IAAM,EAC5DD,IAAMnE,EAAKsB,EAAKuB,EAAG,EAAI,IAAMqB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK8B,EAAKe,EAAG,EAAI,IAAMqB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DT,GAAMS,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKsB,EAAKgB,EAAG,EAAI,IAAMqB,GAAM,OAAU,IAAMS,EAAI,OAAU,EACjEF,IAAMlE,EAAK8B,EAAKQ,EAAG,EAAI,IAAMqB,KAAQ,IAAM,IAAMS,IAAM,IAAM,EAC7DD,IAAMnE,EAAKsB,EAAKwB,EAAG,EAAI,IAAMoB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK8B,EAAKgB,EAAG,EAAI,IAAMoB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DR,GAAOQ,GAAK,GAAOF,EAAI,MAEvBA,IAAMjE,EAAKsB,EAAKiB,EAAG,EAAI,IAAMqB,GAAM,OAAU,IAAMQ,EAAI,OAAU,EACjEF,IAAMlE,EAAK8B,EAAKS,EAAG,EAAI,IAAMqB,KAAQ,IAAM,IAAMQ,IAAM,IAAM,EAC7DD,IAAMnE,EAAKsB,EAAKyB,EAAG,EAAI,IAAMmB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK8B,EAAKiB,EAAG,EAAI,IAAMmB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DP,GAAOO,GAAK,GAAOF,EAAI,MAEvBA,IAAMjE,EAAKsB,EAAKkB,EAAG,EAAI,IAAMqB,GAAM,OAAU,IAAMO,EAAI,OAAU,EACjEF,IAAMlE,EAAK8B,EAAKU,EAAG,EAAI,IAAMqB,KAAQ,IAAM,IAAMO,IAAM,IAAM,EAC7DD,IAAMnE,EAAKsB,EAAK0B,EAAG,EAAI,IAAMkB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK8B,EAAKkB,EAAG,EAAI,IAAMkB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DN,GAAOM,GAAK,GAAOF,EAAI,MAEvBH,GAAMM,EAENH,IAAMjE,EAAKuB,EAAKU,EAAG,EAAI,IAAMsB,GAAK,OAAU,IAAMQ,GAAM,OAAU,EAClEG,IAAMlE,EAAK+B,EAAKE,EAAG,EAAI,IAAMsB,KAAO,IAAM,IAAMQ,KAAQ,IAAM,EAC9DI,IAAMnE,EAAKuB,EAAKkB,EAAG,EAAI,IAAMyB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK+B,EAAKU,EAAG,EAAI,IAAMyB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DZ,GAAMY,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKuB,EAAKW,EAAG,EAAI,IAAMsB,GAAK,OAAU,IAAMY,EAAI,OAAU,EAChEF,IAAMlE,EAAK+B,EAAKG,EAAG,EAAI,IAAMsB,KAAO,IAAM,IAAMY,IAAM,IAAM,EAC5DD,IAAMnE,EAAKuB,EAAKmB,EAAG,EAAI,IAAMwB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK+B,EAAKW,EAAG,EAAI,IAAMwB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DX,GAAMW,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKuB,EAAKY,EAAG,EAAI,IAAMsB,GAAK,OAAU,IAAMW,EAAI,OAAU,EAChEF,IAAMlE,EAAK+B,EAAKI,EAAG,EAAI,IAAMsB,KAAO,IAAM,IAAMW,IAAM,IAAM,EAC5DD,IAAMnE,EAAKuB,EAAKoB,EAAG,EAAI,IAAMuB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK+B,EAAKY,EAAG,EAAI,IAAMuB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DV,GAAMU,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKuB,EAAKa,CAAG,EAAI,IAAMsB,GAAK,OAAU,IAAMU,EAAI,OAAU,EAChEF,IAAMlE,EAAK+B,EAAKK,CAAG,EAAI,IAAMsB,KAAO,IAAM,IAAMU,IAAM,IAAM,EAC5DD,IAAMnE,EAAKuB,EAAKqB,EAAG,EAAI,IAAMsB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK+B,EAAKa,EAAG,EAAI,IAAMsB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DT,GAAMS,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKuB,EAAKc,EAAG,EAAI,IAAMsB,GAAM,OAAU,IAAMS,EAAI,OAAU,EACjEF,IAAMlE,EAAK+B,EAAKM,EAAG,EAAI,IAAMsB,KAAQ,IAAM,IAAMS,IAAM,IAAM,EAC7DD,IAAMnE,EAAKuB,EAAKsB,EAAG,EAAI,IAAMqB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK+B,EAAKc,EAAG,EAAI,IAAMqB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DR,GAAOQ,GAAK,GAAOF,EAAI,MAEvBA,IAAMjE,EAAKuB,EAAKe,EAAG,EAAI,IAAMsB,GAAM,OAAU,IAAMQ,EAAI,OAAU,EACjEF,IAAMlE,EAAK+B,EAAKO,EAAG,EAAI,IAAMsB,KAAQ,IAAM,IAAMQ,IAAM,IAAM,EAC7DD,IAAMnE,EAAKuB,EAAKuB,EAAG,EAAI,IAAMoB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK+B,EAAKe,EAAG,EAAI,IAAMoB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DP,GAAOO,GAAK,GAAOF,EAAI,MAEvBA,IAAMjE,EAAKuB,EAAKgB,EAAG,EAAI,IAAMsB,GAAM,OAAU,IAAMO,EAAI,OAAU,EACjEF,IAAMlE,EAAK+B,EAAKQ,EAAG,EAAI,IAAMsB,KAAQ,IAAM,IAAMO,IAAM,IAAM,EAC7DD,IAAMnE,EAAKuB,EAAKwB,EAAG,EAAI,IAAMmB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK+B,EAAKgB,EAAG,EAAI,IAAMmB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DN,GAAOM,GAAK,GAAOF,EAAI,MAEvBA,IAAMjE,EAAKuB,EAAKiB,EAAG,EAAI,IAAMsB,GAAM,OAAU,IAAMM,EAAI,OAAU,EACjEF,IAAMlE,EAAK+B,EAAKS,EAAG,EAAI,IAAMsB,KAAQ,IAAM,IAAMM,IAAM,IAAM,EAC7DD,IAAMnE,EAAKuB,EAAKyB,EAAG,EAAI,IAAMkB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAK+B,EAAKiB,EAAG,EAAI,IAAMkB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DL,GAAOK,GAAK,GAAOF,EAAI,MAEvBF,GAAMK,EAENH,IAAMjE,EAAKwB,EAAKS,EAAG,EAAI,IAAMuB,GAAK,OAAU,IAAMQ,GAAM,OAAU,EAClEE,IAAMlE,EAAKgC,GAAKC,EAAG,EAAI,IAAMuB,KAAO,IAAM,IAAMQ,KAAQ,IAAM,EAC9DG,IAAMnE,EAAKwB,EAAKiB,EAAG,EAAI,IAAMyB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAKgC,GAAKS,EAAG,EAAI,IAAMyB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DX,GAAMW,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKwB,EAAKU,EAAG,EAAI,IAAMuB,GAAK,OAAU,IAAMW,EAAI,OAAU,EAChEF,IAAMlE,EAAKgC,GAAKE,EAAG,EAAI,IAAMuB,KAAO,IAAM,IAAMW,IAAM,IAAM,EAC5DD,IAAMnE,EAAKwB,EAAKkB,EAAG,EAAI,IAAMwB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAKgC,GAAKU,EAAG,EAAI,IAAMwB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DV,GAAMU,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKwB,EAAKW,EAAG,EAAI,IAAMuB,GAAK,OAAU,IAAMU,EAAI,OAAU,EAChEF,IAAMlE,EAAKgC,GAAKG,EAAG,EAAI,IAAMuB,KAAO,IAAM,IAAMU,IAAM,IAAM,EAC5DD,IAAMnE,EAAKwB,EAAKmB,EAAG,EAAI,IAAMuB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAKgC,GAAKW,EAAG,EAAI,IAAMuB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DT,GAAMS,GAAK,GAAOF,EAAI,MAEtBA,IAAMjE,EAAKwB,EAAKY,CAAG,EAAI,IAAMuB,GAAM,OAAU,IAAMS,EAAI,OAAU,EACjEF,IAAMlE,EAAKgC,GAAKI,CAAG,EAAI,IAAMuB,KAAQ,IAAM,IAAMS,IAAM,IAAM,EAC7DD,IAAMnE,EAAKwB,EAAKoB,EAAG,EAAI,IAAMsB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAKgC,GAAKY,EAAG,EAAI,IAAMsB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DR,GAAOQ,GAAK,GAAOF,EAAI,MAEvBA,IAAMjE,EAAKwB,EAAKa,EAAG,EAAI,IAAMuB,GAAM,OAAU,IAAMQ,EAAI,OAAU,EACjEF,IAAMlE,EAAKgC,GAAKK,EAAG,EAAI,IAAMuB,KAAQ,IAAM,IAAMQ,IAAM,IAAM,EAC7DD,IAAMnE,EAAKwB,EAAKqB,EAAG,EAAI,IAAMqB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAKgC,GAAKa,EAAG,EAAI,IAAMqB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DP,GAAOO,GAAK,GAAOF,EAAI,MAEvBA,IAAMjE,EAAKwB,EAAKc,EAAG,EAAI,IAAMuB,GAAM,OAAU,IAAMO,EAAI,OAAU,EACjEF,IAAMlE,EAAKgC,GAAKM,EAAG,EAAI,IAAMuB,KAAQ,IAAM,IAAMO,IAAM,IAAM,EAC7DD,IAAMnE,EAAKwB,EAAKsB,EAAG,EAAI,IAAMoB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAKgC,GAAKc,EAAG,EAAI,IAAMoB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DN,GAAOM,GAAK,GAAOF,EAAI,MAEvBA,IAAMjE,EAAKwB,EAAKe,EAAG,EAAI,IAAMuB,GAAM,OAAU,IAAMM,EAAI,OAAU,EACjEF,IAAMlE,EAAKgC,GAAKO,EAAG,EAAI,IAAMuB,KAAQ,IAAM,IAAMM,IAAM,IAAM,EAC7DD,IAAMnE,EAAKwB,EAAKuB,EAAG,EAAI,IAAMmB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAKgC,GAAKe,EAAG,EAAI,IAAMmB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DL,GAAOK,GAAK,GAAOF,EAAI,MAEvBA,IAAMjE,EAAKwB,EAAKgB,EAAG,EAAI,IAAMuB,GAAM,OAAU,IAAMK,EAAI,OAAU,EACjEF,IAAMlE,EAAKgC,GAAKQ,EAAG,EAAI,IAAMuB,KAAQ,IAAM,IAAMK,IAAM,IAAM,EAC7DD,IAAMnE,EAAKwB,EAAKwB,EAAG,EAAI,IAAMkB,EAAI,OAAU,IAAMD,IAAM,IAAM,EAC7DG,IAAMpE,EAAKgC,GAAKgB,EAAG,EAAI,IAAMkB,IAAM,IAAM,IAAMC,IAAM,IAAM,EAC3DJ,GAAOI,GAAK,GAAOF,EAAI,MAEvBD,GAAMI,EAEN1L,GAAItC,IAAK5D,GAAIC,GAAI,GAAK,EACtBuB,EAAI+L,EAAQwE,GAAK7L,IAAM,CAAC,EAAI,EAC5BuL,IAAMjQ,EAAI,SAAYiP,GAAK,QAAW,GAAK,GAAKvQ,GAAI,EACpDyR,IAAMnQ,IAAM,KAAQiP,KAAO,IAAO,GAAK,IAAMgB,IAAM,IAAM,EACzDlE,EAAQwE,GAAK7L,IAAM,CAAC,EAAKyL,GAAK,GAAOF,EAAI,MACzCvR,GAAIyR,IAAM,GAEVzL,GAAIA,GAAI,EAAI,EACZ1E,EAAI+L,EAAQwE,GAAK7L,IAAM,CAAC,EAAI,EAC5BuL,IAAMjQ,EAAI,SAAYkP,GAAK,QAAW,GAAK,GAAKxQ,GAAI,EACpDyR,IAAMnQ,IAAM,KAAQkP,KAAO,IAAO,GAAK,IAAMe,IAAM,IAAM,EACzDlE,EAAQwE,GAAK7L,IAAM,CAAC,EAAKyL,GAAK,GAAOF,EAAI,MACzCvR,GAAIyR,IAAM,GAEVzL,GAAIA,GAAI,EAAI,EACZ1E,EAAI+L,EAAQwE,GAAK7L,IAAM,CAAC,EAAI,EAC5BuL,IAAMjQ,EAAI,SAAYmP,GAAK,QAAW,GAAK,GAAKzQ,GAAI,EACpDyR,IAAMnQ,IAAM,KAAQmP,KAAO,IAAO,GAAK,IAAMc,IAAM,IAAM,EACzDlE,EAAQwE,GAAK7L,IAAM,CAAC,EAAKyL,GAAK,GAAOF,EAAI,MACzCvR,GAAIyR,IAAM,GAEVzL,GAAIA,GAAI,EAAI,EACZ1E,EAAI+L,EAAQwE,GAAK7L,IAAM,CAAC,EAAI,EAC5BuL,IAAMjQ,EAAI,SAAYoP,GAAK,QAAW,GAAK,GAAK1Q,GAAI,EACpDyR,IAAMnQ,IAAM,KAAQoP,KAAO,IAAO,GAAK,IAAMa,IAAM,IAAM,EACzDlE,EAAQwE,GAAK7L,IAAM,CAAC,EAAKyL,GAAK,GAAOF,EAAI,MACzCvR,GAAIyR,IAAM,GAEVzL,GAAIA,GAAI,EAAI,EACZ1E,EAAI+L,EAAQwE,GAAK7L,IAAM,CAAC,EAAI,EAC5BuL,IAAMjQ,EAAI,SAAYqP,EAAK,QAAW,GAAK,GAAK3Q,GAAI,EACpDyR,IAAMnQ,IAAM,KAAQqP,IAAO,IAAO,GAAK,IAAMY,IAAM,IAAM,EACzDlE,EAAQwE,GAAK7L,IAAM,CAAC,EAAKyL,GAAK,GAAOF,EAAI,MACzCvR,GAAIyR,IAAM,GAEVzL,GAAIA,GAAI,EAAI,EACZ1E,EAAI+L,EAAQwE,GAAK7L,IAAM,CAAC,EAAI,EAC5BuL,IAAMjQ,EAAI,SAAYsP,EAAK,QAAW,GAAK,GAAK5Q,GAAI,EACpDyR,IAAMnQ,IAAM,KAAQsP,IAAO,IAAO,GAAK,IAAMW,IAAM,IAAM,EACzDlE,EAAQwE,GAAK7L,IAAM,CAAC,EAAKyL,GAAK,GAAOF,EAAI,MACzCvR,GAAIyR,IAAM,GAEVzL,GAAIA,GAAI,EAAI,EACZ1E,EAAI+L,EAAQwE,GAAK7L,IAAM,CAAC,EAAI,EAC5BuL,IAAMjQ,EAAI,SAAYuP,GAAK,QAAW,GAAK,GAAK7Q,GAAI,EACpDyR,IAAMnQ,IAAM,KAAQuP,KAAO,IAAO,GAAK,IAAMU,IAAM,IAAM,EACzDlE,EAAQwE,GAAK7L,IAAM,CAAC,EAAKyL,GAAK,GAAOF,EAAI,MACzCvR,GAAIyR,IAAM,GAEVzL,GAAIA,GAAI,EAAI,EACZ1E,EAAI+L,EAAQwE,GAAK7L,IAAM,CAAC,EAAI,EAC5BuL,IAAMjQ,EAAI,SAAYwP,GAAK,QAAW,GAAK,GAAK9Q,GAAI,EACpDyR,IAAMnQ,IAAM,KAAQwP,KAAO,IAAO,GAAK,IAAMS,IAAM,IAAM,EACzDlE,EAAQwE,GAAK7L,IAAM,CAAC,EAAKyL,GAAK,GAAOF,EAAI,MACzCvR,GAAIyR,IAAM,GAGdzL,GAAItC,IAAK5D,GAAIC,GAAI,GAAK,EACtBuB,EAAI+L,EAAQwE,GAAK7L,IAAM,CAAC,EAAI,EAC5BuL,KAAOjQ,EAAI,SAAYyP,GAAK,QAAW,GAAK,GAAK/Q,GAAI,GAAK+R,EAAI,EAC9DN,IAAMnQ,IAAM,KAAQyP,KAAO,IAAO,GAAK,IAAMQ,IAAM,IAAM,EACzDlE,EAAQwE,GAAK7L,IAAM,CAAC,EAAKyL,GAAK,GAAOF,EAAI,MACzCvR,GAAIyR,IAAM,GAEVzL,GAAIA,GAAI,EAAI,EACZ1E,EAAI+L,EAAQwE,GAAK7L,IAAM,CAAC,EAAI,EAC5BuL,IAAMjQ,EAAI,SAAY0P,GAAK,QAAW,GAAK,GAAKhR,GAAI,EACpDyR,IAAMnQ,IAAM,KAAQ0P,KAAO,IAAO,GAAK,IAAMO,IAAM,IAAM,EACzDlE,EAAQwE,GAAK7L,IAAM,CAAC,EAAKyL,GAAK,GAAOF,EAAI,MACzCvR,GAAIyR,IAAM,GAEVzL,GAAIA,GAAI,EAAI,EACZ1E,EAAI+L,EAAQwE,GAAK7L,IAAM,CAAC,EAAI,EAC5BuL,IAAMjQ,EAAI,SAAY2P,GAAM,QAAW,GAAK,GAAKjR,GAAI,EACrDyR,IAAMnQ,IAAM,KAAQ2P,KAAQ,IAAO,GAAK,IAAMM,IAAM,IAAM,EAC1DlE,EAAQwE,GAAK7L,IAAM,CAAC,EAAKyL,GAAK,GAAOF,EAAI,MACzCvR,GAAIyR,IAAM,GAEVzL,GAAIA,GAAI,EAAI,EACZ1E,EAAI+L,EAAQwE,GAAK7L,IAAM,CAAC,EAAI,EAC5BuL,IAAMjQ,EAAI,SAAY4P,GAAM,QAAW,GAAK,GAAKlR,GAAI,EACrDyR,IAAMnQ,IAAM,KAAQ4P,KAAQ,IAAO,GAAK,IAAMK,IAAM,IAAM,EAC1DlE,EAAQwE,GAAK7L,IAAM,CAAC,EAAKyL,GAAK,GAAOF,EAAI,MACzCvR,GAAIyR,IAAM,GAEVzL,GAAIA,GAAI,EAAI,EACZ1E,EAAI+L,EAAQwE,GAAK7L,IAAM,CAAC,EAAI,EAC5BuL,IAAMjQ,EAAI,SAAY6P,GAAM,QAAW,GAAK,GAAKnR,GAAI,EACrDyR,IAAMnQ,IAAM,KAAQ6P,KAAQ,IAAO,GAAK,IAAMI,IAAM,IAAM,EAC1DlE,EAAQwE,GAAK7L,IAAM,CAAC,EAAKyL,GAAK,GAAOF,EAAI,MACzCvR,GAAIyR,IAAM,GAEVzL,GAAIA,GAAI,EAAI,EACZ1E,EAAI+L,EAAQwE,GAAK7L,IAAM,CAAC,EAAI,EAC5BuL,IAAMjQ,EAAI,SAAY8P,GAAM,QAAW,GAAK,GAAKpR,GAAI,EACrDyR,IAAMnQ,IAAM,KAAQ8P,KAAQ,IAAO,GAAK,IAAMG,IAAM,IAAM,EAC1DlE,EAAQwE,GAAK7L,IAAM,CAAC,EAAKyL,GAAK,GAAOF,EAAI,MACzCvR,GAAIyR,IAAM,GAEVzL,GAAIA,GAAI,EAAI,EACZ1E,EAAI+L,EAAQwE,GAAK7L,IAAM,CAAC,EAAI,EAC5BuL,IAAMjQ,EAAI,SAAY+P,GAAM,QAAW,GAAK,GAAKrR,GAAI,EACrDyR,IAAMnQ,IAAM,KAAQ+P,KAAQ,IAAO,GAAK,IAAME,IAAM,IAAM,EAC1DlE,EAAQwE,GAAK7L,IAAM,CAAC,EAAKyL,GAAK,GAAOF,EAAI,MACzCvR,GAAIyR,IAAM,GAEVzL,GAAIA,GAAI,EAAI,EACZ1E,EAAI+L,EAAQwE,GAAK7L,IAAM,CAAC,EAAI,EAC5BuL,IAAMjQ,EAAI,SAAYgQ,GAAM,QAAW,GAAK,GAAKtR,GAAI,EACrDyR,IAAMnQ,IAAM,KAAQgQ,KAAQ,IAAO,GAAK,IAAMC,IAAM,IAAM,EAC1DlE,EAAQwE,GAAK7L,IAAM,CAAC,EAAKyL,GAAK,GAAOF,EAAI,MACzCQ,EAAIN,IAAM,EACd,CAEA,IAAKzL,GAAIA,GAAI,EAAI,EAAG,CAAC,CAAC+L,GAAM/L,GAAI,GAAMgM,IAAM,EAAKhM,GAAKA,GAAI,EAAK,EAC3D1E,EAAI+L,EAAQwE,GAAK7L,IAAM,CAAC,EAAI,EAC5BuL,GAAKjQ,EAAI,OAAUyQ,EAAI,EACvBN,GAAKnQ,IAAM,KAAOiQ,IAAM,IAAM,EAC9BlE,EAAQwE,GAAK7L,IAAM,CAAC,EAAKyL,GAAK,GAAOF,EAAI,MACzCQ,EAAIN,IAAM,EAElB,CAER,CAgBA,SAASS,EAAIC,EAAGC,EAAIC,EAAGC,EAAIC,EAAG,CAC1BJ,EAAIA,EAAI,EACRC,EAAKA,EAAK,EACVC,EAAIA,EAAI,EACRC,EAAKA,EAAK,EACVC,EAAIA,EAAI,EAER,IAAIC,EAAI,EAAG9O,EAAI,EAAG+O,EAAI,EAClBC,EAAK,EAAGC,EAAK,EACbC,EAAK,EAAGC,EAAK,EAAGC,EAAK,EACrBC,EAAK,EAAGC,EAAK,EAAGC,EAAK,EAAGC,EAAK,EAC7BlL,EAAK,EAAGrG,GAAK,EAAG+P,GAAI,EAAG1R,GAAI,EAC3BF,GAAI,EAAGC,EAAI,EAAGiG,GAAI,EAGtB,IAAKlG,GAAKsS,EAAK,EAAK,IAAKtS,GAAI,IAAM,EAAGA,GAAKA,GAAI,EAAK,EAEhD,GADA0S,EAAInF,EAAQ8E,EAAIrS,IAAM,CAAC,EAAI,EACvB0S,EAAG,CACHJ,EAAKtS,GACL,KACJ,CAIJ,IAAKA,GAAKwS,EAAK,EAAK,IAAKxS,GAAI,IAAM,EAAGA,GAAKA,GAAI,EAAK,EAEhD,GADA4D,EAAI2J,EAAQgF,EAAIvS,IAAM,CAAC,EAAI,EACvB4D,EAAG,CACH4O,EAAKxS,GACL,KACJ,CAMJ,MAAQ4D,EAAI,aAAe,GACvBA,EAAIA,GAAK,EACT+O,EAAIA,EAAI,EAAI,EAKhB,GADAE,EAAKtF,EAAQ8E,EAAIC,GAAO,CAAC,EAAI,EACzBK,EAAG,CAEH,IADAC,EAAKC,KAAQ,GAAKF,EAAI,GACjB3S,GAAKsS,EAAK,EAAK,GAAItS,GAAI,IAAM,EAAGA,GAAKA,GAAI,EAAK,EAC/C0S,EAAInF,EAAQ8E,EAAIrS,IAAM,CAAC,EAAI,EAC3BuN,EAAQ8E,EAAIrS,GAAI,GAAM,CAAC,EAAK6S,GAAMF,GAAMA,EAAID,KAAO,GAAKC,EAAI,GAAK,GACjEE,EAAKH,EAETnF,EAAO8E,GAAK,CAAC,EAAIQ,GAAMF,CAC3B,CAGA,GAAIA,EAAG,CAEH,IADAG,EAAKvF,EAAQgF,EAAIC,GAAO,CAAC,EAAI,EACxBxS,GAAKwS,EAAK,EAAK,GAAIxS,GAAI,IAAM,EAAGA,GAAKA,GAAI,EAAK,EAC/C4D,EAAI2J,EAAQgF,EAAIvS,IAAM,CAAC,EAAI,EAC3BuN,EAAQgF,EAAIvS,GAAI,GAAM,CAAC,EAAK8S,GAAMH,EAAM/O,KAAO,GAAK+O,EAAI,GACxDG,EAAKlP,EAET2J,EAAOgF,GAAK,CAAC,EAAIO,GAAMH,CAC3B,CAOA,IAJAG,EAAKvF,EAAQgF,EAAIC,GAAO,CAAC,EAAI,EAC7BO,EAAKD,IAAO,GAAIE,EAAKF,EAAK,MAGrB9S,GAAIsS,GAAKtS,GAAI,KAAOwS,EAAK,GAAIxS,GAAKA,GAAI,EAAK,EAAG,CAM/C,IALAC,EAAKD,GAAIwS,EAAM,EAGfK,EAAKtF,EAAQ8E,EAAIrS,IAAM,CAAC,EAAI,EAC5BiT,GAAOL,IAAO,IAAMG,IAAO,GAAM,EAAGI,GAAOP,IAAO,IAAMG,IAAO,GAAM,EAAG7K,EAAKsF,EAAKyF,EAAID,CAAE,EAAI,GACnFC,EAAK,IAAM,MAAa/K,IAAO,GAAQiL,GAAM,GAAON,IAAO,MAAS,IACzEI,EAAMA,EAAK,EAAK,EAAGE,EAAMA,EAAKJ,EAAM,EAAG7K,EAAMA,EAAK8K,EAAM,EACnD,GAAAG,EAAK,IAAM,SAAhB,CAMJ,IADAvB,GAAI,EAAG1R,GAAI,EACNgG,GAAI,GAAIA,GAAI,KAAOsM,EAAK,GAAItM,GAAKA,GAAI,EAAK,EAC3CtC,EAAI2J,EAAQgF,EAAIrM,IAAM,CAAC,EAAI,EAC3BgC,GAAMsF,EAAKyF,EAAIrP,EAAI,KAAM,EAAI,IAAMgO,KAAM,IAAM,EAC/C/P,IAAM2L,EAAKyF,EAAIrP,IAAM,EAAE,EAAI,IAAMsE,IAAO,IAAM,EAC9CtE,EAAKgO,GAAI,MAAW1J,GAAM,GAC1B0J,GAAI/P,GACJ6Q,EAAInF,EAAQ8E,EAAIpS,EAAIiG,IAAM,CAAC,EAAI,EAC/BgC,IAAOwK,EAAI,QAAW9O,EAAI,OAAU,GAAK1D,GAAI,EAC7C2B,KAAO6Q,IAAM,KAAO9O,IAAM,IAAM,IAAMsE,GAAM,IAAM,EAClDqF,EAAQ8E,EAAIpS,EAAIiG,IAAM,CAAC,EAAKrE,IAAM,GAAOqG,EAAK,MAC9ChI,GAAI2B,IAAM,GAQd,GANAqG,IAAO0K,EAAK,QAAWhB,GAAI,OAAU,GAAK1R,GAAI,EAC9C2B,KAAO+Q,IAAO,KAAOhB,KAAM,IAAM,IAAM1J,GAAM,IAAM,EACnD0K,EAAM/Q,IAAM,GAAOqG,EAAK,MACxBhI,GAAI2B,IAAM,GAGN3B,GAAG,CAGH,IAFA+S,EAAMA,EAAK,EAAK,EAChB/S,GAAI,EACCgG,GAAI,GAAIA,GAAI,KAAOsM,EAAK,GAAItM,GAAKA,GAAI,EAAK,EAC3CtC,EAAI2J,EAAQgF,EAAIrM,IAAM,CAAC,EAAI,EAC3BwM,EAAInF,EAAQ8E,EAAIpS,EAAIiG,IAAM,CAAC,EAAI,EAC/BgC,GAAMwK,EAAI,OAAUxS,GAAI,EACxB2B,IAAM6Q,IAAM,IAAM9O,GAAKsE,IAAO,IAAM,EACpCqF,EAAQ8E,EAAIpS,EAAIiG,IAAM,CAAC,EAAKrE,IAAM,GAAOqG,EAAK,MAC9ChI,GAAI2B,KAAO,GAEf+Q,EAAMA,EAAK1S,GAAK,CACpB,CAMA,IAHA2S,EAAKtF,EAAQ8E,EAAIrS,IAAM,CAAC,EAAI,EAC5B0S,EAAKE,GAAM,GAAOC,IAAO,GACzBK,GAAOR,IAAM,IAAMK,IAAO,GAAM,EAAGK,GAAOV,IAAM,IAAMK,IAAO,GAAM,EAAG7K,EAAKsF,EAAK0F,EAAIF,CAAE,EAAI,GACjFE,EAAK,IAAM,MAAahL,IAAO,GAAQkL,GAAM,GAAOP,EAAK,SAAa,IAC3EK,EAAMA,EAAK,EAAK,EAAGE,EAAMA,EAAKL,EAAM,EAAG7K,EAAMA,EAAK8K,EAAM,EACnD,GAAAI,EAAK,IAAM,SAAhB,CAMJ,IADAxB,GAAI,EAAG1R,GAAI,EACNgG,GAAI,GAAIA,GAAI,KAAOsM,EAAK,GAAItM,GAAKA,GAAI,EAAK,EAC3CtC,EAAI2J,EAAQgF,EAAIrM,IAAM,CAAC,EAAI,EAC3BgC,GAAMsF,EAAK0F,EAAItP,EAAI,KAAM,EAAI,IAAMgO,GAAI,OAAU,EACjD/P,KAAO2L,EAAK0F,EAAItP,IAAM,EAAE,EAAI,IAAMsE,IAAO,IAAM,IAAM0J,KAAM,IAAM,EACjEhO,EAAKsE,EAAK,MAAWrG,IAAM,GAC3B+P,GAAI/P,KAAO,GACX6Q,EAAInF,EAAQ8E,EAAIpS,EAAIiG,IAAM,CAAC,EAAI,EAC/BgC,IAAOwK,EAAI,QAAW9O,EAAI,OAAU,GAAK1D,GAAI,EAC7C2B,KAAO6Q,IAAM,KAAO9O,IAAM,IAAM,IAAMsE,GAAM,IAAM,EAClDhI,GAAI2B,IAAM,GACV0L,EAAQ8E,EAAIpS,EAAIiG,IAAM,CAAC,EAAKrE,IAAM,GAAOqG,EAAK,MAOlD,GALAA,IAAO0K,EAAK,QAAWhB,GAAI,OAAU,GAAK1R,GAAI,EAC9C2B,KAAO+Q,IAAO,KAAOhB,KAAM,IAAM,IAAM1J,GAAM,IAAM,EACnDhI,GAAI2B,IAAM,GAGN3B,GAGA,IAFAgT,EAAMA,EAAK,EAAK,EAChBhT,GAAI,EACCgG,GAAI,GAAIA,GAAI,KAAOsM,EAAK,GAAItM,GAAKA,GAAI,EAAK,EAC3CtC,EAAI2J,EAAQgF,EAAIrM,IAAM,CAAC,EAAI,EAC3BwM,EAAInF,EAAQ8E,EAAIpS,EAAIiG,IAAM,CAAC,EAAI,EAC/BgC,IAAOwK,EAAI,QAAW9O,EAAI,OAAU,GAAK1D,GAAI,EAC7C2B,KAAO6Q,IAAM,KAAO9O,IAAM,IAAM,IAAMsE,IAAO,IAAM,EACnDhI,GAAI2B,KAAO,GACX0L,EAAQ8E,EAAIpS,EAAIiG,IAAM,CAAC,EAAKgC,EAAK,MAAWrG,IAAM,GAK1D0L,EAAQkF,EAAIxS,GAAM,CAAC,EAAKgT,GAAM,GAAMC,EAEpCN,EAAKrF,EAAQ8E,EAAIrS,IAAM,CAAC,EAAI,CAChC,CAEA,GAAI2S,EAAG,CAKH,IADAE,EAAKtF,EAAO8E,GAAK,CAAC,EAAI,EACjBrS,GAAI,GAAIA,GAAI,KAAOwS,EAAK,GAAIxS,GAAKA,GAAI,EAAK,EAC3C0S,EAAInF,EAAQ8E,EAAIrS,IAAM,CAAC,EAAI,EAC3BuN,EAAQ8E,EAAIrS,GAAI,GAAM,CAAC,EAAK0S,IAAM,GAAKC,EAAI,GAAOE,IAAOF,EACzDE,EAAKH,EAETnF,EAAQ8E,EAAIG,GAAO,CAAC,EAAIK,IAAOF,CACnC,CACJ,CAcA,SAASU,EAAMvF,EAAGG,EAAIoE,EAAGC,EAAIgB,EAAG5L,EAAG,CAC/BoG,EAAIA,EAAI,EACRG,EAAKA,EAAK,EACVoE,EAAIA,EAAI,EACRC,EAAKA,EAAK,EACVgB,EAAIA,EAAI,EACR5L,EAAIA,EAAI,EAER,IAAI,EAAI,EACJxH,EAAI,EAAGqT,EAAK,EAAGC,EAAK,EAAGR,EAAK,EAAGD,EAAK,EAAGU,EAAK,EAAGC,EAAK,EAAGC,EAAK,EAAGlD,EAAK,EAAGC,EAAK,EAC5E1Q,EAAI,EAAGC,GAAI,EAAGiG,GAAI,EAQtB,IANA,EAAIwH,EAAO4E,GAAM,CAAC,EAAI,EACtBrQ,EAAEqQ,GAAM,EAAG,EAAG,CAAC,EAEfzE,EAAGI,EAAIH,EAAG,CAAC,EAGN9N,EAAI,GAAIA,EAAI,IAAMsS,EAAK,GAAItS,EAAKA,EAAI,EAAK,EAAG,CAM7C,IALAuT,EAAKhG,EAAQ,EAAIvN,GAAM,CAAC,EAAI,EAAGwT,EAAKD,EAAK,MAAQA,EAAKA,IAAO,GAC7DR,EAAKO,IAAM,GAAIN,EAAKM,EAAI,MACxBG,EAAKjG,EAAKgG,EAAIR,CAAE,EAAI,EAAGU,IAAOlG,EAAKgG,EAAIT,CAAE,EAAI,IAAMvF,EAAK+F,EAAIP,CAAE,EAAI,GAAK,IAAMS,IAAO,IAAM,EAC1FD,EAAKC,EAAK,MAAQF,EAAKG,EAAK,MAC5BhD,EAAK,EACAzQ,GAAI,GAAIA,GAAI,IAAMqS,EAAK,GAAIrS,GAAKA,GAAI,EAAK,EAC1CiG,GAAKlG,EAAIC,GAAK,EACd8S,EAAKxF,EAAQ8E,EAAIpS,IAAM,CAAC,EAAI,EAAG+S,EAAKD,EAAK,MAAQA,EAAKA,IAAO,GAC7DtC,EAAKlD,EAAQ,EAAIrH,IAAM,CAAC,EAAI,EAC5BuN,IAAOjG,EAAKgG,EAAIR,CAAE,EAAI,IAAMtC,EAAK,OAAU,IAAMD,EAAK,OAAU,EAChEiD,IAAOlG,EAAKgG,EAAIT,CAAE,EAAI,IAAMrC,IAAO,IAAM,IAAMD,IAAO,IAAM,EAC5DkD,IAAOnG,EAAK+F,EAAIP,CAAE,EAAI,IAAMU,EAAK,OAAU,IAAMD,IAAO,IAAM,EAC9D/C,IAAOlD,EAAK+F,EAAIR,CAAE,EAAI,IAAMY,IAAO,IAAM,IAAMD,IAAO,IAAM,EAC5DjD,EAAMkD,GAAM,GAAOF,EAAK,MACxBlG,EAAQ,EAAIrH,IAAM,CAAC,EAAIuK,EAE3BvK,GAAKlG,EAAIC,GAAK,EACdwQ,EAAKlD,EAAQ,EAAIrH,IAAM,CAAC,EAAI,EAC5BuN,IAAOhD,EAAK,QAAWC,EAAK,OAAU,GAAKxQ,EAAI,EAC/CwT,IAAOjD,IAAO,KAAOC,IAAO,IAAM,IAAM+C,IAAO,IAAM,EACrDlG,EAAQ,EAAIrH,IAAM,CAAC,EAAKwN,GAAM,GAAOD,EAAK,MAC1CvT,EAAIwT,IAAO,EACf,CAEA7F,EAAGyE,EAAK,EAAIA,EAAM,EAAG5K,CAAC,EAEtBkG,EAAM0E,GAAM,CAAC,EAETpS,GAAMiO,EAAIkE,EAAGC,EAAI5K,EAAG4K,CAAE,EAAI,IAAM,GAChC/D,EAAI7G,EAAG4K,EAAID,EAAGC,EAAI5K,EAAG4K,CAAE,EAAI,CAEnC,CAEA,MAAO,CACH,OAAQ7E,EACR,OAAQC,EACR,MAAOE,EACP,EAAG3L,EACH,IAAKoM,EACL,IAAKL,EACL,IAAKG,EACL,IAAKG,EACL,IAAKC,EACL,IAAKC,EACL,IAAKwD,EACL,IAAKI,EACL,MAAOiB,CACX,CACJ,EAuGIrQ,KAAqD,UAAY,CACjE,IAAIW,EAAgB,SAAUC,EAAG3C,EAAG,CAChC,OAAA0C,EAAgB,OAAO,gBAClB,CAAE,UAAW,CAAC,CAAE,YAAa,OAAS,SAAUC,EAAG3C,EAAG,CAAE2C,EAAE,UAAY3C,CAAG,GAC1E,SAAU2C,EAAG3C,EAAG,CAAE,QAAS4C,KAAK5C,EAAOA,EAAE,eAAe4C,CAAC,IAAGD,EAAEC,CAAC,EAAI5C,EAAE4C,CAAC,EAAG,EACtEF,EAAcC,EAAG3C,CAAC,CAC7B,EACA,OAAO,SAAU2C,EAAG3C,EAAG,CACnB0C,EAAcC,EAAG3C,CAAC,EAClB,SAAS6C,GAAK,CAAE,KAAK,YAAcF,CAAG,CACtCA,EAAE,UAAY3C,IAAM,KAAO,OAAO,OAAOA,CAAC,GAAK6C,EAAG,UAAY7C,EAAE,UAAW,IAAI6C,EACnF,CACJ,GAAG,EAECb,GAAiB,CAAE,YAA0B,IAAW,EACxDC,GAAe,IAAI,YAAY,OAAQ,EAKvCD,GAAe,KAAK,OAAS,QAC7BA,GAAe,KAAK,KAAOZ,IAC3Bc,GAAcJ,GAAWE,GAAgB,KAAMC,GAAa,MAAM,EAClE,OAAOD,GAAe,KAAK,MAG3BE,GAAcJ,GAAWE,GAAgB,KAAMC,GAAa,MAAM,EAGlEE,GAAwB,IAAI,YAAY,CAAC,EACzCtB,IAA2B,UAAY,CACvC,SAASA,EAAU8R,EAAK,CACpB,IAAIC,EAAQzQ,GACR0Q,EAAS,EACTC,EAAO,EACX,GAAIH,IAAQ,OACP,CACD,QAAS5T,EAAI,EAAG,CAAC4T,EAAI5T,CAAC,EAAGA,IACrB,CAEJ,GADA8T,GAAUF,EAAI,OAAS5T,GAAK,EACxB,CAAC8T,EACD,OAAOhS,EAAU,KACrB+R,EAAQ,IAAI,YAAaC,EAAS,IAAO,CAAC,EAC1C,QAAS7T,EAAI2T,EAAI,OAAS,EAAG3T,GAAKD,EAAGC,GAAK,EACtC4T,EAAOD,EAAI,OAAS,EAAI3T,GAAM,CAAC,EAAK2T,EAAI3T,CAAC,GAAK,GAAO2T,EAAI3T,EAAI,CAAC,GAAK,GAAO2T,EAAI3T,EAAI,CAAC,GAAK,EAAK2T,EAAI3T,EAAI,CAAC,EAEtGD,EAAIC,IAAM,EACV4T,EAAMA,EAAM,OAAS,CAAC,EAAID,EAAI5T,CAAC,EAE1BA,EAAIC,IAAM,EACf4T,EAAMA,EAAM,OAAS,CAAC,EAAKD,EAAI5T,CAAC,GAAK,EAAK4T,EAAI5T,EAAI,CAAC,EAE9CA,EAAIC,IAAM,IACf4T,EAAMA,EAAM,OAAS,CAAC,EAAKD,EAAI5T,CAAC,GAAK,GAAO4T,EAAI5T,EAAI,CAAC,GAAK,EAAK4T,EAAI5T,EAAI,CAAC,GAE5E+T,EAAO,CACX,CACA,KAAK,MAAQF,EACb,KAAK,UAAYC,EACjB,KAAK,KAAOC,CAChB,CACA,OAAAjS,EAAU,WAAa,SAAUlC,EAAK,CAClC,IAAIG,EAAQJ,IAAgBC,CAAG,EAC/B,OAAO,IAAIkC,EAAU/B,CAAK,CAC9B,EACA+B,EAAU,WAAa,SAAU8R,EAAK,CAClC,IAAIC,EAAQzQ,GACR0Q,EAAS,EACTC,EAAO,EACPC,EAAS,KAAK,IAAIJ,CAAG,EACzB,OAAII,EAAS,YACTH,EAAQ,IAAI,YAAY,CAAC,EACzBA,EAAM,CAAC,EAAIG,EAAS,EACpBH,EAAM,CAAC,EAAKG,EAAS,WAAe,EACpCF,EAAS,IAEJE,EAAS,GACdH,EAAQ,IAAI,YAAY,CAAC,EACzBA,EAAM,CAAC,EAAIG,EACXF,EAAS,KAGTD,EAAQzQ,GACR0Q,EAAS,GAEbC,EAAOH,EAAM,EAAI,GAAK,EACf9R,EAAU,WAAW,CAAE,MAAO+R,EAAO,UAAWC,EAAQ,KAAMC,CAAK,CAAC,CAC/E,EACAjS,EAAU,gBAAkB,SAAUsD,EAAQ,CAC1C,OAAO,IAAItD,EAAU,IAAI,WAAWsD,CAAM,CAAC,CAC/C,EACAtD,EAAU,WAAa,SAAUmS,EAAK,CAClC,IAAIC,EAAK,IAAIpS,EACb,OAAAoS,EAAG,MAAQ,IAAI,YAAYD,EAAI,KAAK,EACpCC,EAAG,UAAYD,EAAI,UACnBC,EAAG,KAAOD,EAAI,KACPC,CACX,EACApS,EAAU,UAAU,SAAW,SAAUqS,EAAO,CAC5CA,EAAQA,GAAS,GACjB,IAAIN,EAAQ,KAAK,MACbC,EAAS,KAAK,UACdlU,EAAM,GACV,GAAIuU,IAAU,GAAI,CAEd,QAASnU,GAAM8T,EAAS,IAAO,GAAK,EAAG9T,GAAK,EAAGA,IAAK,CAChD,IAAIiS,EAAI4B,EAAM7T,CAAC,EAAE,SAAS,EAAE,EAC5BJ,GAAO,WAAW,OAAOqS,EAAE,MAAM,EACjCrS,GAAOqS,CACX,CACArS,EAAMA,EAAI,QAAQ,MAAO,EAAE,EACtBA,EAAI,SACLA,EAAM,IACd,KAEI,OAAM,IAAI4C,GAAqB,WAAW,EAE9C,OAAI,KAAK,KAAO,IACZ5C,EAAM,IAAMA,GACTA,CACX,EACAkC,EAAU,UAAU,QAAU,UAAY,CACtC,IAAIgS,EAAS,KAAK,UACdD,EAAQ,KAAK,MACjB,GAAIC,IAAW,EACX,OAAO,IAAI,WAAW,CAAC,EAG3B,QAFIM,EAAWN,EAAS,GAAM,EAC1B/T,EAAQ,IAAI,WAAWqU,CAAO,EACzBpU,EAAI,EAAGA,EAAIoU,EAASpU,IAAK,CAC9B,IAAIC,EAAImU,EAAUpU,EAAI,EACtBD,EAAMC,CAAC,EAAI6T,EAAM5T,GAAK,CAAC,KAAOA,EAAI,IAAM,EAC5C,CACA,OAAOF,CACX,EAIA+B,EAAU,UAAU,QAAU,UAAY,CACtC,IAAI+R,EAAQ,KAAK,MACbQ,EAAO,KAAK,UACZN,EAAO,KAAK,KAChB,GAAI,CAACA,EACD,MAAO,GACX,GAAIM,GAAQ,GACR,OAAON,GAAQF,EAAM,CAAC,IAAM,GAChC,GAAIQ,GAAQ,GACR,OAAON,GAAQ,YAAeF,EAAM,CAAC,IAAM,IAAMA,EAAM,CAAC,IAAM,IAElE,IAAI7T,EAAG2N,EAAGgF,EAAI,EACd,IAAK3S,EAAI6T,EAAM,OAAS,EAAG7T,GAAK,EAAGA,IAC/B,IAAK2N,EAAIkG,EAAM7T,CAAC,KAAO,EAEvB,OAAS2N,GAAKgF,EAAK,cAAgB,GAC/BA,IACJ,MAEJ,OAAI3S,IAAM,EACC+T,GAAQF,EAAM,CAAC,IAAM,GACxBE,GACH,UAAcF,EAAM7T,CAAC,GAAK2S,GAAMA,EAAIkB,EAAM7T,EAAI,CAAC,IAAO,GAAK2S,EAAK,MAAQ,KAClEkB,EAAM7T,EAAI,CAAC,GAAK2S,GAAMA,GAAK3S,EAAI,EAAI6T,EAAM7T,EAAI,CAAC,IAAO,GAAK2S,EAAK,MAAQ,KAC9E,KAAK,IAAI,EAAG,GAAK3S,EAAI2S,EAAI,EAAE,CACnC,EACA7Q,EAAU,UAAU,MAAQ,SAAUb,EAAG,CACrC,IAAI4S,EAAQ,KAAK,MACbC,EAAS,KAAK,UAElB,GAAI7S,GAAK6S,EACL,OAAO,KACX,IAAIQ,EAAU,IAAIxS,EACd4Q,EAAKzR,EAAI,IAAO,EAChBiF,EAAIjF,EAAI,GACZ,OAAAqT,EAAQ,MAAQ,IAAI,YAAYT,EAAM,SAAS,EAAGnB,CAAC,CAAC,EACpD4B,EAAQ,UAAYrT,EACpBqT,EAAQ,KAAO,KAAK,KAChBpO,IACAoO,EAAQ,MAAM5B,EAAI,CAAC,GAAK,KAAQ,GAAKxM,GAClCoO,CACX,EACAxS,EAAU,UAAU,MAAQ,SAAUyS,EAAGtT,EAAG,CACxC,IAAI4S,EAAQ,KAAK,MACbC,EAAS,KAAK,UAClB,GAAIS,EAAI,EACJ,MAAM,IAAI,WAAW,MAAM,EAC/B,GAAIA,GAAKT,EACL,OAAOhS,EAAU,MACjBb,IAAM,QAAaA,EAAI6S,EAASS,KAChCtT,EAAI6S,EAASS,GACjB,IAAIC,EAAS,IAAI1S,EACb4Q,EAAI6B,GAAK,EACT3C,EAAK2C,EAAItT,EAAI,IAAO,EACpB0M,EAAK1M,EAAI,IAAO,EAChBS,EAAI6S,EAAI,GACRrO,EAAIjF,EAAI,GACRwT,EAAS,IAAI,YAAY9G,CAAC,EAC9B,GAAIjM,EAAG,CACH,QAAS1B,EAAI,EAAGA,EAAI4R,EAAIc,EAAI,EAAG1S,IAC3ByU,EAAOzU,CAAC,EAAK6T,EAAMnB,EAAI1S,CAAC,IAAM0B,EAAMmS,EAAMnB,EAAI1S,EAAI,CAAC,GAAM,GAAK0B,EAElE+S,EAAOzU,CAAC,EAAI6T,EAAMnB,EAAI1S,CAAC,IAAM0B,CACjC,MAEI+S,EAAO,IAAIZ,EAAM,SAASnB,EAAGd,CAAC,CAAC,EAEnC,OAAI1L,IACAuO,EAAO9G,EAAI,CAAC,GAAK,KAAQ,GAAKzH,GAElCsO,EAAO,MAAQC,EACfD,EAAO,UAAYvT,EACnBuT,EAAO,KAAO,KAAK,KACZA,CACX,EACA1S,EAAU,UAAU,OAAS,UAAY,CACrC,IAAI4S,EAAW,IAAI5S,EACnB,OAAA4S,EAAS,MAAQ,KAAK,MACtBA,EAAS,UAAY,KAAK,UAC1BA,EAAS,KAAO,GAAK,KAAK,KACnBA,CACX,EACA5S,EAAU,UAAU,QAAU,SAAU6S,EAAM,CAC1C,IAAIC,EAAS,KAAK,MAAOC,EAAWD,EAAO,OAAQE,EAASH,EAAK,MAAOI,EAAWD,EAAO,OAAQ7S,EAAI,EACtG,OAAI,KAAK,KAAO0S,EAAK,KACV,GACP,KAAK,KAAOA,EAAK,KACV,GACXzR,GAAa,IAAI0R,EAAQ,CAAC,EAC1B1R,GAAa,IAAI4R,EAAQD,CAAQ,EACjC5S,EAAIkB,GAAY,IAAI,EAAG0R,GAAY,EAAGA,GAAY,EAAGE,GAAY,CAAC,EAC3D9S,EAAI,KAAK,KACpB,EACAH,EAAU,UAAU,IAAM,SAAU6S,EAAM,CACtC,GAAI,CAAC,KAAK,KACN,OAAOA,EACX,GAAI,CAACA,EAAK,KACN,OAAO,KACX,IAAIK,EAAU,KAAK,UAAWJ,EAAS,KAAK,MAAOC,EAAWD,EAAO,OAAQK,EAAQ,KAAK,KAAMC,EAAUP,EAAK,UAAWG,EAASH,EAAK,MAAOI,EAAWD,EAAO,OAAQK,EAAQR,EAAK,KAAMS,EAASC,EAAUC,EAAOC,EAAKrJ,EAAS,IAAIpK,EACxOsT,GAAWJ,EAAUE,EAAUF,EAAUE,IAAYD,EAAQE,EAAQ,EAAI,EAAI,GAC7EE,EAAYD,EAAU,IAAO,EAC7BjS,GAAY,OAAO,EACnB,IAAIqS,EAAKrS,GAAY,OAAO0R,GAAY,CAAC,EAAGY,EAAKtS,GAAY,OAAO4R,GAAY,CAAC,EAAGW,EAAKvS,GAAY,OAAOkS,GAAY,CAAC,EAkBzH,OAjBAlS,GAAY,EAAEuS,EAAKF,GAAMH,GAAY,GAAI,EAAGG,CAAE,EAC9CtS,GAAa,IAAI0R,EAAQY,GAAM,CAAC,EAChCtS,GAAa,IAAI4R,EAAQW,GAAM,CAAC,EAC5BR,EAAQE,EAAQ,GAChBhS,GAAY,IAAIqS,EAAIX,GAAY,EAAGY,EAAIV,GAAY,EAAGW,EAAIL,GAAY,CAAC,EACvEC,EAAQL,GAEHA,EAAQE,GACbI,EAAMpS,GAAY,IAAIqS,EAAIX,GAAY,EAAGY,EAAIV,GAAY,EAAGW,EAAIL,GAAY,CAAC,EAC7EC,EAAQC,EAAMJ,EAAQF,IAGtBM,EAAMpS,GAAY,IAAIsS,EAAIV,GAAY,EAAGS,EAAIX,GAAY,EAAGa,EAAIL,GAAY,CAAC,EAC7EC,EAAQC,EAAMN,EAAQE,GAEtBI,GACApS,GAAY,IAAIuS,EAAIL,GAAY,EAAGK,EAAIL,GAAY,CAAC,EACpDlS,GAAY,IAAIuS,EAAIL,GAAY,CAAC,IAAM,EAChCvT,EAAU,MACrBoK,EAAO,MAAQ,IAAI,YAAYhJ,GAAa,SAASwS,GAAM,GAAIA,GAAM,GAAKL,CAAQ,CAAC,EACnFnJ,EAAO,UAAYkJ,EACnBlJ,EAAO,KAAOoJ,EACPpJ,EACX,EACApK,EAAU,UAAU,SAAW,SAAU6S,EAAM,CAC3C,OAAO,KAAK,IAAIA,EAAK,OAAO,CAAC,CACjC,EACA7S,EAAU,UAAU,OAAS,UAAY,CACrC,GAAI,CAAC,KAAK,KACN,OAAOA,EAAU,KACrB,IAAIkT,EAAU,KAAK,UAAWJ,EAAS,KAAK,MAAOC,EAAWD,EAAO,OAAQQ,EAASC,EAAUnJ,EAAS,IAAIpK,EAC7GsT,EAAUJ,GAAW,EACrBK,EAAYD,EAAU,IAAO,EAC7BjS,GAAY,OAAO,EACnB,IAAIqS,EAAKrS,GAAY,OAAO0R,GAAY,CAAC,EAAGa,EAAKvS,GAAY,OAAOkS,GAAY,CAAC,EACjF,OAAAlS,GAAY,EAAEuS,EAAKF,GAAMH,GAAY,GAAI,EAAGG,CAAE,EAC9CtS,GAAa,IAAI0R,EAAQY,GAAM,CAAC,EAChCrS,GAAY,IAAIqS,EAAIX,GAAY,EAAGa,CAAE,EACrCxJ,EAAO,MAAQ,IAAI,YAAYhJ,GAAa,SAASwS,GAAM,GAAIA,GAAM,GAAKL,CAAQ,CAAC,EACnFnJ,EAAO,UAAYkJ,EACnBlJ,EAAO,KAAO,EACPA,CACX,EACApK,EAAU,UAAU,OAAS,SAAU6S,EAAM,CACzC,IAAIK,EAAU,KAAK,UAAWJ,EAAS,KAAK,MAAOC,EAAWD,EAAO,OAAQM,EAAUP,EAAK,UAAWG,EAASH,EAAK,MAAOI,EAAWD,EAAO,OAAQa,EAAUN,EAAUO,EAAW9T,EAAU,KAAM+T,EAAY/T,EAAU,KAC3NqB,GAAY,OAAO,EACnB,IAAIqS,EAAKrS,GAAY,OAAO0R,GAAY,CAAC,EAAGY,EAAKtS,GAAY,OAAO4R,GAAY,CAAC,EAAGe,EAAK3S,GAAY,OAAO0R,GAAY,CAAC,EACzH,OAAA1R,GAAY,EAAE2S,EAAKN,GAAMX,GAAY,GAAI,EAAGW,CAAE,EAC9CtS,GAAa,IAAI0R,EAAQY,GAAM,CAAC,EAChCtS,GAAa,IAAI4R,EAAQW,GAAM,CAAC,EAChCtS,GAAY,IAAIqS,EAAIX,GAAY,EAAGY,EAAIV,GAAY,EAAGe,CAAE,EACxDH,EAAWxS,GAAY,IAAI2S,EAAIjB,GAAY,CAAC,GAAK,EAC7Cc,IACAC,EAAW,IAAI9T,EACf8T,EAAS,MAAQ,IAAI,YAAY1S,GAAa,SAAS4S,GAAM,GAAIA,GAAM,GAAKH,CAAQ,CAAC,EACrFC,EAAS,UAAYZ,EAAUW,GAAY,EAAIX,EAAUW,GAAY,EACrEC,EAAS,KAAO,KAAK,KAAOjB,EAAK,MAErCU,EAAWlS,GAAY,IAAIqS,EAAIT,GAAY,CAAC,GAAK,EAC7CM,IACAQ,EAAY,IAAI/T,EAChB+T,EAAU,MAAQ,IAAI,YAAY3S,GAAa,SAASsS,GAAM,GAAIA,GAAM,GAAKH,CAAQ,CAAC,EACtFQ,EAAU,UAAYX,EAAUG,GAAY,EAAIH,EAAUG,GAAY,EACtEQ,EAAU,KAAO,KAAK,MAEnB,CACH,SAAUD,EACV,UAAWC,CACf,CACJ,EACA/T,EAAU,UAAU,SAAW,SAAU6S,EAAM,CAC3C,GAAI,CAAC,KAAK,MAAQ,CAACA,EAAK,KACpB,OAAO7S,EAAU,KACrB,IAAIkT,EAAU,KAAK,UAAWJ,EAAS,KAAK,MAAOC,EAAWD,EAAO,OAAQM,EAAUP,EAAK,UAAWG,EAASH,EAAK,MAAOI,EAAWD,EAAO,OAAQM,EAASC,EAAUnJ,EAAS,IAAIpK,EACtLsT,EAAUJ,EAAUE,EACpBG,EAAYD,EAAU,IAAO,EAC7BjS,GAAY,OAAO,EACnB,IAAIqS,EAAKrS,GAAY,OAAO0R,GAAY,CAAC,EAAGY,EAAKtS,GAAY,OAAO4R,GAAY,CAAC,EAAGW,EAAKvS,GAAY,OAAOkS,GAAY,CAAC,EACzH,OAAAlS,GAAY,EAAEuS,EAAKF,GAAMH,GAAY,GAAI,EAAGG,CAAE,EAC9CtS,GAAa,IAAI0R,EAAQY,GAAM,CAAC,EAChCtS,GAAa,IAAI4R,EAAQW,GAAM,CAAC,EAChCtS,GAAY,IAAIqS,EAAIX,GAAY,EAAGY,EAAIV,GAAY,EAAGW,EAAIL,GAAY,CAAC,EACvEnJ,EAAO,MAAQ,IAAI,YAAYhJ,GAAa,SAASwS,GAAM,GAAIA,GAAM,GAAKL,CAAQ,CAAC,EACnFnJ,EAAO,KAAO,KAAK,KAAOyI,EAAK,KAC/BzI,EAAO,UAAYkJ,EACZlJ,CACX,EACApK,EAAU,UAAU,2BAA6B,SAAUiU,EAAQ,CAC/D,IAAI,EAAIjU,EAAU,WAAW,IAAI,EAAGkD,EAAI,EAExC,IADA,EAAE,MAAM,CAAC,GAAK,EACP,EAAE,MAAMA,GAAK,CAAC,IAAM,GACvBA,GAAK,GACT,MAAS,EAAE,MAAMA,GAAK,CAAC,IAAMA,EAAI,IAAO,KAAO,GAC3CA,IACJ,EAAI,EAAE,MAAMA,CAAC,EAEb,QADI4M,EAAI,IAAIvO,IAAQ,IAAI,EAAGkH,EAAK,KAAK,SAASzI,EAAU,GAAG,EAAG1B,EAAI0B,EAAU,WAAW,IAAI,EAAG6L,EAAI,KAAK,MAAM,OAAS,EAC/GvN,EAAE,MAAMuN,CAAC,IAAM,GAClBA,IACJ,KAAO,EAAEoI,GAAU,GAAG,CAIlB,IAHA7T,IAAgB9B,EAAE,KAAK,EACnBA,EAAE,MAAM,CAAC,EAAI,IACbA,EAAE,MAAM,CAAC,GAAK,GACXA,EAAE,QAAQmK,CAAE,GAAK,GACpBnK,EAAE,MAAMuN,CAAC,KAAO,EACpB,IAAI1I,EAAI2M,EAAE,MAAMxR,EAAG,CAAC,EACpB,GAAI6E,EAAE,QAAQnD,EAAU,GAAG,IAAM,GAE7BmD,EAAE,QAAQsF,CAAE,IAAM,EAGtB,SADIrK,EAAI8E,EACD,EAAE9E,EAAI,GAAG,CAEZ,GADA+E,EAAIA,EAAE,OAAO,EAAE,OAAO2M,CAAC,EAAE,UACrB3M,EAAE,QAAQnD,EAAU,GAAG,IAAM,EAC7B,MAAO,GACX,GAAImD,EAAE,QAAQsF,CAAE,IAAM,EAClB,KACR,CACA,GAAIrK,IAAM,EACN,MAAO,GACf,CACA,MAAO,EACX,EACA4B,EAAU,UAAU,gBAAkB,SAAUkU,EAAU,CAClDA,IAAa,SAAUA,EAAW,IACtC,IAAInC,EAAQ,KAAK,MACb7T,EAAI,EAGR,IAAK6T,EAAM,CAAC,EAAI,KAAO,EACnB,MAAO,GACX,GAAImC,GAAY,EACZ,MAAO,GAGX,IAAItM,EAAK,EAAGuM,EAAK,EAAGC,EAAM,EAC1B,IAAKlW,EAAI,EAAGA,EAAI6T,EAAM,OAAQ7T,IAAK,CAE/B,QADImW,EAAKtC,EAAM7T,CAAC,EACTmW,GACHzM,GAAMyM,EAAK,EACXA,KAAQ,EAGZ,QADIC,EAAKvC,EAAM7T,CAAC,EACToW,GACHH,GAAMG,EAAK,EACXA,KAAQ,EACRH,GAAMG,EAAK,EACXA,KAAQ,EAGZ,QADIC,EAAMxC,EAAM7T,CAAC,EACVqW,GACHH,GAAOG,EAAM,GACbA,KAAS,EACTH,GAAOG,EAAM,GACbA,KAAS,CAEjB,CACA,MAAI,EAAE3M,EAAK,IAAM,EAAEuM,EAAK,IAAM,EAAEC,EAAM,IAC3B,GACPF,GAAY,EACL,GAGJ,KAAK,2BAA2BA,IAAa,CAAC,CACzD,EACAlU,EAAU,OAASF,GACnBE,EAAU,KAAOA,EAAU,WAAW,CAAC,EACvCA,EAAU,IAAMA,EAAU,WAAW,CAAC,EAC/BA,CACX,GAAE,EACEuB,KAAyB,SAAUU,EAAQ,CAC3Cf,IAAYK,EAASU,CAAM,EAC3B,SAASV,EAAQiT,EAAQ,CACrB,IAAIpS,EAAQH,EAAO,KAAK,IAAI,GAAK,KAIjC,GAHAG,EAAM,MAAQoS,EAAO,MACrBpS,EAAM,UAAYoS,EAAO,UACzBpS,EAAM,KAAOoS,EAAO,KAChBpS,EAAM,QAAQ,EAAI,EAClB,MAAM,IAAI,WACd,GAAIA,EAAM,WAAa,GACnB,OAAOA,EACX,IAAIqS,EACJ,GAAIrS,EAAM,MAAM,CAAC,EAAI,EAAG,CACpB,IAAI4P,GAAW5P,EAAM,UAAY,GAAM,KAAO,EAC1C2P,EAAQ,IAAI,YAAaC,EAAS,IAAO,CAAC,EAC9CD,EAAMA,EAAM,OAAS,CAAC,EAAI,EAC1B0C,EAAY,IAAIzU,GAChByU,EAAU,KAAO,EACjBA,EAAU,UAAYzC,EACtByC,EAAU,MAAQ1C,EAClB,IAAI3N,EAAIlF,IAAc,WAAakD,EAAM,MAAM,CAAC,CAAC,EAAE,EACnDA,EAAM,YAAcgC,EAAI,EAAI,CAACA,EAAI,WAAcA,CACnD,KAEI,QAAOhC,EAEX,OAAAA,EAAM,UAAYqS,EAClBrS,EAAM,mBAAqBqS,EAAU,OAAOrS,CAAK,EAAE,UACnDA,EAAM,yBAA2BqS,EAAU,OAAO,EAAE,OAAOrS,CAAK,EAAE,UAC3DA,CACX,CAIA,OAAAb,EAAQ,UAAU,OAAS,SAAUjD,EAAG,CACpC,OAAIA,EAAE,WAAa,IAAM,KAAK,WAAa,GAChC0B,GAAU,WAAW1B,EAAE,QAAQ,EAAI,KAAK,QAAQ,CAAC,EACxDA,EAAE,QAAQ,IAAI,EAAI,EACXA,EACJA,EAAE,OAAO,IAAI,EAAE,SAC1B,EAIAiD,EAAQ,UAAU,QAAU,SAAUjD,EAAG,CACrCA,EAAI,KAAK,OAAOA,CAAC,EACjB,IAAIoB,EAAII,GAAiB,KAAMxB,CAAC,EAChC,GAAIoB,EAAE,IAAI,QAAQ,IAAM,EACpB,MAAM,IAAI,MAAM,cAAc,EAClC,OAAIA,EAAE,EAAE,KAAO,EACJA,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,KAAK,SAAS,EACtCA,EAAE,CACb,EAIA6B,EAAQ,UAAU,MAAQ,SAAUmT,EAAG7D,EAAG,CAGtC,QADIzS,EAAI,EACCF,EAAI,EAAGA,EAAI2S,EAAE,MAAM,OAAQ3S,IAEhC,QADI0B,EAAIiR,EAAE,MAAM3S,CAAC,EACV0B,GACCA,EAAI,GACJxB,IACJwB,KAAO,EAIf,IAAIwE,EAAI,EACJyM,EAAE,WAAa,OACfzM,EAAI,GACJyM,EAAE,WAAa,OACfzM,EAAI,GACJyM,EAAE,WAAa,MACfzM,EAAI,GACJyM,EAAE,WAAa,MACfzM,EAAI,GACJyM,EAAE,WAAa,KACfzM,EAAI,GACJyM,EAAE,WAAa,KACfzM,EAAI,GACJhG,GAAK,GAAMgG,EAAI,IACfA,EAAI,GAERsQ,EAAInT,EAAQ,mBAAmB,KAAK,OAAOmT,CAAC,EAAE,SAAS,KAAK,wBAAwB,EAAG,IAAI,EAE3F,IAAIC,EAAKpT,EAAQ,mBAAmBmT,EAAE,OAAO,EAAG,IAAI,EAAGE,EAAK,IAAI,MAAM,GAAMxQ,EAAI,CAAE,EAClFwQ,EAAG,CAAC,EAAIF,EACRE,EAAG,CAAC,EAAIrT,EAAQ,mBAAmBmT,EAAE,SAASC,CAAE,EAAG,IAAI,EACvD,QAASzW,EAAI,EAAGA,EAAI,GAAMkG,EAAI,EAAIlG,IAC9B0W,EAAG1W,CAAC,EAAIqD,EAAQ,mBAAmBqT,EAAG1W,EAAI,CAAC,EAAE,SAASyW,CAAE,EAAG,IAAI,EAKnE,QAFI,EAAI,KAAK,mBACTjV,EAAI,EACCxB,EAAI2S,EAAE,MAAM,OAAS,EAAG3S,GAAK,EAAGA,IAErC,QADI0B,EAAIiR,EAAE,MAAM3S,CAAC,EACRC,EAAI,GAAIA,EAAI,GACjB,GAAIyB,EAAI,WAAY,CAEhB,QADIgR,EAAIhR,IAAO,GAAKwE,EAAIyH,EAAIzH,GACpBwM,EAAI,KAAO,GACfA,KAAO,EACP/E,IAGJ,QADIiE,EAAI8E,EAAGhE,IAAM,CAAC,EACXA,GACHA,KAAO,EACHlR,IAAM,IACNA,EAAI6B,EAAQ,mBAAmB7B,EAAE,OAAO,EAAG,IAAI,GAEvDA,EAAIA,IAAM,EAAI6B,EAAQ,mBAAmB7B,EAAE,SAASoQ,CAAC,EAAG,IAAI,EAAIA,EAC/DlQ,IAAMiM,EAAK1N,GAAK0N,CACrB,MAEQnM,IAAM,IACNA,EAAI6B,EAAQ,mBAAmB7B,EAAE,OAAO,EAAG,IAAI,GAClDE,IAAM,EAAIzB,IAKvB,OAAOoD,EAAQ,mBAAmB7B,EAAG,IAAI,CAC7C,EACA6B,EAAQ,mBAAqB,SAAUjD,EAAG,EAAG,CACzC,IAAIwU,EAASxU,EAAE,MACXyU,EAAWD,EAAO,OAClB+B,EAAS,EAAE,MACXC,EAAWD,EAAO,OAClBrD,EAAI,EAAE,YACVnQ,GAAY,OAAO,EACnB,IAAIqS,EAAKrS,GAAY,OAAO0R,GAAY,CAAC,EAAGgC,EAAK1T,GAAY,OAAOyT,GAAY,CAAC,EAAGlB,EAAKvS,GAAY,OAAOyT,GAAY,CAAC,EACzHzT,GAAY,EAAEuS,EAAKF,GAAMoB,GAAY,GAAI,EAAGpB,CAAE,EAC9CtS,GAAa,IAAI0R,EAAQY,GAAM,CAAC,EAChCtS,GAAa,IAAIyT,EAAQE,GAAM,CAAC,EAChC1T,GAAY,MAAMqS,EAAIX,GAAY,EAAGgC,EAAID,GAAY,EAAGtD,EAAGoC,CAAE,EAC7D,IAAIxJ,EAAS,IAAIpK,GACjB,OAAAoK,EAAO,MAAQ,IAAI,YAAYhJ,GAAa,SAASwS,GAAM,GAAIA,GAAM,GAAKkB,CAAQ,CAAC,EACnF1K,EAAO,UAAY,EAAE,UACrBA,EAAO,KAAO,EACPA,CACX,EACO7I,CACX,GAAEvB,EAAS,EAsELwB,IAAQ,IAAI,YAAY,CAC5B,WAAW,WAAW,WAAW,WAAW,UAAW,WAAW,WAAW,WAC7E,WAAW,UAAW,UAAW,WAAW,WAAW,WAAW,WAAW,WAC7E,WAAW,WAAW,UAAW,UAAW,UAAW,WAAW,WAAW,WAC7E,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,UAAW,UAC7E,UAAW,UAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAC7E,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,UAC7E,UAAW,UAAW,UAAW,UAAW,UAAW,WAAW,WAAW,WAC7E,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,WAAW,UAC/E,CAAC,EA+HKC,GAAWT,MCpyIjB,IAAAgU,GAAA,GAAAC,GAAAD,GAAA,gBAAAE,GAAA,mBAAAC,GAAA,eAAAC,GAAA,mBAAAC,GAAA,eAAAC,KAsBA,SAASC,MAAYC,EAAQ,CAC3B,IAAMC,EAAcD,EAAO,OAAO,CAACE,EAAKC,IAAQD,EAAMC,EAAI,OAAQ,CAAC,EAC7DC,EAAS,IAAI,WAAWH,CAAW,EACrCI,EAAS,EACb,QAAWF,KAAOH,EAChBI,EAAO,IAAID,EAAKE,CAAM,EACtBA,GAAUF,EAAI,OAEhB,OAAOC,CACT,CAEA,SAASE,IAAMC,EAAMC,EAAU,EAAQ,CACrC,IAAIC,EAAMD,EACV,QAASE,EAAI,EAAGA,EAAIH,EAAK,OAAQG,IAAK,CACpC,IAAMC,EAAOJ,EAAKG,CAAC,EACnB,QAASE,EAAM,EAAGA,GAAO,EAAGA,IAC1BH,GAAQA,GAAO,EAAOE,GAAQC,EAAO,GAAQ,OACzCH,EAAM,QACRA,GAAO,KAGb,CACA,QAASC,EAAI,EAAGA,EAAI,GAAIA,IACtBD,EAAOA,GAAO,EAAK,OACfA,EAAM,QACRA,GAAO,MAGX,OAAOA,EAAM,KACf,CAIA,SAASI,IAAmBC,EAAOC,EAAO,SAAY,CACpD,QAASL,EAAI,EAAGA,EAAI,IAAKA,IAAK,CAC5B,IAAID,EAAMC,GAAK,GACf,QAASM,EAAI,EAAGA,EAAI,EAAGA,IACrBP,EAAOA,EAAM,WAAeA,GAAO,EAAKM,EAAON,GAAO,EAExDK,EAAMJ,CAAC,EAAID,IAAQ,CACrB,CACF,CAGA,SAASQ,GAAMC,EAAOJ,EAAQK,GAAiB,CAC7C,IAAIV,EAAM,EACV,QAASC,EAAI,EAAGA,EAAIQ,EAAM,OAAQR,IAAK,CACrC,IAAMC,GAAQO,EAAMR,CAAC,EAAKD,IAAQ,IAAO,IACzCA,GAAOK,EAAMH,CAAI,EAAKF,GAAO,KAAQ,CACvC,CACA,OAAQA,EAAM,cAAgB,CAChC,CAGA,SAASW,IAAcC,EAAQ,CAC7B,IAAMC,EAAKC,GAAYC,EAAa,EAC9BC,EAASC,GAAe,cAAe,OAAO,KAAKC,EAAW,EAAGL,CAAE,EACnEM,EAAY,OAAO,OAAO,CAACH,EAAO,OAAO,OAAO,KAAKJ,CAAM,CAAC,EAAGI,EAAO,MAAM,CAAC,CAAC,EACpF,MAAO,CAAE,cAAe,IAAI,WAAWG,CAAS,EAAG,GAAI,IAAI,WAAWN,CAAE,CAAE,CAC5E,CAEA,SAASO,IAAcC,EAAaC,EAAM,CACxC,IAAMC,EAAWC,GAAiB,cAAe,OAAO,KAAKN,EAAW,EAAG,OAAO,KAAKI,CAAI,CAAC,EACtFG,EAAY,OAAO,OAAO,CAACF,EAAS,OAAO,OAAO,KAAKF,CAAW,CAAC,EAAGE,EAAS,MAAM,CAAC,CAAC,EAC7F,OAAO,IAAI,WAAWE,CAAS,CACjC,CAGA,SAASC,GAAcC,EAAe,CAEpC,IAAMC,EAAQtC,GAASqC,EAAc,SAAS,EAAGE,EAAiB,EAAG,IAAI,WAAW,CAAC,CAAC,EAChFC,EAAaH,EAAc,SAASE,GAAmBF,EAAc,MAAM,EAC3EI,EAAYC,GAAQ,QAAQF,EAAYG,GAAaL,EAAO,OAAW,EAAE,EAM/E,OALetC,GACbyC,EAAU,SAAS,EAAGG,EAAoB,EAC1CP,EAAc,SAAS,EAAGE,EAAiB,EAC3CE,EAAU,SAASG,GAAsBA,GAAuB,EAAE,CACpE,CAEF,CAEA,SAASC,GAAcC,EAAW,CAEhC,IAAMC,EAAcC,GAAoBT,GAClCU,EAAYH,EAAU,SAASE,GAAmBD,CAAW,EAC7DG,EAAU,IAAI,WAAWC,EAAsB,EACrDD,EAAQ,IAAIJ,EAAU,SAAS,EAAGE,EAAiB,CAAC,EACpDE,EAAQ,IAAIJ,EAAU,SAASC,CAAW,EAAGC,EAAiB,EAC9D,IAAMV,EAAQtC,GAASiD,EAAW,IAAI,WAAW,CAAC,CAAC,EAC7CT,EAAaE,GAAQ,QAAQQ,EAASP,GAAaL,EAAO,OAAW,EAAE,EACvEc,EAAgCZ,EAAW,OAASD,GAAoBc,GACxEC,EAA4Bd,EAAW,SAAS,EAAGY,CAA6B,EAChFG,EAAMf,EAAW,SAASA,EAAW,OAASa,EAAkB,EACtE,OAAOrD,GAASiD,EAAWK,EAA2BC,CAAG,CAC3D,CAEA,SAAS5D,GAAWa,EAAM,CACxB,IAAMgD,EAAYhD,aAAgB,WAAaA,EAAO,IAAI,WAAWA,CAAI,EAGzE,GAAIgD,EAAU,OAASC,GAAyB,CAE9C,IAAMX,EAAYV,GAAcoB,EAAU,SAAS,EAAGC,EAAuB,CAAC,EACxEC,EAAWD,GAA0BhC,GACrCF,EAAKiC,EAAU,SAASC,GAAyBC,CAAQ,EACzDC,EAAiBH,EAAU,SAASE,CAAQ,EAElD,GAAI,CACF,IAAME,EAAiB9B,IAAc6B,EAAgBpC,CAAE,EAEjDsC,EAAYD,EAAe,SAAS,EAAG,EAAE,EACzCE,EAAYF,EAAe,OAAS,EACpCG,EAAY,IAAI,SAASH,EAAe,OAAQA,EAAe,WAAYA,EAAe,UAAU,EACzG,UAAUE,EAAW,EAAI,EAGpBE,EAAkB,IAAI,WAAWR,EAAU,MAAM,EACvDQ,EAAgB,IAAIR,EAAW,CAAC,EAChCQ,EAAgB,IAAIH,EAAWJ,EAAuB,EACtD,IAAMQ,EAAeR,GAA0BI,EAAU,OACnDK,EAAaF,EAAgB,SAAS,EAAGC,CAAY,EAErDE,EAAcjD,GAAMgD,CAAU,EACpC,OAAO,OAAO,KAAKlE,GAAS8C,EAAWe,CAAS,CAAC,CACnD,MAAQ,CACN,OAAO,OAAO,KAAKf,CAAS,CAC9B,CACF,CAEA,OAAO,OAAO,KAAKV,GAAcoB,CAAS,CAAC,CAC7C,CAEA,SAAS3D,GAAWW,EAAM,CACxB,IAAMgD,EAAYhD,aAAgB,WAAaA,EAAO,IAAI,WAAWA,CAAI,EAEzE,GAAIgD,EAAU,OAASL,GAAwB,CAE7C,IAAML,EAAYU,EAAU,SAAS,EAAGL,EAAsB,EACxDU,EAAYL,EAAU,SAASL,EAAsB,EAErDiB,EAAgBvB,GAAcC,CAAS,EAGvCoB,EAAa,IAAI,WAAWT,GAA0BI,EAAU,MAAM,EAC5EK,EAAW,IAAIE,EAAe,CAAC,EAC/BF,EAAW,IAAIL,EAAWJ,EAAuB,EACjD,IAAM/C,EAAMX,GAAWmE,EAAY,EAAE,IAAM,EAErCG,EAAe,IAAI,WAAWR,EAAU,OAAS,CAAC,EACxDQ,EAAa,IAAIR,EAAW,CAAC,EAC7B,IAAI,SAASQ,EAAa,MAAM,EAAE,UAAUR,EAAU,OAAQnD,EAAK,EAAI,EAEvE,GAAM,CAAE,cAAeiD,EAAgB,GAAApC,CAAG,EAAIF,IAAcgD,CAAY,EAElEC,EAAiB,IAAI,WAAWb,GAA0BhC,GAAgBkC,EAAe,MAAM,EACrG,OAAAW,EAAe,IAAIF,EAAe,CAAC,EACnCE,EAAe,IAAI/C,EAAIkC,EAAuB,EAC9Ca,EAAe,IAAIX,EAAgBF,GAA0BhC,EAAa,EAEnE,OAAO,KAAK6C,CAAc,CACnC,CAEA,OAAO,OAAO,KAAKzB,GAAcW,CAAS,CAAC,CAC7C,CAGA,SAASzD,GAAWwE,EAAKC,EAAO,GAAI,CAClC,OAAOA,IAAS,GAAKtD,GAAMqD,CAAG,EAAIhE,IAAMgE,CAAG,CAC7C,CAKA,SAASE,GAAYjE,EAAMkE,EAAO,CAChC,GAAI,OAAOlE,GAAS,SAAU,CAC5B,IAAMmE,EAAMnE,EAAK,KAAK,EAAE,QAAQ,OAAQ,EAAE,EAC1C,GAAI,CAAC,eAAe,KAAKmE,CAAG,GAAKA,EAAI,OAAS,IAAM,EAClD,MAAM,IAAI,MAAM,GAAGD,CAAK,8CAA8C,EAExE,OAAO,OAAO,KAAKC,EAAK,KAAK,CAC/B,CACA,GACEnE,aAAgB,YACbA,aAAgB,aACf,OAAO,kBAAsB,KAAeA,aAAgB,kBAEhE,OAAO,OAAO,KAAKA,CAAI,EAEzB,MAAM,IAAI,MAAM,GAAGkE,CAAK,8CAA8C,CACxE,CAEA,SAASE,GAAmBC,EAAOC,EAAgBJ,EAAO,CACxD,GAAIG,EAAM,SAAWC,EACnB,MAAM,IAAI,MAAM,GAAGJ,CAAK,aAAaI,CAAc,oBAAoBD,EAAM,MAAM,GAAG,CAE1F,CAEA,SAAS/E,GAAeiF,EAAiBC,EAAO,EAAG,CACjD,IAAMH,EAAQJ,GAAYM,EAAiB,WAAW,EACtDH,GAAmBC,EAAOI,GAAwB,WAAW,EAE7D,IAAMpD,EAAY,OAAO,MAAMqD,EAAgC,EAC/DrD,EAAU,CAAC,EAAImD,EAAO,IAEtB,QAASrE,EAAI,EAAGA,EAAIkE,EAAM,OAAQlE,IAChCkB,EAAUlB,EAAI,CAAC,GAAOkB,EAAUlB,CAAC,EAAIkE,EAAMlE,CAAC,GAAK,EAAQ,IAG3D,OAAOkB,CACT,CACA,SAASjC,GAAeuF,EAAe,CACrC,IAAMtD,EAAY4C,GAAYU,EAAe,YAAY,EACzDP,GAAmB/C,EAAWqD,GAAkC,YAAY,EAE5E,IAAM/C,EAAY,OAAO,MAAM8C,EAAsB,EAErD,QAAStE,EAAI,EAAGA,EAAIkB,EAAU,OAAQlB,IACpCwB,EAAUxB,EAAI,CAAC,EAAIkB,EAAUlB,EAAI,CAAC,EAAMkB,EAAUlB,CAAC,EAAI,EAAQ,IAGjE,OAAOwB,CACT,CAnPA,IAIMQ,GAMAf,GAIA6B,GACAN,GACAP,GACAS,GACAL,GACAT,GACAd,GAkCAL,GA0IA6D,GACAC,GAjMNE,GAAAC,GAAA,KAAAC,KACAC,KAGM5C,GAAc,IAAI,WAAW,CAAC,GAAM,IAAM,IAAM,IAAM,IAAM,GAAM,IAAM,GAAM,IAAM,GAAM,IAAM,GAAM,IAAM,IAAM,IAAM,EAAI,CAAC,EAM7Hf,GAAc,IAAI,WAAW,CAAC,GAAM,IAAM,IAAM,GAAM,GAAM,EAAM,EAAM,GAAM,IAAM,GAAM,IAAM,IAAM,GAAM,EAAM,EAAM,CAAI,CAAC,EAI7H6B,GAA0B,IAC1BN,GAAyB,GACzBP,GAAuB,GACvBS,GAAqB,GACrBL,GAAoB,GACpBT,GAAoB,EACpBd,GAAgB,GAkChBL,GAAkB,IAAI,YAAY,GAAG,EAU3CN,IAAmBM,EAAe,EAgI5B6D,GAAyB,GACzBC,GAAmCD,GAAyB,ICjMlE,IAAAO,GAAAC,GAAA,CAAAC,GAAAC,KAAA,EAQE,UAAW,CAGX,IAAIC,EAGAC,EAAU,UAGVC,EAAmB,IAGnBC,EAAkB,kEAClBC,EAAkB,sBAClBC,EAA+B,qDAG/BC,EAAiB,4BAGjBC,EAAmB,IAGnBC,EAAc,yBAGdC,EAAkB,EAClBC,EAAkB,EAClBC,EAAqB,EAGrBC,EAAuB,EACvBC,EAAyB,EAGzBC,EAAiB,EACjBC,EAAqB,EACrBC,EAAwB,EACxBC,EAAkB,EAClBC,EAAwB,GACxBC,EAAoB,GACpBC,EAA0B,GAC1BC,EAAgB,IAChBC,EAAkB,IAClBC,EAAiB,IAGjBC,EAAuB,GACvBC,EAAyB,MAGzBC,EAAY,IACZC,EAAW,GAGXC,EAAmB,EACnBC,EAAgB,EAChBC,EAAkB,EAGlBC,EAAW,IACXC,EAAmB,iBACnBC,EAAc,sBACdC,EAAM,IAGNC,EAAmB,WACnBC,EAAkBD,EAAmB,EACrCE,EAAwBF,IAAqB,EAG7CG,GAAY,CACd,CAAC,MAAOjB,CAAa,EACrB,CAAC,OAAQP,CAAc,EACvB,CAAC,UAAWC,CAAkB,EAC9B,CAAC,QAASE,CAAe,EACzB,CAAC,aAAcC,CAAqB,EACpC,CAAC,OAAQK,CAAc,EACvB,CAAC,UAAWJ,CAAiB,EAC7B,CAAC,eAAgBC,CAAuB,EACxC,CAAC,QAASE,CAAe,CAC3B,EAGIiB,GAAU,qBACVC,GAAW,iBACXC,GAAW,yBACXC,EAAU,mBACVC,GAAU,gBACVC,GAAY,wBACZC,GAAW,iBACXC,GAAU,oBACVC,GAAS,6BACTC,GAAS,eACTC,GAAY,kBACZC,GAAU,gBACVC,GAAY,kBACZC,GAAa,mBACbC,GAAW,iBACXC,GAAY,kBACZC,GAAS,eACTC,GAAY,kBACZC,GAAY,kBACZC,GAAe,qBACfC,EAAa,mBACbC,EAAa,mBAEbC,GAAiB,uBACjBC,GAAc,oBACdC,GAAa,wBACbC,GAAa,wBACbC,GAAU,qBACVC,GAAW,sBACXC,GAAW,sBACXC,GAAW,sBACXC,GAAkB,6BAClBC,GAAY,uBACZC,EAAY,uBAGZC,EAAuB,iBACvBC,EAAsB,qBACtBC,GAAwB,gCAGxBC,EAAgB,4BAChBC,EAAkB,WAClBC,EAAmB,OAAOF,EAAc,MAAM,EAC9CG,GAAqB,OAAOF,EAAgB,MAAM,EAGlDG,GAAW,mBACXC,GAAa,kBACbC,GAAgB,mBAGhBC,GAAe,mDACfC,GAAgB,QAChBC,GAAa,mGAMbC,GAAe,sBACfC,GAAkB,OAAOD,GAAa,MAAM,EAG5CE,GAAc,OAGdC,GAAe,KAGfC,GAAgB,4CAChBC,GAAgB,oCAChBC,GAAiB,QAGjBC,GAAc,4CAYdC,GAA6B,mBAG7BC,GAAe,WAMfC,GAAe,kCAGfC,GAAU,OAGVC,GAAa,qBAGbC,GAAa,aAGbC,GAAe,8BAGfC,GAAY,cAGZC,GAAW,mBAGXC,GAAU,8CAGVC,GAAY,OAGZC,GAAoB,yBAGpBC,GAAgB,kBAChBC,GAAoB,kBACpBC,GAAwB,kBACxBC,GAAsB,kBACtBC,GAAeH,GAAoBC,GAAwBC,GAC3DE,GAAiB,kBACjBC,GAAe,4BACfC,GAAgB,uBAChBC,GAAiB,+CACjBC,GAAqB,kBACrBC,GAAe,+JACfC,GAAe,4BACfC,GAAa,iBACbC,GAAeN,GAAgBC,GAAiBC,GAAqBC,GAGrEI,GAAS,YACTC,GAAW,IAAMf,GAAgB,IACjCgB,GAAU,IAAMH,GAAe,IAC/BI,GAAU,IAAMb,GAAe,IAC/Bc,GAAW,OACXC,GAAY,IAAMd,GAAiB,IACnCe,GAAU,IAAMd,GAAe,IAC/Be,GAAS,KAAOrB,GAAgBa,GAAeK,GAAWb,GAAiBC,GAAeK,GAAe,IACzGW,GAAS,2BACTC,GAAa,MAAQN,GAAU,IAAMK,GAAS,IAC9CE,GAAc,KAAOxB,GAAgB,IACrCyB,GAAa,kCACbC,GAAa,qCACbC,GAAU,IAAMhB,GAAe,IAC/BiB,GAAQ,UAGRC,GAAc,MAAQT,GAAU,IAAMC,GAAS,IAC/CS,GAAc,MAAQH,GAAU,IAAMN,GAAS,IAC/CU,GAAkB,MAAQjB,GAAS,yBACnCkB,GAAkB,MAAQlB,GAAS,yBACnCmB,GAAWV,GAAa,IACxBW,GAAW,IAAMtB,GAAa,KAC9BuB,GAAY,MAAQP,GAAQ,MAAQ,CAACJ,GAAaC,GAAYC,EAAU,EAAE,KAAK,GAAG,EAAI,IAAMQ,GAAWD,GAAW,KAClHG,GAAa,mDACbC,GAAa,mDACbC,GAAQJ,GAAWD,GAAWE,GAC9BI,GAAU,MAAQ,CAACpB,GAAWM,GAAYC,EAAU,EAAE,KAAK,GAAG,EAAI,IAAMY,GACxEE,GAAW,MAAQ,CAAChB,GAAcP,GAAU,IAAKA,GAASQ,GAAYC,GAAYX,EAAQ,EAAE,KAAK,GAAG,EAAI,IAGxG0B,GAAS,OAAO3B,GAAQ,GAAG,EAM3B4B,GAAc,OAAOzB,GAAS,GAAG,EAGjC0B,GAAY,OAAOrB,GAAS,MAAQA,GAAS,KAAOkB,GAAWF,GAAO,GAAG,EAGzEM,GAAgB,OAAO,CACzBjB,GAAU,IAAMP,GAAU,IAAMW,GAAkB,MAAQ,CAACf,GAASW,GAAS,GAAG,EAAE,KAAK,GAAG,EAAI,IAC9FG,GAAc,IAAME,GAAkB,MAAQ,CAAChB,GAASW,GAAUE,GAAa,GAAG,EAAE,KAAK,GAAG,EAAI,IAChGF,GAAU,IAAME,GAAc,IAAME,GACpCJ,GAAU,IAAMK,GAChBK,GACAD,GACAlB,GACAqB,EACF,EAAE,KAAK,GAAG,EAAG,GAAG,EAGZM,GAAe,OAAO,IAAMjB,GAAQ5B,GAAiBI,GAAeQ,GAAa,GAAG,EAGpFkC,GAAmB,qEAGnBC,GAAe,CACjB,QAAS,SAAU,WAAY,OAAQ,QAAS,eAAgB,eAChE,WAAY,YAAa,aAAc,aAAc,MAAO,OAAQ,SACpE,UAAW,SAAU,MAAO,SAAU,SAAU,YAAa,aAC7D,oBAAqB,cAAe,cAAe,UACnD,IAAK,eAAgB,WAAY,WAAY,YAC/C,EAGIC,GAAkB,GAGlBC,GAAiB,CAAC,EACtBA,GAAe3F,EAAU,EAAI2F,GAAe1F,EAAU,EACtD0F,GAAezF,EAAO,EAAIyF,GAAexF,EAAQ,EACjDwF,GAAevF,EAAQ,EAAIuF,GAAetF,EAAQ,EAClDsF,GAAerF,EAAe,EAAIqF,GAAepF,EAAS,EAC1DoF,GAAenF,CAAS,EAAI,GAC5BmF,GAAenH,EAAO,EAAImH,GAAelH,EAAQ,EACjDkH,GAAe7F,EAAc,EAAI6F,GAAehH,CAAO,EACvDgH,GAAe5F,EAAW,EAAI4F,GAAe/G,EAAO,EACpD+G,GAAe7G,EAAQ,EAAI6G,GAAe5G,EAAO,EACjD4G,GAAe1G,EAAM,EAAI0G,GAAezG,EAAS,EACjDyG,GAAevG,EAAS,EAAIuG,GAAepG,EAAS,EACpDoG,GAAenG,EAAM,EAAImG,GAAelG,EAAS,EACjDkG,GAAe/F,CAAU,EAAI,GAG7B,IAAIgG,GAAgB,CAAC,EACrBA,GAAcpH,EAAO,EAAIoH,GAAcnH,EAAQ,EAC/CmH,GAAc9F,EAAc,EAAI8F,GAAc7F,EAAW,EACzD6F,GAAcjH,CAAO,EAAIiH,GAAchH,EAAO,EAC9CgH,GAAc5F,EAAU,EAAI4F,GAAc3F,EAAU,EACpD2F,GAAc1F,EAAO,EAAI0F,GAAczF,EAAQ,EAC/CyF,GAAcxF,EAAQ,EAAIwF,GAAc3G,EAAM,EAC9C2G,GAAc1G,EAAS,EAAI0G,GAAcxG,EAAS,EAClDwG,GAAcrG,EAAS,EAAIqG,GAAcpG,EAAM,EAC/CoG,GAAcnG,EAAS,EAAImG,GAAclG,EAAS,EAClDkG,GAAcvF,EAAQ,EAAIuF,GAActF,EAAe,EACvDsF,GAAcrF,EAAS,EAAIqF,GAAcpF,CAAS,EAAI,GACtDoF,GAAc9G,EAAQ,EAAI8G,GAAc7G,EAAO,EAC/C6G,GAAchG,CAAU,EAAI,GAG5B,IAAIiG,GAAkB,CAEpB,OAAQ,IAAM,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAC1E,OAAQ,IAAM,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAC1E,OAAQ,IAAM,OAAQ,IACtB,OAAQ,IAAM,OAAQ,IACtB,OAAQ,IAAM,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAChD,OAAQ,IAAM,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAChD,OAAQ,IAAM,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAChD,OAAQ,IAAM,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAChD,OAAQ,IAAM,OAAQ,IACtB,OAAQ,IAAM,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAC1E,OAAQ,IAAM,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAC1E,OAAQ,IAAM,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAChD,OAAQ,IAAM,OAAQ,IAAK,OAAQ,IAAK,OAAQ,IAChD,OAAQ,IAAM,OAAQ,IAAK,OAAQ,IACnC,OAAQ,KAAM,OAAQ,KACtB,OAAQ,KAAM,OAAQ,KACtB,OAAQ,KAER,OAAU,IAAM,OAAU,IAAK,OAAU,IACzC,OAAU,IAAM,OAAU,IAAK,OAAU,IACzC,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IACxD,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IACxD,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IACxD,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IAAK,OAAU,IACvE,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IAAK,OAAU,IACvE,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IACxD,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IACxD,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IACxD,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IAAK,OAAU,IACvE,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IAAK,OAAU,IACvE,OAAU,IAAM,OAAU,IAC1B,OAAU,IAAM,OAAU,IAAK,OAAU,IACzC,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IAAK,OAAU,IACvE,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IAAK,OAAU,IACvE,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IACxD,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IACxD,OAAU,IAAM,OAAU,IAAK,OAAU,IACzC,OAAU,IAAM,OAAU,IAAK,OAAU,IACzC,OAAU,IAAM,OAAU,IAAK,OAAU,IACzC,OAAU,IAAM,OAAU,IAAK,OAAU,IACzC,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IACxD,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IACxD,OAAU,IAAM,OAAU,IAAK,OAAU,IACzC,OAAU,IAAM,OAAU,IAAK,OAAU,IACzC,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IAAK,OAAU,IAAK,OAAU,IACtF,OAAU,IAAM,OAAU,IAAK,OAAU,IAAK,OAAU,IAAK,OAAU,IAAK,OAAU,IACtF,OAAU,IAAM,OAAU,IAC1B,OAAU,IAAM,OAAU,IAAK,OAAU,IACzC,OAAU,IAAM,OAAU,IAAK,OAAU,IACzC,OAAU,IAAM,OAAU,IAAK,OAAU,IACzC,OAAU,KAAM,OAAU,KAC1B,OAAU,KAAM,OAAU,KAC1B,OAAU,KAAM,OAAU,GAC5B,EAGIC,GAAc,CAChB,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,SACL,IAAK,OACP,EAGIC,GAAgB,CAClB,QAAS,IACT,OAAQ,IACR,OAAQ,IACR,SAAU,IACV,QAAS,GACX,EAGIC,GAAgB,CAClB,KAAM,KACN,IAAK,IACL,KAAM,IACN,KAAM,IACN,SAAU,QACV,SAAU,OACZ,EAGIC,GAAiB,WACjBC,GAAe,SAGfC,GAAa,OAAO,QAAU,UAAY,QAAU,OAAO,SAAW,QAAU,OAGhFC,GAAW,OAAO,MAAQ,UAAY,MAAQ,KAAK,SAAW,QAAU,KAGxEC,GAAOF,IAAcC,IAAY,SAAS,aAAa,EAAE,EAGzDE,GAAc,OAAOvK,IAAW,UAAYA,IAAW,CAACA,GAAQ,UAAYA,GAG5EwK,GAAaD,IAAe,OAAOtK,IAAU,UAAYA,IAAU,CAACA,GAAO,UAAYA,GAGvFwK,GAAgBD,IAAcA,GAAW,UAAYD,GAGrDG,GAAcD,IAAiBL,GAAW,QAG1CO,IAAY,UAAW,CACzB,GAAI,CAEF,IAAIC,GAAQJ,IAAcA,GAAW,SAAWA,GAAW,QAAQ,MAAM,EAAE,MAE3E,OAAII,IAKGF,IAAeA,GAAY,SAAWA,GAAY,QAAQ,MAAM,CACzE,MAAY,CAAC,CACf,GAAE,EAGEG,GAAoBF,IAAYA,GAAS,cACzCG,GAAaH,IAAYA,GAAS,OAClCI,GAAYJ,IAAYA,GAAS,MACjCK,GAAeL,IAAYA,GAAS,SACpCM,GAAYN,IAAYA,GAAS,MACjCO,GAAmBP,IAAYA,GAAS,aAc5C,SAASQ,GAAMC,GAAMC,GAASC,GAAM,CAClC,OAAQA,GAAK,OAAQ,CACnB,IAAK,GAAG,OAAOF,GAAK,KAAKC,EAAO,EAChC,IAAK,GAAG,OAAOD,GAAK,KAAKC,GAASC,GAAK,CAAC,CAAC,EACzC,IAAK,GAAG,OAAOF,GAAK,KAAKC,GAASC,GAAK,CAAC,EAAGA,GAAK,CAAC,CAAC,EAClD,IAAK,GAAG,OAAOF,GAAK,KAAKC,GAASC,GAAK,CAAC,EAAGA,GAAK,CAAC,EAAGA,GAAK,CAAC,CAAC,CAC7D,CACA,OAAOF,GAAK,MAAMC,GAASC,EAAI,CACjC,CAYA,SAASC,GAAgBC,GAAOC,GAAQC,GAAUC,GAAa,CAI7D,QAHIC,GAAQ,GACRC,GAASL,IAAS,KAAO,EAAIA,GAAM,OAEhC,EAAEI,GAAQC,IAAQ,CACvB,IAAIC,GAAQN,GAAMI,EAAK,EACvBH,GAAOE,GAAaG,GAAOJ,GAASI,EAAK,EAAGN,EAAK,CACnD,CACA,OAAOG,EACT,CAWA,SAASI,GAAUP,GAAOE,GAAU,CAIlC,QAHIE,GAAQ,GACRC,GAASL,IAAS,KAAO,EAAIA,GAAM,OAEhC,EAAEI,GAAQC,IACXH,GAASF,GAAMI,EAAK,EAAGA,GAAOJ,EAAK,IAAM,IAA7C,CAIF,OAAOA,EACT,CAWA,SAASQ,GAAeR,GAAOE,GAAU,CAGvC,QAFIG,GAASL,IAAS,KAAO,EAAIA,GAAM,OAEhCK,MACDH,GAASF,GAAMK,EAAM,EAAGA,GAAQL,EAAK,IAAM,IAA/C,CAIF,OAAOA,EACT,CAYA,SAASS,GAAWT,GAAOU,GAAW,CAIpC,QAHIN,GAAQ,GACRC,GAASL,IAAS,KAAO,EAAIA,GAAM,OAEhC,EAAEI,GAAQC,IACf,GAAI,CAACK,GAAUV,GAAMI,EAAK,EAAGA,GAAOJ,EAAK,EACvC,MAAO,GAGX,MAAO,EACT,CAWA,SAASW,GAAYX,GAAOU,GAAW,CAMrC,QALIN,GAAQ,GACRC,GAASL,IAAS,KAAO,EAAIA,GAAM,OACnCY,GAAW,EACXC,GAAS,CAAC,EAEP,EAAET,GAAQC,IAAQ,CACvB,IAAIC,GAAQN,GAAMI,EAAK,EACnBM,GAAUJ,GAAOF,GAAOJ,EAAK,IAC/Ba,GAAOD,IAAU,EAAIN,GAEzB,CACA,OAAOO,EACT,CAWA,SAASC,GAAcd,GAAOM,GAAO,CACnC,IAAID,GAASL,IAAS,KAAO,EAAIA,GAAM,OACvC,MAAO,CAAC,CAACK,IAAUU,GAAYf,GAAOM,GAAO,CAAC,EAAI,EACpD,CAWA,SAASU,GAAkBhB,GAAOM,GAAOW,GAAY,CAInD,QAHIb,GAAQ,GACRC,GAASL,IAAS,KAAO,EAAIA,GAAM,OAEhC,EAAEI,GAAQC,IACf,GAAIY,GAAWX,GAAON,GAAMI,EAAK,CAAC,EAChC,MAAO,GAGX,MAAO,EACT,CAWA,SAASc,GAASlB,GAAOE,GAAU,CAKjC,QAJIE,GAAQ,GACRC,GAASL,IAAS,KAAO,EAAIA,GAAM,OACnCa,GAAS,MAAMR,EAAM,EAElB,EAAED,GAAQC,IACfQ,GAAOT,EAAK,EAAIF,GAASF,GAAMI,EAAK,EAAGA,GAAOJ,EAAK,EAErD,OAAOa,EACT,CAUA,SAASM,GAAUnB,GAAOoB,GAAQ,CAKhC,QAJIhB,GAAQ,GACRC,GAASe,GAAO,OAChBC,GAASrB,GAAM,OAEZ,EAAEI,GAAQC,IACfL,GAAMqB,GAASjB,EAAK,EAAIgB,GAAOhB,EAAK,EAEtC,OAAOJ,EACT,CAcA,SAASsB,GAAYtB,GAAOE,GAAUC,GAAaoB,GAAW,CAC5D,IAAInB,GAAQ,GACRC,GAASL,IAAS,KAAO,EAAIA,GAAM,OAKvC,IAHIuB,IAAalB,KACfF,GAAcH,GAAM,EAAEI,EAAK,GAEtB,EAAEA,GAAQC,IACfF,GAAcD,GAASC,GAAaH,GAAMI,EAAK,EAAGA,GAAOJ,EAAK,EAEhE,OAAOG,EACT,CAcA,SAASqB,GAAiBxB,GAAOE,GAAUC,GAAaoB,GAAW,CACjE,IAAIlB,GAASL,IAAS,KAAO,EAAIA,GAAM,OAIvC,IAHIuB,IAAalB,KACfF,GAAcH,GAAM,EAAEK,EAAM,GAEvBA,MACLF,GAAcD,GAASC,GAAaH,GAAMK,EAAM,EAAGA,GAAQL,EAAK,EAElE,OAAOG,EACT,CAYA,SAASsB,GAAUzB,GAAOU,GAAW,CAInC,QAHIN,GAAQ,GACRC,GAASL,IAAS,KAAO,EAAIA,GAAM,OAEhC,EAAEI,GAAQC,IACf,GAAIK,GAAUV,GAAMI,EAAK,EAAGA,GAAOJ,EAAK,EACtC,MAAO,GAGX,MAAO,EACT,CASA,IAAI0B,GAAYC,GAAa,QAAQ,EASrC,SAASC,GAAaC,GAAQ,CAC5B,OAAOA,GAAO,MAAM,EAAE,CACxB,CASA,SAASC,GAAWD,GAAQ,CAC1B,OAAOA,GAAO,MAAMvH,EAAW,GAAK,CAAC,CACvC,CAaA,SAASyH,GAAYC,GAAYtB,GAAWuB,GAAU,CACpD,IAAIpB,GACJ,OAAAoB,GAASD,GAAY,SAAS1B,GAAO4B,GAAKF,GAAY,CACpD,GAAItB,GAAUJ,GAAO4B,GAAKF,EAAU,EAClC,OAAAnB,GAASqB,GACF,EAEX,CAAC,EACMrB,EACT,CAaA,SAASsB,GAAcnC,GAAOU,GAAW0B,GAAWC,GAAW,CAI7D,QAHIhC,GAASL,GAAM,OACfI,GAAQgC,IAAaC,GAAY,EAAI,IAEjCA,GAAYjC,KAAU,EAAEA,GAAQC,IACtC,GAAIK,GAAUV,GAAMI,EAAK,EAAGA,GAAOJ,EAAK,EACtC,OAAOI,GAGX,MAAO,EACT,CAWA,SAASW,GAAYf,GAAOM,GAAO8B,GAAW,CAC5C,OAAO9B,KAAUA,GACbgC,GAActC,GAAOM,GAAO8B,EAAS,EACrCD,GAAcnC,GAAOuC,GAAWH,EAAS,CAC/C,CAYA,SAASI,GAAgBxC,GAAOM,GAAO8B,GAAWnB,GAAY,CAI5D,QAHIb,GAAQgC,GAAY,EACpB/B,GAASL,GAAM,OAEZ,EAAEI,GAAQC,IACf,GAAIY,GAAWjB,GAAMI,EAAK,EAAGE,EAAK,EAChC,OAAOF,GAGX,MAAO,EACT,CASA,SAASmC,GAAUjC,GAAO,CACxB,OAAOA,KAAUA,EACnB,CAWA,SAASmC,GAASzC,GAAOE,GAAU,CACjC,IAAIG,GAASL,IAAS,KAAO,EAAIA,GAAM,OACvC,OAAOK,GAAUqC,GAAQ1C,GAAOE,EAAQ,EAAIG,GAAUzJ,CACxD,CASA,SAAS+K,GAAaO,GAAK,CACzB,OAAO,SAASS,GAAQ,CACtB,OAAOA,IAAU,KAAOjO,EAAYiO,GAAOT,EAAG,CAChD,CACF,CASA,SAASU,GAAeD,GAAQ,CAC9B,OAAO,SAAST,GAAK,CACnB,OAAOS,IAAU,KAAOjO,EAAYiO,GAAOT,EAAG,CAChD,CACF,CAeA,SAASW,GAAWb,GAAY9B,GAAUC,GAAaoB,GAAWU,GAAU,CAC1E,OAAAA,GAASD,GAAY,SAAS1B,GAAOF,GAAO4B,GAAY,CACtD7B,GAAcoB,IACTA,GAAY,GAAOjB,IACpBJ,GAASC,GAAaG,GAAOF,GAAO4B,EAAU,CACpD,CAAC,EACM7B,EACT,CAYA,SAAS2C,GAAW9C,GAAO+C,GAAU,CACnC,IAAI1C,GAASL,GAAM,OAGnB,IADAA,GAAM,KAAK+C,EAAQ,EACZ1C,MACLL,GAAMK,EAAM,EAAIL,GAAMK,EAAM,EAAE,MAEhC,OAAOL,EACT,CAWA,SAAS0C,GAAQ1C,GAAOE,GAAU,CAKhC,QAJIW,GACAT,GAAQ,GACRC,GAASL,GAAM,OAEZ,EAAEI,GAAQC,IAAQ,CACvB,IAAI2C,GAAU9C,GAASF,GAAMI,EAAK,CAAC,EAC/B4C,KAAYtO,IACdmM,GAASA,KAAWnM,EAAYsO,GAAWnC,GAASmC,GAExD,CACA,OAAOnC,EACT,CAWA,SAASoC,GAAUC,GAAGhD,GAAU,CAI9B,QAHIE,GAAQ,GACRS,GAAS,MAAMqC,EAAC,EAEb,EAAE9C,GAAQ8C,IACfrC,GAAOT,EAAK,EAAIF,GAASE,EAAK,EAEhC,OAAOS,EACT,CAWA,SAASsC,GAAYR,GAAQS,GAAO,CAClC,OAAOlC,GAASkC,GAAO,SAASlB,GAAK,CACnC,MAAO,CAACA,GAAKS,GAAOT,EAAG,CAAC,CAC1B,CAAC,CACH,CASA,SAASmB,GAASxB,GAAQ,CACxB,OAAOA,IACHA,GAAO,MAAM,EAAGyB,GAAgBzB,EAAM,EAAI,CAAC,EAAE,QAAQ5H,GAAa,EAAE,CAE1E,CASA,SAASsJ,GAAU3D,GAAM,CACvB,OAAO,SAASU,GAAO,CACrB,OAAOV,GAAKU,EAAK,CACnB,CACF,CAYA,SAASkD,GAAWb,GAAQS,GAAO,CACjC,OAAOlC,GAASkC,GAAO,SAASlB,GAAK,CACnC,OAAOS,GAAOT,EAAG,CACnB,CAAC,CACH,CAUA,SAASuB,GAASC,GAAOxB,GAAK,CAC5B,OAAOwB,GAAM,IAAIxB,EAAG,CACtB,CAWA,SAASyB,GAAgBC,GAAYC,GAAY,CAI/C,QAHIzD,GAAQ,GACRC,GAASuD,GAAW,OAEjB,EAAExD,GAAQC,IAAUU,GAAY8C,GAAYD,GAAWxD,EAAK,EAAG,CAAC,EAAI,IAAI,CAC/E,OAAOA,EACT,CAWA,SAAS0D,GAAcF,GAAYC,GAAY,CAG7C,QAFIzD,GAAQwD,GAAW,OAEhBxD,MAAWW,GAAY8C,GAAYD,GAAWxD,EAAK,EAAG,CAAC,EAAI,IAAI,CACtE,OAAOA,EACT,CAUA,SAAS2D,GAAa/D,GAAOgE,GAAa,CAIxC,QAHI3D,GAASL,GAAM,OACfa,GAAS,EAENR,MACDL,GAAMK,EAAM,IAAM2D,IACpB,EAAEnD,GAGN,OAAOA,EACT,CAUA,IAAIoD,GAAerB,GAAetE,EAAe,EAS7C4F,GAAiBtB,GAAerE,EAAW,EAS/C,SAAS4F,GAAiBC,GAAK,CAC7B,MAAO,KAAO3F,GAAc2F,EAAG,CACjC,CAUA,SAASC,GAAS1B,GAAQT,GAAK,CAC7B,OAAOS,IAAU,KAAOjO,EAAYiO,GAAOT,EAAG,CAChD,CASA,SAASoC,GAAWzC,GAAQ,CAC1B,OAAO7D,GAAa,KAAK6D,EAAM,CACjC,CASA,SAAS0C,GAAe1C,GAAQ,CAC9B,OAAO5D,GAAiB,KAAK4D,EAAM,CACrC,CASA,SAAS2C,GAAgBC,GAAU,CAIjC,QAHIC,GACA7D,GAAS,CAAC,EAEP,EAAE6D,GAAOD,GAAS,KAAK,GAAG,MAC/B5D,GAAO,KAAK6D,GAAK,KAAK,EAExB,OAAO7D,EACT,CASA,SAAS8D,GAAWC,GAAK,CACvB,IAAIxE,GAAQ,GACRS,GAAS,MAAM+D,GAAI,IAAI,EAE3B,OAAAA,GAAI,QAAQ,SAAStE,GAAO4B,GAAK,CAC/BrB,GAAO,EAAET,EAAK,EAAI,CAAC8B,GAAK5B,EAAK,CAC/B,CAAC,EACMO,EACT,CAUA,SAASgE,GAAQjF,GAAMkF,GAAW,CAChC,OAAO,SAASC,GAAK,CACnB,OAAOnF,GAAKkF,GAAUC,EAAG,CAAC,CAC5B,CACF,CAWA,SAASC,GAAehF,GAAOgE,GAAa,CAM1C,QALI5D,GAAQ,GACRC,GAASL,GAAM,OACfY,GAAW,EACXC,GAAS,CAAC,EAEP,EAAET,GAAQC,IAAQ,CACvB,IAAIC,GAAQN,GAAMI,EAAK,GACnBE,KAAU0D,IAAe1D,KAAUpL,KACrC8K,GAAMI,EAAK,EAAIlL,EACf2L,GAAOD,IAAU,EAAIR,GAEzB,CACA,OAAOS,EACT,CASA,SAASoE,GAAWC,GAAK,CACvB,IAAI9E,GAAQ,GACRS,GAAS,MAAMqE,GAAI,IAAI,EAE3B,OAAAA,GAAI,QAAQ,SAAS5E,GAAO,CAC1BO,GAAO,EAAET,EAAK,EAAIE,EACpB,CAAC,EACMO,EACT,CASA,SAASsE,GAAWD,GAAK,CACvB,IAAI9E,GAAQ,GACRS,GAAS,MAAMqE,GAAI,IAAI,EAE3B,OAAAA,GAAI,QAAQ,SAAS5E,GAAO,CAC1BO,GAAO,EAAET,EAAK,EAAI,CAACE,GAAOA,EAAK,CACjC,CAAC,EACMO,EACT,CAYA,SAASyB,GAActC,GAAOM,GAAO8B,GAAW,CAI9C,QAHIhC,GAAQgC,GAAY,EACpB/B,GAASL,GAAM,OAEZ,EAAEI,GAAQC,IACf,GAAIL,GAAMI,EAAK,IAAME,GACnB,OAAOF,GAGX,MAAO,EACT,CAYA,SAASgF,GAAkBpF,GAAOM,GAAO8B,GAAW,CAElD,QADIhC,GAAQgC,GAAY,EACjBhC,MACL,GAAIJ,GAAMI,EAAK,IAAME,GACnB,OAAOF,GAGX,OAAOA,EACT,CASA,SAASiF,GAAWxD,GAAQ,CAC1B,OAAOyC,GAAWzC,EAAM,EACpByD,GAAYzD,EAAM,EAClBH,GAAUG,EAAM,CACtB,CASA,SAAS0D,GAAc1D,GAAQ,CAC7B,OAAOyC,GAAWzC,EAAM,EACpB2D,GAAe3D,EAAM,EACrBD,GAAaC,EAAM,CACzB,CAUA,SAASyB,GAAgBzB,GAAQ,CAG/B,QAFIzB,GAAQyB,GAAO,OAEZzB,MAAWlG,GAAa,KAAK2H,GAAO,OAAOzB,EAAK,CAAC,GAAG,CAC3D,OAAOA,EACT,CASA,IAAIqF,GAAmB7C,GAAepE,EAAa,EASnD,SAAS8G,GAAYzD,GAAQ,CAE3B,QADIhB,GAAS/C,GAAU,UAAY,EAC5BA,GAAU,KAAK+D,EAAM,GAC1B,EAAEhB,GAEJ,OAAOA,EACT,CASA,SAAS2E,GAAe3D,GAAQ,CAC9B,OAAOA,GAAO,MAAM/D,EAAS,GAAK,CAAC,CACrC,CASA,SAAS4H,GAAa7D,GAAQ,CAC5B,OAAOA,GAAO,MAAM9D,EAAa,GAAK,CAAC,CACzC,CAiCA,IAAI4H,IAAgB,SAASA,GAAaC,GAAS,CACjDA,GAAUA,IAAW,KAAO9G,GAAO+G,GAAE,SAAS/G,GAAK,OAAO,EAAG8G,GAASC,GAAE,KAAK/G,GAAMZ,EAAY,CAAC,EAGhG,IAAI4H,GAAQF,GAAQ,MAChBG,GAAOH,GAAQ,KACfI,GAAQJ,GAAQ,MAChBK,GAAWL,GAAQ,SACnBM,GAAON,GAAQ,KACfO,GAASP,GAAQ,OACjBQ,GAASR,GAAQ,OACjBS,GAAST,GAAQ,OACjBU,GAAYV,GAAQ,UAGpBW,GAAaT,GAAM,UACnBU,GAAYP,GAAS,UACrBQ,GAAcN,GAAO,UAGrBO,GAAad,GAAQ,oBAAoB,EAGzCe,GAAeH,GAAU,SAGzBI,GAAiBH,GAAY,eAG7BI,GAAY,EAGZC,IAAc,UAAW,CAC3B,IAAIC,EAAM,SAAS,KAAKL,IAAcA,GAAW,MAAQA,GAAW,KAAK,UAAY,EAAE,EACvF,OAAOK,EAAO,iBAAmBA,EAAO,EAC1C,GAAE,EAOEC,GAAuBP,GAAY,SAGnCQ,GAAmBN,GAAa,KAAKR,EAAM,EAG3Ce,GAAUpI,GAAK,EAGfqI,GAAaf,GAAO,IACtBO,GAAa,KAAKC,EAAc,EAAE,QAAQ7M,GAAc,MAAM,EAC7D,QAAQ,yDAA0D,OAAO,EAAI,GAChF,EAGIqN,GAASnI,GAAgB2G,GAAQ,OAASlR,EAC1C2S,GAASzB,GAAQ,OACjB0B,GAAa1B,GAAQ,WACrB2B,GAAcH,GAASA,GAAO,YAAc1S,EAC5C8S,GAAe3C,GAAQsB,GAAO,eAAgBA,EAAM,EACpDsB,GAAetB,GAAO,OACtBuB,GAAuBjB,GAAY,qBACnCkB,GAASpB,GAAW,OACpBqB,GAAmBP,GAASA,GAAO,mBAAqB3S,EACxDmT,GAAcR,GAASA,GAAO,SAAW3S,EACzCoT,GAAiBT,GAASA,GAAO,YAAc3S,EAE/CqT,IAAkB,UAAW,CAC/B,GAAI,CACF,IAAInI,EAAOoI,GAAU7B,GAAQ,gBAAgB,EAC7C,OAAAvG,EAAK,CAAC,EAAG,GAAI,CAAC,CAAC,EACRA,CACT,MAAY,CAAC,CACf,GAAE,EAGEqI,GAAkBrC,GAAQ,eAAiB9G,GAAK,cAAgB8G,GAAQ,aACxEsC,GAASnC,IAAQA,GAAK,MAAQjH,GAAK,KAAK,KAAOiH,GAAK,IACpDoC,GAAgBvC,GAAQ,aAAe9G,GAAK,YAAc8G,GAAQ,WAGlEwC,GAAalC,GAAK,KAClBmC,GAAcnC,GAAK,MACnBoC,GAAmBnC,GAAO,sBAC1BoC,GAAiBnB,GAASA,GAAO,SAAW1S,EAC5C8T,GAAiB5C,GAAQ,SACzB6C,GAAalC,GAAW,KACxBmC,GAAa7D,GAAQsB,GAAO,KAAMA,EAAM,EACxCwC,GAAYzC,GAAK,IACjB0C,GAAY1C,GAAK,IACjB2C,GAAY9C,GAAK,IACjB+C,GAAiBlD,GAAQ,SACzBmD,GAAe7C,GAAK,OACpB8C,GAAgBzC,GAAW,QAG3B0C,GAAWjB,GAAUpC,GAAS,UAAU,EACxCsD,GAAMlB,GAAUpC,GAAS,KAAK,EAC9BuD,GAAUnB,GAAUpC,GAAS,SAAS,EACtCwD,GAAMpB,GAAUpC,GAAS,KAAK,EAC9ByD,GAAUrB,GAAUpC,GAAS,SAAS,EACtC0D,GAAetB,GAAU7B,GAAQ,QAAQ,EAGzCoD,GAAUF,IAAW,IAAIA,GAGzBG,GAAY,CAAC,EAGbC,GAAqBC,GAAST,EAAQ,EACtCU,GAAgBD,GAASR,EAAG,EAC5BU,GAAoBF,GAASP,EAAO,EACpCU,GAAgBH,GAASN,EAAG,EAC5BU,GAAoBJ,GAASL,EAAO,EAGpCU,GAAc1C,GAASA,GAAO,UAAY3S,EAC1CsV,GAAgBD,GAAcA,GAAY,QAAUrV,EACpDuV,GAAiBF,GAAcA,GAAY,SAAWrV,EAyH1D,SAASwV,GAAO5J,EAAO,CACrB,GAAI6J,GAAa7J,CAAK,GAAK,CAAC8J,GAAQ9J,CAAK,GAAK,EAAEA,aAAiB+J,IAAc,CAC7E,GAAI/J,aAAiBgK,GACnB,OAAOhK,EAET,GAAIsG,GAAe,KAAKtG,EAAO,aAAa,EAC1C,OAAOiK,GAAajK,CAAK,CAE7B,CACA,OAAO,IAAIgK,GAAchK,CAAK,CAChC,CAUA,IAAIkK,IAAc,UAAW,CAC3B,SAAS7H,GAAS,CAAC,CACnB,OAAO,SAAS8H,EAAO,CACrB,GAAI,CAACC,GAASD,CAAK,EACjB,MAAO,CAAC,EAEV,GAAIhD,GACF,OAAOA,GAAagD,CAAK,EAE3B9H,EAAO,UAAY8H,EACnB,IAAI5J,EAAS,IAAI8B,EACjB,OAAAA,EAAO,UAAYjO,EACZmM,CACT,CACF,GAAE,EAOF,SAAS8J,IAAa,CAEtB,CASA,SAASL,GAAchK,EAAOsK,EAAU,CACtC,KAAK,YAActK,EACnB,KAAK,YAAc,CAAC,EACpB,KAAK,UAAY,CAAC,CAACsK,EACnB,KAAK,UAAY,EACjB,KAAK,WAAalW,CACpB,CAWAwV,GAAO,iBAAmB,CAQxB,OAAUzQ,GAQV,SAAYC,GAQZ,YAAeC,GAQf,SAAY,GAQZ,QAAW,CAQT,EAAKuQ,EACP,CACF,EAGAA,GAAO,UAAYS,GAAW,UAC9BT,GAAO,UAAU,YAAcA,GAE/BI,GAAc,UAAYE,GAAWG,GAAW,SAAS,EACzDL,GAAc,UAAU,YAAcA,GAWtC,SAASD,GAAY/J,EAAO,CAC1B,KAAK,YAAcA,EACnB,KAAK,YAAc,CAAC,EACpB,KAAK,QAAU,EACf,KAAK,aAAe,GACpB,KAAK,cAAgB,CAAC,EACtB,KAAK,cAAgBzJ,EACrB,KAAK,UAAY,CAAC,CACpB,CAUA,SAASgU,IAAY,CACnB,IAAIhK,EAAS,IAAIwJ,GAAY,KAAK,WAAW,EAC7C,OAAAxJ,EAAO,YAAciK,GAAU,KAAK,WAAW,EAC/CjK,EAAO,QAAU,KAAK,QACtBA,EAAO,aAAe,KAAK,aAC3BA,EAAO,cAAgBiK,GAAU,KAAK,aAAa,EACnDjK,EAAO,cAAgB,KAAK,cAC5BA,EAAO,UAAYiK,GAAU,KAAK,SAAS,EACpCjK,CACT,CAUA,SAASkK,IAAc,CACrB,GAAI,KAAK,aAAc,CACrB,IAAIlK,EAAS,IAAIwJ,GAAY,IAAI,EACjCxJ,EAAO,QAAU,GACjBA,EAAO,aAAe,EACxB,MACEA,EAAS,KAAK,MAAM,EACpBA,EAAO,SAAW,GAEpB,OAAOA,CACT,CAUA,SAASmK,IAAY,CACnB,IAAIhL,EAAQ,KAAK,YAAY,MAAM,EAC/BiL,EAAM,KAAK,QACXC,EAAQd,GAAQpK,CAAK,EACrBmL,EAAUF,EAAM,EAChBG,EAAYF,EAAQlL,EAAM,OAAS,EACnCqL,GAAOC,GAAQ,EAAGF,EAAW,KAAK,SAAS,EAC3CG,GAAQF,GAAK,MACbG,GAAMH,GAAK,IACXhL,GAASmL,GAAMD,GACfnL,GAAQ+K,EAAUK,GAAOD,GAAQ,EACjCE,GAAY,KAAK,cACjBC,GAAaD,GAAU,OACvB7K,GAAW,EACX+K,GAAY/C,GAAUvI,GAAQ,KAAK,aAAa,EAEpD,GAAI,CAAC6K,GAAU,CAACC,GAAWC,GAAa/K,IAAUsL,IAAatL,GAC7D,OAAOuL,GAAiB5L,EAAO,KAAK,WAAW,EAEjD,IAAIa,GAAS,CAAC,EAEdgL,EACA,KAAOxL,MAAYO,GAAW+K,IAAW,CACvCvL,IAAS6K,EAKT,QAHIa,GAAY,GACZxL,GAAQN,EAAMI,EAAK,EAEhB,EAAE0L,GAAYJ,IAAY,CAC/B,IAAIhH,GAAO+G,GAAUK,EAAS,EAC1B5L,GAAWwE,GAAK,SAChBqH,GAAOrH,GAAK,KACZsH,GAAW9L,GAASI,EAAK,EAE7B,GAAIyL,IAAQxV,EACV+J,GAAQ0L,WACC,CAACA,GAAU,CACpB,GAAID,IAAQzV,EACV,SAASuV,EAET,MAAMA,CAEV,CACF,CACAhL,GAAOD,IAAU,EAAIN,EACvB,CACA,OAAOO,EACT,CAGAwJ,GAAY,UAAYG,GAAWG,GAAW,SAAS,EACvDN,GAAY,UAAU,YAAcA,GAWpC,SAAS4B,GAAKC,EAAS,CACrB,IAAI9L,EAAQ,GACRC,EAAS6L,GAAW,KAAO,EAAIA,EAAQ,OAG3C,IADA,KAAK,MAAM,EACJ,EAAE9L,EAAQC,GAAQ,CACvB,IAAI8L,EAAQD,EAAQ9L,CAAK,EACzB,KAAK,IAAI+L,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,CAC7B,CACF,CASA,SAASC,IAAY,CACnB,KAAK,SAAW9C,GAAeA,GAAa,IAAI,EAAI,CAAC,EACrD,KAAK,KAAO,CACd,CAYA,SAAS+C,GAAWnK,EAAK,CACvB,IAAIrB,EAAS,KAAK,IAAIqB,CAAG,GAAK,OAAO,KAAK,SAASA,CAAG,EACtD,YAAK,MAAQrB,EAAS,EAAI,EACnBA,CACT,CAWA,SAASyL,GAAQpK,EAAK,CACpB,IAAIwC,EAAO,KAAK,SAChB,GAAI4E,GAAc,CAChB,IAAIzI,EAAS6D,EAAKxC,CAAG,EACrB,OAAOrB,IAAW7L,EAAiBN,EAAYmM,CACjD,CACA,OAAO+F,GAAe,KAAKlC,EAAMxC,CAAG,EAAIwC,EAAKxC,CAAG,EAAIxN,CACtD,CAWA,SAAS6X,GAAQrK,EAAK,CACpB,IAAIwC,EAAO,KAAK,SAChB,OAAO4E,GAAgB5E,EAAKxC,CAAG,IAAMxN,EAAakS,GAAe,KAAKlC,EAAMxC,CAAG,CACjF,CAYA,SAASsK,GAAQtK,EAAK5B,EAAO,CAC3B,IAAIoE,EAAO,KAAK,SAChB,YAAK,MAAQ,KAAK,IAAIxC,CAAG,EAAI,EAAI,EACjCwC,EAAKxC,CAAG,EAAKoH,IAAgBhJ,IAAU5L,EAAaM,EAAiBsL,EAC9D,IACT,CAGA2L,GAAK,UAAU,MAAQG,GACvBH,GAAK,UAAU,OAAYI,GAC3BJ,GAAK,UAAU,IAAMK,GACrBL,GAAK,UAAU,IAAMM,GACrBN,GAAK,UAAU,IAAMO,GAWrB,SAASC,GAAUP,EAAS,CAC1B,IAAI9L,EAAQ,GACRC,EAAS6L,GAAW,KAAO,EAAIA,EAAQ,OAG3C,IADA,KAAK,MAAM,EACJ,EAAE9L,EAAQC,GAAQ,CACvB,IAAI8L,EAAQD,EAAQ9L,CAAK,EACzB,KAAK,IAAI+L,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,CAC7B,CACF,CASA,SAASO,IAAiB,CACxB,KAAK,SAAW,CAAC,EACjB,KAAK,KAAO,CACd,CAWA,SAASC,GAAgBzK,EAAK,CAC5B,IAAIwC,EAAO,KAAK,SACZtE,EAAQwM,GAAalI,EAAMxC,CAAG,EAElC,GAAI9B,EAAQ,EACV,MAAO,GAET,IAAIyM,EAAYnI,EAAK,OAAS,EAC9B,OAAItE,GAASyM,EACXnI,EAAK,IAAI,EAETiD,GAAO,KAAKjD,EAAMtE,EAAO,CAAC,EAE5B,EAAE,KAAK,KACA,EACT,CAWA,SAAS0M,GAAa5K,EAAK,CACzB,IAAIwC,EAAO,KAAK,SACZtE,EAAQwM,GAAalI,EAAMxC,CAAG,EAElC,OAAO9B,EAAQ,EAAI1L,EAAYgQ,EAAKtE,CAAK,EAAE,CAAC,CAC9C,CAWA,SAAS2M,GAAa7K,EAAK,CACzB,OAAO0K,GAAa,KAAK,SAAU1K,CAAG,EAAI,EAC5C,CAYA,SAAS8K,GAAa9K,EAAK5B,EAAO,CAChC,IAAIoE,EAAO,KAAK,SACZtE,EAAQwM,GAAalI,EAAMxC,CAAG,EAElC,OAAI9B,EAAQ,GACV,EAAE,KAAK,KACPsE,EAAK,KAAK,CAACxC,EAAK5B,CAAK,CAAC,GAEtBoE,EAAKtE,CAAK,EAAE,CAAC,EAAIE,EAEZ,IACT,CAGAmM,GAAU,UAAU,MAAQC,GAC5BD,GAAU,UAAU,OAAYE,GAChCF,GAAU,UAAU,IAAMK,GAC1BL,GAAU,UAAU,IAAMM,GAC1BN,GAAU,UAAU,IAAMO,GAW1B,SAASC,GAASf,EAAS,CACzB,IAAI9L,EAAQ,GACRC,EAAS6L,GAAW,KAAO,EAAIA,EAAQ,OAG3C,IADA,KAAK,MAAM,EACJ,EAAE9L,EAAQC,GAAQ,CACvB,IAAI8L,EAAQD,EAAQ9L,CAAK,EACzB,KAAK,IAAI+L,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,CAC7B,CACF,CASA,SAASe,IAAgB,CACvB,KAAK,KAAO,EACZ,KAAK,SAAW,CACd,KAAQ,IAAIjB,GACZ,IAAO,IAAK/C,IAAOuD,IACnB,OAAU,IAAIR,EAChB,CACF,CAWA,SAASkB,GAAejL,EAAK,CAC3B,IAAIrB,EAASuM,GAAW,KAAMlL,CAAG,EAAE,OAAUA,CAAG,EAChD,YAAK,MAAQrB,EAAS,EAAI,EACnBA,CACT,CAWA,SAASwM,GAAYnL,EAAK,CACxB,OAAOkL,GAAW,KAAMlL,CAAG,EAAE,IAAIA,CAAG,CACtC,CAWA,SAASoL,GAAYpL,EAAK,CACxB,OAAOkL,GAAW,KAAMlL,CAAG,EAAE,IAAIA,CAAG,CACtC,CAYA,SAASqL,GAAYrL,EAAK5B,EAAO,CAC/B,IAAIoE,EAAO0I,GAAW,KAAMlL,CAAG,EAC3BsL,EAAO9I,EAAK,KAEhB,OAAAA,EAAK,IAAIxC,EAAK5B,CAAK,EACnB,KAAK,MAAQoE,EAAK,MAAQ8I,EAAO,EAAI,EAC9B,IACT,CAGAP,GAAS,UAAU,MAAQC,GAC3BD,GAAS,UAAU,OAAYE,GAC/BF,GAAS,UAAU,IAAMI,GACzBJ,GAAS,UAAU,IAAMK,GACzBL,GAAS,UAAU,IAAMM,GAYzB,SAASE,GAASrM,EAAQ,CACxB,IAAIhB,EAAQ,GACRC,EAASe,GAAU,KAAO,EAAIA,EAAO,OAGzC,IADA,KAAK,SAAW,IAAI6L,GACb,EAAE7M,EAAQC,GACf,KAAK,IAAIe,EAAOhB,CAAK,CAAC,CAE1B,CAYA,SAASsN,GAAYpN,EAAO,CAC1B,YAAK,SAAS,IAAIA,EAAOtL,CAAc,EAChC,IACT,CAWA,SAAS2Y,GAAYrN,EAAO,CAC1B,OAAO,KAAK,SAAS,IAAIA,CAAK,CAChC,CAGAmN,GAAS,UAAU,IAAMA,GAAS,UAAU,KAAOC,GACnDD,GAAS,UAAU,IAAME,GAWzB,SAASC,GAAM1B,EAAS,CACtB,IAAIxH,EAAO,KAAK,SAAW,IAAI+H,GAAUP,CAAO,EAChD,KAAK,KAAOxH,EAAK,IACnB,CASA,SAASmJ,IAAa,CACpB,KAAK,SAAW,IAAIpB,GACpB,KAAK,KAAO,CACd,CAWA,SAASqB,GAAY5L,EAAK,CACxB,IAAIwC,EAAO,KAAK,SACZ7D,EAAS6D,EAAK,OAAUxC,CAAG,EAE/B,YAAK,KAAOwC,EAAK,KACV7D,CACT,CAWA,SAASkN,GAAS7L,EAAK,CACrB,OAAO,KAAK,SAAS,IAAIA,CAAG,CAC9B,CAWA,SAAS8L,GAAS9L,EAAK,CACrB,OAAO,KAAK,SAAS,IAAIA,CAAG,CAC9B,CAYA,SAAS+L,GAAS/L,EAAK5B,EAAO,CAC5B,IAAIoE,EAAO,KAAK,SAChB,GAAIA,aAAgB+H,GAAW,CAC7B,IAAIyB,EAAQxJ,EAAK,SACjB,GAAI,CAACwE,IAAQgF,EAAM,OAAStZ,EAAmB,EAC7C,OAAAsZ,EAAM,KAAK,CAAChM,EAAK5B,CAAK,CAAC,EACvB,KAAK,KAAO,EAAEoE,EAAK,KACZ,KAETA,EAAO,KAAK,SAAW,IAAIuI,GAASiB,CAAK,CAC3C,CACA,OAAAxJ,EAAK,IAAIxC,EAAK5B,CAAK,EACnB,KAAK,KAAOoE,EAAK,KACV,IACT,CAGAkJ,GAAM,UAAU,MAAQC,GACxBD,GAAM,UAAU,OAAYE,GAC5BF,GAAM,UAAU,IAAMG,GACtBH,GAAM,UAAU,IAAMI,GACtBJ,GAAM,UAAU,IAAMK,GAYtB,SAASE,GAAc7N,EAAO8N,EAAW,CACvC,IAAIlD,EAAQd,GAAQ9J,CAAK,EACrB+N,EAAQ,CAACnD,GAASoD,GAAYhO,CAAK,EACnCiO,EAAS,CAACrD,GAAS,CAACmD,GAASG,GAASlO,CAAK,EAC3CmO,GAAS,CAACvD,GAAS,CAACmD,GAAS,CAACE,GAAUG,GAAapO,CAAK,EAC1DqO,GAAczD,GAASmD,GAASE,GAAUE,GAC1C5N,GAAS8N,GAAc1L,GAAU3C,EAAM,OAAQ+F,EAAM,EAAI,CAAC,EAC1DhG,GAASQ,GAAO,OAEpB,QAASqB,MAAO5B,GACT8N,GAAaxH,GAAe,KAAKtG,EAAO4B,EAAG,IAC5C,EAAEyM,KAECzM,IAAO,UAENqM,IAAWrM,IAAO,UAAYA,IAAO,WAErCuM,KAAWvM,IAAO,UAAYA,IAAO,cAAgBA,IAAO,eAE7D0M,GAAQ1M,GAAK7B,EAAM,KAExBQ,GAAO,KAAKqB,EAAG,EAGnB,OAAOrB,EACT,CASA,SAASgO,GAAY7O,EAAO,CAC1B,IAAIK,EAASL,EAAM,OACnB,OAAOK,EAASL,EAAM8O,GAAW,EAAGzO,EAAS,CAAC,CAAC,EAAI3L,CACrD,CAUA,SAASqa,GAAgB/O,EAAOkD,EAAG,CACjC,OAAO8L,GAAYlE,GAAU9K,CAAK,EAAGiP,GAAU/L,EAAG,EAAGlD,EAAM,MAAM,CAAC,CACpE,CASA,SAASkP,GAAalP,EAAO,CAC3B,OAAOgP,GAAYlE,GAAU9K,CAAK,CAAC,CACrC,CAWA,SAASmP,GAAiBxM,EAAQT,EAAK5B,EAAO,EACvCA,IAAU5L,GAAa,CAAC0a,GAAGzM,EAAOT,CAAG,EAAG5B,CAAK,GAC7CA,IAAU5L,GAAa,EAAEwN,KAAOS,KACnC0M,GAAgB1M,EAAQT,EAAK5B,CAAK,CAEtC,CAYA,SAASgP,GAAY3M,EAAQT,EAAK5B,EAAO,CACvC,IAAIiP,EAAW5M,EAAOT,CAAG,GACrB,EAAE0E,GAAe,KAAKjE,EAAQT,CAAG,GAAKkN,GAAGG,EAAUjP,CAAK,IACvDA,IAAU5L,GAAa,EAAEwN,KAAOS,KACnC0M,GAAgB1M,EAAQT,EAAK5B,CAAK,CAEtC,CAUA,SAASsM,GAAa5M,EAAOkC,EAAK,CAEhC,QADI7B,EAASL,EAAM,OACZK,KACL,GAAI+O,GAAGpP,EAAMK,CAAM,EAAE,CAAC,EAAG6B,CAAG,EAC1B,OAAO7B,EAGX,MAAO,EACT,CAaA,SAASmP,GAAexN,EAAY/B,EAAQC,EAAUC,EAAa,CACjE,OAAAsP,GAASzN,EAAY,SAAS1B,EAAO4B,GAAKF,GAAY,CACpD/B,EAAOE,EAAaG,EAAOJ,EAASI,CAAK,EAAG0B,EAAU,CACxD,CAAC,EACM7B,CACT,CAWA,SAASuP,GAAW/M,EAAQgN,EAAQ,CAClC,OAAOhN,GAAUiN,GAAWD,EAAQE,GAAKF,CAAM,EAAGhN,CAAM,CAC1D,CAWA,SAASmN,GAAanN,EAAQgN,EAAQ,CACpC,OAAOhN,GAAUiN,GAAWD,EAAQI,GAAOJ,CAAM,EAAGhN,CAAM,CAC5D,CAWA,SAAS0M,GAAgB1M,EAAQT,EAAK5B,EAAO,CACvC4B,GAAO,aAAe6F,GACxBA,GAAepF,EAAQT,EAAK,CAC1B,aAAgB,GAChB,WAAc,GACd,MAAS5B,EACT,SAAY,EACd,CAAC,EAEDqC,EAAOT,CAAG,EAAI5B,CAElB,CAUA,SAAS0P,GAAOrN,EAAQsN,EAAO,CAM7B,QALI7P,EAAQ,GACRC,EAAS4P,EAAM,OACfpP,EAASiF,GAAMzF,CAAM,EACrB6P,GAAOvN,GAAU,KAEd,EAAEvC,EAAQC,GACfQ,EAAOT,CAAK,EAAI8P,GAAOxb,EAAYyb,GAAIxN,EAAQsN,EAAM7P,CAAK,CAAC,EAE7D,OAAOS,CACT,CAWA,SAASoO,GAAUmB,EAAQC,EAAOC,EAAO,CACvC,OAAIF,IAAWA,IACTE,IAAU5b,IACZ0b,EAASA,GAAUE,EAAQF,EAASE,GAElCD,IAAU3b,IACZ0b,EAASA,GAAUC,EAAQD,EAASC,IAGjCD,CACT,CAkBA,SAASG,GAAUjQ,EAAOkQ,EAASC,EAAYvO,EAAKS,EAAQ+N,GAAO,CACjE,IAAI7P,GACA8P,GAASH,EAAUrb,EACnByb,GAASJ,EAAUpb,EACnByb,GAASL,EAAUnb,EAKvB,GAHIob,IACF5P,GAAS8B,EAAS8N,EAAWnQ,EAAO4B,EAAKS,EAAQ+N,EAAK,EAAID,EAAWnQ,CAAK,GAExEO,KAAWnM,EACb,OAAOmM,GAET,GAAI,CAAC6J,GAASpK,CAAK,EACjB,OAAOA,EAET,IAAI4K,GAAQd,GAAQ9J,CAAK,EACzB,GAAI4K,IAEF,GADArK,GAASiQ,GAAexQ,CAAK,EACzB,CAACqQ,GACH,OAAO7F,GAAUxK,EAAOO,EAAM,MAE3B,CACL,IAAIkQ,GAAMC,GAAO1Q,CAAK,EAClB2Q,GAASF,IAAOvZ,IAAWuZ,IAAOtZ,GAEtC,GAAI+W,GAASlO,CAAK,EAChB,OAAO4Q,GAAY5Q,EAAOqQ,EAAM,EAElC,GAAII,IAAOlZ,IAAakZ,IAAO9Z,IAAYga,IAAU,CAACtO,GAEpD,GADA9B,GAAU+P,IAAUK,GAAU,CAAC,EAAIE,GAAgB7Q,CAAK,EACpD,CAACqQ,GACH,OAAOC,GACHQ,GAAc9Q,EAAOwP,GAAajP,GAAQP,CAAK,CAAC,EAChD+Q,GAAY/Q,EAAOoP,GAAW7O,GAAQP,CAAK,CAAC,MAE7C,CACL,GAAI,CAACjC,GAAc0S,EAAG,EACpB,OAAOpO,EAASrC,EAAQ,CAAC,EAE3BO,GAASyQ,GAAehR,EAAOyQ,GAAKJ,EAAM,CAC5C,CACF,CAEAD,KAAUA,GAAQ,IAAI9C,IACtB,IAAI2D,GAAUb,GAAM,IAAIpQ,CAAK,EAC7B,GAAIiR,GACF,OAAOA,GAETb,GAAM,IAAIpQ,EAAOO,EAAM,EAEnB2Q,GAAMlR,CAAK,EACbA,EAAM,QAAQ,SAASmR,GAAU,CAC/B5Q,GAAO,IAAI0P,GAAUkB,GAAUjB,EAASC,EAAYgB,GAAUnR,EAAOoQ,EAAK,CAAC,CAC7E,CAAC,EACQgB,GAAMpR,CAAK,GACpBA,EAAM,QAAQ,SAASmR,GAAUvP,GAAK,CACpCrB,GAAO,IAAIqB,GAAKqO,GAAUkB,GAAUjB,EAASC,EAAYvO,GAAK5B,EAAOoQ,EAAK,CAAC,CAC7E,CAAC,EAGH,IAAIiB,GAAWd,GACVD,GAASgB,GAAeC,GACxBjB,GAASb,GAASF,GAEnBzM,GAAQ8H,GAAQxW,EAAYid,GAASrR,CAAK,EAC9C,OAAAC,GAAU6C,IAAS9C,EAAO,SAASmR,GAAUvP,GAAK,CAC5CkB,KACFlB,GAAMuP,GACNA,GAAWnR,EAAM4B,EAAG,GAGtBoN,GAAYzO,GAAQqB,GAAKqO,GAAUkB,GAAUjB,EAASC,EAAYvO,GAAK5B,EAAOoQ,EAAK,CAAC,CACtF,CAAC,EACM7P,EACT,CASA,SAASiR,GAAanC,EAAQ,CAC5B,IAAIvM,EAAQyM,GAAKF,CAAM,EACvB,OAAO,SAAShN,EAAQ,CACtB,OAAOoP,GAAepP,EAAQgN,EAAQvM,CAAK,CAC7C,CACF,CAUA,SAAS2O,GAAepP,EAAQgN,EAAQvM,EAAO,CAC7C,IAAI/C,EAAS+C,EAAM,OACnB,GAAIT,GAAU,KACZ,MAAO,CAACtC,EAGV,IADAsC,EAASwD,GAAOxD,CAAM,EACftC,KAAU,CACf,IAAI6B,EAAMkB,EAAM/C,CAAM,EAClBK,GAAYiP,EAAOzN,CAAG,EACtB5B,GAAQqC,EAAOT,CAAG,EAEtB,GAAK5B,KAAU5L,GAAa,EAAEwN,KAAOS,IAAY,CAACjC,GAAUJ,EAAK,EAC/D,MAAO,EAEX,CACA,MAAO,EACT,CAYA,SAAS0R,GAAUpS,EAAMqS,EAAMnS,EAAM,CACnC,GAAI,OAAOF,GAAQ,WACjB,MAAM,IAAI0G,GAAUxR,CAAe,EAErC,OAAOod,GAAW,UAAW,CAAEtS,EAAK,MAAMlL,EAAWoL,CAAI,CAAG,EAAGmS,CAAI,CACrE,CAaA,SAASE,GAAenS,EAAOoB,EAAQlB,EAAUe,EAAY,CAC3D,IAAIb,EAAQ,GACRgS,GAAWtR,GACXuR,GAAW,GACXhS,GAASL,EAAM,OACfa,GAAS,CAAC,EACVyR,GAAelR,EAAO,OAE1B,GAAI,CAACf,GACH,OAAOQ,GAELX,IACFkB,EAASF,GAASE,EAAQmC,GAAUrD,CAAQ,CAAC,GAE3Ce,GACFmR,GAAWpR,GACXqR,GAAW,IAEJjR,EAAO,QAAUxM,IACxBwd,GAAW3O,GACX4O,GAAW,GACXjR,EAAS,IAAIqM,GAASrM,CAAM,GAE9ByK,EACA,KAAO,EAAEzL,EAAQC,IAAQ,CACvB,IAAIC,GAAQN,EAAMI,CAAK,EACnB4L,GAAW9L,GAAY,KAAOI,GAAQJ,EAASI,EAAK,EAGxD,GADAA,GAASW,GAAcX,KAAU,EAAKA,GAAQ,EAC1C+R,IAAYrG,KAAaA,GAAU,CAErC,QADIuG,GAAcD,GACXC,MACL,GAAInR,EAAOmR,EAAW,IAAMvG,GAC1B,SAASH,EAGbhL,GAAO,KAAKP,EAAK,CACnB,MACU8R,GAAShR,EAAQ4K,GAAU/K,CAAU,GAC7CJ,GAAO,KAAKP,EAAK,CAErB,CACA,OAAOO,EACT,CAUA,IAAI4O,GAAW+C,GAAeC,EAAU,EAUpCC,GAAgBF,GAAeG,GAAiB,EAAI,EAWxD,SAASC,GAAU5Q,EAAYtB,EAAW,CACxC,IAAIG,EAAS,GACb,OAAA4O,GAASzN,EAAY,SAAS1B,EAAOF,EAAO4B,GAAY,CACtD,OAAAnB,EAAS,CAAC,CAACH,EAAUJ,EAAOF,EAAO4B,EAAU,EACtCnB,CACT,CAAC,EACMA,CACT,CAYA,SAASgS,GAAa7S,EAAOE,EAAUe,EAAY,CAIjD,QAHIb,EAAQ,GACRC,EAASL,EAAM,OAEZ,EAAEI,EAAQC,GAAQ,CACvB,IAAIC,GAAQN,EAAMI,CAAK,EACnB4C,GAAU9C,EAASI,EAAK,EAE5B,GAAI0C,IAAW,OAASgJ,KAAatX,EAC5BsO,KAAYA,IAAW,CAAC8P,GAAS9P,EAAO,EACzC/B,EAAW+B,GAASgJ,EAAQ,GAElC,IAAIA,GAAWhJ,GACXnC,GAASP,EAEjB,CACA,OAAOO,EACT,CAYA,SAASkS,GAAS/S,EAAOM,EAAOiL,EAAOC,EAAK,CAC1C,IAAInL,EAASL,EAAM,OAWnB,IATAuL,EAAQyH,GAAUzH,CAAK,EACnBA,EAAQ,IACVA,EAAQ,CAACA,EAAQlL,EAAS,EAAKA,EAASkL,GAE1CC,EAAOA,IAAQ9W,GAAa8W,EAAMnL,EAAUA,EAAS2S,GAAUxH,CAAG,EAC9DA,EAAM,IACRA,GAAOnL,GAETmL,EAAMD,EAAQC,EAAM,EAAIyH,GAASzH,CAAG,EAC7BD,EAAQC,GACbxL,EAAMuL,GAAO,EAAIjL,EAEnB,OAAON,CACT,CAUA,SAASkT,GAAWlR,EAAYtB,EAAW,CACzC,IAAIG,EAAS,CAAC,EACd,OAAA4O,GAASzN,EAAY,SAAS1B,EAAOF,EAAO4B,GAAY,CAClDtB,EAAUJ,EAAOF,EAAO4B,EAAU,GACpCnB,EAAO,KAAKP,CAAK,CAErB,CAAC,EACMO,CACT,CAaA,SAASsS,GAAYnT,EAAOoT,EAAO1S,EAAW2S,EAAUxS,EAAQ,CAC9D,IAAIT,GAAQ,GACRC,GAASL,EAAM,OAKnB,IAHAU,IAAcA,EAAY4S,IAC1BzS,IAAWA,EAAS,CAAC,GAEd,EAAET,GAAQC,IAAQ,CACvB,IAAIC,GAAQN,EAAMI,EAAK,EACnBgT,EAAQ,GAAK1S,EAAUJ,EAAK,EAC1B8S,EAAQ,EAEVD,GAAY7S,GAAO8S,EAAQ,EAAG1S,EAAW2S,EAAUxS,CAAM,EAEzDM,GAAUN,EAAQP,EAAK,EAEf+S,IACVxS,EAAOA,EAAO,MAAM,EAAIP,GAE5B,CACA,OAAOO,CACT,CAaA,IAAI0S,GAAUC,GAAc,EAYxBC,GAAeD,GAAc,EAAI,EAUrC,SAASf,GAAW9P,EAAQzC,EAAU,CACpC,OAAOyC,GAAU4Q,GAAQ5Q,EAAQzC,EAAU2P,EAAI,CACjD,CAUA,SAAS8C,GAAgBhQ,EAAQzC,EAAU,CACzC,OAAOyC,GAAU8Q,GAAa9Q,EAAQzC,EAAU2P,EAAI,CACtD,CAWA,SAAS6D,GAAc/Q,EAAQS,EAAO,CACpC,OAAOzC,GAAYyC,EAAO,SAASlB,EAAK,CACtC,OAAOyR,GAAWhR,EAAOT,CAAG,CAAC,CAC/B,CAAC,CACH,CAUA,SAAS0R,GAAQjR,EAAQkR,EAAM,CAC7BA,EAAOC,GAASD,EAAMlR,CAAM,EAK5B,QAHIvC,EAAQ,EACRC,EAASwT,EAAK,OAEXlR,GAAU,MAAQvC,EAAQC,GAC/BsC,EAASA,EAAOoR,GAAMF,EAAKzT,GAAO,CAAC,CAAC,EAEtC,OAAQA,GAASA,GAASC,EAAUsC,EAASjO,CAC/C,CAaA,SAASsf,GAAerR,EAAQgP,EAAUsC,EAAa,CACrD,IAAIpT,EAAS8Q,EAAShP,CAAM,EAC5B,OAAOyH,GAAQzH,CAAM,EAAI9B,EAASM,GAAUN,EAAQoT,EAAYtR,CAAM,CAAC,CACzE,CASA,SAASuR,GAAW5T,EAAO,CACzB,OAAIA,GAAS,KACJA,IAAU5L,EAAY0D,GAAeR,GAEtCkQ,IAAkBA,MAAkB3B,GAAO7F,CAAK,EACpD6T,GAAU7T,CAAK,EACf8T,GAAe9T,CAAK,CAC1B,CAWA,SAAS+T,GAAO/T,EAAOgU,EAAO,CAC5B,OAAOhU,EAAQgU,CACjB,CAUA,SAASC,GAAQ5R,EAAQT,EAAK,CAC5B,OAAOS,GAAU,MAAQiE,GAAe,KAAKjE,EAAQT,CAAG,CAC1D,CAUA,SAASsS,GAAU7R,EAAQT,EAAK,CAC9B,OAAOS,GAAU,MAAQT,KAAOiE,GAAOxD,CAAM,CAC/C,CAWA,SAAS8R,GAAYrE,EAAQ7E,EAAOC,EAAK,CACvC,OAAO4E,GAAUxH,GAAU2C,EAAOC,CAAG,GAAK4E,EAASzH,GAAU4C,EAAOC,CAAG,CACzE,CAYA,SAASkJ,GAAiBC,EAAQzU,EAAUe,EAAY,CAStD,QARImR,EAAWnR,EAAaD,GAAoBF,GAC5CT,EAASsU,EAAO,CAAC,EAAE,OACnBC,GAAYD,EAAO,OACnBE,GAAWD,GACXE,GAAShP,GAAM8O,EAAS,EACxBG,GAAY,IACZlU,GAAS,CAAC,EAEPgU,MAAY,CACjB,IAAI7U,GAAQ2U,EAAOE,EAAQ,EACvBA,IAAY3U,IACdF,GAAQkB,GAASlB,GAAOuD,GAAUrD,CAAQ,CAAC,GAE7C6U,GAAYnM,GAAU5I,GAAM,OAAQ+U,EAAS,EAC7CD,GAAOD,EAAQ,EAAI,CAAC5T,IAAef,GAAaG,GAAU,KAAOL,GAAM,QAAU,KAC7E,IAAIyN,GAASoH,IAAY7U,EAAK,EAC9BtL,CACN,CACAsL,GAAQ2U,EAAO,CAAC,EAEhB,IAAIvU,GAAQ,GACR4U,GAAOF,GAAO,CAAC,EAEnBjJ,EACA,KAAO,EAAEzL,GAAQC,GAAUQ,GAAO,OAASkU,IAAW,CACpD,IAAIzU,GAAQN,GAAMI,EAAK,EACnB4L,GAAW9L,EAAWA,EAASI,EAAK,EAAIA,GAG5C,GADAA,GAASW,GAAcX,KAAU,EAAKA,GAAQ,EAC1C,EAAE0U,GACEvR,GAASuR,GAAMhJ,EAAQ,EACvBoG,EAASvR,GAAQmL,GAAU/K,CAAU,GACtC,CAEL,IADA4T,GAAWD,GACJ,EAAEC,IAAU,CACjB,IAAInR,GAAQoR,GAAOD,EAAQ,EAC3B,GAAI,EAAEnR,GACED,GAASC,GAAOsI,EAAQ,EACxBoG,EAASuC,EAAOE,EAAQ,EAAG7I,GAAU/K,CAAU,GAErD,SAAS4K,CAEb,CACImJ,IACFA,GAAK,KAAKhJ,EAAQ,EAEpBnL,GAAO,KAAKP,EAAK,CACnB,CACF,CACA,OAAOO,EACT,CAaA,SAASoU,GAAatS,EAAQ1C,EAAQC,EAAUC,EAAa,CAC3D,OAAAsS,GAAW9P,EAAQ,SAASrC,EAAO4B,GAAKS,GAAQ,CAC9C1C,EAAOE,EAAaD,EAASI,CAAK,EAAG4B,GAAKS,EAAM,CAClD,CAAC,EACMxC,CACT,CAYA,SAAS+U,GAAWvS,EAAQkR,EAAM/T,EAAM,CACtC+T,EAAOC,GAASD,EAAMlR,CAAM,EAC5BA,EAASwS,GAAOxS,EAAQkR,CAAI,EAC5B,IAAIjU,EAAO+C,GAAU,KAAOA,EAASA,EAAOoR,GAAMqB,GAAKvB,CAAI,CAAC,CAAC,EAC7D,OAAOjU,GAAQ,KAAOlL,EAAYiL,GAAMC,EAAM+C,EAAQ7C,CAAI,CAC5D,CASA,SAASuV,GAAgB/U,EAAO,CAC9B,OAAO6J,GAAa7J,CAAK,GAAK4T,GAAW5T,CAAK,GAAKrJ,EACrD,CASA,SAASqe,GAAkBhV,EAAO,CAChC,OAAO6J,GAAa7J,CAAK,GAAK4T,GAAW5T,CAAK,GAAK/H,EACrD,CASA,SAASgd,GAAWjV,EAAO,CACzB,OAAO6J,GAAa7J,CAAK,GAAK4T,GAAW5T,CAAK,GAAKjJ,EACrD,CAgBA,SAASme,GAAYlV,EAAOgU,EAAO9D,EAASC,EAAYC,EAAO,CAC7D,OAAIpQ,IAAUgU,EACL,GAELhU,GAAS,MAAQgU,GAAS,MAAS,CAACnK,GAAa7J,CAAK,GAAK,CAAC6J,GAAamK,CAAK,EACzEhU,IAAUA,GAASgU,IAAUA,EAE/BmB,GAAgBnV,EAAOgU,EAAO9D,EAASC,EAAY+E,GAAa9E,CAAK,CAC9E,CAgBA,SAAS+E,GAAgB9S,EAAQ2R,EAAO9D,EAASC,EAAYiF,EAAWhF,GAAO,CAC7E,IAAIiF,GAAWvL,GAAQzH,CAAM,EACzBiT,GAAWxL,GAAQkK,CAAK,EACxBuB,GAASF,GAAWze,GAAW8Z,GAAOrO,CAAM,EAC5CmT,GAASF,GAAW1e,GAAW8Z,GAAOsD,CAAK,EAE/CuB,GAASA,IAAU5e,GAAUY,GAAYge,GACzCC,GAASA,IAAU7e,GAAUY,GAAYie,GAEzC,IAAIC,GAAWF,IAAUhe,GACrBme,GAAWF,IAAUje,GACrBoe,GAAYJ,IAAUC,GAE1B,GAAIG,IAAazH,GAAS7L,CAAM,EAAG,CACjC,GAAI,CAAC6L,GAAS8F,CAAK,EACjB,MAAO,GAETqB,GAAW,GACXI,GAAW,EACb,CACA,GAAIE,IAAa,CAACF,GAChB,OAAArF,KAAUA,GAAQ,IAAI9C,IACd+H,IAAYjH,GAAa/L,CAAM,EACnCuT,GAAYvT,EAAQ2R,EAAO9D,EAASC,EAAYiF,EAAWhF,EAAK,EAChEyF,GAAWxT,EAAQ2R,EAAOuB,GAAQrF,EAASC,EAAYiF,EAAWhF,EAAK,EAE7E,GAAI,EAAEF,EAAUlb,GAAuB,CACrC,IAAI8gB,GAAeL,IAAYnP,GAAe,KAAKjE,EAAQ,aAAa,EACpE0T,GAAeL,IAAYpP,GAAe,KAAK0N,EAAO,aAAa,EAEvE,GAAI8B,IAAgBC,GAAc,CAChC,IAAIC,GAAeF,GAAezT,EAAO,MAAM,EAAIA,EAC/C4T,GAAeF,GAAe/B,EAAM,MAAM,EAAIA,EAElD,OAAA5D,KAAUA,GAAQ,IAAI9C,IACf8H,EAAUY,GAAcC,GAAc/F,EAASC,EAAYC,EAAK,CACzE,CACF,CACA,OAAKuF,IAGLvF,KAAUA,GAAQ,IAAI9C,IACf4I,GAAa7T,EAAQ2R,EAAO9D,EAASC,EAAYiF,EAAWhF,EAAK,GAH/D,EAIX,CASA,SAAS+F,GAAUnW,EAAO,CACxB,OAAO6J,GAAa7J,CAAK,GAAK0Q,GAAO1Q,CAAK,GAAK5I,EACjD,CAYA,SAASgf,GAAY/T,EAAQgN,EAAQgH,EAAWlG,EAAY,CAC1D,IAAIrQ,EAAQuW,EAAU,OAClBtW,GAASD,EACTwW,GAAe,CAACnG,EAEpB,GAAI9N,GAAU,KACZ,MAAO,CAACtC,GAGV,IADAsC,EAASwD,GAAOxD,CAAM,EACfvC,KAAS,CACd,IAAIsE,GAAOiS,EAAUvW,CAAK,EAC1B,GAAKwW,IAAgBlS,GAAK,CAAC,EACnBA,GAAK,CAAC,IAAM/B,EAAO+B,GAAK,CAAC,CAAC,EAC1B,EAAEA,GAAK,CAAC,IAAK/B,GAEnB,MAAO,EAEX,CACA,KAAO,EAAEvC,EAAQC,IAAQ,CACvBqE,GAAOiS,EAAUvW,CAAK,EACtB,IAAI8B,GAAMwC,GAAK,CAAC,EACZ6K,GAAW5M,EAAOT,EAAG,EACrB2U,GAAWnS,GAAK,CAAC,EAErB,GAAIkS,IAAgBlS,GAAK,CAAC,GACxB,GAAI6K,KAAa7a,GAAa,EAAEwN,MAAOS,GACrC,MAAO,OAEJ,CACL,IAAI+N,GAAQ,IAAI9C,GAChB,GAAI6C,EACF,IAAI5P,GAAS4P,EAAWlB,GAAUsH,GAAU3U,GAAKS,EAAQgN,EAAQe,EAAK,EAExE,GAAI,EAAE7P,KAAWnM,EACT8gB,GAAYqB,GAAUtH,GAAUja,EAAuBC,EAAwBkb,EAAYC,EAAK,EAChG7P,IAEN,MAAO,EAEX,CACF,CACA,MAAO,EACT,CAUA,SAASiW,GAAaxW,EAAO,CAC3B,GAAI,CAACoK,GAASpK,CAAK,GAAKyW,GAASzW,CAAK,EACpC,MAAO,GAET,IAAI0W,EAAUrD,GAAWrT,CAAK,EAAI6G,GAAatM,GAC/C,OAAOmc,EAAQ,KAAKtN,GAASpJ,CAAK,CAAC,CACrC,CASA,SAAS2W,GAAa3W,EAAO,CAC3B,OAAO6J,GAAa7J,CAAK,GAAK4T,GAAW5T,CAAK,GAAKtI,EACrD,CASA,SAASkf,GAAU5W,EAAO,CACxB,OAAO6J,GAAa7J,CAAK,GAAK0Q,GAAO1Q,CAAK,GAAKrI,EACjD,CASA,SAASkf,GAAiB7W,EAAO,CAC/B,OAAO6J,GAAa7J,CAAK,GACvB8W,GAAS9W,EAAM,MAAM,GAAK,CAAC,CAAClC,GAAe8V,GAAW5T,CAAK,CAAC,CAChE,CASA,SAAS+W,GAAa/W,EAAO,CAG3B,OAAI,OAAOA,GAAS,WACXA,EAELA,GAAS,KACJgX,GAEL,OAAOhX,GAAS,SACX8J,GAAQ9J,CAAK,EAChBiX,GAAoBjX,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EACtCkX,GAAYlX,CAAK,EAEhBmX,GAASnX,CAAK,CACvB,CASA,SAASoX,GAAS/U,EAAQ,CACxB,GAAI,CAACgV,GAAYhV,CAAM,EACrB,OAAO+F,GAAW/F,CAAM,EAE1B,IAAI9B,EAAS,CAAC,EACd,QAASqB,KAAOiE,GAAOxD,CAAM,EACvBiE,GAAe,KAAKjE,EAAQT,CAAG,GAAKA,GAAO,eAC7CrB,EAAO,KAAKqB,CAAG,EAGnB,OAAOrB,CACT,CASA,SAAS+W,GAAWjV,EAAQ,CAC1B,GAAI,CAAC+H,GAAS/H,CAAM,EAClB,OAAOkV,GAAalV,CAAM,EAE5B,IAAImV,EAAUH,GAAYhV,CAAM,EAC5B9B,EAAS,CAAC,EAEd,QAASqB,KAAOS,EACRT,GAAO,gBAAkB4V,GAAW,CAAClR,GAAe,KAAKjE,EAAQT,CAAG,IACxErB,EAAO,KAAKqB,CAAG,EAGnB,OAAOrB,CACT,CAWA,SAASkX,GAAOzX,EAAOgU,EAAO,CAC5B,OAAOhU,EAAQgU,CACjB,CAUA,SAAS0D,GAAQhW,EAAY9B,EAAU,CACrC,IAAIE,EAAQ,GACRS,EAASoX,GAAYjW,CAAU,EAAI8D,GAAM9D,EAAW,MAAM,EAAI,CAAC,EAEnE,OAAAyN,GAASzN,EAAY,SAAS1B,EAAO4B,GAAKF,GAAY,CACpDnB,EAAO,EAAET,CAAK,EAAIF,EAASI,EAAO4B,GAAKF,EAAU,CACnD,CAAC,EACMnB,CACT,CASA,SAAS2W,GAAY7H,EAAQ,CAC3B,IAAIgH,EAAYuB,GAAavI,CAAM,EACnC,OAAIgH,EAAU,QAAU,GAAKA,EAAU,CAAC,EAAE,CAAC,EAClCwB,GAAwBxB,EAAU,CAAC,EAAE,CAAC,EAAGA,EAAU,CAAC,EAAE,CAAC,CAAC,EAE1D,SAAShU,EAAQ,CACtB,OAAOA,IAAWgN,GAAU+G,GAAY/T,EAAQgN,EAAQgH,CAAS,CACnE,CACF,CAUA,SAASY,GAAoB1D,EAAMgD,EAAU,CAC3C,OAAIuB,GAAMvE,CAAI,GAAKwE,GAAmBxB,CAAQ,EACrCsB,GAAwBpE,GAAMF,CAAI,EAAGgD,CAAQ,EAE/C,SAASlU,EAAQ,CACtB,IAAI4M,EAAWY,GAAIxN,EAAQkR,CAAI,EAC/B,OAAQtE,IAAa7a,GAAa6a,IAAasH,EAC3CyB,GAAM3V,EAAQkR,CAAI,EAClB2B,GAAYqB,EAAUtH,EAAUja,EAAuBC,CAAsB,CACnF,CACF,CAaA,SAASgjB,GAAU5V,EAAQgN,EAAQ6I,EAAU/H,EAAYC,EAAO,CAC1D/N,IAAWgN,GAGf4D,GAAQ5D,EAAQ,SAASkH,GAAU3U,GAAK,CAEtC,GADAwO,IAAUA,EAAQ,IAAI9C,IAClBlD,GAASmM,EAAQ,EACnB4B,GAAc9V,EAAQgN,EAAQzN,GAAKsW,EAAUD,GAAW9H,EAAYC,CAAK,MAEtE,CACH,IAAIgI,GAAWjI,EACXA,EAAWkI,GAAQhW,EAAQT,EAAG,EAAG2U,GAAW3U,GAAM,GAAKS,EAAQgN,EAAQe,CAAK,EAC5Ehc,EAEAgkB,KAAahkB,IACfgkB,GAAW7B,IAEb1H,GAAiBxM,EAAQT,GAAKwW,EAAQ,CACxC,CACF,EAAG3I,EAAM,CACX,CAiBA,SAAS0I,GAAc9V,EAAQgN,EAAQzN,EAAKsW,EAAUI,EAAWnI,GAAYC,GAAO,CAClF,IAAInB,GAAWoJ,GAAQhW,EAAQT,CAAG,EAC9B2U,GAAW8B,GAAQhJ,EAAQzN,CAAG,EAC9BqP,GAAUb,GAAM,IAAImG,EAAQ,EAEhC,GAAItF,GAAS,CACXpC,GAAiBxM,EAAQT,EAAKqP,EAAO,EACrC,MACF,CACA,IAAImH,GAAWjI,GACXA,GAAWlB,GAAUsH,GAAW3U,EAAM,GAAKS,EAAQgN,EAAQe,EAAK,EAChEhc,EAEA2d,GAAWqG,KAAahkB,EAE5B,GAAI2d,GAAU,CACZ,IAAInH,GAAQd,GAAQyM,EAAQ,EACxBtI,GAAS,CAACrD,IAASsD,GAASqI,EAAQ,EACpCgC,GAAU,CAAC3N,IAAS,CAACqD,IAAUG,GAAamI,EAAQ,EAExD6B,GAAW7B,GACP3L,IAASqD,IAAUsK,GACjBzO,GAAQmF,EAAQ,EAClBmJ,GAAWnJ,GAEJuJ,GAAkBvJ,EAAQ,EACjCmJ,GAAW5N,GAAUyE,EAAQ,EAEtBhB,IACP8D,GAAW,GACXqG,GAAWxH,GAAY2F,GAAU,EAAI,GAE9BgC,IACPxG,GAAW,GACXqG,GAAWK,GAAgBlC,GAAU,EAAI,GAGzC6B,GAAW,CAAC,EAGPM,GAAcnC,EAAQ,GAAKvI,GAAYuI,EAAQ,GACtD6B,GAAWnJ,GACPjB,GAAYiB,EAAQ,EACtBmJ,GAAWO,GAAc1J,EAAQ,GAE1B,CAAC7E,GAAS6E,EAAQ,GAAKoE,GAAWpE,EAAQ,KACjDmJ,GAAWvH,GAAgB0F,EAAQ,IAIrCxE,GAAW,EAEf,CACIA,KAEF3B,GAAM,IAAImG,GAAU6B,EAAQ,EAC5BE,EAAUF,GAAU7B,GAAU2B,EAAU/H,GAAYC,EAAK,EACzDA,GAAM,OAAUmG,EAAQ,GAE1B1H,GAAiBxM,EAAQT,EAAKwW,EAAQ,CACxC,CAUA,SAASQ,GAAQlZ,EAAOkD,EAAG,CACzB,IAAI7C,EAASL,EAAM,OACnB,GAAKK,EAGL,OAAA6C,GAAKA,EAAI,EAAI7C,EAAS,EACfuO,GAAQ1L,EAAG7C,CAAM,EAAIL,EAAMkD,CAAC,EAAIxO,CACzC,CAWA,SAASykB,GAAYnX,EAAYyJ,EAAW2N,EAAQ,CAC9C3N,EAAU,OACZA,EAAYvK,GAASuK,EAAW,SAASvL,GAAU,CACjD,OAAIkK,GAAQlK,EAAQ,EACX,SAASI,GAAO,CACrB,OAAOsT,GAAQtT,GAAOJ,GAAS,SAAW,EAAIA,GAAS,CAAC,EAAIA,EAAQ,CACtE,EAEKA,EACT,CAAC,EAEDuL,EAAY,CAAC6L,EAAQ,EAGvB,IAAIlX,EAAQ,GACZqL,EAAYvK,GAASuK,EAAWlI,GAAU8V,GAAY,CAAC,CAAC,EAExD,IAAIxY,EAASmX,GAAQhW,EAAY,SAAS1B,GAAO4B,GAAKF,GAAY,CAChE,IAAIsX,GAAWpY,GAASuK,EAAW,SAASvL,GAAU,CACpD,OAAOA,GAASI,EAAK,CACvB,CAAC,EACD,MAAO,CAAE,SAAYgZ,GAAU,MAAS,EAAElZ,EAAO,MAASE,EAAM,CAClE,CAAC,EAED,OAAOwC,GAAWjC,EAAQ,SAAS8B,GAAQ2R,GAAO,CAChD,OAAOiF,GAAgB5W,GAAQ2R,GAAO8E,CAAM,CAC9C,CAAC,CACH,CAWA,SAASI,GAAS7W,EAAQsN,EAAO,CAC/B,OAAOwJ,GAAW9W,EAAQsN,EAAO,SAAS3P,EAAOuT,EAAM,CACrD,OAAOyE,GAAM3V,EAAQkR,CAAI,CAC3B,CAAC,CACH,CAWA,SAAS4F,GAAW9W,EAAQsN,EAAOvP,EAAW,CAK5C,QAJIN,EAAQ,GACRC,EAAS4P,EAAM,OACfpP,GAAS,CAAC,EAEP,EAAET,EAAQC,GAAQ,CACvB,IAAIwT,GAAO5D,EAAM7P,CAAK,EAClBE,GAAQsT,GAAQjR,EAAQkR,EAAI,EAE5BnT,EAAUJ,GAAOuT,EAAI,GACvB6F,GAAQ7Y,GAAQiT,GAASD,GAAMlR,CAAM,EAAGrC,EAAK,CAEjD,CACA,OAAOO,EACT,CASA,SAAS8Y,GAAiB9F,EAAM,CAC9B,OAAO,SAASlR,EAAQ,CACtB,OAAOiR,GAAQjR,EAAQkR,CAAI,CAC7B,CACF,CAaA,SAAS+F,GAAY5Z,EAAOoB,EAAQlB,EAAUe,EAAY,CACxD,IAAI4Y,EAAU5Y,EAAauB,GAAkBzB,GACzCX,GAAQ,GACRC,GAASe,EAAO,OAChB4T,GAAOhV,EAQX,IANIA,IAAUoB,IACZA,EAAS0J,GAAU1J,CAAM,GAEvBlB,IACF8U,GAAO9T,GAASlB,EAAOuD,GAAUrD,CAAQ,CAAC,GAErC,EAAEE,GAAQC,IAKf,QAJI+B,GAAY,EACZ9B,GAAQc,EAAOhB,EAAK,EACpB4L,GAAW9L,EAAWA,EAASI,EAAK,EAAIA,IAEpC8B,GAAYyX,EAAQ7E,GAAMhJ,GAAU5J,GAAWnB,CAAU,GAAK,IAChE+T,KAAShV,GACX2H,GAAO,KAAKqN,GAAM5S,GAAW,CAAC,EAEhCuF,GAAO,KAAK3H,EAAOoC,GAAW,CAAC,EAGnC,OAAOpC,CACT,CAWA,SAAS8Z,GAAW9Z,EAAO+Z,EAAS,CAIlC,QAHI1Z,EAASL,EAAQ+Z,EAAQ,OAAS,EAClClN,EAAYxM,EAAS,EAElBA,KAAU,CACf,IAAID,EAAQ2Z,EAAQ1Z,CAAM,EAC1B,GAAIA,GAAUwM,GAAazM,IAAU4Z,GAAU,CAC7C,IAAIA,GAAW5Z,EACXwO,GAAQxO,CAAK,EACfuH,GAAO,KAAK3H,EAAOI,EAAO,CAAC,EAE3B6Z,GAAUja,EAAOI,CAAK,CAE1B,CACF,CACA,OAAOJ,CACT,CAWA,SAAS8O,GAAWuB,EAAOC,EAAO,CAChC,OAAOD,EAAQhI,GAAYU,GAAa,GAAKuH,EAAQD,EAAQ,EAAE,CACjE,CAaA,SAAS6J,GAAU3O,EAAOC,EAAK2O,EAAM9X,EAAW,CAK9C,QAJIjC,EAAQ,GACRC,GAASsI,GAAUP,IAAYoD,EAAMD,IAAU4O,GAAQ,EAAE,EAAG,CAAC,EAC7DtZ,GAASiF,GAAMzF,EAAM,EAElBA,MACLQ,GAAOwB,EAAYhC,GAAS,EAAED,CAAK,EAAImL,EACvCA,GAAS4O,EAEX,OAAOtZ,EACT,CAUA,SAASuZ,GAAWvY,EAAQqB,EAAG,CAC7B,IAAIrC,EAAS,GACb,GAAI,CAACgB,GAAUqB,EAAI,GAAKA,EAAIxM,EAC1B,OAAOmK,EAIT,GACMqC,EAAI,IACNrC,GAAUgB,GAEZqB,EAAImF,GAAYnF,EAAI,CAAC,EACjBA,IACFrB,GAAUA,SAELqB,GAET,OAAOrC,CACT,CAUA,SAASwZ,GAASza,EAAM2L,EAAO,CAC7B,OAAO+O,GAAYC,GAAS3a,EAAM2L,EAAO+L,EAAQ,EAAG1X,EAAO,EAAE,CAC/D,CASA,SAAS4a,GAAWxY,EAAY,CAC9B,OAAO6M,GAAYzN,GAAOY,CAAU,CAAC,CACvC,CAUA,SAASyY,GAAezY,EAAYkB,EAAG,CACrC,IAAIlD,EAAQoB,GAAOY,CAAU,EAC7B,OAAOgN,GAAYhP,EAAOiP,GAAU/L,EAAG,EAAGlD,EAAM,MAAM,CAAC,CACzD,CAYA,SAAS0Z,GAAQ/W,EAAQkR,EAAMvT,EAAOmQ,EAAY,CAChD,GAAI,CAAC/F,GAAS/H,CAAM,EAClB,OAAOA,EAETkR,EAAOC,GAASD,EAAMlR,CAAM,EAO5B,QALIvC,EAAQ,GACRC,GAASwT,EAAK,OACdhH,GAAYxM,GAAS,EACrBqa,GAAS/X,EAEN+X,IAAU,MAAQ,EAAEta,EAAQC,IAAQ,CACzC,IAAI6B,GAAM6R,GAAMF,EAAKzT,CAAK,CAAC,EACvBsY,GAAWpY,EAEf,GAAI4B,KAAQ,aAAeA,KAAQ,eAAiBA,KAAQ,YAC1D,OAAOS,EAGT,GAAIvC,GAASyM,GAAW,CACtB,IAAI0C,GAAWmL,GAAOxY,EAAG,EACzBwW,GAAWjI,EAAaA,EAAWlB,GAAUrN,GAAKwY,EAAM,EAAIhmB,EACxDgkB,KAAahkB,IACfgkB,GAAWhO,GAAS6E,EAAQ,EACxBA,GACCX,GAAQiF,EAAKzT,EAAQ,CAAC,CAAC,EAAI,CAAC,EAAI,CAAC,EAE1C,CACAkP,GAAYoL,GAAQxY,GAAKwW,EAAQ,EACjCgC,GAASA,GAAOxY,EAAG,CACrB,CACA,OAAOS,CACT,CAUA,IAAIgY,GAAepR,GAAqB,SAAS3J,EAAM8E,EAAM,CAC3D,OAAA6E,GAAQ,IAAI3J,EAAM8E,CAAI,EACf9E,CACT,EAH6B0X,GAazBsD,GAAmB7S,GAA4B,SAASnI,EAAMiC,EAAQ,CACxE,OAAOkG,GAAenI,EAAM,WAAY,CACtC,aAAgB,GAChB,WAAc,GACd,MAASib,GAAShZ,CAAM,EACxB,SAAY,EACd,CAAC,CACH,EAPwCyV,GAgBxC,SAASwD,GAAY9Y,EAAY,CAC/B,OAAOgN,GAAY5N,GAAOY,CAAU,CAAC,CACvC,CAWA,SAAS+Y,GAAU/a,EAAOuL,EAAOC,EAAK,CACpC,IAAIpL,EAAQ,GACRC,EAASL,EAAM,OAEfuL,EAAQ,IACVA,EAAQ,CAACA,EAAQlL,EAAS,EAAKA,EAASkL,GAE1CC,EAAMA,EAAMnL,EAASA,EAASmL,EAC1BA,EAAM,IACRA,GAAOnL,GAETA,EAASkL,EAAQC,EAAM,EAAMA,EAAMD,IAAW,EAC9CA,KAAW,EAGX,QADI1K,GAASiF,GAAMzF,CAAM,EAClB,EAAED,EAAQC,GACfQ,GAAOT,CAAK,EAAIJ,EAAMI,EAAQmL,CAAK,EAErC,OAAO1K,EACT,CAWA,SAASma,GAAShZ,EAAYtB,EAAW,CACvC,IAAIG,EAEJ,OAAA4O,GAASzN,EAAY,SAAS1B,EAAOF,EAAO4B,GAAY,CACtD,OAAAnB,EAASH,EAAUJ,EAAOF,EAAO4B,EAAU,EACpC,CAACnB,CACV,CAAC,EACM,CAAC,CAACA,CACX,CAcA,SAASoa,GAAgBjb,EAAOM,EAAO4a,EAAY,CACjD,IAAIC,EAAM,EACNC,EAAOpb,GAAS,KAAOmb,EAAMnb,EAAM,OAEvC,GAAI,OAAOM,GAAS,UAAYA,IAAUA,GAAS8a,GAAQrkB,EAAuB,CAChF,KAAOokB,EAAMC,GAAM,CACjB,IAAIC,GAAOF,EAAMC,IAAU,EACvBpP,GAAWhM,EAAMqb,EAAG,EAEpBrP,KAAa,MAAQ,CAAC8G,GAAS9G,EAAQ,IACtCkP,EAAclP,IAAY1L,EAAU0L,GAAW1L,GAClD6a,EAAME,GAAM,EAEZD,EAAOC,EAEX,CACA,OAAOD,CACT,CACA,OAAOE,GAAkBtb,EAAOM,EAAOgX,GAAU4D,CAAU,CAC7D,CAeA,SAASI,GAAkBtb,EAAOM,EAAOJ,EAAUgb,EAAY,CAC7D,IAAIC,EAAM,EACNC,GAAOpb,GAAS,KAAO,EAAIA,EAAM,OACrC,GAAIob,KAAS,EACX,MAAO,GAGT9a,EAAQJ,EAASI,CAAK,EAMtB,QALIib,GAAWjb,IAAUA,EACrBkb,GAAYlb,IAAU,KACtBmb,GAAc3I,GAASxS,CAAK,EAC5Bob,GAAiBpb,IAAU5L,EAExBymB,EAAMC,IAAM,CACjB,IAAIC,GAAMhT,IAAa8S,EAAMC,IAAQ,CAAC,EAClCpP,GAAW9L,EAASF,EAAMqb,EAAG,CAAC,EAC9BM,GAAe3P,KAAatX,EAC5BknB,GAAY5P,KAAa,KACzB6P,GAAiB7P,KAAaA,GAC9B8P,GAAchJ,GAAS9G,EAAQ,EAEnC,GAAIuP,GACF,IAAIQ,GAASb,GAAcW,QAClBH,GACTK,GAASF,KAAmBX,GAAcS,IACjCH,GACTO,GAASF,IAAkBF,KAAiBT,GAAc,CAACU,IAClDH,GACTM,GAASF,IAAkBF,IAAgB,CAACC,KAAcV,GAAc,CAACY,IAChEF,IAAaE,GACtBC,GAAS,GAETA,GAASb,EAAclP,IAAY1L,EAAU0L,GAAW1L,EAEtDyb,GACFZ,EAAME,GAAM,EAEZD,GAAOC,EAEX,CACA,OAAOzS,GAAUwS,GAAMtkB,CAAe,CACxC,CAWA,SAASklB,GAAehc,EAAOE,EAAU,CAMvC,QALIE,EAAQ,GACRC,EAASL,EAAM,OACfY,EAAW,EACXC,GAAS,CAAC,EAEP,EAAET,EAAQC,GAAQ,CACvB,IAAIC,GAAQN,EAAMI,CAAK,EACnB4L,GAAW9L,EAAWA,EAASI,EAAK,EAAIA,GAE5C,GAAI,CAACF,GAAS,CAACgP,GAAGpD,GAAUgJ,EAAI,EAAG,CACjC,IAAIA,GAAOhJ,GACXnL,GAAOD,GAAU,EAAIN,KAAU,EAAI,EAAIA,EACzC,CACF,CACA,OAAOO,EACT,CAUA,SAASob,GAAa3b,EAAO,CAC3B,OAAI,OAAOA,GAAS,SACXA,EAELwS,GAASxS,CAAK,EACT1J,EAEF,CAAC0J,CACV,CAUA,SAAS4b,GAAa5b,EAAO,CAE3B,GAAI,OAAOA,GAAS,SAClB,OAAOA,EAET,GAAI8J,GAAQ9J,CAAK,EAEf,OAAOY,GAASZ,EAAO4b,EAAY,EAAI,GAEzC,GAAIpJ,GAASxS,CAAK,EAChB,OAAO2J,GAAiBA,GAAe,KAAK3J,CAAK,EAAI,GAEvD,IAAIO,EAAUP,EAAQ,GACtB,OAAQO,GAAU,KAAQ,EAAIP,GAAU,CAAC7J,EAAY,KAAOoK,CAC9D,CAWA,SAASsb,GAASnc,EAAOE,EAAUe,EAAY,CAC7C,IAAIb,EAAQ,GACRgS,EAAWtR,GACXT,GAASL,EAAM,OACfqS,GAAW,GACXxR,GAAS,CAAC,EACVmU,GAAOnU,GAEX,GAAII,EACFoR,GAAW,GACXD,EAAWpR,WAEJX,IAAUzL,EAAkB,CACnC,IAAIsQ,GAAMhF,EAAW,KAAOkc,GAAUpc,CAAK,EAC3C,GAAIkF,GACF,OAAOD,GAAWC,EAAG,EAEvBmN,GAAW,GACXD,EAAW3O,GACXuR,GAAO,IAAIvH,EACb,MAEEuH,GAAO9U,EAAW,CAAC,EAAIW,GAEzBgL,EACA,KAAO,EAAEzL,EAAQC,IAAQ,CACvB,IAAIC,GAAQN,EAAMI,CAAK,EACnB4L,GAAW9L,EAAWA,EAASI,EAAK,EAAIA,GAG5C,GADAA,GAASW,GAAcX,KAAU,EAAKA,GAAQ,EAC1C+R,IAAYrG,KAAaA,GAAU,CAErC,QADIqQ,GAAYrH,GAAK,OACdqH,MACL,GAAIrH,GAAKqH,EAAS,IAAMrQ,GACtB,SAASH,EAGT3L,GACF8U,GAAK,KAAKhJ,EAAQ,EAEpBnL,GAAO,KAAKP,EAAK,CACnB,MACU8R,EAAS4C,GAAMhJ,GAAU/K,CAAU,IACvC+T,KAASnU,IACXmU,GAAK,KAAKhJ,EAAQ,EAEpBnL,GAAO,KAAKP,EAAK,EAErB,CACA,OAAOO,EACT,CAUA,SAASoZ,GAAUtX,EAAQkR,EAAM,CAC/BA,EAAOC,GAASD,EAAMlR,CAAM,EAG5B,IAAIvC,EAAQ,GACRC,EAASwT,EAAK,OAElB,GAAI,CAACxT,EACH,MAAO,GAKT,QAFIic,EAAkB3Z,GAAU,MAAS,OAAOA,GAAW,UAAY,OAAOA,GAAW,WAElF,EAAEvC,EAAQC,GAAQ,CACvB,IAAI6B,GAAM2R,EAAKzT,CAAK,EAGpB,GAAI,OAAO8B,IAAQ,SAKnB,IAAIA,KAAQ,aAAe,CAAC0E,GAAe,KAAKjE,EAAQ,WAAW,EACjE,MAAO,GAIT,GAAIT,KAAQ,eACP9B,EAAQ,EAAKC,GACd,OAAOwT,EAAKzT,EAAQ,CAAC,GAAM,UAC3ByT,EAAKzT,EAAQ,CAAC,IAAM,YAAa,CAGnC,GAAIkc,GAAmBlc,IAAU,EAC/B,SAGF,MAAO,EACT,EACF,CAEA,IAAImc,GAAMpH,GAAOxS,EAAQkR,CAAI,EAC7B,OAAO0I,IAAO,MAAQ,OAAOA,GAAIxI,GAAMqB,GAAKvB,CAAI,CAAC,CAAC,CACpD,CAYA,SAAS2I,GAAW7Z,EAAQkR,EAAM4I,EAAShM,EAAY,CACrD,OAAOiJ,GAAQ/W,EAAQkR,EAAM4I,EAAQ7I,GAAQjR,EAAQkR,CAAI,CAAC,EAAGpD,CAAU,CACzE,CAaA,SAASiM,GAAU1c,EAAOU,EAAWic,EAAQta,EAAW,CAItD,QAHIhC,EAASL,EAAM,OACfI,GAAQiC,EAAYhC,EAAS,IAEzBgC,EAAYjC,KAAU,EAAEA,GAAQC,IACtCK,EAAUV,EAAMI,EAAK,EAAGA,GAAOJ,CAAK,GAAG,CAEzC,OAAO2c,EACH5B,GAAU/a,EAAQqC,EAAY,EAAIjC,GAASiC,EAAYjC,GAAQ,EAAIC,CAAO,EAC1E0a,GAAU/a,EAAQqC,EAAYjC,GAAQ,EAAI,EAAKiC,EAAYhC,EAASD,EAAM,CAChF,CAYA,SAASwL,GAAiBtL,EAAOsc,EAAS,CACxC,IAAI/b,EAASP,EACb,OAAIO,aAAkBwJ,KACpBxJ,EAASA,EAAO,MAAM,GAEjBS,GAAYsb,EAAS,SAAS/b,EAAQgc,EAAQ,CACnD,OAAOA,EAAO,KAAK,MAAMA,EAAO,QAAS1b,GAAU,CAACN,CAAM,EAAGgc,EAAO,IAAI,CAAC,CAC3E,EAAGhc,CAAM,CACX,CAYA,SAASic,GAAQnI,EAAQzU,EAAUe,EAAY,CAC7C,IAAIZ,EAASsU,EAAO,OACpB,GAAItU,EAAS,EACX,OAAOA,EAAS8b,GAASxH,EAAO,CAAC,CAAC,EAAI,CAAC,EAKzC,QAHIvU,EAAQ,GACRS,GAASiF,GAAMzF,CAAM,EAElB,EAAED,EAAQC,GAIf,QAHIL,GAAQ2U,EAAOvU,CAAK,EACpByU,GAAW,GAER,EAAEA,GAAWxU,GACdwU,IAAYzU,IACdS,GAAOT,CAAK,EAAI+R,GAAetR,GAAOT,CAAK,GAAKJ,GAAO2U,EAAOE,EAAQ,EAAG3U,EAAUe,CAAU,GAInG,OAAOkb,GAAShJ,GAAYtS,GAAQ,CAAC,EAAGX,EAAUe,CAAU,CAC9D,CAWA,SAAS8b,GAAc3Z,EAAOhC,EAAQ4b,EAAY,CAMhD,QALI5c,EAAQ,GACRC,EAAS+C,EAAM,OACf6Z,GAAa7b,EAAO,OACpBP,GAAS,CAAC,EAEP,EAAET,EAAQC,GAAQ,CACvB,IAAIC,GAAQF,EAAQ6c,GAAa7b,EAAOhB,CAAK,EAAI1L,EACjDsoB,EAAWnc,GAAQuC,EAAMhD,CAAK,EAAGE,EAAK,CACxC,CACA,OAAOO,EACT,CASA,SAASqc,GAAoB5c,EAAO,CAClC,OAAOwY,GAAkBxY,CAAK,EAAIA,EAAQ,CAAC,CAC7C,CASA,SAAS6c,GAAa7c,EAAO,CAC3B,OAAO,OAAOA,GAAS,WAAaA,EAAQgX,EAC9C,CAUA,SAASxD,GAASxT,EAAOqC,EAAQ,CAC/B,OAAIyH,GAAQ9J,CAAK,EACRA,EAEF8X,GAAM9X,EAAOqC,CAAM,EAAI,CAACrC,CAAK,EAAI8c,GAAaC,GAAS/c,CAAK,CAAC,CACtE,CAWA,IAAIgd,GAAWjD,GAWf,SAASkD,GAAUvd,EAAOuL,EAAOC,EAAK,CACpC,IAAInL,EAASL,EAAM,OACnB,OAAAwL,EAAMA,IAAQ9W,EAAY2L,EAASmL,EAC3B,CAACD,GAASC,GAAOnL,EAAUL,EAAQ+a,GAAU/a,EAAOuL,EAAOC,CAAG,CACxE,CAQA,IAAIgS,GAAevV,IAAmB,SAASwV,EAAI,CACjD,OAAO3e,GAAK,aAAa2e,CAAE,CAC7B,EAUA,SAASvM,GAAYwM,EAAQ/M,EAAQ,CACnC,GAAIA,EACF,OAAO+M,EAAO,MAAM,EAEtB,IAAIrd,EAASqd,EAAO,OAChB7c,EAAS0G,GAAcA,GAAYlH,CAAM,EAAI,IAAIqd,EAAO,YAAYrd,CAAM,EAE9E,OAAAqd,EAAO,KAAK7c,CAAM,EACXA,CACT,CASA,SAAS8c,GAAiBC,EAAa,CACrC,IAAI/c,EAAS,IAAI+c,EAAY,YAAYA,EAAY,UAAU,EAC/D,WAAItW,GAAWzG,CAAM,EAAE,IAAI,IAAIyG,GAAWsW,CAAW,CAAC,EAC/C/c,CACT,CAUA,SAASgd,GAAcC,EAAUnN,EAAQ,CACvC,IAAI+M,EAAS/M,EAASgN,GAAiBG,EAAS,MAAM,EAAIA,EAAS,OACnE,OAAO,IAAIA,EAAS,YAAYJ,EAAQI,EAAS,WAAYA,EAAS,UAAU,CAClF,CASA,SAASC,GAAYC,EAAQ,CAC3B,IAAInd,EAAS,IAAImd,EAAO,YAAYA,EAAO,OAAQtjB,GAAQ,KAAKsjB,CAAM,CAAC,EACvE,OAAAnd,EAAO,UAAYmd,EAAO,UACnBnd,CACT,CASA,SAASod,GAAYC,EAAQ,CAC3B,OAAOlU,GAAgB7D,GAAO6D,GAAc,KAAKkU,CAAM,CAAC,EAAI,CAAC,CAC/D,CAUA,SAASnF,GAAgBoF,EAAYxN,EAAQ,CAC3C,IAAI+M,EAAS/M,EAASgN,GAAiBQ,EAAW,MAAM,EAAIA,EAAW,OACvE,OAAO,IAAIA,EAAW,YAAYT,EAAQS,EAAW,WAAYA,EAAW,MAAM,CACpF,CAUA,SAASC,GAAiB9d,EAAOgU,EAAO,CACtC,GAAIhU,IAAUgU,EAAO,CACnB,IAAI+J,EAAe/d,IAAU5L,EACzB8mB,EAAYlb,IAAU,KACtBge,EAAiBhe,IAAUA,EAC3Bmb,GAAc3I,GAASxS,CAAK,EAE5Bqb,GAAerH,IAAU5f,EACzBknB,GAAYtH,IAAU,KACtBuH,GAAiBvH,IAAUA,EAC3BwH,GAAchJ,GAASwB,CAAK,EAEhC,GAAK,CAACsH,IAAa,CAACE,IAAe,CAACL,IAAenb,EAAQgU,GACtDmH,IAAeE,IAAgBE,IAAkB,CAACD,IAAa,CAACE,IAChEN,GAAaG,IAAgBE,IAC7B,CAACwC,GAAgBxC,IAClB,CAACyC,EACH,MAAO,GAET,GAAK,CAAC9C,GAAa,CAACC,IAAe,CAACK,IAAexb,EAAQgU,GACtDwH,IAAeuC,GAAgBC,GAAkB,CAAC9C,GAAa,CAACC,IAChEG,IAAayC,GAAgBC,GAC7B,CAAC3C,IAAgB2C,GAClB,CAACzC,GACH,MAAO,EAEX,CACA,MAAO,EACT,CAgBA,SAAStC,GAAgB5W,EAAQ2R,EAAO8E,EAAQ,CAO9C,QANIhZ,EAAQ,GACRme,EAAc5b,EAAO,SACrB6b,GAAclK,EAAM,SACpBjU,GAASke,EAAY,OACrBE,GAAerF,EAAO,OAEnB,EAAEhZ,EAAQC,IAAQ,CACvB,IAAIQ,GAASud,GAAiBG,EAAYne,CAAK,EAAGoe,GAAYpe,CAAK,CAAC,EACpE,GAAIS,GAAQ,CACV,GAAIT,GAASqe,GACX,OAAO5d,GAET,IAAI6d,GAAQtF,EAAOhZ,CAAK,EACxB,OAAOS,IAAU6d,IAAS,OAAS,GAAK,EAC1C,CACF,CAQA,OAAO/b,EAAO,MAAQ2R,EAAM,KAC9B,CAaA,SAASqK,GAAY7e,EAAM8e,EAAUC,EAASC,EAAW,CAUvD,QATIC,EAAY,GACZC,GAAalf,EAAK,OAClBmf,GAAgBJ,EAAQ,OACxBK,GAAY,GACZC,GAAaP,EAAS,OACtBQ,GAAczW,GAAUqW,GAAaC,GAAe,CAAC,EACrDpe,GAASiF,GAAMqZ,GAAaC,EAAW,EACvCC,GAAc,CAACP,EAEZ,EAAEI,GAAYC,IACnBte,GAAOqe,EAAS,EAAIN,EAASM,EAAS,EAExC,KAAO,EAAEH,EAAYE,KACfI,IAAeN,EAAYC,MAC7Bne,GAAOge,EAAQE,CAAS,CAAC,EAAIjf,EAAKif,CAAS,GAG/C,KAAOK,MACLve,GAAOqe,IAAW,EAAIpf,EAAKif,GAAW,EAExC,OAAOle,EACT,CAaA,SAASye,GAAiBxf,EAAM8e,EAAUC,EAASC,EAAW,CAW5D,QAVIC,EAAY,GACZC,GAAalf,EAAK,OAClByf,GAAe,GACfN,GAAgBJ,EAAQ,OACxBW,GAAa,GACbC,GAAcb,EAAS,OACvBQ,GAAczW,GAAUqW,GAAaC,GAAe,CAAC,EACrDpe,GAASiF,GAAMsZ,GAAcK,EAAW,EACxCJ,GAAc,CAACP,EAEZ,EAAEC,EAAYK,IACnBve,GAAOke,CAAS,EAAIjf,EAAKif,CAAS,EAGpC,QADI1d,GAAS0d,EACN,EAAES,GAAaC,IACpB5e,GAAOQ,GAASme,EAAU,EAAIZ,EAASY,EAAU,EAEnD,KAAO,EAAED,GAAeN,KAClBI,IAAeN,EAAYC,MAC7Bne,GAAOQ,GAASwd,EAAQU,EAAY,CAAC,EAAIzf,EAAKif,GAAW,GAG7D,OAAOle,EACT,CAUA,SAASiK,GAAU6E,EAAQ3P,EAAO,CAChC,IAAII,EAAQ,GACRC,EAASsP,EAAO,OAGpB,IADA3P,IAAUA,EAAQ8F,GAAMzF,CAAM,GACvB,EAAED,EAAQC,GACfL,EAAMI,CAAK,EAAIuP,EAAOvP,CAAK,EAE7B,OAAOJ,CACT,CAYA,SAAS4P,GAAWD,EAAQvM,EAAOT,EAAQ8N,EAAY,CACrD,IAAIiP,EAAQ,CAAC/c,EACbA,IAAWA,EAAS,CAAC,GAKrB,QAHIvC,GAAQ,GACRC,GAAS+C,EAAM,OAEZ,EAAEhD,GAAQC,IAAQ,CACvB,IAAI6B,GAAMkB,EAAMhD,EAAK,EAEjBsY,GAAWjI,EACXA,EAAW9N,EAAOT,EAAG,EAAGyN,EAAOzN,EAAG,EAAGA,GAAKS,EAAQgN,CAAM,EACxDjb,EAEAgkB,KAAahkB,IACfgkB,GAAW/I,EAAOzN,EAAG,GAEnBwd,EACFrQ,GAAgB1M,EAAQT,GAAKwW,EAAQ,EAErCpJ,GAAY3M,EAAQT,GAAKwW,EAAQ,CAErC,CACA,OAAO/V,CACT,CAUA,SAAS0O,GAAY1B,EAAQhN,EAAQ,CACnC,OAAOiN,GAAWD,EAAQgQ,GAAWhQ,CAAM,EAAGhN,CAAM,CACtD,CAUA,SAASyO,GAAczB,EAAQhN,EAAQ,CACrC,OAAOiN,GAAWD,EAAQiQ,GAAajQ,CAAM,EAAGhN,CAAM,CACxD,CAUA,SAASkd,GAAiB5f,EAAQ6f,EAAa,CAC7C,OAAO,SAAS9d,EAAY9B,EAAU,CACpC,IAAIN,EAAOwK,GAAQpI,CAAU,EAAIjC,GAAkByP,GAC/CrP,GAAc2f,EAAcA,EAAY,EAAI,CAAC,EAEjD,OAAOlgB,EAAKoC,EAAY/B,EAAQoZ,GAAYnZ,EAAU,CAAC,EAAGC,EAAW,CACvE,CACF,CASA,SAAS4f,GAAeC,EAAU,CAChC,OAAO3F,GAAS,SAAS1X,EAAQsd,EAAS,CACxC,IAAI7f,EAAQ,GACRC,EAAS4f,EAAQ,OACjBxP,GAAapQ,EAAS,EAAI4f,EAAQ5f,EAAS,CAAC,EAAI3L,EAChDwrB,GAAQ7f,EAAS,EAAI4f,EAAQ,CAAC,EAAIvrB,EAWtC,IATA+b,GAAcuP,EAAS,OAAS,GAAK,OAAOvP,IAAc,YACrDpQ,IAAUoQ,IACX/b,EAEAwrB,IAASC,GAAeF,EAAQ,CAAC,EAAGA,EAAQ,CAAC,EAAGC,EAAK,IACvDzP,GAAapQ,EAAS,EAAI3L,EAAY+b,GACtCpQ,EAAS,GAEXsC,EAASwD,GAAOxD,CAAM,EACf,EAAEvC,EAAQC,GAAQ,CACvB,IAAIsP,GAASsQ,EAAQ7f,CAAK,EACtBuP,IACFqQ,EAASrd,EAAQgN,GAAQvP,EAAOqQ,EAAU,CAE9C,CACA,OAAO9N,CACT,CAAC,CACH,CAUA,SAAS6P,GAAevQ,EAAUI,EAAW,CAC3C,OAAO,SAASL,EAAY9B,EAAU,CACpC,GAAI8B,GAAc,KAChB,OAAOA,EAET,GAAI,CAACiW,GAAYjW,CAAU,EACzB,OAAOC,EAASD,EAAY9B,CAAQ,EAMtC,QAJIG,EAAS2B,EAAW,OACpB5B,GAAQiC,EAAYhC,EAAS,GAC7B+f,GAAWja,GAAOnE,CAAU,GAExBK,EAAYjC,KAAU,EAAEA,GAAQC,IAClCH,EAASkgB,GAAShgB,EAAK,EAAGA,GAAOggB,EAAQ,IAAM,IAAnD,CAIF,OAAOpe,CACT,CACF,CASA,SAASwR,GAAcnR,EAAW,CAChC,OAAO,SAASM,EAAQzC,EAAUyR,EAAU,CAM1C,QALIvR,EAAQ,GACRggB,GAAWja,GAAOxD,CAAM,EACxBS,GAAQuO,EAAShP,CAAM,EACvBtC,GAAS+C,GAAM,OAEZ/C,MAAU,CACf,IAAI6B,GAAMkB,GAAMf,EAAYhC,GAAS,EAAED,CAAK,EAC5C,GAAIF,EAASkgB,GAASle,EAAG,EAAGA,GAAKke,EAAQ,IAAM,GAC7C,KAEJ,CACA,OAAOzd,CACT,CACF,CAYA,SAAS0d,GAAWzgB,EAAM4Q,EAAS3Q,EAAS,CAC1C,IAAIygB,EAAS9P,EAAUhb,EACnB+qB,EAAOC,GAAW5gB,CAAI,EAE1B,SAAS6gB,IAAU,CACjB,IAAIC,GAAM,MAAQ,OAAS5hB,IAAQ,gBAAgB2hB,GAAWF,EAAO3gB,EACrE,OAAO8gB,GAAG,MAAMJ,EAASzgB,EAAU,KAAM,SAAS,CACpD,CACA,OAAO4gB,EACT,CASA,SAASE,GAAgBC,EAAY,CACnC,OAAO,SAAS/e,EAAQ,CACtBA,EAASwb,GAASxb,CAAM,EAExB,IAAI+B,EAAaU,GAAWzC,CAAM,EAC9B0D,GAAc1D,CAAM,EACpBnN,EAEA0P,EAAMR,EACNA,EAAW,CAAC,EACZ/B,EAAO,OAAO,CAAC,EAEfgf,EAAWjd,EACX2Z,GAAU3Z,EAAY,CAAC,EAAE,KAAK,EAAE,EAChC/B,EAAO,MAAM,CAAC,EAElB,OAAOuC,EAAIwc,CAAU,EAAE,EAAIC,CAC7B,CACF,CASA,SAASC,GAAiBC,EAAU,CAClC,OAAO,SAASlf,EAAQ,CACtB,OAAOP,GAAY0f,GAAMC,GAAOpf,CAAM,EAAE,QAAQjE,GAAQ,EAAE,CAAC,EAAGmjB,EAAU,EAAE,CAC5E,CACF,CAUA,SAASP,GAAWD,EAAM,CACxB,OAAO,UAAW,CAIhB,IAAIzgB,EAAO,UACX,OAAQA,EAAK,OAAQ,CACnB,IAAK,GAAG,OAAO,IAAIygB,EACnB,IAAK,GAAG,OAAO,IAAIA,EAAKzgB,EAAK,CAAC,CAAC,EAC/B,IAAK,GAAG,OAAO,IAAIygB,EAAKzgB,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,EACxC,IAAK,GAAG,OAAO,IAAIygB,EAAKzgB,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,EACjD,IAAK,GAAG,OAAO,IAAIygB,EAAKzgB,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,EAC1D,IAAK,GAAG,OAAO,IAAIygB,EAAKzgB,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,EACnE,IAAK,GAAG,OAAO,IAAIygB,EAAKzgB,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,EAC5E,IAAK,GAAG,OAAO,IAAIygB,EAAKzgB,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,CACvF,CACA,IAAIohB,EAAc1W,GAAW+V,EAAK,SAAS,EACvC1f,EAAS0f,EAAK,MAAMW,EAAaphB,CAAI,EAIzC,OAAO4K,GAAS7J,CAAM,EAAIA,EAASqgB,CACrC,CACF,CAWA,SAASC,GAAYvhB,EAAM4Q,EAAS4Q,EAAO,CACzC,IAAIb,EAAOC,GAAW5gB,CAAI,EAE1B,SAAS6gB,GAAU,CAMjB,QALIpgB,GAAS,UAAU,OACnBP,GAAOgG,GAAMzF,EAAM,EACnBD,GAAQC,GACR2D,GAAcqd,GAAUZ,CAAO,EAE5BrgB,MACLN,GAAKM,EAAK,EAAI,UAAUA,EAAK,EAE/B,IAAIye,GAAWxe,GAAS,GAAKP,GAAK,CAAC,IAAMkE,IAAelE,GAAKO,GAAS,CAAC,IAAM2D,GACzE,CAAC,EACDgB,GAAelF,GAAMkE,EAAW,EAGpC,GADA3D,IAAUwe,GAAQ,OACdxe,GAAS+gB,EACX,OAAOE,GACL1hB,EAAM4Q,EAAS+Q,GAAcd,EAAQ,YAAa/rB,EAClDoL,GAAM+e,GAASnqB,EAAWA,EAAW0sB,EAAQ/gB,EAAM,EAEvD,IAAIqgB,GAAM,MAAQ,OAAS5hB,IAAQ,gBAAgB2hB,EAAWF,EAAO3gB,EACrE,OAAOD,GAAM+gB,GAAI,KAAM5gB,EAAI,CAC7B,CACA,OAAO2gB,CACT,CASA,SAASe,GAAWC,EAAe,CACjC,OAAO,SAASzf,EAAYtB,EAAW0B,EAAW,CAChD,IAAIge,EAAWja,GAAOnE,CAAU,EAChC,GAAI,CAACiW,GAAYjW,CAAU,EAAG,CAC5B,IAAI9B,GAAWmZ,GAAY3Y,EAAW,CAAC,EACvCsB,EAAa6N,GAAK7N,CAAU,EAC5BtB,EAAY,SAASwB,GAAK,CAAE,OAAOhC,GAASkgB,EAASle,EAAG,EAAGA,GAAKke,CAAQ,CAAG,CAC7E,CACA,IAAIhgB,GAAQqhB,EAAczf,EAAYtB,EAAW0B,CAAS,EAC1D,OAAOhC,GAAQ,GAAKggB,EAASlgB,GAAW8B,EAAW5B,EAAK,EAAIA,EAAK,EAAI1L,CACvE,CACF,CASA,SAASgtB,GAAWrf,EAAW,CAC7B,OAAOsf,GAAS,SAASC,EAAO,CAC9B,IAAIvhB,EAASuhB,EAAM,OACfxhB,EAAQC,EACRwhB,EAASvX,GAAc,UAAU,KAKrC,IAHIjI,GACFuf,EAAM,QAAQ,EAETxhB,KAAS,CACd,IAAIR,GAAOgiB,EAAMxhB,CAAK,EACtB,GAAI,OAAOR,IAAQ,WACjB,MAAM,IAAI0G,GAAUxR,CAAe,EAErC,GAAI+sB,GAAU,CAACpB,IAAWqB,GAAYliB,EAAI,GAAK,UAC7C,IAAI6gB,GAAU,IAAInW,GAAc,CAAC,EAAG,EAAI,CAE5C,CAEA,IADAlK,EAAQqgB,GAAUrgB,EAAQC,EACnB,EAAED,EAAQC,GAAQ,CACvBT,GAAOgiB,EAAMxhB,CAAK,EAElB,IAAI2hB,GAAWD,GAAYliB,EAAI,EAC3B8E,GAAOqd,IAAY,UAAYC,GAAQpiB,EAAI,EAAIlL,EAE/CgQ,IAAQud,GAAWvd,GAAK,CAAC,CAAC,GACxBA,GAAK,CAAC,IAAM3O,EAAgBJ,EAAkBE,EAAoBG,IAClE,CAAC0O,GAAK,CAAC,EAAE,QAAUA,GAAK,CAAC,GAAK,EAElC+b,GAAUA,GAAQqB,GAAYpd,GAAK,CAAC,CAAC,CAAC,EAAE,MAAM+b,GAAS/b,GAAK,CAAC,CAAC,EAE9D+b,GAAW7gB,GAAK,QAAU,GAAKqiB,GAAWriB,EAAI,EAC1C6gB,GAAQsB,EAAQ,EAAE,EAClBtB,GAAQ,KAAK7gB,EAAI,CAEzB,CACA,OAAO,UAAW,CAChB,IAAIE,GAAO,UACPQ,GAAQR,GAAK,CAAC,EAElB,GAAI2gB,IAAW3gB,GAAK,QAAU,GAAKsK,GAAQ9J,EAAK,EAC9C,OAAOmgB,GAAQ,MAAMngB,EAAK,EAAE,MAAM,EAKpC,QAHIF,GAAQ,EACRS,GAASR,EAASuhB,EAAMxhB,EAAK,EAAE,MAAM,KAAMN,EAAI,EAAIQ,GAEhD,EAAEF,GAAQC,GACfQ,GAAS+gB,EAAMxhB,EAAK,EAAE,KAAK,KAAMS,EAAM,EAEzC,OAAOA,EACT,CACF,CAAC,CACH,CAqBA,SAAS0gB,GAAa3hB,EAAM4Q,EAAS3Q,EAAS+e,EAAUC,EAASqD,GAAeC,GAAcC,GAAQC,GAAKjB,GAAO,CAChH,IAAIkB,GAAQ9R,EAAUza,EAClBuqB,GAAS9P,EAAUhb,EACnB+sB,GAAY/R,EAAU/a,EACtBqpB,GAAYtO,GAAW7a,EAAkBC,GACzC4sB,GAAShS,EAAUva,EACnBsqB,GAAOgC,GAAY7tB,EAAY8rB,GAAW5gB,CAAI,EAElD,SAAS6gB,IAAU,CAKjB,QAJIpgB,GAAS,UAAU,OACnBP,GAAOgG,GAAMzF,EAAM,EACnBD,GAAQC,GAELD,MACLN,GAAKM,EAAK,EAAI,UAAUA,EAAK,EAE/B,GAAI0e,GACF,IAAI9a,GAAcqd,GAAUZ,EAAO,EAC/BgC,GAAe1e,GAAajE,GAAMkE,EAAW,EASnD,GAPI4a,IACF9e,GAAO6e,GAAY7e,GAAM8e,EAAUC,EAASC,EAAS,GAEnDoD,KACFpiB,GAAOwf,GAAiBxf,GAAMoiB,GAAeC,GAAcrD,EAAS,GAEtEze,IAAUoiB,GACN3D,IAAaze,GAAS+gB,GAAO,CAC/B,IAAIsB,GAAa1d,GAAelF,GAAMkE,EAAW,EACjD,OAAOsd,GACL1hB,EAAM4Q,EAAS+Q,GAAcd,GAAQ,YAAa5gB,EAClDC,GAAM4iB,GAAYN,GAAQC,GAAKjB,GAAQ/gB,EACzC,CACF,CACA,IAAI6gB,GAAcZ,GAASzgB,EAAU,KACjC6gB,GAAK6B,GAAYrB,GAAYthB,CAAI,EAAIA,EAEzC,OAAAS,GAASP,GAAK,OACVsiB,GACFtiB,GAAO6iB,GAAQ7iB,GAAMsiB,EAAM,EAClBI,IAAUniB,GAAS,GAC5BP,GAAK,QAAQ,EAEXwiB,IAASD,GAAMhiB,KACjBP,GAAK,OAASuiB,IAEZ,MAAQ,OAASvjB,IAAQ,gBAAgB2hB,KAC3CC,GAAKH,IAAQC,GAAWE,EAAE,GAErBA,GAAG,MAAMQ,GAAaphB,EAAI,CACnC,CACA,OAAO2gB,EACT,CAUA,SAASmC,GAAe3iB,EAAQ4iB,EAAY,CAC1C,OAAO,SAASlgB,EAAQzC,EAAU,CAChC,OAAO+U,GAAatS,EAAQ1C,EAAQ4iB,EAAW3iB,CAAQ,EAAG,CAAC,CAAC,CAC9D,CACF,CAUA,SAAS4iB,GAAoBC,EAAUC,EAAc,CACnD,OAAO,SAAS1iB,EAAOgU,EAAO,CAC5B,IAAIzT,EACJ,GAAIP,IAAU5L,GAAa4f,IAAU5f,EACnC,OAAOsuB,EAKT,GAHI1iB,IAAU5L,IACZmM,EAASP,GAEPgU,IAAU5f,EAAW,CACvB,GAAImM,IAAWnM,EACb,OAAO4f,EAEL,OAAOhU,GAAS,UAAY,OAAOgU,GAAS,UAC9ChU,EAAQ4b,GAAa5b,CAAK,EAC1BgU,EAAQ4H,GAAa5H,CAAK,IAE1BhU,EAAQ2b,GAAa3b,CAAK,EAC1BgU,EAAQ2H,GAAa3H,CAAK,GAE5BzT,EAASkiB,EAASziB,EAAOgU,CAAK,CAChC,CACA,OAAOzT,CACT,CACF,CASA,SAASoiB,GAAWC,EAAW,CAC7B,OAAOvB,GAAS,SAASlW,EAAW,CAClC,OAAAA,EAAYvK,GAASuK,EAAWlI,GAAU8V,GAAY,CAAC,CAAC,EACjDgB,GAAS,SAASva,EAAM,CAC7B,IAAID,EAAU,KACd,OAAOqjB,EAAUzX,EAAW,SAASvL,EAAU,CAC7C,OAAOP,GAAMO,EAAUL,EAASC,CAAI,CACtC,CAAC,CACH,CAAC,CACH,CAAC,CACH,CAWA,SAASqjB,GAAc9iB,EAAQ+iB,EAAO,CACpCA,EAAQA,IAAU1uB,EAAY,IAAMwnB,GAAakH,CAAK,EAEtD,IAAIC,EAAcD,EAAM,OACxB,GAAIC,EAAc,EAChB,OAAOA,EAAcjJ,GAAWgJ,EAAO/iB,CAAM,EAAI+iB,EAEnD,IAAIviB,EAASuZ,GAAWgJ,EAAOhb,GAAW/H,EAASgF,GAAW+d,CAAK,CAAC,CAAC,EACrE,OAAO9e,GAAW8e,CAAK,EACnB7F,GAAUhY,GAAc1E,CAAM,EAAG,EAAGR,CAAM,EAAE,KAAK,EAAE,EACnDQ,EAAO,MAAM,EAAGR,CAAM,CAC5B,CAcA,SAASijB,GAAc1jB,EAAM4Q,EAAS3Q,EAAS+e,EAAU,CACvD,IAAI0B,EAAS9P,EAAUhb,EACnB+qB,GAAOC,GAAW5gB,CAAI,EAE1B,SAAS6gB,IAAU,CAQjB,QAPI1B,GAAY,GACZC,GAAa,UAAU,OACvBE,GAAY,GACZC,GAAaP,EAAS,OACtB9e,GAAOgG,GAAMqZ,GAAaH,EAAU,EACpC0B,GAAM,MAAQ,OAAS5hB,IAAQ,gBAAgB2hB,GAAWF,GAAO3gB,EAE9D,EAAEsf,GAAYC,IACnBrf,GAAKof,EAAS,EAAIN,EAASM,EAAS,EAEtC,KAAOF,MACLlf,GAAKof,IAAW,EAAI,UAAU,EAAEH,EAAS,EAE3C,OAAOpf,GAAM+gB,GAAIJ,EAASzgB,EAAU,KAAMC,EAAI,CAChD,CACA,OAAO2gB,EACT,CASA,SAAS8C,GAAYlhB,EAAW,CAC9B,OAAO,SAASkJ,EAAOC,EAAK2O,EAAM,CAChC,OAAIA,GAAQ,OAAOA,GAAQ,UAAYgG,GAAe5U,EAAOC,EAAK2O,CAAI,IACpE3O,EAAM2O,EAAOzlB,GAGf6W,EAAQiY,GAASjY,CAAK,EAClBC,IAAQ9W,GACV8W,EAAMD,EACNA,EAAQ,GAERC,EAAMgY,GAAShY,CAAG,EAEpB2O,EAAOA,IAASzlB,EAAa6W,EAAQC,EAAM,EAAI,GAAMgY,GAASrJ,CAAI,EAC3DD,GAAU3O,EAAOC,EAAK2O,EAAM9X,CAAS,CAC9C,CACF,CASA,SAASohB,GAA0BV,EAAU,CAC3C,OAAO,SAASziB,EAAOgU,EAAO,CAC5B,OAAM,OAAOhU,GAAS,UAAY,OAAOgU,GAAS,WAChDhU,EAAQojB,GAASpjB,CAAK,EACtBgU,EAAQoP,GAASpP,CAAK,GAEjByO,EAASziB,EAAOgU,CAAK,CAC9B,CACF,CAmBA,SAASgN,GAAc1hB,EAAM4Q,EAASmT,EAAU3f,EAAanE,EAAS+e,GAAUC,GAASuD,GAAQC,GAAKjB,GAAO,CAC3G,IAAIwC,GAAUpT,EAAU7a,EACpB+sB,GAAakB,GAAU/E,GAAUnqB,EACjCmvB,GAAkBD,GAAUlvB,EAAYmqB,GACxCiF,GAAcF,GAAUhF,GAAWlqB,EACnCqvB,GAAmBH,GAAUlvB,EAAYkqB,GAE7CpO,GAAYoT,GAAU/tB,EAAoBC,EAC1C0a,GAAW,EAAEoT,GAAU9tB,EAA0BD,GAE3C2a,EAAU9a,IACd8a,GAAW,EAAEhb,EAAiBC,IAEhC,IAAIuuB,GAAU,CACZpkB,EAAM4Q,EAAS3Q,EAASikB,GAAapB,GAAYqB,GACjDF,GAAiBzB,GAAQC,GAAKjB,EAChC,EAEIvgB,GAAS8iB,EAAS,MAAMjvB,EAAWsvB,EAAO,EAC9C,OAAI/B,GAAWriB,CAAI,GACjBqkB,GAAQpjB,GAAQmjB,EAAO,EAEzBnjB,GAAO,YAAcmD,EACdkgB,GAAgBrjB,GAAQjB,EAAM4Q,CAAO,CAC9C,CASA,SAAS2T,GAAYvD,EAAY,CAC/B,IAAIhhB,EAAOsG,GAAK0a,CAAU,EAC1B,OAAO,SAASxQ,EAAQgU,EAAW,CAGjC,GAFAhU,EAASsT,GAAStT,CAAM,EACxBgU,EAAYA,GAAa,KAAO,EAAIxb,GAAUoK,GAAUoR,CAAS,EAAG,GAAG,EACnEA,GAAa5b,GAAe4H,CAAM,EAAG,CAGvC,IAAIiU,GAAQhH,GAASjN,CAAM,EAAI,KAAK,MAAM,GAAG,EACzC9P,GAAQV,EAAKykB,EAAK,CAAC,EAAI,KAAO,CAACA,EAAK,CAAC,EAAID,EAAU,EAEvD,OAAAC,GAAQhH,GAAS/c,EAAK,EAAI,KAAK,MAAM,GAAG,EACjC,EAAE+jB,EAAK,CAAC,EAAI,KAAO,CAACA,EAAK,CAAC,EAAID,GACvC,CACA,OAAOxkB,EAAKwQ,CAAM,CACpB,CACF,CASA,IAAIgM,GAAchT,IAAQ,EAAInE,GAAW,IAAImE,GAAI,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,GAAM3S,EAAmB,SAAS2K,EAAQ,CAClG,OAAO,IAAIgI,GAAIhI,CAAM,CACvB,EAF4EkjB,GAW5E,SAASC,GAAc5S,EAAU,CAC/B,OAAO,SAAShP,EAAQ,CACtB,IAAIoO,EAAMC,GAAOrO,CAAM,EACvB,OAAIoO,GAAOrZ,GACFiN,GAAWhC,CAAM,EAEtBoO,GAAO9Y,GACFkN,GAAWxC,CAAM,EAEnBQ,GAAYR,EAAQgP,EAAShP,CAAM,CAAC,CAC7C,CACF,CA2BA,SAAS6hB,GAAW5kB,EAAM4Q,EAAS3Q,EAAS+e,EAAUC,EAASuD,GAAQC,GAAKjB,GAAO,CACjF,IAAImB,GAAY/R,EAAU/a,EAC1B,GAAI,CAAC8sB,IAAa,OAAO3iB,GAAQ,WAC/B,MAAM,IAAI0G,GAAUxR,CAAe,EAErC,IAAIuL,GAASue,EAAWA,EAAS,OAAS,EAS1C,GARKve,KACHmQ,GAAW,EAAE3a,EAAoBC,GACjC8oB,EAAWC,EAAUnqB,GAEvB2tB,GAAMA,KAAQ3tB,EAAY2tB,GAAM1Z,GAAUqK,GAAUqP,EAAG,EAAG,CAAC,EAC3DjB,GAAQA,KAAU1sB,EAAY0sB,GAAQpO,GAAUoO,EAAK,EACrD/gB,IAAUwe,EAAUA,EAAQ,OAAS,EAEjCrO,EAAU1a,EAAyB,CACrC,IAAIosB,GAAgBtD,EAChBuD,GAAetD,EAEnBD,EAAWC,EAAUnqB,CACvB,CACA,IAAIgQ,GAAO6d,GAAY7tB,EAAYstB,GAAQpiB,CAAI,EAE3CokB,GAAU,CACZpkB,EAAM4Q,EAAS3Q,EAAS+e,EAAUC,EAASqD,GAAeC,GAC1DC,GAAQC,GAAKjB,EACf,EAiBA,GAfI1c,IACF+f,GAAUT,GAAStf,EAAI,EAEzB9E,EAAOokB,GAAQ,CAAC,EAChBxT,EAAUwT,GAAQ,CAAC,EACnBnkB,EAAUmkB,GAAQ,CAAC,EACnBpF,EAAWoF,GAAQ,CAAC,EACpBnF,EAAUmF,GAAQ,CAAC,EACnB5C,GAAQ4C,GAAQ,CAAC,EAAIA,GAAQ,CAAC,IAAMtvB,EAC/B6tB,GAAY,EAAI3iB,EAAK,OACtB+I,GAAUqb,GAAQ,CAAC,EAAI3jB,GAAQ,CAAC,EAEhC,CAAC+gB,IAAS5Q,GAAW7a,EAAkBC,KACzC4a,GAAW,EAAE7a,EAAkBC,IAE7B,CAAC4a,GAAWA,GAAWhb,EACzB,IAAIqL,GAASwf,GAAWzgB,EAAM4Q,EAAS3Q,CAAO,OACrC2Q,GAAW7a,GAAmB6a,GAAW5a,EAClDiL,GAASsgB,GAAYvhB,EAAM4Q,EAAS4Q,EAAK,GAC/B5Q,GAAW3a,GAAqB2a,IAAYhb,EAAiBK,KAAuB,CAACgpB,EAAQ,OACvGhe,GAASyiB,GAAc1jB,EAAM4Q,EAAS3Q,EAAS+e,CAAQ,EAEvD/d,GAAS0gB,GAAa,MAAM7sB,EAAWsvB,EAAO,EAEhD,IAAI/jB,GAASyE,GAAOiW,GAAcsJ,GAClC,OAAOC,GAAgBjkB,GAAOY,GAAQmjB,EAAO,EAAGpkB,EAAM4Q,CAAO,CAC/D,CAcA,SAASkU,GAAuBnV,EAAUsH,EAAU3U,EAAKS,EAAQ,CAC/D,OAAI4M,IAAa7a,GACZ0a,GAAGG,EAAU9I,GAAYvE,CAAG,CAAC,GAAK,CAAC0E,GAAe,KAAKjE,EAAQT,CAAG,EAC9D2U,EAEFtH,CACT,CAgBA,SAASoV,GAAoBpV,EAAUsH,EAAU3U,EAAKS,EAAQgN,EAAQe,GAAO,CAC3E,OAAIhG,GAAS6E,CAAQ,GAAK7E,GAASmM,CAAQ,IAEzCnG,GAAM,IAAImG,EAAUtH,CAAQ,EAC5BgJ,GAAUhJ,EAAUsH,EAAUniB,EAAWiwB,GAAqBjU,EAAK,EACnEA,GAAM,OAAUmG,CAAQ,GAEnBtH,CACT,CAWA,SAASqV,GAAgBtkB,EAAO,CAC9B,OAAO0Y,GAAc1Y,CAAK,EAAI5L,EAAY4L,CAC5C,CAeA,SAAS4V,GAAYlW,EAAOsU,EAAO9D,EAASC,EAAYiF,EAAWhF,GAAO,CACxE,IAAImU,GAAYrU,EAAUlb,EACtB8V,GAAYpL,EAAM,OAClB4U,GAAYN,EAAM,OAEtB,GAAIlJ,IAAawJ,IAAa,EAAEiQ,IAAajQ,GAAYxJ,IACvD,MAAO,GAGT,IAAI0Z,GAAapU,GAAM,IAAI1Q,CAAK,EAC5B+kB,GAAarU,GAAM,IAAI4D,CAAK,EAChC,GAAIwQ,IAAcC,GAChB,OAAOD,IAAcxQ,GAASyQ,IAAc/kB,EAE9C,IAAII,GAAQ,GACRS,GAAS,GACTmU,GAAQxE,EAAUjb,EAA0B,IAAIkY,GAAW/Y,EAM/D,IAJAgc,GAAM,IAAI1Q,EAAOsU,CAAK,EACtB5D,GAAM,IAAI4D,EAAOtU,CAAK,EAGf,EAAEI,GAAQgL,IAAW,CAC1B,IAAI4Z,GAAWhlB,EAAMI,EAAK,EACtB6kB,GAAW3Q,EAAMlU,EAAK,EAE1B,GAAIqQ,EACF,IAAIyU,GAAWL,GACXpU,EAAWwU,GAAUD,GAAU5kB,GAAOkU,EAAOtU,EAAO0Q,EAAK,EACzDD,EAAWuU,GAAUC,GAAU7kB,GAAOJ,EAAOsU,EAAO5D,EAAK,EAE/D,GAAIwU,KAAaxwB,EAAW,CAC1B,GAAIwwB,GACF,SAEFrkB,GAAS,GACT,KACF,CAEA,GAAImU,IACF,GAAI,CAACvT,GAAU6S,EAAO,SAAS2Q,GAAUpQ,GAAU,CAC7C,GAAI,CAACpR,GAASuR,GAAMH,EAAQ,IACvBmQ,KAAaC,IAAYvP,EAAUsP,GAAUC,GAAUzU,EAASC,EAAYC,EAAK,GACpF,OAAOsE,GAAK,KAAKH,EAAQ,CAE7B,CAAC,EAAG,CACNhU,GAAS,GACT,KACF,UACS,EACLmkB,KAAaC,IACXvP,EAAUsP,GAAUC,GAAUzU,EAASC,EAAYC,EAAK,GACzD,CACL7P,GAAS,GACT,KACF,CACF,CACA,OAAA6P,GAAM,OAAU1Q,CAAK,EACrB0Q,GAAM,OAAU4D,CAAK,EACdzT,EACT,CAmBA,SAASsV,GAAWxT,EAAQ2R,EAAOvD,EAAKP,EAASC,EAAYiF,GAAWhF,GAAO,CAC7E,OAAQK,EAAK,CACX,KAAKvY,GACH,GAAKmK,EAAO,YAAc2R,EAAM,YAC3B3R,EAAO,YAAc2R,EAAM,WAC9B,MAAO,GAET3R,EAASA,EAAO,OAChB2R,EAAQA,EAAM,OAEhB,KAAK/b,GACH,MAAK,EAAAoK,EAAO,YAAc2R,EAAM,YAC5B,CAACoB,GAAU,IAAIpO,GAAW3E,CAAM,EAAG,IAAI2E,GAAWgN,CAAK,CAAC,GAK9D,KAAKld,EACL,KAAKC,GACL,KAAKM,GAGH,OAAOyX,GAAG,CAACzM,EAAQ,CAAC2R,CAAK,EAE3B,KAAK/c,GACH,OAAOoL,EAAO,MAAQ2R,EAAM,MAAQ3R,EAAO,SAAW2R,EAAM,QAE9D,KAAKtc,GACL,KAAKE,GAIH,OAAOyK,GAAW2R,EAAQ,GAE5B,KAAK5c,GACH,IAAIytB,GAAUxgB,GAEhB,KAAK1M,GACH,IAAI4sB,GAAYrU,EAAUlb,EAG1B,GAFA6vB,KAAYA,GAAUlgB,IAElBtC,EAAO,MAAQ2R,EAAM,MAAQ,CAACuQ,GAChC,MAAO,GAGT,IAAItT,GAAUb,GAAM,IAAI/N,CAAM,EAC9B,GAAI4O,GACF,OAAOA,IAAW+C,EAEpB9D,GAAWjb,EAGXmb,GAAM,IAAI/N,EAAQ2R,CAAK,EACvB,IAAIzT,GAASqV,GAAYiP,GAAQxiB,CAAM,EAAGwiB,GAAQ7Q,CAAK,EAAG9D,EAASC,EAAYiF,GAAWhF,EAAK,EAC/F,OAAAA,GAAM,OAAU/N,CAAM,EACf9B,GAET,KAAK1I,GACH,GAAI6R,GACF,OAAOA,GAAc,KAAKrH,CAAM,GAAKqH,GAAc,KAAKsK,CAAK,CAEnE,CACA,MAAO,EACT,CAeA,SAASkC,GAAa7T,EAAQ2R,EAAO9D,EAASC,EAAYiF,EAAWhF,GAAO,CAC1E,IAAImU,GAAYrU,EAAUlb,EACtB8vB,GAAWvT,GAAWlP,CAAM,EAC5B0iB,GAAYD,GAAS,OACrBE,GAAWzT,GAAWyC,CAAK,EAC3BM,GAAY0Q,GAAS,OAEzB,GAAID,IAAazQ,IAAa,CAACiQ,GAC7B,MAAO,GAGT,QADIzkB,GAAQilB,GACLjlB,MAAS,CACd,IAAI8B,GAAMkjB,GAAShlB,EAAK,EACxB,GAAI,EAAEykB,GAAY3iB,MAAOoS,EAAQ1N,GAAe,KAAK0N,EAAOpS,EAAG,GAC7D,MAAO,EAEX,CAEA,IAAIqjB,GAAa7U,GAAM,IAAI/N,CAAM,EAC7BoiB,GAAarU,GAAM,IAAI4D,CAAK,EAChC,GAAIiR,IAAcR,GAChB,OAAOQ,IAAcjR,GAASyQ,IAAcpiB,EAE9C,IAAI9B,GAAS,GACb6P,GAAM,IAAI/N,EAAQ2R,CAAK,EACvB5D,GAAM,IAAI4D,EAAO3R,CAAM,EAGvB,QADI6iB,GAAWX,GACR,EAAEzkB,GAAQilB,IAAW,CAC1BnjB,GAAMkjB,GAAShlB,EAAK,EACpB,IAAImP,GAAW5M,EAAOT,EAAG,EACrB+iB,GAAW3Q,EAAMpS,EAAG,EAExB,GAAIuO,EACF,IAAIyU,GAAWL,GACXpU,EAAWwU,GAAU1V,GAAUrN,GAAKoS,EAAO3R,EAAQ+N,EAAK,EACxDD,EAAWlB,GAAU0V,GAAU/iB,GAAKS,EAAQ2R,EAAO5D,EAAK,EAG9D,GAAI,EAAEwU,KAAaxwB,EACV6a,KAAa0V,IAAYvP,EAAUnG,GAAU0V,GAAUzU,EAASC,EAAYC,EAAK,EAClFwU,IACD,CACLrkB,GAAS,GACT,KACF,CACA2kB,KAAaA,GAAWtjB,IAAO,cACjC,CACA,GAAIrB,IAAU,CAAC2kB,GAAU,CACvB,IAAIC,GAAU9iB,EAAO,YACjB+iB,GAAUpR,EAAM,YAGhBmR,IAAWC,IACV,gBAAiB/iB,GAAU,gBAAiB2R,GAC7C,EAAE,OAAOmR,IAAW,YAAcA,cAAmBA,IACnD,OAAOC,IAAW,YAAcA,cAAmBA,MACvD7kB,GAAS,GAEb,CACA,OAAA6P,GAAM,OAAU/N,CAAM,EACtB+N,GAAM,OAAU4D,CAAK,EACdzT,EACT,CASA,SAAS8gB,GAAS/hB,EAAM,CACtB,OAAO0a,GAAYC,GAAS3a,EAAMlL,EAAWixB,EAAO,EAAG/lB,EAAO,EAAE,CAClE,CASA,SAASiS,GAAWlP,EAAQ,CAC1B,OAAOqR,GAAerR,EAAQkN,GAAM8P,EAAU,CAChD,CAUA,SAAS/N,GAAajP,EAAQ,CAC5B,OAAOqR,GAAerR,EAAQoN,GAAQ6P,EAAY,CACpD,CASA,IAAIoC,GAAWzY,GAAiB,SAAS3J,EAAM,CAC7C,OAAO2J,GAAQ,IAAI3J,CAAI,CACzB,EAFyB0kB,GAWzB,SAASxC,GAAYliB,EAAM,CAKzB,QAJIiB,EAAUjB,EAAK,KAAO,GACtBI,EAAQwJ,GAAU3I,CAAM,EACxBR,EAASuG,GAAe,KAAK4C,GAAW3I,CAAM,EAAIb,EAAM,OAAS,EAE9DK,KAAU,CACf,IAAIqE,EAAO1E,EAAMK,CAAM,EACnBulB,GAAYlhB,EAAK,KACrB,GAAIkhB,IAAa,MAAQA,IAAahmB,EACpC,OAAO8E,EAAK,IAEhB,CACA,OAAO7D,CACT,CASA,SAASwgB,GAAUzhB,EAAM,CACvB,IAAI+C,EAASiE,GAAe,KAAKsD,GAAQ,aAAa,EAAIA,GAAStK,EACnE,OAAO+C,EAAO,WAChB,CAaA,SAAS0W,IAAc,CACrB,IAAIxY,EAASqJ,GAAO,UAAYhK,GAChC,OAAAW,EAASA,IAAWX,GAAWmX,GAAexW,EACvC,UAAU,OAASA,EAAO,UAAU,CAAC,EAAG,UAAU,CAAC,CAAC,EAAIA,CACjE,CAUA,SAASuM,GAAWxI,EAAK1C,EAAK,CAC5B,IAAIwC,EAAOE,EAAI,SACf,OAAOihB,GAAU3jB,CAAG,EAChBwC,EAAK,OAAOxC,GAAO,SAAW,SAAW,MAAM,EAC/CwC,EAAK,GACX,CASA,SAASwT,GAAavV,EAAQ,CAI5B,QAHI9B,EAASgP,GAAKlN,CAAM,EACpBtC,EAASQ,EAAO,OAEbR,KAAU,CACf,IAAI6B,EAAMrB,EAAOR,CAAM,EACnBC,EAAQqC,EAAOT,CAAG,EAEtBrB,EAAOR,CAAM,EAAI,CAAC6B,EAAK5B,EAAO+X,GAAmB/X,CAAK,CAAC,CACzD,CACA,OAAOO,CACT,CAUA,SAASmH,GAAUrF,EAAQT,EAAK,CAC9B,IAAI5B,EAAQ+D,GAAS1B,EAAQT,CAAG,EAChC,OAAO4U,GAAaxW,CAAK,EAAIA,EAAQ5L,CACvC,CASA,SAASyf,GAAU7T,EAAO,CACxB,IAAIwlB,EAAQlf,GAAe,KAAKtG,EAAOwH,EAAc,EACjDiJ,EAAMzQ,EAAMwH,EAAc,EAE9B,GAAI,CACFxH,EAAMwH,EAAc,EAAIpT,EACxB,IAAIqxB,EAAW,EACjB,MAAY,CAAC,CAEb,IAAIllB,EAASmG,GAAqB,KAAK1G,CAAK,EAC5C,OAAIylB,IACED,EACFxlB,EAAMwH,EAAc,EAAIiJ,EAExB,OAAOzQ,EAAMwH,EAAc,GAGxBjH,CACT,CASA,IAAI8e,GAAcrX,GAA+B,SAAS3F,EAAQ,CAChE,OAAIA,GAAU,KACL,CAAC,GAEVA,EAASwD,GAAOxD,CAAM,EACfhC,GAAY2H,GAAiB3F,CAAM,EAAG,SAASub,EAAQ,CAC5D,OAAOxW,GAAqB,KAAK/E,EAAQub,CAAM,CACjD,CAAC,EACH,EARqC8H,GAiBjCpG,GAAgBtX,GAA+B,SAAS3F,EAAQ,CAElE,QADI9B,EAAS,CAAC,EACP8B,GACLxB,GAAUN,EAAQ8e,GAAWhd,CAAM,CAAC,EACpCA,EAAS6E,GAAa7E,CAAM,EAE9B,OAAO9B,CACT,EAPuCmlB,GAgBnChV,GAASkD,IAGRjL,IAAY+H,GAAO,IAAI/H,GAAS,IAAI,YAAY,CAAC,CAAC,CAAC,GAAKzQ,IACxD0Q,IAAO8H,GAAO,IAAI9H,EAAG,GAAKxR,IAC1ByR,IAAW6H,GAAO7H,GAAQ,QAAQ,CAAC,GAAKrR,IACxCsR,IAAO4H,GAAO,IAAI5H,EAAG,GAAKnR,IAC1BoR,IAAW2H,GAAO,IAAI3H,EAAO,GAAKhR,KACrC2Y,GAAS,SAAS1Q,EAAO,CACvB,IAAIO,EAASqT,GAAW5T,CAAK,EACzBigB,EAAO1f,GAAUhJ,GAAYyI,EAAM,YAAc5L,EACjDuxB,EAAa1F,EAAO7W,GAAS6W,CAAI,EAAI,GAEzC,GAAI0F,EACF,OAAQA,EAAY,CAClB,KAAKxc,GAAoB,OAAOjR,GAChC,KAAKmR,GAAe,OAAOjS,GAC3B,KAAKkS,GAAmB,OAAO9R,GAC/B,KAAK+R,GAAe,OAAO5R,GAC3B,KAAK6R,GAAmB,OAAOzR,CACjC,CAEF,OAAOwI,CACT,GAaF,SAASyK,GAAQC,EAAOC,EAAK0a,EAAY,CAIvC,QAHI9lB,EAAQ,GACRC,EAAS6lB,EAAW,OAEjB,EAAE9lB,EAAQC,GAAQ,CACvB,IAAIqE,GAAOwhB,EAAW9lB,CAAK,EACvBoN,GAAO9I,GAAK,KAEhB,OAAQA,GAAK,KAAM,CACjB,IAAK,OAAa6G,GAASiC,GAAM,MACjC,IAAK,YAAahC,GAAOgC,GAAM,MAC/B,IAAK,OAAahC,EAAM5C,GAAU4C,EAAKD,EAAQiC,EAAI,EAAG,MACtD,IAAK,YAAajC,EAAQ5C,GAAU4C,EAAOC,EAAMgC,EAAI,EAAG,KAC1D,CACF,CACA,MAAO,CAAE,MAASjC,EAAO,IAAOC,CAAI,CACtC,CASA,SAAS2a,GAAexW,EAAQ,CAC9B,IAAIyW,EAAQzW,EAAO,MAAMvV,EAAa,EACtC,OAAOgsB,EAAQA,EAAM,CAAC,EAAE,MAAM/rB,EAAc,EAAI,CAAC,CACnD,CAWA,SAASgsB,GAAQ1jB,EAAQkR,EAAMyS,EAAS,CACtCzS,EAAOC,GAASD,EAAMlR,CAAM,EAM5B,QAJIvC,EAAQ,GACRC,EAASwT,EAAK,OACdhT,GAAS,GAEN,EAAET,EAAQC,GAAQ,CACvB,IAAI6B,GAAM6R,GAAMF,EAAKzT,CAAK,CAAC,EAC3B,GAAI,EAAES,GAAS8B,GAAU,MAAQ2jB,EAAQ3jB,EAAQT,EAAG,GAClD,MAEFS,EAASA,EAAOT,EAAG,CACrB,CACA,OAAIrB,IAAU,EAAET,GAASC,EAChBQ,IAETR,EAASsC,GAAU,KAAO,EAAIA,EAAO,OAC9B,CAAC,CAACtC,GAAU+W,GAAS/W,CAAM,GAAKuO,GAAQ1M,GAAK7B,CAAM,IACvD+J,GAAQzH,CAAM,GAAK2L,GAAY3L,CAAM,GAC1C,CASA,SAASmO,GAAe9Q,EAAO,CAC7B,IAAIK,EAASL,EAAM,OACfa,EAAS,IAAIb,EAAM,YAAYK,CAAM,EAGzC,OAAIA,GAAU,OAAOL,EAAM,CAAC,GAAK,UAAY4G,GAAe,KAAK5G,EAAO,OAAO,IAC7Ea,EAAO,MAAQb,EAAM,MACrBa,EAAO,MAAQb,EAAM,OAEhBa,CACT,CASA,SAASsQ,GAAgBxO,EAAQ,CAC/B,OAAQ,OAAOA,EAAO,aAAe,YAAc,CAACgV,GAAYhV,CAAM,EAClE6H,GAAWhD,GAAa7E,CAAM,CAAC,EAC/B,CAAC,CACP,CAcA,SAAS2O,GAAe3O,EAAQoO,EAAKJ,EAAQ,CAC3C,IAAI4P,EAAO5d,EAAO,YAClB,OAAQoO,EAAK,CACX,KAAKxY,GACH,OAAOolB,GAAiBhb,CAAM,EAEhC,KAAKvL,EACL,KAAKC,GACH,OAAO,IAAIkpB,EAAK,CAAC5d,CAAM,EAEzB,KAAKnK,GACH,OAAOqlB,GAAclb,EAAQgO,CAAM,EAErC,KAAKlY,GAAY,KAAKC,GACtB,KAAKC,GAAS,KAAKC,GAAU,KAAKC,GAClC,KAAKC,GAAU,KAAKC,GAAiB,KAAKC,GAAW,KAAKC,EACxD,OAAO8f,GAAgBpW,EAAQgO,CAAM,EAEvC,KAAKjZ,GACH,OAAO,IAAI6oB,EAEb,KAAK5oB,GACL,KAAKO,GACH,OAAO,IAAIqoB,EAAK5d,CAAM,EAExB,KAAK3K,GACH,OAAO+lB,GAAYpb,CAAM,EAE3B,KAAK1K,GACH,OAAO,IAAIsoB,EAEb,KAAKpoB,GACH,OAAO8lB,GAAYtb,CAAM,CAC7B,CACF,CAUA,SAAS4jB,GAAkB5W,EAAQ6W,EAAS,CAC1C,IAAInmB,EAASmmB,EAAQ,OACrB,GAAI,CAACnmB,EACH,OAAOsP,EAET,IAAI9C,EAAYxM,EAAS,EACzB,OAAAmmB,EAAQ3Z,CAAS,GAAKxM,EAAS,EAAI,KAAO,IAAMmmB,EAAQ3Z,CAAS,EACjE2Z,EAAUA,EAAQ,KAAKnmB,EAAS,EAAI,KAAO,GAAG,EACvCsP,EAAO,QAAQxV,GAAe;AAAA,mBAAyBqsB,EAAU;AAAA,CAAQ,CAClF,CASA,SAASlT,GAAchT,EAAO,CAC5B,OAAO8J,GAAQ9J,CAAK,GAAKgO,GAAYhO,CAAK,GACxC,CAAC,EAAEsH,IAAoBtH,GAASA,EAAMsH,EAAgB,EAC1D,CAUA,SAASgH,GAAQtO,EAAOD,EAAQ,CAC9B,IAAI0L,EAAO,OAAOzL,EAClB,OAAAD,EAASA,GAAiB3J,EAEnB,CAAC,CAAC2J,IACN0L,GAAQ,UACNA,GAAQ,UAAYhR,GAAS,KAAKuF,CAAK,IACrCA,EAAQ,IAAMA,EAAQ,GAAK,GAAKA,EAAQD,CACjD,CAYA,SAAS8f,GAAe7f,EAAOF,EAAOuC,EAAQ,CAC5C,GAAI,CAAC+H,GAAS/H,CAAM,EAClB,MAAO,GAET,IAAIoJ,EAAO,OAAO3L,EAClB,OAAI2L,GAAQ,SACHkM,GAAYtV,CAAM,GAAKiM,GAAQxO,EAAOuC,EAAO,MAAM,EACnDoJ,GAAQ,UAAY3L,KAASuC,GAE7ByM,GAAGzM,EAAOvC,CAAK,EAAGE,CAAK,EAEzB,EACT,CAUA,SAAS8X,GAAM9X,EAAOqC,EAAQ,CAC5B,GAAIyH,GAAQ9J,CAAK,EACf,MAAO,GAET,IAAIyL,EAAO,OAAOzL,EAClB,OAAIyL,GAAQ,UAAYA,GAAQ,UAAYA,GAAQ,WAChDzL,GAAS,MAAQwS,GAASxS,CAAK,EAC1B,GAEFzG,GAAc,KAAKyG,CAAK,GAAK,CAAC1G,GAAa,KAAK0G,CAAK,GACzDqC,GAAU,MAAQrC,KAAS6F,GAAOxD,CAAM,CAC7C,CASA,SAASkjB,GAAUvlB,EAAO,CACxB,IAAIyL,EAAO,OAAOzL,EAClB,OAAQyL,GAAQ,UAAYA,GAAQ,UAAYA,GAAQ,UAAYA,GAAQ,UACvEzL,IAAU,YACVA,IAAU,IACjB,CAUA,SAAS2hB,GAAWriB,EAAM,CACxB,IAAImiB,EAAWD,GAAYliB,CAAI,EAC3B0U,EAAQpK,GAAO6X,CAAQ,EAE3B,GAAI,OAAOzN,GAAS,YAAc,EAAEyN,KAAY1X,GAAY,WAC1D,MAAO,GAET,GAAIzK,IAAS0U,EACX,MAAO,GAET,IAAI5P,EAAOsd,GAAQ1N,CAAK,EACxB,MAAO,CAAC,CAAC5P,GAAQ9E,IAAS8E,EAAK,CAAC,CAClC,CASA,SAASqS,GAASnX,EAAM,CACtB,MAAO,CAAC,CAACkH,IAAeA,MAAclH,CACxC,CASA,IAAI6mB,GAAa/f,GAAaiN,GAAa+S,GAS3C,SAAS/O,GAAYrX,EAAO,CAC1B,IAAIigB,EAAOjgB,GAASA,EAAM,YACtBmK,EAAS,OAAO8V,GAAQ,YAAcA,EAAK,WAAc9Z,GAE7D,OAAOnG,IAAUmK,CACnB,CAUA,SAAS4N,GAAmB/X,EAAO,CACjC,OAAOA,IAAUA,GAAS,CAACoK,GAASpK,CAAK,CAC3C,CAWA,SAAS6X,GAAwBjW,EAAK2U,EAAU,CAC9C,OAAO,SAASlU,EAAQ,CACtB,OAAIA,GAAU,KACL,GAEFA,EAAOT,CAAG,IAAM2U,IACpBA,IAAaniB,GAAcwN,KAAOiE,GAAOxD,CAAM,EACpD,CACF,CAUA,SAASgkB,GAAc/mB,EAAM,CAC3B,IAAIiB,EAAS+lB,GAAQhnB,EAAM,SAASsC,EAAK,CACvC,OAAIwB,EAAM,OAASzO,GACjByO,EAAM,MAAM,EAEPxB,CACT,CAAC,EAEGwB,EAAQ7C,EAAO,MACnB,OAAOA,CACT,CAkBA,SAAS4jB,GAAU/f,EAAMiL,EAAQ,CAC/B,IAAIa,EAAU9L,EAAK,CAAC,EAChBmiB,EAAalX,EAAO,CAAC,EACrBmX,EAAatW,EAAUqW,EACvBxU,GAAWyU,GAActxB,EAAiBC,EAAqBM,GAE/DgxB,GACAF,GAAc9wB,GAAmBya,GAAW7a,GAC5CkxB,GAAc9wB,GAAmBya,GAAWxa,GAAqB0O,EAAK,CAAC,EAAE,QAAUiL,EAAO,CAAC,GAC3FkX,IAAe9wB,EAAgBC,IAAsB2Z,EAAO,CAAC,EAAE,QAAUA,EAAO,CAAC,GAAOa,GAAW7a,EAGvG,GAAI,EAAE0c,IAAY0U,IAChB,OAAOriB,EAGLmiB,EAAarxB,IACfkP,EAAK,CAAC,EAAIiL,EAAO,CAAC,EAElBmX,GAActW,EAAUhb,EAAiB,EAAIE,GAG/C,IAAI4K,GAAQqP,EAAO,CAAC,EACpB,GAAIrP,GAAO,CACT,IAAIse,GAAWla,EAAK,CAAC,EACrBA,EAAK,CAAC,EAAIka,GAAWD,GAAYC,GAAUte,GAAOqP,EAAO,CAAC,CAAC,EAAIrP,GAC/DoE,EAAK,CAAC,EAAIka,GAAW5Z,GAAeN,EAAK,CAAC,EAAGxP,CAAW,EAAIya,EAAO,CAAC,CACtE,CAEA,OAAArP,GAAQqP,EAAO,CAAC,EACZrP,KACFse,GAAWla,EAAK,CAAC,EACjBA,EAAK,CAAC,EAAIka,GAAWU,GAAiBV,GAAUte,GAAOqP,EAAO,CAAC,CAAC,EAAIrP,GACpEoE,EAAK,CAAC,EAAIka,GAAW5Z,GAAeN,EAAK,CAAC,EAAGxP,CAAW,EAAIya,EAAO,CAAC,GAGtErP,GAAQqP,EAAO,CAAC,EACZrP,KACFoE,EAAK,CAAC,EAAIpE,IAGRumB,EAAa9wB,IACf2O,EAAK,CAAC,EAAIA,EAAK,CAAC,GAAK,KAAOiL,EAAO,CAAC,EAAI/G,GAAUlE,EAAK,CAAC,EAAGiL,EAAO,CAAC,CAAC,GAGlEjL,EAAK,CAAC,GAAK,OACbA,EAAK,CAAC,EAAIiL,EAAO,CAAC,GAGpBjL,EAAK,CAAC,EAAIiL,EAAO,CAAC,EAClBjL,EAAK,CAAC,EAAIoiB,EAEHpiB,CACT,CAWA,SAASmT,GAAalV,EAAQ,CAC5B,IAAI9B,EAAS,CAAC,EACd,GAAI8B,GAAU,KACZ,QAAST,KAAOiE,GAAOxD,CAAM,EAC3B9B,EAAO,KAAKqB,CAAG,EAGnB,OAAOrB,CACT,CASA,SAASuT,GAAe9T,EAAO,CAC7B,OAAO0G,GAAqB,KAAK1G,CAAK,CACxC,CAWA,SAASia,GAAS3a,EAAM2L,EAAOzG,EAAW,CACxC,OAAAyG,EAAQ5C,GAAU4C,IAAU7W,EAAakL,EAAK,OAAS,EAAK2L,EAAO,CAAC,EAC7D,UAAW,CAMhB,QALIzL,EAAO,UACPM,EAAQ,GACRC,GAASsI,GAAU7I,EAAK,OAASyL,EAAO,CAAC,EACzCvL,GAAQ8F,GAAMzF,EAAM,EAEjB,EAAED,EAAQC,IACfL,GAAMI,CAAK,EAAIN,EAAKyL,EAAQnL,CAAK,EAEnCA,EAAQ,GAER,QADI4mB,GAAYlhB,GAAMyF,EAAQ,CAAC,EACxB,EAAEnL,EAAQmL,GACfyb,GAAU5mB,CAAK,EAAIN,EAAKM,CAAK,EAE/B,OAAA4mB,GAAUzb,CAAK,EAAIzG,EAAU9E,EAAK,EAC3BL,GAAMC,EAAM,KAAMonB,EAAS,CACpC,CACF,CAUA,SAAS7R,GAAOxS,EAAQkR,EAAM,CAC5B,OAAOA,EAAK,OAAS,EAAIlR,EAASiR,GAAQjR,EAAQoY,GAAUlH,EAAM,EAAG,EAAE,CAAC,CAC1E,CAYA,SAAS8O,GAAQ3iB,EAAO+Z,EAAS,CAK/B,QAJI3O,EAAYpL,EAAM,OAClBK,EAASuI,GAAUmR,EAAQ,OAAQ3O,CAAS,EAC5C6b,EAAWnc,GAAU9K,CAAK,EAEvBK,KAAU,CACf,IAAID,GAAQ2Z,EAAQ1Z,CAAM,EAC1BL,EAAMK,CAAM,EAAIuO,GAAQxO,GAAOgL,CAAS,EAAI6b,EAAS7mB,EAAK,EAAI1L,CAChE,CACA,OAAOsL,CACT,CAUA,SAAS2Y,GAAQhW,EAAQT,EAAK,CAC5B,GAAI,EAAAA,IAAQ,eAAiB,OAAOS,EAAOT,CAAG,GAAM,aAIhDA,GAAO,YAIX,OAAOS,EAAOT,CAAG,CACnB,CAgBA,IAAI+hB,GAAUiD,GAASvM,EAAW,EAU9BzI,GAAa/J,IAAiB,SAASvI,EAAMqS,EAAM,CACrD,OAAOnT,GAAK,WAAWc,EAAMqS,CAAI,CACnC,EAUIqI,GAAc4M,GAAStM,EAAe,EAY1C,SAASsJ,GAAgBzD,EAAS0G,EAAW3W,EAAS,CACpD,IAAIb,EAAUwX,EAAY,GAC1B,OAAO7M,GAAYmG,EAAS8F,GAAkB5W,EAAQyX,GAAkBjB,GAAexW,CAAM,EAAGa,CAAO,CAAC,CAAC,CAC3G,CAWA,SAAS0W,GAAStnB,EAAM,CACtB,IAAIynB,EAAQ,EACRC,EAAa,EAEjB,OAAO,UAAW,CAChB,IAAIC,EAAQ1e,GAAU,EAClB2e,EAAYnxB,GAAYkxB,EAAQD,GAGpC,GADAA,EAAaC,EACTC,EAAY,GACd,GAAI,EAAEH,GAASjxB,EACb,OAAO,UAAU,CAAC,OAGpBixB,EAAQ,EAEV,OAAOznB,EAAK,MAAMlL,EAAW,SAAS,CACxC,CACF,CAUA,SAASsa,GAAYhP,EAAOwN,EAAM,CAChC,IAAIpN,EAAQ,GACRC,EAASL,EAAM,OACf6M,EAAYxM,EAAS,EAGzB,IADAmN,EAAOA,IAAS9Y,EAAY2L,EAASmN,EAC9B,EAAEpN,EAAQoN,GAAM,CACrB,IAAIia,GAAO3Y,GAAW1O,EAAOyM,CAAS,EAClCvM,GAAQN,EAAMynB,EAAI,EAEtBznB,EAAMynB,EAAI,EAAIznB,EAAMI,CAAK,EACzBJ,EAAMI,CAAK,EAAIE,EACjB,CACA,OAAAN,EAAM,OAASwN,EACRxN,CACT,CASA,IAAIod,GAAeuJ,GAAc,SAAS9kB,EAAQ,CAChD,IAAIhB,EAAS,CAAC,EACd,OAAIgB,EAAO,WAAW,CAAC,IAAM,IAC3BhB,EAAO,KAAK,EAAE,EAEhBgB,EAAO,QAAQ/H,GAAY,SAASssB,EAAOhW,EAAQsX,EAAOC,GAAW,CACnE9mB,EAAO,KAAK6mB,EAAQC,GAAU,QAAQntB,GAAc,IAAI,EAAK4V,GAAUgW,CAAM,CAC/E,CAAC,EACMvlB,CACT,CAAC,EASD,SAASkT,GAAMzT,EAAO,CACpB,GAAI,OAAOA,GAAS,UAAYwS,GAASxS,CAAK,EAC5C,OAAOA,EAET,IAAIO,EAAUP,EAAQ,GACtB,OAAQO,GAAU,KAAQ,EAAIP,GAAU,CAAC7J,EAAY,KAAOoK,CAC9D,CASA,SAAS6I,GAAS9J,EAAM,CACtB,GAAIA,GAAQ,KAAM,CAChB,GAAI,CACF,OAAO+G,GAAa,KAAK/G,CAAI,CAC/B,MAAY,CAAC,CACb,GAAI,CACF,OAAQA,EAAO,EACjB,MAAY,CAAC,CACf,CACA,MAAO,EACT,CAUA,SAASwnB,GAAkBZ,EAAShW,EAAS,CAC3C,OAAAjQ,GAAUvJ,GAAW,SAASqtB,EAAM,CAClC,IAAI/jB,EAAQ,KAAO+jB,EAAK,CAAC,EACpB7T,EAAU6T,EAAK,CAAC,GAAM,CAACvjB,GAAc0lB,EAASlmB,CAAK,GACtDkmB,EAAQ,KAAKlmB,CAAK,CAEtB,CAAC,EACMkmB,EAAQ,KAAK,CACtB,CASA,SAASjc,GAAakW,EAAS,CAC7B,GAAIA,aAAmBpW,GACrB,OAAOoW,EAAQ,MAAM,EAEvB,IAAI5f,EAAS,IAAIyJ,GAAcmW,EAAQ,YAAaA,EAAQ,SAAS,EACrE,OAAA5f,EAAO,YAAciK,GAAU2V,EAAQ,WAAW,EAClD5f,EAAO,UAAa4f,EAAQ,UAC5B5f,EAAO,WAAa4f,EAAQ,WACrB5f,CACT,CAyBA,SAAS+mB,GAAM5nB,EAAOwN,EAAM0S,EAAO,EAC5BA,EAAQC,GAAengB,EAAOwN,EAAM0S,CAAK,EAAI1S,IAAS9Y,GACzD8Y,EAAO,EAEPA,EAAO7E,GAAUqK,GAAUxF,CAAI,EAAG,CAAC,EAErC,IAAInN,EAASL,GAAS,KAAO,EAAIA,EAAM,OACvC,GAAI,CAACK,GAAUmN,EAAO,EACpB,MAAO,CAAC,EAMV,QAJIpN,EAAQ,EACRQ,GAAW,EACXC,GAASiF,GAAMsC,GAAW/H,EAASmN,CAAI,CAAC,EAErCpN,EAAQC,GACbQ,GAAOD,IAAU,EAAIma,GAAU/a,EAAOI,EAAQA,GAASoN,CAAK,EAE9D,OAAO3M,EACT,CAiBA,SAASgnB,GAAQ7nB,EAAO,CAMtB,QALII,EAAQ,GACRC,EAASL,GAAS,KAAO,EAAIA,EAAM,OACnCY,EAAW,EACXC,EAAS,CAAC,EAEP,EAAET,EAAQC,GAAQ,CACvB,IAAIC,GAAQN,EAAMI,CAAK,EACnBE,KACFO,EAAOD,GAAU,EAAIN,GAEzB,CACA,OAAOO,CACT,CAwBA,SAASinB,IAAS,CAChB,IAAIznB,EAAS,UAAU,OACvB,GAAI,CAACA,EACH,MAAO,CAAC,EAMV,QAJIP,EAAOgG,GAAMzF,EAAS,CAAC,EACvBL,EAAQ,UAAU,CAAC,EACnBI,EAAQC,EAELD,KACLN,EAAKM,EAAQ,CAAC,EAAI,UAAUA,CAAK,EAEnC,OAAOe,GAAUiJ,GAAQpK,CAAK,EAAI8K,GAAU9K,CAAK,EAAI,CAACA,CAAK,EAAGmT,GAAYrT,EAAM,CAAC,CAAC,CACpF,CAuBA,IAAIioB,GAAa1N,GAAS,SAASra,EAAOoB,EAAQ,CAChD,OAAO0X,GAAkB9Y,CAAK,EAC1BmS,GAAenS,EAAOmT,GAAY/R,EAAQ,EAAG0X,GAAmB,EAAI,CAAC,EACrE,CAAC,CACP,CAAC,EA4BGkP,GAAe3N,GAAS,SAASra,EAAOoB,EAAQ,CAClD,IAAIlB,EAAWkV,GAAKhU,CAAM,EAC1B,OAAI0X,GAAkB5Y,CAAQ,IAC5BA,EAAWxL,GAENokB,GAAkB9Y,CAAK,EAC1BmS,GAAenS,EAAOmT,GAAY/R,EAAQ,EAAG0X,GAAmB,EAAI,EAAGO,GAAYnZ,EAAU,CAAC,CAAC,EAC/F,CAAC,CACP,CAAC,EAyBG+nB,GAAiB5N,GAAS,SAASra,EAAOoB,EAAQ,CACpD,IAAIH,EAAamU,GAAKhU,CAAM,EAC5B,OAAI0X,GAAkB7X,CAAU,IAC9BA,EAAavM,GAERokB,GAAkB9Y,CAAK,EAC1BmS,GAAenS,EAAOmT,GAAY/R,EAAQ,EAAG0X,GAAmB,EAAI,EAAGpkB,EAAWuM,CAAU,EAC5F,CAAC,CACP,CAAC,EA2BD,SAASinB,GAAKloB,EAAOkD,EAAGgd,EAAO,CAC7B,IAAI7f,EAASL,GAAS,KAAO,EAAIA,EAAM,OACvC,OAAKK,GAGL6C,EAAKgd,GAAShd,IAAMxO,EAAa,EAAIse,GAAU9P,CAAC,EACzC6X,GAAU/a,EAAOkD,EAAI,EAAI,EAAIA,EAAG7C,CAAM,GAHpC,CAAC,CAIZ,CA2BA,SAAS8nB,GAAUnoB,EAAOkD,EAAGgd,EAAO,CAClC,IAAI7f,EAASL,GAAS,KAAO,EAAIA,EAAM,OACvC,OAAKK,GAGL6C,EAAKgd,GAAShd,IAAMxO,EAAa,EAAIse,GAAU9P,CAAC,EAChDA,EAAI7C,EAAS6C,EACN6X,GAAU/a,EAAO,EAAGkD,EAAI,EAAI,EAAIA,CAAC,GAJ/B,CAAC,CAKZ,CAqCA,SAASklB,GAAepoB,EAAOU,EAAW,CACxC,OAAQV,GAASA,EAAM,OACnB0c,GAAU1c,EAAOqZ,GAAY3Y,EAAW,CAAC,EAAG,GAAM,EAAI,EACtD,CAAC,CACP,CAqCA,SAAS2nB,GAAUroB,EAAOU,EAAW,CACnC,OAAQV,GAASA,EAAM,OACnB0c,GAAU1c,EAAOqZ,GAAY3Y,EAAW,CAAC,EAAG,EAAI,EAChD,CAAC,CACP,CA+BA,SAAS4nB,GAAKtoB,EAAOM,EAAOiL,EAAOC,EAAK,CACtC,IAAInL,EAASL,GAAS,KAAO,EAAIA,EAAM,OACvC,OAAKK,GAGDkL,GAAS,OAAOA,GAAS,UAAY4U,GAAengB,EAAOM,EAAOiL,CAAK,IACzEA,EAAQ,EACRC,EAAMnL,GAED0S,GAAS/S,EAAOM,EAAOiL,EAAOC,CAAG,GAN/B,CAAC,CAOZ,CAqCA,SAAS+c,GAAUvoB,EAAOU,EAAW0B,EAAW,CAC9C,IAAI/B,EAASL,GAAS,KAAO,EAAIA,EAAM,OACvC,GAAI,CAACK,EACH,MAAO,GAET,IAAID,EAAQgC,GAAa,KAAO,EAAI4Q,GAAU5Q,CAAS,EACvD,OAAIhC,EAAQ,IACVA,EAAQuI,GAAUtI,EAASD,EAAO,CAAC,GAE9B+B,GAAcnC,EAAOqZ,GAAY3Y,EAAW,CAAC,EAAGN,CAAK,CAC9D,CAqCA,SAASooB,GAAcxoB,EAAOU,EAAW0B,EAAW,CAClD,IAAI/B,EAASL,GAAS,KAAO,EAAIA,EAAM,OACvC,GAAI,CAACK,EACH,MAAO,GAET,IAAID,EAAQC,EAAS,EACrB,OAAI+B,IAAc1N,IAChB0L,EAAQ4S,GAAU5Q,CAAS,EAC3BhC,EAAQgC,EAAY,EAChBuG,GAAUtI,EAASD,EAAO,CAAC,EAC3BwI,GAAUxI,EAAOC,EAAS,CAAC,GAE1B8B,GAAcnC,EAAOqZ,GAAY3Y,EAAW,CAAC,EAAGN,EAAO,EAAI,CACpE,CAgBA,SAASulB,GAAQ3lB,EAAO,CACtB,IAAIK,EAASL,GAAS,KAAO,EAAIA,EAAM,OACvC,OAAOK,EAAS8S,GAAYnT,EAAO,CAAC,EAAI,CAAC,CAC3C,CAgBA,SAASyoB,GAAYzoB,EAAO,CAC1B,IAAIK,EAASL,GAAS,KAAO,EAAIA,EAAM,OACvC,OAAOK,EAAS8S,GAAYnT,EAAOvJ,CAAQ,EAAI,CAAC,CAClD,CAsBA,SAASiyB,GAAa1oB,EAAOoT,EAAO,CAClC,IAAI/S,EAASL,GAAS,KAAO,EAAIA,EAAM,OACvC,OAAKK,GAGL+S,EAAQA,IAAU1e,EAAY,EAAIse,GAAUI,CAAK,EAC1CD,GAAYnT,EAAOoT,CAAK,GAHtB,CAAC,CAIZ,CAiBA,SAASuV,GAAUza,EAAO,CAKxB,QAJI9N,EAAQ,GACRC,EAAS6N,GAAS,KAAO,EAAIA,EAAM,OACnCrN,EAAS,CAAC,EAEP,EAAET,EAAQC,GAAQ,CACvB,IAAIgkB,EAAOnW,EAAM9N,CAAK,EACtBS,EAAOwjB,EAAK,CAAC,CAAC,EAAIA,EAAK,CAAC,CAC1B,CACA,OAAOxjB,CACT,CAoBA,SAAS+nB,GAAK5oB,EAAO,CACnB,OAAQA,GAASA,EAAM,OAAUA,EAAM,CAAC,EAAItL,CAC9C,CAyBA,SAASmlB,GAAQ7Z,EAAOM,EAAO8B,EAAW,CACxC,IAAI/B,EAASL,GAAS,KAAO,EAAIA,EAAM,OACvC,GAAI,CAACK,EACH,MAAO,GAET,IAAID,EAAQgC,GAAa,KAAO,EAAI4Q,GAAU5Q,CAAS,EACvD,OAAIhC,EAAQ,IACVA,EAAQuI,GAAUtI,EAASD,EAAO,CAAC,GAE9BW,GAAYf,EAAOM,EAAOF,CAAK,CACxC,CAgBA,SAASyoB,GAAQ7oB,EAAO,CACtB,IAAIK,EAASL,GAAS,KAAO,EAAIA,EAAM,OACvC,OAAOK,EAAS0a,GAAU/a,EAAO,EAAG,EAAE,EAAI,CAAC,CAC7C,CAmBA,IAAI8oB,GAAezO,GAAS,SAAS1F,EAAQ,CAC3C,IAAIoU,EAAS7nB,GAASyT,EAAQuI,EAAmB,EACjD,OAAQ6L,EAAO,QAAUA,EAAO,CAAC,IAAMpU,EAAO,CAAC,EAC3CD,GAAiBqU,CAAM,EACvB,CAAC,CACP,CAAC,EAyBGC,GAAiB3O,GAAS,SAAS1F,EAAQ,CAC7C,IAAIzU,EAAWkV,GAAKT,CAAM,EACtBoU,EAAS7nB,GAASyT,EAAQuI,EAAmB,EAEjD,OAAIhd,IAAakV,GAAK2T,CAAM,EAC1B7oB,EAAWxL,EAEXq0B,EAAO,IAAI,EAELA,EAAO,QAAUA,EAAO,CAAC,IAAMpU,EAAO,CAAC,EAC3CD,GAAiBqU,EAAQ1P,GAAYnZ,EAAU,CAAC,CAAC,EACjD,CAAC,CACP,CAAC,EAuBG+oB,GAAmB5O,GAAS,SAAS1F,EAAQ,CAC/C,IAAI1T,EAAamU,GAAKT,CAAM,EACxBoU,EAAS7nB,GAASyT,EAAQuI,EAAmB,EAEjD,OAAAjc,EAAa,OAAOA,GAAc,WAAaA,EAAavM,EACxDuM,GACF8nB,EAAO,IAAI,EAELA,EAAO,QAAUA,EAAO,CAAC,IAAMpU,EAAO,CAAC,EAC3CD,GAAiBqU,EAAQr0B,EAAWuM,CAAU,EAC9C,CAAC,CACP,CAAC,EAiBD,SAASioB,GAAKlpB,EAAOmpB,EAAW,CAC9B,OAAOnpB,GAAS,KAAO,GAAKyI,GAAW,KAAKzI,EAAOmpB,CAAS,CAC9D,CAgBA,SAAS/T,GAAKpV,EAAO,CACnB,IAAIK,EAASL,GAAS,KAAO,EAAIA,EAAM,OACvC,OAAOK,EAASL,EAAMK,EAAS,CAAC,EAAI3L,CACtC,CAuBA,SAAS00B,GAAYppB,EAAOM,EAAO8B,EAAW,CAC5C,IAAI/B,EAASL,GAAS,KAAO,EAAIA,EAAM,OACvC,GAAI,CAACK,EACH,MAAO,GAET,IAAID,EAAQC,EACZ,OAAI+B,IAAc1N,IAChB0L,EAAQ4S,GAAU5Q,CAAS,EAC3BhC,EAAQA,EAAQ,EAAIuI,GAAUtI,EAASD,EAAO,CAAC,EAAIwI,GAAUxI,EAAOC,EAAS,CAAC,GAEzEC,IAAUA,EACb8E,GAAkBpF,EAAOM,EAAOF,CAAK,EACrC+B,GAAcnC,EAAOuC,GAAWnC,EAAO,EAAI,CACjD,CAuBA,SAASipB,GAAIrpB,EAAOkD,EAAG,CACrB,OAAQlD,GAASA,EAAM,OAAUkZ,GAAQlZ,EAAOgT,GAAU9P,CAAC,CAAC,EAAIxO,CAClE,CAyBA,IAAI40B,GAAOjP,GAASkP,EAAO,EAsB3B,SAASA,GAAQvpB,EAAOoB,EAAQ,CAC9B,OAAQpB,GAASA,EAAM,QAAUoB,GAAUA,EAAO,OAC9CwY,GAAY5Z,EAAOoB,CAAM,EACzBpB,CACN,CAyBA,SAASwpB,GAAUxpB,EAAOoB,EAAQlB,EAAU,CAC1C,OAAQF,GAASA,EAAM,QAAUoB,GAAUA,EAAO,OAC9CwY,GAAY5Z,EAAOoB,EAAQiY,GAAYnZ,EAAU,CAAC,CAAC,EACnDF,CACN,CAyBA,SAASypB,GAAYzpB,EAAOoB,EAAQH,EAAY,CAC9C,OAAQjB,GAASA,EAAM,QAAUoB,GAAUA,EAAO,OAC9CwY,GAAY5Z,EAAOoB,EAAQ1M,EAAWuM,CAAU,EAChDjB,CACN,CA0BA,IAAI0pB,GAAS/H,GAAS,SAAS3hB,EAAO+Z,EAAS,CAC7C,IAAI1Z,EAASL,GAAS,KAAO,EAAIA,EAAM,OACnCa,EAASmP,GAAOhQ,EAAO+Z,CAAO,EAElC,OAAAD,GAAW9Z,EAAOkB,GAAS6Y,EAAS,SAAS3Z,EAAO,CAClD,OAAOwO,GAAQxO,EAAOC,CAAM,EAAI,CAACD,EAAQA,CAC3C,CAAC,EAAE,KAAKge,EAAgB,CAAC,EAElBvd,CACT,CAAC,EA8BD,SAAS8oB,GAAO3pB,EAAOU,EAAW,CAChC,IAAIG,EAAS,CAAC,EACd,GAAI,EAAEb,GAASA,EAAM,QACnB,OAAOa,EAET,IAAIT,EAAQ,GACR2Z,EAAU,CAAC,EACX1Z,GAASL,EAAM,OAGnB,IADAU,EAAY2Y,GAAY3Y,EAAW,CAAC,EAC7B,EAAEN,EAAQC,IAAQ,CACvB,IAAIC,GAAQN,EAAMI,CAAK,EACnBM,EAAUJ,GAAOF,EAAOJ,CAAK,IAC/Ba,EAAO,KAAKP,EAAK,EACjByZ,EAAQ,KAAK3Z,CAAK,EAEtB,CACA,OAAA0Z,GAAW9Z,EAAO+Z,CAAO,EAClBlZ,CACT,CAyBA,SAAS+oB,GAAQ5pB,EAAO,CACtB,OAAOA,GAAS,KAAOA,EAAQgJ,GAAc,KAAKhJ,CAAK,CACzD,CAkBA,SAAS6pB,GAAM7pB,EAAOuL,EAAOC,EAAK,CAChC,IAAInL,EAASL,GAAS,KAAO,EAAIA,EAAM,OACvC,OAAKK,GAGDmL,GAAO,OAAOA,GAAO,UAAY2U,GAAengB,EAAOuL,EAAOC,CAAG,GACnED,EAAQ,EACRC,EAAMnL,IAGNkL,EAAQA,GAAS,KAAO,EAAIyH,GAAUzH,CAAK,EAC3CC,EAAMA,IAAQ9W,EAAY2L,EAAS2S,GAAUxH,CAAG,GAE3CuP,GAAU/a,EAAOuL,EAAOC,CAAG,GAVzB,CAAC,CAWZ,CAmBA,SAASse,GAAY9pB,EAAOM,EAAO,CACjC,OAAO2a,GAAgBjb,EAAOM,CAAK,CACrC,CA2BA,SAASypB,GAAc/pB,EAAOM,EAAOJ,EAAU,CAC7C,OAAOob,GAAkBtb,EAAOM,EAAO+Y,GAAYnZ,EAAU,CAAC,CAAC,CACjE,CAkBA,SAAS8pB,GAAchqB,EAAOM,EAAO,CACnC,IAAID,EAASL,GAAS,KAAO,EAAIA,EAAM,OACvC,GAAIK,EAAQ,CACV,IAAID,EAAQ6a,GAAgBjb,EAAOM,CAAK,EACxC,GAAIF,EAAQC,GAAU+O,GAAGpP,EAAMI,CAAK,EAAGE,CAAK,EAC1C,OAAOF,CAEX,CACA,MAAO,EACT,CAoBA,SAAS6pB,GAAgBjqB,EAAOM,EAAO,CACrC,OAAO2a,GAAgBjb,EAAOM,EAAO,EAAI,CAC3C,CA2BA,SAAS4pB,GAAkBlqB,EAAOM,EAAOJ,EAAU,CACjD,OAAOob,GAAkBtb,EAAOM,EAAO+Y,GAAYnZ,EAAU,CAAC,EAAG,EAAI,CACvE,CAkBA,SAASiqB,GAAkBnqB,EAAOM,EAAO,CACvC,IAAID,EAASL,GAAS,KAAO,EAAIA,EAAM,OACvC,GAAIK,EAAQ,CACV,IAAID,EAAQ6a,GAAgBjb,EAAOM,EAAO,EAAI,EAAI,EAClD,GAAI8O,GAAGpP,EAAMI,CAAK,EAAGE,CAAK,EACxB,OAAOF,CAEX,CACA,MAAO,EACT,CAiBA,SAASgqB,GAAWpqB,EAAO,CACzB,OAAQA,GAASA,EAAM,OACnBgc,GAAehc,CAAK,EACpB,CAAC,CACP,CAkBA,SAASqqB,GAAarqB,EAAOE,EAAU,CACrC,OAAQF,GAASA,EAAM,OACnBgc,GAAehc,EAAOqZ,GAAYnZ,EAAU,CAAC,CAAC,EAC9C,CAAC,CACP,CAgBA,SAASoqB,GAAKtqB,EAAO,CACnB,IAAIK,EAASL,GAAS,KAAO,EAAIA,EAAM,OACvC,OAAOK,EAAS0a,GAAU/a,EAAO,EAAGK,CAAM,EAAI,CAAC,CACjD,CA2BA,SAASkqB,GAAKvqB,EAAOkD,EAAGgd,EAAO,CAC7B,OAAMlgB,GAASA,EAAM,QAGrBkD,EAAKgd,GAAShd,IAAMxO,EAAa,EAAIse,GAAU9P,CAAC,EACzC6X,GAAU/a,EAAO,EAAGkD,EAAI,EAAI,EAAIA,CAAC,GAH/B,CAAC,CAIZ,CA2BA,SAASsnB,GAAUxqB,EAAOkD,EAAGgd,EAAO,CAClC,IAAI7f,EAASL,GAAS,KAAO,EAAIA,EAAM,OACvC,OAAKK,GAGL6C,EAAKgd,GAAShd,IAAMxO,EAAa,EAAIse,GAAU9P,CAAC,EAChDA,EAAI7C,EAAS6C,EACN6X,GAAU/a,EAAOkD,EAAI,EAAI,EAAIA,EAAG7C,CAAM,GAJpC,CAAC,CAKZ,CAqCA,SAASoqB,GAAezqB,EAAOU,EAAW,CACxC,OAAQV,GAASA,EAAM,OACnB0c,GAAU1c,EAAOqZ,GAAY3Y,EAAW,CAAC,EAAG,GAAO,EAAI,EACvD,CAAC,CACP,CAqCA,SAASgqB,GAAU1qB,EAAOU,EAAW,CACnC,OAAQV,GAASA,EAAM,OACnB0c,GAAU1c,EAAOqZ,GAAY3Y,EAAW,CAAC,CAAC,EAC1C,CAAC,CACP,CAkBA,IAAIiqB,GAAQtQ,GAAS,SAAS1F,EAAQ,CACpC,OAAOwH,GAAShJ,GAAYwB,EAAQ,EAAGmE,GAAmB,EAAI,CAAC,CACjE,CAAC,EAyBG8R,GAAUvQ,GAAS,SAAS1F,EAAQ,CACtC,IAAIzU,EAAWkV,GAAKT,CAAM,EAC1B,OAAImE,GAAkB5Y,CAAQ,IAC5BA,EAAWxL,GAENynB,GAAShJ,GAAYwB,EAAQ,EAAGmE,GAAmB,EAAI,EAAGO,GAAYnZ,EAAU,CAAC,CAAC,CAC3F,CAAC,EAuBG2qB,GAAYxQ,GAAS,SAAS1F,EAAQ,CACxC,IAAI1T,EAAamU,GAAKT,CAAM,EAC5B,OAAA1T,EAAa,OAAOA,GAAc,WAAaA,EAAavM,EACrDynB,GAAShJ,GAAYwB,EAAQ,EAAGmE,GAAmB,EAAI,EAAGpkB,EAAWuM,CAAU,CACxF,CAAC,EAoBD,SAAS6pB,GAAK9qB,EAAO,CACnB,OAAQA,GAASA,EAAM,OAAUmc,GAASnc,CAAK,EAAI,CAAC,CACtD,CAyBA,SAAS+qB,GAAO/qB,EAAOE,EAAU,CAC/B,OAAQF,GAASA,EAAM,OAAUmc,GAASnc,EAAOqZ,GAAYnZ,EAAU,CAAC,CAAC,EAAI,CAAC,CAChF,CAsBA,SAAS8qB,GAAShrB,EAAOiB,EAAY,CACnC,OAAAA,EAAa,OAAOA,GAAc,WAAaA,EAAavM,EACpDsL,GAASA,EAAM,OAAUmc,GAASnc,EAAOtL,EAAWuM,CAAU,EAAI,CAAC,CAC7E,CAqBA,SAASgqB,GAAMjrB,EAAO,CACpB,GAAI,EAAEA,GAASA,EAAM,QACnB,MAAO,CAAC,EAEV,IAAIK,EAAS,EACb,OAAAL,EAAQW,GAAYX,EAAO,SAASkrB,EAAO,CACzC,GAAIpS,GAAkBoS,CAAK,EACzB,OAAA7qB,EAASsI,GAAUuiB,EAAM,OAAQ7qB,CAAM,EAChC,EAEX,CAAC,EACM4C,GAAU5C,EAAQ,SAASD,EAAO,CACvC,OAAOc,GAASlB,EAAO2B,GAAavB,CAAK,CAAC,CAC5C,CAAC,CACH,CAuBA,SAAS+qB,GAAUnrB,EAAOE,EAAU,CAClC,GAAI,EAAEF,GAASA,EAAM,QACnB,MAAO,CAAC,EAEV,IAAIa,EAASoqB,GAAMjrB,CAAK,EACxB,OAAIE,GAAY,KACPW,EAEFK,GAASL,EAAQ,SAASqqB,EAAO,CACtC,OAAOvrB,GAAMO,EAAUxL,EAAWw2B,CAAK,CACzC,CAAC,CACH,CAsBA,IAAIE,GAAU/Q,GAAS,SAASra,EAAOoB,EAAQ,CAC7C,OAAO0X,GAAkB9Y,CAAK,EAC1BmS,GAAenS,EAAOoB,CAAM,EAC5B,CAAC,CACP,CAAC,EAoBGiqB,GAAMhR,GAAS,SAAS1F,EAAQ,CAClC,OAAOmI,GAAQnc,GAAYgU,EAAQmE,EAAiB,CAAC,CACvD,CAAC,EAyBGwS,GAAQjR,GAAS,SAAS1F,EAAQ,CACpC,IAAIzU,EAAWkV,GAAKT,CAAM,EAC1B,OAAImE,GAAkB5Y,CAAQ,IAC5BA,EAAWxL,GAENooB,GAAQnc,GAAYgU,EAAQmE,EAAiB,EAAGO,GAAYnZ,EAAU,CAAC,CAAC,CACjF,CAAC,EAuBGqrB,GAAUlR,GAAS,SAAS1F,EAAQ,CACtC,IAAI1T,EAAamU,GAAKT,CAAM,EAC5B,OAAA1T,EAAa,OAAOA,GAAc,WAAaA,EAAavM,EACrDooB,GAAQnc,GAAYgU,EAAQmE,EAAiB,EAAGpkB,EAAWuM,CAAU,CAC9E,CAAC,EAkBGuqB,GAAMnR,GAAS4Q,EAAK,EAkBxB,SAASQ,GAAUroB,EAAOhC,EAAQ,CAChC,OAAO2b,GAAc3Z,GAAS,CAAC,EAAGhC,GAAU,CAAC,EAAGkO,EAAW,CAC7D,CAiBA,SAASoc,GAActoB,EAAOhC,EAAQ,CACpC,OAAO2b,GAAc3Z,GAAS,CAAC,EAAGhC,GAAU,CAAC,EAAGsY,EAAO,CACzD,CAsBA,IAAIiS,GAAUtR,GAAS,SAAS1F,EAAQ,CACtC,IAAItU,EAASsU,EAAO,OAChBzU,EAAWG,EAAS,EAAIsU,EAAOtU,EAAS,CAAC,EAAI3L,EAEjD,OAAAwL,EAAW,OAAOA,GAAY,YAAcyU,EAAO,IAAI,EAAGzU,GAAYxL,EAC/Dy2B,GAAUxW,EAAQzU,CAAQ,CACnC,CAAC,EAiCD,SAAS0rB,GAAMtrB,EAAO,CACpB,IAAIO,EAASqJ,GAAO5J,CAAK,EACzB,OAAAO,EAAO,UAAY,GACZA,CACT,CAyBA,SAASgrB,GAAIvrB,EAAOwrB,EAAa,CAC/B,OAAAA,EAAYxrB,CAAK,EACVA,CACT,CAyBA,SAASyrB,GAAKzrB,EAAOwrB,EAAa,CAChC,OAAOA,EAAYxrB,CAAK,CAC1B,CAkBA,IAAI0rB,GAAYrK,GAAS,SAAS1R,EAAO,CACvC,IAAI5P,EAAS4P,EAAM,OACf1E,EAAQlL,EAAS4P,EAAM,CAAC,EAAI,EAC5B3P,EAAQ,KAAK,YACbwrB,EAAc,SAASnpB,GAAQ,CAAE,OAAOqN,GAAOrN,GAAQsN,CAAK,CAAG,EAEnE,OAAI5P,EAAS,GAAK,KAAK,YAAY,QAC/B,EAAEC,aAAiB+J,KAAgB,CAACuE,GAAQrD,CAAK,EAC5C,KAAK,KAAKugB,CAAW,GAE9BxrB,EAAQA,EAAM,MAAMiL,EAAO,CAACA,GAASlL,EAAS,EAAI,EAAE,EACpDC,EAAM,YAAY,KAAK,CACrB,KAAQyrB,GACR,KAAQ,CAACD,CAAW,EACpB,QAAWp3B,CACb,CAAC,EACM,IAAI4V,GAAchK,EAAO,KAAK,SAAS,EAAE,KAAK,SAASN,GAAO,CACnE,OAAIK,GAAU,CAACL,GAAM,QACnBA,GAAM,KAAKtL,CAAS,EAEfsL,EACT,CAAC,EACH,CAAC,EA6BD,SAASisB,IAAe,CACtB,OAAOL,GAAM,IAAI,CACnB,CA4BA,SAASM,IAAgB,CACvB,OAAO,IAAI5hB,GAAc,KAAK,MAAM,EAAG,KAAK,SAAS,CACvD,CAwBA,SAAS6hB,IAAc,CACjB,KAAK,aAAez3B,IACtB,KAAK,WAAa03B,GAAQ,KAAK,MAAM,CAAC,GAExC,IAAIC,EAAO,KAAK,WAAa,KAAK,WAAW,OACzC/rB,EAAQ+rB,EAAO33B,EAAY,KAAK,WAAW,KAAK,WAAW,EAE/D,MAAO,CAAE,KAAQ23B,EAAM,MAAS/rB,CAAM,CACxC,CAoBA,SAASgsB,IAAoB,CAC3B,OAAO,IACT,CA0BA,SAASC,GAAajsB,EAAO,CAI3B,QAHIO,EACAsU,EAAS,KAENA,aAAkBxK,IAAY,CACnC,IAAI6hB,EAAQjiB,GAAa4K,CAAM,EAC/BqX,EAAM,UAAY,EAClBA,EAAM,WAAa93B,EACfmM,EACFmZ,EAAS,YAAcwS,EAEvB3rB,EAAS2rB,EAEX,IAAIxS,EAAWwS,EACfrX,EAASA,EAAO,WAClB,CACA,OAAA6E,EAAS,YAAc1Z,EAChBO,CACT,CAsBA,SAAS4rB,IAAiB,CACxB,IAAInsB,EAAQ,KAAK,YACjB,GAAIA,aAAiB+J,GAAa,CAChC,IAAIqiB,EAAUpsB,EACd,OAAI,KAAK,YAAY,SACnBosB,EAAU,IAAIriB,GAAY,IAAI,GAEhCqiB,EAAUA,EAAQ,QAAQ,EAC1BA,EAAQ,YAAY,KAAK,CACvB,KAAQX,GACR,KAAQ,CAACnC,EAAO,EAChB,QAAWl1B,CACb,CAAC,EACM,IAAI4V,GAAcoiB,EAAS,KAAK,SAAS,CAClD,CACA,OAAO,KAAK,KAAK9C,EAAO,CAC1B,CAgBA,SAAS+C,IAAe,CACtB,OAAO/gB,GAAiB,KAAK,YAAa,KAAK,WAAW,CAC5D,CA0BA,IAAIghB,GAAU/M,GAAiB,SAAShf,EAAQP,EAAO4B,EAAK,CACtD0E,GAAe,KAAK/F,EAAQqB,CAAG,EACjC,EAAErB,EAAOqB,CAAG,EAEZmN,GAAgBxO,EAAQqB,EAAK,CAAC,CAElC,CAAC,EA2CD,SAAS2qB,GAAM7qB,EAAYtB,EAAWwf,EAAO,CAC3C,IAAItgB,EAAOwK,GAAQpI,CAAU,EAAIvB,GAAamS,GAC9C,OAAIsN,GAASC,GAAene,EAAYtB,EAAWwf,CAAK,IACtDxf,EAAYhM,GAEPkL,EAAKoC,EAAYqX,GAAY3Y,EAAW,CAAC,CAAC,CACnD,CA2CA,SAASosB,GAAO9qB,EAAYtB,EAAW,CACrC,IAAId,EAAOwK,GAAQpI,CAAU,EAAIrB,GAAcuS,GAC/C,OAAOtT,EAAKoC,EAAYqX,GAAY3Y,EAAW,CAAC,CAAC,CACnD,CAsCA,IAAIqsB,GAAOvL,GAAW+G,EAAS,EAqB3ByE,GAAWxL,GAAWgH,EAAa,EAuBvC,SAASyE,GAAQjrB,EAAY9B,EAAU,CACrC,OAAOiT,GAAYvO,GAAI5C,EAAY9B,CAAQ,EAAG,CAAC,CACjD,CAsBA,SAASgtB,GAAYlrB,EAAY9B,EAAU,CACzC,OAAOiT,GAAYvO,GAAI5C,EAAY9B,CAAQ,EAAGzJ,CAAQ,CACxD,CAuBA,SAAS02B,GAAanrB,EAAY9B,EAAUkT,EAAO,CACjD,OAAAA,EAAQA,IAAU1e,EAAY,EAAIse,GAAUI,CAAK,EAC1CD,GAAYvO,GAAI5C,EAAY9B,CAAQ,EAAGkT,CAAK,CACrD,CAgCA,SAASga,GAAQprB,EAAY9B,EAAU,CACrC,IAAIN,EAAOwK,GAAQpI,CAAU,EAAIzB,GAAYkP,GAC7C,OAAO7P,EAAKoC,EAAYqX,GAAYnZ,EAAU,CAAC,CAAC,CAClD,CAsBA,SAASmtB,GAAarrB,EAAY9B,EAAU,CAC1C,IAAIN,EAAOwK,GAAQpI,CAAU,EAAIxB,GAAiBkS,GAClD,OAAO9S,EAAKoC,EAAYqX,GAAYnZ,EAAU,CAAC,CAAC,CAClD,CAyBA,IAAIotB,GAAUzN,GAAiB,SAAShf,EAAQP,EAAO4B,EAAK,CACtD0E,GAAe,KAAK/F,EAAQqB,CAAG,EACjCrB,EAAOqB,CAAG,EAAE,KAAK5B,CAAK,EAEtB+O,GAAgBxO,EAAQqB,EAAK,CAAC5B,CAAK,CAAC,CAExC,CAAC,EAgCD,SAAS8R,GAASpQ,EAAY1B,EAAO8B,EAAW8d,EAAO,CACrDle,EAAaiW,GAAYjW,CAAU,EAAIA,EAAaZ,GAAOY,CAAU,EACrEI,EAAaA,GAAa,CAAC8d,EAASlN,GAAU5Q,CAAS,EAAI,EAE3D,IAAI/B,EAAS2B,EAAW,OACxB,OAAII,EAAY,IACdA,EAAYuG,GAAUtI,EAAS+B,EAAW,CAAC,GAEtCmrB,GAASvrB,CAAU,EACrBI,GAAa/B,GAAU2B,EAAW,QAAQ1B,EAAO8B,CAAS,EAAI,GAC9D,CAAC,CAAC/B,GAAUU,GAAYiB,EAAY1B,EAAO8B,CAAS,EAAI,EAC/D,CAyBA,IAAIorB,GAAYnT,GAAS,SAASrY,EAAY6R,EAAM/T,EAAM,CACxD,IAAIM,EAAQ,GACR6Q,EAAS,OAAO4C,GAAQ,WACxBhT,GAASoX,GAAYjW,CAAU,EAAI8D,GAAM9D,EAAW,MAAM,EAAI,CAAC,EAEnE,OAAAyN,GAASzN,EAAY,SAAS1B,GAAO,CACnCO,GAAO,EAAET,CAAK,EAAI6Q,EAAStR,GAAMkU,EAAMvT,GAAOR,CAAI,EAAIoV,GAAW5U,GAAOuT,EAAM/T,CAAI,CACpF,CAAC,EACMe,EACT,CAAC,EA8BG4sB,GAAQ5N,GAAiB,SAAShf,EAAQP,EAAO4B,EAAK,CACxDmN,GAAgBxO,EAAQqB,EAAK5B,CAAK,CACpC,CAAC,EA4CD,SAASsE,GAAI5C,EAAY9B,EAAU,CACjC,IAAIN,EAAOwK,GAAQpI,CAAU,EAAId,GAAW8W,GAC5C,OAAOpY,EAAKoC,EAAYqX,GAAYnZ,EAAU,CAAC,CAAC,CAClD,CA+BA,SAASwtB,GAAQ1rB,EAAYyJ,EAAW2N,EAAQ8G,EAAO,CACrD,OAAIle,GAAc,KACT,CAAC,GAELoI,GAAQqB,CAAS,IACpBA,EAAYA,GAAa,KAAO,CAAC,EAAI,CAACA,CAAS,GAEjD2N,EAAS8G,EAAQxrB,EAAY0kB,EACxBhP,GAAQgP,CAAM,IACjBA,EAASA,GAAU,KAAO,CAAC,EAAI,CAACA,CAAM,GAEjCD,GAAYnX,EAAYyJ,EAAW2N,CAAM,EAClD,CAsCA,IAAIuU,GAAY9N,GAAiB,SAAShf,EAAQP,EAAO4B,EAAK,CAC5DrB,EAAOqB,EAAM,EAAI,CAAC,EAAE,KAAK5B,CAAK,CAChC,EAAG,UAAW,CAAE,MAAO,CAAC,CAAC,EAAG,CAAC,CAAC,CAAG,CAAC,EAuClC,SAASstB,GAAO5rB,EAAY9B,EAAUC,EAAa,CACjD,IAAIP,EAAOwK,GAAQpI,CAAU,EAAIV,GAAcuB,GAC3CtB,EAAY,UAAU,OAAS,EAEnC,OAAO3B,EAAKoC,EAAYqX,GAAYnZ,EAAU,CAAC,EAAGC,EAAaoB,EAAWkO,EAAQ,CACpF,CAwBA,SAASoe,GAAY7rB,EAAY9B,EAAUC,EAAa,CACtD,IAAIP,EAAOwK,GAAQpI,CAAU,EAAIR,GAAmBqB,GAChDtB,EAAY,UAAU,OAAS,EAEnC,OAAO3B,EAAKoC,EAAYqX,GAAYnZ,EAAU,CAAC,EAAGC,EAAaoB,EAAWmR,EAAa,CACzF,CAoCA,SAASob,GAAO9rB,EAAYtB,EAAW,CACrC,IAAId,EAAOwK,GAAQpI,CAAU,EAAIrB,GAAcuS,GAC/C,OAAOtT,EAAKoC,EAAY+rB,GAAO1U,GAAY3Y,EAAW,CAAC,CAAC,CAAC,CAC3D,CAgBA,SAASstB,GAAOhsB,EAAY,CAC1B,IAAIpC,EAAOwK,GAAQpI,CAAU,EAAI6M,GAAc2L,GAC/C,OAAO5a,EAAKoC,CAAU,CACxB,CAsBA,SAASisB,GAAWjsB,EAAYkB,EAAGgd,EAAO,EACnCA,EAAQC,GAAene,EAAYkB,EAAGgd,CAAK,EAAIhd,IAAMxO,GACxDwO,EAAI,EAEJA,EAAI8P,GAAU9P,CAAC,EAEjB,IAAItD,EAAOwK,GAAQpI,CAAU,EAAI+M,GAAkB0L,GACnD,OAAO7a,EAAKoC,EAAYkB,CAAC,CAC3B,CAiBA,SAASgrB,GAAQlsB,EAAY,CAC3B,IAAIpC,EAAOwK,GAAQpI,CAAU,EAAIkN,GAAe4L,GAChD,OAAOlb,EAAKoC,CAAU,CACxB,CAuBA,SAASwL,GAAKxL,EAAY,CACxB,GAAIA,GAAc,KAChB,MAAO,GAET,GAAIiW,GAAYjW,CAAU,EACxB,OAAOurB,GAASvrB,CAAU,EAAIqD,GAAWrD,CAAU,EAAIA,EAAW,OAEpE,IAAI+O,EAAMC,GAAOhP,CAAU,EAC3B,OAAI+O,GAAOrZ,IAAUqZ,GAAO9Y,GACnB+J,EAAW,KAEb0V,GAAS1V,CAAU,EAAE,MAC9B,CAsCA,SAASmsB,GAAKnsB,EAAYtB,EAAWwf,EAAO,CAC1C,IAAItgB,EAAOwK,GAAQpI,CAAU,EAAIP,GAAYuZ,GAC7C,OAAIkF,GAASC,GAAene,EAAYtB,EAAWwf,CAAK,IACtDxf,EAAYhM,GAEPkL,EAAKoC,EAAYqX,GAAY3Y,EAAW,CAAC,CAAC,CACnD,CA+BA,IAAI0tB,GAAS/T,GAAS,SAASrY,EAAYyJ,EAAW,CACpD,GAAIzJ,GAAc,KAChB,MAAO,CAAC,EAEV,IAAI3B,EAASoL,EAAU,OACvB,OAAIpL,EAAS,GAAK8f,GAAene,EAAYyJ,EAAU,CAAC,EAAGA,EAAU,CAAC,CAAC,EACrEA,EAAY,CAAC,EACJpL,EAAS,GAAK8f,GAAe1U,EAAU,CAAC,EAAGA,EAAU,CAAC,EAAGA,EAAU,CAAC,CAAC,IAC9EA,EAAY,CAACA,EAAU,CAAC,CAAC,GAEpB0N,GAAYnX,EAAYmR,GAAY1H,EAAW,CAAC,EAAG,CAAC,CAAC,CAC9D,CAAC,EAoBG4iB,GAAMnmB,IAAU,UAAW,CAC7B,OAAOpJ,GAAK,KAAK,IAAI,CACvB,EA4BA,SAASwvB,GAAMprB,EAAGtD,EAAM,CACtB,GAAI,OAAOA,GAAQ,WACjB,MAAM,IAAI0G,GAAUxR,CAAe,EAErC,OAAAoO,EAAI8P,GAAU9P,CAAC,EACR,UAAW,CAChB,GAAI,EAAEA,EAAI,EACR,OAAOtD,EAAK,MAAM,KAAM,SAAS,CAErC,CACF,CAmBA,SAASyiB,GAAIziB,EAAMsD,EAAGgd,EAAO,CAC3B,OAAAhd,EAAIgd,EAAQxrB,EAAYwO,EACxBA,EAAKtD,GAAQsD,GAAK,KAAQtD,EAAK,OAASsD,EACjCshB,GAAW5kB,EAAM7J,EAAerB,EAAWA,EAAWA,EAAWA,EAAWwO,CAAC,CACtF,CAmBA,SAASqrB,GAAOrrB,EAAGtD,EAAM,CACvB,IAAIiB,EACJ,GAAI,OAAOjB,GAAQ,WACjB,MAAM,IAAI0G,GAAUxR,CAAe,EAErC,OAAAoO,EAAI8P,GAAU9P,CAAC,EACR,UAAW,CAChB,MAAI,EAAEA,EAAI,IACRrC,EAASjB,EAAK,MAAM,KAAM,SAAS,GAEjCsD,GAAK,IACPtD,EAAOlL,GAEFmM,CACT,CACF,CAqCA,IAAI2tB,GAAOnU,GAAS,SAASza,EAAMC,EAAS+e,EAAU,CACpD,IAAIpO,EAAUhb,EACd,GAAIopB,EAAS,OAAQ,CACnB,IAAIC,EAAU7Z,GAAe4Z,EAAUyC,GAAUmN,EAAI,CAAC,EACtDhe,GAAW3a,CACb,CACA,OAAO2uB,GAAW5kB,EAAM4Q,EAAS3Q,EAAS+e,EAAUC,CAAO,CAC7D,CAAC,EA+CG4P,GAAUpU,GAAS,SAAS1X,EAAQT,EAAK0c,EAAU,CACrD,IAAIpO,EAAUhb,EAAiBC,EAC/B,GAAImpB,EAAS,OAAQ,CACnB,IAAIC,EAAU7Z,GAAe4Z,EAAUyC,GAAUoN,EAAO,CAAC,EACzDje,GAAW3a,CACb,CACA,OAAO2uB,GAAWtiB,EAAKsO,EAAS7N,EAAQic,EAAUC,CAAO,CAC3D,CAAC,EA2CD,SAAS6P,GAAM9uB,EAAMwhB,EAAOlB,EAAO,CACjCkB,EAAQlB,EAAQxrB,EAAY0sB,EAC5B,IAAIvgB,EAAS2jB,GAAW5kB,EAAMjK,EAAiBjB,EAAWA,EAAWA,EAAWA,EAAWA,EAAW0sB,CAAK,EAC3G,OAAAvgB,EAAO,YAAc6tB,GAAM,YACpB7tB,CACT,CAwCA,SAAS8tB,GAAW/uB,EAAMwhB,EAAOlB,EAAO,CACtCkB,EAAQlB,EAAQxrB,EAAY0sB,EAC5B,IAAIvgB,EAAS2jB,GAAW5kB,EAAMhK,EAAuBlB,EAAWA,EAAWA,EAAWA,EAAWA,EAAW0sB,CAAK,EACjH,OAAAvgB,EAAO,YAAc8tB,GAAW,YACzB9tB,CACT,CAwDA,SAAS+tB,GAAShvB,EAAMqS,EAAM4c,EAAS,CACrC,IAAIC,EACAC,EACAC,GACAnuB,GACAouB,GACAC,GACAC,GAAiB,EACjBC,GAAU,GACVC,GAAS,GACTxO,GAAW,GAEf,GAAI,OAAOjhB,GAAQ,WACjB,MAAM,IAAI0G,GAAUxR,CAAe,EAErCmd,EAAOyR,GAASzR,CAAI,GAAK,EACrBvH,GAASmkB,CAAO,IAClBO,GAAU,CAAC,CAACP,EAAQ,QACpBQ,GAAS,YAAaR,EACtBG,GAAUK,GAAS1mB,GAAU+a,GAASmL,EAAQ,OAAO,GAAK,EAAG5c,CAAI,EAAI+c,GACrEnO,GAAW,aAAcgO,EAAU,CAAC,CAACA,EAAQ,SAAWhO,IAG1D,SAASyO,GAAWC,GAAM,CACxB,IAAIzvB,GAAOgvB,EACPjvB,GAAUkvB,EAEd,OAAAD,EAAWC,EAAWr6B,EACtBy6B,GAAiBI,GACjB1uB,GAASjB,EAAK,MAAMC,GAASC,EAAI,EAC1Be,EACT,CAEA,SAAS2uB,GAAYD,GAAM,CAEzB,OAAAJ,GAAiBI,GAEjBN,GAAU/c,GAAWud,GAAcxd,CAAI,EAEhCmd,GAAUE,GAAWC,EAAI,EAAI1uB,EACtC,CAEA,SAAS6uB,GAAcH,GAAM,CAC3B,IAAII,GAAoBJ,GAAOL,GAC3BU,GAAsBL,GAAOJ,GAC7BU,GAAc5d,EAAO0d,GAEzB,OAAON,GACHzmB,GAAUinB,GAAab,GAAUY,EAAmB,EACpDC,EACN,CAEA,SAASC,GAAaP,GAAM,CAC1B,IAAII,GAAoBJ,GAAOL,GAC3BU,GAAsBL,GAAOJ,GAKjC,OAAQD,KAAiBx6B,GAAci7B,IAAqB1d,GACzD0d,GAAoB,GAAON,IAAUO,IAAuBZ,EACjE,CAEA,SAASS,IAAe,CACtB,IAAIF,GAAOlB,GAAI,EACf,GAAIyB,GAAaP,EAAI,EACnB,OAAOQ,GAAaR,EAAI,EAG1BN,GAAU/c,GAAWud,GAAcC,GAAcH,EAAI,CAAC,CACxD,CAEA,SAASQ,GAAaR,GAAM,CAK1B,OAJAN,GAAUv6B,EAINmsB,IAAYiO,EACPQ,GAAWC,EAAI,GAExBT,EAAWC,EAAWr6B,EACfmM,GACT,CAEA,SAASmvB,IAAS,CACZf,KAAYv6B,GACd8oB,GAAayR,EAAO,EAEtBE,GAAiB,EACjBL,EAAWI,GAAeH,EAAWE,GAAUv6B,CACjD,CAEA,SAASu7B,IAAQ,CACf,OAAOhB,KAAYv6B,EAAYmM,GAASkvB,GAAa1B,GAAI,CAAC,CAC5D,CAEA,SAAS6B,IAAY,CACnB,IAAIX,GAAOlB,GAAI,EACX8B,GAAaL,GAAaP,EAAI,EAMlC,GAJAT,EAAW,UACXC,EAAW,KACXG,GAAeK,GAEXY,GAAY,CACd,GAAIlB,KAAYv6B,EACd,OAAO86B,GAAYN,EAAY,EAEjC,GAAIG,GAEF,OAAA7R,GAAayR,EAAO,EACpBA,GAAU/c,GAAWud,GAAcxd,CAAI,EAChCqd,GAAWJ,EAAY,CAElC,CACA,OAAID,KAAYv6B,IACdu6B,GAAU/c,GAAWud,GAAcxd,CAAI,GAElCpR,EACT,CACA,OAAAqvB,GAAU,OAASF,GACnBE,GAAU,MAAQD,GACXC,EACT,CAoBA,IAAIE,GAAQ/V,GAAS,SAASza,EAAME,EAAM,CACxC,OAAOkS,GAAUpS,EAAM,EAAGE,CAAI,CAChC,CAAC,EAqBGuwB,GAAQhW,GAAS,SAASza,EAAMqS,EAAMnS,EAAM,CAC9C,OAAOkS,GAAUpS,EAAM8jB,GAASzR,CAAI,GAAK,EAAGnS,CAAI,CAClD,CAAC,EAoBD,SAASwwB,GAAK1wB,EAAM,CAClB,OAAO4kB,GAAW5kB,EAAM3J,CAAc,CACxC,CA8CA,SAAS2wB,GAAQhnB,EAAM2wB,EAAU,CAC/B,GAAI,OAAO3wB,GAAQ,YAAe2wB,GAAY,MAAQ,OAAOA,GAAY,WACvE,MAAM,IAAIjqB,GAAUxR,CAAe,EAErC,IAAI07B,EAAW,UAAW,CACxB,IAAI1wB,EAAO,UACPoC,EAAMquB,EAAWA,EAAS,MAAM,KAAMzwB,CAAI,EAAIA,EAAK,CAAC,EACpD4D,GAAQ8sB,EAAS,MAErB,GAAI9sB,GAAM,IAAIxB,CAAG,EACf,OAAOwB,GAAM,IAAIxB,CAAG,EAEtB,IAAIrB,GAASjB,EAAK,MAAM,KAAME,CAAI,EAClC,OAAA0wB,EAAS,MAAQ9sB,GAAM,IAAIxB,EAAKrB,EAAM,GAAK6C,GACpC7C,EACT,EACA,OAAA2vB,EAAS,MAAQ,IAAK5J,GAAQ,OAAS3Z,IAChCujB,CACT,CAGA5J,GAAQ,MAAQ3Z,GAsBhB,SAAS8gB,GAAOrtB,EAAW,CACzB,GAAI,OAAOA,GAAa,WACtB,MAAM,IAAI4F,GAAUxR,CAAe,EAErC,OAAO,UAAW,CAChB,IAAIgL,EAAO,UACX,OAAQA,EAAK,OAAQ,CACnB,IAAK,GAAG,MAAO,CAACY,EAAU,KAAK,IAAI,EACnC,IAAK,GAAG,MAAO,CAACA,EAAU,KAAK,KAAMZ,EAAK,CAAC,CAAC,EAC5C,IAAK,GAAG,MAAO,CAACY,EAAU,KAAK,KAAMZ,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,EACrD,IAAK,GAAG,MAAO,CAACY,EAAU,KAAK,KAAMZ,EAAK,CAAC,EAAGA,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,CAChE,CACA,MAAO,CAACY,EAAU,MAAM,KAAMZ,CAAI,CACpC,CACF,CAoBA,SAAS2wB,GAAK7wB,EAAM,CAClB,OAAO2uB,GAAO,EAAG3uB,CAAI,CACvB,CAiCA,IAAI8wB,GAAWpT,GAAS,SAAS1d,EAAMsmB,EAAY,CACjDA,EAAcA,EAAW,QAAU,GAAK9b,GAAQ8b,EAAW,CAAC,CAAC,EACzDhlB,GAASglB,EAAW,CAAC,EAAG3iB,GAAU8V,GAAY,CAAC,CAAC,EAChDnY,GAASiS,GAAY+S,EAAY,CAAC,EAAG3iB,GAAU8V,GAAY,CAAC,CAAC,EAEjE,IAAIsX,EAAczK,EAAW,OAC7B,OAAO7L,GAAS,SAASva,EAAM,CAI7B,QAHIM,EAAQ,GACRC,GAASuI,GAAU9I,EAAK,OAAQ6wB,CAAW,EAExC,EAAEvwB,EAAQC,IACfP,EAAKM,CAAK,EAAI8lB,EAAW9lB,CAAK,EAAE,KAAK,KAAMN,EAAKM,CAAK,CAAC,EAExD,OAAOT,GAAMC,EAAM,KAAME,CAAI,CAC/B,CAAC,CACH,CAAC,EAmCG8wB,GAAUvW,GAAS,SAASza,EAAMgf,EAAU,CAC9C,IAAIC,EAAU7Z,GAAe4Z,EAAUyC,GAAUuP,EAAO,CAAC,EACzD,OAAOpM,GAAW5kB,EAAM/J,EAAmBnB,EAAWkqB,EAAUC,CAAO,CACzE,CAAC,EAkCGgS,GAAexW,GAAS,SAASza,EAAMgf,EAAU,CACnD,IAAIC,EAAU7Z,GAAe4Z,EAAUyC,GAAUwP,EAAY,CAAC,EAC9D,OAAOrM,GAAW5kB,EAAM9J,EAAyBpB,EAAWkqB,EAAUC,CAAO,CAC/E,CAAC,EAwBGiS,GAAQnP,GAAS,SAAS/hB,EAAMma,EAAS,CAC3C,OAAOyK,GAAW5kB,EAAM5J,EAAiBtB,EAAWA,EAAWA,EAAWqlB,CAAO,CACnF,CAAC,EA2BD,SAASgX,GAAKnxB,EAAM2L,EAAO,CACzB,GAAI,OAAO3L,GAAQ,WACjB,MAAM,IAAI0G,GAAUxR,CAAe,EAErC,OAAAyW,EAAQA,IAAU7W,EAAY6W,EAAQyH,GAAUzH,CAAK,EAC9C8O,GAASza,EAAM2L,CAAK,CAC7B,CAoCA,SAASylB,GAAOpxB,EAAM2L,EAAO,CAC3B,GAAI,OAAO3L,GAAQ,WACjB,MAAM,IAAI0G,GAAUxR,CAAe,EAErC,OAAAyW,EAAQA,GAAS,KAAO,EAAI5C,GAAUqK,GAAUzH,CAAK,EAAG,CAAC,EAClD8O,GAAS,SAASva,EAAM,CAC7B,IAAIE,EAAQF,EAAKyL,CAAK,EAClByb,EAAYzJ,GAAUzd,EAAM,EAAGyL,CAAK,EAExC,OAAIvL,GACFmB,GAAU6lB,EAAWhnB,CAAK,EAErBL,GAAMC,EAAM,KAAMonB,CAAS,CACpC,CAAC,CACH,CA8CA,SAASiK,GAASrxB,EAAMqS,EAAM4c,EAAS,CACrC,IAAIO,EAAU,GACVvO,EAAW,GAEf,GAAI,OAAOjhB,GAAQ,WACjB,MAAM,IAAI0G,GAAUxR,CAAe,EAErC,OAAI4V,GAASmkB,CAAO,IAClBO,EAAU,YAAaP,EAAU,CAAC,CAACA,EAAQ,QAAUO,EACrDvO,EAAW,aAAcgO,EAAU,CAAC,CAACA,EAAQ,SAAWhO,GAEnD+N,GAAShvB,EAAMqS,EAAM,CAC1B,QAAWmd,EACX,QAAWnd,EACX,SAAY4O,CACd,CAAC,CACH,CAiBA,SAASqQ,GAAMtxB,EAAM,CACnB,OAAOyiB,GAAIziB,EAAM,CAAC,CACpB,CAwBA,SAASuxB,GAAK7wB,EAAOmgB,EAAS,CAC5B,OAAOmQ,GAAQzT,GAAasD,CAAO,EAAGngB,CAAK,CAC7C,CAqCA,SAAS8wB,IAAY,CACnB,GAAI,CAAC,UAAU,OACb,MAAO,CAAC,EAEV,IAAI9wB,EAAQ,UAAU,CAAC,EACvB,OAAO8J,GAAQ9J,CAAK,EAAIA,EAAQ,CAACA,CAAK,CACxC,CA4BA,SAASksB,GAAMlsB,EAAO,CACpB,OAAOiQ,GAAUjQ,EAAOjL,CAAkB,CAC5C,CAiCA,SAASg8B,GAAU/wB,EAAOmQ,EAAY,CACpC,OAAAA,EAAa,OAAOA,GAAc,WAAaA,EAAa/b,EACrD6b,GAAUjQ,EAAOjL,EAAoBob,CAAU,CACxD,CAoBA,SAAS6gB,GAAUhxB,EAAO,CACxB,OAAOiQ,GAAUjQ,EAAOnL,EAAkBE,CAAkB,CAC9D,CA8BA,SAASk8B,GAAcjxB,EAAOmQ,EAAY,CACxC,OAAAA,EAAa,OAAOA,GAAc,WAAaA,EAAa/b,EACrD6b,GAAUjQ,EAAOnL,EAAkBE,EAAoBob,CAAU,CAC1E,CA0BA,SAAS+gB,GAAW7uB,EAAQgN,EAAQ,CAClC,OAAOA,GAAU,MAAQoC,GAAepP,EAAQgN,EAAQE,GAAKF,CAAM,CAAC,CACtE,CAkCA,SAASP,GAAG9O,EAAOgU,EAAO,CACxB,OAAOhU,IAAUgU,GAAUhU,IAAUA,GAASgU,IAAUA,CAC1D,CAyBA,IAAImd,GAAKhO,GAA0BpP,EAAM,EAyBrCqd,GAAMjO,GAA0B,SAASnjB,EAAOgU,EAAO,CACzD,OAAOhU,GAASgU,CAClB,CAAC,EAoBGhG,GAAc+G,IAAgB,UAAW,CAAE,OAAO,SAAW,GAAE,CAAC,EAAIA,GAAkB,SAAS/U,EAAO,CACxG,OAAO6J,GAAa7J,CAAK,GAAKsG,GAAe,KAAKtG,EAAO,QAAQ,GAC/D,CAACoH,GAAqB,KAAKpH,EAAO,QAAQ,CAC9C,EAyBI8J,GAAUtE,GAAM,QAmBhB6rB,GAAgBtyB,GAAoBkE,GAAUlE,EAAiB,EAAIiW,GA2BvE,SAAS2C,GAAY3X,EAAO,CAC1B,OAAOA,GAAS,MAAQ8W,GAAS9W,EAAM,MAAM,GAAK,CAACqT,GAAWrT,CAAK,CACrE,CA2BA,SAASwY,GAAkBxY,EAAO,CAChC,OAAO6J,GAAa7J,CAAK,GAAK2X,GAAY3X,CAAK,CACjD,CAmBA,SAASsxB,GAAUtxB,EAAO,CACxB,OAAOA,IAAU,IAAQA,IAAU,IAChC6J,GAAa7J,CAAK,GAAK4T,GAAW5T,CAAK,GAAKlJ,CACjD,CAmBA,IAAIoX,GAAWjG,IAAkBme,GAmB7BmL,GAASvyB,GAAaiE,GAAUjE,EAAU,EAAIiW,GAmBlD,SAASuc,GAAUxxB,EAAO,CACxB,OAAO6J,GAAa7J,CAAK,GAAKA,EAAM,WAAa,GAAK,CAAC0Y,GAAc1Y,CAAK,CAC5E,CAmCA,SAASyxB,GAAQzxB,EAAO,CACtB,GAAIA,GAAS,KACX,MAAO,GAET,GAAI2X,GAAY3X,CAAK,IAChB8J,GAAQ9J,CAAK,GAAK,OAAOA,GAAS,UAAY,OAAOA,EAAM,QAAU,YACpEkO,GAASlO,CAAK,GAAKoO,GAAapO,CAAK,GAAKgO,GAAYhO,CAAK,GAC/D,MAAO,CAACA,EAAM,OAEhB,IAAIyQ,EAAMC,GAAO1Q,CAAK,EACtB,GAAIyQ,GAAOrZ,IAAUqZ,GAAO9Y,GAC1B,MAAO,CAACqI,EAAM,KAEhB,GAAIqX,GAAYrX,CAAK,EACnB,MAAO,CAACoX,GAASpX,CAAK,EAAE,OAE1B,QAAS4B,KAAO5B,EACd,GAAIsG,GAAe,KAAKtG,EAAO4B,CAAG,EAChC,MAAO,GAGX,MAAO,EACT,CA8BA,SAAS8vB,GAAQ1xB,EAAOgU,EAAO,CAC7B,OAAOkB,GAAYlV,EAAOgU,CAAK,CACjC,CAkCA,SAAS2d,GAAY3xB,EAAOgU,EAAO7D,EAAY,CAC7CA,EAAa,OAAOA,GAAc,WAAaA,EAAa/b,EAC5D,IAAImM,EAAS4P,EAAaA,EAAWnQ,EAAOgU,CAAK,EAAI5f,EACrD,OAAOmM,IAAWnM,EAAY8gB,GAAYlV,EAAOgU,EAAO5f,EAAW+b,CAAU,EAAI,CAAC,CAAC5P,CACrF,CAoBA,SAASqxB,GAAQ5xB,EAAO,CACtB,GAAI,CAAC6J,GAAa7J,CAAK,EACrB,MAAO,GAET,IAAIyQ,EAAMmD,GAAW5T,CAAK,EAC1B,OAAOyQ,GAAOxZ,IAAYwZ,GAAOzZ,IAC9B,OAAOgJ,EAAM,SAAW,UAAY,OAAOA,EAAM,MAAQ,UAAY,CAAC0Y,GAAc1Y,CAAK,CAC9F,CA4BA,SAAS6xB,GAAS7xB,EAAO,CACvB,OAAO,OAAOA,GAAS,UAAYkI,GAAelI,CAAK,CACzD,CAmBA,SAASqT,GAAWrT,EAAO,CACzB,GAAI,CAACoK,GAASpK,CAAK,EACjB,MAAO,GAIT,IAAIyQ,EAAMmD,GAAW5T,CAAK,EAC1B,OAAOyQ,GAAOvZ,IAAWuZ,GAAOtZ,IAAUsZ,GAAO5Z,IAAY4Z,GAAOhZ,EACtE,CA4BA,SAASq6B,GAAU9xB,EAAO,CACxB,OAAO,OAAOA,GAAS,UAAYA,GAAS0S,GAAU1S,CAAK,CAC7D,CA4BA,SAAS8W,GAAS9W,EAAO,CACvB,OAAO,OAAOA,GAAS,UACrBA,EAAQ,IAAMA,EAAQ,GAAK,GAAKA,GAAS5J,CAC7C,CA2BA,SAASgU,GAASpK,EAAO,CACvB,IAAIyL,EAAO,OAAOzL,EAClB,OAAOA,GAAS,OAASyL,GAAQ,UAAYA,GAAQ,WACvD,CA0BA,SAAS5B,GAAa7J,EAAO,CAC3B,OAAOA,GAAS,MAAQ,OAAOA,GAAS,QAC1C,CAmBA,IAAIoR,GAAQnS,GAAYgE,GAAUhE,EAAS,EAAIkX,GA8B/C,SAAS4b,IAAQ1vB,EAAQgN,EAAQ,CAC/B,OAAOhN,IAAWgN,GAAU+G,GAAY/T,EAAQgN,EAAQuI,GAAavI,CAAM,CAAC,CAC9E,CAkCA,SAAS2iB,IAAY3vB,EAAQgN,EAAQc,EAAY,CAC/C,OAAAA,EAAa,OAAOA,GAAc,WAAaA,EAAa/b,EACrDgiB,GAAY/T,EAAQgN,EAAQuI,GAAavI,CAAM,EAAGc,CAAU,CACrE,CA8BA,SAAS8hB,IAAMjyB,EAAO,CAIpB,OAAOkyB,GAASlyB,CAAK,GAAKA,GAAS,CAACA,CACtC,CA4BA,SAASmyB,IAASnyB,EAAO,CACvB,GAAImmB,GAAWnmB,CAAK,EAClB,MAAM,IAAI0F,GAAMnR,CAAe,EAEjC,OAAOiiB,GAAaxW,CAAK,CAC3B,CAmBA,SAASoyB,IAAOpyB,EAAO,CACrB,OAAOA,IAAU,IACnB,CAsBA,SAASqyB,IAAMryB,EAAO,CACpB,OAAOA,GAAS,IAClB,CA4BA,SAASkyB,GAASlyB,EAAO,CACvB,OAAO,OAAOA,GAAS,UACpB6J,GAAa7J,CAAK,GAAK4T,GAAW5T,CAAK,GAAK3I,EACjD,CA8BA,SAASqhB,GAAc1Y,EAAO,CAC5B,GAAI,CAAC6J,GAAa7J,CAAK,GAAK4T,GAAW5T,CAAK,GAAKzI,GAC/C,MAAO,GAET,IAAI4S,EAAQjD,GAAalH,CAAK,EAC9B,GAAImK,IAAU,KACZ,MAAO,GAET,IAAI8V,EAAO3Z,GAAe,KAAK6D,EAAO,aAAa,GAAKA,EAAM,YAC9D,OAAO,OAAO8V,GAAQ,YAAcA,aAAgBA,GAClD5Z,GAAa,KAAK4Z,CAAI,GAAKtZ,EAC/B,CAmBA,IAAI2rB,GAAWpzB,GAAe+D,GAAU/D,EAAY,EAAIyX,GA6BxD,SAAS4b,IAAcvyB,EAAO,CAC5B,OAAO8xB,GAAU9xB,CAAK,GAAKA,GAAS,CAAC5J,GAAoB4J,GAAS5J,CACpE,CAmBA,IAAI8a,GAAQ/R,GAAY8D,GAAU9D,EAAS,EAAIyX,GAmB/C,SAASqW,GAASjtB,EAAO,CACvB,OAAO,OAAOA,GAAS,UACpB,CAAC8J,GAAQ9J,CAAK,GAAK6J,GAAa7J,CAAK,GAAK4T,GAAW5T,CAAK,GAAKpI,EACpE,CAmBA,SAAS4a,GAASxS,EAAO,CACvB,OAAO,OAAOA,GAAS,UACpB6J,GAAa7J,CAAK,GAAK4T,GAAW5T,CAAK,GAAKnI,EACjD,CAmBA,IAAIuW,GAAehP,GAAmB6D,GAAU7D,EAAgB,EAAIyX,GAmBpE,SAAS2b,IAAYxyB,EAAO,CAC1B,OAAOA,IAAU5L,CACnB,CAmBA,SAASq+B,IAAUzyB,EAAO,CACxB,OAAO6J,GAAa7J,CAAK,GAAK0Q,GAAO1Q,CAAK,GAAKjI,CACjD,CAmBA,SAAS26B,IAAU1yB,EAAO,CACxB,OAAO6J,GAAa7J,CAAK,GAAK4T,GAAW5T,CAAK,GAAKhI,CACrD,CAyBA,IAAI26B,IAAKxP,GAA0B1L,EAAM,EAyBrCmb,IAAMzP,GAA0B,SAASnjB,EAAOgU,EAAO,CACzD,OAAOhU,GAASgU,CAClB,CAAC,EAyBD,SAAS8X,GAAQ9rB,EAAO,CACtB,GAAI,CAACA,EACH,MAAO,CAAC,EAEV,GAAI2X,GAAY3X,CAAK,EACnB,OAAOitB,GAASjtB,CAAK,EAAIiF,GAAcjF,CAAK,EAAIwK,GAAUxK,CAAK,EAEjE,GAAIuH,IAAevH,EAAMuH,EAAW,EAClC,OAAOrD,GAAgBlE,EAAMuH,EAAW,EAAE,CAAC,EAE7C,IAAIkJ,EAAMC,GAAO1Q,CAAK,EAClBV,EAAOmR,GAAOrZ,GAASiN,GAAcoM,GAAO9Y,GAASgN,GAAa7D,GAEtE,OAAOxB,EAAKU,CAAK,CACnB,CAyBA,SAASkjB,GAASljB,EAAO,CACvB,GAAI,CAACA,EACH,OAAOA,IAAU,EAAIA,EAAQ,EAG/B,GADAA,EAAQojB,GAASpjB,CAAK,EAClBA,IAAU7J,GAAY6J,IAAU,CAAC7J,EAAU,CAC7C,IAAI08B,EAAQ7yB,EAAQ,EAAI,GAAK,EAC7B,OAAO6yB,EAAOx8B,CAChB,CACA,OAAO2J,IAAUA,EAAQA,EAAQ,CACnC,CA4BA,SAAS0S,GAAU1S,EAAO,CACxB,IAAIO,EAAS2iB,GAASljB,CAAK,EACvB8yB,EAAYvyB,EAAS,EAEzB,OAAOA,IAAWA,EAAUuyB,EAAYvyB,EAASuyB,EAAYvyB,EAAU,CACzE,CA6BA,SAASoS,GAAS3S,EAAO,CACvB,OAAOA,EAAQ2O,GAAU+D,GAAU1S,CAAK,EAAG,EAAGzJ,CAAgB,EAAI,CACpE,CAyBA,SAAS6sB,GAASpjB,EAAO,CACvB,GAAI,OAAOA,GAAS,SAClB,OAAOA,EAET,GAAIwS,GAASxS,CAAK,EAChB,OAAO1J,EAET,GAAI8T,GAASpK,CAAK,EAAG,CACnB,IAAIgU,EAAQ,OAAOhU,EAAM,SAAW,WAAaA,EAAM,QAAQ,EAAIA,EACnEA,EAAQoK,GAAS4J,CAAK,EAAKA,EAAQ,GAAMA,CAC3C,CACA,GAAI,OAAOhU,GAAS,SAClB,OAAOA,IAAU,EAAIA,EAAQ,CAACA,EAEhCA,EAAQ+C,GAAS/C,CAAK,EACtB,IAAI+yB,EAAWz4B,GAAW,KAAK0F,CAAK,EACpC,OAAQ+yB,GAAYv4B,GAAU,KAAKwF,CAAK,EACpC3B,GAAa2B,EAAM,MAAM,CAAC,EAAG+yB,EAAW,EAAI,CAAC,EAC5C14B,GAAW,KAAK2F,CAAK,EAAI1J,EAAM,CAAC0J,CACvC,CA0BA,SAAS2Y,GAAc3Y,EAAO,CAC5B,OAAOsP,GAAWtP,EAAOyP,GAAOzP,CAAK,CAAC,CACxC,CA0BA,SAASgzB,IAAchzB,EAAO,CAC5B,OAAOA,EACH2O,GAAU+D,GAAU1S,CAAK,EAAG,CAAC5J,EAAkBA,CAAgB,EAC9D4J,IAAU,EAAIA,EAAQ,CAC7B,CAuBA,SAAS+c,GAAS/c,EAAO,CACvB,OAAOA,GAAS,KAAO,GAAK4b,GAAa5b,CAAK,CAChD,CAoCA,IAAIizB,IAASxT,GAAe,SAASpd,EAAQgN,EAAQ,CACnD,GAAIgI,GAAYhI,CAAM,GAAKsI,GAAYtI,CAAM,EAAG,CAC9CC,GAAWD,EAAQE,GAAKF,CAAM,EAAGhN,CAAM,EACvC,MACF,CACA,QAAST,KAAOyN,EACV/I,GAAe,KAAK+I,EAAQzN,CAAG,GACjCoN,GAAY3M,EAAQT,EAAKyN,EAAOzN,CAAG,CAAC,CAG1C,CAAC,EAiCGsxB,GAAWzT,GAAe,SAASpd,EAAQgN,EAAQ,CACrDC,GAAWD,EAAQI,GAAOJ,CAAM,EAAGhN,CAAM,CAC3C,CAAC,EA+BG8wB,GAAe1T,GAAe,SAASpd,EAAQgN,EAAQ6I,EAAU/H,EAAY,CAC/Eb,GAAWD,EAAQI,GAAOJ,CAAM,EAAGhN,EAAQ8N,CAAU,CACvD,CAAC,EA8BGijB,IAAa3T,GAAe,SAASpd,EAAQgN,EAAQ6I,EAAU/H,EAAY,CAC7Eb,GAAWD,EAAQE,GAAKF,CAAM,EAAGhN,EAAQ8N,CAAU,CACrD,CAAC,EAmBGkjB,IAAKhS,GAAS3R,EAAM,EAoCxB,SAAS4jB,IAAOC,EAAWC,EAAY,CACrC,IAAIjzB,EAAS2J,GAAWqpB,CAAS,EACjC,OAAOC,GAAc,KAAOjzB,EAAS6O,GAAW7O,EAAQizB,CAAU,CACpE,CAuBA,IAAIC,IAAW1Z,GAAS,SAAS1X,EAAQsd,EAAS,CAChDtd,EAASwD,GAAOxD,CAAM,EAEtB,IAAIvC,EAAQ,GACRC,EAAS4f,EAAQ,OACjBC,EAAQ7f,EAAS,EAAI4f,EAAQ,CAAC,EAAIvrB,EAMtC,IAJIwrB,GAASC,GAAeF,EAAQ,CAAC,EAAGA,EAAQ,CAAC,EAAGC,CAAK,IACvD7f,EAAS,GAGJ,EAAED,EAAQC,GAMf,QALIsP,GAASsQ,EAAQ7f,CAAK,EACtBgD,GAAQ2M,GAAOJ,EAAM,EACrBqkB,GAAa,GACbC,GAAc7wB,GAAM,OAEjB,EAAE4wB,GAAaC,IAAa,CACjC,IAAI/xB,GAAMkB,GAAM4wB,EAAU,EACtB1zB,GAAQqC,EAAOT,EAAG,GAElB5B,KAAU5L,GACT0a,GAAG9O,GAAOmG,GAAYvE,EAAG,CAAC,GAAK,CAAC0E,GAAe,KAAKjE,EAAQT,EAAG,KAClES,EAAOT,EAAG,EAAIyN,GAAOzN,EAAG,EAE5B,CAGF,OAAOS,CACT,CAAC,EAqBGuxB,IAAe7Z,GAAS,SAASva,EAAM,CACzC,OAAAA,EAAK,KAAKpL,EAAWiwB,EAAmB,EACjChlB,GAAMw0B,GAAWz/B,EAAWoL,CAAI,CACzC,CAAC,EAqCD,SAASs0B,IAAQzxB,EAAQjC,EAAW,CAClC,OAAOqB,GAAYY,EAAQ0W,GAAY3Y,EAAW,CAAC,EAAG+R,EAAU,CAClE,CAqCA,SAAS4hB,IAAY1xB,EAAQjC,EAAW,CACtC,OAAOqB,GAAYY,EAAQ0W,GAAY3Y,EAAW,CAAC,EAAGiS,EAAe,CACvE,CA8BA,SAAS2hB,IAAM3xB,EAAQzC,EAAU,CAC/B,OAAOyC,GAAU,KACbA,EACA4Q,GAAQ5Q,EAAQ0W,GAAYnZ,EAAU,CAAC,EAAG6P,EAAM,CACtD,CA4BA,SAASwkB,IAAW5xB,EAAQzC,EAAU,CACpC,OAAOyC,GAAU,KACbA,EACA8Q,GAAa9Q,EAAQ0W,GAAYnZ,EAAU,CAAC,EAAG6P,EAAM,CAC3D,CA8BA,SAASykB,IAAO7xB,EAAQzC,EAAU,CAChC,OAAOyC,GAAU8P,GAAW9P,EAAQ0W,GAAYnZ,EAAU,CAAC,CAAC,CAC9D,CA4BA,SAASu0B,IAAY9xB,EAAQzC,EAAU,CACrC,OAAOyC,GAAUgQ,GAAgBhQ,EAAQ0W,GAAYnZ,EAAU,CAAC,CAAC,CACnE,CAyBA,SAASw0B,IAAU/xB,EAAQ,CACzB,OAAOA,GAAU,KAAO,CAAC,EAAI+Q,GAAc/Q,EAAQkN,GAAKlN,CAAM,CAAC,CACjE,CAyBA,SAASgyB,IAAYhyB,EAAQ,CAC3B,OAAOA,GAAU,KAAO,CAAC,EAAI+Q,GAAc/Q,EAAQoN,GAAOpN,CAAM,CAAC,CACnE,CA2BA,SAASwN,GAAIxN,EAAQkR,EAAMmP,EAAc,CACvC,IAAIniB,EAAS8B,GAAU,KAAOjO,EAAYkf,GAAQjR,EAAQkR,CAAI,EAC9D,OAAOhT,IAAWnM,EAAYsuB,EAAeniB,CAC/C,CA6BA,SAAS+zB,IAAIjyB,EAAQkR,EAAM,CACzB,OAAOlR,GAAU,MAAQ0jB,GAAQ1jB,EAAQkR,EAAMU,EAAO,CACxD,CA4BA,SAAS+D,GAAM3V,EAAQkR,EAAM,CAC3B,OAAOlR,GAAU,MAAQ0jB,GAAQ1jB,EAAQkR,EAAMW,EAAS,CAC1D,CAoBA,IAAIqgB,IAASjS,GAAe,SAAS/hB,EAAQP,EAAO4B,EAAK,CACnD5B,GAAS,MACT,OAAOA,EAAM,UAAY,aAC3BA,EAAQ0G,GAAqB,KAAK1G,CAAK,GAGzCO,EAAOP,CAAK,EAAI4B,CAClB,EAAG2Y,GAASvD,EAAQ,CAAC,EA4BjBwd,IAAWlS,GAAe,SAAS/hB,EAAQP,EAAO4B,EAAK,CACrD5B,GAAS,MACT,OAAOA,EAAM,UAAY,aAC3BA,EAAQ0G,GAAqB,KAAK1G,CAAK,GAGrCsG,GAAe,KAAK/F,EAAQP,CAAK,EACnCO,EAAOP,CAAK,EAAE,KAAK4B,CAAG,EAEtBrB,EAAOP,CAAK,EAAI,CAAC4B,CAAG,CAExB,EAAGmX,EAAW,EAoBV0b,IAAS1a,GAASnF,EAAU,EA8BhC,SAASrF,GAAKlN,EAAQ,CACpB,OAAOsV,GAAYtV,CAAM,EAAIwL,GAAcxL,CAAM,EAAI+U,GAAS/U,CAAM,CACtE,CAyBA,SAASoN,GAAOpN,EAAQ,CACtB,OAAOsV,GAAYtV,CAAM,EAAIwL,GAAcxL,EAAQ,EAAI,EAAIiV,GAAWjV,CAAM,CAC9E,CAuBA,SAASqyB,IAAQryB,EAAQzC,EAAU,CACjC,IAAIW,EAAS,CAAC,EACd,OAAAX,EAAWmZ,GAAYnZ,EAAU,CAAC,EAElCuS,GAAW9P,EAAQ,SAASrC,EAAO4B,EAAKS,GAAQ,CAC9C0M,GAAgBxO,EAAQX,EAASI,EAAO4B,EAAKS,EAAM,EAAGrC,CAAK,CAC7D,CAAC,EACMO,CACT,CA8BA,SAASo0B,IAAUtyB,EAAQzC,EAAU,CACnC,IAAIW,EAAS,CAAC,EACd,OAAAX,EAAWmZ,GAAYnZ,EAAU,CAAC,EAElCuS,GAAW9P,EAAQ,SAASrC,EAAO4B,EAAKS,GAAQ,CAC9C0M,GAAgBxO,EAAQqB,EAAKhC,EAASI,EAAO4B,EAAKS,EAAM,CAAC,CAC3D,CAAC,EACM9B,CACT,CAiCA,IAAIq0B,IAAQnV,GAAe,SAASpd,EAAQgN,EAAQ6I,EAAU,CAC5DD,GAAU5V,EAAQgN,EAAQ6I,CAAQ,CACpC,CAAC,EAiCG2b,GAAYpU,GAAe,SAASpd,EAAQgN,EAAQ6I,EAAU/H,EAAY,CAC5E8H,GAAU5V,EAAQgN,EAAQ6I,EAAU/H,CAAU,CAChD,CAAC,EAsBG0kB,IAAOxT,GAAS,SAAShf,EAAQsN,EAAO,CAC1C,IAAIpP,EAAS,CAAC,EACd,GAAI8B,GAAU,KACZ,OAAO9B,EAET,IAAI8P,EAAS,GACbV,EAAQ/O,GAAS+O,EAAO,SAAS4D,GAAM,CACrC,OAAAA,GAAOC,GAASD,GAAMlR,CAAM,EAC5BgO,IAAWA,EAASkD,GAAK,OAAS,GAC3BA,EACT,CAAC,EACDjE,GAAWjN,EAAQiP,GAAajP,CAAM,EAAG9B,CAAM,EAC3C8P,IACF9P,EAAS0P,GAAU1P,EAAQ1L,EAAkBC,EAAkBC,EAAoBuvB,EAAe,GAGpG,QADIvkB,EAAS4P,EAAM,OACZ5P,KACL4Z,GAAUpZ,EAAQoP,EAAM5P,CAAM,CAAC,EAEjC,OAAOQ,CACT,CAAC,EAsBD,SAASu0B,IAAOzyB,EAAQjC,EAAW,CACjC,OAAO20B,GAAO1yB,EAAQorB,GAAO1U,GAAY3Y,CAAS,CAAC,CAAC,CACtD,CAmBA,IAAI40B,IAAO3T,GAAS,SAAShf,EAAQsN,EAAO,CAC1C,OAAOtN,GAAU,KAAO,CAAC,EAAI6W,GAAS7W,EAAQsN,CAAK,CACrD,CAAC,EAoBD,SAASolB,GAAO1yB,EAAQjC,EAAW,CACjC,GAAIiC,GAAU,KACZ,MAAO,CAAC,EAEV,IAAIS,EAAQlC,GAAS0Q,GAAajP,CAAM,EAAG,SAAS4yB,EAAM,CACxD,MAAO,CAACA,CAAI,CACd,CAAC,EACD,OAAA70B,EAAY2Y,GAAY3Y,CAAS,EAC1B+Y,GAAW9W,EAAQS,EAAO,SAAS9C,EAAOuT,EAAM,CACrD,OAAOnT,EAAUJ,EAAOuT,EAAK,CAAC,CAAC,CACjC,CAAC,CACH,CA+BA,SAAShT,IAAO8B,EAAQkR,EAAMmP,EAAc,CAC1CnP,EAAOC,GAASD,EAAMlR,CAAM,EAE5B,IAAIvC,EAAQ,GACRC,EAASwT,EAAK,OAOlB,IAJKxT,IACHA,EAAS,EACTsC,EAASjO,GAEJ,EAAE0L,EAAQC,GAAQ,CACvB,IAAIC,GAAQqC,GAAU,KAAOjO,EAAYiO,EAAOoR,GAAMF,EAAKzT,CAAK,CAAC,CAAC,EAC9DE,KAAU5L,IACZ0L,EAAQC,EACRC,GAAQ0iB,GAEVrgB,EAASgR,GAAWrT,EAAK,EAAIA,GAAM,KAAKqC,CAAM,EAAIrC,EACpD,CACA,OAAOqC,CACT,CA8BA,SAASuC,IAAIvC,EAAQkR,EAAMvT,EAAO,CAChC,OAAOqC,GAAU,KAAOA,EAAS+W,GAAQ/W,EAAQkR,EAAMvT,CAAK,CAC9D,CA0BA,SAASk1B,IAAQ7yB,EAAQkR,EAAMvT,EAAOmQ,EAAY,CAChD,OAAAA,EAAa,OAAOA,GAAc,WAAaA,EAAa/b,EACrDiO,GAAU,KAAOA,EAAS+W,GAAQ/W,EAAQkR,EAAMvT,EAAOmQ,CAAU,CAC1E,CA0BA,IAAIglB,GAAUlR,GAAc1U,EAAI,EA0B5B6lB,GAAYnR,GAAcxU,EAAM,EAgCpC,SAASjL,IAAUnC,EAAQzC,EAAUC,EAAa,CAChD,IAAI+K,EAAQd,GAAQzH,CAAM,EACtBgzB,EAAYzqB,GAASsD,GAAS7L,CAAM,GAAK+L,GAAa/L,CAAM,EAGhE,GADAzC,EAAWmZ,GAAYnZ,EAAU,CAAC,EAC9BC,GAAe,KAAM,CACvB,IAAIogB,GAAO5d,GAAUA,EAAO,YACxBgzB,EACFx1B,EAAc+K,EAAQ,IAAIqV,GAAO,CAAC,EAE3B7V,GAAS/H,CAAM,EACtBxC,EAAcwT,GAAW4M,EAAI,EAAI/V,GAAWhD,GAAa7E,CAAM,CAAC,EAAI,CAAC,EAGrExC,EAAc,CAAC,CAEnB,CACA,OAACw1B,EAAYp1B,GAAYkS,IAAY9P,EAAQ,SAASrC,GAAOF,GAAOuC,GAAQ,CAC1E,OAAOzC,EAASC,EAAaG,GAAOF,GAAOuC,EAAM,CACnD,CAAC,EACMxC,CACT,CA6BA,SAASy1B,IAAMjzB,EAAQkR,EAAM,CAC3B,OAAOlR,GAAU,KAAO,GAAOsX,GAAUtX,EAAQkR,CAAI,CACvD,CA6BA,SAASgiB,IAAOlzB,EAAQkR,EAAM4I,EAAS,CACrC,OAAO9Z,GAAU,KAAOA,EAAS6Z,GAAW7Z,EAAQkR,EAAMsJ,GAAaV,CAAO,CAAC,CACjF,CA0BA,SAASqZ,IAAWnzB,EAAQkR,EAAM4I,EAAShM,EAAY,CACrD,OAAAA,EAAa,OAAOA,GAAc,WAAaA,EAAa/b,EACrDiO,GAAU,KAAOA,EAAS6Z,GAAW7Z,EAAQkR,EAAMsJ,GAAaV,CAAO,EAAGhM,CAAU,CAC7F,CA4BA,SAASrP,GAAOuB,EAAQ,CACtB,OAAOA,GAAU,KAAO,CAAC,EAAIa,GAAWb,EAAQkN,GAAKlN,CAAM,CAAC,CAC9D,CA0BA,SAASozB,IAASpzB,EAAQ,CACxB,OAAOA,GAAU,KAAO,CAAC,EAAIa,GAAWb,EAAQoN,GAAOpN,CAAM,CAAC,CAChE,CAuBA,SAASqzB,IAAM5lB,EAAQC,EAAOC,EAAO,CACnC,OAAIA,IAAU5b,IACZ4b,EAAQD,EACRA,EAAQ3b,GAEN4b,IAAU5b,IACZ4b,EAAQoT,GAASpT,CAAK,EACtBA,EAAQA,IAAUA,EAAQA,EAAQ,GAEhCD,IAAU3b,IACZ2b,EAAQqT,GAASrT,CAAK,EACtBA,EAAQA,IAAUA,EAAQA,EAAQ,GAE7BpB,GAAUyU,GAAStT,CAAM,EAAGC,EAAOC,CAAK,CACjD,CAwCA,SAAS2lB,IAAQ7lB,EAAQ7E,EAAOC,EAAK,CACnC,OAAAD,EAAQiY,GAASjY,CAAK,EAClBC,IAAQ9W,GACV8W,EAAMD,EACNA,EAAQ,GAERC,EAAMgY,GAAShY,CAAG,EAEpB4E,EAASsT,GAAStT,CAAM,EACjBqE,GAAYrE,EAAQ7E,EAAOC,CAAG,CACvC,CAiCA,SAAS0qB,IAAO7lB,EAAOC,EAAO6lB,EAAU,CA2BtC,GA1BIA,GAAY,OAAOA,GAAY,WAAahW,GAAe9P,EAAOC,EAAO6lB,CAAQ,IACnF7lB,EAAQ6lB,EAAWzhC,GAEjByhC,IAAazhC,IACX,OAAO4b,GAAS,WAClB6lB,EAAW7lB,EACXA,EAAQ5b,GAED,OAAO2b,GAAS,YACvB8lB,EAAW9lB,EACXA,EAAQ3b,IAGR2b,IAAU3b,GAAa4b,IAAU5b,GACnC2b,EAAQ,EACRC,EAAQ,IAGRD,EAAQmT,GAASnT,CAAK,EAClBC,IAAU5b,GACZ4b,EAAQD,EACRA,EAAQ,GAERC,EAAQkT,GAASlT,CAAK,GAGtBD,EAAQC,EAAO,CACjB,IAAI8lB,EAAO/lB,EACXA,EAAQC,EACRA,EAAQ8lB,CACV,CACA,GAAID,GAAY9lB,EAAQ,GAAKC,EAAQ,EAAG,CACtC,IAAImX,EAAO1e,GAAa,EACxB,OAAOH,GAAUyH,EAASoX,GAAQnX,EAAQD,EAAQ3R,GAAe,QAAU+oB,EAAO,IAAI,OAAS,EAAE,GAAKnX,CAAK,CAC7G,CACA,OAAOxB,GAAWuB,EAAOC,CAAK,CAChC,CAwBA,IAAI+lB,IAAYvV,GAAiB,SAASjgB,EAAQy1B,EAAMl2B,EAAO,CAC7D,OAAAk2B,EAAOA,EAAK,YAAY,EACjBz1B,GAAUT,EAAQm2B,GAAWD,CAAI,EAAIA,EAC9C,CAAC,EAiBD,SAASC,GAAW10B,EAAQ,CAC1B,OAAO20B,GAAWnZ,GAASxb,CAAM,EAAE,YAAY,CAAC,CAClD,CAoBA,SAASof,GAAOpf,EAAQ,CACtB,OAAAA,EAASwb,GAASxb,CAAM,EACjBA,GAAUA,EAAO,QAAQ7G,GAASiJ,EAAY,EAAE,QAAQpG,GAAa,EAAE,CAChF,CAyBA,SAAS44B,IAAS50B,EAAQ60B,EAAQC,EAAU,CAC1C90B,EAASwb,GAASxb,CAAM,EACxB60B,EAASxa,GAAawa,CAAM,EAE5B,IAAIr2B,EAASwB,EAAO,OACpB80B,EAAWA,IAAajiC,EACpB2L,EACA4O,GAAU+D,GAAU2jB,CAAQ,EAAG,EAAGt2B,CAAM,EAE5C,IAAImL,EAAMmrB,EACV,OAAAA,GAAYD,EAAO,OACZC,GAAY,GAAK90B,EAAO,MAAM80B,EAAUnrB,CAAG,GAAKkrB,CACzD,CA8BA,SAASE,IAAO/0B,EAAQ,CACtB,OAAAA,EAASwb,GAASxb,CAAM,EAChBA,GAAUrI,GAAmB,KAAKqI,CAAM,EAC5CA,EAAO,QAAQvI,EAAiB4K,EAAc,EAC9CrC,CACN,CAiBA,SAASg1B,IAAah1B,EAAQ,CAC5B,OAAAA,EAASwb,GAASxb,CAAM,EAChBA,GAAU7H,GAAgB,KAAK6H,CAAM,EACzCA,EAAO,QAAQ9H,GAAc,MAAM,EACnC8H,CACN,CAuBA,IAAIi1B,IAAYhW,GAAiB,SAASjgB,EAAQy1B,EAAMl2B,EAAO,CAC7D,OAAOS,GAAUT,EAAQ,IAAM,IAAMk2B,EAAK,YAAY,CACxD,CAAC,EAsBGS,IAAYjW,GAAiB,SAASjgB,EAAQy1B,EAAMl2B,EAAO,CAC7D,OAAOS,GAAUT,EAAQ,IAAM,IAAMk2B,EAAK,YAAY,CACxD,CAAC,EAmBGU,IAAarW,GAAgB,aAAa,EAyB9C,SAASsW,IAAIp1B,EAAQxB,EAAQ+iB,EAAO,CAClCvhB,EAASwb,GAASxb,CAAM,EACxBxB,EAAS2S,GAAU3S,CAAM,EAEzB,IAAI62B,EAAY72B,EAASgF,GAAWxD,CAAM,EAAI,EAC9C,GAAI,CAACxB,GAAU62B,GAAa72B,EAC1B,OAAOwB,EAET,IAAIwZ,GAAOhb,EAAS62B,GAAa,EACjC,OACE/T,GAAc9a,GAAYgT,CAAG,EAAG+H,CAAK,EACrCvhB,EACAshB,GAAc/a,GAAWiT,CAAG,EAAG+H,CAAK,CAExC,CAyBA,SAAS+T,IAAOt1B,EAAQxB,EAAQ+iB,EAAO,CACrCvhB,EAASwb,GAASxb,CAAM,EACxBxB,EAAS2S,GAAU3S,CAAM,EAEzB,IAAI62B,EAAY72B,EAASgF,GAAWxD,CAAM,EAAI,EAC9C,OAAQxB,GAAU62B,EAAY72B,EACzBwB,EAASshB,GAAc9iB,EAAS62B,EAAW9T,CAAK,EACjDvhB,CACN,CAyBA,SAASu1B,IAASv1B,EAAQxB,EAAQ+iB,EAAO,CACvCvhB,EAASwb,GAASxb,CAAM,EACxBxB,EAAS2S,GAAU3S,CAAM,EAEzB,IAAI62B,EAAY72B,EAASgF,GAAWxD,CAAM,EAAI,EAC9C,OAAQxB,GAAU62B,EAAY72B,EACzB8iB,GAAc9iB,EAAS62B,EAAW9T,CAAK,EAAIvhB,EAC5CA,CACN,CA0BA,SAASw1B,IAASx1B,EAAQy1B,EAAOpX,EAAO,CACtC,OAAIA,GAASoX,GAAS,KACpBA,EAAQ,EACCA,IACTA,EAAQ,CAACA,GAEJxuB,GAAeuU,GAASxb,CAAM,EAAE,QAAQ5H,GAAa,EAAE,EAAGq9B,GAAS,CAAC,CAC7E,CAwBA,SAASC,IAAO11B,EAAQqB,EAAGgd,EAAO,CAChC,OAAKA,EAAQC,GAAete,EAAQqB,EAAGgd,CAAK,EAAIhd,IAAMxO,GACpDwO,EAAI,EAEJA,EAAI8P,GAAU9P,CAAC,EAEVkX,GAAWiD,GAASxb,CAAM,EAAGqB,CAAC,CACvC,CAqBA,SAASs0B,KAAU,CACjB,IAAI13B,EAAO,UACP+B,EAASwb,GAASvd,EAAK,CAAC,CAAC,EAE7B,OAAOA,EAAK,OAAS,EAAI+B,EAASA,EAAO,QAAQ/B,EAAK,CAAC,EAAGA,EAAK,CAAC,CAAC,CACnE,CAuBA,IAAI23B,IAAY3W,GAAiB,SAASjgB,EAAQy1B,EAAMl2B,EAAO,CAC7D,OAAOS,GAAUT,EAAQ,IAAM,IAAMk2B,EAAK,YAAY,CACxD,CAAC,EAqBD,SAASoB,IAAM71B,EAAQsnB,EAAWwO,EAAO,CAKvC,OAJIA,GAAS,OAAOA,GAAS,UAAYxX,GAAete,EAAQsnB,EAAWwO,CAAK,IAC9ExO,EAAYwO,EAAQjjC,GAEtBijC,EAAQA,IAAUjjC,EAAYmC,EAAmB8gC,IAAU,EACtDA,GAGL91B,EAASwb,GAASxb,CAAM,EACpBA,IACE,OAAOsnB,GAAa,UACnBA,GAAa,MAAQ,CAACyJ,GAASzJ,CAAS,KAE7CA,EAAYjN,GAAaiN,CAAS,EAC9B,CAACA,GAAa7kB,GAAWzC,CAAM,GAC1B0b,GAAUhY,GAAc1D,CAAM,EAAG,EAAG81B,CAAK,EAG7C91B,EAAO,MAAMsnB,EAAWwO,CAAK,GAZ3B,CAAC,CAaZ,CAuBA,IAAIC,IAAY9W,GAAiB,SAASjgB,EAAQy1B,EAAMl2B,EAAO,CAC7D,OAAOS,GAAUT,EAAQ,IAAM,IAAMo2B,GAAWF,CAAI,CACtD,CAAC,EAyBD,SAASuB,IAAWh2B,EAAQ60B,EAAQC,EAAU,CAC5C,OAAA90B,EAASwb,GAASxb,CAAM,EACxB80B,EAAWA,GAAY,KACnB,EACA1nB,GAAU+D,GAAU2jB,CAAQ,EAAG,EAAG90B,EAAO,MAAM,EAEnD60B,EAASxa,GAAawa,CAAM,EACrB70B,EAAO,MAAM80B,EAAUA,EAAWD,EAAO,MAAM,GAAKA,CAC7D,CA0GA,SAASoB,IAASj2B,EAAQgtB,EAAS3O,EAAO,CAIxC,IAAI6X,EAAW7tB,GAAO,iBAElBgW,GAASC,GAAete,EAAQgtB,EAAS3O,CAAK,IAChD2O,EAAUn6B,GAEZmN,EAASwb,GAASxb,CAAM,EACxBgtB,EAAU4E,GAAa,CAAC,EAAG5E,EAASkJ,EAAUrT,EAAsB,EAEpE,IAAIsT,EAAUvE,GAAa,CAAC,EAAG5E,EAAQ,QAASkJ,EAAS,QAASrT,EAAsB,EACpFuT,GAAcpoB,GAAKmoB,CAAO,EAC1BE,GAAgB10B,GAAWw0B,EAASC,EAAW,EAE/CE,GACAC,GACAh4B,GAAQ,EACRi4B,GAAcxJ,EAAQ,aAAe5zB,GACrC0U,GAAS,WAGT2oB,GAAelyB,IAChByoB,EAAQ,QAAU5zB,IAAW,OAAS,IACvCo9B,GAAY,OAAS,KACpBA,KAAgB1+B,GAAgBc,GAAeQ,IAAW,OAAS,KACnE4zB,EAAQ,UAAY5zB,IAAW,OAAS,KACzC,GAAG,EAMDs9B,GAAY,kBACb3xB,GAAe,KAAKioB,EAAS,WAAW,GACpCA,EAAQ,UAAY,IAAI,QAAQ,MAAO,GAAG,EAC1C,2BAA6B,EAAE1wB,GAAmB,KACnD;AAAA,EAEN0D,EAAO,QAAQy2B,GAAc,SAASlS,GAAOoS,GAAaC,GAAkBC,GAAiBC,GAAet3B,GAAQ,CAClH,OAAAo3B,KAAqBA,GAAmBC,IAGxC/oB,IAAU9N,EAAO,MAAMzB,GAAOiB,EAAM,EAAE,QAAQnG,GAAmBiJ,EAAgB,EAG7Eq0B,KACFL,GAAa,GACbxoB,IAAU;AAAA,MAAc6oB,GAAc;AAAA,IAEpCG,KACFP,GAAe,GACfzoB,IAAU;AAAA,EAASgpB,GAAgB;AAAA,WAEjCF,KACF9oB,IAAU;AAAA,WAAmB8oB,GAAmB;AAAA,IAElDr4B,GAAQiB,GAAS+kB,GAAM,OAIhBA,EACT,CAAC,EAEDzW,IAAU;AAAA,EAIV,IAAIipB,GAAWhyB,GAAe,KAAKioB,EAAS,UAAU,GAAKA,EAAQ,SACnE,GAAI,CAAC+J,GACHjpB,GAAS;AAAA,EAAmBA,GAAS;AAAA;AAAA,UAI9BpV,GAA2B,KAAKq+B,EAAQ,EAC/C,MAAM,IAAI5yB,GAAMjR,CAA4B,EAI9C4a,IAAUyoB,GAAezoB,GAAO,QAAQzW,EAAsB,EAAE,EAAIyW,IACjE,QAAQxW,EAAqB,IAAI,EACjC,QAAQC,GAAuB,KAAK,EAGvCuW,GAAS,aAAeipB,IAAY,OAAS;AAAA,GAC1CA,GACG,GACA;AAAA,GAEJ,qBACCT,GACI,mBACA,KAEJC,GACG;AAAA;AAAA,EAEA;AAAA,GAEJzoB,GACA;AAAA,GAEF,IAAI9O,GAASg4B,GAAQ,UAAW,CAC9B,OAAO5yB,GAASgyB,GAAaM,GAAY,UAAY5oB,EAAM,EACxD,MAAMjb,EAAWwjC,EAAa,CACnC,CAAC,EAKD,GADAr3B,GAAO,OAAS8O,GACZuiB,GAAQrxB,EAAM,EAChB,MAAMA,GAER,OAAOA,EACT,CAuBA,SAASi4B,IAAQx4B,EAAO,CACtB,OAAO+c,GAAS/c,CAAK,EAAE,YAAY,CACrC,CAuBA,SAASy4B,IAAQz4B,EAAO,CACtB,OAAO+c,GAAS/c,CAAK,EAAE,YAAY,CACrC,CAwBA,SAAS04B,IAAKn3B,EAAQuhB,EAAOlD,EAAO,CAElC,GADAre,EAASwb,GAASxb,CAAM,EACpBA,IAAWqe,GAASkD,IAAU1uB,GAChC,OAAO2O,GAASxB,CAAM,EAExB,GAAI,CAACA,GAAU,EAAEuhB,EAAQlH,GAAakH,CAAK,GACzC,OAAOvhB,EAET,IAAI+B,EAAa2B,GAAc1D,CAAM,EACjCgC,EAAa0B,GAAc6d,CAAK,EAChC7X,GAAQ5H,GAAgBC,EAAYC,CAAU,EAC9C2H,GAAM1H,GAAcF,EAAYC,CAAU,EAAI,EAElD,OAAO0Z,GAAU3Z,EAAY2H,GAAOC,EAAG,EAAE,KAAK,EAAE,CAClD,CAqBA,SAASytB,IAAQp3B,EAAQuhB,EAAOlD,EAAO,CAErC,GADAre,EAASwb,GAASxb,CAAM,EACpBA,IAAWqe,GAASkD,IAAU1uB,GAChC,OAAOmN,EAAO,MAAM,EAAGyB,GAAgBzB,CAAM,EAAI,CAAC,EAEpD,GAAI,CAACA,GAAU,EAAEuhB,EAAQlH,GAAakH,CAAK,GACzC,OAAOvhB,EAET,IAAI+B,EAAa2B,GAAc1D,CAAM,EACjC2J,EAAM1H,GAAcF,EAAY2B,GAAc6d,CAAK,CAAC,EAAI,EAE5D,OAAO7F,GAAU3Z,EAAY,EAAG4H,CAAG,EAAE,KAAK,EAAE,CAC9C,CAqBA,SAAS0tB,IAAUr3B,EAAQuhB,EAAOlD,EAAO,CAEvC,GADAre,EAASwb,GAASxb,CAAM,EACpBA,IAAWqe,GAASkD,IAAU1uB,GAChC,OAAOmN,EAAO,QAAQ5H,GAAa,EAAE,EAEvC,GAAI,CAAC4H,GAAU,EAAEuhB,EAAQlH,GAAakH,CAAK,GACzC,OAAOvhB,EAET,IAAI+B,EAAa2B,GAAc1D,CAAM,EACjC0J,EAAQ5H,GAAgBC,EAAY2B,GAAc6d,CAAK,CAAC,EAE5D,OAAO7F,GAAU3Z,EAAY2H,CAAK,EAAE,KAAK,EAAE,CAC7C,CAuCA,SAAS4tB,IAASt3B,EAAQgtB,EAAS,CACjC,IAAIxuB,EAASnK,EACTkjC,EAAWjjC,EAEf,GAAIuU,GAASmkB,CAAO,EAAG,CACrB,IAAI1F,EAAY,cAAe0F,EAAUA,EAAQ,UAAY1F,EAC7D9oB,EAAS,WAAYwuB,EAAU7b,GAAU6b,EAAQ,MAAM,EAAIxuB,EAC3D+4B,EAAW,aAAcvK,EAAU3S,GAAa2S,EAAQ,QAAQ,EAAIuK,CACtE,CACAv3B,EAASwb,GAASxb,CAAM,EAExB,IAAIq1B,GAAYr1B,EAAO,OACvB,GAAIyC,GAAWzC,CAAM,EAAG,CACtB,IAAI+B,GAAa2B,GAAc1D,CAAM,EACrCq1B,GAAYtzB,GAAW,MACzB,CACA,GAAIvD,GAAU62B,GACZ,OAAOr1B,EAET,IAAI2J,GAAMnL,EAASgF,GAAW+zB,CAAQ,EACtC,GAAI5tB,GAAM,EACR,OAAO4tB,EAET,IAAIv4B,GAAS+C,GACT2Z,GAAU3Z,GAAY,EAAG4H,EAAG,EAAE,KAAK,EAAE,EACrC3J,EAAO,MAAM,EAAG2J,EAAG,EAEvB,GAAI2d,IAAcz0B,EAChB,OAAOmM,GAASu4B,EAKlB,GAHIx1B,KACF4H,IAAQ3K,GAAO,OAAS2K,IAEtBonB,GAASzJ,CAAS,GACpB,GAAItnB,EAAO,MAAM2J,EAAG,EAAE,OAAO2d,CAAS,EAAG,CACvC,IAAI/C,GACAiT,GAAYx4B,GAMhB,IAJKsoB,EAAU,SACbA,EAAY/iB,GAAO+iB,EAAU,OAAQ9L,GAAS3iB,GAAQ,KAAKyuB,CAAS,CAAC,EAAI,GAAG,GAE9EA,EAAU,UAAY,EACd/C,GAAQ+C,EAAU,KAAKkQ,EAAS,GACtC,IAAIC,GAASlT,GAAM,MAErBvlB,GAASA,GAAO,MAAM,EAAGy4B,KAAW5kC,EAAY8W,GAAM8tB,EAAM,CAC9D,UACSz3B,EAAO,QAAQqa,GAAaiN,CAAS,EAAG3d,EAAG,GAAKA,GAAK,CAC9D,IAAIpL,GAAQS,GAAO,YAAYsoB,CAAS,EACpC/oB,GAAQ,KACVS,GAASA,GAAO,MAAM,EAAGT,EAAK,EAElC,CACA,OAAOS,GAASu4B,CAClB,CAqBA,SAASG,IAAS13B,EAAQ,CACxB,OAAAA,EAASwb,GAASxb,CAAM,EAChBA,GAAUtI,EAAiB,KAAKsI,CAAM,EAC1CA,EAAO,QAAQxI,EAAeoM,EAAgB,EAC9C5D,CACN,CAsBA,IAAI23B,IAAY1Y,GAAiB,SAASjgB,EAAQy1B,EAAMl2B,EAAO,CAC7D,OAAOS,GAAUT,EAAQ,IAAM,IAAMk2B,EAAK,YAAY,CACxD,CAAC,EAmBGE,GAAa7V,GAAgB,aAAa,EAqB9C,SAASK,GAAMnf,EAAQmV,EAASkJ,EAAO,CAIrC,OAHAre,EAASwb,GAASxb,CAAM,EACxBmV,EAAUkJ,EAAQxrB,EAAYsiB,EAE1BA,IAAYtiB,EACP6P,GAAe1C,CAAM,EAAI6D,GAAa7D,CAAM,EAAIC,GAAWD,CAAM,EAEnEA,EAAO,MAAMmV,CAAO,GAAK,CAAC,CACnC,CA0BA,IAAI6hB,GAAUxe,GAAS,SAASza,EAAME,EAAM,CAC1C,GAAI,CACF,OAAOH,GAAMC,EAAMlL,EAAWoL,CAAI,CACpC,OAAS25B,EAAG,CACV,OAAOvH,GAAQuH,CAAC,EAAIA,EAAI,IAAIzzB,GAAMyzB,CAAC,CACrC,CACF,CAAC,EA4BGC,IAAU/X,GAAS,SAAShf,EAAQg3B,EAAa,CACnD,OAAAp5B,GAAUo5B,EAAa,SAASz3B,EAAK,CACnCA,EAAM6R,GAAM7R,CAAG,EACfmN,GAAgB1M,EAAQT,EAAKssB,GAAK7rB,EAAOT,CAAG,EAAGS,CAAM,CAAC,CACxD,CAAC,EACMA,CACT,CAAC,EA+BD,SAASi3B,IAAK1rB,EAAO,CACnB,IAAI7N,EAAS6N,GAAS,KAAO,EAAIA,EAAM,OACnC2U,EAAaxJ,GAAY,EAE7B,OAAAnL,EAAS7N,EAAca,GAASgN,EAAO,SAASmW,EAAM,CACpD,GAAI,OAAOA,EAAK,CAAC,GAAK,WACpB,MAAM,IAAI/d,GAAUxR,CAAe,EAErC,MAAO,CAAC+tB,EAAWwB,EAAK,CAAC,CAAC,EAAGA,EAAK,CAAC,CAAC,CACtC,CAAC,EALiB,CAAC,EAOZhK,GAAS,SAASva,EAAM,CAE7B,QADIM,EAAQ,GACL,EAAEA,EAAQC,GAAQ,CACvB,IAAIgkB,GAAOnW,EAAM9N,CAAK,EACtB,GAAIT,GAAM0kB,GAAK,CAAC,EAAG,KAAMvkB,CAAI,EAC3B,OAAOH,GAAM0kB,GAAK,CAAC,EAAG,KAAMvkB,CAAI,CAEpC,CACF,CAAC,CACH,CA0BA,SAAS+5B,IAASlqB,EAAQ,CACxB,OAAOmC,GAAavB,GAAUZ,EAAQxa,CAAe,CAAC,CACxD,CAqBA,SAAS0lB,GAASva,EAAO,CACvB,OAAO,UAAW,CAChB,OAAOA,CACT,CACF,CAsBA,SAASw5B,IAAUx5B,EAAO0iB,EAAc,CACtC,OAAQ1iB,GAAS,MAAQA,IAAUA,EAAS0iB,EAAe1iB,CAC7D,CAwBA,IAAIy5B,IAAOrY,GAAW,EAuBlBsY,IAAYtY,GAAW,EAAI,EAkB/B,SAASpK,GAAShX,EAAO,CACvB,OAAOA,CACT,CA4CA,SAASJ,GAASN,EAAM,CACtB,OAAOyX,GAAa,OAAOzX,GAAQ,WAAaA,EAAO2Q,GAAU3Q,EAAMzK,CAAe,CAAC,CACzF,CAqCA,SAAS8kC,IAAQtqB,EAAQ,CACvB,OAAO6H,GAAYjH,GAAUZ,EAAQxa,CAAe,CAAC,CACvD,CAmCA,SAAS+kC,IAAgBrmB,EAAMgD,EAAU,CACvC,OAAOU,GAAoB1D,EAAMtD,GAAUsG,EAAU1hB,CAAe,CAAC,CACvE,CA0BA,IAAIglC,IAAS9f,GAAS,SAASxG,EAAM/T,EAAM,CACzC,OAAO,SAAS6C,EAAQ,CACtB,OAAOuS,GAAWvS,EAAQkR,EAAM/T,CAAI,CACtC,CACF,CAAC,EAyBGs6B,IAAW/f,GAAS,SAAS1X,EAAQ7C,EAAM,CAC7C,OAAO,SAAS+T,EAAM,CACpB,OAAOqB,GAAWvS,EAAQkR,EAAM/T,CAAI,CACtC,CACF,CAAC,EAsCD,SAASu6B,GAAM13B,EAAQgN,EAAQkf,EAAS,CACtC,IAAIzrB,EAAQyM,GAAKF,CAAM,EACnBgqB,EAAcjmB,GAAc/D,EAAQvM,CAAK,EAEzCyrB,GAAW,MACX,EAAEnkB,GAASiF,CAAM,IAAMgqB,EAAY,QAAU,CAACv2B,EAAM,WACtDyrB,EAAUlf,EACVA,EAAShN,EACTA,EAAS,KACTg3B,EAAcjmB,GAAc/D,EAAQE,GAAKF,CAAM,CAAC,GAElD,IAAIic,GAAQ,EAAElhB,GAASmkB,CAAO,GAAK,UAAWA,IAAY,CAAC,CAACA,EAAQ,MAChE5d,GAAS0C,GAAWhR,CAAM,EAE9B,OAAApC,GAAUo5B,EAAa,SAAS/Y,GAAY,CAC1C,IAAIhhB,GAAO+P,EAAOiR,EAAU,EAC5Bje,EAAOie,EAAU,EAAIhhB,GACjBqR,KACFtO,EAAO,UAAUie,EAAU,EAAI,UAAW,CACxC,IAAIhW,GAAW,KAAK,UACpB,GAAIghB,IAAShhB,GAAU,CACrB,IAAI/J,GAAS8B,EAAO,KAAK,WAAW,EAChCia,GAAU/b,GAAO,YAAciK,GAAU,KAAK,WAAW,EAE7D,OAAA8R,GAAQ,KAAK,CAAE,KAAQhd,GAAM,KAAQ,UAAW,QAAW+C,CAAO,CAAC,EACnE9B,GAAO,UAAY+J,GACZ/J,EACT,CACA,OAAOjB,GAAK,MAAM+C,EAAQxB,GAAU,CAAC,KAAK,MAAM,CAAC,EAAG,SAAS,CAAC,CAChE,EAEJ,CAAC,EAEMwB,CACT,CAeA,SAAS23B,KAAa,CACpB,OAAIx7B,GAAK,IAAM,OACbA,GAAK,EAAIoI,IAEJ,IACT,CAcA,SAASod,IAAO,CAEhB,CAsBA,SAASiW,IAAOr3B,EAAG,CACjB,OAAAA,EAAI8P,GAAU9P,CAAC,EACRmX,GAAS,SAASva,EAAM,CAC7B,OAAOoZ,GAAQpZ,EAAMoD,CAAC,CACxB,CAAC,CACH,CAoBA,IAAIs3B,IAAOvX,GAAW/hB,EAAQ,EA8B1Bu5B,IAAYxX,GAAWxiB,EAAU,EAiCjCi6B,IAAWzX,GAAWxhB,EAAS,EAwBnC,SAASgW,GAAS5D,EAAM,CACtB,OAAOuE,GAAMvE,CAAI,EAAIlS,GAAaoS,GAAMF,CAAI,CAAC,EAAI8F,GAAiB9F,CAAI,CACxE,CAuBA,SAAS8mB,IAAWh4B,EAAQ,CAC1B,OAAO,SAASkR,EAAM,CACpB,OAAOlR,GAAU,KAAOjO,EAAYkf,GAAQjR,EAAQkR,CAAI,CAC1D,CACF,CA2CA,IAAI+mB,IAAQrX,GAAY,EAsCpBsX,IAAatX,GAAY,EAAI,EAoBjC,SAASyC,IAAY,CACnB,MAAO,CAAC,CACV,CAeA,SAASU,IAAY,CACnB,MAAO,EACT,CAoBA,SAASoU,KAAa,CACpB,MAAO,CAAC,CACV,CAeA,SAASC,KAAa,CACpB,MAAO,EACT,CAeA,SAASC,KAAW,CAClB,MAAO,EACT,CAqBA,SAASC,IAAM/3B,EAAGhD,EAAU,CAE1B,GADAgD,EAAI8P,GAAU9P,CAAC,EACXA,EAAI,GAAKA,EAAIxM,EACf,MAAO,CAAC,EAEV,IAAI0J,EAAQvJ,EACRwJ,EAASuI,GAAU1F,EAAGrM,CAAgB,EAE1CqJ,EAAWmZ,GAAYnZ,CAAQ,EAC/BgD,GAAKrM,EAGL,QADIgK,EAASoC,GAAU5C,EAAQH,CAAQ,EAChC,EAAEE,EAAQ8C,GACfhD,EAASE,CAAK,EAEhB,OAAOS,CACT,CAmBA,SAASq6B,IAAO56B,EAAO,CACrB,OAAI8J,GAAQ9J,CAAK,EACRY,GAASZ,EAAOyT,EAAK,EAEvBjB,GAASxS,CAAK,EAAI,CAACA,CAAK,EAAIwK,GAAUsS,GAAaC,GAAS/c,CAAK,CAAC,CAAC,CAC5E,CAmBA,SAAS66B,IAASC,EAAQ,CACxB,IAAI3d,EAAK,EAAE5W,GACX,OAAOwW,GAAS+d,CAAM,EAAI3d,CAC5B,CAmBA,IAAI4d,IAAMvY,GAAoB,SAASwY,EAAQC,EAAQ,CACrD,OAAOD,EAASC,CAClB,EAAG,CAAC,EAuBAC,IAAOrX,GAAY,MAAM,EAiBzBsX,IAAS3Y,GAAoB,SAAS4Y,EAAUC,EAAS,CAC3D,OAAOD,EAAWC,CACpB,EAAG,CAAC,EAuBAC,IAAQzX,GAAY,OAAO,EAoB/B,SAAS0X,IAAI77B,EAAO,CAClB,OAAQA,GAASA,EAAM,OACnB6S,GAAa7S,EAAOsX,GAAUjD,EAAM,EACpC3f,CACN,CAyBA,SAASonC,IAAM97B,EAAOE,EAAU,CAC9B,OAAQF,GAASA,EAAM,OACnB6S,GAAa7S,EAAOqZ,GAAYnZ,EAAU,CAAC,EAAGmU,EAAM,EACpD3f,CACN,CAgBA,SAASqnC,IAAK/7B,EAAO,CACnB,OAAOyC,GAASzC,EAAOsX,EAAQ,CACjC,CAyBA,SAAS0kB,IAAOh8B,EAAOE,EAAU,CAC/B,OAAOuC,GAASzC,EAAOqZ,GAAYnZ,EAAU,CAAC,CAAC,CACjD,CAoBA,SAAS+7B,IAAIj8B,EAAO,CAClB,OAAQA,GAASA,EAAM,OACnB6S,GAAa7S,EAAOsX,GAAUS,EAAM,EACpCrjB,CACN,CAyBA,SAASwnC,IAAMl8B,EAAOE,EAAU,CAC9B,OAAQF,GAASA,EAAM,OACnB6S,GAAa7S,EAAOqZ,GAAYnZ,EAAU,CAAC,EAAG6X,EAAM,EACpDrjB,CACN,CAiBA,IAAIynC,IAAWrZ,GAAoB,SAASsZ,EAAYC,EAAc,CACpE,OAAOD,EAAaC,CACtB,EAAG,CAAC,EAuBAC,IAAQnY,GAAY,OAAO,EAiB3BoY,IAAWzZ,GAAoB,SAAS0Z,EAASC,EAAY,CAC/D,OAAOD,EAAUC,CACnB,EAAG,CAAC,EAgBJ,SAASC,IAAI18B,EAAO,CAClB,OAAQA,GAASA,EAAM,OACnB0C,GAAQ1C,EAAOsX,EAAQ,EACvB,CACN,CAyBA,SAASqlB,IAAM38B,EAAOE,EAAU,CAC9B,OAAQF,GAASA,EAAM,OACnB0C,GAAQ1C,EAAOqZ,GAAYnZ,EAAU,CAAC,CAAC,EACvC,CACN,CAKA,OAAAgK,GAAO,MAAQokB,GACfpkB,GAAO,IAAMmY,GACbnY,GAAO,OAASqpB,IAChBrpB,GAAO,SAAWspB,GAClBtpB,GAAO,aAAeupB,GACtBvpB,GAAO,WAAawpB,IACpBxpB,GAAO,GAAKypB,IACZzpB,GAAO,OAASqkB,GAChBrkB,GAAO,KAAOskB,GACdtkB,GAAO,QAAUwvB,IACjBxvB,GAAO,QAAUukB,GACjBvkB,GAAO,UAAYknB,GACnBlnB,GAAO,MAAQ0hB,GACf1hB,GAAO,MAAQ0d,GACf1d,GAAO,QAAU2d,GACjB3d,GAAO,OAAS4d,GAChB5d,GAAO,KAAO0vB,IACd1vB,GAAO,SAAW2vB,IAClB3vB,GAAO,SAAW2Q,GAClB3Q,GAAO,QAAU0iB,GACjB1iB,GAAO,OAAS0pB,IAChB1pB,GAAO,MAAQwkB,GACfxkB,GAAO,WAAaykB,GACpBzkB,GAAO,SAAW0kB,GAClB1kB,GAAO,SAAW6pB,IAClB7pB,GAAO,aAAegqB,IACtBhqB,GAAO,MAAQkmB,GACflmB,GAAO,MAAQmmB,GACfnmB,GAAO,WAAa6d,GACpB7d,GAAO,aAAe8d,GACtB9d,GAAO,eAAiB+d,GACxB/d,GAAO,KAAOge,GACdhe,GAAO,UAAYie,GACnBje,GAAO,eAAiBke,GACxBle,GAAO,UAAYme,GACnBne,GAAO,KAAOoe,GACdpe,GAAO,OAAS4iB,GAChB5iB,GAAO,QAAU+iB,GACjB/iB,GAAO,YAAcgjB,GACrBhjB,GAAO,aAAeijB,GACtBjjB,GAAO,QAAUyb,GACjBzb,GAAO,YAAcue,GACrBve,GAAO,aAAewe,GACtBxe,GAAO,KAAOomB,GACdpmB,GAAO,KAAO6vB,IACd7vB,GAAO,UAAY8vB,IACnB9vB,GAAO,UAAYye,GACnBze,GAAO,UAAYwqB,IACnBxqB,GAAO,YAAcyqB,IACrBzqB,GAAO,QAAUojB,GACjBpjB,GAAO,QAAU2e,GACjB3e,GAAO,aAAe4e,GACtB5e,GAAO,eAAiB8e,GACxB9e,GAAO,iBAAmB+e,GAC1B/e,GAAO,OAAS2qB,IAChB3qB,GAAO,SAAW4qB,IAClB5qB,GAAO,UAAYsjB,GACnBtjB,GAAO,SAAWhK,GAClBgK,GAAO,MAAQujB,GACfvjB,GAAO,KAAO2F,GACd3F,GAAO,OAAS6F,GAChB7F,GAAO,IAAMtF,GACbsF,GAAO,QAAU8qB,IACjB9qB,GAAO,UAAY+qB,IACnB/qB,GAAO,QAAU+vB,IACjB/vB,GAAO,gBAAkBgwB,IACzBhwB,GAAO,QAAU0c,GACjB1c,GAAO,MAAQgrB,IACfhrB,GAAO,UAAYiqB,GACnBjqB,GAAO,OAASiwB,IAChBjwB,GAAO,SAAWkwB,IAClBlwB,GAAO,MAAQmwB,GACfnwB,GAAO,OAAS6jB,GAChB7jB,GAAO,OAASqwB,IAChBrwB,GAAO,KAAOirB,IACdjrB,GAAO,OAASkrB,IAChBlrB,GAAO,KAAOumB,GACdvmB,GAAO,QAAUwjB,GACjBxjB,GAAO,KAAOswB,IACdtwB,GAAO,SAAWwmB,GAClBxmB,GAAO,UAAYuwB,IACnBvwB,GAAO,SAAWwwB,IAClBxwB,GAAO,QAAU0mB,GACjB1mB,GAAO,aAAe2mB,GACtB3mB,GAAO,UAAYyjB,GACnBzjB,GAAO,KAAOorB,IACdprB,GAAO,OAASmrB,GAChBnrB,GAAO,SAAWuN,GAClBvN,GAAO,WAAaywB,IACpBzwB,GAAO,KAAOof,GACdpf,GAAO,QAAUqf,GACjBrf,GAAO,UAAYsf,GACnBtf,GAAO,YAAcuf,GACrBvf,GAAO,OAASwf,GAChBxf,GAAO,MAAQ0wB,IACf1wB,GAAO,WAAa2wB,IACpB3wB,GAAO,MAAQ4mB,GACf5mB,GAAO,OAAS4jB,GAChB5jB,GAAO,OAASyf,GAChBzf,GAAO,KAAO6mB,GACd7mB,GAAO,QAAU0f,GACjB1f,GAAO,WAAa+jB,GACpB/jB,GAAO,IAAMhF,IACbgF,GAAO,QAAUsrB,IACjBtrB,GAAO,QAAUgkB,GACjBhkB,GAAO,MAAQ2f,GACf3f,GAAO,OAASkkB,GAChBlkB,GAAO,WAAakgB,GACpBlgB,GAAO,aAAemgB,GACtBngB,GAAO,MAAQwtB,IACfxtB,GAAO,OAAS8mB,GAChB9mB,GAAO,KAAOogB,GACdpgB,GAAO,KAAOqgB,GACdrgB,GAAO,UAAYsgB,GACnBtgB,GAAO,eAAiBugB,GACxBvgB,GAAO,UAAYwgB,GACnBxgB,GAAO,IAAM2hB,GACb3hB,GAAO,SAAW+mB,GAClB/mB,GAAO,KAAO6hB,GACd7hB,GAAO,QAAUkiB,GACjBliB,GAAO,QAAUurB,GACjBvrB,GAAO,UAAYwrB,GACnBxrB,GAAO,OAASgxB,IAChBhxB,GAAO,cAAgB+O,GACvB/O,GAAO,UAAYpF,IACnBoF,GAAO,MAAQgnB,GACfhnB,GAAO,MAAQygB,GACfzgB,GAAO,QAAU0gB,GACjB1gB,GAAO,UAAY2gB,GACnB3gB,GAAO,KAAO4gB,GACd5gB,GAAO,OAAS6gB,GAChB7gB,GAAO,SAAW8gB,GAClB9gB,GAAO,MAAQ0rB,IACf1rB,GAAO,MAAQ+gB,GACf/gB,GAAO,UAAYihB,GACnBjhB,GAAO,OAAS2rB,IAChB3rB,GAAO,WAAa4rB,IACpB5rB,GAAO,OAAS9I,GAChB8I,GAAO,SAAW6rB,IAClB7rB,GAAO,QAAUkhB,GACjBlhB,GAAO,MAAQ8W,GACf9W,GAAO,KAAOinB,GACdjnB,GAAO,IAAMmhB,GACbnhB,GAAO,MAAQohB,GACfphB,GAAO,QAAUqhB,GACjBrhB,GAAO,IAAMshB,GACbthB,GAAO,UAAYuhB,GACnBvhB,GAAO,cAAgBwhB,GACvBxhB,GAAO,QAAUyhB,GAGjBzhB,GAAO,QAAUurB,GACjBvrB,GAAO,UAAYwrB,GACnBxrB,GAAO,OAASspB,GAChBtpB,GAAO,WAAaupB,GAGpB4G,GAAMnwB,GAAQA,EAAM,EAKpBA,GAAO,IAAMmxB,IACbnxB,GAAO,QAAU2uB,GACjB3uB,GAAO,UAAYmsB,IACnBnsB,GAAO,WAAaqsB,GACpBrsB,GAAO,KAAOsxB,IACdtxB,GAAO,MAAQ8rB,IACf9rB,GAAO,MAAQsiB,GACftiB,GAAO,UAAYonB,GACnBpnB,GAAO,cAAgBqnB,GACvBrnB,GAAO,UAAYmnB,GACnBnnB,GAAO,WAAasnB,GACpBtnB,GAAO,OAAS+W,GAChB/W,GAAO,UAAY4vB,IACnB5vB,GAAO,OAASuxB,IAChBvxB,GAAO,SAAWusB,IAClBvsB,GAAO,GAAKkF,GACZlF,GAAO,OAAS0sB,IAChB1sB,GAAO,aAAe2sB,IACtB3sB,GAAO,MAAQ2iB,GACf3iB,GAAO,KAAO6iB,GACd7iB,GAAO,UAAYqe,GACnBre,GAAO,QAAUkqB,IACjBlqB,GAAO,SAAW8iB,GAClB9iB,GAAO,cAAgBse,GACvBte,GAAO,YAAcmqB,IACrBnqB,GAAO,MAAQ0xB,IACf1xB,GAAO,QAAUkjB,GACjBljB,GAAO,aAAemjB,GACtBnjB,GAAO,MAAQoqB,IACfpqB,GAAO,WAAaqqB,IACpBrqB,GAAO,OAASsqB,IAChBtqB,GAAO,YAAcuqB,IACrBvqB,GAAO,IAAMiG,GACbjG,GAAO,GAAKunB,GACZvnB,GAAO,IAAMwnB,GACbxnB,GAAO,IAAM0qB,IACb1qB,GAAO,MAAQoO,GACfpO,GAAO,KAAO0e,GACd1e,GAAO,SAAWoN,GAClBpN,GAAO,SAAWkI,GAClBlI,GAAO,QAAU2P,GACjB3P,GAAO,QAAU+rB,IACjB/rB,GAAO,OAAS6qB,IAChB7qB,GAAO,YAAcoE,GACrBpE,GAAO,QAAUE,GACjBF,GAAO,cAAgBynB,GACvBznB,GAAO,YAAc+N,GACrB/N,GAAO,kBAAoB4O,GAC3B5O,GAAO,UAAY0nB,GACnB1nB,GAAO,SAAWsE,GAClBtE,GAAO,OAAS2nB,GAChB3nB,GAAO,UAAY4nB,GACnB5nB,GAAO,QAAU6nB,GACjB7nB,GAAO,QAAU8nB,GACjB9nB,GAAO,YAAc+nB,GACrB/nB,GAAO,QAAUgoB,GACjBhoB,GAAO,SAAWioB,GAClBjoB,GAAO,WAAayJ,GACpBzJ,GAAO,UAAYkoB,GACnBloB,GAAO,SAAWkN,GAClBlN,GAAO,MAAQwH,GACfxH,GAAO,QAAUmoB,IACjBnoB,GAAO,YAAcooB,IACrBpoB,GAAO,MAAQqoB,IACfroB,GAAO,SAAWuoB,IAClBvoB,GAAO,MAAQyoB,IACfzoB,GAAO,OAASwoB,IAChBxoB,GAAO,SAAWsoB,GAClBtoB,GAAO,SAAWQ,GAClBR,GAAO,aAAeC,GACtBD,GAAO,cAAgB8O,GACvB9O,GAAO,SAAW0oB,GAClB1oB,GAAO,cAAgB2oB,IACvB3oB,GAAO,MAAQsH,GACftH,GAAO,SAAWqjB,GAClBrjB,GAAO,SAAW4I,GAClB5I,GAAO,aAAewE,GACtBxE,GAAO,YAAc4oB,IACrB5oB,GAAO,UAAY6oB,IACnB7oB,GAAO,UAAY8oB,IACnB9oB,GAAO,KAAOgf,GACdhf,GAAO,UAAY4sB,IACnB5sB,GAAO,KAAOkL,GACdlL,GAAO,YAAckf,GACrBlf,GAAO,UAAY6sB,IACnB7sB,GAAO,WAAa8sB,IACpB9sB,GAAO,GAAK+oB,IACZ/oB,GAAO,IAAMgpB,IACbhpB,GAAO,IAAM2xB,IACb3xB,GAAO,MAAQ4xB,IACf5xB,GAAO,KAAO6xB,IACd7xB,GAAO,OAAS8xB,IAChB9xB,GAAO,IAAM+xB,IACb/xB,GAAO,MAAQgyB,IACfhyB,GAAO,UAAY8b,GACnB9b,GAAO,UAAYwc,GACnBxc,GAAO,WAAa4wB,IACpB5wB,GAAO,WAAa6wB,IACpB7wB,GAAO,SAAW8wB,IAClB9wB,GAAO,SAAWiyB,IAClBjyB,GAAO,IAAMmf,GACbnf,GAAO,WAAaowB,IACpBpwB,GAAO,KAAOoa,GACdpa,GAAO,IAAMmkB,GACbnkB,GAAO,IAAM+sB,IACb/sB,GAAO,OAASitB,IAChBjtB,GAAO,SAAWktB,IAClBltB,GAAO,SAAWmtB,IAClBntB,GAAO,OAASgsB,IAChBhsB,GAAO,OAAS0jB,GAChB1jB,GAAO,YAAc2jB,GACrB3jB,GAAO,OAASqtB,IAChBrtB,GAAO,QAAUstB,IACjBttB,GAAO,OAASrJ,IAChBqJ,GAAO,MAAQoyB,IACfpyB,GAAO,aAAevE,GACtBuE,GAAO,OAAS8jB,GAChB9jB,GAAO,KAAOsD,GACdtD,GAAO,UAAYutB,IACnBvtB,GAAO,KAAOikB,GACdjkB,GAAO,YAAc4f,GACrB5f,GAAO,cAAgB6f,GACvB7f,GAAO,cAAgB8f,GACvB9f,GAAO,gBAAkB+f,GACzB/f,GAAO,kBAAoBggB,GAC3BhgB,GAAO,kBAAoBigB,GAC3BjgB,GAAO,UAAY0tB,IACnB1tB,GAAO,WAAa2tB,IACpB3tB,GAAO,SAAWqyB,IAClBryB,GAAO,IAAMwyB,IACbxyB,GAAO,MAAQyyB,IACfzyB,GAAO,SAAW4tB,IAClB5tB,GAAO,MAAQ+wB,IACf/wB,GAAO,SAAWsZ,GAClBtZ,GAAO,UAAY8I,GACnB9I,GAAO,SAAW+I,GAClB/I,GAAO,QAAU4uB,IACjB5uB,GAAO,SAAWwZ,GAClBxZ,GAAO,cAAgBopB,IACvBppB,GAAO,SAAWmT,GAClBnT,GAAO,QAAU6uB,IACjB7uB,GAAO,KAAO8uB,IACd9uB,GAAO,QAAU+uB,IACjB/uB,GAAO,UAAYgvB,IACnBhvB,GAAO,SAAWivB,IAClBjvB,GAAO,SAAWqvB,IAClBrvB,GAAO,SAAWixB,IAClBjxB,GAAO,UAAYsvB,IACnBtvB,GAAO,WAAassB,GAGpBtsB,GAAO,KAAOkjB,GACdljB,GAAO,UAAYmjB,GACnBnjB,GAAO,MAAQ0e,GAEfyR,GAAMnwB,IAAS,UAAW,CACxB,IAAIyF,EAAS,CAAC,EACd,OAAA8C,GAAWvI,GAAQ,SAAStK,EAAMghB,EAAY,CACvCha,GAAe,KAAKsD,GAAO,UAAW0W,CAAU,IACnDjR,EAAOiR,CAAU,EAAIhhB,EAEzB,CAAC,EACM+P,CACT,GAAE,EAAI,CAAE,MAAS,EAAM,CAAC,EAWxBzF,GAAO,QAAUvV,EAGjB4L,GAAU,CAAC,OAAQ,UAAW,QAAS,aAAc,UAAW,cAAc,EAAG,SAASqgB,EAAY,CACpG1W,GAAO0W,CAAU,EAAE,YAAc1W,EACnC,CAAC,EAGD3J,GAAU,CAAC,OAAQ,MAAM,EAAG,SAASqgB,EAAYxgB,EAAO,CACtDiK,GAAY,UAAUuW,CAAU,EAAI,SAAS1d,EAAG,CAC9CA,EAAIA,IAAMxO,EAAY,EAAIiU,GAAUqK,GAAU9P,CAAC,EAAG,CAAC,EAEnD,IAAIrC,EAAU,KAAK,cAAgB,CAACT,EAChC,IAAIiK,GAAY,IAAI,EACpB,KAAK,MAAM,EAEf,OAAIxJ,EAAO,aACTA,EAAO,cAAgB+H,GAAU1F,EAAGrC,EAAO,aAAa,EAExDA,EAAO,UAAU,KAAK,CACpB,KAAQ+H,GAAU1F,EAAGrM,CAAgB,EACrC,KAAQ+pB,GAAc/f,EAAO,QAAU,EAAI,QAAU,GACvD,CAAC,EAEIA,CACT,EAEAwJ,GAAY,UAAUuW,EAAa,OAAO,EAAI,SAAS1d,EAAG,CACxD,OAAO,KAAK,QAAQ,EAAE0d,CAAU,EAAE1d,CAAC,EAAE,QAAQ,CAC/C,CACF,CAAC,EAGD3C,GAAU,CAAC,SAAU,MAAO,WAAW,EAAG,SAASqgB,EAAYxgB,EAAO,CACpE,IAAI2L,EAAO3L,EAAQ,EACfw8B,EAAW7wB,GAAQzV,GAAoByV,GAAQvV,EAEnD6T,GAAY,UAAUuW,CAAU,EAAI,SAAS1gB,EAAU,CACrD,IAAIW,GAAS,KAAK,MAAM,EACxB,OAAAA,GAAO,cAAc,KAAK,CACxB,SAAYwY,GAAYnZ,EAAU,CAAC,EACnC,KAAQ6L,CACV,CAAC,EACDlL,GAAO,aAAeA,GAAO,cAAgB+7B,EACtC/7B,EACT,CACF,CAAC,EAGDN,GAAU,CAAC,OAAQ,MAAM,EAAG,SAASqgB,EAAYxgB,EAAO,CACtD,IAAIy8B,EAAW,QAAUz8B,EAAQ,QAAU,IAE3CiK,GAAY,UAAUuW,CAAU,EAAI,UAAW,CAC7C,OAAO,KAAKic,CAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,CACpC,CACF,CAAC,EAGDt8B,GAAU,CAAC,UAAW,MAAM,EAAG,SAASqgB,EAAYxgB,EAAO,CACzD,IAAI08B,EAAW,QAAU18B,EAAQ,GAAK,SAEtCiK,GAAY,UAAUuW,CAAU,EAAI,UAAW,CAC7C,OAAO,KAAK,aAAe,IAAIvW,GAAY,IAAI,EAAI,KAAKyyB,CAAQ,EAAE,CAAC,CACrE,CACF,CAAC,EAEDzyB,GAAY,UAAU,QAAU,UAAW,CACzC,OAAO,KAAK,OAAOiN,EAAQ,CAC7B,EAEAjN,GAAY,UAAU,KAAO,SAAS3J,EAAW,CAC/C,OAAO,KAAK,OAAOA,CAAS,EAAE,KAAK,CACrC,EAEA2J,GAAY,UAAU,SAAW,SAAS3J,EAAW,CACnD,OAAO,KAAK,QAAQ,EAAE,KAAKA,CAAS,CACtC,EAEA2J,GAAY,UAAU,UAAYgQ,GAAS,SAASxG,EAAM/T,EAAM,CAC9D,OAAI,OAAO+T,GAAQ,WACV,IAAIxJ,GAAY,IAAI,EAEtB,KAAK,IAAI,SAAS/J,EAAO,CAC9B,OAAO4U,GAAW5U,EAAOuT,EAAM/T,CAAI,CACrC,CAAC,CACH,CAAC,EAEDuK,GAAY,UAAU,OAAS,SAAS3J,EAAW,CACjD,OAAO,KAAK,OAAOqtB,GAAO1U,GAAY3Y,CAAS,CAAC,CAAC,CACnD,EAEA2J,GAAY,UAAU,MAAQ,SAASkB,EAAOC,EAAK,CACjDD,EAAQyH,GAAUzH,CAAK,EAEvB,IAAI1K,EAAS,KACb,OAAIA,EAAO,eAAiB0K,EAAQ,GAAKC,EAAM,GACtC,IAAInB,GAAYxJ,CAAM,GAE3B0K,EAAQ,EACV1K,EAASA,EAAO,UAAU,CAAC0K,CAAK,EACvBA,IACT1K,EAASA,EAAO,KAAK0K,CAAK,GAExBC,IAAQ9W,IACV8W,EAAMwH,GAAUxH,CAAG,EACnB3K,EAAS2K,EAAM,EAAI3K,EAAO,UAAU,CAAC2K,CAAG,EAAI3K,EAAO,KAAK2K,EAAMD,CAAK,GAE9D1K,EACT,EAEAwJ,GAAY,UAAU,eAAiB,SAAS3J,EAAW,CACzD,OAAO,KAAK,QAAQ,EAAE,UAAUA,CAAS,EAAE,QAAQ,CACrD,EAEA2J,GAAY,UAAU,QAAU,UAAW,CACzC,OAAO,KAAK,KAAKxT,CAAgB,CACnC,EAGA4b,GAAWpI,GAAY,UAAW,SAASzK,EAAMghB,EAAY,CAC3D,IAAImc,EAAgB,qCAAqC,KAAKnc,CAAU,EACpEoc,EAAU,kBAAkB,KAAKpc,CAAU,EAC3Cqc,EAAa/yB,GAAO8yB,EAAW,QAAUpc,GAAc,OAAS,QAAU,IAAOA,CAAU,EAC3Fsc,GAAeF,GAAW,QAAQ,KAAKpc,CAAU,EAEhDqc,IAGL/yB,GAAO,UAAU0W,CAAU,EAAI,UAAW,CACxC,IAAItgB,GAAQ,KAAK,YACbR,GAAOk9B,EAAU,CAAC,CAAC,EAAI,UACvBG,GAAS78B,cAAiB+J,GAC1BnK,GAAWJ,GAAK,CAAC,EACjBs9B,GAAUD,IAAU/yB,GAAQ9J,EAAK,EAEjCwrB,GAAc,SAASxrB,GAAO,CAChC,IAAIO,GAASo8B,EAAW,MAAM/yB,GAAQ/I,GAAU,CAACb,EAAK,EAAGR,EAAI,CAAC,EAC9D,OAAQk9B,GAAWpyB,GAAY/J,GAAO,CAAC,EAAIA,EAC7C,EAEIu8B,IAAWL,GAAiB,OAAO78B,IAAY,YAAcA,GAAS,QAAU,IAElFi9B,GAASC,GAAU,IAErB,IAAIxyB,GAAW,KAAK,UAChByyB,GAAW,CAAC,CAAC,KAAK,YAAY,OAC9BC,GAAcJ,IAAgB,CAACtyB,GAC/B2yB,GAAWJ,IAAU,CAACE,GAE1B,GAAI,CAACH,IAAgBE,GAAS,CAC5B98B,GAAQi9B,GAAWj9B,GAAQ,IAAI+J,GAAY,IAAI,EAC/C,IAAIxJ,GAASjB,EAAK,MAAMU,GAAOR,EAAI,EACnC,OAAAe,GAAO,YAAY,KAAK,CAAE,KAAQkrB,GAAM,KAAQ,CAACD,EAAW,EAAG,QAAWp3B,CAAU,CAAC,EAC9E,IAAI4V,GAAczJ,GAAQ+J,EAAQ,CAC3C,CACA,OAAI0yB,IAAeC,GACV39B,EAAK,MAAM,KAAME,EAAI,GAE9Be,GAAS,KAAK,KAAKirB,EAAW,EACvBwR,GAAeN,EAAUn8B,GAAO,MAAM,EAAE,CAAC,EAAIA,GAAO,MAAM,EAAKA,GACxE,EACF,CAAC,EAGDN,GAAU,CAAC,MAAO,OAAQ,QAAS,OAAQ,SAAU,SAAS,EAAG,SAASqgB,EAAY,CACpF,IAAIhhB,EAAO2G,GAAWqa,CAAU,EAC5B4c,EAAY,0BAA0B,KAAK5c,CAAU,EAAI,MAAQ,OACjEsc,EAAe,kBAAkB,KAAKtc,CAAU,EAEpD1W,GAAO,UAAU0W,CAAU,EAAI,UAAW,CACxC,IAAI9gB,EAAO,UACX,GAAIo9B,GAAgB,CAAC,KAAK,UAAW,CACnC,IAAI58B,GAAQ,KAAK,MAAM,EACvB,OAAOV,EAAK,MAAMwK,GAAQ9J,EAAK,EAAIA,GAAQ,CAAC,EAAGR,CAAI,CACrD,CACA,OAAO,KAAK09B,CAAS,EAAE,SAASl9B,GAAO,CACrC,OAAOV,EAAK,MAAMwK,GAAQ9J,EAAK,EAAIA,GAAQ,CAAC,EAAGR,CAAI,CACrD,CAAC,CACH,CACF,CAAC,EAGD2S,GAAWpI,GAAY,UAAW,SAASzK,EAAMghB,EAAY,CAC3D,IAAIqc,EAAa/yB,GAAO0W,CAAU,EAClC,GAAIqc,EAAY,CACd,IAAI/6B,EAAM+6B,EAAW,KAAO,GACvBr2B,GAAe,KAAK4C,GAAWtH,CAAG,IACrCsH,GAAUtH,CAAG,EAAI,CAAC,GAEpBsH,GAAUtH,CAAG,EAAE,KAAK,CAAE,KAAQ0e,EAAY,KAAQqc,CAAW,CAAC,CAChE,CACF,CAAC,EAEDzzB,GAAU+X,GAAa7sB,EAAWe,CAAkB,EAAE,IAAI,EAAI,CAAC,CAC7D,KAAQ,UACR,KAAQf,CACV,CAAC,EAGD2V,GAAY,UAAU,MAAQQ,GAC9BR,GAAY,UAAU,QAAUU,GAChCV,GAAY,UAAU,MAAQW,GAG9Bd,GAAO,UAAU,GAAK8hB,GACtB9hB,GAAO,UAAU,MAAQ+hB,GACzB/hB,GAAO,UAAU,OAASgiB,GAC1BhiB,GAAO,UAAU,KAAOiiB,GACxBjiB,GAAO,UAAU,MAAQqiB,GACzBriB,GAAO,UAAU,QAAUuiB,GAC3BviB,GAAO,UAAU,OAASA,GAAO,UAAU,QAAUA,GAAO,UAAU,MAAQyiB,GAG9EziB,GAAO,UAAU,MAAQA,GAAO,UAAU,KAEtCrC,KACFqC,GAAO,UAAUrC,EAAW,EAAIykB,IAE3BpiB,EACT,GAKIrE,GAAIF,GAAa,EAGjB,OAAO,QAAU,YAAc,OAAO,OAAO,KAAO,UAAY,OAAO,KAKzE7G,GAAK,EAAI+G,GAIT,OAAO,UAAW,CAChB,OAAOA,EACT,CAAC,GAGM7G,KAENA,GAAW,QAAU6G,IAAG,EAAIA,GAE7B9G,GAAY,EAAI8G,IAIhB/G,GAAK,EAAI+G,EAEb,GAAE,KAAKrR,EAAI,IC/1hBX,IAAAipC,GAAAC,GAAA,CAAAC,GAAAC,KAAA,EAAC,SAA0CC,EAAMC,EAAS,CACtD,OAAOH,IAAY,UAAY,OAAOC,IAAW,SACnDA,GAAO,QAAUE,EAAQ,EAClB,OAAO,QAAW,YAAc,OAAO,IAC9C,OAAO,CAAC,EAAGA,CAAO,EACX,OAAOH,IAAY,SAC1BA,GAAQ,KAAUG,EAAQ,EAE1BD,EAAK,KAAUC,EAAQ,CACzB,GAAG,OAAO,KAAS,IAAc,KAAOH,GAAM,UAAW,CACzD,OAAiB,SAASI,EAAS,CAEzB,IAAIC,EAAmB,CAAC,EAGxB,SAASC,EAAoBC,EAAU,CAGtC,GAAGF,EAAiBE,CAAQ,EAC3B,OAAOF,EAAiBE,CAAQ,EAAE,QAGnC,IAAIN,EAASI,EAAiBE,CAAQ,EAAI,CACzC,EAAGA,EACH,EAAG,GACH,QAAS,CAAC,CACX,EAGA,OAAAH,EAAQG,CAAQ,EAAE,KAAKN,EAAO,QAASA,EAAQA,EAAO,QAASK,CAAmB,EAGlFL,EAAO,EAAI,GAGJA,EAAO,OACf,CAIA,OAAAK,EAAoB,EAAIF,EAGxBE,EAAoB,EAAID,EAGxBC,EAAoB,EAAI,SAASN,EAASQ,EAAMC,EAAQ,CACnDH,EAAoB,EAAEN,EAASQ,CAAI,GACtC,OAAO,eAAeR,EAASQ,EAAM,CACpC,aAAc,GACd,WAAY,GACZ,IAAKC,CACN,CAAC,CAEH,EAGAH,EAAoB,EAAI,SAASL,EAAQ,CACxC,IAAIQ,EAASR,GAAUA,EAAO,WAC7B,UAAsB,CAAE,OAAOA,EAAO,OAAY,EAClD,UAA4B,CAAE,OAAOA,CAAQ,EAC9C,OAAAK,EAAoB,EAAEG,EAAQ,IAAKA,CAAM,EAClCA,CACR,EAGAH,EAAoB,EAAI,SAASI,EAAQC,EAAU,CAAE,OAAO,OAAO,UAAU,eAAe,KAAKD,EAAQC,CAAQ,CAAG,EAGpHL,EAAoB,EAAI,GAGjBA,EAAoBA,EAAoB,EAAI,CAAC,CACrD,GAEC,EAEH,SAASL,EAAQD,EAASM,EAAqB,CAEtD,aAEA,OAAO,eAAeN,EAAS,aAAc,CAAE,MAAO,EAAK,CAAC,EAC5D,IAAIY,GAA2B,UAAY,CACvC,SAASA,EAAUC,EAAMC,EAAO,CAC5B,KAAK,MAAQA,EACb,KAAK,OAASD,EAAK,OAASC,EAC5B,KAAK,KAAOD,CAChB,CACA,OAAAD,EAAU,YAAc,SAAUE,EAAOC,EAAQ,CAC7C,OAAO,IAAIH,EAAU,IAAI,kBAAkBE,EAAQC,CAAM,EAAGD,CAAK,CACrE,EACAF,EAAU,UAAU,IAAM,SAAUI,EAAGC,EAAG,CACtC,OAAID,EAAI,GAAKA,GAAK,KAAK,OAASC,EAAI,GAAKA,GAAK,KAAK,OACxC,GAEJ,CAAC,CAAC,KAAK,KAAKA,EAAI,KAAK,MAAQD,CAAC,CACzC,EACAJ,EAAU,UAAU,IAAM,SAAUI,EAAGC,EAAGC,EAAG,CACzC,KAAK,KAAKD,EAAI,KAAK,MAAQD,CAAC,EAAIE,EAAI,EAAI,CAC5C,EACAN,EAAU,UAAU,UAAY,SAAUO,EAAMC,EAAKN,EAAOC,EAAQG,EAAG,CACnE,QAASD,EAAIG,EAAKH,EAAIG,EAAML,EAAQE,IAChC,QAASD,EAAIG,EAAMH,EAAIG,EAAOL,EAAOE,IACjC,KAAK,IAAIA,EAAGC,EAAG,CAAC,CAACC,CAAC,CAG9B,EACON,CACX,GAAE,EACFZ,EAAQ,UAAYY,CAGd,IAEC,SAASX,EAAQD,EAASM,EAAqB,CAEtD,aAEA,OAAO,eAAeN,EAAS,aAAc,CAAE,MAAO,EAAK,CAAC,EAC5D,IAAIqB,EAAkBf,EAAoB,CAAC,EAC3C,SAASgB,EAAgBC,EAAGC,EAAG,CAC3B,OAAOD,EAAIC,CACf,CACAxB,EAAQ,gBAAkBsB,EAC1B,IAAIG,GAA2B,UAAY,CACvC,SAASA,EAAUC,EAAWC,EAAMC,EAAS,CACzC,KAAK,UAAYF,EACjB,KAAK,KAAOC,EACZ,KAAK,cAAgBC,EACrB,KAAK,SAAW,IAAI,MAAM,KAAK,IAAI,EACnC,KAAK,SAAW,IAAI,MAAM,KAAK,IAAI,EAEnC,QADIZ,EAAI,EACCa,EAAI,EAAGA,EAAI,KAAK,KAAMA,IAC3B,KAAK,SAASA,CAAC,EAAIb,EACnBA,EAAIA,EAAI,EACJA,GAAK,KAAK,OACVA,GAAKA,EAAI,KAAK,WAAc,KAAK,KAAO,GAGhD,QAASa,EAAI,EAAGA,EAAI,KAAK,KAAO,EAAGA,IAC/B,KAAK,SAAS,KAAK,SAASA,CAAC,CAAC,EAAIA,EAEtC,KAAK,KAAO,IAAIR,EAAgB,QAAQ,KAAM,kBAAkB,KAAK,CAAC,CAAC,CAAC,CAAC,EACzE,KAAK,IAAM,IAAIA,EAAgB,QAAQ,KAAM,kBAAkB,KAAK,CAAC,CAAC,CAAC,CAAC,CAC5E,CACA,OAAAI,EAAU,UAAU,SAAW,SAAU,EAAGD,EAAG,CAC3C,OAAI,IAAM,GAAKA,IAAM,EACV,EAEJ,KAAK,UAAU,KAAK,SAAS,CAAC,EAAI,KAAK,SAASA,CAAC,IAAM,KAAK,KAAO,EAAE,CAChF,EACAC,EAAU,UAAU,QAAU,SAAU,EAAG,CACvC,GAAI,IAAM,EACN,MAAM,IAAI,MAAM,gBAAgB,EAEpC,OAAO,KAAK,SAAS,KAAK,KAAO,KAAK,SAAS,CAAC,EAAI,CAAC,CACzD,EACAA,EAAU,UAAU,cAAgB,SAAUK,EAAQC,EAAa,CAC/D,GAAID,EAAS,EACT,MAAM,IAAI,MAAM,qCAAqC,EAEzD,GAAIC,IAAgB,EAChB,OAAO,KAAK,KAEhB,IAAIC,EAAe,IAAI,kBAAkBF,EAAS,CAAC,EACnD,OAAAE,EAAa,CAAC,EAAID,EACX,IAAIV,EAAgB,QAAQ,KAAMW,CAAY,CACzD,EACAP,EAAU,UAAU,IAAM,SAAU,EAAG,CACnC,GAAI,IAAM,EACN,MAAM,IAAI,MAAM,mBAAmB,EAEvC,OAAO,KAAK,SAAS,CAAC,CAC1B,EACAA,EAAU,UAAU,IAAM,SAAU,EAAG,CACnC,OAAO,KAAK,SAAS,CAAC,CAC1B,EACOA,CACX,GAAE,EACFzB,EAAQ,QAAUyB,CAGZ,IAEC,SAASxB,EAAQD,EAASM,EAAqB,CAEtD,aAEA,OAAO,eAAeN,EAAS,aAAc,CAAE,MAAO,EAAK,CAAC,EAC5D,IAAIiC,EAAc3B,EAAoB,CAAC,EACnC4B,GAA+B,UAAY,CAC3C,SAASA,EAAcC,EAAOH,EAAc,CACxC,GAAIA,EAAa,SAAW,EACxB,MAAM,IAAI,MAAM,kBAAkB,EAEtC,KAAK,MAAQG,EACb,IAAIC,EAAqBJ,EAAa,OACtC,GAAII,EAAqB,GAAKJ,EAAa,CAAC,IAAM,EAAG,CAGjD,QADIK,EAAe,EACZA,EAAeD,GAAsBJ,EAAaK,CAAY,IAAM,GACvEA,IAEJ,GAAIA,IAAiBD,EACjB,KAAK,aAAeD,EAAM,KAAK,iBAE9B,CACD,KAAK,aAAe,IAAI,kBAAkBC,EAAqBC,CAAY,EAC3E,QAASR,EAAI,EAAGA,EAAI,KAAK,aAAa,OAAQA,IAC1C,KAAK,aAAaA,CAAC,EAAIG,EAAaK,EAAeR,CAAC,CAE5D,CACJ,MAEI,KAAK,aAAeG,CAE5B,CACA,OAAAE,EAAc,UAAU,OAAS,UAAY,CACzC,OAAO,KAAK,aAAa,OAAS,CACtC,EACAA,EAAc,UAAU,OAAS,UAAY,CACzC,OAAO,KAAK,aAAa,CAAC,IAAM,CACpC,EACAA,EAAc,UAAU,eAAiB,SAAUJ,EAAQ,CACvD,OAAO,KAAK,aAAa,KAAK,aAAa,OAAS,EAAIA,CAAM,CAClE,EACAI,EAAc,UAAU,cAAgB,SAAUI,EAAO,CACrD,IAAIC,EACJ,GAAI,KAAK,OAAO,EACZ,OAAOD,EAEX,GAAIA,EAAM,OAAO,EACb,OAAO,KAEX,IAAIE,EAAsB,KAAK,aAC3BC,EAAqBH,EAAM,aAC3BE,EAAoB,OAASC,EAAmB,SAChDF,EAAK,CAACE,EAAoBD,CAAmB,EAAGA,EAAsBD,EAAG,CAAC,EAAGE,EAAqBF,EAAG,CAAC,GAI1G,QAFIG,EAAU,IAAI,kBAAkBD,EAAmB,MAAM,EACzDE,EAAaF,EAAmB,OAASD,EAAoB,OACxDX,EAAI,EAAGA,EAAIc,EAAYd,IAC5Ba,EAAQb,CAAC,EAAIY,EAAmBZ,CAAC,EAErC,QAASA,EAAIc,EAAYd,EAAIY,EAAmB,OAAQZ,IACpDa,EAAQb,CAAC,EAAII,EAAY,gBAAgBO,EAAoBX,EAAIc,CAAU,EAAGF,EAAmBZ,CAAC,CAAC,EAEvG,OAAO,IAAIK,EAAc,KAAK,MAAOQ,CAAO,CAChD,EACAR,EAAc,UAAU,SAAW,SAAUU,EAAQ,CACjD,GAAIA,IAAW,EACX,OAAO,KAAK,MAAM,KAEtB,GAAIA,IAAW,EACX,OAAO,KAIX,QAFIjB,EAAO,KAAK,aAAa,OACzBkB,EAAU,IAAI,kBAAkBlB,CAAI,EAC/BE,EAAI,EAAGA,EAAIF,EAAME,IACtBgB,EAAQhB,CAAC,EAAI,KAAK,MAAM,SAAS,KAAK,aAAaA,CAAC,EAAGe,CAAM,EAEjE,OAAO,IAAIV,EAAc,KAAK,MAAOW,CAAO,CAChD,EACAX,EAAc,UAAU,aAAe,SAAUI,EAAO,CACpD,GAAI,KAAK,OAAO,GAAKA,EAAM,OAAO,EAC9B,OAAO,KAAK,MAAM,KAOtB,QALIQ,EAAgB,KAAK,aACrBC,EAAUD,EAAc,OACxBE,EAAgBV,EAAM,aACtBW,EAAUD,EAAc,OACxBH,EAAU,IAAI,kBAAkBE,EAAUE,EAAU,CAAC,EAChDpB,EAAI,EAAGA,EAAIkB,EAASlB,IAEzB,QADIqB,EAASJ,EAAcjB,CAAC,EACnBsB,EAAI,EAAGA,EAAIF,EAASE,IACzBN,EAAQhB,EAAIsB,CAAC,EAAIlB,EAAY,gBAAgBY,EAAQhB,EAAIsB,CAAC,EAAG,KAAK,MAAM,SAASD,EAAQF,EAAcG,CAAC,CAAC,CAAC,EAGlH,OAAO,IAAIjB,EAAc,KAAK,MAAOW,CAAO,CAChD,EACAX,EAAc,UAAU,mBAAqB,SAAUJ,EAAQC,EAAa,CACxE,GAAID,EAAS,EACT,MAAM,IAAI,MAAM,4BAA4B,EAEhD,GAAIC,IAAgB,EAChB,OAAO,KAAK,MAAM,KAItB,QAFIJ,EAAO,KAAK,aAAa,OACzBkB,EAAU,IAAI,kBAAkBlB,EAAOG,CAAM,EACxCD,EAAI,EAAGA,EAAIF,EAAME,IACtBgB,EAAQhB,CAAC,EAAI,KAAK,MAAM,SAAS,KAAK,aAAaA,CAAC,EAAGE,CAAW,EAEtE,OAAO,IAAIG,EAAc,KAAK,MAAOW,CAAO,CAChD,EACAX,EAAc,UAAU,WAAa,SAAUX,EAAG,CAC9C,IAAI6B,EAAS,EACb,GAAI7B,IAAM,EAEN,OAAO,KAAK,eAAe,CAAC,EAEhC,IAAII,EAAO,KAAK,aAAa,OAC7B,GAAIJ,IAAM,EAEN,YAAK,aAAa,QAAQ,SAAUQ,EAAa,CAC7CqB,EAASnB,EAAY,gBAAgBmB,EAAQrB,CAAW,CAC5D,CAAC,EACMqB,EAEXA,EAAS,KAAK,aAAa,CAAC,EAC5B,QAASvB,EAAI,EAAGA,EAAIF,EAAME,IACtBuB,EAASnB,EAAY,gBAAgB,KAAK,MAAM,SAASV,EAAG6B,CAAM,EAAG,KAAK,aAAavB,CAAC,CAAC,EAE7F,OAAOuB,CACX,EACOlB,CACX,GAAE,EACFlC,EAAQ,QAAUkC,CAGZ,IAEC,SAASjC,EAAQD,EAASM,EAAqB,CAEtD,aAEA,OAAO,eAAeN,EAAS,aAAc,CAAE,MAAO,EAAK,CAAC,EAC5D,IAAIqD,EAAc/C,EAAoB,CAAC,EACnCgD,EAAYhD,EAAoB,CAAC,EACjCiD,EAAcjD,EAAoB,EAAE,EACpCkD,EAAYlD,EAAoB,EAAE,EACtC,SAASmD,EAAKC,EAAQ,CAClB,IAAIC,EAAYH,EAAU,OAAOE,CAAM,EACvC,GAAI,CAACC,EACD,OAAO,KAEX,QAASC,EAAK,EAAGC,EAAcF,EAAWC,EAAKC,EAAY,OAAQD,IAAM,CACrE,IAAIE,EAAaD,EAAYD,CAAE,EAC3BG,EAAYR,EAAY,QAAQG,EAAQI,CAAU,EAClDE,EAAUV,EAAU,OAAOS,EAAU,MAAM,EAC/C,GAAIC,EACA,MAAO,CACH,WAAYA,EAAQ,MACpB,KAAMA,EAAQ,KACd,OAAQA,EAAQ,OAChB,QAASA,EAAQ,QACjB,SAAU,CACN,eAAgBD,EAAU,gBAAgBD,EAAW,UAAW,CAAC,EACjE,cAAeC,EAAU,gBAAgB,EAAG,CAAC,EAC7C,kBAAmBA,EAAU,gBAAgBD,EAAW,UAAWA,EAAW,SAAS,EACvF,iBAAkBC,EAAU,gBAAgB,EAAGD,EAAW,SAAS,EACnE,sBAAuBA,EAAW,SAClC,qBAAsBA,EAAW,QACjC,wBAAyBA,EAAW,WACpC,4BAA6BA,EAAW,gBAC5C,CACJ,CAER,CACA,OAAO,IACX,CACA,IAAIG,EAAiB,CACjB,kBAAmB,aACvB,EACA,SAASC,EAAKrD,EAAMC,EAAOC,EAAQoD,EAAiB,CAC5CA,IAAoB,SAAUA,EAAkB,CAAC,GACrD,IAAIC,EAAUH,EACd,OAAO,KAAKG,GAAW,CAAC,CAAC,EAAE,QAAQ,SAAUC,EAAK,CAC9CD,EAAQC,CAAG,EAAIF,EAAgBE,CAAG,GAAKD,EAAQC,CAAG,CACtD,CAAC,EACD,IAAIC,EAAeF,EAAQ,oBAAsB,eAAiBA,EAAQ,oBAAsB,cAC5FG,EAAmBH,EAAQ,oBAAsB,cAAgBA,EAAQ,oBAAsB,cAC/F7B,EAAKc,EAAY,SAASxC,EAAMC,EAAOC,EAAQuD,CAAY,EAAGE,EAAYjC,EAAG,UAAWkC,EAAWlC,EAAG,SACtGa,EAASK,EAAKc,EAAmBE,EAAWD,CAAS,EACzD,MAAI,CAACpB,IAAWgB,EAAQ,oBAAsB,eAAiBA,EAAQ,oBAAsB,iBACzFhB,EAASK,EAAKc,EAAmBC,EAAYC,CAAQ,GAElDrB,CACX,CACAc,EAAK,QAAUA,EACflE,EAAQ,QAAUkE,CAGZ,IAEC,SAASjE,EAAQD,EAASM,EAAqB,CAEtD,aAEA,OAAO,eAAeN,EAAS,aAAc,CAAE,MAAO,EAAK,CAAC,EAC5D,IAAI0E,EAAcpE,EAAoB,CAAC,EACnCqE,EAAc,EACdC,EAAoB,GACxB,SAASC,EAAWC,EAAOC,EAAKC,EAAK,CACjC,OAAOF,EAAQC,EAAMA,EAAMD,EAAQE,EAAMA,EAAMF,CACnD,CAEA,IAAIG,GAAwB,UAAY,CACpC,SAASA,EAAOnE,EAAOC,EAAQ,CAC3B,KAAK,MAAQD,EACb,KAAK,KAAO,IAAI,kBAAkBA,EAAQC,CAAM,CACpD,CACA,OAAAkE,EAAO,UAAU,IAAM,SAAUjE,EAAGC,EAAG,CACnC,OAAO,KAAK,KAAKA,EAAI,KAAK,MAAQD,CAAC,CACvC,EACAiE,EAAO,UAAU,IAAM,SAAUjE,EAAGC,EAAG6D,EAAO,CAC1C,KAAK,KAAK7D,EAAI,KAAK,MAAQD,CAAC,EAAI8D,CACpC,EACOG,CACX,GAAE,EACF,SAASC,EAASrE,EAAMC,EAAOC,EAAQoE,EAAgB,CACnD,GAAItE,EAAK,SAAWC,EAAQC,EAAS,EACjC,MAAM,IAAI,MAAM,qCAAqC,EAIzD,QADIqE,EAAkB,IAAIH,EAAOnE,EAAOC,CAAM,EACrCC,EAAI,EAAGA,EAAIF,EAAOE,IACvB,QAASC,EAAI,EAAGA,EAAIF,EAAQE,IAAK,CAC7B,IAAIoE,EAAIxE,GAAOI,EAAIH,EAAQE,GAAK,EAAK,CAAC,EAClCsE,EAAIzE,GAAOI,EAAIH,EAAQE,GAAK,EAAK,CAAC,EAClCQ,EAAIX,GAAOI,EAAIH,EAAQE,GAAK,EAAK,CAAC,EACtCoE,EAAgB,IAAIpE,EAAGC,EAAG,MAASoE,EAAI,MAASC,EAAI,MAAS9D,CAAC,CAClE,CAKJ,QAHI+D,EAAwB,KAAK,KAAKzE,EAAQ6D,CAAW,EACrDa,EAAsB,KAAK,KAAKzE,EAAS4D,CAAW,EACpDc,EAAc,IAAIR,EAAOM,EAAuBC,CAAmB,EAC9DE,EAAiB,EAAGA,EAAiBF,EAAqBE,IAC/D,QAASC,EAAoB,EAAGA,EAAoBJ,EAAuBI,IAAqB,CAI5F,QAHIC,EAAM,EACNb,EAAM,IACNC,EAAM,EACD/D,EAAI,EAAGA,EAAI0D,EAAa1D,IAC7B,QAASD,EAAI,EAAGA,EAAI2D,EAAa3D,IAAK,CAClC,IAAI6E,EAAgBT,EAAgB,IAAIO,EAAoBhB,EAAc3D,EAAG0E,EAAiBf,EAAc1D,CAAC,EAC7G2E,GAAOC,EACPd,EAAM,KAAK,IAAIA,EAAKc,CAAa,EACjCb,EAAM,KAAK,IAAIA,EAAKa,CAAa,CACrC,CAEJ,IAAIC,EAAUF,EAAO,KAAK,IAAIjB,EAAa,CAAC,EAC5C,GAAIK,EAAMD,GAAOH,IAMbkB,EAAUf,EAAM,EACZW,EAAiB,GAAKC,EAAoB,GAAG,CAO7C,IAAII,GAA6BN,EAAY,IAAIE,EAAmBD,EAAiB,CAAC,EACjF,EAAID,EAAY,IAAIE,EAAoB,EAAGD,CAAc,EAC1DD,EAAY,IAAIE,EAAoB,EAAGD,EAAiB,CAAC,GAAK,EAC9DX,EAAMgB,IACND,EAAUC,EAElB,CAEJN,EAAY,IAAIE,EAAmBD,EAAgBI,CAAO,CAC9D,CAEJ,IAAItB,EAAYE,EAAY,UAAU,YAAY5D,EAAOC,CAAM,EAC3D0D,EAAW,KACXU,IACAV,EAAWC,EAAY,UAAU,YAAY5D,EAAOC,CAAM,GAE9D,QAAS2E,EAAiB,EAAGA,EAAiBF,EAAqBE,IAC/D,QAASC,EAAoB,EAAGA,EAAoBJ,EAAuBI,IAAqB,CAI5F,QAHIxE,EAAO0D,EAAWc,EAAmB,EAAGJ,EAAwB,CAAC,EACjES,EAAQnB,EAAWa,EAAgB,EAAGF,EAAsB,CAAC,EAC7DI,EAAM,EACDK,EAAU,GAAIA,GAAW,EAAGA,IACjC,QAASC,EAAU,GAAIA,GAAW,EAAGA,IACjCN,GAAOH,EAAY,IAAItE,EAAO8E,EAASD,EAAQE,CAAO,EAI9D,QADIC,EAAYP,EAAM,GACbK,EAAU,EAAGA,EAAUtB,EAAasB,IACzC,QAASC,EAAU,EAAGA,EAAUvB,EAAauB,IAAW,CACpD,IAAIlF,EAAI2E,EAAoBhB,EAAcsB,EACtChF,EAAIyE,EAAiBf,EAAcuB,EACnCE,EAAMhB,EAAgB,IAAIpE,EAAGC,CAAC,EAClCuD,EAAU,IAAIxD,EAAGC,EAAGmF,GAAOD,CAAS,EAChChB,GACAV,EAAS,IAAIzD,EAAGC,EAAG,EAAEmF,GAAOD,EAAU,CAE9C,CAER,CAEJ,OAAIhB,EACO,CAAE,UAAWX,EAAW,SAAUC,CAAS,EAE/C,CAAE,UAAWD,CAAU,CAClC,CACAxE,EAAQ,SAAWkF,CAGb,IAEC,SAASjF,EAAQD,EAASM,EAAqB,CAEtD,aAEA,OAAO,eAAeN,EAAS,aAAc,CAAE,MAAO,EAAK,CAAC,EAC5D,IAAI0E,EAAcpE,EAAoB,CAAC,EACnC+F,EAAe/F,EAAoB,CAAC,EACpCgG,EAAgBhG,EAAoB,CAAC,EACrCiG,EAAYjG,EAAoB,EAAE,EAEtC,SAASkG,EAAiBxF,EAAGC,EAAG,CAG5B,QAFIwF,EAAIzF,EAAIC,EACRyF,EAAW,EACRD,GACHC,IACAD,GAAKA,EAAI,EAEb,OAAOC,CACX,CACA,SAASC,EAAQC,EAAKC,EAAM,CACxB,OAAQA,GAAQ,EAAKD,CACzB,CAEA,IAAIE,EAAoB,CACpB,CAAE,KAAM,MAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,EACrE,CAAE,KAAM,MAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,EACrE,CAAE,KAAM,MAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,EACrE,CAAE,KAAM,MAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,EACrE,CAAE,KAAM,MAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,EACrE,CAAE,KAAM,MAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,EACrE,CAAE,KAAM,MAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,EACrE,CAAE,KAAM,MAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,EACrE,CAAE,KAAM,MAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,EACrE,CAAE,KAAM,MAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,EACrE,CAAE,KAAM,MAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,EACrE,CAAE,KAAM,MAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,EACrE,CAAE,KAAM,MAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,EACrE,CAAE,KAAM,MAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,EACrE,CAAE,KAAM,MAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,EACrE,CAAE,KAAM,MAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,EACrE,CAAE,KAAM,KAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,EACrE,CAAE,KAAM,KAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,EACrE,CAAE,KAAM,KAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,EACrE,CAAE,KAAM,KAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,EACrE,CAAE,KAAM,KAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,EACrE,CAAE,KAAM,IAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,EACrE,CAAE,KAAM,KAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,EACrE,CAAE,KAAM,KAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,EACrE,CAAE,KAAM,MAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,EACrE,CAAE,KAAM,MAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,EACrE,CAAE,KAAM,MAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,EACrE,CAAE,KAAM,MAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,EACrE,CAAE,KAAM,KAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,EACrE,CAAE,KAAM,KAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,EACrE,CAAE,KAAM,MAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,EACrE,CAAE,KAAM,MAAQ,WAAY,CAAE,qBAAsB,EAAG,SAAU,CAAE,CAAE,CACzE,EACIC,EAAa,CACb,SAAUC,EAAG,CAAE,OAASA,EAAE,EAAIA,EAAE,GAAK,IAAO,CAAG,EAC/C,SAAUA,EAAG,CAAE,OAAQA,EAAE,EAAI,IAAO,CAAG,EACvC,SAAUA,EAAG,CAAE,OAAOA,EAAE,EAAI,IAAM,CAAG,EACrC,SAAUA,EAAG,CAAE,OAAQA,EAAE,EAAIA,EAAE,GAAK,IAAM,CAAG,EAC7C,SAAUA,EAAG,CAAE,OAAQ,KAAK,MAAMA,EAAE,EAAI,CAAC,EAAI,KAAK,MAAMA,EAAE,EAAI,CAAC,GAAK,IAAM,CAAG,EAC7E,SAAUA,EAAG,CAAE,OAASA,EAAE,EAAIA,EAAE,EAAK,EAAOA,EAAE,EAAIA,EAAE,EAAK,IAAO,CAAG,EACnE,SAAUA,EAAG,CAAE,OAAWA,EAAE,EAAIA,EAAE,EAAK,EAAMA,EAAE,EAAIA,EAAE,EAAK,GAAK,IAAO,CAAG,EACzE,SAAUA,EAAG,CAAE,QAAWA,EAAE,EAAIA,EAAE,GAAK,EAAMA,EAAE,EAAIA,EAAE,EAAK,GAAK,IAAO,CAAG,CAC7E,EACA,SAASC,EAAyBC,EAAS,CACvC,IAAIC,EAAY,GAAK,EAAID,EAAQ,cAC7BxD,EAASgB,EAAY,UAAU,YAAYyC,EAAWA,CAAS,EACnEzD,EAAO,UAAU,EAAG,EAAG,EAAG,EAAG,EAAI,EACjCA,EAAO,UAAUyD,EAAY,EAAG,EAAG,EAAG,EAAG,EAAI,EAC7CzD,EAAO,UAAU,EAAGyD,EAAY,EAAG,EAAG,EAAG,EAAI,EAE7C,QAASvD,EAAK,EAAGrB,EAAK2E,EAAQ,wBAAyBtD,EAAKrB,EAAG,OAAQqB,IAEnE,QADI5C,EAAIuB,EAAGqB,CAAE,EACJwD,EAAK,EAAGC,EAAKH,EAAQ,wBAAyBE,EAAKC,EAAG,OAAQD,IAAM,CACzE,IAAInG,EAAIoG,EAAGD,CAAE,EACPpG,IAAM,GAAKC,IAAM,GAAKD,IAAM,GAAKC,IAAMkG,EAAY,GAAKnG,IAAMmG,EAAY,GAAKlG,IAAM,GACvFyC,EAAO,UAAU1C,EAAI,EAAGC,EAAI,EAAG,EAAG,EAAG,EAAI,CAEjD,CAEJ,OAAAyC,EAAO,UAAU,EAAG,EAAG,EAAGyD,EAAY,GAAI,EAAI,EAC9CzD,EAAO,UAAU,EAAG,EAAGyD,EAAY,GAAI,EAAG,EAAI,EAC1CD,EAAQ,cAAgB,IACxBxD,EAAO,UAAUyD,EAAY,GAAI,EAAG,EAAG,EAAG,EAAI,EAC9CzD,EAAO,UAAU,EAAGyD,EAAY,GAAI,EAAG,EAAG,EAAI,GAE3CzD,CACX,CACA,SAAS4D,EAAc5D,EAAQwD,EAASK,EAAY,CAShD,QARIC,EAAWT,EAAWQ,EAAW,QAAQ,EACzCJ,EAAYzD,EAAO,OACnB+D,EAAsBR,EAAyBC,CAAO,EACtDQ,EAAY,CAAC,EACbC,EAAc,EACdC,EAAW,EAEXC,EAAY,GACPC,EAAcX,EAAY,EAAGW,EAAc,EAAGA,GAAe,EAAG,CACjEA,IAAgB,GAChBA,IAEJ,QAASjG,EAAI,EAAGA,EAAIsF,EAAWtF,IAE3B,QADIZ,EAAI4G,EAAYV,EAAY,EAAItF,EAAIA,EAC/BkG,EAAe,EAAGA,EAAe,EAAGA,IAAgB,CACzD,IAAI/G,EAAI8G,EAAcC,EACtB,GAAI,CAACN,EAAoB,IAAIzG,EAAGC,CAAC,EAAG,CAChC2G,IACA,IAAIhB,EAAMlD,EAAO,IAAI1C,EAAGC,CAAC,EACrBuG,EAAS,CAAE,EAAGvG,EAAG,EAAGD,CAAE,CAAC,IACvB4F,EAAM,CAACA,GAEXe,EAAchB,EAAQC,EAAKe,CAAW,EAClCC,IAAa,IACbF,EAAU,KAAKC,CAAW,EAC1BC,EAAW,EACXD,EAAc,EAEtB,CACJ,CAEJE,EAAY,CAACA,CACjB,CACA,OAAOH,CACX,CACA,SAASM,EAAYtE,EAAQ,CACzB,IAAIyD,EAAYzD,EAAO,OACnBuE,EAAqB,KAAK,OAAOd,EAAY,IAAM,CAAC,EACxD,GAAIc,GAAsB,EACtB,OAAO1B,EAAU,SAAS0B,EAAqB,CAAC,EAGpD,QADIC,EAAsB,EACjBjH,EAAI,EAAGA,GAAK,EAAGA,IACpB,QAASD,EAAImG,EAAY,EAAGnG,GAAKmG,EAAY,GAAInG,IAC7CkH,EAAsBvB,EAAQjD,EAAO,IAAI1C,EAAGC,CAAC,EAAGiH,CAAmB,EAI3E,QADIC,EAAwB,EACnBnH,EAAI,EAAGA,GAAK,EAAGA,IACpB,QAASC,EAAIkG,EAAY,EAAGlG,GAAKkG,EAAY,GAAIlG,IAC7CkH,EAAwBxB,EAAQjD,EAAO,IAAI1C,EAAGC,CAAC,EAAGkH,CAAqB,EAK/E,QAFIC,EAAiB,IACjBC,EACKzE,EAAK,EAAG0E,EAAa/B,EAAU,SAAU3C,EAAK0E,EAAW,OAAQ1E,IAAM,CAC5E,IAAIsD,EAAUoB,EAAW1E,CAAE,EAC3B,GAAIsD,EAAQ,WAAagB,GAAuBhB,EAAQ,WAAaiB,EACjE,OAAOjB,EAEX,IAAIqB,EAAa/B,EAAiB0B,EAAqBhB,EAAQ,QAAQ,EACnEqB,EAAaH,IACbC,EAAcnB,EACdkB,EAAiBG,GAErBA,EAAa/B,EAAiB2B,EAAuBjB,EAAQ,QAAQ,EACjEqB,EAAaH,IACbC,EAAcnB,EACdkB,EAAiBG,EAEzB,CAGA,GAAIH,GAAkB,EAClB,OAAOC,CAEf,CACA,SAASG,EAAsB9E,EAAQ,CAEnC,QADI+E,EAAwB,EACnBzH,EAAI,EAAGA,GAAK,EAAGA,IAChBA,IAAM,IACNyH,EAAwB9B,EAAQjD,EAAO,IAAI1C,EAAG,CAAC,EAAGyH,CAAqB,GAG/E,QAASxH,EAAI,EAAGA,GAAK,EAAGA,IAChBA,IAAM,IACNwH,EAAwB9B,EAAQjD,EAAO,IAAI,EAAGzC,CAAC,EAAGwH,CAAqB,GAK/E,QAFItB,EAAYzD,EAAO,OACnBgF,EAAoC,EAC/BzH,EAAIkG,EAAY,EAAGlG,GAAKkG,EAAY,EAAGlG,IAC5CyH,EAAoC/B,EAAQjD,EAAO,IAAI,EAAGzC,CAAC,EAAGyH,CAAiC,EAEnG,QAAS1H,EAAImG,EAAY,EAAGnG,EAAImG,EAAWnG,IACvC0H,EAAoC/B,EAAQjD,EAAO,IAAI1C,EAAG,CAAC,EAAG0H,CAAiC,EAInG,QAFIN,EAAiB,IACjBO,EAAiB,KACZ/E,EAAK,EAAGgF,EAAsB9B,EAAmBlD,EAAKgF,EAAoB,OAAQhF,IAAM,CAC7F,IAAIrB,EAAKqG,EAAoBhF,CAAE,EAAGiF,EAAOtG,EAAG,KAAMgF,EAAahF,EAAG,WAClE,GAAIsG,IAASJ,GAAyBI,IAASH,EAC3C,OAAOnB,EAEX,IAAIgB,EAAa/B,EAAiBiC,EAAuBI,CAAI,EACzDN,EAAaH,IACbO,EAAiBpB,EACjBa,EAAiBG,GAEjBE,IAA0BC,IAC1BH,EAAa/B,EAAiBkC,EAAmCG,CAAI,EACjEN,EAAaH,IACbO,EAAiBpB,EACjBa,EAAiBG,GAG7B,CAEA,OAAIH,GAAkB,EACXO,EAEJ,IACX,CACA,SAASG,EAAcpB,EAAWR,EAAS6B,EAAS,CAChD,IAAIC,EAAS9B,EAAQ,sBAAsB6B,CAAO,EAC9CE,EAAa,CAAC,EACdC,EAAiB,EAUrB,GATAF,EAAO,SAAS,QAAQ,SAAUG,EAAO,CACrC,QAAStH,EAAI,EAAGA,EAAIsH,EAAM,UAAWtH,IACjCoH,EAAW,KAAK,CAAE,iBAAkBE,EAAM,sBAAuB,UAAW,CAAC,CAAE,CAAC,EAChFD,GAAkBC,EAAM,sBAAwBH,EAAO,mBAE/D,CAAC,EAIGtB,EAAU,OAASwB,EACnB,OAAO,KAEXxB,EAAYA,EAAU,MAAM,EAAGwB,CAAc,EAG7C,QAFIE,EAAiBJ,EAAO,SAAS,CAAC,EAAE,sBAE/BnH,EAAI,EAAGA,EAAIuH,EAAgBvH,IAChC,QAAS+B,EAAK,EAAGyF,EAAeJ,EAAYrF,EAAKyF,EAAa,OAAQzF,IAAM,CACxE,IAAI0F,EAAYD,EAAazF,CAAE,EAC/B0F,EAAU,UAAU,KAAK5B,EAAU,MAAM,CAAC,CAC9C,CAGJ,GAAIsB,EAAO,SAAS,OAAS,EAGzB,QAFIO,EAAkBP,EAAO,SAAS,CAAC,EAAE,UACrCQ,EAAkBR,EAAO,SAAS,CAAC,EAAE,UAChCnH,EAAI,EAAGA,EAAI2H,EAAiB3H,IACjCoH,EAAWM,EAAkB1H,CAAC,EAAE,UAAU,KAAK6F,EAAU,MAAM,CAAC,EAIxE,KAAOA,EAAU,OAAS,GACtB,QAASnF,EAAK,EAAGkH,EAAeR,EAAY1G,EAAKkH,EAAa,OAAQlH,IAAM,CACxE,IAAI+G,EAAYG,EAAalH,CAAE,EAC/B+G,EAAU,UAAU,KAAK5B,EAAU,MAAM,CAAC,CAC9C,CAEJ,OAAOuB,CACX,CACA,SAASS,EAAahG,EAAQ,CAC1B,IAAIwD,EAAUc,EAAYtE,CAAM,EAChC,GAAI,CAACwD,EACD,OAAO,KAEX,IAAIK,EAAaiB,EAAsB9E,CAAM,EAC7C,GAAI,CAAC6D,EACD,OAAO,KAEX,IAAIG,EAAYJ,EAAc5D,EAAQwD,EAASK,CAAU,EACrD0B,EAAaH,EAAcpB,EAAWR,EAASK,EAAW,oBAAoB,EAClF,GAAI,CAAC0B,EACD,OAAO,KAMX,QAHIU,EAAaV,EAAW,OAAO,SAAU1H,EAAGC,EAAG,CAAE,OAAOD,EAAIC,EAAE,gBAAkB,EAAG,CAAC,EACpFoI,EAAc,IAAI,kBAAkBD,CAAU,EAC9CE,EAAc,EACTjG,EAAK,EAAGkG,EAAeb,EAAYrF,EAAKkG,EAAa,OAAQlG,IAAM,CACxE,IAAI0F,EAAYQ,EAAalG,CAAE,EAC3BmG,EAAiBzD,EAAc,OAAOgD,EAAU,UAAWA,EAAU,UAAU,OAASA,EAAU,gBAAgB,EACtH,GAAI,CAACS,EACD,OAAO,KAEX,QAASlI,EAAI,EAAGA,EAAIyH,EAAU,iBAAkBzH,IAC5C+H,EAAYC,GAAa,EAAIE,EAAelI,CAAC,CAErD,CACA,GAAI,CACA,OAAOwE,EAAa,OAAOuD,EAAa1C,EAAQ,aAAa,CACjE,MACW,CACP,OAAO,IACX,CACJ,CACA,SAAS8C,EAAOtG,EAAQ,CACpB,GAAIA,GAAU,KACV,OAAO,KAEX,IAAIN,EAASsG,EAAahG,CAAM,EAChC,GAAIN,EACA,OAAOA,EAGX,QAASpC,EAAI,EAAGA,EAAI0C,EAAO,MAAO1C,IAC9B,QAASC,EAAID,EAAI,EAAGC,EAAIyC,EAAO,OAAQzC,IAC/ByC,EAAO,IAAI1C,EAAGC,CAAC,IAAMyC,EAAO,IAAIzC,EAAGD,CAAC,IACpC0C,EAAO,IAAI1C,EAAGC,EAAG,CAACyC,EAAO,IAAI1C,EAAGC,CAAC,CAAC,EAClCyC,EAAO,IAAIzC,EAAGD,EAAG,CAAC0C,EAAO,IAAIzC,EAAGD,CAAC,CAAC,GAI9C,OAAO0I,EAAahG,CAAM,CAC9B,CACA1D,EAAQ,OAASgK,CAGX,IAEC,SAAS/J,EAAQD,EAASM,EAAqB,CAEtD,aAEA,OAAO,eAAeN,EAAS,aAAc,CAAE,MAAO,EAAK,CAAC,EAE5D,IAAIiK,EAAc3J,EAAoB,CAAC,EACnC4J,EAAkB5J,EAAoB,CAAC,EACvC6J,GACH,SAAUA,EAAM,CACbA,EAAK,QAAa,UAClBA,EAAK,aAAkB,eACvBA,EAAK,KAAU,OACfA,EAAK,MAAW,QAChBA,EAAK,IAAS,KAClB,GAAGA,EAAOnK,EAAQ,OAASA,EAAQ,KAAO,CAAC,EAAE,EAC7C,IAAIoK,GACH,SAAUA,EAAU,CACjBA,EAASA,EAAS,WAAgB,CAAC,EAAI,aACvCA,EAASA,EAAS,QAAa,CAAC,EAAI,UACpCA,EAASA,EAAS,aAAkB,CAAC,EAAI,eACzCA,EAASA,EAAS,KAAU,CAAC,EAAI,OACjCA,EAASA,EAAS,MAAW,CAAC,EAAI,QAClCA,EAASA,EAAS,IAAS,CAAC,EAAI,KAIpC,GAAGA,IAAaA,EAAW,CAAC,EAAE,EAC9B,SAASC,EAAcC,EAAQ3I,EAAM,CAMjC,QALI4I,EAAQ,CAAC,EACTC,EAAO,GACPC,EAAqB,CAAC,GAAI,GAAI,EAAE,EAAE9I,CAAI,EACtC+I,EAASJ,EAAO,SAASG,CAAkB,EAExCC,GAAU,GAAG,CAChB,IAAIC,EAAML,EAAO,SAAS,EAAE,EAC5B,GAAIK,GAAO,IACP,MAAM,IAAI,MAAM,iCAAiC,EAErD,IAAIpJ,EAAI,KAAK,MAAMoJ,EAAM,GAAG,EACxBnJ,EAAI,KAAK,MAAMmJ,EAAM,EAAE,EAAI,GAC3BC,EAAID,EAAM,GACdJ,EAAM,KAAK,GAAKhJ,EAAG,GAAKC,EAAG,GAAKoJ,CAAC,EACjCJ,GAAQjJ,EAAE,SAAS,EAAIC,EAAE,SAAS,EAAIoJ,EAAE,SAAS,EACjDF,GAAU,CACd,CAEA,GAAIA,IAAW,EAAG,CACd,IAAIC,EAAML,EAAO,SAAS,CAAC,EAC3B,GAAIK,GAAO,IACP,MAAM,IAAI,MAAM,gCAAgC,EAEpD,IAAIpJ,EAAI,KAAK,MAAMoJ,EAAM,EAAE,EACvBnJ,EAAImJ,EAAM,GACdJ,EAAM,KAAK,GAAKhJ,EAAG,GAAKC,CAAC,EACzBgJ,GAAQjJ,EAAE,SAAS,EAAIC,EAAE,SAAS,CACtC,SACSkJ,IAAW,EAAG,CACnB,IAAIC,EAAML,EAAO,SAAS,CAAC,EAC3B,GAAIK,GAAO,GACP,MAAM,IAAI,MAAM,+BAA+B,EAEnDJ,EAAM,KAAK,GAAKI,CAAG,EACnBH,GAAQG,EAAI,SAAS,CACzB,CACA,MAAO,CAAE,MAAOJ,EAAO,KAAMC,CAAK,CACtC,CACA,IAAIK,EAA6B,CAC7B,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACxC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACxC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACxC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IACxC,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAC5C,EACA,SAASC,EAAmBR,EAAQ3I,EAAM,CAKtC,QAJI4I,EAAQ,CAAC,EACTC,EAAO,GACPC,EAAqB,CAAC,EAAG,GAAI,EAAE,EAAE9I,CAAI,EACrC+I,EAASJ,EAAO,SAASG,CAAkB,EACxCC,GAAU,GAAG,CAChB,IAAI,EAAIJ,EAAO,SAAS,EAAE,EACtB/I,EAAI,KAAK,MAAM,EAAI,EAAE,EACrBC,EAAI,EAAI,GACZ+I,EAAM,KAAKM,EAA2BtJ,CAAC,EAAE,WAAW,CAAC,EAAGsJ,EAA2BrJ,CAAC,EAAE,WAAW,CAAC,CAAC,EACnGgJ,GAAQK,EAA2BtJ,CAAC,EAAIsJ,EAA2BrJ,CAAC,EACpEkJ,GAAU,CACd,CACA,GAAIA,IAAW,EAAG,CACd,IAAInJ,EAAI+I,EAAO,SAAS,CAAC,EACzBC,EAAM,KAAKM,EAA2BtJ,CAAC,EAAE,WAAW,CAAC,CAAC,EACtDiJ,GAAQK,EAA2BtJ,CAAC,CACxC,CACA,MAAO,CAAE,MAAOgJ,EAAO,KAAMC,CAAK,CACtC,CACA,SAASO,EAAWT,EAAQ3I,EAAM,CAK9B,QAJI4I,EAAQ,CAAC,EACTC,EAAO,GACPC,EAAqB,CAAC,EAAG,GAAI,EAAE,EAAE9I,CAAI,EACrC+I,EAASJ,EAAO,SAASG,CAAkB,EACtC5I,EAAI,EAAGA,EAAI6I,EAAQ7I,IAAK,CAC7B,IAAIL,EAAI8I,EAAO,SAAS,CAAC,EACzBC,EAAM,KAAK/I,CAAC,CAChB,CACA,GAAI,CACAgJ,GAAQ,mBAAmBD,EAAM,IAAI,SAAU/I,EAAG,CAAE,MAAO,KAAO,IAAMA,EAAE,SAAS,EAAE,GAAG,OAAO,EAAE,CAAG,CAAC,EAAE,KAAK,EAAE,CAAC,CACnH,MACW,CAEX,CACA,MAAO,CAAE,MAAO+I,EAAO,KAAMC,CAAK,CACtC,CACA,SAASQ,EAAYV,EAAQ3I,EAAM,CAK/B,QAJI4I,EAAQ,CAAC,EACTC,EAAO,GACPC,EAAqB,CAAC,EAAG,GAAI,EAAE,EAAE9I,CAAI,EACrC+I,EAASJ,EAAO,SAASG,CAAkB,EACtC5I,EAAI,EAAGA,EAAI6I,EAAQ7I,IAAK,CAC7B,IAAIoJ,EAAIX,EAAO,SAAS,EAAE,EACtBM,EAAK,KAAK,MAAMK,EAAI,GAAI,GAAK,EAAMA,EAAI,IACvCL,EAAI,KACJA,GAAK,MAGLA,GAAK,MAETL,EAAM,KAAKK,GAAK,EAAGA,EAAI,GAAI,EAC3BJ,GAAQ,OAAO,aAAaN,EAAgB,cAAcU,CAAC,CAAC,CAChE,CACA,MAAO,CAAE,MAAOL,EAAO,KAAMC,CAAK,CACtC,CACA,SAASR,EAAOnJ,EAAMqG,EAAS,CAW3B,QAVI3E,EAAI6E,EAAIC,EAAI6D,EACZZ,EAAS,IAAIL,EAAY,UAAUpJ,CAAI,EAEvCc,EAAOuF,GAAW,EAAI,EAAIA,GAAW,GAAK,EAAI,EAC9C9D,EAAS,CACT,KAAM,GACN,MAAO,CAAC,EACR,OAAQ,CAAC,EACT,QAAS8D,CACb,EACOoD,EAAO,UAAU,GAAK,GAAG,CAC5B,IAAIa,EAAOb,EAAO,SAAS,CAAC,EAC5B,GAAIa,IAASf,EAAS,WAClB,OAAOhH,EAEN,GAAI+H,IAASf,EAAS,IACnBE,EAAO,SAAS,CAAC,IAAM,EACvBlH,EAAO,OAAO,KAAK,CACf,KAAM+G,EAAK,IACX,iBAAkBG,EAAO,SAAS,CAAC,CACvC,CAAC,EAEIA,EAAO,SAAS,CAAC,IAAM,EAC5BlH,EAAO,OAAO,KAAK,CACf,KAAM+G,EAAK,IACX,iBAAkBG,EAAO,SAAS,EAAE,CACxC,CAAC,EAEIA,EAAO,SAAS,CAAC,IAAM,EAC5BlH,EAAO,OAAO,KAAK,CACf,KAAM+G,EAAK,IACX,iBAAkBG,EAAO,SAAS,EAAE,CACxC,CAAC,EAIDlH,EAAO,OAAO,KAAK,CACf,KAAM+G,EAAK,IACX,iBAAkB,EACtB,CAAC,UAGAgB,IAASf,EAAS,QAAS,CAChC,IAAIgB,EAAgBf,EAAcC,EAAQ3I,CAAI,EAC9CyB,EAAO,MAAQgI,EAAc,MAC5B7I,EAAKa,EAAO,OAAO,KAAK,MAAMb,EAAI6I,EAAc,KAAK,EACtDhI,EAAO,OAAO,KAAK,CACf,KAAM+G,EAAK,QACX,KAAMiB,EAAc,IACxB,CAAC,CACL,SACSD,IAASf,EAAS,aAAc,CACrC,IAAIiB,EAAqBP,EAAmBR,EAAQ3I,CAAI,EACxDyB,EAAO,MAAQiI,EAAmB,MACjCjE,EAAKhE,EAAO,OAAO,KAAK,MAAMgE,EAAIiE,EAAmB,KAAK,EAC3DjI,EAAO,OAAO,KAAK,CACf,KAAM+G,EAAK,aACX,KAAMkB,EAAmB,IAC7B,CAAC,CACL,SACSF,IAASf,EAAS,KAAM,CAC7B,IAAIkB,EAAaP,EAAWT,EAAQ3I,CAAI,EACxCyB,EAAO,MAAQkI,EAAW,MACzBjE,EAAKjE,EAAO,OAAO,KAAK,MAAMiE,EAAIiE,EAAW,KAAK,EACnDlI,EAAO,OAAO,KAAK,CACf,KAAM+G,EAAK,KACX,MAAOmB,EAAW,MAClB,KAAMA,EAAW,IACrB,CAAC,CACL,SACSH,IAASf,EAAS,MAAO,CAC9B,IAAImB,EAAcP,EAAYV,EAAQ3I,CAAI,EAC1CyB,EAAO,MAAQmI,EAAY,MAC1BL,EAAK9H,EAAO,OAAO,KAAK,MAAM8H,EAAIK,EAAY,KAAK,EACpDnI,EAAO,OAAO,KAAK,CACf,KAAM+G,EAAK,MACX,MAAOoB,EAAY,MACnB,KAAMA,EAAY,IACtB,CAAC,CACL,CACJ,CAEA,GAAIjB,EAAO,UAAU,IAAM,GAAKA,EAAO,SAASA,EAAO,UAAU,CAAC,IAAM,EACpE,OAAOlH,CAEf,CACApD,EAAQ,OAASgK,CAGX,IAEC,SAAS/J,EAAQD,EAASM,EAAqB,CAEtD,aAGA,OAAO,eAAeN,EAAS,aAAc,CAAE,MAAO,EAAK,CAAC,EAC5D,IAAIwL,GAA2B,UAAY,CACvC,SAASA,EAAUjB,EAAO,CACtB,KAAK,WAAa,EAClB,KAAK,UAAY,EACjB,KAAK,MAAQA,CACjB,CACA,OAAAiB,EAAU,UAAU,SAAW,SAAUC,EAAS,CAC9C,GAAIA,EAAU,GAAKA,EAAU,IAAMA,EAAU,KAAK,UAAU,EACxD,MAAM,IAAI,MAAM,eAAiBA,EAAQ,SAAS,EAAI,OAAO,EAEjE,IAAIrI,EAAS,EAEb,GAAI,KAAK,UAAY,EAAG,CACpB,IAAIsI,EAAW,EAAI,KAAK,UACpBC,EAASF,EAAUC,EAAWD,EAAUC,EACxCE,EAAgBF,EAAWC,EAC3BE,EAAQ,KAAS,EAAIF,GAAYC,EACrCxI,GAAU,KAAK,MAAM,KAAK,UAAU,EAAIyI,IAASD,EACjDH,GAAWE,EACX,KAAK,WAAaA,EACd,KAAK,YAAc,IACnB,KAAK,UAAY,EACjB,KAAK,aAEb,CAEA,GAAIF,EAAU,EAAG,CACb,KAAOA,GAAW,GACdrI,EAAUA,GAAU,EAAM,KAAK,MAAM,KAAK,UAAU,EAAI,IACxD,KAAK,aACLqI,GAAW,EAGf,GAAIA,EAAU,EAAG,CACb,IAAIG,EAAgB,EAAIH,EACpBI,EAAQ,KAAQD,GAAkBA,EACtCxI,EAAUA,GAAUqI,GAAa,KAAK,MAAM,KAAK,UAAU,EAAII,IAASD,EACxE,KAAK,WAAaH,CACtB,CACJ,CACA,OAAOrI,CACX,EACAoI,EAAU,UAAU,UAAY,UAAY,CACxC,MAAO,IAAK,KAAK,MAAM,OAAS,KAAK,YAAc,KAAK,SAC5D,EACOA,CACX,GAAE,EACFxL,EAAQ,UAAYwL,CAGd,IAEC,SAASvL,EAAQD,EAASM,EAAqB,CAEtD,aAEA,OAAO,eAAeN,EAAS,aAAc,CAAE,MAAO,EAAK,CAAC,EAC5DA,EAAQ,cAAgB,CACpB,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,IACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,GAAM,GACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,IACN,IAAM,KACN,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,IACR,MAAQ,MACR,MAAQ,IACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,KACR,MAAQ,KACR,MAAQ,MACR,MAAQ,GACR,MAAQ,MACR,MAAQ,KACR,MAAQ,MACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,KACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,MACR,MAAQ,KACR,MAAQ,MACR,MAAQ,MACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,IACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,MACR,MAAQ,MACR,MAAQ,IACR,MAAQ,IACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,IACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,MACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,MACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,IACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,IACR,MAAQ,KACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,IACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,KACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,KAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,KACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,KACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,KACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,KAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,KAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,IACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,KAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,KACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,KACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,KAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,IAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,KACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,IAAM,MACN,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,KAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,KACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,KAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,KACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,IAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,MACR,MAAQ,KACZ,CAGM,IAEC,SAASC,EAAQD,EAASM,EAAqB,CAEtD,aAEA,OAAO,eAAeN,EAAS,aAAc,CAAE,MAAO,EAAK,CAAC,EAC5D,IAAIiC,EAAc3B,EAAoB,CAAC,EACnCe,EAAkBf,EAAoB,CAAC,EAC3C,SAASwL,EAAsB3J,EAAOZ,EAAGC,EAAGuK,EAAG,CAC3C,IAAIxJ,EAEAhB,EAAE,OAAO,EAAIC,EAAE,OAAO,IACtBe,EAAK,CAACf,EAAGD,CAAC,EAAGA,EAAIgB,EAAG,CAAC,EAAGf,EAAIe,EAAG,CAAC,GAOpC,QALIyJ,EAAQzK,EACR8D,EAAI7D,EACJyK,EAAQ9J,EAAM,KACd+J,EAAI/J,EAAM,IAEPkD,EAAE,OAAO,GAAK0G,EAAI,GAAG,CACxB,IAAII,EAAYH,EACZI,EAAYH,EAIhB,GAHAD,EAAQ3G,EACR4G,EAAQC,EAEJF,EAAM,OAAO,EAEb,OAAO,KAEX3G,EAAI8G,EAIJ,QAHIE,EAAIlK,EAAM,KACVmK,EAAyBN,EAAM,eAAeA,EAAM,OAAO,CAAC,EAC5DO,EAAapK,EAAM,QAAQmK,CAAsB,EAC9CjH,EAAE,OAAO,GAAK2G,EAAM,OAAO,GAAK,CAAC3G,EAAE,OAAO,GAAG,CAChD,IAAImH,EAAanH,EAAE,OAAO,EAAI2G,EAAM,OAAO,EACvCS,EAAQtK,EAAM,SAASkD,EAAE,eAAeA,EAAE,OAAO,CAAC,EAAGkH,CAAU,EACnEF,EAAIA,EAAE,cAAclK,EAAM,cAAcqK,EAAYC,CAAK,CAAC,EAC1DpH,EAAIA,EAAE,cAAc2G,EAAM,mBAAmBQ,EAAYC,CAAK,CAAC,CACnE,CAEA,GADAP,EAAIG,EAAE,aAAaJ,CAAK,EAAE,cAAcG,CAAS,EAC7C/G,EAAE,OAAO,GAAK2G,EAAM,OAAO,EAC3B,OAAO,IAEf,CACA,IAAIU,EAAmBR,EAAE,eAAe,CAAC,EACzC,GAAIQ,IAAqB,EACrB,OAAO,KAEX,IAAIC,EAAUxK,EAAM,QAAQuK,CAAgB,EAC5C,MAAO,CAACR,EAAE,SAASS,CAAO,EAAGtH,EAAE,SAASsH,CAAO,CAAC,CACpD,CACA,SAASC,EAAmBzK,EAAO0K,EAAc,CAE7C,IAAIC,EAAYD,EAAa,OAAO,EACpC,GAAIC,IAAc,EACd,MAAO,CAACD,EAAa,eAAe,CAAC,CAAC,EAI1C,QAFIzJ,EAAS,IAAI,MAAM0J,CAAS,EAC5BC,EAAa,EACRlL,EAAI,EAAGA,EAAIM,EAAM,MAAQ4K,EAAaD,EAAWjL,IAClDgL,EAAa,WAAWhL,CAAC,IAAM,IAC/BuB,EAAO2J,CAAU,EAAI5K,EAAM,QAAQN,CAAC,EACpCkL,KAGR,OAAIA,IAAeD,EACR,KAEJ1J,CACX,CACA,SAAS4J,EAAoB7K,EAAO8K,EAAgBC,EAAgB,CAIhE,QAFIC,EAAID,EAAe,OACnB9J,EAAS,IAAI,MAAM+J,CAAC,EACftL,EAAI,EAAGA,EAAIsL,EAAGtL,IAAK,CAGxB,QAFIuL,EAAYjL,EAAM,QAAQ+K,EAAerL,CAAC,CAAC,EAC3CwL,EAAc,EACTlK,EAAI,EAAGA,EAAIgK,EAAGhK,IACftB,IAAMsB,IACNkK,EAAclL,EAAM,SAASkL,EAAapL,EAAY,gBAAgB,EAAGE,EAAM,SAAS+K,EAAe/J,CAAC,EAAGiK,CAAS,CAAC,CAAC,GAG9HhK,EAAOvB,CAAC,EAAIM,EAAM,SAAS8K,EAAe,WAAWG,CAAS,EAAGjL,EAAM,QAAQkL,CAAW,CAAC,EACvFlL,EAAM,gBAAkB,IACxBiB,EAAOvB,CAAC,EAAIM,EAAM,SAASiB,EAAOvB,CAAC,EAAGuL,CAAS,EAEvD,CACA,OAAOhK,CACX,CACA,SAAS4G,EAAOO,EAAO+C,EAAM,CACzB,IAAIC,EAAc,IAAI,kBAAkBhD,EAAM,MAAM,EACpDgD,EAAY,IAAIhD,CAAK,EAKrB,QAJIpI,EAAQ,IAAIF,EAAY,QAAQ,IAAQ,IAAK,CAAC,EAC9CuL,EAAO,IAAInM,EAAgB,QAAQc,EAAOoL,CAAW,EACrDE,EAAuB,IAAI,kBAAkBH,CAAI,EACjDI,EAAQ,GACHP,EAAI,EAAGA,EAAIG,EAAMH,IAAK,CAC3B,IAAIQ,EAAaH,EAAK,WAAWrL,EAAM,IAAIgL,EAAIhL,EAAM,aAAa,CAAC,EACnEsL,EAAqBA,EAAqB,OAAS,EAAIN,CAAC,EAAIQ,EACxDA,IAAe,IACfD,EAAQ,GAEhB,CACA,GAAI,CAACA,EACD,OAAOH,EAEX,IAAIK,EAAW,IAAIvM,EAAgB,QAAQc,EAAOsL,CAAoB,EAClEI,EAAa/B,EAAsB3J,EAAOA,EAAM,cAAcmL,EAAM,CAAC,EAAGM,EAAUN,CAAI,EAC1F,GAAIO,IAAe,KACf,OAAO,KAEX,IAAIX,EAAiBN,EAAmBzK,EAAO0L,EAAW,CAAC,CAAC,EAC5D,GAAIX,GAAkB,KAClB,OAAO,KAGX,QADIY,EAAkBd,EAAoB7K,EAAO0L,EAAW,CAAC,EAAGX,CAAc,EACrErL,EAAI,EAAGA,EAAIqL,EAAe,OAAQrL,IAAK,CAC5C,IAAIkM,EAAWR,EAAY,OAAS,EAAIpL,EAAM,IAAI+K,EAAerL,CAAC,CAAC,EACnE,GAAIkM,EAAW,EACX,OAAO,KAEXR,EAAYQ,CAAQ,EAAI9L,EAAY,gBAAgBsL,EAAYQ,CAAQ,EAAGD,EAAgBjM,CAAC,CAAC,CACjG,CACA,OAAO0L,CACX,CACAvN,EAAQ,OAASgK,CAGX,IAEC,SAAS/J,EAAQD,EAASM,EAAqB,CAEtD,aAEA,OAAO,eAAeN,EAAS,aAAc,CAAE,MAAO,EAAK,CAAC,EAC5DA,EAAQ,SAAW,CACf,CACI,SAAU,KACV,cAAe,EACf,wBAAyB,CAAC,EAC1B,sBAAuB,CACnB,CACI,oBAAqB,EACrB,SAAU,CAAC,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAAC,CAC1D,EACA,CACI,oBAAqB,GACrB,SAAU,CAAC,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAAC,CAC1D,EACA,CACI,oBAAqB,GACrB,SAAU,CAAC,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAAC,CAC1D,EACA,CACI,oBAAqB,GACrB,SAAU,CAAC,CAAE,UAAW,EAAG,sBAAuB,CAAE,CAAC,CACzD,CACJ,CACJ,EACA,CACI,SAAU,KACV,cAAe,EACf,wBAAyB,CAAC,EAAG,EAAE,EAC/B,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CAAC,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAAC,CAC1D,EACA,CACI,oBAAqB,GACrB,SAAU,CAAC,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAAC,CAC1D,EACA,CACI,oBAAqB,GACrB,SAAU,CAAC,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAAC,CAC1D,EACA,CACI,oBAAqB,GACrB,SAAU,CAAC,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAAC,CAC1D,CACJ,CACJ,EACA,CACI,SAAU,KACV,cAAe,EACf,wBAAyB,CAAC,EAAG,EAAE,EAC/B,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CAAC,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAAC,CAC1D,EACA,CACI,oBAAqB,GACrB,SAAU,CAAC,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAAC,CAC1D,EACA,CACI,oBAAqB,GACrB,SAAU,CAAC,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAAC,CAC1D,EACA,CACI,oBAAqB,GACrB,SAAU,CAAC,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAAC,CAC1D,CACJ,CACJ,EACA,CACI,SAAU,KACV,cAAe,EACf,wBAAyB,CAAC,EAAG,EAAE,EAC/B,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CAAC,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAAC,CAC1D,EACA,CACI,oBAAqB,GACrB,SAAU,CAAC,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAAC,CAC1D,EACA,CACI,oBAAqB,GACrB,SAAU,CAAC,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAAC,CAC1D,EACA,CACI,oBAAqB,GACrB,SAAU,CAAC,CAAE,UAAW,EAAG,sBAAuB,CAAE,CAAC,CACzD,CACJ,CACJ,EACA,CACI,SAAU,KACV,cAAe,EACf,wBAAyB,CAAC,EAAG,EAAE,EAC/B,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CAAC,CAAE,UAAW,EAAG,sBAAuB,GAAI,CAAC,CAC3D,EACA,CACI,oBAAqB,GACrB,SAAU,CAAC,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAAC,CAC1D,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,KACV,cAAe,EACf,wBAAyB,CAAC,EAAG,EAAE,EAC/B,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CAAC,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAAC,CAC1D,EACA,CACI,oBAAqB,GACrB,SAAU,CAAC,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAAC,CAC1D,EACA,CACI,oBAAqB,GACrB,SAAU,CAAC,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAAC,CAC1D,EACA,CACI,oBAAqB,GACrB,SAAU,CAAC,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAAC,CAC1D,CACJ,CACJ,EACA,CACI,SAAU,MACV,cAAe,EACf,wBAAyB,CAAC,EAAG,GAAI,EAAE,EACnC,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CAAC,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAAC,CAC1D,EACA,CACI,oBAAqB,GACrB,SAAU,CAAC,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAAC,CAC1D,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,MACV,cAAe,EACf,wBAAyB,CAAC,EAAG,GAAI,EAAE,EACnC,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CAAC,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAAC,CAC1D,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,MACV,cAAe,EACf,wBAAyB,CAAC,EAAG,GAAI,EAAE,EACnC,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CAAC,CAAE,UAAW,EAAG,sBAAuB,GAAI,CAAC,CAC3D,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,MACV,cAAe,GACf,wBAAyB,CAAC,EAAG,GAAI,EAAE,EACnC,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,MACV,cAAe,GACf,wBAAyB,CAAC,EAAG,GAAI,EAAE,EACnC,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CAAC,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAAC,CAC1D,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,MACV,cAAe,GACf,wBAAyB,CAAC,EAAG,GAAI,EAAE,EACnC,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,MACV,cAAe,GACf,wBAAyB,CAAC,EAAG,GAAI,EAAE,EACnC,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CAAC,CAAE,UAAW,EAAG,sBAAuB,GAAI,CAAC,CAC3D,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,MACV,cAAe,GACf,wBAAyB,CAAC,EAAG,GAAI,GAAI,EAAE,EACvC,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,GAAI,EAC3C,CAAE,UAAW,EAAG,sBAAuB,GAAI,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,MACV,cAAe,GACf,wBAAyB,CAAC,EAAG,GAAI,GAAI,EAAE,EACvC,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,MACV,cAAe,GACf,wBAAyB,CAAC,EAAG,GAAI,GAAI,EAAE,EACvC,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,MACV,cAAe,GACf,wBAAyB,CAAC,EAAG,GAAI,GAAI,EAAE,EACvC,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,GAAI,EAC3C,CAAE,UAAW,EAAG,sBAAuB,GAAI,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,MACV,cAAe,GACf,wBAAyB,CAAC,EAAG,GAAI,GAAI,EAAE,EACvC,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,GAAI,EAC3C,CAAE,UAAW,EAAG,sBAAuB,GAAI,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,MACV,cAAe,GACf,wBAAyB,CAAC,EAAG,GAAI,GAAI,EAAE,EACvC,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,GAAI,EAC3C,CAAE,UAAW,EAAG,sBAAuB,GAAI,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,MACV,cAAe,GACf,wBAAyB,CAAC,EAAG,GAAI,GAAI,EAAE,EACvC,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,GAAI,EAC3C,CAAE,UAAW,EAAG,sBAAuB,GAAI,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,MACV,cAAe,GACf,wBAAyB,CAAC,EAAG,GAAI,GAAI,GAAI,EAAE,EAC3C,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,GAAI,EAC3C,CAAE,UAAW,EAAG,sBAAuB,GAAI,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CAAC,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAAC,CAC3D,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,MACV,cAAe,GACf,wBAAyB,CAAC,EAAG,GAAI,GAAI,GAAI,EAAE,EAC3C,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,GAAI,EAC3C,CAAE,UAAW,EAAG,sBAAuB,GAAI,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CAAC,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAAC,CAC3D,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CAAC,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAAC,CAC3D,CACJ,CACJ,EACA,CACI,SAAU,MACV,cAAe,GACf,wBAAyB,CAAC,EAAG,GAAI,GAAI,GAAI,GAAG,EAC5C,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,GAAI,EAC3C,CAAE,UAAW,EAAG,sBAAuB,GAAI,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,OACV,cAAe,GACf,wBAAyB,CAAC,EAAG,GAAI,GAAI,GAAI,GAAG,EAC5C,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,GAAI,EAC3C,CAAE,UAAW,EAAG,sBAAuB,GAAI,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,OACV,cAAe,GACf,wBAAyB,CAAC,EAAG,GAAI,GAAI,GAAI,GAAG,EAC5C,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,GAAI,EAC3C,CAAE,UAAW,EAAG,sBAAuB,GAAI,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,OACV,cAAe,GACf,wBAAyB,CAAC,EAAG,GAAI,GAAI,GAAI,GAAG,EAC5C,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,GAAI,EAC5C,CAAE,UAAW,EAAG,sBAAuB,GAAI,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,OACV,cAAe,GACf,wBAAyB,CAAC,EAAG,GAAI,GAAI,GAAI,GAAG,EAC5C,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,GAAI,EAC3C,CAAE,UAAW,EAAG,sBAAuB,GAAI,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,OACV,cAAe,GACf,wBAAyB,CAAC,EAAG,GAAI,GAAI,GAAI,GAAI,GAAG,EAChD,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,GAAI,EAC3C,CAAE,UAAW,GAAI,sBAAuB,GAAI,CAChD,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,OACV,cAAe,GACf,wBAAyB,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,GAAG,EACjD,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,GAAI,EAC3C,CAAE,UAAW,EAAG,sBAAuB,GAAI,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,OACV,cAAe,GACf,wBAAyB,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,GAAG,EACjD,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,GAAI,EAC3C,CAAE,UAAW,GAAI,sBAAuB,GAAI,CAChD,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,OACV,cAAe,GACf,wBAAyB,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,GAAG,EACjD,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,GAAI,EAC5C,CAAE,UAAW,EAAG,sBAAuB,GAAI,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,OACV,cAAe,GACf,wBAAyB,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,GAAG,EACjD,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CAAC,CAAE,UAAW,GAAI,sBAAuB,GAAI,CAAC,CAC5D,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,OACV,cAAe,GACf,wBAAyB,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,GAAG,EACjD,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,GAAI,EAC5C,CAAE,UAAW,EAAG,sBAAuB,GAAI,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,OACV,cAAe,GACf,wBAAyB,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,GAAG,EACjD,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,GAAI,EAC5C,CAAE,UAAW,EAAG,sBAAuB,GAAI,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,OACV,cAAe,GACf,wBAAyB,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,IAAK,GAAG,EACtD,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,GAAI,EAC5C,CAAE,UAAW,EAAG,sBAAuB,GAAI,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,OACV,cAAe,GACf,wBAAyB,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,IAAK,GAAG,EACtD,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,GAAI,EAC3C,CAAE,UAAW,GAAI,sBAAuB,GAAI,CAChD,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,EAAG,EAC1C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,OACV,cAAe,GACf,wBAAyB,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,IAAK,GAAG,EACtD,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,GAAI,EAC5C,CAAE,UAAW,EAAG,sBAAuB,GAAI,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,OACV,cAAe,GACf,wBAAyB,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,IAAK,GAAG,EACtD,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,EAAG,sBAAuB,GAAI,EAC3C,CAAE,UAAW,GAAI,sBAAuB,GAAI,CAChD,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,OACV,cAAe,GACf,wBAAyB,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,IAAK,GAAG,EACtD,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,GAAI,EAC5C,CAAE,UAAW,EAAG,sBAAuB,GAAI,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,EAAG,sBAAuB,EAAG,CAC9C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,CACJ,CACJ,EACA,CACI,SAAU,OACV,cAAe,GACf,wBAAyB,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,IAAK,GAAG,EACtD,sBAAuB,CACnB,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,GAAI,EAC5C,CAAE,UAAW,EAAG,sBAAuB,GAAI,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,EACA,CACI,oBAAqB,GACrB,SAAU,CACN,CAAE,UAAW,GAAI,sBAAuB,EAAG,EAC3C,CAAE,UAAW,GAAI,sBAAuB,EAAG,CAC/C,CACJ,CACJ,CACJ,CACJ,CAGM,IAEC,SAASC,EAAQD,EAASM,EAAqB,CAEtD,aAEA,OAAO,eAAeN,EAAS,aAAc,CAAE,MAAO,EAAK,CAAC,EAC5D,IAAI0E,EAAcpE,EAAoB,CAAC,EACvC,SAAS0N,EAAsBC,EAAIC,EAAIC,EAAIC,EAAI,CAC3C,IAAIC,EAAMJ,EAAG,EAAIC,EAAG,EAAIC,EAAG,EAAIC,EAAG,EAC9BE,EAAML,EAAG,EAAIC,EAAG,EAAIC,EAAG,EAAIC,EAAG,EAClC,GAAIC,IAAQ,GAAKC,IAAQ,EACrB,MAAO,CACH,IAAKJ,EAAG,EAAID,EAAG,EACf,IAAKC,EAAG,EAAID,EAAG,EACf,IAAK,EACL,IAAKE,EAAG,EAAID,EAAG,EACf,IAAKC,EAAG,EAAID,EAAG,EACf,IAAK,EACL,IAAKD,EAAG,EACR,IAAKA,EAAG,EACR,IAAK,CACT,EAGA,IAAIM,EAAML,EAAG,EAAIC,EAAG,EAChBK,EAAMJ,EAAG,EAAID,EAAG,EAChBM,EAAMP,EAAG,EAAIC,EAAG,EAChBO,EAAMN,EAAG,EAAID,EAAG,EAChBd,EAAckB,EAAMG,EAAMF,EAAMC,EAChCE,GAAON,EAAMK,EAAMF,EAAMF,GAAOjB,EAChCuB,GAAOL,EAAMD,EAAMD,EAAMI,GAAOpB,EACpC,MAAO,CACH,IAAKa,EAAG,EAAID,EAAG,EAAIU,EAAMT,EAAG,EAC5B,IAAKA,EAAG,EAAID,EAAG,EAAIU,EAAMT,EAAG,EAC5B,IAAKS,EACL,IAAKP,EAAG,EAAIH,EAAG,EAAIW,EAAMR,EAAG,EAC5B,IAAKA,EAAG,EAAIH,EAAG,EAAIW,EAAMR,EAAG,EAC5B,IAAKQ,EACL,IAAKX,EAAG,EACR,IAAKA,EAAG,EACR,IAAK,CACT,CAER,CACA,SAASY,EAAsBZ,EAAIC,EAAIC,EAAIC,EAAI,CAE3C,IAAIU,EAAOd,EAAsBC,EAAIC,EAAIC,EAAIC,CAAE,EAC/C,MAAO,CACH,IAAKU,EAAK,IAAMA,EAAK,IAAMA,EAAK,IAAMA,EAAK,IAC3C,IAAKA,EAAK,IAAMA,EAAK,IAAMA,EAAK,IAAMA,EAAK,IAC3C,IAAKA,EAAK,IAAMA,EAAK,IAAMA,EAAK,IAAMA,EAAK,IAC3C,IAAKA,EAAK,IAAMA,EAAK,IAAMA,EAAK,IAAMA,EAAK,IAC3C,IAAKA,EAAK,IAAMA,EAAK,IAAMA,EAAK,IAAMA,EAAK,IAC3C,IAAKA,EAAK,IAAMA,EAAK,IAAMA,EAAK,IAAMA,EAAK,IAC3C,IAAKA,EAAK,IAAMA,EAAK,IAAMA,EAAK,IAAMA,EAAK,IAC3C,IAAKA,EAAK,IAAMA,EAAK,IAAMA,EAAK,IAAMA,EAAK,IAC3C,IAAKA,EAAK,IAAMA,EAAK,IAAMA,EAAK,IAAMA,EAAK,GAC/C,CACJ,CACA,SAASC,EAAMxN,EAAGC,EAAG,CACjB,MAAO,CACH,IAAKD,EAAE,IAAMC,EAAE,IAAMD,EAAE,IAAMC,EAAE,IAAMD,EAAE,IAAMC,EAAE,IAC/C,IAAKD,EAAE,IAAMC,EAAE,IAAMD,EAAE,IAAMC,EAAE,IAAMD,EAAE,IAAMC,EAAE,IAC/C,IAAKD,EAAE,IAAMC,EAAE,IAAMD,EAAE,IAAMC,EAAE,IAAMD,EAAE,IAAMC,EAAE,IAC/C,IAAKD,EAAE,IAAMC,EAAE,IAAMD,EAAE,IAAMC,EAAE,IAAMD,EAAE,IAAMC,EAAE,IAC/C,IAAKD,EAAE,IAAMC,EAAE,IAAMD,EAAE,IAAMC,EAAE,IAAMD,EAAE,IAAMC,EAAE,IAC/C,IAAKD,EAAE,IAAMC,EAAE,IAAMD,EAAE,IAAMC,EAAE,IAAMD,EAAE,IAAMC,EAAE,IAC/C,IAAKD,EAAE,IAAMC,EAAE,IAAMD,EAAE,IAAMC,EAAE,IAAMD,EAAE,IAAMC,EAAE,IAC/C,IAAKD,EAAE,IAAMC,EAAE,IAAMD,EAAE,IAAMC,EAAE,IAAMD,EAAE,IAAMC,EAAE,IAC/C,IAAKD,EAAE,IAAMC,EAAE,IAAMD,EAAE,IAAMC,EAAE,IAAMD,EAAE,IAAMC,EAAE,GACnD,CACJ,CACA,SAASwN,EAAQC,EAAOC,EAAU,CAY9B,QAXIC,EAAON,EAAsB,CAAE,EAAG,IAAK,EAAG,GAAI,EAAG,CAAE,EAAGK,EAAS,UAAY,IAAK,EAAG,GAAI,EAAG,CAAE,EAAGA,EAAS,UAAY,IAAK,EAAGA,EAAS,UAAY,GAAI,EAAG,CAAE,EAAG,IAAK,EAAGA,EAAS,UAAY,GAAI,CAAC,EAC/LJ,EAAOd,EAAsBkB,EAAS,QAASA,EAAS,SAAUA,EAAS,iBAAkBA,EAAS,UAAU,EAChHE,EAAYL,EAAMD,EAAMK,CAAI,EAC5BzL,EAASgB,EAAY,UAAU,YAAYwK,EAAS,UAAWA,EAAS,SAAS,EACjFG,EAAkB,SAAUrO,EAAGC,EAAG,CAClC,IAAIoM,EAAc+B,EAAU,IAAMpO,EAAIoO,EAAU,IAAMnO,EAAImO,EAAU,IACpE,MAAO,CACH,GAAIA,EAAU,IAAMpO,EAAIoO,EAAU,IAAMnO,EAAImO,EAAU,KAAO/B,EAC7D,GAAI+B,EAAU,IAAMpO,EAAIoO,EAAU,IAAMnO,EAAImO,EAAU,KAAO/B,CACjE,CACJ,EACSpM,EAAI,EAAGA,EAAIiO,EAAS,UAAWjO,IACpC,QAASD,EAAI,EAAGA,EAAIkO,EAAS,UAAWlO,IAAK,CACzC,IAAIsO,EAAStO,EAAI,GACbuO,EAAStO,EAAI,GACbuO,EAAcH,EAAgBC,EAAQC,CAAM,EAChD7L,EAAO,IAAI1C,EAAGC,EAAGgO,EAAM,IAAI,KAAK,MAAMO,EAAY,CAAC,EAAG,KAAK,MAAMA,EAAY,CAAC,CAAC,CAAC,CACpF,CAEJ,MAAO,CACH,OAAQ9L,EACR,gBAAiB2L,CACrB,CACJ,CACArP,EAAQ,QAAUgP,CAGZ,IAEC,SAAS/O,EAAQD,EAASM,EAAqB,CAEtD,aAEA,OAAO,eAAeN,EAAS,aAAc,CAAE,MAAO,EAAK,CAAC,EAC5D,IAAIyP,EAA+B,EAC/BC,EAAiB,GACjBC,EAAiB,IACjBC,EAAW,SAAUrO,EAAGC,EAAG,CAAE,OAAO,KAAK,KAAK,KAAK,IAAKA,EAAE,EAAID,EAAE,EAAI,CAAC,EAAI,KAAK,IAAKC,EAAE,EAAID,EAAE,EAAI,CAAC,CAAC,CAAG,EACxG,SAASqE,EAAIiK,EAAQ,CACjB,OAAOA,EAAO,OAAO,SAAUtO,EAAGC,EAAG,CAAE,OAAOD,EAAIC,CAAG,CAAC,CAC1D,CAEA,SAASsO,EAAsBC,EAAUC,EAAUC,EAAU,CACzD,IAAI1N,EAAI6E,EAAIC,EAAI6D,EAEZgF,EAAiBN,EAASG,EAAUC,CAAQ,EAC5CG,EAAmBP,EAASI,EAAUC,CAAQ,EAC9CG,EAAmBR,EAASG,EAAUE,CAAQ,EAC9CI,EACAC,EACAC,EAEJ,OAAIJ,GAAoBD,GAAkBC,GAAoBC,GAC1D7N,EAAK,CAACyN,EAAUD,EAAUE,CAAQ,EAAGI,EAAa9N,EAAG,CAAC,EAAG+N,EAAU/N,EAAG,CAAC,EAAGgO,EAAWhO,EAAG,CAAC,GAEpF6N,GAAoBD,GAAoBC,GAAoBF,GACjE9I,EAAK,CAAC2I,EAAUC,EAAUC,CAAQ,EAAGI,EAAajJ,EAAG,CAAC,EAAGkJ,EAAUlJ,EAAG,CAAC,EAAGmJ,EAAWnJ,EAAG,CAAC,IAGzFC,EAAK,CAAC0I,EAAUE,EAAUD,CAAQ,EAAGK,EAAahJ,EAAG,CAAC,EAAGiJ,EAAUjJ,EAAG,CAAC,EAAGkJ,EAAWlJ,EAAG,CAAC,IAKvFkJ,EAAS,EAAID,EAAQ,IAAMD,EAAW,EAAIC,EAAQ,IAAQC,EAAS,EAAID,EAAQ,IAAMD,EAAW,EAAIC,EAAQ,GAAM,IACpHpF,EAAK,CAACqF,EAAUF,CAAU,EAAGA,EAAanF,EAAG,CAAC,EAAGqF,EAAWrF,EAAG,CAAC,GAE7D,CAAE,WAAYmF,EAAY,QAASC,EAAS,SAAUC,CAAS,CAC1E,CAEA,SAASC,EAAiBF,EAASC,EAAUF,EAAY3M,EAAQ,CAC7D,IAAI+M,GAAc7K,EAAI8K,EAAmBJ,EAASD,EAAY3M,EAAQ,CAAC,CAAC,EAAI,EACxEkC,EAAI8K,EAAmBJ,EAASC,EAAU7M,EAAQ,CAAC,CAAC,EAAI,EACxDkC,EAAI8K,EAAmBL,EAAYC,EAAS5M,EAAQ,CAAC,CAAC,EAAI,EAC1DkC,EAAI8K,EAAmBH,EAAUD,EAAS5M,EAAQ,CAAC,CAAC,EAAI,GAAK,EACjE,GAAI+M,EAAa,EACb,MAAM,IAAI,MAAM,qBAAqB,EAEzC,IAAIE,EAAe,KAAK,MAAMf,EAASU,EAASC,CAAQ,EAAIE,CAAU,EAClEG,EAAgB,KAAK,MAAMhB,EAASU,EAASD,CAAU,EAAII,CAAU,EACrEtJ,EAAY,KAAK,OAAOwJ,EAAeC,GAAiB,CAAC,EAAI,EACjE,OAAQzJ,EAAY,EAAG,CACnB,IAAK,GACDA,IACA,MACJ,IAAK,GACDA,IACA,KACR,CACA,MAAO,CAAE,UAAWA,EAAW,WAAYsJ,CAAW,CAC1D,CAIA,SAASI,EAA+BC,EAAQC,EAAKrN,EAAQgH,EAAQ,CACjE,IAAIsG,EAAe,CAAC,CAAE,EAAG,KAAK,MAAMF,EAAO,CAAC,EAAG,EAAG,KAAK,MAAMA,EAAO,CAAC,CAAE,CAAC,EACpEG,EAAQ,KAAK,IAAIF,EAAI,EAAID,EAAO,CAAC,EAAI,KAAK,IAAIC,EAAI,EAAID,EAAO,CAAC,EAC9DI,EACAC,EACAC,EACAC,EACAJ,GACAC,EAAQ,KAAK,MAAMJ,EAAO,CAAC,EAC3BK,EAAQ,KAAK,MAAML,EAAO,CAAC,EAC3BM,EAAM,KAAK,MAAML,EAAI,CAAC,EACtBM,EAAM,KAAK,MAAMN,EAAI,CAAC,IAGtBG,EAAQ,KAAK,MAAMJ,EAAO,CAAC,EAC3BK,EAAQ,KAAK,MAAML,EAAO,CAAC,EAC3BM,EAAM,KAAK,MAAML,EAAI,CAAC,EACtBM,EAAM,KAAK,MAAMN,EAAI,CAAC,GAS1B,QAPIO,EAAK,KAAK,IAAIF,EAAMF,CAAK,EACzBK,EAAK,KAAK,IAAIF,EAAMF,CAAK,EACzBzD,EAAQ,KAAK,MAAM,CAAC4D,EAAK,CAAC,EAC1BE,EAAQN,EAAQE,EAAM,EAAI,GAC1BK,EAAQN,EAAQE,EAAM,EAAI,GAC1BK,EAAe,GAEV1Q,EAAIkQ,EAAOjQ,EAAIkQ,EAAOnQ,IAAMoQ,EAAMI,EAAOxQ,GAAKwQ,EAAO,CAI1D,IAAIG,EAAQV,EAAQhQ,EAAID,EACpB4Q,EAAQX,EAAQjQ,EAAIC,EACxB,GAAIyC,EAAO,IAAIiO,EAAOC,CAAK,IAAMF,IAC7BA,EAAe,CAACA,EAChBV,EAAa,KAAK,CAAE,EAAGW,EAAO,EAAGC,CAAM,CAAC,EACpCZ,EAAa,SAAWtG,EAAS,GACjC,MAIR,GADAgD,GAAS6D,EACL7D,EAAQ,EAAG,CACX,GAAIzM,IAAMoQ,EACN,MAEJpQ,GAAKwQ,EACL/D,GAAS4D,CACb,CACJ,CAEA,QADIO,EAAY,CAAC,EACRhQ,GAAI,EAAGA,GAAI6I,EAAQ7I,KACpBmP,EAAanP,EAAC,GAAKmP,EAAanP,GAAI,CAAC,EACrCgQ,EAAU,KAAKjC,EAASoB,EAAanP,EAAC,EAAGmP,EAAanP,GAAI,CAAC,CAAC,CAAC,EAG7DgQ,EAAU,KAAK,CAAC,EAGxB,OAAOA,CACX,CAIA,SAASnB,EAAmBI,EAAQC,EAAKrN,EAAQgH,EAAQ,CACrD,IAAInI,EACAuP,EAAOf,EAAI,EAAID,EAAO,EACtBiB,EAAMhB,EAAI,EAAID,EAAO,EACrBkB,EAAanB,EAA+BC,EAAQC,EAAKrN,EAAQ,KAAK,KAAKgH,EAAS,CAAC,CAAC,EACtFuH,EAAcpB,EAA+BC,EAAQ,CAAE,EAAGA,EAAO,EAAIiB,EAAK,EAAGjB,EAAO,EAAIgB,CAAK,EAAGpO,EAAQ,KAAK,KAAKgH,EAAS,CAAC,CAAC,EAC7HwH,EAAcF,EAAW,MAAM,EAAIC,EAAY,MAAM,EAAI,EAC7D,OAAQ1P,EAAK0P,EAAY,OAAOC,CAAW,GAAG,OAAO,MAAM3P,EAAIyP,CAAU,CAC7E,CAGA,SAASG,EAAmBC,EAAUC,EAAQ,CAC1C,IAAIC,EAAc1M,EAAIwM,CAAQ,EAAIxM,EAAIyM,CAAM,EACxC3E,EAAQ,EACZ,OAAA2E,EAAO,QAAQ,SAAUE,EAAO1Q,EAAG,CAC/B6L,GAAS,KAAK,IAAK0E,EAASvQ,CAAC,EAAI0Q,EAAQD,EAAc,CAAC,CAC5D,CAAC,EACM,CAAE,YAAaA,EAAa,MAAO5E,CAAM,CACpD,CAIA,SAAS8E,EAAaC,EAAOJ,EAAQ3O,EAAQ,CACzC,GAAI,CACA,IAAIgP,EAAgBhC,EAAmB+B,EAAO,CAAE,EAAG,GAAI,EAAGA,EAAM,CAAE,EAAG/O,EAAQ2O,EAAO,MAAM,EACtFM,EAAcjC,EAAmB+B,EAAO,CAAE,EAAGA,EAAM,EAAG,EAAG,EAAG,EAAG/O,EAAQ2O,EAAO,MAAM,EACpFO,EAAe,CACf,EAAG,KAAK,IAAI,EAAGH,EAAM,EAAIA,EAAM,CAAC,EAAI,EACpC,EAAG,KAAK,IAAI,EAAGA,EAAM,EAAIA,EAAM,CAAC,EAAI,CACxC,EACII,EAAwBnC,EAAmB+B,EAAOG,EAAclP,EAAQ2O,EAAO,MAAM,EACrFS,EAAkB,CAClB,EAAG,KAAK,IAAIpP,EAAO,MAAO+O,EAAM,EAAIA,EAAM,CAAC,EAAI,EAC/C,EAAG,KAAK,IAAI/O,EAAO,OAAQ+O,EAAM,EAAIA,EAAM,CAAC,EAAI,CACpD,EACIM,EAAwBrC,EAAmB+B,EAAOK,EAAiBpP,EAAQ2O,EAAO,MAAM,EACxFW,EAAYb,EAAmBO,EAAeL,CAAM,EACpDY,EAAYd,EAAmBQ,EAAaN,CAAM,EAClDa,EAAgBf,EAAmBU,EAAuBR,CAAM,EAChEc,EAAchB,EAAmBY,EAAuBV,CAAM,EAC9De,EAAa,KAAK,KAAKJ,EAAU,MAAQA,EAAU,MACnDC,EAAU,MAAQA,EAAU,MAC5BC,EAAc,MAAQA,EAAc,MACpCC,EAAY,MAAQA,EAAY,KAAK,EACrCE,GAAWL,EAAU,YAAcC,EAAU,YAAcC,EAAc,YAAcC,EAAY,aAAe,EAClHG,GAAa,KAAK,IAAKN,EAAU,YAAcK,EAAU,CAAC,EAC1D,KAAK,IAAKJ,EAAU,YAAcI,EAAU,CAAC,EAC7C,KAAK,IAAKH,EAAc,YAAcG,EAAU,CAAC,EACjD,KAAK,IAAKF,EAAY,YAAcE,EAAU,CAAC,GAAKA,EACxD,OAAOD,EAAaE,CACxB,MACW,CACP,MAAO,IACX,CACJ,CACA,SAASC,EAAiB7P,EAAQsD,EAAG,CAEjC,QADIwM,EAAQ,KAAK,MAAMxM,EAAE,CAAC,EACnBtD,EAAO,IAAI8P,EAAO,KAAK,MAAMxM,EAAE,CAAC,CAAC,GACpCwM,IAGJ,QADIC,EAAS,KAAK,MAAMzM,EAAE,CAAC,EACpBtD,EAAO,IAAI+P,EAAQ,KAAK,MAAMzM,EAAE,CAAC,CAAC,GACrCyM,IAIJ,QAFIzS,GAAKwS,EAAQC,GAAU,EACvBC,EAAO,KAAK,MAAM1M,EAAE,CAAC,EAClBtD,EAAO,IAAI,KAAK,MAAM1C,CAAC,EAAG0S,CAAI,GACjCA,IAGJ,QADIC,EAAU,KAAK,MAAM3M,EAAE,CAAC,EACrBtD,EAAO,IAAI,KAAK,MAAM1C,CAAC,EAAG2S,CAAO,GACpCA,IAEJ,IAAI1S,GAAKyS,EAAOC,GAAW,EAC3B,MAAO,CAAE,EAAG3S,EAAG,EAAGC,CAAE,CACxB,CACA,SAAS2S,EAAOlQ,EAAQ,CAkFpB,QAjFImQ,EAAqB,CAAC,EACtBC,EAA2B,CAAC,EAC5BC,EAAwB,CAAC,EACzBC,EAA8B,CAAC,EAC/BC,EAAU,SAAUhT,EAAG,CAqEvB,QApEIiT,EAAW,EACXC,EAAU,GACVC,GAAQ,CAAC,EAAG,EAAG,EAAG,EAAG,CAAC,EACtBC,GAAU,SAAUrT,GAAG,CACvB,IAAIE,EAAIwC,EAAO,IAAI1C,GAAGC,CAAC,EACvB,GAAIC,IAAMiT,EACND,QAEC,CACDE,GAAQ,CAACA,GAAM,CAAC,EAAGA,GAAM,CAAC,EAAGA,GAAM,CAAC,EAAGA,GAAM,CAAC,EAAGF,CAAQ,EACzDA,EAAW,EACXC,EAAUjT,EAEV,IAAIoT,GAAgC1O,EAAIwO,EAAK,EAAI,EAC7CG,GAAqB,KAAK,IAAIH,GAAM,CAAC,EAAIE,EAA6B,EAAIA,IAC1E,KAAK,IAAIF,GAAM,CAAC,EAAIE,EAA6B,EAAIA,IACrD,KAAK,IAAIF,GAAM,CAAC,EAAI,EAAIE,EAA6B,EAAI,EAAIA,IAC7D,KAAK,IAAIF,GAAM,CAAC,EAAIE,EAA6B,EAAIA,IACrD,KAAK,IAAIF,GAAM,CAAC,EAAIE,EAA6B,EAAIA,IACrD,CAACpT,EAEDsT,GAAmC5O,EAAIwO,GAAM,MAAM,EAAE,CAAC,EAAI,EAC1DK,GAAwB,KAAK,IAAIL,GAAM,CAAC,EAAII,EAAgC,EAAIA,IAChF,KAAK,IAAIJ,GAAM,CAAC,EAAII,EAAgC,EAAIA,IACxD,KAAK,IAAIJ,GAAM,CAAC,EAAII,EAAgC,EAAIA,IACxDtT,EACJ,GAAIqT,GAAoB,CAEpB,IAAIG,GAAS1T,GAAIoT,GAAM,CAAC,EAAIA,GAAM,CAAC,EAC/BO,GAAWD,GAASN,GAAM,CAAC,EAC3BQ,GAAO,CAAE,OAAQD,GAAU,KAAMD,GAAQ,EAAGzT,CAAE,EAG9C4T,GAAgBf,EAAyB,OAAO,SAAUzH,GAAG,CAC7D,OAAQsI,IAAYtI,GAAE,OAAO,QAAUsI,IAAYtI,GAAE,OAAO,MACvDqI,IAAUrI,GAAE,OAAO,QAAUsI,IAAYtI,GAAE,OAAO,MAClDsI,IAAYtI,GAAE,OAAO,QAAUqI,IAAUrI,GAAE,OAAO,MAAU+H,GAAM,CAAC,GAAK/H,GAAE,OAAO,KAAOA,GAAE,OAAO,QAAWsD,GACxGyE,GAAM,CAAC,GAAK/H,GAAE,OAAO,KAAOA,GAAE,OAAO,QAAWqD,CAC7D,CAAC,EACGmF,GAAc,OAAS,EACvBA,GAAc,CAAC,EAAE,OAASD,GAG1Bd,EAAyB,KAAK,CAAE,IAAKc,GAAM,OAAQA,EAAK,CAAC,CAEjE,CACA,GAAIH,GAAuB,CAEvB,IAAIK,GAAS9T,GAAIoT,GAAM,CAAC,EACpBW,GAAWD,GAASV,GAAM,CAAC,EAC3BQ,GAAO,CAAE,OAAQG,GAAU,EAAG9T,EAAG,KAAM6T,EAAO,EAG9CD,GAAgBb,EAA4B,OAAO,SAAU3H,GAAG,CAChE,OAAQ0I,IAAY1I,GAAE,OAAO,QAAU0I,IAAY1I,GAAE,OAAO,MACvDyI,IAAUzI,GAAE,OAAO,QAAU0I,IAAY1I,GAAE,OAAO,MAClD0I,IAAY1I,GAAE,OAAO,QAAUyI,IAAUzI,GAAE,OAAO,MAAU+H,GAAM,CAAC,GAAK/H,GAAE,OAAO,KAAOA,GAAE,OAAO,QAAWsD,GACxGyE,GAAM,CAAC,GAAK/H,GAAE,OAAO,KAAOA,GAAE,OAAO,QAAWqD,CAC7D,CAAC,EACGmF,GAAc,OAAS,EACvBA,GAAc,CAAC,EAAE,OAASD,GAG1BZ,EAA4B,KAAK,CAAE,IAAKY,GAAM,OAAQA,EAAK,CAAC,CAEpE,CACJ,CACJ,EACS5T,GAAI,GAAIA,IAAK0C,EAAO,MAAO1C,KAChCqT,GAAQrT,EAAC,EAEb6S,EAAmB,KAAK,MAAMA,EAAoBC,EAAyB,OAAO,SAAUzH,GAAG,CAAE,OAAOA,GAAE,OAAO,IAAMpL,GAAKoL,GAAE,OAAO,EAAIA,GAAE,IAAI,GAAK,CAAG,CAAC,CAAC,EACzJyH,EAA2BA,EAAyB,OAAO,SAAUzH,GAAG,CAAE,OAAOA,GAAE,OAAO,IAAMpL,CAAG,CAAC,EACpG8S,EAAsB,KAAK,MAAMA,EAAuBC,EAA4B,OAAO,SAAU3H,GAAG,CAAE,OAAOA,GAAE,OAAO,IAAMpL,CAAG,CAAC,CAAC,EACrI+S,EAA8BA,EAA4B,OAAO,SAAU3H,GAAG,CAAE,OAAOA,GAAE,OAAO,IAAMpL,CAAG,CAAC,CAC9G,EACSA,EAAI,EAAGA,GAAKyC,EAAO,OAAQzC,IAChCgT,EAAQhT,CAAC,EAEb4S,EAAmB,KAAK,MAAMA,EAAoBC,EAAyB,OAAO,SAAUzH,EAAG,CAAE,OAAOA,EAAE,OAAO,EAAIA,EAAE,IAAI,GAAK,CAAG,CAAC,CAAC,EACrI0H,EAAsB,KAAK,MAAMA,EAAuBC,CAA2B,EACnF,IAAIgB,EAAsBnB,EACrB,OAAO,SAAUxH,EAAG,CAAE,OAAOA,EAAE,OAAO,EAAIA,EAAE,IAAI,GAAK,CAAG,CAAC,EACzD,IAAI,SAAUA,EAAG,CAClB,IAAIrL,GAAKqL,EAAE,IAAI,OAASA,EAAE,IAAI,KAAOA,EAAE,OAAO,OAASA,EAAE,OAAO,MAAQ,EACpEpL,GAAKoL,EAAE,IAAI,EAAIA,EAAE,OAAO,EAAI,GAAK,EACrC,GAAK3I,EAAO,IAAI,KAAK,MAAM1C,CAAC,EAAG,KAAK,MAAMC,CAAC,CAAC,EAG5C,KAAIgU,GAAU,CAAC5I,EAAE,IAAI,KAAOA,EAAE,IAAI,OAAQA,EAAE,OAAO,KAAOA,EAAE,OAAO,OAAQA,EAAE,OAAO,EAAIA,EAAE,IAAI,EAAI,CAAC,EAC/F1K,GAAOiE,EAAIqP,EAAO,EAAIA,GAAQ,OAC9BC,GAAQ1C,EAAa,CAAE,EAAG,KAAK,MAAMxR,CAAC,EAAG,EAAG,KAAK,MAAMC,CAAC,CAAE,EAAG,CAAC,EAAG,EAAG,EAAG,EAAG,CAAC,EAAGyC,CAAM,EACxF,MAAO,CAAE,MAAOwR,GAAO,EAAGlU,EAAG,EAAGC,EAAG,KAAMU,EAAK,EAClD,CAAC,EACI,OAAO,SAAU0K,EAAG,CAAE,MAAO,CAAC,CAACA,CAAG,CAAC,EACnC,KAAK,SAAU9K,EAAGC,EAAG,CAAE,OAAOD,EAAE,MAAQC,EAAE,KAAO,CAAC,EAElD,IAAI,SAAUiR,EAAO5Q,EAAGsT,EAAgB,CACzC,GAAItT,EAAI4N,EACJ,OAAO,KAEX,IAAI2F,GAAcD,EACb,OAAO,SAAUnO,GAAGqO,GAAI,CAAE,OAAOxT,IAAMwT,EAAI,CAAC,EAC5C,IAAI,SAAUrO,GAAG,CAAE,MAAQ,CAAE,EAAGA,GAAE,EAAG,EAAGA,GAAE,EAAG,MAAOA,GAAE,MAAS,KAAK,IAAKA,GAAE,KAAOyL,EAAM,KAAO,CAAC,EAAKA,EAAM,KAAM,KAAMzL,GAAE,IAAK,CAAI,CAAC,EACnI,KAAK,SAAUzF,GAAGC,GAAG,CAAE,OAAOD,GAAE,MAAQC,GAAE,KAAO,CAAC,EACvD,GAAI4T,GAAY,OAAS,EACrB,OAAO,KAEX,IAAIF,GAAQzC,EAAM,MAAQ2C,GAAY,CAAC,EAAE,MAAQA,GAAY,CAAC,EAAE,MAChE,MAAO,CAAE,OAAQ,CAAC3C,CAAK,EAAE,OAAO2C,GAAY,MAAM,EAAG,CAAC,CAAC,EAAG,MAAOF,EAAM,CAC3E,CAAC,EACI,OAAO,SAAU7I,EAAG,CAAE,MAAO,CAAC,CAACA,CAAG,CAAC,EACnC,KAAK,SAAU9K,EAAGC,EAAG,CAAE,OAAOD,EAAE,MAAQC,EAAE,KAAO,CAAC,EACvD,GAAIwT,EAAoB,SAAW,EAC/B,OAAO,KAEX,IAAIzS,EAAKuN,EAAsBkF,EAAoB,CAAC,EAAE,OAAO,CAAC,EAAGA,EAAoB,CAAC,EAAE,OAAO,CAAC,EAAGA,EAAoB,CAAC,EAAE,OAAO,CAAC,CAAC,EAAGzE,EAAWhO,EAAG,SAAU+N,EAAU/N,EAAG,QAAS8N,EAAa9N,EAAG,WAChM+S,EAAYC,EAAqB7R,EAAQqQ,EAAuBxD,EAAUD,EAASD,CAAU,EAC7FjN,EAAS,CAAC,EACVkS,GACAlS,EAAO,KAAK,CACR,iBAAkB,CAAE,EAAGkS,EAAU,iBAAiB,EAAG,EAAGA,EAAU,iBAAiB,CAAE,EACrF,WAAY,CAAE,EAAGjF,EAAW,EAAG,EAAGA,EAAW,CAAE,EAC/C,UAAWiF,EAAU,UACrB,QAAS,CAAE,EAAGhF,EAAQ,EAAG,EAAGA,EAAQ,CAAE,EACtC,SAAU,CAAE,EAAGC,EAAS,EAAG,EAAGA,EAAS,CAAE,CAC7C,CAAC,EAOL,IAAIiF,EAAcjC,EAAiB7P,EAAQ6M,CAAQ,EAC/CkF,EAAalC,EAAiB7P,EAAQ4M,CAAO,EAC7CoF,EAAgBnC,EAAiB7P,EAAQ2M,CAAU,EACnDsF,EAAoBJ,EAAqB7R,EAAQqQ,EAAuByB,EAAaC,EAAYC,CAAa,EAUlH,OATIC,GACAvS,EAAO,KAAK,CACR,iBAAkB,CAAE,EAAGuS,EAAkB,iBAAiB,EAAG,EAAGA,EAAkB,iBAAiB,CAAE,EACrG,WAAY,CAAE,EAAGD,EAAc,EAAG,EAAGA,EAAc,CAAE,EACrD,QAAS,CAAE,EAAGD,EAAW,EAAG,EAAGA,EAAW,CAAE,EAC5C,SAAU,CAAE,EAAGD,EAAY,EAAG,EAAGA,EAAY,CAAE,EAC/C,UAAWG,EAAkB,SACjC,CAAC,EAEDvS,EAAO,SAAW,EACX,KAEJA,CACX,CACApD,EAAQ,OAAS4T,EACjB,SAAS2B,EAAqB7R,EAAQqQ,EAAuBxD,EAAUD,EAASD,EAAY,CACxF,IAAI9N,EAGA4E,EACAsJ,EACJ,GAAI,CACClO,EAAKiO,EAAiBF,EAASC,EAAUF,EAAY3M,CAAM,EAAGyD,EAAY5E,EAAG,UAAWkO,EAAalO,EAAG,UAC7G,MACU,CACN,OAAO,IACX,CAEA,IAAIqT,EAA2B,CAC3B,EAAGrF,EAAS,EAAID,EAAQ,EAAID,EAAW,EACvC,EAAGE,EAAS,EAAID,EAAQ,EAAID,EAAW,CAC3C,EACIwF,GAAiCjG,EAASU,EAASD,CAAU,EAAIT,EAASU,EAASC,CAAQ,GAAK,EAAIE,EACpGqF,EAAsB,EAAK,EAAID,EAC/BE,EAA2B,CAC3B,EAAGzF,EAAQ,EAAIwF,GAAuBF,EAAyB,EAAItF,EAAQ,GAC3E,EAAGA,EAAQ,EAAIwF,GAAuBF,EAAyB,EAAItF,EAAQ,EAC/E,EACI0F,EAAoBjC,EACnB,IAAI,SAAU1H,EAAG,CAClB,IAAIrL,GAAKqL,EAAE,IAAI,OAASA,EAAE,IAAI,KAAOA,EAAE,OAAO,OAASA,EAAE,OAAO,MAAQ,EACpEpL,GAAKoL,EAAE,IAAI,EAAIA,EAAE,OAAO,EAAI,GAAK,EACrC,GAAK3I,EAAO,IAAI,KAAK,MAAM1C,CAAC,EAAG,KAAK,MAAMC,CAAC,CAAC,EAG5C,KAAIgU,EAAU,CAAC5I,EAAE,IAAI,KAAOA,EAAE,IAAI,OAAQA,EAAE,OAAO,KAAOA,EAAE,OAAO,OAASA,EAAE,OAAO,EAAIA,EAAE,IAAI,EAAI,CAAE,EACjG1K,EAAOiE,EAAIqP,CAAO,EAAIA,EAAQ,OAC9BgB,EAAYzD,EAAa,CAAE,EAAG,KAAK,MAAMxR,CAAC,EAAG,EAAG,KAAK,MAAMC,CAAC,CAAE,EAAG,CAAC,EAAG,EAAG,CAAC,EAAGyC,CAAM,EAClFwR,EAAQe,EAAYrG,EAAS,CAAE,EAAG5O,EAAG,EAAGC,CAAE,EAAG8U,CAAwB,EACzE,MAAO,CAAE,EAAG/U,EAAG,EAAGC,EAAG,MAAOiU,CAAM,EACtC,CAAC,EACI,OAAO,SAAUhU,EAAG,CAAE,MAAO,CAAC,CAACA,CAAG,CAAC,EACnC,KAAK,SAAUK,EAAGC,EAAG,CAAE,OAAOD,EAAE,MAAQC,EAAE,KAAO,CAAC,EAGnD0U,EAAmBL,GAAgC,IAAMG,EAAkB,OAASA,EAAkB,CAAC,EAAID,EAC/G,MAAO,CAAE,iBAAkBG,EAAkB,UAAW/O,CAAU,CACtE,CAGM,EACG,CAAC,EAAE,OACZ,CAAC,yBCr3TD,SAA2CgP,EAAMC,EAAAA,CAC1B,OAAZC,IAAY,UAA8B,OAAXC,IAAW,SACnDA,GAAOD,QAAUD,EAAAA,EACQ,OAAXG,QAAW,YAAcA,OAAOC,IAC9CD,OAAO,CAAA,EAAIH,CAAAA,EACe,OAAZC,IAAY,SAC1BA,GAAuB,cAAID,EAAAA,EAE3BD,EAAoB,cAAIC,EAAAA,CACzB,GAAEK,IAAM,KAAA,IAAA,CAAA,IAAAC,EAAA,CAAA,IAAA,CAAAA,EAAAC,IAAA,CCTT,IAAAC,EAAAC,EAiBIC,GAAS,UAAA,CAWX,IAAIA,EAAS,SAASC,EAAYC,EAAAA,CAEhC,IAGIC,EAAcF,EACdG,EAAwBC,EAAuBH,CAAAA,EAC/CI,EAAW,KACXC,EAAe,EACfC,EAAa,KACbC,EAAY,CAAA,EAEZC,EAAQ,CAAC,EAETC,EAAW,SAASC,GAAMC,GAAAA,CAG5BP,GAAW,SAASQ,GAAAA,CAElB,QADIC,GAAU,IAAIC,MAAMF,EAAAA,EACfG,GAAM,EAAGA,GAAMH,GAAaG,IAAO,EAAG,CAC7CF,GAAQE,EAAAA,EAAO,IAAID,MAAMF,EAAAA,EACzB,QAASI,GAAM,EAAGA,GAAMJ,GAAaI,IAAO,EAC1CH,GAAQE,EAAAA,EAAKC,EAAAA,EAAO,IAExB,CACA,OAAOH,EACT,GAVAR,EAA6B,EAAdJ,EAAkB,EAAA,EAYjCgB,GAA0B,EAAG,CAAA,EAC7BA,GAA0BZ,EAAe,EAAG,CAAA,EAC5CY,GAA0B,EAAGZ,EAAe,CAAA,EAC5Ca,GAAAA,EACAC,GAAAA,EACAC,EAAcV,GAAMC,EAAAA,EAEhBV,GAAe,GACjBoB,GAAgBX,EAAAA,EAGdJ,GAAc,OAChBA,EAAagB,GAAWrB,EAAaC,EAAuBK,CAAAA,GAG9DgB,GAAQjB,EAAYK,EAAAA,CACtB,EAEIM,GAA4B,SAASF,GAAKC,GAAAA,CAE5C,QAASnB,GAAAA,GAAQA,IAAK,EAAGA,IAAK,EAE5B,GAAA,EAAIkB,GAAMlB,IAAAA,IAAWQ,GAAgBU,GAAMlB,IAE3C,QAAS2B,GAAAA,GAAQA,IAAK,EAAGA,IAAK,EAExBR,GAAMQ,IAAAA,IAAWnB,GAAgBW,GAAMQ,KAKzCpB,EAASW,GAAMlB,EAAAA,EAAGmB,GAAMQ,EAAAA,EAHpB,GAAK3B,IAAKA,IAAK,IAAM2B,IAAK,GAAKA,IAAK,IAClC,GAAKA,IAAKA,IAAK,IAAM3B,IAAK,GAAKA,IAAK,IACpC,GAAKA,IAAKA,IAAK,GAAK,GAAK2B,IAAKA,IAAK,EAOjD,EAsBIL,GAAqB,UAAA,CAEvB,QAAStB,GAAI,EAAGA,GAAIQ,EAAe,EAAGR,IAAK,EACrCO,EAASP,EAAAA,EAAG,CAAA,GAAM,OAGtBO,EAASP,EAAAA,EAAG,CAAA,EAAMA,GAAI,GAAK,GAG7B,QAAS2B,GAAI,EAAGA,GAAInB,EAAe,EAAGmB,IAAK,EACrCpB,EAAS,CAAA,EAAGoB,EAAAA,GAAM,OAGtBpB,EAAS,CAAA,EAAGoB,EAAAA,EAAMA,GAAI,GAAK,EAE/B,EAEIN,GAA6B,UAAA,CAI/B,QAFIO,GAAMC,EAAOC,mBAAmB1B,CAAAA,EAE3BL,GAAI,EAAGA,GAAI6B,GAAIG,OAAQhC,IAAK,EAEnC,QAASiC,GAAI,EAAGA,GAAIJ,GAAIG,OAAQC,IAAK,EAAG,CAEtC,IAAId,GAAMU,GAAI7B,EAAAA,EACVoB,GAAMS,GAAII,EAAAA,EAEd,GAAIzB,EAASW,EAAAA,EAAKC,EAAAA,GAAQ,KAI1B,QAASnB,GAAAA,GAAQA,IAAK,EAAGA,IAAK,EAE5B,QAAS2B,GAAAA,GAAQA,IAAK,EAAGA,IAAK,EAI1BpB,EAASW,GAAMlB,EAAAA,EAAGmB,GAAMQ,EAAAA,EAFtB3B,IAEsB2B,IAFX3B,IAAK,GAAK2B,IAAV3B,IAAqB2B,IAAK,GACjC3B,IAAK,GAAK2B,IAAK,CAO7B,CAEJ,EAEIH,GAAkB,SAASX,GAAAA,CAI7B,QAFIoB,GAAOJ,EAAOK,iBAAiB9B,CAAAA,EAE1BL,GAAI,EAAGA,GAAI,GAAIA,IAAK,EAAG,CAC9B,IAAIoC,GAAAA,CAAQtB,KAAWoB,IAAQlC,GAAK,IAAM,EAC1CQ,EAAS6B,KAAKC,MAAMtC,GAAI,CAAA,CAAA,EAAIA,GAAI,EAAIS,EAAe,EAAI,CAAA,EAAK2B,EAC9D,CAEA,IAASpC,GAAI,EAAGA,GAAI,GAAIA,IAAK,EACvBoC,GAAAA,CAAQtB,KAAWoB,IAAQlC,GAAK,IAAM,EAC1CQ,EAASR,GAAI,EAAIS,EAAe,EAAI,CAAA,EAAG4B,KAAKC,MAAMtC,GAAI,CAAA,CAAA,EAAMoC,EAEhE,EAEIZ,EAAgB,SAASV,GAAMC,GAAAA,CAMjC,QAJIwB,GAAQjC,GAAyB,EAAKS,GACtCmB,GAAOJ,EAAOU,eAAeD,EAAAA,EAGxBvC,GAAI,EAAGA,GAAI,GAAIA,IAAK,EAAG,CAE9B,IAAIoC,GAAAA,CAAQtB,KAAWoB,IAAQlC,GAAK,IAAM,EAEtCA,GAAI,EACNQ,EAASR,EAAAA,EAAG,CAAA,EAAKoC,GACRpC,GAAI,EACbQ,EAASR,GAAI,CAAA,EAAG,CAAA,EAAKoC,GAErB5B,EAASC,EAAe,GAAKT,EAAAA,EAAG,CAAA,EAAKoC,EAEzC,CAGA,IAASpC,GAAI,EAAGA,GAAI,GAAIA,IAAK,EAEvBoC,GAAAA,CAAQtB,KAAWoB,IAAQlC,GAAK,IAAM,EAEtCA,GAAI,EACNQ,EAAS,CAAA,EAAGC,EAAeT,GAAI,CAAA,EAAKoC,GAC3BpC,GAAI,EACbQ,EAAS,CAAA,EAAG,GAAKR,GAAI,EAAI,CAAA,EAAKoC,GAE9B5B,EAAS,CAAA,EAAG,GAAKR,GAAI,CAAA,EAAKoC,GAK9B5B,EAASC,EAAe,CAAA,EAAG,CAAA,EAAA,CAAOK,EACpC,EAEIa,GAAU,SAASY,GAAMxB,GAAAA,CAQ3B,QANI0B,GAAAA,GACAtB,GAAMV,EAAe,EACrBiC,GAAW,EACXC,GAAY,EACZC,GAAWd,EAAOe,gBAAgB9B,EAAAA,EAE7BK,GAAMX,EAAe,EAAGW,GAAM,EAAGA,IAAO,EAI/C,IAFIA,IAAO,IAAGA,IAAO,KAER,CAEX,QAASQ,GAAI,EAAGA,GAAI,EAAGA,IAAK,EAE1B,GAAIpB,EAASW,EAAAA,EAAKC,GAAMQ,EAAAA,GAAM,KAAM,CAElC,IAAIkB,GAAAA,GAEAH,GAAYJ,GAAKP,SACnBc,IAAYP,GAAKI,EAAAA,IAAeD,GAAY,IAAM,GAGzCE,GAASzB,GAAKC,GAAMQ,EAAAA,IAG7BkB,GAAAA,CAAQA,IAGVtC,EAASW,EAAAA,EAAKC,GAAMQ,EAAAA,EAAKkB,IACzBJ,IAAY,IADaI,KAIvBH,IAAa,EACbD,GAAW,EAEf,CAKF,IAFAvB,IAAOsB,IAEG,GAAKhC,GAAgBU,GAAK,CAClCA,IAAOsB,GACPA,GAAAA,CAAOA,GACP,KACF,CACF,CAEJ,EAmEIf,GAAa,SAASvB,GAAYC,GAAsB2C,GAAAA,CAM1D,QAJIC,GAAWC,EAAUC,YAAY/C,GAAYC,EAAAA,EAE7C+C,GAASC,EAAAA,EAEJpD,GAAI,EAAGA,GAAI+C,GAASf,OAAQhC,IAAK,EAAG,CAC3C,IAAIuC,GAAOQ,GAAS/C,EAAAA,EACpBmD,GAAOE,IAAId,GAAKe,QAAAA,EAAW,CAAA,EAC3BH,GAAOE,IAAId,GAAKgB,UAAAA,EAAazB,EAAO0B,gBAAgBjB,GAAKe,QAAAA,EAAWnD,EAAAA,CAAAA,EACpEoC,GAAKkB,MAAMN,EAAAA,CACb,CAGA,IAAIO,GAAiB,EACrB,IAAS1D,GAAI,EAAGA,GAAIgD,GAAShB,OAAQhC,IAAK,EACxC0D,IAAkBV,GAAShD,EAAAA,EAAG2D,UAGhC,GAAIR,GAAOK,gBAAAA,EAAqC,EAAjBE,GAC7B,KAAM,0BACFP,GAAOK,gBAAAA,EACP,IACiB,EAAjBE,GACA,IASN,IALIP,GAAOK,gBAAAA,EAAoB,GAAsB,EAAjBE,IAClCP,GAAOE,IAAI,EAAG,CAAA,EAITF,GAAOK,gBAAAA,EAAoB,GAAK,GACrCL,GAAOS,OAAAA,EAAO,EAIhB,KAAA,EAEMT,GAAOK,gBAAAA,GAAsC,EAAjBE,KAGhCP,GAAOE,IAxVA,IAwVU,CAAA,EAEbF,GAAOK,gBAAAA,GAAsC,EAAjBE,MAGhCP,GAAOE,IA5VA,GA4VU,CAAA,EAGnB,OApHgB,SAASF,GAAQH,GAAAA,CAUjC,QARIa,GAAS,EAETC,GAAa,EACbC,GAAa,EAEbC,EAAS,IAAI9C,MAAM8B,GAAShB,MAAAA,EAC5BiC,EAAS,IAAI/C,MAAM8B,GAAShB,MAAAA,EAEvB/B,GAAI,EAAGA,GAAI+C,GAAShB,OAAQ/B,IAAK,EAAG,CAE3C,IAAIiE,GAAUlB,GAAS/C,EAAAA,EAAG0D,UACtBQ,GAAUnB,GAAS/C,EAAAA,EAAGmE,WAAaF,GAEvCJ,GAAazB,KAAKgC,IAAIP,GAAYI,EAAAA,EAClCH,GAAa1B,KAAKgC,IAAIN,GAAYI,EAAAA,EAElCH,EAAO/D,EAAAA,EAAK,IAAIiB,MAAMgD,EAAAA,EAEtB,QAASlE,GAAI,EAAGA,GAAIgE,EAAO/D,EAAAA,EAAG+B,OAAQhC,IAAK,EACzCgE,EAAO/D,EAAAA,EAAGD,EAAAA,EAAK,IAAOmD,GAAOmB,UAAAA,EAAYtE,GAAI6D,EAAAA,EAE/CA,IAAUK,GAEV,IAAIK,GAASzC,EAAO0C,0BAA0BL,EAAAA,EAG1CM,GAFUC,EAAaV,EAAO/D,EAAAA,EAAIsE,GAAOhB,UAAAA,EAAc,CAAA,EAErCnB,IAAImC,EAAAA,EAE1B,IADAN,EAAOhE,EAAAA,EAAK,IAAIiB,MAAMqD,GAAOhB,UAAAA,EAAc,CAAA,EAClCvD,GAAI,EAAGA,GAAIiE,EAAOhE,EAAAA,EAAG+B,OAAQhC,IAAK,EAAG,CAC5C,IAAI2E,GAAW3E,GAAIyE,GAAQlB,UAAAA,EAAcU,EAAOhE,EAAAA,EAAG+B,OACnDiC,EAAOhE,EAAAA,EAAGD,EAAAA,EAAM2E,IAAY,EAAIF,GAAQG,MAAMD,EAAAA,EAAY,CAC5D,CACF,CAEA,IAAIE,GAAiB,EACrB,IAAS7E,GAAI,EAAGA,GAAIgD,GAAShB,OAAQhC,IAAK,EACxC6E,IAAkB7B,GAAShD,EAAAA,EAAGoE,WAGhC,IAAI7B,GAAO,IAAIrB,MAAM2D,EAAAA,EACjBC,GAAQ,EAEZ,IAAS9E,GAAI,EAAGA,GAAI8D,GAAY9D,IAAK,EACnC,IAASC,GAAI,EAAGA,GAAI+C,GAAShB,OAAQ/B,IAAK,EACpCD,GAAIgE,EAAO/D,EAAAA,EAAG+B,SAChBO,GAAKuC,EAAAA,EAASd,EAAO/D,EAAAA,EAAGD,EAAAA,EACxB8E,IAAS,GAKf,IAAS9E,GAAI,EAAGA,GAAI+D,GAAY/D,IAAK,EACnC,IAASC,GAAI,EAAGA,GAAI+C,GAAShB,OAAQ/B,IAAK,EACpCD,GAAIiE,EAAOhE,EAAAA,EAAG+B,SAChBO,GAAKuC,EAAAA,EAASb,EAAOhE,EAAAA,EAAGD,EAAAA,EACxB8E,IAAS,GAKf,OAAOvC,EACT,GAqDqBY,GAAQH,EAAAA,CAC7B,EAEApC,EAAMmE,QAAU,SAASxC,GAAMyC,GAAAA,CAI7B,IAAIC,GAAU,KAEd,OAJAD,GAAOA,IAAQ,OAAA,CAKf,IAAK,UACHC,GAAUC,EAAS3C,EAAAA,EACnB,MACF,IAAK,eACH0C,GAAUE,EAAW5C,EAAAA,EACrB,MACF,IAAK,OACH0C,GAAUG,EAAW7C,EAAAA,EACrB,MACF,IAAK,QACH0C,GAAUI,EAAQ9C,EAAAA,EAClB,MACF,QACE,KAAM,QAAUyC,EAAAA,CAGlBrE,EAAU2E,KAAKL,EAAAA,EACfvE,EAAa,IACf,EAEAE,EAAM2E,OAAS,SAASpE,GAAKC,GAAAA,CAC3B,GAAID,GAAM,GAAKV,GAAgBU,IAAOC,GAAM,GAAKX,GAAgBW,GAC/D,MAAMD,GAAM,IAAMC,GAEpB,OAAOZ,EAASW,EAAAA,EAAKC,EAAAA,CACvB,EAEAR,EAAM4E,eAAiB,UAAA,CACrB,OAAO/E,CACT,EAEAG,EAAM6E,KAAO,UAAA,CACX,GAAIpF,EAAc,EAAG,CAGnB,QAFIF,GAAa,EAEVA,GAAa,GAAIA,KAAc,CAIpC,QAHI6C,GAAWC,EAAUC,YAAY/C,GAAYG,CAAAA,EAC7C6C,GAASC,EAAAA,EAEJpD,GAAI,EAAGA,GAAIW,EAAUqB,OAAQhC,KAAK,CACzC,IAAIuC,GAAO5B,EAAUX,EAAAA,EACrBmD,GAAOE,IAAId,GAAKe,QAAAA,EAAW,CAAA,EAC3BH,GAAOE,IAAId,GAAKgB,UAAAA,EAAazB,EAAO0B,gBAAgBjB,GAAKe,QAAAA,EAAWnD,EAAAA,CAAAA,EACpEoC,GAAKkB,MAAMN,EAAAA,CACb,CAEA,IAAIO,GAAiB,EACrB,IAAS1D,GAAI,EAAGA,GAAIgD,GAAShB,OAAQhC,KACnC0D,IAAkBV,GAAShD,EAAAA,EAAG2D,UAGhC,GAAIR,GAAOK,gBAAAA,GAAsC,EAAjBE,GAC9B,KAEJ,CAEArD,EAAcF,EAChB,CAEAU,EAAAA,IApWuB,UAAA,CAKvB,QAHI6E,GAAe,EACfC,GAAU,EAEL3F,GAAI,EAAGA,GAAI,EAAGA,IAAK,EAAG,CAE7Ba,EAAAA,GAAeb,EAAAA,EAEf,IAAI4F,GAAY9D,EAAO+D,aAAajF,CAAAA,GAEhCZ,IAAK,GAAK0F,GAAeE,MAC3BF,GAAeE,GACfD,GAAU3F,GAEd,CAEA,OAAO2F,EACT,GAkVkBG,CAAAA,CAClB,EAEAlF,EAAMmF,eAAiB,SAASC,GAAUC,GAAAA,CAExCD,GAAWA,IAAY,EAGvB,IAAIE,GAAS,GAEbA,IAAU,iBACVA,IAAU,0CACVA,IAAU,8BACVA,IAAU,2BAPVD,GAAiBA,KAAjBA,OAAoD,EAAXD,GAAeC,IAOT,MAC/CC,IAAU,KACVA,IAAU,UAEV,QAASjG,GAAI,EAAGA,GAAIW,EAAM4E,eAAAA,EAAkBvF,IAAK,EAAG,CAElDiG,IAAU,OAEV,QAAStE,GAAI,EAAGA,GAAIhB,EAAM4E,eAAAA,EAAkB5D,IAAK,EAC/CsE,IAAU,cACVA,IAAU,0CACVA,IAAU,8BACVA,IAAU,8BACVA,IAAU,WAAaF,GAAW,MAClCE,IAAU,YAAcF,GAAW,MACnCE,IAAU,sBACVA,IAAUtF,EAAM2E,OAAOtF,GAAG2B,EAAAA,EAAI,UAAY,UAC1CsE,IAAU,IACVA,IAAU,MAGZA,IAAU,OACZ,CAKA,OAHAA,IAAU,YACA,UAGZ,EAEAtF,EAAMuF,aAAe,SAASH,GAAUC,GAAQG,GAAKC,GAAAA,CAEnD,IAAIC,GAAO,CAAC,EACe,OAAhBC,UAAU,CAAA,GAAM,WAIzBP,IAFAM,GAAOC,UAAU,CAAA,GAEDP,SAChBC,GAASK,GAAKL,OACdG,GAAME,GAAKF,IACXC,GAAQC,GAAKD,OAGfL,GAAWA,IAAY,EACvBC,GAAiBA,KAAjBA,OAAoD,EAAXD,GAAeC,IAGxDG,GAAsB,OAARA,IAAQ,SAAY,CAACI,KAAMJ,EAAAA,EAAOA,IAAO,CAAC,GACpDI,KAAOJ,GAAII,MAAQ,KACvBJ,GAAIK,GAAML,GAAQ,KAAIA,GAAIK,IAAM,qBAAuB,MAGvDJ,GAA0B,OAAVA,IAAU,SAAY,CAACG,KAAMH,EAAAA,EAASA,IAAS,CAAC,GAC1DG,KAAOH,GAAMG,MAAQ,KAC3BH,GAAMI,GAAMJ,GAAU,KAAIA,GAAMI,IAAM,eAAiB,KAEvD,IACI7E,GAAO3B,GAAGyG,GAAcC,GADxBC,GAAOhG,EAAM4E,eAAAA,EAAmBQ,GAAoB,EAATC,GAC7BY,GAAM,GAmBxB,IAjBAF,GAAO,IAAMX,GAAW,QAAUA,GAChC,KAAOA,GAAW,SAAWA,GAAW,KAE1Ca,IAAS,wDACTA,IAAUP,GAAKQ,SAA+D,GAApD,WAAaF,GAAO,eAAiBA,GAAO,MACtEC,IAAS,iBAAmBD,GAAO,IAAMA,GAAO,KAChDC,IAAS,uCACTA,IAAUR,GAAMG,MAAQJ,GAAII,KAAQ,gCAChCO,GAAU,CAACV,GAAMI,GAAIL,GAAIK,EAAAA,EAAIO,KAAK,GAAA,EAAKC,KAAAA,CAAAA,EAAW,IAAM,GAC5DJ,IAAS,IACTA,IAAUR,GAAU,KAAI,cAAgBU,GAAUV,GAAMI,EAAAA,EAAM,KAC1DM,GAAUV,GAAMG,IAAAA,EAAQ,WAAa,GACzCK,IAAUT,GAAQ,KAAI,oBAAsBW,GAAUX,GAAIK,EAAAA,EAAM,KAC5DM,GAAUX,GAAII,IAAAA,EAAQ,iBAAmB,GAC7CK,IAAS,gEACTA,IAAS,YAEJ5G,GAAI,EAAGA,GAAIW,EAAM4E,eAAAA,EAAkBvF,IAAK,EAE3C,IADAyG,GAAKzG,GAAI+F,GAAWC,GACfrE,GAAI,EAAGA,GAAIhB,EAAM4E,eAAAA,EAAkB5D,IAAK,EACvChB,EAAM2E,OAAOtF,GAAG2B,EAAAA,IAElBiF,IAAS,KADJjF,GAAEoE,GAASC,IACI,IAAMS,GAAKC,IAQrC,OAHAE,IAAS,yCACA,QAGX,EAEAjG,EAAMsG,cAAgB,SAASlB,GAAUC,GAAAA,CAEvCD,GAAWA,IAAY,EACvBC,GAAiBA,KAAjBA,OAAoD,EAAXD,GAAeC,GAExD,IAAIW,GAAOhG,EAAM4E,eAAAA,EAAmBQ,GAAoB,EAATC,GAC3CkB,GAAMlB,GACN5B,GAAMuC,GAAOX,GAEjB,OAAOiB,EAAcN,GAAMA,IAAM,SAASQ,GAAGC,GAAAA,CAC3C,GAAIF,IAAOC,IAAKA,GAAI/C,IAAO8C,IAAOE,IAAKA,GAAIhD,GAAK,CAC9C,IAAIzC,GAAIS,KAAKC,OAAQ8E,GAAID,IAAOnB,EAAAA,EAC5B/F,GAAIoC,KAAKC,OAAQ+E,GAAIF,IAAOnB,EAAAA,EAChC,OAAOpF,EAAM2E,OAAOtF,GAAG2B,EAAAA,EAAI,EAAI,CACjC,CACE,MAAO,EAEX,EAAA,CACF,EAEAhB,EAAM0G,aAAe,SAAStB,GAAUC,GAAQG,GAAAA,CAE9CJ,GAAWA,IAAY,EACvBC,GAAiBA,KAAjBA,OAAoD,EAAXD,GAAeC,GAExD,IAAIW,GAAOhG,EAAM4E,eAAAA,EAAmBQ,GAAoB,EAATC,GAE3CsB,GAAM,GAkBV,OAjBAA,IAAO,OACPA,IAAO,SACPA,IAAO3G,EAAMsG,cAAclB,GAAUC,EAAAA,EACrCsB,IAAO,IACPA,IAAO,WACPA,IAAOX,GACPW,IAAO,IACPA,IAAO,YACPA,IAAOX,GACPW,IAAO,IACHnB,KACFmB,IAAO,SACPA,IAAOR,GAAUX,EAAAA,EACjBmB,IAAO,KAETA,GAAO,IAGT,EAEA,IAAIR,GAAY,SAASS,GAAAA,CAEvB,QADIC,GAAU,GACLzH,GAAI,EAAGA,GAAIwH,GAAExF,OAAQhC,IAAK,EAAG,CACpC,IAAI4B,GAAI4F,GAAEE,OAAO1H,EAAAA,EACjB,OAAO4B,GAAAA,CACP,IAAK,IAAK6F,IAAW,OAAQ,MAC7B,IAAK,IAAKA,IAAW,OAAQ,MAC7B,IAAK,IAAKA,IAAW,QAAS,MAC9B,IAAK,IAAKA,IAAW,SAAU,MAC/B,QAAUA,IAAW7F,EAAAA,CAEvB,CACA,OAAO6F,EACT,EAgHA,OAtDA7G,EAAM+G,YAAc,SAAS3B,GAAUC,GAAAA,CAGrC,IAFAD,GAAWA,IAAY,GAER,EACb,OA5DmB,SAASC,EAAAA,CAE9BA,EAAiBA,IAAjBA,OAAyCD,EAAeC,EAExD,IAIIoB,EAAGD,GAAGQ,GAAIC,GAAIC,GAJdlB,GAHW,EAGJhG,EAAM4E,eAAAA,EAAuC,EAATS,EAC3CkB,GAAMlB,EACN5B,GAAMuC,GAAOX,EAIb8B,GAAS,CACX,eAAM,SACN,UAAM,SACN,UAAM,SACN,KAAM,GAAA,EAGJC,GAAyB,CAC3B,eAAM,SACN,UAAM,SACN,UAAM,IACN,KAAM,GAAA,EAGJC,GAAQ,GACZ,IAAKZ,EAAI,EAAGA,EAAIT,GAAMS,GAAK,EAAG,CAG5B,IAFAO,GAAKvF,KAAKC,OAAO+E,EAAIF,IAzBR,CAAA,EA0BbU,GAAKxF,KAAKC,OAAO+E,EAAI,EAAIF,IA1BZ,CAAA,EA2BRC,GAAI,EAAGA,GAAIR,GAAMQ,IAAK,EACzBU,GAAI,SAEAX,IAAOC,IAAKA,GAAI/C,IAAO8C,IAAOE,GAAKA,EAAIhD,IAAOzD,EAAM2E,OAAOqC,GAAIvF,KAAKC,OAAO8E,GAAID,IA9BxE,CAAA,CAAA,IA+BTW,GAAI,KAGFX,IAAOC,IAAKA,GAAI/C,IAAO8C,IAAOE,EAAE,GAAKA,EAAE,EAAIhD,IAAOzD,EAAM2E,OAAOsC,GAAIxF,KAAKC,OAAO8E,GAAID,IAlC5E,CAAA,CAAA,EAmCTW,IAAK,IAGLA,IAAK,SAIPG,IAAUhC,EAAS,GAAKoB,EAAE,GAAKhD,GAAO2D,GAAuBF,EAAAA,EAAKC,GAAOD,EAAAA,EAG3EG,IAAS;CACX,CAEA,OAAIrB,GAAO,GAAKX,EAAS,EAChBgC,GAAMC,UAAU,EAAGD,GAAMjG,OAAS4E,GAAO,CAAA,EAAK1F,MAAM0F,GAAK,CAAA,EAAGI,KAAK,QAAA,EAGnEiB,GAAMC,UAAU,EAAGD,GAAMjG,OAAO,CAAA,CACzC,GAM4BiE,EAAAA,EAG1BD,IAAY,EACZC,GAAiBA,KAAjBA,OAAoD,EAAXD,GAAeC,GAExD,IAIIoB,GAAGD,GAAGnH,GAAG6H,GAJTlB,GAAOhG,EAAM4E,eAAAA,EAAmBQ,GAAoB,EAATC,GAC3CkB,GAAMlB,GACN5B,GAAMuC,GAAOX,GAIbkC,GAAQjH,MAAM8E,GAAS,CAAA,EAAGgB,KAAK,cAAA,EAC/BoB,GAAQlH,MAAM8E,GAAS,CAAA,EAAGgB,KAAK,IAAA,EAE/BiB,GAAQ,GACRI,GAAO,GACX,IAAKhB,GAAI,EAAGA,GAAIT,GAAMS,IAAK,EAAG,CAG5B,IAFApH,GAAIoC,KAAKC,OAAQ+E,GAAIF,IAAOnB,EAAAA,EAC5BqC,GAAO,GACFjB,GAAI,EAAGA,GAAIR,GAAMQ,IAAK,EACzBU,GAAI,EAEAX,IAAOC,IAAKA,GAAI/C,IAAO8C,IAAOE,IAAKA,GAAIhD,IAAOzD,EAAM2E,OAAOtF,GAAGoC,KAAKC,OAAO8E,GAAID,IAAOnB,EAAAA,CAAAA,IACvF8B,GAAI,GAINO,IAAQP,GAAIK,GAAQC,GAGtB,IAAKnI,GAAI,EAAGA,GAAI+F,GAAU/F,IAAK,EAC7BgI,IAASI,GAAO;CAEpB,CAEA,OAAOJ,GAAMC,UAAU,EAAGD,GAAMjG,OAAO,CAAA,CACzC,EAEApB,EAAM0H,kBAAoB,SAASC,GAASvC,GAAAA,CAC1CA,GAAWA,IAAY,EAEvB,QADIhE,GAASpB,EAAM4E,eAAAA,EACVrE,GAAM,EAAGA,GAAMa,GAAQb,KAC9B,QAASC,GAAM,EAAGA,GAAMY,GAAQZ,KAC9BmH,GAAQC,UAAY5H,EAAM2E,OAAOpE,GAAKC,EAAAA,EAAO,QAAU,QACvDmH,GAAQE,SAAStH,GAAM6E,GAAU5E,GAAM4E,GAAUA,GAAUA,EAAAA,CAGjE,EAEOpF,CACT,EAiBAV,EAAOwI,eAXPxI,EAAOyI,mBAAqB,CAC1B,QAAY,SAASnB,EAAAA,CAEnB,QADIoB,EAAQ,CAAA,EACH5I,EAAI,EAAGA,EAAIwH,EAAExF,OAAQhC,GAAK,EAAG,CACpC,IAAI4B,EAAI4F,EAAEqB,WAAW7I,CAAAA,EACrB4I,EAAMtD,KAAS,IAAJ1D,CAAAA,CACb,CACA,OAAOgH,CACT,CAAA,GAGwD,QAW1D1I,EAAO4I,oBAAsB,SAASC,EAAaC,EAAAA,CAIjD,IAAIC,GAAa,UAAA,CAWf,QATIC,EAAMC,EAAwBJ,CAAAA,EAC9BK,EAAO,UAAA,CACT,IAAIC,GAAIH,EAAIE,KAAAA,EACZ,GAAIC,IAAJ,GAAa,KAAM,MACnB,OAAOA,EACT,EAEIC,EAAQ,EACRL,EAAa,CAAC,IACL,CACX,IAAIM,EAAKL,EAAIE,KAAAA,EACb,GAAIG,GAAJ,GAAc,MACd,IAAIC,EAAKJ,EAAAA,EAILK,GAHKL,EAAAA,GAGM,EAFNA,EAAAA,EAGTH,EAFQS,OAAOC,aAAeJ,GAAM,EAAKC,CAAAA,CAAAA,EAEzBC,GAChBH,GAAS,CACX,CACA,GAAIA,GAASN,EACX,MAAMM,EAAQ,OAASN,EAGzB,OAAOC,CACT,GA3BiB,EA6BbW,EAAc,GAElB,OAAO,SAASpC,EAAAA,CAEd,QADIoB,EAAQ,CAAA,EACH5I,EAAI,EAAGA,EAAIwH,EAAExF,OAAQhC,GAAK,EAAG,CACpC,IAAI4B,EAAI4F,EAAEqB,WAAW7I,CAAAA,EACrB,GAAI4B,EAAI,IACNgH,EAAMtD,KAAK1D,CAAAA,MACN,CACL,IAAIyH,EAAIJ,EAAWzB,EAAEE,OAAO1H,CAAAA,CAAAA,EACZ,OAALqJ,GAAK,UACJ,IAAJA,IAAaA,EAEjBT,EAAMtD,KAAK+D,CAAAA,GAGXT,EAAMtD,KAAK+D,IAAM,CAAA,EACjBT,EAAMtD,KAAS,IAAJ+D,CAAAA,GAGbT,EAAMtD,KAAKsE,CAAAA,CAEf,CACF,CACA,OAAOhB,CACT,CACF,EAMA,IAuCMiB,EA0CAC,EACAC,EAGAnJ,EAEAoJ,EA5EFzJ,EAAyB,CAC3B0J,EAAI,EACJC,EAAI,EACJC,EAAI,EACJC,EAAI,CAAA,EAsBFtI,GAEE+H,EAAyB,CAC3B,CAAA,EACA,CAAC,EAAG,EAAA,EACJ,CAAC,EAAG,EAAA,EACJ,CAAC,EAAG,EAAA,EACJ,CAAC,EAAG,EAAA,EACJ,CAAC,EAAG,EAAA,EACJ,CAAC,EAAG,GAAI,EAAA,EACR,CAAC,EAAG,GAAI,EAAA,EACR,CAAC,EAAG,GAAI,EAAA,EACR,CAAC,EAAG,GAAI,EAAA,EACR,CAAC,EAAG,GAAI,EAAA,EACR,CAAC,EAAG,GAAI,EAAA,EACR,CAAC,EAAG,GAAI,EAAA,EACR,CAAC,EAAG,GAAI,GAAI,EAAA,EACZ,CAAC,EAAG,GAAI,GAAI,EAAA,EACZ,CAAC,EAAG,GAAI,GAAI,EAAA,EACZ,CAAC,EAAG,GAAI,GAAI,EAAA,EACZ,CAAC,EAAG,GAAI,GAAI,EAAA,EACZ,CAAC,EAAG,GAAI,GAAI,EAAA,EACZ,CAAC,EAAG,GAAI,GAAI,EAAA,EACZ,CAAC,EAAG,GAAI,GAAI,GAAI,EAAA,EAChB,CAAC,EAAG,GAAI,GAAI,GAAI,EAAA,EAChB,CAAC,EAAG,GAAI,GAAI,GAAI,GAAA,EAChB,CAAC,EAAG,GAAI,GAAI,GAAI,GAAA,EAChB,CAAC,EAAG,GAAI,GAAI,GAAI,GAAA,EAChB,CAAC,EAAG,GAAI,GAAI,GAAI,GAAA,EAChB,CAAC,EAAG,GAAI,GAAI,GAAI,GAAA,EAChB,CAAC,EAAG,GAAI,GAAI,GAAI,GAAI,GAAA,EACpB,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,GAAA,EACrB,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,GAAA,EACrB,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,GAAA,EACrB,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,GAAA,EACrB,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,GAAA,EACrB,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,GAAA,EACrB,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,IAAK,GAAA,EAC1B,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,IAAK,GAAA,EAC1B,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,IAAK,GAAA,EAC1B,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,IAAK,GAAA,EAC1B,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,IAAK,GAAA,EAC1B,CAAC,EAAG,GAAI,GAAI,GAAI,IAAK,IAAK,GAAA,CAAA,EAExBC,EAAM,KACNC,EAAM,KAKNC,EAAc,SAASzH,EAAAA,CAEzB,QADI8H,EAAQ,EACL9H,GAAQ,GACb8H,GAAS,EACT9H,KAAU,EAEZ,OAAO8H,CACT,GATIzJ,EAAQ,CAAC,GAWP4B,eAAiB,SAASD,EAAAA,CAE9B,QADI+H,EAAI/H,GAAQ,GACTyH,EAAYM,CAAAA,EAAKN,EAAYF,CAAAA,GAAQ,GAC1CQ,GAAMR,GAAQE,EAAYM,CAAAA,EAAKN,EAAYF,CAAAA,EAE7C,MAlBa,QAkBHvH,GAAQ,GAAM+H,EAC1B,EAEA1J,EAAMuB,iBAAmB,SAASI,EAAAA,CAEhC,QADI+H,EAAI/H,GAAQ,GACTyH,EAAYM,CAAAA,EAAKN,EAAYD,CAAAA,GAAQ,GAC1CO,GAAMP,GAAQC,EAAYM,CAAAA,EAAKN,EAAYD,CAAAA,EAE7C,OAAQxH,GAAQ,GAAM+H,CACxB,EAEA1J,EAAMmB,mBAAqB,SAAS5B,EAAAA,CAClC,OAAO0J,EAAuB1J,EAAa,CAAA,CAC7C,EAEAS,EAAMiC,gBAAkB,SAAS9B,EAAAA,CAE/B,OAAQA,EAAAA,CAER,IAjGW,GAkGT,OAAO,SAASf,EAAGiC,EAAAA,CAAK,OAAQjC,EAAIiC,GAAK,GAAK,CAAG,EACnD,IAlGW,GAmGT,OAAO,SAASjC,EAAGiC,EAAAA,CAAK,OAAOjC,EAAI,GAAK,CAAG,EAC7C,IAnGW,GAoGT,OAAO,SAASA,EAAGiC,EAAAA,CAAK,OAAOA,EAAI,GAAK,CAAG,EAC7C,IApGW,GAqGT,OAAO,SAASjC,EAAGiC,EAAAA,CAAK,OAAQjC,EAAIiC,GAAK,GAAK,CAAG,EACnD,IArGW,GAsGT,OAAO,SAASjC,EAAGiC,EAAAA,CAAK,OAAQI,KAAKC,MAAMtC,EAAI,CAAA,EAAKqC,KAAKC,MAAML,EAAI,CAAA,GAAO,GAAK,CAAG,EACpF,IAtGW,GAuGT,OAAO,SAASjC,EAAGiC,EAAAA,CAAK,OAAQjC,EAAIiC,EAAK,EAAKjC,EAAIiC,EAAK,GAAK,CAAG,EACjE,IAvGW,GAwGT,OAAO,SAASjC,EAAGiC,EAAAA,CAAK,OAAUjC,EAAIiC,EAAK,EAAKjC,EAAIiC,EAAK,GAAK,GAAK,CAAG,EACxE,IAxGW,GAyGT,OAAO,SAASjC,EAAGiC,EAAAA,CAAK,OAAUjC,EAAIiC,EAAK,GAAKjC,EAAIiC,GAAK,GAAK,GAAK,CAAG,EAExE,QACE,KAAM,mBAAqBlB,CAAAA,CAE/B,EAEAH,EAAM4D,0BAA4B,SAAS+F,EAAAA,CAEzC,QADIC,EAAI9F,EAAa,CAAC,CAAA,EAAI,CAAA,EACjB1E,EAAI,EAAGA,EAAIuK,EAAoBvK,GAAK,EAC3CwK,EAAIA,EAAEC,SAAS/F,EAAa,CAAC,EAAGgG,EAAOC,KAAK3K,CAAAA,CAAAA,EAAK,CAAA,CAAA,EAEnD,OAAOwK,CACT,EAEA5J,EAAM4C,gBAAkB,SAASwB,EAAM4F,EAAAA,CAErC,GAAI,GAAKA,GAAQA,EAAO,GAItB,OAAO5F,EAAAA,CACP,IA5Ja,GA4JgB,MAAO,IACpC,IA5Ja,GA4JgB,MAAO,GACpC,IA5Ja,GA6Jb,IA5Ja,GA4JgB,MAAO,GACpC,QACE,KAAM,QAAUA,CAAAA,SAGT4F,EAAO,GAIhB,OAAO5F,EAAAA,CACP,IAzKa,GAyKgB,MAAO,IACpC,IAzKa,GAyKgB,MAAO,IACpC,IAzKa,GAyKgB,MAAO,IACpC,IAzKa,GAyKgB,MAAO,IACpC,QACE,KAAM,QAAUA,CAAAA,KAGb,CAAA,GAAA,EAAI4F,EAAO,IAchB,KAAM,QAAUA,EAVhB,OAAO5F,EAAAA,CACP,IAtLa,GAsLgB,MAAO,IACpC,IAtLa,GAsLgB,MAAO,IACpC,IAtLa,GAsLgB,MAAO,IACpC,IAtLa,GAsLgB,MAAO,IACpC,QACE,KAAM,QAAUA,CAAAA,CAKpB,CACF,EAEApE,EAAMiF,aAAe,SAAS3F,EAAAA,CAQ5B,QANIc,EAAcd,EAAOsF,eAAAA,EAErBI,EAAY,EAIPzE,EAAM,EAAGA,EAAMH,EAAaG,GAAO,EAC1C,QAASC,EAAM,EAAGA,EAAMJ,EAAaI,GAAO,EAAG,CAK7C,QAHIyJ,EAAY,EACZ/H,EAAO5C,EAAOqF,OAAOpE,EAAKC,CAAAA,EAErBnB,EAAAA,GAAQA,GAAK,EAAGA,GAAK,EAE5B,GAAA,EAAIkB,EAAMlB,EAAI,GAAKe,GAAeG,EAAMlB,GAIxC,QAAS2B,EAAAA,GAAQA,GAAK,EAAGA,GAAK,EAExBR,EAAMQ,EAAI,GAAKZ,GAAeI,EAAMQ,GAIpC3B,GAAK,GAAK2B,GAAK,GAIfkB,GAAQ5C,EAAOqF,OAAOpE,EAAMlB,EAAGmB,EAAMQ,CAAAA,IACvCiJ,GAAa,GAKfA,EAAY,IACdjF,GAAc,EAAIiF,EAAY,EAElC,CAKF,IAAS1J,EAAM,EAAGA,EAAMH,EAAc,EAAGG,GAAO,EAC9C,IAASC,EAAM,EAAGA,EAAMJ,EAAc,EAAGI,GAAO,EAAG,CACjD,IAAIkI,EAAQ,EACRpJ,EAAOqF,OAAOpE,EAAKC,CAAAA,IAAOkI,GAAS,GACnCpJ,EAAOqF,OAAOpE,EAAM,EAAGC,CAAAA,IAAOkI,GAAS,GACvCpJ,EAAOqF,OAAOpE,EAAKC,EAAM,CAAA,IAAKkI,GAAS,GACvCpJ,EAAOqF,OAAOpE,EAAM,EAAGC,EAAM,CAAA,IAAKkI,GAAS,GAC3CA,GAAS,GAAKA,GAAS,IACzB1D,GAAa,EAEjB,CAKF,IAASzE,EAAM,EAAGA,EAAMH,EAAaG,GAAO,EAC1C,IAASC,EAAM,EAAGA,EAAMJ,EAAc,EAAGI,GAAO,EAC1ClB,EAAOqF,OAAOpE,EAAKC,CAAAA,GAAAA,CACflB,EAAOqF,OAAOpE,EAAKC,EAAM,CAAA,GACzBlB,EAAOqF,OAAOpE,EAAKC,EAAM,CAAA,GACzBlB,EAAOqF,OAAOpE,EAAKC,EAAM,CAAA,GACzBlB,EAAOqF,OAAOpE,EAAKC,EAAM,CAAA,GAAA,CACzBlB,EAAOqF,OAAOpE,EAAKC,EAAM,CAAA,GACzBlB,EAAOqF,OAAOpE,EAAKC,EAAM,CAAA,IAC/BwE,GAAa,IAKnB,IAASxE,EAAM,EAAGA,EAAMJ,EAAaI,GAAO,EAC1C,IAASD,EAAM,EAAGA,EAAMH,EAAc,EAAGG,GAAO,EAC1CjB,EAAOqF,OAAOpE,EAAKC,CAAAA,GAAAA,CACflB,EAAOqF,OAAOpE,EAAM,EAAGC,CAAAA,GACvBlB,EAAOqF,OAAOpE,EAAM,EAAGC,CAAAA,GACvBlB,EAAOqF,OAAOpE,EAAM,EAAGC,CAAAA,GACvBlB,EAAOqF,OAAOpE,EAAM,EAAGC,CAAAA,GAAAA,CACvBlB,EAAOqF,OAAOpE,EAAM,EAAGC,CAAAA,GACvBlB,EAAOqF,OAAOpE,EAAM,EAAGC,CAAAA,IAC7BwE,GAAa,IAOnB,IAAIkF,GAAY,EAEhB,IAAS1J,EAAM,EAAGA,EAAMJ,EAAaI,GAAO,EAC1C,IAASD,EAAM,EAAGA,EAAMH,EAAaG,GAAO,EACtCjB,EAAOqF,OAAOpE,EAAKC,CAAAA,IACrB0J,IAAa,GAQnB,OAFAlF,EADYvD,KAAK0I,IAAI,IAAMD,GAAY9J,EAAcA,EAAc,EAAA,EAAM,EACpD,EAGvB,EAEOJ,GAOL8J,GAAS,UAAA,CAMX,QAJIM,EAAY,IAAI9J,MAAM,GAAA,EACtB+J,EAAY,IAAI/J,MAAM,GAAA,EAGjBlB,EAAI,EAAGA,EAAI,EAAGA,GAAK,EAC1BgL,EAAUhL,CAAAA,EAAK,GAAKA,EAEtB,IAASA,EAAI,EAAGA,EAAI,IAAKA,GAAK,EAC5BgL,EAAUhL,CAAAA,EAAKgL,EAAUhL,EAAI,CAAA,EACzBgL,EAAUhL,EAAI,CAAA,EACdgL,EAAUhL,EAAI,CAAA,EACdgL,EAAUhL,EAAI,CAAA,EAEpB,IAASA,EAAI,EAAGA,EAAI,IAAKA,GAAK,EAC5BiL,EAAUD,EAAUhL,CAAAA,CAAAA,EAAOA,EA2B7B,MAxBY,CAEZY,KAAa,SAASsK,EAAAA,CAEpB,GAAIA,EAAI,EACN,KAAM,QAAUA,EAAI,IAGtB,OAAOD,EAAUC,CAAAA,CACnB,EAEAtK,KAAa,SAASsK,EAAAA,CAEpB,KAAOA,EAAI,GACTA,GAAK,IAGP,KAAOA,GAAK,KACVA,GAAK,IAGP,OAAOF,EAAUE,CAAAA,CACnB,CAAA,CAGF,GA5Ca,EAkDb,SAASxG,EAAayG,EAAKC,EAAAA,CAEzB,GAAWD,EAAInJ,SAAf,OACE,MAAMmJ,EAAInJ,OAAS,IAAMoJ,EAG3B,IAAIC,GAAO,UAAA,CAET,QADIxH,EAAS,EACNA,EAASsH,EAAInJ,QAAUmJ,EAAItH,CAAAA,GAAW,GAC3CA,GAAU,EAGZ,QADIwH,EAAO,IAAInK,MAAMiK,EAAInJ,OAAS6B,EAASuH,CAAAA,EAClCpL,EAAI,EAAGA,EAAImL,EAAInJ,OAAS6B,EAAQ7D,GAAK,EAC5CqL,EAAKrL,CAAAA,EAAKmL,EAAInL,EAAI6D,CAAAA,EAEpB,OAAOwH,CACT,GAVW,EAYPzK,EAAQ,CAEZA,MAAc,SAASkE,EAAAA,CACrB,OAAOuG,EAAKvG,CAAAA,CACd,EAEAlE,UAAkB,UAAA,CAChB,OAAOyK,EAAKrJ,MACd,EAEApB,SAAiB,SAASb,EAAAA,CAIxB,QAFIoL,EAAM,IAAIjK,MAAMN,EAAM2C,UAAAA,EAAcxD,EAAEwD,UAAAA,EAAc,CAAA,EAE/CvD,EAAI,EAAGA,EAAIY,EAAM2C,UAAAA,EAAavD,GAAK,EAC1C,QAASiC,EAAI,EAAGA,EAAIlC,EAAEwD,UAAAA,EAAatB,GAAK,EACtCkJ,EAAInL,EAAIiC,CAAAA,GAAMyI,EAAOC,KAAKD,EAAOY,KAAK1K,EAAMgE,MAAM5E,CAAAA,CAAAA,EAAO0K,EAAOY,KAAKvL,EAAE6E,MAAM3C,CAAAA,CAAAA,CAAAA,EAIjF,OAAOyC,EAAayG,EAAK,CAAA,CAC3B,EAEAvK,IAAY,SAASb,EAAAA,CAEnB,GAAIa,EAAM2C,UAAAA,EAAcxD,EAAEwD,UAAAA,EAAc,EACtC,OAAO3C,EAMT,QAHI2K,EAAQb,EAAOY,KAAK1K,EAAMgE,MAAM,CAAA,CAAA,EAAO8F,EAAOY,KAAKvL,EAAE6E,MAAM,CAAA,CAAA,EAE3DuG,EAAM,IAAIjK,MAAMN,EAAM2C,UAAAA,CAAAA,EACjBvD,EAAI,EAAGA,EAAIY,EAAM2C,UAAAA,EAAavD,GAAK,EAC1CmL,EAAInL,CAAAA,EAAKY,EAAMgE,MAAM5E,CAAAA,EAGvB,IAASA,EAAI,EAAGA,EAAID,EAAEwD,UAAAA,EAAavD,GAAK,EACtCmL,EAAInL,CAAAA,GAAM0K,EAAOC,KAAKD,EAAOY,KAAKvL,EAAE6E,MAAM5E,CAAAA,CAAAA,EAAOuL,CAAAA,EAInD,OAAO7G,EAAayG,EAAK,CAAA,EAAG/I,IAAIrC,CAAAA,CAClC,CAAA,EAEA,OAAOa,CACT,CAMA,IAAIqC,GAAY,UAAA,CAEd,IAAIuI,EAAiB,CAQnB,CAAC,EAAG,GAAI,EAAA,EACR,CAAC,EAAG,GAAI,EAAA,EACR,CAAC,EAAG,GAAI,EAAA,EACR,CAAC,EAAG,GAAI,CAAA,EAGR,CAAC,EAAG,GAAI,EAAA,EACR,CAAC,EAAG,GAAI,EAAA,EACR,CAAC,EAAG,GAAI,EAAA,EACR,CAAC,EAAG,GAAI,EAAA,EAGR,CAAC,EAAG,GAAI,EAAA,EACR,CAAC,EAAG,GAAI,EAAA,EACR,CAAC,EAAG,GAAI,EAAA,EACR,CAAC,EAAG,GAAI,EAAA,EAGR,CAAC,EAAG,IAAK,EAAA,EACT,CAAC,EAAG,GAAI,EAAA,EACR,CAAC,EAAG,GAAI,EAAA,EACR,CAAC,EAAG,GAAI,CAAA,EAGR,CAAC,EAAG,IAAK,GAAA,EACT,CAAC,EAAG,GAAI,EAAA,EACR,CAAC,EAAG,GAAI,GAAI,EAAG,GAAI,EAAA,EACnB,CAAC,EAAG,GAAI,GAAI,EAAG,GAAI,EAAA,EAGnB,CAAC,EAAG,GAAI,EAAA,EACR,CAAC,EAAG,GAAI,EAAA,EACR,CAAC,EAAG,GAAI,EAAA,EACR,CAAC,EAAG,GAAI,EAAA,EAGR,CAAC,EAAG,GAAI,EAAA,EACR,CAAC,EAAG,GAAI,EAAA,EACR,CAAC,EAAG,GAAI,GAAI,EAAG,GAAI,EAAA,EACnB,CAAC,EAAG,GAAI,GAAI,EAAG,GAAI,EAAA,EAGnB,CAAC,EAAG,IAAK,EAAA,EACT,CAAC,EAAG,GAAI,GAAI,EAAG,GAAI,EAAA,EACnB,CAAC,EAAG,GAAI,GAAI,EAAG,GAAI,EAAA,EACnB,CAAC,EAAG,GAAI,GAAI,EAAG,GAAI,EAAA,EAGnB,CAAC,EAAG,IAAK,GAAA,EACT,CAAC,EAAG,GAAI,GAAI,EAAG,GAAI,EAAA,EACnB,CAAC,EAAG,GAAI,GAAI,EAAG,GAAI,EAAA,EACnB,CAAC,EAAG,GAAI,GAAI,EAAG,GAAI,EAAA,EAGnB,CAAC,EAAG,GAAI,GAAI,EAAG,GAAI,EAAA,EACnB,CAAC,EAAG,GAAI,GAAI,EAAG,GAAI,EAAA,EACnB,CAAC,EAAG,GAAI,GAAI,EAAG,GAAI,EAAA,EACnB,CAAC,EAAG,GAAI,GAAI,EAAG,GAAI,EAAA,EAGnB,CAAC,EAAG,IAAK,EAAA,EACT,CAAC,EAAG,GAAI,GAAI,EAAG,GAAI,EAAA,EACnB,CAAC,EAAG,GAAI,GAAI,EAAG,GAAI,EAAA,EACnB,CAAC,EAAG,GAAI,GAAI,EAAG,GAAI,EAAA,EAGnB,CAAC,EAAG,IAAK,GAAI,EAAG,IAAK,EAAA,EACrB,CAAC,EAAG,GAAI,GAAI,EAAG,GAAI,EAAA,EACnB,CAAC,EAAG,GAAI,GAAI,EAAG,GAAI,EAAA,EACnB,CAAC,EAAG,GAAI,GAAI,EAAG,GAAI,EAAA,EAGnB,CAAC,EAAG,IAAK,GAAA,EACT,CAAC,EAAG,GAAI,GAAI,EAAG,GAAI,EAAA,EACnB,CAAC,EAAG,GAAI,GAAI,EAAG,GAAI,EAAA,EACnB,CAAC,GAAI,GAAI,GAAI,EAAG,GAAI,EAAA,EAGpB,CAAC,EAAG,IAAK,IAAK,EAAG,IAAK,GAAA,EACtB,CAAC,EAAG,GAAI,GAAI,EAAG,GAAI,EAAA,EACnB,CAAC,GAAI,GAAI,GAAI,EAAG,GAAI,EAAA,EACpB,CAAC,GAAI,GAAI,GAAI,EAAG,GAAI,EAAA,EAGpB,CAAC,EAAG,IAAK,GAAI,EAAG,IAAK,EAAA,EACrB,CAAC,EAAG,GAAI,GAAI,EAAG,GAAI,EAAA,EACnB,CAAC,EAAG,GAAI,GAAI,EAAG,GAAI,EAAA,EACnB,CAAC,GAAI,GAAI,GAAI,EAAG,GAAI,EAAA,EAGpB,CAAC,EAAG,IAAK,GAAI,EAAG,IAAK,EAAA,EACrB,CAAC,EAAG,GAAI,GAAI,EAAG,GAAI,EAAA,EACnB,CAAC,GAAI,GAAI,GAAI,EAAG,GAAI,EAAA,EACpB,CAAC,EAAG,GAAI,GAAI,GAAI,GAAI,EAAA,EAGpB,CAAC,EAAG,IAAK,IAAK,EAAG,IAAK,GAAA,EACtB,CAAC,GAAI,GAAI,GAAI,EAAG,GAAI,EAAA,EACpB,CAAC,EAAG,GAAI,GAAI,GAAI,GAAI,EAAA,EACpB,CAAC,EAAG,GAAI,GAAI,GAAI,GAAI,EAAA,EAGpB,CAAC,EAAG,IAAK,IAAK,EAAG,IAAK,GAAA,EACtB,CAAC,EAAG,GAAI,GAAI,EAAG,GAAI,EAAA,EACnB,CAAC,GAAI,GAAI,GAAI,EAAG,GAAI,EAAA,EACpB,CAAC,EAAG,GAAI,GAAI,GAAI,GAAI,EAAA,EAGpB,CAAC,EAAG,IAAK,IAAK,EAAG,IAAK,GAAA,EACtB,CAAC,EAAG,GAAI,GAAI,GAAI,GAAI,EAAA,EACpB,CAAC,GAAI,GAAI,GAAI,EAAG,GAAI,EAAA,EACpB,CAAC,EAAG,GAAI,GAAI,GAAI,GAAI,EAAA,EAGpB,CAAC,EAAG,IAAK,IAAK,EAAG,IAAK,GAAA,EACtB,CAAC,EAAG,GAAI,GAAI,GAAI,GAAI,EAAA,EACpB,CAAC,GAAI,GAAI,GAAI,EAAG,GAAI,EAAA,EACpB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EAGrB,CAAC,EAAG,IAAK,IAAK,EAAG,IAAK,GAAA,EACtB,CAAC,GAAI,GAAI,EAAA,EACT,CAAC,GAAI,GAAI,GAAI,EAAG,GAAI,EAAA,EACpB,CAAC,GAAI,GAAI,GAAI,EAAG,GAAI,EAAA,EAGpB,CAAC,EAAG,IAAK,IAAK,EAAG,IAAK,GAAA,EACtB,CAAC,GAAI,GAAI,EAAA,EACT,CAAC,EAAG,GAAI,GAAI,GAAI,GAAI,EAAA,EACpB,CAAC,GAAI,GAAI,EAAA,EAGT,CAAC,EAAG,IAAK,IAAK,EAAG,IAAK,GAAA,EACtB,CAAC,EAAG,GAAI,GAAI,GAAI,GAAI,EAAA,EACpB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EACrB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EAGrB,CAAC,EAAG,IAAK,IAAK,EAAG,IAAK,GAAA,EACtB,CAAC,EAAG,GAAI,GAAI,GAAI,GAAI,EAAA,EACpB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EACrB,CAAC,GAAI,GAAI,GAAI,EAAG,GAAI,EAAA,EAGpB,CAAC,EAAG,IAAK,IAAK,EAAG,IAAK,GAAA,EACtB,CAAC,EAAG,GAAI,GAAI,GAAI,GAAI,EAAA,EACpB,CAAC,EAAG,GAAI,GAAI,GAAI,GAAI,EAAA,EACpB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EAGrB,CAAC,GAAI,IAAK,IAAK,EAAG,IAAK,GAAA,EACvB,CAAC,GAAI,GAAI,GAAI,EAAG,GAAI,EAAA,EACpB,CAAC,GAAI,GAAI,GAAI,EAAG,GAAI,EAAA,EACpB,CAAC,GAAI,GAAI,GAAI,EAAG,GAAI,EAAA,EAGpB,CAAC,EAAG,IAAK,IAAK,EAAG,IAAK,GAAA,EACtB,CAAC,GAAI,GAAI,GAAI,EAAG,GAAI,EAAA,EACpB,CAAC,EAAG,GAAI,GAAI,GAAI,GAAI,EAAA,EACpB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EAGrB,CAAC,EAAG,IAAK,IAAK,GAAI,IAAK,GAAA,EACvB,CAAC,EAAG,GAAI,GAAI,GAAI,GAAI,EAAA,EACpB,CAAC,EAAG,GAAI,GAAI,GAAI,GAAI,EAAA,EACpB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EAGrB,CAAC,EAAG,IAAK,IAAK,EAAG,IAAK,GAAA,EACtB,CAAC,GAAI,GAAI,GAAI,EAAG,GAAI,EAAA,EACpB,CAAC,EAAG,GAAI,GAAI,GAAI,GAAI,EAAA,EACpB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EAGrB,CAAC,EAAG,IAAK,IAAK,GAAI,IAAK,GAAA,EACvB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EACrB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EACrB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EAGrB,CAAC,GAAI,IAAK,IAAK,EAAG,IAAK,GAAA,EACvB,CAAC,EAAG,GAAI,GAAI,GAAI,GAAI,EAAA,EACpB,CAAC,GAAI,GAAI,GAAI,EAAG,GAAI,EAAA,EACpB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EAGrB,CAAC,GAAI,IAAK,GAAA,EACV,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EACrB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EACrB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EAGrB,CAAC,GAAI,IAAK,IAAK,EAAG,IAAK,GAAA,EACvB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EACrB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EACrB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EAGrB,CAAC,GAAI,IAAK,IAAK,EAAG,IAAK,GAAA,EACvB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EACrB,CAAC,GAAI,GAAI,GAAI,EAAG,GAAI,EAAA,EACpB,CAAC,GAAI,GAAI,GAAI,EAAG,GAAI,EAAA,EAGpB,CAAC,GAAI,IAAK,IAAK,EAAG,IAAK,GAAA,EACvB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EACrB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EACrB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EAGrB,CAAC,EAAG,IAAK,IAAK,GAAI,IAAK,GAAA,EACvB,CAAC,EAAG,GAAI,GAAI,GAAI,GAAI,EAAA,EACpB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EACrB,CAAC,EAAG,GAAI,GAAI,GAAI,GAAI,EAAA,EAGpB,CAAC,GAAI,IAAK,IAAK,EAAG,IAAK,GAAA,EACvB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EACrB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EACrB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EAGrB,CAAC,EAAG,IAAK,IAAK,GAAI,IAAK,GAAA,EACvB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EACrB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EACrB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EAGrB,CAAC,GAAI,IAAK,IAAK,EAAG,IAAK,GAAA,EACvB,CAAC,GAAI,GAAI,GAAI,EAAG,GAAI,EAAA,EACpB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EACrB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EAGrB,CAAC,GAAI,IAAK,IAAK,EAAG,IAAK,GAAA,EACvB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EACrB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,EACrB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,EAAA,CAAA,EAGnBC,EAAY,SAASrH,EAAYT,EAAAA,CACnC,IAAI/C,EAAQ,CAAC,EAGb,OAFAA,EAAMwD,WAAaA,EACnBxD,EAAM+C,UAAYA,EACX/C,CACT,EAEIA,EAAQ,CAkBZA,YAAoB,SAAST,EAAYC,EAAAA,CAEvC,IAAIsL,GAlBgB,SAASvL,GAAYC,EAAAA,CAEzC,OAAOA,EAAAA,CACP,KAAKG,EAAuB0J,EAC1B,OAAOuB,EAAkC,GAAlBrL,GAAa,GAAS,CAAA,EAC/C,KAAKI,EAAuB2J,EAC1B,OAAOsB,EAAkC,GAAlBrL,GAAa,GAAS,CAAA,EAC/C,KAAKI,EAAuB4J,EAC1B,OAAOqB,EAAkC,GAAlBrL,GAAa,GAAS,CAAA,EAC/C,KAAKI,EAAuB6J,EAC1B,OAAOoB,EAAkC,GAAlBrL,GAAa,GAAS,CAAA,EAC/C,QACE,MAAA,CAEJ,GAIgCA,EAAYC,CAAAA,EAE1C,GAAWsL,IAAX,OACE,KAAM,6BAA+BvL,EACjC,yBAA2BC,EAOjC,QAJI4B,EAAS0J,EAAQ1J,OAAS,EAE1B2J,EAAO,CAAA,EAEF3L,EAAI,EAAGA,EAAIgC,EAAQhC,GAAK,EAM/B,QAJIsJ,EAAQoC,EAAY,EAAJ1L,EAAQ,CAAA,EACxBoE,GAAasH,EAAY,EAAJ1L,EAAQ,CAAA,EAC7B2D,GAAY+H,EAAY,EAAJ1L,EAAQ,CAAA,EAEvBiC,GAAI,EAAGA,GAAIqH,EAAOrH,IAAK,EAC9B0J,EAAKrG,KAAKmG,EAAUrH,GAAYT,EAAAA,CAAAA,EAIpC,OAAOgI,CACT,CAAA,EAEA,OAAO/K,CACT,GA/SgB,EAqTZwC,EAAc,UAAA,CAEhB,IAAIwI,EAAU,CAAA,EACVC,EAAU,EAEVjL,EAAQ,CAEZA,UAAkB,UAAA,CAChB,OAAOgL,CACT,EAEAhL,MAAc,SAASkE,EAAAA,CACrB,IAAIgH,EAAWzJ,KAAKC,MAAMwC,EAAQ,CAAA,EAClC,OAAU8G,EAAQE,CAAAA,IAAe,EAAIhH,EAAQ,EAAO,IAAM,CAC5D,EAEAlE,IAAY,SAASuK,EAAKnJ,EAAAA,CACxB,QAAShC,EAAI,EAAGA,EAAIgC,EAAQhC,GAAK,EAC/BY,EAAMgD,QAAWuH,IAASnJ,EAAShC,EAAI,EAAO,IAAM,CAAN,CAElD,EAEAY,gBAAwB,UAAA,CACtB,OAAOiL,CACT,EAEAjL,OAAe,SAASmL,EAAAA,CAEtB,IAAID,EAAWzJ,KAAKC,MAAMuJ,EAAU,CAAA,EAChCD,EAAQ5J,QAAU8J,GACpBF,EAAQtG,KAAK,CAAA,EAGXyG,IACFH,EAAQE,CAAAA,GAAc,MAAUD,EAAU,GAG5CA,GAAW,CACb,CAAA,EAEA,OAAOjL,CACT,EAMIsE,EAAW,SAAS3C,EAAAA,CAEtB,IACIyJ,EAAQzJ,EAER3B,EAAQ,CAEZA,QAAgB,UAAA,CACd,MAtxBe,EAuxBjB,EAEAA,UAAkB,SAASuC,EAAAA,CACzB,OAAO6I,EAAMhK,MACf,EAEApB,MAAc,SAASuC,EAAAA,CAMrB,QAJIZ,EAAOyJ,EAEPhM,EAAI,EAEDA,EAAI,EAAIuC,EAAKP,QAClBmB,EAAOE,IAAI4I,EAAS1J,EAAK2F,UAAUlI,EAAGA,EAAI,CAAA,CAAA,EAAM,EAAA,EAChDA,GAAK,EAGHA,EAAIuC,EAAKP,SACPO,EAAKP,OAAShC,GAAK,EACrBmD,EAAOE,IAAI4I,EAAS1J,EAAK2F,UAAUlI,EAAGA,EAAI,CAAA,CAAA,EAAM,CAAA,EACvCuC,EAAKP,OAAShC,GAAK,GAC5BmD,EAAOE,IAAI4I,EAAS1J,EAAK2F,UAAUlI,EAAGA,EAAI,CAAA,CAAA,EAAM,CAAA,EAGtD,CAAA,EAEIiM,EAAW,SAASzE,EAAAA,CAEtB,QADI2D,EAAM,EACDnL,EAAI,EAAGA,EAAIwH,EAAExF,OAAQhC,GAAK,EACjCmL,EAAY,GAANA,EAAWe,EAAU1E,EAAEE,OAAO1H,CAAAA,CAAAA,EAEtC,OAAOmL,CACT,EAEIe,EAAY,SAAStK,EAAAA,CACvB,GAAI,KAAOA,GAAKA,GAAK,IACnB,OAAOA,EAAEiH,WAAW,CAAA,EAAK,GAE3B,KAAM,iBAAmBjH,CAC3B,EAEA,OAAOhB,CACT,EAMIuE,EAAa,SAAS5C,EAAAA,CAExB,IACIyJ,EAAQzJ,EAER3B,EAAQ,CAEZA,QAAgB,UAAA,CACd,MA90Be,EA+0BjB,EAEAA,UAAkB,SAASuC,EAAAA,CACzB,OAAO6I,EAAMhK,MACf,EAEApB,MAAc,SAASuC,EAAAA,CAMrB,QAJIqE,EAAIwE,EAEJhM,EAAI,EAEDA,EAAI,EAAIwH,EAAExF,QACfmB,EAAOE,IACmB,GAAxB8I,EAAQ3E,EAAEE,OAAO1H,CAAAA,CAAAA,EACjBmM,EAAQ3E,EAAEE,OAAO1H,EAAI,CAAA,CAAA,EAAM,EAAA,EAC7BA,GAAK,EAGHA,EAAIwH,EAAExF,QACRmB,EAAOE,IAAI8I,EAAQ3E,EAAEE,OAAO1H,CAAAA,CAAAA,EAAM,CAAA,CAEtC,CAAA,EAEImM,EAAU,SAASvK,EAAAA,CAErB,GAAI,KAAOA,GAAKA,GAAK,IACnB,OAAOA,EAAEiH,WAAW,CAAA,EAAK,GACpB,GAAI,KAAOjH,GAAKA,GAAK,IAC1B,OAAOA,EAAEiH,WAAW,CAAA,EAAK,GAAoB,GAE7C,OAAQjH,EAAAA,CACR,IAAK,IAAM,MAAO,IAClB,IAAK,IAAM,MAAO,IAClB,IAAK,IAAM,MAAO,IAClB,IAAK,IAAM,MAAO,IAClB,IAAK,IAAM,MAAO,IAClB,IAAK,IAAM,MAAO,IAClB,IAAK,IAAM,MAAO,IAClB,IAAK,IAAM,MAAO,IAClB,IAAK,IAAM,MAAO,IAClB,QACE,KAAM,iBAAmBA,CAAAA,CAG/B,EAEA,OAAOhB,CACT,EAMIwE,EAAa,SAAS7C,EAAAA,CAExB,IAEI6J,EAASlM,EAAOwI,cAAcnG,CAAAA,EAkBlC,MAhBY,CAEZ3B,QAAgB,UAAA,CACd,MA74Be,EA84BjB,EAEAA,UAAkB,SAASuC,EAAAA,CACzB,OAAOiJ,EAAOpK,MAChB,EAEApB,MAAc,SAASuC,EAAAA,CACrB,QAASnD,EAAI,EAAGA,EAAIoM,EAAOpK,OAAQhC,GAAK,EACtCmD,EAAOE,IAAI+I,EAAOpM,CAAAA,EAAI,CAAA,CAE1B,CAAA,CAGF,EAMIqF,EAAU,SAAS9C,EAAAA,CAErB,IAGImG,EAAgBxI,EAAOyI,mBAAyB,KACpD,GAAA,CAAKD,EACH,KAAM,uBAEP,UAAA,CAEC,IAAI5H,EAAO4H,EAIX,QAAA,EAHA,GAAI5H,EAAKkB,QAAU,IAAQlB,EAAK,CAAA,GAAM,EAAKA,EAAK,CAAA,IAGtC,MAFR,KAAM,qBAEV,GANC,EAQD,IAAIsL,EAAS1D,EAAcnG,CAAAA,EAEvB3B,EAAQ,CAEZA,QAAgB,UAAA,CACd,MAt7Be,EAu7BjB,EAEAA,UAAkB,SAASuC,EAAAA,CACzB,MAAA,CAAA,EAAUiJ,EAAOpK,OAAS,EAC5B,EAEApB,MAAc,SAASuC,EAAAA,CAMrB,QAJIZ,EAAO6J,EAEPpM,EAAI,EAEDA,EAAI,EAAIuC,EAAKP,QAAQ,CAE1B,IAAIJ,GAAO,IAAOW,EAAKvC,CAAAA,IAAO,EAAM,IAAOuC,EAAKvC,EAAI,CAAA,EAEpD,GAAI,OAAU4B,GAAKA,GAAK,MACtBA,GAAK,UACA,CAAA,GAAA,EAAI,OAAUA,GAAKA,GAAK,OAG7B,KAAM,oBAAsB5B,EAAI,GAAK,IAAM4B,EAF3CA,GAAK,KAGP,CAEAA,EAA0B,KAAnBA,IAAM,EAAK,MAAoB,IAAJA,GAElCuB,EAAOE,IAAIzB,EAAG,EAAA,EAEd5B,GAAK,CACP,CAEA,GAAIA,EAAIuC,EAAKP,OACX,KAAM,oBAAsBhC,EAAI,EAEpC,CAAA,EAEA,OAAOY,CACT,EAUIyL,EAAwB,UAAA,CAE1B,IAAID,EAAS,CAAA,EAETxL,EAAQ,CAEZA,UAAkB,SAASyI,EAAAA,CACzB+C,EAAO9G,KAAS,IAAJ+D,CAAAA,CACd,EAEAzI,WAAmB,SAASZ,EAAAA,CAC1BY,EAAM0L,UAAUtM,CAAAA,EAChBY,EAAM0L,UAAUtM,IAAM,CAAA,CACxB,EAEAY,WAAmB,SAASyI,EAAGkD,EAAKC,EAAAA,CAClCD,EAAMA,GAAO,EACbC,EAAMA,GAAOnD,EAAErH,OACf,QAAShC,EAAI,EAAGA,EAAIwM,EAAKxM,GAAK,EAC5BY,EAAM0L,UAAUjD,EAAErJ,EAAIuM,CAAAA,CAAAA,CAE1B,EAEA3L,YAAoB,SAAS4G,EAAAA,CAC3B,QAASxH,EAAI,EAAGA,EAAIwH,EAAExF,OAAQhC,GAAK,EACjCY,EAAM0L,UAAU9E,EAAEqB,WAAW7I,CAAAA,CAAAA,CAEjC,EAEAY,YAAoB,UAAA,CAClB,OAAOwL,CACT,EAEAxL,SAAiB,UAAA,CACf,IAAI4G,EAAI,GACRA,GAAK,IACL,QAASxH,EAAI,EAAGA,EAAIoM,EAAOpK,OAAQhC,GAAK,EAClCA,EAAI,IACNwH,GAAK,KAEPA,GAAK4E,EAAOpM,CAAAA,EAGd,OADAwH,EAAK,GAEP,CAAA,EAEA,OAAO5G,CACT,EA4EIuI,EAA0B,SAASsD,EAAAA,CAErC,IAAIC,EAAOD,EACPE,EAAO,EACPf,EAAU,EACVgB,EAAU,EAEVhM,EAAQ,CAEZA,KAAa,UAAA,CAEX,KAAOgM,EAAU,GAAG,CAElB,GAAID,GAAQD,EAAK1K,OAAQ,CACvB,GAAI4K,GAAW,EACb,MAAA,GAEF,KAAM,2BAA6BA,CACrC,CAEA,IAAIhL,EAAI8K,EAAKhF,OAAOiF,CAAAA,EAGpB,GAFAA,GAAQ,EAEJ/K,GAAK,IAEP,OADAgL,EAAU,EAAA,GAEDhL,EAAEiL,MAAM,MAAA,IAKnBjB,EAAWA,GAAW,EAAKkB,EAAOlL,EAAEiH,WAAW,CAAA,CAAA,EAC/C+D,GAAW,EACb,CAEA,IAAI1B,EAAKU,IAAagB,EAAU,EAAO,IAEvC,OADAA,GAAW,EACJ1B,CACT,CAAA,EAEI4B,EAAS,SAASlL,EAAAA,CACpB,GAAI,IAAQA,GAAKA,GAAK,GACpB,OAAOA,EAAI,GACN,GAAI,IAAQA,GAAKA,GAAK,IAC3B,OAAOA,EAAI,GAAO,GACb,GAAI,IAAQA,GAAKA,GAAK,GAC3B,OAAOA,EAAI,GAAO,GACb,GAAIA,GAAK,GACd,MAAO,IACF,GAAIA,GAAK,GACd,MAAO,IAEP,KAAM,KAAOA,CAEjB,EAEA,OAAOhB,CACT,EAwNIsG,EAAgB,SAAS6F,EAAOC,EAAQC,EAAAA,CAE1C,QADIC,GAnNS,SAASH,GAAOC,GAAAA,CAE7B,IAAIG,GAASJ,GACTK,GAAUJ,GACVhB,EAAQ,IAAI9K,MAAM6L,GAAQC,EAAAA,EAE1BpM,GAAQ,CAEZA,SAAiB,SAASwG,GAAGC,GAAGgG,GAAAA,CAC9BrB,EAAM3E,GAAI8F,GAAS/F,EAAAA,EAAKiG,EAC1B,EAEAzM,MAAc,SAAS0M,GAAAA,CAKrBA,GAAIC,YAAY,QAAA,EAKhBD,GAAIE,WAAWL,EAAAA,EACfG,GAAIE,WAAWJ,EAAAA,EAEfE,GAAIhB,UAAU,GAAA,EACdgB,GAAIhB,UAAU,CAAA,EACdgB,GAAIhB,UAAU,CAAA,EAMdgB,GAAIhB,UAAU,CAAA,EACdgB,GAAIhB,UAAU,CAAA,EACdgB,GAAIhB,UAAU,CAAA,EAGdgB,GAAIhB,UAAU,GAAA,EACdgB,GAAIhB,UAAU,GAAA,EACdgB,GAAIhB,UAAU,GAAA,EAKdgB,GAAIC,YAAY,GAAA,EAChBD,GAAIE,WAAW,CAAA,EACfF,GAAIE,WAAW,CAAA,EACfF,GAAIE,WAAWL,EAAAA,EACfG,GAAIE,WAAWJ,EAAAA,EACfE,GAAIhB,UAAU,CAAA,EAQd,IACImB,GAASC,GADQ,CAAA,EAGrBJ,GAAIhB,UAHiB,CAAA,EAOrB,QAFIzI,GAAS,EAEN4J,GAAOzL,OAAS6B,GAAS,KAC9ByJ,GAAIhB,UAAU,GAAA,EACdgB,GAAIK,WAAWF,GAAQ5J,GAAQ,GAAA,EAC/BA,IAAU,IAGZyJ,GAAIhB,UAAUmB,GAAOzL,OAAS6B,EAAAA,EAC9ByJ,GAAIK,WAAWF,GAAQ5J,GAAQ4J,GAAOzL,OAAS6B,EAAAA,EAC/CyJ,GAAIhB,UAAU,CAAA,EAIdgB,GAAIC,YAAY,GAAA,CAClB,CAAA,EAqCIG,GAAe,SAASE,GAAAA,CAS1B,QAPIC,GAAY,GAAKD,GACjBE,GAAkC,GAAvB,GAAKF,IAChBG,GAAYH,GAAiB,EAG7BI,GAAQC,GAAAA,EAEHjO,GAAI,EAAGA,GAAI6N,GAAW7N,IAAK,EAClCgO,GAAME,IAAIxE,OAAOC,aAAa3J,EAAAA,CAAAA,EAEhCgO,GAAME,IAAIxE,OAAOC,aAAakE,EAAAA,CAAAA,EAC9BG,GAAME,IAAIxE,OAAOC,aAAamE,EAAAA,CAAAA,EAE9B,IAhDIK,GACAC,GACAC,GA8CAC,GAAUjC,EAAAA,EACVkC,IAjDAJ,GAiDyBG,GAhDzBF,GAAa,EACbC,GAAa,EAEL,CAEZzN,MAAc,SAAS2B,EAAMP,GAAAA,CAE3B,GAAMO,IAASP,GACb,KAAM,cAGR,KAAOoM,GAAapM,IAAU,GAC5BmM,GAAK7B,UAAU,KAAU/J,GAAQ6L,GAAcC,GAAAA,EAC/CrM,IAAW,EAAIoM,GACf7L,KAAW,EAAI6L,GACfC,GAAa,EACbD,GAAa,EAGfC,IAAc9L,GAAQ6L,GACtBA,IAA0BpM,EAC5B,EAEApB,MAAc,UAAA,CACRwN,GAAa,GACfD,GAAK7B,UAAU+B,EAAAA,CAEnB,CAAA,GAwBAE,GAAO9K,MAAMoK,GAAWE,EAAAA,EAExB,IAAIS,GAAY,EAEZhH,GAAIkC,OAAOC,aAAaqC,EAAMwC,EAAAA,CAAAA,EAGlC,IAFAA,IAAa,EAENA,GAAYxC,EAAMhK,QAAQ,CAE/B,IAAIJ,EAAI8H,OAAOC,aAAaqC,EAAMwC,EAAAA,CAAAA,EAClCA,IAAa,EAETR,GAAMS,SAASjH,GAAI5F,CAAAA,EAErB4F,IAAQ5F,GAIR2M,GAAO9K,MAAMuK,GAAMU,QAAQlH,EAAAA,EAAIuG,EAAAA,EAE3BC,GAAMpH,KAAAA,EAAS,OAEboH,GAAMpH,KAAAA,GAAW,GAAKmH,KACxBA,IAAa,GAGfC,GAAME,IAAI1G,GAAI5F,CAAAA,GAGhB4F,GAAI5F,EAER,CASA,OAPA2M,GAAO9K,MAAMuK,GAAMU,QAAQlH,EAAAA,EAAIuG,EAAAA,EAG/BQ,GAAO9K,MAAMqK,GAASC,EAAAA,EAEtBQ,GAAOI,MAAAA,EAEAL,GAAQM,YAAAA,CACjB,EAEIX,GAAW,UAAA,CAEb,IAAIY,GAAO,CAAC,EACRC,GAAQ,EAERlO,GAAQ,CAEZA,IAAY,SAASmO,GAAAA,CACnB,GAAInO,GAAM6N,SAASM,EAAAA,EACjB,KAAM,WAAaA,GAErBF,GAAKE,EAAAA,EAAOD,GACZA,IAAS,CACX,EAEAlO,KAAa,UAAA,CACX,OAAOkO,EACT,EAEAlO,QAAgB,SAASmO,GAAAA,CACvB,OAAOF,GAAKE,EAAAA,CACd,EAEAnO,SAAiB,SAASmO,GAAAA,CACxB,OAAcF,GAAKE,EAAAA,IAAnB,MACF,CAAA,EAEA,OAAOnO,EACT,EAEA,OAAOA,EACT,GAGqBmM,EAAOC,CAAAA,EACjB3F,EAAI,EAAGA,EAAI2F,EAAQ3F,GAAK,EAC/B,QAASD,EAAI,EAAGA,EAAI2F,EAAO3F,GAAK,EAC9B8F,EAAI8B,SAAS5H,EAAGC,EAAG4F,EAAS7F,EAAGC,CAAAA,CAAAA,EAInC,IAAIgC,EAAIgD,EAAAA,EACRa,EAAIzJ,MAAM4F,CAAAA,EAIV,QAFI4F,GAlWyB,UAAA,CAE7B,IAAIrD,GAAU,EACVgB,GAAU,EACVf,GAAU,EACVqD,GAAU,GAEVtO,EAAQ,CAAC,EAETuO,GAAe,SAAS9F,GAAAA,CAC1B6F,IAAWxF,OAAOC,aAAayF,GAAW,GAAJ/F,EAAAA,CAAAA,CACxC,EAEI+F,GAAS,SAASlE,GAAAA,CACpB,GAAIA,EAAAA,GAAI,GAED,CAAA,GAAIA,GAAI,GACb,MAAO,IAAOA,GACT,GAAIA,GAAI,GACb,OAAeA,GAAI,GAAZ,GACF,GAAIA,GAAI,GACb,OAAeA,GAAI,GAAZ,GACF,GAAIA,IAAK,GACd,MAAO,IACF,GAAIA,IAAK,GACd,MAAO,GACT,CACA,KAAM,KAAOA,EACf,EAmCA,OAjCAtK,EAAM0L,UAAY,SAASpB,GAAAA,CAMzB,IAJAU,GAAWA,IAAW,EAAU,IAAJV,GAC5B0B,IAAW,EACXf,IAAW,EAEJe,IAAW,GAChBuC,GAAavD,KAAagB,GAAU,CAAA,EACpCA,IAAW,CAEf,EAEAhM,EAAM+N,MAAQ,UAAA,CAQZ,GANI/B,GAAU,IACZuC,GAAavD,IAAY,EAAIgB,EAAAA,EAC7BhB,GAAU,EACVgB,GAAU,GAGRf,GAAU,GAAK,EAGjB,QADIwD,GAAS,EAAIxD,GAAU,EAClB7L,GAAI,EAAGA,GAAIqP,GAAQrP,IAAK,EAC/BkP,IAAW,GAGjB,EAEAtO,EAAM0O,SAAW,UAAA,CACf,OAAOJ,EACT,EAEOtO,CACT,GAkSe2O,EACT3G,EAAQS,EAAEuF,YAAAA,EACL5O,EAAI,EAAGA,EAAI4I,EAAM5G,OAAQhC,GAAK,EACrCiP,EAAO3C,UAAU1D,EAAM5I,CAAAA,CAAAA,EAIzB,OAFAiP,EAAON,MAAAA,EAEA,yBAA2BM,CACpC,EAKA,OAAO/O,CACT,GArrEa,EA0rEXA,EAAOyI,mBAAmB,OAAA,EAAW,SAASnB,EAAAA,CAgC5C,OA9BA,SAAqBiF,EAAAA,CAEnB,QADI+C,EAAO,CAAA,EACFxP,EAAE,EAAGA,EAAIyM,EAAIzK,OAAQhC,IAAK,CACjC,IAAIyP,EAAWhD,EAAI5D,WAAW7I,CAAAA,EAC1ByP,EAAW,IAAMD,EAAKlK,KAAKmK,CAAAA,EACtBA,EAAW,KAClBD,EAAKlK,KAAK,IAAQmK,GAAY,EAC1B,IAAmB,GAAXA,CAAAA,EAELA,EAAW,OAAUA,GAAY,MACxCD,EAAKlK,KAAK,IAAQmK,GAAY,GAC1B,IAASA,GAAU,EAAK,GACxB,IAAmB,GAAXA,CAAAA,GAIZzP,IAIAyP,EAAW,QAAwB,KAAXA,IAAmB,GAClB,KAApBhD,EAAI5D,WAAW7I,CAAAA,GACpBwP,EAAKlK,KAAK,IAAQmK,GAAW,GACzB,IAASA,GAAU,GAAM,GACzB,IAASA,GAAU,EAAK,GACxB,IAAmB,GAAXA,CAAAA,EAEhB,CACA,OAAOD,CACT,GACmBhI,CAAAA,CACrB,GAMsBvH,EAAA,OAAPD,EAIf,UAAA,CACE,OAAOE,CACX,IANwB,WAAAF,EAAA,MAAAD,EAAX,CAAA,CAAA,EAAWC,KANtB,SAMsBF,EAAA,QAAAG,EAAA,CAAA,ECjvEpByP,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,EAAAA,CAE5B,IAAIC,EAAeH,EAAyBE,CAAAA,EAC5C,GAAIC,IAAJ,OACC,OAAOA,EAAapQ,QAGrB,IAAIC,EAASgQ,EAAyBE,CAAAA,EAAY,CAGjDnQ,QAAS,CAAC,CAAA,EAOX,OAHAqQ,EAAoBF,CAAAA,EAAUlQ,EAAQA,EAAOD,QAASkQ,CAAAA,EAG/CjQ,EAAOD,OACf,CCrBAkQ,EAAoBzE,EAAKxL,GAAAA,CACxB,IAAIqQ,EAASrQ,GAAUA,EAAOsQ,WAC7B,IAAOtQ,EAAiB,QACxB,IAAMI,EAEP,OADA6P,EAAoBrF,EAAEyF,EAAQ,CAAEvF,EAAGuF,CAAAA,CAAAA,EAC5BA,CAAM,ECLdJ,EAAoBrF,EAAI,CAAC7K,EAASwQ,IAAAA,CACjC,QAAQlB,KAAOkB,EACXN,EAAoBO,EAAED,EAAYlB,CAAAA,GAAAA,CAASY,EAAoBO,EAAEzQ,EAASsP,CAAAA,GAC5EoB,OAAOC,eAAe3Q,EAASsP,EAAK,CAAEsB,WAAAA,GAAkBC,IAAKL,EAAWlB,CAAAA,CAAAA,CAAAA,CAE1E,ECNDY,EAAoBO,EAAI,CAACK,EAAKC,IAAUL,OAAOM,UAAUC,eAAeC,KAAKJ,EAAKC,CAAAA,EAAAA,IAAAA,EAAAA,CAAAA,EAAAA,OAAAA,IAAAA,CAAAA,aAAAA,EAAAA,EAAAA,EAAAA,CAAAA,QAAAA,IAAAA,CAAAA,CAAAA,ECMlF,ICJMI,EAAYL,GAAAA,CAAAA,CAA4CA,GAAsB,OAARA,GAAQ,UAARA,CAAqBrP,MAAM2P,QAAQN,CAAAA,EAEhG,SAASO,EAAUC,KAA0BC,EAAAA,CAC1D,GAAA,CAAKA,EAAQhP,OAAQ,OAAO+O,EAC5B,IAAME,EAASD,EAAQ5F,MAAAA,EACvB,OAAI6F,IAAJ,QAA6BL,EAASG,CAAAA,GAAYH,EAASK,CAAAA,GAC3DF,EAAS,OAAH,OAAA,CAAA,EAAQA,CAAAA,EACdZ,OAAOe,KAAKD,CAAAA,EAAQE,SAASpC,GAAAA,CAC3B,IAAMqC,EAAcL,EAAOhC,CAAAA,EACrBsC,EAAcJ,EAAOlC,CAAAA,EAEvB7N,MAAM2P,QAAQO,CAAAA,GAAgBlQ,MAAM2P,QAAQQ,CAAAA,EAC9CN,EAAOhC,CAAAA,EAAOsC,EACLT,EAASQ,CAAAA,GAAgBR,EAASS,CAAAA,EAC3CN,EAAOhC,CAAAA,EAAO+B,EAAUX,OAAOmB,OAAO,CAAC,EAAGF,CAAAA,EAAcC,CAAAA,EAExDN,EAAOhC,CAAAA,EAAOsC,CAChB,EAAA,EAGKP,EAAUC,EAAAA,GAAWC,CAAAA,GAf+CD,CAgB7E,CCvBe,SAASQ,EAAYC,EAAaC,EAAAA,CAC/C,IAAMC,EAAOC,SAASC,cAAc,GAAA,EACpCF,EAAKG,SAAWJ,EAChBC,EAAKI,KAAON,EACZG,SAASI,KAAKC,YAAYN,CAAAA,EAC1BA,EAAKO,MAAAA,EACLN,SAASI,KAAKG,YAAYR,CAAAA,CAC5B,CCHA,IAAAxB,EAAA,CACEjG,EAAG,IACHC,EAAG,IACHC,EAAG,IACHC,EAAG,EAAA,ECLU,MAAM+H,CAAAA,CAMnB,YAAAC,CAAY,IAAEC,EAAG,KAAEzH,EAAI,OAAE0H,CAAAA,EAAAA,CACvBzS,KAAK0S,KAAOF,EACZxS,KAAK2S,MAAQ5H,EACb/K,KAAK4S,QAAUH,CACjB,CAEA,KAAKlL,EAAWC,EAAWT,EAAc8L,EAAAA,CAEvC,IAAIC,EAEJ,OAHa9S,KAAK2S,MAAAA,CAIhB,ICjBE,ODkBAG,EAAe9S,KAAK+S,SACpB,MACF,IClBI,SDmBFD,EAAe9S,KAAKgT,YACpB,MACF,ICpBW,iBDqBTF,EAAe9S,KAAKiT,mBACpB,MACF,ICzBK,UD0BHH,EAAe9S,KAAKkT,aACpB,MACF,ICxBU,gBDyBRJ,EAAe9S,KAAKmT,kBACpB,MAEF,QACEL,EAAe9S,KAAKoT,WAAAA,CAGxBN,EAAahC,KAAK9Q,KAAM,CAAEuH,EAAAA,EAAGC,EAAAA,EAAGT,KAAAA,EAAM8L,YAAAA,CAAAA,CAAAA,CACxC,CAEA,cAAAQ,CAAc,EAAE9L,EAAC,EAAEC,EAAC,KAAET,EAAI,SAAEuM,EAAW,EAAC,KAAEC,CAAAA,EAAAA,CAAAA,IAAAA,EACxC,IAAMC,EAAKjM,EAAIR,EAAO,EAChB0M,GAAKjM,EAAIT,EAAO,EAEtBwM,EAAAA,GACAlD,EAAArQ,KAAK0T,YAAQ,MAAArD,IAARqD,QAAQrD,EAAEsD,aAAa,YAAa,UAAW,IAAML,EAAY9Q,KAAKoR,EAAAA,IAAMJ,CAAAA,IAAMC,EAAAA,GAAAA,CACzF,CAEA,UAAUI,EAAAA,CACR,GAAA,CAAM,KAAE9M,EAAI,EAAEQ,EAAC,EAAEC,CAAAA,EAAMqM,EAEvB7T,KAAKqT,cAAc,OAAD,OAAA,OAAA,OAAA,CAAA,EACbQ,CAAAA,EAAI,CACPN,KAAM,IAAA,CACJvT,KAAK0T,SAAW1T,KAAK4S,QAAQd,SAASgC,gBAAgB,6BAA8B,QAAA,EACpF9T,KAAK0T,SAASC,aAAa,KAAM9J,OAAOtC,EAAIR,EAAO,CAAA,CAAA,EACnD/G,KAAK0T,SAASC,aAAa,KAAM9J,OAAOrC,EAAIT,EAAO,CAAA,CAAA,EACnD/G,KAAK0T,SAASC,aAAa,IAAK9J,OAAO9C,EAAO,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAGvD,CAEA,aAAa8M,EAAAA,CACX,GAAA,CAAM,KAAE9M,EAAI,EAAEQ,EAAC,EAAEC,CAAAA,EAAMqM,EAEvB7T,KAAKqT,cAAc,OAAD,OAAA,OAAA,OAAA,CAAA,EACbQ,CAAAA,EAAI,CACPN,KAAM,IAAA,CACJvT,KAAK0T,SAAW1T,KAAK4S,QAAQd,SAASgC,gBAAgB,6BAA8B,MAAA,EACpF9T,KAAK0T,SAASC,aAAa,IAAK9J,OAAOtC,CAAAA,CAAAA,EACvCvH,KAAK0T,SAASC,aAAa,IAAK9J,OAAOrC,CAAAA,CAAAA,EACvCxH,KAAK0T,SAASC,aAAa,QAAS9J,OAAO9C,CAAAA,CAAAA,EAC3C/G,KAAK0T,SAASC,aAAa,SAAU9J,OAAO9C,CAAAA,CAAAA,CAAM,CAAA,CAAA,CAAA,CAGxD,CAGA,kBAAkB8M,EAAAA,CAChB,GAAA,CAAM,KAAE9M,EAAI,EAAEQ,EAAC,EAAEC,CAAAA,EAAMqM,EAEvB7T,KAAKqT,cAAc,OAAD,OAAA,OAAA,OAAA,CAAA,EACbQ,CAAAA,EAAI,CACPN,KAAM,IAAA,CACJvT,KAAK0T,SAAW1T,KAAK4S,QAAQd,SAASgC,gBAAgB,6BAA8B,MAAA,EACpF9T,KAAK0T,SAASC,aACZ,IACA,KAAKpM,CAAAA,IAAKC,CAAAA,KACHT,CAAAA,KACAA,EAAO,EACZ,KAAKA,EAAO,CAAA,IAAKA,EAAO,CAAA,gBAAA,CAAkBA,CAAAA,EAAAA,CAC7C,CAAA,CAAA,CAAA,CAGP,CAGA,oBAAoB8M,EAAAA,CAClB,GAAA,CAAM,KAAE9M,EAAI,EAAEQ,EAAC,EAAEC,CAAAA,EAAMqM,EAEvB7T,KAAKqT,cAAc,OAAD,OAAA,OAAA,OAAA,CAAA,EACbQ,CAAAA,EAAI,CACPN,KAAM,IAAA,CACJvT,KAAK0T,SAAW1T,KAAK4S,QAAQd,SAASgC,gBAAgB,6BAA8B,MAAA,EACpF9T,KAAK0T,SAASC,aACZ,IACA,KAAKpM,CAAAA,IAAKC,CAAAA,KACHT,CAAAA,KACAA,CAAAA,KAAAA,CACCA,EAAO,EACb,KAAKA,EAAO,CAAA,IAAKA,EAAO,CAAA,cAAA,CAAgBA,EAAO,CAAA,IAAA,CAAMA,EAAO,CAAA,EAAA,CAC/D,CAAA,CAAA,CAAA,CAGP,CAGA,yBAAyB8M,EAAAA,CACvB,GAAA,CAAM,KAAE9M,EAAI,EAAEQ,EAAC,EAAEC,CAAAA,EAAMqM,EAEvB7T,KAAKqT,cAAc,OAAD,OAAA,OAAA,OAAA,CAAA,EACbQ,CAAAA,EAAI,CACPN,KAAM,IAAA,CACJvT,KAAK0T,SAAW1T,KAAK4S,QAAQd,SAASgC,gBAAgB,6BAA8B,MAAA,EACpF9T,KAAK0T,SAASC,aACZ,IACA,KAAKpM,CAAAA,IAAKC,CAAAA,KACHT,CAAAA,KACAA,CAAAA,KACAA,CAAAA,IAAQA,CAAAA,cAAAA,CAAmBA,CAAAA,IAAAA,CAASA,CAAAA,EAAAA,CAC5C,CAAA,CAAA,CAAA,CAGP,CAGA,qBAAqB8M,EAAAA,CACnB,GAAA,CAAM,KAAE9M,EAAI,EAAEQ,EAAC,EAAEC,CAAAA,EAAMqM,EAEvB7T,KAAKqT,cAAc,OAAD,OAAA,OAAA,OAAA,CAAA,EACbQ,CAAAA,EAAI,CACPN,KAAM,IAAA,CACJvT,KAAK0T,SAAW1T,KAAK4S,QAAQd,SAASgC,gBAAgB,6BAA8B,MAAA,EACpF9T,KAAK0T,SAASC,aACZ,IACA,KAAKpM,CAAAA,IAAKC,CAAAA,KACHT,EAAO,EACZ,KAAKA,EAAO,CAAA,IAAKA,EAAO,CAAA,cAAeA,EAAO,CAAA,IAAKA,EAAO,CAAA,KACrDA,EAAO,EACZ,KAAA,CAAMA,EAAO,EACb,KAAKA,EAAO,CAAA,IAAKA,EAAO,CAAA,cAAA,CAAgBA,EAAO,CAAA,IAAA,CAAMA,EAAO,CAAA,EAAA,CAC/D,CAAA,CAAA,CAAA,CAGP,CAEA,SAAAgM,CAAS,EAAExL,EAAC,EAAEC,EAAC,KAAET,CAAAA,EAAAA,CACf/G,KAAK+T,UAAU,CAAExM,EAAAA,EAAGC,EAAAA,EAAGT,KAAAA,EAAMuM,SAAU,CAAA,CAAA,CACzC,CAEA,YAAAF,CAAY,EAAE7L,EAAC,EAAEC,EAAC,KAAET,CAAAA,EAAAA,CAClB/G,KAAKgU,aAAa,CAAEzM,EAAAA,EAAGC,EAAAA,EAAGT,KAAAA,EAAMuM,SAAU,CAAA,CAAA,CAC5C,CAEA,aAAAJ,CAAa,EAAE3L,EAAC,EAAEC,EAAC,KAAET,EAAI,YAAE8L,CAAAA,EAAAA,CACzB,IAAMoB,EAAepB,EAAAA,CAAeA,EAAAA,GAAgB,CAAA,EAAK,EACnDqB,EAAgBrB,EAAAA,CAAeA,EAAY,EAAG,CAAA,EAAK,EACnDsB,EAActB,EAAAA,CAAeA,EAAY,EAAA,EAAI,EAAK,EAClDuB,GAAiBvB,EAAAA,CAAeA,EAAY,EAAG,CAAA,EAAK,EAEpDwB,GAAiBJ,EAAeC,EAAgBC,EAAcC,GAEpE,GAAIC,KAAmB,EAKvB,GAAIA,GAAiB,GAAMJ,GAAgBC,GAAmBC,GAAeC,GAC3EpU,KAAKgU,aAAa,CAAEzM,EAAAA,EAAGC,EAAAA,EAAGT,KAAAA,EAAMuM,SAAU,CAAA,CAAA,MAD5C,CAKA,GAAIe,KAAmB,EAAG,CACxB,IAAIf,GAAW,EAWf,OATIW,GAAgBE,EAClBb,GAAW9Q,KAAKoR,GAAK,EACZO,GAAeD,EACxBZ,GAAW9Q,KAAKoR,GACPM,GAAiBE,KAC1Bd,GAAAA,CAAY9Q,KAAKoR,GAAK,GAAA,KAGxB5T,KAAKsU,oBAAoB,CAAE/M,EAAAA,EAAGC,EAAAA,EAAGT,KAAAA,EAAMuM,SAAAA,EAAAA,CAAAA,CAEzC,CAEA,GAAIe,KAAmB,EAAG,CACxB,IAAIf,GAAW,EAWf,OATIa,EACFb,GAAW9Q,KAAKoR,GAAK,EACZM,EACTZ,GAAW9Q,KAAKoR,GACPQ,KACTd,GAAAA,CAAY9Q,KAAKoR,GAAK,GAAA,KAGxB5T,KAAKuU,kBAAkB,CAAEhN,EAAAA,EAAGC,EAAAA,EAAGT,KAAAA,EAAMuM,SAAAA,EAAAA,CAAAA,CAEvC,CA9BA,MAPEtT,KAAK+T,UAAU,CAAExM,EAAAA,EAAGC,EAAAA,EAAGT,KAAAA,EAAMuM,SAAU,CAAA,CAAA,CAsC3C,CAEA,kBAAAH,CAAkB,EAAE5L,EAAC,EAAEC,EAAC,KAAET,EAAI,YAAE8L,CAAAA,EAAAA,CAC9B,IAAMoB,EAAepB,EAAAA,CAAeA,EAAAA,GAAgB,CAAA,EAAK,EACnDqB,EAAgBrB,EAAAA,CAAeA,EAAY,EAAG,CAAA,EAAK,EACnDsB,EAActB,EAAAA,CAAeA,EAAY,EAAA,EAAI,EAAK,EAClDuB,GAAiBvB,EAAAA,CAAeA,EAAY,EAAG,CAAA,EAAK,EAEpDwB,GAAiBJ,EAAeC,EAAgBC,EAAcC,GAEpE,GAAIC,KAAmB,EAKvB,GAAIA,GAAiB,GAAMJ,GAAgBC,GAAmBC,GAAeC,GAC3EpU,KAAKgU,aAAa,CAAEzM,EAAAA,EAAGC,EAAAA,EAAGT,KAAAA,EAAMuM,SAAU,CAAA,CAAA,MAD5C,CAKA,GAAIe,KAAmB,EAAG,CACxB,IAAIf,GAAW,EAWf,OATIW,GAAgBE,EAClBb,GAAW9Q,KAAKoR,GAAK,EACZO,GAAeD,EACxBZ,GAAW9Q,KAAKoR,GACPM,GAAiBE,KAC1Bd,GAAAA,CAAY9Q,KAAKoR,GAAK,GAAA,KAGxB5T,KAAKwU,yBAAyB,CAAEjN,EAAAA,EAAGC,EAAAA,EAAGT,KAAAA,EAAMuM,SAAAA,EAAAA,CAAAA,CAE9C,CAEA,GAAIe,KAAmB,EAAG,CACxB,IAAIf,GAAW,EAWf,OATIa,EACFb,GAAW9Q,KAAKoR,GAAK,EACZM,EACTZ,GAAW9Q,KAAKoR,GACPQ,KACTd,GAAAA,CAAY9Q,KAAKoR,GAAK,GAAA,KAGxB5T,KAAKuU,kBAAkB,CAAEhN,EAAAA,EAAGC,EAAAA,EAAGT,KAAAA,EAAMuM,SAAAA,EAAAA,CAAAA,CAEvC,CA9BA,MAPEtT,KAAK+T,UAAU,CAAExM,EAAAA,EAAGC,EAAAA,EAAGT,KAAAA,EAAMuM,SAAU,CAAA,CAAA,CAsC3C,CAEA,YAAAN,CAAY,EAAEzL,EAAC,EAAEC,EAAC,KAAET,EAAI,YAAE8L,CAAAA,EAAAA,CACxB,IAAMoB,EAAepB,EAAAA,CAAeA,EAAAA,GAAgB,CAAA,EAAK,EACnDqB,EAAgBrB,EAAAA,CAAeA,EAAY,EAAG,CAAA,EAAK,EACnDsB,EAActB,EAAAA,CAAeA,EAAY,EAAA,EAAI,EAAK,EAClDuB,GAAiBvB,EAAAA,CAAeA,EAAY,EAAG,CAAA,EAAK,EAEnCoB,EAAeC,EAAgBC,EAAcC,KAE7C,EAKlBH,GAAiBE,EAKjBD,GAAkBE,GAKvBpU,KAAKgU,aAAa,CAAEzM,EAAAA,EAAGC,EAAAA,EAAGT,KAAAA,EAAMuM,SAAU,CAAA,CAAA,EAJxCtT,KAAKsU,oBAAoB,CAAE/M,EAAAA,EAAGC,EAAAA,EAAGT,KAAAA,EAAMuM,SAAU9Q,KAAKoR,GAAK,CAAA,CAAA,EAL3D5T,KAAKsU,oBAAoB,CAAE/M,EAAAA,EAAGC,EAAAA,EAAGT,KAAAA,EAAMuM,SAAAA,CAAW9Q,KAAKoR,GAAK,CAAA,CAAA,EAL5D5T,KAAKyU,qBAAqB,CAAElN,EAAAA,EAAGC,EAAAA,EAAGT,KAAAA,EAAMuM,SAAU9Q,KAAKoR,GAAK,CAAA,CAAA,CAehE,CAEA,mBAAAX,CAAmB,EAAE1L,EAAC,EAAEC,EAAC,KAAET,EAAI,YAAE8L,CAAAA,EAAAA,CAC/B,IAAMoB,EAAepB,EAAAA,CAAeA,EAAAA,GAAgB,CAAA,EAAK,EACnDqB,EAAgBrB,EAAAA,CAAeA,EAAY,EAAG,CAAA,EAAK,EACnDsB,EAActB,EAAAA,CAAeA,EAAY,EAAA,EAAI,EAAK,EAClDuB,GAAiBvB,EAAAA,CAAeA,EAAY,EAAG,CAAA,EAAK,EAEnCoB,EAAeC,EAAgBC,EAAcC,KAE7C,EAKlBH,GAAiBE,EAKjBD,GAAkBE,GAKvBpU,KAAKgU,aAAa,CAAEzM,EAAAA,EAAGC,EAAAA,EAAGT,KAAAA,EAAMuM,SAAU,CAAA,CAAA,EAJxCtT,KAAKwU,yBAAyB,CAAEjN,EAAAA,EAAGC,EAAAA,EAAGT,KAAAA,EAAMuM,SAAU9Q,KAAKoR,GAAK,CAAA,CAAA,EALhE5T,KAAKwU,yBAAyB,CAAEjN,EAAAA,EAAGC,EAAAA,EAAGT,KAAAA,EAAMuM,SAAAA,CAAW9Q,KAAKoR,GAAK,CAAA,CAAA,EALjE5T,KAAKyU,qBAAqB,CAAElN,EAAAA,EAAGC,EAAAA,EAAGT,KAAAA,EAAMuM,SAAU9Q,KAAKoR,GAAK,CAAA,CAAA,CAehE,CAAA,CEzTF,IAAAjJ,EAAA,CACE+J,IAAK,MACLC,OAAQ,SACRC,aAAc,eAAA,ECFHC,EAA6BvE,OAAOwE,OAAOC,CAAAA,EAEzC,MAAMC,CAAAA,CAMnB,YAAAzC,CAAY,IAAEC,EAAG,KAAEzH,EAAI,OAAE0H,CAAAA,EAAAA,CACvBzS,KAAK0S,KAAOF,EACZxS,KAAK2S,MAAQ5H,EACb/K,KAAK4S,QAAUH,CACjB,CAEA,KAAKlL,EAAWC,EAAWT,EAAcuM,EAAAA,CAEvC,IAAIR,EAEJ,OAHa9S,KAAK2S,MAAAA,CAIhB,KAAKoC,EAAkBJ,OACrB7B,EAAe9S,KAAKoT,YACpB,MACF,KAAK2B,EAAkBH,aACrB9B,EAAe9S,KAAKmT,kBACpB,MAEF,QACEL,EAAe9S,KAAK+S,QAAAA,CAGxBD,EAAahC,KAAK9Q,KAAM,CAAEuH,EAAAA,EAAGC,EAAAA,EAAGT,KAAAA,EAAMuM,SAAAA,CAAAA,CAAAA,CACxC,CAEA,cAAAD,CAAc,EAAE9L,EAAC,EAAEC,EAAC,KAAET,EAAI,SAAEuM,EAAW,EAAC,KAAEC,CAAAA,EAAAA,CAAAA,IAAAA,EACxC,IAAMC,EAAKjM,EAAIR,EAAO,EAChB0M,GAAKjM,EAAIT,EAAO,EAEtBwM,EAAAA,GACAlD,EAAArQ,KAAK0T,YAAQ,MAAArD,IAARqD,QAAQrD,EAAEsD,aAAa,YAAa,UAAW,IAAML,EAAY9Q,KAAKoR,EAAAA,IAAMJ,CAAAA,IAAMC,EAAAA,GAAAA,CACzF,CAEA,UAAUI,EAAAA,CACR,GAAA,CAAM,KAAE9M,EAAI,EAAEQ,EAAC,EAAEC,CAAAA,EAAMqM,EACjBoB,EAAUlO,EAAO,EAEvB/G,KAAKqT,cAAc,OAAD,OAAA,OAAA,OAAA,CAAA,EACbQ,CAAAA,EAAI,CACPN,KAAM,IAAA,CACJvT,KAAK0T,SAAW1T,KAAK4S,QAAQd,SAASgC,gBAAgB,6BAA8B,MAAA,EACpF9T,KAAK0T,SAASC,aAAa,YAAa,SAAA,EACxC3T,KAAK0T,SAASC,aACZ,IACA,KAAKpM,EAAIR,EAAO,CAAA,IAAKS,CAAAA,KACdT,EAAO,CAAA,IAAKA,EAAO,CAAA,oBAEjBkO,CAAAA,KACFlO,EAAO,EAAIkO,CAAAA,IAAWlO,EAAO,EAAIkO,CAAAA,gBAAAA,CAEzC,CAAA,CAAA,CAAA,CAGP,CAEA,aAAapB,EAAAA,CACX,GAAA,CAAM,KAAE9M,EAAI,EAAEQ,EAAC,EAAEC,CAAAA,EAAMqM,EACjBoB,EAAUlO,EAAO,EAEvB/G,KAAKqT,cAAc,OAAD,OAAA,OAAA,OAAA,CAAA,EACbQ,CAAAA,EAAI,CACPN,KAAM,IAAA,CACJvT,KAAK0T,SAAW1T,KAAK4S,QAAQd,SAASgC,gBAAgB,6BAA8B,MAAA,EACpF9T,KAAK0T,SAASC,aAAa,YAAa,SAAA,EACxC3T,KAAK0T,SAASC,aACZ,IACA,KAAKpM,CAAAA,IAAKC,CAAAA,KACHT,CAAAA,KACAA,CAAAA,KAAAA,CACCA,EACN,MACKQ,EAAI0N,CAAAA,IAAWzN,EAAIyN,CAAAA,MACnBlO,EAAO,EAAIkO,GAChB,MAAKlO,EAAO,EAAIkO,GAChB,MAAa,EAAIA,EAAXlO,GACN,GAAA,CACH,CAAA,CAAA,CAAA,CAGP,CAEA,mBAAmB8M,EAAAA,CACjB,GAAA,CAAM,KAAE9M,EAAI,EAAEQ,EAAC,EAAEC,CAAAA,EAAMqM,EACjBoB,EAAUlO,EAAO,EAEvB/G,KAAKqT,cAAc,OAAD,OAAA,OAAA,OAAA,CAAA,EACbQ,CAAAA,EAAI,CACPN,KAAM,IAAA,CACJvT,KAAK0T,SAAW1T,KAAK4S,QAAQd,SAASgC,gBAAgB,6BAA8B,MAAA,EACpF9T,KAAK0T,SAASC,aAAa,YAAa,SAAA,EACxC3T,KAAK0T,SAASC,aACZ,IACA,KAAKpM,CAAAA,IAAKC,EAAI,IAAMyN,CAAAA,KACb,EAAIA,EACT,KAAK,IAAMA,CAAAA,IAAW,IAAMA,CAAAA,cAA+B,IAAVA,CAAAA,IAA2B,IAAVA,CAAAA,KAC7D,EAAIA,EACT,KAAK,IAAMA,CAAAA,IAAW,IAAMA,CAAAA,cAA+B,IAAVA,CAAAA,IAA4B,IAAA,CAAVA,CAAAA,KAAAA,GACzDA,EACV,KAAK,IAAMA,CAAAA,IAAW,IAAMA,CAAAA,cAAgC,IAAA,CAAVA,CAAAA,IAA4B,IAAA,CAAVA,CAAAA,KAAAA,GAC1DA,EACV,KAAK,IAAMA,CAAAA,IAAW,IAAMA,CAAAA,cAAgC,IAAA,CAAVA,CAAAA,IAA2B,IAAVA,CAAAA,KAC9D1N,EAAI,IAAM0N,CAAAA,IAAWzN,EAAIyN,CAAAA,KACzB,EAAIA,EACT,KAAK,IAAMA,CAAAA,IAAW,IAAMA,CAAAA,cAA+B,IAAVA,CAAAA,IAA2B,IAAVA,CAAAA,KAC7D,EAAIA,EACT,KAAK,IAAMA,CAAAA,IAAW,IAAMA,CAAAA,cAAgC,IAAA,CAAVA,CAAAA,IAA2B,IAAVA,CAAAA,KAAAA,GACzDA,EACV,KAAK,IAAMA,CAAAA,IAAW,IAAMA,CAAAA,cAAgC,IAAA,CAAVA,CAAAA,IAA4B,IAAA,CAAVA,CAAAA,KAAAA,GAC1DA,EACV,KAAK,IAAMA,CAAAA,IAAW,IAAMA,CAAAA,cAA+B,IAAVA,CAAAA,IAA4B,IAAA,CAAVA,CAAAA,EAAAA,CACtE,CAAA,CAAA,CAAA,CAGP,CAEA,SAAAlC,CAAS,EAAExL,EAAC,EAAEC,EAAC,KAAET,EAAI,SAAEuM,CAAAA,EAAAA,CACrBtT,KAAK+T,UAAU,CAAExM,EAAAA,EAAGC,EAAAA,EAAGT,KAAAA,EAAMuM,SAAAA,CAAAA,CAAAA,CAC/B,CAEA,YAAAF,CAAY,EAAE7L,EAAC,EAAEC,EAAC,KAAET,EAAI,SAAEuM,CAAAA,EAAAA,CACxBtT,KAAKgU,aAAa,CAAEzM,EAAAA,EAAGC,EAAAA,EAAGT,KAAAA,EAAMuM,SAAAA,CAAAA,CAAAA,CAClC,CAEA,kBAAAH,CAAkB,EAAE5L,EAAC,EAAEC,EAAC,KAAET,EAAI,SAAEuM,CAAAA,EAAAA,CAC9BtT,KAAKkV,mBAAmB,CAAE3N,EAAAA,EAAGC,EAAAA,EAAGT,KAAAA,EAAMuM,SAAAA,CAAAA,CAAAA,CACxC,CAAA,CCtIF,IAAA6B,EAAA,CACET,IAAK,MACLC,OAAQ,QAAA,ECDGS,EAA0B9E,OAAOwE,OAAOO,CAAAA,EAEtC,MAAMC,CAAAA,CAMnB,YAAA/C,CAAY,IAAEC,EAAG,KAAEzH,EAAI,OAAE0H,CAAAA,EAAAA,CACvBzS,KAAK0S,KAAOF,EACZxS,KAAK2S,MAAQ5H,EACb/K,KAAK4S,QAAUH,CACjB,CAEA,KAAKlL,EAAWC,EAAWT,EAAcuM,EAAAA,CAEvC,IAAIR,EAIAA,EALS9S,KAAK2S,QAIX0C,EAAeV,OACH3U,KAAKoT,YAILpT,KAAK+S,SAGxBD,EAAahC,KAAK9Q,KAAM,CAAEuH,EAAAA,EAAGC,EAAAA,EAAGT,KAAAA,EAAMuM,SAAAA,CAAAA,CAAAA,CACxC,CAEA,cAAAD,CAAc,EAAE9L,EAAC,EAAEC,EAAC,KAAET,EAAI,SAAEuM,EAAW,EAAC,KAAEC,CAAAA,EAAAA,CAAAA,IAAAA,EACxC,IAAMC,EAAKjM,EAAIR,EAAO,EAChB0M,GAAKjM,EAAIT,EAAO,EAEtBwM,EAAAA,GACAlD,EAAArQ,KAAK0T,YAAQ,MAAArD,IAARqD,QAAQrD,EAAEsD,aAAa,YAAa,UAAW,IAAML,EAAY9Q,KAAKoR,EAAAA,IAAMJ,CAAAA,IAAMC,EAAAA,GAAAA,CACzF,CAEA,UAAUI,EAAAA,CACR,GAAA,CAAM,KAAE9M,EAAI,EAAEQ,EAAC,EAAEC,CAAAA,EAAMqM,EAEvB7T,KAAKqT,cAAc,OAAD,OAAA,OAAA,OAAA,CAAA,EACbQ,CAAAA,EAAI,CACPN,KAAM,IAAA,CACJvT,KAAK0T,SAAW1T,KAAK4S,QAAQd,SAASgC,gBAAgB,6BAA8B,QAAA,EACpF9T,KAAK0T,SAASC,aAAa,KAAM9J,OAAOtC,EAAIR,EAAO,CAAA,CAAA,EACnD/G,KAAK0T,SAASC,aAAa,KAAM9J,OAAOrC,EAAIT,EAAO,CAAA,CAAA,EACnD/G,KAAK0T,SAASC,aAAa,IAAK9J,OAAO9C,EAAO,CAAA,CAAA,CAAG,CAAA,CAAA,CAAA,CAGvD,CAEA,aAAa8M,EAAAA,CACX,GAAA,CAAM,KAAE9M,EAAI,EAAEQ,EAAC,EAAEC,CAAAA,EAAMqM,EAEvB7T,KAAKqT,cAAc,OAAD,OAAA,OAAA,OAAA,CAAA,EACbQ,CAAAA,EAAI,CACPN,KAAM,IAAA,CACJvT,KAAK0T,SAAW1T,KAAK4S,QAAQd,SAASgC,gBAAgB,6BAA8B,MAAA,EACpF9T,KAAK0T,SAASC,aAAa,IAAK9J,OAAOtC,CAAAA,CAAAA,EACvCvH,KAAK0T,SAASC,aAAa,IAAK9J,OAAOrC,CAAAA,CAAAA,EACvCxH,KAAK0T,SAASC,aAAa,QAAS9J,OAAO9C,CAAAA,CAAAA,EAC3C/G,KAAK0T,SAASC,aAAa,SAAU9J,OAAO9C,CAAAA,CAAAA,CAAM,CAAA,CAAA,CAAA,CAGxD,CAEA,SAAAgM,CAAS,EAAExL,EAAC,EAAEC,EAAC,KAAET,EAAI,SAAEuM,CAAAA,EAAAA,CACrBtT,KAAK+T,UAAU,CAAExM,EAAAA,EAAGC,EAAAA,EAAGT,KAAAA,EAAMuM,SAAAA,CAAAA,CAAAA,CAC/B,CAEA,YAAAF,CAAY,EAAE7L,EAAC,EAAEC,EAAC,KAAET,EAAI,SAAEuM,CAAAA,EAAAA,CACxBtT,KAAKgU,aAAa,CAAEzM,EAAAA,EAAGC,EAAAA,EAAGT,KAAAA,EAAMuM,SAAAA,CAAAA,CAAAA,CAClC,CAAA,CC1EF,ICAAiC,EAEU,SCQJC,EAAa,CACjB,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EACnB,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EACnB,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EACnB,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EACnB,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EACnB,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EACnB,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,CAAA,EAGfC,EAAU,CACd,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EACnB,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EACnB,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EACnB,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EACnB,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EACnB,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,EACnB,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAA,CAAA,EAGrB,MAAqBC,CAAAA,CAiBnB,YAAYC,EAA0BlD,EAAAA,CAqjBtC,KAAAmD,WAAcC,GACR7V,KAAK8V,SAASC,YAAYC,UACrBxT,KAAKC,MAAMoT,CAAAA,EAEbA,EAxjBP7V,KAAK4S,QAAUH,EACfzS,KAAK0T,SAAW1T,KAAK4S,QAAQd,SAASgC,gBAAgB,6BAA8B,KAAA,EACpF9T,KAAK0T,SAASC,aAAa,QAAS9J,OAAO8L,EAAQzI,KAAAA,CAAAA,EACnDlN,KAAK0T,SAASC,aAAa,SAAU9J,OAAO8L,EAAQxI,MAAAA,CAAAA,EACpDnN,KAAK0T,SAASC,aAAa,cAAe,8BAAA,EACrCgC,EAAQI,YAAYC,WACvBhW,KAAK0T,SAASC,aAAa,kBAAmB,YAAA,EAEhD3T,KAAK0T,SAASC,aAAa,UAAW,OAAOgC,EAAQzI,KAAAA,IAASyI,EAAQxI,MAAAA,EAAAA,EACtEnN,KAAKiW,MAAQjW,KAAK4S,QAAQd,SAASgC,gBAAgB,6BAA8B,MAAA,EACjF9T,KAAK0T,SAASvB,YAAYnS,KAAKiW,KAAAA,EAC/BjW,KAAKkW,UAAYP,EAAQQ,MACzBnW,KAAKoW,YAAcV,EAAMW,gBACzBrW,KAAK8V,SAAWH,CAClB,CAEA,IAAA,OAAIzI,CACF,OAAOlN,KAAK8V,SAAS5I,KACvB,CAEA,IAAA,QAAIC,CACF,OAAOnN,KAAK8V,SAAS3I,MACvB,CAEA,YAAAmJ,CACE,OAAOtW,KAAK0T,QACd,CAEA,MAAA,OAAa6C,EAAAA,CACX,IAAM9M,EAAQ8M,EAAG5Q,eAAAA,EACX6Q,EAAUhU,KAAK8E,IAAItH,KAAK8V,SAAS5I,MAAOlN,KAAK8V,SAAS3I,MAAAA,EAAiC,EAAvBnN,KAAK8V,SAAS1P,OAC9EqQ,EAAazW,KAAK8V,SAASY,QAAUC,EAAoBH,EAAUhU,KAAKoU,KAAK,CAAA,EAAKJ,EAClFvB,EAAUjV,KAAK4V,WAAWa,EAAahN,CAAAA,EACzCoN,EAAgB,CAClBC,UAAW,EACXC,UAAW,EACX7J,MAAO,EACPC,OAAQ,CAAA,EAKV,GAFAnN,KAAKgX,IAAMT,EAEPvW,KAAK8V,SAASK,MAAO,CAGvB,GAAA,MADMnW,KAAKiX,UAAAA,EAAAA,CACNjX,KAAKkX,OAAQ,OAClB,GAAA,CAAM,aAAEC,EAAY,UAAEC,EAAAA,EAAcpX,KAAK8V,SACnCuB,GAAaF,EAAaG,UAAYC,EAAwBH,GAAU7W,oBAAAA,EACxEiX,GAAgBhV,KAAKC,MAAM4U,GAAa5N,EAAQA,CAAAA,EAEtDoN,GCrFS,SAAA,CAA4B,eACzCY,GAAc,cACdC,EAAa,cACbF,GAAa,kBACbG,GAAiB,QACjB1C,EAAAA,EAAAA,CAEA,IAAM2C,GAAW,CAAErQ,EAAG,EAAGC,EAAG,CAAA,EACtB8P,GAAY,CAAE/P,EAAG,EAAGC,EAAG,CAAA,EAE7B,GAAIiQ,IAAkB,GAAKC,GAAiB,GAAKF,IAAiB,GAAKvC,IAAW,EAChF,MAAO,CACL9H,OAAQ,EACRD,MAAO,EACP6J,UAAW,EACXD,UAAW,CAAA,EAIf,IAAMe,GAAIJ,GAAiBC,EA6B3B,OA1BAE,GAASrQ,EAAI/E,KAAKC,MAAMD,KAAKoU,KAAKY,GAAgBK,EAAAA,CAAAA,EAE9CD,GAASrQ,GAAK,IAAGqQ,GAASrQ,EAAI,GAE9BoQ,IAAqBA,GAAoBC,GAASrQ,IAAGqQ,GAASrQ,EAAIoQ,IAElEC,GAASrQ,EAAI,GAAM,GAAGqQ,GAASrQ,IACnC+P,GAAU/P,EAAIqQ,GAASrQ,EAAI0N,GAI3B2C,GAASpQ,EAAI,EAAI,EAAIhF,KAAKsV,MAAMF,GAASrQ,EAAIsQ,GAAI,GAAK,CAAA,EACtDP,GAAU9P,EAAIhF,KAAKuV,MAAMT,GAAU/P,EAAIsQ,EAAAA,GAEnCD,GAASpQ,EAAIoQ,GAASrQ,EAAIiQ,IAAkBG,IAAqBA,GAAoBC,GAASpQ,KAC5FmQ,IAAqBA,GAAoBC,GAASpQ,GACpDoQ,GAASpQ,EAAImQ,GACTC,GAASpQ,EAAI,GAAM,GAAGoQ,GAASrQ,KAEnCqQ,GAASpQ,GAAK,EAEhB8P,GAAU9P,EAAIoQ,GAASpQ,EAAIyN,GAC3B2C,GAASrQ,EAAI,EAAI,EAAI/E,KAAKsV,MAAMF,GAASpQ,EAAIqQ,GAAI,GAAK,CAAA,EACtDP,GAAU/P,EAAI/E,KAAKuV,MAAMT,GAAU9P,EAAIqQ,EAAAA,GAGlC,CACL1K,OAAQmK,GAAU9P,EAClB0F,MAAOoK,GAAU/P,EACjBwP,UAAWa,GAASpQ,EACpBsP,UAAWc,GAASrQ,CAAAA,CAExB,GD+ByC,CACjCmQ,cAAe1X,KAAKkX,OAAOhK,MAC3BuK,eAAgBzX,KAAKkX,OAAO/J,OAC5BqK,cAAAA,GACAG,kBAAmBlO,EAAQ,GAC3BwL,QAAAA,CAAAA,CAAAA,CAEJ,CAEAjV,KAAKgY,eAAAA,EACLhY,KAAKiY,UAAS,CAAC3W,EAAaC,KAAAA,CAAAA,IAAAA,GAAAA,GAAAA,GAAAA,EAAAA,GAAAA,GAC1B,MAAA,EAAIvB,KAAK8V,SAASqB,aAAae,oBAE3B5W,IAAQmI,EAAQoN,EAAcE,WAAa,GAC3CzV,GAAOmI,EAAQoN,EAAcE,WAAa,GAC1CxV,KAAQkI,EAAQoN,EAAcC,WAAa,GAC3CvV,IAAOkI,EAAQoN,EAAcC,WAAa,GAM3B,GAAf1W,GAAAoV,EAAWlU,CAAAA,KAAI,MAAAlB,KAAJkB,SAAIlB,GAAGmB,EAAAA,GAAmC,GAA3B8J,GAAAmK,EAAWlU,EAAMmI,EAAQ,CAAA,KAAE,MAAA4B,KAAF,SAAEA,GAAG9J,EAAAA,GAAuB,GAAf8O,GAAAmF,EAAWlU,CAAAA,KAAI,MAAA+O,KAAJ/O,SAAI+O,GAAG9O,GAAMkI,EAAQ,CAAA,GAIpF,GAAZkB,EAAA8K,EAAQnU,CAAAA,KAAI,MAAAqJ,IAAJrJ,SAAIqJ,EAAGpJ,EAAAA,GAAgC,GAAxB4W,GAAA1C,EAAQnU,EAAMmI,EAAQ,CAAA,KAAE,MAAA0O,KAAF,SAAEA,GAAG5W,EAAAA,GAAoB,GAAZkJ,GAAAgL,EAAQnU,CAAAA,KAAI,MAAAmJ,KAAJnJ,SAAImJ,GAAGlJ,GAAMkI,EAAQ,CAAA,EAIhF,EAAA,EAEbzJ,KAAKoY,YAAAA,EAEDpY,KAAK8V,SAASK,OAAAA,MACVnW,KAAKqY,UAAU,CAAEnL,MAAO2J,EAAc3J,MAAOC,OAAQ0J,EAAc1J,OAAQ1D,MAAAA,EAAOwL,QAAAA,CAAAA,CAAAA,CAE5F,CAEA,gBAAA+C,CAAAA,IAAAA,EAAAA,EAAAA,EACE,IAAMM,EAAUtY,KAAK0T,SACfiC,EAAU3V,KAAK8V,SAErB,GAAIwC,EAAS,CACX,IAAMC,GAAkBtY,EAAA0V,EAAQ6C,qBAAiB,MAAAvY,IAAjBuY,OAAiB,OAAAvY,EAAEwY,SAC7CC,GAAQxY,EAAAyV,EAAQ6C,qBAAiB,MAAAtY,IAAjBsY,OAAiB,OAAAtY,EAAEwY,MACrCvL,GAASwI,EAAQxI,OACjBD,GAAQyI,EAAQzI,MAEpB,GAAIqL,GAAmBG,EAAO,CAC5B,IAAMJ,GAAUtY,KAAK4S,QAAQd,SAASgC,gBAAgB,6BAA8B,MAAA,EACpF9T,KAAK2Y,oBAAsB3Y,KAAK4S,QAAQd,SAASgC,gBAAgB,6BAA8B,UAAA,EAC/F9T,KAAK2Y,oBAAoBhF,aAAa,KAAM,8BAA8B3T,KAAKoW,WAAAA,EAAAA,EAC/EpW,KAAKiW,MAAM9D,YAAYnS,KAAK2Y,mBAAAA,EAEC,GAAzBxY,EAAAwV,EAAQ6C,qBAAiB,MAAArY,IAAjBqY,SAAiBrY,EAAE4X,QAC7B5K,GAASD,GAAQ1K,KAAK8E,IAAIqO,EAAQzI,MAAOyI,EAAQxI,MAAAA,EACjDmL,GAAQ3E,aAAa,KAAM9J,OAAQsD,GAAS,EAAKwI,EAAQ6C,kBAAkBT,KAAAA,CAAAA,GAG7EO,GAAQ3E,aAAa,IAAK9J,OAAO7J,KAAK4V,YAAYD,EAAQzI,MAAQA,IAAS,CAAA,CAAA,CAAA,EAC3EoL,GAAQ3E,aAAa,IAAK9J,OAAO7J,KAAK4V,YAAYD,EAAQxI,OAASA,IAAU,CAAA,CAAA,CAAA,EAC7EmL,GAAQ3E,aAAa,QAAS9J,OAAOqD,EAAAA,CAAAA,EACrCoL,GAAQ3E,aAAa,SAAU9J,OAAOsD,EAAAA,CAAAA,EAEtCnN,KAAK2Y,oBAAoBxG,YAAYmG,EAAAA,EAErCtY,KAAK4Y,aAAa,CAChBjD,QAAS4C,EACTG,MAAOA,EACPG,mBAAoB,EACpBtR,EAAG,EACHC,EAAG,EACH2F,OAAQwI,EAAQxI,OAChBD,MAAOyI,EAAQzI,MACf0E,KAAM,oBAAoB5R,KAAKoW,WAAAA,EAAAA,CAAAA,CAEnC,CACF,CACF,CAEA,SAAS0C,EAAAA,CAAAA,IAAAA,EAAAA,EACP,GAAA,CAAK9Y,KAAKgX,IACR,KAAM,yBAGR,IAAMrB,EAAU3V,KAAK8V,SACfrM,EAAQzJ,KAAKgX,IAAIrR,eAAAA,EAEvB,GAAI8D,EAAQkM,EAAQzI,OAASzD,EAAQkM,EAAQxI,OAC3C,KAAM,2BAGR,IAAMqJ,EAAUhU,KAAK8E,IAAIqO,EAAQzI,MAAOyI,EAAQxI,MAAAA,EAA2B,EAAjBwI,EAAQvP,OAC5DqQ,EAAad,EAAQe,QAAUC,EAAoBH,EAAUhU,KAAKoU,KAAK,CAAA,EAAKJ,EAC5EvB,GAAUjV,KAAK4V,WAAWa,EAAahN,CAAAA,EACvCsP,GAAa/Y,KAAK4V,YAAYD,EAAQzI,MAAQzD,EAAQwL,IAAW,CAAA,EACjE+D,GAAahZ,KAAK4V,YAAYD,EAAQxI,OAAS1D,EAAQwL,IAAW,CAAA,EAClEP,GAAM,IAAIpC,EAAM,CACpBE,IAAKxS,KAAK0T,SACV3I,KAAM4K,EAAQI,YAAYhL,KAC1B0H,OAAQzS,KAAK4S,OAAAA,CAAAA,EAGf5S,KAAKiZ,cAAgBjZ,KAAK4S,QAAQd,SAASgC,gBAAgB,6BAA8B,UAAA,EACzF9T,KAAKiZ,cAActF,aAAa,KAAM,uBAAuB3T,KAAKoW,WAAAA,EAAAA,EAClEpW,KAAKiW,MAAM9D,YAAYnS,KAAKiZ,aAAAA,EAE5BjZ,KAAK4Y,aAAa,CAChBjD,SAASzV,EAAAyV,EAAQI,eAAW,MAAA7V,IAAX6V,OAAW,OAAA7V,EAAEuY,SAC9BC,MAAO/C,EAAQI,YAAY2C,MAC3BG,mBAAoB,EACpBtR,EAAG,EACHC,EAAG,EACH2F,OAAQwI,EAAQxI,OAChBD,MAAOyI,EAAQzI,MACf0E,KAAM,aAAa5R,KAAKoW,WAAAA,EAAAA,CAAAA,EAG1B,QAAS9U,EAAM,EAAGA,EAAMmI,EAAOnI,IAC7B,QAASC,GAAM,EAAGA,GAAMkI,EAAOlI,KACzBuX,GAAAA,CAAWA,EAAOxX,EAAKC,EAAAA,GAGd,GAARpB,EAAAH,KAAKgX,OAAG,MAAA7W,IAAH6W,SAAG7W,EAAEuF,OAAOpE,EAAKC,EAAAA,IAI3BmT,GAAInB,KACFwF,GAAaxX,GAAM0T,GACnB+D,GAAa1X,EAAM2T,GACnBA,IACA,CAACiE,GAAiBC,KAAAA,EACZ5X,GAAM2X,GAAU,GAAK5X,EAAM6X,GAAU,GAAK5X,GAAM2X,IAAWzP,GAASnI,EAAM6X,IAAW1P,IAAAA,EACrFqP,GAAAA,CAAWA,EAAOxX,EAAM6X,GAAS5X,GAAM2X,EAAAA,IAAAA,CAAAA,CAClClZ,KAAKgX,KAAOhX,KAAKgX,IAAItR,OAAOpE,EAAM6X,GAAS5X,GAAM2X,EAAAA,EAAAA,EAI1DxE,GAAIhB,UAAY1T,KAAKiZ,eACvBjZ,KAAKiZ,cAAc9G,YAAYuC,GAAIhB,QAAAA,GAKzC,GAAIiC,EAAQe,QAAUC,EAAmB,CACvC,IAAMyC,EAAiBpZ,KAAK4V,YAAYY,EAAUvB,GAAUxL,GAAS,CAAA,EAC/D4P,GAAY5P,EAAyB,EAAjB2P,EACpBE,GAAiBP,GAAaK,EAAiBnE,GAC/CsE,GAAiBP,GAAaI,EAAiBnE,GAC/CuE,GAAyB,CAAA,EACzBC,GAASzZ,KAAK4V,WAAWyD,GAAY,CAAA,EAE3C,QAAS/X,GAAM,EAAGA,GAAM+X,GAAW/X,KAAO,CACxCkY,GAAWlY,EAAAA,EAAO,CAAA,EAClB,QAASC,GAAM,EAAGA,GAAM8X,GAAW9X,KAE/BD,IAAO8X,EAAiB,GACxB9X,IAAO+X,GAAYD,GACnB7X,IAAO6X,EAAiB,GACxB7X,IAAO8X,GAAYD,GAMjB5W,KAAKoU,MAAMtV,GAAMmY,KAAWnY,GAAMmY,KAAWlY,GAAMkY,KAAWlY,GAAMkY,GAAAA,EAAWA,GAJjFD,GAAWlY,EAAAA,EAAKC,EAAAA,EAAO,EAUzBiY,GAAWlY,EAAAA,EAAKC,EAAAA,EAAOvB,KAAKgX,IAAItR,OAC9BnE,GAAM,EAAI6X,EAAiB,EAAI7X,GAAMA,IAAOkI,EAAQlI,GAAM,EAAI6X,EAAiB7X,GAAM6X,EACrF9X,GAAM,EAAI8X,EAAiB,EAAI9X,GAAMA,IAAOmI,EAAQnI,GAAM,EAAI8X,EAAiB9X,GAAM8X,CAAAA,EAEnF,EACA,CAER,CAEA,QAAS9X,GAAM,EAAGA,GAAM+X,GAAW/X,KACjC,QAASC,GAAM,EAAGA,GAAM8X,GAAW9X,KAC5BiY,GAAWlY,EAAAA,EAAKC,EAAAA,IAErBmT,GAAInB,KACF+F,GAAiB/X,GAAM0T,GACvBsE,GAAiBjY,GAAM2T,GACvBA,IACA,CAACiE,GAAiBC,KAAAA,CAAAA,IAAAA,GAChB,MAAA,CAAA,EAAkC,GAAzB/Y,GAAAoZ,GAAWlY,GAAM6X,EAAAA,KAAQ,MAAA/Y,KAAR+Y,SAAQ/Y,GAAGmB,GAAM2X,EAAAA,EAAQ,EAAA,EAGnDxE,GAAIhB,UAAY1T,KAAKiZ,eACvBjZ,KAAKiZ,cAAc9G,YAAYuC,GAAIhB,QAAAA,EAI3C,CACF,CAEA,aAAA0E,CACE,GAAA,CAAKpY,KAAKgX,IACR,KAAM,yBAGR,IAAMsB,EAAUtY,KAAK0T,SACfiC,EAAU3V,KAAK8V,SAErB,GAAA,CAAKwC,EACH,KAAM,8BAGR,IAAM7O,EAAQzJ,KAAKgX,IAAIrR,eAAAA,EACjB6Q,EAAUhU,KAAK8E,IAAIqO,EAAQzI,MAAOyI,EAAQxI,MAAAA,EAA2B,EAAjBwI,EAAQvP,OAC5DqQ,EAAad,EAAQe,QAAUC,EAAoBH,EAAUhU,KAAKoU,KAAK,CAAA,EAAKJ,EAC5EvB,EAAUjV,KAAK4V,WAAWa,EAAahN,CAAAA,EACvCiQ,EAA8B,EAAVzE,EACpB0E,GAA2B,EAAV1E,EACjB8D,GAAa/Y,KAAK4V,YAAYD,EAAQzI,MAAQzD,EAAQwL,GAAW,CAAA,EACjE+D,GAAahZ,KAAK4V,YAAYD,EAAQxI,OAAS1D,EAAQwL,GAAW,CAAA,EAExE,CACE,CAAC,EAAG,EAAG,CAAA,EACP,CAAC,EAAG,EAAGzS,KAAKoR,GAAK,CAAA,EACjB,CAAC,EAAG,EAAA,CAAIpR,KAAKoR,GAAK,CAAA,CAAA,EAClBtC,SAAQ,CAAA,CAAEsI,GAAQtY,EAAKgS,EAAAA,IAAAA,CAAAA,IAAAA,GAAAA,GAAAA,GAAAA,GAAAA,GAAAA,GAAAA,GAAAA,GAAAA,GAAAA,GAAAA,GAAAA,GAAAA,GAAAA,GACvB,IAAM/L,GAAIwR,GAAaa,GAAS3E,GAAWxL,EAAQ,GAC7CjC,EAAIwR,GAAa1X,EAAM2T,GAAWxL,EAAQ,GAC5CoQ,EAAwB7Z,KAAKiZ,cAC7Ba,GAAqB9Z,KAAKiZ,cAoB9B,IAlBgC,GAA5B1D,GAAAI,EAAQoE,wBAAoB,MAAAxE,KAApBwE,SAAoBxE,GAAEkD,UAAwC,GAA5BuB,GAAArE,EAAQoE,wBAAoB,MAAAC,KAApBD,SAAoBC,GAAEtB,SAC1EmB,EAAwB7Z,KAAK4S,QAAQd,SAASgC,gBAAgB,6BAA8B,UAAA,EAC5F+F,EAAsBlG,aAAa,KAAM,kCAAkCiG,EAAAA,IAAUtY,CAAAA,IAAOtB,KAAKoW,WAAAA,EAAAA,EACjGpW,KAAKiW,MAAM9D,YAAY0H,CAAAA,EACvB7Z,KAAKia,uBAAyBja,KAAKka,oBAAsBJ,GAAqBD,EAE9E7Z,KAAK4Y,aAAa,CAChBjD,SAASwE,GAAAxE,EAAQoE,wBAAoB,MAAAI,KAApBJ,OAAoB,OAAAI,GAAE1B,SACvCC,OAAOlP,GAAAmM,EAAQoE,wBAAoB,MAAAvQ,KAApBuQ,OAAoB,OAAAvQ,GAAEkP,MACrCG,mBAAoBvF,GACpB/L,EAAAA,GACAC,EAAAA,EACA2F,OAAQuM,EACRxM,MAAOwM,EACP9H,KAAM,wBAAwBgI,EAAAA,IAAUtY,CAAAA,IAAOtB,KAAKoW,WAAAA,EAAAA,CAAAA,KAIpD5O,GAAAmO,EAAQoE,wBAAoB,MAAAvS,KAApBuS,OAAoB,OAAAvS,GAAEuD,OAAQ8J,EAA2BuF,SAASzE,EAAQoE,qBAAqBhP,IAAAA,EAAO,CAChH,IAAMsP,GAAgB,IAAIrF,EAAe,CACvCxC,IAAKxS,KAAK0T,SACV3I,KAAM4K,EAAQoE,qBAAqBhP,KACnC0H,OAAQzS,KAAK4S,OAAAA,CAAAA,EAGfyH,GAAc9G,KAAKhM,GAAGC,EAAGkS,EAAmBpG,EAAAA,EAExC+G,GAAc3G,UAAYmG,GAC5BA,EAAsB1H,YAAYkI,GAAc3G,QAAAA,CAEpD,KAAO,CACL,IAAMgB,GAAM,IAAIpC,EAAM,CACpBE,IAAKxS,KAAK0T,SACV3I,OAAOxD,GAAAoO,EAAQoE,wBAAoB,MAAAxS,KAApBwS,OAAoB,OAAAxS,GAAEwD,OAAoB4K,EAAQI,YAAYhL,KAC7E0H,OAAQzS,KAAK4S,OAAAA,CAAAA,EAGf,QAAStR,GAAM,EAAGA,GAAMkU,EAAWrT,OAAQb,KACzC,QAASC,GAAM,EAAGA,GAAMiU,EAAWlU,EAAAA,EAAKa,OAAQZ,KAC1B,GAAf+Y,GAAA9E,EAAWlU,EAAAA,KAAI,MAAAgZ,KAAJhZ,SAAIgZ,GAAG/Y,EAAAA,IAIvBmT,GAAInB,KACFhM,GAAIhG,GAAM0T,EACVzN,EAAIlG,GAAM2T,EACVA,GACA,CAACiE,GAAiBC,KAAAA,CAA4B,IAAA9N,GAAC,MAAA,CAAA,EAA2B,GAAzBA,GAAAmK,EAAWlU,GAAM6X,EAAAA,KAAQ,MAAA9N,KAAR8N,SAAQ9N,GAAG9J,GAAM2X,EAAAA,EAAQ,EAAA,EAGzFxE,GAAIhB,UAAYmG,GAClBA,EAAsB1H,YAAYuC,GAAIhB,QAAAA,EAI9C,CAoBA,IAlB6B,GAAzB6G,GAAA5E,EAAQ6E,qBAAiB,MAAAD,KAAjBC,SAAiBD,GAAE9B,UAAqC,GAAzBgC,GAAA9E,EAAQ6E,qBAAiB,MAAAC,KAAjBD,SAAiBC,GAAE/B,SACpEoB,GAAqB9Z,KAAK4S,QAAQd,SAASgC,gBAAgB,6BAA8B,UAAA,EACzFgG,GAAmBnG,aAAa,KAAM,+BAA+BiG,EAAAA,IAAUtY,CAAAA,IAAOtB,KAAKoW,WAAAA,EAAAA,EAC3FpW,KAAKiW,MAAM9D,YAAY2H,EAAAA,EACvB9Z,KAAKka,oBAAsBJ,GAE3B9Z,KAAK4Y,aAAa,CAChBjD,SAAStL,GAAAsL,EAAQ6E,qBAAiB,MAAAnQ,KAAjBmQ,OAAiB,OAAAnQ,GAAEoO,SACpCC,OAAOgC,GAAA/E,EAAQ6E,qBAAiB,MAAAE,KAAjBF,OAAiB,OAAAE,GAAEhC,MAClCG,mBAAoBvF,GACpB/L,EAAGA,GAAc,EAAV0N,EACPzN,EAAGA,EAAc,EAAVyN,EACP9H,OAAQwM,GACRzM,MAAOyM,GACP/H,KAAM,qBAAqBgI,EAAAA,IAAUtY,CAAAA,IAAOtB,KAAKoW,WAAAA,EAAAA,CAAAA,KAIjDuE,GAAAhF,EAAQ6E,qBAAiB,MAAAG,KAAjBH,OAAiB,OAAAG,GAAE5P,OAAQqK,EAAwBgF,SAASzE,EAAQ6E,kBAAkBzP,IAAAA,EAAO,CACvG,IAAM6P,GAAa,IAAItF,EAAY,CACjC9C,IAAKxS,KAAK0T,SACV3I,KAAM4K,EAAQ6E,kBAAkBzP,KAChC0H,OAAQzS,KAAK4S,OAAAA,CAAAA,EAGfgI,GAAWrH,KAAKhM,GAAc,EAAV0N,EAAazN,EAAc,EAAVyN,EAAa0E,GAAgBrG,EAAAA,EAE9DsH,GAAWlH,UAAYoG,IACzBA,GAAmB3H,YAAYyI,GAAWlH,QAAAA,CAE9C,KAAO,CACL,IAAMgB,GAAM,IAAIpC,EAAM,CACpBE,IAAKxS,KAAK0T,SACV3I,OAAO8P,GAAAlF,EAAQ6E,qBAAiB,MAAAK,KAAjBL,OAAiB,OAAAK,GAAE9P,OAAoB4K,EAAQI,YAAYhL,KAC1E0H,OAAQzS,KAAK4S,OAAAA,CAAAA,EAGf,QAAStR,GAAM,EAAGA,GAAMmU,EAAQtT,OAAQb,KACtC,QAASC,GAAM,EAAGA,GAAMkU,EAAQnU,EAAAA,EAAKa,OAAQZ,KAC1B,GAAZsW,GAAApC,EAAQnU,EAAAA,KAAI,MAAAuW,KAAJvW,SAAIuW,GAAGtW,EAAAA,IAIpBmT,GAAInB,KACFhM,GAAIhG,GAAM0T,EACVzN,EAAIlG,GAAM2T,EACVA,GACA,CAACiE,GAAiBC,KAAAA,CAA4B,IAAA9N,GAAC,MAAA,CAAA,EAAwB,GAAtBA,GAAAoK,EAAQnU,GAAM6X,EAAAA,KAAQ,MAAA9N,KAAR8N,SAAQ9N,GAAG9J,GAAM2X,EAAAA,EAAQ,EAAA,EAGtFxE,GAAIhB,UAAYoG,IAClBA,GAAmB3H,YAAYuC,GAAIhB,QAAAA,EAI3C,CAAA,EAAA,CAEJ,CAEA,WAAAuD,CACE,OAAO,IAAI6D,SAAQ,CAACC,EAASC,IAAAA,CAAAA,IAAAA,EAC3B,IAAMrF,EAAU3V,KAAK8V,SAErB,GAAA,CAAKH,EAAQQ,MACX,OAAO6E,EAAO,sBAAA,EAGhB,GAAsB,GAAlB7a,EAAAwV,EAAQsF,cAAU,MAAA9a,IAAV8a,SAAU9a,EAAE8W,UACtBtB,EAAQsF,WACLhE,UAAUtB,EAAQQ,KAAAA,EAClB+E,MAAM/E,GAAAA,CAAAA,IAAAA,EAAAA,EAEL,GADAnW,KAAKkX,OAASf,EACVnW,KAAK8V,SAASqB,aAAagE,WAAY,CACzC,IAAMC,IAASjb,EAAAwV,EAAQsF,cAAU,MAAA9a,IAAV8a,OAAU,OAAA9a,EAAEkb,aAAcrb,KAAKkX,OAAOhK,MAAQlN,KAAKkX,OAAO/J,MAAAA,GACjF9B,EAAA+P,IAAQE,WAAW,IAAA,KAAK,MAAAjQ,IAAL,QAAKA,EAAEgN,UAAUlC,EAAO,EAAG,CAAA,EAC9CnW,KAAKkW,UAAYkF,IAAQG,UAAAA,CAC3B,CACAR,EAAAA,CAAS,EAAA,EAEVS,MAAMR,CAAAA,MACJ,CACL,IAAM7E,EAAQ,IAAInW,KAAK4S,QAAQ6I,MAEiB,OAArC9F,EAAQwB,aAAauE,aAAgB,WAC9CvF,EAAMuF,YAAc/F,EAAQwB,aAAauE,aAG3C1b,KAAKkX,OAASf,EACdA,EAAMwF,OAASC,SAAAA,CACT5b,KAAK8V,SAASqB,aAAagE,aAC7Bnb,KAAKkW,UAAAA,ME7dF0F,eAAyBC,EAAapJ,EAAAA,CACnD,OAAO,IAAIqI,SAASC,IAAAA,CAClB,IAAMe,GAAM,IAAIrJ,EAAOsJ,eACvBD,GAAIH,OAAS,UAAA,CACX,IAAMK,GAAS,IAAIvJ,EAAOwJ,WAC1BD,GAAOE,UAAY,UAAA,CACjBnB,GAAQiB,GAAOG,MAAAA,CACjB,EACAH,GAAOI,cAAcN,GAAIO,QAAAA,CAC3B,EACAP,GAAIQ,KAAK,MAAOT,CAAAA,EAChBC,GAAIS,aAAe,OACnBT,GAAIU,KAAAA,CAAM,EAAA,CAEd,GF+c6C7G,EAAQQ,OAAS,GAAInW,KAAK4S,OAAAA,GAE7DmI,EAAAA,CAAS,EAEX5E,EAAMsG,IAAM9G,EAAQQ,KACtB,CAAA,EAAA,CAEJ,CAEA,MAAA,UAAMkC,CAAU,MACdnL,EAAK,OACLC,EAAM,MACN1D,EAAK,QACLwL,CAAAA,EAAAA,CAOA,IAAMU,EAAU3V,KAAK8V,SACfiD,EAAa/Y,KAAK4V,YAAYD,EAAQzI,MAAQzD,EAAQwL,GAAW,CAAA,EACjE+D,EAAahZ,KAAK4V,YAAYD,EAAQxI,OAAS1D,EAAQwL,GAAW,CAAA,EAClEyH,GAAK3D,EAAa/Y,KAAK4V,WAAWD,EAAQwB,aAAa/Q,QAAUqD,EAAQwL,EAAU/H,GAAS,CAAA,EAC5FyP,GAAK3D,EAAahZ,KAAK4V,WAAWD,EAAQwB,aAAa/Q,QAAUqD,EAAQwL,EAAU9H,GAAU,CAAA,EAC7FyP,GAAK1P,EAAsC,EAA9ByI,EAAQwB,aAAa/Q,OAClCyW,GAAK1P,EAAuC,EAA9BwI,EAAQwB,aAAa/Q,OAEnC+P,EAAQnW,KAAK4S,QAAQd,SAASgC,gBAAgB,6BAA8B,OAAA,EAClFqC,EAAMxC,aAAa,OAAQ3T,KAAKkW,WAAa,EAAA,EAC7CC,EAAMxC,aAAa,aAAc3T,KAAKkW,WAAa,EAAA,EACnDC,EAAMxC,aAAa,IAAK9J,OAAO6S,EAAAA,CAAAA,EAC/BvG,EAAMxC,aAAa,IAAK9J,OAAO8S,EAAAA,CAAAA,EAC/BxG,EAAMxC,aAAa,QAAS,GAAGiJ,EAAAA,IAAAA,EAC/BzG,EAAMxC,aAAa,SAAU,GAAGkJ,EAAAA,IAAAA,EAEhC7c,KAAK0T,SAASvB,YAAYgE,CAAAA,CAC5B,CAEA,aAAAyC,CAAa,QACXjD,EAAO,MACP+C,EAAK,mBACLG,EAAkB,EAClBtR,EAAC,EACDC,EAAC,OACD2F,EAAM,MACND,EAAK,KACL0E,EAAAA,EAAAA,CAWA,IAAM7K,GAAOmG,EAAQC,EAASD,EAAQC,EAChCrG,GAAO9G,KAAK4S,QAAQd,SAASgC,gBAAgB,6BAA8B,MAAA,EAOjF,GANAhN,GAAK6M,aAAa,IAAK9J,OAAOtC,CAAAA,CAAAA,EAC9BT,GAAK6M,aAAa,IAAK9J,OAAOrC,CAAAA,CAAAA,EAC9BV,GAAK6M,aAAa,SAAU9J,OAAOsD,CAAAA,CAAAA,EACnCrG,GAAK6M,aAAa,QAAS9J,OAAOqD,CAAAA,CAAAA,EAClCpG,GAAK6M,aAAa,YAAa,mBAAmB/B,EAAAA,IAAAA,EAE9C+D,EAAS,CACX,IAAI8C,GACJ,GAAI9C,EAAQ5K,OFhiBR,SEiiBF0N,GAAWzY,KAAK4S,QAAQd,SAASgC,gBAAgB,6BAA8B,gBAAA,EAC/E2E,GAAS9E,aAAa,KAAM/B,EAAAA,EAC5B6G,GAAS9E,aAAa,gBAAiB,gBAAA,EACvC8E,GAAS9E,aAAa,KAAM9J,OAAOtC,EAAI2F,EAAQ,CAAA,CAAA,EAC/CuL,GAAS9E,aAAa,KAAM9J,OAAOrC,EAAI2F,EAAS,CAAA,CAAA,EAChDsL,GAAS9E,aAAa,KAAM9J,OAAOtC,EAAI2F,EAAQ,CAAA,CAAA,EAC/CuL,GAAS9E,aAAa,KAAM9J,OAAOrC,EAAI2F,EAAS,CAAA,CAAA,EAChDsL,GAAS9E,aAAa,IAAK9J,OAAO9C,GAAO,CAAA,CAAA,MACpC,CACL,IAAMuM,IAAaqC,EAAQrC,UAAY,GAAKuF,IAAuB,EAAIrW,KAAKoR,IACtEkJ,IAAoBxJ,EAAW,EAAI9Q,KAAKoR,KAAO,EAAIpR,KAAKoR,IAC1DmJ,GAAKxV,EAAI2F,EAAQ,EACjB8P,GAAKxV,EAAI2F,EAAS,EAClB8P,GAAK1V,EAAI2F,EAAQ,EACjBgQ,GAAK1V,EAAI2F,EAAS,EAGnB2P,IAAoB,GAAKA,IAAoB,IAAOta,KAAKoR,IACzDkJ,GAAmB,KAAOta,KAAKoR,IAAMkJ,IAAoB,EAAIta,KAAKoR,IAEnEmJ,IAAU7P,EAAQ,EAClB8P,IAAW7P,EAAS,EAAK3K,KAAK2a,IAAI7J,CAAAA,EAClC2J,IAAU/P,EAAQ,EAClBgQ,IAAW/P,EAAS,EAAK3K,KAAK2a,IAAI7J,CAAAA,GACzBwJ,GAAmB,IAAOta,KAAKoR,IAAMkJ,IAAoB,IAAOta,KAAKoR,IAC9EoJ,IAAU7P,EAAS,EACnB4P,IAAU7P,EAAQ,EAAI1K,KAAK2a,IAAI7J,CAAAA,EAC/B4J,IAAU/P,EAAS,EACnB8P,IAAU/P,EAAQ,EAAI1K,KAAK2a,IAAI7J,CAAAA,GACtBwJ,GAAmB,IAAOta,KAAKoR,IAAMkJ,IAAoB,KAAOta,KAAKoR,IAC9EmJ,IAAU7P,EAAQ,EAClB8P,IAAW7P,EAAS,EAAK3K,KAAK2a,IAAI7J,CAAAA,EAClC2J,IAAU/P,EAAQ,EAClBgQ,IAAW/P,EAAS,EAAK3K,KAAK2a,IAAI7J,CAAAA,GACzBwJ,GAAmB,KAAOta,KAAKoR,IAAMkJ,IAAoB,KAAOta,KAAKoR,KAC9EoJ,IAAU7P,EAAS,EACnB4P,IAAU7P,EAAQ,EAAI1K,KAAK2a,IAAI7J,CAAAA,EAC/B4J,IAAU/P,EAAS,EACnB8P,IAAU/P,EAAQ,EAAI1K,KAAK2a,IAAI7J,CAAAA,GAGjCmF,GAAWzY,KAAK4S,QAAQd,SAASgC,gBAAgB,6BAA8B,gBAAA,EAC/E2E,GAAS9E,aAAa,KAAM/B,EAAAA,EAC5B6G,GAAS9E,aAAa,gBAAiB,gBAAA,EACvC8E,GAAS9E,aAAa,KAAM9J,OAAOrH,KAAKuV,MAAMgF,EAAAA,CAAAA,CAAAA,EAC9CtE,GAAS9E,aAAa,KAAM9J,OAAOrH,KAAKuV,MAAMiF,EAAAA,CAAAA,CAAAA,EAC9CvE,GAAS9E,aAAa,KAAM9J,OAAOrH,KAAKuV,MAAMkF,EAAAA,CAAAA,CAAAA,EAC9CxE,GAAS9E,aAAa,KAAM9J,OAAOrH,KAAKuV,MAAMmF,EAAAA,CAAAA,CAAAA,CAChD,CAEAvH,EAAQyH,WAAW9L,SAAQ,CAAA,CAAGtN,OAAAA,EAAQ0U,MAAAA,EAAAA,IAAAA,CACpC,IAAM2E,GAAOrd,KAAK4S,QAAQd,SAASgC,gBAAgB,6BAA8B,MAAA,EACjFuJ,GAAK1J,aAAa,SAAa,IAAM3P,EAAT,GAAA,EAC5BqZ,GAAK1J,aAAa,aAAc+E,EAAAA,EAChCD,GAAStG,YAAYkL,EAAAA,CAAK,EAAA,EAG5BvW,GAAK6M,aAAa,OAAQ,SAAS/B,EAAAA,IAAAA,EACnC5R,KAAKiW,MAAM9D,YAAYsG,EAAAA,CACzB,MAAWC,GACT5R,GAAK6M,aAAa,OAAQ+E,CAAAA,EAG5B1Y,KAAK0T,SAASvB,YAAYrL,EAAAA,CAC5B,CAAA,CAtjBOmB,EAAAoO,cAAgB,EAAA,IAAA,EAAApO,EG5CzB+R,EACU,SCGJsD,EAAoB,CAAC,EAE3B,QAASvS,EAAO,EAAGA,GAAQ,GAAIA,IAC7BuS,EAAQvS,CAAAA,EAAQA,EAYlB,IC+CAvB,EA9BwC,CACtCuB,KAAMwS,EACN7G,MNrCQ,SMsCRxJ,MAAO,IACPC,OAAQ,IACRzK,KAAM,GACN0D,OAAQ,EACRgR,UAAW,CACT9W,WDzBJ6Z,ECyBwB,CAAA,EACpBhV,KAAAA,OACA5E,qBCvCC,GAAA,EDyCH4W,aAAc,CACZgE,WAAAA,GACAjD,mBAAAA,GACAZ,UAAW,GACXoE,YAAAA,OACAtV,OAAQ,CAAA,EAEV2P,YAAa,CACXhL,KAAM,SACN2N,MAAO,OACP1C,UAAAA,EAAW,EAEbwC,kBAAmB,CACjBT,MAAO,EACPW,MAAO,MAAA,CAAA,EE7DX,SAAS8E,EAAiB/E,EAAAA,CACxB,IAAMgF,EAAc,OAAH,OAAA,CAAA,EAAQhF,CAAAA,EAEzB,GAAA,CAAKgF,EAAYL,YAAAA,CAAeK,EAAYL,WAAWjb,OACrD,KAAM,6CAcR,OAXIsb,EAAYnK,SACdmK,EAAYnK,SAAWoK,OAAOD,EAAYnK,QAAAA,EAE1CmK,EAAYnK,SAAW,EAGzBmK,EAAYL,WAAaK,EAAYL,WAAWO,KAAKC,GAAkD,OAAD,OAAA,OAAA,OAAA,CAAA,EACjGA,CAAAA,EAAS,CACZ5Z,OAAQ0Z,OAAOE,EAAU5Z,MAAAA,CAAAA,CAAAA,EAAAA,EAGpByZ,CACT,CAEe,SAASI,EAAgBlI,EAAAA,CACtC,IAAMmI,EAAa,OAAH,OAAA,CAAA,EAAQnI,CAAAA,EAkDxB,OAhDAmI,EAAW5Q,MAAQwQ,OAAOI,EAAW5Q,KAAAA,EACrC4Q,EAAW3Q,OAASuQ,OAAOI,EAAW3Q,MAAAA,EACtC2Q,EAAW1X,OAASsX,OAAOI,EAAW1X,MAAAA,EACtC0X,EAAW3G,aAAe,OAAH,OAAA,OAAA,OAAA,CAAA,EAClB2G,EAAW3G,YAAAA,EAAY,CAC1Be,mBAAoB6F,EAAQD,EAAW3G,aAAae,mBACpDZ,UAAWoG,OAAOI,EAAW3G,aAAaG,SAAAA,EAC1ClR,OAAQsX,OAAOI,EAAW3G,aAAa/Q,MAAAA,CAAAA,CAAAA,EAGrC0X,EAAW1X,OAAS5D,KAAK8E,IAAIwW,EAAW5Q,MAAO4Q,EAAW3Q,MAAAA,IAC5D2Q,EAAW1X,OAAS5D,KAAK8E,IAAIwW,EAAW5Q,MAAO4Q,EAAW3Q,MAAAA,GAG5D2Q,EAAW/H,YAAc,OAAH,OAAA,CAAA,EACjB+H,EAAW/H,WAAAA,EAEZ+H,EAAW/H,YAAY0C,WACzBqF,EAAW/H,YAAY0C,SAAW+E,EAAiBM,EAAW/H,YAAY0C,QAAAA,GAGxEqF,EAAW/D,uBACb+D,EAAW/D,qBAAuB,OAAH,OAAA,CAAA,EAC1B+D,EAAW/D,oBAAAA,EAEZ+D,EAAW/D,qBAAqBtB,WAClCqF,EAAW/D,qBAAqBtB,SAAW+E,EAAiBM,EAAW/D,qBAAqBtB,QAAAA,IAI5FqF,EAAWtD,oBACbsD,EAAWtD,kBAAoB,OAAH,OAAA,CAAA,EACvBsD,EAAWtD,iBAAAA,EAEZsD,EAAWtD,kBAAkB/B,WAC/BqF,EAAWtD,kBAAkB/B,SAAW+E,EAAiBM,EAAWtD,kBAAkB/B,QAAAA,IAItFqF,EAAWtF,oBACbsF,EAAWtF,kBAAoB,OAAH,OAAA,CAAA,EACvBsF,EAAWtF,iBAAAA,EAEZsF,EAAWtF,kBAAkBC,WAC/BqF,EAAWtF,kBAAkBC,SAAW+E,EAAiBM,EAAWtF,kBAAkBC,QAAAA,IAInFqF,CACT,CAAA,IAAAxD,EAAAna,EAAA,GAAA,EAAAoa,EAAApa,EAAA,EAAAma,CAAA,EC5Ee,SAAS0D,EAAYC,EAAAA,CAClC,GAAA,CAAKA,EAAW,MAAM,IAAIC,MAAM,2BAAA,EAC5BD,EAAU,CAAA,IAAO,MACnBA,EAAYA,EAAU5V,UAAU,CAAA,GAElC,IAAM0C,EAAO,CACX,IAAO,YACP,IAAO,YACP,IAAO,2BACP,KAAQ,aACR,IAAO,aACP,IAAO,YACP,IAAO,gBACP,IAAO,aACP,KAAQ,aACR,KAAQ,aACR,IAAO,iBAAA,EACPkT,EAAUE,YAAAA,CAAAA,EAEZ,GAAA,CAAKpT,EACH,MAAM,IAAImT,MAAM,cAAcD,CAAAA,oBAAAA,EAGhC,OAAOlT,CACT,CCTe,MAAMqT,CAAAA,CAYnB,YAAYzI,EAAAA,CACNA,GAAS0I,MACXre,KAAK4S,QAAU,IAAI+C,EAAQ0I,MAAM,GAAI,CAAEC,UAAW,QAAA,CAAA,EAAY7L,OAE9DzS,KAAK4S,QAAUH,OAEjBzS,KAAK8V,SAAWH,EAAUkI,EAAgB5M,EAAUzH,EAAgBmM,CAAAA,CAAAA,EAA+BnM,EACnGxJ,KAAKue,OAAAA,CACP,CAEA,OAAA,gBAAuBC,EAAAA,CACjBA,IACFA,EAAUC,UAAY,GAE1B,CAEA,WAAAC,CACE,GAAA,CAAK1e,KAAKgX,IACR,OAEF,IAAM2H,EAAQ,IAAI,EAAM3e,KAAK8V,SAAU9V,KAAK4S,OAAAA,EAE5C5S,KAAK0S,KAAOiM,EAAMrI,WAAAA,EAClBtW,KAAK4e,mBAAqBD,EAAME,OAAO7e,KAAKgX,GAAAA,EAAKkE,MAAK,IAAA,CAAA,IAAAhb,EAC/CF,KAAK0S,QACVxS,EAAAF,KAAK8e,cAAU,MAAA5e,IAAV4e,QAAU5e,EAAA,KAAA,KAAGye,EAAMrI,WAAAA,EAActW,KAAK8V,QAAAA,EAAS,EAAA,CAExD,CAEA,cAAAiJ,CAAAA,IAAAA,EAAAA,EACO/e,KAAKgX,MAIkB,GAAxB/W,EAAAD,KAAK8V,SAASmF,cAAU,MAAAhb,IAAVgb,SAAUhb,EAAEob,cAC5Brb,KAAKgf,YAAchf,KAAK8V,SAASmF,WAAWI,aAAarb,KAAK8V,SAAS5I,MAAOlN,KAAK8V,SAAS3I,MAAAA,EAC5FnN,KAAKgf,YAAY9R,MAAQlN,KAAK8V,SAAS5I,MACvClN,KAAKgf,YAAY7R,OAASnN,KAAK8V,SAAS3I,SAExCnN,KAAKif,WAAanN,SAASC,cAAc,QAAA,EACzC/R,KAAKif,WAAW/R,MAAQlN,KAAK8V,SAAS5I,MACtClN,KAAKif,WAAW9R,OAASnN,KAAK8V,SAAS3I,QAGzCnN,KAAK0e,UAAAA,EACL1e,KAAKkf,uBAAwBhf,EAAAF,KAAK4e,sBAAkB,MAAA1e,IAAlB0e,OAAkB,OAAA1e,EAAEgb,MAAK,IAAA,CAAA,IAAAjb,EACzD,GAAA,CAAKD,KAAK0S,KAAM,OAEhB,IAAMF,EAAMxS,KAAK0S,KACXyM,EAAM,IAAInf,KAAK4S,QAAQwM,gBAAgBC,kBAAkB7M,CAAAA,EACzD8M,EAAQC,KAAKJ,CAAAA,EACbK,EAAU,QAAQxB,EAAY,KAAA,CAAA,WAAiBsB,CAAAA,GAErD,GAA4B,GAAxBrf,EAAAD,KAAK8V,SAASmF,cAAU,MAAAhb,IAAVgb,SAAUhb,EAAEgX,UAC5B,OAAOjX,KAAK8V,SAASmF,WAAWhE,UAAUuI,CAAAA,EAAStE,MAAM/E,IAAAA,CAAAA,IAAAA,GAAAA,GAEvDA,GAAMjJ,MAAQlN,KAAK8V,SAAS5I,MAC5BiJ,GAAMhJ,OAASnN,KAAK8V,SAAS3I,QAC7BhN,IAAAD,GAAAF,KAAKgf,eAAW,MAAA9e,KAAX8e,OAAW,OAAA9e,GAAEob,WAAW,IAAA,KAAK,MAAAnb,KAAL,QAAKA,GAAEkY,UAAUlC,GAAO,EAAG,CAAA,CAAE,EAAA,EAEvD,CACL,IAAMA,GAAQ,IAAInW,KAAK4S,QAAQ6I,MAE/B,OAAO,IAAIX,SAASC,IAAAA,CAClB5E,GAAMwF,OAAS,IAAA,CAAA,IAAAxb,GAAAC,IACbA,IAAAD,GAAAH,KAAKif,cAAU,MAAA9e,KAAV8e,OAAU,OAAA9e,GAAEmb,WAAW,IAAA,KAAK,MAAAlb,KAAL,QAAKA,GAAEiY,UAAUlC,GAAO,EAAG,CAAA,EACvD4E,GAAAA,CAAS,EAGX5E,GAAMsG,IAAM+C,CAAO,EAAA,CAEvB,CAAA,EAAA,EAEJ,CAEA,MAAA,YAAkBvB,EAA2B,MAAA,CAC3C,GAAA,CAAKje,KAAKgX,IAAK,KAAM,mBAErB,OAAIiH,EAAUE,YAAAA,IAAkB,OACzBne,KAAK0S,MAAS1S,KAAK4e,oBACtB5e,KAAK0e,UAAAA,EAAAA,MAED1e,KAAK4e,mBACJ5e,KAAK0S,QAEN1S,KAAKif,YAAcjf,KAAKgf,cAAiBhf,KAAKkf,uBAClDlf,KAAK+e,aAAAA,EAAAA,MAED/e,KAAKkf,sBACJlf,KAAKif,YAAcjf,KAAKgf,YAEnC,CAEA,OAAOrJ,EAAAA,CACLyI,EAAcqB,gBAAgBzf,KAAK0f,UAAAA,EACnC1f,KAAK8V,SAAWH,EAAUkI,EAAgB5M,EAAUjR,KAAK8V,SAAUH,CAAAA,CAAAA,EAA+B3V,KAAK8V,SAElG9V,KAAK8V,SAASpT,OAInB1C,KAAKgX,IAAMuD,EAAA,EAAOva,KAAK8V,SAASsB,UAAU9W,WAAYN,KAAK8V,SAASsB,UAAU7W,oBAAAA,EAC9EP,KAAKgX,IAAI9R,QAAQlF,KAAK8V,SAASpT,KAAM1C,KAAK8V,SAASsB,UAAUjS,OC9HlD,SAAiBzC,EAAAA,CAC9B,OAAA,GAAQ,CACN,IAAK,WAAWzB,KAAKyB,CAAAA,EACnB,MtBCK,UsBAP,IAAK,wBAAwBzB,KAAKyB,CAAAA,EAChC,MtBAU,esBCZ,QACE,MtBDE,MAAA,CsBGR,GDqHiF1C,KAAK8V,SAASpT,IAAAA,CAAAA,EAC3F1C,KAAKgX,IAAIpR,KAAAA,EAEL5F,KAAK8V,SAAS/K,OAASwS,EACzBvd,KAAK+e,aAAAA,EAEL/e,KAAK0e,UAAAA,EAGP1e,KAAK2f,OAAO3f,KAAK0f,UAAAA,EACnB,CAEA,OAAOlB,EAAAA,CACL,GAAKA,EAAL,CAIA,GAAqC,OAA1BA,EAAUrM,aAAgB,WACnC,KAAM,wCAGJnS,KAAK8V,SAAS/K,OAASwS,EACrBvd,KAAKif,YACPT,EAAUrM,YAAYnS,KAAKif,UAAAA,EAGzBjf,KAAK0S,MACP8L,EAAUrM,YAAYnS,KAAK0S,IAAAA,EAI/B1S,KAAK0f,WAAalB,CAhBlB,CAiBF,CAEA,eAAeP,EAAAA,CACb,GAAA,CAAKA,EACH,KAAM,wCAGRje,KAAK8e,WAAab,EAClBje,KAAKue,OAAAA,CACP,CAEA,iBAAAqB,CACE5f,KAAK8e,WAAAA,OACL9e,KAAKue,OAAAA,CACP,CAEA,MAAA,WAAiBN,EAA2B,MAAA,CAC1C,GAAA,CAAKje,KAAKgX,IAAK,KAAM,mBACrB,IAAMsB,EAAAA,MAAgBtY,KAAK6f,YAAY5B,CAAAA,EACjC6B,EAAW9B,EAAYC,CAAAA,EAE7B,GAAA,CAAK3F,EACH,OAAO,KAGT,GAAI2F,EAAUE,YAAAA,IAAkB,MAAO,CACrC,IAEM4B,EAAY;EAFC,IAAI/f,KAAK4S,QAAQwM,gBACVC,kBAAkB/G,CAAAA,CAAAA,GAE5C,OAAoB,OAAT0H,KAAS,KAAgBhgB,KAAK8V,SAASuI,MAGzC4B,OAAOC,KAAKH,CAAAA,EAFZ,IAAIC,KAAK,CAACD,CAAAA,EAAY,CAAEhV,KAAM+U,CAAAA,CAAAA,CAIzC,CACE,OAAO,IAAIhF,SAASC,GAAAA,CAClB,IAAMK,EAAS9C,EACf,GAAI,aAAc8C,EAEhB,GAAI0E,IAAa,YACf/E,EAAQK,EAAO+E,SAASL,CAAAA,CAAAA,UACfA,IAAa,aACtB/E,EAAQK,EAAO+E,SAASL,CAAAA,CAAAA,MACnB,CAAA,GAAIA,IAAa,kBAGtB,MAAM5B,MAAM,uBAAA,EAFZnD,EAAQK,EAAO+E,SAASL,CAAAA,CAAAA,CAG1B,KACS,WAAY1E,GACrBhb,EAASggB,OAAOrF,EAAS+E,EAAU,CAAA,CACrC,EAAA,CAGN,CAEA,MAAA,SAAeO,EAAAA,CACb,GAAA,CAAKrgB,KAAKgX,IAAK,KAAM,mBACrB,GAAoB,OAATgJ,KAAS,IAAa,KAAM,uDACvC,IAAI/B,EAAY,MACZrM,EAAO,KAGoB,OAApByO,GAAoB,UAC7BpC,EAAYoC,EACZC,QAAQC,KACN,6HAAA,GAEkC,OAApBF,GAAoB,UAAYA,IAAoB,OAChEA,EAAgBzO,OAClBA,EAAOyO,EAAgBzO,MAErByO,EAAgBpC,YAClBA,EAAYoC,EAAgBpC,YAIhC,IAAM3F,EAAAA,MAAgBtY,KAAK6f,YAAY5B,CAAAA,EAEvC,GAAK3F,EAIL,GAAI2F,EAAUE,YAAAA,IAAkB,MAAO,CAErC,IAAI/M,EADe,IAAIgO,gBACCC,kBAAkB/G,CAAAA,EAE1ClH,EAAS;EAA8CA,EAEvDM,EADY,QAAQsM,EAAYC,CAAAA,CAAAA,kBAA4BuC,mBAAmBpP,CAAAA,CAAAA,GAC9D,GAAGQ,CAAAA,MAAAA,CACtB,MAEEF,EADa4G,EAA8BiD,UAAUyC,EAAYC,CAAAA,CAAAA,EAChD,GAAGrM,CAAAA,IAAQqM,CAAAA,EAAAA,CAEhC,CAAA,CEnOF,IAAAvD,EAAArQ,CAAA,GAAA,EAAAjK,EAAA,OAAA,GAAA,EAAA,IC8qDA,SAASqgB,GAAkBC,EAAQ,CAIlC,QAAUC,EAAID,EAAM,OAAS,EAAGC,GAAK,EAAG,EAAGA,EAE1C,GAAKD,EAAOC,CAAE,GAAK,MAAQ,MAAO,GAInC,MAAO,EAER,CAcA,SAASC,GAAeC,EAAMC,EAAS,CAEtC,OAAO,IAAIC,IAAcF,CAAK,EAAGC,CAAO,CAEzC,CAQA,SAASE,GAAcN,EAAQ,CAE9B,OAAO,YAAY,OAAQA,CAAM,GAAK,EAAIA,aAAiB,SAE5D,CAEA,SAASO,GAAiBC,EAAO,CAEhC,OAAO,SAAS,gBAAiB,+BAAgCA,CAAK,CAEvE,CAEA,SAASC,IAAsB,CAE9B,IAAMC,EAASH,GAAiB,QAAS,EACzC,OAAAG,EAAO,MAAM,QAAU,QAChBA,CAER,CAMA,SAASC,GAAoBC,EAAK,CAEjCC,GAAsBD,CAEvB,CAEA,SAASE,IAAqB,CAE7B,OAAOD,EAER,CAEA,SAASE,MAAQC,EAAS,CAEzB,IAAMC,EAAU,SAAWD,EAAO,MAAM,EAEnCH,GAEJA,GAAqB,MAAOI,EAAS,GAAGD,CAAO,EAI/C,QAAQ,IAAKC,EAAS,GAAGD,CAAO,CAIlC,CAEA,SAASE,MAASF,EAAS,CAE1B,IAAMC,EAAU,SAAWD,EAAO,MAAM,EAEnCH,GAEJA,GAAqB,OAAQI,EAAS,GAAGD,CAAO,EAIhD,QAAQ,KAAMC,EAAS,GAAGD,CAAO,CAInC,CAEA,SAASG,MAAUH,EAAS,CAE3B,IAAMC,EAAU,SAAWD,EAAO,MAAM,EAEnCH,GAEJA,GAAqB,QAASI,EAAS,GAAGD,CAAO,EAIjD,QAAQ,MAAOC,EAAS,GAAGD,CAAO,CAIpC,CAEA,SAASI,MAAaJ,EAAS,CAE9B,IAAMC,EAAUD,EAAO,KAAM,GAAI,EAE5BC,KAAWI,KAEhBA,GAAQJ,CAAQ,EAAI,GAEpBC,GAAM,GAAGF,CAAO,EAEjB,CAEA,SAASM,GAAYC,EAAIC,EAAMC,EAAW,CAEzC,OAAO,IAAI,QAAS,SAAWC,EAASC,EAAS,CAEhD,SAASC,GAAQ,CAEhB,OAASL,EAAG,eAAgBC,EAAMD,EAAG,wBAAyB,CAAE,EAAI,CAEnE,KAAKA,EAAG,YACPI,EAAO,EACP,MAED,KAAKJ,EAAG,gBACP,WAAYK,EAAOH,CAAS,EAC5B,MAED,QACCC,EAAQ,CAEV,CAED,CAEA,WAAYE,EAAOH,CAAS,CAE7B,CAAE,CAEH,CAiJA,SAASI,IAAe,CAIvB,IAAMC,EAAK,KAAK,OAAO,EAAI,WAAa,EAClCC,EAAK,KAAK,OAAO,EAAI,WAAa,EAClCC,EAAK,KAAK,OAAO,EAAI,WAAa,EAClCC,EAAK,KAAK,OAAO,EAAI,WAAa,EAOxC,OANaC,GAAMJ,EAAK,GAAK,EAAII,GAAMJ,GAAM,EAAI,GAAK,EAAII,GAAMJ,GAAM,GAAK,GAAK,EAAII,GAAMJ,GAAM,GAAK,GAAK,EAAI,IAC5GI,GAAMH,EAAK,GAAK,EAAIG,GAAMH,GAAM,EAAI,GAAK,EAAI,IAAMG,GAAMH,GAAM,GAAK,GAAO,EAAK,EAAIG,GAAMH,GAAM,GAAK,GAAK,EAAI,IAC9GG,GAAMF,EAAK,GAAO,GAAK,EAAIE,GAAMF,GAAM,EAAI,GAAK,EAAI,IAAME,GAAMF,GAAM,GAAK,GAAK,EAAIE,GAAMF,GAAM,GAAK,GAAK,EAC1GE,GAAMD,EAAK,GAAK,EAAIC,GAAMD,GAAM,EAAI,GAAK,EAAIC,GAAMD,GAAM,GAAK,GAAK,EAAIC,GAAMD,GAAM,GAAK,GAAK,GAGnF,YAAY,CAEzB,CAUA,SAASE,GAAOC,EAAOC,EAAKC,EAAM,CAEjC,OAAO,KAAK,IAAKD,EAAK,KAAK,IAAKC,EAAKF,CAAM,CAAE,CAE9C,CAUA,SAASG,GAAiBC,EAAGC,EAAI,CAIhC,OAAWD,EAAIC,EAAMA,GAAMA,CAE5B,CAaA,SAASC,IAAWC,EAAGC,EAAIC,EAAIC,EAAIC,EAAK,CAEvC,OAAOD,GAAOH,EAAIC,IAASG,EAAKD,IAASD,EAAKD,EAE/C,CAWA,SAASI,IAAaL,EAAGM,EAAGb,EAAQ,CAInC,OAAKO,IAAMM,GAEDb,EAAQO,IAAQM,EAAIN,GAItB,CAIT,CAWA,SAASO,GAAMP,EAAGM,EAAG,EAAI,CAExB,OAAS,EAAI,GAAMN,EAAI,EAAIM,CAE5B,CAcA,SAASE,IAAMR,EAAGM,EAAGG,EAAQC,EAAK,CAEjC,OAAOH,GAAMP,EAAGM,EAAG,EAAI,KAAK,IAAK,CAAEG,EAASC,CAAG,CAAE,CAElD,CASA,SAASC,IAAUX,EAAGY,EAAS,EAAI,CAIlC,OAAOA,EAAS,KAAK,IAAKhB,GAAiBI,EAAGY,EAAS,CAAE,EAAIA,CAAO,CAErE,CAcA,SAASC,IAAYb,EAAGN,EAAKC,EAAM,CAElC,OAAKK,GAAKN,EAAa,EAClBM,GAAKL,EAAa,GAEvBK,GAAMA,EAAIN,IAAUC,EAAMD,GAEnBM,EAAIA,GAAM,EAAI,EAAIA,GAE1B,CAWA,SAASc,IAAcd,EAAGN,EAAKC,EAAM,CAEpC,OAAKK,GAAKN,EAAa,EAClBM,GAAKL,EAAa,GAEvBK,GAAMA,EAAIN,IAAUC,EAAMD,GAEnBM,EAAIA,EAAIA,GAAMA,GAAMA,EAAI,EAAI,IAAO,IAE3C,CASA,SAASe,IAASC,EAAKC,EAAO,CAE7B,OAAOD,EAAM,KAAK,MAAO,KAAK,OAAO,GAAMC,EAAOD,EAAM,EAAI,CAE7D,CASA,SAASE,IAAWF,EAAKC,EAAO,CAE/B,OAAOD,EAAM,KAAK,OAAO,GAAMC,EAAOD,EAEvC,CAQA,SAASG,IAAiBC,EAAQ,CAEjC,OAAOA,GAAU,GAAM,KAAK,OAAO,EAEpC,CAQA,SAASC,IAAcC,EAAI,CAErBA,IAAM,SAAYC,GAAQD,GAI/B,IAAIE,EAAID,IAAS,WAEjB,OAAAC,EAAI,KAAK,KAAMA,EAAIA,IAAM,GAAIA,EAAI,CAAE,EAEnCA,GAAKA,EAAI,KAAK,KAAMA,EAAIA,IAAM,EAAGA,EAAI,EAAG,IAE7BA,EAAIA,IAAM,MAAS,GAAM,UAErC,CAQA,SAASC,IAAUC,EAAU,CAE5B,OAAOA,EAAUC,EAElB,CAQA,SAASC,IAAUC,EAAU,CAE5B,OAAOA,EAAUC,EAElB,CAQA,SAASC,IAActC,EAAQ,CAE9B,OAASA,EAAUA,EAAQ,KAAU,GAAKA,IAAU,CAErD,CAQA,SAASuC,IAAgBvC,EAAQ,CAEhC,OAAO,KAAK,IAAK,EAAG,KAAK,KAAM,KAAK,IAAKA,CAAM,EAAI,KAAK,GAAI,CAAE,CAE/D,CAQA,SAASwC,IAAiBxC,EAAQ,CAEjC,OAAO,KAAK,IAAK,EAAG,KAAK,MAAO,KAAK,IAAKA,CAAM,EAAI,KAAK,GAAI,CAAE,CAEhE,CAeA,SAASyC,IAA8BC,EAAGC,EAAGC,EAAGC,EAAGC,EAAQ,CAE1D,IAAMC,EAAM,KAAK,IACXC,EAAM,KAAK,IAEXC,EAAKF,EAAKH,EAAI,CAAE,EAChBM,EAAKF,EAAKJ,EAAI,CAAE,EAEhBO,EAAMJ,GAAOJ,EAAIE,GAAM,CAAE,EACzBO,EAAMJ,GAAOL,EAAIE,GAAM,CAAE,EAEzBQ,EAAON,GAAOJ,EAAIE,GAAM,CAAE,EAC1BS,EAAON,GAAOL,EAAIE,GAAM,CAAE,EAE1BU,EAAOR,GAAOF,EAAIF,GAAM,CAAE,EAC1Ba,EAAOR,GAAOH,EAAIF,GAAM,CAAE,EAEhC,OAASG,EAAQ,CAEhB,IAAK,MACJJ,EAAE,IAAKO,EAAKG,EAAKF,EAAKG,EAAMH,EAAKI,EAAML,EAAKE,CAAI,EAChD,MAED,IAAK,MACJT,EAAE,IAAKQ,EAAKI,EAAML,EAAKG,EAAKF,EAAKG,EAAMJ,EAAKE,CAAI,EAChD,MAED,IAAK,MACJT,EAAE,IAAKQ,EAAKG,EAAMH,EAAKI,EAAML,EAAKG,EAAKH,EAAKE,CAAI,EAChD,MAED,IAAK,MACJT,EAAE,IAAKO,EAAKG,EAAKF,EAAKM,EAAMN,EAAKK,EAAMN,EAAKE,CAAI,EAChD,MAED,IAAK,MACJT,EAAE,IAAKQ,EAAKK,EAAMN,EAAKG,EAAKF,EAAKM,EAAMP,EAAKE,CAAI,EAChD,MAED,IAAK,MACJT,EAAE,IAAKQ,EAAKM,EAAMN,EAAKK,EAAMN,EAAKG,EAAKH,EAAKE,CAAI,EAChD,MAED,QACCrE,GAAM,4EAA8EgE,CAAM,CAE5F,CAED,CASA,SAASW,GAAazD,EAAOpC,EAAQ,CAEpC,OAASA,EAAM,YAAc,CAE5B,KAAK,aAEJ,OAAOoC,EAER,KAAK,YAEJ,OAAOA,EAAQ,WAEhB,KAAK,YAEJ,OAAOA,EAAQ,MAEhB,KAAK,WAEJ,OAAOA,EAAQ,IAEhB,KAAK,WAEJ,OAAO,KAAK,IAAKA,EAAQ,WAAc,EAAG,EAE3C,KAAK,WAEJ,OAAO,KAAK,IAAKA,EAAQ,MAAS,EAAG,EAEtC,KAAK,UAEJ,OAAO,KAAK,IAAKA,EAAQ,IAAO,EAAG,EAEpC,QAEC,MAAM,IAAI,MAAO,yBAA0B,CAE7C,CAED,CASA,SAAS0D,GAAW1D,EAAOpC,EAAQ,CAElC,OAASA,EAAM,YAAc,CAE5B,KAAK,aAEJ,OAAOoC,EAER,KAAK,YAEJ,OAAO,KAAK,MAAOA,EAAQ,UAAa,EAEzC,KAAK,YAEJ,OAAO,KAAK,MAAOA,EAAQ,KAAQ,EAEpC,KAAK,WAEJ,OAAO,KAAK,MAAOA,EAAQ,GAAM,EAElC,KAAK,WAEJ,OAAO,KAAK,MAAOA,EAAQ,UAAa,EAEzC,KAAK,WAEJ,OAAO,KAAK,MAAOA,EAAQ,KAAQ,EAEpC,KAAK,UAEJ,OAAO,KAAK,MAAOA,EAAQ,GAAM,EAElC,QAEC,MAAM,IAAI,MAAO,yBAA0B,CAE7C,CAED,CA81HA,SAAS2D,KAAwB,CAEhC,IAAMC,EAAkB,CAEvB,QAAS,GAET,kBAAmBC,GAoBnB,OAAQ,CAAC,EAET,QAAS,SAAWC,EAAOC,EAAkBC,EAAmB,CAE/D,OAAK,KAAK,UAAY,IAASD,IAAqBC,GAAoB,CAAED,GAAoB,CAAEC,IAM3F,KAAK,OAAQD,CAAiB,EAAE,WAAaE,KAEjDH,EAAM,EAAII,GAAcJ,EAAM,CAAE,EAChCA,EAAM,EAAII,GAAcJ,EAAM,CAAE,EAChCA,EAAM,EAAII,GAAcJ,EAAM,CAAE,GAI5B,KAAK,OAAQC,CAAiB,EAAE,YAAc,KAAK,OAAQC,CAAiB,EAAE,YAElFF,EAAM,aAAc,KAAK,OAAQC,CAAiB,EAAE,KAAM,EAC1DD,EAAM,aAAc,KAAK,OAAQE,CAAiB,EAAE,OAAQ,GAIxD,KAAK,OAAQA,CAAiB,EAAE,WAAaC,KAEjDH,EAAM,EAAIK,GAAcL,EAAM,CAAE,EAChCA,EAAM,EAAIK,GAAcL,EAAM,CAAE,EAChCA,EAAM,EAAIK,GAAcL,EAAM,CAAE,IAI1BA,CAER,EAEA,oBAAqB,SAAWA,EAAOE,EAAmB,CAEzD,OAAO,KAAK,QAASF,EAAO,KAAK,kBAAmBE,CAAiB,CAEtE,EAEA,oBAAqB,SAAWF,EAAOC,EAAmB,CAEzD,OAAO,KAAK,QAASD,EAAOC,EAAkB,KAAK,iBAAkB,CAEtE,EAEA,aAAc,SAAWK,EAAa,CAErC,OAAO,KAAK,OAAQA,CAAW,EAAE,SAElC,EAEA,YAAa,SAAWA,EAAa,CAEpC,OAAKA,IAAeC,GAAsBC,GAEnC,KAAK,OAAQF,CAAW,EAAE,QAElC,EAEA,mBAAoB,SAAWA,EAAa,CAE3C,OAAO,KAAK,OAAQA,CAAW,EAAE,uBAAuB,iBAAmB,UAE5E,EAEA,yBAA0B,SAAWG,EAAQH,EAAa,KAAK,kBAAoB,CAElF,OAAOG,EAAO,UAAW,KAAK,OAAQH,CAAW,EAAE,qBAAsB,CAE1E,EAEA,OAAQ,SAAWI,EAAc,CAEhC,OAAO,OAAQ,KAAK,OAAQA,CAAY,CAEzC,EAIA,WAAY,SAAWC,EAAcV,EAAkBC,EAAmB,CAEzE,OAAOS,EACL,KAAM,KAAK,OAAQV,CAAiB,EAAE,KAAM,EAC5C,SAAU,KAAK,OAAQC,CAAiB,EAAE,OAAQ,CAErD,EAEA,4BAA6B,SAAWI,EAAa,CAEpD,OAAO,KAAK,OAAQA,CAAW,EAAE,uBAAuB,uBAEzD,EAEA,qBAAsB,SAAWA,EAAa,KAAK,kBAAoB,CAEtE,OAAO,KAAK,OAAQA,CAAW,EAAE,wBAAwB,gBAE1D,EAIA,sBAAuB,SAAWN,EAAOE,EAAmB,CAE3D,OAAAhF,GAAU,uFAAwF,EAE3F4E,EAAgB,oBAAqBE,EAAOE,CAAiB,CAErE,EAEA,oBAAqB,SAAWF,EAAOC,EAAmB,CAEzD,OAAA/E,GAAU,qFAAsF,EAEzF4E,EAAgB,oBAAqBE,EAAOC,CAAiB,CAErE,CAED,EAMMW,EAAmB,CAAE,IAAO,IAAO,GAAO,GAAO,IAAO,GAAM,EAC9DC,EAAgC,CAAE,MAAQ,MAAQ,KAAO,EACzDC,EAAM,CAAE,MAAQ,IAAO,EAE7B,OAAAhB,EAAgB,OAAQ,CAEvB,CAAEC,EAAqB,EAAG,CACzB,UAAWa,EACX,WAAYE,EACZ,SAAUN,GACV,MAAOO,GACP,QAASC,GACT,sBAAuBH,EACvB,wBAAyB,CAAE,iBAAkBI,EAAe,EAC5D,uBAAwB,CAAE,wBAAyBA,EAAe,CACnE,EAEA,CAAEA,EAAe,EAAG,CACnB,UAAWL,EACX,WAAYE,EACZ,SAAUX,GACV,MAAOY,GACP,QAASC,GACT,sBAAuBH,EACvB,uBAAwB,CAAE,wBAAyBI,EAAe,CACnE,CAED,CAAE,EAEKnB,CAER,CAIA,SAASM,GAAcrB,EAAI,CAE1B,OAASA,EAAI,OAAYA,EAAI,YAAe,KAAK,IAAKA,EAAI,YAAe,YAAc,GAAI,CAE5F,CAEA,SAASsB,GAActB,EAAI,CAE1B,OAASA,EAAI,SAAcA,EAAI,MAAQ,MAAU,KAAK,IAAKA,EAAG,MAAQ,EAAM,IAE7E,CAsUA,SAASmC,GAAgBC,EAAQ,CAEhC,OAAO,OAAO,iBAAqB,KAAeA,aAAiB,kBAChE,OAAO,kBAAsB,KAAeA,aAAiB,mBAC7D,OAAO,YAAgB,KAAeA,aAAiB,YAIlDC,GAAW,WAAYD,CAAM,EAI/BA,EAAM,KAIH,CACN,KAAM,MAAM,KAAMA,EAAM,IAAK,EAC7B,MAAOA,EAAM,MACb,OAAQA,EAAM,OACd,KAAMA,EAAM,KAAK,YAAY,IAC9B,GAIAnG,GAAM,uCAAwC,EACvC,CAAC,EAMX,CAiyGA,SAASqG,GAAYC,EAAMC,EAAIC,EAAIC,EAAIC,EAAU,CAEhD,QAAU3H,EAAI,EAAG4H,EAAIL,EAAK,OAAS,EAAGvH,GAAK4H,EAAG5H,GAAK,EAAI,CAEtD6H,GAAU,UAAWN,EAAMvH,CAAE,EAE7B,IAAM8H,EAAIH,EAAQ,EAAI,KAAK,IAAKE,GAAU,CAAE,EAAIF,EAAQ,EAAI,KAAK,IAAKE,GAAU,CAAE,EAAIF,EAAQ,EAAI,KAAK,IAAKE,GAAU,CAAE,EAElHE,EAAKP,EAAG,IAAKK,EAAU,EACvBG,EAAKP,EAAG,IAAKI,EAAU,EACvBI,EAAKP,EAAG,IAAKG,EAAU,EAE7B,GAAK,KAAK,IAAK,CAAE,KAAK,IAAKE,EAAIC,EAAIC,CAAG,EAAG,KAAK,IAAKF,EAAIC,EAAIC,CAAG,CAAE,EAAIH,EAInE,MAAO,EAIT,CAEA,MAAO,EAER,CA4+JA,SAASI,GAASC,EAAGtD,EAAG,EAAI,CAI3B,OAFK,EAAI,IAAI,GAAK,GACb,EAAI,IAAI,GAAK,GACb,EAAI,EAAI,EAAWsD,GAAMtD,EAAIsD,GAAM,EAAI,EACvC,EAAI,EAAI,EAAWtD,EACnB,EAAI,EAAI,EAAWsD,GAAMtD,EAAIsD,GAAM,GAAM,EAAI,EAAI,GAC/CA,CAER,CAsoEA,SAASC,KAAkB,CAI1B,IAAMjI,EAAS,IAAI,YAAa,CAAE,EAC5BkI,EAAY,IAAI,aAAclI,CAAO,EACrCmI,EAAa,IAAI,YAAanI,CAAO,EAErCoI,EAAY,IAAI,YAAa,GAAI,EACjCC,EAAa,IAAI,YAAa,GAAI,EAExC,QAAUxI,EAAI,EAAGA,EAAI,IAAK,EAAGA,EAAI,CAEhC,IAAMyI,EAAIzI,EAAI,IAITyI,EAAI,KAERF,EAAWvI,CAAE,EAAI,EACjBuI,EAAWvI,EAAI,GAAM,EAAI,MACzBwI,EAAYxI,CAAE,EAAI,GAClBwI,EAAYxI,EAAI,GAAM,EAAI,IAIfyI,EAAI,KAEfF,EAAWvI,CAAE,EAAI,MAAY,CAAEyI,EAAI,GACnCF,EAAWvI,EAAI,GAAM,EAAM,MAAY,CAAEyI,EAAI,GAAS,MACtDD,EAAYxI,CAAE,EAAI,CAAEyI,EAAI,EACxBD,EAAYxI,EAAI,GAAM,EAAI,CAAEyI,EAAI,GAIrBA,GAAK,IAEhBF,EAAWvI,CAAE,EAAMyI,EAAI,IAAQ,GAC/BF,EAAWvI,EAAI,GAAM,EAAQyI,EAAI,IAAQ,GAAO,MAChDD,EAAYxI,CAAE,EAAI,GAClBwI,EAAYxI,EAAI,GAAM,EAAI,IAIfyI,EAAI,KAEfF,EAAWvI,CAAE,EAAI,MACjBuI,EAAWvI,EAAI,GAAM,EAAI,MACzBwI,EAAYxI,CAAE,EAAI,GAClBwI,EAAYxI,EAAI,GAAM,EAAI,KAM1BuI,EAAWvI,CAAE,EAAI,MACjBuI,EAAWvI,EAAI,GAAM,EAAI,MACzBwI,EAAYxI,CAAE,EAAI,GAClBwI,EAAYxI,EAAI,GAAM,EAAI,GAI5B,CAIA,IAAM0I,EAAgB,IAAI,YAAa,IAAK,EACtCC,EAAgB,IAAI,YAAa,EAAG,EACpCC,EAAc,IAAI,YAAa,EAAG,EAExC,QAAU5I,EAAI,EAAGA,EAAI,KAAM,EAAGA,EAAI,CAEjC,IAAIwC,EAAIxC,GAAK,GACTyI,EAAI,EAGR,MAAUjG,EAAI,WAAiB,GAE9BA,IAAM,EACNiG,GAAK,QAINjG,GAAK,SACLiG,GAAK,UAELC,EAAe1I,CAAE,EAAIwC,EAAIiG,CAE1B,CAEA,QAAUzI,EAAI,KAAMA,EAAI,KAAM,EAAGA,EAEhC0I,EAAe1I,CAAE,EAAI,WAAiBA,EAAI,MAAU,IAIrD,QAAUA,EAAI,EAAGA,EAAI,GAAI,EAAGA,EAE3B2I,EAAe3I,CAAE,EAAIA,GAAK,GAI3B2I,EAAe,EAAG,EAAI,WACtBA,EAAe,EAAG,EAAI,WAEtB,QAAU3I,EAAI,GAAIA,EAAI,GAAI,EAAGA,EAE5B2I,EAAe3I,CAAE,EAAI,YAAiBA,EAAI,IAAQ,IAInD2I,EAAe,EAAG,EAAI,WAEtB,QAAU3I,EAAI,EAAGA,EAAI,GAAI,EAAGA,EAEtBA,IAAM,KAEV4I,EAAa5I,CAAE,EAAI,MAMrB,MAAO,CACN,UAAWqI,EACX,WAAYC,EACZ,UAAWC,EACX,WAAYC,EACZ,cAAeE,EACf,cAAeC,EACf,YAAaC,CACd,CAED,CASA,SAASC,GAAaC,EAAM,CAEtB,KAAK,IAAKA,CAAI,EAAI,OAAQ7H,GAAM,8CAA+C,EAEpF6H,EAAM5G,GAAO4G,EAAK,OAAQ,KAAM,EAEhCC,GAAQ,UAAW,CAAE,EAAID,EACzB,IAAME,EAAID,GAAQ,WAAY,CAAE,EAC1BN,EAAMO,GAAK,GAAO,IACxB,OAAOD,GAAQ,UAAWN,CAAE,IAAQO,EAAI,UAAgBD,GAAQ,WAAYN,CAAE,EAE/E,CASA,SAASQ,GAAeH,EAAM,CAE7B,IAAMtG,EAAIsG,GAAO,GACjB,OAAAC,GAAQ,WAAY,CAAE,EAAIA,GAAQ,cAAeA,GAAQ,YAAavG,CAAE,GAAMsG,EAAM,KAAQ,EAAIC,GAAQ,cAAevG,CAAE,EAClHuG,GAAQ,UAAW,CAAE,CAE7B,CAu1FA,SAASG,IAAqBC,EAAQC,EAAUC,EAAWC,EAAKC,EAAIC,EAAIC,EAAIC,EAAQ,CAEnF,IAAIC,EAYJ,GAVKP,EAAS,OAASQ,GAEtBD,EAAYL,EAAI,kBAAmBG,EAAID,EAAID,EAAI,GAAMG,CAAM,EAI3DC,EAAYL,EAAI,kBAAmBC,EAAIC,EAAIC,EAAML,EAAS,OAASS,GAAaH,CAAM,EAIlFC,IAAc,KAAO,OAAO,KAEjCG,GAAwB,KAAMJ,CAAM,EACpCI,GAAwB,aAAcX,EAAO,WAAY,EAEzD,IAAMY,EAAWV,EAAU,IAAI,OAAO,WAAYS,EAAwB,EAE1E,OAAKC,EAAWV,EAAU,MAAQU,EAAWV,EAAU,IAAa,KAE7D,CACN,SAAUU,EACV,MAAOD,GAAwB,MAAM,EACrC,OAAQX,CACT,CAED,CAEA,SAASa,GAA2Bb,EAAQC,EAAUC,EAAWC,EAAKW,EAAIC,EAAKC,EAAQ,EAAGpF,EAAGC,EAAI,CAEhGmE,EAAO,kBAAmB,EAAGiB,EAAM,EACnCjB,EAAO,kBAAmBpE,EAAGsF,EAAM,EACnClB,EAAO,kBAAmBnE,EAAGsF,EAAM,EAEnC,IAAMC,EAAerB,IAAqBC,EAAQC,EAAUC,EAAWC,EAAKc,GAAOC,GAAOC,GAAOE,EAAmB,EAEpH,GAAKD,EAAe,CAEnB,IAAME,EAAY,IAAIC,EACtBC,GAAS,aAAcH,GAAoBJ,GAAOC,GAAOC,GAAOG,CAAU,EAErER,IAEJM,EAAa,GAAKI,GAAS,yBAA0BV,EAAI,EAAGlF,EAAGC,EAAGyF,EAAW,IAAIG,EAAU,GAIvFV,IAEJK,EAAa,IAAMI,GAAS,yBAA0BT,EAAK,EAAGnF,EAAGC,EAAGyF,EAAW,IAAIG,EAAU,GAIzFT,IAEJI,EAAa,OAASI,GAAS,yBAA0BR,EAAQ,EAAGpF,EAAGC,EAAGyF,EAAW,IAAIC,CAAU,EAE9FH,EAAa,OAAO,IAAKjB,EAAI,SAAU,EAAI,GAE/CiB,EAAa,OAAO,eAAgB,EAAG,GAMzC,IAAMM,EAAO,CACZ,EACA,EAAG9F,EACH,EAAGC,EACH,OAAQ,IAAI0F,EACZ,cAAe,CAChB,EAEAC,GAAS,UAAWP,GAAOC,GAAOC,GAAOO,EAAK,MAAO,EAErDN,EAAa,KAAOM,EACpBN,EAAa,UAAYE,CAE1B,CAEA,OAAOF,CAER,CAsOA,SAASO,GAAeC,EAAM,CAE7B,IAAMC,EAAM,CAAC,EAEb,QAAYC,KAAKF,EAAM,CAEtBC,EAAKC,CAAE,EAAI,CAAC,EAEZ,QAAY9C,KAAK4C,EAAKE,CAAE,EAAI,CAE3B,IAAMC,EAAWH,EAAKE,CAAE,EAAG9C,CAAE,EAExB+C,IAAcA,EAAS,SAC3BA,EAAS,WAAaA,EAAS,WAC/BA,EAAS,WAAaA,EAAS,WAAaA,EAAS,WACrDA,EAAS,WAAaA,EAAS,cAE1BA,EAAS,uBAEbjK,GAAM,oGAAqG,EAC3G+J,EAAKC,CAAE,EAAG9C,CAAE,EAAI,MAIhB6C,EAAKC,CAAE,EAAG9C,CAAE,EAAI+C,EAAS,MAAM,EAIrB,MAAM,QAASA,CAAS,EAEnCF,EAAKC,CAAE,EAAG9C,CAAE,EAAI+C,EAAS,MAAM,EAI/BF,EAAKC,CAAE,EAAG9C,CAAE,EAAI+C,CAIlB,CAED,CAEA,OAAOF,CAER,CAUA,SAASG,GAAeC,EAAW,CAElC,IAAMC,EAAS,CAAC,EAEhB,QAAUJ,EAAI,EAAGA,EAAIG,EAAS,OAAQH,IAAO,CAE5C,IAAMK,EAAMR,GAAeM,EAAUH,CAAE,CAAE,EAEzC,QAAY9C,KAAKmD,EAEhBD,EAAQlD,CAAE,EAAImD,EAAKnD,CAAE,CAIvB,CAEA,OAAOkD,CAER,CAEA,SAASE,IAAqBR,EAAM,CAEnC,IAAMC,EAAM,CAAC,EAEb,QAAUC,EAAI,EAAGA,EAAIF,EAAI,OAAQE,IAEhCD,EAAI,KAAMD,EAAKE,CAAE,EAAE,MAAM,CAAE,EAI5B,OAAOD,CAER,CAEA,SAASQ,GAA2BC,EAAW,CAE9C,IAAMC,EAAsBD,EAAS,gBAAgB,EAErD,OAAKC,IAAwB,KAGrBD,EAAS,iBAKZC,EAAoB,mBAAqB,GAEtCA,EAAoB,QAAQ,WAI7B3F,GAAgB,iBAExB,CAqzGA,SAAS4F,GAAiBC,EAAgBC,EAAYC,EAAQC,EAAO5G,EAAKD,EAAM,CAG/E8G,GAAiB,WAAYJ,EAAgBE,CAAO,EAAE,UAAW,EAAI,EAAE,SAAUC,CAAM,EAGlF5G,IAAQ,QAEZ8G,GAAiB,EAAM/G,EAAM8G,GAAiB,EAAQ7G,EAAM6G,GAAiB,EAC7EC,GAAiB,EAAM9G,EAAM6G,GAAiB,EAAQ9G,EAAM8G,GAAiB,GAI7EC,GAAiB,KAAMD,EAAiB,EAKzCJ,EAAe,KAAMC,CAAW,EAChCD,EAAe,GAAKK,GAAiB,EACrCL,EAAe,GAAKK,GAAiB,EAGrCL,EAAe,aAAcM,EAAiB,CAE/C,CAk9EA,SAASC,GAAWrH,EAAGC,EAAI,CAE1B,OAAOD,EAAIC,CAEZ,CAEA,SAASqH,IAAYtH,EAAGC,EAAI,CAE3B,OAAOD,EAAE,EAAIC,EAAE,CAEhB,CAEA,SAASsH,IAAiBvH,EAAGC,EAAI,CAEhC,OAAOA,EAAE,EAAID,EAAE,CAEhB,CA+DA,SAASwH,IAAmBvB,EAAKrE,EAAQ6F,EAAe,EAAI,CAE3D,IAAMC,EAAW9F,EAAO,SACxB,GAAKqE,EAAI,8BAAgCA,EAAI,MAAM,cAAgBrE,EAAO,MAAM,YAAc,CAI7F,IAAM+F,EAAc1B,EAAI,MACxB,QAAU/K,EAAI,EAAGA,EAAIyM,EAAazM,IAEjC,QAAUgF,EAAI,EAAGA,EAAIwH,EAAUxH,IAE9B0B,EAAO,aAAc1G,EAAIuM,EAAcvH,EAAG+F,EAAI,aAAc/K,EAAGgF,CAAE,CAAE,CAMtE,MAGC0B,EAAO,MAAM,IAAKqE,EAAI,MAAOwB,EAAeC,CAAS,EAItD9F,EAAO,YAAc,EAEtB,CAGA,SAASgG,GAAmB3B,EAAKrE,EAAS,CAEzC,GAAKqE,EAAI,cAAgBrE,EAAO,YAAc,CAG7C,IAAMiG,EAAM,KAAK,IAAK5B,EAAI,OAAQrE,EAAO,MAAO,EAChD,QAAU1G,EAAI,EAAGA,EAAI2M,EAAK3M,IAEzB0G,EAAQ1G,CAAE,EAAI+K,EAAK/K,CAAE,CAIvB,KAAO,CAGN,IAAM2M,EAAM,KAAK,IAAK5B,EAAI,OAAQrE,EAAO,MAAO,EAChDA,EAAO,IAAK,IAAIqE,EAAI,YAAaA,EAAI,OAAQ,EAAG4B,CAAI,CAAE,CAEvD,CAED,CA43DA,SAASC,GAAmBzD,EAAQE,EAAWC,EAAKuD,EAAa/H,EAAGC,EAAG/E,EAAI,CAE1E,IAAM8M,EAAoB3D,EAAO,SAAS,WAAW,SAOrD,GALA4D,GAAQ,oBAAqBD,EAAmBhI,CAAE,EAClDkI,GAAM,oBAAqBF,EAAmB/H,CAAE,EAEjCuE,EAAI,oBAAqByD,GAASC,GAAOC,GAAsBC,EAAyB,EAEzFL,EAAc,OAE5BI,GAAqB,aAAc9D,EAAO,WAAY,EAEtD,IAAMY,EAAWV,EAAU,IAAI,OAAO,WAAY4D,EAAqB,EAEvE,GAAK,EAAAlD,EAAWV,EAAU,MAAQU,EAAWV,EAAU,KAEvD,MAAO,CAEN,SAAUU,EAGV,MAAOmD,GAAyB,MAAM,EAAE,aAAc/D,EAAO,WAAY,EACzE,MAAOnJ,EACP,KAAM,KACN,UAAW,KACX,UAAW,KACX,OAAQmJ,CAET,CAED,CA0aA,SAASgE,GAAWzD,EAAO0D,EAAOC,EAAkBC,EAAajE,EAAWkE,EAAYpE,EAAS,CAEhG,IAAMqE,EAAqBC,GAAK,kBAAmB/D,CAAM,EAEzD,GAAK8D,EAAqBH,EAAmB,CAE5C,IAAMK,EAAiB,IAAIhD,EAE3B+C,GAAK,oBAAqB/D,EAAOgE,CAAe,EAChDA,EAAe,aAAcJ,CAAY,EAEzC,IAAMvD,EAAWV,EAAU,IAAI,OAAO,WAAYqE,CAAe,EAEjE,GAAK3D,EAAWV,EAAU,MAAQU,EAAWV,EAAU,IAAM,OAE7DkE,EAAW,KAAM,CAEhB,SAAUxD,EACV,cAAe,KAAK,KAAMyD,CAAmB,EAC7C,MAAOE,EACP,MAAON,EACP,KAAM,KACN,UAAW,KACX,UAAW,KACX,OAAQjE,CAET,CAAE,CAEH,CAED,CAu1FA,SAASwE,IAAY,CAqBpB,IAAIC,EAAK,EAAGC,EAAK,EAAGzI,EAAK,EAAG0I,EAAK,EAUjC,SAASC,EAAMC,EAAIC,EAAIC,EAAIC,EAAK,CAE/BP,EAAKI,EACLH,EAAKK,EACL9I,EAAK,GAAK4I,EAAK,EAAIC,EAAK,EAAIC,EAAKC,EACjCL,EAAK,EAAIE,EAAK,EAAIC,EAAKC,EAAKC,CAE7B,CAEA,MAAO,CAEN,eAAgB,SAAWH,EAAIC,EAAIG,EAAIC,EAAIC,EAAU,CAEpDP,EAAME,EAAIG,EAAIE,GAAYF,EAAKJ,GAAMM,GAAYD,EAAKJ,EAAK,CAE5D,EAEA,yBAA0B,SAAWD,EAAIC,EAAIG,EAAIC,EAAIE,EAAKC,EAAKC,EAAM,CAGpE,IAAIN,GAAOF,EAAKD,GAAOO,GAAQH,EAAKJ,IAASO,EAAMC,IAAUJ,EAAKH,GAAOO,EACrEE,GAAON,EAAKH,GAAOO,GAAQH,EAAKJ,IAASO,EAAMC,IAAUJ,EAAKD,GAAOK,EAGzEN,GAAMK,EACNE,GAAMF,EAENT,EAAME,EAAIG,EAAID,EAAIO,CAAG,CAEtB,EAEA,KAAM,SAAWxK,EAAI,CAEpB,IAAMwK,EAAKxK,EAAIA,EACTyK,EAAKD,EAAKxK,EAChB,OAAO0J,EAAKC,EAAK3J,EAAIkB,EAAKsJ,EAAKZ,EAAKa,CAErC,CAED,CAED,CA4QA,SAASC,GAAY1K,EAAG6D,EAAIC,EAAIC,EAAI4G,EAAK,CAExC,IAAMrH,GAAOS,EAAKF,GAAO,GACnBN,GAAOoH,EAAK7G,GAAO,GACnB0G,EAAKxK,EAAIA,EACTyK,EAAKzK,EAAIwK,EACf,OAAS,EAAI1G,EAAK,EAAIC,EAAKT,EAAKC,GAAOkH,GAAO,GAAK3G,EAAK,EAAIC,EAAK,EAAIT,EAAKC,GAAOiH,EAAKlH,EAAKtD,EAAI8D,CAEhG,CAIA,SAAS8G,IAAmB5K,EAAGiE,EAAI,CAElC,IAAM4G,EAAI,EAAI7K,EACd,OAAO6K,EAAIA,EAAI5G,CAEhB,CAEA,SAAS6G,IAAmB9K,EAAGiE,EAAI,CAElC,MAAO,IAAM,EAAIjE,GAAMA,EAAIiE,CAE5B,CAEA,SAAS8G,IAAmB/K,EAAGiE,EAAI,CAElC,OAAOjE,EAAIA,EAAIiE,CAEhB,CAWA,SAAS+G,GAAiBhL,EAAG6D,EAAIC,EAAIC,EAAK,CAEzC,OAAO6G,IAAmB5K,EAAG6D,CAAG,EAAIiH,IAAmB9K,EAAG8D,CAAG,EAC5DiH,IAAmB/K,EAAG+D,CAAG,CAE3B,CAIA,SAASkH,IAAejL,EAAGiE,EAAI,CAE9B,IAAM4G,EAAI,EAAI7K,EACd,OAAO6K,EAAIA,EAAIA,EAAI5G,CAEpB,CAEA,SAASiH,IAAelL,EAAGiE,EAAI,CAE9B,IAAM4G,EAAI,EAAI7K,EACd,MAAO,GAAI6K,EAAIA,EAAI7K,EAAIiE,CAExB,CAEA,SAASkH,IAAenL,EAAGiE,EAAI,CAE9B,MAAO,IAAM,EAAIjE,GAAMA,EAAIA,EAAIiE,CAEhC,CAEA,SAASmH,IAAepL,EAAGiE,EAAI,CAE9B,OAAOjE,EAAIA,EAAIA,EAAIiE,CAEpB,CAYA,SAASoH,GAAarL,EAAG6D,EAAIC,EAAIC,EAAI4G,EAAK,CAEzC,OAAOM,IAAejL,EAAG6D,CAAG,EAAIqH,IAAelL,EAAG8D,CAAG,EAAIqH,IAAenL,EAAG+D,CAAG,EAC7EqH,IAAepL,EAAG2K,CAAG,CAEvB,CAmpDA,SAASW,IAAOC,EAAMC,EAAaC,EAAM,EAAG,CAExC,IAAMC,EAAWF,GAAeA,EAAY,OACtCG,EAAWD,EAAWF,EAAY,CAAC,EAAIC,EAAMF,EAAK,OACpDK,EAAYC,GAAWN,EAAM,EAAGI,EAAUF,EAAK,EAAI,EACjDK,EAAY,CAAC,EAEnB,GAAI,CAACF,GAAaA,EAAU,OAASA,EAAU,KAAM,OAAOE,EAE5D,IAAIC,EAAMC,EAAMC,EAKhB,GAHIP,IAAUE,EAAYM,IAAeX,EAAMC,EAAaI,EAAWH,CAAG,GAGtEF,EAAK,OAAS,GAAKE,EAAK,CACxBM,EAAOR,EAAK,CAAC,EACbS,EAAOT,EAAK,CAAC,EACb,IAAIY,EAAOJ,EACPK,EAAOJ,EAEX,QAASlQ,EAAI2P,EAAK3P,EAAI6P,EAAU7P,GAAK2P,EAAK,CACtC,IAAMjN,EAAI+M,EAAKzP,CAAC,EACVgD,EAAIyM,EAAKzP,EAAI,CAAC,EAChB0C,EAAIuN,IAAMA,EAAOvN,GACjBM,EAAIkN,IAAMA,EAAOlN,GACjBN,EAAI2N,IAAMA,EAAO3N,GACjBM,EAAIsN,IAAMA,EAAOtN,EACzB,CAGAmN,EAAU,KAAK,IAAIE,EAAOJ,EAAMK,EAAOJ,CAAI,EAC3CC,EAAUA,IAAY,EAAI,MAAQA,EAAU,CAChD,CAEA,OAAAI,GAAaT,EAAWE,EAAWL,EAAKM,EAAMC,EAAMC,EAAS,CAAC,EAEvDH,CACX,CAGA,SAASD,GAAWN,EAAMe,EAAOC,EAAKd,EAAKe,EAAW,CAClD,IAAIC,EAEJ,GAAID,IAAeE,IAAWnB,EAAMe,EAAOC,EAAKd,CAAG,EAAI,EACnD,QAAS3P,EAAIwQ,EAAOxQ,EAAIyQ,EAAKzQ,GAAK2P,EAAKgB,EAAOE,GAAW7Q,EAAI2P,EAAM,EAAGF,EAAKzP,CAAC,EAAGyP,EAAKzP,EAAI,CAAC,EAAG2Q,CAAI,MAEhG,SAAS3Q,EAAIyQ,EAAMd,EAAK3P,GAAKwQ,EAAOxQ,GAAK2P,EAAKgB,EAAOE,GAAW7Q,EAAI2P,EAAM,EAAGF,EAAKzP,CAAC,EAAGyP,EAAKzP,EAAI,CAAC,EAAG2Q,CAAI,EAG3G,OAAIA,GAAQG,GAAOH,EAAMA,EAAK,IAAI,IAC9BI,GAAWJ,CAAI,EACfA,EAAOA,EAAK,MAGTA,CACX,CAGA,SAASK,GAAaR,EAAOC,EAAK,CAC9B,GAAI,CAACD,EAAO,OAAOA,EACdC,IAAKA,EAAMD,GAEhB,IAAIrI,EAAIqI,EACJS,EACJ,EAGI,IAFAA,EAAQ,GAEJ,CAAC9I,EAAE,UAAY2I,GAAO3I,EAAGA,EAAE,IAAI,GAAK+I,GAAK/I,EAAE,KAAMA,EAAGA,EAAE,IAAI,IAAM,GAAI,CAGpE,GAFA4I,GAAW5I,CAAC,EACZA,EAAIsI,EAAMtI,EAAE,KACRA,IAAMA,EAAE,KAAM,MAClB8I,EAAQ,EAEZ,MACI9I,EAAIA,EAAE,WAEL8I,GAAS9I,IAAMsI,GAExB,OAAOA,CACX,CAGA,SAASF,GAAaY,EAAKnB,EAAWL,EAAKM,EAAMC,EAAMC,EAASiB,EAAM,CAClE,GAAI,CAACD,EAAK,OAGN,CAACC,GAAQjB,GAASkB,IAAWF,EAAKlB,EAAMC,EAAMC,CAAO,EAEzD,IAAImB,EAAOH,EAGX,KAAOA,EAAI,OAASA,EAAI,MAAM,CAC1B,IAAMI,EAAOJ,EAAI,KACXK,EAAOL,EAAI,KAEjB,GAAIhB,EAAUsB,IAAYN,EAAKlB,EAAMC,EAAMC,CAAO,EAAIuB,IAAMP,CAAG,EAAG,CAC9DnB,EAAU,KAAKuB,EAAK,EAAGJ,EAAI,EAAGK,EAAK,CAAC,EAEpCT,GAAWI,CAAG,EAGdA,EAAMK,EAAK,KACXF,EAAOE,EAAK,KAEZ,QACJ,CAKA,GAHAL,EAAMK,EAGFL,IAAQG,EAAM,CAETF,EAIMA,IAAS,GAChBD,EAAMQ,IAAuBX,GAAaG,CAAG,EAAGnB,CAAS,EACzDO,GAAaY,EAAKnB,EAAWL,EAAKM,EAAMC,EAAMC,EAAS,CAAC,GAGjDiB,IAAS,GAChBQ,IAAYT,EAAKnB,EAAWL,EAAKM,EAAMC,EAAMC,CAAO,EATpDI,GAAaS,GAAaG,CAAG,EAAGnB,EAAWL,EAAKM,EAAMC,EAAMC,EAAS,CAAC,EAY1E,KACJ,CACJ,CACJ,CAGA,SAASuB,IAAMP,EAAK,CAChB,IAAMrM,EAAIqM,EAAI,KACVpM,EAAIoM,EACJnM,EAAImM,EAAI,KAEZ,GAAID,GAAKpM,EAAGC,EAAGC,CAAC,GAAK,EAAG,MAAO,GAG/B,IAAM6M,EAAK/M,EAAE,EAAGgN,EAAK/M,EAAE,EAAGgN,EAAK/M,EAAE,EAAGgN,EAAKlN,EAAE,EAAGmN,EAAKlN,EAAE,EAAGmN,EAAKlN,EAAE,EAGzDgJ,EAAK,KAAK,IAAI6D,EAAIC,EAAIC,CAAE,EAC1BI,EAAK,KAAK,IAAIH,EAAIC,EAAIC,CAAE,EACxBjE,EAAK,KAAK,IAAI4D,EAAIC,EAAIC,CAAE,EACxBK,EAAK,KAAK,IAAIJ,EAAIC,EAAIC,CAAE,EAExB,EAAIlN,EAAE,KACV,KAAO,IAAMF,GAAG,CACZ,GAAI,EAAE,GAAKkJ,GAAM,EAAE,GAAKC,GAAM,EAAE,GAAKkE,GAAM,EAAE,GAAKC,GAC9CC,GAA2BR,EAAIG,EAAIF,EAAIG,EAAIF,EAAIG,EAAI,EAAE,EAAG,EAAE,CAAC,GAC3DhB,GAAK,EAAE,KAAM,EAAG,EAAE,IAAI,GAAK,EAAG,MAAO,GACzC,EAAI,EAAE,IACV,CAEA,MAAO,EACX,CAEA,SAASO,IAAYN,EAAKlB,EAAMC,EAAMC,EAAS,CAC3C,IAAMrL,EAAIqM,EAAI,KACVpM,EAAIoM,EACJnM,EAAImM,EAAI,KAEZ,GAAID,GAAKpM,EAAGC,EAAGC,CAAC,GAAK,EAAG,MAAO,GAE/B,IAAM6M,EAAK/M,EAAE,EAAGgN,EAAK/M,EAAE,EAAGgN,EAAK/M,EAAE,EAAGgN,EAAKlN,EAAE,EAAGmN,EAAKlN,EAAE,EAAGmN,EAAKlN,EAAE,EAGzDgJ,EAAK,KAAK,IAAI6D,EAAIC,EAAIC,CAAE,EAC1BI,EAAK,KAAK,IAAIH,EAAIC,EAAIC,CAAE,EACxBjE,EAAK,KAAK,IAAI4D,EAAIC,EAAIC,CAAE,EACxBK,EAAK,KAAK,IAAIJ,EAAIC,EAAIC,CAAE,EAGtBI,EAAOC,GAAOvE,EAAImE,EAAIlC,EAAMC,EAAMC,CAAO,EAC3CqC,EAAOD,GAAOtE,EAAImE,EAAInC,EAAMC,EAAMC,CAAO,EAEzChI,EAAIgJ,EAAI,MACR5O,EAAI4O,EAAI,MAGZ,KAAOhJ,GAAKA,EAAE,GAAKmK,GAAQ/P,GAAKA,EAAE,GAAKiQ,GAAM,CAKzC,GAJIrK,EAAE,GAAK6F,GAAM7F,EAAE,GAAK8F,GAAM9F,EAAE,GAAKgK,GAAMhK,EAAE,GAAKiK,GAAMjK,IAAMrD,GAAKqD,IAAMnD,GACrEqN,GAA2BR,EAAIG,EAAIF,EAAIG,EAAIF,EAAIG,EAAI/J,EAAE,EAAGA,EAAE,CAAC,GAAK+I,GAAK/I,EAAE,KAAMA,EAAGA,EAAE,IAAI,GAAK,IAC/FA,EAAIA,EAAE,MAEF5F,EAAE,GAAKyL,GAAMzL,EAAE,GAAK0L,GAAM1L,EAAE,GAAK4P,GAAM5P,EAAE,GAAK6P,GAAM7P,IAAMuC,GAAKvC,IAAMyC,GACrEqN,GAA2BR,EAAIG,EAAIF,EAAIG,EAAIF,EAAIG,EAAI3P,EAAE,EAAGA,EAAE,CAAC,GAAK2O,GAAK3O,EAAE,KAAMA,EAAGA,EAAE,IAAI,GAAK,GAAG,MAAO,GACzGA,EAAIA,EAAE,KACV,CAGA,KAAO4F,GAAKA,EAAE,GAAKmK,GAAM,CACrB,GAAInK,EAAE,GAAK6F,GAAM7F,EAAE,GAAK8F,GAAM9F,EAAE,GAAKgK,GAAMhK,EAAE,GAAKiK,GAAMjK,IAAMrD,GAAKqD,IAAMnD,GACrEqN,GAA2BR,EAAIG,EAAIF,EAAIG,EAAIF,EAAIG,EAAI/J,EAAE,EAAGA,EAAE,CAAC,GAAK+I,GAAK/I,EAAE,KAAMA,EAAGA,EAAE,IAAI,GAAK,EAAG,MAAO,GACzGA,EAAIA,EAAE,KACV,CAGA,KAAO5F,GAAKA,EAAE,GAAKiQ,GAAM,CACrB,GAAIjQ,EAAE,GAAKyL,GAAMzL,EAAE,GAAK0L,GAAM1L,EAAE,GAAK4P,GAAM5P,EAAE,GAAK6P,GAAM7P,IAAMuC,GAAKvC,IAAMyC,GACrEqN,GAA2BR,EAAIG,EAAIF,EAAIG,EAAIF,EAAIG,EAAI3P,EAAE,EAAGA,EAAE,CAAC,GAAK2O,GAAK3O,EAAE,KAAMA,EAAGA,EAAE,IAAI,GAAK,EAAG,MAAO,GACzGA,EAAIA,EAAE,KACV,CAEA,MAAO,EACX,CAGA,SAASoP,IAAuBnB,EAAOR,EAAW,CAC9C,IAAI7H,EAAIqI,EACR,EAAG,CACC,IAAM1L,EAAIqD,EAAE,KACRpD,EAAIoD,EAAE,KAAK,KAEX,CAAC2I,GAAOhM,EAAGC,CAAC,GAAKwI,GAAWzI,EAAGqD,EAAGA,EAAE,KAAMpD,CAAC,GAAK0N,GAAc3N,EAAGC,CAAC,GAAK0N,GAAc1N,EAAGD,CAAC,IAEzFkL,EAAU,KAAKlL,EAAE,EAAGqD,EAAE,EAAGpD,EAAE,CAAC,EAG5BgM,GAAW5I,CAAC,EACZ4I,GAAW5I,EAAE,IAAI,EAEjBA,EAAIqI,EAAQzL,GAEhBoD,EAAIA,EAAE,IACV,OAASA,IAAMqI,GAEf,OAAOQ,GAAa7I,CAAC,CACzB,CAGA,SAASyJ,IAAYpB,EAAOR,EAAWL,EAAKM,EAAMC,EAAMC,EAAS,CAE7D,IAAIrL,EAAI0L,EACR,EAAG,CACC,IAAIzL,EAAID,EAAE,KAAK,KACf,KAAOC,IAAMD,EAAE,MAAM,CACjB,GAAIA,EAAE,IAAMC,EAAE,GAAK2N,IAAgB5N,EAAGC,CAAC,EAAG,CAEtC,IAAI,EAAI4N,GAAa7N,EAAGC,CAAC,EAGzBD,EAAIkM,GAAalM,EAAGA,EAAE,IAAI,EAC1B,EAAIkM,GAAa,EAAG,EAAE,IAAI,EAG1BT,GAAazL,EAAGkL,EAAWL,EAAKM,EAAMC,EAAMC,EAAS,CAAC,EACtDI,GAAa,EAAGP,EAAWL,EAAKM,EAAMC,EAAMC,EAAS,CAAC,EACtD,MACJ,CACApL,EAAIA,EAAE,IACV,CACAD,EAAIA,EAAE,IACV,OAASA,IAAM0L,EACnB,CAGA,SAASJ,IAAeX,EAAMC,EAAaI,EAAWH,EAAK,CACvD,IAAMiD,EAAQ,CAAC,EAEf,QAAS5S,EAAI,EAAG2M,EAAM+C,EAAY,OAAQ1P,EAAI2M,EAAK3M,IAAK,CACpD,IAAMwQ,EAAQd,EAAY1P,CAAC,EAAI2P,EACzBc,EAAMzQ,EAAI2M,EAAM,EAAI+C,EAAY1P,EAAI,CAAC,EAAI2P,EAAMF,EAAK,OACpDoD,EAAO9C,GAAWN,EAAMe,EAAOC,EAAKd,EAAK,EAAK,EAChDkD,IAASA,EAAK,OAAMA,EAAK,QAAU,IACvCD,EAAM,KAAKE,IAAYD,CAAI,CAAC,CAChC,CAEAD,EAAM,KAAKG,GAAc,EAGzB,QAAS/S,EAAI,EAAGA,EAAI4S,EAAM,OAAQ5S,IAC9B8P,EAAYkD,IAAcJ,EAAM5S,CAAC,EAAG8P,CAAS,EAGjD,OAAOA,CACX,CAEA,SAASiD,IAAejO,EAAGC,EAAG,CAC1B,IAAIkO,EAASnO,EAAE,EAAIC,EAAE,EAGrB,GAAIkO,IAAW,IACXA,EAASnO,EAAE,EAAIC,EAAE,EACbkO,IAAW,GAAG,CACd,IAAMC,GAAUpO,EAAE,KAAK,EAAIA,EAAE,IAAMA,EAAE,KAAK,EAAIA,EAAE,GAC1CqO,GAAUpO,EAAE,KAAK,EAAIA,EAAE,IAAMA,EAAE,KAAK,EAAIA,EAAE,GAChDkO,EAASC,EAASC,CACtB,CAEJ,OAAOF,CACX,CAGA,SAASD,IAAcI,EAAMtD,EAAW,CACpC,IAAMuD,EAASC,IAAeF,EAAMtD,CAAS,EAC7C,GAAI,CAACuD,EACD,OAAOvD,EAGX,IAAMyD,EAAgBZ,GAAaU,EAAQD,CAAI,EAG/C,OAAApC,GAAauC,EAAeA,EAAc,IAAI,EACvCvC,GAAaqC,EAAQA,EAAO,IAAI,CAC3C,CAGA,SAASC,IAAeF,EAAMtD,EAAW,CACrC,IAAI3H,EAAI2H,EACF0D,EAAKJ,EAAK,EACVK,EAAKL,EAAK,EACZM,EAAK,KACLlR,EAKJ,GAAIsO,GAAOsC,EAAMjL,CAAC,EAAG,OAAOA,EAC5B,EAAG,CACC,GAAI2I,GAAOsC,EAAMjL,EAAE,IAAI,EAAG,OAAOA,EAAE,KAC9B,GAAIsL,GAAMtL,EAAE,GAAKsL,GAAMtL,EAAE,KAAK,GAAKA,EAAE,KAAK,IAAMA,EAAE,EAAG,CACtD,IAAMzF,EAAIyF,EAAE,GAAKsL,EAAKtL,EAAE,IAAMA,EAAE,KAAK,EAAIA,EAAE,IAAMA,EAAE,KAAK,EAAIA,EAAE,GAC9D,GAAIzF,GAAK8Q,GAAM9Q,EAAIgR,IACfA,EAAKhR,EACLF,EAAI2F,EAAE,EAAIA,EAAE,KAAK,EAAIA,EAAIA,EAAE,KACvBzF,IAAM8Q,GAAI,OAAOhR,CAE7B,CACA2F,EAAIA,EAAE,IACV,OAASA,IAAM2H,GAEf,GAAI,CAACtN,EAAG,OAAO,KAMf,IAAM8O,EAAO9O,EACPmR,EAAKnR,EAAE,EACPoR,EAAKpR,EAAE,EACTqR,EAAS,IAEb1L,EAAI3F,EAEJ,EAAG,CACC,GAAIgR,GAAMrL,EAAE,GAAKA,EAAE,GAAKwL,GAAMH,IAAOrL,EAAE,GAC/B2L,GAAgBL,EAAKG,EAAKJ,EAAKE,EAAID,EAAIE,EAAIC,EAAIH,EAAKG,EAAKF,EAAKF,EAAIC,EAAItL,EAAE,EAAGA,EAAE,CAAC,EAAG,CAErF,IAAM4L,EAAM,KAAK,IAAIN,EAAKtL,EAAE,CAAC,GAAKqL,EAAKrL,EAAE,GAErCsK,GAActK,EAAGiL,CAAI,IACpBW,EAAMF,GAAWE,IAAQF,IAAW1L,EAAE,EAAI3F,EAAE,GAAM2F,EAAE,IAAM3F,EAAE,GAAKwR,IAAqBxR,EAAG2F,CAAC,MAC3F3F,EAAI2F,EACJ0L,EAASE,EAEjB,CAEA5L,EAAIA,EAAE,IACV,OAASA,IAAMmJ,GAEf,OAAO9O,CACX,CAGA,SAASwR,IAAqBxR,EAAG2F,EAAG,CAChC,OAAO+I,GAAK1O,EAAE,KAAMA,EAAG2F,EAAE,IAAI,EAAI,GAAK+I,GAAK/I,EAAE,KAAM3F,EAAGA,EAAE,IAAI,EAAI,CACpE,CAGA,SAAS6O,IAAWb,EAAOP,EAAMC,EAAMC,EAAS,CAC5C,IAAIhI,EAAIqI,EACR,GACQrI,EAAE,IAAM,IAAGA,EAAE,EAAIoK,GAAOpK,EAAE,EAAGA,EAAE,EAAG8H,EAAMC,EAAMC,CAAO,GACzDhI,EAAE,MAAQA,EAAE,KACZA,EAAE,MAAQA,EAAE,KACZA,EAAIA,EAAE,WACDA,IAAMqI,GAEfrI,EAAE,MAAM,MAAQ,KAChBA,EAAE,MAAQ,KAEV8L,IAAW9L,CAAC,CAChB,CAIA,SAAS8L,IAAWpB,EAAM,CACtB,IAAIqB,EACAC,EAAS,EAEb,EAAG,CACC,IAAIhM,EAAI0K,EACJpK,EACJoK,EAAO,KACP,IAAIuB,EAAO,KAGX,IAFAF,EAAY,EAEL/L,GAAG,CACN+L,IACA,IAAIrP,EAAIsD,EACJkM,EAAQ,EACZ,QAASrU,EAAI,EAAGA,EAAImU,IAChBE,IACAxP,EAAIA,EAAE,MACF,EAACA,GAHmB7E,IAGxB,CAEJ,IAAIsU,EAAQH,EAEZ,KAAOE,EAAQ,GAAMC,EAAQ,GAAKzP,GAE1BwP,IAAU,IAAMC,IAAU,GAAK,CAACzP,GAAKsD,EAAE,GAAKtD,EAAE,IAC9C4D,EAAIN,EACJA,EAAIA,EAAE,MACNkM,MAEA5L,EAAI5D,EACJA,EAAIA,EAAE,MACNyP,KAGAF,EAAMA,EAAK,MAAQ3L,EAClBoK,EAAOpK,EAEZA,EAAE,MAAQ2L,EACVA,EAAO3L,EAGXN,EAAItD,CACR,CAEAuP,EAAK,MAAQ,KACbD,GAAU,CAEd,OAASD,EAAY,GAErB,OAAOrB,CACX,CAGA,SAASN,GAAO7P,EAAGM,EAAGiN,EAAMC,EAAMC,EAAS,CAEvC,OAAAzN,GAAKA,EAAIuN,GAAQE,EAAU,EAC3BnN,GAAKA,EAAIkN,GAAQC,EAAU,EAE3BzN,GAAKA,EAAKA,GAAK,GAAM,SACrBA,GAAKA,EAAKA,GAAK,GAAM,UACrBA,GAAKA,EAAKA,GAAK,GAAM,UACrBA,GAAKA,EAAKA,GAAK,GAAM,WAErBM,GAAKA,EAAKA,GAAK,GAAM,SACrBA,GAAKA,EAAKA,GAAK,GAAM,UACrBA,GAAKA,EAAKA,GAAK,GAAM,UACrBA,GAAKA,EAAKA,GAAK,GAAM,WAEdN,EAAKM,GAAK,CACrB,CAGA,SAAS8P,IAAYtC,EAAO,CACxB,IAAIrI,EAAIqI,EACJ+D,EAAW/D,EACf,GACQrI,EAAE,EAAIoM,EAAS,GAAMpM,EAAE,IAAMoM,EAAS,GAAKpM,EAAE,EAAIoM,EAAS,KAAIA,EAAWpM,GAC7EA,EAAIA,EAAE,WACDA,IAAMqI,GAEf,OAAO+D,CACX,CAGA,SAAST,GAAgBjC,EAAIG,EAAIF,EAAIG,EAAIF,EAAIG,EAAIsC,EAAIC,EAAI,CACrD,OAAQ1C,EAAKyC,IAAOxC,EAAKyC,KAAQ5C,EAAK2C,IAAOtC,EAAKuC,KAC1C5C,EAAK2C,IAAOvC,EAAKwC,KAAQ3C,EAAK0C,IAAOxC,EAAKyC,KAC1C3C,EAAK0C,IAAOtC,EAAKuC,KAAQ1C,EAAKyC,IAAOvC,EAAKwC,EACtD,CAGA,SAASpC,GAA2BR,EAAIG,EAAIF,EAAIG,EAAIF,EAAIG,EAAIsC,EAAIC,EAAI,CAChE,MAAO,EAAE5C,IAAO2C,GAAMxC,IAAOyC,IAAOX,GAAgBjC,EAAIG,EAAIF,EAAIG,EAAIF,EAAIG,EAAIsC,EAAIC,CAAE,CACtF,CAGA,SAAS/B,IAAgB5N,EAAGC,EAAG,CAC3B,OAAOD,EAAE,KAAK,IAAMC,EAAE,GAAKD,EAAE,KAAK,IAAMC,EAAE,GAAK,CAAC2P,IAAkB5P,EAAGC,CAAC,IAC9D0N,GAAc3N,EAAGC,CAAC,GAAK0N,GAAc1N,EAAGD,CAAC,GAAK6P,IAAa7P,EAAGC,CAAC,IAC9DmM,GAAKpM,EAAE,KAAMA,EAAGC,EAAE,IAAI,GAAKmM,GAAKpM,EAAGC,EAAE,KAAMA,CAAC,IAC7C+L,GAAOhM,EAAGC,CAAC,GAAKmM,GAAKpM,EAAE,KAAMA,EAAGA,EAAE,IAAI,EAAI,GAAKoM,GAAKnM,EAAE,KAAMA,EAAGA,EAAE,IAAI,EAAI,EACrF,CAGA,SAASmM,GAAK/I,EAAGtD,EAAGiD,EAAG,CACnB,OAAQjD,EAAE,EAAIsD,EAAE,IAAML,EAAE,EAAIjD,EAAE,IAAMA,EAAE,EAAIsD,EAAE,IAAML,EAAE,EAAIjD,EAAE,EAC9D,CAGA,SAASiM,GAAO9I,EAAIC,EAAI,CACpB,OAAOD,EAAG,IAAMC,EAAG,GAAKD,EAAG,IAAMC,EAAG,CACxC,CAGA,SAASsF,GAAWvF,EAAI4M,EAAI3M,EAAI4M,EAAI,CAChC,IAAMC,EAAKC,GAAK7D,GAAKlJ,EAAI4M,EAAI3M,CAAE,CAAC,EAC1B+M,EAAKD,GAAK7D,GAAKlJ,EAAI4M,EAAIC,CAAE,CAAC,EAC1BI,EAAKF,GAAK7D,GAAKjJ,EAAI4M,EAAI7M,CAAE,CAAC,EAC1BkN,EAAKH,GAAK7D,GAAKjJ,EAAI4M,EAAID,CAAE,CAAC,EAOhC,MALI,GAAAE,IAAOE,GAAMC,IAAOC,GAEpBJ,IAAO,GAAKK,GAAUnN,EAAIC,EAAI2M,CAAE,GAChCI,IAAO,GAAKG,GAAUnN,EAAI6M,EAAID,CAAE,GAChCK,IAAO,GAAKE,GAAUlN,EAAID,EAAI6M,CAAE,GAChCK,IAAO,GAAKC,GAAUlN,EAAI2M,EAAIC,CAAE,EAGxC,CAGA,SAASM,GAAUhN,EAAGtD,EAAGiD,EAAG,CACxB,OAAOjD,EAAE,GAAK,KAAK,IAAIsD,EAAE,EAAGL,EAAE,CAAC,GAAKjD,EAAE,GAAK,KAAK,IAAIsD,EAAE,EAAGL,EAAE,CAAC,GAAKjD,EAAE,GAAK,KAAK,IAAIsD,EAAE,EAAGL,EAAE,CAAC,GAAKjD,EAAE,GAAK,KAAK,IAAIsD,EAAE,EAAGL,EAAE,CAAC,CAC1H,CAEA,SAASiN,GAAKK,EAAK,CACf,OAAOA,EAAM,EAAI,EAAIA,EAAM,EAAI,GAAK,CACxC,CAGA,SAASV,IAAkB5P,EAAGC,EAAG,CAC7B,IAAIoD,EAAIrD,EACR,EAAG,CACC,GAAIqD,EAAE,IAAMrD,EAAE,GAAKqD,EAAE,KAAK,IAAMrD,EAAE,GAAKqD,EAAE,IAAMpD,EAAE,GAAKoD,EAAE,KAAK,IAAMpD,EAAE,GAC7DwI,GAAWpF,EAAGA,EAAE,KAAMrD,EAAGC,CAAC,EAAG,MAAO,GAC5CoD,EAAIA,EAAE,IACV,OAASA,IAAMrD,GAEf,MAAO,EACX,CAGA,SAAS2N,GAAc3N,EAAGC,EAAG,CACzB,OAAOmM,GAAKpM,EAAE,KAAMA,EAAGA,EAAE,IAAI,EAAI,EAC7BoM,GAAKpM,EAAGC,EAAGD,EAAE,IAAI,GAAK,GAAKoM,GAAKpM,EAAGA,EAAE,KAAMC,CAAC,GAAK,EACjDmM,GAAKpM,EAAGC,EAAGD,EAAE,IAAI,EAAI,GAAKoM,GAAKpM,EAAGA,EAAE,KAAMC,CAAC,EAAI,CACvD,CAGA,SAAS4P,IAAa7P,EAAGC,EAAG,CACxB,IAAIoD,EAAIrD,EACJuQ,EAAS,GACPb,GAAM1P,EAAE,EAAIC,EAAE,GAAK,EACnB0P,GAAM3P,EAAE,EAAIC,EAAE,GAAK,EACzB,GACUoD,EAAE,EAAIsM,GAAStM,EAAE,KAAK,EAAIsM,GAAQtM,EAAE,KAAK,IAAMA,EAAE,GAC9CqM,GAAMrM,EAAE,KAAK,EAAIA,EAAE,IAAMsM,EAAKtM,EAAE,IAAMA,EAAE,KAAK,EAAIA,EAAE,GAAKA,EAAE,IAC/DkN,EAAS,CAACA,GACdlN,EAAIA,EAAE,WACDA,IAAMrD,GAEf,OAAOuQ,CACX,CAIA,SAAS1C,GAAa7N,EAAGC,EAAG,CACxB,IAAMnC,EAAK0S,GAAWxQ,EAAE,EAAGA,EAAE,EAAGA,EAAE,CAAC,EAC/BhC,EAAKwS,GAAWvQ,EAAE,EAAGA,EAAE,EAAGA,EAAE,CAAC,EAC7BwQ,EAAKzQ,EAAE,KACP0Q,EAAKzQ,EAAE,KAEX,OAAAD,EAAE,KAAOC,EACTA,EAAE,KAAOD,EAETlC,EAAG,KAAO2S,EACVA,EAAG,KAAO3S,EAEVE,EAAG,KAAOF,EACVA,EAAG,KAAOE,EAEV0S,EAAG,KAAO1S,EACVA,EAAG,KAAO0S,EAEH1S,CACX,CAGA,SAAS+N,GAAW,EAAGnO,EAAGM,EAAG2N,EAAM,CAC/B,IAAMxI,EAAImN,GAAW,EAAG5S,EAAGM,CAAC,EAE5B,OAAK2N,GAKDxI,EAAE,KAAOwI,EAAK,KACdxI,EAAE,KAAOwI,EACTA,EAAK,KAAK,KAAOxI,EACjBwI,EAAK,KAAOxI,IAPZA,EAAE,KAAOA,EACTA,EAAE,KAAOA,GAQNA,CACX,CAEA,SAAS4I,GAAW5I,EAAG,CACnBA,EAAE,KAAK,KAAOA,EAAE,KAChBA,EAAE,KAAK,KAAOA,EAAE,KAEZA,EAAE,QAAOA,EAAE,MAAM,MAAQA,EAAE,OAC3BA,EAAE,QAAOA,EAAE,MAAM,MAAQA,EAAE,MACnC,CAEA,SAASmN,GAAW,EAAG5S,EAAGM,EAAG,CACzB,MAAO,CACH,EACA,EAAAN,EAAG,EAAAM,EACH,KAAM,KACN,KAAM,KACN,EAAG,EACH,MAAO,KACP,MAAO,KACP,QAAS,EACb,CACJ,CAEA,SAAS4N,IAAWnB,EAAMe,EAAOC,EAAKd,EAAK,CACvC,IAAI8F,EAAM,EACV,QAASzV,EAAIwQ,EAAO5I,EAAI6I,EAAMd,EAAK3P,EAAIyQ,EAAKzQ,GAAK2P,EAC7C8F,IAAQhG,EAAK7H,CAAC,EAAI6H,EAAKzP,CAAC,IAAMyP,EAAKzP,EAAI,CAAC,EAAIyP,EAAK7H,EAAI,CAAC,GACtDA,EAAI5H,EAER,OAAOyV,CACX,CAmHA,SAASC,GAAiBC,EAAS,CAElC,IAAMC,EAAID,EAAO,OAEZC,EAAI,GAAKD,EAAQC,EAAI,CAAE,EAAE,OAAQD,EAAQ,CAAE,CAAE,GAEjDA,EAAO,IAAI,CAIb,CAEA,SAASE,GAAYC,EAAUC,EAAU,CAExC,QAAU/V,EAAI,EAAGA,EAAI+V,EAAQ,OAAQ/V,IAEpC8V,EAAS,KAAMC,EAAS/V,CAAE,EAAE,CAAE,EAC9B8V,EAAS,KAAMC,EAAS/V,CAAE,EAAE,CAAE,CAIhC,CA01BA,SAASgW,IAAUC,EAAQC,EAASzG,EAAO,CAI1C,GAFAA,EAAK,OAAS,CAAC,EAEV,MAAM,QAASwG,CAAO,EAE1B,QAAUjW,EAAI,EAAG4V,EAAIK,EAAO,OAAQjW,EAAI4V,EAAG5V,IAAO,CAEjD,IAAMmW,EAAQF,EAAQjW,CAAE,EAExByP,EAAK,OAAO,KAAM0G,EAAM,IAAK,CAE9B,MAIA1G,EAAK,OAAO,KAAMwG,EAAO,IAAK,EAI/B,OAAAxG,EAAK,QAAU,OAAO,OAAQ,CAAC,EAAGyG,CAAQ,EAErCA,EAAQ,cAAgB,SAAYzG,EAAK,QAAQ,YAAcyG,EAAQ,YAAY,OAAO,GAExFzG,CAER,CAm1BA,SAAS2G,IAAQH,EAAQxG,EAAO,CAI/B,GAFAA,EAAK,OAAS,CAAC,EAEV,MAAM,QAASwG,CAAO,EAE1B,QAAUjW,EAAI,EAAG4V,EAAIK,EAAO,OAAQjW,EAAI4V,EAAG5V,IAAO,CAEjD,IAAMmW,EAAQF,EAAQjW,CAAE,EAExByP,EAAK,OAAO,KAAM0G,EAAM,IAAK,CAE9B,MAIA1G,EAAK,OAAO,KAAMwG,EAAO,IAAK,EAI/B,OAAOxG,CAER,CA29BA,SAAS4G,GAAc7F,EAAOC,EAAK6F,EAAQ,CAE1C,IAAMC,EAAQ,GAAG/F,EAAM,CAAC,IAAIA,EAAM,CAAC,IAAIA,EAAM,CAAC,IAAIC,EAAI,CAAC,IAAIA,EAAI,CAAC,IAAIA,EAAI,CAAC,GACnE+F,EAAQ,GAAG/F,EAAI,CAAC,IAAIA,EAAI,CAAC,IAAIA,EAAI,CAAC,IAAID,EAAM,CAAC,IAAIA,EAAM,CAAC,IAAIA,EAAM,CAAC,GAEzE,OAAK8F,EAAM,IAAKC,CAAM,IAAM,IAAQD,EAAM,IAAKE,CAAM,IAAM,GAEnD,IAIPF,EAAM,IAAKC,CAAM,EACjBD,EAAM,IAAKE,CAAM,EACV,GAIT,CAs5FA,SAASC,GAAc1W,EAAOG,EAAO,CAEpC,MAAK,CAAEH,GAASA,EAAM,cAAgBG,EAAcH,EAE/C,OAAOG,EAAK,mBAAsB,SAE/B,IAAIA,EAAMH,CAAM,EAIjB,MAAM,UAAU,MAAM,KAAMA,CAAM,CAE1C,CAQA,SAAS2W,GAAkBC,EAAQ,CAElC,SAASC,EAAa5W,EAAG4H,EAAI,CAE5B,OAAO+O,EAAO3W,CAAE,EAAI2W,EAAO/O,CAAE,CAE9B,CAEA,IAAMrF,EAAIoU,EAAM,OACV1D,EAAS,IAAI,MAAO1Q,CAAE,EAC5B,QAAUvC,EAAI,EAAGA,IAAMuC,EAAG,EAAGvC,EAAIiT,EAAQjT,CAAE,EAAIA,EAE/C,OAAAiT,EAAO,KAAM2D,CAAY,EAElB3D,CAER,CAUA,SAAS4D,GAAaC,EAAQC,EAAQ9R,EAAQ,CAE7C,IAAM+R,EAAUF,EAAO,OACjB7D,EAAS,IAAI6D,EAAO,YAAaE,CAAQ,EAE/C,QAAUhX,EAAI,EAAGiX,EAAY,EAAGA,IAAcD,EAAS,EAAGhX,EAAI,CAE7D,IAAMkX,EAAYjS,EAAOjF,CAAE,EAAI+W,EAE/B,QAAUnP,EAAI,EAAGA,IAAMmP,EAAQ,EAAGnP,EAEjCqL,EAAQgE,GAAa,EAAIH,EAAQI,EAAYtP,CAAE,CAIjD,CAEA,OAAOqL,CAER,CAUA,SAASkE,GAAaC,EAAUT,EAAOG,EAAQO,EAAoB,CAElE,IAAIrX,EAAI,EAAGsX,EAAMF,EAAU,CAAE,EAE7B,KAAQE,IAAQ,QAAaA,EAAKD,CAAkB,IAAM,QAEzDC,EAAMF,EAAUpX,GAAK,EAItB,GAAKsX,IAAQ,OAAY,OAEzB,IAAInV,EAAQmV,EAAKD,CAAkB,EACnC,GAAKlV,IAAU,OAEf,GAAK,MAAM,QAASA,CAAM,EAEzB,GAECA,EAAQmV,EAAKD,CAAkB,EAE1BlV,IAAU,SAEdwU,EAAM,KAAMW,EAAI,IAAK,EACrBR,EAAO,KAAM,GAAG3U,CAAM,GAIvBmV,EAAMF,EAAUpX,GAAK,QAEZsX,IAAQ,gBAEPnV,EAAM,UAAY,OAI7B,GAECA,EAAQmV,EAAKD,CAAkB,EAE1BlV,IAAU,SAEdwU,EAAM,KAAMW,EAAI,IAAK,EACrBnV,EAAM,QAAS2U,EAAQA,EAAO,MAAO,GAItCQ,EAAMF,EAAUpX,GAAK,QAEZsX,IAAQ,YAMlB,IAECnV,EAAQmV,EAAKD,CAAkB,EAE1BlV,IAAU,SAEdwU,EAAM,KAAMW,EAAI,IAAK,EACrBR,EAAO,KAAM3U,CAAM,GAIpBmV,EAAMF,EAAUpX,GAAK,QAEZsX,IAAQ,OAIpB,CAYA,SAASC,IAASC,EAAYjX,EAAMkX,EAAYC,EAAUC,EAAM,GAAK,CAEpE,IAAMC,EAAOJ,EAAW,MAAM,EAE9BI,EAAK,KAAOrX,EAEZ,IAAMsX,EAAS,CAAC,EAEhB,QAAU7X,EAAI,EAAGA,EAAI4X,EAAK,OAAO,OAAQ,EAAG5X,EAAI,CAE/C,IAAM8X,EAAQF,EAAK,OAAQ5X,CAAE,EACvB+X,EAAYD,EAAM,aAAa,EAE/BnB,EAAQ,CAAC,EACTG,EAAS,CAAC,EAEhB,QAAUlP,EAAI,EAAGA,EAAIkQ,EAAM,MAAM,OAAQ,EAAGlQ,EAAI,CAE/C,IAAMoQ,EAAQF,EAAM,MAAOlQ,CAAE,EAAI+P,EAEjC,GAAK,EAAAK,EAAQP,GAAcO,GAASN,GAEpC,CAAAf,EAAM,KAAMmB,EAAM,MAAOlQ,CAAE,CAAE,EAE7B,QAAUmH,EAAI,EAAGA,EAAIgJ,EAAW,EAAGhJ,EAElC+H,EAAO,KAAMgB,EAAM,OAAQlQ,EAAImQ,EAAYhJ,CAAE,CAAE,EAIjD,CAEK4H,EAAM,SAAW,IAEtBmB,EAAM,MAAQrB,GAAcE,EAAOmB,EAAM,MAAM,WAAY,EAC3DA,EAAM,OAASrB,GAAcK,EAAQgB,EAAM,OAAO,WAAY,EAE9DD,EAAO,KAAMC,CAAM,EAEpB,CAEAF,EAAK,OAASC,EAId,IAAII,EAAe,IAEnB,QAAUjY,EAAI,EAAGA,EAAI4X,EAAK,OAAO,OAAQ,EAAG5X,EAEtCiY,EAAeL,EAAK,OAAQ5X,CAAE,EAAE,MAAO,CAAE,IAE7CiY,EAAeL,EAAK,OAAQ5X,CAAE,EAAE,MAAO,CAAE,GAQ3C,QAAUA,EAAI,EAAGA,EAAI4X,EAAK,OAAO,OAAQ,EAAG5X,EAE3C4X,EAAK,OAAQ5X,CAAE,EAAE,MAAO,GAAKiY,CAAa,EAI3C,OAAAL,EAAK,cAAc,EAEZA,CAER,CAWA,SAASM,IAAkBC,EAAYC,EAAiB,EAAGC,EAAgBF,EAAYR,EAAM,GAAK,CAE5FA,GAAO,IAAIA,EAAM,IAEtB,IAAMW,EAAYD,EAAc,OAAO,OACjCE,EAAgBH,EAAiBT,EAGvC,QAAU3X,EAAI,EAAGA,EAAIsY,EAAW,EAAGtY,EAAI,CAEtC,IAAMwY,EAAiBH,EAAc,OAAQrY,CAAE,EACzCyY,EAAqBD,EAAe,cAG1C,GAAKC,IAAuB,QAAUA,IAAuB,SAAW,SAGxE,IAAMC,EAAcP,EAAW,OAAO,KAAM,SAAWL,EAAQ,CAE9D,OAAOA,EAAM,OAASU,EAAe,MACjCV,EAAM,gBAAkBW,CAE7B,CAAE,EAEF,GAAKC,IAAgB,OAAY,SAEjC,IAAIC,EAAkB,EAChBC,EAAqBJ,EAAe,aAAa,EAElDA,EAAe,kBAAkB,4CAErCG,EAAkBC,EAAqB,GAIxC,IAAIrM,EAAe,EACbsM,EAAkBH,EAAY,aAAa,EAE5CA,EAAY,kBAAkB,4CAElCnM,EAAesM,EAAkB,GAIlC,IAAMC,EAAYN,EAAe,MAAM,OAAS,EAC5CO,EAGJ,GAAKR,GAAiBC,EAAe,MAAO,CAAE,EAAI,CAGjD,IAAMQ,EAAaL,EACbM,EAAWL,EAAqBD,EACtCI,EAAiBP,EAAe,OAAO,MAAOQ,EAAYC,CAAS,CAEpE,SAAYV,GAAiBC,EAAe,MAAOM,CAAU,EAAI,CAGhE,IAAME,EAAaF,EAAYF,EAAqBD,EAC9CM,EAAWD,EAAaJ,EAAqBD,EACnDI,EAAiBP,EAAe,OAAO,MAAOQ,EAAYC,CAAS,CAEpE,KAAO,CAGN,IAAMC,EAAcV,EAAe,kBAAkB,EAC/CQ,EAAaL,EACbM,EAAWL,EAAqBD,EACtCO,EAAY,SAAUX,CAAc,EACpCQ,EAAiBG,EAAY,aAAa,MAAOF,EAAYC,CAAS,CAEvE,CAGKR,IAAuB,cAEL,IAAIU,GAAW,EAAE,UAAWJ,CAAe,EAAE,UAAU,EAAE,UAAU,EAC3E,QAASA,CAAe,EAMvC,IAAMK,EAAWV,EAAY,MAAM,OACnC,QAAU9Q,EAAI,EAAGA,EAAIwR,EAAU,EAAGxR,EAAI,CAErC,IAAMyR,EAAazR,EAAIiR,EAAkBtM,EAEzC,GAAKkM,IAAuB,aAG3BU,GAAW,wBACVT,EAAY,OACZW,EACAN,EACA,EACAL,EAAY,OACZW,CACD,MAEM,CAEN,IAAMC,EAAWT,EAAkBtM,EAAe,EAGlD,QAAUwC,EAAI,EAAGA,EAAIuK,EAAU,EAAGvK,EAEjC2J,EAAY,OAAQW,EAAatK,CAAE,GAAKgK,EAAgBhK,CAAE,CAI5D,CAED,CAED,CAEA,OAAAoJ,EAAW,UAAYoB,GAEhBpB,CAER,CAyhEA,SAASqB,IAA8BC,EAAW,CAEjD,OAASA,EAAS,YAAY,EAAI,CAEjC,IAAK,SACL,IAAK,SACL,IAAK,QACL,IAAK,SACL,IAAK,UAEJ,OAAOC,GAER,IAAK,SACL,IAAK,UACL,IAAK,UACL,IAAK,UAEJ,OAAOC,GAER,IAAK,QAEJ,OAAOC,GAER,IAAK,aAEJ,OAAOC,GAER,IAAK,OACL,IAAK,UAEJ,OAAOC,GAER,IAAK,SAEJ,OAAOC,EAET,CAEA,MAAM,IAAI,MAAO,8CAAgDN,CAAS,CAE3E,CAEA,SAASO,IAAoBC,EAAO,CAEnC,GAAKA,EAAK,OAAS,OAElB,MAAM,IAAI,MAAO,0DAA2D,EAI7E,IAAMC,EAAYV,IAA8BS,EAAK,IAAK,EAE1D,GAAKA,EAAK,QAAU,OAAY,CAE/B,IAAMtD,EAAQ,CAAC,EAAGG,EAAS,CAAC,EAE5BK,GAAa8C,EAAK,KAAMtD,EAAOG,EAAQ,OAAQ,EAE/CmD,EAAK,MAAQtD,EACbsD,EAAK,OAASnD,CAEf,CAGA,OAAKoD,EAAU,QAAU,OAEjBA,EAAU,MAAOD,CAAK,EAKtB,IAAIC,EAAWD,EAAK,KAAMA,EAAK,MAAOA,EAAK,OAAQA,EAAK,aAAc,CAI/E,CAsyWA,SAASE,GAASrV,EAAGC,EAAI,CAExB,OAAOD,EAAE,SAAWC,EAAE,QAEvB,CAEA,SAAS4E,GAAWR,EAAQE,EAAWkE,EAAY6M,EAAY,CAE9D,IAAIC,EAAY,GAUhB,GARKlR,EAAO,OAAO,KAAME,EAAU,MAAO,GAE1BF,EAAO,QAASE,EAAWkE,CAAW,IAErC,KAAQ8M,EAAY,IAIhCA,IAAc,IAAQD,IAAc,GAAO,CAE/C,IAAME,EAAWnR,EAAO,SAExB,QAAUnJ,EAAI,EAAG4V,EAAI0E,EAAS,OAAQta,EAAI4V,EAAG5V,IAE5C2J,GAAW2Q,EAAUta,CAAE,EAAGqJ,EAAWkE,EAAY,EAAK,CAIxD,CAED,CAmLA,SAASgN,KAAyB,CAE5B,KAAK,UAAU,SAAW,IAAQ,KAAK,MAAM,CAEnD,CA83CA,SAASC,GAAarR,EAAS,CAE9B,IAAMsR,EAAW,CAAC,EAEbtR,EAAO,SAAW,IAEtBsR,EAAS,KAAMtR,CAAO,EAIvB,QAAUnJ,EAAI,EAAGA,EAAImJ,EAAO,SAAS,OAAQnJ,IAE5Cya,EAAS,KAAM,GAAGD,GAAarR,EAAO,SAAUnJ,CAAE,CAAE,CAAE,EAIvD,OAAOya,CAER,CAw3BA,SAASC,GAAUhR,EAAOiR,EAAUC,EAAUC,EAAQnY,EAAGM,EAAG8X,EAAI,CAE/DC,GAAQ,IAAKrY,EAAGM,EAAG8X,CAAE,EAAE,UAAWD,CAAO,EAEzC,IAAMlF,EAASgF,EAAUjR,CAAM,EAE/B,GAAKiM,IAAW,OAAY,CAE3B,IAAMqF,EAAWJ,EAAS,aAAc,UAAW,EAEnD,QAAU5a,EAAI,EAAG4V,EAAID,EAAO,OAAQ3V,EAAI4V,EAAG5V,IAE1Cgb,EAAS,OAAQrF,EAAQ3V,CAAE,EAAG+a,GAAQ,EAAGA,GAAQ,EAAGA,GAAQ,CAAE,CAIhE,CAED,CAihCA,SAASE,IAASC,EAASC,EAAS,CAEnC,IAAMC,EAAgBF,EAAQ,OAASA,EAAQ,MAAM,MAAUA,EAAQ,MAAM,MAAQA,EAAQ,MAAM,OAAS,EAE5G,OAAKE,EAAcD,GAElBD,EAAQ,OAAO,EAAI,EACnBA,EAAQ,OAAO,EAAIE,EAAcD,EAEjCD,EAAQ,OAAO,EAAI,EACnBA,EAAQ,OAAO,GAAM,EAAIA,EAAQ,OAAO,GAAM,IAI9CA,EAAQ,OAAO,EAAIC,EAASC,EAC5BF,EAAQ,OAAO,EAAI,EAEnBA,EAAQ,OAAO,GAAM,EAAIA,EAAQ,OAAO,GAAM,EAC9CA,EAAQ,OAAO,EAAI,GAIbA,CAER,CAWA,SAASG,IAAOH,EAASC,EAAS,CAEjC,IAAMC,EAAgBF,EAAQ,OAASA,EAAQ,MAAM,MAAUA,EAAQ,MAAM,MAAQA,EAAQ,MAAM,OAAS,EAE5G,OAAKE,EAAcD,GAElBD,EAAQ,OAAO,EAAIC,EAASC,EAC5BF,EAAQ,OAAO,EAAI,EAEnBA,EAAQ,OAAO,GAAM,EAAIA,EAAQ,OAAO,GAAM,EAC9CA,EAAQ,OAAO,EAAI,IAInBA,EAAQ,OAAO,EAAI,EACnBA,EAAQ,OAAO,EAAIE,EAAcD,EAEjCD,EAAQ,OAAO,EAAI,EACnBA,EAAQ,OAAO,GAAM,EAAIA,EAAQ,OAAO,GAAM,GAIxCA,CAER,CAQA,SAASI,IAAMJ,EAAU,CAExB,OAAAA,EAAQ,OAAO,EAAI,EACnBA,EAAQ,OAAO,EAAI,EAEnBA,EAAQ,OAAO,EAAI,EACnBA,EAAQ,OAAO,EAAI,EAEZA,CAER,CAWA,SAASK,GAAeC,EAAOC,EAAQC,EAAQxb,EAAO,CAErD,IAAMyb,EAAiBC,IAA0B1b,CAAK,EAEtD,OAASwb,EAAS,CAGjB,KAAKG,GACJ,OAAOL,EAAQC,EAChB,KAAKK,GACJ,OAAWN,EAAQC,EAAWE,EAAe,WAAeA,EAAe,WAC5E,KAAKI,GACJ,OAAWP,EAAQC,EAAWE,EAAe,WAAeA,EAAe,WAC5E,KAAKK,GACJ,OAAWR,EAAQC,EAAS,EAAME,EAAe,WAAeA,EAAe,WAChF,KAAKM,GACJ,OAAWT,EAAQC,EAAS,EAAME,EAAe,WAAeA,EAAe,WAChF,KAAKO,GACJ,OAAWV,EAAQC,EAAS,EAAME,EAAe,WAAeA,EAAe,WAChF,KAAKQ,GACJ,OAAWX,EAAQC,EAAS,EAAME,EAAe,WAAeA,EAAe,WAChF,KAAKS,GACJ,OAAWZ,EAAQC,EAAS,EAAME,EAAe,WAAeA,EAAe,WAGhF,KAAKU,GACL,KAAKC,GACJ,OAAO,KAAK,OAASd,EAAQ,GAAM,CAAE,EAAI,KAAK,OAASC,EAAS,GAAM,CAAE,EAAI,EAC7E,KAAKc,GACL,KAAKC,GACJ,OAAO,KAAK,OAAShB,EAAQ,GAAM,CAAE,EAAI,KAAK,OAASC,EAAS,GAAM,CAAE,EAAI,GAG7E,KAAKgB,GACL,KAAKC,GACJ,OAAS,KAAK,IAAKlB,EAAO,EAAG,EAAI,KAAK,IAAKC,EAAQ,CAAE,EAAM,EAC5D,KAAKkB,GACL,KAAKC,GACJ,OAAS,KAAK,IAAKpB,EAAO,CAAE,EAAI,KAAK,IAAKC,EAAQ,CAAE,EAAM,EAG3D,KAAKoB,GACL,KAAKC,GACL,KAAKC,GACL,KAAKC,GACJ,OAAO,KAAK,OAASxB,EAAQ,GAAM,CAAE,EAAI,KAAK,OAASC,EAAS,GAAM,CAAE,EAAI,EAC7E,KAAKwB,GACL,KAAKC,GACL,KAAKC,GACJ,OAAO,KAAK,OAAS3B,EAAQ,GAAM,CAAE,EAAI,KAAK,OAASC,EAAS,GAAM,CAAE,EAAI,GAG7E,KAAK2B,GACJ,OAAO,KAAK,OAAS5B,EAAQ,GAAM,CAAE,EAAI,KAAK,OAASC,EAAS,GAAM,CAAE,EAAI,GAC7E,KAAK4B,GACJ,OAAO,KAAK,OAAS7B,EAAQ,GAAM,CAAE,EAAI,KAAK,OAASC,EAAS,GAAM,CAAE,EAAI,GAC7E,KAAK6B,GACJ,OAAO,KAAK,OAAS9B,EAAQ,GAAM,CAAE,EAAI,KAAK,OAASC,EAAS,GAAM,CAAE,EAAI,GAC7E,KAAK8B,GACJ,OAAO,KAAK,OAAS/B,EAAQ,GAAM,CAAE,EAAI,KAAK,OAASC,EAAS,GAAM,CAAE,EAAI,GAC7E,KAAK+B,GACJ,OAAO,KAAK,OAAShC,EAAQ,GAAM,CAAE,EAAI,KAAK,OAASC,EAAS,GAAM,CAAE,EAAI,GAC7E,KAAKgC,GACJ,OAAO,KAAK,OAASjC,EAAQ,GAAM,CAAE,EAAI,KAAK,OAASC,EAAS,GAAM,CAAE,EAAI,GAC7E,KAAKiC,GACJ,OAAO,KAAK,OAASlC,EAAQ,GAAM,CAAE,EAAI,KAAK,OAASC,EAAS,GAAM,CAAE,EAAI,GAC7E,KAAKkC,GACJ,OAAO,KAAK,OAASnC,EAAQ,GAAM,CAAE,EAAI,KAAK,OAASC,EAAS,GAAM,CAAE,EAAI,GAC7E,KAAKmC,GACJ,OAAO,KAAK,OAASpC,EAAQ,GAAM,EAAG,EAAI,KAAK,OAASC,EAAS,GAAM,CAAE,EAAI,GAC9E,KAAKoC,GACJ,OAAO,KAAK,OAASrC,EAAQ,GAAM,EAAG,EAAI,KAAK,OAASC,EAAS,GAAM,CAAE,EAAI,GAC9E,KAAKqC,GACJ,OAAO,KAAK,OAAStC,EAAQ,GAAM,EAAG,EAAI,KAAK,OAASC,EAAS,GAAM,CAAE,EAAI,GAC9E,KAAKsC,GACJ,OAAO,KAAK,OAASvC,EAAQ,GAAM,EAAG,EAAI,KAAK,OAASC,EAAS,GAAM,EAAG,EAAI,GAC/E,KAAKuC,GACJ,OAAO,KAAK,OAASxC,EAAQ,IAAO,EAAG,EAAI,KAAK,OAASC,EAAS,GAAM,EAAG,EAAI,GAChF,KAAKwC,GACJ,OAAO,KAAK,OAASzC,EAAQ,IAAO,EAAG,EAAI,KAAK,OAASC,EAAS,IAAO,EAAG,EAAI,GAGjF,KAAKyC,GACL,KAAKC,GACL,KAAKC,GACJ,OAAO,KAAK,KAAM5C,EAAQ,CAAE,EAAI,KAAK,KAAMC,EAAS,CAAE,EAAI,GAG3D,KAAK4C,GACL,KAAKC,GACJ,OAAO,KAAK,KAAM9C,EAAQ,CAAE,EAAI,KAAK,KAAMC,EAAS,CAAE,EAAI,EAC3D,KAAK8C,GACL,KAAKC,GACJ,OAAO,KAAK,KAAMhD,EAAQ,CAAE,EAAI,KAAK,KAAMC,EAAS,CAAE,EAAI,EAE5D,CAEA,MAAM,IAAI,MACT,+CAA+CC,CAAM,UACtD,CAED,CAEA,SAASE,IAA0B1b,EAAO,CAEzC,OAASA,EAAO,CAEf,KAAKue,GACL,KAAKC,GACJ,MAAO,CAAE,WAAY,EAAG,WAAY,CAAE,EACvC,KAAKC,GACL,KAAKC,GACL,KAAKC,GACJ,MAAO,CAAE,WAAY,EAAG,WAAY,CAAE,EACvC,KAAKC,GACL,KAAKC,GACJ,MAAO,CAAE,WAAY,EAAG,WAAY,CAAE,EACvC,KAAKC,GACL,KAAKC,GACL,KAAKC,GACJ,MAAO,CAAE,WAAY,EAAG,WAAY,CAAE,EACvC,KAAKC,GACL,KAAKC,GACJ,MAAO,CAAE,WAAY,EAAG,WAAY,CAAE,CAExC,CAEA,MAAM,IAAI,MAAO,wBAAwBlf,CAAI,GAAI,CAElD,CA3mzDA,IAKMmf,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GASAC,GASAC,GAQAlW,GAQAD,GAQAoW,GASAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAUAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAUAC,GAQAC,GAUAC,GAQAC,GASAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GASAC,GAUAC,GACAC,GAUAC,GACAC,GAUAC,GAUAC,GACAC,GAUAC,GACAC,GAQAzF,GAQAC,GAQAE,GAQAD,GAQAM,GAQAD,GAQAE,GAQAL,GAQAC,GAQAC,GAQAoF,GAQAhF,GAQAC,GAQAvD,GAQAK,GAQAC,GAQAiI,GASAC,GAQAvI,GAQAC,GAQAC,GAQAC,GAQAqI,GAQAlI,GAQAC,GAQAC,GAQAC,GASAC,GAQAG,GAQAF,GAQAG,GAQAF,GAQAG,GAQAC,GAQAG,GAQAF,GAQAC,GAQAE,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQA+F,GASAC,GASAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GASAzL,GAQA0L,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAUAjf,GAQAU,GAQAlB,GAQAS,GAQAL,GAQAsf,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GASAC,GASAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GASAC,GASAC,GASAC,GASAC,GASAC,GASAC,GASAC,GASAC,GASAC,GAQAC,GAQAC,GAQAC,GAQAC,GAQAC,GAWAC,GAYAC,GAwEAhoB,IA4CAgB,GAEFR,GA6HEynB,GA2GApmB,GAEFgC,GAGEI,GACAG,GAudA8jB,GA8QA1d,GAq1BAuO,GAs7BAzO,EA2sCA6d,GACAC,GA8BAC,GAskBAC,GAEA1hB,GAMAC,GAgMAlB,GAcF4iB,GAOEthB,GA8HFuhB,IAQEC,GAyNFC,IAEEC,GAUAC,GAyxBAC,GAohCAC,GA8XAC,GA+BAC,GAkIAC,GA6CAC,GA2GAC,GA0CAC,GAquBAC,GAWAC,GAEAC,GAIAC,GACAC,GACAC,GAIAC,GACAC,GACAC,GAEAC,GACAC,GACAC,GACAviB,GA4BAwiB,IACAC,GACAC,GAMAC,GAwZAC,GACAC,GACAC,GACAC,GAEAC,GACAC,GACAC,GAQAC,GAmqBAC,GAmuCAC,GACAC,GACAC,IACAC,IACAC,GACAC,GACAC,GAEAC,GACAC,GAkBAC,GAobAC,GA2GFC,IAEEC,GACAC,GACAC,GACAC,GAEAC,GACAC,IACAC,IAEAC,GACAC,GACAC,GAQAC,GAQAC,IAQAC,GAQAC,GAQAC,GAmhDAC,GACAC,GACAC,GACAC,GAEAC,GACAC,GACAC,GACAC,GACAC,GACAC,GAEAC,GACAC,GACAC,GAKA9iB,GAogBA+iB,GAyBAC,GACAC,GAwDAC,GAm2BAC,GAYFC,IAUEC,GAg/BAC,GA8OAllB,GAiLAmlB,GA8BAC,GACAC,GAEFC,IAUEC,GAypBAC,GAuBAC,GAuBAC,GAuBAC,GAuBAC,GAuBAC,GAuBAC,GA0BAC,GAqKAC,GAiBFC,IAEEC,GACAC,GACAC,GACAC,GACAC,GACAC,GA4BAC,GAk4CAC,GACAC,GACAC,GACAC,GAEAvlB,GACAC,GACAC,GAEAslB,GACAC,GAEArlB,GACAV,GAcAgmB,GAwdAC,GAqUAC,GAEFC,IAEAC,IAkCEC,GAkXAC,GAsHAC,GACAC,GACAC,GAeAC,GAgYAC,GACAtV,GAgCAuV,GAyNAC,GAkEAC,GAwLAC,GAqBAC,IAQAC,GAyaAC,GAkFAC,GA4FAC,GAiKAC,GAyRAC,GAOAC,GAqiBAC,GAsHFC,GAEEC,GACAC,GACAC,GAEA1lB,GACAC,GACAC,GAEAylB,GACAC,GACAC,GAEAC,GACAC,GACAC,GAmBAC,GAsMAC,GACAC,GA4BAC,GAuSAC,GAEAC,GACAC,GAEAC,IACAC,GACAC,GAEAC,GACAC,GACAC,GAgBAC,GAyUAC,GAkCAC,GAyEAC,GACAC,IAyBAC,GAwWAC,GA4DAC,GACAC,GAEAC,GAEAC,GACAC,IACAC,GACAC,GAWAC,GA+WAC,GACAC,IACAC,IAOAC,GAkWAC,GACAC,IACAC,GASAC,GA0QAC,GACAC,GAMAC,GAwQAC,GA+CAC,GACAC,IACAC,GACAC,IACAC,GACAC,GACAC,GACAC,GACAC,IACAC,GACAC,GACAC,GA2FAC,GA88CAC,GA2GAvoB,GACAC,GAEAuoB,GACAC,GACAC,GAEAxoB,GACAC,GAsBAwoB,GAgSAC,GACAC,GAOAC,GAmEAC,GAoDAC,GA8GAC,GACAvoB,GACAwoB,GACAC,GAOAC,GAkOAC,GAuHAC,GAgFAC,GAgEAC,GAmFAC,GAqFAC,GA6CAC,GAwCAC,GAmGAC,GA6EAC,GAuDAC,GA0NAC,GAkIAC,GAsUAC,GA6DAC,GA4VAC,GAkFAC,GACAC,GACAC,GACAC,GAgBAC,GAgKAC,GA8gBAC,GA4OAC,GA2GArsB,GACAkJ,GACAC,GACAmjB,GA0BAC,GA6VAC,GA2HAC,GA4HAC,GA4HAC,GA4IAC,GAgHAC,GAoIAC,GAoHFC,GAoBEC,GAmTAC,GAwUAC,GAmwBAC,GAwBAC,GAgIAC,GAwwBAC,IAmGAC,GA2EAC,GA0NAC,GAmEAC,GAiIAC,GAkKAC,GA8NAC,GA0KAC,GAgEAC,GAyJAC,GAqNAC,GA8OAC,GAyJFC,GA2CEC,GA8EAC,GAgEAC,GA0ZAC,GAugBAC,GA4YAC,GA2TAC,GAqLAC,GAwXAC,GAoJAC,GAqHAC,GAmPAC,GAybAC,GA8HAC,GAqTAC,GAuJAC,GAgDAC,GA6BAC,GAykBA7gB,GAmDAF,GA+BAF,GA+BAkhB,GA2CA/gB,GA+CAE,GAmDAJ,GA6BAkhB,GA0mBAC,GAgGAC,GAqTAC,GAOAC,GAgNAC,GAEAC,GA0BAC,GAyVAC,GA0FAC,GA0IAC,GAeAC,GA6KAC,GAgFAC,GAuJAC,GA2DAC,GAuFAC,GA0DAC,GACAC,GACAC,GAQAC,GAkUAC,GA4FAC,GA4KAC,GAqCAC,GA8HAC,GAyOAC,GAiDAC,GA6FAC,GAoDAC,GA8FAC,GA8VAC,GAgEAC,GA+YAC,GA0DAC,GAqEAC,GAuOAC,GAuoCAC,IASAC,GAMAC,GASAC,GAyBAC,GA8LFC,GAOEC,GAiDAC,GA0EAC,GACAC,GACAC,GAQAC,GA8IAC,GA2CAC,GA4HAC,GACAC,GACAC,IAEAC,GACAC,GAYAC,GAyNAC,GA6uBAC,GACAC,GACAC,IACAC,GAgCAC,GAgPAC,GAwEAC,GA2XAC,GACAC,IAKAC,GACAC,IAIAC,IAGAC,IAIAC,IAIAC,IAEAC,IASAC,IAEAC,GAuEAC,GAgsBAC,GAsYAC,GA45BAC,IAOAC,GA20BAC,GAoDAC,GAgCFC,IAWEC,GA0KAC,GA6EAC,GA+JAC,GAOAC,GAuQAC,GA6KAC,GAgJAC,GA6IAC,GAmGAC,GAKAC,GAqXAC,GACAC,GAEAC,GACAC,GACAC,GACAC,IACAC,IAKAC,GAgUAC,GAgBAC,GA8HAC,GACAC,GACAC,GAYAC,GA0LAC,GAiHAC,IACAC,GACAC,GAcAC,GAmHAC,GA4EAC,GAsGAC,GACAC,GACAC,GAiBAC,GAqHArnB,GACAsnB,GAkBAC,GAyTAC,GAmBAC,GAuIAC,GA2EAC,GA6EAC,GACFC,GAAeC,GAqBbC,GAqJAC,GAiFAC,GA0WAC,GAuVAC,GAlnzDNC,GAAAC,GAAA,KAKM/jB,GAAW,MAQXC,GAAQ,CAAE,KAAM,EAAG,OAAQ,EAAG,MAAO,EAAG,OAAQ,EAAG,MAAO,EAAG,IAAK,CAAE,EAQpEC,GAAQ,CAAE,OAAQ,EAAG,IAAK,EAAG,UAAW,EAAG,aAAc,CAAE,EAQ3DC,GAAe,EAQfC,GAAe,EAQfC,GAAgB,EAQhBC,GAAoB,EAQpBC,GAAiB,EAQjBC,GAAe,EASfC,GAAmB,EASnBC,GAAe,EAQflW,GAAY,EAQZD,GAAW,EAQXoW,GAAa,EASbC,GAAa,EAQbC,GAAiB,EAQjBC,GAAmB,EAQnBC,GAAsB,EAQtBC,GAAmB,EAQnBC,GAAiB,EAQjBC,GAAc,IAQdC,GAAmB,IAQnBC,GAA0B,IAQ1BC,GAAc,IAQdC,GAAc,IAQdC,GAAa,IAQbC,GAAY,IAQZC,GAAiB,IAQjBC,GAAyB,IAQzBC,GAAiB,IAQjBC,GAAyB,IAQzBC,GAAiB,IAQjBC,GAAyB,IAQzBC,GAAiB,IAQjBC,GAAyB,IAUzBC,GAAyB,IAQzBC,GAAsB,IAQtBC,GAA8B,IAQ9BC,GAAsB,IAQtBC,GAA8B,IAQ9BC,GAAa,EAQbC,GAAc,EAQdC,GAAY,EAQZC,GAAiB,EAQjBC,GAAa,EAQbC,GAAoB,EAQpBC,GAAe,EAQfC,GAAgB,EAQhBC,GAAoB,EAQpBC,GAAe,EAQfC,GAAe,EAQfC,GAAgB,EAQhBC,GAAoB,EAQpBC,GAAsB,EAQtBC,GAAoB,EAQpBC,GAAwB,EAUxBC,GAAoB,EAQpBC,GAAiB,EAUjBC,GAAqB,EAQrBC,GAAmB,WASnBC,GAAmB,WAQnBC,GAAY,IAQZC,GAAwB,IAQxBC,GAAwB,IAQxBC,GAAmC,IAQnCC,GAAmC,IAQnCC,GAA0B,IAQ1BC,GAAiB,IAQjBC,GAAsB,KAQtBC,GAAyB,KASzBC,GAAgB,KAUhBC,GAA6B,KAC7BC,GAA6B,KAU7BC,GAA4B,KAC5BC,GAA4B,KAU5BC,GAAe,KAUfC,GAA4B,KAC5BC,GAA4B,KAU5BC,GAA2B,KAC3BC,GAA2B,KAQ3BzF,GAAmB,KAQnBC,GAAW,KAQXE,GAAY,KAQZD,GAAoB,KAQpBM,GAAU,KAQVD,GAAkB,KAQlBE,GAAY,KAQZL,GAAgB,KAQhBC,GAAwB,KAQxBC,GAAwB,KAQxBoF,GAAqB,KAQrBhF,GAAsB,MAQtBC,GAAwB,MAQxBvD,GAAc,KAQdK,GAAY,KAQZC,GAAa,KAQbiI,GAAc,KASdC,GAAqB,KAQrBvI,GAAY,KAQZC,GAAmB,KAQnBC,GAAW,KAQXC,GAAkB,KAQlBqI,GAAmB,KAQnBlI,GAAoB,KAQpBC,GAAuB,MAQvBC,GAAwB,MAQxBC,GAAwB,MASxBC,GAAwB,MAQxBG,GAA0B,MAQ1BF,GAA0B,MAQ1BG,GAA2B,MAQ3BF,GAA2B,MAQ3BG,GAAkB,MAQlBC,GAAkB,MAQlBG,GAAuB,MAQvBF,GAAiB,MAQjBC,GAAwB,MAQxBE,GAAkB,MAQlBC,GAAyB,MAQzBC,GAAuB,MAQvBC,GAAuB,MAQvBC,GAAuB,MAQvBC,GAAuB,MAQvBC,GAAuB,MAQvBC,GAAuB,MAQvBC,GAAuB,MAQvBC,GAAuB,MAQvBC,GAAwB,MAQxBC,GAAwB,MAQxBC,GAAwB,MAQxBC,GAAyB,MAQzBC,GAAyB,MAQzBC,GAAyB,MAQzBC,GAAmB,MAQnBC,GAAyB,MAQzBC,GAA2B,MAQ3BC,GAAmB,MAQnBC,GAA0B,MAQ1BC,GAAyB,MAQzBC,GAAgC,MAQhC+F,GAAW,KASXC,GAAa,KASbC,GAAe,KAQfC,GAAsB,KAQtBC,GAAoB,KAQpBC,GAAoB,KAQpBC,GAAsB,KAQtBC,GAAkB,KAQlBC,GAAmB,KAQnBC,GAA2B,KAS3BzL,GAA6B,KAQ7B0L,GAAoB,EAQpBC,GAAwB,EAQxBC,GAAsB,EAQtBC,GAAoB,KAQpBC,GAAmB,KAQnBC,GAAkB,KAQlBC,GAAiB,KAQjBC,GAAwB,EAQxBC,GAAuB,EAUvBjf,GAAe,GAQfU,GAAiB,OAQjBlB,GAAuB,cAQvBS,GAAiB,SAQjBL,GAAe,OAQfsf,GAAkB,GAQlBC,GAAkB,KAQlBC,GAAkB,KAQlBC,GAAgB,EAQhBC,GAAgB,KAQhBC,GAAmB,KAQnBC,GAAqB,KAQrBC,GAAqB,KASrBC,GAAyB,MASzBC,GAAyB,MAQzBC,GAAkB,KAQlBC,GAAmB,IAQnBC,GAAkB,IAQlBC,GAAmB,IAQnBC,GAAuB,IAQvBC,GAAqB,IAQrBC,GAAsB,IAQtBC,GAA0B,IAQ1BC,GAAoB,IAQpBC,GAAe,IAQfC,GAAc,IAQdC,GAAe,IAQfC,GAAmB,IAQnBC,GAAiB,IAQjBC,GAAkB,IAQlBC,GAAsB,IAQtBC,GAAgB,IAShBC,GAAkB,MASlBC,GAAmB,MASnBC,GAAkB,MASlBC,GAAkB,MASlBC,GAAmB,MASnBC,GAAkB,MASlBC,GAAkB,MASlBC,GAAmB,MASnBC,GAAkB,MAQlBC,GAAQ,MAQRC,GAAQ,SAQRC,GAAwB,IAQxBC,GAAyB,KAQzBC,GAAiB,CACtB,QAAS,UACT,OAAQ,QACT,EAQMC,GAA4B,CACjC,YAAa,cACb,OAAQ,SACR,KAAM,MACP,EAQMC,GAA4B,CACjC,OAAQ,SACR,SAAU,WACV,OAAQ,SACR,MAAO,QACP,OAAQ,QACT,EAkEMhoB,IAAe,CACpB,UACA,WACA,kBACA,WACA,YACA,WACA,YACA,aACA,YACD,EAkCMgB,GAAS,CAAC,EAEZR,GAAsB,KA6HpBynB,GAAN,KAAsB,CAQrB,iBAAkBnoB,EAAMmjC,EAAW,CAE7B,KAAK,aAAe,SAAY,KAAK,WAAa,CAAC,GAExD,IAAMC,EAAY,KAAK,WAElBA,EAAWpjC,CAAK,IAAM,SAE1BojC,EAAWpjC,CAAK,EAAI,CAAC,GAIjBojC,EAAWpjC,CAAK,EAAE,QAASmjC,CAAS,IAAM,IAE9CC,EAAWpjC,CAAK,EAAE,KAAMmjC,CAAS,CAInC,CASA,iBAAkBnjC,EAAMmjC,EAAW,CAElC,IAAMC,EAAY,KAAK,WAEvB,OAAKA,IAAc,OAAmB,GAE/BA,EAAWpjC,CAAK,IAAM,QAAaojC,EAAWpjC,CAAK,EAAE,QAASmjC,CAAS,IAAM,EAErF,CAQA,oBAAqBnjC,EAAMmjC,EAAW,CAErC,IAAMC,EAAY,KAAK,WAEvB,GAAKA,IAAc,OAAY,OAE/B,IAAMC,EAAgBD,EAAWpjC,CAAK,EAEtC,GAAKqjC,IAAkB,OAAY,CAElC,IAAMn2B,EAAQm2B,EAAc,QAASF,CAAS,EAEzCj2B,IAAU,IAEdm2B,EAAc,OAAQn2B,EAAO,CAAE,CAIjC,CAED,CAOA,cAAeo2B,EAAQ,CAEtB,IAAMF,EAAY,KAAK,WAEvB,GAAKA,IAAc,OAAY,OAE/B,IAAMC,EAAgBD,EAAWE,EAAM,IAAK,EAE5C,GAAKD,IAAkB,OAAY,CAElCC,EAAM,OAAS,KAGf,IAAMzjC,EAAQwjC,EAAc,MAAO,CAAE,EAErC,QAAUvjC,EAAI,EAAG4V,EAAI7V,EAAM,OAAQC,EAAI4V,EAAG5V,IAEzCD,EAAOC,CAAE,EAAE,KAAM,KAAMwjC,CAAM,EAI9BA,EAAM,OAAS,IAEhB,CAED,CAED,EAEMvhC,GAAO,CAAE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,IAAK,EAE1gDgC,GAAQ,QAGNI,GAAU,KAAK,GAAK,IACpBG,GAAU,IAAM,KAAK,GAudrB8jB,GAAY,CACjB,QAASjkB,GACT,QAASG,GAST,aAAc5C,GAWd,MAAOM,GAWP,gBAAiBI,GAcjB,UAAWG,IAYX,YAAaM,IAYb,KAAME,GAeN,KAAMC,IAUN,SAAUG,IAeV,WAAYE,IAYZ,aAAcC,IAUd,QAASC,IAUT,UAAWG,IASX,gBAAiBC,IASjB,aAAcE,IASd,SAAUI,IASV,SAAUG,IASV,aAAcG,IASd,eAAgBC,IAShB,gBAAiBC,IAgBjB,6BAA8BC,IAU9B,UAAWiB,GAUX,YAAaD,EACd,EA2BMgF,GAAN,MAAM64B,CAAQ,CAQb,YAAa/gC,EAAI,EAAGM,EAAI,EAAI,CAS3BygC,EAAQ,UAAU,UAAY,GAO9B,KAAK,EAAI/gC,EAOT,KAAK,EAAIM,CAEV,CAOA,IAAI,OAAQ,CAEX,OAAO,KAAK,CAEb,CAEA,IAAI,MAAOb,EAAQ,CAElB,KAAK,EAAIA,CAEV,CAOA,IAAI,QAAS,CAEZ,OAAO,KAAK,CAEb,CAEA,IAAI,OAAQA,EAAQ,CAEnB,KAAK,EAAIA,CAEV,CASA,IAAKO,EAAGM,EAAI,CAEX,YAAK,EAAIN,EACT,KAAK,EAAIM,EAEF,IAER,CAQA,UAAW0gC,EAAS,CAEnB,YAAK,EAAIA,EACT,KAAK,EAAIA,EAEF,IAER,CAQA,KAAMhhC,EAAI,CAET,YAAK,EAAIA,EAEF,IAER,CAQA,KAAMM,EAAI,CAET,YAAK,EAAIA,EAEF,IAER,CASA,aAAcoK,EAAOjL,EAAQ,CAE5B,OAASiL,EAAQ,CAEhB,IAAK,GAAG,KAAK,EAAIjL,EAAO,MACxB,IAAK,GAAG,KAAK,EAAIA,EAAO,MACxB,QAAS,MAAM,IAAI,MAAO,0BAA4BiL,CAAM,CAE7D,CAEA,OAAO,IAER,CAQA,aAAcA,EAAQ,CAErB,OAASA,EAAQ,CAEhB,IAAK,GAAG,OAAO,KAAK,EACpB,IAAK,GAAG,OAAO,KAAK,EACpB,QAAS,MAAM,IAAI,MAAO,0BAA4BA,CAAM,CAE7D,CAED,CAOA,OAAQ,CAEP,OAAO,IAAI,KAAK,YAAa,KAAK,EAAG,KAAK,CAAE,CAE7C,CAQA,KAAMu2B,EAAI,CAET,YAAK,EAAIA,EAAE,EACX,KAAK,EAAIA,EAAE,EAEJ,IAER,CAQA,IAAKA,EAAI,CAER,YAAK,GAAKA,EAAE,EACZ,KAAK,GAAKA,EAAE,EAEL,IAER,CAQA,UAAW3/B,EAAI,CAEd,YAAK,GAAKA,EACV,KAAK,GAAKA,EAEH,IAER,CASA,WAAYc,EAAGC,EAAI,CAElB,YAAK,EAAID,EAAE,EAAIC,EAAE,EACjB,KAAK,EAAID,EAAE,EAAIC,EAAE,EAEV,IAER,CASA,gBAAiB4+B,EAAG3/B,EAAI,CAEvB,YAAK,GAAK2/B,EAAE,EAAI3/B,EAChB,KAAK,GAAK2/B,EAAE,EAAI3/B,EAET,IAER,CAQA,IAAK2/B,EAAI,CAER,YAAK,GAAKA,EAAE,EACZ,KAAK,GAAKA,EAAE,EAEL,IAER,CAQA,UAAW3/B,EAAI,CAEd,YAAK,GAAKA,EACV,KAAK,GAAKA,EAEH,IAER,CASA,WAAYc,EAAGC,EAAI,CAElB,YAAK,EAAID,EAAE,EAAIC,EAAE,EACjB,KAAK,EAAID,EAAE,EAAIC,EAAE,EAEV,IAER,CAQA,SAAU4+B,EAAI,CAEb,YAAK,GAAKA,EAAE,EACZ,KAAK,GAAKA,EAAE,EAEL,IAER,CAQA,eAAgBD,EAAS,CAExB,YAAK,GAAKA,EACV,KAAK,GAAKA,EAEH,IAER,CAQA,OAAQC,EAAI,CAEX,YAAK,GAAKA,EAAE,EACZ,KAAK,GAAKA,EAAE,EAEL,IAER,CAQA,aAAcD,EAAS,CAEtB,OAAO,KAAK,eAAgB,EAAIA,CAAO,CAExC,CASA,aAAclhC,EAAI,CAEjB,IAAME,EAAI,KAAK,EAAGM,EAAI,KAAK,EACrByF,EAAIjG,EAAE,SAEZ,YAAK,EAAIiG,EAAG,CAAE,EAAI/F,EAAI+F,EAAG,CAAE,EAAIzF,EAAIyF,EAAG,CAAE,EACxC,KAAK,EAAIA,EAAG,CAAE,EAAI/F,EAAI+F,EAAG,CAAE,EAAIzF,EAAIyF,EAAG,CAAE,EAEjC,IAER,CASA,IAAKk7B,EAAI,CAER,YAAK,EAAI,KAAK,IAAK,KAAK,EAAGA,EAAE,CAAE,EAC/B,KAAK,EAAI,KAAK,IAAK,KAAK,EAAGA,EAAE,CAAE,EAExB,IAER,CASA,IAAKA,EAAI,CAER,YAAK,EAAI,KAAK,IAAK,KAAK,EAAGA,EAAE,CAAE,EAC/B,KAAK,EAAI,KAAK,IAAK,KAAK,EAAGA,EAAE,CAAE,EAExB,IAER,CAYA,MAAOvhC,EAAKC,EAAM,CAIjB,YAAK,EAAIH,GAAO,KAAK,EAAGE,EAAI,EAAGC,EAAI,CAAE,EACrC,KAAK,EAAIH,GAAO,KAAK,EAAGE,EAAI,EAAGC,EAAI,CAAE,EAE9B,IAER,CAYA,YAAauhC,EAAQC,EAAS,CAE7B,YAAK,EAAI3hC,GAAO,KAAK,EAAG0hC,EAAQC,CAAO,EACvC,KAAK,EAAI3hC,GAAO,KAAK,EAAG0hC,EAAQC,CAAO,EAEhC,IAER,CAYA,YAAazhC,EAAKC,EAAM,CAEvB,IAAMiB,EAAS,KAAK,OAAO,EAE3B,OAAO,KAAK,aAAcA,GAAU,CAAE,EAAE,eAAgBpB,GAAOoB,EAAQlB,EAAKC,CAAI,CAAE,CAEnF,CAOA,OAAQ,CAEP,YAAK,EAAI,KAAK,MAAO,KAAK,CAAE,EAC5B,KAAK,EAAI,KAAK,MAAO,KAAK,CAAE,EAErB,IAER,CAOA,MAAO,CAEN,YAAK,EAAI,KAAK,KAAM,KAAK,CAAE,EAC3B,KAAK,EAAI,KAAK,KAAM,KAAK,CAAE,EAEpB,IAER,CAOA,OAAQ,CAEP,YAAK,EAAI,KAAK,MAAO,KAAK,CAAE,EAC5B,KAAK,EAAI,KAAK,MAAO,KAAK,CAAE,EAErB,IAER,CAQA,aAAc,CAEb,YAAK,EAAI,KAAK,MAAO,KAAK,CAAE,EAC5B,KAAK,EAAI,KAAK,MAAO,KAAK,CAAE,EAErB,IAER,CAOA,QAAS,CAER,YAAK,EAAI,CAAE,KAAK,EAChB,KAAK,EAAI,CAAE,KAAK,EAET,IAER,CAQA,IAAKshC,EAAI,CAER,OAAO,KAAK,EAAIA,EAAE,EAAI,KAAK,EAAIA,EAAE,CAElC,CAQA,MAAOA,EAAI,CAEV,OAAO,KAAK,EAAIA,EAAE,EAAI,KAAK,EAAIA,EAAE,CAElC,CASA,UAAW,CAEV,OAAO,KAAK,EAAI,KAAK,EAAI,KAAK,EAAI,KAAK,CAExC,CAOA,QAAS,CAER,OAAO,KAAK,KAAM,KAAK,EAAI,KAAK,EAAI,KAAK,EAAI,KAAK,CAAE,CAErD,CAOA,iBAAkB,CAEjB,OAAO,KAAK,IAAK,KAAK,CAAE,EAAI,KAAK,IAAK,KAAK,CAAE,CAE9C,CAQA,WAAY,CAEX,OAAO,KAAK,aAAc,KAAK,OAAO,GAAK,CAAE,CAE9C,CAOA,OAAQ,CAIP,OAFc,KAAK,MAAO,CAAE,KAAK,EAAG,CAAE,KAAK,CAAE,EAAI,KAAK,EAIvD,CAQA,QAASA,EAAI,CAEZ,IAAMG,EAAc,KAAK,KAAM,KAAK,SAAS,EAAIH,EAAE,SAAS,CAAE,EAE9D,GAAKG,IAAgB,EAAI,OAAO,KAAK,GAAK,EAE1C,IAAMC,EAAQ,KAAK,IAAKJ,CAAE,EAAIG,EAI9B,OAAO,KAAK,KAAM5hC,GAAO6hC,EAAO,GAAI,CAAE,CAAE,CAEzC,CAQA,WAAYJ,EAAI,CAEf,OAAO,KAAK,KAAM,KAAK,kBAAmBA,CAAE,CAAE,CAE/C,CAUA,kBAAmBA,EAAI,CAEtB,IAAMK,EAAK,KAAK,EAAIL,EAAE,EAAGM,EAAK,KAAK,EAAIN,EAAE,EACzC,OAAOK,EAAKA,EAAKC,EAAKA,CAEvB,CAQA,oBAAqBN,EAAI,CAExB,OAAO,KAAK,IAAK,KAAK,EAAIA,EAAE,CAAE,EAAI,KAAK,IAAK,KAAK,EAAIA,EAAE,CAAE,CAE1D,CASA,UAAWrgC,EAAS,CAEnB,OAAO,KAAK,UAAU,EAAE,eAAgBA,CAAO,CAEhD,CAWA,KAAMqgC,EAAGO,EAAQ,CAEhB,YAAK,IAAOP,EAAE,EAAI,KAAK,GAAMO,EAC7B,KAAK,IAAOP,EAAE,EAAI,KAAK,GAAMO,EAEtB,IAER,CAYA,YAAaz8B,EAAIC,EAAIw8B,EAAQ,CAE5B,YAAK,EAAIz8B,EAAG,GAAMC,EAAG,EAAID,EAAG,GAAMy8B,EAClC,KAAK,EAAIz8B,EAAG,GAAMC,EAAG,EAAID,EAAG,GAAMy8B,EAE3B,IAER,CAQA,OAAQP,EAAI,CAEX,OAAWA,EAAE,IAAM,KAAK,GAASA,EAAE,IAAM,KAAK,CAE/C,CAUA,UAAW5jC,EAAOokC,EAAS,EAAI,CAE9B,YAAK,EAAIpkC,EAAOokC,CAAO,EACvB,KAAK,EAAIpkC,EAAOokC,EAAS,CAAE,EAEpB,IAER,CAUA,QAASpkC,EAAQ,CAAC,EAAGokC,EAAS,EAAI,CAEjC,OAAApkC,EAAOokC,CAAO,EAAI,KAAK,EACvBpkC,EAAOokC,EAAS,CAAE,EAAI,KAAK,EAEpBpkC,CAER,CASA,oBAAqBqkC,EAAWh3B,EAAQ,CAEvC,YAAK,EAAIg3B,EAAU,KAAMh3B,CAAM,EAC/B,KAAK,EAAIg3B,EAAU,KAAMh3B,CAAM,EAExB,IAER,CASA,aAActB,EAAQu4B,EAAQ,CAE7B,IAAMr/B,EAAI,KAAK,IAAKq/B,CAAM,EAAGrgC,EAAI,KAAK,IAAKqgC,CAAM,EAE3C3hC,EAAI,KAAK,EAAIoJ,EAAO,EACpB9I,EAAI,KAAK,EAAI8I,EAAO,EAE1B,YAAK,EAAIpJ,EAAIsC,EAAIhC,EAAIgB,EAAI8H,EAAO,EAChC,KAAK,EAAIpJ,EAAIsB,EAAIhB,EAAIgC,EAAI8G,EAAO,EAEzB,IAER,CAQA,QAAS,CAER,YAAK,EAAI,KAAK,OAAO,EACrB,KAAK,EAAI,KAAK,OAAO,EAEd,IAER,CAEA,EAAG,OAAO,QAAS,GAAI,CAEtB,MAAM,KAAK,EACX,MAAM,KAAK,CAEZ,CAED,EAiBMqN,GAAN,KAAiB,CAUhB,YAAazW,EAAI,EAAGM,EAAI,EAAG8X,EAAI,EAAGwpB,EAAI,EAAI,CASzC,KAAK,aAAe,GAEpB,KAAK,GAAK5hC,EACV,KAAK,GAAKM,EACV,KAAK,GAAK8X,EACV,KAAK,GAAKwpB,CAEX,CAeA,OAAO,UAAWt5B,EAAKiM,EAAWstB,EAAMC,EAAYC,EAAMC,EAAYxgC,EAAI,CAEzE,IAAI8J,EAAKu2B,EAAMC,EAAa,CAAE,EAC7BryB,EAAKoyB,EAAMC,EAAa,CAAE,EAC1BG,EAAKJ,EAAMC,EAAa,CAAE,EAC1BI,EAAKL,EAAMC,EAAa,CAAE,EAEvBv2B,EAAKw2B,EAAMC,EAAa,CAAE,EAC7BtyB,EAAKqyB,EAAMC,EAAa,CAAE,EAC1BG,EAAKJ,EAAMC,EAAa,CAAE,EAC1BI,EAAKL,EAAMC,EAAa,CAAE,EAE3B,GAAKxgC,GAAK,EAAI,CAEb8G,EAAKiM,EAAY,CAAE,EAAIjJ,EACvBhD,EAAKiM,EAAY,CAAE,EAAI9E,EACvBnH,EAAKiM,EAAY,CAAE,EAAI0tB,EACvB35B,EAAKiM,EAAY,CAAE,EAAI2tB,EAEvB,MAED,CAEA,GAAK1gC,GAAK,EAAI,CAEb8G,EAAKiM,EAAY,CAAE,EAAIhJ,EACvBjD,EAAKiM,EAAY,CAAE,EAAI7E,EACvBpH,EAAKiM,EAAY,CAAE,EAAI4tB,EACvB75B,EAAKiM,EAAY,CAAE,EAAI6tB,EAEvB,MAED,CAEA,GAAKF,IAAOE,GAAM92B,IAAOC,GAAMkE,IAAOC,GAAMuyB,IAAOE,EAAK,CAEvD,IAAIE,EAAM/2B,EAAKC,EAAKkE,EAAKC,EAAKuyB,EAAKE,EAAKD,EAAKE,EAExCC,EAAM,IAEV92B,EAAK,CAAEA,EACPmE,EAAK,CAAEA,EACPyyB,EAAK,CAAEA,EACPC,EAAK,CAAEA,EAEPC,EAAM,CAAEA,GAIT,IAAI/gC,EAAI,EAAIE,EAEZ,GAAK6gC,EAAM,MAAS,CAInB,IAAMhB,EAAQ,KAAK,KAAMgB,CAAI,EACvB5/B,EAAM,KAAK,IAAK4+B,CAAM,EAE5B//B,EAAI,KAAK,IAAKA,EAAI+/B,CAAM,EAAI5+B,EAC5BjB,EAAI,KAAK,IAAKA,EAAI6/B,CAAM,EAAI5+B,EAE5B6I,EAAKA,EAAKhK,EAAIiK,EAAK/J,EACnBiO,EAAKA,EAAKnO,EAAIoO,EAAKlO,EACnBygC,EAAKA,EAAK3gC,EAAI6gC,EAAK3gC,EACnB0gC,EAAKA,EAAK5gC,EAAI8gC,EAAK5gC,CAEpB,KAAO,CAIN8J,EAAKA,EAAKhK,EAAIiK,EAAK/J,EACnBiO,EAAKA,EAAKnO,EAAIoO,EAAKlO,EACnBygC,EAAKA,EAAK3gC,EAAI6gC,EAAK3gC,EACnB0gC,EAAKA,EAAK5gC,EAAI8gC,EAAK5gC,EAEnB,IAAM8E,EAAI,EAAI,KAAK,KAAMgF,EAAKA,EAAKmE,EAAKA,EAAKwyB,EAAKA,EAAKC,EAAKA,CAAG,EAE/D52B,GAAMhF,EACNmJ,GAAMnJ,EACN27B,GAAM37B,EACN47B,GAAM57B,CAEP,CAED,CAEAgC,EAAKiM,CAAU,EAAIjJ,EACnBhD,EAAKiM,EAAY,CAAE,EAAI9E,EACvBnH,EAAKiM,EAAY,CAAE,EAAI0tB,EACvB35B,EAAKiM,EAAY,CAAE,EAAI2tB,CAExB,CAeA,OAAO,wBAAyB55B,EAAKiM,EAAWstB,EAAMC,EAAYC,EAAMC,EAAa,CAEpF,IAAM12B,EAAKu2B,EAAMC,CAAW,EACtBryB,EAAKoyB,EAAMC,EAAa,CAAE,EAC1BG,EAAKJ,EAAMC,EAAa,CAAE,EAC1BI,EAAKL,EAAMC,EAAa,CAAE,EAE1Bv2B,EAAKw2B,EAAMC,CAAW,EACtBtyB,EAAKqyB,EAAMC,EAAa,CAAE,EAC1BG,EAAKJ,EAAMC,EAAa,CAAE,EAC1BI,EAAKL,EAAMC,EAAa,CAAE,EAEhC,OAAA15B,EAAKiM,CAAU,EAAIjJ,EAAK82B,EAAKF,EAAK32B,EAAKkE,EAAK0yB,EAAKF,EAAKvyB,EACtDpH,EAAKiM,EAAY,CAAE,EAAI9E,EAAK2yB,EAAKF,EAAKxyB,EAAKuyB,EAAK12B,EAAKD,EAAK62B,EAC1D75B,EAAKiM,EAAY,CAAE,EAAI0tB,EAAKG,EAAKF,EAAKC,EAAK72B,EAAKoE,EAAKD,EAAKlE,EAC1DjD,EAAKiM,EAAY,CAAE,EAAI2tB,EAAKE,EAAK92B,EAAKC,EAAKkE,EAAKC,EAAKuyB,EAAKE,EAEnD75B,CAER,CAQA,IAAI,GAAI,CAEP,OAAO,KAAK,EAEb,CAEA,IAAI,EAAG7I,EAAQ,CAEd,KAAK,GAAKA,EACV,KAAK,kBAAkB,CAExB,CAQA,IAAI,GAAI,CAEP,OAAO,KAAK,EAEb,CAEA,IAAI,EAAGA,EAAQ,CAEd,KAAK,GAAKA,EACV,KAAK,kBAAkB,CAExB,CAQA,IAAI,GAAI,CAEP,OAAO,KAAK,EAEb,CAEA,IAAI,EAAGA,EAAQ,CAEd,KAAK,GAAKA,EACV,KAAK,kBAAkB,CAExB,CAQA,IAAI,GAAI,CAEP,OAAO,KAAK,EAEb,CAEA,IAAI,EAAGA,EAAQ,CAEd,KAAK,GAAKA,EACV,KAAK,kBAAkB,CAExB,CAWA,IAAKO,EAAGM,EAAG8X,EAAGwpB,EAAI,CAEjB,YAAK,GAAK5hC,EACV,KAAK,GAAKM,EACV,KAAK,GAAK8X,EACV,KAAK,GAAKwpB,EAEV,KAAK,kBAAkB,EAEhB,IAER,CAOA,OAAQ,CAEP,OAAO,IAAI,KAAK,YAAa,KAAK,GAAI,KAAK,GAAI,KAAK,GAAI,KAAK,EAAG,CAEjE,CAQA,KAAMU,EAAa,CAElB,YAAK,GAAKA,EAAW,EACrB,KAAK,GAAKA,EAAW,EACrB,KAAK,GAAKA,EAAW,EACrB,KAAK,GAAKA,EAAW,EAErB,KAAK,kBAAkB,EAEhB,IAER,CAUA,aAAcC,EAAOC,EAAS,GAAO,CAEpC,IAAMxiC,EAAIuiC,EAAM,GAAIjiC,EAAIiiC,EAAM,GAAInqB,EAAImqB,EAAM,GAAIhgC,EAAQggC,EAAM,OAMxD//B,EAAM,KAAK,IACXC,EAAM,KAAK,IAEX0I,EAAK3I,EAAKxC,EAAI,CAAE,EAChB0C,EAAKF,EAAKlC,EAAI,CAAE,EAChB8K,EAAK5I,EAAK4V,EAAI,CAAE,EAEhBqqB,EAAKhgC,EAAKzC,EAAI,CAAE,EAChB2C,EAAKF,EAAKnC,EAAI,CAAE,EAChBoiC,EAAKjgC,EAAK2V,EAAI,CAAE,EAEtB,OAAS7V,EAAQ,CAEhB,IAAK,MACJ,KAAK,GAAKkgC,EAAK//B,EAAK0I,EAAKD,EAAKxI,EAAK+/B,EACnC,KAAK,GAAKv3B,EAAKxI,EAAKyI,EAAKq3B,EAAK//B,EAAKggC,EACnC,KAAK,GAAKv3B,EAAKzI,EAAKggC,EAAKD,EAAK9/B,EAAKyI,EACnC,KAAK,GAAKD,EAAKzI,EAAK0I,EAAKq3B,EAAK9/B,EAAK+/B,EACnC,MAED,IAAK,MACJ,KAAK,GAAKD,EAAK//B,EAAK0I,EAAKD,EAAKxI,EAAK+/B,EACnC,KAAK,GAAKv3B,EAAKxI,EAAKyI,EAAKq3B,EAAK//B,EAAKggC,EACnC,KAAK,GAAKv3B,EAAKzI,EAAKggC,EAAKD,EAAK9/B,EAAKyI,EACnC,KAAK,GAAKD,EAAKzI,EAAK0I,EAAKq3B,EAAK9/B,EAAK+/B,EACnC,MAED,IAAK,MACJ,KAAK,GAAKD,EAAK//B,EAAK0I,EAAKD,EAAKxI,EAAK+/B,EACnC,KAAK,GAAKv3B,EAAKxI,EAAKyI,EAAKq3B,EAAK//B,EAAKggC,EACnC,KAAK,GAAKv3B,EAAKzI,EAAKggC,EAAKD,EAAK9/B,EAAKyI,EACnC,KAAK,GAAKD,EAAKzI,EAAK0I,EAAKq3B,EAAK9/B,EAAK+/B,EACnC,MAED,IAAK,MACJ,KAAK,GAAKD,EAAK//B,EAAK0I,EAAKD,EAAKxI,EAAK+/B,EACnC,KAAK,GAAKv3B,EAAKxI,EAAKyI,EAAKq3B,EAAK//B,EAAKggC,EACnC,KAAK,GAAKv3B,EAAKzI,EAAKggC,EAAKD,EAAK9/B,EAAKyI,EACnC,KAAK,GAAKD,EAAKzI,EAAK0I,EAAKq3B,EAAK9/B,EAAK+/B,EACnC,MAED,IAAK,MACJ,KAAK,GAAKD,EAAK//B,EAAK0I,EAAKD,EAAKxI,EAAK+/B,EACnC,KAAK,GAAKv3B,EAAKxI,EAAKyI,EAAKq3B,EAAK//B,EAAKggC,EACnC,KAAK,GAAKv3B,EAAKzI,EAAKggC,EAAKD,EAAK9/B,EAAKyI,EACnC,KAAK,GAAKD,EAAKzI,EAAK0I,EAAKq3B,EAAK9/B,EAAK+/B,EACnC,MAED,IAAK,MACJ,KAAK,GAAKD,EAAK//B,EAAK0I,EAAKD,EAAKxI,EAAK+/B,EACnC,KAAK,GAAKv3B,EAAKxI,EAAKyI,EAAKq3B,EAAK//B,EAAKggC,EACnC,KAAK,GAAKv3B,EAAKzI,EAAKggC,EAAKD,EAAK9/B,EAAKyI,EACnC,KAAK,GAAKD,EAAKzI,EAAK0I,EAAKq3B,EAAK9/B,EAAK+/B,EACnC,MAED,QACCnkC,GAAM,6DAA+DgE,CAAM,CAE7E,CAEA,OAAKigC,IAAW,IAAO,KAAK,kBAAkB,EAEvC,IAER,CASA,iBAAkBG,EAAMhB,EAAQ,CAI/B,IAAMiB,EAAYjB,EAAQ,EAAGrgC,EAAI,KAAK,IAAKshC,CAAU,EAErD,YAAK,GAAKD,EAAK,EAAIrhC,EACnB,KAAK,GAAKqhC,EAAK,EAAIrhC,EACnB,KAAK,GAAKqhC,EAAK,EAAIrhC,EACnB,KAAK,GAAK,KAAK,IAAKshC,CAAU,EAE9B,KAAK,kBAAkB,EAEhB,IAER,CAQA,sBAAuB9iC,EAAI,CAM1B,IAAM+iC,EAAK/iC,EAAE,SAEZgjC,EAAMD,EAAI,CAAE,EAAGE,EAAMF,EAAI,CAAE,EAAGG,EAAMH,EAAI,CAAE,EAC1CI,EAAMJ,EAAI,CAAE,EAAGK,EAAML,EAAI,CAAE,EAAGM,EAAMN,EAAI,CAAE,EAC1CO,EAAMP,EAAI,CAAE,EAAGQ,EAAMR,EAAI,CAAE,EAAGS,EAAMT,EAAI,EAAG,EAE3CU,EAAQT,EAAMI,EAAMI,EAErB,GAAKC,EAAQ,EAAI,CAEhB,IAAMjiC,EAAI,GAAM,KAAK,KAAMiiC,EAAQ,CAAI,EAEvC,KAAK,GAAK,IAAOjiC,EACjB,KAAK,IAAO+hC,EAAMF,GAAQ7hC,EAC1B,KAAK,IAAO0hC,EAAMI,GAAQ9hC,EAC1B,KAAK,IAAO2hC,EAAMF,GAAQzhC,CAE3B,SAAYwhC,EAAMI,GAAOJ,EAAMQ,EAAM,CAEpC,IAAMhiC,EAAI,EAAM,KAAK,KAAM,EAAMwhC,EAAMI,EAAMI,CAAI,EAEjD,KAAK,IAAOD,EAAMF,GAAQ7hC,EAC1B,KAAK,GAAK,IAAOA,EACjB,KAAK,IAAOyhC,EAAME,GAAQ3hC,EAC1B,KAAK,IAAO0hC,EAAMI,GAAQ9hC,CAE3B,SAAY4hC,EAAMI,EAAM,CAEvB,IAAMhiC,EAAI,EAAM,KAAK,KAAM,EAAM4hC,EAAMJ,EAAMQ,CAAI,EAEjD,KAAK,IAAON,EAAMI,GAAQ9hC,EAC1B,KAAK,IAAOyhC,EAAME,GAAQ3hC,EAC1B,KAAK,GAAK,IAAOA,EACjB,KAAK,IAAO6hC,EAAME,GAAQ/hC,CAE3B,KAAO,CAEN,IAAMA,EAAI,EAAM,KAAK,KAAM,EAAMgiC,EAAMR,EAAMI,CAAI,EAEjD,KAAK,IAAOD,EAAMF,GAAQzhC,EAC1B,KAAK,IAAO0hC,EAAMI,GAAQ9hC,EAC1B,KAAK,IAAO6hC,EAAME,GAAQ/hC,EAC1B,KAAK,GAAK,IAAOA,CAElB,CAEA,YAAK,kBAAkB,EAEhB,IAER,CAUA,mBAAoBkiC,EAAOC,EAAM,CAIhC,IAAIr+B,EAAIo+B,EAAM,IAAKC,CAAI,EAAI,EAE3B,OAAKr+B,EAAI,MAIRA,EAAI,EAEC,KAAK,IAAKo+B,EAAM,CAAE,EAAI,KAAK,IAAKA,EAAM,CAAE,GAE5C,KAAK,GAAK,CAAEA,EAAM,EAClB,KAAK,GAAKA,EAAM,EAChB,KAAK,GAAK,EACV,KAAK,GAAKp+B,IAIV,KAAK,GAAK,EACV,KAAK,GAAK,CAAEo+B,EAAM,EAClB,KAAK,GAAKA,EAAM,EAChB,KAAK,GAAKp+B,KAQX,KAAK,GAAKo+B,EAAM,EAAIC,EAAI,EAAID,EAAM,EAAIC,EAAI,EAC1C,KAAK,GAAKD,EAAM,EAAIC,EAAI,EAAID,EAAM,EAAIC,EAAI,EAC1C,KAAK,GAAKD,EAAM,EAAIC,EAAI,EAAID,EAAM,EAAIC,EAAI,EAC1C,KAAK,GAAKr+B,GAIJ,KAAK,UAAU,CAEvB,CAQA,QAASjD,EAAI,CAEZ,MAAO,GAAI,KAAK,KAAM,KAAK,IAAK3C,GAAO,KAAK,IAAK2C,CAAE,EAAG,GAAI,CAAE,CAAE,CAAE,CAEjE,CAUA,cAAeA,EAAGuhC,EAAO,CAExB,IAAM/B,EAAQ,KAAK,QAASx/B,CAAE,EAE9B,GAAKw/B,IAAU,EAAI,OAAO,KAE1B,IAAMngC,EAAI,KAAK,IAAK,EAAGkiC,EAAO/B,CAAM,EAEpC,YAAK,MAAOx/B,EAAGX,CAAE,EAEV,IAER,CAQA,UAAW,CAEV,OAAO,KAAK,IAAK,EAAG,EAAG,EAAG,CAAE,CAE7B,CAQA,QAAS,CAER,OAAO,KAAK,UAAU,CAEvB,CASA,WAAY,CAEX,YAAK,IAAM,GACX,KAAK,IAAM,GACX,KAAK,IAAM,GAEX,KAAK,kBAAkB,EAEhB,IAER,CAQA,IAAKy/B,EAAI,CAER,OAAO,KAAK,GAAKA,EAAE,GAAK,KAAK,GAAKA,EAAE,GAAK,KAAK,GAAKA,EAAE,GAAK,KAAK,GAAKA,EAAE,EAEvE,CAUA,UAAW,CAEV,OAAO,KAAK,GAAK,KAAK,GAAK,KAAK,GAAK,KAAK,GAAK,KAAK,GAAK,KAAK,GAAK,KAAK,GAAK,KAAK,EAEnF,CAQA,QAAS,CAER,OAAO,KAAK,KAAM,KAAK,GAAK,KAAK,GAAK,KAAK,GAAK,KAAK,GAAK,KAAK,GAAK,KAAK,GAAK,KAAK,GAAK,KAAK,EAAG,CAEjG,CAQA,WAAY,CAEX,IAAI/tB,EAAI,KAAK,OAAO,EAEpB,OAAKA,IAAM,GAEV,KAAK,GAAK,EACV,KAAK,GAAK,EACV,KAAK,GAAK,EACV,KAAK,GAAK,IAIVA,EAAI,EAAIA,EAER,KAAK,GAAK,KAAK,GAAKA,EACpB,KAAK,GAAK,KAAK,GAAKA,EACpB,KAAK,GAAK,KAAK,GAAKA,EACpB,KAAK,GAAK,KAAK,GAAKA,GAIrB,KAAK,kBAAkB,EAEhB,IAER,CAQA,SAAU/Q,EAAI,CAEb,OAAO,KAAK,oBAAqB,KAAMA,CAAE,CAE1C,CAQA,YAAaA,EAAI,CAEhB,OAAO,KAAK,oBAAqBA,EAAG,IAAK,CAE1C,CASA,oBAAqBC,EAAGC,EAAI,CAI3B,IAAMshC,EAAMvhC,EAAE,GAAIwhC,EAAMxhC,EAAE,GAAIyhC,EAAMzhC,EAAE,GAAI0hC,EAAM1hC,EAAE,GAC5C2hC,EAAM1hC,EAAE,GAAI2hC,EAAM3hC,EAAE,GAAI4hC,EAAM5hC,EAAE,GAAI6hC,EAAM7hC,EAAE,GAElD,YAAK,GAAKshC,EAAMO,EAAMJ,EAAMC,EAAMH,EAAMK,EAAMJ,EAAMG,EACpD,KAAK,GAAKJ,EAAMM,EAAMJ,EAAME,EAAMH,EAAME,EAAMJ,EAAMM,EACpD,KAAK,GAAKJ,EAAMK,EAAMJ,EAAMG,EAAMN,EAAMK,EAAMJ,EAAMG,EACpD,KAAK,GAAKD,EAAMI,EAAMP,EAAMI,EAAMH,EAAMI,EAAMH,EAAMI,EAEpD,KAAK,kBAAkB,EAEhB,IAER,CASA,MAAOE,EAAI,EAAI,CAEd,GAAK,GAAK,EAAI,OAAO,KAErB,GAAK,GAAK,EAAI,OAAO,KAAK,KAAMA,CAAG,EAEnC,IAAInkC,EAAImkC,EAAG,GAAI7jC,EAAI6jC,EAAG,GAAI/rB,EAAI+rB,EAAG,GAAIvC,EAAIuC,EAAG,GAExC9B,EAAM,KAAK,IAAK8B,CAAG,EAElB9B,EAAM,IAEVriC,EAAI,CAAEA,EACNM,EAAI,CAAEA,EACN8X,EAAI,CAAEA,EACNwpB,EAAI,CAAEA,EAENS,EAAM,CAAEA,GAIT,IAAI/gC,EAAI,EAAI,EAEZ,GAAK+gC,EAAM,MAAS,CAInB,IAAMhB,EAAQ,KAAK,KAAMgB,CAAI,EACvB5/B,EAAM,KAAK,IAAK4+B,CAAM,EAE5B//B,EAAI,KAAK,IAAKA,EAAI+/B,CAAM,EAAI5+B,EAC5B,EAAI,KAAK,IAAK,EAAI4+B,CAAM,EAAI5+B,EAE5B,KAAK,GAAK,KAAK,GAAKnB,EAAItB,EAAI,EAC5B,KAAK,GAAK,KAAK,GAAKsB,EAAIhB,EAAI,EAC5B,KAAK,GAAK,KAAK,GAAKgB,EAAI8W,EAAI,EAC5B,KAAK,GAAK,KAAK,GAAK9W,EAAIsgC,EAAI,EAE5B,KAAK,kBAAkB,CAExB,MAIC,KAAK,GAAK,KAAK,GAAKtgC,EAAItB,EAAI,EAC5B,KAAK,GAAK,KAAK,GAAKsB,EAAIhB,EAAI,EAC5B,KAAK,GAAK,KAAK,GAAKgB,EAAI8W,EAAI,EAC5B,KAAK,GAAK,KAAK,GAAK9W,EAAIsgC,EAAI,EAE5B,KAAK,UAAU,EAIhB,OAAO,IAER,CAWA,iBAAkBwC,EAAID,EAAI3iC,EAAI,CAE7B,OAAO,KAAK,KAAM4iC,CAAG,EAAE,MAAOD,EAAI3iC,CAAE,CAErC,CAOA,QAAS,CAMR,IAAM6iC,EAAS,EAAI,KAAK,GAAK,KAAK,OAAO,EACnCC,EAAS,EAAI,KAAK,GAAK,KAAK,OAAO,EAEnCh5B,EAAK,KAAK,OAAO,EACjBi5B,EAAK,KAAK,KAAM,EAAIj5B,CAAG,EACvBk5B,EAAK,KAAK,KAAMl5B,CAAG,EAEzB,OAAO,KAAK,IACXi5B,EAAK,KAAK,IAAKF,CAAO,EACtBE,EAAK,KAAK,IAAKF,CAAO,EACtBG,EAAK,KAAK,IAAKF,CAAO,EACtBE,EAAK,KAAK,IAAKF,CAAO,CACvB,CAED,CAQA,OAAQhC,EAAa,CAEpB,OAASA,EAAW,KAAO,KAAK,IAAUA,EAAW,KAAO,KAAK,IAAUA,EAAW,KAAO,KAAK,IAAUA,EAAW,KAAO,KAAK,EAEpI,CASA,UAAWjlC,EAAOokC,EAAS,EAAI,CAE9B,YAAK,GAAKpkC,EAAOokC,CAAO,EACxB,KAAK,GAAKpkC,EAAOokC,EAAS,CAAE,EAC5B,KAAK,GAAKpkC,EAAOokC,EAAS,CAAE,EAC5B,KAAK,GAAKpkC,EAAOokC,EAAS,CAAE,EAE5B,KAAK,kBAAkB,EAEhB,IAER,CAUA,QAASpkC,EAAQ,CAAC,EAAGokC,EAAS,EAAI,CAEjC,OAAApkC,EAAOokC,CAAO,EAAI,KAAK,GACvBpkC,EAAOokC,EAAS,CAAE,EAAI,KAAK,GAC3BpkC,EAAOokC,EAAS,CAAE,EAAI,KAAK,GAC3BpkC,EAAOokC,EAAS,CAAE,EAAI,KAAK,GAEpBpkC,CAER,CASA,oBAAqBqkC,EAAWh3B,EAAQ,CAEvC,YAAK,GAAKg3B,EAAU,KAAMh3B,CAAM,EAChC,KAAK,GAAKg3B,EAAU,KAAMh3B,CAAM,EAChC,KAAK,GAAKg3B,EAAU,KAAMh3B,CAAM,EAChC,KAAK,GAAKg3B,EAAU,KAAMh3B,CAAM,EAEhC,KAAK,kBAAkB,EAEhB,IAER,CAQA,QAAS,CAER,OAAO,KAAK,QAAQ,CAErB,CAEA,UAAW+5B,EAAW,CAErB,YAAK,kBAAoBA,EAElB,IAER,CAEA,mBAAoB,CAAC,CAErB,EAAG,OAAO,QAAS,GAAI,CAEtB,MAAM,KAAK,GACX,MAAM,KAAK,GACX,MAAM,KAAK,GACX,MAAM,KAAK,EAEZ,CAED,EA2BMz8B,EAAN,MAAM08B,CAAQ,CASb,YAAa1kC,EAAI,EAAGM,EAAI,EAAG8X,EAAI,EAAI,CASlCssB,EAAQ,UAAU,UAAY,GAO9B,KAAK,EAAI1kC,EAOT,KAAK,EAAIM,EAOT,KAAK,EAAI8X,CAEV,CAUA,IAAKpY,EAAGM,EAAG8X,EAAI,CAEd,OAAKA,IAAM,SAAYA,EAAI,KAAK,GAEhC,KAAK,EAAIpY,EACT,KAAK,EAAIM,EACT,KAAK,EAAI8X,EAEF,IAER,CAQA,UAAW4oB,EAAS,CAEnB,YAAK,EAAIA,EACT,KAAK,EAAIA,EACT,KAAK,EAAIA,EAEF,IAER,CAQA,KAAMhhC,EAAI,CAET,YAAK,EAAIA,EAEF,IAER,CAQA,KAAMM,EAAI,CAET,YAAK,EAAIA,EAEF,IAER,CAQA,KAAM8X,EAAI,CAET,YAAK,EAAIA,EAEF,IAER,CASA,aAAc1N,EAAOjL,EAAQ,CAE5B,OAASiL,EAAQ,CAEhB,IAAK,GAAG,KAAK,EAAIjL,EAAO,MACxB,IAAK,GAAG,KAAK,EAAIA,EAAO,MACxB,IAAK,GAAG,KAAK,EAAIA,EAAO,MACxB,QAAS,MAAM,IAAI,MAAO,0BAA4BiL,CAAM,CAE7D,CAEA,OAAO,IAER,CAQA,aAAcA,EAAQ,CAErB,OAASA,EAAQ,CAEhB,IAAK,GAAG,OAAO,KAAK,EACpB,IAAK,GAAG,OAAO,KAAK,EACpB,IAAK,GAAG,OAAO,KAAK,EACpB,QAAS,MAAM,IAAI,MAAO,0BAA4BA,CAAM,CAE7D,CAED,CAOA,OAAQ,CAEP,OAAO,IAAI,KAAK,YAAa,KAAK,EAAG,KAAK,EAAG,KAAK,CAAE,CAErD,CAQA,KAAMu2B,EAAI,CAET,YAAK,EAAIA,EAAE,EACX,KAAK,EAAIA,EAAE,EACX,KAAK,EAAIA,EAAE,EAEJ,IAER,CAQA,IAAKA,EAAI,CAER,YAAK,GAAKA,EAAE,EACZ,KAAK,GAAKA,EAAE,EACZ,KAAK,GAAKA,EAAE,EAEL,IAER,CAQA,UAAW3/B,EAAI,CAEd,YAAK,GAAKA,EACV,KAAK,GAAKA,EACV,KAAK,GAAKA,EAEH,IAER,CASA,WAAYc,EAAGC,EAAI,CAElB,YAAK,EAAID,EAAE,EAAIC,EAAE,EACjB,KAAK,EAAID,EAAE,EAAIC,EAAE,EACjB,KAAK,EAAID,EAAE,EAAIC,EAAE,EAEV,IAER,CASA,gBAAiB4+B,EAAG3/B,EAAI,CAEvB,YAAK,GAAK2/B,EAAE,EAAI3/B,EAChB,KAAK,GAAK2/B,EAAE,EAAI3/B,EAChB,KAAK,GAAK2/B,EAAE,EAAI3/B,EAET,IAER,CAQA,IAAK2/B,EAAI,CAER,YAAK,GAAKA,EAAE,EACZ,KAAK,GAAKA,EAAE,EACZ,KAAK,GAAKA,EAAE,EAEL,IAER,CAQA,UAAW3/B,EAAI,CAEd,YAAK,GAAKA,EACV,KAAK,GAAKA,EACV,KAAK,GAAKA,EAEH,IAER,CASA,WAAYc,EAAGC,EAAI,CAElB,YAAK,EAAID,EAAE,EAAIC,EAAE,EACjB,KAAK,EAAID,EAAE,EAAIC,EAAE,EACjB,KAAK,EAAID,EAAE,EAAIC,EAAE,EAEV,IAER,CAQA,SAAU4+B,EAAI,CAEb,YAAK,GAAKA,EAAE,EACZ,KAAK,GAAKA,EAAE,EACZ,KAAK,GAAKA,EAAE,EAEL,IAER,CAQA,eAAgBD,EAAS,CAExB,YAAK,GAAKA,EACV,KAAK,GAAKA,EACV,KAAK,GAAKA,EAEH,IAER,CASA,gBAAiB5+B,EAAGC,EAAI,CAEvB,YAAK,EAAID,EAAE,EAAIC,EAAE,EACjB,KAAK,EAAID,EAAE,EAAIC,EAAE,EACjB,KAAK,EAAID,EAAE,EAAIC,EAAE,EAEV,IAER,CAQA,WAAYkgC,EAAQ,CAEnB,OAAO,KAAK,gBAAiBzc,GAAc,aAAcyc,CAAM,CAAE,CAElE,CASA,eAAgBI,EAAMhB,EAAQ,CAE7B,OAAO,KAAK,gBAAiB7b,GAAc,iBAAkB6c,EAAMhB,CAAM,CAAE,CAE5E,CAQA,aAAc7hC,EAAI,CAEjB,IAAME,EAAI,KAAK,EAAGM,EAAI,KAAK,EAAG8X,EAAI,KAAK,EACjCrS,EAAIjG,EAAE,SAEZ,YAAK,EAAIiG,EAAG,CAAE,EAAI/F,EAAI+F,EAAG,CAAE,EAAIzF,EAAIyF,EAAG,CAAE,EAAIqS,EAC5C,KAAK,EAAIrS,EAAG,CAAE,EAAI/F,EAAI+F,EAAG,CAAE,EAAIzF,EAAIyF,EAAG,CAAE,EAAIqS,EAC5C,KAAK,EAAIrS,EAAG,CAAE,EAAI/F,EAAI+F,EAAG,CAAE,EAAIzF,EAAIyF,EAAG,CAAE,EAAIqS,EAErC,IAER,CASA,kBAAmBtY,EAAI,CAEtB,OAAO,KAAK,aAAcA,CAAE,EAAE,UAAU,CAEzC,CASA,aAAcA,EAAI,CAEjB,IAAME,EAAI,KAAK,EAAGM,EAAI,KAAK,EAAG8X,EAAI,KAAK,EACjCrS,EAAIjG,EAAE,SAEN8hC,EAAI,GAAM77B,EAAG,CAAE,EAAI/F,EAAI+F,EAAG,CAAE,EAAIzF,EAAIyF,EAAG,EAAG,EAAIqS,EAAIrS,EAAG,EAAG,GAE9D,YAAK,GAAMA,EAAG,CAAE,EAAI/F,EAAI+F,EAAG,CAAE,EAAIzF,EAAIyF,EAAG,CAAE,EAAIqS,EAAIrS,EAAG,EAAG,GAAM67B,EAC9D,KAAK,GAAM77B,EAAG,CAAE,EAAI/F,EAAI+F,EAAG,CAAE,EAAIzF,EAAIyF,EAAG,CAAE,EAAIqS,EAAIrS,EAAG,EAAG,GAAM67B,EAC9D,KAAK,GAAM77B,EAAG,CAAE,EAAI/F,EAAI+F,EAAG,CAAE,EAAIzF,EAAIyF,EAAG,EAAG,EAAIqS,EAAIrS,EAAG,EAAG,GAAM67B,EAExD,IAER,CAQA,gBAAiBz/B,EAAI,CAIpB,IAAMwiC,EAAK,KAAK,EAAGC,EAAK,KAAK,EAAGC,EAAK,KAAK,EACpC7zB,EAAK7O,EAAE,EAAG2iC,EAAK3iC,EAAE,EAAG4iC,EAAK5iC,EAAE,EAAG6iC,EAAK7iC,EAAE,EAGrC8iC,EAAK,GAAMH,EAAKD,EAAKE,EAAKH,GAC1BM,EAAK,GAAMH,EAAKJ,EAAK3zB,EAAK6zB,GAC1BM,EAAK,GAAMn0B,EAAK4zB,EAAKE,EAAKH,GAGhC,YAAK,EAAIA,EAAKK,EAAKC,EAAKH,EAAKK,EAAKJ,EAAKG,EACvC,KAAK,EAAIN,EAAKI,EAAKE,EAAKH,EAAKE,EAAKj0B,EAAKm0B,EACvC,KAAK,EAAIN,EAAKG,EAAKG,EAAKn0B,EAAKk0B,EAAKJ,EAAKG,EAEhC,IAER,CASA,QAAS9sB,EAAS,CAEjB,OAAO,KAAK,aAAcA,EAAO,kBAAmB,EAAE,aAAcA,EAAO,gBAAiB,CAE7F,CASA,UAAWA,EAAS,CAEnB,OAAO,KAAK,aAAcA,EAAO,uBAAwB,EAAE,aAAcA,EAAO,WAAY,CAE7F,CASA,mBAAoBrY,EAAI,CAKvB,IAAME,EAAI,KAAK,EAAGM,EAAI,KAAK,EAAG8X,EAAI,KAAK,EACjCrS,EAAIjG,EAAE,SAEZ,YAAK,EAAIiG,EAAG,CAAE,EAAI/F,EAAI+F,EAAG,CAAE,EAAIzF,EAAIyF,EAAG,CAAE,EAAIqS,EAC5C,KAAK,EAAIrS,EAAG,CAAE,EAAI/F,EAAI+F,EAAG,CAAE,EAAIzF,EAAIyF,EAAG,CAAE,EAAIqS,EAC5C,KAAK,EAAIrS,EAAG,CAAE,EAAI/F,EAAI+F,EAAG,CAAE,EAAIzF,EAAIyF,EAAG,EAAG,EAAIqS,EAEtC,KAAK,UAAU,CAEvB,CAQA,OAAQ6oB,EAAI,CAEX,YAAK,GAAKA,EAAE,EACZ,KAAK,GAAKA,EAAE,EACZ,KAAK,GAAKA,EAAE,EAEL,IAER,CAQA,aAAcD,EAAS,CAEtB,OAAO,KAAK,eAAgB,EAAIA,CAAO,CAExC,CASA,IAAKC,EAAI,CAER,YAAK,EAAI,KAAK,IAAK,KAAK,EAAGA,EAAE,CAAE,EAC/B,KAAK,EAAI,KAAK,IAAK,KAAK,EAAGA,EAAE,CAAE,EAC/B,KAAK,EAAI,KAAK,IAAK,KAAK,EAAGA,EAAE,CAAE,EAExB,IAER,CASA,IAAKA,EAAI,CAER,YAAK,EAAI,KAAK,IAAK,KAAK,EAAGA,EAAE,CAAE,EAC/B,KAAK,EAAI,KAAK,IAAK,KAAK,EAAGA,EAAE,CAAE,EAC/B,KAAK,EAAI,KAAK,IAAK,KAAK,EAAGA,EAAE,CAAE,EAExB,IAER,CAYA,MAAOvhC,EAAKC,EAAM,CAIjB,YAAK,EAAIH,GAAO,KAAK,EAAGE,EAAI,EAAGC,EAAI,CAAE,EACrC,KAAK,EAAIH,GAAO,KAAK,EAAGE,EAAI,EAAGC,EAAI,CAAE,EACrC,KAAK,EAAIH,GAAO,KAAK,EAAGE,EAAI,EAAGC,EAAI,CAAE,EAE9B,IAER,CAYA,YAAauhC,EAAQC,EAAS,CAE7B,YAAK,EAAI3hC,GAAO,KAAK,EAAG0hC,EAAQC,CAAO,EACvC,KAAK,EAAI3hC,GAAO,KAAK,EAAG0hC,EAAQC,CAAO,EACvC,KAAK,EAAI3hC,GAAO,KAAK,EAAG0hC,EAAQC,CAAO,EAEhC,IAER,CAYA,YAAazhC,EAAKC,EAAM,CAEvB,IAAMiB,EAAS,KAAK,OAAO,EAE3B,OAAO,KAAK,aAAcA,GAAU,CAAE,EAAE,eAAgBpB,GAAOoB,EAAQlB,EAAKC,CAAI,CAAE,CAEnF,CAOA,OAAQ,CAEP,YAAK,EAAI,KAAK,MAAO,KAAK,CAAE,EAC5B,KAAK,EAAI,KAAK,MAAO,KAAK,CAAE,EAC5B,KAAK,EAAI,KAAK,MAAO,KAAK,CAAE,EAErB,IAER,CAOA,MAAO,CAEN,YAAK,EAAI,KAAK,KAAM,KAAK,CAAE,EAC3B,KAAK,EAAI,KAAK,KAAM,KAAK,CAAE,EAC3B,KAAK,EAAI,KAAK,KAAM,KAAK,CAAE,EAEpB,IAER,CAOA,OAAQ,CAEP,YAAK,EAAI,KAAK,MAAO,KAAK,CAAE,EAC5B,KAAK,EAAI,KAAK,MAAO,KAAK,CAAE,EAC5B,KAAK,EAAI,KAAK,MAAO,KAAK,CAAE,EAErB,IAER,CAQA,aAAc,CAEb,YAAK,EAAI,KAAK,MAAO,KAAK,CAAE,EAC5B,KAAK,EAAI,KAAK,MAAO,KAAK,CAAE,EAC5B,KAAK,EAAI,KAAK,MAAO,KAAK,CAAE,EAErB,IAER,CAOA,QAAS,CAER,YAAK,EAAI,CAAE,KAAK,EAChB,KAAK,EAAI,CAAE,KAAK,EAChB,KAAK,EAAI,CAAE,KAAK,EAET,IAER,CAQA,IAAKshC,EAAI,CAER,OAAO,KAAK,EAAIA,EAAE,EAAI,KAAK,EAAIA,EAAE,EAAI,KAAK,EAAIA,EAAE,CAEjD,CASA,UAAW,CAEV,OAAO,KAAK,EAAI,KAAK,EAAI,KAAK,EAAI,KAAK,EAAI,KAAK,EAAI,KAAK,CAE1D,CAOA,QAAS,CAER,OAAO,KAAK,KAAM,KAAK,EAAI,KAAK,EAAI,KAAK,EAAI,KAAK,EAAI,KAAK,EAAI,KAAK,CAAE,CAEvE,CAOA,iBAAkB,CAEjB,OAAO,KAAK,IAAK,KAAK,CAAE,EAAI,KAAK,IAAK,KAAK,CAAE,EAAI,KAAK,IAAK,KAAK,CAAE,CAEnE,CAQA,WAAY,CAEX,OAAO,KAAK,aAAc,KAAK,OAAO,GAAK,CAAE,CAE9C,CASA,UAAWrgC,EAAS,CAEnB,OAAO,KAAK,UAAU,EAAE,eAAgBA,CAAO,CAEhD,CAWA,KAAMqgC,EAAGO,EAAQ,CAEhB,YAAK,IAAOP,EAAE,EAAI,KAAK,GAAMO,EAC7B,KAAK,IAAOP,EAAE,EAAI,KAAK,GAAMO,EAC7B,KAAK,IAAOP,EAAE,EAAI,KAAK,GAAMO,EAEtB,IAER,CAYA,YAAaz8B,EAAIC,EAAIw8B,EAAQ,CAE5B,YAAK,EAAIz8B,EAAG,GAAMC,EAAG,EAAID,EAAG,GAAMy8B,EAClC,KAAK,EAAIz8B,EAAG,GAAMC,EAAG,EAAID,EAAG,GAAMy8B,EAClC,KAAK,EAAIz8B,EAAG,GAAMC,EAAG,EAAID,EAAG,GAAMy8B,EAE3B,IAER,CAQA,MAAOP,EAAI,CAEV,OAAO,KAAK,aAAc,KAAMA,CAAE,CAEnC,CAUA,aAAc7+B,EAAGC,EAAI,CAEpB,IAAM8M,EAAK/M,EAAE,EAAGkN,EAAKlN,EAAE,EAAGgjC,EAAKhjC,EAAE,EAC3BgN,EAAK/M,EAAE,EAAGkN,EAAKlN,EAAE,EAAGgjC,EAAKhjC,EAAE,EAEjC,YAAK,EAAIiN,EAAK+1B,EAAKD,EAAK71B,EACxB,KAAK,EAAI61B,EAAKh2B,EAAKD,EAAKk2B,EACxB,KAAK,EAAIl2B,EAAKI,EAAKD,EAAKF,EAEjB,IAER,CAQA,gBAAiB6xB,EAAI,CAEpB,IAAMG,EAAcH,EAAE,SAAS,EAE/B,GAAKG,IAAgB,EAAI,OAAO,KAAK,IAAK,EAAG,EAAG,CAAE,EAElD,IAAMJ,EAASC,EAAE,IAAK,IAAK,EAAIG,EAE/B,OAAO,KAAK,KAAMH,CAAE,EAAE,eAAgBD,CAAO,CAE9C,CASA,eAAgBsE,EAAc,CAE7B,OAAAzf,GAAU,KAAM,IAAK,EAAE,gBAAiByf,CAAY,EAE7C,KAAK,IAAKzf,EAAU,CAE5B,CAQA,QAASpe,EAAS,CAEjB,OAAO,KAAK,IAAKoe,GAAU,KAAMpe,CAAO,EAAE,eAAgB,EAAI,KAAK,IAAKA,CAAO,CAAE,CAAE,CAEpF,CAOA,QAASw5B,EAAI,CAEZ,IAAMG,EAAc,KAAK,KAAM,KAAK,SAAS,EAAIH,EAAE,SAAS,CAAE,EAE9D,GAAKG,IAAgB,EAAI,OAAO,KAAK,GAAK,EAE1C,IAAMC,EAAQ,KAAK,IAAKJ,CAAE,EAAIG,EAI9B,OAAO,KAAK,KAAM5hC,GAAO6hC,EAAO,GAAI,CAAE,CAAE,CAEzC,CAQA,WAAYJ,EAAI,CAEf,OAAO,KAAK,KAAM,KAAK,kBAAmBA,CAAE,CAAE,CAE/C,CAUA,kBAAmBA,EAAI,CAEtB,IAAMK,EAAK,KAAK,EAAIL,EAAE,EAAGM,EAAK,KAAK,EAAIN,EAAE,EAAGsE,EAAK,KAAK,EAAItE,EAAE,EAE5D,OAAOK,EAAKA,EAAKC,EAAKA,EAAKgE,EAAKA,CAEjC,CAQA,oBAAqBtE,EAAI,CAExB,OAAO,KAAK,IAAK,KAAK,EAAIA,EAAE,CAAE,EAAI,KAAK,IAAK,KAAK,EAAIA,EAAE,CAAE,EAAI,KAAK,IAAK,KAAK,EAAIA,EAAE,CAAE,CAErF,CAQA,iBAAkB3/B,EAAI,CAErB,OAAO,KAAK,uBAAwBA,EAAE,OAAQA,EAAE,IAAKA,EAAE,KAAM,CAE9D,CAUA,uBAAwBkkC,EAAQC,EAAKpE,EAAQ,CAE5C,IAAMqE,EAAe,KAAK,IAAKD,CAAI,EAAID,EAEvC,YAAK,EAAIE,EAAe,KAAK,IAAKrE,CAAM,EACxC,KAAK,EAAI,KAAK,IAAKoE,CAAI,EAAID,EAC3B,KAAK,EAAIE,EAAe,KAAK,IAAKrE,CAAM,EAEjC,IAER,CAQA,mBAAoB/+B,EAAI,CAEvB,OAAO,KAAK,yBAA0BA,EAAE,OAAQA,EAAE,MAAOA,EAAE,CAAE,CAE9D,CAUA,yBAA0BkjC,EAAQnE,EAAO/gC,EAAI,CAE5C,YAAK,EAAIklC,EAAS,KAAK,IAAKnE,CAAM,EAClC,KAAK,EAAI/gC,EACT,KAAK,EAAIklC,EAAS,KAAK,IAAKnE,CAAM,EAE3B,IAER,CASA,sBAAuBvhC,EAAI,CAE1B,IAAMiG,EAAIjG,EAAE,SAEZ,YAAK,EAAIiG,EAAG,EAAG,EACf,KAAK,EAAIA,EAAG,EAAG,EACf,KAAK,EAAIA,EAAG,EAAG,EAER,IAER,CASA,mBAAoBjG,EAAI,CAEvB,IAAM6lC,EAAK,KAAK,oBAAqB7lC,EAAG,CAAE,EAAE,OAAO,EAC7C8lC,EAAK,KAAK,oBAAqB9lC,EAAG,CAAE,EAAE,OAAO,EAC7C+lC,EAAK,KAAK,oBAAqB/lC,EAAG,CAAE,EAAE,OAAO,EAEnD,YAAK,EAAI6lC,EACT,KAAK,EAAIC,EACT,KAAK,EAAIC,EAEF,IAER,CASA,oBAAqB/lC,EAAG4K,EAAQ,CAE/B,OAAO,KAAK,UAAW5K,EAAE,SAAU4K,EAAQ,CAAE,CAE9C,CASA,qBAAsB5K,EAAG4K,EAAQ,CAEhC,OAAO,KAAK,UAAW5K,EAAE,SAAU4K,EAAQ,CAAE,CAE9C,CAQA,aAAc,EAAI,CAEjB,YAAK,EAAI,EAAE,GACX,KAAK,EAAI,EAAE,GACX,KAAK,EAAI,EAAE,GAEJ,IAER,CASA,aAAcpI,EAAI,CAEjB,YAAK,EAAIA,EAAE,EACX,KAAK,EAAIA,EAAE,EACX,KAAK,EAAIA,EAAE,EAEJ,IAER,CAQA,OAAQ2+B,EAAI,CAEX,OAAWA,EAAE,IAAM,KAAK,GAASA,EAAE,IAAM,KAAK,GAASA,EAAE,IAAM,KAAK,CAErE,CAUA,UAAW5jC,EAAOokC,EAAS,EAAI,CAE9B,YAAK,EAAIpkC,EAAOokC,CAAO,EACvB,KAAK,EAAIpkC,EAAOokC,EAAS,CAAE,EAC3B,KAAK,EAAIpkC,EAAOokC,EAAS,CAAE,EAEpB,IAER,CAUA,QAASpkC,EAAQ,CAAC,EAAGokC,EAAS,EAAI,CAEjC,OAAApkC,EAAOokC,CAAO,EAAI,KAAK,EACvBpkC,EAAOokC,EAAS,CAAE,EAAI,KAAK,EAC3BpkC,EAAOokC,EAAS,CAAE,EAAI,KAAK,EAEpBpkC,CAER,CASA,oBAAqBqkC,EAAWh3B,EAAQ,CAEvC,YAAK,EAAIg3B,EAAU,KAAMh3B,CAAM,EAC/B,KAAK,EAAIg3B,EAAU,KAAMh3B,CAAM,EAC/B,KAAK,EAAIg3B,EAAU,KAAMh3B,CAAM,EAExB,IAER,CAQA,QAAS,CAER,YAAK,EAAI,KAAK,OAAO,EACrB,KAAK,EAAI,KAAK,OAAO,EACrB,KAAK,EAAI,KAAK,OAAO,EAEd,IAER,CAOA,iBAAkB,CAIjB,IAAM22B,EAAQ,KAAK,OAAO,EAAI,KAAK,GAAK,EAClC94B,EAAI,KAAK,OAAO,EAAI,EAAI,EACxBjG,EAAI,KAAK,KAAM,EAAIiG,EAAIA,CAAE,EAE/B,YAAK,EAAIjG,EAAI,KAAK,IAAK++B,CAAM,EAC7B,KAAK,EAAI94B,EACT,KAAK,EAAIjG,EAAI,KAAK,IAAK++B,CAAM,EAEtB,IAER,CAEA,EAAG,OAAO,QAAS,GAAI,CAEtB,MAAM,KAAK,EACX,MAAM,KAAK,EACX,MAAM,KAAK,CAEZ,CAED,EAEMxb,GAA0B,IAAI7d,EAC9B8d,GAA8B,IAAIrP,GA8BlCsP,GAAN,MAAM+f,CAAQ,CAiBb,YAAaC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAM,CAS1DT,EAAQ,UAAU,UAAY,GAO9B,KAAK,SAAW,CAEf,EAAG,EAAG,EACN,EAAG,EAAG,EACN,EAAG,EAAG,CAEP,EAEKC,IAAQ,QAEZ,KAAK,IAAKA,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,CAAI,CAIxD,CAiBA,IAAKR,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAKC,EAAM,CAElD,IAAM1D,EAAK,KAAK,SAEhB,OAAAA,EAAI,CAAE,EAAIkD,EAAKlD,EAAI,CAAE,EAAIqD,EAAKrD,EAAI,CAAE,EAAIwD,EACxCxD,EAAI,CAAE,EAAImD,EAAKnD,EAAI,CAAE,EAAIsD,EAAKtD,EAAI,CAAE,EAAIyD,EACxCzD,EAAI,CAAE,EAAIoD,EAAKpD,EAAI,CAAE,EAAIuD,EAAKvD,EAAI,CAAE,EAAI0D,EAEjC,IAER,CAOA,UAAW,CAEV,YAAK,IAEJ,EAAG,EAAG,EACN,EAAG,EAAG,EACN,EAAG,EAAG,CAEP,EAEO,IAER,CAQA,KAAMzmC,EAAI,CAET,IAAM+iC,EAAK,KAAK,SACV2D,EAAK1mC,EAAE,SAEb,OAAA+iC,EAAI,CAAE,EAAI2D,EAAI,CAAE,EAAG3D,EAAI,CAAE,EAAI2D,EAAI,CAAE,EAAG3D,EAAI,CAAE,EAAI2D,EAAI,CAAE,EACtD3D,EAAI,CAAE,EAAI2D,EAAI,CAAE,EAAG3D,EAAI,CAAE,EAAI2D,EAAI,CAAE,EAAG3D,EAAI,CAAE,EAAI2D,EAAI,CAAE,EACtD3D,EAAI,CAAE,EAAI2D,EAAI,CAAE,EAAG3D,EAAI,CAAE,EAAI2D,EAAI,CAAE,EAAG3D,EAAI,CAAE,EAAI2D,EAAI,CAAE,EAE/C,IAER,CAUA,aAAcC,EAAOC,EAAOC,EAAQ,CAEnC,OAAAF,EAAM,qBAAsB,KAAM,CAAE,EACpCC,EAAM,qBAAsB,KAAM,CAAE,EACpCC,EAAM,qBAAsB,KAAM,CAAE,EAE7B,IAER,CAQA,eAAgB7mC,EAAI,CAEnB,IAAM0mC,EAAK1mC,EAAE,SAEb,YAAK,IAEJ0mC,EAAI,CAAE,EAAGA,EAAI,CAAE,EAAGA,EAAI,CAAE,EACxBA,EAAI,CAAE,EAAGA,EAAI,CAAE,EAAGA,EAAI,CAAE,EACxBA,EAAI,CAAE,EAAGA,EAAI,CAAE,EAAGA,EAAI,EAAG,CAE1B,EAEO,IAER,CAQA,SAAU1mC,EAAI,CAEb,OAAO,KAAK,iBAAkB,KAAMA,CAAE,CAEvC,CAQA,YAAaA,EAAI,CAEhB,OAAO,KAAK,iBAAkBA,EAAG,IAAK,CAEvC,CAUA,iBAAkBsC,EAAGC,EAAI,CAExB,IAAMukC,EAAKxkC,EAAE,SACPykC,EAAKxkC,EAAE,SACPwgC,EAAK,KAAK,SAEViE,EAAMF,EAAI,CAAE,EAAGG,EAAMH,EAAI,CAAE,EAAGI,EAAMJ,EAAI,CAAE,EAC1CK,EAAML,EAAI,CAAE,EAAGM,EAAMN,EAAI,CAAE,EAAGO,EAAMP,EAAI,CAAE,EAC1CQ,EAAMR,EAAI,CAAE,EAAGS,EAAMT,EAAI,CAAE,EAAGU,EAAMV,EAAI,CAAE,EAE1CW,EAAMV,EAAI,CAAE,EAAGW,EAAMX,EAAI,CAAE,EAAGY,EAAMZ,EAAI,CAAE,EAC1Ca,EAAMb,EAAI,CAAE,EAAGc,EAAMd,EAAI,CAAE,EAAGe,EAAMf,EAAI,CAAE,EAC1CgB,EAAMhB,EAAI,CAAE,EAAGiB,EAAMjB,EAAI,CAAE,EAAGkB,EAAMlB,EAAI,CAAE,EAEhD,OAAAhE,EAAI,CAAE,EAAIiE,EAAMS,EAAMR,EAAMW,EAAMV,EAAMa,EACxChF,EAAI,CAAE,EAAIiE,EAAMU,EAAMT,EAAMY,EAAMX,EAAMc,EACxCjF,EAAI,CAAE,EAAIiE,EAAMW,EAAMV,EAAMa,EAAMZ,EAAMe,EAExClF,EAAI,CAAE,EAAIoE,EAAMM,EAAML,EAAMQ,EAAMP,EAAMU,EACxChF,EAAI,CAAE,EAAIoE,EAAMO,EAAMN,EAAMS,EAAMR,EAAMW,EACxCjF,EAAI,CAAE,EAAIoE,EAAMQ,EAAMP,EAAMU,EAAMT,EAAMY,EAExClF,EAAI,CAAE,EAAIuE,EAAMG,EAAMF,EAAMK,EAAMJ,EAAMO,EACxChF,EAAI,CAAE,EAAIuE,EAAMI,EAAMH,EAAMM,EAAML,EAAMQ,EACxCjF,EAAI,CAAE,EAAIuE,EAAMK,EAAMJ,EAAMO,EAAMN,EAAMS,EAEjC,IAER,CAQA,eAAgBzmC,EAAI,CAEnB,IAAMuhC,EAAK,KAAK,SAEhB,OAAAA,EAAI,CAAE,GAAKvhC,EAAGuhC,EAAI,CAAE,GAAKvhC,EAAGuhC,EAAI,CAAE,GAAKvhC,EACvCuhC,EAAI,CAAE,GAAKvhC,EAAGuhC,EAAI,CAAE,GAAKvhC,EAAGuhC,EAAI,CAAE,GAAKvhC,EACvCuhC,EAAI,CAAE,GAAKvhC,EAAGuhC,EAAI,CAAE,GAAKvhC,EAAGuhC,EAAI,CAAE,GAAKvhC,EAEhC,IAER,CAOA,aAAc,CAEb,IAAMuhC,EAAK,KAAK,SAEVzgC,EAAIygC,EAAI,CAAE,EAAGxgC,EAAIwgC,EAAI,CAAE,EAAGvgC,EAAIugC,EAAI,CAAE,EACzCmF,EAAInF,EAAI,CAAE,EAAG98B,EAAI88B,EAAI,CAAE,EAAGv8B,EAAIu8B,EAAI,CAAE,EACpCoF,EAAIpF,EAAI,CAAE,EAAGqF,EAAIrF,EAAI,CAAE,EAAGvlC,EAAIulC,EAAI,CAAE,EAErC,OAAOzgC,EAAI2D,EAAIzI,EAAI8E,EAAIkE,EAAI4hC,EAAI7lC,EAAI2lC,EAAI1qC,EAAI+E,EAAIiE,EAAI2hC,EAAI3lC,EAAI0lC,EAAIE,EAAI5lC,EAAIyD,EAAIkiC,CAE5E,CASA,QAAS,CAER,IAAMpF,EAAK,KAAK,SAEfkD,EAAMlD,EAAI,CAAE,EAAGqD,EAAMrD,EAAI,CAAE,EAAGwD,EAAMxD,EAAI,CAAE,EAC1CmD,EAAMnD,EAAI,CAAE,EAAGsD,EAAMtD,EAAI,CAAE,EAAGyD,EAAMzD,EAAI,CAAE,EAC1CoD,EAAMpD,EAAI,CAAE,EAAGuD,EAAMvD,EAAI,CAAE,EAAG0D,EAAM1D,EAAI,CAAE,EAE1CsF,EAAM5B,EAAMJ,EAAMG,EAAMF,EACxBgC,EAAM9B,EAAML,EAAMM,EAAMP,EACxBqC,EAAMjC,EAAMJ,EAAMG,EAAMF,EAExBqC,EAAMvC,EAAMoC,EAAMjC,EAAMkC,EAAM/B,EAAMgC,EAErC,GAAKC,IAAQ,EAAI,OAAO,KAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAE5D,IAAMC,EAAS,EAAID,EAEnB,OAAAzF,EAAI,CAAE,EAAIsF,EAAMI,EAChB1F,EAAI,CAAE,GAAMwD,EAAMD,EAAMG,EAAML,GAAQqC,EACtC1F,EAAI,CAAE,GAAMyD,EAAMJ,EAAMG,EAAMF,GAAQoC,EAEtC1F,EAAI,CAAE,EAAIuF,EAAMG,EAChB1F,EAAI,CAAE,GAAM0D,EAAMR,EAAMM,EAAMJ,GAAQsC,EACtC1F,EAAI,CAAE,GAAMwD,EAAML,EAAMM,EAAMP,GAAQwC,EAEtC1F,EAAI,CAAE,EAAIwF,EAAME,EAChB1F,EAAI,CAAE,GAAMqD,EAAMD,EAAMG,EAAML,GAAQwC,EACtC1F,EAAI,CAAE,GAAMsD,EAAMJ,EAAMG,EAAMF,GAAQuC,EAE/B,IAER,CAOA,WAAY,CAEX,IAAI3/B,EACE9I,EAAI,KAAK,SAEf,OAAA8I,EAAM9I,EAAG,CAAE,EAAGA,EAAG,CAAE,EAAIA,EAAG,CAAE,EAAGA,EAAG,CAAE,EAAI8I,EACxCA,EAAM9I,EAAG,CAAE,EAAGA,EAAG,CAAE,EAAIA,EAAG,CAAE,EAAGA,EAAG,CAAE,EAAI8I,EACxCA,EAAM9I,EAAG,CAAE,EAAGA,EAAG,CAAE,EAAIA,EAAG,CAAE,EAAGA,EAAG,CAAE,EAAI8I,EAEjC,IAER,CASA,gBAAiB4/B,EAAU,CAE1B,OAAO,KAAK,eAAgBA,CAAQ,EAAE,OAAO,EAAE,UAAU,CAE1D,CAQA,mBAAoBpjC,EAAI,CAEvB,IAAMtF,EAAI,KAAK,SAEf,OAAAsF,EAAG,CAAE,EAAItF,EAAG,CAAE,EACdsF,EAAG,CAAE,EAAItF,EAAG,CAAE,EACdsF,EAAG,CAAE,EAAItF,EAAG,CAAE,EACdsF,EAAG,CAAE,EAAItF,EAAG,CAAE,EACdsF,EAAG,CAAE,EAAItF,EAAG,CAAE,EACdsF,EAAG,CAAE,EAAItF,EAAG,CAAE,EACdsF,EAAG,CAAE,EAAItF,EAAG,CAAE,EACdsF,EAAG,CAAE,EAAItF,EAAG,CAAE,EACdsF,EAAG,CAAE,EAAItF,EAAG,CAAE,EAEP,IAER,CAcA,eAAgBmlC,EAAIC,EAAIS,EAAIC,EAAI6C,EAAUp5B,EAAIG,EAAK,CAElD,IAAM,EAAI,KAAK,IAAKi5B,CAAS,EACvBnnC,EAAI,KAAK,IAAKmnC,CAAS,EAE7B,YAAK,IACJ9C,EAAK,EAAGA,EAAKrkC,EAAG,CAAEqkC,GAAO,EAAIt2B,EAAK/N,EAAIkO,GAAOH,EAAK41B,EAClD,CAAEW,EAAKtkC,EAAGskC,EAAK,EAAG,CAAEA,GAAO,CAAEtkC,EAAI+N,EAAK,EAAIG,GAAOA,EAAK01B,EACtD,EAAG,EAAG,CACP,EAEO,IAER,CASA,MAAOS,EAAIC,EAAK,CAEf,YAAK,YAAa5f,GAAI,UAAW2f,EAAIC,CAAG,CAAE,EAEnC,IAER,CAQA,OAAQvE,EAAQ,CAEf,YAAK,YAAarb,GAAI,aAAc,CAAEqb,CAAM,CAAE,EAEvC,IAER,CASA,UAAW4D,EAAIC,EAAK,CAEnB,YAAK,YAAalf,GAAI,gBAAiBif,EAAIC,CAAG,CAAE,EAEzC,IAER,CAWA,gBAAiBllC,EAAGM,EAAI,CAEvB,OAAKN,EAAE,UAEN,KAAK,IAEJ,EAAG,EAAGA,EAAE,EACR,EAAG,EAAGA,EAAE,EACR,EAAG,EAAG,CAEP,EAIA,KAAK,IAEJ,EAAG,EAAGA,EACN,EAAG,EAAGM,EACN,EAAG,EAAG,CAEP,EAIM,IAER,CAQA,aAAc+gC,EAAQ,CAIrB,IAAM/+B,EAAI,KAAK,IAAK++B,CAAM,EACpB//B,EAAI,KAAK,IAAK+/B,CAAM,EAE1B,YAAK,IAEJ/+B,EAAG,CAAEhB,EAAG,EACRA,EAAGgB,EAAG,EACN,EAAG,EAAG,CAEP,EAEO,IAER,CASA,UAAWtC,EAAGM,EAAI,CAEjB,YAAK,IAEJN,EAAG,EAAG,EACN,EAAGM,EAAG,EACN,EAAG,EAAG,CAEP,EAEO,IAER,CAQA,OAAQooC,EAAS,CAEhB,IAAM7F,EAAK,KAAK,SACV2D,EAAKkC,EAAO,SAElB,QAAUprC,EAAI,EAAGA,EAAI,EAAGA,IAEvB,GAAKulC,EAAIvlC,CAAE,IAAMkpC,EAAIlpC,CAAE,EAAI,MAAO,GAInC,MAAO,EAER,CASA,UAAWD,EAAOokC,EAAS,EAAI,CAE9B,QAAUnkC,EAAI,EAAGA,EAAI,EAAGA,IAEvB,KAAK,SAAUA,CAAE,EAAID,EAAOC,EAAImkC,CAAO,EAIxC,OAAO,IAER,CAUA,QAASpkC,EAAQ,CAAC,EAAGokC,EAAS,EAAI,CAEjC,IAAMoB,EAAK,KAAK,SAEhB,OAAAxlC,EAAOokC,CAAO,EAAIoB,EAAI,CAAE,EACxBxlC,EAAOokC,EAAS,CAAE,EAAIoB,EAAI,CAAE,EAC5BxlC,EAAOokC,EAAS,CAAE,EAAIoB,EAAI,CAAE,EAE5BxlC,EAAOokC,EAAS,CAAE,EAAIoB,EAAI,CAAE,EAC5BxlC,EAAOokC,EAAS,CAAE,EAAIoB,EAAI,CAAE,EAC5BxlC,EAAOokC,EAAS,CAAE,EAAIoB,EAAI,CAAE,EAE5BxlC,EAAOokC,EAAS,CAAE,EAAIoB,EAAI,CAAE,EAC5BxlC,EAAOokC,EAAS,CAAE,EAAIoB,EAAI,CAAE,EAC5BxlC,EAAOokC,EAAS,CAAE,EAAIoB,EAAI,CAAE,EAErBxlC,CAER,CAOA,OAAQ,CAEP,OAAO,IAAI,KAAK,YAAY,EAAE,UAAW,KAAK,QAAS,CAExD,CAED,EAEM2oB,GAAoB,IAAID,GAExBzhB,GAAqC,IAAIyhB,GAAQ,EAAE,IACxD,SAAW,SAAW,SACtB,QAAW,SAAW,SACtB,SAAW,SAAW,QACvB,EAEMxhB,GAAqC,IAAIwhB,GAAQ,EAAE,IACxD,UAAW,WAAY,UACvB,UAAY,UAAW,SACvB,SAAW,SAAW,SACvB,EA4LM1iB,GAAgCD,IAAsB,EAqBtDuB,GAAN,KAAiB,CAShB,OAAO,WAAYD,EAAOlH,EAAO,YAAc,CAQ9C,GANK,UAAU,KAAMkH,EAAM,GAAI,GAM1B,OAAO,kBAAsB,IAEjC,OAAOA,EAAM,IAId,IAAI3G,EAEJ,GAAK2G,aAAiB,kBAErB3G,EAAS2G,MAEH,CAEDuhB,KAAY,SAAYA,GAAUroB,GAAiB,QAAS,GAEjEqoB,GAAQ,MAAQvhB,EAAM,MACtBuhB,GAAQ,OAASvhB,EAAM,OAEvB,IAAMikC,EAAU1iB,GAAQ,WAAY,IAAK,EAEpCvhB,aAAiB,UAErBikC,EAAQ,aAAcjkC,EAAO,EAAG,CAAE,EAIlCikC,EAAQ,UAAWjkC,EAAO,EAAG,EAAGA,EAAM,MAAOA,EAAM,MAAO,EAI3D3G,EAASkoB,EAEV,CAEA,OAAOloB,EAAO,UAAWP,CAAK,CAE/B,CAQA,OAAO,aAAckH,EAAQ,CAE5B,GAAO,OAAO,iBAAqB,KAAeA,aAAiB,kBAChE,OAAO,kBAAsB,KAAeA,aAAiB,mBAC7D,OAAO,YAAgB,KAAeA,aAAiB,YAAgB,CAEzE,IAAM3G,EAASH,GAAiB,QAAS,EAEzCG,EAAO,MAAQ2G,EAAM,MACrB3G,EAAO,OAAS2G,EAAM,OAEtB,IAAMikC,EAAU5qC,EAAO,WAAY,IAAK,EACxC4qC,EAAQ,UAAWjkC,EAAO,EAAG,EAAGA,EAAM,MAAOA,EAAM,MAAO,EAE1D,IAAMkkC,EAAYD,EAAQ,aAAc,EAAG,EAAGjkC,EAAM,MAAOA,EAAM,MAAO,EAClEqI,EAAO67B,EAAU,KAEvB,QAAUtrC,EAAI,EAAGA,EAAIyP,EAAK,OAAQzP,IAEjCyP,EAAMzP,CAAE,EAAIqG,GAAcoJ,EAAMzP,CAAE,EAAI,GAAI,EAAI,IAI/C,OAAAqrC,EAAQ,aAAcC,EAAW,EAAG,CAAE,EAE/B7qC,CAER,SAAY2G,EAAM,KAAO,CAExB,IAAMqI,EAAOrI,EAAM,KAAK,MAAO,CAAE,EAEjC,QAAUpH,EAAI,EAAGA,EAAIyP,EAAK,OAAQzP,IAE5ByP,aAAgB,YAAcA,aAAgB,kBAElDA,EAAMzP,CAAE,EAAI,KAAK,MAAOqG,GAAcoJ,EAAMzP,CAAE,EAAI,GAAI,EAAI,GAAI,EAM9DyP,EAAMzP,CAAE,EAAIqG,GAAcoJ,EAAMzP,CAAE,CAAE,EAMtC,MAAO,CACN,KAAMyP,EACN,MAAOrI,EAAM,MACb,OAAQA,EAAM,MACf,CAED,KAEC,QAAAnG,GAAM,uFAAwF,EACvFmG,CAIT,CAED,EAEIwhB,IAAY,EAQVC,GAAN,KAAa,CAOZ,YAAapZ,EAAO,KAAO,CAS1B,KAAK,SAAW,GAShB,OAAO,eAAgB,KAAM,KAAM,CAAE,MAAOmZ,KAAa,CAAE,EAQ3D,KAAK,KAAOhnB,GAAa,EAOzB,KAAK,KAAO6N,EAWZ,KAAK,UAAY,GASjB,KAAK,QAAU,CAEhB,CAQA,QAAS/I,EAAS,CAEjB,IAAM+I,EAAO,KAAK,KAElB,OAAO,OAAO,iBAAqB,KAAmBA,aAAgB,iBAErE/I,EAAO,IAAK+I,EAAK,WAAYA,EAAK,YAAa,CAAE,EAEpC,OAAO,WAAe,KAAmBA,aAAgB,WAEtE/I,EAAO,IAAK+I,EAAK,cAAeA,EAAK,aAAc,CAAE,EAE1CA,IAAS,KAEpB/I,EAAO,IAAK+I,EAAK,MAAOA,EAAK,OAAQA,EAAK,OAAS,CAAE,EAIrD/I,EAAO,IAAK,EAAG,EAAG,CAAE,EAIdA,CAER,CAWA,IAAI,YAAavE,EAAQ,CAEnBA,IAAU,IAAO,KAAK,SAE5B,CASA,OAAQopC,EAAO,CAEd,IAAMC,EAAiBD,IAAS,QAAa,OAAOA,GAAS,SAE7D,GAAK,CAAEC,GAAgBD,EAAK,OAAQ,KAAK,IAAK,IAAM,OAEnD,OAAOA,EAAK,OAAQ,KAAK,IAAK,EAI/B,IAAME,EAAS,CACd,KAAM,KAAK,KACX,IAAK,EACN,EAEMh8B,EAAO,KAAK,KAElB,GAAKA,IAAS,KAAO,CAEpB,IAAIi8B,EAEJ,GAAK,MAAM,QAASj8B,CAAK,EAAI,CAI5Bi8B,EAAM,CAAC,EAEP,QAAU1rC,EAAI,EAAG4V,EAAInG,EAAK,OAAQzP,EAAI4V,EAAG5V,IAEnCyP,EAAMzP,CAAE,EAAE,cAEd0rC,EAAI,KAAMvkC,GAAgBsI,EAAMzP,CAAE,EAAE,KAAM,CAAE,EAI5C0rC,EAAI,KAAMvkC,GAAgBsI,EAAMzP,CAAE,CAAE,CAAE,CAMzC,MAIC0rC,EAAMvkC,GAAgBsI,CAAK,EAI5Bg8B,EAAO,IAAMC,CAEd,CAEA,OAAOF,IAEND,EAAK,OAAQ,KAAK,IAAK,EAAIE,GAIrBA,CAER,CAED,EAoCI3iB,IAAa,EAEXC,GAA0B,IAAIre,EAU9Bse,GAAN,MAAM2iB,UAAgBtjB,EAAgB,CAgBrC,YAAajhB,EAAQukC,EAAQ,cAAeC,EAAUD,EAAQ,gBAAiBE,EAAQtoB,GAAqBuoB,EAAQvoB,GAAqBwoB,EAAYjoB,GAAckoB,EAAY/nB,GAA0BvI,EAASS,GAAYjc,EAAOue,GAAkBwtB,EAAaN,EAAQ,mBAAoBplC,EAAaC,GAAe,CAE3T,MAAM,EASN,KAAK,UAAY,GASjB,OAAO,eAAgB,KAAM,KAAM,CAAE,MAAOsiB,KAAc,CAAE,EAQ5D,KAAK,KAAOlnB,GAAa,EAOzB,KAAK,KAAO,GAUZ,KAAK,OAAS,IAAIinB,GAAQzhB,CAAM,EAOhC,KAAK,QAAU,CAAC,EAShB,KAAK,QAAUwkC,EASf,KAAK,QAAU,EASf,KAAK,MAAQC,EASb,KAAK,MAAQC,EAQb,KAAK,UAAYC,EAQjB,KAAK,UAAYC,EAWjB,KAAK,WAAaC,EAQlB,KAAK,OAASvwB,EAWd,KAAK,eAAiB,KAQtB,KAAK,KAAOxb,EASZ,KAAK,OAAS,IAAI0K,GAAS,EAAG,CAAE,EAWhC,KAAK,OAAS,IAAIA,GAAS,EAAG,CAAE,EAShC,KAAK,OAAS,IAAIA,GAAS,EAAG,CAAE,EAShC,KAAK,SAAW,EAYhB,KAAK,iBAAmB,GAOxB,KAAK,OAAS,IAAI6d,GAUlB,KAAK,gBAAkB,GAYvB,KAAK,iBAAmB,GAYxB,KAAK,MAAQ,GAUb,KAAK,gBAAkB,EAQvB,KAAK,WAAaliB,EAQlB,KAAK,SAAW,CAAC,EAQjB,KAAK,aAAe,CAAC,EASrB,KAAK,QAAU,EASf,KAAK,SAAW,KAQhB,KAAK,aAAe,KASpB,KAAK,sBAAwB,GAS7B,KAAK,eAAiB,GAAAa,GAASA,EAAM,OAASA,EAAM,MAAQ,GAU5D,KAAK,aAAe,CAErB,CAKA,IAAI,OAAQ,CAEX,OAAO,KAAK,OAAO,QAAS2hB,EAAU,EAAE,CAEzC,CAKA,IAAI,QAAS,CAEZ,OAAO,KAAK,OAAO,QAASA,EAAU,EAAE,CAEzC,CAKA,IAAI,OAAQ,CAEX,OAAO,KAAK,OAAO,QAASA,EAAU,EAAE,CAEzC,CAOA,IAAI,OAAQ,CAEX,OAAO,KAAK,OAAO,IAEpB,CAEA,IAAI,MAAO5mB,EAAQ,KAAO,CAEzB,KAAK,OAAO,KAAOA,CAEpB,CAMA,cAAe,CAEd,KAAK,OAAO,eAAgB,KAAK,OAAO,EAAG,KAAK,OAAO,EAAG,KAAK,OAAO,EAAG,KAAK,OAAO,EAAG,KAAK,SAAU,KAAK,OAAO,EAAG,KAAK,OAAO,CAAE,CAErI,CAQA,eAAgBqO,EAAO07B,EAAQ,CAE9B,KAAK,aAAa,KAAM,CAAE,MAAA17B,EAAO,MAAA07B,CAAM,CAAE,CAE1C,CAKA,mBAAoB,CAEnB,KAAK,aAAa,OAAS,CAE5B,CAOA,OAAQ,CAEP,OAAO,IAAI,KAAK,YAAY,EAAE,KAAM,IAAK,CAE1C,CAQA,KAAMC,EAAS,CAEd,YAAK,KAAOA,EAAO,KAEnB,KAAK,OAASA,EAAO,OACrB,KAAK,QAAUA,EAAO,QAAQ,MAAO,CAAE,EAEvC,KAAK,QAAUA,EAAO,QACtB,KAAK,QAAUA,EAAO,QAEtB,KAAK,MAAQA,EAAO,MACpB,KAAK,MAAQA,EAAO,MAEpB,KAAK,UAAYA,EAAO,UACxB,KAAK,UAAYA,EAAO,UAExB,KAAK,WAAaA,EAAO,WAEzB,KAAK,OAASA,EAAO,OACrB,KAAK,eAAiBA,EAAO,eAC7B,KAAK,KAAOA,EAAO,KAEnB,KAAK,OAAO,KAAMA,EAAO,MAAO,EAChC,KAAK,OAAO,KAAMA,EAAO,MAAO,EAChC,KAAK,OAAO,KAAMA,EAAO,MAAO,EAChC,KAAK,SAAWA,EAAO,SAEvB,KAAK,iBAAmBA,EAAO,iBAC/B,KAAK,OAAO,KAAMA,EAAO,MAAO,EAEhC,KAAK,gBAAkBA,EAAO,gBAC9B,KAAK,iBAAmBA,EAAO,iBAC/B,KAAK,MAAQA,EAAO,MACpB,KAAK,gBAAkBA,EAAO,gBAC9B,KAAK,WAAaA,EAAO,WAEzB,KAAK,aAAeA,EAAO,aAC3B,KAAK,sBAAwBA,EAAO,sBACpC,KAAK,eAAiBA,EAAO,eAE7B,KAAK,SAAW,KAAK,MAAO,KAAK,UAAWA,EAAO,QAAS,CAAE,EAE9D,KAAK,YAAc,GAEZ,IAER,CAMA,UAAWr1B,EAAS,CAEnB,QAAYQ,KAAOR,EAAS,CAE3B,IAAMs1B,EAAWt1B,EAAQQ,CAAI,EAE7B,GAAK80B,IAAa,OAAY,CAE7BnrC,GAAM,mCAAoCqW,CAAI,2BAA4B,EAC1E,QAED,CAEA,IAAM+0B,EAAe,KAAM/0B,CAAI,EAE/B,GAAK+0B,IAAiB,OAAY,CAEjCprC,GAAM,kCAAmCqW,CAAI,mBAAoB,EACjE,QAED,CAEO+0B,GAAgBD,GAAgBC,EAAa,WAAaD,EAAS,WAI5DC,GAAgBD,GAAgBC,EAAa,WAAaD,EAAS,WAInEC,GAAgBD,GAAgBC,EAAa,WAAaD,EAAS,UANhFC,EAAa,KAAMD,CAAS,EAY5B,KAAM90B,CAAI,EAAI80B,CAIhB,CAED,CASA,OAAQb,EAAO,CAEd,IAAMC,EAAiBD,IAAS,QAAa,OAAOA,GAAS,SAE7D,GAAK,CAAEC,GAAgBD,EAAK,SAAU,KAAK,IAAK,IAAM,OAErD,OAAOA,EAAK,SAAU,KAAK,IAAK,EAIjC,IAAME,EAAS,CAEd,SAAU,CACT,QAAS,IACT,KAAM,UACN,UAAW,gBACZ,EAEA,KAAM,KAAK,KACX,KAAM,KAAK,KAEX,MAAO,KAAK,OAAO,OAAQF,CAAK,EAAE,KAElC,QAAS,KAAK,QACd,QAAS,KAAK,QAEd,OAAQ,CAAE,KAAK,OAAO,EAAG,KAAK,OAAO,CAAE,EACvC,OAAQ,CAAE,KAAK,OAAO,EAAG,KAAK,OAAO,CAAE,EACvC,OAAQ,CAAE,KAAK,OAAO,EAAG,KAAK,OAAO,CAAE,EACvC,SAAU,KAAK,SAEf,KAAM,CAAE,KAAK,MAAO,KAAK,KAAM,EAE/B,OAAQ,KAAK,OACb,eAAgB,KAAK,eACrB,KAAM,KAAK,KACX,WAAY,KAAK,WAEjB,UAAW,KAAK,UAChB,UAAW,KAAK,UAChB,WAAY,KAAK,WAEjB,MAAO,KAAK,MAEZ,gBAAiB,KAAK,gBACtB,iBAAkB,KAAK,iBACvB,gBAAiB,KAAK,eAEvB,EAEA,OAAK,OAAO,KAAM,KAAK,QAAS,EAAE,OAAS,IAAIE,EAAO,SAAW,KAAK,UAE/DD,IAEND,EAAK,SAAU,KAAK,IAAK,EAAIE,GAIvBA,CAER,CAQA,SAAU,CAQT,KAAK,cAAe,CAAE,KAAM,SAAU,CAAE,CAEzC,CAQA,YAAaxhC,EAAK,CAEjB,GAAK,KAAK,UAAY+Y,GAAY,OAAO/Y,EAIzC,GAFAA,EAAG,aAAc,KAAK,MAAO,EAExBA,EAAG,EAAI,GAAKA,EAAG,EAAI,EAEvB,OAAS,KAAK,MAAQ,CAErB,KAAKqZ,GAEJrZ,EAAG,EAAIA,EAAG,EAAI,KAAK,MAAOA,EAAG,CAAE,EAC/B,MAED,KAAKsZ,GAEJtZ,EAAG,EAAIA,EAAG,EAAI,EAAI,EAAI,EACtB,MAED,KAAKuZ,GAEC,KAAK,IAAK,KAAK,MAAOvZ,EAAG,CAAE,EAAI,CAAE,IAAM,EAE3CA,EAAG,EAAI,KAAK,KAAMA,EAAG,CAAE,EAAIA,EAAG,EAI9BA,EAAG,EAAIA,EAAG,EAAI,KAAK,MAAOA,EAAG,CAAE,EAIhC,KAEF,CAID,GAAKA,EAAG,EAAI,GAAKA,EAAG,EAAI,EAEvB,OAAS,KAAK,MAAQ,CAErB,KAAKqZ,GAEJrZ,EAAG,EAAIA,EAAG,EAAI,KAAK,MAAOA,EAAG,CAAE,EAC/B,MAED,KAAKsZ,GAEJtZ,EAAG,EAAIA,EAAG,EAAI,EAAI,EAAI,EACtB,MAED,KAAKuZ,GAEC,KAAK,IAAK,KAAK,MAAOvZ,EAAG,CAAE,EAAI,CAAE,IAAM,EAE3CA,EAAG,EAAI,KAAK,KAAMA,EAAG,CAAE,EAAIA,EAAG,EAI9BA,EAAG,EAAIA,EAAG,EAAI,KAAK,MAAOA,EAAG,CAAE,EAIhC,KAEF,CAID,OAAK,KAAK,QAETA,EAAG,EAAI,EAAIA,EAAG,GAIRA,CAER,CAWA,IAAI,YAAa9H,EAAQ,CAEnBA,IAAU,KAEd,KAAK,UACL,KAAK,OAAO,YAAc,GAI5B,CAUA,IAAI,iBAAkBA,EAAQ,CAExBA,IAAU,IAEd,KAAK,cAIP,CAED,EASA6mB,GAAQ,cAAgB,KASxBA,GAAQ,gBAAkBhG,GAS1BgG,GAAQ,mBAAqB,EA0BvBC,GAAN,MAAMqjB,CAAQ,CAUb,YAAa5pC,EAAI,EAAGM,EAAI,EAAG8X,EAAI,EAAGwpB,EAAI,EAAI,CASzCgI,EAAQ,UAAU,UAAY,GAO9B,KAAK,EAAI5pC,EAOT,KAAK,EAAIM,EAOT,KAAK,EAAI8X,EAOT,KAAK,EAAIwpB,CAEV,CAOA,IAAI,OAAQ,CAEX,OAAO,KAAK,CAEb,CAEA,IAAI,MAAOniC,EAAQ,CAElB,KAAK,EAAIA,CAEV,CAOA,IAAI,QAAS,CAEZ,OAAO,KAAK,CAEb,CAEA,IAAI,OAAQA,EAAQ,CAEnB,KAAK,EAAIA,CAEV,CAWA,IAAKO,EAAGM,EAAG8X,EAAGwpB,EAAI,CAEjB,YAAK,EAAI5hC,EACT,KAAK,EAAIM,EACT,KAAK,EAAI8X,EACT,KAAK,EAAIwpB,EAEF,IAER,CAQA,UAAWZ,EAAS,CAEnB,YAAK,EAAIA,EACT,KAAK,EAAIA,EACT,KAAK,EAAIA,EACT,KAAK,EAAIA,EAEF,IAER,CAQA,KAAMhhC,EAAI,CAET,YAAK,EAAIA,EAEF,IAER,CAQA,KAAMM,EAAI,CAET,YAAK,EAAIA,EAEF,IAER,CAQA,KAAM8X,EAAI,CAET,YAAK,EAAIA,EAEF,IAER,CAQA,KAAMwpB,EAAI,CAET,YAAK,EAAIA,EAEF,IAER,CAUA,aAAcl3B,EAAOjL,EAAQ,CAE5B,OAASiL,EAAQ,CAEhB,IAAK,GAAG,KAAK,EAAIjL,EAAO,MACxB,IAAK,GAAG,KAAK,EAAIA,EAAO,MACxB,IAAK,GAAG,KAAK,EAAIA,EAAO,MACxB,IAAK,GAAG,KAAK,EAAIA,EAAO,MACxB,QAAS,MAAM,IAAI,MAAO,0BAA4BiL,CAAM,CAE7D,CAEA,OAAO,IAER,CASA,aAAcA,EAAQ,CAErB,OAASA,EAAQ,CAEhB,IAAK,GAAG,OAAO,KAAK,EACpB,IAAK,GAAG,OAAO,KAAK,EACpB,IAAK,GAAG,OAAO,KAAK,EACpB,IAAK,GAAG,OAAO,KAAK,EACpB,QAAS,MAAM,IAAI,MAAO,0BAA4BA,CAAM,CAE7D,CAED,CAOA,OAAQ,CAEP,OAAO,IAAI,KAAK,YAAa,KAAK,EAAG,KAAK,EAAG,KAAK,EAAG,KAAK,CAAE,CAE7D,CAQA,KAAMu2B,EAAI,CAET,YAAK,EAAIA,EAAE,EACX,KAAK,EAAIA,EAAE,EACX,KAAK,EAAIA,EAAE,EACX,KAAK,EAAMA,EAAE,IAAM,OAAcA,EAAE,EAAI,EAEhC,IAER,CAQA,IAAKA,EAAI,CAER,YAAK,GAAKA,EAAE,EACZ,KAAK,GAAKA,EAAE,EACZ,KAAK,GAAKA,EAAE,EACZ,KAAK,GAAKA,EAAE,EAEL,IAER,CAQA,UAAW3/B,EAAI,CAEd,YAAK,GAAKA,EACV,KAAK,GAAKA,EACV,KAAK,GAAKA,EACV,KAAK,GAAKA,EAEH,IAER,CASA,WAAYc,EAAGC,EAAI,CAElB,YAAK,EAAID,EAAE,EAAIC,EAAE,EACjB,KAAK,EAAID,EAAE,EAAIC,EAAE,EACjB,KAAK,EAAID,EAAE,EAAIC,EAAE,EACjB,KAAK,EAAID,EAAE,EAAIC,EAAE,EAEV,IAER,CASA,gBAAiB4+B,EAAG3/B,EAAI,CAEvB,YAAK,GAAK2/B,EAAE,EAAI3/B,EAChB,KAAK,GAAK2/B,EAAE,EAAI3/B,EAChB,KAAK,GAAK2/B,EAAE,EAAI3/B,EAChB,KAAK,GAAK2/B,EAAE,EAAI3/B,EAET,IAER,CAQA,IAAK2/B,EAAI,CAER,YAAK,GAAKA,EAAE,EACZ,KAAK,GAAKA,EAAE,EACZ,KAAK,GAAKA,EAAE,EACZ,KAAK,GAAKA,EAAE,EAEL,IAER,CAQA,UAAW3/B,EAAI,CAEd,YAAK,GAAKA,EACV,KAAK,GAAKA,EACV,KAAK,GAAKA,EACV,KAAK,GAAKA,EAEH,IAER,CASA,WAAYc,EAAGC,EAAI,CAElB,YAAK,EAAID,EAAE,EAAIC,EAAE,EACjB,KAAK,EAAID,EAAE,EAAIC,EAAE,EACjB,KAAK,EAAID,EAAE,EAAIC,EAAE,EACjB,KAAK,EAAID,EAAE,EAAIC,EAAE,EAEV,IAER,CAQA,SAAU4+B,EAAI,CAEb,YAAK,GAAKA,EAAE,EACZ,KAAK,GAAKA,EAAE,EACZ,KAAK,GAAKA,EAAE,EACZ,KAAK,GAAKA,EAAE,EAEL,IAER,CAQA,eAAgBD,EAAS,CAExB,YAAK,GAAKA,EACV,KAAK,GAAKA,EACV,KAAK,GAAKA,EACV,KAAK,GAAKA,EAEH,IAER,CAQA,aAAclhC,EAAI,CAEjB,IAAME,EAAI,KAAK,EAAGM,EAAI,KAAK,EAAG8X,EAAI,KAAK,EAAGwpB,EAAI,KAAK,EAC7C77B,EAAIjG,EAAE,SAEZ,YAAK,EAAIiG,EAAG,CAAE,EAAI/F,EAAI+F,EAAG,CAAE,EAAIzF,EAAIyF,EAAG,CAAE,EAAIqS,EAAIrS,EAAG,EAAG,EAAI67B,EAC1D,KAAK,EAAI77B,EAAG,CAAE,EAAI/F,EAAI+F,EAAG,CAAE,EAAIzF,EAAIyF,EAAG,CAAE,EAAIqS,EAAIrS,EAAG,EAAG,EAAI67B,EAC1D,KAAK,EAAI77B,EAAG,CAAE,EAAI/F,EAAI+F,EAAG,CAAE,EAAIzF,EAAIyF,EAAG,EAAG,EAAIqS,EAAIrS,EAAG,EAAG,EAAI67B,EAC3D,KAAK,EAAI77B,EAAG,CAAE,EAAI/F,EAAI+F,EAAG,CAAE,EAAIzF,EAAIyF,EAAG,EAAG,EAAIqS,EAAIrS,EAAG,EAAG,EAAI67B,EAEpD,IAER,CAQA,OAAQX,EAAI,CAEX,YAAK,GAAKA,EAAE,EACZ,KAAK,GAAKA,EAAE,EACZ,KAAK,GAAKA,EAAE,EACZ,KAAK,GAAKA,EAAE,EAEL,IAER,CAQA,aAAcD,EAAS,CAEtB,OAAO,KAAK,eAAgB,EAAIA,CAAO,CAExC,CASA,2BAA4B7+B,EAAI,CAM/B,KAAK,EAAI,EAAI,KAAK,KAAMA,EAAE,CAAE,EAE5B,IAAMb,EAAI,KAAK,KAAM,EAAIa,EAAE,EAAIA,EAAE,CAAE,EAEnC,OAAKb,EAAI,MAER,KAAK,EAAI,EACT,KAAK,EAAI,EACT,KAAK,EAAI,IAIT,KAAK,EAAIa,EAAE,EAAIb,EACf,KAAK,EAAIa,EAAE,EAAIb,EACf,KAAK,EAAIa,EAAE,EAAIb,GAIT,IAER,CASA,+BAAgCxB,EAAI,CAMnC,IAAI6hC,EAAO3hC,EAAGM,EAAG8X,EAIhByqB,EAAK/iC,EAAE,SAEPgjC,EAAMD,EAAI,CAAE,EAAGE,EAAMF,EAAI,CAAE,EAAGG,EAAMH,EAAI,CAAE,EAC1CI,EAAMJ,EAAI,CAAE,EAAGK,EAAML,EAAI,CAAE,EAAGM,EAAMN,EAAI,CAAE,EAC1CO,EAAMP,EAAI,CAAE,EAAGQ,EAAMR,EAAI,CAAE,EAAGS,EAAMT,EAAI,EAAG,EAE5C,GAAO,KAAK,IAAKE,EAAME,CAAI,EAAI,KACxB,KAAK,IAAKD,EAAMI,CAAI,EAAI,KACxB,KAAK,IAAKD,EAAME,CAAI,EAAI,IAAY,CAM1C,GAAO,KAAK,IAAKN,EAAME,CAAI,EAAI,IACxB,KAAK,IAAKD,EAAMI,CAAI,EAAI,IACxB,KAAK,IAAKD,EAAME,CAAI,EAAI,IACxB,KAAK,IAAKP,EAAMI,EAAMI,EAAM,CAAE,EAAI,GAIxC,YAAK,IAAK,EAAG,EAAG,EAAG,CAAE,EAEd,KAMR3B,EAAQ,KAAK,GAEb,IAAMkI,GAAO/G,EAAM,GAAM,EACnBgH,GAAO5G,EAAM,GAAM,EACnB6G,GAAOzG,EAAM,GAAM,EACnB0G,GAAOjH,EAAME,GAAQ,EACrBgH,GAAOjH,EAAMI,GAAQ,EACrB8G,GAAO/G,EAAME,GAAQ,EAE3B,OAAOwG,EAAKC,GAAUD,EAAKE,EAIrBF,EAAK,KAET7pC,EAAI,EACJM,EAAI,WACJ8X,EAAI,aAIJpY,EAAI,KAAK,KAAM6pC,CAAG,EAClBvpC,EAAI0pC,EAAKhqC,EACToY,EAAI6xB,EAAKjqC,GAIC8pC,EAAKC,EAIXD,EAAK,KAET9pC,EAAI,WACJM,EAAI,EACJ8X,EAAI,aAIJ9X,EAAI,KAAK,KAAMwpC,CAAG,EAClB9pC,EAAIgqC,EAAK1pC,EACT8X,EAAI8xB,EAAK5pC,GAQLypC,EAAK,KAET/pC,EAAI,WACJM,EAAI,WACJ8X,EAAI,IAIJA,EAAI,KAAK,KAAM2xB,CAAG,EAClB/pC,EAAIiqC,EAAK7xB,EACT9X,EAAI4pC,EAAK9xB,GAMX,KAAK,IAAKpY,EAAGM,EAAG8X,EAAGupB,CAAM,EAElB,IAER,CAIA,IAAIrgC,EAAI,KAAK,MAAQ+hC,EAAMF,IAAUE,EAAMF,IACxCH,EAAMI,IAAUJ,EAAMI,IACtBH,EAAMF,IAAUE,EAAMF,EAAM,EAE/B,OAAK,KAAK,IAAKzhC,CAAE,EAAI,OAAQA,EAAI,GAKjC,KAAK,GAAM+hC,EAAMF,GAAQ7hC,EACzB,KAAK,GAAM0hC,EAAMI,GAAQ9hC,EACzB,KAAK,GAAM2hC,EAAMF,GAAQzhC,EACzB,KAAK,EAAI,KAAK,MAAQwhC,EAAMI,EAAMI,EAAM,GAAM,CAAE,EAEzC,IAER,CASA,sBAAuBxjC,EAAI,CAE1B,IAAMiG,EAAIjG,EAAE,SAEZ,YAAK,EAAIiG,EAAG,EAAG,EACf,KAAK,EAAIA,EAAG,EAAG,EACf,KAAK,EAAIA,EAAG,EAAG,EACf,KAAK,EAAIA,EAAG,EAAG,EAER,IAER,CASA,IAAKk7B,EAAI,CAER,YAAK,EAAI,KAAK,IAAK,KAAK,EAAGA,EAAE,CAAE,EAC/B,KAAK,EAAI,KAAK,IAAK,KAAK,EAAGA,EAAE,CAAE,EAC/B,KAAK,EAAI,KAAK,IAAK,KAAK,EAAGA,EAAE,CAAE,EAC/B,KAAK,EAAI,KAAK,IAAK,KAAK,EAAGA,EAAE,CAAE,EAExB,IAER,CASA,IAAKA,EAAI,CAER,YAAK,EAAI,KAAK,IAAK,KAAK,EAAGA,EAAE,CAAE,EAC/B,KAAK,EAAI,KAAK,IAAK,KAAK,EAAGA,EAAE,CAAE,EAC/B,KAAK,EAAI,KAAK,IAAK,KAAK,EAAGA,EAAE,CAAE,EAC/B,KAAK,EAAI,KAAK,IAAK,KAAK,EAAGA,EAAE,CAAE,EAExB,IAER,CAYA,MAAOvhC,EAAKC,EAAM,CAIjB,YAAK,EAAIH,GAAO,KAAK,EAAGE,EAAI,EAAGC,EAAI,CAAE,EACrC,KAAK,EAAIH,GAAO,KAAK,EAAGE,EAAI,EAAGC,EAAI,CAAE,EACrC,KAAK,EAAIH,GAAO,KAAK,EAAGE,EAAI,EAAGC,EAAI,CAAE,EACrC,KAAK,EAAIH,GAAO,KAAK,EAAGE,EAAI,EAAGC,EAAI,CAAE,EAE9B,IAER,CAYA,YAAauhC,EAAQC,EAAS,CAE7B,YAAK,EAAI3hC,GAAO,KAAK,EAAG0hC,EAAQC,CAAO,EACvC,KAAK,EAAI3hC,GAAO,KAAK,EAAG0hC,EAAQC,CAAO,EACvC,KAAK,EAAI3hC,GAAO,KAAK,EAAG0hC,EAAQC,CAAO,EACvC,KAAK,EAAI3hC,GAAO,KAAK,EAAG0hC,EAAQC,CAAO,EAEhC,IAER,CAYA,YAAazhC,EAAKC,EAAM,CAEvB,IAAMiB,EAAS,KAAK,OAAO,EAE3B,OAAO,KAAK,aAAcA,GAAU,CAAE,EAAE,eAAgBpB,GAAOoB,EAAQlB,EAAKC,CAAI,CAAE,CAEnF,CAOA,OAAQ,CAEP,YAAK,EAAI,KAAK,MAAO,KAAK,CAAE,EAC5B,KAAK,EAAI,KAAK,MAAO,KAAK,CAAE,EAC5B,KAAK,EAAI,KAAK,MAAO,KAAK,CAAE,EAC5B,KAAK,EAAI,KAAK,MAAO,KAAK,CAAE,EAErB,IAER,CAOA,MAAO,CAEN,YAAK,EAAI,KAAK,KAAM,KAAK,CAAE,EAC3B,KAAK,EAAI,KAAK,KAAM,KAAK,CAAE,EAC3B,KAAK,EAAI,KAAK,KAAM,KAAK,CAAE,EAC3B,KAAK,EAAI,KAAK,KAAM,KAAK,CAAE,EAEpB,IAER,CAOA,OAAQ,CAEP,YAAK,EAAI,KAAK,MAAO,KAAK,CAAE,EAC5B,KAAK,EAAI,KAAK,MAAO,KAAK,CAAE,EAC5B,KAAK,EAAI,KAAK,MAAO,KAAK,CAAE,EAC5B,KAAK,EAAI,KAAK,MAAO,KAAK,CAAE,EAErB,IAER,CAQA,aAAc,CAEb,YAAK,EAAI,KAAK,MAAO,KAAK,CAAE,EAC5B,KAAK,EAAI,KAAK,MAAO,KAAK,CAAE,EAC5B,KAAK,EAAI,KAAK,MAAO,KAAK,CAAE,EAC5B,KAAK,EAAI,KAAK,MAAO,KAAK,CAAE,EAErB,IAER,CAOA,QAAS,CAER,YAAK,EAAI,CAAE,KAAK,EAChB,KAAK,EAAI,CAAE,KAAK,EAChB,KAAK,EAAI,CAAE,KAAK,EAChB,KAAK,EAAI,CAAE,KAAK,EAET,IAER,CAQA,IAAKshC,EAAI,CAER,OAAO,KAAK,EAAIA,EAAE,EAAI,KAAK,EAAIA,EAAE,EAAI,KAAK,EAAIA,EAAE,EAAI,KAAK,EAAIA,EAAE,CAEhE,CASA,UAAW,CAEV,OAAO,KAAK,EAAI,KAAK,EAAI,KAAK,EAAI,KAAK,EAAI,KAAK,EAAI,KAAK,EAAI,KAAK,EAAI,KAAK,CAE5E,CAOA,QAAS,CAER,OAAO,KAAK,KAAM,KAAK,EAAI,KAAK,EAAI,KAAK,EAAI,KAAK,EAAI,KAAK,EAAI,KAAK,EAAI,KAAK,EAAI,KAAK,CAAE,CAEzF,CAOA,iBAAkB,CAEjB,OAAO,KAAK,IAAK,KAAK,CAAE,EAAI,KAAK,IAAK,KAAK,CAAE,EAAI,KAAK,IAAK,KAAK,CAAE,EAAI,KAAK,IAAK,KAAK,CAAE,CAExF,CAQA,WAAY,CAEX,OAAO,KAAK,aAAc,KAAK,OAAO,GAAK,CAAE,CAE9C,CASA,UAAWrgC,EAAS,CAEnB,OAAO,KAAK,UAAU,EAAE,eAAgBA,CAAO,CAEhD,CAWA,KAAMqgC,EAAGO,EAAQ,CAEhB,YAAK,IAAOP,EAAE,EAAI,KAAK,GAAMO,EAC7B,KAAK,IAAOP,EAAE,EAAI,KAAK,GAAMO,EAC7B,KAAK,IAAOP,EAAE,EAAI,KAAK,GAAMO,EAC7B,KAAK,IAAOP,EAAE,EAAI,KAAK,GAAMO,EAEtB,IAER,CAYA,YAAaz8B,EAAIC,EAAIw8B,EAAQ,CAE5B,YAAK,EAAIz8B,EAAG,GAAMC,EAAG,EAAID,EAAG,GAAMy8B,EAClC,KAAK,EAAIz8B,EAAG,GAAMC,EAAG,EAAID,EAAG,GAAMy8B,EAClC,KAAK,EAAIz8B,EAAG,GAAMC,EAAG,EAAID,EAAG,GAAMy8B,EAClC,KAAK,EAAIz8B,EAAG,GAAMC,EAAG,EAAID,EAAG,GAAMy8B,EAE3B,IAER,CAQA,OAAQP,EAAI,CAEX,OAAWA,EAAE,IAAM,KAAK,GAASA,EAAE,IAAM,KAAK,GAASA,EAAE,IAAM,KAAK,GAASA,EAAE,IAAM,KAAK,CAE3F,CAUA,UAAW5jC,EAAOokC,EAAS,EAAI,CAE9B,YAAK,EAAIpkC,EAAOokC,CAAO,EACvB,KAAK,EAAIpkC,EAAOokC,EAAS,CAAE,EAC3B,KAAK,EAAIpkC,EAAOokC,EAAS,CAAE,EAC3B,KAAK,EAAIpkC,EAAOokC,EAAS,CAAE,EAEpB,IAER,CAUA,QAASpkC,EAAQ,CAAC,EAAGokC,EAAS,EAAI,CAEjC,OAAApkC,EAAOokC,CAAO,EAAI,KAAK,EACvBpkC,EAAOokC,EAAS,CAAE,EAAI,KAAK,EAC3BpkC,EAAOokC,EAAS,CAAE,EAAI,KAAK,EAC3BpkC,EAAOokC,EAAS,CAAE,EAAI,KAAK,EAEpBpkC,CAER,CASA,oBAAqBqkC,EAAWh3B,EAAQ,CAEvC,YAAK,EAAIg3B,EAAU,KAAMh3B,CAAM,EAC/B,KAAK,EAAIg3B,EAAU,KAAMh3B,CAAM,EAC/B,KAAK,EAAIg3B,EAAU,KAAMh3B,CAAM,EAC/B,KAAK,EAAIg3B,EAAU,KAAMh3B,CAAM,EAExB,IAER,CAQA,QAAS,CAER,YAAK,EAAI,KAAK,OAAO,EACrB,KAAK,EAAI,KAAK,OAAO,EACrB,KAAK,EAAI,KAAK,OAAO,EACrB,KAAK,EAAI,KAAK,OAAO,EAEd,IAER,CAEA,EAAG,OAAO,QAAS,GAAI,CAEtB,MAAM,KAAK,EACX,MAAM,KAAK,EACX,MAAM,KAAK,EACX,MAAM,KAAK,CAEZ,CAED,EAUM8b,GAAN,cAA2Bb,EAAgB,CAkC1C,YAAa7M,EAAQ,EAAGC,EAAS,EAAGvF,EAAU,CAAC,EAAI,CAElD,MAAM,EAENA,EAAU,OAAO,OAAQ,CACxB,gBAAiB,GACjB,eAAgB,KAChB,UAAW4N,GACX,YAAa,GACb,cAAe,GACf,mBAAoB,GACpB,qBAAsB,GACtB,aAAc,KACd,QAAS,EACT,MAAO,EACP,MAAO,EACP,UAAW,EACZ,EAAG5N,CAAQ,EASX,KAAK,eAAiB,GAQtB,KAAK,MAAQsF,EAQb,KAAK,OAASC,EAQd,KAAK,MAAQvF,EAAQ,MASrB,KAAK,QAAU,IAAI+S,GAAS,EAAG,EAAGzN,EAAOC,CAAO,EAShD,KAAK,YAAc,GAQnB,KAAK,SAAW,IAAIwN,GAAS,EAAG,EAAGzN,EAAOC,CAAO,EAEjD,IAAMrU,EAAQ,CAAE,MAAOoU,EAAO,OAAQC,EAAQ,MAAOvF,EAAQ,KAAM,EAE7DgF,EAAU,IAAI8N,GAAS5hB,CAAM,EAQnC,KAAK,SAAW,CAAC,EAEjB,IAAM8kC,EAAQh2B,EAAQ,MACtB,QAAUlW,EAAI,EAAGA,EAAIksC,EAAOlsC,IAE3B,KAAK,SAAUA,CAAE,EAAIkb,EAAQ,MAAM,EACnC,KAAK,SAAUlb,CAAE,EAAE,sBAAwB,GAC3C,KAAK,SAAUA,CAAE,EAAE,aAAe,KAInC,KAAK,mBAAoBkW,CAAQ,EAQjC,KAAK,YAAcA,EAAQ,YAQ3B,KAAK,cAAgBA,EAAQ,cAQ7B,KAAK,mBAAqBA,EAAQ,mBAQlC,KAAK,qBAAuBA,EAAQ,qBAEpC,KAAK,cAAgB,KACrB,KAAK,aAAeA,EAAQ,aAU5B,KAAK,QAAUA,EAAQ,QAQvB,KAAK,UAAYA,EAAQ,SAE1B,CAEA,mBAAoBA,EAAU,CAAC,EAAI,CAElC,IAAMY,EAAS,CACd,UAAWgN,GACX,gBAAiB,GACjB,MAAO,GACP,eAAgB,IACjB,EAEK5N,EAAQ,UAAY,SAAYY,EAAO,QAAUZ,EAAQ,SACzDA,EAAQ,QAAU,SAAYY,EAAO,MAAQZ,EAAQ,OACrDA,EAAQ,QAAU,SAAYY,EAAO,MAAQZ,EAAQ,OACrDA,EAAQ,QAAU,SAAYY,EAAO,MAAQZ,EAAQ,OACrDA,EAAQ,YAAc,SAAYY,EAAO,UAAYZ,EAAQ,WAC7DA,EAAQ,YAAc,SAAYY,EAAO,UAAYZ,EAAQ,WAC7DA,EAAQ,SAAW,SAAYY,EAAO,OAASZ,EAAQ,QACvDA,EAAQ,OAAS,SAAYY,EAAO,KAAOZ,EAAQ,MACnDA,EAAQ,aAAe,SAAYY,EAAO,WAAaZ,EAAQ,YAC/DA,EAAQ,aAAe,SAAYY,EAAO,WAAaZ,EAAQ,YAC/DA,EAAQ,QAAU,SAAYY,EAAO,MAAQZ,EAAQ,OACrDA,EAAQ,kBAAoB,SAAYY,EAAO,gBAAkBZ,EAAQ,iBACzEA,EAAQ,iBAAmB,SAAYY,EAAO,eAAiBZ,EAAQ,gBAE5E,QAAUlW,EAAI,EAAGA,EAAI,KAAK,SAAS,OAAQA,IAE1B,KAAK,SAAUA,CAAE,EACzB,UAAW8W,CAAO,CAI5B,CAOA,IAAI,SAAU,CAEb,OAAO,KAAK,SAAU,CAAE,CAEzB,CAEA,IAAI,QAAS3U,EAAQ,CAEpB,KAAK,SAAU,CAAE,EAAIA,CAEtB,CAEA,IAAI,aAAc0qC,EAAU,CAEtB,KAAK,gBAAkB,OAAO,KAAK,cAAc,aAAe,MAChEA,IAAY,OAAOA,EAAQ,aAAe,MAE/C,KAAK,cAAgBA,CAEtB,CAUA,IAAI,cAAe,CAElB,OAAO,KAAK,aAEb,CASA,QAASrxB,EAAOC,EAAQqxB,EAAQ,EAAI,CAEnC,GAAK,KAAK,QAAUtxB,GAAS,KAAK,SAAWC,GAAU,KAAK,QAAUqxB,EAAQ,CAE7E,KAAK,MAAQtxB,EACb,KAAK,OAASC,EACd,KAAK,MAAQqxB,EAEb,QAAU9sC,EAAI,EAAG+sC,EAAK,KAAK,SAAS,OAAQ/sC,EAAI+sC,EAAI/sC,IAEnD,KAAK,SAAUA,CAAE,EAAE,MAAM,MAAQwb,EACjC,KAAK,SAAUxb,CAAE,EAAE,MAAM,OAASyb,EAClC,KAAK,SAAUzb,CAAE,EAAE,MAAM,MAAQ8sC,EAE5B,KAAK,SAAU9sC,CAAE,EAAE,kBAAoB,KAM3C,KAAK,SAAUA,CAAE,EAAE,eAAiB,KAAK,SAAUA,CAAE,EAAE,MAAM,MAAQ,GAMvE,KAAK,QAAQ,CAEd,CAEA,KAAK,SAAS,IAAK,EAAG,EAAGwb,EAAOC,CAAO,EACvC,KAAK,QAAQ,IAAK,EAAG,EAAGD,EAAOC,CAAO,CAEvC,CAOA,OAAQ,CAEP,OAAO,IAAI,KAAK,YAAY,EAAE,KAAM,IAAK,CAE1C,CAUA,KAAM0wB,EAAS,CAEd,KAAK,MAAQA,EAAO,MACpB,KAAK,OAASA,EAAO,OACrB,KAAK,MAAQA,EAAO,MAEpB,KAAK,QAAQ,KAAMA,EAAO,OAAQ,EAClC,KAAK,YAAcA,EAAO,YAE1B,KAAK,SAAS,KAAMA,EAAO,QAAS,EAEpC,KAAK,SAAS,OAAS,EAEvB,QAAUnsC,EAAI,EAAG+sC,EAAKZ,EAAO,SAAS,OAAQnsC,EAAI+sC,EAAI/sC,IAAO,CAE5D,KAAK,SAAUA,CAAE,EAAImsC,EAAO,SAAUnsC,CAAE,EAAE,MAAM,EAChD,KAAK,SAAUA,CAAE,EAAE,sBAAwB,GAC3C,KAAK,SAAUA,CAAE,EAAE,aAAe,KAIlC,IAAMoH,EAAQ,OAAO,OAAQ,CAAC,EAAG+kC,EAAO,SAAUnsC,CAAE,EAAE,KAAM,EAC5D,KAAK,SAAUA,CAAE,EAAE,OAAS,IAAI6oB,GAAQzhB,CAAM,CAE/C,CAEA,YAAK,YAAc+kC,EAAO,YAC1B,KAAK,cAAgBA,EAAO,cAE5B,KAAK,mBAAqBA,EAAO,mBACjC,KAAK,qBAAuBA,EAAO,qBAE9BA,EAAO,eAAiB,OAAO,KAAK,aAAeA,EAAO,aAAa,MAAM,GAElF,KAAK,QAAUA,EAAO,QAEf,IAER,CAQA,SAAU,CAET,KAAK,cAAe,CAAE,KAAM,SAAU,CAAE,CAEzC,CAED,EAOMhjB,GAAN,cAAgCD,EAAa,CAS5C,YAAa1N,EAAQ,EAAGC,EAAS,EAAGvF,EAAU,CAAC,EAAI,CAElD,MAAOsF,EAAOC,EAAQvF,CAAQ,EAS9B,KAAK,oBAAsB,EAE5B,CAED,EAOMkT,GAAN,cAA+BJ,EAAQ,CAUtC,YAAavZ,EAAO,KAAM+L,EAAQ,EAAGC,EAAS,EAAGqxB,EAAQ,EAAI,CAE5D,MAAO,IAAK,EASZ,KAAK,mBAAqB,GAO1B,KAAK,MAAQ,CAAE,KAAAr9B,EAAM,MAAA+L,EAAO,OAAAC,EAAQ,MAAAqxB,CAAM,EAU1C,KAAK,UAAYrpB,GAUjB,KAAK,UAAYA,GASjB,KAAK,MAAQF,GAUb,KAAK,gBAAkB,GAWvB,KAAK,MAAQ,GAUb,KAAK,gBAAkB,EAOvB,KAAK,aAAe,IAAI,GAEzB,CAWA,eAAgBypB,EAAa,CAE5B,KAAK,aAAa,IAAKA,CAAW,CAEnC,CAKA,mBAAoB,CAEnB,KAAK,aAAa,MAAM,CAEzB,CAED,EAOM3jB,GAAN,cAAqCF,EAAkB,CAUtD,YAAa3N,EAAQ,EAAGC,EAAS,EAAGqxB,EAAQ,EAAG52B,EAAU,CAAC,EAAI,CAE7D,MAAOsF,EAAOC,EAAQvF,CAAQ,EAS9B,KAAK,yBAA2B,GAEhC,KAAK,MAAQ42B,EAOb,KAAK,QAAU,IAAI1jB,GAAkB,KAAM5N,EAAOC,EAAQqxB,CAAM,EAChE,KAAK,mBAAoB52B,CAAQ,EAEjC,KAAK,QAAQ,sBAAwB,EAEtC,CAED,EAQMoT,GAAN,cAA4BN,EAAQ,CAUnC,YAAavZ,EAAO,KAAM+L,EAAQ,EAAGC,EAAS,EAAGqxB,EAAQ,EAAI,CAU5D,MAAO,IAAK,EASZ,KAAK,gBAAkB,GAOvB,KAAK,MAAQ,CAAE,KAAAr9B,EAAM,MAAA+L,EAAO,OAAAC,EAAQ,MAAAqxB,CAAM,EAU1C,KAAK,UAAYrpB,GAUjB,KAAK,UAAYA,GASjB,KAAK,MAAQF,GAUb,KAAK,gBAAkB,GAWvB,KAAK,MAAQ,GAUb,KAAK,gBAAkB,CAExB,CAED,EAOMgG,GAAN,cAAkCJ,EAAkB,CAUnD,YAAa3N,EAAQ,EAAGC,EAAS,EAAGqxB,EAAQ,EAAG52B,EAAU,CAAC,EAAI,CAE7D,MAAOsF,EAAOC,EAAQvF,CAAQ,EAS9B,KAAK,sBAAwB,GAE7B,KAAK,MAAQ42B,EAOb,KAAK,QAAU,IAAIxjB,GAAe,KAAM9N,EAAOC,EAAQqxB,CAAM,EAC7D,KAAK,mBAAoB52B,CAAQ,EAEjC,KAAK,QAAQ,sBAAwB,EAEtC,CAED,EAKMsT,GAAN,KAAW,CAQV,YAAapnB,EAAM,IAAIsI,EAAS,IAAY,IAAY,GAAW,EAAGrI,EAAM,IAAIqI,EAAS,KAAY,KAAY,IAAW,EAAI,CAS/H,KAAK,OAAS,GAOd,KAAK,IAAMtI,EAOX,KAAK,IAAMC,CAEZ,CAUA,IAAKD,EAAKC,EAAM,CAEf,YAAK,IAAI,KAAMD,CAAI,EACnB,KAAK,IAAI,KAAMC,CAAI,EAEZ,IAER,CASA,aAActC,EAAQ,CAErB,KAAK,UAAU,EAEf,QAAUC,EAAI,EAAG+sC,EAAKhtC,EAAM,OAAQC,EAAI+sC,EAAI/sC,GAAK,EAEhD,KAAK,cAAe0pB,GAAU,UAAW3pB,EAAOC,CAAE,CAAE,EAIrD,OAAO,IAER,CASA,uBAAwBokC,EAAY,CAEnC,KAAK,UAAU,EAEf,QAAUpkC,EAAI,EAAG+sC,EAAK3I,EAAU,MAAOpkC,EAAI+sC,EAAI/sC,IAE9C,KAAK,cAAe0pB,GAAU,oBAAqB0a,EAAWpkC,CAAE,CAAE,EAInE,OAAO,IAER,CASA,cAAe2V,EAAS,CAEvB,KAAK,UAAU,EAEf,QAAU3V,EAAI,EAAG+sC,EAAKp3B,EAAO,OAAQ3V,EAAI+sC,EAAI/sC,IAE5C,KAAK,cAAe2V,EAAQ3V,CAAE,CAAE,EAIjC,OAAO,IAER,CAUA,qBAAsB8L,EAAQmhC,EAAO,CAEpC,IAAMC,EAAWxjB,GAAU,KAAMujB,CAAK,EAAE,eAAgB,EAAI,EAE5D,YAAK,IAAI,KAAMnhC,CAAO,EAAE,IAAKohC,CAAS,EACtC,KAAK,IAAI,KAAMphC,CAAO,EAAE,IAAKohC,CAAS,EAE/B,IAER,CAYA,cAAe/jC,EAAQgkC,EAAU,GAAQ,CAExC,YAAK,UAAU,EAER,KAAK,eAAgBhkC,EAAQgkC,CAAQ,CAE7C,CAOA,OAAQ,CAEP,OAAO,IAAI,KAAK,YAAY,EAAE,KAAM,IAAK,CAE1C,CAQA,KAAMC,EAAM,CAEX,YAAK,IAAI,KAAMA,EAAI,GAAI,EACvB,KAAK,IAAI,KAAMA,EAAI,GAAI,EAEhB,IAER,CAOA,WAAY,CAEX,YAAK,IAAI,EAAI,KAAK,IAAI,EAAI,KAAK,IAAI,EAAI,IACvC,KAAK,IAAI,EAAI,KAAK,IAAI,EAAI,KAAK,IAAI,EAAI,KAEhC,IAER,CASA,SAAU,CAIT,OAAS,KAAK,IAAI,EAAI,KAAK,IAAI,GAAS,KAAK,IAAI,EAAI,KAAK,IAAI,GAAS,KAAK,IAAI,EAAI,KAAK,IAAI,CAE9F,CAQA,UAAW1mC,EAAS,CAEnB,OAAO,KAAK,QAAQ,EAAIA,EAAO,IAAK,EAAG,EAAG,CAAE,EAAIA,EAAO,WAAY,KAAK,IAAK,KAAK,GAAI,EAAE,eAAgB,EAAI,CAE7G,CAQA,QAASA,EAAS,CAEjB,OAAO,KAAK,QAAQ,EAAIA,EAAO,IAAK,EAAG,EAAG,CAAE,EAAIA,EAAO,WAAY,KAAK,IAAK,KAAK,GAAI,CAEvF,CAQA,cAAegD,EAAQ,CAEtB,YAAK,IAAI,IAAKA,CAAM,EACpB,KAAK,IAAI,IAAKA,CAAM,EAEb,IAER,CAYA,eAAgB2jC,EAAS,CAExB,YAAK,IAAI,IAAKA,CAAO,EACrB,KAAK,IAAI,IAAKA,CAAO,EAEd,IAER,CASA,eAAgB3J,EAAS,CAExB,YAAK,IAAI,UAAW,CAAEA,CAAO,EAC7B,KAAK,IAAI,UAAWA,CAAO,EAEpB,IAER,CAaA,eAAgBv6B,EAAQgkC,EAAU,GAAQ,CAKzChkC,EAAO,kBAAmB,GAAO,EAAM,EAEvC,IAAMyR,EAAWzR,EAAO,SAExB,GAAKyR,IAAa,OAAY,CAE7B,IAAM9N,EAAoB8N,EAAS,aAAc,UAAW,EAK5D,GAAKuyB,IAAY,IAAQrgC,IAAsB,QAAa3D,EAAO,kBAAoB,GAEtF,QAAUnJ,EAAI,EAAG4V,EAAI9I,EAAkB,MAAO9M,EAAI4V,EAAG5V,IAE/CmJ,EAAO,SAAW,GAEtBA,EAAO,kBAAmBnJ,EAAG0pB,EAAU,EAIvCA,GAAU,oBAAqB5c,EAAmB9M,CAAE,EAIrD0pB,GAAU,aAAcvgB,EAAO,WAAY,EAC3C,KAAK,cAAeugB,EAAU,OAM1BvgB,EAAO,cAAgB,QAItBA,EAAO,cAAgB,MAE3BA,EAAO,mBAAmB,EAI3BwgB,GAAO,KAAMxgB,EAAO,WAAY,IAO3ByR,EAAS,cAAgB,MAE7BA,EAAS,mBAAmB,EAI7B+O,GAAO,KAAM/O,EAAS,WAAY,GAInC+O,GAAO,aAAcxgB,EAAO,WAAY,EAExC,KAAK,MAAOwgB,EAAO,CAIrB,CAEA,IAAMrP,EAAWnR,EAAO,SAExB,QAAUnJ,EAAI,EAAG4V,EAAI0E,EAAS,OAAQta,EAAI4V,EAAG5V,IAE5C,KAAK,eAAgBsa,EAAUta,CAAE,EAAGmtC,CAAQ,EAI7C,OAAO,IAER,CAQA,cAAezjC,EAAQ,CAEtB,OAAOA,EAAM,GAAK,KAAK,IAAI,GAAKA,EAAM,GAAK,KAAK,IAAI,GACnDA,EAAM,GAAK,KAAK,IAAI,GAAKA,EAAM,GAAK,KAAK,IAAI,GAC7CA,EAAM,GAAK,KAAK,IAAI,GAAKA,EAAM,GAAK,KAAK,IAAI,CAE/C,CASA,YAAa0jC,EAAM,CAElB,OAAO,KAAK,IAAI,GAAKA,EAAI,IAAI,GAAKA,EAAI,IAAI,GAAK,KAAK,IAAI,GACvD,KAAK,IAAI,GAAKA,EAAI,IAAI,GAAKA,EAAI,IAAI,GAAK,KAAK,IAAI,GACjD,KAAK,IAAI,GAAKA,EAAI,IAAI,GAAKA,EAAI,IAAI,GAAK,KAAK,IAAI,CAEnD,CASA,aAAc1jC,EAAOhD,EAAS,CAK7B,OAAOA,EAAO,KACXgD,EAAM,EAAI,KAAK,IAAI,IAAQ,KAAK,IAAI,EAAI,KAAK,IAAI,IACjDA,EAAM,EAAI,KAAK,IAAI,IAAQ,KAAK,IAAI,EAAI,KAAK,IAAI,IACjDA,EAAM,EAAI,KAAK,IAAI,IAAQ,KAAK,IAAI,EAAI,KAAK,IAAI,EACpD,CAED,CAQA,cAAe0jC,EAAM,CAGpB,OAAOA,EAAI,IAAI,GAAK,KAAK,IAAI,GAAKA,EAAI,IAAI,GAAK,KAAK,IAAI,GACvDA,EAAI,IAAI,GAAK,KAAK,IAAI,GAAKA,EAAI,IAAI,GAAK,KAAK,IAAI,GACjDA,EAAI,IAAI,GAAK,KAAK,IAAI,GAAKA,EAAI,IAAI,GAAK,KAAK,IAAI,CAEnD,CAQA,iBAAkBE,EAAS,CAG1B,YAAK,WAAYA,EAAO,OAAQ5jB,EAAU,EAGnCA,GAAU,kBAAmB4jB,EAAO,MAAO,GAAOA,EAAO,OAASA,EAAO,MAEjF,CAQA,gBAAiBC,EAAQ,CAKxB,IAAInrC,EAAKC,EAET,OAAKkrC,EAAM,OAAO,EAAI,GAErBnrC,EAAMmrC,EAAM,OAAO,EAAI,KAAK,IAAI,EAChClrC,EAAMkrC,EAAM,OAAO,EAAI,KAAK,IAAI,IAIhCnrC,EAAMmrC,EAAM,OAAO,EAAI,KAAK,IAAI,EAChClrC,EAAMkrC,EAAM,OAAO,EAAI,KAAK,IAAI,GAI5BA,EAAM,OAAO,EAAI,GAErBnrC,GAAOmrC,EAAM,OAAO,EAAI,KAAK,IAAI,EACjClrC,GAAOkrC,EAAM,OAAO,EAAI,KAAK,IAAI,IAIjCnrC,GAAOmrC,EAAM,OAAO,EAAI,KAAK,IAAI,EACjClrC,GAAOkrC,EAAM,OAAO,EAAI,KAAK,IAAI,GAI7BA,EAAM,OAAO,EAAI,GAErBnrC,GAAOmrC,EAAM,OAAO,EAAI,KAAK,IAAI,EACjClrC,GAAOkrC,EAAM,OAAO,EAAI,KAAK,IAAI,IAIjCnrC,GAAOmrC,EAAM,OAAO,EAAI,KAAK,IAAI,EACjClrC,GAAOkrC,EAAM,OAAO,EAAI,KAAK,IAAI,GAIzBnrC,GAAO,CAAEmrC,EAAM,UAAYlrC,GAAO,CAAEkrC,EAAM,QAEpD,CAQA,mBAAoBC,EAAW,CAE9B,GAAK,KAAK,QAAQ,EAEjB,MAAO,GAKR,KAAK,UAAWtjB,EAAQ,EACxBC,GAAS,WAAY,KAAK,IAAKD,EAAQ,EAGvCN,GAAM,WAAY4jB,EAAS,EAAGtjB,EAAQ,EACtCL,GAAM,WAAY2jB,EAAS,EAAGtjB,EAAQ,EACtCJ,GAAM,WAAY0jB,EAAS,EAAGtjB,EAAQ,EAGtCH,GAAI,WAAYF,GAAOD,EAAM,EAC7BI,GAAI,WAAYF,GAAOD,EAAM,EAC7BI,GAAI,WAAYL,GAAOE,EAAM,EAK7B,IAAIviB,EAAO,CACV,EAAG,CAAEwiB,GAAI,EAAGA,GAAI,EAAG,EAAG,CAAEC,GAAI,EAAGA,GAAI,EAAG,EAAG,CAAEC,GAAI,EAAGA,GAAI,EACtDF,GAAI,EAAG,EAAG,CAAEA,GAAI,EAAGC,GAAI,EAAG,EAAG,CAAEA,GAAI,EAAGC,GAAI,EAAG,EAAG,CAAEA,GAAI,EACtD,CAAEF,GAAI,EAAGA,GAAI,EAAG,EAAG,CAAEC,GAAI,EAAGA,GAAI,EAAG,EAAG,CAAEC,GAAI,EAAGA,GAAI,EAAG,CACvD,EASA,MARK,CAAE3iB,GAAYC,EAAMqiB,GAAOC,GAAOC,GAAOK,EAAS,IAOvD5iB,EAAO,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAC9B,CAAED,GAAYC,EAAMqiB,GAAOC,GAAOC,GAAOK,EAAS,GAE/C,IAMRC,GAAgB,aAAcL,GAAKC,EAAI,EACvCziB,EAAO,CAAE6iB,GAAgB,EAAGA,GAAgB,EAAGA,GAAgB,CAAE,EAE1D9iB,GAAYC,EAAMqiB,GAAOC,GAAOC,GAAOK,EAAS,EAExD,CASA,WAAYzgB,EAAOhD,EAAS,CAE3B,OAAOA,EAAO,KAAMgD,CAAM,EAAE,MAAO,KAAK,IAAK,KAAK,GAAI,CAEvD,CASA,gBAAiBA,EAAQ,CAExB,OAAO,KAAK,WAAYA,EAAOggB,EAAU,EAAE,WAAYhgB,CAAM,CAE9D,CAQA,kBAAmBhD,EAAS,CAE3B,OAAK,KAAK,QAAQ,EAEjBA,EAAO,UAAU,GAIjB,KAAK,UAAWA,EAAO,MAAO,EAE9BA,EAAO,OAAS,KAAK,QAASgjB,EAAU,EAAE,OAAO,EAAI,IAI/ChjB,CAER,CAWA,UAAW0mC,EAAM,CAEhB,YAAK,IAAI,IAAKA,EAAI,GAAI,EACtB,KAAK,IAAI,IAAKA,EAAI,GAAI,EAGjB,KAAK,QAAQ,GAAI,KAAK,UAAU,EAE9B,IAER,CAUA,MAAOA,EAAM,CAEZ,YAAK,IAAI,IAAKA,EAAI,GAAI,EACtB,KAAK,IAAI,IAAKA,EAAI,GAAI,EAEf,IAER,CAQA,aAAchC,EAAS,CAGtB,OAAK,KAAK,QAAQ,EAAW,MAG7B3hB,GAAS,CAAE,EAAE,IAAK,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,KAAK,IAAI,CAAE,EAAE,aAAc2hB,CAAO,EAC5E3hB,GAAS,CAAE,EAAE,IAAK,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,KAAK,IAAI,CAAE,EAAE,aAAc2hB,CAAO,EAC5E3hB,GAAS,CAAE,EAAE,IAAK,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,KAAK,IAAI,CAAE,EAAE,aAAc2hB,CAAO,EAC5E3hB,GAAS,CAAE,EAAE,IAAK,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,KAAK,IAAI,CAAE,EAAE,aAAc2hB,CAAO,EAC5E3hB,GAAS,CAAE,EAAE,IAAK,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,KAAK,IAAI,CAAE,EAAE,aAAc2hB,CAAO,EAC5E3hB,GAAS,CAAE,EAAE,IAAK,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,KAAK,IAAI,CAAE,EAAE,aAAc2hB,CAAO,EAC5E3hB,GAAS,CAAE,EAAE,IAAK,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,KAAK,IAAI,CAAE,EAAE,aAAc2hB,CAAO,EAC5E3hB,GAAS,CAAE,EAAE,IAAK,KAAK,IAAI,EAAG,KAAK,IAAI,EAAG,KAAK,IAAI,CAAE,EAAE,aAAc2hB,CAAO,EAE5E,KAAK,cAAe3hB,EAAQ,EAErB,KAER,CASA,UAAW0a,EAAS,CAEnB,YAAK,IAAI,IAAKA,CAAO,EACrB,KAAK,IAAI,IAAKA,CAAO,EAEd,IAER,CAQA,OAAQiJ,EAAM,CAEb,OAAOA,EAAI,IAAI,OAAQ,KAAK,GAAI,GAAKA,EAAI,IAAI,OAAQ,KAAK,GAAI,CAE/D,CAOA,QAAS,CAER,MAAO,CACN,IAAK,KAAK,IAAI,QAAQ,EACtB,IAAK,KAAK,IAAI,QAAQ,CACvB,CAED,CAQA,SAAUnzB,EAAO,CAEhB,YAAK,IAAI,UAAWA,EAAK,GAAI,EAC7B,KAAK,IAAI,UAAWA,EAAK,GAAI,EACtB,IAER,CAED,EAEMwP,GAAU,CACD,IAAI/e,EACJ,IAAIA,EACJ,IAAIA,EACJ,IAAIA,EACJ,IAAIA,EACJ,IAAIA,EACJ,IAAIA,EACJ,IAAIA,CACnB,EAEMgf,GAA0B,IAAIhf,EAE9Bif,GAAuB,IAAIH,GAI3BI,GAAsB,IAAIlf,EAC1Bmf,GAAsB,IAAInf,EAC1Bof,GAAsB,IAAIpf,EAI1Bqf,GAAoB,IAAIrf,EACxBsf,GAAoB,IAAItf,EACxBuf,GAAoB,IAAIvf,EAExBwf,GAAwB,IAAIxf,EAC5Byf,GAAyB,IAAIzf,EAC7B0f,GAAgC,IAAI1f,EACpC7C,GAA0B,IAAI6C,EA4B9B2f,IAAuB,IAAIb,GAC3Bc,GAAsB,IAAI5f,EAC1B6f,GAAsB,IAAI7f,EAM1B8f,GAAN,KAAa,CAQZ,YAAa1e,EAAS,IAAIpB,EAAWw9B,EAAS,GAAK,CASlD,KAAK,SAAW,GAOhB,KAAK,OAASp8B,EAOd,KAAK,OAASo8B,CAEf,CASA,IAAKp8B,EAAQo8B,EAAS,CAErB,YAAK,OAAO,KAAMp8B,CAAO,EACzB,KAAK,OAASo8B,EAEP,IAER,CAYA,cAAevyB,EAAQ83B,EAAiB,CAEvC,IAAM3hC,EAAS,KAAK,OAEf2hC,IAAmB,OAEvB3hC,EAAO,KAAM2hC,CAAe,EAI5BpjB,IAAO,cAAe1U,CAAO,EAAE,UAAW7J,CAAO,EAIlD,IAAI4hC,EAAc,EAElB,QAAU1tC,EAAI,EAAG+sC,EAAKp3B,EAAO,OAAQ3V,EAAI+sC,EAAI/sC,IAE5C0tC,EAAc,KAAK,IAAKA,EAAa5hC,EAAO,kBAAmB6J,EAAQ3V,CAAE,CAAE,CAAE,EAI9E,YAAK,OAAS,KAAK,KAAM0tC,CAAY,EAE9B,IAER,CAQA,KAAMJ,EAAS,CAEd,YAAK,OAAO,KAAMA,EAAO,MAAO,EAChC,KAAK,OAASA,EAAO,OAEd,IAER,CAUA,SAAU,CAET,OAAS,KAAK,OAAS,CAExB,CAOA,WAAY,CAEX,YAAK,OAAO,IAAK,EAAG,EAAG,CAAE,EACzB,KAAK,OAAS,GAEP,IAER,CASA,cAAe5jC,EAAQ,CAEtB,OAASA,EAAM,kBAAmB,KAAK,MAAO,GAAO,KAAK,OAAS,KAAK,MAEzE,CAUA,gBAAiBA,EAAQ,CAExB,OAASA,EAAM,WAAY,KAAK,MAAO,EAAI,KAAK,MAEjD,CAQA,iBAAkB4jC,EAAS,CAE1B,IAAMK,EAAY,KAAK,OAASL,EAAO,OAEvC,OAAOA,EAAO,OAAO,kBAAmB,KAAK,MAAO,GAAOK,EAAYA,CAExE,CAQA,cAAeP,EAAM,CAEpB,OAAOA,EAAI,iBAAkB,IAAK,CAEnC,CAQA,gBAAiBG,EAAQ,CAExB,OAAO,KAAK,IAAKA,EAAM,gBAAiB,KAAK,MAAO,CAAE,GAAK,KAAK,MAEjE,CAWA,WAAY7jC,EAAOhD,EAAS,CAE3B,IAAMknC,EAAgB,KAAK,OAAO,kBAAmBlkC,CAAM,EAE3D,OAAAhD,EAAO,KAAMgD,CAAM,EAEdkkC,EAAkB,KAAK,OAAS,KAAK,SAEzClnC,EAAO,IAAK,KAAK,MAAO,EAAE,UAAU,EACpCA,EAAO,eAAgB,KAAK,MAAO,EAAE,IAAK,KAAK,MAAO,GAIhDA,CAER,CAQA,eAAgBA,EAAS,CAExB,OAAK,KAAK,QAAQ,GAGjBA,EAAO,UAAU,EACVA,IAIRA,EAAO,IAAK,KAAK,OAAQ,KAAK,MAAO,EACrCA,EAAO,eAAgB,KAAK,MAAO,EAE5BA,EAER,CAQA,aAAc0kC,EAAS,CAEtB,YAAK,OAAO,aAAcA,CAAO,EACjC,KAAK,OAAS,KAAK,OAASA,EAAO,kBAAkB,EAE9C,IAER,CAQA,UAAWjH,EAAS,CAEnB,YAAK,OAAO,IAAKA,CAAO,EAEjB,IAER,CAQA,cAAez6B,EAAQ,CAEtB,GAAK,KAAK,QAAQ,EAEjB,YAAK,OAAO,KAAMA,CAAM,EAExB,KAAK,OAAS,EAEP,KAIR4gB,GAAM,WAAY5gB,EAAO,KAAK,MAAO,EAErC,IAAMmkC,EAAWvjB,GAAM,SAAS,EAEhC,GAAKujB,EAAa,KAAK,OAAS,KAAK,OAAW,CAI/C,IAAMvqC,EAAS,KAAK,KAAMuqC,CAAS,EAE7BC,GAAUxqC,EAAS,KAAK,QAAW,GAEzC,KAAK,OAAO,gBAAiBgnB,GAAOwjB,EAAQxqC,CAAO,EAEnD,KAAK,QAAUwqC,CAEhB,CAEA,OAAO,IAER,CAQA,MAAOR,EAAS,CAEf,OAAKA,EAAO,QAAQ,EAEZ,KAIH,KAAK,QAAQ,GAEjB,KAAK,KAAMA,CAAO,EAEX,OAIH,KAAK,OAAO,OAAQA,EAAO,MAAO,IAAM,GAE3C,KAAK,OAAS,KAAK,IAAK,KAAK,OAAQA,EAAO,MAAO,GAIpD/iB,GAAM,WAAY+iB,EAAO,OAAQ,KAAK,MAAO,EAAE,UAAWA,EAAO,MAAO,EAExE,KAAK,cAAehjB,GAAM,KAAMgjB,EAAO,MAAO,EAAE,IAAK/iB,EAAM,CAAE,EAE7D,KAAK,cAAeD,GAAM,KAAMgjB,EAAO,MAAO,EAAE,IAAK/iB,EAAM,CAAE,GAIvD,KAER,CAQA,OAAQ+iB,EAAS,CAEhB,OAAOA,EAAO,OAAO,OAAQ,KAAK,MAAO,GAAOA,EAAO,SAAW,KAAK,MAExE,CAOA,OAAQ,CAEP,OAAO,IAAI,KAAK,YAAY,EAAE,KAAM,IAAK,CAE1C,CAOA,QAAS,CAER,MAAO,CACN,OAAQ,KAAK,OACb,OAAQ,KAAK,OAAO,QAAQ,CAC7B,CAED,CAQA,SAAUrzB,EAAO,CAEhB,YAAK,OAASA,EAAK,OACnB,KAAK,OAAO,UAAWA,EAAK,MAAO,EAC5B,IAER,CAED,EAEMwQ,GAA0B,IAAI/f,EAC9BggB,GAA2B,IAAIhgB,EAC/BigB,GAAwB,IAAIjgB,EAC5BkgB,GAAsB,IAAIlgB,EAE1BmgB,GAAuB,IAAIngB,EAC3BogB,GAAuB,IAAIpgB,EAC3BqgB,GAA0B,IAAIrgB,EAQ9BsgB,GAAN,KAAU,CAQT,YAAa+iB,EAAS,IAAIrjC,EAAWsjC,EAAY,IAAItjC,EAAS,EAAG,EAAG,EAAG,EAAI,CAO1E,KAAK,OAASqjC,EAOd,KAAK,UAAYC,CAElB,CASA,IAAKD,EAAQC,EAAY,CAExB,YAAK,OAAO,KAAMD,CAAO,EACzB,KAAK,UAAU,KAAMC,CAAU,EAExB,IAER,CAQA,KAAM1kC,EAAM,CAEX,YAAK,OAAO,KAAMA,EAAI,MAAO,EAC7B,KAAK,UAAU,KAAMA,EAAI,SAAU,EAE5B,IAER,CASA,GAAIpF,EAAGwC,EAAS,CAEf,OAAOA,EAAO,KAAM,KAAK,MAAO,EAAE,gBAAiB,KAAK,UAAWxC,CAAE,CAEtE,CAQA,OAAQy/B,EAAI,CAEX,YAAK,UAAU,KAAMA,CAAE,EAAE,IAAK,KAAK,MAAO,EAAE,UAAU,EAE/C,IAER,CAQA,OAAQz/B,EAAI,CAEX,YAAK,OAAO,KAAM,KAAK,GAAIA,EAAGumB,EAAU,CAAE,EAEnC,IAER,CASA,oBAAqB/gB,EAAOhD,EAAS,CAEpCA,EAAO,WAAYgD,EAAO,KAAK,MAAO,EAEtC,IAAMukC,EAAoBvnC,EAAO,IAAK,KAAK,SAAU,EAErD,OAAKunC,EAAoB,EAEjBvnC,EAAO,KAAM,KAAK,MAAO,EAI1BA,EAAO,KAAM,KAAK,MAAO,EAAE,gBAAiB,KAAK,UAAWunC,CAAkB,CAEtF,CAQA,gBAAiBvkC,EAAQ,CAExB,OAAO,KAAK,KAAM,KAAK,kBAAmBA,CAAM,CAAE,CAEnD,CAQA,kBAAmBA,EAAQ,CAE1B,IAAMukC,EAAoBxjB,GAAU,WAAY/gB,EAAO,KAAK,MAAO,EAAE,IAAK,KAAK,SAAU,EAIzF,OAAKukC,EAAoB,EAEjB,KAAK,OAAO,kBAAmBvkC,CAAM,GAI7C+gB,GAAU,KAAM,KAAK,MAAO,EAAE,gBAAiB,KAAK,UAAWwjB,CAAkB,EAE1ExjB,GAAU,kBAAmB/gB,CAAM,EAE3C,CAWA,oBAAqBlC,EAAIC,EAAIymC,EAAoBC,EAAyB,CASzEzjB,GAAW,KAAMljB,CAAG,EAAE,IAAKC,CAAG,EAAE,eAAgB,EAAI,EACpDkjB,GAAQ,KAAMljB,CAAG,EAAE,IAAKD,CAAG,EAAE,UAAU,EACvCojB,GAAM,KAAM,KAAK,MAAO,EAAE,IAAKF,EAAW,EAE1C,IAAM0jB,EAAY5mC,EAAG,WAAYC,CAAG,EAAI,GAClC4mC,EAAM,CAAE,KAAK,UAAU,IAAK1jB,EAAQ,EACpC2jB,EAAK1jB,GAAM,IAAK,KAAK,SAAU,EAC/B/nB,EAAK,CAAE+nB,GAAM,IAAKD,EAAQ,EAC1B3lB,EAAI4lB,GAAM,SAAS,EACnBogB,EAAM,KAAK,IAAK,EAAIqD,EAAMA,CAAI,EAChCE,EAAIpJ,EAAIqJ,EAASC,EAErB,GAAKzD,EAAM,EAQV,GAJAuD,EAAKF,EAAMxrC,EAAKyrC,EAChBnJ,EAAKkJ,EAAMC,EAAKzrC,EAChB4rC,EAASL,EAAYpD,EAEhBuD,GAAM,EAEV,GAAKpJ,GAAM,CAAEsJ,EAEZ,GAAKtJ,GAAMsJ,EAAS,CAKnB,IAAMC,EAAS,EAAI1D,EACnBuD,GAAMG,EACNvJ,GAAMuJ,EACNF,EAAUD,GAAOA,EAAKF,EAAMlJ,EAAK,EAAImJ,GAAOnJ,GAAOkJ,EAAME,EAAKpJ,EAAK,EAAItiC,GAAOmC,CAE/E,MAICmgC,EAAKiJ,EACLG,EAAK,KAAK,IAAK,EAAG,EAAIF,EAAMlJ,EAAKmJ,EAAK,EACtCE,EAAU,CAAED,EAAKA,EAAKpJ,GAAOA,EAAK,EAAItiC,GAAOmC,OAQ9CmgC,EAAK,CAAEiJ,EACPG,EAAK,KAAK,IAAK,EAAG,EAAIF,EAAMlJ,EAAKmJ,EAAK,EACtCE,EAAU,CAAED,EAAKA,EAAKpJ,GAAOA,EAAK,EAAItiC,GAAOmC,OAMzCmgC,GAAM,CAAEsJ,GAIZF,EAAK,KAAK,IAAK,EAAG,EAAI,CAAEF,EAAMD,EAAYE,EAAK,EAC/CnJ,EAAOoJ,EAAK,EAAM,CAAEH,EAAY,KAAK,IAAK,KAAK,IAAK,CAAEA,EAAW,CAAEvrC,CAAG,EAAGurC,CAAU,EACnFI,EAAU,CAAED,EAAKA,EAAKpJ,GAAOA,EAAK,EAAItiC,GAAOmC,GAElCmgC,GAAMsJ,GAIjBF,EAAK,EACLpJ,EAAK,KAAK,IAAK,KAAK,IAAK,CAAEiJ,EAAW,CAAEvrC,CAAG,EAAGurC,CAAU,EACxDI,EAAUrJ,GAAOA,EAAK,EAAItiC,GAAOmC,IAMjCupC,EAAK,KAAK,IAAK,EAAG,EAAIF,EAAMD,EAAYE,EAAK,EAC7CnJ,EAAOoJ,EAAK,EAAMH,EAAY,KAAK,IAAK,KAAK,IAAK,CAAEA,EAAW,CAAEvrC,CAAG,EAAGurC,CAAU,EACjFI,EAAU,CAAED,EAAKA,EAAKpJ,GAAOA,EAAK,EAAItiC,GAAOmC,QAU/CmgC,EAAOkJ,EAAM,EAAM,CAAED,EAAYA,EACjCG,EAAK,KAAK,IAAK,EAAG,EAAIF,EAAMlJ,EAAKmJ,EAAK,EACtCE,EAAU,CAAED,EAAKA,EAAKpJ,GAAOA,EAAK,EAAItiC,GAAOmC,EAI9C,OAAKkpC,GAEJA,EAAmB,KAAM,KAAK,MAAO,EAAE,gBAAiB,KAAK,UAAWK,CAAG,EAIvEJ,GAEJA,EAAuB,KAAMzjB,EAAW,EAAE,gBAAiBC,GAASwa,CAAG,EAIjEqJ,CAER,CAUA,gBAAiBlB,EAAQ5mC,EAAS,CAEjC+jB,GAAU,WAAY6iB,EAAO,OAAQ,KAAK,MAAO,EACjD,IAAMqB,EAAMlkB,GAAU,IAAK,KAAK,SAAU,EACpC1oB,EAAK0oB,GAAU,IAAKA,EAAU,EAAIkkB,EAAMA,EACxCC,EAAUtB,EAAO,OAASA,EAAO,OAEvC,GAAKvrC,EAAK6sC,EAAU,OAAO,KAE3B,IAAMC,EAAM,KAAK,KAAMD,EAAU7sC,CAAG,EAG9BmM,EAAKygC,EAAME,EAGX1gC,EAAKwgC,EAAME,EAGjB,OAAK1gC,EAAK,EAAW,KAKhBD,EAAK,EAAW,KAAK,GAAIC,EAAIzH,CAAO,EAGlC,KAAK,GAAIwH,EAAIxH,CAAO,CAE5B,CAQA,iBAAkB4mC,EAAS,CAE1B,OAAKA,EAAO,OAAS,EAAW,GAEzB,KAAK,kBAAmBA,EAAO,MAAO,GAAOA,EAAO,OAASA,EAAO,MAE5E,CASA,gBAAiBC,EAAQ,CAExB,IAAMzJ,EAAcyJ,EAAM,OAAO,IAAK,KAAK,SAAU,EAErD,GAAKzJ,IAAgB,EAGpB,OAAKyJ,EAAM,gBAAiB,KAAK,MAAO,IAAM,EAEtC,EAMD,KAIR,IAAMrpC,EAAI,EAAI,KAAK,OAAO,IAAKqpC,EAAM,MAAO,EAAIA,EAAM,UAAazJ,EAInE,OAAO5/B,GAAK,EAAIA,EAAI,IAErB,CAUA,eAAgBqpC,EAAO7mC,EAAS,CAE/B,IAAMxC,EAAI,KAAK,gBAAiBqpC,CAAM,EAEtC,OAAKrpC,IAAM,KAEH,KAID,KAAK,GAAIA,EAAGwC,CAAO,CAE3B,CAQA,gBAAiB6mC,EAAQ,CAIxB,IAAMuB,EAAcvB,EAAM,gBAAiB,KAAK,MAAO,EAUvD,OARKuB,IAAgB,GAMDvB,EAAM,OAAO,IAAK,KAAK,SAAU,EAElCuB,EAAc,CAUlC,CAUA,aAAc1B,EAAK1mC,EAAS,CAE3B,IAAIqoC,EAAMC,EAAMC,EAAOC,EAAOC,EAAOC,EAE/BC,EAAU,EAAI,KAAK,UAAU,EAClCC,EAAU,EAAI,KAAK,UAAU,EAC7BC,EAAU,EAAI,KAAK,UAAU,EAExBxB,EAAS,KAAK,OAoDpB,OAlDKsB,GAAW,GAEfN,GAAS3B,EAAI,IAAI,EAAIW,EAAO,GAAMsB,EAClCL,GAAS5B,EAAI,IAAI,EAAIW,EAAO,GAAMsB,IAIlCN,GAAS3B,EAAI,IAAI,EAAIW,EAAO,GAAMsB,EAClCL,GAAS5B,EAAI,IAAI,EAAIW,EAAO,GAAMsB,GAI9BC,GAAW,GAEfL,GAAU7B,EAAI,IAAI,EAAIW,EAAO,GAAMuB,EACnCJ,GAAU9B,EAAI,IAAI,EAAIW,EAAO,GAAMuB,IAInCL,GAAU7B,EAAI,IAAI,EAAIW,EAAO,GAAMuB,EACnCJ,GAAU9B,EAAI,IAAI,EAAIW,EAAO,GAAMuB,GAI7BP,EAAOG,GAAaD,EAAQD,KAE9BC,EAAQF,GAAQ,MAAOA,CAAK,KAAIA,EAAOE,IAEvCC,EAAQF,GAAQ,MAAOA,CAAK,KAAIA,EAAOE,GAEvCK,GAAW,GAEfJ,GAAU/B,EAAI,IAAI,EAAIW,EAAO,GAAMwB,EACnCH,GAAUhC,EAAI,IAAI,EAAIW,EAAO,GAAMwB,IAInCJ,GAAU/B,EAAI,IAAI,EAAIW,EAAO,GAAMwB,EACnCH,GAAUhC,EAAI,IAAI,EAAIW,EAAO,GAAMwB,GAI7BR,EAAOK,GAAaD,EAAQH,MAE9BG,EAAQJ,GAAQA,IAASA,KAAOA,EAAOI,IAEvCC,EAAQJ,GAAQA,IAASA,KAAOA,EAAOI,GAIvCJ,EAAO,GAAW,KAEhB,KAAK,GAAID,GAAQ,EAAIA,EAAOC,EAAMtoC,CAAO,CAEjD,CAQA,cAAe0mC,EAAM,CAEpB,OAAO,KAAK,aAAcA,EAAK3iB,EAAU,IAAM,IAEhD,CAaA,kBAAmB3lB,EAAGC,EAAGC,EAAGwqC,EAAiB9oC,EAAS,CAMrDmkB,GAAO,WAAY9lB,EAAGD,CAAE,EACxBgmB,GAAO,WAAY9lB,EAAGF,CAAE,EACxBimB,GAAU,aAAcF,GAAQC,EAAO,EAOvC,IAAI2kB,EAAM,KAAK,UAAU,IAAK1kB,EAAU,EACpChW,EAEJ,GAAK06B,EAAM,EAAI,CAEd,GAAKD,EAAkB,OAAO,KAC9Bz6B,EAAO,CAER,SAAY06B,EAAM,EAEjB16B,EAAO,GACP06B,EAAM,CAAEA,MAIR,QAAO,KAIR7kB,GAAM,WAAY,KAAK,OAAQ9lB,CAAE,EACjC,IAAM4qC,EAAS36B,EAAO,KAAK,UAAU,IAAK+V,GAAO,aAAcF,GAAOE,EAAO,CAAE,EAG/E,GAAK4kB,EAAS,EAEb,OAAO,KAIR,IAAMC,EAAS56B,EAAO,KAAK,UAAU,IAAK8V,GAAO,MAAOD,EAAM,CAAE,EAUhE,GAPK+kB,EAAS,GAOTD,EAASC,EAASF,EAEtB,OAAO,KAKR,IAAMG,EAAM,CAAE76B,EAAO6V,GAAM,IAAKG,EAAU,EAG1C,OAAK6kB,EAAM,EAEH,KAKD,KAAK,GAAIA,EAAMH,EAAK/oC,CAAO,CAEnC,CAQA,aAAcwkC,EAAU,CAEvB,YAAK,OAAO,aAAcA,CAAQ,EAClC,KAAK,UAAU,mBAAoBA,CAAQ,EAEpC,IAER,CAQA,OAAQ5hC,EAAM,CAEb,OAAOA,EAAI,OAAO,OAAQ,KAAK,MAAO,GAAKA,EAAI,UAAU,OAAQ,KAAK,SAAU,CAEjF,CAOA,OAAQ,CAEP,OAAO,IAAI,KAAK,YAAY,EAAE,KAAM,IAAK,CAE1C,CAED,EAwCM2hB,GAAN,MAAM4kB,CAAQ,CAwBb,YAAapH,EAAKC,EAAKC,EAAKmH,EAAKlH,EAAKC,EAAKC,EAAKiH,EAAKhH,EAAKC,EAAKC,EAAK+G,EAAKC,EAAKC,EAAKC,EAAKC,EAAM,CAS7FP,EAAQ,UAAU,UAAY,GAO9B,KAAK,SAAW,CAEf,EAAG,EAAG,EAAG,EACT,EAAG,EAAG,EAAG,EACT,EAAG,EAAG,EAAG,EACT,EAAG,EAAG,EAAG,CAEV,EAEKpH,IAAQ,QAEZ,KAAK,IAAKA,EAAKC,EAAKC,EAAKmH,EAAKlH,EAAKC,EAAKC,EAAKiH,EAAKhH,EAAKC,EAAKC,EAAK+G,EAAKC,EAAKC,EAAKC,EAAKC,CAAI,CAI3F,CAwBA,IAAK3H,EAAKC,EAAKC,EAAKmH,EAAKlH,EAAKC,EAAKC,EAAKiH,EAAKhH,EAAKC,EAAKC,EAAK+G,EAAKC,EAAKC,EAAKC,EAAKC,EAAM,CAErF,IAAM7K,EAAK,KAAK,SAEhB,OAAAA,EAAI,CAAE,EAAIkD,EAAKlD,EAAI,CAAE,EAAImD,EAAKnD,EAAI,CAAE,EAAIoD,EAAKpD,EAAI,EAAG,EAAIuK,EACxDvK,EAAI,CAAE,EAAIqD,EAAKrD,EAAI,CAAE,EAAIsD,EAAKtD,EAAI,CAAE,EAAIuD,EAAKvD,EAAI,EAAG,EAAIwK,EACxDxK,EAAI,CAAE,EAAIwD,EAAKxD,EAAI,CAAE,EAAIyD,EAAKzD,EAAI,EAAG,EAAI0D,EAAK1D,EAAI,EAAG,EAAIyK,EACzDzK,EAAI,CAAE,EAAI0K,EAAK1K,EAAI,CAAE,EAAI2K,EAAK3K,EAAI,EAAG,EAAI4K,EAAK5K,EAAI,EAAG,EAAI6K,EAElD,IAER,CAOA,UAAW,CAEV,YAAK,IAEJ,EAAG,EAAG,EAAG,EACT,EAAG,EAAG,EAAG,EACT,EAAG,EAAG,EAAG,EACT,EAAG,EAAG,EAAG,CAEV,EAEO,IAER,CAOA,OAAQ,CAEP,OAAO,IAAIP,EAAQ,EAAE,UAAW,KAAK,QAAS,CAE/C,CAQA,KAAMrtC,EAAI,CAET,IAAM+iC,EAAK,KAAK,SACV2D,EAAK1mC,EAAE,SAEb,OAAA+iC,EAAI,CAAE,EAAI2D,EAAI,CAAE,EAAG3D,EAAI,CAAE,EAAI2D,EAAI,CAAE,EAAG3D,EAAI,CAAE,EAAI2D,EAAI,CAAE,EAAG3D,EAAI,CAAE,EAAI2D,EAAI,CAAE,EACzE3D,EAAI,CAAE,EAAI2D,EAAI,CAAE,EAAG3D,EAAI,CAAE,EAAI2D,EAAI,CAAE,EAAG3D,EAAI,CAAE,EAAI2D,EAAI,CAAE,EAAG3D,EAAI,CAAE,EAAI2D,EAAI,CAAE,EACzE3D,EAAI,CAAE,EAAI2D,EAAI,CAAE,EAAG3D,EAAI,CAAE,EAAI2D,EAAI,CAAE,EAAG3D,EAAI,EAAG,EAAI2D,EAAI,EAAG,EAAG3D,EAAI,EAAG,EAAI2D,EAAI,EAAG,EAC7E3D,EAAI,EAAG,EAAI2D,EAAI,EAAG,EAAG3D,EAAI,EAAG,EAAI2D,EAAI,EAAG,EAAG3D,EAAI,EAAG,EAAI2D,EAAI,EAAG,EAAG3D,EAAI,EAAG,EAAI2D,EAAI,EAAG,EAE1E,IAER,CASA,aAAc1mC,EAAI,CAEjB,IAAM+iC,EAAK,KAAK,SAAU2D,EAAK1mC,EAAE,SAEjC,OAAA+iC,EAAI,EAAG,EAAI2D,EAAI,EAAG,EAClB3D,EAAI,EAAG,EAAI2D,EAAI,EAAG,EAClB3D,EAAI,EAAG,EAAI2D,EAAI,EAAG,EAEX,IAER,CAQA,eAAgB1mC,EAAI,CAEnB,IAAM0mC,EAAK1mC,EAAE,SAEb,YAAK,IAEJ0mC,EAAI,CAAE,EAAGA,EAAI,CAAE,EAAGA,EAAI,CAAE,EAAG,EAC3BA,EAAI,CAAE,EAAGA,EAAI,CAAE,EAAGA,EAAI,CAAE,EAAG,EAC3BA,EAAI,CAAE,EAAGA,EAAI,CAAE,EAAGA,EAAI,CAAE,EAAG,EAC3B,EAAG,EAAG,EAAG,CAEV,EAEO,IAER,CAUA,aAAcC,EAAOC,EAAOC,EAAQ,CAEnC,OAAK,KAAK,YAAY,IAAM,GAE3BF,EAAM,IAAK,EAAG,EAAG,CAAE,EACnBC,EAAM,IAAK,EAAG,EAAG,CAAE,EACnBC,EAAM,IAAK,EAAG,EAAG,CAAE,EAEZ,OAIRF,EAAM,oBAAqB,KAAM,CAAE,EACnCC,EAAM,oBAAqB,KAAM,CAAE,EACnCC,EAAM,oBAAqB,KAAM,CAAE,EAE5B,KAER,CAUA,UAAWF,EAAOC,EAAOC,EAAQ,CAEhC,YAAK,IACJF,EAAM,EAAGC,EAAM,EAAGC,EAAM,EAAG,EAC3BF,EAAM,EAAGC,EAAM,EAAGC,EAAM,EAAG,EAC3BF,EAAM,EAAGC,EAAM,EAAGC,EAAM,EAAG,EAC3B,EAAG,EAAG,EAAG,CACV,EAEO,IAER,CAWA,gBAAiB7mC,EAAI,CAEpB,GAAKA,EAAE,YAAY,IAAM,EAExB,OAAO,KAAK,SAAS,EAItB,IAAM+iC,EAAK,KAAK,SACV2D,EAAK1mC,EAAE,SAEP6tC,EAAS,EAAInlB,GAAM,oBAAqB1oB,EAAG,CAAE,EAAE,OAAO,EACtD8tC,EAAS,EAAIplB,GAAM,oBAAqB1oB,EAAG,CAAE,EAAE,OAAO,EACtD+tC,EAAS,EAAIrlB,GAAM,oBAAqB1oB,EAAG,CAAE,EAAE,OAAO,EAE5D,OAAA+iC,EAAI,CAAE,EAAI2D,EAAI,CAAE,EAAImH,EACpB9K,EAAI,CAAE,EAAI2D,EAAI,CAAE,EAAImH,EACpB9K,EAAI,CAAE,EAAI2D,EAAI,CAAE,EAAImH,EACpB9K,EAAI,CAAE,EAAI,EAEVA,EAAI,CAAE,EAAI2D,EAAI,CAAE,EAAIoH,EACpB/K,EAAI,CAAE,EAAI2D,EAAI,CAAE,EAAIoH,EACpB/K,EAAI,CAAE,EAAI2D,EAAI,CAAE,EAAIoH,EACpB/K,EAAI,CAAE,EAAI,EAEVA,EAAI,CAAE,EAAI2D,EAAI,CAAE,EAAIqH,EACpBhL,EAAI,CAAE,EAAI2D,EAAI,CAAE,EAAIqH,EACpBhL,EAAI,EAAG,EAAI2D,EAAI,EAAG,EAAIqH,EACtBhL,EAAI,EAAG,EAAI,EAEXA,EAAI,EAAG,EAAI,EACXA,EAAI,EAAG,EAAI,EACXA,EAAI,EAAG,EAAI,EACXA,EAAI,EAAG,EAAI,EAEJ,IAER,CAYA,sBAAuBN,EAAQ,CAE9B,IAAMM,EAAK,KAAK,SAEV7iC,EAAIuiC,EAAM,EAAGjiC,EAAIiiC,EAAM,EAAGnqB,EAAImqB,EAAM,EACpCngC,EAAI,KAAK,IAAKpC,CAAE,EAAGqC,EAAI,KAAK,IAAKrC,CAAE,EACnC,EAAI,KAAK,IAAKM,CAAE,EAAG0nC,EAAI,KAAK,IAAK1nC,CAAE,EACnCyF,EAAI,KAAK,IAAKqS,CAAE,EAAG9R,EAAI,KAAK,IAAK8R,CAAE,EAEzC,GAAKmqB,EAAM,QAAU,MAAQ,CAE5B,IAAMqE,EAAKxkC,EAAI2D,EAAG+nC,EAAK1rC,EAAIkE,EAAGugC,EAAKxkC,EAAI0D,EAAGgoC,EAAK1rC,EAAIiE,EAEnDu8B,EAAI,CAAE,EAAI,EAAI98B,EACd88B,EAAI,CAAE,EAAI,CAAE,EAAIv8B,EAChBu8B,EAAI,CAAE,EAAImF,EAEVnF,EAAI,CAAE,EAAIiL,EAAKjH,EAAKmB,EACpBnF,EAAI,CAAE,EAAI+D,EAAKmH,EAAK/F,EACpBnF,EAAI,CAAE,EAAI,CAAExgC,EAAI,EAEhBwgC,EAAI,CAAE,EAAIkL,EAAKnH,EAAKoB,EACpBnF,EAAI,CAAE,EAAIgE,EAAKiH,EAAK9F,EACpBnF,EAAI,EAAG,EAAIzgC,EAAI,CAEhB,SAAYmgC,EAAM,QAAU,MAAQ,CAEnC,IAAMyL,EAAK,EAAIjoC,EAAGkoC,EAAK,EAAI3nC,EAAG4nC,EAAKlG,EAAIjiC,EAAGooC,EAAKnG,EAAI1hC,EAEnDu8B,EAAI,CAAE,EAAImL,EAAKG,EAAK9rC,EACpBwgC,EAAI,CAAE,EAAIqL,EAAK7rC,EAAI4rC,EACnBpL,EAAI,CAAE,EAAIzgC,EAAI4lC,EAEdnF,EAAI,CAAE,EAAIzgC,EAAIkE,EACdu8B,EAAI,CAAE,EAAIzgC,EAAI2D,EACd88B,EAAI,CAAE,EAAI,CAAExgC,EAEZwgC,EAAI,CAAE,EAAIoL,EAAK5rC,EAAI6rC,EACnBrL,EAAI,CAAE,EAAIsL,EAAKH,EAAK3rC,EACpBwgC,EAAI,EAAG,EAAIzgC,EAAI,CAEhB,SAAYmgC,EAAM,QAAU,MAAQ,CAEnC,IAAMyL,EAAK,EAAIjoC,EAAGkoC,EAAK,EAAI3nC,EAAG4nC,EAAKlG,EAAIjiC,EAAGooC,EAAKnG,EAAI1hC,EAEnDu8B,EAAI,CAAE,EAAImL,EAAKG,EAAK9rC,EACpBwgC,EAAI,CAAE,EAAI,CAAEzgC,EAAIkE,EAChBu8B,EAAI,CAAE,EAAIqL,EAAKD,EAAK5rC,EAEpBwgC,EAAI,CAAE,EAAIoL,EAAKC,EAAK7rC,EACpBwgC,EAAI,CAAE,EAAIzgC,EAAI2D,EACd88B,EAAI,CAAE,EAAIsL,EAAKH,EAAK3rC,EAEpBwgC,EAAI,CAAE,EAAI,CAAEzgC,EAAI4lC,EAChBnF,EAAI,CAAE,EAAIxgC,EACVwgC,EAAI,EAAG,EAAIzgC,EAAI,CAEhB,SAAYmgC,EAAM,QAAU,MAAQ,CAEnC,IAAMqE,EAAKxkC,EAAI2D,EAAG+nC,EAAK1rC,EAAIkE,EAAGugC,EAAKxkC,EAAI0D,EAAGgoC,EAAK1rC,EAAIiE,EAEnDu8B,EAAI,CAAE,EAAI,EAAI98B,EACd88B,EAAI,CAAE,EAAIgE,EAAKmB,EAAI8F,EACnBjL,EAAI,CAAE,EAAI+D,EAAKoB,EAAI+F,EAEnBlL,EAAI,CAAE,EAAI,EAAIv8B,EACdu8B,EAAI,CAAE,EAAIkL,EAAK/F,EAAIpB,EACnB/D,EAAI,CAAE,EAAIiL,EAAK9F,EAAInB,EAEnBhE,EAAI,CAAE,EAAI,CAAEmF,EACZnF,EAAI,CAAE,EAAIxgC,EAAI,EACdwgC,EAAI,EAAG,EAAIzgC,EAAI,CAEhB,SAAYmgC,EAAM,QAAU,MAAQ,CAEnC,IAAM6L,EAAKhsC,EAAI,EAAGisC,EAAKjsC,EAAI4lC,EAAGsG,EAAKjsC,EAAI,EAAGksC,EAAKlsC,EAAI2lC,EAEnDnF,EAAI,CAAE,EAAI,EAAI98B,EACd88B,EAAI,CAAE,EAAI0L,EAAKH,EAAK9nC,EACpBu8B,EAAI,CAAE,EAAIyL,EAAKhoC,EAAI+nC,EAEnBxL,EAAI,CAAE,EAAIv8B,EACVu8B,EAAI,CAAE,EAAIzgC,EAAI2D,EACd88B,EAAI,CAAE,EAAI,CAAExgC,EAAI0D,EAEhB88B,EAAI,CAAE,EAAI,CAAEmF,EAAIjiC,EAChB88B,EAAI,CAAE,EAAIwL,EAAK/nC,EAAIgoC,EACnBzL,EAAI,EAAG,EAAIuL,EAAKG,EAAKjoC,CAEtB,SAAYi8B,EAAM,QAAU,MAAQ,CAEnC,IAAM6L,EAAKhsC,EAAI,EAAGisC,EAAKjsC,EAAI4lC,EAAGsG,EAAKjsC,EAAI,EAAGksC,EAAKlsC,EAAI2lC,EAEnDnF,EAAI,CAAE,EAAI,EAAI98B,EACd88B,EAAI,CAAE,EAAI,CAAEv8B,EACZu8B,EAAI,CAAE,EAAImF,EAAIjiC,EAEd88B,EAAI,CAAE,EAAIuL,EAAK9nC,EAAIioC,EACnB1L,EAAI,CAAE,EAAIzgC,EAAI2D,EACd88B,EAAI,CAAE,EAAIwL,EAAK/nC,EAAIgoC,EAEnBzL,EAAI,CAAE,EAAIyL,EAAKhoC,EAAI+nC,EACnBxL,EAAI,CAAE,EAAIxgC,EAAI0D,EACd88B,EAAI,EAAG,EAAI0L,EAAKjoC,EAAI8nC,CAErB,CAGA,OAAAvL,EAAI,CAAE,EAAI,EACVA,EAAI,CAAE,EAAI,EACVA,EAAI,EAAG,EAAI,EAGXA,EAAI,EAAG,EAAI,EACXA,EAAI,EAAG,EAAI,EACXA,EAAI,EAAG,EAAI,EACXA,EAAI,EAAG,EAAI,EAEJ,IAER,CAUA,2BAA4B1gC,EAAI,CAE/B,OAAO,KAAK,QAASumB,IAAOvmB,EAAGwmB,GAAK,CAErC,CAWA,OAAQ6lB,EAAKxqC,EAAQyqC,EAAK,CAEzB,IAAM5L,EAAK,KAAK,SAEhB,OAAA/Z,GAAG,WAAY0lB,EAAKxqC,CAAO,EAEtB8kB,GAAG,SAAS,IAAM,IAItBA,GAAG,EAAI,GAIRA,GAAG,UAAU,EACbF,GAAG,aAAc6lB,EAAI3lB,EAAG,EAEnBF,GAAG,SAAS,IAAM,IAIjB,KAAK,IAAK6lB,EAAG,CAAE,IAAM,EAEzB3lB,GAAG,GAAK,KAIRA,GAAG,GAAK,KAITA,GAAG,UAAU,EACbF,GAAG,aAAc6lB,EAAI3lB,EAAG,GAIzBF,GAAG,UAAU,EACbC,GAAG,aAAcC,GAAIF,EAAG,EAExBia,EAAI,CAAE,EAAIja,GAAG,EAAGia,EAAI,CAAE,EAAIha,GAAG,EAAGga,EAAI,CAAE,EAAI/Z,GAAG,EAC7C+Z,EAAI,CAAE,EAAIja,GAAG,EAAGia,EAAI,CAAE,EAAIha,GAAG,EAAGga,EAAI,CAAE,EAAI/Z,GAAG,EAC7C+Z,EAAI,CAAE,EAAIja,GAAG,EAAGia,EAAI,CAAE,EAAIha,GAAG,EAAGga,EAAI,EAAG,EAAI/Z,GAAG,EAEvC,IAER,CAQA,SAAUhpB,EAAI,CAEb,OAAO,KAAK,iBAAkB,KAAMA,CAAE,CAEvC,CAQA,YAAaA,EAAI,CAEhB,OAAO,KAAK,iBAAkBA,EAAG,IAAK,CAEvC,CAUA,iBAAkBsC,EAAGC,EAAI,CAExB,IAAMukC,EAAKxkC,EAAE,SACPykC,EAAKxkC,EAAE,SACPwgC,EAAK,KAAK,SAEViE,EAAMF,EAAI,CAAE,EAAGG,EAAMH,EAAI,CAAE,EAAGI,EAAMJ,EAAI,CAAE,EAAG8H,EAAM9H,EAAI,EAAG,EAC1DK,EAAML,EAAI,CAAE,EAAGM,EAAMN,EAAI,CAAE,EAAGO,EAAMP,EAAI,CAAE,EAAG+H,EAAM/H,EAAI,EAAG,EAC1DQ,EAAMR,EAAI,CAAE,EAAGS,EAAMT,EAAI,CAAE,EAAGU,EAAMV,EAAI,EAAG,EAAGgI,EAAMhI,EAAI,EAAG,EAC3DiI,EAAMjI,EAAI,CAAE,EAAGkI,EAAMlI,EAAI,CAAE,EAAGmI,EAAMnI,EAAI,EAAG,EAAGoI,EAAMpI,EAAI,EAAG,EAE3DW,EAAMV,EAAI,CAAE,EAAGW,EAAMX,EAAI,CAAE,EAAGY,EAAMZ,EAAI,CAAE,EAAGoI,EAAMpI,EAAI,EAAG,EAC1Da,EAAMb,EAAI,CAAE,EAAGc,EAAMd,EAAI,CAAE,EAAGe,EAAMf,EAAI,CAAE,EAAGqI,EAAMrI,EAAI,EAAG,EAC1DgB,EAAMhB,EAAI,CAAE,EAAGiB,EAAMjB,EAAI,CAAE,EAAGkB,EAAMlB,EAAI,EAAG,EAAGsI,EAAMtI,EAAI,EAAG,EAC3DuI,EAAMvI,EAAI,CAAE,EAAGwI,EAAMxI,EAAI,CAAE,EAAGyI,EAAMzI,EAAI,EAAG,EAAG0I,EAAM1I,EAAI,EAAG,EAEjE,OAAAhE,EAAI,CAAE,EAAIiE,EAAMS,EAAMR,EAAMW,EAAMV,EAAMa,EAAM6G,EAAMU,EACpDvM,EAAI,CAAE,EAAIiE,EAAMU,EAAMT,EAAMY,EAAMX,EAAMc,EAAM4G,EAAMW,EACpDxM,EAAI,CAAE,EAAIiE,EAAMW,EAAMV,EAAMa,EAAMZ,EAAMe,EAAM2G,EAAMY,EACpDzM,EAAI,EAAG,EAAIiE,EAAMmI,EAAMlI,EAAMmI,EAAMlI,EAAMmI,EAAMT,EAAMa,EAErD1M,EAAI,CAAE,EAAIoE,EAAMM,EAAML,EAAMQ,EAAMP,EAAMU,EAAM8G,EAAMS,EACpDvM,EAAI,CAAE,EAAIoE,EAAMO,EAAMN,EAAMS,EAAMR,EAAMW,EAAM6G,EAAMU,EACpDxM,EAAI,CAAE,EAAIoE,EAAMQ,EAAMP,EAAMU,EAAMT,EAAMY,EAAM4G,EAAMW,EACpDzM,EAAI,EAAG,EAAIoE,EAAMgI,EAAM/H,EAAMgI,EAAM/H,EAAMgI,EAAMR,EAAMY,EAErD1M,EAAI,CAAE,EAAIuE,EAAMG,EAAMF,EAAMK,EAAMJ,EAAMO,EAAM+G,EAAMQ,EACpDvM,EAAI,CAAE,EAAIuE,EAAMI,EAAMH,EAAMM,EAAML,EAAMQ,EAAM8G,EAAMS,EACpDxM,EAAI,EAAG,EAAIuE,EAAMK,EAAMJ,EAAMO,EAAMN,EAAMS,EAAM6G,EAAMU,EACrDzM,EAAI,EAAG,EAAIuE,EAAM6H,EAAM5H,EAAM6H,EAAM5H,EAAM6H,EAAMP,EAAMW,EAErD1M,EAAI,CAAE,EAAIgM,EAAMtH,EAAMuH,EAAMpH,EAAMqH,EAAMlH,EAAMmH,EAAMI,EACpDvM,EAAI,CAAE,EAAIgM,EAAMrH,EAAMsH,EAAMnH,EAAMoH,EAAMjH,EAAMkH,EAAMK,EACpDxM,EAAI,EAAG,EAAIgM,EAAMpH,EAAMqH,EAAMlH,EAAMmH,EAAMhH,EAAMiH,EAAMM,EACrDzM,EAAI,EAAG,EAAIgM,EAAMI,EAAMH,EAAMI,EAAMH,EAAMI,EAAMH,EAAMO,EAE9C,IAER,CAQA,eAAgBjuC,EAAI,CAEnB,IAAMuhC,EAAK,KAAK,SAEhB,OAAAA,EAAI,CAAE,GAAKvhC,EAAGuhC,EAAI,CAAE,GAAKvhC,EAAGuhC,EAAI,CAAE,GAAKvhC,EAAGuhC,EAAI,EAAG,GAAKvhC,EACtDuhC,EAAI,CAAE,GAAKvhC,EAAGuhC,EAAI,CAAE,GAAKvhC,EAAGuhC,EAAI,CAAE,GAAKvhC,EAAGuhC,EAAI,EAAG,GAAKvhC,EACtDuhC,EAAI,CAAE,GAAKvhC,EAAGuhC,EAAI,CAAE,GAAKvhC,EAAGuhC,EAAI,EAAG,GAAKvhC,EAAGuhC,EAAI,EAAG,GAAKvhC,EACvDuhC,EAAI,CAAE,GAAKvhC,EAAGuhC,EAAI,CAAE,GAAKvhC,EAAGuhC,EAAI,EAAG,GAAKvhC,EAAGuhC,EAAI,EAAG,GAAKvhC,EAEhD,IAER,CASA,aAAc,CAEb,IAAMuhC,EAAK,KAAK,SAEVkD,EAAMlD,EAAI,CAAE,EAAGmD,EAAMnD,EAAI,CAAE,EAAGoD,EAAMpD,EAAI,CAAE,EAAGuK,EAAMvK,EAAI,EAAG,EAC1DqD,EAAMrD,EAAI,CAAE,EAAGsD,EAAMtD,EAAI,CAAE,EAAGuD,EAAMvD,EAAI,CAAE,EAAGwK,EAAMxK,EAAI,EAAG,EAC1DwD,EAAMxD,EAAI,CAAE,EAAGyD,EAAMzD,EAAI,CAAE,EAAG0D,EAAM1D,EAAI,EAAG,EAAGyK,EAAMzK,EAAI,EAAG,EAC3D0K,EAAM1K,EAAI,CAAE,EAAG2K,EAAM3K,EAAI,CAAE,EAAG4K,EAAM5K,EAAI,EAAG,EAAG6K,EAAM7K,EAAI,EAAG,EAE3DsF,EAAM/B,EAAMkH,EAAMD,EAAM9G,EACxB6B,EAAMjC,EAAMmH,EAAMD,EAAM/G,EACxB+B,EAAMlC,EAAMI,EAAMH,EAAME,EAExBkJ,EAAMtJ,EAAMoH,EAAMD,EAAMhH,EACxBoJ,EAAMvJ,EAAMK,EAAMH,EAAMC,EACxBqJ,EAAMxJ,EAAMI,EAAMH,EAAME,EAE9B,OAAON,GAAQyH,EAAMrF,EAAMsF,EAAMrF,EAAMsF,EAAMrF,GAC5CrC,GAAQuH,EAAMpF,EAAMsF,EAAM+B,EAAM9B,EAAM+B,GACtCxJ,GAAQsH,EAAMnF,EAAMoF,EAAMgC,EAAM9B,EAAMgC,GACtCtC,GAAQG,EAAMlF,EAAMmF,EAAMiC,EAAMhC,EAAMiC,EAExC,CAOA,WAAY,CAEX,IAAM7M,EAAK,KAAK,SACZj6B,EAEJ,OAAAA,EAAMi6B,EAAI,CAAE,EAAGA,EAAI,CAAE,EAAIA,EAAI,CAAE,EAAGA,EAAI,CAAE,EAAIj6B,EAC5CA,EAAMi6B,EAAI,CAAE,EAAGA,EAAI,CAAE,EAAIA,EAAI,CAAE,EAAGA,EAAI,CAAE,EAAIj6B,EAC5CA,EAAMi6B,EAAI,CAAE,EAAGA,EAAI,CAAE,EAAIA,EAAI,CAAE,EAAGA,EAAI,CAAE,EAAIj6B,EAE5CA,EAAMi6B,EAAI,CAAE,EAAGA,EAAI,CAAE,EAAIA,EAAI,EAAG,EAAGA,EAAI,EAAG,EAAIj6B,EAC9CA,EAAMi6B,EAAI,CAAE,EAAGA,EAAI,CAAE,EAAIA,EAAI,EAAG,EAAGA,EAAI,EAAG,EAAIj6B,EAC9CA,EAAMi6B,EAAI,EAAG,EAAGA,EAAI,EAAG,EAAIA,EAAI,EAAG,EAAGA,EAAI,EAAG,EAAIj6B,EAEzC,IAER,CAWA,YAAa5I,EAAGM,EAAG8X,EAAI,CAEtB,IAAMyqB,EAAK,KAAK,SAEhB,OAAK7iC,EAAE,WAEN6iC,EAAI,EAAG,EAAI7iC,EAAE,EACb6iC,EAAI,EAAG,EAAI7iC,EAAE,EACb6iC,EAAI,EAAG,EAAI7iC,EAAE,IAIb6iC,EAAI,EAAG,EAAI7iC,EACX6iC,EAAI,EAAG,EAAIviC,EACXuiC,EAAI,EAAG,EAAIzqB,GAIL,IAER,CASA,QAAS,CAGR,IAAMyqB,EAAK,KAAK,SAEfkD,EAAMlD,EAAI,CAAE,EAAGqD,EAAMrD,EAAI,CAAE,EAAGwD,EAAMxD,EAAI,CAAE,EAAG0K,EAAM1K,EAAI,CAAE,EACzDmD,EAAMnD,EAAI,CAAE,EAAGsD,EAAMtD,EAAI,CAAE,EAAGyD,EAAMzD,EAAI,CAAE,EAAG2K,EAAM3K,EAAI,CAAE,EACzDoD,EAAMpD,EAAI,CAAE,EAAGuD,EAAMvD,EAAI,CAAE,EAAG0D,EAAM1D,EAAI,EAAG,EAAG4K,EAAM5K,EAAI,EAAG,EAC3DuK,EAAMvK,EAAI,EAAG,EAAGwK,EAAMxK,EAAI,EAAG,EAAGyK,EAAMzK,EAAI,EAAG,EAAG6K,EAAM7K,EAAI,EAAG,EAE7DsF,EAAM/B,EAAMkH,EAAME,EAAMH,EAAM9G,EAAMiH,EAAMH,EAAM/G,EAAMmH,EAAMtH,EAAMmH,EAAMG,EAAMrH,EAAME,EAAMoH,EAAMvH,EAAMI,EAAMmH,EAC5GtF,EAAMgF,EAAM7G,EAAMiH,EAAMvH,EAAMqH,EAAME,EAAMJ,EAAM9G,EAAMmH,EAAMzH,EAAMsH,EAAMG,EAAMxH,EAAMK,EAAMoH,EAAM1H,EAAMO,EAAMmH,EAC5GrF,EAAMpC,EAAMoH,EAAMG,EAAMJ,EAAMhH,EAAMoH,EAAMJ,EAAMjH,EAAMsH,EAAMzH,EAAMqH,EAAMI,EAAMxH,EAAME,EAAMuH,EAAM1H,EAAMI,EAAMsH,EAC5GiC,EAAMvC,EAAMhH,EAAME,EAAML,EAAMoH,EAAM/G,EAAM8G,EAAMjH,EAAMI,EAAMP,EAAMqH,EAAM9G,EAAMN,EAAME,EAAMmH,EAAMtH,EAAMI,EAAMkH,EAEvGhF,EAAMvC,EAAMoC,EAAMjC,EAAMkC,EAAM/B,EAAMgC,EAAMkF,EAAMoC,EAEtD,GAAKrH,IAAQ,EAAI,OAAO,KAAK,IAAK,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAEjF,IAAMC,EAAS,EAAID,EAEnB,OAAAzF,EAAI,CAAE,EAAIsF,EAAMI,EAChB1F,EAAI,CAAE,GAAMwK,EAAM9G,EAAMgH,EAAMnH,EAAMkH,EAAMC,EAAMF,EAAMhH,EAAMoH,EAAMvH,EAAMoH,EAAMG,EAAMrH,EAAMC,EAAMqH,EAAMxH,EAAMK,EAAMmH,GAAQnF,EAC1H1F,EAAI,CAAE,GAAMsD,EAAMmH,EAAMC,EAAMF,EAAM/G,EAAMiH,EAAMF,EAAMhH,EAAMmH,EAAMtH,EAAMoH,EAAME,EAAMrH,EAAME,EAAMqH,EAAMxH,EAAMI,EAAMoH,GAAQnF,EAC1H1F,EAAI,CAAE,GAAMuD,EAAME,EAAMiH,EAAMpH,EAAMI,EAAMgH,EAAMnH,EAAMC,EAAMmH,EAAMtH,EAAMK,EAAMiH,EAAMrH,EAAME,EAAMoH,EAAMvH,EAAMI,EAAMmH,GAAQlF,EAE1H1F,EAAI,CAAE,EAAIuF,EAAMG,EAChB1F,EAAI,CAAE,GAAMoD,EAAMqH,EAAMC,EAAMH,EAAM7G,EAAMgH,EAAMH,EAAM/G,EAAMoH,EAAM1H,EAAMuH,EAAMG,EAAMxH,EAAMI,EAAMqH,EAAM3H,EAAMQ,EAAMmH,GAAQnF,EAC1H1F,EAAI,CAAE,GAAMuK,EAAM9G,EAAMiH,EAAMvH,EAAMsH,EAAMC,EAAMH,EAAM/G,EAAMmH,EAAMzH,EAAMuH,EAAME,EAAMxH,EAAMK,EAAMqH,EAAM3H,EAAMO,EAAMoH,GAAQnF,EAC1H1F,EAAI,CAAE,GAAMmD,EAAMO,EAAMgH,EAAMtH,EAAMK,EAAMiH,EAAMtH,EAAMI,EAAMmH,EAAMzH,EAAMQ,EAAMiH,EAAMxH,EAAMK,EAAMoH,EAAM1H,EAAMO,EAAMmH,GAAQlF,EAE1H1F,EAAI,CAAE,EAAIwF,EAAME,EAChB1F,EAAI,CAAE,GAAMuK,EAAMhH,EAAMmH,EAAMtH,EAAMoH,EAAME,EAAMH,EAAMlH,EAAMuH,EAAM1H,EAAMsH,EAAMI,EAAMxH,EAAMC,EAAMwH,EAAM3H,EAAMK,EAAMsH,GAAQnF,EAC1H1F,EAAI,EAAG,GAAMmD,EAAMqH,EAAME,EAAMH,EAAMjH,EAAMoH,EAAMH,EAAMlH,EAAMsH,EAAMzH,EAAMsH,EAAMG,EAAMxH,EAAME,EAAMwH,EAAM3H,EAAMI,EAAMuH,GAAQnF,EAC3H1F,EAAI,EAAG,GAAMoD,EAAME,EAAMoH,EAAMvH,EAAMI,EAAMmH,EAAMtH,EAAMC,EAAMsH,EAAMzH,EAAMK,EAAMoH,EAAMxH,EAAME,EAAMuH,EAAM1H,EAAMI,EAAMsH,GAAQlF,EAE3H1F,EAAI,EAAG,EAAI8M,EAAMpH,EACjB1F,EAAI,EAAG,GAAMoD,EAAMoH,EAAMhH,EAAM+G,EAAMhH,EAAMC,EAAM+G,EAAMlH,EAAMK,EAAMR,EAAMsH,EAAM9G,EAAMN,EAAMC,EAAMoH,EAAMvH,EAAMK,EAAMkH,GAAQ/E,EAC3H1F,EAAI,EAAG,GAAMuK,EAAMjH,EAAME,EAAML,EAAMqH,EAAMhH,EAAM+G,EAAMlH,EAAMI,EAAMP,EAAMsH,EAAM/G,EAAMN,EAAME,EAAMoH,EAAMvH,EAAMI,EAAMmH,GAAQ/E,EAC3H1F,EAAI,EAAG,GAAMmD,EAAMI,EAAMC,EAAMJ,EAAME,EAAME,EAAMJ,EAAMC,EAAMI,EAAMP,EAAMK,EAAME,EAAMN,EAAME,EAAMK,EAAMR,EAAMI,EAAMI,GAAQgC,EAEpH,IAER,CAQA,MAAOtH,EAAI,CAEV,IAAM4B,EAAK,KAAK,SACV7iC,EAAIihC,EAAE,EAAG3gC,EAAI2gC,EAAE,EAAG7oB,EAAI6oB,EAAE,EAE9B,OAAA4B,EAAI,CAAE,GAAK7iC,EAAG6iC,EAAI,CAAE,GAAKviC,EAAGuiC,EAAI,CAAE,GAAKzqB,EACvCyqB,EAAI,CAAE,GAAK7iC,EAAG6iC,EAAI,CAAE,GAAKviC,EAAGuiC,EAAI,CAAE,GAAKzqB,EACvCyqB,EAAI,CAAE,GAAK7iC,EAAG6iC,EAAI,CAAE,GAAKviC,EAAGuiC,EAAI,EAAG,GAAKzqB,EACxCyqB,EAAI,CAAE,GAAK7iC,EAAG6iC,EAAI,CAAE,GAAKviC,EAAGuiC,EAAI,EAAG,GAAKzqB,EAEjC,IAER,CAOA,mBAAoB,CAEnB,IAAMyqB,EAAK,KAAK,SAEV+M,EAAW/M,EAAI,CAAE,EAAIA,EAAI,CAAE,EAAIA,EAAI,CAAE,EAAIA,EAAI,CAAE,EAAIA,EAAI,CAAE,EAAIA,EAAI,CAAE,EACnEgN,EAAWhN,EAAI,CAAE,EAAIA,EAAI,CAAE,EAAIA,EAAI,CAAE,EAAIA,EAAI,CAAE,EAAIA,EAAI,CAAE,EAAIA,EAAI,CAAE,EACnEiN,EAAWjN,EAAI,CAAE,EAAIA,EAAI,CAAE,EAAIA,EAAI,CAAE,EAAIA,EAAI,CAAE,EAAIA,EAAI,EAAG,EAAIA,EAAI,EAAG,EAE3E,OAAO,KAAK,KAAM,KAAK,IAAK+M,EAAUC,EAAUC,CAAS,CAAE,CAE5D,CAUA,gBAAiB9vC,EAAGM,EAAG8X,EAAI,CAE1B,OAAKpY,EAAE,UAEN,KAAK,IAEJ,EAAG,EAAG,EAAGA,EAAE,EACX,EAAG,EAAG,EAAGA,EAAE,EACX,EAAG,EAAG,EAAGA,EAAE,EACX,EAAG,EAAG,EAAG,CAEV,EAIA,KAAK,IAEJ,EAAG,EAAG,EAAGA,EACT,EAAG,EAAG,EAAGM,EACT,EAAG,EAAG,EAAG8X,EACT,EAAG,EAAG,EAAG,CAEV,EAIM,IAER,CASA,cAAeipB,EAAQ,CAEtB,IAAM/+B,EAAI,KAAK,IAAK++B,CAAM,EAAG//B,EAAI,KAAK,IAAK+/B,CAAM,EAEjD,YAAK,IAEJ,EAAG,EAAG,EAAG,EACT,EAAG/+B,EAAG,CAAEhB,EAAG,EACX,EAAGA,EAAGgB,EAAG,EACT,EAAG,EAAG,EAAG,CAEV,EAEO,IAER,CASA,cAAe++B,EAAQ,CAEtB,IAAM/+B,EAAI,KAAK,IAAK++B,CAAM,EAAG//B,EAAI,KAAK,IAAK+/B,CAAM,EAEjD,YAAK,IAEH/+B,EAAG,EAAGhB,EAAG,EACT,EAAG,EAAG,EAAG,EACV,CAAEA,EAAG,EAAGgB,EAAG,EACV,EAAG,EAAG,EAAG,CAEX,EAEO,IAER,CASA,cAAe++B,EAAQ,CAEtB,IAAM/+B,EAAI,KAAK,IAAK++B,CAAM,EAAG//B,EAAI,KAAK,IAAK+/B,CAAM,EAEjD,YAAK,IAEJ/+B,EAAG,CAAEhB,EAAG,EAAG,EACXA,EAAGgB,EAAG,EAAG,EACT,EAAG,EAAG,EAAG,EACT,EAAG,EAAG,EAAG,CAEV,EAEO,IAER,CAaA,iBAAkBqgC,EAAMhB,EAAQ,CAI/B,IAAMr/B,EAAI,KAAK,IAAKq/B,CAAM,EACpBrgC,EAAI,KAAK,IAAKqgC,CAAM,EACpBngC,EAAI,EAAIc,EACRtC,EAAI2iC,EAAK,EAAGriC,EAAIqiC,EAAK,EAAGvqB,EAAIuqB,EAAK,EACjCsC,EAAKzjC,EAAIxB,EAAGklC,EAAK1jC,EAAIlB,EAE3B,YAAK,IAEJ2kC,EAAKjlC,EAAIsC,EAAG2iC,EAAK3kC,EAAIgB,EAAI8W,EAAG6sB,EAAK7sB,EAAI9W,EAAIhB,EAAG,EAC5C2kC,EAAK3kC,EAAIgB,EAAI8W,EAAG8sB,EAAK5kC,EAAIgC,EAAG4iC,EAAK9sB,EAAI9W,EAAItB,EAAG,EAC5CilC,EAAK7sB,EAAI9W,EAAIhB,EAAG4kC,EAAK9sB,EAAI9W,EAAItB,EAAGwB,EAAI4W,EAAIA,EAAI9V,EAAG,EAC/C,EAAG,EAAG,EAAG,CAEV,EAEO,IAER,CAUA,UAAWtC,EAAGM,EAAG8X,EAAI,CAEpB,YAAK,IAEJpY,EAAG,EAAG,EAAG,EACT,EAAGM,EAAG,EAAG,EACT,EAAG,EAAG8X,EAAG,EACT,EAAG,EAAG,EAAG,CAEV,EAEO,IAER,CAaA,UAAW4xB,EAAIC,EAAI8F,EAAI7F,EAAI8F,EAAIC,EAAK,CAEnC,YAAK,IAEJ,EAAGF,EAAIC,EAAI,EACXhG,EAAI,EAAGiG,EAAI,EACXhG,EAAIC,EAAI,EAAG,EACX,EAAG,EAAG,EAAG,CAEV,EAEO,IAER,CAWA,QAAS5xB,EAAUgqB,EAAYj5B,EAAQ,CAEtC,IAAMw5B,EAAK,KAAK,SAEV7iC,EAAIsiC,EAAW,GAAIhiC,EAAIgiC,EAAW,GAAIlqB,EAAIkqB,EAAW,GAAIV,EAAIU,EAAW,GACxE52B,EAAK1L,EAAIA,EAAGkwC,EAAK5vC,EAAIA,EAAG6vC,EAAK/3B,EAAIA,EACjCyxB,EAAK7pC,EAAI0L,EAAIs+B,EAAKhqC,EAAIkwC,EAAIjG,EAAKjqC,EAAImwC,EACnCrG,EAAKxpC,EAAI4vC,EAAIhG,EAAK5pC,EAAI6vC,EAAIpG,EAAK3xB,EAAI+3B,EACnCC,EAAKxO,EAAIl2B,EAAI2kC,EAAKzO,EAAIsO,EAAII,EAAK1O,EAAIuO,EAEnCxK,EAAKt8B,EAAM,EAAGu8B,EAAKv8B,EAAM,EAAGw8B,EAAKx8B,EAAM,EAE7C,OAAAw5B,EAAI,CAAE,GAAM,GAAMiH,EAAKC,IAASpE,EAChC9C,EAAI,CAAE,GAAMmH,EAAKsG,GAAO3K,EACxB9C,EAAI,CAAE,GAAMoH,EAAKoG,GAAO1K,EACxB9C,EAAI,CAAE,EAAI,EAEVA,EAAI,CAAE,GAAMmH,EAAKsG,GAAO1K,EACxB/C,EAAI,CAAE,GAAM,GAAMgH,EAAKE,IAASnE,EAChC/C,EAAI,CAAE,GAAMqH,EAAKkG,GAAOxK,EACxB/C,EAAI,CAAE,EAAI,EAEVA,EAAI,CAAE,GAAMoH,EAAKoG,GAAOxK,EACxBhD,EAAI,CAAE,GAAMqH,EAAKkG,GAAOvK,EACxBhD,EAAI,EAAG,GAAM,GAAMgH,EAAKC,IAASjE,EACjChD,EAAI,EAAG,EAAI,EAEXA,EAAI,EAAG,EAAIvqB,EAAS,EACpBuqB,EAAI,EAAG,EAAIvqB,EAAS,EACpBuqB,EAAI,EAAG,EAAIvqB,EAAS,EACpBuqB,EAAI,EAAG,EAAI,EAEJ,IAER,CAeA,UAAWvqB,EAAUgqB,EAAYj5B,EAAQ,CAExC,IAAMw5B,EAAK,KAAK,SAMhB,GAJAvqB,EAAS,EAAIuqB,EAAI,EAAG,EACpBvqB,EAAS,EAAIuqB,EAAI,EAAG,EACpBvqB,EAAS,EAAIuqB,EAAI,EAAG,EAEf,KAAK,YAAY,IAAM,EAE3B,OAAAx5B,EAAM,IAAK,EAAG,EAAG,CAAE,EACnBi5B,EAAW,SAAS,EAEb,KAIR,IAAIqD,EAAKnd,GAAM,IAAKqa,EAAI,CAAE,EAAGA,EAAI,CAAE,EAAGA,EAAI,CAAE,CAAE,EAAE,OAAO,EACjD+C,EAAKpd,GAAM,IAAKqa,EAAI,CAAE,EAAGA,EAAI,CAAE,EAAGA,EAAI,CAAE,CAAE,EAAE,OAAO,EACnDgD,EAAKrd,GAAM,IAAKqa,EAAI,CAAE,EAAGA,EAAI,CAAE,EAAGA,EAAI,EAAG,CAAE,EAAE,OAAO,EAG9C,KAAK,YAAY,EAClB,IAAI8C,EAAK,CAAEA,GAGtBld,GAAM,KAAM,IAAK,EAEjB,IAAM8nB,EAAQ,EAAI5K,EACZ6K,EAAQ,EAAI5K,EACZ6K,EAAQ,EAAI5K,EAElB,OAAApd,GAAM,SAAU,CAAE,GAAK8nB,EACvB9nB,GAAM,SAAU,CAAE,GAAK8nB,EACvB9nB,GAAM,SAAU,CAAE,GAAK8nB,EAEvB9nB,GAAM,SAAU,CAAE,GAAK+nB,EACvB/nB,GAAM,SAAU,CAAE,GAAK+nB,EACvB/nB,GAAM,SAAU,CAAE,GAAK+nB,EAEvB/nB,GAAM,SAAU,CAAE,GAAKgoB,EACvBhoB,GAAM,SAAU,CAAE,GAAKgoB,EACvBhoB,GAAM,SAAU,EAAG,GAAKgoB,EAExBnO,EAAW,sBAAuB7Z,EAAM,EAExCpf,EAAM,EAAIs8B,EACVt8B,EAAM,EAAIu8B,EACVv8B,EAAM,EAAIw8B,EAEH,IAER,CAgBA,gBAAiB6K,EAAMC,EAAOC,EAAKC,EAAQC,EAAMC,EAAKC,EAAmB1rB,GAAuB2rB,EAAgB,GAAQ,CAEvH,IAAMpO,EAAK,KAAK,SAEV7iC,EAAI,EAAI8wC,GAASH,EAAQD,GACzBpwC,EAAI,EAAIwwC,GAASF,EAAMC,GAEvBzuC,GAAMuuC,EAAQD,IAAWC,EAAQD,GACjCruC,GAAMuuC,EAAMC,IAAaD,EAAMC,GAEjCvuC,EAAG0lC,EAEP,GAAKiJ,EAEJ3uC,EAAIwuC,GAASC,EAAMD,GACnB9I,EAAM+I,EAAMD,GAAWC,EAAMD,WAIxBE,IAAqB1rB,GAEzBhjB,EAAI,EAAIyuC,EAAMD,IAAWC,EAAMD,GAC/B9I,EAAM,GAAK+I,EAAMD,GAAWC,EAAMD,WAEvBE,IAAqBzrB,GAEhCjjB,EAAI,CAAEyuC,GAAQA,EAAMD,GACpB9I,EAAM,CAAE+I,EAAMD,GAAWC,EAAMD,OAI/B,OAAM,IAAI,MAAO,+DAAiEE,CAAiB,EAMrG,OAAAnO,EAAI,CAAE,EAAI7iC,EAAG6iC,EAAI,CAAE,EAAI,EAAGA,EAAI,CAAE,EAAIzgC,EAAIygC,EAAI,EAAG,EAAI,EACnDA,EAAI,CAAE,EAAI,EAAGA,EAAI,CAAE,EAAIviC,EAAGuiC,EAAI,CAAE,EAAIxgC,EAAIwgC,EAAI,EAAG,EAAI,EACnDA,EAAI,CAAE,EAAI,EAAGA,EAAI,CAAE,EAAI,EAAGA,EAAI,EAAG,EAAIvgC,EAAIugC,EAAI,EAAG,EAAImF,EACpDnF,EAAI,CAAE,EAAI,EAAGA,EAAI,CAAE,EAAI,EAAGA,EAAI,EAAG,EAAI,GAAIA,EAAI,EAAG,EAAI,EAE7C,IAER,CAgBA,iBAAkB6N,EAAMC,EAAOC,EAAKC,EAAQC,EAAMC,EAAKC,EAAmB1rB,GAAuB2rB,EAAgB,GAAQ,CAExH,IAAMpO,EAAK,KAAK,SAEV7iC,EAAI,GAAM2wC,EAAQD,GAClBpwC,EAAI,GAAMswC,EAAMC,GAEhBzuC,EAAI,EAAIuuC,EAAQD,IAAWC,EAAQD,GACnCruC,EAAI,EAAIuuC,EAAMC,IAAaD,EAAMC,GAEnCvuC,EAAG0lC,EAEP,GAAKiJ,EAEJ3uC,EAAI,GAAMyuC,EAAMD,GAChB9I,EAAI+I,GAAQA,EAAMD,WAIbE,IAAqB1rB,GAEzBhjB,EAAI,IAAOyuC,EAAMD,GACjB9I,EAAI,EAAI+I,EAAMD,IAAWC,EAAMD,WAEpBE,IAAqBzrB,GAEhCjjB,EAAI,IAAOyuC,EAAMD,GACjB9I,EAAI,CAAE8I,GAASC,EAAMD,OAIrB,OAAM,IAAI,MAAO,gEAAkEE,CAAiB,EAMtG,OAAAnO,EAAI,CAAE,EAAI7iC,EAAI6iC,EAAI,CAAE,EAAI,EAAIA,EAAI,CAAE,EAAI,EAAKA,EAAI,EAAG,EAAIzgC,EACtDygC,EAAI,CAAE,EAAI,EAAKA,EAAI,CAAE,EAAIviC,EAAIuiC,EAAI,CAAE,EAAI,EAAKA,EAAI,EAAG,EAAIxgC,EACvDwgC,EAAI,CAAE,EAAI,EAAKA,EAAI,CAAE,EAAI,EAAIA,EAAI,EAAG,EAAIvgC,EAAIugC,EAAI,EAAG,EAAImF,EACvDnF,EAAI,CAAE,EAAI,EAAKA,EAAI,CAAE,EAAI,EAAIA,EAAI,EAAG,EAAI,EAAIA,EAAI,EAAG,EAAI,EAEhD,IAER,CAQA,OAAQ6F,EAAS,CAEhB,IAAM7F,EAAK,KAAK,SACV2D,EAAKkC,EAAO,SAElB,QAAUprC,EAAI,EAAGA,EAAI,GAAIA,IAExB,GAAKulC,EAAIvlC,CAAE,IAAMkpC,EAAIlpC,CAAE,EAAI,MAAO,GAInC,MAAO,EAER,CASA,UAAWD,EAAOokC,EAAS,EAAI,CAE9B,QAAUnkC,EAAI,EAAGA,EAAI,GAAIA,IAExB,KAAK,SAAUA,CAAE,EAAID,EAAOC,EAAImkC,CAAO,EAIxC,OAAO,IAER,CAUA,QAASpkC,EAAQ,CAAC,EAAGokC,EAAS,EAAI,CAEjC,IAAMoB,EAAK,KAAK,SAEhB,OAAAxlC,EAAOokC,CAAO,EAAIoB,EAAI,CAAE,EACxBxlC,EAAOokC,EAAS,CAAE,EAAIoB,EAAI,CAAE,EAC5BxlC,EAAOokC,EAAS,CAAE,EAAIoB,EAAI,CAAE,EAC5BxlC,EAAOokC,EAAS,CAAE,EAAIoB,EAAI,CAAE,EAE5BxlC,EAAOokC,EAAS,CAAE,EAAIoB,EAAI,CAAE,EAC5BxlC,EAAOokC,EAAS,CAAE,EAAIoB,EAAI,CAAE,EAC5BxlC,EAAOokC,EAAS,CAAE,EAAIoB,EAAI,CAAE,EAC5BxlC,EAAOokC,EAAS,CAAE,EAAIoB,EAAI,CAAE,EAE5BxlC,EAAOokC,EAAS,CAAE,EAAIoB,EAAI,CAAE,EAC5BxlC,EAAOokC,EAAS,CAAE,EAAIoB,EAAI,CAAE,EAC5BxlC,EAAOokC,EAAS,EAAG,EAAIoB,EAAI,EAAG,EAC9BxlC,EAAOokC,EAAS,EAAG,EAAIoB,EAAI,EAAG,EAE9BxlC,EAAOokC,EAAS,EAAG,EAAIoB,EAAI,EAAG,EAC9BxlC,EAAOokC,EAAS,EAAG,EAAIoB,EAAI,EAAG,EAC9BxlC,EAAOokC,EAAS,EAAG,EAAIoB,EAAI,EAAG,EAC9BxlC,EAAOokC,EAAS,EAAG,EAAIoB,EAAI,EAAG,EAEvBxlC,CAER,CAED,EAEMmrB,GAAsB,IAAIxgB,EAC1BygB,GAAsB,IAAIF,GAC1BG,IAAsB,IAAI1gB,EAAS,EAAG,EAAG,CAAE,EAC3C2gB,IAAqB,IAAI3gB,EAAS,EAAG,EAAG,CAAE,EAC1C4gB,GAAmB,IAAI5gB,EACvB6gB,GAAmB,IAAI7gB,EACvB8gB,GAAmB,IAAI9gB,EAEvB+gB,GAA0B,IAAIR,GAC9BS,GAA8B,IAAIvS,GAkBlCwS,GAAN,MAAMioB,CAAM,CAUX,YAAalxC,EAAI,EAAGM,EAAI,EAAG8X,EAAI,EAAG7V,EAAQ2uC,EAAM,cAAgB,CAS/D,KAAK,QAAU,GAEf,KAAK,GAAKlxC,EACV,KAAK,GAAKM,EACV,KAAK,GAAK8X,EACV,KAAK,OAAS7V,CAEf,CAQA,IAAI,GAAI,CAEP,OAAO,KAAK,EAEb,CAEA,IAAI,EAAG9C,EAAQ,CAEd,KAAK,GAAKA,EACV,KAAK,kBAAkB,CAExB,CAQA,IAAI,GAAI,CAEP,OAAO,KAAK,EAEb,CAEA,IAAI,EAAGA,EAAQ,CAEd,KAAK,GAAKA,EACV,KAAK,kBAAkB,CAExB,CAQA,IAAI,GAAI,CAEP,OAAO,KAAK,EAEb,CAEA,IAAI,EAAGA,EAAQ,CAEd,KAAK,GAAKA,EACV,KAAK,kBAAkB,CAExB,CAQA,IAAI,OAAQ,CAEX,OAAO,KAAK,MAEb,CAEA,IAAI,MAAOA,EAAQ,CAElB,KAAK,OAASA,EACd,KAAK,kBAAkB,CAExB,CAWA,IAAKO,EAAGM,EAAG8X,EAAG7V,EAAQ,KAAK,OAAS,CAEnC,YAAK,GAAKvC,EACV,KAAK,GAAKM,EACV,KAAK,GAAK8X,EACV,KAAK,OAAS7V,EAEd,KAAK,kBAAkB,EAEhB,IAER,CAOA,OAAQ,CAEP,OAAO,IAAI,KAAK,YAAa,KAAK,GAAI,KAAK,GAAI,KAAK,GAAI,KAAK,MAAO,CAErE,CAQA,KAAMggC,EAAQ,CAEb,YAAK,GAAKA,EAAM,GAChB,KAAK,GAAKA,EAAM,GAChB,KAAK,GAAKA,EAAM,GAChB,KAAK,OAASA,EAAM,OAEpB,KAAK,kBAAkB,EAEhB,IAER,CAUA,sBAAuBziC,EAAGyC,EAAQ,KAAK,OAAQigC,EAAS,GAAO,CAE9D,IAAMK,EAAK/iC,EAAE,SACPgjC,EAAMD,EAAI,CAAE,EAAGE,EAAMF,EAAI,CAAE,EAAGG,EAAMH,EAAI,CAAE,EAC1CI,EAAMJ,EAAI,CAAE,EAAGK,EAAML,EAAI,CAAE,EAAGM,EAAMN,EAAI,CAAE,EAC1CO,EAAMP,EAAI,CAAE,EAAGQ,EAAMR,EAAI,CAAE,EAAGS,EAAMT,EAAI,EAAG,EAEjD,OAAStgC,EAAQ,CAEhB,IAAK,MAEJ,KAAK,GAAK,KAAK,KAAM/C,GAAOwjC,EAAK,GAAI,CAAE,CAAE,EAEpC,KAAK,IAAKA,CAAI,EAAI,UAEtB,KAAK,GAAK,KAAK,MAAO,CAAEG,EAAKG,CAAI,EACjC,KAAK,GAAK,KAAK,MAAO,CAAEP,EAAKD,CAAI,IAIjC,KAAK,GAAK,KAAK,MAAOO,EAAKH,CAAI,EAC/B,KAAK,GAAK,GAIX,MAED,IAAK,MAEJ,KAAK,GAAK,KAAK,KAAM,CAAE1jC,GAAO2jC,EAAK,GAAI,CAAE,CAAE,EAEtC,KAAK,IAAKA,CAAI,EAAI,UAEtB,KAAK,GAAK,KAAK,MAAOH,EAAKM,CAAI,EAC/B,KAAK,GAAK,KAAK,MAAOL,EAAKC,CAAI,IAI/B,KAAK,GAAK,KAAK,MAAO,CAAEE,EAAKN,CAAI,EACjC,KAAK,GAAK,GAIX,MAED,IAAK,MAEJ,KAAK,GAAK,KAAK,KAAMtjC,GAAO6jC,EAAK,GAAI,CAAE,CAAE,EAEpC,KAAK,IAAKA,CAAI,EAAI,UAEtB,KAAK,GAAK,KAAK,MAAO,CAAED,EAAKE,CAAI,EACjC,KAAK,GAAK,KAAK,MAAO,CAAEP,EAAKG,CAAI,IAIjC,KAAK,GAAK,EACV,KAAK,GAAK,KAAK,MAAOD,EAAKH,CAAI,GAIhC,MAED,IAAK,MAEJ,KAAK,GAAK,KAAK,KAAM,CAAEtjC,GAAO4jC,EAAK,GAAI,CAAE,CAAE,EAEtC,KAAK,IAAKA,CAAI,EAAI,UAEtB,KAAK,GAAK,KAAK,MAAOC,EAAKC,CAAI,EAC/B,KAAK,GAAK,KAAK,MAAOL,EAAKH,CAAI,IAI/B,KAAK,GAAK,EACV,KAAK,GAAK,KAAK,MAAO,CAAEC,EAAKG,CAAI,GAIlC,MAED,IAAK,MAEJ,KAAK,GAAK,KAAK,KAAM1jC,GAAOyjC,EAAK,GAAI,CAAE,CAAE,EAEpC,KAAK,IAAKA,CAAI,EAAI,UAEtB,KAAK,GAAK,KAAK,MAAO,CAAEE,EAAKD,CAAI,EACjC,KAAK,GAAK,KAAK,MAAO,CAAEE,EAAKN,CAAI,IAIjC,KAAK,GAAK,EACV,KAAK,GAAK,KAAK,MAAOE,EAAKM,CAAI,GAIhC,MAED,IAAK,MAEJ,KAAK,GAAK,KAAK,KAAM,CAAE9jC,GAAOujC,EAAK,GAAI,CAAE,CAAE,EAEtC,KAAK,IAAKA,CAAI,EAAI,UAEtB,KAAK,GAAK,KAAK,MAAOM,EAAKH,CAAI,EAC/B,KAAK,GAAK,KAAK,MAAOF,EAAKF,CAAI,IAI/B,KAAK,GAAK,KAAK,MAAO,CAAEK,EAAKG,CAAI,EACjC,KAAK,GAAK,GAIX,MAED,QAEC/kC,GAAM,iEAAmEgE,CAAM,CAEjF,CAEA,YAAK,OAASA,EAETigC,IAAW,IAAO,KAAK,kBAAkB,EAEvC,IAER,CAUA,kBAAmBrgC,EAAGI,EAAOigC,EAAS,CAErC,OAAAzZ,GAAU,2BAA4B5mB,CAAE,EAEjC,KAAK,sBAAuB4mB,GAAWxmB,EAAOigC,CAAO,CAE7D,CASA,eAAgBvB,EAAG1+B,EAAQ,KAAK,OAAS,CAExC,OAAO,KAAK,IAAK0+B,EAAE,EAAGA,EAAE,EAAGA,EAAE,EAAG1+B,CAAM,CAEvC,CAYA,QAAS4uC,EAAW,CAEnB,OAAAnoB,GAAc,aAAc,IAAK,EAE1B,KAAK,kBAAmBA,GAAemoB,CAAS,CAExD,CAQA,OAAQ5O,EAAQ,CAEf,OAASA,EAAM,KAAO,KAAK,IAAUA,EAAM,KAAO,KAAK,IAAUA,EAAM,KAAO,KAAK,IAAUA,EAAM,SAAW,KAAK,MAEpH,CAUA,UAAWllC,EAAQ,CAElB,YAAK,GAAKA,EAAO,CAAE,EACnB,KAAK,GAAKA,EAAO,CAAE,EACnB,KAAK,GAAKA,EAAO,CAAE,EACdA,EAAO,CAAE,IAAM,SAAY,KAAK,OAASA,EAAO,CAAE,GAEvD,KAAK,kBAAkB,EAEhB,IAER,CAUA,QAASA,EAAQ,CAAC,EAAGokC,EAAS,EAAI,CAEjC,OAAApkC,EAAOokC,CAAO,EAAI,KAAK,GACvBpkC,EAAOokC,EAAS,CAAE,EAAI,KAAK,GAC3BpkC,EAAOokC,EAAS,CAAE,EAAI,KAAK,GAC3BpkC,EAAOokC,EAAS,CAAE,EAAI,KAAK,OAEpBpkC,CAER,CAEA,UAAWonC,EAAW,CAErB,YAAK,kBAAoBA,EAElB,IAER,CAEA,mBAAoB,CAAC,CAErB,EAAG,OAAO,QAAS,GAAI,CAEtB,MAAM,KAAK,GACX,MAAM,KAAK,GACX,MAAM,KAAK,GACX,MAAM,KAAK,MAEZ,CAED,EASAxb,GAAM,cAAgB,MAchBC,GAAN,KAAa,CAMZ,aAAc,CAQb,KAAK,KAAO,CAEb,CAOA,IAAKkoB,EAAQ,CAEZ,KAAK,MAAS,GAAKA,EAAQ,KAAQ,CAEpC,CAOA,OAAQA,EAAQ,CAEf,KAAK,MAAQ,GAAKA,EAAQ,CAE3B,CAKA,WAAY,CAEX,KAAK,KAAO,EAEb,CAOA,OAAQA,EAAQ,CAEf,KAAK,MAAQ,GAAKA,EAAQ,CAE3B,CAOA,QAASA,EAAQ,CAEhB,KAAK,MAAQ,EAAI,GAAKA,EAAQ,EAE/B,CAKA,YAAa,CAEZ,KAAK,KAAO,CAEb,CASA,KAAMC,EAAS,CAEd,OAAS,KAAK,KAAOA,EAAO,QAAW,CAExC,CAQA,UAAWD,EAAQ,CAElB,OAAS,KAAK,MAAS,GAAKA,EAAQ,MAAU,CAE/C,CAED,EAEIjoB,IAAc,EAEZC,GAAsB,IAAIphB,EAC1BqhB,GAAoB,IAAI5S,GACxB6S,GAAsB,IAAIf,GAC1BgB,GAAwB,IAAIvhB,EAE5BwhB,GAA4B,IAAIxhB,EAChCyhB,IAAyB,IAAIzhB,EAC7B0hB,IAA8B,IAAIjT,GAElCkT,GAAuB,IAAI3hB,EAAS,EAAG,EAAG,CAAE,EAC5C4hB,GAAuB,IAAI5hB,EAAS,EAAG,EAAG,CAAE,EAC5C6hB,GAAuB,IAAI7hB,EAAS,EAAG,EAAG,CAAE,EAQ5C8hB,GAAc,CAAE,KAAM,OAAQ,EAQ9BC,IAAgB,CAAE,KAAM,SAAU,EAQlCC,GAAmB,CAAE,KAAM,aAAc,MAAO,IAAK,EAQrDC,GAAqB,CAAE,KAAM,eAAgB,MAAO,IAAK,EAQzDC,GAAN,MAAMonB,UAAiB3rB,EAAgB,CAKtC,aAAc,CAEb,MAAM,EASN,KAAK,WAAa,GASlB,OAAO,eAAgB,KAAM,KAAM,CAAE,MAAOwD,KAAe,CAAE,EAQ7D,KAAK,KAAOjqB,GAAa,EAOzB,KAAK,KAAO,GASZ,KAAK,KAAO,WAQZ,KAAK,OAAS,KAOd,KAAK,SAAW,CAAC,EAUjB,KAAK,GAAKoyC,EAAS,WAAW,MAAM,EAEpC,IAAMh5B,EAAW,IAAItQ,EACfygC,EAAW,IAAIxf,GACfqZ,EAAa,IAAI7rB,GACjBpN,EAAQ,IAAIrB,EAAS,EAAG,EAAG,CAAE,EAEnC,SAASupC,GAAmB,CAE3BjP,EAAW,aAAcmG,EAAU,EAAM,CAE1C,CAEA,SAAS+I,GAAqB,CAE7B/I,EAAS,kBAAmBnG,EAAY,OAAW,EAAM,CAE1D,CAEAmG,EAAS,UAAW8I,CAAiB,EACrCjP,EAAW,UAAWkP,CAAmB,EAEzC,OAAO,iBAAkB,KAAM,CAQ9B,SAAU,CACT,aAAc,GACd,WAAY,GACZ,MAAOl5B,CACR,EAQA,SAAU,CACT,aAAc,GACd,WAAY,GACZ,MAAOmwB,CACR,EAOA,WAAY,CACX,aAAc,GACd,WAAY,GACZ,MAAOnG,CACR,EAQA,MAAO,CACN,aAAc,GACd,WAAY,GACZ,MAAOj5B,CACR,EAOA,gBAAiB,CAChB,MAAO,IAAIkf,EACZ,EAOA,aAAc,CACb,MAAO,IAAIxC,EACZ,CACD,CAAE,EAOF,KAAK,OAAS,IAAIwC,GAQlB,KAAK,YAAc,IAAIA,GAWvB,KAAK,iBAAmB+oB,EAAS,2BAWjC,KAAK,sBAAwBA,EAAS,iCAStC,KAAK,uBAAyB,GAS9B,KAAK,OAAS,IAAIpoB,GAQlB,KAAK,QAAU,GAQf,KAAK,WAAa,GAQlB,KAAK,cAAgB,GAQrB,KAAK,cAAgB,GAYrB,KAAK,YAAc,EAOnB,KAAK,WAAa,CAAC,EAanB,KAAK,oBAAsB,OAU3B,KAAK,uBAAyB,OAQ9B,KAAK,SAAW,CAAC,CAElB,CAaA,gBAA+F,CAAC,CAahG,eAA8F,CAAC,CAY/F,gBAA2E,CAAC,CAY5E,eAA0E,CAAC,CAQ3E,aAAcwf,EAAS,CAEjB,KAAK,kBAAmB,KAAK,aAAa,EAE/C,KAAK,OAAO,YAAaA,CAAO,EAEhC,KAAK,OAAO,UAAW,KAAK,SAAU,KAAK,WAAY,KAAK,KAAM,CAEnE,CAQA,gBAAiBvmC,EAAI,CAEpB,YAAK,WAAW,YAAaA,CAAE,EAExB,IAER,CAQA,yBAA0BwgC,EAAMhB,EAAQ,CAIvC,KAAK,WAAW,iBAAkBgB,EAAMhB,CAAM,CAE/C,CAOA,qBAAsBY,EAAQ,CAE7B,KAAK,WAAW,aAAcA,EAAO,EAAK,CAE3C,CAQA,sBAAuBziC,EAAI,CAI1B,KAAK,WAAW,sBAAuBA,CAAE,CAE1C,CAOA,0BAA2BqC,EAAI,CAI9B,KAAK,WAAW,KAAMA,CAAE,CAEzB,CASA,aAAcwgC,EAAMhB,EAAQ,CAK3B,OAAAtY,GAAI,iBAAkBsZ,EAAMhB,CAAM,EAElC,KAAK,WAAW,SAAUtY,EAAI,EAEvB,IAER,CASA,kBAAmBsZ,EAAMhB,EAAQ,CAMhC,OAAAtY,GAAI,iBAAkBsZ,EAAMhB,CAAM,EAElC,KAAK,WAAW,YAAatY,EAAI,EAE1B,IAER,CAQA,QAASsY,EAAQ,CAEhB,OAAO,KAAK,aAAchY,GAAQgY,CAAM,CAEzC,CAQA,QAASA,EAAQ,CAEhB,OAAO,KAAK,aAAc/X,GAAQ+X,CAAM,CAEzC,CAQA,QAASA,EAAQ,CAEhB,OAAO,KAAK,aAAc9X,GAAQ8X,CAAM,CAEzC,CASA,gBAAiBgB,EAAMt7B,EAAW,CAKjC,OAAA+hB,GAAM,KAAMuZ,CAAK,EAAE,gBAAiB,KAAK,UAAW,EAEpD,KAAK,SAAS,IAAKvZ,GAAM,eAAgB/hB,CAAS,CAAE,EAE7C,IAER,CAQA,WAAYA,EAAW,CAEtB,OAAO,KAAK,gBAAiBsiB,GAAQtiB,CAAS,CAE/C,CAQA,WAAYA,EAAW,CAEtB,OAAO,KAAK,gBAAiBuiB,GAAQviB,CAAS,CAE/C,CAQA,WAAYA,EAAW,CAEtB,OAAO,KAAK,gBAAiBwiB,GAAQxiB,CAAS,CAE/C,CAQA,aAAcsjC,EAAS,CAEtB,YAAK,kBAAmB,GAAM,EAAM,EAE7BA,EAAO,aAAc,KAAK,WAAY,CAE9C,CAQA,aAAcA,EAAS,CAEtB,YAAK,kBAAmB,GAAM,EAAM,EAE7BA,EAAO,aAAcrhB,GAAM,KAAM,KAAK,WAAY,EAAE,OAAO,CAAE,CAErE,CAWA,OAAQtpB,EAAGM,EAAG8X,EAAI,CAIZpY,EAAE,UAENupB,GAAQ,KAAMvpB,CAAE,EAIhBupB,GAAQ,IAAKvpB,EAAGM,EAAG8X,CAAE,EAItB,IAAMq5B,EAAS,KAAK,OAEpB,KAAK,kBAAmB,GAAM,EAAM,EAEpCjoB,GAAY,sBAAuB,KAAK,WAAY,EAE/C,KAAK,UAAY,KAAK,QAE1BF,GAAM,OAAQE,GAAaD,GAAS,KAAK,EAAG,EAI5CD,GAAM,OAAQC,GAASC,GAAa,KAAK,EAAG,EAI7C,KAAK,WAAW,sBAAuBF,EAAM,EAExCmoB,IAEJnoB,GAAM,gBAAiBmoB,EAAO,WAAY,EAC1CpoB,GAAI,sBAAuBC,EAAM,EACjC,KAAK,WAAW,YAAaD,GAAI,OAAO,CAAE,EAI5C,CAYA,IAAK5iB,EAAS,CAEb,GAAK,UAAU,OAAS,EAAI,CAE3B,QAAUnJ,EAAI,EAAGA,EAAI,UAAU,OAAQA,IAEtC,KAAK,IAAK,UAAWA,CAAE,CAAE,EAI1B,OAAO,IAER,CAEA,OAAKmJ,IAAW,MAEfjI,GAAO,4DAA8DiI,CAAO,EACrE,OAIHA,GAAUA,EAAO,YAErBA,EAAO,iBAAiB,EACxBA,EAAO,OAAS,KAChB,KAAK,SAAS,KAAMA,CAAO,EAE3BA,EAAO,cAAeqjB,EAAY,EAElCE,GAAiB,MAAQvjB,EACzB,KAAK,cAAeujB,EAAiB,EACrCA,GAAiB,MAAQ,MAIzBxrB,GAAO,0DAA2DiI,CAAO,EAInE,KAER,CAWA,OAAQA,EAAS,CAEhB,GAAK,UAAU,OAAS,EAAI,CAE3B,QAAUnJ,EAAI,EAAGA,EAAI,UAAU,OAAQA,IAEtC,KAAK,OAAQ,UAAWA,CAAE,CAAE,EAI7B,OAAO,IAER,CAEA,IAAMoN,EAAQ,KAAK,SAAS,QAASjE,CAAO,EAE5C,OAAKiE,IAAU,KAEdjE,EAAO,OAAS,KAChB,KAAK,SAAS,OAAQiE,EAAO,CAAE,EAE/BjE,EAAO,cAAesjB,GAAc,EAEpCE,GAAmB,MAAQxjB,EAC3B,KAAK,cAAewjB,EAAmB,EACvCA,GAAmB,MAAQ,MAIrB,IAER,CASA,kBAAmB,CAElB,IAAMwnB,EAAS,KAAK,OAEpB,OAAKA,IAAW,MAEfA,EAAO,OAAQ,IAAK,EAId,IAER,CASA,OAAQ,CAEP,OAAO,KAAK,OAAQ,GAAI,KAAK,QAAS,CAEvC,CAWA,OAAQhrC,EAAS,CAMhB,YAAK,kBAAmB,GAAM,EAAM,EAEpC6iB,GAAM,KAAM,KAAK,WAAY,EAAE,OAAO,EAEjC7iB,EAAO,SAAW,OAEtBA,EAAO,OAAO,kBAAmB,GAAM,EAAM,EAE7C6iB,GAAM,SAAU7iB,EAAO,OAAO,WAAY,GAI3CA,EAAO,aAAc6iB,EAAM,EAE3B7iB,EAAO,iBAAiB,EACxBA,EAAO,OAAS,KAChB,KAAK,SAAS,KAAMA,CAAO,EAE3BA,EAAO,kBAAmB,GAAO,EAAK,EAEtCA,EAAO,cAAeqjB,EAAY,EAElCE,GAAiB,MAAQvjB,EACzB,KAAK,cAAeujB,EAAiB,EACrCA,GAAiB,MAAQ,KAElB,IAER,CASA,cAAe0nB,EAAK,CAEnB,OAAO,KAAK,oBAAqB,KAAMA,CAAG,CAE3C,CASA,gBAAiB7zC,EAAO,CAEvB,OAAO,KAAK,oBAAqB,OAAQA,CAAK,CAE/C,CAUA,oBAAqBA,EAAM4B,EAAQ,CAElC,GAAK,KAAM5B,CAAK,IAAM4B,EAAQ,OAAO,KAErC,QAAUnC,EAAI,EAAG4V,EAAI,KAAK,SAAS,OAAQ5V,EAAI4V,EAAG5V,IAAO,CAGxD,IAAMmJ,EADQ,KAAK,SAAUnJ,CAAE,EACV,oBAAqBO,EAAM4B,CAAM,EAEtD,GAAKgH,IAAW,OAEf,OAAOA,CAIT,CAID,CAWA,qBAAsB5I,EAAM4B,EAAO8Q,EAAS,CAAC,EAAI,CAE3C,KAAM1S,CAAK,IAAM4B,GAAQ8Q,EAAO,KAAM,IAAK,EAEhD,IAAMqH,EAAW,KAAK,SAEtB,QAAUta,EAAI,EAAG4V,EAAI0E,EAAS,OAAQta,EAAI4V,EAAG5V,IAE5Csa,EAAUta,CAAE,EAAE,qBAAsBO,EAAM4B,EAAO8Q,CAAO,EAIzD,OAAOA,CAER,CAQA,iBAAkBvM,EAAS,CAE1B,YAAK,kBAAmB,GAAM,EAAM,EAE7BA,EAAO,sBAAuB,KAAK,WAAY,CAEvD,CAQA,mBAAoBA,EAAS,CAE5B,YAAK,kBAAmB,GAAM,EAAM,EAEpC,KAAK,YAAY,UAAWwlB,GAAaxlB,EAAQylB,GAAS,EAEnDzlB,CAER,CAQA,cAAeA,EAAS,CAEvB,YAAK,kBAAmB,GAAM,EAAM,EAEpC,KAAK,YAAY,UAAWwlB,GAAaE,IAAe1lB,CAAO,EAExDA,CAER,CAQA,kBAAmBA,EAAS,CAE3B,KAAK,kBAAmB,GAAM,EAAM,EAEpC,IAAM+B,EAAI,KAAK,YAAY,SAE3B,OAAO/B,EAAO,IAAK+B,EAAG,CAAE,EAAGA,EAAG,CAAE,EAAGA,EAAG,EAAG,CAAE,EAAE,UAAU,CAExD,CAWA,SAAuC,CAAC,CASxC,SAAU0+B,EAAW,CAEpBA,EAAU,IAAK,EAEf,IAAM7sB,EAAW,KAAK,SAEtB,QAAUta,EAAI,EAAG4V,EAAI0E,EAAS,OAAQta,EAAI4V,EAAG5V,IAE5Csa,EAAUta,CAAE,EAAE,SAAUmnC,CAAS,CAInC,CAUA,gBAAiBA,EAAW,CAE3B,GAAK,KAAK,UAAY,GAAQ,OAE9BA,EAAU,IAAK,EAEf,IAAM7sB,EAAW,KAAK,SAEtB,QAAUta,EAAI,EAAG4V,EAAI0E,EAAS,OAAQta,EAAI4V,EAAG5V,IAE5Csa,EAAUta,CAAE,EAAE,gBAAiBmnC,CAAS,CAI1C,CASA,kBAAmBA,EAAW,CAE7B,IAAMgN,EAAS,KAAK,OAEfA,IAAW,OAEfhN,EAAUgN,CAAO,EAEjBA,EAAO,kBAAmBhN,CAAS,EAIrC,CAMA,cAAe,CAEd,KAAK,OAAO,QAAS,KAAK,SAAU,KAAK,WAAY,KAAK,KAAM,EAEhE,KAAK,uBAAyB,EAE/B,CAaA,kBAAmBkN,EAAQ,CAErB,KAAK,kBAAmB,KAAK,aAAa,GAE1C,KAAK,wBAA0BA,KAE9B,KAAK,wBAA0B,KAE9B,KAAK,SAAW,KAEpB,KAAK,YAAY,KAAM,KAAK,MAAO,EAInC,KAAK,YAAY,iBAAkB,KAAK,OAAO,YAAa,KAAK,MAAO,GAM1E,KAAK,uBAAyB,GAE9BA,EAAQ,IAMT,IAAM/5B,EAAW,KAAK,SAEtB,QAAUta,EAAI,EAAG4V,EAAI0E,EAAS,OAAQta,EAAI4V,EAAG5V,IAE9Bsa,EAAUta,CAAE,EAEpB,kBAAmBq0C,CAAM,CAIjC,CASA,kBAAmBC,EAAeC,EAAiB,CAElD,IAAMJ,EAAS,KAAK,OA0BpB,GAxBKG,IAAkB,IAAQH,IAAW,MAEzCA,EAAO,kBAAmB,GAAM,EAAM,EAIlC,KAAK,kBAAmB,KAAK,aAAa,EAE1C,KAAK,wBAA0B,KAE9B,KAAK,SAAW,KAEpB,KAAK,YAAY,KAAM,KAAK,MAAO,EAInC,KAAK,YAAY,iBAAkB,KAAK,OAAO,YAAa,KAAK,MAAO,GAQrEI,IAAmB,GAAO,CAE9B,IAAMj6B,EAAW,KAAK,SAEtB,QAAUta,EAAI,EAAG4V,EAAI0E,EAAS,OAAQta,EAAI4V,EAAG5V,IAE9Bsa,EAAUta,CAAE,EAEpB,kBAAmB,GAAO,EAAK,CAIvC,CAED,CASA,OAAQurC,EAAO,CAGd,IAAMC,EAAiBD,IAAS,QAAa,OAAOA,GAAS,SAEvDE,EAAS,CAAC,EAKXD,IAGJD,EAAO,CACN,WAAY,CAAC,EACb,UAAW,CAAC,EACZ,SAAU,CAAC,EACX,OAAQ,CAAC,EACT,OAAQ,CAAC,EACT,UAAW,CAAC,EACZ,WAAY,CAAC,EACb,MAAO,CAAC,CACT,EAEAE,EAAO,SAAW,CACjB,QAAS,IACT,KAAM,SACN,UAAW,iBACZ,GAMD,IAAMtiC,EAAS,CAAC,EAEhBA,EAAO,KAAO,KAAK,KACnBA,EAAO,KAAO,KAAK,KAEd,KAAK,OAAS,KAAKA,EAAO,KAAO,KAAK,MACtC,KAAK,aAAe,KAAOA,EAAO,WAAa,IAC/C,KAAK,gBAAkB,KAAOA,EAAO,cAAgB,IACrD,KAAK,UAAY,KAAQA,EAAO,QAAU,IAC1C,KAAK,gBAAkB,KAAQA,EAAO,cAAgB,IACtD,KAAK,cAAgB,IAAIA,EAAO,YAAc,KAAK,aACnD,OAAO,KAAM,KAAK,QAAS,EAAE,OAAS,IAAIA,EAAO,SAAW,KAAK,UAEtEA,EAAO,OAAS,KAAK,OAAO,KAC5BA,EAAO,OAAS,KAAK,OAAO,QAAQ,EACpCA,EAAO,GAAK,KAAK,GAAG,QAAQ,EAEvB,KAAK,mBAAqB,KAAQA,EAAO,iBAAmB,IAI5D,KAAK,kBAETA,EAAO,KAAO,gBACdA,EAAO,MAAQ,KAAK,MACpBA,EAAO,eAAiB,KAAK,eAAe,OAAO,EAC9C,KAAK,gBAAkB,OAAOA,EAAO,cAAgB,KAAK,cAAc,OAAO,IAIhF,KAAK,gBAETA,EAAO,KAAO,cACdA,EAAO,uBAAyB,KAAK,uBACrCA,EAAO,YAAc,KAAK,YAE1BA,EAAO,WAAa,KAAK,YACzBA,EAAO,eAAiB,KAAK,gBAE7BA,EAAO,aAAe,KAAK,cAAc,IAAKqrC,IAAU,CACvD,GAAGA,EACH,YAAaA,EAAK,YAAcA,EAAK,YAAY,OAAO,EAAI,OAC5D,eAAgBA,EAAK,eAAiBA,EAAK,eAAe,OAAO,EAAI,MACtE,EAAI,EACJrrC,EAAO,aAAe,KAAK,cAAc,IAAKqrC,IAAU,CAAE,GAAGA,CAAK,EAAI,EAEtErrC,EAAO,qBAAuB,KAAK,sBAAsB,MAAM,EAC/DA,EAAO,qBAAuB,KAAK,sBAAsB,MAAM,EAE/DA,EAAO,eAAiB,KAAK,gBAC7BA,EAAO,gBAAkB,KAAK,iBAC9BA,EAAO,cAAgB,KAAK,eAE5BA,EAAO,iBAAmB,KAAK,kBAC/BA,EAAO,eAAiB,KAAK,gBAC7BA,EAAO,cAAgB,KAAK,eAE5BA,EAAO,oBAAsB,KAAK,qBAElCA,EAAO,gBAAkB,KAAK,iBAAiB,OAAQoiC,CAAK,EAE5DpiC,EAAO,gBAAkB,KAAK,iBAAiB,OAAQoiC,CAAK,EAEvD,KAAK,iBAAmB,OAE5BpiC,EAAO,cAAgB,KAAK,eAAe,OAAQoiC,CAAK,GAIpD,KAAK,iBAAmB,OAE5BpiC,EAAO,eAAiB,KAAK,eAAe,OAAO,GAI/C,KAAK,cAAgB,OAEzBA,EAAO,YAAc,KAAK,YAAY,OAAO,IAQ/C,SAASsrC,EAAWC,EAASC,EAAU,CAEtC,OAAKD,EAASC,EAAQ,IAAK,IAAM,SAEhCD,EAASC,EAAQ,IAAK,EAAIA,EAAQ,OAAQpJ,CAAK,GAIzCoJ,EAAQ,IAEhB,CAEA,GAAK,KAAK,QAEJ,KAAK,aAEJ,KAAK,WAAW,QAEpBxrC,EAAO,WAAa,KAAK,WAAW,OAAO,EAEhC,KAAK,WAAW,YAE3BA,EAAO,WAAa,KAAK,WAAW,OAAQoiC,CAAK,EAAE,OAMhD,KAAK,aAAe,KAAK,YAAY,WAAa,KAAK,YAAY,wBAA0B,KAEjGpiC,EAAO,YAAc,KAAK,YAAY,OAAQoiC,CAAK,EAAE,cAI3C,KAAK,QAAU,KAAK,QAAU,KAAK,SAAW,CAEzDpiC,EAAO,SAAWsrC,EAAWlJ,EAAK,WAAY,KAAK,QAAS,EAE5D,IAAMqJ,EAAa,KAAK,SAAS,WAEjC,GAAKA,IAAe,QAAaA,EAAW,SAAW,OAAY,CAElE,IAAM3+B,EAAS2+B,EAAW,OAE1B,GAAK,MAAM,QAAS3+B,CAAO,EAE1B,QAAUjW,EAAI,EAAG4V,EAAIK,EAAO,OAAQjW,EAAI4V,EAAG5V,IAAO,CAEjD,IAAMmW,EAAQF,EAAQjW,CAAE,EAExBy0C,EAAWlJ,EAAK,OAAQp1B,CAAM,CAE/B,MAIAs+B,EAAWlJ,EAAK,OAAQt1B,CAAO,CAIjC,CAED,CAiBA,GAfK,KAAK,gBAET9M,EAAO,SAAW,KAAK,SACvBA,EAAO,WAAa,KAAK,WAAW,QAAQ,EAEvC,KAAK,WAAa,SAEtBsrC,EAAWlJ,EAAK,UAAW,KAAK,QAAS,EAEzCpiC,EAAO,SAAW,KAAK,SAAS,OAM7B,KAAK,WAAa,OAEtB,GAAK,MAAM,QAAS,KAAK,QAAS,EAAI,CAErC,IAAM0rC,EAAQ,CAAC,EAEf,QAAU70C,EAAI,EAAG,EAAI,KAAK,SAAS,OAAQA,EAAI,EAAGA,IAEjD60C,EAAM,KAAMJ,EAAWlJ,EAAK,UAAW,KAAK,SAAUvrC,CAAE,CAAE,CAAE,EAI7DmJ,EAAO,SAAW0rC,CAEnB,MAEC1rC,EAAO,SAAWsrC,EAAWlJ,EAAK,UAAW,KAAK,QAAS,EAQ7D,GAAK,KAAK,SAAS,OAAS,EAAI,CAE/BpiC,EAAO,SAAW,CAAC,EAEnB,QAAUnJ,EAAI,EAAGA,EAAI,KAAK,SAAS,OAAQA,IAE1CmJ,EAAO,SAAS,KAAM,KAAK,SAAUnJ,CAAE,EAAE,OAAQurC,CAAK,EAAE,MAAO,CAIjE,CAIA,GAAK,KAAK,WAAW,OAAS,EAAI,CAEjCpiC,EAAO,WAAa,CAAC,EAErB,QAAUnJ,EAAI,EAAGA,EAAI,KAAK,WAAW,OAAQA,IAAO,CAEnD,IAAM80C,EAAY,KAAK,WAAY90C,CAAE,EAErCmJ,EAAO,WAAW,KAAMsrC,EAAWlJ,EAAK,WAAYuJ,CAAU,CAAE,CAEjE,CAED,CAEA,GAAKtJ,EAAe,CAEnB,IAAMuJ,EAAaC,EAAkBzJ,EAAK,UAAW,EAC/C0J,EAAYD,EAAkBzJ,EAAK,SAAU,EAC7C2J,EAAWF,EAAkBzJ,EAAK,QAAS,EAC3C4J,EAASH,EAAkBzJ,EAAK,MAAO,EACvCt1B,EAAS++B,EAAkBzJ,EAAK,MAAO,EACvC6J,EAAYJ,EAAkBzJ,EAAK,SAAU,EAC7C8J,EAAaL,EAAkBzJ,EAAK,UAAW,EAC/C+J,EAAQN,EAAkBzJ,EAAK,KAAM,EAEtCwJ,EAAW,OAAS,IAAItJ,EAAO,WAAasJ,GAC5CE,EAAU,OAAS,IAAIxJ,EAAO,UAAYwJ,GAC1CC,EAAS,OAAS,IAAIzJ,EAAO,SAAWyJ,GACxCC,EAAO,OAAS,IAAI1J,EAAO,OAAS0J,GACpCl/B,EAAO,OAAS,IAAIw1B,EAAO,OAASx1B,GACpCm/B,EAAU,OAAS,IAAI3J,EAAO,UAAY2J,GAC1CC,EAAW,OAAS,IAAI5J,EAAO,WAAa4J,GAC5CC,EAAM,OAAS,IAAI7J,EAAO,MAAQ6J,EAExC,CAEA,OAAA7J,EAAO,OAAStiC,EAETsiC,EAKP,SAASuJ,EAAkBO,EAAQ,CAElC,IAAMz+B,EAAS,CAAC,EAChB,QAAYQ,KAAOi+B,EAAQ,CAE1B,IAAM9lC,EAAO8lC,EAAOj+B,CAAI,EACxB,OAAO7H,EAAK,SACZqH,EAAO,KAAMrH,CAAK,CAEnB,CAEA,OAAOqH,CAER,CAED,CAQA,MAAOsD,EAAY,CAElB,OAAO,IAAI,KAAK,YAAY,EAAE,KAAM,KAAMA,CAAU,CAErD,CASA,KAAM+xB,EAAQ/xB,EAAY,GAAO,CAgChC,GA9BA,KAAK,KAAO+xB,EAAO,KAEnB,KAAK,GAAG,KAAMA,EAAO,EAAG,EAExB,KAAK,SAAS,KAAMA,EAAO,QAAS,EACpC,KAAK,SAAS,MAAQA,EAAO,SAAS,MACtC,KAAK,WAAW,KAAMA,EAAO,UAAW,EACxC,KAAK,MAAM,KAAMA,EAAO,KAAM,EAE9B,KAAK,OAAO,KAAMA,EAAO,MAAO,EAChC,KAAK,YAAY,KAAMA,EAAO,WAAY,EAE1C,KAAK,iBAAmBA,EAAO,iBAE/B,KAAK,sBAAwBA,EAAO,sBACpC,KAAK,uBAAyBA,EAAO,uBAErC,KAAK,OAAO,KAAOA,EAAO,OAAO,KACjC,KAAK,QAAUA,EAAO,QAEtB,KAAK,WAAaA,EAAO,WACzB,KAAK,cAAgBA,EAAO,cAE5B,KAAK,cAAgBA,EAAO,cAC5B,KAAK,YAAcA,EAAO,YAE1B,KAAK,WAAaA,EAAO,WAAW,MAAM,EAE1C,KAAK,SAAW,KAAK,MAAO,KAAK,UAAWA,EAAO,QAAS,CAAE,EAEzD/xB,IAAc,GAElB,QAAUpa,EAAI,EAAGA,EAAImsC,EAAO,SAAS,OAAQnsC,IAAO,CAEnD,IAAMw1C,EAAQrJ,EAAO,SAAUnsC,CAAE,EACjC,KAAK,IAAKw1C,EAAM,MAAM,CAAE,CAEzB,CAID,OAAO,IAER,CAED,EAUA5oB,GAAS,WAA2B,IAAIliB,EAAS,EAAG,EAAG,CAAE,EAUzDkiB,GAAS,2BAA6B,GAUtCA,GAAS,iCAAmC,GAEtCC,GAAsB,IAAIniB,EAC1BoiB,GAAsB,IAAIpiB,EAC1BqiB,GAAsB,IAAIriB,EAC1BsiB,GAAsB,IAAItiB,EAE1BuiB,GAAqB,IAAIviB,EACzBwiB,GAAqB,IAAIxiB,EACzByiB,GAAqB,IAAIziB,EACzB0iB,GAAqB,IAAI1iB,EACzB2iB,GAAqB,IAAI3iB,EACzB4iB,GAAqB,IAAI5iB,EAEzB6iB,GAAqB,IAAItE,GACzBuE,GAAqB,IAAIvE,GACzBwE,GAAqB,IAAIxE,GAKzBte,GAAN,MAAM8qC,CAAS,CASd,YAAa3wC,EAAI,IAAI4F,EAAW3F,EAAI,IAAI2F,EAAW1F,EAAI,IAAI0F,EAAY,CAOtE,KAAK,EAAI5F,EAOT,KAAK,EAAIC,EAOT,KAAK,EAAIC,CAEV,CAWA,OAAO,UAAWF,EAAGC,EAAGC,EAAG0B,EAAS,CAEnCA,EAAO,WAAY1B,EAAGD,CAAE,EACxB8nB,GAAM,WAAY/nB,EAAGC,CAAE,EACvB2B,EAAO,MAAOmmB,EAAM,EAEpB,IAAM6oB,EAAiBhvC,EAAO,SAAS,EACvC,OAAKgvC,EAAiB,EAEdhvC,EAAO,eAAgB,EAAI,KAAK,KAAMgvC,CAAe,CAAE,EAIxDhvC,EAAO,IAAK,EAAG,EAAG,CAAE,CAE5B,CAaA,OAAO,aAAcgD,EAAO5E,EAAGC,EAAGC,EAAG0B,EAAS,CAI7CmmB,GAAM,WAAY7nB,EAAGF,CAAE,EACvBgoB,GAAM,WAAY/nB,EAAGD,CAAE,EACvBioB,GAAM,WAAYrjB,EAAO5E,CAAE,EAE3B,IAAM6wC,EAAQ9oB,GAAM,IAAKA,EAAM,EACzB+oB,EAAQ/oB,GAAM,IAAKC,EAAM,EACzB+oB,EAAQhpB,GAAM,IAAKE,EAAM,EACzB+oB,EAAQhpB,GAAM,IAAKA,EAAM,EACzBipB,EAAQjpB,GAAM,IAAKC,EAAM,EAEzBipB,EAAUL,EAAQG,EAAQF,EAAQA,EAGxC,GAAKI,IAAU,EAEd,OAAAtvC,EAAO,IAAK,EAAG,EAAG,CAAE,EACb,KAIR,IAAMuvC,EAAW,EAAID,EACf/qC,GAAM6qC,EAAQD,EAAQD,EAAQG,GAAUE,EACxCtS,GAAMgS,EAAQI,EAAQH,EAAQC,GAAUI,EAG9C,OAAOvvC,EAAO,IAAK,EAAIuE,EAAI04B,EAAGA,EAAG14B,CAAE,CAEpC,CAaA,OAAO,cAAevB,EAAO5E,EAAGC,EAAGC,EAAI,CAGtC,OAAK,KAAK,aAAc0E,EAAO5E,EAAGC,EAAGC,EAAGgoB,EAAM,IAAM,KAE5C,GAICA,GAAM,GAAK,GAASA,GAAM,GAAK,GAAWA,GAAM,EAAIA,GAAM,GAAO,CAE3E,CAgBA,OAAO,iBAAkBtjB,EAAO1B,EAAIC,EAAI4G,EAAIpH,EAAIC,EAAIwuC,EAAIxvC,EAAS,CAEhE,OAAK,KAAK,aAAcgD,EAAO1B,EAAIC,EAAI4G,EAAIme,EAAM,IAAM,MAEtDtmB,EAAO,EAAI,EACXA,EAAO,EAAI,EACN,MAAOA,IAASA,EAAO,EAAI,GAC3B,MAAOA,IAASA,EAAO,EAAI,GACzB,OAIRA,EAAO,UAAW,CAAE,EACpBA,EAAO,gBAAiBe,EAAIulB,GAAM,CAAE,EACpCtmB,EAAO,gBAAiBgB,EAAIslB,GAAM,CAAE,EACpCtmB,EAAO,gBAAiBwvC,EAAIlpB,GAAM,CAAE,EAE7BtmB,EAER,CAaA,OAAO,yBAA0ByvC,EAAMC,EAAIC,EAAIC,EAAI7rC,EAAW/D,EAAS,CAEtE,OAAA6mB,GAAK,UAAW,CAAE,EAClBC,GAAK,UAAW,CAAE,EAClBC,GAAK,UAAW,CAAE,EAElBF,GAAK,oBAAqB4oB,EAAMC,CAAG,EACnC5oB,GAAK,oBAAqB2oB,EAAME,CAAG,EACnC5oB,GAAK,oBAAqB0oB,EAAMG,CAAG,EAEnC5vC,EAAO,UAAW,CAAE,EACpBA,EAAO,gBAAiB6mB,GAAM9iB,EAAU,CAAE,EAC1C/D,EAAO,gBAAiB8mB,GAAM/iB,EAAU,CAAE,EAC1C/D,EAAO,gBAAiB+mB,GAAMhjB,EAAU,CAAE,EAEnC/D,CAER,CAWA,OAAO,cAAe5B,EAAGC,EAAGC,EAAGgpC,EAAY,CAE1C,OAAAnhB,GAAM,WAAY7nB,EAAGD,CAAE,EACvB+nB,GAAM,WAAYhoB,EAAGC,CAAE,EAGd8nB,GAAM,MAAOC,EAAM,EAAE,IAAKkhB,CAAU,EAAI,CAElD,CAUA,IAAKlpC,EAAGC,EAAGC,EAAI,CAEd,YAAK,EAAE,KAAMF,CAAE,EACf,KAAK,EAAE,KAAMC,CAAE,EACf,KAAK,EAAE,KAAMC,CAAE,EAER,IAER,CAWA,wBAAyB2Q,EAAQ4gC,EAAIH,EAAIC,EAAK,CAE7C,YAAK,EAAE,KAAM1gC,EAAQ4gC,CAAG,CAAE,EAC1B,KAAK,EAAE,KAAM5gC,EAAQygC,CAAG,CAAE,EAC1B,KAAK,EAAE,KAAMzgC,EAAQ0gC,CAAG,CAAE,EAEnB,IAER,CAWA,2BAA4BjS,EAAWmS,EAAIH,EAAIC,EAAK,CAEnD,YAAK,EAAE,oBAAqBjS,EAAWmS,CAAG,EAC1C,KAAK,EAAE,oBAAqBnS,EAAWgS,CAAG,EAC1C,KAAK,EAAE,oBAAqBhS,EAAWiS,CAAG,EAEnC,IAER,CAOA,OAAQ,CAEP,OAAO,IAAI,KAAK,YAAY,EAAE,KAAM,IAAK,CAE1C,CAQA,KAAM7I,EAAW,CAEhB,YAAK,EAAE,KAAMA,EAAS,CAAE,EACxB,KAAK,EAAE,KAAMA,EAAS,CAAE,EACxB,KAAK,EAAE,KAAMA,EAAS,CAAE,EAEjB,IAER,CAOA,SAAU,CAET,OAAA3gB,GAAM,WAAY,KAAK,EAAG,KAAK,CAAE,EACjCC,GAAM,WAAY,KAAK,EAAG,KAAK,CAAE,EAE1BD,GAAM,MAAOC,EAAM,EAAE,OAAO,EAAI,EAExC,CAQA,YAAapmB,EAAS,CAErB,OAAOA,EAAO,WAAY,KAAK,EAAG,KAAK,CAAE,EAAE,IAAK,KAAK,CAAE,EAAE,eAAgB,EAAI,CAAE,CAEhF,CAQA,UAAWA,EAAS,CAEnB,OAAO+uC,EAAS,UAAW,KAAK,EAAG,KAAK,EAAG,KAAK,EAAG/uC,CAAO,CAE3D,CAQA,SAAUA,EAAS,CAElB,OAAOA,EAAO,sBAAuB,KAAK,EAAG,KAAK,EAAG,KAAK,CAAE,CAE7D,CAUA,aAAcgD,EAAOhD,EAAS,CAE7B,OAAO+uC,EAAS,aAAc/rC,EAAO,KAAK,EAAG,KAAK,EAAG,KAAK,EAAGhD,CAAO,CAErE,CAaA,iBAAkBgD,EAAOjC,EAAIC,EAAIwuC,EAAIxvC,EAAS,CAE7C,OAAO+uC,EAAS,iBAAkB/rC,EAAO,KAAK,EAAG,KAAK,EAAG,KAAK,EAAGjC,EAAIC,EAAIwuC,EAAIxvC,CAAO,CAErF,CAUA,cAAegD,EAAQ,CAEtB,OAAO+rC,EAAS,cAAe/rC,EAAO,KAAK,EAAG,KAAK,EAAG,KAAK,CAAE,CAE9D,CAQA,cAAeskC,EAAY,CAE1B,OAAOyH,EAAS,cAAe,KAAK,EAAG,KAAK,EAAG,KAAK,EAAGzH,CAAU,CAElE,CAQA,cAAeZ,EAAM,CAEpB,OAAOA,EAAI,mBAAoB,IAAK,CAErC,CASA,oBAAqBjlC,EAAGzB,EAAS,CAEhC,IAAM5B,EAAI,KAAK,EAAGC,EAAI,KAAK,EAAGC,EAAI,KAAK,EACnC2+B,EAAGW,EAQPrX,GAAK,WAAYloB,EAAGD,CAAE,EACtBooB,GAAK,WAAYloB,EAAGF,CAAE,EACtBsoB,GAAK,WAAYjlB,EAAGrD,CAAE,EACtB,IAAMhD,EAAKmrB,GAAK,IAAKG,EAAK,EACpBrrB,EAAKmrB,GAAK,IAAKE,EAAK,EAC1B,GAAKtrB,GAAM,GAAKC,GAAM,EAGrB,OAAO2E,EAAO,KAAM5B,CAAE,EAIvBuoB,GAAK,WAAYllB,EAAGpD,CAAE,EACtB,IAAM/C,EAAKirB,GAAK,IAAKI,EAAK,EACpBmpB,EAAKtpB,GAAK,IAAKG,EAAK,EAC1B,GAAKrrB,GAAM,GAAKw0C,GAAMx0C,EAGrB,OAAO0E,EAAO,KAAM3B,CAAE,EAIvB,IAAM0xC,EAAK30C,EAAK00C,EAAKx0C,EAAKD,EAC1B,GAAK00C,GAAM,GAAK30C,GAAM,GAAKE,GAAM,EAEhC,OAAA2hC,EAAI7hC,GAAOA,EAAKE,GAET0E,EAAO,KAAM5B,CAAE,EAAE,gBAAiBmoB,GAAM0W,CAAE,EAIlDrW,GAAK,WAAYnlB,EAAGnD,CAAE,EACtB,IAAM0xC,EAAKzpB,GAAK,IAAKK,EAAK,EACpBqpB,EAAKzpB,GAAK,IAAKI,EAAK,EAC1B,GAAKqpB,GAAM,GAAKD,GAAMC,EAGrB,OAAOjwC,EAAO,KAAM1B,CAAE,EAIvB,IAAM4xC,EAAKF,EAAK30C,EAAKD,EAAK60C,EAC1B,GAAKC,GAAM,GAAK70C,GAAM,GAAK40C,GAAM,EAEhC,OAAArS,EAAIviC,GAAOA,EAAK40C,GAETjwC,EAAO,KAAM5B,CAAE,EAAE,gBAAiBooB,GAAMoX,CAAE,EAIlD,IAAMuS,EAAK70C,EAAK20C,EAAKD,EAAKF,EAC1B,GAAKK,GAAM,GAAOL,EAAKx0C,GAAQ,GAAO00C,EAAKC,GAAQ,EAElD,OAAAxpB,GAAK,WAAYnoB,EAAGD,CAAE,EACtBu/B,GAAMkS,EAAKx0C,IAAWw0C,EAAKx0C,GAAS00C,EAAKC,IAElCjwC,EAAO,KAAM3B,CAAE,EAAE,gBAAiBooB,GAAMmX,CAAE,EAKlD,IAAM0R,EAAQ,GAAMa,EAAKD,EAAKH,GAE9B,OAAA9S,EAAIiT,EAAKZ,EACT1R,EAAImS,EAAKT,EAEFtvC,EAAO,KAAM5B,CAAE,EAAE,gBAAiBmoB,GAAM0W,CAAE,EAAE,gBAAiBzW,GAAMoX,CAAE,CAE7E,CAQA,OAAQkJ,EAAW,CAElB,OAAOA,EAAS,EAAE,OAAQ,KAAK,CAAE,GAAKA,EAAS,EAAE,OAAQ,KAAK,CAAE,GAAKA,EAAS,EAAE,OAAQ,KAAK,CAAE,CAEhG,CAED,EAEM9f,GAAiB,CAAE,UAAa,SAAU,aAAgB,SAAU,KAAQ,MAAU,WAAc,QAAU,MAAS,SAC5H,MAAS,SAAU,OAAU,SAAU,MAAS,EAAU,eAAkB,SAAU,KAAQ,IAAU,WAAc,QACtH,MAAS,SAAU,UAAa,SAAU,UAAa,QAAU,WAAc,QAAU,UAAa,SAAU,MAAS,SACzH,eAAkB,QAAU,SAAY,SAAU,QAAW,SAAU,KAAQ,MAAU,SAAY,IAAU,SAAY,MAC3H,cAAiB,SAAU,SAAY,SAAU,UAAa,MAAU,SAAY,SAAU,UAAa,SAAU,YAAe,QACpI,eAAkB,QAAU,WAAc,SAAU,WAAc,SAAU,QAAW,QAAU,WAAc,SAAU,aAAgB,QACzI,cAAiB,QAAU,cAAiB,QAAU,cAAiB,QAAU,cAAiB,MAAU,WAAc,QAC1H,SAAY,SAAU,YAAe,MAAU,QAAW,QAAU,QAAW,QAAU,WAAc,QAAU,UAAa,SAC9H,YAAe,SAAU,YAAe,QAAU,QAAW,SAAU,UAAa,SAAU,WAAc,SAAU,KAAQ,SAC9H,UAAa,SAAU,KAAQ,QAAU,MAAS,MAAU,YAAe,SAAU,KAAQ,QAAU,SAAY,SAAU,QAAW,SACxI,UAAa,SAAU,OAAU,QAAU,MAAS,SAAU,MAAS,SAAU,SAAY,SAAU,cAAiB,SAAU,UAAa,QAC/I,aAAgB,SAAU,UAAa,SAAU,WAAc,SAAU,UAAa,SAAU,qBAAwB,SAAU,UAAa,SAC/I,WAAc,QAAU,UAAa,SAAU,UAAa,SAAU,YAAe,SAAU,cAAiB,QAAU,aAAgB,QAC1I,eAAkB,QAAU,eAAkB,QAAU,eAAkB,SAAU,YAAe,SAAU,KAAQ,MAAU,UAAa,QAC5I,MAAS,SAAU,QAAW,SAAU,OAAU,QAAU,iBAAoB,QAAU,WAAc,IAAU,aAAgB,SAClI,aAAgB,QAAU,eAAkB,QAAU,gBAAmB,QAAU,kBAAqB,MAAU,gBAAmB,QACrI,gBAAmB,SAAU,aAAgB,QAAU,UAAa,SAAU,UAAa,SAAU,SAAY,SAAU,YAAe,SAC1I,KAAQ,IAAU,QAAW,SAAU,MAAS,QAAU,UAAa,QAAU,OAAU,SAAU,UAAa,SAAU,OAAU,SACtI,cAAiB,SAAU,UAAa,SAAU,cAAiB,SAAU,cAAiB,SAAU,WAAc,SAAU,UAAa,SAC7I,KAAQ,SAAU,KAAQ,SAAU,KAAQ,SAAU,WAAc,SAAU,OAAU,QAAU,cAAiB,QAAU,IAAO,SAAU,UAAa,SAC3J,UAAa,QAAU,YAAe,QAAU,OAAU,SAAU,WAAc,SAAU,SAAY,QAAU,SAAY,SAC9H,OAAU,SAAU,OAAU,SAAU,QAAW,QAAU,UAAa,QAAU,UAAa,QAAU,UAAa,QAAU,KAAQ,SAC1I,YAAe,MAAU,UAAa,QAAU,IAAO,SAAU,KAAQ,MAAU,QAAW,SAAU,OAAU,SAAU,UAAa,QACzI,OAAU,SAAU,MAAS,SAAU,MAAS,SAAU,WAAc,SAAU,OAAU,SAAU,YAAe,QAAS,EAEzHC,GAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAC3BC,GAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAwD3BC,GAAN,KAAY,CAaX,YAAa/lB,EAAG6iC,EAAG5lC,EAAI,CAStB,YAAK,QAAU,GAQf,KAAK,EAAI,EAQT,KAAK,EAAI,EAQT,KAAK,EAAI,EAEF,KAAK,IAAK+C,EAAG6iC,EAAG5lC,CAAE,CAE1B,CAWA,IAAK+C,EAAG6iC,EAAG5lC,EAAI,CAEd,GAAK4lC,IAAM,QAAa5lC,IAAM,OAAY,CAIzC,IAAM5C,EAAQ2F,EAET3F,GAASA,EAAM,QAEnB,KAAK,KAAMA,CAAM,EAEN,OAAOA,GAAU,SAE5B,KAAK,OAAQA,CAAM,EAER,OAAOA,GAAU,UAE5B,KAAK,SAAUA,CAAM,CAIvB,MAEC,KAAK,OAAQ2F,EAAG6iC,EAAG5lC,CAAE,EAItB,OAAO,IAER,CAQA,UAAW2+B,EAAS,CAEnB,YAAK,EAAIA,EACT,KAAK,EAAIA,EACT,KAAK,EAAIA,EAEF,IAER,CASA,OAAQoT,EAAKvwC,EAAaW,GAAiB,CAE1C,OAAA4vC,EAAM,KAAK,MAAOA,CAAI,EAEtB,KAAK,GAAMA,GAAO,GAAK,KAAQ,IAC/B,KAAK,GAAMA,GAAO,EAAI,KAAQ,IAC9B,KAAK,GAAMA,EAAM,KAAQ,IAEzB/wC,GAAgB,oBAAqB,KAAMQ,CAAW,EAE/C,IAER,CAWA,OAAQuB,EAAG6iC,EAAG5lC,EAAGwB,EAAaR,GAAgB,kBAAoB,CAEjE,YAAK,EAAI+B,EACT,KAAK,EAAI6iC,EACT,KAAK,EAAI5lC,EAETgB,GAAgB,oBAAqB,KAAMQ,CAAW,EAE/C,IAER,CAWA,OAAQqkC,EAAG5mC,EAAG4R,EAAGrP,EAAaR,GAAgB,kBAAoB,CAOjE,GAJA6kC,EAAItoC,GAAiBsoC,EAAG,CAAE,EAC1B5mC,EAAI9B,GAAO8B,EAAG,EAAG,CAAE,EACnB4R,EAAI1T,GAAO0T,EAAG,EAAG,CAAE,EAEd5R,IAAM,EAEV,KAAK,EAAI,KAAK,EAAI,KAAK,EAAI4R,MAErB,CAEN,IAAMzN,EAAIyN,GAAK,GAAMA,GAAM,EAAI5R,GAAM4R,EAAI5R,EAAM4R,EAAI5R,EAC7Ca,EAAM,EAAI+Q,EAAMzN,EAEtB,KAAK,EAAID,GAASrD,EAAGsD,EAAGyiC,EAAI,EAAI,CAAE,EAClC,KAAK,EAAI1iC,GAASrD,EAAGsD,EAAGyiC,CAAE,EAC1B,KAAK,EAAI1iC,GAASrD,EAAGsD,EAAGyiC,EAAI,EAAI,CAAE,CAEnC,CAEA,OAAA7kC,GAAgB,oBAAqB,KAAMQ,CAAW,EAE/C,IAER,CAYA,SAAUwwC,EAAOxwC,EAAaW,GAAiB,CAE9C,SAAS8vC,EAAaC,EAAS,CAEzBA,IAAW,QAEX,WAAYA,CAAO,EAAI,GAE3Bh2C,GAAM,6BAA+B81C,EAAQ,mBAAoB,CAInE,CAGA,IAAIv0C,EAEJ,GAAKA,EAAI,qBAAqB,KAAMu0C,CAAM,EAAI,CAI7C,IAAI9wC,EACE1F,EAAOiC,EAAG,CAAE,EACZ00C,EAAa10C,EAAG,CAAE,EAExB,OAASjC,EAAO,CAEf,IAAK,MACL,IAAK,OAEJ,GAAK0F,EAAQ,+DAA+D,KAAMixC,CAAW,EAI5F,OAAAF,EAAa/wC,EAAO,CAAE,CAAE,EAEjB,KAAK,OACX,KAAK,IAAK,IAAK,SAAUA,EAAO,CAAE,EAAG,EAAG,CAAE,EAAI,IAC9C,KAAK,IAAK,IAAK,SAAUA,EAAO,CAAE,EAAG,EAAG,CAAE,EAAI,IAC9C,KAAK,IAAK,IAAK,SAAUA,EAAO,CAAE,EAAG,EAAG,CAAE,EAAI,IAC9CM,CACD,EAID,GAAKN,EAAQ,qEAAqE,KAAMixC,CAAW,EAIlG,OAAAF,EAAa/wC,EAAO,CAAE,CAAE,EAEjB,KAAK,OACX,KAAK,IAAK,IAAK,SAAUA,EAAO,CAAE,EAAG,EAAG,CAAE,EAAI,IAC9C,KAAK,IAAK,IAAK,SAAUA,EAAO,CAAE,EAAG,EAAG,CAAE,EAAI,IAC9C,KAAK,IAAK,IAAK,SAAUA,EAAO,CAAE,EAAG,EAAG,CAAE,EAAI,IAC9CM,CACD,EAID,MAED,IAAK,MACL,IAAK,OAEJ,GAAKN,EAAQ,qFAAqF,KAAMixC,CAAW,EAIlH,OAAAF,EAAa/wC,EAAO,CAAE,CAAE,EAEjB,KAAK,OACX,WAAYA,EAAO,CAAE,CAAE,EAAI,IAC3B,WAAYA,EAAO,CAAE,CAAE,EAAI,IAC3B,WAAYA,EAAO,CAAE,CAAE,EAAI,IAC3BM,CACD,EAID,MAED,QAECtF,GAAM,8BAAgC81C,CAAM,CAE9C,CAED,SAAYv0C,EAAI,oBAAoB,KAAMu0C,CAAM,EAAI,CAInD,IAAMD,EAAMt0C,EAAG,CAAE,EACXyqC,EAAO6J,EAAI,OAEjB,GAAK7J,IAAS,EAGb,OAAO,KAAK,OACX,SAAU6J,EAAI,OAAQ,CAAE,EAAG,EAAG,EAAI,GAClC,SAAUA,EAAI,OAAQ,CAAE,EAAG,EAAG,EAAI,GAClC,SAAUA,EAAI,OAAQ,CAAE,EAAG,EAAG,EAAI,GAClCvwC,CACD,EAEM,GAAK0mC,IAAS,EAGpB,OAAO,KAAK,OAAQ,SAAU6J,EAAK,EAAG,EAAGvwC,CAAW,EAIpDtF,GAAM,4BAA8B81C,CAAM,CAI5C,SAAYA,GAASA,EAAM,OAAS,EAEnC,OAAO,KAAK,aAAcA,EAAOxwC,CAAW,EAI7C,OAAO,IAER,CAeA,aAAcwwC,EAAOxwC,EAAaW,GAAiB,CAGlD,IAAM4vC,EAAMppB,GAAgBqpB,EAAM,YAAY,CAAE,EAEhD,OAAKD,IAAQ,OAGZ,KAAK,OAAQA,EAAKvwC,CAAW,EAK7BtF,GAAM,wBAA0B81C,CAAM,EAIhC,IAER,CAOA,OAAQ,CAEP,OAAO,IAAI,KAAK,YAAa,KAAK,EAAG,KAAK,EAAG,KAAK,CAAE,CAErD,CAQA,KAAM9wC,EAAQ,CAEb,YAAK,EAAIA,EAAM,EACf,KAAK,EAAIA,EAAM,EACf,KAAK,EAAIA,EAAM,EAER,IAER,CASA,iBAAkBA,EAAQ,CAEzB,YAAK,EAAII,GAAcJ,EAAM,CAAE,EAC/B,KAAK,EAAII,GAAcJ,EAAM,CAAE,EAC/B,KAAK,EAAII,GAAcJ,EAAM,CAAE,EAExB,IAER,CASA,iBAAkBA,EAAQ,CAEzB,YAAK,EAAIK,GAAcL,EAAM,CAAE,EAC/B,KAAK,EAAIK,GAAcL,EAAM,CAAE,EAC/B,KAAK,EAAIK,GAAcL,EAAM,CAAE,EAExB,IAER,CAOA,qBAAsB,CAErB,YAAK,iBAAkB,IAAK,EAErB,IAER,CAOA,qBAAsB,CAErB,YAAK,iBAAkB,IAAK,EAErB,IAER,CAQA,OAAQM,EAAaW,GAAiB,CAErC,OAAAnB,GAAgB,oBAAqB+nB,GAAO,KAAM,IAAK,EAAGvnB,CAAW,EAE9D,KAAK,MAAOrE,GAAO4rB,GAAO,EAAI,IAAK,EAAG,GAAI,CAAE,EAAI,MAAQ,KAAK,MAAO5rB,GAAO4rB,GAAO,EAAI,IAAK,EAAG,GAAI,CAAE,EAAI,IAAM,KAAK,MAAO5rB,GAAO4rB,GAAO,EAAI,IAAK,EAAG,GAAI,CAAE,CAElK,CAQA,aAAcvnB,EAAaW,GAAiB,CAE3C,OAAS,SAAW,KAAK,OAAQX,CAAW,EAAE,SAAU,EAAG,GAAI,MAAO,EAAG,CAE1E,CAUA,OAAQG,EAAQH,EAAaR,GAAgB,kBAAoB,CAIhEA,GAAgB,oBAAqB+nB,GAAO,KAAM,IAAK,EAAGvnB,CAAW,EAErE,IAAMuB,EAAIgmB,GAAO,EAAG6c,EAAI7c,GAAO,EAAG/oB,EAAI+oB,GAAO,EAEvCzrB,EAAM,KAAK,IAAKyF,EAAG6iC,EAAG5lC,CAAE,EACxB3C,EAAM,KAAK,IAAK0F,EAAG6iC,EAAG5lC,CAAE,EAE1BoyC,EAAKC,EACHC,GAAcj1C,EAAMC,GAAQ,EAElC,GAAKD,IAAQC,EAEZ80C,EAAM,EACNC,EAAa,MAEP,CAEN,IAAMtJ,EAAQzrC,EAAMD,EAIpB,OAFAg1C,EAAaC,GAAa,GAAMvJ,GAAUzrC,EAAMD,GAAQ0rC,GAAU,EAAIzrC,EAAMD,GAEnEC,EAAM,CAEd,KAAKyF,EAAGqvC,GAAQxM,EAAI5lC,GAAM+oC,GAAUnD,EAAI5lC,EAAI,EAAI,GAAK,MACrD,KAAK4lC,EAAGwM,GAAQpyC,EAAI+C,GAAMgmC,EAAQ,EAAG,MACrC,KAAK/oC,EAAGoyC,GAAQrvC,EAAI6iC,GAAMmD,EAAQ,EAAG,KAEtC,CAEAqJ,GAAO,CAER,CAEA,OAAAzwC,EAAO,EAAIywC,EACXzwC,EAAO,EAAI0wC,EACX1wC,EAAO,EAAI2wC,EAEJ3wC,CAER,CASA,OAAQA,EAAQH,EAAaR,GAAgB,kBAAoB,CAEhE,OAAAA,GAAgB,oBAAqB+nB,GAAO,KAAM,IAAK,EAAGvnB,CAAW,EAErEG,EAAO,EAAIonB,GAAO,EAClBpnB,EAAO,EAAIonB,GAAO,EAClBpnB,EAAO,EAAIonB,GAAO,EAEXpnB,CAER,CAQA,SAAUH,EAAaW,GAAiB,CAEvCnB,GAAgB,oBAAqB+nB,GAAO,KAAM,IAAK,EAAGvnB,CAAW,EAErE,IAAMuB,EAAIgmB,GAAO,EAAG6c,EAAI7c,GAAO,EAAG/oB,EAAI+oB,GAAO,EAE7C,OAAKvnB,IAAeW,GAGZ,SAAUX,CAAW,IAAKuB,EAAE,QAAS,CAAE,CAAE,IAAK6iC,EAAE,QAAS,CAAE,CAAE,IAAK5lC,EAAE,QAAS,CAAE,CAAE,IAIlF,OAAQ,KAAK,MAAO+C,EAAI,GAAI,CAAE,IAAK,KAAK,MAAO6iC,EAAI,GAAI,CAAE,IAAK,KAAK,MAAO5lC,EAAI,GAAI,CAAE,GAE5F,CAYA,UAAW6lC,EAAG5mC,EAAG4R,EAAI,CAEpB,YAAK,OAAQ+X,EAAM,EAEZ,KAAK,OAAQA,GAAM,EAAIid,EAAGjd,GAAM,EAAI3pB,EAAG2pB,GAAM,EAAI/X,CAAE,CAE3D,CAQA,IAAK3P,EAAQ,CAEZ,YAAK,GAAKA,EAAM,EAChB,KAAK,GAAKA,EAAM,EAChB,KAAK,GAAKA,EAAM,EAET,IAER,CASA,UAAWqxC,EAAQC,EAAS,CAE3B,YAAK,EAAID,EAAO,EAAIC,EAAO,EAC3B,KAAK,EAAID,EAAO,EAAIC,EAAO,EAC3B,KAAK,EAAID,EAAO,EAAIC,EAAO,EAEpB,IAER,CAQA,UAAWvzC,EAAI,CAEd,YAAK,GAAKA,EACV,KAAK,GAAKA,EACV,KAAK,GAAKA,EAEH,IAER,CAQA,IAAKiC,EAAQ,CAEZ,YAAK,EAAI,KAAK,IAAK,EAAG,KAAK,EAAIA,EAAM,CAAE,EACvC,KAAK,EAAI,KAAK,IAAK,EAAG,KAAK,EAAIA,EAAM,CAAE,EACvC,KAAK,EAAI,KAAK,IAAK,EAAG,KAAK,EAAIA,EAAM,CAAE,EAEhC,IAER,CAQA,SAAUA,EAAQ,CAEjB,YAAK,GAAKA,EAAM,EAChB,KAAK,GAAKA,EAAM,EAChB,KAAK,GAAKA,EAAM,EAET,IAER,CAQA,eAAgBjC,EAAI,CAEnB,YAAK,GAAKA,EACV,KAAK,GAAKA,EACV,KAAK,GAAKA,EAEH,IAER,CAWA,KAAMiC,EAAOi+B,EAAQ,CAEpB,YAAK,IAAOj+B,EAAM,EAAI,KAAK,GAAMi+B,EACjC,KAAK,IAAOj+B,EAAM,EAAI,KAAK,GAAMi+B,EACjC,KAAK,IAAOj+B,EAAM,EAAI,KAAK,GAAMi+B,EAE1B,IAER,CAYA,WAAYoT,EAAQC,EAAQrT,EAAQ,CAEnC,YAAK,EAAIoT,EAAO,GAAMC,EAAO,EAAID,EAAO,GAAMpT,EAC9C,KAAK,EAAIoT,EAAO,GAAMC,EAAO,EAAID,EAAO,GAAMpT,EAC9C,KAAK,EAAIoT,EAAO,GAAMC,EAAO,EAAID,EAAO,GAAMpT,EAEvC,IAER,CAaA,QAASj+B,EAAOi+B,EAAQ,CAEvB,KAAK,OAAQvW,EAAM,EACnB1nB,EAAM,OAAQ2nB,EAAM,EAEpB,IAAMgd,EAAI3nC,GAAM0qB,GAAM,EAAGC,GAAM,EAAGsW,CAAM,EAClClgC,EAAIf,GAAM0qB,GAAM,EAAGC,GAAM,EAAGsW,CAAM,EAClCtuB,EAAI3S,GAAM0qB,GAAM,EAAGC,GAAM,EAAGsW,CAAM,EAExC,YAAK,OAAQ0G,EAAG5mC,EAAG4R,CAAE,EAEd,IAER,CAQA,eAAgB+tB,EAAI,CAEnB,YAAK,EAAIA,EAAE,EACX,KAAK,EAAIA,EAAE,EACX,KAAK,EAAIA,EAAE,EAEJ,IAER,CAQA,aAAcnhC,EAAI,CAEjB,IAAMsF,EAAI,KAAK,EAAG6iC,EAAI,KAAK,EAAG5lC,EAAI,KAAK,EACjC0D,EAAIjG,EAAE,SAEZ,YAAK,EAAIiG,EAAG,CAAE,EAAIX,EAAIW,EAAG,CAAE,EAAIkiC,EAAIliC,EAAG,CAAE,EAAI1D,EAC5C,KAAK,EAAI0D,EAAG,CAAE,EAAIX,EAAIW,EAAG,CAAE,EAAIkiC,EAAIliC,EAAG,CAAE,EAAI1D,EAC5C,KAAK,EAAI0D,EAAG,CAAE,EAAIX,EAAIW,EAAG,CAAE,EAAIkiC,EAAIliC,EAAG,CAAE,EAAI1D,EAErC,IAER,CAQA,OAAQC,EAAI,CAEX,OAASA,EAAE,IAAM,KAAK,GAASA,EAAE,IAAM,KAAK,GAASA,EAAE,IAAM,KAAK,CAEnE,CASA,UAAWjF,EAAOokC,EAAS,EAAI,CAE9B,YAAK,EAAIpkC,EAAOokC,CAAO,EACvB,KAAK,EAAIpkC,EAAOokC,EAAS,CAAE,EAC3B,KAAK,EAAIpkC,EAAOokC,EAAS,CAAE,EAEpB,IAER,CAUA,QAASpkC,EAAQ,CAAC,EAAGokC,EAAS,EAAI,CAEjC,OAAApkC,EAAOokC,CAAO,EAAI,KAAK,EACvBpkC,EAAOokC,EAAS,CAAE,EAAI,KAAK,EAC3BpkC,EAAOokC,EAAS,CAAE,EAAI,KAAK,EAEpBpkC,CAER,CASA,oBAAqBqkC,EAAWh3B,EAAQ,CAEvC,YAAK,EAAIg3B,EAAU,KAAMh3B,CAAM,EAC/B,KAAK,EAAIg3B,EAAU,KAAMh3B,CAAM,EAC/B,KAAK,EAAIg3B,EAAU,KAAMh3B,CAAM,EAExB,IAER,CAQA,QAAS,CAER,OAAO,KAAK,OAAO,CAEpB,CAEA,EAAG,OAAO,QAAS,GAAI,CAEtB,MAAM,KAAK,EACX,MAAM,KAAK,EACX,MAAM,KAAK,CAEZ,CAED,EAEM0gB,GAAuB,IAAID,GAUjCA,GAAM,MAAQH,GAEVK,IAAc,EAUZC,GAAN,cAAuB3F,EAAgB,CAKtC,aAAc,CAEb,MAAM,EASN,KAAK,WAAa,GASlB,OAAO,eAAgB,KAAM,KAAM,CAAE,MAAO0F,KAAe,CAAE,EAQ7D,KAAK,KAAOnsB,GAAa,EAOzB,KAAK,KAAO,GASZ,KAAK,KAAO,WAYZ,KAAK,SAAWse,GAQhB,KAAK,KAAOrW,GAWZ,KAAK,aAAe,GAYpB,KAAK,QAAU,EAaf,KAAK,YAAc,GAWnB,KAAK,UAAY,GAQjB,KAAK,SAAWmX,GAQhB,KAAK,SAAWC,GAQhB,KAAK,cAAgBV,GAQrB,KAAK,cAAgB,KAQrB,KAAK,cAAgB,KAQrB,KAAK,mBAAqB,KAU1B,KAAK,WAAa,IAAIsN,GAAO,EAAG,EAAG,CAAE,EAUrC,KAAK,WAAa,EAQlB,KAAK,UAAY/L,GASjB,KAAK,UAAY,GAWjB,KAAK,WAAa,GAQlB,KAAK,iBAAmB,IAQxB,KAAK,YAAc8E,GAQnB,KAAK,WAAa,EAQlB,KAAK,gBAAkB,IAQvB,KAAK,YAAcd,GASnB,KAAK,aAAeA,GASpB,KAAK,aAAeA,GAUpB,KAAK,aAAe,GAYpB,KAAK,eAAiB,KAStB,KAAK,iBAAmB,GASxB,KAAK,YAAc,GAanB,KAAK,WAAa,KAWlB,KAAK,WAAa,GAQlB,KAAK,UAAY,KAcjB,KAAK,cAAgB,GAQrB,KAAK,oBAAsB,EAQ3B,KAAK,mBAAqB,EAQ1B,KAAK,UAAY,GAUjB,KAAK,gBAAkB,GAQvB,KAAK,mBAAqB,GAc1B,KAAK,gBAAkB,GAQvB,KAAK,cAAgB,GAQrB,KAAK,QAAU,GAWf,KAAK,WAAa,GAQlB,KAAK,SAAW,CAAC,EASjB,KAAK,QAAU,EAEf,KAAK,WAAa,CAEnB,CAUA,IAAI,WAAY,CAEf,OAAO,KAAK,UAEb,CAEA,IAAI,UAAW3jB,EAAQ,CAEjB,KAAK,WAAa,GAAMA,EAAQ,GAEpC,KAAK,UAIN,KAAK,WAAaA,CAEnB,CAcA,gBAAyE,CAAC,CAc1E,iBAAgD,CAAC,CAWjD,uBAAwB,CAEvB,OAAO,KAAK,gBAAgB,SAAS,CAEtC,CASA,UAAW2U,EAAS,CAEnB,GAAKA,IAAW,OAEhB,QAAYQ,KAAOR,EAAS,CAE3B,IAAMs1B,EAAWt1B,EAAQQ,CAAI,EAE7B,GAAK80B,IAAa,OAAY,CAE7BnrC,GAAM,wBAAyBqW,CAAI,2BAA4B,EAC/D,QAED,CAEA,IAAM+0B,EAAe,KAAM/0B,CAAI,EAE/B,GAAK+0B,IAAiB,OAAY,CAEjCprC,GAAM,cAAeqW,CAAI,gCAAiC,KAAK,IAAK,GAAI,EACxE,QAED,CAEK+0B,GAAgBA,EAAa,QAEjCA,EAAa,IAAKD,CAAS,EAEdC,GAAgBA,EAAa,WAAiBD,GAAYA,EAAS,UAEhFC,EAAa,KAAMD,CAAS,EAI5B,KAAM90B,CAAI,EAAI80B,CAIhB,CAED,CASA,OAAQb,EAAO,CAEd,IAAMC,EAAiBD,IAAS,QAAa,OAAOA,GAAS,SAExDC,IAEJD,EAAO,CACN,SAAU,CAAC,EACX,OAAQ,CAAC,CACV,GAID,IAAM97B,EAAO,CACZ,SAAU,CACT,QAAS,IACT,KAAM,WACN,UAAW,iBACZ,CACD,EAGAA,EAAK,KAAO,KAAK,KACjBA,EAAK,KAAO,KAAK,KAEZ,KAAK,OAAS,KAAKA,EAAK,KAAO,KAAK,MAEpC,KAAK,OAAS,KAAK,MAAM,UAAUA,EAAK,MAAQ,KAAK,MAAM,OAAO,GAElE,KAAK,YAAc,SAAYA,EAAK,UAAY,KAAK,WACrD,KAAK,YAAc,SAAYA,EAAK,UAAY,KAAK,WAErD,KAAK,QAAU,SAAYA,EAAK,MAAQ,KAAK,OAC7C,KAAK,YAAc,KAAK,WAAW,UAAUA,EAAK,WAAa,KAAK,WAAW,OAAO,GACtF,KAAK,iBAAmB,SAAYA,EAAK,eAAiB,KAAK,gBAC/D,KAAK,UAAY,KAAK,SAAS,UAAUA,EAAK,SAAW,KAAK,SAAS,OAAO,GAC9E,KAAK,oBAAsB,QAAa,KAAK,oBAAsB,IAAIA,EAAK,kBAAoB,KAAK,mBAErG,KAAK,UAAY,KAAK,SAAS,UAAUA,EAAK,SAAW,KAAK,SAAS,OAAO,GAC9E,KAAK,oBAAsB,SAAYA,EAAK,kBAAoB,KAAK,mBACrE,KAAK,eAAiB,KAAK,cAAc,UAAUA,EAAK,cAAgB,KAAK,cAAc,OAAO,GAClG,KAAK,YAAc,SAAYA,EAAK,UAAY,KAAK,WACrD,KAAK,YAAc,SAAYA,EAAK,UAAY,KAAK,WACrD,KAAK,qBAAuB,SAAYA,EAAK,mBAAqB,KAAK,oBAEvE,KAAK,cAAgB,KAAK,aAAa,YAE3CA,EAAK,aAAe,KAAK,aAAa,OAAQ87B,CAAK,EAAE,MAIjD,KAAK,uBAAyB,KAAK,sBAAsB,YAE7D97B,EAAK,sBAAwB,KAAK,sBAAsB,OAAQ87B,CAAK,EAAE,MAInE,KAAK,oBAAsB,KAAK,mBAAmB,YAEvD97B,EAAK,mBAAqB,KAAK,mBAAmB,OAAQ87B,CAAK,EAAE,KACjE97B,EAAK,qBAAuB,KAAK,qBAAqB,QAAQ,GAI1D,KAAK,eAAiB,KAAK,cAAc,YAE7CA,EAAK,cAAgB,KAAK,cAAc,OAAQ87B,CAAK,EAAE,MAInD,KAAK,mBAAqB,KAAK,kBAAkB,YAErD97B,EAAK,kBAAoB,KAAK,kBAAkB,OAAQ87B,CAAK,EAAE,MAI3D,KAAK,aAAe,SAAY97B,EAAK,WAAa,KAAK,YAEvD,KAAK,cAAgB,SAAYA,EAAK,YAAc,KAAK,aACzD,KAAK,iBAAmB,SAAYA,EAAK,eAAiB,KAAK,gBAC/D,KAAK,4BAA8B,SAAYA,EAAK,0BAA4B,KAAK,2BAErF,KAAK,gBAAkB,KAAK,eAAe,YAE/CA,EAAK,eAAiB,KAAK,eAAe,OAAQ87B,CAAK,EAAE,MAIrD,KAAK,yBAA2B,KAAK,wBAAwB,YAEjE97B,EAAK,wBAA0B,KAAK,wBAAwB,OAAQ87B,CAAK,EAAE,MAIvE,KAAK,aAAe,SAAY97B,EAAK,WAAa,KAAK,YACvD,KAAK,qBAAuB,SAAYA,EAAK,mBAAqB,KAAK,oBAEvE,KAAK,eAAiB,KAAK,cAAc,YAE7CA,EAAK,cAAgB,KAAK,cAAc,OAAQ87B,CAAK,EAAE,MAInD,KAAK,KAAO,KAAK,IAAI,YAAY97B,EAAK,IAAM,KAAK,IAAI,OAAQ87B,CAAK,EAAE,MACpE,KAAK,QAAU,KAAK,OAAO,YAAY97B,EAAK,OAAS,KAAK,OAAO,OAAQ87B,CAAK,EAAE,MAChF,KAAK,UAAY,KAAK,SAAS,YAAY97B,EAAK,SAAW,KAAK,SAAS,OAAQ87B,CAAK,EAAE,MAExF,KAAK,UAAY,KAAK,SAAS,YAEnC97B,EAAK,SAAW,KAAK,SAAS,OAAQ87B,CAAK,EAAE,KAC7C97B,EAAK,kBAAoB,KAAK,mBAI1B,KAAK,OAAS,KAAK,MAAM,YAE7BA,EAAK,MAAQ,KAAK,MAAM,OAAQ87B,CAAK,EAAE,KACvC97B,EAAK,eAAiB,KAAK,gBAIvB,KAAK,SAAW,KAAK,QAAQ,YAEjCA,EAAK,QAAU,KAAK,QAAQ,OAAQ87B,CAAK,EAAE,KAC3C97B,EAAK,UAAY,KAAK,WAIlB,KAAK,WAAa,KAAK,UAAU,YAErCA,EAAK,UAAY,KAAK,UAAU,OAAQ87B,CAAK,EAAE,KAC/C97B,EAAK,cAAgB,KAAK,cAC1BA,EAAK,YAAc,KAAK,YAAY,QAAQ,GAIxC,KAAK,iBAAmB,KAAK,gBAAgB,YAEjDA,EAAK,gBAAkB,KAAK,gBAAgB,OAAQ87B,CAAK,EAAE,KAC3D97B,EAAK,kBAAoB,KAAK,kBAC9BA,EAAK,iBAAmB,KAAK,kBAIzB,KAAK,cAAgB,KAAK,aAAa,YAAYA,EAAK,aAAe,KAAK,aAAa,OAAQ87B,CAAK,EAAE,MACxG,KAAK,cAAgB,KAAK,aAAa,YAAY97B,EAAK,aAAe,KAAK,aAAa,OAAQ87B,CAAK,EAAE,MAExG,KAAK,aAAe,KAAK,YAAY,YAAY97B,EAAK,YAAc,KAAK,YAAY,OAAQ87B,CAAK,EAAE,MACpG,KAAK,aAAe,KAAK,YAAY,YAAY97B,EAAK,YAAc,KAAK,YAAY,OAAQ87B,CAAK,EAAE,MACpG,KAAK,sBAAwB,KAAK,qBAAqB,YAAY97B,EAAK,qBAAuB,KAAK,qBAAqB,OAAQ87B,CAAK,EAAE,MACxI,KAAK,kBAAoB,KAAK,iBAAiB,YAAY97B,EAAK,iBAAmB,KAAK,iBAAiB,OAAQ87B,CAAK,EAAE,MAExH,KAAK,QAAU,KAAK,OAAO,YAE/B97B,EAAK,OAAS,KAAK,OAAO,OAAQ87B,CAAK,EAAE,KAEpC,KAAK,UAAY,SAAY97B,EAAK,QAAU,KAAK,UAIlD,KAAK,iBAAmB,SAAYA,EAAK,eAAiB,KAAK,eAAe,QAAQ,GACtF,KAAK,kBAAoB,SAAYA,EAAK,gBAAkB,KAAK,iBACjE,KAAK,eAAiB,SAAYA,EAAK,aAAe,KAAK,cAC3D,KAAK,kBAAoB,SAAYA,EAAK,gBAAkB,KAAK,iBAEjE,KAAK,aAAe,KAAK,YAAY,YAEzCA,EAAK,YAAc,KAAK,YAAY,OAAQ87B,CAAK,EAAE,MAI/C,KAAK,eAAiB,SAAY97B,EAAK,aAAe,KAAK,cAC3D,KAAK,iBAAmB,KAAK,gBAAgB,YAAYA,EAAK,gBAAkB,KAAK,gBAAgB,OAAQ87B,CAAK,EAAE,MACpH,KAAK,YAAc,SAAY97B,EAAK,UAAY,KAAK,WACrD,KAAK,cAAgB,KAAK,aAAa,YAAYA,EAAK,aAAe,KAAK,aAAa,OAAQ87B,CAAK,EAAE,MACxG,KAAK,sBAAwB,QAAa,KAAK,sBAAwB,MAAW97B,EAAK,oBAAsB,KAAK,qBAClH,KAAK,mBAAqB,SAAYA,EAAK,iBAAmB,KAAK,iBAAiB,OAAO,GAE3F,KAAK,OAAS,SAAYA,EAAK,KAAO,KAAK,MAC3C,KAAK,aAAe,OAAOA,EAAK,WAAa,KAAK,YAClD,KAAK,kBAAoB,SAAYA,EAAK,gBAAkB,KAAK,iBAEjE,KAAK,WAAayQ,KAAiBzQ,EAAK,SAAW,KAAK,UACxD,KAAK,OAAS5F,KAAY4F,EAAK,KAAO,KAAK,MAC3C,KAAK,eAAiB,KAAOA,EAAK,aAAe,IAEjD,KAAK,QAAU,IAAIA,EAAK,QAAU,KAAK,SACvC,KAAK,cAAgB,KAAOA,EAAK,YAAc,IAE/C,KAAK,WAAauR,KAAiBvR,EAAK,SAAW,KAAK,UACxD,KAAK,WAAawR,KAAyBxR,EAAK,SAAW,KAAK,UAChE,KAAK,gBAAkB8Q,KAAc9Q,EAAK,cAAgB,KAAK,eAC/D,KAAK,gBAAkB,OAAOA,EAAK,cAAgB,KAAK,eACxD,KAAK,gBAAkB,OAAOA,EAAK,cAAgB,KAAK,eACxD,KAAK,qBAAuB,OAAOA,EAAK,mBAAqB,KAAK,oBAClE,KAAK,YAAc,KAAK,WAAW,UAAUA,EAAK,WAAa,KAAK,WAAW,OAAO,GACtF,KAAK,aAAe,IAAIA,EAAK,WAAa,KAAK,YAE/C,KAAK,YAAcqS,KAAiBrS,EAAK,UAAY,KAAK,WAC1D,KAAK,YAAc,KAAQA,EAAK,UAAY,KAAK,WACjD,KAAK,aAAe,KAAQA,EAAK,WAAa,KAAK,YACnD,KAAK,aAAe,KAAQA,EAAK,WAAa,KAAK,YAEnD,KAAK,mBAAqB,MAAOA,EAAK,iBAAmB,KAAK,kBAC9D,KAAK,cAAgBmX,KAAoBnX,EAAK,YAAc,KAAK,aACjE,KAAK,aAAe,IAAIA,EAAK,WAAa,KAAK,YAC/C,KAAK,kBAAoB,MAAOA,EAAK,gBAAkB,KAAK,iBAC5D,KAAK,cAAgBqW,KAAgBrW,EAAK,YAAc,KAAK,aAC7D,KAAK,eAAiBqW,KAAgBrW,EAAK,aAAe,KAAK,cAC/D,KAAK,eAAiBqW,KAAgBrW,EAAK,aAAe,KAAK,cAC/D,KAAK,eAAiB,KAAOA,EAAK,aAAe,KAAK,cAGtD,KAAK,WAAa,QAAa,KAAK,WAAa,IAAIA,EAAK,SAAW,KAAK,UAE1E,KAAK,gBAAkB,KAAOA,EAAK,cAAgB,IACnD,KAAK,sBAAwB,IAAIA,EAAK,oBAAsB,KAAK,qBACjE,KAAK,qBAAuB,IAAIA,EAAK,mBAAqB,KAAK,oBAE/D,KAAK,YAAc,QAAa,KAAK,YAAc,IAAIA,EAAK,UAAY,KAAK,WAC7E,KAAK,WAAa,SAAYA,EAAK,SAAW,KAAK,UACnD,KAAK,UAAY,SAAYA,EAAK,QAAU,KAAK,SACjD,KAAK,QAAU,SAAYA,EAAK,MAAQ,KAAK,OAE7C,KAAK,YAAc,KAAOA,EAAK,UAAY,IAE3C,KAAK,UAAY,IAAIA,EAAK,UAAY,KAAK,WAC3C,KAAK,YAAc,KAAOA,EAAK,UAAY,IAC3C,KAAK,kBAAoB,KAAOA,EAAK,gBAAkB,IACvD,KAAK,qBAAuB,KAAOA,EAAK,mBAAqB,IAC7D,KAAK,kBAAoB,KAAOA,EAAK,gBAAkB,IACvD,KAAK,gBAAkB,KAAQA,EAAK,cAAgB,IAEpD,KAAK,YAAc,KAAOA,EAAK,UAAY,IAC3C,KAAK,mBAAqB,IAAIA,EAAK,mBAAqB,KAAK,oBAC7D,KAAK,mBAAqB,UAAUA,EAAK,iBAAmB,KAAK,kBACjE,KAAK,oBAAsB,UAAUA,EAAK,kBAAoB,KAAK,mBAEnE,KAAK,cAAgB,KAAOA,EAAK,YAAc,IAE/C,KAAK,UAAY,KAAQA,EAAK,QAAU,IAExC,KAAK,aAAe,KAAQA,EAAK,WAAa,IAE9C,KAAK,MAAQ,KAAQA,EAAK,IAAM,IAEhC,OAAO,KAAM,KAAK,QAAS,EAAE,OAAS,IAAIA,EAAK,SAAW,KAAK,UAIpE,SAASulC,EAAkBO,EAAQ,CAElC,IAAMz+B,EAAS,CAAC,EAEhB,QAAYQ,KAAOi+B,EAAQ,CAE1B,IAAM9lC,EAAO8lC,EAAOj+B,CAAI,EACxB,OAAO7H,EAAK,SACZqH,EAAO,KAAMrH,CAAK,CAEnB,CAEA,OAAOqH,CAER,CAEA,GAAK00B,EAAe,CAEnB,IAAM0J,EAAWF,EAAkBzJ,EAAK,QAAS,EAC3C4J,EAASH,EAAkBzJ,EAAK,MAAO,EAExC2J,EAAS,OAAS,IAAIzlC,EAAK,SAAWylC,GACtCC,EAAO,OAAS,IAAI1lC,EAAK,OAAS0lC,EAExC,CAEA,OAAO1lC,CAER,CAOA,OAAQ,CAEP,OAAO,IAAI,KAAK,YAAY,EAAE,KAAM,IAAK,CAE1C,CAQA,KAAM08B,EAAS,CAEd,KAAK,KAAOA,EAAO,KAEnB,KAAK,SAAWA,EAAO,SACvB,KAAK,KAAOA,EAAO,KACnB,KAAK,aAAeA,EAAO,aAE3B,KAAK,QAAUA,EAAO,QACtB,KAAK,YAAcA,EAAO,YAE1B,KAAK,SAAWA,EAAO,SACvB,KAAK,SAAWA,EAAO,SACvB,KAAK,cAAgBA,EAAO,cAC5B,KAAK,cAAgBA,EAAO,cAC5B,KAAK,cAAgBA,EAAO,cAC5B,KAAK,mBAAqBA,EAAO,mBACjC,KAAK,WAAW,KAAMA,EAAO,UAAW,EACxC,KAAK,WAAaA,EAAO,WAEzB,KAAK,UAAYA,EAAO,UACxB,KAAK,UAAYA,EAAO,UACxB,KAAK,WAAaA,EAAO,WAEzB,KAAK,iBAAmBA,EAAO,iBAC/B,KAAK,YAAcA,EAAO,YAC1B,KAAK,WAAaA,EAAO,WACzB,KAAK,gBAAkBA,EAAO,gBAC9B,KAAK,YAAcA,EAAO,YAC1B,KAAK,aAAeA,EAAO,aAC3B,KAAK,aAAeA,EAAO,aAC3B,KAAK,aAAeA,EAAO,aAE3B,IAAMqL,EAAYrL,EAAO,eACrBsL,EAAY,KAEhB,GAAKD,IAAc,KAAO,CAEzB,IAAMj1C,EAAIi1C,EAAU,OACpBC,EAAY,IAAI,MAAOl1C,CAAE,EAEzB,QAAUvC,EAAI,EAAGA,IAAMuC,EAAG,EAAGvC,EAE5By3C,EAAWz3C,CAAE,EAAIw3C,EAAWx3C,CAAE,EAAE,MAAM,CAIxC,CAEA,YAAK,eAAiBy3C,EACtB,KAAK,iBAAmBtL,EAAO,iBAC/B,KAAK,YAAcA,EAAO,YAE1B,KAAK,WAAaA,EAAO,WAEzB,KAAK,WAAaA,EAAO,WAEzB,KAAK,UAAYA,EAAO,UAExB,KAAK,cAAgBA,EAAO,cAC5B,KAAK,oBAAsBA,EAAO,oBAClC,KAAK,mBAAqBA,EAAO,mBAEjC,KAAK,UAAYA,EAAO,UAExB,KAAK,UAAYA,EAAO,UACxB,KAAK,UAAYA,EAAO,UACxB,KAAK,gBAAkBA,EAAO,gBAC9B,KAAK,mBAAqBA,EAAO,mBACjC,KAAK,gBAAkBA,EAAO,gBAC9B,KAAK,cAAgBA,EAAO,cAE5B,KAAK,QAAUA,EAAO,QAEtB,KAAK,WAAaA,EAAO,WAEzB,KAAK,SAAW,KAAK,MAAO,KAAK,UAAWA,EAAO,QAAS,CAAE,EAEvD,IAER,CAQA,SAAU,CAQT,KAAK,cAAe,CAAE,KAAM,SAAU,CAAE,CAEzC,CAUA,IAAI,YAAahqC,EAAQ,CAEnBA,IAAU,IAAO,KAAK,SAE5B,CAED,EAUM8rB,GAAN,cAAgCD,EAAS,CAWxC,YAAa4mB,EAAa,CAEzB,MAAM,EASN,KAAK,oBAAsB,GAE3B,KAAK,KAAO,oBAQZ,KAAK,MAAQ,IAAI/mB,GAAO,QAAS,EAUjC,KAAK,IAAM,KAQX,KAAK,SAAW,KAQhB,KAAK,kBAAoB,EASzB,KAAK,MAAQ,KAUb,KAAK,eAAiB,EAQtB,KAAK,YAAc,KAenB,KAAK,SAAW,KAQhB,KAAK,OAAS,KAQd,KAAK,eAAiB,IAAIlC,GAW1B,KAAK,QAAUxJ,GASf,KAAK,aAAe,EAWpB,KAAK,gBAAkB,IAQvB,KAAK,UAAY,GAUjB,KAAK,mBAAqB,EAU1B,KAAK,iBAAmB,QAUxB,KAAK,kBAAoB,QAQzB,KAAK,IAAM,GAEX,KAAK,UAAWyyB,CAAW,CAE5B,CAEA,KAAMzI,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,MAAM,KAAMA,EAAO,KAAM,EAE9B,KAAK,IAAMA,EAAO,IAElB,KAAK,SAAWA,EAAO,SACvB,KAAK,kBAAoBA,EAAO,kBAEhC,KAAK,MAAQA,EAAO,MACpB,KAAK,eAAiBA,EAAO,eAE7B,KAAK,YAAcA,EAAO,YAE1B,KAAK,SAAWA,EAAO,SAEvB,KAAK,OAASA,EAAO,OACrB,KAAK,eAAe,KAAMA,EAAO,cAAe,EAChD,KAAK,QAAUA,EAAO,QACtB,KAAK,aAAeA,EAAO,aAC3B,KAAK,gBAAkBA,EAAO,gBAE9B,KAAK,UAAYA,EAAO,UACxB,KAAK,mBAAqBA,EAAO,mBACjC,KAAK,iBAAmBA,EAAO,iBAC/B,KAAK,kBAAoBA,EAAO,kBAEhC,KAAK,IAAMA,EAAO,IAEX,IAER,CAED,EAIMpjC,GAAwBX,IAAgB,EAiLxC8lB,GAAN,KAAgB,CASf,OAAO,YAAaplB,EAAM,CAEzB,OAAOD,GAAaC,CAAI,CAEzB,CASA,OAAO,cAAeA,EAAM,CAE3B,OAAOG,GAAeH,CAAI,CAE3B,CAED,EAEMqlB,GAA0B,IAAIzjB,EAC9B0jB,GAA2B,IAAIxjB,GAEjCyjB,IAAQ,EAUNC,GAAN,KAAsB,CASrB,YAAavuB,EAAOyM,EAAUkrC,EAAa,GAAQ,CAElD,GAAK,MAAM,QAAS33C,CAAM,EAEzB,MAAM,IAAI,UAAW,uDAAwD,EAW9E,KAAK,kBAAoB,GASzB,OAAO,eAAgB,KAAM,KAAM,CAAE,MAAOsuB,KAAS,CAAE,EAOvD,KAAK,KAAO,GAQZ,KAAK,MAAQtuB,EASb,KAAK,SAAWyM,EAShB,KAAK,MAAQzM,IAAU,OAAYA,EAAM,OAASyM,EAAW,EAW7D,KAAK,WAAakrC,EAWlB,KAAK,MAAQrwB,GAQb,KAAK,aAAe,CAAC,EAWrB,KAAK,QAAUnI,GAOf,KAAK,QAAU,CAEhB,CAMA,kBAAmB,CAAC,CAUpB,IAAI,YAAa/c,EAAQ,CAEnBA,IAAU,IAAO,KAAK,SAE5B,CAQA,SAAUA,EAAQ,CAEjB,YAAK,MAAQA,EAEN,IAER,CAQA,eAAgBqO,EAAO07B,EAAQ,CAE9B,KAAK,aAAa,KAAM,CAAE,MAAA17B,EAAO,MAAA07B,CAAM,CAAE,CAE1C,CAKA,mBAAoB,CAEnB,KAAK,aAAa,OAAS,CAE5B,CAQA,KAAMC,EAAS,CAEd,YAAK,KAAOA,EAAO,KACnB,KAAK,MAAQ,IAAIA,EAAO,MAAM,YAAaA,EAAO,KAAM,EACxD,KAAK,SAAWA,EAAO,SACvB,KAAK,MAAQA,EAAO,MACpB,KAAK,WAAaA,EAAO,WAEzB,KAAK,MAAQA,EAAO,MACpB,KAAK,QAAUA,EAAO,QAEf,IAER,CAYA,OAAQwL,EAAQvT,EAAWwT,EAAS,CAEnCD,GAAU,KAAK,SACfC,GAAUxT,EAAU,SAEpB,QAAUpkC,EAAI,EAAG4V,EAAI,KAAK,SAAU5V,EAAI4V,EAAG5V,IAE1C,KAAK,MAAO23C,EAAS33C,CAAE,EAAIokC,EAAU,MAAOwT,EAAS53C,CAAE,EAIxD,OAAO,IAER,CAQA,UAAWD,EAAQ,CAElB,YAAK,MAAM,IAAKA,CAAM,EAEf,IAER,CASA,aAAcyC,EAAI,CAEjB,GAAK,KAAK,WAAa,EAEtB,QAAUxC,EAAI,EAAG4V,EAAI,KAAK,MAAO5V,EAAI4V,EAAG5V,IAEvCouB,GAAW,oBAAqB,KAAMpuB,CAAE,EACxCouB,GAAW,aAAc5rB,CAAE,EAE3B,KAAK,MAAOxC,EAAGouB,GAAW,EAAGA,GAAW,CAAE,UAIhC,KAAK,WAAa,EAE7B,QAAUpuB,EAAI,EAAG4V,EAAI,KAAK,MAAO5V,EAAI4V,EAAG5V,IAEvCmuB,GAAU,oBAAqB,KAAMnuB,CAAE,EACvCmuB,GAAU,aAAc3rB,CAAE,EAE1B,KAAK,OAAQxC,EAAGmuB,GAAU,EAAGA,GAAU,EAAGA,GAAU,CAAE,EAMxD,OAAO,IAER,CASA,aAAc3rB,EAAI,CAEjB,QAAUxC,EAAI,EAAG4V,EAAI,KAAK,MAAO5V,EAAI4V,EAAG5V,IAEvCmuB,GAAU,oBAAqB,KAAMnuB,CAAE,EAEvCmuB,GAAU,aAAc3rB,CAAE,EAE1B,KAAK,OAAQxC,EAAGmuB,GAAU,EAAGA,GAAU,EAAGA,GAAU,CAAE,EAIvD,OAAO,IAER,CASA,kBAAmB3rB,EAAI,CAEtB,QAAUxC,EAAI,EAAG4V,EAAI,KAAK,MAAO5V,EAAI4V,EAAG5V,IAEvCmuB,GAAU,oBAAqB,KAAMnuB,CAAE,EAEvCmuB,GAAU,kBAAmB3rB,CAAE,EAE/B,KAAK,OAAQxC,EAAGmuB,GAAU,EAAGA,GAAU,EAAGA,GAAU,CAAE,EAIvD,OAAO,IAER,CASA,mBAAoB3rB,EAAI,CAEvB,QAAUxC,EAAI,EAAG4V,EAAI,KAAK,MAAO5V,EAAI4V,EAAG5V,IAEvCmuB,GAAU,oBAAqB,KAAMnuB,CAAE,EAEvCmuB,GAAU,mBAAoB3rB,CAAE,EAEhC,KAAK,OAAQxC,EAAGmuB,GAAU,EAAGA,GAAU,EAAGA,GAAU,CAAE,EAIvD,OAAO,IAER,CASA,IAAKhsB,EAAOgiC,EAAS,EAAI,CAGxB,YAAK,MAAM,IAAKhiC,EAAOgiC,CAAO,EAEvB,IAER,CASA,aAAc/2B,EAAOyqC,EAAY,CAEhC,IAAI11C,EAAQ,KAAK,MAAOiL,EAAQ,KAAK,SAAWyqC,CAAU,EAE1D,OAAK,KAAK,aAAa11C,EAAQyD,GAAazD,EAAO,KAAK,KAAM,GAEvDA,CAER,CAUA,aAAciL,EAAOyqC,EAAW11C,EAAQ,CAEvC,OAAK,KAAK,aAAaA,EAAQ0D,GAAW1D,EAAO,KAAK,KAAM,GAE5D,KAAK,MAAOiL,EAAQ,KAAK,SAAWyqC,CAAU,EAAI11C,EAE3C,IAER,CAQA,KAAMiL,EAAQ,CAEb,IAAI1K,EAAI,KAAK,MAAO0K,EAAQ,KAAK,QAAS,EAE1C,OAAK,KAAK,aAAa1K,EAAIkD,GAAalD,EAAG,KAAK,KAAM,GAE/CA,CAER,CASA,KAAM0K,EAAO1K,EAAI,CAEhB,OAAK,KAAK,aAAaA,EAAImD,GAAWnD,EAAG,KAAK,KAAM,GAEpD,KAAK,MAAO0K,EAAQ,KAAK,QAAS,EAAI1K,EAE/B,IAER,CAQA,KAAM0K,EAAQ,CAEb,IAAIpK,EAAI,KAAK,MAAOoK,EAAQ,KAAK,SAAW,CAAE,EAE9C,OAAK,KAAK,aAAapK,EAAI4C,GAAa5C,EAAG,KAAK,KAAM,GAE/CA,CAER,CASA,KAAMoK,EAAOpK,EAAI,CAEhB,OAAK,KAAK,aAAaA,EAAI6C,GAAW7C,EAAG,KAAK,KAAM,GAEpD,KAAK,MAAOoK,EAAQ,KAAK,SAAW,CAAE,EAAIpK,EAEnC,IAER,CAQA,KAAMoK,EAAQ,CAEb,IAAI0N,EAAI,KAAK,MAAO1N,EAAQ,KAAK,SAAW,CAAE,EAE9C,OAAK,KAAK,aAAa0N,EAAIlV,GAAakV,EAAG,KAAK,KAAM,GAE/CA,CAER,CASA,KAAM1N,EAAO0N,EAAI,CAEhB,OAAK,KAAK,aAAaA,EAAIjV,GAAWiV,EAAG,KAAK,KAAM,GAEpD,KAAK,MAAO1N,EAAQ,KAAK,SAAW,CAAE,EAAI0N,EAEnC,IAER,CAQA,KAAM1N,EAAQ,CAEb,IAAIk3B,EAAI,KAAK,MAAOl3B,EAAQ,KAAK,SAAW,CAAE,EAE9C,OAAK,KAAK,aAAak3B,EAAI1+B,GAAa0+B,EAAG,KAAK,KAAM,GAE/CA,CAER,CASA,KAAMl3B,EAAOk3B,EAAI,CAEhB,OAAK,KAAK,aAAaA,EAAIz+B,GAAWy+B,EAAG,KAAK,KAAM,GAEpD,KAAK,MAAOl3B,EAAQ,KAAK,SAAW,CAAE,EAAIk3B,EAEnC,IAER,CAUA,MAAOl3B,EAAO1K,EAAGM,EAAI,CAEpB,OAAAoK,GAAS,KAAK,SAET,KAAK,aAET1K,EAAImD,GAAWnD,EAAG,KAAK,KAAM,EAC7BM,EAAI6C,GAAW7C,EAAG,KAAK,KAAM,GAI9B,KAAK,MAAOoK,EAAQ,CAAE,EAAI1K,EAC1B,KAAK,MAAO0K,EAAQ,CAAE,EAAIpK,EAEnB,IAER,CAWA,OAAQoK,EAAO1K,EAAGM,EAAG8X,EAAI,CAExB,OAAA1N,GAAS,KAAK,SAET,KAAK,aAET1K,EAAImD,GAAWnD,EAAG,KAAK,KAAM,EAC7BM,EAAI6C,GAAW7C,EAAG,KAAK,KAAM,EAC7B8X,EAAIjV,GAAWiV,EAAG,KAAK,KAAM,GAI9B,KAAK,MAAO1N,EAAQ,CAAE,EAAI1K,EAC1B,KAAK,MAAO0K,EAAQ,CAAE,EAAIpK,EAC1B,KAAK,MAAOoK,EAAQ,CAAE,EAAI0N,EAEnB,IAER,CAYA,QAAS1N,EAAO1K,EAAGM,EAAG8X,EAAGwpB,EAAI,CAE5B,OAAAl3B,GAAS,KAAK,SAET,KAAK,aAET1K,EAAImD,GAAWnD,EAAG,KAAK,KAAM,EAC7BM,EAAI6C,GAAW7C,EAAG,KAAK,KAAM,EAC7B8X,EAAIjV,GAAWiV,EAAG,KAAK,KAAM,EAC7BwpB,EAAIz+B,GAAWy+B,EAAG,KAAK,KAAM,GAI9B,KAAK,MAAOl3B,EAAQ,CAAE,EAAI1K,EAC1B,KAAK,MAAO0K,EAAQ,CAAE,EAAIpK,EAC1B,KAAK,MAAOoK,EAAQ,CAAE,EAAI0N,EAC1B,KAAK,MAAO1N,EAAQ,CAAE,EAAIk3B,EAEnB,IAER,CAUA,SAAU6C,EAAW,CAEpB,YAAK,iBAAmBA,EAEjB,IAER,CAOA,OAAQ,CAEP,OAAO,IAAI,KAAK,YAAa,KAAK,MAAO,KAAK,QAAS,EAAE,KAAM,IAAK,CAErE,CAOA,QAAS,CAER,IAAM13B,EAAO,CACZ,SAAU,KAAK,SACf,KAAM,KAAK,MAAM,YAAY,KAC7B,MAAO,MAAM,KAAM,KAAK,KAAM,EAC9B,WAAY,KAAK,UAClB,EAEA,OAAK,KAAK,OAAS,KAAKA,EAAK,KAAO,KAAK,MACpC,KAAK,QAAU4X,KAAkB5X,EAAK,MAAQ,KAAK,OAEjDA,CAER,CAED,EAQM8e,GAAN,cAAkCD,EAAgB,CASjD,YAAavuB,EAAOyM,EAAUkrC,EAAa,CAE1C,MAAO,IAAI,UAAW33C,CAAM,EAAGyM,EAAUkrC,CAAW,CAErD,CAED,EAQMlpB,GAAN,cAAmCF,EAAgB,CASlD,YAAavuB,EAAOyM,EAAUkrC,EAAa,CAE1C,MAAO,IAAI,WAAY33C,CAAM,EAAGyM,EAAUkrC,CAAW,CAEtD,CAED,EAQMjpB,GAAN,cAA0CH,EAAgB,CASzD,YAAavuB,EAAOyM,EAAUkrC,EAAa,CAE1C,MAAO,IAAI,kBAAmB33C,CAAM,EAAGyM,EAAUkrC,CAAW,CAE7D,CAED,EAQMhpB,GAAN,cAAmCJ,EAAgB,CASlD,YAAavuB,EAAOyM,EAAUkrC,EAAa,CAE1C,MAAO,IAAI,WAAY33C,CAAM,EAAGyM,EAAUkrC,CAAW,CAEtD,CAED,EAQM/oB,GAAN,cAAoCL,EAAgB,CASnD,YAAavuB,EAAOyM,EAAUkrC,EAAa,CAE1C,MAAO,IAAI,YAAa33C,CAAM,EAAGyM,EAAUkrC,CAAW,CAEvD,CAED,EAQM9oB,GAAN,cAAmCN,EAAgB,CASlD,YAAavuB,EAAOyM,EAAUkrC,EAAa,CAE1C,MAAO,IAAI,WAAY33C,CAAM,EAAGyM,EAAUkrC,CAAW,CAEtD,CAED,EAQM7oB,GAAN,cAAoCP,EAAgB,CASnD,YAAavuB,EAAOyM,EAAUkrC,EAAa,CAE1C,MAAO,IAAI,YAAa33C,CAAM,EAAGyM,EAAUkrC,CAAW,CAEvD,CAED,EAWM5oB,GAAN,cAAqCR,EAAgB,CASpD,YAAavuB,EAAOyM,EAAUkrC,EAAa,CAE1C,MAAO,IAAI,YAAa33C,CAAM,EAAGyM,EAAUkrC,CAAW,EAEtD,KAAK,yBAA2B,EAEjC,CAEA,KAAMtqC,EAAQ,CAEb,IAAI1K,EAAIuG,GAAe,KAAK,MAAOmE,EAAQ,KAAK,QAAS,CAAE,EAE3D,OAAK,KAAK,aAAa1K,EAAIkD,GAAalD,EAAG,KAAK,KAAM,GAE/CA,CAER,CAEA,KAAM0K,EAAO1K,EAAI,CAEhB,OAAK,KAAK,aAAaA,EAAImD,GAAWnD,EAAG,KAAK,KAAM,GAEpD,KAAK,MAAO0K,EAAQ,KAAK,QAAS,EAAIvE,GAAanG,CAAE,EAE9C,IAER,CAEA,KAAM0K,EAAQ,CAEb,IAAIpK,EAAIiG,GAAe,KAAK,MAAOmE,EAAQ,KAAK,SAAW,CAAE,CAAE,EAE/D,OAAK,KAAK,aAAapK,EAAI4C,GAAa5C,EAAG,KAAK,KAAM,GAE/CA,CAER,CAEA,KAAMoK,EAAOpK,EAAI,CAEhB,OAAK,KAAK,aAAaA,EAAI6C,GAAW7C,EAAG,KAAK,KAAM,GAEpD,KAAK,MAAOoK,EAAQ,KAAK,SAAW,CAAE,EAAIvE,GAAa7F,CAAE,EAElD,IAER,CAEA,KAAMoK,EAAQ,CAEb,IAAI0N,EAAI7R,GAAe,KAAK,MAAOmE,EAAQ,KAAK,SAAW,CAAE,CAAE,EAE/D,OAAK,KAAK,aAAa0N,EAAIlV,GAAakV,EAAG,KAAK,KAAM,GAE/CA,CAER,CAEA,KAAM1N,EAAO0N,EAAI,CAEhB,OAAK,KAAK,aAAaA,EAAIjV,GAAWiV,EAAG,KAAK,KAAM,GAEpD,KAAK,MAAO1N,EAAQ,KAAK,SAAW,CAAE,EAAIvE,GAAaiS,CAAE,EAElD,IAER,CAEA,KAAM1N,EAAQ,CAEb,IAAIk3B,EAAIr7B,GAAe,KAAK,MAAOmE,EAAQ,KAAK,SAAW,CAAE,CAAE,EAE/D,OAAK,KAAK,aAAak3B,EAAI1+B,GAAa0+B,EAAG,KAAK,KAAM,GAE/CA,CAER,CAEA,KAAMl3B,EAAOk3B,EAAI,CAEhB,OAAK,KAAK,aAAaA,EAAIz+B,GAAWy+B,EAAG,KAAK,KAAM,GAEpD,KAAK,MAAOl3B,EAAQ,KAAK,SAAW,CAAE,EAAIvE,GAAay7B,CAAE,EAElD,IAER,CAEA,MAAOl3B,EAAO1K,EAAGM,EAAI,CAEpB,OAAAoK,GAAS,KAAK,SAET,KAAK,aAET1K,EAAImD,GAAWnD,EAAG,KAAK,KAAM,EAC7BM,EAAI6C,GAAW7C,EAAG,KAAK,KAAM,GAI9B,KAAK,MAAOoK,EAAQ,CAAE,EAAIvE,GAAanG,CAAE,EACzC,KAAK,MAAO0K,EAAQ,CAAE,EAAIvE,GAAa7F,CAAE,EAElC,IAER,CAEA,OAAQoK,EAAO1K,EAAGM,EAAG8X,EAAI,CAExB,OAAA1N,GAAS,KAAK,SAET,KAAK,aAET1K,EAAImD,GAAWnD,EAAG,KAAK,KAAM,EAC7BM,EAAI6C,GAAW7C,EAAG,KAAK,KAAM,EAC7B8X,EAAIjV,GAAWiV,EAAG,KAAK,KAAM,GAI9B,KAAK,MAAO1N,EAAQ,CAAE,EAAIvE,GAAanG,CAAE,EACzC,KAAK,MAAO0K,EAAQ,CAAE,EAAIvE,GAAa7F,CAAE,EACzC,KAAK,MAAOoK,EAAQ,CAAE,EAAIvE,GAAaiS,CAAE,EAElC,IAER,CAEA,QAAS1N,EAAO1K,EAAGM,EAAG8X,EAAGwpB,EAAI,CAE5B,OAAAl3B,GAAS,KAAK,SAET,KAAK,aAET1K,EAAImD,GAAWnD,EAAG,KAAK,KAAM,EAC7BM,EAAI6C,GAAW7C,EAAG,KAAK,KAAM,EAC7B8X,EAAIjV,GAAWiV,EAAG,KAAK,KAAM,EAC7BwpB,EAAIz+B,GAAWy+B,EAAG,KAAK,KAAM,GAI9B,KAAK,MAAOl3B,EAAQ,CAAE,EAAIvE,GAAanG,CAAE,EACzC,KAAK,MAAO0K,EAAQ,CAAE,EAAIvE,GAAa7F,CAAE,EACzC,KAAK,MAAOoK,EAAQ,CAAE,EAAIvE,GAAaiS,CAAE,EACzC,KAAK,MAAO1N,EAAQ,CAAE,EAAIvE,GAAay7B,CAAE,EAElC,IAER,CAED,EAQMvV,GAAN,cAAqCT,EAAgB,CASpD,YAAavuB,EAAOyM,EAAUkrC,EAAa,CAE1C,MAAO,IAAI,aAAc33C,CAAM,EAAGyM,EAAUkrC,CAAW,CAExD,CAED,EAEI1oB,IAAQ,EAENC,GAAoB,IAAIhE,GACxBiE,GAAqB,IAAItC,GACzBuC,GAAwB,IAAIzkB,EAC5B0kB,GAAuB,IAAI5F,GAC3B6F,GAAiC,IAAI7F,GACrC8F,GAA0B,IAAI5kB,EA4B9B6kB,GAAN,MAAMuoB,UAAuBzvB,EAAgB,CAK5C,aAAc,CAEb,MAAM,EASN,KAAK,iBAAmB,GASxB,OAAO,eAAgB,KAAM,KAAM,CAAE,MAAO2G,KAAS,CAAE,EAQvD,KAAK,KAAOptB,GAAa,EAOzB,KAAK,KAAO,GACZ,KAAK,KAAO,iBAYZ,KAAK,MAAQ,KAWb,KAAK,SAAW,KAUhB,KAAK,eAAiB,EAStB,KAAK,WAAa,CAAC,EAUnB,KAAK,gBAAkB,CAAC,EAUxB,KAAK,qBAAuB,GAa5B,KAAK,OAAS,CAAC,EAQf,KAAK,YAAc,KAQnB,KAAK,eAAiB,KAQtB,KAAK,UAAY,CAAE,MAAO,EAAG,MAAO,GAAS,EAQ7C,KAAK,SAAW,CAAC,CAElB,CAOA,UAAW,CAEV,OAAO,KAAK,KAEb,CAQA,SAAUwL,EAAQ,CAEjB,OAAK,MAAM,QAASA,CAAM,EAEzB,KAAK,MAAQ,IAAMtN,GAAkBsN,CAAM,EAAIyhB,GAAwBF,IAAyBvhB,EAAO,CAAE,EAIzG,KAAK,MAAQA,EAIP,IAER,CASA,YAAa2qC,EAAUC,EAAiB,EAAI,CAE3C,YAAK,SAAWD,EAChB,KAAK,eAAiBC,EAEf,IAER,CAOA,aAAc,CAEb,OAAO,KAAK,QAEb,CASA,aAAcz3C,EAAO,CAEpB,OAAO,KAAK,WAAYA,CAAK,CAE9B,CASA,aAAcA,EAAM6jC,EAAY,CAE/B,YAAK,WAAY7jC,CAAK,EAAI6jC,EAEnB,IAER,CAQA,gBAAiB7jC,EAAO,CAEvB,cAAO,KAAK,WAAYA,CAAK,EAEtB,IAER,CAQA,aAAcA,EAAO,CAEpB,OAAO,KAAK,WAAYA,CAAK,IAAM,MAEpC,CAUA,SAAUiQ,EAAO07B,EAAO+L,EAAgB,EAAI,CAE3C,KAAK,OAAO,KAAM,CAEjB,MAAOznC,EACP,MAAO07B,EACP,cAAe+L,CAEhB,CAAE,CAEH,CAKA,aAAc,CAEb,KAAK,OAAS,CAAC,CAEhB,CASA,aAAcznC,EAAO07B,EAAQ,CAE5B,KAAK,UAAU,MAAQ17B,EACvB,KAAK,UAAU,MAAQ07B,CAExB,CAQA,aAAcd,EAAS,CAEtB,IAAMpwB,EAAW,KAAK,WAAW,SAE5BA,IAAa,SAEjBA,EAAS,aAAcowB,CAAO,EAE9BpwB,EAAS,YAAc,IAIxB,IAAM7Q,EAAS,KAAK,WAAW,OAE/B,GAAKA,IAAW,OAAY,CAE3B,IAAM+tC,EAAe,IAAIzvB,GAAQ,EAAE,gBAAiB2iB,CAAO,EAE3DjhC,EAAO,kBAAmB+tC,CAAa,EAEvC/tC,EAAO,YAAc,EAEtB,CAEA,IAAMguC,EAAU,KAAK,WAAW,QAEhC,OAAKA,IAAY,SAEhBA,EAAQ,mBAAoB/M,CAAO,EAEnC+M,EAAQ,YAAc,IAIlB,KAAK,cAAgB,MAEzB,KAAK,mBAAmB,EAIpB,KAAK,iBAAmB,MAE5B,KAAK,sBAAsB,EAIrB,IAER,CAQA,gBAAiBtzC,EAAI,CAEpB,OAAAoqB,GAAI,2BAA4BpqB,CAAE,EAElC,KAAK,aAAcoqB,EAAI,EAEhB,IAER,CAUA,QAASoV,EAAQ,CAIhB,OAAApV,GAAI,cAAeoV,CAAM,EAEzB,KAAK,aAAcpV,EAAI,EAEhB,IAER,CAUA,QAASoV,EAAQ,CAIhB,OAAApV,GAAI,cAAeoV,CAAM,EAEzB,KAAK,aAAcpV,EAAI,EAEhB,IAER,CAUA,QAASoV,EAAQ,CAIhB,OAAApV,GAAI,cAAeoV,CAAM,EAEzB,KAAK,aAAcpV,EAAI,EAEhB,IAER,CAYA,UAAWvsB,EAAGM,EAAG8X,EAAI,CAIpB,OAAAmU,GAAI,gBAAiBvsB,EAAGM,EAAG8X,CAAE,EAE7B,KAAK,aAAcmU,EAAI,EAEhB,IAER,CAYA,MAAOvsB,EAAGM,EAAG8X,EAAI,CAIhB,OAAAmU,GAAI,UAAWvsB,EAAGM,EAAG8X,CAAE,EAEvB,KAAK,aAAcmU,EAAI,EAEhB,IAER,CAUA,OAAQoe,EAAS,CAEhB,OAAAne,GAAK,OAAQme,CAAO,EAEpBne,GAAK,aAAa,EAElB,KAAK,aAAcA,GAAK,MAAO,EAExB,IAER,CAOA,QAAS,CAER,YAAK,mBAAmB,EAExB,KAAK,YAAY,UAAWC,EAAQ,EAAE,OAAO,EAE7C,KAAK,UAAWA,GAAQ,EAAGA,GAAQ,EAAGA,GAAQ,CAAE,EAEzC,IAER,CAaA,cAAexZ,EAAS,CAEvB,IAAM7I,EAAoB,KAAK,aAAc,UAAW,EAExD,GAAKA,IAAsB,OAAY,CAEtC,IAAMkO,EAAW,CAAC,EAElB,QAAUhb,EAAI,EAAG4V,EAAID,EAAO,OAAQ3V,EAAI4V,EAAG5V,IAAO,CAEjD,IAAM0J,EAAQiM,EAAQ3V,CAAE,EACxBgb,EAAS,KAAMtR,EAAM,EAAGA,EAAM,EAAGA,EAAM,GAAK,CAAE,CAE/C,CAEA,KAAK,aAAc,WAAY,IAAIqlB,GAAwB/T,EAAU,CAAE,CAAE,CAE1E,KAAO,CAEN,IAAMpF,EAAI,KAAK,IAAKD,EAAO,OAAQ7I,EAAkB,KAAM,EAE3D,QAAU9M,EAAI,EAAGA,EAAI4V,EAAG5V,IAAO,CAE9B,IAAM0J,EAAQiM,EAAQ3V,CAAE,EACxB8M,EAAkB,OAAQ9M,EAAG0J,EAAM,EAAGA,EAAM,EAAGA,EAAM,GAAK,CAAE,CAE7D,CAEKiM,EAAO,OAAS7I,EAAkB,OAEtC7L,GAAM,kGAAmG,EAI1G6L,EAAkB,YAAc,EAEjC,CAEA,OAAO,IAER,CAOA,oBAAqB,CAEf,KAAK,cAAgB,OAEzB,KAAK,YAAc,IAAI0c,IAIxB,IAAMxO,EAAW,KAAK,WAAW,SAC3Bo9B,EAA0B,KAAK,gBAAgB,SAErD,GAAKp9B,GAAYA,EAAS,oBAAsB,CAE/C9Z,GAAO,yFAA0F,IAAK,EAEtG,KAAK,YAAY,IAChB,IAAIwJ,EAAS,KAAY,KAAY,IAAW,EAChD,IAAIA,EAAS,IAAY,IAAY,GAAW,CACjD,EAEA,MAED,CAEA,GAAKsQ,IAAa,QAMjB,GAJA,KAAK,YAAY,uBAAwBA,CAAS,EAI7Co9B,EAEJ,QAAUp4C,EAAI,EAAG+sC,EAAKqL,EAAwB,OAAQp4C,EAAI+sC,EAAI/sC,IAAO,CAEpE,IAAMq4C,EAAiBD,EAAyBp4C,CAAE,EAClDovB,GAAO,uBAAwBipB,CAAe,EAEzC,KAAK,sBAET/oB,GAAU,WAAY,KAAK,YAAY,IAAKF,GAAO,GAAI,EACvD,KAAK,YAAY,cAAeE,EAAU,EAE1CA,GAAU,WAAY,KAAK,YAAY,IAAKF,GAAO,GAAI,EACvD,KAAK,YAAY,cAAeE,EAAU,IAI1C,KAAK,YAAY,cAAeF,GAAO,GAAI,EAC3C,KAAK,YAAY,cAAeA,GAAO,GAAI,EAI7C,OAMD,KAAK,YAAY,UAAU,GAIvB,MAAO,KAAK,YAAY,IAAI,CAAE,GAAK,MAAO,KAAK,YAAY,IAAI,CAAE,GAAK,MAAO,KAAK,YAAY,IAAI,CAAE,IAExGluB,GAAO,gIAAiI,IAAK,CAI/I,CAOA,uBAAwB,CAElB,KAAK,iBAAmB,OAE5B,KAAK,eAAiB,IAAIspB,IAI3B,IAAMxP,EAAW,KAAK,WAAW,SAC3Bo9B,EAA0B,KAAK,gBAAgB,SAErD,GAAKp9B,GAAYA,EAAS,oBAAsB,CAE/C9Z,GAAO,+FAAgG,IAAK,EAE5G,KAAK,eAAe,IAAK,IAAIwJ,EAAW,GAAS,EAEjD,MAED,CAEA,GAAKsQ,EAAW,CAIf,IAAMlP,EAAS,KAAK,eAAe,OAMnC,GAJAsjB,GAAO,uBAAwBpU,CAAS,EAInCo9B,EAEJ,QAAUp4C,EAAI,EAAG+sC,EAAKqL,EAAwB,OAAQp4C,EAAI+sC,EAAI/sC,IAAO,CAEpE,IAAMq4C,EAAiBD,EAAyBp4C,CAAE,EAClDqvB,GAAiB,uBAAwBgpB,CAAe,EAEnD,KAAK,sBAET/oB,GAAU,WAAYF,GAAO,IAAKC,GAAiB,GAAI,EACvDD,GAAO,cAAeE,EAAU,EAEhCA,GAAU,WAAYF,GAAO,IAAKC,GAAiB,GAAI,EACvDD,GAAO,cAAeE,EAAU,IAIhCF,GAAO,cAAeC,GAAiB,GAAI,EAC3CD,GAAO,cAAeC,GAAiB,GAAI,EAI7C,CAIDD,GAAO,UAAWtjB,CAAO,EAKzB,IAAI4hC,EAAc,EAElB,QAAU1tC,EAAI,EAAG+sC,EAAK/xB,EAAS,MAAOhb,EAAI+sC,EAAI/sC,IAE7CsvB,GAAU,oBAAqBtU,EAAUhb,CAAE,EAE3C0tC,EAAc,KAAK,IAAKA,EAAa5hC,EAAO,kBAAmBwjB,EAAU,CAAE,EAM5E,GAAK8oB,EAEJ,QAAUp4C,EAAI,EAAG+sC,EAAKqL,EAAwB,OAAQp4C,EAAI+sC,EAAI/sC,IAAO,CAEpE,IAAMq4C,EAAiBD,EAAyBp4C,CAAE,EAC5Cs4C,EAAuB,KAAK,qBAElC,QAAU1wC,EAAI,EAAG2wC,EAAKF,EAAe,MAAOzwC,EAAI2wC,EAAI3wC,IAEnD0nB,GAAU,oBAAqB+oB,EAAgBzwC,CAAE,EAE5C0wC,IAEJnpB,GAAQ,oBAAqBnU,EAAUpT,CAAE,EACzC0nB,GAAU,IAAKH,EAAQ,GAIxBue,EAAc,KAAK,IAAKA,EAAa5hC,EAAO,kBAAmBwjB,EAAU,CAAE,CAI7E,CAID,KAAK,eAAe,OAAS,KAAK,KAAMoe,CAAY,EAE/C,MAAO,KAAK,eAAe,MAAO,GAEtCxsC,GAAO,yHAA0H,IAAK,CAIxI,CAED,CASA,iBAAkB,CAEjB,IAAMkM,EAAQ,KAAK,MACborC,EAAa,KAAK,WAKxB,GAAKprC,IAAU,MACborC,EAAW,WAAa,QACxBA,EAAW,SAAW,QACtBA,EAAW,KAAO,OAAY,CAE/Bt3C,GAAO,wGAAyG,EAChH,MAED,CAEA,IAAM4L,EAAoB0rC,EAAW,SAC/BC,EAAkBD,EAAW,OAC7BE,EAAcF,EAAW,GAE1B,KAAK,aAAc,SAAU,IAAM,IAEvC,KAAK,aAAc,UAAW,IAAIlqB,GAAiB,IAAI,aAAc,EAAIxhB,EAAkB,KAAM,EAAG,CAAE,CAAE,EAIzG,IAAM6rC,EAAmB,KAAK,aAAc,SAAU,EAEhDC,EAAO,CAAC,EAAGC,EAAO,CAAC,EAEzB,QAAU74C,EAAI,EAAGA,EAAI8M,EAAkB,MAAO9M,IAE7C44C,EAAM54C,CAAE,EAAI,IAAI0K,EAChBmuC,EAAM74C,CAAE,EAAI,IAAI0K,EAIjB,IAAMouC,EAAK,IAAIpuC,EACdquC,EAAK,IAAIruC,EACTsuC,EAAK,IAAItuC,EAETuuC,EAAM,IAAIruC,GACVsuC,EAAM,IAAItuC,GACVuuC,EAAM,IAAIvuC,GAEVwuC,EAAO,IAAI1uC,EACX2uC,EAAO,IAAI3uC,EAEZ,SAAS4uC,EAAgBx0C,EAAGC,EAAGC,EAAI,CAElC8zC,EAAG,oBAAqBhsC,EAAmBhI,CAAE,EAC7Ci0C,EAAG,oBAAqBjsC,EAAmB/H,CAAE,EAC7Ci0C,EAAG,oBAAqBlsC,EAAmB9H,CAAE,EAE7Ci0C,EAAI,oBAAqBP,EAAa5zC,CAAE,EACxCo0C,EAAI,oBAAqBR,EAAa3zC,CAAE,EACxCo0C,EAAI,oBAAqBT,EAAa1zC,CAAE,EAExC+zC,EAAG,IAAKD,CAAG,EACXE,EAAG,IAAKF,CAAG,EAEXI,EAAI,IAAKD,CAAI,EACbE,EAAI,IAAKF,CAAI,EAEb,IAAMnxC,EAAI,GAAQoxC,EAAI,EAAIC,EAAI,EAAIA,EAAI,EAAID,EAAI,GAIvC,SAAUpxC,CAAE,IAEnBsxC,EAAK,KAAML,CAAG,EAAE,eAAgBI,EAAI,CAAE,EAAE,gBAAiBH,EAAI,CAAEE,EAAI,CAAE,EAAE,eAAgBpxC,CAAE,EACzFuxC,EAAK,KAAML,CAAG,EAAE,eAAgBE,EAAI,CAAE,EAAE,gBAAiBH,EAAI,CAAEI,EAAI,CAAE,EAAE,eAAgBrxC,CAAE,EAEzF8wC,EAAM9zC,CAAE,EAAE,IAAKs0C,CAAK,EACpBR,EAAM7zC,CAAE,EAAE,IAAKq0C,CAAK,EACpBR,EAAM5zC,CAAE,EAAE,IAAKo0C,CAAK,EAEpBP,EAAM/zC,CAAE,EAAE,IAAKu0C,CAAK,EACpBR,EAAM9zC,CAAE,EAAE,IAAKs0C,CAAK,EACpBR,EAAM7zC,CAAE,EAAE,IAAKq0C,CAAK,EAErB,CAEA,IAAIE,EAAS,KAAK,OAEbA,EAAO,SAAW,IAEtBA,EAAS,CAAE,CACV,MAAO,EACP,MAAOnsC,EAAM,KACd,CAAE,GAIH,QAAUpN,EAAI,EAAG+sC,EAAKwM,EAAO,OAAQv5C,EAAI+sC,EAAI,EAAG/sC,EAAI,CAEnD,IAAMw5C,EAAQD,EAAQv5C,CAAE,EAElBwQ,EAAQgpC,EAAM,MACdtN,EAAQsN,EAAM,MAEpB,QAAU5xC,EAAI4I,EAAO+nC,EAAK/nC,EAAQ07B,EAAOtkC,EAAI2wC,EAAI3wC,GAAK,EAErD0xC,EACClsC,EAAM,KAAMxF,EAAI,CAAE,EAClBwF,EAAM,KAAMxF,EAAI,CAAE,EAClBwF,EAAM,KAAMxF,EAAI,CAAE,CACnB,CAIF,CAEA,IAAM0D,EAAM,IAAIZ,EAAW+uC,EAAO,IAAI/uC,EAChCnI,EAAI,IAAImI,EAAWgvC,EAAK,IAAIhvC,EAElC,SAASivC,EAAchW,EAAI,CAE1BphC,EAAE,oBAAqBk2C,EAAiB9U,CAAE,EAC1C+V,EAAG,KAAMn3C,CAAE,EAEX,IAAM2B,EAAI00C,EAAMjV,CAAE,EAIlBr4B,EAAI,KAAMpH,CAAE,EACZoH,EAAI,IAAK/I,EAAE,eAAgBA,EAAE,IAAK2B,CAAE,CAAE,CAAE,EAAE,UAAU,EAIpDu1C,EAAK,aAAcC,EAAIx1C,CAAE,EAEzB,IAAMogC,EADOmV,EAAK,IAAKZ,EAAMlV,CAAE,CAAE,EACd,EAAQ,GAAK,EAEhCgV,EAAiB,QAAShV,EAAGr4B,EAAI,EAAGA,EAAI,EAAGA,EAAI,EAAGg5B,CAAE,CAErD,CAEA,QAAUtkC,EAAI,EAAG+sC,EAAKwM,EAAO,OAAQv5C,EAAI+sC,EAAI,EAAG/sC,EAAI,CAEnD,IAAMw5C,EAAQD,EAAQv5C,CAAE,EAElBwQ,EAAQgpC,EAAM,MACdtN,EAAQsN,EAAM,MAEpB,QAAU5xC,EAAI4I,EAAO+nC,EAAK/nC,EAAQ07B,EAAOtkC,EAAI2wC,EAAI3wC,GAAK,EAErD+xC,EAAcvsC,EAAM,KAAMxF,EAAI,CAAE,CAAE,EAClC+xC,EAAcvsC,EAAM,KAAMxF,EAAI,CAAE,CAAE,EAClC+xC,EAAcvsC,EAAM,KAAMxF,EAAI,CAAE,CAAE,CAIpC,CAED,CAQA,sBAAuB,CAEtB,IAAMwF,EAAQ,KAAK,MACbN,EAAoB,KAAK,aAAc,UAAW,EAExD,GAAKA,IAAsB,OAAY,CAEtC,IAAI2rC,EAAkB,KAAK,aAAc,QAAS,EAElD,GAAKA,IAAoB,OAExBA,EAAkB,IAAInqB,GAAiB,IAAI,aAAcxhB,EAAkB,MAAQ,CAAE,EAAG,CAAE,EAC1F,KAAK,aAAc,SAAU2rC,CAAgB,MAM7C,SAAUz4C,EAAI,EAAG+sC,EAAK0L,EAAgB,MAAOz4C,EAAI+sC,EAAI/sC,IAEpDy4C,EAAgB,OAAQz4C,EAAG,EAAG,EAAG,CAAE,EAMrC,IAAMuJ,EAAK,IAAImB,EAAWlB,EAAK,IAAIkB,EAAWjB,EAAK,IAAIiB,EACjDkvC,EAAK,IAAIlvC,EAAWmvC,EAAK,IAAInvC,EAAWovC,EAAK,IAAIpvC,EACjDqvC,EAAK,IAAIrvC,EAAWsvC,EAAK,IAAItvC,EAInC,GAAK0C,EAEJ,QAAUpN,EAAI,EAAG+sC,EAAK3/B,EAAM,MAAOpN,EAAI+sC,EAAI/sC,GAAK,EAAI,CAEnD,IAAM84C,EAAK1rC,EAAM,KAAMpN,EAAI,CAAE,EACvB+4C,EAAK3rC,EAAM,KAAMpN,EAAI,CAAE,EACvBg5C,EAAK5rC,EAAM,KAAMpN,EAAI,CAAE,EAE7BuJ,EAAG,oBAAqBuD,EAAmBgsC,CAAG,EAC9CtvC,EAAG,oBAAqBsD,EAAmBisC,CAAG,EAC9CtvC,EAAG,oBAAqBqD,EAAmBksC,CAAG,EAE9Ce,EAAG,WAAYtwC,EAAID,CAAG,EACtBwwC,EAAG,WAAYzwC,EAAIC,CAAG,EACtBuwC,EAAG,MAAOC,CAAG,EAEbJ,EAAG,oBAAqBnB,EAAiBK,CAAG,EAC5Ce,EAAG,oBAAqBpB,EAAiBM,CAAG,EAC5Ce,EAAG,oBAAqBrB,EAAiBO,CAAG,EAE5CY,EAAG,IAAKG,CAAG,EACXF,EAAG,IAAKE,CAAG,EACXD,EAAG,IAAKC,CAAG,EAEXtB,EAAgB,OAAQK,EAAIc,EAAG,EAAGA,EAAG,EAAGA,EAAG,CAAE,EAC7CnB,EAAgB,OAAQM,EAAIc,EAAG,EAAGA,EAAG,EAAGA,EAAG,CAAE,EAC7CpB,EAAgB,OAAQO,EAAIc,EAAG,EAAGA,EAAG,EAAGA,EAAG,CAAE,CAE9C,KAMA,SAAU95C,EAAI,EAAG+sC,EAAKjgC,EAAkB,MAAO9M,EAAI+sC,EAAI/sC,GAAK,EAE3DuJ,EAAG,oBAAqBuD,EAAmB9M,EAAI,CAAE,EACjDwJ,EAAG,oBAAqBsD,EAAmB9M,EAAI,CAAE,EACjDyJ,EAAG,oBAAqBqD,EAAmB9M,EAAI,CAAE,EAEjD+5C,EAAG,WAAYtwC,EAAID,CAAG,EACtBwwC,EAAG,WAAYzwC,EAAIC,CAAG,EACtBuwC,EAAG,MAAOC,CAAG,EAEbvB,EAAgB,OAAQz4C,EAAI,EAAG+5C,EAAG,EAAGA,EAAG,EAAGA,EAAG,CAAE,EAChDtB,EAAgB,OAAQz4C,EAAI,EAAG+5C,EAAG,EAAGA,EAAG,EAAGA,EAAG,CAAE,EAChDtB,EAAgB,OAAQz4C,EAAI,EAAG+5C,EAAG,EAAGA,EAAG,EAAGA,EAAG,CAAE,EAMlD,KAAK,iBAAiB,EAEtBtB,EAAgB,YAAc,EAE/B,CAED,CAMA,kBAAmB,CAElB,IAAMwB,EAAU,KAAK,WAAW,OAEhC,QAAUj6C,EAAI,EAAG+sC,EAAKkN,EAAQ,MAAOj6C,EAAI+sC,EAAI/sC,IAE5CsvB,GAAU,oBAAqB2qB,EAASj6C,CAAE,EAE1CsvB,GAAU,UAAU,EAEpB2qB,EAAQ,OAAQj6C,EAAGsvB,GAAU,EAAGA,GAAU,EAAGA,GAAU,CAAE,CAI3D,CAQA,cAAe,CAEd,SAAS4qB,EAAwB9V,EAAW+V,EAAU,CAErD,IAAMp6C,EAAQqkC,EAAU,MAClB53B,EAAW43B,EAAU,SACrBsT,EAAatT,EAAU,WAEvBgW,EAAS,IAAIr6C,EAAM,YAAao6C,EAAQ,OAAS3tC,CAAS,EAE5DY,EAAQ,EAAGwqC,EAAS,EAExB,QAAU53C,EAAI,EAAG4V,EAAIukC,EAAQ,OAAQn6C,EAAI4V,EAAG5V,IAAO,CAE7CokC,EAAU,6BAEdh3B,EAAQ+sC,EAASn6C,CAAE,EAAIokC,EAAU,KAAK,OAASA,EAAU,OAIzDh3B,EAAQ+sC,EAASn6C,CAAE,EAAIwM,EAIxB,QAAU5E,EAAI,EAAGA,EAAI4E,EAAU5E,IAE9BwyC,EAAQxC,GAAU,EAAI73C,EAAOqN,GAAS,CAIxC,CAEA,OAAO,IAAIkhB,GAAiB8rB,EAAQ5tC,EAAUkrC,CAAW,CAE1D,CAIA,GAAK,KAAK,QAAU,KAEnB,OAAAz2C,GAAM,uEAAwE,EACvE,KAIR,IAAMo5C,EAAY,IAAIvC,EAEhBqC,EAAU,KAAK,MAAM,MACrB3B,EAAa,KAAK,WAIxB,QAAYj4C,KAAQi4C,EAAa,CAEhC,IAAMpU,EAAYoU,EAAYj4C,CAAK,EAE7B+5C,EAAeJ,EAAwB9V,EAAW+V,CAAQ,EAEhEE,EAAU,aAAc95C,EAAM+5C,CAAa,CAE5C,CAIA,IAAMC,EAAkB,KAAK,gBAE7B,QAAYh6C,KAAQg6C,EAAkB,CAErC,IAAMC,EAAa,CAAC,EACdnC,EAAiBkC,EAAiBh6C,CAAK,EAE7C,QAAUP,EAAI,EAAG+sC,EAAKsL,EAAe,OAAQr4C,EAAI+sC,EAAI/sC,IAAO,CAE3D,IAAMokC,EAAYiU,EAAgBr4C,CAAE,EAE9Bs6C,EAAeJ,EAAwB9V,EAAW+V,CAAQ,EAEhEK,EAAW,KAAMF,CAAa,CAE/B,CAEAD,EAAU,gBAAiB95C,CAAK,EAAIi6C,CAErC,CAEAH,EAAU,qBAAuB,KAAK,qBAItC,IAAMd,EAAS,KAAK,OAEpB,QAAUv5C,EAAI,EAAG4V,EAAI2jC,EAAO,OAAQv5C,EAAI4V,EAAG5V,IAAO,CAEjD,IAAMw5C,EAAQD,EAAQv5C,CAAE,EACxBq6C,EAAU,SAAUb,EAAM,MAAOA,EAAM,MAAOA,EAAM,aAAc,CAEnE,CAEA,OAAOa,CAER,CAOA,QAAS,CAER,IAAM5qC,EAAO,CACZ,SAAU,CACT,QAAS,IACT,KAAM,iBACN,UAAW,uBACZ,CACD,EASA,GALAA,EAAK,KAAO,KAAK,KACjBA,EAAK,KAAO,KAAK,KACZ,KAAK,OAAS,KAAKA,EAAK,KAAO,KAAK,MACpC,OAAO,KAAM,KAAK,QAAS,EAAE,OAAS,IAAIA,EAAK,SAAW,KAAK,UAE/D,KAAK,aAAe,OAAY,CAEpC,IAAMmlC,EAAa,KAAK,WAExB,QAAYt9B,KAAOs9B,EAEbA,EAAYt9B,CAAI,IAAM,SAAY7H,EAAM6H,CAAI,EAAIs9B,EAAYt9B,CAAI,GAItE,OAAO7H,CAER,CAIAA,EAAK,KAAO,CAAE,WAAY,CAAC,CAAE,EAE7B,IAAMrC,EAAQ,KAAK,MAEdA,IAAU,OAEdqC,EAAK,KAAK,MAAQ,CACjB,KAAMrC,EAAM,MAAM,YAAY,KAC9B,MAAO,MAAM,UAAU,MAAM,KAAMA,EAAM,KAAM,CAChD,GAID,IAAMorC,EAAa,KAAK,WAExB,QAAYlhC,KAAOkhC,EAAa,CAE/B,IAAMpU,EAAYoU,EAAYlhC,CAAI,EAElC7H,EAAK,KAAK,WAAY6H,CAAI,EAAI8sB,EAAU,OAAQ30B,EAAK,IAAK,CAE3D,CAEA,IAAM8qC,EAAkB,CAAC,EACrBE,EAAqB,GAEzB,QAAYnjC,KAAO,KAAK,gBAAkB,CAEzC,IAAMojC,EAAiB,KAAK,gBAAiBpjC,CAAI,EAE3CvX,EAAQ,CAAC,EAEf,QAAUC,EAAI,EAAG+sC,EAAK2N,EAAe,OAAQ16C,EAAI+sC,EAAI/sC,IAAO,CAE3D,IAAMokC,EAAYsW,EAAgB16C,CAAE,EAEpCD,EAAM,KAAMqkC,EAAU,OAAQ30B,EAAK,IAAK,CAAE,CAE3C,CAEK1P,EAAM,OAAS,IAEnBw6C,EAAiBjjC,CAAI,EAAIvX,EAEzB06C,EAAqB,GAIvB,CAEKA,IAEJhrC,EAAK,KAAK,gBAAkB8qC,EAC5B9qC,EAAK,KAAK,qBAAuB,KAAK,sBAIvC,IAAM8pC,EAAS,KAAK,OAEfA,EAAO,OAAS,IAEpB9pC,EAAK,KAAK,OAAS,KAAK,MAAO,KAAK,UAAW8pC,CAAO,CAAE,GAIzD,IAAMoB,EAAiB,KAAK,eAE5B,OAAKA,IAAmB,OAEvBlrC,EAAK,KAAK,eAAiBkrC,EAAe,OAAO,GAI3ClrC,CAER,CAOA,OAAQ,CAEP,OAAO,IAAI,KAAK,YAAY,EAAE,KAAM,IAAK,CAE1C,CAQA,KAAM08B,EAAS,CAId,KAAK,MAAQ,KACb,KAAK,WAAa,CAAC,EACnB,KAAK,gBAAkB,CAAC,EACxB,KAAK,OAAS,CAAC,EACf,KAAK,YAAc,KACnB,KAAK,eAAiB,KAItB,IAAM18B,EAAO,CAAC,EAId,KAAK,KAAO08B,EAAO,KAInB,IAAM/+B,EAAQ++B,EAAO,MAEhB/+B,IAAU,MAEd,KAAK,SAAUA,EAAM,MAAM,CAAE,EAM9B,IAAMorC,EAAarM,EAAO,WAE1B,QAAY5rC,KAAQi4C,EAAa,CAEhC,IAAMpU,EAAYoU,EAAYj4C,CAAK,EACnC,KAAK,aAAcA,EAAM6jC,EAAU,MAAO30B,CAAK,CAAE,CAElD,CAIA,IAAM8qC,EAAkBpO,EAAO,gBAE/B,QAAY5rC,KAAQg6C,EAAkB,CAErC,IAAMx6C,EAAQ,CAAC,EACTs4C,EAAiBkC,EAAiBh6C,CAAK,EAE7C,QAAUP,EAAI,EAAG4V,EAAIyiC,EAAe,OAAQr4C,EAAI4V,EAAG5V,IAElDD,EAAM,KAAMs4C,EAAgBr4C,CAAE,EAAE,MAAOyP,CAAK,CAAE,EAI/C,KAAK,gBAAiBlP,CAAK,EAAIR,CAEhC,CAEA,KAAK,qBAAuBosC,EAAO,qBAInC,IAAMoN,EAASpN,EAAO,OAEtB,QAAUnsC,EAAI,EAAG4V,EAAI2jC,EAAO,OAAQv5C,EAAI4V,EAAG5V,IAAO,CAEjD,IAAMw5C,EAAQD,EAAQv5C,CAAE,EACxB,KAAK,SAAUw5C,EAAM,MAAOA,EAAM,MAAOA,EAAM,aAAc,CAE9D,CAIA,IAAMoB,EAAczO,EAAO,YAEtByO,IAAgB,OAEpB,KAAK,YAAcA,EAAY,MAAM,GAMtC,IAAMD,EAAiBxO,EAAO,eAE9B,OAAKwO,IAAmB,OAEvB,KAAK,eAAiBA,EAAe,MAAM,GAM5C,KAAK,UAAU,MAAQxO,EAAO,UAAU,MACxC,KAAK,UAAU,MAAQA,EAAO,UAAU,MAIxC,KAAK,SAAWA,EAAO,SAEhB,IAER,CAQA,SAAU,CAET,KAAK,cAAe,CAAE,KAAM,SAAU,CAAE,CAEzC,CAED,EAEM3c,GAAiC,IAAIvE,GACrCwE,GAAuB,IAAIzE,GAC3B0E,GAA0B,IAAIlF,GAC9BmF,GAA6B,IAAIjlB,EAEjCN,GAAsB,IAAIM,EAC1BL,GAAsB,IAAIK,EAC1BJ,GAAsB,IAAII,EAE1BklB,GAAuB,IAAIllB,EAC3BmlB,GAAwB,IAAInlB,EAE5BF,GAAmC,IAAIE,EACvCZ,GAAwC,IAAIY,EAc5ColB,GAAN,cAAmBlD,EAAS,CAQ3B,YAAahS,EAAW,IAAI2U,GAAkBnmB,EAAW,IAAI6kB,GAAsB,CAElF,MAAM,EASN,KAAK,OAAS,GAEd,KAAK,KAAO,OAOZ,KAAK,SAAWrT,EAQhB,KAAK,SAAWxR,EAUhB,KAAK,sBAAwB,OAU7B,KAAK,sBAAwB,OAS7B,KAAK,MAAQ,EAEb,KAAK,mBAAmB,CAEzB,CAEA,KAAM+iC,EAAQ/xB,EAAY,CAEzB,aAAM,KAAM+xB,EAAQ/xB,CAAU,EAEzB+xB,EAAO,wBAA0B,SAErC,KAAK,sBAAwBA,EAAO,sBAAsB,MAAM,GAI5DA,EAAO,wBAA0B,SAErC,KAAK,sBAAwB,OAAO,OAAQ,CAAC,EAAGA,EAAO,qBAAsB,GAI9E,KAAK,SAAW,MAAM,QAASA,EAAO,QAAS,EAAIA,EAAO,SAAS,MAAM,EAAIA,EAAO,SACpF,KAAK,SAAWA,EAAO,SAEhB,IAER,CAMA,oBAAqB,CAIpB,IAAMoO,EAFW,KAAK,SAEW,gBAC3BM,EAAO,OAAO,KAAMN,CAAgB,EAE1C,GAAKM,EAAK,OAAS,EAAI,CAEtB,IAAMxC,EAAiBkC,EAAiBM,EAAM,CAAE,CAAE,EAElD,GAAKxC,IAAmB,OAAY,CAEnC,KAAK,sBAAwB,CAAC,EAC9B,KAAK,sBAAwB,CAAC,EAE9B,QAAU71C,EAAI,EAAGs4C,EAAKzC,EAAe,OAAQ71C,EAAIs4C,EAAIt4C,IAAO,CAE3D,IAAMjC,EAAO83C,EAAgB71C,CAAE,EAAE,MAAQ,OAAQA,CAAE,EAEnD,KAAK,sBAAsB,KAAM,CAAE,EACnC,KAAK,sBAAuBjC,CAAK,EAAIiC,CAEtC,CAED,CAED,CAED,CAUA,kBAAmB4K,EAAO1G,EAAS,CAElC,IAAMkU,EAAW,KAAK,SAChBI,EAAWJ,EAAS,WAAW,SAC/BmgC,EAAgBngC,EAAS,gBAAgB,SACzC09B,EAAuB19B,EAAS,qBAEtClU,EAAO,oBAAqBsU,EAAU5N,CAAM,EAE5C,IAAM4tC,EAAkB,KAAK,sBAE7B,GAAKD,GAAiBC,EAAkB,CAEvCnrB,GAAQ,IAAK,EAAG,EAAG,CAAE,EAErB,QAAU7vB,EAAI,EAAG+sC,EAAKgO,EAAc,OAAQ/6C,EAAI+sC,EAAI/sC,IAAO,CAE1D,IAAMi7C,EAAYD,EAAiBh7C,CAAE,EAC/Bq4C,EAAiB0C,EAAe/6C,CAAE,EAEnCi7C,IAAc,IAEnBrrB,GAAO,oBAAqByoB,EAAgBjrC,CAAM,EAE7CkrC,EAEJzoB,GAAQ,gBAAiBD,GAAQqrB,CAAU,EAI3CprB,GAAQ,gBAAiBD,GAAO,IAAKlpB,CAAO,EAAGu0C,CAAU,EAI3D,CAEAv0C,EAAO,IAAKmpB,EAAQ,CAErB,CAEA,OAAOnpB,CAER,CAQA,QAAS2C,EAAWkE,EAAa,CAEhC,IAAMqN,EAAW,KAAK,SAChBxR,EAAW,KAAK,SAChBkE,EAAc,KAAK,YAEpBlE,IAAa,SAIbwR,EAAS,iBAAmB,MAAOA,EAAS,sBAAsB,EAEvE8U,GAAU,KAAM9U,EAAS,cAAe,EACxC8U,GAAU,aAAcpiB,CAAY,EAIpCmiB,GAAO,KAAMpmB,EAAU,GAAI,EAAE,OAAQA,EAAU,IAAK,EAE/C,EAAAqmB,GAAU,cAAeD,GAAO,MAAO,IAAM,KAE5CA,GAAO,gBAAiBC,GAAWC,EAAa,IAAM,MAEtDF,GAAO,OAAO,kBAAmBE,EAAa,GAAMtmB,EAAU,IAAMA,EAAU,OAAU,MAM9FmmB,GAAiB,KAAMliB,CAAY,EAAE,OAAO,EAC5CmiB,GAAO,KAAMpmB,EAAU,GAAI,EAAE,aAAcmmB,EAAiB,EAIvD,EAAA5U,EAAS,cAAgB,MAExB6U,GAAO,cAAe7U,EAAS,WAAY,IAAM,KAMvD,KAAK,sBAAuBvR,EAAWkE,EAAYkiB,EAAO,GAE3D,CAEA,sBAAuBpmB,EAAWkE,EAAY2tC,EAAgB,CAE7D,IAAI3wC,EAEEqQ,EAAW,KAAK,SAChBxR,EAAW,KAAK,SAEhBgE,EAAQwN,EAAS,MACjBI,EAAWJ,EAAS,WAAW,SAC/B3Q,EAAK2Q,EAAS,WAAW,GACzB1Q,EAAM0Q,EAAS,WAAW,IAC1BzQ,EAASyQ,EAAS,WAAW,OAC7B2+B,EAAS3+B,EAAS,OAClBugC,EAAYvgC,EAAS,UAE3B,GAAKxN,IAAU,KAId,GAAK,MAAM,QAAShE,CAAS,EAE5B,QAAUpJ,EAAI,EAAG+sC,EAAKwM,EAAO,OAAQv5C,EAAI+sC,EAAI/sC,IAAO,CAEnD,IAAMw5C,EAAQD,EAAQv5C,CAAE,EAClBo7C,EAAgBhyC,EAAUowC,EAAM,aAAc,EAE9ChpC,EAAQ,KAAK,IAAKgpC,EAAM,MAAO2B,EAAU,KAAM,EAC/C1qC,EAAM,KAAK,IAAKrD,EAAM,MAAO,KAAK,IAAOosC,EAAM,MAAQA,EAAM,MAAW2B,EAAU,MAAQA,EAAU,KAAQ,CAAE,EAEpH,QAAUvzC,EAAI4I,EAAO+nC,EAAK9nC,EAAK7I,EAAI2wC,EAAI3wC,GAAK,EAAI,CAE/C,IAAM9C,EAAIsI,EAAM,KAAMxF,CAAE,EAClB7C,EAAIqI,EAAM,KAAMxF,EAAI,CAAE,EACtB5C,EAAIoI,EAAM,KAAMxF,EAAI,CAAE,EAE5B2C,EAAeP,GAA2B,KAAMoxC,EAAe/xC,EAAW6xC,EAAejxC,EAAIC,EAAKC,EAAQrF,EAAGC,EAAGC,CAAE,EAE7GuF,IAEJA,EAAa,UAAY,KAAK,MAAO3C,EAAI,CAAE,EAC3C2C,EAAa,KAAK,cAAgBivC,EAAM,cACxCjsC,EAAW,KAAMhD,CAAa,EAIhC,CAED,KAEM,CAEN,IAAMiG,EAAQ,KAAK,IAAK,EAAG2qC,EAAU,KAAM,EACrC1qC,EAAM,KAAK,IAAKrD,EAAM,MAAS+tC,EAAU,MAAQA,EAAU,KAAQ,EAEzE,QAAUn7C,EAAIwQ,EAAOu8B,EAAKt8B,EAAKzQ,EAAI+sC,EAAI/sC,GAAK,EAAI,CAE/C,IAAM8E,EAAIsI,EAAM,KAAMpN,CAAE,EAClB+E,EAAIqI,EAAM,KAAMpN,EAAI,CAAE,EACtBgF,EAAIoI,EAAM,KAAMpN,EAAI,CAAE,EAE5BuK,EAAeP,GAA2B,KAAMZ,EAAUC,EAAW6xC,EAAejxC,EAAIC,EAAKC,EAAQrF,EAAGC,EAAGC,CAAE,EAExGuF,IAEJA,EAAa,UAAY,KAAK,MAAOvK,EAAI,CAAE,EAC3CuN,EAAW,KAAMhD,CAAa,EAIhC,CAED,SAEWyQ,IAAa,OAIxB,GAAK,MAAM,QAAS5R,CAAS,EAE5B,QAAUpJ,EAAI,EAAG+sC,EAAKwM,EAAO,OAAQv5C,EAAI+sC,EAAI/sC,IAAO,CAEnD,IAAMw5C,EAAQD,EAAQv5C,CAAE,EAClBo7C,EAAgBhyC,EAAUowC,EAAM,aAAc,EAE9ChpC,EAAQ,KAAK,IAAKgpC,EAAM,MAAO2B,EAAU,KAAM,EAC/C1qC,EAAM,KAAK,IAAKuK,EAAS,MAAO,KAAK,IAAOw+B,EAAM,MAAQA,EAAM,MAAW2B,EAAU,MAAQA,EAAU,KAAQ,CAAE,EAEvH,QAAUvzC,EAAI4I,EAAO+nC,EAAK9nC,EAAK7I,EAAI2wC,EAAI3wC,GAAK,EAAI,CAE/C,IAAM9C,EAAI8C,EACJ7C,EAAI6C,EAAI,EACR5C,EAAI4C,EAAI,EAEd2C,EAAeP,GAA2B,KAAMoxC,EAAe/xC,EAAW6xC,EAAejxC,EAAIC,EAAKC,EAAQrF,EAAGC,EAAGC,CAAE,EAE7GuF,IAEJA,EAAa,UAAY,KAAK,MAAO3C,EAAI,CAAE,EAC3C2C,EAAa,KAAK,cAAgBivC,EAAM,cACxCjsC,EAAW,KAAMhD,CAAa,EAIhC,CAED,KAEM,CAEN,IAAMiG,EAAQ,KAAK,IAAK,EAAG2qC,EAAU,KAAM,EACrC1qC,EAAM,KAAK,IAAKuK,EAAS,MAASmgC,EAAU,MAAQA,EAAU,KAAQ,EAE5E,QAAUn7C,EAAIwQ,EAAOu8B,EAAKt8B,EAAKzQ,EAAI+sC,EAAI/sC,GAAK,EAAI,CAE/C,IAAM8E,EAAI9E,EACJ+E,EAAI/E,EAAI,EACRgF,EAAIhF,EAAI,EAEduK,EAAeP,GAA2B,KAAMZ,EAAUC,EAAW6xC,EAAejxC,EAAIC,EAAKC,EAAQrF,EAAGC,EAAGC,CAAE,EAExGuF,IAEJA,EAAa,UAAY,KAAK,MAAOvK,EAAI,CAAE,EAC3CuN,EAAW,KAAMhD,CAAa,EAIhC,CAED,CAIF,CAED,EAwGMwlB,GAAN,MAAMsrB,UAAoB9rB,EAAe,CAYxC,YAAa/T,EAAQ,EAAGC,EAAS,EAAGqxB,EAAQ,EAAGwO,EAAgB,EAAGC,EAAiB,EAAGC,EAAgB,EAAI,CAEzG,MAAM,EAEN,KAAK,KAAO,cASZ,KAAK,WAAa,CACjB,MAAOhgC,EACP,OAAQC,EACR,MAAOqxB,EACP,cAAewO,EACf,eAAgBC,EAChB,cAAeC,CAChB,EAEA,IAAMC,EAAQ,KAIdH,EAAgB,KAAK,MAAOA,CAAc,EAC1CC,EAAiB,KAAK,MAAOA,CAAe,EAC5CC,EAAgB,KAAK,MAAOA,CAAc,EAI1C,IAAMrB,EAAU,CAAC,EACXrkC,EAAW,CAAC,EACZmkC,EAAU,CAAC,EACXyB,EAAM,CAAC,EAITC,EAAmB,EACnBC,EAAa,EAIjBC,EAAY,IAAK,IAAK,IAAK,GAAI,GAAI/O,EAAOrxB,EAAQD,EAAOggC,EAAeD,EAAgB,CAAE,EAC1FM,EAAY,IAAK,IAAK,IAAK,EAAG,GAAI/O,EAAOrxB,EAAQ,CAAED,EAAOggC,EAAeD,EAAgB,CAAE,EAC3FM,EAAY,IAAK,IAAK,IAAK,EAAG,EAAGrgC,EAAOsxB,EAAOrxB,EAAQ6/B,EAAeE,EAAe,CAAE,EACvFK,EAAY,IAAK,IAAK,IAAK,EAAG,GAAIrgC,EAAOsxB,EAAO,CAAErxB,EAAQ6/B,EAAeE,EAAe,CAAE,EAC1FK,EAAY,IAAK,IAAK,IAAK,EAAG,GAAIrgC,EAAOC,EAAQqxB,EAAOwO,EAAeC,EAAgB,CAAE,EACzFM,EAAY,IAAK,IAAK,IAAK,GAAI,GAAIrgC,EAAOC,EAAQ,CAAEqxB,EAAOwO,EAAeC,EAAgB,CAAE,EAI5F,KAAK,SAAUpB,CAAQ,EACvB,KAAK,aAAc,WAAY,IAAIprB,GAAwBjZ,EAAU,CAAE,CAAE,EACzE,KAAK,aAAc,SAAU,IAAIiZ,GAAwBkrB,EAAS,CAAE,CAAE,EACtE,KAAK,aAAc,KAAM,IAAIlrB,GAAwB2sB,EAAK,CAAE,CAAE,EAE9D,SAASG,EAAY5wC,EAAG04B,EAAGW,EAAGwX,EAAMC,EAAMvgC,EAAOC,EAAQqxB,EAAOkP,EAAOC,EAAOhE,EAAgB,CAE7F,IAAMiE,EAAe1gC,EAAQwgC,EACvBG,EAAgB1gC,EAASwgC,EAEzBG,EAAY5gC,EAAQ,EACpB6gC,EAAa5gC,EAAS,EACtB6gC,EAAYxP,EAAQ,EAEpByP,EAASP,EAAQ,EACjBQ,EAASP,EAAQ,EAEnBQ,EAAgB,EAChBC,EAAa,EAEXrP,EAAS,IAAI3iC,EAInB,QAAUiyC,EAAK,EAAGA,EAAKH,EAAQG,IAAQ,CAEtC,IAAM35C,EAAI25C,EAAKR,EAAgBE,EAE/B,QAAUO,GAAK,EAAGA,GAAKL,EAAQK,KAAQ,CAEtC,IAAMl6C,GAAIk6C,GAAKV,EAAeE,EAI9B/O,EAAQpiC,CAAE,EAAIvI,GAAIo5C,EAClBzO,EAAQ1J,CAAE,EAAI3gC,EAAI+4C,EAClB1O,EAAQ/I,CAAE,EAAIgY,EAIdxmC,EAAS,KAAMu3B,EAAO,EAAGA,EAAO,EAAGA,EAAO,CAAE,EAI5CA,EAAQpiC,CAAE,EAAI,EACdoiC,EAAQ1J,CAAE,EAAI,EACd0J,EAAQ/I,CAAE,EAAIwI,EAAQ,EAAI,EAAI,GAI9BmN,EAAQ,KAAM5M,EAAO,EAAGA,EAAO,EAAGA,EAAO,CAAE,EAI3CqO,EAAI,KAAMkB,GAAKZ,CAAM,EACrBN,EAAI,KAAM,EAAMiB,EAAKV,CAAQ,EAI7BQ,GAAiB,CAElB,CAED,CAQA,QAAUE,EAAK,EAAGA,EAAKV,EAAOU,IAE7B,QAAUC,EAAK,EAAGA,EAAKZ,EAAOY,IAAQ,CAErC,IAAM93C,GAAI62C,EAAmBiB,EAAKL,EAASI,EACrC53C,GAAI42C,EAAmBiB,EAAKL,GAAWI,EAAK,GAC5C33C,GAAI22C,GAAqBiB,EAAK,GAAML,GAAWI,EAAK,GACpDjS,GAAIiR,GAAqBiB,EAAK,GAAML,EAASI,EAInDxC,EAAQ,KAAMr1C,GAAGC,GAAG2lC,EAAE,EACtByP,EAAQ,KAAMp1C,GAAGC,GAAG0lC,EAAE,EAItBgS,GAAc,CAEf,CAMDjB,EAAM,SAAUG,EAAYc,EAAYzE,CAAc,EAItD2D,GAAcc,EAIdf,GAAoBc,CAErB,CAED,CAEA,KAAMtQ,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,WAAa,OAAO,OAAQ,CAAC,EAAGA,EAAO,UAAW,EAEhD,IAER,CASA,OAAO,SAAU18B,EAAO,CAEvB,OAAO,IAAI4rC,EAAa5rC,EAAK,MAAOA,EAAK,OAAQA,EAAK,MAAOA,EAAK,cAAeA,EAAK,eAAgBA,EAAK,aAAc,CAE1H,CAED,EAgIMugB,GAAgB,CAAE,MAAOllB,GAAe,MAAOK,EAAc,EAE/D8kB,IAAiB;AAAA;AAAA,GAEjBC,IAAmB;AAAA;AAAA,GAkCjBC,GAAN,cAA6BnC,EAAS,CAWrC,YAAa4mB,EAAa,CAEzB,MAAM,EASN,KAAK,iBAAmB,GAExB,KAAK,KAAO,iBAoBZ,KAAK,QAAU,CAAC,EAwBhB,KAAK,SAAW,CAAC,EAOjB,KAAK,eAAiB,CAAC,EAOvB,KAAK,aAAe3kB,IAOpB,KAAK,eAAiBC,IAWtB,KAAK,UAAY,EAQjB,KAAK,UAAY,GAWjB,KAAK,mBAAqB,EAsB1B,KAAK,IAAM,GASX,KAAK,OAAS,GASd,KAAK,SAAW,GAQhB,KAAK,gBAAkB,GAUvB,KAAK,WAAa,CACjB,iBAAkB,GAClB,UAAW,EACZ,EAaA,KAAK,uBAAyB,CAC7B,MAAS,CAAE,EAAG,EAAG,CAAE,EACnB,GAAM,CAAE,EAAG,CAAE,EACb,IAAO,CAAE,EAAG,CAAE,CACf,EASA,KAAK,oBAAsB,OAS3B,KAAK,mBAAqB,GAQ1B,KAAK,YAAc,KAEd0kB,IAAe,QAEnB,KAAK,UAAWA,CAAW,CAI7B,CAEA,KAAMzI,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,eAAiBA,EAAO,eAC7B,KAAK,aAAeA,EAAO,aAE3B,KAAK,SAAWrhC,GAAeqhC,EAAO,QAAS,EAC/C,KAAK,eAAiB5gC,IAAqB4gC,EAAO,cAAe,EAEjE,KAAK,QAAU,OAAO,OAAQ,CAAC,EAAGA,EAAO,OAAQ,EAEjD,KAAK,UAAYA,EAAO,UACxB,KAAK,mBAAqBA,EAAO,mBAEjC,KAAK,IAAMA,EAAO,IAClB,KAAK,OAASA,EAAO,OACrB,KAAK,SAAWA,EAAO,SAEvB,KAAK,WAAa,OAAO,OAAQ,CAAC,EAAGA,EAAO,UAAW,EAEvD,KAAK,YAAcA,EAAO,YAE1B,KAAK,uBAAyB,OAAO,OAAQ,CAAC,EAAGA,EAAO,sBAAuB,EAE/E,KAAK,oBAAsBA,EAAO,oBAElC,KAAK,mBAAqBA,EAAO,mBAE1B,IAER,CAEA,OAAQZ,EAAO,CAEd,IAAM97B,EAAO,MAAM,OAAQ87B,CAAK,EAEhC97B,EAAK,YAAc,KAAK,YACxBA,EAAK,SAAW,CAAC,EAEjB,QAAYlP,KAAQ,KAAK,SAAW,CAGnC,IAAM4B,EADU,KAAK,SAAU5B,CAAK,EACd,MAEjB4B,GAASA,EAAM,UAEnBsN,EAAK,SAAUlP,CAAK,EAAI,CACvB,KAAM,IACN,MAAO4B,EAAM,OAAQopC,CAAK,EAAE,IAC7B,EAEWppC,GAASA,EAAM,QAE1BsN,EAAK,SAAUlP,CAAK,EAAI,CACvB,KAAM,IACN,MAAO4B,EAAM,OAAO,CACrB,EAEWA,GAASA,EAAM,UAE1BsN,EAAK,SAAUlP,CAAK,EAAI,CACvB,KAAM,KACN,MAAO4B,EAAM,QAAQ,CACtB,EAEWA,GAASA,EAAM,UAE1BsN,EAAK,SAAUlP,CAAK,EAAI,CACvB,KAAM,KACN,MAAO4B,EAAM,QAAQ,CACtB,EAEWA,GAASA,EAAM,UAE1BsN,EAAK,SAAUlP,CAAK,EAAI,CACvB,KAAM,KACN,MAAO4B,EAAM,QAAQ,CACtB,EAEWA,GAASA,EAAM,UAE1BsN,EAAK,SAAUlP,CAAK,EAAI,CACvB,KAAM,KACN,MAAO4B,EAAM,QAAQ,CACtB,EAEWA,GAASA,EAAM,UAE1BsN,EAAK,SAAUlP,CAAK,EAAI,CACvB,KAAM,KACN,MAAO4B,EAAM,QAAQ,CACtB,EAIAsN,EAAK,SAAUlP,CAAK,EAAI,CACvB,MAAO4B,CACR,CAMF,CAEK,OAAO,KAAM,KAAK,OAAQ,EAAE,OAAS,IAAIsN,EAAK,QAAU,KAAK,SAElEA,EAAK,aAAe,KAAK,aACzBA,EAAK,eAAiB,KAAK,eAE3BA,EAAK,OAAS,KAAK,OACnBA,EAAK,SAAW,KAAK,SAErB,IAAMotC,EAAa,CAAC,EAEpB,QAAYvlC,KAAO,KAAK,WAElB,KAAK,WAAYA,CAAI,IAAM,KAAOulC,EAAYvlC,CAAI,EAAI,IAI5D,OAAK,OAAO,KAAMulC,CAAW,EAAE,OAAS,IAAIptC,EAAK,WAAaotC,GAEvDptC,CAER,CAED,EASM2gB,GAAN,cAAqBxD,EAAS,CAK7B,aAAc,CAEb,MAAM,EASN,KAAK,SAAW,GAEhB,KAAK,KAAO,SAOZ,KAAK,mBAAqB,IAAI3B,GAO9B,KAAK,iBAAmB,IAAIA,GAO5B,KAAK,wBAA0B,IAAIA,GAOnC,KAAK,iBAAmBjD,GAExB,KAAK,eAAiB,EAEvB,CAQA,IAAI,eAAgB,CAEnB,OAAO,KAAK,cAEb,CAEA,KAAMmkB,EAAQ/xB,EAAY,CAEzB,aAAM,KAAM+xB,EAAQ/xB,CAAU,EAE9B,KAAK,mBAAmB,KAAM+xB,EAAO,kBAAmB,EAExD,KAAK,iBAAiB,KAAMA,EAAO,gBAAiB,EACpD,KAAK,wBAAwB,KAAMA,EAAO,uBAAwB,EAElE,KAAK,iBAAmBA,EAAO,iBAExB,IAER,CAWA,kBAAmBzlC,EAAS,CAE3B,OAAO,MAAM,kBAAmBA,CAAO,EAAE,OAAO,CAEjD,CAEA,kBAAmB2tC,EAAQ,CAE1B,MAAM,kBAAmBA,CAAM,EAE/B,KAAK,mBAAmB,KAAM,KAAK,WAAY,EAAE,OAAO,CAEzD,CAEA,kBAAmBC,EAAeC,EAAiB,CAElD,MAAM,kBAAmBD,EAAeC,CAAe,EAEvD,KAAK,mBAAmB,KAAM,KAAK,WAAY,EAAE,OAAO,CAEzD,CAEA,OAAQ,CAEP,OAAO,IAAI,KAAK,YAAY,EAAE,KAAM,IAAK,CAE1C,CAED,EAEMlkB,GAAsB,IAAI3lB,EAC1B4lB,GAA2B,IAAI1lB,GAC/B2lB,GAA2B,IAAI3lB,GAe/B4lB,GAAN,cAAgCJ,EAAO,CAUtC,YAAaK,EAAM,GAAItV,EAAS,EAAGq4B,EAAO,GAAKC,EAAM,IAAO,CAE3D,MAAM,EASN,KAAK,oBAAsB,GAE3B,KAAK,KAAO,oBASZ,KAAK,IAAMhjB,EAQX,KAAK,KAAO,EAYZ,KAAK,KAAO+iB,EASZ,KAAK,IAAMC,EAUX,KAAK,MAAQ,GAQb,KAAK,OAASt4B,EASd,KAAK,KAAO,KAUZ,KAAK,UAAY,GAQjB,KAAK,WAAa,EAElB,KAAK,uBAAuB,CAE7B,CAEA,KAAMgxB,EAAQ/xB,EAAY,CAEzB,aAAM,KAAM+xB,EAAQ/xB,CAAU,EAE9B,KAAK,IAAM+xB,EAAO,IAClB,KAAK,KAAOA,EAAO,KAEnB,KAAK,KAAOA,EAAO,KACnB,KAAK,IAAMA,EAAO,IAClB,KAAK,MAAQA,EAAO,MAEpB,KAAK,OAASA,EAAO,OACrB,KAAK,KAAOA,EAAO,OAAS,KAAO,KAAO,OAAO,OAAQ,CAAC,EAAGA,EAAO,IAAK,EAEzE,KAAK,UAAYA,EAAO,UACxB,KAAK,WAAaA,EAAO,WAElB,IAER,CAUA,eAAgB2Q,EAAc,CAG7B,IAAMC,EAAe,GAAM,KAAK,cAAc,EAAID,EAElD,KAAK,IAAMt4C,GAAU,EAAI,KAAK,KAAMu4C,CAAa,EACjD,KAAK,uBAAuB,CAE7B,CAQA,gBAAiB,CAEhB,IAAMA,EAAe,KAAK,IAAK14C,GAAU,GAAM,KAAK,GAAI,EAExD,MAAO,IAAM,KAAK,cAAc,EAAI04C,CAErC,CAOA,iBAAkB,CAEjB,OAAOv4C,GAAU,EAAI,KAAK,KACzB,KAAK,IAAKH,GAAU,GAAM,KAAK,GAAI,EAAI,KAAK,IAAK,CAEnD,CAQA,cAAe,CAGd,OAAO,KAAK,UAAY,KAAK,IAAK,KAAK,OAAQ,CAAE,CAElD,CAQA,eAAgB,CAGf,OAAO,KAAK,UAAY,KAAK,IAAK,KAAK,OAAQ,CAAE,CAElD,CAUA,cAAe0F,EAAUizC,EAAWC,EAAY,CAE/C5sB,GAAM,IAAK,GAAI,GAAI,EAAI,EAAE,aAAc,KAAK,uBAAwB,EAEpE2sB,EAAU,IAAK3sB,GAAM,EAAGA,GAAM,CAAE,EAAE,eAAgB,CAAEtmB,EAAWsmB,GAAM,CAAE,EAEvEA,GAAM,IAAK,EAAG,EAAG,EAAI,EAAE,aAAc,KAAK,uBAAwB,EAElE4sB,EAAU,IAAK5sB,GAAM,EAAGA,GAAM,CAAE,EAAE,eAAgB,CAAEtmB,EAAWsmB,GAAM,CAAE,CAExE,CASA,YAAatmB,EAAUrD,EAAS,CAE/B,YAAK,cAAeqD,EAAUumB,GAAYC,EAAW,EAE9C7pB,EAAO,WAAY6pB,GAAYD,EAAW,CAElD,CA6CA,cAAe4sB,EAAWC,EAAYz6C,EAAGM,EAAGwY,EAAOC,EAAS,CAE3D,KAAK,OAASyhC,EAAYC,EAErB,KAAK,OAAS,OAElB,KAAK,KAAO,CACX,QAAS,GACT,UAAW,EACX,WAAY,EACZ,QAAS,EACT,QAAS,EACT,MAAO,EACP,OAAQ,CACT,GAID,KAAK,KAAK,QAAU,GACpB,KAAK,KAAK,UAAYD,EACtB,KAAK,KAAK,WAAaC,EACvB,KAAK,KAAK,QAAUz6C,EACpB,KAAK,KAAK,QAAUM,EACpB,KAAK,KAAK,MAAQwY,EAClB,KAAK,KAAK,OAASC,EAEnB,KAAK,uBAAuB,CAE7B,CAKA,iBAAkB,CAEZ,KAAK,OAAS,OAElB,KAAK,KAAK,QAAU,IAIrB,KAAK,uBAAuB,CAE7B,CAMA,wBAAyB,CAExB,IAAM+3B,EAAO,KAAK,KACdF,EAAME,EAAO,KAAK,IAAKnvC,GAAU,GAAM,KAAK,GAAI,EAAI,KAAK,KACzDoX,EAAS,EAAI63B,EACb93B,EAAQ,KAAK,OAASC,EACtB23B,EAAO,IAAO53B,EACZ4hC,EAAO,KAAK,KAElB,GAAK,KAAK,OAAS,MAAQ,KAAK,KAAK,QAAU,CAE9C,IAAMF,EAAYE,EAAK,UACtBD,EAAaC,EAAK,WAEnBhK,GAAQgK,EAAK,QAAU5hC,EAAQ0hC,EAC/B5J,GAAO8J,EAAK,QAAU3hC,EAAS0hC,EAC/B3hC,GAAS4hC,EAAK,MAAQF,EACtBzhC,GAAU2hC,EAAK,OAASD,CAEzB,CAEA,IAAME,EAAO,KAAK,WACbA,IAAS,IAAIjK,GAAQI,EAAO6J,EAAO,KAAK,aAAa,GAE1D,KAAK,iBAAiB,gBAAiBjK,EAAMA,EAAO53B,EAAO83B,EAAKA,EAAM73B,EAAQ+3B,EAAM,KAAK,IAAK,KAAK,iBAAkB,KAAK,aAAc,EAExI,KAAK,wBAAwB,KAAM,KAAK,gBAAiB,EAAE,OAAO,CAEnE,CAEA,OAAQjI,EAAO,CAEd,IAAM97B,EAAO,MAAM,OAAQ87B,CAAK,EAEhC,OAAA97B,EAAK,OAAO,IAAM,KAAK,IACvBA,EAAK,OAAO,KAAO,KAAK,KAExBA,EAAK,OAAO,KAAO,KAAK,KACxBA,EAAK,OAAO,IAAM,KAAK,IACvBA,EAAK,OAAO,MAAQ,KAAK,MAEzBA,EAAK,OAAO,OAAS,KAAK,OAErB,KAAK,OAAS,OAAOA,EAAK,OAAO,KAAO,OAAO,OAAQ,CAAC,EAAG,KAAK,IAAK,GAE1EA,EAAK,OAAO,UAAY,KAAK,UAC7BA,EAAK,OAAO,WAAa,KAAK,WAEvBA,CAER,CAED,EAEMghB,GAAM,IACNtV,GAAS,EAgCTuV,GAAN,cAAyB9D,EAAS,CASjC,YAAa4mB,EAAMC,EAAK6J,EAAe,CAEtC,MAAM,EAEN,KAAK,KAAO,aAOZ,KAAK,aAAeA,EAQpB,KAAK,iBAAmB,KAQxB,KAAK,kBAAoB,EAEzB,IAAMC,EAAW,IAAI/sB,GAAmBC,GAAKtV,GAAQq4B,EAAMC,CAAI,EAC/D8J,EAAS,OAAS,KAAK,OACvB,KAAK,IAAKA,CAAS,EAEnB,IAAMC,EAAW,IAAIhtB,GAAmBC,GAAKtV,GAAQq4B,EAAMC,CAAI,EAC/D+J,EAAS,OAAS,KAAK,OACvB,KAAK,IAAKA,CAAS,EAEnB,IAAMC,EAAW,IAAIjtB,GAAmBC,GAAKtV,GAAQq4B,EAAMC,CAAI,EAC/DgK,EAAS,OAAS,KAAK,OACvB,KAAK,IAAKA,CAAS,EAEnB,IAAMC,EAAW,IAAIltB,GAAmBC,GAAKtV,GAAQq4B,EAAMC,CAAI,EAC/DiK,EAAS,OAAS,KAAK,OACvB,KAAK,IAAKA,CAAS,EAEnB,IAAMC,EAAW,IAAIntB,GAAmBC,GAAKtV,GAAQq4B,EAAMC,CAAI,EAC/DkK,EAAS,OAAS,KAAK,OACvB,KAAK,IAAKA,CAAS,EAEnB,IAAMC,EAAW,IAAIptB,GAAmBC,GAAKtV,GAAQq4B,EAAMC,CAAI,EAC/DmK,EAAS,OAAS,KAAK,OACvB,KAAK,IAAKA,CAAS,CAEpB,CAKA,wBAAyB,CAExB,IAAMlK,EAAmB,KAAK,iBAExBmK,EAAU,KAAK,SAAS,OAAO,EAE/B,CAAEN,EAAUC,EAAUC,EAAUC,EAAUC,EAAUC,CAAS,EAAIC,EAEvE,QAAYhjC,KAAUgjC,EAAU,KAAK,OAAQhjC,CAAO,EAEpD,GAAK64B,IAAqB1rB,GAEzBu1B,EAAS,GAAG,IAAK,EAAG,EAAG,CAAE,EACzBA,EAAS,OAAQ,EAAG,EAAG,CAAE,EAEzBC,EAAS,GAAG,IAAK,EAAG,EAAG,CAAE,EACzBA,EAAS,OAAQ,GAAI,EAAG,CAAE,EAE1BC,EAAS,GAAG,IAAK,EAAG,EAAG,EAAG,EAC1BA,EAAS,OAAQ,EAAG,EAAG,CAAE,EAEzBC,EAAS,GAAG,IAAK,EAAG,EAAG,CAAE,EACzBA,EAAS,OAAQ,EAAG,GAAI,CAAE,EAE1BC,EAAS,GAAG,IAAK,EAAG,EAAG,CAAE,EACzBA,EAAS,OAAQ,EAAG,EAAG,CAAE,EAEzBC,EAAS,GAAG,IAAK,EAAG,EAAG,CAAE,EACzBA,EAAS,OAAQ,EAAG,EAAG,EAAG,UAEflK,IAAqBzrB,GAEhCs1B,EAAS,GAAG,IAAK,EAAG,GAAI,CAAE,EAC1BA,EAAS,OAAQ,GAAI,EAAG,CAAE,EAE1BC,EAAS,GAAG,IAAK,EAAG,GAAI,CAAE,EAC1BA,EAAS,OAAQ,EAAG,EAAG,CAAE,EAEzBC,EAAS,GAAG,IAAK,EAAG,EAAG,CAAE,EACzBA,EAAS,OAAQ,EAAG,EAAG,CAAE,EAEzBC,EAAS,GAAG,IAAK,EAAG,EAAG,EAAG,EAC1BA,EAAS,OAAQ,EAAG,GAAI,CAAE,EAE1BC,EAAS,GAAG,IAAK,EAAG,GAAI,CAAE,EAC1BA,EAAS,OAAQ,EAAG,EAAG,CAAE,EAEzBC,EAAS,GAAG,IAAK,EAAG,GAAI,CAAE,EAC1BA,EAAS,OAAQ,EAAG,EAAG,EAAG,MAI1B,OAAM,IAAI,MAAO,yEAA2ElK,CAAiB,EAI9G,QAAY74B,KAAUgjC,EAErB,KAAK,IAAKhjC,CAAO,EAEjBA,EAAO,kBAAkB,CAI3B,CASA,OAAQpP,EAAUqyC,EAAQ,CAEpB,KAAK,SAAW,MAAO,KAAK,kBAAkB,EAEnD,GAAM,CAAE,aAAAR,EAAc,kBAAAS,CAAkB,EAAI,KAEvC,KAAK,mBAAqBtyC,EAAS,mBAEvC,KAAK,iBAAmBA,EAAS,iBAEjC,KAAK,uBAAuB,GAI7B,GAAM,CAAE8xC,EAAUC,EAAUC,EAAUC,EAAUC,EAAUC,CAAS,EAAI,KAAK,SAEtElyC,EAAsBD,EAAS,gBAAgB,EAC/CuyC,EAAwBvyC,EAAS,kBAAkB,EACnDwyC,EAA2BxyC,EAAS,qBAAqB,EAEzDyyC,EAAmBzyC,EAAS,GAAG,QAErCA,EAAS,GAAG,QAAU,GAEtB,IAAM0yC,EAAkBb,EAAa,QAAQ,gBAE7CA,EAAa,QAAQ,gBAAkB,GAEvC7xC,EAAS,gBAAiB6xC,EAAc,EAAGS,CAAkB,EAC7DtyC,EAAS,OAAQqyC,EAAOP,CAAS,EAEjC9xC,EAAS,gBAAiB6xC,EAAc,EAAGS,CAAkB,EAC7DtyC,EAAS,OAAQqyC,EAAON,CAAS,EAEjC/xC,EAAS,gBAAiB6xC,EAAc,EAAGS,CAAkB,EAC7DtyC,EAAS,OAAQqyC,EAAOL,CAAS,EAEjChyC,EAAS,gBAAiB6xC,EAAc,EAAGS,CAAkB,EAC7DtyC,EAAS,OAAQqyC,EAAOJ,CAAS,EAEjCjyC,EAAS,gBAAiB6xC,EAAc,EAAGS,CAAkB,EAC7DtyC,EAAS,OAAQqyC,EAAOH,CAAS,EAKjCL,EAAa,QAAQ,gBAAkBa,EAEvC1yC,EAAS,gBAAiB6xC,EAAc,EAAGS,CAAkB,EAC7DtyC,EAAS,OAAQqyC,EAAOF,CAAS,EAEjCnyC,EAAS,gBAAiBC,EAAqBsyC,EAAuBC,CAAyB,EAE/FxyC,EAAS,GAAG,QAAUyyC,EAEtBZ,EAAa,QAAQ,iBAAmB,EAEzC,CAED,EAkBM3sB,GAAN,cAA0B3H,EAAQ,CAgBjC,YAAamsB,EAAS,CAAC,EAAGvJ,EAAU3oB,GAAuB4oB,EAAOC,EAAOC,EAAWC,EAAWtwB,EAAQxb,EAAM+rC,EAAY1lC,EAAa,CAErI,MAAO4uC,EAAQvJ,EAASC,EAAOC,EAAOC,EAAWC,EAAWtwB,EAAQxb,EAAM+rC,EAAY1lC,CAAW,EASjG,KAAK,cAAgB,GAWrB,KAAK,MAAQ,EAEd,CAOA,IAAI,QAAS,CAEZ,OAAO,KAAK,KAEb,CAEA,IAAI,OAAQpE,EAAQ,CAEnB,KAAK,MAAQA,CAEd,CAED,EAOMyuB,GAAN,cAAoCzH,EAAkB,CAQrD,YAAa8jB,EAAO,EAAG/2B,EAAU,CAAC,EAAI,CAErC,MAAO+2B,EAAMA,EAAM/2B,CAAQ,EAS3B,KAAK,wBAA0B,GAE/B,IAAM9O,EAAQ,CAAE,MAAO6lC,EAAM,OAAQA,EAAM,MAAO,CAAE,EAC9CkI,EAAS,CAAE/tC,EAAOA,EAAOA,EAAOA,EAAOA,EAAOA,CAAM,EAO1D,KAAK,QAAU,IAAIupB,GAAawkB,CAAO,EACvC,KAAK,mBAAoBj/B,CAAQ,EAUjC,KAAK,QAAQ,sBAAwB,EAEtC,CASA,2BAA4BzK,EAAUyP,EAAU,CAE/C,KAAK,QAAQ,KAAOA,EAAQ,KAC5B,KAAK,QAAQ,WAAaA,EAAQ,WAElC,KAAK,QAAQ,gBAAkBA,EAAQ,gBACvC,KAAK,QAAQ,UAAYA,EAAQ,UACjC,KAAK,QAAQ,UAAYA,EAAQ,UAEjC,IAAMkjC,EAAS,CAEd,SAAU,CACT,UAAW,CAAE,MAAO,IAAK,CAC1B,EAEA,aAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAoBxB,eAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAkB3B,EAEMxjC,EAAW,IAAImV,GAAa,EAAG,EAAG,CAAE,EAEpC3mB,EAAW,IAAI+mB,GAAgB,CAEpC,KAAM,sBAEN,SAAUrlB,GAAeszC,EAAO,QAAS,EACzC,aAAcA,EAAO,aACrB,eAAgBA,EAAO,eACvB,KAAMx0C,GACN,SAAUqW,EAEX,CAAE,EAEF7W,EAAS,SAAS,UAAU,MAAQ8R,EAEpC,IAAMmjC,EAAO,IAAIvuB,GAAMlV,EAAUxR,CAAS,EAEpCk1C,EAAmBpjC,EAAQ,UAGjC,OAAKA,EAAQ,YAAc+I,KAA2B/I,EAAQ,UAAY4I,IAE3D,IAAI4M,GAAY,EAAG,GAAI,IAAK,EACpC,OAAQjlB,EAAU4yC,CAAK,EAE9BnjC,EAAQ,UAAYojC,EAEpBD,EAAK,SAAS,QAAQ,EACtBA,EAAK,SAAS,QAAQ,EAEf,IAER,CAUA,MAAO5yC,EAAUxF,EAAQ,GAAM6mC,EAAQ,GAAMyR,EAAU,GAAO,CAE7D,IAAM7yC,EAAsBD,EAAS,gBAAgB,EAErD,QAAUzL,EAAI,EAAGA,EAAI,EAAGA,IAEvByL,EAAS,gBAAiB,KAAMzL,CAAE,EAElCyL,EAAS,MAAOxF,EAAO6mC,EAAOyR,CAAQ,EAIvC9yC,EAAS,gBAAiBC,CAAoB,CAE/C,CAED,EAmBMmlB,GAAN,cAAoBjE,EAAS,CAE5B,aAAc,CAEb,MAAM,EASN,KAAK,QAAU,GAEf,KAAK,KAAO,OAEb,CAED,EAEMkE,IAAa,CAAE,KAAM,MAAO,EAQ5BC,GAAN,KAAsB,CAKrB,aAAc,CAUb,KAAK,WAAa,KAUlB,KAAK,MAAQ,KAUb,KAAK,MAAQ,IAEd,CAOA,cAAe,CAEd,OAAK,KAAK,QAAU,OAEnB,KAAK,MAAQ,IAAIF,GACjB,KAAK,MAAM,iBAAmB,GAC9B,KAAK,MAAM,QAAU,GAErB,KAAK,MAAM,OAAS,CAAC,EACrB,KAAK,MAAM,WAAa,CAAE,SAAU,EAAM,GAIpC,KAAK,KAEb,CAOA,mBAAoB,CAEnB,OAAK,KAAK,aAAe,OAExB,KAAK,WAAa,IAAIA,GACtB,KAAK,WAAW,iBAAmB,GACnC,KAAK,WAAW,QAAU,GAC1B,KAAK,WAAW,kBAAoB,GACpC,KAAK,WAAW,eAAiB,IAAInmB,EACrC,KAAK,WAAW,mBAAqB,GACrC,KAAK,WAAW,gBAAkB,IAAIA,GAIhC,KAAK,UAEb,CAOA,cAAe,CAEd,OAAK,KAAK,QAAU,OAEnB,KAAK,MAAQ,IAAImmB,GACjB,KAAK,MAAM,iBAAmB,GAC9B,KAAK,MAAM,QAAU,GACrB,KAAK,MAAM,kBAAoB,GAC/B,KAAK,MAAM,eAAiB,IAAInmB,EAChC,KAAK,MAAM,mBAAqB,GAChC,KAAK,MAAM,gBAAkB,IAAIA,GAI3B,KAAK,KAEb,CASA,cAAe84B,EAAQ,CAEtB,OAAK,KAAK,aAAe,MAExB,KAAK,WAAW,cAAeA,CAAM,EAIjC,KAAK,QAAU,MAEnB,KAAK,MAAM,cAAeA,CAAM,EAI5B,KAAK,QAAU,MAEnB,KAAK,MAAM,cAAeA,CAAM,EAI1B,IAER,CAQA,QAASgb,EAAc,CAEtB,GAAKA,GAAeA,EAAY,KAAO,CAEtC,IAAMC,EAAO,KAAK,MAElB,GAAKA,EAEJ,QAAYC,KAAcF,EAAY,KAAK,OAAO,EAGjD,KAAK,cAAeC,EAAMC,CAAW,CAMxC,CAEA,YAAK,cAAe,CAAE,KAAM,YAAa,KAAMF,CAAY,CAAE,EAEtD,IAER,CAQA,WAAYA,EAAc,CAEzB,YAAK,cAAe,CAAE,KAAM,eAAgB,KAAMA,CAAY,CAAE,EAE3D,KAAK,aAAe,OAExB,KAAK,WAAW,QAAU,IAItB,KAAK,QAAU,OAEnB,KAAK,MAAM,QAAU,IAIjB,KAAK,QAAU,OAEnB,KAAK,MAAM,QAAU,IAIf,IAER,CAYA,OAAQA,EAAaxmC,EAAO2mC,EAAiB,CAE5C,IAAIC,EAAY,KACZC,EAAW,KACXC,EAAW,KAETC,EAAY,KAAK,WACjBC,EAAO,KAAK,MACZP,EAAO,KAAK,MAElB,GAAKD,GAAexmC,EAAM,QAAQ,kBAAoB,kBAAoB,CAEzE,GAAKymC,GAAQD,EAAY,KAAO,CAE/BM,EAAW,GAEX,QAAYJ,KAAcF,EAAY,KAAK,OAAO,EAAI,CAGrD,IAAMS,EAAYjnC,EAAM,aAAc0mC,EAAYC,CAAe,EAG3DO,EAAQ,KAAK,cAAeT,EAAMC,CAAW,EAE9CO,IAAc,OAElBC,EAAM,OAAO,UAAWD,EAAU,UAAU,MAAO,EACnDC,EAAM,OAAO,UAAWA,EAAM,SAAUA,EAAM,SAAUA,EAAM,KAAM,EACpEA,EAAM,uBAAyB,GAC/BA,EAAM,YAAcD,EAAU,QAI/BC,EAAM,QAAUD,IAAc,IAE/B,CAKA,IAAME,EAAWV,EAAK,OAAQ,kBAAmB,EAC3CW,EAAWX,EAAK,OAAQ,WAAY,EACpC10C,EAAWo1C,EAAS,SAAS,WAAYC,EAAS,QAAS,EAE3DC,EAAkB,IAClBC,EAAY,KAEbb,EAAK,WAAW,UAAY10C,EAAWs1C,EAAkBC,GAE7Db,EAAK,WAAW,SAAW,GAC3B,KAAK,cAAe,CACnB,KAAM,WACN,WAAYD,EAAY,WACxB,OAAQ,IACT,CAAE,GAES,CAAEC,EAAK,WAAW,UAAY10C,GAAYs1C,EAAkBC,IAEvEb,EAAK,WAAW,SAAW,GAC3B,KAAK,cAAe,CACnB,KAAM,aACN,WAAYD,EAAY,WACxB,OAAQ,IACT,CAAE,EAIJ,MAEMQ,IAAS,MAAQR,EAAY,YAEjCK,EAAW7mC,EAAM,QAASwmC,EAAY,UAAWG,CAAe,EAE3DE,IAAa,OAEjBG,EAAK,OAAO,UAAWH,EAAS,UAAU,MAAO,EACjDG,EAAK,OAAO,UAAWA,EAAK,SAAUA,EAAK,SAAUA,EAAK,KAAM,EAChEA,EAAK,uBAAyB,GAEzBH,EAAS,gBAEbG,EAAK,kBAAoB,GACzBA,EAAK,eAAe,KAAMH,EAAS,cAAe,GAIlDG,EAAK,kBAAoB,GAIrBH,EAAS,iBAEbG,EAAK,mBAAqB,GAC1BA,EAAK,gBAAgB,KAAMH,EAAS,eAAgB,GAIpDG,EAAK,mBAAqB,KAUzBD,IAAc,OAElBH,EAAY5mC,EAAM,QAASwmC,EAAY,eAAgBG,CAAe,EAGjEC,IAAc,MAAQC,IAAa,OAEvCD,EAAYC,GAIRD,IAAc,OAElBG,EAAU,OAAO,UAAWH,EAAU,UAAU,MAAO,EACvDG,EAAU,OAAO,UAAWA,EAAU,SAAUA,EAAU,SAAUA,EAAU,KAAM,EACpFA,EAAU,uBAAyB,GAE9BH,EAAU,gBAEdG,EAAU,kBAAoB,GAC9BA,EAAU,eAAe,KAAMH,EAAU,cAAe,GAIxDG,EAAU,kBAAoB,GAI1BH,EAAU,iBAEdG,EAAU,mBAAqB,GAC/BA,EAAU,gBAAgB,KAAMH,EAAU,eAAgB,GAI1DG,EAAU,mBAAqB,GAIhC,KAAK,cAAejuB,GAAW,GAOlC,CAEA,OAAKiuB,IAAc,OAElBA,EAAU,QAAYH,IAAc,MAIhCI,IAAS,OAEbA,EAAK,QAAYH,IAAa,MAI1BJ,IAAS,OAEbA,EAAK,QAAYK,IAAa,MAIxB,IAER,CAUA,cAAeL,EAAMC,EAAa,CAEjC,GAAKD,EAAK,OAAQC,EAAW,SAAU,IAAM,OAAY,CAExD,IAAMQ,EAAQ,IAAIruB,GAClBquB,EAAM,iBAAmB,GACzBA,EAAM,QAAU,GAChBT,EAAK,OAAQC,EAAW,SAAU,EAAIQ,EAEtCT,EAAK,IAAKS,CAAM,CAEjB,CAEA,OAAOT,EAAK,OAAQC,EAAW,SAAU,CAE1C,CAED,EAYM1tB,GAAN,MAAMuuB,CAAQ,CAQb,YAAat5C,EAAOu5C,EAAU,MAAU,CASvC,KAAK,UAAY,GAOjB,KAAK,KAAO,GAOZ,KAAK,MAAQ,IAAI3xB,GAAO5nB,CAAM,EAQ9B,KAAK,QAAUu5C,CAEhB,CAOA,OAAQ,CAEP,OAAO,IAAID,EAAS,KAAK,MAAO,KAAK,OAAQ,CAE9C,CAQA,QAAqB,CAEpB,MAAO,CACN,KAAM,UACN,KAAM,KAAK,KACX,MAAO,KAAK,MAAM,OAAO,EACzB,QAAS,KAAK,OACf,CAED,CAED,EAWMtuB,GAAN,MAAMwuB,CAAI,CAST,YAAax5C,EAAOutC,EAAO,EAAGC,EAAM,IAAO,CAS1C,KAAK,MAAQ,GAOb,KAAK,KAAO,GAOZ,KAAK,MAAQ,IAAI5lB,GAAO5nB,CAAM,EAS9B,KAAK,KAAOutC,EAUZ,KAAK,IAAMC,CAEZ,CAOA,OAAQ,CAEP,OAAO,IAAIgM,EAAK,KAAK,MAAO,KAAK,KAAM,KAAK,GAAI,CAEjD,CAQA,QAAqB,CAEpB,MAAO,CACN,KAAM,MACN,KAAM,KAAK,KACX,MAAO,KAAK,MAAM,OAAO,EACzB,KAAM,KAAK,KACX,IAAK,KAAK,GACX,CAED,CAED,EAQMvuB,GAAN,cAAoBtE,EAAS,CAK5B,aAAc,CAEb,MAAM,EASN,KAAK,QAAU,GAEf,KAAK,KAAO,QAYZ,KAAK,WAAa,KAUlB,KAAK,YAAc,KASnB,KAAK,IAAM,KAUX,KAAK,qBAAuB,EAQ5B,KAAK,oBAAsB,EAS3B,KAAK,mBAAqB,IAAIjB,GAS9B,KAAK,qBAAuB,EAS5B,KAAK,oBAAsB,IAAIA,GAS/B,KAAK,iBAAmB,KAEnB,OAAO,mBAAuB,KAElC,mBAAmB,cAAe,IAAI,YAAa,UAAW,CAAE,OAAQ,IAAK,CAAE,CAAE,CAInF,CAEA,KAAMwgB,EAAQ/xB,EAAY,CAEzB,aAAM,KAAM+xB,EAAQ/xB,CAAU,EAEzB+xB,EAAO,aAAe,OAAO,KAAK,WAAaA,EAAO,WAAW,MAAM,GACvEA,EAAO,cAAgB,OAAO,KAAK,YAAcA,EAAO,YAAY,MAAM,GAC1EA,EAAO,MAAQ,OAAO,KAAK,IAAMA,EAAO,IAAI,MAAM,GAEvD,KAAK,qBAAuBA,EAAO,qBACnC,KAAK,oBAAsBA,EAAO,oBAClC,KAAK,mBAAmB,KAAMA,EAAO,kBAAmB,EAExD,KAAK,qBAAuBA,EAAO,qBACnC,KAAK,oBAAoB,KAAMA,EAAO,mBAAoB,EAErDA,EAAO,mBAAqB,OAAO,KAAK,iBAAmBA,EAAO,iBAAiB,MAAM,GAE9F,KAAK,iBAAmBA,EAAO,iBAExB,IAER,CAEA,OAAQZ,EAAO,CAEd,IAAM97B,EAAO,MAAM,OAAQ87B,CAAK,EAEhC,OAAK,KAAK,MAAQ,OAAO97B,EAAK,OAAO,IAAM,KAAK,IAAI,OAAO,GAEtD,KAAK,qBAAuB,IAAIA,EAAK,OAAO,qBAAuB,KAAK,sBACxE,KAAK,sBAAwB,IAAIA,EAAK,OAAO,oBAAsB,KAAK,qBAC7EA,EAAK,OAAO,mBAAqB,KAAK,mBAAmB,QAAQ,EAE5D,KAAK,uBAAyB,IAAIA,EAAK,OAAO,qBAAuB,KAAK,sBAC/EA,EAAK,OAAO,oBAAsB,KAAK,oBAAoB,QAAQ,EAE5DA,CAER,CAED,EAQM0hB,GAAN,KAAwB,CAQvB,YAAapxB,EAAOgX,EAAS,CAS5B,KAAK,oBAAsB,GAO3B,KAAK,MAAQhX,EAOb,KAAK,OAASgX,EAQd,KAAK,MAAQhX,IAAU,OAAYA,EAAM,OAASgX,EAAS,EAW3D,KAAK,MAAQsQ,GAQb,KAAK,aAAe,CAAC,EAOrB,KAAK,QAAU,EAQf,KAAK,KAAOzlB,GAAa,CAE1B,CAMA,kBAAmB,CAAC,CAUpB,IAAI,YAAaO,EAAQ,CAEnBA,IAAU,IAAO,KAAK,SAE5B,CAQA,SAAUA,EAAQ,CAEjB,YAAK,MAAQA,EAEN,IAER,CAQA,eAAgBqO,EAAO07B,EAAQ,CAE9B,KAAK,aAAa,KAAM,CAAE,MAAA17B,EAAO,MAAA07B,CAAM,CAAE,CAE1C,CAKA,mBAAoB,CAEnB,KAAK,aAAa,OAAS,CAE5B,CAQA,KAAMC,EAAS,CAEd,YAAK,MAAQ,IAAIA,EAAO,MAAM,YAAaA,EAAO,KAAM,EACxD,KAAK,MAAQA,EAAO,MACpB,KAAK,OAASA,EAAO,OACrB,KAAK,MAAQA,EAAO,MAEb,IAER,CAYA,OAAQwL,EAAQ+H,EAAmB9H,EAAS,CAE3CD,GAAU,KAAK,OACfC,GAAU8H,EAAkB,OAE5B,QAAU1/C,EAAI,EAAG4V,EAAI,KAAK,OAAQ5V,EAAI4V,EAAG5V,IAExC,KAAK,MAAO23C,EAAS33C,CAAE,EAAI0/C,EAAkB,MAAO9H,EAAS53C,CAAE,EAIhE,OAAO,IAER,CASA,IAAKmC,EAAOgiC,EAAS,EAAI,CAExB,YAAK,MAAM,IAAKhiC,EAAOgiC,CAAO,EAEvB,IAER,CAQA,MAAO10B,EAAO,CAERA,EAAK,eAAiB,SAE1BA,EAAK,aAAe,CAAC,GAIjB,KAAK,MAAM,OAAO,QAAU,SAEhC,KAAK,MAAM,OAAO,MAAQ7N,GAAa,GAInC6N,EAAK,aAAc,KAAK,MAAM,OAAO,KAAM,IAAM,SAErDA,EAAK,aAAc,KAAK,MAAM,OAAO,KAAM,EAAI,KAAK,MAAM,MAAO,CAAE,EAAE,QAItE,IAAM1P,EAAQ,IAAI,KAAK,MAAM,YAAa0P,EAAK,aAAc,KAAK,MAAM,OAAO,KAAM,CAAE,EAEjFkwC,EAAK,IAAI,KAAK,YAAa5/C,EAAO,KAAK,MAAO,EACpD,OAAA4/C,EAAG,SAAU,KAAK,KAAM,EAEjBA,CAER,CAUA,SAAUxY,EAAW,CAEpB,YAAK,iBAAmBA,EAEjB,IAER,CAQA,OAAQ13B,EAAO,CAEd,OAAKA,EAAK,eAAiB,SAE1BA,EAAK,aAAe,CAAC,GAMjB,KAAK,MAAM,OAAO,QAAU,SAEhC,KAAK,MAAM,OAAO,MAAQ7N,GAAa,GAInC6N,EAAK,aAAc,KAAK,MAAM,OAAO,KAAM,IAAM,SAErDA,EAAK,aAAc,KAAK,MAAM,OAAO,KAAM,EAAI,MAAM,KAAM,IAAI,YAAa,KAAK,MAAM,MAAO,CAAE,GAM1F,CACN,KAAM,KAAK,KACX,OAAQ,KAAK,MAAM,OAAO,MAC1B,KAAM,KAAK,MAAM,YAAY,KAC7B,OAAQ,KAAK,MACd,CAED,CAED,EAEM2hB,GAA0B,IAAI1mB,EAO9B2mB,GAAN,MAAMuuB,CAA2B,CAUhC,YAAaF,EAAmBlzC,EAAU23B,EAAQuT,EAAa,GAAQ,CAStE,KAAK,6BAA+B,GAOpC,KAAK,KAAO,GAOZ,KAAK,KAAOgI,EAOZ,KAAK,SAAWlzC,EAOhB,KAAK,OAAS23B,EAOd,KAAK,WAAauT,CAEnB,CAQA,IAAI,OAAQ,CAEX,OAAO,KAAK,KAAK,KAElB,CAOA,IAAI,OAAQ,CAEX,OAAO,KAAK,KAAK,KAElB,CAUA,IAAI,YAAav1C,EAAQ,CAExB,KAAK,KAAK,YAAcA,CAEzB,CASA,aAAcK,EAAI,CAEjB,QAAUxC,EAAI,EAAG4V,EAAI,KAAK,KAAK,MAAO5V,EAAI4V,EAAG5V,IAE5CoxB,GAAU,oBAAqB,KAAMpxB,CAAE,EAEvCoxB,GAAU,aAAc5uB,CAAE,EAE1B,KAAK,OAAQxC,EAAGoxB,GAAU,EAAGA,GAAU,EAAGA,GAAU,CAAE,EAIvD,OAAO,IAER,CASA,kBAAmB5uB,EAAI,CAEtB,QAAUxC,EAAI,EAAG4V,EAAI,KAAK,MAAO5V,EAAI4V,EAAG5V,IAEvCoxB,GAAU,oBAAqB,KAAMpxB,CAAE,EAEvCoxB,GAAU,kBAAmB5uB,CAAE,EAE/B,KAAK,OAAQxC,EAAGoxB,GAAU,EAAGA,GAAU,EAAGA,GAAU,CAAE,EAIvD,OAAO,IAER,CASA,mBAAoB5uB,EAAI,CAEvB,QAAUxC,EAAI,EAAG4V,EAAI,KAAK,MAAO5V,EAAI4V,EAAG5V,IAEvCoxB,GAAU,oBAAqB,KAAMpxB,CAAE,EAEvCoxB,GAAU,mBAAoB5uB,CAAE,EAEhC,KAAK,OAAQxC,EAAGoxB,GAAU,EAAGA,GAAU,EAAGA,GAAU,CAAE,EAIvD,OAAO,IAER,CASA,aAAchkB,EAAOyqC,EAAY,CAEhC,IAAI11C,EAAQ,KAAK,MAAOiL,EAAQ,KAAK,KAAK,OAAS,KAAK,OAASyqC,CAAU,EAE3E,OAAK,KAAK,aAAa11C,EAAQyD,GAAazD,EAAO,KAAK,KAAM,GAEvDA,CAER,CAUA,aAAciL,EAAOyqC,EAAW11C,EAAQ,CAEvC,OAAK,KAAK,aAAaA,EAAQ0D,GAAW1D,EAAO,KAAK,KAAM,GAE5D,KAAK,KAAK,MAAOiL,EAAQ,KAAK,KAAK,OAAS,KAAK,OAASyqC,CAAU,EAAI11C,EAEjE,IAER,CASA,KAAMiL,EAAO1K,EAAI,CAEhB,OAAK,KAAK,aAAaA,EAAImD,GAAWnD,EAAG,KAAK,KAAM,GAEpD,KAAK,KAAK,MAAO0K,EAAQ,KAAK,KAAK,OAAS,KAAK,MAAO,EAAI1K,EAErD,IAER,CASA,KAAM0K,EAAOpK,EAAI,CAEhB,OAAK,KAAK,aAAaA,EAAI6C,GAAW7C,EAAG,KAAK,KAAM,GAEpD,KAAK,KAAK,MAAOoK,EAAQ,KAAK,KAAK,OAAS,KAAK,OAAS,CAAE,EAAIpK,EAEzD,IAER,CASA,KAAMoK,EAAO0N,EAAI,CAEhB,OAAK,KAAK,aAAaA,EAAIjV,GAAWiV,EAAG,KAAK,KAAM,GAEpD,KAAK,KAAK,MAAO1N,EAAQ,KAAK,KAAK,OAAS,KAAK,OAAS,CAAE,EAAI0N,EAEzD,IAER,CASA,KAAM1N,EAAOk3B,EAAI,CAEhB,OAAK,KAAK,aAAaA,EAAIz+B,GAAWy+B,EAAG,KAAK,KAAM,GAEpD,KAAK,KAAK,MAAOl3B,EAAQ,KAAK,KAAK,OAAS,KAAK,OAAS,CAAE,EAAIk3B,EAEzD,IAER,CAQA,KAAMl3B,EAAQ,CAEb,IAAI1K,EAAI,KAAK,KAAK,MAAO0K,EAAQ,KAAK,KAAK,OAAS,KAAK,MAAO,EAEhE,OAAK,KAAK,aAAa1K,EAAIkD,GAAalD,EAAG,KAAK,KAAM,GAE/CA,CAER,CAQA,KAAM0K,EAAQ,CAEb,IAAIpK,EAAI,KAAK,KAAK,MAAOoK,EAAQ,KAAK,KAAK,OAAS,KAAK,OAAS,CAAE,EAEpE,OAAK,KAAK,aAAapK,EAAI4C,GAAa5C,EAAG,KAAK,KAAM,GAE/CA,CAER,CAQA,KAAMoK,EAAQ,CAEb,IAAI0N,EAAI,KAAK,KAAK,MAAO1N,EAAQ,KAAK,KAAK,OAAS,KAAK,OAAS,CAAE,EAEpE,OAAK,KAAK,aAAa0N,EAAIlV,GAAakV,EAAG,KAAK,KAAM,GAE/CA,CAER,CAQA,KAAM1N,EAAQ,CAEb,IAAIk3B,EAAI,KAAK,KAAK,MAAOl3B,EAAQ,KAAK,KAAK,OAAS,KAAK,OAAS,CAAE,EAEpE,OAAK,KAAK,aAAak3B,EAAI1+B,GAAa0+B,EAAG,KAAK,KAAM,GAE/CA,CAER,CAUA,MAAOl3B,EAAO1K,EAAGM,EAAI,CAEpB,OAAAoK,EAAQA,EAAQ,KAAK,KAAK,OAAS,KAAK,OAEnC,KAAK,aAET1K,EAAImD,GAAWnD,EAAG,KAAK,KAAM,EAC7BM,EAAI6C,GAAW7C,EAAG,KAAK,KAAM,GAI9B,KAAK,KAAK,MAAOoK,EAAQ,CAAE,EAAI1K,EAC/B,KAAK,KAAK,MAAO0K,EAAQ,CAAE,EAAIpK,EAExB,IAER,CAWA,OAAQoK,EAAO1K,EAAGM,EAAG8X,EAAI,CAExB,OAAA1N,EAAQA,EAAQ,KAAK,KAAK,OAAS,KAAK,OAEnC,KAAK,aAET1K,EAAImD,GAAWnD,EAAG,KAAK,KAAM,EAC7BM,EAAI6C,GAAW7C,EAAG,KAAK,KAAM,EAC7B8X,EAAIjV,GAAWiV,EAAG,KAAK,KAAM,GAI9B,KAAK,KAAK,MAAO1N,EAAQ,CAAE,EAAI1K,EAC/B,KAAK,KAAK,MAAO0K,EAAQ,CAAE,EAAIpK,EAC/B,KAAK,KAAK,MAAOoK,EAAQ,CAAE,EAAI0N,EAExB,IAER,CAYA,QAAS1N,EAAO1K,EAAGM,EAAG8X,EAAGwpB,EAAI,CAE5B,OAAAl3B,EAAQA,EAAQ,KAAK,KAAK,OAAS,KAAK,OAEnC,KAAK,aAET1K,EAAImD,GAAWnD,EAAG,KAAK,KAAM,EAC7BM,EAAI6C,GAAW7C,EAAG,KAAK,KAAM,EAC7B8X,EAAIjV,GAAWiV,EAAG,KAAK,KAAM,EAC7BwpB,EAAIz+B,GAAWy+B,EAAG,KAAK,KAAM,GAI9B,KAAK,KAAK,MAAOl3B,EAAQ,CAAE,EAAI1K,EAC/B,KAAK,KAAK,MAAO0K,EAAQ,CAAE,EAAIpK,EAC/B,KAAK,KAAK,MAAOoK,EAAQ,CAAE,EAAI0N,EAC/B,KAAK,KAAK,MAAO1N,EAAQ,CAAE,EAAIk3B,EAExB,IAER,CAUA,MAAO70B,EAAO,CAEb,GAAKA,IAAS,OAAY,CAEzB3O,GAAK,6GAA8G,EAEnH,IAAMf,EAAQ,CAAC,EAEf,QAAUC,EAAI,EAAGA,EAAI,KAAK,MAAOA,IAAO,CAEvC,IAAMoN,EAAQpN,EAAI,KAAK,KAAK,OAAS,KAAK,OAE1C,QAAU4H,EAAI,EAAGA,EAAI,KAAK,SAAUA,IAEnC7H,EAAM,KAAM,KAAK,KAAK,MAAOqN,EAAQxF,CAAE,CAAE,CAI3C,CAEA,OAAO,IAAI0mB,GAAiB,IAAI,KAAK,MAAM,YAAavuB,CAAM,EAAG,KAAK,SAAU,KAAK,UAAW,CAEjG,KAEC,QAAK0P,EAAK,qBAAuB,SAEhCA,EAAK,mBAAqB,CAAC,GAIvBA,EAAK,mBAAoB,KAAK,KAAK,IAAK,IAAM,SAElDA,EAAK,mBAAoB,KAAK,KAAK,IAAK,EAAI,KAAK,KAAK,MAAOA,CAAK,GAI5D,IAAImwC,EAA4BnwC,EAAK,mBAAoB,KAAK,KAAK,IAAK,EAAG,KAAK,SAAU,KAAK,OAAQ,KAAK,UAAW,CAIhI,CAUA,OAAQA,EAAO,CAEd,GAAKA,IAAS,OAAY,CAEzB3O,GAAK,kHAAmH,EAExH,IAAMf,EAAQ,CAAC,EAEf,QAAUC,EAAI,EAAGA,EAAI,KAAK,MAAOA,IAAO,CAEvC,IAAMoN,EAAQpN,EAAI,KAAK,KAAK,OAAS,KAAK,OAE1C,QAAU4H,EAAI,EAAGA,EAAI,KAAK,SAAUA,IAEnC7H,EAAM,KAAM,KAAK,KAAK,MAAOqN,EAAQxF,CAAE,CAAE,CAI3C,CAIA,MAAO,CACN,SAAU,KAAK,SACf,KAAM,KAAK,MAAM,YAAY,KAC7B,MAAO7H,EACP,WAAY,KAAK,UAClB,CAED,KAIC,QAAK0P,EAAK,qBAAuB,SAEhCA,EAAK,mBAAqB,CAAC,GAIvBA,EAAK,mBAAoB,KAAK,KAAK,IAAK,IAAM,SAElDA,EAAK,mBAAoB,KAAK,KAAK,IAAK,EAAI,KAAK,KAAK,OAAQA,CAAK,GAI7D,CACN,6BAA8B,GAC9B,SAAU,KAAK,SACf,KAAM,KAAK,KAAK,KAChB,OAAQ,KAAK,OACb,WAAY,KAAK,UAClB,CAIF,CAED,EAgBM6hB,GAAN,cAA6BtD,EAAS,CAWrC,YAAa4mB,EAAa,CAEzB,MAAM,EASN,KAAK,iBAAmB,GAExB,KAAK,KAAO,iBAQZ,KAAK,MAAQ,IAAI/mB,GAAO,QAAS,EAUjC,KAAK,IAAM,KAeX,KAAK,SAAW,KAQhB,KAAK,SAAW,EAQhB,KAAK,gBAAkB,GASvB,KAAK,YAAc,GAQnB,KAAK,IAAM,GAEX,KAAK,UAAW+mB,CAAW,CAE5B,CAEA,KAAMzI,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,MAAM,KAAMA,EAAO,KAAM,EAE9B,KAAK,IAAMA,EAAO,IAElB,KAAK,SAAWA,EAAO,SAEvB,KAAK,SAAWA,EAAO,SAEvB,KAAK,gBAAkBA,EAAO,gBAE9B,KAAK,IAAMA,EAAO,IAEX,IAER,CAED,EAIM3a,GAAgC,IAAI9mB,EACpC+mB,GAA4B,IAAI/mB,EAChCgnB,GAA4B,IAAIhnB,EAEhCsB,GAAiC,IAAIpB,GACrCqB,GAAiC,IAAIrB,GACrCsB,GAAiC,IAAI+e,GAErC0G,GAAoB,IAAIjnB,EACxBknB,GAAoB,IAAIlnB,EACxBmnB,GAAoB,IAAInnB,EAExBonB,GAAqB,IAAIlnB,GACzBmnB,GAAqB,IAAInnB,GACzBonB,GAAqB,IAAIpnB,GAmBzBqnB,GAAN,cAAqBrF,EAAS,CAO7B,YAAaxjB,EAAW,IAAIkoB,GAAmB,CAe9C,GAbA,MAAM,EASN,KAAK,SAAW,GAEhB,KAAK,KAAO,SAEPC,KAAc,OAAY,CAE9BA,GAAY,IAAIhC,GAEhB,IAAMswB,EAAe,IAAI,aAAc,CACtC,IAAM,IAAM,EAAG,EAAG,EAClB,GAAK,IAAM,EAAG,EAAG,EACjB,GAAK,GAAK,EAAG,EAAG,EAChB,IAAM,GAAK,EAAG,EAAG,CAClB,CAAE,EAEIH,EAAoB,IAAIvuB,GAAmB0uB,EAAc,CAAE,EAEjEtuB,GAAU,SAAU,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAE,EACzCA,GAAU,aAAc,WAAY,IAAIF,GAA4BquB,EAAmB,EAAG,EAAG,EAAM,CAAE,EACrGnuB,GAAU,aAAc,KAAM,IAAIF,GAA4BquB,EAAmB,EAAG,EAAG,EAAM,CAAE,CAEhG,CAOA,KAAK,SAAWnuB,GAOhB,KAAK,SAAWnoB,EAUhB,KAAK,OAAS,IAAIwB,GAAS,GAAK,EAAI,EASpC,KAAK,MAAQ,CAEd,CAQA,QAASvB,EAAWkE,EAAa,CAE3BlE,EAAU,SAAW,MAEzBnI,GAAO,iFAAkF,EAI1FuwB,GAAY,mBAAoB,KAAK,WAAY,EAEjDvlB,GAAiB,KAAM7C,EAAU,OAAO,WAAY,EACpD,KAAK,gBAAgB,iBAAkBA,EAAU,OAAO,mBAAoB,KAAK,WAAY,EAE7FqoB,GAAY,sBAAuB,KAAK,eAAgB,EAEnDroB,EAAU,OAAO,qBAAuB,KAAK,SAAS,kBAAoB,IAE9EooB,GAAY,eAAgB,CAAEC,GAAY,CAAE,EAI7C,IAAMyZ,EAAW,KAAK,SAAS,SAC3BhmC,EAAKD,EAEJimC,IAAa,IAEjBjmC,EAAM,KAAK,IAAKimC,CAAS,EACzBhmC,EAAM,KAAK,IAAKgmC,CAAS,GAI1B,IAAMr/B,EAAS,KAAK,OAEpBH,GAAiBgmB,GAAI,IAAK,IAAM,IAAM,CAAE,EAAGD,GAAa5lB,EAAQ2lB,GAAatsB,EAAKD,CAAI,EACtFyG,GAAiBimB,GAAI,IAAK,GAAK,IAAM,CAAE,EAAGF,GAAa5lB,EAAQ2lB,GAAatsB,EAAKD,CAAI,EACrFyG,GAAiBkmB,GAAI,IAAK,GAAK,GAAK,CAAE,EAAGH,GAAa5lB,EAAQ2lB,GAAatsB,EAAKD,CAAI,EAEpF4sB,GAAK,IAAK,EAAG,CAAE,EACfC,GAAK,IAAK,EAAG,CAAE,EACfC,GAAK,IAAK,EAAG,CAAE,EAGf,IAAIroB,EAAYN,EAAU,IAAI,kBAAmBsoB,GAAKC,GAAKC,GAAK,GAAOL,EAAgB,EAEvF,GAAK7nB,IAAc,OAGlBgC,GAAiBimB,GAAI,IAAK,IAAM,GAAK,CAAE,EAAGF,GAAa5lB,EAAQ2lB,GAAatsB,EAAKD,CAAI,EACrF6sB,GAAK,IAAK,EAAG,CAAE,EAEfpoB,EAAYN,EAAU,IAAI,kBAAmBsoB,GAAKE,GAAKD,GAAK,GAAOJ,EAAgB,EAC9E7nB,IAAc,MAElB,OAMF,IAAMI,EAAWV,EAAU,IAAI,OAAO,WAAYmoB,EAAgB,EAE7DznB,EAAWV,EAAU,MAAQU,EAAWV,EAAU,KAEvDkE,EAAW,KAAM,CAEhB,SAAUxD,EACV,MAAOynB,GAAgB,MAAM,EAC7B,GAAI7mB,GAAS,iBAAkB6mB,GAAiBG,GAAKC,GAAKC,GAAKC,GAAMC,GAAMC,GAAM,IAAIpnB,EAAU,EAC/F,KAAM,KACN,OAAQ,IAET,CAAE,CAEH,CAEA,KAAMuhC,EAAQ/xB,EAAY,CAEzB,aAAM,KAAM+xB,EAAQ/xB,CAAU,EAEzB+xB,EAAO,SAAW,QAAY,KAAK,OAAO,KAAMA,EAAO,MAAO,EAEnE,KAAK,SAAWA,EAAO,SAEhB,IAER,CAED,EA6BMja,GAAsB,IAAIxnB,EAC1BynB,GAAsB,IAAIznB,EA4B1B0nB,GAAN,cAAkBxF,EAAS,CAK1B,aAAc,CAEb,MAAM,EASN,KAAK,MAAQ,GASb,KAAK,cAAgB,EAErB,KAAK,KAAO,MAEZ,OAAO,iBAAkB,KAAM,CAO9B,OAAQ,CACP,WAAY,GACZ,MAAO,CAAC,CACT,CACD,CAAE,EAUF,KAAK,WAAa,EAEnB,CAEA,KAAMuf,EAAS,CAEd,MAAM,KAAMA,EAAQ,EAAM,EAE1B,IAAM2T,EAAS3T,EAAO,OAEtB,QAAUnsC,EAAI,EAAG4V,EAAIkqC,EAAO,OAAQ9/C,EAAI4V,EAAG5V,IAAO,CAEjD,IAAM+/C,EAAQD,EAAQ9/C,CAAE,EAExB,KAAK,SAAU+/C,EAAM,OAAO,MAAM,EAAGA,EAAM,SAAUA,EAAM,UAAW,CAEvE,CAEA,YAAK,WAAa5T,EAAO,WAElB,IAER,CAWA,SAAUhjC,EAAQY,EAAW,EAAGi2C,EAAa,EAAI,CAEhDj2C,EAAW,KAAK,IAAKA,CAAS,EAE9B,IAAM+1C,EAAS,KAAK,OAEhBlqC,EAEJ,IAAMA,EAAI,EAAGA,EAAIkqC,EAAO,QAElB,EAAA/1C,EAAW+1C,EAAQlqC,CAAE,EAAE,UAFGA,IAE/B,CAQD,OAAAkqC,EAAO,OAAQlqC,EAAG,EAAG,CAAE,SAAU7L,EAAU,WAAYi2C,EAAY,OAAQ72C,CAAO,CAAE,EAEpF,KAAK,IAAKA,CAAO,EAEV,IAER,CASA,YAAaY,EAAW,CAEvB,IAAM+1C,EAAS,KAAK,OAEpB,QAAU9/C,EAAI,EAAGA,EAAI8/C,EAAO,OAAQ9/C,IAEnC,GAAK8/C,EAAQ9/C,CAAE,EAAE,WAAa+J,EAAW,CAExC,IAAMk2C,EAAkBH,EAAO,OAAQ9/C,EAAG,CAAE,EAC5C,YAAK,OAAQigD,EAAiB,CAAE,EAAE,MAAO,EAElC,EAER,CAID,MAAO,EAER,CAOA,iBAAkB,CAEjB,OAAO,KAAK,aAEb,CASA,qBAAsBl2C,EAAW,CAEhC,IAAM+1C,EAAS,KAAK,OAEpB,GAAKA,EAAO,OAAS,EAAI,CAExB,IAAI9/C,EAAG4V,EAEP,IAAM5V,EAAI,EAAG4V,EAAIkqC,EAAO,OAAQ9/C,EAAI4V,EAAG5V,IAAO,CAE7C,IAAIkgD,EAAgBJ,EAAQ9/C,CAAE,EAAE,SAQhC,GANK8/C,EAAQ9/C,CAAE,EAAE,OAAO,UAEvBkgD,GAAiBA,EAAgBJ,EAAQ9/C,CAAE,EAAE,YAIzC+J,EAAWm2C,EAEf,KAIF,CAEA,OAAOJ,EAAQ9/C,EAAI,CAAE,EAAE,MAExB,CAEA,OAAO,IAER,CAQA,QAASqJ,EAAWkE,EAAa,CAIhC,GAFe,KAAK,OAER,OAAS,EAAI,CAExB2kB,GAAM,sBAAuB,KAAK,WAAY,EAE9C,IAAMnoB,EAAWV,EAAU,IAAI,OAAO,WAAY6oB,EAAM,EAExD,KAAK,qBAAsBnoB,CAAS,EAAE,QAASV,EAAWkE,CAAW,CAEtE,CAED,CAQA,OAAQsN,EAAS,CAEhB,IAAMilC,EAAS,KAAK,OAEpB,GAAKA,EAAO,OAAS,EAAI,CAExB5tB,GAAM,sBAAuBrX,EAAO,WAAY,EAChDsX,GAAM,sBAAuB,KAAK,WAAY,EAE9C,IAAMpoB,EAAWmoB,GAAM,WAAYC,EAAM,EAAItX,EAAO,KAEpDilC,EAAQ,CAAE,EAAE,OAAO,QAAU,GAE7B,IAAI9/C,EAAG4V,EAEP,IAAM5V,EAAI,EAAG4V,EAAIkqC,EAAO,OAAQ9/C,EAAI4V,EAAG5V,IAAO,CAE7C,IAAIkgD,EAAgBJ,EAAQ9/C,CAAE,EAAE,SAQhC,GANK8/C,EAAQ9/C,CAAE,EAAE,OAAO,UAEvBkgD,GAAiBA,EAAgBJ,EAAQ9/C,CAAE,EAAE,YAIzC+J,GAAYm2C,EAEhBJ,EAAQ9/C,EAAI,CAAE,EAAE,OAAO,QAAU,GACjC8/C,EAAQ9/C,CAAE,EAAE,OAAO,QAAU,OAI7B,MAIF,CAIA,IAFA,KAAK,cAAgBA,EAAI,EAEjBA,EAAI4V,EAAG5V,IAEd8/C,EAAQ9/C,CAAE,EAAE,OAAO,QAAU,EAI/B,CAED,CAEA,OAAQurC,EAAO,CAEd,IAAM97B,EAAO,MAAM,OAAQ87B,CAAK,EAE3B,KAAK,aAAe,KAAQ97B,EAAK,OAAO,WAAa,IAE1DA,EAAK,OAAO,OAAS,CAAC,EAEtB,IAAMqwC,EAAS,KAAK,OAEpB,QAAU9/C,EAAI,EAAG4V,EAAIkqC,EAAO,OAAQ9/C,EAAI4V,EAAG5V,IAAO,CAEjD,IAAM+/C,EAAQD,EAAQ9/C,CAAE,EAExByP,EAAK,OAAO,OAAO,KAAM,CACxB,OAAQswC,EAAM,OAAO,KACrB,SAAUA,EAAM,SAChB,WAAYA,EAAM,UACnB,CAAE,CAEH,CAEA,OAAOtwC,CAER,CAED,EAEM4iB,GAA8B,IAAI3nB,EAElC4nB,GAA2B,IAAIrJ,GAC/BsJ,GAA4B,IAAItJ,GAEhCuJ,IAAyB,IAAI9nB,EAC7B+nB,GAAyB,IAAIxH,GAC7ByH,GAAwB,IAAIhoB,EAE5BioB,GAA0B,IAAInI,GAC9BoI,GAAiC,IAAI3H,GACrC4H,GAAuB,IAAI7H,GAgB3B8H,GAAN,cAA0BhD,EAAK,CAQ9B,YAAalV,EAAUxR,EAAW,CAEjC,MAAOwR,EAAUxR,CAAS,EAS1B,KAAK,cAAgB,GAErB,KAAK,KAAO,cAUZ,KAAK,SAAW0Z,GAOhB,KAAK,WAAa,IAAImI,GAOtB,KAAK,kBAAoB,IAAIA,GAQ7B,KAAK,YAAc,KAQnB,KAAK,eAAiB,IAEvB,CAQA,oBAAqB,CAEpB,IAAMrQ,EAAW,KAAK,SAEjB,KAAK,cAAgB,OAEzB,KAAK,YAAc,IAAI4O,IAIxB,KAAK,YAAY,UAAU,EAE3B,IAAM1c,EAAoB8N,EAAS,aAAc,UAAW,EAE5D,QAAU5a,EAAI,EAAGA,EAAI8M,EAAkB,MAAO9M,IAE7C,KAAK,kBAAmBA,EAAG0yB,EAAQ,EACnC,KAAK,YAAY,cAAeA,EAAQ,CAI1C,CAQA,uBAAwB,CAEvB,IAAM9X,EAAW,KAAK,SAEjB,KAAK,iBAAmB,OAE5B,KAAK,eAAiB,IAAI4P,IAI3B,KAAK,eAAe,UAAU,EAE9B,IAAM1d,EAAoB8N,EAAS,aAAc,UAAW,EAE5D,QAAU5a,EAAI,EAAGA,EAAI8M,EAAkB,MAAO9M,IAE7C,KAAK,kBAAmBA,EAAG0yB,EAAQ,EACnC,KAAK,eAAe,cAAeA,EAAQ,CAI7C,CAEA,KAAMyZ,EAAQ/xB,EAAY,CAEzB,aAAM,KAAM+xB,EAAQ/xB,CAAU,EAE9B,KAAK,SAAW+xB,EAAO,SACvB,KAAK,WAAW,KAAMA,EAAO,UAAW,EACxC,KAAK,kBAAkB,KAAMA,EAAO,iBAAkB,EAEtD,KAAK,SAAWA,EAAO,SAElBA,EAAO,cAAgB,OAAO,KAAK,YAAcA,EAAO,YAAY,MAAM,GAC1EA,EAAO,iBAAmB,OAAO,KAAK,eAAiBA,EAAO,eAAe,MAAM,GAEjF,IAER,CAEA,QAAS9iC,EAAWkE,EAAa,CAEhC,IAAMnE,EAAW,KAAK,SAChBkE,EAAc,KAAK,YAEpBlE,IAAa,SAIb,KAAK,iBAAmB,MAAO,KAAK,sBAAsB,EAE/DupB,GAAU,KAAM,KAAK,cAAe,EACpCA,GAAU,aAAcrlB,CAAY,EAE/BjE,EAAU,IAAI,iBAAkBspB,EAAU,IAAM,KAIrDC,GAAiB,KAAMtlB,CAAY,EAAE,OAAO,EAC5CulB,GAAO,KAAMxpB,EAAU,GAAI,EAAE,aAAcupB,EAAiB,EAIvD,OAAK,cAAgB,MAEpBC,GAAO,cAAe,KAAK,WAAY,IAAM,KAMnD,KAAK,sBAAuBxpB,EAAWkE,EAAYslB,EAAO,GAE3D,CAEA,kBAAmBzlB,EAAO1G,EAAS,CAElC,aAAM,kBAAmB0G,EAAO1G,CAAO,EAEvC,KAAK,mBAAoB0G,EAAO1G,CAAO,EAEhCA,CAER,CASA,KAAMy5C,EAAUC,EAAa,CAE5B,KAAK,SAAWD,EAEXC,IAAe,SAEnB,KAAK,kBAAmB,EAAK,EAE7B,KAAK,SAAS,kBAAkB,EAEhCA,EAAa,KAAK,aAInB,KAAK,WAAW,KAAMA,CAAW,EACjC,KAAK,kBAAkB,KAAMA,CAAW,EAAE,OAAO,CAElD,CAKA,MAAO,CAEN,KAAK,SAAS,KAAK,CAEpB,CAMA,sBAAuB,CAEtB,IAAM/S,EAAS,IAAIpkB,GAEbo3B,EAAa,KAAK,SAAS,WAAW,WAE5C,QAAUrgD,EAAI,EAAG4V,EAAIyqC,EAAW,MAAOrgD,EAAI4V,EAAG5V,IAAO,CAEpDqtC,EAAO,oBAAqBgT,EAAYrgD,CAAE,EAE1C,IAAM+L,EAAQ,EAAMshC,EAAO,gBAAgB,EAEtCthC,IAAU,IAEdshC,EAAO,eAAgBthC,CAAM,EAI7BshC,EAAO,IAAK,EAAG,EAAG,EAAG,CAAE,EAIxBgT,EAAW,QAASrgD,EAAGqtC,EAAO,EAAGA,EAAO,EAAGA,EAAO,EAAGA,EAAO,CAAE,CAE/D,CAED,CAEA,kBAAmBgH,EAAQ,CAE1B,MAAM,kBAAmBA,CAAM,EAE1B,KAAK,WAAavxB,GAEtB,KAAK,kBAAkB,KAAM,KAAK,WAAY,EAAE,OAAO,EAE5C,KAAK,WAAaC,GAE7B,KAAK,kBAAkB,KAAM,KAAK,UAAW,EAAE,OAAO,EAItD9hB,GAAM,uCAAyC,KAAK,QAAS,CAI/D,CAWA,mBAAoBmM,EAAO1G,EAAS,CAEnC,IAAMy5C,EAAW,KAAK,SAChBvlC,EAAW,KAAK,SAEtB0X,GAAW,oBAAqB1X,EAAS,WAAW,UAAWxN,CAAM,EACrEmlB,GAAY,oBAAqB3X,EAAS,WAAW,WAAYxN,CAAM,EAEvEilB,GAAc,KAAM3rB,CAAO,EAAE,aAAc,KAAK,UAAW,EAE3DA,EAAO,IAAK,EAAG,EAAG,CAAE,EAEpB,QAAU1G,EAAI,EAAGA,EAAI,EAAGA,IAAO,CAE9B,IAAMsgD,EAAS/tB,GAAY,aAAcvyB,CAAE,EAE3C,GAAKsgD,IAAW,EAAI,CAEnB,IAAMC,EAAYjuB,GAAW,aAActyB,CAAE,EAE7CyyB,GAAS,iBAAkB0tB,EAAS,MAAOI,CAAU,EAAE,YAAaJ,EAAS,aAAcI,CAAU,CAAE,EAEvG75C,EAAO,gBAAiB8rB,IAAS,KAAMH,EAAc,EAAE,aAAcI,EAAS,EAAG6tB,CAAO,CAEzF,CAED,CAEA,OAAO55C,EAAO,aAAc,KAAK,iBAAkB,CAEpD,CAED,EAgBMqsB,GAAN,cAAmBnG,EAAS,CAK3B,aAAc,CAEb,MAAM,EASN,KAAK,OAAS,GAEd,KAAK,KAAO,MAEb,CAED,EAYMoG,GAAN,cAA0BhK,EAAQ,CAkBjC,YAAavZ,EAAO,KAAM+L,EAAQ,EAAGC,EAAS,EAAGC,EAAQxb,EAAM0rC,EAASC,EAAOC,EAAOC,EAAYtoB,GAAeuoB,EAAYvoB,GAAewoB,EAAY1lC,EAAa,CAEpK,MAAO,KAAMqlC,EAASC,EAAOC,EAAOC,EAAWC,EAAWtwB,EAAQxb,EAAM+rC,EAAY1lC,CAAW,EAS/F,KAAK,cAAgB,GAOrB,KAAK,MAAQ,CAAE,KAAMkJ,EAAM,MAAO+L,EAAO,OAAQC,CAAO,EAUxD,KAAK,gBAAkB,GAWvB,KAAK,MAAQ,GAUb,KAAK,gBAAkB,CAExB,CAED,EAEMwX,GAA8B,IAAIhI,GAClCiI,IAAgC,IAAIjI,GAyBpCkI,GAAN,MAAMqtB,CAAS,CASd,YAAaC,EAAQ,CAAC,EAAGC,EAAe,CAAC,EAAI,CAE5C,KAAK,KAAO9+C,GAAa,EAOzB,KAAK,MAAQ6+C,EAAM,MAAO,CAAE,EAO5B,KAAK,aAAeC,EASpB,KAAK,aAAe,KASpB,KAAK,qBAAuB,KAS5B,KAAK,YAAc,KAEnB,KAAK,KAAK,CAEX,CAOA,MAAO,CAEN,IAAMD,EAAQ,KAAK,MACbC,EAAe,KAAK,aAM1B,GAJA,KAAK,aAAe,IAAI,aAAcD,EAAM,OAAS,EAAG,EAInDC,EAAa,SAAW,EAE5B,KAAK,kBAAkB,UAMlBD,EAAM,SAAWC,EAAa,OAAS,CAE3Cz/C,GAAM,2EAA4E,EAElF,KAAK,aAAe,CAAC,EAErB,QAAUjB,EAAI,EAAG+sC,EAAK,KAAK,MAAM,OAAQ/sC,EAAI+sC,EAAI/sC,IAEhD,KAAK,aAAa,KAAM,IAAIirB,EAAU,CAIxC,CAIF,CAMA,mBAAoB,CAEnB,KAAK,aAAa,OAAS,EAE3B,QAAUjrB,EAAI,EAAG+sC,EAAK,KAAK,MAAM,OAAQ/sC,EAAI+sC,EAAI/sC,IAAO,CAEvD,IAAM2gD,EAAU,IAAI11B,GAEf,KAAK,MAAOjrB,CAAE,GAElB2gD,EAAQ,KAAM,KAAK,MAAO3gD,CAAE,EAAE,WAAY,EAAE,OAAO,EAIpD,KAAK,aAAa,KAAM2gD,CAAQ,CAEjC,CAED,CAKA,MAAO,CAIN,QAAU3gD,EAAI,EAAG+sC,EAAK,KAAK,MAAM,OAAQ/sC,EAAI+sC,EAAI/sC,IAAO,CAEvD,IAAM4gD,EAAO,KAAK,MAAO5gD,CAAE,EAEtB4gD,GAEJA,EAAK,YAAY,KAAM,KAAK,aAAc5gD,CAAE,CAAE,EAAE,OAAO,CAIzD,CAIA,QAAUA,EAAI,EAAG+sC,EAAK,KAAK,MAAM,OAAQ/sC,EAAI+sC,EAAI/sC,IAAO,CAEvD,IAAM4gD,EAAO,KAAK,MAAO5gD,CAAE,EAEtB4gD,IAECA,EAAK,QAAUA,EAAK,OAAO,QAE/BA,EAAK,OAAO,KAAMA,EAAK,OAAO,WAAY,EAAE,OAAO,EACnDA,EAAK,OAAO,SAAUA,EAAK,WAAY,GAIvCA,EAAK,OAAO,KAAMA,EAAK,WAAY,EAIpCA,EAAK,OAAO,UAAWA,EAAK,SAAUA,EAAK,WAAYA,EAAK,KAAM,EAIpE,CAED,CAKA,QAAS,CAER,IAAMH,EAAQ,KAAK,MACbC,EAAe,KAAK,aACpBG,EAAe,KAAK,aACpBC,EAAc,KAAK,YAIzB,QAAU9gD,EAAI,EAAG+sC,EAAK0T,EAAM,OAAQzgD,EAAI+sC,EAAI/sC,IAAO,CAIlD,IAAMorC,EAASqV,EAAOzgD,CAAE,EAAIygD,EAAOzgD,CAAE,EAAE,YAAckzB,IAErDD,GAAc,iBAAkBmY,EAAQsV,EAAc1gD,CAAE,CAAE,EAC1DizB,GAAc,QAAS4tB,EAAc7gD,EAAI,EAAG,CAE7C,CAEK8gD,IAAgB,OAEpBA,EAAY,YAAc,GAI5B,CAOA,OAAQ,CAEP,OAAO,IAAIN,EAAU,KAAK,MAAO,KAAK,YAAa,CAEpD,CAOA,oBAAqB,CASpB,IAAIvT,EAAO,KAAK,KAAM,KAAK,MAAM,OAAS,CAAE,EAC5CA,EAAO,KAAK,KAAMA,EAAO,CAAE,EAAI,EAC/BA,EAAO,KAAK,IAAKA,EAAM,CAAE,EAEzB,IAAM4T,EAAe,IAAI,aAAc5T,EAAOA,EAAO,CAAE,EACvD4T,EAAa,IAAK,KAAK,YAAa,EAEpC,IAAMC,EAAc,IAAI9tB,GAAa6tB,EAAc5T,EAAMA,EAAM9wB,GAAY+C,EAAU,EACrF,OAAA4hC,EAAY,YAAc,GAE1B,KAAK,aAAeD,EACpB,KAAK,YAAcC,EAEZ,IAER,CASA,cAAevgD,EAAO,CAErB,QAAUP,EAAI,EAAG+sC,EAAK,KAAK,MAAM,OAAQ/sC,EAAI+sC,EAAI/sC,IAAO,CAEvD,IAAM4gD,EAAO,KAAK,MAAO5gD,CAAE,EAE3B,GAAK4gD,EAAK,OAASrgD,EAElB,OAAOqgD,CAIT,CAID,CAMA,SAAW,CAEL,KAAK,cAAgB,OAEzB,KAAK,YAAY,QAAQ,EAEzB,KAAK,YAAc,KAIrB,CASA,SAAU3mC,EAAMwmC,EAAQ,CAEvB,KAAK,KAAOxmC,EAAK,KAEjB,QAAUja,EAAI,EAAG4V,EAAIqE,EAAK,MAAM,OAAQja,EAAI4V,EAAG5V,IAAO,CAErD,IAAM+gD,EAAO9mC,EAAK,MAAOja,CAAE,EACvB4gD,EAAOH,EAAOM,CAAK,EAElBH,IAAS,SAEb3/C,GAAM,qCAAsC8/C,CAAK,EACjDH,EAAO,IAAI7tB,IAIZ,KAAK,MAAM,KAAM6tB,CAAK,EACtB,KAAK,aAAa,KAAM,IAAI31B,GAAQ,EAAE,UAAWhR,EAAK,aAAcja,CAAE,CAAE,CAAE,CAE3E,CAEA,YAAK,KAAK,EAEH,IAER,CAQA,QAAS,CAER,IAAMyP,EAAO,CACZ,SAAU,CACT,QAAS,IACT,KAAM,WACN,UAAW,iBACZ,EACA,MAAO,CAAC,EACR,aAAc,CAAC,CAChB,EAEAA,EAAK,KAAO,KAAK,KAEjB,IAAMgxC,EAAQ,KAAK,MACbC,EAAe,KAAK,aAE1B,QAAU1gD,EAAI,EAAG4V,EAAI6qC,EAAM,OAAQzgD,EAAI4V,EAAG5V,IAAO,CAEhD,IAAM4gD,EAAOH,EAAOzgD,CAAE,EACtByP,EAAK,MAAM,KAAMmxC,EAAK,IAAK,EAE3B,IAAMI,EAAcN,EAAc1gD,CAAE,EACpCyP,EAAK,aAAa,KAAMuxC,EAAY,QAAQ,CAAE,CAE/C,CAEA,OAAOvxC,CAER,CAED,EAOM2jB,GAAN,cAAuC9E,EAAgB,CAUtD,YAAavuB,EAAOyM,EAAUkrC,EAAYuJ,EAAmB,EAAI,CAEhE,MAAOlhD,EAAOyM,EAAUkrC,CAAW,EASnC,KAAK,2BAA6B,GAWlC,KAAK,iBAAmBuJ,CAEzB,CAEA,KAAM9U,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,iBAAmBA,EAAO,iBAExB,IAER,CAEA,QAAS,CAER,IAAM18B,EAAO,MAAM,OAAO,EAE1B,OAAAA,EAAK,iBAAmB,KAAK,iBAE7BA,EAAK,2BAA6B,GAE3BA,CAER,CAED,EAEM4jB,GAAqC,IAAIpI,GACzCqI,GAAqC,IAAIrI,GAEzCsI,GAAsB,CAAC,EAEvBC,GAAsB,IAAIhK,GAC1BiK,IAA0B,IAAIxI,GAC9ByI,GAAwB,IAAI5D,GAC5B6D,GAA0B,IAAInJ,GAW9BoJ,GAAN,cAA4B9D,EAAK,CAShC,YAAalV,EAAUxR,EAAU8iC,EAAQ,CAExC,MAAOtxB,EAAUxR,CAAS,EAS1B,KAAK,gBAAkB,GASvB,KAAK,eAAiB,IAAIgqB,GAA0B,IAAI,aAAc8Y,EAAQ,EAAG,EAAG,EAAG,EAUvF,KAAK,cAAgB,KAUrB,KAAK,aAAe,KAOpB,KAAK,MAAQA,EAQb,KAAK,YAAc,KAQnB,KAAK,eAAiB,KAEtB,QAAUlsC,EAAI,EAAGA,EAAIksC,EAAOlsC,IAE3B,KAAK,YAAaA,EAAGyzB,GAAU,CAIjC,CAOA,oBAAqB,CAEpB,IAAM7Y,EAAW,KAAK,SAChBsxB,EAAQ,KAAK,MAEd,KAAK,cAAgB,OAEzB,KAAK,YAAc,IAAI1iB,IAInB5O,EAAS,cAAgB,MAE7BA,EAAS,mBAAmB,EAI7B,KAAK,YAAY,UAAU,EAE3B,QAAU5a,EAAI,EAAGA,EAAIksC,EAAOlsC,IAE3B,KAAK,YAAaA,EAAGqzB,EAAqB,EAE1CG,GAAM,KAAM5Y,EAAS,WAAY,EAAE,aAAcyY,EAAqB,EAEtE,KAAK,YAAY,MAAOG,EAAM,CAIhC,CAOA,uBAAwB,CAEvB,IAAM5Y,EAAW,KAAK,SAChBsxB,EAAQ,KAAK,MAEd,KAAK,iBAAmB,OAE5B,KAAK,eAAiB,IAAI1hB,IAItB5P,EAAS,iBAAmB,MAEhCA,EAAS,sBAAsB,EAIhC,KAAK,eAAe,UAAU,EAE9B,QAAU5a,EAAI,EAAGA,EAAIksC,EAAOlsC,IAE3B,KAAK,YAAaA,EAAGqzB,EAAqB,EAE1CM,GAAU,KAAM/Y,EAAS,cAAe,EAAE,aAAcyY,EAAqB,EAE7E,KAAK,eAAe,MAAOM,EAAU,CAIvC,CAEA,KAAMwY,EAAQ/xB,EAAY,CAEzB,aAAM,KAAM+xB,EAAQ/xB,CAAU,EAE9B,KAAK,eAAe,KAAM+xB,EAAO,cAAe,EAE3CA,EAAO,eAAiB,OAAO,KAAK,aAAeA,EAAO,aAAa,MAAM,GAC7EA,EAAO,gBAAkB,OAAO,KAAK,cAAgBA,EAAO,cAAc,MAAM,GAErF,KAAK,MAAQA,EAAO,MAEfA,EAAO,cAAgB,OAAO,KAAK,YAAcA,EAAO,YAAY,MAAM,GAC1EA,EAAO,iBAAmB,OAAO,KAAK,eAAiBA,EAAO,eAAe,MAAM,GAEjF,IAER,CAQA,WAAY/+B,EAAOnH,EAAQ,CAE1BA,EAAM,UAAW,KAAK,cAAc,MAAOmH,EAAQ,CAAE,CAEtD,CAQA,YAAaA,EAAOg+B,EAAS,CAE5BA,EAAO,UAAW,KAAK,eAAe,MAAOh+B,EAAQ,EAAG,CAEzD,CAQA,WAAYA,EAAOjE,EAAS,CAE3B,IAAM+3C,EAAmB/3C,EAAO,sBAE1BpJ,EAAQ,KAAK,aAAa,OAAO,KAAK,KAEtC4M,EAAMu0C,EAAiB,OAAS,EAEhCC,EAAY/zC,EAAQT,EAAM,EAEhC,QAAU3M,EAAI,EAAGA,EAAIkhD,EAAiB,OAAQlhD,IAE7CkhD,EAAkBlhD,CAAE,EAAID,EAAOohD,EAAYnhD,CAAE,CAI/C,CAEA,QAASqJ,EAAWkE,EAAa,CAEhC,IAAMD,EAAc,KAAK,YACnB8zC,EAAe,KAAK,MAK1B,GAHA1tB,GAAQ,SAAW,KAAK,SACxBA,GAAQ,SAAW,KAAK,SAEnBA,GAAQ,WAAa,SAIrB,KAAK,iBAAmB,MAAO,KAAK,sBAAsB,EAE/DC,GAAU,KAAM,KAAK,cAAe,EACpCA,GAAU,aAAcrmB,CAAY,EAE/BjE,EAAU,IAAI,iBAAkBsqB,EAAU,IAAM,IAIrD,QAAU0tB,EAAa,EAAGA,EAAaD,EAAcC,IAAgB,CAIpE,KAAK,YAAaA,EAAYhuB,EAAqB,EAEnDC,GAAqB,iBAAkBhmB,EAAa+lB,EAAqB,EAIzEK,GAAQ,YAAcJ,GAEtBI,GAAQ,QAASrqB,EAAWkqB,EAAoB,EAIhD,QAAUvzB,EAAI,EAAG4V,EAAI2d,GAAoB,OAAQvzB,EAAI4V,EAAG5V,IAAO,CAE9D,IAAM2J,EAAY4pB,GAAqBvzB,CAAE,EACzC2J,EAAU,WAAa03C,EACvB13C,EAAU,OAAS,KACnB4D,EAAW,KAAM5D,CAAU,CAE5B,CAEA4pB,GAAoB,OAAS,CAE9B,CAED,CASA,WAAYnmB,EAAOnH,EAAQ,CAErB,KAAK,gBAAkB,OAE3B,KAAK,cAAgB,IAAImtB,GAA0B,IAAI,aAAc,KAAK,eAAe,MAAQ,CAAE,EAAE,KAAM,CAAE,EAAG,CAAE,GAInHntB,EAAM,QAAS,KAAK,cAAc,MAAOmH,EAAQ,CAAE,CAEpD,CASA,YAAaA,EAAOg+B,EAAS,CAE5BA,EAAO,QAAS,KAAK,eAAe,MAAOh+B,EAAQ,EAAG,CAEvD,CAUA,WAAYA,EAAOjE,EAAS,CAE3B,IAAM+3C,EAAmB/3C,EAAO,sBAE1BwD,EAAMu0C,EAAiB,OAAS,EAEjC,KAAK,eAAiB,OAE1B,KAAK,aAAe,IAAIluB,GAAa,IAAI,aAAcrmB,EAAM,KAAK,KAAM,EAAGA,EAAK,KAAK,MAAOmP,GAAWoD,EAAU,GAIlH,IAAMnf,EAAQ,KAAK,aAAa,OAAO,KAAK,KAExCuhD,EAAqB,EAEzB,QAAUthD,EAAI,EAAGA,EAAIkhD,EAAiB,OAAQlhD,IAE7CshD,GAAsBJ,EAAkBlhD,CAAE,EAI3C,IAAMuhD,EAAqB,KAAK,SAAS,qBAAuB,EAAI,EAAID,EAElEH,EAAYx0C,EAAMS,EAExBrN,EAAOohD,CAAU,EAAII,EAErBxhD,EAAM,IAAKmhD,EAAkBC,EAAY,CAAE,CAE5C,CAEA,oBAAqB,CAErB,CAMA,SAAU,CAET,KAAK,cAAe,CAAE,KAAM,SAAU,CAAE,EAEnC,KAAK,eAAiB,OAE1B,KAAK,aAAa,QAAQ,EAC1B,KAAK,aAAe,KAItB,CAED,EAEMttB,GAAyB,IAAInpB,EAC7BopB,IAAyB,IAAIppB,EAC7BqpB,IAA8B,IAAItL,GAOlCuL,GAAN,KAAY,CAQX,YAAa7pB,EAAS,IAAIO,EAAS,EAAG,EAAG,CAAE,EAAG82C,EAAW,EAAI,CAS5D,KAAK,QAAU,GAOf,KAAK,OAASr3C,EAQd,KAAK,SAAWq3C,CAEjB,CASA,IAAKr3C,EAAQq3C,EAAW,CAEvB,YAAK,OAAO,KAAMr3C,CAAO,EACzB,KAAK,SAAWq3C,EAET,IAER,CAYA,cAAe9+C,EAAGM,EAAG8X,EAAGwpB,EAAI,CAE3B,YAAK,OAAO,IAAK5hC,EAAGM,EAAG8X,CAAE,EACzB,KAAK,SAAWwpB,EAET,IAER,CAUA,8BAA+Bn6B,EAAQT,EAAQ,CAE9C,YAAK,OAAO,KAAMS,CAAO,EACzB,KAAK,SAAW,CAAET,EAAM,IAAK,KAAK,MAAO,EAElC,IAER,CAYA,sBAAuB5E,EAAGC,EAAGC,EAAI,CAEhC,IAAMmF,EAAS0pB,GAAS,WAAY7uB,EAAGD,CAAE,EAAE,MAAO+uB,IAAS,WAAYhvB,EAAGC,CAAE,CAAE,EAAE,UAAU,EAI1F,YAAK,8BAA+BoF,EAAQrF,CAAE,EAEvC,IAER,CAQA,KAAMyoC,EAAQ,CAEb,YAAK,OAAO,KAAMA,EAAM,MAAO,EAC/B,KAAK,SAAWA,EAAM,SAEf,IAER,CAOA,WAAY,CAIX,IAAMkU,EAAsB,EAAM,KAAK,OAAO,OAAO,EACrD,YAAK,OAAO,eAAgBA,CAAoB,EAChD,KAAK,UAAYA,EAEV,IAER,CAOA,QAAS,CAER,YAAK,UAAY,GACjB,KAAK,OAAO,OAAO,EAEZ,IAER,CAQA,gBAAiB/3C,EAAQ,CAExB,OAAO,KAAK,OAAO,IAAKA,CAAM,EAAI,KAAK,QAExC,CAQA,iBAAkB4jC,EAAS,CAE1B,OAAO,KAAK,gBAAiBA,EAAO,MAAO,EAAIA,EAAO,MAEvD,CASA,aAAc5jC,EAAOhD,EAAS,CAE7B,OAAOA,EAAO,KAAMgD,CAAM,EAAE,gBAAiB,KAAK,OAAQ,CAAE,KAAK,gBAAiBA,CAAM,CAAE,CAE3F,CAWA,cAAeg4C,EAAMh7C,EAAS,CAE7B,IAAMsnC,EAAY0T,EAAK,MAAO7tB,EAAS,EAEjCiQ,EAAc,KAAK,OAAO,IAAKkK,CAAU,EAE/C,GAAKlK,IAAgB,EAGpB,OAAK,KAAK,gBAAiB4d,EAAK,KAAM,IAAM,EAEpCh7C,EAAO,KAAMg7C,EAAK,KAAM,EAKzB,KAIR,IAAMx9C,EAAI,EAAIw9C,EAAK,MAAM,IAAK,KAAK,MAAO,EAAI,KAAK,UAAa5d,EAEhE,OAAK5/B,EAAI,GAAKA,EAAI,EAEV,KAIDwC,EAAO,KAAMg7C,EAAK,KAAM,EAAE,gBAAiB1T,EAAW9pC,CAAE,CAEhE,CAQA,eAAgBw9C,EAAO,CAItB,IAAMC,EAAY,KAAK,gBAAiBD,EAAK,KAAM,EAC7CE,EAAU,KAAK,gBAAiBF,EAAK,GAAI,EAE/C,OAASC,EAAY,GAAKC,EAAU,GAASA,EAAU,GAAKD,EAAY,CAEzE,CAQA,cAAevU,EAAM,CAEpB,OAAOA,EAAI,gBAAiB,IAAK,CAElC,CAQA,iBAAkBE,EAAS,CAE1B,OAAOA,EAAO,gBAAiB,IAAK,CAErC,CASA,cAAe5mC,EAAS,CAEvB,OAAOA,EAAO,KAAM,KAAK,MAAO,EAAE,eAAgB,CAAE,KAAK,QAAS,CAEnE,CAcA,aAAc0kC,EAAQyW,EAAuB,CAE5C,IAAM3J,EAAe2J,GAAwB9tB,IAAc,gBAAiBqX,CAAO,EAE7E0W,EAAiB,KAAK,cAAejuB,EAAS,EAAE,aAAcuX,CAAO,EAErEjhC,EAAS,KAAK,OAAO,aAAc+tC,CAAa,EAAE,UAAU,EAElE,YAAK,SAAW,CAAE4J,EAAe,IAAK33C,CAAO,EAEtC,IAER,CASA,UAAWg6B,EAAS,CAEnB,YAAK,UAAYA,EAAO,IAAK,KAAK,MAAO,EAElC,IAER,CAQA,OAAQoJ,EAAQ,CAEf,OAAOA,EAAM,OAAO,OAAQ,KAAK,MAAO,GAAOA,EAAM,WAAa,KAAK,QAExE,CAOA,OAAQ,CAEP,OAAO,IAAI,KAAK,YAAY,EAAE,KAAM,IAAK,CAE1C,CAED,EAEMtZ,GAA0B,IAAIzJ,GAC9B0J,IAAqC,IAAItpB,GAAS,GAAK,EAAI,EAC3DupB,GAA0B,IAAIzpB,EAS9B0pB,GAAN,KAAc,CAYb,YAAarsB,EAAK,IAAIisB,GAAShsB,EAAK,IAAIgsB,GAAS/rB,EAAK,IAAI+rB,GAASnlB,EAAK,IAAImlB,GAAS+tB,EAAK,IAAI/tB,GAASguB,EAAK,IAAIhuB,GAAU,CAOzH,KAAK,OAAS,CAAEjsB,EAAIC,EAAIC,EAAI4G,EAAIkzC,EAAIC,CAAG,CAExC,CAaA,IAAKj6C,EAAIC,EAAIC,EAAI4G,EAAIkzC,EAAIC,EAAK,CAE7B,IAAMC,EAAS,KAAK,OAEpB,OAAAA,EAAQ,CAAE,EAAE,KAAMl6C,CAAG,EACrBk6C,EAAQ,CAAE,EAAE,KAAMj6C,CAAG,EACrBi6C,EAAQ,CAAE,EAAE,KAAMh6C,CAAG,EACrBg6C,EAAQ,CAAE,EAAE,KAAMpzC,CAAG,EACrBozC,EAAQ,CAAE,EAAE,KAAMF,CAAG,EACrBE,EAAQ,CAAE,EAAE,KAAMD,CAAG,EAEd,IAER,CAQA,KAAME,EAAU,CAEf,IAAMD,EAAS,KAAK,OAEpB,QAAUjiD,EAAI,EAAGA,EAAI,EAAGA,IAEvBiiD,EAAQjiD,CAAE,EAAE,KAAMkiD,EAAQ,OAAQliD,CAAE,CAAE,EAIvC,OAAO,IAER,CAUA,wBAAyBwC,EAAGkxC,EAAmB1rB,GAAuB2rB,EAAgB,GAAQ,CAE7F,IAAMsO,EAAS,KAAK,OACd/Y,EAAK1mC,EAAE,SACP2/C,EAAMjZ,EAAI,CAAE,EAAGkZ,EAAMlZ,EAAI,CAAE,EAAGmZ,EAAMnZ,EAAI,CAAE,EAAGoZ,EAAMpZ,EAAI,CAAE,EACzDqZ,EAAMrZ,EAAI,CAAE,EAAGsZ,EAAMtZ,EAAI,CAAE,EAAGuZ,EAAMvZ,EAAI,CAAE,EAAGwZ,EAAMxZ,EAAI,CAAE,EACzDyZ,EAAMzZ,EAAI,CAAE,EAAG0Z,EAAM1Z,EAAI,CAAE,EAAG2Z,EAAO3Z,EAAI,EAAG,EAAG4Z,EAAO5Z,EAAI,EAAG,EAC7D6Z,EAAO7Z,EAAI,EAAG,EAAG8Z,EAAO9Z,EAAI,EAAG,EAAG+Z,EAAO/Z,EAAI,EAAG,EAAGga,EAAOha,EAAI,EAAG,EAOvE,GALA+Y,EAAQ,CAAE,EAAE,cAAeK,EAAMH,EAAKO,EAAMH,EAAKO,EAAOH,EAAKO,EAAOH,CAAK,EAAE,UAAU,EACrFd,EAAQ,CAAE,EAAE,cAAeK,EAAMH,EAAKO,EAAMH,EAAKO,EAAOH,EAAKO,EAAOH,CAAK,EAAE,UAAU,EACrFd,EAAQ,CAAE,EAAE,cAAeK,EAAMF,EAAKM,EAAMF,EAAKM,EAAOF,EAAKM,EAAOF,CAAK,EAAE,UAAU,EACrFf,EAAQ,CAAE,EAAE,cAAeK,EAAMF,EAAKM,EAAMF,EAAKM,EAAOF,EAAKM,EAAOF,CAAK,EAAE,UAAU,EAEhFrP,EAEJsO,EAAQ,CAAE,EAAE,cAAeI,EAAKI,EAAKI,EAAMI,CAAK,EAAE,UAAU,EAC5DhB,EAAQ,CAAE,EAAE,cAAeK,EAAMD,EAAKK,EAAMD,EAAKK,EAAOD,EAAMK,EAAOD,CAAK,EAAE,UAAU,UAItFhB,EAAQ,CAAE,EAAE,cAAeK,EAAMD,EAAKK,EAAMD,EAAKK,EAAOD,EAAMK,EAAOD,CAAK,EAAE,UAAU,EAEjFvP,IAAqB1rB,GAEzBi6B,EAAQ,CAAE,EAAE,cAAeK,EAAMD,EAAKK,EAAMD,EAAKK,EAAOD,EAAMK,EAAOD,CAAK,EAAE,UAAU,UAE3EvP,IAAqBzrB,GAEhCg6B,EAAQ,CAAE,EAAE,cAAeI,EAAKI,EAAKI,EAAMI,CAAK,EAAE,UAAU,MAI5D,OAAM,IAAI,MAAO,uEAAyEvP,CAAiB,EAM7G,OAAO,IAER,CAUA,iBAAkBvqC,EAAS,CAE1B,GAAKA,EAAO,iBAAmB,OAEzBA,EAAO,iBAAmB,MAAOA,EAAO,sBAAsB,EAEnE8qB,GAAU,KAAM9qB,EAAO,cAAe,EAAE,aAAcA,EAAO,WAAY,MAEnE,CAEN,IAAMyR,EAAWzR,EAAO,SAEnByR,EAAS,iBAAmB,MAAOA,EAAS,sBAAsB,EAEvEqZ,GAAU,KAAMrZ,EAAS,cAAe,EAAE,aAAczR,EAAO,WAAY,CAE5E,CAEA,OAAO,KAAK,iBAAkB8qB,EAAU,CAEzC,CAQA,iBAAkBkvB,EAAS,CAE1BlvB,GAAU,OAAO,IAAK,EAAG,EAAG,CAAE,EAE9B,IAAMkQ,EAASjQ,IAAqB,WAAYivB,EAAO,MAAO,EAE9D,OAAAlvB,GAAU,OAAS,kBAAqBkQ,EACxClQ,GAAU,aAAckvB,EAAO,WAAY,EAEpC,KAAK,iBAAkBlvB,EAAU,CAEzC,CAQA,iBAAkBqZ,EAAS,CAE1B,IAAM2U,EAAS,KAAK,OACdn2C,EAASwhC,EAAO,OAChB8V,EAAY,CAAE9V,EAAO,OAE3B,QAAUttC,EAAI,EAAGA,EAAI,EAAGA,IAIvB,GAFiBiiD,EAAQjiD,CAAE,EAAE,gBAAiB8L,CAAO,EAErCs3C,EAEf,MAAO,GAMT,MAAO,EAER,CAQA,cAAehW,EAAM,CAEpB,IAAM6U,EAAS,KAAK,OAEpB,QAAUjiD,EAAI,EAAGA,EAAI,EAAGA,IAAO,CAE9B,IAAMutC,EAAQ0U,EAAQjiD,CAAE,EAQxB,GAJAm0B,GAAU,EAAIoZ,EAAM,OAAO,EAAI,EAAIH,EAAI,IAAI,EAAIA,EAAI,IAAI,EACvDjZ,GAAU,EAAIoZ,EAAM,OAAO,EAAI,EAAIH,EAAI,IAAI,EAAIA,EAAI,IAAI,EACvDjZ,GAAU,EAAIoZ,EAAM,OAAO,EAAI,EAAIH,EAAI,IAAI,EAAIA,EAAI,IAAI,EAElDG,EAAM,gBAAiBpZ,EAAU,EAAI,EAEzC,MAAO,EAIT,CAEA,MAAO,EAER,CAQA,cAAezqB,EAAQ,CAEtB,IAAMu4C,EAAS,KAAK,OAEpB,QAAUjiD,EAAI,EAAGA,EAAI,EAAGA,IAEvB,GAAKiiD,EAAQjiD,CAAE,EAAE,gBAAiB0J,CAAM,EAAI,EAE3C,MAAO,GAMT,MAAO,EAER,CAOA,OAAQ,CAEP,OAAO,IAAI,KAAK,YAAY,EAAE,KAAM,IAAK,CAE1C,CAED,EAEM2qB,GAAoC,IAAIpJ,GACxCqJ,GAA2B,IAAIF,GAM/BG,GAAN,MAAM8uB,CAAa,CAMlB,aAAc,CAQb,KAAK,iBAAmBr7B,EAEzB,CAUA,iBAAkB7e,EAAQm6C,EAAc,CAEvC,GAAK,CAAEA,EAAY,eAAiBA,EAAY,QAAQ,SAAW,EAElE,MAAO,GAIR,QAAUtjD,EAAI,EAAGA,EAAIsjD,EAAY,QAAQ,OAAQtjD,IAAO,CAEvD,IAAM6a,EAASyoC,EAAY,QAAStjD,CAAE,EAatC,GAXAq0B,GAAoB,iBACnBxZ,EAAO,iBACPA,EAAO,kBACR,EAEAyZ,GAAW,wBACVD,GACAxZ,EAAO,iBACPA,EAAO,aACR,EAEKyZ,GAAW,iBAAkBnrB,CAAO,EAExC,MAAO,EAIT,CAEA,MAAO,EAER,CAUA,iBAAkBg6C,EAAQG,EAAc,CAEvC,GAAK,CAAEA,GAAe,CAAEA,EAAY,SAAWA,EAAY,QAAQ,SAAW,EAE7E,MAAO,GAIR,QAAUtjD,EAAI,EAAGA,EAAIsjD,EAAY,QAAQ,OAAQtjD,IAAO,CAEvD,IAAM6a,EAASyoC,EAAY,QAAStjD,CAAE,EAatC,GAXAq0B,GAAoB,iBACnBxZ,EAAO,iBACPA,EAAO,kBACR,EAEAyZ,GAAW,wBACVD,GACAxZ,EAAO,iBACPA,EAAO,aACR,EAEKyZ,GAAW,iBAAkB6uB,CAAO,EAExC,MAAO,EAIT,CAEA,MAAO,EAER,CAUA,iBAAkB7V,EAAQgW,EAAc,CAEvC,GAAK,CAAEA,GAAe,CAAEA,EAAY,SAAWA,EAAY,QAAQ,SAAW,EAE7E,MAAO,GAIR,QAAUtjD,EAAI,EAAGA,EAAIsjD,EAAY,QAAQ,OAAQtjD,IAAO,CAEvD,IAAM6a,EAASyoC,EAAY,QAAStjD,CAAE,EAatC,GAXAq0B,GAAoB,iBACnBxZ,EAAO,iBACPA,EAAO,kBACR,EAEAyZ,GAAW,wBACVD,GACAxZ,EAAO,iBACPA,EAAO,aACR,EAEKyZ,GAAW,iBAAkBgZ,CAAO,EAExC,MAAO,EAIT,CAEA,MAAO,EAER,CAUA,cAAeF,EAAKkW,EAAc,CAEjC,GAAK,CAAEA,GAAe,CAAEA,EAAY,SAAWA,EAAY,QAAQ,SAAW,EAE7E,MAAO,GAIR,QAAUtjD,EAAI,EAAGA,EAAIsjD,EAAY,QAAQ,OAAQtjD,IAAO,CAEvD,IAAM6a,EAASyoC,EAAY,QAAStjD,CAAE,EAatC,GAXAq0B,GAAoB,iBACnBxZ,EAAO,iBACPA,EAAO,kBACR,EAEAyZ,GAAW,wBACVD,GACAxZ,EAAO,iBACPA,EAAO,aACR,EAEKyZ,GAAW,cAAe8Y,CAAI,EAElC,MAAO,EAIT,CAEA,MAAO,EAER,CAUA,cAAe1jC,EAAO45C,EAAc,CAEnC,GAAK,CAAEA,GAAe,CAAEA,EAAY,SAAWA,EAAY,QAAQ,SAAW,EAE7E,MAAO,GAIR,QAAUtjD,EAAI,EAAGA,EAAIsjD,EAAY,QAAQ,OAAQtjD,IAAO,CAEvD,IAAM6a,EAASyoC,EAAY,QAAStjD,CAAE,EAatC,GAXAq0B,GAAoB,iBACnBxZ,EAAO,iBACPA,EAAO,kBACR,EAEAyZ,GAAW,wBACVD,GACAxZ,EAAO,iBACPA,EAAO,aACR,EAEKyZ,GAAW,cAAe5qB,CAAM,EAEpC,MAAO,EAIT,CAEA,MAAO,EAER,CAOA,OAAQ,CAEP,OAAO,IAAI25C,CAEZ,CAED,EAoBM7uB,GAAN,KAA0B,CAEzB,aAAc,CAEb,KAAK,MAAQ,EACb,KAAK,KAAO,CAAC,EACb,KAAK,KAAO,CAAC,CAEd,CAEA,KAAMhkB,EAAO07B,EAAOpxB,EAAG1N,EAAQ,CAE9B,IAAMm2C,EAAO,KAAK,KACZ1wC,EAAO,KAAK,KACb,KAAK,OAAS0wC,EAAK,QAEvBA,EAAK,KAAM,CAEV,MAAO,GACP,MAAO,GACP,EAAG,GACH,MAAO,EAER,CAAE,EAIH,IAAMC,EAAOD,EAAM,KAAK,KAAM,EAC9B1wC,EAAK,KAAM2wC,CAAK,EAChB,KAAK,QAELA,EAAK,MAAQhzC,EACbgzC,EAAK,MAAQtX,EACbsX,EAAK,EAAI1oC,EACT0oC,EAAK,MAAQp2C,CAEd,CAEA,OAAQ,CAEP,KAAK,KAAK,OAAS,EACnB,KAAK,MAAQ,CAEd,CAED,EAEMqnB,GAA0B,IAAIxJ,GAC9ByJ,IAA4B,IAAI7G,GAAO,EAAG,EAAG,CAAE,EAC/C8G,GAAyB,IAAIP,GAC7BQ,IAA8B,IAAIL,GAClCM,GAAuB,IAAIrL,GAC3BsL,GAA0B,IAAItK,GAC9BuK,GAA0B,IAAIrqB,EAC9BsqB,GAA2B,IAAItqB,EAC/BuqB,IAAsB,IAAIvqB,EAC1BwqB,GAA4B,IAAIV,GAChCW,GAAsB,IAAIrF,GAC1BsF,GAAmB,CAAC,EA2FpBC,GAAN,cAA0BvF,EAAK,CAU9B,YAAa2zB,EAAkBC,EAAgBC,EAAgBD,EAAiB,EAAGt6C,EAAW,CAE7F,MAAO,IAAImmB,GAAkBnmB,CAAS,EAStC,KAAK,cAAgB,GAQrB,KAAK,uBAAyB,GAU9B,KAAK,YAAc,GAQnB,KAAK,YAAc,KAQnB,KAAK,eAAiB,KAUtB,KAAK,WAAa,KAGlB,KAAK,cAAgB,CAAC,EACtB,KAAK,cAAgB,CAAC,EAGtB,KAAK,sBAAwB,CAAC,EAC9B,KAAK,sBAAwB,CAAC,EAG9B,KAAK,gBAAkB,EACvB,KAAK,iBAAmB,EACxB,KAAK,eAAiB,EAGtB,KAAK,mBAAqB,GAC1B,KAAK,qBAAuB,GAG5B,KAAK,kBAAoBq6C,EACzB,KAAK,gBAAkBC,EACvB,KAAK,eAAiBC,EAGtB,KAAK,iBAAmB,IAAI,WAAYF,CAAiB,EACzD,KAAK,iBAAmB,IAAI,WAAYA,CAAiB,EACzD,KAAK,gBAAkB,EACvB,KAAK,oBAAsB,KAG3B,KAAK,iBAAmB,KACxB,KAAK,iBAAmB,KACxB,KAAK,eAAiB,KAEtB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,CAE3B,CAQA,IAAI,kBAAmB,CAEtB,OAAO,KAAK,iBAEb,CAQA,IAAI,eAAgB,CAEnB,OAAO,KAAK,cAAc,OAAS,KAAK,sBAAsB,MAE/D,CAQA,IAAI,mBAAoB,CAEvB,OAAO,KAAK,gBAAkB,KAAK,gBAEpC,CAQA,IAAI,kBAAmB,CAEtB,OAAO,KAAK,eAAiB,KAAK,eAEnC,CAEA,sBAAuB,CAStB,IAAIxW,EAAO,KAAK,KAAM,KAAK,kBAAoB,CAAE,EACjDA,EAAO,KAAK,KAAMA,EAAO,CAAE,EAAI,EAC/BA,EAAO,KAAK,IAAKA,EAAM,CAAE,EAEzB,IAAM2W,EAAgB,IAAI,aAAc3W,EAAOA,EAAO,CAAE,EAClD4W,EAAkB,IAAI7wB,GAAa4wB,EAAe3W,EAAMA,EAAM9wB,GAAY+C,EAAU,EAE1F,KAAK,iBAAmB2kC,CAEzB,CAEA,sBAAuB,CAEtB,IAAI5W,EAAO,KAAK,KAAM,KAAK,iBAAkB,EAC7CA,EAAO,KAAK,KAAMA,CAAK,EAEvB,IAAM6W,EAAgB,IAAI,YAAa7W,EAAOA,CAAK,EAC7C8W,EAAkB,IAAI/wB,GAAa8wB,EAAe7W,EAAMA,EAAMlxB,GAAkBiD,EAAgB,EAEtG,KAAK,iBAAmB+kC,CAEzB,CAEA,oBAAqB,CAEpB,IAAI9W,EAAO,KAAK,KAAM,KAAK,iBAAkB,EAC7CA,EAAO,KAAK,KAAMA,CAAK,EAGvB,IAAM+W,EAAc,IAAI,aAAc/W,EAAOA,EAAO,CAAE,EAAE,KAAM,CAAE,EAC1DgX,EAAgB,IAAIjxB,GAAagxB,EAAa/W,EAAMA,EAAM9wB,GAAY+C,EAAU,EACtF+kC,EAAc,WAAal+C,GAAgB,kBAE3C,KAAK,eAAiBk+C,CAEvB,CAEA,oBAAqBC,EAAY,CAEhC,IAAMtpC,EAAW,KAAK,SAChB8oC,EAAiB,KAAK,gBACtBC,EAAgB,KAAK,eAC3B,GAAK,KAAK,uBAAyB,GAAQ,CAE1C,QAAYQ,KAAiBD,EAAU,WAAa,CAEnD,IAAME,EAAeF,EAAU,aAAcC,CAAc,EACrD,CAAE,MAAApkD,EAAO,SAAAyM,EAAU,WAAAkrC,CAAW,EAAI0M,EAElCC,EAAW,IAAItkD,EAAM,YAAa2jD,EAAiBl3C,CAAS,EAC5D83C,EAAe,IAAIh2B,GAAiB+1B,EAAU73C,EAAUkrC,CAAW,EAEzE98B,EAAS,aAAcupC,EAAeG,CAAa,CAEpD,CAEA,GAAKJ,EAAU,SAAS,IAAM,KAAO,CAGpC,IAAMK,EAAab,EAAiB,MACjC,IAAI,YAAaC,CAAc,EAC/B,IAAI,YAAaA,CAAc,EAElC/oC,EAAS,SAAU,IAAI0T,GAAiBi2B,EAAY,CAAE,CAAE,CAEzD,CAEA,KAAK,qBAAuB,EAE7B,CAED,CAGA,kBAAmB3pC,EAAW,CAG7B,IAAM4pC,EAAgB,KAAK,SAC3B,GAAK,EAAS5pC,EAAS,SAAS,GAAQ,EAAS4pC,EAAc,SAAS,EAEvE,MAAM,IAAI,MAAO,mEAAoE,EAItF,QAAYL,KAAiBK,EAAc,WAAa,CAEvD,GAAK,CAAE5pC,EAAS,aAAcupC,CAAc,EAE3C,MAAM,IAAI,MAAO,8CAA+CA,CAAc,oDAAqD,EAIpI,IAAMC,EAAexpC,EAAS,aAAcupC,CAAc,EACpDG,EAAeE,EAAc,aAAcL,CAAc,EAC/D,GAAKC,EAAa,WAAaE,EAAa,UAAYF,EAAa,aAAeE,EAAa,WAEhG,MAAM,IAAI,MAAO,yFAA0F,CAI7G,CAED,CAOA,mBAAoBjD,EAAa,CAEhC,IAAMoD,EAAe,KAAK,cAC1B,GAAKpD,EAAa,GAAKA,GAAcoD,EAAa,QAAUA,EAAcpD,CAAW,EAAE,SAAW,GAEjG,MAAM,IAAI,MAAO,yCAAyCA,CAAU,wDAAyD,CAI/H,CAOA,mBAAoBqD,EAAa,CAEhC,IAAMC,EAAmB,KAAK,cAC9B,GAAKD,EAAa,GAAKA,GAAcC,EAAiB,QAAUA,EAAkBD,CAAW,EAAE,SAAW,GAEzG,MAAM,IAAI,MAAO,yCAAyCA,CAAU,wDAAyD,CAI/H,CASA,cAAeE,EAAO,CAErB,YAAK,WAAaA,EACX,IAER,CAOA,oBAAqB,CAEf,KAAK,cAAgB,OAEzB,KAAK,YAAc,IAAIp7B,IAIxB,IAAMoxB,EAAc,KAAK,YACnB6J,EAAe,KAAK,cAE1B7J,EAAY,UAAU,EACtB,QAAU56C,EAAI,EAAG4V,EAAI6uC,EAAa,OAAQzkD,EAAI4V,EAAG5V,IAAO,CAEvD,GAAKykD,EAAczkD,CAAE,EAAE,SAAW,GAAQ,SAE1C,IAAM0kD,EAAaD,EAAczkD,CAAE,EAAE,cACrC,KAAK,YAAaA,EAAGy0B,EAAU,EAC/B,KAAK,iBAAkBiwB,EAAY7vB,EAAO,EAAE,aAAcJ,EAAU,EACpEmmB,EAAY,MAAO/lB,EAAO,CAE3B,CAED,CAOA,uBAAwB,CAElB,KAAK,iBAAmB,OAE5B,KAAK,eAAiB,IAAIrK,IAI3B,IAAMmwB,EAAiB,KAAK,eACtB8J,EAAe,KAAK,cAE1B9J,EAAe,UAAU,EACzB,QAAU36C,EAAI,EAAG4V,EAAI6uC,EAAa,OAAQzkD,EAAI4V,EAAG5V,IAAO,CAEvD,GAAKykD,EAAczkD,CAAE,EAAE,SAAW,GAAQ,SAE1C,IAAM0kD,EAAaD,EAAczkD,CAAE,EAAE,cACrC,KAAK,YAAaA,EAAGy0B,EAAU,EAC/B,KAAK,oBAAqBiwB,EAAY5vB,EAAU,EAAE,aAAcL,EAAU,EAC1EkmB,EAAe,MAAO7lB,EAAU,CAEjC,CAED,CASA,YAAa4vB,EAAa,CAKzB,GAHmB,KAAK,cAAc,QAAU,KAAK,kBAGlC,KAAK,sBAAsB,SAAW,EAExD,MAAM,IAAI,MAAO,gDAAiD,EAInE,IAAMD,EAAe,CACpB,QAAS,GACT,OAAQ,GACR,cAAeC,CAChB,EAEIG,EAAS,KAGR,KAAK,sBAAsB,OAAS,GAExC,KAAK,sBAAsB,KAAM14C,EAAU,EAE3C04C,EAAS,KAAK,sBAAsB,MAAM,EAC1C,KAAK,cAAeA,CAAO,EAAIJ,IAI/BI,EAAS,KAAK,cAAc,OAC5B,KAAK,cAAc,KAAMJ,CAAa,GAIvC,IAAMZ,EAAkB,KAAK,iBAC7BpvB,GAAU,SAAS,EAAE,QAASovB,EAAgB,MAAM,KAAMgB,EAAS,EAAG,EACtEhB,EAAgB,YAAc,GAE9B,IAAMI,EAAgB,KAAK,eAC3B,OAAKA,IAEJvvB,IAAY,QAASuvB,EAAc,MAAM,KAAMY,EAAS,CAAE,EAC1DZ,EAAc,YAAc,IAI7B,KAAK,mBAAqB,GACnBY,CAER,CAiBA,YAAajqC,EAAUkqC,EAAsB,GAAIC,EAAqB,GAAK,CAE1E,KAAK,oBAAqBnqC,CAAS,EAEnC,KAAK,kBAAmBA,CAAS,EAEjC,IAAMoqC,EAAe,CAEpB,YAAa,GACb,YAAa,GACb,oBAAqB,GAErB,WAAY,GACZ,WAAY,GACZ,mBAAoB,GAGpB,MAAO,GACP,MAAO,GAGP,YAAa,KACb,eAAgB,KAChB,OAAQ,EACT,EAEML,EAAmB,KAAK,cAC9BK,EAAa,YAAc,KAAK,iBAChCA,EAAa,oBAAsBF,IAAwB,GAAKlqC,EAAS,aAAc,UAAW,EAAE,MAAQkqC,EAE5G,IAAM13C,EAAQwN,EAAS,SAAS,EAShC,GARiBxN,IAAU,OAG1B43C,EAAa,WAAa,KAAK,gBAC/BA,EAAa,mBAAqBD,IAAuB,GAAK33C,EAAM,MAAQ23C,GAK5EC,EAAa,aAAe,IAC5BA,EAAa,WAAaA,EAAa,mBAAqB,KAAK,gBACjEA,EAAa,YAAcA,EAAa,oBAAsB,KAAK,gBAGnE,MAAM,IAAI,MAAO,4EAA6E,EAK/F,IAAIN,EACJ,OAAK,KAAK,sBAAsB,OAAS,GAExC,KAAK,sBAAsB,KAAMv4C,EAAU,EAE3Cu4C,EAAa,KAAK,sBAAsB,MAAM,EAC9CC,EAAkBD,CAAW,EAAIM,IAKjCN,EAAa,KAAK,eAClB,KAAK,iBACLC,EAAiB,KAAMK,CAAa,GAKrC,KAAK,cAAeN,EAAY9pC,CAAS,EAGzC,KAAK,gBAAkBoqC,EAAa,WAAaA,EAAa,mBAC9D,KAAK,iBAAmBA,EAAa,YAAcA,EAAa,oBAEzDN,CAER,CAWA,cAAeA,EAAY9pC,EAAW,CAErC,GAAK8pC,GAAc,KAAK,eAEvB,MAAM,IAAI,MAAO,oDAAqD,EAIvE,KAAK,kBAAmB9pC,CAAS,EAEjC,IAAM4pC,EAAgB,KAAK,SACrBS,EAAWT,EAAc,SAAS,IAAM,KACxCU,EAAWV,EAAc,SAAS,EAClCW,EAAWvqC,EAAS,SAAS,EAC7BoqC,EAAe,KAAK,cAAeN,CAAW,EACpD,GACCO,GACAE,EAAS,MAAQH,EAAa,oBAC9BpqC,EAAS,WAAW,SAAS,MAAQoqC,EAAa,oBAGlD,MAAM,IAAI,MAAO,2EAA4E,EAK9F,IAAMI,EAAcJ,EAAa,YAC3BF,EAAsBE,EAAa,oBACzCA,EAAa,YAAcpqC,EAAS,aAAc,UAAW,EAAE,MAE/D,QAAYupC,KAAiBK,EAAc,WAAa,CAGvD,IAAMJ,EAAexpC,EAAS,aAAcupC,CAAc,EACpDG,EAAeE,EAAc,aAAcL,CAAc,EAC/D73C,IAAmB83C,EAAcE,EAAcc,CAAY,EAG3D,IAAM54C,EAAW43C,EAAa,SAC9B,QAAUpkD,EAAIokD,EAAa,MAAOxuC,EAAIkvC,EAAqB9kD,EAAI4V,EAAG5V,IAAO,CAExE,IAAMoN,EAAQg4C,EAAcplD,EAC5B,QAAUgF,EAAI,EAAGA,EAAIwH,EAAUxH,IAE9Bs/C,EAAa,aAAcl3C,EAAOpI,EAAG,CAAE,CAIzC,CAEAs/C,EAAa,YAAc,GAC3BA,EAAa,eAAgBc,EAAc54C,EAAUs4C,EAAsBt4C,CAAS,CAErF,CAGA,GAAKy4C,EAAW,CAEf,IAAMI,EAAaL,EAAa,WAC1BD,EAAqBC,EAAa,mBACxCA,EAAa,WAAapqC,EAAS,SAAS,EAAE,MAG9C,QAAU5a,EAAI,EAAGA,EAAImlD,EAAS,MAAOnlD,IAEpCklD,EAAS,KAAMG,EAAarlD,EAAGolD,EAAcD,EAAS,KAAMnlD,CAAE,CAAE,EAKjE,QAAUA,EAAImlD,EAAS,MAAOvvC,EAAImvC,EAAoB/kD,EAAI4V,EAAG5V,IAE5DklD,EAAS,KAAMG,EAAarlD,EAAGolD,CAAY,EAI5CF,EAAS,YAAc,GACvBA,EAAS,eAAgBG,EAAYL,EAAa,kBAAmB,CAEtE,CAGA,OAAAA,EAAa,MAAQC,EAAWD,EAAa,WAAaA,EAAa,YACvEA,EAAa,MAAQC,EAAWD,EAAa,WAAaA,EAAa,YAGvEA,EAAa,YAAc,KACtBpqC,EAAS,cAAgB,OAE7BoqC,EAAa,YAAcpqC,EAAS,YAAY,MAAM,GAIvDoqC,EAAa,eAAiB,KACzBpqC,EAAS,iBAAmB,OAEhCoqC,EAAa,eAAiBpqC,EAAS,eAAe,MAAM,GAI7D,KAAK,mBAAqB,GACnB8pC,CAER,CASA,eAAgBA,EAAa,CAE5B,IAAMC,EAAmB,KAAK,cAC9B,GAAKD,GAAcC,EAAiB,QAAUA,EAAkBD,CAAW,EAAE,SAAW,GAEvF,OAAO,KAKR,IAAMD,EAAe,KAAK,cAC1B,QAAUzkD,EAAI,EAAG4V,EAAI6uC,EAAa,OAAQzkD,EAAI4V,EAAG5V,IAE3CykD,EAAczkD,CAAE,EAAE,QAAUykD,EAAczkD,CAAE,EAAE,gBAAkB0kD,GAEpE,KAAK,eAAgB1kD,CAAE,EAMzB,OAAA2kD,EAAkBD,CAAW,EAAE,OAAS,GACxC,KAAK,sBAAsB,KAAMA,CAAW,EAC5C,KAAK,mBAAqB,GAEnB,IAER,CAQA,eAAgBrD,EAAa,CAE5B,YAAK,mBAAoBA,CAAW,EAEpC,KAAK,cAAeA,CAAW,EAAE,OAAS,GAC1C,KAAK,sBAAsB,KAAMA,CAAW,EAC5C,KAAK,mBAAqB,GAEnB,IAER,CAQA,UAAW,CAGV,IAAIiE,EAAkB,EAClBC,EAAiB,EAIfZ,EAAmB,KAAK,cACxBxK,EAAUwK,EACd,IAAK,CAAEl8C,EAAGzI,IAAOA,CAAE,EACnB,KAAM,CAAE8E,EAAGC,IAEJ4/C,EAAkB7/C,CAAE,EAAE,YAAc6/C,EAAkB5/C,CAAE,EAAE,WAEhE,EAEG6V,EAAW,KAAK,SACtB,QAAU5a,EAAI,EAAG4V,EAAI+uC,EAAiB,OAAQ3kD,EAAI4V,EAAG5V,IAAO,CAG3D,IAAMoN,EAAQ+sC,EAASn6C,CAAE,EACnBglD,EAAeL,EAAkBv3C,CAAM,EAC7C,GAAK43C,EAAa,SAAW,GAO7B,IAAKpqC,EAAS,QAAU,KAAO,CAE9B,GAAKoqC,EAAa,aAAeO,EAAiB,CAEjD,GAAM,CAAE,WAAAF,EAAY,YAAAD,EAAa,mBAAAL,CAAmB,EAAIC,EAClD53C,EAAQwN,EAAS,MACjB7a,EAAQqN,EAAM,MAIdo4C,EAAeF,EAAkBF,EACvC,QAAUx9C,EAAIy9C,EAAYz9C,EAAIy9C,EAAaN,EAAoBn9C,IAE9D7H,EAAO6H,CAAE,EAAI7H,EAAO6H,CAAE,EAAI49C,EAI3Bp4C,EAAM,MAAM,WAAYm4C,EAAgBF,EAAYA,EAAaN,CAAmB,EACpF33C,EAAM,eAAgBm4C,EAAgBR,CAAmB,EACzD33C,EAAM,YAAc,GAEpB43C,EAAa,WAAaO,CAE3B,CAEAA,GAAkBP,EAAa,kBAEhC,CAGA,GAAKA,EAAa,cAAgBM,EAAkB,CAEnD,GAAM,CAAE,YAAAF,EAAa,oBAAAN,CAAoB,EAAIE,EACvCxM,EAAa59B,EAAS,WAC5B,QAAYtD,KAAOkhC,EAAa,CAE/B,IAAMpU,EAAYoU,EAAYlhC,CAAI,EAC5B,CAAE,MAAAvX,EAAO,SAAAyM,CAAS,EAAI43B,EAC5BrkC,EAAM,WAAYulD,EAAkB94C,EAAU44C,EAAc54C,GAAY44C,EAAcN,GAAwBt4C,CAAS,EACvH43B,EAAU,eAAgBkhB,EAAkB94C,EAAUs4C,EAAsBt4C,CAAS,EACrF43B,EAAU,YAAc,EAEzB,CAEA4gB,EAAa,YAAcM,CAE5B,CAEAA,GAAmBN,EAAa,oBAChCA,EAAa,MAAQpqC,EAAS,MAAQoqC,EAAa,WAAaA,EAAa,YAG7E,KAAK,gBAAkBpqC,EAAS,MAAQoqC,EAAa,WAAaA,EAAa,mBAAqB,EACpG,KAAK,iBAAmBA,EAAa,YAAcA,EAAa,oBAEjE,CAEA,YAAK,mBAAqB,GAEnB,IAER,CASA,iBAAkBN,EAAYh+C,EAAS,CAEtC,GAAKg+C,GAAc,KAAK,eAEvB,OAAO,KAKR,IAAM9pC,EAAW,KAAK,SAChBoqC,EAAe,KAAK,cAAeN,CAAW,EACpD,GAAKM,EAAa,cAAgB,KAAO,CAExC,IAAM5X,EAAM,IAAI5jB,GACVpc,EAAQwN,EAAS,MACjBI,EAAWJ,EAAS,WAAW,SACrC,QAAU5a,EAAIglD,EAAa,MAAO,EAAIA,EAAa,MAAQA,EAAa,MAAOhlD,EAAI,EAAGA,IAAO,CAE5F,IAAIylD,EAAKzlD,EACJoN,IAEJq4C,EAAKr4C,EAAM,KAAMq4C,CAAG,GAIrBrY,EAAI,cAAerY,GAAU,oBAAqB/Z,EAAUyqC,CAAG,CAAE,CAElE,CAEAT,EAAa,YAAc5X,CAE5B,CAEA,OAAA1mC,EAAO,KAAMs+C,EAAa,WAAY,EAC/Bt+C,CAER,CASA,oBAAqBg+C,EAAYh+C,EAAS,CAEzC,GAAKg+C,GAAc,KAAK,eAEvB,OAAO,KAKR,IAAM9pC,EAAW,KAAK,SAChBoqC,EAAe,KAAK,cAAeN,CAAW,EACpD,GAAKM,EAAa,iBAAmB,KAAO,CAE3C,IAAM1X,EAAS,IAAI9iB,GACnB,KAAK,iBAAkBk6B,EAAY7vB,EAAO,EAC1CA,GAAO,UAAWyY,EAAO,MAAO,EAEhC,IAAMlgC,EAAQwN,EAAS,MACjBI,EAAWJ,EAAS,WAAW,SAEjC8yB,EAAc,EAClB,QAAU1tC,EAAIglD,EAAa,MAAOpvC,EAAIovC,EAAa,MAAQA,EAAa,MAAOhlD,EAAI4V,EAAG5V,IAAO,CAE5F,IAAIylD,EAAKzlD,EACJoN,IAEJq4C,EAAKr4C,EAAM,KAAMq4C,CAAG,GAIrB1wB,GAAU,oBAAqB/Z,EAAUyqC,CAAG,EAC5C/X,EAAc,KAAK,IAAKA,EAAaJ,EAAO,OAAO,kBAAmBvY,EAAU,CAAE,CAEnF,CAEAuY,EAAO,OAAS,KAAK,KAAMI,CAAY,EACvCsX,EAAa,eAAiB1X,CAE/B,CAEA,OAAA5mC,EAAO,KAAMs+C,EAAa,cAAe,EAClCt+C,CAER,CAUA,YAAa26C,EAAYjW,EAAS,CAEjC,KAAK,mBAAoBiW,CAAW,EAEpC,IAAMwC,EAAkB,KAAK,iBACvBD,EAAgB,KAAK,iBAAiB,MAAM,KAClD,OAAAxY,EAAO,QAASwY,EAAevC,EAAa,EAAG,EAC/CwC,EAAgB,YAAc,GAEvB,IAER,CASA,YAAaxC,EAAYjW,EAAS,CAEjC,YAAK,mBAAoBiW,CAAW,EAC7BjW,EAAO,UAAW,KAAK,iBAAiB,MAAM,KAAMiW,EAAa,EAAG,CAE5E,CASA,WAAYA,EAAYp7C,EAAQ,CAE/B,YAAK,mBAAoBo7C,CAAW,EAE/B,KAAK,iBAAmB,MAE5B,KAAK,mBAAmB,EAIzBp7C,EAAM,QAAS,KAAK,eAAe,MAAM,KAAMo7C,EAAa,CAAE,EAC9D,KAAK,eAAe,YAAc,GAE3B,IAER,CASA,WAAYA,EAAYp7C,EAAQ,CAE/B,YAAK,mBAAoBo7C,CAAW,EAC7Bp7C,EAAM,UAAW,KAAK,eAAe,MAAM,KAAMo7C,EAAa,CAAE,CAExE,CASA,aAAcA,EAAYqE,EAAU,CAInC,OAFA,KAAK,mBAAoBrE,CAAW,EAE/B,KAAK,cAAeA,CAAW,EAAE,UAAYqE,EAE1C,MAIR,KAAK,cAAerE,CAAW,EAAE,QAAUqE,EAC3C,KAAK,mBAAqB,GAEnB,KAER,CAQA,aAAcrE,EAAa,CAE1B,YAAK,mBAAoBA,CAAW,EAE7B,KAAK,cAAeA,CAAW,EAAE,OAEzC,CASA,gBAAiBA,EAAYqD,EAAa,CAEzC,YAAK,mBAAoBrD,CAAW,EACpC,KAAK,mBAAoBqD,CAAW,EAEpC,KAAK,cAAerD,CAAW,EAAE,cAAgBqD,EAE1C,IAER,CAQA,gBAAiBrD,EAAa,CAE7B,YAAK,mBAAoBA,CAAW,EAE7B,KAAK,cAAeA,CAAW,EAAE,aAEzC,CAcA,mBAAoBqD,EAAYh+C,EAAS,CAAC,EAAI,CAE7C,KAAK,mBAAoBg+C,CAAW,EAEpC,IAAMM,EAAe,KAAK,cAAeN,CAAW,EACpD,OAAAh+C,EAAO,YAAcs+C,EAAa,YAClCt+C,EAAO,YAAcs+C,EAAa,YAClCt+C,EAAO,oBAAsBs+C,EAAa,oBAE1Ct+C,EAAO,WAAas+C,EAAa,WACjCt+C,EAAO,WAAas+C,EAAa,WACjCt+C,EAAO,mBAAqBs+C,EAAa,mBAEzCt+C,EAAO,MAAQs+C,EAAa,MAC5Bt+C,EAAO,MAAQs+C,EAAa,MAErBt+C,CAER,CASA,iBAAkB+8C,EAAmB,CAGpC,IAAMkC,EAAuB,KAAK,sBAC5BlB,EAAe,KAAK,cAE1B,IADAkB,EAAqB,KAAMx5C,EAAU,EAC7Bw5C,EAAsBA,EAAqB,OAAS,CAAE,IAAMlB,EAAa,OAAS,GAEzFA,EAAa,IAAI,EACjBkB,EAAqB,IAAI,EAK1B,GAAKlC,EAAmBgB,EAAa,OAEpC,MAAM,IAAI,MAAO,+CAAgDhB,CAAiB,gDAAiD,EAKpI,IAAMmC,EAAkB,IAAI,WAAYnC,CAAiB,EACnDoC,EAAkB,IAAI,WAAYpC,CAAiB,EACzD/2C,GAAmB,KAAK,iBAAkBk5C,CAAgB,EAC1Dl5C,GAAmB,KAAK,iBAAkBm5C,CAAgB,EAE1D,KAAK,iBAAmBD,EACxB,KAAK,iBAAmBC,EACxB,KAAK,kBAAoBpC,EAGzB,IAAMM,EAAkB,KAAK,iBACvBF,EAAkB,KAAK,iBACvBI,EAAgB,KAAK,eAE3BF,EAAgB,QAAQ,EACxB,KAAK,qBAAqB,EAC1Br3C,GAAmBq3C,EAAgB,MAAM,KAAM,KAAK,iBAAiB,MAAM,IAAK,EAEhFF,EAAgB,QAAQ,EACxB,KAAK,qBAAqB,EAC1Bn3C,GAAmBm3C,EAAgB,MAAM,KAAM,KAAK,iBAAiB,MAAM,IAAK,EAE3EI,IAEJA,EAAc,QAAQ,EACtB,KAAK,mBAAmB,EACxBv3C,GAAmBu3C,EAAc,MAAM,KAAM,KAAK,eAAe,MAAM,IAAK,EAI9E,CAUA,gBAAiBP,EAAgBC,EAAgB,CAGhD,IAAMmC,EAAc,CAAE,GAAG,KAAK,aAAc,EAAE,OAAQtR,GAAQA,EAAK,MAAO,EAE1E,GAD6B,KAAK,IAAK,GAAGsR,EAAY,IAAKhiD,GAASA,EAAM,YAAcA,EAAM,mBAAoB,CAAE,EACxF4/C,EAE3B,MAAM,IAAI,MAAO,wEAAyEC,CAAc,0BAA2B,EAKpI,GAAK,KAAK,SAAS,OAEU,KAAK,IAAK,GAAGmC,EAAY,IAAKhiD,GAASA,EAAM,WAAaA,EAAM,kBAAmB,CAAE,EACtF6/C,EAE1B,MAAM,IAAI,MAAO,uEAAwEA,CAAc,0BAA2B,EASpI,IAAMoC,EAAc,KAAK,SACzBA,EAAY,QAAQ,EAGpB,KAAK,gBAAkBrC,EACvB,KAAK,eAAiBC,EAEjB,KAAK,uBAET,KAAK,qBAAuB,GAC5B,KAAK,SAAW,IAAIp0B,GACpB,KAAK,oBAAqBw2B,CAAY,GAKvC,IAAMnrC,EAAW,KAAK,SACjBmrC,EAAY,OAEhBr5C,GAAmBq5C,EAAY,MAAM,MAAOnrC,EAAS,MAAM,KAAM,EAIlE,QAAYtD,KAAOyuC,EAAY,WAE9Br5C,GAAmBq5C,EAAY,WAAYzuC,CAAI,EAAE,MAAOsD,EAAS,WAAYtD,CAAI,EAAE,KAAM,CAI3F,CAEA,QAASjO,EAAWkE,EAAa,CAEhC,IAAMk3C,EAAe,KAAK,cACpBE,EAAmB,KAAK,cACxBr3C,EAAc,KAAK,YACnBk3C,EAAgB,KAAK,SAG3BrvB,GAAM,SAAW,KAAK,SACtBA,GAAM,SAAS,MAAQqvB,EAAc,MACrCrvB,GAAM,SAAS,WAAaqvB,EAAc,WACrCrvB,GAAM,SAAS,cAAgB,OAEnCA,GAAM,SAAS,YAAc,IAAI3L,IAI7B2L,GAAM,SAAS,iBAAmB,OAEtCA,GAAM,SAAS,eAAiB,IAAI3K,IAIrC,QAAUxqB,EAAI,EAAG4V,EAAI6uC,EAAa,OAAQzkD,EAAI4V,EAAG5V,IAAO,CAEvD,GAAK,CAAEykD,EAAczkD,CAAE,EAAE,SAAW,CAAEykD,EAAczkD,CAAE,EAAE,OAEvD,SAID,IAAM0kD,EAAaD,EAAczkD,CAAE,EAAE,cAC/BglD,EAAeL,EAAkBD,CAAW,EAClDvvB,GAAM,SAAS,aAAc6vB,EAAa,MAAOA,EAAa,KAAM,EAGpE,KAAK,YAAahlD,EAAGm1B,GAAM,WAAY,EAAE,YAAa7nB,CAAY,EAClE,KAAK,iBAAkBo3C,EAAYvvB,GAAM,SAAS,WAAY,EAC9D,KAAK,oBAAqBuvB,EAAYvvB,GAAM,SAAS,cAAe,EACpEA,GAAM,QAAS9rB,EAAW+rB,EAAiB,EAG3C,QAAUxtB,EAAI,EAAGgO,EAAIwf,GAAiB,OAAQxtB,EAAIgO,EAAGhO,IAAO,CAE3D,IAAM+B,EAAYyrB,GAAkBxtB,CAAE,EACtC+B,EAAU,OAAS,KACnBA,EAAU,QAAU3J,EACpBuN,EAAW,KAAM5D,CAAU,CAE5B,CAEAyrB,GAAiB,OAAS,CAE3B,CAEAD,GAAM,SAAW,KACjBA,GAAM,SAAS,MAAQ,KACvBA,GAAM,SAAS,WAAa,CAAC,EAC7BA,GAAM,SAAS,aAAc,EAAG,GAAS,CAE1C,CAEA,KAAMgX,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,SAAWA,EAAO,SAAS,MAAM,EACtC,KAAK,uBAAyBA,EAAO,uBACrC,KAAK,YAAcA,EAAO,YAC1B,KAAK,YAAcA,EAAO,cAAgB,KAAOA,EAAO,YAAY,MAAM,EAAI,KAC9E,KAAK,eAAiBA,EAAO,iBAAmB,KAAOA,EAAO,eAAe,MAAM,EAAI,KAEvF,KAAK,cAAgBA,EAAO,cAAc,IAAKqI,IAAU,CACxD,GAAGA,EAEH,YAAaA,EAAK,cAAgB,KAAOA,EAAK,YAAY,MAAM,EAAI,KACpE,eAAgBA,EAAK,iBAAmB,KAAOA,EAAK,eAAe,MAAM,EAAI,IAC9E,EAAI,EACJ,KAAK,cAAgBrI,EAAO,cAAc,IAAKqI,IAAU,CAAE,GAAGA,CAAK,EAAI,EAEvE,KAAK,sBAAwBrI,EAAO,sBAAsB,MAAM,EAChE,KAAK,sBAAwBA,EAAO,sBAAsB,MAAM,EAEhE,KAAK,gBAAkBA,EAAO,gBAC9B,KAAK,iBAAmBA,EAAO,iBAC/B,KAAK,eAAiBA,EAAO,eAE7B,KAAK,kBAAoBA,EAAO,kBAChC,KAAK,gBAAkBA,EAAO,gBAC9B,KAAK,eAAiBA,EAAO,eAE7B,KAAK,qBAAuBA,EAAO,qBACnC,KAAK,iBAAmBA,EAAO,iBAAiB,MAAM,EACtD,KAAK,iBAAmBA,EAAO,iBAAiB,MAAM,EAEtD,KAAK,iBAAmBA,EAAO,iBAAiB,MAAM,EACtD,KAAK,iBAAiB,MAAM,KAAO,KAAK,iBAAiB,MAAM,KAAK,MAAM,EAE1E,KAAK,iBAAmBA,EAAO,iBAAiB,MAAM,EACtD,KAAK,iBAAiB,MAAM,KAAO,KAAK,iBAAiB,MAAM,KAAK,MAAM,EAErE,KAAK,iBAAmB,OAE5B,KAAK,eAAiBA,EAAO,eAAe,MAAM,EAClD,KAAK,eAAe,MAAM,KAAO,KAAK,eAAe,MAAM,KAAK,MAAM,GAIhE,IAER,CAMA,SAAU,CAGT,KAAK,SAAS,QAAQ,EAEtB,KAAK,iBAAiB,QAAQ,EAC9B,KAAK,iBAAmB,KAExB,KAAK,iBAAiB,QAAQ,EAC9B,KAAK,iBAAmB,KAEnB,KAAK,iBAAmB,OAE5B,KAAK,eAAe,QAAQ,EAC5B,KAAK,eAAiB,KAIxB,CAEA,eAAgB1gC,EAAUqyC,EAAOjjC,EAAQD,EAAUxR,EAAuB,CAIzE,GAAK,CAAE,KAAK,oBAAsB,CAAE,KAAK,wBAA0B,CAAE,KAAK,YAEzE,OAMD,IAAMgE,EAAQwN,EAAS,SAAS,EAC1BorC,EAAkB54C,IAAU,KAAO,EAAIA,EAAM,MAAM,kBAEnDq3C,EAAe,KAAK,cACpBoB,EAAkB,KAAK,iBACvBD,EAAkB,KAAK,iBACvBjB,EAAmB,KAAK,cACxBsB,EAAyB,KAAK,uBAC9BlC,EAAkB,KAAK,iBACvBD,EAAgBC,EAAgB,MAAM,KAEtC7B,EAAUrnC,EAAO,cAAgB+Z,IAAgBD,GAElDsxB,GAA0B,CAAEprC,EAAO,gBAEvC4Z,GACE,iBAAkB5Z,EAAO,iBAAkBA,EAAO,kBAAmB,EACrE,SAAU,KAAK,WAAY,EAE7B8Z,GAAS,wBACRF,GACA5Z,EAAO,iBACPA,EAAO,aACR,GAID,IAAIqrC,EAAiB,EACrB,GAAK,KAAK,YAAc,CAGvBzxB,GAAU,KAAM,KAAK,WAAY,EAAE,OAAO,EAC1CM,GAAU,sBAAuBla,EAAO,WAAY,EAAE,aAAc4Z,EAAU,EAC9EO,GAAW,IAAK,EAAG,EAAG,EAAG,EAAE,mBAAoBna,EAAO,WAAY,EAAE,mBAAoB4Z,EAAU,EAElG,QAAUz0B,EAAI,EAAG4V,EAAI6uC,EAAa,OAAQzkD,EAAI4V,EAAG5V,IAEhD,GAAKykD,EAAczkD,CAAE,EAAE,SAAWykD,EAAczkD,CAAE,EAAE,OAAS,CAE5D,IAAM0kD,EAAaD,EAAczkD,CAAE,EAAE,cAGrC,KAAK,YAAaA,EAAGy0B,EAAU,EAC/B,KAAK,oBAAqBiwB,EAAY5vB,EAAU,EAAE,aAAcL,EAAU,EAG1E,IAAI0xB,EAAS,GAOb,GANKF,IAEJE,EAAS,CAAEjE,EAAQ,iBAAkBptB,GAAWja,CAAO,GAInD,CAAEsrC,EAAS,CAGf,IAAMnB,EAAeL,EAAkBD,CAAW,EAC5C5pC,EAAIma,IAAM,WAAYH,GAAU,OAAQC,EAAU,EAAE,IAAKC,EAAW,EAC1EE,GAAY,KAAM8vB,EAAa,MAAOA,EAAa,MAAOlqC,EAAG9a,CAAE,CAEhE,CAED,CAKD,IAAM6S,EAAOqiB,GAAY,KACnBkxB,EAAa,KAAK,WACnBA,IAAe,KAEnBvzC,EAAK,KAAMzJ,EAAS,YAAciD,IAAkBD,GAAW,EAI/Dg6C,EAAW,KAAM,KAAMvzC,EAAMgI,CAAO,EAIrC,QAAU7a,EAAI,EAAG4V,EAAI/C,EAAK,OAAQ7S,EAAI4V,EAAG5V,IAAO,CAE/C,IAAMwjD,EAAO3wC,EAAM7S,CAAE,EACrB6lD,EAAiBK,CAAe,EAAI1C,EAAK,MAAQwC,EACjDJ,EAAiBM,CAAe,EAAI1C,EAAK,MACzCM,EAAeoC,CAAe,EAAI1C,EAAK,MACvC0C,GAED,CAEAhxB,GAAY,MAAM,CAEnB,KAEC,SAAUl1B,EAAI,EAAG4V,EAAI6uC,EAAa,OAAQzkD,EAAI4V,EAAG5V,IAEhD,GAAKykD,EAAczkD,CAAE,EAAE,SAAWykD,EAAczkD,CAAE,EAAE,OAAS,CAE5D,IAAM0kD,EAAaD,EAAczkD,CAAE,EAAE,cAGjCmmD,EAAS,GAUb,GATKF,IAGJ,KAAK,YAAajmD,EAAGy0B,EAAU,EAC/B,KAAK,oBAAqBiwB,EAAY5vB,EAAU,EAAE,aAAcL,EAAU,EAC1E0xB,EAAS,CAAEjE,EAAQ,iBAAkBptB,GAAWja,CAAO,GAInD,CAAEsrC,EAAS,CAEf,IAAMnB,EAAeL,EAAkBD,CAAW,EAClDmB,EAAiBK,CAAe,EAAIlB,EAAa,MAAQgB,EACzDJ,EAAiBM,CAAe,EAAIlB,EAAa,MACjDlB,EAAeoC,CAAe,EAAIlmD,EAClCkmD,GAED,CAED,CAMFnC,EAAgB,YAAc,GAC9B,KAAK,gBAAkBmC,EACvB,KAAK,mBAAqB,EAE3B,CAEA,eAAgBz6C,EAAUtC,EAAQ0R,EAAQwrC,EAAczrC,EAAU0rC,EAA6B,CAE9F,KAAK,eAAgB76C,EAAU,KAAM46C,EAAczrC,EAAU0rC,CAAc,CAE5E,CAED,EAaMhxB,GAAN,cAAgCtH,EAAS,CAWxC,YAAa4mB,EAAa,CAEzB,MAAM,EASN,KAAK,oBAAsB,GAE3B,KAAK,KAAO,oBAQZ,KAAK,MAAQ,IAAI/mB,GAAO,QAAS,EASjC,KAAK,IAAM,KAYX,KAAK,UAAY,EAUjB,KAAK,QAAU,QAUf,KAAK,SAAW,QAQhB,KAAK,IAAM,GAEX,KAAK,UAAW+mB,CAAW,CAE5B,CAEA,KAAMzI,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,MAAM,KAAMA,EAAO,KAAM,EAE9B,KAAK,IAAMA,EAAO,IAElB,KAAK,UAAYA,EAAO,UACxB,KAAK,QAAUA,EAAO,QACtB,KAAK,SAAWA,EAAO,SAEvB,KAAK,IAAMA,EAAO,IAEX,IAER,CAED,EAEMp/B,GAAwB,IAAIrC,EAC5BsC,GAAsB,IAAItC,EAE1B6qB,GAAiC,IAAItK,GACrCuK,GAAuB,IAAIxK,GAC3ByK,GAA0B,IAAIjL,GAE9Bvd,GAAqC,IAAIvC,EACzCwC,GAAyC,IAAIxC,EAsB7CgrB,GAAN,cAAmB9I,EAAS,CAQ3B,YAAahS,EAAW,IAAI2U,GAAkBnmB,EAAW,IAAIksB,GAAsB,CAElF,MAAM,EASN,KAAK,OAAS,GAEd,KAAK,KAAO,OAOZ,KAAK,SAAW1a,EAQhB,KAAK,SAAWxR,EAUhB,KAAK,sBAAwB,OAU7B,KAAK,sBAAwB,OAE7B,KAAK,mBAAmB,CAEzB,CAEA,KAAM+iC,EAAQ/xB,EAAY,CAEzB,aAAM,KAAM+xB,EAAQ/xB,CAAU,EAE9B,KAAK,SAAW,MAAM,QAAS+xB,EAAO,QAAS,EAAIA,EAAO,SAAS,MAAM,EAAIA,EAAO,SACpF,KAAK,SAAWA,EAAO,SAEhB,IAER,CASA,sBAAuB,CAEtB,IAAMvxB,EAAW,KAAK,SAItB,GAAKA,EAAS,QAAU,KAAO,CAE9B,IAAM9N,EAAoB8N,EAAS,WAAW,SACxC2rC,EAAgB,CAAE,CAAE,EAE1B,QAAUvmD,EAAI,EAAG4V,EAAI9I,EAAkB,MAAO9M,EAAI4V,EAAG5V,IAEpD+M,GAAQ,oBAAqBD,EAAmB9M,EAAI,CAAE,EACtDgN,GAAM,oBAAqBF,EAAmB9M,CAAE,EAEhDumD,EAAevmD,CAAE,EAAIumD,EAAevmD,EAAI,CAAE,EAC1CumD,EAAevmD,CAAE,GAAK+M,GAAQ,WAAYC,EAAM,EAIjD4N,EAAS,aAAc,eAAgB,IAAImU,GAAwBw3B,EAAe,CAAE,CAAE,CAEvF,MAECtlD,GAAM,yFAA0F,EAIjG,OAAO,IAER,CAQA,QAASoI,EAAWkE,EAAa,CAEhC,IAAMqN,EAAW,KAAK,SAChBtN,EAAc,KAAK,YACnBgyC,EAAYj2C,EAAU,OAAO,KAAK,UAClC8xC,EAAYvgC,EAAS,UAU3B,GANKA,EAAS,iBAAmB,MAAOA,EAAS,sBAAsB,EAEvE6a,GAAU,KAAM7a,EAAS,cAAe,EACxC6a,GAAU,aAAcnoB,CAAY,EACpCmoB,GAAU,QAAU6pB,EAEfj2C,EAAU,IAAI,iBAAkBosB,EAAU,IAAM,GAAQ,OAI7DF,GAAiB,KAAMjoB,CAAY,EAAE,OAAO,EAC5CkoB,GAAO,KAAMnsB,EAAU,GAAI,EAAE,aAAcksB,EAAiB,EAE5D,IAAMixB,EAAiBlH,IAAgB,KAAK,MAAM,EAAI,KAAK,MAAM,EAAI,KAAK,MAAM,GAAM,GAChFjyC,EAAmBm5C,EAAiBA,EAEpCpgB,EAAO,KAAK,eAAiB,EAAI,EAEjCh5B,EAAQwN,EAAS,MAEjB9N,EADa8N,EAAS,WACS,SAErC,GAAKxN,IAAU,KAAO,CAErB,IAAMoD,EAAQ,KAAK,IAAK,EAAG2qC,EAAU,KAAM,EACrC1qC,EAAM,KAAK,IAAKrD,EAAM,MAAS+tC,EAAU,MAAQA,EAAU,KAAQ,EAEzE,QAAUn7C,EAAIwQ,EAAOoF,EAAInF,EAAM,EAAGzQ,EAAI4V,EAAG5V,GAAKomC,EAAO,CAEpD,IAAMthC,EAAIsI,EAAM,KAAMpN,CAAE,EAClB+E,EAAIqI,EAAM,KAAMpN,EAAI,CAAE,EAEtB2J,EAAYiD,GAAmB,KAAMvD,EAAWmsB,GAAQnoB,EAAkBvI,EAAGC,EAAG/E,CAAE,EAEnF2J,GAEJ4D,EAAW,KAAM5D,CAAU,CAI7B,CAEA,GAAK,KAAK,WAAa,CAEtB,IAAM7E,EAAIsI,EAAM,KAAMqD,EAAM,CAAE,EACxB1L,EAAIqI,EAAM,KAAMoD,CAAM,EAEtB7G,EAAYiD,GAAmB,KAAMvD,EAAWmsB,GAAQnoB,EAAkBvI,EAAGC,EAAG0L,EAAM,CAAE,EAEzF9G,GAEJ4D,EAAW,KAAM5D,CAAU,CAI7B,CAED,KAAO,CAEN,IAAM6G,EAAQ,KAAK,IAAK,EAAG2qC,EAAU,KAAM,EACrC1qC,EAAM,KAAK,IAAK3D,EAAkB,MAASquC,EAAU,MAAQA,EAAU,KAAQ,EAErF,QAAUn7C,EAAIwQ,EAAOoF,EAAInF,EAAM,EAAGzQ,EAAI4V,EAAG5V,GAAKomC,EAAO,CAEpD,IAAMz8B,EAAYiD,GAAmB,KAAMvD,EAAWmsB,GAAQnoB,EAAkBrN,EAAGA,EAAI,EAAGA,CAAE,EAEvF2J,GAEJ4D,EAAW,KAAM5D,CAAU,CAI7B,CAEA,GAAK,KAAK,WAAa,CAEtB,IAAMA,EAAYiD,GAAmB,KAAMvD,EAAWmsB,GAAQnoB,EAAkBoD,EAAM,EAAGD,EAAOC,EAAM,CAAE,EAEnG9G,GAEJ4D,EAAW,KAAM5D,CAAU,CAI7B,CAED,CAED,CAMA,oBAAqB,CAIpB,IAAM4wC,EAFW,KAAK,SAEW,gBAC3BM,EAAO,OAAO,KAAMN,CAAgB,EAE1C,GAAKM,EAAK,OAAS,EAAI,CAEtB,IAAMxC,EAAiBkC,EAAiBM,EAAM,CAAE,CAAE,EAElD,GAAKxC,IAAmB,OAAY,CAEnC,KAAK,sBAAwB,CAAC,EAC9B,KAAK,sBAAwB,CAAC,EAE9B,QAAU71C,EAAI,EAAGs4C,EAAKzC,EAAe,OAAQ71C,EAAIs4C,EAAIt4C,IAAO,CAE3D,IAAMjC,EAAO83C,EAAgB71C,CAAE,EAAE,MAAQ,OAAQA,CAAE,EAEnD,KAAK,sBAAsB,KAAM,CAAE,EACnC,KAAK,sBAAuBjC,CAAK,EAAIiC,CAEtC,CAED,CAED,CAED,CAED,EAmCMmzB,GAAuB,IAAIjrB,EAC3BkrB,GAAqB,IAAIlrB,EAOzBmrB,GAAN,cAA2BH,EAAK,CAQ/B,YAAa9a,EAAUxR,EAAW,CAEjC,MAAOwR,EAAUxR,CAAS,EAS1B,KAAK,eAAiB,GAEtB,KAAK,KAAO,cAEb,CAEA,sBAAuB,CAEtB,IAAMwR,EAAW,KAAK,SAItB,GAAKA,EAAS,QAAU,KAAO,CAE9B,IAAM9N,EAAoB8N,EAAS,WAAW,SACxC2rC,EAAgB,CAAC,EAEvB,QAAUvmD,EAAI,EAAG4V,EAAI9I,EAAkB,MAAO9M,EAAI4V,EAAG5V,GAAK,EAEzD21B,GAAO,oBAAqB7oB,EAAmB9M,CAAE,EACjD41B,GAAK,oBAAqB9oB,EAAmB9M,EAAI,CAAE,EAEnDumD,EAAevmD,CAAE,EAAMA,IAAM,EAAM,EAAIumD,EAAevmD,EAAI,CAAE,EAC5DumD,EAAevmD,EAAI,CAAE,EAAIumD,EAAevmD,CAAE,EAAI21B,GAAO,WAAYC,EAAK,EAIvEhb,EAAS,aAAc,eAAgB,IAAImU,GAAwBw3B,EAAe,CAAE,CAAE,CAEvF,MAECtlD,GAAM,iGAAkG,EAIzG,OAAO,IAER,CAED,EASM60B,GAAN,cAAuBJ,EAAK,CAQ3B,YAAa9a,EAAUxR,EAAW,CAEjC,MAAOwR,EAAUxR,CAAS,EAS1B,KAAK,WAAa,GAElB,KAAK,KAAO,UAEb,CAED,EA2BM2sB,GAAN,cAA6B/H,EAAS,CAWrC,YAAa4mB,EAAa,CAEzB,MAAM,EASN,KAAK,iBAAmB,GAExB,KAAK,KAAO,iBAQZ,KAAK,MAAQ,IAAI/mB,GAAO,QAAS,EAUjC,KAAK,IAAM,KAeX,KAAK,SAAW,KAUhB,KAAK,KAAO,EAQZ,KAAK,gBAAkB,GAQvB,KAAK,IAAM,GAEX,KAAK,UAAW+mB,CAAW,CAE5B,CAEA,KAAMzI,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,MAAM,KAAMA,EAAO,KAAM,EAE9B,KAAK,IAAMA,EAAO,IAElB,KAAK,SAAWA,EAAO,SAEvB,KAAK,KAAOA,EAAO,KACnB,KAAK,gBAAkBA,EAAO,gBAE9B,KAAK,IAAMA,EAAO,IAEX,IAER,CAED,EAEMnW,GAA+B,IAAI/K,GACnCxd,GAAqB,IAAIud,GACzBiL,GAAwB,IAAIzL,GAC5B0L,GAA4B,IAAIxrB,EAOhCyrB,GAAN,cAAqBvJ,EAAS,CAQ7B,YAAahS,EAAW,IAAI2U,GAAkBnmB,EAAW,IAAI2sB,GAAmB,CAE/E,MAAM,EASN,KAAK,SAAW,GAEhB,KAAK,KAAO,SAOZ,KAAK,SAAWnb,EAQhB,KAAK,SAAWxR,EAUhB,KAAK,sBAAwB,OAU7B,KAAK,sBAAwB,OAE7B,KAAK,mBAAmB,CAEzB,CAEA,KAAM+iC,EAAQ/xB,EAAY,CAEzB,aAAM,KAAM+xB,EAAQ/xB,CAAU,EAE9B,KAAK,SAAW,MAAM,QAAS+xB,EAAO,QAAS,EAAIA,EAAO,SAAS,MAAM,EAAIA,EAAO,SACpF,KAAK,SAAWA,EAAO,SAEhB,IAER,CAQA,QAAS9iC,EAAWkE,EAAa,CAEhC,IAAMqN,EAAW,KAAK,SAChBtN,EAAc,KAAK,YACnBgyC,EAAYj2C,EAAU,OAAO,OAAO,UACpC8xC,EAAYvgC,EAAS,UAU3B,GANKA,EAAS,iBAAmB,MAAOA,EAAS,sBAAsB,EAEvEqb,GAAQ,KAAMrb,EAAS,cAAe,EACtCqb,GAAQ,aAAc3oB,CAAY,EAClC2oB,GAAQ,QAAUqpB,EAEbj2C,EAAU,IAAI,iBAAkB4sB,EAAQ,IAAM,GAAQ,OAI3DD,GAAe,KAAM1oB,CAAY,EAAE,OAAO,EAC1CG,GAAK,KAAMpE,EAAU,GAAI,EAAE,aAAc2sB,EAAe,EAExD,IAAMwwB,EAAiBlH,IAAgB,KAAK,MAAM,EAAI,KAAK,MAAM,EAAI,KAAK,MAAM,GAAM,GAChFjyC,EAAmBm5C,EAAiBA,EAEpCp5C,EAAQwN,EAAS,MAEjB9N,EADa8N,EAAS,WACS,SAErC,GAAKxN,IAAU,KAAO,CAErB,IAAMoD,EAAQ,KAAK,IAAK,EAAG2qC,EAAU,KAAM,EACrC1qC,EAAM,KAAK,IAAKrD,EAAM,MAAS+tC,EAAU,MAAQA,EAAU,KAAQ,EAEzE,QAAUn7C,EAAIwQ,EAAOu8B,EAAKt8B,EAAKzQ,EAAI+sC,EAAI/sC,IAAO,CAE7C,IAAM8E,EAAIsI,EAAM,KAAMpN,CAAE,EAExBk2B,GAAY,oBAAqBppB,EAAmBhI,CAAE,EAEtDqI,GAAW+oB,GAAapxB,EAAGuI,EAAkBC,EAAajE,EAAWkE,EAAY,IAAK,CAEvF,CAED,KAAO,CAEN,IAAMiD,EAAQ,KAAK,IAAK,EAAG2qC,EAAU,KAAM,EACrC1qC,EAAM,KAAK,IAAK3D,EAAkB,MAASquC,EAAU,MAAQA,EAAU,KAAQ,EAErF,QAAUn7C,EAAIwQ,EAAOoF,EAAInF,EAAKzQ,EAAI4V,EAAG5V,IAEpCk2B,GAAY,oBAAqBppB,EAAmB9M,CAAE,EAEtDmN,GAAW+oB,GAAal2B,EAAGqN,EAAkBC,EAAajE,EAAWkE,EAAY,IAAK,CAIxF,CAED,CAMA,oBAAqB,CAIpB,IAAMgtC,EAFW,KAAK,SAEW,gBAC3BM,EAAO,OAAO,KAAMN,CAAgB,EAE1C,GAAKM,EAAK,OAAS,EAAI,CAEtB,IAAMxC,EAAiBkC,EAAiBM,EAAM,CAAE,CAAE,EAElD,GAAKxC,IAAmB,OAAY,CAEnC,KAAK,sBAAwB,CAAC,EAC9B,KAAK,sBAAwB,CAAC,EAE9B,QAAU71C,EAAI,EAAGs4C,EAAKzC,EAAe,OAAQ71C,EAAIs4C,EAAIt4C,IAAO,CAE3D,IAAMjC,EAAO83C,EAAgB71C,CAAE,EAAE,MAAQ,OAAQA,CAAE,EAEnD,KAAK,sBAAsB,KAAM,CAAE,EACnC,KAAK,sBAAuBjC,CAAK,EAAIiC,CAEtC,CAED,CAED,CAED,CAED,EAmDM4zB,GAAN,cAA2BpN,EAAQ,CAelC,YAAay9B,EAAO7a,EAASC,EAAOC,EAAOC,EAAYjoB,GAAckoB,EAAYloB,GAAcpI,EAAQxb,EAAM+rC,EAAa,CAEzH,MAAOwa,EAAO7a,EAASC,EAAOC,EAAOC,EAAWC,EAAWtwB,EAAQxb,EAAM+rC,CAAW,EASpF,KAAK,eAAiB,GAUtB,KAAK,gBAAkB,GAUvB,KAAK,6BAA+B,EAEpC,IAAMwP,EAAQ,KAEd,SAASiL,GAAc,CAEtBjL,EAAM,YAAc,GACpBA,EAAM,6BAA+BgL,EAAM,0BAA2BC,CAAY,CAEnF,CAEK,8BAA+BD,IAEnC,KAAK,6BAA+BA,EAAM,0BAA2BC,CAAY,EAInF,CAEA,OAAQ,CAEP,OAAO,IAAI,KAAK,YAAa,KAAK,KAAM,EAAE,KAAM,IAAK,CAEtD,CAQA,QAAS,CAER,IAAMD,EAAQ,KAAK,MACW,8BAA+BA,IAE9B,IAASA,EAAM,YAAcA,EAAM,oBAEjE,KAAK,YAAc,GAIrB,CAEA,SAAU,CAEJ,KAAK,+BAAiC,IAE1C,KAAK,OAAO,KAAK,yBAA0B,KAAK,4BAA6B,EAE7E,KAAK,6BAA+B,GAIrC,MAAM,QAAQ,CAEf,CAED,EAeMpwB,GAAN,cAAgCD,EAAa,CAc5C,YAAawV,EAASC,EAAOC,EAAOC,EAAWC,EAAWtwB,EAAQxb,EAAM+rC,EAAa,CAEpF,MAAO,CAAC,EAAGL,EAASC,EAAOC,EAAOC,EAAWC,EAAWtwB,EAAQxb,EAAM+rC,CAAW,EASjF,KAAK,oBAAsB,EAE5B,CAMA,QAAS,CAAC,CAEV,OAAQ,CAEP,OAAO,IAAI,KAAK,YAAY,EAAE,KAAM,IAAK,CAE1C,CAQA,SAAUj0B,EAAQ,CAEjB,KAAK,MAAQA,EACb,KAAK,YAAc,EAEpB,CAED,EA0BMse,GAAN,cAAiCtN,EAAQ,CAQxC,YAAaxN,EAAOC,EAAS,CAE5B,MAAO,CAAE,MAAAD,EAAO,OAAAC,CAAO,CAAE,EASzB,KAAK,qBAAuB,GAU5B,KAAK,UAAYgI,GAUjB,KAAK,UAAYA,GAUjB,KAAK,gBAAkB,GAEvB,KAAK,YAAc,EAEpB,CAED,EASM8S,GAAN,cAAgCvN,EAAQ,CAmBvC,YAAa29B,EAASnrC,EAAOC,EAAQC,EAAQxb,EAAM0rC,EAASC,EAAOC,EAAOC,EAAWC,EAAWC,EAAY1lC,EAAa,CAExH,MAAO,KAAMqlC,EAASC,EAAOC,EAAOC,EAAWC,EAAWtwB,EAAQxb,EAAM+rC,EAAY1lC,CAAW,EAS/F,KAAK,oBAAsB,GAO3B,KAAK,MAAQ,CAAE,MAAOiV,EAAO,OAAQC,CAAO,EAO5C,KAAK,QAAUkrC,EAaf,KAAK,MAAQ,GAab,KAAK,gBAAkB,EAExB,CAED,EASMnwB,GAAN,cAAqCD,EAAkB,CAatD,YAAaowB,EAASnrC,EAAOC,EAAQqxB,EAAOpxB,EAAQxb,EAAO,CAE1D,MAAOymD,EAASnrC,EAAOC,EAAQC,EAAQxb,CAAK,EAS5C,KAAK,yBAA2B,GAQhC,KAAK,MAAM,MAAQ4sC,EASnB,KAAK,MAAQvpB,GAOb,KAAK,aAAe,IAAI,GAEzB,CAWA,eAAgBypB,EAAa,CAE5B,KAAK,aAAa,IAAKA,CAAW,CAEnC,CAKA,mBAAoB,CAEnB,KAAK,aAAa,MAAM,CAEzB,CAED,EASMvW,GAAN,cAAoCF,EAAkB,CASrD,YAAa4e,EAAQz5B,EAAQxb,EAAO,CAEnC,MAAO,OAAWi1C,EAAQ,CAAE,EAAE,MAAOA,EAAQ,CAAE,EAAE,OAAQz5B,EAAQxb,EAAM+iB,EAAsB,EAS7F,KAAK,wBAA0B,GAS/B,KAAK,cAAgB,GAErB,KAAK,MAAQkyB,CAEd,CAED,EAUMze,GAAN,cAA4B1N,EAAQ,CAenC,YAAavoB,EAAQmrC,EAASC,EAAOC,EAAOC,EAAWC,EAAWtwB,EAAQxb,EAAM+rC,EAAa,CAE5F,MAAOxrC,EAAQmrC,EAASC,EAAOC,EAAOC,EAAWC,EAAWtwB,EAAQxb,EAAM+rC,CAAW,EASrF,KAAK,gBAAkB,GAEvB,KAAK,YAAc,EAEpB,CAED,EAQMtV,GAAN,cAA2B3N,EAAQ,CAiBlC,YAAaxN,EAAOC,EAAQvb,EAAO8e,GAAiB4sB,EAASC,EAAOC,EAAOC,EAAYtoB,GAAeuoB,EAAYvoB,GAAewoB,EAAYvwB,EAAS0I,GAAa0oB,EAAQ,EAAI,CAE9K,GAAKpxB,IAAW0I,IAAe1I,IAAW2I,GAEzC,MAAM,IAAI,MAAO,kFAAmF,EAIrG,IAAMjd,EAAQ,CAAE,MAAOoU,EAAO,OAAQC,EAAQ,MAAOqxB,CAAM,EAE3D,MAAO1lC,EAAOwkC,EAASC,EAAOC,EAAOC,EAAWC,EAAWtwB,EAAQxb,EAAM+rC,CAAW,EASpF,KAAK,eAAiB,GAWtB,KAAK,MAAQ,GAUb,KAAK,gBAAkB,GAQvB,KAAK,gBAAkB,IAExB,CAGA,KAAME,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,OAAS,IAAItjB,GAAQ,OAAO,OAAQ,CAAC,EAAGsjB,EAAO,KAAM,CAAE,EAC5D,KAAK,gBAAkBA,EAAO,gBAEvB,IAER,CAEA,OAAQZ,EAAO,CAEd,IAAM97B,EAAO,MAAM,OAAQ87B,CAAK,EAEhC,OAAK,KAAK,kBAAoB,OAAO97B,EAAK,gBAAkB,KAAK,iBAE1DA,CAER,CAED,EAQMmnB,GAAN,cAA+BD,EAAa,CAe3C,YAAasW,EAAM/sC,EAAO8e,GAAiB4sB,EAAU3oB,GAAuB4oB,EAAOC,EAAOC,EAAYtoB,GAAeuoB,EAAYvoB,GAAewoB,EAAYvwB,EAAS0I,GAAc,CAGlL,IAAMhd,EAAQ,CAAE,MAAO6lC,EAAM,OAAQA,EAAM,MAAO,CAAE,EAC9CkI,EAAS,CAAE/tC,EAAOA,EAAOA,EAAOA,EAAOA,EAAOA,CAAM,EAG1D,MAAO6lC,EAAMA,EAAM/sC,EAAM0rC,EAASC,EAAOC,EAAOC,EAAWC,EAAWC,EAAYvwB,CAAO,EAGzF,KAAK,MAAQy5B,EASb,KAAK,mBAAqB,GAS1B,KAAK,cAAgB,EAEtB,CAOA,IAAI,QAAS,CAEZ,OAAO,KAAK,KAEb,CAEA,IAAI,OAAQhzC,EAAQ,CAEnB,KAAK,MAAQA,CAEd,CAED,EAaM00B,GAAN,cAA8B7N,EAAQ,CAOrC,YAAa49B,EAAgB,KAAO,CAEnC,MAAM,EAQN,KAAK,cAAgBA,EASrB,KAAK,kBAAoB,EAE1B,CAEA,KAAMza,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,cAAgBA,EAAO,cAErB,IAER,CAED,EAeMrV,GAAN,MAAM+vB,UAAwBt3B,EAAe,CAW5C,YAAa2Y,EAAS,EAAGzsB,EAAS,EAAGqrC,EAAc,EAAGC,EAAiB,EAAGxL,EAAiB,EAAI,CAE9F,MAAM,EAEN,KAAK,KAAO,kBASZ,KAAK,WAAa,CACjB,OAAQrT,EACR,OAAQzsB,EACR,YAAaqrC,EACb,eAAgBC,EAChB,eAAgBxL,CACjB,EAEA9/B,EAAS,KAAK,IAAK,EAAGA,CAAO,EAC7BqrC,EAAc,KAAK,IAAK,EAAG,KAAK,MAAOA,CAAY,CAAE,EACrDC,EAAiB,KAAK,IAAK,EAAG,KAAK,MAAOA,CAAe,CAAE,EAC3DxL,EAAiB,KAAK,IAAK,EAAG,KAAK,MAAOA,CAAe,CAAE,EAI3D,IAAMpB,EAAU,CAAC,EACXrkC,EAAW,CAAC,EACZmkC,EAAU,CAAC,EACXyB,EAAM,CAAC,EAIPsL,EAAavrC,EAAS,EACtBwrC,EAAiB,KAAK,GAAK,EAAM/e,EACjCgf,EAAqBzrC,EACrB0rC,EAAiB,EAAIF,EAAeC,EAEpCE,EAAsBN,EAAc,EAAIvL,EACxC8L,EAAiBN,EAAiB,EAElC58C,EAAS,IAAIO,EACb48C,EAAS,IAAI58C,EAInB,QAAUiyC,EAAK,EAAGA,GAAMyK,EAAqBzK,IAAQ,CAEpD,IAAI4K,EAAmB,EACnBC,EAAW,EACXC,EAAgB,EAChBC,EAAmB,EAEvB,GAAK/K,GAAMmK,EAAc,CAGxB,IAAMa,EAAkBhL,EAAKmK,EACvBziB,EAAUsjB,EAAkB,KAAK,GAAO,EAC9CH,EAAW,CAAER,EAAa9e,EAAS,KAAK,IAAK7D,CAAM,EACnDojB,EAAgBvf,EAAS,KAAK,IAAK7D,CAAM,EACzCqjB,EAAmB,CAAExf,EAAS,KAAK,IAAK7D,CAAM,EAC9CkjB,EAAmBI,EAAkBV,CAEtC,SAAYtK,GAAMmK,EAAcvL,EAAiB,CAGhD,IAAMoM,GAAoBhL,EAAKmK,GAAgBvL,EAC/CiM,EAAW,CAAER,EAAaW,EAAkBlsC,EAC5CgsC,EAAgBvf,EAChBwf,EAAmB,EACnBH,EAAmBN,EAAeU,EAAkBT,CAErD,KAAO,CAGN,IAAMS,GACHhL,EAAKmK,EAAcvL,GAAmBuL,EACnCziB,EAAUsjB,EAAkB,KAAK,GAAO,EAC9CH,EAAWR,EAAa9e,EAAS,KAAK,IAAK7D,CAAM,EACjDojB,EAAgBvf,EAAS,KAAK,IAAK7D,CAAM,EACzCqjB,EAAmBxf,EAAS,KAAK,IAAK7D,CAAM,EAC5CkjB,EACCN,EAAeC,EAAqBS,EAAkBV,CAExD,CAEA,IAAMtjB,EAAI,KAAK,IAAK,EAAG,KAAK,IAAK,EAAG4jB,EAAmBJ,CAAe,CAAE,EAKpES,EAAU,EAETjL,IAAO,EAEXiL,EAAU,GAAMb,EAELpK,IAAOyK,IAElBQ,EAAU,IAAOb,GAIlB,QAAUnK,EAAK,EAAGA,GAAMmK,EAAgBnK,IAAQ,CAE/C,IAAM3xC,EAAI2xC,EAAKmK,EACThjB,EAAQ94B,EAAI,KAAK,GAAK,EAEtB48C,EAAW,KAAK,IAAK9jB,CAAM,EAC3B+jB,EAAW,KAAK,IAAK/jB,CAAM,EAIjCujB,EAAO,EAAI,CAAEG,EAAgBK,EAC7BR,EAAO,EAAIE,EACXF,EAAO,EAAIG,EAAgBI,EAC3B/xC,EAAS,KAAMwxC,EAAO,EAAGA,EAAO,EAAGA,EAAO,CAAE,EAI5Cn9C,EAAO,IACN,CAAEs9C,EAAgBK,EAClBJ,EACAD,EAAgBI,CACjB,EACA19C,EAAO,UAAU,EACjB8vC,EAAQ,KAAM9vC,EAAO,EAAGA,EAAO,EAAGA,EAAO,CAAE,EAI3CuxC,EAAI,KAAMzwC,EAAI28C,EAASjkB,CAAE,CAE1B,CAEA,GAAKgZ,EAAK,EAAI,CAEb,IAAMoL,GAAiBpL,EAAK,GAAM0K,EAClC,QAAUzK,EAAK,EAAGA,EAAKmK,EAAgBnK,IAAQ,CAE9C,IAAMxG,EAAK2R,EAAenL,EACpBvG,EAAK0R,EAAenL,EAAK,EACzBtG,EAAKqG,EAAK0K,EAAiBzK,EAC3BoL,EAAKrL,EAAK0K,EAAiBzK,EAAK,EAEtCzC,EAAQ,KAAM/D,EAAIC,EAAIC,CAAG,EACzB6D,EAAQ,KAAM9D,EAAI2R,EAAI1R,CAAG,CAE1B,CAED,CAED,CAIA,KAAK,SAAU6D,CAAQ,EACvB,KAAK,aAAc,WAAY,IAAIprB,GAAwBjZ,EAAU,CAAE,CAAE,EACzE,KAAK,aAAc,SAAU,IAAIiZ,GAAwBkrB,EAAS,CAAE,CAAE,EACtE,KAAK,aAAc,KAAM,IAAIlrB,GAAwB2sB,EAAK,CAAE,CAAE,CAE/D,CAEA,KAAMvP,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,WAAa,OAAO,OAAQ,CAAC,EAAGA,EAAO,UAAW,EAEhD,IAER,CASA,OAAO,SAAU18B,EAAO,CAEvB,OAAO,IAAIo3C,EAAiBp3C,EAAK,OAAQA,EAAK,OAAQA,EAAK,YAAaA,EAAK,eAAgBA,EAAK,cAAe,CAElH,CAED,EAoBMsnB,GAAN,MAAMkxB,UAAuB14B,EAAe,CAW3C,YAAa2Y,EAAS,EAAGggB,EAAW,GAAIC,EAAa,EAAGC,EAAc,KAAK,GAAK,EAAI,CAEnF,MAAM,EAEN,KAAK,KAAO,iBASZ,KAAK,WAAa,CACjB,OAAQlgB,EACR,SAAUggB,EACV,WAAYC,EACZ,YAAaC,CACd,EAEAF,EAAW,KAAK,IAAK,EAAGA,CAAS,EAIjC,IAAM/N,EAAU,CAAC,EACXrkC,EAAW,CAAC,EACZmkC,EAAU,CAAC,EACXyB,EAAM,CAAC,EAIP4L,EAAS,IAAI58C,EACbT,EAAK,IAAIW,GAIfkL,EAAS,KAAM,EAAG,EAAG,CAAE,EACvBmkC,EAAQ,KAAM,EAAG,EAAG,CAAE,EACtByB,EAAI,KAAM,GAAK,EAAI,EAEnB,QAAU13C,EAAI,EAAGhE,EAAI,EAAGgE,GAAKkkD,EAAUlkD,IAAMhE,GAAK,EAAI,CAErD,IAAMqoD,EAAUF,EAAankD,EAAIkkD,EAAWE,EAI5Cd,EAAO,EAAIpf,EAAS,KAAK,IAAKmgB,CAAQ,EACtCf,EAAO,EAAIpf,EAAS,KAAK,IAAKmgB,CAAQ,EAEtCvyC,EAAS,KAAMwxC,EAAO,EAAGA,EAAO,EAAGA,EAAO,CAAE,EAI5CrN,EAAQ,KAAM,EAAG,EAAG,CAAE,EAItBhwC,EAAG,GAAM6L,EAAU9V,CAAE,EAAIkoC,EAAS,GAAM,EACxCj+B,EAAG,GAAM6L,EAAU9V,EAAI,CAAE,EAAIkoC,EAAS,GAAM,EAE5CwT,EAAI,KAAMzxC,EAAG,EAAGA,EAAG,CAAE,CAEtB,CAIA,QAAUjK,EAAI,EAAGA,GAAKkoD,EAAUloD,IAE/Bm6C,EAAQ,KAAMn6C,EAAGA,EAAI,EAAG,CAAE,EAM3B,KAAK,SAAUm6C,CAAQ,EACvB,KAAK,aAAc,WAAY,IAAIprB,GAAwBjZ,EAAU,CAAE,CAAE,EACzE,KAAK,aAAc,SAAU,IAAIiZ,GAAwBkrB,EAAS,CAAE,CAAE,EACtE,KAAK,aAAc,KAAM,IAAIlrB,GAAwB2sB,EAAK,CAAE,CAAE,CAE/D,CAEA,KAAMvP,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,WAAa,OAAO,OAAQ,CAAC,EAAGA,EAAO,UAAW,EAEhD,IAER,CASA,OAAO,SAAU18B,EAAO,CAEvB,OAAO,IAAIw4C,EAAgBx4C,EAAK,OAAQA,EAAK,SAAUA,EAAK,WAAYA,EAAK,WAAY,CAE1F,CAED,EAeMunB,GAAN,MAAMsxB,UAAyB/4B,EAAe,CAe7C,YAAag5B,EAAY,EAAGC,EAAe,EAAG/sC,EAAS,EAAGsrC,EAAiB,GAAIxL,EAAiB,EAAGkN,EAAY,GAAON,EAAa,EAAGC,EAAc,KAAK,GAAK,EAAI,CAEjK,MAAM,EAEN,KAAK,KAAO,mBASZ,KAAK,WAAa,CACjB,UAAWG,EACX,aAAcC,EACd,OAAQ/sC,EACR,eAAgBsrC,EAChB,eAAgBxL,EAChB,UAAWkN,EACX,WAAYN,EACZ,YAAaC,CACd,EAEA,IAAM3M,EAAQ,KAEdsL,EAAiB,KAAK,MAAOA,CAAe,EAC5CxL,EAAiB,KAAK,MAAOA,CAAe,EAI5C,IAAMpB,EAAU,CAAC,EACXrkC,EAAW,CAAC,EACZmkC,EAAU,CAAC,EACXyB,EAAM,CAAC,EAITtuC,EAAQ,EACNm3C,EAAa,CAAC,EACdyC,EAAavrC,EAAS,EACxBmgC,EAAa,EAIjB8M,EAAc,EAETD,IAAc,KAEbF,EAAY,GAAII,EAAa,EAAK,EAClCH,EAAe,GAAIG,EAAa,EAAM,GAM5C,KAAK,SAAUxO,CAAQ,EACvB,KAAK,aAAc,WAAY,IAAIprB,GAAwBjZ,EAAU,CAAE,CAAE,EACzE,KAAK,aAAc,SAAU,IAAIiZ,GAAwBkrB,EAAS,CAAE,CAAE,EACtE,KAAK,aAAc,KAAM,IAAIlrB,GAAwB2sB,EAAK,CAAE,CAAE,EAE9D,SAASgN,GAAgB,CAExB,IAAMv+C,EAAS,IAAIO,EACb48C,EAAS,IAAI58C,EAEfgyC,EAAa,EAGXkM,GAAUJ,EAAeD,GAAc9sC,EAI7C,QAAUzY,EAAI,EAAGA,GAAKu4C,EAAgBv4C,IAAO,CAE5C,IAAM6lD,EAAW,CAAC,EAEZllB,EAAI3gC,EAAIu4C,EAIRrT,EAASvE,GAAM6kB,EAAeD,GAAcA,EAElD,QAAU7lD,EAAI,EAAGA,GAAKqkD,EAAgBrkD,IAAO,CAE5C,IAAMuI,EAAIvI,EAAIqkD,EAERhjB,EAAQ94B,EAAIm9C,EAAcD,EAE1BN,EAAW,KAAK,IAAK9jB,CAAM,EAC3B+jB,EAAW,KAAK,IAAK/jB,CAAM,EAIjCujB,EAAO,EAAIpf,EAAS2f,EACpBP,EAAO,EAAI,CAAE3jB,EAAIloB,EAASurC,EAC1BM,EAAO,EAAIpf,EAAS4f,EACpBhyC,EAAS,KAAMwxC,EAAO,EAAGA,EAAO,EAAGA,EAAO,CAAE,EAI5Cn9C,EAAO,IAAK09C,EAAUe,EAAOd,CAAS,EAAE,UAAU,EAClD7N,EAAQ,KAAM9vC,EAAO,EAAGA,EAAO,EAAGA,EAAO,CAAE,EAI3CuxC,EAAI,KAAMzwC,EAAG,EAAI04B,CAAE,EAInBklB,EAAS,KAAMz7C,GAAS,CAEzB,CAIAm3C,EAAW,KAAMsE,CAAS,CAE3B,CAIA,QAAUnmD,EAAI,EAAGA,EAAIqkD,EAAgBrkD,IAEpC,QAAUM,EAAI,EAAGA,EAAIu4C,EAAgBv4C,IAAO,CAI3C,IAAM8B,EAAIy/C,EAAYvhD,CAAE,EAAGN,CAAE,EACvBqC,EAAIw/C,EAAYvhD,EAAI,CAAE,EAAGN,CAAE,EAC3BsC,EAAIu/C,EAAYvhD,EAAI,CAAE,EAAGN,EAAI,CAAE,EAC/BgoC,EAAI6Z,EAAYvhD,CAAE,EAAGN,EAAI,CAAE,GAI5B6lD,EAAY,GAAKvlD,IAAM,KAE3Bm3C,EAAQ,KAAMr1C,EAAGC,EAAG2lC,CAAE,EACtBgS,GAAc,IAIV8L,EAAe,GAAKxlD,IAAMu4C,EAAiB,KAE/CpB,EAAQ,KAAMp1C,EAAGC,EAAG0lC,CAAE,EACtBgS,GAAc,EAIhB,CAMDjB,EAAM,SAAUG,EAAYc,EAAY,CAAE,EAI1Cd,GAAcc,CAEf,CAEA,SAASiM,EAAarV,EAAM,CAG3B,IAAMwV,EAAmB17C,EAEnBnD,EAAK,IAAIW,GACT08C,EAAS,IAAI58C,EAEfgyC,EAAa,EAEXxU,EAAWoL,IAAQ,GAASiV,EAAYC,EACxCzzC,EAASu+B,IAAQ,GAAS,EAAI,GAMpC,QAAU5wC,EAAI,EAAGA,GAAKqkD,EAAgBrkD,IAIrCoT,EAAS,KAAM,EAAGkxC,EAAajyC,EAAM,CAAE,EAIvCklC,EAAQ,KAAM,EAAGllC,EAAM,CAAE,EAIzB2mC,EAAI,KAAM,GAAK,EAAI,EAInBtuC,IAKD,IAAM27C,EAAiB37C,EAIvB,QAAU1K,EAAI,EAAGA,GAAKqkD,EAAgBrkD,IAAO,CAG5C,IAAMqhC,EADIrhC,EAAIqkD,EACIqB,EAAcD,EAE1BL,EAAW,KAAK,IAAK/jB,CAAM,EAC3B8jB,EAAW,KAAK,IAAK9jB,CAAM,EAIjCujB,EAAO,EAAIpf,EAAS2f,EACpBP,EAAO,EAAIN,EAAajyC,EACxBuyC,EAAO,EAAIpf,EAAS4f,EACpBhyC,EAAS,KAAMwxC,EAAO,EAAGA,EAAO,EAAGA,EAAO,CAAE,EAI5CrN,EAAQ,KAAM,EAAGllC,EAAM,CAAE,EAIzB9K,EAAG,EAAM69C,EAAW,GAAQ,GAC5B79C,EAAG,EAAM49C,EAAW,GAAM9yC,EAAS,GACnC2mC,EAAI,KAAMzxC,EAAG,EAAGA,EAAG,CAAE,EAIrBmD,GAED,CAIA,QAAU1K,EAAI,EAAGA,EAAIqkD,EAAgBrkD,IAAO,CAE3C,IAAMsC,EAAI8jD,EAAmBpmD,EACvB1C,EAAI+oD,EAAiBrmD,EAEtB4wC,IAAQ,GAIZ6G,EAAQ,KAAMn6C,EAAGA,EAAI,EAAGgF,CAAE,EAM1Bm1C,EAAQ,KAAMn6C,EAAI,EAAGA,EAAGgF,CAAE,EAI3B03C,GAAc,CAEf,CAIAjB,EAAM,SAAUG,EAAYc,EAAYpJ,IAAQ,GAAO,EAAI,CAAE,EAI7DsI,GAAcc,CAEf,CAED,CAEA,KAAMvQ,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,WAAa,OAAO,OAAQ,CAAC,EAAGA,EAAO,UAAW,EAEhD,IAER,CASA,OAAO,SAAU18B,EAAO,CAEvB,OAAO,IAAI64C,EAAkB74C,EAAK,UAAWA,EAAK,aAAcA,EAAK,OAAQA,EAAK,eAAgBA,EAAK,eAAgBA,EAAK,UAAWA,EAAK,WAAYA,EAAK,WAAY,CAE1K,CAED,EAeMwnB,GAAN,MAAM+xB,UAAqBhyB,EAAiB,CAc3C,YAAakR,EAAS,EAAGzsB,EAAS,EAAGsrC,EAAiB,GAAIxL,EAAiB,EAAGkN,EAAY,GAAON,EAAa,EAAGC,EAAc,KAAK,GAAK,EAAI,CAE5I,MAAO,EAAGlgB,EAAQzsB,EAAQsrC,EAAgBxL,EAAgBkN,EAAWN,EAAYC,CAAY,EAE7F,KAAK,KAAO,eASZ,KAAK,WAAa,CACjB,OAAQlgB,EACR,OAAQzsB,EACR,eAAgBsrC,EAChB,eAAgBxL,EAChB,UAAWkN,EACX,WAAYN,EACZ,YAAaC,CACd,CAED,CASA,OAAO,SAAU34C,EAAO,CAEvB,OAAO,IAAIu5C,EAAcv5C,EAAK,OAAQA,EAAK,OAAQA,EAAK,eAAgBA,EAAK,eAAgBA,EAAK,UAAWA,EAAK,WAAYA,EAAK,WAAY,CAEhJ,CAED,EASMynB,GAAN,MAAM+xB,UAA2B15B,EAAe,CAU/C,YAAazZ,EAAW,CAAC,EAAGqkC,EAAU,CAAC,EAAGjS,EAAS,EAAGghB,EAAS,EAAI,CAElE,MAAM,EAEN,KAAK,KAAO,qBASZ,KAAK,WAAa,CACjB,SAAUpzC,EACV,QAASqkC,EACT,OAAQjS,EACR,OAAQghB,CACT,EAIA,IAAMC,EAAe,CAAC,EAChBC,EAAW,CAAC,EAIlBC,EAAWH,CAAO,EAIlBI,EAAaphB,CAAO,EAIpBqhB,EAAY,EAIZ,KAAK,aAAc,WAAY,IAAIx6B,GAAwBo6B,EAAc,CAAE,CAAE,EAC7E,KAAK,aAAc,SAAU,IAAIp6B,GAAwBo6B,EAAa,MAAM,EAAG,CAAE,CAAE,EACnF,KAAK,aAAc,KAAM,IAAIp6B,GAAwBq6B,EAAU,CAAE,CAAE,EAE9DF,IAAW,EAEf,KAAK,qBAAqB,EAI1B,KAAK,iBAAiB,EAMvB,SAASG,EAAWH,EAAS,CAE5B,IAAMpkD,EAAI,IAAI4F,EACR3F,EAAI,IAAI2F,EACR1F,EAAI,IAAI0F,EAId,QAAU1K,EAAI,EAAGA,EAAIm6C,EAAQ,OAAQn6C,GAAK,EAIzCwpD,EAAkBrP,EAASn6C,EAAI,CAAE,EAAG8E,CAAE,EACtC0kD,EAAkBrP,EAASn6C,EAAI,CAAE,EAAG+E,CAAE,EACtCykD,EAAkBrP,EAASn6C,EAAI,CAAE,EAAGgF,CAAE,EAItCykD,EAAe3kD,EAAGC,EAAGC,EAAGkkD,CAAO,CAIjC,CAEA,SAASO,EAAe3kD,EAAGC,EAAGC,EAAGkkD,EAAS,CAEzC,IAAMQ,EAAOR,EAAS,EAIhBvlB,EAAI,CAAC,EAIX,QAAU3jC,EAAI,EAAGA,GAAK0pD,EAAM1pD,IAAO,CAElC2jC,EAAG3jC,CAAE,EAAI,CAAC,EAEV,IAAM2pD,EAAK7kD,EAAE,MAAM,EAAE,KAAME,EAAGhF,EAAI0pD,CAAK,EACjCE,EAAK7kD,EAAE,MAAM,EAAE,KAAMC,EAAGhF,EAAI0pD,CAAK,EAEjCG,EAAOH,EAAO1pD,EAEpB,QAAU4H,EAAI,EAAGA,GAAKiiD,EAAMjiD,IAEtBA,IAAM,GAAK5H,IAAM0pD,EAErB/lB,EAAG3jC,CAAE,EAAG4H,CAAE,EAAI+hD,EAIdhmB,EAAG3jC,CAAE,EAAG4H,CAAE,EAAI+hD,EAAG,MAAM,EAAE,KAAMC,EAAIhiD,EAAIiiD,CAAK,CAM/C,CAIA,QAAU7pD,EAAI,EAAGA,EAAI0pD,EAAM1pD,IAE1B,QAAU4H,EAAI,EAAGA,EAAI,GAAM8hD,EAAO1pD,GAAM,EAAG4H,IAAO,CAEjD,IAAMmH,EAAI,KAAK,MAAOnH,EAAI,CAAE,EAEvBA,EAAI,IAAM,GAEdkiD,EAAYnmB,EAAG3jC,CAAE,EAAG+O,EAAI,CAAE,CAAE,EAC5B+6C,EAAYnmB,EAAG3jC,EAAI,CAAE,EAAG+O,CAAE,CAAE,EAC5B+6C,EAAYnmB,EAAG3jC,CAAE,EAAG+O,CAAE,CAAE,IAIxB+6C,EAAYnmB,EAAG3jC,CAAE,EAAG+O,EAAI,CAAE,CAAE,EAC5B+6C,EAAYnmB,EAAG3jC,EAAI,CAAE,EAAG+O,EAAI,CAAE,CAAE,EAChC+6C,EAAYnmB,EAAG3jC,EAAI,CAAE,EAAG+O,CAAE,CAAE,EAI9B,CAIF,CAEA,SAASu6C,EAAaphB,EAAS,CAE9B,IAAMof,EAAS,IAAI58C,EAInB,QAAU1K,EAAI,EAAGA,EAAImpD,EAAa,OAAQnpD,GAAK,EAE9CsnD,EAAO,EAAI6B,EAAcnpD,EAAI,CAAE,EAC/BsnD,EAAO,EAAI6B,EAAcnpD,EAAI,CAAE,EAC/BsnD,EAAO,EAAI6B,EAAcnpD,EAAI,CAAE,EAE/BsnD,EAAO,UAAU,EAAE,eAAgBpf,CAAO,EAE1CihB,EAAcnpD,EAAI,CAAE,EAAIsnD,EAAO,EAC/B6B,EAAcnpD,EAAI,CAAE,EAAIsnD,EAAO,EAC/B6B,EAAcnpD,EAAI,CAAE,EAAIsnD,EAAO,CAIjC,CAEA,SAASiC,GAAc,CAEtB,IAAMjC,EAAS,IAAI58C,EAEnB,QAAU1K,EAAI,EAAGA,EAAImpD,EAAa,OAAQnpD,GAAK,EAAI,CAElDsnD,EAAO,EAAI6B,EAAcnpD,EAAI,CAAE,EAC/BsnD,EAAO,EAAI6B,EAAcnpD,EAAI,CAAE,EAC/BsnD,EAAO,EAAI6B,EAAcnpD,EAAI,CAAE,EAE/B,IAAMiL,EAAI8+C,EAASzC,CAAO,EAAI,EAAI,KAAK,GAAK,GACtC3jB,EAAIqmB,EAAa1C,CAAO,EAAI,KAAK,GAAK,GAC5C8B,EAAS,KAAMn+C,EAAG,EAAI04B,CAAE,CAEzB,CAEAsmB,EAAW,EAEXC,EAAY,CAEb,CAEA,SAASA,GAAc,CAItB,QAAUlqD,EAAI,EAAGA,EAAIopD,EAAS,OAAQppD,GAAK,EAAI,CAI9C,IAAMgO,EAAKo7C,EAAUppD,EAAI,CAAE,EACrBiO,EAAKm7C,EAAUppD,EAAI,CAAE,EACrBoO,EAAKg7C,EAAUppD,EAAI,CAAE,EAErBqC,EAAM,KAAK,IAAK2L,EAAIC,EAAIG,CAAG,EAC3BhM,EAAM,KAAK,IAAK4L,EAAIC,EAAIG,CAAG,EAI5B/L,EAAM,IAAOD,EAAM,KAElB4L,EAAK,KAAMo7C,EAAUppD,EAAI,CAAE,GAAK,GAChCiO,EAAK,KAAMm7C,EAAUppD,EAAI,CAAE,GAAK,GAChCoO,EAAK,KAAMg7C,EAAUppD,EAAI,CAAE,GAAK,GAIvC,CAED,CAEA,SAAS8pD,EAAYxC,EAAS,CAE7B6B,EAAa,KAAM7B,EAAO,EAAGA,EAAO,EAAGA,EAAO,CAAE,CAEjD,CAEA,SAASkC,EAAkBp8C,EAAOk6C,EAAS,CAE1C,IAAMvwC,EAAS3J,EAAQ,EAEvBk6C,EAAO,EAAIxxC,EAAUiB,EAAS,CAAE,EAChCuwC,EAAO,EAAIxxC,EAAUiB,EAAS,CAAE,EAChCuwC,EAAO,EAAIxxC,EAAUiB,EAAS,CAAE,CAEjC,CAEA,SAASkzC,GAAa,CAErB,IAAMnlD,EAAI,IAAI4F,EACR3F,EAAI,IAAI2F,EACR1F,EAAI,IAAI0F,EAERy/C,EAAW,IAAIz/C,EAEfuuC,EAAM,IAAIruC,GACVsuC,EAAM,IAAItuC,GACVuuC,EAAM,IAAIvuC,GAEhB,QAAU5K,EAAI,EAAG4H,EAAI,EAAG5H,EAAImpD,EAAa,OAAQnpD,GAAK,EAAG4H,GAAK,EAAI,CAEjE9C,EAAE,IAAKqkD,EAAcnpD,EAAI,CAAE,EAAGmpD,EAAcnpD,EAAI,CAAE,EAAGmpD,EAAcnpD,EAAI,CAAE,CAAE,EAC3E+E,EAAE,IAAKokD,EAAcnpD,EAAI,CAAE,EAAGmpD,EAAcnpD,EAAI,CAAE,EAAGmpD,EAAcnpD,EAAI,CAAE,CAAE,EAC3EgF,EAAE,IAAKmkD,EAAcnpD,EAAI,CAAE,EAAGmpD,EAAcnpD,EAAI,CAAE,EAAGmpD,EAAcnpD,EAAI,CAAE,CAAE,EAE3Ei5C,EAAI,IAAKmQ,EAAUxhD,EAAI,CAAE,EAAGwhD,EAAUxhD,EAAI,CAAE,CAAE,EAC9CsxC,EAAI,IAAKkQ,EAAUxhD,EAAI,CAAE,EAAGwhD,EAAUxhD,EAAI,CAAE,CAAE,EAC9CuxC,EAAI,IAAKiQ,EAAUxhD,EAAI,CAAE,EAAGwhD,EAAUxhD,EAAI,CAAE,CAAE,EAE9CuiD,EAAS,KAAMrlD,CAAE,EAAE,IAAKC,CAAE,EAAE,IAAKC,CAAE,EAAE,aAAc,CAAE,EAErD,IAAMolD,EAAML,EAASI,CAAS,EAE9BE,EAAWpR,EAAKrxC,EAAI,EAAG9C,EAAGslD,CAAI,EAC9BC,EAAWnR,EAAKtxC,EAAI,EAAG7C,EAAGqlD,CAAI,EAC9BC,EAAWlR,EAAKvxC,EAAI,EAAG5C,EAAGolD,CAAI,CAE/B,CAED,CAEA,SAASC,EAAWpgD,EAAI8M,EAAQs2B,EAAQ0c,EAAU,CAE1CA,EAAU,GAAS9/C,EAAG,IAAM,IAElCm/C,EAAUryC,CAAO,EAAI9M,EAAG,EAAI,GAItBojC,EAAO,IAAM,GAASA,EAAO,IAAM,IAEzC+b,EAAUryC,CAAO,EAAIgzC,EAAU,EAAI,KAAK,GAAK,GAI/C,CAIA,SAASA,EAAS1c,EAAS,CAE1B,OAAO,KAAK,MAAOA,EAAO,EAAG,CAAEA,EAAO,CAAE,CAEzC,CAKA,SAAS2c,EAAa3c,EAAS,CAE9B,OAAO,KAAK,MAAO,CAAEA,EAAO,EAAG,KAAK,KAAQA,EAAO,EAAIA,EAAO,EAAQA,EAAO,EAAIA,EAAO,CAAI,CAAE,CAE/F,CAED,CAEA,KAAMlB,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,WAAa,OAAO,OAAQ,CAAC,EAAGA,EAAO,UAAW,EAEhD,IAER,CASA,OAAO,SAAU18B,EAAO,CAEvB,OAAO,IAAIw5C,EAAoBx5C,EAAK,SAAUA,EAAK,QAASA,EAAK,OAAQA,EAAK,MAAO,CAEtF,CAED,EAeM0nB,GAAN,MAAMmzB,UAA6BpzB,EAAmB,CAQrD,YAAagR,EAAS,EAAGghB,EAAS,EAAI,CAErC,IAAMhlD,GAAM,EAAI,KAAK,KAAM,CAAE,GAAM,EAC7B,EAAI,EAAIA,EAER4R,EAAW,CAGhB,GAAI,GAAI,GAAI,GAAI,GAAI,EACpB,GAAI,EAAG,GAAI,GAAI,EAAG,EAClB,EAAG,GAAI,GAAI,EAAG,GAAI,EAClB,EAAG,EAAG,GAAI,EAAG,EAAG,EAGhB,EAAG,CAAE,EAAG,CAAE5R,EAAG,EAAG,CAAE,EAAGA,EACrB,EAAG,EAAG,CAAEA,EAAG,EAAG,EAAGA,EAGjB,CAAE,EAAG,CAAEA,EAAG,EAAG,CAAE,EAAGA,EAAG,EACrB,EAAG,CAAEA,EAAG,EAAG,EAAGA,EAAG,EAGjB,CAAEA,EAAG,EAAG,CAAE,EAAGA,EAAG,EAAG,CAAE,EACrB,CAAEA,EAAG,EAAG,EAAGA,EAAG,EAAG,CAClB,EAEMi2C,EAAU,CACf,EAAG,GAAI,EAAI,EAAG,EAAG,GAAK,EAAG,GAAI,GAC7B,EAAG,GAAI,GAAK,EAAG,GAAI,EAAI,EAAG,EAAG,GAC7B,GAAI,EAAG,EAAI,GAAI,EAAG,GAAK,GAAI,GAAI,EAC/B,EAAG,EAAG,GAAK,EAAG,GAAI,EAAI,EAAG,EAAG,GAC5B,EAAG,GAAI,EAAI,EAAG,EAAG,GAAK,EAAG,GAAI,GAC7B,EAAG,GAAI,EAAI,EAAG,EAAG,GAAK,EAAG,GAAI,GAC7B,EAAG,GAAI,GAAK,EAAG,GAAI,EAAI,EAAG,EAAG,GAC7B,GAAI,EAAG,EAAI,GAAI,EAAG,GAAK,GAAI,GAAI,EAC/B,EAAG,GAAI,GAAK,EAAG,GAAI,EAAI,EAAG,EAAG,EAC7B,GAAI,EAAG,EAAI,GAAI,EAAG,GAAK,GAAI,GAAI,EAC/B,GAAI,EAAG,GAAK,GAAI,GAAI,EAAI,GAAI,EAAG,GAC/B,EAAG,GAAI,GAAK,EAAG,GAAI,EAAI,EAAG,EAAG,CAC9B,EAEA,MAAOrkC,EAAUqkC,EAASjS,EAAQghB,CAAO,EAEzC,KAAK,KAAO,uBASZ,KAAK,WAAa,CACjB,OAAQhhB,EACR,OAAQghB,CACT,CAED,CASA,OAAO,SAAUz5C,EAAO,CAEvB,OAAO,IAAI66C,EAAsB76C,EAAK,OAAQA,EAAK,MAAO,CAE3D,CAED,EAEM2nB,GAAoB,IAAI1sB,EACxB2sB,GAAsB,IAAI3sB,EAC1B4sB,GAAwB,IAAI5sB,EAC5B6sB,GAA0B,IAAI5sB,GAgB9B6sB,GAAN,cAA4BjI,EAAe,CAS1C,YAAa3U,EAAW,KAAM2vC,EAAiB,EAAI,CAkBlD,GAhBA,MAAM,EAEN,KAAK,KAAO,gBASZ,KAAK,WAAa,CACjB,SAAU3vC,EACV,eAAgB2vC,CACjB,EAEK3vC,IAAa,KAAO,CAGxB,IAAM4vC,EAAY,KAAK,IAAK,GAAI,CAAgB,EAC1CC,EAAe,KAAK,IAAKpmD,GAAUkmD,CAAe,EAElDG,EAAY9vC,EAAS,SAAS,EAC9B+vC,EAAe/vC,EAAS,aAAc,UAAW,EACjDgwC,EAAaF,EAAYA,EAAU,MAAQC,EAAa,MAExDE,EAAW,CAAE,EAAG,EAAG,CAAE,EACrBC,EAAW,CAAE,IAAK,IAAK,GAAI,EAC3BC,EAAS,IAAI,MAAO,CAAE,EAEtBC,EAAW,CAAC,EACZl1C,EAAW,CAAC,EAClB,QAAU9V,EAAI,EAAGA,EAAI4qD,EAAY5qD,GAAK,EAAI,CAEpC0qD,GAEJG,EAAU,CAAE,EAAIH,EAAU,KAAM1qD,CAAE,EAClC6qD,EAAU,CAAE,EAAIH,EAAU,KAAM1qD,EAAI,CAAE,EACtC6qD,EAAU,CAAE,EAAIH,EAAU,KAAM1qD,EAAI,CAAE,IAItC6qD,EAAU,CAAE,EAAI7qD,EAChB6qD,EAAU,CAAE,EAAI7qD,EAAI,EACpB6qD,EAAU,CAAE,EAAI7qD,EAAI,GAIrB,GAAM,CAAE,EAAA8E,EAAG,EAAAC,EAAG,EAAAC,CAAE,EAAIuyB,GAYpB,GAXAzyB,EAAE,oBAAqB6lD,EAAcE,EAAU,CAAE,CAAE,EACnD9lD,EAAE,oBAAqB4lD,EAAcE,EAAU,CAAE,CAAE,EACnD7lD,EAAE,oBAAqB2lD,EAAcE,EAAU,CAAE,CAAE,EACnDtzB,GAAU,UAAWD,EAAQ,EAG7ByzB,EAAQ,CAAE,EAAI,GAAI,KAAK,MAAOjmD,EAAE,EAAI0lD,CAAU,CAAE,IAAK,KAAK,MAAO1lD,EAAE,EAAI0lD,CAAU,CAAE,IAAK,KAAK,MAAO1lD,EAAE,EAAI0lD,CAAU,CAAE,GACtHO,EAAQ,CAAE,EAAI,GAAI,KAAK,MAAOhmD,EAAE,EAAIylD,CAAU,CAAE,IAAK,KAAK,MAAOzlD,EAAE,EAAIylD,CAAU,CAAE,IAAK,KAAK,MAAOzlD,EAAE,EAAIylD,CAAU,CAAE,GACtHO,EAAQ,CAAE,EAAI,GAAI,KAAK,MAAO/lD,EAAE,EAAIwlD,CAAU,CAAE,IAAK,KAAK,MAAOxlD,EAAE,EAAIwlD,CAAU,CAAE,IAAK,KAAK,MAAOxlD,EAAE,EAAIwlD,CAAU,CAAE,GAGjH,EAAAO,EAAQ,CAAE,IAAMA,EAAQ,CAAE,GAAKA,EAAQ,CAAE,IAAMA,EAAQ,CAAE,GAAKA,EAAQ,CAAE,IAAMA,EAAQ,CAAE,GAO7F,QAAUnjD,EAAI,EAAGA,EAAI,EAAGA,IAAO,CAG9B,IAAMqjD,GAAUrjD,EAAI,GAAM,EACpBsjD,EAAWH,EAAQnjD,CAAE,EACrBujD,EAAWJ,EAAQE,CAAM,EACzBzjD,EAAK+vB,GAAWuzB,EAAUljD,CAAE,CAAE,EAC9BH,EAAK8vB,GAAWuzB,EAAUG,CAAM,CAAE,EAElCG,EAAO,GAAIF,CAAS,IAAKC,CAAS,GAClCE,EAAc,GAAIF,CAAS,IAAKD,CAAS,GAE1CG,KAAeL,GAAYA,EAAUK,CAAY,GAIhD/zB,GAAQ,IAAK0zB,EAAUK,CAAY,EAAE,MAAO,GAAKZ,IAErD30C,EAAS,KAAMtO,EAAG,EAAGA,EAAG,EAAGA,EAAG,CAAE,EAChCsO,EAAS,KAAMrO,EAAG,EAAGA,EAAG,EAAGA,EAAG,CAAE,GAIjCujD,EAAUK,CAAY,EAAI,MAEXD,KAAQJ,IAGvBA,EAAUI,CAAK,EAAI,CAElB,OAAQP,EAAUjjD,CAAE,EACpB,OAAQijD,EAAUI,CAAM,EACxB,OAAQ3zB,GAAQ,MAAM,CAEvB,EAIF,CAED,CAGA,QAAYhgB,KAAO0zC,EAElB,GAAKA,EAAU1zC,CAAI,EAAI,CAEtB,GAAM,CAAE,OAAAg0C,EAAQ,OAAA3T,CAAO,EAAIqT,EAAU1zC,CAAI,EACzC8f,GAAI,oBAAqBuzB,EAAcW,CAAO,EAC9Cj0B,GAAM,oBAAqBszB,EAAchT,CAAO,EAEhD7hC,EAAS,KAAMshB,GAAI,EAAGA,GAAI,EAAGA,GAAI,CAAE,EACnCthB,EAAS,KAAMuhB,GAAM,EAAGA,GAAM,EAAGA,GAAM,CAAE,CAE1C,CAID,KAAK,aAAc,WAAY,IAAItI,GAAwBjZ,EAAU,CAAE,CAAE,CAE1E,CAED,CAEA,KAAMq2B,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,WAAa,OAAO,OAAQ,CAAC,EAAGA,EAAO,UAAW,EAEhD,IAER,CAED,EAQM1U,GAAN,KAAY,CAKX,aAAc,CASb,KAAK,KAAO,QAWZ,KAAK,mBAAqB,IAQ1B,KAAK,YAAc,GASnB,KAAK,gBAAkB,IAExB,CAWA,UAAoC,CAEnCx2B,GAAM,qCAAsC,CAE7C,CAWA,WAAYgK,EAAGsgD,EAAiB,CAE/B,IAAMrnD,EAAI,KAAK,eAAgB+G,CAAE,EACjC,OAAO,KAAK,SAAU/G,EAAGqnD,CAAe,CAEzC,CASA,UAAWC,EAAY,EAAI,CAE1B,IAAM71C,EAAS,CAAC,EAEhB,QAAU+0B,EAAI,EAAGA,GAAK8gB,EAAW9gB,IAEhC/0B,EAAO,KAAM,KAAK,SAAU+0B,EAAI8gB,CAAU,CAAE,EAI7C,OAAO71C,CAER,CAYA,gBAAiB61C,EAAY,EAAI,CAEhC,IAAM71C,EAAS,CAAC,EAEhB,QAAU+0B,EAAI,EAAGA,GAAK8gB,EAAW9gB,IAEhC/0B,EAAO,KAAM,KAAK,WAAY+0B,EAAI8gB,CAAU,CAAE,EAI/C,OAAO71C,CAER,CAOA,WAAY,CAEX,IAAM81C,EAAU,KAAK,WAAW,EAChC,OAAOA,EAASA,EAAQ,OAAS,CAAE,CAEpC,CAQA,WAAYD,EAAY,KAAK,mBAAqB,CAEjD,GAAK,KAAK,iBACP,KAAK,gBAAgB,SAAWA,EAAY,GAC9C,CAAE,KAAK,YAEP,OAAO,KAAK,gBAIb,KAAK,YAAc,GAEnB,IAAMjW,EAAQ,CAAC,EACX1I,EAASl8B,EAAO,KAAK,SAAU,CAAE,EACjC8E,EAAM,EAEV8/B,EAAM,KAAM,CAAE,EAEd,QAAUptC,EAAI,EAAGA,GAAKqjD,EAAWrjD,IAEhC0kC,EAAU,KAAK,SAAU1kC,EAAIqjD,CAAU,EACvC/1C,GAAOo3B,EAAQ,WAAYl8B,CAAK,EAChC4kC,EAAM,KAAM9/B,CAAI,EAChB9E,EAAOk8B,EAIR,YAAK,gBAAkB0I,EAEhBA,CAER,CAQA,kBAAmB,CAElB,KAAK,YAAc,GACnB,KAAK,WAAW,CAEjB,CAWA,eAAgBtqC,EAAGlB,EAAW,KAAO,CAEpC,IAAM2hD,EAAa,KAAK,WAAW,EAE/B1rD,EAAI,EACF+sC,EAAK2e,EAAW,OAElBC,EAEC5hD,EAEJ4hD,EAAkB5hD,EAIlB4hD,EAAkB1gD,EAAIygD,EAAY3e,EAAK,CAAE,EAM1C,IAAIrpC,EAAM,EAAGC,EAAOopC,EAAK,EAAG6e,EAE5B,KAAQloD,GAAOC,GAMd,GAJA3D,EAAI,KAAK,MAAO0D,GAAQC,EAAOD,GAAQ,CAAE,EAEzCkoD,EAAaF,EAAY1rD,CAAE,EAAI2rD,EAE1BC,EAAa,EAEjBloD,EAAM1D,EAAI,UAEC4rD,EAAa,EAExBjoD,EAAO3D,EAAI,MAEL,CAEN2D,EAAO3D,EACP,KAID,CAMD,GAFAA,EAAI2D,EAEC+nD,EAAY1rD,CAAE,IAAM2rD,EAExB,OAAO3rD,GAAM+sC,EAAK,GAMnB,IAAM8e,EAAeH,EAAY1rD,CAAE,EAG7B8rD,EAFcJ,EAAY1rD,EAAI,CAAE,EAEF6rD,EAI9BE,GAAoBJ,EAAkBE,GAAiBC,EAM7D,OAFY9rD,EAAI+rD,IAAsBhf,EAAK,EAI5C,CAYA,WAAY7oC,EAAGqnD,EAAiB,CAG/B,IAAIp9C,EAAKjK,EAAI,KACTwK,EAAKxK,EAAI,KAIRiK,EAAK,IAAIA,EAAK,GACdO,EAAK,IAAIA,EAAK,GAEnB,IAAMs9C,EAAM,KAAK,SAAU79C,CAAG,EACxB89C,EAAM,KAAK,SAAUv9C,CAAG,EAExBypC,EAAUoT,IAAsBS,EAAI,UAAc,IAAIphD,GAAY,IAAIF,GAE5E,OAAAytC,EAAQ,KAAM8T,CAAI,EAAE,IAAKD,CAAI,EAAE,UAAU,EAElC7T,CAER,CAUA,aAAcltC,EAAGsgD,EAAiB,CAEjC,IAAMrnD,EAAI,KAAK,eAAgB+G,CAAE,EACjC,OAAO,KAAK,WAAY/G,EAAGqnD,CAAe,CAE3C,CAUA,oBAAqBrD,EAAUgE,EAAS,GAAQ,CAI/C,IAAM/hD,EAAS,IAAIO,EAEbyhD,EAAW,CAAC,EACZlS,EAAU,CAAC,EACXmS,EAAY,CAAC,EAEbC,EAAM,IAAI3hD,EACV4hD,EAAM,IAAIrhC,GAIhB,QAAUjrB,EAAI,EAAGA,GAAKkoD,EAAUloD,IAAO,CAEtC,IAAMiL,EAAIjL,EAAIkoD,EAEdiE,EAAUnsD,CAAE,EAAI,KAAK,aAAciL,EAAG,IAAIP,CAAU,CAErD,CAKAuvC,EAAS,CAAE,EAAI,IAAIvvC,EACnB0hD,EAAW,CAAE,EAAI,IAAI1hD,EACrB,IAAItI,EAAM,OAAO,UACXulC,EAAK,KAAK,IAAKwkB,EAAU,CAAE,EAAE,CAAE,EAC/BvkB,EAAK,KAAK,IAAKukB,EAAU,CAAE,EAAE,CAAE,EAC/BtkB,EAAK,KAAK,IAAKskB,EAAU,CAAE,EAAE,CAAE,EAEhCxkB,GAAMvlC,IAEVA,EAAMulC,EACNx9B,EAAO,IAAK,EAAG,EAAG,CAAE,GAIhBy9B,GAAMxlC,IAEVA,EAAMwlC,EACNz9B,EAAO,IAAK,EAAG,EAAG,CAAE,GAIhB09B,GAAMzlC,GAEV+H,EAAO,IAAK,EAAG,EAAG,CAAE,EAIrBkiD,EAAI,aAAcF,EAAU,CAAE,EAAGhiD,CAAO,EAAE,UAAU,EAEpD8vC,EAAS,CAAE,EAAE,aAAckS,EAAU,CAAE,EAAGE,CAAI,EAC9CD,EAAW,CAAE,EAAE,aAAcD,EAAU,CAAE,EAAGlS,EAAS,CAAE,CAAE,EAKzD,QAAUj6C,EAAI,EAAGA,GAAKkoD,EAAUloD,IAAO,CAQtC,GANAi6C,EAASj6C,CAAE,EAAIi6C,EAASj6C,EAAI,CAAE,EAAE,MAAM,EAEtCosD,EAAWpsD,CAAE,EAAIosD,EAAWpsD,EAAI,CAAE,EAAE,MAAM,EAE1CqsD,EAAI,aAAcF,EAAUnsD,EAAI,CAAE,EAAGmsD,EAAUnsD,CAAE,CAAE,EAE9CqsD,EAAI,OAAO,EAAI,OAAO,QAAU,CAEpCA,EAAI,UAAU,EAEd,IAAMtoB,EAAQ,KAAK,KAAM7hC,GAAOiqD,EAAUnsD,EAAI,CAAE,EAAE,IAAKmsD,EAAUnsD,CAAE,CAAE,EAAG,GAAI,CAAE,CAAE,EAEhFi6C,EAASj6C,CAAE,EAAE,aAAcssD,EAAI,iBAAkBD,EAAKtoB,CAAM,CAAE,CAE/D,CAEAqoB,EAAWpsD,CAAE,EAAE,aAAcmsD,EAAUnsD,CAAE,EAAGi6C,EAASj6C,CAAE,CAAE,CAE1D,CAIA,GAAKksD,IAAW,GAAO,CAEtB,IAAInoB,EAAQ,KAAK,KAAM7hC,GAAO+3C,EAAS,CAAE,EAAE,IAAKA,EAASiO,CAAS,CAAE,EAAG,GAAI,CAAE,CAAE,EAC/EnkB,GAASmkB,EAEJiE,EAAU,CAAE,EAAE,IAAKE,EAAI,aAAcpS,EAAS,CAAE,EAAGA,EAASiO,CAAS,CAAE,CAAE,EAAI,IAEjFnkB,EAAQ,CAAEA,GAIX,QAAU/jC,EAAI,EAAGA,GAAKkoD,EAAUloD,IAG/Bi6C,EAASj6C,CAAE,EAAE,aAAcssD,EAAI,iBAAkBH,EAAUnsD,CAAE,EAAG+jC,EAAQ/jC,CAAE,CAAE,EAC5EosD,EAAWpsD,CAAE,EAAE,aAAcmsD,EAAUnsD,CAAE,EAAGi6C,EAASj6C,CAAE,CAAE,CAI3D,CAEA,MAAO,CACN,SAAUmsD,EACV,QAASlS,EACT,UAAWmS,CACZ,CAED,CAOA,OAAQ,CAEP,OAAO,IAAI,KAAK,YAAY,EAAE,KAAM,IAAK,CAE1C,CAQA,KAAMjgB,EAAS,CAEd,YAAK,mBAAqBA,EAAO,mBAE1B,IAER,CAQA,QAAS,CAER,IAAM18B,EAAO,CACZ,SAAU,CACT,QAAS,IACT,KAAM,QACN,UAAW,cACZ,CACD,EAEA,OAAAA,EAAK,mBAAqB,KAAK,mBAC/BA,EAAK,KAAO,KAAK,KAEVA,CAER,CAQA,SAAUwK,EAAO,CAEhB,YAAK,mBAAqBA,EAAK,mBAExB,IAER,CAED,EAyBMyd,GAAN,cAA2BD,EAAM,CAchC,YAAa80B,EAAK,EAAGC,EAAK,EAAGC,EAAU,EAAGC,EAAU,EAAGC,EAAc,EAAGC,EAAY,KAAK,GAAK,EAAGC,EAAa,GAAOC,EAAY,EAAI,CAEpI,MAAM,EASN,KAAK,eAAiB,GAEtB,KAAK,KAAO,eAQZ,KAAK,GAAKP,EAQV,KAAK,GAAKC,EASV,KAAK,QAAUC,EASf,KAAK,QAAUC,EAQf,KAAK,YAAcC,EAQnB,KAAK,UAAYC,EAQjB,KAAK,WAAaC,EAQlB,KAAK,UAAYC,CAElB,CASA,SAAU5oD,EAAGqnD,EAAiB,IAAI3gD,GAAY,CAE7C,IAAMlB,EAAQ6hD,EAERwB,EAAQ,KAAK,GAAK,EACpBC,EAAa,KAAK,UAAY,KAAK,YACjCC,EAAa,KAAK,IAAKD,CAAW,EAAI,OAAO,QAGnD,KAAQA,EAAa,GAAIA,GAAcD,EACvC,KAAQC,EAAaD,GAAQC,GAAcD,EAEtCC,EAAa,OAAO,UAEnBC,EAEJD,EAAa,EAIbA,EAAaD,GAMV,KAAK,aAAe,IAAQ,CAAEE,IAE7BD,IAAeD,EAEnBC,EAAa,CAAED,EAIfC,EAAaA,EAAaD,GAM5B,IAAM1oB,EAAQ,KAAK,YAAcngC,EAAI8oD,EACjCtqD,EAAI,KAAK,GAAK,KAAK,QAAU,KAAK,IAAK2hC,CAAM,EAC7CrhC,EAAI,KAAK,GAAK,KAAK,QAAU,KAAK,IAAKqhC,CAAM,EAEjD,GAAK,KAAK,YAAc,EAAI,CAE3B,IAAMn/B,EAAM,KAAK,IAAK,KAAK,SAAU,EAC/BC,EAAM,KAAK,IAAK,KAAK,SAAU,EAE/BwiC,EAAKjlC,EAAI,KAAK,GACdklC,EAAK5kC,EAAI,KAAK,GAGpBN,EAAIilC,EAAKziC,EAAM0iC,EAAKziC,EAAM,KAAK,GAC/BnC,EAAI2kC,EAAKxiC,EAAMyiC,EAAK1iC,EAAM,KAAK,EAEhC,CAEA,OAAOwE,EAAM,IAAKhH,EAAGM,CAAE,CAExB,CAEA,KAAMmpC,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,GAAKA,EAAO,GACjB,KAAK,GAAKA,EAAO,GAEjB,KAAK,QAAUA,EAAO,QACtB,KAAK,QAAUA,EAAO,QAEtB,KAAK,YAAcA,EAAO,YAC1B,KAAK,UAAYA,EAAO,UAExB,KAAK,WAAaA,EAAO,WAEzB,KAAK,UAAYA,EAAO,UAEjB,IAER,CAEA,QAAS,CAER,IAAM18B,EAAO,MAAM,OAAO,EAE1B,OAAAA,EAAK,GAAK,KAAK,GACfA,EAAK,GAAK,KAAK,GAEfA,EAAK,QAAU,KAAK,QACpBA,EAAK,QAAU,KAAK,QAEpBA,EAAK,YAAc,KAAK,YACxBA,EAAK,UAAY,KAAK,UAEtBA,EAAK,WAAa,KAAK,WAEvBA,EAAK,UAAY,KAAK,UAEfA,CAER,CAEA,SAAUwK,EAAO,CAEhB,aAAM,SAAUA,CAAK,EAErB,KAAK,GAAKA,EAAK,GACf,KAAK,GAAKA,EAAK,GAEf,KAAK,QAAUA,EAAK,QACpB,KAAK,QAAUA,EAAK,QAEpB,KAAK,YAAcA,EAAK,YACxB,KAAK,UAAYA,EAAK,UAEtB,KAAK,WAAaA,EAAK,WAEvB,KAAK,UAAYA,EAAK,UAEf,IAER,CAED,EAOM0d,GAAN,cAAuBD,EAAa,CAYnC,YAAa60B,EAAIC,EAAIU,EAASP,EAAaC,EAAWC,EAAa,CAElE,MAAON,EAAIC,EAAIU,EAASA,EAASP,EAAaC,EAAWC,CAAW,EASpE,KAAK,WAAa,GAElB,KAAK,KAAO,UAEb,CAED,EA8EMvhD,GAAoB,IAAIZ,EACxB8J,GAAmB,IAAI7G,GACvB8G,GAAmB,IAAI9G,GACvBiqB,GAAmB,IAAIjqB,GA0BvBkqB,GAAN,cAA+BJ,EAAM,CAUpC,YAAa9hB,EAAS,CAAC,EAAGu2C,EAAS,GAAOiB,EAAY,cAAe7+C,EAAU,GAAM,CAEpF,MAAM,EASN,KAAK,mBAAqB,GAE1B,KAAK,KAAO,mBAOZ,KAAK,OAASqH,EAQd,KAAK,OAASu2C,EAQd,KAAK,UAAYiB,EAQjB,KAAK,QAAU7+C,CAEhB,CASA,SAAUpK,EAAGqnD,EAAiB,IAAI7gD,EAAY,CAE7C,IAAMhB,EAAQ6hD,EAER51C,EAAS,KAAK,OACdC,EAAID,EAAO,OAEXxN,GAAMyN,GAAM,KAAK,OAAS,EAAI,IAAQ1R,EACxCkpD,EAAW,KAAK,MAAOjlD,CAAE,EACzBm4C,EAASn4C,EAAIilD,EAEZ,KAAK,OAETA,GAAYA,EAAW,EAAI,GAAM,KAAK,MAAO,KAAK,IAAKA,CAAS,EAAIx3C,CAAE,EAAI,GAAMA,EAErE0qC,IAAW,GAAK8M,IAAax3C,EAAI,IAE5Cw3C,EAAWx3C,EAAI,EACf0qC,EAAS,GAIV,IAAIv4C,EAAI8G,EAEH,KAAK,QAAUu+C,EAAW,EAE9BrlD,EAAK4N,GAAUy3C,EAAW,GAAMx3C,CAAE,GAKlCtK,GAAI,WAAYqK,EAAQ,CAAE,EAAGA,EAAQ,CAAE,CAAE,EAAE,IAAKA,EAAQ,CAAE,CAAE,EAC5D5N,EAAKuD,IAIN,IAAMtD,EAAK2N,EAAQy3C,EAAWx3C,CAAE,EAC1B3N,EAAK0N,GAAUy3C,EAAW,GAAMx3C,CAAE,EAcxC,GAZK,KAAK,QAAUw3C,EAAW,EAAIx3C,EAElC/G,EAAK8G,GAAUy3C,EAAW,GAAMx3C,CAAE,GAKlCtK,GAAI,WAAYqK,EAAQC,EAAI,CAAE,EAAGD,EAAQC,EAAI,CAAE,CAAE,EAAE,IAAKD,EAAQC,EAAI,CAAE,CAAE,EACxE/G,EAAKvD,IAID,KAAK,YAAc,eAAiB,KAAK,YAAc,UAAY,CAGvE,IAAM+hD,EAAM,KAAK,YAAc,UAAY,GAAM,IAC7C9+C,EAAM,KAAK,IAAKxG,EAAG,kBAAmBC,CAAG,EAAGqlD,CAAI,EAChD7+C,EAAM,KAAK,IAAKxG,EAAG,kBAAmBC,CAAG,EAAGolD,CAAI,EAChD5+C,EAAM,KAAK,IAAKxG,EAAG,kBAAmB4G,CAAG,EAAGw+C,CAAI,EAG/C7+C,EAAM,OAAOA,EAAM,GACnBD,EAAM,OAAOA,EAAMC,GACnBC,EAAM,OAAOA,EAAMD,GAExBgG,GAAG,yBAA0BzM,EAAG,EAAGC,EAAG,EAAGC,EAAG,EAAG4G,EAAG,EAAGN,EAAKC,EAAKC,CAAI,EACnEgG,GAAG,yBAA0B1M,EAAG,EAAGC,EAAG,EAAGC,EAAG,EAAG4G,EAAG,EAAGN,EAAKC,EAAKC,CAAI,EACnEmpB,GAAG,yBAA0B7vB,EAAG,EAAGC,EAAG,EAAGC,EAAG,EAAG4G,EAAG,EAAGN,EAAKC,EAAKC,CAAI,CAEpE,MAAY,KAAK,YAAc,eAE9B+F,GAAG,eAAgBzM,EAAG,EAAGC,EAAG,EAAGC,EAAG,EAAG4G,EAAG,EAAG,KAAK,OAAQ,EACxD4F,GAAG,eAAgB1M,EAAG,EAAGC,EAAG,EAAGC,EAAG,EAAG4G,EAAG,EAAG,KAAK,OAAQ,EACxD+oB,GAAG,eAAgB7vB,EAAG,EAAGC,EAAG,EAAGC,EAAG,EAAG4G,EAAG,EAAG,KAAK,OAAQ,GAIzD,OAAAnF,EAAM,IACL8K,GAAG,KAAM8rC,CAAO,EAChB7rC,GAAG,KAAM6rC,CAAO,EAChB1oB,GAAG,KAAM0oB,CAAO,CACjB,EAEO52C,CAER,CAEA,KAAMyiC,EAAS,CAEd,MAAM,KAAMA,CAAO,EAEnB,KAAK,OAAS,CAAC,EAEf,QAAUnsC,EAAI,EAAG4V,EAAIu2B,EAAO,OAAO,OAAQnsC,EAAI4V,EAAG5V,IAAO,CAExD,IAAM0J,EAAQyiC,EAAO,OAAQnsC,CAAE,EAE/B,KAAK,OAAO,KAAM0J,EAAM,MAAM,CAAE,CAEjC,CAEA,YAAK,OAASyiC,EAAO,OACrB,KAAK,UAAYA,EAAO,UACxB,KAAK,QAAUA,EAAO,QAEf,IAER,CAEA,QAAS,CAER,IAAM18B,EAAO,MAAM,OAAO,EAE1BA,EAAK,OAAS,CAAC,EAEf,QAAUzP,EAAI,EAAG4V,EAAI,KAAK,OAAO,OAAQ5V,EAAI4V,EAAG5V,IAAO,CAEtD,IAAM0J,EAAQ,KAAK,OAAQ1J,CAAE,EAC7ByP,EAAK,OAAO,KAAM/F,EAAM,QAAQ,CAAE,CAEnC,CAEA,OAAA+F,EAAK,OAAS,KAAK,OACnBA,EAAK,UAAY,KAAK,UACtBA,EAAK,QAAU,KAAK,QAEbA,CAER,CAEA,SAAUwK,EAAO,CAEhB,MAAM,SAAUA,CAAK,EAErB,KAAK,OAAS,CAAC,EAEf,QAAUja,EAAI,EAAG4V,EAAIqE,EAAK,OAAO,OAAQja,EAAI4V,EAAG5V,IAAO,CAEtD,IAAM0J,EAAQuQ,EAAK,OAAQja,CAAE,EAC7B,KAAK,OAAO,KAAM,IAAI0K,EAAQ,EAAE,UAAWhB,CAAM,CAAE,CAEpD,CAEA,YAAK,OAASuQ,EAAK,OACnB,KAAK,UAAYA,EAAK,UACtB,KAAK,QAAUA,EAAK,QAEb,IAER,CAED,EAsIM6d,GAAN,cAA+BL,EAAM,CAUpC,YAAajwB,EAAK,IAAIoD,GAAWnD,EAAK,IAAImD,GAAWlD,EAAK,IAAIkD,GAAWsrC,EAAK,IAAItrC,GAAY,CAE7F,MAAM,EASN,KAAK,mBAAqB,GAE1B,KAAK,KAAO,mBAOZ,KAAK,GAAKpD,EAOV,KAAK,GAAKC,EAOV,KAAK,GAAKC,EAOV,KAAK,GAAKwuC,CAEX,CASA,SAAUhyC,EAAGqnD,EAAiB,IAAI3gD,GAAY,CAE7C,IAAMlB,EAAQ6hD,EAER/jD,EAAK,KAAK,GAAIC,EAAK,KAAK,GAAIC,EAAK,KAAK,GAAIwuC,EAAK,KAAK,GAE1D,OAAAxsC,EAAM,IACL6F,GAAarL,EAAGsD,EAAG,EAAGC,EAAG,EAAGC,EAAG,EAAGwuC,EAAG,CAAE,EACvC3mC,GAAarL,EAAGsD,EAAG,EAAGC,EAAG,EAAGC,EAAG,EAAGwuC,EAAG,CAAE,CACxC,EAEOxsC,CAER,CAEA,KAAMyiC,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,GAAG,KAAMA,EAAO,EAAG,EACxB,KAAK,GAAG,KAAMA,EAAO,EAAG,EACxB,KAAK,GAAG,KAAMA,EAAO,EAAG,EACxB,KAAK,GAAG,KAAMA,EAAO,EAAG,EAEjB,IAER,CAEA,QAAS,CAER,IAAM18B,EAAO,MAAM,OAAO,EAE1B,OAAAA,EAAK,GAAK,KAAK,GAAG,QAAQ,EAC1BA,EAAK,GAAK,KAAK,GAAG,QAAQ,EAC1BA,EAAK,GAAK,KAAK,GAAG,QAAQ,EAC1BA,EAAK,GAAK,KAAK,GAAG,QAAQ,EAEnBA,CAER,CAEA,SAAUwK,EAAO,CAEhB,aAAM,SAAUA,CAAK,EAErB,KAAK,GAAG,UAAWA,EAAK,EAAG,EAC3B,KAAK,GAAG,UAAWA,EAAK,EAAG,EAC3B,KAAK,GAAG,UAAWA,EAAK,EAAG,EAC3B,KAAK,GAAG,UAAWA,EAAK,EAAG,EAEpB,IAER,CAED,EAOM8d,GAAN,cAAgCN,EAAM,CAUrC,YAAajwB,EAAK,IAAIkD,EAAWjD,EAAK,IAAIiD,EAAWhD,EAAK,IAAIgD,EAAWwrC,EAAK,IAAIxrC,EAAY,CAE7F,MAAM,EASN,KAAK,oBAAsB,GAE3B,KAAK,KAAO,oBAOZ,KAAK,GAAKlD,EAOV,KAAK,GAAKC,EAOV,KAAK,GAAKC,EAOV,KAAK,GAAKwuC,CAEX,CASA,SAAUhyC,EAAGqnD,EAAiB,IAAI7gD,EAAY,CAE7C,IAAMhB,EAAQ6hD,EAER/jD,EAAK,KAAK,GAAIC,EAAK,KAAK,GAAIC,EAAK,KAAK,GAAIwuC,EAAK,KAAK,GAE1D,OAAAxsC,EAAM,IACL6F,GAAarL,EAAGsD,EAAG,EAAGC,EAAG,EAAGC,EAAG,EAAGwuC,EAAG,CAAE,EACvC3mC,GAAarL,EAAGsD,EAAG,EAAGC,EAAG,EAAGC,EAAG,EAAGwuC,EAAG,CAAE,EACvC3mC,GAAarL,EAAGsD,EAAG,EAAGC,EAAG,EAAGC,EAAG,EAAGwuC,EAAG,CAAE,CACxC,EAEOxsC,CAER,CAEA,KAAMyiC,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,GAAG,KAAMA,EAAO,EAAG,EACxB,KAAK,GAAG,KAAMA,EAAO,EAAG,EACxB,KAAK,GAAG,KAAMA,EAAO,EAAG,EACxB,KAAK,GAAG,KAAMA,EAAO,EAAG,EAEjB,IAER,CAEA,QAAS,CAER,IAAM18B,EAAO,MAAM,OAAO,EAE1B,OAAAA,EAAK,GAAK,KAAK,GAAG,QAAQ,EAC1BA,EAAK,GAAK,KAAK,GAAG,QAAQ,EAC1BA,EAAK,GAAK,KAAK,GAAG,QAAQ,EAC1BA,EAAK,GAAK,KAAK,GAAG,QAAQ,EAEnBA,CAER,CAEA,SAAUwK,EAAO,CAEhB,aAAM,SAAUA,CAAK,EAErB,KAAK,GAAG,UAAWA,EAAK,EAAG,EAC3B,KAAK,GAAG,UAAWA,EAAK,EAAG,EAC3B,KAAK,GAAG,UAAWA,EAAK,EAAG,EAC3B,KAAK,GAAG,UAAWA,EAAK,EAAG,EAEpB,IAER,CAED,EAOM+d,GAAN,cAAwBP,EAAM,CAQ7B,YAAahwB,EAAK,IAAImD,GAAWlD,EAAK,IAAIkD,GAAY,CAErD,MAAM,EASN,KAAK,YAAc,GAEnB,KAAK,KAAO,YAOZ,KAAK,GAAKnD,EAOV,KAAK,GAAKC,CAEX,CASA,SAAUxD,EAAGqnD,EAAiB,IAAI3gD,GAAY,CAE7C,IAAMlB,EAAQ6hD,EAEd,OAAKrnD,IAAM,EAEVwF,EAAM,KAAM,KAAK,EAAG,GAIpBA,EAAM,KAAM,KAAK,EAAG,EAAE,IAAK,KAAK,EAAG,EACnCA,EAAM,eAAgBxF,CAAE,EAAE,IAAK,KAAK,EAAG,GAIjCwF,CAER,CAGA,WAAYuB,EAAGsgD,EAAiB,CAE/B,OAAO,KAAK,SAAUtgD,EAAGsgD,CAAe,CAEzC,CAEA,WAAYrnD,EAAGqnD,EAAiB,IAAI3gD,GAAY,CAE/C,OAAO2gD,EAAe,WAAY,KAAK,GAAI,KAAK,EAAG,EAAE,UAAU,CAEhE,CAEA,aAActgD,EAAGsgD,EAAiB,CAEjC,OAAO,KAAK,WAAYtgD,EAAGsgD,CAAe,CAE3C,CAEA,KAAMpf,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,GAAG,KAAMA,EAAO,EAAG,EACxB,KAAK,GAAG,KAAMA,EAAO,EAAG,EAEjB,IAER,CAEA,QAAS,CAER,IAAM18B,EAAO,MAAM,OAAO,EAE1B,OAAAA,EAAK,GAAK,KAAK,GAAG,QAAQ,EAC1BA,EAAK,GAAK,KAAK,GAAG,QAAQ,EAEnBA,CAER,CAEA,SAAUwK,EAAO,CAEhB,aAAM,SAAUA,CAAK,EAErB,KAAK,GAAG,UAAWA,EAAK,EAAG,EAC3B,KAAK,GAAG,UAAWA,EAAK,EAAG,EAEpB,IAER,CAED,EAOMge,GAAN,cAAyBR,EAAM,CAQ9B,YAAahwB,EAAK,IAAIiD,EAAWhD,EAAK,IAAIgD,EAAY,CAErD,MAAM,EASN,KAAK,aAAe,GAEpB,KAAK,KAAO,aAOZ,KAAK,GAAKjD,EAOV,KAAK,GAAKC,CAEX,CASA,SAAUxD,EAAGqnD,EAAiB,IAAI7gD,EAAY,CAE7C,IAAMhB,EAAQ6hD,EAEd,OAAKrnD,IAAM,EAEVwF,EAAM,KAAM,KAAK,EAAG,GAIpBA,EAAM,KAAM,KAAK,EAAG,EAAE,IAAK,KAAK,EAAG,EACnCA,EAAM,eAAgBxF,CAAE,EAAE,IAAK,KAAK,EAAG,GAIjCwF,CAER,CAGA,WAAYuB,EAAGsgD,EAAiB,CAE/B,OAAO,KAAK,SAAUtgD,EAAGsgD,CAAe,CAEzC,CAEA,WAAYrnD,EAAGqnD,EAAiB,IAAI7gD,EAAY,CAE/C,OAAO6gD,EAAe,WAAY,KAAK,GAAI,KAAK,EAAG,EAAE,UAAU,CAEhE,CAEA,aAActgD,EAAGsgD,EAAiB,CAEjC,OAAO,KAAK,WAAYtgD,EAAGsgD,CAAe,CAE3C,CAEA,KAAMpf,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,GAAG,KAAMA,EAAO,EAAG,EACxB,KAAK,GAAG,KAAMA,EAAO,EAAG,EAEjB,IAER,CAEA,QAAS,CAER,IAAM18B,EAAO,MAAM,OAAO,EAE1B,OAAAA,EAAK,GAAK,KAAK,GAAG,QAAQ,EAC1BA,EAAK,GAAK,KAAK,GAAG,QAAQ,EAEnBA,CAER,CAEA,SAAUwK,EAAO,CAEhB,aAAM,SAAUA,CAAK,EAErB,KAAK,GAAG,UAAWA,EAAK,EAAG,EAC3B,KAAK,GAAG,UAAWA,EAAK,EAAG,EAEpB,IAER,CAED,EAuBMie,GAAN,cAAmCT,EAAM,CASxC,YAAajwB,EAAK,IAAIoD,GAAWnD,EAAK,IAAImD,GAAWlD,EAAK,IAAIkD,GAAY,CAEzE,MAAM,EASN,KAAK,uBAAyB,GAE9B,KAAK,KAAO,uBAOZ,KAAK,GAAKpD,EAOV,KAAK,GAAKC,EAOV,KAAK,GAAKC,CAEX,CASA,SAAUxD,EAAGqnD,EAAiB,IAAI3gD,GAAY,CAE7C,IAAMlB,EAAQ6hD,EAER/jD,EAAK,KAAK,GAAIC,EAAK,KAAK,GAAIC,EAAK,KAAK,GAE5C,OAAAgC,EAAM,IACLwF,GAAiBhL,EAAGsD,EAAG,EAAGC,EAAG,EAAGC,EAAG,CAAE,EACrCwH,GAAiBhL,EAAGsD,EAAG,EAAGC,EAAG,EAAGC,EAAG,CAAE,CACtC,EAEOgC,CAER,CAEA,KAAMyiC,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,GAAG,KAAMA,EAAO,EAAG,EACxB,KAAK,GAAG,KAAMA,EAAO,EAAG,EACxB,KAAK,GAAG,KAAMA,EAAO,EAAG,EAEjB,IAER,CAEA,QAAS,CAER,IAAM18B,EAAO,MAAM,OAAO,EAE1B,OAAAA,EAAK,GAAK,KAAK,GAAG,QAAQ,EAC1BA,EAAK,GAAK,KAAK,GAAG,QAAQ,EAC1BA,EAAK,GAAK,KAAK,GAAG,QAAQ,EAEnBA,CAER,CAEA,SAAUwK,EAAO,CAEhB,aAAM,SAAUA,CAAK,EAErB,KAAK,GAAG,UAAWA,EAAK,EAAG,EAC3B,KAAK,GAAG,UAAWA,EAAK,EAAG,EAC3B,KAAK,GAAG,UAAWA,EAAK,EAAG,EAEpB,IAER,CAED,EAOMke,GAAN,cAAoCV,EAAM,CASzC,YAAajwB,EAAK,IAAIkD,EAAWjD,EAAK,IAAIiD,EAAWhD,EAAK,IAAIgD,EAAY,CAEzE,MAAM,EASN,KAAK,wBAA0B,GAE/B,KAAK,KAAO,wBAOZ,KAAK,GAAKlD,EAOV,KAAK,GAAKC,EAOV,KAAK,GAAKC,CAEX,CASA,SAAUxD,EAAGqnD,EAAiB,IAAI7gD,EAAY,CAE7C,IAAMhB,EAAQ6hD,EAER/jD,EAAK,KAAK,GAAIC,EAAK,KAAK,GAAIC,EAAK,KAAK,GAE5C,OAAAgC,EAAM,IACLwF,GAAiBhL,EAAGsD,EAAG,EAAGC,EAAG,EAAGC,EAAG,CAAE,EACrCwH,GAAiBhL,EAAGsD,EAAG,EAAGC,EAAG,EAAGC,EAAG,CAAE,EACrCwH,GAAiBhL,EAAGsD,EAAG,EAAGC,EAAG,EAAGC,EAAG,CAAE,CACtC,EAEOgC,CAER,CAEA,KAAMyiC,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,GAAG,KAAMA,EAAO,EAAG,EACxB,KAAK,GAAG,KAAMA,EAAO,EAAG,EACxB,KAAK,GAAG,KAAMA,EAAO,EAAG,EAEjB,IAER,CAEA,QAAS,CAER,IAAM18B,EAAO,MAAM,OAAO,EAE1B,OAAAA,EAAK,GAAK,KAAK,GAAG,QAAQ,EAC1BA,EAAK,GAAK,KAAK,GAAG,QAAQ,EAC1BA,EAAK,GAAK,KAAK,GAAG,QAAQ,EAEnBA,CAER,CAEA,SAAUwK,EAAO,CAEhB,aAAM,SAAUA,CAAK,EAErB,KAAK,GAAG,UAAWA,EAAK,EAAG,EAC3B,KAAK,GAAG,UAAWA,EAAK,EAAG,EAC3B,KAAK,GAAG,UAAWA,EAAK,EAAG,EAEpB,IAER,CAED,EA0BMme,GAAN,cAA0BX,EAAM,CAO/B,YAAa9hB,EAAS,CAAC,EAAI,CAE1B,MAAM,EASN,KAAK,cAAgB,GAErB,KAAK,KAAO,cAOZ,KAAK,OAASA,CAEf,CASA,SAAUzR,EAAGqnD,EAAiB,IAAI3gD,GAAY,CAE7C,IAAMlB,EAAQ6hD,EAER51C,EAAS,KAAK,OACdxN,GAAMwN,EAAO,OAAS,GAAMzR,EAE5BkpD,EAAW,KAAK,MAAOjlD,CAAE,EACzBm4C,EAASn4C,EAAIilD,EAEbrlD,EAAK4N,EAAQy3C,IAAa,EAAIA,EAAWA,EAAW,CAAE,EACtDplD,EAAK2N,EAAQy3C,CAAS,EACtBnlD,EAAK0N,EAAQy3C,EAAWz3C,EAAO,OAAS,EAAIA,EAAO,OAAS,EAAIy3C,EAAW,CAAE,EAC7Ev+C,EAAK8G,EAAQy3C,EAAWz3C,EAAO,OAAS,EAAIA,EAAO,OAAS,EAAIy3C,EAAW,CAAE,EAEnF,OAAA1jD,EAAM,IACLkF,GAAY0xC,EAAQv4C,EAAG,EAAGC,EAAG,EAAGC,EAAG,EAAG4G,EAAG,CAAE,EAC3CD,GAAY0xC,EAAQv4C,EAAG,EAAGC,EAAG,EAAGC,EAAG,EAAG4G,EAAG,CAAE,CAC5C,EAEOnF,CAER,CAEA,KAAMyiC,EAAS,CAEd,MAAM,KAAMA,CAAO,EAEnB,KAAK,OAAS,CAAC,EAEf,QAAUnsC,EAAI,EAAG4V,EAAIu2B,EAAO,OAAO,OAAQnsC,EAAI4V,EAAG5V,IAAO,CAExD,IAAM0J,EAAQyiC,EAAO,OAAQnsC,CAAE,EAE/B,KAAK,OAAO,KAAM0J,EAAM,MAAM,CAAE,CAEjC,CAEA,OAAO,IAER,CAEA,QAAS,CAER,IAAM+F,EAAO,MAAM,OAAO,EAE1BA,EAAK,OAAS,CAAC,EAEf,QAAUzP,EAAI,EAAG4V,EAAI,KAAK,OAAO,OAAQ5V,EAAI4V,EAAG5V,IAAO,CAEtD,IAAM0J,EAAQ,KAAK,OAAQ1J,CAAE,EAC7ByP,EAAK,OAAO,KAAM/F,EAAM,QAAQ,CAAE,CAEnC,CAEA,OAAO+F,CAER,CAEA,SAAUwK,EAAO,CAEhB,MAAM,SAAUA,CAAK,EAErB,KAAK,OAAS,CAAC,EAEf,QAAUja,EAAI,EAAG4V,EAAIqE,EAAK,OAAO,OAAQja,EAAI4V,EAAG5V,IAAO,CAEtD,IAAM0J,EAAQuQ,EAAK,OAAQja,CAAE,EAC7B,KAAK,OAAO,KAAM,IAAI4K,GAAQ,EAAE,UAAWlB,CAAM,CAAE,CAEpD,CAEA,OAAO,IAER,CAED,EAEI2uB,GAAsB,OAAO,OAAO,CACvC,UAAW,KACX,SAAUV,GACV,iBAAkBE,GAClB,iBAAkBC,GAClB,kBAAmBC,GACnB,aAAcL,GACd,UAAWM,GACX,WAAYC,GACZ,qBAAsBC,GACtB,sBAAuBC,GACvB,YAAaC,EACd,CAAC,EAQKE,GAAN,cAAwBb,EAAM,CAK7B,aAAc,CAEb,MAAM,EAEN,KAAK,KAAO,YAQZ,KAAK,OAAS,CAAC,EASf,KAAK,UAAY,EAElB,CAOA,IAAK61B,EAAQ,CAEZ,KAAK,OAAO,KAAMA,CAAM,CAEzB,CAOA,WAAY,CAGX,IAAMC,EAAa,KAAK,OAAQ,CAAE,EAAE,SAAU,CAAE,EAC1CC,EAAW,KAAK,OAAQ,KAAK,OAAO,OAAS,CAAE,EAAE,SAAU,CAAE,EAEnE,GAAK,CAAED,EAAW,OAAQC,CAAS,EAAI,CAEtC,IAAMC,EAAaF,EAAW,YAAc,GAAS,YAAc,aACnE,KAAK,OAAO,KAAM,IAAIl1B,GAAQo1B,CAAS,EAAGD,EAAUD,CAAW,CAAE,CAElE,CAEA,OAAO,IAER,CAUA,SAAUrpD,EAAGqnD,EAAiB,CAW7B,IAAM7gB,EAAIxmC,EAAI,KAAK,UAAU,EACvBwpD,EAAe,KAAK,gBAAgB,EACtC1tD,EAAI,EAIR,KAAQA,EAAI0tD,EAAa,QAAS,CAEjC,GAAKA,EAAc1tD,CAAE,GAAK0qC,EAAI,CAE7B,IAAMijB,EAAOD,EAAc1tD,CAAE,EAAI0qC,EAC3B4iB,EAAQ,KAAK,OAAQttD,CAAE,EAEvB8rD,EAAgBwB,EAAM,UAAU,EAChCriD,EAAI6gD,IAAkB,EAAI,EAAI,EAAI6B,EAAO7B,EAE/C,OAAOwB,EAAM,WAAYriD,EAAGsgD,CAAe,CAE5C,CAEAvrD,GAED,CAEA,OAAO,IAIR,CAEA,WAAY,CAMX,IAAM4tD,EAAO,KAAK,gBAAgB,EAClC,OAAOA,EAAMA,EAAK,OAAS,CAAE,CAE9B,CAEA,kBAAmB,CAIlB,KAAK,YAAc,GACnB,KAAK,aAAe,KACpB,KAAK,gBAAgB,CAEtB,CAOA,iBAAkB,CAMjB,GAAK,KAAK,cAAgB,KAAK,aAAa,SAAW,KAAK,OAAO,OAElE,OAAO,KAAK,aAOb,IAAMnC,EAAU,CAAC,EACboC,EAAO,EAEX,QAAU7tD,EAAI,EAAG4V,EAAI,KAAK,OAAO,OAAQ5V,EAAI4V,EAAG5V,IAE/C6tD,GAAQ,KAAK,OAAQ7tD,CAAE,EAAE,UAAU,EACnCyrD,EAAQ,KAAMoC,CAAK,EAIpB,YAAK,aAAepC,EAEbA,CAER,CAEA,gBAAiBD,EAAY,GAAK,CAEjC,IAAM71C,EAAS,CAAC,EAEhB,QAAU3V,EAAI,EAAGA,GAAKwrD,EAAWxrD,IAEhC2V,EAAO,KAAM,KAAK,SAAU3V,EAAIwrD,CAAU,CAAE,EAI7C,OAAK,KAAK,WAET71C,EAAO,KAAMA,EAAQ,CAAE,CAAE,EAInBA,CAER,CAEA,UAAW61C,EAAY,GAAK,CAE3B,IAAM71C,EAAS,CAAC,EACZhF,EAEJ,QAAU3Q,EAAI,EAAG8tD,EAAS,KAAK,OAAQ9tD,EAAI8tD,EAAO,OAAQ9tD,IAAO,CAEhE,IAAMstD,EAAQQ,EAAQ9tD,CAAE,EAClB+tD,EAAaT,EAAM,eAAiB9B,EAAY,EACjD8B,EAAM,aAAeA,EAAM,aAAiB,EAC7CA,EAAM,cAAgB9B,EAAY8B,EAAM,OAAO,OAC9C9B,EAECwC,EAAMV,EAAM,UAAWS,CAAW,EAExC,QAAUnmD,EAAI,EAAGA,EAAIomD,EAAI,OAAQpmD,IAAO,CAEvC,IAAM8B,EAAQskD,EAAKpmD,CAAE,EAEhB+I,GAAQA,EAAK,OAAQjH,CAAM,IAEhCiM,EAAO,KAAMjM,CAAM,EACnBiH,EAAOjH,EAER,CAED,CAEA,OAAK,KAAK,WAAaiM,EAAO,OAAS,GAAK,CAAEA,EAAQA,EAAO,OAAS,CAAE,EAAE,OAAQA,EAAQ,CAAE,CAAE,GAE7FA,EAAO,KAAMA,EAAQ,CAAE,CAAE,EAInBA,CAER,CAEA,KAAMw2B,EAAS,CAEd,MAAM,KAAMA,CAAO,EAEnB,KAAK,OAAS,CAAC,EAEf,QAAUnsC,EAAI,EAAG4V,EAAIu2B,EAAO,OAAO,OAAQnsC,EAAI4V,EAAG5V,IAAO,CAExD,IAAMstD,EAAQnhB,EAAO,OAAQnsC,CAAE,EAE/B,KAAK,OAAO,KAAMstD,EAAM,MAAM,CAAE,CAEjC,CAEA,YAAK,UAAYnhB,EAAO,UAEjB,IAER,CAEA,QAAS,CAER,IAAM18B,EAAO,MAAM,OAAO,EAE1BA,EAAK,UAAY,KAAK,UACtBA,EAAK,OAAS,CAAC,EAEf,QAAUzP,EAAI,EAAG4V,EAAI,KAAK,OAAO,OAAQ5V,EAAI4V,EAAG5V,IAAO,CAEtD,IAAMstD,EAAQ,KAAK,OAAQttD,CAAE,EAC7ByP,EAAK,OAAO,KAAM69C,EAAM,OAAO,CAAE,CAElC,CAEA,OAAO79C,CAER,CAEA,SAAUwK,EAAO,CAEhB,MAAM,SAAUA,CAAK,EAErB,KAAK,UAAYA,EAAK,UACtB,KAAK,OAAS,CAAC,EAEf,QAAUja,EAAI,EAAG4V,EAAIqE,EAAK,OAAO,OAAQja,EAAI4V,EAAG5V,IAAO,CAEtD,IAAMstD,EAAQrzC,EAAK,OAAQja,CAAE,EAC7B,KAAK,OAAO,KAAM,IAAIq4B,GAAQi1B,EAAM,IAAK,EAAE,EAAE,SAAUA,CAAM,CAAE,CAEhE,CAEA,OAAO,IAER,CAED,EAwBM/0B,GAAN,cAAmBD,EAAU,CAO5B,YAAa3iB,EAAS,CAErB,MAAM,EAEN,KAAK,KAAO,OAOZ,KAAK,aAAe,IAAI/K,GAEnB+K,GAEJ,KAAK,cAAeA,CAAO,CAI7B,CASA,cAAeA,EAAS,CAEvB,KAAK,OAAQA,EAAQ,CAAE,EAAE,EAAGA,EAAQ,CAAE,EAAE,CAAE,EAE1C,QAAU3V,EAAI,EAAG4V,EAAID,EAAO,OAAQ3V,EAAI4V,EAAG5V,IAE1C,KAAK,OAAQ2V,EAAQ3V,CAAE,EAAE,EAAG2V,EAAQ3V,CAAE,EAAE,CAAE,EAI3C,OAAO,IAER,CASA,OAAQ0C,EAAGM,EAAI,CAEd,YAAK,aAAa,IAAKN,EAAGM,CAAE,EAErB,IAER,CAUA,OAAQN,EAAGM,EAAI,CAEd,IAAMsqD,EAAQ,IAAIt1B,GAAW,KAAK,aAAa,MAAM,EAAG,IAAIptB,GAASlI,EAAGM,CAAE,CAAE,EAC5E,YAAK,OAAO,KAAMsqD,CAAM,EAExB,KAAK,aAAa,IAAK5qD,EAAGM,CAAE,EAErB,IAER,CAYA,iBAAkBirD,EAAMC,EAAM3B,EAAIC,EAAK,CAEtC,IAAMc,EAAQ,IAAIp1B,GACjB,KAAK,aAAa,MAAM,EACxB,IAAIttB,GAASqjD,EAAMC,CAAK,EACxB,IAAItjD,GAAS2hD,EAAIC,CAAG,CACrB,EAEA,YAAK,OAAO,KAAMc,CAAM,EAExB,KAAK,aAAa,IAAKf,EAAIC,CAAG,EAEvB,IAER,CAcA,cAAe2B,EAAOC,EAAOC,EAAOC,EAAO/B,EAAIC,EAAK,CAEnD,IAAMc,EAAQ,IAAIx1B,GACjB,KAAK,aAAa,MAAM,EACxB,IAAIltB,GAASujD,EAAOC,CAAM,EAC1B,IAAIxjD,GAASyjD,EAAOC,CAAM,EAC1B,IAAI1jD,GAAS2hD,EAAIC,CAAG,CACrB,EAEA,YAAK,OAAO,KAAMc,CAAM,EAExB,KAAK,aAAa,IAAKf,EAAIC,CAAG,EAEvB,IAER,CASA,WAAYwB,EAAM,CAEjB,IAAMO,EAAO,CAAE,KAAK,aAAa,MAAM,CAAE,EAAE,OAAQP,CAAI,EAEjDV,EAAQ,IAAIl1B,GAAam2B,CAAK,EACpC,YAAK,OAAO,KAAMjB,CAAM,EAExB,KAAK,aAAa,KAAMU,EAAKA,EAAI,OAAS,CAAE,CAAE,EAEvC,IAER,CAcA,IAAKzB,EAAIC,EAAIU,EAASP,EAAaC,EAAWC,EAAa,CAE1D,IAAM7+C,EAAK,KAAK,aAAa,EACvBmE,EAAK,KAAK,aAAa,EAE7B,YAAK,OAAQo6C,EAAKv+C,EAAIw+C,EAAKr6C,EAAI+6C,EAC9BP,EAAaC,EAAWC,CAAW,EAE7B,IAER,CAaA,OAAQN,EAAIC,EAAIU,EAASP,EAAaC,EAAWC,EAAa,CAE7D,YAAK,WAAYN,EAAIC,EAAIU,EAASA,EAASP,EAAaC,EAAWC,CAAW,EAEvE,IAER,CAgBA,QAASN,EAAIC,EAAIC,EAASC,EAASC,EAAaC,EAAWC,EAAYC,EAAY,CAElF,IAAM9+C,EAAK,KAAK,aAAa,EACvBmE,EAAK,KAAK,aAAa,EAE7B,YAAK,WAAYo6C,EAAKv+C,EAAIw+C,EAAKr6C,EAAIs6C,EAASC,EAASC,EAAaC,EAAWC,EAAYC,CAAU,EAE5F,IAER,CAeA,WAAYP,EAAIC,EAAIC,EAASC,EAASC,EAAaC,EAAWC,EAAYC,EAAY,CAErF,IAAMQ,EAAQ,IAAI51B,GAAc60B,EAAIC,EAAIC,EAASC,EAASC,EAAaC,EAAWC,EAAYC,CAAU,EAExG,GAAK,KAAK,OAAO,OAAS,EAAI,CAG7B,IAAM0B,EAAalB,EAAM,SAAU,CAAE,EAE9BkB,EAAW,OAAQ,KAAK,YAAa,GAE3C,KAAK,OAAQA,EAAW,EAAGA,EAAW,CAAE,CAI1C,CAEA,KAAK,OAAO,KAAMlB,CAAM,EAExB,IAAMmB,EAAYnB,EAAM,SAAU,CAAE,EACpC,YAAK,aAAa,KAAMmB,CAAU,EAE3B,IAER,CAEA,KAAMtiB,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,aAAa,KAAMA,EAAO,YAAa,EAErC,IAER,CAEA,QAAS,CAER,IAAM18B,EAAO,MAAM,OAAO,EAE1B,OAAAA,EAAK,aAAe,KAAK,aAAa,QAAQ,EAEvCA,CAER,CAEA,SAAUwK,EAAO,CAEhB,aAAM,SAAUA,CAAK,EAErB,KAAK,aAAa,UAAWA,EAAK,YAAa,EAExC,IAER,CAED,EAiCMue,GAAN,cAAoBD,EAAK,CAOxB,YAAa5iB,EAAS,CAErB,MAAOA,CAAO,EAQd,KAAK,KAAO/T,GAAa,EAEzB,KAAK,KAAO,QASZ,KAAK,MAAQ,CAAC,CAEf,CASA,eAAgB4pD,EAAY,CAE3B,IAAMkD,EAAW,CAAC,EAElB,QAAU1uD,EAAI,EAAG4V,EAAI,KAAK,MAAM,OAAQ5V,EAAI4V,EAAG5V,IAE9C0uD,EAAU1uD,CAAE,EAAI,KAAK,MAAOA,CAAE,EAAE,UAAWwrD,CAAU,EAItD,OAAOkD,CAER,CAWA,cAAelD,EAAY,CAE1B,MAAO,CAEN,MAAO,KAAK,UAAWA,CAAU,EACjC,MAAO,KAAK,eAAgBA,CAAU,CAEvC,CAED,CAEA,KAAMrf,EAAS,CAEd,MAAM,KAAMA,CAAO,EAEnB,KAAK,MAAQ,CAAC,EAEd,QAAUnsC,EAAI,EAAG4V,EAAIu2B,EAAO,MAAM,OAAQnsC,EAAI4V,EAAG5V,IAAO,CAEvD,IAAMoT,EAAO+4B,EAAO,MAAOnsC,CAAE,EAE7B,KAAK,MAAM,KAAMoT,EAAK,MAAM,CAAE,CAE/B,CAEA,OAAO,IAER,CAEA,QAAS,CAER,IAAM3D,EAAO,MAAM,OAAO,EAE1BA,EAAK,KAAO,KAAK,KACjBA,EAAK,MAAQ,CAAC,EAEd,QAAUzP,EAAI,EAAG4V,EAAI,KAAK,MAAM,OAAQ5V,EAAI4V,EAAG5V,IAAO,CAErD,IAAMoT,EAAO,KAAK,MAAOpT,CAAE,EAC3ByP,EAAK,MAAM,KAAM2D,EAAK,OAAO,CAAE,CAEhC,CAEA,OAAO3D,CAER,CAEA,SAAUwK,EAAO,CAEhB,MAAM,SAAUA,CAAK,EAErB,KAAK,KAAOA,EAAK,KACjB,KAAK,MAAQ,CAAC,EAEd,QAAUja,EAAI,EAAG4V,EAAIqE,EAAK,MAAM,OAAQja,EAAI4V,EAAG5V,IAAO,CAErD,IAAMoT,EAAO6G,EAAK,MAAOja,CAAE,EAC3B,KAAK,MAAM,KAAM,IAAIu4B,GAAK,EAAE,SAAUnlB,CAAK,CAAE,CAE9C,CAEA,OAAO,IAER,CAED,EAooBMqlB,GAAN,KAAa,CAWZ,OAAO,YAAahpB,EAAMC,EAAaC,EAAM,EAAI,CAEhD,OAAOH,IAAQC,EAAMC,EAAaC,CAAI,CAEvC,CAED,EAOM+oB,GAAN,MAAMi2B,CAAW,CAQhB,OAAO,KAAM54C,EAAU,CAEtB,IAAMxT,EAAIwT,EAAQ,OACdjR,EAAI,EAER,QAAUqD,EAAI5F,EAAI,EAAGsC,EAAI,EAAGA,EAAItC,EAAG4F,EAAItD,IAEtCC,GAAKiR,EAAS5N,CAAE,EAAE,EAAI4N,EAASlR,CAAE,EAAE,EAAIkR,EAASlR,CAAE,EAAE,EAAIkR,EAAS5N,CAAE,EAAE,EAItE,OAAOrD,EAAI,EAEZ,CAQA,OAAO,YAAakpD,EAAM,CAEzB,OAAOW,EAAW,KAAMX,CAAI,EAAI,CAEjC,CASA,OAAO,iBAAkBj4C,EAAS64C,EAAQ,CAEzC,IAAM94C,EAAW,CAAC,EACZpG,EAAc,CAAC,EACfm/C,EAAQ,CAAC,EAEfn5C,GAAiBK,CAAQ,EACzBF,GAAYC,EAAUC,CAAQ,EAI9B,IAAI+4C,EAAY/4C,EAAQ,OAExB64C,EAAM,QAASl5C,EAAgB,EAE/B,QAAU1V,EAAI,EAAGA,EAAI4uD,EAAM,OAAQ5uD,IAElC0P,EAAY,KAAMo/C,CAAU,EAC5BA,GAAaF,EAAO5uD,CAAE,EAAE,OACxB6V,GAAYC,EAAU84C,EAAO5uD,CAAE,CAAE,EAMlC,IAAMgQ,EAAYyoB,GAAO,YAAa3iB,EAAUpG,CAAY,EAI5D,QAAU1P,EAAI,EAAGA,EAAIgQ,EAAU,OAAQhQ,GAAK,EAE3C6uD,EAAM,KAAM7+C,EAAU,MAAOhQ,EAAGA,EAAI,CAAE,CAAE,EAIzC,OAAO6uD,CAER,CAED,EA+CMl2B,GAAN,MAAMo2B,UAAwBx/B,EAAe,CAQ5C,YAAatZ,EAAS,IAAIuiB,GAAO,CAAE,IAAI5tB,GAAS,GAAK,EAAI,EAAG,IAAIA,GAAS,IAAM,EAAI,EAAG,IAAIA,GAAS,IAAM,GAAK,EAAG,IAAIA,GAAS,GAAK,GAAK,CAAE,CAAE,EAAGsL,EAAU,CAAC,EAAI,CAE7J,MAAM,EAEN,KAAK,KAAO,kBASZ,KAAK,WAAa,CACjB,OAAQD,EACR,QAASC,CACV,EAEAD,EAAS,MAAM,QAASA,CAAO,EAAIA,EAAS,CAAEA,CAAO,EAErD,IAAMwlC,EAAQ,KAERuT,EAAgB,CAAC,EACjBC,EAAU,CAAC,EAEjB,QAAUjvD,EAAI,EAAG4V,EAAIK,EAAO,OAAQjW,EAAI4V,EAAG5V,IAAO,CAEjD,IAAMmW,EAAQF,EAAQjW,CAAE,EACxBkvD,EAAU/4C,CAAM,CAEjB,CAIA,KAAK,aAAc,WAAY,IAAI4Y,GAAwBigC,EAAe,CAAE,CAAE,EAC9E,KAAK,aAAc,KAAM,IAAIjgC,GAAwBkgC,EAAS,CAAE,CAAE,EAElE,KAAK,qBAAqB,EAI1B,SAASC,EAAU/4C,EAAQ,CAE1B,IAAMg5C,EAAc,CAAC,EAIfC,EAAgBl5C,EAAQ,gBAAkB,OAAYA,EAAQ,cAAgB,GAC9Em5C,EAAQn5C,EAAQ,QAAU,OAAYA,EAAQ,MAAQ,EACtD42B,EAAQ52B,EAAQ,QAAU,OAAYA,EAAQ,MAAQ,EAExDo5C,EAAep5C,EAAQ,eAAiB,OAAYA,EAAQ,aAAe,GAC3Eq5C,EAAiBr5C,EAAQ,iBAAmB,OAAYA,EAAQ,eAAiB,GACjFs5C,EAAYt5C,EAAQ,YAAc,OAAYA,EAAQ,UAAYq5C,EAAiB,GACnFE,EAAcv5C,EAAQ,cAAgB,OAAYA,EAAQ,YAAc,EACxEw5C,EAAgBx5C,EAAQ,gBAAkB,OAAYA,EAAQ,cAAgB,EAE5Ey5C,EAAcz5C,EAAQ,YAEtB05C,EAAQ15C,EAAQ,cAAgB,OAAYA,EAAQ,YAAc0iB,IAIpEi3B,EAAYC,EAAgB,GAC5BC,EAAYC,EAAU7lD,EAAQ8lD,EAElC,GAAKN,EAAc,CAElBE,EAAaF,EAAY,gBAAiBN,CAAM,EAEhDS,EAAgB,GAChBR,EAAe,GAIf,IAAMY,GAAWP,EAAY,mBAAqBA,EAAY,OAAS,GAEvEI,EAAaJ,EAAY,oBAAqBN,EAAOa,EAAS,EAI9DF,EAAW,IAAItlD,EACfP,EAAS,IAAIO,EACbulD,EAAY,IAAIvlD,CAEjB,CAIO4kD,IAENI,EAAgB,EAChBH,EAAiB,EACjBC,EAAY,EACZC,EAAc,GAMf,IAAMU,EAAch6C,EAAM,cAAei5C,CAAc,EAEnDt5C,EAAWq6C,EAAY,MACrBvB,EAAQuB,EAAY,MAI1B,GAFgB,CAAEz3B,GAAW,YAAa5iB,CAAS,EAEpC,CAEdA,EAAWA,EAAS,QAAQ,EAI5B,QAAU80B,GAAI,EAAGwlB,GAAKxB,EAAM,OAAQhkB,GAAIwlB,GAAIxlB,KAAO,CAElD,IAAMylB,GAAQzB,EAAOhkB,EAAE,EAElBlS,GAAW,YAAa23B,EAAM,IAElCzB,EAAOhkB,EAAE,EAAIylB,GAAM,QAAQ,EAI7B,CAED,CAKA,SAASC,EAAwB36C,GAAS,CAGzC,IAAM46C,GAAe,sBACjBC,GAAU76C,GAAQ,CAAE,EACxB,QAAU3V,GAAI,EAAGA,IAAK2V,GAAO,OAAQ3V,KAAO,CAE3C,IAAMywD,GAAezwD,GAAI2V,GAAO,OAC1B+6C,GAAa/6C,GAAQ86C,EAAa,EAClCzsB,GAAK0sB,GAAW,EAAIF,GAAQ,EAC5BvsB,GAAKysB,GAAW,EAAIF,GAAQ,EAC5BG,EAAS3sB,GAAKA,GAAKC,GAAKA,GAExB2sB,EAAoB,KAAK,IAC9B,KAAK,IAAKF,GAAW,CAAE,EACvB,KAAK,IAAKA,GAAW,CAAE,EACvB,KAAK,IAAKF,GAAQ,CAAE,EACpB,KAAK,IAAKA,GAAQ,CAAE,CACrB,EACMK,GAAoBN,GAAeK,EAAoBA,EAC7D,GAAKD,GAAUE,GAAoB,CAElCl7C,GAAO,OAAQ86C,GAAc,CAAE,EAC/BzwD,KACA,QAED,CAEAwwD,GAAUE,EAEX,CAED,CAEAJ,EAAwBx6C,CAAS,EACjC84C,EAAM,QAAS0B,CAAuB,EAEtC,IAAMQ,EAAWlC,EAAM,OAIjB74C,EAAUD,EAEhB,QAAU80B,GAAI,EAAGA,GAAIkmB,EAAUlmB,KAAO,CAErC,IAAMylB,GAAQzB,EAAOhkB,EAAE,EAEvB90B,EAAWA,EAAS,OAAQu6C,EAAM,CAEnC,CAGA,SAASU,EAAUC,GAAI3E,GAAKpf,GAAO,CAElC,OAAOof,IAAMnrD,GAAO,qCAAsC,EAEnD8vD,GAAG,MAAM,EAAE,gBAAiB3E,GAAKpf,EAAK,CAE9C,CAEA,IAAMgkB,EAAOn7C,EAAS,OAMtB,SAASo7C,EAAaC,GAAMC,GAAQC,GAAS,CAS5C,IAAIC,GAAWC,GAAWC,GAKpBC,GAAWN,GAAK,EAAIC,GAAO,EAChCM,GAAWP,GAAK,EAAIC,GAAO,EACtBO,GAAWN,GAAO,EAAIF,GAAK,EAChCS,EAAWP,GAAO,EAAIF,GAAK,EAEtBU,EAAiBJ,GAAWA,GAAWC,GAAWA,GAGlDI,GAAeL,GAAWG,EAAWF,GAAWC,GAEtD,GAAK,KAAK,IAAKG,EAAW,EAAI,OAAO,QAAU,CAM9C,IAAMC,GAAa,KAAK,KAAMF,CAAa,EACrCG,GAAa,KAAK,KAAML,GAAWA,GAAWC,EAAWA,CAAS,EAIlEK,GAAkBb,GAAO,EAAIM,GAAWK,GACxCG,GAAkBd,GAAO,EAAIK,GAAWM,GAExCI,GAAkBd,GAAO,EAAIO,EAAWI,GACxCI,GAAkBf,GAAO,EAAIM,GAAWK,GAIxCK,KAASF,GAAgBF,IAAkBL,GAC7CQ,GAAgBF,IAAkBP,KACnCF,GAAWG,EAAWF,GAAWC,IAIpCL,GAAcW,GAAgBR,GAAWY,GAAKlB,GAAK,EACnDI,GAAcW,GAAgBR,GAAWW,GAAKlB,GAAK,EAInD,IAAMmB,GAAkBhB,GAAYA,GAAYC,GAAYA,GAC5D,GAAKe,IAAiB,EAErB,OAAO,IAAI1nD,GAAS0mD,GAAWC,EAAU,EAIzCC,GAAY,KAAK,KAAMc,GAAgB,CAAE,CAI3C,KAAO,CAIN,IAAIC,GAAe,GAEdd,GAAW,OAAO,QAEjBE,GAAW,OAAO,UAEtBY,GAAe,IAMXd,GAAW,CAAE,OAAO,QAEnBE,GAAW,CAAE,OAAO,UAExBY,GAAe,IAMX,KAAK,KAAMb,EAAS,IAAM,KAAK,KAAME,CAAS,IAElDW,GAAe,IAQbA,IAGJjB,GAAY,CAAEI,GACdH,GAAYE,GACZD,GAAY,KAAK,KAAMK,CAAa,IAKpCP,GAAYG,GACZF,GAAYG,GACZF,GAAY,KAAK,KAAMK,EAAe,CAAE,EAI1C,CAEA,OAAO,IAAIjnD,GAAS0mD,GAAYE,GAAWD,GAAYC,EAAU,CAElE,CAGA,IAAMgB,EAAmB,CAAC,EAE1B,QAAUxyD,GAAI,EAAG+sC,GAAKh3B,EAAQ,OAAQnO,GAAImlC,GAAK,EAAGh+B,GAAI/O,GAAI,EAAGA,GAAI+sC,GAAI/sC,KAAM4H,KAAMmH,KAE3EnH,KAAMmlC,KAAKnlC,GAAI,GACfmH,KAAMg+B,KAAKh+B,GAAI,GAKpByjD,EAAkBxyD,EAAE,EAAIkxD,EAAan7C,EAAS/V,EAAE,EAAG+V,EAASnO,EAAE,EAAGmO,EAAShH,EAAE,CAAE,EAI/E,IAAM0jD,EAAiB,CAAC,EACpBC,EAAkBC,GAAoBH,EAAiB,OAAO,EAElE,QAAU5nB,GAAI,EAAGwlB,GAAKU,EAAUlmB,GAAIwlB,GAAIxlB,KAAO,CAE9C,IAAMylB,GAAQzB,EAAOhkB,EAAE,EAEvB8nB,EAAmB,CAAC,EAEpB,QAAU1yD,GAAI,EAAG+sC,GAAKsjB,GAAM,OAAQzoD,GAAImlC,GAAK,EAAGh+B,GAAI/O,GAAI,EAAGA,GAAI+sC,GAAI/sC,KAAM4H,KAAMmH,KAEzEnH,KAAMmlC,KAAKnlC,GAAI,GACfmH,KAAMg+B,KAAKh+B,GAAI,GAGpB2jD,EAAkB1yD,EAAE,EAAIkxD,EAAab,GAAOrwD,EAAE,EAAGqwD,GAAOzoD,EAAE,EAAGyoD,GAAOthD,EAAE,CAAE,EAIzE0jD,EAAe,KAAMC,CAAiB,EACtCC,GAAoBA,GAAkB,OAAQD,CAAiB,CAEhE,CAEA,IAAI7D,GAEJ,GAAKa,IAAkB,EAEtBb,GAAQn2B,GAAW,iBAAkB3iB,EAAS64C,CAAM,MAE9C,CAEN,IAAMgE,GAA4B,CAAC,EAC7BC,GAAuB,CAAC,EAI9B,QAAU9tD,GAAI,EAAGA,GAAI2qD,EAAe3qD,KAAO,CAI1C,IAAMb,GAAIa,GAAI2qD,EACR50C,GAAIy0C,EAAiB,KAAK,IAAKrrD,GAAI,KAAK,GAAK,CAAE,EAC/C4uD,GAAKtD,EAAY,KAAK,IAAKtrD,GAAI,KAAK,GAAK,CAAE,EAAIurD,EAIrD,QAAUzvD,GAAI,EAAG+sC,GAAKh3B,EAAQ,OAAQ/V,GAAI+sC,GAAI/sC,KAAO,CAEpD,IAAM+yD,GAAOhC,EAAUh7C,EAAS/V,EAAE,EAAGwyD,EAAkBxyD,EAAE,EAAG8yD,EAAG,EAE/DnvB,GAAGovB,GAAK,EAAGA,GAAK,EAAG,CAAEj4C,EAAE,EAClB5W,KAAM,GAAI0uD,GAA0B,KAAMG,EAAK,CAErD,CAIA,QAAUnoB,GAAI,EAAGwlB,GAAKU,EAAUlmB,GAAIwlB,GAAIxlB,KAAO,CAE9C,IAAMylB,GAAQzB,EAAOhkB,EAAE,EACvB8nB,EAAmBD,EAAgB7nB,EAAE,EACrC,IAAMooB,EAAkB,CAAC,EACzB,QAAUhzD,EAAI,EAAG+sC,GAAKsjB,GAAM,OAAQrwD,EAAI+sC,GAAI/sC,IAAO,CAElD,IAAM+yD,GAAOhC,EAAUV,GAAOrwD,CAAE,EAAG0yD,EAAkB1yD,CAAE,EAAG8yD,EAAG,EAE7DnvB,GAAGovB,GAAK,EAAGA,GAAK,EAAG,CAAEj4C,EAAE,EAClB5W,KAAM,GAAI8uD,EAAgB,KAAMD,EAAK,CAE3C,CAEK7uD,KAAM,GAAI2uD,GAAqB,KAAMG,CAAgB,CAE3D,CAED,CAEAnE,GAAQn2B,GAAW,iBAAkBk6B,GAA2BC,EAAqB,CAEtF,CAEA,IAAMI,GAAOpE,GAAM,OAEbiE,GAAKtD,EAAYC,EAIvB,QAAUzvD,GAAI,EAAGA,GAAIixD,EAAMjxD,KAAO,CAEjC,IAAM+yD,GAAOzD,EAAeyB,EAAUj7C,EAAU9V,EAAE,EAAG2yD,GAAmB3yD,EAAE,EAAG8yD,EAAG,EAAIh9C,EAAU9V,EAAE,EAEzF8vD,GAQN3lD,EAAO,KAAM4lD,EAAW,QAAS,CAAE,CAAE,EAAE,eAAgBgD,GAAK,CAAE,EAC9D/C,EAAS,KAAMD,EAAW,UAAW,CAAE,CAAE,EAAE,eAAgBgD,GAAK,CAAE,EAElE9C,EAAU,KAAMJ,EAAY,CAAE,CAAE,EAAE,IAAK1lD,CAAO,EAAE,IAAK6lD,CAAS,EAE9DrsB,GAAGssB,EAAU,EAAGA,EAAU,EAAGA,EAAU,CAAE,GAXzCtsB,GAAGovB,GAAK,EAAGA,GAAK,EAAG,CAAE,CAevB,CAKA,QAAU/uD,GAAI,EAAGA,IAAKqrD,EAAOrrD,KAE5B,QAAUhE,GAAI,EAAGA,GAAIixD,EAAMjxD,KAAO,CAEjC,IAAM+yD,GAAOzD,EAAeyB,EAAUj7C,EAAU9V,EAAE,EAAG2yD,GAAmB3yD,EAAE,EAAG8yD,EAAG,EAAIh9C,EAAU9V,EAAE,EAEzF8vD,GAQN3lD,EAAO,KAAM4lD,EAAW,QAAS/rD,EAAE,CAAE,EAAE,eAAgB+uD,GAAK,CAAE,EAC9D/C,EAAS,KAAMD,EAAW,UAAW/rD,EAAE,CAAE,EAAE,eAAgB+uD,GAAK,CAAE,EAElE9C,EAAU,KAAMJ,EAAY7rD,EAAE,CAAE,EAAE,IAAKmG,CAAO,EAAE,IAAK6lD,CAAS,EAE9DrsB,GAAGssB,EAAU,EAAGA,EAAU,EAAGA,EAAU,CAAE,GAXzCtsB,GAAGovB,GAAK,EAAGA,GAAK,EAAGjmB,EAAQuiB,EAAQrrD,EAAE,CAevC,CAQD,QAAUe,GAAI2qD,EAAgB,EAAG3qD,IAAK,EAAGA,KAAO,CAE/C,IAAMb,GAAIa,GAAI2qD,EACR50C,GAAIy0C,EAAiB,KAAK,IAAKrrD,GAAI,KAAK,GAAK,CAAE,EAC/C4uD,GAAKtD,EAAY,KAAK,IAAKtrD,GAAI,KAAK,GAAK,CAAE,EAAIurD,EAIrD,QAAUzvD,GAAI,EAAG+sC,GAAKh3B,EAAQ,OAAQ/V,GAAI+sC,GAAI/sC,KAAO,CAEpD,IAAM+yD,GAAOhC,EAAUh7C,EAAS/V,EAAE,EAAGwyD,EAAkBxyD,EAAE,EAAG8yD,EAAG,EAC/DnvB,GAAGovB,GAAK,EAAGA,GAAK,EAAGjmB,EAAQhyB,EAAE,CAE9B,CAIA,QAAU8vB,GAAI,EAAGwlB,GAAKxB,EAAM,OAAQhkB,GAAIwlB,GAAIxlB,KAAO,CAElD,IAAMylB,GAAQzB,EAAOhkB,EAAE,EACvB8nB,EAAmBD,EAAgB7nB,EAAE,EAErC,QAAU5qC,GAAI,EAAG+sC,GAAKsjB,GAAM,OAAQrwD,GAAI+sC,GAAI/sC,KAAO,CAElD,IAAM+yD,EAAOhC,EAAUV,GAAOrwD,EAAE,EAAG0yD,EAAkB1yD,EAAE,EAAG8yD,EAAG,EAEtDhD,EAMNnsB,GAAGovB,EAAK,EAAGA,EAAK,EAAIlD,EAAYR,EAAQ,CAAE,EAAE,EAAGQ,EAAYR,EAAQ,CAAE,EAAE,EAAIv0C,EAAE,EAJ7E6oB,GAAGovB,EAAK,EAAGA,EAAK,EAAGjmB,EAAQhyB,EAAE,CAQ/B,CAED,CAED,CAMAo4C,EAAc,EAIdC,GAAe,EAKf,SAASD,GAAgB,CAExB,IAAM1iD,GAAQw+C,EAAc,OAAS,EAErC,GAAKM,EAAe,CAEnB,IAAIxb,GAAQ,EACR3P,GAAS8sB,EAAOnd,GAIpB,QAAU9zC,GAAI,EAAGA,GAAIizD,GAAMjzD,KAAO,CAEjC,IAAM6K,GAAOgkD,GAAO7uD,EAAE,EACtBozD,GAAIvoD,GAAM,CAAE,EAAIs5B,GAAQt5B,GAAM,CAAE,EAAIs5B,GAAQt5B,GAAM,CAAE,EAAIs5B,EAAO,CAEhE,CAEA2P,GAAQub,EAAQK,EAAgB,EAChCvrB,GAAS8sB,EAAOnd,GAIhB,QAAU9zC,GAAI,EAAGA,GAAIizD,GAAMjzD,KAAO,CAEjC,IAAM6K,GAAOgkD,GAAO7uD,EAAE,EACtBozD,GAAIvoD,GAAM,CAAE,EAAIs5B,GAAQt5B,GAAM,CAAE,EAAIs5B,GAAQt5B,GAAM,CAAE,EAAIs5B,EAAO,CAEhE,CAED,KAAO,CAIN,QAAUnkC,GAAI,EAAGA,GAAIizD,GAAMjzD,KAAO,CAEjC,IAAM6K,GAAOgkD,GAAO7uD,EAAE,EACtBozD,GAAIvoD,GAAM,CAAE,EAAGA,GAAM,CAAE,EAAGA,GAAM,CAAE,CAAE,CAErC,CAIA,QAAU7K,GAAI,EAAGA,GAAIizD,GAAMjzD,KAAO,CAEjC,IAAM6K,GAAOgkD,GAAO7uD,EAAE,EACtBozD,GAAIvoD,GAAM,CAAE,EAAIomD,EAAO5B,EAAOxkD,GAAM,CAAE,EAAIomD,EAAO5B,EAAOxkD,GAAM,CAAE,EAAIomD,EAAO5B,CAAM,CAElF,CAED,CAEA5T,EAAM,SAAUjrC,GAAOw+C,EAAc,OAAS,EAAIx+C,GAAO,CAAE,CAE5D,CAIA,SAAS2iD,IAAiB,CAEzB,IAAM3iD,GAAQw+C,EAAc,OAAS,EACjCqE,GAAc,EAClBC,GAAWv9C,EAASs9C,EAAY,EAChCA,IAAet9C,EAAQ,OAEvB,QAAU60B,GAAI,EAAGwlB,GAAKxB,EAAM,OAAQhkB,GAAIwlB,GAAIxlB,KAAO,CAElD,IAAMylB,GAAQzB,EAAOhkB,EAAE,EACvB0oB,GAAWjD,GAAOgD,EAAY,EAG9BA,IAAehD,GAAM,MAEtB,CAGA5U,EAAM,SAAUjrC,GAAOw+C,EAAc,OAAS,EAAIx+C,GAAO,CAAE,CAG5D,CAEA,SAAS8iD,GAAWv9C,GAASs9C,GAAc,CAE1C,IAAIrzD,GAAI+V,GAAQ,OAEhB,KAAQ,EAAG/V,IAAK,GAAI,CAEnB,IAAM4H,GAAI5H,GACN+O,GAAI/O,GAAI,EACP+O,GAAI,IAAIA,GAAIgH,GAAQ,OAAS,GAIlC,QAAU/R,GAAI,EAAGuvD,GAAOlE,EAAQK,EAAgB,EAAK1rD,GAAIuvD,GAAIvvD,KAAO,CAEnE,IAAMwvD,GAAQvC,EAAOjtD,GACfyvD,GAAQxC,GAASjtD,GAAI,GAErBc,EAAIuuD,GAAczrD,GAAI4rD,GAC3BzuD,EAAIsuD,GAActkD,GAAIykD,GACtBxuD,GAAIquD,GAActkD,GAAI0kD,GACtB/oB,GAAI2oB,GAAczrD,GAAI6rD,GAEvBC,GAAI5uD,EAAGC,EAAGC,GAAG0lC,EAAE,CAEhB,CAED,CAED,CAEA,SAAS/G,GAAGjhC,GAAGM,GAAG8X,GAAI,CAErBq0C,EAAY,KAAMzsD,EAAE,EACpBysD,EAAY,KAAMnsD,EAAE,EACpBmsD,EAAY,KAAMr0C,EAAE,CAErB,CAGA,SAASs4C,GAAItuD,GAAGC,GAAGC,GAAI,CAEtB2uD,GAAW7uD,EAAE,EACb6uD,GAAW5uD,EAAE,EACb4uD,GAAW3uD,EAAE,EAEb,IAAM4uD,GAAY5E,EAAc,OAAS,EACnCtT,GAAMkU,EAAM,cAAenU,EAAOuT,EAAe4E,GAAY,EAAGA,GAAY,EAAGA,GAAY,CAAE,EAEnGC,GAAOnY,GAAK,CAAE,CAAE,EAChBmY,GAAOnY,GAAK,CAAE,CAAE,EAChBmY,GAAOnY,GAAK,CAAE,CAAE,CAEjB,CAEA,SAASgY,GAAI5uD,GAAGC,GAAGC,GAAG0lC,GAAI,CAEzBipB,GAAW7uD,EAAE,EACb6uD,GAAW5uD,EAAE,EACb4uD,GAAWjpB,EAAE,EAEbipB,GAAW5uD,EAAE,EACb4uD,GAAW3uD,EAAE,EACb2uD,GAAWjpB,EAAE,EAGb,IAAMkpB,GAAY5E,EAAc,OAAS,EACnCtT,GAAMkU,EAAM,mBAAoBnU,EAAOuT,EAAe4E,GAAY,EAAGA,GAAY,EAAGA,GAAY,EAAGA,GAAY,CAAE,EAEvHC,GAAOnY,GAAK,CAAE,CAAE,EAChBmY,GAAOnY,GAAK,CAAE,CAAE,EAChBmY,GAAOnY,GAAK,CAAE,CAAE,EAEhBmY,GAAOnY,GAAK,CAAE,CAAE,EAChBmY,GAAOnY,GAAK,CAAE,CAAE,EAChBmY,GAAOnY,GAAK,CAAE,CAAE,CAEjB,CAEA,SAASiY,GAAWvmD,GAAQ,CAE3B4hD,EAAc,KAAMG,EAAa/hD,GAAQ,EAAI,CAAE,CAAE,EACjD4hD,EAAc,KAAMG,EAAa/hD,GAAQ,EAAI,CAAE,CAAE,EACjD4hD,EAAc,KAAMG,EAAa/hD,GAAQ,EAAI,CAAE,CAAE,CAElD,CAGA,SAASymD,GAAOC,GAAU,CAEzB7E,EAAQ,KAAM6E,GAAQ,CAAE,EACxB7E,EAAQ,KAAM6E,GAAQ,CAAE,CAEzB,CAED,CAED,CAEA,KAAM3nB,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,WAAa,OAAO,OAAQ,CAAC,EAAGA,EAAO,UAAW,EAEhD,IAER,CAEA,QAAS,CAER,IAAM18B,EAAO,MAAM,OAAO,EAEpBwG,EAAS,KAAK,WAAW,OACzBC,EAAU,KAAK,WAAW,QAEhC,OAAOF,IAAUC,EAAQC,EAASzG,CAAK,CAExC,CAUA,OAAO,SAAUA,EAAMwG,EAAS,CAE/B,IAAM89C,EAAiB,CAAC,EAExB,QAAUnsD,EAAI,EAAG2wC,EAAK9oC,EAAK,OAAO,OAAQ7H,EAAI2wC,EAAI3wC,IAAO,CAExD,IAAMuO,EAAQF,EAAQxG,EAAK,OAAQ7H,CAAE,CAAE,EAEvCmsD,EAAe,KAAM59C,CAAM,CAE5B,CAEA,IAAMw5C,EAAclgD,EAAK,QAAQ,YAEjC,OAAKkgD,IAAgB,SAEpBlgD,EAAK,QAAQ,YAAc,IAAI4oB,GAAQs3B,EAAY,IAAK,EAAE,EAAE,SAAUA,CAAY,GAI5E,IAAIZ,EAAiBgF,EAAgBtkD,EAAK,OAAQ,CAE1D,CAED,EAEMmpB,IAAmB,CAExB,cAAe,SAAWhe,EAAU9E,EAAUk+C,EAAQC,EAAQC,EAAS,CAEtE,IAAMC,EAAMr+C,EAAUk+C,EAAS,CAAE,EAC3BI,EAAMt+C,EAAUk+C,EAAS,EAAI,CAAE,EAC/BK,EAAMv+C,EAAUm+C,EAAS,CAAE,EAC3BK,EAAMx+C,EAAUm+C,EAAS,EAAI,CAAE,EAC/BM,EAAMz+C,EAAUo+C,EAAS,CAAE,EAC3BM,EAAM1+C,EAAUo+C,EAAS,EAAI,CAAE,EAErC,MAAO,CACN,IAAItpD,GAASupD,EAAKC,CAAI,EACtB,IAAIxpD,GAASypD,EAAKC,CAAI,EACtB,IAAI1pD,GAAS2pD,EAAKC,CAAI,CACvB,CAED,EAEA,mBAAoB,SAAW55C,EAAU9E,EAAUk+C,EAAQC,EAAQC,EAAQO,EAAS,CAEnF,IAAMN,EAAMr+C,EAAUk+C,EAAS,CAAE,EAC3BI,EAAMt+C,EAAUk+C,EAAS,EAAI,CAAE,EAC/BU,EAAM5+C,EAAUk+C,EAAS,EAAI,CAAE,EAC/BK,EAAMv+C,EAAUm+C,EAAS,CAAE,EAC3BK,EAAMx+C,EAAUm+C,EAAS,EAAI,CAAE,EAC/BU,EAAM7+C,EAAUm+C,EAAS,EAAI,CAAE,EAC/BM,EAAMz+C,EAAUo+C,EAAS,CAAE,EAC3BM,EAAM1+C,EAAUo+C,EAAS,EAAI,CAAE,EAC/BU,EAAM9+C,EAAUo+C,EAAS,EAAI,CAAE,EAC/BW,EAAM/+C,EAAU2+C,EAAS,CAAE,EAC3BK,EAAMh/C,EAAU2+C,EAAS,EAAI,CAAE,EAC/BM,EAAMj/C,EAAU2+C,EAAS,EAAI,CAAE,EAErC,OAAK,KAAK,IAAKL,EAAME,CAAI,EAAI,KAAK,IAAKH,EAAME,CAAI,EAEzC,CACN,IAAIzpD,GAASupD,EAAK,EAAIO,CAAI,EAC1B,IAAI9pD,GAASypD,EAAK,EAAIM,CAAI,EAC1B,IAAI/pD,GAAS2pD,EAAK,EAAIK,CAAI,EAC1B,IAAIhqD,GAASiqD,EAAK,EAAIE,CAAI,CAC3B,EAIO,CACN,IAAInqD,GAASwpD,EAAK,EAAIM,CAAI,EAC1B,IAAI9pD,GAAS0pD,EAAK,EAAIK,CAAI,EAC1B,IAAI/pD,GAAS4pD,EAAK,EAAII,CAAI,EAC1B,IAAIhqD,GAASkqD,EAAK,EAAIC,CAAI,CAC3B,CAIF,CAED,EA2CMl8B,GAAN,MAAMm8B,UAA4B99B,EAAmB,CAQpD,YAAagR,EAAS,EAAGghB,EAAS,EAAI,CAErC,IAAMhlD,GAAM,EAAI,KAAK,KAAM,CAAE,GAAM,EAE7B4R,EAAW,CAChB,GAAI5R,EAAG,EAAI,EAAGA,EAAG,EAAI,GAAI,CAAEA,EAAG,EAAI,EAAG,CAAEA,EAAG,EAC1C,EAAG,GAAIA,EAAI,EAAG,EAAGA,EAAG,EAAG,GAAI,CAAEA,EAAI,EAAG,EAAG,CAAEA,EACzCA,EAAG,EAAG,GAAKA,EAAG,EAAG,EAAI,CAAEA,EAAG,EAAG,GAAK,CAAEA,EAAG,EAAG,CAC3C,EAEMi2C,EAAU,CACf,EAAG,GAAI,EAAI,EAAG,EAAG,EAAI,EAAG,EAAG,EAAI,EAAG,EAAG,GAAK,EAAG,GAAI,GACjD,EAAG,EAAG,EAAI,EAAG,GAAI,EAAG,GAAI,GAAI,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAC/C,EAAG,EAAG,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAC3C,EAAG,EAAG,EAAI,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,EAAG,EAAG,CAC9C,EAEA,MAAOrkC,EAAUqkC,EAASjS,EAAQghB,CAAO,EAEzC,KAAK,KAAO,sBASZ,KAAK,WAAa,CACjB,OAAQhhB,EACR,OAAQghB,CACT,CAED,CASA,OAAO,SAAUz5C,EAAO,CAEvB,OAAO,IAAIulD,EAAqBvlD,EAAK,OAAQA,EAAK,MAAO,CAE1D,CAED,EAmBMqpB,GAAN,MAAMm8B,UAAsB1lC,EAAe,CAY1C,YAAa5Z,EAAS,CAAE,IAAI/K,GAAS,EAAG,GAAK,EAAG,IAAIA,GAAS,GAAK,CAAE,EAAG,IAAIA,GAAS,EAAG,EAAI,CAAE,EAAGs9C,EAAW,GAAIgN,EAAW,EAAGC,EAAY,KAAK,GAAK,EAAI,CAEtJ,MAAM,EAEN,KAAK,KAAO,gBASZ,KAAK,WAAa,CACjB,OAAQx/C,EACR,SAAUuyC,EACV,SAAUgN,EACV,UAAWC,CACZ,EAEAjN,EAAW,KAAK,MAAOA,CAAS,EAIhCiN,EAAYjzD,GAAOizD,EAAW,EAAG,KAAK,GAAK,CAAE,EAI7C,IAAMhb,EAAU,CAAC,EACXrkC,EAAW,CAAC,EACZ4lC,EAAM,CAAC,EACP0Z,EAAc,CAAC,EACfnb,EAAU,CAAC,EAIXob,EAAkB,EAAMnN,EACxBZ,EAAS,IAAI58C,EACbT,EAAK,IAAIW,GACTT,EAAS,IAAIO,EACb4qD,EAAY,IAAI5qD,EAChB6qD,EAAa,IAAI7qD,EACnBs5B,EAAK,EACLC,EAAK,EAIT,QAAUr8B,EAAI,EAAGA,GAAO+N,EAAO,OAAS,EAAK/N,IAE5C,OAASA,EAAI,CAEZ,IAAK,GAEJo8B,EAAKruB,EAAQ/N,EAAI,CAAE,EAAE,EAAI+N,EAAQ/N,CAAE,EAAE,EACrCq8B,EAAKtuB,EAAQ/N,EAAI,CAAE,EAAE,EAAI+N,EAAQ/N,CAAE,EAAE,EAErCuC,EAAO,EAAI85B,EAAK,EAChB95B,EAAO,EAAI,CAAE65B,EACb75B,EAAO,EAAI85B,EAAK,EAEhBsxB,EAAW,KAAMprD,CAAO,EAExBA,EAAO,UAAU,EAEjBirD,EAAY,KAAMjrD,EAAO,EAAGA,EAAO,EAAGA,EAAO,CAAE,EAE/C,MAED,KAAOwL,EAAO,OAAS,EAEtBy/C,EAAY,KAAMG,EAAW,EAAGA,EAAW,EAAGA,EAAW,CAAE,EAE3D,MAED,QAECvxB,EAAKruB,EAAQ/N,EAAI,CAAE,EAAE,EAAI+N,EAAQ/N,CAAE,EAAE,EACrCq8B,EAAKtuB,EAAQ/N,EAAI,CAAE,EAAE,EAAI+N,EAAQ/N,CAAE,EAAE,EAErCuC,EAAO,EAAI85B,EAAK,EAChB95B,EAAO,EAAI,CAAE65B,EACb75B,EAAO,EAAI85B,EAAK,EAEhBqxB,EAAU,KAAMnrD,CAAO,EAEvBA,EAAO,GAAKorD,EAAW,EACvBprD,EAAO,GAAKorD,EAAW,EACvBprD,EAAO,GAAKorD,EAAW,EAEvBprD,EAAO,UAAU,EAEjBirD,EAAY,KAAMjrD,EAAO,EAAGA,EAAO,EAAGA,EAAO,CAAE,EAE/CorD,EAAW,KAAMD,CAAU,CAE7B,CAMD,QAAUt1D,EAAI,EAAGA,GAAKkoD,EAAUloD,IAAO,CAEtC,IAAMmoC,EAAM+sB,EAAWl1D,EAAIq1D,EAAkBF,EAEvChwD,EAAM,KAAK,IAAKgjC,CAAI,EACpBjjC,EAAM,KAAK,IAAKijC,CAAI,EAE1B,QAAUvgC,EAAI,EAAGA,GAAO+N,EAAO,OAAS,EAAK/N,IAAO,CAInD0/C,EAAO,EAAI3xC,EAAQ/N,CAAE,EAAE,EAAIzC,EAC3BmiD,EAAO,EAAI3xC,EAAQ/N,CAAE,EAAE,EACvB0/C,EAAO,EAAI3xC,EAAQ/N,CAAE,EAAE,EAAI1C,EAE3B4Q,EAAS,KAAMwxC,EAAO,EAAGA,EAAO,EAAGA,EAAO,CAAE,EAI5Cr9C,EAAG,EAAIjK,EAAIkoD,EACXj+C,EAAG,EAAIrC,GAAM+N,EAAO,OAAS,GAE7B+lC,EAAI,KAAMzxC,EAAG,EAAGA,EAAG,CAAE,EAIrB,IAAMvH,EAAI0yD,EAAa,EAAIxtD,EAAI,CAAE,EAAIzC,EAC/BnC,EAAIoyD,EAAa,EAAIxtD,EAAI,CAAE,EAC3BkT,EAAIs6C,EAAa,EAAIxtD,EAAI,CAAE,EAAI1C,EAErC+0C,EAAQ,KAAMv3C,EAAGM,EAAG8X,CAAE,CAEvB,CAED,CAIA,QAAU9a,EAAI,EAAGA,EAAIkoD,EAAUloD,IAE9B,QAAU4H,EAAI,EAAGA,EAAM+N,EAAO,OAAS,EAAK/N,IAAO,CAElD,IAAM4tD,EAAO5tD,EAAI5H,EAAI2V,EAAO,OAEtB7Q,EAAI0wD,EACJzwD,EAAIywD,EAAO7/C,EAAO,OAClB3Q,EAAIwwD,EAAO7/C,EAAO,OAAS,EAC3B+0B,EAAI8qB,EAAO,EAIjBrb,EAAQ,KAAMr1C,EAAGC,EAAG2lC,CAAE,EACtByP,EAAQ,KAAMn1C,EAAG0lC,EAAG3lC,CAAE,CAEvB,CAMD,KAAK,SAAUo1C,CAAQ,EACvB,KAAK,aAAc,WAAY,IAAIprB,GAAwBjZ,EAAU,CAAE,CAAE,EACzE,KAAK,aAAc,KAAM,IAAIiZ,GAAwB2sB,EAAK,CAAE,CAAE,EAC9D,KAAK,aAAc,SAAU,IAAI3sB,GAAwBkrB,EAAS,CAAE,CAAE,CAEvE,CAEA,KAAM9N,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,WAAa,OAAO,OAAQ,CAAC,EAAGA,EAAO,UAAW,EAEhD,IAER,CASA,OAAO,SAAU18B,EAAO,CAEvB,OAAO,IAAIwlD,EAAexlD,EAAK,OAAQA,EAAK,SAAUA,EAAK,SAAUA,EAAK,SAAU,CAErF,CAED,EAeMspB,GAAN,MAAM08B,UAA2Bv+B,EAAmB,CAQnD,YAAagR,EAAS,EAAGghB,EAAS,EAAI,CAErC,IAAMpzC,EAAW,CAChB,EAAG,EAAG,EAAI,GAAI,EAAG,EAAG,EAAG,EAAG,EAC1B,EAAG,GAAI,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAC3B,EAEMqkC,EAAU,CACf,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EACxB,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EACxB,EAAG,EAAG,EAAG,EAAG,EAAG,CAChB,EAEA,MAAOrkC,EAAUqkC,EAASjS,EAAQghB,CAAO,EAEzC,KAAK,KAAO,qBASZ,KAAK,WAAa,CACjB,OAAQhhB,EACR,OAAQghB,CACT,CAED,CASA,OAAO,SAAUz5C,EAAO,CAEvB,OAAO,IAAIgmD,EAAoBhmD,EAAK,OAAQA,EAAK,MAAO,CAEzD,CAED,EAeMupB,GAAN,MAAM08B,UAAsBnmC,EAAe,CAU1C,YAAa/T,EAAQ,EAAGC,EAAS,EAAG6/B,EAAgB,EAAGC,EAAiB,EAAI,CAE3E,MAAM,EAEN,KAAK,KAAO,gBASZ,KAAK,WAAa,CACjB,MAAO//B,EACP,OAAQC,EACR,cAAe6/B,EACf,eAAgBC,CACjB,EAEA,IAAMoa,EAAan6C,EAAQ,EACrBo6C,EAAcn6C,EAAS,EAEvBugC,EAAQ,KAAK,MAAOV,CAAc,EAClCW,EAAQ,KAAK,MAAOV,CAAe,EAEnCgB,EAASP,EAAQ,EACjBQ,EAASP,EAAQ,EAEjB4Z,EAAgBr6C,EAAQwgC,EACxB8Z,EAAiBr6C,EAASwgC,EAI1B9B,EAAU,CAAC,EACXrkC,EAAW,CAAC,EACZmkC,EAAU,CAAC,EACXyB,EAAM,CAAC,EAEb,QAAUiB,EAAK,EAAGA,EAAKH,EAAQG,IAAQ,CAEtC,IAAM35C,EAAI25C,EAAKmZ,EAAiBF,EAEhC,QAAUhZ,EAAK,EAAGA,EAAKL,EAAQK,IAAQ,CAEtC,IAAMl6C,EAAIk6C,EAAKiZ,EAAgBF,EAE/B7/C,EAAS,KAAMpT,EAAG,CAAEM,EAAG,CAAE,EAEzBi3C,EAAQ,KAAM,EAAG,EAAG,CAAE,EAEtByB,EAAI,KAAMkB,EAAKZ,CAAM,EACrBN,EAAI,KAAM,EAAMiB,EAAKV,CAAQ,CAE9B,CAED,CAEA,QAAUU,EAAK,EAAGA,EAAKV,EAAOU,IAE7B,QAAUC,EAAK,EAAGA,EAAKZ,EAAOY,IAAQ,CAErC,IAAM93C,EAAI83C,EAAKL,EAASI,EAClB53C,EAAI63C,EAAKL,GAAWI,EAAK,GACzB33C,EAAM43C,EAAK,EAAML,GAAWI,EAAK,GACjCjS,EAAMkS,EAAK,EAAML,EAASI,EAEhCxC,EAAQ,KAAMr1C,EAAGC,EAAG2lC,CAAE,EACtByP,EAAQ,KAAMp1C,EAAGC,EAAG0lC,CAAE,CAEvB,CAID,KAAK,SAAUyP,CAAQ,EACvB,KAAK,aAAc,WAAY,IAAIprB,GAAwBjZ,EAAU,CAAE,CAAE,EACzE,KAAK,aAAc,SAAU,IAAIiZ,GAAwBkrB,EAAS,CAAE,CAAE,EACtE,KAAK,aAAc,KAAM,IAAIlrB,GAAwB2sB,EAAK,CAAE,CAAE,CAE/D,CAEA,KAAMvP,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,WAAa,OAAO,OAAQ,CAAC,EAAGA,EAAO,UAAW,EAEhD,IAER,CASA,OAAO,SAAU18B,EAAO,CAEvB,OAAO,IAAIimD,EAAejmD,EAAK,MAAOA,EAAK,OAAQA,EAAK,cAAeA,EAAK,cAAe,CAE5F,CAED,EAeMwpB,GAAN,MAAM88B,UAAqBxmC,EAAe,CAYzC,YAAaymC,EAAc,GAAKC,EAAc,EAAGC,EAAgB,GAAIC,EAAc,EAAGhO,EAAa,EAAGC,EAAc,KAAK,GAAK,EAAI,CAEjI,MAAM,EAEN,KAAK,KAAO,eASZ,KAAK,WAAa,CACjB,YAAa4N,EACb,YAAaC,EACb,cAAeC,EACf,YAAaC,EACb,WAAYhO,EACZ,YAAaC,CACd,EAEA8N,EAAgB,KAAK,IAAK,EAAGA,CAAc,EAC3CC,EAAc,KAAK,IAAK,EAAGA,CAAY,EAIvC,IAAMhc,EAAU,CAAC,EACXrkC,EAAW,CAAC,EACZmkC,EAAU,CAAC,EACXyB,EAAM,CAAC,EAITxT,EAAS8tB,EACPI,GAAiBH,EAAcD,GAAgBG,EAC/C7O,EAAS,IAAI58C,EACbT,EAAK,IAAIW,GAIf,QAAUhD,EAAI,EAAGA,GAAKuuD,EAAavuD,IAAO,CAEzC,QAAU5H,EAAI,EAAGA,GAAKk2D,EAAel2D,IAAO,CAI3C,IAAMqoD,EAAUF,EAAanoD,EAAIk2D,EAAgB9N,EAIjDd,EAAO,EAAIpf,EAAS,KAAK,IAAKmgB,CAAQ,EACtCf,EAAO,EAAIpf,EAAS,KAAK,IAAKmgB,CAAQ,EAEtCvyC,EAAS,KAAMwxC,EAAO,EAAGA,EAAO,EAAGA,EAAO,CAAE,EAI5CrN,EAAQ,KAAM,EAAG,EAAG,CAAE,EAItBhwC,EAAG,GAAMq9C,EAAO,EAAI2O,EAAc,GAAM,EACxChsD,EAAG,GAAMq9C,EAAO,EAAI2O,EAAc,GAAM,EAExCva,EAAI,KAAMzxC,EAAG,EAAGA,EAAG,CAAE,CAEtB,CAIAi+B,GAAUkuB,CAEX,CAIA,QAAUxuD,EAAI,EAAGA,EAAIuuD,EAAavuD,IAAO,CAExC,IAAMyuD,EAAoBzuD,GAAMsuD,EAAgB,GAEhD,QAAUl2D,EAAI,EAAGA,EAAIk2D,EAAel2D,IAAO,CAE1C,IAAMqoD,EAAUroD,EAAIq2D,EAEdvxD,EAAIujD,EACJtjD,EAAIsjD,EAAU6N,EAAgB,EAC9BlxD,EAAIqjD,EAAU6N,EAAgB,EAC9BxrB,EAAI2d,EAAU,EAIpBlO,EAAQ,KAAMr1C,EAAGC,EAAG2lC,CAAE,EACtByP,EAAQ,KAAMp1C,EAAGC,EAAG0lC,CAAE,CAEvB,CAED,CAIA,KAAK,SAAUyP,CAAQ,EACvB,KAAK,aAAc,WAAY,IAAIprB,GAAwBjZ,EAAU,CAAE,CAAE,EACzE,KAAK,aAAc,SAAU,IAAIiZ,GAAwBkrB,EAAS,CAAE,CAAE,EACtE,KAAK,aAAc,KAAM,IAAIlrB,GAAwB2sB,EAAK,CAAE,CAAE,CAE/D,CAEA,KAAMvP,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,WAAa,OAAO,OAAQ,CAAC,EAAGA,EAAO,UAAW,EAEhD,IAER,CASA,OAAO,SAAU18B,EAAO,CAEvB,OAAO,IAAIsmD,EAActmD,EAAK,YAAaA,EAAK,YAAaA,EAAK,cAAeA,EAAK,YAAaA,EAAK,WAAYA,EAAK,WAAY,CAEtI,CAED,EAmBMypB,GAAN,MAAMo9B,UAAsB/mC,EAAe,CAQ1C,YAAatZ,EAAS,IAAIuiB,GAAO,CAAE,IAAI5tB,GAAS,EAAG,EAAI,EAAG,IAAIA,GAAS,IAAM,GAAK,EAAG,IAAIA,GAAS,GAAK,GAAK,CAAE,CAAE,EAAGwkD,EAAgB,GAAK,CAEvI,MAAM,EAEN,KAAK,KAAO,gBASZ,KAAK,WAAa,CACjB,OAAQn5C,EACR,cAAem5C,CAChB,EAIA,IAAMjV,EAAU,CAAC,EACXrkC,EAAW,CAAC,EACZmkC,EAAU,CAAC,EACXyB,EAAM,CAAC,EAITE,EAAa,EACbc,EAAa,EAIjB,GAAK,MAAM,QAASzmC,CAAO,IAAM,GAEhCi5C,EAAUj5C,CAAO,MAIjB,SAAUjW,EAAI,EAAGA,EAAIiW,EAAO,OAAQjW,IAEnCkvD,EAAUj5C,EAAQjW,CAAE,CAAE,EAEtB,KAAK,SAAU47C,EAAYc,EAAY18C,CAAE,EAEzC47C,GAAcc,EACdA,EAAa,EAQf,KAAK,SAAUvC,CAAQ,EACvB,KAAK,aAAc,WAAY,IAAIprB,GAAwBjZ,EAAU,CAAE,CAAE,EACzE,KAAK,aAAc,SAAU,IAAIiZ,GAAwBkrB,EAAS,CAAE,CAAE,EACtE,KAAK,aAAc,KAAM,IAAIlrB,GAAwB2sB,EAAK,CAAE,CAAE,EAK9D,SAASwT,EAAU/4C,EAAQ,CAE1B,IAAMogD,EAAczgD,EAAS,OAAS,EAChCH,EAASQ,EAAM,cAAei5C,CAAc,EAE9CoH,EAAgB7gD,EAAO,MACrB8gD,EAAa9gD,EAAO,MAIrB+iB,GAAW,YAAa89B,CAAc,IAAM,KAEhDA,EAAgBA,EAAc,QAAQ,GAIvC,QAAUx2D,EAAI,EAAG4V,EAAI6gD,EAAW,OAAQz2D,EAAI4V,EAAG5V,IAAO,CAErD,IAAM02D,EAAYD,EAAYz2D,CAAE,EAE3B04B,GAAW,YAAag+B,CAAU,IAAM,KAE5CD,EAAYz2D,CAAE,EAAI02D,EAAU,QAAQ,EAItC,CAEA,IAAM7H,EAAQn2B,GAAW,iBAAkB89B,EAAeC,CAAW,EAIrE,QAAUz2D,EAAI,EAAG4V,EAAI6gD,EAAW,OAAQz2D,EAAI4V,EAAG5V,IAAO,CAErD,IAAM02D,EAAYD,EAAYz2D,CAAE,EAChCw2D,EAAgBA,EAAc,OAAQE,CAAU,CAEjD,CAIA,QAAU12D,EAAI,EAAG4V,EAAI4gD,EAAc,OAAQx2D,EAAI4V,EAAG5V,IAAO,CAExD,IAAMsnD,EAASkP,EAAex2D,CAAE,EAEhC8V,EAAS,KAAMwxC,EAAO,EAAGA,EAAO,EAAG,CAAE,EACrCrN,EAAQ,KAAM,EAAG,EAAG,CAAE,EACtByB,EAAI,KAAM4L,EAAO,EAAGA,EAAO,CAAE,CAE9B,CAIA,QAAUtnD,EAAI,EAAG4V,EAAIi5C,EAAM,OAAQ7uD,EAAI4V,EAAG5V,IAAO,CAEhD,IAAM6K,EAAOgkD,EAAO7uD,CAAE,EAEhB8E,EAAI+F,EAAM,CAAE,EAAI0rD,EAChBxxD,EAAI8F,EAAM,CAAE,EAAI0rD,EAChBvxD,EAAI6F,EAAM,CAAE,EAAI0rD,EAEtBpc,EAAQ,KAAMr1C,EAAGC,EAAGC,CAAE,EACtB03C,GAAc,CAEf,CAED,CAED,CAEA,KAAMvQ,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,WAAa,OAAO,OAAQ,CAAC,EAAGA,EAAO,UAAW,EAEhD,IAER,CAEA,QAAS,CAER,IAAM18B,EAAO,MAAM,OAAO,EAEpBwG,EAAS,KAAK,WAAW,OAE/B,OAAOG,IAAQH,EAAQxG,CAAK,CAE7B,CAUA,OAAO,SAAUA,EAAMwG,EAAS,CAE/B,IAAM89C,EAAiB,CAAC,EAExB,QAAUnsD,EAAI,EAAG2wC,EAAK9oC,EAAK,OAAO,OAAQ7H,EAAI2wC,EAAI3wC,IAAO,CAExD,IAAMuO,EAAQF,EAAQxG,EAAK,OAAQ7H,CAAE,CAAE,EAEvCmsD,EAAe,KAAM59C,CAAM,CAE5B,CAEA,OAAO,IAAImgD,EAAevC,EAAgBtkD,EAAK,aAAc,CAE9D,CAED,EAuCM0pB,GAAN,MAAMw9B,UAAuBpnC,EAAe,CAa3C,YAAa2Y,EAAS,EAAGoT,EAAgB,GAAIC,EAAiB,GAAI2Z,EAAW,EAAGC,EAAY,KAAK,GAAK,EAAGhN,EAAa,EAAGC,EAAc,KAAK,GAAK,CAEhJ,MAAM,EAEN,KAAK,KAAO,iBASZ,KAAK,WAAa,CACjB,OAAQlgB,EACR,cAAeoT,EACf,eAAgBC,EAChB,SAAU2Z,EACV,UAAWC,EACX,WAAYhN,EACZ,YAAaC,CACd,EAEA9M,EAAgB,KAAK,IAAK,EAAG,KAAK,MAAOA,CAAc,CAAE,EACzDC,EAAiB,KAAK,IAAK,EAAG,KAAK,MAAOA,CAAe,CAAE,EAE3D,IAAMqb,EAAW,KAAK,IAAKzO,EAAaC,EAAa,KAAK,EAAG,EAEzDh7C,EAAQ,EACNypD,EAAO,CAAC,EAERvP,EAAS,IAAI58C,EACbP,EAAS,IAAIO,EAIbyvC,EAAU,CAAC,EACXrkC,EAAW,CAAC,EACZmkC,EAAU,CAAC,EACXyB,EAAM,CAAC,EAIb,QAAUiB,EAAK,EAAGA,GAAMpB,EAAgBoB,IAAQ,CAE/C,IAAMma,EAAc,CAAC,EAEf,EAAIna,EAAKpB,EAIXqM,EAAU,EAETjL,IAAO,GAAKwL,IAAe,EAE/BP,EAAU,GAAMtM,EAELqB,IAAOpB,GAAkBqb,IAAa,KAAK,KAEtDhP,EAAU,IAAOtM,GAIlB,QAAUsB,EAAK,EAAGA,GAAMtB,EAAesB,IAAQ,CAE9C,IAAM3xC,EAAI2xC,EAAKtB,EAIfgM,EAAO,EAAI,CAAEpf,EAAS,KAAK,IAAKgtB,EAAWjqD,EAAIkqD,CAAU,EAAI,KAAK,IAAKhN,EAAa,EAAIC,CAAY,EACpGd,EAAO,EAAIpf,EAAS,KAAK,IAAKigB,EAAa,EAAIC,CAAY,EAC3Dd,EAAO,EAAIpf,EAAS,KAAK,IAAKgtB,EAAWjqD,EAAIkqD,CAAU,EAAI,KAAK,IAAKhN,EAAa,EAAIC,CAAY,EAElGtyC,EAAS,KAAMwxC,EAAO,EAAGA,EAAO,EAAGA,EAAO,CAAE,EAI5Cn9C,EAAO,KAAMm9C,CAAO,EAAE,UAAU,EAChCrN,EAAQ,KAAM9vC,EAAO,EAAGA,EAAO,EAAGA,EAAO,CAAE,EAI3CuxC,EAAI,KAAMzwC,EAAI28C,EAAS,EAAI,CAAE,EAE7BkP,EAAY,KAAM1pD,GAAS,CAE5B,CAEAypD,EAAK,KAAMC,CAAY,CAExB,CAIA,QAAUna,EAAK,EAAGA,EAAKpB,EAAgBoB,IAEtC,QAAUC,EAAK,EAAGA,EAAKtB,EAAesB,IAAQ,CAE7C,IAAM93C,EAAI+xD,EAAMla,CAAG,EAAGC,EAAK,CAAE,EACvB73C,EAAI8xD,EAAMla,CAAG,EAAGC,CAAG,EACnB53C,EAAI6xD,EAAMla,EAAK,CAAE,EAAGC,CAAG,EACvBlS,EAAImsB,EAAMla,EAAK,CAAE,EAAGC,EAAK,CAAE,GAE5BD,IAAO,GAAKwL,EAAa,IAAIhO,EAAQ,KAAMr1C,EAAGC,EAAG2lC,CAAE,GACnDiS,IAAOpB,EAAiB,GAAKqb,EAAW,KAAK,KAAKzc,EAAQ,KAAMp1C,EAAGC,EAAG0lC,CAAE,CAE9E,CAMD,KAAK,SAAUyP,CAAQ,EACvB,KAAK,aAAc,WAAY,IAAIprB,GAAwBjZ,EAAU,CAAE,CAAE,EACzE,KAAK,aAAc,SAAU,IAAIiZ,GAAwBkrB,EAAS,CAAE,CAAE,EACtE,KAAK,aAAc,KAAM,IAAIlrB,GAAwB2sB,EAAK,CAAE,CAAE,CAE/D,CAEA,KAAMvP,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,WAAa,OAAO,OAAQ,CAAC,EAAGA,EAAO,UAAW,EAEhD,IAER,CASA,OAAO,SAAU18B,EAAO,CAEvB,OAAO,IAAIknD,EAAgBlnD,EAAK,OAAQA,EAAK,cAAeA,EAAK,eAAgBA,EAAK,SAAUA,EAAK,UAAWA,EAAK,WAAYA,EAAK,WAAY,CAEnJ,CAED,EAeM2pB,GAAN,MAAM29B,UAA4B7/B,EAAmB,CAQpD,YAAagR,EAAS,EAAGghB,EAAS,EAAI,CAErC,IAAMpzC,EAAW,CAChB,EAAG,EAAG,EAAI,GAAI,GAAI,EAAI,GAAI,EAAG,GAAK,EAAG,GAAI,EAC1C,EAEMqkC,EAAU,CACf,EAAG,EAAG,EAAI,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CACnC,EAEA,MAAOrkC,EAAUqkC,EAASjS,EAAQghB,CAAO,EAEzC,KAAK,KAAO,sBASZ,KAAK,WAAa,CACjB,OAAQhhB,EACR,OAAQghB,CACT,CAED,CASA,OAAO,SAAUz5C,EAAO,CAEvB,OAAO,IAAIsnD,EAAqBtnD,EAAK,OAAQA,EAAK,MAAO,CAE1D,CAED,EAeM4pB,GAAN,MAAM29B,UAAsBznC,EAAe,CAW1C,YAAa2Y,EAAS,EAAG+uB,EAAO,GAAKlQ,EAAiB,GAAImQ,EAAkB,GAAIC,EAAM,KAAK,GAAK,EAAI,CAEnG,MAAM,EAEN,KAAK,KAAO,gBASZ,KAAK,WAAa,CACjB,OAAQjvB,EACR,KAAM+uB,EACN,eAAgBlQ,EAChB,gBAAiBmQ,EACjB,IAAKC,CACN,EAEApQ,EAAiB,KAAK,MAAOA,CAAe,EAC5CmQ,EAAkB,KAAK,MAAOA,CAAgB,EAI9C,IAAM/c,EAAU,CAAC,EACXrkC,EAAW,CAAC,EACZmkC,EAAU,CAAC,EACXyB,EAAM,CAAC,EAIP5vC,EAAS,IAAIpB,EACb48C,EAAS,IAAI58C,EACbP,EAAS,IAAIO,EAInB,QAAU9C,EAAI,EAAGA,GAAKm/C,EAAgBn/C,IAErC,QAAU5H,EAAI,EAAGA,GAAKk3D,EAAiBl3D,IAAO,CAE7C,IAAMiL,EAAIjL,EAAIk3D,EAAkBC,EAC1BxzB,EAAI/7B,EAAIm/C,EAAiB,KAAK,GAAK,EAIzCO,EAAO,GAAMpf,EAAS+uB,EAAO,KAAK,IAAKtzB,CAAE,GAAM,KAAK,IAAK14B,CAAE,EAC3Dq8C,EAAO,GAAMpf,EAAS+uB,EAAO,KAAK,IAAKtzB,CAAE,GAAM,KAAK,IAAK14B,CAAE,EAC3Dq8C,EAAO,EAAI2P,EAAO,KAAK,IAAKtzB,CAAE,EAE9B7tB,EAAS,KAAMwxC,EAAO,EAAGA,EAAO,EAAGA,EAAO,CAAE,EAI5Cx7C,EAAO,EAAIo8B,EAAS,KAAK,IAAKj9B,CAAE,EAChCa,EAAO,EAAIo8B,EAAS,KAAK,IAAKj9B,CAAE,EAChCd,EAAO,WAAYm9C,EAAQx7C,CAAO,EAAE,UAAU,EAE9CmuC,EAAQ,KAAM9vC,EAAO,EAAGA,EAAO,EAAGA,EAAO,CAAE,EAI3CuxC,EAAI,KAAM17C,EAAIk3D,CAAgB,EAC9Bxb,EAAI,KAAM9zC,EAAIm/C,CAAe,CAE9B,CAMD,QAAUn/C,EAAI,EAAGA,GAAKm/C,EAAgBn/C,IAErC,QAAU5H,EAAI,EAAGA,GAAKk3D,EAAiBl3D,IAAO,CAI7C,IAAM8E,GAAMoyD,EAAkB,GAAMtvD,EAAI5H,EAAI,EACtC+E,GAAMmyD,EAAkB,IAAQtvD,EAAI,GAAM5H,EAAI,EAC9CgF,GAAMkyD,EAAkB,IAAQtvD,EAAI,GAAM5H,EAC1C0qC,GAAMwsB,EAAkB,GAAMtvD,EAAI5H,EAIxCm6C,EAAQ,KAAMr1C,EAAGC,EAAG2lC,CAAE,EACtByP,EAAQ,KAAMp1C,EAAGC,EAAG0lC,CAAE,CAEvB,CAMD,KAAK,SAAUyP,CAAQ,EACvB,KAAK,aAAc,WAAY,IAAIprB,GAAwBjZ,EAAU,CAAE,CAAE,EACzE,KAAK,aAAc,SAAU,IAAIiZ,GAAwBkrB,EAAS,CAAE,CAAE,EACtE,KAAK,aAAc,KAAM,IAAIlrB,GAAwB2sB,EAAK,CAAE,CAAE,CAE/D,CAEA,KAAMvP,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,WAAa,OAAO,OAAQ,CAAC,EAAGA,EAAO,UAAW,EAEhD,IAER,CASA,OAAO,SAAU18B,EAAO,CAEvB,OAAO,IAAIunD,EAAevnD,EAAK,OAAQA,EAAK,KAAMA,EAAK,eAAgBA,EAAK,gBAAiBA,EAAK,GAAI,CAEvG,CAED,EAiBM6pB,GAAN,MAAM89B,UAA0B7nC,EAAe,CAY9C,YAAa2Y,EAAS,EAAG+uB,EAAO,GAAKC,EAAkB,GAAInQ,EAAiB,EAAG5+C,EAAI,EAAGtD,EAAI,EAAI,CAE7F,MAAM,EAEN,KAAK,KAAO,oBASZ,KAAK,WAAa,CACjB,OAAQqjC,EACR,KAAM+uB,EACN,gBAAiBC,EACjB,eAAgBnQ,EAChB,EAAG5+C,EACH,EAAGtD,CACJ,EAEAqyD,EAAkB,KAAK,MAAOA,CAAgB,EAC9CnQ,EAAiB,KAAK,MAAOA,CAAe,EAI5C,IAAM5M,EAAU,CAAC,EACXrkC,EAAW,CAAC,EACZmkC,EAAU,CAAC,EACXyB,EAAM,CAAC,EAIP4L,EAAS,IAAI58C,EACbP,EAAS,IAAIO,EAEb2sD,EAAK,IAAI3sD,EACT4sD,EAAK,IAAI5sD,EAET6sD,EAAI,IAAI7sD,EACR8sD,EAAI,IAAI9sD,EACR+sD,EAAI,IAAI/sD,EAId,QAAU1K,EAAI,EAAGA,GAAKk3D,EAAiB,EAAGl3D,EAAI,CAI7C,IAAMiL,EAAIjL,EAAIk3D,EAAkB/uD,EAAI,KAAK,GAAK,EAK9CuvD,EAA0BzsD,EAAG9C,EAAGtD,EAAGqjC,EAAQmvB,CAAG,EAC9CK,EAA0BzsD,EAAI,IAAM9C,EAAGtD,EAAGqjC,EAAQovB,CAAG,EAIrDE,EAAE,WAAYF,EAAID,CAAG,EACrBI,EAAE,WAAYH,EAAID,CAAG,EACrBE,EAAE,aAAcC,EAAGC,CAAE,EACrBA,EAAE,aAAcF,EAAGC,CAAE,EAIrBD,EAAE,UAAU,EACZE,EAAE,UAAU,EAEZ,QAAU7vD,EAAI,EAAGA,GAAKm/C,EAAgB,EAAGn/C,EAAI,CAK5C,IAAM+7B,EAAI/7B,EAAIm/C,EAAiB,KAAK,GAAK,EACnCh1C,EAAK,CAAEklD,EAAO,KAAK,IAAKtzB,CAAE,EAC1BzxB,EAAK+kD,EAAO,KAAK,IAAKtzB,CAAE,EAK9B2jB,EAAO,EAAI+P,EAAG,GAAMtlD,EAAK0lD,EAAE,EAAIvlD,EAAKqlD,EAAE,GACtCjQ,EAAO,EAAI+P,EAAG,GAAMtlD,EAAK0lD,EAAE,EAAIvlD,EAAKqlD,EAAE,GACtCjQ,EAAO,EAAI+P,EAAG,GAAMtlD,EAAK0lD,EAAE,EAAIvlD,EAAKqlD,EAAE,GAEtCzhD,EAAS,KAAMwxC,EAAO,EAAGA,EAAO,EAAGA,EAAO,CAAE,EAI5Cn9C,EAAO,WAAYm9C,EAAQ+P,CAAG,EAAE,UAAU,EAE1Cpd,EAAQ,KAAM9vC,EAAO,EAAGA,EAAO,EAAGA,EAAO,CAAE,EAI3CuxC,EAAI,KAAM17C,EAAIk3D,CAAgB,EAC9Bxb,EAAI,KAAM9zC,EAAIm/C,CAAe,CAE9B,CAED,CAIA,QAAUn/C,EAAI,EAAGA,GAAKsvD,EAAiBtvD,IAEtC,QAAU5H,EAAI,EAAGA,GAAK+mD,EAAgB/mD,IAAO,CAI5C,IAAM8E,GAAMiiD,EAAiB,IAAQn/C,EAAI,IAAQ5H,EAAI,GAC/C+E,GAAMgiD,EAAiB,GAAMn/C,GAAM5H,EAAI,GACvCgF,GAAM+hD,EAAiB,GAAMn/C,EAAI5H,EACjC0qC,GAAMqc,EAAiB,IAAQn/C,EAAI,GAAM5H,EAI/Cm6C,EAAQ,KAAMr1C,EAAGC,EAAG2lC,CAAE,EACtByP,EAAQ,KAAMp1C,EAAGC,EAAG0lC,CAAE,CAEvB,CAMD,KAAK,SAAUyP,CAAQ,EACvB,KAAK,aAAc,WAAY,IAAIprB,GAAwBjZ,EAAU,CAAE,CAAE,EACzE,KAAK,aAAc,SAAU,IAAIiZ,GAAwBkrB,EAAS,CAAE,CAAE,EACtE,KAAK,aAAc,KAAM,IAAIlrB,GAAwB2sB,EAAK,CAAE,CAAE,EAI9D,SAASgc,EAA0BzsD,EAAG9C,EAAGtD,EAAGqjC,EAAQltB,EAAW,CAE9D,IAAM28C,EAAK,KAAK,IAAK1sD,CAAE,EACjB2sD,EAAK,KAAK,IAAK3sD,CAAE,EACjB4sD,EAAUhzD,EAAIsD,EAAI8C,EAClB6sD,EAAK,KAAK,IAAKD,CAAQ,EAE7B78C,EAAS,EAAIktB,GAAW,EAAI4vB,GAAO,GAAMH,EACzC38C,EAAS,EAAIktB,GAAW,EAAI4vB,GAAOF,EAAK,GACxC58C,EAAS,EAAIktB,EAAS,KAAK,IAAK2vB,CAAQ,EAAI,EAE7C,CAED,CAEA,KAAM1rB,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,WAAa,OAAO,OAAQ,CAAC,EAAGA,EAAO,UAAW,EAEhD,IAER,CASA,OAAO,SAAU18B,EAAO,CAEvB,OAAO,IAAI2nD,EAAmB3nD,EAAK,OAAQA,EAAK,KAAMA,EAAK,gBAAiBA,EAAK,eAAgBA,EAAK,EAAGA,EAAK,CAAE,CAEjH,CAED,EA6BM8pB,GAAN,MAAMw+B,UAAqBxoC,EAAe,CAWzC,YAAayoC,EAAO,IAAI7/B,GAAuB,IAAIztB,EAAS,GAAI,GAAI,CAAE,EAAG,IAAIA,EAAS,GAAI,EAAG,CAAE,EAAG,IAAIA,EAAS,EAAG,EAAG,CAAE,CAAE,EAAGwsD,EAAkB,GAAIhvB,EAAS,EAAG6e,EAAiB,EAAGmF,EAAS,GAAQ,CAElM,MAAM,EAEN,KAAK,KAAO,eASZ,KAAK,WAAa,CACjB,KAAM8L,EACN,gBAAiBd,EACjB,OAAQhvB,EACR,eAAgB6e,EAChB,OAAQmF,CACT,EAEA,IAAM+L,EAASD,EAAK,oBAAqBd,EAAiBhL,CAAO,EAIjE,KAAK,SAAW+L,EAAO,SACvB,KAAK,QAAUA,EAAO,QACtB,KAAK,UAAYA,EAAO,UAIxB,IAAM3Q,EAAS,IAAI58C,EACbP,EAAS,IAAIO,EACbT,EAAK,IAAIW,GACXstD,EAAI,IAAIxtD,EAINoL,EAAW,CAAC,EACZmkC,EAAU,CAAC,EACXyB,EAAM,CAAC,EACPvB,EAAU,CAAC,EAIjBge,EAAmB,EAInB,KAAK,SAAUhe,CAAQ,EACvB,KAAK,aAAc,WAAY,IAAIprB,GAAwBjZ,EAAU,CAAE,CAAE,EACzE,KAAK,aAAc,SAAU,IAAIiZ,GAAwBkrB,EAAS,CAAE,CAAE,EACtE,KAAK,aAAc,KAAM,IAAIlrB,GAAwB2sB,EAAK,CAAE,CAAE,EAI9D,SAASyc,GAAqB,CAE7B,QAAUn4D,EAAI,EAAGA,EAAIk3D,EAAiBl3D,IAErCo4D,EAAiBp4D,CAAE,EASpBo4D,EAAmBlM,IAAW,GAAUgL,EAAkB,CAAE,EAK5D3N,EAAY,EAIZ8O,EAAgB,CAEjB,CAEA,SAASD,EAAiBp4D,EAAI,CAI7Bk4D,EAAIF,EAAK,WAAYh4D,EAAIk3D,EAAiBgB,CAAE,EAI5C,IAAMT,EAAIQ,EAAO,QAASj4D,CAAE,EACtBu3D,EAAIU,EAAO,UAAWj4D,CAAE,EAI9B,QAAU4H,EAAI,EAAGA,GAAKm/C,EAAgBn/C,IAAO,CAE5C,IAAM+7B,EAAI/7B,EAAIm/C,EAAiB,KAAK,GAAK,EAEnC5hD,EAAM,KAAK,IAAKw+B,CAAE,EAClBz+B,EAAM,CAAE,KAAK,IAAKy+B,CAAE,EAI1Bx5B,EAAO,EAAMjF,EAAMuyD,EAAE,EAAItyD,EAAMoyD,EAAE,EACjCptD,EAAO,EAAMjF,EAAMuyD,EAAE,EAAItyD,EAAMoyD,EAAE,EACjCptD,EAAO,EAAMjF,EAAMuyD,EAAE,EAAItyD,EAAMoyD,EAAE,EACjCptD,EAAO,UAAU,EAEjB8vC,EAAQ,KAAM9vC,EAAO,EAAGA,EAAO,EAAGA,EAAO,CAAE,EAI3Cm9C,EAAO,EAAI4Q,EAAE,EAAIhwB,EAAS/9B,EAAO,EACjCm9C,EAAO,EAAI4Q,EAAE,EAAIhwB,EAAS/9B,EAAO,EACjCm9C,EAAO,EAAI4Q,EAAE,EAAIhwB,EAAS/9B,EAAO,EAEjC2L,EAAS,KAAMwxC,EAAO,EAAGA,EAAO,EAAGA,EAAO,CAAE,CAE7C,CAED,CAEA,SAAS+Q,GAAkB,CAE1B,QAAUzwD,EAAI,EAAGA,GAAKsvD,EAAiBtvD,IAEtC,QAAU5H,EAAI,EAAGA,GAAK+mD,EAAgB/mD,IAAO,CAE5C,IAAM8E,GAAMiiD,EAAiB,IAAQn/C,EAAI,IAAQ5H,EAAI,GAC/C+E,GAAMgiD,EAAiB,GAAMn/C,GAAM5H,EAAI,GACvCgF,GAAM+hD,EAAiB,GAAMn/C,EAAI5H,EACjC0qC,GAAMqc,EAAiB,IAAQn/C,EAAI,GAAM5H,EAI/Cm6C,EAAQ,KAAMr1C,EAAGC,EAAG2lC,CAAE,EACtByP,EAAQ,KAAMp1C,EAAGC,EAAG0lC,CAAE,CAEvB,CAIF,CAEA,SAAS6e,GAAc,CAEtB,QAAUvpD,EAAI,EAAGA,GAAKk3D,EAAiBl3D,IAEtC,QAAU4H,EAAI,EAAGA,GAAKm/C,EAAgBn/C,IAErCqC,EAAG,EAAIjK,EAAIk3D,EACXjtD,EAAG,EAAIrC,EAAIm/C,EAEXrL,EAAI,KAAMzxC,EAAG,EAAGA,EAAG,CAAE,CAMxB,CAED,CAEA,KAAMkiC,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,WAAa,OAAO,OAAQ,CAAC,EAAGA,EAAO,UAAW,EAEhD,IAER,CAEA,QAAS,CAER,IAAM18B,EAAO,MAAM,OAAO,EAE1B,OAAAA,EAAK,KAAO,KAAK,WAAW,KAAK,OAAO,EAEjCA,CAER,CASA,OAAO,SAAUA,EAAO,CAIvB,OAAO,IAAIsoD,EACV,IAAI1/B,GAAQ5oB,EAAK,KAAK,IAAK,EAAE,EAAE,SAAUA,EAAK,IAAK,EACnDA,EAAK,gBACLA,EAAK,OACLA,EAAK,eACLA,EAAK,MACN,CAED,CAED,EAsBM+pB,GAAN,cAAgCjK,EAAe,CAO9C,YAAa3U,EAAW,KAAO,CAiB9B,GAfA,MAAM,EAEN,KAAK,KAAO,oBASZ,KAAK,WAAa,CACjB,SAAUA,CACX,EAEKA,IAAa,KAAO,CAIxB,IAAM9E,EAAW,CAAC,EACZQ,EAAQ,IAAI,IAIZ9F,EAAQ,IAAI9F,EACZ+F,EAAM,IAAI/F,EAEhB,GAAKkQ,EAAS,QAAU,KAAO,CAI9B,IAAMI,EAAWJ,EAAS,WAAW,SAC/Bu/B,EAAUv/B,EAAS,MACrB2+B,EAAS3+B,EAAS,OAEjB2+B,EAAO,SAAW,IAEtBA,EAAS,CAAE,CAAE,MAAO,EAAG,MAAOY,EAAQ,MAAO,cAAe,CAAE,CAAE,GAMjE,QAAUme,EAAI,EAAGC,EAAKhf,EAAO,OAAQ+e,EAAIC,EAAI,EAAGD,EAAI,CAEnD,IAAM9e,EAAQD,EAAQ+e,CAAE,EAElB1c,EAAapC,EAAM,MACnBkD,EAAalD,EAAM,MAEzB,QAAUx5C,EAAI47C,EAAYhmC,EAAMgmC,EAAac,EAAc18C,EAAI4V,EAAG5V,GAAK,EAEtE,QAAU4H,EAAI,EAAGA,EAAI,EAAGA,IAAO,CAE9B,IAAM+vC,EAASwC,EAAQ,KAAMn6C,EAAI4H,CAAE,EAC7BgwC,EAASuC,EAAQ,KAAMn6C,GAAM4H,EAAI,GAAM,CAAE,EAE/C4I,EAAM,oBAAqBwK,EAAU28B,CAAO,EAC5ClnC,EAAI,oBAAqBuK,EAAU48B,CAAO,EAErCvhC,GAAc7F,EAAOC,EAAK6F,CAAM,IAAM,KAE1CR,EAAS,KAAMtF,EAAM,EAAGA,EAAM,EAAGA,EAAM,CAAE,EACzCsF,EAAS,KAAMrF,EAAI,EAAGA,EAAI,EAAGA,EAAI,CAAE,EAIrC,CAIF,CAED,KAAO,CAIN,IAAMuK,EAAWJ,EAAS,WAAW,SAErC,QAAU5a,EAAI,EAAG4V,EAAMoF,EAAS,MAAQ,EAAKhb,EAAI4V,EAAG5V,IAEnD,QAAU4H,EAAI,EAAGA,EAAI,EAAGA,IAAO,CAK9B,IAAM+vC,EAAS,EAAI33C,EAAI4H,EACjBgwC,EAAS,EAAI53C,GAAQ4H,EAAI,GAAM,EAErC4I,EAAM,oBAAqBwK,EAAU28B,CAAO,EAC5ClnC,EAAI,oBAAqBuK,EAAU48B,CAAO,EAErCvhC,GAAc7F,EAAOC,EAAK6F,CAAM,IAAM,KAE1CR,EAAS,KAAMtF,EAAM,EAAGA,EAAM,EAAGA,EAAM,CAAE,EACzCsF,EAAS,KAAMrF,EAAI,EAAGA,EAAI,EAAGA,EAAI,CAAE,EAIrC,CAIF,CAIA,KAAK,aAAc,WAAY,IAAIse,GAAwBjZ,EAAU,CAAE,CAAE,CAE1E,CAED,CAEA,KAAMq2B,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,WAAa,OAAO,OAAQ,CAAC,EAAGA,EAAO,UAAW,EAEhD,IAER,CAED,EAqBI1S,GAA0B,OAAO,OAAO,CAC3C,UAAW,KACX,YAAa1J,GACb,gBAAiB+G,GACjB,eAAgBC,GAChB,aAAcE,GACd,iBAAkBD,GAClB,qBAAsBG,GACtB,cAAeK,GACf,gBAAiBmB,GACjB,oBAAqBE,GACrB,cAAeC,GACf,mBAAoBC,GACpB,cAAeC,GACf,mBAAoB9B,GACpB,aAAc+B,GACd,cAAeC,GACf,eAAgBC,GAChB,oBAAqBC,GACrB,cAAeC,GACf,kBAAmBC,GACnB,aAAcC,GACd,kBAAmBC,EACpB,CAAC,EAoBKE,GAAN,cAA6B1L,EAAS,CAWrC,YAAa4mB,EAAa,CAEzB,MAAM,EASN,KAAK,iBAAmB,GAExB,KAAK,KAAO,iBAQZ,KAAK,MAAQ,IAAI/mB,GAAO,CAAS,EASjC,KAAK,YAAc,GAQnB,KAAK,IAAM,GAEX,KAAK,UAAW+mB,CAAW,CAE5B,CAEA,KAAMzI,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,MAAM,KAAMA,EAAO,KAAM,EAE9B,KAAK,IAAMA,EAAO,IAEX,IAER,CAED,EAWMxS,GAAN,cAAgCxJ,EAAe,CAW9C,YAAaykB,EAAa,CAEzB,MAAOA,CAAW,EASlB,KAAK,oBAAsB,GAE3B,KAAK,KAAO,mBAEb,CAED,EAoCMhb,GAAN,cAAmC5L,EAAS,CAW3C,YAAa4mB,EAAa,CAEzB,MAAM,EASN,KAAK,uBAAyB,GAE9B,KAAK,KAAO,uBAEZ,KAAK,QAAU,CAAE,SAAY,EAAG,EAQhC,KAAK,MAAQ,IAAI/mB,GAAO,QAAS,EAUjC,KAAK,UAAY,EAWjB,KAAK,UAAY,EAUjB,KAAK,IAAM,KAQX,KAAK,SAAW,KAQhB,KAAK,kBAAoB,EASzB,KAAK,MAAQ,KAUb,KAAK,eAAiB,EAStB,KAAK,SAAW,IAAIA,GAAO,CAAS,EAQpC,KAAK,kBAAoB,EAUzB,KAAK,YAAc,KAWnB,KAAK,QAAU,KAQf,KAAK,UAAY,EAajB,KAAK,UAAY,KAQjB,KAAK,cAAgBrI,GAQrB,KAAK,YAAc,IAAI5a,GAAS,EAAG,CAAE,EAarC,KAAK,gBAAkB,KAUvB,KAAK,kBAAoB,EAUzB,KAAK,iBAAmB,EASxB,KAAK,aAAe,KASpB,KAAK,aAAe,KAepB,KAAK,SAAW,KAShB,KAAK,OAAS,KAQd,KAAK,eAAiB,IAAI+gB,GAQ1B,KAAK,gBAAkB,EAQvB,KAAK,UAAY,GAUjB,KAAK,mBAAqB,EAU1B,KAAK,iBAAmB,QAUxB,KAAK,kBAAoB,QAQzB,KAAK,YAAc,GAQnB,KAAK,IAAM,GAEX,KAAK,UAAWipB,CAAW,CAE5B,CAEA,KAAMzI,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,QAAU,CAAE,SAAY,EAAG,EAEhC,KAAK,MAAM,KAAMA,EAAO,KAAM,EAC9B,KAAK,UAAYA,EAAO,UACxB,KAAK,UAAYA,EAAO,UAExB,KAAK,IAAMA,EAAO,IAElB,KAAK,SAAWA,EAAO,SACvB,KAAK,kBAAoBA,EAAO,kBAEhC,KAAK,MAAQA,EAAO,MACpB,KAAK,eAAiBA,EAAO,eAE7B,KAAK,SAAS,KAAMA,EAAO,QAAS,EACpC,KAAK,YAAcA,EAAO,YAC1B,KAAK,kBAAoBA,EAAO,kBAEhC,KAAK,QAAUA,EAAO,QACtB,KAAK,UAAYA,EAAO,UAExB,KAAK,UAAYA,EAAO,UACxB,KAAK,cAAgBA,EAAO,cAC5B,KAAK,YAAY,KAAMA,EAAO,WAAY,EAE1C,KAAK,gBAAkBA,EAAO,gBAC9B,KAAK,kBAAoBA,EAAO,kBAChC,KAAK,iBAAmBA,EAAO,iBAE/B,KAAK,aAAeA,EAAO,aAE3B,KAAK,aAAeA,EAAO,aAE3B,KAAK,SAAWA,EAAO,SAEvB,KAAK,OAASA,EAAO,OACrB,KAAK,eAAe,KAAMA,EAAO,cAAe,EAChD,KAAK,gBAAkBA,EAAO,gBAE9B,KAAK,UAAYA,EAAO,UACxB,KAAK,mBAAqBA,EAAO,mBACjC,KAAK,iBAAmBA,EAAO,iBAC/B,KAAK,kBAAoBA,EAAO,kBAEhC,KAAK,YAAcA,EAAO,YAE1B,KAAK,IAAMA,EAAO,IAEX,IAER,CAED,EA4BMtS,GAAN,cAAmCD,EAAqB,CAWvD,YAAagb,EAAa,CAEzB,MAAM,EASN,KAAK,uBAAyB,GAE9B,KAAK,QAAU,CAEd,SAAY,GACZ,SAAY,EAEb,EAEA,KAAK,KAAO,uBAUZ,KAAK,mBAAqB,EAU1B,KAAK,cAAgB,KASrB,KAAK,aAAe,KAQpB,KAAK,mBAAqB,EAS1B,KAAK,sBAAwB,KAS7B,KAAK,qBAAuB,IAAIhqC,GAAS,EAAG,CAAE,EAQ9C,KAAK,mBAAqB,KAQ1B,KAAK,IAAM,IAaX,OAAO,eAAgB,KAAM,eAAgB,CAC5C,IAAK,UAAY,CAEhB,OAAS1I,GAAO,KAAQ,KAAK,IAAM,IAAQ,KAAK,IAAM,GAAK,EAAG,CAAE,CAEjE,EACA,IAAK,SAAWs2D,EAAe,CAE9B,KAAK,KAAQ,EAAI,GAAMA,IAAmB,EAAI,GAAMA,EAErD,CACD,CAAE,EASF,KAAK,eAAiB,KAStB,KAAK,eAAiB,IAStB,KAAK,0BAA4B,CAAE,IAAK,GAAI,EAY5C,KAAK,wBAA0B,KAQ/B,KAAK,WAAa,IAAI3qC,GAAO,CAAS,EAStC,KAAK,cAAgB,KAQrB,KAAK,eAAiB,EAStB,KAAK,kBAAoB,KASzB,KAAK,gBAAkB,KAUvB,KAAK,UAAY,EASjB,KAAK,aAAe,KAUpB,KAAK,oBAAsB,IAS3B,KAAK,iBAAmB,IAAIA,GAAO,EAAG,EAAG,CAAE,EAS3C,KAAK,kBAAoB,EASzB,KAAK,qBAAuB,KAQ5B,KAAK,cAAgB,IAAIA,GAAO,EAAG,EAAG,CAAE,EASxC,KAAK,iBAAmB,KAExB,KAAK,YAAc,EACnB,KAAK,WAAa,EAClB,KAAK,YAAc,EACnB,KAAK,aAAe,EACpB,KAAK,OAAS,EACd,KAAK,cAAgB,EAErB,KAAK,UAAW+mB,CAAW,CAE5B,CAQA,IAAI,YAAa,CAEhB,OAAO,KAAK,WAEb,CAEA,IAAI,WAAYzyC,EAAQ,CAElB,KAAK,YAAc,GAAMA,EAAQ,GAErC,KAAK,UAIN,KAAK,YAAcA,CAEpB,CAUA,IAAI,WAAY,CAEf,OAAO,KAAK,UAEb,CAEA,IAAI,UAAWA,EAAQ,CAEjB,KAAK,WAAa,GAAMA,EAAQ,GAEpC,KAAK,UAIN,KAAK,WAAaA,CAEnB,CAQA,IAAI,aAAc,CAEjB,OAAO,KAAK,YAEb,CAEA,IAAI,YAAaA,EAAQ,CAEnB,KAAK,aAAe,GAAMA,EAAQ,GAEtC,KAAK,UAIN,KAAK,aAAeA,CAErB,CAUA,IAAI,YAAa,CAEhB,OAAO,KAAK,WAEb,CAEA,IAAI,WAAYA,EAAQ,CAElB,KAAK,YAAc,GAAMA,EAAQ,GAErC,KAAK,UAIN,KAAK,YAAcA,CAEpB,CAQA,IAAI,OAAQ,CAEX,OAAO,KAAK,MAEb,CAEA,IAAI,MAAOA,EAAQ,CAEb,KAAK,OAAS,GAAMA,EAAQ,GAEhC,KAAK,UAIN,KAAK,OAASA,CAEf,CAcA,IAAI,cAAe,CAElB,OAAO,KAAK,aAEb,CAEA,IAAI,aAAcA,EAAQ,CAEpB,KAAK,cAAgB,GAAMA,EAAQ,GAEvC,KAAK,UAIN,KAAK,cAAgBA,CAEtB,CAEA,KAAMgqC,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,QAAU,CAEd,SAAY,GACZ,SAAY,EAEb,EAEA,KAAK,WAAaA,EAAO,WACzB,KAAK,mBAAqBA,EAAO,mBACjC,KAAK,cAAgBA,EAAO,cAE5B,KAAK,UAAYA,EAAO,UACxB,KAAK,aAAeA,EAAO,aAC3B,KAAK,mBAAqBA,EAAO,mBACjC,KAAK,sBAAwBA,EAAO,sBACpC,KAAK,mBAAqBA,EAAO,mBACjC,KAAK,qBAAqB,KAAMA,EAAO,oBAAqB,EAE5D,KAAK,WAAaA,EAAO,WACzB,KAAK,IAAMA,EAAO,IAElB,KAAK,YAAcA,EAAO,YAC1B,KAAK,eAAiBA,EAAO,eAC7B,KAAK,eAAiBA,EAAO,eAC7B,KAAK,0BAA4B,CAAE,GAAGA,EAAO,yBAA0B,EACvE,KAAK,wBAA0BA,EAAO,wBAEtC,KAAK,MAAQA,EAAO,MACpB,KAAK,WAAW,KAAMA,EAAO,UAAW,EACxC,KAAK,cAAgBA,EAAO,cAC5B,KAAK,eAAiBA,EAAO,eAC7B,KAAK,kBAAoBA,EAAO,kBAEhC,KAAK,aAAeA,EAAO,aAC3B,KAAK,gBAAkBA,EAAO,gBAE9B,KAAK,UAAYA,EAAO,UACxB,KAAK,aAAeA,EAAO,aAC3B,KAAK,oBAAsBA,EAAO,oBAClC,KAAK,iBAAiB,KAAMA,EAAO,gBAAiB,EAEpD,KAAK,kBAAoBA,EAAO,kBAChC,KAAK,qBAAuBA,EAAO,qBACnC,KAAK,cAAc,KAAMA,EAAO,aAAc,EAC9C,KAAK,iBAAmBA,EAAO,iBAExB,IAER,CAED,EAiBMrS,GAAN,cAAgC9L,EAAS,CAWxC,YAAa4mB,EAAa,CAEzB,MAAM,EASN,KAAK,oBAAsB,GAE3B,KAAK,KAAO,oBAQZ,KAAK,MAAQ,IAAI/mB,GAAO,QAAS,EASjC,KAAK,SAAW,IAAIA,GAAO,OAAS,EAQpC,KAAK,UAAY,GAUjB,KAAK,IAAM,KAQX,KAAK,SAAW,KAQhB,KAAK,kBAAoB,EASzB,KAAK,MAAQ,KAUb,KAAK,eAAiB,EAStB,KAAK,SAAW,IAAIA,GAAO,CAAS,EAQpC,KAAK,kBAAoB,EAUzB,KAAK,YAAc,KAWnB,KAAK,QAAU,KAQf,KAAK,UAAY,EAajB,KAAK,UAAY,KAQjB,KAAK,cAAgBrI,GAQrB,KAAK,YAAc,IAAI5a,GAAS,EAAG,CAAE,EAarC,KAAK,gBAAkB,KAUvB,KAAK,kBAAoB,EAUzB,KAAK,iBAAmB,EAUxB,KAAK,YAAc,KAenB,KAAK,SAAW,KAQhB,KAAK,OAAS,KAQd,KAAK,eAAiB,IAAI+gB,GAW1B,KAAK,QAAUxJ,GASf,KAAK,aAAe,EAWpB,KAAK,gBAAkB,IAQvB,KAAK,UAAY,GAUjB,KAAK,mBAAqB,EAU1B,KAAK,iBAAmB,QAUxB,KAAK,kBAAoB,QAQzB,KAAK,YAAc,GAQnB,KAAK,IAAM,GAEX,KAAK,UAAWyyB,CAAW,CAE5B,CAEA,KAAMzI,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,MAAM,KAAMA,EAAO,KAAM,EAC9B,KAAK,SAAS,KAAMA,EAAO,QAAS,EACpC,KAAK,UAAYA,EAAO,UAExB,KAAK,IAAMA,EAAO,IAElB,KAAK,SAAWA,EAAO,SACvB,KAAK,kBAAoBA,EAAO,kBAEhC,KAAK,MAAQA,EAAO,MACpB,KAAK,eAAiBA,EAAO,eAE7B,KAAK,SAAS,KAAMA,EAAO,QAAS,EACpC,KAAK,YAAcA,EAAO,YAC1B,KAAK,kBAAoBA,EAAO,kBAEhC,KAAK,QAAUA,EAAO,QACtB,KAAK,UAAYA,EAAO,UAExB,KAAK,UAAYA,EAAO,UACxB,KAAK,cAAgBA,EAAO,cAC5B,KAAK,YAAY,KAAMA,EAAO,WAAY,EAE1C,KAAK,gBAAkBA,EAAO,gBAC9B,KAAK,kBAAoBA,EAAO,kBAChC,KAAK,iBAAmBA,EAAO,iBAE/B,KAAK,YAAcA,EAAO,YAE1B,KAAK,SAAWA,EAAO,SAEvB,KAAK,OAASA,EAAO,OACrB,KAAK,eAAe,KAAMA,EAAO,cAAe,EAChD,KAAK,QAAUA,EAAO,QACtB,KAAK,aAAeA,EAAO,aAC3B,KAAK,gBAAkBA,EAAO,gBAE9B,KAAK,UAAYA,EAAO,UACxB,KAAK,mBAAqBA,EAAO,mBACjC,KAAK,iBAAmBA,EAAO,iBAC/B,KAAK,kBAAoBA,EAAO,kBAEhC,KAAK,YAAcA,EAAO,YAE1B,KAAK,IAAMA,EAAO,IAEX,IAER,CAED,EAQMpS,GAAN,cAA+B/L,EAAS,CAWvC,YAAa4mB,EAAa,CAEzB,MAAM,EASN,KAAK,mBAAqB,GAE1B,KAAK,QAAU,CAAE,KAAQ,EAAG,EAE5B,KAAK,KAAO,mBAQZ,KAAK,MAAQ,IAAI/mB,GAAO,QAAS,EAUjC,KAAK,IAAM,KAUX,KAAK,YAAc,KAQnB,KAAK,SAAW,KAQhB,KAAK,kBAAoB,EASzB,KAAK,MAAQ,KAUb,KAAK,eAAiB,EAStB,KAAK,SAAW,IAAIA,GAAO,CAAS,EAQpC,KAAK,kBAAoB,EAUzB,KAAK,YAAc,KAWnB,KAAK,QAAU,KAQf,KAAK,UAAY,EAajB,KAAK,UAAY,KAQjB,KAAK,cAAgBrI,GAQrB,KAAK,YAAc,IAAI5a,GAAS,EAAG,CAAE,EAarC,KAAK,gBAAkB,KAUvB,KAAK,kBAAoB,EAUzB,KAAK,iBAAmB,EAexB,KAAK,SAAW,KAQhB,KAAK,UAAY,GAUjB,KAAK,mBAAqB,EAU1B,KAAK,iBAAmB,QAUxB,KAAK,kBAAoB,QAQzB,KAAK,IAAM,GAEX,KAAK,UAAWgqC,CAAW,CAE5B,CAEA,KAAMzI,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,MAAM,KAAMA,EAAO,KAAM,EAE9B,KAAK,IAAMA,EAAO,IAClB,KAAK,YAAcA,EAAO,YAE1B,KAAK,SAAWA,EAAO,SACvB,KAAK,kBAAoBA,EAAO,kBAEhC,KAAK,MAAQA,EAAO,MACpB,KAAK,eAAiBA,EAAO,eAE7B,KAAK,SAAS,KAAMA,EAAO,QAAS,EACpC,KAAK,YAAcA,EAAO,YAC1B,KAAK,kBAAoBA,EAAO,kBAEhC,KAAK,QAAUA,EAAO,QACtB,KAAK,UAAYA,EAAO,UAExB,KAAK,UAAYA,EAAO,UACxB,KAAK,cAAgBA,EAAO,cAC5B,KAAK,YAAY,KAAMA,EAAO,WAAY,EAE1C,KAAK,gBAAkBA,EAAO,gBAC9B,KAAK,kBAAoBA,EAAO,kBAChC,KAAK,iBAAmBA,EAAO,iBAE/B,KAAK,SAAWA,EAAO,SAEvB,KAAK,UAAYA,EAAO,UACxB,KAAK,mBAAqBA,EAAO,mBACjC,KAAK,iBAAmBA,EAAO,iBAC/B,KAAK,kBAAoBA,EAAO,kBAEhC,KAAK,IAAMA,EAAO,IAEX,IAER,CAED,EAQMnS,GAAN,cAAiChM,EAAS,CAWzC,YAAa4mB,EAAa,CAEzB,MAAM,EASN,KAAK,qBAAuB,GAE5B,KAAK,KAAO,qBAWZ,KAAK,QAAU,KAQf,KAAK,UAAY,EAajB,KAAK,UAAY,KAQjB,KAAK,cAAgBpvB,GAQrB,KAAK,YAAc,IAAI5a,GAAS,EAAG,CAAE,EAarC,KAAK,gBAAkB,KAUvB,KAAK,kBAAoB,EAUzB,KAAK,iBAAmB,EAQxB,KAAK,UAAY,GAWjB,KAAK,mBAAqB,EAQ1B,KAAK,YAAc,GAEnB,KAAK,UAAWgqC,CAAW,CAE5B,CAEA,KAAMzI,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,QAAUA,EAAO,QACtB,KAAK,UAAYA,EAAO,UAExB,KAAK,UAAYA,EAAO,UACxB,KAAK,cAAgBA,EAAO,cAC5B,KAAK,YAAY,KAAMA,EAAO,WAAY,EAE1C,KAAK,gBAAkBA,EAAO,gBAC9B,KAAK,kBAAoBA,EAAO,kBAChC,KAAK,iBAAmBA,EAAO,iBAE/B,KAAK,UAAYA,EAAO,UACxB,KAAK,mBAAqBA,EAAO,mBAEjC,KAAK,YAAcA,EAAO,YAEnB,IAER,CAED,EAmBMlS,GAAN,cAAkCjM,EAAS,CAW1C,YAAa4mB,EAAa,CAEzB,MAAM,EASN,KAAK,sBAAwB,GAE7B,KAAK,KAAO,sBAQZ,KAAK,MAAQ,IAAI/mB,GAAO,QAAS,EAUjC,KAAK,IAAM,KAQX,KAAK,SAAW,KAQhB,KAAK,kBAAoB,EASzB,KAAK,MAAQ,KAUb,KAAK,eAAiB,EAStB,KAAK,SAAW,IAAIA,GAAO,CAAS,EAQpC,KAAK,kBAAoB,EAUzB,KAAK,YAAc,KAWnB,KAAK,QAAU,KAQf,KAAK,UAAY,EAajB,KAAK,UAAY,KAQjB,KAAK,cAAgBrI,GAQrB,KAAK,YAAc,IAAI5a,GAAS,EAAG,CAAE,EAarC,KAAK,gBAAkB,KAUvB,KAAK,kBAAoB,EAUzB,KAAK,iBAAmB,EAQxB,KAAK,YAAc,KAenB,KAAK,SAAW,KAQhB,KAAK,OAAS,KAQd,KAAK,eAAiB,IAAI+gB,GAW1B,KAAK,QAAUxJ,GASf,KAAK,aAAe,EAWpB,KAAK,gBAAkB,IAQvB,KAAK,UAAY,GAUjB,KAAK,mBAAqB,EAU1B,KAAK,iBAAmB,QAUxB,KAAK,kBAAoB,QAQzB,KAAK,YAAc,GAQnB,KAAK,IAAM,GAEX,KAAK,UAAWyyB,CAAW,CAE5B,CAEA,KAAMzI,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,MAAM,KAAMA,EAAO,KAAM,EAE9B,KAAK,IAAMA,EAAO,IAElB,KAAK,SAAWA,EAAO,SACvB,KAAK,kBAAoBA,EAAO,kBAEhC,KAAK,MAAQA,EAAO,MACpB,KAAK,eAAiBA,EAAO,eAE7B,KAAK,SAAS,KAAMA,EAAO,QAAS,EACpC,KAAK,YAAcA,EAAO,YAC1B,KAAK,kBAAoBA,EAAO,kBAEhC,KAAK,QAAUA,EAAO,QACtB,KAAK,UAAYA,EAAO,UAExB,KAAK,UAAYA,EAAO,UACxB,KAAK,cAAgBA,EAAO,cAC5B,KAAK,YAAY,KAAMA,EAAO,WAAY,EAE1C,KAAK,gBAAkBA,EAAO,gBAC9B,KAAK,kBAAoBA,EAAO,kBAChC,KAAK,iBAAmBA,EAAO,iBAE/B,KAAK,YAAcA,EAAO,YAE1B,KAAK,SAAWA,EAAO,SAEvB,KAAK,OAASA,EAAO,OACrB,KAAK,eAAe,KAAMA,EAAO,cAAe,EAChD,KAAK,QAAUA,EAAO,QACtB,KAAK,aAAeA,EAAO,aAC3B,KAAK,gBAAkBA,EAAO,gBAE9B,KAAK,UAAYA,EAAO,UACxB,KAAK,mBAAqBA,EAAO,mBACjC,KAAK,iBAAmBA,EAAO,iBAC/B,KAAK,kBAAoBA,EAAO,kBAEhC,KAAK,YAAcA,EAAO,YAE1B,KAAK,IAAMA,EAAO,IAEX,IAER,CAED,EASMjS,GAAN,cAAgClM,EAAS,CAWxC,YAAa4mB,EAAa,CAEzB,MAAM,EASN,KAAK,oBAAsB,GAE3B,KAAK,KAAO,oBAQZ,KAAK,aAAexvB,GASpB,KAAK,IAAM,KAeX,KAAK,SAAW,KAahB,KAAK,gBAAkB,KAUvB,KAAK,kBAAoB,EAUzB,KAAK,iBAAmB,EAQxB,KAAK,UAAY,GAWjB,KAAK,mBAAqB,EAE1B,KAAK,UAAWwvB,CAAW,CAE5B,CAEA,KAAMzI,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,aAAeA,EAAO,aAE3B,KAAK,IAAMA,EAAO,IAElB,KAAK,SAAWA,EAAO,SAEvB,KAAK,gBAAkBA,EAAO,gBAC9B,KAAK,kBAAoBA,EAAO,kBAChC,KAAK,iBAAmBA,EAAO,iBAE/B,KAAK,UAAYA,EAAO,UACxB,KAAK,mBAAqBA,EAAO,mBAE1B,IAER,CAED,EAaMhS,GAAN,cAAmCnM,EAAS,CAW3C,YAAa4mB,EAAa,CAEzB,MAAM,EASN,KAAK,uBAAyB,GAE9B,KAAK,KAAO,uBASZ,KAAK,IAAM,KAeX,KAAK,SAAW,KAahB,KAAK,gBAAkB,KAUvB,KAAK,kBAAoB,EAUzB,KAAK,iBAAmB,EAExB,KAAK,UAAWA,CAAW,CAE5B,CAEA,KAAMzI,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,IAAMA,EAAO,IAElB,KAAK,SAAWA,EAAO,SAEvB,KAAK,gBAAkBA,EAAO,gBAC9B,KAAK,kBAAoBA,EAAO,kBAChC,KAAK,iBAAmBA,EAAO,iBAExB,IAER,CAED,EAcM/R,GAAN,cAAiCpM,EAAS,CAWzC,YAAa4mB,EAAa,CAEzB,MAAM,EASN,KAAK,qBAAuB,GAE5B,KAAK,QAAU,CAAE,OAAU,EAAG,EAE9B,KAAK,KAAO,qBAQZ,KAAK,MAAQ,IAAI/mB,GAAO,QAAS,EAQjC,KAAK,OAAS,KAUd,KAAK,IAAM,KAWX,KAAK,QAAU,KAQf,KAAK,UAAY,EAajB,KAAK,UAAY,KAQjB,KAAK,cAAgBrI,GAQrB,KAAK,YAAc,IAAI5a,GAAS,EAAG,CAAE,EAarC,KAAK,gBAAkB,KAUvB,KAAK,kBAAoB,EAUzB,KAAK,iBAAmB,EAexB,KAAK,SAAW,KAQhB,KAAK,UAAY,GAUjB,KAAK,mBAAqB,EAQ1B,KAAK,YAAc,GAQnB,KAAK,IAAM,GAEX,KAAK,UAAWgqC,CAAW,CAE5B,CAGA,KAAMzI,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,QAAU,CAAE,OAAU,EAAG,EAE9B,KAAK,MAAM,KAAMA,EAAO,KAAM,EAE9B,KAAK,OAASA,EAAO,OAErB,KAAK,IAAMA,EAAO,IAElB,KAAK,QAAUA,EAAO,QACtB,KAAK,UAAYA,EAAO,UAExB,KAAK,UAAYA,EAAO,UACxB,KAAK,cAAgBA,EAAO,cAC5B,KAAK,YAAY,KAAMA,EAAO,WAAY,EAE1C,KAAK,gBAAkBA,EAAO,gBAC9B,KAAK,kBAAoBA,EAAO,kBAChC,KAAK,iBAAmBA,EAAO,iBAE/B,KAAK,SAAWA,EAAO,SAEvB,KAAK,UAAYA,EAAO,UACxB,KAAK,mBAAqBA,EAAO,mBAEjC,KAAK,YAAcA,EAAO,YAE1B,KAAK,IAAMA,EAAO,IAEX,IAER,CAED,EAkBM9R,GAAN,cAAiC/E,EAAkB,CAWlD,YAAasf,EAAa,CAEzB,MAAM,EASN,KAAK,qBAAuB,GAC5B,KAAK,KAAO,qBAQZ,KAAK,MAAQ,EAQb,KAAK,SAAW,EAQhB,KAAK,QAAU,EAEf,KAAK,UAAWA,CAAW,CAE5B,CAEA,KAAMzI,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,MAAQA,EAAO,MACpB,KAAK,SAAWA,EAAO,SACvB,KAAK,QAAUA,EAAO,QAEf,IAER,CAED,EAwXM7R,GAAN,KAAqB,CAUpB,OAAO,aAAcv6B,EAAOG,EAAO,CAElC,OAAOuW,GAAc1W,EAAOG,CAAK,CAElC,CASA,OAAO,aAAciJ,EAAS,CAE7B,OAAO9I,GAAc8I,CAAO,CAE7B,CASA,OAAO,iBAAkBwN,EAAQ,CAEhC,OAAOD,GAAkBC,CAAM,CAEhC,CAWA,OAAO,YAAaG,EAAQC,EAAQ9R,EAAQ,CAE3C,OAAO4R,GAAaC,EAAQC,EAAQ9R,CAAM,CAE3C,CAWA,OAAO,YAAamS,EAAUT,EAAOG,EAAQO,EAAoB,CAEhEF,GAAaC,EAAUT,EAAOG,EAAQO,CAAkB,CAEzD,CAaA,OAAO,QAASG,EAAYjX,EAAMkX,EAAYC,EAAUC,EAAM,GAAK,CAElE,OAAOJ,IAASC,EAAYjX,EAAMkX,EAAYC,EAAUC,CAAI,CAE7D,CAYA,OAAO,iBAAkBQ,EAAYC,EAAiB,EAAGC,EAAgBF,EAAYR,EAAM,GAAK,CAE/F,OAAOO,IAAkBC,EAAYC,EAAgBC,EAAeV,CAAI,CAEzE,CAED,EAqBM4iB,GAAN,KAAkB,CAUjB,YAAak+B,EAAoBC,EAAcC,EAAYC,EAAe,CAOzE,KAAK,mBAAqBH,EAS1B,KAAK,aAAe,EAOpB,KAAK,aAAeG,IAAiB,OAAYA,EAAe,IAAIF,EAAa,YAAaC,CAAW,EAOzG,KAAK,aAAeD,EAOpB,KAAK,UAAYC,EAQjB,KAAK,SAAW,KAOhB,KAAK,iBAAmB,CAAC,CAE1B,CAQA,SAAUz0D,EAAI,CAEb,IAAM20D,EAAK,KAAK,mBACZziB,EAAK,KAAK,aACbjoC,EAAK0qD,EAAIziB,CAAG,EACZloC,EAAK2qD,EAAIziB,EAAK,CAAE,EAEjB0iB,EAAmB,CAElBC,EAAM,CAEL,IAAI1lB,EAEJ2lB,EAAa,CAMZC,EAAc,GAAK,EAAI/0D,EAAIiK,GAAO,CAEjC,QAAU+qD,EAAW9iB,EAAK,IAAO,CAEhC,GAAKjoC,IAAO,OAAY,CAEvB,GAAKjK,EAAIgK,EAAK,MAAM+qD,EAIpB,OAAA7iB,EAAKyiB,EAAG,OACR,KAAK,aAAeziB,EACb,KAAK,iBAAkBA,EAAK,CAAE,CAEtC,CAEA,GAAKA,IAAO8iB,EAAW,MAKvB,GAHAhrD,EAAKC,EACLA,EAAK0qD,EAAI,EAAGziB,CAAG,EAEVlyC,EAAIiK,EAGR,MAAM4qD,CAIR,CAGA1lB,EAAQwlB,EAAG,OACX,MAAMG,CAEP,CAIA,GAAK,EAAI90D,GAAKgK,GAAO,CAIpB,IAAMirD,EAAWN,EAAI,CAAE,EAElB30D,EAAIi1D,IAER/iB,EAAK,EACLloC,EAAKirD,GAMN,QAAUD,EAAW9iB,EAAK,IAAO,CAEhC,GAAKloC,IAAO,OAIX,YAAK,aAAe,EACb,KAAK,iBAAkB,CAAE,EAIjC,GAAKkoC,IAAO8iB,EAAW,MAKvB,GAHA/qD,EAAKD,EACLA,EAAK2qD,EAAI,EAAGziB,EAAK,CAAE,EAEdlyC,GAAKgK,EAGT,MAAM6qD,CAIR,CAGA1lB,EAAQ+C,EACRA,EAAK,EACL,MAAM4iB,CAEP,CAIA,MAAMF,CAEP,CAIA,KAAQ1iB,EAAK/C,GAAQ,CAEpB,IAAM+lB,EAAQhjB,EAAK/C,IAAY,EAE1BnvC,EAAI20D,EAAIO,CAAI,EAEhB/lB,EAAQ+lB,EAIRhjB,EAAKgjB,EAAM,CAIb,CAOA,GALAjrD,EAAK0qD,EAAIziB,CAAG,EACZloC,EAAK2qD,EAAIziB,EAAK,CAAE,EAIXloC,IAAO,OAEX,YAAK,aAAe,EACb,KAAK,iBAAkB,CAAE,EAIjC,GAAKC,IAAO,OAEX,OAAAioC,EAAKyiB,EAAG,OACR,KAAK,aAAeziB,EACb,KAAK,iBAAkBA,EAAK,CAAE,CAIvC,CAEA,KAAK,aAAeA,EAEpB,KAAK,iBAAkBA,EAAIloC,EAAIC,CAAG,CAEnC,CAEA,OAAO,KAAK,aAAcioC,EAAIloC,EAAIhK,EAAGiK,CAAG,CAEzC,CAOA,cAAe,CAEd,OAAO,KAAK,UAAY,KAAK,gBAE9B,CAQA,iBAAkBf,EAAQ,CAIzB,IAAM6F,EAAS,KAAK,aACnB6D,EAAS,KAAK,aACdC,EAAS,KAAK,UACdotB,EAAS/2B,EAAQ2J,EAElB,QAAU/W,EAAI,EAAGA,IAAM+W,EAAQ,EAAG/W,EAEjCiT,EAAQjT,CAAE,EAAI8W,EAAQqtB,EAASnkC,CAAE,EAIlC,OAAOiT,CAER,CAYA,cAAoC,CAEnC,MAAM,IAAI,MAAO,yBAA0B,CAG5C,CASA,kBAAqC,CAIrC,CAED,EAWMunB,GAAN,cAA+BD,EAAY,CAU1C,YAAak+B,EAAoBC,EAAcC,EAAYC,EAAe,CAEzE,MAAOH,EAAoBC,EAAcC,EAAYC,CAAa,EAElE,KAAK,YAAc,GACnB,KAAK,YAAc,GACnB,KAAK,YAAc,GACnB,KAAK,YAAc,GAEnB,KAAK,iBAAmB,CAEvB,YAAa/zC,GACb,UAAWA,EAEZ,CAED,CAEA,iBAAkBuxB,EAAIloC,EAAIC,EAAK,CAE9B,IAAM0qD,EAAK,KAAK,mBACZQ,EAAQjjB,EAAK,EAChBkjB,EAAQljB,EAAK,EAEbmjB,EAAQV,EAAIQ,CAAM,EAClBG,EAAQX,EAAIS,CAAM,EAEnB,GAAKC,IAAU,OAEd,OAAS,KAAK,aAAa,EAAE,YAAc,CAE1C,KAAKz0C,GAGJu0C,EAAQjjB,EACRmjB,EAAQ,EAAIrrD,EAAKC,EAEjB,MAED,KAAK4W,GAGJs0C,EAAQR,EAAG,OAAS,EACpBU,EAAQrrD,EAAK2qD,EAAIQ,CAAM,EAAIR,EAAIQ,EAAQ,CAAE,EAEzC,MAED,QAGCA,EAAQjjB,EACRmjB,EAAQprD,CAEV,CAID,GAAKqrD,IAAU,OAEd,OAAS,KAAK,aAAa,EAAE,UAAY,CAExC,KAAK10C,GAGJw0C,EAAQljB,EACRojB,EAAQ,EAAIrrD,EAAKD,EAEjB,MAED,KAAK6W,GAGJu0C,EAAQ,EACRE,EAAQrrD,EAAK0qD,EAAI,CAAE,EAAIA,EAAI,CAAE,EAE7B,MAED,QAGCS,EAAQljB,EAAK,EACbojB,EAAQtrD,CAEV,CAID,IAAMurD,GAAWtrD,EAAKD,GAAO,GAC5B6I,EAAS,KAAK,UAEf,KAAK,YAAc0iD,GAAWvrD,EAAKqrD,GACnC,KAAK,YAAcE,GAAWD,EAAQrrD,GACtC,KAAK,YAAckrD,EAAQtiD,EAC3B,KAAK,YAAcuiD,EAAQviD,CAE5B,CAEA,aAAcq/B,EAAIloC,EAAIhK,EAAGiK,EAAK,CAE7B,IAAM8E,EAAS,KAAK,aACnB6D,EAAS,KAAK,aACdC,EAAS,KAAK,UAEdjC,EAAKshC,EAAKr/B,EAAS2iD,EAAK5kD,EAAKiC,EAC7B4iD,EAAK,KAAK,YAAcC,EAAK,KAAK,YAClCC,EAAK,KAAK,YAAaC,EAAK,KAAK,YAEjC,GAAM51D,EAAIgK,IAASC,EAAKD,GACxB2qD,EAAK,EAAI,EACTkB,EAAMlB,EAAK,EAINmB,EAAK,CAAEH,EAAKE,EAAM,EAAIF,EAAKhB,EAAKgB,EAAK,EACrCtrB,GAAO,EAAIsrB,GAAOE,GAAQ,KAAO,EAAIF,GAAOhB,GAAO,IAAOgB,GAAO,EAAI,EACrE10B,GAAO,GAAK20B,GAAOC,GAAQ,IAAMD,GAAOjB,EAAK,GAAM,EACnDoB,EAAKH,EAAKC,EAAMD,EAAKjB,EAI3B,QAAU74D,EAAI,EAAGA,IAAM+W,EAAQ,EAAG/W,EAEjCiT,EAAQjT,CAAE,EACRg6D,EAAKljD,EAAQ6iD,EAAK35D,CAAE,EACpBuuC,EAAKz3B,EAAQ4iD,EAAK15D,CAAE,EACpBmlC,EAAKruB,EAAQhC,EAAK9U,CAAE,EACpBi6D,EAAKnjD,EAAQ8iD,EAAK55D,CAAE,EAIvB,OAAOiT,CAER,CAED,EAOMwnB,GAAN,cAAgCF,EAAY,CAU3C,YAAak+B,EAAoBC,EAAcC,EAAYC,EAAe,CAEzE,MAAOH,EAAoBC,EAAcC,EAAYC,CAAa,CAEnE,CAEA,aAAcxiB,EAAIloC,EAAIhK,EAAGiK,EAAK,CAE7B,IAAM8E,EAAS,KAAK,aACnB6D,EAAS,KAAK,aACdC,EAAS,KAAK,UAEdmjD,EAAU9jB,EAAKr/B,EACfojD,EAAUD,EAAUnjD,EAEpBqjD,GAAYl2D,EAAIgK,IAASC,EAAKD,GAC9BmsD,EAAU,EAAID,EAEf,QAAUp6D,EAAI,EAAGA,IAAM+W,EAAQ,EAAG/W,EAEjCiT,EAAQjT,CAAE,EACR8W,EAAQqjD,EAAUn6D,CAAE,EAAIq6D,EACxBvjD,EAAQojD,EAAUl6D,CAAE,EAAIo6D,EAI3B,OAAOnnD,CAER,CAED,EAQMynB,GAAN,cAAkCH,EAAY,CAU7C,YAAak+B,EAAoBC,EAAcC,EAAYC,EAAe,CAEzE,MAAOH,EAAoBC,EAAcC,EAAYC,CAAa,CAEnE,CAEA,aAAcxiB,EAAsB,CAEnC,OAAO,KAAK,iBAAkBA,EAAK,CAAE,CAEtC,CAED,EAOMzb,GAAN,KAAoB,CAUnB,YAAap6B,EAAMoW,EAAOG,EAAQwjD,EAAgB,CAEjD,GAAK/5D,IAAS,OAAY,MAAM,IAAI,MAAO,8CAA+C,EAC1F,GAAKoW,IAAU,QAAaA,EAAM,SAAW,EAAI,MAAM,IAAI,MAAO,oDAAsDpW,CAAK,EAS7H,KAAK,KAAOA,EAOZ,KAAK,MAAQkW,GAAcE,EAAO,KAAK,cAAe,EAOtD,KAAK,OAASF,GAAcK,EAAQ,KAAK,eAAgB,EAEzD,KAAK,iBAAkBwjD,GAAiB,KAAK,oBAAqB,CAEnE,CASA,OAAO,OAAQxiD,EAAQ,CAEtB,IAAMoC,EAAYpC,EAAM,YAEpBmC,EAGJ,GAAKC,EAAU,SAAW,KAAK,OAE9BD,EAAOC,EAAU,OAAQpC,CAAM,MAEzB,CAGNmC,EAAO,CAEN,KAAQnC,EAAM,KACd,MAASrB,GAAcqB,EAAM,MAAO,KAAM,EAC1C,OAAUrB,GAAcqB,EAAM,OAAQ,KAAM,CAE7C,EAEA,IAAMwiD,EAAgBxiD,EAAM,iBAAiB,EAExCwiD,IAAkBxiD,EAAM,uBAE5BmC,EAAK,cAAgBqgD,EAIvB,CAEA,OAAArgD,EAAK,KAAOnC,EAAM,cAEXmC,CAER,CASA,iCAAkChH,EAAS,CAE1C,OAAO,IAAIynB,GAAqB,KAAK,MAAO,KAAK,OAAQ,KAAK,aAAa,EAAGznB,CAAO,CAEtF,CASA,+BAAgCA,EAAS,CAExC,OAAO,IAAIwnB,GAAmB,KAAK,MAAO,KAAK,OAAQ,KAAK,aAAa,EAAGxnB,CAAO,CAEpF,CASA,+BAAgCA,EAAS,CAExC,OAAO,IAAIunB,GAAkB,KAAK,MAAO,KAAK,OAAQ,KAAK,aAAa,EAAGvnB,CAAO,CAEnF,CAQA,iBAAkBqnD,EAAgB,CAEjC,IAAIC,EAEJ,OAASD,EAAgB,CAExB,KAAK51C,GAEJ61C,EAAgB,KAAK,iCAErB,MAED,KAAK51C,GAEJ41C,EAAgB,KAAK,+BAErB,MAED,KAAK31C,GAEJ21C,EAAgB,KAAK,+BAErB,KAEF,CAEA,GAAKA,IAAkB,OAAY,CAElC,IAAMv5D,EAAU,iCACf,KAAK,cAAgB,yBAA2B,KAAK,KAEtD,GAAK,KAAK,oBAAsB,OAG/B,GAAKs5D,IAAkB,KAAK,qBAE3B,KAAK,iBAAkB,KAAK,oBAAqB,MAIjD,OAAM,IAAI,MAAOt5D,CAAQ,EAM3B,OAAAC,GAAM,iBAAkBD,CAAQ,EACzB,IAER,CAEA,YAAK,kBAAoBu5D,EAElB,IAER,CAOA,kBAAmB,CAElB,OAAS,KAAK,kBAAoB,CAEjC,KAAK,KAAK,iCAET,OAAO71C,GAER,KAAK,KAAK,+BAET,OAAOC,GAER,KAAK,KAAK,+BAET,OAAOC,EAET,CAED,CAOA,cAAe,CAEd,OAAO,KAAK,OAAO,OAAS,KAAK,MAAM,MAExC,CAQA,MAAO41C,EAAa,CAEnB,GAAKA,IAAe,EAAM,CAEzB,IAAM7jD,EAAQ,KAAK,MAEnB,QAAU3W,EAAI,EAAGuC,EAAIoU,EAAM,OAAQ3W,IAAMuC,EAAG,EAAGvC,EAE9C2W,EAAO3W,CAAE,GAAKw6D,CAIhB,CAEA,OAAO,IAER,CAQA,MAAOC,EAAY,CAElB,GAAKA,IAAc,EAAM,CAExB,IAAM9jD,EAAQ,KAAK,MAEnB,QAAU3W,EAAI,EAAGuC,EAAIoU,EAAM,OAAQ3W,IAAMuC,EAAG,EAAGvC,EAE9C2W,EAAO3W,CAAE,GAAKy6D,CAIhB,CAEA,OAAO,IAER,CAYA,KAAMC,EAAWC,EAAU,CAE1B,IAAMhkD,EAAQ,KAAK,MAClBikD,EAAQjkD,EAAM,OAEXkkD,EAAO,EACVC,EAAKF,EAAQ,EAEd,KAAQC,IAASD,GAASjkD,EAAOkkD,CAAK,EAAIH,GAEzC,EAAGG,EAIJ,KAAQC,IAAO,IAAMnkD,EAAOmkD,CAAG,EAAIH,GAElC,EAAGG,EAMJ,GAFA,EAAGA,EAEED,IAAS,GAAKC,IAAOF,EAAQ,CAG5BC,GAAQC,IAEZA,EAAK,KAAK,IAAKA,EAAI,CAAE,EACrBD,EAAOC,EAAK,GAIb,IAAM/jD,EAAS,KAAK,aAAa,EACjC,KAAK,MAAQJ,EAAM,MAAOkkD,EAAMC,CAAG,EACnC,KAAK,OAAS,KAAK,OAAO,MAAOD,EAAO9jD,EAAQ+jD,EAAK/jD,CAAO,CAE7D,CAEA,OAAO,IAER,CAQA,UAAW,CAEV,IAAIgkD,EAAQ,GAENhjD,EAAY,KAAK,aAAa,EAC/BA,EAAY,KAAK,MAAOA,CAAU,IAAM,IAE5C7W,GAAO,8CAA+C,IAAK,EAC3D65D,EAAQ,IAIT,IAAMpkD,EAAQ,KAAK,MAClBG,EAAS,KAAK,OAEd8jD,EAAQjkD,EAAM,OAEVikD,IAAU,IAEd15D,GAAO,iCAAkC,IAAK,EAC9C65D,EAAQ,IAIT,IAAIC,EAAW,KAEf,QAAUh7D,EAAI,EAAGA,IAAM46D,EAAO56D,IAAO,CAEpC,IAAMi7D,EAAWtkD,EAAO3W,CAAE,EAE1B,GAAK,OAAOi7D,GAAa,UAAY,MAAOA,CAAS,EAAI,CAExD/5D,GAAO,6CAA8C,KAAMlB,EAAGi7D,CAAS,EACvEF,EAAQ,GACR,KAED,CAEA,GAAKC,IAAa,MAAQA,EAAWC,EAAW,CAE/C/5D,GAAO,oCAAqC,KAAMlB,EAAGi7D,EAAUD,CAAS,EACxED,EAAQ,GACR,KAED,CAEAC,EAAWC,CAEZ,CAEA,GAAKnkD,IAAW,QAEVzW,GAAcyW,CAAO,EAEzB,QAAU9W,EAAI,EAAGuC,EAAIuU,EAAO,OAAQ9W,IAAMuC,EAAG,EAAGvC,EAAI,CAEnD,IAAMmC,EAAQ2U,EAAQ9W,CAAE,EAExB,GAAK,MAAOmC,CAAM,EAAI,CAErBjB,GAAO,8CAA+C,KAAMlB,EAAGmC,CAAM,EACrE44D,EAAQ,GACR,KAED,CAED,CAMF,OAAOA,CAER,CAQA,UAAW,CAKV,IAAMpkD,EAAQ,KAAK,MAAM,MAAM,EAC9BG,EAAS,KAAK,OAAO,MAAM,EAC3BC,EAAS,KAAK,aAAa,EAE3BmkD,EAAsB,KAAK,iBAAiB,IAAMt2C,GAElD9L,EAAYnC,EAAM,OAAS,EAExBwkD,EAAa,EAEjB,QAAUn7D,EAAI,EAAGA,EAAI8Y,EAAW,EAAG9Y,EAAI,CAEtC,IAAIo7D,EAAO,GAELC,EAAO1kD,EAAO3W,CAAE,EAChBs7D,EAAW3kD,EAAO3W,EAAI,CAAE,EAI9B,GAAKq7D,IAASC,IAAct7D,IAAM,GAAKq7D,IAAS1kD,EAAO,CAAE,GAExD,GAAOukD,EAwBNE,EAAO,OAxBqB,CAI5B,IAAMj3B,EAASnkC,EAAI+W,EAClBwkD,EAAUp3B,EAASptB,EACnBykD,EAAUr3B,EAASptB,EAEpB,QAAUnP,EAAI,EAAGA,IAAMmP,EAAQ,EAAGnP,EAAI,CAErC,IAAMzF,EAAQ2U,EAAQqtB,EAASv8B,CAAE,EAEjC,GAAKzF,IAAU2U,EAAQykD,EAAU3zD,CAAE,GAClCzF,IAAU2U,EAAQ0kD,EAAU5zD,CAAE,EAAI,CAElCwzD,EAAO,GACP,KAED,CAED,CAED,CAUD,GAAKA,EAAO,CAEX,GAAKp7D,IAAMm7D,EAAa,CAEvBxkD,EAAOwkD,CAAW,EAAIxkD,EAAO3W,CAAE,EAE/B,IAAMy7D,EAAaz7D,EAAI+W,EACtB2kD,EAAcP,EAAapkD,EAE5B,QAAUnP,EAAI,EAAGA,IAAMmP,EAAQ,EAAGnP,EAEjCkP,EAAQ4kD,EAAc9zD,CAAE,EAAIkP,EAAQ2kD,EAAa7zD,CAAE,CAIrD,CAEA,EAAGuzD,CAEJ,CAED,CAIA,GAAKriD,EAAY,EAAI,CAEpBnC,EAAOwkD,CAAW,EAAIxkD,EAAOmC,CAAU,EAEvC,QAAU2iD,EAAa3iD,EAAY/B,EAAQ2kD,EAAcP,EAAapkD,EAAQnP,EAAI,EAAGA,IAAMmP,EAAQ,EAAGnP,EAErGkP,EAAQ4kD,EAAc9zD,CAAE,EAAIkP,EAAQ2kD,EAAa7zD,CAAE,EAIpD,EAAGuzD,CAEJ,CAEA,OAAKA,IAAexkD,EAAM,QAEzB,KAAK,MAAQA,EAAM,MAAO,EAAGwkD,CAAW,EACxC,KAAK,OAASrkD,EAAO,MAAO,EAAGqkD,EAAapkD,CAAO,IAInD,KAAK,MAAQJ,EACb,KAAK,OAASG,GAIR,IAER,CAOA,OAAQ,CAEP,IAAMH,EAAQ,KAAK,MAAM,MAAM,EACzBG,EAAS,KAAK,OAAO,MAAM,EAE3B6kD,EAAqB,KAAK,YAC1B7jD,EAAQ,IAAI6jD,EAAoB,KAAK,KAAMhlD,EAAOG,CAAO,EAG/D,OAAAgB,EAAM,kBAAoB,KAAK,kBAExBA,CAER,CAED,EAQA6iB,GAAc,UAAU,cAAgB,GAQxCA,GAAc,UAAU,eAAiB,aAQzCA,GAAc,UAAU,gBAAkB,aAQ1CA,GAAc,UAAU,qBAAuBhW,GAOzC7K,GAAN,cAAmC6gB,EAAc,CAYhD,YAAap6B,EAAMoW,EAAOG,EAAS,CAElC,MAAOvW,EAAMoW,EAAOG,CAAO,CAE5B,CAED,EAQAgD,GAAqB,UAAU,cAAgB,OAQ/CA,GAAqB,UAAU,gBAAkB,MAQjDA,GAAqB,UAAU,qBAAuB4K,GACtD5K,GAAqB,UAAU,+BAAiC,OAChEA,GAAqB,UAAU,+BAAiC,OAO1DF,GAAN,cAAiC+gB,EAAc,CAU9C,YAAap6B,EAAMoW,EAAOG,EAAQwjD,EAAgB,CAEjD,MAAO/5D,EAAMoW,EAAOG,EAAQwjD,CAAc,CAE3C,CAED,EAQA1gD,GAAmB,UAAU,cAAgB,QAOvCF,GAAN,cAAkCihB,EAAc,CAU/C,YAAap6B,EAAMoW,EAAOG,EAAQwjD,EAAgB,CAEjD,MAAO/5D,EAAMoW,EAAOG,EAAQwjD,CAAc,CAE3C,CAED,EAQA5gD,GAAoB,UAAU,cAAgB,SAOxCkhB,GAAN,cAA0CL,EAAY,CAUrD,YAAak+B,EAAoBC,EAAcC,EAAYC,EAAe,CAEzE,MAAOH,EAAoBC,EAAcC,EAAYC,CAAa,CAEnE,CAEA,aAAcxiB,EAAIloC,EAAIhK,EAAGiK,EAAK,CAE7B,IAAM8E,EAAS,KAAK,aACnB6D,EAAS,KAAK,aACdC,EAAS,KAAK,UAEdmtB,GAAUhgC,EAAIgK,IAASC,EAAKD,GAEzBi2B,EAASiS,EAAKr/B,EAElB,QAAUtG,EAAM0zB,EAASptB,EAAQotB,IAAW1zB,EAAK0zB,GAAU,EAE1DhrB,GAAW,UAAWlG,EAAQ,EAAG6D,EAAQqtB,EAASptB,EAAQD,EAAQqtB,EAAQD,CAAM,EAIjF,OAAOjxB,CAER,CAED,EAOM4G,GAAN,cAAsC8gB,EAAc,CAUnD,YAAap6B,EAAMoW,EAAOG,EAAQwjD,EAAgB,CAEjD,MAAO/5D,EAAMoW,EAAOG,EAAQwjD,CAAc,CAE3C,CASA,+BAAgCrnD,EAAS,CAExC,OAAO,IAAI2nB,GAA6B,KAAK,MAAO,KAAK,OAAQ,KAAK,aAAa,EAAG3nB,CAAO,CAE9F,CAED,EAQA4G,GAAwB,UAAU,cAAgB,aAGlDA,GAAwB,UAAU,+BAAiC,OAO7DE,GAAN,cAAkC4gB,EAAc,CAY/C,YAAap6B,EAAMoW,EAAOG,EAAS,CAElC,MAAOvW,EAAMoW,EAAOG,CAAO,CAE5B,CAED,EAQAiD,GAAoB,UAAU,cAAgB,SAQ9CA,GAAoB,UAAU,gBAAkB,MAQhDA,GAAoB,UAAU,qBAAuB2K,GACrD3K,GAAoB,UAAU,+BAAiC,OAC/DA,GAAoB,UAAU,+BAAiC,OAOzDJ,GAAN,cAAkCghB,EAAc,CAU/C,YAAap6B,EAAMoW,EAAOG,EAAQwjD,EAAgB,CAEjD,MAAO/5D,EAAMoW,EAAOG,EAAQwjD,CAAc,CAE3C,CAED,EAQA3gD,GAAoB,UAAU,cAAgB,SAKxCkhB,GAAN,KAAoB,CAgBnB,YAAat6B,EAAO,GAAIq7D,EAAW,GAAI/jD,EAAS,CAAC,EAAGgkD,EAAY72C,GAA2B,CAO1F,KAAK,KAAOzkB,EAOZ,KAAK,OAASsX,EAOd,KAAK,SAAW+jD,EAQhB,KAAK,UAAYC,EAQjB,KAAK,KAAOj6D,GAAa,EAQzB,KAAK,SAAW,CAAC,EAGZ,KAAK,SAAW,GAEpB,KAAK,cAAc,CAIrB,CASA,OAAO,MAAOqY,EAAO,CAEpB,IAAMpC,EAAS,CAAC,EACfikD,EAAa7hD,EAAK,OAClB8hD,EAAY,GAAQ9hD,EAAK,KAAO,GAEjC,QAAUja,EAAI,EAAGuC,EAAIu5D,EAAW,OAAQ97D,IAAMuC,EAAG,EAAGvC,EAEnD6X,EAAO,KAAMmC,IAAoB8hD,EAAY97D,CAAE,CAAE,EAAE,MAAO+7D,CAAU,CAAE,EAIvE,IAAMnkD,EAAO,IAAI,KAAMqC,EAAK,KAAMA,EAAK,SAAUpC,EAAQoC,EAAK,SAAU,EACxE,OAAArC,EAAK,KAAOqC,EAAK,KAEjBrC,EAAK,SAAW,KAAK,MAAOqC,EAAK,UAAY,IAAK,EAE3CrC,CAER,CASA,OAAO,OAAQA,EAAO,CAErB,IAAMC,EAAS,CAAC,EACfmkD,EAAapkD,EAAK,OAEbqC,EAAO,CAEZ,KAAQrC,EAAK,KACb,SAAYA,EAAK,SACjB,OAAUC,EACV,KAAQD,EAAK,KACb,UAAaA,EAAK,UAClB,SAAY,KAAK,UAAWA,EAAK,QAAS,CAE3C,EAEA,QAAU5X,EAAI,EAAGuC,EAAIy5D,EAAW,OAAQh8D,IAAMuC,EAAG,EAAGvC,EAEnD6X,EAAO,KAAM8iB,GAAc,OAAQqhC,EAAYh8D,CAAE,CAAE,CAAE,EAItD,OAAOia,CAER,CAgBA,OAAO,8BAA+B1Z,EAAM07D,EAAqBtkD,EAAKukD,EAAS,CAE9E,IAAMC,EAAkBF,EAAoB,OACtCpkD,EAAS,CAAC,EAEhB,QAAU7X,EAAI,EAAGA,EAAIm8D,EAAiBn8D,IAAO,CAE5C,IAAI2W,EAAQ,CAAC,EACTG,EAAS,CAAC,EAEdH,EAAM,MACH3W,EAAIm8D,EAAkB,GAAMA,EAC9Bn8D,GACEA,EAAI,GAAMm8D,CAAgB,EAE7BrlD,EAAO,KAAM,EAAG,EAAG,CAAE,EAErB,IAAM7R,EAAQyR,GAAkBC,CAAM,EACtCA,EAAQE,GAAaF,EAAO,EAAG1R,CAAM,EACrC6R,EAASD,GAAaC,EAAQ,EAAG7R,CAAM,EAIlC,CAAEi3D,GAAUvlD,EAAO,CAAE,IAAM,IAE/BA,EAAM,KAAMwlD,CAAgB,EAC5BrlD,EAAO,KAAMA,EAAQ,CAAE,CAAE,GAI1Be,EAAO,KACN,IAAI6B,GACH,0BAA4BuiD,EAAqBj8D,CAAE,EAAE,KAAO,IAC5D2W,EAAOG,CACR,EAAE,MAAO,EAAMa,CAAI,CAAE,CAEvB,CAEA,OAAO,IAAI,KAAMpX,EAAM,GAAIsX,CAAO,CAEnC,CAYA,OAAO,WAAYukD,EAAmB77D,EAAO,CAE5C,IAAI87D,EAAYD,EAEhB,GAAK,CAAE,MAAM,QAASA,CAAkB,EAAI,CAE3C,IAAM9D,EAAI8D,EACVC,EAAY/D,EAAE,UAAYA,EAAE,SAAS,YAAcA,EAAE,UAEtD,CAEA,QAAUt4D,EAAI,EAAGA,EAAIq8D,EAAU,OAAQr8D,IAEtC,GAAKq8D,EAAWr8D,CAAE,EAAE,OAASO,EAE5B,OAAO87D,EAAWr8D,CAAE,EAMtB,OAAO,IAER,CAeA,OAAO,oCAAqCs8D,EAAc3kD,EAAKukD,EAAS,CAEvE,IAAMK,EAA0B,CAAC,EAI3BC,EAAU,qBAIhB,QAAUx8D,EAAI,EAAG+sC,EAAKuvB,EAAa,OAAQt8D,EAAI+sC,EAAI/sC,IAAO,CAEzD,IAAMy8D,EAAcH,EAAct8D,CAAE,EAC9B08D,EAAQD,EAAY,KAAK,MAAOD,CAAQ,EAE9C,GAAKE,GAASA,EAAM,OAAS,EAAI,CAEhC,IAAMn8D,EAAOm8D,EAAO,CAAE,EAElBC,EAAwBJ,EAAyBh8D,CAAK,EAEnDo8D,IAENJ,EAAyBh8D,CAAK,EAAIo8D,EAAwB,CAAC,GAI5DA,EAAsB,KAAMF,CAAY,CAEzC,CAED,CAEA,IAAMG,EAAQ,CAAC,EAEf,QAAYr8D,KAAQg8D,EAEnBK,EAAM,KAAM,KAAK,8BAA+Br8D,EAAMg8D,EAAyBh8D,CAAK,EAAGoX,EAAKukD,CAAO,CAAE,EAItG,OAAOU,CAER,CAWA,OAAO,eAAgB9nB,EAAW2L,EAAQ,CAIzC,GAFAx/C,GAAM,6EAA8E,EAE/E,CAAE6zC,EAEN,OAAA5zC,GAAO,iDAAkD,EAClD,KAIR,IAAM27D,EAAmB,SAAW3iD,EAAW4iD,EAAWC,EAAeC,EAAcC,EAAa,CAGnG,GAAKF,EAAc,SAAW,EAAI,CAEjC,IAAMpmD,EAAQ,CAAC,EACTG,EAAS,CAAC,EAEhBK,GAAa4lD,EAAepmD,EAAOG,EAAQkmD,CAAa,EAGnDrmD,EAAM,SAAW,GAErBsmD,EAAW,KAAM,IAAI/iD,EAAW4iD,EAAWnmD,EAAOG,CAAO,CAAE,CAI7D,CAED,EAEMe,EAAS,CAAC,EAEVqlD,EAAWpoB,EAAU,MAAQ,UAC7Bn9B,EAAMm9B,EAAU,KAAO,GACvB+mB,EAAY/mB,EAAU,UAGxB8mB,EAAW9mB,EAAU,QAAU,GAE7BqoB,EAAkBroB,EAAU,WAAa,CAAC,EAEhD,QAAU,EAAI,EAAG,EAAIqoB,EAAgB,OAAQ,IAAO,CAEnD,IAAMJ,EAAgBI,EAAiB,CAAE,EAAE,KAG3C,GAAK,GAAEJ,GAAiBA,EAAc,SAAW,GAGjD,GAAKA,EAAe,CAAE,EAAE,aAAe,CAGtC,IAAMK,EAAmB,CAAC,EAEtBruD,EAEJ,IAAMA,EAAI,EAAGA,EAAIguD,EAAc,OAAQhuD,IAEtC,GAAKguD,EAAehuD,CAAE,EAAE,aAEvB,QAAUvM,EAAI,EAAGA,EAAIu6D,EAAehuD,CAAE,EAAE,aAAa,OAAQvM,IAE5D46D,EAAkBL,EAAehuD,CAAE,EAAE,aAAcvM,CAAE,CAAE,EAAI,GAW9D,QAAY66D,KAAmBD,EAAmB,CAEjD,IAAMzmD,EAAQ,CAAC,EACTG,EAAS,CAAC,EAEhB,QAAUtU,EAAI,EAAGA,IAAMu6D,EAAehuD,CAAE,EAAE,aAAa,OAAQ,EAAGvM,EAAI,CAErE,IAAM86D,EAAeP,EAAehuD,CAAE,EAEtC4H,EAAM,KAAM2mD,EAAa,IAAK,EAC9BxmD,EAAO,KAAQwmD,EAAa,cAAgBD,EAAoB,EAAI,CAAE,CAEvE,CAEAxlD,EAAO,KAAM,IAAI6B,GAAqB,yBAA2B2jD,EAAkB,IAAK1mD,EAAOG,CAAO,CAAE,CAEzG,CAEA8kD,EAAWwB,EAAiB,OAASzlD,CAEtC,KAAO,CAIN,IAAM4lD,EAAW,UAAY9c,EAAO,CAAE,EAAE,KAAO,IAE/Coc,EACCljD,GAAqB4jD,EAAW,YAChCR,EAAe,MAAOllD,CAAO,EAE9BglD,EACChjD,GAAyB0jD,EAAW,cACpCR,EAAe,MAAOllD,CAAO,EAE9BglD,EACCljD,GAAqB4jD,EAAW,SAChCR,EAAe,MAAOllD,CAAO,CAE/B,CAED,CAEA,OAAKA,EAAO,SAAW,EAEf,KAIK,IAAI,KAAMqlD,EAAUtB,EAAU/jD,EAAQgkD,CAAU,CAI9D,CAOA,eAAgB,CAEf,IAAMhkD,EAAS,KAAK,OAChB+jD,EAAW,EAEf,QAAU57D,EAAI,EAAGuC,EAAIsV,EAAO,OAAQ7X,IAAMuC,EAAG,EAAGvC,EAAI,CAEnD,IAAM8X,EAAQ,KAAK,OAAQ9X,CAAE,EAE7B47D,EAAW,KAAK,IAAKA,EAAU9jD,EAAM,MAAOA,EAAM,MAAM,OAAS,CAAE,CAAE,CAEtE,CAEA,YAAK,SAAW8jD,EAET,IAER,CAOA,MAAO,CAEN,QAAU57D,EAAI,EAAGA,EAAI,KAAK,OAAO,OAAQA,IAExC,KAAK,OAAQA,CAAE,EAAE,KAAM,EAAG,KAAK,QAAS,EAIzC,OAAO,IAER,CAQA,UAAW,CAEV,IAAI+6D,EAAQ,GAEZ,QAAU/6D,EAAI,EAAGA,EAAI,KAAK,OAAO,OAAQA,IAExC+6D,EAAQA,GAAS,KAAK,OAAQ/6D,CAAE,EAAE,SAAS,EAI5C,OAAO+6D,CAER,CAQA,UAAW,CAEV,QAAU/6D,EAAI,EAAGA,EAAI,KAAK,OAAO,OAAQA,IAExC,KAAK,OAAQA,CAAE,EAAE,SAAS,EAI3B,OAAO,IAER,CAOA,OAAQ,CAEP,IAAM6X,EAAS,CAAC,EAEhB,QAAU7X,EAAI,EAAGA,EAAI,KAAK,OAAO,OAAQA,IAExC6X,EAAO,KAAM,KAAK,OAAQ7X,CAAE,EAAE,MAAM,CAAE,EAIvC,IAAM4X,EAAO,IAAI,KAAK,YAAa,KAAK,KAAM,KAAK,SAAUC,EAAQ,KAAK,SAAU,EAEpF,OAAAD,EAAK,SAAW,KAAK,MAAO,KAAK,UAAW,KAAK,QAAS,CAAE,EAErDA,CAER,CAOA,QAAS,CAER,OAAO,KAAK,YAAY,OAAQ,IAAK,CAEtC,CAED,EAqFMkjB,GAAQ,CASb,QAAS,GAQT,MAAO,CAAC,EAUR,IAAK,SAAWxjB,EAAKkmD,EAAO,CAEtB,KAAK,UAAY,KAItB,KAAK,MAAOlmD,CAAI,EAAIkmD,EAErB,EASA,IAAK,SAAWlmD,EAAM,CAErB,GAAK,KAAK,UAAY,GAItB,OAAO,KAAK,MAAOA,CAAI,CAExB,EAQA,OAAQ,SAAWA,EAAM,CAExB,OAAO,KAAK,MAAOA,CAAI,CAExB,EAOA,MAAO,UAAY,CAElB,KAAK,MAAQ,CAAC,CAEf,CAED,EAmBMyjB,GAAN,KAAqB,CASpB,YAAa0iC,EAAQC,EAAYC,EAAU,CAE1C,IAAMliB,EAAQ,KAEVmiB,EAAY,GACZC,EAAc,EACdC,EAAa,EACbC,EACEC,EAAW,CAAC,EAWlB,KAAK,QAAU,OAQf,KAAK,OAASP,EAQd,KAAK,WAAaC,EAQlB,KAAK,QAAUC,EAQf,KAAK,iBAAmB,KAQxB,KAAK,UAAY,SAAWjyB,EAAM,CAEjCoyB,IAEKF,IAAc,IAEbniB,EAAM,UAAY,QAEtBA,EAAM,QAAS/P,EAAKmyB,EAAaC,CAAW,EAM9CF,EAAY,EAEb,EAQA,KAAK,QAAU,SAAWlyB,EAAM,CAE/BmyB,IAEKpiB,EAAM,aAAe,QAEzBA,EAAM,WAAY/P,EAAKmyB,EAAaC,CAAW,EAI3CD,IAAgBC,IAEpBF,EAAY,GAEPniB,EAAM,SAAW,QAErBA,EAAM,OAAO,EAMhB,EAQA,KAAK,UAAY,SAAW/P,EAAM,CAE5B+P,EAAM,UAAY,QAEtBA,EAAM,QAAS/P,CAAI,CAIrB,EASA,KAAK,WAAa,SAAWA,EAAM,CAElC,OAAKqyB,EAEGA,EAAaryB,CAAI,EAIlBA,CAER,EAoCA,KAAK,eAAiB,SAAWuyB,EAAY,CAE5C,OAAAF,EAAcE,EAEP,IAER,EAgBA,KAAK,WAAa,SAAWC,EAAOC,EAAS,CAE5C,OAAAH,EAAS,KAAME,EAAOC,CAAO,EAEtB,IAER,EAQA,KAAK,cAAgB,SAAWD,EAAQ,CAEvC,IAAM9wD,EAAQ4wD,EAAS,QAASE,CAAM,EAEtC,OAAK9wD,IAAU,IAEd4wD,EAAS,OAAQ5wD,EAAO,CAAE,EAIpB,IAER,EAQA,KAAK,WAAa,SAAWowD,EAAO,CAEnC,QAAUx9D,EAAI,EAAG4V,EAAIooD,EAAS,OAAQh+D,EAAI4V,EAAG5V,GAAK,EAAI,CAErD,IAAMk+D,EAAQF,EAAUh+D,CAAE,EACpBm+D,EAASH,EAAUh+D,EAAI,CAAE,EAI/B,GAFKk+D,EAAM,SAASA,EAAM,UAAY,GAEjCA,EAAM,KAAMV,CAAK,EAErB,OAAOW,CAIT,CAEA,OAAO,IAER,EASA,KAAK,MAAQ,UAAY,CAGxB,YAAK,gBAAgB,MAAM,EAC3B,KAAK,iBAAmB,KAEjB,IAER,CAED,CAUA,IAAI,iBAAkB,CAErB,OAAO,KAAK,mBAEX,KAAK,iBAAmB,IAAI,iBAItB,KAAK,gBAEb,CAED,EAQMnjC,GAAsC,IAAID,GAO1CE,GAAN,KAAa,CAOZ,YAAamjC,EAAU,CAQtB,KAAK,QAAYA,IAAY,OAAcA,EAAUpjC,GASrD,KAAK,YAAc,YAQnB,KAAK,gBAAkB,GAOvB,KAAK,KAAO,GAOZ,KAAK,aAAe,GAQpB,KAAK,cAAgB,CAAC,CAEvB,CAYA,MAA+C,CAAC,CAShD,UAAW0Q,EAAKgyB,EAAa,CAE5B,IAAMjiB,EAAQ,KAEd,OAAO,IAAI,QAAS,SAAWh6C,EAASC,EAAS,CAEhD+5C,EAAM,KAAM/P,EAAKjqC,EAASi8D,EAAYh8D,CAAO,CAE9C,CAAE,CAEH,CASA,OAAoB,CAAC,CASrB,eAAgB28D,EAAc,CAE7B,YAAK,YAAcA,EACZ,IAER,CAWA,mBAAoBl8D,EAAQ,CAE3B,YAAK,gBAAkBA,EAChB,IAER,CAQA,QAAS61D,EAAO,CAEf,YAAK,KAAOA,EACL,IAER,CAQA,gBAAiBsG,EAAe,CAE/B,YAAK,aAAeA,EACb,IAER,CASA,iBAAkBC,EAAgB,CAEjC,YAAK,cAAgBA,EACd,IAER,CAQA,OAAQ,CAEP,OAAO,IAER,CAED,EA0BAtjC,GAAO,sBAAwB,YAEzBC,GAAU,CAAC,EAEXC,GAAN,cAAwB,KAAM,CAE7B,YAAan6B,EAASw9D,EAAW,CAEhC,MAAOx9D,CAAQ,EACf,KAAK,SAAWw9D,CAEjB,CAED,EAiBMpjC,GAAN,cAAyBH,EAAO,CAO/B,YAAamjC,EAAU,CAEtB,MAAOA,CAAQ,EAQf,KAAK,SAAW,GAQhB,KAAK,aAAe,GAQpB,KAAK,iBAAmB,IAAI,eAE7B,CAWA,KAAM1yB,EAAK+xB,EAAQC,EAAYC,EAAU,CAEnCjyB,IAAQ,SAAYA,EAAM,IAE1B,KAAK,OAAS,SAAYA,EAAM,KAAK,KAAOA,GAEjDA,EAAM,KAAK,QAAQ,WAAYA,CAAI,EAEnC,IAAM+yB,EAAS3jC,GAAM,IAAK,QAAQ4Q,CAAG,EAAG,EAExC,GAAK+yB,IAAW,OAEf,YAAK,QAAQ,UAAW/yB,CAAI,EAE5B,WAAY,IAAM,CAEZ+xB,GAASA,EAAQgB,CAAO,EAE7B,KAAK,QAAQ,QAAS/yB,CAAI,CAE3B,EAAG,CAAE,EAEE+yB,EAMR,GAAKvjC,GAASwQ,CAAI,IAAM,OAAY,CAEnCxQ,GAASwQ,CAAI,EAAE,KAAM,CAEpB,OAAQ+xB,EACR,WAAYC,EACZ,QAASC,CAEV,CAAE,EAEF,MAED,CAGAziC,GAASwQ,CAAI,EAAI,CAAC,EAElBxQ,GAASwQ,CAAI,EAAE,KAAM,CACpB,OAAQ+xB,EACR,WAAYC,EACZ,QAASC,CACV,CAAE,EAGF,IAAMe,EAAM,IAAI,QAAShzB,EAAK,CAC7B,QAAS,IAAI,QAAS,KAAK,aAAc,EACzC,YAAa,KAAK,gBAAkB,UAAY,cAChD,OAAU,OAAO,YAAY,KAAQ,WAAe,YAAY,IAAK,CAAE,KAAK,iBAAiB,OAAQ,KAAK,QAAQ,gBAAgB,MAAO,CAAE,EAAI,KAAK,iBAAiB,MACtK,CAAE,EAGIizB,EAAW,KAAK,SAChBC,EAAe,KAAK,aAG1B,MAAOF,CAAI,EACT,KAAMF,GAAY,CAElB,GAAKA,EAAS,SAAW,KAAOA,EAAS,SAAW,EAAI,CAavD,GARKA,EAAS,SAAW,GAExBv9D,GAAM,qCAAsC,EAMxC,OAAO,eAAmB,KAAeu9D,EAAS,OAAS,QAAaA,EAAS,KAAK,YAAc,OAExG,OAAOA,EAIR,IAAMK,EAAY3jC,GAASwQ,CAAI,EACzBozB,EAASN,EAAS,KAAK,UAAU,EAIjCO,EAAgBP,EAAS,QAAQ,IAAK,aAAc,GAAKA,EAAS,QAAQ,IAAK,gBAAiB,EAChGQ,EAAQD,EAAgB,SAAUA,CAAc,EAAI,EACpDE,EAAmBD,IAAU,EAC/BE,EAAS,EAGPC,EAAS,IAAI,eAAgB,CAClC,MAAOC,EAAa,CAEnBC,EAAS,EAET,SAASA,GAAW,CAEnBP,EAAO,KAAK,EAAE,KAAM,CAAE,CAAE,KAAAQ,EAAM,MAAAn9D,CAAM,IAAO,CAE1C,GAAKm9D,EAEJF,EAAW,MAAM,MAEX,CAENF,GAAU/8D,EAAM,WAEhB,IAAMqhC,EAAQ,IAAI,cAAe,WAAY,CAAE,iBAAAy7B,EAAkB,OAAAC,EAAQ,MAAAF,CAAM,CAAE,EACjF,QAAUh/D,EAAI,EAAG+sC,EAAK8xB,EAAU,OAAQ7+D,EAAI+sC,EAAI/sC,IAAO,CAEtD,IAAMmnC,EAAW03B,EAAW7+D,CAAE,EACzBmnC,EAAS,YAAaA,EAAS,WAAY3D,CAAM,CAEvD,CAEA47B,EAAW,QAASj9D,CAAM,EAC1Bk9D,EAAS,CAEV,CAED,EAAK52D,GAAO,CAEX22D,EAAW,MAAO32D,CAAE,CAErB,CAAE,CAEH,CAED,CAED,CAAE,EAEF,OAAO,IAAI,SAAU02D,CAAO,CAE7B,KAEC,OAAM,IAAIhkC,GAAW,cAAcqjC,EAAS,GAAG,oBAAoBA,EAAS,MAAM,KAAKA,EAAS,UAAU,GAAIA,CAAS,CAIzH,CAAE,EACD,KAAMA,GAAY,CAElB,OAASI,EAAe,CAEvB,IAAK,cAEJ,OAAOJ,EAAS,YAAY,EAE7B,IAAK,OAEJ,OAAOA,EAAS,KAAK,EAEtB,IAAK,WAEJ,OAAOA,EAAS,KAAK,EACnB,KAAMe,GAES,IAAI,UAAU,EACf,gBAAiBA,EAAMZ,CAAS,CAE7C,EAEJ,IAAK,OAEJ,OAAOH,EAAS,KAAK,EAEtB,QAEC,GAAKG,IAAa,GAEjB,OAAOH,EAAS,KAAK,EAEf,CAIN,IAAMgB,EADK,0BACK,KAAMb,CAAS,EACzBc,EAAQD,GAAQA,EAAM,CAAE,EAAIA,EAAM,CAAE,EAAE,YAAY,EAAI,OACtDE,EAAU,IAAI,YAAaD,CAAM,EACvC,OAAOjB,EAAS,YAAY,EAAE,KAAMxkB,GAAM0lB,EAAQ,OAAQ1lB,CAAG,CAAE,CAEhE,CAEF,CAED,CAAE,EACD,KAAMvqC,GAAQ,CAIdqrB,GAAM,IAAK,QAAQ4Q,CAAG,GAAIj8B,CAAK,EAE/B,IAAMovD,EAAY3jC,GAASwQ,CAAI,EAC/B,OAAOxQ,GAASwQ,CAAI,EAEpB,QAAU1rC,EAAI,EAAG+sC,EAAK8xB,EAAU,OAAQ7+D,EAAI+sC,EAAI/sC,IAAO,CAEtD,IAAMmnC,EAAW03B,EAAW7+D,CAAE,EACzBmnC,EAAS,QAASA,EAAS,OAAQ13B,CAAK,CAE9C,CAED,CAAE,EACD,MAAOkwD,GAAO,CAId,IAAMd,EAAY3jC,GAASwQ,CAAI,EAE/B,GAAKmzB,IAAc,OAGlB,WAAK,QAAQ,UAAWnzB,CAAI,EACtBi0B,EAIP,OAAOzkC,GAASwQ,CAAI,EAEpB,QAAU1rC,EAAI,EAAG+sC,EAAK8xB,EAAU,OAAQ7+D,EAAI+sC,EAAI/sC,IAAO,CAEtD,IAAMmnC,EAAW03B,EAAW7+D,CAAE,EACzBmnC,EAAS,SAAUA,EAAS,QAASw4B,CAAI,CAE/C,CAEA,KAAK,QAAQ,UAAWj0B,CAAI,CAE7B,CAAE,EACD,QAAS,IAAM,CAEf,KAAK,QAAQ,QAASA,CAAI,CAE3B,CAAE,EAEH,KAAK,QAAQ,UAAWA,CAAI,CAE7B,CAQA,gBAAiBvpC,EAAQ,CAExB,YAAK,aAAeA,EACb,IAER,CAQA,YAAaA,EAAQ,CAEpB,YAAK,SAAWA,EACT,IAER,CAOA,OAAQ,CAEP,YAAK,iBAAiB,MAAM,EAC5B,KAAK,iBAAmB,IAAI,gBAErB,IAER,CAED,EAaMk5B,GAAN,cAA8BJ,EAAO,CAOpC,YAAamjC,EAAU,CAEtB,MAAOA,CAAQ,CAEhB,CAWA,KAAM1yB,EAAK+xB,EAAQC,EAAYC,EAAU,CAExC,IAAMliB,EAAQ,KAER0iB,EAAS,IAAI/iC,GAAY,KAAK,OAAQ,EAC5C+iC,EAAO,QAAS,KAAK,IAAK,EAC1BA,EAAO,iBAAkB,KAAK,aAAc,EAC5CA,EAAO,mBAAoB,KAAK,eAAgB,EAChDA,EAAO,KAAMzyB,EAAK,SAAW6zB,EAAO,CAEnC,GAAI,CAEH9B,EAAQhiB,EAAM,MAAO,KAAK,MAAO8jB,CAAK,CAAE,CAAE,CAE3C,OAAU92D,EAAI,CAERk1D,EAEJA,EAASl1D,CAAE,EAIXvH,GAAOuH,CAAE,EAIVgzC,EAAM,QAAQ,UAAW/P,CAAI,CAE9B,CAED,EAAGgyB,EAAYC,CAAQ,CAExB,CAQA,MAAO1jD,EAAO,CAEb,IAAMo7B,EAAa,CAAC,EAEpB,QAAUr1C,EAAI,EAAGA,EAAIia,EAAK,OAAQja,IAAO,CAExC,IAAM4X,EAAOijB,GAAc,MAAO5gB,EAAMja,CAAE,CAAE,EAE5Cq1C,EAAW,KAAMz9B,CAAK,CAEvB,CAEA,OAAOy9B,CAER,CAED,EAYM/Z,GAAN,cAAsCL,EAAO,CAO5C,YAAamjC,EAAU,CAEtB,MAAOA,CAAQ,CAEhB,CAcA,KAAM1yB,EAAK+xB,EAAQC,EAAYC,EAAU,CAExC,IAAMliB,EAAQ,KAERtG,EAAS,CAAC,EAEVj6B,EAAU,IAAIqb,GAEd4nC,EAAS,IAAI/iC,GAAY,KAAK,OAAQ,EAC5C+iC,EAAO,QAAS,KAAK,IAAK,EAC1BA,EAAO,gBAAiB,aAAc,EACtCA,EAAO,iBAAkB,KAAK,aAAc,EAC5CA,EAAO,mBAAoB1iB,EAAM,eAAgB,EAEjD,IAAIyjB,EAAS,EAEb,SAASU,EAAa5/D,EAAI,CAEzBm+D,EAAO,KAAMzyB,EAAK1rC,CAAE,EAAG,SAAWG,EAAS,CAE1C,IAAM0/D,EAAWpkB,EAAM,MAAOt7C,EAAQ,EAAK,EAE3Cg1C,EAAQn1C,CAAE,EAAI,CACb,MAAO6/D,EAAS,MAChB,OAAQA,EAAS,OACjB,OAAQA,EAAS,OACjB,QAASA,EAAS,OACnB,EAEAX,GAAU,EAELA,IAAW,IAEVW,EAAS,cAAgB,IAAI3kD,EAAQ,UAAY4I,IAEtD5I,EAAQ,MAAQi6B,EAChBj6B,EAAQ,OAAS2kD,EAAS,OAC1B3kD,EAAQ,YAAc,GAEjBuiD,GAASA,EAAQviD,CAAQ,EAIhC,EAAGwiD,EAAYC,CAAQ,CAExB,CAEA,GAAK,MAAM,QAASjyB,CAAI,EAEvB,QAAU1rC,EAAI,EAAG+sC,EAAKrB,EAAI,OAAQ1rC,EAAI+sC,EAAI,EAAG/sC,EAE5C4/D,EAAa5/D,CAAE,OAQhBm+D,EAAO,KAAMzyB,EAAK,SAAWvrC,EAAS,CAErC,IAAM0/D,EAAWpkB,EAAM,MAAOt7C,EAAQ,EAAK,EAE3C,GAAK0/D,EAAS,UAAY,CAEzB,IAAMhR,EAAQgR,EAAS,QAAQ,OAASA,EAAS,YAEjD,QAAU72D,EAAI,EAAGA,EAAI6lD,EAAO7lD,IAAO,CAElCmsC,EAAQnsC,CAAE,EAAI,CAAE,QAAS,CAAC,CAAE,EAE5B,QAAUhJ,EAAI,EAAGA,EAAI6/D,EAAS,YAAa7/D,IAE1Cm1C,EAAQnsC,CAAE,EAAE,QAAQ,KAAM62D,EAAS,QAAS72D,EAAI62D,EAAS,YAAc7/D,CAAE,CAAE,EAC3Em1C,EAAQnsC,CAAE,EAAE,OAAS62D,EAAS,OAC9B1qB,EAAQnsC,CAAE,EAAE,MAAQ62D,EAAS,MAC7B1qB,EAAQnsC,CAAE,EAAE,OAAS62D,EAAS,MAIhC,CAEA3kD,EAAQ,MAAQi6B,CAEjB,MAECj6B,EAAQ,MAAM,MAAQ2kD,EAAS,MAC/B3kD,EAAQ,MAAM,OAAS2kD,EAAS,OAChC3kD,EAAQ,QAAU2kD,EAAS,QAIvBA,EAAS,cAAgB,IAE7B3kD,EAAQ,UAAY4I,IAIrB5I,EAAQ,OAAS2kD,EAAS,OAC1B3kD,EAAQ,YAAc,GAEjBuiD,GAASA,EAAQviD,CAAQ,CAE/B,EAAGwiD,EAAYC,CAAQ,EAIxB,OAAOziD,CAER,CAED,EAEMqgB,GAAW,IAAI,QAefC,GAAN,cAA0BP,EAAO,CAOhC,YAAamjC,EAAU,CAEtB,MAAOA,CAAQ,CAEhB,CAcA,KAAM1yB,EAAK+xB,EAAQC,EAAYC,EAAU,CAEnC,KAAK,OAAS,SAAYjyB,EAAM,KAAK,KAAOA,GAEjDA,EAAM,KAAK,QAAQ,WAAYA,CAAI,EAEnC,IAAM+P,EAAQ,KAERgjB,EAAS3jC,GAAM,IAAK,SAAS4Q,CAAG,EAAG,EAEzC,GAAK+yB,IAAW,OAAY,CAE3B,GAAKA,EAAO,WAAa,GAExBhjB,EAAM,QAAQ,UAAW/P,CAAI,EAE7B,WAAY,UAAY,CAElB+xB,GAASA,EAAQgB,CAAO,EAE7BhjB,EAAM,QAAQ,QAAS/P,CAAI,CAE5B,EAAG,CAAE,MAEC,CAEN,IAAIo0B,EAAMvkC,GAAS,IAAKkjC,CAAO,EAE1BqB,IAAQ,SAEZA,EAAM,CAAC,EACPvkC,GAAS,IAAKkjC,EAAQqB,CAAI,GAI3BA,EAAI,KAAM,CAAE,OAAArC,EAAQ,QAAAE,CAAQ,CAAE,CAE/B,CAEA,OAAOc,CAER,CAEA,IAAMr3D,EAAQ9G,GAAiB,KAAM,EAErC,SAASy/D,GAAc,CAEtBC,EAAqB,EAEhBvC,GAASA,EAAQ,IAAK,EAI3B,IAAMoB,EAAYtjC,GAAS,IAAK,IAAK,GAAK,CAAC,EAE3C,QAAUv7B,EAAI,EAAGA,EAAI6+D,EAAU,OAAQ7+D,IAAO,CAE7C,IAAMmnC,EAAW03B,EAAW7+D,CAAE,EACzBmnC,EAAS,QAASA,EAAS,OAAQ,IAAK,CAE9C,CAEA5L,GAAS,OAAQ,IAAK,EAEtBkgB,EAAM,QAAQ,QAAS/P,CAAI,CAE5B,CAEA,SAASu0B,EAAcz8B,EAAQ,CAE9Bw8B,EAAqB,EAEhBrC,GAAUA,EAASn6B,CAAM,EAE9B1I,GAAM,OAAQ,SAAS4Q,CAAG,EAAG,EAI7B,IAAMmzB,EAAYtjC,GAAS,IAAK,IAAK,GAAK,CAAC,EAE3C,QAAUv7B,EAAI,EAAGA,EAAI6+D,EAAU,OAAQ7+D,IAAO,CAE7C,IAAMmnC,EAAW03B,EAAW7+D,CAAE,EACzBmnC,EAAS,SAAUA,EAAS,QAAS3D,CAAM,CAEjD,CAEAjI,GAAS,OAAQ,IAAK,EAGtBkgB,EAAM,QAAQ,UAAW/P,CAAI,EAC7B+P,EAAM,QAAQ,QAAS/P,CAAI,CAE5B,CAEA,SAASs0B,GAAuB,CAE/B54D,EAAM,oBAAqB,OAAQ24D,EAAa,EAAM,EACtD34D,EAAM,oBAAqB,QAAS64D,EAAc,EAAM,CAEzD,CAEA,OAAA74D,EAAM,iBAAkB,OAAQ24D,EAAa,EAAM,EACnD34D,EAAM,iBAAkB,QAAS64D,EAAc,EAAM,EAEhDv0B,EAAI,MAAO,EAAG,CAAE,IAAM,SAErB,KAAK,cAAgB,SAAYtkC,EAAM,YAAc,KAAK,aAIhE0zB,GAAM,IAAK,SAAS4Q,CAAG,GAAItkC,CAAM,EACjCq0C,EAAM,QAAQ,UAAW/P,CAAI,EAE7BtkC,EAAM,IAAMskC,EAELtkC,CAER,CAED,EA4BMq0B,GAAN,cAAgCR,EAAO,CAOtC,YAAamjC,EAAU,CAEtB,MAAOA,CAAQ,CAEhB,CAgBA,KAAM8B,EAAMzC,EAAQC,EAAYC,EAAU,CAEzC,IAAMziD,EAAU,IAAIyV,GACpBzV,EAAQ,WAAahU,GAErB,IAAMi3D,EAAS,IAAI3iC,GAAa,KAAK,OAAQ,EAC7C2iC,EAAO,eAAgB,KAAK,WAAY,EACxCA,EAAO,QAAS,KAAK,IAAK,EAE1B,IAAIe,EAAS,EAEb,SAASU,EAAa5/D,EAAI,CAEzBm+D,EAAO,KAAM+B,EAAMlgE,CAAE,EAAG,SAAWoH,EAAQ,CAE1C8T,EAAQ,OAAQlb,CAAE,EAAIoH,EAEtB83D,IAEKA,IAAW,IAEfhkD,EAAQ,YAAc,GAEjBuiD,GAASA,EAAQviD,CAAQ,EAIhC,EAAG,OAAWyiD,CAAQ,CAEvB,CAEA,QAAU39D,EAAI,EAAGA,EAAIkgE,EAAK,OAAQ,EAAGlgE,EAEpC4/D,EAAa5/D,CAAE,EAIhB,OAAOkb,CAER,CAED,EAYMwgB,GAAN,cAAgCT,EAAO,CAOtC,YAAamjC,EAAU,CAEtB,MAAOA,CAAQ,CAEhB,CAcA,KAAM1yB,EAAK+xB,EAAQC,EAAYC,EAAU,CAExC,IAAMliB,EAAQ,KAERvgC,EAAU,IAAI8X,GAEdmrC,EAAS,IAAI/iC,GAAY,KAAK,OAAQ,EAC5C,OAAA+iC,EAAO,gBAAiB,aAAc,EACtCA,EAAO,iBAAkB,KAAK,aAAc,EAC5CA,EAAO,QAAS,KAAK,IAAK,EAC1BA,EAAO,mBAAoB1iB,EAAM,eAAgB,EACjD0iB,EAAO,KAAMzyB,EAAK,SAAWvrC,EAAS,CAErC,IAAIggE,EAEJ,GAAI,CAEHA,EAAU1kB,EAAM,MAAOt7C,CAAO,CAE/B,OAAUe,EAAQ,CAEjB,GAAKy8D,IAAY,OAEhBA,EAASz8D,CAAM,MAET,CAENA,EAAOA,CAAM,EACb,MAED,CAED,CAEKi/D,EAAQ,QAAU,OAEtBjlD,EAAQ,MAAQilD,EAAQ,MAEbA,EAAQ,OAAS,SAE5BjlD,EAAQ,MAAM,MAAQilD,EAAQ,MAC9BjlD,EAAQ,MAAM,OAASilD,EAAQ,OAC/BjlD,EAAQ,MAAM,KAAOilD,EAAQ,MAI9BjlD,EAAQ,MAAQilD,EAAQ,QAAU,OAAYA,EAAQ,MAAQ58C,GAC9DrI,EAAQ,MAAQilD,EAAQ,QAAU,OAAYA,EAAQ,MAAQ58C,GAE9DrI,EAAQ,UAAYilD,EAAQ,YAAc,OAAYA,EAAQ,UAAYr8C,GAC1E5I,EAAQ,UAAYilD,EAAQ,YAAc,OAAYA,EAAQ,UAAYr8C,GAE1E5I,EAAQ,WAAailD,EAAQ,aAAe,OAAYA,EAAQ,WAAa,EAExEA,EAAQ,aAAe,SAE3BjlD,EAAQ,WAAailD,EAAQ,YAIzBA,EAAQ,QAAU,SAEtBjlD,EAAQ,MAAQilD,EAAQ,OAIpBA,EAAQ,SAAW,SAEvBjlD,EAAQ,OAASilD,EAAQ,QAIrBA,EAAQ,OAAS,SAErBjlD,EAAQ,KAAOilD,EAAQ,MAInBA,EAAQ,UAAY,SAExBjlD,EAAQ,QAAUilD,EAAQ,QAC1BjlD,EAAQ,UAAY+I,IAIhBk8C,EAAQ,cAAgB,IAE5BjlD,EAAQ,UAAY4I,IAIhBq8C,EAAQ,kBAAoB,SAEhCjlD,EAAQ,gBAAkBilD,EAAQ,iBAInCjlD,EAAQ,YAAc,GAEjBuiD,GAASA,EAAQviD,EAASilD,CAAQ,CAExC,EAAGzC,EAAYC,CAAQ,EAGhBziD,CAER,CAED,EAkBMygB,GAAN,cAA4BV,EAAO,CAOlC,YAAamjC,EAAU,CAEtB,MAAOA,CAAQ,CAEhB,CAcA,KAAM1yB,EAAK+xB,EAAQC,EAAYC,EAAU,CAExC,IAAMziD,EAAU,IAAI8N,GAEdm1C,EAAS,IAAI3iC,GAAa,KAAK,OAAQ,EAC7C,OAAA2iC,EAAO,eAAgB,KAAK,WAAY,EACxCA,EAAO,QAAS,KAAK,IAAK,EAE1BA,EAAO,KAAMzyB,EAAK,SAAWtkC,EAAQ,CAEpC8T,EAAQ,MAAQ9T,EAChB8T,EAAQ,YAAc,GAEjBuiD,IAAW,QAEfA,EAAQviD,CAAQ,CAIlB,EAAGwiD,EAAYC,CAAQ,EAEhBziD,CAER,CAED,EASM0gB,GAAN,cAAoBhP,EAAS,CAQ5B,YAAa3mB,EAAOm6D,EAAY,EAAI,CAEnC,MAAM,EASN,KAAK,QAAU,GAEf,KAAK,KAAO,QAOZ,KAAK,MAAQ,IAAIvyC,GAAO5nB,CAAM,EAQ9B,KAAK,UAAYm6D,CAElB,CAMA,SAAU,CAET,KAAK,cAAe,CAAE,KAAM,SAAU,CAAE,CAEzC,CAEA,KAAMj0B,EAAQ/xB,EAAY,CAEzB,aAAM,KAAM+xB,EAAQ/xB,CAAU,EAE9B,KAAK,MAAM,KAAM+xB,EAAO,KAAM,EAC9B,KAAK,UAAYA,EAAO,UAEjB,IAER,CAEA,OAAQZ,EAAO,CAEd,IAAM97B,EAAO,MAAM,OAAQ87B,CAAK,EAEhC,OAAA97B,EAAK,OAAO,MAAQ,KAAK,MAAM,OAAO,EACtCA,EAAK,OAAO,UAAY,KAAK,UAEtBA,CAER,CAED,EAeMosB,GAAN,cAA8BD,EAAM,CASnC,YAAaykC,EAAUC,EAAaF,EAAY,CAE/C,MAAOC,EAAUD,CAAU,EAS3B,KAAK,kBAAoB,GAEzB,KAAK,KAAO,kBAEZ,KAAK,SAAS,KAAMxzC,GAAS,UAAW,EACxC,KAAK,aAAa,EAOlB,KAAK,YAAc,IAAIiB,GAAOyyC,CAAY,CAE3C,CAEA,KAAMn0B,EAAQ/xB,EAAY,CAEzB,aAAM,KAAM+xB,EAAQ/xB,CAAU,EAE9B,KAAK,YAAY,KAAM+xB,EAAO,WAAY,EAEnC,IAER,CAEA,OAAQZ,EAAO,CAEd,IAAM97B,EAAO,MAAM,OAAQ87B,CAAK,EAEhC,OAAA97B,EAAK,OAAO,YAAc,KAAK,YAAY,OAAO,EAE3CA,CAER,CAED,EAEMqsB,GAAkC,IAAI7Q,GACtC8Q,GAAoC,IAAIrxB,EACxCsxB,GAA4B,IAAItxB,EAQhCuxB,GAAN,KAAkB,CAOjB,YAAaphB,EAAS,CAOrB,KAAK,OAASA,EASd,KAAK,UAAY,EAYjB,KAAK,KAAO,EAWZ,KAAK,WAAa,EAalB,KAAK,OAAS,EAQd,KAAK,YAAc,EASnB,KAAK,QAAU,IAAIjQ,GAAS,IAAK,GAAI,EAQrC,KAAK,QAAU6T,GASf,KAAK,IAAM,KAUX,KAAK,QAAU,KAQf,KAAK,OAAS,IAAIwM,GASlB,KAAK,WAAa,GAUlB,KAAK,YAAc,GAEnB,KAAK,SAAW,IAAImJ,GACpB,KAAK,cAAgB,IAAIxpB,GAAS,EAAG,CAAE,EAEvC,KAAK,eAAiB,EAEtB,KAAK,WAAa,CAEjB,IAAIqe,GAAS,EAAG,EAAG,EAAG,CAAE,CAEzB,CAED,CAQA,kBAAmB,CAElB,OAAO,KAAK,cAEb,CAOA,YAAa,CAEZ,OAAO,KAAK,QAEb,CAOA,eAAgBs3C,EAAQ,CAEvB,IAAMla,EAAe,KAAK,OACpBma,EAAe,KAAK,OAE1BzkC,GAAoB,sBAAuBwkC,EAAM,WAAY,EAC7Dla,EAAa,SAAS,KAAMtqB,EAAoB,EAEhDC,GAAY,sBAAuBukC,EAAM,OAAO,WAAY,EAC5Dla,EAAa,OAAQrqB,EAAY,EACjCqqB,EAAa,kBAAkB,EAE/BvqB,GAAkB,iBAAkBuqB,EAAa,iBAAkBA,EAAa,kBAAmB,EACnG,KAAK,SAAS,wBAAyBvqB,GAAmBuqB,EAAa,iBAAkBA,EAAa,aAAc,EAE/GA,EAAa,cAEjBma,EAAa,IACZ,GAAK,EAAK,EAAK,GACf,EAAK,GAAK,EAAK,GACf,EAAK,EAAK,EAAK,EACf,EAAK,EAAK,EAAK,CAChB,EAIAA,EAAa,IACZ,GAAK,EAAK,EAAK,GACf,EAAK,GAAK,EAAK,GACf,EAAK,EAAK,GAAK,GACf,EAAK,EAAK,EAAK,CAChB,EAIDA,EAAa,SAAU1kC,EAAkB,CAE1C,CAQA,YAAa2kC,EAAgB,CAE5B,OAAO,KAAK,WAAYA,CAAc,CAEvC,CAOA,iBAAkB,CAEjB,OAAO,KAAK,aAEb,CAMA,SAAU,CAEJ,KAAK,KAET,KAAK,IAAI,QAAQ,EAIb,KAAK,SAET,KAAK,QAAQ,QAAQ,CAIvB,CAQA,KAAMt0B,EAAS,CAEd,YAAK,OAASA,EAAO,OAAO,MAAM,EAElC,KAAK,UAAYA,EAAO,UAExB,KAAK,KAAOA,EAAO,KACnB,KAAK,OAASA,EAAO,OAErB,KAAK,WAAaA,EAAO,WACzB,KAAK,YAAcA,EAAO,YAC1B,KAAK,WAAaA,EAAO,WACzB,KAAK,YAAcA,EAAO,YAE1B,KAAK,QAAQ,KAAMA,EAAO,OAAQ,EAE3B,IAER,CAOA,OAAQ,CAEP,OAAO,IAAI,KAAK,YAAY,EAAE,KAAM,IAAK,CAE1C,CAQA,QAAS,CAER,IAAMhjC,EAAS,CAAC,EAEhB,OAAK,KAAK,YAAc,IAAIA,EAAO,UAAY,KAAK,WAC/C,KAAK,OAAS,IAAIA,EAAO,KAAO,KAAK,MACrC,KAAK,aAAe,IAAIA,EAAO,WAAa,KAAK,YACjD,KAAK,SAAW,IAAIA,EAAO,OAAS,KAAK,SACzC,KAAK,QAAQ,IAAM,KAAO,KAAK,QAAQ,IAAM,OAAMA,EAAO,QAAU,KAAK,QAAQ,QAAQ,GAE9FA,EAAO,OAAS,KAAK,OAAO,OAAQ,EAAM,EAAE,OAC5C,OAAOA,EAAO,OAAO,OAEdA,CAER,CAED,EAOM+yB,GAAN,cAA8BD,EAAY,CAKzC,aAAc,CAEb,MAAO,IAAIzL,GAAmB,GAAI,EAAG,GAAK,GAAI,CAAE,EAShD,KAAK,kBAAoB,GASzB,KAAK,MAAQ,EAQb,KAAK,OAAS,CAEf,CAEA,eAAgB+vC,EAAQ,CAEvB,IAAM1lD,EAAS,KAAK,OAEd4V,EAAMjsB,GAAU,EAAI+7D,EAAM,MAAQ,KAAK,MACvCplD,EAAW,KAAK,QAAQ,MAAQ,KAAK,QAAQ,OAAW,KAAK,OAC7Ds4B,EAAM8sB,EAAM,UAAY1lD,EAAO,KAEhC4V,IAAQ5V,EAAO,KAAOM,IAAWN,EAAO,QAAU44B,IAAQ54B,EAAO,OAErEA,EAAO,IAAM4V,EACb5V,EAAO,OAASM,EAChBN,EAAO,IAAM44B,EACb54B,EAAO,uBAAuB,GAI/B,MAAM,eAAgB0lD,CAAM,CAE7B,CAEA,KAAMp0B,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,MAAQA,EAAO,MAEb,IAER,CAED,EAwBMhQ,GAAN,cAAwBP,EAAM,CAY7B,YAAa31B,EAAOm6D,EAAWr2D,EAAW,EAAGs6B,EAAQ,KAAK,GAAK,EAAGq8B,EAAW,EAAGC,EAAQ,EAAI,CAE3F,MAAO16D,EAAOm6D,CAAU,EASxB,KAAK,YAAc,GAEnB,KAAK,KAAO,YAEZ,KAAK,SAAS,KAAMxzC,GAAS,UAAW,EACxC,KAAK,aAAa,EAclB,KAAK,OAAS,IAAIA,GAQlB,KAAK,SAAW7iB,EAQhB,KAAK,MAAQs6B,EASb,KAAK,SAAWq8B,EAShB,KAAK,MAAQC,EAab,KAAK,IAAM,KAOX,KAAK,OAAS,IAAIzkC,EAEnB,CAQA,IAAI,OAAQ,CAIX,OAAO,KAAK,UAAY,KAAK,EAE9B,CAEA,IAAI,MAAO0kC,EAAQ,CAGlB,KAAK,UAAYA,EAAQ,KAAK,EAE/B,CAEA,SAAU,CAET,MAAM,QAAQ,EAEd,KAAK,OAAO,QAAQ,CAErB,CAEA,KAAMz0B,EAAQ/xB,EAAY,CAEzB,aAAM,KAAM+xB,EAAQ/xB,CAAU,EAE9B,KAAK,SAAW+xB,EAAO,SACvB,KAAK,MAAQA,EAAO,MACpB,KAAK,SAAWA,EAAO,SACvB,KAAK,MAAQA,EAAO,MAEpB,KAAK,OAASA,EAAO,OAAO,MAAM,EAClC,KAAK,IAAMA,EAAO,IAClB,KAAK,OAASA,EAAO,OAAO,MAAM,EAE3B,IAER,CAEA,OAAQZ,EAAO,CAEd,IAAM97B,EAAO,MAAM,OAAQ87B,CAAK,EAEhC,OAAA97B,EAAK,OAAO,SAAW,KAAK,SAC5BA,EAAK,OAAO,MAAQ,KAAK,MACzBA,EAAK,OAAO,MAAQ,KAAK,MACzBA,EAAK,OAAO,SAAW,KAAK,SAE5BA,EAAK,OAAO,OAAS,KAAK,OAAO,KAE5B,KAAK,KAAO,KAAK,IAAI,YAAYA,EAAK,OAAO,IAAM,KAAK,IAAI,OAAQ87B,CAAK,EAAE,MAEhF97B,EAAK,OAAO,OAAS,KAAK,OAAO,OAAO,EAEjCA,CAER,CAED,EAOM2sB,GAAN,cAA+BH,EAAY,CAK1C,aAAc,CAEb,MAAO,IAAIzL,GAAmB,GAAI,EAAG,GAAK,GAAI,CAAE,EAShD,KAAK,mBAAqB,EAE3B,CAED,EAiBM6L,GAAN,cAAyBT,EAAM,CAU9B,YAAa31B,EAAOm6D,EAAWr2D,EAAW,EAAG42D,EAAQ,EAAI,CAExD,MAAO16D,EAAOm6D,CAAU,EASxB,KAAK,aAAe,GAEpB,KAAK,KAAO,aAYZ,KAAK,SAAWr2D,EAShB,KAAK,MAAQ42D,EAOb,KAAK,OAAS,IAAIvkC,EAEnB,CAQA,IAAI,OAAQ,CAIX,OAAO,KAAK,UAAY,EAAI,KAAK,EAElC,CAEA,IAAI,MAAOwkC,EAAQ,CAGlB,KAAK,UAAYA,GAAU,EAAI,KAAK,GAErC,CAEA,SAAU,CAET,MAAM,QAAQ,EAEd,KAAK,OAAO,QAAQ,CAErB,CAEA,KAAMz0B,EAAQ/xB,EAAY,CAEzB,aAAM,KAAM+xB,EAAQ/xB,CAAU,EAE9B,KAAK,SAAW+xB,EAAO,SACvB,KAAK,MAAQA,EAAO,MAEpB,KAAK,OAASA,EAAO,OAAO,MAAM,EAE3B,IAER,CAEA,OAAQZ,EAAO,CAEd,IAAM97B,EAAO,MAAM,OAAQ87B,CAAK,EAEhC,OAAA97B,EAAK,OAAO,SAAW,KAAK,SAC5BA,EAAK,OAAO,MAAQ,KAAK,MAEzBA,EAAK,OAAO,OAAS,KAAK,OAAO,OAAO,EAEjCA,CAER,CAED,EAgBM6sB,GAAN,cAAiClM,EAAO,CAYvC,YAAagjB,EAAO,GAAIC,EAAQ,EAAGC,EAAM,EAAGC,EAAS,GAAIC,EAAO,GAAKC,EAAM,IAAO,CAEjF,MAAM,EASN,KAAK,qBAAuB,GAE5B,KAAK,KAAO,qBAQZ,KAAK,KAAO,EASZ,KAAK,KAAO,KAQZ,KAAK,KAAOL,EAQZ,KAAK,MAAQC,EAQb,KAAK,IAAMC,EAQX,KAAK,OAASC,EAYd,KAAK,KAAOC,EASZ,KAAK,IAAMC,EAEX,KAAK,uBAAuB,CAE7B,CAEA,KAAMtH,EAAQ/xB,EAAY,CAEzB,aAAM,KAAM+xB,EAAQ/xB,CAAU,EAE9B,KAAK,KAAO+xB,EAAO,KACnB,KAAK,MAAQA,EAAO,MACpB,KAAK,IAAMA,EAAO,IAClB,KAAK,OAASA,EAAO,OACrB,KAAK,KAAOA,EAAO,KACnB,KAAK,IAAMA,EAAO,IAElB,KAAK,KAAOA,EAAO,KACnB,KAAK,KAAOA,EAAO,OAAS,KAAO,KAAO,OAAO,OAAQ,CAAC,EAAGA,EAAO,IAAK,EAElE,IAER,CAcA,cAAe+Q,EAAWC,EAAYz6C,EAAGM,EAAGwY,EAAOC,EAAS,CAEtD,KAAK,OAAS,OAElB,KAAK,KAAO,CACX,QAAS,GACT,UAAW,EACX,WAAY,EACZ,QAAS,EACT,QAAS,EACT,MAAO,EACP,OAAQ,CACT,GAID,KAAK,KAAK,QAAU,GACpB,KAAK,KAAK,UAAYyhC,EACtB,KAAK,KAAK,WAAaC,EACvB,KAAK,KAAK,QAAUz6C,EACpB,KAAK,KAAK,QAAUM,EACpB,KAAK,KAAK,MAAQwY,EAClB,KAAK,KAAK,OAASC,EAEnB,KAAK,uBAAuB,CAE7B,CAKA,iBAAkB,CAEZ,KAAK,OAAS,OAElB,KAAK,KAAK,QAAU,IAIrB,KAAK,uBAAuB,CAE7B,CAMA,wBAAyB,CAExB,IAAMuoB,GAAO,KAAK,MAAQ,KAAK,OAAW,EAAI,KAAK,MAC7CC,GAAO,KAAK,IAAM,KAAK,SAAa,EAAI,KAAK,MAC7ClyB,GAAO,KAAK,MAAQ,KAAK,MAAS,EAClCG,GAAO,KAAK,IAAM,KAAK,QAAW,EAEpCkhC,EAAOrhC,EAAKiyB,EACZqP,EAAQthC,EAAKiyB,EACbsP,EAAMphC,EAAK+xB,EACXsP,EAASrhC,EAAK+xB,EAElB,GAAK,KAAK,OAAS,MAAQ,KAAK,KAAK,QAAU,CAE9C,IAAM48B,GAAW,KAAK,MAAQ,KAAK,MAAS,KAAK,KAAK,UAAY,KAAK,KACjEC,GAAW,KAAK,IAAM,KAAK,QAAW,KAAK,KAAK,WAAa,KAAK,KAExE1tB,GAAQytB,EAAS,KAAK,KAAK,QAC3BxtB,EAAQD,EAAOytB,EAAS,KAAK,KAAK,MAClCvtB,GAAOwtB,EAAS,KAAK,KAAK,QAC1BvtB,EAASD,EAAMwtB,EAAS,KAAK,KAAK,MAEnC,CAEA,KAAK,iBAAiB,iBAAkB1tB,EAAMC,EAAOC,EAAKC,EAAQ,KAAK,KAAM,KAAK,IAAK,KAAK,iBAAkB,KAAK,aAAc,EAEjI,KAAK,wBAAwB,KAAM,KAAK,gBAAiB,EAAE,OAAO,CAEnE,CAEA,OAAQhI,EAAO,CAEd,IAAM97B,EAAO,MAAM,OAAQ87B,CAAK,EAEhC,OAAA97B,EAAK,OAAO,KAAO,KAAK,KACxBA,EAAK,OAAO,KAAO,KAAK,KACxBA,EAAK,OAAO,MAAQ,KAAK,MACzBA,EAAK,OAAO,IAAM,KAAK,IACvBA,EAAK,OAAO,OAAS,KAAK,OAC1BA,EAAK,OAAO,KAAO,KAAK,KACxBA,EAAK,OAAO,IAAM,KAAK,IAElB,KAAK,OAAS,OAAOA,EAAK,OAAO,KAAO,OAAO,OAAQ,CAAC,EAAG,KAAK,IAAK,GAEnEA,CAER,CAED,EAOM8sB,GAAN,cAAqCN,EAAY,CAKhD,aAAc,CAEb,MAAO,IAAIK,GAAoB,GAAI,EAAG,EAAG,GAAI,GAAK,GAAI,CAAE,EASxD,KAAK,yBAA2B,EAEjC,CAED,EA6BME,GAAN,cAA+BZ,EAAM,CAQpC,YAAa31B,EAAOm6D,EAAY,CAE/B,MAAOn6D,EAAOm6D,CAAU,EASxB,KAAK,mBAAqB,GAE1B,KAAK,KAAO,mBAEZ,KAAK,SAAS,KAAMxzC,GAAS,UAAW,EACxC,KAAK,aAAa,EAclB,KAAK,OAAS,IAAIA,GAOlB,KAAK,OAAS,IAAI2P,EAEnB,CAEA,SAAU,CAET,MAAM,QAAQ,EAEd,KAAK,OAAO,QAAQ,CAErB,CAEA,KAAM4P,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,OAASA,EAAO,OAAO,MAAM,EAClC,KAAK,OAASA,EAAO,OAAO,MAAM,EAE3B,IAER,CAEA,OAAQZ,EAAO,CAEd,IAAM97B,EAAO,MAAM,OAAQ87B,CAAK,EAEhC,OAAA97B,EAAK,OAAO,OAAS,KAAK,OAAO,OAAO,EACxCA,EAAK,OAAO,OAAS,KAAK,OAAO,KAE1BA,CAER,CAED,EAcMgtB,GAAN,cAA2Bb,EAAM,CAQhC,YAAa31B,EAAOm6D,EAAY,CAE/B,MAAOn6D,EAAOm6D,CAAU,EASxB,KAAK,eAAiB,GAEtB,KAAK,KAAO,cAEb,CAED,EA2BM1jC,GAAN,cAA4Bd,EAAM,CAUjC,YAAa31B,EAAOm6D,EAAW5kD,EAAQ,GAAIC,EAAS,GAAK,CAExD,MAAOxV,EAAOm6D,CAAU,EASxB,KAAK,gBAAkB,GAEvB,KAAK,KAAO,gBAQZ,KAAK,MAAQ5kD,EAQb,KAAK,OAASC,CAEf,CAQA,IAAI,OAAQ,CAGX,OAAO,KAAK,UAAY,KAAK,MAAQ,KAAK,OAAS,KAAK,EAEzD,CAEA,IAAI,MAAOmlD,EAAQ,CAGlB,KAAK,UAAYA,GAAU,KAAK,MAAQ,KAAK,OAAS,KAAK,GAE5D,CAEA,KAAMz0B,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,MAAQA,EAAO,MACpB,KAAK,OAASA,EAAO,OAEd,IAER,CAEA,OAAQZ,EAAO,CAEd,IAAM97B,EAAO,MAAM,OAAQ87B,CAAK,EAEhC,OAAA97B,EAAK,OAAO,MAAQ,KAAK,MACzBA,EAAK,OAAO,OAAS,KAAK,OAEnBA,CAER,CAED,EASMktB,GAAN,KAA0B,CAKzB,aAAc,CASb,KAAK,sBAAwB,GAO7B,KAAK,aAAe,CAAC,EAErB,QAAU38B,EAAI,EAAGA,EAAI,EAAGA,IAEvB,KAAK,aAAa,KAAM,IAAI0K,CAAU,CAIxC,CASA,IAAKq2D,EAAe,CAEnB,QAAU/gE,EAAI,EAAGA,EAAI,EAAGA,IAEvB,KAAK,aAAcA,CAAE,EAAE,KAAM+gE,EAAc/gE,CAAE,CAAE,EAIhD,OAAO,IAER,CAOA,MAAO,CAEN,QAAUA,EAAI,EAAGA,EAAI,EAAGA,IAEvB,KAAK,aAAcA,CAAE,EAAE,IAAK,EAAG,EAAG,CAAE,EAIrC,OAAO,IAER,CASA,MAAOmK,EAAQzD,EAAS,CAIvB,IAAMhE,EAAIyH,EAAO,EAAGnH,EAAImH,EAAO,EAAG2Q,EAAI3Q,EAAO,EAEvC62D,EAAQ,KAAK,aAGnB,OAAAt6D,EAAO,KAAMs6D,EAAO,CAAE,CAAE,EAAE,eAAgB,OAAS,EAGnDt6D,EAAO,gBAAiBs6D,EAAO,CAAE,EAAG,QAAWh+D,CAAE,EACjD0D,EAAO,gBAAiBs6D,EAAO,CAAE,EAAG,QAAWlmD,CAAE,EACjDpU,EAAO,gBAAiBs6D,EAAO,CAAE,EAAG,QAAWt+D,CAAE,EAGjDgE,EAAO,gBAAiBs6D,EAAO,CAAE,EAAG,UAAat+D,EAAIM,EAAI,EACzD0D,EAAO,gBAAiBs6D,EAAO,CAAE,EAAG,UAAah+D,EAAI8X,EAAI,EACzDpU,EAAO,gBAAiBs6D,EAAO,CAAE,EAAG,SAAa,EAAMlmD,EAAIA,EAAI,EAAM,EACrEpU,EAAO,gBAAiBs6D,EAAO,CAAE,EAAG,UAAat+D,EAAIoY,EAAI,EACzDpU,EAAO,gBAAiBs6D,EAAO,CAAE,EAAG,SAAat+D,EAAIA,EAAIM,EAAIA,EAAI,EAE1D0D,CAER,CAUA,gBAAiByD,EAAQzD,EAAS,CAIjC,IAAMhE,EAAIyH,EAAO,EAAGnH,EAAImH,EAAO,EAAG2Q,EAAI3Q,EAAO,EAEvC62D,EAAQ,KAAK,aAGnB,OAAAt6D,EAAO,KAAMs6D,EAAO,CAAE,CAAE,EAAE,eAAgB,OAAS,EAGnDt6D,EAAO,gBAAiBs6D,EAAO,CAAE,EAAG,EAAM,QAAWh+D,CAAE,EACvD0D,EAAO,gBAAiBs6D,EAAO,CAAE,EAAG,EAAM,QAAWlmD,CAAE,EACvDpU,EAAO,gBAAiBs6D,EAAO,CAAE,EAAG,EAAM,QAAWt+D,CAAE,EAGvDgE,EAAO,gBAAiBs6D,EAAO,CAAE,EAAG,EAAM,QAAWt+D,EAAIM,CAAE,EAC3D0D,EAAO,gBAAiBs6D,EAAO,CAAE,EAAG,EAAM,QAAWh+D,EAAI8X,CAAE,EAC3DpU,EAAO,gBAAiBs6D,EAAO,CAAE,EAAG,QAAWlmD,EAAIA,EAAI,OAAS,EAChEpU,EAAO,gBAAiBs6D,EAAO,CAAE,EAAG,EAAM,QAAWt+D,EAAIoY,CAAE,EAC3DpU,EAAO,gBAAiBs6D,EAAO,CAAE,EAAG,SAAat+D,EAAIA,EAAIM,EAAIA,EAAI,EAE1D0D,CAER,CAQA,IAAKu6D,EAAK,CAET,QAAUjhE,EAAI,EAAGA,EAAI,EAAGA,IAEvB,KAAK,aAAcA,CAAE,EAAE,IAAKihE,EAAG,aAAcjhE,CAAE,CAAE,EAIlD,OAAO,IAER,CAUA,YAAaihE,EAAIj9D,EAAI,CAEpB,QAAUhE,EAAI,EAAGA,EAAI,EAAGA,IAEvB,KAAK,aAAcA,CAAE,EAAE,gBAAiBihE,EAAG,aAAcjhE,CAAE,EAAGgE,CAAE,EAIjE,OAAO,IAER,CAQA,MAAOA,EAAI,CAEV,QAAUhE,EAAI,EAAGA,EAAI,EAAGA,IAEvB,KAAK,aAAcA,CAAE,EAAE,eAAgBgE,CAAE,EAI1C,OAAO,IAER,CAUA,KAAMi9D,EAAI/8B,EAAQ,CAEjB,QAAUlkC,EAAI,EAAGA,EAAI,EAAGA,IAEvB,KAAK,aAAcA,CAAE,EAAE,KAAMihE,EAAG,aAAcjhE,CAAE,EAAGkkC,CAAM,EAI1D,OAAO,IAER,CAQA,OAAQ+8B,EAAK,CAEZ,QAAUjhE,EAAI,EAAGA,EAAI,EAAGA,IAEvB,GAAK,CAAE,KAAK,aAAcA,CAAE,EAAE,OAAQihE,EAAG,aAAcjhE,CAAE,CAAE,EAE1D,MAAO,GAMT,MAAO,EAER,CAQA,KAAMihE,EAAK,CAEV,OAAO,KAAK,IAAKA,EAAG,YAAa,CAElC,CAOA,OAAQ,CAEP,OAAO,IAAI,KAAK,YAAY,EAAE,KAAM,IAAK,CAE1C,CASA,UAAWlhE,EAAOokC,EAAS,EAAI,CAE9B,IAAM48B,EAAe,KAAK,aAE1B,QAAU/gE,EAAI,EAAGA,EAAI,EAAGA,IAEvB+gE,EAAc/gE,CAAE,EAAE,UAAWD,EAAOokC,EAAWnkC,EAAI,CAAI,EAIxD,OAAO,IAER,CAUA,QAASD,EAAQ,CAAC,EAAGokC,EAAS,EAAI,CAEjC,IAAM48B,EAAe,KAAK,aAE1B,QAAU/gE,EAAI,EAAGA,EAAI,EAAGA,IAEvB+gE,EAAc/gE,CAAE,EAAE,QAASD,EAAOokC,EAAWnkC,EAAI,CAAI,EAItD,OAAOD,CAER,CAQA,OAAO,WAAYoK,EAAQ+2D,EAAU,CAIpC,IAAMx+D,EAAIyH,EAAO,EAAGnH,EAAImH,EAAO,EAAG2Q,EAAI3Q,EAAO,EAG7C+2D,EAAS,CAAE,EAAI,QAGfA,EAAS,CAAE,EAAI,QAAWl+D,EAC1Bk+D,EAAS,CAAE,EAAI,QAAWpmD,EAC1BomD,EAAS,CAAE,EAAI,QAAWx+D,EAG1Bw+D,EAAS,CAAE,EAAI,SAAWx+D,EAAIM,EAC9Bk+D,EAAS,CAAE,EAAI,SAAWl+D,EAAI8X,EAC9BomD,EAAS,CAAE,EAAI,SAAa,EAAIpmD,EAAIA,EAAI,GACxComD,EAAS,CAAE,EAAI,SAAWx+D,EAAIoY,EAC9BomD,EAAS,CAAE,EAAI,SAAax+D,EAAIA,EAAIM,EAAIA,EAEzC,CAED,EAqBM45B,GAAN,cAAyBhB,EAAM,CAQ9B,YAAaqlC,EAAK,IAAItkC,GAAuByjC,EAAY,EAAI,CAE5D,MAAO,OAAWA,CAAU,EAS5B,KAAK,aAAe,GAOpB,KAAK,GAAKa,CAEX,CAEA,KAAM90B,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,GAAG,KAAMA,EAAO,EAAG,EAEjB,IAER,CAEA,OAAQZ,EAAO,CAEd,IAAM97B,EAAO,MAAM,OAAQ87B,CAAK,EAEhC,OAAA97B,EAAK,OAAO,GAAK,KAAK,GAAG,QAAQ,EAE1BA,CAER,CAED,EAcMotB,GAAN,MAAMskC,UAAuBlmC,EAAO,CAOnC,YAAamjC,EAAU,CAEtB,MAAOA,CAAQ,EAOf,KAAK,SAAW,CAAC,CAElB,CAUA,KAAM1yB,EAAK+xB,EAAQC,EAAYC,EAAU,CAExC,IAAMliB,EAAQ,KAER0iB,EAAS,IAAI/iC,GAAYqgB,EAAM,OAAQ,EAC7C0iB,EAAO,QAAS1iB,EAAM,IAAK,EAC3B0iB,EAAO,iBAAkB1iB,EAAM,aAAc,EAC7C0iB,EAAO,mBAAoB1iB,EAAM,eAAgB,EACjD0iB,EAAO,KAAMzyB,EAAK,SAAW6zB,EAAO,CAEnC,GAAI,CAEH9B,EAAQhiB,EAAM,MAAO,KAAK,MAAO8jB,CAAK,CAAE,CAAE,CAE3C,OAAU92D,EAAI,CAERk1D,EAEJA,EAASl1D,CAAE,EAIXvH,GAAOuH,CAAE,EAIVgzC,EAAM,QAAQ,UAAW/P,CAAI,CAE9B,CAED,EAAGgyB,EAAYC,CAAQ,CAExB,CAQA,MAAO1jD,EAAO,CAEb,IAAMi7B,EAAW,KAAK,SAEtB,SAASksB,EAAY7gE,EAAO,CAE3B,OAAK20C,EAAU30C,CAAK,IAAM,QAEzBU,GAAM,oCAAqCV,CAAK,EAI1C20C,EAAU30C,CAAK,CAEvB,CAEA,IAAM6I,EAAW,KAAK,uBAAwB6Q,EAAK,IAAK,EAuGxD,GArGKA,EAAK,OAAS,SAAY7Q,EAAS,KAAO6Q,EAAK,MAC/CA,EAAK,OAAS,SAAY7Q,EAAS,KAAO6Q,EAAK,MAC/CA,EAAK,QAAU,QAAa7Q,EAAS,QAAU,QAAYA,EAAS,MAAM,OAAQ6Q,EAAK,KAAM,EAC7FA,EAAK,YAAc,SAAY7Q,EAAS,UAAY6Q,EAAK,WACzDA,EAAK,YAAc,SAAY7Q,EAAS,UAAY6Q,EAAK,WACzDA,EAAK,QAAU,SAAY7Q,EAAS,MAAQ6Q,EAAK,OACjDA,EAAK,aAAe,SAAY7Q,EAAS,WAAa,IAAIykB,GAAM,EAAE,OAAQ5T,EAAK,UAAW,GAC1FA,EAAK,iBAAmB,SAAY7Q,EAAS,eAAiB6Q,EAAK,gBACnEA,EAAK,WAAa,QAAa7Q,EAAS,WAAa,QAAYA,EAAS,SAAS,OAAQ6Q,EAAK,QAAS,EACzGA,EAAK,WAAa,QAAa7Q,EAAS,WAAa,QAAYA,EAAS,SAAS,OAAQ6Q,EAAK,QAAS,EACzGA,EAAK,oBAAsB,SAAY7Q,EAAS,kBAAoB6Q,EAAK,mBACzEA,EAAK,gBAAkB,QAAa7Q,EAAS,gBAAkB,QAAYA,EAAS,cAAc,OAAQ6Q,EAAK,aAAc,EAC7HA,EAAK,YAAc,SAAY7Q,EAAS,UAAY6Q,EAAK,WACzDA,EAAK,YAAc,SAAY7Q,EAAS,UAAY6Q,EAAK,WACzDA,EAAK,qBAAuB,SAAY7Q,EAAS,mBAAqB6Q,EAAK,oBAC3EA,EAAK,aAAe,SAAY7Q,EAAS,WAAa6Q,EAAK,YAC3DA,EAAK,cAAgB,SAAY7Q,EAAS,YAAc6Q,EAAK,aAC7DA,EAAK,iBAAmB,SAAY7Q,EAAS,eAAiB6Q,EAAK,gBACnEA,EAAK,4BAA8B,SAAY7Q,EAAS,0BAA4B6Q,EAAK,2BACzFA,EAAK,eAAiB,SAAY7Q,EAAS,aAAe6Q,EAAK,cAC/DA,EAAK,YAAc,SAAY7Q,EAAS,UAAY6Q,EAAK,WACzDA,EAAK,sBAAwB,SAAY7Q,EAAS,oBAAsB6Q,EAAK,qBAC7EA,EAAK,mBAAqB,QAAa7Q,EAAS,mBAAqB,QAAYA,EAAS,iBAAiB,OAAQ6Q,EAAK,gBAAiB,EACzIA,EAAK,aAAe,SAAY7Q,EAAS,WAAa6Q,EAAK,YAC3DA,EAAK,qBAAuB,SAAY7Q,EAAS,mBAAqB6Q,EAAK,oBAC3EA,EAAK,MAAQ,SAAY7Q,EAAS,IAAM6Q,EAAK,KAC7CA,EAAK,cAAgB,SAAY7Q,EAAS,YAAc6Q,EAAK,aAC7DA,EAAK,WAAa,SAAY7Q,EAAS,SAAW6Q,EAAK,UACvDA,EAAK,UAAY,SAAY7Q,EAAS,QAAU6Q,EAAK,SACrDA,EAAK,OAAS,SAAY7Q,EAAS,KAAO6Q,EAAK,MAC/CA,EAAK,aAAe,SAAY7Q,EAAS,WAAa6Q,EAAK,YAC3DA,EAAK,UAAY,SAAY7Q,EAAS,QAAU6Q,EAAK,SACrDA,EAAK,cAAgB,SAAY7Q,EAAS,YAAc6Q,EAAK,aAC7DA,EAAK,YAAc,SAAY7Q,EAAS,UAAY6Q,EAAK,WACzDA,EAAK,YAAc,SAAY7Q,EAAS,UAAY6Q,EAAK,WACzDA,EAAK,YAAc,SAAY7Q,EAAS,UAAY6Q,EAAK,WACzDA,EAAK,YAAc,SAAY7Q,EAAS,UAAY6Q,EAAK,WACzDA,EAAK,aAAe,SAAY7Q,EAAS,WAAa6Q,EAAK,YAC3DA,EAAK,aAAe,SAAY7Q,EAAS,WAAa6Q,EAAK,YAC3DA,EAAK,WAAa,SAAY7Q,EAAS,SAAW6Q,EAAK,UACvDA,EAAK,WAAa,SAAY7Q,EAAS,SAAW6Q,EAAK,UACvDA,EAAK,gBAAkB,SAAY7Q,EAAS,cAAgB6Q,EAAK,eACjEA,EAAK,gBAAkB,SAAY7Q,EAAS,cAAgB6Q,EAAK,eACjEA,EAAK,gBAAkB,SAAY7Q,EAAS,cAAgB6Q,EAAK,eACjEA,EAAK,qBAAuB,SAAY7Q,EAAS,mBAAqB6Q,EAAK,oBAC3EA,EAAK,aAAe,QAAa7Q,EAAS,aAAe,QAAYA,EAAS,WAAW,OAAQ6Q,EAAK,UAAW,EACjHA,EAAK,aAAe,SAAY7Q,EAAS,WAAa6Q,EAAK,YAC3DA,EAAK,mBAAqB,SAAY7Q,EAAS,iBAAmB6Q,EAAK,kBACvEA,EAAK,cAAgB,SAAY7Q,EAAS,YAAc6Q,EAAK,aAC7DA,EAAK,aAAe,SAAY7Q,EAAS,WAAa6Q,EAAK,YAC3DA,EAAK,kBAAoB,SAAY7Q,EAAS,gBAAkB6Q,EAAK,iBACrEA,EAAK,cAAgB,SAAY7Q,EAAS,YAAc6Q,EAAK,aAC7DA,EAAK,eAAiB,SAAY7Q,EAAS,aAAe6Q,EAAK,cAC/DA,EAAK,eAAiB,SAAY7Q,EAAS,aAAe6Q,EAAK,cAC/DA,EAAK,eAAiB,SAAY7Q,EAAS,aAAe6Q,EAAK,cAE/DA,EAAK,YAAc,SAAY7Q,EAAS,UAAY6Q,EAAK,WACzDA,EAAK,qBAAuB,SAAY7Q,EAAS,mBAAqB6Q,EAAK,oBAC3EA,EAAK,mBAAqB,SAAY7Q,EAAS,iBAAmB6Q,EAAK,kBACvEA,EAAK,oBAAsB,SAAY7Q,EAAS,kBAAoB6Q,EAAK,mBAEzEA,EAAK,WAAa,SAAY7Q,EAAS,SAAW6Q,EAAK,UAEvDA,EAAK,YAAc,SAAY7Q,EAAS,UAAY6Q,EAAK,WACzDA,EAAK,WAAa,SAAY7Q,EAAS,SAAW6Q,EAAK,UACvDA,EAAK,UAAY,SAAY7Q,EAAS,QAAU6Q,EAAK,SACrDA,EAAK,QAAU,SAAY7Q,EAAS,MAAQ6Q,EAAK,OAEjDA,EAAK,gBAAkB,SAAY7Q,EAAS,cAAgB6Q,EAAK,eACjEA,EAAK,sBAAwB,SAAY7Q,EAAS,oBAAsB6Q,EAAK,qBAC7EA,EAAK,qBAAuB,SAAY7Q,EAAS,mBAAqB6Q,EAAK,oBAE3EA,EAAK,YAAc,SAAY7Q,EAAS,UAAY6Q,EAAK,WAEzDA,EAAK,kBAAoB,SAAY7Q,EAAS,gBAAkB6Q,EAAK,iBACrEA,EAAK,qBAAuB,SAAY7Q,EAAS,mBAAqB6Q,EAAK,oBAC3EA,EAAK,kBAAoB,SAAY7Q,EAAS,gBAAkB6Q,EAAK,iBACrEA,EAAK,gBAAkB,SAAY7Q,EAAS,cAAgB6Q,EAAK,eAEjEA,EAAK,UAAY,SAAY7Q,EAAS,QAAU6Q,EAAK,SAErDA,EAAK,aAAe,SAAY7Q,EAAS,WAAa6Q,EAAK,YAE3DA,EAAK,WAAa,SAAY7Q,EAAS,SAAW6Q,EAAK,UAEvDA,EAAK,eAAiB,SAErB,OAAOA,EAAK,cAAiB,SAEjC7Q,EAAS,aAAiB6Q,EAAK,aAAe,EAI9C7Q,EAAS,aAAe6Q,EAAK,cAQ1BA,EAAK,WAAa,OAEtB,QAAY1Z,KAAQ0Z,EAAK,SAAW,CAEnC,IAAMonD,EAAUpnD,EAAK,SAAU1Z,CAAK,EAIpC,OAFA6I,EAAS,SAAU7I,CAAK,EAAI,CAAC,EAEpB8gE,EAAQ,KAAO,CAEvB,IAAK,IACJj4D,EAAS,SAAU7I,CAAK,EAAE,MAAQ6gE,EAAYC,EAAQ,KAAM,EAC5D,MAED,IAAK,IACJj4D,EAAS,SAAU7I,CAAK,EAAE,MAAQ,IAAIstB,GAAM,EAAE,OAAQwzC,EAAQ,KAAM,EACpE,MAED,IAAK,KACJj4D,EAAS,SAAU7I,CAAK,EAAE,MAAQ,IAAIqK,GAAQ,EAAE,UAAWy2D,EAAQ,KAAM,EACzE,MAED,IAAK,KACJj4D,EAAS,SAAU7I,CAAK,EAAE,MAAQ,IAAImK,EAAQ,EAAE,UAAW22D,EAAQ,KAAM,EACzE,MAED,IAAK,KACJj4D,EAAS,SAAU7I,CAAK,EAAE,MAAQ,IAAI0oB,GAAQ,EAAE,UAAWo4C,EAAQ,KAAM,EACzE,MAED,IAAK,KACJj4D,EAAS,SAAU7I,CAAK,EAAE,MAAQ,IAAIkoB,GAAQ,EAAE,UAAW44C,EAAQ,KAAM,EACzE,MAED,IAAK,KACJj4D,EAAS,SAAU7I,CAAK,EAAE,MAAQ,IAAI0qB,GAAQ,EAAE,UAAWo2C,EAAQ,KAAM,EACzE,MAED,QACCj4D,EAAS,SAAU7I,CAAK,EAAE,MAAQ8gE,EAAQ,KAE5C,CAED,CASD,GALKpnD,EAAK,UAAY,SAAY7Q,EAAS,QAAU6Q,EAAK,SACrDA,EAAK,eAAiB,SAAY7Q,EAAS,aAAe6Q,EAAK,cAC/DA,EAAK,iBAAmB,SAAY7Q,EAAS,eAAiB6Q,EAAK,gBACnEA,EAAK,cAAgB,SAAY7Q,EAAS,YAAc6Q,EAAK,aAE7DA,EAAK,aAAe,OAExB,QAAY3C,KAAO2C,EAAK,WAEvB7Q,EAAS,WAAYkO,CAAI,EAAI2C,EAAK,WAAY3C,CAAI,EA0BpD,GApBK2C,EAAK,SAAW,SAAY7Q,EAAS,OAAS6Q,EAAK,QACnDA,EAAK,WAAa,SAAY7Q,EAAS,SAAW6Q,EAAK,UAIvDA,EAAK,OAAS,SAAY7Q,EAAS,KAAO6Q,EAAK,MAC/CA,EAAK,kBAAoB,SAAY7Q,EAAS,gBAAkB6Q,EAAK,iBAIrEA,EAAK,MAAQ,SAAY7Q,EAAS,IAAMg4D,EAAYnnD,EAAK,GAAI,GAC7DA,EAAK,SAAW,SAAY7Q,EAAS,OAASg4D,EAAYnnD,EAAK,MAAO,GAEtEA,EAAK,WAAa,SAAY7Q,EAAS,SAAWg4D,EAAYnnD,EAAK,QAAS,GAE5EA,EAAK,UAAY,SAAY7Q,EAAS,QAAUg4D,EAAYnnD,EAAK,OAAQ,GACzEA,EAAK,YAAc,SAAY7Q,EAAS,UAAY6Q,EAAK,WAEzDA,EAAK,YAAc,SAAY7Q,EAAS,UAAYg4D,EAAYnnD,EAAK,SAAU,GAC/EA,EAAK,gBAAkB,SAAY7Q,EAAS,cAAgB6Q,EAAK,eACjEA,EAAK,cAAgB,OAAY,CAErC,IAAIqnD,EAAcrnD,EAAK,YAElB,MAAM,QAASqnD,CAAY,IAAM,KAIrCA,EAAc,CAAEA,EAAaA,CAAY,GAI1Cl4D,EAAS,YAAc,IAAIwB,GAAQ,EAAE,UAAW02D,CAAY,CAE7D,CAEA,OAAKrnD,EAAK,kBAAoB,SAAY7Q,EAAS,gBAAkBg4D,EAAYnnD,EAAK,eAAgB,GACjGA,EAAK,oBAAsB,SAAY7Q,EAAS,kBAAoB6Q,EAAK,mBACzEA,EAAK,mBAAqB,SAAY7Q,EAAS,iBAAmB6Q,EAAK,kBAEvEA,EAAK,eAAiB,SAAY7Q,EAAS,aAAeg4D,EAAYnnD,EAAK,YAAa,GACxFA,EAAK,eAAiB,SAAY7Q,EAAS,aAAeg4D,EAAYnnD,EAAK,YAAa,GAExFA,EAAK,cAAgB,SAAY7Q,EAAS,YAAcg4D,EAAYnnD,EAAK,WAAY,GACrFA,EAAK,oBAAsB,SAAY7Q,EAAS,kBAAoB6Q,EAAK,mBAEzEA,EAAK,cAAgB,SAAY7Q,EAAS,YAAcg4D,EAAYnnD,EAAK,WAAY,GACrFA,EAAK,uBAAyB,SAAY7Q,EAAS,qBAAuBg4D,EAAYnnD,EAAK,oBAAqB,GAChHA,EAAK,mBAAqB,SAAY7Q,EAAS,iBAAmBg4D,EAAYnnD,EAAK,gBAAiB,GAEpGA,EAAK,SAAW,SAAY7Q,EAAS,OAASg4D,EAAYnnD,EAAK,MAAO,GACtEA,EAAK,iBAAmB,QAAY7Q,EAAS,eAAe,UAAW6Q,EAAK,cAAe,EAC3FA,EAAK,kBAAoB,SAAY7Q,EAAS,gBAAkB6Q,EAAK,iBAErEA,EAAK,eAAiB,SAAY7Q,EAAS,aAAe6Q,EAAK,cAC/DA,EAAK,kBAAoB,SAAY7Q,EAAS,gBAAkB6Q,EAAK,iBAErEA,EAAK,WAAa,SAAY7Q,EAAS,SAAWg4D,EAAYnnD,EAAK,QAAS,GAC5EA,EAAK,oBAAsB,SAAY7Q,EAAS,kBAAoB6Q,EAAK,mBAEzEA,EAAK,QAAU,SAAY7Q,EAAS,MAAQg4D,EAAYnnD,EAAK,KAAM,GACnEA,EAAK,iBAAmB,SAAY7Q,EAAS,eAAiB6Q,EAAK,gBAEnEA,EAAK,cAAgB,SAAY7Q,EAAS,YAAcg4D,EAAYnnD,EAAK,WAAY,GAErFA,EAAK,eAAiB,SAAY7Q,EAAS,aAAeg4D,EAAYnnD,EAAK,YAAa,GACxFA,EAAK,wBAA0B,SAAY7Q,EAAS,sBAAwBg4D,EAAYnnD,EAAK,qBAAsB,GACnHA,EAAK,qBAAuB,SAAY7Q,EAAS,mBAAqBg4D,EAAYnnD,EAAK,kBAAmB,GAC1GA,EAAK,uBAAyB,SAAY7Q,EAAS,qBAAuB,IAAIwB,GAAQ,EAAE,UAAWqP,EAAK,oBAAqB,GAE7HA,EAAK,iBAAmB,SAAY7Q,EAAS,eAAiBg4D,EAAYnnD,EAAK,cAAe,GAC9FA,EAAK,0BAA4B,SAAY7Q,EAAS,wBAA0Bg4D,EAAYnnD,EAAK,uBAAwB,GAEzHA,EAAK,kBAAoB,SAAY7Q,EAAS,gBAAkBg4D,EAAYnnD,EAAK,eAAgB,GACjGA,EAAK,eAAiB,SAAY7Q,EAAS,aAAeg4D,EAAYnnD,EAAK,YAAa,GAExFA,EAAK,gBAAkB,SAAY7Q,EAAS,cAAgBg4D,EAAYnnD,EAAK,aAAc,GAE3FA,EAAK,gBAAkB,SAAY7Q,EAAS,cAAgBg4D,EAAYnnD,EAAK,aAAc,GAC3FA,EAAK,oBAAsB,SAAY7Q,EAAS,kBAAoBg4D,EAAYnnD,EAAK,iBAAkB,GAErG7Q,CAER,CASA,YAAajH,EAAQ,CAEpB,YAAK,SAAWA,EACT,IAER,CAQA,uBAAwBjC,EAAO,CAE9B,OAAOihE,EAAe,uBAAwBjhE,CAAK,CAEpD,CASA,OAAO,uBAAwBA,EAAO,CAErC,IAAMqhE,EAAc,CACnB,eAAA7nC,GACA,eAAApI,GACA,kBAAAqI,GACA,eAAAxJ,GACA,eAAA4F,GACA,qBAAA8D,GACA,qBAAAD,GACA,kBAAAE,GACA,iBAAAC,GACA,mBAAAC,GACA,oBAAAC,GACA,kBAAAC,GACA,qBAAAC,GACA,kBAAAlM,GACA,mBAAAmM,GACA,mBAAAC,GACA,kBAAA/E,GACA,SAAAtH,EACD,EAEA,OAAO,IAAIuzC,EAAarhE,CAAK,CAE9B,CAED,EAKM48B,GAAN,KAAkB,CAQjB,OAAO,eAAgB4O,EAAM,CAE5B,IAAMt+B,EAAQs+B,EAAI,YAAa,GAAI,EAEnC,OAAKt+B,IAAU,GAAY,KAEpBs+B,EAAI,MAAO,EAAGt+B,EAAQ,CAAE,CAEhC,CAWA,OAAO,WAAYs+B,EAAKssB,EAAO,CAG9B,OAAK,OAAOtsB,GAAQ,UAAYA,IAAQ,GAAY,IAG/C,gBAAgB,KAAMssB,CAAK,GAAK,MAAM,KAAMtsB,CAAI,IAEpDssB,EAAOA,EAAK,QAAS,0BAA2B,IAAK,GAKjD,mBAAmB,KAAMtsB,CAAI,GAG7B,gBAAgB,KAAMA,CAAI,GAG1B,aAAa,KAAMA,CAAI,EAAWA,EAGhCssB,EAAOtsB,EAEf,CAED,EAKM3O,GAAN,cAAsCxN,EAAe,CAKpD,aAAc,CAEb,MAAM,EASN,KAAK,0BAA4B,GAEjC,KAAK,KAAO,0BAQZ,KAAK,cAAgB,GAEtB,CAEA,KAAM4c,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,cAAgBA,EAAO,cAErB,IAER,CAEA,QAAS,CAER,IAAM18B,EAAO,MAAM,OAAO,EAE1B,OAAAA,EAAK,cAAgB,KAAK,cAE1BA,EAAK,0BAA4B,GAE1BA,CAER,CAED,EAiBMutB,GAAN,cAAmC/B,EAAO,CAOzC,YAAamjC,EAAU,CAEtB,MAAOA,CAAQ,CAEhB,CAUA,KAAM1yB,EAAK+xB,EAAQC,EAAYC,EAAU,CAExC,IAAMliB,EAAQ,KAER0iB,EAAS,IAAI/iC,GAAYqgB,EAAM,OAAQ,EAC7C0iB,EAAO,QAAS1iB,EAAM,IAAK,EAC3B0iB,EAAO,iBAAkB1iB,EAAM,aAAc,EAC7C0iB,EAAO,mBAAoB1iB,EAAM,eAAgB,EACjD0iB,EAAO,KAAMzyB,EAAK,SAAW6zB,EAAO,CAEnC,GAAI,CAEH9B,EAAQhiB,EAAM,MAAO,KAAK,MAAO8jB,CAAK,CAAE,CAAE,CAE3C,OAAU92D,EAAI,CAERk1D,EAEJA,EAASl1D,CAAE,EAIXvH,GAAOuH,CAAE,EAIVgzC,EAAM,QAAQ,UAAW/P,CAAI,CAE9B,CAED,EAAGgyB,EAAYC,CAAQ,CAExB,CAQA,MAAO1jD,EAAO,CAEb,IAAMunD,EAAuB,CAAC,EACxBC,EAAiB,CAAC,EAExB,SAASC,EAAsBznD,EAAM8mC,EAAO,CAE3C,GAAKygB,EAAsBzgB,CAAK,IAAM,OAAY,OAAOygB,EAAsBzgB,CAAK,EAGpF,IAAMrB,EADqBzlC,EAAK,mBACc8mC,CAAK,EAE7C5gD,EAASwhE,EAAgB1nD,EAAMylC,EAAkB,MAAO,EAExD3/C,EAAQE,GAAey/C,EAAkB,KAAMv/C,CAAO,EACtDw/C,EAAK,IAAIxuB,GAAmBpxB,EAAO2/C,EAAkB,MAAO,EAClE,OAAAC,EAAG,KAAOD,EAAkB,KAE5B8hB,EAAsBzgB,CAAK,EAAIpB,EAExBA,CAER,CAEA,SAASgiB,EAAgB1nD,EAAM8mC,EAAO,CAErC,GAAK0gB,EAAgB1gB,CAAK,IAAM,OAAY,OAAO0gB,EAAgB1gB,CAAK,EAGxE,IAAM6gB,EADe3nD,EAAK,aACQ8mC,CAAK,EAEjC/G,EAAK,IAAI,YAAa4nB,CAAY,EAAE,OAE1C,OAAAH,EAAgB1gB,CAAK,EAAI/G,EAElBA,CAER,CAEA,IAAMp/B,EAAWX,EAAK,0BAA4B,IAAI8iB,GAA4B,IAAIxN,GAEhFniB,EAAQ6M,EAAK,KAAK,MAExB,GAAK7M,IAAU,OAAY,CAE1B,IAAMy0D,EAAa5hE,GAAemN,EAAM,KAAMA,EAAM,KAAM,EAC1DwN,EAAS,SAAU,IAAI0T,GAAiBuzC,EAAY,CAAE,CAAE,CAEzD,CAEA,IAAMrpB,EAAav+B,EAAK,KAAK,WAE7B,QAAY3C,KAAOkhC,EAAa,CAE/B,IAAMpU,EAAYoU,EAAYlhC,CAAI,EAC9BwqD,EAEJ,GAAK19B,EAAU,6BAA+B,CAE7C,IAAMsb,EAAoBgiB,EAAsBznD,EAAK,KAAMmqB,EAAU,IAAK,EAC1E09B,EAAkB,IAAIzwC,GAA4BquB,EAAmBtb,EAAU,SAAUA,EAAU,OAAQA,EAAU,UAAW,CAEjI,KAAO,CAEN,IAAMy9B,EAAa5hE,GAAemkC,EAAU,KAAMA,EAAU,KAAM,EAC5D29B,EAAwB39B,EAAU,2BAA6BhR,GAA2B9E,GAChGwzC,EAAkB,IAAIC,EAAuBF,EAAYz9B,EAAU,SAAUA,EAAU,UAAW,CAEnG,CAEKA,EAAU,OAAS,SAAY09B,EAAgB,KAAO19B,EAAU,MAChEA,EAAU,QAAU,QAAY09B,EAAgB,SAAU19B,EAAU,KAAM,EAE/ExpB,EAAS,aAActD,EAAKwqD,CAAgB,CAE7C,CAEA,IAAMvnB,EAAkBtgC,EAAK,KAAK,gBAElC,GAAKsgC,EAEJ,QAAYjjC,KAAOijC,EAAkB,CAEpC,IAAMG,EAAiBH,EAAiBjjC,CAAI,EAEtCvX,EAAQ,CAAC,EAEf,QAAUC,EAAI,EAAG+sC,EAAK2N,EAAe,OAAQ16C,EAAI+sC,EAAI/sC,IAAO,CAE3D,IAAMokC,EAAYsW,EAAgB16C,CAAE,EAChC8hE,EAEJ,GAAK19B,EAAU,6BAA+B,CAE7C,IAAMsb,EAAoBgiB,EAAsBznD,EAAK,KAAMmqB,EAAU,IAAK,EAC1E09B,EAAkB,IAAIzwC,GAA4BquB,EAAmBtb,EAAU,SAAUA,EAAU,OAAQA,EAAU,UAAW,CAEjI,KAAO,CAEN,IAAMy9B,EAAa5hE,GAAemkC,EAAU,KAAMA,EAAU,KAAM,EAClE09B,EAAkB,IAAIxzC,GAAiBuzC,EAAYz9B,EAAU,SAAUA,EAAU,UAAW,CAE7F,CAEKA,EAAU,OAAS,SAAY09B,EAAgB,KAAO19B,EAAU,MACrErkC,EAAM,KAAM+hE,CAAgB,CAE7B,CAEAlnD,EAAS,gBAAiBtD,CAAI,EAAIvX,CAEnC,CAI4Bka,EAAK,KAAK,uBAItCW,EAAS,qBAAuB,IAIjC,IAAM2+B,EAASt/B,EAAK,KAAK,QAAUA,EAAK,KAAK,WAAaA,EAAK,KAAK,QAEpE,GAAKs/B,IAAW,OAEf,QAAUv5C,EAAI,EAAGuC,EAAIg3C,EAAO,OAAQv5C,IAAMuC,EAAG,EAAGvC,EAAI,CAEnD,IAAMw5C,EAAQD,EAAQv5C,CAAE,EAExB4a,EAAS,SAAU4+B,EAAM,MAAOA,EAAM,MAAOA,EAAM,aAAc,CAElE,CAID,IAAMmB,EAAiB1gC,EAAK,KAAK,eAEjC,OAAK0gC,IAAmB,SAEvB//B,EAAS,eAAiB,IAAI4P,GAAO,EAAE,SAAUmwB,CAAe,GAI5D1gC,EAAK,OAAOW,EAAS,KAAOX,EAAK,MACjCA,EAAK,WAAWW,EAAS,SAAWX,EAAK,UAEvCW,CAER,CAED,EAkBMqiB,GAAN,cAA2BhC,EAAO,CAOjC,YAAamjC,EAAU,CAEtB,MAAOA,CAAQ,CAEhB,CAUA,KAAM1yB,EAAK+xB,EAAQC,EAAYC,EAAU,CAExC,IAAMliB,EAAQ,KAERuc,EAAS,KAAK,OAAS,GAAOl7B,GAAY,eAAgB4O,CAAI,EAAI,KAAK,KAC7E,KAAK,aAAe,KAAK,cAAgBssB,EAEzC,IAAMmG,EAAS,IAAI/iC,GAAY,KAAK,OAAQ,EAC5C+iC,EAAO,QAAS,KAAK,IAAK,EAC1BA,EAAO,iBAAkB,KAAK,aAAc,EAC5CA,EAAO,mBAAoB,KAAK,eAAgB,EAChDA,EAAO,KAAMzyB,EAAK,SAAW6zB,EAAO,CAEnC,IAAItlD,EAAO,KAEX,GAAI,CAEHA,EAAO,KAAK,MAAOslD,CAAK,CAEzB,OAAUr+D,EAAQ,CAEZy8D,IAAY,QAAYA,EAASz8D,CAAM,EAE5CA,EAAO,6BAAgCwqC,EAAM,IAAKxqC,EAAM,OAAQ,EAEhE,MAED,CAEA,IAAM8gE,EAAW/nD,EAAK,SAEtB,GAAK+nD,IAAa,QAAaA,EAAS,OAAS,QAAaA,EAAS,KAAK,YAAY,IAAM,WAAa,CAErGrE,IAAY,QAAYA,EAAS,IAAI,MAAO,kCAAqCjyB,CAAI,CAAE,EAE5FxqC,GAAO,4BAA+BwqC,CAAI,EAC1C,MAED,CAEA+P,EAAM,MAAOxhC,EAAMwjD,CAAO,CAE3B,EAAGC,EAAYC,CAAQ,CAExB,CAUA,MAAM,UAAWjyB,EAAKgyB,EAAa,CAElC,IAAMjiB,EAAQ,KAERuc,EAAS,KAAK,OAAS,GAAOl7B,GAAY,eAAgB4O,CAAI,EAAI,KAAK,KAC7E,KAAK,aAAe,KAAK,cAAgBssB,EAEzC,IAAMmG,EAAS,IAAI/iC,GAAY,KAAK,OAAQ,EAC5C+iC,EAAO,QAAS,KAAK,IAAK,EAC1BA,EAAO,iBAAkB,KAAK,aAAc,EAC5CA,EAAO,mBAAoB,KAAK,eAAgB,EAEhD,IAAMoB,EAAO,MAAMpB,EAAO,UAAWzyB,EAAKgyB,CAAW,EAE/CzjD,EAAO,KAAK,MAAOslD,CAAK,EAExByC,EAAW/nD,EAAK,SAEtB,GAAK+nD,IAAa,QAAaA,EAAS,OAAS,QAAaA,EAAS,KAAK,YAAY,IAAM,WAE7F,MAAM,IAAI,MAAO,kCAAqCt2B,CAAI,EAI3D,OAAO,MAAM+P,EAAM,WAAYxhC,CAAK,CAErC,CAUA,MAAOA,EAAMwjD,EAAS,CAErB,IAAMpoB,EAAa,KAAK,gBAAiBp7B,EAAK,UAAW,EACnDhE,EAAS,KAAK,YAAagE,EAAK,MAAO,EACvC86B,EAAa,KAAK,gBAAiB96B,EAAK,WAAYhE,CAAO,EAE3Dk/B,EAAS,KAAK,YAAal7B,EAAK,OAAQ,UAAY,CAEpDwjD,IAAW,QAAYA,EAAQt0D,CAAO,CAE5C,CAAE,EAEI+rC,EAAW,KAAK,cAAej7B,EAAK,SAAUk7B,CAAO,EACrDF,EAAY,KAAK,eAAgBh7B,EAAK,UAAWi7B,CAAS,EAE1D/rC,EAAS,KAAK,YAAa8Q,EAAK,OAAQ86B,EAAYE,EAAWC,EAAUG,CAAW,EACpFD,EAAY,KAAK,eAAgBn7B,EAAK,UAAW9Q,CAAO,EAO9D,GALA,KAAK,cAAeA,EAAQisC,CAAU,EACtC,KAAK,iBAAkBjsC,CAAO,EAIzBs0D,IAAW,OAAY,CAE3B,IAAIwE,EAAY,GAEhB,QAAYlhB,KAAQ5L,EAEnB,GAAKA,EAAQ4L,CAAK,EAAE,gBAAgB,iBAAmB,CAEtDkhB,EAAY,GACZ,KAED,CAIIA,IAAc,IAAQxE,EAAQt0D,CAAO,CAE3C,CAEA,OAAOA,CAER,CAQA,MAAM,WAAY8Q,EAAO,CAExB,IAAMo7B,EAAa,KAAK,gBAAiBp7B,EAAK,UAAW,EACnDhE,EAAS,KAAK,YAAagE,EAAK,MAAO,EACvC86B,EAAa,KAAK,gBAAiB96B,EAAK,WAAYhE,CAAO,EAE3Dk/B,EAAS,MAAM,KAAK,iBAAkBl7B,EAAK,MAAO,EAElDi7B,EAAW,KAAK,cAAej7B,EAAK,SAAUk7B,CAAO,EACrDF,EAAY,KAAK,eAAgBh7B,EAAK,UAAWi7B,CAAS,EAE1D/rC,EAAS,KAAK,YAAa8Q,EAAK,OAAQ86B,EAAYE,EAAWC,EAAUG,CAAW,EACpFD,EAAY,KAAK,eAAgBn7B,EAAK,UAAW9Q,CAAO,EAE9D,YAAK,cAAeA,EAAQisC,CAAU,EACtC,KAAK,iBAAkBjsC,CAAO,EAEvBA,CAER,CAIA,YAAa8Q,EAAO,CAEnB,IAAMhE,EAAS,CAAC,EAEhB,GAAKgE,IAAS,OAEb,QAAUja,EAAI,EAAG4V,EAAIqE,EAAK,OAAQja,EAAI4V,EAAG5V,IAAO,CAE/C,IAAMmW,EAAQ,IAAIqiB,GAAM,EAAE,SAAUve,EAAMja,CAAE,CAAE,EAE9CiW,EAAQE,EAAM,IAAK,EAAIA,CAExB,CAID,OAAOF,CAER,CAEA,eAAgBgE,EAAM9Q,EAAS,CAE9B,IAAMisC,EAAY,CAAC,EACbqL,EAAQ,CAAC,EAYf,GARAt3C,EAAO,SAAU,SAAWqsC,EAAQ,CAE9BA,EAAM,SAASiL,EAAOjL,EAAM,IAAK,EAAIA,EAE3C,CAAE,EAIGv7B,IAAS,OAEb,QAAUja,EAAI,EAAG4V,EAAIqE,EAAK,OAAQja,EAAI4V,EAAG5V,IAAO,CAE/C,IAAMmgD,EAAW,IAAIhtB,GAAS,EAAE,SAAUlZ,EAAMja,CAAE,EAAGygD,CAAM,EAE3DrL,EAAW+K,EAAS,IAAK,EAAIA,CAE9B,CAID,OAAO/K,CAER,CAEA,gBAAiBn7B,EAAMhE,EAAS,CAE/B,IAAM8+B,EAAa,CAAC,EAEpB,GAAK96B,IAAS,OAAY,CAEzB,IAAMioD,EAAuB,IAAIllC,GAEjC,QAAUh9B,EAAI,EAAG4V,EAAIqE,EAAK,OAAQja,EAAI4V,EAAG5V,IAAO,CAE/C,IAAI4a,EACEnL,EAAOwK,EAAMja,CAAE,EAErB,OAASyP,EAAK,KAAO,CAEpB,IAAK,iBACL,IAAK,0BAEJmL,EAAWsnD,EAAqB,MAAOzyD,CAAK,EAC5C,MAED,QAEMA,EAAK,QAAQgqB,GAEjB7e,EAAW6e,GAAYhqB,EAAK,IAAK,EAAE,SAAUA,EAAMwG,CAAO,EAI1DhV,GAAM,4CAA6CwO,EAAK,IAAK,GAAI,CAIpE,CAEAmL,EAAS,KAAOnL,EAAK,KAEhBA,EAAK,OAAS,SAAYmL,EAAS,KAAOnL,EAAK,MAC/CA,EAAK,WAAa,SAAYmL,EAAS,SAAWnL,EAAK,UAE5DslC,EAAYtlC,EAAK,IAAK,EAAImL,CAE3B,CAED,CAEA,OAAOm6B,CAER,CAEA,eAAgB96B,EAAMi7B,EAAW,CAEhC,IAAMK,EAAQ,CAAC,EACTN,EAAY,CAAC,EAEnB,GAAKh7B,IAAS,OAAY,CAEzB,IAAMkkD,EAAS,IAAIthC,GACnBshC,EAAO,YAAajpB,CAAS,EAE7B,QAAUl1C,EAAI,EAAG4V,EAAIqE,EAAK,OAAQja,EAAI4V,EAAG5V,IAAO,CAE/C,IAAMyP,EAAOwK,EAAMja,CAAE,EAEhBu1C,EAAO9lC,EAAK,IAAK,IAAM,SAE3B8lC,EAAO9lC,EAAK,IAAK,EAAI0uD,EAAO,MAAO1uD,CAAK,GAIzCwlC,EAAWxlC,EAAK,IAAK,EAAI8lC,EAAO9lC,EAAK,IAAK,CAE3C,CAED,CAEA,OAAOwlC,CAER,CAEA,gBAAiBh7B,EAAO,CAEvB,IAAMo7B,EAAa,CAAC,EAEpB,GAAKp7B,IAAS,OAEb,QAAUja,EAAI,EAAGA,EAAIia,EAAK,OAAQja,IAAO,CAExC,IAAMyP,EAAOwK,EAAMja,CAAE,EAEf4X,EAAOijB,GAAc,MAAOprB,CAAK,EAEvC4lC,EAAYz9B,EAAK,IAAK,EAAIA,CAE3B,CAID,OAAOy9B,CAER,CAEA,YAAap7B,EAAMwjD,EAAS,CAE3B,IAAMhiB,EAAQ,KACRtG,EAAS,CAAC,EAEZgpB,EAEJ,SAASgE,EAAWz2B,EAAM,CAEzB,OAAA+P,EAAM,QAAQ,UAAW/P,CAAI,EAEtByyB,EAAO,KAAMzyB,EAAK,UAAY,CAEpC+P,EAAM,QAAQ,QAAS/P,CAAI,CAE5B,EAAG,OAAW,UAAY,CAEzB+P,EAAM,QAAQ,UAAW/P,CAAI,EAC7B+P,EAAM,QAAQ,QAAS/P,CAAI,CAE5B,CAAE,CAEH,CAEA,SAAS02B,EAAkBh7D,EAAQ,CAElC,GAAK,OAAOA,GAAU,SAAW,CAEhC,IAAMskC,EAAMtkC,EAEN4wD,EAAO,4BAA4B,KAAMtsB,CAAI,EAAIA,EAAM+P,EAAM,aAAe/P,EAElF,OAAOy2B,EAAWnK,CAAK,CAExB,KAEC,QAAK5wD,EAAM,KAEH,CACN,KAAMnH,GAAemH,EAAM,KAAMA,EAAM,IAAK,EAC5C,MAAOA,EAAM,MACb,OAAQA,EAAM,MACf,EAIO,IAMV,CAEA,GAAK6S,IAAS,QAAaA,EAAK,OAAS,EAAI,CAE5C,IAAMmkD,EAAU,IAAIrjC,GAAgB0iC,CAAO,EAE3CU,EAAS,IAAI3iC,GAAa4iC,CAAQ,EAClCD,EAAO,eAAgB,KAAK,WAAY,EAExC,QAAUn+D,EAAI,EAAG+sC,EAAK9yB,EAAK,OAAQja,EAAI+sC,EAAI/sC,IAAO,CAEjD,IAAMoH,EAAQ6S,EAAMja,CAAE,EAChB0rC,EAAMtkC,EAAM,IAElB,GAAK,MAAM,QAASskC,CAAI,EAAI,CAI3B,IAAM22B,EAAa,CAAC,EAEpB,QAAUz6D,EAAI,EAAG2wC,EAAK7M,EAAI,OAAQ9jC,EAAI2wC,EAAI3wC,IAAO,CAEhD,IAAM06D,EAAa52B,EAAK9jC,CAAE,EAEpB26D,EAAoBH,EAAkBE,CAAW,EAElDC,IAAsB,OAErBA,aAA6B,iBAEjCF,EAAW,KAAME,CAAkB,EAMnCF,EAAW,KAAM,IAAIrvC,GAAauvC,EAAkB,KAAMA,EAAkB,MAAOA,EAAkB,MAAO,CAAE,EAMjH,CAEAptB,EAAQ/tC,EAAM,IAAK,EAAI,IAAIyhB,GAAQw5C,CAAW,CAE/C,KAAO,CAIN,IAAME,EAAoBH,EAAkBh7D,EAAM,GAAI,EACtD+tC,EAAQ/tC,EAAM,IAAK,EAAI,IAAIyhB,GAAQ05C,CAAkB,CAGtD,CAED,CAED,CAEA,OAAOptB,CAER,CAEA,MAAM,iBAAkBl7B,EAAO,CAE9B,IAAMwhC,EAAQ,KACRtG,EAAS,CAAC,EAEZgpB,EAEJ,eAAeiE,EAAkBh7D,EAAQ,CAExC,GAAK,OAAOA,GAAU,SAAW,CAEhC,IAAMskC,EAAMtkC,EAEN4wD,EAAO,4BAA4B,KAAMtsB,CAAI,EAAIA,EAAM+P,EAAM,aAAe/P,EAElF,OAAO,MAAMyyB,EAAO,UAAWnG,CAAK,CAErC,KAEC,QAAK5wD,EAAM,KAEH,CACN,KAAMnH,GAAemH,EAAM,KAAMA,EAAM,IAAK,EAC5C,MAAOA,EAAM,MACb,OAAQA,EAAM,MACf,EAIO,IAMV,CAEA,GAAK6S,IAAS,QAAaA,EAAK,OAAS,EAAI,CAE5CkkD,EAAS,IAAI3iC,GAAa,KAAK,OAAQ,EACvC2iC,EAAO,eAAgB,KAAK,WAAY,EAExC,QAAUn+D,EAAI,EAAG+sC,EAAK9yB,EAAK,OAAQja,EAAI+sC,EAAI/sC,IAAO,CAEjD,IAAMoH,EAAQ6S,EAAMja,CAAE,EAChB0rC,EAAMtkC,EAAM,IAElB,GAAK,MAAM,QAASskC,CAAI,EAAI,CAI3B,IAAM22B,EAAa,CAAC,EAEpB,QAAUz6D,EAAI,EAAG2wC,EAAK7M,EAAI,OAAQ9jC,EAAI2wC,EAAI3wC,IAAO,CAEhD,IAAM06D,EAAa52B,EAAK9jC,CAAE,EAEpB26D,EAAoB,MAAMH,EAAkBE,CAAW,EAExDC,IAAsB,OAErBA,aAA6B,iBAEjCF,EAAW,KAAME,CAAkB,EAMnCF,EAAW,KAAM,IAAIrvC,GAAauvC,EAAkB,KAAMA,EAAkB,MAAOA,EAAkB,MAAO,CAAE,EAMjH,CAEAptB,EAAQ/tC,EAAM,IAAK,EAAI,IAAIyhB,GAAQw5C,CAAW,CAE/C,KAAO,CAIN,IAAME,EAAoB,MAAMH,EAAkBh7D,EAAM,GAAI,EAC5D+tC,EAAQ/tC,EAAM,IAAK,EAAI,IAAIyhB,GAAQ05C,CAAkB,CAEtD,CAED,CAED,CAEA,OAAOptB,CAER,CAEA,cAAel7B,EAAMk7B,EAAS,CAE7B,SAASqtB,EAAergE,EAAOjC,EAAO,CAErC,OAAK,OAAOiC,GAAU,SAAkBA,GAExClB,GAAM,iEAAkEkB,CAAM,EAEvEjC,EAAMiC,CAAM,EAEpB,CAEA,IAAM+yC,EAAW,CAAC,EAElB,GAAKj7B,IAAS,OAEb,QAAUja,EAAI,EAAG4V,EAAIqE,EAAK,OAAQja,EAAI4V,EAAG5V,IAAO,CAE/C,IAAMyP,EAAOwK,EAAMja,CAAE,EAEhByP,EAAK,QAAU,QAEnBxO,GAAM,yCAA0CwO,EAAK,IAAK,EAItD0lC,EAAQ1lC,EAAK,KAAM,IAAM,QAE7BxO,GAAM,gCAAiCwO,EAAK,KAAM,EAInD,IAAM08B,EAASgJ,EAAQ1lC,EAAK,KAAM,EAC5BrI,EAAQ+kC,EAAO,KAEjBjxB,EAEC,MAAM,QAAS9T,CAAM,GAEzB8T,EAAU,IAAIyV,GAETvpB,EAAM,SAAW,IAAI8T,EAAQ,YAAc,MAI3C9T,GAASA,EAAM,KAEnB8T,EAAU,IAAI8X,GAId9X,EAAU,IAAI8N,GAIV5hB,IAAQ8T,EAAQ,YAAc,KAIpCA,EAAQ,OAASixB,EAEjBjxB,EAAQ,KAAOzL,EAAK,KAEfA,EAAK,OAAS,SAAYyL,EAAQ,KAAOzL,EAAK,MAE9CA,EAAK,UAAY,SAAYyL,EAAQ,QAAUsnD,EAAe/yD,EAAK,QAASytB,GAAgB,GAC5FztB,EAAK,UAAY,SAAYyL,EAAQ,QAAUzL,EAAK,SAEpDA,EAAK,SAAW,QAAYyL,EAAQ,OAAO,UAAWzL,EAAK,MAAO,EAClEA,EAAK,SAAW,QAAYyL,EAAQ,OAAO,UAAWzL,EAAK,MAAO,EAClEA,EAAK,SAAW,QAAYyL,EAAQ,OAAO,UAAWzL,EAAK,MAAO,EAClEA,EAAK,WAAa,SAAYyL,EAAQ,SAAWzL,EAAK,UAEtDA,EAAK,OAAS,SAElByL,EAAQ,MAAQsnD,EAAe/yD,EAAK,KAAM,CAAE,EAAG0tB,EAAiB,EAChEjiB,EAAQ,MAAQsnD,EAAe/yD,EAAK,KAAM,CAAE,EAAG0tB,EAAiB,GAI5D1tB,EAAK,SAAW,SAAYyL,EAAQ,OAASzL,EAAK,QAClDA,EAAK,iBAAmB,SAAYyL,EAAQ,eAAiBzL,EAAK,gBAClEA,EAAK,OAAS,SAAYyL,EAAQ,KAAOzL,EAAK,MAC9CA,EAAK,aAAe,SAAYyL,EAAQ,WAAazL,EAAK,YAE1DA,EAAK,YAAc,SAAYyL,EAAQ,UAAYsnD,EAAe/yD,EAAK,UAAW2tB,EAAe,GACjG3tB,EAAK,YAAc,SAAYyL,EAAQ,UAAYsnD,EAAe/yD,EAAK,UAAW2tB,EAAe,GACjG3tB,EAAK,aAAe,SAAYyL,EAAQ,WAAazL,EAAK,YAE1DA,EAAK,QAAU,SAAYyL,EAAQ,MAAQzL,EAAK,OAEhDA,EAAK,kBAAoB,SAAYyL,EAAQ,gBAAkBzL,EAAK,iBACpEA,EAAK,mBAAqB,SAAYyL,EAAQ,iBAAmBzL,EAAK,kBACtEA,EAAK,kBAAoB,SAAYyL,EAAQ,gBAAkBzL,EAAK,iBACpEA,EAAK,kBAAoB,SAAYyL,EAAQ,gBAAkBzL,EAAK,iBAEpEA,EAAK,WAAa,SAAYyL,EAAQ,SAAWzL,EAAK,UAE3DylC,EAAUzlC,EAAK,IAAK,EAAIyL,CAEzB,CAID,OAAOg6B,CAER,CAEA,YAAazlC,EAAMslC,EAAYE,EAAWC,EAAUG,EAAa,CAEhE,IAAIlsC,EAEJ,SAASs5D,EAAaliE,EAAO,CAE5B,OAAKw0C,EAAYx0C,CAAK,IAAM,QAE3BU,GAAM,mCAAoCV,CAAK,EAIzCw0C,EAAYx0C,CAAK,CAEzB,CAEA,SAASmiE,EAAaniE,EAAO,CAE5B,GAAKA,IAAS,OAEd,IAAK,MAAM,QAASA,CAAK,EAAI,CAE5B,IAAMR,EAAQ,CAAC,EAEf,QAAUC,EAAI,EAAG4V,EAAIrV,EAAK,OAAQP,EAAI4V,EAAG5V,IAAO,CAE/C,IAAM+gD,EAAOxgD,EAAMP,CAAE,EAEhBi1C,EAAW8L,CAAK,IAAM,QAE1B9/C,GAAM,mCAAoC8/C,CAAK,EAIhDhhD,EAAM,KAAMk1C,EAAW8L,CAAK,CAAE,CAE/B,CAEA,OAAOhhD,CAER,CAEA,OAAKk1C,EAAW10C,CAAK,IAAM,QAE1BU,GAAM,mCAAoCV,CAAK,EAIzC00C,EAAW10C,CAAK,EAExB,CAEA,SAAS6gE,EAAYrgB,EAAO,CAE3B,OAAK7L,EAAU6L,CAAK,IAAM,QAEzB9/C,GAAM,kCAAmC8/C,CAAK,EAIxC7L,EAAU6L,CAAK,CAEvB,CAEA,IAAInmC,EAAUxR,EAEd,OAASqG,EAAK,KAAO,CAEpB,IAAK,QAEJtG,EAAS,IAAI+nB,GAERzhB,EAAK,aAAe,SAEnB,OAAO,UAAWA,EAAK,UAAW,EAEtCtG,EAAO,WAAa,IAAI0kB,GAAOpe,EAAK,UAAW,EAI/CtG,EAAO,WAAai4D,EAAY3xD,EAAK,UAAW,GAM7CA,EAAK,cAAgB,SAEzBtG,EAAO,YAAci4D,EAAY3xD,EAAK,WAAY,GAI9CA,EAAK,MAAQ,SAEZA,EAAK,IAAI,OAAS,MAEtBtG,EAAO,IAAM,IAAI8nB,GAAKxhB,EAAK,IAAI,MAAOA,EAAK,IAAI,KAAMA,EAAK,IAAI,GAAI,EAEvDA,EAAK,IAAI,OAAS,YAE7BtG,EAAO,IAAM,IAAI6nB,GAASvhB,EAAK,IAAI,MAAOA,EAAK,IAAI,OAAQ,GAIvDA,EAAK,IAAI,OAAS,KAEtBtG,EAAO,IAAI,KAAOsG,EAAK,IAAI,OAMxBA,EAAK,uBAAyB,SAAYtG,EAAO,qBAAuBsG,EAAK,sBAC7EA,EAAK,sBAAwB,SAAYtG,EAAO,oBAAsBsG,EAAK,qBAC3EA,EAAK,qBAAuB,QAAYtG,EAAO,mBAAmB,UAAWsG,EAAK,kBAAmB,EAErGA,EAAK,uBAAyB,SAAYtG,EAAO,qBAAuBsG,EAAK,sBAC7EA,EAAK,sBAAwB,QAAYtG,EAAO,oBAAoB,UAAWsG,EAAK,mBAAoB,EAE7G,MAED,IAAK,oBAEJtG,EAAS,IAAIqnB,GAAmB/gB,EAAK,IAAKA,EAAK,OAAQA,EAAK,KAAMA,EAAK,GAAI,EAEtEA,EAAK,QAAU,SAAYtG,EAAO,MAAQsG,EAAK,OAC/CA,EAAK,OAAS,SAAYtG,EAAO,KAAOsG,EAAK,MAC7CA,EAAK,YAAc,SAAYtG,EAAO,UAAYsG,EAAK,WACvDA,EAAK,aAAe,SAAYtG,EAAO,WAAasG,EAAK,YACzDA,EAAK,OAAS,SAAYtG,EAAO,KAAO,OAAO,OAAQ,CAAC,EAAGsG,EAAK,IAAK,GAE1E,MAED,IAAK,qBAEJtG,EAAS,IAAImzB,GAAoB7sB,EAAK,KAAMA,EAAK,MAAOA,EAAK,IAAKA,EAAK,OAAQA,EAAK,KAAMA,EAAK,GAAI,EAE9FA,EAAK,OAAS,SAAYtG,EAAO,KAAOsG,EAAK,MAC7CA,EAAK,OAAS,SAAYtG,EAAO,KAAO,OAAO,OAAQ,CAAC,EAAGsG,EAAK,IAAK,GAE1E,MAED,IAAK,eAEJtG,EAAS,IAAIszB,GAAchtB,EAAK,MAAOA,EAAK,SAAU,EAEtD,MAED,IAAK,mBAEJtG,EAAS,IAAIqzB,GAAkB/sB,EAAK,MAAOA,EAAK,SAAU,EAC1DtG,EAAO,OAASsG,EAAK,QAAU,GAE/B,MAED,IAAK,aAEJtG,EAAS,IAAIkzB,GAAY5sB,EAAK,MAAOA,EAAK,UAAWA,EAAK,SAAUA,EAAK,KAAM,EAE/E,MAED,IAAK,gBAEJtG,EAAS,IAAIuzB,GAAejtB,EAAK,MAAOA,EAAK,UAAWA,EAAK,MAAOA,EAAK,MAAO,EAEhF,MAED,IAAK,YAEJtG,EAAS,IAAIgzB,GAAW1sB,EAAK,MAAOA,EAAK,UAAWA,EAAK,SAAUA,EAAK,MAAOA,EAAK,SAAUA,EAAK,KAAM,EACzGtG,EAAO,OAASsG,EAAK,QAAU,GAE/B,MAED,IAAK,kBAEJtG,EAAS,IAAI0yB,GAAiBpsB,EAAK,MAAOA,EAAK,YAAaA,EAAK,SAAU,EAE3E,MAED,IAAK,aAEJ,IAAMwxD,EAAK,IAAItkC,GAAoB,EAAE,UAAWltB,EAAK,EAAG,EACxDtG,EAAS,IAAIyzB,GAAYqkC,EAAIxxD,EAAK,SAAU,EAE5C,MAED,IAAK,cAEJmL,EAAW6nD,EAAahzD,EAAK,QAAS,EACrCrG,EAAWs5D,EAAajzD,EAAK,QAAS,EAEvCtG,EAAS,IAAI2pB,GAAalY,EAAUxR,CAAS,EAExCqG,EAAK,WAAa,SAAYtG,EAAO,SAAWsG,EAAK,UACrDA,EAAK,aAAe,QAAYtG,EAAO,WAAW,UAAWsG,EAAK,UAAW,EAC7EA,EAAK,WAAa,SAAYtG,EAAO,SAAWsG,EAAK,UAE1D,MAED,IAAK,OAEJmL,EAAW6nD,EAAahzD,EAAK,QAAS,EACtCrG,EAAWs5D,EAAajzD,EAAK,QAAS,EAEtCtG,EAAS,IAAI2mB,GAAMlV,EAAUxR,CAAS,EAEtC,MAED,IAAK,gBAEJwR,EAAW6nD,EAAahzD,EAAK,QAAS,EACtCrG,EAAWs5D,EAAajzD,EAAK,QAAS,EACtC,IAAMy8B,EAAQz8B,EAAK,MACbkzD,EAAiBlzD,EAAK,eACtBmzD,EAAgBnzD,EAAK,cAE3BtG,EAAS,IAAIyqB,GAAehZ,EAAUxR,EAAU8iC,CAAM,EACtD/iC,EAAO,eAAiB,IAAIiqB,GAA0B,IAAI,aAAcuvC,EAAe,KAAM,EAAG,EAAG,EAC9FC,IAAkB,SAAYz5D,EAAO,cAAgB,IAAIiqB,GAA0B,IAAI,aAAcwvC,EAAc,KAAM,EAAGA,EAAc,QAAS,GAExJ,MAED,IAAK,cAEJhoD,EAAW6nD,EAAahzD,EAAK,QAAS,EACtCrG,EAAWs5D,EAAajzD,EAAK,QAAS,EAEtCtG,EAAS,IAAIksB,GAAa5lB,EAAK,iBAAkBA,EAAK,eAAgBA,EAAK,cAAerG,CAAS,EACnGD,EAAO,SAAWyR,EAClBzR,EAAO,uBAAyBsG,EAAK,uBACrCtG,EAAO,YAAcsG,EAAK,YAE1BtG,EAAO,YAAcsG,EAAK,WAC1BtG,EAAO,gBAAkBsG,EAAK,eAE9BtG,EAAO,cAAgBsG,EAAK,aAAa,IAAK+kC,GAAQ,CAErD,IAAIpH,EAAM,KACNE,EAAS,KACb,OAAKkH,EAAK,cAAgB,SAEzBpH,EAAM,IAAI5jB,GAAK,EAAE,SAAUgrB,EAAK,WAAY,GAIxCA,EAAK,iBAAmB,SAE5BlH,EAAS,IAAI9iB,GAAO,EAAE,SAAUgqB,EAAK,cAAe,GAI9C,CACN,GAAGA,EACH,YAAapH,EACb,eAAgBE,CACjB,CAED,CAAE,EACFnkC,EAAO,cAAgBsG,EAAK,aAE5BtG,EAAO,sBAAwBsG,EAAK,sBACpCtG,EAAO,sBAAwBsG,EAAK,sBAEpCtG,EAAO,gBAAkBsG,EAAK,eAC9BtG,EAAO,iBAAmBsG,EAAK,gBAC/BtG,EAAO,eAAiBsG,EAAK,cAE7BtG,EAAO,kBAAoBsG,EAAK,iBAChCtG,EAAO,gBAAkBsG,EAAK,eAC9BtG,EAAO,eAAiBsG,EAAK,cAE7BtG,EAAO,qBAAuBsG,EAAK,oBAEnCtG,EAAO,iBAAmBi4D,EAAY3xD,EAAK,gBAAgB,IAAK,EAEhEtG,EAAO,iBAAmBi4D,EAAY3xD,EAAK,gBAAgB,IAAK,EAE3DA,EAAK,gBAAkB,SAE3BtG,EAAO,eAAiBi4D,EAAY3xD,EAAK,cAAc,IAAK,GAIxDA,EAAK,iBAAmB,SAE5BtG,EAAO,eAAiB,IAAIqhB,GAAO,EAAE,SAAU/a,EAAK,cAAe,GAI/DA,EAAK,cAAgB,SAEzBtG,EAAO,YAAc,IAAIqgB,GAAK,EAAE,SAAU/Z,EAAK,WAAY,GAI5D,MAED,IAAK,MAEJtG,EAAS,IAAIipB,GAEb,MAED,IAAK,OAEJjpB,EAAS,IAAIusB,GAAM+sC,EAAahzD,EAAK,QAAS,EAAGizD,EAAajzD,EAAK,QAAS,CAAE,EAE9E,MAED,IAAK,WAEJtG,EAAS,IAAI2sB,GAAU2sC,EAAahzD,EAAK,QAAS,EAAGizD,EAAajzD,EAAK,QAAS,CAAE,EAElF,MAED,IAAK,eAEJtG,EAAS,IAAI0sB,GAAc4sC,EAAahzD,EAAK,QAAS,EAAGizD,EAAajzD,EAAK,QAAS,CAAE,EAEtF,MAED,IAAK,aACL,IAAK,SAEJtG,EAAS,IAAIgtB,GAAQssC,EAAahzD,EAAK,QAAS,EAAGizD,EAAajzD,EAAK,QAAS,CAAE,EAEhF,MAED,IAAK,SAEJtG,EAAS,IAAI8oB,GAAQywC,EAAajzD,EAAK,QAAS,CAAE,EAElD,MAED,IAAK,QAEJtG,EAAS,IAAI0nB,GAEb,MAED,IAAK,OAEJ1nB,EAAS,IAAI4pB,GAEb,MAED,QAEC5pB,EAAS,IAAIyjB,EAEf,CA4CA,GA1CAzjB,EAAO,KAAOsG,EAAK,KAEdA,EAAK,OAAS,SAAYtG,EAAO,KAAOsG,EAAK,MAE7CA,EAAK,SAAW,QAEpBtG,EAAO,OAAO,UAAWsG,EAAK,MAAO,EAEhCA,EAAK,mBAAqB,SAAYtG,EAAO,iBAAmBsG,EAAK,kBACrEtG,EAAO,kBAAmBA,EAAO,OAAO,UAAWA,EAAO,SAAUA,EAAO,WAAYA,EAAO,KAAM,IAIpGsG,EAAK,WAAa,QAAYtG,EAAO,SAAS,UAAWsG,EAAK,QAAS,EACvEA,EAAK,WAAa,QAAYtG,EAAO,SAAS,UAAWsG,EAAK,QAAS,EACvEA,EAAK,aAAe,QAAYtG,EAAO,WAAW,UAAWsG,EAAK,UAAW,EAC7EA,EAAK,QAAU,QAAYtG,EAAO,MAAM,UAAWsG,EAAK,KAAM,GAI/DA,EAAK,KAAO,QAAYtG,EAAO,GAAG,UAAWsG,EAAK,EAAG,EAErDA,EAAK,aAAe,SAAYtG,EAAO,WAAasG,EAAK,YACzDA,EAAK,gBAAkB,SAAYtG,EAAO,cAAgBsG,EAAK,eAE/DA,EAAK,SAEJA,EAAK,OAAO,YAAc,SAAYtG,EAAO,OAAO,UAAYsG,EAAK,OAAO,WAC5EA,EAAK,OAAO,OAAS,SAAYtG,EAAO,OAAO,KAAOsG,EAAK,OAAO,MAClEA,EAAK,OAAO,aAAe,SAAYtG,EAAO,OAAO,WAAasG,EAAK,OAAO,YAC9EA,EAAK,OAAO,SAAW,SAAYtG,EAAO,OAAO,OAASsG,EAAK,OAAO,QACtEA,EAAK,OAAO,UAAY,QAAYtG,EAAO,OAAO,QAAQ,UAAWsG,EAAK,OAAO,OAAQ,EACzFA,EAAK,OAAO,SAAW,SAAYtG,EAAO,OAAO,OAAS,KAAK,YAAasG,EAAK,OAAO,MAAO,IAIhGA,EAAK,UAAY,SAAYtG,EAAO,QAAUsG,EAAK,SACnDA,EAAK,gBAAkB,SAAYtG,EAAO,cAAgBsG,EAAK,eAC/DA,EAAK,cAAgB,SAAYtG,EAAO,YAAcsG,EAAK,aAC3DA,EAAK,WAAa,SAAYtG,EAAO,SAAWsG,EAAK,UACrDA,EAAK,SAAW,SAAYtG,EAAO,OAAO,KAAOsG,EAAK,QAEtDA,EAAK,WAAa,OAAY,CAElC,IAAM6K,EAAW7K,EAAK,SAEtB,QAAUzP,EAAI,EAAGA,EAAIsa,EAAS,OAAQta,IAErCmJ,EAAO,IAAK,KAAK,YAAamR,EAAUta,CAAE,EAAG+0C,EAAYE,EAAWC,EAAUG,CAAW,CAAE,CAI7F,CAEA,GAAK5lC,EAAK,aAAe,OAAY,CAEpC,IAAMozD,EAAmBpzD,EAAK,WAE9B,QAAUzP,EAAI,EAAGA,EAAI6iE,EAAiB,OAAQ7iE,IAAO,CAEpD,IAAM+gD,EAAO8hB,EAAkB7iE,CAAE,EAEjCmJ,EAAO,WAAW,KAAMksC,EAAY0L,CAAK,CAAE,CAE5C,CAED,CAEA,GAAKtxC,EAAK,OAAS,MAAQ,CAErBA,EAAK,aAAe,SAAYtG,EAAO,WAAasG,EAAK,YAE9D,IAAMqwC,EAASrwC,EAAK,OAEpB,QAAUmG,EAAI,EAAGA,EAAIkqC,EAAO,OAAQlqC,IAAO,CAE1C,IAAMmqC,EAAQD,EAAQlqC,CAAE,EAClB4/B,EAAQrsC,EAAO,oBAAqB,OAAQ42C,EAAM,MAAO,EAE1DvK,IAAU,QAEdrsC,EAAO,SAAUqsC,EAAOuK,EAAM,SAAUA,EAAM,UAAW,CAI3D,CAED,CAEA,OAAO52C,CAER,CAEA,cAAeA,EAAQisC,EAAY,CAE7B,OAAO,KAAMA,CAAU,EAAE,SAAW,GAEzCjsC,EAAO,SAAU,SAAWqsC,EAAQ,CAEnC,GAAKA,EAAM,gBAAkB,IAAQA,EAAM,WAAa,OAAY,CAEnE,IAAM2K,EAAW/K,EAAWI,EAAM,QAAS,EAEtC2K,IAAa,OAEjBl/C,GAAM,6CAA8Cu0C,EAAM,QAAS,EAInEA,EAAM,KAAM2K,EAAU3K,EAAM,UAAW,CAIzC,CAED,CAAE,CAEH,CAEA,iBAAkBrsC,EAAS,CAE1BA,EAAO,SAAU,SAAWqsC,EAAQ,CAEnC,GAAKA,EAAM,oBAAsBA,EAAM,YAAc,CAEpD,IAAMuL,EAAOvL,EAAM,OAEb9uC,EAASyC,EAAO,oBAAqB,OAAQ43C,CAAK,EAEnDr6C,IAAW,OAEf8uC,EAAM,OAAS9uC,EAIf8uC,EAAM,OAAS,IAAI5oB,EAIrB,CAED,CAAE,CAEH,CAED,EAEMsQ,IAAkB,CACvB,UAAWla,GACX,sBAAuBC,GACvB,sBAAuBC,GACvB,iCAAkCC,GAClC,iCAAkCC,GAClC,wBAAyBC,EAC1B,EAEM8Z,GAAmB,CACxB,eAAgB7Z,GAChB,oBAAqBC,GACrB,uBAAwBC,EACzB,EAEM4Z,GAAiB,CACtB,cAAe3Z,GACf,2BAA4BC,GAC5B,0BAA2BE,GAC3B,aAAcE,GACd,0BAA2BC,GAC3B,yBAA0BE,EAC3B,EAEMoZ,GAAY,IAAI,QAyBhBC,GAAN,cAAgCrC,EAAO,CAOtC,YAAamjC,EAAU,CAEtB,MAAOA,CAAQ,EASf,KAAK,oBAAsB,GAEtB,OAAO,kBAAsB,KAEjCn9D,GAAM,uDAAwD,EAI1D,OAAO,MAAU,KAErBA,GAAM,2CAA4C,EAUnD,KAAK,QAAU,CAAE,iBAAkB,MAAO,EAQ1C,KAAK,iBAAmB,IAAI,eAE7B,CASA,WAAYiV,EAAU,CAErB,YAAK,QAAUA,EAER,IAER,CAWA,KAAMw1B,EAAK+xB,EAAQC,EAAYC,EAAU,CAEnCjyB,IAAQ,SAAYA,EAAM,IAE1B,KAAK,OAAS,SAAYA,EAAM,KAAK,KAAOA,GAEjDA,EAAM,KAAK,QAAQ,WAAYA,CAAI,EAEnC,IAAM+P,EAAQ,KAERgjB,EAAS3jC,GAAM,IAAK,gBAAgB4Q,CAAG,EAAG,EAEhD,GAAK+yB,IAAW,OAAY,CAK3B,GAHAhjB,EAAM,QAAQ,UAAW/P,CAAI,EAGxB+yB,EAAO,KAAO,CAElBA,EAAO,KAAMqE,GAAe,CAI3B,GAAKzlC,GAAU,IAAKohC,CAAO,IAAM,GAE3Bd,GAAUA,EAAStgC,GAAU,IAAKohC,CAAO,CAAE,EAEhDhjB,EAAM,QAAQ,UAAW/P,CAAI,EAC7B+P,EAAM,QAAQ,QAAS/P,CAAI,MAI3B,QAAK+xB,GAASA,EAAQqF,CAAY,EAElCrnB,EAAM,QAAQ,QAAS/P,CAAI,EAEpBo3B,CAIT,CAAE,EAEF,MAED,CAGA,kBAAY,UAAY,CAElBrF,GAASA,EAAQgB,CAAO,EAE7BhjB,EAAM,QAAQ,QAAS/P,CAAI,CAE5B,EAAG,CAAE,EAEE+yB,CAER,CAEA,IAAMsE,EAAe,CAAC,EACtBA,EAAa,YAAgB,KAAK,cAAgB,YAAgB,cAAgB,UAClFA,EAAa,QAAU,KAAK,cAC5BA,EAAa,OAAW,OAAO,YAAY,KAAQ,WAAe,YAAY,IAAK,CAAE,KAAK,iBAAiB,OAAQ,KAAK,QAAQ,gBAAgB,MAAO,CAAE,EAAI,KAAK,iBAAiB,OAEnL,IAAMC,EAAU,MAAOt3B,EAAKq3B,CAAa,EAAE,KAAM,SAAWE,EAAM,CAEjE,OAAOA,EAAI,KAAK,CAEjB,CAAE,EAAE,KAAM,SAAWC,EAAO,CAE3B,OAAO,kBAAmBA,EAAM,OAAO,OAAQznB,EAAM,QAAS,CAAE,qBAAsB,MAAO,CAAE,CAAE,CAElG,CAAE,EAAE,KAAM,SAAWqnB,EAAc,CAElC,OAAAhoC,GAAM,IAAK,gBAAgB4Q,CAAG,GAAIo3B,CAAY,EAEzCrF,GAASA,EAAQqF,CAAY,EAElCrnB,EAAM,QAAQ,QAAS/P,CAAI,EAEpBo3B,CAER,CAAE,EAAE,MAAO,SAAWr6D,EAAI,CAEpBk1D,GAAUA,EAASl1D,CAAE,EAE1B40B,GAAU,IAAK2lC,EAASv6D,CAAE,EAE1BqyB,GAAM,OAAQ,gBAAgB4Q,CAAG,EAAG,EAEpC+P,EAAM,QAAQ,UAAW/P,CAAI,EAC7B+P,EAAM,QAAQ,QAAS/P,CAAI,CAE5B,CAAE,EAEF5Q,GAAM,IAAK,gBAAgB4Q,CAAG,GAAIs3B,CAAQ,EAC1CvnB,EAAM,QAAQ,UAAW/P,CAAI,CAE9B,CAOA,OAAQ,CAEP,YAAK,iBAAiB,MAAM,EAC5B,KAAK,iBAAmB,IAAI,gBAErB,IAER,CAED,EASMlO,GAAN,KAAmB,CAOlB,OAAO,YAAa,CAEnB,OAAKD,KAAa,SAEjBA,GAAW,IAAM,OAAO,cAAgB,OAAO,qBAIzCA,EAER,CAOA,OAAO,WAAYp7B,EAAQ,CAE1Bo7B,GAAWp7B,CAEZ,CAED,EAmBMs7B,GAAN,cAA0BxC,EAAO,CAOhC,YAAamjC,EAAU,CAEtB,MAAOA,CAAQ,CAEhB,CAWA,KAAM1yB,EAAK+xB,EAAQC,EAAYC,EAAU,CAExC,IAAMliB,EAAQ,KAER0iB,EAAS,IAAI/iC,GAAY,KAAK,OAAQ,EAC5C+iC,EAAO,gBAAiB,aAAc,EACtCA,EAAO,QAAS,KAAK,IAAK,EAC1BA,EAAO,iBAAkB,KAAK,aAAc,EAC5CA,EAAO,mBAAoB,KAAK,eAAgB,EAChDA,EAAO,KAAMzyB,EAAK,SAAWvrC,EAAS,CAErC,GAAI,CAIH,IAAMgjE,EAAahjE,EAAO,MAAO,CAAE,EAEnBq9B,GAAa,WAAW,EAChC,gBAAiB2lC,EAAY,SAAWC,EAAc,CAE7D3F,EAAQ2F,CAAY,CAErB,CAAE,EAAE,MAAOC,CAAY,CAExB,OAAU56D,EAAI,CAEb46D,EAAa56D,CAAE,CAEhB,CAED,EAAGi1D,EAAYC,CAAQ,EAEvB,SAAS0F,EAAa56D,EAAI,CAEpBk1D,EAEJA,EAASl1D,CAAE,EAIXvH,GAAOuH,CAAE,EAIVgzC,EAAM,QAAQ,UAAW/P,CAAI,CAE9B,CAED,CAED,EAEMhO,GAA0B,IAAIzS,GAC9B0S,GAAyB,IAAI1S,GAC7B2S,GAAkC,IAAI3S,GAQtC4S,GAAN,KAAmB,CAKlB,aAAc,CASb,KAAK,KAAO,eAQZ,KAAK,OAAS,EASd,KAAK,OAAS,KAQd,KAAK,QAAU,IAAIrN,GACnB,KAAK,QAAQ,OAAO,OAAQ,CAAE,EAC9B,KAAK,QAAQ,iBAAmB,GAQhC,KAAK,QAAU,IAAIA,GACnB,KAAK,QAAQ,OAAO,OAAQ,CAAE,EAC9B,KAAK,QAAQ,iBAAmB,GAEhC,KAAK,OAAS,CACb,MAAO,KACP,IAAK,KACL,OAAQ,KACR,KAAM,KACN,IAAK,KACL,KAAM,KACN,OAAQ,IACT,CAED,CAOA,OAAQ3V,EAAS,CAEhB,IAAM06B,EAAQ,KAAK,OAMnB,GAJoBA,EAAM,QAAU16B,EAAO,OAAS06B,EAAM,MAAQ16B,EAAO,KACxE06B,EAAM,SAAW16B,EAAO,OAAS,KAAK,QAAU06B,EAAM,OAAS16B,EAAO,MACtE06B,EAAM,MAAQ16B,EAAO,KAAO06B,EAAM,OAAS16B,EAAO,MAAQ06B,EAAM,SAAW,KAAK,OAE9D,CAElBA,EAAM,MAAQ16B,EAAO,MACrB06B,EAAM,IAAM16B,EAAO,IACnB06B,EAAM,OAAS16B,EAAO,OAAS,KAAK,OACpC06B,EAAM,KAAO16B,EAAO,KACpB06B,EAAM,IAAM16B,EAAO,IACnB06B,EAAM,KAAO16B,EAAO,KACpB06B,EAAM,OAAS,KAAK,OAKpB3X,GAAkB,KAAM/iB,EAAO,gBAAiB,EAChD,IAAMyoD,EAAa/tB,EAAM,OAAS,EAC5BguB,EAAqBD,EAAa/tB,EAAM,KAAOA,EAAM,MACrDiuB,EAASjuB,EAAM,KAAO,KAAK,IAAKlxC,GAAUkxC,EAAM,IAAM,EAAI,EAAMA,EAAM,KACxEkuB,EAAMC,EAIV/lC,GAAS,SAAU,EAAG,EAAI,CAAE2lC,EAC5B5lC,GAAU,SAAU,EAAG,EAAI4lC,EAI3BG,EAAO,CAAED,EAAOjuB,EAAM,OAASguB,EAC/BG,EAAOF,EAAOjuB,EAAM,OAASguB,EAE7B3lC,GAAkB,SAAU,CAAE,EAAI,EAAI2X,EAAM,MAASmuB,EAAOD,GAC5D7lC,GAAkB,SAAU,CAAE,GAAM8lC,EAAOD,IAAWC,EAAOD,GAE7D,KAAK,QAAQ,iBAAiB,KAAM7lC,EAAkB,EAItD6lC,EAAO,CAAED,EAAOjuB,EAAM,OAASguB,EAC/BG,EAAOF,EAAOjuB,EAAM,OAASguB,EAE7B3lC,GAAkB,SAAU,CAAE,EAAI,EAAI2X,EAAM,MAASmuB,EAAOD,GAC5D7lC,GAAkB,SAAU,CAAE,GAAM8lC,EAAOD,IAAWC,EAAOD,GAE7D,KAAK,QAAQ,iBAAiB,KAAM7lC,EAAkB,CAEvD,CAEA,KAAK,QAAQ,YAAY,KAAM/iB,EAAO,WAAY,EAAE,SAAU8iB,EAAS,EACvE,KAAK,QAAQ,YAAY,KAAM9iB,EAAO,WAAY,EAAE,SAAU6iB,EAAU,CAEzE,CAED,EAaMI,GAAN,cAA0BtN,EAAkB,CAO3C,YAAazwB,EAAQ,CAAC,EAAI,CAEzB,MAAM,EASN,KAAK,cAAgB,GASrB,KAAK,kBAAoB,GAOzB,KAAK,QAAUA,CAEhB,CAED,EAKMg+B,GAAN,KAAY,CAQX,YAAa4lC,EAAY,GAAO,CAS/B,KAAK,UAAYA,EAQjB,KAAK,UAAY,EASjB,KAAK,QAAU,EAQf,KAAK,YAAc,EAQnB,KAAK,QAAU,EAEhB,CAMA,OAAQ,CAEP,KAAK,UAAY,YAAY,IAAI,EAEjC,KAAK,QAAU,KAAK,UACpB,KAAK,YAAc,EACnB,KAAK,QAAU,EAEhB,CAKA,MAAO,CAEN,KAAK,eAAe,EACpB,KAAK,QAAU,GACf,KAAK,UAAY,EAElB,CAOA,gBAAiB,CAEhB,YAAK,SAAS,EACP,KAAK,WAEb,CAOA,UAAW,CAEV,IAAIhW,EAAO,EAEX,GAAK,KAAK,WAAa,CAAE,KAAK,QAE7B,YAAK,MAAM,EACJ,EAIR,GAAK,KAAK,QAAU,CAEnB,IAAMiW,EAAU,YAAY,IAAI,EAEhCjW,GAASiW,EAAU,KAAK,SAAY,IACpC,KAAK,QAAUA,EAEf,KAAK,aAAejW,CAErB,CAEA,OAAOA,CAER,CAED,EAEM3vB,GAA4B,IAAItzB,EAChCuzB,GAA8B,IAAI9kB,GAClC+kB,IAAyB,IAAIxzB,EAE7ByzB,GAAyB,IAAIzzB,EAC7B0zB,GAAoB,IAAI1zB,EAYxB2zB,GAAN,cAA4BzR,EAAS,CAKpC,aAAc,CAEb,MAAM,EAEN,KAAK,KAAO,gBAQZ,KAAK,QAAU4Q,GAAa,WAAW,EAQvC,KAAK,KAAO,KAAK,QAAQ,WAAW,EACpC,KAAK,KAAK,QAAS,KAAK,QAAQ,WAAY,EAW5C,KAAK,OAAS,KASd,KAAK,UAAY,EAIjB,KAAK,OAAS,IAAIO,EAEnB,CASA,UAAW,CAEV,OAAO,KAAK,IAEb,CAOA,cAAe,CAEd,OAAK,KAAK,SAAW,OAEpB,KAAK,KAAK,WAAY,KAAK,MAAO,EAClC,KAAK,OAAO,WAAY,KAAK,QAAQ,WAAY,EACjD,KAAK,KAAK,QAAS,KAAK,QAAQ,WAAY,EAC5C,KAAK,OAAS,MAIR,IAER,CAOA,WAAY,CAEX,OAAO,KAAK,MAEb,CAQA,UAAW57B,EAAQ,CAElB,OAAK,KAAK,SAAW,MAEpB,KAAK,KAAK,WAAY,KAAK,MAAO,EAClC,KAAK,OAAO,WAAY,KAAK,QAAQ,WAAY,GAIjD,KAAK,KAAK,WAAY,KAAK,QAAQ,WAAY,EAIhD,KAAK,OAASA,EACd,KAAK,KAAK,QAAS,KAAK,MAAO,EAC/B,KAAK,OAAO,QAAS,KAAK,QAAQ,WAAY,EAEvC,IAER,CAOA,iBAAkB,CAEjB,OAAO,KAAK,KAAK,KAAK,KAEvB,CASA,gBAAiBA,EAAQ,CAExB,YAAK,KAAK,KAAK,gBAAiBA,EAAO,KAAK,QAAQ,YAAa,GAAK,EAE/D,IAER,CAEA,kBAAmBkyC,EAAQ,CAE1B,MAAM,kBAAmBA,CAAM,EAE/B,IAAMhR,EAAW,KAAK,QAAQ,SAU9B,GARA,KAAK,UAAY,KAAK,OAAO,SAAS,EAEtC,KAAK,YAAY,UAAWrF,GAAaC,GAAeC,GAAS,EAGjEC,GAAS,IAAK,EAAG,EAAG,EAAG,EAAE,gBAAiBF,EAAc,EACxDG,GAAI,IAAK,EAAG,EAAG,CAAE,EAAE,gBAAiBH,EAAc,EAE7CoF,EAAS,UAAY,CAIzB,IAAMs3B,EAAU,KAAK,QAAQ,YAAc,KAAK,UAEhDt3B,EAAS,UAAU,wBAAyBrF,GAAY,EAAG28B,CAAQ,EACnEt3B,EAAS,UAAU,wBAAyBrF,GAAY,EAAG28B,CAAQ,EACnEt3B,EAAS,UAAU,wBAAyBrF,GAAY,EAAG28B,CAAQ,EACnEt3B,EAAS,SAAS,wBAAyBlF,GAAS,EAAGw8B,CAAQ,EAC/Dt3B,EAAS,SAAS,wBAAyBlF,GAAS,EAAGw8B,CAAQ,EAC/Dt3B,EAAS,SAAS,wBAAyBlF,GAAS,EAAGw8B,CAAQ,EAC/Dt3B,EAAS,IAAI,wBAAyBjF,GAAI,EAAGu8B,CAAQ,EACrDt3B,EAAS,IAAI,wBAAyBjF,GAAI,EAAGu8B,CAAQ,EACrDt3B,EAAS,IAAI,wBAAyBjF,GAAI,EAAGu8B,CAAQ,CAEtD,MAECt3B,EAAS,YAAarF,GAAY,EAAGA,GAAY,EAAGA,GAAY,CAAE,EAClEqF,EAAS,eAAgBlF,GAAS,EAAGA,GAAS,EAAGA,GAAS,EAAGC,GAAI,EAAGA,GAAI,EAAGA,GAAI,CAAE,CAInF,CAED,EA2BME,GAAN,cAAoB1R,EAAS,CAO5B,YAAayW,EAAW,CAEvB,MAAM,EAEN,KAAK,KAAO,QAQZ,KAAK,SAAWA,EAQhB,KAAK,QAAUA,EAAS,QAQxB,KAAK,KAAO,KAAK,QAAQ,WAAW,EACpC,KAAK,KAAK,QAASA,EAAS,SAAS,CAAE,EAQvC,KAAK,SAAW,GAWhB,KAAK,OAAS,KAYd,KAAK,OAAS,EAWd,KAAK,KAAO,GASZ,KAAK,UAAY,EASjB,KAAK,QAAU,EASf,KAAK,OAAS,EAQd,KAAK,SAAW,OAWhB,KAAK,aAAe,EAYpB,KAAK,UAAY,GAajB,KAAK,mBAAqB,GAW1B,KAAK,OAAS,KAWd,KAAK,WAAa,QAElB,KAAK,WAAa,EAClB,KAAK,UAAY,EACjB,KAAK,WAAa,GAWlB,KAAK,QAAU,CAAC,CAEjB,CAOA,WAAY,CAEX,OAAO,KAAK,IAEb,CAUA,cAAewgC,EAAY,CAE1B,YAAK,mBAAqB,GAC1B,KAAK,WAAa,YAClB,KAAK,OAASA,EACd,KAAK,QAAQ,EAEN,IAER,CAUA,sBAAuBC,EAAe,CAErC,YAAK,mBAAqB,GAC1B,KAAK,WAAa,YAClB,KAAK,OAAS,KAAK,QAAQ,yBAA0BA,CAAa,EAClE,KAAK,QAAQ,EAEN,IAER,CAUA,qBAAsBC,EAAc,CAEnC,YAAK,mBAAqB,GAC1B,KAAK,WAAa,kBAClB,KAAK,OAAS,KAAK,QAAQ,wBAAyBA,CAAY,EAChE,KAAK,QAAQ,EAEN,IAER,CAUA,UAAWX,EAAc,CAExB,YAAK,OAASA,EACd,KAAK,WAAa,SAEb,KAAK,UAAW,KAAK,KAAK,EAExB,IAER,CAUA,KAAMY,EAAQ,EAAI,CAEjB,GAAK,KAAK,YAAc,GAAO,CAE9B/iE,GAAM,kCAAmC,EACzC,MAED,CAEA,GAAK,KAAK,qBAAuB,GAAQ,CAExCA,GAAM,4CAA6C,EACnD,MAED,CAEA,KAAK,WAAa,KAAK,QAAQ,YAAc+iE,EAE7C,IAAM73B,EAAS,KAAK,QAAQ,mBAAmB,EAC/C,OAAAA,EAAO,OAAS,KAAK,OACrBA,EAAO,KAAO,KAAK,KACnBA,EAAO,UAAY,KAAK,UACxBA,EAAO,QAAU,KAAK,QACtBA,EAAO,QAAU,KAAK,QAAQ,KAAM,IAAK,EACzCA,EAAO,MAAO,KAAK,WAAY,KAAK,UAAY,KAAK,OAAQ,KAAK,QAAS,EAE3E,KAAK,UAAY,GAEjB,KAAK,OAASA,EAEd,KAAK,UAAW,KAAK,MAAO,EAC5B,KAAK,gBAAiB,KAAK,YAAa,EAEjC,KAAK,QAAQ,CAErB,CASA,OAAQ,CAEP,GAAK,KAAK,qBAAuB,GAAQ,CAExClrC,GAAM,4CAA6C,EACnD,MAED,CAEA,OAAK,KAAK,YAAc,KAIvB,KAAK,WAAa,KAAK,IAAK,KAAK,QAAQ,YAAc,KAAK,WAAY,CAAE,EAAI,KAAK,aAE9E,KAAK,OAAS,KAIlB,KAAK,UAAY,KAAK,WAAc,KAAK,UAAY,KAAK,OAAO,WAIlE,KAAK,OAAO,KAAK,EACjB,KAAK,OAAO,QAAU,KAEtB,KAAK,UAAY,IAIX,IAER,CAUA,KAAM+iE,EAAQ,EAAI,CAEjB,GAAK,KAAK,qBAAuB,GAAQ,CAExC/iE,GAAM,4CAA6C,EACnD,MAED,CAEA,YAAK,UAAY,EAEZ,KAAK,SAAW,OAEpB,KAAK,OAAO,KAAM,KAAK,QAAQ,YAAc+iE,CAAM,EACnD,KAAK,OAAO,QAAU,MAIvB,KAAK,UAAY,GAEV,IAER,CAQA,SAAU,CAET,GAAK,KAAK,QAAQ,OAAS,EAAI,CAE9B,KAAK,OAAO,QAAS,KAAK,QAAS,CAAE,CAAE,EAEvC,QAAUhkE,EAAI,EAAG4V,EAAI,KAAK,QAAQ,OAAQ5V,EAAI4V,EAAG5V,IAEhD,KAAK,QAASA,EAAI,CAAE,EAAE,QAAS,KAAK,QAASA,CAAE,CAAE,EAIlD,KAAK,QAAS,KAAK,QAAQ,OAAS,CAAE,EAAE,QAAS,KAAK,UAAU,CAAE,CAEnE,MAEC,KAAK,OAAO,QAAS,KAAK,UAAU,CAAE,EAIvC,YAAK,WAAa,GAEX,IAER,CAQA,YAAa,CAEZ,GAAK,KAAK,aAAe,GAMzB,IAAK,KAAK,QAAQ,OAAS,EAAI,CAE9B,KAAK,OAAO,WAAY,KAAK,QAAS,CAAE,CAAE,EAE1C,QAAUA,EAAI,EAAG4V,EAAI,KAAK,QAAQ,OAAQ5V,EAAI4V,EAAG5V,IAEhD,KAAK,QAASA,EAAI,CAAE,EAAE,WAAY,KAAK,QAASA,CAAE,CAAE,EAIrD,KAAK,QAAS,KAAK,QAAQ,OAAS,CAAE,EAAE,WAAY,KAAK,UAAU,CAAE,CAEtE,MAEC,KAAK,OAAO,WAAY,KAAK,UAAU,CAAE,EAI1C,YAAK,WAAa,GAEX,KAER,CAOA,YAAa,CAEZ,OAAO,KAAK,OAEb,CAQA,WAAYmC,EAAQ,CAEnB,OAAOA,IAAQA,EAAQ,CAAC,GAEnB,KAAK,aAAe,IAExB,KAAK,WAAW,EAChB,KAAK,QAAUA,EAAM,MAAM,EAC3B,KAAK,QAAQ,GAIb,KAAK,QAAUA,EAAM,MAAM,EAIrB,IAER,CAQA,UAAWA,EAAQ,CAElB,YAAK,OAASA,EAET,KAAK,YAAc,IAAQ,KAAK,OAAO,SAAW,QAEtD,KAAK,OAAO,OAAO,gBAAiB,KAAK,OAAQ,KAAK,QAAQ,YAAa,GAAK,EAI1E,IAER,CAOA,WAAY,CAEX,OAAO,KAAK,MAEb,CAOA,WAAY,CAEX,OAAO,KAAK,WAAW,EAAG,CAAE,CAE7B,CAQA,UAAW8hE,EAAS,CAEnB,OAAO,KAAK,WAAYA,EAAS,CAAEA,CAAO,EAAI,CAAC,CAAE,CAElD,CAUA,gBAAiB9hE,EAAQ,CAExB,GAAK,KAAK,qBAAuB,GAAQ,CAExClB,GAAM,4CAA6C,EACnD,MAED,CAEA,YAAK,aAAekB,EAEf,KAAK,YAAc,IAEvB,KAAK,OAAO,aAAa,gBAAiB,KAAK,aAAc,KAAK,QAAQ,YAAa,GAAK,EAItF,IAER,CAOA,iBAAkB,CAEjB,OAAO,KAAK,YAEb,CAKA,SAAU,CAET,KAAK,UAAY,GACjB,KAAK,UAAY,CAElB,CASA,SAAU,CAET,OAAK,KAAK,qBAAuB,IAEhClB,GAAM,4CAA6C,EAC5C,IAID,KAAK,IAEb,CAUA,QAASkB,EAAQ,CAEhB,GAAK,KAAK,qBAAuB,GAAQ,CAExClB,GAAM,4CAA6C,EACnD,MAED,CAEA,YAAK,KAAOkB,EAEP,KAAK,YAAc,KAEvB,KAAK,OAAO,KAAO,KAAK,MAIlB,IAER,CASA,aAAcA,EAAQ,CAErB,YAAK,UAAYA,EAEV,IAER,CASA,WAAYA,EAAQ,CAEnB,YAAK,QAAUA,EAER,IAER,CAOA,WAAY,CAEX,OAAO,KAAK,KAAK,KAAK,KAEvB,CAQA,UAAWA,EAAQ,CAElB,YAAK,KAAK,KAAK,gBAAiBA,EAAO,KAAK,QAAQ,YAAa,GAAK,EAE/D,IAER,CAEA,KAAMgqC,EAAQ/xB,EAAY,CAIzB,OAFA,MAAM,KAAM+xB,EAAQ/xB,CAAU,EAEzB+xB,EAAO,aAAe,UAE1BlrC,GAAM,4CAA6C,EAE5C,OAIR,KAAK,SAAWkrC,EAAO,SAEvB,KAAK,OAASA,EAAO,OACrB,KAAK,OAASA,EAAO,OACrB,KAAK,KAAOA,EAAO,KACnB,KAAK,UAAYA,EAAO,UACxB,KAAK,QAAUA,EAAO,QACtB,KAAK,OAASA,EAAO,OACrB,KAAK,SAAWA,EAAO,SACvB,KAAK,aAAeA,EAAO,aAC3B,KAAK,mBAAqBA,EAAO,mBACjC,KAAK,WAAaA,EAAO,WAEzB,KAAK,QAAUA,EAAO,QAAQ,MAAM,EAE7B,KAER,CAEA,MAAO/xB,EAAY,CAElB,OAAO,IAAI,KAAK,YAAa,KAAK,QAAS,EAAE,KAAM,KAAMA,CAAU,CAEpE,CAED,EAEMmkB,GAA0B,IAAI7zB,EAC9B8zB,GAA4B,IAAIrlB,GAChCslB,IAAuB,IAAI/zB,EAC3Bg0B,GAA6B,IAAIh0B,EAgCjCi0B,GAAN,cAA8BL,EAAM,CAOnC,YAAa+E,EAAW,CAEvB,MAAOA,CAAS,EAShB,KAAK,OAAS,KAAK,QAAQ,aAAa,EACxC,KAAK,OAAO,aAAe,OAC3B,KAAK,OAAO,QAAS,KAAK,IAAK,CAEhC,CAEA,SAAU,CAET,aAAM,QAAQ,EAEd,KAAK,OAAO,QAAS,KAAK,IAAK,EAExB,IAER,CAEA,YAAa,CAEZ,aAAM,WAAW,EAEjB,KAAK,OAAO,WAAY,KAAK,IAAK,EAE3B,IAER,CAEA,WAAY,CAEX,OAAO,KAAK,MAEb,CAOA,gBAAiB,CAEhB,OAAO,KAAK,OAAO,WAEpB,CAUA,eAAgBlhC,EAAQ,CAEvB,YAAK,OAAO,YAAcA,EAEnB,IAER,CAOA,kBAAmB,CAElB,OAAO,KAAK,OAAO,aAEpB,CAQA,iBAAkBA,EAAQ,CAEzB,YAAK,OAAO,cAAgBA,EAErB,IAER,CAOA,kBAAmB,CAElB,OAAO,KAAK,OAAO,aAEpB,CAYA,iBAAkBA,EAAQ,CAEzB,YAAK,OAAO,cAAgBA,EAErB,IAER,CAOA,gBAAiB,CAEhB,OAAO,KAAK,OAAO,WAEpB,CAWA,eAAgBA,EAAQ,CAEvB,YAAK,OAAO,YAAcA,EAEnB,IAER,CAUA,mBAAoB+hE,EAAgBC,EAAgBC,EAAgB,CAEnE,YAAK,OAAO,eAAiBF,EAC7B,KAAK,OAAO,eAAiBC,EAC7B,KAAK,OAAO,cAAgBC,EAErB,IAER,CAEA,kBAAmB/vB,EAAQ,CAI1B,GAFA,MAAM,kBAAmBA,CAAM,EAE1B,KAAK,qBAAuB,IAAQ,KAAK,YAAc,GAAQ,OAEpE,KAAK,YAAY,UAAW9V,GAAWC,GAAaC,GAAO,EAE3DC,GAAa,IAAK,EAAG,EAAG,CAAE,EAAE,gBAAiBF,EAAY,EAEzD,IAAM6lC,EAAS,KAAK,OAEpB,GAAKA,EAAO,UAAY,CAIvB,IAAM1J,EAAU,KAAK,QAAQ,YAAc,KAAK,SAAS,UAEzD0J,EAAO,UAAU,wBAAyB9lC,GAAU,EAAGo8B,CAAQ,EAC/D0J,EAAO,UAAU,wBAAyB9lC,GAAU,EAAGo8B,CAAQ,EAC/D0J,EAAO,UAAU,wBAAyB9lC,GAAU,EAAGo8B,CAAQ,EAC/D0J,EAAO,aAAa,wBAAyB3lC,GAAa,EAAGi8B,CAAQ,EACrE0J,EAAO,aAAa,wBAAyB3lC,GAAa,EAAGi8B,CAAQ,EACrE0J,EAAO,aAAa,wBAAyB3lC,GAAa,EAAGi8B,CAAQ,CAEtE,MAEC0J,EAAO,YAAa9lC,GAAU,EAAGA,GAAU,EAAGA,GAAU,CAAE,EAC1D8lC,EAAO,eAAgB3lC,GAAa,EAAGA,GAAa,EAAGA,GAAa,CAAE,CAIxE,CAED,EA6BME,GAAN,KAAoB,CAQnB,YAAa0lC,EAAOC,EAAU,KAAO,CAOpC,KAAK,SAAWD,EAAM,QAAQ,eAAe,EAC7C,KAAK,SAAS,QAAUC,EAOxB,KAAK,KAAO,IAAI,WAAY,KAAK,SAAS,iBAAkB,EAE5DD,EAAM,UAAU,EAAE,QAAS,KAAK,QAAS,CAE1C,CAYA,kBAAmB,CAElB,YAAK,SAAS,qBAAsB,KAAK,IAAK,EAEvC,KAAK,IAEb,CAOA,qBAAsB,CAErB,IAAIniE,EAAQ,EACNsN,EAAO,KAAK,iBAAiB,EAEnC,QAAUzP,EAAI,EAAGA,EAAIyP,EAAK,OAAQzP,IAEjCmC,GAASsN,EAAMzP,CAAE,EAIlB,OAAOmC,EAAQsN,EAAK,MAErB,CAED,EAKMovB,GAAN,KAAoB,CASnB,YAAa2lC,EAAS/qD,EAAU1B,EAAY,CAO3C,KAAK,QAAUysD,EAOf,KAAK,UAAYzsD,EAEjB,IAAI0sD,EACHC,EACAC,EAkBD,OAASlrD,EAAW,CAEnB,IAAK,aACJgrD,EAAc,KAAK,OACnBC,EAAsB,KAAK,eAC3BC,EAAc,KAAK,+BAEnB,KAAK,OAAS,IAAI,aAAc5sD,EAAY,CAAE,EAC9C,KAAK,WAAa,EAClB,MAED,IAAK,SACL,IAAK,OACJ0sD,EAAc,KAAK,QAInBC,EAAsB,KAAK,QAE3BC,EAAc,KAAK,0BAEnB,KAAK,OAAS,IAAI,MAAO5sD,EAAY,CAAE,EACvC,MAED,QACC0sD,EAAc,KAAK,MACnBC,EAAsB,KAAK,cAC3BC,EAAc,KAAK,4BAEnB,KAAK,OAAS,IAAI,aAAc5sD,EAAY,CAAE,CAEhD,CAEA,KAAK,iBAAmB0sD,EACxB,KAAK,yBAA2BC,EAChC,KAAK,aAAeC,EACpB,KAAK,WAAa,EAClB,KAAK,UAAY,EAQjB,KAAK,iBAAmB,EAQxB,KAAK,yBAA2B,EAQhC,KAAK,SAAW,EAQhB,KAAK,eAAiB,CAEvB,CAQA,WAAYC,EAAWtkB,EAAS,CAK/B,IAAMngD,EAAS,KAAK,OACnB4W,EAAS,KAAK,UACdotB,EAASygC,EAAY7tD,EAASA,EAE3B8tD,EAAgB,KAAK,iBAEzB,GAAKA,IAAkB,EAAI,CAI1B,QAAU7kE,EAAI,EAAGA,IAAM+W,EAAQ,EAAG/W,EAEjCG,EAAQgkC,EAASnkC,CAAE,EAAIG,EAAQH,CAAE,EAIlC6kE,EAAgBvkB,CAEjB,KAAO,CAINukB,GAAiBvkB,EACjB,IAAMwkB,EAAMxkB,EAASukB,EACrB,KAAK,iBAAkB1kE,EAAQgkC,EAAQ,EAAG2gC,EAAK/tD,CAAO,CAEvD,CAEA,KAAK,iBAAmB8tD,CAEzB,CAOA,mBAAoBvkB,EAAS,CAE5B,IAAMngD,EAAS,KAAK,OACnB4W,EAAS,KAAK,UACdotB,EAASptB,EAAS,KAAK,UAEnB,KAAK,2BAA6B,GAItC,KAAK,aAAa,EAMnB,KAAK,yBAA0B5W,EAAQgkC,EAAQ,EAAGmc,EAAQvpC,CAAO,EACjE,KAAK,0BAA4BupC,CAElC,CAOA,MAAOskB,EAAY,CAElB,IAAM7tD,EAAS,KAAK,UACnB5W,EAAS,KAAK,OACdgkC,EAASygC,EAAY7tD,EAASA,EAE9BupC,EAAS,KAAK,iBACdykB,EAAiB,KAAK,yBAEtBP,EAAU,KAAK,QAKhB,GAHA,KAAK,iBAAmB,EACxB,KAAK,yBAA2B,EAE3BlkB,EAAS,EAAI,CAIjB,IAAM0kB,EAAsBjuD,EAAS,KAAK,WAE1C,KAAK,iBACJ5W,EAAQgkC,EAAQ6gC,EAAqB,EAAI1kB,EAAQvpC,CAAO,CAE1D,CAEKguD,EAAiB,GAIrB,KAAK,yBAA0B5kE,EAAQgkC,EAAQ,KAAK,UAAYptB,EAAQ,EAAGA,CAAO,EAInF,QAAU/W,EAAI+W,EAAQtO,EAAIsO,EAASA,EAAQ/W,IAAMyI,EAAG,EAAGzI,EAEtD,GAAKG,EAAQH,CAAE,IAAMG,EAAQH,EAAI+W,CAAO,EAAI,CAI3CytD,EAAQ,SAAUrkE,EAAQgkC,CAAO,EACjC,KAED,CAIF,CAMA,mBAAoB,CAEnB,IAAMqgC,EAAU,KAAK,QAEfrkE,EAAS,KAAK,OACnB4W,EAAS,KAAK,UAEdiuD,EAAsBjuD,EAAS,KAAK,WAErCytD,EAAQ,SAAUrkE,EAAQ6kE,CAAoB,EAG9C,QAAUhlE,EAAI+W,EAAQtO,EAAIu8D,EAAqBhlE,IAAMyI,EAAG,EAAGzI,EAE1DG,EAAQH,CAAE,EAAIG,EAAQ6kE,EAAwBhlE,EAAI+W,CAAS,EAK5D,KAAK,aAAa,EAElB,KAAK,iBAAmB,EACxB,KAAK,yBAA2B,CAEjC,CAKA,sBAAuB,CAEtB,IAAMiuD,EAAsB,KAAK,UAAY,EAC7C,KAAK,QAAQ,SAAU,KAAK,OAAQA,CAAoB,CAEzD,CAIA,6BAA8B,CAE7B,IAAMhsD,EAAa,KAAK,UAAY,KAAK,UACnCC,EAAWD,EAAa,KAAK,UAEnC,QAAUhZ,EAAIgZ,EAAYhZ,EAAIiZ,EAAUjZ,IAEvC,KAAK,OAAQA,CAAE,EAAI,CAIrB,CAEA,gCAAiC,CAEhC,KAAK,4BAA4B,EACjC,KAAK,OAAQ,KAAK,UAAY,KAAK,UAAY,CAAE,EAAI,CAEtD,CAEA,2BAA4B,CAE3B,IAAMgZ,EAAa,KAAK,WAAa,KAAK,UACpCisD,EAAc,KAAK,UAAY,KAAK,UAE1C,QAAUjlE,EAAI,EAAGA,EAAI,KAAK,UAAWA,IAEpC,KAAK,OAAQilE,EAAcjlE,CAAE,EAAI,KAAK,OAAQgZ,EAAahZ,CAAE,CAI/D,CAKA,QAASG,EAAQ8W,EAAWC,EAAWhT,EAAG6S,EAAS,CAElD,GAAK7S,GAAK,GAET,QAAUlE,EAAI,EAAGA,IAAM+W,EAAQ,EAAG/W,EAEjCG,EAAQ8W,EAAYjX,CAAE,EAAIG,EAAQ+W,EAAYlX,CAAE,CAMnD,CAEA,OAAQG,EAAQ8W,EAAWC,EAAWhT,EAAI,CAEzCiV,GAAW,UAAWhZ,EAAQ8W,EAAW9W,EAAQ8W,EAAW9W,EAAQ+W,EAAWhT,CAAE,CAElF,CAEA,eAAgB/D,EAAQ8W,EAAWC,EAAWhT,EAAG6S,EAAS,CAEzD,IAAMmuD,EAAa,KAAK,WAAanuD,EAGrCoC,GAAW,wBAAyBhZ,EAAQ+kE,EAAY/kE,EAAQ8W,EAAW9W,EAAQ+W,CAAU,EAG7FiC,GAAW,UAAWhZ,EAAQ8W,EAAW9W,EAAQ8W,EAAW9W,EAAQ+kE,EAAYhhE,CAAE,CAEnF,CAEA,MAAO/D,EAAQ8W,EAAWC,EAAWhT,EAAG6S,EAAS,CAEhD,IAAM/S,EAAI,EAAIE,EAEd,QAAUlE,EAAI,EAAGA,IAAM+W,EAAQ,EAAG/W,EAAI,CAErC,IAAM4H,EAAIqP,EAAYjX,EAEtBG,EAAQyH,CAAE,EAAIzH,EAAQyH,CAAE,EAAI5D,EAAI7D,EAAQ+W,EAAYlX,CAAE,EAAIkE,CAE3D,CAED,CAEA,cAAe/D,EAAQ8W,EAAWC,EAAWhT,EAAG6S,EAAS,CAExD,QAAU/W,EAAI,EAAGA,IAAM+W,EAAQ,EAAG/W,EAAI,CAErC,IAAM4H,EAAIqP,EAAYjX,EAEtBG,EAAQyH,CAAE,EAAIzH,EAAQyH,CAAE,EAAIzH,EAAQ+W,EAAYlX,CAAE,EAAIkE,CAEvD,CAED,CAED,EAGM46B,GAAqB,gBACrBC,IAAc,IAAI,OAAQ,IAAMD,GAAqB,IAAK,GAAI,EAK9DE,GAAY,KAAOF,GAAqB,IACxCG,IAAiB,KAAOH,GAAmB,QAAS,MAAO,EAAG,EAAI,IAIlEI,IAA6B,kBAAkB,OAAO,QAAS,KAAMF,EAAU,EAG/EG,IAAwB,WAAW,OAAO,QAAS,OAAQF,GAAe,EAI1EG,IAA0B,4BAA4B,OAAO,QAAS,KAAMJ,EAAU,EAItFK,IAA4B,uBAAuB,OAAO,QAAS,KAAML,EAAU,EAEnFM,IAAW,IAAI,OAAQ,IAE1BJ,IACAC,IACAC,IACAC,IACA,GACH,EAEME,IAAwB,CAAE,WAAY,YAAa,QAAS,KAAM,EAElEC,GAAN,KAAgB,CAEf,YAAa2lC,EAAanN,EAAMoN,EAAqB,CAEpD,IAAMC,EAAaD,GAAsB3lC,GAAgB,eAAgBu4B,CAAK,EAE9E,KAAK,aAAemN,EACpB,KAAK,UAAYA,EAAY,WAAYnN,EAAMqN,CAAW,CAE3D,CAEA,SAAUtlE,EAAOokC,EAAS,CAEzB,KAAK,KAAK,EAEV,IAAMmhC,EAAkB,KAAK,aAAa,gBACzCd,EAAU,KAAK,UAAWc,CAAgB,EAGtCd,IAAY,QAAYA,EAAQ,SAAUzkE,EAAOokC,CAAO,CAE9D,CAEA,SAAUpkC,EAAOokC,EAAS,CAEzB,IAAMohC,EAAW,KAAK,UAEtB,QAAUvlE,EAAI,KAAK,aAAa,gBAAiBuC,EAAIgjE,EAAS,OAAQvlE,IAAMuC,EAAG,EAAGvC,EAEjFulE,EAAUvlE,CAAE,EAAE,SAAUD,EAAOokC,CAAO,CAIxC,CAEA,MAAO,CAEN,IAAMohC,EAAW,KAAK,UAEtB,QAAUvlE,EAAI,KAAK,aAAa,gBAAiB,EAAIulE,EAAS,OAAQvlE,IAAM,EAAG,EAAGA,EAEjFulE,EAAUvlE,CAAE,EAAE,KAAK,CAIrB,CAEA,QAAS,CAER,IAAMulE,EAAW,KAAK,UAEtB,QAAUvlE,EAAI,KAAK,aAAa,gBAAiB,EAAIulE,EAAS,OAAQvlE,IAAM,EAAG,EAAGA,EAEjFulE,EAAUvlE,CAAE,EAAE,OAAO,CAIvB,CAED,EAYMy/B,GAAN,MAAM+lC,CAAgB,CASrB,YAAaC,EAAUzN,EAAMqN,EAAa,CAOzC,KAAK,KAAOrN,EAOZ,KAAK,WAAaqN,GAAcG,EAAgB,eAAgBxN,CAAK,EAOrE,KAAK,KAAOwN,EAAgB,SAAUC,EAAU,KAAK,WAAW,QAAS,EAOzE,KAAK,SAAWA,EAGhB,KAAK,SAAW,KAAK,kBACrB,KAAK,SAAW,KAAK,iBAEtB,CAYA,OAAO,OAAQC,EAAM1N,EAAMqN,EAAa,CAEvC,OAASK,GAAQA,EAAK,uBAMd,IAAIF,EAAgB,UAAWE,EAAM1N,EAAMqN,CAAW,EAJtD,IAAIG,EAAiBE,EAAM1N,EAAMqN,CAAW,CAQrD,CASA,OAAO,iBAAkB9kE,EAAO,CAE/B,OAAOA,EAAK,QAAS,MAAO,GAAI,EAAE,QAASw+B,IAAa,EAAG,CAE5D,CAoBA,OAAO,eAAgB+9B,EAAY,CAElC,IAAM6I,EAAUrmC,IAAS,KAAMw9B,CAAU,EAEzC,GAAK6I,IAAY,KAEhB,MAAM,IAAI,MAAO,4CAA8C7I,CAAU,EAI1E,IAAM8I,EAAU,CAEf,SAAUD,EAAS,CAAE,EACrB,WAAYA,EAAS,CAAE,EACvB,YAAaA,EAAS,CAAE,EACxB,aAAcA,EAAS,CAAE,EACzB,cAAeA,EAAS,CAAE,CAC3B,EAEME,EAAUD,EAAQ,UAAYA,EAAQ,SAAS,YAAa,GAAI,EAEtE,GAAKC,IAAY,QAAaA,IAAY,GAAK,CAE9C,IAAMC,EAAaF,EAAQ,SAAS,UAAWC,EAAU,CAAE,EAMtDtmC,IAAsB,QAASumC,CAAW,IAAM,KAEpDF,EAAQ,SAAWA,EAAQ,SAAS,UAAW,EAAGC,CAAQ,EAC1DD,EAAQ,WAAaE,EAIvB,CAEA,GAAKF,EAAQ,eAAiB,MAAQA,EAAQ,aAAa,SAAW,EAErE,MAAM,IAAI,MAAO,+DAAiE9I,CAAU,EAI7F,OAAO8I,CAER,CAWA,OAAO,SAAUF,EAAMK,EAAW,CAEjC,GAAKA,IAAa,QAAaA,IAAa,IAAMA,IAAa,KAAOA,IAAa,IAAMA,IAAaL,EAAK,MAAQK,IAAaL,EAAK,KAEpI,OAAOA,EAKR,GAAKA,EAAK,SAAW,CAEpB,IAAM9kB,EAAO8kB,EAAK,SAAS,cAAeK,CAAS,EAEnD,GAAKnlB,IAAS,OAEb,OAAOA,CAIT,CAGA,GAAK8kB,EAAK,SAAW,CAEpB,IAAMM,EAAoB,SAAW1rD,EAAW,CAE/C,QAAUta,EAAI,EAAGA,EAAIsa,EAAS,OAAQta,IAAO,CAE5C,IAAMimE,EAAY3rD,EAAUta,CAAE,EAE9B,GAAKimE,EAAU,OAASF,GAAYE,EAAU,OAASF,EAEtD,OAAOE,EAIR,IAAMhzD,EAAS+yD,EAAmBC,EAAU,QAAS,EAErD,GAAKhzD,EAAS,OAAOA,CAEtB,CAEA,OAAO,IAER,EAEMizD,EAAcF,EAAmBN,EAAK,QAAS,EAErD,GAAKQ,EAEJ,OAAOA,CAIT,CAEA,OAAO,IAER,CAGA,uBAAwB,CAAC,CACzB,uBAAwB,CAAC,CAIzB,iBAAkB/lE,EAAQgkC,EAAS,CAElChkC,EAAQgkC,CAAO,EAAI,KAAK,aAAc,KAAK,YAAa,CAEzD,CAEA,gBAAiBhkC,EAAQgkC,EAAS,CAEjC,IAAMgI,EAAS,KAAK,iBAEpB,QAAUnsC,EAAI,EAAGuC,EAAI4pC,EAAO,OAAQnsC,IAAMuC,EAAG,EAAGvC,EAE/CG,EAAQgkC,GAAU,EAAIgI,EAAQnsC,CAAE,CAIlC,CAEA,uBAAwBG,EAAQgkC,EAAS,CAExChkC,EAAQgkC,CAAO,EAAI,KAAK,iBAAkB,KAAK,aAAc,CAE9D,CAEA,kBAAmBhkC,EAAQgkC,EAAS,CAEnC,KAAK,iBAAiB,QAAShkC,EAAQgkC,CAAO,CAE/C,CAIA,iBAAkBhkC,EAAQgkC,EAAS,CAElC,KAAK,aAAc,KAAK,YAAa,EAAIhkC,EAAQgkC,CAAO,CAEzD,CAEA,gCAAiChkC,EAAQgkC,EAAS,CAEjD,KAAK,aAAc,KAAK,YAAa,EAAIhkC,EAAQgkC,CAAO,EACxD,KAAK,aAAa,YAAc,EAEjC,CAEA,2CAA4ChkC,EAAQgkC,EAAS,CAE5D,KAAK,aAAc,KAAK,YAAa,EAAIhkC,EAAQgkC,CAAO,EACxD,KAAK,aAAa,uBAAyB,EAE5C,CAIA,gBAAiBhkC,EAAQgkC,EAAS,CAEjC,IAAMgiC,EAAO,KAAK,iBAElB,QAAUnmE,EAAI,EAAGuC,EAAI4jE,EAAK,OAAQnmE,IAAMuC,EAAG,EAAGvC,EAE7CmmE,EAAMnmE,CAAE,EAAIG,EAAQgkC,GAAU,CAIhC,CAEA,+BAAgChkC,EAAQgkC,EAAS,CAEhD,IAAMgiC,EAAO,KAAK,iBAElB,QAAUnmE,EAAI,EAAGuC,EAAI4jE,EAAK,OAAQnmE,IAAMuC,EAAG,EAAGvC,EAE7CmmE,EAAMnmE,CAAE,EAAIG,EAAQgkC,GAAU,EAI/B,KAAK,aAAa,YAAc,EAEjC,CAEA,0CAA2ChkC,EAAQgkC,EAAS,CAE3D,IAAMgiC,EAAO,KAAK,iBAElB,QAAUnmE,EAAI,EAAGuC,EAAI4jE,EAAK,OAAQnmE,IAAMuC,EAAG,EAAGvC,EAE7CmmE,EAAMnmE,CAAE,EAAIG,EAAQgkC,GAAU,EAI/B,KAAK,aAAa,uBAAyB,EAE5C,CAIA,uBAAwBhkC,EAAQgkC,EAAS,CAExC,KAAK,iBAAkB,KAAK,aAAc,EAAIhkC,EAAQgkC,CAAO,CAE9D,CAEA,sCAAuChkC,EAAQgkC,EAAS,CAEvD,KAAK,iBAAkB,KAAK,aAAc,EAAIhkC,EAAQgkC,CAAO,EAC7D,KAAK,aAAa,YAAc,EAEjC,CAEA,iDAAkDhkC,EAAQgkC,EAAS,CAElE,KAAK,iBAAkB,KAAK,aAAc,EAAIhkC,EAAQgkC,CAAO,EAC7D,KAAK,aAAa,uBAAyB,EAE5C,CAIA,oBAAqBhkC,EAAQgkC,EAAS,CAErC,KAAK,iBAAiB,UAAWhkC,EAAQgkC,CAAO,CAEjD,CAEA,mCAAoChkC,EAAQgkC,EAAS,CAEpD,KAAK,iBAAiB,UAAWhkC,EAAQgkC,CAAO,EAChD,KAAK,aAAa,YAAc,EAEjC,CAEA,8CAA+ChkC,EAAQgkC,EAAS,CAE/D,KAAK,iBAAiB,UAAWhkC,EAAQgkC,CAAO,EAChD,KAAK,aAAa,uBAAyB,EAE5C,CAEA,kBAAmBiiC,EAAajiC,EAAS,CAExC,KAAK,KAAK,EACV,KAAK,SAAUiiC,EAAajiC,CAAO,CAEpC,CAEA,kBAAmBkiC,EAAaliC,EAAS,CAExC,KAAK,KAAK,EACV,KAAK,SAAUkiC,EAAaliC,CAAO,CAEpC,CAKA,MAAO,CAEN,IAAImiC,EAAe,KAAK,KAClBjB,EAAa,KAAK,WAElBS,EAAaT,EAAW,WACxBrI,EAAeqI,EAAW,aAC5BkB,EAAgBlB,EAAW,cAe/B,GAbOiB,IAENA,EAAed,EAAgB,SAAU,KAAK,SAAUH,EAAW,QAAS,EAE5E,KAAK,KAAOiB,GAKb,KAAK,SAAW,KAAK,sBACrB,KAAK,SAAW,KAAK,sBAGhB,CAAEA,EAAe,CAErBrlE,GAAM,oDAAsD,KAAK,KAAO,GAAI,EAC5E,MAED,CAEA,GAAK6kE,EAAa,CAEjB,IAAIU,EAAcnB,EAAW,YAG7B,OAASS,EAAa,CAErB,IAAK,YAEJ,GAAK,CAAEQ,EAAa,SAAW,CAE9BplE,GAAO,8EAA+E,IAAK,EAC3F,MAED,CAEA,GAAK,CAAEolE,EAAa,SAAS,UAAY,CAExCplE,GAAO,wGAAyG,IAAK,EACrH,MAED,CAEAolE,EAAeA,EAAa,SAAS,UAErC,MAED,IAAK,QAEJ,GAAK,CAAEA,EAAa,SAAW,CAE9BplE,GAAO,2EAA4E,IAAK,EACxF,MAED,CAKAolE,EAAeA,EAAa,SAAS,MAGrC,QAAUtmE,EAAI,EAAGA,EAAIsmE,EAAa,OAAQtmE,IAEzC,GAAKsmE,EAActmE,CAAE,EAAE,OAASwmE,EAAc,CAE7CA,EAAcxmE,EACd,KAED,CAID,MAED,IAAK,MAEJ,GAAK,QAASsmE,EAAe,CAE5BA,EAAeA,EAAa,IAC5B,KAED,CAEA,GAAK,CAAEA,EAAa,SAAW,CAE9BplE,GAAO,8EAA+E,IAAK,EAC3F,MAED,CAEA,GAAK,CAAEolE,EAAa,SAAS,IAAM,CAElCplE,GAAO,sFAAuF,IAAK,EACnG,MAED,CAEAolE,EAAeA,EAAa,SAAS,IACrC,MAED,QAEC,GAAKA,EAAcR,CAAW,IAAM,OAAY,CAE/C5kE,GAAO,iEAAkE,IAAK,EAC9E,MAED,CAEAolE,EAAeA,EAAcR,CAAW,CAE1C,CAGA,GAAKU,IAAgB,OAAY,CAEhC,GAAKF,EAAcE,CAAY,IAAM,OAAY,CAEhDtlE,GAAO,kFAAmF,KAAMolE,CAAa,EAC7G,MAED,CAEAA,EAAeA,EAAcE,CAAY,CAE1C,CAED,CAGA,IAAMC,EAAeH,EAActJ,CAAa,EAEhD,GAAKyJ,IAAiB,OAAY,CAEjC,IAAMV,EAAWV,EAAW,SAE5BnkE,GAAO,yDAA2D6kE,EACjE,IAAM/I,EAAe,wBAA0BsJ,CAAa,EAC7D,MAED,CAGA,IAAII,EAAa,KAAK,WAAW,KAEjC,KAAK,aAAeJ,EAEfA,EAAa,aAAe,GAEhCI,EAAa,KAAK,WAAW,YAElBJ,EAAa,aAAe,KAEvCI,EAAa,KAAK,WAAW,wBAK9B,IAAIC,EAAc,KAAK,YAAY,OAEnC,GAAKJ,IAAkB,OAAY,CAIlC,GAAKvJ,IAAiB,wBAA0B,CAK/C,GAAK,CAAEsJ,EAAa,SAAW,CAE9BplE,GAAO,gGAAiG,IAAK,EAC7G,MAED,CAEA,GAAK,CAAEolE,EAAa,SAAS,gBAAkB,CAE9CplE,GAAO,gHAAiH,IAAK,EAC7H,MAED,CAEKolE,EAAa,sBAAuBC,CAAc,IAAM,SAE5DA,EAAgBD,EAAa,sBAAuBC,CAAc,EAIpE,CAEAI,EAAc,KAAK,YAAY,aAE/B,KAAK,iBAAmBF,EACxB,KAAK,cAAgBF,CAEtB,MAAYE,EAAa,YAAc,QAAaA,EAAa,UAAY,QAI5EE,EAAc,KAAK,YAAY,eAE/B,KAAK,iBAAmBF,GAEb,MAAM,QAASA,CAAa,GAEvCE,EAAc,KAAK,YAAY,YAE/B,KAAK,iBAAmBF,GAIxB,KAAK,aAAezJ,EAKrB,KAAK,SAAW,KAAK,oBAAqB2J,CAAY,EACtD,KAAK,SAAW,KAAK,iCAAkCA,CAAY,EAAGD,CAAW,CAElF,CAKA,QAAS,CAER,KAAK,KAAO,KAIZ,KAAK,SAAW,KAAK,kBACrB,KAAK,SAAW,KAAK,iBAEtB,CAED,EAEAjnC,GAAgB,UAAYD,GAE5BC,GAAgB,UAAU,YAAc,CACvC,OAAQ,EACR,YAAa,EACb,aAAc,EACd,eAAgB,CACjB,EAEAA,GAAgB,UAAU,WAAa,CACtC,KAAM,EACN,YAAa,EACb,uBAAwB,CACzB,EAEAA,GAAgB,UAAU,oBAAsB,CAE/CA,GAAgB,UAAU,iBAC1BA,GAAgB,UAAU,gBAC1BA,GAAgB,UAAU,uBAC1BA,GAAgB,UAAU,iBAE3B,EAEAA,GAAgB,UAAU,iCAAmC,CAE5D,CAECA,GAAgB,UAAU,iBAC1BA,GAAgB,UAAU,gCAC1BA,GAAgB,UAAU,0CAE3B,EAAG,CAIFA,GAAgB,UAAU,gBAC1BA,GAAgB,UAAU,+BAC1BA,GAAgB,UAAU,yCAE3B,EAAG,CAGFA,GAAgB,UAAU,uBAC1BA,GAAgB,UAAU,sCAC1BA,GAAgB,UAAU,gDAE3B,EAAG,CAGFA,GAAgB,UAAU,oBAC1BA,GAAgB,UAAU,mCAC1BA,GAAgB,UAAU,6CAE3B,CAED,EAsBMC,GAAN,KAA2B,CAO1B,aAAc,CASb,KAAK,uBAAyB,GAQ9B,KAAK,KAAO99B,GAAa,EAGzB,KAAK,SAAW,MAAM,UAAU,MAAM,KAAM,SAAU,EAEtD,KAAK,gBAAkB,EAGvB,IAAMu4C,EAAU,CAAC,EACjB,KAAK,eAAiBA,EAEtB,QAAUn6C,EAAI,EAAGuC,EAAI,UAAU,OAAQvC,IAAMuC,EAAG,EAAGvC,EAElDm6C,EAAS,UAAWn6C,CAAE,EAAE,IAAK,EAAIA,EAIlC,KAAK,OAAS,CAAC,EACf,KAAK,aAAe,CAAC,EACrB,KAAK,UAAY,CAAC,EAClB,KAAK,uBAAyB,CAAC,EAE/B,IAAMy7C,EAAQ,KAEd,KAAK,MAAQ,CAEZ,QAAS,CACR,IAAI,OAAQ,CAEX,OAAOA,EAAM,SAAS,MAEvB,EACA,IAAI,OAAQ,CAEX,OAAO,KAAK,MAAQA,EAAM,eAE3B,CACD,EACA,IAAI,mBAAoB,CAEvB,OAAOA,EAAM,UAAU,MAExB,CAED,CAED,CAOA,KAAM,CAEL,IAAMmrB,EAAU,KAAK,SACpBC,EAAgB,KAAK,eACrBC,EAAQ,KAAK,OACbC,EAAc,KAAK,aACnBxB,EAAW,KAAK,UAChByB,EAAYzB,EAAS,OAElB0B,EACHC,EAAWN,EAAQ,OACnBO,EAAiB,KAAK,gBAEvB,QAAUnnE,EAAI,EAAGuC,EAAI,UAAU,OAAQvC,IAAMuC,EAAG,EAAGvC,EAAI,CAEtD,IAAMmJ,EAAS,UAAWnJ,CAAE,EAC3B+gD,EAAO53C,EAAO,KACXiE,EAAQy5D,EAAe9lB,CAAK,EAEhC,GAAK3zC,IAAU,OAAY,CAI1BA,EAAQ85D,IACRL,EAAe9lB,CAAK,EAAI3zC,EACxBw5D,EAAQ,KAAMz9D,CAAO,EAIrB,QAAUvB,EAAI,EAAGpF,EAAIwkE,EAAWp/D,IAAMpF,EAAG,EAAGoF,EAE3C29D,EAAU39D,CAAE,EAAE,KAAM,IAAI63B,GAAiBt2B,EAAQ29D,EAAOl/D,CAAE,EAAGm/D,EAAan/D,CAAE,CAAE,CAAE,CAIlF,SAAYwF,EAAQ+5D,EAAiB,CAEpCF,EAAcL,EAASx5D,CAAM,EAI7B,IAAMg6D,EAAmB,EAAGD,EAC3BE,EAAmBT,EAASQ,CAAiB,EAE9CP,EAAeQ,EAAiB,IAAK,EAAIj6D,EACzCw5D,EAASx5D,CAAM,EAAIi6D,EAEnBR,EAAe9lB,CAAK,EAAIqmB,EACxBR,EAASQ,CAAiB,EAAIj+D,EAI9B,QAAUvB,EAAI,EAAGpF,EAAIwkE,EAAWp/D,IAAMpF,EAAG,EAAGoF,EAAI,CAE/C,IAAM0/D,EAAkB/B,EAAU39D,CAAE,EACnC2/D,EAAaD,EAAiBF,CAAiB,EAE5C5C,EAAU8C,EAAiBl6D,CAAM,EAErCk6D,EAAiBl6D,CAAM,EAAIm6D,EAEtB/C,IAAY,SAMhBA,EAAU,IAAI/kC,GAAiBt2B,EAAQ29D,EAAOl/D,CAAE,EAAGm/D,EAAan/D,CAAE,CAAE,GAIrE0/D,EAAiBF,CAAiB,EAAI5C,CAEvC,CAED,MAAYoC,EAASx5D,CAAM,IAAM65D,GAEhC/lE,GAAO,8IAC8E,CAIvF,CAEA,KAAK,gBAAkBimE,CAExB,CAOA,QAAS,CAER,IAAMP,EAAU,KAAK,SACpBC,EAAgB,KAAK,eACrBtB,EAAW,KAAK,UAChByB,EAAYzB,EAAS,OAElB4B,EAAiB,KAAK,gBAE1B,QAAUnnE,EAAI,EAAGuC,EAAI,UAAU,OAAQvC,IAAMuC,EAAG,EAAGvC,EAAI,CAEtD,IAAMmJ,EAAS,UAAWnJ,CAAE,EAC3B+gD,EAAO53C,EAAO,KACdiE,EAAQy5D,EAAe9lB,CAAK,EAE7B,GAAK3zC,IAAU,QAAaA,GAAS+5D,EAAiB,CAIrD,IAAMK,EAAkBL,IACvBM,EAAoBb,EAASY,CAAgB,EAE9CX,EAAeY,EAAkB,IAAK,EAAIr6D,EAC1Cw5D,EAASx5D,CAAM,EAAIq6D,EAEnBZ,EAAe9lB,CAAK,EAAIymB,EACxBZ,EAASY,CAAgB,EAAIr+D,EAI7B,QAAUvB,EAAI,EAAGpF,EAAIwkE,EAAWp/D,IAAMpF,EAAG,EAAGoF,EAAI,CAE/C,IAAM0/D,EAAkB/B,EAAU39D,CAAE,EACnC8/D,EAAcJ,EAAiBE,CAAgB,EAC/ChD,EAAU8C,EAAiBl6D,CAAM,EAElCk6D,EAAiBl6D,CAAM,EAAIs6D,EAC3BJ,EAAiBE,CAAgB,EAAIhD,CAEtC,CAED,CAED,CAEA,KAAK,gBAAkB2C,CAExB,CAOA,SAAU,CAET,IAAMP,EAAU,KAAK,SACpBC,EAAgB,KAAK,eACrBtB,EAAW,KAAK,UAChByB,EAAYzB,EAAS,OAElB4B,EAAiB,KAAK,gBACzBD,EAAWN,EAAQ,OAEpB,QAAU5mE,EAAI,EAAGuC,EAAI,UAAU,OAAQvC,IAAMuC,EAAG,EAAGvC,EAAI,CAEtD,IAAMmJ,EAAS,UAAWnJ,CAAE,EAC3B+gD,EAAO53C,EAAO,KACdiE,EAAQy5D,EAAe9lB,CAAK,EAE7B,GAAK3zC,IAAU,OAId,GAFA,OAAOy5D,EAAe9lB,CAAK,EAEtB3zC,EAAQ+5D,EAAiB,CAI7B,IAAMC,EAAmB,EAAGD,EAC3BE,EAAmBT,EAASQ,CAAiB,EAC7CtuD,EAAY,EAAGouD,EACfS,EAAaf,EAAS9tD,CAAU,EAGjC+tD,EAAeQ,EAAiB,IAAK,EAAIj6D,EACzCw5D,EAASx5D,CAAM,EAAIi6D,EAGnBR,EAAec,EAAW,IAAK,EAAIP,EACnCR,EAASQ,CAAiB,EAAIO,EAC9Bf,EAAQ,IAAI,EAIZ,QAAUh/D,EAAI,EAAG,EAAIo/D,EAAWp/D,IAAM,EAAG,EAAGA,EAAI,CAE/C,IAAM0/D,EAAkB/B,EAAU39D,CAAE,EACnC2/D,EAAaD,EAAiBF,CAAiB,EAC/Cz2D,EAAO22D,EAAiBxuD,CAAU,EAEnCwuD,EAAiBl6D,CAAM,EAAIm6D,EAC3BD,EAAiBF,CAAiB,EAAIz2D,EACtC22D,EAAgB,IAAI,CAErB,CAED,KAAO,CAIN,IAAMxuD,EAAY,EAAGouD,EACpBS,EAAaf,EAAS9tD,CAAU,EAE5BA,EAAY,IAEhB+tD,EAAec,EAAW,IAAK,EAAIv6D,GAIpCw5D,EAASx5D,CAAM,EAAIu6D,EACnBf,EAAQ,IAAI,EAIZ,QAAUh/D,EAAI,EAAGpF,EAAIwkE,EAAWp/D,IAAMpF,EAAG,EAAGoF,EAAI,CAE/C,IAAM0/D,EAAkB/B,EAAU39D,CAAE,EAEpC0/D,EAAiBl6D,CAAM,EAAIk6D,EAAiBxuD,CAAU,EACtDwuD,EAAgB,IAAI,CAErB,CAED,CAIF,CAEA,KAAK,gBAAkBH,CAExB,CAIA,WAAYnP,EAAMqN,EAAa,CAK9B,IAAMuC,EAAgB,KAAK,uBACvBx6D,EAAQw6D,EAAe5P,CAAK,EAC1BuN,EAAW,KAAK,UAEtB,GAAKn4D,IAAU,OAAY,OAAOm4D,EAAUn4D,CAAM,EAElD,IAAM05D,EAAQ,KAAK,OAClBC,EAAc,KAAK,aACnBH,EAAU,KAAK,SACfM,EAAWN,EAAQ,OACnBO,EAAiB,KAAK,gBACtBG,EAAkB,IAAI,MAAOJ,CAAS,EAEvC95D,EAAQm4D,EAAS,OAEjBqC,EAAe5P,CAAK,EAAI5qD,EAExB05D,EAAM,KAAM9O,CAAK,EACjB+O,EAAY,KAAM1B,CAAW,EAC7BE,EAAS,KAAM+B,CAAgB,EAE/B,QAAUtnE,EAAImnE,EAAgB5kE,EAAIqkE,EAAQ,OAAQ5mE,IAAMuC,EAAG,EAAGvC,EAAI,CAEjE,IAAMmJ,EAASy9D,EAAS5mE,CAAE,EAC1BsnE,EAAiBtnE,CAAE,EAAI,IAAIy/B,GAAiBt2B,EAAQ6uD,EAAMqN,CAAW,CAEtE,CAEA,OAAOiC,CAER,CAEA,aAActP,EAAO,CAKpB,IAAM4P,EAAgB,KAAK,uBAC1Bx6D,EAAQw6D,EAAe5P,CAAK,EAE7B,GAAK5qD,IAAU,OAAY,CAE1B,IAAM05D,EAAQ,KAAK,OAClBC,EAAc,KAAK,aACnBxB,EAAW,KAAK,UAChBsC,EAAoBtC,EAAS,OAAS,EACtCuC,EAAevC,EAAUsC,CAAkB,EAC3CE,EAAmB/P,EAAM6P,CAAkB,EAE5CD,EAAeG,CAAiB,EAAI36D,EAEpCm4D,EAAUn4D,CAAM,EAAI06D,EACpBvC,EAAS,IAAI,EAEbwB,EAAa35D,CAAM,EAAI25D,EAAac,CAAkB,EACtDd,EAAY,IAAI,EAEhBD,EAAO15D,CAAM,EAAI05D,EAAOe,CAAkB,EAC1Cf,EAAM,IAAI,CAEX,CAED,CAED,EAMMnnC,GAAN,KAAsB,CAUrB,YAAaqoC,EAAOpwD,EAAMqwD,EAAY,KAAMpM,EAAYjkD,EAAK,UAAY,CAExE,KAAK,OAASowD,EACd,KAAK,MAAQpwD,EACb,KAAK,WAAaqwD,EAQlB,KAAK,UAAYpM,EAEjB,IAAMhkD,EAASD,EAAK,OACnBswD,EAAUrwD,EAAO,OACjBswD,EAAe,IAAI,MAAOD,CAAQ,EAE7BE,EAAsB,CAC3B,YAAavjD,GACb,UAAWA,EACZ,EAEA,QAAU7kB,EAAI,EAAGA,IAAMkoE,EAAS,EAAGloE,EAAI,CAEtC,IAAMkZ,EAAcrB,EAAQ7X,CAAE,EAAE,kBAAmB,IAAK,EACxDmoE,EAAcnoE,CAAE,EAAIkZ,EACpBA,EAAY,SAAWkvD,CAExB,CAEA,KAAK,qBAAuBA,EAE5B,KAAK,cAAgBD,EAGrB,KAAK,kBAAoB,IAAI,MAAOD,CAAQ,EAE5C,KAAK,YAAc,KACnB,KAAK,kBAAoB,KAEzB,KAAK,sBAAwB,KAC7B,KAAK,mBAAqB,KAQ1B,KAAK,KAAO1jD,GACZ,KAAK,WAAa,GAIlB,KAAK,WAAa,KAWlB,KAAK,KAAO,EASZ,KAAK,UAAY,EACjB,KAAK,oBAAsB,EAU3B,KAAK,OAAS,EACd,KAAK,iBAAmB,EAYxB,KAAK,YAAc,IAQnB,KAAK,OAAS,GAWd,KAAK,QAAU,GAef,KAAK,kBAAoB,GAQzB,KAAK,iBAAmB,GAQxB,KAAK,eAAiB,EAEvB,CAOA,MAAO,CAEN,YAAK,OAAO,gBAAiB,IAAK,EAE3B,IAER,CAOA,MAAO,CAEN,YAAK,OAAO,kBAAmB,IAAK,EAE7B,KAAK,MAAM,CAEnB,CAOA,OAAQ,CAEP,YAAK,OAAS,GACd,KAAK,QAAU,GAEf,KAAK,KAAO,EACZ,KAAK,WAAa,GAClB,KAAK,WAAa,KAEX,KAAK,WAAW,EAAE,YAAY,CAEtC,CAOA,WAAY,CAEX,OAAO,KAAK,SAAW,CAAE,KAAK,QAAU,KAAK,YAAc,GAC1D,KAAK,aAAe,MAAQ,KAAK,OAAO,gBAAiB,IAAK,CAEhE,CAOA,aAAc,CAEb,OAAO,KAAK,OAAO,gBAAiB,IAAK,CAE1C,CAQA,QAAS62C,EAAO,CAEf,YAAK,WAAaA,EAEX,IAER,CASA,QAASgN,EAAMC,EAAc,CAE5B,YAAK,KAAOD,EACZ,KAAK,YAAcC,EAEZ,IAER,CAWA,mBAAoBhoB,EAAS,CAE5B,YAAK,OAASA,EAGd,KAAK,iBAAmB,KAAK,QAAUA,EAAS,EAEzC,KAAK,WAAW,CAExB,CAOA,oBAAqB,CAEpB,OAAO,KAAK,gBAEb,CASA,OAAQsb,EAAW,CAElB,OAAO,KAAK,gBAAiBA,EAAU,EAAG,CAAE,CAE7C,CASA,QAASA,EAAW,CAEnB,OAAO,KAAK,gBAAiBA,EAAU,EAAG,CAAE,CAE7C,CAWA,cAAe2M,EAAe3M,EAAU4M,EAAO,GAAQ,CAKtD,GAHAD,EAAc,QAAS3M,CAAS,EAChC,KAAK,OAAQA,CAAS,EAEjB4M,IAAS,GAAO,CAEpB,IAAMC,EAAiB,KAAK,MAAM,SACjCC,EAAkBH,EAAc,MAAM,SAEtCI,EAAgBD,EAAkBD,EAClCG,EAAgBH,EAAiBC,EAElCH,EAAc,KAAM,EAAKI,EAAe/M,CAAS,EACjD,KAAK,KAAMgN,EAAe,EAAKhN,CAAS,CAEzC,CAEA,OAAO,IAER,CAWA,YAAaiN,EAAcjN,EAAU4M,EAAO,GAAQ,CAEnD,OAAOK,EAAa,cAAe,KAAMjN,EAAU4M,CAAK,CAEzD,CAOA,YAAa,CAEZ,IAAMM,EAAoB,KAAK,mBAE/B,OAAKA,IAAsB,OAE1B,KAAK,mBAAqB,KAC1B,KAAK,OAAO,4BAA6BA,CAAkB,GAIrD,IAER,CAWA,sBAAuBrO,EAAY,CAElC,YAAK,UAAYA,EACjB,KAAK,oBAAsB,KAAK,OAAS,EAAIA,EAEtC,KAAK,YAAY,CAEzB,CAOA,uBAAwB,CAEvB,OAAO,KAAK,mBAEb,CAQA,YAAamB,EAAW,CAEvB,YAAK,UAAY,KAAK,MAAM,SAAWA,EAEhC,KAAK,YAAY,CAEzB,CAQA,SAAUmN,EAAS,CAElB,YAAK,KAAOA,EAAO,KACnB,KAAK,UAAYA,EAAO,UAEjB,KAAK,YAAY,CAEzB,CAQA,KAAMnN,EAAW,CAEhB,OAAO,KAAK,KAAM,KAAK,oBAAqB,EAAGA,CAAS,CAEzD,CAYA,KAAMoN,EAAgBC,EAAcrN,EAAW,CAE9C,IAAMoM,EAAQ,KAAK,OAClBkB,EAAMlB,EAAM,KACZvN,EAAY,KAAK,UAEdvhD,EAAc,KAAK,sBAElBA,IAAgB,OAEpBA,EAAc8uD,EAAM,wBAAwB,EAC5C,KAAK,sBAAwB9uD,GAI9B,IAAMvC,EAAQuC,EAAY,mBACzBpC,EAASoC,EAAY,aAEtB,OAAAvC,EAAO,CAAE,EAAIuyD,EACbvyD,EAAO,CAAE,EAAIuyD,EAAMtN,EAEnB9kD,EAAQ,CAAE,EAAIkyD,EAAiBvO,EAC/B3jD,EAAQ,CAAE,EAAImyD,EAAexO,EAEtB,IAER,CAOA,aAAc,CAEb,IAAM0O,EAAuB,KAAK,sBAElC,OAAKA,IAAyB,OAE7B,KAAK,sBAAwB,KAC7B,KAAK,OAAO,4BAA6BA,CAAqB,GAIxD,IAER,CAOA,UAAW,CAEV,OAAO,KAAK,MAEb,CAOA,SAAU,CAET,OAAO,KAAK,KAEb,CAOA,SAAU,CAET,OAAO,KAAK,YAAc,KAAK,OAAO,KAEvC,CAIA,QAAS9N,EAAM+N,EAAWC,EAAezE,EAAY,CAIpD,GAAK,CAAE,KAAK,QAAU,CAIrB,KAAK,cAAevJ,CAAK,EACzB,MAED,CAEA,IAAMX,EAAY,KAAK,WAEvB,GAAKA,IAAc,KAAO,CAIzB,IAAM4O,GAAgBjO,EAAOX,GAAc2O,EACtCC,EAAc,GAAKD,IAAkB,EAEzCD,EAAY,GAKZ,KAAK,WAAa,KAClBA,EAAYC,EAAgBC,EAI9B,CAIAF,GAAa,KAAK,iBAAkB/N,CAAK,EACzC,IAAMkO,EAAW,KAAK,YAAaH,CAAU,EAKvC9oB,EAAS,KAAK,cAAe+a,CAAK,EAExC,GAAK/a,EAAS,EAAI,CAEjB,IAAM6nB,EAAe,KAAK,cACpBqB,EAAiB,KAAK,kBAE5B,OAAS,KAAK,UAAY,CAEzB,KAAKjwD,GAEJ,QAAU3R,EAAI,EAAGpF,EAAI2lE,EAAa,OAAQvgE,IAAMpF,EAAG,EAAGoF,EAErDugE,EAAcvgE,CAAE,EAAE,SAAU2hE,CAAS,EACrCC,EAAgB5hE,CAAE,EAAE,mBAAoB04C,CAAO,EAIhD,MAED,KAAKt7B,GACL,QAEC,QAAUpd,EAAI,EAAGpF,EAAI2lE,EAAa,OAAQvgE,IAAMpF,EAAG,EAAGoF,EAErDugE,EAAcvgE,CAAE,EAAE,SAAU2hE,CAAS,EACrCC,EAAgB5hE,CAAE,EAAE,WAAYg9D,EAAWtkB,CAAO,CAIrD,CAED,CAED,CAEA,cAAe+a,EAAO,CAErB,IAAI/a,EAAS,EAEb,GAAK,KAAK,QAAU,CAEnBA,EAAS,KAAK,OACd,IAAMpnC,EAAc,KAAK,mBAEzB,GAAKA,IAAgB,KAAO,CAE3B,IAAMuwD,EAAmBvwD,EAAY,SAAUmiD,CAAK,EAAG,CAAE,EAEzD/a,GAAUmpB,EAELpO,EAAOniD,EAAY,mBAAoB,CAAE,IAE7C,KAAK,WAAW,EAEXuwD,IAAqB,IAGzB,KAAK,QAAU,IAMlB,CAED,CAEA,YAAK,iBAAmBnpB,EACjBA,CAER,CAEA,iBAAkB+a,EAAO,CAExB,IAAIZ,EAAY,EAEhB,GAAK,CAAE,KAAK,OAAS,CAEpBA,EAAY,KAAK,UAEjB,IAAMvhD,EAAc,KAAK,sBAEzB,GAAKA,IAAgB,KAAO,CAE3B,IAAMuwD,EAAmBvwD,EAAY,SAAUmiD,CAAK,EAAG,CAAE,EAEzDZ,GAAagP,EAERpO,EAAOniD,EAAY,mBAAoB,CAAE,IAE7C,KAAK,YAAY,EAEZuhD,IAAc,EAGlB,KAAK,OAAS,GAKd,KAAK,UAAYA,EAMpB,CAED,CAEA,YAAK,oBAAsBA,EACpBA,CAER,CAEA,YAAa2O,EAAY,CAExB,IAAMxN,EAAW,KAAK,MAAM,SACtB8N,EAAO,KAAK,KAEdrO,EAAO,KAAK,KAAO+N,EACnBO,EAAY,KAAK,WAEfC,EAAaF,IAASjlD,GAE5B,GAAK2kD,IAAc,EAElB,OAAKO,IAAc,GAAYtO,EAEtBuO,IAAcD,EAAY,KAAQ,EAAM/N,EAAWP,EAAOA,EAIpE,GAAKqO,IAASnlD,GAAW,CAEnBolD,IAAc,KAIlB,KAAK,WAAa,EAClB,KAAK,YAAa,GAAM,GAAM,EAAM,GAIrCE,EAAa,CAEZ,GAAKxO,GAAQO,EAEZP,EAAOO,UAEIP,EAAO,EAElBA,EAAO,MAED,CAEN,KAAK,KAAOA,EAEZ,MAAMwO,CAEP,CAEK,KAAK,kBAAoB,KAAK,OAAS,GACvC,KAAK,QAAU,GAEpB,KAAK,KAAOxO,EAEZ,KAAK,OAAO,cAAe,CAC1B,KAAM,WAAY,OAAQ,KAC1B,UAAW+N,EAAY,EAAI,GAAK,CACjC,CAAE,CAEH,CAED,KAAO,CAwBN,GAtBKO,IAAc,KAIbP,GAAa,GAEjBO,EAAY,EAEZ,KAAK,YAAa,GAAM,KAAK,cAAgB,EAAGC,CAAS,GAQzD,KAAK,YAAa,KAAK,cAAgB,EAAG,GAAMA,CAAS,GAMtDvO,GAAQO,GAAYP,EAAO,EAAI,CAInC,IAAMyO,EAAY,KAAK,MAAOzO,EAAOO,CAAS,EAC9CP,GAAQO,EAAWkO,EAEnBH,GAAa,KAAK,IAAKG,CAAU,EAEjC,IAAMC,EAAU,KAAK,YAAcJ,EAEnC,GAAKI,GAAW,EAIV,KAAK,kBAAoB,KAAK,OAAS,GACvC,KAAK,QAAU,GAEpB1O,EAAO+N,EAAY,EAAIxN,EAAW,EAElC,KAAK,KAAOP,EAEZ,KAAK,OAAO,cAAe,CAC1B,KAAM,WAAY,OAAQ,KAC1B,UAAW+N,EAAY,EAAI,EAAI,EAChC,CAAE,MAEI,CAIN,GAAKW,IAAY,EAAI,CAIpB,IAAMC,EAAUZ,EAAY,EAC5B,KAAK,YAAaY,EAAS,CAAEA,EAASJ,CAAS,CAEhD,MAEC,KAAK,YAAa,GAAO,GAAOA,CAAS,EAI1C,KAAK,WAAaD,EAElB,KAAK,KAAOtO,EAEZ,KAAK,OAAO,cAAe,CAC1B,KAAM,OAAQ,OAAQ,KAAM,UAAWyO,CACxC,CAAE,CAEH,CAED,MAEC,KAAK,KAAOzO,EAIb,GAAKuO,IAAcD,EAAY,KAAQ,EAItC,OAAO/N,EAAWP,CAIpB,CAEA,OAAOA,CAER,CAEA,YAAa2O,EAASC,EAAOL,EAAW,CAEvC,IAAMM,EAAW,KAAK,qBAEjBN,GAEJM,EAAS,YAAcplD,GACvBolD,EAAS,UAAYplD,KAMhBklD,EAEJE,EAAS,YAAc,KAAK,iBAAmBplD,GAAkBD,GAIjEqlD,EAAS,YAAcnlD,GAInBklD,EAEJC,EAAS,UAAY,KAAK,eAAiBplD,GAAkBD,GAI7DqlD,EAAS,UAAcnlD,GAM1B,CAEA,gBAAiB62C,EAAUuO,EAAWC,EAAa,CAElD,IAAMpC,EAAQ,KAAK,OAAQkB,EAAMlB,EAAM,KACnC9uD,EAAc,KAAK,mBAElBA,IAAgB,OAEpBA,EAAc8uD,EAAM,wBAAwB,EAC5C,KAAK,mBAAqB9uD,GAI3B,IAAMvC,EAAQuC,EAAY,mBACzBpC,EAASoC,EAAY,aAEtB,OAAAvC,EAAO,CAAE,EAAIuyD,EACbpyD,EAAQ,CAAE,EAAIqzD,EACdxzD,EAAO,CAAE,EAAIuyD,EAAMtN,EACnB9kD,EAAQ,CAAE,EAAIszD,EAEP,IAER,CAED,EAEMxqC,IAAmC,IAAI,aAAc,CAAE,EAOvDC,GAAN,cAA6BxX,EAAgB,CAO5C,YAAaq9C,EAAO,CAEnB,MAAM,EAEN,KAAK,MAAQA,EACb,KAAK,mBAAmB,EACxB,KAAK,WAAa,EAQlB,KAAK,KAAO,EAYZ,KAAK,UAAY,CAElB,CAEA,YAAaqD,EAAQsB,EAAkB,CAEtC,IAAM3E,EAAOqD,EAAO,YAAc,KAAK,MACtClxD,EAASkxD,EAAO,MAAM,OACtBb,EAAUrwD,EAAO,OACjB0tD,EAAWwD,EAAO,kBAClBZ,EAAeY,EAAO,cACtBuB,EAAW5E,EAAK,KAChB6E,EAAiB,KAAK,uBAEnBC,EAAiBD,EAAgBD,CAAS,EAEzCE,IAAmB,SAEvBA,EAAiB,CAAC,EAClBD,EAAgBD,CAAS,EAAIE,GAI9B,QAAUxqE,EAAI,EAAGA,IAAMkoE,EAAS,EAAGloE,EAAI,CAEtC,IAAM8X,EAAQD,EAAQ7X,CAAE,EACvB88D,EAAYhlD,EAAM,KAEf0sD,EAAUgG,EAAgB1N,CAAU,EAExC,GAAK0H,IAAY,OAEhB,EAAGA,EAAQ,eACXe,EAAUvlE,CAAE,EAAIwkE,MAEV,CAIN,GAFAA,EAAUe,EAAUvlE,CAAE,EAEjBwkE,IAAY,OAAY,CAIvBA,EAAQ,cAAgB,OAE5B,EAAGA,EAAQ,eACX,KAAK,oBAAqBA,EAAS8F,EAAUxN,CAAU,GAIxD,QAED,CAEA,IAAM9E,EAAOqS,GAAmBA,EAC/B,kBAAmBrqE,CAAE,EAAE,QAAQ,WAEhCwkE,EAAU,IAAI3lC,GACbY,GAAgB,OAAQimC,EAAM5I,EAAW9E,CAAK,EAC9ClgD,EAAM,cAAeA,EAAM,aAAa,CAAE,EAE3C,EAAG0sD,EAAQ,eACX,KAAK,oBAAqBA,EAAS8F,EAAUxN,CAAU,EAEvDyI,EAAUvlE,CAAE,EAAIwkE,CAEjB,CAEA2D,EAAcnoE,CAAE,EAAE,aAAewkE,EAAQ,MAE1C,CAED,CAEA,gBAAiBuE,EAAS,CAEzB,GAAK,CAAE,KAAK,gBAAiBA,CAAO,EAAI,CAEvC,GAAKA,EAAO,cAAgB,KAAO,CAKlC,IAAMuB,GAAavB,EAAO,YAAc,KAAK,OAAQ,KACpD0B,EAAW1B,EAAO,MAAM,KACxB2B,EAAiB,KAAK,eAAgBD,CAAS,EAEhD,KAAK,YAAa1B,EACjB2B,GAAkBA,EAAe,aAAc,CAAE,CAAE,EAEpD,KAAK,mBAAoB3B,EAAQ0B,EAAUH,CAAS,CAErD,CAEA,IAAM/E,EAAWwD,EAAO,kBAGxB,QAAU/oE,EAAI,EAAGuC,EAAIgjE,EAAS,OAAQvlE,IAAMuC,EAAG,EAAGvC,EAAI,CAErD,IAAMwkE,EAAUe,EAAUvlE,CAAE,EAEvBwkE,EAAQ,aAAgB,IAE5B,KAAK,aAAcA,CAAQ,EAC3BA,EAAQ,kBAAkB,EAI5B,CAEA,KAAK,YAAauE,CAAO,CAE1B,CAED,CAEA,kBAAmBA,EAAS,CAE3B,GAAK,KAAK,gBAAiBA,CAAO,EAAI,CAErC,IAAMxD,EAAWwD,EAAO,kBAGxB,QAAU/oE,EAAI,EAAGuC,EAAIgjE,EAAS,OAAQvlE,IAAMuC,EAAG,EAAGvC,EAAI,CAErD,IAAMwkE,EAAUe,EAAUvlE,CAAE,EAEvB,EAAGwkE,EAAQ,WAAa,IAE5BA,EAAQ,qBAAqB,EAC7B,KAAK,iBAAkBA,CAAQ,EAIjC,CAEA,KAAK,gBAAiBuE,CAAO,CAE9B,CAED,CAIA,oBAAqB,CAEpB,KAAK,SAAW,CAAC,EACjB,KAAK,gBAAkB,EAEvB,KAAK,eAAiB,CAAC,EAQvB,KAAK,UAAY,CAAC,EAClB,KAAK,iBAAmB,EAExB,KAAK,uBAAyB,CAAC,EAG/B,KAAK,qBAAuB,CAAC,EAC7B,KAAK,4BAA8B,EAEnC,IAAMttB,EAAQ,KAEd,KAAK,MAAQ,CAEZ,QAAS,CACR,IAAI,OAAQ,CAEX,OAAOA,EAAM,SAAS,MAEvB,EACA,IAAI,OAAQ,CAEX,OAAOA,EAAM,eAEd,CACD,EACA,SAAU,CACT,IAAI,OAAQ,CAEX,OAAOA,EAAM,UAAU,MAExB,EACA,IAAI,OAAQ,CAEX,OAAOA,EAAM,gBAEd,CACD,EACA,oBAAqB,CACpB,IAAI,OAAQ,CAEX,OAAOA,EAAM,qBAAqB,MAEnC,EACA,IAAI,OAAQ,CAEX,OAAOA,EAAM,2BAEd,CACD,CAED,CAED,CAIA,gBAAiBstB,EAAS,CAEzB,IAAM37D,EAAQ27D,EAAO,YACrB,OAAO37D,IAAU,MAAQA,EAAQ,KAAK,eAEvC,CAEA,mBAAoB27D,EAAQ0B,EAAUH,EAAW,CAEhD,IAAMK,EAAU,KAAK,SACpBC,EAAgB,KAAK,eAElBF,EAAiBE,EAAeH,CAAS,EAE7C,GAAKC,IAAmB,OAEvBA,EAAiB,CAEhB,aAAc,CAAE3B,CAAO,EACvB,aAAc,CAAC,CAEhB,EAEAA,EAAO,kBAAoB,EAE3B6B,EAAeH,CAAS,EAAIC,MAEtB,CAEN,IAAMG,EAAeH,EAAe,aAEpC3B,EAAO,kBAAoB8B,EAAa,OACxCA,EAAa,KAAM9B,CAAO,CAE3B,CAEAA,EAAO,YAAc4B,EAAQ,OAC7BA,EAAQ,KAAM5B,CAAO,EAErB2B,EAAe,aAAcJ,CAAS,EAAIvB,CAE3C,CAEA,sBAAuBA,EAAS,CAE/B,IAAM4B,EAAU,KAAK,SACpBG,EAAqBH,EAASA,EAAQ,OAAS,CAAE,EACjDI,EAAahC,EAAO,YAErB+B,EAAmB,YAAcC,EACjCJ,EAASI,CAAW,EAAID,EACxBH,EAAQ,IAAI,EAEZ5B,EAAO,YAAc,KAGrB,IAAM0B,EAAW1B,EAAO,MAAM,KAC7B6B,EAAgB,KAAK,eACrBF,EAAiBE,EAAeH,CAAS,EACzCO,EAAsBN,EAAe,aAErCO,EACCD,EAAqBA,EAAoB,OAAS,CAAE,EAErDE,EAAmBnC,EAAO,kBAE3BkC,EAAgB,kBAAoBC,EACpCF,EAAqBE,CAAiB,EAAID,EAC1CD,EAAoB,IAAI,EAExBjC,EAAO,kBAAoB,KAG3B,IAAMoC,EAAeT,EAAe,aACnCJ,GAAavB,EAAO,YAAc,KAAK,OAAQ,KAEhD,OAAOoC,EAAcb,CAAS,EAEzBU,EAAoB,SAAW,GAEnC,OAAOJ,EAAeH,CAAS,EAIhC,KAAK,iCAAkC1B,CAAO,CAE/C,CAEA,iCAAkCA,EAAS,CAE1C,IAAMxD,EAAWwD,EAAO,kBAExB,QAAU/oE,EAAI,EAAGuC,EAAIgjE,EAAS,OAAQvlE,IAAMuC,EAAG,EAAGvC,EAAI,CAErD,IAAMwkE,EAAUe,EAAUvlE,CAAE,EAEvB,EAAGwkE,EAAQ,iBAAmB,GAElC,KAAK,uBAAwBA,CAAQ,CAIvC,CAED,CAEA,YAAauE,EAAS,CAQrB,IAAM4B,EAAU,KAAK,SACpBS,EAAYrC,EAAO,YAEnBsC,EAAkB,KAAK,kBAEvBC,EAAsBX,EAASU,CAAgB,EAEhDtC,EAAO,YAAcsC,EACrBV,EAASU,CAAgB,EAAItC,EAE7BuC,EAAoB,YAAcF,EAClCT,EAASS,CAAU,EAAIE,CAExB,CAEA,gBAAiBvC,EAAS,CAQzB,IAAM4B,EAAU,KAAK,SACpBS,EAAYrC,EAAO,YAEnBwC,EAAqB,EAAG,KAAK,gBAE7BC,EAAmBb,EAASY,CAAmB,EAEhDxC,EAAO,YAAcwC,EACrBZ,EAASY,CAAmB,EAAIxC,EAEhCyC,EAAiB,YAAcJ,EAC/BT,EAASS,CAAU,EAAII,CAExB,CAIA,oBAAqBhH,EAAS8F,EAAUxN,EAAY,CAEnD,IAAMyN,EAAiB,KAAK,uBAC3BhF,EAAW,KAAK,UAEbkG,EAAgBlB,EAAgBD,CAAS,EAExCmB,IAAkB,SAEtBA,EAAgB,CAAC,EACjBlB,EAAgBD,CAAS,EAAImB,GAI9BA,EAAe3O,CAAU,EAAI0H,EAE7BA,EAAQ,YAAce,EAAS,OAC/BA,EAAS,KAAMf,CAAQ,CAExB,CAEA,uBAAwBA,EAAU,CAEjC,IAAMe,EAAW,KAAK,UACrBmG,EAAclH,EAAQ,QACtB8F,EAAWoB,EAAY,SAAS,KAChC5O,EAAY4O,EAAY,KACxBnB,EAAiB,KAAK,uBACtBkB,EAAgBlB,EAAgBD,CAAS,EAEzCqB,EAAsBpG,EAAUA,EAAS,OAAS,CAAE,EACpDwF,EAAavG,EAAQ,YAEtBmH,EAAoB,YAAcZ,EAClCxF,EAAUwF,CAAW,EAAIY,EACzBpG,EAAS,IAAI,EAEb,OAAOkG,EAAe3O,CAAU,EAE3B,OAAO,KAAM2O,CAAc,EAAE,SAAW,GAE5C,OAAOlB,EAAgBD,CAAS,CAIlC,CAEA,aAAc9F,EAAU,CAEvB,IAAMe,EAAW,KAAK,UACrB6F,EAAY5G,EAAQ,YAEpB6G,EAAkB,KAAK,mBAEvBO,EAAuBrG,EAAU8F,CAAgB,EAElD7G,EAAQ,YAAc6G,EACtB9F,EAAU8F,CAAgB,EAAI7G,EAE9BoH,EAAqB,YAAcR,EACnC7F,EAAU6F,CAAU,EAAIQ,CAEzB,CAEA,iBAAkBpH,EAAU,CAE3B,IAAMe,EAAW,KAAK,UACrB6F,EAAY5G,EAAQ,YAEpB+G,EAAqB,EAAG,KAAK,iBAE7BM,EAAoBtG,EAAUgG,CAAmB,EAElD/G,EAAQ,YAAc+G,EACtBhG,EAAUgG,CAAmB,EAAI/G,EAEjCqH,EAAkB,YAAcT,EAChC7F,EAAU6F,CAAU,EAAIS,CAEzB,CAKA,yBAA0B,CAEzB,IAAM1D,EAAe,KAAK,qBACzBkD,EAAkB,KAAK,8BAEpBnyD,EAAcivD,EAAckD,CAAgB,EAEhD,OAAKnyD,IAAgB,SAEpBA,EAAc,IAAIuhB,GACjB,IAAI,aAAc,CAAE,EAAG,IAAI,aAAc,CAAE,EAC3C,EAAGmF,GAAiC,EAErC1mB,EAAY,aAAemyD,EAC3BlD,EAAckD,CAAgB,EAAInyD,GAI5BA,CAER,CAEA,4BAA6BA,EAAc,CAE1C,IAAMivD,EAAe,KAAK,qBACzBiD,EAAYlyD,EAAY,aAExBqyD,EAAqB,EAAG,KAAK,4BAE7BO,EAAwB3D,EAAcoD,CAAmB,EAE1DryD,EAAY,aAAeqyD,EAC3BpD,EAAcoD,CAAmB,EAAIryD,EAErC4yD,EAAsB,aAAeV,EACrCjD,EAAciD,CAAU,EAAIU,CAE7B,CAcA,WAAYl0D,EAAMm0D,EAAclQ,EAAY,CAE3C,IAAM6J,EAAOqG,GAAgB,KAAK,MACjCzB,EAAW5E,EAAK,KAEbsG,EAAa,OAAOp0D,GAAS,SAAWijB,GAAc,WAAY6qC,EAAM9tD,CAAK,EAAIA,EAE/E6yD,EAAWuB,IAAe,KAAOA,EAAW,KAAOp0D,EAEnD8yD,EAAiB,KAAK,eAAgBD,CAAS,EACjDJ,EAAkB,KAgBtB,GAdKxO,IAAc,SAEbmQ,IAAe,KAEnBnQ,EAAYmQ,EAAW,UAIvBnQ,EAAY72C,IAMT0lD,IAAmB,OAAY,CAEnC,IAAMuB,EAAiBvB,EAAe,aAAcJ,CAAS,EAE7D,GAAK2B,IAAmB,QAAaA,EAAe,YAAcpQ,EAEjE,OAAOoQ,EAMR5B,EAAkBK,EAAe,aAAc,CAAE,EAG5CsB,IAAe,OACnBA,EAAa3B,EAAgB,MAE/B,CAGA,GAAK2B,IAAe,KAAO,OAAO,KAGlC,IAAME,EAAY,IAAIvsC,GAAiB,KAAMqsC,EAAYD,EAAclQ,CAAU,EAEjF,YAAK,YAAaqQ,EAAW7B,CAAgB,EAG7C,KAAK,mBAAoB6B,EAAWzB,EAAUH,CAAS,EAEhD4B,CAER,CASA,eAAgBt0D,EAAMm0D,EAAe,CAEpC,IAAMrG,EAAOqG,GAAgB,KAAK,MACjCzB,EAAW5E,EAAK,KAEhBsG,EAAa,OAAOp0D,GAAS,SAC5BijB,GAAc,WAAY6qC,EAAM9tD,CAAK,EAAIA,EAE1C6yD,EAAWuB,EAAaA,EAAW,KAAOp0D,EAE1C8yD,EAAiB,KAAK,eAAgBD,CAAS,EAEhD,OAAKC,IAAmB,QAEhBA,EAAe,aAAcJ,CAAS,GAAK,IAMpD,CAOA,eAAgB,CAEf,IAAMK,EAAU,KAAK,SACpBwB,EAAW,KAAK,gBAEjB,QAAUnsE,EAAImsE,EAAW,EAAGnsE,GAAK,EAAG,EAAGA,EAEtC2qE,EAAS3qE,CAAE,EAAE,KAAK,EAInB,OAAO,IAER,CAWA,OAAQopE,EAAY,CAEnBA,GAAa,KAAK,UAElB,IAAMuB,EAAU,KAAK,SACpBwB,EAAW,KAAK,gBAEhB9Q,EAAO,KAAK,MAAQ+N,EACpBC,EAAgB,KAAK,KAAMD,CAAU,EAErCxE,EAAY,KAAK,YAAc,EAIhC,QAAU5kE,EAAI,EAAGA,IAAMmsE,EAAU,EAAGnsE,EAEpB2qE,EAAS3qE,CAAE,EAEnB,QAASq7D,EAAM+N,EAAWC,EAAezE,CAAU,EAM3D,IAAMW,EAAW,KAAK,UACrByB,EAAY,KAAK,iBAElB,QAAUhnE,EAAI,EAAGA,IAAMgnE,EAAW,EAAGhnE,EAEpCulE,EAAUvlE,CAAE,EAAE,MAAO4kE,CAAU,EAIhC,OAAO,IAER,CAWA,QAASvJ,EAAO,CAEf,KAAK,KAAO,EACZ,QAAUr7D,EAAI,EAAGA,EAAI,KAAK,SAAS,OAAQA,IAE1C,KAAK,SAAUA,CAAE,EAAE,KAAO,EAI3B,OAAO,KAAK,OAAQq7D,CAAK,CAE1B,CAOA,SAAU,CAET,OAAO,KAAK,KAEb,CAQA,YAAazjD,EAAO,CAEnB,IAAM+yD,EAAU,KAAK,SACpBF,EAAW7yD,EAAK,KAChBgzD,EAAgB,KAAK,eACrBF,EAAiBE,EAAeH,CAAS,EAE1C,GAAKC,IAAmB,OAAY,CAMnC,IAAM0B,EAAkB1B,EAAe,aAEvC,QAAU1qE,EAAI,EAAGuC,EAAI6pE,EAAgB,OAAQpsE,IAAMuC,EAAG,EAAGvC,EAAI,CAE5D,IAAM+oE,EAASqD,EAAiBpsE,CAAE,EAElC,KAAK,kBAAmB+oE,CAAO,EAE/B,IAAMgC,EAAahC,EAAO,YACzB+B,EAAqBH,EAASA,EAAQ,OAAS,CAAE,EAElD5B,EAAO,YAAc,KACrBA,EAAO,kBAAoB,KAE3B+B,EAAmB,YAAcC,EACjCJ,EAASI,CAAW,EAAID,EACxBH,EAAQ,IAAI,EAEZ,KAAK,iCAAkC5B,CAAO,CAE/C,CAEA,OAAO6B,EAAeH,CAAS,CAEhC,CAED,CAUA,YAAa/E,EAAO,CAEnB,IAAM4E,EAAW5E,EAAK,KACrBkF,EAAgB,KAAK,eAEtB,QAAYH,KAAYG,EAAgB,CAEvC,IAAMO,EAAeP,EAAeH,CAAS,EAAE,aAC9C1B,EAASoC,EAAcb,CAAS,EAE5BvB,IAAW,SAEf,KAAK,kBAAmBA,CAAO,EAC/B,KAAK,sBAAuBA,CAAO,EAIrC,CAEA,IAAMwB,EAAiB,KAAK,uBAC3BkB,EAAgBlB,EAAgBD,CAAS,EAE1C,GAAKmB,IAAkB,OAEtB,QAAY3O,KAAa2O,EAAgB,CAExC,IAAMjH,EAAUiH,EAAe3O,CAAU,EACzC0H,EAAQ,qBAAqB,EAC7B,KAAK,uBAAwBA,CAAQ,CAEtC,CAIF,CAUA,cAAe5sD,EAAMm0D,EAAe,CAEnC,IAAMhD,EAAS,KAAK,eAAgBnxD,EAAMm0D,CAAa,EAElDhD,IAAW,OAEf,KAAK,kBAAmBA,CAAO,EAC/B,KAAK,sBAAuBA,CAAO,EAIrC,CAED,EAOMjpC,GAAN,cAA6B5W,EAAa,CAUzC,YAAa1N,EAAQ,EAAGC,EAAS,EAAGqxB,EAAQ,EAAG52B,EAAU,CAAC,EAAI,CAE7D,MAAOsF,EAAOC,EAAQvF,CAAQ,EAS9B,KAAK,iBAAmB,GAExB,KAAK,MAAQ42B,EAOb,KAAK,QAAU,IAAIxjB,GAAe,KAAM9N,EAAOC,EAAQqxB,CAAM,EAC7D,KAAK,mBAAoB52B,CAAQ,EAEjC,KAAK,QAAQ,sBAAwB,EAEtC,CAED,EAeM6pB,GAAN,MAAMssC,CAAQ,CAOb,YAAalqE,EAAQ,CAOpB,KAAK,MAAQA,CAEd,CAQA,OAAQ,CAEP,OAAO,IAAIkqE,EAAS,KAAK,MAAM,QAAU,OAAY,KAAK,MAAQ,KAAK,MAAM,MAAM,CAAE,CAEtF,CAED,EAEIrsC,IAAM,EAWJC,GAAN,cAA4B5X,EAAgB,CAK3C,aAAc,CAEb,MAAM,EASN,KAAK,gBAAkB,GASvB,OAAO,eAAgB,KAAM,KAAM,CAAE,MAAO2X,KAAO,CAAE,EAOrD,KAAK,KAAO,GAQZ,KAAK,MAAQ3Y,GAOb,KAAK,SAAW,CAAC,CAElB,CAQA,IAAKg6C,EAAU,CAEd,YAAK,SAAS,KAAMA,CAAQ,EAErB,IAER,CAQA,OAAQA,EAAU,CAEjB,IAAMj0D,EAAQ,KAAK,SAAS,QAASi0D,CAAQ,EAE7C,OAAKj0D,IAAU,IAAK,KAAK,SAAS,OAAQA,EAAO,CAAE,EAE5C,IAER,CAQA,QAAS7M,EAAO,CAEf,YAAK,KAAOA,EAEL,IAER,CAQA,SAAU4B,EAAQ,CAEjB,YAAK,MAAQA,EAEN,IAER,CAQA,SAAU,CAET,KAAK,cAAe,CAAE,KAAM,SAAU,CAAE,CAEzC,CAQA,KAAMgqC,EAAS,CAEd,KAAK,KAAOA,EAAO,KACnB,KAAK,MAAQA,EAAO,MAEpB,IAAMmgC,EAAiBngC,EAAO,SAE9B,KAAK,SAAS,OAAS,EAEvB,QAAUnsC,EAAI,EAAG4V,EAAI02D,EAAe,OAAQtsE,EAAI4V,EAAG5V,IAAO,CAEzD,IAAMoL,EAAW,MAAM,QAASkhE,EAAgBtsE,CAAE,CAAE,EAAIssE,EAAgBtsE,CAAE,EAAI,CAAEssE,EAAgBtsE,CAAE,CAAE,EAEpG,QAAU4H,EAAI,EAAGA,EAAIwD,EAAS,OAAQxD,IAErC,KAAK,SAAS,KAAMwD,EAAUxD,CAAE,EAAE,MAAM,CAAE,CAI5C,CAEA,OAAO,IAER,CAOA,OAAQ,CAEP,OAAO,IAAI,KAAK,YAAY,EAAE,KAAM,IAAK,CAE1C,CAED,EAOMs4B,GAAN,cAAyC/O,EAAkB,CAS1D,YAAapxB,EAAOgX,EAAQkqC,EAAmB,EAAI,CAElD,MAAOlhD,EAAOgX,CAAO,EASrB,KAAK,6BAA+B,GASpC,KAAK,iBAAmBkqC,CAEzB,CAEA,KAAM9U,EAAS,CAEd,aAAM,KAAMA,CAAO,EAEnB,KAAK,iBAAmBA,EAAO,iBAExB,IAER,CAEA,MAAO18B,EAAO,CAEb,IAAMkwC,EAAK,MAAM,MAAOlwC,CAAK,EAE7B,OAAAkwC,EAAG,iBAAmB,KAAK,iBAEpBA,CAER,CAEA,OAAQlwC,EAAO,CAEd,IAAMwK,EAAO,MAAM,OAAQxK,CAAK,EAEhC,OAAAwK,EAAK,6BAA+B,GACpCA,EAAK,iBAAmB,KAAK,iBAEtBA,CAER,CAED,EAaMkmB,GAAN,KAAwB,CAYvB,YAAahgC,EAAQD,EAAMsM,EAAU+/D,EAAargC,EAAOwL,EAAa,GAAQ,CAS7E,KAAK,oBAAsB,GAO3B,KAAK,KAAO,GAOZ,KAAK,OAASv3C,EAOd,KAAK,KAAOD,EAOZ,KAAK,SAAWsM,EAOhB,KAAK,YAAc+/D,EAOnB,KAAK,MAAQrgC,EAWb,KAAK,WAAawL,EAOlB,KAAK,QAAU,CAEhB,CAUA,IAAI,YAAav1C,EAAQ,CAEnBA,IAAU,IAAO,KAAK,SAE5B,CAQA,UAAWhC,EAAS,CAEnB,YAAK,OAASA,EAEP,IAER,CASA,QAASD,EAAMqsE,EAAc,CAE5B,YAAK,KAAOrsE,EACZ,KAAK,YAAcqsE,EAEZ,IAER,CAQA,YAAa//D,EAAW,CAEvB,YAAK,SAAWA,EAET,IAER,CAQA,SAAU0/B,EAAQ,CAEjB,YAAK,MAAQA,EAEN,IAER,CAED,EAEM9L,GAAwB,IAAInV,GAO5BoV,GAAN,KAAgB,CAUf,YAAa0N,EAAQC,EAAWwF,EAAO,EAAGC,EAAM,IAAW,CAO1D,KAAK,IAAM,IAAIzoB,GAAK+iB,EAAQC,CAAU,EAQtC,KAAK,KAAOwF,EAQZ,KAAK,IAAMC,EAUX,KAAK,OAAS,KAad,KAAK,OAAS,IAAI7nB,GAmBlB,KAAK,OAAS,CACb,KAAM,CAAC,EACP,KAAM,CAAE,UAAW,CAAE,EACrB,IAAK,CAAC,EACN,OAAQ,CAAE,UAAW,CAAE,EACvB,OAAQ,CAAC,CACV,CAED,CAQA,IAAKmiB,EAAQC,EAAY,CAIxB,KAAK,IAAI,IAAKD,EAAQC,CAAU,CAEjC,CASA,cAAew+B,EAAQ3xD,EAAS,CAE1BA,EAAO,qBAEX,KAAK,IAAI,OAAO,sBAAuBA,EAAO,WAAY,EAC1D,KAAK,IAAI,UAAU,IAAK2xD,EAAO,EAAGA,EAAO,EAAG,EAAI,EAAE,UAAW3xD,CAAO,EAAE,IAAK,KAAK,IAAI,MAAO,EAAE,UAAU,EACvG,KAAK,OAASA,GAEHA,EAAO,sBAElB,KAAK,IAAI,OAAO,IAAK2xD,EAAO,EAAGA,EAAO,GAAK3xD,EAAO,KAAOA,EAAO,MAAUA,EAAO,KAAOA,EAAO,IAAM,EAAE,UAAWA,CAAO,EACzH,KAAK,IAAI,UAAU,IAAK,EAAG,EAAG,EAAG,EAAE,mBAAoBA,EAAO,WAAY,EAC1E,KAAK,OAASA,GAId3Z,GAAO,uCAAyC2Z,EAAO,IAAK,CAI9D,CAQA,oBAAqBukD,EAAa,CAEjC,OAAAh/B,GAAQ,SAAS,EAAE,gBAAiBg/B,EAAW,WAAY,EAE3D,KAAK,IAAI,OAAO,sBAAuBA,EAAW,WAAY,EAC9D,KAAK,IAAI,UAAU,IAAK,EAAG,EAAG,EAAG,EAAE,aAAch/B,EAAQ,EAElD,IAER,CAsCA,gBAAiBj3B,EAAQiR,EAAY,GAAM7M,EAAa,CAAC,EAAI,CAE5D,OAAA5D,GAAWR,EAAQ,KAAMoE,EAAY6M,CAAU,EAE/C7M,EAAW,KAAM4M,EAAQ,EAElB5M,CAER,CAYA,iBAAkBq5D,EAASxsD,EAAY,GAAM7M,EAAa,CAAC,EAAI,CAE9D,QAAUvN,EAAI,EAAG4V,EAAIgxD,EAAQ,OAAQ5mE,EAAI4V,EAAG5V,IAE3C2J,GAAWi9D,EAAS5mE,CAAE,EAAG,KAAMuN,EAAY6M,CAAU,EAItD,OAAA7M,EAAW,KAAM4M,EAAQ,EAElB5M,CAER,CAED,EAgDM+yB,GAAN,KAAY,CAKX,aAAc,CAEb,KAAK,cAAgB,EACrB,KAAK,aAAe,EACpB,KAAK,WAAa,YAAY,IAAI,EAElC,KAAK,OAAS,EACd,KAAK,SAAW,EAEhB,KAAK,WAAa,EAElB,KAAK,UAAY,KACjB,KAAK,uBAAyB,IAE/B,CASA,QAASmsC,EAAW,CAEnB,KAAK,UAAYA,EAIZA,EAAS,SAAW,SAExB,KAAK,uBAAyBlyD,IAAuB,KAAM,IAAK,EAEhEkyD,EAAS,iBAAkB,mBAAoB,KAAK,uBAAwB,EAAM,EAIpF,CAKA,YAAa,CAEP,KAAK,yBAA2B,OAEpC,KAAK,UAAU,oBAAqB,mBAAoB,KAAK,sBAAuB,EACpF,KAAK,uBAAyB,MAI/B,KAAK,UAAY,IAElB,CAOA,UAAW,CAEV,OAAO,KAAK,OAAS,GAEtB,CAOA,YAAa,CAEZ,OAAO,KAAK,SAAW,GAExB,CAOA,cAAe,CAEd,OAAO,KAAK,UAEb,CASA,aAAcC,EAAY,CAEzB,YAAK,WAAaA,EAEX,IAER,CAOA,OAAQ,CAEP,YAAK,aAAe,YAAY,IAAI,EAAI,KAAK,WAEtC,IAER,CAMA,SAAU,CAET,KAAK,WAAW,CAEjB,CAYA,OAAQC,EAAY,CAEnB,OAAK,KAAK,yBAA2B,MAAQ,KAAK,UAAU,SAAW,GAEtE,KAAK,OAAS,GAId,KAAK,cAAgB,KAAK,aAC1B,KAAK,cAAiBA,IAAc,OAAYA,EAAY,YAAY,IAAI,GAAM,KAAK,WAEvF,KAAK,QAAW,KAAK,aAAe,KAAK,eAAkB,KAAK,WAChE,KAAK,UAAY,KAAK,QAIhB,IAER,CAED,EAYMpsC,GAAN,KAAgB,CASf,YAAa2H,EAAS,EAAGC,EAAM,EAAGpE,EAAQ,EAAI,CAQ7C,KAAK,OAASmE,EAQd,KAAK,IAAMC,EAQX,KAAK,MAAQpE,CAEd,CAUA,IAAKmE,EAAQC,EAAKpE,EAAQ,CAEzB,YAAK,OAASmE,EACd,KAAK,IAAMC,EACX,KAAK,MAAQpE,EAEN,IAER,CAQA,KAAM6oC,EAAQ,CAEb,YAAK,OAASA,EAAM,OACpB,KAAK,IAAMA,EAAM,IACjB,KAAK,MAAQA,EAAM,MAEZ,IAER,CAQA,UAAW,CAGV,YAAK,IAAM1qE,GAAO,KAAK,IAAK,KAAK,KAAK,GAAK,IAAI,EAExC,IAER,CASA,eAAgByhC,EAAI,CAEnB,OAAO,KAAK,uBAAwBA,EAAE,EAAGA,EAAE,EAAGA,EAAE,CAAE,CAEnD,CAUA,uBAAwBjhC,EAAGM,EAAG8X,EAAI,CAEjC,YAAK,OAAS,KAAK,KAAMpY,EAAIA,EAAIM,EAAIA,EAAI8X,EAAIA,CAAE,EAE1C,KAAK,SAAW,GAEpB,KAAK,MAAQ,EACb,KAAK,IAAM,IAIX,KAAK,MAAQ,KAAK,MAAOpY,EAAGoY,CAAE,EAC9B,KAAK,IAAM,KAAK,KAAM5Y,GAAOc,EAAI,KAAK,OAAQ,GAAI,CAAE,CAAE,GAIhD,IAER,CAOA,OAAQ,CAEP,OAAO,IAAI,KAAK,YAAY,EAAE,KAAM,IAAK,CAE1C,CAED,EAMMw9B,GAAN,KAAkB,CASjB,YAAa0H,EAAS,EAAGnE,EAAQ,EAAG/gC,EAAI,EAAI,CAQ3C,KAAK,OAASklC,EAQd,KAAK,MAAQnE,EAQb,KAAK,EAAI/gC,CAEV,CAUA,IAAKklC,EAAQnE,EAAO/gC,EAAI,CAEvB,YAAK,OAASklC,EACd,KAAK,MAAQnE,EACb,KAAK,EAAI/gC,EAEF,IAER,CAQA,KAAM4pE,EAAQ,CAEb,YAAK,OAASA,EAAM,OACpB,KAAK,MAAQA,EAAM,MACnB,KAAK,EAAIA,EAAM,EAER,IAER,CASA,eAAgBjpC,EAAI,CAEnB,OAAO,KAAK,uBAAwBA,EAAE,EAAGA,EAAE,EAAGA,EAAE,CAAE,CAEnD,CAUA,uBAAwBjhC,EAAGM,EAAG8X,EAAI,CAEjC,YAAK,OAAS,KAAK,KAAMpY,EAAIA,EAAIoY,EAAIA,CAAE,EACvC,KAAK,MAAQ,KAAK,MAAOpY,EAAGoY,CAAE,EAC9B,KAAK,EAAI9X,EAEF,IAER,CAOA,OAAQ,CAEP,OAAO,IAAI,KAAK,YAAY,EAAE,KAAM,IAAK,CAE1C,CAED,EA4BMy9B,GAAN,MAAMosC,CAAQ,CAYb,YAAapkC,EAAKC,EAAKE,EAAKC,EAAM,CASjCgkC,EAAQ,UAAU,UAAY,GAO9B,KAAK,SAAW,CACf,EAAG,EACH,EAAG,CACJ,EAEKpkC,IAAQ,QAEZ,KAAK,IAAKA,EAAKC,EAAKE,EAAKC,CAAI,CAI/B,CAOA,UAAW,CAEV,YAAK,IACJ,EAAG,EACH,EAAG,CACJ,EAEO,IAER,CASA,UAAW9oC,EAAOokC,EAAS,EAAI,CAE9B,QAAUnkC,EAAI,EAAGA,EAAI,EAAGA,IAEvB,KAAK,SAAUA,CAAE,EAAID,EAAOC,EAAImkC,CAAO,EAIxC,OAAO,IAER,CAYA,IAAKsE,EAAKC,EAAKE,EAAKC,EAAM,CAEzB,IAAMtD,EAAK,KAAK,SAEhB,OAAAA,EAAI,CAAE,EAAIkD,EAAKlD,EAAI,CAAE,EAAImD,EACzBnD,EAAI,CAAE,EAAIqD,EAAKrD,EAAI,CAAE,EAAIsD,EAElB,IAER,CAED,EAEMnI,GAA0B,IAAI91B,GAK9B+1B,GAAN,KAAW,CAQV,YAAav+B,EAAM,IAAIwI,GAAS,IAAY,GAAW,EAAGvI,EAAM,IAAIuI,GAAS,KAAY,IAAW,EAAI,CASvG,KAAK,OAAS,GAOd,KAAK,IAAMxI,EAOX,KAAK,IAAMC,CAEZ,CAUA,IAAKD,EAAKC,EAAM,CAEf,YAAK,IAAI,KAAMD,CAAI,EACnB,KAAK,IAAI,KAAMC,CAAI,EAEZ,IAER,CASA,cAAesT,EAAS,CAEvB,KAAK,UAAU,EAEf,QAAU3V,EAAI,EAAG+sC,EAAKp3B,EAAO,OAAQ3V,EAAI+sC,EAAI/sC,IAE5C,KAAK,cAAe2V,EAAQ3V,CAAE,CAAE,EAIjC,OAAO,IAER,CAUA,qBAAsB8L,EAAQmhC,EAAO,CAEpC,IAAMC,EAAWxM,GAAU,KAAMuM,CAAK,EAAE,eAAgB,EAAI,EAC5D,YAAK,IAAI,KAAMnhC,CAAO,EAAE,IAAKohC,CAAS,EACtC,KAAK,IAAI,KAAMphC,CAAO,EAAE,IAAKohC,CAAS,EAE/B,IAER,CAOA,OAAQ,CAEP,OAAO,IAAI,KAAK,YAAY,EAAE,KAAM,IAAK,CAE1C,CAQA,KAAME,EAAM,CAEX,YAAK,IAAI,KAAMA,EAAI,GAAI,EACvB,KAAK,IAAI,KAAMA,EAAI,GAAI,EAEhB,IAER,CAOA,WAAY,CAEX,YAAK,IAAI,EAAI,KAAK,IAAI,EAAI,IAC1B,KAAK,IAAI,EAAI,KAAK,IAAI,EAAI,KAEnB,IAER,CASA,SAAU,CAIT,OAAS,KAAK,IAAI,EAAI,KAAK,IAAI,GAAS,KAAK,IAAI,EAAI,KAAK,IAAI,CAE/D,CAQA,UAAW1mC,EAAS,CAEnB,OAAO,KAAK,QAAQ,EAAIA,EAAO,IAAK,EAAG,CAAE,EAAIA,EAAO,WAAY,KAAK,IAAK,KAAK,GAAI,EAAE,eAAgB,EAAI,CAE1G,CAQA,QAASA,EAAS,CAEjB,OAAO,KAAK,QAAQ,EAAIA,EAAO,IAAK,EAAG,CAAE,EAAIA,EAAO,WAAY,KAAK,IAAK,KAAK,GAAI,CAEpF,CAQA,cAAegD,EAAQ,CAEtB,YAAK,IAAI,IAAKA,CAAM,EACpB,KAAK,IAAI,IAAKA,CAAM,EAEb,IAER,CAWA,eAAgB2jC,EAAS,CAExB,YAAK,IAAI,IAAKA,CAAO,EACrB,KAAK,IAAI,IAAKA,CAAO,EAEd,IAER,CASA,eAAgB3J,EAAS,CAExB,YAAK,IAAI,UAAW,CAAEA,CAAO,EAC7B,KAAK,IAAI,UAAWA,CAAO,EAEpB,IAER,CAQA,cAAeh6B,EAAQ,CAEtB,OAAOA,EAAM,GAAK,KAAK,IAAI,GAAKA,EAAM,GAAK,KAAK,IAAI,GACnDA,EAAM,GAAK,KAAK,IAAI,GAAKA,EAAM,GAAK,KAAK,IAAI,CAE/C,CASA,YAAa0jC,EAAM,CAElB,OAAO,KAAK,IAAI,GAAKA,EAAI,IAAI,GAAKA,EAAI,IAAI,GAAK,KAAK,IAAI,GACvD,KAAK,IAAI,GAAKA,EAAI,IAAI,GAAKA,EAAI,IAAI,GAAK,KAAK,IAAI,CAEnD,CASA,aAAc1jC,EAAOhD,EAAS,CAK7B,OAAOA,EAAO,KACXgD,EAAM,EAAI,KAAK,IAAI,IAAQ,KAAK,IAAI,EAAI,KAAK,IAAI,IACjDA,EAAM,EAAI,KAAK,IAAI,IAAQ,KAAK,IAAI,EAAI,KAAK,IAAI,EACpD,CAED,CAQA,cAAe0jC,EAAM,CAIpB,OAAOA,EAAI,IAAI,GAAK,KAAK,IAAI,GAAKA,EAAI,IAAI,GAAK,KAAK,IAAI,GACvDA,EAAI,IAAI,GAAK,KAAK,IAAI,GAAKA,EAAI,IAAI,GAAK,KAAK,IAAI,CAEnD,CASA,WAAY1jC,EAAOhD,EAAS,CAE3B,OAAOA,EAAO,KAAMgD,CAAM,EAAE,MAAO,KAAK,IAAK,KAAK,GAAI,CAEvD,CASA,gBAAiBA,EAAQ,CAExB,OAAO,KAAK,WAAYA,EAAOg3B,EAAU,EAAE,WAAYh3B,CAAM,CAE9D,CAWA,UAAW0jC,EAAM,CAEhB,YAAK,IAAI,IAAKA,EAAI,GAAI,EACtB,KAAK,IAAI,IAAKA,EAAI,GAAI,EAEjB,KAAK,QAAQ,GAAI,KAAK,UAAU,EAE9B,IAER,CAUA,MAAOA,EAAM,CAEZ,YAAK,IAAI,IAAKA,EAAI,GAAI,EACtB,KAAK,IAAI,IAAKA,EAAI,GAAI,EAEf,IAER,CASA,UAAWjJ,EAAS,CAEnB,YAAK,IAAI,IAAKA,CAAO,EACrB,KAAK,IAAI,IAAKA,CAAO,EAEd,IAER,CAQA,OAAQiJ,EAAM,CAEb,OAAOA,EAAI,IAAI,OAAQ,KAAK,GAAI,GAAKA,EAAI,IAAI,OAAQ,KAAK,GAAI,CAE/D,CAED,EAEMxM,GAAwB,IAAIl2B,EAC5Bm2B,GAA0B,IAAIn2B,EAE9Bo2B,GAAoB,IAAIp2B,EACxBq2B,GAAoB,IAAIr2B,EACxBs2B,GAAmB,IAAIt2B,EACvBu2B,IAAoB,IAAIv2B,EACxBw2B,IAAoB,IAAIx2B,EAKxBy2B,GAAN,KAAY,CAQX,YAAa3wB,EAAQ,IAAI9F,EAAW+F,EAAM,IAAI/F,EAAY,CAOzD,KAAK,MAAQ8F,EAOb,KAAK,IAAMC,CAEZ,CASA,IAAKD,EAAOC,EAAM,CAEjB,YAAK,MAAM,KAAMD,CAAM,EACvB,KAAK,IAAI,KAAMC,CAAI,EAEZ,IAER,CAQA,KAAMixC,EAAO,CAEZ,YAAK,MAAM,KAAMA,EAAK,KAAM,EAC5B,KAAK,IAAI,KAAMA,EAAK,GAAI,EAEjB,IAER,CAQA,UAAWh7C,EAAS,CAEnB,OAAOA,EAAO,WAAY,KAAK,MAAO,KAAK,GAAI,EAAE,eAAgB,EAAI,CAEtE,CAQA,MAAOA,EAAS,CAEf,OAAOA,EAAO,WAAY,KAAK,IAAK,KAAK,KAAM,CAEhD,CAOA,YAAa,CAEZ,OAAO,KAAK,MAAM,kBAAmB,KAAK,GAAI,CAE/C,CAOA,UAAW,CAEV,OAAO,KAAK,MAAM,WAAY,KAAK,GAAI,CAExC,CASA,GAAIxC,EAAGwC,EAAS,CAEf,OAAO,KAAK,MAAOA,CAAO,EAAE,eAAgBxC,CAAE,EAAE,IAAK,KAAK,KAAM,CAEjE,CASA,6BAA8BwF,EAAOojE,EAAc,CAElDlsC,GAAQ,WAAYl3B,EAAO,KAAK,KAAM,EACtCm3B,GAAU,WAAY,KAAK,IAAK,KAAK,KAAM,EAE3C,IAAMksC,EAAYlsC,GAAU,IAAKA,EAAU,EAGvC38B,EAFoB28B,GAAU,IAAKD,EAAQ,EAErBmsC,EAE1B,OAAKD,IAEJ5oE,EAAIhC,GAAOgC,EAAG,EAAG,CAAE,GAIbA,CAER,CAUA,oBAAqBwF,EAAOojE,EAAapmE,EAAS,CAEjD,IAAMxC,EAAI,KAAK,6BAA8BwF,EAAOojE,CAAY,EAEhE,OAAO,KAAK,MAAOpmE,CAAO,EAAE,eAAgBxC,CAAE,EAAE,IAAK,KAAK,KAAM,CAEjE,CAUA,kBAAmBw9C,EAAM7zC,EAAKozB,IAAK77B,EAAK87B,IAAM,CAQ7C,IAAM8rC,EAAU,sBACZ,EAAG9oE,EAED8D,EAAK,KAAK,MACVC,EAAKy5C,EAAK,MACV9sC,EAAK,KAAK,IACVC,EAAK6sC,EAAK,IAEhB5gB,GAAI,WAAYlsB,EAAI5M,CAAG,EACvB+4B,GAAI,WAAYlsB,EAAI5M,CAAG,EACvB+4B,GAAG,WAAYh5B,EAAIC,CAAG,EAEtB,IAAMnD,EAAIg8B,GAAI,IAAKA,EAAI,EACjBr4B,EAAIs4B,GAAI,IAAKA,EAAI,EACjB/3B,EAAI+3B,GAAI,IAAKC,EAAG,EAItB,GAAKl8B,GAAKkoE,GAAWvkE,GAAKukE,EAIzB,OAAAn/D,EAAG,KAAM7F,CAAG,EACZ5C,EAAG,KAAM6C,CAAG,EAEZ4F,EAAG,IAAKzI,CAAG,EAEJyI,EAAG,IAAKA,CAAG,EAInB,GAAK/I,GAAKkoE,EAIT,EAAI,EACJ9oE,EAAI8E,EAAIP,EACRvE,EAAIhC,GAAOgC,EAAG,EAAG,CAAE,MAGb,CAEN,IAAMc,EAAI87B,GAAI,IAAKE,EAAG,EAEtB,GAAKv4B,GAAKukE,EAIT9oE,EAAI,EACJ,EAAIhC,GAAO,CAAE8C,EAAIF,EAAG,EAAG,CAAE,MAEnB,CAIN,IAAMC,EAAI+7B,GAAI,IAAKC,EAAI,EACjBiV,EAAQlxC,EAAI2D,EAAI1D,EAAIA,EAKrBixC,IAAU,EAEd,EAAI9zC,IAAS6C,EAAIiE,EAAIhE,EAAIyD,GAAMutC,EAAO,EAAG,CAAE,EAI3C,EAAI,EAOL9xC,GAAMa,EAAI,EAAIiE,GAAMP,EAMfvE,EAAI,GAERA,EAAI,EACJ,EAAIhC,GAAO,CAAE8C,EAAIF,EAAG,EAAG,CAAE,GAEdZ,EAAI,IAEfA,EAAI,EACJ,EAAIhC,IAAS6C,EAAIC,GAAMF,EAAG,EAAG,CAAE,EAIjC,CAED,CAEA,OAAA+I,EAAG,KAAM7F,CAAG,EAAE,IAAK84B,GAAI,eAAgB,CAAE,CAAE,EAC3C17B,EAAG,KAAM6C,CAAG,EAAE,IAAK84B,GAAI,eAAgB78B,CAAE,CAAE,EAE3C2J,EAAG,IAAKzI,CAAG,EAEJyI,EAAG,IAAKA,CAAG,CAEnB,CAQA,aAAcu9B,EAAS,CAEtB,YAAK,MAAM,aAAcA,CAAO,EAChC,KAAK,IAAI,aAAcA,CAAO,EAEvB,IAER,CAQA,OAAQsW,EAAO,CAEd,OAAOA,EAAK,MAAM,OAAQ,KAAK,KAAM,GAAKA,EAAK,IAAI,OAAQ,KAAK,GAAI,CAErE,CAOA,OAAQ,CAEP,OAAO,IAAI,KAAK,YAAY,EAAE,KAAM,IAAK,CAE1C,CAED,EAEMtgB,GAA0B,IAAI12B,EAgB9B22B,GAAN,cAA8BzU,EAAS,CAStC,YAAa2zC,EAAOt6D,EAAQ,CAE3B,MAAM,EAON,KAAK,MAAQs6D,EAEb,KAAK,iBAAmB,GAQxB,KAAK,MAAQt6D,EAEb,KAAK,KAAO,kBAEZ,IAAM2U,EAAW,IAAI2U,GAEf09C,EAAY,CACjB,EAAG,EAAG,EAAI,EAAG,EAAG,EAChB,EAAG,EAAG,EAAI,EAAG,EAAG,EAChB,EAAG,EAAG,EAAG,GAAI,EAAG,EAChB,EAAG,EAAG,EAAI,EAAG,EAAG,EAChB,EAAG,EAAG,EAAI,EAAG,GAAI,CAClB,EAEA,QAAUjtE,EAAI,EAAG4H,EAAI,EAAGgO,EAAI,GAAI5V,EAAI4V,EAAG5V,IAAM4H,IAAO,CAEnD,IAAMI,EAAOhI,EAAI4V,EAAM,KAAK,GAAK,EAC3B3N,EAAOL,EAAIgO,EAAM,KAAK,GAAK,EAEjCq3D,EAAU,KACT,KAAK,IAAKjlE,CAAG,EAAG,KAAK,IAAKA,CAAG,EAAG,EAChC,KAAK,IAAKC,CAAG,EAAG,KAAK,IAAKA,CAAG,EAAG,CACjC,CAED,CAEA2S,EAAS,aAAc,WAAY,IAAImU,GAAwBk+C,EAAW,CAAE,CAAE,EAE9E,IAAM7jE,EAAW,IAAIksB,GAAmB,CAAE,IAAK,GAAO,WAAY,EAAM,CAAE,EAE1E,KAAK,KAAO,IAAIO,GAAcjb,EAAUxR,CAAS,EACjD,KAAK,IAAK,KAAK,IAAK,EAEpB,KAAK,OAAO,CAEb,CAMA,SAAU,CAET,KAAK,KAAK,SAAS,QAAQ,EAC3B,KAAK,KAAK,SAAS,QAAQ,CAE5B,CAMA,QAAS,CAER,KAAK,MAAM,kBAAmB,GAAM,EAAM,EAC1C,KAAK,MAAM,OAAO,kBAAmB,GAAM,EAAM,EAG5C,KAAK,QAET,KAAK,OAAO,kBAAmB,EAAK,EAEpC,KAAK,OACH,KAAM,KAAK,OAAO,WAAY,EAC9B,OAAO,EACP,SAAU,KAAK,MAAM,WAAY,GAInC,KAAK,OAAO,KAAM,KAAK,MAAM,WAAY,EAI1C,KAAK,YAAY,KAAM,KAAK,MAAM,WAAY,EAE9C,IAAM8jE,EAAa,KAAK,MAAM,SAAW,KAAK,MAAM,SAAW,IACzDC,EAAYD,EAAa,KAAK,IAAK,KAAK,MAAM,KAAM,EAE1D,KAAK,KAAK,MAAM,IAAKC,EAAWA,EAAWD,CAAW,EAEtD9rC,GAAU,sBAAuB,KAAK,MAAM,OAAO,WAAY,EAE/D,KAAK,KAAK,OAAQA,EAAU,EAEvB,KAAK,QAAU,OAEnB,KAAK,KAAK,SAAS,MAAM,IAAK,KAAK,KAAM,EAIzC,KAAK,KAAK,SAAS,MAAM,KAAM,KAAK,MAAM,KAAM,CAIlD,CAED,EAEME,GAA0B,IAAI52B,EAC9B62B,GAA4B,IAAItW,GAChCuW,GAAgC,IAAIvW,GAYpCwW,GAAN,cAA6B5L,EAAa,CAQzC,YAAa1sB,EAAS,CAErB,IAAMs3C,EAAQjmC,GAAarR,CAAO,EAE5ByR,EAAW,IAAI2U,GAEfzZ,EAAW,CAAC,EACZs3D,EAAS,CAAC,EAEhB,QAAUptE,EAAI,EAAGA,EAAIygD,EAAM,OAAQzgD,IAAO,CAEzC,IAAM4gD,EAAOH,EAAOzgD,CAAE,EAEjB4gD,EAAK,QAAUA,EAAK,OAAO,SAE/B9qC,EAAS,KAAM,EAAG,EAAG,CAAE,EACvBA,EAAS,KAAM,EAAG,EAAG,CAAE,EACvBs3D,EAAO,KAAM,EAAG,EAAG,CAAE,EACrBA,EAAO,KAAM,EAAG,EAAG,CAAE,EAIvB,CAEAxyD,EAAS,aAAc,WAAY,IAAImU,GAAwBjZ,EAAU,CAAE,CAAE,EAC7E8E,EAAS,aAAc,QAAS,IAAImU,GAAwBq+C,EAAQ,CAAE,CAAE,EAExE,IAAMhkE,EAAW,IAAIksB,GAAmB,CAAE,aAAc,GAAM,UAAW,GAAO,WAAY,GAAO,WAAY,GAAO,YAAa,EAAK,CAAE,EAE1I,MAAO1a,EAAUxR,CAAS,EAS1B,KAAK,iBAAmB,GAExB,KAAK,KAAO,iBAOZ,KAAK,KAAOD,EAOZ,KAAK,MAAQs3C,EAEb,KAAK,OAASt3C,EAAO,YACrB,KAAK,iBAAmB,GAIxB,IAAMmuC,EAAS,IAAIzpB,GAAO,GAAS,EAC7B0pB,EAAS,IAAI1pB,GAAO,KAAS,EAEnC,KAAK,UAAWypB,EAAQC,CAAO,CAEhC,CAEA,kBAAmBlD,EAAQ,CAE1B,IAAMoM,EAAQ,KAAK,MAEb7lC,EAAW,KAAK,SAChBI,EAAWJ,EAAS,aAAc,UAAW,EAEnD4mB,GAAgB,KAAM,KAAK,KAAK,WAAY,EAAE,OAAO,EAErD,QAAUxhC,EAAI,EAAG4H,EAAI,EAAG5H,EAAIygD,EAAM,OAAQzgD,IAAO,CAEhD,IAAM4gD,EAAOH,EAAOzgD,CAAE,EAEjB4gD,EAAK,QAAUA,EAAK,OAAO,SAE/Brf,GAAY,iBAAkBC,GAAiBof,EAAK,WAAY,EAChEtf,GAAU,sBAAuBC,EAAY,EAC7CvmB,EAAS,OAAQpT,EAAG05B,GAAU,EAAGA,GAAU,EAAGA,GAAU,CAAE,EAE1DC,GAAY,iBAAkBC,GAAiBof,EAAK,OAAO,WAAY,EACvEtf,GAAU,sBAAuBC,EAAY,EAC7CvmB,EAAS,OAAQpT,EAAI,EAAG05B,GAAU,EAAGA,GAAU,EAAGA,GAAU,CAAE,EAE9D15B,GAAK,EAIP,CAEAgT,EAAS,aAAc,UAAW,EAAE,YAAc,GAElD,MAAM,kBAAmBy5B,CAAM,CAEhC,CASA,UAAWiD,EAAQC,EAAS,CAG3B,IAAM81B,EADW,KAAK,SACU,aAAc,OAAQ,EAEtD,QAAUrtE,EAAI,EAAGA,EAAIqtE,EAAe,MAAOrtE,GAAK,EAE/CqtE,EAAe,OAAQrtE,EAAGs3C,EAAO,EAAGA,EAAO,EAAGA,EAAO,CAAE,EACvD+1B,EAAe,OAAQrtE,EAAI,EAAGu3C,EAAO,EAAGA,EAAO,EAAGA,EAAO,CAAE,EAI5D,OAAA81B,EAAe,YAAc,GAEtB,IAER,CAMA,SAAU,CAET,KAAK,SAAS,QAAQ,EACtB,KAAK,SAAS,QAAQ,CAEvB,CAED,EAuCM3rC,GAAN,cAA+B5R,EAAK,CAUnC,YAAaywC,EAAO+M,EAAYrnE,EAAQ,CAEvC,IAAM2U,EAAW,IAAIue,GAAgBm0C,EAAY,EAAG,CAAE,EAChDlkE,EAAW,IAAI6kB,GAAmB,CAAE,UAAW,GAAM,IAAK,GAAO,WAAY,EAAM,CAAE,EAE3F,MAAOrT,EAAUxR,CAAS,EAO1B,KAAK,MAAQm3D,EAQb,KAAK,MAAQt6D,EAEb,KAAK,KAAO,mBAEZ,KAAK,OAAS,KAAK,MAAM,YACzB,KAAK,iBAAmB,GAExB,KAAK,OAAO,CA0Bb,CAMA,SAAU,CAET,KAAK,SAAS,QAAQ,EACtB,KAAK,SAAS,QAAQ,CAEvB,CAMA,QAAS,CAER,KAAK,MAAM,kBAAmB,GAAM,EAAM,EAErC,KAAK,QAAU,OAEnB,KAAK,SAAS,MAAM,IAAK,KAAK,KAAM,EAIpC,KAAK,SAAS,MAAM,KAAM,KAAK,MAAM,KAAM,CAmB7C,CAED,EAEM07B,IAA0B,IAAIj3B,EAC9Bk3B,GAAwB,IAAI/T,GAC5BgU,GAAwB,IAAIhU,GAc5BiU,GAAN,cAAoClV,EAAS,CAU5C,YAAa2zC,EAAOtzB,EAAMhnC,EAAQ,CAEjC,MAAM,EAON,KAAK,MAAQs6D,EAEb,KAAK,OAASA,EAAM,YACpB,KAAK,iBAAmB,GAQxB,KAAK,MAAQt6D,EAEb,KAAK,KAAO,wBAEZ,IAAM2U,EAAW,IAAIme,GAAoBkU,CAAK,EAC9CryB,EAAS,QAAS,KAAK,GAAK,EAAI,EAEhC,KAAK,SAAW,IAAIqT,GAAmB,CAAE,UAAW,GAAM,IAAK,GAAO,WAAY,EAAM,CAAE,EACrF,KAAK,QAAU,SAAY,KAAK,SAAS,aAAe,IAE7D,IAAMjT,EAAWJ,EAAS,aAAc,UAAW,EAC7CwyD,EAAS,IAAI,aAAcpyD,EAAS,MAAQ,CAAE,EAEpDJ,EAAS,aAAc,QAAS,IAAI0T,GAAiB8+C,EAAQ,CAAE,CAAE,EAEjE,KAAK,IAAK,IAAIt9C,GAAMlV,EAAU,KAAK,QAAS,CAAE,EAE9C,KAAK,OAAO,CAEb,CAMA,SAAU,CAET,KAAK,SAAU,CAAE,EAAE,SAAS,QAAQ,EACpC,KAAK,SAAU,CAAE,EAAE,SAAS,QAAQ,CAErC,CAMA,QAAS,CAER,IAAMyjC,EAAO,KAAK,SAAU,CAAE,EAE9B,GAAK,KAAK,QAAU,OAEnB,KAAK,SAAS,MAAM,IAAK,KAAK,KAAM,MAE9B,CAEN,IAAM+uB,EAAS/uB,EAAK,SAAS,aAAc,OAAQ,EAEnDzc,GAAQ,KAAM,KAAK,MAAM,KAAM,EAC/BC,GAAQ,KAAM,KAAK,MAAM,WAAY,EAErC,QAAU7hC,EAAI,EAAG4V,EAAIw3D,EAAO,MAAOptE,EAAI4V,EAAG5V,IAAO,CAEhD,IAAMiG,EAAUjG,EAAM4V,EAAI,EAAQgsB,GAAUC,GAE5CurC,EAAO,OAAQptE,EAAGiG,EAAM,EAAGA,EAAM,EAAGA,EAAM,CAAE,CAE7C,CAEAmnE,EAAO,YAAc,EAEtB,CAEA,KAAK,MAAM,kBAAmB,GAAM,EAAM,EAE1C/uB,EAAK,OAAQ1c,IAAU,sBAAuB,KAAK,MAAM,WAAY,EAAE,OAAO,CAAE,CAEjF,CAED,EAgBMI,GAAN,cAAyBlM,EAAa,CAUrC,YAAaoX,EAAO,GAAIue,EAAY,GAAIlU,EAAS,QAAUC,EAAS,QAAW,CAE9ED,EAAS,IAAIzpB,GAAOypB,CAAO,EAC3BC,EAAS,IAAI1pB,GAAO0pB,CAAO,EAE3B,IAAMzrC,EAAS0/C,EAAY,EACrBplB,EAAO6G,EAAOue,EACdte,EAAWD,EAAO,EAElBn3B,EAAW,CAAC,EAAGs3D,EAAS,CAAC,EAE/B,QAAUptE,EAAI,EAAG4H,EAAI,EAAGmH,EAAI,CAAEm+B,EAAUltC,GAAKwrD,EAAWxrD,IAAM+O,GAAKq3B,EAAO,CAEzEtwB,EAAS,KAAM,CAAEo3B,EAAU,EAAGn+B,EAAGm+B,EAAU,EAAGn+B,CAAE,EAChD+G,EAAS,KAAM/G,EAAG,EAAG,CAAEm+B,EAAUn+B,EAAG,EAAGm+B,CAAS,EAEhD,IAAMjnC,EAAQjG,IAAM8L,EAASwrC,EAASC,EAEtCtxC,EAAM,QAASmnE,EAAQxlE,CAAE,EAAGA,GAAK,EACjC3B,EAAM,QAASmnE,EAAQxlE,CAAE,EAAGA,GAAK,EACjC3B,EAAM,QAASmnE,EAAQxlE,CAAE,EAAGA,GAAK,EACjC3B,EAAM,QAASmnE,EAAQxlE,CAAE,EAAGA,GAAK,CAElC,CAEA,IAAMgT,EAAW,IAAI2U,GACrB3U,EAAS,aAAc,WAAY,IAAImU,GAAwBjZ,EAAU,CAAE,CAAE,EAC7E8E,EAAS,aAAc,QAAS,IAAImU,GAAwBq+C,EAAQ,CAAE,CAAE,EAExE,IAAMhkE,EAAW,IAAIksB,GAAmB,CAAE,aAAc,GAAM,WAAY,EAAM,CAAE,EAElF,MAAO1a,EAAUxR,CAAS,EAE1B,KAAK,KAAO,YAEb,CAMA,SAAU,CAET,KAAK,SAAS,QAAQ,EACtB,KAAK,SAAS,QAAQ,CAEvB,CAED,EAkBM44B,GAAN,cAA8BnM,EAAa,CAY1C,YAAaqS,EAAS,GAAIqlC,EAAU,GAAIC,EAAQ,EAAGhiB,EAAY,GAAIlU,EAAS,QAAUC,EAAS,QAAW,CAEzGD,EAAS,IAAIzpB,GAAOypB,CAAO,EAC3BC,EAAS,IAAI1pB,GAAO0pB,CAAO,EAE3B,IAAMzhC,EAAW,CAAC,EACZs3D,EAAS,CAAC,EAIhB,GAAKG,EAAU,EAEd,QAAUvtE,EAAI,EAAGA,EAAIutE,EAASvtE,IAAO,CAEpC,IAAM2jC,EAAM3jC,EAAIutE,GAAc,KAAK,GAAK,GAElC7qE,EAAI,KAAK,IAAKihC,CAAE,EAAIuE,EACpBptB,EAAI,KAAK,IAAK6oB,CAAE,EAAIuE,EAE1BpyB,EAAS,KAAM,EAAG,EAAG,CAAE,EACvBA,EAAS,KAAMpT,EAAG,EAAGoY,CAAE,EAEvB,IAAM7U,EAAUjG,EAAI,EAAMs3C,EAASC,EAEnC61B,EAAO,KAAMnnE,EAAM,EAAGA,EAAM,EAAGA,EAAM,CAAE,EACvCmnE,EAAO,KAAMnnE,EAAM,EAAGA,EAAM,EAAGA,EAAM,CAAE,CAExC,CAMD,QAAUjG,EAAI,EAAGA,EAAIwtE,EAAOxtE,IAAO,CAElC,IAAMiG,EAAUjG,EAAI,EAAMs3C,EAASC,EAE7BzvC,EAAIogC,EAAWA,EAASslC,EAAQxtE,EAEtC,QAAU4H,EAAI,EAAGA,EAAI4jD,EAAW5jD,IAAO,CAItC,IAAI+7B,EAAM/7B,EAAI4jD,GAAgB,KAAK,GAAK,GAEpC9oD,EAAI,KAAK,IAAKihC,CAAE,EAAI77B,EACpBgT,EAAI,KAAK,IAAK6oB,CAAE,EAAI77B,EAExBgO,EAAS,KAAMpT,EAAG,EAAGoY,CAAE,EACvBsyD,EAAO,KAAMnnE,EAAM,EAAGA,EAAM,EAAGA,EAAM,CAAE,EAIvC09B,GAAQ/7B,EAAI,GAAM4jD,GAAgB,KAAK,GAAK,GAE5C9oD,EAAI,KAAK,IAAKihC,CAAE,EAAI77B,EACpBgT,EAAI,KAAK,IAAK6oB,CAAE,EAAI77B,EAEpBgO,EAAS,KAAMpT,EAAG,EAAGoY,CAAE,EACvBsyD,EAAO,KAAMnnE,EAAM,EAAGA,EAAM,EAAGA,EAAM,CAAE,CAExC,CAED,CAEA,IAAM2U,EAAW,IAAI2U,GACrB3U,EAAS,aAAc,WAAY,IAAImU,GAAwBjZ,EAAU,CAAE,CAAE,EAC7E8E,EAAS,aAAc,QAAS,IAAImU,GAAwBq+C,EAAQ,CAAE,CAAE,EAExE,IAAMhkE,EAAW,IAAIksB,GAAmB,CAAE,aAAc,GAAM,WAAY,EAAM,CAAE,EAElF,MAAO1a,EAAUxR,CAAS,EAE1B,KAAK,KAAO,iBAEb,CAMA,SAAU,CAET,KAAK,SAAS,QAAQ,EACtB,KAAK,SAAS,QAAQ,CAEvB,CAED,EAEM64B,GAAoB,IAAIv3B,EACxBw3B,GAAoB,IAAIx3B,EACxBy3B,GAAoB,IAAIz3B,EAiBxB03B,GAAN,cAAqCxV,EAAS,CAU7C,YAAa2zC,EAAOtzB,EAAMhnC,EAAQ,CAEjC,MAAM,EAON,KAAK,MAAQs6D,EAEb,KAAK,OAASA,EAAM,YACpB,KAAK,iBAAmB,GAQxB,KAAK,MAAQt6D,EAEb,KAAK,KAAO,yBAEPgnC,IAAS,SAAYA,EAAO,GAEjC,IAAIryB,EAAW,IAAI2U,GACnB3U,EAAS,aAAc,WAAY,IAAImU,GAAwB,CAC9D,CAAEke,EAAMA,EAAM,EACdA,EAAMA,EAAM,EACZA,EAAM,CAAEA,EAAM,EACd,CAAEA,EAAM,CAAEA,EAAM,EAChB,CAAEA,EAAMA,EAAM,CACf,EAAG,CAAE,CAAE,EAEP,IAAM7jC,EAAW,IAAIksB,GAAmB,CAAE,IAAK,GAAO,WAAY,EAAM,CAAE,EAO1E,KAAK,WAAa,IAAII,GAAM9a,EAAUxR,CAAS,EAC/C,KAAK,IAAK,KAAK,UAAW,EAE1BwR,EAAW,IAAI2U,GACf3U,EAAS,aAAc,WAAY,IAAImU,GAAwB,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,CAAE,EAOzF,KAAK,WAAa,IAAI2G,GAAM9a,EAAUxR,CAAS,EAC/C,KAAK,IAAK,KAAK,UAAW,EAE1B,KAAK,OAAO,CAEb,CAMA,SAAU,CAET,KAAK,WAAW,SAAS,QAAQ,EACjC,KAAK,WAAW,SAAS,QAAQ,EACjC,KAAK,WAAW,SAAS,QAAQ,EACjC,KAAK,WAAW,SAAS,QAAQ,CAElC,CAMA,QAAS,CAER,KAAK,MAAM,kBAAmB,GAAM,EAAM,EAC1C,KAAK,MAAM,OAAO,kBAAmB,GAAM,EAAM,EAEjD64B,GAAI,sBAAuB,KAAK,MAAM,WAAY,EAClDC,GAAI,sBAAuB,KAAK,MAAM,OAAO,WAAY,EACzDC,GAAI,WAAYD,GAAKD,EAAI,EAEzB,KAAK,WAAW,OAAQC,EAAI,EAEvB,KAAK,QAAU,QAEnB,KAAK,WAAW,SAAS,MAAM,IAAK,KAAK,KAAM,EAC/C,KAAK,WAAW,SAAS,MAAM,IAAK,KAAK,KAAM,IAI/C,KAAK,WAAW,SAAS,MAAM,KAAM,KAAK,MAAM,KAAM,EACtD,KAAK,WAAW,SAAS,MAAM,KAAM,KAAK,MAAM,KAAM,GAIvD,KAAK,WAAW,OAAQA,EAAI,EAC5B,KAAK,WAAW,MAAM,EAAIC,GAAI,OAAO,CAEtC,CAED,EAEMpnB,GAAwB,IAAIrQ,EAC5B23B,GAAwB,IAAIjS,GAkB5BkS,GAAN,cAA2BzM,EAAa,CAOvC,YAAahb,EAAS,CAErB,IAAMD,EAAW,IAAI2U,GACfnmB,EAAW,IAAIksB,GAAmB,CAAE,MAAO,SAAU,aAAc,GAAM,WAAY,EAAM,CAAE,EAE7Fxf,EAAW,CAAC,EACZs3D,EAAS,CAAC,EAEVzyD,EAAW,CAAC,EAIlB8yD,EAAS,KAAM,IAAK,EACpBA,EAAS,KAAM,IAAK,EACpBA,EAAS,KAAM,IAAK,EACpBA,EAAS,KAAM,IAAK,EAIpBA,EAAS,KAAM,IAAK,EACpBA,EAAS,KAAM,IAAK,EACpBA,EAAS,KAAM,IAAK,EACpBA,EAAS,KAAM,IAAK,EAIpBA,EAAS,KAAM,IAAK,EACpBA,EAAS,KAAM,IAAK,EACpBA,EAAS,KAAM,IAAK,EACpBA,EAAS,KAAM,IAAK,EAIpBA,EAAS,IAAK,IAAK,EACnBA,EAAS,IAAK,IAAK,EACnBA,EAAS,IAAK,IAAK,EACnBA,EAAS,IAAK,IAAK,EAInBA,EAAS,KAAM,IAAK,EACpBA,EAAS,KAAM,IAAK,EACpBA,EAAS,KAAM,IAAK,EAIpBA,EAAS,IAAK,GAAI,EAClBA,EAAS,IAAK,GAAI,EAIlBA,EAAS,MAAO,KAAM,EACtBA,EAAS,MAAO,KAAM,EAEtBA,EAAS,MAAO,KAAM,EACtBA,EAAS,MAAO,KAAM,EAEtB,SAASA,EAAS3oE,EAAGC,EAAI,CAExB2oE,EAAU5oE,CAAE,EACZ4oE,EAAU3oE,CAAE,CAEb,CAEA,SAAS2oE,EAAUt5B,EAAK,CAEvBt+B,EAAS,KAAM,EAAG,EAAG,CAAE,EACvBs3D,EAAO,KAAM,EAAG,EAAG,CAAE,EAEhBzyD,EAAUy5B,CAAG,IAAM,SAEvBz5B,EAAUy5B,CAAG,EAAI,CAAC,GAInBz5B,EAAUy5B,CAAG,EAAE,KAAQt+B,EAAS,OAAS,EAAM,CAAE,CAElD,CAEA8E,EAAS,aAAc,WAAY,IAAImU,GAAwBjZ,EAAU,CAAE,CAAE,EAC7E8E,EAAS,aAAc,QAAS,IAAImU,GAAwBq+C,EAAQ,CAAE,CAAE,EAExE,MAAOxyD,EAAUxR,CAAS,EAE1B,KAAK,KAAO,eAOZ,KAAK,OAASyR,EACT,KAAK,OAAO,wBAAyB,KAAK,OAAO,uBAAuB,EAE7E,KAAK,OAASA,EAAO,YACrB,KAAK,iBAAmB,GAOxB,KAAK,SAAWF,EAEhB,KAAK,OAAO,EAIZ,IAAMgzD,EAAe,IAAI9/C,GAAO,QAAS,EACnC+/C,EAAY,IAAI//C,GAAO,QAAS,EAChCggD,EAAU,IAAIhgD,GAAO,KAAS,EAC9BigD,EAAc,IAAIjgD,GAAO,QAAS,EAClCkgD,EAAa,IAAIlgD,GAAO,OAAS,EAEvC,KAAK,UAAW8/C,EAAcC,EAAWC,EAASC,EAAaC,CAAW,CAE3E,CAYA,UAAW7rB,EAAS8rB,EAAM78B,EAAIzqC,EAAQunE,EAAQ,CAI7C,IAAMZ,EAFW,KAAK,SAEU,aAAc,OAAQ,EAItD,OAAAA,EAAe,OAAQ,EAAGnrB,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,CAAE,EAAGmrB,EAAe,OAAQ,EAAGnrB,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,CAAE,EACvHmrB,EAAe,OAAQ,EAAGnrB,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,CAAE,EAAGmrB,EAAe,OAAQ,EAAGnrB,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,CAAE,EACvHmrB,EAAe,OAAQ,EAAGnrB,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,CAAE,EAAGmrB,EAAe,OAAQ,EAAGnrB,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,CAAE,EACvHmrB,EAAe,OAAQ,EAAGnrB,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,CAAE,EAAGmrB,EAAe,OAAQ,EAAGnrB,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,CAAE,EAIvHmrB,EAAe,OAAQ,EAAGnrB,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,CAAE,EAAGmrB,EAAe,OAAQ,EAAGnrB,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,CAAE,EACvHmrB,EAAe,OAAQ,GAAInrB,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,CAAE,EAAGmrB,EAAe,OAAQ,GAAInrB,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,CAAE,EACzHmrB,EAAe,OAAQ,GAAInrB,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,CAAE,EAAGmrB,EAAe,OAAQ,GAAInrB,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,CAAE,EACzHmrB,EAAe,OAAQ,GAAInrB,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,CAAE,EAAGmrB,EAAe,OAAQ,GAAInrB,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,CAAE,EAIzHmrB,EAAe,OAAQ,GAAInrB,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,CAAE,EAAGmrB,EAAe,OAAQ,GAAInrB,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,CAAE,EACzHmrB,EAAe,OAAQ,GAAInrB,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,CAAE,EAAGmrB,EAAe,OAAQ,GAAInrB,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,CAAE,EACzHmrB,EAAe,OAAQ,GAAInrB,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,CAAE,EAAGmrB,EAAe,OAAQ,GAAInrB,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,CAAE,EACzHmrB,EAAe,OAAQ,GAAInrB,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,CAAE,EAAGmrB,EAAe,OAAQ,GAAInrB,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,CAAE,EAIzHmrB,EAAe,OAAQ,GAAIW,EAAK,EAAGA,EAAK,EAAGA,EAAK,CAAE,EAAGX,EAAe,OAAQ,GAAIW,EAAK,EAAGA,EAAK,EAAGA,EAAK,CAAE,EACvGX,EAAe,OAAQ,GAAIW,EAAK,EAAGA,EAAK,EAAGA,EAAK,CAAE,EAAGX,EAAe,OAAQ,GAAIW,EAAK,EAAGA,EAAK,EAAGA,EAAK,CAAE,EACvGX,EAAe,OAAQ,GAAIW,EAAK,EAAGA,EAAK,EAAGA,EAAK,CAAE,EAAGX,EAAe,OAAQ,GAAIW,EAAK,EAAGA,EAAK,EAAGA,EAAK,CAAE,EACvGX,EAAe,OAAQ,GAAIW,EAAK,EAAGA,EAAK,EAAGA,EAAK,CAAE,EAAGX,EAAe,OAAQ,GAAIW,EAAK,EAAGA,EAAK,EAAGA,EAAK,CAAE,EAIvGX,EAAe,OAAQ,GAAIl8B,EAAG,EAAGA,EAAG,EAAGA,EAAG,CAAE,EAAGk8B,EAAe,OAAQ,GAAIl8B,EAAG,EAAGA,EAAG,EAAGA,EAAG,CAAE,EAC3Fk8B,EAAe,OAAQ,GAAIl8B,EAAG,EAAGA,EAAG,EAAGA,EAAG,CAAE,EAAGk8B,EAAe,OAAQ,GAAIl8B,EAAG,EAAGA,EAAG,EAAGA,EAAG,CAAE,EAC3Fk8B,EAAe,OAAQ,GAAIl8B,EAAG,EAAGA,EAAG,EAAGA,EAAG,CAAE,EAAGk8B,EAAe,OAAQ,GAAIl8B,EAAG,EAAGA,EAAG,EAAGA,EAAG,CAAE,EAI3Fk8B,EAAe,OAAQ,GAAI3mE,EAAO,EAAGA,EAAO,EAAGA,EAAO,CAAE,EAAG2mE,EAAe,OAAQ,GAAI3mE,EAAO,EAAGA,EAAO,EAAGA,EAAO,CAAE,EACnH2mE,EAAe,OAAQ,GAAIY,EAAM,EAAGA,EAAM,EAAGA,EAAM,CAAE,EAAGZ,EAAe,OAAQ,GAAIY,EAAM,EAAGA,EAAM,EAAGA,EAAM,CAAE,EAI7GZ,EAAe,OAAQ,GAAIY,EAAM,EAAGA,EAAM,EAAGA,EAAM,CAAE,EAAGZ,EAAe,OAAQ,GAAIY,EAAM,EAAGA,EAAM,EAAGA,EAAM,CAAE,EAC7GZ,EAAe,OAAQ,GAAIY,EAAM,EAAGA,EAAM,EAAGA,EAAM,CAAE,EAAGZ,EAAe,OAAQ,GAAIY,EAAM,EAAGA,EAAM,EAAGA,EAAM,CAAE,EAE7GZ,EAAe,OAAQ,GAAIY,EAAM,EAAGA,EAAM,EAAGA,EAAM,CAAE,EAAGZ,EAAe,OAAQ,GAAIY,EAAM,EAAGA,EAAM,EAAGA,EAAM,CAAE,EAC7GZ,EAAe,OAAQ,GAAIY,EAAM,EAAGA,EAAM,EAAGA,EAAM,CAAE,EAAGZ,EAAe,OAAQ,GAAIY,EAAM,EAAGA,EAAM,EAAGA,EAAM,CAAE,EAE7GZ,EAAe,YAAc,GAEtB,IAER,CAKA,QAAS,CAER,IAAMzyD,EAAW,KAAK,SAChBD,EAAW,KAAK,SAEhB2pB,EAAI,EAAGsG,EAAI,EAEbsjC,EAAOC,EASX,GAJA9rC,GAAQ,wBAAwB,KAAM,KAAK,OAAO,uBAAwB,EAIrE,KAAK,OAAO,gBAAkB,GAElC6rC,EAAQ,EACRC,EAAO,UAIF,KAAK,OAAO,mBAAqBnmD,GAErCkmD,EAAQ,GACRC,EAAO,UAEI,KAAK,OAAO,mBAAqBlmD,GAE5CimD,EAAQ,EACRC,EAAO,MAIP,OAAM,IAAI,MAAO,2DAA6D,KAAK,OAAO,gBAAiB,EAQ7GzzD,GAAU,IAAKC,EAAUC,EAAUynB,GAAS,EAAG,EAAG6rC,CAAM,EACxDxzD,GAAU,IAAKC,EAAUC,EAAUynB,GAAS,EAAG,EAAG8rC,CAAK,EAIvDzzD,GAAU,KAAMC,EAAUC,EAAUynB,GAAS,CAAEiC,EAAG,CAAEsG,EAAGsjC,CAAM,EAC7DxzD,GAAU,KAAMC,EAAUC,EAAUynB,GAASiC,EAAG,CAAEsG,EAAGsjC,CAAM,EAC3DxzD,GAAU,KAAMC,EAAUC,EAAUynB,GAAS,CAAEiC,EAAGsG,EAAGsjC,CAAM,EAC3DxzD,GAAU,KAAMC,EAAUC,EAAUynB,GAASiC,EAAGsG,EAAGsjC,CAAM,EAIzDxzD,GAAU,KAAMC,EAAUC,EAAUynB,GAAS,CAAEiC,EAAG,CAAEsG,EAAGujC,CAAK,EAC5DzzD,GAAU,KAAMC,EAAUC,EAAUynB,GAASiC,EAAG,CAAEsG,EAAGujC,CAAK,EAC1DzzD,GAAU,KAAMC,EAAUC,EAAUynB,GAAS,CAAEiC,EAAGsG,EAAGujC,CAAK,EAC1DzzD,GAAU,KAAMC,EAAUC,EAAUynB,GAASiC,EAAGsG,EAAGujC,CAAK,EAIxDzzD,GAAU,KAAMC,EAAUC,EAAUynB,GAASiC,EAAI,GAAKsG,EAAI,IAAKsjC,CAAM,EACrExzD,GAAU,KAAMC,EAAUC,EAAUynB,GAAS,CAAEiC,EAAI,GAAKsG,EAAI,IAAKsjC,CAAM,EACvExzD,GAAU,KAAMC,EAAUC,EAAUynB,GAAS,EAAGuI,EAAI,EAAGsjC,CAAM,EAI7DxzD,GAAU,MAAOC,EAAUC,EAAUynB,GAAS,CAAEiC,EAAG,EAAG6pC,CAAK,EAC3DzzD,GAAU,MAAOC,EAAUC,EAAUynB,GAASiC,EAAG,EAAG6pC,CAAK,EACzDzzD,GAAU,MAAOC,EAAUC,EAAUynB,GAAS,EAAG,CAAEuI,EAAGujC,CAAK,EAC3DzzD,GAAU,MAAOC,EAAUC,EAAUynB,GAAS,EAAGuI,EAAGujC,CAAK,EAEzDzzD,GAAU,MAAOC,EAAUC,EAAUynB,GAAS,CAAEiC,EAAG,EAAG4pC,CAAM,EAC5DxzD,GAAU,MAAOC,EAAUC,EAAUynB,GAASiC,EAAG,EAAG4pC,CAAM,EAC1DxzD,GAAU,MAAOC,EAAUC,EAAUynB,GAAS,EAAG,CAAEuI,EAAGsjC,CAAM,EAC5DxzD,GAAU,MAAOC,EAAUC,EAAUynB,GAAS,EAAGuI,EAAGsjC,CAAM,EAE1DtzD,EAAS,aAAc,UAAW,EAAE,YAAc,EAEnD,CAMA,SAAU,CAET,KAAK,SAAS,QAAQ,EACtB,KAAK,SAAS,QAAQ,CAEvB,CAED,EAuBM2nB,GAAqB,IAAI/Y,GAmBzBgZ,GAAN,cAAwB3M,EAAa,CAQpC,YAAa1sB,EAAQlD,EAAQ,SAAW,CAEvC,IAAMk0C,EAAU,IAAI,YAAa,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAE,EACtG8yB,EAAY,IAAI,aAAc,EAAM,EAEpCryD,EAAW,IAAI2U,GACrB3U,EAAS,SAAU,IAAI0T,GAAiB6rB,EAAS,CAAE,CAAE,EACrDv/B,EAAS,aAAc,WAAY,IAAI0T,GAAiB2+C,EAAW,CAAE,CAAE,EAEvE,MAAOryD,EAAU,IAAI0a,GAAmB,CAAE,MAAOrvB,EAAO,WAAY,EAAM,CAAE,CAAE,EAO9E,KAAK,OAASkD,EACd,KAAK,KAAO,YAEZ,KAAK,iBAAmB,GAExB,KAAK,OAAO,CAEb,CAMA,QAAS,CAQR,GANK,KAAK,SAAW,QAEpBo5B,GAAK,cAAe,KAAK,MAAO,EAI5BA,GAAK,QAAQ,EAAI,OAEtB,IAAMngC,EAAMmgC,GAAK,IACXlgC,EAAMkgC,GAAK,IAkBXvnB,EAAW,KAAK,SAAS,WAAW,SACpCjb,EAAQib,EAAS,MAEvBjb,EAAO,CAAE,EAAIsC,EAAI,EAAGtC,EAAO,CAAE,EAAIsC,EAAI,EAAGtC,EAAO,CAAE,EAAIsC,EAAI,EACzDtC,EAAO,CAAE,EAAIqC,EAAI,EAAGrC,EAAO,CAAE,EAAIsC,EAAI,EAAGtC,EAAO,CAAE,EAAIsC,EAAI,EACzDtC,EAAO,CAAE,EAAIqC,EAAI,EAAGrC,EAAO,CAAE,EAAIqC,EAAI,EAAGrC,EAAO,CAAE,EAAIsC,EAAI,EACzDtC,EAAO,CAAE,EAAIsC,EAAI,EAAGtC,EAAO,EAAG,EAAIqC,EAAI,EAAGrC,EAAO,EAAG,EAAIsC,EAAI,EAC3DtC,EAAO,EAAG,EAAIsC,EAAI,EAAGtC,EAAO,EAAG,EAAIsC,EAAI,EAAGtC,EAAO,EAAG,EAAIqC,EAAI,EAC5DrC,EAAO,EAAG,EAAIqC,EAAI,EAAGrC,EAAO,EAAG,EAAIsC,EAAI,EAAGtC,EAAO,EAAG,EAAIqC,EAAI,EAC5DrC,EAAO,EAAG,EAAIqC,EAAI,EAAGrC,EAAO,EAAG,EAAIqC,EAAI,EAAGrC,EAAO,EAAG,EAAIqC,EAAI,EAC5DrC,EAAO,EAAG,EAAIsC,EAAI,EAAGtC,EAAO,EAAG,EAAIqC,EAAI,EAAGrC,EAAO,EAAG,EAAIqC,EAAI,EAE5D4Y,EAAS,YAAc,GAEvB,KAAK,SAAS,sBAAsB,CAErC,CAQA,cAAe7R,EAAS,CAEvB,YAAK,OAASA,EACd,KAAK,OAAO,EAEL,IAER,CAEA,KAAMgjC,EAAQ/xB,EAAY,CAEzB,aAAM,KAAM+xB,EAAQ/xB,CAAU,EAE9B,KAAK,OAAS+xB,EAAO,OAEd,IAER,CAMA,SAAU,CAET,KAAK,SAAS,QAAQ,EACtB,KAAK,SAAS,QAAQ,CAEvB,CAED,EAeM1J,GAAN,cAAyB5M,EAAa,CAQrC,YAAauX,EAAKnnC,EAAQ,SAAW,CAEpC,IAAMk0C,EAAU,IAAI,YAAa,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAE,EAEtG8yB,EAAY,CAAE,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,GAAI,GAAI,EAAG,GAAI,GAAI,GAAI,GAAI,EAAG,GAAI,EAAG,EAEjGryD,EAAW,IAAI2U,GAErB3U,EAAS,SAAU,IAAI0T,GAAiB6rB,EAAS,CAAE,CAAE,EAErDv/B,EAAS,aAAc,WAAY,IAAImU,GAAwBk+C,EAAW,CAAE,CAAE,EAE9E,MAAOryD,EAAU,IAAI0a,GAAmB,CAAE,MAAOrvB,EAAO,WAAY,EAAM,CAAE,CAAE,EAO9E,KAAK,IAAMmnC,EAEX,KAAK,KAAO,aAEZ,KAAK,SAAS,sBAAsB,CAErC,CAEA,kBAAmBiH,EAAQ,CAE1B,IAAMjH,EAAM,KAAK,IAEZA,EAAI,QAAQ,IAEjBA,EAAI,UAAW,KAAK,QAAS,EAE7BA,EAAI,QAAS,KAAK,KAAM,EAExB,KAAK,MAAM,eAAgB,EAAI,EAE/B,MAAM,kBAAmBiH,CAAM,EAEhC,CAMA,SAAU,CAET,KAAK,SAAS,QAAQ,EACtB,KAAK,SAAS,QAAQ,CAEvB,CAED,EAaM3R,GAAN,cAA0BhN,EAAK,CAS9B,YAAa6X,EAAON,EAAO,EAAG6J,EAAM,SAAW,CAE9C,IAAM7wC,EAAQ6wC,EAERm2B,EAAY,CAAE,EAAG,GAAI,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,EAAG,GAAI,EAAG,EAAG,EAAG,CAAE,EAE7FryD,EAAW,IAAI2U,GACrB3U,EAAS,aAAc,WAAY,IAAImU,GAAwBk+C,EAAW,CAAE,CAAE,EAC9EryD,EAAS,sBAAsB,EAE/B,MAAOA,EAAU,IAAI0a,GAAmB,CAAE,MAAOrvB,EAAO,WAAY,EAAM,CAAE,CAAE,EAE9E,KAAK,KAAO,cAOZ,KAAK,MAAQsnC,EAQb,KAAK,KAAON,EAEZ,IAAMmhC,EAAa,CAAE,EAAG,EAAG,EAAG,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,EAAG,EAAG,GAAI,CAAE,EAE1E/zB,EAAY,IAAI9qB,GACtB8qB,EAAU,aAAc,WAAY,IAAItrB,GAAwBq/C,EAAY,CAAE,CAAE,EAChF/zB,EAAU,sBAAsB,EAEhC,KAAK,IAAK,IAAIvqB,GAAMuqB,EAAW,IAAIpsB,GAAmB,CAAE,MAAOhoB,EAAO,QAAS,GAAK,YAAa,GAAM,WAAY,GAAO,WAAY,EAAM,CAAE,CAAE,CAAE,CAEnJ,CAEA,kBAAmBouC,EAAQ,CAE1B,KAAK,SAAS,IAAK,EAAG,EAAG,CAAE,EAE3B,KAAK,MAAM,IAAK,GAAM,KAAK,KAAM,GAAM,KAAK,KAAM,CAAE,EAEpD,KAAK,OAAQ,KAAK,MAAM,MAAO,EAE/B,KAAK,WAAY,CAAE,KAAK,MAAM,QAAS,EAEvC,MAAM,kBAAmBA,CAAM,CAEhC,CAMA,SAAU,CAET,KAAK,SAAS,QAAQ,EACtB,KAAK,SAAS,QAAQ,EACtB,KAAK,SAAU,CAAE,EAAE,SAAS,QAAQ,EACpC,KAAK,SAAU,CAAE,EAAE,SAAS,QAAQ,CAErC,CAED,EAEM1R,GAAsB,IAAIj4B,EAsB1Bo4B,GAAN,cAA0BlW,EAAS,CAYlC,YAAayhD,EAAM,IAAI3jE,EAAS,EAAG,EAAG,CAAE,EAAGqjC,EAAS,IAAIrjC,EAAS,EAAG,EAAG,CAAE,EAAGpH,EAAS,EAAG2C,EAAQ,SAAUqoE,EAAahrE,EAAS,GAAKirE,EAAYD,EAAa,GAAM,CAEnK,MAAM,EAEN,KAAK,KAAO,cAEP1rC,KAAkB,SAEtBA,GAAgB,IAAIrT,GACpBqT,GAAc,aAAc,WAAY,IAAI7T,GAAwB,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,CAAE,EAE9F8T,GAAgB,IAAI5L,GAAc,GAAK,EAAG,EAAG,CAAE,EAC/C4L,GAAc,UAAW,EAAG,IAAM,CAAE,GAIrC,KAAK,SAAS,KAAMkL,CAAO,EAO3B,KAAK,KAAO,IAAIrY,GAAMkN,GAAe,IAAItN,GAAmB,CAAE,MAAOrvB,EAAO,WAAY,EAAM,CAAE,CAAE,EAClG,KAAK,KAAK,iBAAmB,GAC7B,KAAK,IAAK,KAAK,IAAK,EAOpB,KAAK,KAAO,IAAI6pB,GAAM+S,GAAe,IAAI5U,GAAmB,CAAE,MAAOhoB,EAAO,WAAY,EAAM,CAAE,CAAE,EAClG,KAAK,KAAK,iBAAmB,GAC7B,KAAK,IAAK,KAAK,IAAK,EAEpB,KAAK,aAAcooE,CAAI,EACvB,KAAK,UAAW/qE,EAAQgrE,EAAYC,CAAU,CAE/C,CAOA,aAAcF,EAAM,CAInB,GAAKA,EAAI,EAAI,OAEZ,KAAK,WAAW,IAAK,EAAG,EAAG,EAAG,CAAE,UAErBA,EAAI,EAAI,QAEnB,KAAK,WAAW,IAAK,EAAG,EAAG,EAAG,CAAE,MAE1B,CAEN1rC,GAAM,IAAK0rC,EAAI,EAAG,EAAG,CAAEA,EAAI,CAAE,EAAE,UAAU,EAEzC,IAAM9pE,EAAU,KAAK,KAAM8pE,EAAI,CAAE,EAEjC,KAAK,WAAW,iBAAkB1rC,GAAOp+B,CAAQ,CAElD,CAED,CASA,UAAWjB,EAAQgrE,EAAahrE,EAAS,GAAKirE,EAAYD,EAAa,GAAM,CAE5E,KAAK,KAAK,MAAM,IAAK,EAAG,KAAK,IAAK,KAAQhrE,EAASgrE,CAAW,EAAG,CAAE,EACnE,KAAK,KAAK,aAAa,EAEvB,KAAK,KAAK,MAAM,IAAKC,EAAWD,EAAYC,CAAU,EACtD,KAAK,KAAK,SAAS,EAAIjrE,EACvB,KAAK,KAAK,aAAa,CAExB,CAOA,SAAU2C,EAAQ,CAEjB,KAAK,KAAK,SAAS,MAAM,IAAKA,CAAM,EACpC,KAAK,KAAK,SAAS,MAAM,IAAKA,CAAM,CAErC,CAEA,KAAMkmC,EAAS,CAEd,aAAM,KAAMA,EAAQ,EAAM,EAE1B,KAAK,KAAK,KAAMA,EAAO,IAAK,EAC5B,KAAK,KAAK,KAAMA,EAAO,IAAK,EAErB,IAER,CAMA,SAAU,CAET,KAAK,KAAK,SAAS,QAAQ,EAC3B,KAAK,KAAK,SAAS,QAAQ,EAC3B,KAAK,KAAK,SAAS,QAAQ,EAC3B,KAAK,KAAK,SAAS,QAAQ,CAE5B,CAED,EAaMpJ,GAAN,cAAyBlN,EAAa,CAOrC,YAAaoX,EAAO,EAAI,CAEvB,IAAMn3B,EAAW,CAChB,EAAG,EAAG,EAAGm3B,EAAM,EAAG,EAClB,EAAG,EAAG,EAAG,EAAGA,EAAM,EAClB,EAAG,EAAG,EAAG,EAAG,EAAGA,CAChB,EAEMmgC,EAAS,CACd,EAAG,EAAG,EAAG,EAAG,GAAK,EACjB,EAAG,EAAG,EAAG,GAAK,EAAG,EACjB,EAAG,EAAG,EAAG,EAAG,GAAK,CAClB,EAEMxyD,EAAW,IAAI2U,GACrB3U,EAAS,aAAc,WAAY,IAAImU,GAAwBjZ,EAAU,CAAE,CAAE,EAC7E8E,EAAS,aAAc,QAAS,IAAImU,GAAwBq+C,EAAQ,CAAE,CAAE,EAExE,IAAMhkE,EAAW,IAAIksB,GAAmB,CAAE,aAAc,GAAM,WAAY,EAAM,CAAE,EAElF,MAAO1a,EAAUxR,CAAS,EAE1B,KAAK,KAAO,YAEb,CAUA,UAAWolE,EAAYC,EAAYC,EAAa,CAE/C,IAAMzoE,EAAQ,IAAI4nB,GACZ9tB,EAAQ,KAAK,SAAS,WAAW,MAAM,MAE7C,OAAAkG,EAAM,IAAKuoE,CAAW,EACtBvoE,EAAM,QAASlG,EAAO,CAAE,EACxBkG,EAAM,QAASlG,EAAO,CAAE,EAExBkG,EAAM,IAAKwoE,CAAW,EACtBxoE,EAAM,QAASlG,EAAO,CAAE,EACxBkG,EAAM,QAASlG,EAAO,CAAE,EAExBkG,EAAM,IAAKyoE,CAAW,EACtBzoE,EAAM,QAASlG,EAAO,EAAG,EACzBkG,EAAM,QAASlG,EAAO,EAAG,EAEzB,KAAK,SAAS,WAAW,MAAM,YAAc,GAEtC,IAER,CAMA,SAAU,CAET,KAAK,SAAS,QAAQ,EACtB,KAAK,SAAS,QAAQ,CAEvB,CAED,EAMMijC,GAAN,KAAgB,CAKf,aAAc,CAEb,KAAK,KAAO,YAOZ,KAAK,MAAQ,IAAInV,GAQjB,KAAK,SAAW,CAAC,EAQjB,KAAK,YAAc,IAEpB,CASA,OAAQnrB,EAAGM,EAAI,CAEd,YAAK,YAAc,IAAIu1B,GACvB,KAAK,SAAS,KAAM,KAAK,WAAY,EACrC,KAAK,YAAY,OAAQ71B,EAAGM,CAAE,EAEvB,IAER,CAUA,OAAQN,EAAGM,EAAI,CAEd,YAAK,YAAY,OAAQN,EAAGM,CAAE,EAEvB,IAER,CAYA,iBAAkBirD,EAAMC,EAAM3B,EAAIC,EAAK,CAEtC,YAAK,YAAY,iBAAkByB,EAAMC,EAAM3B,EAAIC,CAAG,EAE/C,IAER,CAcA,cAAe2B,EAAOC,EAAOC,EAAOC,EAAO/B,EAAIC,EAAK,CAEnD,YAAK,YAAY,cAAe2B,EAAOC,EAAOC,EAAOC,EAAO/B,EAAIC,CAAG,EAE5D,IAER,CASA,WAAYwB,EAAM,CAEjB,YAAK,YAAY,WAAYA,CAAI,EAE1B,IAER,CASA,SAAU2gB,EAAQ,CAEjB,SAASC,EAAiBC,EAAa,CAEtC,IAAM54D,EAAS,CAAC,EAEhB,QAAUjW,EAAI,EAAG4V,EAAIi5D,EAAW,OAAQ7uE,EAAI4V,EAAG5V,IAAO,CAErD,IAAM8uE,EAAUD,EAAY7uE,CAAE,EAExB+uE,EAAW,IAAIv2C,GACrBu2C,EAAS,OAASD,EAAQ,OAE1B74D,EAAO,KAAM84D,CAAS,CAEvB,CAEA,OAAO94D,CAER,CAEA,SAAS+4D,EAAsB7d,EAAM8d,EAAY,CAEhD,IAAMC,EAAUD,EAAU,OAMtB55D,EAAS,GACb,QAAUlN,EAAI+mE,EAAU,EAAGrqE,EAAI,EAAGA,EAAIqqE,EAAS/mE,EAAItD,IAAO,CAEzD,IAAIsqE,EAAYF,EAAW9mE,CAAE,EACzBinE,EAAaH,EAAWpqE,CAAE,EAE1BwqE,EAASD,EAAW,EAAID,EAAU,EAClCG,EAASF,EAAW,EAAID,EAAU,EAEtC,GAAK,KAAK,IAAKG,CAAO,EAAI,OAAO,QAAU,CAU1C,GAPKA,EAAS,IAEbH,EAAYF,EAAWpqE,CAAE,EAAGwqE,EAAS,CAAEA,EACvCD,EAAaH,EAAW9mE,CAAE,EAAGmnE,EAAS,CAAEA,GAIlCne,EAAK,EAAIge,EAAU,GAAShe,EAAK,EAAIie,EAAW,EAAQ,SAE/D,GAAKje,EAAK,IAAMge,EAAU,GAEzB,GAAKhe,EAAK,IAAMge,EAAU,EAAK,MAAO,OAGhC,CAEN,IAAMI,EAAWD,GAAWne,EAAK,EAAIge,EAAU,GAAME,GAAWle,EAAK,EAAIge,EAAU,GACnF,GAAKI,IAAa,EAAO,MAAO,GAChC,GAAKA,EAAW,EAAQ,SACxBl6D,EAAS,CAAEA,CAEZ,CAED,KAAO,CAGN,GAAK87C,EAAK,IAAMge,EAAU,EAAM,SAEhC,GAASC,EAAW,GAAKje,EAAK,GAASA,EAAK,GAAKge,EAAU,GACrDA,EAAU,GAAKhe,EAAK,GAASA,EAAK,GAAKie,EAAW,EAAS,MAAO,EAGzE,CAED,CAEA,OAAO/5D,CAER,CAEA,IAAMm6D,EAAc92C,GAAW,YAEzB+2C,EAAW,KAAK,SACtB,GAAKA,EAAS,SAAW,EAAI,MAAO,CAAC,EAErC,IAAIC,EAAOZ,EAASC,EACd94D,EAAS,CAAC,EAEhB,GAAKw5D,EAAS,SAAW,EAExB,OAAAX,EAAUW,EAAU,CAAE,EACtBV,EAAW,IAAIv2C,GACfu2C,EAAS,OAASD,EAAQ,OAC1B74D,EAAO,KAAM84D,CAAS,EACf94D,EAIR,IAAI05D,EAAa,CAAEH,EAAaC,EAAU,CAAE,EAAE,UAAU,CAAE,EAC1DE,EAAahB,EAAQ,CAAEgB,EAAaA,EAIpC,IAAMC,EAAmB,CAAC,EACpBC,EAAY,CAAC,EACfC,EAAgB,CAAC,EACjBC,EAAU,EACVC,EAEJH,EAAWE,CAAQ,EAAI,OACvBD,EAAeC,CAAQ,EAAI,CAAC,EAE5B,QAAU/vE,EAAI,EAAG4V,EAAI65D,EAAS,OAAQzvE,EAAI4V,EAAG5V,IAE5C8uE,EAAUW,EAAUzvE,CAAE,EACtBgwE,EAAYlB,EAAQ,UAAU,EAC9BY,EAAQF,EAAaQ,CAAU,EAC/BN,EAAQf,EAAQ,CAAEe,EAAQA,EAErBA,GAEG,CAAEC,GAAkBE,EAAWE,CAAQ,GAAMA,IAEpDF,EAAWE,CAAQ,EAAI,CAAE,EAAG,IAAIv3C,GAAS,EAAGw3C,CAAU,EACtDH,EAAWE,CAAQ,EAAE,EAAE,OAASjB,EAAQ,OAEnCa,GAAaI,IAClBD,EAAeC,CAAQ,EAAI,CAAC,GAM5BD,EAAeC,CAAQ,EAAE,KAAM,CAAE,EAAGjB,EAAS,EAAGkB,EAAW,CAAE,CAAE,CAAE,EASnE,GAAK,CAAEH,EAAW,CAAE,EAAI,OAAOjB,EAAiBa,CAAS,EAGzD,GAAKI,EAAU,OAAS,EAAI,CAE3B,IAAII,EAAY,GACZC,EAAW,EAEf,QAAUC,EAAO,EAAGC,EAAOP,EAAU,OAAQM,EAAOC,EAAMD,IAEzDP,EAAkBO,CAAK,EAAI,CAAC,EAI7B,QAAUA,EAAO,EAAGC,EAAOP,EAAU,OAAQM,EAAOC,EAAMD,IAAU,CAEnE,IAAME,EAAMP,EAAeK,CAAK,EAEhC,QAAUG,EAAO,EAAGA,EAAOD,EAAI,OAAQC,IAAU,CAEhD,IAAMC,EAAKF,EAAKC,CAAK,EACjBE,EAAkB,GAEtB,QAAUC,EAAQ,EAAGA,EAAQZ,EAAU,OAAQY,IAEzCzB,EAAsBuB,EAAG,EAAGV,EAAWY,CAAM,EAAE,CAAE,IAEhDN,IAASM,GAAQP,IAEjBM,GAEJA,EAAkB,GAClBZ,EAAkBa,CAAM,EAAE,KAAMF,CAAG,GAInCN,EAAY,IAQVO,GAEJZ,EAAkBO,CAAK,EAAE,KAAMI,CAAG,CAIpC,CAED,CAEKL,EAAW,GAAKD,IAAc,KAElCH,EAAgBF,EAIlB,CAEA,IAAIc,EAEJ,QAAU1wE,EAAI,EAAG+sC,EAAK8iC,EAAU,OAAQ7vE,EAAI+sC,EAAI/sC,IAAO,CAEtD+uE,EAAWc,EAAW7vE,CAAE,EAAE,EAC1BiW,EAAO,KAAM84D,CAAS,EACtB2B,EAAWZ,EAAe9vE,CAAE,EAE5B,QAAU4H,EAAI,EAAG2wC,EAAKm4B,EAAS,OAAQ9oE,EAAI2wC,EAAI3wC,IAE9CmnE,EAAS,MAAM,KAAM2B,EAAU9oE,CAAE,EAAE,CAAE,CAIvC,CAIA,OAAOqO,CAER,CAED,EAQMgtB,GAAN,cAAuB5a,EAAgB,CAQtC,YAAalf,EAAQwnE,EAAa,KAAO,CAExC,MAAM,EAON,KAAK,OAASxnE,EAQd,KAAK,WAAawnE,EAQlB,KAAK,QAAU,GAQf,KAAK,MAAQ,GAOb,KAAK,KAAO,CAAC,EAQb,KAAK,aAAe,CAAE,KAAM,KAAM,OAAQ,KAAM,MAAO,IAAK,EAQ5D,KAAK,QAAU,CAAE,IAAK,KAAM,IAAK,IAAK,CAEvC,CAQA,QAASh8B,EAAU,CAElB,GAAKA,IAAY,OAAY,CAE5B1zC,GAAM,8CAA+C,EACrD,MAED,CAEK,KAAK,aAAe,MAAO,KAAK,WAAW,EAEhD,KAAK,WAAa0zC,CAEnB,CAKA,YAAa,CAAC,CAMd,SAAU,CAAC,CAQX,QAAsB,CAAC,CAExB,EA2OMzR,GAAN,KAAmB,CAWlB,OAAO,QAAShoB,EAASC,EAAS,CAEjC,OAAOF,IAASC,EAASC,CAAO,CAEjC,CAWA,OAAO,MAAOD,EAASC,EAAS,CAE/B,OAAOE,IAAOH,EAASC,CAAO,CAE/B,CAQA,OAAO,KAAMD,EAAU,CAEtB,OAAOI,IAAMJ,CAAQ,CAEtB,CAWA,OAAO,cAAeM,EAAOC,EAAQC,EAAQxb,EAAO,CAEnD,OAAOqb,GAAeC,EAAOC,EAAQC,EAAQxb,CAAK,CAEnD,CAED,EAEK,OAAO,mBAAuB,KAElC,mBAAmB,cAAe,IAAI,YAAa,WAAY,CAAE,OAAQ,CACxE,SAAU,KACX,CAAE,CAAE,CAAE,EAIF,OAAO,OAAW,MAEjB,OAAO,UAEXe,GAAM,yDAA0D,EAIhE,OAAO,UAAY,SC/rzDrB,IAAA2vE,GAAA,GAAAC,GAAAD,GAAA,2BAAAE,GAAA,gBAAAC,GAAA,iBAAAC,GAAA,+BAAAC,GAAA,qBAAAC,GAAA,mBAAAC,GAAA,gBAAAC,GAAA,kBAAAC,GAAA,gBAAAC,GAAA,sBAAAC,GAAA,iBAAAC,GAAA,oBAAAC,GAAA,kBAAAC,GAAA,oBAAAC,GAAA,mBAAAC,GAAA,yBAAAC,GAAA,mBAAAC,GAAA,aAAAC,GAAA,gBAAAC,GAAA,gBAAAC,GAAA,qBAAAC,GAAA,UAAAC,GAAA,kBAAAC,GAAA,iBAAAC,GAAA,kBAAAC,GAAA,gBAAAC,GAAA,eAAAC,GAAA,aAAAC,GAAA,sBAAAC,GAAA,mBAAAC,GAAA,gBAAAC,GAAA,SAAAC,GAAA,yBAAAC,GAAA,SAAAC,GAAA,SAAAC,GAAA,eAAAC,GAAA,gBAAAC,GAAA,cAAAC,GAAA,oBAAAC,GAAA,mBAAAC,GAAA,yBAAAC,GAAA,aAAAC,GAAA,UAAAC,GAAA,WAAAC,GAAA,iBAAAC,GAAA,kBAAAC,GAAA,oBAAAC,GAAA,qBAAAC,GAAA,sBAAAC,GAAA,mBAAAC,GAAA,wBAAAC,GAAA,UAAAC,GAAA,UAAAC,GAAA,uBAAAC,GAAA,oBAAAC,GAAA,2BAAAC,GAAA,0BAAAC,GAAA,sBAAAC,GAAA,4BAAAC,GAAA,iBAAAC,GAAA,wBAAAC,GAAA,wBAAAC,GAAA,aAAAC,GAAA,eAAAC,GAAA,qBAAAC,GAAA,0BAAAC,GAAA,0BAAAC,GAAA,gBAAAC,GAAA,sBAAAC,GAAA,4BAAAC,GAAA,qBAAAC,GAAA,sBAAAC,GAAA,qBAAAC,GAAA,iBAAAC,GAAA,kBAAAC,GAAA,sBAAAC,GAAA,iBAAAC,GAAA,UAAAC,GAAA,cAAAC,GAAA,mBAAAC,GAAA,sBAAAC,GAAA,qBAAAC,GAAA,gBAAAC,GAAA,kBAAAC,GAAA,qBAAAC,GAAA,gBAAAC,GAAA,sBAAAC,GAAA,cAAAC,GAAA,uBAAAC,GAAA,2BAAAC,GAAA,0BAAAC,GAAA,gBAAAC,GAAA,uBAAAC,GAAA,iBAAAC,GAAA,qBAAAC,GAAA,qBAAAC,GAAA,2BAAAC,GAAA,wBAAAC,GAAA,yBAAAC,GAAA,eAAAC,GAAA,mBAAAC,GAAA,mBAAAC,GAAA,qBAAAC,GAAA,qBAAAC,GAAA,qBAAAC,GAAA,kBAAAC,GAAA,iBAAAC,GAAA,iBAAAC,GAAA,eAAAC,GAAA,qBAAAC,GAAA,qCAAAC,GAAA,qCAAAC,GAAA,UAAAC,GAAA,oBAAAC,GAAA,oBAAAC,GAAA,oBAAAC,GAAA,eAAAC,GAAA,2BAAAC,GAAA,2BAAAC,GAAA,cAAAC,GAAA,QAAAC,GAAA,YAAAC,GAAA,uBAAAC,GAAA,cAAAC,GAAA,YAAAC,GAAA,iBAAAC,GAAA,sBAAAC,GAAA,UAAAC,GAAA,UAAAC,GAAA,mBAAAC,GAAA,iBAAAC,GAAA,wBAAAC,GAAA,sBAAAC,GAAA,4BAAAC,GAAA,uBAAAC,GAAA,eAAAC,GAAA,UAAAC,GAAA,kBAAAC,GAAA,oBAAAC,GAAA,0BAAAC,GAAA,wBAAAC,GAAA,sBAAAC,GAAA,gBAAAC,GAAA,eAAAC,GAAA,uBAAAC,GAAA,2BAAAC,GAAA,6BAAAC,GAAA,4BAAAC,GAAA,+BAAAC,GAAA,kBAAAC,GAAA,yBAAAC,GAAA,yBAAAC,GAAA,wBAAAC,GAAA,YAAAC,GAAA,sBAAAC,GAAA,+BAAAC,GAAA,gBAAAC,GAAA,wBAAAC,GAAA,sBAAAC,GAAA,sBAAAC,GAAA,8BAAAC,GAAA,8BAAAC,GAAA,oBAAAC,GAAA,kBAAAC,GAAA,kBAAAC,GAAA,QAAAC,GAAA,kBAAAC,GAAA,WAAAC,GAAA,gBAAAC,GAAA,cAAAC,GAAA,qBAAAC,GAAA,mBAAAC,GAAA,yBAAAC,GAAA,oBAAAC,GAAA,UAAAC,GAAA,eAAAC,GAAA,SAAAC,GAAA,UAAAC,GAAA,sBAAAC,GAAA,cAAAC,GAAA,eAAAC,GAAA,uBAAAC,GAAA,aAAAC,GAAA,iBAAAC,GAAA,iBAAAC,GAAA,sBAAAC,GAAA,6BAAAC,GAAA,8BAAAC,GAAA,6BAAAC,GAAA,8BAAAC,GAAA,yBAAAC,GAAA,sBAAAC,GAAA,mBAAAC,GAAA,WAAAC,GAAA,gBAAAC,GAAA,mBAAAC,GAAA,aAAAC,GAAA,iBAAAC,GAAA,eAAAC,GAAA,UAAAC,GAAA,aAAAC,GAAA,mBAAAC,GAAA,cAAAC,GAAA,YAAAC,GAAA,YAAAC,GAAA,YAAAC,GAAA,gBAAAC,GAAA,SAAAC,GAAA,sBAAAC,GAAA,sBAAAC,GAAA,yBAAAC,GAAA,wBAAAC,GAAA,uBAAAC,GAAA,uBAAAC,GAAA,sBAAAC,GAAA,yBAAAC,GAAA,yBAAAC,GAAA,qBAAAC,GAAA,gBAAAC,GAAA,2BAAAC,GAAA,iBAAAC,GAAA,qBAAAC,GAAA,sBAAAC,GAAA,kBAAAC,GAAA,8BAAAC,GAAA,+BAAAC,GAAA,8BAAAC,GAAA,+BAAAC,GAAA,uBAAAC,GAAA,iBAAAC,GAAA,eAAAC,GAAA,qBAAAC,GAAA,eAAAC,GAAA,iBAAAC,GAAA,oBAAAC,GAAA,kBAAAC,GAAA,6BAAAC,GAAA,mBAAAC,GAAA,oBAAAC,GAAA,oBAAAC,GAAA,oBAAAC,GAAA,kBAAAC,GAAA,wBAAAC,GAAA,wBAAAC,GAAA,aAAAC,GAAA,iBAAAC,GAAA,yBAAAC,GAAA,uBAAAC,GAAA,cAAAC,GAAA,gCAAAC,GAAA,gCAAAC,GAAA,2BAAAC,GAAA,2BAAAC,GAAA,2BAAAC,GAAA,2BAAAC,GAAA,uBAAAC,GAAA,iBAAAC,GAAA,qBAAAC,GAAA,mBAAAC,GAAA,SAAAC,GAAA,sBAAAC,GAAA,UAAAC,GAAA,kBAAAC,GAAA,gBAAAC,GAAA,eAAAC,GAAA,qBAAAC,GAAA,WAAAC,GAAA,mBAAAC,GAAA,oBAAAC,GAAA,uBAAAC,GAAA,oBAAAC,GAAA,oBAAAC,GAAA,kBAAAC,GAAA,yBAAAC,GAAA,0BAAAC,GAAA,eAAAC,GAAA,4BAAAC,GAAA,gCAAAC,GAAA,mBAAAC,GAAA,2BAAAC,GAAA,qBAAAC,GAAA,aAAAC,GAAA,oBAAAC,GAAA,qBAAAC,GAAA,eAAAC,GAAA,sBAAAC,GAAA,2BAAAC,GAAA,0BAAAC,GAAA,0BAAAC,GAAA,0BAAAC,GAAA,2BAAAC,GAAA,2BAAAC,GAAA,yBAAAC,GAAA,yBAAAC,GAAA,yBAAAC,GAAA,yBAAAC,GAAA,yBAAAC,GAAA,yBAAAC,GAAA,yBAAAC,GAAA,yBAAAC,GAAA,qBAAAC,GAAA,yBAAAC,GAAA,6BAAAC,GAAA,6BAAAC,GAAA,0BAAAC,GAAA,0BAAAC,GAAA,0BAAAC,GAAA,oBAAAC,GAAA,cAAAC,GAAA,qBAAAC,GAAA,2BAAAC,GAAA,6BAAAC,GAAA,oBAAAC,GAAA,oBAAAC,GAAA,4BAAAC,GAAA,4BAAAC,GAAA,yBAAAC,GAAA,mBAAAC,GAAA,aAAAC,GAAA,oBAAAC,GAAA,sBAAAC,GAAA,QAAAC,GAAA,cAAAC,GAAA,kBAAAC,GAAA,cAAAC,GAAA,qBAAAC,GAAA,wBAAAC,GAAA,iBAAAC,GAAA,mBAAAC,GAAA,mBAAAC,GAAA,qBAAAC,GAAA,4BAAAC,GAAA,iBAAAC,GAAA,0BAAAC,GAAA,kCAAAC,GAAA,4BAAAC,GAAA,2BAAAC,GAAA,mBAAAC,GAAA,iBAAAC,GAAA,UAAAC,GAAA,gBAAAC,GAAA,cAAAC,GAAA,mBAAAC,GAAA,mBAAAC,GAAA,UAAAC,GAAA,kBAAAC,GAAA,cAAAC,GAAA,eAAAC,GAAA,cAAAC,GAAA,aAAAC,GAAA,mBAAAC,GAAA,gBAAAC,GAAA,WAAAC,GAAA,WAAAC,GAAA,mBAAAC,GAAA,cAAAC,GAAA,wBAAAC,GAAA,gBAAAC,GAAA,cAAAC,GAAA,oBAAAC,GAAA,WAAAC,GAAA,mBAAAC,GAAA,mBAAAC,GAAA,2BAAAC,GAAA,mBAAAC,GAAA,oBAAAC,GAAA,oBAAAC,GAAA,oBAAAC,GAAA,iBAAAC,GAAA,oBAAAC,GAAA,oBAAAC,GAAA,oBAAAC,GAAA,wBAAAC,GAAA,qBAAAC,GAAA,wBAAAC,GAAA,UAAAC,GAAA,0BAAAC,GAAA,wBAAAC,GAAA,YAAAC,GAAA,kBAAAC,GAAA,iBAAAC,GAAA,UAAAC,GAAA,mBAAAC,GAAA,kBAAAC,GAAA,sBAAAC,GAAA,aAAAC,GAAA,wBAAAC,GAAA,0BAAAC,GAAA,sBAAAC,GAAA,iBAAAC,GAAA,cAAAC,GAAA,0BAAAC,GAAA,0BAAAC,GAAA,yBAAAC,GAAA,gCAAAC,GAAA,YAAAC,GAAA,kBAAAC,GAAA,gBAAAC,GAAA,kBAAAC,GAAA,qBAAAC,GAAA,0BAAAC,GAAA,uBAAAC,GAAA,wBAAAC,GAAA,oBAAAC,GAAA,0BAAAC,GAAA,0BAAAC,GAAA,sBAAAC,GAAA,iBAAAC,GAAA,YAAAC,GAAA,YAAAC,EAAA,YAAAC,GAAA,wBAAAC,GAAA,sBAAAC,GAAA,iBAAAC,GAAA,wBAAAC,GAAA,2BAAAC,GAAA,0BAAAC,GAAA,0BAAAC,GAAA,sBAAAC,GAAA,kBAAAC,GAAA,eAAAC,GAAA,2BAAAC,GAAA,oBAAAC,GAAA,sBAAAC,GAAA,qBAAAC,GAAA,wBAAAC,GAAA,eAAAC,GAAA,oBAAAC,GAAA,kBAAAC,GAAA,wBAAAC,GAAA,UAAAC,GAAA,uBAAAC,GAAA,QAAAC,GAAA,uBAAAC,GAAA,SAAAC,GAAA,aAAAC,KAQA,SAASC,IAAiB,CAEzB,IAAIC,EAAU,KACVC,EAAc,GACdC,EAAgB,KAChBC,EAAY,KAEhB,SAASC,EAAkBC,EAAMC,EAAQ,CAExCJ,EAAeG,EAAMC,CAAM,EAE3BH,EAAYH,EAAQ,sBAAuBI,CAAiB,CAE7D,CAEA,MAAO,CAEN,MAAO,UAAY,CAEbH,IAAgB,IAChBC,IAAkB,OAEvBC,EAAYH,EAAQ,sBAAuBI,CAAiB,EAE5DH,EAAc,GAEf,EAEA,KAAM,UAAY,CAEjBD,EAAQ,qBAAsBG,CAAU,EAExCF,EAAc,EAEf,EAEA,iBAAkB,SAAWM,EAAW,CAEvCL,EAAgBK,CAEjB,EAEA,WAAY,SAAWC,EAAQ,CAE9BR,EAAUQ,CAEX,CAED,CAED,CAEA,SAASC,IAAiBC,EAAK,CAE9B,IAAMC,EAAU,IAAI,QAEpB,SAASC,EAAcC,EAAWC,EAAa,CAE9C,IAAMC,EAAQF,EAAU,MAClBG,EAAQH,EAAU,MAClBI,EAAOF,EAAM,WAEbG,EAASR,EAAG,aAAa,EAE/BA,EAAG,WAAYI,EAAYI,CAAO,EAClCR,EAAG,WAAYI,EAAYC,EAAOC,CAAM,EAExCH,EAAU,iBAAiB,EAE3B,IAAIM,EAEJ,GAAKJ,aAAiB,aAErBI,EAAOT,EAAG,cAEC,OAAO,aAAiB,KAAeK,aAAiB,aAEnEI,EAAOT,EAAG,mBAECK,aAAiB,YAEvBF,EAAU,yBAEdM,EAAOT,EAAG,WAIVS,EAAOT,EAAG,uBAIAK,aAAiB,WAE5BI,EAAOT,EAAG,cAECK,aAAiB,YAE5BI,EAAOT,EAAG,qBAECK,aAAiB,WAE5BI,EAAOT,EAAG,YAECK,aAAiB,UAE5BI,EAAOT,EAAG,aAECK,aAAiB,WAE5BI,EAAOT,EAAG,sBAECK,aAAiB,kBAE5BI,EAAOT,EAAG,kBAIV,OAAM,IAAI,MAAO,0DAA4DK,CAAM,EAIpF,MAAO,CACN,OAAQG,EACR,KAAMC,EACN,gBAAiBJ,EAAM,kBACvB,QAASF,EAAU,QACnB,KAAMI,CACP,CAED,CAEA,SAASG,EAAcF,EAAQL,EAAWC,EAAa,CAEtD,IAAMC,EAAQF,EAAU,MAClBQ,EAAeR,EAAU,aAI/B,GAFAH,EAAG,WAAYI,EAAYI,CAAO,EAE7BG,EAAa,SAAW,EAG5BX,EAAG,cAAeI,EAAY,EAAGC,CAAM,MAEjC,CAWNM,EAAa,KAAM,CAAEC,EAAGC,IAAOD,EAAE,MAAQC,EAAE,KAAM,EAOjD,IAAIC,EAAa,EAEjB,QAAUC,EAAI,EAAGA,EAAIJ,EAAa,OAAQI,IAAO,CAEhD,IAAMC,EAAgBL,EAAcG,CAAW,EACzCG,EAAQN,EAAcI,CAAE,EAIzBE,EAAM,OAASD,EAAc,MAAQA,EAAc,MAAQ,EAE/DA,EAAc,MAAQ,KAAK,IAC1BA,EAAc,MACdC,EAAM,MAAQA,EAAM,MAAQD,EAAc,KAC3C,GAIA,EAAGF,EACHH,EAAcG,CAAW,EAAIG,EAI/B,CAGAN,EAAa,OAASG,EAAa,EAEnC,QAAUC,EAAI,EAAGG,EAAIP,EAAa,OAAQI,EAAIG,EAAGH,IAAO,CAEvD,IAAME,EAAQN,EAAcI,CAAE,EAE9Bf,EAAG,cAAeI,EAAYa,EAAM,MAAQZ,EAAM,kBACjDA,EAAOY,EAAM,MAAOA,EAAM,KAAM,CAElC,CAEAd,EAAU,kBAAkB,CAE7B,CAEAA,EAAU,iBAAiB,CAE5B,CAIA,SAASgB,EAAKhB,EAAY,CAEzB,OAAKA,EAAU,+BAA+BA,EAAYA,EAAU,MAE7DF,EAAQ,IAAKE,CAAU,CAE/B,CAEA,SAASiB,EAAQjB,EAAY,CAEvBA,EAAU,+BAA+BA,EAAYA,EAAU,MAEpE,IAAMkB,EAAOpB,EAAQ,IAAKE,CAAU,EAE/BkB,IAEJrB,EAAG,aAAcqB,EAAK,MAAO,EAE7BpB,EAAQ,OAAQE,CAAU,EAI5B,CAEA,SAASmB,EAAQnB,EAAWC,EAAa,CAIxC,GAFKD,EAAU,+BAA+BA,EAAYA,EAAU,MAE/DA,EAAU,oBAAsB,CAEpC,IAAMoB,EAAStB,EAAQ,IAAKE,CAAU,GAEjC,CAAEoB,GAAUA,EAAO,QAAUpB,EAAU,UAE3CF,EAAQ,IAAKE,EAAW,CACvB,OAAQA,EAAU,OAClB,KAAMA,EAAU,KAChB,gBAAiBA,EAAU,YAC3B,QAASA,EAAU,OACpB,CAAE,EAIH,MAED,CAEA,IAAMkB,EAAOpB,EAAQ,IAAKE,CAAU,EAEpC,GAAKkB,IAAS,OAEbpB,EAAQ,IAAKE,EAAWD,EAAcC,EAAWC,CAAW,CAAE,UAEnDiB,EAAK,QAAUlB,EAAU,QAAU,CAE9C,GAAKkB,EAAK,OAASlB,EAAU,MAAM,WAElC,MAAM,IAAI,MAAO,uJAAyJ,EAI3KO,EAAcW,EAAK,OAAQlB,EAAWC,CAAW,EAEjDiB,EAAK,QAAUlB,EAAU,OAE1B,CAED,CAEA,MAAO,CAEN,IAAKgB,EACL,OAAQC,EACR,OAAQE,CAET,CAED,CAm/BA,SAASE,IAAiBC,EAAUC,EAAUC,EAAYC,EAAOC,EAASC,EAAOC,EAAqB,CAErG,IAAMC,EAAa,IAAI3a,GAAO,CAAS,EACnC4a,EAAaH,IAAU,GAAO,EAAI,EAElCI,EACAC,EAEAC,EAAoB,KACpBC,EAA2B,EAC3BC,EAAqB,KAEzB,SAASC,EAAeC,EAAQ,CAE/B,IAAIC,EAAaD,EAAM,UAAY,GAAOA,EAAM,WAAa,KAE7D,OAAKC,GAAcA,EAAW,YAG7BA,GADiBD,EAAM,qBAAuB,EACpBb,EAAaD,GAAW,IAAKe,CAAW,GAI5DA,CAER,CAEA,SAASC,EAAQF,EAAQ,CAExB,IAAIG,EAAa,GACXF,EAAaF,EAAeC,CAAM,EAEnCC,IAAe,KAEnBG,EAAUZ,EAAYC,CAAW,EAEtBQ,GAAcA,EAAW,UAEpCG,EAAUH,EAAY,CAAE,EACxBE,EAAa,IAId,IAAME,EAAuBpB,EAAS,GAAG,wBAAwB,EAE5DoB,IAAyB,WAE7BjB,EAAM,QAAQ,MAAM,SAAU,EAAG,EAAG,EAAG,EAAGG,CAAmB,EAElDc,IAAyB,eAEpCjB,EAAM,QAAQ,MAAM,SAAU,EAAG,EAAG,EAAG,EAAGG,CAAmB,GAIzDN,EAAS,WAAakB,KAI1Bf,EAAM,QAAQ,MAAM,QAAS,EAAK,EAClCA,EAAM,QAAQ,MAAM,QAAS,EAAK,EAClCA,EAAM,QAAQ,MAAM,QAAS,EAAK,EAElCH,EAAS,MAAOA,EAAS,eAAgBA,EAAS,eAAgBA,EAAS,gBAAiB,EAI9F,CAEA,SAASqB,EAAiBC,EAAYP,EAAQ,CAE7C,IAAMC,EAAaF,EAAeC,CAAM,EAEnCC,IAAgBA,EAAW,eAAiBA,EAAW,UAAYna,KAElE6Z,IAAY,SAEhBA,EAAU,IAAInR,GACb,IAAI3K,GAAa,EAAG,EAAG,CAAE,EACzB,IAAIkT,GAAgB,CACnB,KAAM,yBACN,SAAUyJ,GAAe1J,GAAU,eAAe,QAAS,EAC3D,aAAcA,GAAU,eAAe,aACvC,eAAgBA,GAAU,eAAe,eACzC,KAAM1T,GACN,UAAW,GACX,WAAY,GACZ,IAAK,GACL,cAAe,EAChB,CAAE,CACH,EAEAuc,EAAQ,SAAS,gBAAiB,QAAS,EAC3CA,EAAQ,SAAS,gBAAiB,IAAK,EAEvCA,EAAQ,eAAiB,SAAWV,EAAUe,EAAOS,EAAS,CAE7D,KAAK,YAAY,aAAcA,EAAO,WAAY,CAEnD,EAGA,OAAO,eAAgBd,EAAQ,SAAU,SAAU,CAElD,IAAK,UAAY,CAEhB,OAAO,KAAK,SAAS,OAAO,KAE7B,CAED,CAAE,EAEFN,EAAQ,OAAQM,CAAQ,GAIzBe,GAAM,KAAMV,EAAM,kBAAmB,EAGrCU,GAAM,GAAK,GAAIA,GAAM,GAAK,GAAIA,GAAM,GAAK,GAEpCT,EAAW,eAAiBA,EAAW,wBAA0B,KAGrES,GAAM,GAAK,GACXA,GAAM,GAAK,IAIZf,EAAQ,SAAS,SAAS,OAAO,MAAQM,EACzCN,EAAQ,SAAS,SAAS,WAAW,MAAUM,EAAW,eAAiBA,EAAW,wBAA0B,GAAU,GAAK,EAC/HN,EAAQ,SAAS,SAAS,qBAAqB,MAAQK,EAAM,qBAC7DL,EAAQ,SAAS,SAAS,oBAAoB,MAAQK,EAAM,oBAC5DL,EAAQ,SAAS,SAAS,mBAAmB,MAAM,eAAgBgB,IAAM,sBAAuBD,EAAM,CAAE,EACxGf,EAAQ,SAAS,WAAa5a,GAAgB,YAAakb,EAAW,UAAW,IAAMtJ,IAElFiJ,IAAsBK,GAC1BJ,IAA6BI,EAAW,SACxCH,IAAuBb,EAAS,eAEhCU,EAAQ,SAAS,YAAc,GAE/BC,EAAoBK,EACpBJ,EAA2BI,EAAW,QACtCH,EAAqBb,EAAS,aAI/BU,EAAQ,OAAO,UAAU,EAGzBY,EAAW,QAASZ,EAASA,EAAQ,SAAUA,EAAQ,SAAU,EAAG,EAAG,IAAK,GAEjEM,GAAcA,EAAW,YAE/BP,IAAc,SAElBA,EAAY,IAAIlR,GACf,IAAIuD,GAAe,EAAG,CAAE,EACxB,IAAIgF,GAAgB,CACnB,KAAM,qBACN,SAAUyJ,GAAe1J,GAAU,WAAW,QAAS,EACvD,aAAcA,GAAU,WAAW,aACnC,eAAgBA,GAAU,WAAW,eACrC,KAAM1N,GACN,UAAW,GACX,WAAY,GACZ,IAAK,GACL,cAAe,EAChB,CAAE,CACH,EAEAsW,EAAU,SAAS,gBAAiB,QAAS,EAG7C,OAAO,eAAgBA,EAAU,SAAU,MAAO,CAEjD,IAAK,UAAY,CAEhB,OAAO,KAAK,SAAS,IAAI,KAE1B,CAED,CAAE,EAEFL,EAAQ,OAAQK,CAAU,GAI3BA,EAAU,SAAS,SAAS,IAAI,MAAQO,EACxCP,EAAU,SAAS,SAAS,oBAAoB,MAAQM,EAAM,oBAC9DN,EAAU,SAAS,WAAa3a,GAAgB,YAAakb,EAAW,UAAW,IAAMtJ,GAEpFsJ,EAAW,mBAAqB,IAEpCA,EAAW,aAAa,EAIzBP,EAAU,SAAS,SAAS,YAAY,MAAM,KAAMO,EAAW,MAAO,GAEjEL,IAAsBK,GAC1BJ,IAA6BI,EAAW,SACxCH,IAAuBb,EAAS,eAEhCS,EAAU,SAAS,YAAc,GAEjCE,EAAoBK,EACpBJ,EAA2BI,EAAW,QACtCH,EAAqBb,EAAS,aAI/BS,EAAU,OAAO,UAAU,EAG3Ba,EAAW,QAASb,EAAWA,EAAU,SAAUA,EAAU,SAAU,EAAG,EAAG,IAAK,EAIpF,CAEA,SAASU,EAAUQ,EAAOtB,EAAQ,CAEjCsB,EAAM,OAAQC,GAAMC,GAA2B7B,CAAS,CAAE,EAE1DG,EAAM,QAAQ,MAAM,SAAUyB,GAAK,EAAGA,GAAK,EAAGA,GAAK,EAAGvB,EAAOC,CAAmB,CAEjF,CAEA,SAASwB,GAAU,CAEbpB,IAAY,SAEhBA,EAAQ,SAAS,QAAQ,EACzBA,EAAQ,SAAS,QAAQ,EAEzBA,EAAU,QAIND,IAAc,SAElBA,EAAU,SAAS,QAAQ,EAC3BA,EAAU,SAAS,QAAQ,EAE3BA,EAAY,OAId,CAEA,MAAO,CAEN,cAAe,UAAY,CAE1B,OAAOF,CAER,EACA,cAAe,SAAWoB,EAAOtB,EAAQ,EAAI,CAE5CE,EAAW,IAAKoB,CAAM,EACtBnB,EAAaH,EACbc,EAAUZ,EAAYC,CAAW,CAElC,EACA,cAAe,UAAY,CAE1B,OAAOA,CAER,EACA,cAAe,SAAWH,EAAQ,CAEjCG,EAAaH,EACbc,EAAUZ,EAAYC,CAAW,CAElC,EACA,OAAQS,EACR,gBAAiBI,EACjB,QAASS,CAEV,CAED,CAEA,SAASC,IAAoBxD,EAAIyD,EAAa,CAE7C,IAAMC,EAAsB1D,EAAG,aAAcA,EAAG,kBAAmB,EAE7D2D,EAAgB,CAAC,EAEjBC,EAAeC,EAAoB,IAAK,EAC1CC,EAAeF,EACfG,EAAc,GAElB,SAASC,EAAOC,EAAQC,EAAUC,EAASC,EAAUC,EAAQ,CAE5D,IAAIC,EAAgB,GAEd1C,EAAQ2C,EAAiBH,EAAUD,EAASD,CAAS,EAEtDJ,IAAiBlC,IAErBkC,EAAelC,EACf4C,EAAuBV,EAAa,MAAO,GAI5CQ,EAAgBG,EAAaR,EAAQG,EAAUD,EAASE,CAAM,EAEzDC,GAAgBI,EAAWT,EAAQG,EAAUD,EAASE,CAAM,EAE5DA,IAAU,MAEdZ,EAAW,OAAQY,EAAOrE,EAAG,oBAAqB,GAI9CsE,GAAiBP,KAErBA,EAAc,GAEdY,EAAuBV,EAAQC,EAAUC,EAASC,CAAS,EAEtDC,IAAU,MAEdrE,EAAG,WAAYA,EAAG,qBAAsByD,EAAW,IAAKY,CAAM,EAAE,MAAO,EAM1E,CAEA,SAASO,GAA0B,CAElC,OAAO5E,EAAG,kBAAkB,CAE7B,CAEA,SAASwE,EAAuBK,EAAM,CAErC,OAAO7E,EAAG,gBAAiB6E,CAAI,CAEhC,CAEA,SAASC,EAAyBD,EAAM,CAEvC,OAAO7E,EAAG,kBAAmB6E,CAAI,CAElC,CAEA,SAASN,EAAiBH,EAAUD,EAASD,EAAW,CAEvD,IAAMa,EAAcb,EAAS,YAAc,GAEvCc,EAAarB,EAAeS,EAAS,EAAG,EAEvCY,IAAe,SAEnBA,EAAa,CAAC,EACdrB,EAAeS,EAAS,EAAG,EAAIY,GAIhC,IAAIC,EAAWD,EAAYb,EAAQ,EAAG,EAEjCc,IAAa,SAEjBA,EAAW,CAAC,EACZD,EAAYb,EAAQ,EAAG,EAAIc,GAI5B,IAAIrD,EAAQqD,EAAUF,CAAU,EAEhC,OAAKnD,IAAU,SAEdA,EAAQiC,EAAoBe,EAAwB,CAAE,EACtDK,EAAUF,CAAU,EAAInD,GAIlBA,CAER,CAEA,SAASiC,EAAoBgB,EAAM,CAElC,IAAMK,EAAgB,CAAC,EACjBC,EAAoB,CAAC,EACrBC,EAAoB,CAAC,EAE3B,QAAUrE,EAAI,EAAGA,EAAI2C,EAAqB3C,IAEzCmE,EAAenE,CAAE,EAAI,EACrBoE,EAAmBpE,CAAE,EAAI,EACzBqE,EAAmBrE,CAAE,EAAI,EAI1B,MAAO,CAGN,SAAU,KACV,QAAS,KACT,UAAW,GAEX,cAAemE,EACf,kBAAmBC,EACnB,kBAAmBC,EACnB,OAAQP,EACR,WAAY,CAAC,EACb,MAAO,IAER,CAED,CAEA,SAASJ,EAAaR,EAAQG,EAAUD,EAASE,EAAQ,CAExD,IAAMgB,EAAmBvB,EAAa,WAChCwB,EAAqBlB,EAAS,WAEhCmB,EAAgB,EAEdC,EAAoBrB,EAAQ,cAAc,EAEhD,QAAYsB,KAAQD,EAInB,GAFyBA,EAAmBC,CAAK,EAE3B,UAAY,EAAI,CAErC,IAAMC,EAAkBL,EAAkBI,CAAK,EAC3CE,EAAoBL,EAAoBG,CAAK,EAajD,GAXKE,IAAsB,SAErBF,IAAS,kBAAoBxB,EAAO,iBAAiB0B,EAAoB1B,EAAO,gBAChFwB,IAAS,iBAAmBxB,EAAO,gBAAgB0B,EAAoB1B,EAAO,gBAI/EyB,IAAoB,QAEpBA,EAAgB,YAAcC,GAE9BA,GAAqBD,EAAgB,OAASC,EAAkB,KAAO,MAAO,GAEnFJ,GAED,CAMD,OAFKzB,EAAa,gBAAkByB,GAE/BzB,EAAa,QAAUO,CAI7B,CAEA,SAASK,EAAWT,EAAQG,EAAUD,EAASE,EAAQ,CAEtD,IAAMuB,EAAQ,CAAC,EACTnC,EAAaW,EAAS,WACxBmB,EAAgB,EAEdC,EAAoBrB,EAAQ,cAAc,EAEhD,QAAYsB,KAAQD,EAInB,GAFyBA,EAAmBC,CAAK,EAE3B,UAAY,EAAI,CAErC,IAAItF,EAAYsD,EAAYgC,CAAK,EAE5BtF,IAAc,SAEbsF,IAAS,kBAAoBxB,EAAO,iBAAiB9D,EAAY8D,EAAO,gBACxEwB,IAAS,iBAAmBxB,EAAO,gBAAgB9D,EAAY8D,EAAO,gBAI5E,IAAM5C,EAAO,CAAC,EACdA,EAAK,UAAYlB,EAEZA,GAAaA,EAAU,OAE3BkB,EAAK,KAAOlB,EAAU,MAIvByF,EAAOH,CAAK,EAAIpE,EAEhBkE,GAED,CAIDzB,EAAa,WAAa8B,EAC1B9B,EAAa,cAAgByB,EAE7BzB,EAAa,MAAQO,CAEtB,CAEA,SAASwB,GAAiB,CAEzB,IAAMX,EAAgBpB,EAAa,cAEnC,QAAU/C,EAAI,EAAG+E,EAAKZ,EAAc,OAAQnE,EAAI+E,EAAI/E,IAEnDmE,EAAenE,CAAE,EAAI,CAIvB,CAEA,SAASgF,EAAiB5F,EAAY,CAErC6F,EAA2B7F,EAAW,CAAE,CAEzC,CAEA,SAAS6F,EAA2B7F,EAAW8F,EAAmB,CAEjE,IAAMf,EAAgBpB,EAAa,cAC7BqB,EAAoBrB,EAAa,kBACjCsB,EAAoBtB,EAAa,kBAEvCoB,EAAe/E,CAAU,EAAI,EAExBgF,EAAmBhF,CAAU,IAAM,IAEvCH,EAAG,wBAAyBG,CAAU,EACtCgF,EAAmBhF,CAAU,EAAI,GAI7BiF,EAAmBjF,CAAU,IAAM8F,IAEvCjG,EAAG,oBAAqBG,EAAW8F,CAAiB,EACpDb,EAAmBjF,CAAU,EAAI8F,EAInC,CAEA,SAASC,GAA0B,CAElC,IAAMhB,EAAgBpB,EAAa,cAC7BqB,EAAoBrB,EAAa,kBAEvC,QAAU/C,EAAI,EAAG+E,EAAKX,EAAkB,OAAQpE,EAAI+E,EAAI/E,IAElDoE,EAAmBpE,CAAE,IAAMmE,EAAenE,CAAE,IAEhDf,EAAG,yBAA0Be,CAAE,EAC/BoE,EAAmBpE,CAAE,EAAI,EAM5B,CAEA,SAASoF,EAAqB9B,EAAO9D,EAAME,EAAM2F,EAAYC,EAAQC,EAAQC,EAAU,CAEjFA,IAAY,GAEhBvG,EAAG,qBAAsBqE,EAAO9D,EAAME,EAAM4F,EAAQC,CAAO,EAI3DtG,EAAG,oBAAqBqE,EAAO9D,EAAME,EAAM2F,EAAYC,EAAQC,CAAO,CAIxE,CAEA,SAAS3B,EAAuBV,EAAQC,EAAUC,EAASC,EAAW,CAErEyB,EAAe,EAEf,IAAMP,EAAqBlB,EAAS,WAE9BoB,EAAoBrB,EAAQ,cAAc,EAE1CqC,EAAiCtC,EAAS,uBAEhD,QAAYuB,KAAQD,EAAoB,CAEvC,IAAMiB,EAAmBjB,EAAmBC,CAAK,EAEjD,GAAKgB,EAAiB,UAAY,EAAI,CAErC,IAAId,EAAoBL,EAAoBG,CAAK,EASjD,GAPKE,IAAsB,SAErBF,IAAS,kBAAoBxB,EAAO,iBAAiB0B,EAAoB1B,EAAO,gBAChFwB,IAAS,iBAAmBxB,EAAO,gBAAgB0B,EAAoB1B,EAAO,gBAI/E0B,IAAsB,OAAY,CAEtC,IAAMS,EAAaT,EAAkB,WAC/BpF,EAAOoF,EAAkB,SAEzBxF,GAAYsD,EAAW,IAAKkC,CAAkB,EAIpD,GAAKxF,KAAc,OAAY,SAE/B,IAAMK,GAASL,GAAU,OACnBM,GAAON,GAAU,KACjBuG,GAAkBvG,GAAU,gBAI5BoG,EAAY9F,KAAST,EAAG,KAAOS,KAAST,EAAG,cAAgB2F,EAAkB,UAAYjY,GAE/F,GAAKiY,EAAkB,6BAA+B,CAErD,IAAMtE,GAAOsE,EAAkB,KACzBU,GAAShF,GAAK,OACdiF,GAASX,EAAkB,OAEjC,GAAKtE,GAAK,6BAA+B,CAExC,QAAUN,GAAI,EAAGA,GAAI0F,EAAiB,aAAc1F,KAEnDiF,EAA2BS,EAAiB,SAAW1F,GAAGM,GAAK,gBAAiB,EAI5E4C,EAAO,kBAAoB,IAAQG,EAAS,oBAAsB,SAEtEA,EAAS,kBAAoB/C,GAAK,iBAAmBA,GAAK,MAI5D,KAEC,SAAUN,GAAI,EAAGA,GAAI0F,EAAiB,aAAc1F,KAEnDgF,EAAiBU,EAAiB,SAAW1F,EAAE,EAMjDf,EAAG,WAAYA,EAAG,aAAcQ,EAAO,EAEvC,QAAUO,GAAI,EAAGA,GAAI0F,EAAiB,aAAc1F,KAEnDoF,EACCM,EAAiB,SAAW1F,GAC5BR,EAAOkG,EAAiB,aACxBhG,GACA2F,EACAC,GAASK,IACPJ,GAAW/F,EAAOkG,EAAiB,aAAiB1F,IAAM2F,GAC5DH,CACD,CAIF,KAAO,CAEN,GAAKZ,EAAkB,2BAA6B,CAEnD,QAAU5E,GAAI,EAAGA,GAAI0F,EAAiB,aAAc1F,KAEnDiF,EAA2BS,EAAiB,SAAW1F,GAAG4E,EAAkB,gBAAiB,EAIzF1B,EAAO,kBAAoB,IAAQG,EAAS,oBAAsB,SAEtEA,EAAS,kBAAoBuB,EAAkB,iBAAmBA,EAAkB,MAItF,KAEC,SAAU5E,GAAI,EAAGA,GAAI0F,EAAiB,aAAc1F,KAEnDgF,EAAiBU,EAAiB,SAAW1F,EAAE,EAMjDf,EAAG,WAAYA,EAAG,aAAcQ,EAAO,EAEvC,QAAUO,GAAI,EAAGA,GAAI0F,EAAiB,aAAc1F,KAEnDoF,EACCM,EAAiB,SAAW1F,GAC5BR,EAAOkG,EAAiB,aACxBhG,GACA2F,EACA7F,EAAOmG,GACLnG,EAAOkG,EAAiB,aAAiB1F,GAAI2F,GAC/CH,CACD,CAIF,CAED,SAAYC,IAAmC,OAAY,CAE1D,IAAM1G,EAAQ0G,EAAgCf,CAAK,EAEnD,GAAK3F,IAAU,OAEd,OAASA,EAAM,OAAS,CAEvB,IAAK,GACJE,EAAG,gBAAiByG,EAAiB,SAAU3G,CAAM,EACrD,MAED,IAAK,GACJE,EAAG,gBAAiByG,EAAiB,SAAU3G,CAAM,EACrD,MAED,IAAK,GACJE,EAAG,gBAAiByG,EAAiB,SAAU3G,CAAM,EACrD,MAED,QACCE,EAAG,gBAAiByG,EAAiB,SAAU3G,CAAM,CAEvD,CAIF,CAED,CAED,CAEAoG,EAAwB,CAEzB,CAEA,SAAS3C,GAAU,CAElBoD,EAAM,EAEN,QAAYC,KAAcjD,EAAgB,CAEzC,IAAMqB,EAAarB,EAAeiD,CAAW,EAE7C,QAAYC,KAAa7B,EAAa,CAErC,IAAMC,EAAWD,EAAY6B,CAAU,EAEvC,QAAY9B,KAAaE,EAExBH,EAAyBG,EAAUF,CAAU,EAAE,MAAO,EAEtD,OAAOE,EAAUF,CAAU,EAI5B,OAAOC,EAAY6B,CAAU,CAE9B,CAEA,OAAOlD,EAAeiD,CAAW,CAElC,CAED,CAEA,SAASE,EAAyB1C,EAAW,CAE5C,GAAKT,EAAeS,EAAS,EAAG,IAAM,OAAY,OAElD,IAAMY,EAAarB,EAAeS,EAAS,EAAG,EAE9C,QAAYyC,KAAa7B,EAAa,CAErC,IAAMC,EAAWD,EAAY6B,CAAU,EAEvC,QAAY9B,KAAaE,EAExBH,EAAyBG,EAAUF,CAAU,EAAE,MAAO,EAEtD,OAAOE,EAAUF,CAAU,EAI5B,OAAOC,EAAY6B,CAAU,CAE9B,CAEA,OAAOlD,EAAeS,EAAS,EAAG,CAEnC,CAEA,SAAS2C,EAAwB5C,EAAU,CAE1C,QAAYyC,KAAcjD,EAAgB,CAEzC,IAAMqB,EAAarB,EAAeiD,CAAW,EAE7C,GAAK5B,EAAYb,EAAQ,EAAG,IAAM,OAAY,SAE9C,IAAMc,EAAWD,EAAYb,EAAQ,EAAG,EAExC,QAAYY,KAAaE,EAExBH,EAAyBG,EAAUF,CAAU,EAAE,MAAO,EAEtD,OAAOE,EAAUF,CAAU,EAI5B,OAAOC,EAAYb,EAAQ,EAAG,CAE/B,CAED,CAEA,SAASwC,GAAQ,CAEhBK,EAAkB,EAClBjD,EAAc,GAETD,IAAiBF,IAEtBE,EAAeF,EACfY,EAAuBV,EAAa,MAAO,EAE5C,CAIA,SAASkD,GAAoB,CAE5BpD,EAAa,SAAW,KACxBA,EAAa,QAAU,KACvBA,EAAa,UAAY,EAE1B,CAEA,MAAO,CAEN,MAAOI,EACP,MAAO2C,EACP,kBAAmBK,EACnB,QAASzD,EACT,wBAAyBuD,EACzB,uBAAwBC,EAExB,eAAgBlB,EAChB,gBAAiBE,EACjB,wBAAyBG,CAE1B,CAED,CAEA,SAASe,IAAqBjH,EAAIkH,EAAYC,EAAO,CAEpD,IAAIC,EAEJ,SAASC,EAASvH,EAAQ,CAEzBsH,EAAOtH,CAER,CAEA,SAAS4C,EAAQ4E,EAAOC,EAAQ,CAE/BvH,EAAG,WAAYoH,EAAME,EAAOC,CAAM,EAElCJ,EAAK,OAAQI,EAAOH,EAAM,CAAE,CAE7B,CAEA,SAASI,EAAiBF,EAAOC,EAAOE,EAAY,CAE9CA,IAAc,IAEnBzH,EAAG,oBAAqBoH,EAAME,EAAOC,EAAOE,CAAU,EAEtDN,EAAK,OAAQI,EAAOH,EAAMK,CAAU,EAErC,CAEA,SAASC,EAAiBC,EAAQC,EAAQC,EAAY,CAErD,GAAKA,IAAc,EAAI,OAELX,EAAW,IAAK,kBAAmB,EAC3C,qBAAsBE,EAAMO,EAAQ,EAAGC,EAAQ,EAAGC,CAAU,EAEtE,IAAIC,EAAe,EACnB,QAAU/G,EAAI,EAAGA,EAAI8G,EAAW9G,IAE/B+G,GAAgBF,EAAQ7G,CAAE,EAI3BoG,EAAK,OAAQW,EAAcV,EAAM,CAAE,CAEpC,CAEA,SAASW,EAA0BJ,EAAQC,EAAQC,EAAWJ,EAAY,CAEzE,GAAKI,IAAc,EAAI,OAEvB,IAAMG,EAAYd,EAAW,IAAK,kBAAmB,EAErD,GAAKc,IAAc,KAElB,QAAUjH,EAAI,EAAGA,EAAI4G,EAAO,OAAQ5G,IAEnCyG,EAAiBG,EAAQ5G,CAAE,EAAG6G,EAAQ7G,CAAE,EAAG0G,EAAW1G,CAAE,CAAE,MAIrD,CAENiH,EAAU,8BAA+BZ,EAAMO,EAAQ,EAAGC,EAAQ,EAAGH,EAAW,EAAGI,CAAU,EAE7F,IAAIC,EAAe,EACnB,QAAU/G,EAAI,EAAGA,EAAI8G,EAAW9G,IAE/B+G,GAAgBF,EAAQ7G,CAAE,EAAI0G,EAAW1G,CAAE,EAI5CoG,EAAK,OAAQW,EAAcV,EAAM,CAAE,CAEpC,CAED,CAIA,KAAK,QAAUC,EACf,KAAK,OAAS3E,EACd,KAAK,gBAAkB8E,EACvB,KAAK,gBAAkBE,EACvB,KAAK,yBAA2BK,CAEjC,CAEA,SAASE,IAAmBjI,EAAIkH,EAAYgB,EAAYC,EAAQ,CAE/D,IAAIC,EAEJ,SAASC,GAAmB,CAE3B,GAAKD,IAAkB,OAAY,OAAOA,EAE1C,GAAKlB,EAAW,IAAK,gCAAiC,IAAM,GAAO,CAElE,IAAMc,EAAYd,EAAW,IAAK,gCAAiC,EAEnEkB,EAAgBpI,EAAG,aAAcgI,EAAU,8BAA+B,CAE3E,MAECI,EAAgB,EAIjB,OAAOA,CAER,CAEA,SAASE,EAAuBC,EAAgB,CAE/C,MAAK,EAAAA,IAAkB1S,IAAcsS,EAAM,QAASI,CAAc,IAAMvI,EAAG,aAAcA,EAAG,gCAAiC,EAQ9H,CAEA,SAASwI,EAAqBC,EAAc,CAE3C,IAAMC,EAA4BD,IAAgB/b,KAAqBwa,EAAW,IAAK,6BAA8B,GAAKA,EAAW,IAAK,wBAAyB,GAEnK,MAAK,EAAAuB,IAAgBzL,IAAoBmL,EAAM,QAASM,CAAY,IAAMzI,EAAG,aAAcA,EAAG,8BAA+B,GAC5HyI,IAAgBjd,IAAa,CAAEkd,EAQjC,CAEA,SAASC,EAAiBC,EAAY,CAErC,GAAKA,IAAc,QAAU,CAE5B,GAAK5I,EAAG,yBAA0BA,EAAG,cAAeA,EAAG,UAAW,EAAE,UAAY,GAC/EA,EAAG,yBAA0BA,EAAG,gBAAiBA,EAAG,UAAW,EAAE,UAAY,EAE7E,MAAO,QAIR4I,EAAY,SAEb,CAEA,OAAKA,IAAc,WAEb5I,EAAG,yBAA0BA,EAAG,cAAeA,EAAG,YAAa,EAAE,UAAY,GACjFA,EAAG,yBAA0BA,EAAG,gBAAiBA,EAAG,YAAa,EAAE,UAAY,EAExE,UAMF,MAER,CAEA,IAAI4I,EAAYV,EAAW,YAAc,OAAYA,EAAW,UAAY,QACtEW,EAAeF,EAAiBC,CAAU,EAE3CC,IAAiBD,IAErBzJ,GAAM,iBAAkByJ,EAAW,uBAAwBC,EAAc,UAAW,EACpFD,EAAYC,GAIb,IAAMC,EAAyBZ,EAAW,yBAA2B,GAC/Da,EAAsBb,EAAW,sBAAwB,IAAQhB,EAAW,IAAK,kBAAmB,EAEpG8B,EAAchJ,EAAG,aAAcA,EAAG,uBAAwB,EAC1DiJ,EAAoBjJ,EAAG,aAAcA,EAAG,8BAA+B,EACvEkJ,EAAiBlJ,EAAG,aAAcA,EAAG,gBAAiB,EACtDmJ,EAAiBnJ,EAAG,aAAcA,EAAG,yBAA0B,EAE/DoJ,EAAgBpJ,EAAG,aAAcA,EAAG,kBAAmB,EACvDqJ,EAAoBrJ,EAAG,aAAcA,EAAG,0BAA2B,EACnEsJ,EAActJ,EAAG,aAAcA,EAAG,mBAAoB,EACtDuJ,EAAsBvJ,EAAG,aAAcA,EAAG,4BAA6B,EAEvEwJ,EAAaxJ,EAAG,aAAcA,EAAG,WAAY,EAC7CyJ,EAAUzJ,EAAG,aAAcA,EAAG,OAAQ,EAE5C,MAAO,CAEN,SAAU,GAEV,iBAAkBqI,EAClB,gBAAiBM,EAEjB,sBAAuBL,EACvB,oBAAqBE,EAErB,UAAWI,EACX,uBAAwBE,EACxB,oBAAqBC,EAErB,YAAaC,EACb,kBAAmBC,EACnB,eAAgBC,EAChB,eAAgBC,EAEhB,cAAeC,EACf,kBAAmBC,EACnB,YAAaC,EACb,oBAAqBC,EAErB,WAAYC,EAEZ,QAASC,CAEV,CAED,CAEA,SAASC,IAAeC,EAAa,CAEpC,IAAMC,EAAQ,KAEVC,EAAc,KACjBC,EAAkB,EAClBC,EAAuB,GACvBC,EAAmB,GAEdC,EAAQ,IAAI3V,GACjB4V,EAAmB,IAAIrZ,GAEvBsZ,EAAU,CAAE,MAAO,KAAM,YAAa,EAAM,EAE7C,KAAK,QAAUA,EACf,KAAK,UAAY,EACjB,KAAK,gBAAkB,EAEvB,KAAK,KAAO,SAAWC,EAAQC,EAAsB,CAEpD,IAAMC,EACLF,EAAO,SAAW,GAClBC,GAGAP,IAAoB,GACpBC,EAED,OAAAA,EAAuBM,EAEvBP,EAAkBM,EAAO,OAElBE,CAER,EAEA,KAAK,aAAe,UAAY,CAE/BN,EAAmB,GACnBO,EAAe,IAAK,CAErB,EAEA,KAAK,WAAa,UAAY,CAE7BP,EAAmB,EAEpB,EAEA,KAAK,eAAiB,SAAWI,EAAQnH,EAAS,CAEjD4G,EAAcU,EAAeH,EAAQnH,EAAQ,CAAE,CAEhD,EAEA,KAAK,SAAW,SAAWiB,EAAUjB,EAAQuH,EAAW,CAEvD,IAAMJ,EAASlG,EAAS,eACvBuG,EAAmBvG,EAAS,iBAC5BwG,EAAcxG,EAAS,YAElByG,EAAqBhB,EAAW,IAAKzF,CAAS,EAEpD,GAAK,CAAE6F,GAAwBK,IAAW,MAAQA,EAAO,SAAW,GAAKJ,GAAoB,CAAEU,EAIzFV,EAIJO,EAAe,IAAK,EAIpBK,EAAiB,MAIZ,CAEN,IAAMC,EAAUb,EAAmB,EAAIF,EACtCgB,EAAUD,EAAU,EAEjBE,EAAWJ,EAAmB,eAAiB,KAEnDR,EAAQ,MAAQY,EAEhBA,EAAWR,EAAeH,EAAQnH,EAAQ6H,EAASN,CAAS,EAE5D,QAAUzJ,EAAI,EAAGA,IAAM+J,EAAS,EAAG/J,EAElCgK,EAAUhK,CAAE,EAAI8I,EAAa9I,CAAE,EAIhC4J,EAAmB,cAAgBI,EACnC,KAAK,gBAAkBN,EAAmB,KAAK,UAAY,EAC3D,KAAK,WAAaI,CAEnB,CAGD,EAEA,SAASD,GAAmB,CAEtBT,EAAQ,QAAUN,IAEtBM,EAAQ,MAAQN,EAChBM,EAAQ,YAAcL,EAAkB,GAIzCF,EAAM,UAAYE,EAClBF,EAAM,gBAAkB,CAEzB,CAEA,SAASW,EAAeH,EAAQnH,EAAQ+H,EAAWC,EAAgB,CAElE,IAAMC,EAAUd,IAAW,KAAOA,EAAO,OAAS,EAC9CW,EAAW,KAEf,GAAKG,IAAY,EAAI,CAIpB,GAFAH,EAAWZ,EAAQ,MAEdc,IAAkB,IAAQF,IAAa,KAAO,CAElD,IAAMI,EAAWH,EAAYE,EAAU,EACtCE,EAAanI,EAAO,mBAErBiH,EAAiB,gBAAiBkB,CAAW,GAExCL,IAAa,MAAQA,EAAS,OAASI,KAE3CJ,EAAW,IAAI,aAAcI,CAAS,GAIvC,QAAUpK,EAAI,EAAGsK,EAAKL,EAAWjK,IAAMmK,EAAS,EAAGnK,EAAGsK,GAAM,EAE3DpB,EAAM,KAAMG,EAAQrJ,CAAE,CAAE,EAAE,aAAcqK,EAAYlB,CAAiB,EAErED,EAAM,OAAO,QAASc,EAAUM,CAAG,EACnCN,EAAUM,EAAK,CAAE,EAAIpB,EAAM,QAI7B,CAEAE,EAAQ,MAAQY,EAChBZ,EAAQ,YAAc,EAEvB,CAEA,OAAAP,EAAM,UAAYsB,EAClBtB,EAAM,gBAAkB,EAEjBmB,CAER,CAED,CAEA,SAASO,IAAe7J,EAAW,CAElC,IAAIC,EAAW,IAAI,QAEnB,SAAS6J,EAAmBC,EAASC,EAAU,CAE9C,OAAKA,IAAY1gB,GAEhBygB,EAAQ,QAAUtjB,GAEPujB,IAAYzgB,KAEvBwgB,EAAQ,QAAUrjB,IAIZqjB,CAER,CAEA,SAASrK,EAAKqK,EAAU,CAEvB,GAAKA,GAAWA,EAAQ,UAAY,CAEnC,IAAMC,EAAUD,EAAQ,QAExB,GAAKC,IAAY1gB,IAAoC0gB,IAAYzgB,GAEhE,GAAK0W,EAAS,IAAK8J,CAAQ,EAAI,CAE9B,IAAME,EAAUhK,EAAS,IAAK8J,CAAQ,EAAE,QACxC,OAAOD,EAAmBG,EAASF,EAAQ,OAAQ,CAEpD,KAAO,CAEN,IAAMG,EAAQH,EAAQ,MAEtB,GAAKG,GAASA,EAAM,OAAS,EAAI,CAEhC,IAAMC,EAAe,IAAI1N,GAAuByN,EAAM,MAAO,EAC7D,OAAAC,EAAa,2BAA4BnK,EAAU+J,CAAQ,EAC3D9J,EAAS,IAAK8J,EAASI,CAAa,EAEpCJ,EAAQ,iBAAkB,UAAWK,CAAiB,EAE/CN,EAAmBK,EAAa,QAASJ,EAAQ,OAAQ,CAEjE,KAIC,QAAO,IAIT,CAIF,CAEA,OAAOA,CAER,CAEA,SAASK,EAAkBC,EAAQ,CAElC,IAAMN,EAAUM,EAAM,OAEtBN,EAAQ,oBAAqB,UAAWK,CAAiB,EAEzD,IAAMH,EAAUhK,EAAS,IAAK8J,CAAQ,EAEjCE,IAAY,SAEhBhK,EAAS,OAAQ8J,CAAQ,EACzBE,EAAQ,QAAQ,EAIlB,CAEA,SAASnI,GAAU,CAElB7B,EAAW,IAAI,OAEhB,CAEA,MAAO,CACN,IAAKP,EACL,QAASoC,CACV,CAED,CA4pBA,SAASwI,IAAeC,EAAS,CAEhC,IAAMC,EAAW,CAAC,EACZC,EAAS,CAAC,EACVC,EAAY,CAAC,EAEfC,EAAMJ,EAEJK,EAAYL,EAASM,GAAU,EAAIC,GAAgB,OAEzD,QAAUxL,EAAI,EAAGA,EAAIsL,EAAWtL,IAAO,CAEtC,IAAMyL,EAAU,KAAK,IAAK,EAAGJ,CAAI,EACjCH,EAAS,KAAMO,CAAQ,EACvB,IAAIC,EAAQ,EAAMD,EAEbzL,EAAIiL,EAASM,GAEjBG,EAAQF,GAAiBxL,EAAIiL,EAASM,GAAU,CAAE,EAEvCvL,IAAM,IAEjB0L,EAAQ,GAITP,EAAO,KAAMO,CAAM,EAEnB,IAAMC,EAAY,GAAQF,EAAU,GAC9BG,EAAM,CAAED,EACRE,EAAM,EAAIF,EACVG,EAAM,CAAEF,EAAKA,EAAKC,EAAKD,EAAKC,EAAKA,EAAKD,EAAKA,EAAKC,EAAKA,EAAKD,EAAKC,CAAI,EAEnEE,EAAY,EACZC,EAAW,EACXC,EAAe,EACfC,EAAS,EACTC,EAAgB,EAEhBC,EAAW,IAAI,aAAcH,EAAeD,EAAWD,CAAU,EACjEM,EAAK,IAAI,aAAcH,EAASF,EAAWD,CAAU,EACrDO,EAAY,IAAI,aAAcH,EAAgBH,EAAWD,CAAU,EAEzE,QAAUQ,EAAO,EAAGA,EAAOR,EAAWQ,IAAU,CAE/C,IAAMC,EAAMD,EAAO,EAAM,EAAI,EAAI,EAC3BE,EAAIF,EAAO,EAAI,EAAI,GACnBG,EAAc,CACnBF,EAAGC,EAAG,EACND,EAAI,EAAI,EAAGC,EAAG,EACdD,EAAI,EAAI,EAAGC,EAAI,EAAG,EAClBD,EAAGC,EAAG,EACND,EAAI,EAAI,EAAGC,EAAI,EAAG,EAClBD,EAAGC,EAAI,EAAG,CACX,EACAL,EAAS,IAAKM,EAAaT,EAAeD,EAAWO,CAAK,EAC1DF,EAAG,IAAKP,EAAKI,EAASF,EAAWO,CAAK,EACtC,IAAMI,EAAO,CAAEJ,EAAMA,EAAMA,EAAMA,EAAMA,EAAMA,CAAK,EAClDD,EAAU,IAAKK,EAAMR,EAAgBH,EAAWO,CAAK,CAEtD,CAEA,IAAMlD,EAAS,IAAI5jB,GACnB4jB,EAAO,aAAc,WAAY,IAAI7jB,GAAiB4mB,EAAUH,CAAa,CAAE,EAC/E5C,EAAO,aAAc,KAAM,IAAI7jB,GAAiB6mB,EAAIH,CAAO,CAAE,EAC7D7C,EAAO,aAAc,YAAa,IAAI7jB,GAAiB8mB,EAAWH,CAAc,CAAE,EAClFf,EAAU,KAAM,IAAInb,GAAMoZ,EAAQ,IAAK,CAAE,EAEpCgC,EAAME,IAEVF,GAIF,CAEA,MAAO,CAAE,UAAAD,EAAW,SAAAF,EAAU,OAAAC,CAAO,CAEtC,CAEA,SAASyB,GAAqBC,EAAOC,EAAQC,EAAS,CAErD,IAAMC,EAAqB,IAAI5P,GAAmByP,EAAOC,EAAQC,CAAO,EACxE,OAAAC,EAAmB,QAAQ,QAAUzlB,GACrCylB,EAAmB,QAAQ,KAAO,eAClCA,EAAmB,YAAc,GAC1BA,CAER,CAEA,SAASC,GAAcC,EAAQV,EAAGC,EAAGI,EAAOC,EAAS,CAEpDI,EAAO,SAAS,IAAKV,EAAGC,EAAGI,EAAOC,CAAO,EACzCI,EAAO,QAAQ,IAAKV,EAAGC,EAAGI,EAAOC,CAAO,CAEzC,CAEA,SAASK,IAAelC,EAAQ4B,EAAOC,EAAS,CAyI/C,OAvIuB,IAAItU,GAAgB,CAE1C,KAAM,sBAEN,QAAS,CACR,YAAe4U,IACf,mBAAsB,EAAMP,EAC5B,oBAAuB,EAAMC,EAC7B,eAAkB,GAAG7B,CAAM,IAC5B,EAEA,SAAU,CACT,OAAU,CAAE,MAAO,IAAK,EACxB,UAAa,CAAE,MAAO,CAAI,EAC1B,OAAU,CAAE,MAAO,CAAE,CACtB,EAEA,aAAcoC,GAAuB,EAErC,eAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA8G1B,SAAU3b,GACV,UAAW,GACX,WAAY,EAEb,CAAE,CAIH,CAEA,SAAS4b,IAAgBrC,EAAQ4B,EAAOC,EAAS,CAEhD,IAAMS,EAAU,IAAI,aAAcC,EAAY,EACxCC,EAAW,IAAI9Q,EAAS,EAAG,EAAG,CAAE,EA4FtC,OA3FuB,IAAInE,GAAgB,CAE1C,KAAM,wBAEN,QAAS,CACR,EAAKgV,GACL,mBAAsB,EAAMX,EAC5B,oBAAuB,EAAMC,EAC7B,eAAkB,GAAG7B,CAAM,IAC5B,EAEA,SAAU,CACT,OAAU,CAAE,MAAO,IAAK,EACxB,QAAW,CAAE,MAAO,CAAE,EACtB,QAAW,CAAE,MAAOsC,CAAQ,EAC5B,YAAe,CAAE,MAAO,EAAM,EAC9B,OAAU,CAAE,MAAO,CAAE,EACrB,OAAU,CAAE,MAAO,CAAE,EACrB,SAAY,CAAE,MAAOE,CAAS,CAC/B,EAEA,aAAcJ,GAAuB,EAErC,eAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IA8D1B,SAAU3b,GACV,UAAW,GACX,WAAY,EAEb,CAAE,CAIH,CAEA,SAASgc,IAAuB,CAE/B,OAAO,IAAIlV,GAAgB,CAE1B,KAAM,0BAEN,SAAU,CACT,OAAU,CAAE,MAAO,IAAK,CACzB,EAEA,aAAc6U,GAAuB,EAErC,eAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAqB1B,SAAU3b,GACV,UAAW,GACX,WAAY,EAEb,CAAE,CAEH,CAEA,SAASic,IAAsB,CAE9B,OAAO,IAAInV,GAAgB,CAE1B,KAAM,kBAEN,SAAU,CACT,OAAU,CAAE,MAAO,IAAK,EACxB,WAAc,CAAE,MAAO,EAAG,CAC3B,EAEA,aAAc6U,GAAuB,EAErC,eAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAkB1B,SAAU3b,GACV,UAAW,GACX,WAAY,EAEb,CAAE,CAEH,CAEA,SAAS2b,IAAyB,CAEjC,MAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyDlB,CAEA,SAASO,IAAiBlN,EAAW,CAEpC,IAAImN,EAAa,IAAI,QAEjBC,EAAiB,KAErB,SAAS1N,EAAKqK,EAAU,CAEvB,GAAKA,GAAWA,EAAQ,UAAY,CAEnC,IAAMC,EAAUD,EAAQ,QAElBsD,EAAkBrD,IAAY1gB,IAAoC0gB,IAAYzgB,GAC9E+jB,EAActD,IAAYvjB,IAAyBujB,IAAYtjB,GAIrE,GAAK2mB,GAAiBC,EAAY,CAEjC,IAAInD,EAAegD,EAAW,IAAKpD,CAAQ,EAErCwD,EAAsBpD,IAAiB,OAAYA,EAAa,QAAQ,aAAe,EAE7F,GAAKJ,EAAQ,uBAAyBA,EAAQ,eAAiBwD,EAE9D,OAAKH,IAAmB,OAAOA,EAAiB,IAAI1a,GAAgBsN,CAAS,GAE7EmK,EAAekD,EAAgBD,EAAe,oBAAqBrD,EAASI,CAAa,EAAIiD,EAAe,YAAarD,EAASI,CAAa,EAC/IA,EAAa,QAAQ,aAAeJ,EAAQ,aAE5CoD,EAAW,IAAKpD,EAASI,CAAa,EAE/BA,EAAa,QAIpB,GAAKA,IAAiB,OAErB,OAAOA,EAAa,QAEd,CAEN,IAAMD,EAAQH,EAAQ,MAEtB,OAAOsD,GAAiBnD,GAASA,EAAM,OAAS,GAASoD,GAAapD,GAASsD,EAAuBtD,CAAM,GAEtGkD,IAAmB,OAAOA,EAAiB,IAAI1a,GAAgBsN,CAAS,GAE7EmK,EAAekD,EAAgBD,EAAe,oBAAqBrD,CAAQ,EAAIqD,EAAe,YAAarD,CAAQ,EACnHI,EAAa,QAAQ,aAAeJ,EAAQ,aAE5CoD,EAAW,IAAKpD,EAASI,CAAa,EAEtCJ,EAAQ,iBAAkB,UAAWK,CAAiB,EAE/CD,EAAa,SAMb,IAIT,CAIF,CAED,CAEA,OAAOJ,CAER,CAEA,SAASyD,EAAuBtD,EAAQ,CAEvC,IAAIpE,EAAQ,EACN2H,EAAS,EAEf,QAAUnO,EAAI,EAAGA,EAAImO,EAAQnO,IAEvB4K,EAAO5K,CAAE,IAAM,QAAYwG,IAIjC,OAAOA,IAAU2H,CAGlB,CAEA,SAASrD,EAAkBC,EAAQ,CAElC,IAAMN,EAAUM,EAAM,OAEtBN,EAAQ,oBAAqB,UAAWK,CAAiB,EAEzD,IAAMsD,EAAYP,EAAW,IAAKpD,CAAQ,EAErC2D,IAAc,SAElBP,EAAW,OAAQpD,CAAQ,EAC3B2D,EAAU,QAAQ,EAIpB,CAEA,SAAS5L,GAAU,CAElBqL,EAAa,IAAI,QAEZC,IAAmB,OAEvBA,EAAe,QAAQ,EACvBA,EAAiB,KAInB,CAEA,MAAO,CACN,IAAK1N,EACL,QAASoC,CACV,CAED,CAEA,SAAS6L,IAAiBpP,EAAK,CAE9B,IAAMkH,EAAa,CAAC,EAEpB,SAASmI,EAAc5J,EAAO,CAE7B,GAAKyB,EAAYzB,CAAK,IAAM,OAE3B,OAAOyB,EAAYzB,CAAK,EAIzB,IAAMuC,EAAYhI,EAAG,aAAcyF,CAAK,EAExC,OAAAyB,EAAYzB,CAAK,EAAIuC,EAEdA,CAER,CAEA,MAAO,CAEN,IAAK,SAAWvC,EAAO,CAEtB,OAAO4J,EAAc5J,CAAK,IAAM,IAEjC,EAEA,KAAM,UAAY,CAEjB4J,EAAc,wBAAyB,EACvCA,EAAc,0BAA2B,EACzCA,EAAc,0BAA2B,EACzCA,EAAc,6BAA8B,EAC5CA,EAAc,sCAAuC,EACrDA,EAAc,8BAA+B,CAE9C,EAEA,IAAK,SAAW5J,EAAO,CAEtB,IAAMuC,EAAYqH,EAAc5J,CAAK,EAErC,OAAKuC,IAAc,MAElB5I,GAAU,kBAAoBqG,EAAO,2BAA4B,EAI3DuC,CAER,CAED,CAED,CAEA,SAASsH,IAAiBtP,EAAIyD,EAAY0D,EAAMxD,EAAgB,CAE/D,IAAM4L,EAAa,CAAC,EACdC,EAAsB,IAAI,QAEhC,SAASC,EAAmB3D,EAAQ,CAEnC,IAAM1H,EAAW0H,EAAM,OAElB1H,EAAS,QAAU,MAEvBX,EAAW,OAAQW,EAAS,KAAM,EAInC,QAAYqB,KAAQrB,EAAS,WAE5BX,EAAW,OAAQW,EAAS,WAAYqB,CAAK,CAAE,EAIhDrB,EAAS,oBAAqB,UAAWqL,CAAkB,EAE3D,OAAOF,EAAYnL,EAAS,EAAG,EAE/B,IAAMjE,EAAYqP,EAAoB,IAAKpL,CAAS,EAE/CjE,IAEJsD,EAAW,OAAQtD,CAAU,EAC7BqP,EAAoB,OAAQpL,CAAS,GAItCT,EAAc,wBAAyBS,CAAS,EAE3CA,EAAS,4BAA8B,IAE3C,OAAOA,EAAS,kBAMjB+C,EAAK,OAAO,YAEb,CAEA,SAAShG,EAAK8C,EAAQG,EAAW,CAEhC,OAAKmL,EAAYnL,EAAS,EAAG,IAAM,KAEnCA,EAAS,iBAAkB,UAAWqL,CAAkB,EAExDF,EAAYnL,EAAS,EAAG,EAAI,GAE5B+C,EAAK,OAAO,cAEL/C,CAER,CAEA,SAAS9C,EAAQ8C,EAAW,CAE3B,IAAMkB,EAAqBlB,EAAS,WAIpC,QAAYqB,KAAQH,EAEnB7B,EAAW,OAAQ6B,EAAoBG,CAAK,EAAGzF,EAAG,YAAa,CAIjE,CAEA,SAAS0P,EAA0BtL,EAAW,CAE7C,IAAMuL,EAAU,CAAC,EAEXC,EAAgBxL,EAAS,MACzByL,EAAmBzL,EAAS,WAAW,SACzC0L,EAAU,EAEd,GAAKF,IAAkB,KAAO,CAE7B,IAAMvP,EAAQuP,EAAc,MAC5BE,EAAUF,EAAc,QAExB,QAAU7O,EAAI,EAAGG,EAAIb,EAAM,OAAQU,EAAIG,EAAGH,GAAK,EAAI,CAElD,IAAMH,EAAIP,EAAOU,EAAI,CAAE,EACjBF,EAAIR,EAAOU,EAAI,CAAE,EACjBgP,EAAI1P,EAAOU,EAAI,CAAE,EAEvB4O,EAAQ,KAAM/O,EAAGC,EAAGA,EAAGkP,EAAGA,EAAGnP,CAAE,CAEhC,CAED,SAAYiP,IAAqB,OAAY,CAE5C,IAAMxP,EAAQwP,EAAiB,MAC/BC,EAAUD,EAAiB,QAE3B,QAAU9O,EAAI,EAAGG,EAAMb,EAAM,OAAS,EAAM,EAAGU,EAAIG,EAAGH,GAAK,EAAI,CAE9D,IAAMH,EAAIG,EAAI,EACRF,EAAIE,EAAI,EACRgP,EAAIhP,EAAI,EAEd4O,EAAQ,KAAM/O,EAAGC,EAAGA,EAAGkP,EAAGA,EAAGnP,CAAE,CAEhC,CAED,KAEC,QAID,IAAMT,EAAY,IAAM6P,GAAkBL,CAAQ,EAAIlT,GAAwBD,IAAyBmT,EAAS,CAAE,EAClHxP,EAAU,QAAU2P,EAMpB,IAAMG,EAAoBT,EAAoB,IAAKpL,CAAS,EAEvD6L,GAAoBxM,EAAW,OAAQwM,CAAkB,EAI9DT,EAAoB,IAAKpL,EAAUjE,CAAU,CAE9C,CAEA,SAAS+P,EAAuB9L,EAAW,CAE1C,IAAM+L,EAAmBX,EAAoB,IAAKpL,CAAS,EAE3D,GAAK+L,EAAmB,CAEvB,IAAMP,EAAgBxL,EAAS,MAE1BwL,IAAkB,MAIjBO,EAAiB,QAAUP,EAAc,SAE7CF,EAA0BtL,CAAS,CAMtC,MAECsL,EAA0BtL,CAAS,EAIpC,OAAOoL,EAAoB,IAAKpL,CAAS,CAE1C,CAEA,MAAO,CAEN,IAAKjD,EACL,OAAQG,EAER,sBAAuB4O,CAExB,CAED,CAEA,SAASE,IAA4BpQ,EAAIkH,EAAYC,EAAO,CAE3D,IAAIC,EAEJ,SAASC,EAASvH,EAAQ,CAEzBsH,EAAOtH,CAER,CAEA,IAAIW,EAAMiG,EAEV,SAAS2J,EAAUvQ,EAAQ,CAE1BW,EAAOX,EAAM,KACb4G,EAAkB5G,EAAM,eAEzB,CAEA,SAAS4C,EAAQ4E,EAAOC,EAAQ,CAE/BvH,EAAG,aAAcoH,EAAMG,EAAO9G,EAAM6G,EAAQZ,CAAgB,EAE5DS,EAAK,OAAQI,EAAOH,EAAM,CAAE,CAE7B,CAEA,SAASI,EAAiBF,EAAOC,EAAOE,EAAY,CAE9CA,IAAc,IAEnBzH,EAAG,sBAAuBoH,EAAMG,EAAO9G,EAAM6G,EAAQZ,EAAiBe,CAAU,EAEhFN,EAAK,OAAQI,EAAOH,EAAMK,CAAU,EAErC,CAEA,SAASC,EAAiBC,EAAQC,EAAQC,EAAY,CAErD,GAAKA,IAAc,EAAI,OAELX,EAAW,IAAK,kBAAmB,EAC3C,uBAAwBE,EAAMQ,EAAQ,EAAGnH,EAAMkH,EAAQ,EAAGE,CAAU,EAE9E,IAAIC,EAAe,EACnB,QAAU/G,EAAI,EAAGA,EAAI8G,EAAW9G,IAE/B+G,GAAgBF,EAAQ7G,CAAE,EAI3BoG,EAAK,OAAQW,EAAcV,EAAM,CAAE,CAGpC,CAEA,SAASW,EAA0BJ,EAAQC,EAAQC,EAAWJ,EAAY,CAEzE,GAAKI,IAAc,EAAI,OAEvB,IAAMG,EAAYd,EAAW,IAAK,kBAAmB,EAErD,GAAKc,IAAc,KAElB,QAAUjH,EAAI,EAAGA,EAAI4G,EAAO,OAAQ5G,IAEnCyG,EAAiBG,EAAQ5G,CAAE,EAAI2F,EAAiBkB,EAAQ7G,CAAE,EAAG0G,EAAW1G,CAAE,CAAE,MAIvE,CAENiH,EAAU,gCAAiCZ,EAAMQ,EAAQ,EAAGnH,EAAMkH,EAAQ,EAAGF,EAAW,EAAGI,CAAU,EAErG,IAAIC,EAAe,EACnB,QAAU/G,EAAI,EAAGA,EAAI8G,EAAW9G,IAE/B+G,GAAgBF,EAAQ7G,CAAE,EAAI0G,EAAW1G,CAAE,EAI5CoG,EAAK,OAAQW,EAAcV,EAAM,CAAE,CAEpC,CAED,CAIA,KAAK,QAAUC,EACf,KAAK,SAAWgJ,EAChB,KAAK,OAAS3N,EACd,KAAK,gBAAkB8E,EACvB,KAAK,gBAAkBE,EACvB,KAAK,yBAA2BK,CAEjC,CAEA,SAASuI,IAAWtQ,EAAK,CAExB,IAAMuQ,EAAS,CACd,WAAY,EACZ,SAAU,CACX,EAEM7N,EAAS,CACd,MAAO,EACP,MAAO,EACP,UAAW,EACX,OAAQ,EACR,MAAO,CACR,EAEA,SAASpB,EAAQiG,EAAOH,EAAMoJ,EAAgB,CAI7C,OAFA9N,EAAO,QAEE0E,EAAO,CAEf,KAAKpH,EAAG,UACP0C,EAAO,WAAa8N,GAAkBjJ,EAAQ,GAC9C,MAED,KAAKvH,EAAG,MACP0C,EAAO,OAAS8N,GAAkBjJ,EAAQ,GAC1C,MAED,KAAKvH,EAAG,WACP0C,EAAO,OAAS8N,GAAkBjJ,EAAQ,GAC1C,MAED,KAAKvH,EAAG,UACP0C,EAAO,OAAS8N,EAAgBjJ,EAChC,MAED,KAAKvH,EAAG,OACP0C,EAAO,QAAU8N,EAAgBjJ,EACjC,MAED,QACCxI,GAAO,gCAAiCqI,CAAK,EAC7C,KAEF,CAED,CAEA,SAAST,GAAQ,CAEhBjE,EAAO,MAAQ,EACfA,EAAO,UAAY,EACnBA,EAAO,OAAS,EAChBA,EAAO,MAAQ,CAEhB,CAEA,MAAO,CACN,OAAQ6N,EACR,OAAQ7N,EACR,SAAU,KACV,UAAW,GACX,MAAOiE,EACP,OAAQrF,CACT,CAED,CAEA,SAASmP,IAAmBzQ,EAAI0Q,EAAcC,EAAW,CAExD,IAAMC,EAAgB,IAAI,QACpBC,EAAQ,IAAIlT,GAElB,SAAS2D,EAAQ2C,EAAQG,EAAUD,EAAU,CAE5C,IAAM2M,EAAmB7M,EAAO,sBAI1B8M,EAAiB3M,EAAS,gBAAgB,UAAYA,EAAS,gBAAgB,QAAUA,EAAS,gBAAgB,MAClH4M,EAAsBD,IAAmB,OAAcA,EAAe,OAAS,EAEjFE,EAAQL,EAAc,IAAKxM,CAAS,EAExC,GAAK6M,IAAU,QAAaA,EAAM,QAAUD,EAAoB,CA+F/D,IAASE,EAAT,UAA0B,CAEzB1F,EAAQ,QAAQ,EAEhBoF,EAAc,OAAQxM,CAAS,EAE/BA,EAAS,oBAAqB,UAAW8M,CAAe,CAEzD,EArGKD,IAAU,QAAYA,EAAM,QAAQ,QAAQ,EAEjD,IAAME,EAAmB/M,EAAS,gBAAgB,WAAa,OACzDgN,EAAkBhN,EAAS,gBAAgB,SAAW,OACtDiN,EAAiBjN,EAAS,gBAAgB,QAAU,OAEpDkN,EAAelN,EAAS,gBAAgB,UAAY,CAAC,EACrDmN,EAAenN,EAAS,gBAAgB,QAAU,CAAC,EACnDoN,EAAcpN,EAAS,gBAAgB,OAAS,CAAC,EAEnDqN,EAAkB,EAEjBN,IAAqB,KAAOM,EAAkB,GAC9CL,IAAoB,KAAOK,EAAkB,GAC7CJ,IAAmB,KAAOI,EAAkB,GAEjD,IAAI7D,EAAQxJ,EAAS,WAAW,SAAS,MAAQqN,EAC7C5D,EAAS,EAERD,EAAQ8C,EAAa,iBAEzB7C,EAAS,KAAK,KAAMD,EAAQ8C,EAAa,cAAe,EACxD9C,EAAQ8C,EAAa,gBAItB,IAAMlQ,EAAS,IAAI,aAAcoN,EAAQC,EAAS,EAAImD,CAAkB,EAElExF,EAAU,IAAIniB,GAAkBmX,EAAQoN,EAAOC,EAAQmD,CAAkB,EAC/ExF,EAAQ,KAAOhgB,GACfggB,EAAQ,YAAc,GAItB,IAAMkG,EAAmBD,EAAkB,EAE3C,QAAU1Q,EAAI,EAAGA,EAAIiQ,EAAmBjQ,IAAO,CAE9C,IAAM4Q,EAAcL,EAAcvQ,CAAE,EAC9B6Q,EAAcL,EAAcxQ,CAAE,EAC9B8Q,EAAaL,EAAazQ,CAAE,EAE5BuF,EAASsH,EAAQC,EAAS,EAAI9M,EAEpC,QAAU+Q,EAAI,EAAGA,EAAIH,EAAY,MAAOG,IAAO,CAE9C,IAAMzL,EAASyL,EAAIJ,EAEdP,IAAqB,KAEzBN,EAAM,oBAAqBc,EAAaG,CAAE,EAE1CtR,EAAQ8F,EAASD,EAAS,CAAE,EAAIwK,EAAM,EACtCrQ,EAAQ8F,EAASD,EAAS,CAAE,EAAIwK,EAAM,EACtCrQ,EAAQ8F,EAASD,EAAS,CAAE,EAAIwK,EAAM,EACtCrQ,EAAQ8F,EAASD,EAAS,CAAE,EAAI,GAI5B+K,IAAoB,KAExBP,EAAM,oBAAqBe,EAAaE,CAAE,EAE1CtR,EAAQ8F,EAASD,EAAS,CAAE,EAAIwK,EAAM,EACtCrQ,EAAQ8F,EAASD,EAAS,CAAE,EAAIwK,EAAM,EACtCrQ,EAAQ8F,EAASD,EAAS,CAAE,EAAIwK,EAAM,EACtCrQ,EAAQ8F,EAASD,EAAS,CAAE,EAAI,GAI5BgL,IAAmB,KAEvBR,EAAM,oBAAqBgB,EAAYC,CAAE,EAEzCtR,EAAQ8F,EAASD,EAAS,CAAE,EAAIwK,EAAM,EACtCrQ,EAAQ8F,EAASD,EAAS,CAAE,EAAIwK,EAAM,EACtCrQ,EAAQ8F,EAASD,EAAS,EAAG,EAAIwK,EAAM,EACvCrQ,EAAQ8F,EAASD,EAAS,EAAG,EAAMwL,EAAW,WAAa,EAAMhB,EAAM,EAAI,EAI7E,CAED,CAEAI,EAAQ,CACP,MAAOD,EACP,QAASxF,EACT,KAAM,IAAI/N,GAASmQ,EAAOC,CAAO,CAClC,EAEA+C,EAAc,IAAKxM,EAAU6M,CAAM,EAYnC7M,EAAS,iBAAkB,UAAW8M,CAAe,CAEtD,CAGA,GAAKjN,EAAO,kBAAoB,IAAQA,EAAO,eAAiB,KAE/DE,EAAQ,YAAY,EAAE,SAAUnE,EAAI,eAAgBiE,EAAO,aAAc0M,CAAS,MAE5E,CAEN,IAAIoB,EAAqB,EAEzB,QAAUhR,EAAI,EAAGA,EAAI+P,EAAiB,OAAQ/P,IAE7CgR,GAAsBjB,EAAkB/P,CAAE,EAI3C,IAAMiR,EAAqB5N,EAAS,qBAAuB,EAAI,EAAI2N,EAGnE5N,EAAQ,YAAY,EAAE,SAAUnE,EAAI,2BAA4BgS,CAAmB,EACnF7N,EAAQ,YAAY,EAAE,SAAUnE,EAAI,wBAAyB8Q,CAAiB,CAE/E,CAEA3M,EAAQ,YAAY,EAAE,SAAUnE,EAAI,sBAAuBiR,EAAM,QAASN,CAAS,EACnFxM,EAAQ,YAAY,EAAE,SAAUnE,EAAI,0BAA2BiR,EAAM,IAAK,CAE3E,CAEA,MAAO,CAEN,OAAQ3P,CAET,CAED,CAEA,SAAS2Q,IAAcjS,EAAIuP,EAAY9L,EAAY0D,EAAO,CAEzD,IAAI+K,EAAY,IAAI,QAEpB,SAAS5Q,EAAQ2C,EAAS,CAEzB,IAAMrE,EAAQuH,EAAK,OAAO,MAEpB/C,EAAWH,EAAO,SAClBkO,EAAiB5C,EAAW,IAAKtL,EAAQG,CAAS,EAoCxD,GAhCK8N,EAAU,IAAKC,CAAe,IAAMvS,IAExC2P,EAAW,OAAQ4C,CAAe,EAElCD,EAAU,IAAKC,EAAgBvS,CAAM,GAIjCqE,EAAO,kBAENA,EAAO,iBAAkB,UAAWmO,CAAuB,IAAM,IAErEnO,EAAO,iBAAkB,UAAWmO,CAAuB,EAIvDF,EAAU,IAAKjO,CAAO,IAAMrE,IAEhC6D,EAAW,OAAQQ,EAAO,eAAgBjE,EAAG,YAAa,EAErDiE,EAAO,gBAAkB,MAE7BR,EAAW,OAAQQ,EAAO,cAAejE,EAAG,YAAa,EAI1DkS,EAAU,IAAKjO,EAAQrE,CAAM,IAM1BqE,EAAO,cAAgB,CAE3B,IAAMoO,EAAWpO,EAAO,SAEnBiO,EAAU,IAAKG,CAAS,IAAMzS,IAElCyS,EAAS,OAAO,EAEhBH,EAAU,IAAKG,EAAUzS,CAAM,EAIjC,CAEA,OAAOuS,CAER,CAEA,SAAS5O,GAAU,CAElB2O,EAAY,IAAI,OAEjB,CAEA,SAASE,EAAwBtG,EAAQ,CAExC,IAAMwG,EAAgBxG,EAAM,OAE5BwG,EAAc,oBAAqB,UAAWF,CAAuB,EAErE3O,EAAW,OAAQ6O,EAAc,cAAe,EAE3CA,EAAc,gBAAkB,MAAO7O,EAAW,OAAQ6O,EAAc,aAAc,CAE5F,CAEA,MAAO,CAEN,OAAQhR,EACR,QAASiC,CAEV,CAED,CAYA,SAASgP,IAAa9R,EAAMmN,EAAOC,EAAQ2E,EAAOC,EAAU,CAG3D,IAAMC,EAAU,IAAIvU,GAAmByP,EAAOC,EAAQ,CACrD,KAAMpN,EACN,YAAa+R,EACb,cAAeC,CAChB,CAAE,EAEIE,EAAU,IAAIxU,GAAmByP,EAAOC,EAAQ,CACrD,KAAMnhB,GACN,YAAa,GACb,cAAe,EAChB,CAAE,EAGI0X,EAAW,IAAI5d,GACrB4d,EAAS,aAAc,WAAY,IAAI7Y,GAAwB,CAAE,GAAI,EAAG,EAAG,GAAI,GAAI,EAAG,EAAG,GAAI,CAAE,EAAG,CAAE,CAAE,EACtG6Y,EAAS,aAAc,KAAM,IAAI7Y,GAAwB,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,CAAE,EAGnF,IAAM2Y,EAAW,IAAIjM,GAAmB,CACvC,SAAU,CACT,SAAU,CAAE,MAAO,IAAK,CACzB,EACA,aAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAexB,eAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAiC1B,UAAW,GACX,WAAY,EACb,CAAE,EAEI2a,EAAO,IAAI5hB,GAAMoT,EAAUF,CAAS,EACpCjB,EAAS,IAAIjP,GAAoB,GAAI,EAAG,EAAG,GAAI,EAAG,CAAE,EAEtD6e,EAAoB,KACpBC,EAAqB,KACrBC,EAAiB,GACjBC,EACAC,EAAqB,KACrBC,EAAW,CAAC,EACZC,EAAiB,GAErB,KAAK,QAAU,SAAWvF,EAAOC,EAAS,CAEzC6E,EAAQ,QAAS9E,EAAOC,CAAO,EAC/B8E,EAAQ,QAAS/E,EAAOC,CAAO,EAE/B,QAAU9M,EAAI,EAAGA,EAAImS,EAAS,OAAQnS,IAAO,CAE5C,IAAMqS,EAASF,EAAUnS,CAAE,EACtBqS,EAAO,SAAUA,EAAO,QAASxF,EAAOC,CAAO,CAErD,CAED,EAEA,KAAK,WAAa,SAAWwF,EAAU,CAEtCH,EAAWG,EACXF,EAAiBD,EAAS,OAAS,GAAKA,EAAU,CAAE,EAAE,eAAiB,GAEvE,IAAMtF,EAAQ8E,EAAQ,MAChB7E,EAAS6E,EAAQ,OAEvB,QAAU3R,EAAI,EAAGA,EAAImS,EAAS,OAAQnS,IAAO,CAE5C,IAAMqS,EAASF,EAAUnS,CAAE,EACtBqS,EAAO,SAAUA,EAAO,QAASxF,EAAOC,CAAO,CAErD,CAED,EAEA,KAAK,MAAQ,SAAWpM,EAAUmK,EAAe,CAKhD,GAFKmH,GAEAtR,EAAS,cAAgB7O,IAAiBsgB,EAAS,SAAW,EAAI,MAAO,GAK9E,GAHAD,EAAqBrH,EAGhBA,IAAiB,KAAO,CAE5B,IAAMgC,EAAQhC,EAAa,MACrBiC,EAASjC,EAAa,QAEvB8G,EAAQ,QAAU9E,GAAS8E,EAAQ,SAAW7E,IAElD,KAAK,QAASD,EAAOC,CAAO,CAI9B,CAGA,OAAKsF,IAAmB,IAEvB1R,EAAS,gBAAiBiR,CAAQ,EAKnCM,EAAoBvR,EAAS,YAC7BA,EAAS,YAAc7O,GAEhB,EAER,EAEA,KAAK,cAAgB,UAAY,CAEhC,OAAOugB,CAER,EAEA,KAAK,IAAM,SAAW1R,EAAU6R,EAAY,CAG3C7R,EAAS,YAAcuR,EAEvBD,EAAiB,GAGjB,IAAIQ,EAAab,EACbc,EAAcb,EAElB,QAAU5R,EAAI,EAAGA,EAAImS,EAAS,OAAQnS,IAAO,CAE5C,IAAMqS,EAASF,EAAUnS,CAAE,EAE3B,GAAKqS,EAAO,UAAY,KAExBA,EAAO,OAAQ3R,EAAU+R,EAAaD,EAAYD,CAAU,EAEvDF,EAAO,YAAc,IAAQ,CAEjC,IAAMK,EAAOF,EACbA,EAAaC,EACbA,EAAcC,CAEf,CAED,CAGA,GAAKZ,IAAsBpR,EAAS,kBAAoBqR,IAAuBrR,EAAS,YAAc,CAErGoR,EAAoBpR,EAAS,iBAC7BqR,EAAqBrR,EAAS,YAE9ByC,EAAS,QAAU,CAAC,EAEf3c,GAAgB,YAAasrB,CAAkB,IAAM1Z,KAAe+K,EAAS,QAAQ,cAAgB,IAE1G,IAAMwP,EAAcC,IAAgBb,CAAmB,EAClDY,IAAcxP,EAAS,QAASwP,CAAY,EAAI,IAErDxP,EAAS,YAAc,EAExB,CAGAA,EAAS,SAAS,SAAS,MAAQqP,EAAW,QAC9C9R,EAAS,gBAAiBwR,CAAmB,EAC7CxR,EAAS,OAAQmR,EAAM3P,CAAO,EAE9BgQ,EAAqB,KACrBF,EAAiB,EAElB,EAEA,KAAK,cAAgB,UAAY,CAEhC,OAAOA,CAER,EAEA,KAAK,QAAU,UAAY,CAE1BL,EAAQ,QAAQ,EAChBC,EAAQ,QAAQ,EAChBvO,EAAS,QAAQ,EACjBF,EAAS,QAAQ,CAElB,CAED,CAqEA,SAAS0P,GAASvT,EAAOwT,EAASC,EAAY,CAE7C,IAAMC,EAAY1T,EAAO,CAAE,EAE3B,GAAK0T,GAAa,GAAKA,EAAY,EAAI,OAAO1T,EAI9C,IAAM2T,EAAIH,EAAUC,EAChBG,EAAIC,GAAeF,CAAE,EASzB,GAPKC,IAAM,SAEVA,EAAI,IAAI,aAAcD,CAAE,EACxBE,GAAeF,CAAE,EAAIC,GAIjBJ,IAAY,EAAI,CAEpBE,EAAU,QAASE,EAAG,CAAE,EAExB,QAAUlT,EAAI,EAAGuF,EAAS,EAAGvF,IAAM8S,EAAS,EAAG9S,EAE9CuF,GAAUwN,EACVzT,EAAOU,CAAE,EAAE,QAASkT,EAAG3N,CAAO,CAIhC,CAEA,OAAO2N,CAER,CAEA,SAASE,GAAavT,EAAGC,EAAI,CAE5B,GAAKD,EAAE,SAAWC,EAAE,OAAS,MAAO,GAEpC,QAAUE,EAAI,EAAGG,EAAIN,EAAE,OAAQG,EAAIG,EAAGH,IAErC,GAAKH,EAAGG,CAAE,IAAMF,EAAGE,CAAE,EAAI,MAAO,GAIjC,MAAO,EAER,CAEA,SAASqT,GAAWxT,EAAGC,EAAI,CAE1B,QAAUE,EAAI,EAAGG,EAAIL,EAAE,OAAQE,EAAIG,EAAGH,IAErCH,EAAGG,CAAE,EAAIF,EAAGE,CAAE,CAIhB,CAIA,SAASsT,GAAe1D,EAAUqD,EAAI,CAErC,IAAIC,EAAIK,GAAeN,CAAE,EAEpBC,IAAM,SAEVA,EAAI,IAAI,WAAYD,CAAE,EACtBM,GAAeN,CAAE,EAAIC,GAItB,QAAUlT,EAAI,EAAGA,IAAMiT,EAAG,EAAGjT,EAE5BkT,EAAGlT,CAAE,EAAI4P,EAAS,oBAAoB,EAIvC,OAAOsD,CAER,CASA,SAASM,IAAavU,EAAIwU,EAAI,CAE7B,IAAM5O,EAAQ,KAAK,MAEdA,EAAO,CAAE,IAAM4O,IAEpBxU,EAAG,UAAW,KAAK,KAAMwU,CAAE,EAE3B5O,EAAO,CAAE,EAAI4O,EAEd,CAIA,SAASC,IAAazU,EAAIwU,EAAI,CAE7B,IAAM5O,EAAQ,KAAK,MAEnB,GAAK4O,EAAE,IAAM,QAEP5O,EAAO,CAAE,IAAM4O,EAAE,GAAK5O,EAAO,CAAE,IAAM4O,EAAE,KAE3CxU,EAAG,UAAW,KAAK,KAAMwU,EAAE,EAAGA,EAAE,CAAE,EAElC5O,EAAO,CAAE,EAAI4O,EAAE,EACf5O,EAAO,CAAE,EAAI4O,EAAE,OAIV,CAEN,GAAKL,GAAavO,EAAO4O,CAAE,EAAI,OAE/BxU,EAAG,WAAY,KAAK,KAAMwU,CAAE,EAE5BJ,GAAWxO,EAAO4O,CAAE,CAErB,CAED,CAEA,SAASE,IAAa1U,EAAIwU,EAAI,CAE7B,IAAM5O,EAAQ,KAAK,MAEnB,GAAK4O,EAAE,IAAM,QAEP5O,EAAO,CAAE,IAAM4O,EAAE,GAAK5O,EAAO,CAAE,IAAM4O,EAAE,GAAK5O,EAAO,CAAE,IAAM4O,EAAE,KAEjExU,EAAG,UAAW,KAAK,KAAMwU,EAAE,EAAGA,EAAE,EAAGA,EAAE,CAAE,EAEvC5O,EAAO,CAAE,EAAI4O,EAAE,EACf5O,EAAO,CAAE,EAAI4O,EAAE,EACf5O,EAAO,CAAE,EAAI4O,EAAE,WAILA,EAAE,IAAM,QAEd5O,EAAO,CAAE,IAAM4O,EAAE,GAAK5O,EAAO,CAAE,IAAM4O,EAAE,GAAK5O,EAAO,CAAE,IAAM4O,EAAE,KAEjExU,EAAG,UAAW,KAAK,KAAMwU,EAAE,EAAGA,EAAE,EAAGA,EAAE,CAAE,EAEvC5O,EAAO,CAAE,EAAI4O,EAAE,EACf5O,EAAO,CAAE,EAAI4O,EAAE,EACf5O,EAAO,CAAE,EAAI4O,EAAE,OAIV,CAEN,GAAKL,GAAavO,EAAO4O,CAAE,EAAI,OAE/BxU,EAAG,WAAY,KAAK,KAAMwU,CAAE,EAE5BJ,GAAWxO,EAAO4O,CAAE,CAErB,CAED,CAEA,SAASG,IAAa3U,EAAIwU,EAAI,CAE7B,IAAM5O,EAAQ,KAAK,MAEnB,GAAK4O,EAAE,IAAM,QAEP5O,EAAO,CAAE,IAAM4O,EAAE,GAAK5O,EAAO,CAAE,IAAM4O,EAAE,GAAK5O,EAAO,CAAE,IAAM4O,EAAE,GAAK5O,EAAO,CAAE,IAAM4O,EAAE,KAEvFxU,EAAG,UAAW,KAAK,KAAMwU,EAAE,EAAGA,EAAE,EAAGA,EAAE,EAAGA,EAAE,CAAE,EAE5C5O,EAAO,CAAE,EAAI4O,EAAE,EACf5O,EAAO,CAAE,EAAI4O,EAAE,EACf5O,EAAO,CAAE,EAAI4O,EAAE,EACf5O,EAAO,CAAE,EAAI4O,EAAE,OAIV,CAEN,GAAKL,GAAavO,EAAO4O,CAAE,EAAI,OAE/BxU,EAAG,WAAY,KAAK,KAAMwU,CAAE,EAE5BJ,GAAWxO,EAAO4O,CAAE,CAErB,CAED,CAIA,SAASI,IAAY5U,EAAIwU,EAAI,CAE5B,IAAM5O,EAAQ,KAAK,MACbiP,EAAWL,EAAE,SAEnB,GAAKK,IAAa,OAAY,CAE7B,GAAKV,GAAavO,EAAO4O,CAAE,EAAI,OAE/BxU,EAAG,iBAAkB,KAAK,KAAM,GAAOwU,CAAE,EAEzCJ,GAAWxO,EAAO4O,CAAE,CAErB,KAAO,CAEN,GAAKL,GAAavO,EAAOiP,CAAS,EAAI,OAEtCC,GAAU,IAAKD,CAAS,EAExB7U,EAAG,iBAAkB,KAAK,KAAM,GAAO8U,EAAU,EAEjDV,GAAWxO,EAAOiP,CAAS,CAE5B,CAED,CAEA,SAASE,IAAY/U,EAAIwU,EAAI,CAE5B,IAAM5O,EAAQ,KAAK,MACbiP,EAAWL,EAAE,SAEnB,GAAKK,IAAa,OAAY,CAE7B,GAAKV,GAAavO,EAAO4O,CAAE,EAAI,OAE/BxU,EAAG,iBAAkB,KAAK,KAAM,GAAOwU,CAAE,EAEzCJ,GAAWxO,EAAO4O,CAAE,CAErB,KAAO,CAEN,GAAKL,GAAavO,EAAOiP,CAAS,EAAI,OAEtCG,GAAU,IAAKH,CAAS,EAExB7U,EAAG,iBAAkB,KAAK,KAAM,GAAOgV,EAAU,EAEjDZ,GAAWxO,EAAOiP,CAAS,CAE5B,CAED,CAEA,SAASI,IAAYjV,EAAIwU,EAAI,CAE5B,IAAM5O,EAAQ,KAAK,MACbiP,EAAWL,EAAE,SAEnB,GAAKK,IAAa,OAAY,CAE7B,GAAKV,GAAavO,EAAO4O,CAAE,EAAI,OAE/BxU,EAAG,iBAAkB,KAAK,KAAM,GAAOwU,CAAE,EAEzCJ,GAAWxO,EAAO4O,CAAE,CAErB,KAAO,CAEN,GAAKL,GAAavO,EAAOiP,CAAS,EAAI,OAEtCK,GAAU,IAAKL,CAAS,EAExB7U,EAAG,iBAAkB,KAAK,KAAM,GAAOkV,EAAU,EAEjDd,GAAWxO,EAAOiP,CAAS,CAE5B,CAED,CAIA,SAASM,IAAanV,EAAIwU,EAAI,CAE7B,IAAM5O,EAAQ,KAAK,MAEdA,EAAO,CAAE,IAAM4O,IAEpBxU,EAAG,UAAW,KAAK,KAAMwU,CAAE,EAE3B5O,EAAO,CAAE,EAAI4O,EAEd,CAIA,SAASY,IAAapV,EAAIwU,EAAI,CAE7B,IAAM5O,EAAQ,KAAK,MAEnB,GAAK4O,EAAE,IAAM,QAEP5O,EAAO,CAAE,IAAM4O,EAAE,GAAK5O,EAAO,CAAE,IAAM4O,EAAE,KAE3CxU,EAAG,UAAW,KAAK,KAAMwU,EAAE,EAAGA,EAAE,CAAE,EAElC5O,EAAO,CAAE,EAAI4O,EAAE,EACf5O,EAAO,CAAE,EAAI4O,EAAE,OAIV,CAEN,GAAKL,GAAavO,EAAO4O,CAAE,EAAI,OAE/BxU,EAAG,WAAY,KAAK,KAAMwU,CAAE,EAE5BJ,GAAWxO,EAAO4O,CAAE,CAErB,CAED,CAEA,SAASa,IAAarV,EAAIwU,EAAI,CAE7B,IAAM5O,EAAQ,KAAK,MAEnB,GAAK4O,EAAE,IAAM,QAEP5O,EAAO,CAAE,IAAM4O,EAAE,GAAK5O,EAAO,CAAE,IAAM4O,EAAE,GAAK5O,EAAO,CAAE,IAAM4O,EAAE,KAEjExU,EAAG,UAAW,KAAK,KAAMwU,EAAE,EAAGA,EAAE,EAAGA,EAAE,CAAE,EAEvC5O,EAAO,CAAE,EAAI4O,EAAE,EACf5O,EAAO,CAAE,EAAI4O,EAAE,EACf5O,EAAO,CAAE,EAAI4O,EAAE,OAIV,CAEN,GAAKL,GAAavO,EAAO4O,CAAE,EAAI,OAE/BxU,EAAG,WAAY,KAAK,KAAMwU,CAAE,EAE5BJ,GAAWxO,EAAO4O,CAAE,CAErB,CAED,CAEA,SAASc,IAAatV,EAAIwU,EAAI,CAE7B,IAAM5O,EAAQ,KAAK,MAEnB,GAAK4O,EAAE,IAAM,QAEP5O,EAAO,CAAE,IAAM4O,EAAE,GAAK5O,EAAO,CAAE,IAAM4O,EAAE,GAAK5O,EAAO,CAAE,IAAM4O,EAAE,GAAK5O,EAAO,CAAE,IAAM4O,EAAE,KAEvFxU,EAAG,UAAW,KAAK,KAAMwU,EAAE,EAAGA,EAAE,EAAGA,EAAE,EAAGA,EAAE,CAAE,EAE5C5O,EAAO,CAAE,EAAI4O,EAAE,EACf5O,EAAO,CAAE,EAAI4O,EAAE,EACf5O,EAAO,CAAE,EAAI4O,EAAE,EACf5O,EAAO,CAAE,EAAI4O,EAAE,OAIV,CAEN,GAAKL,GAAavO,EAAO4O,CAAE,EAAI,OAE/BxU,EAAG,WAAY,KAAK,KAAMwU,CAAE,EAE5BJ,GAAWxO,EAAO4O,CAAE,CAErB,CAED,CAIA,SAASe,IAAcvV,EAAIwU,EAAI,CAE9B,IAAM5O,EAAQ,KAAK,MAEdA,EAAO,CAAE,IAAM4O,IAEpBxU,EAAG,WAAY,KAAK,KAAMwU,CAAE,EAE5B5O,EAAO,CAAE,EAAI4O,EAEd,CAIA,SAASgB,IAAcxV,EAAIwU,EAAI,CAE9B,IAAM5O,EAAQ,KAAK,MAEnB,GAAK4O,EAAE,IAAM,QAEP5O,EAAO,CAAE,IAAM4O,EAAE,GAAK5O,EAAO,CAAE,IAAM4O,EAAE,KAE3CxU,EAAG,WAAY,KAAK,KAAMwU,EAAE,EAAGA,EAAE,CAAE,EAEnC5O,EAAO,CAAE,EAAI4O,EAAE,EACf5O,EAAO,CAAE,EAAI4O,EAAE,OAIV,CAEN,GAAKL,GAAavO,EAAO4O,CAAE,EAAI,OAE/BxU,EAAG,YAAa,KAAK,KAAMwU,CAAE,EAE7BJ,GAAWxO,EAAO4O,CAAE,CAErB,CAED,CAEA,SAASiB,IAAczV,EAAIwU,EAAI,CAE9B,IAAM5O,EAAQ,KAAK,MAEnB,GAAK4O,EAAE,IAAM,QAEP5O,EAAO,CAAE,IAAM4O,EAAE,GAAK5O,EAAO,CAAE,IAAM4O,EAAE,GAAK5O,EAAO,CAAE,IAAM4O,EAAE,KAEjExU,EAAG,WAAY,KAAK,KAAMwU,EAAE,EAAGA,EAAE,EAAGA,EAAE,CAAE,EAExC5O,EAAO,CAAE,EAAI4O,EAAE,EACf5O,EAAO,CAAE,EAAI4O,EAAE,EACf5O,EAAO,CAAE,EAAI4O,EAAE,OAIV,CAEN,GAAKL,GAAavO,EAAO4O,CAAE,EAAI,OAE/BxU,EAAG,YAAa,KAAK,KAAMwU,CAAE,EAE7BJ,GAAWxO,EAAO4O,CAAE,CAErB,CAED,CAEA,SAASkB,IAAc1V,EAAIwU,EAAI,CAE9B,IAAM5O,EAAQ,KAAK,MAEnB,GAAK4O,EAAE,IAAM,QAEP5O,EAAO,CAAE,IAAM4O,EAAE,GAAK5O,EAAO,CAAE,IAAM4O,EAAE,GAAK5O,EAAO,CAAE,IAAM4O,EAAE,GAAK5O,EAAO,CAAE,IAAM4O,EAAE,KAEvFxU,EAAG,WAAY,KAAK,KAAMwU,EAAE,EAAGA,EAAE,EAAGA,EAAE,EAAGA,EAAE,CAAE,EAE7C5O,EAAO,CAAE,EAAI4O,EAAE,EACf5O,EAAO,CAAE,EAAI4O,EAAE,EACf5O,EAAO,CAAE,EAAI4O,EAAE,EACf5O,EAAO,CAAE,EAAI4O,EAAE,OAIV,CAEN,GAAKL,GAAavO,EAAO4O,CAAE,EAAI,OAE/BxU,EAAG,YAAa,KAAK,KAAMwU,CAAE,EAE7BJ,GAAWxO,EAAO4O,CAAE,CAErB,CAED,CAKA,SAASmB,IAAY3V,EAAIwU,EAAG7D,EAAW,CAEtC,IAAM/K,EAAQ,KAAK,MACbgQ,EAAOjF,EAAS,oBAAoB,EAErC/K,EAAO,CAAE,IAAMgQ,IAEnB5V,EAAG,UAAW,KAAK,KAAM4V,CAAK,EAC9BhQ,EAAO,CAAE,EAAIgQ,GAId,IAAIC,EAEC,KAAK,OAAS7V,EAAG,mBAErB8V,GAAmB,gBAAkBnF,EAAS,sBAAsB,EAAIvkB,GAAsBuC,GAC9FknB,EAAiBC,IAIjBD,EAAiBE,GAIlBpF,EAAS,aAAc6D,GAAKqB,EAAgBD,CAAK,CAElD,CAEA,SAASI,IAAchW,EAAIwU,EAAG7D,EAAW,CAExC,IAAM/K,EAAQ,KAAK,MACbgQ,EAAOjF,EAAS,oBAAoB,EAErC/K,EAAO,CAAE,IAAMgQ,IAEnB5V,EAAG,UAAW,KAAK,KAAM4V,CAAK,EAC9BhQ,EAAO,CAAE,EAAIgQ,GAIdjF,EAAS,aAAc6D,GAAKyB,GAAgBL,CAAK,CAElD,CAEA,SAASM,IAAYlW,EAAIwU,EAAG7D,EAAW,CAEtC,IAAM/K,EAAQ,KAAK,MACbgQ,EAAOjF,EAAS,oBAAoB,EAErC/K,EAAO,CAAE,IAAMgQ,IAEnB5V,EAAG,UAAW,KAAK,KAAM4V,CAAK,EAC9BhQ,EAAO,CAAE,EAAIgQ,GAIdjF,EAAS,eAAgB6D,GAAK2B,GAAkBP,CAAK,CAEtD,CAEA,SAASQ,IAAmBpW,EAAIwU,EAAG7D,EAAW,CAE7C,IAAM/K,EAAQ,KAAK,MACbgQ,EAAOjF,EAAS,oBAAoB,EAErC/K,EAAO,CAAE,IAAMgQ,IAEnB5V,EAAG,UAAW,KAAK,KAAM4V,CAAK,EAC9BhQ,EAAO,CAAE,EAAIgQ,GAIdjF,EAAS,kBAAmB6D,GAAK6B,GAAmBT,CAAK,CAE1D,CAIA,SAASU,IAAmB7V,EAAO,CAElC,OAASA,EAAO,CAEf,IAAK,MAAQ,OAAO8T,IACpB,IAAK,OAAQ,OAAOE,IACpB,IAAK,OAAQ,OAAOC,IACpB,IAAK,OAAQ,OAAOC,IAEpB,IAAK,OAAQ,OAAOC,IACpB,IAAK,OAAQ,OAAOG,IACpB,IAAK,OAAQ,OAAOE,IAEpB,IAAK,MAAQ,IAAK,OAAQ,OAAOE,IACjC,IAAK,OAAQ,IAAK,OAAQ,OAAOC,IACjC,IAAK,OAAQ,IAAK,OAAQ,OAAOC,IACjC,IAAK,OAAQ,IAAK,OAAQ,OAAOC,IAEjC,IAAK,MAAQ,OAAOC,IACpB,IAAK,OAAQ,OAAOC,IACpB,IAAK,OAAQ,OAAOC,IACpB,IAAK,OAAQ,OAAOC,IAEpB,IAAK,OACL,IAAK,OACL,IAAK,OACL,IAAK,OACL,IAAK,OACJ,OAAOC,IAER,IAAK,OACL,IAAK,OACL,IAAK,OACJ,OAAOK,IAER,IAAK,OACL,IAAK,OACL,IAAK,OACL,IAAK,OACJ,OAAOE,IAER,IAAK,OACL,IAAK,OACL,IAAK,OACL,IAAK,OACJ,OAAOE,GAET,CAED,CAKA,SAASG,IAAkBvW,EAAIwU,EAAI,CAElCxU,EAAG,WAAY,KAAK,KAAMwU,CAAE,CAE7B,CAIA,SAASgC,IAAkBxW,EAAIwU,EAAI,CAElC,IAAMnT,EAAOuS,GAASY,EAAG,KAAK,KAAM,CAAE,EAEtCxU,EAAG,WAAY,KAAK,KAAMqB,CAAK,CAEhC,CAEA,SAASoV,IAAkBzW,EAAIwU,EAAI,CAElC,IAAMnT,EAAOuS,GAASY,EAAG,KAAK,KAAM,CAAE,EAEtCxU,EAAG,WAAY,KAAK,KAAMqB,CAAK,CAEhC,CAEA,SAASqV,IAAkB1W,EAAIwU,EAAI,CAElC,IAAMnT,EAAOuS,GAASY,EAAG,KAAK,KAAM,CAAE,EAEtCxU,EAAG,WAAY,KAAK,KAAMqB,CAAK,CAEhC,CAIA,SAASsV,IAAiB3W,EAAIwU,EAAI,CAEjC,IAAMnT,EAAOuS,GAASY,EAAG,KAAK,KAAM,CAAE,EAEtCxU,EAAG,iBAAkB,KAAK,KAAM,GAAOqB,CAAK,CAE7C,CAEA,SAASuV,IAAiB5W,EAAIwU,EAAI,CAEjC,IAAMnT,EAAOuS,GAASY,EAAG,KAAK,KAAM,CAAE,EAEtCxU,EAAG,iBAAkB,KAAK,KAAM,GAAOqB,CAAK,CAE7C,CAEA,SAASwV,IAAiB7W,EAAIwU,EAAI,CAEjC,IAAMnT,EAAOuS,GAASY,EAAG,KAAK,KAAM,EAAG,EAEvCxU,EAAG,iBAAkB,KAAK,KAAM,GAAOqB,CAAK,CAE7C,CAIA,SAASyV,IAAkB9W,EAAIwU,EAAI,CAElCxU,EAAG,WAAY,KAAK,KAAMwU,CAAE,CAE7B,CAIA,SAASuC,IAAkB/W,EAAIwU,EAAI,CAElCxU,EAAG,WAAY,KAAK,KAAMwU,CAAE,CAE7B,CAEA,SAASwC,IAAkBhX,EAAIwU,EAAI,CAElCxU,EAAG,WAAY,KAAK,KAAMwU,CAAE,CAE7B,CAEA,SAASyC,IAAkBjX,EAAIwU,EAAI,CAElCxU,EAAG,WAAY,KAAK,KAAMwU,CAAE,CAE7B,CAIA,SAAS0C,IAAmBlX,EAAIwU,EAAI,CAEnCxU,EAAG,YAAa,KAAK,KAAMwU,CAAE,CAE9B,CAIA,SAAS2C,IAAmBnX,EAAIwU,EAAI,CAEnCxU,EAAG,YAAa,KAAK,KAAMwU,CAAE,CAE9B,CAEA,SAAS4C,IAAmBpX,EAAIwU,EAAI,CAEnCxU,EAAG,YAAa,KAAK,KAAMwU,CAAE,CAE9B,CAEA,SAAS6C,IAAmBrX,EAAIwU,EAAI,CAEnCxU,EAAG,YAAa,KAAK,KAAMwU,CAAE,CAE9B,CAKA,SAAS8C,IAAiBtX,EAAIwU,EAAG7D,EAAW,CAE3C,IAAM/K,EAAQ,KAAK,MAEboO,EAAIQ,EAAE,OAEN+C,EAAQlD,GAAe1D,EAAUqD,CAAE,EAElCG,GAAavO,EAAO2R,CAAM,IAEhCvX,EAAG,WAAY,KAAK,KAAMuX,CAAM,EAEhCnD,GAAWxO,EAAO2R,CAAM,GAIzB,IAAI1B,EAEC,KAAK,OAAS7V,EAAG,kBAErB6V,EAAiBC,GAIjBD,EAAiBE,GAIlB,QAAUhV,EAAI,EAAGA,IAAMiT,EAAG,EAAGjT,EAE5B4P,EAAS,aAAc6D,EAAGzT,CAAE,GAAK8U,EAAgB0B,EAAOxW,CAAE,CAAE,CAI9D,CAEA,SAASyW,IAAkBxX,EAAIwU,EAAG7D,EAAW,CAE5C,IAAM/K,EAAQ,KAAK,MAEboO,EAAIQ,EAAE,OAEN+C,EAAQlD,GAAe1D,EAAUqD,CAAE,EAElCG,GAAavO,EAAO2R,CAAM,IAEhCvX,EAAG,WAAY,KAAK,KAAMuX,CAAM,EAEhCnD,GAAWxO,EAAO2R,CAAM,GAIzB,QAAUxW,EAAI,EAAGA,IAAMiT,EAAG,EAAGjT,EAE5B4P,EAAS,aAAc6D,EAAGzT,CAAE,GAAKkV,GAAgBsB,EAAOxW,CAAE,CAAE,CAI9D,CAEA,SAAS0W,IAAiBzX,EAAIwU,EAAG7D,EAAW,CAE3C,IAAM/K,EAAQ,KAAK,MAEboO,EAAIQ,EAAE,OAEN+C,EAAQlD,GAAe1D,EAAUqD,CAAE,EAElCG,GAAavO,EAAO2R,CAAM,IAEhCvX,EAAG,WAAY,KAAK,KAAMuX,CAAM,EAEhCnD,GAAWxO,EAAO2R,CAAM,GAIzB,QAAUxW,EAAI,EAAGA,IAAMiT,EAAG,EAAGjT,EAE5B4P,EAAS,eAAgB6D,EAAGzT,CAAE,GAAKoV,GAAkBoB,EAAOxW,CAAE,CAAE,CAIlE,CAEA,SAAS2W,IAAuB1X,EAAIwU,EAAG7D,EAAW,CAEjD,IAAM/K,EAAQ,KAAK,MAEboO,EAAIQ,EAAE,OAEN+C,EAAQlD,GAAe1D,EAAUqD,CAAE,EAElCG,GAAavO,EAAO2R,CAAM,IAEhCvX,EAAG,WAAY,KAAK,KAAMuX,CAAM,EAEhCnD,GAAWxO,EAAO2R,CAAM,GAIzB,QAAUxW,EAAI,EAAGA,IAAMiT,EAAG,EAAGjT,EAE5B4P,EAAS,kBAAmB6D,EAAGzT,CAAE,GAAKsV,GAAmBkB,EAAOxW,CAAE,CAAE,CAItE,CAKA,SAAS4W,IAAoBlX,EAAO,CAEnC,OAASA,EAAO,CAEf,IAAK,MAAQ,OAAO8V,IACpB,IAAK,OAAQ,OAAOC,IACpB,IAAK,OAAQ,OAAOC,IACpB,IAAK,OAAQ,OAAOC,IAEpB,IAAK,OAAQ,OAAOC,IACpB,IAAK,OAAQ,OAAOC,IACpB,IAAK,OAAQ,OAAOC,IAEpB,IAAK,MAAQ,IAAK,OAAQ,OAAOC,IACjC,IAAK,OAAQ,IAAK,OAAQ,OAAOC,IACjC,IAAK,OAAQ,IAAK,OAAQ,OAAOC,IACjC,IAAK,OAAQ,IAAK,OAAQ,OAAOC,IAEjC,IAAK,MAAQ,OAAOC,IACpB,IAAK,OAAQ,OAAOC,IACpB,IAAK,OAAQ,OAAOC,IACpB,IAAK,OAAQ,OAAOC,IAEpB,IAAK,OACL,IAAK,OACL,IAAK,OACL,IAAK,OACL,IAAK,OACJ,OAAOC,IAER,IAAK,OACL,IAAK,OACL,IAAK,OACJ,OAAOE,IAER,IAAK,OACL,IAAK,OACL,IAAK,OACL,IAAK,OACJ,OAAOC,IAER,IAAK,OACL,IAAK,OACL,IAAK,OACL,IAAK,OACJ,OAAOC,GAET,CAED,CA8EA,SAASE,GAAYC,EAAWC,EAAgB,CAE/CD,EAAU,IAAI,KAAMC,CAAc,EAClCD,EAAU,IAAKC,EAAc,EAAG,EAAIA,CAErC,CAEA,SAASC,IAAcC,EAAYC,EAAMJ,EAAY,CAEpD,IAAMK,EAAOF,EAAW,KACvBG,EAAaD,EAAK,OAKnB,IAFAE,GAAW,UAAY,IAER,CAEd,IAAMC,EAAQD,GAAW,KAAMF,CAAK,EACnCI,EAAWF,GAAW,UAEnBG,EAAKF,EAAO,CAAE,EACZG,EAAYH,EAAO,CAAE,IAAM,IAChCI,EAAYJ,EAAO,CAAE,EAItB,GAFKG,IAAYD,EAAKA,EAAK,GAEtBE,IAAc,QAAaA,IAAc,KAAOH,EAAW,IAAMH,EAAa,CAIlFP,GAAYC,EAAWY,IAAc,OACpC,IAAIC,GAAeH,EAAIP,EAAYC,CAAK,EACxC,IAAIU,GAAkBJ,EAAIP,EAAYC,CAAK,CAAE,EAE9C,KAED,KAAO,CAKN,IAAIW,EADQf,EAAU,IACNU,CAAG,EAEdK,IAAS,SAEbA,EAAO,IAAIC,GAAmBN,CAAG,EACjCX,GAAYC,EAAWe,CAAK,GAI7Bf,EAAYe,CAEb,CAED,CAED,CAoGA,SAASE,GAAa9Y,EAAIS,EAAMsY,EAAS,CAExC,IAAMC,EAAShZ,EAAG,aAAcS,CAAK,EAErC,OAAAT,EAAG,aAAcgZ,EAAQD,CAAO,EAChC/Y,EAAG,cAAegZ,CAAO,EAElBA,CAER,CAOA,SAASC,IAAcF,EAAQG,EAAY,CAE1C,IAAMC,EAAQJ,EAAO,MAAO;AAAA,CAAK,EAC3BK,EAAS,CAAC,EAEVC,EAAO,KAAK,IAAKH,EAAY,EAAG,CAAE,EAClCI,EAAK,KAAK,IAAKJ,EAAY,EAAGC,EAAM,MAAO,EAEjD,QAAUpY,EAAIsY,EAAMtY,EAAIuY,EAAIvY,IAAO,CAElC,IAAMwY,EAAOxY,EAAI,EACjBqY,EAAO,KAAM,GAAGG,IAASL,EAAY,IAAM,GAAG,IAAIK,CAAI,KAAKJ,EAAOpY,CAAE,CAAC,EAAG,CAEzE,CAEA,OAAOqY,EAAO,KAAM;AAAA,CAAK,CAE1B,CAIA,SAASI,IAAuBC,EAAa,CAE5ClyB,GAAgB,WAAYmyB,GAAKnyB,GAAgB,kBAAmBkyB,CAAW,EAE/E,IAAME,EAAiB,SAAUD,GAAI,SAAS,IAAOlF,GAAOA,EAAE,QAAS,CAAE,CAAE,CAAE,KAE7E,OAASjtB,GAAgB,YAAakyB,CAAW,EAAI,CAEpD,KAAKxpB,GACJ,MAAO,CAAE0pB,EAAgB,oBAAqB,EAE/C,KAAKxgB,GACJ,MAAO,CAAEwgB,EAAgB,kBAAmB,EAE7C,QACC,OAAAxa,GAAM,0CAA2Csa,CAAW,EACrD,CAAEE,EAAgB,oBAAqB,CAEhD,CAED,CAEA,SAASC,GAAiB5Z,EAAIgZ,EAAQvY,EAAO,CAE5C,IAAMoZ,EAAS7Z,EAAG,mBAAoBgZ,EAAQhZ,EAAG,cAAe,EAG1D8Z,GADgB9Z,EAAG,iBAAkBgZ,CAAO,GAAK,IAC1B,KAAK,EAElC,GAAKa,GAAUC,IAAW,GAAK,MAAO,GAEtC,IAAMC,EAAe,iBAAiB,KAAMD,CAAO,EACnD,GAAKC,EAAe,CAKnB,IAAMb,EAAY,SAAUa,EAAc,CAAE,CAAE,EAC9C,OAAOtZ,EAAK,YAAY,EAAI;AAAA;AAAA,EAASqZ,EAAS;AAAA;AAAA,EAASb,IAAcjZ,EAAG,gBAAiBgZ,CAAO,EAAGE,CAAU,CAE9G,KAEC,QAAOY,CAIT,CAEA,SAASE,IAA0BC,EAAcR,EAAa,CAE7D,IAAMS,EAAaV,IAAuBC,CAAW,EAErD,MAAO,CAEN,QAAQQ,CAAY,mBAEpB,WAAWC,EAAY,CAAE,CAAC,uBAAuBA,EAAY,CAAE,CAAC,iBAEhE,GAED,EAAE,KAAM;AAAA,CAAK,CAEd,CAYA,SAASC,IAAwBF,EAAcvG,EAAc,CAE5D,IAAM0G,EAAkBC,IAAsB3G,CAAY,EAE1D,OAAK0G,IAAoB,QAExBjb,GAAM,yCAA0CuU,CAAY,EACrD,QAAUuG,EAAe,yDAI1B,QAAUA,EAAe,2BAA6BG,EAAkB,yBAEhF,CAIA,SAASE,KAAuB,CAE/B/yB,GAAgB,yBAA0BgzB,EAAI,EAE9C,IAAMtG,EAAIsG,GAAI,EAAE,QAAS,CAAE,EACrBC,EAAID,GAAI,EAAE,QAAS,CAAE,EACrB1Z,EAAI0Z,GAAI,EAAE,QAAS,CAAE,EAE3B,MAAO,CAEN,yCAEA,+BAAgCtG,CAAE,KAAMuG,CAAE,KAAM3Z,CAAE,MAElD,+BAEA,GAED,EAAE,KAAM;AAAA,CAAK,CAEd,CAEA,SAAS4Z,IAA0BvS,EAAa,CAO/C,MALe,CACdA,EAAW,0BAA4B,mDAAqD,GAC5FA,EAAW,mBAAqB,2CAA6C,EAC9E,EAEc,OAAQwS,EAAgB,EAAE,KAAM;AAAA,CAAK,CAEpD,CAEA,SAASC,IAAiBC,EAAU,CAEnC,IAAMC,EAAS,CAAC,EAEhB,QAAYpV,KAAQmV,EAAU,CAE7B,IAAM9a,EAAQ8a,EAASnV,CAAK,EAEvB3F,IAAU,IAEf+a,EAAO,KAAM,WAAapV,EAAO,IAAM3F,CAAM,CAE9C,CAEA,OAAO+a,EAAO,KAAM;AAAA,CAAK,CAE1B,CAEA,SAASC,IAAyB9a,EAAImE,EAAU,CAE/C,IAAMV,EAAa,CAAC,EAEd,EAAIzD,EAAG,oBAAqBmE,EAASnE,EAAG,iBAAkB,EAEhE,QAAUe,EAAI,EAAGA,EAAI,EAAGA,IAAO,CAE9B,IAAMoG,EAAOnH,EAAG,gBAAiBmE,EAASpD,CAAE,EACtC0E,EAAO0B,EAAK,KAEd4T,EAAe,EACd5T,EAAK,OAASnH,EAAG,aAAa+a,EAAe,GAC7C5T,EAAK,OAASnH,EAAG,aAAa+a,EAAe,GAC7C5T,EAAK,OAASnH,EAAG,aAAa+a,EAAe,GAIlDtX,EAAYgC,CAAK,EAAI,CACpB,KAAM0B,EAAK,KACX,SAAUnH,EAAG,kBAAmBmE,EAASsB,CAAK,EAC9C,aAAcsV,CACf,CAED,CAEA,OAAOtX,CAER,CAEA,SAASiX,GAAiB3B,EAAS,CAElC,OAAOA,IAAW,EAEnB,CAEA,SAASiC,GAAkBjC,EAAQ7Q,EAAa,CAE/C,IAAM+S,EAAqB/S,EAAW,oBAAsBA,EAAW,iBAAmBA,EAAW,4BAErG,OAAO6Q,EACL,QAAS,kBAAmB7Q,EAAW,YAAa,EACpD,QAAS,mBAAoBA,EAAW,aAAc,EACtD,QAAS,uBAAwBA,EAAW,gBAAiB,EAC7D,QAAS,yBAA0B+S,CAAmB,EACtD,QAAS,wBAAyB/S,EAAW,iBAAkB,EAC/D,QAAS,oBAAqBA,EAAW,cAAe,EACxD,QAAS,mBAAoBA,EAAW,aAAc,EACtD,QAAS,yBAA0BA,EAAW,kBAAmB,EACjE,QAAS,oCAAqCA,EAAW,2BAA4B,EACrF,QAAS,0BAA2BA,EAAW,mBAAoB,EACnE,QAAS,2BAA4BA,EAAW,oBAAqB,CAExE,CAEA,SAASgT,GAA0BnC,EAAQ7Q,EAAa,CAEvD,OAAO6Q,EACL,QAAS,uBAAwB7Q,EAAW,iBAAkB,EAC9D,QAAS,yBAA4BA,EAAW,kBAAoBA,EAAW,mBAAsB,CAExG,CAMA,SAASiT,GAAiBpC,EAAS,CAElC,OAAOA,EAAO,QAASqC,IAAgBC,GAAgB,CAExD,CAIA,SAASA,IAAiBhD,EAAOiD,EAAU,CAE1C,IAAIvC,EAAS1f,GAAaiiB,CAAQ,EAElC,GAAKvC,IAAW,OAAY,CAE3B,IAAMwC,EAAaC,IAAe,IAAKF,CAAQ,EAE/C,GAAKC,IAAe,OAEnBxC,EAAS1f,GAAakiB,CAAW,EACjCpc,GAAM,0EAA2Emc,EAASC,CAAW,MAIrG,OAAM,IAAI,MAAO,6BAA+BD,EAAU,GAAI,CAIhE,CAEA,OAAOH,GAAiBpC,CAAO,CAEhC,CAMA,SAAS0C,GAAa1C,EAAS,CAE9B,OAAOA,EAAO,QAAS2C,IAAmBC,GAAa,CAExD,CAEA,SAASA,IAActD,EAAO/Q,EAAOsU,EAAKC,EAAU,CAEnD,IAAI9C,EAAS,GAEb,QAAUhY,EAAI,SAAUuG,CAAM,EAAGvG,EAAI,SAAU6a,CAAI,EAAG7a,IAErDgY,GAAU8C,EACR,QAAS,eAAgB,KAAO9a,EAAI,IAAK,EACzC,QAAS,uBAAwBA,CAAE,EAItC,OAAOgY,CAER,CAIA,SAAS+C,GAAmB5T,EAAa,CAExC,IAAI6T,EAAkB,aAAa7T,EAAW,SAAS;AAAA,aAC3CA,EAAW,SAAS;AAAA,aACpBA,EAAW,SAAS;AAAA,aACpBA,EAAW,SAAS;AAAA,aACpBA,EAAW,SAAS;AAAA,aACpBA,EAAW,SAAS;AAAA,aACpBA,EAAW,SAAS;AAAA,aACpBA,EAAW,SAAS;AAAA,aACpBA,EAAW,SAAS;AAAA,aACpBA,EAAW,SAAS;AAAA,aACpBA,EAAW,SAAS;AAAA,aACpBA,EAAW,SAAS;AAAA,aACpBA,EAAW,SAAS;AAAA,aACpBA,EAAW,SAAS;AAAA,aACpBA,EAAW,SAAS;AAAA,aACpBA,EAAW,SAAS;AAAA,aACpBA,EAAW,SAAS;AAAA,GAGhC,OAAKA,EAAW,YAAc,QAE7B6T,GAAmB;AAAA,wBAER7T,EAAW,YAAc,UAEpC6T,GAAmB;AAAA,0BAER7T,EAAW,YAAc,SAEpC6T,GAAmB;AAAA,wBAIbA,CAER,CAOA,SAASC,IAA6B9T,EAAa,CAElD,OAAO+T,IAAsB/T,EAAW,aAAc,GAAK,sBAE5D,CAQA,SAASgU,IAA0BhU,EAAa,CAE/C,OAAKA,EAAW,SAAW,GAAe,mBAEnCiU,IAAmBjU,EAAW,UAAW,GAAK,kBAEtD,CAMA,SAASkU,IAA0BlU,EAAa,CAE/C,OAAKA,EAAW,SAAW,GAAe,yBAEnCmU,IAAmBnU,EAAW,UAAW,GAAK,wBAEtD,CAQA,SAASoU,IAA8BpU,EAAa,CAEnD,OAAKA,EAAW,SAAW,GAAe,uBAEnCqU,IAAuBrU,EAAW,OAAQ,GAAK,sBAEvD,CAEA,SAASsU,IAAoBtU,EAAa,CAEzC,IAAMuU,EAAcvU,EAAW,mBAE/B,GAAKuU,IAAgB,KAAO,OAAO,KAEnC,IAAMC,EAAS,KAAK,KAAMD,CAAY,EAAI,EAEpCE,EAAc,EAAMF,EAI1B,MAAO,CAAE,WAFU,GAAQ,EAAI,KAAK,IAAK,KAAK,IAAK,EAAGC,CAAO,EAAG,GAAO,GAElD,YAAAC,EAAa,OAAAD,CAAO,CAE1C,CAEA,SAASE,IAAcnb,EAAUob,EAAU3U,EAAYvE,EAAgB,CAKtE,IAAM3D,EAAKyB,EAAS,WAAW,EAEzBmZ,EAAU1S,EAAW,QAEvB4U,EAAe5U,EAAW,aAC1B6U,EAAiB7U,EAAW,eAE1B8U,EAAsBhB,IAA6B9T,CAAW,EAC9D+U,EAAmBf,IAA0BhU,CAAW,EACxDgV,EAAmBd,IAA0BlU,CAAW,EACxDiV,EAAuBb,IAA8BpU,CAAW,EAChEkV,EAAmBZ,IAAoBtU,CAAW,EAElDmV,EAAyB5C,IAA0BvS,CAAW,EAE9DoV,EAAgB3C,IAAiBC,CAAQ,EAEzCzW,EAAUnE,EAAG,cAAc,EAE7Bud,EAAcC,EACdC,EAAgBvV,EAAW,YAAc,YAAcA,EAAW,YAAc;AAAA,EAAO,GAEtFA,EAAW,qBAEfqV,EAAe,CAEd,uBAAyBrV,EAAW,WACpC,uBAAyBA,EAAW,WAEpCoV,CAED,EAAE,OAAQ5C,EAAgB,EAAE,KAAM;AAAA,CAAK,EAElC6C,EAAa,OAAS,IAE1BA,GAAgB;AAAA,GAIjBC,EAAiB,CAEhB,uBAAyBtV,EAAW,WACpC,uBAAyBA,EAAW,WAEpCoV,CAED,EAAE,OAAQ5C,EAAgB,EAAE,KAAM;AAAA,CAAK,EAElC8C,EAAe,OAAS,IAE5BA,GAAkB;AAAA,KAMnBD,EAAe,CAEdzB,GAAmB5T,CAAW,EAE9B,uBAAyBA,EAAW,WACpC,uBAAyBA,EAAW,WAEpCoV,EAEApV,EAAW,0BAA4B,4BAA8B,GACrEA,EAAW,SAAW,uBAAyB,GAC/CA,EAAW,cAAgB,6BAA+B,GAC1DA,EAAW,WAAa,yBAA2B,GACnDA,EAAW,gBAAkB,+BAAiC,GAC9DA,EAAW,gBAAkB,+BAAiC,GAE9DA,EAAW,QAAUA,EAAW,IAAM,kBAAoB,GAC1DA,EAAW,QAAUA,EAAW,QAAU,mBAAqB,GAE/DA,EAAW,IAAM,kBAAoB,GACrCA,EAAW,OAAS,qBAAuB,GAC3CA,EAAW,OAAS,WAAagV,EAAmB,GACpDhV,EAAW,SAAW,uBAAyB,GAC/CA,EAAW,MAAQ,oBAAsB,GACzCA,EAAW,QAAU,sBAAwB,GAC7CA,EAAW,UAAY,wBAA0B,GACjDA,EAAW,qBAAuB,oCAAsC,GACxEA,EAAW,sBAAwB,qCAAuC,GAC1EA,EAAW,gBAAkB,8BAAgC,GAC7DA,EAAW,YAAc,0BAA4B,GAErDA,EAAW,WAAa,yBAA2B,GACnDA,EAAW,cAAgB,4BAA8B,GAEzDA,EAAW,aAAe,2BAA6B,GACvDA,EAAW,sBAAwB,qCAAuC,GAC1EA,EAAW,mBAAqB,kCAAoC,GAEpEA,EAAW,eAAiB,6BAA+B,GAC3DA,EAAW,wBAA0B,uCAAyC,GAE9EA,EAAW,YAAc,0BAA4B,GACrDA,EAAW,iBAAmB,gCAAkC,GAChEA,EAAW,qBAAuB,oCAAsC,GAExEA,EAAW,aAAe,2BAA6B,GACvDA,EAAW,aAAe,2BAA6B,GACvDA,EAAW,SAAW,uBAAyB,GAC/CA,EAAW,UAAY,wBAA0B,GAEjDA,EAAW,aAAe,2BAA6B,GACvDA,EAAW,gBAAkB,8BAAgC,GAC7DA,EAAW,aAAe,2BAA6B,GAEvDA,EAAW,cAAgB,6BAA+B,GAC1DA,EAAW,kBAAoB,iCAAmC,GAIlEA,EAAW,MAAQ,kBAAoBA,EAAW,MAAQ,GAC1DA,EAAW,WAAa,uBAAyBA,EAAW,WAAa,GACzEA,EAAW,WAAa,uBAAyBA,EAAW,WAAa,GACzEA,EAAW,QAAU,oBAAsBA,EAAW,QAAU,GAChEA,EAAW,cAAgB,0BAA4BA,EAAW,cAAgB,GAClFA,EAAW,UAAY,sBAAwBA,EAAW,UAAY,GACtEA,EAAW,YAAc,wBAA0BA,EAAW,YAAc,GAC5EA,EAAW,kBAAoB,8BAAgCA,EAAW,kBAAoB,GAE9FA,EAAW,eAAiB,2BAA6BA,EAAW,eAAiB,GACrFA,EAAW,eAAiB,2BAA6BA,EAAW,eAAiB,GAErFA,EAAW,gBAAkB,4BAA8BA,EAAW,gBAAkB,GAExFA,EAAW,eAAiB,2BAA6BA,EAAW,eAAiB,GACrFA,EAAW,qBAAuB,kCAAoCA,EAAW,qBAAuB,GACxGA,EAAW,wBAA0B,qCAAuCA,EAAW,wBAA0B,GAEjHA,EAAW,iBAAmB,6BAA+BA,EAAW,iBAAmB,GAC3FA,EAAW,0BAA4B,uCAAyCA,EAAW,0BAA4B,GAEvHA,EAAW,gBAAkB,6BAA+BA,EAAW,gBAAkB,GACzFA,EAAW,oBAAsB,iCAAmCA,EAAW,oBAAsB,GAErGA,EAAW,cAAgB,0BAA4BA,EAAW,cAAgB,GAClFA,EAAW,mBAAqB,gCAAkCA,EAAW,mBAAqB,GAClGA,EAAW,uBAAyB,oCAAsCA,EAAW,uBAAyB,GAE9GA,EAAW,kBAAoB,8BAAgCA,EAAW,kBAAoB,GAC9FA,EAAW,eAAiB,2BAA6BA,EAAW,eAAiB,GAIrFA,EAAW,gBAAkBA,EAAW,cAAgB,GAAQ,sBAAwB,GACxFA,EAAW,aAAe,oBAAsB,GAChDA,EAAW,aAAe,0BAA4B,GACtDA,EAAW,WAAa,kBAAoB,GAC5CA,EAAW,WAAa,kBAAoB,GAC5CA,EAAW,WAAa,kBAAoB,GAE5CA,EAAW,UAAY,wBAA0B,GAEjDA,EAAW,YAAc,sBAAwB,GAEjDA,EAAW,SAAW,uBAAyB,GAE/CA,EAAW,aAAe,2BAA6B,GACvDA,EAAW,cAAgBA,EAAW,cAAgB,GAAQ,2BAA6B,GACzFA,EAAW,YAAgB,0BAA4B,GACvDA,EAAW,kBAAoB,EAAM,uCAAyCA,EAAW,mBAAqB,GAC9GA,EAAW,kBAAoB,EAAM,8BAAgCA,EAAW,kBAAoB,GACtGA,EAAW,YAAc,uBAAyB,GAClDA,EAAW,UAAY,qBAAuB,GAE9CA,EAAW,iBAAmB,wBAA0B,GACxDA,EAAW,iBAAmB,WAAa8U,EAAsB,GAEjE9U,EAAW,gBAAkB,8BAAgC,GAE7DA,EAAW,eAAiB,EAAI,2BAA6B,GAE7DA,EAAW,uBAAyB,uCAAyC,GAC7EA,EAAW,oBAAsB,oCAAsC,GAEvE,4BACA,gCACA,iCACA,2BACA,6BACA,+BACA,+BAEA,wBAEA,kCAEA,SAEA,8BAEA,iCAEA,SAEA,8BAEA,mCAEA,SAEA,2BACA,yBACA,qBAEA,iBAEA,uBAEA,SAEA,iBAEA,uBAEA,SAEA,iBAEA,uBAEA,SAEA,qBAEA,2BAEA,SAEA,iCAEA,yBAEA,6BAEA,yBAEA,SAEA,sBAEA,6BACA,8BAEA,SAEA;AAAA,CAED,EAAE,OAAQwS,EAAgB,EAAE,KAAM;AAAA,CAAK,EAEvC8C,EAAiB,CAEhB1B,GAAmB5T,CAAW,EAE9B,uBAAyBA,EAAW,WACpC,uBAAyBA,EAAW,WAEpCoV,EAEApV,EAAW,QAAUA,EAAW,IAAM,kBAAoB,GAC1DA,EAAW,QAAUA,EAAW,QAAU,mBAAqB,GAE/DA,EAAW,gBAAkB,4BAA8B,GAC3DA,EAAW,IAAM,kBAAoB,GACrCA,EAAW,OAAS,qBAAuB,GAC3CA,EAAW,OAAS,qBAAuB,GAC3CA,EAAW,OAAS,WAAa+U,EAAmB,GACpD/U,EAAW,OAAS,WAAagV,EAAmB,GACpDhV,EAAW,OAAS,WAAaiV,EAAuB,GACxDC,EAAmB,8BAAgCA,EAAiB,WAAa,GACjFA,EAAmB,+BAAiCA,EAAiB,YAAc,GACnFA,EAAmB,0BAA4BA,EAAiB,OAAS,KAAO,GAChFlV,EAAW,SAAW,uBAAyB,GAC/CA,EAAW,MAAQ,oBAAsB,GACzCA,EAAW,QAAU,sBAAwB,GAC7CA,EAAW,UAAY,wBAA0B,GACjDA,EAAW,qBAAuB,oCAAsC,GACxEA,EAAW,sBAAwB,qCAAuC,GAC1EA,EAAW,YAAc,0BAA4B,GAErDA,EAAW,WAAa,yBAA2B,GACnDA,EAAW,cAAgB,4BAA8B,GAEzDA,EAAW,UAAY,wBAA0B,GACjDA,EAAW,aAAe,2BAA6B,GACvDA,EAAW,sBAAwB,qCAAuC,GAC1EA,EAAW,mBAAqB,kCAAoC,GAEpEA,EAAW,WAAa,yBAA2B,GAEnDA,EAAW,YAAc,0BAA4B,GACrDA,EAAW,eAAiB,6BAA+B,GAC3DA,EAAW,wBAA0B,uCAAyC,GAE9EA,EAAW,YAAc,0BAA4B,GACrDA,EAAW,iBAAmB,gCAAkC,GAChEA,EAAW,qBAAuB,oCAAsC,GAExEA,EAAW,aAAe,2BAA6B,GACvDA,EAAW,aAAe,2BAA6B,GAEvDA,EAAW,SAAW,uBAAyB,GAC/CA,EAAW,UAAY,wBAA0B,GACjDA,EAAW,UAAY,wBAA0B,GAEjDA,EAAW,MAAQ,oBAAsB,GACzCA,EAAW,cAAgB,6BAA+B,GAC1DA,EAAW,kBAAoB,iCAAmC,GAElEA,EAAW,aAAe,2BAA6B,GACvDA,EAAW,gBAAkB,8BAAgC,GAC7DA,EAAW,aAAe,2BAA6B,GAEvDA,EAAW,gBAAkBA,EAAW,cAAgB,GAAQ,sBAAwB,GACxFA,EAAW,cAAgBA,EAAW,iBAAmBA,EAAW,cAAgB,oBAAsB,GAC1GA,EAAW,aAAe,0BAA4B,GACtDA,EAAW,WAAa,kBAAoB,GAC5CA,EAAW,WAAa,kBAAoB,GAC5CA,EAAW,WAAa,kBAAoB,GAE5CA,EAAW,UAAY,wBAA0B,GAEjDA,EAAW,YAAc,0BAA4B,GAErDA,EAAW,YAAc,sBAAwB,GAEjDA,EAAW,YAAc,uBAAyB,GAClDA,EAAW,UAAY,qBAAuB,GAE9CA,EAAW,iBAAmB,wBAA0B,GACxDA,EAAW,iBAAmB,WAAa8U,EAAsB,GAEjE9U,EAAW,mBAAqB,8BAAgC,GAEhEA,EAAW,eAAiB,EAAI,2BAA6B,GAE7DA,EAAW,mBAAqB,+BAAiC,GACjEA,EAAW,2BAA6B,wCAA0C,GAElFA,EAAW,uBAAyB,uCAAyC,GAC7EA,EAAW,oBAAsB,oCAAsC,GAEvE,2BACA,+BACA,+BAEEA,EAAW,cAAgBtV,GAAkB,uBAAyB,GACtEsV,EAAW,cAAgBtV,GAAkByG,GAAa,0BAAgC,GAC1F6O,EAAW,cAAgBtV,GAAkBunB,IAAwB,cAAejS,EAAW,WAAY,EAAI,GAEjHA,EAAW,UAAY,oBAAsB,GAC7CA,EAAW,OAAS,iBAAmB,GAEvC7O,GAAa,yBACb2gB,IAA0B,sBAAuB9R,EAAW,gBAAiB,EAC7EoS,IAAqB,EAErBpS,EAAW,gBAAkB,yBAA2BA,EAAW,aAAe,GAElF;AAAA,CAED,EAAE,OAAQwS,EAAgB,EAAE,KAAM;AAAA,CAAK,GAIxCoC,EAAe3B,GAAiB2B,CAAa,EAC7CA,EAAe9B,GAAkB8B,EAAc5U,CAAW,EAC1D4U,EAAe5B,GAA0B4B,EAAc5U,CAAW,EAElE6U,EAAiB5B,GAAiB4B,CAAe,EACjDA,EAAiB/B,GAAkB+B,EAAgB7U,CAAW,EAC9D6U,EAAiB7B,GAA0B6B,EAAgB7U,CAAW,EAEtE4U,EAAerB,GAAaqB,CAAa,EACzCC,EAAiBtB,GAAasB,CAAe,EAExC7U,EAAW,sBAAwB,KAIvCuV,EAAgB;AAAA,EAEhBF,EAAe,CACdF,EACA,uBACA,sBACA,2BACD,EAAE,KAAM;AAAA,CAAK,EAAI;AAAA,EAAOE,EAExBC,EAAiB,CAChB,qBACEtV,EAAW,cAAgBjc,GAAU,GAAK,oDAC1Cic,EAAW,cAAgBjc,GAAU,GAAK,oCAC5C,uCACA,4BACA,8BACA,oCACA,qCACA,6CACA,uCACA,uCACA,+CACA,wCACD,EAAE,KAAM;AAAA,CAAK,EAAI;AAAA,EAAOuxB,GAIzB,IAAME,EAAaD,EAAgBF,EAAeT,EAC5Ca,EAAeF,EAAgBD,EAAiBT,EAKhDa,EAAiB9E,GAAa9Y,EAAIA,EAAG,cAAe0d,CAAW,EAC/DG,EAAmB/E,GAAa9Y,EAAIA,EAAG,gBAAiB2d,CAAa,EAE3E3d,EAAG,aAAcmE,EAASyZ,CAAe,EACzC5d,EAAG,aAAcmE,EAAS0Z,CAAiB,EAItC3V,EAAW,sBAAwB,OAEvClI,EAAG,mBAAoBmE,EAAS,EAAG+D,EAAW,mBAAoB,EAEvDA,EAAW,eAAiB,IAGvClI,EAAG,mBAAoBmE,EAAS,EAAG,UAAW,EAI/CnE,EAAG,YAAamE,CAAQ,EAExB,SAAS2Z,EAAYC,EAAO,CAG3B,GAAKtc,EAAS,MAAM,kBAAoB,CAEvC,IAAMuc,EAAiBhe,EAAG,kBAAmBmE,CAAQ,GAAK,GACpD8Z,EAAsBje,EAAG,iBAAkB4d,CAAe,GAAK,GAC/DM,EAAwBle,EAAG,iBAAkB6d,CAAiB,GAAK,GAEnEM,EAAaH,EAAe,KAAK,EACjCI,EAAYH,EAAoB,KAAK,EACrCI,EAAcH,EAAsB,KAAK,EAE3CI,EAAW,GACXC,EAAkB,GAEtB,GAAKve,EAAG,oBAAqBmE,EAASnE,EAAG,WAAY,IAAM,GAI1D,GAFAse,EAAW,GAEN,OAAO7c,EAAS,MAAM,eAAkB,WAE5CA,EAAS,MAAM,cAAezB,EAAImE,EAASyZ,EAAgBC,CAAiB,MAEtE,CAIN,IAAMW,EAAe5E,GAAiB5Z,EAAI4d,EAAgB,QAAS,EAC7Da,EAAiB7E,GAAiB5Z,EAAI6d,EAAkB,UAAW,EAEzE9e,GACC,oCAAsCiB,EAAG,SAAS,EAAI,sBACjCA,EAAG,oBAAqBmE,EAASnE,EAAG,eAAgB,EAAI;AAAA;AAAA,iBACzD+d,EAAK,KAAO;AAAA,iBACZA,EAAK,KAAO;AAAA;AAAA,oBACTI,EAAa;AAAA,EACpCK,EAAe;AAAA,EACfC,CACD,CAED,MAEWN,IAAe,GAE1Bhf,GAAM,kCAAmCgf,CAAW,GAEzCC,IAAc,IAAMC,IAAgB,MAE/CE,EAAkB,IAIdA,IAEJR,EAAK,YAAc,CAElB,SAAUO,EAEV,WAAYH,EAEZ,aAAc,CAEb,IAAKC,EACL,OAAQb,CAET,EAEA,eAAgB,CAEf,IAAKc,EACL,OAAQb,CAET,CAED,EAIF,CAQAxd,EAAG,aAAc4d,CAAe,EAChC5d,EAAG,aAAc6d,CAAiB,EAElCa,EAAiB,IAAIC,GAAe3e,EAAImE,CAAQ,EAChDkB,EAAmByV,IAAyB9a,EAAImE,CAAQ,CAEzD,CAIA,IAAIua,EAEJ,KAAK,YAAc,UAAY,CAE9B,OAAKA,IAAmB,QAGvBZ,EAAY,IAAK,EAIXY,CAER,EAIA,IAAIrZ,EAEJ,KAAK,cAAgB,UAAY,CAEhC,OAAKA,IAAqB,QAGzByY,EAAY,IAAK,EAIXzY,CAER,EAKA,IAAIuZ,EAAiB1W,EAAW,yCAA2C,GAE3E,YAAK,QAAU,UAAY,CAE1B,OAAK0W,IAAiB,KAErBA,EAAe5e,EAAG,oBAAqBmE,EAAS0a,GAAsB,GAIhED,CAER,EAIA,KAAK,QAAU,UAAY,CAE1Bjb,EAAc,uBAAwB,IAAK,EAE3C3D,EAAG,cAAemE,CAAQ,EAC1B,KAAK,QAAU,MAEhB,EAIA,KAAK,KAAO+D,EAAW,WACvB,KAAK,KAAOA,EAAW,WACvB,KAAK,GAAK4W,MACV,KAAK,SAAWjC,EAChB,KAAK,UAAY,EACjB,KAAK,QAAU1Y,EACf,KAAK,aAAeyZ,EACpB,KAAK,eAAiBC,EAEf,IAER,CA6HA,SAASkB,IAAetd,EAAUC,EAAUC,EAAYuF,EAAYwJ,EAAc/M,EAAeqb,EAAW,CAE3G,IAAMC,EAAiB,IAAIzwB,GACrB0wB,EAAiB,IAAIC,GACrBC,EAAkB,IAAI,IACtBC,EAAW,CAAC,EACZC,EAAc,IAAI,IAElBxW,EAAyB4H,EAAa,uBAExC9H,EAAY8H,EAAa,UAEvB6O,EAAY,CACjB,kBAAmB,QACnB,qBAAsB,WACtB,mBAAoB,SACpB,kBAAmB,QACnB,oBAAqB,UACrB,kBAAmB,QACnB,iBAAkB,OAClB,qBAAsB,WACtB,qBAAsB,WACtB,mBAAoB,SACpB,kBAAmB,QACnB,mBAAoB,SACpB,eAAgB,SAChB,eAAgB,SAChB,eAAgB,QACjB,EAEA,SAASC,EAAY1f,EAAQ,CAI5B,OAFAsf,EAAgB,IAAKtf,CAAM,EAEtBA,IAAU,EAAW,KAEnB,KAAMA,CAAM,EAEpB,CAEA,SAAS2f,EAAevb,EAAUwb,EAAQC,EAASnd,EAAOyB,EAAS,CAElE,IAAM2b,EAAMpd,EAAM,IACZ4B,EAAWH,EAAO,SAClB4b,EAAc3b,EAAS,uBAAyB1B,EAAM,YAAc,KAEpEsd,GAAW5b,EAAS,uBAAyBvC,EAAaD,GAAW,IAAKwC,EAAS,QAAU2b,CAAY,EACzGE,EAA0BD,GAAcA,EAAO,UAAYx3B,GAA4Bw3B,EAAO,MAAM,OAAS,KAE7GE,EAAWT,EAAWrb,EAAS,IAAK,EAKrCA,EAAS,YAAc,OAE3B0E,EAAY8H,EAAa,gBAAiBxM,EAAS,SAAU,EAExD0E,IAAc1E,EAAS,WAE3B/E,GAAM,8BAA+B+E,EAAS,UAAW,uBAAwB0E,EAAW,UAAW,GAQzG,IAAMmI,EAAiB3M,EAAS,gBAAgB,UAAYA,EAAS,gBAAgB,QAAUA,EAAS,gBAAgB,MAClH4M,EAAsBD,IAAmB,OAAcA,EAAe,OAAS,EAEjFkP,GAAqB,EAEpB7b,EAAS,gBAAgB,WAAa,SAAY6b,GAAqB,GACvE7b,EAAS,gBAAgB,SAAW,SAAY6b,GAAqB,GACrE7b,EAAS,gBAAgB,QAAU,SAAY6b,GAAqB,GAIzE,IAAInD,GAAcC,GACdmD,GAAsBC,EAE1B,GAAKH,EAAW,CAEf,IAAMhH,GAAS1f,GAAW0mB,CAAS,EAEnClD,GAAe9D,GAAO,aACtB+D,GAAiB/D,GAAO,cAEzB,MAEC8D,GAAe5Y,EAAS,aACxB6Y,GAAiB7Y,EAAS,eAE1Bgb,EAAe,OAAQhb,CAAS,EAEhCgc,GAAuBhB,EAAe,kBAAmBhb,CAAS,EAClEic,EAAyBjB,EAAe,oBAAqBhb,CAAS,EAIvE,IAAMkc,GAAsB3e,EAAS,gBAAgB,EAC/CsH,GAAsBtH,EAAS,MAAM,QAAQ,MAAM,YAAY,EAE/D4e,GAAmBpc,EAAO,kBAAoB,GAC9Cqc,GAAiBrc,EAAO,gBAAkB,GAE1Csc,GAAU,CAAC,CAAErc,EAAS,IACtBsc,GAAa,CAAC,CAAEtc,EAAS,OACzBuc,GAAa,CAAC,CAAEX,EAChBY,GAAY,CAAC,CAAExc,EAAS,MACxByc,GAAe,CAAC,CAAEzc,EAAS,SAC3B0c,GAAc,CAAC,CAAE1c,EAAS,QAC1B2c,GAAgB,CAAC,CAAE3c,EAAS,UAC5B4c,GAAsB,CAAC,CAAE5c,EAAS,gBAClC6c,GAAkB,CAAC,CAAE7c,EAAS,YAE9B8c,GAAmB,CAAC,CAAE9c,EAAS,aAC/B+c,GAAmB,CAAC,CAAE/c,EAAS,aAE/Bgd,GAAiBhd,EAAS,WAAa,EACvCid,EAAgBjd,EAAS,UAAY,EACrCkd,EAAiBld,EAAS,WAAa,EACvCmd,GAAkBnd,EAAS,YAAc,EACzCod,GAAYpd,EAAS,MAAQ,EAC7Bqd,GAAmBrd,EAAS,aAAe,EAE3Csd,GAAoBN,IAAkB,CAAC,CAAEhd,EAAS,cAElDud,GAAmBN,GAAiB,CAAC,CAAEjd,EAAS,aAChDwd,GAA0BP,GAAiB,CAAC,CAAEjd,EAAS,mBACvDyd,GAA6BR,GAAiB,CAAC,CAAEjd,EAAS,sBAE1D0d,GAAqBP,IAAmB,CAAC,CAAEnd,EAAS,eACpD2d,GAA+BR,IAAmB,CAAC,CAAEnd,EAAS,wBAE9D4d,GAAqBR,IAAa,CAAC,CAAEpd,EAAS,cAC9C6d,EAAyBT,IAAa,CAAC,CAAEpd,EAAS,kBAElD8d,EAAkB,CAAC,CAAE9d,EAAS,YAC9B+d,EAAwB,CAAC,CAAE/d,EAAS,iBACpCge,GAA4B,CAAC,CAAEhe,EAAS,qBAExCie,EAAsBZ,IAAoB,CAAC,CAAErd,EAAS,gBACtDke,EAAmBb,IAAoB,CAAC,CAAErd,EAAS,aAEnDme,EAAkB,CAAC,CAAEne,EAAS,YAE9Boe,GAAe,CAAC,CAAEpe,EAAS,SAE3Bqe,GAAgBre,EAAS,UAAY,EAErCse,GAAgB,CAAC,CAAEte,EAAS,UAE5Bue,GAAiB,CAAC,CAAEve,EAAS,WAE/BwP,GAAc9gB,GAEbsR,EAAS,aAERkc,KAAwB,MAAQA,GAAoB,mBAAqB,MAE7E1M,GAAcjS,EAAS,aAMzB,IAAMyG,GAAa,CAElB,SAAU8X,EACV,WAAY9b,EAAS,KACrB,WAAYA,EAAS,KAErB,aAAc4Y,GACd,eAAgBC,GAChB,QAAS7Y,EAAS,QAElB,qBAAsBgc,GACtB,uBAAwBC,EAExB,oBAAqBjc,EAAS,sBAAwB,GACtD,YAAaA,EAAS,YAEtB,UAAW0E,EAEX,SAAU0X,GACV,cAAeA,IAAkBrc,EAAO,iBAAmB,KAC3D,WAAYoc,GACZ,gBAAiBA,IAAoBpc,EAAO,gBAAkB,KAC9D,gBAAiBoc,IAAoBpc,EAAO,eAAiB,KAE7D,iBAAoBmc,KAAwB,KAAS3e,EAAS,iBAAqB2e,GAAoB,mBAAqB,GAAOA,GAAoB,QAAQ,WAAarwB,GAC5K,gBAAiB,CAAC,CAAEmU,EAAS,gBAE7B,IAAKqc,GACL,OAAQC,GACR,OAAQC,GACR,WAAYA,IAAcX,EAAO,QACjC,mBAAoBC,EACpB,MAAOW,GACP,SAAUC,GACV,QAASC,GACT,UAAWC,GACX,gBAAiBC,GACjB,YAAaC,GAEb,qBAAsBF,IAAiB3c,EAAS,gBAAkB3Q,GAClE,sBAAuBstB,IAAiB3c,EAAS,gBAAkBzI,GAEnE,aAAculB,GACd,aAAcC,GAEd,WAAYC,GACZ,cAAeM,GAEf,UAAWL,EACX,aAAcM,GACd,mBAAoBC,GACpB,sBAAuBC,GAEvB,WAAYP,EAEZ,YAAaC,GACb,eAAgBO,GAChB,wBAAyBC,GAEzB,MAAOP,GACP,cAAeQ,GACf,kBAAmBC,EAEnB,YAAaC,EACb,iBAAkBC,EAClB,qBAAsBC,GAEtB,aAAcX,GACd,gBAAiBY,EACjB,aAAcC,EAEd,YAAaC,EAEb,OAAQne,EAAS,cAAgB,IAASA,EAAS,WAAapR,IAAkBoR,EAAS,kBAAoB,GAE/G,SAAUoe,GACV,UAAWC,GACX,UAAWC,GAEX,QAASte,EAAS,QAIlB,MAAOqc,IAAWf,EAAYtb,EAAS,IAAI,OAAQ,EACnD,QAASwc,IAAalB,EAAYtb,EAAS,MAAM,OAAQ,EACzD,WAAYyc,IAAgBnB,EAAYtb,EAAS,SAAS,OAAQ,EAClE,UAAW0c,IAAepB,EAAYtb,EAAS,QAAQ,OAAQ,EAC/D,YAAa2c,IAAiBrB,EAAYtb,EAAS,UAAU,OAAQ,EACrE,kBAAmB4c,IAAuBtB,EAAYtb,EAAS,gBAAgB,OAAQ,EACvF,cAAe6c,IAAmBvB,EAAYtb,EAAS,YAAY,OAAQ,EAE3E,eAAgB8c,IAAoBxB,EAAYtb,EAAS,aAAa,OAAQ,EAC9E,eAAgB+c,IAAoBzB,EAAYtb,EAAS,aAAa,OAAQ,EAE9E,gBAAiBsd,IAAqBhC,EAAYtb,EAAS,cAAc,OAAQ,EAEjF,eAAgBud,IAAoBjC,EAAYtb,EAAS,aAAa,OAAQ,EAC9E,qBAAsBwd,IAA2BlC,EAAYtb,EAAS,mBAAmB,OAAQ,EACjG,wBAAyByd,IAA8BnC,EAAYtb,EAAS,sBAAsB,OAAQ,EAE1G,iBAAkB0d,IAAsBpC,EAAYtb,EAAS,eAAe,OAAQ,EACpF,0BAA2B2d,IAAgCrC,EAAYtb,EAAS,wBAAwB,OAAQ,EAEhH,gBAAiB4d,IAAsBtC,EAAYtb,EAAS,cAAc,OAAQ,EAClF,oBAAqB6d,GAA0BvC,EAAYtb,EAAS,kBAAkB,OAAQ,EAE9F,cAAe8d,GAAmBxC,EAAYtb,EAAS,YAAY,OAAQ,EAC3E,mBAAoB+d,GAAyBzC,EAAYtb,EAAS,iBAAiB,OAAQ,EAC3F,uBAAwBge,IAA6B1C,EAAYtb,EAAS,qBAAqB,OAAQ,EAEvG,kBAAmBie,GAAuB3C,EAAYtb,EAAS,gBAAgB,OAAQ,EACvF,eAAgBke,GAAoB5C,EAAYtb,EAAS,aAAa,OAAQ,EAE9E,WAAYoe,IAAgB9C,EAAYtb,EAAS,SAAS,OAAQ,EAIlE,eAAgB,CAAC,CAAEE,EAAS,WAAW,UAAayc,IAAiBK,IACrE,aAAchd,EAAS,aACvB,aAAcA,EAAS,eAAiB,IAAQ,CAAC,CAAEE,EAAS,WAAW,OAASA,EAAS,WAAW,MAAM,WAAa,EAEvH,UAAWH,EAAO,WAAa,IAAQ,CAAC,CAAEG,EAAS,WAAW,KAAQmc,IAAW+B,IAEjF,IAAK,CAAC,CAAE1C,EACR,OAAQ1b,EAAS,MAAQ,GACzB,QAAW,CAAC,CAAE0b,GAAOA,EAAI,UAEzB,YAAe1b,EAAS,cAAgB,IAAQA,EAAS,YAAc,GAEvE,gBAAiBA,EAAS,kBAAoB,GAC9C,uBAAwB4E,EACxB,oBAAqBC,GAErB,SAAU9E,EAAO,gBAAkB,GAEnC,aAAcG,EAAS,gBAAgB,WAAa,OACpD,aAAcA,EAAS,gBAAgB,SAAW,OAClD,YAAaA,EAAS,gBAAgB,QAAU,OAChD,kBAAmB4M,EACnB,mBAAoBiP,GAEpB,aAAcP,EAAO,YAAY,OACjC,eAAgBA,EAAO,MAAM,OAC7B,cAAeA,EAAO,KAAK,OAC3B,iBAAkBA,EAAO,aAAa,OACtC,kBAAmBA,EAAO,SAAS,OACnC,cAAeA,EAAO,KAAK,OAE3B,mBAAoBA,EAAO,qBAAqB,OAChD,qBAAsBA,EAAO,eAAe,OAC5C,oBAAqBA,EAAO,cAAc,OAC1C,4BAA6BA,EAAO,4BAEpC,eAAgBA,EAAO,eAEvB,kBAAmBV,EAAS,UAC5B,oBAAqBA,EAAS,gBAE9B,UAAW9a,EAAS,UAEpB,iBAAkBzC,EAAS,UAAU,SAAWke,EAAQ,OAAS,EACjE,cAAele,EAAS,UAAU,KAElC,YAAaiS,GAEb,mBAAoB6M,IAAarc,EAAS,IAAI,iBAAmB,IAAY3c,GAAgB,YAAa2c,EAAS,IAAI,UAAW,IAAM/K,GACxI,2BAA4B4nB,IAAqB7c,EAAS,YAAY,iBAAmB,IAAY3c,GAAgB,YAAa2c,EAAS,YAAY,UAAW,IAAM/K,GAExK,mBAAoB+K,EAAS,mBAE7B,YAAaA,EAAS,OAAS9Z,GAC/B,UAAW8Z,EAAS,OAASte,GAE7B,gBAAiBse,EAAS,cAAgB,EAC1C,aAAcA,EAAS,cAAgB,EAEvC,oBAAqBA,EAAS,oBAE9B,0BAA2Bue,IAAkBve,EAAS,WAAW,mBAAqB,IAAQgD,EAAW,IAAK,0BAA2B,EACzI,oBAAsBub,IAAkBve,EAAS,WAAW,YAAc,IAAQoc,KAAoBpZ,EAAW,IAAK,kBAAmB,EAEzI,uCAAwCA,EAAW,IAAK,6BAA8B,EAEtF,sBAAuBhD,EAAS,sBAAsB,CAEvD,EAIA,OAAAgE,GAAW,WAAakX,EAAgB,IAAK,CAAE,EAC/ClX,GAAW,WAAakX,EAAgB,IAAK,CAAE,EAC/ClX,GAAW,WAAakX,EAAgB,IAAK,CAAE,EAE/CA,EAAgB,MAAM,EAEflX,EAER,CAEA,SAASwa,EAAoBxa,EAAa,CAEzC,IAAM7H,EAAQ,CAAC,EAaf,GAXK6H,EAAW,SAEf7H,EAAM,KAAM6H,EAAW,QAAS,GAIhC7H,EAAM,KAAM6H,EAAW,oBAAqB,EAC5C7H,EAAM,KAAM6H,EAAW,sBAAuB,GAI1CA,EAAW,UAAY,OAE3B,QAAYzC,KAAQyC,EAAW,QAE9B7H,EAAM,KAAMoF,CAAK,EACjBpF,EAAM,KAAM6H,EAAW,QAASzC,CAAK,CAAE,EAMzC,OAAKyC,EAAW,sBAAwB,KAEvCya,EAA8BtiB,EAAO6H,CAAW,EAChD0a,EAA4BviB,EAAO6H,CAAW,EAC9C7H,EAAM,KAAMoB,EAAS,gBAAiB,GAIvCpB,EAAM,KAAM6H,EAAW,qBAAsB,EAEtC7H,EAAM,KAAK,CAEnB,CAEA,SAASsiB,EAA8BtiB,EAAO6H,EAAa,CAE1D7H,EAAM,KAAM6H,EAAW,SAAU,EACjC7H,EAAM,KAAM6H,EAAW,gBAAiB,EACxC7H,EAAM,KAAM6H,EAAW,UAAW,EAClC7H,EAAM,KAAM6H,EAAW,kBAAmB,EAC1C7H,EAAM,KAAM6H,EAAW,KAAM,EAC7B7H,EAAM,KAAM6H,EAAW,UAAW,EAClC7H,EAAM,KAAM6H,EAAW,UAAW,EAClC7H,EAAM,KAAM6H,EAAW,OAAQ,EAC/B7H,EAAM,KAAM6H,EAAW,SAAU,EACjC7H,EAAM,KAAM6H,EAAW,WAAY,EACnC7H,EAAM,KAAM6H,EAAW,iBAAkB,EACzC7H,EAAM,KAAM6H,EAAW,aAAc,EACrC7H,EAAM,KAAM6H,EAAW,cAAe,EACtC7H,EAAM,KAAM6H,EAAW,cAAe,EACtC7H,EAAM,KAAM6H,EAAW,eAAgB,EACvC7H,EAAM,KAAM6H,EAAW,cAAe,EACtC7H,EAAM,KAAM6H,EAAW,oBAAqB,EAC5C7H,EAAM,KAAM6H,EAAW,uBAAwB,EAC/C7H,EAAM,KAAM6H,EAAW,gBAAiB,EACxC7H,EAAM,KAAM6H,EAAW,yBAA0B,EACjD7H,EAAM,KAAM6H,EAAW,eAAgB,EACvC7H,EAAM,KAAM6H,EAAW,mBAAoB,EAC3C7H,EAAM,KAAM6H,EAAW,aAAc,EACrC7H,EAAM,KAAM6H,EAAW,kBAAmB,EAC1C7H,EAAM,KAAM6H,EAAW,sBAAuB,EAC9C7H,EAAM,KAAM6H,EAAW,iBAAkB,EACzC7H,EAAM,KAAM6H,EAAW,cAAe,EACtC7H,EAAM,KAAM6H,EAAW,OAAQ,EAC/B7H,EAAM,KAAM6H,EAAW,OAAQ,EAC/B7H,EAAM,KAAM6H,EAAW,eAAgB,EACvC7H,EAAM,KAAM6H,EAAW,iBAAkB,EACzC7H,EAAM,KAAM6H,EAAW,mBAAoB,EAC3C7H,EAAM,KAAM6H,EAAW,YAAa,EACpC7H,EAAM,KAAM6H,EAAW,cAAe,EACtC7H,EAAM,KAAM6H,EAAW,aAAc,EACrC7H,EAAM,KAAM6H,EAAW,gBAAiB,EACxC7H,EAAM,KAAM6H,EAAW,aAAc,EACrC7H,EAAM,KAAM6H,EAAW,iBAAkB,EACzC7H,EAAM,KAAM6H,EAAW,kBAAmB,EAC1C7H,EAAM,KAAM6H,EAAW,oBAAqB,EAC5C7H,EAAM,KAAM6H,EAAW,mBAAoB,EAC3C7H,EAAM,KAAM6H,EAAW,2BAA4B,EACnD7H,EAAM,KAAM6H,EAAW,cAAe,EACtC7H,EAAM,KAAM6H,EAAW,aAAc,EACrC7H,EAAM,KAAM6H,EAAW,WAAY,EACnC7H,EAAM,KAAM6H,EAAW,iBAAkB,EACzC7H,EAAM,KAAM6H,EAAW,mBAAoB,EAC3C7H,EAAM,KAAM6H,EAAW,YAAa,CAErC,CAEA,SAAS0a,EAA4BviB,EAAO6H,EAAa,CAExD+W,EAAe,WAAW,EAErB/W,EAAW,YACf+W,EAAe,OAAQ,CAAE,EACrB/W,EAAW,iBACf+W,EAAe,OAAQ,CAAE,EACrB/W,EAAW,iBACf+W,EAAe,OAAQ,CAAE,EACrB/W,EAAW,QACf+W,EAAe,OAAQ,CAAE,EACrB/W,EAAW,QACf+W,EAAe,OAAQ,CAAE,EACrB/W,EAAW,sBACf+W,EAAe,OAAQ,CAAE,EACrB/W,EAAW,uBACf+W,EAAe,OAAQ,CAAE,EACrB/W,EAAW,WACf+W,EAAe,OAAQ,CAAE,EACrB/W,EAAW,aACf+W,EAAe,OAAQ,CAAE,EACrB/W,EAAW,WACf+W,EAAe,OAAQ,CAAE,EACrB/W,EAAW,cACf+W,EAAe,OAAQ,EAAG,EACtB/W,EAAW,cACf+W,EAAe,OAAQ,EAAG,EACtB/W,EAAW,YACf+W,EAAe,OAAQ,EAAG,EACtB/W,EAAW,YACf+W,EAAe,OAAQ,EAAG,EACtB/W,EAAW,YACf+W,EAAe,OAAQ,EAAG,EACtB/W,EAAW,gBACf+W,EAAe,OAAQ,EAAG,EACtB/W,EAAW,YACf+W,EAAe,OAAQ,EAAG,EACtB/W,EAAW,WACf+W,EAAe,OAAQ,EAAG,EACtB/W,EAAW,UACf+W,EAAe,OAAQ,EAAG,EACtB/W,EAAW,YACf+W,EAAe,OAAQ,EAAG,EACtB/W,EAAW,eACf+W,EAAe,OAAQ,EAAG,EACtB/W,EAAW,aACf+W,EAAe,OAAQ,EAAG,EAE3B5e,EAAM,KAAM4e,EAAe,IAAK,EAChCA,EAAe,WAAW,EAErB/W,EAAW,KACf+W,EAAe,OAAQ,CAAE,EACrB/W,EAAW,QACf+W,EAAe,OAAQ,CAAE,EACrB/W,EAAW,aACf+W,EAAe,OAAQ,CAAE,EACrB/W,EAAW,wBACf+W,EAAe,OAAQ,CAAE,EACrB/W,EAAW,qBACf+W,EAAe,OAAQ,CAAE,EACrB/W,EAAW,UACf+W,EAAe,OAAQ,CAAE,EACrB/W,EAAW,cACf+W,EAAe,OAAQ,CAAE,EACrB/W,EAAW,cACf+W,EAAe,OAAQ,CAAE,EACrB/W,EAAW,aACf+W,EAAe,OAAQ,CAAE,EACrB/W,EAAW,oBACf+W,EAAe,OAAQ,CAAE,EACrB/W,EAAW,kBACf+W,EAAe,OAAQ,EAAG,EACtB/W,EAAW,aACf+W,EAAe,OAAQ,EAAG,EACtB/W,EAAW,WACf+W,EAAe,OAAQ,EAAG,EACtB/W,EAAW,iBACf+W,EAAe,OAAQ,EAAG,EACtB/W,EAAW,WACf+W,EAAe,OAAQ,EAAG,EACtB/W,EAAW,cACf+W,EAAe,OAAQ,EAAG,EACtB/W,EAAW,OACf+W,EAAe,OAAQ,EAAG,EACtB/W,EAAW,QACf+W,EAAe,OAAQ,EAAG,EACtB/W,EAAW,WACf+W,EAAe,OAAQ,EAAG,EACtB/W,EAAW,oBACf+W,EAAe,OAAQ,EAAG,EACtB/W,EAAW,4BACf+W,EAAe,OAAQ,EAAG,EACtB/W,EAAW,iBACf+W,EAAe,OAAQ,EAAG,EAE3B5e,EAAM,KAAM4e,EAAe,IAAK,CAEjC,CAEA,SAAS4D,EAAa3e,EAAW,CAEhC,IAAM8b,EAAWT,EAAWrb,EAAS,IAAK,EACtC4e,EAEJ,GAAK9C,EAAW,CAEf,IAAMhH,EAAS1f,GAAW0mB,CAAS,EACnC8C,EAAW/lB,GAAc,MAAOic,EAAO,QAAS,CAEjD,MAEC8J,EAAW5e,EAAS,SAIrB,OAAO4e,CAER,CAEA,SAASC,EAAgB7a,EAAY2U,EAAW,CAE/C,IAAI1Y,EAAUmb,EAAY,IAAKzC,CAAS,EAExC,OAAK1Y,IAAY,OAEhB,EAAGA,EAAQ,WAIXA,EAAU,IAAIyY,IAAcnb,EAAUob,EAAU3U,EAAYvE,CAAc,EAC1E0b,EAAS,KAAMlb,CAAQ,EAEvBmb,EAAY,IAAKzC,EAAU1Y,CAAQ,GAI7BA,CAER,CAEA,SAAS6e,EAAgB7e,EAAU,CAElC,GAAK,EAAGA,EAAQ,YAAc,EAAI,CAGjC,IAAMpD,EAAIse,EAAS,QAASlb,CAAQ,EACpCkb,EAAUte,CAAE,EAAIse,EAAUA,EAAS,OAAS,CAAE,EAC9CA,EAAS,IAAI,EAGbC,EAAY,OAAQnb,EAAQ,QAAS,EAGrCA,EAAQ,QAAQ,CAEjB,CAED,CAEA,SAAS8e,EAAoB/e,EAAW,CAEvCgb,EAAe,OAAQhb,CAAS,CAEjC,CAEA,SAASX,GAAU,CAElB2b,EAAe,QAAQ,CAExB,CAEA,MAAO,CACN,cAAeO,EACf,mBAAoBiD,EACpB,YAAaG,EACb,eAAgBE,EAChB,eAAgBC,EAChB,mBAAoBC,EAEpB,SAAU5D,EACV,QAAS9b,CACV,CAED,CAEA,SAAS2f,KAAkB,CAE1B,IAAIvZ,EAAa,IAAI,QAErB,SAASwZ,EAAKlf,EAAS,CAEtB,OAAO0F,EAAW,IAAK1F,CAAO,CAE/B,CAEA,SAAS9C,EAAK8C,EAAS,CAEtB,IAAImf,EAAMzZ,EAAW,IAAK1F,CAAO,EAEjC,OAAKmf,IAAQ,SAEZA,EAAM,CAAC,EACPzZ,EAAW,IAAK1F,EAAQmf,CAAI,GAItBA,CAER,CAEA,SAAShiB,EAAQ6C,EAAS,CAEzB0F,EAAW,OAAQ1F,CAAO,CAE3B,CAEA,SAAS3C,EAAQ2C,EAAQof,EAAKvjB,EAAQ,CAErC6J,EAAW,IAAK1F,CAAO,EAAGof,CAAI,EAAIvjB,CAEnC,CAEA,SAASyD,GAAU,CAElBoG,EAAa,IAAI,OAElB,CAEA,MAAO,CACN,IAAKwZ,EACL,IAAKhiB,EACL,OAAQC,EACR,OAAQE,EACR,QAASiC,CACV,CAED,CAEA,SAAS+f,IAAmB1iB,EAAGC,EAAI,CAElC,OAAKD,EAAE,aAAeC,EAAE,WAEhBD,EAAE,WAAaC,EAAE,WAEbD,EAAE,cAAgBC,EAAE,YAExBD,EAAE,YAAcC,EAAE,YAEdD,EAAE,SAAS,KAAOC,EAAE,SAAS,GAEjCD,EAAE,SAAS,GAAKC,EAAE,SAAS,GAEvBD,EAAE,IAAMC,EAAE,EAEdD,EAAE,EAAIC,EAAE,EAIRD,EAAE,GAAKC,EAAE,EAIlB,CAEA,SAAS0iB,GAA0B3iB,EAAGC,EAAI,CAEzC,OAAKD,EAAE,aAAeC,EAAE,WAEhBD,EAAE,WAAaC,EAAE,WAEbD,EAAE,cAAgBC,EAAE,YAExBD,EAAE,YAAcC,EAAE,YAEdD,EAAE,IAAMC,EAAE,EAEdA,EAAE,EAAID,EAAE,EAIRA,EAAE,GAAKC,EAAE,EAIlB,CAGA,SAAS2iB,IAAkB,CAE1B,IAAMC,EAAc,CAAC,EACjBC,EAAmB,EAEjBC,EAAS,CAAC,EACVC,EAAe,CAAC,EAChBC,EAAc,CAAC,EAErB,SAASC,GAAO,CAEfJ,EAAmB,EAEnBC,EAAO,OAAS,EAChBC,EAAa,OAAS,EACtBC,EAAY,OAAS,CAEtB,CAEA,SAASE,EAAmB9f,EAAQG,EAAUF,EAAU8f,EAAYC,EAAGC,EAAQ,CAE9E,IAAIC,EAAaV,EAAaC,CAAiB,EAE/C,OAAKS,IAAe,QAEnBA,EAAa,CACZ,GAAIlgB,EAAO,GACX,OAAQA,EACR,SAAUG,EACV,SAAUF,EACV,WAAY8f,EACZ,YAAa/f,EAAO,YACpB,EAAGggB,EACH,MAAOC,CACR,EAEAT,EAAaC,CAAiB,EAAIS,IAIlCA,EAAW,GAAKlgB,EAAO,GACvBkgB,EAAW,OAASlgB,EACpBkgB,EAAW,SAAW/f,EACtB+f,EAAW,SAAWjgB,EACtBigB,EAAW,WAAaH,EACxBG,EAAW,YAAclgB,EAAO,YAChCkgB,EAAW,EAAIF,EACfE,EAAW,MAAQD,GAIpBR,IAEOS,CAER,CAEA,SAASC,EAAMngB,EAAQG,EAAUF,EAAU8f,EAAYC,EAAGC,EAAQ,CAEjE,IAAMC,EAAaJ,EAAmB9f,EAAQG,EAAUF,EAAU8f,EAAYC,EAAGC,CAAM,EAElFhgB,EAAS,aAAe,EAE5B0f,EAAa,KAAMO,CAAW,EAEnBjgB,EAAS,cAAgB,GAEpC2f,EAAY,KAAMM,CAAW,EAI7BR,EAAO,KAAMQ,CAAW,CAI1B,CAEA,SAASE,EAASpgB,EAAQG,EAAUF,EAAU8f,EAAYC,EAAGC,EAAQ,CAEpE,IAAMC,EAAaJ,EAAmB9f,EAAQG,EAAUF,EAAU8f,EAAYC,EAAGC,CAAM,EAElFhgB,EAAS,aAAe,EAE5B0f,EAAa,QAASO,CAAW,EAEtBjgB,EAAS,cAAgB,GAEpC2f,EAAY,QAASM,CAAW,EAIhCR,EAAO,QAASQ,CAAW,CAI7B,CAEA,SAASG,EAAMC,EAAkBC,EAAwB,CAEnDb,EAAO,OAAS,GAAIA,EAAO,KAAMY,GAAoBjB,GAAkB,EACvEM,EAAa,OAAS,GAAIA,EAAa,KAAMY,GAAyBjB,EAAyB,EAC/FM,EAAY,OAAS,GAAIA,EAAY,KAAMW,GAAyBjB,EAAyB,CAEnG,CAEA,SAASkB,GAAS,CAIjB,QAAU1jB,EAAI2iB,EAAkB5d,EAAK2d,EAAY,OAAQ1iB,EAAI+E,EAAI/E,IAAO,CAEvE,IAAMojB,EAAaV,EAAa1iB,CAAE,EAElC,GAAKojB,EAAW,KAAO,KAAO,MAE9BA,EAAW,GAAK,KAChBA,EAAW,OAAS,KACpBA,EAAW,SAAW,KACtBA,EAAW,SAAW,KACtBA,EAAW,MAAQ,IAEpB,CAED,CAEA,MAAO,CAEN,OAAQR,EACR,aAAcC,EACd,YAAaC,EAEb,KAAMC,EACN,KAAMM,EACN,QAASC,EACT,OAAQI,EAER,KAAMH,CACP,CAED,CAEA,SAASI,KAAmB,CAE3B,IAAIC,EAAQ,IAAI,QAEhB,SAASxjB,EAAKqB,EAAOoiB,EAAkB,CAEtC,IAAMC,EAAYF,EAAM,IAAKniB,CAAM,EAC/BsiB,EAEJ,OAAKD,IAAc,QAElBC,EAAO,IAAItB,GACXmB,EAAM,IAAKniB,EAAO,CAAEsiB,CAAK,CAAE,GAItBF,GAAmBC,EAAU,QAEjCC,EAAO,IAAItB,GACXqB,EAAU,KAAMC,CAAK,GAIrBA,EAAOD,EAAWD,CAAgB,EAM7BE,CAER,CAEA,SAASvhB,GAAU,CAElBohB,EAAQ,IAAI,OAEb,CAEA,MAAO,CACN,IAAKxjB,EACL,QAASoC,CACV,CAED,CAEA,SAASwhB,KAAgB,CAExB,IAAMrF,EAAS,CAAC,EAEhB,MAAO,CAEN,IAAK,SAAWsF,EAAQ,CAEvB,GAAKtF,EAAQsF,EAAM,EAAG,IAAM,OAE3B,OAAOtF,EAAQsF,EAAM,EAAG,EAIzB,IAAIlC,EAEJ,OAASkC,EAAM,KAAO,CAErB,IAAK,mBACJlC,EAAW,CACV,UAAW,IAAIplB,EACf,MAAO,IAAIrW,EACZ,EACA,MAED,IAAK,YACJy7B,EAAW,CACV,SAAU,IAAIplB,EACd,UAAW,IAAIA,EACf,MAAO,IAAIrW,GACX,SAAU,EACV,QAAS,EACT,YAAa,EACb,MAAO,CACR,EACA,MAED,IAAK,aACJy7B,EAAW,CACV,SAAU,IAAIplB,EACd,MAAO,IAAIrW,GACX,SAAU,EACV,MAAO,CACR,EACA,MAED,IAAK,kBACJy7B,EAAW,CACV,UAAW,IAAIplB,EACf,SAAU,IAAIrW,GACd,YAAa,IAAIA,EAClB,EACA,MAED,IAAK,gBACJy7B,EAAW,CACV,MAAO,IAAIz7B,GACX,SAAU,IAAIqW,EACd,UAAW,IAAIA,EACf,WAAY,IAAIA,CACjB,EACA,KAEF,CAEA,OAAAgiB,EAAQsF,EAAM,EAAG,EAAIlC,EAEdA,CAER,CAED,CAED,CAEA,SAASmC,KAAsB,CAE9B,IAAMvF,EAAS,CAAC,EAEhB,MAAO,CAEN,IAAK,SAAWsF,EAAQ,CAEvB,GAAKtF,EAAQsF,EAAM,EAAG,IAAM,OAE3B,OAAOtF,EAAQsF,EAAM,EAAG,EAIzB,IAAIlC,EAEJ,OAASkC,EAAM,KAAO,CAErB,IAAK,mBACJlC,EAAW,CACV,gBAAiB,EACjB,WAAY,EACZ,iBAAkB,EAClB,aAAc,EACd,cAAe,IAAIrlB,EACpB,EACA,MAED,IAAK,YACJqlB,EAAW,CACV,gBAAiB,EACjB,WAAY,EACZ,iBAAkB,EAClB,aAAc,EACd,cAAe,IAAIrlB,EACpB,EACA,MAED,IAAK,aACJqlB,EAAW,CACV,gBAAiB,EACjB,WAAY,EACZ,iBAAkB,EAClB,aAAc,EACd,cAAe,IAAIrlB,GACnB,iBAAkB,EAClB,gBAAiB,GAClB,EACA,KAIF,CAEA,OAAAiiB,EAAQsF,EAAM,EAAG,EAAIlC,EAEdA,CAER,CAED,CAED,CAMA,SAASoC,IAAsCC,EAAQC,EAAS,CAE/D,OAASA,EAAO,WAAa,EAAI,IAAQD,EAAO,WAAa,EAAI,IAAQC,EAAO,IAAM,EAAI,IAAQD,EAAO,IAAM,EAAI,EAEpH,CAEA,SAASE,IAAane,EAAa,CAElC,IAAMtB,EAAQ,IAAImf,IAEZO,EAAcL,IAAoB,EAElCrjB,EAAQ,CAEb,QAAS,EAET,KAAM,CACL,kBAAmB,GACnB,YAAa,GACb,WAAY,GACZ,eAAgB,GAChB,WAAY,GAEZ,sBAAuB,GACvB,gBAAiB,GACjB,eAAgB,GAChB,YAAa,GAEb,eAAgB,EACjB,EAEA,QAAS,CAAE,EAAG,EAAG,CAAE,EACnB,MAAO,CAAC,EACR,YAAa,CAAC,EACd,kBAAmB,CAAC,EACpB,qBAAsB,CAAC,EACvB,wBAAyB,CAAC,EAC1B,KAAM,CAAC,EACP,aAAc,CAAC,EACf,WAAY,CAAC,EACb,cAAe,CAAC,EAChB,gBAAiB,CAAC,EAClB,SAAU,CAAC,EACX,aAAc,KACd,aAAc,KACd,MAAO,CAAC,EACR,YAAa,CAAC,EACd,eAAgB,CAAC,EACjB,kBAAmB,CAAC,EACpB,KAAM,CAAC,EACP,4BAA6B,EAC7B,eAAgB,CAEjB,EAEA,QAAUb,EAAI,EAAGA,EAAI,EAAGA,IAAOa,EAAM,MAAM,KAAM,IAAIlE,CAAU,EAE/D,IAAM6nB,EAAU,IAAI7nB,EACd8nB,EAAU,IAAI10B,GACd20B,EAAW,IAAI30B,GAErB,SAASkT,EAAO0b,EAAS,CAExB,IAAIzL,EAAI,EAAGuG,EAAI,EAAG3Z,EAAI,EAEtB,QAAUE,EAAI,EAAGA,EAAI,EAAGA,IAAOa,EAAM,MAAOb,CAAE,EAAE,IAAK,EAAG,EAAG,CAAE,EAE7D,IAAI2kB,EAAoB,EACpBC,EAAc,EACdC,EAAa,EACbC,EAAiB,EACjBC,EAAa,EAEbC,EAAwB,EACxBC,EAAkB,EAClBC,EAAiB,EACjBC,EAAc,EACdC,EAAyB,EAEzBC,EAAiB,EAGrB1G,EAAO,KAAMwF,GAAqC,EAElD,QAAUnkB,EAAI,EAAGG,EAAIwe,EAAO,OAAQ3e,EAAIG,EAAGH,IAAO,CAEjD,IAAMikB,EAAQtF,EAAQ3e,CAAE,EAElBqC,EAAQ4hB,EAAM,MACdqB,EAAYrB,EAAM,UAClBsB,EAAWtB,EAAM,SAEnBuB,EAAY,KAkBhB,GAhBKvB,EAAM,QAAUA,EAAM,OAAO,MAE5BA,EAAM,OAAO,IAAI,QAAQ,SAAWjtB,GAGxCwuB,EAAYvB,EAAM,OAAO,IAAI,QAK7BuB,EAAYvB,EAAM,OAAO,IAAI,cAAgBA,EAAM,OAAO,IAAI,SAM3DA,EAAM,eAEV/Q,GAAK7Q,EAAM,EAAIijB,EACf7L,GAAKpX,EAAM,EAAIijB,EACfxlB,GAAKuC,EAAM,EAAIijB,UAEJrB,EAAM,aAAe,CAEhC,QAAUlT,EAAI,EAAGA,EAAI,EAAGA,IAEvBlQ,EAAM,MAAOkQ,CAAE,EAAE,gBAAiBkT,EAAM,GAAG,aAAclT,CAAE,EAAGuU,CAAU,EAIzED,GAED,SAAYpB,EAAM,mBAAqB,CAEtC,IAAMlC,EAAWld,EAAM,IAAKof,CAAM,EAIlC,GAFAlC,EAAS,MAAM,KAAMkC,EAAM,KAAM,EAAE,eAAgBA,EAAM,SAAU,EAE9DA,EAAM,WAAa,CAEvB,IAAMwB,EAASxB,EAAM,OAEfyB,EAAiBnB,EAAY,IAAKN,CAAM,EAE9CyB,EAAe,gBAAkBD,EAAO,UACxCC,EAAe,WAAaD,EAAO,KACnCC,EAAe,iBAAmBD,EAAO,WACzCC,EAAe,aAAeD,EAAO,OACrCC,EAAe,cAAgBD,EAAO,QAEtC5kB,EAAM,kBAAmB8jB,CAAkB,EAAIe,EAC/C7kB,EAAM,qBAAsB8jB,CAAkB,EAAIa,EAClD3kB,EAAM,wBAAyB8jB,CAAkB,EAAIV,EAAM,OAAO,OAElEe,GAED,CAEAnkB,EAAM,YAAa8jB,CAAkB,EAAI5C,EAEzC4C,GAED,SAAYV,EAAM,YAAc,CAE/B,IAAMlC,EAAWld,EAAM,IAAKof,CAAM,EAElClC,EAAS,SAAS,sBAAuBkC,EAAM,WAAY,EAE3DlC,EAAS,MAAM,KAAM1f,CAAM,EAAE,eAAgBijB,CAAU,EACvDvD,EAAS,SAAWwD,EAEpBxD,EAAS,QAAU,KAAK,IAAKkC,EAAM,KAAM,EACzClC,EAAS,YAAc,KAAK,IAAKkC,EAAM,OAAU,EAAIA,EAAM,SAAW,EACtElC,EAAS,MAAQkC,EAAM,MAEvBpjB,EAAM,KAAMgkB,CAAW,EAAI9C,EAE3B,IAAM0D,EAASxB,EAAM,OAiBrB,GAfKA,EAAM,MAEVpjB,EAAM,aAAcskB,CAAY,EAAIlB,EAAM,IAC1CkB,IAIAM,EAAO,eAAgBxB,CAAM,EAExBA,EAAM,YAAamB,KAIzBvkB,EAAM,gBAAiBgkB,CAAW,EAAIY,EAAO,OAExCxB,EAAM,WAAa,CAEvB,IAAMyB,EAAiBnB,EAAY,IAAKN,CAAM,EAE9CyB,EAAe,gBAAkBD,EAAO,UACxCC,EAAe,WAAaD,EAAO,KACnCC,EAAe,iBAAmBD,EAAO,WACzCC,EAAe,aAAeD,EAAO,OACrCC,EAAe,cAAgBD,EAAO,QAEtC5kB,EAAM,WAAYgkB,CAAW,EAAIa,EACjC7kB,EAAM,cAAegkB,CAAW,EAAIW,EAEpCN,GAED,CAEAL,GAED,SAAYZ,EAAM,gBAAkB,CAEnC,IAAMlC,EAAWld,EAAM,IAAKof,CAAM,EAElClC,EAAS,MAAM,KAAM1f,CAAM,EAAE,eAAgBijB,CAAU,EAEvDvD,EAAS,UAAU,IAAKkC,EAAM,MAAQ,GAAK,EAAK,CAAI,EACpDlC,EAAS,WAAW,IAAK,EAAKkC,EAAM,OAAS,GAAK,CAAI,EAEtDpjB,EAAM,SAAUikB,CAAe,EAAI/C,EAEnC+C,GAED,SAAYb,EAAM,aAAe,CAEhC,IAAMlC,EAAWld,EAAM,IAAKof,CAAM,EAMlC,GAJAlC,EAAS,MAAM,KAAMkC,EAAM,KAAM,EAAE,eAAgBA,EAAM,SAAU,EACnElC,EAAS,SAAWkC,EAAM,SAC1BlC,EAAS,MAAQkC,EAAM,MAElBA,EAAM,WAAa,CAEvB,IAAMwB,EAASxB,EAAM,OAEfyB,EAAiBnB,EAAY,IAAKN,CAAM,EAE9CyB,EAAe,gBAAkBD,EAAO,UACxCC,EAAe,WAAaD,EAAO,KACnCC,EAAe,iBAAmBD,EAAO,WACzCC,EAAe,aAAeD,EAAO,OACrCC,EAAe,cAAgBD,EAAO,QACtCC,EAAe,iBAAmBD,EAAO,OAAO,KAChDC,EAAe,gBAAkBD,EAAO,OAAO,IAE/C5kB,EAAM,YAAa+jB,CAAY,EAAIc,EACnC7kB,EAAM,eAAgB+jB,CAAY,EAAIY,EACtC3kB,EAAM,kBAAmB+jB,CAAY,EAAIX,EAAM,OAAO,OAEtDgB,GAED,CAEApkB,EAAM,MAAO+jB,CAAY,EAAI7C,EAE7B6C,GAED,SAAYX,EAAM,kBAAoB,CAErC,IAAMlC,EAAWld,EAAM,IAAKof,CAAM,EAElClC,EAAS,SAAS,KAAMkC,EAAM,KAAM,EAAE,eAAgBqB,CAAU,EAChEvD,EAAS,YAAY,KAAMkC,EAAM,WAAY,EAAE,eAAgBqB,CAAU,EAEzEzkB,EAAM,KAAMkkB,CAAW,EAAIhD,EAE3BgD,GAED,CAED,CAEKD,EAAiB,IAEhB3e,EAAW,IAAK,0BAA2B,IAAM,IAErDtF,EAAM,aAAe9E,GAAY,YACjC8E,EAAM,aAAe9E,GAAY,cAIjC8E,EAAM,aAAe9E,GAAY,WACjC8E,EAAM,aAAe9E,GAAY,aAMnC8E,EAAM,QAAS,CAAE,EAAIqS,EACrBrS,EAAM,QAAS,CAAE,EAAI4Y,EACrB5Y,EAAM,QAAS,CAAE,EAAIf,EAErB,IAAM6lB,EAAO9kB,EAAM,MAEd8kB,EAAK,oBAAsBhB,GAC/BgB,EAAK,cAAgBf,GACrBe,EAAK,aAAed,GACpBc,EAAK,iBAAmBb,GACxBa,EAAK,aAAeZ,GACpBY,EAAK,wBAA0BX,GAC/BW,EAAK,kBAAoBV,GACzBU,EAAK,iBAAmBT,GACxBS,EAAK,cAAgBR,GACrBQ,EAAK,iBAAmBN,KAExBxkB,EAAM,YAAY,OAAS8jB,EAC3B9jB,EAAM,KAAK,OAASgkB,EACpBhkB,EAAM,SAAS,OAASikB,EACxBjkB,EAAM,MAAM,OAAS+jB,EACrB/jB,EAAM,KAAK,OAASkkB,EAEpBlkB,EAAM,kBAAkB,OAASmkB,EACjCnkB,EAAM,qBAAqB,OAASmkB,EACpCnkB,EAAM,YAAY,OAASokB,EAC3BpkB,EAAM,eAAe,OAASokB,EAC9BpkB,EAAM,WAAW,OAASqkB,EAC1BrkB,EAAM,cAAc,OAASqkB,EAC7BrkB,EAAM,wBAAwB,OAASmkB,EACvCnkB,EAAM,kBAAkB,OAASokB,EACjCpkB,EAAM,gBAAgB,OAASqkB,EAAiBC,EAAcC,EAC9DvkB,EAAM,aAAa,OAASskB,EAC5BtkB,EAAM,4BAA8BukB,EACpCvkB,EAAM,eAAiBwkB,EAEvBM,EAAK,kBAAoBhB,EACzBgB,EAAK,YAAcf,EACnBe,EAAK,WAAad,EAClBc,EAAK,eAAiBb,EACtBa,EAAK,WAAaZ,EAElBY,EAAK,sBAAwBX,EAC7BW,EAAK,gBAAkBV,EACvBU,EAAK,eAAiBT,EACtBS,EAAK,YAAcR,EAEnBQ,EAAK,eAAiBN,EAEtBxkB,EAAM,QAAU+kB,MAIlB,CAEA,SAASC,EAAWlH,EAAQzc,EAAS,CAEpC,IAAIyiB,EAAoB,EACpBC,EAAc,EACdC,EAAa,EACbC,EAAiB,EACjBC,EAAa,EAEX1a,EAAanI,EAAO,mBAE1B,QAAUlC,EAAI,EAAGG,EAAIwe,EAAO,OAAQ3e,EAAIG,EAAGH,IAAO,CAEjD,IAAMikB,EAAQtF,EAAQ3e,CAAE,EAExB,GAAKikB,EAAM,mBAAqB,CAE/B,IAAMlC,EAAWlhB,EAAM,YAAa8jB,CAAkB,EAEtD5C,EAAS,UAAU,sBAAuBkC,EAAM,WAAY,EAC5DO,EAAQ,sBAAuBP,EAAM,OAAO,WAAY,EACxDlC,EAAS,UAAU,IAAKyC,CAAQ,EAChCzC,EAAS,UAAU,mBAAoB1X,CAAW,EAElDsa,GAED,SAAYV,EAAM,YAAc,CAE/B,IAAMlC,EAAWlhB,EAAM,KAAMgkB,CAAW,EAExC9C,EAAS,SAAS,sBAAuBkC,EAAM,WAAY,EAC3DlC,EAAS,SAAS,aAAc1X,CAAW,EAE3C0X,EAAS,UAAU,sBAAuBkC,EAAM,WAAY,EAC5DO,EAAQ,sBAAuBP,EAAM,OAAO,WAAY,EACxDlC,EAAS,UAAU,IAAKyC,CAAQ,EAChCzC,EAAS,UAAU,mBAAoB1X,CAAW,EAElDwa,GAED,SAAYZ,EAAM,gBAAkB,CAEnC,IAAMlC,EAAWlhB,EAAM,SAAUikB,CAAe,EAEhD/C,EAAS,SAAS,sBAAuBkC,EAAM,WAAY,EAC3DlC,EAAS,SAAS,aAAc1X,CAAW,EAG3Cqa,EAAS,SAAS,EAClBD,EAAQ,KAAMR,EAAM,WAAY,EAChCQ,EAAQ,YAAapa,CAAW,EAChCqa,EAAS,gBAAiBD,CAAQ,EAElC1C,EAAS,UAAU,IAAKkC,EAAM,MAAQ,GAAK,EAAK,CAAI,EACpDlC,EAAS,WAAW,IAAK,EAAKkC,EAAM,OAAS,GAAK,CAAI,EAEtDlC,EAAS,UAAU,aAAc2C,CAAS,EAC1C3C,EAAS,WAAW,aAAc2C,CAAS,EAE3CI,GAED,SAAYb,EAAM,aAAe,CAEhC,IAAMlC,EAAWlhB,EAAM,MAAO+jB,CAAY,EAE1C7C,EAAS,SAAS,sBAAuBkC,EAAM,WAAY,EAC3DlC,EAAS,SAAS,aAAc1X,CAAW,EAE3Cua,GAED,SAAYX,EAAM,kBAAoB,CAErC,IAAMlC,EAAWlhB,EAAM,KAAMkkB,CAAW,EAExChD,EAAS,UAAU,sBAAuBkC,EAAM,WAAY,EAC5DlC,EAAS,UAAU,mBAAoB1X,CAAW,EAElD0a,GAED,CAED,CAED,CAEA,MAAO,CACN,MAAO9hB,EACP,UAAW4iB,EACX,MAAOhlB,CACR,CAED,CAEA,SAASilB,GAAkB3f,EAAa,CAEvC,IAAMwY,EAAS,IAAI2F,IAAane,CAAW,EAErC4f,EAAc,CAAC,EACfC,EAAe,CAAC,EAEtB,SAASjD,EAAM7gB,EAAS,CAEvBrB,EAAM,OAASqB,EAEf6jB,EAAY,OAAS,EACrBC,EAAa,OAAS,CAEvB,CAEA,SAASC,EAAWhC,EAAQ,CAE3B8B,EAAY,KAAM9B,CAAM,CAEzB,CAEA,SAASiC,EAAYC,EAAc,CAElCH,EAAa,KAAMG,CAAY,CAEhC,CAEA,SAASC,GAAc,CAEtBzH,EAAO,MAAOoH,CAAY,CAE3B,CAEA,SAASM,EAAiBnkB,EAAS,CAElCyc,EAAO,UAAWoH,EAAa7jB,CAAO,CAEvC,CAEA,IAAMrB,EAAQ,CACb,YAAaklB,EACb,aAAcC,EAEd,OAAQ,KAER,OAAQrH,EAER,yBAA0B,CAAC,CAC5B,EAEA,MAAO,CACN,KAAMoE,EACN,MAAOliB,EACP,YAAaulB,EACb,gBAAiBC,EAEjB,UAAWJ,EACX,WAAYC,CACb,CAED,CAEA,SAASI,IAAmBngB,EAAa,CAExC,IAAIogB,EAAe,IAAI,QAEvB,SAASnmB,EAAKqB,EAAOoiB,EAAkB,EAAI,CAE1C,IAAM2C,EAAmBD,EAAa,IAAK9kB,CAAM,EAC7CglB,EAEJ,OAAKD,IAAqB,QAEzBC,EAAc,IAAIX,GAAkB3f,CAAW,EAC/CogB,EAAa,IAAK9kB,EAAO,CAAEglB,CAAY,CAAE,GAIpC5C,GAAmB2C,EAAiB,QAExCC,EAAc,IAAIX,GAAkB3f,CAAW,EAC/CqgB,EAAiB,KAAMC,CAAY,GAInCA,EAAcD,EAAkB3C,CAAgB,EAM3C4C,CAER,CAEA,SAASjkB,GAAU,CAElB+jB,EAAe,IAAI,OAEpB,CAEA,MAAO,CACN,IAAKnmB,EACL,QAASoC,CACV,CAED,CAoBA,SAASkkB,IAAgBhmB,EAAUI,EAAS6O,EAAe,CAE1D,IAAIgX,EAAW,IAAI77B,GAEb87B,EAAiB,IAAIlqB,GAC1BmqB,EAAgB,IAAInqB,GAEpBoqB,EAAY,IAAIlqB,GAEhBmqB,EAAiB,IAAI52B,GACrB62B,EAAoB,IAAI52B,GAExB62B,EAAiB,CAAC,EAElBC,EAAkBvX,EAAa,eAE1BwX,EAAa,CAAE,CAAEt8B,EAAU,EAAGhG,GAAU,CAAEA,EAAS,EAAGgG,GAAW,CAAExB,EAAW,EAAGA,EAAW,EAE5F+9B,EAAyB,IAAI5uB,GAAgB,CAClD,QAAS,CACR,YAAa,CACd,EACA,SAAU,CACT,YAAa,CAAE,MAAO,IAAK,EAC3B,WAAY,CAAE,MAAO,IAAIkE,EAAU,EACnC,OAAQ,CAAE,MAAO,CAAI,CACtB,EAEA,aAAc2qB,IACd,eAAgBC,GAEjB,CAAE,EAEIC,EAA2BH,EAAuB,MAAM,EAC9DG,EAAyB,QAAQ,gBAAkB,EAEnD,IAAMC,EAAgB,IAAI/hC,GAC1B+hC,EAAc,aACb,WACA,IAAIhiC,GACH,IAAI,aAAc,CAAE,GAAI,GAAI,GAAK,EAAG,GAAI,GAAK,GAAI,EAAG,EAAI,CAAE,EAC1D,CACD,CACD,EAEA,IAAMiiC,EAAiB,IAAIx3B,GAAMu3B,EAAeJ,CAAuB,EAEjEve,EAAQ,KAEd,KAAK,QAAU,GAEf,KAAK,WAAa,GAClB,KAAK,YAAc,GAEnB,KAAK,KAAO3V,GACZ,IAAIw0B,EAAgB,KAAK,KAEzB,KAAK,OAAS,SAAW/I,EAAQld,EAAOS,EAAS,CAKhD,GAHK2G,EAAM,UAAY,IAClBA,EAAM,aAAe,IAASA,EAAM,cAAgB,IAEpD8V,EAAO,SAAW,EAAI,OAEtBA,EAAO,OAASxrB,KAEpBiL,GAAM,mFAAoF,EAC1FugB,EAAO,KAAOzrB,IAIf,IAAMmsB,EAAsB3e,EAAS,gBAAgB,EAC/CinB,EAAiBjnB,EAAS,kBAAkB,EAC5CknB,EAAoBlnB,EAAS,qBAAqB,EAElDmnB,EAASnnB,EAAS,MAGxBmnB,EAAO,YAAan2B,EAAW,EAE1Bm2B,EAAO,QAAQ,MAAM,YAAY,IAAM,GAE3CA,EAAO,QAAQ,MAAM,SAAU,EAAG,EAAG,EAAG,CAAE,EAI1CA,EAAO,QAAQ,MAAM,SAAU,EAAG,EAAG,EAAG,CAAE,EAI3CA,EAAO,QAAQ,MAAM,QAAS,EAAK,EACnCA,EAAO,eAAgB,EAAM,EAI7B,IAAMC,EAAcJ,IAAkB,KAAK,KAItCI,GAEJrmB,EAAM,SAAU,SAAWyB,EAAS,CAE9BA,EAAO,WAEN,MAAM,QAASA,EAAO,QAAS,EAEnCA,EAAO,SAAS,QAAS6kB,GAAOA,EAAI,YAAc,EAAK,EAIvD7kB,EAAO,SAAS,YAAc,GAMjC,CAAE,EAMH,QAAUlD,EAAI,EAAG+E,EAAK4Z,EAAO,OAAQ3e,EAAI+E,EAAI/E,IAAO,CAEnD,IAAMikB,EAAQtF,EAAQ3e,CAAE,EAClBylB,EAASxB,EAAM,OAErB,GAAKwB,IAAW,OAAY,CAE3BrnB,GAAM,kBAAmB6lB,EAAO,gBAAiB,EACjD,QAED,CAEA,GAAKwB,EAAO,aAAe,IAASA,EAAO,cAAgB,GAAQ,SAEnEmB,EAAe,KAAMnB,EAAO,OAAQ,EAEpC,IAAMuC,EAAqBvC,EAAO,gBAAgB,EA0BlD,GAxBAmB,EAAe,SAAUoB,CAAmB,EAE5CnB,EAAc,KAAMpB,EAAO,OAAQ,GAE9BmB,EAAe,EAAIM,GAAmBN,EAAe,EAAIM,KAExDN,EAAe,EAAIM,IAEvBL,EAAc,EAAI,KAAK,MAAOK,EAAkBc,EAAmB,CAAE,EACrEpB,EAAe,EAAIC,EAAc,EAAImB,EAAmB,EACxDvC,EAAO,QAAQ,EAAIoB,EAAc,GAI7BD,EAAe,EAAIM,IAEvBL,EAAc,EAAI,KAAK,MAAOK,EAAkBc,EAAmB,CAAE,EACrEpB,EAAe,EAAIC,EAAc,EAAImB,EAAmB,EACxDvC,EAAO,QAAQ,EAAIoB,EAAc,IAM9BpB,EAAO,MAAQ,MAAQqC,IAAgB,GAAO,CAelD,GAbKrC,EAAO,MAAQ,OAEdA,EAAO,IAAI,eAAiB,OAEhCA,EAAO,IAAI,aAAa,QAAQ,EAChCA,EAAO,IAAI,aAAe,MAI3BA,EAAO,IAAI,QAAQ,GAIf,KAAK,OAAShpB,GAAe,CAEjC,GAAKwnB,EAAM,aAAe,CAEzB7lB,GAAM,uGAAwG,EAC9G,QAED,CAEAqnB,EAAO,IAAM,IAAIroB,GAAmBwpB,EAAe,EAAGA,EAAe,EAAG,CACvE,OAAQ5vB,GACR,KAAMrL,GACN,UAAW+C,GACX,UAAWA,GACX,gBAAiB,EAClB,CAAE,EACF+2B,EAAO,IAAI,QAAQ,KAAOxB,EAAM,KAAO,aAGvCwB,EAAO,IAAI,aAAe,IAAI18B,GAAc69B,EAAe,EAAGA,EAAe,EAAGn8B,EAAU,EAC1Fg7B,EAAO,IAAI,aAAa,KAAOxB,EAAM,KAAO,kBAC5CwB,EAAO,IAAI,aAAa,OAAS58B,GACjC48B,EAAO,IAAI,aAAa,gBAAkB,KAC1CA,EAAO,IAAI,aAAa,UAAYx0B,GACpCw0B,EAAO,IAAI,aAAa,UAAYx0B,EAErC,KAAO,CAEDgzB,EAAM,cAEVwB,EAAO,IAAM,IAAItoB,GAAuBypB,EAAe,CAAE,EACzDnB,EAAO,IAAI,aAAe,IAAIv+B,GAAkB0/B,EAAe,EAAGvqB,EAAgB,IAIlFopB,EAAO,IAAM,IAAIroB,GAAmBwpB,EAAe,EAAGA,EAAe,CAAE,EACvEnB,EAAO,IAAI,aAAe,IAAI18B,GAAc69B,EAAe,EAAGA,EAAe,EAAGvqB,EAAgB,GAIjGopB,EAAO,IAAI,aAAa,KAAOxB,EAAM,KAAO,aAC5CwB,EAAO,IAAI,aAAa,OAAS58B,GAEjC,IAAMmf,EAAsBtH,EAAS,MAAM,QAAQ,MAAM,YAAY,EAEhE,KAAK,OAASxN,IAElBuyB,EAAO,IAAI,aAAa,gBAAkBzd,EAAsB3c,GAAsBuC,GACtF63B,EAAO,IAAI,aAAa,UAAY/2B,GACpC+2B,EAAO,IAAI,aAAa,UAAY/2B,KAIpC+2B,EAAO,IAAI,aAAa,gBAAkB,KAC1CA,EAAO,IAAI,aAAa,UAAYx0B,GACpCw0B,EAAO,IAAI,aAAa,UAAYx0B,GAItC,CAEAw0B,EAAO,OAAO,uBAAuB,CAEtC,CAGA,IAAMwC,EAAYxC,EAAO,IAAI,wBAA0B,EAAI,EAE3D,QAAUlZ,EAAO,EAAGA,EAAO0b,EAAW1b,IAAU,CAG/C,GAAKkZ,EAAO,IAAI,wBAEf/kB,EAAS,gBAAiB+kB,EAAO,IAAKlZ,CAAK,EAC3C7L,EAAS,MAAM,MAET,CAGD6L,IAAS,IAEb7L,EAAS,gBAAiB+kB,EAAO,GAAI,EACrC/kB,EAAS,MAAM,GAIhB,IAAMwnB,EAAWzC,EAAO,YAAalZ,CAAK,EAE1Cua,EAAU,IACTD,EAAc,EAAIqB,EAAS,EAC3BrB,EAAc,EAAIqB,EAAS,EAC3BrB,EAAc,EAAIqB,EAAS,EAC3BrB,EAAc,EAAIqB,EAAS,CAC5B,EAEAL,EAAO,SAAUf,CAAU,CAE5B,CAEA,GAAK7C,EAAM,aAAe,CAEzB,IAAM/hB,EAASujB,EAAO,OAChB0C,GAAe1C,EAAO,OAEtB2C,GAAMnE,EAAM,UAAY/hB,EAAO,IAEhCkmB,KAAQlmB,EAAO,MAEnBA,EAAO,IAAMkmB,GACblmB,EAAO,uBAAuB,GAI/BmmB,GAAoB,sBAAuBpE,EAAM,WAAY,EAC7D/hB,EAAO,SAAS,KAAMmmB,EAAoB,EAE1CC,GAAY,KAAMpmB,EAAO,QAAS,EAClComB,GAAY,IAAKC,IAAiBhc,CAAK,CAAE,EACzCrK,EAAO,GAAG,KAAMsmB,IAAUjc,CAAK,CAAE,EACjCrK,EAAO,OAAQomB,EAAY,EAC3BpmB,EAAO,kBAAkB,EAEzBimB,GAAa,gBAAiB,CAAEE,GAAoB,EAAG,CAAEA,GAAoB,EAAG,CAAEA,GAAoB,CAAE,EAExGI,GAAkB,iBAAkBvmB,EAAO,iBAAkBA,EAAO,kBAAmB,EACvFujB,EAAO,SAAS,wBAAyBgD,GAAmBvmB,EAAO,iBAAkBA,EAAO,aAAc,CAE3G,MAECujB,EAAO,eAAgBxB,CAAM,EAI9B0C,EAAWlB,EAAO,WAAW,EAE7BiD,EAAcjnB,EAAOS,EAAQujB,EAAO,OAAQxB,EAAO,KAAK,IAAK,CAE9D,CAIKwB,EAAO,qBAAuB,IAAQ,KAAK,OAAShpB,IAExDksB,EAASlD,EAAQvjB,CAAO,EAIzBujB,EAAO,YAAc,EAEtB,CAEAiC,EAAgB,KAAK,KAErB7e,EAAM,YAAc,GAEpBnI,EAAS,gBAAiB2e,EAAqBsI,EAAgBC,CAAkB,CAElF,EAEA,SAASe,EAASlD,EAAQvjB,EAAS,CAElC,IAAMmB,EAAWvC,EAAQ,OAAQ2mB,CAAe,EAE3CL,EAAuB,QAAQ,cAAgB3B,EAAO,cAE1D2B,EAAuB,QAAQ,YAAc3B,EAAO,YACpD8B,EAAyB,QAAQ,YAAc9B,EAAO,YAEtD2B,EAAuB,YAAc,GACrCG,EAAyB,YAAc,IAInC9B,EAAO,UAAY,OAEvBA,EAAO,QAAU,IAAIroB,GAAmBwpB,EAAe,EAAGA,EAAe,EAAG,CAC3E,OAAQ5vB,GACR,KAAMrL,EACP,CAAE,GAMHy7B,EAAuB,SAAS,YAAY,MAAQ3B,EAAO,IAAI,aAC/D2B,EAAuB,SAAS,WAAW,MAAQ3B,EAAO,QAC1D2B,EAAuB,SAAS,OAAO,MAAQ3B,EAAO,OACtD/kB,EAAS,gBAAiB+kB,EAAO,OAAQ,EACzC/kB,EAAS,MAAM,EACfA,EAAS,mBAAoBwB,EAAQ,KAAMmB,EAAU+jB,EAAwBK,EAAgB,IAAK,EAIlGF,EAAyB,SAAS,YAAY,MAAQ9B,EAAO,QAAQ,QACrE8B,EAAyB,SAAS,WAAW,MAAQ9B,EAAO,QAC5D8B,EAAyB,SAAS,OAAO,MAAQ9B,EAAO,OACxD/kB,EAAS,gBAAiB+kB,EAAO,GAAI,EACrC/kB,EAAS,MAAM,EACfA,EAAS,mBAAoBwB,EAAQ,KAAMmB,EAAUkkB,EAA0BE,EAAgB,IAAK,CAErG,CAEA,SAASmB,EAAkB1lB,EAAQC,EAAU8gB,EAAOvkB,EAAO,CAE1D,IAAImpB,EAAS,KAEPC,EAAmB7E,EAAM,eAAiB,GAAS/gB,EAAO,uBAAyBA,EAAO,oBAEhG,GAAK4lB,IAAmB,OAEvBD,EAASC,UAITD,EAAW5E,EAAM,eAAiB,GAAS+C,EAAoBD,EAExDrmB,EAAS,sBAAwByC,EAAS,cAAgB,IAAQ,MAAM,QAASA,EAAS,cAAe,GAAKA,EAAS,eAAe,SAAW,GACrJA,EAAS,iBAAmBA,EAAS,oBAAsB,GAC3DA,EAAS,UAAYA,EAAS,UAAY,GAC1CA,EAAS,KAAOA,EAAS,UAAY,GACrCA,EAAS,kBAAoB,GAAS,CAKxC,IAAM4lB,EAAOF,EAAO,KAAMG,EAAO7lB,EAAS,KAEtC8lB,EAAsBhC,EAAgB8B,CAAK,EAE1CE,IAAwB,SAE5BA,EAAsB,CAAC,EACvBhC,EAAgB8B,CAAK,EAAIE,GAI1B,IAAIC,EAAiBD,EAAqBD,CAAK,EAE1CE,IAAmB,SAEvBA,EAAiBL,EAAO,MAAM,EAC9BI,EAAqBD,CAAK,EAAIE,EAC9B/lB,EAAS,iBAAkB,UAAWgmB,CAAkB,GAIzDN,EAASK,CAEV,CAgCD,GA5BAL,EAAO,QAAU1lB,EAAS,QAC1B0lB,EAAO,UAAY1lB,EAAS,UAEvBzD,IAASjD,GAEbosB,EAAO,KAAS1lB,EAAS,aAAe,KAASA,EAAS,WAAaA,EAAS,KAIhF0lB,EAAO,KAAS1lB,EAAS,aAAe,KAASA,EAAS,WAAagkB,EAAYhkB,EAAS,IAAK,EAIlG0lB,EAAO,SAAW1lB,EAAS,SAC3B0lB,EAAO,UAAc1lB,EAAS,kBAAoB,GAAS,GAAMA,EAAS,UAC1E0lB,EAAO,IAAM1lB,EAAS,IAEtB0lB,EAAO,YAAc1lB,EAAS,YAC9B0lB,EAAO,eAAiB1lB,EAAS,eACjC0lB,EAAO,iBAAmB1lB,EAAS,iBAEnC0lB,EAAO,gBAAkB1lB,EAAS,gBAClC0lB,EAAO,kBAAoB1lB,EAAS,kBACpC0lB,EAAO,iBAAmB1lB,EAAS,iBAEnC0lB,EAAO,mBAAqB1lB,EAAS,mBACrC0lB,EAAO,UAAY1lB,EAAS,UAEvB8gB,EAAM,eAAiB,IAAQ4E,EAAO,yBAA2B,GAAO,CAE5E,IAAMjf,EAAqBlJ,EAAS,WAAW,IAAKmoB,CAAO,EAC3Djf,EAAmB,MAAQqa,CAE5B,CAEA,OAAO4E,CAER,CAEA,SAASH,EAAcxlB,EAAQhB,EAAQknB,EAAcnF,EAAOvkB,EAAO,CAElE,GAAKwD,EAAO,UAAY,GAAQ,OAIhC,GAFgBA,EAAO,OAAO,KAAMhB,EAAO,MAAO,IAEhCgB,EAAO,QAAUA,EAAO,QAAUA,EAAO,YAEnDA,EAAO,YAAgBA,EAAO,eAAiBxD,IAASjD,MAAsB,CAAEyG,EAAO,eAAiByjB,EAAS,iBAAkBzjB,CAAO,GAAM,CAEtJA,EAAO,gBAAgB,iBAAkBkmB,EAAa,mBAAoBlmB,EAAO,WAAY,EAE7F,IAAMG,EAAWvC,EAAQ,OAAQoC,CAAO,EAClCC,EAAWD,EAAO,SAExB,GAAK,MAAM,QAASC,CAAS,EAAI,CAEhC,IAAMkmB,EAAShmB,EAAS,OAExB,QAAUimB,EAAI,EAAGC,EAAKF,EAAO,OAAQC,EAAIC,EAAID,IAAO,CAEnD,IAAMnG,EAAQkG,EAAQC,CAAE,EAClBE,EAAgBrmB,EAAUggB,EAAM,aAAc,EAEpD,GAAKqG,GAAiBA,EAAc,QAAU,CAE7C,IAAMC,EAAgBb,EAAkB1lB,EAAQsmB,EAAevF,EAAOvkB,CAAK,EAE3EwD,EAAO,eAAgBxC,EAAUwC,EAAQhB,EAAQknB,EAAc/lB,EAAUomB,EAAetG,CAAM,EAE9FziB,EAAS,mBAAoB0oB,EAAc,KAAM/lB,EAAUomB,EAAevmB,EAAQigB,CAAM,EAExFjgB,EAAO,cAAexC,EAAUwC,EAAQhB,EAAQknB,EAAc/lB,EAAUomB,EAAetG,CAAM,CAE9F,CAED,CAED,SAAYhgB,EAAS,QAAU,CAE9B,IAAMsmB,EAAgBb,EAAkB1lB,EAAQC,EAAU8gB,EAAOvkB,CAAK,EAEtEwD,EAAO,eAAgBxC,EAAUwC,EAAQhB,EAAQknB,EAAc/lB,EAAUomB,EAAe,IAAK,EAE7F/oB,EAAS,mBAAoB0oB,EAAc,KAAM/lB,EAAUomB,EAAevmB,EAAQ,IAAK,EAEvFA,EAAO,cAAexC,EAAUwC,EAAQhB,EAAQknB,EAAc/lB,EAAUomB,EAAe,IAAK,CAE7F,CAED,CAID,IAAMC,EAAWxmB,EAAO,SAExB,QAAUlD,EAAI,EAAGG,EAAIupB,EAAS,OAAQ1pB,EAAIG,EAAGH,IAE5C0oB,EAAcgB,EAAU1pB,CAAE,EAAGkC,EAAQknB,EAAcnF,EAAOvkB,CAAK,CAIjE,CAEA,SAASypB,EAAmBpe,EAAQ,CAElBA,EAAM,OAEd,oBAAqB,UAAWoe,CAAkB,EAI3D,QAAY3R,KAAMyP,EAAiB,CAElC,IAAMpiB,EAAQoiB,EAAgBzP,CAAG,EAE3BmS,EAAO5e,EAAM,OAAO,KAErB4e,KAAQ9kB,IAEWA,EAAO8kB,CAAK,EACpB,QAAQ,EACvB,OAAO9kB,EAAO8kB,CAAK,EAIrB,CAED,CAED,CAcA,SAASC,IAAY3qB,EAAIkH,EAAa,CAErC,SAAS0jB,GAAc,CAEtB,IAAIC,EAAS,GAEPznB,EAAQ,IAAIzF,GACdmtB,EAAmB,KACjBC,GAAoB,IAAIptB,GAAS,EAAG,EAAG,EAAG,CAAE,EAElD,MAAO,CAEN,QAAS,SAAWqtB,GAAY,CAE1BF,IAAqBE,IAAa,CAAEH,IAExC7qB,EAAG,UAAWgrB,GAAWA,GAAWA,GAAWA,EAAU,EACzDF,EAAmBE,GAIrB,EAEA,UAAW,SAAWC,GAAO,CAE5BJ,EAASI,EAEV,EAEA,SAAU,SAAWhX,GAAGuG,GAAG3Z,GAAGD,GAAGmB,GAAqB,CAEhDA,KAAuB,KAE3BkS,IAAKrT,GAAG4Z,IAAK5Z,GAAGC,IAAKD,IAItBwC,EAAM,IAAK6Q,GAAGuG,GAAG3Z,GAAGD,EAAE,EAEjBmqB,GAAkB,OAAQ3nB,CAAM,IAAM,KAE1CpD,EAAG,WAAYiU,GAAGuG,GAAG3Z,GAAGD,EAAE,EAC1BmqB,GAAkB,KAAM3nB,CAAM,EAIhC,EAEA,MAAO,UAAY,CAElBynB,EAAS,GAETC,EAAmB,KACnBC,GAAkB,IAAK,GAAI,EAAG,EAAG,CAAE,CAEpC,CAED,CAED,CAEA,SAASG,GAAc,CAEtB,IAAIL,EAAS,GAETM,EAAkB,GAClBC,EAAmB,KACnBC,GAAmB,KACnBC,GAAoB,KAExB,MAAO,CAEN,YAAa,SAAWC,GAAW,CAElC,GAAKJ,IAAoBI,GAAW,CAEnC,IAAMC,GAAMtkB,EAAW,IAAK,kBAAmB,EAE1CqkB,GAEJC,GAAI,eAAgBA,GAAI,eAAgBA,GAAI,eAAgB,EAI5DA,GAAI,eAAgBA,GAAI,eAAgBA,GAAI,uBAAwB,EAIrEL,EAAkBI,GAElB,IAAME,GAAWH,GACjBA,GAAoB,KACpB,KAAK,SAAUG,EAAS,CAEzB,CAED,EAEA,YAAa,UAAY,CAExB,OAAON,CAER,EAEA,QAAS,SAAWO,GAAY,CAE1BA,GAEJC,GAAQ3rB,EAAG,UAAW,EAItB4rB,GAAS5rB,EAAG,UAAW,CAIzB,EAEA,QAAS,SAAW6rB,GAAY,CAE1BT,IAAqBS,IAAa,CAAEhB,IAExC7qB,EAAG,UAAW6rB,EAAU,EACxBT,EAAmBS,GAIrB,EAEA,QAAS,SAAWC,GAAY,CAI/B,GAFKX,IAAkBW,GAAYC,IAAeD,EAAU,GAEvDT,KAAqBS,GAAY,CAErC,OAASA,GAAY,CAEpB,KAAKv5B,GAEJyN,EAAG,UAAWA,EAAG,KAAM,EACvB,MAED,KAAKvb,GAEJub,EAAG,UAAWA,EAAG,MAAO,EACxB,MAED,KAAKtR,GAEJsR,EAAG,UAAWA,EAAG,IAAK,EACtB,MAED,KAAKpR,GAEJoR,EAAG,UAAWA,EAAG,MAAO,EACxB,MAED,KAAKnV,GAEJmV,EAAG,UAAWA,EAAG,KAAM,EACvB,MAED,KAAK3T,GAEJ2T,EAAG,UAAWA,EAAG,MAAO,EACxB,MAED,KAAK7T,GAEJ6T,EAAG,UAAWA,EAAG,OAAQ,EACzB,MAED,KAAK9M,GAEJ8M,EAAG,UAAWA,EAAG,QAAS,EAC1B,MAED,QAECA,EAAG,UAAWA,EAAG,MAAO,CAE1B,CAEAqrB,GAAmBS,EAEpB,CAED,EAEA,UAAW,SAAWb,GAAO,CAE5BJ,EAASI,EAEV,EAEA,SAAU,SAAWzY,GAAQ,CAEvB8Y,KAAsB9Y,KAErB2Y,IAEJ3Y,GAAQ,EAAIA,IAIbxS,EAAG,WAAYwS,EAAM,EACrB8Y,GAAoB9Y,GAItB,EAEA,MAAO,UAAY,CAElBqY,EAAS,GAETO,EAAmB,KACnBC,GAAmB,KACnBC,GAAoB,KACpBH,EAAkB,EAEnB,CAED,CAED,CAEA,SAASa,GAAgB,CAExB,IAAInB,EAAS,GAEToB,EAAqB,KACrBC,EAAqB,KACrBC,GAAoB,KACpBC,GAAyB,KACzBC,GAAqB,KACrBC,GAAsB,KACtBC,GAAsB,KACtBC,GAAsB,KAE1B,MAAO,CAEN,QAAS,SAAWC,GAAc,CAE1B5B,IAED4B,GAEJd,GAAQ3rB,EAAG,YAAa,EAIxB4rB,GAAS5rB,EAAG,YAAa,EAM5B,EAEA,QAAS,SAAW0sB,GAAc,CAE5BT,IAAuBS,IAAe,CAAE7B,IAE5C7qB,EAAG,YAAa0sB,EAAY,EAC5BT,EAAqBS,GAIvB,EAEA,QAAS,SAAWC,GAAaC,GAAYF,GAAc,EAErDR,IAAuBS,IACvBR,KAAsBS,IACtBR,KAA2BM,MAE/B1sB,EAAG,YAAa2sB,GAAaC,GAAYF,EAAY,EAErDR,EAAqBS,GACrBR,GAAoBS,GACpBR,GAAyBM,GAI3B,EAEA,MAAO,SAAWG,GAAaC,GAAcC,GAAe,EAEtDV,KAAuBQ,IACvBP,KAAwBQ,IACxBP,KAAwBQ,MAE5B/sB,EAAG,UAAW6sB,GAAaC,GAAcC,EAAa,EAEtDV,GAAqBQ,GACrBP,GAAsBQ,GACtBP,GAAsBQ,GAIxB,EAEA,UAAW,SAAW9B,GAAO,CAE5BJ,EAASI,EAEV,EAEA,SAAU,SAAWxY,GAAU,CAEzB+Z,KAAwB/Z,KAE5BzS,EAAG,aAAcyS,EAAQ,EACzB+Z,GAAsB/Z,GAIxB,EAEA,MAAO,UAAY,CAElBoY,EAAS,GAEToB,EAAqB,KACrBC,EAAqB,KACrBC,GAAoB,KACpBC,GAAyB,KACzBC,GAAqB,KACrBC,GAAsB,KACtBC,GAAsB,KACtBC,GAAsB,IAEvB,CAED,CAED,CAIA,IAAMQ,EAAc,IAAIpC,EAClBqC,EAAc,IAAI/B,EAClBgC,EAAgB,IAAIlB,EAEpBmB,EAAc,IAAI,QAClBC,EAAgB,IAAI,QAEtBC,EAAsB,CAAC,EAEvBC,EAA2B,CAAC,EAC5BC,EAAqB,IAAI,QACzBC,EAAqB,CAAC,EAEtBC,EAAiB,KAEjBC,EAAyB,GACzBC,EAAkB,KAClBC,EAAuB,KACvBC,EAAkB,KAClBC,EAAkB,KAClBC,EAA4B,KAC5BC,EAAuB,KACvBC,EAAuB,KACvBC,EAAoB,IAAI7mC,GAAO,EAAG,EAAG,CAAE,EACvC8mC,EAAoB,EACpBC,EAA2B,GAE3BC,EAAmB,KACnBC,EAAkB,KAElBC,EAAmB,KAEnBC,EAA6B,KAC7BC,EAA4B,KAE1BzlB,EAAchJ,EAAG,aAAcA,EAAG,gCAAiC,EAErE0uB,EAAqB,GACrB5e,EAAU,EACR6e,EAAY3uB,EAAG,aAAcA,EAAG,OAAQ,EAEzC2uB,EAAU,QAAS,OAAQ,IAAM,IAErC7e,EAAU,WAAY,cAAc,KAAM6e,CAAU,EAAG,CAAE,CAAE,EAC3DD,EAAuB5e,GAAW,GAEvB6e,EAAU,QAAS,WAAY,IAAM,KAEhD7e,EAAU,WAAY,kBAAkB,KAAM6e,CAAU,EAAG,CAAE,CAAE,EAC/DD,EAAuB5e,GAAW,GAInC,IAAI8e,EAAqB,KACrBC,EAAuB,CAAC,EAEtBC,EAAe9uB,EAAG,aAAcA,EAAG,WAAY,EAC/C+uB,GAAgB/uB,EAAG,aAAcA,EAAG,QAAS,EAE7CgvB,GAAiB,IAAIrxB,GAAQ,EAAE,UAAWmxB,CAAa,EACvDG,GAAkB,IAAItxB,GAAQ,EAAE,UAAWoxB,EAAc,EAE/D,SAASG,GAAezuB,EAAMwN,EAAQ1G,EAAO4nB,GAAa,CAEzD,IAAM9tB,GAAO,IAAI,WAAY,CAAE,EACzBmK,GAAUxL,EAAG,cAAc,EAEjCA,EAAG,YAAaS,EAAM+K,EAAQ,EAC9BxL,EAAG,cAAeS,EAAMT,EAAG,mBAAoBA,EAAG,OAAQ,EAC1DA,EAAG,cAAeS,EAAMT,EAAG,mBAAoBA,EAAG,OAAQ,EAE1D,QAAUe,GAAI,EAAGA,GAAIwG,EAAOxG,KAEtBN,IAAST,EAAG,YAAcS,IAAST,EAAG,iBAE1CA,EAAG,WAAYiO,EAAQ,EAAGjO,EAAG,KAAM,EAAG,EAAGmvB,GAAY,EAAGnvB,EAAG,KAAMA,EAAG,cAAeqB,EAAK,EAIxFrB,EAAG,WAAYiO,EAASlN,GAAG,EAAGf,EAAG,KAAM,EAAG,EAAG,EAAGA,EAAG,KAAMA,EAAG,cAAeqB,EAAK,EAMlF,OAAOmK,EAER,CAEA,IAAM4jB,EAAgB,CAAC,EACvBA,EAAepvB,EAAG,UAAW,EAAIkvB,GAAelvB,EAAG,WAAYA,EAAG,WAAY,CAAE,EAChFovB,EAAepvB,EAAG,gBAAiB,EAAIkvB,GAAelvB,EAAG,iBAAkBA,EAAG,4BAA6B,CAAE,EAC7GovB,EAAepvB,EAAG,gBAAiB,EAAIkvB,GAAelvB,EAAG,iBAAkBA,EAAG,iBAAkB,EAAG,CAAE,EACrGovB,EAAepvB,EAAG,UAAW,EAAIkvB,GAAelvB,EAAG,WAAYA,EAAG,WAAY,EAAG,CAAE,EAInFgtB,EAAY,SAAU,EAAG,EAAG,EAAG,CAAE,EACjCC,EAAY,SAAU,CAAE,EACxBC,EAAc,SAAU,CAAE,EAE1BvB,GAAQ3rB,EAAG,UAAW,EACtBitB,EAAY,QAASr+B,EAAe,EAEpCygC,GAAc,EAAM,EACpBC,GAAa5mC,EAAa,EAC1BijC,GAAQ3rB,EAAG,SAAU,EAErBuvB,GAAa98B,EAAW,EAIxB,SAASk5B,GAAQpT,EAAK,CAEhB8U,EAAqB9U,CAAG,IAAM,KAElCvY,EAAG,OAAQuY,CAAG,EACd8U,EAAqB9U,CAAG,EAAI,GAI9B,CAEA,SAASqT,GAASrT,EAAK,CAEjB8U,EAAqB9U,CAAG,IAAM,KAElCvY,EAAG,QAASuY,CAAG,EACf8U,EAAqB9U,CAAG,EAAI,GAI9B,CAEA,SAASiX,GAAiBvhB,EAAQwhB,EAAc,CAE/C,OAAKnC,EAA0Brf,CAAO,IAAMwhB,GAE3CzvB,EAAG,gBAAiBiO,EAAQwhB,CAAY,EAExCnC,EAA0Brf,CAAO,EAAIwhB,EAIhCxhB,IAAWjO,EAAG,mBAElBstB,EAA0BttB,EAAG,WAAY,EAAIyvB,GAIzCxhB,IAAWjO,EAAG,cAElBstB,EAA0BttB,EAAG,gBAAiB,EAAIyvB,GAI5C,IAID,EAER,CAEA,SAASC,GAAa9jB,EAAc6jB,EAAc,CAEjD,IAAIC,EAAclC,EAEd/oB,GAAc,GAElB,GAAKmH,EAAe,CAEnB8jB,EAAcnC,EAAmB,IAAKkC,CAAY,EAE7CC,IAAgB,SAEpBA,EAAc,CAAC,EACfnC,EAAmB,IAAKkC,EAAaC,CAAY,GAIlD,IAAM/e,GAAW/E,EAAa,SAE9B,GAAK8jB,EAAY,SAAW/e,GAAS,QAAU+e,EAAa,CAAE,IAAM1vB,EAAG,kBAAoB,CAE1F,QAAUe,GAAI,EAAG+E,GAAK6K,GAAS,OAAQ5P,GAAI+E,GAAI/E,KAE9C2uB,EAAa3uB,EAAE,EAAIf,EAAG,kBAAoBe,GAI3C2uB,EAAY,OAAS/e,GAAS,OAE9BlM,GAAc,EAEf,CAED,MAEMirB,EAAa,CAAE,IAAM1vB,EAAG,OAE5B0vB,EAAa,CAAE,EAAI1vB,EAAG,KAEtByE,GAAc,IAMXA,IAEJzE,EAAG,YAAa0vB,CAAY,CAI9B,CAEA,SAASC,GAAYxrB,EAAU,CAE9B,OAAKspB,IAAmBtpB,GAEvBnE,EAAG,WAAYmE,CAAQ,EAEvBspB,EAAiBtpB,EAEV,IAID,EAER,CAEA,IAAMyrB,GAAe,CACpB,CAAE1rC,EAAY,EAAG8b,EAAG,SACpB,CAAE1E,EAAiB,EAAG0E,EAAG,cACzB,CAAEpH,EAAwB,EAAGoH,EAAG,qBACjC,EAEA4vB,GAAcj+B,EAAY,EAAIqO,EAAG,IACjC4vB,GAAc7+B,EAAY,EAAIiP,EAAG,IAEjC,IAAM6vB,GAAa,CAClB,CAAElxB,EAAW,EAAGqB,EAAG,KACnB,CAAEvM,EAAU,EAAGuM,EAAG,IAClB,CAAEnF,EAAe,EAAGmF,EAAG,UACvB,CAAErF,EAAe,EAAGqF,EAAG,UACvB,CAAEpF,EAAuB,EAAGoF,EAAG,mBAC/B,CAAE1V,EAAe,EAAG0V,EAAG,UACvB,CAAE3V,EAAe,EAAG2V,EAAG,UACvB,CAAEjM,EAAuB,EAAGiM,EAAG,oBAC/B,CAAElM,EAAuB,EAAGkM,EAAG,oBAC/B,CAAEnM,EAAuB,EAAGmM,EAAG,oBAC/B,CAAEpM,EAAuB,EAAGoM,EAAG,oBAC/B,CAAElY,EAAoB,EAAGkY,EAAG,eAC5B,CAAErM,EAA4B,EAAGqM,EAAG,yBACpC,CAAEnY,EAAoB,EAAGmY,EAAG,eAC5B,CAAEtM,EAA4B,EAAGsM,EAAG,wBACrC,EAEA,SAASuvB,GAAaO,EAAUC,EAAeC,EAAUC,GAAUC,GAAoBC,GAAeC,GAAeC,GAAYC,GAAYvuB,GAAqB,CAEjK,GAAK+tB,IAAar9B,GAAa,CAEzBi7B,IAA2B,KAE/B9B,GAAS5rB,EAAG,KAAM,EAClB0tB,EAAyB,IAI1B,MAED,CASA,GAPKA,IAA2B,KAE/B/B,GAAQ3rB,EAAG,KAAM,EACjB0tB,EAAyB,IAIrBoC,IAAa9mC,GAAiB,CAElC,GAAK8mC,IAAanC,GAAmB5rB,KAAuBqsB,EAA2B,CAWtF,IATKR,IAAyB1pC,IAAe6pC,IAA8B7pC,MAE1E8b,EAAG,cAAeA,EAAG,QAAS,EAE9B4tB,EAAuB1pC,GACvB6pC,EAA4B7pC,IAIxB6d,GAEJ,OAAS+tB,EAAW,CAEnB,KAAKh9B,GACJkN,EAAG,kBAAmBA,EAAG,IAAKA,EAAG,oBAAqBA,EAAG,IAAKA,EAAG,mBAAoB,EACrF,MAED,KAAK3b,GACJ2b,EAAG,UAAWA,EAAG,IAAKA,EAAG,GAAI,EAC7B,MAED,KAAKzE,GACJyE,EAAG,kBAAmBA,EAAG,KAAMA,EAAG,oBAAqBA,EAAG,KAAMA,EAAG,GAAI,EACvE,MAED,KAAKlO,GACJkO,EAAG,kBAAmBA,EAAG,UAAWA,EAAG,oBAAqBA,EAAG,KAAMA,EAAG,GAAI,EAC5E,MAED,QACCjB,GAAO,iCAAkC+wB,CAAS,EAClD,KAEF,KAIA,QAASA,EAAW,CAEnB,KAAKh9B,GACJkN,EAAG,kBAAmBA,EAAG,UAAWA,EAAG,oBAAqBA,EAAG,IAAKA,EAAG,mBAAoB,EAC3F,MAED,KAAK3b,GACJ2b,EAAG,kBAAmBA,EAAG,UAAWA,EAAG,IAAKA,EAAG,IAAKA,EAAG,GAAI,EAC3D,MAED,KAAKzE,GACJwD,GAAO,6EAA8E,EACrF,MAED,KAAKjN,GACJiN,GAAO,0EAA2E,EAClF,MAED,QACCA,GAAO,iCAAkC+wB,CAAS,EAClD,KAEF,CAIDjC,EAAkB,KAClBC,EAAkB,KAClBE,EAAuB,KACvBC,EAAuB,KACvBC,EAAkB,IAAK,EAAG,EAAG,CAAE,EAC/BC,EAAoB,EAEpBR,EAAkBmC,EAClB1B,EAA2BrsB,EAE5B,CAEA,MAED,CAIAmuB,GAAqBA,IAAsBH,EAC3CI,GAAgBA,IAAiBH,EACjCI,GAAgBA,IAAiBH,IAE5BF,IAAkBnC,GAAwBsC,KAAuBnC,KAErE/tB,EAAG,sBAAuB4vB,GAAcG,CAAc,EAAGH,GAAcM,EAAmB,CAAE,EAE5FtC,EAAuBmC,EACvBhC,EAA4BmC,KAIxBF,IAAanC,GAAmBoC,KAAanC,GAAmBqC,KAAkBnC,GAAwBoC,KAAkBnC,KAEhIjuB,EAAG,kBAAmB6vB,GAAYG,CAAS,EAAGH,GAAYI,EAAS,EAAGJ,GAAYM,EAAc,EAAGN,GAAYO,EAAc,CAAE,EAE/HvC,EAAkBmC,EAClBlC,EAAkBmC,GAClBjC,EAAuBmC,GACvBlC,EAAuBmC,KAInBC,GAAW,OAAQnC,CAAkB,IAAM,IAASoC,KAAenC,KAEvEnuB,EAAG,WAAYqwB,GAAW,EAAGA,GAAW,EAAGA,GAAW,EAAGC,EAAW,EAEpEpC,EAAkB,KAAMmC,EAAW,EACnClC,EAAoBmC,IAIrB3C,EAAkBmC,EAClB1B,EAA2B,EAE5B,CAEA,SAASmC,GAAarsB,EAAUssB,EAAc,CAE7CtsB,EAAS,OAAS9Z,GACfwhC,GAAS5rB,EAAG,SAAU,EACtB2rB,GAAQ3rB,EAAG,SAAU,EAExB,IAAIywB,EAAcvsB,EAAS,OAASte,GAC/B4qC,IAAcC,EAAY,CAAEA,GAEjCpB,GAAcoB,CAAU,EAEtBvsB,EAAS,WAAapR,IAAkBoR,EAAS,cAAgB,GAChEqrB,GAAa98B,EAAW,EACxB88B,GAAarrB,EAAS,SAAUA,EAAS,cAAeA,EAAS,SAAUA,EAAS,SAAUA,EAAS,mBAAoBA,EAAS,cAAeA,EAAS,cAAeA,EAAS,WAAYA,EAAS,WAAYA,EAAS,kBAAmB,EAEpP+oB,EAAY,QAAS/oB,EAAS,SAAU,EACxC+oB,EAAY,QAAS/oB,EAAS,SAAU,EACxC+oB,EAAY,QAAS/oB,EAAS,UAAW,EACzC8oB,EAAY,QAAS9oB,EAAS,UAAW,EAEzC,IAAMwsB,GAAexsB,EAAS,aAC9BgpB,EAAc,QAASwD,EAAa,EAC/BA,KAEJxD,EAAc,QAAShpB,EAAS,gBAAiB,EACjDgpB,EAAc,QAAShpB,EAAS,YAAaA,EAAS,WAAYA,EAAS,eAAgB,EAC3FgpB,EAAc,MAAOhpB,EAAS,YAAaA,EAAS,aAAcA,EAAS,YAAa,GAIzFysB,GAAkBzsB,EAAS,cAAeA,EAAS,oBAAqBA,EAAS,kBAAmB,EAEpGA,EAAS,kBAAoB,GAC1BynB,GAAQ3rB,EAAG,wBAAyB,EACpC4rB,GAAS5rB,EAAG,wBAAyB,CAEzC,CAIA,SAASqvB,GAAcoB,EAAY,CAE7BpC,IAAqBoC,IAEpBA,EAEJzwB,EAAG,UAAWA,EAAG,EAAG,EAIpBA,EAAG,UAAWA,EAAG,GAAI,EAItBquB,EAAmBoC,EAIrB,CAEA,SAASnB,GAAasB,EAAW,CAE3BA,IAAa/nC,IAEjB8iC,GAAQ3rB,EAAG,SAAU,EAEhB4wB,IAAatC,IAEZsC,IAAaloC,GAEjBsX,EAAG,SAAUA,EAAG,IAAK,EAEV4wB,IAAajoC,GAExBqX,EAAG,SAAUA,EAAG,KAAM,EAItBA,EAAG,SAAUA,EAAG,cAAe,IAQjC4rB,GAAS5rB,EAAG,SAAU,EAIvBsuB,EAAkBsC,CAEnB,CAEA,SAASC,GAAcjjB,EAAQ,CAEzBA,IAAU2gB,IAETG,GAAqB1uB,EAAG,UAAW4N,CAAM,EAE9C2gB,EAAmB3gB,EAIrB,CAEA,SAAS+iB,GAAkBG,EAAeC,EAAQxZ,EAAQ,CAEpDuZ,GAEJnF,GAAQ3rB,EAAG,mBAAoB,GAE1BwuB,IAA+BuC,GAAUtC,IAA8BlX,KAE3EvX,EAAG,cAAe+wB,EAAQxZ,CAAM,EAEhCiX,EAA6BuC,EAC7BtC,EAA4BlX,IAM7BqU,GAAS5rB,EAAG,mBAAoB,CAIlC,CAEA,SAASgxB,GAAgBC,EAAc,CAEjCA,EAEJtF,GAAQ3rB,EAAG,YAAa,EAIxB4rB,GAAS5rB,EAAG,YAAa,CAI3B,CAIA,SAASkxB,GAAeC,EAAY,CAE9BA,IAAc,SAAYA,EAAYnxB,EAAG,SAAWgJ,EAAc,GAElE4lB,IAAuBuC,IAE3BnxB,EAAG,cAAemxB,CAAU,EAC5BvC,EAAqBuC,EAIvB,CAEA,SAASC,GAAaC,EAAWC,EAAcH,EAAY,CAErDA,IAAc,SAEbvC,IAAuB,KAE3BuC,EAAYnxB,EAAG,SAAWgJ,EAAc,EAIxCmoB,EAAYvC,GAMd,IAAI2C,GAAe1C,EAAsBsC,CAAU,EAE9CI,KAAiB,SAErBA,GAAe,CAAE,KAAM,OAAW,QAAS,MAAU,EACrD1C,EAAsBsC,CAAU,EAAII,KAIhCA,GAAa,OAASF,GAAaE,GAAa,UAAYD,KAE3D1C,IAAuBuC,IAE3BnxB,EAAG,cAAemxB,CAAU,EAC5BvC,EAAqBuC,GAItBnxB,EAAG,YAAaqxB,EAAWC,GAAgBlC,EAAeiC,CAAU,CAAE,EAEtEE,GAAa,KAAOF,EACpBE,GAAa,QAAUD,EAIzB,CAEA,SAASE,GAAgB,CAExB,IAAMD,EAAe1C,EAAsBD,CAAmB,EAEzD2C,IAAiB,QAAaA,EAAa,OAAS,SAExDvxB,EAAG,YAAauxB,EAAa,KAAM,IAAK,EAExCA,EAAa,KAAO,OACpBA,EAAa,QAAU,OAIzB,CAEA,SAASE,GAAuB,CAE/B,GAAI,CAEHzxB,EAAG,qBAAsB,GAAG,SAAU,CAEvC,OAAU0xB,EAAI,CAEb3yB,GAAO,cAAe2yB,CAAE,CAEzB,CAED,CAEA,SAASC,IAAuB,CAE/B,GAAI,CAEH3xB,EAAG,qBAAsB,GAAG,SAAU,CAEvC,OAAU0xB,EAAI,CAEb3yB,GAAO,cAAe2yB,CAAE,CAEzB,CAED,CAEA,SAASE,IAAgB,CAExB,GAAI,CAEH5xB,EAAG,cAAe,GAAG,SAAU,CAEhC,OAAU0xB,EAAI,CAEb3yB,GAAO,cAAe2yB,CAAE,CAEzB,CAED,CAEA,SAASG,IAAgB,CAExB,GAAI,CAEH7xB,EAAG,cAAe,GAAG,SAAU,CAEhC,OAAU0xB,EAAI,CAEb3yB,GAAO,cAAe2yB,CAAE,CAEzB,CAED,CAEA,SAASI,IAA0B,CAElC,GAAI,CAEH9xB,EAAG,wBAAyB,GAAG,SAAU,CAE1C,OAAU0xB,EAAI,CAEb3yB,GAAO,cAAe2yB,CAAE,CAEzB,CAED,CAEA,SAASK,IAA0B,CAElC,GAAI,CAEH/xB,EAAG,wBAAyB,GAAG,SAAU,CAE1C,OAAU0xB,EAAI,CAEb3yB,GAAO,cAAe2yB,CAAE,CAEzB,CAED,CAEA,SAASM,IAAe,CAEvB,GAAI,CAEHhyB,EAAG,aAAc,GAAG,SAAU,CAE/B,OAAU0xB,EAAI,CAEb3yB,GAAO,cAAe2yB,CAAE,CAEzB,CAED,CAEA,SAASO,IAAe,CAEvB,GAAI,CAEHjyB,EAAG,aAAc,GAAG,SAAU,CAE/B,OAAU0xB,EAAI,CAEb3yB,GAAO,cAAe2yB,CAAE,CAEzB,CAED,CAEA,SAASQ,IAAa,CAErB,GAAI,CAEHlyB,EAAG,WAAY,GAAG,SAAU,CAE7B,OAAU0xB,EAAI,CAEb3yB,GAAO,cAAe2yB,CAAE,CAEzB,CAED,CAEA,SAASS,IAAa,CAErB,GAAI,CAEHnyB,EAAG,WAAY,GAAG,SAAU,CAE7B,OAAU0xB,EAAI,CAEb3yB,GAAO,cAAe2yB,CAAE,CAEzB,CAED,CAIA,SAASU,GAASA,EAAU,CAEtBpD,GAAe,OAAQoD,CAAQ,IAAM,KAEzCpyB,EAAG,QAASoyB,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,EAAGA,EAAQ,CAAE,EACvDpD,GAAe,KAAMoD,CAAQ,EAI/B,CAEA,SAASnJ,EAAUA,EAAW,CAExBgG,GAAgB,OAAQhG,CAAS,IAAM,KAE3CjpB,EAAG,SAAUipB,EAAS,EAAGA,EAAS,EAAGA,EAAS,EAAGA,EAAS,CAAE,EAC5DgG,GAAgB,KAAMhG,CAAS,EAIjC,CAEA,SAASoJ,EAAkBC,EAAenuB,EAAU,CAEnD,IAAIsH,EAAU2hB,EAAc,IAAKjpB,CAAQ,EAEpCsH,IAAY,SAEhBA,EAAU,IAAI,QAEd2hB,EAAc,IAAKjpB,EAASsH,CAAQ,GAIrC,IAAI8mB,GAAa9mB,EAAQ,IAAK6mB,CAAc,EAEvCC,KAAe,SAEnBA,GAAavyB,EAAG,qBAAsBmE,EAASmuB,EAAc,IAAK,EAElE7mB,EAAQ,IAAK6mB,EAAeC,EAAW,EAIzC,CAEA,SAASC,EAAqBF,EAAenuB,EAAU,CAGtD,IAAMouB,GADUnF,EAAc,IAAKjpB,CAAQ,EAChB,IAAKmuB,CAAc,EAEzCnF,EAAY,IAAKhpB,CAAQ,IAAMouB,KAGnCvyB,EAAG,oBAAqBmE,EAASouB,GAAYD,EAAc,mBAAoB,EAE/EnF,EAAY,IAAKhpB,EAASouB,EAAW,EAIvC,CAIA,SAAS5rB,IAAQ,CAIhB3G,EAAG,QAASA,EAAG,KAAM,EACrBA,EAAG,QAASA,EAAG,SAAU,EACzBA,EAAG,QAASA,EAAG,UAAW,EAC1BA,EAAG,QAASA,EAAG,mBAAoB,EACnCA,EAAG,QAASA,EAAG,YAAa,EAC5BA,EAAG,QAASA,EAAG,YAAa,EAC5BA,EAAG,QAASA,EAAG,wBAAyB,EAExCA,EAAG,cAAeA,EAAG,QAAS,EAC9BA,EAAG,UAAWA,EAAG,IAAKA,EAAG,IAAK,EAC9BA,EAAG,kBAAmBA,EAAG,IAAKA,EAAG,KAAMA,EAAG,IAAKA,EAAG,IAAK,EACvDA,EAAG,WAAY,EAAG,EAAG,EAAG,CAAE,EAE1BA,EAAG,UAAW,GAAM,GAAM,GAAM,EAAK,EACrCA,EAAG,WAAY,EAAG,EAAG,EAAG,CAAE,EAE1BA,EAAG,UAAW,EAAK,EACnBA,EAAG,UAAWA,EAAG,IAAK,EAEtBitB,EAAY,YAAa,EAAM,EAE/BjtB,EAAG,WAAY,CAAE,EAEjBA,EAAG,YAAa,UAAW,EAC3BA,EAAG,YAAaA,EAAG,OAAQ,EAAG,UAAW,EACzCA,EAAG,UAAWA,EAAG,KAAMA,EAAG,KAAMA,EAAG,IAAK,EACxCA,EAAG,aAAc,CAAE,EAEnBA,EAAG,SAAUA,EAAG,IAAK,EACrBA,EAAG,UAAWA,EAAG,GAAI,EAErBA,EAAG,cAAe,EAAG,CAAE,EAEvBA,EAAG,cAAeA,EAAG,QAAS,EAE9BA,EAAG,gBAAiBA,EAAG,YAAa,IAAK,EACzCA,EAAG,gBAAiBA,EAAG,iBAAkB,IAAK,EAC9CA,EAAG,gBAAiBA,EAAG,iBAAkB,IAAK,EAE9CA,EAAG,WAAY,IAAK,EAEpBA,EAAG,UAAW,CAAE,EAEhBA,EAAG,QAAS,EAAG,EAAGA,EAAG,OAAO,MAAOA,EAAG,OAAO,MAAO,EACpDA,EAAG,SAAU,EAAG,EAAGA,EAAG,OAAO,MAAOA,EAAG,OAAO,MAAO,EAIrDqtB,EAAsB,CAAC,EAEvBuB,EAAqB,KACrBC,EAAuB,CAAC,EAExBvB,EAA2B,CAAC,EAC5BC,EAAqB,IAAI,QACzBC,EAAqB,CAAC,EAEtBC,EAAiB,KAEjBC,EAAyB,GACzBC,EAAkB,KAClBC,EAAuB,KACvBC,EAAkB,KAClBC,EAAkB,KAClBC,EAA4B,KAC5BC,EAAuB,KACvBC,EAAuB,KACvBC,EAAoB,IAAI7mC,GAAO,EAAG,EAAG,CAAE,EACvC8mC,EAAoB,EACpBC,EAA2B,GAE3BC,EAAmB,KACnBC,EAAkB,KAElBC,EAAmB,KAEnBC,EAA6B,KAC7BC,EAA4B,KAE5BO,GAAe,IAAK,EAAG,EAAGhvB,EAAG,OAAO,MAAOA,EAAG,OAAO,MAAO,EAC5DivB,GAAgB,IAAK,EAAG,EAAGjvB,EAAG,OAAO,MAAOA,EAAG,OAAO,MAAO,EAE7DgtB,EAAY,MAAM,EAClBC,EAAY,MAAM,EAClBC,EAAc,MAAM,CAErB,CAEA,MAAO,CAEN,QAAS,CACR,MAAOF,EACP,MAAOC,EACP,QAASC,CACV,EAEA,OAAQvB,GACR,QAASC,GAET,gBAAiB4D,GACjB,YAAaE,GAEb,WAAYC,GAEZ,YAAaJ,GACb,YAAagB,GAEb,aAAclB,GACd,YAAaC,GAEb,aAAcuB,GACd,iBAAkBF,GAElB,eAAgBK,GAEhB,cAAeE,GACf,YAAaE,GACb,cAAeI,EACf,qBAAsBC,EACtB,qBAAsBE,GACtB,WAAYO,GACZ,WAAYC,GAEZ,iBAAkBE,EAClB,oBAAqBG,EAErB,aAAcR,GACd,aAAcC,GACd,cAAeL,GACf,cAAeC,GACf,wBAAyBC,GACzB,wBAAyBC,GAEzB,QAASK,GACT,SAAUnJ,EAEV,MAAOtiB,EAER,CAED,CAEA,SAAS8rB,IAAeC,EAAKxrB,EAAYtF,EAAO+H,EAAY+G,EAAcvI,EAAOhB,EAAO,CAEvF,IAAMwrB,EAAqBzrB,EAAW,IAAK,sCAAuC,EAAIA,EAAW,IAAK,sCAAuC,EAAI,KAC3I0rB,EAAgC,OAAO,UAAc,IAAc,GAAQ,iBAAiB,KAAM,UAAU,SAAU,EAEtHC,EAAmB,IAAIp1B,GACvBq1B,EAAiB,IAAI,QACvBC,EAEEC,EAAW,IAAI,QAMjBC,EAAqB,GAEzB,GAAI,CAEHA,EAAqB,OAAO,gBAAoB,KAC1C,IAAI,gBAAiB,EAAG,CAAE,EAAE,WAAY,IAAK,IAAQ,IAG5D,MAAgB,CAIhB,CAEA,SAASC,EAActlB,EAAOC,EAAS,CAItC,OAAOolB,EACN,IAAI,gBAAiBrlB,EAAOC,CAAO,EAAIslB,GAAiB,QAAS,CAEnE,CAEA,SAASC,EAAaznB,EAAO0nB,EAAgBC,GAAU,CAEtD,IAAIC,GAAQ,EAENpE,GAAaqE,GAAe7nB,CAAM,EAYxC,IARKwjB,GAAW,MAAQmE,IAAWnE,GAAW,OAASmE,MAEtDC,GAAQD,GAAU,KAAK,IAAKnE,GAAW,MAAOA,GAAW,MAAO,GAM5DoE,GAAQ,EAIZ,GAAO,OAAO,iBAAqB,KAAe5nB,aAAiB,kBAChE,OAAO,kBAAsB,KAAeA,aAAiB,mBAC7D,OAAO,YAAgB,KAAeA,aAAiB,aACvD,OAAO,WAAe,KAAeA,aAAiB,WAAe,CAEvE,IAAMiC,GAAQ,KAAK,MAAO2lB,GAAQpE,GAAW,KAAM,EAC7CthB,GAAS,KAAK,MAAO0lB,GAAQpE,GAAW,MAAO,EAEhD4D,IAAY,SAAYA,EAAUG,EAActlB,GAAOC,EAAO,GAInE,IAAM4lB,GAASJ,EAAiBH,EAActlB,GAAOC,EAAO,EAAIklB,EAEhE,OAAAU,GAAO,MAAQ7lB,GACf6lB,GAAO,OAAS5lB,GAEA4lB,GAAO,WAAY,IAAK,EAChC,UAAW9nB,EAAO,EAAG,EAAGiC,GAAOC,EAAO,EAE9C1O,GAAM,iDAAmDgwB,GAAW,MAAQ,IAAMA,GAAW,OAAS,SAAWvhB,GAAQ,IAAMC,GAAS,IAAK,EAEtI4lB,EAER,KAEC,OAAK,SAAU9nB,GAEdxM,GAAM,mDAAqDgwB,GAAW,MAAQ,IAAMA,GAAW,OAAS,IAAK,EAIvGxjB,EAMT,OAAOA,CAER,CAEA,SAAS+nB,EAA6BloB,EAAU,CAE/C,OAAOA,EAAQ,eAEhB,CAEA,SAASmoB,EAAgB1lB,EAAS,CAEjCykB,EAAI,eAAgBzkB,CAAO,CAE5B,CAEA,SAAS2lB,EAAepoB,EAAU,CAEjC,OAAKA,EAAQ,wBAAiCknB,EAAI,iBAC7ClnB,EAAQ,sBAA+BknB,EAAI,WAC3ClnB,EAAQ,0BAA4BA,EAAQ,yBAAkCknB,EAAI,iBAChFA,EAAI,UAEZ,CAEA,SAASmB,EAAmBC,EAAoBC,EAAUC,GAAQva,GAAYwa,GAAsB,GAAQ,CAE3G,GAAKH,IAAuB,KAAO,CAElC,GAAKpB,EAAKoB,CAAmB,IAAM,OAAY,OAAOpB,EAAKoB,CAAmB,EAE9E30B,GAAM,qEAAwE20B,EAAqB,GAAK,CAEzG,CAEA,IAAII,GAAiBH,EAqErB,GAnEKA,IAAarB,EAAI,MAEhBsB,KAAWtB,EAAI,QAAQwB,GAAiBxB,EAAI,MAC5CsB,KAAWtB,EAAI,aAAawB,GAAiBxB,EAAI,MACjDsB,KAAWtB,EAAI,gBAAgBwB,GAAiBxB,EAAI,KAIrDqB,IAAarB,EAAI,cAEhBsB,KAAWtB,EAAI,gBAAgBwB,GAAiBxB,EAAI,MACpDsB,KAAWtB,EAAI,iBAAiBwB,GAAiBxB,EAAI,OACrDsB,KAAWtB,EAAI,eAAewB,GAAiBxB,EAAI,OACnDsB,KAAWtB,EAAI,OAAOwB,GAAiBxB,EAAI,KAC3CsB,KAAWtB,EAAI,QAAQwB,GAAiBxB,EAAI,MAC5CsB,KAAWtB,EAAI,MAAMwB,GAAiBxB,EAAI,OAI3CqB,IAAarB,EAAI,KAEhBsB,KAAWtB,EAAI,QAAQwB,GAAiBxB,EAAI,OAC5CsB,KAAWtB,EAAI,aAAawB,GAAiBxB,EAAI,OACjDsB,KAAWtB,EAAI,gBAAgBwB,GAAiBxB,EAAI,MAIrDqB,IAAarB,EAAI,aAEhBsB,KAAWtB,EAAI,gBAAgBwB,GAAiBxB,EAAI,OACpDsB,KAAWtB,EAAI,iBAAiBwB,GAAiBxB,EAAI,QACrDsB,KAAWtB,EAAI,eAAewB,GAAiBxB,EAAI,QACnDsB,KAAWtB,EAAI,OAAOwB,GAAiBxB,EAAI,MAC3CsB,KAAWtB,EAAI,QAAQwB,GAAiBxB,EAAI,OAC5CsB,KAAWtB,EAAI,MAAMwB,GAAiBxB,EAAI,QAI3CqB,IAAarB,EAAI,cAEhBsB,KAAWtB,EAAI,gBAAgBwB,GAAiBxB,EAAI,QACpDsB,KAAWtB,EAAI,iBAAiBwB,GAAiBxB,EAAI,SACrDsB,KAAWtB,EAAI,eAAewB,GAAiBxB,EAAI,SACnDsB,KAAWtB,EAAI,OAAOwB,GAAiBxB,EAAI,OAC3CsB,KAAWtB,EAAI,QAAQwB,GAAiBxB,EAAI,QAC5CsB,KAAWtB,EAAI,MAAMwB,GAAiBxB,EAAI,SAI3CqB,IAAarB,EAAI,eAEhBsB,KAAWtB,EAAI,gBAAgBwB,GAAiBxB,EAAI,SACpDsB,KAAWtB,EAAI,iBAAiBwB,GAAiBxB,EAAI,UACrDsB,KAAWtB,EAAI,eAAewB,GAAiBxB,EAAI,UACnDsB,KAAWtB,EAAI,OAAOwB,GAAiBxB,EAAI,QAC3CsB,KAAWtB,EAAI,QAAQwB,GAAiBxB,EAAI,SAC5CsB,KAAWtB,EAAI,MAAMwB,GAAiBxB,EAAI,UAI3CqB,IAAarB,EAAI,MAEhBsB,KAAWtB,EAAI,2BAA2BwB,GAAiBxB,EAAI,SAC/DsB,KAAWtB,EAAI,+BAA+BwB,GAAiBxB,EAAI,iBAIpEqB,IAAarB,EAAI,KAAO,CAE5B,IAAMyB,GAAWF,GAAsBhkC,GAAiB1I,GAAgB,YAAakyB,EAAW,EAE3Fua,KAAWtB,EAAI,QAAQwB,GAAiBxB,EAAI,SAC5CsB,KAAWtB,EAAI,aAAawB,GAAiBxB,EAAI,SACjDsB,KAAWtB,EAAI,gBAAgBwB,GAAmBC,KAAah7B,GAAiBu5B,EAAI,aAAeA,EAAI,OACvGsB,KAAWtB,EAAI,yBAAyBwB,GAAiBxB,EAAI,OAC7DsB,KAAWtB,EAAI,yBAAyBwB,GAAiBxB,EAAI,QAEnE,CAEA,OAAKwB,KAAmBxB,EAAI,MAAQwB,KAAmBxB,EAAI,MAC1DwB,KAAmBxB,EAAI,OAASwB,KAAmBxB,EAAI,OACvDwB,KAAmBxB,EAAI,SAAWwB,KAAmBxB,EAAI,UAEzDxrB,EAAW,IAAK,wBAAyB,EAInCgtB,EAER,CAEA,SAASE,EAAwBC,EAAYC,EAAY,CAExD,IAAIC,GACJ,OAAKF,EAECC,IAAc,MAAQA,IAAcl3B,IAAmBk3B,IAAcp3B,GAEzEq3B,GAAmB7B,EAAI,iBAEZ4B,IAAc9oC,GAEzB+oC,GAAmB7B,EAAI,kBAEZ4B,IAAc/2B,KAEzBg3B,GAAmB7B,EAAI,iBACvBvzB,GAAM,+FAAgG,GAMlGm1B,IAAc,MAAQA,IAAcl3B,IAAmBk3B,IAAcp3B,GAEzEq3B,GAAmB7B,EAAI,kBAEZ4B,IAAc9oC,GAEzB+oC,GAAmB7B,EAAI,mBAEZ4B,IAAc/2B,KAEzBg3B,GAAmB7B,EAAI,mBAMlB6B,EAER,CAEA,SAASC,EAAchpB,EAASG,EAAQ,CAEvC,OAAK+nB,EAA6BloB,CAAQ,IAAM,IAAUA,EAAQ,sBAAwBA,EAAQ,YAAcxZ,IAAiBwZ,EAAQ,YAAc/b,GAE/I,KAAK,KAAM,KAAK,IAAKkc,EAAM,MAAOA,EAAM,MAAO,CAAE,EAAI,EAEjDH,EAAQ,UAAY,QAAaA,EAAQ,QAAQ,OAAS,EAI9DA,EAAQ,QAAQ,OAEZA,EAAQ,qBAAuB,MAAM,QAASA,EAAQ,KAAM,EAEhEG,EAAM,QAAQ,OAMd,CAIT,CAIA,SAASE,EAAkBC,EAAQ,CAElC,IAAMN,EAAUM,EAAM,OAEtBN,EAAQ,oBAAqB,UAAWK,CAAiB,EAEzD4oB,EAAmBjpB,CAAQ,EAEtBA,EAAQ,gBAEZsnB,EAAe,OAAQtnB,CAAQ,CAIjC,CAEA,SAASkpB,EAAuB5oB,EAAQ,CAEvC,IAAMF,EAAeE,EAAM,OAE3BF,EAAa,oBAAqB,UAAW8oB,CAAsB,EAEnEC,EAAwB/oB,CAAa,CAEtC,CAIA,SAAS6oB,EAAmBjpB,EAAU,CAErC,IAAMopB,EAAoBjrB,EAAW,IAAK6B,CAAQ,EAElD,GAAKopB,EAAkB,cAAgB,OAAY,OAInD,IAAMC,GAASrpB,EAAQ,OACjBspB,GAAgB9B,EAAS,IAAK6B,EAAO,EAE3C,GAAKC,GAAgB,CAEpB,IAAMxD,GAAewD,GAAeF,EAAkB,UAAW,EACjEtD,GAAa,YAIRA,GAAa,YAAc,GAE/ByD,EAAevpB,CAAQ,EAMnB,OAAO,KAAMspB,EAAc,EAAE,SAAW,GAE5C9B,EAAS,OAAQ6B,EAAO,CAI1B,CAEAlrB,EAAW,OAAQ6B,CAAQ,CAE5B,CAEA,SAASupB,EAAevpB,EAAU,CAEjC,IAAMopB,EAAoBjrB,EAAW,IAAK6B,CAAQ,EAClDknB,EAAI,cAAekC,EAAkB,cAAe,EAEpD,IAAMC,GAASrpB,EAAQ,OACjBspB,GAAgB9B,EAAS,IAAK6B,EAAO,EAC3C,OAAOC,GAAeF,EAAkB,UAAW,EAEnDztB,EAAK,OAAO,UAEb,CAEA,SAASwtB,EAAwB/oB,EAAe,CAE/C,IAAMopB,EAAyBrrB,EAAW,IAAKiC,CAAa,EAU5D,GARKA,EAAa,eAEjBA,EAAa,aAAa,QAAQ,EAElCjC,EAAW,OAAQiC,EAAa,YAAa,GAIzCA,EAAa,wBAEjB,QAAU7K,GAAI,EAAGA,GAAI,EAAGA,KAAO,CAE9B,GAAK,MAAM,QAASi0B,EAAuB,mBAAoBj0B,EAAE,CAAE,EAElE,QAAUk0B,GAAQ,EAAGA,GAAQD,EAAuB,mBAAoBj0B,EAAE,EAAE,OAAQk0B,KAAWvC,EAAI,kBAAmBsC,EAAuB,mBAAoBj0B,EAAE,EAAGk0B,EAAM,CAAE,OAI9KvC,EAAI,kBAAmBsC,EAAuB,mBAAoBj0B,EAAE,CAAE,EAIlEi0B,EAAuB,oBAAqBtC,EAAI,mBAAoBsC,EAAuB,mBAAoBj0B,EAAE,CAAE,CAEzH,KAEM,CAEN,GAAK,MAAM,QAASi0B,EAAuB,kBAAmB,EAE7D,QAAUC,GAAQ,EAAGA,GAAQD,EAAuB,mBAAmB,OAAQC,KAAWvC,EAAI,kBAAmBsC,EAAuB,mBAAoBC,EAAM,CAAE,OAIpKvC,EAAI,kBAAmBsC,EAAuB,kBAAmB,EAOlE,GAHKA,EAAuB,oBAAqBtC,EAAI,mBAAoBsC,EAAuB,kBAAmB,EAC9GA,EAAuB,gCAAiCtC,EAAI,kBAAmBsC,EAAuB,8BAA+B,EAErIA,EAAuB,yBAE3B,QAAUj0B,GAAI,EAAGA,GAAIi0B,EAAuB,yBAAyB,OAAQj0B,KAEvEi0B,EAAuB,yBAA0Bj0B,EAAE,GAAI2xB,EAAI,mBAAoBsC,EAAuB,yBAA0Bj0B,EAAE,CAAE,EAMtIi0B,EAAuB,0BAA2BtC,EAAI,mBAAoBsC,EAAuB,wBAAyB,CAEhI,CAEA,IAAMrkB,GAAW/E,EAAa,SAE9B,QAAU7K,GAAI,EAAG+E,GAAK6K,GAAS,OAAQ5P,GAAI+E,GAAI/E,KAAO,CAErD,IAAMm0B,GAAuBvrB,EAAW,IAAKgH,GAAU5P,EAAE,CAAE,EAEtDm0B,GAAqB,iBAEzBxC,EAAI,cAAewC,GAAqB,cAAe,EAEvD/tB,EAAK,OAAO,YAIbwC,EAAW,OAAQgH,GAAU5P,EAAE,CAAE,CAElC,CAEA4I,EAAW,OAAQiC,CAAa,CAEjC,CAIA,IAAIupB,EAAe,EAEnB,SAASC,GAAoB,CAE5BD,EAAe,CAEhB,CAEA,SAASE,GAAsB,CAE9B,IAAMC,EAAcH,EAEpB,OAAKG,GAAe5kB,EAAa,aAEhCvR,GAAM,gCAAkCm2B,EAAc,+CAAiD5kB,EAAa,WAAY,EAIjIykB,GAAgB,EAETG,CAER,CAEA,SAASC,EAAoB/pB,EAAU,CAEtC,IAAMnL,EAAQ,CAAC,EAEf,OAAAA,EAAM,KAAMmL,EAAQ,KAAM,EAC1BnL,EAAM,KAAMmL,EAAQ,KAAM,EAC1BnL,EAAM,KAAMmL,EAAQ,OAAS,CAAE,EAC/BnL,EAAM,KAAMmL,EAAQ,SAAU,EAC9BnL,EAAM,KAAMmL,EAAQ,SAAU,EAC9BnL,EAAM,KAAMmL,EAAQ,UAAW,EAC/BnL,EAAM,KAAMmL,EAAQ,cAAe,EACnCnL,EAAM,KAAMmL,EAAQ,MAAO,EAC3BnL,EAAM,KAAMmL,EAAQ,IAAK,EACzBnL,EAAM,KAAMmL,EAAQ,eAAgB,EACpCnL,EAAM,KAAMmL,EAAQ,gBAAiB,EACrCnL,EAAM,KAAMmL,EAAQ,KAAM,EAC1BnL,EAAM,KAAMmL,EAAQ,eAAgB,EACpCnL,EAAM,KAAMmL,EAAQ,UAAW,EAExBnL,EAAM,KAAK,CAEnB,CAIA,SAASm1B,EAAchqB,EAASiqB,EAAO,CAEtC,IAAMb,GAAoBjrB,EAAW,IAAK6B,CAAQ,EAIlD,GAFKA,EAAQ,gBAAiBkqB,GAAoBlqB,CAAQ,EAErDA,EAAQ,wBAA0B,IAASA,EAAQ,oBAAsB,IAAQA,EAAQ,QAAU,GAAKopB,GAAkB,YAAcppB,EAAQ,QAAU,CAE9J,IAAMG,GAAQH,EAAQ,MAEtB,GAAKG,KAAU,KAEdxM,GAAM,mEAAoE,UAE/DwM,GAAM,WAAa,GAE9BxM,GAAM,kEAAmE,MAEnE,CAENw2B,EAAef,GAAmBppB,EAASiqB,CAAK,EAChD,MAED,CAED,MAAYjqB,EAAQ,oBAEnBopB,GAAkB,eAAiBppB,EAAQ,cAAgBA,EAAQ,cAAgB,MAIpF5J,EAAM,YAAa8wB,EAAI,WAAYkC,GAAkB,eAAgBlC,EAAI,SAAW+C,CAAK,CAE1F,CAEA,SAASG,EAAmBpqB,EAASiqB,EAAO,CAE3C,IAAMb,GAAoBjrB,EAAW,IAAK6B,CAAQ,EAElD,GAAKA,EAAQ,wBAA0B,IAASA,EAAQ,QAAU,GAAKopB,GAAkB,YAAcppB,EAAQ,QAAU,CAExHmqB,EAAef,GAAmBppB,EAASiqB,CAAK,EAChD,MAED,MAAYjqB,EAAQ,oBAEnBopB,GAAkB,eAAiBppB,EAAQ,cAAgBA,EAAQ,cAAgB,MAIpF5J,EAAM,YAAa8wB,EAAI,iBAAkBkC,GAAkB,eAAgBlC,EAAI,SAAW+C,CAAK,CAEhG,CAEA,SAASI,EAAcrqB,EAASiqB,EAAO,CAEtC,IAAMb,GAAoBjrB,EAAW,IAAK6B,CAAQ,EAElD,GAAKA,EAAQ,wBAA0B,IAASA,EAAQ,QAAU,GAAKopB,GAAkB,YAAcppB,EAAQ,QAAU,CAExHmqB,EAAef,GAAmBppB,EAASiqB,CAAK,EAChD,MAED,CAEA7zB,EAAM,YAAa8wB,EAAI,WAAYkC,GAAkB,eAAgBlC,EAAI,SAAW+C,CAAK,CAE1F,CAEA,SAASK,EAAgBtqB,EAASiqB,EAAO,CAExC,IAAMb,GAAoBjrB,EAAW,IAAK6B,CAAQ,EAElD,GAAKA,EAAQ,qBAAuB,IAAQA,EAAQ,QAAU,GAAKopB,GAAkB,YAAcppB,EAAQ,QAAU,CAEpHuqB,GAAmBnB,GAAmBppB,EAASiqB,CAAK,EACpD,MAED,CAEA7zB,EAAM,YAAa8wB,EAAI,iBAAkBkC,GAAkB,eAAgBlC,EAAI,SAAW+C,CAAK,CAEhG,CAEA,IAAMO,EAAe,CACpB,CAAEt9B,EAAe,EAAGg6B,EAAI,OACxB,CAAEvrC,EAAoB,EAAGurC,EAAI,cAC7B,CAAE9gC,EAAuB,EAAG8gC,EAAI,eACjC,EAEMuD,EAAa,CAClB,CAAEjkC,EAAc,EAAG0gC,EAAI,QACvB,CAAEtgC,EAA2B,EAAGsgC,EAAI,uBACpC,CAAEvgC,EAA0B,EAAGugC,EAAI,sBAEnC,CAAEjjC,EAAa,EAAGijC,EAAI,OACtB,CAAE5iC,EAA0B,EAAG4iC,EAAI,sBACnC,CAAE7iC,EAAyB,EAAG6iC,EAAI,oBACnC,EAEMwD,EAAc,CACnB,CAAE5jC,EAAa,EAAGogC,EAAI,MACtB,CAAEluC,EAAc,EAAGkuC,EAAI,OACvB,CAAEjkC,EAAY,EAAGikC,EAAI,KACrB,CAAE/jC,EAAiB,EAAG+jC,EAAI,OAC1B,CAAE9nC,EAAa,EAAG8nC,EAAI,MACtB,CAAEtmC,EAAoB,EAAGsmC,EAAI,OAC7B,CAAExmC,EAAe,EAAGwmC,EAAI,QACxB,CAAEz/B,EAAgB,EAAGy/B,EAAI,QAC1B,EAEA,SAASyD,GAAsB1tB,EAAa+C,EAAU,CA6BrD,GA3BKA,EAAQ,OAAShgB,IAAa0b,EAAW,IAAK,0BAA2B,IAAM,KACjFsE,EAAQ,YAAc/b,IAAgB+b,EAAQ,YAAc1b,IAA6B0b,EAAQ,YAAcrZ,IAA6BqZ,EAAQ,YAAc3b,IACpK2b,EAAQ,YAAc/b,IAAgB+b,EAAQ,YAAc1b,IAA6B0b,EAAQ,YAAcrZ,IAA6BqZ,EAAQ,YAAc3b,KAElKsP,GAAM,oIAAqI,EAI5IuzB,EAAI,cAAejqB,EAAaiqB,EAAI,eAAgBsD,EAAcxqB,EAAQ,KAAM,CAAE,EAClFknB,EAAI,cAAejqB,EAAaiqB,EAAI,eAAgBsD,EAAcxqB,EAAQ,KAAM,CAAE,GAE7E/C,IAAgBiqB,EAAI,YAAcjqB,IAAgBiqB,EAAI,mBAE1DA,EAAI,cAAejqB,EAAaiqB,EAAI,eAAgBsD,EAAcxqB,EAAQ,KAAM,CAAE,EAInFknB,EAAI,cAAejqB,EAAaiqB,EAAI,mBAAoBuD,EAAYzqB,EAAQ,SAAU,CAAE,EACxFknB,EAAI,cAAejqB,EAAaiqB,EAAI,mBAAoBuD,EAAYzqB,EAAQ,SAAU,CAAE,EAEnFA,EAAQ,kBAEZknB,EAAI,cAAejqB,EAAaiqB,EAAI,qBAAsBA,EAAI,sBAAuB,EACrFA,EAAI,cAAejqB,EAAaiqB,EAAI,qBAAsBwD,EAAa1qB,EAAQ,eAAgB,CAAE,GAI7FtE,EAAW,IAAK,gCAAiC,IAAM,GAAO,CAIlE,GAFKsE,EAAQ,YAAcxZ,IACtBwZ,EAAQ,YAAcrZ,IAA6BqZ,EAAQ,YAAc3b,IACzE2b,EAAQ,OAAShgB,IAAa0b,EAAW,IAAK,0BAA2B,IAAM,GAAQ,OAE5F,GAAKsE,EAAQ,WAAa,GAAK7B,EAAW,IAAK6B,CAAQ,EAAE,oBAAsB,CAE9E,IAAMxD,GAAYd,EAAW,IAAK,gCAAiC,EACnEwrB,EAAI,cAAejqB,EAAaT,GAAU,2BAA4B,KAAK,IAAKwD,EAAQ,WAAYkF,EAAa,iBAAiB,CAAE,CAAE,EACtI/G,EAAW,IAAK6B,CAAQ,EAAE,oBAAsBA,EAAQ,UAEzD,CAED,CAED,CAEA,SAAS4qB,GAAaxB,EAAmBppB,EAAU,CAElD,IAAI6qB,GAAc,GAEbzB,EAAkB,cAAgB,SAEtCA,EAAkB,YAAc,GAEhCppB,EAAQ,iBAAkB,UAAWK,CAAiB,GAMvD,IAAMgpB,GAASrpB,EAAQ,OACnBspB,GAAgB9B,EAAS,IAAK6B,EAAO,EAEpCC,KAAkB,SAEtBA,GAAgB,CAAC,EACjB9B,EAAS,IAAK6B,GAAQC,EAAc,GAMrC,IAAMwB,GAAkBf,EAAoB/pB,CAAQ,EAEpD,GAAK8qB,KAAoB1B,EAAkB,WAAa,CAIlDE,GAAewB,EAAgB,IAAM,SAIzCxB,GAAewB,EAAgB,EAAI,CAClC,QAAS5D,EAAI,cAAc,EAC3B,UAAW,CACZ,EAEAvrB,EAAK,OAAO,WAKZkvB,GAAc,IAIfvB,GAAewB,EAAgB,EAAE,YAKjC,IAAMhF,GAAewD,GAAeF,EAAkB,UAAW,EAE5DtD,KAAiB,SAErBwD,GAAeF,EAAkB,UAAW,EAAE,YAEzCtD,GAAa,YAAc,GAE/ByD,EAAevpB,CAAQ,GAQzBopB,EAAkB,WAAa0B,GAC/B1B,EAAkB,eAAiBE,GAAewB,EAAgB,EAAE,OAErE,CAEA,OAAOD,EAER,CAEA,SAASE,GAAQlyB,EAAOmyB,EAAWC,GAAkB,CAEpD,OAAO,KAAK,MAAO,KAAK,MAAOpyB,EAAQoyB,EAAgB,EAAID,CAAU,CAEtE,CAEA,SAASE,GAAelrB,EAASG,EAAOooB,GAAUC,GAAS,CAI1D,IAAMrzB,GAAe6K,EAAQ,aAE7B,GAAK7K,GAAa,SAAW,EAE5BiB,EAAM,cAAe8wB,EAAI,WAAY,EAAG,EAAG,EAAG/mB,EAAM,MAAOA,EAAM,OAAQooB,GAAUC,GAAQroB,EAAM,IAAK,MAEhG,CAWNhL,GAAa,KAAM,CAAEC,GAAGC,KAAOD,GAAE,MAAQC,GAAE,KAAM,EAOjD,IAAIC,GAAa,EAEjB,QAAUC,GAAI,EAAGA,GAAIJ,GAAa,OAAQI,KAAO,CAEhD,IAAMC,GAAgBL,GAAcG,EAAW,EACzCG,EAAQN,GAAcI,EAAE,EAGxB41B,EAAc31B,GAAc,MAAQA,GAAc,MAClD41B,EAAaL,GAAQt1B,EAAM,MAAO0K,EAAM,MAAO,CAAgB,EAC/DkrB,GAAcN,GAAQv1B,GAAc,MAAO2K,EAAM,MAAO,CAAgB,EAK7E1K,EAAM,OAAS01B,EAAc,GAC7BC,IAAeC,IACfN,GAAQt1B,EAAM,MAAQA,EAAM,MAAQ,EAAG0K,EAAM,MAAO,CAAgB,IAAMirB,EAG1E51B,GAAc,MAAQ,KAAK,IAC1BA,GAAc,MACdC,EAAM,MAAQA,EAAM,MAAQD,GAAc,KAC3C,GAIA,EAAGF,GACHH,GAAcG,EAAW,EAAIG,EAK/B,CAGAN,GAAa,OAASG,GAAa,EAEnC,IAAMg2B,GAAsBpE,EAAI,aAAcA,EAAI,iBAAkB,EAC9DqE,GAA0BrE,EAAI,aAAcA,EAAI,kBAAmB,EACnEsE,GAAwBtE,EAAI,aAAcA,EAAI,gBAAiB,EAErEA,EAAI,YAAaA,EAAI,kBAAmB/mB,EAAM,KAAM,EAEpD,QAAU5K,GAAI,EAAGG,GAAIP,GAAa,OAAQI,GAAIG,GAAGH,KAAO,CAEvD,IAAME,EAAQN,GAAcI,EAAE,EAExBk2B,EAAa,KAAK,MAAOh2B,EAAM,MAAQ,CAAgB,EACvDi2B,EAAa,KAAK,KAAMj2B,EAAM,MAAQ,CAAgB,EAEtDsM,GAAI0pB,EAAatrB,EAAM,MACvB6B,EAAI,KAAK,MAAOypB,EAAatrB,EAAM,KAAM,EAGzCiC,EAAQspB,EACRrpB,EAAS,EAEf6kB,EAAI,YAAaA,EAAI,mBAAoBnlB,EAAE,EAC3CmlB,EAAI,YAAaA,EAAI,iBAAkBllB,CAAE,EAEzC5L,EAAM,cAAe8wB,EAAI,WAAY,EAAGnlB,GAAGC,EAAGI,EAAOC,EAAQkmB,GAAUC,GAAQroB,EAAM,IAAK,CAE3F,CAEAH,EAAQ,kBAAkB,EAE1BknB,EAAI,YAAaA,EAAI,kBAAmBoE,EAAoB,EAC5DpE,EAAI,YAAaA,EAAI,mBAAoBqE,EAAwB,EACjErE,EAAI,YAAaA,EAAI,iBAAkBsE,EAAsB,CAE9D,CAED,CAEA,SAASrB,EAAef,EAAmBppB,EAASiqB,GAAO,CAE1D,IAAIhtB,GAAciqB,EAAI,YAEjBlnB,EAAQ,oBAAsBA,EAAQ,4BAA2B/C,GAAciqB,EAAI,kBACnFlnB,EAAQ,kBAAkB/C,GAAciqB,EAAI,YAEjD,IAAM2D,GAAcD,GAAaxB,EAAmBppB,CAAQ,EACtDqpB,GAASrpB,EAAQ,OAEvB5J,EAAM,YAAa6G,GAAamsB,EAAkB,eAAgBlC,EAAI,SAAW+C,EAAK,EAEtF,IAAM0B,GAAmBxtB,EAAW,IAAKkrB,EAAO,EAEhD,GAAKA,GAAO,UAAYsC,GAAiB,WAAad,KAAgB,GAAO,CAE5Ez0B,EAAM,cAAe8wB,EAAI,SAAW+C,EAAK,EAEzC,IAAM2B,GAAmB7vC,GAAgB,aAAcA,GAAgB,iBAAkB,EACnF8vC,GAAmB7rB,EAAQ,aAAe9Y,GAAe,KAAOnL,GAAgB,aAAcikB,EAAQ,UAAW,EACjH8rB,GAAmB9rB,EAAQ,aAAe9Y,IAAgB0kC,KAAqBC,GAAmB3E,EAAI,KAAOA,EAAI,sBAEvHA,EAAI,YAAaA,EAAI,oBAAqBlnB,EAAQ,KAAM,EACxDknB,EAAI,YAAaA,EAAI,+BAAgClnB,EAAQ,gBAAiB,EAC9EknB,EAAI,YAAaA,EAAI,iBAAkBlnB,EAAQ,eAAgB,EAC/DknB,EAAI,YAAaA,EAAI,mCAAoC4E,EAAiB,EAE1E,IAAI3rB,GAAQynB,EAAa5nB,EAAQ,MAAO,GAAOkF,EAAa,cAAe,EAC3E/E,GAAQ4rB,GAAkB/rB,EAASG,EAAM,EAEzC,IAAMooB,GAAW5rB,EAAM,QAASqD,EAAQ,OAAQA,EAAQ,UAAW,EAE7DwoB,EAAS7rB,EAAM,QAASqD,EAAQ,IAAK,EACvC+oB,EAAmBV,EAAmBroB,EAAQ,eAAgBuoB,GAAUC,EAAQxoB,EAAQ,WAAYA,EAAQ,cAAe,EAE/H2qB,GAAsB1tB,GAAa+C,CAAQ,EAE3C,IAAIgsB,EACEC,GAAUjsB,EAAQ,QAElBksB,EAAkBlsB,EAAQ,iBAAmB,GAC7CmsB,EAAmBR,GAAiB,YAAc,QAAiBd,KAAgB,GACnFuB,EAAY/C,GAAO,UACnBgD,GAASrD,EAAchpB,EAASG,EAAM,EAE5C,GAAKH,EAAQ,eAEZ+oB,EAAmBH,EAAwB5oB,EAAQ,SAAW3hB,GAAoB2hB,EAAQ,IAAK,EAI1FmsB,IAECD,EAEJ91B,EAAM,aAAc8wB,EAAI,WAAY,EAAG6B,EAAkB5oB,GAAM,MAAOA,GAAM,MAAO,EAInF/J,EAAM,WAAY8wB,EAAI,WAAY,EAAG6B,EAAkB5oB,GAAM,MAAOA,GAAM,OAAQ,EAAGooB,GAAUC,EAAQ,IAAK,WAMnGxoB,EAAQ,cAMnB,GAAKisB,GAAQ,OAAS,EAAI,CAEpBC,GAAiBC,GAErB/1B,EAAM,aAAc8wB,EAAI,WAAYmF,GAAQtD,EAAkBkD,GAAS,CAAE,EAAE,MAAOA,GAAS,CAAE,EAAE,MAAO,EAIvG,QAAU12B,GAAI,EAAG+E,GAAK2xB,GAAQ,OAAQ12B,GAAI+E,GAAI/E,KAE7Cy2B,EAASC,GAAS12B,EAAE,EAEf22B,EAECE,GAEJh2B,EAAM,cAAe8wB,EAAI,WAAY3xB,GAAG,EAAG,EAAGy2B,EAAO,MAAOA,EAAO,OAAQzD,GAAUC,EAAQwD,EAAO,IAAK,EAM1G51B,EAAM,WAAY8wB,EAAI,WAAY3xB,GAAGwzB,EAAkBiD,EAAO,MAAOA,EAAO,OAAQ,EAAGzD,GAAUC,EAAQwD,EAAO,IAAK,EAMvHhsB,EAAQ,gBAAkB,EAE3B,MAEMksB,GAECC,GAEJ/1B,EAAM,aAAc8wB,EAAI,WAAYmF,GAAQtD,EAAkB5oB,GAAM,MAAOA,GAAM,MAAO,EAIpFisB,GAEJlB,GAAelrB,EAASG,GAAOooB,GAAUC,CAAO,GAMjDpyB,EAAM,WAAY8wB,EAAI,WAAY,EAAG6B,EAAkB5oB,GAAM,MAAOA,GAAM,OAAQ,EAAGooB,GAAUC,EAAQroB,GAAM,IAAK,UAMzGH,EAAQ,oBAEnB,GAAKA,EAAQ,yBAA2B,CAElCksB,GAAiBC,GAErB/1B,EAAM,aAAc8wB,EAAI,iBAAkBmF,GAAQtD,EAAkBkD,GAAS,CAAE,EAAE,MAAOA,GAAS,CAAE,EAAE,OAAQ9rB,GAAM,KAAM,EAI1H,QAAU5K,GAAI,EAAG+E,GAAK2xB,GAAQ,OAAQ12B,GAAI+E,GAAI/E,KAI7C,GAFAy2B,EAASC,GAAS12B,EAAE,EAEfyK,EAAQ,SAAW3V,GAEvB,GAAKk+B,KAAa,KAEjB,GAAK2D,GAEJ,GAAKE,EAEJ,GAAKpsB,EAAQ,aAAa,KAAO,EAAI,CAEpC,IAAMssB,GAAkBC,GAAeP,EAAO,MAAOA,EAAO,OAAQhsB,EAAQ,OAAQA,EAAQ,IAAK,EAEjG,QAAYwsB,MAAcxsB,EAAQ,aAAe,CAEhD,IAAMysB,GAAYT,EAAO,KAAK,SAC7BQ,GAAaF,GAAkBN,EAAO,KAAK,mBACzCQ,GAAa,GAAMF,GAAkBN,EAAO,KAAK,iBACpD,EACA51B,EAAM,wBAAyB8wB,EAAI,iBAAkB3xB,GAAG,EAAG,EAAGi3B,GAAYR,EAAO,MAAOA,EAAO,OAAQ,EAAGzD,GAAUkE,EAAU,CAE/H,CAEAzsB,EAAQ,kBAAkB,CAE3B,MAEC5J,EAAM,wBAAyB8wB,EAAI,iBAAkB3xB,GAAG,EAAG,EAAG,EAAGy2B,EAAO,MAAOA,EAAO,OAAQ7rB,GAAM,MAAOooB,GAAUyD,EAAO,IAAK,OAQnI51B,EAAM,qBAAsB8wB,EAAI,iBAAkB3xB,GAAGwzB,EAAkBiD,EAAO,MAAOA,EAAO,OAAQ7rB,GAAM,MAAO,EAAG6rB,EAAO,KAAM,EAAG,CAAE,OAMvIr4B,GAAM,0FAA2F,OAM7Fu4B,EAECE,GAEJh2B,EAAM,cAAe8wB,EAAI,iBAAkB3xB,GAAG,EAAG,EAAG,EAAGy2B,EAAO,MAAOA,EAAO,OAAQ7rB,GAAM,MAAOooB,GAAUC,EAAQwD,EAAO,IAAK,EAMhI51B,EAAM,WAAY8wB,EAAI,iBAAkB3xB,GAAGwzB,EAAkBiD,EAAO,MAAOA,EAAO,OAAQ7rB,GAAM,MAAO,EAAGooB,GAAUC,EAAQwD,EAAO,IAAK,CAQ5I,KAAO,CAEDE,GAAiBC,GAErB/1B,EAAM,aAAc8wB,EAAI,WAAYmF,GAAQtD,EAAkBkD,GAAS,CAAE,EAAE,MAAOA,GAAS,CAAE,EAAE,MAAO,EAIvG,QAAU12B,GAAI,EAAG+E,GAAK2xB,GAAQ,OAAQ12B,GAAI+E,GAAI/E,KAE7Cy2B,EAASC,GAAS12B,EAAE,EAEfyK,EAAQ,SAAW3V,GAElBk+B,KAAa,KAEZ2D,EAECE,GAEJh2B,EAAM,wBAAyB8wB,EAAI,WAAY3xB,GAAG,EAAG,EAAGy2B,EAAO,MAAOA,EAAO,OAAQzD,GAAUyD,EAAO,IAAK,EAM5G51B,EAAM,qBAAsB8wB,EAAI,WAAY3xB,GAAGwzB,EAAkBiD,EAAO,MAAOA,EAAO,OAAQ,EAAGA,EAAO,IAAK,EAM9Gr4B,GAAM,0FAA2F,EAM7Fu4B,EAECE,GAEJh2B,EAAM,cAAe8wB,EAAI,WAAY3xB,GAAG,EAAG,EAAGy2B,EAAO,MAAOA,EAAO,OAAQzD,GAAUC,EAAQwD,EAAO,IAAK,EAM1G51B,EAAM,WAAY8wB,EAAI,WAAY3xB,GAAGwzB,EAAkBiD,EAAO,MAAOA,EAAO,OAAQ,EAAGzD,GAAUC,EAAQwD,EAAO,IAAK,CAQzH,SAEWhsB,EAAQ,mBAEnB,GAAKksB,GAQJ,GANKC,GAEJ/1B,EAAM,aAAc8wB,EAAI,iBAAkBmF,GAAQtD,EAAkB5oB,GAAM,MAAOA,GAAM,OAAQA,GAAM,KAAM,EAIvGisB,EAEJ,GAAKpsB,EAAQ,aAAa,KAAO,EAAI,CAEpC,IAAMssB,GAAkBC,GAAepsB,GAAM,MAAOA,GAAM,OAAQH,EAAQ,OAAQA,EAAQ,IAAK,EAE/F,QAAYwsB,MAAcxsB,EAAQ,aAAe,CAEhD,IAAMysB,GAAYtsB,GAAM,KAAK,SAC5BqsB,GAAaF,GAAkBnsB,GAAM,KAAK,mBACxCqsB,GAAa,GAAMF,GAAkBnsB,GAAM,KAAK,iBACnD,EACA/J,EAAM,cAAe8wB,EAAI,iBAAkB,EAAG,EAAG,EAAGsF,GAAYrsB,GAAM,MAAOA,GAAM,OAAQ,EAAGooB,GAAUC,EAAQiE,EAAU,CAE3H,CAEAzsB,EAAQ,kBAAkB,CAE3B,MAEC5J,EAAM,cAAe8wB,EAAI,iBAAkB,EAAG,EAAG,EAAG,EAAG/mB,GAAM,MAAOA,GAAM,OAAQA,GAAM,MAAOooB,GAAUC,EAAQroB,GAAM,IAAK,OAQ9H/J,EAAM,WAAY8wB,EAAI,iBAAkB,EAAG6B,EAAkB5oB,GAAM,MAAOA,GAAM,OAAQA,GAAM,MAAO,EAAGooB,GAAUC,EAAQroB,GAAM,IAAK,UAI3HH,EAAQ,gBAEdksB,GAECC,GAEJ/1B,EAAM,aAAc8wB,EAAI,WAAYmF,GAAQtD,EAAkB5oB,GAAM,MAAOA,GAAM,OAAQA,GAAM,KAAM,EAIjGisB,GAEJh2B,EAAM,cAAe8wB,EAAI,WAAY,EAAG,EAAG,EAAG,EAAG/mB,GAAM,MAAOA,GAAM,OAAQA,GAAM,MAAOooB,GAAUC,EAAQroB,GAAM,IAAK,GAMvH/J,EAAM,WAAY8wB,EAAI,WAAY,EAAG6B,EAAkB5oB,GAAM,MAAOA,GAAM,OAAQA,GAAM,MAAO,EAAGooB,GAAUC,EAAQroB,GAAM,IAAK,UAIrHH,EAAQ,sBAEnB,GAAKmsB,EAEJ,GAAKD,EAEJ91B,EAAM,aAAc8wB,EAAI,WAAYmF,GAAQtD,EAAkB5oB,GAAM,MAAOA,GAAM,MAAO,MAElF,CAEN,IAAIiC,GAAQjC,GAAM,MAAOkC,GAASlC,GAAM,OAExC,QAAU5K,GAAI,EAAGA,GAAI82B,GAAQ92B,KAE5Ba,EAAM,WAAY8wB,EAAI,WAAY3xB,GAAGwzB,EAAkB3mB,GAAOC,GAAQ,EAAGkmB,GAAUC,EAAQ,IAAK,EAEhGpmB,KAAU,EACVC,KAAW,CAIb,UAYI4pB,GAAQ,OAAS,EAAI,CAEzB,GAAKC,GAAiBC,EAAiB,CAEtC,IAAMxI,GAAaqE,GAAeiE,GAAS,CAAE,CAAE,EAE/C71B,EAAM,aAAc8wB,EAAI,WAAYmF,GAAQtD,EAAkBpF,GAAW,MAAOA,GAAW,MAAO,CAEnG,CAEA,QAAUpuB,GAAI,EAAG+E,GAAK2xB,GAAQ,OAAQ12B,GAAI+E,GAAI/E,KAE7Cy2B,EAASC,GAAS12B,EAAE,EAEf22B,EAECE,GAEJh2B,EAAM,cAAe8wB,EAAI,WAAY3xB,GAAG,EAAG,EAAGgzB,GAAUC,EAAQwD,CAAO,EAMxE51B,EAAM,WAAY8wB,EAAI,WAAY3xB,GAAGwzB,EAAkBR,GAAUC,EAAQwD,CAAO,EAMlFhsB,EAAQ,gBAAkB,EAE3B,SAEMksB,EAAgB,CAEpB,GAAKC,EAAiB,CAErB,IAAMxI,GAAaqE,GAAe7nB,EAAM,EAExC/J,EAAM,aAAc8wB,EAAI,WAAYmF,GAAQtD,EAAkBpF,GAAW,MAAOA,GAAW,MAAO,CAEnG,CAEKyI,GAEJh2B,EAAM,cAAe8wB,EAAI,WAAY,EAAG,EAAG,EAAGqB,GAAUC,EAAQroB,EAAM,CAIxE,MAEC/J,EAAM,WAAY8wB,EAAI,WAAY,EAAG6B,EAAkBR,GAAUC,EAAQroB,EAAM,EAQ7E+nB,EAA6BloB,CAAQ,GAEzCmoB,EAAgBlrB,EAAY,EAI7B0uB,GAAiB,UAAYtC,GAAO,QAE/BrpB,EAAQ,UAAWA,EAAQ,SAAUA,CAAQ,CAEnD,CAEAopB,EAAkB,UAAYppB,EAAQ,OAEvC,CAEA,SAASuqB,GAAmBnB,EAAmBppB,EAASiqB,GAAO,CAE9D,GAAKjqB,EAAQ,MAAM,SAAW,EAAI,OAElC,IAAM6qB,GAAcD,GAAaxB,EAAmBppB,CAAQ,EACtDqpB,GAASrpB,EAAQ,OAEvB5J,EAAM,YAAa8wB,EAAI,iBAAkBkC,EAAkB,eAAgBlC,EAAI,SAAW+C,EAAK,EAE/F,IAAM0B,GAAmBxtB,EAAW,IAAKkrB,EAAO,EAEhD,GAAKA,GAAO,UAAYsC,GAAiB,WAAad,KAAgB,GAAO,CAE5Ez0B,EAAM,cAAe8wB,EAAI,SAAW+C,EAAK,EAEzC,IAAM2B,GAAmB7vC,GAAgB,aAAcA,GAAgB,iBAAkB,EACnF8vC,GAAmB7rB,EAAQ,aAAe9Y,GAAe,KAAOnL,GAAgB,aAAcikB,EAAQ,UAAW,EACjH8rB,GAAmB9rB,EAAQ,aAAe9Y,IAAgB0kC,KAAqBC,GAAmB3E,EAAI,KAAOA,EAAI,sBAEvHA,EAAI,YAAaA,EAAI,oBAAqBlnB,EAAQ,KAAM,EACxDknB,EAAI,YAAaA,EAAI,+BAAgClnB,EAAQ,gBAAiB,EAC9EknB,EAAI,YAAaA,EAAI,iBAAkBlnB,EAAQ,eAAgB,EAC/DknB,EAAI,YAAaA,EAAI,mCAAoC4E,EAAiB,EAE1E,IAAMY,GAAiB1sB,EAAQ,qBAAuBA,EAAQ,MAAO,CAAE,EAAE,oBACnE2sB,GAAkB3sB,EAAQ,MAAO,CAAE,GAAKA,EAAQ,MAAO,CAAE,EAAE,cAE3D4sB,GAAY,CAAC,EAEnB,QAAUr3B,GAAI,EAAGA,GAAI,EAAGA,KAElB,CAAEm3B,IAAgB,CAAEC,GAExBC,GAAWr3B,EAAE,EAAIqyB,EAAa5nB,EAAQ,MAAOzK,EAAE,EAAG,GAAM2P,EAAa,cAAe,EAIpF0nB,GAAWr3B,EAAE,EAAIo3B,GAAgB3sB,EAAQ,MAAOzK,EAAE,EAAE,MAAQyK,EAAQ,MAAOzK,EAAE,EAI9Eq3B,GAAWr3B,EAAE,EAAIw2B,GAAkB/rB,EAAS4sB,GAAWr3B,EAAE,CAAE,EAI5D,IAAM4K,EAAQysB,GAAW,CAAE,EAC1BrE,EAAW5rB,EAAM,QAASqD,EAAQ,OAAQA,EAAQ,UAAW,EAC7DwoB,EAAS7rB,EAAM,QAASqD,EAAQ,IAAK,EACrC+oB,GAAmBV,EAAmBroB,EAAQ,eAAgBuoB,EAAUC,EAAQxoB,EAAQ,UAAW,EAE9FksB,EAAkBlsB,EAAQ,iBAAmB,GAC7CmsB,EAAmBR,GAAiB,YAAc,QAAiBd,KAAgB,GACnFuB,EAAY/C,GAAO,UACrBgD,GAASrD,EAAchpB,EAASG,CAAM,EAE1CwqB,GAAsBzD,EAAI,iBAAkBlnB,CAAQ,EAEpD,IAAIisB,GAEJ,GAAKS,GAAe,CAEdR,GAAiBC,GAErB/1B,EAAM,aAAc8wB,EAAI,iBAAkBmF,GAAQtD,GAAkB5oB,EAAM,MAAOA,EAAM,MAAO,EAI/F,QAAU5K,GAAI,EAAGA,GAAI,EAAGA,KAAO,CAE9B02B,GAAUW,GAAWr3B,EAAE,EAAE,QAEzB,QAAU+Q,GAAI,EAAGA,GAAI2lB,GAAQ,OAAQ3lB,KAAO,CAE3C,IAAM0lB,GAASC,GAAS3lB,EAAE,EAErBtG,EAAQ,SAAW3V,GAElBk+B,IAAa,KAEZ2D,EAECE,GAEJh2B,EAAM,wBAAyB8wB,EAAI,4BAA8B3xB,GAAG+Q,GAAG,EAAG,EAAG0lB,GAAO,MAAOA,GAAO,OAAQzD,EAAUyD,GAAO,IAAK,EAMjI51B,EAAM,qBAAsB8wB,EAAI,4BAA8B3xB,GAAG+Q,GAAGyiB,GAAkBiD,GAAO,MAAOA,GAAO,OAAQ,EAAGA,GAAO,IAAK,EAMnIr4B,GAAM,2FAA4F,EAM9Fu4B,EAECE,GAEJh2B,EAAM,cAAe8wB,EAAI,4BAA8B3xB,GAAG+Q,GAAG,EAAG,EAAG0lB,GAAO,MAAOA,GAAO,OAAQzD,EAAUC,EAAQwD,GAAO,IAAK,EAM/H51B,EAAM,WAAY8wB,EAAI,4BAA8B3xB,GAAG+Q,GAAGyiB,GAAkBiD,GAAO,MAAOA,GAAO,OAAQ,EAAGzD,EAAUC,EAAQwD,GAAO,IAAK,CAM7I,CAED,CAED,KAAO,CAIN,GAFAC,GAAUjsB,EAAQ,QAEbksB,GAAiBC,EAAiB,CAMjCF,GAAQ,OAAS,GAAII,KAE1B,IAAM1I,GAAaqE,GAAe4E,GAAW,CAAE,CAAE,EAEjDx2B,EAAM,aAAc8wB,EAAI,iBAAkBmF,GAAQtD,GAAkBpF,GAAW,MAAOA,GAAW,MAAO,CAEzG,CAEA,QAAUpuB,GAAI,EAAGA,GAAI,EAAGA,KAEvB,GAAKo3B,GAAgB,CAEfT,EAECE,GAEJh2B,EAAM,cAAe8wB,EAAI,4BAA8B3xB,GAAG,EAAG,EAAG,EAAGq3B,GAAWr3B,EAAE,EAAE,MAAOq3B,GAAWr3B,EAAE,EAAE,OAAQgzB,EAAUC,EAAQoE,GAAWr3B,EAAE,EAAE,IAAK,EAMvJa,EAAM,WAAY8wB,EAAI,4BAA8B3xB,GAAG,EAAGwzB,GAAkB6D,GAAWr3B,EAAE,EAAE,MAAOq3B,GAAWr3B,EAAE,EAAE,OAAQ,EAAGgzB,EAAUC,EAAQoE,GAAWr3B,EAAE,EAAE,IAAK,EAInK,QAAU+Q,GAAI,EAAGA,GAAI2lB,GAAQ,OAAQ3lB,KAAO,CAG3C,IAAMumB,GADSZ,GAAS3lB,EAAE,EACC,MAAO/Q,EAAE,EAAE,MAEjC22B,EAECE,GAEJh2B,EAAM,cAAe8wB,EAAI,4BAA8B3xB,GAAG+Q,GAAI,EAAG,EAAG,EAAGumB,GAAY,MAAOA,GAAY,OAAQtE,EAAUC,EAAQqE,GAAY,IAAK,EAMlJz2B,EAAM,WAAY8wB,EAAI,4BAA8B3xB,GAAG+Q,GAAI,EAAGyiB,GAAkB8D,GAAY,MAAOA,GAAY,OAAQ,EAAGtE,EAAUC,EAAQqE,GAAY,IAAK,CAI/J,CAED,KAAO,CAEDX,EAECE,GAEJh2B,EAAM,cAAe8wB,EAAI,4BAA8B3xB,GAAG,EAAG,EAAG,EAAGgzB,EAAUC,EAAQoE,GAAWr3B,EAAE,CAAE,EAMrGa,EAAM,WAAY8wB,EAAI,4BAA8B3xB,GAAG,EAAGwzB,GAAkBR,EAAUC,EAAQoE,GAAWr3B,EAAE,CAAE,EAI9G,QAAU+Q,GAAI,EAAGA,GAAI2lB,GAAQ,OAAQ3lB,KAAO,CAE3C,IAAM0lB,GAASC,GAAS3lB,EAAE,EAErB4lB,EAECE,GAEJh2B,EAAM,cAAe8wB,EAAI,4BAA8B3xB,GAAG+Q,GAAI,EAAG,EAAG,EAAGiiB,EAAUC,EAAQwD,GAAO,MAAOz2B,EAAE,CAAE,EAM5Ga,EAAM,WAAY8wB,EAAI,4BAA8B3xB,GAAG+Q,GAAI,EAAGyiB,GAAkBR,EAAUC,EAAQwD,GAAO,MAAOz2B,EAAE,CAAE,CAItH,CAED,CAIF,CAEK2yB,EAA6BloB,CAAQ,GAGzCmoB,EAAgBjB,EAAI,gBAAiB,EAItCyE,GAAiB,UAAYtC,GAAO,QAE/BrpB,EAAQ,UAAWA,EAAQ,SAAUA,CAAQ,CAEnD,CAEAopB,EAAkB,UAAYppB,EAAQ,OAEvC,CAKA,SAAS8sB,GAAyB7I,EAAa7jB,EAAcJ,GAAS+sB,GAAYC,GAAevD,GAAQ,CAExG,IAAMlB,GAAW5rB,EAAM,QAASqD,GAAQ,OAAQA,GAAQ,UAAW,EAC7DwoB,GAAS7rB,EAAM,QAASqD,GAAQ,IAAK,EACrC+oB,GAAmBV,EAAmBroB,GAAQ,eAAgBuoB,GAAUC,GAAQxoB,GAAQ,UAAW,EACnGwpB,GAAyBrrB,EAAW,IAAKiC,CAAa,EACtDgpB,GAAoBjrB,EAAW,IAAK6B,EAAQ,EAIlD,GAFAopB,GAAkB,eAAiBhpB,EAE9B,CAAEopB,GAAuB,sBAAwB,CAErD,IAAMpnB,GAAQ,KAAK,IAAK,EAAGhC,EAAa,OAASqpB,EAAM,EACjDpnB,EAAS,KAAK,IAAK,EAAGjC,EAAa,QAAUqpB,EAAM,EAEpDuD,KAAkB9F,EAAI,YAAc8F,KAAkB9F,EAAI,iBAE9D9wB,EAAM,WAAY42B,GAAevD,GAAOV,GAAkB3mB,GAAOC,EAAQjC,EAAa,MAAO,EAAGmoB,GAAUC,GAAQ,IAAK,EAIvHpyB,EAAM,WAAY42B,GAAevD,GAAOV,GAAkB3mB,GAAOC,EAAQ,EAAGkmB,GAAUC,GAAQ,IAAK,CAIrG,CAEApyB,EAAM,gBAAiB8wB,EAAI,YAAajD,CAAY,EAE/CgJ,GAAoB7sB,CAAa,EAErC+mB,EAAmB,mCAAoCD,EAAI,YAAa6F,GAAYC,GAAe5D,GAAkB,eAAgB,EAAG8D,GAAwB9sB,CAAa,CAAE,GAEpK4sB,KAAkB9F,EAAI,YAAgB8F,IAAiB9F,EAAI,6BAA+B8F,IAAiB9F,EAAI,8BAE1HA,EAAI,qBAAsBA,EAAI,YAAa6F,GAAYC,GAAe5D,GAAkB,eAAgBK,EAAM,EAI/GrzB,EAAM,gBAAiB8wB,EAAI,YAAa,IAAK,CAE9C,CAGA,SAASiG,GAA0BC,EAAchtB,EAAcitB,GAAiB,CAI/E,GAFAnG,EAAI,iBAAkBA,EAAI,aAAckG,CAAa,EAEhDhtB,EAAa,YAAc,CAG/B,IAAMktB,GAAeltB,EAAa,aAC5B0oB,GAAYwE,IAAgBA,GAAa,eAAiBA,GAAa,KAAO,KAC9EvE,GAAmBH,EAAwBxoB,EAAa,cAAe0oB,EAAU,EACjFyE,GAAmBntB,EAAa,cAAgB8mB,EAAI,yBAA2BA,EAAI,iBAGpF+F,GAAoB7sB,CAAa,EAErC+mB,EAAmB,kCAAmCD,EAAI,aAAcgG,GAAwB9sB,CAAa,EAAG2oB,GAAkB3oB,EAAa,MAAOA,EAAa,MAAO,EAE/JitB,GAEXnG,EAAI,+BAAgCA,EAAI,aAAcgG,GAAwB9sB,CAAa,EAAG2oB,GAAkB3oB,EAAa,MAAOA,EAAa,MAAO,EAIxJ8mB,EAAI,oBAAqBA,EAAI,aAAc6B,GAAkB3oB,EAAa,MAAOA,EAAa,MAAO,EAItG8mB,EAAI,wBAAyBA,EAAI,YAAaqG,GAAkBrG,EAAI,aAAckG,CAAa,CAEhG,KAAO,CAEN,IAAMjoB,GAAW/E,EAAa,SAE9B,QAAU7K,GAAI,EAAGA,GAAI4P,GAAS,OAAQ5P,KAAO,CAE5C,IAAMyK,GAAUmF,GAAU5P,EAAE,EAEtBgzB,GAAW5rB,EAAM,QAASqD,GAAQ,OAAQA,GAAQ,UAAW,EAC7DwoB,GAAS7rB,EAAM,QAASqD,GAAQ,IAAK,EACrC+oB,GAAmBV,EAAmBroB,GAAQ,eAAgBuoB,GAAUC,GAAQxoB,GAAQ,UAAW,EAEpGitB,GAAoB7sB,CAAa,EAErC+mB,EAAmB,kCAAmCD,EAAI,aAAcgG,GAAwB9sB,CAAa,EAAG2oB,GAAkB3oB,EAAa,MAAOA,EAAa,MAAO,EAE/JitB,GAEXnG,EAAI,+BAAgCA,EAAI,aAAcgG,GAAwB9sB,CAAa,EAAG2oB,GAAkB3oB,EAAa,MAAOA,EAAa,MAAO,EAIxJ8mB,EAAI,oBAAqBA,EAAI,aAAc6B,GAAkB3oB,EAAa,MAAOA,EAAa,MAAO,CAIvG,CAED,CAEA8mB,EAAI,iBAAkBA,EAAI,aAAc,IAAK,CAE9C,CAGA,SAASsG,GAAmBvJ,EAAa7jB,EAAcqtB,GAAW,CAEjE,IAAMC,GAAWttB,EAAa,0BAA4B,GAI1D,GAFAhK,EAAM,gBAAiB8wB,EAAI,YAAajD,CAAY,EAE/C,EAAI7jB,EAAa,cAAgBA,EAAa,aAAa,gBAE/D,MAAM,IAAI,MAAO,qEAAsE,EAIxF,IAAMgpB,GAAoBjrB,EAAW,IAAKiC,EAAa,YAAa,EAcpE,GAbAgpB,GAAkB,eAAiBhpB,GAG9B,CAAEgpB,GAAkB,gBACvBhpB,EAAa,aAAa,MAAM,QAAUA,EAAa,OACvDA,EAAa,aAAa,MAAM,SAAWA,EAAa,UAEzDA,EAAa,aAAa,MAAM,MAAQA,EAAa,MACrDA,EAAa,aAAa,MAAM,OAASA,EAAa,OACtDA,EAAa,aAAa,YAAc,IAIpCstB,IAWJ,GARKtE,GAAkB,cAAgB,SAEtCA,GAAkB,YAAc,GAChChpB,EAAa,aAAa,iBAAkB,UAAWC,CAAiB,GAKpE+oB,GAAkB,iBAAmB,OAAY,CAErDA,GAAkB,eAAiBlC,EAAI,cAAc,EAErD9wB,EAAM,YAAa8wB,EAAI,iBAAkBkC,GAAkB,cAAe,EAC1EuB,GAAsBzD,EAAI,iBAAkB9mB,EAAa,YAAa,EAGtE,IAAMmoB,GAAW5rB,EAAM,QAASyD,EAAa,aAAa,MAAO,EAC3DooB,GAAS7rB,EAAM,QAASyD,EAAa,aAAa,IAAK,EAGzD2oB,GACC3oB,EAAa,aAAa,SAAWhiB,GAEzC2qC,GAAmB7B,EAAI,kBAEZ9mB,EAAa,aAAa,SAAW/hB,KAEhD0qC,GAAmB7B,EAAI,kBAIxB,QAAU3xB,EAAI,EAAGA,EAAI,EAAGA,IAEvB2xB,EAAI,WAAYA,EAAI,4BAA8B3xB,EAAG,EAAGwzB,GAAkB3oB,EAAa,MAAOA,EAAa,OAAQ,EAAGmoB,GAAUC,GAAQ,IAAK,CAI/I,OAIAwB,EAAc5pB,EAAa,aAAc,CAAE,EAI5C,IAAMutB,GAAoBvE,GAAkB,eACtCnrB,GAAUivB,GAAwB9sB,CAAa,EAE/CwtB,GAAgBF,GAASxG,EAAI,4BAA8BuG,GAAWvG,EAAI,WAC1EqG,GAAmBntB,EAAa,aAAa,SAAW/hB,GAAqB6oC,EAAI,yBAA2BA,EAAI,iBAEtH,GAAK9mB,EAAa,aAAa,SAAWhiB,GAEpC6uC,GAAoB7sB,CAAa,EAErC+mB,EAAmB,mCAAoCD,EAAI,YAAaqG,GAAkBK,GAAeD,GAAmB,EAAG1vB,EAAQ,EAIvIipB,EAAI,qBAAsBA,EAAI,YAAaqG,GAAkBK,GAAeD,GAAmB,CAAE,UAIvFvtB,EAAa,aAAa,SAAW/hB,GAE3C4uC,GAAoB7sB,CAAa,EAErC+mB,EAAmB,mCAAoCD,EAAI,YAAaqG,GAAkBK,GAAeD,GAAmB,EAAG1vB,EAAQ,EAIvIipB,EAAI,qBAAsBA,EAAI,YAAaqG,GAAkBK,GAAeD,GAAmB,CAAE,MAMlG,OAAM,IAAI,MAAO,6BAA8B,CAIjD,CAGA,SAASE,GAAwBztB,EAAe,CAE/C,IAAMopB,EAAyBrrB,EAAW,IAAKiC,CAAa,EACtDstB,GAAWttB,EAAa,0BAA4B,GAG1D,GAAKopB,EAAuB,sBAAwBppB,EAAa,aAAe,CAG/E,IAAMktB,GAAeltB,EAAa,aAQlC,GAPKopB,EAAuB,wBAE3BA,EAAuB,uBAAuB,EAK1C8D,GAAe,CAEnB,IAAMQ,GAAe,IAAM,CAE1B,OAAOtE,EAAuB,oBAC9B,OAAOA,EAAuB,uBAC9B8D,GAAa,oBAAqB,UAAWQ,EAAa,CAE3D,EAEAR,GAAa,iBAAkB,UAAWQ,EAAa,EACvDtE,EAAuB,uBAAyBsE,EAEjD,CAEAtE,EAAuB,oBAAsB8D,EAE9C,CAEA,GAAKltB,EAAa,cAAgB,CAAEopB,EAAuB,0BAE1D,GAAKkE,GAGJ,QAAUn4B,GAAI,EAAGA,GAAI,EAAGA,KAEvBi4B,GAAmBhE,EAAuB,mBAAoBj0B,EAAE,EAAG6K,EAAc7K,EAAE,MAI9E,CAEN,IAAM02B,GAAU7rB,EAAa,QAAQ,QAEhC6rB,IAAWA,GAAQ,OAAS,EAEhCuB,GAAmBhE,EAAuB,mBAAoB,CAAE,EAAGppB,EAAc,CAAE,EAInFotB,GAAmBhE,EAAuB,mBAAoBppB,EAAc,CAAE,CAIhF,SAIKstB,GAAS,CAEblE,EAAuB,mBAAqB,CAAC,EAE7C,QAAUj0B,GAAI,EAAGA,GAAI,EAAGA,KAIvB,GAFAa,EAAM,gBAAiB8wB,EAAI,YAAasC,EAAuB,mBAAoBj0B,EAAE,CAAE,EAElFi0B,EAAuB,mBAAoBj0B,EAAE,IAAM,OAEvDi0B,EAAuB,mBAAoBj0B,EAAE,EAAI2xB,EAAI,mBAAmB,EACxEiG,GAA0B3D,EAAuB,mBAAoBj0B,EAAE,EAAG6K,EAAc,EAAM,MAExF,CAGN,IAAMmtB,GAAmBntB,EAAa,cAAgB8mB,EAAI,yBAA2BA,EAAI,iBACnFkG,GAAe5D,EAAuB,mBAAoBj0B,EAAE,EAClE2xB,EAAI,iBAAkBA,EAAI,aAAckG,EAAa,EACrDlG,EAAI,wBAAyBA,EAAI,YAAaqG,GAAkBrG,EAAI,aAAckG,EAAa,CAEhG,CAIF,KAAO,CAEN,IAAMnB,GAAU7rB,EAAa,QAAQ,QAYrC,GAVK6rB,IAAWA,GAAQ,OAAS,EAEhC71B,EAAM,gBAAiB8wB,EAAI,YAAasC,EAAuB,mBAAoB,CAAE,CAAE,EAIvFpzB,EAAM,gBAAiB8wB,EAAI,YAAasC,EAAuB,kBAAmB,EAI9EA,EAAuB,qBAAuB,OAElDA,EAAuB,mBAAqBtC,EAAI,mBAAmB,EACnEiG,GAA0B3D,EAAuB,mBAAoBppB,EAAc,EAAM,MAEnF,CAGN,IAAMmtB,GAAmBntB,EAAa,cAAgB8mB,EAAI,yBAA2BA,EAAI,iBACnFkG,GAAe5D,EAAuB,mBAC5CtC,EAAI,iBAAkBA,EAAI,aAAckG,EAAa,EACrDlG,EAAI,wBAAyBA,EAAI,YAAaqG,GAAkBrG,EAAI,aAAckG,EAAa,CAEhG,CAED,CAIDh3B,EAAM,gBAAiB8wB,EAAI,YAAa,IAAK,CAE9C,CAGA,SAAS6G,GAAgB3tB,EAAc4tB,EAAcV,GAAe,CAEnE,IAAM9D,GAAyBrrB,EAAW,IAAKiC,CAAa,EAEvD4tB,IAAiB,QAErBlB,GAAyBtD,GAAuB,mBAAoBppB,EAAcA,EAAa,QAAS8mB,EAAI,kBAAmBA,EAAI,WAAY,CAAE,EAI7IoG,KAAiB,QAErBO,GAAwBztB,CAAa,CAIvC,CAGA,SAAS6tB,GAAmB7tB,EAAe,CAE1C,IAAMJ,EAAUI,EAAa,QAEvBopB,GAAyBrrB,EAAW,IAAKiC,CAAa,EACtDgpB,GAAoBjrB,EAAW,IAAK6B,CAAQ,EAElDI,EAAa,iBAAkB,UAAW8oB,CAAsB,EAEhE,IAAM/jB,GAAW/E,EAAa,SAExBstB,GAAWttB,EAAa,0BAA4B,GACpD8tB,GAA4B/oB,GAAS,OAAS,EAiBpD,GAfO+oB,KAED9E,GAAkB,iBAAmB,SAEzCA,GAAkB,eAAiBlC,EAAI,cAAc,GAItDkC,GAAkB,UAAYppB,EAAQ,QACtCrE,EAAK,OAAO,YAMR+xB,GAAS,CAEblE,GAAuB,mBAAqB,CAAC,EAE7C,QAAUj0B,GAAI,EAAGA,GAAI,EAAGA,KAEvB,GAAKyK,EAAQ,SAAWA,EAAQ,QAAQ,OAAS,EAAI,CAEpDwpB,GAAuB,mBAAoBj0B,EAAE,EAAI,CAAC,EAElD,QAAUk0B,GAAQ,EAAGA,GAAQzpB,EAAQ,QAAQ,OAAQypB,KAEpDD,GAAuB,mBAAoBj0B,EAAE,EAAGk0B,EAAM,EAAIvC,EAAI,kBAAkB,CAIlF,MAECsC,GAAuB,mBAAoBj0B,EAAE,EAAI2xB,EAAI,kBAAkB,CAM1E,KAAO,CAEN,GAAKlnB,EAAQ,SAAWA,EAAQ,QAAQ,OAAS,EAAI,CAEpDwpB,GAAuB,mBAAqB,CAAC,EAE7C,QAAUC,GAAQ,EAAGA,GAAQzpB,EAAQ,QAAQ,OAAQypB,KAEpDD,GAAuB,mBAAoBC,EAAM,EAAIvC,EAAI,kBAAkB,CAI7E,MAECsC,GAAuB,mBAAqBtC,EAAI,kBAAkB,EAInE,GAAKgH,GAEJ,QAAU34B,GAAI,EAAG+E,GAAK6K,GAAS,OAAQ5P,GAAI+E,GAAI/E,KAAO,CAErD,IAAMm0B,GAAuBvrB,EAAW,IAAKgH,GAAU5P,EAAE,CAAE,EAEtDm0B,GAAqB,iBAAmB,SAE5CA,GAAqB,eAAiBxC,EAAI,cAAc,EAExDvrB,EAAK,OAAO,WAId,CAID,GAAOyE,EAAa,QAAU,GAAO6sB,GAAoB7sB,CAAa,IAAM,GAAQ,CAEnFopB,GAAuB,+BAAiCtC,EAAI,kBAAkB,EAC9EsC,GAAuB,yBAA2B,CAAC,EAEnDpzB,EAAM,gBAAiB8wB,EAAI,YAAasC,GAAuB,8BAA+B,EAE9F,QAAUj0B,GAAI,EAAGA,GAAI4P,GAAS,OAAQ5P,KAAO,CAE5C,IAAMyK,GAAUmF,GAAU5P,EAAE,EAC5Bi0B,GAAuB,yBAA0Bj0B,EAAE,EAAI2xB,EAAI,mBAAmB,EAE9EA,EAAI,iBAAkBA,EAAI,aAAcsC,GAAuB,yBAA0Bj0B,EAAE,CAAE,EAE7F,IAAMgzB,GAAW5rB,EAAM,QAASqD,GAAQ,OAAQA,GAAQ,UAAW,EAC7DwoB,GAAS7rB,EAAM,QAASqD,GAAQ,IAAK,EACrC+oB,GAAmBV,EAAmBroB,GAAQ,eAAgBuoB,GAAUC,GAAQxoB,GAAQ,WAAYI,EAAa,mBAAqB,EAAK,EAC3InC,EAAUivB,GAAwB9sB,CAAa,EACrD8mB,EAAI,+BAAgCA,EAAI,aAAcjpB,EAAS8qB,GAAkB3oB,EAAa,MAAOA,EAAa,MAAO,EAEzH8mB,EAAI,wBAAyBA,EAAI,YAAaA,EAAI,kBAAoB3xB,GAAG2xB,EAAI,aAAcsC,GAAuB,yBAA0Bj0B,EAAE,CAAE,CAEjJ,CAEA2xB,EAAI,iBAAkBA,EAAI,aAAc,IAAK,EAExC9mB,EAAa,cAEjBopB,GAAuB,yBAA2BtC,EAAI,mBAAmB,EACzEiG,GAA0B3D,GAAuB,yBAA0BppB,EAAc,EAAK,GAI/FhK,EAAM,gBAAiB8wB,EAAI,YAAa,IAAK,CAE9C,CAED,CAIA,GAAKwG,GAAS,CAEbt3B,EAAM,YAAa8wB,EAAI,iBAAkBkC,GAAkB,cAAe,EAC1EuB,GAAsBzD,EAAI,iBAAkBlnB,CAAQ,EAEpD,QAAUzK,GAAI,EAAGA,GAAI,EAAGA,KAEvB,GAAKyK,EAAQ,SAAWA,EAAQ,QAAQ,OAAS,EAEhD,QAAUypB,GAAQ,EAAGA,GAAQzpB,EAAQ,QAAQ,OAAQypB,KAEpDqD,GAAyBtD,GAAuB,mBAAoBj0B,EAAE,EAAGk0B,EAAM,EAAGrpB,EAAcJ,EAASknB,EAAI,kBAAmBA,EAAI,4BAA8B3xB,GAAGk0B,EAAM,OAM5KqD,GAAyBtD,GAAuB,mBAAoBj0B,EAAE,EAAG6K,EAAcJ,EAASknB,EAAI,kBAAmBA,EAAI,4BAA8B3xB,GAAG,CAAE,EAM3J2yB,EAA6BloB,CAAQ,GAEzCmoB,EAAgBjB,EAAI,gBAAiB,EAItC9wB,EAAM,cAAc,CAErB,SAAY83B,GAA0B,CAErC,QAAU34B,GAAI,EAAG+E,GAAK6K,GAAS,OAAQ5P,GAAI+E,GAAI/E,KAAO,CAErD,IAAMw3B,GAAa5nB,GAAU5P,EAAE,EACzBm0B,GAAuBvrB,EAAW,IAAK4uB,EAAW,EAEpDa,GAAgB1G,EAAI,YAEnB9mB,EAAa,uBAAyBA,EAAa,4BAEvDwtB,GAAgBxtB,EAAa,sBAAwB8mB,EAAI,WAAaA,EAAI,kBAI3E9wB,EAAM,YAAaw3B,GAAelE,GAAqB,cAAe,EACtEiB,GAAsBiD,GAAeb,EAAW,EAChDD,GAAyBtD,GAAuB,mBAAoBppB,EAAc2sB,GAAY7F,EAAI,kBAAoB3xB,GAAGq4B,GAAe,CAAE,EAErI1F,EAA6B6E,EAAW,GAE5C5E,EAAgByF,EAAc,CAIhC,CAEAx3B,EAAM,cAAc,CAErB,KAAO,CAEN,IAAIw3B,GAAgB1G,EAAI,WAWxB,IATK9mB,EAAa,uBAAyBA,EAAa,4BAEvDwtB,GAAgBxtB,EAAa,sBAAwB8mB,EAAI,WAAaA,EAAI,kBAI3E9wB,EAAM,YAAaw3B,GAAexE,GAAkB,cAAe,EACnEuB,GAAsBiD,GAAe5tB,CAAQ,EAExCA,EAAQ,SAAWA,EAAQ,QAAQ,OAAS,EAEhD,QAAUypB,GAAQ,EAAGA,GAAQzpB,EAAQ,QAAQ,OAAQypB,KAEpDqD,GAAyBtD,GAAuB,mBAAoBC,EAAM,EAAGrpB,EAAcJ,EAASknB,EAAI,kBAAmB0G,GAAenE,EAAM,OAMjJqD,GAAyBtD,GAAuB,mBAAoBppB,EAAcJ,EAASknB,EAAI,kBAAmB0G,GAAe,CAAE,EAI/H1F,EAA6BloB,CAAQ,GAEzCmoB,EAAgByF,EAAc,EAI/Bx3B,EAAM,cAAc,CAErB,CAIKgK,EAAa,aAEjBytB,GAAwBztB,CAAa,CAIvC,CAEA,SAAS+tB,GAA0B/tB,EAAe,CAEjD,IAAM+E,EAAW/E,EAAa,SAE9B,QAAU7K,GAAI,EAAG+E,GAAK6K,EAAS,OAAQ5P,GAAI+E,GAAI/E,KAAO,CAErD,IAAMyK,GAAUmF,EAAU5P,EAAE,EAE5B,GAAK2yB,EAA6BloB,EAAQ,EAAI,CAE7C,IAAMouB,GAAahG,EAAehoB,CAAa,EACzC0lB,GAAe3nB,EAAW,IAAK6B,EAAQ,EAAE,eAE/C5J,EAAM,YAAag4B,GAAYtI,EAAa,EAC5CqC,EAAgBiG,EAAW,EAC3Bh4B,EAAM,cAAc,CAErB,CAED,CAED,CAEA,IAAMi4B,GAAwB,CAAC,EACzBC,GAAwB,CAAC,EAE/B,SAASC,GAA+BnuB,EAAe,CAEtD,GAAKA,EAAa,QAAU,GAE3B,GAAK6sB,GAAoB7sB,CAAa,IAAM,GAAQ,CAEnD,IAAM+E,EAAW/E,EAAa,SACxBgC,GAAQhC,EAAa,MACrBiC,GAASjC,EAAa,OACxBouB,GAAOtH,EAAI,iBACTuH,GAAaruB,EAAa,cAAgB8mB,EAAI,yBAA2BA,EAAI,iBAC7EsC,GAAyBrrB,EAAW,IAAKiC,CAAa,EACtD8tB,GAA4B/oB,EAAS,OAAS,EAGpD,GAAK+oB,GAEJ,QAAU34B,GAAI,EAAGA,GAAI4P,EAAS,OAAQ5P,KAErCa,EAAM,gBAAiB8wB,EAAI,YAAasC,GAAuB,8BAA+B,EAC9FtC,EAAI,wBAAyBA,EAAI,YAAaA,EAAI,kBAAoB3xB,GAAG2xB,EAAI,aAAc,IAAK,EAEhG9wB,EAAM,gBAAiB8wB,EAAI,YAAasC,GAAuB,kBAAmB,EAClFtC,EAAI,qBAAsBA,EAAI,iBAAkBA,EAAI,kBAAoB3xB,GAAG2xB,EAAI,WAAY,KAAM,CAAE,EAMrG9wB,EAAM,gBAAiB8wB,EAAI,iBAAkBsC,GAAuB,8BAA+B,EAEnG,IAAMyC,GAAU7rB,EAAa,QAAQ,QAEhC6rB,IAAWA,GAAQ,OAAS,EAEhC71B,EAAM,gBAAiB8wB,EAAI,iBAAkBsC,GAAuB,mBAAoB,CAAE,CAAE,EAI5FpzB,EAAM,gBAAiB8wB,EAAI,iBAAkBsC,GAAuB,kBAAmB,EAIxF,QAAUj0B,GAAI,EAAGA,GAAI4P,EAAS,OAAQ5P,KAAO,CAY5C,GAVK6K,EAAa,qBAEZA,EAAa,cAAcouB,IAAQtH,EAAI,kBAIvC9mB,EAAa,eAAiBA,EAAa,uBAAuBouB,IAAQtH,EAAI,qBAI/EgH,GAA0B,CAE9BhH,EAAI,wBAAyBA,EAAI,iBAAkBA,EAAI,kBAAmBA,EAAI,aAAcsC,GAAuB,yBAA0Bj0B,EAAE,CAAE,EAEjJ,IAAMuwB,GAAe3nB,EAAW,IAAKgH,EAAU5P,EAAE,CAAE,EAAE,eACrD2xB,EAAI,qBAAsBA,EAAI,iBAAkBA,EAAI,kBAAmBA,EAAI,WAAYpB,GAAc,CAAE,CAExG,CAEAoB,EAAI,gBAAiB,EAAG,EAAG9kB,GAAOC,GAAQ,EAAG,EAAGD,GAAOC,GAAQmsB,GAAMtH,EAAI,OAAQ,EAE5EE,IAAkC,KAEtCiH,GAAsB,OAAS,EAC/BC,GAAsB,OAAS,EAE/BD,GAAsB,KAAMnH,EAAI,kBAAoB3xB,EAAE,EAEjD6K,EAAa,aAAeA,EAAa,qBAAuB,KAEpEiuB,GAAsB,KAAMI,EAAW,EACvCH,GAAsB,KAAMG,EAAW,EAEvCvH,EAAI,sBAAuBA,EAAI,iBAAkBoH,EAAsB,GAIxEpH,EAAI,sBAAuBA,EAAI,iBAAkBmH,EAAsB,EAIzE,CAMA,GAJAj4B,EAAM,gBAAiB8wB,EAAI,iBAAkB,IAAK,EAClD9wB,EAAM,gBAAiB8wB,EAAI,iBAAkB,IAAK,EAG7CgH,GAEJ,QAAU34B,GAAI,EAAGA,GAAI4P,EAAS,OAAQ5P,KAAO,CAE5Ca,EAAM,gBAAiB8wB,EAAI,YAAasC,GAAuB,8BAA+B,EAC9FtC,EAAI,wBAAyBA,EAAI,YAAaA,EAAI,kBAAoB3xB,GAAG2xB,EAAI,aAAcsC,GAAuB,yBAA0Bj0B,EAAE,CAAE,EAEhJ,IAAMuwB,GAAe3nB,EAAW,IAAKgH,EAAU5P,EAAE,CAAE,EAAE,eAErDa,EAAM,gBAAiB8wB,EAAI,YAAasC,GAAuB,kBAAmB,EAClFtC,EAAI,qBAAsBA,EAAI,iBAAkBA,EAAI,kBAAoB3xB,GAAG2xB,EAAI,WAAYpB,GAAc,CAAE,CAE5G,CAID1vB,EAAM,gBAAiB8wB,EAAI,iBAAkBsC,GAAuB,8BAA+B,CAEpG,SAEMppB,EAAa,aAAeA,EAAa,qBAAuB,IAASgnB,EAAgC,CAE7G,IAAMqH,EAAaruB,EAAa,cAAgB8mB,EAAI,yBAA2BA,EAAI,iBAEnFA,EAAI,sBAAuBA,EAAI,iBAAkB,CAAEuH,CAAW,CAAE,CAEjE,EAMH,CAEA,SAASvB,GAAwB9sB,EAAe,CAE/C,OAAO,KAAK,IAAK8E,EAAa,WAAY9E,EAAa,OAAQ,CAEhE,CAEA,SAAS6sB,GAAoB7sB,EAAe,CAE3C,IAAMopB,EAAyBrrB,EAAW,IAAKiC,CAAa,EAE5D,OAAOA,EAAa,QAAU,GAAK1E,EAAW,IAAK,sCAAuC,IAAM,IAAQ8tB,EAAuB,uBAAyB,EAEzJ,CAEA,SAASU,GAAoBlqB,EAAU,CAEtC,IAAM5L,EAAQuH,EAAK,OAAO,MAIrB2rB,EAAe,IAAKtnB,CAAQ,IAAM5L,IAEtCkzB,EAAe,IAAKtnB,EAAS5L,CAAM,EACnC4L,EAAQ,OAAO,EAIjB,CAEA,SAAS+rB,GAAkB/rB,EAASG,EAAQ,CAE3C,IAAM8N,GAAajO,EAAQ,WACrB0uB,GAAS1uB,EAAQ,OACjB/K,GAAO+K,EAAQ,KAErB,OAAKA,EAAQ,sBAAwB,IAAQA,EAAQ,iBAAmB,IAEnEiO,KAAe1pB,IAAwB0pB,KAAe/mB,KAIrDnL,GAAgB,YAAakyB,EAAW,IAAMtgB,IAI7C+gC,KAAWrkC,IAAc4K,KAASzD,KAEtCmC,GAAM,mFAAoF,EAM3FJ,GAAO,kDAAmD0a,EAAW,GAMhE9N,CAER,CAEA,SAAS6nB,GAAe7nB,EAAQ,CAE/B,OAAK,OAAO,iBAAqB,KAAeA,aAAiB,kBAIhEknB,EAAiB,MAAQlnB,EAAM,cAAgBA,EAAM,MACrDknB,EAAiB,OAASlnB,EAAM,eAAiBA,EAAM,QAE5C,OAAO,WAAe,KAAeA,aAAiB,YAEjEknB,EAAiB,MAAQlnB,EAAM,aAC/BknB,EAAiB,OAASlnB,EAAM,gBAIhCknB,EAAiB,MAAQlnB,EAAM,MAC/BknB,EAAiB,OAASlnB,EAAM,QAI1BknB,CAER,CAIA,KAAK,oBAAsBwC,EAC3B,KAAK,kBAAoBD,EAEzB,KAAK,aAAeI,EACpB,KAAK,kBAAoBI,EACzB,KAAK,aAAeC,EACpB,KAAK,eAAiBC,EACtB,KAAK,eAAiByD,GACtB,KAAK,kBAAoBE,GACzB,KAAK,yBAA2BE,GAChC,KAAK,8BAAgCI,GACrC,KAAK,uBAAyBV,GAC9B,KAAK,wBAA0Bf,GAC/B,KAAK,mBAAqBG,GAE1B,KAAK,sBAAwB,UAAY,CAExC,OAAO72B,EAAM,QAAQ,MAAM,YAAY,CAExC,CAED,CAEA,SAASvD,GAAY2B,EAAIkH,EAAa,CAErC,SAASizB,EAASC,EAAG3gB,EAAa/mB,GAAe,CAEhD,IAAIsV,EAEEmsB,EAAW5sC,GAAgB,YAAakyB,CAAW,EAEzD,GAAK2gB,IAAMp9B,GAAmB,OAAOgD,EAAG,cACxC,GAAKo6B,IAAM/8B,GAAwB,OAAO2C,EAAG,uBAC7C,GAAKo6B,IAAM98B,GAAwB,OAAO0C,EAAG,uBAC7C,GAAKo6B,IAAMj9B,GAAsB,OAAO6C,EAAG,yBAC3C,GAAKo6B,IAAMn9B,GAAwB,OAAO+C,EAAG,6BAE7C,GAAKo6B,IAAM1zC,GAAW,OAAOsZ,EAAG,KAChC,GAAKo6B,IAAMvgC,GAAY,OAAOmG,EAAG,MACjC,GAAKo6B,IAAM78B,GAAoB,OAAOyC,EAAG,eACzC,GAAKo6B,IAAM1sC,GAAU,OAAOsS,EAAG,IAC/B,GAAKo6B,IAAMh9B,GAAkB,OAAO4C,EAAG,aACvC,GAAKo6B,IAAM5uC,GAAY,OAAOwU,EAAG,MACjC,GAAKo6B,IAAM1tC,GAAgB,OAAOsT,EAAG,WAErC,GAAKo6B,IAAM71C,GAAc,OAAOyb,EAAG,MACnC,GAAKo6B,IAAM/iC,GAAY,OAAO2I,EAAG,IACjC,GAAKo6B,IAAMvkC,GAAa,OAAOmK,EAAG,KAClC,GAAKo6B,IAAMxwC,GAAc,OAAOoW,EAAG,gBACnC,GAAKo6B,IAAMvwC,GAAqB,OAAOmW,EAAG,cAI1C,GAAKo6B,IAAM/hC,GAAY,OAAO2H,EAAG,IACjC,GAAKo6B,IAAM9hC,GAAmB,OAAO0H,EAAG,YACxC,GAAKo6B,IAAMriC,GAAW,OAAOiI,EAAG,GAChC,GAAKo6B,IAAMpiC,GAAkB,OAAOgI,EAAG,WACvC,GAAKo6B,IAAMtkC,GAAoB,OAAOkK,EAAG,aAIzC,GAAKo6B,IAAMviC,IAAwBuiC,IAAMnjC,IAAyBmjC,IAAMljC,IAAyBkjC,IAAMjjC,GAEtG,GAAKg9B,IAAah7B,GAIjB,GAFA6O,EAAYd,EAAW,IAAK,oCAAqC,EAE5Dc,IAAc,KAAO,CAEzB,GAAKoyB,IAAMviC,GAAuB,OAAOmQ,EAAU,8BACnD,GAAKoyB,IAAMnjC,GAAwB,OAAO+Q,EAAU,oCACpD,GAAKoyB,IAAMljC,GAAwB,OAAO8Q,EAAU,oCACpD,GAAKoyB,IAAMjjC,GAAwB,OAAO6Q,EAAU,mCAErD,KAEC,QAAO,aAMRA,EAAYd,EAAW,IAAK,+BAAgC,EAEvDc,IAAc,KAAO,CAEzB,GAAKoyB,IAAMviC,GAAuB,OAAOmQ,EAAU,6BACnD,GAAKoyB,IAAMnjC,GAAwB,OAAO+Q,EAAU,8BACpD,GAAKoyB,IAAMljC,GAAwB,OAAO8Q,EAAU,8BACpD,GAAKoyB,IAAMjjC,GAAwB,OAAO6Q,EAAU,6BAErD,KAEC,QAAO,KAUV,GAAKoyB,IAAMxiC,IAA2BwiC,IAAMziC,IAA2ByiC,IAAMpjC,IAA4BojC,IAAMrjC,GAI9G,GAFAiR,EAAYd,EAAW,IAAK,gCAAiC,EAExDc,IAAc,KAAO,CAEzB,GAAKoyB,IAAMxiC,GAA0B,OAAOoQ,EAAU,gCACtD,GAAKoyB,IAAMziC,GAA0B,OAAOqQ,EAAU,gCACtD,GAAKoyB,IAAMpjC,GAA2B,OAAOgR,EAAU,iCACvD,GAAKoyB,IAAMrjC,GAA2B,OAAOiR,EAAU,gCAExD,KAEC,QAAO,KAQT,GAAKoyB,IAAM3iC,IAAmB2iC,IAAM1iC,IAAmB0iC,IAAMtjC,IAAwBsjC,IAAM7kC,IAAkB6kC,IAAMthC,IAAyBshC,IAAMzkC,IAAmBykC,IAAMnhC,GAI1K,GAFA+O,EAAYd,EAAW,IAAK,8BAA+B,EAEtDc,IAAc,KAAO,CAEzB,GAAKoyB,IAAM3iC,IAAmB2iC,IAAM1iC,GAAkB,OAASy8B,IAAah7B,GAAiB6O,EAAU,sBAAwBA,EAAU,qBACzI,GAAKoyB,IAAMtjC,GAAuB,OAASq9B,IAAah7B,GAAiB6O,EAAU,iCAAmCA,EAAU,0BAChI,GAAKoyB,IAAM7kC,GAAiB,OAAOyS,EAAU,mBAC7C,GAAKoyB,IAAMthC,GAAwB,OAAOkP,EAAU,0BACpD,GAAKoyB,IAAMzkC,GAAkB,OAAOqS,EAAU,oBAC9C,GAAKoyB,IAAMnhC,GAAyB,OAAO+O,EAAU,0BAEtD,KAEC,QAAO,KAQT,GAAKoyB,IAAM/jC,IAAwB+jC,IAAM9jC,IAAwB8jC,IAAM7jC,IACtE6jC,IAAM5jC,IAAwB4jC,IAAM3jC,IAAwB2jC,IAAM1jC,IAClE0jC,IAAMzjC,IAAwByjC,IAAMxjC,IAAwBwjC,IAAMpkC,IAClEokC,IAAMnkC,IAAyBmkC,IAAMlkC,IAAyBkkC,IAAMrkC,IACpEqkC,IAAMjkC,IAA0BikC,IAAMhkC,GAItC,GAFA4R,EAAYd,EAAW,IAAK,+BAAgC,EAEvDc,IAAc,KAAO,CAEzB,GAAKoyB,IAAM/jC,GAAuB,OAAS89B,IAAah7B,GAAiB6O,EAAU,qCAAuCA,EAAU,6BACpI,GAAKoyB,IAAM9jC,GAAuB,OAAS69B,IAAah7B,GAAiB6O,EAAU,qCAAuCA,EAAU,6BACpI,GAAKoyB,IAAM7jC,GAAuB,OAAS49B,IAAah7B,GAAiB6O,EAAU,qCAAuCA,EAAU,6BACpI,GAAKoyB,IAAM5jC,GAAuB,OAAS29B,IAAah7B,GAAiB6O,EAAU,qCAAuCA,EAAU,6BACpI,GAAKoyB,IAAM3jC,GAAuB,OAAS09B,IAAah7B,GAAiB6O,EAAU,qCAAuCA,EAAU,6BACpI,GAAKoyB,IAAM1jC,GAAuB,OAASy9B,IAAah7B,GAAiB6O,EAAU,qCAAuCA,EAAU,6BACpI,GAAKoyB,IAAMzjC,GAAuB,OAASw9B,IAAah7B,GAAiB6O,EAAU,qCAAuCA,EAAU,6BACpI,GAAKoyB,IAAMxjC,GAAuB,OAASu9B,IAAah7B,GAAiB6O,EAAU,qCAAuCA,EAAU,6BACpI,GAAKoyB,IAAMpkC,GAAwB,OAASm+B,IAAah7B,GAAiB6O,EAAU,sCAAwCA,EAAU,8BACtI,GAAKoyB,IAAMnkC,GAAwB,OAASk+B,IAAah7B,GAAiB6O,EAAU,sCAAwCA,EAAU,8BACtI,GAAKoyB,IAAMlkC,GAAwB,OAASi+B,IAAah7B,GAAiB6O,EAAU,sCAAwCA,EAAU,8BACtI,GAAKoyB,IAAMrkC,GAAyB,OAASo+B,IAAah7B,GAAiB6O,EAAU,uCAAyCA,EAAU,+BACxI,GAAKoyB,IAAMjkC,GAAyB,OAASg+B,IAAah7B,GAAiB6O,EAAU,uCAAyCA,EAAU,+BACxI,GAAKoyB,IAAMhkC,GAAyB,OAAS+9B,IAAah7B,GAAiB6O,EAAU,uCAAyCA,EAAU,8BAEzI,KAEC,QAAO,KAQT,GAAKoyB,IAAMvjC,IAAoBujC,IAAM7iC,IAA0B6iC,IAAM5iC,GAIpE,GAFAwQ,EAAYd,EAAW,IAAK,8BAA+B,EAEtDc,IAAc,KAAO,CAEzB,GAAKoyB,IAAMvjC,GAAmB,OAASs9B,IAAah7B,GAAiB6O,EAAU,qCAAuCA,EAAU,+BAChI,GAAKoyB,IAAM7iC,GAAyB,OAAOyQ,EAAU,qCACrD,GAAKoyB,IAAM5iC,GAA2B,OAAOwQ,EAAU,sCAExD,KAEC,QAAO,KAQT,GAAKoyB,IAAM3kC,IAAoB2kC,IAAMphC,IAA2BohC,IAAM5kC,IAA0B4kC,IAAMrhC,GAIrG,GAFAiP,EAAYd,EAAW,IAAK,8BAA+B,EAEtDc,IAAc,KAAO,CAEzB,GAAKoyB,IAAM3kC,GAAmB,OAAOuS,EAAU,yBAC/C,GAAKoyB,IAAMphC,GAA0B,OAAOgP,EAAU,gCACtD,GAAKoyB,IAAM5kC,GAAyB,OAAOwS,EAAU,+BACrD,GAAKoyB,IAAMrhC,GAAgC,OAAOiP,EAAU,qCAE7D,KAEC,QAAO,KAQT,OAAKoyB,IAAMl9B,GAA4B8C,EAAG,kBAIjCA,EAAIo6B,CAAE,IAAM,OAAcp6B,EAAIo6B,CAAE,EAAI,IAE9C,CAEA,MAAO,CAAE,QAASD,CAAQ,CAE3B,CAwtCA,SAASE,IAAgB54B,EAAUkI,EAAa,CAE/C,SAAS2wB,EAAyBlX,EAAKjZ,EAAU,CAE3CiZ,EAAI,mBAAqB,IAE7BA,EAAI,aAAa,EAIlBjZ,EAAQ,MAAM,KAAMiZ,EAAI,MAAO,CAEhC,CAEA,SAASmX,EAAoBzX,EAAUlD,EAAM,CAE5CA,EAAI,MAAM,OAAQkD,EAAS,SAAS,MAAOxf,GAA2B7B,CAAS,CAAE,EAE5Eme,EAAI,OAERkD,EAAS,QAAQ,MAAQlD,EAAI,KAC7BkD,EAAS,OAAO,MAAQlD,EAAI,KAEjBA,EAAI,YAEfkD,EAAS,WAAW,MAAQlD,EAAI,QAIlC,CAEA,SAAS4a,EAAyB1X,EAAU5e,EAAUu2B,EAAY5sB,EAAQ6sB,EAA2B,CAE/Fx2B,EAAS,qBAIFA,EAAS,sBAFpBy2B,EAAuB7X,EAAU5e,CAAS,EAM/BA,EAAS,oBAEpBy2B,EAAuB7X,EAAU5e,CAAS,EAC1C02B,EAAqB9X,EAAU5e,CAAS,GAE7BA,EAAS,qBAEpBy2B,EAAuB7X,EAAU5e,CAAS,EAC1C22B,EAAsB/X,EAAU5e,CAAS,GAE9BA,EAAS,wBAEpBy2B,EAAuB7X,EAAU5e,CAAS,EAC1C42B,EAAyBhY,EAAU5e,CAAS,EAEvCA,EAAS,wBAEb62B,EAAyBjY,EAAU5e,EAAUw2B,CAAyB,GAI5Dx2B,EAAS,sBAEpBy2B,EAAuB7X,EAAU5e,CAAS,EAC1C82B,EAAuBlY,EAAU5e,CAAS,GAE/BA,EAAS,oBAEpBy2B,EAAuB7X,EAAU5e,CAAS,EAE/BA,EAAS,wBAEpBy2B,EAAuB7X,EAAU5e,CAAS,EAC1C+2B,EAAyBnY,EAAU5e,CAAS,GAEjCA,EAAS,qBAEpBy2B,EAAuB7X,EAAU5e,CAAS,EAE/BA,EAAS,qBAEpBg3B,EAAqBpY,EAAU5e,CAAS,EAEnCA,EAAS,sBAEbi3B,EAAqBrY,EAAU5e,CAAS,GAI9BA,EAAS,iBAEpBk3B,EAAuBtY,EAAU5e,EAAUu2B,EAAY5sB,CAAO,EAEnD3J,EAAS,iBAEpBm3B,EAAwBvY,EAAU5e,CAAS,EAEhCA,EAAS,kBAEpB4e,EAAS,MAAM,MAAM,KAAM5e,EAAS,KAAM,EAC1C4e,EAAS,QAAQ,MAAQ5e,EAAS,SAEvBA,EAAS,mBAEpBA,EAAS,mBAAqB,GAIhC,CAEA,SAASy2B,EAAuB7X,EAAU5e,EAAW,CAEpD4e,EAAS,QAAQ,MAAQ5e,EAAS,QAE7BA,EAAS,OAEb4e,EAAS,QAAQ,MAAM,KAAM5e,EAAS,KAAM,EAIxCA,EAAS,UAEb4e,EAAS,SAAS,MAAM,KAAM5e,EAAS,QAAS,EAAE,eAAgBA,EAAS,iBAAkB,EAIzFA,EAAS,MAEb4e,EAAS,IAAI,MAAQ5e,EAAS,IAE9Bo2B,EAAyBp2B,EAAS,IAAK4e,EAAS,YAAa,GAIzD5e,EAAS,WAEb4e,EAAS,SAAS,MAAQ5e,EAAS,SAEnCo2B,EAAyBp2B,EAAS,SAAU4e,EAAS,iBAAkB,GAInE5e,EAAS,UAEb4e,EAAS,QAAQ,MAAQ5e,EAAS,QAElCo2B,EAAyBp2B,EAAS,QAAS4e,EAAS,gBAAiB,EAErEA,EAAS,UAAU,MAAQ5e,EAAS,UAE/BA,EAAS,OAASte,KAEtBk9B,EAAS,UAAU,OAAS,KAMzB5e,EAAS,YAEb4e,EAAS,UAAU,MAAQ5e,EAAS,UAEpCo2B,EAAyBp2B,EAAS,UAAW4e,EAAS,kBAAmB,EAEzEA,EAAS,YAAY,MAAM,KAAM5e,EAAS,WAAY,EAEjDA,EAAS,OAASte,IAEtBk9B,EAAS,YAAY,MAAM,OAAO,GAM/B5e,EAAS,kBAEb4e,EAAS,gBAAgB,MAAQ5e,EAAS,gBAE1Co2B,EAAyBp2B,EAAS,gBAAiB4e,EAAS,wBAAyB,EAErFA,EAAS,kBAAkB,MAAQ5e,EAAS,kBAC5C4e,EAAS,iBAAiB,MAAQ5e,EAAS,kBAIvCA,EAAS,cAEb4e,EAAS,YAAY,MAAQ5e,EAAS,YAEtCo2B,EAAyBp2B,EAAS,YAAa4e,EAAS,oBAAqB,GAIzE5e,EAAS,cAEb4e,EAAS,YAAY,MAAQ5e,EAAS,YAEtCo2B,EAAyBp2B,EAAS,YAAa4e,EAAS,oBAAqB,GAIzE5e,EAAS,UAAY,IAEzB4e,EAAS,UAAU,MAAQ5e,EAAS,WAIrC,IAAMyG,EAAqBhB,EAAW,IAAKzF,CAAS,EAE9C4b,EAASnV,EAAmB,OAC5B2wB,EAAiB3wB,EAAmB,eAErCmV,IAEJgD,EAAS,OAAO,MAAQhD,EAExByb,GAAI,KAAMD,CAAe,EAGzBC,GAAI,GAAK,GAAIA,GAAI,GAAK,GAAIA,GAAI,GAAK,GAE9Bzb,EAAO,eAAiBA,EAAO,wBAA0B,KAG7Dyb,GAAI,GAAK,GACTA,GAAI,GAAK,IAIVzY,EAAS,eAAe,MAAM,eAAgB0Y,IAAI,sBAAuBD,EAAI,CAAE,EAE/EzY,EAAS,WAAW,MAAUhD,EAAO,eAAiBA,EAAO,wBAA0B,GAAU,GAAK,EAEtGgD,EAAS,aAAa,MAAQ5e,EAAS,aACvC4e,EAAS,IAAI,MAAQ5e,EAAS,IAC9B4e,EAAS,gBAAgB,MAAQ5e,EAAS,iBAItCA,EAAS,WAEb4e,EAAS,SAAS,MAAQ5e,EAAS,SACnC4e,EAAS,kBAAkB,MAAQ5e,EAAS,kBAE5Co2B,EAAyBp2B,EAAS,SAAU4e,EAAS,iBAAkB,GAInE5e,EAAS,QAEb4e,EAAS,MAAM,MAAQ5e,EAAS,MAChC4e,EAAS,eAAe,MAAQ5e,EAAS,eAEzCo2B,EAAyBp2B,EAAS,MAAO4e,EAAS,cAAe,EAInE,CAEA,SAASoY,EAAqBpY,EAAU5e,EAAW,CAElD4e,EAAS,QAAQ,MAAM,KAAM5e,EAAS,KAAM,EAC5C4e,EAAS,QAAQ,MAAQ5e,EAAS,QAE7BA,EAAS,MAEb4e,EAAS,IAAI,MAAQ5e,EAAS,IAE9Bo2B,EAAyBp2B,EAAS,IAAK4e,EAAS,YAAa,EAI/D,CAEA,SAASqY,EAAqBrY,EAAU5e,EAAW,CAElD4e,EAAS,SAAS,MAAQ5e,EAAS,SACnC4e,EAAS,UAAU,MAAQ5e,EAAS,SAAWA,EAAS,QACxD4e,EAAS,MAAM,MAAQ5e,EAAS,KAEjC,CAEA,SAASk3B,EAAuBtY,EAAU5e,EAAUu2B,EAAY5sB,EAAS,CAExEiV,EAAS,QAAQ,MAAM,KAAM5e,EAAS,KAAM,EAC5C4e,EAAS,QAAQ,MAAQ5e,EAAS,QAClC4e,EAAS,KAAK,MAAQ5e,EAAS,KAAOu2B,EACtC3X,EAAS,MAAM,MAAQjV,EAAS,GAE3B3J,EAAS,MAEb4e,EAAS,IAAI,MAAQ5e,EAAS,IAE9Bo2B,EAAyBp2B,EAAS,IAAK4e,EAAS,WAAY,GAIxD5e,EAAS,WAEb4e,EAAS,SAAS,MAAQ5e,EAAS,SAEnCo2B,EAAyBp2B,EAAS,SAAU4e,EAAS,iBAAkB,GAInE5e,EAAS,UAAY,IAEzB4e,EAAS,UAAU,MAAQ5e,EAAS,UAItC,CAEA,SAASm3B,EAAwBvY,EAAU5e,EAAW,CAErD4e,EAAS,QAAQ,MAAM,KAAM5e,EAAS,KAAM,EAC5C4e,EAAS,QAAQ,MAAQ5e,EAAS,QAClC4e,EAAS,SAAS,MAAQ5e,EAAS,SAE9BA,EAAS,MAEb4e,EAAS,IAAI,MAAQ5e,EAAS,IAE9Bo2B,EAAyBp2B,EAAS,IAAK4e,EAAS,YAAa,GAIzD5e,EAAS,WAEb4e,EAAS,SAAS,MAAQ5e,EAAS,SAEnCo2B,EAAyBp2B,EAAS,SAAU4e,EAAS,iBAAkB,GAInE5e,EAAS,UAAY,IAEzB4e,EAAS,UAAU,MAAQ5e,EAAS,UAItC,CAEA,SAAS22B,EAAsB/X,EAAU5e,EAAW,CAEnD4e,EAAS,SAAS,MAAM,KAAM5e,EAAS,QAAS,EAChD4e,EAAS,UAAU,MAAQ,KAAK,IAAK5e,EAAS,UAAW,IAAK,CAE/D,CAEA,SAAS02B,EAAqB9X,EAAU5e,EAAW,CAE7CA,EAAS,cAEb4e,EAAS,YAAY,MAAQ5e,EAAS,YAIxC,CAEA,SAAS42B,EAAyBhY,EAAU5e,EAAW,CAEtD4e,EAAS,UAAU,MAAQ5e,EAAS,UAE/BA,EAAS,eAEb4e,EAAS,aAAa,MAAQ5e,EAAS,aAEvCo2B,EAAyBp2B,EAAS,aAAc4e,EAAS,qBAAsB,GAIhFA,EAAS,UAAU,MAAQ5e,EAAS,UAE/BA,EAAS,eAEb4e,EAAS,aAAa,MAAQ5e,EAAS,aAEvCo2B,EAAyBp2B,EAAS,aAAc4e,EAAS,qBAAsB,GAI3E5e,EAAS,SAIb4e,EAAS,gBAAgB,MAAQ5e,EAAS,gBAI5C,CAEA,SAAS62B,EAAyBjY,EAAU5e,EAAUw2B,EAA2B,CAEhF5X,EAAS,IAAI,MAAQ5e,EAAS,IAEzBA,EAAS,MAAQ,IAErB4e,EAAS,WAAW,MAAM,KAAM5e,EAAS,UAAW,EAAE,eAAgBA,EAAS,KAAM,EAErF4e,EAAS,eAAe,MAAQ5e,EAAS,eAEpCA,EAAS,gBAEb4e,EAAS,cAAc,MAAQ5e,EAAS,cAExCo2B,EAAyBp2B,EAAS,cAAe4e,EAAS,sBAAuB,GAI7E5e,EAAS,oBAEb4e,EAAS,kBAAkB,MAAQ5e,EAAS,kBAE5Co2B,EAAyBp2B,EAAS,kBAAmB4e,EAAS,0BAA2B,IAMtF5e,EAAS,UAAY,IAEzB4e,EAAS,UAAU,MAAQ5e,EAAS,UACpC4e,EAAS,mBAAmB,MAAQ5e,EAAS,mBAExCA,EAAS,eAEb4e,EAAS,aAAa,MAAQ5e,EAAS,aAEvCo2B,EAAyBp2B,EAAS,aAAc4e,EAAS,qBAAsB,GAI3E5e,EAAS,wBAEb4e,EAAS,sBAAsB,MAAQ5e,EAAS,sBAEhDo2B,EAAyBp2B,EAAS,sBAAuB4e,EAAS,8BAA+B,GAI7F5e,EAAS,qBAEb4e,EAAS,mBAAmB,MAAQ5e,EAAS,mBAE7Co2B,EAAyBp2B,EAAS,mBAAoB4e,EAAS,2BAA4B,EAE3FA,EAAS,qBAAqB,MAAM,KAAM5e,EAAS,oBAAqB,EAEnEA,EAAS,OAASte,IAEtBk9B,EAAS,qBAAqB,MAAM,OAAO,IAQzC5e,EAAS,WAAa,IAE1B4e,EAAS,WAAW,MAAQ5e,EAAS,YAIjCA,EAAS,YAAc,IAE3B4e,EAAS,YAAY,MAAQ5e,EAAS,YACtC4e,EAAS,eAAe,MAAQ5e,EAAS,eACzC4e,EAAS,4BAA4B,MAAQ5e,EAAS,0BAA2B,CAAE,EACnF4e,EAAS,4BAA4B,MAAQ5e,EAAS,0BAA2B,CAAE,EAE9EA,EAAS,iBAEb4e,EAAS,eAAe,MAAQ5e,EAAS,eAEzCo2B,EAAyBp2B,EAAS,eAAgB4e,EAAS,uBAAwB,GAI/E5e,EAAS,0BAEb4e,EAAS,wBAAwB,MAAQ5e,EAAS,wBAElDo2B,EAAyBp2B,EAAS,wBAAyB4e,EAAS,gCAAiC,IAMlG5e,EAAS,aAAe,IAE5B4e,EAAS,aAAa,MAAQ5e,EAAS,aACvC4e,EAAS,uBAAuB,MAAQ4X,EAAyB,QACjE5X,EAAS,wBAAwB,MAAM,IAAK4X,EAAyB,MAAOA,EAAyB,MAAO,EAEvGx2B,EAAS,kBAEb4e,EAAS,gBAAgB,MAAQ5e,EAAS,gBAE1Co2B,EAAyBp2B,EAAS,gBAAiB4e,EAAS,wBAAyB,GAItFA,EAAS,UAAU,MAAQ5e,EAAS,UAE/BA,EAAS,eAEb4e,EAAS,aAAa,MAAQ5e,EAAS,aAEvCo2B,EAAyBp2B,EAAS,aAAc4e,EAAS,qBAAsB,GAIhFA,EAAS,oBAAoB,MAAQ5e,EAAS,oBAC9C4e,EAAS,iBAAiB,MAAM,KAAM5e,EAAS,gBAAiB,GAI5DA,EAAS,WAAa,IAE1B4e,EAAS,iBAAiB,MAAM,IAAK5e,EAAS,WAAa,KAAK,IAAKA,EAAS,kBAAmB,EAAGA,EAAS,WAAa,KAAK,IAAKA,EAAS,kBAAmB,CAAE,EAE7JA,EAAS,gBAEb4e,EAAS,cAAc,MAAQ5e,EAAS,cAExCo2B,EAAyBp2B,EAAS,cAAe4e,EAAS,sBAAuB,IAMnFA,EAAS,kBAAkB,MAAQ5e,EAAS,kBAC5C4e,EAAS,cAAc,MAAM,KAAM5e,EAAS,aAAc,EAErDA,EAAS,mBAEb4e,EAAS,iBAAiB,MAAQ5e,EAAS,iBAE3Co2B,EAAyBp2B,EAAS,iBAAkB4e,EAAS,yBAA0B,GAInF5e,EAAS,uBAEb4e,EAAS,qBAAqB,MAAQ5e,EAAS,qBAE/Co2B,EAAyBp2B,EAAS,qBAAsB4e,EAAS,6BAA8B,EAIjG,CAEA,SAASkY,EAAuBlY,EAAU5e,EAAW,CAE/CA,EAAS,SAEb4e,EAAS,OAAO,MAAQ5e,EAAS,OAInC,CAEA,SAAS+2B,EAAyBnY,EAAU5e,EAAW,CAEtD,IAAM8gB,EAAQrb,EAAW,IAAKzF,CAAS,EAAE,MAEzC4e,EAAS,kBAAkB,MAAM,sBAAuBkC,EAAM,WAAY,EAC1ElC,EAAS,aAAa,MAAQkC,EAAM,OAAO,OAAO,KAClDlC,EAAS,YAAY,MAAQkC,EAAM,OAAO,OAAO,GAElD,CAEA,MAAO,CACN,mBAAoBuV,EACpB,wBAAyBC,CAC1B,CAED,CAEA,SAASiB,IAAqBz7B,EAAImH,EAAMuJ,EAAc9O,EAAQ,CAE7D,IAAI3B,EAAU,CAAC,EACXy7B,EAAa,CAAC,EACdC,EAAyB,CAAC,EAExBC,EAAmB57B,EAAG,aAAcA,EAAG,2BAA4B,EAEzE,SAAS67B,EAAMvJ,EAAenuB,EAAU,CAEvC,IAAM23B,EAAe33B,EAAQ,QAC7BvC,EAAM,oBAAqB0wB,EAAewJ,CAAa,CAExD,CAEA,SAASx6B,EAAQgxB,EAAenuB,EAAU,CAEzC,IAAI3D,EAASP,EAASqyB,EAAc,EAAG,EAElC9xB,IAAW,SAEfu7B,EAAsBzJ,CAAc,EAEpC9xB,EAASN,EAAcoyB,CAAc,EACrCryB,EAASqyB,EAAc,EAAG,EAAI9xB,EAE9B8xB,EAAc,iBAAkB,UAAW0J,CAAwB,GAMpE,IAAMF,EAAe33B,EAAQ,QAC7BvC,EAAM,iBAAkB0wB,EAAewJ,CAAa,EAIpD,IAAMl8B,EAAQuH,EAAK,OAAO,MAErBu0B,EAAYpJ,EAAc,EAAG,IAAM1yB,IAEvCq8B,EAAkB3J,CAAc,EAEhCoJ,EAAYpJ,EAAc,EAAG,EAAI1yB,EAInC,CAEA,SAASM,EAAcoyB,EAAgB,CAItC,IAAM4J,EAAoBC,EAA0B,EACpD7J,EAAc,oBAAsB4J,EAEpC,IAAM17B,EAASR,EAAG,aAAa,EACzBO,EAAO+xB,EAAc,OACrBhyB,EAAQgyB,EAAc,MAE5B,OAAAtyB,EAAG,WAAYA,EAAG,eAAgBQ,CAAO,EACzCR,EAAG,WAAYA,EAAG,eAAgBO,EAAMD,CAAM,EAC9CN,EAAG,WAAYA,EAAG,eAAgB,IAAK,EACvCA,EAAG,eAAgBA,EAAG,eAAgBk8B,EAAmB17B,CAAO,EAEzDA,CAER,CAEA,SAAS27B,GAA4B,CAEpC,QAAUp7B,EAAI,EAAGA,EAAI66B,EAAkB76B,IAEtC,GAAK46B,EAAuB,QAAS56B,CAAE,IAAM,GAE5C,OAAA46B,EAAuB,KAAM56B,CAAE,EACxBA,EAMT,OAAAhC,GAAO,iFAAkF,EAElF,CAER,CAEA,SAASk9B,EAAkB3J,EAAgB,CAE1C,IAAM9xB,EAASP,EAASqyB,EAAc,EAAG,EACnCxP,EAAWwP,EAAc,SACzB1sB,EAAQ0sB,EAAc,QAE5BtyB,EAAG,WAAYA,EAAG,eAAgBQ,CAAO,EAEzC,QAAUO,EAAI,EAAG+E,EAAKgd,EAAS,OAAQ/hB,EAAI+E,EAAI/E,IAAO,CAErD,IAAMq7B,EAAe,MAAM,QAAStZ,EAAU/hB,CAAE,CAAE,EAAI+hB,EAAU/hB,CAAE,EAAI,CAAE+hB,EAAU/hB,CAAE,CAAE,EAEtF,QAAU+Q,EAAI,EAAGuqB,EAAKD,EAAa,OAAQtqB,EAAIuqB,EAAIvqB,IAAO,CAEzD,IAAM3H,EAAUiyB,EAActqB,CAAE,EAEhC,GAAKwqB,EAAmBnyB,EAASpJ,EAAG+Q,EAAGlM,CAAM,IAAM,GAAO,CAEzD,IAAMU,EAAS6D,EAAQ,SAEjBoyB,EAAS,MAAM,QAASpyB,EAAQ,KAAM,EAAIA,EAAQ,MAAQ,CAAEA,EAAQ,KAAM,EAE5EqyB,EAAc,EAElB,QAAUnS,EAAI,EAAGA,EAAIkS,EAAO,OAAQlS,IAAO,CAE1C,IAAMvqB,EAAQy8B,EAAQlS,CAAE,EAElBljB,EAAOs1B,EAAgB38B,CAAM,EAG9B,OAAOA,GAAU,UAAY,OAAOA,GAAU,WAElDqK,EAAQ,OAAQ,CAAE,EAAIrK,EACtBE,EAAG,cAAeA,EAAG,eAAgBsG,EAASk2B,EAAaryB,EAAQ,MAAO,GAE/DrK,EAAM,WAIjBqK,EAAQ,OAAQ,CAAE,EAAIrK,EAAM,SAAU,CAAE,EACxCqK,EAAQ,OAAQ,CAAE,EAAIrK,EAAM,SAAU,CAAE,EACxCqK,EAAQ,OAAQ,CAAE,EAAIrK,EAAM,SAAU,CAAE,EACxCqK,EAAQ,OAAQ,CAAE,EAAI,EACtBA,EAAQ,OAAQ,CAAE,EAAIrK,EAAM,SAAU,CAAE,EACxCqK,EAAQ,OAAQ,CAAE,EAAIrK,EAAM,SAAU,CAAE,EACxCqK,EAAQ,OAAQ,CAAE,EAAIrK,EAAM,SAAU,CAAE,EACxCqK,EAAQ,OAAQ,CAAE,EAAI,EACtBA,EAAQ,OAAQ,CAAE,EAAIrK,EAAM,SAAU,CAAE,EACxCqK,EAAQ,OAAQ,CAAE,EAAIrK,EAAM,SAAU,CAAE,EACxCqK,EAAQ,OAAQ,EAAG,EAAIrK,EAAM,SAAU,CAAE,EACzCqK,EAAQ,OAAQ,EAAG,EAAI,IAIvBrK,EAAM,QAASqK,EAAQ,OAAQqyB,CAAY,EAE3CA,GAAer1B,EAAK,QAAU,aAAa,kBAI7C,CAEAnH,EAAG,cAAeA,EAAG,eAAgBsG,EAAQ6D,EAAQ,MAAO,CAE7D,CAED,CAED,CAEAnK,EAAG,WAAYA,EAAG,eAAgB,IAAK,CAExC,CAEA,SAASs8B,EAAmBnyB,EAAS9F,EAAOq4B,EAAY92B,EAAQ,CAE/D,IAAM9F,EAAQqK,EAAQ,MAChBwyB,EAAct4B,EAAQ,IAAMq4B,EAElC,GAAK92B,EAAO+2B,CAAY,IAAM,OAI7B,OAAK,OAAO78B,GAAU,UAAY,OAAOA,GAAU,UAElD8F,EAAO+2B,CAAY,EAAI78B,EAIvB8F,EAAO+2B,CAAY,EAAI78B,EAAM,MAAM,EAI7B,GAED,CAEN,IAAM88B,EAAeh3B,EAAO+2B,CAAY,EAIxC,GAAK,OAAO78B,GAAU,UAAY,OAAOA,GAAU,WAElD,GAAK88B,IAAiB98B,EAErB,OAAA8F,EAAO+2B,CAAY,EAAI78B,EAChB,WAMH88B,EAAa,OAAQ98B,CAAM,IAAM,GAErC,OAAA88B,EAAa,KAAM98B,CAAM,EAClB,EAMV,CAEA,MAAO,EAER,CAEA,SAASi8B,EAAsBzJ,EAAgB,CAK9C,IAAMxP,EAAWwP,EAAc,SAE3BhsB,EAAS,EACPu2B,EAAY,GAElB,QAAU97B,EAAI,EAAGG,EAAI4hB,EAAS,OAAQ/hB,EAAIG,EAAGH,IAAO,CAEnD,IAAMq7B,EAAe,MAAM,QAAStZ,EAAU/hB,CAAE,CAAE,EAAI+hB,EAAU/hB,CAAE,EAAI,CAAE+hB,EAAU/hB,CAAE,CAAE,EAEtF,QAAU+Q,EAAI,EAAGuqB,EAAKD,EAAa,OAAQtqB,EAAIuqB,EAAIvqB,IAAO,CAEzD,IAAM3H,EAAUiyB,EAActqB,CAAE,EAE1ByqB,EAAS,MAAM,QAASpyB,EAAQ,KAAM,EAAIA,EAAQ,MAAQ,CAAEA,EAAQ,KAAM,EAEhF,QAAUkgB,EAAI,EAAGC,EAAKiS,EAAO,OAAQlS,EAAIC,EAAID,IAAO,CAEnD,IAAMvqB,EAAQy8B,EAAQlS,CAAE,EAElBljB,EAAOs1B,EAAgB38B,CAAM,EAE7Bg9B,EAAcx2B,EAASu2B,EACvBE,EAAeD,EAAc31B,EAAK,SAClC61B,EAAaF,EAAcC,EAEjCz2B,GAAUy2B,EAGLC,IAAe,GAAOH,EAAYG,EAAe71B,EAAK,UAG1Db,GAAYu2B,EAAYG,GAKzB7yB,EAAQ,OAAS,IAAI,aAAchD,EAAK,QAAU,aAAa,iBAAkB,EACjFgD,EAAQ,SAAW7D,EAGnBA,GAAUa,EAAK,OAEhB,CAED,CAED,CAIA,IAAM21B,EAAcx2B,EAASu2B,EAE7B,OAAKC,EAAc,IAAIx2B,GAAYu2B,EAAYC,GAI/CxK,EAAc,OAAShsB,EACvBgsB,EAAc,QAAU,CAAC,EAElB,IAER,CAEA,SAASmK,EAAgB38B,EAAQ,CAEhC,IAAMqH,EAAO,CACZ,SAAU,EACV,QAAS,CACV,EAIA,OAAK,OAAOrH,GAAU,UAAY,OAAOA,GAAU,WAIlDqH,EAAK,SAAW,EAChBA,EAAK,QAAU,GAEJrH,EAAM,WAIjBqH,EAAK,SAAW,EAChBA,EAAK,QAAU,GAEJrH,EAAM,WAAaA,EAAM,SAIpCqH,EAAK,SAAW,GAChBA,EAAK,QAAU,IAEJrH,EAAM,WAIjBqH,EAAK,SAAW,GAChBA,EAAK,QAAU,IAEJrH,EAAM,WAIjBqH,EAAK,SAAW,GAChBA,EAAK,QAAU,IAEJrH,EAAM,WAIjBqH,EAAK,SAAW,GAChBA,EAAK,QAAU,IAEJrH,EAAM,UAEjBX,GAAM,uEAAwE,EAI9EA,GAAM,iDAAkDW,CAAM,EAIxDqH,CAER,CAEA,SAAS60B,EAAyBlwB,EAAQ,CAEzC,IAAMwmB,EAAgBxmB,EAAM,OAE5BwmB,EAAc,oBAAqB,UAAW0J,CAAwB,EAEtE,IAAM33B,EAAQs3B,EAAuB,QAASrJ,EAAc,mBAAoB,EAChFqJ,EAAuB,OAAQt3B,EAAO,CAAE,EAExCrE,EAAG,aAAcC,EAASqyB,EAAc,EAAG,CAAE,EAE7C,OAAOryB,EAASqyB,EAAc,EAAG,EACjC,OAAOoJ,EAAYpJ,EAAc,EAAG,CAErC,CAEA,SAAS/uB,GAAU,CAElB,QAAYgV,KAAMtY,EAEjBD,EAAG,aAAcC,EAASsY,CAAG,CAAE,EAIhCojB,EAAyB,CAAC,EAC1B17B,EAAU,CAAC,EACXy7B,EAAa,CAAC,CAEf,CAEA,MAAO,CAEN,KAAMG,EACN,OAAQv6B,EAER,QAASiC,CAEV,CAED,CA+BA,SAAS05B,KAAY,CAEpB,OAAKC,KAAQ,OAEZA,GAAM,IAAI5zC,GAAa6zC,IAAM,GAAI,GAAIplC,GAAUrL,EAAc,EAC7DwwC,GAAI,KAAO,UACXA,GAAI,UAAYztC,GAChBytC,GAAI,UAAYztC,GAChBytC,GAAI,MAAQ/1C,GACZ+1C,GAAI,MAAQ/1C,GACZ+1C,GAAI,gBAAkB,GACtBA,GAAI,YAAc,IAIZA,EAER,CAzteA,IAuSIE,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEEC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEAC,IAEA3sC,GAkJAyD,GAkOAxD,GA+VA+J,GACAH,GACAC,IAo1CAmJ,GAIAC,GAKAgC,GAGAJ,IAEA83B,GACAC,GACFC,GACAC,GACAC,GACAC,GAEEC,IAkBApyC,GAg2DAwf,IAkSAoC,GAEAD,GAEAO,GACAJ,GACAE,GAMAjC,GACAI,GAIAY,GACAF,GACAF,GAu4BA4D,GAgBAC,GAiBAE,GA8BAT,GAuEAuG,GA4GAE,IAEFC,IAqBEpF,GAkEAW,IAyBAE,GAsHAa,IAQAI,IA6BAE,IAiEAO,IAWAE,IAcAE,IAYAE,IAqoBFiqB,IAEErnB,GA4GAsnB,GAkkCF9f,IA+hBEyB,IAEAC,IAEAiB,IAKAC,IAKAC,GACAJ,GACAC,GAqjBA0C,IA81HA2a,IAOAC,IAwBAC,GA+HAC,GAqjCAtL,GACAC,IAs9BA2B,IAmBFD,GA0BE9+B,GAhueN0oC,GAAAC,GAAA,KAKAC,KACAA,KAiSI5J,IAAqB;AAAA;AAAA,QAErBC,IAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAE1BC,IAAoB;AAAA;AAAA,QAEpBC,IAAyB;AAAA;AAAA,QAEzBC,IAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAErBC,IAA0B;AAAA;AAAA,QAE1BC,IAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAEjBC,IAAsB;AAAA;AAAA;AAAA,QAEtBC,IAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAEvBC,IAAkB;AAAA;AAAA,QAElBC,IAAe;AAAA;AAAA;AAAA,QAEfC,IAAqB;AAAA;AAAA;AAAA,QAErBC,IAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAERC,IAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAEvBC,IAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAExBC,IAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAE3BC,IAAgC;AAAA;AAAA;AAAA,QAEhCC,IAA8B;AAAA;AAAA,QAE9BC,IAAyB;AAAA;AAAA,QAEzBC,IAAiB;AAAA;AAAA;AAAA;AAAA,QAEjBC,IAAsB;AAAA;AAAA;AAAA;AAAA,QAEtBC,IAAoB;AAAA;AAAA;AAAA;AAAA,QAEpBC,IAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAEfC,IAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAETC,IAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAE9BC,IAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAEvBC,IAA8B;AAAA;AAAA;AAAA;AAAA,QAE9BC,IAAyB;AAAA;AAAA,QAEzBC,IAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAEvBC,IAA4B;AAAA;AAAA,QAE5BC,IAAsB,sDAEtBC,IAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAE3BC,IAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAElBC,IAA8B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAE9BC,IAAuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAEvBC,IAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAErBC,IAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAEhBC,IAAa;AAAA;AAAA,QAEbC,IAAkB;AAAA;AAAA,QAElBC,IAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAEfC,IAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAEpBC,IAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAE5BC,IAAyB;AAAA;AAAA;AAAA,QAEzBC,IAA0B;AAAA;AAAA,+CAE1BC,IAA+B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wDAE/BC,IAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAEpBC,IAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAEhCC,IAAuB;AAAA,2CAEvBC,IAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qDAE5BC,IAAwB;AAAA;AAAA;AAAA;AAAA,+CAExBC,IAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2DAE7BC,IAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAE3BC,IAAgC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,wDAE5BC,IAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAExBC,IAA6B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAE7BC,IAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAEnBC,IAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAEjBC,IAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAEZC,IAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAEhBC,IAAW;AAAA;AAAA;AAAA;AAAA;AAAA,GAEXC,IAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEbC,IAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEXC,IAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEbC,IAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEXC,IAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEbC,IAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEXC,IAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEbC,IAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEXC,IAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEbC,IAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEXC,IAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEbC,IAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEXC,IAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEbC,IAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEXC,IAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEbC,IAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEXC,IAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEbC,IAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEXC,IAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEbC,IAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEXC,IAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEbC,IAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEXC,IAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEbC,IAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEXC,IAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEbC,IAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEXC,IAAa;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAEbC,IAAW;AA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MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KACxP,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KACxP,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxP,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxP,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxP,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxP,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxP,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAA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AAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;A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AG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,OAAS,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,OAAS,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,SAAY,EAAG,SAAW,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,OAAS,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,OAAS,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,UAAa,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,MAAQ,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,OAAS,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,OAAS,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,WAAa,QAAU,WAAa,EAAG,UAAa,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,OAAS,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,OAAS,SAAY,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,OAAU,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,OAAS,WAAa,EAAG,QAAU,OAAS,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,SAAY,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,QAAW,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,WAAa,EAAG,WAAa,QAAU,WAAa,EAAG,QAAW,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,OAAS,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,UAAY,EAAG,WAAa,QAAU,WAAa,EAAG,SAAY,OAAS,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,OAAS,SAAY,EAAG,SAAW,OAAS,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,OAAS,WAAa,EAAG,QAAU,OAAS,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,OAAS,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,OAAS,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,MAAQ,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,OAAS,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,OAAS,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,OAAS,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,WAAa,QAAU,WAAa,EAAG,UAAa,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,SAAW,QAAU,SAAY,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,MAAQ,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,UAAa,QAAU,SAAY,EAAG,UAAY,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,UAAY,OAAS,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,SAAY,EAAG,SAAW,QAAU,WAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,MAAQ,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,MAAQ,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,OAAS,WAAa,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,SAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,WAAa,QAAU,WAAa,EAAG,UAAa,QAAU,WAAa,EAAG,UAAY,QAAU,SAAY,EAAG,UAAY,QAAU,WAAa,EAAG,UAAY,OAAS,SAAY,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,OAAS,WAAa,EAAG,SAAW,QAAU,SAAY,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,OAAS,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,EAAG,SAAW,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,OAAS,WAAa,EAAG,EAAG,OAAS,WAAa,EAAG,EAAG,QAAU,SAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,UAAa,QAAU,WAAa,EAAG,UAAa,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,MAAQ,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,OAAS,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,QAAU,OAAS,WAAa,EAAG,QAAU,OAAS,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,OAAS,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,OAAS,SAAY,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,OAAS,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,OAAS,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,WAAa,QAAU,WAAa,EAAG,UAAa,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,OAAS,SAAY,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,OAAS,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,OAAS,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,OAAS,SAAY,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,MAAQ,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,OAAS,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,OAAS,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,UAAa,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,OAAS,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,OAAS,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,OAAS,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,OAAS,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,OAAS,WAAa,EAAG,QAAU,OAAS,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,WAAa,QAAU,WAAa,EAAG,UAAa,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,OAAS,WAAa,EAAG,SAAW,QAAU,SAAY,EAAG,SAAW,OAAS,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,MAAQ,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,OAAS,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,OAAS,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,MAAQ,WAAa,EAAG,EAAG,OAAS,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,WAAa,QAAU,WAAa,EAAG,UAAa,OAAS,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,OAAS,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,OAAS,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,OAAS,UAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,UAAa,OAAS,WAAa,EAAG,UAAa,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,OAAS,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,OAAS,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,OAAS,OAAS,WAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,EAAG,SAAW,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,OAAS,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,WAAa,QAAU,WAAa,EAAG,UAAa,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,OAAS,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,SAAY,EAAG,SAAW,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,OAAU,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,MAAQ,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,QAAU,QAAU,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,OAAS,UAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,QAAW,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,MAAQ,WAAa,EAAG,UAAa,QAAU,WAAa,EAAG,UAAa,QAAU,WAAa,EAAG,UAAY,OAAS,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,WAAa,EAAG,QAAU,QAAU,SAAY,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,SAAY,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,WAAa,QAAU,WAAa,EAAG,UAAa,QAAU,SAAY,EAAG,UAAY,QAAU,WAAa,EAAG,SAAW,OAAS,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,SAAW,QAAU,SAAY,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,WAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,OAAS,SAAY,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,OAAS,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,SAAY,EAAG,EAAG,QAAU,WAAa,EAAG,UAAa,QAAU,WAAa,EAAG,UAAa,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,UAAY,QAAU,SAAY,EAAG,SAAW,OAAS,WAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,QAAW,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,WAAa,QAAU,WAAa,EAAG,UAAa,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,SAAW,OAAS,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,OAAS,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,OAAS,UAAa,EAAG,OAAS,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,WAAa,QAAU,WAAa,EAAG,UAAa,QAAU,UAAa,EAAG,SAAW,QAAU,WAAa,EAAG,UAAY,OAAS,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,SAAW,QAAU,SAAY,EAAG,SAAW,OAAS,UAAa,EAAG,SAAW,OAAS,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,SAAY,EAAG,SAAW,QAAU,SAAY,EAAG,SAAW,QAAU,SAAY,EAAG,SAAW,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,SAAY,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,OAAS,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,OAAS,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,WAAa,QAAU,WAAa,EAAG,UAAa,QAAU,WAAa,EAAG,UAAY,QAAU,QAAW,EAAG,UAAY,QAAU,UAAa,EAAG,UAAY,OAAS,UAAa,EAAG,UAAY,QAAU,SAAY,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,OAAS,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,QAAW,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,QAAW,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,OAAS,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,SAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,OAAS,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,WAAa,QAAU,WAAa,EAAG,UAAa,QAAU,UAAa,EAAG,UAAY,QAAU,UAAa,EAAG,UAAY,QAAU,UAAa,EAAG,UAAY,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,QAAW,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,MAAQ,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,MAAQ,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,SAAY,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,SAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,OAAS,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,UAAY,QAAU,WAAa,EAAG,UAAa,QAAU,UAAa,EAAG,UAAY,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,UAAY,QAAU,UAAa,EAAG,UAAY,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,SAAY,EAAG,SAAW,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,MAAQ,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,QAAU,SAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,OAAS,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,WAAa,QAAU,UAAa,EAAG,UAAa,QAAU,UAAa,EAAG,UAAY,QAAU,UAAa,EAAG,UAAY,QAAU,UAAa,EAAG,UAAY,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,QAAW,EAAG,QAAU,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,SAAY,EAAG,QAAU,QAAU,QAAW,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,MAAQ,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,OAAS,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,OAAS,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,SAAY,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,QAAU,SAAY,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,OAAS,WAAa,EAAG,EAAG,OAAS,WAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,SAAY,EAAG,UAAa,QAAU,UAAa,EAAG,UAAa,QAAU,UAAa,EAAG,UAAY,QAAU,UAAa,EAAG,UAAY,QAAU,UAAa,EAAG,UAAY,QAAU,SAAY,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,OAAS,SAAY,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,EAAG,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,WAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,WAAa,QAAU,UAAa,EAAG,UAAa,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,UAAY,QAAU,UAAa,EAAG,UAAY,QAAU,UAAa,EAAG,UAAY,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,OAAS,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,SAAY,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,OAAS,KAAO,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,EAAG,EAAG,UAAa,EAAG,EAAG,EAAG,SAAY,EAAG,EAAG,EAAG,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,OAAS,SAAY,EAAG,EAAG,QAAU,UAAa,EAAG,WAAa,QAAU,UAAa,EAAG,UAAa,QAAU,UAAa,EAAG,UAAY,QAAU,UAAa,EAAG,UAAY,QAAU,UAAa,EAAG,UAAY,OAAS,UAAa,EAAG,SAAW,OAAS,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,OAAS,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,MAAQ,QAAU,UAAY,EAAG,MAAQ,QAAU,UAAY,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,EAAG,EAAG,UAAa,EAAG,EAAG,EAAG,UAAa,EAAG,EAAG,EAAG,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,WAAa,QAAU,UAAa,EAAG,UAAa,QAAU,UAAa,EAAG,UAAY,QAAU,UAAa,EAAG,UAAY,QAAU,UAAa,EAAG,UAAY,QAAU,UAAa,EAAG,UAAY,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,MAAQ,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,EAAG,EAAG,UAAa,EAAG,EAAG,EAAG,UAAa,EAAG,EAAG,EAAG,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,OAAS,SAAY,EAAG,EAAG,QAAU,UAAa,EAAG,WAAa,QAAU,UAAa,EAAG,UAAa,QAAU,UAAa,EAAG,UAAY,QAAU,UAAa,EAAG,UAAY,QAAU,UAAa,EAAG,UAAY,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,MAAQ,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,QAAW,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,OAAS,QAAU,SAAY,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,EAAG,EAAG,UAAa,EAAG,EAAG,EAAG,UAAa,EAAG,EAAG,EAAG,UAAa,EAAG,EAAG,QAAU,SAAY,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,SAAY,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,UAAa,QAAU,UAAa,EAAG,UAAa,QAAU,UAAa,EAAG,UAAY,QAAU,UAAa,EAAG,UAAY,QAAU,UAAa,EAAG,UAAY,QAAU,SAAY,EAAG,SAAW,QAAU,UAAa,EAAG,SAAW,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,OAAS,OAAS,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,EAAG,EAAG,UAAa,EAAG,EAAG,EAAG,UAAa,EAAG,EAAG,EAAG,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,WAAa,QAAU,UAAa,EAAG,UAAa,QAAU,UAAa,EAAG,UAAY,QAAU,UAAa,EAAG,UAAY,QAAU,UAAa,EAAG,UAAY,QAAU,UAAY,EAAG,UAAY,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,SAAW,EAAG,OAAS,QAAU,UAAY,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,MAAQ,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,EAAG,EAAG,UAAa,EAAG,EAAG,EAAG,UAAa,EAAG,EAAG,EAAG,SAAY,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,EAAG,QAAU,UAAa,EAAG,WAAa,QAAU,UAAa,EAAG,UAAa,OAAS,UAAY,EAAG,UAAY,QAAU,UAAY,EAAG,UAAY,QAAU,UAAY,EAAG,UAAY,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,MAAQ,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,UAAa,QAAU,UAAY,EAAG,UAAa,QAAU,SAAW,EAAG,UAAY,QAAU,UAAY,EAAG,UAAY,OAAS,UAAY,EAAG,UAAY,QAAU,SAAW,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,MAAQ,SAAW,EAAG,SAAW,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,OAAS,UAAY,EAAG,WAAa,QAAU,UAAY,EAAG,UAAa,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,UAAY,QAAU,UAAY,EAAG,UAAY,OAAS,UAAY,EAAG,SAAW,OAAS,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,OAAS,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,OAAS,OAAS,UAAY,EAAG,SAAW,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,QAAU,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,MAAQ,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,SAAY,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,OAAS,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,WAAa,QAAU,UAAY,EAAG,UAAa,QAAU,UAAY,EAAG,UAAY,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,UAAY,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,MAAQ,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,QAAU,QAAU,SAAW,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,MAAQ,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,OAAS,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,MAAQ,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,QAAU,QAAU,UAAa,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,UAAY,EAAG,UAAa,QAAU,UAAY,EAAG,UAAY,OAAS,UAAY,EAAG,UAAY,QAAU,UAAY,EAAG,UAAY,QAAU,UAAY,EAAG,UAAY,QAAU,UAAY,EAAG,SAAW,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,SAAW,EAAG,MAAQ,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAa,EAAG,EAAG,EAAG,SAAW,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,OAAS,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,OAAS,UAAY,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,UAAY,EAAG,WAAa,QAAU,UAAY,EAAG,UAAa,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,UAAY,QAAU,UAAY,EAAG,SAAW,MAAQ,UAAY,EAAG,UAAY,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,EAAG,SAAW,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,WAAa,QAAU,UAAY,EAAG,UAAa,QAAU,QAAU,EAAG,UAAY,QAAU,UAAY,EAAG,UAAY,QAAU,UAAY,EAAG,UAAY,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,SAAW,OAAS,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,SAAW,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,QAAU,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,UAAa,QAAU,UAAY,EAAG,UAAY,OAAS,UAAY,EAAG,UAAY,QAAU,UAAY,EAAG,UAAY,QAAU,UAAY,EAAG,UAAY,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,SAAW,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,OAAS,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,EAAG,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,EAAG,QAAU,UAAY,EAAG,WAAa,QAAU,UAAY,EAAG,UAAa,QAAU,UAAY,EAAG,SAAW,QAAU,UAAY,EAAG,UAAY,QAAU,QAAU,EAAG,UAAY,QAAU,UAAY,EAAG,SAAW,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,SAAW,OAAS,UAAY,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,OAAS,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,OAAS,SAAW,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,EAAG,EAAG,SAAW,EAAG,EAAG,EAAG,SAAW,EAAG,EAAG,QAAU,QAAU,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,WAAa,QAAU,SAAW,EAAG,UAAa,QAAU,SAAW,EAAG,UAAY,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,UAAY,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,OAAS,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,EAAG,EAAG,QAAU,EAAG,EAAG,EAAG,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,OAAS,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,UAAa,QAAU,SAAW,EAAG,UAAY,QAAU,SAAW,EAAG,UAAY,OAAS,SAAW,EAAG,UAAY,QAAU,SAAW,EAAG,UAAY,QAAU,SAAW,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,MAAQ,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,EAAG,EAAG,SAAW,EAAG,EAAG,EAAG,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,WAAa,QAAU,SAAW,EAAG,UAAa,QAAU,SAAW,EAAG,UAAY,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,UAAY,QAAU,QAAU,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,QAAU,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,EAAG,EAAG,SAAW,EAAG,EAAG,EAAG,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,QAAU,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,WAAa,QAAU,SAAW,EAAG,SAAY,OAAS,SAAW,EAAG,UAAY,QAAU,SAAW,EAAG,UAAY,QAAU,SAAW,EAAG,UAAY,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,OAAS,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,MAAQ,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,MAAQ,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,EAAG,EAAG,SAAW,EAAG,EAAG,EAAG,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,QAAU,EAAG,EAAG,QAAU,SAAW,EAAG,SAAY,QAAU,QAAU,EAAG,UAAY,OAAS,SAAW,EAAG,UAAY,QAAU,SAAW,EAAG,UAAY,QAAU,SAAW,EAAG,UAAY,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,OAAS,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,OAAS,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,KAAO,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,EAAG,EAAG,SAAW,EAAG,EAAG,EAAG,SAAW,EAAG,EAAG,QAAU,QAAU,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,WAAa,QAAU,SAAW,EAAG,UAAa,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,UAAY,QAAU,SAAW,EAAG,UAAY,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,MAAQ,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,EAAG,EAAG,SAAW,EAAG,EAAG,EAAG,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,OAAS,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,WAAa,QAAU,SAAW,EAAG,UAAa,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,UAAY,OAAS,SAAW,EAAG,UAAY,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,OAAS,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,OAAS,SAAW,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,MAAQ,UAAY,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,EAAG,EAAG,SAAW,EAAG,EAAG,EAAG,QAAU,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,UAAa,OAAS,SAAW,EAAG,UAAY,QAAU,SAAW,EAAG,UAAY,QAAU,SAAW,EAAG,UAAY,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,SAAW,EAAG,EAAG,EAAG,SAAW,EAAG,EAAG,EAAG,SAAW,EAAG,EAAG,QAAU,OAAS,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,UAAa,QAAU,SAAW,EAAG,UAAY,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,UAAY,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,SAAW,OAAS,QAAU,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,OAAS,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,MAAQ,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,OAAS,UAAY,EAAG,EAAG,EAAG,SAAW,EAAG,EAAG,EAAG,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,OAAS,EAAG,EAAG,QAAU,SAAW,EAAG,WAAa,QAAU,SAAW,EAAG,UAAa,QAAU,SAAW,EAAG,UAAY,QAAU,QAAU,EAAG,UAAY,QAAU,SAAW,EAAG,UAAY,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,OAAS,SAAW,EAAG,OAAS,QAAU,QAAU,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,EAAG,EAAG,SAAW,EAAG,EAAG,EAAG,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,EAAG,QAAU,SAAW,EAAG,UAAa,QAAU,SAAW,EAAG,UAAY,QAAU,SAAW,EAAG,UAAY,QAAU,SAAW,EAAG,UAAY,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,SAAW,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,OAAS,QAAU,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,EAAG,EAAG,QAAU,EAAG,EAAG,EAAG,QAAU,EAAG,EAAG,QAAU,QAAU,EAAG,EAAG,OAAS,QAAU,EAAG,EAAG,OAAS,QAAU,EAAG,UAAa,QAAU,QAAU,EAAG,UAAY,QAAU,QAAU,EAAG,UAAY,QAAU,QAAU,EAAG,UAAY,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,OAAS,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,OAAS,QAAU,EAAG,SAAW,QAAU,OAAS,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,MAAQ,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,OAAS,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,OAAS,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,EAAG,EAAG,QAAU,EAAG,EAAG,EAAG,QAAU,EAAG,EAAG,QAAU,QAAU,EAAG,EAAG,QAAU,QAAU,EAAG,WAAa,QAAU,QAAU,EAAG,UAAa,QAAU,QAAU,EAAG,UAAY,QAAU,QAAU,EAAG,UAAY,QAAU,QAAU,EAAG,SAAW,QAAU,OAAS,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,OAAS,EAAG,SAAW,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,SAAW,QAAU,OAAS,EAAG,SAAW,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,QAAU,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,IAAM,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,MAAQ,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,KAAO,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,MAAQ,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,OAAS,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,EAAG,EAAG,QAAU,EAAG,EAAG,EAAG,QAAU,EAAG,EAAG,QAAU,QAAU,EAAG,EAAG,QAAU,QAAU,EAAG,WAAa,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,UAAY,QAAU,OAAS,EAAG,UAAY,QAAU,QAAU,EAAG,SAAW,MAAQ,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,OAAS,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,OAAS,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,OAAS,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,MAAQ,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,MAAQ,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,QAAU,QAAU,UAAY,EAAG,EAAG,EAAG,QAAU,EAAG,EAAG,QAAU,QAAU,EAAG,EAAG,QAAU,QAAU,EAAG,EAAG,QAAU,QAAU,EAAG,UAAa,QAAU,QAAU,EAAG,UAAY,QAAU,OAAS,EAAG,UAAY,QAAU,QAAU,EAAG,UAAY,OAAS,QAAU,EAAG,SAAW,MAAQ,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,OAAS,EAAG,SAAW,OAAS,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,OAAS,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,EAAG,EAAG,OAAS,EAAG,EAAG,EAAG,OAAS,EAAG,EAAG,QAAU,QAAU,EAAG,EAAG,QAAU,QAAU,EAAG,UAAa,QAAU,OAAS,EAAG,UAAY,QAAU,QAAU,EAAG,UAAY,QAAU,QAAU,EAAG,SAAW,QAAU,OAAS,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,MAAQ,QAAU,EAAG,SAAW,OAAS,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,QAAU,OAAS,QAAU,EAAG,SAAW,QAAU,OAAS,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,OAAS,QAAU,QAAU,EAAG,OAAS,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,OAAS,EAAG,QAAU,QAAU,QAAU,EAAG,OAAS,QAAU,OAAS,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,OAAS,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,MAAQ,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,EAAG,EAAG,QAAU,EAAG,EAAG,QAAU,QAAU,EAAG,EAAG,QAAU,QAAU,EAAG,WAAa,QAAU,QAAU,EAAG,UAAY,QAAU,QAAU,EAAG,UAAY,QAAU,OAAS,EAAG,UAAY,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,SAAW,QAAU,MAAQ,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,OAAS,EAAG,SAAW,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,QAAU,OAAS,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,OAAS,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,OAAS,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,OAAS,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,OAAS,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,EAAG,EAAG,QAAU,EAAG,EAAG,QAAU,QAAU,EAAG,EAAG,QAAU,QAAU,EAAG,UAAa,QAAU,QAAU,EAAG,UAAY,QAAU,QAAU,EAAG,UAAY,OAAS,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,OAAS,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,OAAS,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,OAAS,EAAG,QAAU,QAAU,OAAS,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,OAAS,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,EAAG,EAAG,QAAU,EAAG,EAAG,QAAU,QAAU,EAAG,EAAG,OAAS,QAAU,EAAG,UAAa,QAAU,QAAU,EAAG,UAAY,QAAU,QAAU,EAAG,UAAY,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,OAAS,EAAG,SAAW,QAAU,OAAS,EAAG,SAAW,QAAU,OAAS,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,QAAU,QAAU,OAAS,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,OAAS,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,OAAS,EAAG,OAAS,QAAU,OAAS,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,MAAQ,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,MAAQ,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,OAAS,SAAW,EAAG,MAAQ,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,EAAG,EAAG,QAAU,EAAG,EAAG,QAAU,QAAU,EAAG,EAAG,QAAU,QAAU,EAAG,UAAY,QAAU,OAAS,EAAG,UAAY,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,OAAS,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,OAAS,EAAG,OAAS,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,OAAS,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,OAAS,QAAU,EAAG,QAAU,QAAU,OAAS,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,OAAS,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,OAAS,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,MAAQ,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,EAAG,EAAG,QAAU,EAAG,EAAG,QAAU,QAAU,EAAG,WAAa,QAAU,QAAU,EAAG,UAAY,QAAU,QAAU,EAAG,UAAY,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,OAAS,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,OAAS,QAAU,QAAU,EAAG,QAAU,OAAS,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,OAAS,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,OAAS,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,OAAS,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,OAAS,QAAU,QAAU,EAAG,OAAS,OAAS,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,OAAS,QAAU,QAAU,EAAG,QAAU,OAAS,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,MAAQ,SAAW,EAAG,QAAU,QAAU,OAAS,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,EAAG,EAAG,QAAU,EAAG,EAAG,QAAU,QAAU,EAAG,UAAa,OAAS,QAAU,EAAG,UAAY,QAAU,OAAS,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,OAAS,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,OAAS,EAAG,QAAU,QAAU,QAAU,EAAG,OAAS,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,OAAS,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,OAAS,MAAQ,OAAS,EAAG,QAAU,OAAS,QAAU,EAAG,QAAU,MAAQ,OAAS,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,MAAQ,EAAG,QAAU,QAAU,QAAU,EAAG,OAAS,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,OAAS,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,EAAG,EAAG,OAAS,EAAG,EAAG,QAAU,QAAU,EAAG,UAAY,QAAU,QAAU,EAAG,SAAW,QAAU,OAAS,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,OAAS,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,OAAS,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,OAAS,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,OAAS,QAAU,QAAU,EAAG,QAAU,OAAS,QAAU,EAAG,OAAS,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,OAAS,EAAG,OAAS,QAAU,QAAU,EAAG,QAAU,OAAS,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,OAAS,OAAS,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,OAAS,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,OAAS,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,OAAS,QAAU,EAAG,MAAQ,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,MAAQ,OAAS,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,OAAS,QAAU,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,EAAG,QAAU,QAAU,EAAG,EAAG,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,SAAW,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,OAAS,OAAS,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,OAAS,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,OAAS,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,OAAS,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,OAAS,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,OAAS,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,OAAS,QAAU,OAAS,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,OAAS,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,OAAS,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,QAAU,QAAU,EAAG,QAAU,OAAS,QAAU,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,OAAS,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,QAAU,SAAW,EAAG,QAAU,OAAS,SAAW,EAAG,QAAU,QAAU,SAAW,EA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,EAAG,CAAE,EAC7H,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAC7H,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAC7H,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAC7H,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAC7H,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,KAgCxB,eAA0B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA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,SAAU,EAAI,OAEpD,UAAU,GAAG,iBAAkB,iBAAkB,IAAM,CAEtDlB,EAAS,mBAAqB,EAE/B,CAAE,CAEH,CAED,CAED,EASAH,GAAS,mBAAqB,GAC9BA,GAAS,+BAA+B,ICrQxC,IAAAsB,GAAAC,GAAA,QCAA,IAAAC,GAAAC,GAAA,QCAA,IAAAC,GAAAC,GAAA,QCAA,IAUMC,IACAC,IAXNC,GAAAC,GAAA,KAAAC,KAUMJ,IAAU,IAAIK,GACdJ,IAAU,IAAIK,ICXpB,IAAAC,GAAAC,GAAA,QCAA,IAAAC,GAAAC,GAAA,QCAA,IAAAC,GAAAC,GAAA,KAAAC,KACAC,KAIAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KAEAC,KACAC,KACAC,KACAC,KAEAC,KACAC,KACAC,KACAC,KACAC,KAEAC,KACAC,KACAC,KACAC,KACAC,KAEAC,KACAC,KAEAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KAEAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KAEAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KAEAC,KACAC,KACAC,KACAC,KAEAC,KACAC,KACAC,KAEAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KAEAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KAEAC,KACAC,KACAC,KAEAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KAEAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KACAC,KAEAC,KACAC,KACAC,KACAC,KAEAC,KACAC,KACAC,KACAC,KACAC,KAC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Q,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MACxP,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KACxP,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KACxP,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxP,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxP,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxP,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxP,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxP,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxP,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxP,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxP,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxP,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxP,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxP,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,IAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KAAQ,MAAQ,KACxP,MAAQ,EAAQ,MAAQ,EAAQ,MAAQ,GAAQ,MAAQ,GAAQ,MAAQ,IAAQ,MAAQ,IAA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,eAAiB,CAAC,EAQvB,KAAK,QAAU,GAQf,KAAK,iBAAmB,GAQxB,KAAK,YAAc,EAEpB,CAED,IC34/EA,IAOM82H,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,GACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,GACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,GACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,GACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,GACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,GACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,GACAC,IACAC,IACAC,IACAC,IACAC,GACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,GACAC,IACAC,IACAC,IACAC,GACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,GACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,GACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,GACAC,IACAC,IACAC,IACAC,GACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,GACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,GACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,GACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,GACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,IACAC,GACAC,IACAC,IACAC,IA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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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I,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,MAAM,KAAK,EAAE,QAAU,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAA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AgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,EACxG,CAAC,OAAO,4XAAiE,EACzE,CAAC,OAAO,sjBAAgG,C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N,IAAK,EACL,QAAU0D,GAAWA,GAAU,EAC/B,QAAUA,GAAWA,EAAS,EAAI,CACtC,EACA,CACI,KAAM,UACN,IAAK,CACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,CACT,EAEA,CACI,KAAM,GACN,IAAK,EACT,EACA,CACI,KAAM,UACN,IAAK,CACT,EACA,CACI,KAAM,cACN,KAAM,GACN,IAAK,CACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,EAET,EAEA,CACI,KAAM,GACN,IAAK,EACT,EACA,CACI,KAAM,UACN,IAAK,CACT,EACA,CACI,KAAM,kBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,UACN,IAAK,CACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,EAET,EAEA,CACI,KAAM,GACN,IAAK,EACT,EACA,CACI,KAAM,uBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,mBACN,IAAK,EACL,IAAK,EACL,IAAK,GACL,QAASb,GAAS,kBAClB,QAASlD,GAAS,iBACtB,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,CACT,EAEA,CACI,KAAM,GACN,IAAK,EACT,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,UACN,IAAK,CACT,EACA,CACI,KAAM,UACN,IAAK,EACL,IAAK,EAET,EAEA,CACI,KAAM,GACN,IAAK,EACT,EACA,CACI,KAAM,UACN,IAAK,CACT,EACA,CACI,KAAM,mBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,UACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,UACN,IAAK,CACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,CACT,EAEA,CACI,KAAM,GACN,IAAK,EACT,EACA,CACI,KAAM,UACN,IAAK,CACT,EACA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,EACT,EAEA,CACI,KAAM,GACN,IAAK,EACT,EACA,CACI,KAAM,iBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,aACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,EAET,EAEA,CACI,KAAM,GACN,IAAK,EACT,EACA,CACI,KAAM,mBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EAEA,CACI,KAAM,GACN,IAAK,EACT,EACA,CACI,KAAM,oBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,aACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,CACT,EAEA,CACI,KAAM,GACN,IAAK,EACT,EACA,CACI,KAAM,UACN,IAAK,CACT,EACA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,aACN,KAAM,GACN,IAAK,CACT,EAEA,CACI,KAAM,cACN,KAAM,KACN,IAAK,GACT,CACJ,EACA,CAACX,GAAW,GAAG,EAAG,CAEd,CACI,KAAM,UACN,IAAK,CACT,EACA,CACI,KAAM,SACN,IAAK,CACT,EACA,CACI,KAAM,aACN,IAAK,EACL,IAAK,EACT,EAEA,CACI,KAAM,WACN,IAAK,CACT,EACA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,YACN,KAAM,GACN,IAAK,CACT,EAEA,CACI,KAAM,OACN,KAAM,GACN,IAAK,GACT,EAEA,CACI,KAAM,SACN,IAAK,EACL,IAAK,GACT,EAEA,CACI,KAAM,SACN,IAAK,EACL,IAAK,GACT,EAEA,CACI,KAAM,QACN,IAAK,GACL,IAAK,EACT,EAEA,CACI,KAAM,WACN,IAAK,GACL,IAAK,GACL,QAAUgB,GAAO,GAAGA,CAAE,GAAG,OAAO,GAAI,GAAG,EACvC,QAAUA,IAAQA,GAAU,YAAY,MAAM,EAAG,CAAC,CACtD,EAEA,CACI,KAAM,WACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,CACT,EAEA,CACI,KAAM,cACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,UACN,IAAK,CACT,EACA,CACI,KAAM,SACN,IAAK,EACL,QAAU0D,GAAWA,GAAU,EAC/B,QAAUA,GAAWA,EAAS,EAAI,CACtC,EACA,CACI,KAAM,UACN,IAAK,CACT,EACA,CACI,KAAM,kBACN,KAAM,GACN,IAAK,CACT,EAEA,CACI,KAAM,WACN,IAAK,EACL,IAAK,EAET,EAEA,CACI,KAAM,YACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,cACN,KAAM,GACN,IAAK,CACT,EACA,CACI,KAAM,UACN,IAAK,CACT,EAEA,CACI,KAAM,cACN,IAAK,EACL,IAAK,EAET,EACA,CACI,KAAM,UACN,IAAK,CACT,EAEA,CACI,KAAM,kBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,UACN,IAAK,CACT,EAEA,CACI,KAAM,eACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EAEA,CACI,KAAM,mBACN,IAAK,EACL,IAAK,EACL,IAAK,GACL,QAASb,GAAS,kBAClB,QAASlD,GAAS,iBACtB,EACA,CACI,KAAM,uBACN,IAAK,EACL,IAAK,EACT,EAEA,CACI,KAAM,UACN,IAAK,EACL,IAAK,EAET,EACA,CACI,KAAM,UACN,IAAK,CACT,EAEA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,EACT,EAEA,CACI,KAAM,WACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,UACN,IAAK,CACT,EACA,CACI,KAAM,UACN,IAAK,EACL,IAAK,CACT,EAEA,CACI,KAAM,mBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,UACN,IAAK,CACT,EAEA,CACI,KAAM,WACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,CACT,EAEA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,UACN,IAAK,CACT,EAEA,CACI,KAAM,YACN,IAAK,EACL,IAAK,EAET,EACA,CACI,KAAM,aACN,IAAK,EACL,IAAK,CACT,EAEA,CACI,KAAM,YACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,iBACN,IAAK,EACL,IAAK,EACT,EAEA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EAEA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,mBACN,IAAK,EACL,IAAK,EACT,EAEA,CACI,KAAM,eACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,aACN,IAAK,EACL,IAAK,CACT,EAEA,CACI,KAAM,eACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,oBACN,IAAK,EACL,IAAK,EACT,EAEA,CACI,KAAM,aACN,KAAM,GACN,IAAK,CACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,CACT,EAEA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,UACN,IAAK,CACT,EAEA,CACI,KAAM,cACN,KAAM,GACN,IAAK,GACT,CACJ,EACA,CAACX,GAAW,IAAI,EAAG,CACf,IAAK,GACL,GAAI,GACJ,YAAa,MACb,OAAQ,CAEJ,CACI,KAAM,UACN,IAAK,EACL,QAAS,IAAM,CACnB,EAEA,CACI,KAAM,UACN,IAAK,CACT,EACA,CACI,KAAM,UACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,SACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,eACN,KAAM,GACN,IAAK,CACT,EACA,CACI,KAAM,UACN,KAAM,GACN,IAAK,CACT,EAEA,CACI,KAAM,qBACN,IAAK,CACT,EACA,CACI,KAAM,qBACN,IAAK,CACT,EAEA,CACI,KAAM,UACN,IAAK,CACT,EACA,CACI,KAAM,iBACN,IAAK,EACL,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,UACN,IAAK,CACT,EAEA,CACI,KAAM,WACN,IAAK,GACL,IAAK,EACT,EAEA,CACI,KAAM,QACN,IAAK,GACL,IAAK,EACT,EAEA,CACI,KAAM,aACN,IAAK,GACL,IAAK,EACT,EAEA,CACI,KAAM,UACN,IAAK,EACT,EAGA,CACI,KAAM,GACN,IAAK,EACT,EACA,CACI,KAAM,SACN,IAAK,CACT,EACA,CACI,KAAM,aACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,WACN,IAAK,CACT,EACA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,YACN,KAAM,GACN,IAAK,CACT,EACA,CACI,KAAM,UACN,IAAK,CACT,EAGA,CACI,KAAM,OACN,KAAM,KACN,IAAK,GACT,EAEA,CACI,KAAM,SACN,IAAK,EACL,IAAK,GACT,EAEA,CACI,KAAM,SACN,IAAK,EACL,IAAK,GACT,EAEA,CACI,KAAM,YACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,UACN,IAAK,EACL,QAAU2E,GAAYA,GAAW,EACjC,QAAUA,GAAYA,EAAU,EAAI,CACxC,EAEA,CACI,KAAM,SACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,EACT,EAEA,CACI,KAAM,WACN,IAAK,EACL,IAAK,GACT,EAEA,CACI,KAAM,UACN,IAAK,CACT,EACA,CACI,KAAM,cACN,KAAM,GACN,IAAK,CACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,CACT,EAGA,CACI,KAAM,GACN,IAAK,EACT,EACA,CACI,KAAM,UACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,UACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,mBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,UACN,IAAK,CACT,EAGA,CACI,KAAM,GACN,IAAK,EACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,UACN,IAAK,CACT,EACA,CACI,KAAM,kBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,UACN,IAAK,CACT,EACA,CACI,KAAM,uBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,mBACN,IAAK,EACL,IAAK,EACL,IAAK,GACL,QAASd,GAAS,kBAClB,QAASlD,GAAS,iBACtB,EACA,CACI,KAAM,UACN,IAAK,CACT,EAGA,CACI,KAAM,GACN,IAAK,EACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,UACN,IAAK,CACT,EAGA,CACI,KAAM,GACN,IAAK,EACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,aACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EAGA,CACI,KAAM,GACN,IAAK,EACT,EACA,CACI,KAAM,iBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,UACN,IAAK,CACT,EAGA,CACI,KAAM,GACN,IAAK,EACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,aACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,oBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,UACN,IAAK,CACT,EAGA,CACI,KAAM,GACN,IAAK,EACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,mBACN,IAAK,EACL,IAAK,EACT,EAGA,CACI,KAAM,GACN,IAAK,EACT,EACA,CACI,KAAM,aACN,KAAM,GACN,IAAK,CACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,UACN,IAAK,CACT,EAGA,CACI,KAAM,cACN,KAAM,KACN,IAAK,GACT,CACJ,EACA,WAAasC,GAAMa,GAAW,gBAAgBb,EAAI,CAAC,EACnD,YAAaa,GAAW,gBAC5B,EACA,CAAC9D,GAAW,IAAI,EAAG,CACf,IAAK,IACL,QAAS4E,GACT,QAASC,GACT,UAAW7E,GAAW,IAC1B,EACA,CAACA,GAAW,IAAI,EAAG,CACf,IAAK,IACL,QAAS4E,GACT,QAASC,GACT,UAAW7E,GAAW,IAC1B,EACA,CAACA,GAAW,IAAI,EAAG,CACf,CACI,KAAM,WACN,IAAK,EACL,IAAK,GACT,EACA,CACI,KAAM,aACN,KAAM,GACN,IAAK,CACT,EACA,CACI,KAAM,SACN,IAAK,EACL,IAAK,GACT,EACA,CACI,KAAM,cACN,KAAM,GACN,IAAK,CACT,EACA,CACI,KAAM,SACN,IAAK,EACL,IAAK,GACT,EACA,CACI,KAAM,YACN,KAAM,GACN,IAAK,EACL,QAAU8E,GAASA,EAAO,UAAY,UACtC,QAAUC,GAASA,IAAO,SAC9B,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,SACN,IAAK,CACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAK,UACL,IAAI,CACR,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAK,UACL,IAAI,CACR,EACA,CACI,KAAM,aACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAK,UACL,IAAI,CACR,EACA,CACI,KAAM,aACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAK,UACL,IAAI,CACR,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,SACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,UACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAK,UACL,IAAI,EACJ,IAAI,CACR,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,iBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,oBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,mBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,UACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAK,UACL,IAAI,CACR,EACA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAK,UACL,IAAI,CACR,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,mBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,SACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,kBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,mBACN,IAAK,EACL,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,uBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,OACN,KAAM,KACN,IAAK,GACT,CACJ,CACJ,EACAhB,GAAc/D,GAAW,IAAI,EAAI,CAC7B,IAAK,GACL,OAAQ,CAAC,GAAG+D,GAAc/D,GAAW,IAAI,EAAE,OACvC,CACI,KAAM,UACN,IAAK,GACL,IAAK,CACT,EACA,CACI,KAAM,WACN,IAAK,EACT,CACJ,EACA,YAAa,MACb,QAAUiD,GAAQtC,GAAS,UAAUsC,CAAG,EACxC,WAAaA,GAAMa,GAAW,gBAAgBb,EAAI,CAAC,EACnD,YAAaa,GAAW,gBAC5B,EACAC,GAAc/D,GAAW,GAAG,EAAI,CAE5B,CACI,KAAM,YACN,IAAK,IACL,KAAM,IACV,EACA,CACI,KAAM,WACN,IAAK,IACL,KAAM,IACV,EACA,CACI,KAAM,aACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,UACN,IAAK,CACT,EACA,CACI,KAAM,UACN,IAAK,EACL,KAAM,EACV,EACA,CACI,KAAM,WACN,IAAK,CACT,EACA,CACI,KAAM,UACN,IAAK,CACT,EAEA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,UACN,IAAK,CACT,EACA,CACI,KAAM,UACN,IAAK,EACT,EACA,CACI,KAAM,cACN,IAAK,IACL,KAAM,IACV,EACA,CACI,KAAM,UACN,IAAK,EACT,EACA,CACI,KAAM,WACN,IAAK,GACL,IAAK,EACT,EACA,CACI,KAAM,QACN,IAAK,GACL,IAAK,EACT,EACA,CACI,KAAM,UACN,IAAK,EACT,EAEA,CACI,KAAM,YACN,IAAK,IACL,IAAK,EACT,EACA,CACI,KAAM,YACN,IAAK,IACL,IAAK,EACT,EACA,CACI,KAAM,WACN,IAAK,GACL,IAAK,EACT,EACA,CACI,KAAM,aACN,IAAK,GACL,IAAK,EACT,EACA,CACI,KAAM,aACN,IAAK,IACL,IAAK,CACT,EACA,CACI,KAAM,aACN,IAAK,IACL,IAAK,CACT,EACA,CACI,KAAM,eACN,IAAK,IACL,IAAK,CACT,EACA,CACI,KAAM,YACN,IAAK,IACL,IAAK,CACT,EACA,CACI,KAAM,cACN,IAAK,IACL,IAAK,CACT,EACA,CACI,KAAM,kBACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,sBACN,IAAK,EACL,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,oBACN,IAAK,EACL,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,4BACN,IAAK,EACL,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,sBACN,IAAK,EACL,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,qBACN,IAAK,EACL,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,eACN,IAAK,GACL,IAAK,GACT,EACA,CACI,KAAM,YACN,IAAK,IACL,IAAK,EACT,EACA,CACI,KAAM,aACN,IAAK,IACL,KAAM,IACV,EACA,CACI,KAAM,UACN,IAAK,EACT,EACA,CACI,KAAM,WACN,IAAK,EACT,CACJ,EAEMG,GAAU,CAEZ,CAACH,GAAW,GAAG,EAAG,CACd,IAAK,GACL,YAAa,MACb,OAAQ+D,GAAc/D,GAAW,GAAG,EACpC,WAAY8D,GAAW,cACvB,YAAcb,GAAQa,GAAW,eAAeb,EAAK,CAAC,CAC1D,EACA,CAACjD,GAAW,GAAG,EAAG,CACd,IAAK,GACL,YAAa,MACb,OAAQ,CAAC,GAAG+D,GAAc/D,GAAW,GAAG,EAExC,CACI,KAAM,WACN,IAAK,EACT,CACA,EACA,WAAY8D,GAAW,cACvB,YAAcb,GAAQa,GAAW,eAAeb,EAAK,CAAC,EACtD,QAAUA,GAAQtC,GAAS,UAAUsC,CAAG,CAC5C,EAEA,CAACjD,GAAW,GAAG,EAAG,CACd,YAAa,MACb,IAAK,GACL,GAAI,GACJ,OAAQ+D,GAAc/D,GAAW,GAAG,EACpC,WAAY8D,GAAW,cACvB,YAAcb,GAAQa,GAAW,eAAeb,EAAK,CAAC,CAC1D,EACA,CAACjD,GAAW,GAAG,EAAG,CACd,YAAa,MACb,IAAK,GACL,GAAI,GACJ,OAAQ,CAAC,GAAG+D,GAAc/D,GAAW,GAAG,EAExC,CACI,KAAM,WACN,IAAK,EACT,CACA,EACA,WAAY8D,GAAW,cACvB,YAAcb,GAAQa,GAAW,eAAeb,EAAK,CAAC,EACtD,QAAUA,GAAQtC,GAAS,UAAUsC,CAAG,CAC5C,EAGA,CAACjD,GAAW,IAAI,EAAG+D,GAAc/D,GAAW,IAAI,EAChD,CAACA,GAAW,IAAI,EAAG+D,GAAc/D,GAAW,IAAI,EAChD,CAACA,GAAW,IAAI,EAAG+D,GAAc/D,GAAW,IAAI,EAChD,CAACA,GAAW,IAAI,EAAG,GAAAgF,QAAO,UAAUjB,GAAc/D,GAAW,IAAI,CAAC,EAClE,CAACA,GAAW,IAAI,EAAG,GAAAgF,QAAO,UAAUjB,GAAc/D,GAAW,IAAI,CAAC,EAClE,CAACA,GAAW,IAAI,EAAG,GAAAgF,QAAO,UAAUjB,GAAc/D,GAAW,IAAI,CAAC,EAGlE,CAACA,GAAW,IAAI,EAAG,CACf,IAAK,IACL,OAAQ,CACJ,CACI,KAAM,cACN,IAAK,EACL,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,qBACN,IAAK,EACL,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,eACN,IAAK,GACL,IAAK,EACT,EACA,CACI,KAAM,eACN,IAAK,GACL,IAAK,EACT,EACA,CACI,KAAM,cACN,KAAM,KACN,IAAK,GACT,EACA,CACI,KAAM,OACN,KAAM,KACN,IAAK,GACT,EACA,CACI,KAAM,aACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,aACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,gBACN,IAAK,GACL,IAAK,IACT,EACA,CACI,KAAM,SACN,IAAK,EACL,IAAK,GACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,kBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,uBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,mBACN,IAAK,EACL,IAAK,EACL,IAAK,GACL,QAAS6D,GAAS,kBAClB,QAASlD,GAAS,iBACtB,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,UACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,UACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,mBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,SACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,qBACN,IAAK,EACL,QAAUsE,GAAQA,IAAQ,IAAM,GAAKA,EACrC,QAAUA,GAAQA,IAAQ,GAAK,IAAMA,CACzC,EACA,CACI,KAAM,YACN,KAAM,GACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,UACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,SACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,mBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,cACN,KAAM,GACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,GACT,EACA,CACI,KAAM,uBACN,IAAK,EACL,QAAUA,GAAQA,IAAQ,IAAM,GAAKA,EACrC,QAAUA,GAAQA,IAAQ,GAAK,IAAMA,CACzC,EACA,CACI,KAAM,qBACN,IAAK,EACL,QAAUA,GAAQA,IAAQ,IAAM,GAAKA,EACrC,QAAUA,GAAQA,IAAQ,GAAK,IAAMA,CACzC,EACA,CACI,KAAM,cACN,IAAK,EACL,QAAUA,GAAQA,IAAQ,IAAM,GAAKA,EACrC,QAAUA,GAAQA,IAAQ,GAAK,IAAMA,CACzC,EACA,CACI,KAAM,SACN,IAAK,EACL,IAAK,GACT,EACA,CACI,KAAM,eACN,IAAK,EACL,QAAUA,GAAQA,IAAQ,IAAM,GAAKA,EACrC,QAAUA,GAAQA,IAAQ,GAAK,IAAMA,CACzC,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,aACN,KAAM,GACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,aACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,iBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,oBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,iBACN,IAAK,EACL,QAAUA,GAAQA,IAAQ,IAAM,GAAKA,EACrC,QAAUA,GAAQA,IAAQ,GAAK,IAAMA,CACzC,EACA,CACI,KAAM,kBACN,IAAK,EACL,QAAUA,GAAQA,IAAQ,IAAM,GAAKA,EACrC,QAAUA,GAAQA,IAAQ,GAAK,IAAMA,CACzC,EACA,CACI,KAAM,iBACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,iBACN,IAAK,EACL,QAAUA,GAAQA,IAAQ,IAAM,GAAKA,EACrC,QAAUA,GAAQA,IAAQ,GAAK,IAAMA,CACzC,EACA,CACI,KAAM,YACN,KAAM,GACN,IAAK,EACL,IAAK,EACL,QAAUH,GAASA,EAAO,UAAY,UACtC,QAAUC,GAASA,IAAS,SAChC,EACA,CACI,KAAM,kBACN,KAAM,GACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,gBACN,KAAM,GACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,kBACN,IAAK,EACL,QAAUE,GAAQA,IAAQ,IAAM,GAAKA,EACrC,QAAUA,GAAQA,IAAQ,GAAK,IAAMA,CACzC,EACA,CACI,KAAM,iBACN,IAAK,EACL,QAAUA,GAAQA,IAAQ,IAAM,GAAKA,EACrC,QAAUA,GAAQA,IAAQ,GAAK,IAAMA,CACzC,EACA,CACI,KAAM,wBACN,IAAK,EACL,QAAUA,GAAQA,IAAQ,IAAM,GAAKA,EACrC,QAAUA,GAAQA,IAAQ,GAAK,IAAMA,CACzC,EACA,CACI,KAAM,uBACN,IAAK,EACL,QAAUA,GAAQA,IAAQ,IAAM,GAAKA,EACrC,QAAUA,GAAQA,IAAQ,GAAK,IAAMA,CACzC,CACJ,CACJ,EAGA,CAACjF,GAAW,OAAO,EAAG,CAClB,IAAK,IACL,YAAa,MACb,OAAQ,CACJ,GAAG+D,GAAc/D,GAAW,IAAI,EAAE,OAClC,CACI,KAAM,cACN,IAAK,IACL,IAAK,GACL,QAAUkF,GAAQ,OAAO,KAAKA,EAAK,KAAK,EAAE,SAAS,OAAO,EAC1D,QAAUjD,GAAU,OAAOA,GAAU,SAAW,OAAO,KAAKA,EAAO,OAAO,EAAE,SAAS,KAAK,EAAI,EAClG,CACJ,EACA,QAASvB,IACT,WAAauC,GAAMa,GAAW,gBAAgBb,EAAI,CAAC,EACnD,YAAaa,GAAW,gBAC5B,EACA,CAAC9D,GAAW,QAAQ,EAAG,CACnB,IAAK,IACL,QAAS4E,GACT,QAASC,GACT,UAAW7E,GAAW,OAC1B,EACA,CAACA,GAAW,EAAE,EAAG,CACb,IAAK,IACL,YAAa,MACb,OAAQ,CACJ,GAAG+D,GAAc/D,GAAW,IAAI,EAAE,OAClC,CACI,KAAM,UACN,IAAK,GACT,EACA,CACI,KAAM,SACN,IAAK,IACL,KAAK,IACT,EACA,CACI,KAAM,UACN,IAAK,GACT,CACJ,EACA,QAASY,IACT,WAAaqC,GAAMa,GAAW,gBAAgBb,EAAI,CAAC,EACnD,YAAaa,GAAW,gBAC5B,EACA,CAAC9D,GAAW,GAAG,EAAG,CACd,IAAK,IACL,QAAS4E,GACT,QAASC,GACT,UAAW7E,GAAW,EAC1B,EAEA,CAACA,GAAW,GAAG,EAAG,CACd,IAAK,IACL,YAAa,MACb,OAAQ,CAAC,GAAG+D,GAAc/D,GAAW,IAAI,EAAE,OAAQ,GAAG+D,GAAc/D,GAAW,GAAG,CAAC,EACnF,QAAUiD,GAAQtC,GAAS,UAAUsC,EAAK,EAAE,EAC5C,WAAakC,GAAIrB,GAAW,gBAAgBqB,EAAE,CAAC,EAC/C,YAAarB,GAAW,gBAC5B,EAEA,CAAC9D,GAAW,GAAG,EAAG,CACd,IAAK,IACL,YAAa,MACb,OAAQ,CAAC,GAAG+D,GAAc/D,GAAW,IAAI,EAAE,OAAQ,GAAG+D,GAAc/D,GAAW,GAAG,CAAC,EACnF,QAAUiD,GAAQtC,GAAS,UAAUsC,EAAK,EAAE,EAC5C,WAAakC,GACFrB,GAAW,gBAAgBqB,EAAE,CAAC,EAEzC,YAAcC,GAAM,CAChBA,EAAItB,GAAW,iBAAiBsB,CAAG,EASnC,IAAMC,EAAS,OACV,WAAW,OAAQ,OAAO,KAAK,6BAA8B,OAAO,CAAC,EACrE,OAAO,OAAO,KAAKD,GAAK,IAAI,QAAQ,IAAI,GAAI,KAAK,CAAC,EAClD,OAAO,EAENE,EAAK,OAAOD,EAAO,aAAa,CAAC,CAAC,GAAK,IAAO,OAAOA,EAAO,aAAa,CAAC,CAAC,EAC3EE,EAAY,OAAOC,GAAgB,MAAM,EACzCC,EAAQD,GAAgB,OAAOF,EAAIC,CAAS,CAAC,EAC7CG,EAAQF,GAAgB,QAAQF,GAAK,KAAOC,CAAS,CAAC,EACtDI,EAAO,QAAQL,GAAK,KAAO,KAAK,EAChCM,EAAO,QAAQN,GAAK,KAAO,KAAK,EAEtC,OAAAF,EAAI,GAAG,OAAO,GAAG,SAAS,GAAGA,EAAI,GAAG,OAAO,IAAI;AAAA,EAAYO,CAAI,IAAIC,CAAI,IAAIF,CAAK;AAAA,EAAWD,CAAK,SAYzFL,CACX,CACJ,EACA,CAACpF,GAAW,GAAG,EAAG,CACd,IAAK,IACL,QAAS4E,GACT,QAASC,GACT,UAAW7E,GAAW,GAC1B,EAIA,CAACA,GAAW,IAAI,EAAG,CACf,IAAK,GACL,OAAQ+D,GAAc/D,GAAW,IAAI,CACzC,EACA,CAACA,GAAW,IAAI,EAAG,CACf,IAAK,GACL,OAAQ,CAAC,GAAG+D,GAAc/D,GAAW,IAAI,EACzC,CACI,KAAM,QACN,IAAK,GACL,IAAK,IACL,QAAQW,GAAS,QACrB,EACA,CACI,KAAM,WACN,IAAK,EACT,EACA,CACI,KAAM,iBACN,IAAK,GACL,IAAK,EACT,CACA,EACA,QAAU0D,GAAQ,CACd,IAAMwB,EAAiBxB,EAAI,SAASA,EAAI,OAAS,CAAC,EAClDA,EAAMA,EAAI,SAAS,EAAGA,EAAI,OAAS,CAAC,EACpC,IAAIhC,EAAM,EACV,QAASC,EAAI,EAAGA,EAAI+B,EAAI,OAAQ/B,IAAK,CACjCD,GAAOgC,EAAI/B,CAAC,GAAK,EACjB,QAASM,EAAI,EAAGA,EAAI,EAAGA,IACnBP,EAAOA,EAAM,MAAYA,GAAO,EAAK,KAAWA,GAAO,EACvDA,GAAO,KAEf,CAEAA,GAAQA,EAAM,MAAS,EAAOA,IAAQ,EAAK,IAC3C,IAAMyD,EAAgB,OAAO,MAAM,CAAC,EACpC,OAAAA,EAAc,cAAczD,EAAK,CAAC,EAC3B,OAAO,OAAO,CAACgC,EAAKyB,EAAeD,CAAc,CAAC,CAC7D,CAEJ,EACA,CAAC7F,GAAW,QAAQ,EAAG,CACnB,IAAK,GACL,OAAQ,CACJ,CACI,KAAM,QACN,IAAK,GACL,IAAK,IACL,QAAQW,GAAS,QACrB,EACA,CACI,KAAM,OACN,KAAM,KACN,IAAK,GACT,EACA,CACI,KAAM,UACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,SACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,SACN,IAAK,EACL,IAAK,GACT,EACA,CACI,KAAM,SACN,IAAK,EACL,IAAK,GACT,EACA,CACI,KAAM,YACN,KAAM,GACN,IAAK,EACL,IAAK,EACL,QAAUmE,GAASA,EAAO,UAAY,UACtC,QAAUC,GAASA,IAAO,SAC9B,EACA,CACI,KAAM,SACN,IAAK,CACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,SACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,GACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,cACN,KAAM,GACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,UACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,UACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,mBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,kBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,uBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,mBACN,IAAK,EACL,IAAK,EACL,IAAK,GACL,QAASlB,GAAS,kBAClB,QAASlD,GAAS,iBACtB,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,aACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,iBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,aACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,oBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,mBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,aACN,KAAM,GACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,UACN,IAAK,EACL,QAAQ,IAAI,CAChB,CACJ,CACJ,EAEA,CAACX,GAAW,IAAI,EAAG,CACf,IAAK,GACL,OAAQ,CACJ,CACI,KAAM,aACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,SACN,IAAK,EACL,IAAK,GACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,UACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,UACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,mBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,kBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,uBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,mBACN,IAAK,EACL,IAAK,EACL,IAAK,GACL,QAAS6D,GAAS,kBAClB,QAASlD,GAAS,iBACtB,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,SACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,SACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,mBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,cACN,KAAM,GACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,GACT,EACA,CACI,KAAM,SACN,IAAK,EACL,IAAK,GACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,aACN,KAAM,GACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,cACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,aACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,YACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,iBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,eACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,oBACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,CACT,EACA,CACI,KAAM,WACN,IAAK,EACL,IAAK,EACT,EACA,CACI,KAAM,gBACN,IAAK,EACL,IAAK,EACT,CACJ,CACJ,EACA,CAACX,GAAW,KAAK,EAAG,CAChB,IAAK,GACL,QAAS+F,GACT,QAASC,GACT,UAAWhG,GAAW,IAC1B,EAGA,CAACA,GAAW,IAAI,EAAG,CACf,IAAK,IACL,QAAUiD,GAAQzC,GAAqByC,CAAG,EAC1C,UAAWjD,GAAW,IAE1B,EACA,CAACA,GAAW,QAAQ,EAAG,CACnB,IAAK,IACL,QAAUiD,GAAQzC,GAAqByC,CAAG,EAC1C,UAAWjD,GAAW,IAC1B,EACA,CAACA,GAAW,aAAa,EAAG,CACxB,IAAK,IACL,QAAUiD,GAAQA,EAAI,MAAM,GAAI,GAAG,EACnC,UAAWjD,GAAW,IAC1B,CACJ,EACMK,GAAW,CACb,OAAU,iBACV,WAAc,qBACd,SAAY,mBACZ,cAAiB,wBACjB,OAAU,iBACV,OAAU,iBAEV,OAAU,eACV,gBAAmB,wBACnB,UAAa,kBACb,aAAgB,qBAChB,QAAW,gBACX,QAAW,gBAEX,KAAQ,YACR,UAAa,YACb,YAAe,mBACf,MAAS,aACT,SAAY,gBACZ,QAAW,eACX,OAAU,cACV,eAAkB,sBAElB,YAAe,eACf,mBAAsB,sBACtB,aAAgB,gBAChB,aAAgB,gBAChB,cAAiB,iBACjB,mBAAsB,sBACtB,qBAAwB,yBACxB,mBAAsB,uBACtB,YAAe,gBACf,aAAgB,gBAChB,eAAkB,kBAClB,gBAAmB,mBACnB,eAAkB,kBAClB,eAAkB,kBAClB,gBAAmB,mBACnB,cAAiB,iBACjB,gBAAmB,mBACnB,eAAkB,kBAClB,sBAAyB,0BACzB,qBAAwB,yBAExB,mBAAsB,iBACtB,mBAAsB,iBACtB,WAAc,kBACd,eAAkB,sBAElB,SAAY,YACZ,UAAa,aACb,YAAe,eACf,OAAU,cAEV,SAAY,YACZ,UAAa,aACb,YAAe,eAEf,YAAe,gBACf,gBAAmB,oBACnB,aAAgB,iBAChB,YAAe,gBACf,iBAAoB,qBACpB,qBAAwB,yBACxB,cAAiB,kBAEjB,QAAW,YACX,YAAe,gBACf,SAAY,aACZ,QAAW,YACX,iBAAoB,qBACpB,UAAa,cACb,aAAgB,iBAEhB,SAAY,YACZ,SAAY,YACZ,cAAiB,iBAEjB,UAAa,aACb,UAAa,aACb,eAAkB,kBAClB,YAAe,eACf,WAAc,cAEd,YAAe,eACf,aAAgB,gBAChB,iBAAoB,oBACpB,YAAe,eAEf,UAAa,aACb,WAAc,cACd,aAAgB,sBAChB,aAAgB,sBAChB,kBAAqB,2BAErB,WAAc,UACd,SAAY,YACZ,cAAiB,iBACjB,cAAiB,iBAGjB,UAAa,eACb,SAAY,cACZ,YAAe,kBACf,QAAW,mBACX,YAAe,iBACf,UAAa,kBACb,UAAa,kBACb,UAAa,kBACb,MAAQ,qBACR,MAAQ,qBACR,OAAS,oBACT,OAAS,oBACT,SAAY,kBACZ,WAAc,WACd,WAAc,iBACd,WAAc,iBACd,aAAgB,mBAChB,UAAa,gBACb,YAAe,kBACf,gBAAmB,sBACnB,oBAAuB,0BACvB,kBAAqB,wBACrB,0BAA6B,gCAC7B,oBAAuB,0BACvB,mBAAsB,yBACtB,WAAc,iBACd,QAAW,aACX,SAAY,qBACZ,MAAS,kBACT,aAAgB,kBAGhB,SAAY,yBACZ,cAAiB,kCACjB,UAAa,6BACb,cAAiB,mCACjB,cAAiB,mCACjB,WAAc,+BACd,eAAkB,mCAClB,cAAiB,kCACjB,SAAY,yBACZ,cAAiB,kCACjB,UAAa,6BACb,cAAiB,mCACjB,cAAiB,mCACjB,WAAc,+BACd,eAAkB,mCAClB,cAAiB,kCACjB,UAAa,6BACb,WAAc,gBACd,eAAkB,oBAClB,iBAAoB,wBACpB,UAAa,oBACb,YAAe,UAGf,OAAS,WACb,EAEAF,GAAQH,GAAW,IAAI,EAAE,WAAYiD,GAAMa,GAAW,gBAAgBb,EAAI,CAAC,EAC3E9C,GAAQH,GAAW,IAAI,EAAE,WAAYiD,GAAMa,GAAW,gBAAgBb,EAAI,CAAC,EAC3E9C,GAAQH,GAAW,IAAI,EAAE,UAAUA,GAAW,KAC9CG,GAAQH,GAAW,IAAI,EAAE,OAAO,CAAC,EAAE,CAC/B,KAAM,iBACN,IAAK,EACL,IAAK,EACL,IAAK,CACT,EACAG,GAAQH,GAAW,IAAI,EAAE,OAAO,CAAC,EAAE,CAC/B,KAAM,iBACN,IAAK,EACL,IAAK,EACL,IAAK,CACT,EAIME,GAAkB,CACpB,OAAU,GACV,OAAU,GAIV,OAAU,GACV,QAAW,GACX,QAAW,GAEX,KAAQ,UACR,KAAQ,UACR,eAAkB,EAClB,YAAe,EACf,mBAAsB,EACtB,mBAAsB,GACtB,qBAAwB,GACxB,mBAAsB,GACtB,YAAe,GACf,aAAgB,GAChB,eAAkB,GAClB,gBAAmB,GACnB,eAAkB,GAClB,gBAAmB,GACnB,cAAiB,GACjB,gBAAmB,GACnB,eAAkB,GAClB,sBAAyB,GACzB,qBAAwB,GAExB,SAAY,CAAC,GAAM,EAAI,EACvB,UAAa,EAEb,YAAe,CAAC,EAAG,CAAC,EACpB,gBAAmB,EACnB,aAAgB,EAChB,YAAe,EACf,iBAAoB,EACpB,qBAAwB,EACxB,cAAiB,EAEjB,QAAW,CAAC,EAAG,CAAC,EAChB,SAAY,EACZ,YAAe,CAAC,EAAG,CAAC,EACpB,QAAW,EACX,iBAAoB,EACpB,UAAa,EACb,aAAgB,GAEhB,SAAY,EACZ,SAAY,EACZ,cAAiB,EAEjB,UAAa,GACb,WAAc,GACd,UAAa,EACb,eAAkB,GAClB,YAAe,EAEf,iBAAoB,GACpB,YAAe,EACf,aAAgB,EAEhB,aAAgB,EAChB,kBAAqB,GACrB,WAAc,EAEd,SAAY,EACZ,cAAiB,GACjB,cAAiB,EAEjB,UAAa,UACb,SAAY,UACZ,WAAc,UACd,SAAY,OACZ,MAAS,OACT,WAAc,GACd,WAAc,GACd,aAAgB,GAChB,UAAa,GACb,YAAe,GACf,oBAAuB,EACvB,kBAAqB,EACrB,0BAA6B,EAC7B,oBAAuB,EACvB,mBAAsB,EACtB,QAAW,GACX,aAAgB,wCACpB,ICxmHA,IAAA+F,GAAAC,GAAA,CAAAC,IAAAC,KAAA,CAOAA,GAAO,QAAU,SAAmBC,EAAK,CACvC,OAAO,OAAOA,GAAQ,UACjB,YAAY,KAAKA,CAAG,CAC3B,ICVA,IAAAC,GAAAC,GAAA,CAAAC,IAAAC,KAAA,CAOA,IAAIC,IAAY,KAEhBD,GAAO,QAAU,SAAgBE,EAAK,CACpC,OAAO,OAAOA,GAAQ,WAChB,gBAAgB,KAAKA,CAAG,GACxBD,IAAUC,CAAG,EACrB,ICbA,IAAAC,GAAAC,GAAA,CAAAC,IAAAC,KAAA,cASA,IAAIC,IAAS,KACTC,IAAK,kBAETF,GAAO,QAAU,SAAUG,EAAK,CAC9B,OAAQ,OAAOA,GAAQ,UAAaF,IAAOE,CAAG,GAAKD,IAAG,KAAKC,CAAG,CAChE,ICdA,IAAAC,GAAAC,GAAA,CAAAC,IAAAC,KAAA,cASA,IAAIC,IAAgB,KAEpBD,GAAO,QAAU,SAAUE,EAAK,CAC9B,OAAOD,IAAcC,CAAG,IAAM,EAChC,ICbA,IAAAC,GAAA,GAAAC,GAAAD,GAAA,4BAAAE,IAAA,oCAAAC,IAAA,sBAAAC,IAAA,kCAAAC,IAAA,4BAAAC,GAAA,4BAAAC,MAAA,SAASD,GAAwBE,EAAO,CAEpC,IAAMC,EAAc,GAAM,kBAAYD,EACtC,MAAO,CACH,KAAM,KAAK,MAAMC,EAAc,EAAE,EACjC,OAAQ,KAAK,MAAMA,EAAc,EAAE,EACnC,YAAAA,EAEA,YAAa,KAAK,MAAMA,EAAc,IAAI,CAC9C,CACJ,CACA,SAASL,IAAkBK,EAAa,CACpC,OAASA,EAAc,IAAM,IAAO,EACxC,CACA,SAASP,IAAuBQ,EAAkB,CAC9C,OAAS,KAAK,MAAMA,EAAmB,IAAI,EAAI,IAAM,IAAO,EAChE,CAMA,SAASC,IAAoBC,EAAG,CAE5B,OAAIA,GAAK,GACEC,IAAW,GAAKD,IAAMC,GAAUC,IAAW,GAE3CD,IAAWD,EAAI,KAAOG,GAAUF,IAAW,EAE1D,CACA,SAASN,IAAwBS,EAAcC,EAAW,CAWtD,IAAMC,EAAIZ,GAAwBU,CAAY,EAAE,YAC1CG,EAAMR,IAAoBM,CAAS,EACzC,MAAO,CACH,OAAQE,GAAOD,EAAIA,GAAK,IACxB,UAAW,KAAK,MAAOC,GAAOD,EAAIA,GAAK,IAAO,QAAS,CAC3D,CACJ,CACA,SAASf,IAAgCa,EAAcI,EAAW,CAC9D,IAAMF,EAAIZ,GAAwBU,CAAY,EAAE,YAC1CG,EAAMC,EAAY,KAAOF,EAAIA,GAEnC,OAAIC,GAAON,GACA,GAAK,IAAMA,GAAUM,IAAQN,GAAUC,IAGvC,GAAK,IAAMK,EAAMN,KAAYE,GAAUF,GAEtD,CACA,SAASR,IAA8BgB,EAAmBC,EAAiB,CACvE,IAAMN,EAAe,KAAK,MAAMK,EAAoB,IAAI,EAClDD,EAAY,KAAK,MAAME,EAAkB,QAAS,EAClDJ,EAAIZ,GAAwBU,CAAY,EAAE,YAC1CG,EAAMC,EAAY,KAAOF,EAAIA,GAEnC,OAAIC,GAAON,GACA,GAAK,IAAMA,GAAUM,IAAQN,GAAUC,IAGvC,GAAK,IAAMK,EAAMN,KAAYE,GAAUF,GAEtD,CAvEA,IAmBMC,GACAD,GACAE,GArBNQ,GAAAC,GAAA,KAmBMV,GAAU,GACVD,GAAU,GACVE,GAAU,KCrBhB,IAAAU,GAAA,GAAAC,GAAAD,GAAA,WAAAE,GAAA,qBAAAC,GAAA,UAAAC,MAUA,SAASC,GAAOC,EAAOC,EAAK,CACxB,QAASC,EAAI,EAAGA,EAAIF,EAAM,OAAQE,IAC9B,QAASC,EAAI,EAAGA,EAAIH,EAAME,CAAC,EAAE,OAAQC,IACjC,GAAIH,EAAME,CAAC,EAAEC,CAAC,IAAMF,EAChB,MAAO,CAACE,EAAGD,CAAC,EAIxB,MAAO,CAAC,GAAI,EAAE,CAClB,CACA,SAASE,IAAeJ,EAAOC,EAAKI,EAAOC,GAAa,WAAW,QAAS,CACxE,IAAMC,EAAQP,EAAM,QAAQC,CAAG,EAC/B,OAAOM,IAAU,GAAK,CAAC,GAAI,EAAE,EAAIR,GAAOM,EAAME,CAAK,CACvD,CACA,SAASC,GAAeC,EAAKC,EAAM,CAC/B,GAAI,CACA,IAAMC,EAAQD,EAAK,MAAM,GAAG,EACxBE,EAAUH,EACd,QAAWI,KAAQF,EAAO,CACtB,GAA6BC,GAAY,KACrC,OAEJA,EAAUA,EAAQC,CAAI,CAC1B,CACA,OAAOD,CACX,MACU,CACN,OAAO,IACX,CACJ,CAEA,SAASE,GAAeL,EAAKM,EAAKC,EAAO,CACrC,GAAI,CACA,IAAMC,EAAOF,EAAI,MAAM,GAAG,EACpBG,EAAUD,EAAK,IAAI,EAEnBE,EAASF,EAAK,OAAO,CAACL,EAASG,MAC7B,CAACH,EAAQG,CAAG,GAAK,OAAOH,EAAQG,CAAG,GAAM,UAAY,MAAM,QAAQH,EAAQG,CAAG,CAAC,KAC/EH,EAAQG,CAAG,EAAI,CAAC,GAEbH,EAAQG,CAAG,GACnBN,CAAG,EAEN,OAAAU,EAAOD,CAAO,EAAIF,EACXP,CACX,MACU,CACN,MAAM,IAAI,MAAM,GAAGM,CAAG,kBAAkB,CAC5C,CACJ,CACA,SAASK,IAAkBX,EAAKC,EAAM,CAClC,IAAMC,EAAQD,EAAK,MAAM,GAAG,EACxBE,EAAUH,EAEd,QAASY,EAAI,EAAGA,EAAIV,EAAM,OAAS,EAAGU,IAAK,CAEvC,GADIT,GAAW,MACX,CAACA,EAAQ,eAAeD,EAAMU,CAAC,CAAC,EAAG,OACvCT,EAAUA,EAAQD,EAAMU,CAAC,CAAC,CAC9B,CAEA,OAAOT,EAAQD,EAAMA,EAAM,OAAS,CAAC,CAAC,CAC1C,CAEA,SAASW,IAAcC,EAAGC,EAAG,CACzB,GAAI,MAAM,QAAQD,CAAC,GAAK,MAAM,QAAQC,CAAC,EAAG,CACtC,GAAID,EAAE,SAAWC,EAAE,OAAQ,MAAO,GAClC,QAASH,EAAI,EAAGA,EAAIE,EAAE,OAAQF,IAAK,GAAIE,EAAEF,CAAC,IAAMG,EAAEH,CAAC,EAAG,MAAO,GAC7D,MAAO,EACX,CACA,OAAOE,IAAMC,CACjB,CACA,SAASC,IAAcV,EAAKW,EAAY,CACpC,OAAIC,GAAgB,eAAeZ,CAAG,EAAUY,GAAgBZ,CAAG,EAE/D,OAAOW,GAAe,UAAkB,GACrC,CACX,CA+CA,SAASE,GAAcvB,EAAMF,EAAGD,EAAG,CAC/B,QAASmB,EAAI,EAAGA,EAAIhB,EAAK,OAAQgB,IAAK,CAClC,IAAIQ,EAAM9B,GAAOM,EAAMgB,CAAC,EACxB,GAAIQ,EAAI,CAAC,IAAM1B,GAAK0B,EAAI,CAAC,IAAM3B,EAC3B,OAAOmB,CAEf,CACA,OAAO,IACX,CAGA,SAASS,GAAkBC,EAASC,EAAS7B,EAAG8B,EAAK,CACjD,QAASZ,EAAI,EAAGA,EAAIU,EAAQ,OAAQV,IAChC,GAAIU,EAAQV,CAAC,IAAMlB,GAAK6B,EAAQX,CAAC,IAAMY,EACnC,OAAOZ,EAGf,OAAO,IACX,CAEA,SAASzB,GAAMsC,EAAKC,EAAMC,EAAO,CAI7B,OAHGC,GAAS,eAAeD,CAAK,IAC5BA,EAAMC,GAASD,CAAK,GAEhBA,EAAO,CAEX,IAAK,aACD,OAAQD,EAAM,CACV,KAAKG,GAAe,IAChB,OAAOJ,EAAI,KAAK,MAAQ,EAClB,CAACA,EAAI,KAAK,MAAQ,EAAG,CAAC,EACtB,CAACA,EAAI,KAAK,MAAO,CAAC,EAC5B,KAAKI,GAAe,GACpB,KAAKA,GAAe,KAAK,EACrB,MAAO,CAACJ,EAAI,KAAK,KAAK,EAC1B,KAAKI,GAAe,KAChB,MAAO,CACH,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EAAEJ,EAAI,KAAK,KAAK,EACjC,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EAAEA,EAAI,KAAK,KAAK,CACrC,EACJ,KAAKI,GAAe,OACpB,KAAKA,GAAe,QAChB,IAAIC,EAAKjC,GAAa,OAAO,WAAW4B,EAAI,KAAK,KAAK,EACtD,OAAOK,EAAK,EACN,CAACA,EAAK,EAAG,CAAC,EACV,CAACA,EAAI,CAAC,CACpB,CACJ,IAAK,YACD,MAAO,CAACC,GAAWL,CAAI,EAAED,EAAI,KAAK,IAAI,EAAGO,GAAQN,CAAI,EAAED,EAAI,KAAK,IAAI,CAAC,EACzE,IAAK,cACD,MAAO,CAACM,GAAWL,CAAI,EAAED,EAAI,KAAK,MAAM,EAAGO,GAAQN,CAAI,EAAED,EAAI,KAAK,MAAM,CAAC,EAC7E,IAAK,eACD,MAAO,CAACM,GAAWL,CAAI,EAAED,EAAI,KAAK,OAAO,EAAGO,GAAQN,CAAI,EAAED,EAAI,KAAK,OAAO,CAAC,EAG/E,IAAK,YACD,OAAQC,EAAM,CACV,KAAKG,GAAe,GACpB,KAAKA,GAAe,IAChB,IAAII,EAAO3C,GAAOO,GAAa,MAAM,KAAK,IAAK4B,EAAI,KAAK,IAAI,EACxDS,EAAU5C,GAAOO,GAAa,WAAW,QAASoC,EAAK,CAAC,CAAC,EAC7D,MAAO,CAACA,EAAK,CAAC,EAAGC,EAAQ,CAAC,EAAGA,EAAQ,CAAC,CAAC,EAC3C,KAAKL,GAAe,KAAK,EACzB,KAAKA,GAAe,KAChB,IAAII,EAAO3C,GAAOO,GAAa,MAAM,KAAK,KAAK,EAAG4B,EAAI,KAAK,IAAI,EAC3DS,EAAU5C,GAAOO,GAAa,WAAW,QAASoC,EAAK,CAAC,CAAC,EAC7D,MAAO,CAACA,EAAK,CAAC,EAAGC,EAAQ,CAAC,EAAGA,EAAQ,CAAC,CAAC,EAC3C,KAAKL,GAAe,OACpB,KAAKA,GAAe,QAChB,MAAO,CACHvC,GAAOO,GAAa,MAAM,MAAO4B,EAAI,KAAK,IAAI,EAAE,CAAC,EACjDnC,GAAOO,GAAa,MAAM,MAAO4B,EAAI,KAAK,IAAI,EAAE,CAAC,CACrD,CACR,CACJ,IAAK,aACD,GAAIC,EAAK,SAAS,IAAI,EAClB,MAAO,CAACD,EAAI,KAAK,KAAK,EAE1B,IAAI7B,EAAO8B,EAAK,WAAW,QAAQ,EAAI7B,GAAa,MAAM,OACpD6B,IAAS,MAAQ7B,GAAa,WAAW,OACrCA,GAAa,WAAW,MAC9BuB,EAAM9B,GAAOM,EAAM6B,EAAI,KAAK,KAAK,EACrC,OAAOC,EAAK,WAAW,QAAQ,EACzB,CAACN,EAAI,CAAC,EAAGA,EAAI,CAAC,EAAG,CAAC,EAClB,CAACA,EAAI,CAAC,EAAGA,EAAI,CAAC,CAAC,EAGzB,IAAK,YACD,GAAIM,EAAK,WAAW,QAAQ,EACxB,MAAO,CACHpC,GAAOO,GAAa,MAAM,KAAM4B,EAAI,KAAK,IAAI,EAAE,CAAC,EAChDnC,GAAOO,GAAa,MAAM,KAAM4B,EAAI,KAAK,IAAI,EAAE,CAAC,CACpD,EAEJ,IAAIQ,EAAO3C,GAAOO,GAAa,MAAM,KAAM4B,EAAI,KAAK,IAAI,EACpDS,EAAU5C,GAAOO,GAAa,WAAW,QAASoC,EAAK,CAAC,CAAC,EAC7D,MAAO,CAACA,EAAK,CAAC,EAAGC,EAAQ,CAAC,EAAGA,EAAQ,CAAC,CAAC,EAC3C,IAAK,aACD,GAAIR,EAAK,SAAS,IAAI,EAClB,MAAO,CAACD,EAAI,KAAK,KAAK,EAE1B,IAAI7B,EAAO8B,EAAK,WAAW,QAAQ,EAAI7B,GAAa,MAAM,OACpD6B,IAAS,MAAQ7B,GAAa,WAAW,QACrCA,GAAa,WAAW,MAC9BuB,EAAM9B,GAAOM,EAAM6B,EAAI,KAAK,KAAK,EACrC,OAAOC,EAAK,WAAW,QAAQ,EACzB,CAACN,EAAI,CAAC,EAAGA,EAAI,CAAC,EAAG,CAAC,EAClB,CAACA,EAAI,CAAC,EAAGA,EAAI,CAAC,CAAC,EAGzB,IAAK,gBACD,GAAIM,EAAK,WAAW,QAAQ,EACxB,MAAO,CACHpC,GAAOO,GAAa,MAAM,SAAU4B,EAAI,SAAS,IAAI,EAAE,CAAC,EACxDnC,GAAOO,GAAa,MAAM,SAAU4B,EAAI,SAAS,IAAI,EAAE,CAAC,CAC5D,EAEJ,IAAIQ,EAAO3C,GAAOO,GAAa,MAAM,SAAU4B,EAAI,SAAS,IAAI,EAC5DS,EAAU5C,GAAOO,GAAa,WAAW,QAASoC,EAAK,CAAC,CAAC,EAC7D,MAAO,CAACA,EAAK,CAAC,EAAGC,EAAQ,CAAC,EAAGA,EAAQ,CAAC,CAAC,EAC3C,IAAK,iBACD,GAAIR,EAAK,SAAS,IAAI,EAClB,MAAO,CAACD,EAAI,SAAS,KAAK,EAE9B,IAAI7B,EAAO8B,EAAK,WAAW,QAAQ,EAAI7B,GAAa,MAAM,OACpD6B,IAAS,MAAQ7B,GAAa,WAAW,OACrCA,GAAa,WAAW,MAC9BuB,EAAM9B,GAAOM,EAAM6B,EAAI,SAAS,KAAK,EACzC,OAAOC,EAAK,WAAW,QAAQ,EACzB,CAACN,EAAI,CAAC,EAAGA,EAAI,CAAC,EAAG,CAAC,EAClB,CAACA,EAAI,CAAC,EAAGA,EAAI,CAAC,CAAC,EAGzB,IAAK,YACD,OAAQM,EAAM,CACV,KAAKG,GAAe,GACpB,KAAKA,GAAe,IAChB,OAAOlC,IAAeE,GAAa,MAAM,MAAM,CAAC,EAAG4B,EAAI,KAAK,IAAI,EACpE,KAAKI,GAAe,KAAK,EACzB,KAAKA,GAAe,KAChB,IAAII,EAAO3C,GAAOO,GAAa,MAAM,MAAO4B,EAAI,KAAK,IAAI,EACrDS,EAAU5C,GAAOO,GAAa,WAAW,QAASoC,EAAK,CAAC,CAAC,EAC7D,MAAO,CAACA,EAAK,CAAC,EAAGC,EAAQ,CAAC,EAAGA,EAAQ,CAAC,CAAC,EAC3C,KAAKL,GAAe,OACpB,KAAKA,GAAe,QAChB,MAAO,CACHvC,GAAOO,GAAa,MAAM,MAAO4B,EAAI,KAAK,IAAI,EAAE,CAAC,EACjDnC,GAAOO,GAAa,MAAM,MAAO4B,EAAI,KAAK,IAAI,EAAE,CAAC,CACrD,CACR,CAGJ,IAAK,aACD,GAAIC,EAAK,WAAW,QAAQ,EACxB,MAAO,CACHpC,GAAOO,GAAa,MAAM,OAAQ4B,EAAI,MAAM,IAAI,EAAE,CAAC,EACnDnC,GAAOO,GAAa,MAAM,OAAQ4B,EAAI,MAAM,IAAI,EAAE,CAAC,CACvD,EAEJ,IAAIQ,EAAO3C,GAAOO,GAAa,MAAM,OAAQ4B,EAAI,MAAM,IAAI,EACvDS,EAAU5C,GAAOO,GAAa,WAAW,QAASoC,EAAK,CAAC,CAAC,EAC7D,MAAO,CAACA,EAAK,CAAC,EAAGC,EAAQ,CAAC,EAAGA,EAAQ,CAAC,CAAC,EAC3C,IAAK,cACD,GAAIR,EAAK,SAASG,GAAe,EAAE,GAAKH,IAASG,GAAe,IAC5D,OAAOH,IAASG,GAAe,IAAM,CAACJ,EAAI,MAAM,KAAK,EAAI,CAACA,EAAI,MAAM,KAAK,EAE7E,IAAI7B,EAAO8B,EAAK,WAAW,QAAQ,EAAI7B,GAAa,MAAM,OAASA,GAAa,WAAW,MACvFuB,EAAM9B,GAAOM,EAAM6B,EAAI,MAAM,KAAK,EACtC,OAAOC,EAAK,WAAW,QAAQ,EACzB,CAACN,EAAI,CAAC,EAAGA,EAAI,CAAC,EAAG,CAAC,EAClB,CAACA,EAAI,CAAC,EAAGA,EAAI,CAAC,CAAC,EAGzB,IAAK,sBACD,IAAIA,EAAM9B,GAAOoC,EAAK,WAAW,QAAQ,EAAI7B,GAAa,WAAW,QAAUA,GAAa,WAAW,MAAO4B,EAAI,MAAM,SAAS,IAAI,EACrI,MAAO,CAACL,EAAI,CAAC,EAAGA,EAAI,CAAC,CAAC,EAC1B,IAAK,aACD,IAAIA,EAAM9B,GAAOoC,EAAK,WAAW,QAAQ,EAAI7B,GAAa,WAAW,QAAUA,GAAa,WAAW,MAAO4B,EAAI,MAAM,IAAI,EAC5H,MAAO,CAACL,EAAI,CAAC,EAAGA,EAAI,CAAC,CAAC,EAC1B,IAAK,cACD,GAAIM,EAAK,SAAS,IAAI,EAClB,MAAO,CAACD,EAAI,MAAM,KAAK,EAE3B,IAAI7B,EAAO8B,EAAK,WAAW,QAAQ,EAAI7B,GAAa,MAAM,OACpD6B,IAAS,MAAQ7B,GAAa,WAAW,OACrCA,GAAa,WAAW,MAC9BuB,EAAM9B,GAAOM,EAAM6B,EAAI,MAAM,KAAK,EACtC,OAAOC,EAAK,WAAW,QAAQ,EACzB,CAACN,EAAI,CAAC,EAAGA,EAAI,CAAC,EAAG,CAAC,EAClB,CAACA,EAAI,CAAC,EAAGA,EAAI,CAAC,CAAC,EAGzB,IAAK,eACD,IAAIA,EAAM9B,GAAOoC,EAAK,WAAW,QAAQ,EAAI7B,GAAa,MAAM,QAAUA,GAAa,WAAW,QAAS4B,EAAI,QAAQ,IAAI,EAC3H,MAAO,CAACL,EAAI,CAAC,EAAGA,EAAI,CAAC,CAAC,EAC1B,IAAK,gBACD,GAAIM,EAAK,SAAS,IAAI,EAClB,MAAO,CAACD,EAAI,QAAQ,KAAK,EAE7B,IAAI7B,EAAO8B,EAAK,WAAW,QAAQ,EAAI7B,GAAa,MAAM,OACpD6B,IAAS,MAAQ7B,GAAa,WAAW,QACrCA,GAAa,WAAW,MAC9BuB,EAAM9B,GAAOM,EAAM6B,EAAI,QAAQ,KAAK,EACxC,OAAOC,EAAK,WAAW,QAAQ,EACzB,CAACN,EAAI,CAAC,EAAGA,EAAI,CAAC,EAAG,CAAC,EAClB,CAACA,EAAI,CAAC,EAAGA,EAAI,CAAC,CAAC,CAC7B,CACA,OAAO,IACX,CACA,SAAS/B,IAAMoC,EAAKC,EAAMC,EAAOpB,EAAO,CAKpC,OAJGqB,GAAS,eAAeD,CAAK,IAC5BA,EAAMC,GAASD,CAAK,GAGhBA,EAAO,CAEX,IAAK,aACD,OAAQD,EAAM,CACV,KAAKG,GAAe,IAEhBJ,EAAI,KAAK,MAAQlB,EAAM,CAAC,IAAM,EAAIA,EAAM,CAAC,EAAI,EAAIA,EAAM,CAAC,EACxD,MACJ,KAAKsB,GAAe,GACpB,KAAKA,GAAe,KAAK,EAErBJ,EAAI,KAAK,MAAQlB,EAAM,CAAC,EACxB,MACJ,KAAKsB,GAAe,KAGhBJ,EAAI,KAAK,MAAQlB,EAAM,CAAC,EAAI,EAAIA,EAAM,CAAC,EACvC,MACJ,KAAKsB,GAAe,OACpB,KAAKA,GAAe,QAEhB,IAAIC,EAAKvB,EAAM,CAAC,IAAM,EAAIA,EAAM,CAAC,EAAI,EAAIA,EAAM,CAAC,EAEhDkB,EAAI,KAAK,MAAQ5B,GAAa,OAAO,WAAW,QAAQiC,CAAE,EAC1D,KACR,CACA,MAEJ,IAAK,YAEDL,EAAI,KAAK,KAAOJ,GAAkBU,GAAWL,CAAI,EAAGM,GAAQN,CAAI,EAAGnB,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EACrF,MAEJ,IAAK,cAEDkB,EAAI,KAAK,OAASJ,GAAkBU,GAAWL,CAAI,EAAGM,GAAQN,CAAI,EAAGnB,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EACvF,MAEJ,IAAK,eAEDkB,EAAI,KAAK,QAAUJ,GAAkBU,GAAWL,CAAI,EAAGM,GAAQN,CAAI,EAAGnB,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EACxF,MAGJ,IAAK,YACD,OAAQmB,EAAM,CACV,KAAKG,GAAe,GACpB,KAAKA,GAAe,IAEhB,IAAIM,EAAYhB,GAActB,GAAa,WAAW,QAASU,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EACjFkB,EAAI,KAAK,KAAON,GAActB,GAAa,MAAM,KAAK,IAAKsC,EAAW5B,EAAM,CAAC,CAAC,EAC9E,MACJ,KAAKsB,GAAe,KAAK,EACzB,KAAKA,GAAe,KAEhB,IAAIM,EAAYhB,GAActB,GAAa,WAAW,QAASU,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EACjFkB,EAAI,KAAK,KAAON,GAActB,GAAa,MAAM,KAAK,KAAK,EAAGsC,EAAW5B,EAAM,CAAC,CAAC,EACjF,MACJ,KAAKsB,GAAe,OACpB,KAAKA,GAAe,QAEhBJ,EAAI,KAAK,KAAON,GAActB,GAAa,MAAM,MAAOU,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EAC1E,KACR,CACA,MAEJ,IAAK,aACD,GAAImB,EAAK,SAAS,IAAI,EAElBD,EAAI,KAAK,MAAQlB,EAAM,CAAC,UACjBmB,EAAK,WAAW,QAAQ,EAE/BD,EAAI,KAAK,MAAQN,GAActB,GAAa,MAAM,OAAQU,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,MACzE,CAEH,IAAIX,EAAO8B,IAAS,MAAQ7B,GAAa,WAAW,OAASA,GAAa,WAAW,MACrF4B,EAAI,KAAK,MAAQN,GAAcvB,EAAMW,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,CAC3D,CACA,MAGJ,IAAK,YACD,GAAImB,EAAK,WAAW,QAAQ,EAExBD,EAAI,KAAK,KAAON,GAActB,GAAa,MAAM,KAAMU,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,MACtE,CAEH,IAAI4B,EAAYhB,GAActB,GAAa,WAAW,QAASU,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EACjFkB,EAAI,KAAK,KAAON,GAActB,GAAa,MAAM,KAAMsC,EAAW5B,EAAM,CAAC,CAAC,CAC9E,CACA,MAEJ,IAAK,aACD,GAAImB,EAAK,SAAS,IAAI,EAElBD,EAAI,KAAK,MAAQlB,EAAM,CAAC,UACjBmB,EAAK,WAAW,QAAQ,EAE/BD,EAAI,KAAK,MAAQN,GAActB,GAAa,MAAM,OAAQU,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,MACzE,CAEH,IAAIX,EAAO8B,IAAS,MAAQ7B,GAAa,WAAW,QAAUA,GAAa,WAAW,MACtF4B,EAAI,KAAK,MAAQN,GAAcvB,EAAMW,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,CAC3D,CACA,MAGJ,IAAK,gBACD,GAAImB,EAAK,WAAW,QAAQ,EAExBD,EAAI,SAAS,KAAON,GAActB,GAAa,MAAM,SAAUU,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,MAC9E,CAEH,IAAI4B,EAAYhB,GAActB,GAAa,WAAW,QAASU,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EACjFkB,EAAI,SAAS,KAAON,GAActB,GAAa,MAAM,SAAUsC,EAAW5B,EAAM,CAAC,CAAC,CACtF,CACA,MAEJ,IAAK,iBACD,GAAImB,EAAK,SAAS,IAAI,EAElBD,EAAI,SAAS,MAAQlB,EAAM,CAAC,UACrBmB,EAAK,WAAW,QAAQ,EAE/BD,EAAI,SAAS,MAAQN,GAActB,GAAa,MAAM,OAAQU,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,MAC7E,CAEH,IAAIX,EAAO8B,IAAS,MAAQ7B,GAAa,WAAW,OAASA,GAAa,WAAW,MACrF4B,EAAI,SAAS,MAAQN,GAAcvB,EAAMW,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,CAC/D,CACA,MAGJ,IAAK,YACD,OAAQmB,EAAM,CACV,KAAKG,GAAe,GACpB,KAAKA,GAAe,IAEhB,IAAIM,EAAYhB,GAActB,GAAa,WAAW,QAASU,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EACjFkB,EAAI,KAAK,KAAOU,IAAc,KAAO,KAAOtC,GAAa,MAAM,MAAM,CAAC,EAAEsC,CAAS,EACjF,MACJ,KAAKN,GAAe,KAAK,EACzB,KAAKA,GAAe,KAEhB,IAAIM,EAAYhB,GAActB,GAAa,WAAW,QAASU,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EACjFkB,EAAI,KAAK,KAAON,GAActB,GAAa,MAAM,MAAOsC,EAAW5B,EAAM,CAAC,CAAC,EAC3E,MACJ,KAAKsB,GAAe,OACpB,KAAKA,GAAe,QAEhBJ,EAAI,KAAK,KAAON,GAActB,GAAa,MAAM,MAAOU,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EAC1E,KACR,CACA,MAGJ,IAAK,aACD,GAAImB,EAAK,WAAW,QAAQ,EAExBD,EAAI,MAAM,KAAON,GAActB,GAAa,MAAM,OAAQU,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,MACzE,CAEH,IAAI4B,EAAYhB,GAActB,GAAa,WAAW,QAASU,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EACjFkB,EAAI,MAAM,KAAON,GAActB,GAAa,MAAM,OAAQsC,EAAW5B,EAAM,CAAC,CAAC,CACjF,CACA,MAEJ,IAAK,cACGmB,EAAK,SAAS,IAAI,GAAKA,IAAS,MAEhCD,EAAI,MAAM,MAAQlB,EAAM,CAAC,EAClBmB,EAAK,WAAW,QAAQ,EAE/BD,EAAI,MAAM,MAAQN,GAActB,GAAa,MAAM,OAAQU,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EAG7EkB,EAAI,MAAM,MAAQN,GAActB,GAAa,WAAW,MAAOU,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EAErF,MAGJ,IAAK,sBAED,IAAIX,EAAO8B,EAAK,WAAW,QAAQ,EAAI7B,GAAa,WAAW,QAAUA,GAAa,WAAW,MACjG4B,EAAI,MAAM,SAAS,KAAON,GAAcvB,EAAMW,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EAChE,MAEJ,IAAK,aAED,IAAIX,EAAO8B,EAAK,WAAW,QAAQ,EAAI7B,GAAa,WAAW,QAAUA,GAAa,WAAW,MACjG4B,EAAI,MAAM,KAAON,GAAcvB,EAAMW,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EACvD,MAEJ,IAAK,cACD,GAAImB,EAAK,SAAS,IAAI,EAElBD,EAAI,MAAM,MAAQlB,EAAM,CAAC,UAClBmB,EAAK,WAAW,QAAQ,EAE/BD,EAAI,MAAM,MAAQN,GAActB,GAAa,MAAM,OAAQU,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,MAC1E,CAEH,IAAIX,EAAO8B,IAAS,MAAQ7B,GAAa,WAAW,OAASA,GAAa,WAAW,MACrF4B,EAAI,MAAM,MAAQN,GAAcvB,EAAMW,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,CAC5D,CACA,MAGJ,IAAK,eAED,IAAIX,EAAO8B,EAAK,WAAW,QAAQ,EAAI7B,GAAa,MAAM,QAAUA,GAAa,WAAW,QAC5F4B,EAAI,QAAQ,KAAON,GAAcvB,EAAMW,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,EACzD,MAEJ,IAAK,gBACD,GAAImB,EAAK,SAAS,IAAI,EAElBD,EAAI,QAAQ,MAAQlB,EAAM,CAAC,UACpBmB,EAAK,WAAW,QAAQ,EAE/BD,EAAI,QAAQ,MAAQN,GAActB,GAAa,MAAM,OAAQU,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,MAC5E,CAEH,IAAIX,EAAO8B,IAAS,MAAQ7B,GAAa,WAAW,QAAUA,GAAa,WAAW,MACtF4B,EAAI,QAAQ,MAAQN,GAAcvB,EAAMW,EAAM,CAAC,EAAGA,EAAM,CAAC,CAAC,CAC9D,CACA,KACR,CAEA,OAAOkB,CACX,CAGA,SAASW,IAAkBX,EAAKC,EAAM,CAClC,MAAO,CACH,KAAQ,CACJ,KAAQ,oBAAoBD,EAAI,KAAK,IAAI,KACzC,YAAe,8CAA8CA,EAAI,KAAK,aAAe,KAAYA,EAAI,KAAK,YAAc,EAAE,IAC9H,EACA,QAAW,CACP,OAAU,WAAWC,IAAS,UAAY,QAAU,QAAQ,QAAQD,EAAI,QAAQ,QAAU,EAAI,OAAS,QAAQ,KAC/G,WAAc,0BAA0BA,EAAI,QAAQ,YAAc,KAAYA,EAAI,QAAQ,WAAa,CAAC,IACxG,SAAY,uBAAuBA,EAAI,QAAQ,UAAY,KAAYA,EAAI,QAAQ,SAAW,CAAC,IAC/F,cAAiB,6BAA6B5B,GAAa,eAAe4B,EAAI,QAAQ,aAAa,EAAE,YAAY,CAAC,IAClH,OAAU,qBAAqB,KAAK,MAAOA,EAAI,QAAQ,OAAS,IAAO,GAAG,CAAC,KAC3E,OAAU,qBAAqB,KAAK,MAAOA,EAAI,QAAQ,OAAS,IAAO,GAAG,CAAC,IAC/E,EACA,KAAQ,CACJ,MAAS,sCAAsCY,GAAalD,GAAMsC,EAAKC,EAAM,YAAY,EAAGY,IAAkBZ,CAAI,CAAC,CAAC,IACpH,KAAQ,gCAAgCW,GAAalD,GAAMsC,EAAKC,EAAM,WAAW,CAAC,CAAC,IACnF,OAAU,6BAA6BW,GAAalD,GAAMsC,EAAKC,EAAM,aAAa,CAAC,CAAC,IACpF,QAAW,+CAA+CW,GAAalD,GAAMsC,EAAKC,EAAM,cAAc,CAAC,CAAC,GAC5G,EACA,KAAQ,CACJ,KAAQ,iCAAiCa,GAAcpD,GAAMsC,EAAKC,EAAM,WAAW,CAAC,CAAC,IACrF,QAAWD,EAAI,KAAK,QAAU,aAAaC,IAAS,UAAY,KAAO,EAAE,2BAA6B,GACtG,MAAS,iCAAiCc,GAAerD,GAAMsC,EAAKC,EAAM,YAAY,CAAC,CAAC,GAC5F,EACA,KAAQ,CACJ,KAAQ,2BAA2Ba,GAAcpD,GAAMsC,EAAKC,EAAM,WAAW,CAAC,CAAC,IAC/E,MAAS,gCAAgCc,GAAerD,GAAMsC,EAAKC,EAAM,YAAY,CAAC,CAAC,IACvF,KAAQ,iBAAiBD,EAAI,KAAK,KAAO,EAAI,GAAG,EAAIA,EAAI,KAAK,IAAI,WAAa,GAAGA,EAAI,KAAK,KAAO,CAAC,SAAS,IAC3G,OAAU,GAAGA,EAAI,KAAK,OAAS,EAAI,IAAM,KAAK,kBAAkBA,EAAI,KAAK,OAAS,EAAI,EAAIA,EAAI,KAAK,OAASA,EAAI,KAAK,OAAS,CAAC,IAAIC,EAAK,WAAW,QAAQ,EAAI,UAAUD,EAAI,KAAK,OAAS,EAAI,OAAS,OAAO,GAAK,OAAO,IAC3N,SAAY,sEAAsEA,EAAI,KAAK,QAAQ,kBACnG,cAAiB,iBAAiBA,EAAI,KAAK,cAAgB,EAAI,GAAG,EAAIA,EAAI,KAAK,aAAa,UAAY,GAAGA,EAAI,KAAK,cAAgB,CAAC,gBAAgB,IACrJ,UAAa,iBAAiBA,EAAI,KAAK,UAAY,GAAK,GAAG,GAAKA,EAAI,KAAK,SAAS,aAAe,GAAGA,EAAI,KAAK,UAAY,EAAE,cAAc,EAC7I,EACA,SAAY,CACR,KAAQ,+BAA+Bc,GAAcpD,GAAMsC,EAAKC,EAAM,eAAe,CAAC,CAAC,IACvF,MAAS,qCAAqCc,GAAerD,GAAMsC,EAAKC,EAAM,gBAAgB,CAAC,CAAC,IAChG,KAAQ,qBAAqBD,EAAI,SAAS,KAAO,EAAI,GAAG,EAAIA,EAAI,SAAS,IAAI,WAAa,GAAGA,EAAI,SAAS,KAAO,CAAC,SAAS,IAC3H,OAAU,GAAGA,EAAI,SAAS,OAAS,EAAI,IAAM,KAAK,sBAAsBA,EAAI,SAAS,OAAS,EAAI,EAAIA,EAAI,SAAS,OAASA,EAAI,SAAS,OAAS,CAAC,IAAIC,EAAK,WAAW,QAAQ,EAAI,UAAUD,EAAI,SAAS,OAAS,EAAI,OAAS,OAAO,GAAK,OAAO,IACnP,SAAY,yCAAyCA,EAAI,SAAS,SAAW,EAAI,EAAIA,EAAI,SAAS,SAAWA,EAAI,SAAS,SAAW,CAAC,UAAUA,EAAI,SAAS,SAAW,EAAI,OAAS,IAAI,IACzL,cAAiB,qBAAqBA,EAAI,SAAS,cAAgB,EAAI,GAAG,EAAIA,EAAI,SAAS,aAAa,UAAY,GAAGA,EAAI,SAAS,cAAgB,CAAC,gBAAgB,IACrK,UAAa,qBAAqBA,EAAI,SAAS,UAAY,EAAI,GAAG,EAAIA,EAAI,SAAS,SAAS,aAAe,GAAGA,EAAI,SAAS,UAAY,CAAC,cAAc,EAC1J,EACA,KAAQ,CACJ,KAAQ,2BAA2Bc,GAAcpD,GAAMsC,EAAKC,EAAM,WAAW,CAAC,CAAC,IAC/E,KAAQ,iBAAiBD,EAAI,KAAK,KAAO,EAAI,GAAG,EAAIA,EAAI,KAAK,IAAI,WAAa,GAAGA,EAAI,KAAK,KAAO,CAAC,UAAU,GAC5G,UAAa,iBAAiBA,EAAI,KAAK,UAAY,EAAI,GAAG,EAAIA,EAAI,KAAK,SAAS,aAAe,GAAGA,EAAI,KAAK,UAAY,CAAC,cAAc,EAC1I,EACA,MAAS,CACL,KAAQ,4BAA4Bc,GAAcpD,GAAMsC,EAAKC,EAAM,YAAY,CAAC,CAAC,IACjF,MAAS,kCAAkCc,GAAerD,GAAMsC,EAAKC,EAAM,aAAa,CAAC,CAAC,IAC1F,KAAQ,kBAAkBD,EAAI,MAAM,KAAO,EAAI,GAAG,EAAIA,EAAI,MAAM,IAAI,WAAa,GAAGA,EAAI,MAAM,KAAO,CAAC,UAAU,GAChH,OAAU,GAAGA,EAAI,MAAM,OAAS,EAAI,IAAM,KAAK,mBAAmBA,EAAI,MAAM,OAAS,EAAI,EAAIA,EAAI,MAAM,OAASA,EAAI,MAAM,OAAS,CAAC,IAAIC,IAAS,SAAW,UAAUD,EAAI,MAAM,OAAS,EAAI,OAAS,OAAO,GAAK,OAAO,IACzN,UAAa,kBAAkBA,EAAI,MAAM,UAAY,GAAK,GAAG,GAAKA,EAAI,MAAM,SAAS,aAAe,GAAGA,EAAI,MAAM,UAAY,EAAE,cAAc,EACjJ,EACA,MAAS,CACL,SAAY,CACR,KAAQ,oCAAoCc,GAAcpD,GAAMsC,EAAKC,EAAM,qBAAqB,CAAC,CAAC,IAClG,KAAQ,qBAAqBD,EAAI,MAAM,SAAS,KAAO,EAAI,GAAG,EAAIA,EAAI,MAAM,SAAS,IAAI,WAAa,GAAGA,EAAI,MAAM,SAAS,KAAO,CAAC,UAAU,GAC9I,UAAa,qBAAqBA,EAAI,MAAM,SAAS,UAAY,GAAK,GAAG,GAAKA,EAAI,MAAM,SAAS,SAAS,aAAe,GAAGA,EAAI,MAAM,SAAS,UAAY,EAAE,cAAc,EAC/K,EACA,KAAQ,iCAAiCc,GAAcpD,GAAMsC,EAAKC,EAAM,YAAY,CAAC,CAAC,IACtF,MAAS,kCAAkCc,GAAerD,GAAMsC,EAAKC,EAAM,aAAa,CAAC,CAAC,GAC9F,EACA,QAAW,CACP,KAAQ,mCAAmCa,GAAcpD,GAAMsC,EAAKC,EAAM,cAAc,CAAC,CAAC,IAC1F,MAAS,oCAAoCc,GAAerD,GAAMsC,EAAKC,EAAM,eAAe,CAAC,CAAC,IAC9F,KAAQ,oBAAoBD,EAAI,QAAQ,KAAO,EAAI,GAAG,EAAIA,EAAI,QAAQ,IAAI,WAAa,GAAGA,EAAI,QAAQ,KAAO,CAAC,UAAU,GACxH,UAAa,oBAAoBA,EAAI,QAAQ,UAAY,GAAK,GAAG,GAAKA,EAAI,QAAQ,SAAS,aAAe,GAAGA,EAAI,QAAQ,UAAY,EAAE,cAAc,EACzJ,EACA,KAAQ,CACJ,GAAM,iBAAiBA,EAAI,KAAK,GAAK,KAAO,KAAK,IACjD,KAAQ,iBAAiBA,EAAI,KAAK,KAAO,EAAI,GAAG,EAAIA,EAAI,KAAK,IAAI,WAAa,GAAGA,EAAI,KAAK,KAAO,CAAC,UAAU,GAC5G,UAAa,iBAAiBA,EAAI,KAAK,UAAY,EAAI,GAAG,EAAIA,EAAI,KAAK,SAAS,sBAAwB,GAAGA,EAAI,KAAK,UAAY,CAAC,sBAAsB,GACvJ,UAAa,iBAAiBA,EAAI,KAAK,UAAY,GAAK,GAAG,GAAKA,EAAI,KAAK,SAAS,aAAe,GAAGA,EAAI,KAAK,UAAY,EAAE,cAAc,EAC7I,CACJ,CACJ,CAGA,SAASrC,GAAiBqC,EAAKC,EAAO,SAAU,CAE5C,GADAA,EAAOA,EAAK,YAAY,EAAE,WAAW,IAAK,EAAE,EACxC,CAACG,GAAe,eAAeH,CAAI,EACnC,MAAM,IAAI,MAAM,GAAGA,CAAI,yCAAyC,OAAO,KAAKG,EAAc,EAAE,KAAK,IAAI,CAAC,GAAG,EAG7G,GADAJ,EAAMgB,GAAUhB,CAAG,EACfA,GAAO,OAAOA,EAAI,MAAS,WAC3B,OAAOA,EAAI,KAAKiB,GAAWtD,GAAiBsD,EAAShB,CAAI,CAAC,EAG1DA,IAAS,WACTD,EAAMkB,GAASlB,EAAKC,CAAI,GAG5B,OAAO,KAAKE,EAAQ,EAAE,QAAQgB,GAAK,CAC5B7C,GAAe0B,EAAIG,GAASgB,CAAG,CAAC,GAAG,OAC/B1B,GAAgB,eAAe0B,CAAG,EACjCvC,GAAeoB,EAAIG,GAASgB,CAAG,EAAE1B,GAAgB0B,CAAG,CAAC,EAGrDvC,GAAeoB,EAAIG,GAASgB,CAAG,EAAE,CAAC,EAG9C,CAAC,EAED,IAAIC,EAAST,IAAkBX,EAAKC,CAAI,EACxC,cAAO,KAAKE,EAAQ,EAAE,QAAQtB,GAAO,CACjC,IAAMd,EAAMO,GAAe0B,EAAKG,GAAStB,CAAG,CAAC,EACvCsC,EAAM5B,IAAcV,EAAKd,CAAG,GAETA,GAAQ,MAASqB,IAAcrB,EAAKoD,CAAG,GAAK,CAACE,IAA2B,SAASxC,CAAG,IACzGK,IAAkBkC,EAAQjB,GAAStB,CAAG,CAAC,CAE/C,CAAC,EAIMuC,CACX,CA1rBA,IAIMC,IAEAf,GACAC,GACAe,IAiFAR,GAkBAC,GAOAH,GAgBAC,IAlINU,GAAAC,GAAA,KAAAC,KACAC,KACAC,KAEMN,IAA6B,CAAC,QAAQ,EAEtCf,GAAaL,GAASA,EAAK,WAAW,QAAQ,EAAI,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EAAI,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EAC5HM,GAAUN,GAAQA,EAAK,WAAW,QAAQ,EAAI,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EAAI,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAC,EACxHqB,IAAkB,CAAC,QAAS,SAAU,QAAS,QAAQ,EAiFvDR,GAAiBc,GACf,CAAC,MAAM,QAAQA,CAAG,GAAKA,EAAI,KAAK9C,GAAS,CAAC,OAAO,SAAS,OAAOA,CAAK,CAAC,GAAK,OAAOA,CAAK,EAAI,CAAC,EACtF,2BAGP8C,EAAI,SAAW,GAAKA,EAAI,CAAC,IAAM,OAExB,WAAWA,EAAI,CAAC,EAAI,CAAC,KAAKA,EAAI,CAAC,EAAI,CAAC,mBAAmBA,EAAI,CAAC,EAAI,CAAC,gBACjEA,EAAI,SAAW,EACf,GAAGA,EAAI,CAAC,EAAI,CAAC,mBAAmBA,EAAI,CAAC,EAAI,CAAC,gBAC1CA,EAAI,SAAW,EAEf,GAAGA,EAAI,CAAC,EAAI,CAAC,gBAEjB,GAILb,GAAkBa,GAAQ,CAC5B,IAAMC,EAAcD,EAAI,SAAW,GAAKA,EAAI,CAAC,IAAM,EAC7CE,EAAqBhB,GAAde,EAA4B,CAACD,EAAI,CAAC,EAAGA,EAAI,CAAC,CAAC,EAAmBA,CAAlB,EACzD,OAAOC,EAAc,GAAGC,CAAI,gCAAkCA,CAClE,EAGMlB,GAAe,CAACgB,EAAKG,EAAWT,MAAoB,CACtD,GAAI,CAAC,MAAM,QAAQM,CAAG,GAAKA,EAAI,KAAK9C,GAAS,OAAOA,GAAU,WAAa,CAAC,OAAO,SAAS,OAAOA,CAAK,CAAC,GAAK,OAAOA,CAAK,EAAI,EAAE,EAC5H,MAAO,2BAGX,GAAI8C,EAAI,SAAW,EAAG,CAClB,IAAMI,EAAU,OAAOJ,EAAI,CAAC,GAAM,SAAWA,EAAI,CAAC,EAAIG,EAASH,EAAI,CAAC,CAAC,EACrE,OAAKI,EAEEA,IAAY,SAAWA,IAAY,MACpC,GAAGJ,EAAI,CAAC,EAAI,CAAC,iBACb,GAAGA,EAAI,CAAC,EAAI,CAAC,0BAA0BI,CAAO,OAJ/BlB,GAAcc,CAAG,CAK1C,CACA,OAAOd,GAAcc,CAAG,CAC5B,EAEMf,IAAoBZ,GAAQA,IAASG,GAAe,KAAO,CAAC,MAAO,SAAU,QAAQ,EAAI,CAAC,QAAS,QAAQ,IClIjH,IAAA6B,GAAA,GAAAC,GAAAD,GAAA,eAAAE,GAAA,iBAAAC,MAGA,SAASC,GAAoBC,EAAQC,EAAY,CAC7C,OAAOD,GAAQ,QAAQC,CAAU,GAAK,EAC1C,CAEA,eAAeJ,GAAUK,EAAIC,EAAe,GAAG,CACxCD,EAAI,SACHA,EAAI,MAAMA,EAAI,OAAO,GAEzBA,EAAI,MAAME,GAAUF,CAAG,EAGvB,IAAIG,EAAU,KAAK,IAAI,KAAK,IAAIH,EAAI,KAAK,UAAY,EAAG,CAAC,EAAG,EAAE,EAC9D,IAAII,EAAWJ,EAAI,SAAS,UAAY,EACpCI,EAAW,GACXA,EAAW,GAENA,EAAW,IAChBA,EAAW,GAGf,IAAIC,EAAY,KAAK,IAAI,KAAK,IAAIL,EAAI,MAAM,UAAY,EAAG,CAAC,EAAG,EAAE,EAE7DM,EAAYN,EAAI,KAAK,UAAYG,EACjCI,EAAaP,EAAI,SAAS,UAAYI,EACtCI,EAAcR,EAAI,MAAM,UAAYK,EAGxCL,EAAI,OAAS,CAAC,EACd,QAASS,EAAS,EAAGA,EAAS,EAAGA,IAC7BT,EAAI,OAAO,KAAK,gBAAgBA,CAAG,CAAC,EAEpCA,EAAI,OAAOS,CAAM,EAAE,KAAK,UAAU,KAAK,MAAOH,EAAYG,EAAQ,CAAC,EAAIN,EACvEH,EAAI,OAAOS,CAAM,EAAE,SAAS,UAAU,KAAK,MAAOF,EAAaE,EAAQ,CAAC,EAAIL,EAC5EJ,EAAI,OAAOS,CAAM,EAAE,MAAM,UAAU,KAAK,MAAOD,EAAcC,EAAQ,CAAC,EAAIJ,EAC1EL,EAAI,OAAOS,CAAM,EAAE,KAAK,KAAK,KAAK,MAAOT,EAAI,KAAK,KAAOS,EAAQ,CAAC,EAE/DA,EAAO,IACNT,EAAI,OAAOS,CAAM,EAAE,KAAK,KAAK,EAC7BT,EAAI,OAAOS,CAAM,EAAE,SAAS,MAAM,IAEnCA,EAAO,GAAGR,GAAgB,MAEzBD,EAAI,OAAOS,CAAM,EAAE,MAAM,KAAK,EAC9BT,EAAI,OAAOS,CAAM,EAAE,MAAM,SAAS,KAAK,EACvCT,EAAI,OAAOS,CAAM,EAAE,KAAK,QAAQ,EAEhCT,EAAI,OAAOS,CAAM,EAAE,KAAK,OAAO,EAC/BT,EAAI,OAAOS,CAAM,EAAE,QAAQ,KAAK,EAChCT,EAAI,OAAOS,CAAM,EAAE,KAAK,QAAQ,IAGpCT,EAAI,OAAOS,CAAM,EAAE,QAAQ,OAAO,KAAK,MAAOT,EAAI,OAAOS,CAAM,EAAE,QAAQ,OAAO,EAAGA,CAAM,EAEzF,OAAOT,EAAI,OAAOS,CAAM,EAAE,OAG9B,IAAIC,EAAc,GAClB,GAAGT,EAAe,GAAGA,EAAe,EAAE,CAClC,IAAIU,EAAiB,CAAC,EAClBC,EAAe,CAAC,EAChBC,EAAU,GACd,QAAQC,EAAU,EAAEA,GAAW,GAAG,CAACD,EAAUC,IACzC,QAAQC,EAAWf,EAAI,QAAQ,SAAS,EAAE,EAAE,EAAEe,IAAaf,EAAI,QAAQ,SAAS,EAAE,EAAE,GAAGe,IAChFC,GAAe,gBAAgBD,CAAU,EAAED,CAAS,EAAE,SAASd,EAAI,KAAK,IAAI,IAC3EW,EAAiB,KAAKI,CAAU,EAChCH,EAAe,KAAKE,CAAS,EAC7BD,EAAU,IAKtB,GAAGF,EAAiB,OAAO,EAAE,CACzB,IAAIM,EAAK,KAAK,MAAM,KAAK,OAAO,EAAEN,EAAiB,MAAM,EACzDV,EAAeU,EAAiBM,CAAI,EACpCP,EAAcE,EAAeK,CAAI,CACrC,MAEIhB,EAAee,GAAe,uBAAuBhB,EAAI,KAAK,IAAI,EAAEA,EAAI,QAAQ,MAAM,EACtFU,EAAc,EAEtB,CAGA,IAAIQ,EAAW,EACf,QAASC,EAAa,EAAGA,EAAa,GAC/B,EAAAA,GAAY,GAAGT,GAAe,IADIS,IAAc,CAEnD,IAAMC,EAAWJ,GAAe,gBAAgBf,CAAc,EAAEiB,CAAQ,EAClEG,EAAWD,EAAS,KAAK,MAAM,KAAK,OAAO,EAAIA,EAAS,MAAM,CAAC,EACrE,OAAOD,EAAW,CACd,IAAK,GACDnB,EAAI,OAAO,CAAC,EAAE,KAAK,KAAOqB,EAC9B,MACA,IAAK,GACDrB,EAAI,OAAO,CAAC,EAAE,KAAK,KAAOqB,EAC1BrB,EAAI,OAAO,CAAC,EAAE,KAAK,KAAOqB,EAC9B,MACA,IAAK,GACDrB,EAAI,OAAO,CAAC,EAAE,KAAK,KAAOqB,EAC1BrB,EAAI,OAAO,CAAC,EAAE,KAAK,KAAOqB,EAC9B,MACA,IAAK,GACDrB,EAAI,OAAO,CAAC,EAAE,KAAK,KAAOqB,EAC9B,KACJ,EACIF,IAAe,GAAK,KAAK,MAAM,KAAK,OAAO,GAAKnB,EAAI,OAAO,CAAC,EAAE,QAAQ,SAAW,EAAI,EAAI,EAAE,IAAM,KACjGkB,EAAW,KAAK,IAAIA,EAAW,EAAGR,EAAc,EAAE,EAAEA,CAAa,EAEzE,CAEA,OAAOV,EAAI,MACf,CAEA,eAAeJ,IAAa0B,EAASC,EAASC,EAAS,CACnD,IAAIC,EAAQC,EAgBZ,GAfGJ,EAAQ,OACPG,EAAQ,MAAMH,EAAQ,OAAO,EAG7BG,EAAQH,EAETC,EAAQ,OACPG,EAAQ,MAAMH,EAAQ,OAAO,EAG7BG,EAAQH,EAEZE,EAAQ,MAAMvB,GAAUuB,CAAO,EAC/BC,EAAQ,MAAMxB,GAAUwB,CAAO,EAE5BD,EAAQ,QAAQ,SAAS,EAAE,CAC1B,IAAIE,EAAW,gBAAgBF,CAAO,EACtCA,EAAQ,gBAAgBC,CAAO,EAC/BA,EAAQ,gBAAgBC,CAAU,CACtC,CAGA,QADIC,EAAc,CAAC,EACVC,EAAI,EAAGA,EAAI,EAAGA,IAEnBD,EAAY,KAAK,KAAK,MAAM,KAAK,OAAO,EAAE,CAAC,CAAC,EAGhD,IAAIE,EAAaF,EAAY,CAAC,IAAM,EAAIF,EAAUD,EAC9CM,EAAQ,gBAAgBD,CAAU,EAGtCC,EAAM,KAAK,KAAMN,EAAQ,MAAM,OAAO,WAAWC,EAAQ,MAAM,OAAO,UAAW,UAAU,UACvFK,EAAM,QAAOA,EAAM,MAAM,CAAC,GAC9BA,EAAM,MAAM,QAAQlC,GAAoB4B,EAAQ,SAAS,GAAG5B,GAAoB6B,EAAQ,SAAS,EACjGK,EAAM,MAAM,QAAQlC,GAAoB4B,EAAQ,SAAS,GAAG5B,GAAoB6B,EAAQ,SAAS,EAGjG,IAAIM,EAAS,IAAI,KACjBD,EAAM,QAAQ,SAASC,EAAS,QAAQ,EACxCD,EAAM,QAAQ,WAAWC,EAAS,SAAS,EAAE,EAC7CD,EAAM,KAAK,YAAYP,GAAS,eAAe,aAAa,EAAEA,EAAQ,YAAY,GAElF,IAAIS,EAAST,GAAS,eAAe,QAAQ,EAAIA,EAAQ,OAAS,KAAK,MAAM,KAAK,OAAO,EAAI,CAAC,EAC9FO,EAAM,QAAQ,OAASE,EACvBF,EAAM,KAAK,KAAOP,GAAS,eAAe,MAAM,EAAGA,EAAQ,KAAOR,GAAe,MAAMe,EAAM,QAAQ,MAAM,EAAE,KAAK,MAAM,KAAK,OAAO,EAAIf,GAAe,MAAMe,EAAM,QAAQ,MAAM,EAAE,MAAM,CAAC,EAE1L,IAAIG,EAAiBT,EAAQ,QAAQ,SAAWQ,EAASR,EAAUC,EAMnE,IAAMS,EAAeC,GAAW,OAAO,WAAWX,EAAQ,KAAK,KAAK,EAC9DY,EAAeD,GAAW,OAAO,WAAWV,EAAQ,KAAK,KAAK,EAEpE,IAAIY,EAActB,GAAe,gBAAgB,KAAK,IAAImB,EAAgBE,CAAc,CAAC,EAAE,KAAK,IAAIF,EAAgBE,CAAc,CAAC,EAAE,OAAOE,GAAKA,IAAM,EAAE,EACzJR,EAAM,KAAK,MAAQO,EAAY,KAAK,MAAM,KAAK,OAAO,EAAIA,EAAY,MAAM,CAAC,EAG7E,IAAIrC,EAAiBe,GAAe,uBAAuBkB,EAAe,KAAK,IAAI,EAAED,CAAM,EAC3FF,EAAM,KAAK,MAAQH,EAAY,CAAC,IAAM,EAAIH,EAAQ,KAAK,MAAQC,EAAQ,KAAK,MAC5EK,EAAM,SAAS,MAAQA,EAAM,KAAK,MAElCA,EAAM,KAAK,KAAKG,EAAe,KAAK,KAEpCH,EAAM,KAAK,KAAOH,EAAY,CAAC,IAAM,EAAIH,EAAQ,KAAK,KAAOC,EAAQ,KAAK,KAC1EK,EAAM,KAAK,MAAQH,EAAY,CAAC,IAAM,EAAIH,EAAQ,KAAK,MAAQC,EAAQ,KAAK,MAE5EK,EAAM,SAAS,KAAOG,EAAe,SAAS,KAE9CH,EAAM,KAAK,KAAOH,EAAY,CAAC,IAAM,EAAIH,EAAQ,KAAK,KAAOC,EAAQ,KAAK,KAE1EK,EAAM,MAAM,KAAOH,EAAY,CAAC,IAAM,EAAIH,EAAQ,MAAM,KAAOC,EAAQ,MAAM,KAC7EK,EAAM,MAAM,MAAQH,EAAY,CAAC,IAAM,EAAIH,EAAQ,MAAM,MAAQC,EAAQ,MAAM,MAE/EK,EAAM,KAAK,GAAK,KAAK,MAAM,KAAK,OAAO,EAAI,CAAC,IAAM,EAAIN,EAAQ,KAAK,GAAKC,EAAQ,KAAK,GAGrF,IAAIc,EAAe,KAAK,MAAM,KAAK,OAAO,EAAI,CAAC,IAAM,EAAIf,EAAUC,EAC/De,GAAUD,EAAa,QAAQ,QAAU,GAAK,IAClDC,GAAU,IAAM,IAChBA,GAAU,IAAM,IAChBV,EAAM,QAAQ,OAAS,KAAK,MAAM,KAAK,IAAI,KAAK,IAAIU,EAAQ,CAAC,EAAG,GAAG,CAAC,EAEpE,IAAIC,EAAe,KAAK,MAAM,KAAK,OAAO,EAAI,CAAC,IAAM,EAAIjB,EAAUC,EACnE,IAAIiB,EAAS,KAAK,OAAOD,EAAa,QAAQ,OAAS,GAAK,CAAC,EAAI,GACjE,QAASE,EAAO,EAAGA,EAAO,EAAGA,IACzBD,IAAWA,EAAS,IAAQ,GAEhC,OAAAZ,EAAM,QAAQ,OAAS,KAAK,MAAM,KAAK,IAAI,KAAK,IAAIY,EAAQ,CAAC,EAAG,GAAG,CAAC,EAEpEZ,EAAM,QAAQ,cAAcP,GAAS,cAAcA,EAAQ,eAAeO,EAAM,QAAQ,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,KAAK,MAAM,KAAK,OAAO,EAAE,CAAC,CAAC,EAEhI,MAAMpC,GAAUoC,EAAM9B,CAAc,CAE1D,CApNA,IAAA4C,GAAAC,GAAA,KAAAC,KACAC,OCDA,IAAAC,IAAA,GAAAC,GAAAD,IAAA,oBAAAE,GAAA,kBAAAC,GAAA,mBAAAC,GAAA,QAAAC,GAAA,eAAAC,GAAA,aAAAC,GAAA,2BAAAC,GAAA,cAAAC,GAAA,eAAAC,GAAA,YAAAC,IAAA,oBAAAC,GAAA,sBAAAC,GAAA,oBAAAC,GAAA,cAAAC,GAAA,eAAAC,GAAA,yBAAAC,GAAA,YAAAC,GAAA,gBAAAC,GAAA,UAAAC,GAAA,kBAAAC,GAAA,mBAAAC,GAAA,oCAAAC,GAAA,sBAAAC,GAAA,wBAAAC,GAAA,kBAAAC,GAAA,cAAAC,GAAA,qBAAAC,GAAA,iBAAAC,GAAA,WAAAC,GAAA,aAAAC,GAAA,kCAAAC,GAAA,eAAAC,GAAA,4BAAAC,GAAA,4BAAAC,GAAA,cAAAC,GAAA,WAAAC,GAAA,UAAAC,GAAA,mBAAAC,KAAA,eAAAC,IAAAxC,KAAAyC,KACAC,KAEAC,KAEAC,KAEA,IAAAC,GAAiB,sBACjBC,GAAwB,WACxBC,KAEAN,KACAC,KACAC,KAEA,GAAM,CAAE,UAAA5B,GAAW,UAAAN,GAAW,gBAAAK,GAAgB,EAAIkC,GAC5C,CAAE,SAAAjB,GAAU,WAAAzB,GAAY,eAAAJ,EAAe,EAAI+C,GAC3C,CAAE,OAAAnB,IAAQ,OAAAO,GAAO,EAAIa,GAErBC,GAAyB,CAAC,EAChC,SAASC,GAAmBC,EAAMC,EAAU,CACxC,OAAAH,GAAuBE,CAAI,IAAMC,EAAS,EACnCH,GAAuBE,CAAI,CACtC,CAEA,IAAME,GAAoB,IAAMH,GAAmB,gBAAiB,IAAM,qCAA4B,EAChGI,GAAwB,IAAMJ,GAAmB,uBAAwB,IAAM,qCAAmC,EAClHK,IAAgB,IAAML,GAAmB,eAAgB,IAAM,qCAA2B,EAC1FM,GAAa,IAAMN,GAAmB,YAAa,IAAM,qCAAwB,EACjFO,GAAmB,IAAMP,GAAmB,kBAAmB,IAAM,qCAA8B,EACnGQ,GAAa,IAAMR,GAAmB,YAAa,IAAM,qCAAwB,EAEvF,eAAeS,GAAmBC,EAAQC,EAAYC,EAAM,CAExD,OADY,MAAMF,EAAO,GACdC,CAAU,EAAE,GAAGC,CAAI,CAClC,CAEA,SAASC,GAAcC,EAAO,CAC1B,OAAOA,GAAS,OAAOA,EAAM,MAAS,UAC1C,CAEA,SAASC,IAAkBC,EAAO,CAC9B,OAAO,OAAO,SAASA,CAAK,GACrBA,aAAiB,YACjBA,aAAiB,aAChB,OAAO,kBAAsB,KAAeA,aAAiB,iBACzE,CAEA,eAAe3C,MAAuBuC,EAAM,CACxC,OAAOH,GAAmBN,GAAmB,sBAAuBS,CAAI,CAC5E,CAEA,eAAe/C,MAAwB+C,EAAM,CACzC,OAAOH,GAAmBN,GAAmB,uBAAwBS,CAAI,CAC7E,CAEA,eAAe9B,MAA2B8B,EAAM,CAC5C,OAAOH,GAAmBL,GAAuB,0BAA2BQ,CAAI,CACpF,CAEA,eAAexC,MAAqBwC,EAAM,CACtC,OAAOH,GAAmBL,GAAuB,oBAAqBQ,CAAI,CAC9E,CAEA,eAAexD,MAA0BwD,EAAM,CAC3C,OAAOH,GAAmBL,GAAuB,yBAA0BQ,CAAI,CACnF,CAEA,eAAe7B,MAA2B6B,EAAM,CAC5C,OAAOH,GAAmBL,GAAuB,0BAA2BQ,CAAI,CACpF,CAEA,eAAezC,MAAmCyC,EAAM,CACpD,OAAOH,GAAmBL,GAAuB,kCAAmCQ,CAAI,CAC5F,CAEA,eAAehC,MAAiCgC,EAAM,CAClD,OAAOH,GAAmBL,GAAuB,gCAAiCQ,CAAI,CAC1F,CAEA,eAAe5B,MAAa4B,EAAM,CAC9B,OAAOH,GAAmBJ,IAAe,YAAaO,CAAI,CAC9D,CAEA,eAAetD,MAAcsD,EAAM,CAC/B,OAAOH,GAAmBH,GAAY,aAAcM,CAAI,CAC5D,CAEA,eAAehD,MAAcgD,EAAM,CAC/B,OAAOH,GAAmBH,GAAY,aAAcM,CAAI,CAC5D,CAEA,eAAe/B,MAAc+B,EAAM,CAC/B,OAAOH,GAAmBH,GAAY,aAAcM,CAAI,CAC5D,CAEA,eAAepC,MAAoBoC,EAAM,CACrC,OAAOH,GAAmBF,GAAkB,mBAAoBK,CAAI,CACxE,CAEA,eAAe5C,MAAS4C,EAAM,CAC1B,OAAOH,GAAmBF,GAAkB,QAASK,CAAI,CAC7D,CAEA,eAAe1B,MAAS0B,EAAM,CAC1B,OAAOH,GAAmBF,GAAkB,QAASK,CAAI,CAC7D,CAEA,eAAerC,MAAaqC,EAAM,CAC9B,OAAOH,GAAmBD,GAAY,YAAaI,CAAI,CAC3D,CAEA,eAAenC,MAAgBmC,EAAM,CACjC,OAAOH,GAAmBD,GAAY,eAAgBI,CAAI,CAC9D,CAEA,IAAM7D,GAAgB,OAAO,OAAO,CAChC,OAAQ,EACR,MAAO,EACP,MAAO,EACP,OAAQ,EACR,QAAS,EACT,SAAU,EACV,UAAW,EACX,MAAO,EACP,WAAY,EACZ,iBAAkB,EAClB,MAAO,EACP,iBAAkB,EAClB,kBAAmB,EACnB,oBAAqB,GACrB,iBAAkB,GAClB,UAAW,GACX,WAAY,GACZ,qBAAsB,GACtB,sBAAuB,GACvB,eAAgB,GAChB,KAAM,GACN,gBAAiB,GACjB,WAAY,GACZ,MAAO,GACP,iBAAkB,GAClB,oBAAqB,GACrB,KAAM,GACN,yBAA0B,GAC1B,UAAW,GACX,KAAM,GACN,gBAAiB,GACjB,0BAA2B,GAC3B,WAAY,GACZ,mBAAoB,GACpB,IAAK,GACL,yBAA0B,GAC1B,UAAW,GACX,OAAQ,GACR,iBAAkB,GAClB,sBAAuB,GACvB,2BAA4B,GAC5B,KAAM,GACN,gBAAiB,GACjB,QAAS,GACT,mBAAoB,GACpB,aAAc,GACd,uBAAwB,GACxB,QAAS,GACT,kBAAmB,GACnB,UAAW,GACX,oBAAqB,GACrB,SAAU,GACV,mBAAoB,GACpB,IAAK,GACL,cAAe,GACf,IAAK,GACL,cAAe,GACf,MAAO,GACP,gBAAiB,GACjB,qBAAsB,GACtB,MAAO,GACP,sBAAuB,GACvB,SAAU,GACV,wBAAyB,GACzB,SAAU,GACV,SAAU,GACV,SAAU,GACV,uBAAwB,GACxB,QAAS,GACT,qBAAsB,GACtB,MAAO,GACP,oBAAqB,GACrB,QAAS,GACT,QAAS,GACT,IAAK,EACT,CAAC,EASD,SAASU,GAAkBwD,EAAKC,EAAM,CAClC,IAAMC,EAAQD,EAAK,MAAM,GAAG,EACxBE,EAAUH,EAEd,QAASI,EAAI,EAAGA,EAAIF,EAAM,OAAS,EAAGE,IAAK,CAEvC,GADID,GAAW,MACX,CAACA,EAAQ,eAAeD,EAAME,CAAC,CAAC,EAAG,OACvCD,EAAUA,EAAQD,EAAME,CAAC,CAAC,CAC9B,CAEA,OAAOD,EAAQD,EAAMA,EAAM,OAAS,CAAC,CAAC,CAC1C,CACA,SAASjD,GAAe+C,EAAKC,EAAM,CAC/B,GAAI,CACA,IAAMC,EAAQD,EAAK,MAAM,GAAG,EACxBE,EAAUH,EACd,QAAWK,KAAQH,EAAO,CACtB,GAA6BC,GAAY,KACrC,OAEJA,EAAUA,EAAQE,CAAI,CAC1B,CACA,OAAOF,CACX,MACU,CACN,OAAO,IACX,CACJ,CACA,SAASnD,GAAcsD,EAAQT,EAAO,CAClC,QAASU,KAAOD,EACZ,GAAIA,EAAOC,CAAG,IAAMV,EAChB,OAAOU,EAGf,OAAO,IACX,CACA,SAASrC,GAAe8B,EAAKO,EAAKV,EAAO,CACrC,GAAI,CACA,IAAMW,EAAOD,EAAI,MAAM,GAAG,EACpBE,EAAUD,EAAK,IAAI,EAEnBE,EAASF,EAAK,OAAO,CAACL,EAASI,MAC7B,CAACJ,EAAQI,CAAG,GAAK,OAAOJ,EAAQI,CAAG,GAAM,UAAY,MAAM,QAAQJ,EAAQI,CAAG,CAAC,KAC/EJ,EAAQI,CAAG,EAAI,CAAC,GAEbJ,EAAQI,CAAG,GACnBP,CAAG,EAEN,OAAAU,EAAOD,CAAO,EAAIZ,EACXG,CACX,MACU,CACN,MAAM,IAAI,MAAM,GAAGO,CAAG,kBAAkB,CAC5C,CACJ,CACA,SAASI,IAAWC,EAAI,CACpB,GAAG,CACC,WAAI,IAAIA,CAAG,EACJ,EACX,MACQ,CACJ,MAAO,EACX,CACJ,CAQA,IAAM5E,GAAN,MAAM6E,CAAI,CAEN,OAOA,YAAYC,EAAY,CACpB,GAAG,OAAOA,GAAa,UAAUA,GAAY,MAAM,eAAe,eAAe,EAC7E,KAAK,OAASA,MAEd,CACA,IAAMC,EAAU3E,GAAU0E,CAAU,EACpC,GAAIlB,GAAcmB,CAAO,EACrB,MAAM,IAAI,MAAM,uGAAuG,EAE3H,KAAK,OAAOA,CAChB,CACJ,CAQA,aAAa,OAAOhB,EAAMiB,EAAO,CAC1B,OAAOjB,GAAQ,cACX,GAAAkB,SAAYlB,CAAK,GAAG,GAAAmB,QAAG,WAAWnB,CAAK,EACtCA,EAAM,MAAM,GAAAmB,QAAG,SAAS,SAASnB,CAAK,EAElCY,IAAWZ,CAAK,IACpBA,EAAM,MAAM,MAAMA,CAAK,EACvBA,EAAM,MAAMA,EAAM,OAAO,IAMjC,GAAG,CACC,IAAMlD,EAAUJ,IAAgBsD,CAAK,EACrC,GAAIlD,EAAQ,SAAS,KAAK,GAAKA,EAAQ,SAAS,KAAK,GAAKA,EAAQ,SAAS,MAAM,EAAG,CAChF,IAAMsE,EAAU,MAAMnD,IAAO+B,CAAK,EAClC,GAAI,CAACoB,EACD,MAAM,IAAI,MAAM,8EAA8E,EAElGpB,EAAQoB,CACZ,CACJ,MACQ,CAER,CAEA,IAAMC,EAAM,MAAMhF,GAAU2D,EAAMiB,CAAK,EACvC,OAAO,IAAIH,EAAIO,CAAG,CACtB,CAMA,CAAC,OAAO,WAAW,EAAEC,EAAM,CACvB,OAAIA,IAAS,SAAiB,KAAK,SAAS,EACrC,KAAK,SAAS,CACzB,CAMA,CAAC,GAAAC,QAAK,QAAQ,MAAM,GAAI,CACpB,OAAO,KAAK,SAAS,CACzB,CAQA,SAASC,EAAStF,GAAW,KAAM,CAC/B,GAAI,CAACA,GAAW,eAAesF,CAAM,GAAKvE,GAAcf,GAAYsF,CAAM,IAAM,KAC5E,MAAM,IAAI,MAAM,sBAAsBA,CAAM,sBAAsB,OAAO,KAAKtF,EAAU,EAAE,KAAK,IAAI,CAAC,EAAE,EAE1G,IAAIuF,EAAY9E,GAAU,KAAK,OAAQ6E,CAAM,EAC7C,GAAI3B,GAAc4B,CAAS,EACvB,MAAM,IAAI,MAAM,0GAA0G,EAE9H,OAAOA,EAAU,SAAS,KAAK,CACnC,CAOA,SAASD,EAAStF,GAAW,SAAU,CACnC,OAAO,KAAK,OAAOsF,CAAM,CAC7B,CAGA,QAAS,CACL,OAAO,gBAAgB,KAAK,MAAM,CACtC,CAUA,IAAIE,EAAW5B,EAAO,CAClB,GAAI4B,GAAa,OAAOA,GAAc,SAClC,OAAO,OAAO,KAAK,OAAQA,CAAS,UAE/B,OAAOA,GAAc,UAAY5B,IAAU,OAAW,CAC3D,GAAInC,GAAS,eAAe+D,CAAS,EACjCA,EAAY/D,GAAS+D,CAAS,UAEzBzE,GAAcU,GAAU+D,CAAS,IAAM,KAC5C,OAAO,KAAK,OAEZ5B,IAAU,KACVrD,GAAkB,KAAK,OAAQiF,CAAS,EAGxC,KAAK,OAASvD,GAAe,KAAK,OAAQuD,EAAW5B,CAAK,CAElE,CACA,OAAO,KAAK,MAChB,CAKA,IAAII,EAAM,CACN,OAAIvC,GAAS,eAAeuC,CAAI,IAC5BA,EAAOvC,GAASuC,CAAI,GAEjBhD,GAAe,KAAK,OAAQgD,CAAI,CAC3C,CAMA,MAAM,MAAMyB,EAAS7F,GAAe,OAAQoE,EAAMJ,EAAO,CACrD,GAAI,CAAChE,GAAe,eAAe6F,CAAM,GAAK,CAAC1E,GAAcnB,GAAgB6F,CAAM,EAC/E,MAAM,IAAI,MAAM,wBAAwBA,CAAM,qBAAqB,OAAO,KAAK7F,EAAc,EAAE,KAAK,IAAI,CAAC,GAAG,EAEhH,YAAK,OAAS,MAAMoC,GAAM,KAAK,OAAQyD,EAAQzB,EAAMJ,CAAK,EACnD,KAAK,MAChB,CAMA,MAAM,MAAM6B,EAAS7F,GAAe,OAAQoE,EAAM,CAC9C,GAAI,CAACpE,GAAe,eAAe6F,CAAM,GAAK,CAAC1E,GAAcnB,GAAgB6F,CAAM,EAC/E,MAAM,IAAI,MAAM,wBAAwBA,CAAM,qBAAqB,OAAO,KAAK7F,EAAc,EAAE,KAAK,IAAI,CAAC,GAAG,EAEhH,OAAOkB,GAAM,KAAK,OAAQ2E,EAAQzB,CAAI,CAC1C,CAMA,OAAOsB,EAAStF,GAAW,SAAU,CACjC,GAAI,CAACA,GAAW,eAAesF,CAAM,GAAKvE,GAAcf,GAAYsF,CAAM,IAAM,KAC5E,MAAM,IAAI,MAAM,sBAAsBA,CAAM,sBAAsB,OAAO,KAAKtF,EAAU,EAAE,KAAK,IAAI,CAAC,EAAE,EAE1G,OAAOS,GAAU,KAAK,OAAQ6E,CAAM,CACxC,CAGA,MAAM,KAAKG,EAAO,MAAMC,EAAU,CAAC,EAAG,CAClC,IAAIP,EAAM,MAAM1E,GAAU,KAAK,OAAS,CAAC,MAAM,OAAO,OAAO,MAAM,EAAE,SAASgF,CAAM,EAAI,KAAK,OAAO,eAAe,IAAI,EAAEzF,GAAW,IAAIA,GAAW,KAAMA,GAAW,IAAI,EACxK,OAAOwB,IAAO2D,EAAKO,CAAO,CAC9B,CAGA,MAAM,OAAOC,EAAW,GAAOD,EAAU,CAAC,EAAG,CACzC,OAAO,MAAM5D,GAAU,KAAK,OAAQ,OAAO,OAAO4D,EAAS,CAAE,SAAAC,CAAS,CAAC,CAAC,CAC5E,CACA,MAAM,iBAAiBA,EAAW,GAAM,CACpC,OAAO,MAAM,oBAAoB,KAAK,OAAQA,CAAQ,CAC1D,CAEA,MAAM,iBAAiBC,EAAY,CAC/B,GAAI,CAACA,GAAc,CAAC/B,IAAkB+B,CAAU,GAAMA,GAAY,aAAe,KAAOA,GAAY,aAAe,KAAOA,GAAY,SAAW,KAAOA,GAAY,SAAW,IAC3K,MAAM,IAAI,MAAM,oGAAoG,OAAOA,CAAU,KAAKA,GAAY,MAAM,EAAE,EAElK,OAAOzE,GAAoByE,EAAY,KAAK,MAAM,CACtD,CAMA,MAAM,eAAeH,EAAS7F,GAAe,OAAQ,CACjD,GAAI,CAACA,GAAe,eAAe6F,CAAM,GAAK,CAAC1E,GAAcnB,GAAgB6F,CAAM,EAC/E,MAAM,IAAI,MAAM,wBAAwBA,CAAM,qBAAqB,OAAO,KAAK7F,EAAc,EAAE,KAAK,IAAI,CAAC,GAAG,EAEhH,OAAO0B,GAAiB,KAAK,OAAQmE,CAAM,CAC/C,CACJ,EAEM3F,GAAiB+F,GAAa,eA+BpC,IAAOC,IAAO,CACV,IAAAC,GAGA,GAAGC,GACH,GAAGC,GAEH,GAAGC,GAEH,oBAAAC,GACA,qBAAAC,GACA,wBAAAC,GACA,kBAAAC,GACA,uBAAAC,GACA,wBAAAC,GACA,gCAAAC,GACA,8BAAAC,GACA,UAAAC,GACA,cAAAC,GACA,WAAAC,GACA,WAAAC,GACA,WAAAC,GACA,iBAAAC,GACA,MAAAC,GACA,MAAAC,GACA,UAAAC,GACA,aAAAC,GAEA,eAAAC,GAGA,eAAAC,GACA,eAAAC,GACA,kBAAAC,GACA,cAAAC,EACJ",
  "names": ["backTables", "lookupTables", "childGenTables", "islandAddresses", "init_data", "__esmMin", "import_buffer", "nodeCrypto", "import_fs", "isNode", "createCipheriv", "createDecipheriv", "randomBytes", "createHmac", "createHash", "timingSafeEqual", "init_platform", "__esmMin", "string_to_bytes", "str", "utf8", "len", "bytes", "i", "j", "c", "is_bytes", "a", "_heap_init", "heap", "heapSize", "size", "_heap_write", "hpos", "data", "dpos", "dlen", "hlen", "wlen", "Number_extGCD", "b", "sa", "sb", "xi", "xj", "yi", "yj", "r", "q", "t", "a_cmp_b", "BigNumber_extGCD", "t2", "BigNumber", "lx", "ly", "z", "getRandomValues", "buf", "randomBytes", "_half_imul", "__extends", "IllegalStateError", "IllegalArgumentError", "SecurityError", "AES_asm", "AES", "_AES_CCM_adata_maxLength", "_AES_CCM_data_maxLength", "AES_CCM", "bigint_asm", "__extends$1", "_bigint_stdlib", "_bigint_heap", "_bigint_asm", "_BigNumber_ZERO_limbs", "Modulus", "_K256", "_AES_CCM", "init_asmCrypto", "__esmMin", "init_platform", "extendStatics", "d", "p", "__", "_super", "args", "_i", "_this", "ginit_done", "gexp3", "glog3", "ginit", "gmul", "ginv", "aes_init_done", "aes_sbox", "aes_sinv", "aes_enc", "aes_dec", "aes_init", "_s", "s", "x", "wrapper", "foreign", "buffer", "set_key", "ks", "k0", "k1", "k2", "k3", "k4", "k5", "k6", "k7", "ekeys", "dkeys", "rcon", "k", "jj", "asm", "stdlib", "S0", "S1", "S2", "S3", "I0", "I1", "I2", "I3", "N0", "N1", "N2", "N3", "M0", "M1", "M2", "M3", "H0", "H1", "H2", "H3", "R", "HEAP", "DATA", "_core", "x0", "x1", "x2", "x3", "t1", "t3", "y0", "y1", "y2", "y3", "_ecb_enc", "_ecb_dec", "_cbc_enc", "_cbc_dec", "_cfb_enc", "_cfb_dec", "_ofb", "_ctr", "_gcm_mac", "z0", "z1", "z2", "z3", "set_rounds", "set_state", "s0", "s1", "s2", "s3", "set_iv", "i0", "i1", "i2", "i3", "set_nonce", "n0", "n1", "n2", "n3", "set_mask", "m0", "m1", "m2", "m3", "set_counter", "c0", "c1", "c2", "c3", "get_state", "pos", "get_iv", "gcm_init", "cipher", "mode", "ret", "_cipher_modes", "mac", "_mac_modes", "key", "iv", "padding", "keylen", "keyview", "ivview", "amode", "rpos", "rlen", "result", "plen", "pad", "pcheck", "nonce", "adata", "tagSize", "dataLength", "aes", "clear", "tagsize", "result1", "result2", "lengthSize", "counter", "tlen", "atag", "acheck", "mask", "view", "SP", "HEAP32", "imul", "sreset", "salloc", "l", "sfree", "cp", "A", "B", "neg", "lA", "lR", "cmp", "lB", "tst", "add", "sub", "mul", "al0", "al1", "al2", "al3", "al4", "al5", "al6", "al7", "ah0", "ah1", "ah2", "ah3", "ah4", "ah5", "ah6", "ah7", "bl0", "bl1", "bl2", "bl3", "bl4", "bl5", "bl6", "bl7", "bh0", "bh1", "bh2", "bh3", "bh4", "bh5", "bh6", "bh7", "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", "u", "v", "w", "m", "Ai", "Bj", "Rk", "sqr", "h", "dd", "Aj", "div", "N", "lN", "D", "lD", "Q", "n", "e", "u1", "u0", "v0", "vh", "vl", "qh", "ql", "rh", "rl", "mredc", "y", "uh", "ul", "w0", "w1", "w2", "num", "limbs", "bitlen", "sign", "absnum", "obj", "bn", "radix", "bytelen", "bits", "clamped", "f", "sliced", "slimbs", "negative", "that", "alimbs", "alimbcnt", "blimbs", "blimbcnt", "abitlen", "asign", "bbitlen", "bsign", "rbitlen", "rlimbcnt", "rsign", "rof", "pA", "pB", "pR", "qlimbcnt", "quotient", "remainder", "pQ", "rounds", "paranoia", "s5", "s17", "l3", "l5", "l17", "number", "comodulus", "g", "g2", "gn", "nlimbs", "nlimbcnt", "pN", "miiCrypto_exports", "__export", "decryptMii", "decryptStudio2", "encryptMii", "encryptStudio2", "miiCrcCalc", "Uint8Cat", "arrays", "totalLength", "sum", "arr", "result", "offset", "crc16", "data", "current", "crc", "i", "byte", "bit", "generateCrc32Table", "table", "poly", "j", "crc32", "input", "crc32CksumTable", "encryptAesCtr", "dataU8", "iv", "randomBytes", "AES_IV_LENGTH", "cipher", "createCipheriv", "AES_CTR_KEY", "encrypted", "decryptAesCtr", "encryptedU8", "ivU8", "decipher", "createDecipheriv", "decrypted", "decryptAesCcm", "encryptedData", "nonce", "WRAPPED_ID_LENGTH", "ciphertext", "plaintext", "_AES_CCM", "AES_CCM_KEY", "WRAPPED_NONCE_LENGTH", "encryptAesCcm", "storeData", "idEndOffset", "WRAPPED_ID_OFFSET", "wrappedID", "content", "VER3_STORE_DATA_LENGTH", "correctEncryptedContentLength", "WRAPPED_TAG_LENGTH", "encryptedContentCorrected", "tag", "uint8Data", "WRAPPED_MII_DATA_LENGTH", "ivOffset", "encryptedExtra", "decryptedExtra", "extraData", "crcOffset", "crcActual", "encryptedForCrc", "offsetForCrc", "dataForCrc", "crcExpected", "encryptedBase", "extraWithCrc", "encryptedBytes", "dat", "mode", "studioBytes", "label", "hex", "assertStudioLength", "bytes", "expectedLength", "unencryptedMNMS", "seed", "STUDIO_MII_DATA_LENGTH", "ENCRYPTED_STUDIO_MII_DATA_LENGTH", "encryptedMNMS", "init_miiCrypto", "__esmMin", "init_asmCrypto", "init_platform", "require_lodash", "__commonJSMin", "exports", "module", "undefined", "VERSION", "LARGE_ARRAY_SIZE", "CORE_ERROR_TEXT", "FUNC_ERROR_TEXT", "INVALID_TEMPL_VAR_ERROR_TEXT", "HASH_UNDEFINED", "MAX_MEMOIZE_SIZE", "PLACEHOLDER", "CLONE_DEEP_FLAG", "CLONE_FLAT_FLAG", "CLONE_SYMBOLS_FLAG", "COMPARE_PARTIAL_FLAG", "COMPARE_UNORDERED_FLAG", "WRAP_BIND_FLAG", "WRAP_BIND_KEY_FLAG", "WRAP_CURRY_BOUND_FLAG", "WRAP_CURRY_FLAG", "WRAP_CURRY_RIGHT_FLAG", "WRAP_PARTIAL_FLAG", "WRAP_PARTIAL_RIGHT_FLAG", "WRAP_ARY_FLAG", "WRAP_REARG_FLAG", "WRAP_FLIP_FLAG", "DEFAULT_TRUNC_LENGTH", "DEFAULT_TRUNC_OMISSION", "HOT_COUNT", "HOT_SPAN", "LAZY_FILTER_FLAG", "LAZY_MAP_FLAG", "LAZY_WHILE_FLAG", "INFINITY", "MAX_SAFE_INTEGER", "MAX_INTEGER", "NAN", "MAX_ARRAY_LENGTH", "MAX_ARRAY_INDEX", "HALF_MAX_ARRAY_LENGTH", "wrapFlags", "argsTag", "arrayTag", "asyncTag", "boolTag", "dateTag", "domExcTag", "errorTag", "funcTag", "genTag", "mapTag", "numberTag", "nullTag", "objectTag", "promiseTag", "proxyTag", "regexpTag", "setTag", "stringTag", "symbolTag", "undefinedTag", "weakMapTag", "weakSetTag", "arrayBufferTag", "dataViewTag", "float32Tag", "float64Tag", "int8Tag", "int16Tag", "int32Tag", "uint8Tag", "uint8ClampedTag", "uint16Tag", "uint32Tag", "reEmptyStringLeading", "reEmptyStringMiddle", "reEmptyStringTrailing", "reEscapedHtml", "reUnescapedHtml", "reHasEscapedHtml", "reHasUnescapedHtml", "reEscape", "reEvaluate", "reInterpolate", "reIsDeepProp", "reIsPlainProp", "rePropName", "reRegExpChar", "reHasRegExpChar", "reTrimStart", "reWhitespace", "reWrapComment", "reWrapDetails", "reSplitDetails", "reAsciiWord", "reForbiddenIdentifierChars", "reEscapeChar", "reEsTemplate", "reFlags", "reIsBadHex", "reIsBinary", "reIsHostCtor", "reIsOctal", "reIsUint", "reLatin", "reNoMatch", "reUnescapedString", "rsAstralRange", "rsComboMarksRange", "reComboHalfMarksRange", "rsComboSymbolsRange", "rsComboRange", "rsDingbatRange", "rsLowerRange", "rsMathOpRange", "rsNonCharRange", "rsPunctuationRange", "rsSpaceRange", "rsUpperRange", "rsVarRange", "rsBreakRange", "rsApos", "rsAstral", "rsBreak", "rsCombo", "rsDigits", "rsDingbat", "rsLower", "rsMisc", "rsFitz", "rsModifier", "rsNonAstral", "rsRegional", "rsSurrPair", "rsUpper", "rsZWJ", "rsMiscLower", "rsMiscUpper", "rsOptContrLower", "rsOptContrUpper", "reOptMod", "rsOptVar", "rsOptJoin", "rsOrdLower", "rsOrdUpper", "rsSeq", "rsEmoji", "rsSymbol", "reApos", "reComboMark", "reUnicode", "reUnicodeWord", "reHasUnicode", "reHasUnicodeWord", "contextProps", "templateCounter", "typedArrayTags", "cloneableTags", "deburredLetters", "htmlEscapes", "htmlUnescapes", "stringEscapes", "freeParseFloat", "freeParseInt", "freeGlobal", "freeSelf", "root", "freeExports", "freeModule", "moduleExports", "freeProcess", "nodeUtil", "types", "nodeIsArrayBuffer", "nodeIsDate", "nodeIsMap", "nodeIsRegExp", "nodeIsSet", "nodeIsTypedArray", "apply", "func", "thisArg", "args", "arrayAggregator", "array", "setter", "iteratee", "accumulator", "index", "length", "value", "arrayEach", "arrayEachRight", "arrayEvery", "predicate", "arrayFilter", "resIndex", "result", "arrayIncludes", "baseIndexOf", "arrayIncludesWith", "comparator", "arrayMap", "arrayPush", "values", "offset", "arrayReduce", "initAccum", "arrayReduceRight", "arraySome", "asciiSize", "baseProperty", "asciiToArray", "string", "asciiWords", "baseFindKey", "collection", "eachFunc", "key", "baseFindIndex", "fromIndex", "fromRight", "strictIndexOf", "baseIsNaN", "baseIndexOfWith", "baseMean", "baseSum", "object", "basePropertyOf", "baseReduce", "baseSortBy", "comparer", "current", "baseTimes", "n", "baseToPairs", "props", "baseTrim", "trimmedEndIndex", "baseUnary", "baseValues", "cacheHas", "cache", "charsStartIndex", "strSymbols", "chrSymbols", "charsEndIndex", "countHolders", "placeholder", "deburrLetter", "escapeHtmlChar", "escapeStringChar", "chr", "getValue", "hasUnicode", "hasUnicodeWord", "iteratorToArray", "iterator", "data", "mapToArray", "map", "overArg", "transform", "arg", "replaceHolders", "setToArray", "set", "setToPairs", "strictLastIndexOf", "stringSize", "unicodeSize", "stringToArray", "unicodeToArray", "unescapeHtmlChar", "unicodeWords", "runInContext", "context", "_", "Array", "Date", "Error", "Function", "Math", "Object", "RegExp", "String", "TypeError", "arrayProto", "funcProto", "objectProto", "coreJsData", "funcToString", "hasOwnProperty", "idCounter", "maskSrcKey", "uid", "nativeObjectToString", "objectCtorString", "oldDash", "reIsNative", "Buffer", "Symbol", "Uint8Array", "allocUnsafe", "getPrototype", "objectCreate", "propertyIsEnumerable", "splice", "spreadableSymbol", "symIterator", "symToStringTag", "defineProperty", "getNative", "ctxClearTimeout", "ctxNow", "ctxSetTimeout", "nativeCeil", "nativeFloor", "nativeGetSymbols", "nativeIsBuffer", "nativeIsFinite", "nativeJoin", "nativeKeys", "nativeMax", "nativeMin", "nativeNow", "nativeParseInt", "nativeRandom", "nativeReverse", "DataView", "Map", "Promise", "Set", "WeakMap", "nativeCreate", "metaMap", "realNames", "dataViewCtorString", "toSource", "mapCtorString", "promiseCtorString", "setCtorString", "weakMapCtorString", "symbolProto", "symbolValueOf", "symbolToString", "lodash", "isObjectLike", "isArray", "LazyWrapper", "LodashWrapper", "wrapperClone", "baseCreate", "proto", "isObject", "baseLodash", "chainAll", "lazyClone", "copyArray", "lazyReverse", "lazyValue", "dir", "isArr", "isRight", "arrLength", "view", "getView", "start", "end", "iteratees", "iterLength", "takeCount", "baseWrapperValue", "outer", "iterIndex", "type", "computed", "Hash", "entries", "entry", "hashClear", "hashDelete", "hashGet", "hashHas", "hashSet", "ListCache", "listCacheClear", "listCacheDelete", "assocIndexOf", "lastIndex", "listCacheGet", "listCacheHas", "listCacheSet", "MapCache", "mapCacheClear", "mapCacheDelete", "getMapData", "mapCacheGet", "mapCacheHas", "mapCacheSet", "size", "SetCache", "setCacheAdd", "setCacheHas", "Stack", "stackClear", "stackDelete", "stackGet", "stackHas", "stackSet", "pairs", "arrayLikeKeys", "inherited", "isArg", "isArguments", "isBuff", "isBuffer", "isType", "isTypedArray", "skipIndexes", "isIndex", "arraySample", "baseRandom", "arraySampleSize", "shuffleSelf", "baseClamp", "arrayShuffle", "assignMergeValue", "eq", "baseAssignValue", "assignValue", "objValue", "baseAggregator", "baseEach", "baseAssign", "source", "copyObject", "keys", "baseAssignIn", "keysIn", "baseAt", "paths", "skip", "get", "number", "lower", "upper", "baseClone", "bitmask", "customizer", "stack", "isDeep", "isFlat", "isFull", "initCloneArray", "tag", "getTag", "isFunc", "cloneBuffer", "initCloneObject", "copySymbolsIn", "copySymbols", "initCloneByTag", "stacked", "isSet", "subValue", "isMap", "keysFunc", "getAllKeysIn", "getAllKeys", "baseConforms", "baseConformsTo", "baseDelay", "wait", "setTimeout", "baseDifference", "includes", "isCommon", "valuesLength", "valuesIndex", "createBaseEach", "baseForOwn", "baseEachRight", "baseForOwnRight", "baseEvery", "baseExtremum", "isSymbol", "baseFill", "toInteger", "toLength", "baseFilter", "baseFlatten", "depth", "isStrict", "isFlattenable", "baseFor", "createBaseFor", "baseForRight", "baseFunctions", "isFunction", "baseGet", "path", "castPath", "toKey", "baseGetAllKeys", "symbolsFunc", "baseGetTag", "getRawTag", "objectToString", "baseGt", "other", "baseHas", "baseHasIn", "baseInRange", "baseIntersection", "arrays", "othLength", "othIndex", "caches", "maxLength", "seen", "baseInverter", "baseInvoke", "parent", "last", "baseIsArguments", "baseIsArrayBuffer", "baseIsDate", "baseIsEqual", "baseIsEqualDeep", "equalFunc", "objIsArr", "othIsArr", "objTag", "othTag", "objIsObj", "othIsObj", "isSameTag", "equalArrays", "equalByTag", "objIsWrapped", "othIsWrapped", "objUnwrapped", "othUnwrapped", "equalObjects", "baseIsMap", "baseIsMatch", "matchData", "noCustomizer", "srcValue", "baseIsNative", "isMasked", "pattern", "baseIsRegExp", "baseIsSet", "baseIsTypedArray", "isLength", "baseIteratee", "identity", "baseMatchesProperty", "baseMatches", "property", "baseKeys", "isPrototype", "baseKeysIn", "nativeKeysIn", "isProto", "baseLt", "baseMap", "isArrayLike", "getMatchData", "matchesStrictComparable", "isKey", "isStrictComparable", "hasIn", "baseMerge", "srcIndex", "baseMergeDeep", "newValue", "safeGet", "mergeFunc", "isTyped", "isArrayLikeObject", "cloneTypedArray", "isPlainObject", "toPlainObject", "baseNth", "baseOrderBy", "orders", "getIteratee", "criteria", "compareMultiple", "basePick", "basePickBy", "baseSet", "basePropertyDeep", "basePullAll", "indexOf", "basePullAt", "indexes", "previous", "baseUnset", "baseRange", "step", "baseRepeat", "baseRest", "setToString", "overRest", "baseSample", "baseSampleSize", "nested", "baseSetData", "baseSetToString", "constant", "baseShuffle", "baseSlice", "baseSome", "baseSortedIndex", "retHighest", "low", "high", "mid", "baseSortedIndexBy", "valIsNaN", "valIsNull", "valIsSymbol", "valIsUndefined", "othIsDefined", "othIsNull", "othIsReflexive", "othIsSymbol", "setLow", "baseSortedUniq", "baseToNumber", "baseToString", "baseUniq", "createSet", "seenIndex", "isRootPrimitive", "obj", "baseUpdate", "updater", "baseWhile", "isDrop", "actions", "action", "baseXor", "baseZipObject", "assignFunc", "valsLength", "castArrayLikeObject", "castFunction", "stringToPath", "toString", "castRest", "castSlice", "clearTimeout", "id", "buffer", "cloneArrayBuffer", "arrayBuffer", "cloneDataView", "dataView", "cloneRegExp", "regexp", "cloneSymbol", "symbol", "typedArray", "compareAscending", "valIsDefined", "valIsReflexive", "objCriteria", "othCriteria", "ordersLength", "order", "composeArgs", "partials", "holders", "isCurried", "argsIndex", "argsLength", "holdersLength", "leftIndex", "leftLength", "rangeLength", "isUncurried", "composeArgsRight", "holdersIndex", "rightIndex", "rightLength", "isNew", "getSymbols", "getSymbolsIn", "createAggregator", "initializer", "createAssigner", "assigner", "sources", "guard", "isIterateeCall", "iterable", "createBind", "isBind", "Ctor", "createCtor", "wrapper", "fn", "createCaseFirst", "methodName", "trailing", "createCompounder", "callback", "words", "deburr", "thisBinding", "createCurry", "arity", "getHolder", "createRecurry", "createHybrid", "createFind", "findIndexFunc", "createFlow", "flatRest", "funcs", "prereq", "getFuncName", "funcName", "getData", "isLaziable", "partialsRight", "holdersRight", "argPos", "ary", "isAry", "isBindKey", "isFlip", "holdersCount", "newHolders", "reorder", "createInverter", "toIteratee", "createMathOperation", "operator", "defaultValue", "createOver", "arrayFunc", "createPadding", "chars", "charsLength", "createPartial", "createRange", "toFinite", "createRelationalOperation", "toNumber", "wrapFunc", "isCurry", "newHoldersRight", "newPartials", "newPartialsRight", "newData", "setData", "setWrapToString", "createRound", "precision", "pair", "noop", "createToPairs", "createWrap", "mergeData", "customDefaultsAssignIn", "customDefaultsMerge", "customOmitClone", "isPartial", "arrStacked", "othStacked", "arrValue", "othValue", "compared", "convert", "objProps", "objLength", "othProps", "objStacked", "skipCtor", "objCtor", "othCtor", "flatten", "otherFunc", "isKeyable", "isOwn", "unmasked", "stubArray", "ctorString", "transforms", "getWrapDetails", "match", "hasPath", "hasFunc", "insertWrapDetails", "details", "isMaskable", "stubFalse", "memoizeCapped", "memoize", "srcBitmask", "newBitmask", "isCombo", "otherArgs", "oldArray", "shortOut", "reference", "updateWrapDetails", "count", "lastCalled", "stamp", "remaining", "rand", "quote", "subString", "chunk", "compact", "concat", "difference", "differenceBy", "differenceWith", "drop", "dropRight", "dropRightWhile", "dropWhile", "fill", "findIndex", "findLastIndex", "flattenDeep", "flattenDepth", "fromPairs", "head", "initial", "intersection", "mapped", "intersectionBy", "intersectionWith", "join", "separator", "lastIndexOf", "nth", "pull", "pullAll", "pullAllBy", "pullAllWith", "pullAt", "remove", "reverse", "slice", "sortedIndex", "sortedIndexBy", "sortedIndexOf", "sortedLastIndex", "sortedLastIndexBy", "sortedLastIndexOf", "sortedUniq", "sortedUniqBy", "tail", "take", "takeRight", "takeRightWhile", "takeWhile", "union", "unionBy", "unionWith", "uniq", "uniqBy", "uniqWith", "unzip", "group", "unzipWith", "without", "xor", "xorBy", "xorWith", "zip", "zipObject", "zipObjectDeep", "zipWith", "chain", "tap", "interceptor", "thru", "wrapperAt", "wrapperChain", "wrapperCommit", "wrapperNext", "toArray", "done", "wrapperToIterator", "wrapperPlant", "clone", "wrapperReverse", "wrapped", "wrapperValue", "countBy", "every", "filter", "find", "findLast", "flatMap", "flatMapDeep", "flatMapDepth", "forEach", "forEachRight", "groupBy", "isString", "invokeMap", "keyBy", "orderBy", "partition", "reduce", "reduceRight", "reject", "negate", "sample", "sampleSize", "shuffle", "some", "sortBy", "now", "after", "before", "bind", "bindKey", "curry", "curryRight", "debounce", "options", "lastArgs", "lastThis", "maxWait", "timerId", "lastCallTime", "lastInvokeTime", "leading", "maxing", "invokeFunc", "time", "leadingEdge", "timerExpired", "remainingWait", "timeSinceLastCall", "timeSinceLastInvoke", "timeWaiting", "shouldInvoke", "trailingEdge", "cancel", "flush", "debounced", "isInvoking", "defer", "delay", "flip", "resolver", "memoized", "once", "overArgs", "funcsLength", "partial", "partialRight", "rearg", "rest", "spread", "throttle", "unary", "wrap", "castArray", "cloneWith", "cloneDeep", "cloneDeepWith", "conformsTo", "gt", "gte", "isArrayBuffer", "isBoolean", "isDate", "isElement", "isEmpty", "isEqual", "isEqualWith", "isError", "isFinite", "isInteger", "isMatch", "isMatchWith", "isNaN", "isNumber", "isNative", "isNull", "isNil", "isRegExp", "isSafeInteger", "isUndefined", "isWeakMap", "isWeakSet", "lt", "lte", "sign", "remainder", "isBinary", "toSafeInteger", "assign", "assignIn", "assignInWith", "assignWith", "at", "create", "prototype", "properties", "defaults", "propsIndex", "propsLength", "defaultsDeep", "mergeWith", "findKey", "findLastKey", "forIn", "forInRight", "forOwn", "forOwnRight", "functions", "functionsIn", "has", "invert", "invertBy", "invoke", "mapKeys", "mapValues", "merge", "omit", "omitBy", "pickBy", "pick", "prop", "setWith", "toPairs", "toPairsIn", "isArrLike", "unset", "update", "updateWith", "valuesIn", "clamp", "inRange", "random", "floating", "temp", "camelCase", "word", "capitalize", "upperFirst", "endsWith", "target", "position", "escape", "escapeRegExp", "kebabCase", "lowerCase", "lowerFirst", "pad", "strLength", "padEnd", "padStart", "parseInt", "radix", "repeat", "replace", "snakeCase", "split", "limit", "startCase", "startsWith", "template", "settings", "imports", "importsKeys", "importsValues", "isEscaping", "isEvaluating", "interpolate", "reDelimiters", "sourceURL", "escapeValue", "interpolateValue", "esTemplateValue", "evaluateValue", "variable", "attempt", "toLower", "toUpper", "trim", "trimEnd", "trimStart", "truncate", "omission", "substring", "newEnd", "unescape", "upperCase", "e", "bindAll", "methodNames", "cond", "conforms", "defaultTo", "flow", "flowRight", "matches", "matchesProperty", "method", "methodOf", "mixin", "noConflict", "nthArg", "over", "overEvery", "overSome", "propertyOf", "range", "rangeRight", "stubObject", "stubString", "stubTrue", "times", "toPath", "uniqueId", "prefix", "add", "augend", "addend", "ceil", "divide", "dividend", "divisor", "floor", "max", "maxBy", "mean", "meanBy", "min", "minBy", "multiply", "multiplier", "multiplicand", "round", "subtract", "minuend", "subtrahend", "sum", "sumBy", "isFilter", "takeName", "dropName", "checkIteratee", "isTaker", "lodashFunc", "retUnwrapped", "isLazy", "useLazy", "isHybrid", "isUnwrapped", "onlyLazy", "chainName", "require_jsQR", "__commonJSMin", "exports", "module", "root", "factory", "modules", "installedModules", "__webpack_require__", "moduleId", "name", "getter", "object", "property", "BitMatrix", "data", "width", "height", "x", "y", "v", "left", "top", "GenericGFPoly_1", "addOrSubtractGF", "a", "b", "GenericGF", "primitive", "size", "genBase", "i", "degree", "coefficient", "coefficients", "GenericGF_1", "GenericGFPoly", "field", "coefficientsLength", "firstNonZero", "other", "_a", "smallerCoefficients", "largerCoefficients", "sumDiff", "lengthDiff", "scalar", "product", "aCoefficients", "aLength", "bCoefficients", "bLength", "aCoeff", "j", "result", "binarizer_1", "decoder_1", "extractor_1", "locator_1", "scan", "matrix", "locations", "_i", "locations_1", "location_1", "extracted", "decoded", "defaultOptions", "jsQR", "providedOptions", "options", "opt", "shouldInvert", "tryInvertedFirst", "binarized", "inverted", "BitMatrix_1", "REGION_SIZE", "MIN_DYNAMIC_RANGE", "numBetween", "value", "min", "max", "Matrix", "binarize", "returnInverted", "greyscalePixels", "r", "g", "horizontalRegionCount", "verticalRegionCount", "blackPoints", "verticalRegion", "hortizontalRegion", "sum", "pixelLumosity", "average", "averageNeighborBlackPoint", "top_1", "xRegion", "yRegion", "threshold", "lum", "decodeData_1", "reedsolomon_1", "version_1", "numBitsDiffering", "z", "bitCount", "pushBit", "bit", "byte", "FORMAT_INFO_TABLE", "DATA_MASKS", "p", "buildFunctionPatternMask", "version", "dimension", "_b", "_c", "readCodewords", "formatInfo", "dataMask", "functionPatternMask", "codewords", "currentByte", "bitsRead", "readingUp", "columnIndex", "columnOffset", "readVersion", "provisionalVersion", "topRightVersionBits", "bottomLeftVersionBits", "bestDifference", "bestVersion", "VERSIONS_1", "difference", "readFormatInformation", "topLeftFormatInfoBits", "topRightBottomRightFormatInfoBits", "bestFormatInfo", "FORMAT_INFO_TABLE_1", "bits", "getDataBlocks", "ecLevel", "ecInfo", "dataBlocks", "totalCodewords", "block", "shortBlockSize", "dataBlocks_1", "dataBlock", "smallBlockCount", "largeBlockCount", "dataBlocks_2", "decodeMatrix", "totalBytes", "resultBytes", "resultIndex", "dataBlocks_3", "correctedBytes", "decode", "BitStream_1", "shiftJISTable_1", "Mode", "ModeByte", "decodeNumeric", "stream", "bytes", "text", "characterCountSize", "length", "num", "c", "AlphanumericCharacterCodes", "decodeAlphanumeric", "decodeByte", "decodeKanji", "k", "_d", "mode", "numericResult", "alphanumericResult", "byteResult", "kanjiResult", "BitStream", "numBits", "bitsLeft", "toRead", "bitsToNotRead", "mask", "runEuclideanAlgorithm", "R", "rLast", "tLast", "t", "rLastLast", "tLastLast", "q", "denominatorLeadingTerm", "dltInverse", "degreeDiff", "scale", "sigmaTildeAtZero", "inverse", "findErrorLocations", "errorLocator", "numErrors", "errorCount", "findErrorMagnitudes", "errorEvaluator", "errorLocations", "s", "xiInverse", "denominator", "twoS", "outputBytes", "poly", "syndromeCoefficients", "error", "evaluation", "syndrome", "sigmaOmega", "errorMagnitudes", "position", "squareToQuadrilateral", "p1", "p2", "p3", "p4", "dx3", "dy3", "dx1", "dx2", "dy1", "dy2", "a13", "a23", "quadrilateralToSquare", "sToQ", "times", "extract", "image", "location", "qToS", "transform", "mappingFunction", "xValue", "yValue", "sourcePixel", "MAX_FINDERPATTERNS_TO_SEARCH", "MIN_QUAD_RATIO", "MAX_QUAD_RATIO", "distance", "values", "reorderFinderPatterns", "pattern1", "pattern2", "pattern3", "oneTwoDistance", "twoThreeDistance", "oneThreeDistance", "bottomLeft", "topLeft", "topRight", "computeDimension", "moduleSize", "countBlackWhiteRun", "topDimension", "sideDimension", "countBlackWhiteRunTowardsPoint", "origin", "end", "switchPoints", "steep", "fromX", "fromY", "toX", "toY", "dx", "dy", "xStep", "yStep", "currentPixel", "realX", "realY", "distances", "rise", "run", "towardsEnd", "awayFromEnd", "middleValue", "scoreBlackWhiteRun", "sequence", "ratios", "averageSize", "ratio", "scorePattern", "point", "horizontalRun", "verticalRun", "topLeftPoint", "topLeftBottomRightRun", "bottomLeftPoint", "bottomLeftTopRightRun", "horzError", "vertError", "diagDownError", "diagUpError", "ratioError", "avgSize", "sizeError", "recenterLocation", "leftX", "rightX", "topY", "bottomY", "locate", "finderPatternQuads", "activeFinderPatternQuads", "alignmentPatternQuads", "activeAlignmentPatternQuads", "_loop_1", "length_1", "lastBit", "scans", "_loop_2", "averageFinderPatternBlocksize", "validFinderPattern", "averageAlignmentPatternBlocksize", "validAlignmentPattern", "endX_1", "startX_1", "line", "matchingQuads", "endX_2", "startX_2", "finderPatternGroups", "lengths", "score", "finderPatterns", "otherPoints", "ii", "alignment", "findAlignmentPattern", "midTopRight", "midTopLeft", "midBottomLeft", "centeredAlignment", "bottomRightFinderPattern", "modulesBetweenFinderPatterns", "correctionToTopLeft", "expectedAlignmentPattern", "alignmentPatterns", "sizeScore", "alignmentPattern", "root", "factory", "exports", "module", "define", "amd", "this", "t", "e", "i", "r", "qrcode", "typeNumber", "errorCorrectionLevel", "_typeNumber", "_errorCorrectionLevel", "QRErrorCorrectionLevel", "_modules", "_moduleCount", "_dataCache", "_dataList", "_this", "makeImpl", "test", "maskPattern", "moduleCount", "modules", "Array", "row", "col", "setupPositionProbePattern", "setupPositionAdjustPattern", "setupTimingPattern", "setupTypeInfo", "setupTypeNumber", "createData", "mapData", "c", "pos", "QRUtil", "getPatternPosition", "length", "j", "bits", "getBCHTypeNumber", "mod", "Math", "floor", "data", "getBCHTypeInfo", "inc", "bitIndex", "byteIndex", "maskFunc", "getMaskFunction", "dark", "dataList", "rsBlocks", "QRRSBlock", "getRSBlocks", "buffer", "qrBitBuffer", "put", "getMode", "getLength", "getLengthInBits", "write", "totalDataCount", "dataCount", "putBit", "offset", "maxDcCount", "maxEcCount", "dcdata", "ecdata", "dcCount", "ecCount", "totalCount", "max", "getBuffer", "rsPoly", "getErrorCorrectPolynomial", "modPoly", "qrPolynomial", "modIndex", "getAt", "totalCodeCount", "index", "addData", "mode", "newData", "qrNumber", "qrAlphaNum", "qr8BitByte", "qrKanji", "push", "isDark", "getModuleCount", "make", "minLostPoint", "pattern", "lostPoint", "getLostPoint", "getBestMaskPattern", "createTableTag", "cellSize", "margin", "qrHtml", "createSvgTag", "alt", "title", "opts", "arguments", "text", "id", "mr", "rect", "size", "qrSvg", "scalable", "escapeXml", "join", "trim", "createDataURL", "min", "x", "y", "createImgTag", "img", "s", "escaped", "charAt", "createASCII", "r1", "r2", "p", "blocks", "blocksLastLineNoMargin", "ascii", "substring", "white", "black", "line", "renderTo2dContext", "context", "fillStyle", "fillRect", "stringToBytes", "stringToBytesFuncs", "bytes", "charCodeAt", "createStringToBytes", "unicodeData", "numChars", "unicodeMap", "bin", "base64DecodeInputStream", "read", "b", "count", "b0", "b1", "v", "String", "fromCharCode", "unknownChar", "PATTERN_POSITION_TABLE", "G15", "G18", "getBCHDigit", "L", "M", "Q", "H", "digit", "d", "errorCorrectLength", "a", "multiply", "QRMath", "gexp", "type", "sameCount", "darkCount", "abs", "EXP_TABLE", "LOG_TABLE", "n", "num", "shift", "_num", "glog", "ratio", "RS_BLOCK_TABLE", "qrRSBlock", "rsBlock", "list", "_buffer", "_length", "bufIndex", "bit", "_data", "strToNum", "chatToNum", "getCode", "_bytes", "byteArrayOutputStream", "writeByte", "off", "len", "str", "_str", "_pos", "_buflen", "match", "decode", "width", "height", "getPixel", "gif", "_width", "_height", "pixel", "out", "writeString", "writeShort", "raster", "getLZWRaster", "writeBytes", "lzwMinCodeSize", "clearCode", "endCode", "bitLength", "table", "lzwTable", "add", "_out", "_bitLength", "_bitBuffer", "byteOut", "bitOut", "dataIndex", "contains", "indexOf", "flush", "toByteArray", "_map", "_size", "key", "setPixel", "base64", "_base64", "writeEncoded", "encode", "padlen", "toString", "base64EncodeOutputStream", "utf8", "charcode", "__webpack_module_cache__", "__webpack_require__", "moduleId", "cachedModule", "__webpack_modules__", "getter", "__esModule", "definition", "o", "Object", "defineProperty", "enumerable", "get", "obj", "prop", "prototype", "hasOwnProperty", "call", "isObject", "isArray", "mergeDeep", "target", "sources", "source", "keys", "forEach", "targetValue", "sourceValue", "assign", "downloadURI", "uri", "name", "link", "document", "createElement", "download", "href", "body", "appendChild", "click", "removeChild", "QRDot", "constructor", "svg", "window", "_svg", "_type", "_window", "getNeighbor", "drawFunction", "_drawDot", "_drawClassy", "_drawClassyRounded", "_drawRounded", "_drawExtraRounded", "_drawSquare", "_rotateFigure", "rotation", "draw", "cx", "cy", "_element", "setAttribute", "PI", "args", "createElementNS", "_basicDot", "_basicSquare", "leftNeighbor", "rightNeighbor", "topNeighbor", "bottomNeighbor", "neighborsCount", "_basicCornerRounded", "_basicSideRounded", "_basicCornerExtraRounded", "_basicCornersRounded", "dot", "square", "extraRounded", "availableCornerSquareTypes", "values", "cornerSquareTypes", "QRCornerSquare", "dotSize", "_basicExtraRounded", "u", "availableCornerDotTypes", "cornerDotTypes", "QRCornerDot", "g", "squareMask", "dotMask", "QRSVG", "options", "_roundSize", "value", "_options", "dotsOptions", "roundSize", "_defs", "_imageUri", "image", "_instanceId", "instanceCount", "getElement", "qr", "minSize", "realQRSize", "shape", "shapeTypes", "sqrt", "drawImageSize", "hideXDots", "hideYDots", "_qr", "loadImage", "_image", "imageOptions", "qrOptions", "coverLevel", "imageSize", "errorCorrectionPercents", "maxHiddenDots", "originalHeight", "originalWidth", "maxHiddenAxisDots", "hideDots", "k", "ceil", "round", "drawBackground", "drawDots", "hideBackgroundDots", "h", "drawCorners", "drawImage", "element", "gradientOptions", "backgroundOptions", "gradient", "color", "_backgroundClipPath", "_createColor", "additionalRotation", "filter", "xBeginning", "yBeginning", "_dotsClipPath", "xOffset", "yOffset", "additionalDots", "fakeCount", "xFakeBeginning", "yFakeBeginning", "fakeMatrix", "center", "cornersSquareSize", "cornersDotSize", "column", "cornersSquareClipPath", "cornersDotClipPath", "cornersSquareOptions", "_", "_cornersSquareClipPath", "_cornersDotClipPath", "m", "includes", "cornersSquare", "S", "C", "cornersDotOptions", "A", "$", "O", "cornersDot", "D", "Promise", "resolve", "reject", "nodeCanvas", "then", "saveAsBlob", "canvas", "createCanvas", "getContext", "toDataURL", "catch", "Image", "crossOrigin", "onload", "async", "url", "xhr", "XMLHttpRequest", "reader", "FileReader", "onloadend", "result", "readAsDataURL", "response", "open", "responseType", "send", "src", "dx", "dy", "dw", "dh", "positiveRotation", "x0", "y0", "x1", "y1", "tan", "colorStops", "stop", "qrTypes", "drawTypes", "sanitizeGradient", "newGradient", "Number", "map", "colorStop", "sanitizeOptions", "newOptions", "Boolean", "getMimeType", "extension", "Error", "toLowerCase", "QRCodeStyling", "jsdom", "resources", "update", "container", "innerHTML", "_setupSvg", "qrSVG", "_svgDrawingPromise", "drawQR", "_extension", "_setupCanvas", "_nodeCanvas", "_domCanvas", "_canvasDrawingPromise", "xml", "XMLSerializer", "serializeToString", "svg64", "btoa", "image64", "_clearContainer", "_container", "append", "deleteExtension", "_getElement", "mimeType", "svgString", "Blob", "Buffer", "from", "toBuffer", "toBlob", "downloadOptions", "console", "warn", "encodeURIComponent", "arrayNeedsUint32", "array", "i", "getTypedArray", "type", "buffer", "TYPED_ARRAYS", "isTypedArray", "createElementNS", "name", "createCanvasElement", "canvas", "setConsoleFunction", "fn", "_setConsoleFunction", "getConsoleFunction", "log", "params", "message", "warn", "error", "warnOnce", "_cache", "probeAsync", "gl", "sync", "interval", "resolve", "reject", "probe", "generateUUID", "d0", "d1", "d2", "d3", "_lut", "clamp", "value", "min", "max", "euclideanModulo", "n", "m", "mapLinear", "x", "a1", "a2", "b1", "b2", "inverseLerp", "y", "lerp", "damp", "lambda", "dt", "pingpong", "length", "smoothstep", "smootherstep", "randInt", "low", "high", "randFloat", "randFloatSpread", "range", "seededRandom", "s", "_seed", "t", "degToRad", "degrees", "DEG2RAD", "radToDeg", "radians", "RAD2DEG", "isPowerOfTwo", "ceilPowerOfTwo", "floorPowerOfTwo", "setQuaternionFromProperEuler", "q", "a", "b", "c", "order", "cos", "sin", "c2", "s2", "c13", "s13", "c1_3", "s1_3", "c3_1", "s3_1", "denormalize", "normalize", "createColorManagement", "ColorManagement", "LinearSRGBColorSpace", "color", "sourceColorSpace", "targetColorSpace", "SRGBTransfer", "SRGBToLinear", "LinearToSRGB", "colorSpace", "NoColorSpace", "LinearTransfer", "target", "colorSpaces", "targetMatrix", "REC709_PRIMARIES", "REC709_LUMINANCE_COEFFICIENTS", "D65", "LINEAR_REC709_TO_XYZ", "XYZ_TO_LINEAR_REC709", "SRGBColorSpace", "serializeImage", "image", "ImageUtils", "satForAxes", "axes", "v0", "v1", "v2", "extents", "j", "_testAxis", "r", "p0", "p1", "p2", "hue2rgb", "p", "_generateTables", "floatView", "uint32View", "baseTable", "shiftTable", "e", "mantissaTable", "exponentTable", "offsetTable", "toHalfFloat", "val", "_tables", "f", "fromHalfFloat", "checkIntersection$1", "object", "material", "raycaster", "ray", "pA", "pB", "pC", "point", "intersect", "BackSide", "FrontSide", "_intersectionPointWorld", "distance", "checkGeometryIntersection", "uv", "uv1", "normal", "_vA$1", "_vB$1", "_vC$1", "intersection", "_intersectionPoint", "barycoord", "Vector3", "Triangle", "Vector2", "face", "cloneUniforms", "src", "dst", "u", "property", "mergeUniforms", "uniforms", "merged", "tmp", "cloneUniformsGroups", "getUnlitUniformColorSpace", "renderer", "currentRenderTarget", "transformVertex", "vertexPosition", "mvPosition", "center", "scale", "_alignedPosition", "_rotatedPosition", "_viewWorldMatrix", "ascIdSort", "sortOpaque", "sortTransparent", "copyAttributeData", "targetOffset", "itemSize", "vertexCount", "copyArrayContents", "len", "checkIntersection", "thresholdSq", "positionAttribute", "_vStart", "_vEnd", "_intersectPointOnRay", "_intersectPointOnSegment", "testPoint", "index", "localThresholdSq", "matrixWorld", "intersects", "rayPointDistanceSq", "_ray", "intersectPoint", "CubicPoly", "c0", "c1", "c3", "init", "x0", "x1", "t0", "t1", "x2", "x3", "tension", "dt0", "dt1", "dt2", "t2", "t3", "CatmullRom", "p3", "QuadraticBezierP0", "k", "QuadraticBezierP1", "QuadraticBezierP2", "QuadraticBezier", "CubicBezierP0", "CubicBezierP1", "CubicBezierP2", "CubicBezierP3", "CubicBezier", "earcut", "data", "holeIndices", "dim", "hasHoles", "outerLen", "outerNode", "linkedList", "triangles", "minX", "minY", "invSize", "eliminateHoles", "maxX", "maxY", "earcutLinked", "start", "end", "clockwise", "last", "signedArea", "insertNode", "equals", "removeNode", "filterPoints", "again", "area", "ear", "pass", "indexCurve", "stop", "prev", "next", "isEarHashed", "isEar", "cureLocalIntersections", "splitEarcut", "ax", "bx", "cx", "ay", "by", "cy", "y0", "y1", "pointInTriangleExceptFirst", "minZ", "zOrder", "maxZ", "locallyInside", "isValidDiagonal", "splitPolygon", "queue", "list", "getLeftmost", "compareXYSlope", "eliminateHole", "result", "aSlope", "bSlope", "hole", "bridge", "findHoleBridge", "bridgeReverse", "hx", "hy", "qx", "mx", "my", "tanMin", "pointInTriangle", "tan", "sectorContainsSector", "sortLinked", "numMerges", "inSize", "tail", "pSize", "qSize", "leftmost", "px", "py", "intersectsPolygon", "middleInside", "q1", "q2", "o1", "sign", "o2", "o3", "o4", "onSegment", "num", "inside", "createNode", "an", "bp", "sum", "removeDupEndPts", "points", "l", "addContour", "vertices", "contour", "toJSON$1", "shapes", "options", "shape", "toJSON", "isUniqueEdge", "edges", "hash1", "hash2", "convertArray", "getKeyframeOrder", "times", "compareTime", "sortedArray", "values", "stride", "nValues", "dstOffset", "srcOffset", "flattenJSON", "jsonKeys", "valuePropertyName", "key", "subclip", "sourceClip", "startFrame", "endFrame", "fps", "clip", "tracks", "track", "valueSize", "frame", "minStartTime", "makeClipAdditive", "targetClip", "referenceFrame", "referenceClip", "numTracks", "referenceTime", "referenceTrack", "referenceTrackType", "targetTrack", "referenceOffset", "referenceValueSize", "targetValueSize", "lastIndex", "referenceValue", "startIndex", "endIndex", "interpolant", "Quaternion", "numTimes", "valueStart", "valueEnd", "AdditiveAnimationBlendMode", "getTrackTypeForValueTypeName", "typeName", "NumberKeyframeTrack", "VectorKeyframeTrack", "ColorKeyframeTrack", "QuaternionKeyframeTrack", "BooleanKeyframeTrack", "StringKeyframeTrack", "parseKeyframeTrack", "json", "trackType", "ascSort", "recursive", "propagate", "children", "handleVisibilityChange", "getBoneList", "boneList", "setPoint", "pointMap", "geometry", "camera", "z", "_vector", "position", "contain", "texture", "aspect", "imageAspect", "cover", "fill", "getByteLength", "width", "height", "format", "typeByteLength", "getTextureTypeByteLength", "AlphaFormat", "RedFormat", "RedIntegerFormat", "RGFormat", "RGIntegerFormat", "RGBFormat", "RGBAFormat", "RGBAIntegerFormat", "RGB_S3TC_DXT1_Format", "RGBA_S3TC_DXT1_Format", "RGBA_S3TC_DXT3_Format", "RGBA_S3TC_DXT5_Format", "RGB_PVRTC_2BPPV1_Format", "RGBA_PVRTC_2BPPV1_Format", "RGB_PVRTC_4BPPV1_Format", "RGBA_PVRTC_4BPPV1_Format", "RGB_ETC1_Format", "RGB_ETC2_Format", "R11_EAC_Format", "SIGNED_R11_EAC_Format", "RGBA_ETC2_EAC_Format", "RG11_EAC_Format", "SIGNED_RG11_EAC_Format", "RGBA_ASTC_4x4_Format", "RGBA_ASTC_5x4_Format", "RGBA_ASTC_5x5_Format", "RGBA_ASTC_6x5_Format", "RGBA_ASTC_6x6_Format", "RGBA_ASTC_8x5_Format", "RGBA_ASTC_8x6_Format", "RGBA_ASTC_8x8_Format", "RGBA_ASTC_10x5_Format", "RGBA_ASTC_10x6_Format", "RGBA_ASTC_10x8_Format", "RGBA_ASTC_10x10_Format", "RGBA_ASTC_12x10_Format", "RGBA_ASTC_12x12_Format", "RGBA_BPTC_Format", "RGB_BPTC_SIGNED_Format", "RGB_BPTC_UNSIGNED_Format", "RED_RGTC1_Format", "SIGNED_RED_RGTC1_Format", "RED_GREEN_RGTC2_Format", "SIGNED_RED_GREEN_RGTC2_Format", "UnsignedByteType", "ByteType", "UnsignedShortType", "ShortType", "HalfFloatType", "UnsignedShort4444Type", "UnsignedShort5551Type", "UnsignedIntType", "IntType", "FloatType", "UnsignedInt5999Type", "UnsignedInt101111Type", "REVISION", "MOUSE", "TOUCH", "CullFaceNone", "CullFaceBack", "CullFaceFront", "CullFaceFrontBack", "BasicShadowMap", "PCFShadowMap", "PCFSoftShadowMap", "VSMShadowMap", "DoubleSide", "NoBlending", "NormalBlending", "AdditiveBlending", "SubtractiveBlending", "MultiplyBlending", "CustomBlending", "AddEquation", "SubtractEquation", "ReverseSubtractEquation", "MinEquation", "MaxEquation", "ZeroFactor", "OneFactor", "SrcColorFactor", "OneMinusSrcColorFactor", "SrcAlphaFactor", "OneMinusSrcAlphaFactor", "DstAlphaFactor", "OneMinusDstAlphaFactor", "DstColorFactor", "OneMinusDstColorFactor", "SrcAlphaSaturateFactor", "ConstantColorFactor", "OneMinusConstantColorFactor", "ConstantAlphaFactor", "OneMinusConstantAlphaFactor", "NeverDepth", "AlwaysDepth", "LessDepth", "LessEqualDepth", "EqualDepth", "GreaterEqualDepth", "GreaterDepth", "NotEqualDepth", "MultiplyOperation", "MixOperation", "AddOperation", "NoToneMapping", "LinearToneMapping", "ReinhardToneMapping", "CineonToneMapping", "ACESFilmicToneMapping", "CustomToneMapping", "AgXToneMapping", "NeutralToneMapping", "AttachedBindMode", "DetachedBindMode", "UVMapping", "CubeReflectionMapping", "CubeRefractionMapping", "EquirectangularReflectionMapping", "EquirectangularRefractionMapping", "CubeUVReflectionMapping", "RepeatWrapping", "ClampToEdgeWrapping", "MirroredRepeatWrapping", "NearestFilter", "NearestMipmapNearestFilter", "NearestMipMapNearestFilter", "NearestMipmapLinearFilter", "NearestMipMapLinearFilter", "LinearFilter", "LinearMipmapNearestFilter", "LinearMipMapNearestFilter", "LinearMipmapLinearFilter", "LinearMipMapLinearFilter", "UnsignedInt248Type", "DepthFormat", "DepthStencilFormat", "RGBIntegerFormat", "LoopOnce", "LoopRepeat", "LoopPingPong", "InterpolateDiscrete", "InterpolateLinear", "InterpolateSmooth", "ZeroCurvatureEnding", "ZeroSlopeEnding", "WrapAroundEnding", "NormalAnimationBlendMode", "TrianglesDrawMode", "TriangleStripDrawMode", "TriangleFanDrawMode", "BasicDepthPacking", "RGBADepthPacking", "RGBDepthPacking", "RGDepthPacking", "TangentSpaceNormalMap", "ObjectSpaceNormalMap", "NoNormalPacking", "NormalRGPacking", "NormalGAPacking", "ZeroStencilOp", "KeepStencilOp", "ReplaceStencilOp", "IncrementStencilOp", "DecrementStencilOp", "IncrementWrapStencilOp", "DecrementWrapStencilOp", "InvertStencilOp", "NeverStencilFunc", "LessStencilFunc", "EqualStencilFunc", "LessEqualStencilFunc", "GreaterStencilFunc", "NotEqualStencilFunc", "GreaterEqualStencilFunc", "AlwaysStencilFunc", "NeverCompare", "LessCompare", "EqualCompare", "LessEqualCompare", "GreaterCompare", "NotEqualCompare", "GreaterEqualCompare", "AlwaysCompare", "StaticDrawUsage", "DynamicDrawUsage", "StreamDrawUsage", "StaticReadUsage", "DynamicReadUsage", "StreamReadUsage", "StaticCopyUsage", "DynamicCopyUsage", "StreamCopyUsage", "GLSL1", "GLSL3", "WebGLCoordinateSystem", "WebGPUCoordinateSystem", "TimestampQuery", "InterpolationSamplingType", "InterpolationSamplingMode", "EventDispatcher", "MathUtils", "_vector$c", "_quaternion$4", "Matrix3", "_m3", "_canvas", "_sourceId", "Source", "_textureId", "_tempVec3", "Texture", "Vector4", "RenderTarget", "WebGLRenderTarget", "DataArrayTexture", "WebGLArrayRenderTarget", "Data3DTexture", "WebGL3DRenderTarget", "Box3", "_points", "_vector$b", "_box$4", "_v0$2", "_v1$7", "_v2$4", "_f0", "_f1", "_f2", "_center", "_extents", "_triangleNormal", "_box$3", "_v1$6", "_v2$3", "Sphere", "_vector$a", "_segCenter", "_segDir", "_diff", "_edge1", "_edge2", "_normal$1", "Ray", "Matrix4", "_v1$5", "_m1$2", "_zero", "_one", "_x", "_y", "_z", "_matrix$2", "_quaternion$3", "Euler", "Layers", "_object3DId", "_v1$4", "_q1", "_m1$1", "_target", "_position$3", "_scale$2", "_quaternion$2", "_xAxis", "_yAxis", "_zAxis", "_addedEvent", "_removedEvent", "_childaddedEvent", "_childremovedEvent", "Object3D", "_v0$1", "_v1$3", "_v2$2", "_v3$2", "_vab", "_vac", "_vbc", "_vap", "_vbp", "_vcp", "_v40", "_v41", "_v42", "_colorKeywords", "_hslA", "_hslB", "Color", "_color", "_materialId", "Material", "MeshBasicMaterial", "DataUtils", "_vector$9", "_vector2$1", "_id$2", "BufferAttribute", "Int8BufferAttribute", "Uint8BufferAttribute", "Uint8ClampedBufferAttribute", "Int16BufferAttribute", "Uint16BufferAttribute", "Int32BufferAttribute", "Uint32BufferAttribute", "Float16BufferAttribute", "Float32BufferAttribute", "_id$1", "_m1", "_obj", "_offset", "_box$2", "_boxMorphTargets", "_vector$8", "BufferGeometry", "_inverseMatrix$3", "_ray$3", "_sphere$6", "_sphereHitAt", "_tempA", "_morphA", "Mesh", "BoxGeometry", "UniformsUtils", "default_vertex", "default_fragment", "ShaderMaterial", "Camera", "_v3$1", "_minTarget", "_maxTarget", "PerspectiveCamera", "fov", "CubeCamera", "CubeTexture", "WebGLCubeRenderTarget", "Group", "_moveEvent", "WebXRController", "FogExp2", "Fog", "Scene", "InterleavedBuffer", "_vector$7", "InterleavedBufferAttribute", "SpriteMaterial", "_geometry", "_intersectPoint", "_worldScale", "_mvPosition", "_vA", "_vB", "_vC", "_uvA", "_uvB", "_uvC", "Sprite", "_v1$2", "_v2$1", "LOD", "_basePosition", "_skinIndex", "_skinWeight", "_vector3", "_matrix4", "_vertex", "_sphere$5", "_inverseMatrix$2", "_ray$2", "SkinnedMesh", "Bone", "DataTexture", "_offsetMatrix", "_identityMatrix", "Skeleton", "InstancedBufferAttribute", "_instanceLocalMatrix", "_instanceWorldMatrix", "_instanceIntersects", "_box3", "_identity", "_mesh$1", "_sphere$4", "InstancedMesh", "_vector1", "_vector2", "_normalMatrix", "Plane", "_sphere$3", "_defaultSpriteCenter", "_vector$6", "Frustum", "_projScreenMatrix$1", "_frustum$1", "FrustumArray", "MultiDrawRenderList", "_matrix$1", "_whiteColor", "_frustum", "_frustumArray", "_box$1", "_sphere$2", "_vector$5", "_forward$1", "_temp", "_renderList", "_mesh", "_batchIntersects", "BatchedMesh", "LineBasicMaterial", "_inverseMatrix$1", "_ray$1", "_sphere$1", "Line", "_start", "_end", "LineSegments", "LineLoop", "PointsMaterial", "_inverseMatrix", "_sphere", "_position$2", "Points", "VideoTexture", "VideoFrameTexture", "FramebufferTexture", "CompressedTexture", "CompressedArrayTexture", "CompressedCubeTexture", "CanvasTexture", "DepthTexture", "CubeDepthTexture", "ExternalTexture", "CapsuleGeometry", "CircleGeometry", "CylinderGeometry", "ConeGeometry", "PolyhedronGeometry", "DodecahedronGeometry", "_v0", "_v1$1", "_normal", "_triangle", "EdgesGeometry", "Curve", "EllipseCurve", "ArcCurve", "pz", "CatmullRomCurve3", "CubicBezierCurve", "CubicBezierCurve3", "LineCurve", "LineCurve3", "QuadraticBezierCurve", "QuadraticBezierCurve3", "SplineCurve", "Curves", "CurvePath", "Path", "Shape", "Earcut", "ShapeUtils", "ExtrudeGeometry", "WorldUVGenerator", "IcosahedronGeometry", "LatheGeometry", "OctahedronGeometry", "PlaneGeometry", "RingGeometry", "ShapeGeometry", "SphereGeometry", "TetrahedronGeometry", "TorusGeometry", "TorusKnotGeometry", "TubeGeometry", "WireframeGeometry", "Geometries", "ShadowMaterial", "RawShaderMaterial", "MeshStandardMaterial", "MeshPhysicalMaterial", "MeshPhongMaterial", "MeshToonMaterial", "MeshNormalMaterial", "MeshLambertMaterial", "MeshDepthMaterial", "MeshDistanceMaterial", "MeshMatcapMaterial", "LineDashedMaterial", "AnimationUtils", "Interpolant", "CubicInterpolant", "LinearInterpolant", "DiscreteInterpolant", "KeyframeTrack", "QuaternionLinearInterpolant", "AnimationClip", "Cache", "LoadingManager", "DefaultLoadingManager", "Loader", "loading", "HttpError", "FileLoader", "AnimationLoader", "CompressedTextureLoader", "_loading", "ImageLoader", "CubeTextureLoader", "DataTextureLoader", "TextureLoader", "Light", "HemisphereLight", "_projScreenMatrix", "_lightPositionWorld", "_lookTarget", "LightShadow", "SpotLightShadow", "SpotLight", "PointLightShadow", "PointLight", "OrthographicCamera", "DirectionalLightShadow", "DirectionalLight", "AmbientLight", "RectAreaLight", "SphericalHarmonics3", "LightProbe", "MaterialLoader", "LoaderUtils", "InstancedBufferGeometry", "BufferGeometryLoader", "ObjectLoader", "TEXTURE_MAPPING", "TEXTURE_WRAPPING", "TEXTURE_FILTER", "_errorMap", "ImageBitmapLoader", "_context", "AudioContext", "AudioLoader", "_eyeRight", "_eyeLeft", "_projectionMatrix", "StereoCamera", "ArrayCamera", "Clock", "_position$1", "_quaternion$1", "_scale$1", "_forward", "_up", "AudioListener", "Audio", "_position", "_quaternion", "_scale", "_orientation", "PositionalAudio", "AudioAnalyser", "PropertyMixer", "_RESERVED_CHARS_RE", "_reservedRe", "_wordChar", "_wordCharOrDot", "_directoryRe", "_nodeRe", "_objectRe", "_propertyRe", "_trackRe", "_supportedObjectNames", "Composite", "PropertyBinding", "AnimationObjectGroup", "AnimationAction", "_controlInterpolantsResultBuffer", "AnimationMixer", "RenderTarget3D", "Uniform", "_id", "UniformsGroup", "InstancedInterleavedBuffer", "GLBufferAttribute", "_matrix", "Raycaster", "Timer", "Spherical", "Cylindrical", "Matrix2", "_vector$4", "Box2", "_startP", "_startEnd", "_d1", "_d2", "_r", "_c1", "_c2", "Line3", "_vector$3", "SpotLightHelper", "_vector$2", "_boneMatrix", "_matrixWorldInv", "SkeletonHelper", "PointLightHelper", "_vector$1", "_color1", "_color2", "HemisphereLightHelper", "GridHelper", "PolarGridHelper", "_v1", "_v2", "_v3", "DirectionalLightHelper", "_camera", "CameraHelper", "_box", "BoxHelper", "Box3Helper", "PlaneHelper", "_axis", "_lineGeometry", "_coneGeometry", "ArrowHelper", "AxesHelper", "ShapePath", "Controls", "TextureUtils", "init_three_core", "__esmMin", "listener", "listeners", "listenerArray", "event", "_Vector2", "scalar", "v", "minVal", "maxVal", "denominator", "theta", "dx", "dy", "alpha", "offset", "attribute", "angle", "w", "src0", "srcOffset0", "src1", "srcOffset1", "z0", "w0", "z1", "w1", "dot", "quaternion", "euler", "update", "s1", "s3", "axis", "halfAngle", "te", "m11", "m12", "m13", "m21", "m22", "m23", "m31", "m32", "m33", "trace", "vFrom", "vTo", "step", "qax", "qay", "qaz", "qaw", "qbx", "qby", "qbz", "qbw", "qb", "qa", "theta1", "theta2", "r1", "r2", "callback", "_Vector3", "vx", "vy", "vz", "qy", "qz", "qw", "tx", "ty", "tz", "az", "bz", "planeNormal", "dz", "radius", "phi", "sinPhiRadius", "sx", "sy", "sz", "_Matrix3", "n11", "n12", "n13", "n21", "n22", "n23", "n31", "n32", "n33", "me", "xAxis", "yAxis", "zAxis", "ae", "be", "a11", "a12", "a13", "a21", "a22", "a23", "a31", "a32", "a33", "b11", "b12", "b13", "b21", "b22", "b23", "b31", "b32", "b33", "d", "g", "h", "t11", "t12", "t13", "det", "detInv", "matrix4", "rotation", "matrix", "context", "imageData", "meta", "isRootObject", "output", "url", "_Texture", "mapping", "wrapS", "wrapT", "magFilter", "minFilter", "anisotropy", "count", "source", "newValue", "currentValue", "_Vector4", "xx", "yy", "zz", "xy", "xz", "yz", "current", "depth", "il", "layerIndex", "size", "halfSize", "precise", "box", "vector", "sphere", "plane", "triangle", "optionalCenter", "maxRadiusSq", "radiusSum", "deltaLengthSq", "lengthSq", "delta", "origin", "direction", "directionDistance", "optionalPointOnRay", "optionalPointOnSegment", "segExtent", "a01", "b0", "s0", "sqrDist", "extDet", "invDet", "tca", "radius2", "thc", "distToPoint", "tmin", "tmax", "tymin", "tymax", "tzmin", "tzmax", "invdirx", "invdiry", "invdirz", "backfaceCulling", "DdN", "DdQxE2", "DdE1xQ", "QdN", "_Matrix4", "n14", "n24", "n34", "n41", "n42", "n43", "n44", "scaleX", "scaleY", "scaleZ", "af", "bf", "ce", "cf", "de", "df", "ac", "ad", "bc", "bd", "eye", "up", "a14", "a24", "a34", "a41", "a42", "a43", "a44", "b14", "b24", "b34", "b41", "b42", "b43", "b44", "t21", "t22", "t23", "t14", "scaleXSq", "scaleYSq", "scaleZSq", "yx", "zx", "zy", "y2", "z2", "wx", "wy", "wz", "invSX", "invSY", "invSZ", "left", "right", "top", "bottom", "near", "far", "coordinateSystem", "reversedDepth", "_Euler", "newOrder", "layer", "layers", "_Object3D", "onRotationChange", "onQuaternionChange", "parent", "id", "force", "updateParents", "updateChildren", "info", "serialize", "library", "element", "parameters", "uuids", "animation", "geometries", "extractFromCache", "materials", "textures", "images", "skeletons", "animations", "nodes", "cache", "child", "_Triangle", "targetLengthSq", "dot00", "dot01", "dot02", "dot11", "dot12", "denom", "invDenom", "v3", "attr", "i1", "i2", "i3", "i0", "d4", "vc", "d5", "d6", "vb", "va", "hex", "style", "handleAlpha", "string", "components", "hue", "saturation", "lightness", "color1", "color2", "srcPlanes", "dstPlanes", "normalized", "index1", "index2", "component", "_BufferGeometry", "indirect", "indirectOffset", "materialIndex", "normalMatrix", "tangent", "morphAttributesPosition", "morphAttribute", "morphTargetsRelative", "jl", "attributes", "normalAttribute", "uvAttribute", "tangentAttribute", "tan1", "tan2", "vA", "vB", "vC", "uvA", "uvB", "uvC", "sdir", "tdir", "handleTriangle", "groups", "group", "tmp2", "n2", "handleVertex", "nA", "nB", "nC", "cb", "ab", "normals", "convertBufferAttribute", "indices", "array2", "geometry2", "newAttribute", "morphAttributes", "morphArray", "hasMorphAttributes", "attributeArray", "boundingSphere", "boundingBox", "keys", "ml", "morphPosition", "morphInfluences", "influence", "rayLocalSpace", "drawRange", "groupMaterial", "_BoxGeometry", "widthSegments", "heightSegments", "depthSegments", "scope", "uvs", "numberOfVertices", "groupStart", "buildPlane", "udir", "vdir", "gridX", "gridY", "segmentWidth", "segmentHeight", "widthHalf", "heightHalf", "depthHalf", "gridX1", "gridY1", "vertexCounter", "groupCount", "iy", "ix", "extensions", "focalLength", "vExtentSlope", "minTarget", "maxTarget", "fullWidth", "fullHeight", "view", "skew", "renderTarget", "cameraPX", "cameraNX", "cameraPY", "cameraNY", "cameraPZ", "cameraNZ", "cameras", "scene", "activeMipmapLevel", "currentActiveCubeFace", "currentActiveMipmapLevel", "currentXrEnabled", "generateMipmaps", "shader", "mesh", "currentMinFilter", "stencil", "inputSource", "hand", "inputjoint", "referenceSpace", "inputPose", "gripPose", "handPose", "targetRay", "grip", "jointPose", "joint", "indexTip", "thumbTip", "distanceToPinch", "threshold", "_FogExp2", "density", "_Fog", "interleavedBuffer", "ib", "_InterleavedBufferAttribute", "float32Array", "levels", "level", "hysteresis", "removedElements", "levelDistance", "skeleton", "bindMatrix", "skinWeight", "weight", "boneIndex", "_Skeleton", "bones", "boneInverses", "inverse", "bone", "boneMatrices", "boneTexture", "uuid", "boneInverse", "meshPerAttribute", "objectInfluences", "dataIndex", "raycastTimes", "instanceId", "morphInfluencesSum", "morphBaseInfluence", "constant", "inverseNormalLength", "line", "startSign", "endSign", "optionalNormalMatrix", "referencePoint", "p4", "p5", "planes", "frustum", "me0", "me1", "me2", "me3", "me4", "me5", "me6", "me7", "me8", "me9", "me10", "me11", "me12", "me13", "me14", "me15", "sprite", "negRadius", "_FrustumArray", "cameraArray", "pool", "item", "maxInstanceCount", "maxVertexCount", "maxIndexCount", "matricesArray", "matricesTexture", "indirectArray", "indirectTexture", "colorsArray", "colorsTexture", "reference", "attributeName", "srcAttribute", "dstArray", "dstAttribute", "indexArray", "batchGeometry", "instanceInfo", "geometryId", "geometryInfoList", "func", "drawId", "reservedVertexCount", "reservedIndexCount", "geometryInfo", "hasIndex", "dstIndex", "srcIndex", "vertexStart", "indexStart", "nextVertexStart", "nextIndexStart", "elementDelta", "iv", "visible", "availableInstanceIds", "multiDrawCounts", "multiDrawStarts", "validRanges", "oldGeometry", "bytesPerElement", "perObjectFrustumCulled", "multiDrawCount", "culled", "customSort", "shadowCamera", "depthMaterial", "lineDistances", "localThreshold", "video", "updateVideo", "mipmaps", "sourceTexture", "_CapsuleGeometry", "capSegments", "radialSegments", "halfHeight", "capArcLength", "cylinderPartLength", "totalArcLength", "numVerticalSegments", "verticesPerRow", "vertex", "currentArcLength", "profileY", "profileRadius", "normalYComponent", "segmentProgress", "uOffset", "sinTheta", "cosTheta", "prevIndexRow", "i4", "_CircleGeometry", "segments", "thetaStart", "thetaLength", "segment", "_CylinderGeometry", "radiusTop", "radiusBottom", "openEnded", "generateTorso", "generateCap", "slope", "indexRow", "centerIndexStart", "centerIndexEnd", "_ConeGeometry", "_PolyhedronGeometry", "detail", "vertexBuffer", "uvBuffer", "subdivide", "applyRadius", "generateUVs", "getVertexByIndex", "subdivideFace", "cols", "aj", "bj", "rows", "pushVertex", "azimuth", "inclination", "correctUVs", "correctSeam", "centroid", "azi", "correctUV", "_DodecahedronGeometry", "thresholdAngle", "precision", "thresholdDot", "indexAttr", "positionAttr", "indexCount", "indexArr", "vertKeys", "hashes", "edgeData", "jNext", "vecHash0", "vecHash1", "hash", "reverseHash", "index0", "optionalTarget", "divisions", "lengths", "arcLengths", "targetArcLength", "comparison", "lengthBefore", "segmentLength", "segmentFraction", "pt1", "pt2", "closed", "tangents", "binormals", "vec", "mat", "aX", "aY", "xRadius", "yRadius", "aStartAngle", "aEndAngle", "aClockwise", "aRotation", "twoPi", "deltaAngle", "samePoints", "aRadius", "curveType", "intPoint", "pow", "curve", "startPoint", "endPoint", "lineType", "curveLengths", "diff", "lens", "sums", "curves", "resolution", "pts", "aCPx", "aCPy", "aCP1x", "aCP1y", "aCP2x", "aCP2y", "npts", "firstPoint", "lastPoint", "holesPts", "_ShapeUtils", "holes", "faces", "holeIndex", "_ExtrudeGeometry", "verticesArray", "uvArray", "addShape", "placeholder", "curveSegments", "steps", "bevelEnabled", "bevelThickness", "bevelSize", "bevelOffset", "bevelSegments", "extrudePath", "uvgen", "extrudePts", "extrudeByPath", "splineTube", "binormal", "position2", "isClosed", "shapePoints", "hl", "ahole", "mergeOverlappingPoints", "THRESHOLD_SQ", "prevPos", "currentIndex", "currentPos", "distSq", "scalingFactorSqrt", "thresholdSqScaled", "numHoles", "scalePt2", "pt", "vlen", "getBevelVec", "inPt", "inPrev", "inNext", "v_trans_x", "v_trans_y", "shrink_by", "v_prev_x", "v_prev_y", "v_next_x", "v_next_y", "v_prev_lensq", "collinear0", "v_prev_len", "v_next_len", "ptPrevShift_x", "ptPrevShift_y", "ptNextShift_x", "ptNextShift_y", "sf", "v_trans_lensq", "direction_eq", "contourMovements", "holesMovements", "oneHoleMovements", "verticesMovements", "contractedContourVertices", "expandedHoleVertices", "bs", "vert", "oneHoleVertices", "flen", "buildLidFaces", "buildSideFaces", "f3", "layeroffset", "sidewalls", "sl", "slen1", "slen2", "f4", "addVertex", "nextIndex", "addUV", "vector2", "geometryShapes", "indexA", "indexB", "indexC", "a_x", "a_y", "b_x", "b_y", "c_x", "c_y", "indexD", "a_z", "b_z", "c_z", "d_x", "d_y", "d_z", "_IcosahedronGeometry", "_LatheGeometry", "phiStart", "phiLength", "initNormals", "inverseSegments", "curNormal", "prevNormal", "base", "_OctahedronGeometry", "_PlaneGeometry", "width_half", "height_half", "segment_width", "segment_height", "_RingGeometry", "innerRadius", "outerRadius", "thetaSegments", "phiSegments", "radiusStep", "thetaSegmentLevel", "_ShapeGeometry", "indexOffset", "shapeVertices", "shapeHoles", "shapeHole", "_SphereGeometry", "thetaEnd", "grid", "verticesRow", "_TetrahedronGeometry", "_TorusGeometry", "tube", "tubularSegments", "arc", "_TorusKnotGeometry", "P1", "P2", "B", "T", "N", "calculatePositionOnCurve", "cu", "su", "quOverP", "cs", "_TubeGeometry", "path", "frames", "P", "generateBufferData", "generateSegment", "generateIndices", "o", "ol", "reflectivity", "parameterPositions", "sampleValues", "sampleSize", "resultBuffer", "pp", "validate_interval", "seek", "linear_scan", "forward_scan", "giveUpAt", "t1global", "mid", "iPrev", "iNext", "tPrev", "tNext", "halfDt", "o0", "oP", "oN", "wP", "wN", "ppp", "sP", "sN", "offset1", "offset0", "weight1", "weight0", "interpolation", "factoryMethod", "timeOffset", "timeScale", "startTime", "endTime", "nKeys", "from", "to", "valid", "prevTime", "currTime", "smoothInterpolation", "writeIndex", "keep", "time", "timeNext", "offsetP", "offsetN", "readOffset", "writeOffset", "TypedKeyframeTrack", "duration", "blendMode", "jsonTracks", "frameTime", "clipTracks", "morphTargetSequence", "noLoop", "numMorphTargets", "objectOrClipArray", "clipArray", "morphTargets", "animationToMorphTargets", "pattern", "morphTarget", "parts", "animationMorphTargets", "clips", "addNonemptyTrack", "trackName", "animationKeys", "propertyName", "destTracks", "clipName", "hierarchyTracks", "morphTargetNames", "morphTargetName", "animationKey", "boneName", "file", "onLoad", "onProgress", "onError", "isLoading", "itemsLoaded", "itemsTotal", "urlModifier", "handlers", "transform", "regex", "loader", "manager", "crossOrigin", "resourcePath", "requestHeader", "response", "cached", "req", "mimeType", "responseType", "callbacks", "reader", "contentLength", "total", "lengthComputable", "loaded", "stream", "controller", "readData", "done", "text", "exec", "label", "decoder", "err", "loadTexture", "texDatas", "arr", "onImageLoad", "removeEventListeners", "onImageError", "urls", "texData", "intensity", "skyColor", "groundColor", "light", "shadowMatrix", "viewportIndex", "penumbra", "decay", "power", "scaleW", "scaleH", "coefficients", "coeff", "sh", "shBasis", "_MaterialLoader", "getTexture", "uniform", "normalScale", "materialLib", "interleavedBufferMap", "arrayBufferMap", "getInterleavedBuffer", "getArrayBuffer", "arrayBuffer", "typedArray", "bufferAttribute", "bufferAttributeConstr", "metadata", "hasImages", "bufferGeometryLoader", "loadImage", "deserializeImage", "imageArray", "currentUrl", "deserializedImage", "parseConstant", "getGeometry", "getMaterial", "instanceMatrix", "instanceColor", "objectAnimations", "imageBitmap", "fetchOptions", "promise", "res", "blob", "bufferCopy", "audioBuffer", "handleError", "eyeSepHalf", "eyeSepOnProjection", "ymax", "xmin", "xmax", "autoStart", "newTime", "audioNode", "mediaElement", "mediaStream", "delay", "filter", "coneInnerAngle", "coneOuterAngle", "coneOuterGain", "panner", "audio", "fftSize", "binding", "mixFunction", "mixFunctionAdditive", "setIdentity", "accuIndex", "currentWeight", "mix", "weightAdditive", "originalValueOffset", "targetIndex", "workOffset", "targetGroup", "optionalParsedPath", "parsedPath", "firstValidIndex", "bindings", "_PropertyBinding", "rootNode", "root", "matches", "results", "lastDot", "objectName", "nodeName", "searchNodeSubtree", "childNode", "subTreeNode", "dest", "targetArray", "sourceArray", "targetObject", "propertyIndex", "objectIndex", "nodeProperty", "versioning", "bindingType", "objects", "indicesByUUID", "paths", "parsedPaths", "nBindings", "knownObject", "nObjects", "nCachedObjects", "firstActiveIndex", "lastCachedObject", "bindingsForPath", "lastCached", "lastCachedIndex", "firstActiveObject", "firstActive", "lastObject", "indicesByPath", "lastBindingsIndex", "lastBindings", "lastBindingsPath", "mixer", "localRoot", "nTracks", "interpolants", "interpolantSettings", "mode", "repetitions", "fadeOutAction", "warp", "fadeInDuration", "fadeOutDuration", "startEndRatio", "endStartRatio", "fadeInAction", "weightInterpolant", "action", "startTimeScale", "endTimeScale", "now", "timeScaleInterpolant", "deltaTime", "timeDirection", "timeRunning", "clipTime", "propertyMixers", "interpolantValue", "loop", "loopCount", "pingPong", "handle_stop", "loopDelta", "pending", "atStart", "atEnd", "settings", "weightNow", "weightThen", "prototypeAction", "rootUuid", "bindingsByRoot", "bindingsByName", "clipUuid", "actionsForClip", "actions", "actionsByClip", "knownActions", "lastInactiveAction", "cacheIndex", "knownActionsForClip", "lastKnownAction", "byClipCacheIndex", "actionByRoot", "prevIndex", "lastActiveIndex", "firstInactiveAction", "firstInactiveIndex", "lastActiveAction", "bindingByName", "propBinding", "lastInactiveBinding", "firstInactiveBinding", "lastActiveBinding", "lastActiveInterpolant", "optionalRoot", "clipObject", "existingAction", "newAction", "nActions", "actionsToRemove", "_Uniform", "uniformsSource", "elementSize", "coords", "document", "timescale", "timestamp", "other", "_Matrix2", "clampToLine", "startEnd2", "EPSILON", "positions", "coneLength", "coneWidth", "colors", "colorAttribute", "sphereSize", "sectors", "rings", "addLine", "addPoint", "colorFrustum", "colorCone", "colorUp", "colorTarget", "colorCross", "cone", "cross", "nearZ", "farZ", "positions2", "dir", "headLength", "headWidth", "xAxisColor", "yAxisColor", "zAxisColor", "isCCW", "toShapesNoHoles", "inSubpaths", "tmpPath", "tmpShape", "isPointInsidePolygon", "inPolygon", "polyLen", "edgeLowPt", "edgeHighPt", "edgeDx", "edgeDy", "perpEdge", "isClockWise", "subPaths", "solid", "holesFirst", "betterShapeHoles", "newShapes", "newShapeHoles", "mainIdx", "tmpPoints", "ambiguous", "toChange", "sIdx", "sLen", "sho", "hIdx", "ho", "hole_unassigned", "s2Idx", "tmpHoles", "domElement", "three_module_exports", "__export", "ACESFilmicToneMapping", "AddEquation", "AddOperation", "AdditiveAnimationBlendMode", "AdditiveBlending", "AgXToneMapping", "AlphaFormat", "AlwaysCompare", "AlwaysDepth", "AlwaysStencilFunc", "AmbientLight", "AnimationAction", "AnimationClip", "AnimationLoader", "AnimationMixer", "AnimationObjectGroup", "AnimationUtils", "ArcCurve", "ArrayCamera", "ArrowHelper", "AttachedBindMode", "Audio", "AudioAnalyser", "AudioContext", "AudioListener", "AudioLoader", "AxesHelper", "BackSide", "BasicDepthPacking", "BasicShadowMap", "BatchedMesh", "Bone", "BooleanKeyframeTrack", "Box2", "Box3", "Box3Helper", "BoxGeometry", "BoxHelper", "BufferAttribute", "BufferGeometry", "BufferGeometryLoader", "ByteType", "Cache", "Camera", "CameraHelper", "CanvasTexture", "CapsuleGeometry", "CatmullRomCurve3", "CineonToneMapping", "CircleGeometry", "ClampToEdgeWrapping", "Clock", "Color", "ColorKeyframeTrack", "ColorManagement", "CompressedArrayTexture", "CompressedCubeTexture", "CompressedTexture", "CompressedTextureLoader", "ConeGeometry", "ConstantAlphaFactor", "ConstantColorFactor", "Controls", "CubeCamera", "CubeDepthTexture", "CubeReflectionMapping", "CubeRefractionMapping", "CubeTexture", "CubeTextureLoader", "CubeUVReflectionMapping", "CubicBezierCurve", "CubicBezierCurve3", "CubicInterpolant", "CullFaceBack", "CullFaceFront", "CullFaceFrontBack", "CullFaceNone", "Curve", "CurvePath", "CustomBlending", "CustomToneMapping", "CylinderGeometry", "Cylindrical", "Data3DTexture", "DataArrayTexture", "DataTexture", "DataTextureLoader", "DataUtils", "DecrementStencilOp", "DecrementWrapStencilOp", "DefaultLoadingManager", "DepthFormat", "DepthStencilFormat", "DepthTexture", "DetachedBindMode", "DirectionalLight", "DirectionalLightHelper", "DiscreteInterpolant", "DodecahedronGeometry", "DoubleSide", "DstAlphaFactor", "DstColorFactor", "DynamicCopyUsage", "DynamicDrawUsage", "DynamicReadUsage", "EdgesGeometry", "EllipseCurve", "EqualCompare", "EqualDepth", "EqualStencilFunc", "EquirectangularReflectionMapping", "EquirectangularRefractionMapping", "Euler", "EventDispatcher", "ExternalTexture", "ExtrudeGeometry", "FileLoader", "Float16BufferAttribute", "Float32BufferAttribute", "FloatType", "Fog", "FogExp2", "FramebufferTexture", "FrontSide", "Frustum", "FrustumArray", "GLBufferAttribute", "GLSL1", "GLSL3", "GreaterCompare", "GreaterDepth", "GreaterEqualCompare", "GreaterEqualDepth", "GreaterEqualStencilFunc", "GreaterStencilFunc", "GridHelper", "Group", "HalfFloatType", "HemisphereLight", "HemisphereLightHelper", "IcosahedronGeometry", "ImageBitmapLoader", "ImageLoader", "ImageUtils", "IncrementStencilOp", "IncrementWrapStencilOp", "InstancedBufferAttribute", "InstancedBufferGeometry", "InstancedInterleavedBuffer", "InstancedMesh", "Int16BufferAttribute", "Int32BufferAttribute", "Int8BufferAttribute", "IntType", "InterleavedBuffer", "InterleavedBufferAttribute", "Interpolant", "InterpolateDiscrete", "InterpolateLinear", "InterpolateSmooth", "InterpolationSamplingMode", "InterpolationSamplingType", "InvertStencilOp", "KeepStencilOp", "KeyframeTrack", "LOD", "LatheGeometry", "Layers", "LessCompare", "LessDepth", "LessEqualCompare", "LessEqualDepth", "LessEqualStencilFunc", "LessStencilFunc", "Light", "LightProbe", "Line", "Line3", "LineBasicMaterial", "LineCurve", "LineCurve3", "LineDashedMaterial", "LineLoop", "LineSegments", "LinearFilter", "LinearInterpolant", "LinearMipMapLinearFilter", "LinearMipMapNearestFilter", "LinearMipmapLinearFilter", "LinearMipmapNearestFilter", "LinearSRGBColorSpace", "LinearToneMapping", "LinearTransfer", "Loader", "LoaderUtils", "LoadingManager", "LoopOnce", "LoopPingPong", "LoopRepeat", "MOUSE", "Material", "MaterialLoader", "MathUtils", "Matrix2", "Matrix3", "Matrix4", "MaxEquation", "Mesh", "MeshBasicMaterial", "MeshDepthMaterial", "MeshDistanceMaterial", "MeshLambertMaterial", "MeshMatcapMaterial", "MeshNormalMaterial", "MeshPhongMaterial", "MeshPhysicalMaterial", "MeshStandardMaterial", "MeshToonMaterial", "MinEquation", "MirroredRepeatWrapping", "MixOperation", "MultiplyBlending", "MultiplyOperation", "NearestFilter", "NearestMipMapLinearFilter", "NearestMipMapNearestFilter", "NearestMipmapLinearFilter", "NearestMipmapNearestFilter", "NeutralToneMapping", "NeverCompare", "NeverDepth", "NeverStencilFunc", "NoBlending", "NoColorSpace", "NoNormalPacking", "NoToneMapping", "NormalAnimationBlendMode", "NormalBlending", "NormalGAPacking", "NormalRGPacking", "NotEqualCompare", "NotEqualDepth", "NotEqualStencilFunc", "NumberKeyframeTrack", "Object3D", "ObjectLoader", "ObjectSpaceNormalMap", "OctahedronGeometry", "OneFactor", "OneMinusConstantAlphaFactor", "OneMinusConstantColorFactor", "OneMinusDstAlphaFactor", "OneMinusDstColorFactor", "OneMinusSrcAlphaFactor", "OneMinusSrcColorFactor", "OrthographicCamera", "PCFShadowMap", "PCFSoftShadowMap", "PMREMGenerator", "Path", "PerspectiveCamera", "Plane", "PlaneGeometry", "PlaneHelper", "PointLight", "PointLightHelper", "Points", "PointsMaterial", "PolarGridHelper", "PolyhedronGeometry", "PositionalAudio", "PropertyBinding", "PropertyMixer", "QuadraticBezierCurve", "QuadraticBezierCurve3", "Quaternion", "QuaternionKeyframeTrack", "QuaternionLinearInterpolant", "R11_EAC_Format", "RED_GREEN_RGTC2_Format", "RED_RGTC1_Format", "REVISION", "RG11_EAC_Format", "RGBADepthPacking", "RGBAFormat", "RGBAIntegerFormat", "RGBA_ASTC_10x10_Format", "RGBA_ASTC_10x5_Format", "RGBA_ASTC_10x6_Format", "RGBA_ASTC_10x8_Format", "RGBA_ASTC_12x10_Format", "RGBA_ASTC_12x12_Format", "RGBA_ASTC_4x4_Format", "RGBA_ASTC_5x4_Format", "RGBA_ASTC_5x5_Format", "RGBA_ASTC_6x5_Format", "RGBA_ASTC_6x6_Format", "RGBA_ASTC_8x5_Format", "RGBA_ASTC_8x6_Format", "RGBA_ASTC_8x8_Format", "RGBA_BPTC_Format", "RGBA_ETC2_EAC_Format", "RGBA_PVRTC_2BPPV1_Format", "RGBA_PVRTC_4BPPV1_Format", "RGBA_S3TC_DXT1_Format", "RGBA_S3TC_DXT3_Format", "RGBA_S3TC_DXT5_Format", "RGBDepthPacking", "RGBFormat", "RGBIntegerFormat", "RGB_BPTC_SIGNED_Format", "RGB_BPTC_UNSIGNED_Format", "RGB_ETC1_Format", "RGB_ETC2_Format", "RGB_PVRTC_2BPPV1_Format", "RGB_PVRTC_4BPPV1_Format", "RGB_S3TC_DXT1_Format", "RGDepthPacking", "RGFormat", "RGIntegerFormat", "RawShaderMaterial", "Ray", "Raycaster", "RectAreaLight", "RedFormat", "RedIntegerFormat", "ReinhardToneMapping", "RenderTarget", "RenderTarget3D", "RepeatWrapping", "ReplaceStencilOp", "ReverseSubtractEquation", "RingGeometry", "SIGNED_R11_EAC_Format", "SIGNED_RED_GREEN_RGTC2_Format", "SIGNED_RED_RGTC1_Format", "SIGNED_RG11_EAC_Format", "SRGBColorSpace", "SRGBTransfer", "Scene", "ShaderChunk", "ShaderLib", "ShaderMaterial", "ShadowMaterial", "Shape", "ShapeGeometry", "ShapePath", "ShapeUtils", "ShortType", "Skeleton", "SkeletonHelper", "SkinnedMesh", "Source", "Sphere", "SphereGeometry", "Spherical", "SphericalHarmonics3", "SplineCurve", "SpotLight", "SpotLightHelper", "Sprite", "SpriteMaterial", "SrcAlphaFactor", "SrcAlphaSaturateFactor", "SrcColorFactor", "StaticCopyUsage", "StaticDrawUsage", "StaticReadUsage", "StereoCamera", "StreamCopyUsage", "StreamDrawUsage", "StreamReadUsage", "StringKeyframeTrack", "SubtractEquation", "SubtractiveBlending", "TOUCH", "TangentSpaceNormalMap", "TetrahedronGeometry", "Texture", "TextureLoader", "TextureUtils", "Timer", "TimestampQuery", "TorusGeometry", "TorusKnotGeometry", "Triangle", "TriangleFanDrawMode", "TriangleStripDrawMode", "TrianglesDrawMode", "TubeGeometry", "UVMapping", "Uint16BufferAttribute", "Uint32BufferAttribute", "Uint8BufferAttribute", "Uint8ClampedBufferAttribute", "Uniform", "UniformsGroup", "UniformsLib", "UniformsUtils", "UnsignedByteType", "UnsignedInt101111Type", "UnsignedInt248Type", "UnsignedInt5999Type", "UnsignedIntType", "UnsignedShort4444Type", "UnsignedShort5551Type", "UnsignedShortType", "VSMShadowMap", "Vector2", "Vector3", "Vector4", "VectorKeyframeTrack", "VideoFrameTexture", "VideoTexture", "WebGL3DRenderTarget", "WebGLArrayRenderTarget", "WebGLCoordinateSystem", "WebGLCubeRenderTarget", "WebGLRenderTarget", "WebGLRenderer", "WebGLUtils", "WebGPUCoordinateSystem", "WebXRController", "WireframeGeometry", "WrapAroundEnding", "ZeroCurvatureEnding", "ZeroFactor", "ZeroSlopeEnding", "ZeroStencilOp", "createCanvasElement", "error", "getConsoleFunction", "log", "setConsoleFunction", "warn", "warnOnce", "WebGLAnimation", "context", "isAnimating", "animationLoop", "requestId", "onAnimationFrame", "time", "frame", "callback", "value", "WebGLAttributes", "gl", "buffers", "createBuffer", "attribute", "bufferType", "array", "usage", "size", "buffer", "type", "updateBuffer", "updateRanges", "a", "b", "mergeIndex", "i", "previousRange", "range", "l", "get", "remove", "data", "update", "cached", "WebGLBackground", "renderer", "cubemaps", "cubeuvmaps", "state", "objects", "alpha", "premultipliedAlpha", "clearColor", "clearAlpha", "planeMesh", "boxMesh", "currentBackground", "currentBackgroundVersion", "currentTonemapping", "getBackground", "scene", "background", "render", "forceClear", "setClear", "environmentBlendMode", "addToRenderList", "renderList", "cloneUniforms", "camera", "_e1$1", "_m1$1", "color", "_rgb", "getUnlitUniformColorSpace", "dispose", "WebGLBindingStates", "attributes", "maxVertexAttributes", "bindingStates", "defaultState", "createBindingState", "currentState", "forceUpdate", "setup", "object", "material", "program", "geometry", "index", "updateBuffers", "getBindingState", "bindVertexArrayObject", "needsUpdate", "saveCache", "setupVertexAttributes", "createVertexArrayObject", "vao", "deleteVertexArrayObject", "wireframe", "programMap", "stateMap", "newAttributes", "enabledAttributes", "attributeDivisors", "cachedAttributes", "geometryAttributes", "attributesNum", "programAttributes", "name", "cachedAttribute", "geometryAttribute", "cache", "initAttributes", "il", "enableAttribute", "enableAttributeAndDivisor", "meshPerAttribute", "disableUnusedAttributes", "vertexAttribPointer", "normalized", "stride", "offset", "integer", "materialDefaultAttributeValues", "programAttribute", "bytesPerElement", "reset", "geometryId", "programId", "releaseStatesOfGeometry", "releaseStatesOfProgram", "resetDefaultState", "WebGLBufferRenderer", "extensions", "info", "mode", "setMode", "start", "count", "renderInstances", "primcount", "renderMultiDraw", "starts", "counts", "drawCount", "elementCount", "renderMultiDrawInstances", "extension", "WebGLCapabilities", "parameters", "utils", "maxAnisotropy", "getMaxAnisotropy", "textureFormatReadable", "textureFormat", "textureTypeReadable", "textureType", "halfFloatSupportedByExt", "getMaxPrecision", "precision", "maxPrecision", "logarithmicDepthBuffer", "reversedDepthBuffer", "maxTextures", "maxVertexTextures", "maxTextureSize", "maxCubemapSize", "maxAttributes", "maxVertexUniforms", "maxVaryings", "maxFragmentUniforms", "maxSamples", "samples", "WebGLClipping", "properties", "scope", "globalState", "numGlobalPlanes", "localClippingEnabled", "renderingShadows", "plane", "viewNormalMatrix", "uniform", "planes", "enableLocalClipping", "enabled", "projectPlanes", "useCache", "clipIntersection", "clipShadows", "materialProperties", "resetGlobalState", "nGlobal", "lGlobal", "dstArray", "dstOffset", "skipTransform", "nPlanes", "flatSize", "viewMatrix", "i4", "WebGLCubeMaps", "mapTextureMapping", "texture", "mapping", "cubemap", "image", "renderTarget", "onTextureDispose", "event", "_createPlanes", "lodMax", "sizeLods", "sigmas", "lodMeshes", "lod", "totalLods", "LOD_MIN", "EXTRA_LOD_SIGMA", "sizeLod", "sigma", "texelSize", "min", "max", "uv1", "cubeFaces", "vertices", "positionSize", "uvSize", "faceIndexSize", "position", "uv", "faceIndex", "face", "x", "y", "coordinates", "fill", "_createRenderTarget", "width", "height", "params", "cubeUVRenderTarget", "_setViewport", "target", "_getGGXShader", "GGX_SAMPLES", "_getCommonVertexShader", "_getBlurShader", "weights", "MAX_SAMPLES", "poleAxis", "_getEquirectMaterial", "_getCubemapMaterial", "WebGLCubeUVMaps", "cubeUVmaps", "pmremGenerator", "isEquirectMap", "isCubeMap", "currentPMREMVersion", "isCubeTextureComplete", "length", "cubemapUV", "WebGLExtensions", "getExtension", "WebGLGeometries", "geometries", "wireframeAttributes", "onGeometryDispose", "updateWireframeAttribute", "indices", "geometryIndex", "geometryPosition", "version", "c", "arrayNeedsUint32", "previousAttribute", "getWireframeAttribute", "currentAttribute", "WebGLIndexedBufferRenderer", "setIndex", "WebGLInfo", "memory", "instanceCount", "WebGLMorphtargets", "capabilities", "textures", "morphTextures", "morph", "objectInfluences", "morphAttribute", "morphTargetsCount", "entry", "disposeTexture", "hasMorphPosition", "hasMorphNormals", "hasMorphColors", "morphTargets", "morphNormals", "morphColors", "vertexDataCount", "vertexDataStride", "morphTarget", "morphNormal", "morphColor", "j", "morphInfluencesSum", "morphBaseInfluence", "WebGLObjects", "updateMap", "buffergeometry", "onInstancedMeshDispose", "skeleton", "instancedMesh", "WebGLOutput", "depth", "stencil", "targetA", "targetB", "mesh", "_outputColorSpace", "_outputToneMapping", "_isCompositing", "_savedToneMapping", "_savedRenderTarget", "_effects", "_hasRenderPass", "effect", "effects", "deltaTime", "readBuffer", "writeBuffer", "temp", "toneMapping", "toneMappingMap", "flatten", "nBlocks", "blockSize", "firstElem", "n", "r", "arrayCacheF32", "arraysEqual", "copyArray", "allocTexUnits", "arrayCacheI32", "setValueV1f", "v", "setValueV2f", "setValueV3f", "setValueV4f", "setValueM2", "elements", "mat2array", "setValueM3", "mat3array", "setValueM4", "mat4array", "setValueV1i", "setValueV2i", "setValueV3i", "setValueV4i", "setValueV1ui", "setValueV2ui", "setValueV3ui", "setValueV4ui", "setValueT1", "unit", "emptyTexture2D", "emptyShadowTexture", "emptyTexture", "setValueT3D1", "empty3dTexture", "setValueT6", "emptyCubeTexture", "setValueT2DArray1", "emptyArrayTexture", "getSingularSetter", "setValueV1fArray", "setValueV2fArray", "setValueV3fArray", "setValueV4fArray", "setValueM2Array", "setValueM3Array", "setValueM4Array", "setValueV1iArray", "setValueV2iArray", "setValueV3iArray", "setValueV4iArray", "setValueV1uiArray", "setValueV2uiArray", "setValueV3uiArray", "setValueV4uiArray", "setValueT1Array", "units", "setValueT3DArray", "setValueT6Array", "setValueT2DArrayArray", "getPureArraySetter", "addUniform", "container", "uniformObject", "parseUniform", "activeInfo", "addr", "path", "pathLength", "RePathPart", "match", "matchEnd", "id", "idIsIndex", "subscript", "SingleUniform", "PureArrayUniform", "next", "StructuredUniform", "WebGLShader", "string", "shader", "handleSource", "errorLine", "lines", "lines2", "from", "to", "line", "getEncodingComponents", "colorSpace", "_m0", "encodingMatrix", "getShaderErrors", "status", "errors", "errorMatches", "getTexelEncodingFunction", "functionName", "components", "getToneMappingFunction", "toneMappingName", "toneMappingFunctions", "getLuminanceFunction", "_v0", "g", "generateVertexExtensions", "filterEmptyLine", "generateDefines", "defines", "chunks", "fetchAttributeLocations", "locationSize", "replaceLightNums", "numSpotLightCoords", "replaceClippingPlaneNums", "resolveIncludes", "includePattern", "includeReplacer", "include", "newInclude", "shaderChunkMap", "unrollLoops", "unrollLoopPattern", "loopReplacer", "end", "snippet", "generatePrecision", "precisionstring", "generateShadowMapTypeDefine", "shadowMapTypeDefines", "generateEnvMapTypeDefine", "envMapTypeDefines", "generateEnvMapModeDefine", "envMapModeDefines", "generateEnvMapBlendingDefine", "envMapBlendingDefines", "generateCubeUVSize", "imageHeight", "maxMip", "texelHeight", "WebGLProgram", "cacheKey", "vertexShader", "fragmentShader", "shadowMapTypeDefine", "envMapTypeDefine", "envMapModeDefine", "envMapBlendingDefine", "envMapCubeUVSize", "customVertexExtensions", "customDefines", "prefixVertex", "prefixFragment", "versionString", "vertexGlsl", "fragmentGlsl", "glVertexShader", "glFragmentShader", "onFirstUse", "self", "programInfoLog", "vertexShaderInfoLog", "fragmentShaderInfoLog", "programLog", "vertexLog", "fragmentLog", "runnable", "haveDiagnostics", "vertexErrors", "fragmentErrors", "cachedUniforms", "WebGLUniforms", "programReady", "COMPLETION_STATUS_KHR", "programIdCount", "WebGLPrograms", "clipping", "_programLayers", "_customShaders", "WebGLShaderCache", "_activeChannels", "programs", "programsMap", "shaderIDs", "getChannel", "getParameters", "lights", "shadows", "fog", "environment", "envMap", "envMapCubeUVHeight", "shaderID", "morphTextureStride", "customVertexShaderID", "customFragmentShaderID", "currentRenderTarget", "IS_INSTANCEDMESH", "IS_BATCHEDMESH", "HAS_MAP", "HAS_MATCAP", "HAS_ENVMAP", "HAS_AOMAP", "HAS_LIGHTMAP", "HAS_BUMPMAP", "HAS_NORMALMAP", "HAS_DISPLACEMENTMAP", "HAS_EMISSIVEMAP", "HAS_METALNESSMAP", "HAS_ROUGHNESSMAP", "HAS_ANISOTROPY", "HAS_CLEARCOAT", "HAS_DISPERSION", "HAS_IRIDESCENCE", "HAS_SHEEN", "HAS_TRANSMISSION", "HAS_ANISOTROPYMAP", "HAS_CLEARCOATMAP", "HAS_CLEARCOAT_NORMALMAP", "HAS_CLEARCOAT_ROUGHNESSMAP", "HAS_IRIDESCENCEMAP", "HAS_IRIDESCENCE_THICKNESSMAP", "HAS_SHEEN_COLORMAP", "HAS_SHEEN_ROUGHNESSMAP", "HAS_SPECULARMAP", "HAS_SPECULAR_COLORMAP", "HAS_SPECULAR_INTENSITYMAP", "HAS_TRANSMISSIONMAP", "HAS_THICKNESSMAP", "HAS_GRADIENTMAP", "HAS_ALPHAMAP", "HAS_ALPHATEST", "HAS_ALPHAHASH", "HAS_EXTENSIONS", "getProgramCacheKey", "getProgramCacheKeyParameters", "getProgramCacheKeyBooleans", "getUniforms", "uniforms", "acquireProgram", "releaseProgram", "releaseShaderCache", "WebGLProperties", "has", "map", "key", "painterSortStable", "reversePainterSortStable", "WebGLRenderList", "renderItems", "renderItemsIndex", "opaque", "transmissive", "transparent", "init", "getNextRenderItem", "groupOrder", "z", "group", "renderItem", "push", "unshift", "sort", "customOpaqueSort", "customTransparentSort", "finish", "WebGLRenderLists", "lists", "renderCallDepth", "listArray", "list", "UniformsCache", "light", "ShadowUniformsCache", "shadowCastingAndTexturingLightsFirst", "lightA", "lightB", "WebGLLights", "shadowCache", "vector3", "matrix4", "matrix42", "directionalLength", "pointLength", "spotLength", "rectAreaLength", "hemiLength", "numDirectionalShadows", "numPointShadows", "numSpotShadows", "numSpotMaps", "numSpotShadowsWithMaps", "numLightProbes", "intensity", "distance", "shadowMap", "shadow", "shadowUniforms", "hash", "nextVersion", "setupView", "WebGLRenderState", "lightsArray", "shadowsArray", "pushLight", "pushShadow", "shadowLight", "setupLights", "setupLightsView", "WebGLRenderStates", "renderStates", "renderStateArray", "renderState", "WebGLShadowMap", "_frustum", "_shadowMapSize", "_viewportSize", "_viewport", "_depthMaterial", "_distanceMaterial", "_materialCache", "_maxTextureSize", "shadowSide", "shadowMaterialVertical", "vertex", "fragment", "shadowMaterialHorizontal", "fullScreenTri", "fullScreenMesh", "_previousType", "activeCubeFace", "activeMipmapLevel", "_state", "typeChanged", "mat", "shadowFrameExtents", "faceCount", "viewport", "shadowMatrix", "far", "_lightPositionWorld", "_lookTarget", "_cubeDirections", "_cubeUps", "_projScreenMatrix", "renderObject", "VSMPass", "getDepthMaterial", "result", "customMaterial", "keyA", "keyB", "materialsForVariant", "cachedMaterial", "onMaterialDispose", "shadowCamera", "groups", "k", "kl", "groupMaterial", "depthMaterial", "children", "uuid", "WebGLState", "ColorBuffer", "locked", "currentColorMask", "currentColorClear", "colorMask", "lock", "DepthBuffer", "currentReversed", "currentDepthMask", "currentDepthFunc", "currentDepthClear", "reversed", "ext", "oldDepth", "depthTest", "enable", "disable", "depthMask", "depthFunc", "reversedFuncs", "StencilBuffer", "currentStencilMask", "currentStencilFunc", "currentStencilRef", "currentStencilFuncMask", "currentStencilFail", "currentStencilZFail", "currentStencilZPass", "currentStencilClear", "stencilTest", "stencilMask", "stencilFunc", "stencilRef", "stencilFail", "stencilZFail", "stencilZPass", "colorBuffer", "depthBuffer", "stencilBuffer", "uboBindings", "uboProgramMap", "enabledCapabilities", "currentBoundFramebuffers", "currentDrawbuffers", "defaultDrawbuffers", "currentProgram", "currentBlendingEnabled", "currentBlending", "currentBlendEquation", "currentBlendSrc", "currentBlendDst", "currentBlendEquationAlpha", "currentBlendSrcAlpha", "currentBlendDstAlpha", "currentBlendColor", "currentBlendAlpha", "currentPremultipledAlpha", "currentFlipSided", "currentCullFace", "currentLineWidth", "currentPolygonOffsetFactor", "currentPolygonOffsetUnits", "lineWidthAvailable", "glVersion", "currentTextureSlot", "currentBoundTextures", "scissorParam", "viewportParam", "currentScissor", "currentViewport", "createTexture", "dimensions", "emptyTextures", "setFlipSided", "setCullFace", "setBlending", "bindFramebuffer", "framebuffer", "drawBuffers", "useProgram", "equationToGL", "factorToGL", "blending", "blendEquation", "blendSrc", "blendDst", "blendEquationAlpha", "blendSrcAlpha", "blendDstAlpha", "blendColor", "blendAlpha", "setMaterial", "frontFaceCW", "flipSided", "stencilWrite", "setPolygonOffset", "cullFace", "setLineWidth", "polygonOffset", "factor", "setScissorTest", "scissorTest", "activeTexture", "webglSlot", "bindTexture", "webglType", "webglTexture", "boundTexture", "unbindTexture", "compressedTexImage2D", "e", "compressedTexImage3D", "texSubImage2D", "texSubImage3D", "compressedTexSubImage2D", "compressedTexSubImage3D", "texStorage2D", "texStorage3D", "texImage2D", "texImage3D", "scissor", "updateUBOMapping", "uniformsGroup", "blockIndex", "uniformBlockBinding", "WebGLTextures", "_gl", "multisampledRTTExt", "supportsInvalidateFramebuffer", "_imageDimensions", "_videoTextures", "_canvas", "_sources", "useOffscreenCanvas", "createCanvas", "createElementNS", "resizeImage", "needsNewCanvas", "maxSize", "scale", "getDimensions", "canvas", "textureNeedsGenerateMipmaps", "generateMipmap", "getTargetType", "getInternalFormat", "internalFormatName", "glFormat", "glType", "forceLinearTransfer", "internalFormat", "transfer", "getInternalDepthFormat", "useStencil", "depthType", "glInternalFormat", "getMipLevels", "deallocateTexture", "onRenderTargetDispose", "deallocateRenderTarget", "textureProperties", "source", "webglTextures", "deleteTexture", "renderTargetProperties", "level", "attachmentProperties", "textureUnits", "resetTextureUnits", "allocateTextureUnit", "textureUnit", "getTextureCacheKey", "setTexture2D", "slot", "updateVideoTexture", "uploadTexture", "setTexture2DArray", "setTexture3D", "setTextureCube", "uploadCubeTexture", "wrappingToGL", "filterToGL", "compareToGL", "setTextureParameters", "initTexture", "forceUpload", "textureCacheKey", "getRow", "rowLength", "componentStride", "updateTexture", "previousEnd", "currentRow", "previousRow", "currentUnpackRowLen", "currentUnpackSkipPixels", "currentUnpackSkipRows", "pixelStart", "pixelCount", "sourceProperties", "workingPrimaries", "texturePrimaries", "unpackConversion", "verifyColorSpace", "mipmap", "mipmaps", "useTexStorage", "allocateMemory", "dataReady", "levels", "layerByteLength", "getByteLength", "layerIndex", "layerData", "isCompressed", "isDataTexture", "cubeImage", "mipmapImage", "setupFrameBufferTexture", "attachment", "textureTarget", "useMultisampledRTT", "getRenderTargetSamples", "setupRenderBufferStorage", "renderbuffer", "useMultisample", "depthTexture", "glAttachmentType", "setupDepthTexture", "cubeFace", "isCube", "webglDepthTexture", "glTextureType", "setupDepthRenderbuffer", "disposeEvent", "rebindTextures", "colorTexture", "setupRenderTarget", "isMultipleRenderTargets", "updateRenderTargetMipmap", "targetType", "invalidationArrayRead", "invalidationArrayDraw", "updateMultisampleRenderTarget", "mask", "depthStyle", "format", "convert", "p", "WebGLMaterials", "refreshTransformUniform", "refreshFogUniforms", "refreshMaterialUniforms", "pixelRatio", "transmissionRenderTarget", "refreshUniformsCommon", "refreshUniformsToon", "refreshUniformsPhong", "refreshUniformsStandard", "refreshUniformsPhysical", "refreshUniformsMatcap", "refreshUniformsDistance", "refreshUniformsLine", "refreshUniformsDash", "refreshUniformsPoints", "refreshUniformsSprites", "envMapRotation", "_e1", "_m1", "WebGLUniformsGroups", "updateList", "allocatedBindingPoints", "maxBindingPoints", "bind", "webglProgram", "prepareUniformsGroup", "onUniformsGroupsDispose", "updateBufferData", "bindingPointIndex", "allocateBindingPointIndex", "uniformArray", "jl", "hasUniformChanged", "values", "arrayOffset", "getUniformSize", "indexArray", "indexString", "cachedObject", "chunkSize", "chunkOffset", "chunkPadding", "chunkStart", "getDFGLUT", "lut", "DATA", "alphahash_fragment", "alphahash_pars_fragment", "alphamap_fragment", "alphamap_pars_fragment", "alphatest_fragment", "alphatest_pars_fragment", "aomap_fragment", "aomap_pars_fragment", "batching_pars_vertex", "batching_vertex", "begin_vertex", "beginnormal_vertex", "bsdfs", "iridescence_fragment", "bumpmap_pars_fragment", "clipping_planes_fragment", "clipping_planes_pars_fragment", "clipping_planes_pars_vertex", "clipping_planes_vertex", "color_fragment", "color_pars_fragment", "color_pars_vertex", "color_vertex", "common", "cube_uv_reflection_fragment", "defaultnormal_vertex", "displacementmap_pars_vertex", "displacementmap_vertex", "emissivemap_fragment", "emissivemap_pars_fragment", "colorspace_fragment", "colorspace_pars_fragment", "envmap_fragment", "envmap_common_pars_fragment", "envmap_pars_fragment", "envmap_pars_vertex", "envmap_vertex", "fog_vertex", "fog_pars_vertex", "fog_fragment", "fog_pars_fragment", "gradientmap_pars_fragment", "lightmap_pars_fragment", "lights_lambert_fragment", "lights_lambert_pars_fragment", "lights_pars_begin", "envmap_physical_pars_fragment", "lights_toon_fragment", "lights_toon_pars_fragment", "lights_phong_fragment", "lights_phong_pars_fragment", "lights_physical_fragment", "lights_physical_pars_fragment", "lights_fragment_begin", "lights_fragment_maps", "lights_fragment_end", "logdepthbuf_fragment", "logdepthbuf_pars_fragment", "logdepthbuf_pars_vertex", "logdepthbuf_vertex", "map_fragment", "map_pars_fragment", "map_particle_fragment", "map_particle_pars_fragment", "metalnessmap_fragment", "metalnessmap_pars_fragment", "morphinstance_vertex", "morphcolor_vertex", "morphnormal_vertex", "morphtarget_pars_vertex", "morphtarget_vertex", "normal_fragment_begin", "normal_fragment_maps", "normal_pars_fragment", "normal_pars_vertex", "normal_vertex", "normalmap_pars_fragment", "clearcoat_normal_fragment_begin", "clearcoat_normal_fragment_maps", "clearcoat_pars_fragment", "iridescence_pars_fragment", "opaque_fragment", "packing", "premultiplied_alpha_fragment", "project_vertex", "dithering_fragment", "dithering_pars_fragment", "roughnessmap_fragment", "roughnessmap_pars_fragment", "shadowmap_pars_fragment", "shadowmap_pars_vertex", "shadowmap_vertex", "shadowmask_pars_fragment", "skinbase_vertex", "skinning_pars_vertex", "skinning_vertex", "skinnormal_vertex", "specularmap_fragment", "specularmap_pars_fragment", "tonemapping_fragment", "tonemapping_pars_fragment", "transmission_fragment", "transmission_pars_fragment", "uv_pars_fragment", "uv_pars_vertex", "uv_vertex", "worldpos_vertex", "vertex$h", "fragment$h", "vertex$g", "fragment$g", "vertex$f", "fragment$f", "vertex$e", "fragment$e", "vertex$d", "fragment$d", "vertex$c", "fragment$c", "vertex$b", "fragment$b", "vertex$a", "fragment$a", "vertex$9", "fragment$9", "vertex$8", "fragment$8", "vertex$7", "fragment$7", "vertex$6", "fragment$6", "vertex$5", "fragment$5", "vertex$4", "fragment$4", "vertex$3", "fragment$3", "vertex$2", "fragment$2", "vertex$1", "fragment$1", "_flatCamera", "_clearColor", "_oldTarget", "_oldActiveCubeFace", "_oldActiveMipmapLevel", "_oldXrEnabled", "_origin", "_id", "WebGLShaderStage", "_occlusion_vertex", "_occlusion_fragment", "WebXRDepthSensing", "WebXRManager", "init_three_module", "__esmMin", "init_three_core", "mergeUniforms", "near", "options", "equirectangular", "cubeSize", "outputTarget", "_lodMax", "cubeCamera", "upSign", "forwardSign", "originalAutoClear", "backgroundBox", "backgroundMaterial", "useSolidColor", "col", "isCubeTexture", "autoClear", "lodIn", "lodOut", "pingPongRenderTarget", "ggxMaterial", "ggxMesh", "ggxUniforms", "targetRoughness", "sourceRoughness", "incrementalRoughness", "blurStrength", "adjustedRoughness", "outputSize", "targetIn", "targetOut", "sigmaRadians", "direction", "blurMaterial", "STANDARD_DEVIATIONS", "blurMesh", "blurUniforms", "pixels", "radiansPerPixel", "sigmaPixels", "sum", "weight", "seq", "u", "shadowSamplers", "otherUniforms", "vertexShaderStage", "fragmentShaderStage", "materialShaders", "shaderStage", "set", "code", "stage", "depthData", "cameraXR", "session", "framebufferScaleFactor", "referenceSpace", "referenceSpaceType", "foveation", "customReferenceSpace", "pose", "glBinding", "glProjLayer", "glBaseLayer", "xrFrame", "supportsGlBinding", "depthSensing", "cameraAccessTextures", "initialRenderTarget", "newRenderTarget", "controllers", "controllerInputSources", "currentSize", "currentPixelRatio", "cameraL", "cameraR", "cameras", "_currentDepthNear", "_currentDepthFar", "controller", "onSessionEvent", "controllerIndex", "onSessionEnd", "onInputSourcesChange", "inputSource", "animation", "space", "depthFormat", "glDepthFormat", "projectionlayerInit", "layerInit", "cameraLPos", "cameraRPos", "setProjectionFromUnion", "ipd", "projL", "projR", "topFov", "bottomFov", "leftFov", "rightFov", "left", "right", "zOffset", "xOffset", "near2", "far2", "left2", "right2", "top2", "bottom2", "updateCamera", "parent", "depthNear", "depthFar", "updateUserCamera", "RAD2DEG", "xrCamera", "onAnimationFrameCallback", "views", "cameraXRNeedsUpdate", "view", "glSubImage", "enabledFeatures", "cameraTex", "glTexture", "antialias", "preserveDrawingBuffer", "powerPreference", "failIfMajorPerformanceCaveat", "outputBufferType", "_alpha", "_outputBufferType", "INTEGER_FORMATS", "UNSIGNED_TYPES", "uintClearColor", "intClearColor", "currentRenderList", "currentRenderState", "renderListStack", "renderStateStack", "output", "_this", "_isContextLost", "_currentActiveCubeFace", "_currentActiveMipmapLevel", "_currentRenderTarget", "_currentMaterialId", "_currentCamera", "_currentViewport", "_currentScissor", "_currentScissorTest", "_currentClearColor", "_currentClearAlpha", "_width", "_height", "_pixelRatio", "_opaqueSort", "_transparentSort", "_scissor", "_scissorTest", "_clippingEnabled", "_localClippingEnabled", "_vector3", "_vector4", "_emptyScene", "_renderBackground", "getTargetPixelRatio", "getContext", "contextName", "contextAttributes", "onContextLost", "onContextRestore", "onContextCreationError", "programCache", "materials", "renderLists", "morphtargets", "bufferRenderer", "indexedBufferRenderer", "uniformsGroups", "initGLContext", "xr", "updateStyle", "boolean", "method", "bits", "isIntegerFormat", "targetFormat", "isUnsignedType", "onXRSessionStart", "onXRSessionEnd", "infoAutoReset", "shadowMapEnabled", "shadowMapAutoUpdate", "shadowMapNeedsUpdate", "shadowMapType", "deallocateMaterial", "releaseMaterialProgramReferences", "setProgram", "rangeFactor", "drawRange", "drawStart", "drawEnd", "lineWidth", "maxInstanceCount", "prepareMaterial", "getProgram", "targetScene", "material2", "resolve", "checkMaterialsReady", "isXRPresenting", "useOutput", "depthSensingMesh", "projectObject", "opaqueObjects", "transmissiveObjects", "camera2", "renderTransmissionPass", "renderScene", "sortObjects", "transparentObjects", "renderObjects", "hasHalfFloatSupport", "activeViewport", "currentActiveCubeFace", "currentActiveMipmapLevel", "currentToneMapping", "currentCameraViewport", "renderTargetNeedsUpdate", "currentSide", "overrideMaterial", "lightsStateVersion", "programCacheKey", "updateCommonMaterialProperties", "materialNeedsLights", "getUniformList", "progUniforms", "vertexAlphas", "vertexTangents", "needsProgramChange", "refreshProgram", "refreshMaterial", "refreshLights", "p_uniforms", "m_uniforms", "uCamPos", "morphAttributes", "markUniformsLightsNeedsUpdate", "defaultFramebuffer", "_scratchFrameBuffer", "isRenderTarget3D", "__webglFramebuffer", "layer", "activeCubeFaceIndex", "textureIndex", "glBuffer", "currFramebuffer", "sync", "probeAsync", "levelScale", "_srcFramebuffer", "_dstFramebuffer", "srcTexture", "dstTexture", "srcRegion", "dstPosition", "srcLevel", "dstLevel", "minX", "minY", "minZ", "dstX", "dstY", "dstZ", "glTarget", "currentUnpackImageHeight", "currentUnpackSkipImages", "isSrc3D", "isDst3D", "srcTextureProperties", "dstTextureProperties", "srcRenderTargetProperties", "dstRenderTargetProperties", "init_AnimationClipCreator", "__esmMin", "_quaternion", "_targetPos", "_targetVec", "_effectorPos", "_effectorVec", "_linkPos", "_invLinkQ", "_linkScale", "_axis", "_vector", "_matrix", "init_CCDIKSolver", "__esmMin", "init_three_module", "Quaternion", "Vector3", "Matrix4", "_transformation", "_raycaster", "_offset", "_gizmoMatrixStateTemp", "_cameraMatrixStateTemp", "_scalePointTemp", "init_ArcballControls", "__esmMin", "init_three_module", "Matrix4", "Raycaster", "Vector3", "_plane", "_pointer", "_offset", "_diff", "_previousPointer", "_intersection", "_worldPosition", "_inverseMatrix", "_up", "_right", "init_DragControls", "__esmMin", "init_three_module", "Plane", "Vector2", "Vector3", "Matrix4", "_lookDirection", "_spherical", "_target", "_targetPosition", "init_FirstPersonControls", "__esmMin", "init_three_module", "Vector3", "Spherical", "_tmpQuaternion", "init_FlyControls", "__esmMin", "init_three_module", "Quaternion", "_ray", "_plane", "_TILT_LIMIT", "_v", "_twoPI", "init_OrbitControls", "__esmMin", "init_three_module", "Ray", "Plane", "MathUtils", "Vector3", "_plane", "_raycaster", "_mouse", "_panCurrent", "init_MapControls", "__esmMin", "init_three_module", "Plane", "Raycaster", "Vector2", "Vector3", "_euler", "_vector", "_PI_2", "init_PointerLockControls", "__esmMin", "init_three_module", "Euler", "Vector3", "_v2", "_mouseChange", "_objectUp", "_pan", "_axis", "_quaternion", "_eyeDirection", "_objectUpDirection", "_objectSidewaysDirection", "_moveDirection", "init_TrackballControls", "__esmMin", "init_three_module", "Vector2", "Vector3", "Quaternion", "_raycaster", "_tempVector", "_tempVector2", "_tempQuaternion", "_unit", "_tempEuler", "_alignVector", "_zeroVector", "_lookAtMatrix", "_tempQuaternion2", "_identityQuaternion", "_dirVector", "_tempMatrix", "_unitX", "_unitY", "_unitZ", "_v1", "_v2", "_v3", "init_TransformControls", "__esmMin", "init_three_module", "Raycaster", "Vector3", "Quaternion", "Euler", "Matrix4", "inverseProjectionMatrix", "CSMFrustum", "init_CSMFrustum", "__esmMin", "init_three_module", "Matrix4", "_CSMFrustum", "data", "Vector3", "projectionMatrix", "maxFar", "zNear", "isOrthographic", "v", "absZ", "breaks", "target", "i", "cascade", "j", "cameraMatrix", "CSMShader", "init_CSMShader", "__esmMin", "init_three_module", "ShaderChunk", "_cameraToLightMatrix", "_lightSpaceFrustum", "_center", "_origin", "_bbox", "_lightOrientationMatrix", "_lightOrientationMatrixInverse", "_up", "init_CSM", "__esmMin", "init_three_module", "init_CSMFrustum", "Matrix4", "CSMFrustum", "Vector3", "Box3", "init_CSMHelper", "__esmMin", "init_CurveExtras", "__esmMin", "init_NURBSUtils", "__esmMin", "init_NURBSCurve", "__esmMin", "init_NURBSSurface", "__esmMin", "init_NURBSVolume", "__esmMin", "Pass", "_camera", "FullscreenTriangleGeometry", "_geometry", "FullScreenQuad", "init_Pass", "__esmMin", "init_three_module", "OrthographicCamera", "BufferGeometry", "Float32BufferAttribute", "material", "Mesh", "renderer", "value", "init_AnaglyphEffect", "__esmMin", "init_AsciiEffect", "__esmMin", "init_OutlineEffect", "__esmMin", "init_ParallaxBarrierEffect", "__esmMin", "init_StereoEffect", "__esmMin", "init_DebugEnvironment", "__esmMin", "init_RoomEnvironment", "__esmMin", "createVertexColorSRGBArray", "attribute", "_color", "Color", "count", "itemSize", "array", "i", "il", "ColorManagement", "SRGBColorSpace", "DRACOExporter", "init_DRACOExporter", "__esmMin", "init_three_module", "_DRACOExporter", "object", "options", "geometry", "dracoEncoder", "encoder", "builder", "dracoObject", "vertices", "faces", "normals", "uvs", "colors", "encodedData", "encodeSpeed", "decodeSpeed", "length", "outputData", "textEncoder", "init_EXRExporter", "__esmMin", "equalArray", "array1", "array2", "element", "index", "stringToArrayBuffer", "text", "isIdentityMatrix", "matrix", "getMinMax", "attribute", "start", "count", "output", "i", "a", "value", "MathUtils", "getPaddedBufferSize", "bufferSize", "getPaddedArrayBuffer", "arrayBuffer", "paddingByte", "paddedLength", "array", "getCanvas", "getToBlobPromise", "canvas", "mimeType", "quality", "resolve", "KHR_mesh_quantization_ExtraAttrTypes", "GLTFExporter", "WEBGL_CONSTANTS", "KHR_MESH_QUANTIZATION", "THREE_TO_WEBGL", "PATH_PROPERTIES", "DEFAULT_SPECULAR_COLOR", "GLB_HEADER_BYTES", "GLB_HEADER_MAGIC", "GLB_VERSION", "GLB_CHUNK_PREFIX_BYTES", "GLB_CHUNK_TYPE_JSON", "GLB_CHUNK_TYPE_BIN", "GLTFWriter", "GLTFLightExtension", "GLTFMaterialsUnlitExtension", "GLTFMaterialsClearcoatExtension", "GLTFMaterialsDispersionExtension", "GLTFMaterialsIridescenceExtension", "GLTFMaterialsTransmissionExtension", "GLTFMaterialsVolumeExtension", "GLTFMaterialsIorExtension", "GLTFMaterialsSpecularExtension", "GLTFMaterialsSheenExtension", "GLTFMaterialsAnisotropyExtension", "GLTFMaterialsEmissiveStrengthExtension", "GLTFMaterialsBumpExtension", "GLTFMeshGpuInstancing", "init_GLTFExporter", "__esmMin", "init_three_module", "writer", "callback", "utils", "input", "onDone", "onError", "options", "plugins", "il", "scope", "reject", "NearestFilter", "NearestMipmapNearestFilter", "NearestMipmapLinearFilter", "LinearFilter", "LinearMipmapNearestFilter", "LinearMipmapLinearFilter", "ClampToEdgeWrapping", "RepeatWrapping", "MirroredRepeatWrapping", "Color", "buffers", "json", "extensionsUsed", "extensionsRequired", "blob", "extensionsUsedList", "extensionsRequiredList", "reader", "binaryChunk", "binaryChunkPrefix", "jsonChunk", "jsonChunkPrefix", "header", "headerView", "totalByteLength", "glbBlob", "glbReader", "base64data", "object", "objectDef", "extensionName", "error", "isRelativeCopy", "uids", "normal", "v", "Vector3", "cache", "mapDef", "texture", "didTransform", "transformDef", "metalnessMap", "roughnessMap", "getEncodingConversion", "map", "SRGBColorSpace", "c", "CompressedTexture", "metalness", "roughness", "width", "height", "context", "composite", "convert", "data", "Source", "NoColorSpace", "maxTextureSize", "buffer", "componentType", "target", "componentSize", "byteStride", "byteLength", "dataView", "offset", "bufferViewDef", "geometry", "types", "minMax", "bufferViewTarget", "bufferView", "accessorDef", "image", "format", "flipY", "pending", "cachedImages", "key", "imageDef", "ctx", "RGBAFormat", "bufferViewIndex", "ImageUtils", "samplerDef", "textureDef", "ext", "material", "materialDef", "color", "metalRoughTexture", "metalRoughMapDef", "baseColorMapDef", "emissive", "emissiveMapDef", "normalMapDef", "occlusionMapDef", "DoubleSide", "mesh", "meshCacheKeyParts", "l", "meshCacheKey", "mode", "meshDef", "attributes", "primitives", "targets", "nameConversion", "originalNormal", "modifiedAttribute", "attributeName", "BufferAttribute", "accessor", "weights", "targetNames", "reverseDictionary", "warned", "gltfAttributeName", "baseAttribute", "relativeAttribute", "j", "jl", "isMultiMaterial", "didForceIndices", "indices", "materials", "groups", "primitive", "cacheKey", "attrType", "attrNamePrefix", "camera", "isOrtho", "cameraDef", "clip", "root", "nodeMap", "tracks", "channels", "samplers", "track", "trackBinding", "PropertyBinding", "trackNode", "trackProperty", "inputItemSize", "outputItemSize", "interpolation", "InterpolateDiscrete", "animationDef", "node", "skeleton", "rootJoint", "joints", "inverseBindMatrices", "temporaryBoneInverse", "Matrix4", "nodeDef", "rotation", "position", "scale", "meshIndex", "nodeIndex", "children", "child", "childNodeIndex", "scene", "sceneDef", "nodes", "objects", "Scene", "objectsWithoutScene", "func", "light", "lightDef", "lights", "extensionDef", "clearcoatMapDef", "clearcoatRoughnessMapDef", "clearcoatNormalMapDef", "iridescenceMapDef", "iridescenceThicknessMapDef", "transmissionMapDef", "thicknessMapDef", "specularIntensityMapDef", "specularColorMapDef", "sheenRoughnessMapDef", "sheenColorMapDef", "anisotropyMapDef", "bumpMapDef", "translationAttr", "rotationAttr", "scaleAttr", "quaternion", "Quaternion", "time", "valueSize", "times", "values", "interpolant", "mergedTracks", "sourceTracks", "sourceTrack", "sourceTrackBinding", "sourceTrackNode", "InterpolateLinear", "targetCount", "targetIndex", "mergedTrack", "sourceInterpolant", "keyframeIndex", "srcAttribute", "dstAttribute", "Si", "t", "Mi", "Oi", "n", "i", "s", "Ci", "a", "r", "o", "l", "f", "c", "U", "h", "e", "p", "_", "u", "x", "y", "b", "m", "d", "D", "w", "v", "B", "L", "A", "k", "I", "V", "C", "F", "O", "T", "S", "E", "Fi", "init_ktx_parse_module", "__esmMin", "VK_FORMAT_MAP", "KHR_DF_CHANNEL_SAMPLE_LOWER_UPPER", "init_KTX2Exporter", "__esmMin", "init_three_module", "RGBAFormat", "FloatType", "NoColorSpace", "LinearSRGBColorSpace", "HalfFloatType", "UnsignedByteType", "SRGBColorSpace", "RGFormat", "RedFormat", "init_OBJExporter", "__esmMin", "init_PLYExporter", "__esmMin", "init_STLExporter", "__esmMin", "init_USDZExporter", "__esmMin", "init_BoxLineGeometry", "__esmMin", "_v1", "_line3", "_plane", "_closestPoint", "_triangle", "init_ConvexHull", "__esmMin", "init_three_module", "Vector3", "Line3", "Plane", "Triangle", "init_ConvexGeometry", "__esmMin", "init_DecalGeometry", "__esmMin", "init_ParametricFunctions", "__esmMin", "init_ParametricGeometry", "__esmMin", "_tempNormal", "init_RoundedBoxGeometry", "__esmMin", "init_three_module", "Vector3", "init_TeapotGeometry", "__esmMin", "init_TextGeometry", "__esmMin", "init_LightProbeHelper", "__esmMin", "init_OctreeHelper", "__esmMin", "init_PositionalAudioHelper", "__esmMin", "init_RectAreaLightHelper", "__esmMin", "toTrianglesDrawMode", "geometry", "drawMode", "TrianglesDrawMode", "TriangleFanDrawMode", "TriangleStripDrawMode", "index", "indices", "position", "i", "numberOfTriangles", "newIndices", "newGeometry", "init_BufferGeometryUtils", "__esmMin", "init_three_module", "init_TextureHelper", "__esmMin", "_v1", "_v2", "_normalMatrix", "init_VertexNormalsHelper", "__esmMin", "init_three_module", "Vector3", "Matrix3", "_v1", "_v2", "init_VertexTangentsHelper", "__esmMin", "init_three_module", "Vector3", "init_ViewHelper", "__esmMin", "init_HTMLMesh", "__esmMin", "_pointer", "_raycaster", "init_InteractiveGroup", "__esmMin", "init_three_module", "Vector2", "Raycaster", "_frustum", "_center", "_tmpPoint", "_vecNear", "_vecTopLeft", "_vecTopRight", "_vecDownRight", "_vecDownLeft", "_vecFarTopLeft", "_vecFarTopRight", "_vecFarDownRight", "_vecFarDownLeft", "_vectemp1", "_vectemp2", "_vectemp3", "_matrix", "_quaternion", "_scale", "init_SelectionBox", "__esmMin", "init_three_module", "Frustum", "Vector3", "Matrix4", "Quaternion", "init_SelectionHelper", "__esmMin", "init_LightProbeGenerator", "__esmMin", "RectAreaLightTexturesLib", "init_RectAreaLightTexturesLib", "__esmMin", "init_three_module", "LTC_MAT_1", "LTC_MAT_2", "ltc_float_1", "ltc_float_2", "LTC_FLOAT_1", "DataTexture", "RGBAFormat", "FloatType", "UVMapping", "ClampToEdgeWrapping", "LinearFilter", "NearestFilter", "LTC_FLOAT_2", "ltc_half_1", "x", "index", "DataUtils", "ltc_half_2", "LTC_HALF_1", "HalfFloatType", "LTC_HALF_2", "init_RectAreaLightUniformsLib", "__esmMin", "_box", "_vector", "init_LineSegmentsGeometry", "__esmMin", "init_three_module", "Box3", "Vector3", "init_LineMaterial", "__esmMin", "init_three_module", "UniformsLib", "Vector2", "ShaderLib", "UniformsUtils", "_viewport", "_start", "_end", "_start4", "_end4", "_ssOrigin", "_ssOrigin3", "_mvMatrix", "_line", "_closestPoint", "_box", "_sphere", "_clipToWorldVector", "init_LineSegments2", "__esmMin", "init_three_module", "Vector4", "Vector3", "Matrix4", "Line3", "Box3", "Sphere", "init_LineGeometry", "__esmMin", "init_Line2", "__esmMin", "_start", "_end", "_viewport", "init_Wireframe", "__esmMin", "init_three_module", "Vector3", "Vector4", "init_WireframeGeometry2", "__esmMin", "init_EXRLoader", "__esmMin", "init_DMLoader", "__esmMin", "init_MFLoader", "__esmMin", "init_AMFLoader", "__esmMin", "init_BVHLoader", "__esmMin", "init_TGALoader", "__esmMin", "init_ColladaLoader", "__esmMin", "init_DDSLoader", "__esmMin", "init_DRACOLoader", "__esmMin", "tempEuler", "tempVec", "init_FBXLoader", "__esmMin", "init_three_module", "Euler", "Vector3", "init_FontLoader", "__esmMin", "init_GCodeLoader", "__esmMin", "GLTFRegistry", "objects", "key", "object", "createDefaultMaterial", "cache", "MeshStandardMaterial", "FrontSide", "addUnknownExtensionsToUserData", "knownExtensions", "objectDef", "name", "assignExtrasToUserData", "gltfDef", "addMorphTargets", "geometry", "targets", "parser", "hasMorphPosition", "hasMorphNormal", "hasMorphColor", "i", "il", "target", "pendingPositionAccessors", "pendingNormalAccessors", "pendingColorAccessors", "pendingAccessor", "accessors", "morphPositions", "morphNormals", "morphColors", "updateMorphTargets", "mesh", "meshDef", "targetNames", "createPrimitiveKey", "primitiveDef", "geometryKey", "dracoExtension", "EXTENSIONS", "createAttributesKey", "attributes", "attributesKey", "keys", "getNormalizedComponentScale", "constructor", "getImageURIMimeType", "uri", "computeBounds", "box", "Box3", "accessor", "min", "max", "Vector3", "boxScale", "WEBGL_COMPONENT_TYPES", "maxDisplacement", "vector", "sphere", "Sphere", "addPrimitiveAttributes", "pending", "assignAttributeAccessor", "accessorIndex", "attributeName", "gltfAttributeName", "threeAttributeName", "ATTRIBUTES", "ColorManagement", "LinearSRGBColorSpace", "GLTFLoader", "GLTFLightsExtension", "GLTFMaterialsUnlitExtension", "GLTFMaterialsEmissiveStrengthExtension", "GLTFMaterialsClearcoatExtension", "GLTFMaterialsDispersionExtension", "GLTFMaterialsIridescenceExtension", "GLTFMaterialsSheenExtension", "GLTFMaterialsTransmissionExtension", "GLTFMaterialsVolumeExtension", "GLTFMaterialsIorExtension", "GLTFMaterialsSpecularExtension", "GLTFMaterialsBumpExtension", "GLTFMaterialsAnisotropyExtension", "GLTFTextureBasisUExtension", "GLTFTextureWebPExtension", "GLTFTextureAVIFExtension", "GLTFMeshoptCompression", "GLTFMeshGpuInstancing", "BINARY_EXTENSION_HEADER_MAGIC", "BINARY_EXTENSION_HEADER_LENGTH", "BINARY_EXTENSION_CHUNK_TYPES", "GLTFBinaryExtension", "GLTFDracoMeshCompressionExtension", "GLTFTextureTransformExtension", "GLTFMeshQuantizationExtension", "GLTFCubicSplineInterpolant", "_quaternion", "GLTFCubicSplineQuaternionInterpolant", "WEBGL_CONSTANTS", "WEBGL_FILTERS", "WEBGL_WRAPPINGS", "WEBGL_TYPE_SIZES", "PATH_PROPERTIES", "INTERPOLATION", "ALPHA_MODES", "_identityMatrix", "GLTFParser", "init_GLTFLoader", "__esmMin", "init_three_module", "init_BufferGeometryUtils", "Loader", "manager", "url", "onLoad", "onProgress", "onError", "scope", "resourcePath", "relativeUrl", "LoaderUtils", "_onError", "e", "loader", "FileLoader", "data", "gltf", "dracoLoader", "ktx2Loader", "meshoptDecoder", "callback", "path", "json", "extensions", "plugins", "textDecoder", "error", "plugin", "extensionName", "extensionsRequired", "resolve", "reject", "nodeDefs", "nodeIndex", "nodeLength", "nodeDef", "lightIndex", "cacheKey", "dependency", "lightDef", "lightNode", "color", "Color", "range", "DirectionalLight", "PointLight", "SpotLight", "type", "index", "self", "light", "MeshBasicMaterial", "materialParams", "materialDef", "metallicRoughness", "array", "SRGBColorSpace", "materialIndex", "emissiveStrength", "MeshPhysicalMaterial", "extension", "scale", "Vector2", "colorFactor", "colorArray", "textureIndex", "textureDef", "source", "handler", "bufferView", "extensionDef", "buffer", "decoder", "res", "byteOffset", "byteLength", "count", "stride", "result", "primitive", "attributesDef", "results", "nodeObject", "meshes", "instancedMeshes", "m", "Matrix4", "p", "q", "Quaternion", "s", "instancedMesh", "InstancedMesh", "attr", "InstancedBufferAttribute", "Object3D", "headerView", "chunkContentsLength", "chunkView", "chunkIndex", "chunkLength", "chunkType", "contentArray", "bufferViewIndex", "gltfAttributeMap", "threeAttributeMap", "attributeNormalizedMap", "attributeTypeMap", "accessorDef", "componentType", "attribute", "normalized", "texture", "transform", "Interpolant", "parameterPositions", "sampleValues", "sampleSize", "resultBuffer", "values", "valueSize", "offset", "i1", "t0", "t", "t1", "stride2", "stride3", "td", "pp", "ppp", "offset1", "offset0", "s2", "s3", "s0", "s1", "p0", "m0", "p1", "m1", "NearestFilter", "LinearFilter", "NearestMipmapNearestFilter", "LinearMipmapNearestFilter", "NearestMipmapLinearFilter", "LinearMipmapLinearFilter", "ClampToEdgeWrapping", "MirroredRepeatWrapping", "RepeatWrapping", "InterpolateLinear", "InterpolateDiscrete", "options", "isSafari", "safariVersion", "isFirefox", "firefoxVersion", "userAgent", "safariMatch", "TextureLoader", "ImageBitmapLoader", "ext", "dependencies", "scene", "skinDefs", "meshDefs", "skinIndex", "skinLength", "joints", "ref", "updateMappings", "original", "clone", "mappings", "child", "func", "defs", "def", "bufferIndex", "bufferDef", "bufferViewDef", "itemSize", "TypedArray", "BufferAttribute", "pendingBufferViews", "bufferViews", "elementBytes", "itemBytes", "byteStride", "bufferAttribute", "ibSlice", "ibCacheKey", "ib", "InterleavedBuffer", "InterleavedBufferAttribute", "itemSizeIndices", "TypedArrayIndices", "byteOffsetIndices", "byteOffsetValues", "sparseIndices", "sparseValues", "sourceIndex", "sourceDef", "promise", "sampler", "URL", "sourceURI", "isObjectURL", "blob", "imageBitmap", "Texture", "mapName", "mapDef", "colorSpace", "gltfReference", "material", "useDerivativeTangents", "useVertexColors", "useFlatShading", "pointsMaterial", "PointsMaterial", "Material", "lineMaterial", "LineBasicMaterial", "cachedMaterial", "materialType", "materialExtensions", "kmuExtension", "DoubleSide", "alphaMode", "emissiveFactor", "originalName", "sanitizedName", "PropertyBinding", "primitives", "createDracoPrimitive", "cached", "geometryPromise", "BufferGeometry", "meshIndex", "materials", "geometries", "SkinnedMesh", "Mesh", "toTrianglesDrawMode", "TriangleStripDrawMode", "TriangleFanDrawMode", "LineSegments", "Line", "LineLoop", "Points", "group", "Group", "cameraIndex", "camera", "cameraDef", "params", "PerspectiveCamera", "MathUtils", "OrthographicCamera", "skinDef", "inverseBindMatrices", "jointNodes", "bones", "boneInverses", "jointNode", "mat", "Skeleton", "animationIndex", "animationDef", "animationName", "pendingNodes", "pendingInputAccessors", "pendingOutputAccessors", "pendingSamplers", "pendingTargets", "channel", "input", "output", "nodes", "inputAccessors", "outputAccessors", "samplers", "tracks", "node", "inputAccessor", "outputAccessor", "createdTracks", "k", "animation", "AnimationClip", "o", "nodePending", "childPending", "childrenDef", "skeletonPending", "children", "skeleton", "nodeName", "meshPromise", "Bone", "matrix", "mapping", "sceneIndex", "sceneDef", "nodeIds", "reduceAssociations", "reducedAssociations", "value", "targetName", "TypedKeyframeTrack", "NumberKeyframeTrack", "QuaternionKeyframeTrack", "VectorKeyframeTrack", "interpolation", "outputArray", "j", "jl", "track", "scaled", "interpolantType", "init_HDRLoader", "__esmMin", "init_HDRCubeTextureLoader", "__esmMin", "init_IESLoader", "__esmMin", "init_KMZLoader", "__esmMin", "WorkerPool", "init_WorkerPool", "__esmMin", "pool", "workerId", "worker", "i", "msg", "resolve", "transfer", "workerCreator", "A", "I", "B", "g", "Q", "C", "init_zstddec_module", "__esmMin", "E", "i", "D", "DisplayP3ColorSpace", "LinearDisplayP3ColorSpace", "ExtendedSRGBColorSpaceImpl", "init_ColorSpaces", "__esmMin", "init_three_module", "ColorManagement", "SRGBColorSpace", "createRawTexture", "container", "vkFormat", "FORMAT_MAP", "TYPE_MAP", "zstd", "_zstd", "resolve", "Q", "mipmaps", "levelIndex", "levelWidth", "levelHeight", "levelDepth", "level", "levelData", "data", "FloatType", "HalfFloatType", "UnsignedInt5999Type", "UnsignedInt101111Type", "useMipmaps", "texture", "UNCOMPRESSED_FORMATS", "DataTexture", "Data3DTexture", "NearestMipmapNearestFilter", "NearestFilter", "CompressedTexture", "LinearMipmapLinearFilter", "LinearFilter", "parseColorSpace", "dfd", "SRGBColorSpace", "LinearSRGBColorSpace", "DisplayP3ColorSpace", "LinearDisplayP3ColorSpace", "NoColorSpace", "_taskCache", "_activeLoaders", "KTX2Loader", "init_KTX2Loader", "__esmMin", "init_three_module", "init_WorkerPool", "init_ktx_parse_module", "init_zstddec_module", "init_ColorSpaces", "_KTX2Loader", "Loader", "manager", "WorkerPool", "path", "workerLimit", "renderer", "jsLoader", "FileLoader", "jsContent", "binaryLoader", "binaryContent", "fn", "body", "worker", "transcoderBinary", "url", "onLoad", "onProgress", "onError", "loader", "buffer", "transcodeResult", "messageType", "error", "faces", "width", "height", "format", "type", "dfdFlags", "CompressedCubeTexture", "CompressedArrayTexture", "config", "Mi", "isBasisHDR", "taskConfig", "texturePending", "e", "RGBAFormat", "RGBA_ASTC_4x4_Format", "RGB_BPTC_UNSIGNED_Format", "RGBA_BPTC_Format", "RGBA_ETC2_EAC_Format", "RGBA_PVRTC_4BPPV1_Format", "RGBA_S3TC_DXT5_Format", "RGB_ETC1_Format", "RGB_ETC2_Format", "RGB_PVRTC_4BPPV1_Format", "RGBA_S3TC_DXT1_Format", "UnsignedByteType", "transcoderPending", "BasisModule", "EngineFormat", "EngineType", "TranscoderFormat", "BasisFormat", "message", "init", "buffers", "hasAlpha", "transcode", "wasmBinary", "ktx2File", "cleanup", "basisFormat", "layerCount", "levelCount", "faceCount", "transcoderFormat", "engineFormat", "engineType", "getTranscoderFormat", "face", "mip", "layerMips", "mipWidth", "mipHeight", "layer", "levelInfo", "dst", "status", "mipData", "concat", "FORMAT_OPTIONS", "OPTIONS", "opt", "a", "b", "options", "i", "isPowerOfTwo", "value", "arrays", "totalByteLength", "array", "result", "byteOffset", "RGBFormat", "RGFormat", "RedFormat", "R11_EAC_Format", "SIGNED_R11_EAC_Format", "RG11_EAC_Format", "SIGNED_RG11_EAC_Format", "RGBA_ASTC_6x6_Format", "RGB_S3TC_DXT1_Format", "RGBA_S3TC_DXT3_Format", "SIGNED_RED_RGTC1_Format", "RED_RGTC1_Format", "SIGNED_RED_GREEN_RGTC2_Format", "RED_GREEN_RGTC2_Format", "RGBA_PVRTC_2BPPV1_Format", "init_KTXLoader", "__esmMin", "_tempVec0", "_tempVec1", "_ray", "init_LDrawLoader", "__esmMin", "init_three_module", "Vector3", "Ray", "init_LUT3dlLoader", "__esmMin", "init_LUTCubeLoader", "__esmMin", "init_LWOLoader", "__esmMin", "init_LottieLoader", "__esmMin", "init_MD2Loader", "__esmMin", "init_MDDLoader", "__esmMin", "init_MTLLoader", "__esmMin", "init_VolumeSlice", "__esmMin", "init_Volume", "__esmMin", "init_NRRDLoader", "__esmMin", "_vA", "_vB", "_vC", "_ab", "_cb", "_color", "init_OBJLoader", "__esmMin", "init_three_module", "Vector3", "Color", "init_PCDLoader", "__esmMin", "init_PDBLoader", "__esmMin", "_color", "init_PLYLoader", "__esmMin", "init_three_module", "Color", "init_PVRLoader", "__esmMin", "init_RGBELoader", "__esmMin", "SRGB_TO_LINEAR", "init_UltraHDRLoader", "__esmMin", "init_STLLoader", "__esmMin", "init_SVGLoader", "__esmMin", "init_TDSLoader", "__esmMin", "init_TIFFLoader", "__esmMin", "init_TTFLoader", "__esmMin", "init_USDLoader", "__esmMin", "init_VOXLoader", "__esmMin", "R", "Er", "k", "xt", "Lt", "pn", "Tr", "Xe", "kr", "ft", "Ue", "ne", "Gt", "$e", "vt", "Lr", "Mr", "pi", "mt", "mi", "Tt", "yt", "jr", "Ui", "et", "zr", "Yt", "zi", "Hi", "Hr", "ea", "ra", "ia", "oa", "la", "pa", "va", "Ra", "Na", "Ia", "ce", "La", "Fa", "chevrotain_module_min_default", "init_chevrotain_module_min", "__esmMin", "t", "Pt", "r", "i", "a", "s", "sn", "St", "e", "u", "d", "A", "o", "c", "_", "g", "p", "m", "l", "y", "n", "f", "v", "He", "Ga", "Ct", "Wa", "Ba", "qa", "re", "ja", "un", "pe", "cn", "Ce", "ln", "Va", "Mt", "bt", "yr", "Ka", "fn", "za", "Ha", "T", "hn", "dn", "F", "h", "Ye", "vn", "Ae", "Ya", "Xa", "Za", "$a", "b", "gr", "_r", "L", "se", "Tn", "En", "Ar", "mn", "Or", "Rr", "fe", "ue", "Q", "te", "Z", "Ja", "yn", "_n", "Qa", "gn", "An", "Rn", "On", "In", "kn", "Pn", "Nn", "eo", "to", "no", "ro", "io", "ao", "Sn", "oo", "Ft", "N", "V", "so", "uo", "co", "xn", "Cn", "Mn", "Ln", "bn", "Nr", "Fn", "wn", "Ir", "lo", "wt", "qe", "Ee", "w", "fo", "po", "ho", "vo", "pt", "mo", "xe", "it", "at", "Ke", "we", "ot", "It", "Qr", "st", "Jr", "en", "J", "lt", "ze", "wa", "Ua", "tn", "me", "rn", "nn", "Da", "De", "ut", "fr", "pr", "kt", "hr", "dr", "vr", "an", "on", "ct", "mr", "H", "Te", "Eo", "Pr", "To", "Dn", "yo", "_o", "Un", "Gn", "Wn", "Bn", "qn", "jn", "Vn", "Kn", "zn", "go", "Ao", "Ro", "S", "Le", "G", "Oo", "Re", "Hn", "Yn", "Xn", "$n", "Zn", "Qn", "Jn", "ei", "ti", "Dt", "No", "ht", "Ut", "Sr", "ie", "Io", "ri", "Wt", "Oe", "ko", "X", "Po", "dt", "W", "So", "xo", "xr", "Co", "Lo", "ni", "Bt", "Mo", "Ne", "qt", "ii", "Cr", "jt", "si", "ai", "oi", "Vt", "he", "bo", "Fo", "wo", "ui", "ci", "Do", "fi", "li", "Uo", "Go", "Me", "Ze", "Wo", "ye", "br", "hi", "Ge", "Bo", "qo", "di", "jo", "Vo", "vi", "j", "je", "Ei", "I", "Ko", "O", "Ti", "zo", "Et", "Ho", "Yo", "Xo", "$o", "yi", "Qo", "Zo", "C", "_i", "D", "gi", "Jo", "Kt", "We", "es", "z", "ts", "rs", "Ai", "Fr", "ns", "Ri", "is", "as", "os", "Oi", "Ni", "wr", "ss", "Dr", "Ii", "us", "x", "Ur", "M", "B", "Ie", "Gr", "Qe", "cs", "_e", "Wr", "ps", "ls", "Br", "Pi", "Si", "Ci", "fs", "xi", "ki", "bi", "Li", "Mi", "hs", "_t", "qr", "ds", "Fi", "wi", "Je", "Vr", "vs", "ms", "Di", "Es", "Ts", "ae", "gt", "ys", "Gi", "Wi", "Bi", "qi", "ji", "_s", "zt", "gs", "As", "Rs", "Os", "$", "Ht", "de", "Ns", "Is", "ks", "Kr", "Ps", "Vi", "P", "Ss", "ic", "Xt", "be", "ge", "Ki", "Fe", "Ve", "xs", "ke", "Cs", "Ls", "Ms", "bs", "Be", "Fs", "ws", "Yi", "Xi", "Ds", "Y", "ve", "At", "$i", "Us", "Zi", "Gs", "Yr", "Qi", "Ji", "Ws", "$t", "tt", "K", "ta", "Bs", "qs", "Zt", "na", "js", "Qt", "aa", "Vs", "Xr", "Ks", "zs", "Hs", "Ys", "Jt", "q", "le", "er", "sa", "rt", "ua", "Xs", "ca", "Rt", "$s", "Zs", "tr", "$r", "Zr", "fa", "Qs", "Js", "rr", "ha", "da", "eu", "nr", "oe", "Pe", "tu", "ma", "Ea", "ru", "nu", "ir", "Ta", "ya", "_a", "ga", "iu", "ou", "Ot", "au", "ar", "Aa", "or", "Oa", "su", "uu", "sr", "cu", "U", "ka", "ee", "lu", "Pa", "Sa", "xa", "fu", "pu", "hu", "du", "vu", "mu", "Eu", "Tu", "yu", "_u", "gu", "Au", "Ru", "ur", "Ou", "Nu", "cr", "Ca", "Iu", "E", "ku", "lr", "Ma", "nt", "Pu", "Nt", "Su", "Se", "ba", "xu", "Cu", "Lu", "Mu", "CstParser", "init_VRMLLoader", "__esmMin", "init_chevrotain_module_min", "chevrotain_module_min_default", "init_VTKLoader", "__esmMin", "init_XYZLoader", "__esmMin", "GouraudShader", "init_MeshGouraudMaterial", "__esmMin", "init_three_module", "UniformsUtils", "UniformsLib", "Color", "init_LDrawConditionalLineMaterial", "__esmMin", "init_MeshPostProcessingMaterial", "__esmMin", "checkAABBAxis", "p1x", "p1y", "p2x", "p2y", "minx", "maxx", "miny", "maxy", "radius", "Capsule", "init_Capsule", "__esmMin", "init_three_module", "start", "Vector3", "end", "capsule", "target", "v", "box", "init_ColorConverter", "__esmMin", "lerp", "_p", "init_ImprovedNoise", "__esmMin", "init_three_module", "MathUtils", "init_Lut", "__esmMin", "_face", "_color", "_uva", "_uvb", "_uvc", "init_MeshSurfaceSampler", "__esmMin", "init_three_module", "Triangle", "Vector3", "Vector2", "a", "b", "R", "AbsR", "t", "xAxis", "yAxis", "zAxis", "v1", "size", "closestPoint", "rotationMatrix", "aabb", "matrix", "inverse", "localRay", "OBB", "obb", "init_OBB", "__esmMin", "init_three_module", "Vector3", "Matrix3", "Box3", "Matrix4", "Ray", "center", "halfSize", "rotation", "target", "point", "x", "MathUtils", "y", "z", "box3", "sphere", "epsilon", "i", "j", "ra", "rb", "plane", "r", "d", "ray", "e", "sx", "sy", "sz", "invSX", "invSY", "invSZ", "_v1", "_v2", "_point1", "_point2", "_plane", "_line1", "_line2", "_box", "_sphere", "_capsule", "_center", "_temp1", "_temp2", "_temp3", "init_Octree", "__esmMin", "init_three_module", "init_Capsule", "Vector3", "Plane", "Line3", "Box3", "Sphere", "Capsule", "SimplexNoise", "init_SimplexNoise", "__esmMin", "r", "i", "xin", "yin", "n0", "n1", "n2", "F2", "s", "j", "G2", "t", "X0", "Y0", "x0", "y0", "i1", "j1", "x1", "y1", "x2", "y2", "ii", "jj", "gi0", "gi1", "gi2", "t0", "t1", "t2", "zin", "n3", "k", "G3", "Z0", "z0", "k1", "i2", "j2", "k2", "z1", "z2", "x3", "y3", "z3", "kk", "gi3", "t3", "x", "y", "z", "w", "grad4", "simplex", "perm", "F4", "G4", "n4", "l", "W0", "w0", "c1", "c2", "c3", "c4", "c5", "c6", "c", "l1", "l2", "i3", "j3", "k3", "l3", "w1", "w2", "w3", "x4", "y4", "z4", "w4", "ll", "gi4", "t4", "g", "_v1", "init_ConvexObjectBreaker", "__esmMin", "init_three_module", "Vector3", "init_GPUComputationRenderer", "__esmMin", "_translationObject", "_quaternionObject", "_scaleObject", "_translationWorld", "_quaternionWorld", "_scaleWorld", "init_Gyroscope", "__esmMin", "init_three_module", "Vector3", "Quaternion", "init_MD2Character", "__esmMin", "init_MorphBlendMesh", "__esmMin", "init_MD2CharacterComplex", "__esmMin", "init_MorphAnimMesh", "__esmMin", "init_ProgressiveLightMap", "__esmMin", "init_RollerCoaster", "__esmMin", "init_TubePainter", "__esmMin", "_matrix", "init_CurveModifier", "__esmMin", "init_three_module", "Matrix4", "_A", "_B", "_C", "init_EdgeSplitModifier", "__esmMin", "init_three_module", "Vector3", "_cb", "_ab", "init_SimplifyModifier", "__esmMin", "init_three_module", "Vector3", "init_TessellateModifier", "__esmMin", "init_GroundedSkybox", "__esmMin", "Lensflare", "LensflareElement", "init_Lensflare", "__esmMin", "init_three_module", "_Lensflare", "Mesh", "MeshBasicMaterial", "positionScreen", "Vector3", "positionView", "tempMap", "FramebufferTexture", "occlusionMap", "currentType", "UnsignedByteType", "geometry", "material1a", "RawShaderMaterial", "material1b", "mesh1", "elements", "shader", "material2", "Color", "Vector2", "AdditiveBlending", "mesh2", "element", "scale", "screenPositionPixels", "validArea", "Box2", "viewport", "Vector4", "renderer", "scene", "camera", "renderTarget", "type", "invAspect", "halfViewportWidth", "halfViewportHeight", "size", "uniforms", "vecX", "vecY", "i", "l", "texture", "distance", "color", "BufferGeometry", "float32Array", "interleavedBuffer", "InterleavedBuffer", "InterleavedBufferAttribute", "edgeTable", "triTable", "init_MarchingCubes", "__esmMin", "Reflector", "init_Reflector", "__esmMin", "init_three_module", "_Reflector", "Mesh", "geometry", "options", "PerspectiveCamera", "scope", "color", "Color", "textureWidth", "textureHeight", "clipBias", "shader", "multisample", "reflectorPlane", "Plane", "normal", "Vector3", "reflectorWorldPosition", "cameraWorldPosition", "rotationMatrix", "Matrix4", "lookAtPosition", "clipPlane", "Vector4", "view", "target", "q", "textureMatrix", "virtualCamera", "renderTarget", "WebGLRenderTarget", "HalfFloatType", "material", "ShaderMaterial", "UniformsUtils", "renderer", "scene", "camera", "projectionMatrix", "currentRenderTarget", "currentXrEnabled", "currentShadowAutoUpdate", "viewport", "ReflectorForSSRPass", "init_ReflectorForSSRPass", "__esmMin", "init_three_module", "_ReflectorForSSRPass", "Mesh", "geometry", "options", "scope", "color", "Color", "textureWidth", "textureHeight", "clipBias", "shader", "useDepthTexture", "yAxis", "Vector3", "vecTemp0", "vecTemp1", "Vector2", "val", "normal", "reflectorWorldPosition", "cameraWorldPosition", "rotationMatrix", "Matrix4", "lookAtPosition", "view", "target", "textureMatrix", "virtualCamera", "PerspectiveCamera", "depthTexture", "DepthTexture", "UnsignedShortType", "NearestFilter", "parameters", "HalfFloatType", "renderTarget", "WebGLRenderTarget", "material", "ShaderMaterial", "UniformsUtils", "globalPlanes", "Plane", "renderer", "scene", "camera", "currentRenderTarget", "currentXrEnabled", "currentShadowAutoUpdate", "currentClippingPlanes", "viewport", "Refractor", "init_Refractor", "__esmMin", "init_three_module", "_Refractor", "Mesh", "geometry", "options", "PerspectiveCamera", "scope", "color", "Color", "textureWidth", "textureHeight", "clipBias", "shader", "multisample", "virtualCamera", "refractorPlane", "Plane", "textureMatrix", "Matrix4", "renderTarget", "WebGLRenderTarget", "HalfFloatType", "ShaderMaterial", "UniformsUtils", "visible", "refractorWorldPosition", "Vector3", "cameraWorldPosition", "rotationMatrix", "view", "normal", "camera", "updateRefractorPlane", "position", "quaternion", "Quaternion", "scale", "updateVirtualCamera", "clipPlane", "clipVector", "Vector4", "q", "projectionMatrix", "updateTextureMatrix", "render", "renderer", "scene", "currentRenderTarget", "currentXrEnabled", "currentShadowAutoUpdate", "viewport", "_shadowMatrix", "init_ShadowMesh", "__esmMin", "init_three_module", "Matrix4", "Sky", "init_Sky", "__esmMin", "init_three_module", "_Sky", "Mesh", "shader", "material", "ShaderMaterial", "UniformsUtils", "BackSide", "BoxGeometry", "Vector3", "init_Water", "__esmMin", "init_AmmoPhysics", "__esmMin", "_scale", "ZERO", "init_RapierPhysics", "__esmMin", "init_three_module", "Vector3", "CopyShader", "init_CopyShader", "__esmMin", "init_AfterimageShader", "__esmMin", "init_AfterimagePass", "__esmMin", "ConvolutionShader", "init_ConvolutionShader", "__esmMin", "init_three_module", "Vector2", "gauss", "x", "sigma", "buildKernel", "kernelSize", "halfWidth", "values", "sum", "i", "BloomPass", "CombineShader", "init_BloomPass", "__esmMin", "init_three_module", "init_Pass", "init_ConvolutionShader", "_BloomPass", "Pass", "strength", "UniformsUtils", "ShaderMaterial", "AdditiveBlending", "convolutionShader", "ConvolutionShader", "WebGLRenderTarget", "HalfFloatType", "FullScreenQuad", "renderer", "writeBuffer", "readBuffer", "deltaTime", "maskActive", "width", "height", "Vector2", "init_BokehShader", "__esmMin", "init_BokehPass", "__esmMin", "init_ClearPass", "__esmMin", "init_CubeTexturePass", "__esmMin", "DotScreenShader", "init_DotScreenShader", "__esmMin", "init_three_module", "Vector2", "init_DotScreenPass", "__esmMin", "init_ShaderPass", "__esmMin", "init_MaskPass", "__esmMin", "init_EffectComposer", "__esmMin", "init_FilmShader", "__esmMin", "init_FilmPass", "__esmMin", "init_DigitalGlitch", "__esmMin", "init_GlitchPass", "__esmMin", "generateMagicSquareNoise", "size", "noiseSize", "magicSquare", "generateMagicSquare", "noiseSquareSize", "data", "inx", "iAng", "angle", "randomVec", "Vector3", "noiseTexture", "DataTexture", "RepeatWrapping", "i", "j", "num", "GTAOShader", "GTAODepthShader", "GTAOBlendShader", "init_GTAOShader", "__esmMin", "init_three_module", "Vector2", "Matrix4", "generatePdSamplePointInitializer", "samples", "rings", "radiusExponent", "poissonDisk", "generateDenoiseSamples", "glslCode", "i", "sample", "numSamples", "numRings", "angle", "radius", "Vector3", "PoissonDenoiseShader", "init_PoissonDenoiseShader", "__esmMin", "init_three_module", "Vector2", "Matrix4", "GTAOPass", "init_GTAOPass", "__esmMin", "init_three_module", "init_Pass", "init_GTAOShader", "init_PoissonDenoiseShader", "init_CopyShader", "init_SimplexNoise", "_GTAOPass", "Pass", "scene", "camera", "width", "height", "parameters", "aoParameters", "pdParameters", "generateMagicSquareNoise", "WebGLRenderTarget", "HalfFloatType", "ShaderMaterial", "GTAOShader", "UniformsUtils", "NoBlending", "MeshNormalMaterial", "PoissonDenoiseShader", "GTAODepthShader", "CopyShader", "DstColorFactor", "ZeroFactor", "AddEquation", "DstAlphaFactor", "GTAOBlendShader", "CustomBlending", "FullScreenQuad", "Color", "depthTexture", "normalTexture", "DepthTexture", "DepthStencilFormat", "UnsignedInt248Type", "NearestFilter", "normalVectorType", "depthValueSource", "box", "updateShader", "generatePdSamplePointInitializer", "renderer", "writeBuffer", "readBuffer", "passMaterial", "renderTarget", "clearColor", "clearAlpha", "originalClearAlpha", "originalAutoClear", "overrideMaterial", "cache", "object", "i", "size", "simplex", "SimplexNoise", "arraySize", "data", "j", "x", "y", "noiseTexture", "DataTexture", "RGBAFormat", "UnsignedByteType", "RepeatWrapping", "HalftoneShader", "init_HalftoneShader", "__esmMin", "init_HalftonePass", "__esmMin", "init_LUTPass", "__esmMin", "OutlinePass", "init_OutlinePass", "__esmMin", "init_three_module", "init_Pass", "init_CopyShader", "_OutlinePass", "Pass", "resolution", "scene", "camera", "selectedObjects", "Color", "Vector2", "resx", "resy", "WebGLRenderTarget", "MeshDepthMaterial", "DoubleSide", "RGBADepthPacking", "NoBlending", "replaceDepthToViewZ", "HalfFloatType", "MAX_EDGE_THICKNESS", "MAX_EDGE_GLOW", "copyShader", "CopyShader", "UniformsUtils", "ShaderMaterial", "FullScreenQuad", "Matrix4", "string", "type", "width", "height", "renderer", "writeBuffer", "readBuffer", "deltaTime", "maskActive", "oldAutoClear", "currentBackground", "currentOverrideMaterial", "scalar", "cache", "gatherSelectedMeshesCallBack", "object", "i", "bVisible", "mesh", "visibilityCache", "selectionCache", "VisibilityChangeCallBack", "visibility", "Vector3", "maxRadius", "AdditiveBlending", "init_OutputShader", "__esmMin", "init_OutputPass", "__esmMin", "init_RenderPass", "__esmMin", "init_RenderPixelatedPass", "__esmMin", "SAOShader", "init_SAOShader", "__esmMin", "init_three_module", "Vector2", "Matrix4", "gaussian", "x", "stdDev", "DepthLimitedBlurShader", "BlurShaderUtils", "init_DepthLimitedBlurShader", "__esmMin", "init_three_module", "Vector2", "kernelRadius", "weights", "i", "uvIncrement", "offsets", "material", "SAOPass", "init_SAOPass", "__esmMin", "init_three_module", "init_Pass", "init_SAOShader", "init_DepthLimitedBlurShader", "init_CopyShader", "_SAOPass", "Pass", "scene", "camera", "resolution", "Vector2", "Color", "WebGLRenderTarget", "HalfFloatType", "depthTexture", "DepthTexture", "DepthStencilFormat", "UnsignedInt248Type", "NearestFilter", "MeshNormalMaterial", "NoBlending", "ShaderMaterial", "SAOShader", "UniformsUtils", "DepthLimitedBlurShader", "CopyShader", "CustomBlending", "DstColorFactor", "ZeroFactor", "AddEquation", "DstAlphaFactor", "FullScreenQuad", "renderer", "writeBuffer", "readBuffer", "oldAutoClear", "depthCutoff", "BlurShaderUtils", "outputMaterial", "width", "height", "passMaterial", "renderTarget", "clearColor", "clearAlpha", "originalClearAlpha", "originalAutoClear", "overrideMaterial", "SMAAEdgesShader", "SMAAWeightsShader", "SMAABlendShader", "init_SMAAShader", "__esmMin", "init_three_module", "Vector2", "init_SMAAPass", "__esmMin", "init_SSAARenderPass", "__esmMin", "SSAOShader", "SSAODepthShader", "SSAOBlurShader", "init_SSAOShader", "__esmMin", "init_three_module", "Vector2", "Matrix4", "SSAOPass", "init_SSAOPass", "__esmMin", "init_three_module", "init_Pass", "init_SimplexNoise", "init_SSAOShader", "init_CopyShader", "_SSAOPass", "Pass", "scene", "camera", "width", "height", "kernelSize", "depthTexture", "DepthTexture", "DepthStencilFormat", "UnsignedInt248Type", "WebGLRenderTarget", "NearestFilter", "HalfFloatType", "ShaderMaterial", "SSAOShader", "UniformsUtils", "NoBlending", "MeshNormalMaterial", "SSAOBlurShader", "SSAODepthShader", "CopyShader", "DstColorFactor", "ZeroFactor", "AddEquation", "DstAlphaFactor", "FullScreenQuad", "Color", "renderer", "writeBuffer", "readBuffer", "CustomBlending", "passMaterial", "renderTarget", "clearColor", "clearAlpha", "originalClearAlpha", "originalAutoClear", "overrideMaterial", "kernel", "i", "sample", "Vector3", "scale", "MathUtils", "simplex", "SimplexNoise", "size", "data", "x", "y", "z", "DataTexture", "RedFormat", "FloatType", "RepeatWrapping", "cache", "object", "SSRShader", "SSRDepthShader", "SSRBlurShader", "init_SSRShader", "__esmMin", "init_three_module", "Vector2", "Matrix4", "SSRPass", "init_SSRPass", "__esmMin", "init_three_module", "init_Pass", "init_SSRShader", "init_CopyShader", "_SSRPass", "Pass", "renderer", "scene", "camera", "width", "height", "selects", "bouncing", "groundReflector", "SSRShader", "Color", "val", "depthTexture", "DepthTexture", "UnsignedShortType", "NearestFilter", "WebGLRenderTarget", "HalfFloatType", "ShaderMaterial", "UniformsUtils", "NoBlending", "MeshNormalMaterial", "MeshBasicMaterial", "SSRBlurShader", "SSRDepthShader", "CopyShader", "SrcAlphaFactor", "OneMinusSrcAlphaFactor", "AddEquation", "FullScreenQuad", "value", "writeBuffer", "NormalBlending", "effectiveWidth", "effectiveHeight", "passMaterial", "renderTarget", "clearColor", "clearAlpha", "originalClearAlpha", "originalAutoClear", "overrideMaterial", "originalBackground", "originalFog", "child", "init_SavePass", "__esmMin", "init_TAARenderPass", "__esmMin", "init_TexturePass", "__esmMin", "LuminosityHighPassShader", "init_LuminosityHighPassShader", "__esmMin", "init_three_module", "Color", "UnrealBloomPass", "init_UnrealBloomPass", "__esmMin", "init_three_module", "init_Pass", "init_CopyShader", "init_LuminosityHighPassShader", "_UnrealBloomPass", "Pass", "resolution", "strength", "radius", "threshold", "Vector2", "Color", "resx", "resy", "WebGLRenderTarget", "HalfFloatType", "i", "renderTargetHorizontal", "renderTargetVertical", "highPassShader", "LuminosityHighPassShader", "UniformsUtils", "ShaderMaterial", "kernelSizeArray", "bloomFactors", "Vector3", "CopyShader", "AdditiveBlending", "MeshBasicMaterial", "FullScreenQuad", "width", "height", "renderer", "writeBuffer", "readBuffer", "deltaTime", "maskActive", "oldAutoClear", "inputRenderTarget", "kernelRadius", "coefficients", "sigma", "nMips", "_vector", "_viewMatrix", "_viewProjectionMatrix", "_a", "_b", "init_CSS2DRenderer", "__esmMin", "init_three_module", "Vector3", "Matrix4", "_position", "_quaternion", "_scale", "_matrix", "_matrix2", "init_CSS3DRenderer", "__esmMin", "init_three_module", "Vector3", "Quaternion", "Matrix4", "init_Projector", "__esmMin", "init_SVGRenderer", "__esmMin", "init_ACESFilmicToneMappingShader", "__esmMin", "init_BasicShader", "__esmMin", "init_BleachBypassShader", "__esmMin", "init_BlendShader", "__esmMin", "init_BrightnessContrastShader", "__esmMin", "ColorCorrectionShader", "init_ColorCorrectionShader", "__esmMin", "init_three_module", "Vector3", "ColorifyShader", "init_ColorifyShader", "__esmMin", "init_three_module", "Color", "init_DOFMipMapShader", "__esmMin", "init_ExposureShader", "__esmMin", "FXAAShader", "init_FXAAShader", "__esmMin", "init_three_module", "Vector2", "init_FocusShader", "__esmMin", "FreiChenShader", "init_FreiChenShader", "__esmMin", "init_three_module", "Vector2", "init_GammaCorrectionShader", "__esmMin", "GodRaysGenerateShader", "GodRaysFakeSunShader", "init_GodRaysShader", "__esmMin", "init_three_module", "Vector3", "Color", "init_HorizontalBlurShader", "__esmMin", "init_HorizontalTiltShiftShader", "__esmMin", "init_HueSaturationShader", "__esmMin", "init_KaleidoShader", "__esmMin", "init_LuminosityShader", "__esmMin", "init_MirrorShader", "__esmMin", "NormalMapShader", "init_NormalMapShader", "__esmMin", "init_three_module", "Vector2", "init_RGBShiftShader", "__esmMin", "init_SepiaShader", "__esmMin", "SobelOperatorShader", "init_SobelOperatorShader", "__esmMin", "init_three_module", "Vector2", "replaceAll", "string", "find", "replace", "meshphong_frag_head", "meshphong_frag_body", "SubsurfaceScatteringShader", "init_SubsurfaceScatteringShader", "__esmMin", "init_three_module", "ShaderChunk", "UniformsUtils", "ShaderLib", "Color", "init_TechnicolorShader", "__esmMin", "ToonShader1", "ToonShader2", "ToonShaderHatching", "ToonShaderDotted", "init_ToonShader", "__esmMin", "init_three_module", "Vector3", "Color", "TriangleBlurShader", "init_TriangleBlurShader", "__esmMin", "init_three_module", "Vector2", "init_UnpackDepthRGBAShader", "__esmMin", "VelocityShader", "init_VelocityShader", "__esmMin", "init_three_module", "UniformsUtils", "UniformsLib", "Matrix4", "init_VerticalBlurShader", "__esmMin", "init_VerticalTiltShiftShader", "__esmMin", "init_VignetteShader", "__esmMin", "VolumeRenderShader1", "init_VolumeShader", "__esmMin", "init_three_module", "Vector3", "Vector2", "init_WaterRefractionShader", "__esmMin", "init_FlakesTexture", "__esmMin", "init_CameraUtils", "__esmMin", "init_GeometryCompressionUtils", "__esmMin", "init_GeometryUtils", "__esmMin", "init_LDrawUtils", "__esmMin", "init_SceneUtils", "__esmMin", "init_ShadowMapViewer", "__esmMin", "SkeletonUtils_exports", "__export", "clone", "retarget", "retargetClip", "getBoneName", "bone", "options", "target", "source", "quat", "Quaternion", "scale", "Vector3", "relativeMatrix", "Matrix4", "globalMatrix", "sourceBones", "getBones", "bones", "name", "boneTo", "bonesPosition", "i", "getBoneByName", "clip", "track", "getHelperFromSkeleton", "numFrames", "delta", "convertedTracks", "mixer", "AnimationMixer", "boneDatas", "positionOffset", "boneData", "start", "end", "frame", "time", "j", "VectorKeyframeTrack", "QuaternionKeyframeTrack", "AnimationClip", "sourceLookup", "cloneLookup", "parallelTraverse", "sourceNode", "clonedNode", "node", "clonedMesh", "sourceMesh", "skeleton", "SkeletonHelper", "a", "b", "callback", "init_SkeletonUtils", "__esmMin", "init_three_module", "bins", "bins_buffer", "c", "init_SortUtils", "__esmMin", "init_WebGLTextureUtils", "__esmMin", "init_UVsDebug", "__esmMin", "init_ARButton", "__esmMin", "init_XRHandMeshModel", "__esmMin", "init_OculusHandModel", "__esmMin", "init_OculusHandPointerModel", "__esmMin", "init_Text2D", "__esmMin", "VRButton", "init_VRButton", "__esmMin", "_VRButton", "renderer", "sessionInit", "button", "showEnterVR", "currentSession", "onSessionStarted", "session", "onSessionEnded", "sessionOptions", "err", "disableButton", "showWebXRNotFound", "showVRNotAllowed", "exception", "stylizeElement", "element", "supported", "message", "init_XRButton", "__esmMin", "init_XRControllerModelFactory", "__esmMin", "init_XREstimatedLight", "__esmMin", "_matrix", "_vector", "init_XRHandPrimitiveModel", "__esmMin", "init_three_module", "Matrix4", "Vector3", "init_XRHandModelFactory", "__esmMin", "init_XRPlanes", "__esmMin", "init_Addons", "__esmMin", "init_AnimationClipCreator", "init_CCDIKSolver", "init_ArcballControls", "init_DragControls", "init_FirstPersonControls", "init_FlyControls", "init_MapControls", "init_OrbitControls", "init_PointerLockControls", "init_TrackballControls", "init_TransformControls", "init_CSM", "init_CSMFrustum", "init_CSMHelper", "init_CSMShader", "init_CurveExtras", "init_NURBSCurve", "init_NURBSSurface", "init_NURBSVolume", "init_NURBSUtils", "init_AnaglyphEffect", "init_AsciiEffect", "init_OutlineEffect", "init_ParallaxBarrierEffect", "init_StereoEffect", "init_DebugEnvironment", "init_RoomEnvironment", "init_DRACOExporter", "init_EXRExporter", "init_GLTFExporter", "init_KTX2Exporter", "init_OBJExporter", "init_PLYExporter", "init_STLExporter", "init_USDZExporter", "init_BoxLineGeometry", "init_ConvexGeometry", "init_DecalGeometry", "init_ParametricFunctions", "init_ParametricGeometry", "init_RoundedBoxGeometry", "init_TeapotGeometry", "init_TextGeometry", "init_LightProbeHelper", "init_OctreeHelper", "init_PositionalAudioHelper", "init_RectAreaLightHelper", "init_TextureHelper", "init_VertexNormalsHelper", "init_VertexTangentsHelper", "init_ViewHelper", "init_HTMLMesh", "init_InteractiveGroup", "init_SelectionBox", "init_SelectionHelper", "init_LightProbeGenerator", "init_RectAreaLightTexturesLib", "init_RectAreaLightUniformsLib", "init_Line2", "init_LineGeometry", "init_LineMaterial", "init_LineSegments2", "init_LineSegmentsGeometry", "init_Wireframe", "init_WireframeGeometry2", "init_DMLoader", "init_MFLoader", "init_AMFLoader", "init_BVHLoader", "init_ColladaLoader", "init_DDSLoader", "init_DRACOLoader", "init_EXRLoader", "init_FBXLoader", "init_FontLoader", "init_GCodeLoader", "init_GLTFLoader", "init_HDRLoader", "init_HDRCubeTextureLoader", "init_IESLoader", "init_KMZLoader", "init_KTX2Loader", "init_KTXLoader", "init_LDrawLoader", "init_LUT3dlLoader", "init_LUTCubeLoader", "init_LWOLoader", "init_LottieLoader", "init_MD2Loader", "init_MDDLoader", "init_MTLLoader", "init_NRRDLoader", "init_OBJLoader", "init_PCDLoader", "init_PDBLoader", "init_PLYLoader", "init_PVRLoader", "init_RGBELoader", "init_UltraHDRLoader", "init_STLLoader", "init_SVGLoader", "init_TDSLoader", "init_TGALoader", "init_TIFFLoader", "init_TTFLoader", "init_USDLoader", "init_VOXLoader", "init_VRMLLoader", "init_VTKLoader", "init_XYZLoader", "init_MeshGouraudMaterial", "init_LDrawConditionalLineMaterial", "init_MeshPostProcessingMaterial", "init_Capsule", "init_ColorConverter", "init_ConvexHull", "init_ImprovedNoise", "init_Lut", "init_MeshSurfaceSampler", "init_OBB", "init_Octree", "init_SimplexNoise", "init_ConvexObjectBreaker", "init_GPUComputationRenderer", "init_Gyroscope", "init_MD2Character", "init_MD2CharacterComplex", "init_MorphAnimMesh", "init_MorphBlendMesh", "init_ProgressiveLightMap", "init_RollerCoaster", "init_TubePainter", "init_Volume", "init_VolumeSlice", "init_CurveModifier", "init_EdgeSplitModifier", "init_SimplifyModifier", "init_TessellateModifier", "init_GroundedSkybox", "init_Lensflare", "init_MarchingCubes", "init_Reflector", "init_ReflectorForSSRPass", "init_Refractor", "init_ShadowMesh", "init_Sky", "init_Water", "init_AmmoPhysics", "init_RapierPhysics", "init_AfterimagePass", "init_BloomPass", "init_BokehPass", "init_ClearPass", "init_CubeTexturePass", "init_DotScreenPass", "init_EffectComposer", "init_FilmPass", "init_GlitchPass", "init_GTAOPass", "init_HalftonePass", "init_LUTPass", "init_MaskPass", "init_OutlinePass", "init_OutputPass", "init_Pass", "init_RenderPass", "init_RenderPixelatedPass", "init_SAOPass", "init_SMAAPass", "init_SSAARenderPass", "init_SSAOPass", "init_SSRPass", "init_SavePass", "init_ShaderPass", "init_TAARenderPass", "init_TexturePass", "init_UnrealBloomPass", "init_CSS2DRenderer", "init_CSS3DRenderer", "init_Projector", "init_SVGRenderer", "init_ACESFilmicToneMappingShader", "init_AfterimageShader", "init_BasicShader", "init_BleachBypassShader", "init_BlendShader", "init_BokehShader", "init_BrightnessContrastShader", "init_ColorCorrectionShader", "init_ColorifyShader", "init_ConvolutionShader", "init_CopyShader", "init_DOFMipMapShader", "init_DepthLimitedBlurShader", "init_DigitalGlitch", "init_DotScreenShader", "init_ExposureShader", "init_FXAAShader", "init_FilmShader", "init_FocusShader", "init_FreiChenShader", "init_GammaCorrectionShader", "init_GodRaysShader", "init_GTAOShader", "init_HalftoneShader", "init_HorizontalBlurShader", "init_HorizontalTiltShiftShader", "init_HueSaturationShader", "init_KaleidoShader", "init_LuminosityHighPassShader", "init_LuminosityShader", "init_MirrorShader", "init_NormalMapShader", "init_OutputShader", "init_RGBShiftShader", "init_SAOShader", "init_SMAAShader", "init_SSAOShader", "init_SSRShader", "init_SepiaShader", "init_SobelOperatorShader", "init_SubsurfaceScatteringShader", "init_TechnicolorShader", "init_ToonShader", "init_TriangleBlurShader", "init_UnpackDepthRGBAShader", "init_VelocityShader", "init_VerticalBlurShader", "init_VerticalTiltShiftShader", "init_VignetteShader", "init_VolumeShader", "init_WaterRefractionShader", "init_FlakesTexture", "init_BufferGeometryUtils", "init_CameraUtils", "init_GeometryCompressionUtils", "init_GeometryUtils", "init_LDrawUtils", "init_SceneUtils", "init_ShadowMapViewer", "init_SkeletonUtils", "init_SortUtils", "init_WebGLTextureUtils", "init_UVsDebug", "init_WorkerPool", "init_ARButton", "init_OculusHandModel", "init_OculusHandPointerModel", "init_Text2D", "init_VRButton", "init_XRButton", "init_XRControllerModelFactory", "init_XREstimatedLight", "init_XRHandMeshModel", "init_XRHandModelFactory", "init_XRHandPrimitiveModel", "init_XRPlanes", "addSkeletonScalingExtensions", "Skeleton", "_identityMatrix", "Matrix4", "_offsetMatrix", "scaleMatrix", "posVec", "Vector3", "tmpQuat", "Quaternion", "tmpTrans", "adjustTranslationForRoot", "bone", "matrix", "Bone", "translation", "scale", "updateAttachments", "attachments", "boneMatrices", "at", "parentWorld", "i", "matrixWorld", "child", "obj", "boneName", "useBoneScale", "boneIdx", "b", "localScale", "att", "a", "init_SkeletonScalingExtensions", "__esmMin", "init_three_module", "detectModelDesc", "object", "desc", "bone", "archBodyScaleDesc", "editorBodyScaleDesc", "applyScaleDescToBones", "bones", "scaleVector", "Skeleton", "name", "scale", "Vector3", "init_ModelScaleDesc", "__esmMin", "init_three_module", "findSkinnedMeshWithBone", "root", "boneName", "found", "node", "SkinnedMesh", "bone", "applyModulateToBody", "model", "lastSkinnedMesh", "meshIndex", "mesh", "isPants", "prepareBodyForCharModel", "body", "mat", "favoriteColor", "bodyScale", "pantsColor", "applyMaterialToGroup", "skinned", "skl", "applyScaleDescToBones", "attachHeadToBody", "head", "headBoneName", "headBone", "Bone", "skinnedMesh", "skeleton", "headToBodyScale", "applyMaterialClassToMesh", "newMatClass", "colorInfo", "forFFLMaterial", "oldMat", "userData", "modulateModeType", "params", "disposeModel", "Mesh", "Material", "map", "getFaceCamera", "camera", "PerspectiveCamera", "getWholeBodyCamera", "aspect", "height", "yOffset", "yFactor1", "yFactor2", "coefficientZMin", "coefficientZMax", "rootHeight", "y", "heightFactor", "z", "adjustCameraForBodyHead", "headPos", "Vector3", "rootPos", "init_BodyUtilities", "__esmMin", "init_three_module", "init_ModelScaleDesc", "group", "_unpackFFLiCharInfo", "u8", "ptr", "view", "name", "creator", "createID", "authorID", "verifyCharInfo", "data", "ffl", "verifyName", "mod", "charInfoPtr", "charInfoAllocated", "FFLiCharInfo_size", "result", "FFLiVerifyReasonException", "_allocateModelSource", "module", "bufferPtr", "modelSource", "setStudioData", "src", "charInfoData", "_studioToFFLiCharInfo", "callGetCharInfoFunc", "size", "funcName", "dataPtr", "FFLStoreData_size", "_studioURLObfuscationDecode", "makeExpressionFlag", "expressions", "checkRange", "i", "FFLExpression", "flags", "checkForChangeShapes", "index", "checkExpressionChangesShapes", "part", "bitIndex", "warn", "expressionsDisablingNose", "expressionsDisablingMask", "prefix", "_getIdentCamera", "flipY", "camera", "OrthographicCamera", "createAndRenderToTarget", "scene", "renderer", "width", "height", "targetOptions", "options", "LinearFilter", "renderTarget", "_isWebGPU", "RenderTarget", "WebGLRenderTarget", "prevTarget", "_disposeMany", "group", "disposeMaterial", "material", "child", "Mesh", "Scene", "dst", "commonColorMask", "decodedData", "previous", "encodedByte", "original", "FFLResult", "FFLModulateMode", "FFLModulateType", "FFLModelFlag", "commonColorEnableMask", "TextureManager", "FFLResultException", "FFLResultWrongParam", "FFLResultBroken", "BrokenInitRes", "FFLResultNotAvailable", "FFLResultFatal", "ExpressionNotSet", "FFL", "FFLColor_size", "FFLAdditionalInfo_size", "_getFFLColor", "CharModel", "PantsColor", "pantsColors", "FFLDrawParam_size", "CharModelAccessor", "FFLCharModelSource_size", "FFLCharModelDescDefault", "matSupportsFFL", "DrawParam", "CharModelTextures", "_getBGClearMesh", "ModelTexturesConverter", "init_ffl", "__esmMin", "init_three_module", "color", "_TextureManager", "setToFFLGlobal", "createCallback", "deleteCallback", "format", "useOldFormats", "dataFormat", "RedFormat", "RGFormat", "RGBAFormat", "_", "textureInfoPtr", "texturePtrPtr", "textureInfo", "imageData", "canUseMipmaps", "useMipmaps", "texture", "DataTexture", "UnsignedByteType", "LinearMipmapLinearFilter", "mipLevel", "mipOffset", "mipWidth", "mipHeight", "nextMipOffset", "end", "start", "mipData", "id", "disposeReal", "tex", "_FFLResultException", "message", "expression", "_FFL", "resource", "moduleOrPromise", "resourceDescPtr", "resolve", "desc", "heapPtr", "heapSize", "resourceDescData", "error", "obj", "contentLength", "reader", "offset", "done", "value", "p", "resourceDesc", "f32", "colorPtr", "Color", "_CharModel", "descOrExpFlag", "materialClass", "verify", "modelSourcePtr", "modelDescPtr", "modelSourceBuffer", "modelDescBuffer", "val", "idx", "Group", "infoPtr", "faceTarget", "charModel", "newData", "texOnly", "materialTextureClass", "newModelDesc", "newCharModel", "disposeTargets", "target", "mesh", "build", "m", "x", "y", "isSpecial", "flag", "defaultDesc", "colorInfo", "shapeType", "drawParam", "excludeFromBox", "box", "Box3", "favoriteColor", "pRenderTextures", "array", "getVec3", "Vector3", "_DrawParam", "FFLAttributeBuffer_size", "texManager", "geometry", "side", "DoubleSide", "FrontSide", "BackSide", "isFFLMaterial", "params", "materialParam", "pMtx", "attributes", "primitiveParam", "BufferGeometry", "indexPtr", "indices", "Uint16BufferAttribute", "bt", "pos", "isHalfFloat", "txc", "nrm", "tan", "col", "posEnd", "posAttribute", "Float16BufferAttribute", "InterleavedBufferAttribute", "InterleavedBuffer", "attr", "Float32BufferAttribute", "Int8BufferAttribute", "Uint8BufferAttribute", "modulateParam", "textureManager", "texturePtr", "MirroredRepeatWrapping", "modulateType", "modulateMode", "CustomBlending", "OneMinusDstAlphaFactor", "SrcAlphaFactor", "DstAlphaFactor", "OneMinusSrcAlphaFactor", "OneFactor", "forFFLMaterial", "transparent", "lightEnable", "modulateModeType", "param", "heapF32", "texMgr", "matTexClass", "maskTargets", "faceColor", "pRawMaskDrawParam", "clearAlpha", "count", "type", "facelineTempObjectPtr", "drawParams", "dp", "offscreenScene", "maskParams", "targets", "maskTempObjectPtr", "expressionFlagPtr", "scenes", "maskParamPtr", "rawMaskDrawParam", "res", "resolution", "rawMaskParam", "opacity", "PlaneGeometry", "MeshBasicMaterial", "NoBlending", "convertTextureForTypes", "userData", "bgClearRGBMesh", "texMat", "plane", "textureMesh", "dataTex", "three_webgpu_exports", "__export", "ACESFilmicToneMapping", "AONode", "AddEquation", "AddOperation", "AdditiveAnimationBlendMode", "AdditiveBlending", "AgXToneMapping", "AlphaFormat", "AlwaysCompare", "AlwaysDepth", "AlwaysStencilFunc", "AmbientLight", "AmbientLightNode", "AnalyticLightNode", "AnimationAction", "AnimationClip", "AnimationLoader", "AnimationMixer", "AnimationObjectGroup", "AnimationUtils", "ArcCurve", "ArrayCamera", "ArrayElementNode", "ArrayNode", "ArrowHelper", "AssignNode", "AttachedBindMode", "AttributeNode", "Audio", "AudioAnalyser", "AudioContext", "AudioListener", "AudioLoader", "AxesHelper", "BackSide", "BasicDepthPacking", "BasicEnvironmentNode", "BasicShadowMap", "BatchNode", "BatchedMesh", "BitcastNode", "Bone", "BooleanKeyframeTrack", "Box2", "Box3", "Box3Helper", "BoxGeometry", "BoxHelper", "BufferAttribute", "BufferAttributeNode", "BufferGeometry", "BufferGeometryLoader", "BufferNode", "BumpMapNode", "BundleGroup", "BypassNode", "ByteType", "Cache", "Camera", "CameraHelper", "CanvasTarget", "CanvasTexture", "CapsuleGeometry", "CatmullRomCurve3", "CineonToneMapping", "CircleGeometry", "ClampToEdgeWrapping", "ClippingGroup", "Clock", "CodeNode", "Color", "ColorKeyframeTrack", "ColorManagement", "ColorSpaceNode", "CompressedArrayTexture", "CompressedCubeTexture", "CompressedTexture", "CompressedTextureLoader", "ComputeNode", "ConeGeometry", "ConstNode", "ConstantAlphaFactor", "ConstantColorFactor", "ContextNode", "Controls", "ConvertNode", "CubeCamera", "CubeDepthTexture", "CubeReflectionMapping", "CubeRefractionMapping", "CubeTexture", "CubeTextureLoader", "CubeTextureNode", "CubeUVReflectionMapping", "CubicBezierCurve", "CubicBezierCurve3", "CubicInterpolant", "CullFaceBack", "CullFaceFront", "CullFaceFrontBack", "CullFaceNone", "Curve", "CurvePath", "CustomBlending", "CustomToneMapping", "CylinderGeometry", "Cylindrical", "Data3DTexture", "DataArrayTexture", "DataTexture", "DataTextureLoader", "DataUtils", "DebugNode", "DecrementStencilOp", "DecrementWrapStencilOp", "DefaultLoadingManager", "DepthFormat", "DepthStencilFormat", "DepthTexture", "DetachedBindMode", "DirectionalLight", "DirectionalLightHelper", "DirectionalLightNode", "DiscreteInterpolant", "DodecahedronGeometry", "DoubleSide", "DstAlphaFactor", "DstColorFactor", "DynamicCopyUsage", "DynamicDrawUsage", "DynamicReadUsage", "EdgesGeometry", "EllipseCurve", "EnvironmentNode", "EqualCompare", "EqualDepth", "EqualStencilFunc", "EquirectangularReflectionMapping", "EquirectangularRefractionMapping", "Euler", "EventDispatcher", "EventNode", "ExpressionNode", "ExternalTexture", "ExtrudeGeometry", "FileLoader", "Float16BufferAttribute", "Float32BufferAttribute", "FloatType", "Fog", "FogExp2", "FramebufferTexture", "FrontFacingNode", "FrontSide", "Frustum", "FrustumArray", "FunctionCallNode", "FunctionNode", "FunctionOverloadingNode", "GLBufferAttribute", "GLSL1", "GLSL3", "GLSLNodeParser", "GreaterCompare", "GreaterDepth", "GreaterEqualCompare", "GreaterEqualDepth", "GreaterEqualStencilFunc", "GreaterStencilFunc", "GridHelper", "Group", "HalfFloatType", "HemisphereLight", "HemisphereLightHelper", "HemisphereLightNode", "IESSpotLight", "IESSpotLightNode", "IcosahedronGeometry", "ImageBitmapLoader", "ImageLoader", "ImageUtils", "IncrementStencilOp", "IncrementWrapStencilOp", "IndexNode", "IndirectStorageBufferAttribute", "InspectorBase", "InstanceNode", "InstancedBufferAttribute", "InstancedBufferGeometry", "InstancedInterleavedBuffer", "InstancedMesh", "InstancedMeshNode", "Int16BufferAttribute", "Int32BufferAttribute", "Int8BufferAttribute", "IntType", "InterleavedBuffer", "InterleavedBufferAttribute", "Interpolant", "InterpolateDiscrete", "InterpolateLinear", "InterpolateSmooth", "InterpolationSamplingMode", "InterpolationSamplingType", "InvertStencilOp", "IrradianceNode", "IsolateNode", "JoinNode", "KeepStencilOp", "KeyframeTrack", "LOD", "LatheGeometry", "Layers", "LessCompare", "LessDepth", "LessEqualCompare", "LessEqualDepth", "LessEqualStencilFunc", "LessStencilFunc", "Light", "LightProbe", "LightProbeNode", "Lighting", "LightingContextNode", "LightingModel", "LightingNode", "LightsNode", "Line", "Line2NodeMaterial", "Line3", "LineBasicMaterial", "LineBasicNodeMaterial", "LineCurve", "LineCurve3", "LineDashedMaterial", "LineDashedNodeMaterial", "LineLoop", "LineSegments", "LinearFilter", "LinearInterpolant", "LinearMipMapLinearFilter", "LinearMipMapNearestFilter", "LinearMipmapLinearFilter", "LinearMipmapNearestFilter", "LinearSRGBColorSpace", "LinearToneMapping", "LinearTransfer", "Loader", "LoaderUtils", "LoadingManager", "LoopNode", "LoopOnce", "LoopPingPong", "LoopRepeat", "MOUSE", "MRTNode", "Material", "MaterialLoader", "MaterialNode", "MaterialReferenceNode", "MathUtils", "Matrix2", "Matrix3", "Matrix4", "MaxEquation", "MaxMipLevelNode", "MemberNode", "Mesh", "MeshBasicMaterial", "MeshBasicNodeMaterial", "MeshDepthMaterial", "MeshDistanceMaterial", "MeshLambertMaterial", "MeshLambertNodeMaterial", "MeshMatcapMaterial", "MeshMatcapNodeMaterial", "MeshNormalMaterial", "MeshNormalNodeMaterial", "MeshPhongMaterial", "MeshPhongNodeMaterial", "MeshPhysicalMaterial", "MeshPhysicalNodeMaterial", "MeshSSSNodeMaterial", "MeshStandardMaterial", "MeshStandardNodeMaterial", "MeshToonMaterial", "MeshToonNodeMaterial", "MinEquation", "MirroredRepeatWrapping", "MixOperation", "ModelNode", "MorphNode", "MultiplyBlending", "MultiplyOperation", "NearestFilter", "NearestMipMapLinearFilter", "NearestMipMapNearestFilter", "NearestMipmapLinearFilter", "NearestMipmapNearestFilter", "NeutralToneMapping", "NeverCompare", "NeverDepth", "NeverStencilFunc", "NoBlending", "NoColorSpace", "NoNormalPacking", "NoToneMapping", "Node", "NodeAccess", "NodeAttribute", "NodeBuilder", "NodeCache", "NodeCode", "NodeFrame", "NodeFunctionInput", "NodeLoader", "NodeMaterial", "NodeMaterialLoader", "NodeMaterialObserver", "NodeObjectLoader", "NodeShaderStage", "NodeType", "NodeUniform", "NodeUpdateType", "NodeUtils", "NodeVar", "NodeVarying", "NormalAnimationBlendMode", "NormalBlending", "NormalGAPacking", "NormalMapNode", "NormalRGPacking", "NotEqualCompare", "NotEqualDepth", "NotEqualStencilFunc", "NumberKeyframeTrack", "Object3D", "Object3DNode", "ObjectLoader", "ObjectSpaceNormalMap", "OctahedronGeometry", "OneFactor", "OneMinusConstantAlphaFactor", "OneMinusConstantColorFactor", "OneMinusDstAlphaFactor", "OneMinusDstColorFactor", "OneMinusSrcAlphaFactor", "OneMinusSrcColorFactor", "OrthographicCamera", "OutputStructNode", "PCFShadowMap", "PCFSoftShadowMap", "PMREMGenerator", "PMREMNode", "ParameterNode", "PassNode", "Path", "PerspectiveCamera", "PhongLightingModel", "PhysicalLightingModel", "Plane", "PlaneGeometry", "PlaneHelper", "PointLight", "PointLightHelper", "PointLightNode", "PointUVNode", "Points", "PointsMaterial", "PointsNodeMaterial", "PolarGridHelper", "PolyhedronGeometry", "PositionalAudio", "PostProcessing", "PosterizeNode", "ProjectorLight", "ProjectorLightNode", "PropertyBinding", "PropertyMixer", "PropertyNode", "QuadMesh", "QuadraticBezierCurve", "QuadraticBezierCurve3", "Quaternion", "QuaternionKeyframeTrack", "QuaternionLinearInterpolant", "R11_EAC_Format", "RED_GREEN_RGTC2_Format", "RED_RGTC1_Format", "REVISION", "RG11_EAC_Format", "RGBADepthPacking", "RGBAFormat", "RGBAIntegerFormat", "RGBA_ASTC_10x10_Format", "RGBA_ASTC_10x5_Format", "RGBA_ASTC_10x6_Format", "RGBA_ASTC_10x8_Format", "RGBA_ASTC_12x10_Format", "RGBA_ASTC_12x12_Format", "RGBA_ASTC_4x4_Format", "RGBA_ASTC_5x4_Format", "RGBA_ASTC_5x5_Format", "RGBA_ASTC_6x5_Format", "RGBA_ASTC_6x6_Format", "RGBA_ASTC_8x5_Format", "RGBA_ASTC_8x6_Format", "RGBA_ASTC_8x8_Format", "RGBA_BPTC_Format", "RGBA_ETC2_EAC_Format", "RGBA_PVRTC_2BPPV1_Format", "RGBA_PVRTC_4BPPV1_Format", "RGBA_S3TC_DXT1_Format", "RGBA_S3TC_DXT3_Format", "RGBA_S3TC_DXT5_Format", "RGBDepthPacking", "RGBFormat", "RGBIntegerFormat", "RGB_BPTC_SIGNED_Format", "RGB_BPTC_UNSIGNED_Format", "RGB_ETC1_Format", "RGB_ETC2_Format", "RGB_PVRTC_2BPPV1_Format", "RGB_PVRTC_4BPPV1_Format", "RGB_S3TC_DXT1_Format", "RGDepthPacking", "RGFormat", "RGIntegerFormat", "RTTNode", "RangeNode", "RawShaderMaterial", "Ray", "Raycaster", "RectAreaLight", "RectAreaLightNode", "RedFormat", "RedIntegerFormat", "ReferenceNode", "ReflectorNode", "ReinhardToneMapping", "RemapNode", "RenderOutputNode", "RenderTarget", "RenderTarget3D", "RendererReferenceNode", "RendererUtils", "RepeatWrapping", "ReplaceStencilOp", "ReverseSubtractEquation", "RingGeometry", "RotateNode", "SIGNED_R11_EAC_Format", "SIGNED_RED_GREEN_RGTC2_Format", "SIGNED_RED_RGTC1_Format", "SIGNED_RG11_EAC_Format", "SRGBColorSpace", "SRGBTransfer", "Scene", "SceneNode", "ScreenNode", "ScriptableNode", "ScriptableValueNode", "SetNode", "ShaderMaterial", "ShadowBaseNode", "ShadowMaterial", "ShadowNode", "ShadowNodeMaterial", "Shape", "ShapeGeometry", "ShapePath", "ShapeUtils", "ShortType", "Skeleton", "SkeletonHelper", "SkinnedMesh", "SkinningNode", "Source", "Sphere", "SphereGeometry", "Spherical", "SphericalHarmonics3", "SplineCurve", "SplitNode", "SpotLight", "SpotLightHelper", "SpotLightNode", "Sprite", "SpriteMaterial", "SpriteNodeMaterial", "SpriteSheetUVNode", "SrcAlphaFactor", "SrcAlphaSaturateFactor", "SrcColorFactor", "StackNode", "StaticCopyUsage", "StaticDrawUsage", "StaticReadUsage", "StereoCamera", "Storage3DTexture", "StorageArrayElementNode", "StorageArrayTexture", "StorageBufferAttribute", "StorageBufferNode", "StorageInstancedBufferAttribute", "StorageTexture", "StorageTextureNode", "StreamCopyUsage", "StreamDrawUsage", "StreamReadUsage", "StringKeyframeTrack", "StructNode", "StructTypeNode", "SubBuildNode", "SubtractEquation", "SubtractiveBlending", "TOUCH", "TSL", "TangentSpaceNormalMap", "TempNode", "TetrahedronGeometry", "Texture", "Texture3DNode", "TextureLoader", "TextureNode", "TextureSizeNode", "TextureUtils", "Timer", "TimestampQuery", "ToneMappingNode", "ToonOutlinePassNode", "TorusGeometry", "TorusKnotGeometry", "Triangle", "TriangleFanDrawMode", "TriangleStripDrawMode", "TrianglesDrawMode", "TubeGeometry", "UVMapping", "Uint16BufferAttribute", "Uint32BufferAttribute", "Uint8BufferAttribute", "Uint8ClampedBufferAttribute", "Uniform", "UniformArrayNode", "UniformGroupNode", "UniformNode", "UniformsGroup", "UnsignedByteType", "UnsignedInt101111Type", "UnsignedInt248Type", "UnsignedInt5999Type", "UnsignedIntType", "UnsignedShort4444Type", "UnsignedShort5551Type", "UnsignedShortType", "UserDataNode", "VSMShadowMap", "VarNode", "VaryingNode", "Vector2", "Vector3", "Vector4", "VectorKeyframeTrack", "VertexColorNode", "VideoFrameTexture", "VideoTexture", "ViewportDepthNode", "ViewportDepthTextureNode", "ViewportSharedTextureNode", "ViewportTextureNode", "VolumeNodeMaterial", "WebGL3DRenderTarget", "WebGLArrayRenderTarget", "WebGLCoordinateSystem", "WebGLCubeRenderTarget", "WebGLRenderTarget", "WebGPUCoordinateSystem", "WebGPURenderer", "WebXRController", "WireframeGeometry", "WrapAroundEnding", "ZeroCurvatureEnding", "ZeroFactor", "ZeroSlopeEnding", "ZeroStencilOp", "createCanvasElement", "defaultBuildStages", "defaultShaderStages", "error", "getConsoleFunction", "log", "setConsoleFunction", "shaderStages", "vectorComponents", "warn", "warnOnce", "cyrb53", "value", "seed", "h1", "h2", "i", "val", "ch", "getTypeFromLength", "length", "typeFromLength", "getTypedArrayFromType", "type", "getLengthFromType", "getMemoryLengthFromType", "getAlignmentFromType", "getValueType", "typeOf", "getValueFromType", "params", "last4", "base64ToArrayBuffer", "getDataFromObject", "object", "data", "dataFromObject", "arrayBufferToBase64", "arrayBuffer", "chars", "array", "base64", "c", "addMethodChaining", "name", "nodeElement", "NodeElements", "setProtoSwizzle", "property", "altA", "altB", "proto", "split", "nodeObject", "propUpper", "altAUpper", "altBUpper", "swizzle", "parseSwizzleAndSort", "FlipNode", "getLayoutParameters", "output", "nodeObjects", "getProxyParameters", "index", "target", "receiver", "inputNode", "objectTarget", "ShaderNode", "jsFunc", "nodeType", "ShaderNodeInternal", "Fn", "layout", "instance", "FnNode", "thisArg", "prop", "Stack", "node", "currentStack", "builtinShadowContext", "shadowNode", "light", "context", "shadowLight", "shadowColorNode", "builtinAOContext", "aoNode", "material", "label", "setName", "_getBufferAttribute", "itemSize", "buffer", "_bufferLib", "createBufferAttribute", "stride", "offset", "usage", "instanced", "mat3", "mat4", "cache", "parent", "isolate", "inspector", "callback", "InspectorNode", "addNodeElement", "getEntry", "geometry", "hasMorphPosition", "hasMorphNormals", "hasMorphColors", "morphAttribute", "morphTargetsCount", "entry", "_morphTextures", "disposeTexture", "bufferTexture", "morphTargets", "morphNormals", "morphColors", "vertexDataCount", "width", "height", "maxTextureSize", "vertexDataStride", "morphTarget", "morphNormal", "morphColor", "j", "_morphVec4", "isEquirectangularMapReady$1", "image", "onTextureDispose", "event", "texture", "renderTarget", "_cache$1", "mapTextureMapping", "mapping", "_createPlanes", "lodMax", "sizeLods", "sigmas", "lodMeshes", "lod", "totalLods", "LOD_MIN", "EXTRA_LOD_SIGMA", "sizeLod", "sigma", "texelSize", "min", "max", "uv1", "cubeFaces", "vertices", "positionSize", "uvSize", "faceIndexSize", "position", "uv", "faceIndex", "face", "x", "y", "coordinates", "faceIdx", "_faceLib", "fill", "planes", "_createRenderTarget", "cubeUVRenderTarget", "_setViewport", "_getMaterial", "_getBlurShader", "weights", "uniformArray", "MAX_SAMPLES", "poleAxis", "uniform", "dTheta", "n", "float", "latitudinal", "samples", "envMap", "mipInt", "CUBEUV_TEXEL_WIDTH", "CUBEUV_TEXEL_HEIGHT", "CUBEUV_MAX_MIP", "materialUniforms", "_outputDirection", "blur", "_uniformsMap", "_getGGXShader", "roughness", "ggxConvolution", "uint", "GGX_SAMPLES", "_getCubemapMaterial", "envTexture", "cubeTexture", "_getEquirectMaterial", "equirectUV", "_generateCubeUVSize", "imageHeight", "maxMip", "texelHeight", "_getPMREMFromTexture", "renderer", "generator", "_getCache", "cacheTexture", "isCubeMapReady", "isEquirectangularMapReady", "rendererCache", "_cache", "count", "getKeys", "obj", "keys", "descriptors", "key", "descriptor", "getWireframeVersion", "getWireframeIndex", "indices", "geometryIndex", "geometryPosition", "l", "a", "b", "attribute", "arrayNeedsUint32", "painterSortStable", "reversePainterSortStable", "needsDoublePass", "getCacheKey", "renderContext", "textures", "activeCubeFace", "activeMipmapLevel", "values", "hashArray", "getMembersLayout", "members", "getTextureIndex", "replaceDefaultUV", "getData", "objectData", "_objectData", "getPreviousMatrix", "matrix", "getViewZNode", "builder", "viewZ", "getViewZ", "positionView", "rangeFog", "color", "near", "far", "fog", "rangeFogFactor", "densityFog", "density", "densityFogFactor", "getLightData", "uniformsLib", "uniforms", "lightShadowMatrix", "renderGroup", "frame", "lightProjectionUV", "positionWorld", "spotLightCoord", "lightPosition", "_", "self", "lightTargetPosition", "lightViewPosition", "camera", "saveRendererState", "state", "resetRendererState", "restoreRendererState", "saveSceneState", "scene", "resetSceneState", "restoreSceneState", "saveRendererAndSceneState", "resetRendererAndSceneState", "restoreRendererAndSceneState", "setProjectionFromUnion", "cameraL", "cameraR", "_cameraLPos", "_cameraRPos", "ipd", "projL", "projR", "topFov", "bottomFov", "leftFov", "rightFov", "left", "right", "zOffset", "xOffset", "near2", "far2", "left2", "right2", "top2", "bottom2", "updateCamera", "updateUserCamera", "cameraXR", "RAD2DEG", "onSessionEvent", "controllerIndex", "controller", "referenceSpace", "onSessionEnd", "session", "inputSource", "layer", "XRRenderTarget", "onInputSourcesChange", "controllers", "controllerInputSources", "createXRLayer", "onAnimationFrame", "time", "backend", "glBaseLayer", "pose", "views", "cameraXRNeedsUpdate", "view", "viewport", "glSubImage", "getFloatLength", "floatLength", "GPU_CHUNK_BYTES", "setArray", "arraysEqual", "getImage", "source", "getFormat", "device", "format", "colorSpace", "transfer", "formatGPU", "GPUTextureFormat", "GPUFeatureName", "refreshUniforms", "_lightsCache", "hashString", "hash$1", "_parentBuildStage", "_nodeId", "_stringVectorComponents", "InputNode", "_regNum", "parseSwizzle", "swizzleA", "swizzleB", "swizzleC", "nodeBuilderFunctionsCacheMap", "ShaderNodeObject", "ShaderNodeObjects", "ShaderNodeArray", "ShaderNodeProxy", "ShaderNodeImmutable", "ShaderCallNodeInternal", "bools", "uints", "ints", "floats", "boolsCacheMap", "uintsCacheMap", "intsCacheMap", "floatsCacheMap", "cacheMaps", "constNodesCacheMap", "getConstNode", "ConvertType", "defined", "getConstNodeType", "nodeObjectIntent", "nodeArray", "nodeProxy", "nodeImmutable", "nodeProxyIntent", "fnId", "setCurrentStack", "getCurrentStack", "If", "Switch", "int", "bool", "vec2", "ivec2", "uvec2", "bvec2", "vec3", "ivec3", "uvec3", "bvec3", "vec4", "ivec4", "uvec4", "bvec4", "mat2", "string", "element", "convert", "append", "varyingProperty", "diffuseColor", "diffuseContribution", "emissive", "metalness", "clearcoat", "clearcoatRoughness", "sheen", "sheenRoughness", "iridescence", "iridescenceIOR", "iridescenceThickness", "alphaT", "anisotropy", "anisotropyT", "anisotropyB", "specularColor", "specularColorBlended", "specularF90", "shininess", "dashSize", "gapSize", "pointWidth", "ior", "transmission", "thickness", "attenuationDistance", "attenuationColor", "dispersion", "uniformGroup", "sharedUniformGroup", "frameGroup", "objectGroup", "assign", "call", "_vectorOperators", "OperatorNode", "add", "sub", "mul", "div", "mod", "equal", "notEqual", "lessThan", "greaterThan", "lessThanEqual", "greaterThanEqual", "and", "or", "not", "xor", "bitAnd", "bitNot", "bitOr", "bitXor", "shiftLeft", "shiftRight", "incrementBefore", "decrementBefore", "increment", "decrement", "modInt", "MathNode", "EPSILON", "INFINITY", "PI", "PI2", "TWO_PI", "HALF_PI", "all", "any", "radians", "degrees", "exp", "exp2", "log2", "sqrt", "inverseSqrt", "floor", "ceil", "normalize", "fract", "sin", "cos", "tan", "asin", "acos", "atan", "abs", "sign", "negate", "oneMinus", "dFdx", "dFdy", "round", "reciprocal", "trunc", "fwidth", "transpose", "determinant", "inverse", "equals", "min$1", "max$1", "step", "reflect", "distance", "difference", "dot", "cross", "pow", "pow2", "pow3", "pow4", "transformDirection", "cbrt", "lengthSq", "mix", "clamp", "saturate", "refract", "smoothstep", "faceForward", "rand", "mixElement", "smoothstepElement", "stepElement", "atan2", "faceforward", "inversesqrt", "ConditionalNode", "select", "uniformFlow", "createVar", "Var", "Const", "VarIntent", "subBuild", "varying", "vertexStage", "sRGBTransferEOTF", "sRGBTransferOETF", "WORKING_COLOR_SPACE", "OUTPUT_COLOR_SPACE", "workingToColorSpace", "colorSpaceToWorking", "convertColorSpace", "ReferenceElementNode$1", "ReferenceBaseNode", "reference$1", "rendererReference", "toneMapping", "toneMappingExposure", "bufferAttribute", "dynamicBufferAttribute", "instancedBufferAttribute", "instancedDynamicBufferAttribute", "computeKernel", "compute", "bypass", "remap", "remapClamp", "expression", "Discard", "Return", "renderOutput", "debug", "uv$1", "textureSize", "maxMipLevel", "EmptyTexture$1", "textureBase", "uniformTexture", "textureLoad", "textureLevel", "sampler", "samplerComparison", "UniformArrayElementNode", "BuiltinNode", "builtin", "_screenSizeVec", "_viewportVec", "screenDPR", "screenUV", "screenSize", "screenCoordinate", "viewportSize", "viewportCoordinate", "viewportUV", "viewportResolution", "cameraIndex", "cameraNear", "cameraFar", "cameraProjectionMatrix", "cameraProjectionMatrixInverse", "cameraViewMatrix", "cameraWorldMatrix", "cameraNormalMatrix", "cameraPosition", "cameraViewport", "_sphere", "objectDirection", "objectWorldMatrix", "objectPosition", "objectScale", "objectViewPosition", "objectRadius", "modelDirection", "modelWorldMatrix", "modelPosition", "modelScale", "modelViewPosition", "modelRadius", "modelNormalMatrix", "modelWorldMatrixInverse", "modelViewMatrix", "mediumpModelViewMatrix", "highpModelViewMatrix", "highpModelNormalViewMatrix", "positionGeometry", "positionLocal", "positionPrevious", "positionWorldDirection", "positionViewDirection", "frontFacing", "faceDirection", "directionToFaceDirection", "normalGeometry", "normalLocal", "normalFlat", "normalViewGeometry", "normalWorldGeometry", "normalView", "normalWorld", "clearcoatNormalView", "transformNormal", "transformNormalToView", "transformedNormalView", "transformedNormalWorld", "transformedClearcoatNormalView", "_e1$1", "_m1$1", "materialRefractionRatio", "materialEnvIntensity", "materialEnvRotation", "reflectView", "refractView", "reflectVector", "refractVector", "EmptyTexture", "cubeTextureBase", "uniformCubeTexture", "ReferenceElementNode", "reference", "referenceBuffer", "materialReference", "q0", "q1", "st0", "st1", "N", "q1perp", "q0perp", "T", "B", "det", "scale$1", "tangentViewFrame", "bitangentViewFrame", "tangentGeometry", "tangentLocal", "tangentView", "tangentWorld", "getBitangent", "bitangentGeometry", "bitangentLocal", "bitangentView", "bitangentWorld", "TBNViewMatrix", "parallaxDirection", "parallaxUV", "bentNormalView", "directionToColor", "colorToDirection", "unpackNormal", "normalMap", "dHdxy_fwd", "perturbNormalArb", "bumpMap", "_propertyCache", "materialAlphaTest", "materialColor", "materialShininess", "materialEmissive", "materialOpacity", "materialSpecular", "materialSpecularIntensity", "materialSpecularColor", "materialSpecularStrength", "materialReflectivity", "materialRoughness", "materialMetalness", "materialNormal", "materialClearcoat", "materialClearcoatRoughness", "materialClearcoatNormal", "materialRotation", "materialSheen", "materialSheenRoughness", "materialAnisotropy", "materialIridescence", "materialIridescenceIOR", "materialIridescenceThickness", "materialTransmission", "materialThickness", "materialIOR", "materialAttenuationDistance", "materialAttenuationColor", "materialLineScale", "materialLineDashSize", "materialLineGapSize", "materialLineWidth", "materialLineDashOffset", "materialPointSize", "materialDispersion", "materialLightMap", "materialAO", "materialAnisotropyVector", "modelViewProjection", "storageElement", "storage", "storageObject", "vertexIndex", "instanceIndex", "subgroupIndex", "invocationSubgroupIndex", "invocationLocalIndex", "drawIndex", "instancedMesh", "batch", "_frameId", "skinning", "computeSkinning", "Loop", "Continue", "Break", "getMorph", "morphReference", "lightingContext", "_size$5", "viewportTexture", "viewportMipTexture", "_sharedDepthbuffer", "viewportDepthTexture", "viewZToOrthographicDepth", "orthographicDepthToViewZ", "viewZToPerspectiveDepth", "perspectiveDepthToViewZ", "viewZToLogarithmicDepth", "logarithmicDepthToViewZ", "depthBase", "depth", "linearDepth", "viewportLinearDepth", "ClippingNode", "clipping", "clippingAlpha", "hardwareClipping", "ALPHA_HASH_SCALE", "hash2D", "hash3D", "getAlphaHashThreshold", "vertexColor", "blendBurn", "blendDodge", "blendScreen", "blendOverlay", "blendColor", "premultiplyAlpha", "unpremultiplyAlpha", "burn", "dodge", "screen", "overlay", "_defaultValues$d", "_defaultValues$c", "_sharedFramebuffer", "viewportSharedTexture", "_defaultValues$b", "_defaultValues$a", "CubeRenderTarget", "CubeMapNode", "cubeMapNode", "BasicLightMapNode", "BasicLightingModel", "_defaultValues$9", "F_Schlick", "BRDF_Lambert", "G_BlinnPhong_Implicit", "D_BlinnPhong", "BRDF_BlinnPhong", "_defaultValues$8", "_defaultValues$7", "getGeometryRoughness", "getRoughness", "V_GGX_SmithCorrelated", "V_GGX_SmithCorrelated_Anisotropic", "D_GGX", "RECIPROCAL_PI", "D_GGX_Anisotropic", "BRDF_GGX", "DATA", "lut", "DFGLUT", "BRDF_GGX_Multiscatter", "EnvironmentBRDF", "Schlick_to_F0", "D_Charlie", "V_Neubelt", "BRDF_Sheen", "LTC_Uv", "LTC_ClippedSphereFormFactor", "LTC_EdgeVectorFormFactor", "LTC_Evaluate", "LTC_Evaluate_Volume", "bC", "w0", "w1", "w2", "w3", "g0", "g1", "h0", "bicubic", "textureBicubicLevel", "textureBicubic", "getVolumeTransmissionRay", "applyIorToRoughness", "viewportBackSideTexture", "viewportFrontSideTexture", "getTransmissionSample", "volumeAttenuation", "getIBLVolumeRefraction", "XYZ_TO_REC709", "Fresnel0ToIor", "IorToFresnel0", "evalSensitivity", "evalIridescence", "IBLSheenBRDF", "clearcoatF0", "clearcoatF90", "cubeUV_r0", "cubeUV_m0", "cubeUV_r1", "cubeUV_m1", "cubeUV_r4", "cubeUV_m4", "cubeUV_r5", "cubeUV_m5", "cubeUV_r6", "cubeUV_m6", "cubeUV_minMipLevel", "cubeUV_minTileSize", "getFace", "getUV", "roughnessToMip", "getDirection", "textureCubeUV", "bilinearCubeUV", "getSample", "radicalInverse_VdC", "hammersley", "importanceSampleGGX_VNDF", "_flatCamera", "_cubeCamera", "_clearColor$2", "_oldTarget", "_oldActiveCubeFace", "_oldActiveMipmapLevel", "_origin", "_direction", "pmremTexture", "_envNodeCache", "createRadianceContext", "createIrradianceContext", "_defaultValues$6", "_defaultValues$5", "SSSLightingModel", "getGradientIrradiance", "ToonLightingModel", "_defaultValues$4", "matcapUV", "_defaultValues$3", "rotate", "_defaultValues$2", "_defaultValues$1", "_size$4", "scale", "ShadowMaskModel", "_defaultValues", "scatteringDensity", "linearDepthRay", "outgoingRayLight", "VolumetricLightingModel", "Animation", "ChainMap", "_id$a", "RenderObject", "_chainKeys$5", "RenderObjects", "DataMap", "AttributeType", "BlendColorFactor", "OneMinusBlendColorFactor", "Attributes", "Geometries", "Info", "Pipeline", "RenderPipeline", "ComputePipeline", "_id$9", "ProgrammableStage", "Pipelines", "Bindings", "RenderList", "_chainKeys$4", "RenderLists", "_id$8", "RenderContext", "_chainKeys$3", "_defaultScene", "_defaultCamera", "RenderContexts", "_size$3", "Textures", "Color4", "parameter", "stack", "struct", "outputStruct", "mrt", "bitcast", "floatBitsToInt", "floatBitsToUint", "intBitsToFloat", "uintBitsToFloat", "registeredBitcountFunctions", "BitcountNode", "countTrailingZeros", "countLeadingZeros", "countOneBits", "hash", "parabola", "gain", "pcurve", "sinc", "PackFloatNode", "packSnorm2x16", "packUnorm2x16", "packHalf2x16", "UnpackFloatNode", "unpackSnorm2x16", "unpackUnorm2x16", "unpackHalf2x16", "tri", "tri3", "triNoise3D", "overloadingBaseFn", "overloadingFn", "deltaTime", "frameId", "oscSine", "oscSquare", "oscTriangle", "oscSawtooth", "rotateUV", "spherizeUV", "billboarding", "viewportSafeUV", "spritesheetUV", "triplanarTextures", "triplanarTexture", "_reflectorPlane", "_normal", "_reflectorWorldPosition", "_cameraWorldPosition", "_rotationMatrix", "_lookAtPosition", "clipPlane", "_view", "_target", "_q", "_size$2", "_defaultRT", "_defaultUV", "_inReflector", "ReflectorBaseNode", "reflector", "_camera", "QuadGeometry", "_geometry", "_size$1", "rtt", "convertToTexture", "getViewPosition", "getScreenPosition", "getNormalFromDepth", "interleavedGradientNoise", "vogelDiskSample", "SampleNode", "sample", "createEvent", "OnObjectUpdate", "OnMaterialUpdate", "OnBeforeObjectUpdate", "OnBeforeMaterialUpdate", "attributeArray", "instancedArray", "pointUV", "_e1", "_m1", "backgroundBlurriness", "backgroundIntensity", "backgroundRotation", "storageTexture", "textureStore", "normal", "texture3D", "texture3DLoad", "texture3DLevel", "userData", "VelocityNode", "velocity", "grayscale", "saturation", "vibrance", "hue", "luminance", "cdl", "posterize", "_size", "PassTextureNode", "PassMultipleTextureNode", "pass", "passTexture", "depthPass", "toonOutlinePass", "linearToneMapping", "reinhardToneMapping", "cineonToneMapping", "RRTAndODTFit", "acesFilmicToneMapping", "LINEAR_REC2020_TO_LINEAR_SRGB", "LINEAR_SRGB_TO_LINEAR_REC2020", "agxDefaultContrastApprox", "agxToneMapping", "neutralToneMapping", "code", "js", "wgsl", "glsl", "nativeFn", "glslFn", "wgslFn", "scriptableValue", "Resources", "Parameters", "ScriptableNodeResources", "scriptable", "range", "ComputeBuiltinNode", "computeBuiltin", "numWorkgroups", "workgroupId", "globalId", "localId", "subgroupSize", "BarrierNode", "barrier", "workgroupBarrier", "storageBarrier", "textureBarrier", "WorkgroupInfoElementNode", "WorkgroupInfoNode", "workgroupArray", "AtomicFunctionNode", "atomicNode", "atomicFunc", "atomicLoad", "atomicStore", "atomicAdd", "atomicSub", "atomicMax", "atomicMin", "atomicAnd", "atomicOr", "atomicXor", "SubgroupFunctionNode", "subgroupElect", "subgroupBallot", "subgroupAdd", "subgroupInclusiveAdd", "subgroupExclusiveAdd", "subgroupMul", "subgroupInclusiveMul", "subgroupExclusiveMul", "subgroupAnd", "subgroupOr", "subgroupXor", "subgroupMin", "subgroupMax", "subgroupAll", "subgroupAny", "subgroupBroadcastFirst", "quadSwapX", "quadSwapY", "quadSwapDiagonal", "subgroupBroadcast", "subgroupShuffle", "subgroupShuffleXor", "subgroupShuffleUp", "subgroupShuffleDown", "quadBroadcast", "lightTargetDirection", "sortLights", "getLightNodeById", "_lightsNodeRef", "_hashData", "lights", "shadowPositionWorld", "shadowMaterialLib", "BasicShadowFilter", "PCFShadowFilter", "PCFSoftShadowFilter", "VSMShadowFilter", "linearDistance", "linearShadowDistance", "getShadowMaterial", "disposeShadowMaterial", "_shadowRenderObjectLibrary", "_shadowRenderObjectKeys", "getShadowRenderObjectFunction", "VSMPassVertical", "VSMPassHorizontal", "_shadowFilterLib", "_rendererState", "_quadMesh", "shadow", "_clearColor$1", "_projScreenMatrix$1", "_lightPositionWorld", "_lookTarget", "_cubeDirectionsWebGPU", "_cubeUpsWebGPU", "_cubeDirectionsWebGL", "_cubeUpsWebGL", "BasicPointShadowFilter", "PointShadowFilter", "pointShadowFilter", "PointShadowNode", "pointShadow", "getDistanceAttenuation", "directPointLight", "checker", "shapeCircle", "mx_select", "mx_negate_if", "mx_floor", "mx_floorfrac", "mx_bilerp_0", "mx_bilerp_1", "mx_bilerp", "mx_trilerp_0", "mx_trilerp_1", "mx_trilerp", "mx_gradient_float_0", "mx_gradient_float_1", "mx_gradient_float", "mx_gradient_vec3_0", "mx_gradient_vec3_1", "mx_gradient_vec3", "mx_gradient_scale2d_0", "mx_gradient_scale3d_0", "mx_gradient_scale2d_1", "mx_gradient_scale2d", "mx_gradient_scale3d_1", "mx_gradient_scale3d", "mx_rotl32", "mx_bjmix", "mx_bjfinal", "mx_bits_to_01", "mx_fade", "mx_hash_int_0", "mx_hash_int_1", "mx_hash_int_2", "mx_hash_int_3", "mx_hash_int_4", "mx_hash_int", "mx_hash_vec3_0", "mx_hash_vec3_1", "mx_hash_vec3", "mx_perlin_noise_float_0", "mx_perlin_noise_float_1", "mx_perlin_noise_float", "mx_perlin_noise_vec3_0", "mx_perlin_noise_vec3_1", "mx_perlin_noise_vec3", "mx_cell_noise_float_0", "mx_cell_noise_float_1", "mx_cell_noise_float_2", "mx_cell_noise_float_3", "mx_cell_noise_float$1", "mx_cell_noise_vec3_0", "mx_cell_noise_vec3_1", "mx_cell_noise_vec3_2", "mx_cell_noise_vec3_3", "mx_cell_noise_vec3", "mx_fractal_noise_float$1", "mx_fractal_noise_vec3$1", "mx_fractal_noise_vec2$1", "mx_fractal_noise_vec4$1", "mx_worley_distance_0", "mx_worley_distance_1", "mx_worley_distance", "mx_worley_noise_float_0", "mx_worley_noise_vec2_0", "mx_worley_noise_vec3_0", "mx_worley_noise_float_1", "mx_worley_noise_float$1", "mx_worley_noise_vec2_1", "mx_worley_noise_vec2$1", "mx_worley_noise_vec3_1", "mx_worley_noise_vec3$1", "mx_unifiednoise2d$1", "mx_unifiednoise3d$1", "mx_hsvtorgb", "mx_rgbtohsv", "mx_srgb_texture_to_lin_rec709", "mx_aastep", "_ramp", "mx_ramplr", "mx_ramptb", "mx_ramp4", "_split", "mx_splitlr", "mx_splittb", "mx_transform_uv", "mx_safepower", "mx_contrast", "mx_noise_float", "mx_noise_vec3", "mx_noise_vec4", "mx_unifiednoise2d", "mx_unifiednoise3d", "mx_worley_noise_float", "mx_worley_noise_vec2", "mx_worley_noise_vec3", "mx_cell_noise_float", "mx_fractal_noise_float", "mx_fractal_noise_vec2", "mx_fractal_noise_vec3", "mx_fractal_noise_vec4", "mx_add", "mx_subtract", "mx_multiply", "mx_divide", "mx_modulo", "mx_power", "mx_atan2", "mx_timer", "mx_frame", "mx_invert", "mx_ifgreater", "mx_ifgreatereq", "mx_ifequal", "mx_separate", "mx_place2d", "mx_rotate2d", "mx_rotate3d", "mx_heighttonormal", "getParallaxCorrectNormal", "getShIrradianceAt", "_clearColor", "Background", "_id$7", "BindGroup", "NodeBuilderState", "_id$6", "StructType", "NumberUniform", "Vector2Uniform", "Vector3Uniform", "Vector4Uniform", "ColorUniform", "Matrix2Uniform", "Matrix3Uniform", "Matrix4Uniform", "NumberNodeUniform", "Vector2NodeUniform", "Vector3NodeUniform", "Vector4NodeUniform", "ColorNodeUniform", "Matrix2NodeUniform", "Matrix3NodeUniform", "Matrix4NodeUniform", "_id$5", "sharedNodeData", "typeFromArray", "toFloat", "_matrix41", "_matrix42", "_ltcLib", "sdBox", "NodeParser", "NodeFunction", "declarationRegexp$1", "propertiesRegexp$1", "pragmaMain", "parse$1", "GLSLNodeFunction", "_outputNodeMap", "_chainKeys$2", "_cacheKeyValues", "Nodes", "_plane", "ClippingContext", "RenderBundle", "_chainKeys$1", "RenderBundles", "NodeLibrary", "_defaultLights", "_chainKeys", "XRManager", "_scene", "_drawingBufferSize", "_screen", "_frustum", "_frustumArray", "_projScreenMatrix", "_vector4", "Renderer", "Binding", "Buffer", "UniformBuffer", "_id$4", "NodeUniformBuffer", "_id$3", "NodeUniformsGroup", "Sampler", "_id$2", "SampledTexture", "NodeSampledTexture", "NodeSampledCubeTexture", "NodeSampledTexture3D", "glslPolyfills", "glslMethods", "precisionLib", "supports$1", "interpolationTypeMap", "interpolationModeMap", "defaultPrecisions", "GLSLNodeBuilder", "_vector2", "_color4", "Backend", "_id$1", "DualAttributeData", "WebGLAttributeUtils", "equationToGL", "factorToGL", "WebGLState", "WebGLUtils", "initialized", "wrappingToGL", "filterToGL", "compareToGL", "WebGLTextureUtils", "WebGLExtensions", "WebGLCapabilities", "GLFeatureName", "WebGLBufferRenderer", "TimestampQueryPool", "WebGLTimestampQueryPool", "WebGLBackend", "GPUPrimitiveTopology", "GPUShaderStage", "GPUCompareFunction", "GPUStoreOp", "GPULoadOp", "GPUFrontFace", "GPUCullMode", "GPUIndexFormat", "GPUAddressMode", "GPUFilterMode", "GPUBlendFactor", "GPUBlendOperation", "GPUColorWriteFlags", "GPUStencilOperation", "GPUBufferBindingType", "GPUStorageTextureAccess", "GPUSamplerBindingType", "GPUTextureSampleType", "GPUTextureDimension", "GPUTextureViewDimension", "GPUTextureAspect", "GPUInputStepMode", "GPUFeatureMap", "NodeSampler", "StorageBuffer", "_id", "NodeStorageBuffer", "WebGPUTexturePassUtils", "_compareToWebGPU", "_flipMap", "WebGPUTextureUtils", "declarationRegexp", "propertiesRegexp", "wgslTypeLib$1", "parse", "WGSLNodeFunction", "WGSLNodeParser", "accessNames", "wrapNames", "gpuShaderStageLib", "supports", "wgslFnOpLib", "wgslTypeLib", "wgslCodeCache", "wgslPolyfill", "wgslMethods", "diagnostics", "WGSLNodeBuilder", "WebGPUUtils", "typedArraysToVertexFormatPrefix", "typedAttributeToVertexFormatPrefix", "typeArraysToVertexFormatPrefixForItemSize1", "WebGPUAttributeUtils", "BindGroupLayout", "WebGPUBindingUtils", "WebGPUPipelineUtils", "WebGPUTimestampQueryPool", "WebGPUBackend", "StandardNodeLibrary", "init_three_webgpu", "__esmMin", "init_three_core", "renderObject", "attributes", "attributesData", "lightsData", "renderObjectData", "materialData", "mtlValue", "storedGeometryData", "storedAttributes", "storedAttributeNames", "currentAttributeNames", "storedAttributeData", "storedIndexVersion", "currentIndexVersion", "morphChanged", "materialLights", "lightsNode", "renderId", "cached", "nodeFrame", "isStatic", "isBundle", "str", "updateType", "childNode", "ignores", "children", "child", "subProperty", "force", "nodeProperties", "usageCount", "nodeData", "outputNode", "refNode", "currentBeforeNodes", "beforeNode", "parentBuildStage", "previousBuildStage", "result", "buildStage", "properties", "childProperties", "json", "nodeChildren", "inputNodes", "nodes", "inputArray", "uuid", "inputObject", "meta", "isRoot", "extractFromCache", "images", "indexNode", "indexType", "nodeSnippet", "indexSnippet", "convertTo", "requestType", "overloadingType", "snippet", "nodeVar", "propertyName", "cur", "maxLength", "primitiveType", "snippetValues", "input", "inputType", "inputTypeLength", "inputSnippet", "targetType", "components", "vectorLength", "nodeTypeLength", "sourceNode", "targetNode", "sourceType", "componentType", "targetSnippet", "sourceSnippet", "component", "sourceCache", "sourceProperty", "componentIndex", "precision", "structNode", "props", "d", "altType", "objects", "len", "NodeClass", "scope", "factor", "settings", "assignNode", "fn", "minParams", "maxParams", "verifyParamsLimit", "tslName", "shaderNode", "rawInputs", "subBuildProperty", "previousSubBuildFn", "previousFnCall", "functionNodesCacheMap", "functionNode", "inputs", "secureNodeBuilder", "hasParameters", "subBuildOutput", "subBuildInitialized", "el", "cacheMap", "param", "paramType", "v", "fullLayout", "fnCall", "subBuilds", "types", "channels", "shared", "order", "group", "sharedNode", "sharedNodeType", "nodeUniform", "uniformName", "targetLength", "scopeData", "needsSplitAssign", "sourceVar", "splitNode", "targetRoot", "parameters", "generateInput", "pointer", "func", "_OperatorNode", "op", "aNode", "bNode", "finalOp", "typeA", "typeB", "typeLength", "fnOpSnippet", "isGLSL", "temp", "_MathNode", "method", "cNode", "aType", "bType", "cType", "aLen", "bLen", "cLen", "tA", "tB", "mulNode", "coordinateSystem", "low", "high", "dt", "sn", "t", "e1", "e2", "edge", "condNode", "ifNode", "elseNode", "ifType", "elseType", "currentNodeBlock", "isUniformFlow", "needsOutput", "nodeProperty", "ifSnippet", "elseSnippet", "mathSnippet", "previousContext", "nodeOrValue", "aoValue", "readOnly", "addBefore", "baseStack", "isWebGPUBackend", "isDeterministic", "shouldTreatAsReadOnly", "vectorType", "declarationPrefix", "sampling", "interpolationType", "interpolationSampling", "propertyKey", "colorNode", "targetColorSpace", "sourceColorSpace", "referenceNode", "arrayType", "elementType", "uniformType", "exposureNode", "toneMappingFn", "exposure", "bufferType", "bufferStride", "bufferOffset", "bufferData", "nodeAttribute", "bufferNode", "computeNode", "workgroupSize", "shaderStage", "outputComputeNode", "previousCache", "callNode", "inLowNode", "inHighNode", "outLowNode", "outHighNode", "doClamp", "conditional", "outputColorSpace", "title", "border", "attributeName", "attributeType", "textureNode", "levelNode", "textureProperty", "level", "uvNode", "biasNode", "offsetNode", "uvSnippet", "levelSnippet", "biasSnippet", "depthSnippet", "compareSnippet", "gradSnippet", "offsetSnippet", "compareNode", "depthNode", "gradNode", "amountNode", "map", "gradNodeX", "gradNodeY", "matrixUniform", "flipYUniform", "newNode", "bufferCount", "start", "uniformArrayNode", "paddedType", "vector", "paddedElementLength", "_ScreenNode", "coord", "size", "matrices", "subCamera", "positions", "subCameras", "viewports", "_Object3DNode", "object3d", "uniformNode", "isHighPrecisionModelViewMatrix", "direction", "side", "subBuildFn", "m", "transformedNormal", "modelNormalViewMatrix", "rotation", "cubeUV", "crossNormalTangent", "varyingName", "bitangent", "bentNormal", "xy", "scaleNode", "normalMapType", "unpackNormalMode", "bumpScale", "sampleTexture", "texNode", "Hll", "surf_pos", "surf_norm", "dHdxy", "vSigmaX", "vSigmaY", "vN", "R1", "R2", "fDet", "vGrad", "_MaterialNode", "opacityNode", "specularIntensityNode", "specularColorNode", "roughnessNode", "metalnessNode", "emissiveIntensityNode", "emissiveNode", "clearcoatNode", "clearcoatRoughnessNode", "sheenNode", "sheenRoughnessNode", "anisotropyPolar", "iridescenceThicknessMaximum", "iridescenceThicknessMinimum", "transmissionNode", "thicknessNode", "outputType", "storageBufferNode", "structTypeNode", "isAssignContext", "_IndexNode", "instanceMatrix", "instanceColor", "isStorageMatrix", "isStorageColor", "instanceMatrixNode", "instanceColorNode", "interleaved", "bufferFn", "instanceBuffers", "instancePosition", "instanceNormal", "batchMesh", "indirectId", "id", "matricesTexture", "batchingMatrix", "colorsTexture", "bm", "batchingNormal", "skinnedMesh", "boneMatrices", "skinIndexNode", "skinWeightNode", "bindMatrixNode", "bindMatrixInverseNode", "boneMatX", "boneMatY", "boneMatZ", "boneMatW", "skinVertex", "skinned", "skinMatrix", "skinPosition", "skinNormal", "skeleton", "toPosition", "baseParam", "fnUpdateCall", "shaderNodeData", "stackNode", "isWhile", "end", "condition", "update", "loopSnippet", "internalParam", "startSnippet", "endSnippet", "updateSnippet", "deltaOperator", "declarationSnippet", "conditionalSnippet", "stackSnippet", "bufferMap", "influence", "texelIndex", "mesh", "morphBaseInfluence", "lightingModel", "backdropNode", "backdropAlphaNode", "directDiffuse", "directSpecular", "indirectDiffuse", "indirectSpecular", "reflectedLight", "framebufferTexture", "defaultFramebuffer", "cacheTextures", "currentGenerateMipmaps", "viewportTextureNode", "_ViewportDepthNode", "valueNode", "numerator", "denominator", "exponent", "_ClippingNode", "clippingContext", "intersectionPlanes", "unionPlanes", "distanceToPlane", "distanceGradient", "clipOpacity", "numUnionPlanes", "clippingPlanes", "plane", "numIntersectionPlanes", "intersectionClipOpacity", "clipped", "hw_clip_distances", "maxDeriv", "pixScale", "pixScales", "alpha", "lerpFactor", "cases", "threshold", "geometryAttribute", "base", "blend", "outAlpha", "_value", "mvp", "vertexNode", "resultNode", "clippingNode", "outgoingLightNode", "basicOutput", "isCustomOutput", "materialMRT", "fragmentNode", "candidateCount", "displacementMap", "displacementScale", "displacementBias", "alphaTestNode", "materialLightsNode", "envNode", "lightMapNode", "lightsN", "fogNode", "dashScaleNode", "dashSizeNode", "gapSizeNode", "vLineDistance", "useAlphaToCoverage", "useColor", "useDash", "useWorldUnits", "trimSegment", "instanceStart", "instanceEnd", "instanceDistanceStart", "instanceDistanceEnd", "lineDistance", "aspect", "perspective", "clipStart", "clipEnd", "ndcStart", "ndcEnd", "dir", "clip", "worldDir", "tmpFwd", "worldUp", "worldFwd", "worldPos", "hw", "clipPose", "closestLineToLine", "p1", "p2", "p3", "p4", "p13", "p43", "p21", "d1343", "d4321", "d1321", "d4343", "denom", "mua", "mub", "vUv", "worldStart", "worldEnd", "rayEnd", "lineDir", "norm", "dnorm", "len2", "dlen", "lineColorNode", "instanceColorStart", "instanceColorEnd", "u", "options", "texture$1", "currentMinFilter", "currentMRT", "defaultTexture", "cubeMap", "ambientOcclusion", "irradianceLightMap", "outgoingLight", "f0", "f90", "dotVH", "fresnel", "dotNH", "lightDirection", "halfDir", "F", "G", "D", "specular", "lightColor", "irradiance", "shininessNode", "specularNode", "dxy", "geometryRoughness", "roughnessFactor", "dotNL", "dotNV", "a2", "gv", "gl", "alphaB", "dotTV", "dotBV", "dotTL", "dotBL", "dotTH", "dotBH", "v2", "f", "normalView$1", "USE_IRIDESCENCE", "USE_ANISOTROPY", "V", "_roughness", "singleScatter", "dfgV", "dfgL", "FssEss_V", "FssEss_L", "Ess_V", "Ess_L", "Ems_V", "Ems_L", "Favg", "Fms", "compensationFactor", "multiScatter", "fab", "x2", "x5", "invAlpha", "sin2h", "LUT_BIAS", "v1", "theta_sintheta", "P", "mInv", "p0", "lightNormal", "T1", "T2", "mat", "coords0", "coords1", "coords2", "coords3", "vectorFormFactor", "uvScaled", "iuv", "fuv", "g0x", "g1x", "h0x", "h1x", "h0y", "h1y", "lodNode", "fLodSize", "cLodSize", "fLodSizeInv", "cLodSizeInv", "fSample", "cSample", "strength", "modelMatrix", "refractionVector", "fragCoord", "transmissionSample", "transmissionDistance", "attenuationCoefficient", "viewMatrix", "projMatrix", "transmittedLight", "transmittance", "halfSpread", "iors", "transmissionRay", "refractedRayExit", "ndcPos", "refractionCoords", "attenuatedColor", "transmittanceFactor", "fresnel0", "sqrtF0", "transmittedIor", "incidentIor", "OPD", "shift", "phase", "pos", "VAR", "xyz", "outsideIOR", "eta2", "cosTheta1", "thinFilmThickness", "baseF0", "cosTheta2Sq", "cosTheta2", "R0", "R12", "T121", "phi12", "phi21", "baseIOR", "R23", "phi23", "phi", "R123", "r123", "Rs", "I", "Cm", "Sm", "viewDir", "r2", "rInv", "dotNVi", "iridescenceFresnelDielectric", "iridescenceFresnelMetallic", "iridescenceF0", "Fr", "FssEss", "Ems", "sheenAlbedoV", "sheenAlbedoL", "sheenEnergyComp", "ccIrradiance", "halfWidth", "halfHeight", "ltc_1", "ltc_2", "t1", "t2", "diffuse", "sheenAlbedo", "radiance", "iblIrradiance", "dotNVcc", "clearcoatEnv", "singleScatteringDielectric", "multiScatteringDielectric", "singleScatteringMetallic", "multiScatteringMetallic", "singleScattering", "multiScattering", "totalScatteringDielectric", "cosineWeightedIrradiance", "aoNV", "aoExp", "Fcc", "clearcoatLight", "sheenLight", "absDirection", "mip", "uv_immutable", "sampleDir_immutable", "roughness_immutable", "sampleDir", "mipF", "color0", "color1", "direction_immutable", "mipInt_immutable", "filterInt", "faceSize", "outputDirection", "theta", "axis", "cosTheta", "sampleDirection", "gl_FragColor", "bits_immutable", "bits", "Xi", "V_immutable", "Vh", "lensq", "r", "s", "Nh", "N_immutable", "prefilteredColor", "totalWeight", "up", "tangent", "H_tangent", "H", "L", "NdotL", "sampleColor", "equirectangular", "cubemap", "cubeSize", "outputTarget", "_lodMax", "cubeCamera", "upSign", "forwardSign", "originalAutoClear", "backgroundBox", "backgroundMaterial", "useSolidColor", "background", "col", "isCubeTexture", "autoClear", "lodIn", "lodOut", "pingPongRenderTarget", "ggxMaterial", "ggxMesh", "ggxUniforms", "targetRoughness", "sourceRoughness", "incrementalRoughness", "blurStrength", "adjustedRoughness", "outputSize", "targetIn", "targetOut", "sigmaRadians", "blurMaterial", "STANDARD_DEVIATIONS", "blurMesh", "blurUniforms", "pixels", "radiansPerPixel", "sigmaPixels", "sum", "weight", "cubeUVSize", "pmrem", "pmremVersion", "cacheEnvNode", "radianceNormalView", "isolateRadiance", "isolateIrradiance", "clearcoatRadiance", "clearcoatRadianceContext", "isolateClearcoatRadiance", "normalViewNode", "reflectVec", "normalWorldNode", "iorNode", "iridescenceNode", "iridescenceIORNode", "iridescenceThicknessNode", "anisotropyV", "attenuationDistanceNode", "attenuationColorNode", "dispersionNode", "sss", "thicknessColorNode", "thicknessDistortionNode", "thicknessAmbientNode", "thicknessAttenuationNode", "thicknessPowerNode", "thicknessScaleNode", "scatteringHalf", "scatteringDot", "scatteringIllu", "gradientMap", "fw", "matcapColor", "positionNode", "rotationNode", "cosAngle", "sinAngle", "rotationXMatrix", "rotationYMatrix", "rotationZMatrix", "sizeAttenuation", "mvPosition", "alignedPosition", "center", "rotatedPosition", "sizeNode", "pointSize", "lightNode", "startPos", "endPos", "viewVector", "steps", "stepSize", "rayDir", "distTravelled", "positionRay", "positionViewRay", "scatteringNode", "falloff", "sceneDepthNode", "directLight", "info", "xrFrame", "weakMap", "geometries", "bindingGroup", "nodeAttributes", "vertexBuffers", "attributesId", "drawRange", "drawParams", "hasIndex", "instanceCount", "rangeFactor", "firstVertex", "lastVertex", "itemCount", "cacheKey", "targets", "valueKey", "pipelines", "bindings", "passId", "chainMap", "attributeData", "geometryData", "onDispose", "geometryAttributes", "wireframeAttribute", "indirect", "callId", "wireframes", "vertexProgram", "fragmentProgram", "computeProgram", "stage", "transforms", "previousPipeline", "nodeBuilderState", "stageCompute", "pipeline", "promises", "stageVertex", "stageFragment", "program", "bindGroup", "groupData", "binding", "needsBindingsUpdate", "cacheBindings", "cacheIndex", "version", "updated", "texturesTextureData", "textureData", "samplerKey", "lighting", "groupOrder", "z", "renderItem", "customOpaqueSort", "customTransparentSort", "il", "lists", "list", "attachmentState", "renderState", "renderTargetData", "sampleCount", "depthTextureMips", "mipWidth", "mipHeight", "depthTexture", "useDepthTexture", "textureNeedsUpdate", "isRenderTarget", "skipAutoGeneration", "mipLevelCount", "isDefaultTexture", "g", "memberType", "boolNode", "methodNode", "caseNodes", "caseNode", "previousStack", "buildNode", "stages", "parents", "newNodes", "membersLayout", "BYTES_PER_ELEMENT", "maxAlignment", "member", "alignment", "overhang", "structType", "structLayout", "names", "structPrefix", "outputNodes", "mrtNode", "outputs", "conversionType", "valueType", "valueLength", "_BitcountNode", "outputConvertNode", "numTrailingZeros", "numBits", "baseFn", "vec", "baseMethod", "newMethod", "word", "k", "encoding", "vectorNode", "uintNode", "p", "speed", "rz", "bp", "dg", "functionNodes", "parametersNodes", "candidateFn", "bestCandidateFn", "bestScore", "currentScore", "delta", "delta2", "deltaOffset", "horizontal", "vertical", "worldMatrix", "countNode", "frameNode", "frameNum", "column", "row", "uvFrameOffset", "textureXNode", "textureYNode", "textureZNode", "normalNode", "bf", "tx", "ty", "tz", "textureX", "textureY", "textureZ", "cx", "cy", "cz", "_ReflectorNode", "resolutionScale", "generateMipmaps", "bounces", "resolution", "virtualCamera", "isFacingAway", "needsClear", "projectionMatrix", "clipBias", "currentRenderTarget", "currentAutoClear", "previousName", "flipY", "effectiveWidth", "effectiveHeight", "pixelRatio", "screenPosition", "projectionMatrixInverse", "clipSpacePosition", "viewSpacePosition", "viewPosition", "sampleClipPos", "sampleUv", "c0", "l2", "l1", "r1", "b2", "b1", "dl", "dr", "db", "ce", "dpdx", "dpdy", "sampleIndex", "samplesCount", "goldenAngle", "_EventNode", "eventType", "typeClass", "typedArray", "_SceneNode", "storeNode", "storeSnippet", "ret", "previousModelMatrix", "cameraData", "previousModelViewMatrix", "clipPositionCurrent", "clipPositionPrevious", "ndcPositionCurrent", "ndcPositionPrevious", "adjustment", "average", "mx", "amt", "luminanceCoefficients", "slope", "power", "luma", "pv", "stepsNode", "passNode", "textureName", "previousTexture", "_PassNode", "layers", "prevTexture", "viewZNode", "linearDepthNode", "outputRenderTarget", "currentTransparent", "currentOpaque", "currentMask", "currentContextNode", "currentOverrideMaterial", "currentSceneName", "alphaNode", "currentRenderObjectFunction", "outlineMaterial", "outlineNormal", "ratio", "pos2", "originalMaterial", "ACESInputMat", "ACESOutputMat", "x_immutable", "x4", "colortone", "AgXInsetMatrix", "AgXOutsetMatrix", "AgxMinEv", "AgxMaxEv", "StartCompression", "Desaturation", "peak", "newPeak", "includes", "language", "include", "nodeCode", "src", "nodeFunction", "scriptableNode", "codeNode", "refresh", "setOutput", "THREE", "parametersProps", "declarations", "returns", "minNode", "maxNode", "minLength", "minValue", "maxValue", "minElementValue", "maxElementValue", "builtinName", "workgroupInfoNode", "pointerNode", "methodSnippet", "_SubgroupFunctionNode", "paramsString", "lightNodes", "hashMap", "hashColorNode", "previousLightNodes", "nodeLibrary", "lightNodeClass", "lightData", "currentLightsNode", "totalDiffuseNode", "totalSpecularNode", "backdrop", "backdropAlpha", "totalDiffuse", "shadowCoord", "depthLayer", "basic", "depthCompare", "compare", "mapSize", "radius", "radiusScaled", "dx", "dy", "distribution", "mean", "variance", "hardShadow", "p_max", "dist", "nearDistance", "farDistance", "referencePosition", "shadowType", "useVelocity", "renderObjectFunction", "shadowPass", "squaredMean", "uvStride", "uvStart", "uvOffset", "std_dev", "filterFn", "frustumTest", "shadowPosition", "bias", "coordZ", "w", "cameraNearLocal", "cameraFarLocal", "shadowMap", "shadowMapType", "shadowPassVertical", "shadowPassHorizontal", "shadowIntensity", "normalBias", "shadowDepthTexture", "shadowColor", "shadowOutput", "inspectName", "currentShadowType", "depthVersion", "_shadowCameraLayer", "needsUpdate", "bd3D", "dp", "absDir", "sample0", "sample1", "sample2", "sample3", "sample4", "lightToPosition", "lightToPositionLength", "shadowMatrix", "isWebGPU", "cubeDirections", "cubeUps", "previousAutoClear", "previousClearColor", "previousClearAlpha", "customShadowNode", "directLightData", "directRectAreaLightData", "lightDistance", "cutoffDistance", "decayExponent", "distanceFalloff", "lightVector", "attenuation", "b_immutable", "t_immutable", "f_immutable", "val_immutable", "v0_immutable", "v1_immutable", "v2_immutable", "v3_immutable", "s_immutable", "v3", "v0", "s1", "v4_immutable", "v5_immutable", "v6_immutable", "v7_immutable", "r_immutable", "v7", "v6", "v5", "v4", "hash_immutable", "y_immutable", "h", "z_immutable", "v_immutable", "k_immutable", "a_immutable", "c_immutable", "xx_immutable", "xx", "yy_immutable", "yy", "p_immutable", "X", "Y", "fx", "fy", "Z", "fz", "ix", "iy", "iz", "iw", "octaves_immutable", "lacunarity_immutable", "diminish_immutable", "diminish", "lacunarity", "octaves", "amplitude", "xoff_immutable", "yoff_immutable", "jitter_immutable", "metric_immutable", "metric", "jitter", "yoff", "xoff", "tmp", "off", "cellpos", "diff", "zoff_immutable", "zoff", "localpos", "sqdist", "noiseType_immutable", "texcoord_immutable", "freq_immutable", "offset_immutable", "outmin_immutable", "outmax_immutable", "clampoutput_immutable", "noiseType", "texcoord", "freq", "outmin", "outmax", "clampoutput", "position_immutable", "hsv", "hi", "q", "mincomp", "maxcomp", "color_immutable", "isAbove", "linSeg", "powSeg", "afwidth", "valuel", "valuer", "valuet", "valueb", "valuetl", "valuetr", "valuebl", "valuebr", "top", "bottom", "uv_scale", "uv_offset", "uv_geo", "in1", "in2", "amount", "pivot", "value1", "value2", "channelOrOut", "rad", "cosR", "sinR", "nAxis", "cosA", "sinA", "oneMinusCosA", "cubePos", "nDir", "rbmax", "rbmin", "rbminmax", "correction", "shCoefficients", "renderList", "forceClear", "sceneData", "backgroundNode", "backgroundMesh", "onBackgroundDispose", "backgroundMeshNode", "isOrtho", "orthoScale", "modifiedPosition", "viewProj", "nodeMaterial", "backgroundCacheKey", "environmentBlendMode", "clearColorValue", "bindingsReference", "vertexShader", "fragmentShader", "computeShader", "updateNodes", "updateBeforeNodes", "updateAfterNodes", "observer", "instanceGroup", "bindingsGroup", "instanceBinding", "parser", "bindGroupsCache", "groupName", "bindingsArray", "sharedGroup", "bindingsGroups", "groups", "updateBeforeType", "updateAfterType", "snippets", "generateConst", "baseType", "prefix", "dataAttribute", "normalized", "vecType", "vecNum", "newComponentType", "lastStack", "subBuildVariable", "idNS", "vars", "subBuildVarying", "nodeVarying", "varyings", "codes", "nodeBlock", "flowCodes", "flowCodeBlock", "needsFlowCode", "nodeBlockHierarchy", "flowCode", "codeBlock", "flowData", "previous", "previousFlow", "previousVars", "previousDeclarations", "flow", "previousTab", "previousShaderStage", "variable", "subBuildLayers", "flowNodes", "fromType", "toType", "fromTypeLength", "toTypeLength", "referenceMap", "nodeRef", "maps", "nodeUpdateBeforeMap", "previousFrameId", "previousRenderId", "nodeUpdateAfterMap", "nodeUpdateMap", "qualifier", "isConst", "ltc", "angleCosine", "coneCosNode", "penumbraCosNode", "projectionUV", "cutoffDistanceNode", "decayExponentNode", "angleCos", "spotAttenuation", "lightAttenuation", "projected", "lightCoord", "iesMap", "angle", "penumbraCos", "boxDist", "angleFactor", "groundColorNode", "lightDirectionNode", "hemiDiffuseWeight", "pragmaMainIndex", "mainCode", "declaration", "inputsCode", "propsMatches", "nameMatch", "blockCode", "headerCode", "declarationCode", "nodeUniformsGroup", "groupNode", "uniformsGroupData", "nodeBuilderCache", "createNodeBuilder", "nodeBuilder", "e", "computeData", "environmentNode", "cacheKeyData", "forceUpdate", "nodeCache", "sceneFog", "environment", "_ClippingContext", "parentContext", "destination", "clippingGroup", "srcClippingPlanes", "dstClippingPlanes", "bundleGroup", "bundles", "bundle", "nodeMaterialClass", "toneMappingNode", "materialType", "materialNodeClass", "materialClassType", "lightClass", "nodeClass", "library", "baseClass", "multiview", "foveation", "space", "translation", "quaternion", "pixelwidth", "pixelheight", "rendercall", "xrlayers", "centralAngle", "aspectratio", "translationObject", "quaternionObject", "wasPresenting", "rendererOutputTarget", "rendererFramebufferTarget", "rendererSize", "rendererQuad", "frameBufferTarget", "quad", "depthFormat", "depthType", "glDepthFormat", "projectionlayerInit", "glProjLayer", "layersArray", "layerInit", "depthNear", "depthFar", "cameras", "domElement", "updateStyle", "scissor", "boolean", "minDepth", "maxDepth", "logarithmicDepthBuffer", "stencil", "antialias", "getFallback", "outputBufferType", "alphaClear", "resolve", "reject", "targetScene", "previousRenderContext", "previousRenderObjectFunction", "previousCompilationPromises", "sceneRef", "compilationPromises", "opaqueObjects", "transparentObjects", "transparentDoublePassObjects", "contextNodeData", "errorMessage", "renderBundle", "renderBundleData", "renderBundleNeedsUpdate", "renderObjects", "currentToneMapping", "currentColorSpace", "useToneMapping", "useColorSpace", "canvasTarget", "useFrameBufferTarget", "xr", "frustum", "currentXR", "queryPool", "computeNodes", "dispatchSize", "computeList", "dispose", "onInitFn", "computeBindings", "computePipeline", "rectangle", "srcTexture", "dstTexture", "srcRegion", "dstPosition", "srcLevel", "dstLevel", "textureIndex", "groupMaterial", "baseRenderList", "doublePassList", "hasMap", "hasColorNode", "hasCastShadowNode", "shadowRGB", "shadowAlpha", "materialOverride", "materialColorNode", "materialDepthNode", "materialPositionNode", "materialSide", "overrideMaterial", "needsRefresh", "visibility", "byteLength", "bytesPerElement", "boundary", "chunkOffset", "chunkPadding", "chunkStart", "clonedSampler", "access", "condSnippet", "originalArray", "numElements", "isInteger", "typeMap", "newSize", "newArray", "pboTexture", "pbo", "storageArrayElementNode", "elementNodeData", "bufferNodeData", "propertySizeName", "channel", "uvIndexSnippet", "bindingSnippets", "uniformGroups", "typePrefix", "bufferCountSnippet", "groupSnippets", "location", "structs", "outputSnippet", "flat", "acc", "curr", "behavior", "ext", "extensions", "extensionName", "planeCount", "attributeNode", "transform", "shaderData", "shadersData", "mainNode", "flowSlotData", "slotName", "stageData", "uniformGPU", "sharedData", "uniformsStage", "uniformsGroup", "abstractRenderContext", "contextData", "uid", "duration", "dualBuffer", "bufferGPU", "bufferGPUDual", "updateRanges", "writeBuffer", "dstBuffer", "scissorParam", "viewportParam", "enabled", "flipSided", "cullFace", "currentLineWidth", "drawBuffersIndexedExt", "blending", "blendEquation", "blendSrc", "blendDst", "blendEquationAlpha", "blendSrcAlpha", "blendDstAlpha", "premultipliedAlpha", "colorMask", "depthTest", "depthMask", "depthFunc", "stencilTest", "stencilMask", "stencilFunc", "stencilRef", "stencilFail", "stencilZFail", "stencilZPass", "frontFaceCW", "hardwareClippingPlanes", "stencilWrite", "polygonOffset", "units", "vao", "indexBuffer", "framebuffer", "currentBoundFramebuffers", "drawBuffers", "webglSlot", "currentTextureSlot", "maxTextures", "webglType", "webglTexture", "currentBoundTextures", "boundTexture", "extension", "sync", "test", "res", "glTextureType", "internalFormatName", "glFormat", "glType", "forceLinearTransfer", "internalFormat", "textureType", "workingPrimaries", "texturePrimaries", "unpackConversion", "hasMipmaps", "minFilter", "defaultTextures", "textureGPU", "levels", "glInternalFormat", "mipmaps", "mipmap", "layerByteLength", "getByteLength", "layerIndex", "layerData", "renderContextData", "dstTextureGPU", "minX", "minY", "minZ", "dstX", "dstY", "dstZ", "levelScale", "currentUnpackRowLen", "currentUnpackImageHeight", "currentUnpackSkipPixels", "currentUnpackSkipRows", "currentUnpackSkipImages", "isSrc3D", "isDst3D", "srcTextureData", "dstTextureData", "srcRenderContextData", "dstRenderContextData", "srcFramebuffer", "dstFramebuffer", "requireDrawFrameBuffer", "srcHeight", "partial", "mask", "attachment", "renderTargetContextData", "fb", "msaaFrameBuffer", "flippedY", "renderbuffer", "useMultisampledRTT", "depthBuffer", "stencilBuffer", "typedArrayType", "bytesPerTexel", "bytesPerComponent", "mode", "primcount", "starts", "counts", "drawCount", "elementCount", "maxQueries", "timestamp", "baseOffset", "query", "resolvePromises", "framesDuration", "frames", "promise", "match", "totalDuration", "timeoutId", "isResolved", "cleanup", "finalizeResolution", "checkQuery", "elapsed", "contextAttributes", "glContext", "onContextLost", "contextLossInfo", "xrFramebuffer", "colorTexture", "timestampQueryPool", "occlusionQueryCount", "currentOcclusionQueries", "currentOcclusionQueryObjects", "occluded", "check", "completed", "clearColor", "setFrameBuffer", "resolveRenderTarget", "clear", "clearDepth", "clearStencil", "computeGroup", "programGPU", "transformBuffers", "vaoKey", "vaoGPU", "transformFeedbackGPU", "dualAttributeData", "indexGPU", "lastObject", "vertexCount", "indexData", "draw", "indexesGPU", "cameraIndexData", "isRenderCameraDepthArray", "prevActiveCubeFace", "vp", "shader", "parallel", "checkStatus", "errorLine", "lines", "lines2", "from", "to", "line", "status", "errors", "errorMatches", "glFragmentShader", "glVertexShader", "programLog", "vertexErrors", "fragmentErrors", "pipelineData", "transformVaryingNames", "transformAttributeNodes", "attributeNodes", "uniformBuffers", "bindGroupData", "isTyped", "isTypedArray", "byteOffsetFactor", "dataOffset", "keysMatching", "currentFrameBuffer", "isCube", "isRenderTarget3D", "isRenderTargetArray", "isXRRenderTarget", "_hasExternalTextures", "msaaFb", "depthRenderbuffer", "multisampledRTTExt", "multiviewExt", "depthInvalidationArray", "cubeFace", "mipLevel", "depthStyle", "depthData", "invalidationArray", "msaaRenderbuffers", "bindingData", "isMRT", "viewY", "mipmapVertexSource", "mipmapFragmentSource", "flipYFragmentSource", "textureGPUDescriptor", "baseArrayLayer", "transferPipeline", "flipYPipeline", "tempTexture", "srcView", "dstView", "commandEncoder", "sourceView", "destinationView", "bindGroupLayout", "passEncoder", "encoder", "passes", "passDescriptor", "samplerData", "samplerDescriptorGPU", "oldSamplerData", "dimension", "primarySamples", "isMSAA", "textureDescriptorGPU", "msaaTextureDescriptorGPU", "colorTextureData", "colorBuffer", "depthTextureGPU", "bytesPerRow", "readBuffer", "defaultCubeTexture", "flipIndex", "originDepth", "passUtils", "blockData", "isArrayTexture", "bytesPerImage", "addressMode", "filterMode", "resolvedType", "functionName", "coordType", "addWrapSnippet", "wrap", "textureDimensionNode", "textureDimensionsParams", "dimensionType", "isMultisampled", "wrapFunction", "textureDimension", "coordSnippet", "valueSnippet", "fnOp", "bufferClass", "directives", "directive", "builtins", "attributesSnippet", "samplingSnippet", "isAttributeStructType", "isStructArray", "bufferSnippets", "structSnippets", "uniformIndexes", "multisampled", "is3D", "componentPrefix", "bufferAccessMode", "bufferSnippet", "isOutputStruct", "structSnippet", "wgslMethod", "workgroupSizeX", "workgroupSizeY", "workgroupSizeZ", "structName", "vertexStart", "slot", "vertexBufferLayout", "arrayStride", "stepMode", "readBufferGPU", "cmdEncoder", "gpuCommands", "ArrayType", "bytesPerUnit", "paddedItemSize", "layoutGPU", "bindingsData", "entries", "bindGroupLayoutKey", "bindLayoutGPU", "bindGroupGPU", "bindingPoint", "entriesGPU", "visibilities", "bufferVisibility", "resourceGPU", "baseMipLevel", "aspectGPU", "dimensionViewGPU", "bindingGPU", "utils", "bindGroupLayouts", "stencilFront", "colorWriteMask", "colorFormat", "vertexModule", "fragmentModule", "primitiveState", "depthStencilFormat", "pipelineDescriptor", "depthStencil", "renderDepth", "renderStencil", "err", "errorScope", "colorFormats", "pipelineGPU", "setBlend", "srcRGB", "dstRGB", "srcAlpha", "dstAlpha", "blendFactor", "stencilCompare", "stencilOperation", "blendOperation", "bufferSize", "currentOffsets", "queryCount", "bytesUsed", "commandBuffer", "times", "startTime", "endTime", "adapterOptions", "adapter", "features", "supportedFeatures", "deviceDescriptor", "deviceLossInfo", "canvasData", "alphaMode", "toneMappingMode", "colorAttachment", "colorAttachmentsConfig", "descriptorBase", "textureViews", "sliceIndex", "viewDescriptor", "layerViewDescriptor", "textureView", "resolveTarget", "depthTextureData", "viewInfo", "clearValue", "occlusionQuerySet", "depthStencilAttachment", "colorAttachments", "bundleEncoder", "bundleSets", "currentPass", "layerDescriptor", "depthAttachment", "renderPass", "queryResolveBuffer", "currentOcclusionQueryBuffer", "results", "renderTargetContext", "supportsDepth", "supportsStencil", "clearConfig", "groupGPU", "computeNodeData", "passEncoderGPU", "dispatchBuffer", "dispatchCount", "maxComputeWorkgroupsPerDimension", "setPipelineAndBindings", "currentSets", "currentBindingGroups", "indexFormat", "vertexBuffer", "drawInstances", "firstInstance", "indexCount", "firstIndex", "indirectOffset", "indirectOffsets", "bindGroupIndex", "sets", "primitiveTopology", "bundleGPU", "srcX", "srcY", "srcZ", "srcWidth", "srcDepth", "sourceGPU", "destinationGPU", "intensity", "penumbra", "decay", "recursive", "BackendClass", "manager", "url", "onLoad", "onProgress", "onError", "loader", "text", "nodeJSON", "materialClass", "materials", "BRDF_GGX", "BRDF_Lambert", "BasicPointShadowFilter", "BasicShadowFilter", "Break", "Const", "Continue", "DFGLUT", "D_GGX", "Discard", "EPSILON", "F_Schlick", "Fn", "INFINITY", "If", "Loop", "NodeAccess", "NodeShaderStage", "NodeType", "NodeUpdateType", "PCFShadowFilter", "PCFSoftShadowFilter", "PI", "PI2", "TWO_PI", "HALF_PI", "PointShadowFilter", "Return", "Schlick_to_F0", "ScriptableNodeResources", "ShaderNode", "Stack", "Switch", "TBNViewMatrix", "VSMShadowFilter", "V_GGX_SmithCorrelated", "Var", "VarIntent", "abs", "acesFilmicToneMapping", "acos", "add", "addMethodChaining", "addNodeElement", "agxToneMapping", "all", "alphaT", "and", "anisotropy", "anisotropyB", "anisotropyT", "any", "append", "array", "arrayBuffer", "asin", "assign", "atan", "atan2", "atomicAdd", "atomicAnd", "atomicFunc", "atomicLoad", "atomicMax", "atomicMin", "atomicOr", "atomicStore", "atomicSub", "atomicXor", "attenuationColor", "attenuationDistance", "attribute", "attributeArray", "backgroundBlurriness", "backgroundIntensity", "backgroundRotation", "batch", "bentNormalView", "billboarding", "bitAnd", "bitNot", "bitOr", "bitXor", "bitangentGeometry", "bitangentLocal", "bitangentView", "bitangentWorld", "bitcast", "blendBurn", "blendColor", "blendDodge", "blendOverlay", "blendScreen", "blur", "bool", "buffer", "bufferAttribute", "bumpMap", "burn", "builtin", "builtinAOContext", "builtinShadowContext", "bvec2", "bvec3", "bvec4", "bypass", "cache", "call", "cameraFar", "cameraIndex", "cameraNear", "cameraNormalMatrix", "cameraPosition", "cameraProjectionMatrix", "cameraProjectionMatrixInverse", "cameraViewMatrix", "cameraViewport", "cameraWorldMatrix", "cbrt", "cdl", "ceil", "checker", "cineonToneMapping", "clamp", "clearcoat", "clearcoatNormalView", "clearcoatRoughness", "code", "color", "colorSpaceToWorking", "colorToDirection", "compute", "computeKernel", "computeSkinning", "context", "convert", "convertColorSpace", "convertToTexture", "countLeadingZeros", "countOneBits", "countTrailingZeros", "cos", "cross", "cubeTexture", "cubeTextureBase", "dFdx", "dFdy", "dashSize", "debug", "decrement", "decrementBefore", "defaultBuildStages", "defaultShaderStages", "defined", "degrees", "deltaTime", "densityFog", "densityFogFactor", "depth", "depthPass", "determinant", "difference", "diffuseColor", "directPointLight", "directionToColor", "directionToFaceDirection", "dispersion", "distance", "div", "dodge", "dot", "drawIndex", "dynamicBufferAttribute", "element", "emissive", "equal", "equals", "equirectUV", "exp", "exp2", "expression", "faceDirection", "faceForward", "faceforward", "float", "floatBitsToInt", "floatBitsToUint", "floor", "fog", "fract", "frameGroup", "frameId", "frontFacing", "fwidth", "gain", "gapSize", "getConstNodeType", "getCurrentStack", "getDirection", "getDistanceAttenuation", "getGeometryRoughness", "getNormalFromDepth", "interleavedGradientNoise", "vogelDiskSample", "getParallaxCorrectNormal", "getRoughness", "getScreenPosition", "getShIrradianceAt", "getShadowMaterial", "getShadowRenderObjectFunction", "getTextureIndex", "getViewPosition", "globalId", "glsl", "glslFn", "grayscale", "greaterThan", "greaterThanEqual", "hash", "highpModelNormalViewMatrix", "highpModelViewMatrix", "hue", "increment", "incrementBefore", "instance", "instanceIndex", "instancedArray", "instancedBufferAttribute", "instancedDynamicBufferAttribute", "instancedMesh", "int", "intBitsToFloat", "inverse", "inverseSqrt", "inversesqrt", "invocationLocalIndex", "invocationSubgroupIndex", "ior", "iridescence", "iridescenceIOR", "iridescenceThickness", "ivec2", "ivec3", "ivec4", "js", "label", "length", "lengthSq", "lessThan", "lessThanEqual", "lightPosition", "lightProjectionUV", "lightShadowMatrix", "lightTargetDirection", "lightTargetPosition", "lightViewPosition", "lightingContext", "lights", "linearDepth", "linearToneMapping", "localId", "log", "log2", "logarithmicDepthToViewZ", "luminance", "mat2", "mat3", "mat4", "matcapUV", "materialAO", "materialAlphaTest", "materialAnisotropy", "materialAnisotropyVector", "materialAttenuationColor", "materialAttenuationDistance", "materialClearcoat", "materialClearcoatNormal", "materialClearcoatRoughness", "materialColor", "materialDispersion", "materialEmissive", "materialEnvIntensity", "materialEnvRotation", "materialIOR", "materialIridescence", "materialIridescenceIOR", "materialIridescenceThickness", "materialLightMap", "materialLineDashOffset", "materialLineDashSize", "materialLineGapSize", "materialLineScale", "materialLineWidth", "materialMetalness", "materialNormal", "materialOpacity", "materialPointSize", "materialReference", "materialReflectivity", "materialRefractionRatio", "materialRotation", "materialRoughness", "materialSheen", "materialSheenRoughness", "materialShininess", "materialSpecular", "materialSpecularColor", "materialSpecularIntensity", "materialSpecularStrength", "materialThickness", "materialTransmission", "max", "maxMipLevel", "mediumpModelViewMatrix", "metalness", "min", "mix", "mixElement", "mod", "modInt", "modelDirection", "modelNormalMatrix", "modelPosition", "modelRadius", "modelScale", "modelViewMatrix", "modelViewPosition", "modelViewProjection", "modelWorldMatrix", "modelWorldMatrixInverse", "morphReference", "mrt", "mul", "mx_aastep", "mx_add", "mx_atan2", "mx_cell_noise_float", "mx_contrast", "mx_divide", "mx_fractal_noise_float", "mx_fractal_noise_vec2", "mx_fractal_noise_vec3", "mx_fractal_noise_vec4", "mx_frame", "mx_heighttonormal", "mx_hsvtorgb", "mx_ifequal", "mx_ifgreater", "mx_ifgreatereq", "mx_invert", "mx_modulo", "mx_multiply", "mx_noise_float", "mx_noise_vec3", "mx_noise_vec4", "mx_place2d", "mx_power", "mx_ramp4", "mx_ramplr", "mx_ramptb", "mx_rgbtohsv", "mx_rotate2d", "mx_rotate3d", "mx_safepower", "mx_separate", "mx_splitlr", "mx_splittb", "mx_srgb_texture_to_lin_rec709", "mx_subtract", "mx_timer", "mx_transform_uv", "mx_unifiednoise2d", "mx_unifiednoise3d", "mx_worley_noise_float", "mx_worley_noise_vec2", "mx_worley_noise_vec3", "negate", "neutralToneMapping", "nodeArray", "nodeImmutable", "nodeObject", "nodeObjectIntent", "nodeObjects", "nodeProxy", "nodeProxyIntent", "normalFlat", "normalGeometry", "normalLocal", "normalMap", "normalView", "normalViewGeometry", "normalWorld", "normalWorldGeometry", "normalize", "not", "notEqual", "numWorkgroups", "objectDirection", "objectGroup", "objectPosition", "objectRadius", "objectScale", "objectViewPosition", "objectWorldMatrix", "OnBeforeObjectUpdate", "OnBeforeMaterialUpdate", "OnObjectUpdate", "OnMaterialUpdate", "oneMinus", "or", "orthographicDepthToViewZ", "oscSawtooth", "oscSine", "oscSquare", "oscTriangle", "output", "outputStruct", "overlay", "overloadingFn", "packHalf2x16", "packSnorm2x16", "packUnorm2x16", "parabola", "parallaxDirection", "parallaxUV", "parameter", "pass", "passTexture", "pcurve", "perspectiveDepthToViewZ", "pmremTexture", "pointShadow", "pointUV", "pointWidth", "positionGeometry", "positionLocal", "positionPrevious", "positionView", "positionViewDirection", "positionWorld", "positionWorldDirection", "posterize", "pow", "pow2", "pow3", "pow4", "premultiplyAlpha", "property", "radians", "rand", "range", "rangeFog", "rangeFogFactor", "reciprocal", "reference", "referenceBuffer", "reflect", "reflectVector", "reflectView", "reflector", "refract", "refractVector", "refractView", "reinhardToneMapping", "remap", "remapClamp", "renderGroup", "renderOutput", "rendererReference", "replaceDefaultUV", "rotate", "rotateUV", "roughness", "round", "rtt", "sRGBTransferEOTF", "sRGBTransferOETF", "sample", "sampler", "samplerComparison", "saturate", "saturation", "screen", "screenCoordinate", "screenDPR", "screenSize", "screenUV", "scriptable", "scriptableValue", "select", "setCurrentStack", "setName", "shaderStages", "shadow", "shadowPositionWorld", "shapeCircle", "sharedUniformGroup", "sheen", "sheenRoughness", "shiftLeft", "shiftRight", "shininess", "sign", "sin", "sinc", "skinning", "smoothstep", "smoothstepElement", "specularColor", "specularF90", "spherizeUV", "split", "spritesheetUV", "sqrt", "stack", "step", "stepElement", "storage", "storageBarrier", "storageObject", "storageTexture", "string", "struct", "sub", "subgroupAdd", "subgroupAll", "subgroupAnd", "subgroupAny", "subgroupBallot", "subgroupBroadcast", "subgroupBroadcastFirst", "subBuild", "subgroupElect", "subgroupExclusiveAdd", "subgroupExclusiveMul", "subgroupInclusiveAdd", "subgroupInclusiveMul", "subgroupIndex", "subgroupMax", "subgroupMin", "subgroupMul", "subgroupOr", "subgroupShuffle", "subgroupShuffleDown", "subgroupShuffleUp", "subgroupShuffleXor", "subgroupSize", "subgroupXor", "tan", "tangentGeometry", "tangentLocal", "tangentView", "tangentWorld", "texture", "texture3D", "textureBarrier", "textureBicubic", "textureBicubicLevel", "textureCubeUV", "textureLoad", "textureSize", "textureLevel", "textureStore", "thickness", "time", "toneMapping", "toneMappingExposure", "toonOutlinePass", "transformDirection", "transformNormal", "transformNormalToView", "transformedClearcoatNormalView", "transformedNormalView", "transformedNormalWorld", "transmission", "transpose", "triNoise3D", "triplanarTexture", "triplanarTextures", "trunc", "uint", "uintBitsToFloat", "uniform", "uniformArray", "uniformCubeTexture", "uniformGroup", "uniformFlow", "uniformTexture", "unpackHalf2x16", "unpackSnorm2x16", "unpackUnorm2x16", "unpremultiplyAlpha", "userData", "uv", "uvec2", "uvec3", "uvec4", "varying", "varyingProperty", "vec2", "vec3", "vec4", "vectorComponents", "velocity", "vertexColor", "vertexIndex", "vertexStage", "vibrance", "viewZToLogarithmicDepth", "viewZToOrthographicDepth", "viewZToPerspectiveDepth", "viewport", "viewportCoordinate", "viewportDepthTexture", "viewportLinearDepth", "viewportMipTexture", "viewportResolution", "viewportSafeUV", "viewportSharedTexture", "viewportSize", "viewportTexture", "viewportUV", "wgsl", "wgslFn", "workgroupArray", "workgroupBarrier", "workgroupId", "workingToColorSpace", "xor", "init_three_tsl", "__esmMin", "init_three_webgpu", "TSL", "TextureShaderNodeMaterial", "init_TextureShaderNodeMaterial", "__esmMin", "init_three_module", "init_three_tsl", "init_three_webgpu", "_TextureShaderNodeMaterial", "NodeMaterial", "options", "Color", "uniform", "materialReference", "Fn", "args", "diffuse", "colorG", "colorB", "opacity", "modulateMode", "texel", "diffuseColor", "vec4", "baseResult", "rgbLayered", "alpha", "luminanceAlpha", "alphaOpa", "eq2", "float", "int", "eq3", "eq4", "eq5", "eq0", "value", "_FFLShader_vert", "_FFLShader_frag", "FFLShaderMaterial", "FFLShaderMaterial_default", "init_FFLShaderMaterial", "__esmMin", "init_three_module", "_FFLShaderMaterial", "ShaderMaterial", "Color", "Vector3", "options", "uniforms", "value", "ret", "matParam", "rimColor", "ParamColorNode", "FFLShaderNodeMaterial", "init_FFLShaderNodeMaterial", "__esmMin", "init_three_module", "init_three_webgpu", "init_three_tsl", "init_TextureShaderNodeMaterial", "init_FFLShaderMaterial", "AttributeNode", "builder", "Vector4", "NodeMaterial", "options", "Color", "uniform", "FFLShaderMaterial_default", "Fn", "color", "TextureShaderNodeMaterial", "materialReference", "norm", "normalView", "eye", "positionViewDirection", "lightDir", "vec3", "fDot", "max", "dot", "float", "ambient", "diffuse", "specularBlinn", "pow", "reflect", "negate", "tangent", "tangentView", "dotLT", "dotVT", "dotVR", "sqrt", "oneMinus", "specularAniso", "useAniso", "param", "nodeObject", "anisoReflection", "mix", "reflection", "select", "strength", "specular", "rimColor", "abs", "vec4", "value", "matParam", "require_ffl_emscripten_single_file", "__commonJSMin", "exports", "module", "ModuleFFL", "_scriptName", "moduleArg", "moduleRtn", "Module", "readyPromiseResolve", "readyPromiseReject", "readyPromise", "resolve", "reject", "ENVIRONMENT_IS_WEB", "ENVIRONMENT_IS_WORKER", "moduleOverrides", "scriptDirectory", "readAsync", "readBinary", "url", "response", "out", "err", "wasmBinary", "wasmMemory", "ABORT", "HEAP8", "HEAPU8", "HEAP16", "HEAPU16", "HEAP32", "HEAPU32", "HEAPF32", "HEAP64", "HEAPU64", "HEAPF64", "runtimeInitialized", "updateMemoryViews", "b", "preRun", "initRuntime", "wasmExports", "postRun", "runDependencies", "dependenciesFulfilled", "addRunDependency", "id", "removeRunDependency", "callback", "abort", "what", "e", "wasmBinaryFile", "getBinarySync", "file", "binary", "tryParseAsDataURI", "getWasmBinary", "binaryFile", "instantiateArrayBuffer", "imports", "instance", "reason", "instantiateAsync", "getWasmImports", "wasmImports", "createWasm", "receiveInstance", "wasmTable", "receiveInstantiationResult", "result", "info", "ExitStatus", "status", "stackTrace", "base64Decode", "b64", "b1", "b2", "i", "j", "bLength", "output", "base64ReverseLookup", "isDataURI", "filename", "dataURIPrefix", "__abort_js", "_emscripten_random", "getHeapMax", "alignMemory", "size", "alignment", "growMemory", "pages", "_emscripten_resize_heap", "requestedSize", "oldSize", "maxHeapSize", "cutDown", "overGrownHeapSize", "newSize", "replacement", "uleb128Encode", "n", "target", "sigToWasmTypes", "sig", "typeNames", "type", "generateFuncType", "sigRet", "sigParam", "typeCodes", "convertJsFunctionToWasm", "func", "typeSectionBody", "bytes", "wrappedFunc", "wasmTableMirror", "getWasmTableEntry", "funcPtr", "updateTableMap", "offset", "count", "functionsInTableMap", "item", "getFunctionAddress", "freeTableIndexes", "getEmptyTableSlot", "setWasmTableEntry", "idx", "addFunction", "rtn", "ret", "wrapped", "removeFunction", "index", "___wasm_call_ctors", "_FFLInitCharModelCPUStepWithCallback", "_FFLInitCharModelCPUStep", "_FFLDeleteCharModel", "_FFLGetDrawParamOpaFaceline", "_FFLGetDrawParamOpaBeard", "_FFLGetDrawParamOpaNose", "_FFLGetDrawParamOpaForehead", "_FFLGetDrawParamOpaHair", "_FFLGetDrawParamOpaCap", "_FFLGetDrawParamXluMask", "_FFLGetDrawParamXluNoseLine", "_FFLGetDrawParamXluGlass", "_FFLSetExpression", "_FFLGetExpression", "_FFLSetViewModelType", "_FFLGetBoundingBox", "_FFLIsAvailableExpression", "_FFLSetCoordinate", "_FFLSetScale", "_FFLiGetRandomCharInfo", "_FFLpGetStoreDataFromCharInfo", "_FFLpGetCharInfoFromStoreData", "_FFLpGetCharInfoFromMiiDataOfficialRFL", "_FFLGetAdditionalInfo", "_FFLInitRes", "_FFLInitResGPUStep", "_FFLExit", "_FFLIsAvailable", "_FFLGetFavoriteColor", "_FFLSetLinearGammaMode", "_FFLGetFacelineColor", "_FFLSetTextureFlipY", "_FFLSetNormalIsSnorm8_8_8_8", "_FFLSetFrontCullForFlipX", "_FFLSetTextureCallback", "_FFLiDeleteTempObjectMaskTextures", "_FFLiDeleteTempObjectFacelineTexture", "_FFLiDeleteTextureTempObject", "_FFLiiGetEyeRotateOffset", "_FFLiiGetEyebrowRotateOffset", "_FFLiInvalidateTempObjectFacelineTexture", "_FFLiInvalidatePartsTextures", "_FFLiInvalidateRawMask", "_FFLiVerifyCharInfoWithReason", "_free", "_malloc", "run", "doRun", "require_chunkstream", "__commonJSMin", "exports", "module", "util", "Stream", "ChunkStream", "length", "callback", "data", "encoding", "dataBuffer", "read", "smallerBuf", "pos", "count", "buf", "len", "ex", "require_interlace", "__commonJSMin", "exports", "imagePasses", "width", "height", "images", "xLeftOver", "yLeftOver", "xRepeats", "yRepeats", "i", "pass", "passWidth", "passHeight", "j", "x", "y", "outerXLeftOver", "outerX", "outerYLeftOver", "outerY", "require_paeth_predictor", "__commonJSMin", "exports", "module", "left", "above", "upLeft", "paeth", "pLeft", "pAbove", "pUpLeft", "require_filter_parse", "__commonJSMin", "exports", "module", "interlaceUtils", "paethPredictor", "getByteWidth", "width", "bpp", "depth", "byteWidth", "Filter", "bitmapInfo", "dependencies", "height", "interlace", "passes", "i", "rawData", "unfilteredLine", "xComparison", "xBiggerThan", "x", "rawByte", "f1Left", "lastLine", "f2Up", "f3Up", "f3Left", "f3Add", "f4Up", "f4Left", "f4UpLeft", "f4Add", "filter", "currentImage", "require_filter_parse_async", "__commonJSMin", "exports", "module", "util", "ChunkStream", "Filter", "FilterAsync", "bitmapInfo", "buffers", "that", "buffer", "require_constants", "__commonJSMin", "exports", "module", "require_crc", "__commonJSMin", "exports", "module", "crcTable", "currentCrc", "j", "CrcCalculator", "data", "i", "buf", "crc", "require_parser", "__commonJSMin", "exports", "module", "constants", "CrcCalculator", "Parser", "options", "dependencies", "data", "signature", "i", "length", "type", "name", "ancillary", "fileCrc", "calcCrc", "width", "height", "depth", "colorType", "compr", "filter", "interlace", "bpp", "entries", "leftOverLength", "require_bitmapper", "__commonJSMin", "exports", "interlaceUtils", "pixelBppMapper", "pxData", "data", "pxPos", "rawPos", "pixel", "pixelBppCustomMapper", "pixelData", "maxBit", "bitRetriever", "depth", "leftOver", "i", "split", "byte", "byte8", "byte7", "byte6", "byte5", "byte4", "byte3", "byte2", "byte1", "count", "returner", "mapImage8Bit", "image", "getPxPos", "bpp", "imageWidth", "imageHeight", "imagePass", "y", "x", "mapImageCustomBit", "bits", "bitmapInfo", "width", "height", "interlace", "images", "nonInterlacedPxPos", "imageIndex", "require_format_normaliser", "__commonJSMin", "exports", "module", "dePalette", "indata", "outdata", "width", "height", "palette", "pxPos", "y", "x", "color", "i", "replaceTransparentColor", "transColor", "makeTrans", "scaleDepth", "depth", "maxOutSample", "maxInSample", "imageData", "skipRescale", "colorType", "require_parser_async", "__commonJSMin", "exports", "module", "util", "zlib", "ChunkStream", "FilterAsync", "Parser", "bitmapper", "formatNormaliser", "ParserAsync", "options", "err", "data", "imageSize", "chunkSize", "leftToInflate", "emitError", "filterWrite", "chunk", "metaData", "transColor", "palette", "filteredData", "normalisedBitmapData", "bitmapData", "ex", "require_bitpacker", "__commonJSMin", "exports", "module", "constants", "dataIn", "width", "height", "options", "outHasAlpha", "bigEndian", "buffer", "data", "maxValue", "inBpp", "outBpp", "outData", "inIndex", "outIndex", "bgColor", "getRGBA", "red", "green", "blue", "alpha", "y", "x", "rgba", "grayscale", "require_filter_pack", "__commonJSMin", "exports", "module", "paethPredictor", "filterNone", "pxData", "pxPos", "byteWidth", "rawData", "rawPos", "x", "filterSumNone", "sum", "length", "i", "filterSub", "bpp", "left", "val", "filterSumSub", "filterUp", "up", "filterSumUp", "filterAvg", "filterSumAvg", "filterPaeth", "upleft", "filterSumPaeth", "filters", "filterSums", "width", "height", "options", "filterTypes", "sel", "y", "min", "require_packer", "__commonJSMin", "exports", "module", "constants", "CrcStream", "bitPacker", "filter", "zlib", "Packer", "options", "data", "width", "height", "packedData", "bpp", "type", "len", "buf", "gamma", "require_packer_async", "__commonJSMin", "exports", "module", "util", "Stream", "constants", "Packer", "PackerAsync", "opt", "options", "data", "width", "height", "gamma", "filteredData", "compressedData", "require_sync_inflate", "__commonJSMin", "exports", "module", "assert", "zlib", "util", "kMaxLength", "Inflate", "opts", "createInflate", "_close", "engine", "callback", "chunk", "flushFlag", "asyncCb", "self", "availInBefore", "availOutBefore", "leftToInflate", "inOff", "buffers", "nread", "error", "err", "handleChunk", "availInAfter", "availOutAfter", "have", "out", "res", "buf", "zlibBufferSync", "buffer", "inflateSync", "require_sync_reader", "__commonJSMin", "exports", "module", "SyncReader", "buffer", "length", "callback", "read", "buf", "require_filter_parse_sync", "__commonJSMin", "exports", "SyncReader", "Filter", "inBuffer", "bitmapInfo", "outBuffers", "reader", "bufferPart", "require_parser_sync", "__commonJSMin", "exports", "module", "hasSyncZlib", "zlib", "inflateSync", "SyncReader", "FilterSync", "Parser", "bitmapper", "formatNormaliser", "buffer", "options", "err", "handleError", "_err_", "metaData", "handleMetaData", "_metaData_", "handleTransColor", "transColor", "handlePalette", "palette", "handleSimpleTransparency", "gamma", "handleGamma", "_gamma_", "inflateDataList", "handleInflateData", "inflatedData", "reader", "inflateData", "imageSize", "unfilteredData", "bitmapData", "normalisedBitmapData", "require_packer_sync", "__commonJSMin", "exports", "module", "hasSyncZlib", "zlib", "constants", "Packer", "metaData", "opt", "options", "packer", "chunks", "filteredData", "compressedData", "require_png_sync", "__commonJSMin", "exports", "parse", "pack", "buffer", "options", "png", "require_png", "__commonJSMin", "exports", "util", "Stream", "Parser", "Packer", "PNGSync", "PNG", "options", "data", "callback", "onParsed", "onError", "parsedData", "err", "metadata", "gamma", "src", "dst", "srcX", "srcY", "width", "height", "deltaX", "deltaY", "y", "x", "idx", "i", "sample", "require_cookiejar", "__commonJSMin", "exports", "module", "urllib", "CookieJar", "options", "cookie", "lcookie", "i", "len", "url", "keys", "cookies", "j", "lenj", "urlparts", "path", "cookie_str", "parts", "part", "key", "val", "require_safer", "__commonJSMin", "exports", "module", "buffer", "Buffer", "safer", "key", "Safer", "value", "encodingOrOffset", "length", "size", "fill", "encoding", "buf", "require_bom_handling", "__commonJSMin", "exports", "BOMChar", "PrependBOMWrapper", "encoder", "options", "str", "StripBOMWrapper", "decoder", "buf", "res", "require_internal", "__commonJSMin", "exports", "module", "Buffer", "InternalCodec", "codecOptions", "iconv", "InternalEncoderBase64", "InternalEncoderCesu8", "InternalDecoderCesu8", "InternalEncoder", "InternalDecoder", "StringDecoder", "options", "codec", "str", "completeQuads", "buf", "bufIdx", "i", "charCode", "acc", "contBytes", "accBytes", "res", "curByte", "require_utf16", "__commonJSMin", "exports", "Buffer", "Utf16BECodec", "Utf16BEEncoder", "Utf16BEDecoder", "str", "buf", "i", "tmp", "buf2", "j", "Utf16Codec", "codecOptions", "iconv", "Utf16Encoder", "Utf16Decoder", "options", "codec", "encoding", "detectEncoding", "res", "trail", "defaultEncoding", "enc", "asciiCharsLE", "asciiCharsBE", "_len", "require_utf7", "__commonJSMin", "exports", "Buffer", "Utf7Codec", "codecOptions", "iconv", "Utf7Encoder", "Utf7Decoder", "nonDirectChars", "options", "codec", "str", "chunk", "base64Regex", "base64Chars", "i", "plusChar", "minusChar", "andChar", "buf", "res", "lastI", "inBase64", "base64Accum", "b64str", "canBeDecoded", "Utf7IMAPCodec", "Utf7IMAPEncoder", "Utf7IMAPDecoder", "base64AccumIdx", "bufIdx", "uChar", "base64IMAPChars", "require_sbcs_codec", "__commonJSMin", "exports", "Buffer", "SBCSCodec", "codecOptions", "iconv", "asciiString", "i", "encodeBuf", "SBCSEncoder", "SBCSDecoder", "options", "codec", "str", "buf", "decodeBuf", "newBuf", "idx1", "idx2", "require_sbcs_data", "__commonJSMin", "exports", "module", "require_sbcs_data_generated", "__commonJSMin", "exports", "module", "require_dbcs_codec", "__commonJSMin", "exports", "Buffer", "DBCSCodec", "UNASSIGNED", "GB18030_CODE", "SEQ_START", "NODE_START", "UNASSIGNED_NODE", "DEF_CHAR", "i", "codecOptions", "iconv", "mappingTable", "skipEncodeChars", "val", "j", "uChar", "thirdByteNodeIdx", "thirdByteNode", "fourthByteNodeIdx", "fourthByteNode", "secondByteNodeIdx", "secondByteNode", "DBCSEncoder", "DBCSDecoder", "addr", "bytes", "node", "chunk", "curAddr", "writeTable", "k", "part", "l", "code", "codeTrail", "len", "seq", "m", "charCode", "uCode", "high", "dbcsCode", "bucket", "low", "oldVal", "nodeIdx", "prefix", "mbCode", "options", "codec", "str", "newBuf", "leadSurrogate", "seqObj", "nextChar", "resCode", "subtable", "idx", "findIdx", "buf", "prevBuf", "prevBufOffset", "seqStart", "curByte", "curSeq", "ptr", "uCodeLead", "ret", "table", "r", "mid", "require_shiftjis", "__commonJSMin", "exports", "module", "require_eucjp", "__commonJSMin", "exports", "module", "require_cp936", "__commonJSMin", "exports", "module", "require_gbk_added", "__commonJSMin", "exports", "module", "require_gb18030_ranges", "__commonJSMin", "exports", "module", "require_cp949", "__commonJSMin", "exports", "module", "require_cp950", "__commonJSMin", "exports", "module", "require_big5_added", "__commonJSMin", "exports", "module", "require_dbcs_data", "__commonJSMin", "exports", "module", "require_encodings", "__commonJSMin", "exports", "module", "modules", "i", "enc", "require_streams", "__commonJSMin", "exports", "module", "Buffer", "Transform", "iconv", "encoding", "options", "IconvLiteEncoderStream", "IconvLiteDecoderStream", "conv", "chunk", "done", "res", "e", "cb", "chunks", "require_extend_node", "__commonJSMin", "exports", "module", "Buffer", "iconv", "original", "nodeNativeEncodings", "enc", "SlowBuffer", "encoding", "start", "end", "string", "offset", "length", "swap", "remaining", "buf", "str", "_offset", "_length", "_encoding", "Readable", "options", "require_lib", "__commonJSMin", "exports", "module", "Buffer", "bomHandling", "iconv", "str", "encoding", "options", "encoder", "res", "trail", "buf", "decoder", "enc", "codecOptions", "codec", "codecDef", "key", "nodeVer", "nodeVerArr", "require_iconv_loader", "__commonJSMin", "exports", "module", "iconv_package", "Iconv", "require_encoding", "__commonJSMin", "exports", "module", "iconvLite", "Iconv", "convert", "str", "to", "from", "useLite", "checkEncoding", "result", "convertIconv", "E", "convertIconvLite", "response", "iconv", "name", "require_fetch", "__commonJSMin", "exports", "http", "https", "urllib", "utillib", "zlib", "dns", "Stream", "CookieJar", "encodinglib", "net", "USE_ALLOC", "FetchStream", "fetchUrl", "url", "options", "size", "push", "rest", "restSize", "ex", "keys", "newheaders", "i", "urlparts", "transport", "urloptions", "buf", "encoding", "url_data", "cookies", "dnsCallback", "err", "addresses", "req", "res", "curlen", "maxlen", "receive", "chunk", "error", "e", "end", "unpack", "type", "z", "callback", "fetchstream", "response_data", "chunks", "length", "curpos", "buffer", "content_type", "callbackFired", "meta", "_parseContentType", "len", "_findHTMLCharset", "str", "parts", "mimeType", "charset", "chparts", "htmlbuffer", "body", "input", "miiRendering_exports", "__export", "FFLExpression", "renderMii", "encodePngImage", "width", "height", "bgraPixels", "pngWriterPromise", "pngjs", "PNG", "rgba", "i", "png", "normalizeDecodedMiiForRender", "data", "normalized", "decodeMii", "renderType", "backTables", "getWebGPU", "webgpuPromise", "addWebGPUExtensions", "obj", "selfValue", "syncSelfWebGPUGlobals", "globals", "key", "create", "navigatorValue", "createThreeRenderer", "gpuCanvasContext", "canvas", "getCanvas", "type", "renderer", "THREE", "encodeBmpImage", "fileSize", "bytes", "view", "loadGLTFFromFS", "path", "content", "ab", "resolve", "reject", "GLTFLoader", "loadFirstGLTFFromFS", "paths", "gltf", "loadGLTFFromURL", "url", "res", "loadBodyModel", "gender", "bodyTemplates", "model", "SkeletonUtils_exports", "animations", "mixer", "clip", "a", "detectModelDesc", "levelFaceCameraToObject", "camera", "object3D", "distMultiplier", "box", "center", "size", "maxDim", "dist", "fov", "dir", "renderRequestToImage", "ffl", "request", "opts", "scene", "charModel", "body", "SIZE", "CharModel", "FFLShaderNodeMaterial", "m", "prepareBodyForCharModel", "pantsColors", "attachHeadToBody", "getWholeBodyCamera", "getFaceCamera", "adjustCameraForBodyHead", "rt", "BGRA8Unorm", "pixels", "disposeModel", "bytesToHex", "hex", "byte", "imageResponseToBytes", "arrayBuffer", "renderWithStudio", "fullBody", "encodeMii", "MiiFormats", "renderForNode", "isInitialised", "pantsColor", "resourceFile", "_fflRes", "addSkeletonScalingExtensions", "imageData", "FFL", "ModuleFFL", "device", "renderForBrowser", "currentCharModel", "FFLShaderMaterial_default", "fs", "import_ffl_emscripten_single_file", "init_miiRendering", "__esmMin", "init_Addons", "init_miiProcess", "init_formats", "init_data", "init_platform", "init_SkeletonScalingExtensions", "init_ModelScaleDesc", "init_BodyUtilities", "init_ffl", "init_FFLShaderNodeMaterial", "init_FFLShaderMaterial", "getContext", "isNode", "imported", "fetchMod", "threeBase", "threeWebGPU", "searchFolders", "searchNames", "searchSuffixes", "breakNow", "folder", "name", "suffix", "qrTools_exports", "__export", "makeQR", "scanQR", "renderMii", "data", "opts", "miiRenderingPromise", "loadNodeOnlyModule", "specifier", "importNodeOnlyModule", "isWebp", "buf", "clampByte", "n", "toGrayscaleContrast", "rgba", "contrast", "out", "i", "lum", "adjusted", "toBinaryThreshold", "threshold", "value", "resizeNearest", "width", "height", "scale", "outWidth", "outHeight", "y", "srcY", "x", "srcX", "srcI", "outI", "decodeWithJsQrVariants", "variants", "upscaled", "decodeOptions", "variant", "decoded", "jsQR", "bytesToLatin1String", "bytes", "u8", "s", "toUint8", "input", "isBrowser", "decodeImageToRGBA_Browser", "bytesOrBlob", "blob", "bmp", "canvas", "ctx", "imgData", "decodeImageToRGBA_Node", "PNG", "jpeg", "isPng", "isJpg", "png", "jpg", "createCanvas", "loadImage", "img", "sharp", "raw", "size", "margin", "prefix", "encoding", "overlayFrac", "qrOptions", "dotsOptions", "cornersSquareOptions", "cornersDotOptions", "backgroundOptions", "image", "noRenderMii", "label", "isSpecial", "dataStr", "overlayPng", "encoded", "encodeMii", "MiiFormats", "detectMiiFormat", "temp", "decodeMii", "e", "hasOverlay", "baseConfig", "ONE_BY_ONE_GIF", "JSDOM", "nodeCanvas", "qr", "QRCodeStyling", "qrBytes", "qrBmp", "overlayBlob", "overlayBmp", "box", "w", "h", "ox", "oy", "fontSize", "textX", "textY", "outBlob", "res", "qrImg", "overlayImg", "import_jsqr", "import_qr_code_styling", "init_qrTools", "__esmMin", "init_platform", "init_miiProcess", "init_formats", "miiProcess_exports", "__export", "decodeMii", "detectMiiFormat", "encodeMii", "isMiiInFormat", "isWebp", "buf", "isPng", "isJpg", "isBuffer", "inp", "ensureBuffer", "debug", "out", "s", "comma", "meta", "data", "isB64", "pad", "bytesFromBase64", "decoded", "bytesFromText", "compact", "bytesFromHex", "b64", "isPromiseLike", "value", "hex", "i", "j", "bin", "str", "bufferToBitString", "setNestedValue", "obj", "key", "keys", "lastKey", "target", "current", "getNestedValue", "path", "parts", "part", "binaryToText", "binaryString", "chars", "chunk", "highByte", "lowByte", "charCode", "textToBinaryBE", "text", "bitLength", "numChars", "binary", "textToBinaryLE", "binaryToTextLE", "requireFormat", "formats", "bits", "offset", "wordBits", "wordPos", "wordEnd", "wordStartOffset", "field", "b", "inWord", "slice", "numBits", "subset", "min", "max", "matches", "form", "toDecode", "miiType", "scanQR", "scanned", "a", "workableFormats", "val", "wasInWord", "mappings", "forwardPort", "miiObject", "targetFormat", "encoded", "backPort", "wordLen", "skipBits", "byteReversed", "defaultMappings", "f", "v", "fieldBits", "bytes", "hexStr", "totalBits", "totalBytes", "fixed", "numVal", "byte", "buffer", "canonical3DSGlassesTypes", "init_miiProcess", "__esmMin", "init_formats", "init_data", "init_platform", "init_qrTools", "lookupTables", "amiiboHandler_exports", "__export", "extractMiiFromAmiibo", "insertMiiIntoAmiibo", "isBuffer", "inp", "calcSeed", "dump", "seed", "prepareSeed", "typeString", "magicBytes", "magicBytesSize", "xorPad", "baseSeed", "output", "offset", "typeStringEnd", "typeLen", "leadingSeedBytes", "i", "drbgGenerateBytes", "hmacKey", "outputSize", "result", "iteration", "iterBuffer", "hmac", "createHmac", "toCopy", "deriveKeys", "preparedSeed", "derived", "decryptAmiibo", "tag", "internal", "NFC3D_AMIIBO_SIZE", "dataKeys", "tagKeys", "plain", "cipher", "createDecipheriv", "tagHmac", "dataHmac", "encryptAmiibo", "cipher_internal", "aesCipher", "createCipheriv", "miiData", "mii", "decodeMii", "miiWithChecksum", "encodeMii", "MiiFormats", "decrypted", "encrypted", "init_amiiboHandler", "__esmMin", "init_platform", "init_miiProcess", "init_formats", "formats_exports", "__export", "ConsoleFormats", "MiiFormats", "backPort", "defaultMappings", "formats", "forwardPort", "mappings", "loadAmiiboHandler", "amiiboHandlerPromise", "extractMiiFromAmiibo", "data", "encodeMiitomoMii", "encoders", "encodeMiitopiaMii", "binaryToHex", "binaryString", "getMiiIDTimestamp", "id", "epoch", "intervals", "bits", "idBigInt", "mask", "seconds", "getIDFromTimestamp", "timestamp", "epochMs", "intervalSeconds", "t", "timestampMs", "intervalMs", "ticks", "getKeyByValue", "object", "value", "key", "crc16", "current", "crc", "i", "byte", "bit", "generateCrc32Table", "table", "poly", "j", "crc32", "input", "crc32CksumTable", "miiCrcCalc", "dat", "mode", "from", "to", "modernFeatureOrMakeup", "lookupTables", "backTables", "legacyFeature", "legacyMakeup", "numericLegacyFeature", "numericLegacyMakeup", "import_lodash", "decoders", "processors", "commonStructs", "init_formats", "__esmMin", "init_data", "init_miiCrypto", "y", "buf", "crcBytes", "obj", "ogDevice", "ogD", "mingle", "sharing", "decryptMii", "encryptMii", "bool", "text", "lodash", "val", "hex", "d", "mii", "digest", "h", "wordCount", "islandAddresses", "ocean", "isles", "num1", "num2", "deviceCrcBytes", "plainCrcBytes", "decryptStudio2", "encryptStudio2", "require_is_extglob", "__commonJSMin", "exports", "module", "str", "require_is_glob", "__commonJSMin", "exports", "module", "isExtglob", "str", "require_is_invalid_path", "__commonJSMin", "exports", "module", "isGlob", "re", "str", "require_is_valid_path", "__commonJSMin", "exports", "module", "isInvalidPath", "str", "miiMeasureConversion_exports", "__export", "centimetersToMiiHeight", "imperialHeightWeightToMiiWeight", "inchesToMiiHeight", "metricHeightWeightToMiiWeight", "miiHeightToMeasurements", "miiWeightToMeasurements", "value", "totalInches", "totalCentimeters", "bmiFromWeightSlider", "w", "BMI_MID", "BMI_MIN", "BMI_MAX", "heightInches", "miiWeight", "H", "BMI", "weightLbs", "heightCentimeters", "weightKilograms", "init_miiMeasureConversion", "__esmMin", "miiInstructions_exports", "__export", "getAs", "makeInstructions", "setAs", "getLoc", "table", "val", "y", "x", "getFlatGridLoc", "grid", "lookupTables", "index", "getNestedValue", "obj", "path", "parts", "current", "part", "setNestedValue", "key", "value", "keys", "lastKey", "target", "deleteNestedValue", "i", "defaultsEqual", "a", "b", "getDefaultFor", "currentVal", "defaultMappings", "reverseGetLoc", "loc", "reverseGridLookup", "colGrid", "rowGrid", "row", "mii", "type", "field", "mappings", "ConsoleFormats", "fc", "gridColumn", "gridRow", "page", "gridLoc", "gridIndex", "buildInstructions", "formatRowPos", "faceColorRowNames", "formatGridPos", "formatColorPos", "decodeMii", "decoded", "backPort", "def", "instrs", "ignoredInstructionDefaults", "defaultRowNames", "init_miiInstructions", "__esmMin", "init_miiProcess", "init_formats", "init_data", "arr", "hasExpanded", "base", "rowNames", "rowName", "miiBabies_exports", "__export", "kidomatic", "makeMiiChild", "getParentPermission", "parent", "permission", "mii", "hairGroupIndex", "decodeMii", "eyeBase", "browBase", "mouthBase", "eyeYDelta", "browYDelta", "mouthYDelta", "iStage", "foundAgeGroup", "foundHairIndexes", "foundAgeGroups", "foundHair", "iAgeGroup", "iHairGroup", "childGenTables", "rand", "ageGroup", "iHairStage", "subgroup", "hairType", "parentA", "parentB", "options", "parent0", "parent1", "tempHolder", "randomBools", "i", "mainParent", "child", "birthday", "gender", "matchingParent", "parent0SkinCol", "backTables", "parent1SkinCol", "validValues", "v", "heightParent", "height", "weightParent", "weight", "iAdj", "init_miiBabies", "__esmMin", "init_data", "init_miiProcess", "index_exports", "__export", "ConsoleFormats", "FFLExpression", "FavoriteColors", "Mii", "MiiFormats", "backPort", "centimetersToMiiHeight", "decodeMii", "decryptMii", "index_default", "defaultMappings", "deleteNestedValue", "detectMiiFormat", "encodeMii", "encryptMii", "extractMiiFromAmiibo", "formats", "forwardPort", "getAs", "getKeyByValue", "getNestedValue", "imperialHeightWeightToMiiWeight", "inchesToMiiHeight", "insertMiiIntoAmiibo", "isMiiInFormat", "kidomatic", "makeInstructions", "makeMiiChild", "makeQR", "mappings", "metricHeightWeightToMiiWeight", "miiCrcCalc", "miiHeightToMeasurements", "miiWeightToMeasurements", "renderMii", "scanQR", "setAs", "setNestedValue", "__toCommonJS", "init_formats", "init_miiProcess", "init_qrTools", "init_data", "import_util", "import_is_valid_path", "init_platform", "miiProcess_exports", "formats_exports", "qrTools_exports", "optionalModulePromises", "loadOptionalModule", "name", "importer", "loadAmiiboHandler", "loadMeasureConversion", "loadRendering", "loadCrypto", "loadInstructions", "loadBabies", "callOptionalModule", "loader", "exportName", "args", "isPromiseLike", "value", "isSupportedBuffer", "input", "obj", "path", "parts", "current", "i", "part", "object", "key", "keys", "lastKey", "target", "isValidURL", "url", "_Mii", "decodedMii", "decoded", "debug", "isValidPath", "fs", "scanned", "mii", "hint", "util", "format", "studioMii", "objOrPath", "device", "options", "fullBody", "amiiboDump", "lookupTables", "index_default", "Mii", "miiProcess_exports", "formats_exports", "qrTools_exports", "insertMiiIntoAmiibo", "extractMiiFromAmiibo", "miiHeightToMeasurements", "inchesToMiiHeight", "centimetersToMiiHeight", "miiWeightToMeasurements", "imperialHeightWeightToMiiWeight", "metricHeightWeightToMiiWeight", "renderMii", "FFLExpression", "decryptMii", "encryptMii", "miiCrcCalc", "makeInstructions", "getAs", "setAs", "kidomatic", "makeMiiChild", "FavoriteColors", "getNestedValue", "setNestedValue", "deleteNestedValue", "getKeyByValue"]
}
